fldigi-3.21.80/0000775000175000017500000000000012313333725010130 500000000000000fldigi-3.21.80/Makefile.am0000664000175000017500000000066012313064025012100 00000000000000ACLOCAL_AMFLAGS = -I m4 -I m4/intl # AC_CONFIG_MACRO_DIR([m4]) SUBDIRS = po doc src if HAVE_FLUID flgen: @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) endif if DARWIN appbundle: @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) endif if HAVE_NSIS nsisinst: @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) endif if WANT_FLDIGI if ENABLE_HAMLIB hamlib-static: @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) endif endif EXTRA_DIST = build-aux/config.rpath fldigi-3.21.80/NEWS0000664000175000017500000001020112313064025010533 00000000000000= Fldigi 3.21 release notes = == Modems == * Weather Fax receive and transmit * RSID can be configured to open the decoder squelch * Added several new RSID modem codes * Video ID improvements * Added browser support for the PSK63F and PSK-nnn-R types * Improved CW prosign handling * Improved signal detection in PSK multiple decoder * The MT-63 modem can now receive and transmit on any frequency * Added support for multiple RTTY decoders == Macros == * Added REPEAT macro * Added LNW macro * Added CLEARLOG macro * Added QSY macro * Added RIGMOD and FILWID macros == User interface == * Added Italian and Spanish translations * Translations now also work on win32 * Added second (optional) macro bar * Improved PSK/RTTY browser widget == Other changes == * RigCAT can use RTS and DTR PTT simultaneously * Added interface to Logbook server * Added support for ADIF 2.2.3 QSO_DATE_OFF field * Added support for CALLOOK (http://callook.info) == Bug fixes == * Yes = Fldigi 3.20 release notes = == Modems == * Added new PSK-500 mode * Added "robust PSK" modes: PSK-125R, PSK-250R, PSK-500R * Added PSK63F mode, compatible with MultiPsk PSK63FEC * Added Contestia support * Added SSB "modem" to simplify logging of SSB QSOs * Added MT63 modem preamble tones to aid signal acquisition * Added selectable filter widths for Hellschreiber modes * Added AGC and S/N detector for FM-HELL modes * Added Olivia noise estimator * Improved THOR and DominoEX squelch responsiveness * Improved Olivia squelch detection * Improved Feldhell AGC and S/N detector * Improved RTTY decoder * Removed THOR soft decoding * RSID now works at the same time as modem decoding * The HELL-80 tone spacing was changed to 300 Hz == Macros == * Added macro to enable/disable/toggle the transmit lock * Added macro to transmit tuning tone for ''nn'' seconds * Added and macros * Added macro to delay macro expansion by ''nn'' seconds * Added , , , macros to search for a signal up and down in frequency, go to the "sweet spot frequency", and set the current modem frequency to ''nnnn'' * The macro syntax is now . The older str syntax is still supported. Modem parameters may be specified when using the new syntax; currently for RTTY (shift, baud, bits), Olivia (bw, tones) and Contestia (bw, tones), e.g.: , , . == User interface == * The main window's QSO and waterfall toolbar are now much more configurable * The QSO toolbar can now be set to Contest mode, Minimal mode, Full mode, and some combinations thereof * The docked digiscope can be hidden and shown without a restart * It is now possible to select the modes for which to transmit RSID, VideoID and CWID * The Op Modes menu can now be customised * Removed the floating rig control window * Removed various Alt- shortcuts * Added a simple "wizard" for first-time users * Added a waterfall-only mode; enabled with --wfall-only * Removed option to use check buttons for AFC and SQL toggles == Other changes == * The XML-RPC server now supports HTTP/1.1 keep-alive connections * Added several new XML-RPC methods * Renamed various main.set_rig_NNN XML-RPC methods to rig.set_NNN * Removed obsolete command line switches: --twoscopes, --experimental * Improved support for PulseAudio, now also the default backend on Linux * The ^R string is no longer treated like ^r; it is now ignored unless at the end of the text to be transmitted * The Portaudio playback stream is no longer kept open in receive mode; this fixes a problem with certain rig interfaces that generate a PTT signal even when the audio is complete silence * Improved win32 serial port support == Bug fixes == * The MT63 transmit buffer is now correctly initialized * Fixed random exceptions-related crashes on win32 * Stabilized AFC for all PSK baud rates * Improved sensitivity of RSID implementation Many more small (and a couple not so small) bug fixes all over the tree fldigi-3.21.80/po/0000775000175000017500000000000012313333723010544 500000000000000fldigi-3.21.80/po/remove-potcdate.sin0000664000175000017500000000066012313064025014273 00000000000000# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } fldigi-3.21.80/po/fldigi.pot0000664000175000017500000035263012313333722012456 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: fldigi 3.21.80\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2014-03-22 11:18-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: src/main.cxx:415 #, c-format msgid "%s log started on %s" msgstr "" #: src/main.cxx:1014 msgid "Bad modem id" msgstr "" #: src/main.cxx:1021 msgid "Bad frequency" msgstr "" #: src/main.cxx:1152 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" #: src/main.cxx:1377 src/main.cxx:1419 src/main.cxx:1443 src/main.cxx:1457 msgid "Could not make directory " msgstr "" #: src/dialogs/fl_digi.cxx:156 msgid "Log all RX/TX text" msgstr "" #: src/dialogs/fl_digi.cxx:157 src/misc/debug.cxx:103 msgid "Rig control" msgstr "" #: src/dialogs/fl_digi.cxx:158 src/dialogs/fl_digi.cxx:5455 msgid "Op &Mode" msgstr "" #: src/dialogs/fl_digi.cxx:159 msgid "Show fewer modes" msgstr "" #: src/dialogs/fl_digi.cxx:160 msgid "Show all modes" msgstr "" #: src/dialogs/fl_digi.cxx:164 msgid "&View" msgstr "" #: src/dialogs/fl_digi.cxx:165 msgid "&MFSK Image" msgstr "" #: src/dialogs/fl_digi.cxx:166 msgid "&Weather Fax Image RX" msgstr "" #: src/dialogs/fl_digi.cxx:167 msgid "&Weather Fax Image TX" msgstr "" #: src/dialogs/fl_digi.cxx:168 src/dialogs/confdialog.cxx:5193 msgid "Contest" msgstr "" #: src/dialogs/fl_digi.cxx:169 msgid "&Contest fields" msgstr "" #: src/dialogs/fl_digi.cxx:170 msgid "C&ountries" msgstr "" #: src/dialogs/fl_digi.cxx:171 msgid "&UI" msgstr "" #: src/dialogs/fl_digi.cxx:172 msgid "Full" msgstr "" #: src/dialogs/fl_digi.cxx:173 src/waterfall/waterfall.cxx:2119 #: src/dialogs/confdialog.cxx:5103 src/dialogs/confdialog.cxx:9806 #: src/dialogs/confdialog.cxx:9836 msgid "None" msgstr "" #: src/dialogs/fl_digi.cxx:174 msgid "Rig control and logging" msgstr "" #: src/dialogs/fl_digi.cxx:175 msgid "Rig control and contest" msgstr "" #: src/dialogs/fl_digi.cxx:176 msgid "Docked scope" msgstr "" #: src/dialogs/fl_digi.cxx:177 msgid "Minimal controls" msgstr "" #: src/dialogs/fl_digi.cxx:178 msgid "Show channels" msgstr "" #: src/dialogs/fl_digi.cxx:180 msgid "Connect to server" msgstr "" #: src/dialogs/fl_digi.cxx:591 src/dialogs/fl_digi.cxx:606 #: src/dialogs/fl_digi.cxx:615 src/dialogs/fl_digi.cxx:3354 #: src/dialogs/fl_digi.cxx:3411 src/dialogs/fl_digi.cxx:3474 #: src/dialogs/fl_digi.cxx:5470 src/dialogs/fl_digi.cxx:5514 #: src/dialogs/fl_digi.cxx:5545 msgid "Custom..." msgstr "" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2763 msgid "Save changed macros?" msgstr "" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2415 #: src/dialogs/fl_digi.cxx:2477 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 #: src/dialogs/fl_digi.cxx:3892 src/logbook/logsupport.cxx:585 #: src/misc/configuration.cxx:698 src/dialogs/font_browser.cxx:137 #: src/logbook/lgbook.cxx:447 src/logbook/lgbook.cxx:1056 msgid "Cancel" msgstr "" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 #: src/dialogs/fl_digi.cxx:3579 src/dialogs/fl_digi.cxx:4643 #: src/dialogs/fl_digi.cxx:4810 src/dialogs/fl_digi.cxx:4915 #: src/logbook/logsupport.cxx:584 src/dialogs/confdialog.cxx:10249 msgid "Save" msgstr "" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 msgid "Don't save" msgstr "" #: src/dialogs/fl_digi.cxx:1749 msgid "No file name given" msgstr "" #: src/dialogs/fl_digi.cxx:1752 msgid "Unsupported format" msgstr "" #: src/dialogs/fl_digi.cxx:1755 msgid "channels != 1" msgstr "" #: src/dialogs/fl_digi.cxx:1758 msgid "unknown wave file error" msgstr "" #: src/dialogs/fl_digi.cxx:1765 msgid "Spotting disabled" msgstr "" #: src/dialogs/fl_digi.cxx:1814 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" #: src/dialogs/fl_digi.cxx:1827 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" #: src/dialogs/fl_digi.cxx:1878 msgid "Checking for updates..." msgstr "" #: src/dialogs/fl_digi.cxx:1893 #, c-format msgid "" "Could not check for updates:\n" "%s" msgstr "" #: src/dialogs/fl_digi.cxx:1897 #, c-format msgid "" "Version %s is available at\n" "\n" "%s\n" "\n" "What would you like to do?" msgstr "" #: src/dialogs/fl_digi.cxx:1898 src/dialogs/Viewer.cxx:304 #: src/misc/macroedit.cxx:419 src/misc/newinstall.cxx:391 #: src/mfsk/mfsk-pic.cxx:342 src/spot/notify.cxx:519 src/spot/notify.cxx:523 #: src/dialogs/confdialog.cxx:10252 msgid "Close" msgstr "" #: src/dialogs/fl_digi.cxx:1898 msgid "Visit URL" msgstr "" #: src/dialogs/fl_digi.cxx:1898 msgid "Copy URL" msgstr "" #: src/dialogs/fl_digi.cxx:1910 msgid "You are running the latest version" msgstr "" #: src/dialogs/fl_digi.cxx:1976 msgid "Sunspot creation underway!" msgstr "" #: src/dialogs/fl_digi.cxx:1983 msgid "Audio device information is only available for the PortAudio backend" msgstr "" #: src/dialogs/fl_digi.cxx:1992 msgid "Capture device" msgstr "" #: src/dialogs/fl_digi.cxx:1993 msgid "Playback device" msgstr "" #: src/dialogs/fl_digi.cxx:1997 msgid "Capture and playback devices" msgstr "" #: src/dialogs/fl_digi.cxx:2043 #, c-format msgid "%s: Do not exist, create?" msgstr "" #: src/dialogs/fl_digi.cxx:2043 src/dialogs/fl_digi.cxx:2796 #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 #: src/logbook/logsupport.cxx:251 src/logbook/logsupport.cxx:1047 #: src/misc/configuration.cxx:700 src/soundcard/sound.cxx:306 msgid "No" msgstr "" #: src/dialogs/fl_digi.cxx:2043 src/dialogs/fl_digi.cxx:2796 #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 #: src/logbook/logsupport.cxx:251 src/logbook/logsupport.cxx:1047 #: src/misc/configuration.cxx:700 src/soundcard/sound.cxx:306 msgid "Yes" msgstr "" #: src/dialogs/fl_digi.cxx:2415 msgid "Clear log fields?" msgstr "" #: src/dialogs/fl_digi.cxx:2415 src/misc/configuration.cxx:698 #: src/logbook/lgbook.cxx:444 src/logbook/lgbook.cxx:1053 msgid "OK" msgstr "" #: src/dialogs/fl_digi.cxx:2430 msgid "Enter a CALL !" msgstr "" #: src/dialogs/fl_digi.cxx:2477 src/dialogs/fl_digi.cxx:3892 msgid "Confirm" msgstr "" #: src/dialogs/fl_digi.cxx:2751 msgid "Save changed configuration?" msgstr "" #: src/dialogs/fl_digi.cxx:2775 msgid "Save current log entry?" msgstr "" #: src/dialogs/fl_digi.cxx:2796 msgid "Really want to quit?" msgstr "" #: src/dialogs/fl_digi.cxx:3311 src/dialogs/fl_digi.cxx:5451 msgid "&File" msgstr "" #: src/dialogs/fl_digi.cxx:3313 msgid "Folders" msgstr "" #: src/dialogs/fl_digi.cxx:3314 msgid "Fldigi config..." msgstr "" #: src/dialogs/fl_digi.cxx:3315 msgid "FLMSG files..." msgstr "" #: src/dialogs/fl_digi.cxx:3316 msgid "NBEMS files..." msgstr "" #: src/dialogs/fl_digi.cxx:3317 msgid "Data files..." msgstr "" #: src/dialogs/fl_digi.cxx:3320 src/dialogs/confdialog.cxx:5617 msgid "Macros" msgstr "" #: src/dialogs/fl_digi.cxx:3321 msgid "Open ..." msgstr "" #: src/dialogs/fl_digi.cxx:3322 msgid "Save ..." msgstr "" #: src/dialogs/fl_digi.cxx:3325 msgid "Text Capture" msgstr "" #: src/dialogs/fl_digi.cxx:3330 src/misc/debug.cxx:101 #: src/dialogs/confdialog.cxx:8654 msgid "Audio" msgstr "" #: src/dialogs/fl_digi.cxx:3331 msgid "RX capture" msgstr "" #: src/dialogs/fl_digi.cxx:3332 msgid "TX generate" msgstr "" #: src/dialogs/fl_digi.cxx:3333 src/dialogs/confdialog.cxx:8754 msgid "Playback" msgstr "" #: src/dialogs/fl_digi.cxx:3337 src/dialogs/fl_digi.cxx:5452 msgid "Exit" msgstr "" #: src/dialogs/fl_digi.cxx:3518 src/dialogs/fl_digi.cxx:5585 msgid "&Configure" msgstr "" #: src/dialogs/fl_digi.cxx:3519 src/dialogs/confdialog.cxx:4937 msgid "Operator" msgstr "" #: src/dialogs/fl_digi.cxx:3520 msgid "Colors && Fonts" msgstr "" #: src/dialogs/fl_digi.cxx:3521 msgid "User Interface" msgstr "" #: src/dialogs/fl_digi.cxx:3522 src/dialogs/fl_digi.cxx:3556 #: src/dialogs/fl_digi.cxx:5586 src/dialogs/confdialog.cxx:6112 msgid "Waterfall" msgstr "" #: src/dialogs/fl_digi.cxx:3523 msgid "Waterfall controls" msgstr "" #: src/dialogs/fl_digi.cxx:3525 src/dialogs/fl_digi.cxx:5589 #: src/dialogs/confdialog.cxx:6489 msgid "Modems" msgstr "" #: src/dialogs/fl_digi.cxx:3527 src/dialogs/fl_digi.cxx:5588 msgid "Sound Card" msgstr "" #: src/dialogs/fl_digi.cxx:3528 src/dialogs/fl_digi.cxx:5590 msgid "IDs" msgstr "" #: src/dialogs/fl_digi.cxx:3529 src/dialogs/confdialog.cxx:9220 msgid "Misc" msgstr "" #: src/dialogs/fl_digi.cxx:3530 src/dialogs/confdialog.cxx:10038 msgid "Autostart" msgstr "" #: src/dialogs/fl_digi.cxx:3531 src/dialogs/fl_digi.cxx:5591 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "" #: src/dialogs/fl_digi.cxx:3533 msgid "QRZ/eQSL" msgstr "" #: src/dialogs/fl_digi.cxx:3534 src/dialogs/fl_digi.cxx:5592 msgid "Save Config" msgstr "" #: src/dialogs/fl_digi.cxx:3539 msgid "View/Hide Channels" msgstr "" #: src/dialogs/fl_digi.cxx:3541 msgid "Floating scope" msgstr "" #: src/dialogs/fl_digi.cxx:3545 msgid "Signal browser" msgstr "" #: src/dialogs/fl_digi.cxx:3548 msgid "Controls" msgstr "" #: src/dialogs/fl_digi.cxx:3563 msgid "&Logbook" msgstr "" #: src/dialogs/fl_digi.cxx:3564 msgid "View" msgstr "" #: src/dialogs/fl_digi.cxx:3566 msgid "ADIF" msgstr "" #: src/dialogs/fl_digi.cxx:3567 msgid "Merge..." msgstr "" #: src/dialogs/fl_digi.cxx:3568 msgid "Export..." msgstr "" #: src/dialogs/fl_digi.cxx:3571 msgid "Reports" msgstr "" #: src/dialogs/fl_digi.cxx:3572 msgid "Text..." msgstr "" #: src/dialogs/fl_digi.cxx:3573 msgid "CSV..." msgstr "" #: src/dialogs/fl_digi.cxx:3574 msgid "Cabrillo..." msgstr "" #: src/dialogs/fl_digi.cxx:3577 src/logbook/logsupport.cxx:593 #: src/logbook/lgbook.cxx:960 msgid "New" msgstr "" #: src/dialogs/fl_digi.cxx:3578 src/dialogs/confdialog.cxx:8200 msgid "Open..." msgstr "" #: src/dialogs/fl_digi.cxx:3586 msgid "&Help" msgstr "" #: src/dialogs/fl_digi.cxx:3589 msgid "Create sunspots" msgstr "" #: src/dialogs/fl_digi.cxx:3591 msgid "Beginners' Guide" msgstr "" #: src/dialogs/fl_digi.cxx:3592 msgid "Online documentation..." msgstr "" #: src/dialogs/fl_digi.cxx:3593 msgid "Fldigi web site..." msgstr "" #: src/dialogs/fl_digi.cxx:3594 msgid "Reception reports..." msgstr "" #: src/dialogs/fl_digi.cxx:3595 msgid "Command line options" msgstr "" #: src/dialogs/fl_digi.cxx:3596 msgid "Audio device info" msgstr "" #: src/dialogs/fl_digi.cxx:3597 msgid "Build info" msgstr "" #: src/dialogs/fl_digi.cxx:3598 src/misc/debug.cxx:137 msgid "Event log" msgstr "" #: src/dialogs/fl_digi.cxx:3599 msgid "Check for updates..." msgstr "" #: src/dialogs/fl_digi.cxx:3600 msgid "&About" msgstr "" #: src/dialogs/fl_digi.cxx:3834 msgid "waterfall-only mode" msgstr "" #: src/dialogs/fl_digi.cxx:3836 msgid "NO CALLSIGN SET" msgstr "" #: src/dialogs/fl_digi.cxx:3851 msgid "Close List" msgstr "" #: src/dialogs/fl_digi.cxx:3861 src/dialogs/fl_digi.cxx:4491 #: src/dialogs/fl_digi.cxx:4789 src/dialogs/fl_digi.cxx:4901 msgid "Open List" msgstr "" #: src/dialogs/fl_digi.cxx:3892 msgid "Clear list?" msgstr "" #: src/dialogs/fl_digi.cxx:3925 msgid "report" msgstr "" #: src/dialogs/fl_digi.cxx:3925 msgid "reports" msgstr "" #: src/dialogs/fl_digi.cxx:3935 msgid "Recent activity for grid" msgstr "" #: src/dialogs/fl_digi.cxx:4485 msgid "No rig specified" msgstr "" #: src/dialogs/fl_digi.cxx:4562 src/spot/notify.cxx:215 #: src/dialogs/confdialog.cxx:5181 msgid "Select" msgstr "" #: src/dialogs/fl_digi.cxx:4569 msgid "Add current frequency" msgstr "" #: src/dialogs/fl_digi.cxx:4576 msgid "Clear list" msgstr "" #: src/dialogs/fl_digi.cxx:4583 msgid "Delete from list" msgstr "" #: src/dialogs/fl_digi.cxx:4603 msgid "Select operating parameters" msgstr "" #: src/dialogs/fl_digi.cxx:4629 src/dialogs/fl_digi.cxx:4796 msgid "QRZ" msgstr "" #: src/dialogs/fl_digi.cxx:4636 src/dialogs/fl_digi.cxx:4803 #: src/dialogs/fl_digi.cxx:4908 src/dialogs/fl_digi.cxx:5124 #: src/dialogs/Viewer.cxx:312 src/widgets/FTextView.cxx:480 #: src/widgets/FTextView.cxx:645 src/widgets/flinput2.cxx:47 #: src/dialogs/confdialog.cxx:7570 msgid "Clear" msgstr "" #: src/dialogs/fl_digi.cxx:4655 src/logbook/lgbook.cxx:467 #: src/logbook/lgbook.cxx:1079 msgid "Freq" msgstr "" #: src/dialogs/fl_digi.cxx:4657 msgid "frequency kHz" msgstr "" #: src/dialogs/fl_digi.cxx:4660 src/dialogs/fl_digi.cxx:4812 #: src/dialogs/fl_digi.cxx:4918 msgid "On" msgstr "" #: src/dialogs/fl_digi.cxx:4661 msgid "Press to update QSO start time" msgstr "" #: src/dialogs/fl_digi.cxx:4665 msgid "QSO start time" msgstr "" #: src/dialogs/fl_digi.cxx:4669 src/dialogs/fl_digi.cxx:4825 #: src/dialogs/fl_digi.cxx:4919 msgid "Off" msgstr "" #: src/dialogs/fl_digi.cxx:4670 msgid "QSO end time" msgstr "" #: src/dialogs/fl_digi.cxx:4674 src/dialogs/fl_digi.cxx:4842 #: src/logbook/lgbook.cxx:620 msgid "In" msgstr "" #: src/dialogs/fl_digi.cxx:4678 src/dialogs/fl_digi.cxx:4850 #: src/logbook/lgbook.cxx:706 msgid "Out" msgstr "" #: src/dialogs/fl_digi.cxx:4682 src/dialogs/fl_digi.cxx:4834 #: src/dialogs/fl_digi.cxx:4920 src/widgets/FTextRXTX.cxx:105 #: src/logbook/lgbook.cxx:459 src/logbook/lgbook.cxx:596 #: src/logbook/lgbook.cxx:1075 msgid "Call" msgstr "" #: src/dialogs/fl_digi.cxx:4683 msgid "call sign" msgstr "" #: src/dialogs/fl_digi.cxx:4686 msgid "Op" msgstr "" #: src/dialogs/fl_digi.cxx:4687 msgid "Operator name" msgstr "" #: src/dialogs/fl_digi.cxx:4691 msgid "Azimuth" msgstr "" #: src/dialogs/fl_digi.cxx:4697 msgid "City" msgstr "" #: src/dialogs/fl_digi.cxx:4701 msgid "US State" msgstr "" #: src/dialogs/fl_digi.cxx:4705 msgid "Can. Province" msgstr "" #: src/dialogs/fl_digi.cxx:4709 msgid "Maidenhead Locator" msgstr "" #: src/dialogs/fl_digi.cxx:4720 src/dialogs/fl_digi.cxx:4969 msgid "Sent serial number (read only)" msgstr "" #: src/dialogs/fl_digi.cxx:4725 src/dialogs/fl_digi.cxx:4960 msgid "Received serial number" msgstr "" #: src/dialogs/fl_digi.cxx:4729 src/dialogs/fl_digi.cxx:4951 msgid "Contest exchange in" msgstr "" #: src/dialogs/fl_digi.cxx:4744 src/spot/notify.cxx:569 #: src/widgets/FTextRXTX.cxx:110 src/logbook/lgbook.cxx:521 #: src/logbook/lgbook.cxx:767 msgid "Country" msgstr "" #: src/dialogs/fl_digi.cxx:4750 src/logbook/lgbook.cxx:524 #: src/logbook/lgbook.cxx:791 msgid "Notes" msgstr "" #: src/dialogs/fl_digi.cxx:4816 src/dialogs/fl_digi.cxx:4975 msgid "Press to update" msgstr "" #: src/dialogs/fl_digi.cxx:4822 src/dialogs/fl_digi.cxx:4981 #: src/logbook/lgbook.cxx:584 msgid "Time On" msgstr "" #: src/dialogs/fl_digi.cxx:4831 src/dialogs/fl_digi.cxx:4989 #: src/logbook/lgbook.cxx:658 msgid "Time Off" msgstr "" #: src/dialogs/fl_digi.cxx:4840 src/dialogs/fl_digi.cxx:4936 #: src/dialogs/fl_digi.cxx:5289 msgid "Other call" msgstr "" #: src/dialogs/fl_digi.cxx:4848 msgid "Received RST" msgstr "" #: src/dialogs/fl_digi.cxx:4856 msgid "Sent RST" msgstr "" #: src/dialogs/fl_digi.cxx:4858 msgid "Nm" msgstr "" #: src/dialogs/fl_digi.cxx:4865 msgid "Other name" msgstr "" #: src/dialogs/fl_digi.cxx:4921 msgid "# S" msgstr "" #: src/dialogs/fl_digi.cxx:4922 msgid "# R" msgstr "" #: src/dialogs/fl_digi.cxx:4923 msgid "Ex" msgstr "" #: src/dialogs/fl_digi.cxx:5029 msgid "" "Left Click - execute\n" "Shift-Fkey - execute\n" "Right Click - edit" msgstr "" #: src/dialogs/fl_digi.cxx:5036 msgid "Shift-key macro set" msgstr "" #: src/dialogs/fl_digi.cxx:5083 msgid "" "Left click - select\n" "Right click - clear line" msgstr "" #: src/dialogs/fl_digi.cxx:5099 msgid "seek - regular expression" msgstr "" #: src/dialogs/fl_digi.cxx:5120 src/dialogs/Viewer.cxx:322 msgid "Set Viewer Squelch" msgstr "" #: src/dialogs/fl_digi.cxx:5207 msgid "" "Left Click - execute\n" "Fkey - execute\n" "Right Click - edit" msgstr "" #: src/dialogs/fl_digi.cxx:5214 msgid "Primary macro set" msgstr "" #: src/dialogs/fl_digi.cxx:5231 src/dialogs/fl_digi.cxx:5813 msgid "Detected signal level" msgstr "" #: src/dialogs/fl_digi.cxx:5242 src/dialogs/fl_digi.cxx:5825 #: src/waterfall/waterfall.cxx:2120 msgid "Squelch level" msgstr "" #: src/dialogs/fl_digi.cxx:5256 src/dialogs/fl_digi.cxx:5839 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" #: src/dialogs/fl_digi.cxx:5266 src/dialogs/fl_digi.cxx:5846 msgid "CW transmit WPM" msgstr "" #: src/dialogs/fl_digi.cxx:5272 src/dialogs/fl_digi.cxx:5853 msgid "Default WPM" msgstr "" #: src/dialogs/fl_digi.cxx:5311 src/dialogs/fl_digi.cxx:5885 msgid "Tx level attenuator (dB)" msgstr "" #: src/dialogs/fl_digi.cxx:5335 src/dialogs/fl_digi.cxx:5908 msgid "Automatic Frequency Control" msgstr "" #: src/dialogs/fl_digi.cxx:5338 src/dialogs/fl_digi.cxx:5911 msgid "Squelch" msgstr "" #: src/dialogs/fl_digi.cxx:5381 src/dialogs/fl_digi.cxx:5723 msgid "Scope" msgstr "" #: src/dialogs/fl_digi.cxx:5601 src/dialogs/Viewer.cxx:279 msgid "Signal Browser" msgstr "" #: src/dialogs/Viewer.cxx:283 msgid "Find: " msgstr "" #: src/dialogs/Viewer.cxx:316 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" #: src/logbook/adif_io.cxx:233 #, c-format msgid "Empty ADIF logbook file %s" msgstr "" #: src/logbook/adif_io.cxx:252 #, c-format msgid "Error reading %s" msgstr "" #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 msgid "Save changed Logbook?" msgstr "" #: src/logbook/logsupport.cxx:141 msgid "Export to CSV file" msgstr "" #: src/logbook/logsupport.cxx:167 msgid "Export to fixed field text file" msgstr "" #: src/logbook/logsupport.cxx:194 msgid "Export to ADIF file" msgstr "" #: src/logbook/logsupport.cxx:251 msgid "Create New Logbook?" msgstr "" #: src/logbook/logsupport.cxx:280 msgid "Open logbook file" msgstr "" #: src/logbook/logsupport.cxx:303 msgid "Save logbook file" msgstr "" #: src/logbook/logsupport.cxx:497 msgid "Merge ADIF file" msgstr "" #: src/logbook/logsupport.cxx:594 src/spot/notify.cxx:203 #: src/spot/notify.cxx:517 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:967 msgid "Update" msgstr "" #: src/logbook/logsupport.cxx:1046 #, c-format msgid "Really delete record for \"%s\"?" msgstr "" #: src/logbook/logsupport.cxx:1433 msgid "Create cabrillo report" msgstr "" #: src/logger/rx_extract.cxx:55 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:60 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:270 msgid "Could not start flmsg" msgstr "" #: src/logger/rx_extract.cxx:337 src/logger/rx_extract.cxx:340 #: src/dialogs/confdialog.cxx:9287 msgid "Locate flmsg executable" msgstr "" #: src/logger/rx_extract.cxx:337 msgid "flmsg.exe\t*.exe" msgstr "" #: src/logger/rx_extract.cxx:340 msgid "flmsg\t*" msgstr "" #: src/logger/rx_extract.cxx:415 msgid "Locate executable" msgstr "" #: src/logger/rx_extract.cxx:415 msgid "*.exe" msgstr "" #: src/logger/rx_extract.cxx:425 msgid "Locate binary" msgstr "" #: src/logger/rx_extract.cxx:425 msgid "*" msgstr "" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" #: src/misc/configuration.cxx:508 msgid "Rig mode" msgstr "" #: src/misc/configuration.cxx:509 msgid "Always LSB" msgstr "" #: src/misc/configuration.cxx:510 msgid "Always USB" msgstr "" #: src/misc/configuration.cxx:695 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" #: src/misc/configuration.cxx:700 msgid "Confirm RESET" msgstr "" #: src/misc/debug.cxx:91 msgid "Quiet" msgstr "" #: src/misc/debug.cxx:91 msgid "Error" msgstr "" #: src/misc/debug.cxx:91 msgid "Warning" msgstr "" #: src/misc/debug.cxx:91 msgid "Info" msgstr "" #: src/misc/debug.cxx:91 msgid "Verbose" msgstr "" #: src/misc/debug.cxx:91 msgid "Debug" msgstr "" #: src/misc/debug.cxx:100 msgid "ARQ control" msgstr "" #: src/misc/debug.cxx:102 src/waterfall/waterfall.cxx:2121 msgid "Modem" msgstr "" #: src/misc/debug.cxx:104 msgid "RPC" msgstr "" #: src/misc/debug.cxx:105 msgid "Spotter" msgstr "" #: src/misc/debug.cxx:106 msgid "Other" msgstr "" #: src/misc/debug.cxx:141 msgid "Log sources" msgstr "" #: src/misc/debug.cxx:146 msgid "Change log level" msgstr "" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "" #: src/misc/macroedit.cxx:78 msgid "\tmy antenna" msgstr "" #: src/misc/macroedit.cxx:79 msgid "\toperating band" msgstr "" #: src/misc/macroedit.cxx:81 msgid "\tFldigi version" msgstr "" #: src/misc/macroedit.cxx:84 msgid "\tother call" msgstr "" #: src/misc/macroedit.cxx:85 msgid "\tS/N etc." msgstr "" #: src/misc/macroedit.cxx:86 msgid "\tIMD etc." msgstr "" #: src/misc/macroedit.cxx:87 msgid "\tother locator" msgstr "" #: src/misc/macroedit.cxx:88 msgid "\tother name" msgstr "" #: src/misc/macroedit.cxx:89 msgid "\tother QTH" msgstr "" #: src/misc/macroedit.cxx:90 msgid "\tother RST" msgstr "" #: src/misc/macroedit.cxx:91 msgid "\t# QSO recs" msgstr "" #: src/misc/macroedit.cxx:92 msgid "\tnext QSO rec #" msgstr "" #: src/misc/macroedit.cxx:93 msgid "\tmap on google" msgstr "" #: src/misc/macroedit.cxx:94 msgid "\tmap by value" msgstr "" #: src/misc/macroedit.cxx:97 msgid "\tclear RX pane" msgstr "" #: src/misc/macroedit.cxx:98 msgid "\tclear TX pane" msgstr "" #: src/misc/macroedit.cxx:101 msgid "\ttext to NAME/QTH" msgstr "" #: src/misc/macroedit.cxx:105 msgid "\tDigitalk On, Off, Toggle" msgstr "" #: src/misc/macroedit.cxx:109 msgid "\tclear log fields" msgstr "" #: src/misc/macroedit.cxx:110 msgid "\tsave QSO data" msgstr "" #: src/misc/macroedit.cxx:111 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:112 msgid "\tlog at xmt time" msgstr "" #: src/misc/macroedit.cxx:113 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:114 msgid "\tlog eQSL" msgstr "" #: src/misc/macroedit.cxx:115 msgid "\tlog eQSL optional msg" msgstr "" #: src/misc/macroedit.cxx:118 msgid "\tQSO time (HHMM))" msgstr "" #: src/misc/macroedit.cxx:119 msgid "\tLDT in iso-8601 format" msgstr "" #: src/misc/macroedit.cxx:120 msgid "\tLocal datetime" msgstr "" #: src/misc/macroedit.cxx:121 msgid "\tZDT in iso-8601 format" msgstr "" #: src/misc/macroedit.cxx:122 msgid "\tUTC datetime" msgstr "" #: src/misc/macroedit.cxx:123 msgid "\tlocal time HHMM" msgstr "" #: src/misc/macroedit.cxx:124 msgid "\tzulu time HHMMZ" msgstr "" #: src/misc/macroedit.cxx:125 msgid "\tlocal date YYYY-MM-DD" msgstr "" #: src/misc/macroedit.cxx:126 msgid "\tzulu date YYYY-MM-DD Z" msgstr "" #: src/misc/macroedit.cxx:127 msgid "\tget weather data" msgstr "" #: src/misc/macroedit.cxx:128 msgid "\tget weather data for station" msgstr "" #: src/misc/macroedit.cxx:131 msgid "\tcontest counter" msgstr "" #: src/misc/macroedit.cxx:132 msgid "\tdecrement counter" msgstr "" #: src/misc/macroedit.cxx:133 msgid "\tincrement counter" msgstr "" #: src/misc/macroedit.cxx:134 msgid "\texchange in" msgstr "" #: src/misc/macroedit.cxx:135 msgid "\texchange out" msgstr "" #: src/misc/macroedit.cxx:136 msgid "\texchange begin" msgstr "" #: src/misc/macroedit.cxx:137 msgid "\texchange end" msgstr "" #: src/misc/macroedit.cxx:138 msgid "\tsave contest out" msgstr "" #: src/misc/macroedit.cxx:141 msgid "\treceive" msgstr "" #: src/misc/macroedit.cxx:142 msgid "\ttransmit" msgstr "" #: src/misc/macroedit.cxx:143 msgid "\ttoggle T/R" msgstr "" #: src/misc/macroedit.cxx:144 msgid "\tsearch UP for signal" msgstr "" #: src/misc/macroedit.cxx:145 msgid "\tsearch DOWN for signal" msgstr "" #: src/misc/macroedit.cxx:146 msgid "\treturn to sweet spot" msgstr "" #: src/misc/macroedit.cxx:147 msgid "\tmove to freq NNNN Hz" msgstr "" #: src/misc/macroedit.cxx:148 msgid "\tleft-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:149 msgid "\tright-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:152 msgid "\tinsert QRG into Rx text" msgstr "" #: src/misc/macroedit.cxx:155 msgid "\tqsy to kHz, Hz" msgstr "" #: src/misc/macroedit.cxx:156 msgid "\tvalid xcvr mode" msgstr "" #: src/misc/macroedit.cxx:157 msgid "\tvalid xcvr filter width" msgstr "" #: src/misc/macroedit.cxx:160 msgid "\tinsert text file" msgstr "" #: src/misc/macroedit.cxx:161 msgid "\tinsert MFSK image" msgstr "" #: src/misc/macroedit.cxx:164 msgid "\tpause transmit" msgstr "" #: src/misc/macroedit.cxx:165 msgid "\tidle signal for NN.nn sec" msgstr "" #: src/misc/macroedit.cxx:166 msgid "\trepeat every NN sec" msgstr "" #: src/misc/macroedit.cxx:167 msgid "\ttune signal for NN sec" msgstr "" #: src/misc/macroedit.cxx:168 msgid "\tdelay xmt for NN sec" msgstr "" #: src/misc/macroedit.cxx:169 msgid "\trepeat macro continuously" msgstr "" #: src/misc/macroedit.cxx:170 msgid "\tschedule execution" msgstr "" #: src/misc/macroedit.cxx:173 msgid "\t set xmt attenuator" msgstr "" #: src/misc/macroedit.cxx:176 msgid "\tCW identifier" msgstr "" #: src/misc/macroedit.cxx:177 msgid "\tsend mode ID in video text" msgstr "" #: src/misc/macroedit.cxx:178 msgid "\tvideo text" msgstr "" #: src/misc/macroedit.cxx:179 msgid "\tTx RSID on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:180 msgid "\tRx RSID on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:181 msgid "\tTransmit |NN| successive RsID bursts" msgstr "" #: src/misc/macroedit.cxx:182 msgid "\t[Wait][Len](ms)" msgstr "" #: src/misc/macroedit.cxx:185 msgid "\tCW QSK post-timing" msgstr "" #: src/misc/macroedit.cxx:186 msgid "\tCW QSK pre-timing" msgstr "" #: src/misc/macroedit.cxx:187 msgid "\tCW rise time" msgstr "" #: src/misc/macroedit.cxx:188 msgid "\tCW WPM:Farnsworth" msgstr "" #: src/misc/macroedit.cxx:191 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:194 msgid "\tAFC on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:195 msgid "\tLOCK on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:196 msgid "\tRev on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:199 msgid "\tchange macro defs file" msgstr "" #: src/misc/macroedit.cxx:200 msgid "\tsave current macro file" msgstr "" #: src/misc/macroedit.cxx:203 msgid "\tuntransmitted comment" msgstr "" #: src/misc/macroedit.cxx:206 msgid "\tmodem timing test internal string" msgstr "" #: src/misc/macroedit.cxx:207 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:208 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:211 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:212 msgid "\tWAV file; spec' file" msgstr "" #: src/misc/macroedit.cxx:213 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:328 msgid "Text file to insert" msgstr "" #: src/misc/macroedit.cxx:336 msgid "Test text file" msgstr "" #: src/misc/macroedit.cxx:344 msgid "MFSK image file" msgstr "" #: src/misc/macroedit.cxx:351 msgid "Change to Macro file" msgstr "" #: src/misc/macroedit.cxx:361 msgid "Executable file to insert" msgstr "" #: src/misc/macroedit.cxx:391 msgid "Macro Text" msgstr "" #: src/misc/macroedit.cxx:396 msgid "Select Tag" msgstr "" #: src/misc/macroedit.cxx:408 msgid "Macro Button Label" msgstr "" #: src/misc/macroedit.cxx:416 msgid "Apply" msgstr "" #: src/misc/macroedit.cxx:443 msgid "Macro editor - " msgstr "" #: src/misc/macros.cxx:2786 msgid "Open macro file" msgstr "" #: src/misc/macros.cxx:2787 src/misc/macros.cxx:2825 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "" #: src/misc/macros.cxx:2824 msgid "Save macro file" msgstr "" #: src/misc/network.cxx:170 msgid "Aborted" msgstr "" #: src/misc/network.cxx:170 msgid "Timed out" msgstr "" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "" #: src/misc/newinstall.cxx:389 msgid "Back" msgstr "" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "" #: src/misc/newinstall.cxx:522 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "" #: src/misc/newinstall.cxx:523 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" #: src/misc/newinstall.cxx:538 msgid "Fldigi configuration wizard" msgstr "" #: src/mfsk/mfsk-pic.cxx:142 src/mfsk/mfsk-pic.cxx:146 #: src/mfsk/mfsk-pic.cxx:305 src/mfsk/mfsk-pic.cxx:308 msgid "Time needed: " msgstr "" #: src/mfsk/mfsk-pic.cxx:175 msgid "Load image file" msgstr "" #: src/mfsk/mfsk-pic.cxx:316 msgid "Send image" msgstr "" #: src/mfsk/mfsk-pic.cxx:323 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" #: src/mfsk/mfsk-pic.cxx:327 msgid "Transfer speed, X1-normal" msgstr "" #: src/mfsk/mfsk-pic.cxx:339 msgid "Load" msgstr "" #: src/waterfall/waterfall.cxx:1563 msgid "Waterfall / FFT / Scope" msgstr "" #: src/waterfall/waterfall.cxx:1573 msgid "Upper signal level (dB)" msgstr "" #: src/waterfall/waterfall.cxx:1584 msgid "Signal range (dB)" msgstr "" #: src/waterfall/waterfall.cxx:1590 msgid "Change waterfall scale" msgstr "" #: src/waterfall/waterfall.cxx:1595 msgid "Slew display lower in frequency" msgstr "" #: src/waterfall/waterfall.cxx:1600 msgid "Center display on signal" msgstr "" #: src/waterfall/waterfall.cxx:1605 msgid "Slew display higher in frequency" msgstr "" #: src/waterfall/waterfall.cxx:1610 msgid "Waterfall drop speed" msgstr "" #: src/waterfall/waterfall.cxx:1620 msgid "Adjust cursor frequency" msgstr "" #: src/waterfall/waterfall.cxx:1625 msgid "" "Center in passband\n" "Right click to undo" msgstr "" #: src/waterfall/waterfall.cxx:1631 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" #: src/waterfall/waterfall.cxx:1641 msgid "Lock transmit frequency" msgstr "" #: src/waterfall/waterfall.cxx:1650 src/dialogs/confdialog.cxx:5706 msgid "Reverse" msgstr "" #: src/waterfall/waterfall.cxx:1657 msgid "Transmit/Receive" msgstr "" #: src/waterfall/waterfall.cxx:2119 msgid "AFC range or BW" msgstr "" #: src/waterfall/waterfall.cxx:2120 msgid "Signal search" msgstr "" #: src/waterfall/waterfall.cxx:2121 msgid "Modem carrier" msgstr "" #: src/waterfall/waterfall.cxx:2121 msgid "Scroll" msgstr "" #: src/rigcontrol/FreqControl.cxx:136 msgid "" "Enter frequency or change with\n" "Left/Right/Up/Down/Pg_Up/Pg_Down" msgstr "" #: src/rigcontrol/rigsupport.cxx:469 msgid "Enter Xcvr Freq" msgstr "" #: src/rigcontrol/rigxml.cxx:946 msgid "Open rig xml file" msgstr "" #: src/rigcontrol/rigxml.cxx:946 msgid "Fldigi rig xml definition file\t*.xml" msgstr "" #: src/soundcard/sound.cxx:149 msgid "" "Waveform Audio Format\t*.wav\n" "AU\t*.{au,snd}\n" msgstr "" #: src/soundcard/sound.cxx:152 msgid "Free Lossless Audio Codec\t*.flac" msgstr "" #: src/soundcard/sound.cxx:158 src/soundcard/sound.cxx:160 msgid "Audio file" msgstr "" #: src/soundcard/sound.cxx:306 msgid "Playback continuous loop?" msgstr "" #: src/spot/notify.cxx:191 msgid "My callsign de CALL" msgstr "" #: src/spot/notify.cxx:192 msgid "Station heard twice" msgstr "" #: src/spot/notify.cxx:193 msgid "Custom text search" msgstr "" #: src/spot/notify.cxx:194 msgid "RSID reception" msgstr "" #: src/spot/notify.cxx:202 msgid "Toggle" msgstr "" #: src/spot/notify.cxx:204 src/spot/notify.cxx:516 msgid "Remove" msgstr "" #: src/spot/notify.cxx:216 src/spot/notify.cxx:222 src/spot/notify.cxx:570 #: src/logbook/lgbook.cxx:548 src/logbook/lgbook.cxx:853 msgid "Continent" msgstr "" #: src/spot/notify.cxx:217 src/spot/notify.cxx:223 src/logbook/lgbook.cxx:841 msgid "ITU zone" msgstr "" #: src/spot/notify.cxx:218 src/spot/notify.cxx:224 src/logbook/lgbook.cxx:829 msgid "CQ zone" msgstr "" #: src/spot/notify.cxx:219 src/spot/notify.cxx:225 msgid "All" msgstr "" #: src/spot/notify.cxx:221 msgid "Deselect" msgstr "" #: src/spot/notify.cxx:515 msgid "Add" msgstr "" #: src/spot/notify.cxx:518 msgid "Test..." msgstr "" #: src/spot/notify.cxx:521 src/widgets/FTextView.cxx:481 #: src/widgets/flinput2.cxx:48 msgid "Select All" msgstr "" #: src/spot/notify.cxx:522 src/logbook/lgbook.cxx:403 #: src/logbook/lgbook.cxx:453 src/logbook/lgbook.cxx:1045 #: src/logbook/lgbook.cxx:1119 msgid "Clear All" msgstr "" #: src/spot/notify.cxx:1095 msgid "The regular expression field must not be empty." msgstr "" #: src/spot/notify.cxx:1101 msgid "The regular expression must be valid." msgstr "" #: src/spot/notify.cxx:1108 msgid "Please set your callsign first." msgstr "" #: src/spot/notify.cxx:1245 msgid "Run program" msgstr "" #: src/spot/notify.cxx:1278 msgid "" "Default test string is:\n" " \"" msgstr "" #: src/spot/notify.cxx:1279 msgid "Enter test string or leave blank for default:" msgstr "" #: src/spot/notify.cxx:1290 msgid "This event's regular expression is invalid." msgstr "" #: src/spot/notify.cxx:1297 msgid "The test string did not match this event's search pattern." msgstr "" #: src/spot/notify.cxx:1315 msgid "Available substrings" msgstr "" #: src/spot/notify.cxx:1398 src/logbook/lgbook.cxx:1026 msgid "Frequency" msgstr "" #: src/spot/notify.cxx:1400 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1023 msgid "Callsign" msgstr "" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:126 msgid "Fldigi palette\t*.pal" msgstr "" #: src/waterfall/colorbox.cxx:112 src/waterfall/colorbox.cxx:137 msgid "Palette: " msgstr "" #: src/waterfall/colorbox.cxx:126 msgid "Save palette" msgstr "" #: src/widgets/FTextRXTX.cxx:104 msgid "Look up call" msgstr "" #: src/widgets/FTextRXTX.cxx:106 src/logbook/lgbook.cxx:463 #: src/logbook/lgbook.cxx:608 src/logbook/lgbook.cxx:1025 msgid "Name" msgstr "" #: src/widgets/FTextRXTX.cxx:107 msgid "QTH" msgstr "" #: src/widgets/FTextRXTX.cxx:108 src/dialogs/confdialog.cxx:5298 #: src/logbook/lgbook.cxx:512 msgid "State" msgstr "" #: src/widgets/FTextRXTX.cxx:109 src/logbook/lgbook.cxx:518 msgid "Province" msgstr "" #: src/widgets/FTextRXTX.cxx:111 msgid "Locator" msgstr "" #: src/widgets/FTextRXTX.cxx:112 msgid "RST(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:113 src/dialogs/confdialog.cxx:5304 #: src/logbook/lgbook.cxx:539 src/logbook/lgbook.cxx:924 #: src/logbook/lgbook.cxx:1111 msgid "Exchange In" msgstr "" #: src/widgets/FTextRXTX.cxx:114 src/dialogs/confdialog.cxx:5229 msgid "Serial number" msgstr "" #: src/widgets/FTextRXTX.cxx:115 msgid "Insert marker" msgstr "" #: src/widgets/FTextRXTX.cxx:123 msgid "Quick entry" msgstr "" #: src/widgets/FTextRXTX.cxx:124 msgid "Scroll hints" msgstr "" #: src/widgets/FTextRXTX.cxx:704 msgid " in " msgstr "" #: src/widgets/FTextRXTX.cxx:706 msgid "Last QSO" msgstr "" #: src/widgets/FTextRXTX.cxx:751 src/dialogs/confdialog.cxx:6624 msgid "Transmit" msgstr "" #: src/widgets/FTextRXTX.cxx:752 src/dialogs/confdialog.cxx:6499 #: src/dialogs/confdialog.cxx:7621 msgid "Receive" msgstr "" #: src/widgets/FTextRXTX.cxx:753 msgid "Abort" msgstr "" #: src/widgets/FTextRXTX.cxx:754 msgid "Send image..." msgstr "" #: src/widgets/FTextView.cxx:292 msgid "Insert text" msgstr "" #: src/widgets/FTextView.cxx:351 msgid "Save text as" msgstr "" #: src/widgets/FTextView.cxx:479 src/widgets/FTextView.cxx:643 #: src/widgets/flinput2.cxx:44 msgid "Copy" msgstr "" #: src/widgets/FTextView.cxx:482 msgid "Save as..." msgstr "" #: src/widgets/FTextView.cxx:483 src/widgets/FTextView.cxx:647 msgid "Word wrap" msgstr "" #: src/widgets/FTextView.cxx:642 src/widgets/flinput2.cxx:43 msgid "Cut" msgstr "" #: src/widgets/FTextView.cxx:644 src/widgets/flinput2.cxx:45 msgid "Paste" msgstr "" #: src/widgets/FTextView.cxx:646 msgid "Insert file..." msgstr "" #: src/widgets/flinput2.cxx:42 msgid "Undo" msgstr "" #: src/widgets/flinput2.cxx:46 src/logbook/lgbook.cxx:974 msgid "Delete" msgstr "" #: src/dialogs/confdialog.cxx:4928 msgid "Fldigi configuration" msgstr "" #: src/dialogs/confdialog.cxx:4938 src/dialogs/confdialog.cxx:10039 msgid "Operator information" msgstr "" #: src/dialogs/confdialog.cxx:4941 msgid "Station" msgstr "" #: src/dialogs/confdialog.cxx:4944 msgid "Callsign:" msgstr "" #: src/dialogs/confdialog.cxx:4945 msgid "Operators callsign" msgstr "" #: src/dialogs/confdialog.cxx:4958 msgid "Name:" msgstr "" #: src/dialogs/confdialog.cxx:4959 msgid "Operators name" msgstr "" #: src/dialogs/confdialog.cxx:4972 msgid "QTH:" msgstr "" #: src/dialogs/confdialog.cxx:4973 msgid "Operators QTH" msgstr "" #: src/dialogs/confdialog.cxx:4986 msgid "Locator:" msgstr "" #: src/dialogs/confdialog.cxx:4987 msgid "Maidenhead locator as in EM64qv" msgstr "" #: src/dialogs/confdialog.cxx:5002 msgid "Antenna:" msgstr "" #: src/dialogs/confdialog.cxx:5003 msgid "Short description of antenna" msgstr "" #: src/dialogs/confdialog.cxx:5016 msgid "Test Signal - Do NOT use with transmitter" msgstr "" #: src/dialogs/confdialog.cxx:5020 msgid "Noise on" msgstr "" #: src/dialogs/confdialog.cxx:5026 msgid "dB" msgstr "" #: src/dialogs/confdialog.cxx:5049 msgid "UI" msgstr "" #: src/dialogs/confdialog.cxx:5053 msgid "Browser" msgstr "" #: src/dialogs/confdialog.cxx:5056 msgid "Channels, first channel starts at waterfall lower limit" msgstr "" #: src/dialogs/confdialog.cxx:5057 msgid "Change # of psk viewer channels" msgstr "" #: src/dialogs/confdialog.cxx:5074 msgid "Inactivity timeout" msgstr "" #: src/dialogs/confdialog.cxx:5075 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" #: src/dialogs/confdialog.cxx:5091 msgid "Channel label" msgstr "" #: src/dialogs/confdialog.cxx:5092 msgid "Appearance of label on each channel" msgstr "" #: src/dialogs/confdialog.cxx:5103 msgid "Audio frequency" msgstr "" #: src/dialogs/confdialog.cxx:5104 msgid "Radio frequency" msgstr "" #: src/dialogs/confdialog.cxx:5104 msgid "Channel number" msgstr "" #: src/dialogs/confdialog.cxx:5109 src/dialogs/confdialog.cxx:6274 msgid "Font..." msgstr "" #: src/dialogs/confdialog.cxx:5110 msgid "select browser font" msgstr "" #: src/dialogs/confdialog.cxx:5113 msgid "Fixed Intervals" msgstr "" #: src/dialogs/confdialog.cxx:5114 msgid "Force channel spacing to even 100 Hz increments" msgstr "" #: src/dialogs/confdialog.cxx:5121 msgid "Continuous scrolling" msgstr "" #: src/dialogs/confdialog.cxx:5122 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" #: src/dialogs/confdialog.cxx:5127 msgid "Lowest freq on bottom of viewer" msgstr "" #: src/dialogs/confdialog.cxx:5128 msgid "Change positions of low to high channels" msgstr "" #: src/dialogs/confdialog.cxx:5133 msgid "Play back history when active channel selected" msgstr "" #: src/dialogs/confdialog.cxx:5134 msgid "Audio stream history decoded on selected signal" msgstr "" #: src/dialogs/confdialog.cxx:5139 msgid "Detection Level" msgstr "" #: src/dialogs/confdialog.cxx:5141 msgid "Backgnd" msgstr "" #: src/dialogs/confdialog.cxx:5142 msgid "Background color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:5147 msgid "Button" msgstr "" #: src/dialogs/confdialog.cxx:5148 msgid "Slider hilite color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:5155 msgid "Browser Line Colors" msgstr "" #: src/dialogs/confdialog.cxx:5157 msgid "HiLite 1" msgstr "" #: src/dialogs/confdialog.cxx:5158 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "" #: src/dialogs/confdialog.cxx:5163 msgid "HiLite 2" msgstr "" #: src/dialogs/confdialog.cxx:5164 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "" #: src/dialogs/confdialog.cxx:5169 msgid "Even" msgstr "" #: src/dialogs/confdialog.cxx:5170 msgid "Even lines" msgstr "" #: src/dialogs/confdialog.cxx:5175 msgid "Odd" msgstr "" #: src/dialogs/confdialog.cxx:5176 msgid "Odd lines" msgstr "" #: src/dialogs/confdialog.cxx:5182 msgid "Select line" msgstr "" #: src/dialogs/confdialog.cxx:5195 msgid "Exchanges" msgstr "" #: src/dialogs/confdialog.cxx:5198 msgid "Send:" msgstr "" #: src/dialogs/confdialog.cxx:5200 src/logbook/lgbook.cxx:542 #: src/logbook/lgbook.cxx:900 src/logbook/lgbook.cxx:1115 msgid "Exchange Out" msgstr "" #: src/dialogs/confdialog.cxx:5201 msgid "free form exchange" msgstr "" #: src/dialogs/confdialog.cxx:5215 msgid "RST always 599" msgstr "" #: src/dialogs/confdialog.cxx:5216 msgid "Force RST in/out to 599" msgstr "" #: src/dialogs/confdialog.cxx:5221 msgid "Send CW cut numbers" msgstr "" #: src/dialogs/confdialog.cxx:5222 msgid "0 = T; 9 = N" msgstr "" #: src/dialogs/confdialog.cxx:5232 msgid "Use leading zeros" msgstr "" #: src/dialogs/confdialog.cxx:5233 msgid "Insert leading zeros into Xmtd serial number" msgstr "" #: src/dialogs/confdialog.cxx:5238 msgid "Start" msgstr "" #: src/dialogs/confdialog.cxx:5239 msgid "Starting number" msgstr "" #: src/dialogs/confdialog.cxx:5254 msgid "Digits" msgstr "" #: src/dialogs/confdialog.cxx:5255 msgid "Number of digits in serial number" msgstr "" #: src/dialogs/confdialog.cxx:5271 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "" #: src/dialogs/confdialog.cxx:5272 msgid "Initialize the QSO logging fields" msgstr "" #: src/dialogs/confdialog.cxx:5277 msgid "Duplicate check, CALL plus" msgstr "" #: src/dialogs/confdialog.cxx:5280 msgid "On/Off" msgstr "" #: src/dialogs/confdialog.cxx:5281 msgid "Check for duplicates" msgstr "" #: src/dialogs/confdialog.cxx:5286 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:471 msgid "Band" msgstr "" #: src/dialogs/confdialog.cxx:5287 msgid "Bands must match" msgstr "" #: src/dialogs/confdialog.cxx:5292 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:474 src/logbook/lgbook.cxx:682 #: src/logbook/lgbook.cxx:1028 src/logbook/lgbook.cxx:1083 msgid "Mode" msgstr "" #: src/dialogs/confdialog.cxx:5293 msgid "Mode must match" msgstr "" #: src/dialogs/confdialog.cxx:5299 msgid "State must match" msgstr "" #: src/dialogs/confdialog.cxx:5305 msgid "free form 1 must match" msgstr "" #: src/dialogs/confdialog.cxx:5310 msgid "Time span over" msgstr "" #: src/dialogs/confdialog.cxx:5311 msgid "QSO must not occur within a time period of" msgstr "" #: src/dialogs/confdialog.cxx:5316 msgid "minutes" msgstr "" #: src/dialogs/confdialog.cxx:5317 msgid "Enter time span in minutes" msgstr "" #: src/dialogs/confdialog.cxx:5333 msgid "Dup Color" msgstr "" #: src/dialogs/confdialog.cxx:5334 msgid "Left click to select dup color" msgstr "" #: src/dialogs/confdialog.cxx:5346 src/dialogs/confdialog.cxx:6497 #: src/dialogs/confdialog.cxx:7508 src/dialogs/confdialog.cxx:9403 msgid "General" msgstr "" #: src/dialogs/confdialog.cxx:5350 msgid "Show tooltips" msgstr "" #: src/dialogs/confdialog.cxx:5351 msgid "Enable / disable tooltips" msgstr "" #: src/dialogs/confdialog.cxx:5357 msgid "Show menu icons" msgstr "" #: src/dialogs/confdialog.cxx:5358 msgid "Enable / disable icons on menus" msgstr "" #: src/dialogs/confdialog.cxx:5363 msgid "UI scheme" msgstr "" #: src/dialogs/confdialog.cxx:5364 msgid "Change application look and feel" msgstr "" #: src/dialogs/confdialog.cxx:5382 msgid "Visible modes" msgstr "" #: src/dialogs/confdialog.cxx:5383 msgid "Select modes for menu access" msgstr "" #: src/dialogs/confdialog.cxx:5386 msgid "UI language" msgstr "" #: src/dialogs/confdialog.cxx:5387 src/dialogs/confdialog.cxx:6403 msgid "Changes take effect on next program startup" msgstr "" #: src/dialogs/confdialog.cxx:5406 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "" #: src/dialogs/confdialog.cxx:5416 msgid "Transmit all text in lower case" msgstr "" #: src/dialogs/confdialog.cxx:5423 msgid "Exit prompts" msgstr "" #: src/dialogs/confdialog.cxx:5426 msgid "Prompt to save Configuration" msgstr "" #: src/dialogs/confdialog.cxx:5431 msgid "Prompt to save macro file" msgstr "" #: src/dialogs/confdialog.cxx:5432 src/dialogs/confdialog.cxx:5689 msgid "Write current macro set on program exit" msgstr "" #: src/dialogs/confdialog.cxx:5437 msgid "Prompt to save log" msgstr "" #: src/dialogs/confdialog.cxx:5438 src/dialogs/confdialog.cxx:5491 msgid "Bug me about saving log entries" msgstr "" #: src/dialogs/confdialog.cxx:5443 msgid "" "Exit prompts active only when File/Exit menu item selected.\n" "Not active if window decoration close button pressed." msgstr "" #: src/dialogs/confdialog.cxx:5448 msgid "Confirm exit" msgstr "" #: src/dialogs/confdialog.cxx:5455 msgid "Check for updates" msgstr "" #: src/dialogs/confdialog.cxx:5458 msgid "Check for updates when starting program" msgstr "" #: src/dialogs/confdialog.cxx:5467 msgid "Logging" msgstr "" #: src/dialogs/confdialog.cxx:5469 msgid "Client/Server Logbook" msgstr "" #: src/dialogs/confdialog.cxx:5472 msgid "Address:" msgstr "" #: src/dialogs/confdialog.cxx:5473 msgid "Enter URL address of server" msgstr "" #: src/dialogs/confdialog.cxx:5477 src/dialogs/confdialog.cxx:9460 msgid "Port:" msgstr "" #: src/dialogs/confdialog.cxx:5478 msgid "Enter Port # assigned to server" msgstr "" #: src/dialogs/confdialog.cxx:5482 msgid "Reconnect" msgstr "" #: src/dialogs/confdialog.cxx:5487 msgid "QSO logging" msgstr "" #: src/dialogs/confdialog.cxx:5490 msgid "Prompt to save log on exit" msgstr "" #: src/dialogs/confdialog.cxx:5496 msgid "Clear on save" msgstr "" #: src/dialogs/confdialog.cxx:5497 msgid "Clear log entries after saving or using macro " msgstr "" #: src/dialogs/confdialog.cxx:5502 msgid "Convert callsign to upper case" msgstr "" #: src/dialogs/confdialog.cxx:5503 msgid "Force callsign field to UPPERCASE" msgstr "" #: src/dialogs/confdialog.cxx:5508 msgid "Auto-fill Country and Azimuth" msgstr "" #: src/dialogs/confdialog.cxx:5509 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "" #: src/dialogs/confdialog.cxx:5514 msgid "Sort by Date/Time OFF" msgstr "" #: src/dialogs/confdialog.cxx:5515 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" #: src/dialogs/confdialog.cxx:5520 msgid "Date time ON == OFF" msgstr "" #: src/dialogs/confdialog.cxx:5521 msgid "Force date/time ON == date/time OFF" msgstr "" #: src/dialogs/confdialog.cxx:5526 msgid "Default RST in to 599" msgstr "" #: src/dialogs/confdialog.cxx:5527 msgid "Clear log controls sets RST in to 599" msgstr "" #: src/dialogs/confdialog.cxx:5532 msgid "Default RST out to 599" msgstr "" #: src/dialogs/confdialog.cxx:5533 msgid "Clear log controls sets RST out to 599" msgstr "" #: src/dialogs/confdialog.cxx:5538 msgid "cty.dat pathname" msgstr "" #: src/dialogs/confdialog.cxx:5539 msgid "Enter full path-filename for cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:5552 msgid "Browse" msgstr "" #: src/dialogs/confdialog.cxx:5553 msgid "Locate cty.dat file" msgstr "" #: src/dialogs/confdialog.cxx:5556 src/dialogs/confdialog.cxx:5914 #: src/dialogs/confdialog.cxx:5934 src/dialogs/confdialog.cxx:6648 msgid "Default" msgstr "" #: src/dialogs/confdialog.cxx:5557 msgid "Restore cty.dat default folder" msgstr "" #: src/dialogs/confdialog.cxx:5560 msgid "Reload" msgstr "" #: src/dialogs/confdialog.cxx:5561 msgid "Reload cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:5564 msgid "Transmit Power" msgstr "" #: src/dialogs/confdialog.cxx:5565 msgid "Tx power used for logbook entries" msgstr "" #: src/dialogs/confdialog.cxx:5581 msgid "Rx Text Capture" msgstr "" #: src/dialogs/confdialog.cxx:5584 msgid "Double-click to capture" msgstr "" #: src/dialogs/confdialog.cxx:5585 msgid "Enable if you cannot use the middle mouse button" msgstr "" #: src/dialogs/confdialog.cxx:5590 msgid "callsign tooltips in received text" msgstr "" #: src/dialogs/confdialog.cxx:5591 msgid "Popup info after a 2 second hover on a callsign" msgstr "" #: src/dialogs/confdialog.cxx:5596 msgid "Word delimiters" msgstr "" #: src/dialogs/confdialog.cxx:5597 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" #: src/dialogs/confdialog.cxx:5621 msgid "Mouse wheel active on macro buttons" msgstr "" #: src/dialogs/confdialog.cxx:5622 msgid "enable mouse wheel control of macro bar" msgstr "" #: src/dialogs/confdialog.cxx:5629 msgid "Number and position of macro bars" msgstr "" #: src/dialogs/confdialog.cxx:5632 msgid "One bar (above waterfall)" msgstr "" #: src/dialogs/confdialog.cxx:5637 msgid "One bar (below waterfall)" msgstr "" #: src/dialogs/confdialog.cxx:5642 msgid "Two bars (scheme 1)" msgstr "" #: src/dialogs/confdialog.cxx:5647 msgid "Two bars (scheme 2)" msgstr "" #: src/dialogs/confdialog.cxx:5652 msgid "Two bars (scheme 3)" msgstr "" #: src/dialogs/confdialog.cxx:5657 msgid "Two bars (scheme 4)" msgstr "" #: src/dialogs/confdialog.cxx:5662 msgid "Two bars (scheme 5)" msgstr "" #: src/dialogs/confdialog.cxx:5667 msgid "Two bars (scheme 6)" msgstr "" #: src/dialogs/confdialog.cxx:5676 msgid "Load last used macro file on startup" msgstr "" #: src/dialogs/confdialog.cxx:5677 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" #: src/dialogs/confdialog.cxx:5682 msgid "Display macro filename on startup" msgstr "" #: src/dialogs/confdialog.cxx:5683 msgid "The filename is written to the RX text area" msgstr "" #: src/dialogs/confdialog.cxx:5688 msgid "Prompt to save macro file when closing" msgstr "" #: src/dialogs/confdialog.cxx:5698 msgid "WF Ctrls" msgstr "" #: src/dialogs/confdialog.cxx:5702 msgid "Enable check box to show each respective operator control" msgstr "" #: src/dialogs/confdialog.cxx:5712 msgid "WF Magnification" msgstr "" #: src/dialogs/confdialog.cxx:5718 msgid "WF carrier" msgstr "" #: src/dialogs/confdialog.cxx:5724 msgid "WF Shift Controls" msgstr "" #: src/dialogs/confdialog.cxx:5730 msgid "WF ref level" msgstr "" #: src/dialogs/confdialog.cxx:5736 msgid "WF drop rate" msgstr "" #: src/dialogs/confdialog.cxx:5742 msgid "WF amp span" msgstr "" #: src/dialogs/confdialog.cxx:5748 msgid "WF Store" msgstr "" #: src/dialogs/confdialog.cxx:5754 msgid "WF mode" msgstr "" #: src/dialogs/confdialog.cxx:5760 msgid "QSY" msgstr "" #: src/dialogs/confdialog.cxx:5766 msgid "XMT lock" msgstr "" #: src/dialogs/confdialog.cxx:5772 msgid "Enable all" msgstr "" #: src/dialogs/confdialog.cxx:5775 msgid "Disable all" msgstr "" #: src/dialogs/confdialog.cxx:5782 msgid "Colors/Fonts" msgstr "" #: src/dialogs/confdialog.cxx:5785 msgid "Rx/Tx" msgstr "" #: src/dialogs/confdialog.cxx:5786 msgid "Rx/Tx Character set" msgstr "" #: src/dialogs/confdialog.cxx:5787 msgid "Select Rx/Tx Character Set" msgstr "" #: src/dialogs/confdialog.cxx:5807 msgid "Rx bkgnd" msgstr "" #: src/dialogs/confdialog.cxx:5810 msgid "Tx bkgnd" msgstr "" #: src/dialogs/confdialog.cxx:5819 msgid "Rx font" msgstr "" #: src/dialogs/confdialog.cxx:5822 msgid "Tx font" msgstr "" #: src/dialogs/confdialog.cxx:5825 msgid "Text Highlighting" msgstr "" #: src/dialogs/confdialog.cxx:5828 msgid "XMIT" msgstr "" #: src/dialogs/confdialog.cxx:5829 msgid "Sent chars in Rx/Tx pane" msgstr "" #: src/dialogs/confdialog.cxx:5834 msgid "CTRL" msgstr "" #: src/dialogs/confdialog.cxx:5835 msgid "Control chars in Rx/Tx pane" msgstr "" #: src/dialogs/confdialog.cxx:5840 msgid "SKIP" msgstr "" #: src/dialogs/confdialog.cxx:5841 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" #: src/dialogs/confdialog.cxx:5846 msgid "ALTR" msgstr "" #: src/dialogs/confdialog.cxx:5847 msgid "Alternate character color in Rx panelr" msgstr "" #: src/dialogs/confdialog.cxx:5852 msgid "SEL" msgstr "" #: src/dialogs/confdialog.cxx:5853 msgid "Selection background color in Rx Tx panels" msgstr "" #: src/dialogs/confdialog.cxx:5858 src/dialogs/confdialog.cxx:5981 msgid "System" msgstr "" #: src/dialogs/confdialog.cxx:5861 src/dialogs/confdialog.cxx:5971 #: src/logbook/lgbook.cxx:563 msgid "Defaults" msgstr "" #: src/dialogs/confdialog.cxx:5868 msgid "Frq Disp" msgstr "" #: src/dialogs/confdialog.cxx:5872 msgid "14070.150" msgstr "" #: src/dialogs/confdialog.cxx:5881 src/dialogs/confdialog.cxx:5911 #: src/dialogs/confdialog.cxx:5931 msgid "Font" msgstr "" #: src/dialogs/confdialog.cxx:5884 src/dialogs/confdialog.cxx:5908 #: src/dialogs/confdialog.cxx:5928 msgid "Bg Color" msgstr "" #: src/dialogs/confdialog.cxx:5887 msgid "Digit Color" msgstr "" #: src/dialogs/confdialog.cxx:5890 msgid "Sys Colors" msgstr "" #: src/dialogs/confdialog.cxx:5897 msgid "Log" msgstr "" #: src/dialogs/confdialog.cxx:5899 msgid "Logging Panel Controls" msgstr "" #: src/dialogs/confdialog.cxx:5919 msgid "Logbook Dialog" msgstr "" #: src/dialogs/confdialog.cxx:5941 msgid "F_keys" msgstr "" #: src/dialogs/confdialog.cxx:5943 msgid "Use colored buttons" msgstr "" #: src/dialogs/confdialog.cxx:5948 msgid "Group 1" msgstr "" #: src/dialogs/confdialog.cxx:5949 msgid "Background color for Function key group 1" msgstr "" #: src/dialogs/confdialog.cxx:5954 msgid "Group 2" msgstr "" #: src/dialogs/confdialog.cxx:5955 msgid "Background color for Function key group 2" msgstr "" #: src/dialogs/confdialog.cxx:5960 msgid "Group 3" msgstr "" #: src/dialogs/confdialog.cxx:5961 msgid "Background color for Function key group 3" msgstr "" #: src/dialogs/confdialog.cxx:5966 msgid "Label text" msgstr "" #: src/dialogs/confdialog.cxx:5976 msgid "Tabs" msgstr "" #: src/dialogs/confdialog.cxx:5978 msgid "Tab Color" msgstr "" #: src/dialogs/confdialog.cxx:5986 msgid "Buttons" msgstr "" #: src/dialogs/confdialog.cxx:5988 msgid "Spot" msgstr "" #: src/dialogs/confdialog.cxx:5991 msgid "RxID" msgstr "" #: src/dialogs/confdialog.cxx:5994 msgid "TxID" msgstr "" #: src/dialogs/confdialog.cxx:5997 msgid "Tune" msgstr "" #: src/dialogs/confdialog.cxx:6000 msgid "Lk" msgstr "" #: src/dialogs/confdialog.cxx:6003 msgid "Rev" msgstr "" #: src/dialogs/confdialog.cxx:6006 msgid "T/R" msgstr "" #: src/dialogs/confdialog.cxx:6009 msgid "AFC" msgstr "" #: src/dialogs/confdialog.cxx:6012 msgid "SQL-1" msgstr "" #: src/dialogs/confdialog.cxx:6015 msgid "SQL-2" msgstr "" #: src/dialogs/confdialog.cxx:6061 msgid "Lighted button enabled colors" msgstr "" #: src/dialogs/confdialog.cxx:6066 msgid "SigLvl" msgstr "" #: src/dialogs/confdialog.cxx:6068 src/dialogs/confdialog.cxx:9023 msgid "Low" msgstr "" #: src/dialogs/confdialog.cxx:6076 src/dialogs/confdialog.cxx:9023 msgid "High" msgstr "" #: src/dialogs/confdialog.cxx:6084 msgid "Normal" msgstr "" #: src/dialogs/confdialog.cxx:6092 msgid "Over" msgstr "" #: src/dialogs/confdialog.cxx:6100 msgid "Signal Level Colors" msgstr "" #: src/dialogs/confdialog.cxx:6117 msgid "Display" msgstr "" #: src/dialogs/confdialog.cxx:6118 msgid "Colors and cursors" msgstr "" #: src/dialogs/confdialog.cxx:6121 msgid "aa" msgstr "" #: src/dialogs/confdialog.cxx:6136 src/dialogs/confdialog.cxx:6140 #: src/dialogs/confdialog.cxx:6144 src/dialogs/confdialog.cxx:6148 #: src/dialogs/confdialog.cxx:6152 src/dialogs/confdialog.cxx:6156 #: src/dialogs/confdialog.cxx:6160 src/dialogs/confdialog.cxx:6164 #: src/dialogs/confdialog.cxx:6168 src/dialogs/confdialog.cxx:6189 #: src/dialogs/confdialog.cxx:6213 src/dialogs/confdialog.cxx:6237 #: src/dialogs/confdialog.cxx:6255 msgid "Change color" msgstr "" #: src/dialogs/confdialog.cxx:6171 msgid "Load..." msgstr "" #: src/dialogs/confdialog.cxx:6172 msgid "Load a new palette" msgstr "" #: src/dialogs/confdialog.cxx:6175 msgid "Save..." msgstr "" #: src/dialogs/confdialog.cxx:6176 msgid "Save this palette" msgstr "" #: src/dialogs/confdialog.cxx:6179 src/dialogs/confdialog.cxx:7315 #: src/dialogs/confdialog.cxx:7411 msgid "Bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:6182 src/dialogs/confdialog.cxx:6206 #: src/dialogs/confdialog.cxx:6230 msgid "ON" msgstr "" #: src/dialogs/confdialog.cxx:6183 msgid "Show cursor with bandwidth lines" msgstr "" #: src/dialogs/confdialog.cxx:6188 src/dialogs/confdialog.cxx:6212 #: src/dialogs/confdialog.cxx:6236 src/dialogs/confdialog.cxx:6254 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "" #: src/dialogs/confdialog.cxx:6195 src/dialogs/confdialog.cxx:6219 #: src/dialogs/confdialog.cxx:6243 msgid "Wide" msgstr "" #: src/dialogs/confdialog.cxx:6196 src/dialogs/confdialog.cxx:6220 #: src/dialogs/confdialog.cxx:6231 src/dialogs/confdialog.cxx:6244 msgid "Show bandwidth tracks on waterfall" msgstr "" #: src/dialogs/confdialog.cxx:6203 msgid "Center line" msgstr "" #: src/dialogs/confdialog.cxx:6207 msgid "Show cursor with center line" msgstr "" #: src/dialogs/confdialog.cxx:6227 msgid "Signal tracks" msgstr "" #: src/dialogs/confdialog.cxx:6251 msgid "Notch" msgstr "" #: src/dialogs/confdialog.cxx:6265 msgid "Frequency scale" msgstr "" #: src/dialogs/confdialog.cxx:6268 msgid "Always show audio frequencies" msgstr "" #: src/dialogs/confdialog.cxx:6269 msgid "Audio or RF frequencies on waterfall scale" msgstr "" #: src/dialogs/confdialog.cxx:6275 msgid "Select waterfall scale font" msgstr "" #: src/dialogs/confdialog.cxx:6280 msgid "Transmit signal" msgstr "" #: src/dialogs/confdialog.cxx:6283 msgid "Monitor transmitted signal" msgstr "" #: src/dialogs/confdialog.cxx:6284 msgid "Show transmit signal on waterfall" msgstr "" #: src/dialogs/confdialog.cxx:6289 msgid "Signal level" msgstr "" #: src/dialogs/confdialog.cxx:6290 msgid "Set level for good viewing" msgstr "" #: src/dialogs/confdialog.cxx:6312 msgid "FFT Processing" msgstr "" #: src/dialogs/confdialog.cxx:6316 src/dialogs/confdialog.cxx:6668 msgid "Lower limit" msgstr "" #: src/dialogs/confdialog.cxx:6317 msgid "Low frequency limit in Hz" msgstr "" #: src/dialogs/confdialog.cxx:6336 msgid "FFT averaging" msgstr "" #: src/dialogs/confdialog.cxx:6337 msgid "Use averaging to decrease waterfall noise" msgstr "" #: src/dialogs/confdialog.cxx:6342 msgid "FFT prefilter window function" msgstr "" #: src/dialogs/confdialog.cxx:6343 msgid "Select the type of FFT prefilter" msgstr "" #: src/dialogs/confdialog.cxx:6354 msgid "Rectangular" msgstr "" #: src/dialogs/confdialog.cxx:6356 msgid "Triangular" msgstr "" #: src/dialogs/confdialog.cxx:6361 src/dialogs/confdialog.cxx:6680 msgid "Upper limit" msgstr "" #: src/dialogs/confdialog.cxx:6362 msgid "High frequency limit in Hz" msgstr "" #: src/dialogs/confdialog.cxx:6381 msgid "Latency" msgstr "" #: src/dialogs/confdialog.cxx:6382 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:6404 msgid "Show me more or less waterfall" msgstr "" #: src/dialogs/confdialog.cxx:6407 msgid "Waterfall height in pixels" msgstr "" #: src/dialogs/confdialog.cxx:6408 msgid "CPU usage increases with waterfall height" msgstr "" #: src/dialogs/confdialog.cxx:6431 msgid "Mouse" msgstr "" #: src/dialogs/confdialog.cxx:6435 msgid "Left or right click always replays audio history" msgstr "" #: src/dialogs/confdialog.cxx:6436 msgid "Replay trackline audio" msgstr "" #: src/dialogs/confdialog.cxx:6441 msgid "Dragging on the waterfall scale changes frequency" msgstr "" #: src/dialogs/confdialog.cxx:6442 msgid "Enable drag cursor on waterfall scale" msgstr "" #: src/dialogs/confdialog.cxx:6447 msgid "Insert text on single left click" msgstr "" #: src/dialogs/confdialog.cxx:6448 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" #: src/dialogs/confdialog.cxx:6454 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:6468 msgid "Wheel action" msgstr "" #: src/dialogs/confdialog.cxx:6469 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" #: src/dialogs/confdialog.cxx:6494 src/dialogs/confdialog.cxx:9177 #: src/dialogs/confdialog.cxx:9492 msgid "CW" msgstr "" #: src/dialogs/confdialog.cxx:6502 msgid "Filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:6503 msgid "CW dsp filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:6523 msgid "Rx WPM" msgstr "" #: src/dialogs/confdialog.cxx:6529 msgid "Tracked CW speed in WPM" msgstr "" #: src/dialogs/confdialog.cxx:6534 msgid "SOM decoding" msgstr "" #: src/dialogs/confdialog.cxx:6535 msgid "Self Organizing Mapping" msgstr "" #: src/dialogs/confdialog.cxx:6541 msgid "Lower" msgstr "" #: src/dialogs/confdialog.cxx:6542 msgid "Detector low threshold" msgstr "" #: src/dialogs/confdialog.cxx:6561 msgid "Upper" msgstr "" #: src/dialogs/confdialog.cxx:6562 msgid "Detector high threshold" msgstr "" #: src/dialogs/confdialog.cxx:6581 msgid "Matched Filter" msgstr "" #: src/dialogs/confdialog.cxx:6582 msgid "Matched Filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:6588 msgid "FFT filter" msgstr "" #: src/dialogs/confdialog.cxx:6589 msgid "FFT / FIR filter" msgstr "" #: src/dialogs/confdialog.cxx:6595 msgid "Tracking" msgstr "" #: src/dialogs/confdialog.cxx:6596 msgid "Automatic Rx speed tracking" msgstr "" #: src/dialogs/confdialog.cxx:6602 msgid "Range, WPM" msgstr "" #: src/dialogs/confdialog.cxx:6603 msgid "Range +/- wpm" msgstr "" #: src/dialogs/confdialog.cxx:6627 msgid "TX WPM" msgstr "" #: src/dialogs/confdialog.cxx:6628 src/dialogs/confdialog.cxx:6693 msgid "My transmit CW WPM" msgstr "" #: src/dialogs/confdialog.cxx:6649 msgid "The default CW speed" msgstr "" #: src/dialogs/confdialog.cxx:6669 msgid "No slower than this" msgstr "" #: src/dialogs/confdialog.cxx:6681 msgid "No faster than this" msgstr "" #: src/dialogs/confdialog.cxx:6692 msgid "F-WPM" msgstr "" #: src/dialogs/confdialog.cxx:6713 msgid "Use Farnsworth timing" msgstr "" #: src/dialogs/confdialog.cxx:6722 msgid "Timing and QSK" msgstr "" #: src/dialogs/confdialog.cxx:6725 msgid "Timing" msgstr "" #: src/dialogs/confdialog.cxx:6728 msgid "Weight (%)" msgstr "" #: src/dialogs/confdialog.cxx:6729 msgid "Dot to dot-space ratio" msgstr "" #: src/dialogs/confdialog.cxx:6748 src/dialogs/confdialog.cxx:6749 msgid "Dash to dot ratio" msgstr "" #: src/dialogs/confdialog.cxx:6767 msgid "Edge timing" msgstr "" #: src/dialogs/confdialog.cxx:6768 msgid "Leading and Trailing edge risetimes (msec)" msgstr "" #: src/dialogs/confdialog.cxx:6786 msgid "Edge shape" msgstr "" #: src/dialogs/confdialog.cxx:6787 msgid "Raised cosine = Hanning" msgstr "" #: src/dialogs/confdialog.cxx:6803 msgid "Edge decreases pulse width" msgstr "" #: src/dialogs/confdialog.cxx:6804 msgid "Weight decreases with increasing edge timing" msgstr "" #: src/dialogs/confdialog.cxx:6811 msgid "QSK" msgstr "" #: src/dialogs/confdialog.cxx:6814 msgid "QSK on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:6815 msgid "Generate square wave signal on right channel" msgstr "" #: src/dialogs/confdialog.cxx:6820 msgid "Pre-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:6821 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:6839 msgid "Post-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:6840 msgid "Msec post-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:6858 msgid "Send continuously" msgstr "" #: src/dialogs/confdialog.cxx:6859 msgid "Send a continuous stream of test characters" msgstr "" #: src/dialogs/confdialog.cxx:6864 msgid "Test char" msgstr "" #: src/dialogs/confdialog.cxx:6865 msgid "Test character for QSK adjustment" msgstr "" #: src/dialogs/confdialog.cxx:6885 msgid "Prosigns" msgstr "" #: src/dialogs/confdialog.cxx:6890 msgid "Use '(' paren not KN" msgstr "" #: src/dialogs/confdialog.cxx:6897 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6914 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6931 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6948 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6964 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6981 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6998 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7015 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7032 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7055 msgid "Dom" msgstr "" #: src/dialogs/confdialog.cxx:7059 src/dialogs/confdialog.cxx:7902 msgid "Secondary Text" msgstr "" #: src/dialogs/confdialog.cxx:7060 src/dialogs/confdialog.cxx:7903 msgid "Text to send during keyboard idle times" msgstr "" #: src/dialogs/confdialog.cxx:7074 src/dialogs/confdialog.cxx:7917 msgid "Filtering" msgstr "" #: src/dialogs/confdialog.cxx:7075 msgid "Use DSP filter before decoder" msgstr "" #: src/dialogs/confdialog.cxx:7081 src/dialogs/confdialog.cxx:7924 msgid "Filter bandwidth factor" msgstr "" #: src/dialogs/confdialog.cxx:7082 src/dialogs/confdialog.cxx:7925 msgid "Filter bandwidth relative to signal width" msgstr "" #: src/dialogs/confdialog.cxx:7100 msgid "FEC" msgstr "" #: src/dialogs/confdialog.cxx:7101 msgid "Enable MultiPSK-compatible FEC" msgstr "" #: src/dialogs/confdialog.cxx:7106 src/dialogs/confdialog.cxx:7943 msgid "CWI threshold" msgstr "" #: src/dialogs/confdialog.cxx:7107 src/dialogs/confdialog.cxx:7944 msgid "CWI detection and suppression" msgstr "" #: src/dialogs/confdialog.cxx:7123 src/dialogs/confdialog.cxx:7979 msgid "Paths (hidden)" msgstr "" #: src/dialogs/confdialog.cxx:7147 msgid "Feld" msgstr "" #: src/dialogs/confdialog.cxx:7151 msgid "Transmit font" msgstr "" #: src/dialogs/confdialog.cxx:7152 msgid "Select TX raster font" msgstr "" #: src/dialogs/confdialog.cxx:7168 msgid "Reverse video" msgstr "" #: src/dialogs/confdialog.cxx:7169 msgid "Display RX in reverse video" msgstr "" #: src/dialogs/confdialog.cxx:7174 msgid "Transmit width" msgstr "" #: src/dialogs/confdialog.cxx:7175 msgid "# of multiple scans / character line" msgstr "" #: src/dialogs/confdialog.cxx:7190 msgid "Halve receive width" msgstr "" #: src/dialogs/confdialog.cxx:7191 msgid "Compress Rx in time" msgstr "" #: src/dialogs/confdialog.cxx:7196 msgid "Pulse shape" msgstr "" #: src/dialogs/confdialog.cxx:7197 msgid "Raised cosine pulse shape factor" msgstr "" #: src/dialogs/confdialog.cxx:7208 msgid "Slow (4 msec)" msgstr "" #: src/dialogs/confdialog.cxx:7209 msgid "Fast (2 msec)" msgstr "" #: src/dialogs/confdialog.cxx:7214 msgid "Receive filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:7215 msgid "Adjust the DSP bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:7235 msgid "Transmit periods (.) when idle" msgstr "" #: src/dialogs/confdialog.cxx:7236 msgid "Transmits a diddle dot when no keyboard activity" msgstr "" #: src/dialogs/confdialog.cxx:7242 msgid "2x Xmt Width (hidden)" msgstr "" #: src/dialogs/confdialog.cxx:7252 msgid "MT-63" msgstr "" #: src/dialogs/confdialog.cxx:7257 src/dialogs/confdialog.cxx:7398 msgid "8-bit extended characters (UTF-8)" msgstr "" #: src/dialogs/confdialog.cxx:7258 msgid "Enable this for UTF-8 characters" msgstr "" #: src/dialogs/confdialog.cxx:7264 msgid "Long receive integration" msgstr "" #: src/dialogs/confdialog.cxx:7265 msgid "Enable for very weak signals" msgstr "" #: src/dialogs/confdialog.cxx:7275 msgid "Transmit lower start tone" msgstr "" #: src/dialogs/confdialog.cxx:7280 msgid "Transmit upper start tone" msgstr "" #: src/dialogs/confdialog.cxx:7286 msgid "Tone Duration (secs)" msgstr "" #: src/dialogs/confdialog.cxx:7302 msgid "Allow manual tuning" msgstr "" #: src/dialogs/confdialog.cxx:7311 msgid "Olivia" msgstr "" #: src/dialogs/confdialog.cxx:7316 src/dialogs/confdialog.cxx:7412 msgid "Select bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:7332 src/dialogs/confdialog.cxx:7428 msgid "Tones" msgstr "" #: src/dialogs/confdialog.cxx:7333 src/dialogs/confdialog.cxx:7429 msgid "Select number of tones" msgstr "" #: src/dialogs/confdialog.cxx:7349 src/dialogs/confdialog.cxx:7445 msgid "Receive synchronizer" msgstr "" #: src/dialogs/confdialog.cxx:7352 src/dialogs/confdialog.cxx:7448 msgid "Tune margin (tone frequency spacing)" msgstr "" #: src/dialogs/confdialog.cxx:7353 src/dialogs/confdialog.cxx:7372 #: src/dialogs/confdialog.cxx:7449 src/dialogs/confdialog.cxx:7468 msgid "Change ONLY to experiment" msgstr "" #: src/dialogs/confdialog.cxx:7371 src/dialogs/confdialog.cxx:7467 msgid "Integration period (FEC blocks)" msgstr "" #: src/dialogs/confdialog.cxx:7390 src/dialogs/confdialog.cxx:7486 msgid "Reset FEC blocks when changing BW or Tones" msgstr "" #: src/dialogs/confdialog.cxx:7391 src/dialogs/confdialog.cxx:7399 #: src/dialogs/confdialog.cxx:7487 msgid "Enable this for UTF-8 character transmission" msgstr "" #: src/dialogs/confdialog.cxx:7407 msgid "Cont'" msgstr "" #: src/dialogs/confdialog.cxx:7494 msgid "8-bit extended characters" msgstr "" #: src/dialogs/confdialog.cxx:7495 msgid "Enable this for Latin-1 accented characters" msgstr "" #: src/dialogs/confdialog.cxx:7504 msgid "PSK" msgstr "" #: src/dialogs/confdialog.cxx:7510 msgid "AFC behavior" msgstr "" #: src/dialogs/confdialog.cxx:7513 msgid "Acquisition search range (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:7514 msgid "Capture signals within this frequency range" msgstr "" #: src/dialogs/confdialog.cxx:7533 src/dialogs/confdialog.cxx:9354 msgid "Acquisition S/N (dB)" msgstr "" #: src/dialogs/confdialog.cxx:7534 src/dialogs/confdialog.cxx:9355 msgid "Capture signals over this threshold" msgstr "" #: src/dialogs/confdialog.cxx:7555 msgid "S/N and IMD behavior" msgstr "" #: src/dialogs/confdialog.cxx:7558 msgid "after" msgstr "" #: src/dialogs/confdialog.cxx:7559 msgid "Behavior of s/n imd" msgstr "" #: src/dialogs/confdialog.cxx:7570 msgid "Dim" msgstr "" #: src/dialogs/confdialog.cxx:7575 msgid "seconds" msgstr "" #: src/dialogs/confdialog.cxx:7576 msgid "Will occur after this time in seconds" msgstr "" #: src/dialogs/confdialog.cxx:7596 msgid "Multi-Channel Signal Processing" msgstr "" #: src/dialogs/confdialog.cxx:7599 msgid "Multi-channel detector" msgstr "" #: src/dialogs/confdialog.cxx:7604 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "" #: src/dialogs/confdialog.cxx:7615 src/dialogs/confdialog.cxx:9511 msgid "RTTY" msgstr "" #: src/dialogs/confdialog.cxx:7619 msgid "Rx" msgstr "" #: src/dialogs/confdialog.cxx:7624 msgid "AFC speed" msgstr "" #: src/dialogs/confdialog.cxx:7625 msgid "AFC tracking speed" msgstr "" #: src/dialogs/confdialog.cxx:7641 msgid "RX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:7642 msgid "Revert to unshifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:7647 msgid "Filter Shape Factor" msgstr "" #: src/dialogs/confdialog.cxx:7648 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" #: src/dialogs/confdialog.cxx:7660 msgid "Decode (CWI suppression)" msgstr "" #: src/dialogs/confdialog.cxx:7663 msgid "Mark-Space" msgstr "" #: src/dialogs/confdialog.cxx:7668 msgid "Mark only" msgstr "" #: src/dialogs/confdialog.cxx:7673 msgid "Space only" msgstr "" #: src/dialogs/confdialog.cxx:7680 msgid "RTTY Scope Display" msgstr "" #: src/dialogs/confdialog.cxx:7683 msgid "Use cross hair scope" msgstr "" #: src/dialogs/confdialog.cxx:7684 msgid "Default to cross hair digiscope" msgstr "" #: src/dialogs/confdialog.cxx:7689 msgid "XY - classic scope" msgstr "" #: src/dialogs/confdialog.cxx:7690 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" #: src/dialogs/confdialog.cxx:7697 msgid "Log RTTY frequency" msgstr "" #: src/dialogs/confdialog.cxx:7700 msgid "Use MARK freq'" msgstr "" #: src/dialogs/confdialog.cxx:7701 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" #: src/dialogs/confdialog.cxx:7708 msgid "track color" msgstr "" #: src/dialogs/confdialog.cxx:7709 msgid "Color of Mark Track" msgstr "" #: src/dialogs/confdialog.cxx:7719 msgid "Tx" msgstr "" #: src/dialogs/confdialog.cxx:7722 msgid "Carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:7723 msgid "Select carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:7738 msgid "Custom shift" msgstr "" #: src/dialogs/confdialog.cxx:7739 msgid "Input carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:7757 msgid "Baud rate" msgstr "" #: src/dialogs/confdialog.cxx:7758 msgid "Select carrier baudrate" msgstr "" #: src/dialogs/confdialog.cxx:7773 msgid "Bits per character" msgstr "" #: src/dialogs/confdialog.cxx:7774 msgid "Select # bits / char" msgstr "" #: src/dialogs/confdialog.cxx:7789 msgid "Parity" msgstr "" #: src/dialogs/confdialog.cxx:7790 msgid "Select parity" msgstr "" #: src/dialogs/confdialog.cxx:7805 msgid "Stop bits" msgstr "" #: src/dialogs/confdialog.cxx:7806 msgid "Select # stop bits" msgstr "" #: src/dialogs/confdialog.cxx:7821 msgid "AutoCRLF" msgstr "" #: src/dialogs/confdialog.cxx:7822 msgid "Add CRLF after page width characters" msgstr "" #: src/dialogs/confdialog.cxx:7827 msgid "chars" msgstr "" #: src/dialogs/confdialog.cxx:7828 msgid "Auto CRLF line length" msgstr "" #: src/dialogs/confdialog.cxx:7846 msgid "CR-CR-LF" msgstr "" #: src/dialogs/confdialog.cxx:7847 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "" #: src/dialogs/confdialog.cxx:7853 msgid "TX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:7854 msgid "Revert to Unsifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:7859 msgid "Pseudo-FSK - right channel" msgstr "" #: src/dialogs/confdialog.cxx:7860 msgid "Create keyed square wave on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:7867 msgid "Synop" msgstr "" #: src/dialogs/confdialog.cxx:7870 msgid "SYNOP to ADIF" msgstr "" #: src/dialogs/confdialog.cxx:7871 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" #: src/dialogs/confdialog.cxx:7877 msgid "SYNOP to KML" msgstr "" #: src/dialogs/confdialog.cxx:7878 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" #: src/dialogs/confdialog.cxx:7885 msgid "Interleave SYNOP and text" msgstr "" #: src/dialogs/confdialog.cxx:7886 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "" #: src/dialogs/confdialog.cxx:7898 msgid "Thor" msgstr "" #: src/dialogs/confdialog.cxx:7918 msgid "Enable DSP prior to decoder" msgstr "" #: src/dialogs/confdialog.cxx:7960 msgid "Preamble Detection" msgstr "" #: src/dialogs/confdialog.cxx:7961 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" #: src/dialogs/confdialog.cxx:7966 msgid "Soft-symbol decoding" msgstr "" #: src/dialogs/confdialog.cxx:7967 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:7972 msgid "Soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:7973 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" #: src/dialogs/confdialog.cxx:8003 msgid "Navtex" msgstr "" #: src/dialogs/confdialog.cxx:8005 msgid "Log Navtex messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:8010 msgid "Log Navtex messages to KML" msgstr "" #: src/dialogs/confdialog.cxx:8011 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" #: src/dialogs/confdialog.cxx:8018 msgid "Wefax" msgstr "" #: src/dialogs/confdialog.cxx:8021 msgid "Embedded Wefax Gui" msgstr "" #: src/dialogs/confdialog.cxx:8022 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" #: src/dialogs/confdialog.cxx:8027 msgid "Hide Transmission window" msgstr "" #: src/dialogs/confdialog.cxx:8028 msgid "Hide transmission window by default." msgstr "" #: src/dialogs/confdialog.cxx:8033 msgid "Log Wefax messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:8034 msgid "Sent and received faxes are logged to Adif file." msgstr "" #: src/dialogs/confdialog.cxx:8039 msgid "Frequency shift (800 Hz)" msgstr "" #: src/dialogs/confdialog.cxx:8040 src/dialogs/confdialog.cxx:8051 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "" #: src/dialogs/confdialog.cxx:8050 msgid "Rx fax max rows" msgstr "" #: src/dialogs/confdialog.cxx:8061 msgid "Fax images destination directory" msgstr "" #: src/dialogs/confdialog.cxx:8066 msgid "Directory..." msgstr "" #: src/dialogs/confdialog.cxx:8069 msgid "Save image as monochrome file" msgstr "" #: src/dialogs/confdialog.cxx:8070 msgid "Save the fax image as a gray-level PNG file." msgstr "" #: src/dialogs/confdialog.cxx:8083 msgid "Rig" msgstr "" #: src/dialogs/confdialog.cxx:8084 msgid "Transceiver control" msgstr "" #: src/dialogs/confdialog.cxx:8088 msgid "Hardware PTT" msgstr "" #: src/dialogs/confdialog.cxx:8091 src/dialogs/confdialog.cxx:8926 msgid "PTT tone on right audio channel " msgstr "" #: src/dialogs/confdialog.cxx:8092 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "" #: src/dialogs/confdialog.cxx:8099 msgid "h/w ptt device-pin" msgstr "" #: src/dialogs/confdialog.cxx:8102 msgid "Use separate serial port PTT" msgstr "" #: src/dialogs/confdialog.cxx:8107 src/dialogs/confdialog.cxx:8204 #: src/dialogs/confdialog.cxx:8414 src/dialogs/confdialog.cxx:8668 #: src/dialogs/confdialog.cxx:8856 msgid "Device:" msgstr "" #: src/dialogs/confdialog.cxx:8121 msgid "Use RTS" msgstr "" #: src/dialogs/confdialog.cxx:8122 msgid "RTS is PTT signal line" msgstr "" #: src/dialogs/confdialog.cxx:8126 msgid "RTS = +V" msgstr "" #: src/dialogs/confdialog.cxx:8127 msgid "Initial voltage on RTS" msgstr "" #: src/dialogs/confdialog.cxx:8131 msgid "Use DTR" msgstr "" #: src/dialogs/confdialog.cxx:8132 msgid "DTR is PTT signal line" msgstr "" #: src/dialogs/confdialog.cxx:8136 msgid "DTR = +V" msgstr "" #: src/dialogs/confdialog.cxx:8137 msgid "Initial voltage on DTR" msgstr "" #: src/dialogs/confdialog.cxx:8141 src/dialogs/confdialog.cxx:8305 #: src/dialogs/confdialog.cxx:8567 src/dialogs/confdialog.cxx:8642 #: src/dialogs/confdialog.cxx:9475 msgid "Initialize" msgstr "" #: src/dialogs/confdialog.cxx:8142 msgid "Initialize the H/W PTT interface" msgstr "" #: src/dialogs/confdialog.cxx:8145 msgid "Use parallel port PTT" msgstr "" #: src/dialogs/confdialog.cxx:8150 msgid "Use uHRouter PTT" msgstr "" #: src/dialogs/confdialog.cxx:8157 msgid "PTT delays valid for all CAT/PTT types" msgstr "" #: src/dialogs/confdialog.cxx:8160 msgid "Start of transmit PTT delay" msgstr "" #: src/dialogs/confdialog.cxx:8161 msgid "Delay NN msec before starting audio" msgstr "" #: src/dialogs/confdialog.cxx:8170 msgid "PTT end of transmit delay" msgstr "" #: src/dialogs/confdialog.cxx:8171 msgid "Delay NN msec before releasing PTT" msgstr "" #: src/dialogs/confdialog.cxx:8184 msgid "RigCAT" msgstr "" #: src/dialogs/confdialog.cxx:8185 msgid "Rig Control using xml spec file" msgstr "" #: src/dialogs/confdialog.cxx:8187 msgid "Use RigCAT" msgstr "" #: src/dialogs/confdialog.cxx:8188 msgid "RigCAT used for rig control" msgstr "" #: src/dialogs/confdialog.cxx:8194 msgid "Rig description file:" msgstr "" #: src/dialogs/confdialog.cxx:8195 msgid "Use Open to select descriptor file" msgstr "" #: src/dialogs/confdialog.cxx:8201 msgid "Select rig descriptor file" msgstr "" #: src/dialogs/confdialog.cxx:8219 src/dialogs/confdialog.cxx:8429 msgid "Retries" msgstr "" #: src/dialogs/confdialog.cxx:8220 msgid "# retries before giving up" msgstr "" #: src/dialogs/confdialog.cxx:8236 src/dialogs/confdialog.cxx:8532 msgid "Retry interval (ms)" msgstr "" #: src/dialogs/confdialog.cxx:8237 msgid "Time between retires in msec" msgstr "" #: src/dialogs/confdialog.cxx:8253 src/dialogs/confdialog.cxx:8463 msgid "Write delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:8254 msgid "Wait for response to subsequent command" msgstr "" #: src/dialogs/confdialog.cxx:8270 src/dialogs/confdialog.cxx:8497 msgid "Baud rate:" msgstr "" #: src/dialogs/confdialog.cxx:8286 src/dialogs/confdialog.cxx:8513 msgid "Stopbits" msgstr "" #: src/dialogs/confdialog.cxx:8306 msgid "Initialize RigCAT interface" msgstr "" #: src/dialogs/confdialog.cxx:8309 msgid "Commands are echoed" msgstr "" #: src/dialogs/confdialog.cxx:8310 msgid "Rig or interface echos serial data" msgstr "" #: src/dialogs/confdialog.cxx:8315 msgid "CAT command for PTT" msgstr "" #: src/dialogs/confdialog.cxx:8316 msgid "PTT is a CAT command (not hardware)" msgstr "" #: src/dialogs/confdialog.cxx:8322 msgid "Toggle RTS for PTT" msgstr "" #: src/dialogs/confdialog.cxx:8323 msgid "RTS is ptt line" msgstr "" #: src/dialogs/confdialog.cxx:8328 msgid "Toggle DTR for PTT" msgstr "" #: src/dialogs/confdialog.cxx:8329 msgid "DTR is ptt line" msgstr "" #: src/dialogs/confdialog.cxx:8334 msgid "RTS +12 v" msgstr "" #: src/dialogs/confdialog.cxx:8335 src/dialogs/confdialog.cxx:8599 msgid "Initial state of RTS" msgstr "" #: src/dialogs/confdialog.cxx:8340 msgid "DTR +12 v" msgstr "" #: src/dialogs/confdialog.cxx:8341 src/dialogs/confdialog.cxx:8593 msgid "Initial state of DTR" msgstr "" #: src/dialogs/confdialog.cxx:8346 src/dialogs/confdialog.cxx:8604 msgid "RTS/CTS flow control" msgstr "" #: src/dialogs/confdialog.cxx:8347 msgid "Rig uses RTS/CTS handshake" msgstr "" #: src/dialogs/confdialog.cxx:8352 msgid "Restore Settings on Close" msgstr "" #: src/dialogs/confdialog.cxx:8353 msgid "Restore the serial (COM) port settings" msgstr "" #: src/dialogs/confdialog.cxx:8358 src/dialogs/confdialog.cxx:8617 msgid "Revert" msgstr "" #: src/dialogs/confdialog.cxx:8359 msgid "Reset rigCAT interface" msgstr "" #: src/dialogs/confdialog.cxx:8364 msgid "VSP Enable" msgstr "" #: src/dialogs/confdialog.cxx:8365 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "" #: src/dialogs/confdialog.cxx:8370 msgid "Init delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:8371 msgid "Wait for response to first CAT command" msgstr "" #: src/dialogs/confdialog.cxx:8391 msgid "Hamlib" msgstr "" #: src/dialogs/confdialog.cxx:8393 msgid "Use Hamlib" msgstr "" #: src/dialogs/confdialog.cxx:8394 msgid "Hamlib used for rig control" msgstr "" #: src/dialogs/confdialog.cxx:8400 msgid "Rig:" msgstr "" #: src/dialogs/confdialog.cxx:8430 msgid "# times to resend command before giving up" msgstr "" #: src/dialogs/confdialog.cxx:8446 msgid "Retry Interval (ms)" msgstr "" #: src/dialogs/confdialog.cxx:8447 src/dialogs/confdialog.cxx:8533 msgid "Msec's between retries" msgstr "" #: src/dialogs/confdialog.cxx:8464 msgid "Msec's between sequential commands" msgstr "" #: src/dialogs/confdialog.cxx:8480 msgid "Post write delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:8481 msgid "Wait interval (msecs) before reading response" msgstr "" #: src/dialogs/confdialog.cxx:8552 msgid "Advanced configuration:" msgstr "" #: src/dialogs/confdialog.cxx:8553 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" #: src/dialogs/confdialog.cxx:8568 msgid "Initialize hamlib interface" msgstr "" #: src/dialogs/confdialog.cxx:8571 msgid "Sideband:" msgstr "" #: src/dialogs/confdialog.cxx:8585 msgid "PTT via Hamlib command" msgstr "" #: src/dialogs/confdialog.cxx:8586 msgid "PTT is a hamlib command" msgstr "" #: src/dialogs/confdialog.cxx:8592 msgid "DTR +12" msgstr "" #: src/dialogs/confdialog.cxx:8598 msgid "RTS +12" msgstr "" #: src/dialogs/confdialog.cxx:8605 msgid "Rig requires RTS/CTS flow control" msgstr "" #: src/dialogs/confdialog.cxx:8611 msgid "XON/XOFF flow control" msgstr "" #: src/dialogs/confdialog.cxx:8612 msgid "Rig requires Xon/Xoff flow control" msgstr "" #: src/dialogs/confdialog.cxx:8618 msgid "Reset hamlib interface" msgstr "" #: src/dialogs/confdialog.cxx:8627 msgid "XML-RPC" msgstr "" #: src/dialogs/confdialog.cxx:8635 msgid "" "Rig control via external\n" "program using xmlrpc\n" "remote calls." msgstr "" #: src/dialogs/confdialog.cxx:8637 msgid "Use XML-RPC program" msgstr "" #: src/dialogs/confdialog.cxx:8638 msgid "Experimental" msgstr "" #: src/dialogs/confdialog.cxx:8643 msgid "Initialize XML-RPC rig control" msgstr "" #: src/dialogs/confdialog.cxx:8655 msgid "Audio devices" msgstr "" #: src/dialogs/confdialog.cxx:8659 msgid "Devices" msgstr "" #: src/dialogs/confdialog.cxx:8662 msgid "OSS" msgstr "" #: src/dialogs/confdialog.cxx:8663 msgid "Use OSS audio server" msgstr "" #: src/dialogs/confdialog.cxx:8669 msgid "Select device" msgstr "" #: src/dialogs/confdialog.cxx:8677 msgid "PortAudio" msgstr "" #: src/dialogs/confdialog.cxx:8678 msgid "Use Port Audio server" msgstr "" #: src/dialogs/confdialog.cxx:8683 msgid "Capture:" msgstr "" #: src/dialogs/confdialog.cxx:8684 msgid "Audio input device" msgstr "" #: src/dialogs/confdialog.cxx:8688 msgid "Playback:" msgstr "" #: src/dialogs/confdialog.cxx:8689 msgid "Audio output device" msgstr "" #: src/dialogs/confdialog.cxx:8697 msgid "PulseAudio" msgstr "" #: src/dialogs/confdialog.cxx:8698 msgid "Use Pulse Audio server" msgstr "" #: src/dialogs/confdialog.cxx:8703 msgid "Server string:" msgstr "" #: src/dialogs/confdialog.cxx:8704 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" #: src/dialogs/confdialog.cxx:8722 msgid "File I/O only" msgstr "" #: src/dialogs/confdialog.cxx:8723 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "" #: src/dialogs/confdialog.cxx:8732 msgid "Settings" msgstr "" #: src/dialogs/confdialog.cxx:8734 msgid "Sample rate" msgstr "" #: src/dialogs/confdialog.cxx:8737 msgid "Capture" msgstr "" #: src/dialogs/confdialog.cxx:8738 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" #: src/dialogs/confdialog.cxx:8770 msgid "Converter" msgstr "" #: src/dialogs/confdialog.cxx:8771 msgid "Set the type of resampler used of offset correction" msgstr "" #: src/dialogs/confdialog.cxx:8787 msgid "Corrections" msgstr "" #: src/dialogs/confdialog.cxx:8790 msgid "RX ppm" msgstr "" #: src/dialogs/confdialog.cxx:8791 msgid "RX sound card correction" msgstr "" #: src/dialogs/confdialog.cxx:8807 msgid "TX ppm" msgstr "" #: src/dialogs/confdialog.cxx:8808 msgid "TX sound card correction" msgstr "" #: src/dialogs/confdialog.cxx:8824 msgid "TX offset" msgstr "" #: src/dialogs/confdialog.cxx:8825 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "" #: src/dialogs/confdialog.cxx:8845 msgid "Mixer" msgstr "" #: src/dialogs/confdialog.cxx:8847 msgid "OSS Mixer" msgstr "" #: src/dialogs/confdialog.cxx:8850 msgid "Manage mixer" msgstr "" #: src/dialogs/confdialog.cxx:8851 msgid "Add mixer controls to main dialog" msgstr "" #: src/dialogs/confdialog.cxx:8857 msgid "Select Mixer device" msgstr "" #: src/dialogs/confdialog.cxx:8872 msgid "Mic In" msgstr "" #: src/dialogs/confdialog.cxx:8873 msgid "Use microphone input" msgstr "" #: src/dialogs/confdialog.cxx:8876 msgid "Line In" msgstr "" #: src/dialogs/confdialog.cxx:8877 msgid "Use Line-In device" msgstr "" #: src/dialogs/confdialog.cxx:8881 msgid "PCM" msgstr "" #: src/dialogs/confdialog.cxx:8882 msgid "Set the sound card PCM level" msgstr "" #: src/dialogs/confdialog.cxx:8902 msgid "Right channel" msgstr "" #: src/dialogs/confdialog.cxx:8904 msgid "Mono audio output" msgstr "" #: src/dialogs/confdialog.cxx:8905 msgid "Force output audio to single channel" msgstr "" #: src/dialogs/confdialog.cxx:8910 msgid "Modem signal on left and right channels" msgstr "" #: src/dialogs/confdialog.cxx:8911 msgid "Left and right channels both contain modem audio" msgstr "" #: src/dialogs/confdialog.cxx:8916 msgid "Reverse Left/Right channels" msgstr "" #: src/dialogs/confdialog.cxx:8917 msgid "Software reversal of left-right audio channels" msgstr "" #: src/dialogs/confdialog.cxx:8922 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" #: src/dialogs/confdialog.cxx:8927 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" #: src/dialogs/confdialog.cxx:8933 msgid "CW QSK signal on right channel" msgstr "" #: src/dialogs/confdialog.cxx:8934 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "" #: src/dialogs/confdialog.cxx:8939 msgid "Pseudo-FSK on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:8940 msgid "Create 1000 Hz square wave on right channel" msgstr "" #: src/dialogs/confdialog.cxx:8949 msgid "Wav" msgstr "" #: src/dialogs/confdialog.cxx:8951 msgid "Wav write sample rate" msgstr "" #: src/dialogs/confdialog.cxx:8952 msgid "Pick baud rate from list" msgstr "" #: src/dialogs/confdialog.cxx:8974 msgid "ID" msgstr "" #: src/dialogs/confdialog.cxx:8977 msgid "RsID" msgstr "" #: src/dialogs/confdialog.cxx:8978 msgid "Reed-Solomon ID (Rx)" msgstr "" #: src/dialogs/confdialog.cxx:8981 msgid "Notify only" msgstr "" #: src/dialogs/confdialog.cxx:8982 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:8988 msgid "Receive modes" msgstr "" #: src/dialogs/confdialog.cxx:8991 msgid "Searches passband" msgstr "" #: src/dialogs/confdialog.cxx:8992 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" #: src/dialogs/confdialog.cxx:8997 msgid "Mark prev freq/mode" msgstr "" #: src/dialogs/confdialog.cxx:8998 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" #: src/dialogs/confdialog.cxx:9003 msgid "Disables detector" msgstr "" #: src/dialogs/confdialog.cxx:9004 msgid "Disable further detection when RSID is received" msgstr "" #: src/dialogs/confdialog.cxx:9011 msgid "Allow errors" msgstr "" #: src/dialogs/confdialog.cxx:9012 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" #: src/dialogs/confdialog.cxx:9023 msgid "Medium" msgstr "" #: src/dialogs/confdialog.cxx:9028 msgid "Squelch open (sec)" msgstr "" #: src/dialogs/confdialog.cxx:9029 msgid "Open squelch for nn sec if RSID detected" msgstr "" #: src/dialogs/confdialog.cxx:9047 msgid "Disable alert dialog" msgstr "" #: src/dialogs/confdialog.cxx:9048 msgid "Do not show RsID alert dialog box" msgstr "" #: src/dialogs/confdialog.cxx:9053 msgid "Retain tx freq lock" msgstr "" #: src/dialogs/confdialog.cxx:9054 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:9059 msgid "Disable freq change" msgstr "" #: src/dialogs/confdialog.cxx:9060 msgid "Do not automatically change to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:9065 msgid "" "The RsID notification message contents and \n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" #: src/dialogs/confdialog.cxx:9073 msgid "Pre-Signal Tone" msgstr "" #: src/dialogs/confdialog.cxx:9076 msgid "Seconds" msgstr "" #: src/dialogs/confdialog.cxx:9077 msgid "Use for triggering amplifier carrier detect" msgstr "" #: src/dialogs/confdialog.cxx:9085 msgid "Reed-Solomon ID (Tx)" msgstr "" #: src/dialogs/confdialog.cxx:9088 msgid "Transmit modes" msgstr "" #: src/dialogs/confdialog.cxx:9091 msgid "End of xmt ID" msgstr "" #: src/dialogs/confdialog.cxx:9092 msgid "Add RsID signal to end of transmission" msgstr "" #: src/dialogs/confdialog.cxx:9101 msgid "Video" msgstr "" #: src/dialogs/confdialog.cxx:9103 msgid "Video Preamble ID" msgstr "" #: src/dialogs/confdialog.cxx:9106 msgid "Transmit mode ID" msgstr "" #: src/dialogs/confdialog.cxx:9107 msgid "Waterfall video ID" msgstr "" #: src/dialogs/confdialog.cxx:9111 msgid "Transmit video text" msgstr "" #: src/dialogs/confdialog.cxx:9112 msgid "Waterfall video text" msgstr "" #: src/dialogs/confdialog.cxx:9117 msgid ":" msgstr "" #: src/dialogs/confdialog.cxx:9118 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" #: src/dialogs/confdialog.cxx:9132 msgid "Use small font" msgstr "" #: src/dialogs/confdialog.cxx:9133 msgid "" "ON - small font\n" "OFF - large font" msgstr "" #: src/dialogs/confdialog.cxx:9139 msgid "Chars/Row:" msgstr "" #: src/dialogs/confdialog.cxx:9140 msgid "Set the number of characters per row" msgstr "" #: src/dialogs/confdialog.cxx:9160 msgid "500 Hz limit" msgstr "" #: src/dialogs/confdialog.cxx:9165 msgid "Mode width limit" msgstr "" #: src/dialogs/confdialog.cxx:9170 msgid "Video ID modes" msgstr "" #: src/dialogs/confdialog.cxx:9179 msgid "CW Postamble ID" msgstr "" #: src/dialogs/confdialog.cxx:9182 msgid "Transmit callsign" msgstr "" #: src/dialogs/confdialog.cxx:9183 msgid "Send Callsign in CW at end of every transmission" msgstr "" #: src/dialogs/confdialog.cxx:9188 msgid "Speed (WPM):" msgstr "" #: src/dialogs/confdialog.cxx:9189 msgid "Send at this WPM" msgstr "" #: src/dialogs/confdialog.cxx:9209 msgid "CW ID modes" msgstr "" #: src/dialogs/confdialog.cxx:9224 msgid "CPU" msgstr "" #: src/dialogs/confdialog.cxx:9228 msgid "Slow CPU (less than 700MHz)" msgstr "" #: src/dialogs/confdialog.cxx:9229 msgid "Enable if you're computer does not decode properly" msgstr "" #: src/dialogs/confdialog.cxx:9238 msgid "NBEMS" msgstr "" #: src/dialogs/confdialog.cxx:9240 msgid "NBEMS data file interface" msgstr "" #: src/dialogs/confdialog.cxx:9243 msgid "Enable" msgstr "" #: src/dialogs/confdialog.cxx:9244 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "" #: src/dialogs/confdialog.cxx:9249 msgid "Open message folder" msgstr "" #: src/dialogs/confdialog.cxx:9250 msgid "Opens NBEMS file folder upon successful capture" msgstr "" #: src/dialogs/confdialog.cxx:9257 msgid "Reception of flmsg files" msgstr "" #: src/dialogs/confdialog.cxx:9260 msgid "Open with flmsg" msgstr "" #: src/dialogs/confdialog.cxx:9261 msgid "Open message with flmsg" msgstr "" #: src/dialogs/confdialog.cxx:9266 msgid "Open in browser" msgstr "" #: src/dialogs/confdialog.cxx:9267 msgid "Open file with default browser" msgstr "" #: src/dialogs/confdialog.cxx:9272 msgid "flmsg:" msgstr "" #: src/dialogs/confdialog.cxx:9273 msgid "Enter full path-filename for flmsg" msgstr "" #: src/dialogs/confdialog.cxx:9286 msgid "Locate flmsg" msgstr "" #: src/dialogs/confdialog.cxx:9290 msgid "Timeout (secs)" msgstr "" #: src/dialogs/confdialog.cxx:9291 msgid "Extract times out after NN seconds of inactivity." msgstr "" #: src/dialogs/confdialog.cxx:9308 msgid "Pskmail" msgstr "" #: src/dialogs/confdialog.cxx:9311 msgid "Mail Server Attributes" msgstr "" #: src/dialogs/confdialog.cxx:9314 msgid "Carrier frequency (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:9315 msgid "Default listen / transmit frequency" msgstr "" #: src/dialogs/confdialog.cxx:9334 msgid "Search range (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:9335 msgid "Listen for signals within this range" msgstr "" #: src/dialogs/confdialog.cxx:9374 msgid "AFC range (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:9375 msgid "Limit AFC movement to this range" msgstr "" #: src/dialogs/confdialog.cxx:9394 msgid "Reset to Carrier" msgstr "" #: src/dialogs/confdialog.cxx:9395 msgid "When no signal present" msgstr "" #: src/dialogs/confdialog.cxx:9406 msgid "Report ARQ frames average S/N" msgstr "" #: src/dialogs/confdialog.cxx:9415 msgid "Spotting" msgstr "" #: src/dialogs/confdialog.cxx:9417 msgid "PSK Reporter" msgstr "" #: src/dialogs/confdialog.cxx:9420 msgid "Automatically spot callsigns in decoded text" msgstr "" #: src/dialogs/confdialog.cxx:9421 msgid "Parse all incoming text" msgstr "" #: src/dialogs/confdialog.cxx:9426 msgid "Send reception report when logging a QSO" msgstr "" #: src/dialogs/confdialog.cxx:9427 msgid "Send report only when QSO is logged" msgstr "" #: src/dialogs/confdialog.cxx:9432 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "" #: src/dialogs/confdialog.cxx:9433 msgid "Include the transmit frequency" msgstr "" #: src/dialogs/confdialog.cxx:9438 msgid "Disable spotting when signal browser(s) are not visible." msgstr "" #: src/dialogs/confdialog.cxx:9439 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "" #: src/dialogs/confdialog.cxx:9445 msgid "Host:" msgstr "" #: src/dialogs/confdialog.cxx:9446 msgid "To whom the connection is made" msgstr "" #: src/dialogs/confdialog.cxx:9461 msgid "Using UDP port #" msgstr "" #: src/dialogs/confdialog.cxx:9476 msgid "Initialize the socket client" msgstr "" #: src/dialogs/confdialog.cxx:9479 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:9487 msgid "Sweet Spot" msgstr "" #: src/dialogs/confdialog.cxx:9493 msgid "Default CW tracking point" msgstr "" #: src/dialogs/confdialog.cxx:9512 msgid "Default RTTY tracking point" msgstr "" #: src/dialogs/confdialog.cxx:9530 msgid "PSK et al." msgstr "" #: src/dialogs/confdialog.cxx:9531 msgid "Default for all other modems" msgstr "" #: src/dialogs/confdialog.cxx:9549 msgid "Always start new modems at these frequencies" msgstr "" #: src/dialogs/confdialog.cxx:9550 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" #: src/dialogs/confdialog.cxx:9558 msgid "K3 A1A configuation" msgstr "" #: src/dialogs/confdialog.cxx:9561 msgid "CW is LSB" msgstr "" #: src/dialogs/confdialog.cxx:9562 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" #: src/dialogs/confdialog.cxx:9571 msgid "Text i/o" msgstr "" #: src/dialogs/confdialog.cxx:9573 msgid "Talker Socket (MS only)" msgstr "" #: src/dialogs/confdialog.cxx:9576 msgid "Talker" msgstr "" #: src/dialogs/confdialog.cxx:9580 msgid "Connect/disconnect to Talker socket server" msgstr "" #: src/dialogs/confdialog.cxx:9583 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" #: src/dialogs/confdialog.cxx:9590 msgid "Capture rx text to external file" msgstr "" #: src/dialogs/confdialog.cxx:9593 msgid "Enable rx text stream" msgstr "" #: src/dialogs/confdialog.cxx:9594 msgid "Send rx text to file: textout.txt" msgstr "" #: src/dialogs/confdialog.cxx:9603 msgid "DTMF" msgstr "" #: src/dialogs/confdialog.cxx:9605 msgid "Decode DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:9606 msgid "Decode received DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:9613 msgid "WX" msgstr "" #: src/dialogs/confdialog.cxx:9615 msgid "Weather query specification" msgstr "" #: src/dialogs/confdialog.cxx:9618 msgid "METAR station ID code" msgstr "" #: src/dialogs/confdialog.cxx:9619 msgid "" "for example KMDQ for \n" "Huntsville-Madison Executive Airport, AL" msgstr "" #: src/dialogs/confdialog.cxx:9624 msgid "Full report" msgstr "" #: src/dialogs/confdialog.cxx:9625 msgid "Insert full METAR report" msgstr "" #: src/dialogs/confdialog.cxx:9630 msgid "End of header string:" msgstr "" #: src/dialogs/confdialog.cxx:9631 msgid "" "Text defining end of METAR header\n" "Typically 'Connection: close'\n" "Used to search for station name" msgstr "" #: src/dialogs/confdialog.cxx:9637 msgid "METAR station location" msgstr "" #: src/dialogs/confdialog.cxx:9638 msgid "Add geopolitical name of METAR station" msgstr "" #: src/dialogs/confdialog.cxx:9643 msgid "Conditions" msgstr "" #: src/dialogs/confdialog.cxx:9644 msgid "current wx conditions" msgstr "" #: src/dialogs/confdialog.cxx:9649 msgid "Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:9650 msgid "report Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:9655 msgid "Celsius" msgstr "" #: src/dialogs/confdialog.cxx:9656 msgid "report Celsius" msgstr "" #: src/dialogs/confdialog.cxx:9661 msgid "Miles / Hour" msgstr "" #: src/dialogs/confdialog.cxx:9662 msgid "report miles per hour" msgstr "" #: src/dialogs/confdialog.cxx:9667 msgid "kilometers / hour" msgstr "" #: src/dialogs/confdialog.cxx:9668 msgid "report kilometers per hour" msgstr "" #: src/dialogs/confdialog.cxx:9673 msgid "Inches Mg." msgstr "" #: src/dialogs/confdialog.cxx:9674 msgid "report inches mercury" msgstr "" #: src/dialogs/confdialog.cxx:9679 msgid "mbars" msgstr "" #: src/dialogs/confdialog.cxx:9680 msgid "report millibars" msgstr "" #: src/dialogs/confdialog.cxx:9685 msgid "Temperature" msgstr "" #: src/dialogs/confdialog.cxx:9688 msgid "Wind speed/dir" msgstr "" #: src/dialogs/confdialog.cxx:9691 msgid "Barometric pressure" msgstr "" #: src/dialogs/confdialog.cxx:9694 msgid "Search on web" msgstr "" #: src/dialogs/confdialog.cxx:9701 msgid "KML" msgstr "" #: src/dialogs/confdialog.cxx:9703 msgid "KML files directory" msgstr "" #: src/dialogs/confdialog.cxx:9704 msgid "Where generated KML documents are stored." msgstr "" #: src/dialogs/confdialog.cxx:9709 msgid "KML root file" msgstr "" #: src/dialogs/confdialog.cxx:9713 msgid "Minimum distance for splitting aliases (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:9714 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:9724 msgid "Data retention time, in hours (0 for no limit)" msgstr "" #: src/dialogs/confdialog.cxx:9725 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" #: src/dialogs/confdialog.cxx:9734 msgid "KML refresh interval (seconds)" msgstr "" #: src/dialogs/confdialog.cxx:9735 msgid "Refresh time interval written in KML file (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:9751 msgid "KML balloon display style" msgstr "" #: src/dialogs/confdialog.cxx:9752 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" #: src/dialogs/confdialog.cxx:9767 msgid "Command run on KML creation" msgstr "" #: src/dialogs/confdialog.cxx:9768 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" #: src/dialogs/confdialog.cxx:9774 msgid "Test command" msgstr "" #: src/dialogs/confdialog.cxx:9775 msgid "Execute command on KML files." msgstr "" #: src/dialogs/confdialog.cxx:9778 msgid "Change dir..." msgstr "" #: src/dialogs/confdialog.cxx:9779 msgid "Choose directory to store KML documents" msgstr "" #: src/dialogs/confdialog.cxx:9782 msgid "Cleanup KML data now !" msgstr "" #: src/dialogs/confdialog.cxx:9783 msgid "Cleanups KML documents, empties Google Earth display." msgstr "" #: src/dialogs/confdialog.cxx:9786 msgid "Cleanup on startup" msgstr "" #: src/dialogs/confdialog.cxx:9787 msgid "Empties KML documents when starting program." msgstr "" #: src/dialogs/confdialog.cxx:9798 msgid "Web" msgstr "" #: src/dialogs/confdialog.cxx:9799 msgid "Callsign database" msgstr "" #: src/dialogs/confdialog.cxx:9802 msgid "Call Lookup" msgstr "" #: src/dialogs/confdialog.cxx:9803 msgid "Web Browser lookup" msgstr "" #: src/dialogs/confdialog.cxx:9807 msgid "Do not use callsign lookup via web browser" msgstr "" #: src/dialogs/confdialog.cxx:9813 msgid "QRZ online via default Internet Browser" msgstr "" #: src/dialogs/confdialog.cxx:9814 msgid "Visit QRZ web site" msgstr "" #: src/dialogs/confdialog.cxx:9819 msgid "HamCall online via default Internet Browser" msgstr "" #: src/dialogs/confdialog.cxx:9820 src/dialogs/confdialog.cxx:9868 msgid "Visit Hamcall web site" msgstr "" #: src/dialogs/confdialog.cxx:9825 msgid "HamQTH via default Internet Browser" msgstr "" #: src/dialogs/confdialog.cxx:9826 msgid "Visit hamQTH web site" msgstr "" #: src/dialogs/confdialog.cxx:9833 msgid "Data base lookup" msgstr "" #: src/dialogs/confdialog.cxx:9837 msgid "Do not use callsign database" msgstr "" #: src/dialogs/confdialog.cxx:9843 msgid "QRZ cdrom" msgstr "" #: src/dialogs/confdialog.cxx:9844 msgid "Use CD or hard drive CD image" msgstr "" #: src/dialogs/confdialog.cxx:9849 msgid "QRZ.com" msgstr "" #: src/dialogs/confdialog.cxx:9850 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" #: src/dialogs/confdialog.cxx:9855 msgid "Hamcall.net" msgstr "" #: src/dialogs/confdialog.cxx:9856 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" #: src/dialogs/confdialog.cxx:9861 msgid "HamQTH.com (free service http://www.hamqth.com)" msgstr "" #: src/dialogs/confdialog.cxx:9862 msgid "Free service courtesy of OK" msgstr "" #: src/dialogs/confdialog.cxx:9867 msgid "Callook.info lookup (free service US callsigns only)" msgstr "" #: src/dialogs/confdialog.cxx:9873 msgid "at:" msgstr "" #: src/dialogs/confdialog.cxx:9874 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" #: src/dialogs/confdialog.cxx:9888 msgid "User name" msgstr "" #: src/dialogs/confdialog.cxx:9889 src/dialogs/confdialog.cxx:9935 #: src/dialogs/confdialog.cxx:9970 msgid "Your login name" msgstr "" #: src/dialogs/confdialog.cxx:9903 src/dialogs/confdialog.cxx:9949 msgid "Password" msgstr "" #: src/dialogs/confdialog.cxx:9904 src/dialogs/confdialog.cxx:9950 msgid "Your login password" msgstr "" #: src/dialogs/confdialog.cxx:9919 src/dialogs/confdialog.cxx:9965 msgid "Show" msgstr "" #: src/dialogs/confdialog.cxx:9920 src/dialogs/confdialog.cxx:9966 msgid "Show password in plain text" msgstr "" #: src/dialogs/confdialog.cxx:9923 msgid "Add address to notes field" msgstr "" #: src/dialogs/confdialog.cxx:9932 msgid "eQSL" msgstr "" #: src/dialogs/confdialog.cxx:9934 msgid "User ID" msgstr "" #: src/dialogs/confdialog.cxx:9969 msgid "QTH Nickname" msgstr "" #: src/dialogs/confdialog.cxx:9984 msgid "Options" msgstr "" #: src/dialogs/confdialog.cxx:9987 msgid "send when logged (log button, , )" msgstr "" #: src/dialogs/confdialog.cxx:9988 msgid "automatic data upload" msgstr "" #: src/dialogs/confdialog.cxx:9993 msgid "Default message" msgstr "" #: src/dialogs/confdialog.cxx:9994 msgid "default text to send with etc" msgstr "" #: src/dialogs/confdialog.cxx:10008 msgid "Text Tags (tags use {} delimiters)" msgstr "" #: src/dialogs/confdialog.cxx:10011 msgid " {CALL} other ops call sign" msgstr "" #: src/dialogs/confdialog.cxx:10014 msgid " {MODE} full mode / submode" msgstr "" #: src/dialogs/confdialog.cxx:10017 msgid "{NAME} other ops name" msgstr "" #: src/dialogs/confdialog.cxx:10020 msgid "These tags can also be used in " msgstr "" #: src/dialogs/confdialog.cxx:10024 msgid "Use date/time off for log entry" msgstr "" #: src/dialogs/confdialog.cxx:10025 msgid "default uses date/time on" msgstr "" #: src/dialogs/confdialog.cxx:10043 msgid "Auto start programs with fldigi" msgstr "" #: src/dialogs/confdialog.cxx:10046 msgid "flrig:" msgstr "" #: src/dialogs/confdialog.cxx:10047 src/dialogs/confdialog.cxx:10065 #: src/dialogs/confdialog.cxx:10083 src/dialogs/confdialog.cxx:10101 #: src/dialogs/confdialog.cxx:10119 src/dialogs/confdialog.cxx:10137 #: src/dialogs/confdialog.cxx:10155 msgid "" "Enter full path-filename for external program\n" "Or simple name of program" msgstr "" #: src/dialogs/confdialog.cxx:10060 src/dialogs/confdialog.cxx:10078 #: src/dialogs/confdialog.cxx:10096 src/dialogs/confdialog.cxx:10114 #: src/dialogs/confdialog.cxx:10132 src/dialogs/confdialog.cxx:10150 #: src/dialogs/confdialog.cxx:10168 msgid "Locate" msgstr "" #: src/dialogs/confdialog.cxx:10061 msgid "Locate flrig executable" msgstr "" #: src/dialogs/confdialog.cxx:10064 msgid "flamp:" msgstr "" #: src/dialogs/confdialog.cxx:10079 msgid "Locate flamp executable" msgstr "" #: src/dialogs/confdialog.cxx:10082 msgid "flnet:" msgstr "" #: src/dialogs/confdialog.cxx:10097 msgid "Locate flnet executable" msgstr "" #: src/dialogs/confdialog.cxx:10100 msgid "fllog:" msgstr "" #: src/dialogs/confdialog.cxx:10115 msgid "Locate fllog executable" msgstr "" #: src/dialogs/confdialog.cxx:10118 msgid "Prog 1:" msgstr "" #: src/dialogs/confdialog.cxx:10133 msgid "Locate program #1 executable" msgstr "" #: src/dialogs/confdialog.cxx:10136 msgid "Prog 2:" msgstr "" #: src/dialogs/confdialog.cxx:10151 msgid "Locate program #2 executable" msgstr "" #: src/dialogs/confdialog.cxx:10154 msgid "Prog 3:" msgstr "" #: src/dialogs/confdialog.cxx:10169 msgid "Locate program #3 executable" msgstr "" #: src/dialogs/confdialog.cxx:10172 msgid "" "Enable\n" "-" msgstr "" #: src/dialogs/confdialog.cxx:10173 src/dialogs/confdialog.cxx:10180 #: src/dialogs/confdialog.cxx:10186 src/dialogs/confdialog.cxx:10192 #: src/dialogs/confdialog.cxx:10198 src/dialogs/confdialog.cxx:10204 #: src/dialogs/confdialog.cxx:10210 msgid "Enable this entry when fldigi first starts" msgstr "" #: src/dialogs/confdialog.cxx:10215 src/dialogs/confdialog.cxx:10219 #: src/dialogs/confdialog.cxx:10223 src/dialogs/confdialog.cxx:10227 #: src/dialogs/confdialog.cxx:10231 src/dialogs/confdialog.cxx:10235 #: src/dialogs/confdialog.cxx:10239 msgid "Test" msgstr "" #: src/dialogs/confdialog.cxx:10216 msgid "Start flrig" msgstr "" #: src/dialogs/confdialog.cxx:10220 msgid "Start flamp" msgstr "" #: src/dialogs/confdialog.cxx:10224 msgid "Start flnet" msgstr "" #: src/dialogs/confdialog.cxx:10228 msgid "Start fllog" msgstr "" #: src/dialogs/confdialog.cxx:10232 msgid "Start prog1" msgstr "" #: src/dialogs/confdialog.cxx:10236 msgid "Start prog2" msgstr "" #: src/dialogs/confdialog.cxx:10240 msgid "Start prog3" msgstr "" #: src/dialogs/confdialog.cxx:10255 msgid "Restore defaults" msgstr "" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "" #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" #: src/dialogs/font_browser.cxx:283 msgid "Reading fonts..." msgstr "" #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "" #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "" #: src/dialogs/notifydialog.cxx:112 msgid "RE:" msgstr "" #: src/dialogs/notifydialog.cxx:124 msgid "Enabled" msgstr "" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "" #: src/logbook/lgbook.cxx:397 msgid "Export Setup" msgstr "" #: src/logbook/lgbook.cxx:398 src/logbook/lgbook.cxx:1040 msgid "Select Records to Export" msgstr "" #: src/logbook/lgbook.cxx:406 src/logbook/lgbook.cxx:456 #: src/logbook/lgbook.cxx:1048 src/logbook/lgbook.cxx:1122 msgid "Check All" msgstr "" #: src/logbook/lgbook.cxx:409 msgid "Start Date" msgstr "" #: src/logbook/lgbook.cxx:410 msgid "Start date for export" msgstr "" #: src/logbook/lgbook.cxx:423 msgid "Stop Date" msgstr "" #: src/logbook/lgbook.cxx:424 msgid "Inclusive stop date for export" msgstr "" #: src/logbook/lgbook.cxx:437 msgid "select by date" msgstr "" #: src/logbook/lgbook.cxx:438 msgid "Enable to select date range" msgstr "" #: src/logbook/lgbook.cxx:450 msgid "Select Fields to Export" msgstr "" #: src/logbook/lgbook.cxx:478 msgid "QSO Date On" msgstr "" #: src/logbook/lgbook.cxx:482 msgid "QSO Date Off" msgstr "" #: src/logbook/lgbook.cxx:486 msgid "Time ON" msgstr "" #: src/logbook/lgbook.cxx:490 src/logbook/lgbook.cxx:1091 msgid "Time OFF" msgstr "" #: src/logbook/lgbook.cxx:494 msgid "TX Power" msgstr "" #: src/logbook/lgbook.cxx:497 src/logbook/lgbook.cxx:1095 msgid "RST sent" msgstr "" #: src/logbook/lgbook.cxx:501 src/logbook/lgbook.cxx:1099 msgid "RST rcvd" msgstr "" #: src/logbook/lgbook.cxx:505 src/logbook/lgbook.cxx:731 msgid "Qth" msgstr "" #: src/logbook/lgbook.cxx:508 msgid "LOC" msgstr "" #: src/logbook/lgbook.cxx:515 src/logbook/lgbook.cxx:876 msgid "QSL-VIA" msgstr "" #: src/logbook/lgbook.cxx:527 msgid "QSL rcvd date" msgstr "" #: src/logbook/lgbook.cxx:530 msgid "QSL sent date" msgstr "" #: src/logbook/lgbook.cxx:533 src/logbook/lgbook.cxx:1103 msgid "Serial # in" msgstr "" #: src/logbook/lgbook.cxx:536 src/logbook/lgbook.cxx:1107 msgid "Serial # out" msgstr "" #: src/logbook/lgbook.cxx:545 src/logbook/lgbook.cxx:804 #: src/logbook/lgbook.cxx:805 msgid "County" msgstr "" #: src/logbook/lgbook.cxx:551 src/logbook/lgbook.cxx:828 msgid "CQZ" msgstr "" #: src/logbook/lgbook.cxx:554 src/logbook/lgbook.cxx:864 msgid "DXCC" msgstr "" #: src/logbook/lgbook.cxx:557 src/logbook/lgbook.cxx:816 msgid "IOTA" msgstr "" #: src/logbook/lgbook.cxx:560 src/logbook/lgbook.cxx:840 msgid "ITUZ" msgstr "" #: src/logbook/lgbook.cxx:570 msgid "Logbook" msgstr "" #: src/logbook/lgbook.cxx:571 msgid "Date On" msgstr "" #: src/logbook/lgbook.cxx:572 msgid "Date QSO started" msgstr "" #: src/logbook/lgbook.cxx:585 msgid "Time QSO started" msgstr "" #: src/logbook/lgbook.cxx:597 msgid "Call sign worked" msgstr "" #: src/logbook/lgbook.cxx:609 msgid "Operator worked" msgstr "" #: src/logbook/lgbook.cxx:621 msgid "Rst received" msgstr "" #: src/logbook/lgbook.cxx:632 msgid "QSL-rcvd" msgstr "" #: src/logbook/lgbook.cxx:633 msgid "QSL received on this date" msgstr "" #: src/logbook/lgbook.cxx:645 msgid "Date Off" msgstr "" #: src/logbook/lgbook.cxx:646 msgid "Date QSO Ended" msgstr "" #: src/logbook/lgbook.cxx:659 msgid "Time QSO ended" msgstr "" #: src/logbook/lgbook.cxx:670 msgid "Freq." msgstr "" #: src/logbook/lgbook.cxx:671 msgid "Frequency in MHz" msgstr "" #: src/logbook/lgbook.cxx:683 msgid "Mode in use" msgstr "" #: src/logbook/lgbook.cxx:694 msgid "Pwr" msgstr "" #: src/logbook/lgbook.cxx:695 msgid "Transmit power used" msgstr "" #: src/logbook/lgbook.cxx:707 msgid "Rst sent" msgstr "" #: src/logbook/lgbook.cxx:718 msgid "QSL-sent" msgstr "" #: src/logbook/lgbook.cxx:719 msgid "QSL sent on this date" msgstr "" #: src/logbook/lgbook.cxx:732 msgid "City of station worked" msgstr "" #: src/logbook/lgbook.cxx:743 msgid "St" msgstr "" #: src/logbook/lgbook.cxx:744 msgid "US state of station worked" msgstr "" #: src/logbook/lgbook.cxx:755 msgid "Pr" msgstr "" #: src/logbook/lgbook.cxx:756 msgid "Province of station worked" msgstr "" #: src/logbook/lgbook.cxx:768 msgid "Country of station worked" msgstr "" #: src/logbook/lgbook.cxx:779 msgid "Loc" msgstr "" #: src/logbook/lgbook.cxx:780 msgid "Stations grid square" msgstr "" #: src/logbook/lgbook.cxx:792 msgid "Interesting notes" msgstr "" #: src/logbook/lgbook.cxx:817 msgid "Islands on the air" msgstr "" #: src/logbook/lgbook.cxx:852 msgid "CONT" msgstr "" #: src/logbook/lgbook.cxx:865 msgid "DXCC designator" msgstr "" #: src/logbook/lgbook.cxx:877 msgid "QSL route of contacted station" msgstr "" #: src/logbook/lgbook.cxx:888 msgid "Ser out" msgstr "" #: src/logbook/lgbook.cxx:889 msgid "Contest serial # sent" msgstr "" #: src/logbook/lgbook.cxx:901 msgid "Contest exchange sent" msgstr "" #: src/logbook/lgbook.cxx:912 msgid "Ser in" msgstr "" #: src/logbook/lgbook.cxx:913 msgid "Contest serial # received" msgstr "" #: src/logbook/lgbook.cxx:925 msgid "Contest exchange received" msgstr "" #: src/logbook/lgbook.cxx:936 msgid "Call Search" msgstr "" #: src/logbook/lgbook.cxx:937 msgid "Search for this callsign" msgstr "" #: src/logbook/lgbook.cxx:948 msgid "Recs" msgstr "" #: src/logbook/lgbook.cxx:949 msgid "# Records in logbook" msgstr "" #: src/logbook/lgbook.cxx:961 msgid "New record / Save record" msgstr "" #: src/logbook/lgbook.cxx:968 msgid "Update the current record" msgstr "" #: src/logbook/lgbook.cxx:975 msgid "Delete the current record" msgstr "" #: src/logbook/lgbook.cxx:981 msgid "Dial" msgstr "" #: src/logbook/lgbook.cxx:982 msgid "Retrieve for active modem use" msgstr "" #: src/logbook/lgbook.cxx:989 msgid "Find previous" msgstr "" #: src/logbook/lgbook.cxx:997 msgid "Find next" msgstr "" #: src/logbook/lgbook.cxx:1020 msgid "Date" msgstr "" #: src/logbook/lgbook.cxx:1022 msgid "Time" msgstr "" #: src/logbook/lgbook.cxx:1039 msgid "Cabrillo Setup" msgstr "" #: src/logbook/lgbook.cxx:1059 msgid "Select Cabrillo Contest & Fields" msgstr "" #: src/logbook/lgbook.cxx:1062 msgid "Contest:" msgstr "" #: src/logbook/lgbook.cxx:1087 msgid "QSO Date" msgstr "" fldigi-3.21.80/po/en@quot.header0000664000175000017500000000226312313064025013250 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # fldigi-3.21.80/po/de.po0000664000175000017500000044565512313333722011436 00000000000000# German translation file for Fldigi. # Copyright (C) 2013 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the Fldigi package. # Marc Richter df2mr@arrl.net, 2013. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.21.76AP\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2014-03-22 11:18-0500\n" "PO-Revision-Date: 2013-10-21 13:07+0100\n" "Last-Translator: Marc Richter \n" "Language-Team: German (Marc Richter) \n" "Language: German\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: German\n" "X-Poedit-Country: GERMANY\n" "X-Poedit-SourceCharset: iso-8859-1\n" #: src/main.cxx:415 #, c-format msgid "%s log started on %s" msgstr "%s Logbuch erstellt am %s" #: src/main.cxx:1014 msgid "Bad modem id" msgstr "" #: src/main.cxx:1021 msgid "Bad frequency" msgstr "" #: src/main.cxx:1152 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Lizenz GPLv3+: GNU GPL version 3 oder später \n" "Dies ist freie Software, Sie können sie verändern und weitergeben.\n" "Es gibt KEINE GARANTIE soweit gesetzlich zulässig.\n" #: src/main.cxx:1377 src/main.cxx:1419 src/main.cxx:1443 src/main.cxx:1457 msgid "Could not make directory " msgstr "Konnte kein Verzeichnis erstellen" #: src/dialogs/fl_digi.cxx:156 msgid "Log all RX/TX text" msgstr "RX/TX Text aufzeichnen" #: src/dialogs/fl_digi.cxx:157 src/misc/debug.cxx:103 msgid "Rig control" msgstr "Radio Steuerung" #: src/dialogs/fl_digi.cxx:158 src/dialogs/fl_digi.cxx:5455 msgid "Op &Mode" msgstr "Betriebsart" #: src/dialogs/fl_digi.cxx:159 msgid "Show fewer modes" msgstr "Weniger Betriebsarten anzeigen" #: src/dialogs/fl_digi.cxx:160 msgid "Show all modes" msgstr "Zeige alle Betriebssarten" #: src/dialogs/fl_digi.cxx:164 msgid "&View" msgstr "Ansicht" #: src/dialogs/fl_digi.cxx:165 msgid "&MFSK Image" msgstr "&MFSK Bilder" #: src/dialogs/fl_digi.cxx:166 msgid "&Weather Fax Image RX" msgstr "&Wetter Fax Bilder RX" #: src/dialogs/fl_digi.cxx:167 msgid "&Weather Fax Image TX" msgstr "&Wetter Fax Bilder TX" #: src/dialogs/fl_digi.cxx:168 src/dialogs/confdialog.cxx:5193 msgid "Contest" msgstr "Contest" #: src/dialogs/fl_digi.cxx:169 msgid "&Contest fields" msgstr "&Contest Felder" #: src/dialogs/fl_digi.cxx:170 msgid "C&ountries" msgstr "Länder" #: src/dialogs/fl_digi.cxx:171 msgid "&UI" msgstr "GUI" #: src/dialogs/fl_digi.cxx:172 msgid "Full" msgstr "Vollständig" #: src/dialogs/fl_digi.cxx:173 src/waterfall/waterfall.cxx:2119 #: src/dialogs/confdialog.cxx:5103 src/dialogs/confdialog.cxx:9806 #: src/dialogs/confdialog.cxx:9836 msgid "None" msgstr "Keine" #: src/dialogs/fl_digi.cxx:174 msgid "Rig control and logging" msgstr "Radio Steuerung und Logging" #: src/dialogs/fl_digi.cxx:175 msgid "Rig control and contest" msgstr "Radio Steuerung und Contest" #: src/dialogs/fl_digi.cxx:176 msgid "Docked scope" msgstr "Angedocktes Scope" #: src/dialogs/fl_digi.cxx:177 msgid "Minimal controls" msgstr "Minimale Steuerungselemente" #: src/dialogs/fl_digi.cxx:178 msgid "Show channels" msgstr "Zeige Kanäle" #: src/dialogs/fl_digi.cxx:180 msgid "Connect to server" msgstr "Mit Server verbinden" #: src/dialogs/fl_digi.cxx:591 src/dialogs/fl_digi.cxx:606 #: src/dialogs/fl_digi.cxx:615 src/dialogs/fl_digi.cxx:3354 #: src/dialogs/fl_digi.cxx:3411 src/dialogs/fl_digi.cxx:3474 #: src/dialogs/fl_digi.cxx:5470 src/dialogs/fl_digi.cxx:5514 #: src/dialogs/fl_digi.cxx:5545 msgid "Custom..." msgstr "Individuell" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2763 msgid "Save changed macros?" msgstr "Geänderte Makros speichern?" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2415 #: src/dialogs/fl_digi.cxx:2477 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 #: src/dialogs/fl_digi.cxx:3892 src/logbook/logsupport.cxx:585 #: src/misc/configuration.cxx:698 src/dialogs/font_browser.cxx:137 #: src/logbook/lgbook.cxx:447 src/logbook/lgbook.cxx:1056 msgid "Cancel" msgstr "Abbrechen" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 #: src/dialogs/fl_digi.cxx:3579 src/dialogs/fl_digi.cxx:4643 #: src/dialogs/fl_digi.cxx:4810 src/dialogs/fl_digi.cxx:4915 #: src/logbook/logsupport.cxx:584 src/dialogs/confdialog.cxx:10249 msgid "Save" msgstr "Speichern" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 msgid "Don't save" msgstr "Nicht speichern" #: src/dialogs/fl_digi.cxx:1749 msgid "No file name given" msgstr "Kein Dateiname angegeben" #: src/dialogs/fl_digi.cxx:1752 msgid "Unsupported format" msgstr "Nicht unterstützes Format" #: src/dialogs/fl_digi.cxx:1755 msgid "channels != 1" msgstr "Kanäle =! 1" #: src/dialogs/fl_digi.cxx:1758 msgid "unknown wave file error" msgstr "Unbekannter wave file Fehler" #: src/dialogs/fl_digi.cxx:1765 msgid "Spotting disabled" msgstr "Spotting deaktiviert" #: src/dialogs/fl_digi.cxx:1814 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Konnte keinen Web Browser starten:\n" "%s\n" "\n" "Diese Adresse manuell öffnen:\n" "%s" #: src/dialogs/fl_digi.cxx:1827 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Konnte Adresse nicht öffnen:\n" "%s\n" #: src/dialogs/fl_digi.cxx:1878 msgid "Checking for updates..." msgstr "Überprüfe auf verfügbare Updates..." #: src/dialogs/fl_digi.cxx:1893 #, c-format msgid "" "Could not check for updates:\n" "%s" msgstr "" "Konnte nicht nach Updates suchen:\n" "%s" #: src/dialogs/fl_digi.cxx:1897 #, c-format msgid "" "Version %s is available at\n" "\n" "%s\n" "\n" "What would you like to do?" msgstr "" "Version %s ist verfügbar\n" "\n" "%s\n" "Was kann ich für Sie tun?" #: src/dialogs/fl_digi.cxx:1898 src/dialogs/Viewer.cxx:304 #: src/misc/macroedit.cxx:419 src/misc/newinstall.cxx:391 #: src/mfsk/mfsk-pic.cxx:342 src/spot/notify.cxx:519 src/spot/notify.cxx:523 #: src/dialogs/confdialog.cxx:10252 msgid "Close" msgstr "Schließen " #: src/dialogs/fl_digi.cxx:1898 msgid "Visit URL" msgstr "Adresse im Browser anzeigen" #: src/dialogs/fl_digi.cxx:1898 msgid "Copy URL" msgstr "Adresse kopieren" #: src/dialogs/fl_digi.cxx:1910 msgid "You are running the latest version" msgstr "Sie arbeiten bereits mit der neuesten Version" #: src/dialogs/fl_digi.cxx:1976 msgid "Sunspot creation underway!" msgstr "" #: src/dialogs/fl_digi.cxx:1983 msgid "Audio device information is only available for the PortAudio backend" msgstr "Audiogerät Information nur für PortAudio Backends verfügbar" #: src/dialogs/fl_digi.cxx:1992 msgid "Capture device" msgstr "Aufnahmegerät" #: src/dialogs/fl_digi.cxx:1993 msgid "Playback device" msgstr "Wiedergabegerät" #: src/dialogs/fl_digi.cxx:1997 msgid "Capture and playback devices" msgstr "Aufnahme- und Wiedergabegerät" #: src/dialogs/fl_digi.cxx:2043 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: existiert nicht, soll es (neu) erstellt werden?" #: src/dialogs/fl_digi.cxx:2043 src/dialogs/fl_digi.cxx:2796 #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 #: src/logbook/logsupport.cxx:251 src/logbook/logsupport.cxx:1047 #: src/misc/configuration.cxx:700 src/soundcard/sound.cxx:306 msgid "No" msgstr "Nein" #: src/dialogs/fl_digi.cxx:2043 src/dialogs/fl_digi.cxx:2796 #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 #: src/logbook/logsupport.cxx:251 src/logbook/logsupport.cxx:1047 #: src/misc/configuration.cxx:700 src/soundcard/sound.cxx:306 msgid "Yes" msgstr "Ja" #: src/dialogs/fl_digi.cxx:2415 msgid "Clear log fields?" msgstr "Log Einträge löschen?" #: src/dialogs/fl_digi.cxx:2415 src/misc/configuration.cxx:698 #: src/logbook/lgbook.cxx:444 src/logbook/lgbook.cxx:1053 msgid "OK" msgstr "Okay" #: src/dialogs/fl_digi.cxx:2430 msgid "Enter a CALL !" msgstr "Bitte Rufzeichen eingeben!" #: src/dialogs/fl_digi.cxx:2477 src/dialogs/fl_digi.cxx:3892 msgid "Confirm" msgstr "Bestätigung" #: src/dialogs/fl_digi.cxx:2751 msgid "Save changed configuration?" msgstr "Geänderte Einstellungen speichern?" #: src/dialogs/fl_digi.cxx:2775 msgid "Save current log entry?" msgstr "Aktuellen Log Eintrag speichern?" #: src/dialogs/fl_digi.cxx:2796 msgid "Really want to quit?" msgstr "Möchten Sie wirklich beenden?" #: src/dialogs/fl_digi.cxx:3311 src/dialogs/fl_digi.cxx:5451 msgid "&File" msgstr "Datei" #: src/dialogs/fl_digi.cxx:3313 msgid "Folders" msgstr "Ordner" #: src/dialogs/fl_digi.cxx:3314 msgid "Fldigi config..." msgstr "Fldigi Konfiguration..." #: src/dialogs/fl_digi.cxx:3315 msgid "FLMSG files..." msgstr "FLMSG Dateien..." #: src/dialogs/fl_digi.cxx:3316 msgid "NBEMS files..." msgstr "NBEMS Dateien..." #: src/dialogs/fl_digi.cxx:3317 msgid "Data files..." msgstr "Daten Dateien..." #: src/dialogs/fl_digi.cxx:3320 src/dialogs/confdialog.cxx:5617 msgid "Macros" msgstr "Makros" #: src/dialogs/fl_digi.cxx:3321 msgid "Open ..." msgstr "Öffnen ..." #: src/dialogs/fl_digi.cxx:3322 msgid "Save ..." msgstr "Speichern ..." #: src/dialogs/fl_digi.cxx:3325 msgid "Text Capture" msgstr "Texterfassung" #: src/dialogs/fl_digi.cxx:3330 src/misc/debug.cxx:101 #: src/dialogs/confdialog.cxx:8654 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:3331 msgid "RX capture" msgstr "Empfangs Mitschnitt" #: src/dialogs/fl_digi.cxx:3332 msgid "TX generate" msgstr "" #: src/dialogs/fl_digi.cxx:3333 src/dialogs/confdialog.cxx:8754 msgid "Playback" msgstr "Wiedergabe" #: src/dialogs/fl_digi.cxx:3337 src/dialogs/fl_digi.cxx:5452 msgid "Exit" msgstr "Beenden" #: src/dialogs/fl_digi.cxx:3518 src/dialogs/fl_digi.cxx:5585 msgid "&Configure" msgstr "Konfiguration" #: src/dialogs/fl_digi.cxx:3519 src/dialogs/confdialog.cxx:4937 msgid "Operator" msgstr "Benutzer" #: src/dialogs/fl_digi.cxx:3520 msgid "Colors && Fonts" msgstr "Farben && Schriftart" #: src/dialogs/fl_digi.cxx:3521 msgid "User Interface" msgstr "GUI" #: src/dialogs/fl_digi.cxx:3522 src/dialogs/fl_digi.cxx:3556 #: src/dialogs/fl_digi.cxx:5586 src/dialogs/confdialog.cxx:6112 msgid "Waterfall" msgstr "Wasserfall" #: src/dialogs/fl_digi.cxx:3523 msgid "Waterfall controls" msgstr "Wasserfall Einstellungen" #: src/dialogs/fl_digi.cxx:3525 src/dialogs/fl_digi.cxx:5589 #: src/dialogs/confdialog.cxx:6489 msgid "Modems" msgstr "Modems" #: src/dialogs/fl_digi.cxx:3527 src/dialogs/fl_digi.cxx:5588 msgid "Sound Card" msgstr "Soundkarte" #: src/dialogs/fl_digi.cxx:3528 src/dialogs/fl_digi.cxx:5590 msgid "IDs" msgstr "IDs" #: src/dialogs/fl_digi.cxx:3529 src/dialogs/confdialog.cxx:9220 msgid "Misc" msgstr "Diverses" #: src/dialogs/fl_digi.cxx:3530 src/dialogs/confdialog.cxx:10038 msgid "Autostart" msgstr "Autostart" #: src/dialogs/fl_digi.cxx:3531 src/dialogs/fl_digi.cxx:5591 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Mitteilungen" #: src/dialogs/fl_digi.cxx:3533 msgid "QRZ/eQSL" msgstr "QRZ/eQSL" #: src/dialogs/fl_digi.cxx:3534 src/dialogs/fl_digi.cxx:5592 msgid "Save Config" msgstr "Einstellungen speichern" #: src/dialogs/fl_digi.cxx:3539 msgid "View/Hide Channels" msgstr "Kanäle anzeigen/verbergen" #: src/dialogs/fl_digi.cxx:3541 msgid "Floating scope" msgstr "Oszilloskop" #: src/dialogs/fl_digi.cxx:3545 msgid "Signal browser" msgstr "Signal Browser" #: src/dialogs/fl_digi.cxx:3548 msgid "Controls" msgstr "Bedienelemente" #: src/dialogs/fl_digi.cxx:3563 msgid "&Logbook" msgstr "&Logbuch" #: src/dialogs/fl_digi.cxx:3564 msgid "View" msgstr "Anzeigen" #: src/dialogs/fl_digi.cxx:3566 msgid "ADIF" msgstr "ADIF" #: src/dialogs/fl_digi.cxx:3567 msgid "Merge..." msgstr "Zusammenführen..." #: src/dialogs/fl_digi.cxx:3568 msgid "Export..." msgstr "Exportieren..." #: src/dialogs/fl_digi.cxx:3571 msgid "Reports" msgstr "Reporte" #: src/dialogs/fl_digi.cxx:3572 msgid "Text..." msgstr "Text..." #: src/dialogs/fl_digi.cxx:3573 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:3574 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:3577 src/logbook/logsupport.cxx:593 #: src/logbook/lgbook.cxx:960 msgid "New" msgstr "Neu" #: src/dialogs/fl_digi.cxx:3578 src/dialogs/confdialog.cxx:8200 msgid "Open..." msgstr "Öffnen" #: src/dialogs/fl_digi.cxx:3586 msgid "&Help" msgstr "&Hilfe" #: src/dialogs/fl_digi.cxx:3589 msgid "Create sunspots" msgstr "Sonnenflecke erstellen" #: src/dialogs/fl_digi.cxx:3591 msgid "Beginners' Guide" msgstr "Leitfaden für Anfänger" #: src/dialogs/fl_digi.cxx:3592 msgid "Online documentation..." msgstr "Online Dokumentation (Englisch)..." #: src/dialogs/fl_digi.cxx:3593 msgid "Fldigi web site..." msgstr "Fldigi Webseite..." #: src/dialogs/fl_digi.cxx:3594 msgid "Reception reports..." msgstr "Empfangsberichte..." #: src/dialogs/fl_digi.cxx:3595 msgid "Command line options" msgstr "Befehlszeilenoptionen" #: src/dialogs/fl_digi.cxx:3596 msgid "Audio device info" msgstr "Audio Gerät Informationen" #: src/dialogs/fl_digi.cxx:3597 msgid "Build info" msgstr "Informationen zur Kompilierung" #: src/dialogs/fl_digi.cxx:3598 src/misc/debug.cxx:137 msgid "Event log" msgstr "Ereignisprotokoll" #: src/dialogs/fl_digi.cxx:3599 msgid "Check for updates..." msgstr "Überprüfe auf Updates..." #: src/dialogs/fl_digi.cxx:3600 msgid "&About" msgstr "Über" #: src/dialogs/fl_digi.cxx:3834 msgid "waterfall-only mode" msgstr "Nur Wasserfall Modus" #: src/dialogs/fl_digi.cxx:3836 msgid "NO CALLSIGN SET" msgstr "KEIN RUFZEICHEN ANGEGEBEN" #: src/dialogs/fl_digi.cxx:3851 msgid "Close List" msgstr "Liste schließen" #: src/dialogs/fl_digi.cxx:3861 src/dialogs/fl_digi.cxx:4491 #: src/dialogs/fl_digi.cxx:4789 src/dialogs/fl_digi.cxx:4901 msgid "Open List" msgstr "Liste öffnen" #: src/dialogs/fl_digi.cxx:3892 msgid "Clear list?" msgstr "Liste löschen?" #: src/dialogs/fl_digi.cxx:3925 msgid "report" msgstr "Bericht" #: src/dialogs/fl_digi.cxx:3925 msgid "reports" msgstr "Berichte" #: src/dialogs/fl_digi.cxx:3935 msgid "Recent activity for grid" msgstr "Neueste Aktivität für Grid" #: src/dialogs/fl_digi.cxx:4485 msgid "No rig specified" msgstr "Kein Radio ausgewählt" #: src/dialogs/fl_digi.cxx:4562 src/spot/notify.cxx:215 #: src/dialogs/confdialog.cxx:5181 msgid "Select" msgstr "Auswählen" #: src/dialogs/fl_digi.cxx:4569 msgid "Add current frequency" msgstr "Aktuelle Frequenz hinzufügen" #: src/dialogs/fl_digi.cxx:4576 msgid "Clear list" msgstr "Liste löschen" #: src/dialogs/fl_digi.cxx:4583 msgid "Delete from list" msgstr "Aus Liste löschen" #: src/dialogs/fl_digi.cxx:4603 msgid "Select operating parameters" msgstr "Wählen der Betriebsparameter" #: src/dialogs/fl_digi.cxx:4629 src/dialogs/fl_digi.cxx:4796 msgid "QRZ" msgstr "QRZ" #: src/dialogs/fl_digi.cxx:4636 src/dialogs/fl_digi.cxx:4803 #: src/dialogs/fl_digi.cxx:4908 src/dialogs/fl_digi.cxx:5124 #: src/dialogs/Viewer.cxx:312 src/widgets/FTextView.cxx:480 #: src/widgets/FTextView.cxx:645 src/widgets/flinput2.cxx:47 #: src/dialogs/confdialog.cxx:7570 msgid "Clear" msgstr "Löschen" #: src/dialogs/fl_digi.cxx:4655 src/logbook/lgbook.cxx:467 #: src/logbook/lgbook.cxx:1079 msgid "Freq" msgstr "Freq" #: src/dialogs/fl_digi.cxx:4657 msgid "frequency kHz" msgstr "Frequenz kHz" #: src/dialogs/fl_digi.cxx:4660 src/dialogs/fl_digi.cxx:4812 #: src/dialogs/fl_digi.cxx:4918 msgid "On" msgstr "On" #: src/dialogs/fl_digi.cxx:4661 msgid "Press to update QSO start time" msgstr "Klick um QSO Startzeit zu aktualisieren" #: src/dialogs/fl_digi.cxx:4665 msgid "QSO start time" msgstr "QSO Startzeit" #: src/dialogs/fl_digi.cxx:4669 src/dialogs/fl_digi.cxx:4825 #: src/dialogs/fl_digi.cxx:4919 msgid "Off" msgstr "Aus" #: src/dialogs/fl_digi.cxx:4670 msgid "QSO end time" msgstr "QSO Beendet" #: src/dialogs/fl_digi.cxx:4674 src/dialogs/fl_digi.cxx:4842 #: src/logbook/lgbook.cxx:620 msgid "In" msgstr "Ein" #: src/dialogs/fl_digi.cxx:4678 src/dialogs/fl_digi.cxx:4850 #: src/logbook/lgbook.cxx:706 msgid "Out" msgstr "Aus" #: src/dialogs/fl_digi.cxx:4682 src/dialogs/fl_digi.cxx:4834 #: src/dialogs/fl_digi.cxx:4920 src/widgets/FTextRXTX.cxx:105 #: src/logbook/lgbook.cxx:459 src/logbook/lgbook.cxx:596 #: src/logbook/lgbook.cxx:1075 msgid "Call" msgstr "Call" #: src/dialogs/fl_digi.cxx:4683 msgid "call sign" msgstr "Call" #: src/dialogs/fl_digi.cxx:4686 msgid "Op" msgstr "Op" #: src/dialogs/fl_digi.cxx:4687 msgid "Operator name" msgstr "Benutzer Name" #: src/dialogs/fl_digi.cxx:4691 msgid "Azimuth" msgstr "Azimuth" #: src/dialogs/fl_digi.cxx:4697 msgid "City" msgstr "Stadt" #: src/dialogs/fl_digi.cxx:4701 msgid "US State" msgstr "US Bundesstaat" #: src/dialogs/fl_digi.cxx:4705 msgid "Can. Province" msgstr "Kanadische Provinz" #: src/dialogs/fl_digi.cxx:4709 msgid "Maidenhead Locator" msgstr "Maidenhead Locator" #: src/dialogs/fl_digi.cxx:4720 src/dialogs/fl_digi.cxx:4969 msgid "Sent serial number (read only)" msgstr "Sende Fortlaufende Nummer Contest (nur lesen)" #: src/dialogs/fl_digi.cxx:4725 src/dialogs/fl_digi.cxx:4960 msgid "Received serial number" msgstr "Empfangene Seriennummer" #: src/dialogs/fl_digi.cxx:4729 src/dialogs/fl_digi.cxx:4951 msgid "Contest exchange in" msgstr "Contest Austausch In" #: src/dialogs/fl_digi.cxx:4744 src/spot/notify.cxx:569 #: src/widgets/FTextRXTX.cxx:110 src/logbook/lgbook.cxx:521 #: src/logbook/lgbook.cxx:767 msgid "Country" msgstr "Land" #: src/dialogs/fl_digi.cxx:4750 src/logbook/lgbook.cxx:524 #: src/logbook/lgbook.cxx:791 msgid "Notes" msgstr "Bemerkungen" #: src/dialogs/fl_digi.cxx:4816 src/dialogs/fl_digi.cxx:4975 msgid "Press to update" msgstr "Klicken für update" #: src/dialogs/fl_digi.cxx:4822 src/dialogs/fl_digi.cxx:4981 #: src/logbook/lgbook.cxx:584 msgid "Time On" msgstr "Startzeit" #: src/dialogs/fl_digi.cxx:4831 src/dialogs/fl_digi.cxx:4989 #: src/logbook/lgbook.cxx:658 msgid "Time Off" msgstr "Endzeit" #: src/dialogs/fl_digi.cxx:4840 src/dialogs/fl_digi.cxx:4936 #: src/dialogs/fl_digi.cxx:5289 msgid "Other call" msgstr "anderes Rufzeichen" #: src/dialogs/fl_digi.cxx:4848 msgid "Received RST" msgstr "Empfangenes RST" #: src/dialogs/fl_digi.cxx:4856 msgid "Sent RST" msgstr "Gesendetes RST" #: src/dialogs/fl_digi.cxx:4858 msgid "Nm" msgstr "Nm" #: src/dialogs/fl_digi.cxx:4865 msgid "Other name" msgstr "Anderer Name" #: src/dialogs/fl_digi.cxx:4921 msgid "# S" msgstr "# S" #: src/dialogs/fl_digi.cxx:4922 msgid "# R" msgstr "# R" #: src/dialogs/fl_digi.cxx:4923 msgid "Ex" msgstr "Ex" #: src/dialogs/fl_digi.cxx:5029 msgid "" "Left Click - execute\n" "Shift-Fkey - execute\n" "Right Click - edit" msgstr "" "Links Klick - ausführen\n" "Shift-Fkey - ausführen\n" "Rechts Klick - editieren" #: src/dialogs/fl_digi.cxx:5036 msgid "Shift-key macro set" msgstr "Shift-Taste Makro setzen" #: src/dialogs/fl_digi.cxx:5083 msgid "" "Left click - select\n" "Right click - clear line" msgstr "" "Klick links - Auswählen\n" "Klick rechts - Zeile löschen" #: src/dialogs/fl_digi.cxx:5099 msgid "seek - regular expression" msgstr "Suche - regulärer Ausdruck" #: src/dialogs/fl_digi.cxx:5120 src/dialogs/Viewer.cxx:322 msgid "Set Viewer Squelch" msgstr "Rauschsperre für Viewer setzen" #: src/dialogs/fl_digi.cxx:5207 msgid "" "Left Click - execute\n" "Fkey - execute\n" "Right Click - edit" msgstr "" "Klick links - Ausführen\n" "Fkey - Ausführen\n" "Klick rechts - Editieren" #: src/dialogs/fl_digi.cxx:5214 msgid "Primary macro set" msgstr "Primäres Makro aktivieren" #: src/dialogs/fl_digi.cxx:5231 src/dialogs/fl_digi.cxx:5813 msgid "Detected signal level" msgstr "Erkannter Signalpegel" #: src/dialogs/fl_digi.cxx:5242 src/dialogs/fl_digi.cxx:5825 #: src/waterfall/waterfall.cxx:2120 msgid "Squelch level" msgstr "Rauschsperren Pegel" #: src/dialogs/fl_digi.cxx:5256 src/dialogs/fl_digi.cxx:5839 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Links Klick: Betiebsart ändern\n" "Rechts Klick: Konfigurieren" #: src/dialogs/fl_digi.cxx:5266 src/dialogs/fl_digi.cxx:5846 msgid "CW transmit WPM" msgstr "CW Sendegeschwidigkeit in WPM" #: src/dialogs/fl_digi.cxx:5272 src/dialogs/fl_digi.cxx:5853 msgid "Default WPM" msgstr "Standard WPM" #: src/dialogs/fl_digi.cxx:5311 src/dialogs/fl_digi.cxx:5885 msgid "Tx level attenuator (dB)" msgstr "Tx Dämpfung (dB)" #: src/dialogs/fl_digi.cxx:5335 src/dialogs/fl_digi.cxx:5908 msgid "Automatic Frequency Control" msgstr "AGC" #: src/dialogs/fl_digi.cxx:5338 src/dialogs/fl_digi.cxx:5911 msgid "Squelch" msgstr "Rauschsperre" #: src/dialogs/fl_digi.cxx:5381 src/dialogs/fl_digi.cxx:5723 msgid "Scope" msgstr "Oszilloskop" #: src/dialogs/fl_digi.cxx:5601 src/dialogs/Viewer.cxx:279 msgid "Signal Browser" msgstr "Signal Browser" #: src/dialogs/Viewer.cxx:283 msgid "Find: " msgstr "Finde" #: src/dialogs/Viewer.cxx:316 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Klick links um Text zu löschen\n" "Klick rechts für Frequenz reset" #: src/logbook/adif_io.cxx:233 #, c-format msgid "Empty ADIF logbook file %s" msgstr "Leere ADIF Logbuch Datei %s" #: src/logbook/adif_io.cxx:252 #, c-format msgid "Error reading %s" msgstr "Fehler beim lesen von %s" #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 msgid "Save changed Logbook?" msgstr "Geändertes Logbuch speichern?" #: src/logbook/logsupport.cxx:141 msgid "Export to CSV file" msgstr "In CSV Datei exportieren" #: src/logbook/logsupport.cxx:167 msgid "Export to fixed field text file" msgstr "Exportieren in Datei mit festen Feldern" #: src/logbook/logsupport.cxx:194 msgid "Export to ADIF file" msgstr "In ADIF Datei exportieren" #: src/logbook/logsupport.cxx:251 msgid "Create New Logbook?" msgstr "Neues Logbuch erstellen?" #: src/logbook/logsupport.cxx:280 msgid "Open logbook file" msgstr "Logbuch Datei oeffnen" #: src/logbook/logsupport.cxx:303 msgid "Save logbook file" msgstr "Logbuch Datei speichern" #: src/logbook/logsupport.cxx:497 msgid "Merge ADIF file" msgstr "ADIF Dateien zusammenfuehren" #: src/logbook/logsupport.cxx:594 src/spot/notify.cxx:203 #: src/spot/notify.cxx:517 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:967 msgid "Update" msgstr "Update" #: src/logbook/logsupport.cxx:1046 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Eintrag \"%s\" wirklich löschen?" #: src/logbook/logsupport.cxx:1433 msgid "Create cabrillo report" msgstr "Cabrillo Report erzeugen" #: src/logger/rx_extract.cxx:55 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:60 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:270 msgid "Could not start flmsg" msgstr "Konnte flmsg nicht starten" #: src/logger/rx_extract.cxx:337 src/logger/rx_extract.cxx:340 #: src/dialogs/confdialog.cxx:9287 msgid "Locate flmsg executable" msgstr "flmsg Datei finden" #: src/logger/rx_extract.cxx:337 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:340 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:415 msgid "Locate executable" msgstr "Ausführbare Datei finden" #: src/logger/rx_extract.cxx:415 msgid "*.exe" msgstr "*.exe" #: src/logger/rx_extract.cxx:425 msgid "Locate binary" msgstr "" #: src/logger/rx_extract.cxx:425 msgid "*" msgstr "*" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Empfangenen Text speichern, Zeichenweise in folgende Datei:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:508 msgid "Rig mode" msgstr "Radio Modus" #: src/misc/configuration.cxx:509 msgid "Always LSB" msgstr "Immer LSB" #: src/misc/configuration.cxx:510 msgid "Always USB" msgstr "Immer USB" #: src/misc/configuration.cxx:695 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Alle Einstellungen auf Standard zurücksetzen?\n" "\n" "Reset wird mit dem nächsten Neustart von Fldigi wirksam\n" "Die Dateien: fldigi_def.xml und fldigi.prefs werden gelöscht!\n" #: src/misc/configuration.cxx:700 msgid "Confirm RESET" msgstr "Bitte bestätigen für Reset" #: src/misc/debug.cxx:91 msgid "Quiet" msgstr "Weniger Einträge" #: src/misc/debug.cxx:91 msgid "Error" msgstr "Fehler" #: src/misc/debug.cxx:91 msgid "Warning" msgstr "Warnung" #: src/misc/debug.cxx:91 msgid "Info" msgstr "Information" #: src/misc/debug.cxx:91 msgid "Verbose" msgstr "Ausführlich" #: src/misc/debug.cxx:91 msgid "Debug" msgstr "Debug" #: src/misc/debug.cxx:100 msgid "ARQ control" msgstr "ARQ Steuerung" #: src/misc/debug.cxx:102 src/waterfall/waterfall.cxx:2121 msgid "Modem" msgstr "Modem" #: src/misc/debug.cxx:104 msgid "RPC" msgstr "RPC" #: src/misc/debug.cxx:105 msgid "Spotter" msgstr "Spotter" #: src/misc/debug.cxx:106 msgid "Other" msgstr "Andere" #: src/misc/debug.cxx:141 msgid "Log sources" msgstr "Log Datei Quelle" #: src/misc/debug.cxx:146 msgid "Change log level" msgstr "Log Level ändern" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "\tMeine Frequenz" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "\tBetriebsart" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "\tMein Rufzeichen" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "\tMein Locator" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "\tMein Name" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "\tMein QTH" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "\tMein RST" #: src/misc/macroedit.cxx:78 msgid "\tmy antenna" msgstr "\tMeine Antenne" #: src/misc/macroedit.cxx:79 msgid "\toperating band" msgstr "\tgenutztes Band" #: src/misc/macroedit.cxx:81 msgid "\tFldigi version" msgstr "\tFldigi version" #: src/misc/macroedit.cxx:84 msgid "\tother call" msgstr "\tRufzeichen der andere Station" #: src/misc/macroedit.cxx:85 msgid "\tS/N etc." msgstr "\tS/N etc." #: src/misc/macroedit.cxx:86 msgid "\tIMD etc." msgstr "\tIMD etc." #: src/misc/macroedit.cxx:87 msgid "\tother locator" msgstr "\tLocator der andere Station" #: src/misc/macroedit.cxx:88 msgid "\tother name" msgstr "\tName des anderen OP" #: src/misc/macroedit.cxx:89 msgid "\tother QTH" msgstr "\tQTH der anderen Station" #: src/misc/macroedit.cxx:90 msgid "\tother RST" msgstr "\tRST der anderen Station" #: src/misc/macroedit.cxx:91 msgid "\t# QSO recs" msgstr "\t# Anzahl QSO Einträge" #: src/misc/macroedit.cxx:92 msgid "\tnext QSO rec #" msgstr "\tNächster QSO Eintrag #" #: src/misc/macroedit.cxx:93 msgid "\tmap on google" msgstr "\tGoogle Karte" #: src/misc/macroedit.cxx:94 msgid "\tmap by value" msgstr "\tKarte mit Werten darstellen" #: src/misc/macroedit.cxx:97 msgid "\tclear RX pane" msgstr "\tEmpfangsbereich löschen" #: src/misc/macroedit.cxx:98 msgid "\tclear TX pane" msgstr "\tSendebereich löschen" #: src/misc/macroedit.cxx:101 msgid "\ttext to NAME/QTH" msgstr "\tText nach NAME/QTH" #: src/misc/macroedit.cxx:105 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk On, Off, Toggle" #: src/misc/macroedit.cxx:109 msgid "\tclear log fields" msgstr "\tLog Felder löschen" #: src/misc/macroedit.cxx:110 msgid "\tsave QSO data" msgstr "\tQSO Daten speichern" #: src/misc/macroedit.cxx:111 msgid "\tsaveQSO data, append msg to notes" msgstr "\tsaveQSO data, append msg to notes" #: src/misc/macroedit.cxx:112 msgid "\tlog at xmt time" msgstr "\tLoggen mit xmt Zeit" #: src/misc/macroedit.cxx:113 msgid "\tsaveQSO data, append msg to notes" msgstr "\tQSO Daten speichern, und Nachricht anhängen" #: src/misc/macroedit.cxx:114 msgid "\tlog eQSL" msgstr "\teQSL loggen" #: src/misc/macroedit.cxx:115 msgid "\tlog eQSL optional msg" msgstr "\tlogge eQSL mit optionaler Nachricht" #: src/misc/macroedit.cxx:118 msgid "\tQSO time (HHMM))" msgstr "\tQSO Zeit (SSMM))" #: src/misc/macroedit.cxx:119 msgid "\tLDT in iso-8601 format" msgstr "\tLDT im ISO-8601 Format" #: src/misc/macroedit.cxx:120 msgid "\tLocal datetime" msgstr "\tLokales Datum/Uhrzeit" #: src/misc/macroedit.cxx:121 msgid "\tZDT in iso-8601 format" msgstr "\tZDT im ISO-8601 Format" #: src/misc/macroedit.cxx:122 msgid "\tUTC datetime" msgstr "\tUTC Datum und Zeit" #: src/misc/macroedit.cxx:123 msgid "\tlocal time HHMM" msgstr "\tLokale Zeit SSMM" #: src/misc/macroedit.cxx:124 msgid "\tzulu time HHMMZ" msgstr "\tZulu Zeit SSMMz" #: src/misc/macroedit.cxx:125 msgid "\tlocal date YYYY-MM-DD" msgstr "\tLokale Zeit JJJ-MM-TT" #: src/misc/macroedit.cxx:126 msgid "\tzulu date YYYY-MM-DD Z" msgstr "\tZulu Datum JJJJ-MM-TT Z" #: src/misc/macroedit.cxx:127 msgid "\tget weather data" msgstr "\tWetterdaten abrufen" #: src/misc/macroedit.cxx:128 msgid "\tget weather data for station" msgstr "\tWetterdaten für Station abrufen" #: src/misc/macroedit.cxx:131 msgid "\tcontest counter" msgstr "\tContestzähler" #: src/misc/macroedit.cxx:132 msgid "\tdecrement counter" msgstr "\tZähler verringern" #: src/misc/macroedit.cxx:133 msgid "\tincrement counter" msgstr "\tZähler erhöhen" #: src/misc/macroedit.cxx:134 msgid "\texchange in" msgstr "\tAustausch erhalten" #: src/misc/macroedit.cxx:135 msgid "\texchange out" msgstr "\tAustausch gegeben" #: src/misc/macroedit.cxx:136 msgid "\texchange begin" msgstr "\tAustausch beginnt" #: src/misc/macroedit.cxx:137 msgid "\texchange end" msgstr "\tAustausch endet" #: src/misc/macroedit.cxx:138 msgid "\tsave contest out" msgstr "\tAustaucsh gegeben speichern" #: src/misc/macroedit.cxx:141 msgid "\treceive" msgstr "\tEmpfang" #: src/misc/macroedit.cxx:142 msgid "\ttransmit" msgstr "\tSenden" #: src/misc/macroedit.cxx:143 msgid "\ttoggle T/R" msgstr "\tUmschalten T/R" #: src/misc/macroedit.cxx:144 msgid "\tsearch UP for signal" msgstr "\tSuche aufwärts nach Signal" #: src/misc/macroedit.cxx:145 msgid "\tsearch DOWN for signal" msgstr "\tSuche abwärts nach Signal" #: src/misc/macroedit.cxx:146 msgid "\treturn to sweet spot" msgstr "" #: src/misc/macroedit.cxx:147 msgid "\tmove to freq NNNN Hz" msgstr "\tGehe zu Frequenz NNNN Hz" #: src/misc/macroedit.cxx:148 msgid "\tleft-clk QSY button" msgstr "\tLinks Klick QSY Button" #: src/misc/macroedit.cxx:149 msgid "\tright-clk QSY button" msgstr "\tRechts Klick QSY Button" #: src/misc/macroedit.cxx:152 msgid "\tinsert QRG into Rx text" msgstr "\tQRG in RX Feld einfügen" #: src/misc/macroedit.cxx:155 msgid "\tqsy to kHz, Hz" msgstr "\tqsy um kHz, Hz" #: src/misc/macroedit.cxx:156 msgid "\tvalid xcvr mode" msgstr "\tGültiger TRX Modus" #: src/misc/macroedit.cxx:157 msgid "\tvalid xcvr filter width" msgstr "\tGültiger TRX Filter Breite" #: src/misc/macroedit.cxx:160 msgid "\tinsert text file" msgstr "\tTextdatei einfügen" #: src/misc/macroedit.cxx:161 msgid "\tinsert MFSK image" msgstr "\tMFSK Bild einfügen" #: src/misc/macroedit.cxx:164 msgid "\tpause transmit" msgstr "\tSendepause" #: src/misc/macroedit.cxx:165 msgid "\tidle signal for NN.nn sec" msgstr "\tRuhesignal für NN.nn sek" #: src/misc/macroedit.cxx:166 msgid "\trepeat every NN sec" msgstr "\tWiederhole alle NN sek" #: src/misc/macroedit.cxx:167 msgid "\ttune signal for NN sec" msgstr "\tAbstimmsignal für NN sek" #: src/misc/macroedit.cxx:168 msgid "\tdelay xmt for NN sec" msgstr "\txmt verzögern für NN sek" #: src/misc/macroedit.cxx:169 msgid "\trepeat macro continuously" msgstr "\tMakros kontinuierlich wiederholen" #: src/misc/macroedit.cxx:170 #, fuzzy msgid "\tschedule execution" msgstr "\tgeplante Ausführung" #: src/misc/macroedit.cxx:173 msgid "\t set xmt attenuator" msgstr "\tsetze xmt Abschwächer" #: src/misc/macroedit.cxx:176 msgid "\tCW identifier" msgstr "\tCW Kennung" #: src/misc/macroedit.cxx:177 msgid "\tsend mode ID in video text" msgstr "\tSende Betriebsart ID in Video Text" #: src/misc/macroedit.cxx:178 msgid "\tvideo text" msgstr "\tVideo Text" #: src/misc/macroedit.cxx:179 msgid "\tTx RSID on,off,toggle" msgstr "\tTX RSID ein, aus, umschalten" #: src/misc/macroedit.cxx:180 msgid "\tRx RSID on,off,toggle" msgstr "\tRx RSID ein, aus, umschalten" #: src/misc/macroedit.cxx:181 msgid "\tTransmit |NN| successive RsID bursts" msgstr "\tSende |NN| aufeinanderfolgende RsID Signale" #: src/misc/macroedit.cxx:182 msgid "\t[Wait][Len](ms)" msgstr "\t[warten][länge](msek)" #: src/misc/macroedit.cxx:185 msgid "\tCW QSK post-timing" msgstr "" #: src/misc/macroedit.cxx:186 msgid "\tCW QSK pre-timing" msgstr "" #: src/misc/macroedit.cxx:187 msgid "\tCW rise time" msgstr "\tCW Anstiegszeit" #: src/misc/macroedit.cxx:188 msgid "\tCW WPM:Farnsworth" msgstr "\tCW WPM:Farnswoth" #: src/misc/macroedit.cxx:191 msgid "\tsend CAT cmd" msgstr "\tSende CAT Kommando" #: src/misc/macroedit.cxx:194 msgid "\tAFC on,off,toggle" msgstr "\tAFC ein, aus, umschalten" #: src/misc/macroedit.cxx:195 msgid "\tLOCK on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:196 msgid "\tRev on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:199 msgid "\tchange macro defs file" msgstr "\tMakro Definitionsdatei ändern" #: src/misc/macroedit.cxx:200 msgid "\tsave current macro file" msgstr "\tGegenwärtiges Makro speichern" #: src/misc/macroedit.cxx:203 msgid "\tuntransmitted comment" msgstr "\tnicht gesendeter Text" #: src/misc/macroedit.cxx:206 msgid "\tmodem timing test internal string" msgstr "" #: src/misc/macroedit.cxx:207 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:208 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:211 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:212 #, fuzzy msgid "\tWAV file; spec' file" msgstr "\tTextdatei einfügen" #: src/misc/macroedit.cxx:213 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:328 msgid "Text file to insert" msgstr "Textdatei einfügen" #: src/misc/macroedit.cxx:336 #, fuzzy msgid "Test text file" msgstr "\tTextdatei einfügen" #: src/misc/macroedit.cxx:344 msgid "MFSK image file" msgstr "MFSK Bild laden" #: src/misc/macroedit.cxx:351 msgid "Change to Macro file" msgstr "Wechseln zu Makrodatei" #: src/misc/macroedit.cxx:361 msgid "Executable file to insert" msgstr "Ausführbare Datei einfügen" #: src/misc/macroedit.cxx:391 msgid "Macro Text" msgstr "Makro Text" #: src/misc/macroedit.cxx:396 msgid "Select Tag" msgstr "Kennzeichnung auswählen" #: src/misc/macroedit.cxx:408 msgid "Macro Button Label" msgstr "Beschriftung für Button" #: src/misc/macroedit.cxx:416 msgid "Apply" msgstr "Anwenden" #: src/misc/macroedit.cxx:443 msgid "Macro editor - " msgstr "Makro Editor - " #: src/misc/macros.cxx:2786 msgid "Open macro file" msgstr "Makrodatei laden" #: src/misc/macros.cxx:2787 src/misc/macros.cxx:2825 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Fldigi Makro Definitions Datei\t*.{mdf}" #: src/misc/macros.cxx:2824 msgid "Save macro file" msgstr "Makrodatei speichern" #: src/misc/network.cxx:170 msgid "Aborted" msgstr "Abbruch" #: src/misc/network.cxx:170 msgid "Timed out" msgstr "Timeout" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "Fertig" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "Weiter " #: src/misc/newinstall.cxx:389 msgid "Back" msgstr "Zurück" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "Dieser Assistent wird Sie durch die grundlegenden Einstellungen führen" #: src/misc/newinstall.cxx:522 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "" "Sie können jederzeit eine Seite überspringen oder den Assistenten beenden" #: src/misc/newinstall.cxx:523 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" "Alle hier getätigten Einstellungen können später auch noch über das " "Konfigurationsmenu geändert werden" #: src/misc/newinstall.cxx:538 msgid "Fldigi configuration wizard" msgstr "Fldigi Konfigurations Assistent" #: src/mfsk/mfsk-pic.cxx:142 src/mfsk/mfsk-pic.cxx:146 #: src/mfsk/mfsk-pic.cxx:305 src/mfsk/mfsk-pic.cxx:308 msgid "Time needed: " msgstr "Zeitaufwand: " #: src/mfsk/mfsk-pic.cxx:175 msgid "Load image file" msgstr "Bild laden" #: src/mfsk/mfsk-pic.cxx:316 msgid "Send image" msgstr "Bild senden" #: src/mfsk/mfsk-pic.cxx:323 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "Bilddatei laden- oder hierher ziehen\n" "Unterstützte Dateitypen: PNG, JPEG, BMP" #: src/mfsk/mfsk-pic.cxx:327 msgid "Transfer speed, X1-normal" msgstr "Sende Geschwindigkeit, X1-normal" #: src/mfsk/mfsk-pic.cxx:339 msgid "Load" msgstr "Laden" #: src/waterfall/waterfall.cxx:1563 msgid "Waterfall / FFT / Scope" msgstr "Wasserfall / FFT / Oszilloskop" #: src/waterfall/waterfall.cxx:1573 msgid "Upper signal level (dB)" msgstr "Oberer Signalpegel(dB)" #: src/waterfall/waterfall.cxx:1584 msgid "Signal range (dB)" msgstr "Signalbereich (dB)" #: src/waterfall/waterfall.cxx:1590 msgid "Change waterfall scale" msgstr "Wasserfall Skala ändern" #: src/waterfall/waterfall.cxx:1595 msgid "Slew display lower in frequency" msgstr "" #: src/waterfall/waterfall.cxx:1600 msgid "Center display on signal" msgstr "Anzeige auf Signal zentrieren" #: src/waterfall/waterfall.cxx:1605 msgid "Slew display higher in frequency" msgstr "" #: src/waterfall/waterfall.cxx:1610 msgid "Waterfall drop speed" msgstr "Fallgeschwidigkeit des Wasserfalls" #: src/waterfall/waterfall.cxx:1620 msgid "Adjust cursor frequency" msgstr "Cursor Frequenz einstellen" #: src/waterfall/waterfall.cxx:1625 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Zentrum im Durchlassbereich\n" "Rechte Maustaste macht rückgängig" #: src/waterfall/waterfall.cxx:1631 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Speichere Betriebsart und Frequenz\n" "Rechts Klick für Liste" #: src/waterfall/waterfall.cxx:1641 msgid "Lock transmit frequency" msgstr "Sendefrequenz sperren" #: src/waterfall/waterfall.cxx:1650 src/dialogs/confdialog.cxx:5706 msgid "Reverse" msgstr "Umkehren" #: src/waterfall/waterfall.cxx:1657 msgid "Transmit/Receive" msgstr "Senden/Empfangen" #: src/waterfall/waterfall.cxx:2119 msgid "AFC range or BW" msgstr "AFC Bereich oder BW" #: src/waterfall/waterfall.cxx:2120 msgid "Signal search" msgstr "Signal suche" #: src/waterfall/waterfall.cxx:2121 msgid "Modem carrier" msgstr "Modem Träger" #: src/waterfall/waterfall.cxx:2121 msgid "Scroll" msgstr "Blättern" #: src/rigcontrol/FreqControl.cxx:136 msgid "" "Enter frequency or change with\n" "Left/Right/Up/Down/Pg_Up/Pg_Down" msgstr "" "Frequenz eingeben oder ändern mit\n" "Links/rechts/hoch/runter/Bild_hoch/Bild_runter" #: src/rigcontrol/rigsupport.cxx:469 msgid "Enter Xcvr Freq" msgstr "TRX Freq" #: src/rigcontrol/rigxml.cxx:946 msgid "Open rig xml file" msgstr "Radio xml Datei öffnen" #: src/rigcontrol/rigxml.cxx:946 msgid "Fldigi rig xml definition file\t*.xml" msgstr "Fldigi radio xml Definitions Datei" #: src/soundcard/sound.cxx:149 msgid "" "Waveform Audio Format\t*.wav\n" "AU\t*.{au,snd}\n" msgstr "" "Waveform Audio Format\t*.wav\n" "AU\t*.{au,snd}\n" #: src/soundcard/sound.cxx:152 msgid "Free Lossless Audio Codec\t*.flac" msgstr "Freier Lossless Audio Codec\t*.flac" #: src/soundcard/sound.cxx:158 src/soundcard/sound.cxx:160 msgid "Audio file" msgstr "Audio Datei" #: src/soundcard/sound.cxx:306 msgid "Playback continuous loop?" msgstr "Wiedergabe in Endlosschleife?" #: src/spot/notify.cxx:191 msgid "My callsign de CALL" msgstr "Mein Rufzeichen de CALL" #: src/spot/notify.cxx:192 msgid "Station heard twice" msgstr "Station zweimal gehört" #: src/spot/notify.cxx:193 msgid "Custom text search" msgstr "Indivduelle Volltextsuche" #: src/spot/notify.cxx:194 msgid "RSID reception" msgstr "RSID Empfang" #: src/spot/notify.cxx:202 msgid "Toggle" msgstr "Wechseln" #: src/spot/notify.cxx:204 src/spot/notify.cxx:516 msgid "Remove" msgstr "Entfernen" #: src/spot/notify.cxx:216 src/spot/notify.cxx:222 src/spot/notify.cxx:570 #: src/logbook/lgbook.cxx:548 src/logbook/lgbook.cxx:853 msgid "Continent" msgstr "Kontinent" #: src/spot/notify.cxx:217 src/spot/notify.cxx:223 src/logbook/lgbook.cxx:841 msgid "ITU zone" msgstr "ITU Zone" #: src/spot/notify.cxx:218 src/spot/notify.cxx:224 src/logbook/lgbook.cxx:829 msgid "CQ zone" msgstr "CQ Zone" #: src/spot/notify.cxx:219 src/spot/notify.cxx:225 msgid "All" msgstr "Alles" #: src/spot/notify.cxx:221 msgid "Deselect" msgstr "Deaktivieren" #: src/spot/notify.cxx:515 msgid "Add" msgstr "Hinzufügen" #: src/spot/notify.cxx:518 msgid "Test..." msgstr "Test..." #: src/spot/notify.cxx:521 src/widgets/FTextView.cxx:481 #: src/widgets/flinput2.cxx:48 msgid "Select All" msgstr "Alles wählen" #: src/spot/notify.cxx:522 src/logbook/lgbook.cxx:403 #: src/logbook/lgbook.cxx:453 src/logbook/lgbook.cxx:1045 #: src/logbook/lgbook.cxx:1119 msgid "Clear All" msgstr "Alles löschen" #: src/spot/notify.cxx:1095 msgid "The regular expression field must not be empty." msgstr "Das Feld 'regulärer Ausdruck' darf nicht leer sein." #: src/spot/notify.cxx:1101 msgid "The regular expression must be valid." msgstr "Der reguläre Ausdruck muss gültig sein." #: src/spot/notify.cxx:1108 msgid "Please set your callsign first." msgstr "Bitte zuerst das Rufzeichen eintragen" #: src/spot/notify.cxx:1245 msgid "Run program" msgstr "Programm ausführen" #: src/spot/notify.cxx:1278 msgid "" "Default test string is:\n" " \"" msgstr "" "Standard Testreihe ist:\n" " \"" #: src/spot/notify.cxx:1279 msgid "Enter test string or leave blank for default:" msgstr "Test String eingeben, oder freilassen für Standard" #: src/spot/notify.cxx:1290 msgid "This event's regular expression is invalid." msgstr "Der reguläre Ausdruck für dieses Ereignis ist ungültig" #: src/spot/notify.cxx:1297 msgid "The test string did not match this event's search pattern." msgstr "Die Testreihe entspricht nicht dem Suchmuster des Ereignisses" #: src/spot/notify.cxx:1315 msgid "Available substrings" msgstr "Verfügbare Teilreihen" #: src/spot/notify.cxx:1398 src/logbook/lgbook.cxx:1026 msgid "Frequency" msgstr "Frequenz" #: src/spot/notify.cxx:1400 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1023 msgid "Callsign" msgstr "Rufzeichen" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "Palette öffnen" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:126 msgid "Fldigi palette\t*.pal" msgstr "Fldigi Palette\t*.pal" #: src/waterfall/colorbox.cxx:112 src/waterfall/colorbox.cxx:137 msgid "Palette: " msgstr "Palette: " #: src/waterfall/colorbox.cxx:126 msgid "Save palette" msgstr "Farbpalette speichern" #: src/widgets/FTextRXTX.cxx:104 msgid "Look up call" msgstr "Rufzeichen nachschlagen" #: src/widgets/FTextRXTX.cxx:106 src/logbook/lgbook.cxx:463 #: src/logbook/lgbook.cxx:608 src/logbook/lgbook.cxx:1025 msgid "Name" msgstr "Name" #: src/widgets/FTextRXTX.cxx:107 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:108 src/dialogs/confdialog.cxx:5298 #: src/logbook/lgbook.cxx:512 msgid "State" msgstr "Staat" #: src/widgets/FTextRXTX.cxx:109 src/logbook/lgbook.cxx:518 msgid "Province" msgstr "Provinz" #: src/widgets/FTextRXTX.cxx:111 msgid "Locator" msgstr "Locator" #: src/widgets/FTextRXTX.cxx:112 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:113 src/dialogs/confdialog.cxx:5304 #: src/logbook/lgbook.cxx:539 src/logbook/lgbook.cxx:924 #: src/logbook/lgbook.cxx:1111 msgid "Exchange In" msgstr "Exchange In" #: src/widgets/FTextRXTX.cxx:114 src/dialogs/confdialog.cxx:5229 msgid "Serial number" msgstr "Seriennummer" #: src/widgets/FTextRXTX.cxx:115 msgid "Insert marker" msgstr "Markierung einfügen" #: src/widgets/FTextRXTX.cxx:123 msgid "Quick entry" msgstr "Schneller Eintrag" #: src/widgets/FTextRXTX.cxx:124 msgid "Scroll hints" msgstr "Scoll Hinweise" #: src/widgets/FTextRXTX.cxx:704 msgid " in " msgstr " in " #: src/widgets/FTextRXTX.cxx:706 msgid "Last QSO" msgstr "Letztes QSO" #: src/widgets/FTextRXTX.cxx:751 src/dialogs/confdialog.cxx:6624 msgid "Transmit" msgstr "Senden" #: src/widgets/FTextRXTX.cxx:752 src/dialogs/confdialog.cxx:6499 #: src/dialogs/confdialog.cxx:7621 msgid "Receive" msgstr "Empfangen" #: src/widgets/FTextRXTX.cxx:753 msgid "Abort" msgstr "Abbruch" #: src/widgets/FTextRXTX.cxx:754 msgid "Send image..." msgstr "Bild senden..." #: src/widgets/FTextView.cxx:292 msgid "Insert text" msgstr "Text einfügen" #: src/widgets/FTextView.cxx:351 msgid "Save text as" msgstr "Text speichern als" #: src/widgets/FTextView.cxx:479 src/widgets/FTextView.cxx:643 #: src/widgets/flinput2.cxx:44 msgid "Copy" msgstr "Kopieren" #: src/widgets/FTextView.cxx:482 msgid "Save as..." msgstr "Speichern als..." #: src/widgets/FTextView.cxx:483 src/widgets/FTextView.cxx:647 msgid "Word wrap" msgstr "Zeilenumbruch" #: src/widgets/FTextView.cxx:642 src/widgets/flinput2.cxx:43 msgid "Cut" msgstr "Ausschneiden" #: src/widgets/FTextView.cxx:644 src/widgets/flinput2.cxx:45 msgid "Paste" msgstr "Einfügen" #: src/widgets/FTextView.cxx:646 msgid "Insert file..." msgstr "Datei einfügen..." #: src/widgets/flinput2.cxx:42 msgid "Undo" msgstr "Rückgängig" #: src/widgets/flinput2.cxx:46 src/logbook/lgbook.cxx:974 msgid "Delete" msgstr "Löschen" #: src/dialogs/confdialog.cxx:4928 msgid "Fldigi configuration" msgstr "Fldigi Konfiguration" #: src/dialogs/confdialog.cxx:4938 src/dialogs/confdialog.cxx:10039 msgid "Operator information" msgstr "Benutzer Informationen" #: src/dialogs/confdialog.cxx:4941 msgid "Station" msgstr "Station" #: src/dialogs/confdialog.cxx:4944 msgid "Callsign:" msgstr "Rufzeichen:" #: src/dialogs/confdialog.cxx:4945 msgid "Operators callsign" msgstr "Benutzer Rufzeichen" #: src/dialogs/confdialog.cxx:4958 msgid "Name:" msgstr "Name:" #: src/dialogs/confdialog.cxx:4959 msgid "Operators name" msgstr "Name des Benutzers" #: src/dialogs/confdialog.cxx:4972 msgid "QTH:" msgstr "QTH:" #: src/dialogs/confdialog.cxx:4973 msgid "Operators QTH" msgstr "Benutzer QTH" #: src/dialogs/confdialog.cxx:4986 msgid "Locator:" msgstr "Locator:" #: src/dialogs/confdialog.cxx:4987 msgid "Maidenhead locator as in EM64qv" msgstr "Maidenhead Locator wie z.B: JO40hm" #: src/dialogs/confdialog.cxx:5002 msgid "Antenna:" msgstr "Antenne:" #: src/dialogs/confdialog.cxx:5003 msgid "Short description of antenna" msgstr "Kurzbeschreibung der Antenne" #: src/dialogs/confdialog.cxx:5016 msgid "Test Signal - Do NOT use with transmitter" msgstr "Test Signal - nicht mit Tranceiver verwenden" #: src/dialogs/confdialog.cxx:5020 msgid "Noise on" msgstr "Rauschen einschalten" #: src/dialogs/confdialog.cxx:5026 msgid "dB" msgstr "dB" #: src/dialogs/confdialog.cxx:5049 msgid "UI" msgstr "GUI" #: src/dialogs/confdialog.cxx:5053 msgid "Browser" msgstr "Browser" #: src/dialogs/confdialog.cxx:5056 msgid "Channels, first channel starts at waterfall lower limit" msgstr "Kanäle; der erste Kanal beginnt an Wasserfall Untergrenze" #: src/dialogs/confdialog.cxx:5057 msgid "Change # of psk viewer channels" msgstr "Ändern der # des PSK Betrachters" #: src/dialogs/confdialog.cxx:5074 msgid "Inactivity timeout" msgstr "Zeitlimit für Inaktivität" #: src/dialogs/confdialog.cxx:5075 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Text im Kanal nach\n" "# sekunden inaktivität löschen" #: src/dialogs/confdialog.cxx:5091 msgid "Channel label" msgstr "Beschriftung / Kanäle" #: src/dialogs/confdialog.cxx:5092 msgid "Appearance of label on each channel" msgstr "Erscheinungsbild der Kanalbeschriftung" #: src/dialogs/confdialog.cxx:5103 msgid "Audio frequency" msgstr "Audio Frequenz" #: src/dialogs/confdialog.cxx:5104 msgid "Radio frequency" msgstr "Radio Frequenz" #: src/dialogs/confdialog.cxx:5104 msgid "Channel number" msgstr "Kanal Nummer" #: src/dialogs/confdialog.cxx:5109 src/dialogs/confdialog.cxx:6274 msgid "Font..." msgstr "Schrift..." #: src/dialogs/confdialog.cxx:5110 msgid "select browser font" msgstr "Browser Schriftart auswählen" #: src/dialogs/confdialog.cxx:5113 msgid "Fixed Intervals" msgstr "Feste Intervalle" #: src/dialogs/confdialog.cxx:5114 msgid "Force channel spacing to even 100 Hz increments" msgstr "Kanalabstand auf gerade 100 Hz erzwingen" #: src/dialogs/confdialog.cxx:5121 msgid "Continuous scrolling" msgstr "Kontinuierliches Scrollen" #: src/dialogs/confdialog.cxx:5122 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" #: src/dialogs/confdialog.cxx:5127 msgid "Lowest freq on bottom of viewer" msgstr "" #: src/dialogs/confdialog.cxx:5128 msgid "Change positions of low to high channels" msgstr "" #: src/dialogs/confdialog.cxx:5133 msgid "Play back history when active channel selected" msgstr "" #: src/dialogs/confdialog.cxx:5134 msgid "Audio stream history decoded on selected signal" msgstr "" #: src/dialogs/confdialog.cxx:5139 msgid "Detection Level" msgstr "Nachweisgrenze" #: src/dialogs/confdialog.cxx:5141 msgid "Backgnd" msgstr "Hgrund" #: src/dialogs/confdialog.cxx:5142 msgid "Background color of signal viewer squelch control" msgstr "Hintergrundfarbe des Signalbetrachters / Rauschkontrolle" #: src/dialogs/confdialog.cxx:5147 msgid "Button" msgstr "Knopf" #: src/dialogs/confdialog.cxx:5148 msgid "Slider hilite color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:5155 msgid "Browser Line Colors" msgstr "Browser Linienfarben" #: src/dialogs/confdialog.cxx:5157 msgid "HiLite 1" msgstr "HiLite1" #: src/dialogs/confdialog.cxx:5158 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "PSK/RTTY Betrachter Farbe HiLite 1" #: src/dialogs/confdialog.cxx:5163 msgid "HiLite 2" msgstr "HiLite2" #: src/dialogs/confdialog.cxx:5164 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "PSK/RTTY Betrachter Farbe HiLite 2" #: src/dialogs/confdialog.cxx:5169 msgid "Even" msgstr "Gerade" #: src/dialogs/confdialog.cxx:5170 msgid "Even lines" msgstr "Gerade linien" #: src/dialogs/confdialog.cxx:5175 msgid "Odd" msgstr "Ungerade" #: src/dialogs/confdialog.cxx:5176 msgid "Odd lines" msgstr "Ungerade Linien" #: src/dialogs/confdialog.cxx:5182 msgid "Select line" msgstr "Linie auswählen" #: src/dialogs/confdialog.cxx:5195 msgid "Exchanges" msgstr "Austausch" #: src/dialogs/confdialog.cxx:5198 msgid "Send:" msgstr "Gesendet:" #: src/dialogs/confdialog.cxx:5200 src/logbook/lgbook.cxx:542 #: src/logbook/lgbook.cxx:900 src/logbook/lgbook.cxx:1115 msgid "Exchange Out" msgstr "Exchange Out" #: src/dialogs/confdialog.cxx:5201 msgid "free form exchange" msgstr "Frei Form Austausch" #: src/dialogs/confdialog.cxx:5215 msgid "RST always 599" msgstr "RST immer 599 senden" #: src/dialogs/confdialog.cxx:5216 msgid "Force RST in/out to 599" msgstr "RST immer 599 für ein/aus forcieren" #: src/dialogs/confdialog.cxx:5221 msgid "Send CW cut numbers" msgstr "" #: src/dialogs/confdialog.cxx:5222 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:5232 msgid "Use leading zeros" msgstr "Führende Nullen verwenden" #: src/dialogs/confdialog.cxx:5233 msgid "Insert leading zeros into Xmtd serial number" msgstr "Führende Nullen in Xmtd Serien Nummer einfügen" #: src/dialogs/confdialog.cxx:5238 msgid "Start" msgstr "Start" #: src/dialogs/confdialog.cxx:5239 msgid "Starting number" msgstr "Startnummer" #: src/dialogs/confdialog.cxx:5254 msgid "Digits" msgstr "Ziffern" #: src/dialogs/confdialog.cxx:5255 msgid "Number of digits in serial number" msgstr "Anzahl der Stellen in Seriennummer" #: src/dialogs/confdialog.cxx:5271 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Reset" #: src/dialogs/confdialog.cxx:5272 msgid "Initialize the QSO logging fields" msgstr "QSO logging Felder initialisieren" #: src/dialogs/confdialog.cxx:5277 msgid "Duplicate check, CALL plus" msgstr "Dublettenprüfung Call plus" #: src/dialogs/confdialog.cxx:5280 msgid "On/Off" msgstr "Ein/Aus" #: src/dialogs/confdialog.cxx:5281 msgid "Check for duplicates" msgstr "Überprüfen auf Dupliakte" #: src/dialogs/confdialog.cxx:5286 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:471 msgid "Band" msgstr "Band" #: src/dialogs/confdialog.cxx:5287 msgid "Bands must match" msgstr "Bänder müssen übereinstimmen" #: src/dialogs/confdialog.cxx:5292 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:474 src/logbook/lgbook.cxx:682 #: src/logbook/lgbook.cxx:1028 src/logbook/lgbook.cxx:1083 msgid "Mode" msgstr "Betriebsart" #: src/dialogs/confdialog.cxx:5293 msgid "Mode must match" msgstr "Modus muss übereinstimmen" #: src/dialogs/confdialog.cxx:5299 msgid "State must match" msgstr "Bundesstaat muss übereinstimmen" #: src/dialogs/confdialog.cxx:5305 msgid "free form 1 must match" msgstr "" #: src/dialogs/confdialog.cxx:5310 msgid "Time span over" msgstr "Zeitspanne um" #: src/dialogs/confdialog.cxx:5311 msgid "QSO must not occur within a time period of" msgstr "Verbindung darf nicht innerhalb eines Zeitraums von auftreten" #: src/dialogs/confdialog.cxx:5316 msgid "minutes" msgstr "Minuten" #: src/dialogs/confdialog.cxx:5317 msgid "Enter time span in minutes" msgstr "Zeitspanne in Minuten eingeben" #: src/dialogs/confdialog.cxx:5333 msgid "Dup Color" msgstr "Duplikate" #: src/dialogs/confdialog.cxx:5334 msgid "Left click to select dup color" msgstr "Linksklick um Farbe für Duplikate zu wählen" #: src/dialogs/confdialog.cxx:5346 src/dialogs/confdialog.cxx:6497 #: src/dialogs/confdialog.cxx:7508 src/dialogs/confdialog.cxx:9403 msgid "General" msgstr "Allgemein" #: src/dialogs/confdialog.cxx:5350 msgid "Show tooltips" msgstr "Tooltipps anzeigen" #: src/dialogs/confdialog.cxx:5351 msgid "Enable / disable tooltips" msgstr "Aktivieren / Deaktivieren der Tooltipps" #: src/dialogs/confdialog.cxx:5357 msgid "Show menu icons" msgstr "Menu Symbole zeigen" #: src/dialogs/confdialog.cxx:5358 msgid "Enable / disable icons on menus" msgstr "Aktivieren / Deaktivieren der Symbole in Menüs" #: src/dialogs/confdialog.cxx:5363 msgid "UI scheme" msgstr "GUI Schema" #: src/dialogs/confdialog.cxx:5364 msgid "Change application look and feel" msgstr "Look and feel der Anwendung ändern" #: src/dialogs/confdialog.cxx:5382 msgid "Visible modes" msgstr "Sichtbare Modi" #: src/dialogs/confdialog.cxx:5383 msgid "Select modes for menu access" msgstr "Modi für Zugriff auf Menü" #: src/dialogs/confdialog.cxx:5386 msgid "UI language" msgstr "Sprache" #: src/dialogs/confdialog.cxx:5387 src/dialogs/confdialog.cxx:6403 msgid "Changes take effect on next program startup" msgstr "Änderungen werden erst beim nächsten Programmstart wirksam" #: src/dialogs/confdialog.cxx:5406 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Zeichen bei CW / RTTY / THROB / CONTESTIA in Kleinbuchstaben" #: src/dialogs/confdialog.cxx:5416 msgid "Transmit all text in lower case" msgstr "Gesamten Text in Kleinbuchstaben senden" #: src/dialogs/confdialog.cxx:5423 msgid "Exit prompts" msgstr "Aufforderung zum Beenden" #: src/dialogs/confdialog.cxx:5426 msgid "Prompt to save Configuration" msgstr "Prompt Konfiguration speichern" #: src/dialogs/confdialog.cxx:5431 msgid "Prompt to save macro file" msgstr "Prompt Makro Datei speichern" #: src/dialogs/confdialog.cxx:5432 src/dialogs/confdialog.cxx:5689 msgid "Write current macro set on program exit" msgstr "Aktuelle Makros bei Programmende sichern" #: src/dialogs/confdialog.cxx:5437 msgid "Prompt to save log" msgstr "Prompt Log Datei speichern" #: src/dialogs/confdialog.cxx:5438 src/dialogs/confdialog.cxx:5491 msgid "Bug me about saving log entries" msgstr "Prompt um Log Datei zu speichern" #: src/dialogs/confdialog.cxx:5443 msgid "" "Exit prompts active only when File/Exit menu item selected.\n" "Not active if window decoration close button pressed." msgstr "" "Aufforderung zum speichern nur aktiv wenn Fldigi via 'Beenden' Menu\n" "geschlossen wird. Nicht aber, wenn Fldigi anderweitig beendet wird." #: src/dialogs/confdialog.cxx:5448 msgid "Confirm exit" msgstr "Beenden bestätigen" #: src/dialogs/confdialog.cxx:5455 msgid "Check for updates" msgstr "Nach Updates suchen" #: src/dialogs/confdialog.cxx:5458 msgid "Check for updates when starting program" msgstr "Bei Programmstart nach Updates suchen" #: src/dialogs/confdialog.cxx:5467 msgid "Logging" msgstr "Logging" #: src/dialogs/confdialog.cxx:5469 msgid "Client/Server Logbook" msgstr "Client/Server Logbuch" #: src/dialogs/confdialog.cxx:5472 msgid "Address:" msgstr "Adresse:" #: src/dialogs/confdialog.cxx:5473 msgid "Enter URL address of server" msgstr "Adresse des Servers eingeben" #: src/dialogs/confdialog.cxx:5477 src/dialogs/confdialog.cxx:9460 msgid "Port:" msgstr "Port:" #: src/dialogs/confdialog.cxx:5478 msgid "Enter Port # assigned to server" msgstr "Port # des zugewiesenen Servers eingeben" #: src/dialogs/confdialog.cxx:5482 msgid "Reconnect" msgstr "Erneut Verbinden" #: src/dialogs/confdialog.cxx:5487 msgid "QSO logging" msgstr "QSO Logging" #: src/dialogs/confdialog.cxx:5490 msgid "Prompt to save log on exit" msgstr "Aufforderung Log Datei speichern" #: src/dialogs/confdialog.cxx:5496 msgid "Clear on save" msgstr "Löschen nach speichern" #: src/dialogs/confdialog.cxx:5497 msgid "Clear log entries after saving or using macro " msgstr "Logeinträge löschen nach speichern oder Makro " #: src/dialogs/confdialog.cxx:5502 msgid "Convert callsign to upper case" msgstr "Rufzeichen in Grossbuchstaben" #: src/dialogs/confdialog.cxx:5503 msgid "Force callsign field to UPPERCASE" msgstr "Rufzeichen in Grossbuchstaben erzwingen" #: src/dialogs/confdialog.cxx:5508 msgid "Auto-fill Country and Azimuth" msgstr "Land und Azimuth automatisch füllen" #: src/dialogs/confdialog.cxx:5509 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "Land und Azimuth mit Informationen aus cty.dat Datei füllen" #: src/dialogs/confdialog.cxx:5514 msgid "Sort by Date/Time OFF" msgstr "Sortieren nach Datum/Zeit aus" #: src/dialogs/confdialog.cxx:5515 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" "Sortieren nach Datum/Uhrzeit ausgeschaltet - beinflusst alle ADIF / Cabrillo " "Reports" #: src/dialogs/confdialog.cxx:5520 msgid "Date time ON == OFF" msgstr "Datum/Zeit EIN == AUS" #: src/dialogs/confdialog.cxx:5521 msgid "Force date/time ON == date/time OFF" msgstr "Datum/Zeit ON == Datum/Zeit OFF forcieren" #: src/dialogs/confdialog.cxx:5526 msgid "Default RST in to 599" msgstr "Standard RST ist 599" #: src/dialogs/confdialog.cxx:5527 msgid "Clear log controls sets RST in to 599" msgstr "Log Felder mit RST In 599 löschen" #: src/dialogs/confdialog.cxx:5532 msgid "Default RST out to 599" msgstr "Standard Ausgangs RST ist 599" #: src/dialogs/confdialog.cxx:5533 msgid "Clear log controls sets RST out to 599" msgstr "Log Felder mit RST Out 599 löschen" #: src/dialogs/confdialog.cxx:5538 msgid "cty.dat pathname" msgstr "cty.dat Dateiname" #: src/dialogs/confdialog.cxx:5539 msgid "Enter full path-filename for cty.dat" msgstr "Vollständigen Dateinamen/Pfad für cty.dat Datei eingeben" #: src/dialogs/confdialog.cxx:5552 msgid "Browse" msgstr "Suchen" #: src/dialogs/confdialog.cxx:5553 msgid "Locate cty.dat file" msgstr "Finde cty.dat Datei" #: src/dialogs/confdialog.cxx:5556 src/dialogs/confdialog.cxx:5914 #: src/dialogs/confdialog.cxx:5934 src/dialogs/confdialog.cxx:6648 msgid "Default" msgstr "Standard" #: src/dialogs/confdialog.cxx:5557 msgid "Restore cty.dat default folder" msgstr "Wiederherstellung des cty.dat Standardordners" #: src/dialogs/confdialog.cxx:5560 msgid "Reload" msgstr "Neu laden" #: src/dialogs/confdialog.cxx:5561 msgid "Reload cty.dat" msgstr "cty.dat erneut laden" #: src/dialogs/confdialog.cxx:5564 msgid "Transmit Power" msgstr "Sendeleistung" #: src/dialogs/confdialog.cxx:5565 msgid "Tx power used for logbook entries" msgstr "Sende Leistung für Logbuch Einträge" #: src/dialogs/confdialog.cxx:5581 msgid "Rx Text Capture" msgstr "Empfangs Text aufnehmen" #: src/dialogs/confdialog.cxx:5584 msgid "Double-click to capture" msgstr "Doppelklicken, um zu erfassen" #: src/dialogs/confdialog.cxx:5585 msgid "Enable if you cannot use the middle mouse button" msgstr "Aktivieren, wenn Sie nicht die mittlere Maustaste verwenden können" #: src/dialogs/confdialog.cxx:5590 msgid "callsign tooltips in received text" msgstr "Rufzeichen Tooltips in empfangenen Text" #: src/dialogs/confdialog.cxx:5591 msgid "Popup info after a 2 second hover on a callsign" msgstr "Popup Info nach 2 sek über dem Rufzeichen schweben" #: src/dialogs/confdialog.cxx:5596 msgid "Word delimiters" msgstr "Wort Trennzeichen" #: src/dialogs/confdialog.cxx:5597 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" #: src/dialogs/confdialog.cxx:5621 msgid "Mouse wheel active on macro buttons" msgstr "Mausrad aktiv bei Makros" #: src/dialogs/confdialog.cxx:5622 msgid "enable mouse wheel control of macro bar" msgstr "Mausrad einschalten um Makros zu kontrollieren" #: src/dialogs/confdialog.cxx:5629 msgid "Number and position of macro bars" msgstr "Anzahl und Position der Makroreihen" #: src/dialogs/confdialog.cxx:5632 msgid "One bar (above waterfall)" msgstr "Eine Reihe (über dem Wasserfall)" #: src/dialogs/confdialog.cxx:5637 msgid "One bar (below waterfall)" msgstr "Eine Reihe (unter dem Wasserfall)" #: src/dialogs/confdialog.cxx:5642 msgid "Two bars (scheme 1)" msgstr "Zwei Reihen (Schema 1)" #: src/dialogs/confdialog.cxx:5647 msgid "Two bars (scheme 2)" msgstr "Zwei Reihen (Schema 2)" #: src/dialogs/confdialog.cxx:5652 msgid "Two bars (scheme 3)" msgstr "Zwei Reihen (Schema 3)" #: src/dialogs/confdialog.cxx:5657 msgid "Two bars (scheme 4)" msgstr "Zwei Reihen (Schema 4)" #: src/dialogs/confdialog.cxx:5662 msgid "Two bars (scheme 5)" msgstr "Zwei Reihen (Schema 5)" #: src/dialogs/confdialog.cxx:5667 msgid "Two bars (scheme 6)" msgstr "Zwei Reihen (Schema 6)" #: src/dialogs/confdialog.cxx:5676 msgid "Load last used macro file on startup" msgstr "Laden der zuletzt verwendeten Makro Datei bei Programmstart" #: src/dialogs/confdialog.cxx:5677 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "EIN - Letzten Makrosatz verwenden\n" "AUS - Standardsatz verwenden" #: src/dialogs/confdialog.cxx:5682 msgid "Display macro filename on startup" msgstr "Makro Dateiname bei Programmstart anzeigen" #: src/dialogs/confdialog.cxx:5683 msgid "The filename is written to the RX text area" msgstr "Der Dateiname wurde in den RX Text Bereich geschrieben" #: src/dialogs/confdialog.cxx:5688 msgid "Prompt to save macro file when closing" msgstr "Aufforderung zum speichern der Makrodatei bei beenden" #: src/dialogs/confdialog.cxx:5698 msgid "WF Ctrls" msgstr "Wasserfall Kontrolle" #: src/dialogs/confdialog.cxx:5702 msgid "Enable check box to show each respective operator control" msgstr "Aktivieren, um entsprechendes Bedienelement anzuzeigen" #: src/dialogs/confdialog.cxx:5712 msgid "WF Magnification" msgstr "WF Vergrösserung" #: src/dialogs/confdialog.cxx:5718 msgid "WF carrier" msgstr "WF Träger" #: src/dialogs/confdialog.cxx:5724 msgid "WF Shift Controls" msgstr "" #: src/dialogs/confdialog.cxx:5730 msgid "WF ref level" msgstr "" #: src/dialogs/confdialog.cxx:5736 msgid "WF drop rate" msgstr "" #: src/dialogs/confdialog.cxx:5742 msgid "WF amp span" msgstr "" #: src/dialogs/confdialog.cxx:5748 msgid "WF Store" msgstr "" #: src/dialogs/confdialog.cxx:5754 msgid "WF mode" msgstr "WF Modus" #: src/dialogs/confdialog.cxx:5760 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:5766 msgid "XMT lock" msgstr "" #: src/dialogs/confdialog.cxx:5772 msgid "Enable all" msgstr "Alles ein" #: src/dialogs/confdialog.cxx:5775 msgid "Disable all" msgstr "Alles aus" #: src/dialogs/confdialog.cxx:5782 msgid "Colors/Fonts" msgstr "Farben/Schrift" #: src/dialogs/confdialog.cxx:5785 msgid "Rx/Tx" msgstr "Rx/Tx" #: src/dialogs/confdialog.cxx:5786 #, fuzzy msgid "Rx/Tx Character set" msgstr "Rx/Tx Zeichensatz auswählen" #: src/dialogs/confdialog.cxx:5787 msgid "Select Rx/Tx Character Set" msgstr "Rx/Tx Zeichensatz auswählen" #: src/dialogs/confdialog.cxx:5807 msgid "Rx bkgnd" msgstr "Rx HGrund" #: src/dialogs/confdialog.cxx:5810 msgid "Tx bkgnd" msgstr "Tx HGrund" #: src/dialogs/confdialog.cxx:5819 msgid "Rx font" msgstr "Rx Schrift" #: src/dialogs/confdialog.cxx:5822 msgid "Tx font" msgstr "Tx Schrift" #: src/dialogs/confdialog.cxx:5825 msgid "Text Highlighting" msgstr "Text hervorheben" #: src/dialogs/confdialog.cxx:5828 msgid "XMIT" msgstr "XMIT" #: src/dialogs/confdialog.cxx:5829 msgid "Sent chars in Rx/Tx pane" msgstr "Gesendete Zeichen in Rx/Tx Bereich" #: src/dialogs/confdialog.cxx:5834 msgid "CTRL" msgstr "STRG" #: src/dialogs/confdialog.cxx:5835 msgid "Control chars in Rx/Tx pane" msgstr "Control-Zeichen in Rx / Tx Bereich" #: src/dialogs/confdialog.cxx:5840 msgid "SKIP" msgstr "SKIP" #: src/dialogs/confdialog.cxx:5841 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" #: src/dialogs/confdialog.cxx:5846 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:5847 msgid "Alternate character color in Rx panelr" msgstr "Alternative Zeichenfarbe im Rx Panel" #: src/dialogs/confdialog.cxx:5852 msgid "SEL" msgstr "SEL" #: src/dialogs/confdialog.cxx:5853 msgid "Selection background color in Rx Tx panels" msgstr "Auswahl Hintergrundfarbe in Rx Tx Panel" #: src/dialogs/confdialog.cxx:5858 src/dialogs/confdialog.cxx:5981 msgid "System" msgstr "System" #: src/dialogs/confdialog.cxx:5861 src/dialogs/confdialog.cxx:5971 #: src/logbook/lgbook.cxx:563 msgid "Defaults" msgstr "Standard" #: src/dialogs/confdialog.cxx:5868 msgid "Frq Disp" msgstr "Frq Anz" #: src/dialogs/confdialog.cxx:5872 msgid "14070.150" msgstr "14070.150" #: src/dialogs/confdialog.cxx:5881 src/dialogs/confdialog.cxx:5911 #: src/dialogs/confdialog.cxx:5931 msgid "Font" msgstr "Schrift" #: src/dialogs/confdialog.cxx:5884 src/dialogs/confdialog.cxx:5908 #: src/dialogs/confdialog.cxx:5928 msgid "Bg Color" msgstr "HGrundfarbe" #: src/dialogs/confdialog.cxx:5887 msgid "Digit Color" msgstr "Ziffernfarbe" #: src/dialogs/confdialog.cxx:5890 msgid "Sys Colors" msgstr "Sys Farben" #: src/dialogs/confdialog.cxx:5897 msgid "Log" msgstr "Log" #: src/dialogs/confdialog.cxx:5899 msgid "Logging Panel Controls" msgstr "Protokoll Bedienelemente" #: src/dialogs/confdialog.cxx:5919 msgid "Logbook Dialog" msgstr "Logbuch Dialog" #: src/dialogs/confdialog.cxx:5941 msgid "F_keys" msgstr "F_Tasten" #: src/dialogs/confdialog.cxx:5943 msgid "Use colored buttons" msgstr "Farbige Schaltflächen" #: src/dialogs/confdialog.cxx:5948 msgid "Group 1" msgstr "Gruppe 1" #: src/dialogs/confdialog.cxx:5949 msgid "Background color for Function key group 1" msgstr "Hintergrundfarbe für Funktionstaste Gruppe 1" #: src/dialogs/confdialog.cxx:5954 msgid "Group 2" msgstr "Gruppe 2" #: src/dialogs/confdialog.cxx:5955 msgid "Background color for Function key group 2" msgstr "Hintergrundfarbe für Funktionstaste Gruppe 2" #: src/dialogs/confdialog.cxx:5960 msgid "Group 3" msgstr "Gruppe 3" #: src/dialogs/confdialog.cxx:5961 msgid "Background color for Function key group 3" msgstr "Hintergrundfarbe für Funktionstaste Gruppe 3" #: src/dialogs/confdialog.cxx:5966 msgid "Label text" msgstr "Label" #: src/dialogs/confdialog.cxx:5976 msgid "Tabs" msgstr "Registerkarte" #: src/dialogs/confdialog.cxx:5978 msgid "Tab Color" msgstr "Farbe" #: src/dialogs/confdialog.cxx:5986 msgid "Buttons" msgstr "Schaltflächen" #: src/dialogs/confdialog.cxx:5988 msgid "Spot" msgstr "Spot" #: src/dialogs/confdialog.cxx:5991 msgid "RxID" msgstr "RxID" #: src/dialogs/confdialog.cxx:5994 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:5997 msgid "Tune" msgstr "Abstimmen" #: src/dialogs/confdialog.cxx:6000 msgid "Lk" msgstr "Lk" #: src/dialogs/confdialog.cxx:6003 msgid "Rev" msgstr "Rev" #: src/dialogs/confdialog.cxx:6006 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:6009 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:6012 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:6015 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:6061 msgid "Lighted button enabled colors" msgstr "Farbmarkierte Button" #: src/dialogs/confdialog.cxx:6066 msgid "SigLvl" msgstr "Pegel" #: src/dialogs/confdialog.cxx:6068 src/dialogs/confdialog.cxx:9023 msgid "Low" msgstr "Niedrig" #: src/dialogs/confdialog.cxx:6076 src/dialogs/confdialog.cxx:9023 msgid "High" msgstr "Hoch" #: src/dialogs/confdialog.cxx:6084 msgid "Normal" msgstr "Normal" #: src/dialogs/confdialog.cxx:6092 msgid "Over" msgstr "Über" #: src/dialogs/confdialog.cxx:6100 msgid "Signal Level Colors" msgstr "Signalpegel Farbe" #: src/dialogs/confdialog.cxx:6117 msgid "Display" msgstr "Anzeige" #: src/dialogs/confdialog.cxx:6118 msgid "Colors and cursors" msgstr "Farben und Cursor" #: src/dialogs/confdialog.cxx:6121 msgid "aa" msgstr "aa" #: src/dialogs/confdialog.cxx:6136 src/dialogs/confdialog.cxx:6140 #: src/dialogs/confdialog.cxx:6144 src/dialogs/confdialog.cxx:6148 #: src/dialogs/confdialog.cxx:6152 src/dialogs/confdialog.cxx:6156 #: src/dialogs/confdialog.cxx:6160 src/dialogs/confdialog.cxx:6164 #: src/dialogs/confdialog.cxx:6168 src/dialogs/confdialog.cxx:6189 #: src/dialogs/confdialog.cxx:6213 src/dialogs/confdialog.cxx:6237 #: src/dialogs/confdialog.cxx:6255 msgid "Change color" msgstr "Farbe ändern" #: src/dialogs/confdialog.cxx:6171 msgid "Load..." msgstr "Laden" #: src/dialogs/confdialog.cxx:6172 msgid "Load a new palette" msgstr "Neue Palette laden" #: src/dialogs/confdialog.cxx:6175 msgid "Save..." msgstr "Speichern" #: src/dialogs/confdialog.cxx:6176 msgid "Save this palette" msgstr "Diese Palette speichern" #: src/dialogs/confdialog.cxx:6179 src/dialogs/confdialog.cxx:7315 #: src/dialogs/confdialog.cxx:7411 msgid "Bandwidth" msgstr "Bandbreite" #: src/dialogs/confdialog.cxx:6182 src/dialogs/confdialog.cxx:6206 #: src/dialogs/confdialog.cxx:6230 msgid "ON" msgstr "Ein" #: src/dialogs/confdialog.cxx:6183 msgid "Show cursor with bandwidth lines" msgstr "Zeige Cursor mit Bandbreitenlinien" #: src/dialogs/confdialog.cxx:6188 src/dialogs/confdialog.cxx:6212 #: src/dialogs/confdialog.cxx:6236 src/dialogs/confdialog.cxx:6254 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "Farbe" #: src/dialogs/confdialog.cxx:6195 src/dialogs/confdialog.cxx:6219 #: src/dialogs/confdialog.cxx:6243 msgid "Wide" msgstr "Breite" #: src/dialogs/confdialog.cxx:6196 src/dialogs/confdialog.cxx:6220 #: src/dialogs/confdialog.cxx:6231 src/dialogs/confdialog.cxx:6244 msgid "Show bandwidth tracks on waterfall" msgstr "Bandbreiten Spur im Wasserfall anzeigen" #: src/dialogs/confdialog.cxx:6203 msgid "Center line" msgstr "Mittellinie" #: src/dialogs/confdialog.cxx:6207 msgid "Show cursor with center line" msgstr "Cursor mit Mittellinie zeigen" #: src/dialogs/confdialog.cxx:6227 msgid "Signal tracks" msgstr "Signalspuren" #: src/dialogs/confdialog.cxx:6251 msgid "Notch" msgstr "Notch (Kerbfilter)" #: src/dialogs/confdialog.cxx:6265 msgid "Frequency scale" msgstr "Frequenz Skala" #: src/dialogs/confdialog.cxx:6268 msgid "Always show audio frequencies" msgstr "Audio Frequenzen immer anzeigen" #: src/dialogs/confdialog.cxx:6269 msgid "Audio or RF frequencies on waterfall scale" msgstr "Audio oder HF Frequenzen auf WF Skala" #: src/dialogs/confdialog.cxx:6275 msgid "Select waterfall scale font" msgstr "Wasserfall Skala Schrift wählen" #: src/dialogs/confdialog.cxx:6280 msgid "Transmit signal" msgstr "Sendesignal" #: src/dialogs/confdialog.cxx:6283 msgid "Monitor transmitted signal" msgstr "Sendesignal überwachen" #: src/dialogs/confdialog.cxx:6284 msgid "Show transmit signal on waterfall" msgstr "Sendesignal am Wasserfall zeigen" #: src/dialogs/confdialog.cxx:6289 msgid "Signal level" msgstr "Signalpegel" #: src/dialogs/confdialog.cxx:6290 msgid "Set level for good viewing" msgstr "Pegel für beste Sicht einstellen" #: src/dialogs/confdialog.cxx:6312 msgid "FFT Processing" msgstr "FFT Verarbeitung" #: src/dialogs/confdialog.cxx:6316 src/dialogs/confdialog.cxx:6668 msgid "Lower limit" msgstr "untere Grenze" #: src/dialogs/confdialog.cxx:6317 msgid "Low frequency limit in Hz" msgstr "Untere Grenzfrequenz in Hz" #: src/dialogs/confdialog.cxx:6336 msgid "FFT averaging" msgstr "FFT Mittelung" #: src/dialogs/confdialog.cxx:6337 msgid "Use averaging to decrease waterfall noise" msgstr "Mittelung verwenden um WF Rauschen zu vermindern" #: src/dialogs/confdialog.cxx:6342 msgid "FFT prefilter window function" msgstr "FFT Vorfilter Fensterfunktion" #: src/dialogs/confdialog.cxx:6343 msgid "Select the type of FFT prefilter" msgstr "FFT Vorfilter wählen" #: src/dialogs/confdialog.cxx:6354 msgid "Rectangular" msgstr "Rechteck" #: src/dialogs/confdialog.cxx:6356 msgid "Triangular" msgstr "Dreieck" #: src/dialogs/confdialog.cxx:6361 src/dialogs/confdialog.cxx:6680 msgid "Upper limit" msgstr "obere Grenze" #: src/dialogs/confdialog.cxx:6362 msgid "High frequency limit in Hz" msgstr "Grenzfrequenz in Hz" #: src/dialogs/confdialog.cxx:6381 msgid "Latency" msgstr "" #: src/dialogs/confdialog.cxx:6382 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:6404 msgid "Show me more or less waterfall" msgstr "Zeige mehr oder weniger Wasserfall" #: src/dialogs/confdialog.cxx:6407 msgid "Waterfall height in pixels" msgstr "Wasserfall Höhe in Pixeln" #: src/dialogs/confdialog.cxx:6408 msgid "CPU usage increases with waterfall height" msgstr "CPU Auslastung steigt mit Höhe der Wasserfall Pixel" #: src/dialogs/confdialog.cxx:6431 msgid "Mouse" msgstr "Maus" #: src/dialogs/confdialog.cxx:6435 msgid "Left or right click always replays audio history" msgstr "Links/rechts klick ersetzt Audio Historie" #: src/dialogs/confdialog.cxx:6436 msgid "Replay trackline audio" msgstr "" #: src/dialogs/confdialog.cxx:6441 msgid "Dragging on the waterfall scale changes frequency" msgstr "Ziehen auf Wasserfall Skala ändert Frequenz" #: src/dialogs/confdialog.cxx:6442 msgid "Enable drag cursor on waterfall scale" msgstr "" #: src/dialogs/confdialog.cxx:6447 msgid "Insert text on single left click" msgstr "Einfügen von Text per einfachem Linksklick" #: src/dialogs/confdialog.cxx:6448 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" #: src/dialogs/confdialog.cxx:6454 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:6468 msgid "Wheel action" msgstr "Mausrad Aktion" #: src/dialogs/confdialog.cxx:6469 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Auswählen wie sich das Mausrad\n" "innerhalb des Wasserfalls verhält" #: src/dialogs/confdialog.cxx:6494 src/dialogs/confdialog.cxx:9177 #: src/dialogs/confdialog.cxx:9492 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:6502 msgid "Filter bandwidth" msgstr "Filter Bandbreite" #: src/dialogs/confdialog.cxx:6503 msgid "CW dsp filter bandwidth" msgstr "CW DSP Filter Bandbreite" #: src/dialogs/confdialog.cxx:6523 msgid "Rx WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:6529 msgid "Tracked CW speed in WPM" msgstr "" #: src/dialogs/confdialog.cxx:6534 msgid "SOM decoding" msgstr "SOM Dekodierung" #: src/dialogs/confdialog.cxx:6535 msgid "Self Organizing Mapping" msgstr "Selbstorganisierende Karte (SOM)" #: src/dialogs/confdialog.cxx:6541 msgid "Lower" msgstr "Unterer" #: src/dialogs/confdialog.cxx:6542 msgid "Detector low threshold" msgstr "Detektor Schwelle niedrig" #: src/dialogs/confdialog.cxx:6561 msgid "Upper" msgstr "Oberer" #: src/dialogs/confdialog.cxx:6562 msgid "Detector high threshold" msgstr "Detektor Schwelle hoch" #: src/dialogs/confdialog.cxx:6581 msgid "Matched Filter" msgstr "Angepasster Filter" #: src/dialogs/confdialog.cxx:6582 msgid "Matched Filter bandwidth" msgstr "Angepasste Filter Bandbreite" #: src/dialogs/confdialog.cxx:6588 msgid "FFT filter" msgstr "FFT Filter" #: src/dialogs/confdialog.cxx:6589 msgid "FFT / FIR filter" msgstr "FFT / FIR Filter" #: src/dialogs/confdialog.cxx:6595 msgid "Tracking" msgstr "Verfolgung" #: src/dialogs/confdialog.cxx:6596 msgid "Automatic Rx speed tracking" msgstr "Automatisch Rx Geschwindigkeit verfolgen" #: src/dialogs/confdialog.cxx:6602 msgid "Range, WPM" msgstr "Bereich WPM" #: src/dialogs/confdialog.cxx:6603 msgid "Range +/- wpm" msgstr "Bereich +/- wpm" #: src/dialogs/confdialog.cxx:6627 msgid "TX WPM" msgstr "TX WPM" #: src/dialogs/confdialog.cxx:6628 src/dialogs/confdialog.cxx:6693 msgid "My transmit CW WPM" msgstr "Meine Sendegeschwindikgeit WPM" #: src/dialogs/confdialog.cxx:6649 msgid "The default CW speed" msgstr "Standard CW Geschwindigkeit" #: src/dialogs/confdialog.cxx:6669 msgid "No slower than this" msgstr "Nicht langsamer als dieses" #: src/dialogs/confdialog.cxx:6681 msgid "No faster than this" msgstr "Nicht schneller als dieses" #: src/dialogs/confdialog.cxx:6692 msgid "F-WPM" msgstr "F-WPM" #: src/dialogs/confdialog.cxx:6713 msgid "Use Farnsworth timing" msgstr "Farnsworth Timing nutzen" #: src/dialogs/confdialog.cxx:6722 msgid "Timing and QSK" msgstr "Timing und QSK" #: src/dialogs/confdialog.cxx:6725 msgid "Timing" msgstr "Timing" #: src/dialogs/confdialog.cxx:6728 msgid "Weight (%)" msgstr "Wichtung (%)" #: src/dialogs/confdialog.cxx:6729 msgid "Dot to dot-space ratio" msgstr "" #: src/dialogs/confdialog.cxx:6748 src/dialogs/confdialog.cxx:6749 msgid "Dash to dot ratio" msgstr "" #: src/dialogs/confdialog.cxx:6767 msgid "Edge timing" msgstr "Flankensteilheit" #: src/dialogs/confdialog.cxx:6768 msgid "Leading and Trailing edge risetimes (msec)" msgstr "" #: src/dialogs/confdialog.cxx:6786 msgid "Edge shape" msgstr "Kantenform" #: src/dialogs/confdialog.cxx:6787 msgid "Raised cosine = Hanning" msgstr "" #: src/dialogs/confdialog.cxx:6803 msgid "Edge decreases pulse width" msgstr "" #: src/dialogs/confdialog.cxx:6804 msgid "Weight decreases with increasing edge timing" msgstr "" #: src/dialogs/confdialog.cxx:6811 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:6814 msgid "QSK on right audio channel" msgstr "QSK im rechten Audio Kanal" #: src/dialogs/confdialog.cxx:6815 msgid "Generate square wave signal on right channel" msgstr "Erzeuge ein Rechtecksignal auf dem rechten Kanal" #: src/dialogs/confdialog.cxx:6820 msgid "Pre-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:6821 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:6839 msgid "Post-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:6840 msgid "Msec post-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:6858 msgid "Send continuously" msgstr "Kontinuierlich senden" #: src/dialogs/confdialog.cxx:6859 msgid "Send a continuous stream of test characters" msgstr "Sende einen kontinuierlichen Datenstrom an Testzeichen" #: src/dialogs/confdialog.cxx:6864 msgid "Test char" msgstr "Testzeichen" #: src/dialogs/confdialog.cxx:6865 msgid "Test character for QSK adjustment" msgstr "Testzeichen für QSK Einstellung" #: src/dialogs/confdialog.cxx:6885 msgid "Prosigns" msgstr "" #: src/dialogs/confdialog.cxx:6890 msgid "Use '(' paren not KN" msgstr "'(' nutzen nicht KN" #: src/dialogs/confdialog.cxx:6897 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6914 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6931 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6948 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6964 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6981 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6998 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7015 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7032 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7055 msgid "Dom" msgstr "Dom" #: src/dialogs/confdialog.cxx:7059 src/dialogs/confdialog.cxx:7902 msgid "Secondary Text" msgstr "Sekundärer Text" #: src/dialogs/confdialog.cxx:7060 src/dialogs/confdialog.cxx:7903 msgid "Text to send during keyboard idle times" msgstr "" #: src/dialogs/confdialog.cxx:7074 src/dialogs/confdialog.cxx:7917 msgid "Filtering" msgstr "Filterung" #: src/dialogs/confdialog.cxx:7075 msgid "Use DSP filter before decoder" msgstr "DSP Filter vor dem Dekoder nutzen" #: src/dialogs/confdialog.cxx:7081 src/dialogs/confdialog.cxx:7924 msgid "Filter bandwidth factor" msgstr "Filter Bandbreiten Faktor" #: src/dialogs/confdialog.cxx:7082 src/dialogs/confdialog.cxx:7925 msgid "Filter bandwidth relative to signal width" msgstr "Filter Bandbreite relativ zur Signal Breite" #: src/dialogs/confdialog.cxx:7100 msgid "FEC" msgstr "FEC" #: src/dialogs/confdialog.cxx:7101 msgid "Enable MultiPSK-compatible FEC" msgstr "MultiPSK kompatible FEC einschalten" #: src/dialogs/confdialog.cxx:7106 src/dialogs/confdialog.cxx:7943 msgid "CWI threshold" msgstr "" #: src/dialogs/confdialog.cxx:7107 src/dialogs/confdialog.cxx:7944 msgid "CWI detection and suppression" msgstr "" #: src/dialogs/confdialog.cxx:7123 src/dialogs/confdialog.cxx:7979 msgid "Paths (hidden)" msgstr "Pfade (verborgen)" #: src/dialogs/confdialog.cxx:7147 msgid "Feld" msgstr "Feld" #: src/dialogs/confdialog.cxx:7151 msgid "Transmit font" msgstr "Sendeschriftart" #: src/dialogs/confdialog.cxx:7152 msgid "Select TX raster font" msgstr "Sende Rasterschriftart auswählen" #: src/dialogs/confdialog.cxx:7168 msgid "Reverse video" msgstr "Reverse Video" #: src/dialogs/confdialog.cxx:7169 msgid "Display RX in reverse video" msgstr "" #: src/dialogs/confdialog.cxx:7174 msgid "Transmit width" msgstr "Übertragungsbreite" #: src/dialogs/confdialog.cxx:7175 msgid "# of multiple scans / character line" msgstr "" #: src/dialogs/confdialog.cxx:7190 msgid "Halve receive width" msgstr "Halbierte Empfangsbreite" #: src/dialogs/confdialog.cxx:7191 msgid "Compress Rx in time" msgstr "" #: src/dialogs/confdialog.cxx:7196 msgid "Pulse shape" msgstr "Pulseform" #: src/dialogs/confdialog.cxx:7197 msgid "Raised cosine pulse shape factor" msgstr "" #: src/dialogs/confdialog.cxx:7208 msgid "Slow (4 msec)" msgstr "Langsam (4 msek)" #: src/dialogs/confdialog.cxx:7209 msgid "Fast (2 msec)" msgstr "Schnell (2 msek)" #: src/dialogs/confdialog.cxx:7214 msgid "Receive filter bandwidth" msgstr "Empfangs Filterbandbreite" #: src/dialogs/confdialog.cxx:7215 msgid "Adjust the DSP bandwidth" msgstr "DSP Bandbreite einstellen" #: src/dialogs/confdialog.cxx:7235 msgid "Transmit periods (.) when idle" msgstr "" #: src/dialogs/confdialog.cxx:7236 msgid "Transmits a diddle dot when no keyboard activity" msgstr "" #: src/dialogs/confdialog.cxx:7242 msgid "2x Xmt Width (hidden)" msgstr "" #: src/dialogs/confdialog.cxx:7252 msgid "MT-63" msgstr "MT-63" #: src/dialogs/confdialog.cxx:7257 src/dialogs/confdialog.cxx:7398 msgid "8-bit extended characters (UTF-8)" msgstr "" #: src/dialogs/confdialog.cxx:7258 msgid "Enable this for UTF-8 characters" msgstr "" #: src/dialogs/confdialog.cxx:7264 msgid "Long receive integration" msgstr "" #: src/dialogs/confdialog.cxx:7265 msgid "Enable for very weak signals" msgstr "Für sehr schwache Signale einschalten" #: src/dialogs/confdialog.cxx:7275 msgid "Transmit lower start tone" msgstr "" #: src/dialogs/confdialog.cxx:7280 msgid "Transmit upper start tone" msgstr "" #: src/dialogs/confdialog.cxx:7286 msgid "Tone Duration (secs)" msgstr "" #: src/dialogs/confdialog.cxx:7302 msgid "Allow manual tuning" msgstr "" #: src/dialogs/confdialog.cxx:7311 msgid "Olivia" msgstr "Olivia" #: src/dialogs/confdialog.cxx:7316 src/dialogs/confdialog.cxx:7412 msgid "Select bandwidth" msgstr "Bandbreite auswählen" #: src/dialogs/confdialog.cxx:7332 src/dialogs/confdialog.cxx:7428 msgid "Tones" msgstr "Töne" #: src/dialogs/confdialog.cxx:7333 src/dialogs/confdialog.cxx:7429 msgid "Select number of tones" msgstr "Anzahl der Töne auswählen" #: src/dialogs/confdialog.cxx:7349 src/dialogs/confdialog.cxx:7445 msgid "Receive synchronizer" msgstr "" #: src/dialogs/confdialog.cxx:7352 src/dialogs/confdialog.cxx:7448 msgid "Tune margin (tone frequency spacing)" msgstr "" #: src/dialogs/confdialog.cxx:7353 src/dialogs/confdialog.cxx:7372 #: src/dialogs/confdialog.cxx:7449 src/dialogs/confdialog.cxx:7468 msgid "Change ONLY to experiment" msgstr "Dies NUR zum experimentieren ändern" #: src/dialogs/confdialog.cxx:7371 src/dialogs/confdialog.cxx:7467 msgid "Integration period (FEC blocks)" msgstr "" #: src/dialogs/confdialog.cxx:7390 src/dialogs/confdialog.cxx:7486 msgid "Reset FEC blocks when changing BW or Tones" msgstr "" #: src/dialogs/confdialog.cxx:7391 src/dialogs/confdialog.cxx:7399 #: src/dialogs/confdialog.cxx:7487 msgid "Enable this for UTF-8 character transmission" msgstr "" #: src/dialogs/confdialog.cxx:7407 msgid "Cont'" msgstr "Cont'" #: src/dialogs/confdialog.cxx:7494 msgid "8-bit extended characters" msgstr "" #: src/dialogs/confdialog.cxx:7495 msgid "Enable this for Latin-1 accented characters" msgstr "" #: src/dialogs/confdialog.cxx:7504 msgid "PSK" msgstr "PSK" #: src/dialogs/confdialog.cxx:7510 msgid "AFC behavior" msgstr "AFC Verhalten" #: src/dialogs/confdialog.cxx:7513 msgid "Acquisition search range (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:7514 msgid "Capture signals within this frequency range" msgstr "" #: src/dialogs/confdialog.cxx:7533 src/dialogs/confdialog.cxx:9354 msgid "Acquisition S/N (dB)" msgstr "" #: src/dialogs/confdialog.cxx:7534 src/dialogs/confdialog.cxx:9355 msgid "Capture signals over this threshold" msgstr "Signale über diesem Schwellwert erfassen" #: src/dialogs/confdialog.cxx:7555 msgid "S/N and IMD behavior" msgstr "S/N und IMD Verhalten" #: src/dialogs/confdialog.cxx:7558 msgid "after" msgstr "nach" #: src/dialogs/confdialog.cxx:7559 msgid "Behavior of s/n imd" msgstr "Verhalten von s/n imd" #: src/dialogs/confdialog.cxx:7570 msgid "Dim" msgstr "Dim" #: src/dialogs/confdialog.cxx:7575 msgid "seconds" msgstr "Sekunden" #: src/dialogs/confdialog.cxx:7576 msgid "Will occur after this time in seconds" msgstr "Wird nach dieser Zeit in Sek passieren" #: src/dialogs/confdialog.cxx:7596 msgid "Multi-Channel Signal Processing" msgstr "Multikanal Signal Verarbeitung" #: src/dialogs/confdialog.cxx:7599 msgid "Multi-channel detector" msgstr "Multi-Kanal Detektor" #: src/dialogs/confdialog.cxx:7604 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "" "Auf sehr langsamen CPUs ausschalten, falls Signal Browser nicht benutzt wird" #: src/dialogs/confdialog.cxx:7615 src/dialogs/confdialog.cxx:9511 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:7619 msgid "Rx" msgstr "Rx" #: src/dialogs/confdialog.cxx:7624 msgid "AFC speed" msgstr "AFC Geschwindigkeit" #: src/dialogs/confdialog.cxx:7625 msgid "AFC tracking speed" msgstr "AFC Tracking Geschwindigkeit" #: src/dialogs/confdialog.cxx:7641 msgid "RX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:7642 msgid "Revert to unshifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:7647 msgid "Filter Shape Factor" msgstr "Filter Formfaktor" #: src/dialogs/confdialog.cxx:7648 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" "rcos timing Koeffizient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" #: src/dialogs/confdialog.cxx:7660 msgid "Decode (CWI suppression)" msgstr "" #: src/dialogs/confdialog.cxx:7663 msgid "Mark-Space" msgstr "" #: src/dialogs/confdialog.cxx:7668 msgid "Mark only" msgstr "" #: src/dialogs/confdialog.cxx:7673 msgid "Space only" msgstr "" #: src/dialogs/confdialog.cxx:7680 msgid "RTTY Scope Display" msgstr "RTTY Osztilloskop Anzeige" #: src/dialogs/confdialog.cxx:7683 msgid "Use cross hair scope" msgstr "Fadenkreuz verwenden" #: src/dialogs/confdialog.cxx:7684 msgid "Default to cross hair digiscope" msgstr "Standard Fadenkreuz" #: src/dialogs/confdialog.cxx:7689 msgid "XY - classic scope" msgstr "XY - Klassisches Scope" #: src/dialogs/confdialog.cxx:7690 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" #: src/dialogs/confdialog.cxx:7697 msgid "Log RTTY frequency" msgstr "RTTY Frequenz loggen" #: src/dialogs/confdialog.cxx:7700 msgid "Use MARK freq'" msgstr "" #: src/dialogs/confdialog.cxx:7701 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" #: src/dialogs/confdialog.cxx:7708 msgid "track color" msgstr "Spurfarbe" #: src/dialogs/confdialog.cxx:7709 msgid "Color of Mark Track" msgstr "Farbe der Markierungsspur" #: src/dialogs/confdialog.cxx:7719 msgid "Tx" msgstr "Tx" #: src/dialogs/confdialog.cxx:7722 msgid "Carrier shift" msgstr "Trägerverschiebung" #: src/dialogs/confdialog.cxx:7723 msgid "Select carrier shift" msgstr "Trägerverschiebung wählen" #: src/dialogs/confdialog.cxx:7738 msgid "Custom shift" msgstr "Benutzerdefinierte Verschiebung" #: src/dialogs/confdialog.cxx:7739 msgid "Input carrier shift" msgstr "Eingang Träger Verschiebung" #: src/dialogs/confdialog.cxx:7757 msgid "Baud rate" msgstr "Baudrate" #: src/dialogs/confdialog.cxx:7758 msgid "Select carrier baudrate" msgstr "Träber Baudrate wählen" #: src/dialogs/confdialog.cxx:7773 msgid "Bits per character" msgstr "Bits pro Zeichen" #: src/dialogs/confdialog.cxx:7774 msgid "Select # bits / char" msgstr "Auswählen # bits / Zeichen" #: src/dialogs/confdialog.cxx:7789 msgid "Parity" msgstr "Parität" #: src/dialogs/confdialog.cxx:7790 msgid "Select parity" msgstr "Parität auswählen" #: src/dialogs/confdialog.cxx:7805 msgid "Stop bits" msgstr "Stopbits" #: src/dialogs/confdialog.cxx:7806 msgid "Select # stop bits" msgstr "Stopbits # wählen" #: src/dialogs/confdialog.cxx:7821 msgid "AutoCRLF" msgstr "Automatisch CRLF" #: src/dialogs/confdialog.cxx:7822 msgid "Add CRLF after page width characters" msgstr "CRLF nach jeder Seitebreite einfügen" #: src/dialogs/confdialog.cxx:7827 msgid "chars" msgstr "Zeichen" #: src/dialogs/confdialog.cxx:7828 msgid "Auto CRLF line length" msgstr "Auto CRLF Leitungslänge" #: src/dialogs/confdialog.cxx:7846 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:7847 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "Verwende \"cr cr lf\" für \"cr lf\"" #: src/dialogs/confdialog.cxx:7853 msgid "TX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:7854 msgid "Revert to Unsifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:7859 msgid "Pseudo-FSK - right channel" msgstr "Pseudeo FSK - rechter Kanal" #: src/dialogs/confdialog.cxx:7860 msgid "Create keyed square wave on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:7867 msgid "Synop" msgstr "" #: src/dialogs/confdialog.cxx:7870 msgid "SYNOP to ADIF" msgstr "" #: src/dialogs/confdialog.cxx:7871 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" #: src/dialogs/confdialog.cxx:7877 msgid "SYNOP to KML" msgstr "" #: src/dialogs/confdialog.cxx:7878 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" #: src/dialogs/confdialog.cxx:7885 msgid "Interleave SYNOP and text" msgstr "" #: src/dialogs/confdialog.cxx:7886 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "" #: src/dialogs/confdialog.cxx:7898 msgid "Thor" msgstr "Thor" #: src/dialogs/confdialog.cxx:7918 msgid "Enable DSP prior to decoder" msgstr "DSP vor dem Dekoder aktivieren" #: src/dialogs/confdialog.cxx:7960 msgid "Preamble Detection" msgstr "Präamble Erkennung/Detektion" #: src/dialogs/confdialog.cxx:7961 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" #: src/dialogs/confdialog.cxx:7966 msgid "Soft-symbol decoding" msgstr "" #: src/dialogs/confdialog.cxx:7967 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:7972 msgid "Soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:7973 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" #: src/dialogs/confdialog.cxx:8003 msgid "Navtex" msgstr "Navtex" #: src/dialogs/confdialog.cxx:8005 msgid "Log Navtex messages to Adif file" msgstr "Navtex Nachrichten nach ADIF loggen" #: src/dialogs/confdialog.cxx:8010 msgid "Log Navtex messages to KML" msgstr "Navtex Nachrichten nach KML loggen" #: src/dialogs/confdialog.cxx:8011 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" #: src/dialogs/confdialog.cxx:8018 msgid "Wefax" msgstr "Wefax" #: src/dialogs/confdialog.cxx:8021 msgid "Embedded Wefax Gui" msgstr "Eingebetteter Wefax GUI" #: src/dialogs/confdialog.cxx:8022 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" "Anzeige von TX und RX im Fldigi Hauptfenster\n" "Wird nach Neustart aktiv" #: src/dialogs/confdialog.cxx:8027 msgid "Hide Transmission window" msgstr "Sendefenster verbergen" #: src/dialogs/confdialog.cxx:8028 msgid "Hide transmission window by default." msgstr "Sendefenster verbergen als Standard" #: src/dialogs/confdialog.cxx:8033 msgid "Log Wefax messages to Adif file" msgstr "Wetterfax Nachrichten nach ADIF loggen" #: src/dialogs/confdialog.cxx:8034 msgid "Sent and received faxes are logged to Adif file." msgstr "Gesendete und empfangene faxe nach ADIF loggen" #: src/dialogs/confdialog.cxx:8039 msgid "Frequency shift (800 Hz)" msgstr "Frequenzverschiebung (800 Hz)" #: src/dialogs/confdialog.cxx:8040 src/dialogs/confdialog.cxx:8051 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "Standard 800 Hz. Deutscher Wetterdienst 850Hz" #: src/dialogs/confdialog.cxx:8050 msgid "Rx fax max rows" msgstr "" #: src/dialogs/confdialog.cxx:8061 msgid "Fax images destination directory" msgstr "Verzeichnis für Fax Bilder" #: src/dialogs/confdialog.cxx:8066 msgid "Directory..." msgstr "Verzeichnis" #: src/dialogs/confdialog.cxx:8069 msgid "Save image as monochrome file" msgstr "Bilder monochrome (einfarbig) speichern" #: src/dialogs/confdialog.cxx:8070 msgid "Save the fax image as a gray-level PNG file." msgstr "Fax Bilder als Graustufen PNG Datei speichern" #: src/dialogs/confdialog.cxx:8083 msgid "Rig" msgstr "Radio" #: src/dialogs/confdialog.cxx:8084 msgid "Transceiver control" msgstr "Transceiver Steuerung" #: src/dialogs/confdialog.cxx:8088 msgid "Hardware PTT" msgstr "Hardware PTT" #: src/dialogs/confdialog.cxx:8091 src/dialogs/confdialog.cxx:8926 msgid "PTT tone on right audio channel " msgstr "PTT Ton auf dem rechten Audio Kanal" #: src/dialogs/confdialog.cxx:8092 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Kann anstelle oder zusätzlich zu anderen PTT Typen verwendet werden" #: src/dialogs/confdialog.cxx:8099 msgid "h/w ptt device-pin" msgstr "H/W PTT Geräte Pin" #: src/dialogs/confdialog.cxx:8102 msgid "Use separate serial port PTT" msgstr "Separaten seriellen Port für PTT" #: src/dialogs/confdialog.cxx:8107 src/dialogs/confdialog.cxx:8204 #: src/dialogs/confdialog.cxx:8414 src/dialogs/confdialog.cxx:8668 #: src/dialogs/confdialog.cxx:8856 msgid "Device:" msgstr "Gerät:" #: src/dialogs/confdialog.cxx:8121 msgid "Use RTS" msgstr "RTS nutzen" #: src/dialogs/confdialog.cxx:8122 msgid "RTS is PTT signal line" msgstr "RTS ist PTT Signal Anschluss" #: src/dialogs/confdialog.cxx:8126 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:8127 msgid "Initial voltage on RTS" msgstr "Anfängliche Spanung an RTS" #: src/dialogs/confdialog.cxx:8131 msgid "Use DTR" msgstr "DTR nutzen" #: src/dialogs/confdialog.cxx:8132 msgid "DTR is PTT signal line" msgstr "DTR ist PTT Signal Anschluss" #: src/dialogs/confdialog.cxx:8136 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:8137 msgid "Initial voltage on DTR" msgstr "Anfängliche Spannung an DTR" #: src/dialogs/confdialog.cxx:8141 src/dialogs/confdialog.cxx:8305 #: src/dialogs/confdialog.cxx:8567 src/dialogs/confdialog.cxx:8642 #: src/dialogs/confdialog.cxx:9475 msgid "Initialize" msgstr "Initialisieren" #: src/dialogs/confdialog.cxx:8142 msgid "Initialize the H/W PTT interface" msgstr "Hardware PTT initialisieren" #: src/dialogs/confdialog.cxx:8145 msgid "Use parallel port PTT" msgstr "Parallel Port für PTT nutzen" #: src/dialogs/confdialog.cxx:8150 msgid "Use uHRouter PTT" msgstr "" #: src/dialogs/confdialog.cxx:8157 msgid "PTT delays valid for all CAT/PTT types" msgstr "PTT Verzögerung gilt für alle CAT/PTT Typen" #: src/dialogs/confdialog.cxx:8160 msgid "Start of transmit PTT delay" msgstr "Start der PTT Übertragungsverzögung" #: src/dialogs/confdialog.cxx:8161 msgid "Delay NN msec before starting audio" msgstr "NN msek Verzögerung bevor Audio Start" #: src/dialogs/confdialog.cxx:8170 msgid "PTT end of transmit delay" msgstr "PTT Ende Sendeverzögerung" #: src/dialogs/confdialog.cxx:8171 msgid "Delay NN msec before releasing PTT" msgstr "" #: src/dialogs/confdialog.cxx:8184 msgid "RigCAT" msgstr "RigCAT" #: src/dialogs/confdialog.cxx:8185 msgid "Rig Control using xml spec file" msgstr "Radio Steuerung via xml Spec Datei" #: src/dialogs/confdialog.cxx:8187 msgid "Use RigCAT" msgstr "RigCAT nutzen" #: src/dialogs/confdialog.cxx:8188 msgid "RigCAT used for rig control" msgstr "RigCAT wird für Radio Steuerung verwendet" #: src/dialogs/confdialog.cxx:8194 msgid "Rig description file:" msgstr "Radio Konfigurations Datei:" #: src/dialogs/confdialog.cxx:8195 msgid "Use Open to select descriptor file" msgstr "Öffnen um Beschreibungsdatei zu verwenden" #: src/dialogs/confdialog.cxx:8201 msgid "Select rig descriptor file" msgstr "Radio Beschreibungsdatei auswählen" #: src/dialogs/confdialog.cxx:8219 src/dialogs/confdialog.cxx:8429 msgid "Retries" msgstr "Wiederholungen" #: src/dialogs/confdialog.cxx:8220 msgid "# retries before giving up" msgstr "# Wiederholungen bevor ich aufgebe ;)" #: src/dialogs/confdialog.cxx:8236 src/dialogs/confdialog.cxx:8532 msgid "Retry interval (ms)" msgstr "Wiederholungs Intervall (ms)" #: src/dialogs/confdialog.cxx:8237 msgid "Time between retires in msec" msgstr "Zeit zwischen Wiederholungen in msek" #: src/dialogs/confdialog.cxx:8253 src/dialogs/confdialog.cxx:8463 msgid "Write delay (ms)" msgstr "Schreibvzg (ms)" #: src/dialogs/confdialog.cxx:8254 msgid "Wait for response to subsequent command" msgstr "" #: src/dialogs/confdialog.cxx:8270 src/dialogs/confdialog.cxx:8497 msgid "Baud rate:" msgstr "Baud Rate:" #: src/dialogs/confdialog.cxx:8286 src/dialogs/confdialog.cxx:8513 msgid "Stopbits" msgstr "Stopbits" #: src/dialogs/confdialog.cxx:8306 msgid "Initialize RigCAT interface" msgstr "RigCAT Interface initialisieren" #: src/dialogs/confdialog.cxx:8309 msgid "Commands are echoed" msgstr "Echo Kommando" #: src/dialogs/confdialog.cxx:8310 msgid "Rig or interface echos serial data" msgstr "" #: src/dialogs/confdialog.cxx:8315 msgid "CAT command for PTT" msgstr "CAT Kommando für PTT" #: src/dialogs/confdialog.cxx:8316 msgid "PTT is a CAT command (not hardware)" msgstr "PTT ist CAT Kommando (kein Hardware)" #: src/dialogs/confdialog.cxx:8322 msgid "Toggle RTS for PTT" msgstr "" #: src/dialogs/confdialog.cxx:8323 msgid "RTS is ptt line" msgstr "RTS is PTT Anschluss" #: src/dialogs/confdialog.cxx:8328 msgid "Toggle DTR for PTT" msgstr "" #: src/dialogs/confdialog.cxx:8329 msgid "DTR is ptt line" msgstr "DTR ist PTT Anschluss" #: src/dialogs/confdialog.cxx:8334 msgid "RTS +12 v" msgstr "RTS +12 V" #: src/dialogs/confdialog.cxx:8335 src/dialogs/confdialog.cxx:8599 msgid "Initial state of RTS" msgstr "" #: src/dialogs/confdialog.cxx:8340 msgid "DTR +12 v" msgstr "DTR +12V" #: src/dialogs/confdialog.cxx:8341 src/dialogs/confdialog.cxx:8593 msgid "Initial state of DTR" msgstr "" #: src/dialogs/confdialog.cxx:8346 src/dialogs/confdialog.cxx:8604 msgid "RTS/CTS flow control" msgstr "RTS/CTS Flusskontrolle" #: src/dialogs/confdialog.cxx:8347 msgid "Rig uses RTS/CTS handshake" msgstr "Radio verwendet RTS/CTS Handshake" #: src/dialogs/confdialog.cxx:8352 msgid "Restore Settings on Close" msgstr "Wiederherstellen der Einstellungen bei beenden" #: src/dialogs/confdialog.cxx:8353 msgid "Restore the serial (COM) port settings" msgstr "Zurücksetzen der seriellen (COM) Port-Einstellungen" #: src/dialogs/confdialog.cxx:8358 src/dialogs/confdialog.cxx:8617 msgid "Revert" msgstr "Zurücksetzen" #: src/dialogs/confdialog.cxx:8359 msgid "Reset rigCAT interface" msgstr "RigCAT Interface zurücksetzen" #: src/dialogs/confdialog.cxx:8364 msgid "VSP Enable" msgstr "VSP" #: src/dialogs/confdialog.cxx:8365 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "Virtueller Seriell Port Emulator - unterdrückt Warnmeldungen" #: src/dialogs/confdialog.cxx:8370 #, fuzzy msgid "Init delay (ms)" msgstr "Schreibvzg (ms)" #: src/dialogs/confdialog.cxx:8371 msgid "Wait for response to first CAT command" msgstr "" #: src/dialogs/confdialog.cxx:8391 msgid "Hamlib" msgstr "Hamlib" #: src/dialogs/confdialog.cxx:8393 msgid "Use Hamlib" msgstr "Hamlib benutzen" #: src/dialogs/confdialog.cxx:8394 msgid "Hamlib used for rig control" msgstr "Hamlib zur Radio Steuerung verwendet" #: src/dialogs/confdialog.cxx:8400 msgid "Rig:" msgstr "Radio:" #: src/dialogs/confdialog.cxx:8430 msgid "# times to resend command before giving up" msgstr "# Versuche das Kommando erneut zu senden, dann Aufgabe" #: src/dialogs/confdialog.cxx:8446 msgid "Retry Interval (ms)" msgstr "Wiederholungsintervall (ms)" #: src/dialogs/confdialog.cxx:8447 src/dialogs/confdialog.cxx:8533 msgid "Msec's between retries" msgstr "msek zwischen einem erneuten Versuch" #: src/dialogs/confdialog.cxx:8464 msgid "Msec's between sequential commands" msgstr "" #: src/dialogs/confdialog.cxx:8480 msgid "Post write delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:8481 msgid "Wait interval (msecs) before reading response" msgstr "" #: src/dialogs/confdialog.cxx:8552 msgid "Advanced configuration:" msgstr "Fortgeschrittene Konfiguration" #: src/dialogs/confdialog.cxx:8553 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Optionale Konfiguration\n" "im Format: Parameter=wert ..." #: src/dialogs/confdialog.cxx:8568 msgid "Initialize hamlib interface" msgstr "Hamlib Interface initialisieren" #: src/dialogs/confdialog.cxx:8571 msgid "Sideband:" msgstr "Seitenband:" #: src/dialogs/confdialog.cxx:8585 msgid "PTT via Hamlib command" msgstr "PTT via Hamlib Kommando" #: src/dialogs/confdialog.cxx:8586 msgid "PTT is a hamlib command" msgstr "PTT ist ein Hamlib Kommando" #: src/dialogs/confdialog.cxx:8592 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:8598 msgid "RTS +12" msgstr "RST +12" #: src/dialogs/confdialog.cxx:8605 msgid "Rig requires RTS/CTS flow control" msgstr "Radio erfordert RTS/CTS Ablaufsteuerung" #: src/dialogs/confdialog.cxx:8611 msgid "XON/XOFF flow control" msgstr "XON/XOFF Ablaufsteuerung" #: src/dialogs/confdialog.cxx:8612 msgid "Rig requires Xon/Xoff flow control" msgstr "Radio erfordert Xon/Xoff Ablaufsteuerung" #: src/dialogs/confdialog.cxx:8618 msgid "Reset hamlib interface" msgstr "Hamlib Interface zurücksetzen" #: src/dialogs/confdialog.cxx:8627 msgid "XML-RPC" msgstr "XML-RPC" #: src/dialogs/confdialog.cxx:8635 msgid "" "Rig control via external\n" "program using xmlrpc\n" "remote calls." msgstr "" "Radio Steuerung via externem\n" "Programm über xmlrpc\n" "remote calls" #: src/dialogs/confdialog.cxx:8637 msgid "Use XML-RPC program" msgstr "XML-RPC Programm verwenden" #: src/dialogs/confdialog.cxx:8638 msgid "Experimental" msgstr "Experimentell" #: src/dialogs/confdialog.cxx:8643 msgid "Initialize XML-RPC rig control" msgstr "XML-RPC Radio Steuerung initialisieren" #: src/dialogs/confdialog.cxx:8655 msgid "Audio devices" msgstr "Audio Geräte" #: src/dialogs/confdialog.cxx:8659 msgid "Devices" msgstr "Geräte" #: src/dialogs/confdialog.cxx:8662 msgid "OSS" msgstr "OSS" #: src/dialogs/confdialog.cxx:8663 msgid "Use OSS audio server" msgstr "OSS Audio Server verwenden" #: src/dialogs/confdialog.cxx:8669 msgid "Select device" msgstr "Gerät auswählen" #: src/dialogs/confdialog.cxx:8677 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:8678 msgid "Use Port Audio server" msgstr "PortAudio Server verwenden" #: src/dialogs/confdialog.cxx:8683 msgid "Capture:" msgstr "Aufnahme:" #: src/dialogs/confdialog.cxx:8684 msgid "Audio input device" msgstr "Audioeingabegerät" #: src/dialogs/confdialog.cxx:8688 msgid "Playback:" msgstr "Wiedergabe:" #: src/dialogs/confdialog.cxx:8689 msgid "Audio output device" msgstr "Audioausgabegerät" #: src/dialogs/confdialog.cxx:8697 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:8698 msgid "Use Pulse Audio server" msgstr "PulseAudio Server verwenden" #: src/dialogs/confdialog.cxx:8703 msgid "Server string:" msgstr "Server String" #: src/dialogs/confdialog.cxx:8704 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Bitte freilassen, oder \n" "http://www.pulseaudio.org/wiki/ServerStrings lesen" #: src/dialogs/confdialog.cxx:8722 msgid "File I/O only" msgstr "Nur Datei Ein/Ausgabe" #: src/dialogs/confdialog.cxx:8723 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "KEIN AUDIO GERÄT VERFÜGBAR (oder testen)" #: src/dialogs/confdialog.cxx:8732 msgid "Settings" msgstr "Einstellungen" #: src/dialogs/confdialog.cxx:8734 msgid "Sample rate" msgstr "Abtastrate" #: src/dialogs/confdialog.cxx:8737 msgid "Capture" msgstr "Aufnahme" #: src/dialogs/confdialog.cxx:8738 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" #: src/dialogs/confdialog.cxx:8770 msgid "Converter" msgstr "Konverter" #: src/dialogs/confdialog.cxx:8771 msgid "Set the type of resampler used of offset correction" msgstr "" #: src/dialogs/confdialog.cxx:8787 msgid "Corrections" msgstr "Korrekturen" #: src/dialogs/confdialog.cxx:8790 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:8791 msgid "RX sound card correction" msgstr "RX Soundkarten Korrektur" #: src/dialogs/confdialog.cxx:8807 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:8808 msgid "TX sound card correction" msgstr "TX Soundkarten Korrektur" #: src/dialogs/confdialog.cxx:8824 msgid "TX offset" msgstr "TX Offset" #: src/dialogs/confdialog.cxx:8825 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Unterschied zwischen Rx && Tx Frequenz (rig Offset)" #: src/dialogs/confdialog.cxx:8845 msgid "Mixer" msgstr "Mixer" #: src/dialogs/confdialog.cxx:8847 msgid "OSS Mixer" msgstr "OSS Mixer" #: src/dialogs/confdialog.cxx:8850 msgid "Manage mixer" msgstr "Mischer verwalten" #: src/dialogs/confdialog.cxx:8851 msgid "Add mixer controls to main dialog" msgstr "Mixersteuerungen zu Hauptdialog hinzufügen" #: src/dialogs/confdialog.cxx:8857 msgid "Select Mixer device" msgstr "Mixer Gerät auswählen" #: src/dialogs/confdialog.cxx:8872 msgid "Mic In" msgstr "Mikrofon" #: src/dialogs/confdialog.cxx:8873 msgid "Use microphone input" msgstr "Mikrofon Eingang verwenden" #: src/dialogs/confdialog.cxx:8876 msgid "Line In" msgstr "Line in" #: src/dialogs/confdialog.cxx:8877 msgid "Use Line-In device" msgstr "Line-In Eingang verwenden" #: src/dialogs/confdialog.cxx:8881 msgid "PCM" msgstr "PCM" #: src/dialogs/confdialog.cxx:8882 msgid "Set the sound card PCM level" msgstr "Soundkarten PCM Pegel einstellen" #: src/dialogs/confdialog.cxx:8902 msgid "Right channel" msgstr "Rechter Kanal" #: src/dialogs/confdialog.cxx:8904 msgid "Mono audio output" msgstr "Mono Audio Ausgabe" #: src/dialogs/confdialog.cxx:8905 msgid "Force output audio to single channel" msgstr "Audio Ausgabe auf einem Kanal erzwingen" #: src/dialogs/confdialog.cxx:8910 msgid "Modem signal on left and right channels" msgstr "Modem Signal auf dem linken und rechten Kanal" #: src/dialogs/confdialog.cxx:8911 msgid "Left and right channels both contain modem audio" msgstr "Linker und rechter Kanal enthalten Modem Audio" #: src/dialogs/confdialog.cxx:8916 msgid "Reverse Left/Right channels" msgstr "Linken/rechten Kanal vertauschen" #: src/dialogs/confdialog.cxx:8917 msgid "Software reversal of left-right audio channels" msgstr "Software umkehrung der Audio Kanäle rechts/links" #: src/dialogs/confdialog.cxx:8922 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Diese Einstellungen lassen sich auch\n" "auf anderen Registerkarten ändern\n" "sie wurden der Einfachheit halber auch hier aufgeführt\n" "..." #: src/dialogs/confdialog.cxx:8927 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "1000 Hz Ton falls PTT eingeschaltet\n" "Kann anstelle oder zusätzlich zu anderen PTT Typen verwendet werden" #: src/dialogs/confdialog.cxx:8933 msgid "CW QSK signal on right channel" msgstr "CW QSK Signal auf dem rechten Kanal" #: src/dialogs/confdialog.cxx:8934 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Erzeuge 1000 Hz Rechtecksignal auf dem rechten Kanal" #: src/dialogs/confdialog.cxx:8939 msgid "Pseudo-FSK on right audio channel" msgstr "Pseudo FSK auf dem rechten Audio Kanal" #: src/dialogs/confdialog.cxx:8940 msgid "Create 1000 Hz square wave on right channel" msgstr "1000 Hz Rechtecksignal auf dem rechten Kanal erzeugen" #: src/dialogs/confdialog.cxx:8949 msgid "Wav" msgstr "Wav" #: src/dialogs/confdialog.cxx:8951 msgid "Wav write sample rate" msgstr "Wav Abtastrate beim schreiben" #: src/dialogs/confdialog.cxx:8952 msgid "Pick baud rate from list" msgstr "Baudrate aus Liste auswählen" #: src/dialogs/confdialog.cxx:8974 msgid "ID" msgstr "ID" #: src/dialogs/confdialog.cxx:8977 msgid "RsID" msgstr "RsID" #: src/dialogs/confdialog.cxx:8978 msgid "Reed-Solomon ID (Rx)" msgstr "Reed-Solomon ID (Rx)" #: src/dialogs/confdialog.cxx:8981 msgid "Notify only" msgstr "Nur Benachrichtigen" #: src/dialogs/confdialog.cxx:8982 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Diese Option aktivieren um bei RSID Empfang benachrichtigt zu werden\n" "ohne Betriebsart und Frequenz zu ändern" #: src/dialogs/confdialog.cxx:8988 msgid "Receive modes" msgstr "Rx Betriebsarten" #: src/dialogs/confdialog.cxx:8991 msgid "Searches passband" msgstr "Durchlassbereich durchsuchen" #: src/dialogs/confdialog.cxx:8992 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" #: src/dialogs/confdialog.cxx:8997 msgid "Mark prev freq/mode" msgstr "" #: src/dialogs/confdialog.cxx:8998 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" #: src/dialogs/confdialog.cxx:9003 msgid "Disables detector" msgstr "Detektor ausschalten" #: src/dialogs/confdialog.cxx:9004 msgid "Disable further detection when RSID is received" msgstr "Falls RSID aktiviert, weitere Erkennung ausschalten" #: src/dialogs/confdialog.cxx:9011 msgid "Allow errors" msgstr "Fehler erlauben" #: src/dialogs/confdialog.cxx:9012 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" "Gering = 0 Fehler\n" "Mittel = 1 Fehler\n" "Hoch = 2 Fehler" #: src/dialogs/confdialog.cxx:9023 msgid "Medium" msgstr "Medium" #: src/dialogs/confdialog.cxx:9028 msgid "Squelch open (sec)" msgstr "Rauschsperre offen (s)" #: src/dialogs/confdialog.cxx:9029 msgid "Open squelch for nn sec if RSID detected" msgstr "Rauschsperre öffnen für nn sek falls RSID erkannt wurde" #: src/dialogs/confdialog.cxx:9047 msgid "Disable alert dialog" msgstr "Warnmeldungen ausschalten" #: src/dialogs/confdialog.cxx:9048 msgid "Do not show RsID alert dialog box" msgstr "RsID Warnmeldung nicht anzeigen" #: src/dialogs/confdialog.cxx:9053 msgid "Retain tx freq lock" msgstr "" #: src/dialogs/confdialog.cxx:9054 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:9059 msgid "Disable freq change" msgstr "" #: src/dialogs/confdialog.cxx:9060 msgid "Do not automatically change to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:9065 msgid "" "The RsID notification message contents and \n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" "Die RsID Benachrichtigung, deren Inhalte und\n" "Anzeige werden konfiguriert unter \"Mitteilungen\"." #: src/dialogs/confdialog.cxx:9073 msgid "Pre-Signal Tone" msgstr "" #: src/dialogs/confdialog.cxx:9076 msgid "Seconds" msgstr "Sekunden" #: src/dialogs/confdialog.cxx:9077 msgid "Use for triggering amplifier carrier detect" msgstr "Verwenden um eine PA anzusteuern" #: src/dialogs/confdialog.cxx:9085 msgid "Reed-Solomon ID (Tx)" msgstr "Reed-Solomon ID (Tx)" #: src/dialogs/confdialog.cxx:9088 msgid "Transmit modes" msgstr "Sendebetriebsarten" #: src/dialogs/confdialog.cxx:9091 msgid "End of xmt ID" msgstr "Ende der xmt ID" #: src/dialogs/confdialog.cxx:9092 msgid "Add RsID signal to end of transmission" msgstr "RsID Signal an Ende der Übertragung anhängen" #: src/dialogs/confdialog.cxx:9101 msgid "Video" msgstr "Video" #: src/dialogs/confdialog.cxx:9103 msgid "Video Preamble ID" msgstr "Video Präambel ID" #: src/dialogs/confdialog.cxx:9106 msgid "Transmit mode ID" msgstr "Sendebetriebsarten ID" #: src/dialogs/confdialog.cxx:9107 msgid "Waterfall video ID" msgstr "Wasserfall Video ID" #: src/dialogs/confdialog.cxx:9111 msgid "Transmit video text" msgstr "Sende Video Text" #: src/dialogs/confdialog.cxx:9112 msgid "Waterfall video text" msgstr "Wasserfall Video Text" #: src/dialogs/confdialog.cxx:9117 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:9118 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" "Beschränkt auf ein paar Zeichen,\n" "wie in CQEM oder IOTA etc." #: src/dialogs/confdialog.cxx:9132 msgid "Use small font" msgstr "Kleine Schriftart" #: src/dialogs/confdialog.cxx:9133 msgid "" "ON - small font\n" "OFF - large font" msgstr "" "EIN - kleine Schrift\n" "AUS - grosse Schrift" #: src/dialogs/confdialog.cxx:9139 msgid "Chars/Row:" msgstr "Zeichen/Reihe" #: src/dialogs/confdialog.cxx:9140 msgid "Set the number of characters per row" msgstr "Setzen Sie die Anzahl der Zeichen pro Zeile" #: src/dialogs/confdialog.cxx:9160 msgid "500 Hz limit" msgstr "500 Hz Limit" #: src/dialogs/confdialog.cxx:9165 msgid "Mode width limit" msgstr "Betriebs Bandbreiten Begrenzung" #: src/dialogs/confdialog.cxx:9170 msgid "Video ID modes" msgstr "Video ID Modi" #: src/dialogs/confdialog.cxx:9179 msgid "CW Postamble ID" msgstr "CW Postamble ID" #: src/dialogs/confdialog.cxx:9182 msgid "Transmit callsign" msgstr "Rufzeichen übertragen (senden)" #: src/dialogs/confdialog.cxx:9183 msgid "Send Callsign in CW at end of every transmission" msgstr "Rufzeichen in CW am Ende jeder Übertragung senden" #: src/dialogs/confdialog.cxx:9188 msgid "Speed (WPM):" msgstr "Geschwindigkeit (WPM):" #: src/dialogs/confdialog.cxx:9189 msgid "Send at this WPM" msgstr "Mit dieser Geschwindigkeit senden" #: src/dialogs/confdialog.cxx:9209 msgid "CW ID modes" msgstr "CW ID Modi" #: src/dialogs/confdialog.cxx:9224 msgid "CPU" msgstr "CPU" #: src/dialogs/confdialog.cxx:9228 msgid "Slow CPU (less than 700MHz)" msgstr "Langsame CPU (weniger als 700MHz)" #: src/dialogs/confdialog.cxx:9229 msgid "Enable if you're computer does not decode properly" msgstr "Einschalten, falls der PC nicht sauber dekodiert" #: src/dialogs/confdialog.cxx:9238 msgid "NBEMS" msgstr "NBEMS" #: src/dialogs/confdialog.cxx:9240 msgid "NBEMS data file interface" msgstr "NBEMS Datendatei Schnittstelle" #: src/dialogs/confdialog.cxx:9243 msgid "Enable" msgstr "Einschalten" #: src/dialogs/confdialog.cxx:9244 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "" "Dateien extrahieren um sie mit externem Programm \"wrap / flmsg zu nutzen" #: src/dialogs/confdialog.cxx:9249 msgid "Open message folder" msgstr "Nachrichten Ordner öffnen" #: src/dialogs/confdialog.cxx:9250 msgid "Opens NBEMS file folder upon successful capture" msgstr "Öffnet NBEMS Dateiordner nach erfolgreichem Empfang" #: src/dialogs/confdialog.cxx:9257 msgid "Reception of flmsg files" msgstr "Empfang von flmsg Dateien" #: src/dialogs/confdialog.cxx:9260 msgid "Open with flmsg" msgstr "Mit flmsg öffnen" #: src/dialogs/confdialog.cxx:9261 msgid "Open message with flmsg" msgstr "Nachricht mit flmsg öffnen" #: src/dialogs/confdialog.cxx:9266 msgid "Open in browser" msgstr "Im Browser öffnen" #: src/dialogs/confdialog.cxx:9267 msgid "Open file with default browser" msgstr "Datei mit dem Standard Browser öffnen" #: src/dialogs/confdialog.cxx:9272 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:9273 msgid "Enter full path-filename for flmsg" msgstr "Dateipfad zu flmsg eingeben" #: src/dialogs/confdialog.cxx:9286 msgid "Locate flmsg" msgstr "flmsg finden" #: src/dialogs/confdialog.cxx:9290 msgid "Timeout (secs)" msgstr "Timeout (sek)" #: src/dialogs/confdialog.cxx:9291 msgid "Extract times out after NN seconds of inactivity." msgstr "" #: src/dialogs/confdialog.cxx:9308 msgid "Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:9311 msgid "Mail Server Attributes" msgstr "Mail Server Merkmale" #: src/dialogs/confdialog.cxx:9314 msgid "Carrier frequency (Hz)" msgstr "Trägerfrequenz (Hz)" #: src/dialogs/confdialog.cxx:9315 msgid "Default listen / transmit frequency" msgstr "Standard Empfangs / Sende Frequenz" #: src/dialogs/confdialog.cxx:9334 msgid "Search range (Hz)" msgstr "Suchbereich (Hz)" #: src/dialogs/confdialog.cxx:9335 msgid "Listen for signals within this range" msgstr "Auf Signale aus diesem Bereich hören" #: src/dialogs/confdialog.cxx:9374 msgid "AFC range (Hz)" msgstr "AFC Bereich (Hz)" #: src/dialogs/confdialog.cxx:9375 msgid "Limit AFC movement to this range" msgstr "" #: src/dialogs/confdialog.cxx:9394 msgid "Reset to Carrier" msgstr "Zurücksetzen auf Träger" #: src/dialogs/confdialog.cxx:9395 msgid "When no signal present" msgstr "Wenn kein Signal vorliegt" #: src/dialogs/confdialog.cxx:9406 msgid "Report ARQ frames average S/N" msgstr "" #: src/dialogs/confdialog.cxx:9415 msgid "Spotting" msgstr "Spotting" #: src/dialogs/confdialog.cxx:9417 msgid "PSK Reporter" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:9420 msgid "Automatically spot callsigns in decoded text" msgstr "Automatisch Rufzeichen in decodiertem Text suchen" #: src/dialogs/confdialog.cxx:9421 msgid "Parse all incoming text" msgstr "Eingehenden Text auswerten" #: src/dialogs/confdialog.cxx:9426 msgid "Send reception report when logging a QSO" msgstr "Empfangsbericht nur senden wenn QSO geloggt wurde" #: src/dialogs/confdialog.cxx:9427 msgid "Send report only when QSO is logged" msgstr "Sendebericht nur wenn QSO geloggt wurde" #: src/dialogs/confdialog.cxx:9432 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "" "Berichte Radio Frequenz (bitte nur benutzen wenn Sie Rigcontrol haben!)" #: src/dialogs/confdialog.cxx:9433 msgid "Include the transmit frequency" msgstr "Sendefrequenz hinzufügen" #: src/dialogs/confdialog.cxx:9438 msgid "Disable spotting when signal browser(s) are not visible." msgstr "Spotting nur aktivieren, wenn Signale im Browser sichtbar sind." #: src/dialogs/confdialog.cxx:9439 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "Aktivieren um CPU Last bei RTTY und PSK zu reduzieren" #: src/dialogs/confdialog.cxx:9445 msgid "Host:" msgstr "Host:" #: src/dialogs/confdialog.cxx:9446 msgid "To whom the connection is made" msgstr "Server zu welchem die Verbindung hergestellt wird" #: src/dialogs/confdialog.cxx:9461 msgid "Using UDP port #" msgstr "Verwende UDP Port #" #: src/dialogs/confdialog.cxx:9476 msgid "Initialize the socket client" msgstr "Socket Client initialisieren" #: src/dialogs/confdialog.cxx:9479 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:9487 msgid "Sweet Spot" msgstr "" #: src/dialogs/confdialog.cxx:9493 msgid "Default CW tracking point" msgstr "Standard CW Tracking Punkt" #: src/dialogs/confdialog.cxx:9512 msgid "Default RTTY tracking point" msgstr "Standard RTTY Tracking Punkt" #: src/dialogs/confdialog.cxx:9530 msgid "PSK et al." msgstr "PSK und andere" #: src/dialogs/confdialog.cxx:9531 msgid "Default for all other modems" msgstr "Standard für alle anderen Modems" #: src/dialogs/confdialog.cxx:9549 msgid "Always start new modems at these frequencies" msgstr "Neue Modems (Betriebsarten) immer bei diesen Frequenzen beginnen" #: src/dialogs/confdialog.cxx:9550 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "EIN - mit Standard beginnen\n" "AUS - halte aktuelle WF Cursor Position" #: src/dialogs/confdialog.cxx:9558 msgid "K3 A1A configuation" msgstr "K3 A1A Konfiguation" #: src/dialogs/confdialog.cxx:9561 msgid "CW is LSB" msgstr "CW ist LSB" #: src/dialogs/confdialog.cxx:9562 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Dies nur wählen für Elecraft K3\n" "Andere Radios benötigen dies nicht." #: src/dialogs/confdialog.cxx:9571 msgid "Text i/o" msgstr "Text I/O" #: src/dialogs/confdialog.cxx:9573 msgid "Talker Socket (MS only)" msgstr "Talker Socket (nur Windows)" #: src/dialogs/confdialog.cxx:9576 msgid "Talker" msgstr "Talker" #: src/dialogs/confdialog.cxx:9580 msgid "Connect/disconnect to Talker socket server" msgstr "Verbinden/Trennen von Talker Socket Server" #: src/dialogs/confdialog.cxx:9583 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" "Automatisch verbinden, wenn Fldigi startet (der Server muss ereichbar sein)" #: src/dialogs/confdialog.cxx:9590 msgid "Capture rx text to external file" msgstr "Empfangenen Text in eine Datei schreiben" #: src/dialogs/confdialog.cxx:9593 msgid "Enable rx text stream" msgstr "" #: src/dialogs/confdialog.cxx:9594 msgid "Send rx text to file: textout.txt" msgstr "" #: src/dialogs/confdialog.cxx:9603 msgid "DTMF" msgstr "DTMF" #: src/dialogs/confdialog.cxx:9605 msgid "Decode DTMF tones" msgstr "DTMF Töne dekodieren" #: src/dialogs/confdialog.cxx:9606 #, fuzzy msgid "Decode received DTMF tones" msgstr "DTMF Töne dekodieren" #: src/dialogs/confdialog.cxx:9613 msgid "WX" msgstr "WX" #: src/dialogs/confdialog.cxx:9615 msgid "Weather query specification" msgstr "" #: src/dialogs/confdialog.cxx:9618 msgid "METAR station ID code" msgstr "" #: src/dialogs/confdialog.cxx:9619 msgid "" "for example KMDQ for \n" "Huntsville-Madison Executive Airport, AL" msgstr "" #: src/dialogs/confdialog.cxx:9624 msgid "Full report" msgstr "Vollständiger Bericht" #: src/dialogs/confdialog.cxx:9625 msgid "Insert full METAR report" msgstr "" #: src/dialogs/confdialog.cxx:9630 msgid "End of header string:" msgstr "" #: src/dialogs/confdialog.cxx:9631 msgid "" "Text defining end of METAR header\n" "Typically 'Connection: close'\n" "Used to search for station name" msgstr "" #: src/dialogs/confdialog.cxx:9637 msgid "METAR station location" msgstr "" #: src/dialogs/confdialog.cxx:9638 msgid "Add geopolitical name of METAR station" msgstr "" #: src/dialogs/confdialog.cxx:9643 msgid "Conditions" msgstr "Bedingungen" #: src/dialogs/confdialog.cxx:9644 msgid "current wx conditions" msgstr "Aktuelle Wetter Bedingungen" #: src/dialogs/confdialog.cxx:9649 msgid "Fahrenheit" msgstr "Fahrenheit" #: src/dialogs/confdialog.cxx:9650 msgid "report Fahrenheit" msgstr "Melde Fahrenheit" #: src/dialogs/confdialog.cxx:9655 msgid "Celsius" msgstr "Celsius" #: src/dialogs/confdialog.cxx:9656 msgid "report Celsius" msgstr "Melde Celsius" #: src/dialogs/confdialog.cxx:9661 msgid "Miles / Hour" msgstr "Meilen pro Stunde" #: src/dialogs/confdialog.cxx:9662 msgid "report miles per hour" msgstr "Melde Meilen pro Stunde" #: src/dialogs/confdialog.cxx:9667 msgid "kilometers / hour" msgstr "Kilometer pro Stunde" #: src/dialogs/confdialog.cxx:9668 msgid "report kilometers per hour" msgstr "Melde Kilometer pro Stunde" #: src/dialogs/confdialog.cxx:9673 msgid "Inches Mg." msgstr "" #: src/dialogs/confdialog.cxx:9674 msgid "report inches mercury" msgstr "" #: src/dialogs/confdialog.cxx:9679 msgid "mbars" msgstr "mbar" #: src/dialogs/confdialog.cxx:9680 msgid "report millibars" msgstr "Millibar berichten" #: src/dialogs/confdialog.cxx:9685 msgid "Temperature" msgstr "Temperatur" #: src/dialogs/confdialog.cxx:9688 msgid "Wind speed/dir" msgstr "Wind geschw/ Richtung" #: src/dialogs/confdialog.cxx:9691 msgid "Barometric pressure" msgstr "Luftdruck" #: src/dialogs/confdialog.cxx:9694 msgid "Search on web" msgstr "Suche im Internet" #: src/dialogs/confdialog.cxx:9701 msgid "KML" msgstr "KML" #: src/dialogs/confdialog.cxx:9703 msgid "KML files directory" msgstr "KML Datei Verzeichnis" #: src/dialogs/confdialog.cxx:9704 msgid "Where generated KML documents are stored." msgstr "Wo sollen generierte KML Dateien gespeichert werden" #: src/dialogs/confdialog.cxx:9709 msgid "KML root file" msgstr "KML Wurzel Dateisystem" #: src/dialogs/confdialog.cxx:9713 msgid "Minimum distance for splitting aliases (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:9714 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:9724 msgid "Data retention time, in hours (0 for no limit)" msgstr "" #: src/dialogs/confdialog.cxx:9725 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" #: src/dialogs/confdialog.cxx:9734 msgid "KML refresh interval (seconds)" msgstr "KML Auffrisch Intervall (sekunden)" #: src/dialogs/confdialog.cxx:9735 msgid "Refresh time interval written in KML file (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:9751 msgid "KML balloon display style" msgstr "" #: src/dialogs/confdialog.cxx:9752 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" #: src/dialogs/confdialog.cxx:9767 msgid "Command run on KML creation" msgstr "Kommando zur KML File Erstellung" #: src/dialogs/confdialog.cxx:9768 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" #: src/dialogs/confdialog.cxx:9774 msgid "Test command" msgstr "Test Kommando" #: src/dialogs/confdialog.cxx:9775 msgid "Execute command on KML files." msgstr "Befehl auf KML Datei anwenden" #: src/dialogs/confdialog.cxx:9778 msgid "Change dir..." msgstr "Verzeichnis..." #: src/dialogs/confdialog.cxx:9779 msgid "Choose directory to store KML documents" msgstr "Verzeichnis wählen in dem die KML Dateien gespeichert werden sollen" #: src/dialogs/confdialog.cxx:9782 msgid "Cleanup KML data now !" msgstr "KML Daten jetzt aufräumen" #: src/dialogs/confdialog.cxx:9783 msgid "Cleanups KML documents, empties Google Earth display." msgstr "KML Dokumente aufräumen, Google Earth Anzeige löschen" #: src/dialogs/confdialog.cxx:9786 msgid "Cleanup on startup" msgstr "Löschen bei Programmstart" #: src/dialogs/confdialog.cxx:9787 msgid "Empties KML documents when starting program." msgstr "Bei Programmstart KML Datein leeren" #: src/dialogs/confdialog.cxx:9798 msgid "Web" msgstr "Web" #: src/dialogs/confdialog.cxx:9799 msgid "Callsign database" msgstr "Rufzeichen Datenbank" #: src/dialogs/confdialog.cxx:9802 msgid "Call Lookup" msgstr "Rufzeichen nachschlagen" #: src/dialogs/confdialog.cxx:9803 msgid "Web Browser lookup" msgstr "Via Web Browser nachschlagen" #: src/dialogs/confdialog.cxx:9807 msgid "Do not use callsign lookup via web browser" msgstr "Rufzeichen Lookup via Web Browser nicht verwenden" #: src/dialogs/confdialog.cxx:9813 msgid "QRZ online via default Internet Browser" msgstr "QRZ online via Standard Internet Browser" #: src/dialogs/confdialog.cxx:9814 msgid "Visit QRZ web site" msgstr "QRZ Webseite besuchen" #: src/dialogs/confdialog.cxx:9819 msgid "HamCall online via default Internet Browser" msgstr "Hamcall online mit dem Standard Browser" #: src/dialogs/confdialog.cxx:9820 src/dialogs/confdialog.cxx:9868 msgid "Visit Hamcall web site" msgstr "Hamcall Webseite besuchen" #: src/dialogs/confdialog.cxx:9825 msgid "HamQTH via default Internet Browser" msgstr "HamQTH mit dem Standard Browser" #: src/dialogs/confdialog.cxx:9826 msgid "Visit hamQTH web site" msgstr "HamQTH Webseite besuchen" #: src/dialogs/confdialog.cxx:9833 msgid "Data base lookup" msgstr "In Datenbank nachschlagen" #: src/dialogs/confdialog.cxx:9837 msgid "Do not use callsign database" msgstr "Rufzeichen Datenbank nicht verwenden" #: src/dialogs/confdialog.cxx:9843 msgid "QRZ cdrom" msgstr "QRZ CDROM" #: src/dialogs/confdialog.cxx:9844 msgid "Use CD or hard drive CD image" msgstr "CDROM oder Festplatte verwenden" #: src/dialogs/confdialog.cxx:9849 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:9850 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "Sie benötigen einen kostenpflichtigen QRZ online\n" "Zugang um diesen Service zu nutzen" #: src/dialogs/confdialog.cxx:9855 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:9856 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "Sie benötigen ein kostenpflichtiges Hamcall online\n" "Abonnement um diesen Service nutzen zu können" #: src/dialogs/confdialog.cxx:9861 msgid "HamQTH.com (free service http://www.hamqth.com)" msgstr "HamQTH.com (freier Service http://www.hamqth.com)" #: src/dialogs/confdialog.cxx:9862 msgid "Free service courtesy of OK" msgstr "Kostenloser Service mit freundlicher Genehmigung von OK" #: src/dialogs/confdialog.cxx:9867 msgid "Callook.info lookup (free service US callsigns only)" msgstr "Callbook.info Abfrage (Kostenloser Service nur für US Rufzeichen)" #: src/dialogs/confdialog.cxx:9873 msgid "at:" msgstr "at:" #: src/dialogs/confdialog.cxx:9874 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "z.B.: /home/dave/CALLBK/ or C:/CALLBK/\n" "Freilassen um nach Datenbank zu suchen" #: src/dialogs/confdialog.cxx:9888 msgid "User name" msgstr "Benutzername" #: src/dialogs/confdialog.cxx:9889 src/dialogs/confdialog.cxx:9935 #: src/dialogs/confdialog.cxx:9970 msgid "Your login name" msgstr "Ihr Anmeldename" #: src/dialogs/confdialog.cxx:9903 src/dialogs/confdialog.cxx:9949 msgid "Password" msgstr "Passwort" #: src/dialogs/confdialog.cxx:9904 src/dialogs/confdialog.cxx:9950 msgid "Your login password" msgstr "Ihr Anmelde Passwort" #: src/dialogs/confdialog.cxx:9919 src/dialogs/confdialog.cxx:9965 msgid "Show" msgstr "Anzeigen" #: src/dialogs/confdialog.cxx:9920 src/dialogs/confdialog.cxx:9966 msgid "Show password in plain text" msgstr "Passwort im Klartext anzeigen" #: src/dialogs/confdialog.cxx:9923 msgid "Add address to notes field" msgstr "" #: src/dialogs/confdialog.cxx:9932 msgid "eQSL" msgstr "eQSL" #: src/dialogs/confdialog.cxx:9934 msgid "User ID" msgstr "Benutzer ID" #: src/dialogs/confdialog.cxx:9969 msgid "QTH Nickname" msgstr "QTH Spitzname" #: src/dialogs/confdialog.cxx:9984 msgid "Options" msgstr "Optionen" #: src/dialogs/confdialog.cxx:9987 msgid "send when logged (log button, , )" msgstr "Senden wenn im Log (log Button, , )" #: src/dialogs/confdialog.cxx:9988 msgid "automatic data upload" msgstr "Automatischer Daten upload" #: src/dialogs/confdialog.cxx:9993 msgid "Default message" msgstr "Standard Nachricht" #: src/dialogs/confdialog.cxx:9994 msgid "default text to send with etc" msgstr "Standard Text der mit dem Makro gesendet wird" #: src/dialogs/confdialog.cxx:10008 msgid "Text Tags (tags use {} delimiters)" msgstr "" #: src/dialogs/confdialog.cxx:10011 #, fuzzy msgid " {CALL} other ops call sign" msgstr "{CALL} Rufzeichen des anderen OM" #: src/dialogs/confdialog.cxx:10014 #, fuzzy msgid " {MODE} full mode / submode" msgstr "{MODE} Hauptmodus / Untermodus" #: src/dialogs/confdialog.cxx:10017 msgid "{NAME} other ops name" msgstr "{NAME} Name des anderen OM" #: src/dialogs/confdialog.cxx:10020 msgid "These tags can also be used in " msgstr "" #: src/dialogs/confdialog.cxx:10024 msgid "Use date/time off for log entry" msgstr "Datum/Zeit off für Logeintrag nutzen" #: src/dialogs/confdialog.cxx:10025 msgid "default uses date/time on" msgstr "Standard nutzt Datum/Zeit an" #: src/dialogs/confdialog.cxx:10043 msgid "Auto start programs with fldigi" msgstr "Folgende Programme automatisch mit Fldigi starten" #: src/dialogs/confdialog.cxx:10046 msgid "flrig:" msgstr "flrig:" #: src/dialogs/confdialog.cxx:10047 src/dialogs/confdialog.cxx:10065 #: src/dialogs/confdialog.cxx:10083 src/dialogs/confdialog.cxx:10101 #: src/dialogs/confdialog.cxx:10119 src/dialogs/confdialog.cxx:10137 #: src/dialogs/confdialog.cxx:10155 msgid "" "Enter full path-filename for external program\n" "Or simple name of program" msgstr "" "Vollen Dateinamen zu externem Programm eingeben\n" "oder einfacher Name des Programms" #: src/dialogs/confdialog.cxx:10060 src/dialogs/confdialog.cxx:10078 #: src/dialogs/confdialog.cxx:10096 src/dialogs/confdialog.cxx:10114 #: src/dialogs/confdialog.cxx:10132 src/dialogs/confdialog.cxx:10150 #: src/dialogs/confdialog.cxx:10168 msgid "Locate" msgstr "finden" #: src/dialogs/confdialog.cxx:10061 msgid "Locate flrig executable" msgstr "Flrig.exe Datei finden" #: src/dialogs/confdialog.cxx:10064 msgid "flamp:" msgstr "flamp:" #: src/dialogs/confdialog.cxx:10079 msgid "Locate flamp executable" msgstr "flamp.exe Datei finden" #: src/dialogs/confdialog.cxx:10082 msgid "flnet:" msgstr "flnet:" #: src/dialogs/confdialog.cxx:10097 msgid "Locate flnet executable" msgstr "flnet.exe Datei finden" #: src/dialogs/confdialog.cxx:10100 msgid "fllog:" msgstr "fllog:" #: src/dialogs/confdialog.cxx:10115 msgid "Locate fllog executable" msgstr "fllog.exe Datei finden" #: src/dialogs/confdialog.cxx:10118 msgid "Prog 1:" msgstr "Prog 1:" #: src/dialogs/confdialog.cxx:10133 msgid "Locate program #1 executable" msgstr "Programmdatei #1 finden" #: src/dialogs/confdialog.cxx:10136 msgid "Prog 2:" msgstr "Prog 2:" #: src/dialogs/confdialog.cxx:10151 msgid "Locate program #2 executable" msgstr "Programmdatei #2 finden" #: src/dialogs/confdialog.cxx:10154 msgid "Prog 3:" msgstr "Prog 3:" #: src/dialogs/confdialog.cxx:10169 msgid "Locate program #3 executable" msgstr "Programmdatei #3 finden" #: src/dialogs/confdialog.cxx:10172 msgid "" "Enable\n" "-" msgstr "" "Einschalten\n" "-" #: src/dialogs/confdialog.cxx:10173 src/dialogs/confdialog.cxx:10180 #: src/dialogs/confdialog.cxx:10186 src/dialogs/confdialog.cxx:10192 #: src/dialogs/confdialog.cxx:10198 src/dialogs/confdialog.cxx:10204 #: src/dialogs/confdialog.cxx:10210 msgid "Enable this entry when fldigi first starts" msgstr "Diesen Eintrag aktivieren wenn Fldigi zum ersten Mal startet" #: src/dialogs/confdialog.cxx:10215 src/dialogs/confdialog.cxx:10219 #: src/dialogs/confdialog.cxx:10223 src/dialogs/confdialog.cxx:10227 #: src/dialogs/confdialog.cxx:10231 src/dialogs/confdialog.cxx:10235 #: src/dialogs/confdialog.cxx:10239 msgid "Test" msgstr "Test" #: src/dialogs/confdialog.cxx:10216 msgid "Start flrig" msgstr "Start flrig" #: src/dialogs/confdialog.cxx:10220 msgid "Start flamp" msgstr "Start flamp" #: src/dialogs/confdialog.cxx:10224 msgid "Start flnet" msgstr "Start flnet" #: src/dialogs/confdialog.cxx:10228 msgid "Start fllog" msgstr "Start fllog" #: src/dialogs/confdialog.cxx:10232 msgid "Start prog1" msgstr "Start prog1" #: src/dialogs/confdialog.cxx:10236 msgid "Start prog2" msgstr "Start prog2" #: src/dialogs/confdialog.cxx:10240 msgid "Start prog3" msgstr "Start prog3" #: src/dialogs/confdialog.cxx:10255 msgid "Restore defaults" msgstr "Std wiederherstellen" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "Schriftfarbe" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "Schrift:" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "Größe:" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "&Okay" #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #: src/dialogs/font_browser.cxx:283 msgid "Reading fonts..." msgstr "Schriftarten einlesen ..." #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "Quelle für Datendatei" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "Datendatei update" #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "Datenquellen und Tabellen" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "Daten Quelle" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "Verzeichnis für Daten" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Ereignis" #: src/dialogs/notifydialog.cxx:112 msgid "RE:" msgstr "RE:" #: src/dialogs/notifydialog.cxx:124 msgid "Enabled" msgstr "Eingeschaltet" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filter" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "DXCC Datensätze" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Zeige DXCC Datensätze" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "Noch nicht zuvor gearbeitet" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "LoTW Benutzer" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "eQSL Benutzer" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Duplikate" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Duplikate ignorieren" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "Eingang:" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Zeit (s):" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Aktion" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "Triggerschwelle (s):" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Minimale Zeit zwischen Ereignissen" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Zeige Alarm Fenster" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Standard Text einfügen" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Fenster nach (s) verbergen:" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "RX Text anhängen" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "TX Text anhängen" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Makro Editor anzeigen" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Programm starten:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "DXCC Datensätze" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Land finden" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Eingabetaste drücken um weiter zu suchen" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Prefix finden:" #: src/logbook/lgbook.cxx:397 msgid "Export Setup" msgstr "Export Setup" #: src/logbook/lgbook.cxx:398 src/logbook/lgbook.cxx:1040 msgid "Select Records to Export" msgstr "Wählen Sie die zu exportierenden Datensätze" #: src/logbook/lgbook.cxx:406 src/logbook/lgbook.cxx:456 #: src/logbook/lgbook.cxx:1048 src/logbook/lgbook.cxx:1122 msgid "Check All" msgstr "Alles prüfen" #: src/logbook/lgbook.cxx:409 msgid "Start Date" msgstr "Startdatum" #: src/logbook/lgbook.cxx:410 msgid "Start date for export" msgstr "Startdatum für den Export" #: src/logbook/lgbook.cxx:423 msgid "Stop Date" msgstr "Stoppdatum" #: src/logbook/lgbook.cxx:424 msgid "Inclusive stop date for export" msgstr "Inclusive Stoppdatum für den Export" #: src/logbook/lgbook.cxx:437 msgid "select by date" msgstr "Auswahl / Datum" #: src/logbook/lgbook.cxx:438 msgid "Enable to select date range" msgstr "Aktivieren um Datumsbereich auszuwählen" #: src/logbook/lgbook.cxx:450 msgid "Select Fields to Export" msgstr "Zu exportierende Felder wählen" #: src/logbook/lgbook.cxx:478 msgid "QSO Date On" msgstr "QSO Datum Start" #: src/logbook/lgbook.cxx:482 msgid "QSO Date Off" msgstr "QSO Datum Ende" #: src/logbook/lgbook.cxx:486 msgid "Time ON" msgstr "Startzeit" #: src/logbook/lgbook.cxx:490 src/logbook/lgbook.cxx:1091 msgid "Time OFF" msgstr "Endzeit" #: src/logbook/lgbook.cxx:494 msgid "TX Power" msgstr "Sendeleistung" #: src/logbook/lgbook.cxx:497 src/logbook/lgbook.cxx:1095 msgid "RST sent" msgstr "RST gesendet" #: src/logbook/lgbook.cxx:501 src/logbook/lgbook.cxx:1099 msgid "RST rcvd" msgstr "RST empfangen" #: src/logbook/lgbook.cxx:505 src/logbook/lgbook.cxx:731 msgid "Qth" msgstr "Qth" #: src/logbook/lgbook.cxx:508 msgid "LOC" msgstr "LOC" #: src/logbook/lgbook.cxx:515 src/logbook/lgbook.cxx:876 msgid "QSL-VIA" msgstr "QSL-VIA" #: src/logbook/lgbook.cxx:527 msgid "QSL rcvd date" msgstr "QSL erhalten" #: src/logbook/lgbook.cxx:530 msgid "QSL sent date" msgstr "QSL gesendet" #: src/logbook/lgbook.cxx:533 src/logbook/lgbook.cxx:1103 msgid "Serial # in" msgstr "SNummer # ein" #: src/logbook/lgbook.cxx:536 src/logbook/lgbook.cxx:1107 msgid "Serial # out" msgstr "SNummer # aus" #: src/logbook/lgbook.cxx:545 src/logbook/lgbook.cxx:804 #: src/logbook/lgbook.cxx:805 msgid "County" msgstr "Land" #: src/logbook/lgbook.cxx:551 src/logbook/lgbook.cxx:828 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:554 src/logbook/lgbook.cxx:864 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:557 src/logbook/lgbook.cxx:816 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:560 src/logbook/lgbook.cxx:840 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:570 msgid "Logbook" msgstr "Logbuch" #: src/logbook/lgbook.cxx:571 msgid "Date On" msgstr "Datum an" #: src/logbook/lgbook.cxx:572 msgid "Date QSO started" msgstr "Startdatum QSO" #: src/logbook/lgbook.cxx:585 msgid "Time QSO started" msgstr "Startzeit QSO" #: src/logbook/lgbook.cxx:597 msgid "Call sign worked" msgstr "Rufzeichen bereits gearbeitet" #: src/logbook/lgbook.cxx:609 msgid "Operator worked" msgstr "Operator gearbeitet" #: src/logbook/lgbook.cxx:621 msgid "Rst received" msgstr "RST empfangen" #: src/logbook/lgbook.cxx:632 msgid "QSL-rcvd" msgstr "QSL empfangen" #: src/logbook/lgbook.cxx:633 msgid "QSL received on this date" msgstr "QSL bekommen an diesem Tag" #: src/logbook/lgbook.cxx:645 msgid "Date Off" msgstr "Datum off" #: src/logbook/lgbook.cxx:646 msgid "Date QSO Ended" msgstr "Datum wann QSO beeendet" #: src/logbook/lgbook.cxx:659 msgid "Time QSO ended" msgstr "QSO beendet um" #: src/logbook/lgbook.cxx:670 msgid "Freq." msgstr "Frequenz" #: src/logbook/lgbook.cxx:671 msgid "Frequency in MHz" msgstr "Frequenz in MHz" #: src/logbook/lgbook.cxx:683 msgid "Mode in use" msgstr "Verwendete Betriebsart" #: src/logbook/lgbook.cxx:694 msgid "Pwr" msgstr "Pwr" #: src/logbook/lgbook.cxx:695 msgid "Transmit power used" msgstr "Verwendete Sendeleistung" #: src/logbook/lgbook.cxx:707 msgid "Rst sent" msgstr "RST gesendet" #: src/logbook/lgbook.cxx:718 msgid "QSL-sent" msgstr "QSL gesendet" #: src/logbook/lgbook.cxx:719 msgid "QSL sent on this date" msgstr "QSL gesendet an diesem Tag" #: src/logbook/lgbook.cxx:732 msgid "City of station worked" msgstr "Heimatstadt der gearbeiteten Station" #: src/logbook/lgbook.cxx:743 msgid "St" msgstr "St" #: src/logbook/lgbook.cxx:744 msgid "US state of station worked" msgstr "US Bundesstaat der gearbeiteten Station" #: src/logbook/lgbook.cxx:755 msgid "Pr" msgstr "Pr" #: src/logbook/lgbook.cxx:756 msgid "Province of station worked" msgstr "Provinz der gearbeiteten Station" #: src/logbook/lgbook.cxx:768 msgid "Country of station worked" msgstr "Land der gearbeiteten Station" #: src/logbook/lgbook.cxx:779 msgid "Loc" msgstr "Locator" #: src/logbook/lgbook.cxx:780 msgid "Stations grid square" msgstr "Grid Square (Planquadrat) der Station" #: src/logbook/lgbook.cxx:792 msgid "Interesting notes" msgstr "Interessante Hinweise" #: src/logbook/lgbook.cxx:817 msgid "Islands on the air" msgstr "Islands on the air (IOTA)" #: src/logbook/lgbook.cxx:852 msgid "CONT" msgstr "CONT" #: src/logbook/lgbook.cxx:865 msgid "DXCC designator" msgstr "DXCC Bezeichner" #: src/logbook/lgbook.cxx:877 msgid "QSL route of contacted station" msgstr "" #: src/logbook/lgbook.cxx:888 msgid "Ser out" msgstr "SNummer aus" #: src/logbook/lgbook.cxx:889 msgid "Contest serial # sent" msgstr "Contest Seriennummer # gesendet" #: src/logbook/lgbook.cxx:901 msgid "Contest exchange sent" msgstr "Contest Austausch Information gesendet" #: src/logbook/lgbook.cxx:912 msgid "Ser in" msgstr "SNummer ein" #: src/logbook/lgbook.cxx:913 msgid "Contest serial # received" msgstr "Contest Seriennummer # empfangen" #: src/logbook/lgbook.cxx:925 msgid "Contest exchange received" msgstr "Contest Austausch Information erhalten" #: src/logbook/lgbook.cxx:936 msgid "Call Search" msgstr "Rufzeichen Suche" #: src/logbook/lgbook.cxx:937 msgid "Search for this callsign" msgstr "Suche nach diesem Rufzeichen" #: src/logbook/lgbook.cxx:948 msgid "Recs" msgstr "Einträge" #: src/logbook/lgbook.cxx:949 msgid "# Records in logbook" msgstr "# Einträge im Logbuch" #: src/logbook/lgbook.cxx:961 msgid "New record / Save record" msgstr "Neuer Eintrag / Eintrag speichern " #: src/logbook/lgbook.cxx:968 msgid "Update the current record" msgstr "Aktuellen Eintrag aktualisieren" #: src/logbook/lgbook.cxx:975 msgid "Delete the current record" msgstr "Aktuellen Eintrag löschen" #: src/logbook/lgbook.cxx:981 msgid "Dial" msgstr "Wählen" #: src/logbook/lgbook.cxx:982 msgid "Retrieve for active modem use" msgstr "Abrufen für aktive Modem Nutzung" #: src/logbook/lgbook.cxx:989 msgid "Find previous" msgstr "Finde vorheriges" #: src/logbook/lgbook.cxx:997 msgid "Find next" msgstr "Finde nächstes" #: src/logbook/lgbook.cxx:1020 msgid "Date" msgstr "Datum" #: src/logbook/lgbook.cxx:1022 msgid "Time" msgstr "Uhrzeit" #: src/logbook/lgbook.cxx:1039 msgid "Cabrillo Setup" msgstr "Cabrillo Einstellungen" #: src/logbook/lgbook.cxx:1059 msgid "Select Cabrillo Contest & Fields" msgstr "Cabrillo Contest & Felder auswählen" #: src/logbook/lgbook.cxx:1062 msgid "Contest:" msgstr "Contest:" #: src/logbook/lgbook.cxx:1087 msgid "QSO Date" msgstr "QSO Datum" #~ msgid "Char set" #~ msgstr "Zeichensatz" #~ msgid "FFT latency (scan merging)" #~ msgstr "FFT Latenz (scan merging)" #~ msgid "Select serial port" #~ msgstr "Seriellen Port auswählen" #~ msgid "Serial device" #~ msgstr "Serielles Gerät" #~ msgid "Select the rig by name" #~ msgstr "Radio nach Name ausuchen" #~ msgid "Serial port" #~ msgstr "Serieller Anschluss/Port" #~ msgid "Serial port baud rate" #~ msgstr "Baud rate des seriellen ports" fldigi-3.21.80/po/boldquot.sed0000664000175000017500000000033112313064025013003 00000000000000s/"\([^"]*\)"/“\1â€/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“â€/""/g s/“/“/g s/â€/â€/g s/‘/‘/g s/’/’/g fldigi-3.21.80/po/quot.sed0000664000175000017500000000023112313064025012141 00000000000000s/"\([^"]*\)"/“\1â€/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“â€/""/g fldigi-3.21.80/po/it.gmo0000664000175000017500000021333312313333722011610 00000000000000Þ• „ wì@ÈVÉVÎVÒVçV$ëVW*+WVWkW rW}WW“W™W ¢W®W²W¶W ¼W ÉWÓW éWöWXX!X9X>XCXHXZXtXŠX¡X¶XÏX&èXY#Y":Y]Y{Y€Y& YÇYåYþYZ Z&ZDZIZdZyZZ"£ZÆZÚZ ïZ [1[ G[S[d[w[ˆ[—[¦[!¸[Ú[÷[\!/\Q\"a\„\£\¼\ Ì\'Ù\]]"]B](`]‰]›] º]Û] î]'ü]$^)^>^]^s^‡^›^·^Ê^ß^ ã^ð^ÿ^ __,_ 1_=_C_K_`_~_…_$‰_®_!Ä_æ_þ_`/`3`&G` n` y`„`,¢`Ï`#Ø`ü`a"a(aD:a a a˜a¨a*»aæa/úa2*b]b{b„b b,¼bébþb)c)0c)Zc1„c¶c»c Ìc Öc àcëcücdd,d4d Td_dfd ndydd’d)–dÀdÈdÌdÕdÜdád ädðde e"e2e Pe^e meye ~eŠe›e¤e ¶e8Àe ùefff3f Bf#cf+‡f³f¼f Ófáf&úf!gAg [g |g‰g(šgÃgØg+ïg h)h78h ph {h…hšhW¯hii$i;i Ai0Ki |i ‡i&“i3ºiîi jj jj%j5jHj]jqj…j j*›jÆjÎjâjüjk,k 5k?kTkpkyk ˜k¢k§k °k¼kÜk;ôk0lFlNlhll lœl ¯l¹l½l ÅlÏlØlïlÿlm m "m.m@mEmTmemymm‡m¡m¸m Ômàm#ým!n=n]nfnmn~n§‡n¤/oÔoêoòo,úo 'p3p:p >p/Jp:zpµp½p!Ùpûp q %q0q1Gq yqƒq žq©q Äq ÏqÛqâqrr8r Wr9br%œrÂr0ßr2sCs+Ys…sss?¬s"ìs-t=tXt^t dtnt qt }t Št”t®t ³t ÀtÍtátôt u:uYu_ucu ru€u žu ¬u3ºuîuõuv)v Hv Rv `v jv wv…vŒvœv­vÂv$×vüvww&w +w6w>wDwb\w!¿w/áw#x 5xVx[x axkx|xŒx‘x,™xÆxÎxÖxÞx+òx y*y1y MyZyqyŒy’y•y™yžy§y¬y¾yÁyÔyóyøy z"z9z Pzwz–z ²z!Ózõz{9&{`{t{,ƒ{ °{6¾{ õ{ |"|B|U|i| m|x|*|I¬|6ö|<-},j}9—}Ñ}.ð}0~ÏP~  >2_’$š¿ÂÇÚ$ê:€J€R€ V€c€{€ƒ€Œ€¤€ ·€ÀË€ ä€ ñ€û€ !AGW^~ •¢²»ÂÓïôú ÿ ‚‚,‚ 2‚@‚G‚b‚#h‚(Œ‚'µ‚Ý‚"ô‚ƒ7ƒNƒbƒuƒ{ƒ•ƒ&¤ƒ˃Ûƒàƒæƒêƒíƒðƒ„„)„2„7„I„ O„!]„!„¡„(¤„BÍ„ …;1…1m…Ÿ…£…§…®…±…¸…Ò…ì…† † † †?†O†a†q†…† †ª†(¼†å†õ†/ý†-‡6‡K‡ [‡i‡|‡/‹‡»‡ Á‡ ׇ̇Û‡߇ ㇠ð‡#û‡ˆ 7ˆXˆ oˆyˆ€ˆ˜ˆ¡ˆ§ˆ¶ˆ.ψþˆ‰ ‰!‰/A‰q‰ w‰‰—‰°‰³‰É#Û‰ÿ‰Š0!ŠRŠeŠnŠwŠ!’Š´Š ¼Š ÈŠÓŠ'׊ÿŠ‹ ‹ &‹4‹ N‹\‹r‹{‹„‹ ‹ š‹ ¦‹*²‹Ý‹á‹å‹ê‹ î‹ú‹ŒŒŒŒ&Œ/Œ8Œ?Œ GŒQŒZŒqŒŒ–Œ ›Œ¦Œ­ŒvÆŒ=M e †”¥ÄÌ åó ŽŽ,ŽEŽZŽ _ŽkŽ€Ž•ŽœŽ³Ž;ÑŽ •©ºËÓçûÿ $AE eq‰;¡Ýó"ü!‘"A‘d‘‘„‘‹‘ §‘´‘ ½‘ ɑ֑ߑç‘ì‘’’ ’’ ’"’'’ 0’ª<’ ç’ò’““/“ ?“ L“Y“k“s“y“ €““¦“¸“Ç“Ï“Ö“ë“ þ“ ”*”B”V”o”…”–”®” Ô7Ñ” •&•=• Y•g• ‚•<£•à•*ü•'–0;–+l–˜–©– »– Æ–(Ô–#ý–!!—C—I—R—k— Š— –— £—±—À—Ó—$î—˜30˜d˜m˜˜ž˜£˜¶˜ɘ"ؘ û˜ ™*™G™X™j™‰™™™ µ™!Ù å™ï™þ™ šš ,š:š*@š kšŒš4¬š ášïš ›9!› [› f›s›x›€›‰››› £›±›Ä›Ç›Í›Ý›ã›ô›ü›œ %œ/œ-8œfœ œ Œœ—œžœ¢œ«œ ²œ ¾œÈœÏœ èœòœ÷œþœ) @!Jl t•'žÆqÎ@ž+Už/ž%±žBמ:Ÿ+UŸŸ†Ÿ ‹Ÿ•ŸžŸ¦Ÿ¯Ÿ·ŸÆŸן ôŸ    " 1 P W j } ’ ˜ ° ¹ Í ç ð ÿ  ¡¡9¡J¡Y¡x¡Œ¡œ¡¶¡Ê¡Ù¡0ê¡ ¢&¢9¢$>¢c¢w¢‹¢Ÿ¢³¢Ç¢Û¢ä¢!좣£ £ "£,£5£P£U£ \£h£€£›£°£Σì£ô£ ¤¤(¤"=¤`¤v¤¤ •¤ ¤)´¤Þ¤ò¤+¥3¥E¥Z¥p¥¥œ¥­¥ ¼¥Æ¥ ×¥â¥:ê¥%¦4¦F¦K¦0^¦ ¦¦´¦ ǦѦâ¦ô¦ ý¦ § §!§ )§-6§d§ l§v§ާ¡§¶§ѧä§*ù§ $¨,/¨ \¨i¨%€¨¦¨ ¶¨À¨ѨÖ¨Þ¨ç¨ý¨"©5$©1Z©Œ©œ©°©¶©º© ½©'Ç©ï©÷©ªª%ª8ªGKª“ª—ªŸª¦ª®ª¶ªЪäª~øªw¬|¬€¬™¬(¬'Ƭ>î¬-­ C­ Q­\­k­q­x­}­Œ­­˜­ ž­ «­µ­Ë­Û­ô­ö­!û­®"®'®$,®!Q®)s®®º®×®"ö®3¯M¯e¯ €¯)¡¯˯)Я'ú¯"°A°`°r°„°а©°®°ʰ5â° ±"9±\±w±$Œ±'±±Ù± ñ±ý±²/²D²W²j²!‰²«²Ȳå² ³#³&@³'g³³¨³ ų'ѳ!ù³´$ ´"E´(h´‘´¤´'´ê´þ´' µ5µ:µ,Qµ~µ•µªµ!¿µáµöµ¶¶ &¶4¶ E¶S¶q¶ v¶„¶Œ¶”¶)°¶Ú¶á¶8ê¶#·7B·!z·"œ·¿·Ø·Þ·2ø· +¸ 6¸ A¸.b¸‘¸(š¸ø߸ü¸¹O"¹r¹ „¹¹Ÿ¹.¼¹ë¹=ºKDºº«º!´º.ÖºE»K»e»2l»2Ÿ»2Ò»=¼C¼I¼b¼ u¼ ¼м(¡¼ ʼؼ ê¼+õ¼!½A½J½S½Z½y½~½8‚½»½ýǽн×½ܽ ߽꽾 ¾"*¾M¾ l¾w¾ ¾ ™¾¤¾µ¾ ʾÕ¾ é¾9õ¾/¿>¿F¿"N¿q¿)‡¿%±¿;׿ÀÀ4À%PÀ=vÀ2´ÀçÀÁ %Á3Á/IÁyÁ–Á<´ÁñÁÂ?ÂXÂhÂxÂŒÂb¦Â# Ã-Ã4ÃTÃZÃ:iäöÃ<ÉÃAÄHÄbĀćėĞIJÄÃÄÞÄúÄÅ#Å07ÅhÅpŊŤÅ#ºÅÞÅ çÅòÅ+Æ 3Æ(=Æ fÆrÆ xÆ „Æ:ÆÊÆJæÆ1ÇKÇQÇpÇǤÇÀÇÝÇæÇíÇ õÇÿÇÈÈ2È7È HÈ UÈbÈwÈ|È‘È¨È¿È ÅÈ(ÑÈúÈ*ÉBÉ-^É/ŒÉ¼É0ØÉ ÊÊÊ 0ÊÈ<ÊÄËÊË çË óË=ÿË=ÌPÌVÌ_Ì>pÌ=¯ÌíÌ+ýÌ-)Í#WÍ{Í •Í!¡Í8ÃÍüÍ$ Î 0Î3:În΄ΔÎ&œÎ!ÃÎ'åÎ$ Ï 2ÏE@Ï>†Ï"ÅÏ5èÏ7Ð$VÐ+{Ð §Ð±ÐÁÐKÛÐ&'Ñ@NÑ$Ñ´Ñ»Ñ ÂÑÍÑÐÑ âÑðÑùÑÒ Ò'ÒCÒ[Ò)rÒ œÒ?§ÒçÒíÒñÒ Ó$ Ó 1Ó?ÓCPÓ”Ó›Ó(°ÓAÙÓ Ô&Ô6ÔGÔZÔkÔrÔƒÔŸÔ¸Ô!ÍÔïÔÕÕ "Õ,Õ AÕ NÕYÕ}oÕ%íÕ>Ö6RÖ ‰ÖªÖ¯Ö µÖ¿ÖÐÖãÖéÖ7òÖ*×3×<×E×4]× ’מ×(¥× Î×Û×#úר$Ø'Ø*Ø/Ø8Ø=ØNØSØ$hØ ØšØ°ØÆØߨ øØ Ù,%Ù RÙ&sÙ"šÙ$½Ù&âÙJ ÚTÚpÚ.‚Ú±ÚGÂÚ Û-Û#HÛlÛÛ™ÛÛ ³Û*¾ÛDéÛG.ÜDvÜ:»ÜNöÜ3EÝ3yÝ2­ÝùàÝ*ÚÞ$ß/*ßZß(bߋߒߙ߲ß0ÇßEøß >àHà LàXàtà|à#…à©àÄàÔàØàøà á#á9á,Jáwá}á“á™á°áÊáÜá íá÷áþáâ'â,â2â 7âCâ%[ââ‡â™â ŸâÀâ+Æâ7òâ8*ãcã"ã#¢ãÆãáã'ûã#ä")ä Lä-Zäˆä¡ä¦ä¬ä²äµä¸äÒäìä ååå6å ;å*Eå&på—å2šåEÍå-æcAæ@¥æææêæïæöæýæç#çBç\çeç mç&{ç¢ç³çÇçÝçôç èè8/èhèwè9è ¹èÃèßèóèé"é27éjépé éŒé‘é•é ™é ¦é$±éÖé+ïéê 2ê<ê Dêeênêvê/…êCµê ùêë !ë!/ëWQë©ë °ëºëÒëìëïëì%$ìJì_ì1zì"¬ìÏì Øì"âì"í(í0í CíNí3Rí†íŽí’í®í¾íÎíÝíìíôíüí îî #î2/îbîfîjîoîsî †î‘î•î™î¨î·îÀîÉîÐî Øîâîëîïï1ï 6ïAï*Hï}sïñïð3ðUMð£ð-Àðîð*õð ñ/ñ LñYñ#jñŽñ¤ñ ©ñ¶ñËñàñ-èñ"òO9ò‰ò¨ò9óQó hóró‹ó©ó±ó¹óÊó7Òó ô4ôEô[ô{ôQ—ô#éô õ2õ-Kõ.yõ¨õÇõÎõ#Õõ ùõ öö&ö 8ö BöMöRöjönötözö€ö›ö¡öªö¬¿ö l÷z÷—÷´÷É÷ à÷î÷ÿ÷øø #ø/øHø`øuø†ø Žø(˜ø$Áøæø$öøù:ùYù6yù°ù-Ðù'þù&úI?ú&‰ú°úÌúìú0û"2ûNUû-¤û1Òûü<ü.Yüˆü¥ü¹üÈü8×ü3ý,Dýqý xý&„ý «ýÌýÝýïýþþ00þ'aþ)‰þD³þ øþ&ÿ,ÿKÿRÿiÿ‡ÿ8›ÿ ÔÿDâÿ$'L]y˜±Î)â 3F$Z 5›9Ñ: CF Š—³cÓ 7DUZbk‰™¬¯¸ËÑêó ( 43B%vœ°ÂÊ ÎÙ à êô-û)8<C.[Š-Ë Óáû57Ç@.572m) GÊI7\”™ ¨° · ÃÐäó  "  0 > N d ‚ Š  ° Ê Ï  ï ü &  C N c {  ‹ ¬  #× û  + K a { ;Œ  È Ô ë +ó  4 I ^ s ˆ   § "² Õ Ú â é  ð "ú  % . "? "b … ¤ * í õ  43L€™° ¸Ã2Ü%A?”­%Ìò/6 IU4] ’  ÁÇ:Þ 'B \iz “ ž ª¶ÍÕ)ï *J^v5• Ë"ì0Ih%ƒ© ÀËÝãë!)%GOC— Ûü !N-|„”*›Æ*àM Y]dmv~*—ÂZß·›hÚ Ñ_`@}ÄóyÅ×cV¥ÆçB}J˜½ÓÍ"ÏЦÚú0CñÊõÅ…]8un‚&¸U ÆÜ ìlQ629~~ô{¶¨Æ<7?’IÅÝ”@.¤-{Ú^ÍFútˆLk^§ô¤¯ÓÊg'psº‘‚×Ú´V‰6»(Õß8=Ä o)wñ÷ 殺B7¼øV»$Ã’keë &´S­¢[­Á¡i΢¸3á¶ÜO?Š™øç]Ì=qºGØ hX(ìÒïÎ3öä„ßîóÙô?¼zE ŒÝ\#ƒ!´e§ Irœd½±i¡¥sšl¨¬`k]ü¿‡þ¨ž÷·:(p†á9¯Àf§¬Rw0玅ûÂWäט ÅOD‰6DZ^¼Dè% „ÈAKÉ¢a»µl%~æ9»¡NæX›¸t©óOKj›t¶Éü²)QƒP·|¿Í4Ìç†X©ê| ê „H ejF}/êêÏN*E«Œ}È%Ïÿ*“WP¡œàB*5;2ù+1öËÈñž±í%š3œB.T'qC¤Ñ°Ô{­ËgKuo.!á¤áy†ªúño©5×\A€®b À¢l”¼Á‡Ý)ò庹;î¨b#8¾˜I”U(ú¯ÕpæðÞq:ì•­™›ÿÂåe ý¦è ½&¸ý¹ëR³øµë\"~ä]sîbv†ârà5NÀH@Þ²2ÜöÌÛYѾ—õ{nüÖZÒé)|³÷²'f\íØëg<–‡ÿtL#°F« ì0`Ë>þ‡‘/³7 ò“ÇN€…±ãA޶ˆãx_•Ì š‹«'>ŽYûMö,±zÔ>ís·€cé‹ [ºÙTy’Ç,°#vjþKùåõ4Òoâw[Š7Œùðv-Ðø<—U戔èu|Ÿ©™®Lðû ÐRÎÓÓÏŸÃT¬ˆË1GÒ Y2-þð£Qï!y:mv…xõ“n8°é,ÈM!GýîÕրǃŒÉ:f§ÿÞz¹“hÖ>ãÍkÜS1®Öž-MRàw+E0+¦WÇ‚C;‹P—´n6HĹE;²•x`¾‘ÊÔ_¾SY•J&x.£,iHr¥³?iŸ—ªƒ‚9r g£ÉÀfò4dCòXâ Ã=–OߊÆmÔ mVµåMÞ$£LaÙI  ‘ï’Á¿¦1ùQ<„Š$ÙíâµÛóœ÷GÁ–  ¥c/D^‹U˜™¬½aäPZaÑ¿ŸÃm«Ûbu4éJTdÛ_=J®dØý/pz [Ø"5Ý"‰hW@žqÐÂô+šjSÄü $*3FÂû àÕ‰Êίãc誎A in # R# Records in logbook# S# of multiple scans / character line# retries before giving up# times to resend command before giving up%s log started on %s&About&Configure&Contest fields&File&Help&Logbook&MFSK Image&OK&UI&View0 = T; 9 = N14070.1502x Xmt Width (hidden)500 Hz limit8-bit extended characters: AFC on,off,toggle other call clear log fields clear RX pane contest counter CW identifier decrement counter insert text file valid xcvr filter width my frequency text to NAME/QTH move to freq NNNN Hz return to sweet spot send mode ID in video text idle signal for NN.nn sec LDT in iso-8601 format increment counter S/N etc. IMD etc. ZDT in iso-8601 format local date YYYY-MM-DD Local datetime log at xmt time other locator LOCK on,off,toggle save QSO data local time HHMM change macro defs file map by value map on google mode my call my locator my name my QTH my RST other name CW QSK post-timing CW QSK pre-timing QSO time (HHMM)) qsy to kHz, Hz other QTH repeat macro continuously valid xcvr mode CW rise time other RST receive Rx RSID on,off,toggle save contest out search DOWN for signal search UP for signal Digitalk On, Off, Toggle video text repeat every NN sec tune signal for NN sec toggle T/R transmit Tx RSID on,off,toggle Fldigi version delay xmt for NN sec exchange begin exchange end exchange out zulu date YYYY-MM-DD Z UTC datetime zulu time HHMMZAFCAFC behaviorAFC range (Hz)AFC range or BWAFC speedAFC tracking speedALTRARQ controlAbortAbortedAcquisition S/N (dB)Acquisition search range (Hz)ActionAddAdd CRLF after page width charactersAdd current frequencyAdd mixer controls to main dialogAdjust cursor frequencyAdjust the DSP bandwidthAdvanced configuration:AllAllow manual tuningAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAntenna:Appearance of label on each channelAppend to RX text:Append to TX text:AudioAudio device infoAudio device information is only available for the PortAudio backendAudio devicesAudio fileAudio frequencyAudio input deviceAudio or RF frequencies on waterfall scaleAudio output deviceAudio stream history decoded on selected signalAuto connect when fldigi opens (server must be up)Auto-fill Country and AzimuthAutoCRLFAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAvailable substringsBackgndBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3Background color of signal viewer squelch controlBandBands must matchBandwidthBaud rateBaud rate:Beginners' GuideBehavior of s/n imdBg ColorBits per characterBrowserBug me about saving log entriesBuild infoButtonButtonsC&ountriesCAT command for PTTCONTCPUCPU usage increases with waterfall heightCQ zoneCQZCR-CR-LFCSV...CTRLCWCW ID modesCW Postamble IDCW dsp filter bandwidthCW is LSBCW transmit WPMCWI detection and suppressionCWI thresholdCabrillo SetupCabrillo...CallCall SearchCall sign workedCallsignCallsign databaseCallsign:Can be used in lieu of or in addition to other PTT typesCan. ProvinceCancelCaptureCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture signals within this frequency rangeCapture:Carrier frequency (Hz)Carrier shiftCenter display on signalCenter in passband Right click to undoChange # of psk viewer channelsChange ONLY to experimentChange application look and feelChange colorChange log levelChange positions of low to high channelsChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel labelChannel numberChannels, first channel starts at waterfall lower limitChars/Row:Check AllCheck for duplicatesCheck for updates...Check this to be notified when an RSID is received without changing modem and frequencyChecking for updates...CityCity of station workedClearClear AllClear channel text after # seconds of inactivityClear listClear list?Clear log controls sets RST out to 599Clear log entries after saving or using macro Clear log fields?Clear on saveCloseClose ListColorColors && FontsColors and cursorsCommand line optionsCommands are echoedCompress Rx in timeConfirmConfirm RESETConnect/disconnect to Talker socket serverContestContest exchange inContest exchange receivedContest exchange sentContest serial # receivedContest:ContinentContinuous scrollingControl chars in Rx/Tx paneControlsConvert callsign to upper caseConverterCopyCopy URLCorrectionsCould not check for updates: %sCould not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCreate cabrillo reportCreate sunspotsCustom shiftCustom text searchCustom...CutDTR +12DTR +12 vDTR = +VDTR is PTT signal lineDTR is ptt lineDXCCDXCC designatorDXCC entitiesDXCC entityDash to dot ratioDateDate QSO EndedDate QSO startedDate time ON == OFFDebugDefaultDefault CW tracking pointDefault RST out to 599Default RTTY tracking pointDefault WPMDefault for all other modemsDefault listen / transmit frequencyDefault test string is: "Default to cross hair digiscopeDefaultsDeleteDelete from listDeselectDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapDetected signal levelDevice:DevicesDifference between Rx & Tx freq (rig offset)Digit ColorDigitsDimDisable allDisable further detection when RSID is receivedDisable on very slow CPUs of if signal browser is not usedDisplayDisplay RX in reverse videoDisplay macro filename on startupDo not use callsign databaseDocked scopeDon't saveDot to dot-space ratioDragging on the waterfall scale changes frequencyDup ColorDuplicate check, CALL plusDuplicatesEdge decreases pulse widthEdge shapeEdge timingEnableEnable / disable icons on menusEnable / disable tooltipsEnable DSP prior to decoderEnable MultiPSK-compatible FECEnable allEnable check box to show each respective operator controlEnable drag cursor on waterfall scaleEnable for very weak signalsEnable if you cannot use the middle mouse buttonEnable if you're computer does not decode properlyEnable rx text streamEnable this for Latin-1 accented charactersEnabledEnter Xcvr FreqEnter a CALL !Enter frequency or change with Left/Right/Up/Down/Pg_Up/Pg_DownEnter full path-filename for flmsgEnter test string or leave blank for default:Enter time span in minutesErrorEventEvent logExExchange InExchange OutExchangesExecutable file to insertExitExperimentalExport SetupExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...Extract files for use with external "wrap / flmsg" programF-WPMFECFFT ProcessingFFT averagingFFT prefilter window functionFast (2 msec)File I/O onlyFill in Country / Azimuth using cty.dat informationFilterFilter bandwidthFilter bandwidth factorFilter bandwidth relative to signal widthFilteringFind country:Find nextFind prefix:Find previousFind: Fixed IntervalsFldigi config...Fldigi configurationFldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFoldersFontFont colorFont...Font:Force RST in/out to 599Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFFree Lossless Audio Codec *.flacFreqFreq.FrequencyFrequency in MHzFrequency scaleFullGeneralGenerate square wave signal on right channelGroup 1Group 2Group 3Halve receive widthHamCall online via default Internet BrowserHamcall.netHamlibHamlib used for rig controlHardware PTTHide window after (s):High frequency limit in HzHost:IDIDsIOTAITU zoneITUZIgnore duplicatesInInactivity timeoutInclude the transmit frequencyInfoInitial state of DTRInitial state of RTSInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize XML-RPC rig controlInitialize hamlib interfaceInitialize the H/W PTT interfaceInitialize the QSO logging fieldsInitialize the socket clientInput carrier shiftInsert RX text marker before changing frequency and modemInsert default textInsert file...Insert leading zeros into Xmtd serial numberInsert markerInsert special text in Rx panel when waterfall clickedInsert textInsert text on single left clickIntegration period (FEC blocks)Islands on the airK3 A1A configuationLOCLabel textLast QSOLeading and Trailing edge risetimes (msec)Leave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft Click - execute Fkey - execute Right Click - editLeft Click - execute Shift-Fkey - execute Right Click - editLeft click - select Right click - clear lineLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLeft or right click always replays audio historyLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Lighted button enabled colorsLimit AFC movement to this rangeLimit to a few characters, as in CQEM or IOTA etc.Line InListen for signals within this rangeLkLoadLoad a new paletteLoad image fileLoad last used macro file on startupLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocLocate flmsgLocate flmsg executableLocatorLocator:Lock transmit frequencyLog all RX/TX textLog sourcesLogbookLong receive integrationLook up callLotW userLow frequency limit in HzLower limitLowest freq on bottom of viewerMT-63Macro editor - MacrosMaidenhead locator as in EM64qvMail Server AttributesManage mixerMerge ADIF fileMerge...Mic InMinimal controlsMinimum time between eventsMiscMixerModeMode in useMode must matchMode width limitModemModem carrierModemsMonitor transmitted signalMouseMouse wheel active on macro buttonsMsec post-keydown (+ is earlier in time)Msec pre-keydown (+ is earlier in time)Msec's between retriesMsec's between sequential commandsMulti-Channel Signal ProcessingMulti-channel detectorMy callsign de CALLMy transmit CW WPMNBEMSNBEMS data file interfaceNBEMS files...NO AUDIO DEVICE AVAILABLE (or testing)NO CALLSIGN SETNameName:NewNmNoNo faster than thisNo rig specifiedNo slower than thisNoise onNoneNot worked beforeNotesNotificationsNumber and position of macro barsNumber of digits in serial numberOKON - Marquee style OFF - Clear & restartON - search over entire waterfall OFF - limit search to +/- 200 HzON - small font OFF - large fontON - start at default OFF - keep current wf cursor positionON - use last set of macros OFF - use default setOSSOffOliviaOnOn/OffOne bar (above waterfall)One bar (below waterfall)Online documentation...Op &ModeOpen ...Open ListOpen file with default browserOpen in browserOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen paletteOpen rig xml fileOpen squelch for nn sec if RSID detectedOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperatorOperator informationOperator workedOperators QTHOperators callsignOperators nameOptional configuration in format: param=val ...OtherOther callOther nameOutPCMPSKPSK ReporterPSK et al.PTT is a CAT command (not hardware)PTT is a hamlib commandPTT tone on right audio channel PTT via Hamlib commandPalette: ParityParse all incoming textPasswordPastePaths (hidden)Pick baud rate from listPlay back history when active channel selectedPlaybackPlayback devicePlayback:Please set your callsign first.Popup info after a 2 second hover on a callsignPort:PortAudioPost write delay (ms)Post-keydown timing (ms)PrPre-Signal TonePre-keydown timing (ms)Press return to continue the searchPress to updatePrimary macro setPrint CW / RTTY / THROB / CONTESTIA in lowercasePrompt to save logProsignsProvinceProvince of station workedPseudo-FSK on right audio channelPskmailPulse shapePulseAudioQRZQRZ online via default Internet BrowserQRZ.comQSKQSK on right audio channelQSL rcvd dateQSL received on this dateQSL sent dateQSL sent on this dateQSL-rcvdQSL-sentQSO DateQSO Date OffQSO Date OnQSO loggingQSO must not occur within a time period ofQSYQTHQTH:QthQuick entryQuietRE:RPCRSID receptionRST always 599RST rcvdRST sentRST(r)RTS +12RTS +12 vRTS = +VRTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTYRX captureRX ppmRX sound card correctionRX text QSO data entry is bounded by the non-word characters defined here. Tab and newline are automatically included.Radio frequencyRaised cosine = HanningRaised cosine pulse shape factorRange +/- wpmReading fonts...Really delete record for "%s"?ReceiveReceive filter bandwidthReceive modesReceive synchronizerReceived RSTReceived serial numberRecent activity for gridReception reports...RecsRectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)RemoveReplay trackline audioReport ARQ frames average S/NReport rig frequency (enable only if you have rig control!)ResetReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Reset to CarrierRestore defaultsRetriesRetry Interval (ms)Retry interval (ms)RevReverseReverse videoRevertRevert to Unsifted char's on a spaceRigRig Control using xml spec fileRig controlRig control and contestRig control and loggingRig control via external program using xmlrpc remote calls.Rig description file:Rig modeRig or interface echos serial dataRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig:RigCATRigCAT used for rig controlRst receivedRst sentRun programRun program:Rx bkgndRx fontRxIDS/N and IMD behaviorSELSKIPSQL-1SQL-2Sample rateSaveSave ...Save ConfigSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed macros?Save logbook fileSave macro fileSave paletteSave text asSave this paletteSave...ScopeScrollScroll hintsSearch for this callsignSearch range (Hz)Secondary TextSecondsSelectSelect # bits / charSelect # stop bitsSelect AllSelect Cabrillo Contest & FieldsSelect Fields to ExportSelect Mixer deviceSelect Records to ExportSelect TX raster fontSelect bandwidthSelect carrier baudrateSelect carrier shiftSelect deviceSelect how the mouse wheel behaves inside the waterfallSelect modes for menu accessSelect number of tonesSelect operating parametersSelect paritySelect rig descriptor fileSelect the type of FFT prefilterSelect this for Elecraft K3 Other radios should not need it.Select waterfall scale fontSelection background color in Rx Tx panelsSend CW cut numbersSend Callsign in CW at end of every transmissionSend a continuous stream of test charactersSend at this WPMSend continuouslySend imageSend image...Send reception report when logging a QSOSend report only when QSO is loggedSend rx text to file: textout.txtSend:Sent RSTSent chars in Rx/Tx paneSent serial number (read only)Serial # inSerial # outSerial numberServer string:Set Viewer SquelchSet level for good viewingSet the number of characters per rowSet the sound card PCM levelSet the type of resampler used of offset correctionSettingsShift-key macro setShort description of antennaShowShow DXCC entitiesShow alert window:Show all modesShow bandwidth tracks on waterfallShow channelsShow cursor with bandwidth linesShow cursor with center lineShow fewer modesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallSideband:Signal BrowserSignal browserSignal levelSignal range (dB)Signal searchSize:Skipped chars in Tx pane (Tx on/off in CW)Slew display higher in frequencySlew display lower in frequencySlider hilite color of signal viewer squelch controlSlow (4 msec)Slow CPU (less than 700MHz)Sort by Date/Time OFFSort by date/time OFF - effects all ADIF/Cabrillo reportsSound CardSpeed (WPM):SpotSpotterSpottingSpotting disabledSquelchSquelch levelSquelch open (sec)StStartStarting numberStateState must matchStationStation heard twiceStations grid squareStop bitsStopbitsStore mode and frequency Right click for listSunspot creation underway!Sweet SpotSys ColorsSystemT/RTX PowerTX WPMTX generateTX offsetTX ppmTX sound card correctionTab ColorTabsTalkerTalker Socket (MS only)Test Signal - Do NOT use with transmitterTest charTest character for QSK adjustmentTest...Text CaptureText file to insertText i/oText to send during keyboard idle timesText...That crazy fox jumped over the dog again! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~The default CW speedThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The string is replaced with the current modem and frequencyThe test string did not match this event's search pattern.This event's regular expression is invalid.ThorTimeTime (s):Time OFFTime ONTime OffTime OnTime QSO endedTime QSO startedTime between retires in msecTime needed: Time span overTimed outTimingTiming and QSKTo whom the connection is madeToggleToggle DTR for PTTToggle RTS for PTTTone Duration (secs)TonesTracked CW speed in WPMTrackingTransceiver controlTransfer speed, X1-normalTransmitTransmit PowerTransmit callsignTransmit fontTransmit lower start toneTransmit mode IDTransmit modesTransmit periods (.) when idleTransmit power usedTransmit signalTransmit upper start toneTransmit video textTransmit widthTransmit/ReceiveTransmits a diddle dot when no keyboard activityTriangularTrigger limit (s):TuneTune margin (tone frequency spacing)Two bars (scheme 1)Two bars (scheme 2)Two bars (scheme 3)Two bars (scheme 4)Two bars (scheme 5)Two bars (scheme 6)Tx bkgndTx fontTx power used for logbook entriesTxIDUIUI languageUI schemeUS StateUS state of station workedUndoUpdateUpper limitUpper signal level (dB)Use "cr cr lf" for "cr lf"Use '(' paren not KNUse CD or hard drive CD imageUse DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse Line-In deviceUse OSS audio serverUse Open to select descriptor fileUse Port Audio serverUse Pulse Audio serverUse RTSUse RigCATUse XML-RPC programUse averaging to decrease waterfall noiseUse colored buttonsUse cross hair scopeUse for triggering amplifier carrier detectUse leading zerosUse microphone inputUse parallel port PTTUse separate serial port PTTUse small fontUse uHRouter PTTUser InterfaceUser nameUsing UDP port #VSP EnableVerboseVersion %s is available at %s What would you like to do?Video ID modesVideo Preamble IDViewView/Hide ChannelsVirtual Serial Port Emulator - suppress WARNINGSVisible modesVisit Hamcall web siteVisit QRZ web siteVisit URLWF MagnificationWF Shift ControlsWF StoreWF amp spanWF carrierWF drop rateWF modeWF ref levelWait interval (msecs) before reading responseWarningWaterfallWaterfall / FFT / ScopeWaterfall controlsWaterfall drop speedWaterfall height in pixelsWaterfall video IDWaterfall video textWaveform Audio Format *.wav AU *.{au,snd} Weight (%)Weight decreases with increasing edge timingWheel actionWhen no signal presentWill occur after this time in secondsWord delimitersWord wrapWrite delay (ms)XMITXML-RPCXMT lockXON/XOFF flow controlYesYou are running the latest versionYou need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour login nameYour login passwordafterat:dBeQSL userenable mouse wheel control of macro barflmsg *flmsg.exe *.exeflmsg:free form 1 must matchfree form exchangeh/w ptt device-pinie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for databasein:minutesreportreportssecondsseek - regular expressionselect browser fontwaterfall-only modeProject-Id-Version: fldigi 3.21.0BG Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com POT-Creation-Date: 2014-03-22 11:18-0500 PO-Revision-Date: 2011-12-03 13:04+0100 Last-Translator: Pierfrancesco Caci Language-Team: Italian Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); in # RNumero di record nel log# S# di linee multiple / linea di caratterinumero di tentativi prima di rinunciarenumero di volte che il comando è ripetuto prima di rinunciare%s log iniziato il %sInform&azioni&ConfiguraCampi &Contest&File&Aiuto&LogImmagine &MFSK&OKAspetto&Vedi0 = T; 9 = N14070.1502x Xmt Width (hidden)Limite a 500 HzCaratteri estesi a 8 bit: AFC on,off,toggle nominativo del corrispondente cancella i campi del log cancella la finestra di ricezione contatore per contest identificazione in CW decrementa il contatore inserisci un file di testo imposta un filtro valido sulla radio la mia frequenza dal testo a NOME/QTH vai alla freq NNNN ritorna alla frequenza preferita trasmetti ID del modo in testo video segnale idle per NN.nn sec LDT in formato iso-8601 incrementa il contatore\tS/N ecc.\tIMD ecc. ZDT in formato iso-8601 data locale YYYY-MM-DD Data e ora locale metti a log quando questa macro viene trasmessa locator del corrispondente LOCK on,off,toggle salva i dati del QSO ora locale HHMM cambia il file delle macro mappa con parametri mappa su Google modo il mio nominativo il mio locator il mio nome il mio QTH il mio RST nome del corrispondente CW QSK post-timing CW QSK pre-timing ora del QSO (HHMM) qsy a kHz, Hz QTH del corrispondente ripeti la macro continuamente cambia modo radio valido CW rise time RST del corrispondente ricevi Rx RSID on,off,toggle salva rapporto contest cerca un segnale a scendere cerca un segnale a salire Digitalk On, Off, Toggle testo video ripeti ogni NN sec segnale di accordo per NN sec scambia T/R trasmetti Tx RSID on,off,toggle\tVersione Fldigi ritarda la trasmissione per NN sec inizio rapporto fine rapporto rapporto dato data zulu (UTC) YYYY-MM-DD Z data e ora UTC ora zulu (UTC) HHMMZAFCComportamento AFCArea AFC (Hz)Area AFC o bandaVelocità AFCVelocità di tracciamento AFCALTRControllo ARQAnnullaAnnullaS/N (dB) per l'acquisizioneRaggio di ricerca per l'acquisizione (Hz)AzioneAggiungiAggiungi CRLF quando raggiungi la larghezza della paginaAggiungi la frequenza correnteAggiungi i controlli del mixer alla finestra principaleAggiusta la frequenza del cursoreAggiusta la larghezza di banda DSPConfigurazione avanzata:TuttoPermetti sintonia manualeColore alternativo dei caratteri nella finestra RxSempre LSBSempre USBMostra sempre le frequenze audioAvvia sempre i nuovi modem su queste frequenzeAntenna:Aspetto dell'etichetta di ciascun canaleAggiungi al testo ricevuto:Aggiungi al testo trasmesso:AudioInformazioni sulla scheda audioLe informazioni sul device audio sono disponibili solo per il backend PortAudioDispositivi audioFile audioFrequenza audioDispositivo audio d'ingressoFrequenze audio o RF sulla scala del waterfallDispositivo audio d'uscitaIl buffer audio viene decodificato per il segnale selezionatoConnetti automaticamente all'avvio di fldigi (il server deve essere attivo)Paese e Azimuth automaticiAutoCRLFControllo Automatico di FrequenzaInseguimento automatico velocita' in ricezioneInvia automaticamente lo spot per i nominativi nel testo decodificatoSottostringhe disponibiliSfondoColore di sfondo per i tasti funzione del gruppo 1Colore di sfondo per i tasti funzione del gruppo 2Colore di sfondo per i tasti funzione del gruppo 3Colore di sfondo del controllo squelch del navigatore segnaliBandaLe banda deve coincidereLarghezza di bandaBaud rateBaud rate:Guida per principiantiComportamento degli indicatori s/n e imdColore SfondoBit per carattereNavigatoreAnnoiami con la richiesta di salvare il logInformazioni sulla compilazionePulsantePulsanti&PaesiUsa CAT per controllare il PTTCONTCPUL'utilizzo della CPU aumenta con l'altezza del waterfallZona CQCQZCR-CR-LFCSV...CTRLCWModi ID CWID CW a fine trasmissioneLarghezza del filtro dsp CWCW è LSBVelocitá di trasmissione CW (WPM)Rilevazione e soppressione CWISoglia CWIImpostazione CabrilloCabrillo...NominativoCerca NominativoNominativo collegatoNominativoDatabase nominativiNominativo:Puó essere usato al posto o insieme ad altri tipi di PTTProv. CanadeseAnnullaCatturaPeriferiche di cattura e di uscitaPeriferica di catturaCattura il testo ricevuto su file esternoCattura i segnali oltre questa sogliaCattura i segnali all'interno di questo raggio di frequenzaCattura:Frequenza portante (Hz)Scostamento della portanteCentra la visualizzazione sul segnaleCentra nella banda passante Tasto destro per tornare indietroCambia il numero di canali nel visualizzatore psk.Cambiare SOLO per sperimentareCambia l'aspetto del programmaCambia coloreCambia livello di logCambia l'ordinamento da alto a basso dei canaliModifica al file delle macroCambia la scala del waterfallLe modifiche avranno effetto al prossimo avvio del programmaEtichetta del canaleNumero del canaleCanali, il primo canale parte al limite inferiore del waterfallCaratteri/Riga:Seleziona tuttoControlla duplicatiVerifica aggiornamenti...Scegli questo per essere notificato quando un RSID viene ricevuto senza cambiare modem o frequenzaControllo aggiornamenti in corso...CittàCittá della stazione collegataCanc.Cancella tuttoCancella il testo del canale dopo # secondi di inattivitàCancella la listaCancella la lista?Premendo cancella log imposta RST dato automaticamente a 599Cancella i campi del log dopo aver salvato o usato la macro Cancella i campi del log?Cancella i campi quando salviChiudiChiudi la listaColoreColori && CaratteriColori e cursoriOpzioni da riga di comandoI comandi sono visualizzatiComprimi la ricezione nel tempoConfermaConfermare il RESETConnetti/disconnetti il socket del server TalkerContestRapporto contest ricevutoRapporto contest ricevutoRapporto contest datoNumero seriale del contest ricevutoContest:ContinenteScorrimento continuoCaratteri di controllo nelle finestre Rx/TxControlliConverti il campo nominativo a maiuscoleConversioneCopiaCopia l'URLCorrezioneNon ho potuto controllare la presenza di aggiornamenti: %sNon posso aprire l'url: %s Non ho potuto lanciare un browser web: %s Apri questo URL manualmente: %sImpossibile avviare flmsgPaesePaese della stazione collegataCrea il log in formato cabrilloCrea macchie solariScostamento personalizzatoRicerca testo personalizzatoAltro...TagliaDTR +12DTR +12 vDTR = +VDTR controlla il PTTDTR controlla il PTTDXCCDesignatore DXCCEntità DXCCEntità DXCCRapporto linea/puntoDataData di fine del QSOData di inizio del QSOData di inizio == fineDebugPredefinitoFrequenza preferita per la decodifica CWRST dato automaticamente 599Frequenza preferita per la decodifica RTTYVelocitá predefinita (WPM)Frequenza preferita per tutti gli altri modemFrequenza predefinita di ascolto / trasmissioneDefault test string is: "Imposta l'oscilloscopio a croce come predefinitoPredefinitiCancellaTogli dalla listaDeselezionaRileva la presenza di [WRAP:beg] e [WRAP:end]. Salve le etichette e tutto il testo da esse racchiuso in un file marcato con data e ora, per es.: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapRileva la presenza di [WRAP:beg] e [WRAP:end]. Salve le etichette e tutto il testo da esse racchiuso in un file marcato con data e ora, per es.: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapLivello del segnale ricevutoPeriferica:DispositiviDifferenza tra la frequenza Rx e Tx (scostamento della radio)Colore delle cifreCifreScurisciDisabilita tuttoDisabilita ulteriori decodifiche quando viene ricevuto un RSIDDisabilita su CPU molto lente o se il navigatore non è usatoVisualizzazioneMostra il testo ricevuto a colori invertitiMostra il nome del file delle macro all'avvioNon usare un database di nominativiOscilloscopio incorporatoNon salvareRapporto tra punto e punto-spazioTrascinare sulla scala del waterfall cambia la frequenzaColore duplic.Controllo duplicati, nominativo piúDuplicatiIl tempo di salita riduce la larghezza dell'impulsoForma d'onda al bordoTempo di salitaAbilitaAbilita / disabilita le icone dei menuAbilita / disabilita suggerimentiAbilita il DSP prima del decodificatoreAbilita FEC compatibile con MultiPSKAbilita tuttoAbilita le selezioni per mostrare i rispettivi controlli di operatoreAbilita il trascinamento del cursore sulla scala del waterfallAbilitare per segnali molto deboliAbilita se non puoi usare il tasto centrale del mouseAbilita se il tuo computer non decodifica correttamenteAbilita il flusso del testo ricevutoAbilitare per i caratteri accentati Latin-1AbilitatoFrequenza RadioInserisci un NOMINATIVO !Inserisci la frequenza o cambia con Sinistra/Destra/Su/Giù/Pag_su/Pag_giùInserisci il percorso completo a flmsgImposta la frase di prova o lascia in bianco per il predefinito:Inserisci l'arco temporale in minutiErroriEventoLog eventiExRapporto ricevutoRapporto datoRapportiFile eseguibile da inserireEsciSperimentaleConfigurazione per l'exportEsporta in formato ADIFEsporta in formato CSVEsporta in formato di testo a campi fissiEsporta...Estrai i file per l'uso con il programma esterno "wrap / flmsg"F-WPMFECElaborazione FFTMedia FFTFunzione di prefiltro a finestra FFTVeloce (2 ms)Solo I/O su fileRiempi i campi Paese / Azimuth con le informazioni dal file cty.datFiltroLarghezza del filtroFattore di larghezza di banda del filtroLarghezza di banda del filtro relativa alla larghezza del segnaleFiltraggioTrova il paese:Trova successivoTrova il prefisso:Trova precedenteTrova:Intervalli fissiConfigurazioni di Fldigi...Configurazione di FldigiPalette Fldigi *.palFile di definizione rig xml *.xmlSito web Fldigi...Finestra oscilloscopioCartelleCaratteriColori dei caratteriCaratteri...Caratteri:Forza RST tx/rx a 599Forza una velocitá di campionamento specifica. Scegli "Nativo" se "Auto" non funziona correttamente con la tua scheda audio.Forza il campo nominativo a MAIUSCOLEForza la spaziatura dei canali a incrementi regolari di 100 HzForza data e ora di inizio QSO uguali a quelle di fineFree Lossless Audio Codec *.flacFreqFreq.FrequenzaFrequenza in MHzScala di frequenzaTuttoGeneraleGenera un segnale a onda quadra sul canale audio destroGruppo 1Gruppo 2Gruppo 3Dimezza la larghezza RXAccesso online a Hamcall tramite browser predefinitoHamcall.netHamlibHamlib è usata per controllare la radioPTT HardwareNascondi la finestra dopo (s):Limite superiore di frequenza in HzHost:IDIDIOTAZona ITUITUZIgnora duplicatiRic.Tempo di inattivitàIncludi la frequenza di trasmissioneInformazioniStato iniziale di DTRStato iniziale di RTSTensione iniziale su DTRTensione iniziale su RTSInizializzaInizializza l'interfaccia RigCATInizializza il controllo della radio XML-RPCInizializza l'interfaccia hamlibInizializza l'interfaccia PTT hardwareInizializza i campi di log del QSOInizializza la connessione al serverScostamento della portante in ingressoInserisci un marker nel testo ricevuto prima di cambiare frequenza e modemInserisci testo predefinitoInserisci file...Metti zeri davanti al numero seriale trasmessoInserisci markerInserisci testo speciale nel pannello Rx quando fai click sul waterfallInserisci testoInserisci testo con un singolo click sinistroPeriodo d'integrazione (FEC blocks)Islands on the airConfigurazione A1A per K3LocTesto delle etichetteUltimo QSOTempo in ms di salita/discesa dell'impulsoLascia in bianco o vedi http://www.pulseaudio.org/wiki/ServerStringsTasto sinistro - esegui Tasto funzione - esegui Tasto destro - modificaTasto sinistro - esegui Maiusc-Funz - esegui Tasto destro - modificaTasto sinistro - seleziona Tasto destro - cancella la rigaTasto sinistro per cancellare il testo Tasto destro per resettare le frequenzeTasto sinistro per cambiare il colore dei duplicatiTasto sinistro: cambia modo Tasto destro: configuraClick destro o sinistro riascolta la memoria audioLicenza GPLv3+: GNU GPL versione 3 o successiva Questo e` un programma libero: siete liberi di modificarlo e ridistribuirlo. Questo programma non e` coperto da alcuna garanzia, salvo gli obblighi di legge. Colori dei pulsanti illuminati selezionatiLimita i movimenti AFC a questa areaLimita a pochi caratteri, come CQEM o IOTA ecc.Line InCerca segnali all'interno di questa areaBloccaCaricaCarica una nuova paletteCarica file immagineAll'avvio carica l'ultimo file delle macro usatoCarica o trascina un file immagine Formati supportati: PNG, JPEG, BMPCarica...LocTrova flmsgTrova l'eseguibile di flmsgLocatorLocator:Blocca la frequenza di trasmissioneSalva tutto il testo RX/TXOrigine dei logLogIntegrazione di ricezione lungaCerca nominativoUtente LoTWLimite inferiore di frequenza in HzLimite inferioreFrequenza piú bassa in basso nel navigatoreMT-63Editor delle macro - MacroLocator come in JN53rwAttributi del mail serverGestisci il mixerUnisci file ADIFUnisci...Mic InControlli minimiTempo minimo tra eventiMiscMixerModoModo in usoIl modo deve coincidereLimite secondo la larghezza del modoModemPortante del modoModemMonitorizza il segnale trasmessoMouseRotella del mouse attiva sui pulsanti macroQuanti ms dopo l'impulso viene disattivata la linea QSKQuanti ms prima dell'impulso viene attivata la linea QSKTempo in ms tra i tentativiTempo in ms tra comandi successiviElaborazione di segnale multicanaleDecodificatore MulticanaleIl mio nominativo de CALLLa mia velocitá di trasmissione in WPMNBEMSinterfaccia per file di dati NBEMSFile NBEMS...NESSUN DISPOSITIVO AUDIO DISPONIBILE (o test)NOMINATIVO NON IMPOSTATONomeNome:NuovoNmNoNon piú veloce di questoNessuna radio specificataNon piú piano di questoGenera rumoreNessunoNon lavorato in precedenzaNoteNotificheNumero e posizione delle barre delle macroNumero di cifre nel numero progressivoOKON - Scorrimento continuo OFF - Cancella e ripartiON - cerca su tutto il waterfall OFF - limita la ricerca a +/- 200 HzON - caratteri piccoli OFF - caratteri grandiON - avvia alla frequenza predefinita OFF - mantieni la posizione attuale del cursore sul waterfallON - usa l'ultimo file delle macro OFF - usa il file predefinitoOSSFineOliviaInizioOn/OffUna barra (sopra il waterfall)Una barra (sotto il waterfall)Documentazione on-line...&Modo OpApri...Apri la listaApri il file con il browser di sistemaApri col browserApri il file di logApri file delle macroApri file dei messaggiApri il messaggio con flmsgApri paletteApri file rig xmlApri lo squelch per nn sec se viene decodificato un RSIDApri con flmsgApri...Apri la cartella dei file NBEMS dopo una cattura riuscitaOperatoreInformazioni sull'operatoreOperatore collegatoQTH degli operatoriNominativi degli operatoriNomi degli operatoriConfigurazione opzionale in formato: param=val ...AltroAltro nominativoAltro nomeDatoPCMPSKPSK ReporterPSK et al.PTT è un comando CAT (non hardware)PTT è un comando HamlibPTT genera un tono sul canale audio destro PTT via comando HamlibPalette: ParitàAnalizza tutto il testo ricevutoPasswordIncollaPaths (hidden)Seleziona una velocitá della porta dalla listaRiproduci il buffer audio quando viene selezionato il canale attivoRiproduzionePeriferica di riproduzioneRiproduzione:Imposta il tuo nominativo, prima.Tenendo il mouse per piú di due secondi su un nominativo appare popup con informazioniPorta:PortAudioRitardo dopo un comandoTempo dopo l'impulso (ms)PrTono prima del segnaleTempo prima dell'impulso (ms)Premi invio per continuare la ricercaPremi per aggiornareGruppo di macro principaleStampa CW / RTTY / THROB / CONTESTIA in minuscoloChiedi conferma per salvare il logProsignsProvinciaProvincia della stazione collegataPseudo-FSK sul canale audio destroPskmailForma dell'impulsoPulseAudioQRZAccesso online a QRZ tramite il browser predefinitoQRZ.comQSKQSK sul canale audio destroQSL ricevuta ilQSL ricevuta ilQSL inviata ilQSL inviata ilQSL-ricQSL-invData QSOData fine QSOData inizio QSOLog dei QSOIl QSO non si deve ripetere in un arco di tempo diQSYQTHQTH:QTHInserimento rapidoSilenziosoRE:RPCRicezione RSIDRST sempre 599RST ric.RST inv.RST(r)RTS +12RTS +12 vRTS = +VRTS controlla il PTTRTS controlla il PTTControllo di flusso RTS/CTSRTTYCattura RXRX ppmCorrezione della scheda audio in ricezioneL'inserimento dei dati del QSO dal testo ricevuto è delimitato dai caratteri definiti qui. Tab e a capo sono sempre inclusi.Frequenza radioRaised cosine = HanningFattore di forma dell'impulso di tipo raised cosineL'inseguimento avviene tra il valore corrente +/- il valore impostato in questo campoSto caricando i caratteri...Vuoi veramente cancellare il record per "%s"?RiceviLarghezza di banda del filtro di ricezioneModi ricezioneSincronizzatore di ricezioneRST ricevutoSeriale ricevutoAttivitá recenti per il quadratoneRapporti d'ascolto...Rec.RettangolareReed-Solomon ID (Rx)Reed-Solomon ID (Tx)RimuoviRianalizza i dati audio degli ultimi 2 minutiRiporta il S/N medio dei frame ARQComunica la frequenza della radio (abilita solo se hai il controllo automatico)AzzeraResetta tutte le opzioni ai loro valori predefiniti? Il reset delle opzioni avrà effetto al prossimo riavvio I file fldigi_def.xml e fldigi.prefs sarabbi cancellati! Reimposta alla portanteRipristina predefinitiTentativiTempo tra tentativi (ms)Intervallo tra tentativi (ms)InvertiInvertiInverti il videoInvertiRitorna a caratteri normali (unshifted) dopo uno spazioRadioControlla la radio mediante un file di specifica xmlControllo della radioControllo della radio e contestControllo della radio e logControllo della radio tramite programma esterno che usa chiamate remote xmlrpc.File con la descrizione della radioModo RadioLa radio o l'interfaccia fa l'eco dei dati serialiLa radio richiede controllo di flusso RTS/CTSLa radio richiede controllo di flusso Xon/XoffLa radio usa handshake RTS/CTSRadio:RigCATUsa RigCAT per controllare la radioRST ricevutoRST inviatoLancia il programmaEsegui programma:Sfondo RxCaratt. RxRxIDComportamento S/N e IMDSELSaltaSQL-1SQL-2Velocitá di campionamentoSalvaSalva...Salva ConfigurazioneSalva tutto il tesxto ricevuto, un carattere alla volta, su questo file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Salva come...Salvare le modifiche al log?Salvare le macro modificate?Salva il file di logSalva file delle macroSalva paletteSalva testo comeSalva questa paletteSalva...ScopeScorrimentoSuggerimenti scorrimentoCerca questo nominativoArea di ricerca (Hz)Testo secondarioSecondiSelezionaSeleziona il numero di bit per carattereSeleziona il numero di bit d'arrestoSeleziona tuttoScegli il Contest e i campi CabrilloSeleziona i campi da esportareSeleziona il dispositivo mixerSeleziona i record da esportareSeleziona il carattere a scansione per la trasmissioneSeleziona la larghezza di bandaSeleziona la velocitá in baud della portanteSeleziona lo scostamento della portanteSeleziona il dispositivoScegli il comportamento della rotella del mouse all'interno del waterfallSeleziona i modi accessibili dal menúSeleziona il numero di toniSeleziona i parametri operativiSeleziona la paritàSeleziona il file con la descrizione della radioSeleziona il tipo di prefiltro FFTAttiva la selezione per Elecraft K3 Altre radio non dovrebbero averne bisogno.Scegli il carattere della scala del waterfallColore del testo selezionato nelle finestre Rx/TxAbbrevia i numeri in CWTrasmetti il nominativo in CW alla fine di ogni trasmissioneInvia un flusso continuo di caratteri di provaInvia a questa velocità WPMInvia continuamenteInvia immagineInvia image...Invia il rapporto di ricezione quando metti un QSO a logInvia il rapporto solo quando il QSO è messo a logInvia il testo ricevuto al file: textout.txtInvia:RST inviatoCaratteri inviati nelle finestre Rx/TxSeriale trasmesso (solo lettura)Seriale ricevutoSeriale trasmessoNumero progressivoNome del serverImposta Squelch per il ViewerImposta il livello per una buona visualizzazioneImposta il numero di caratteri per rigaImposta il livello PCM della scheda audioScegli il tipo di ricampionatore usato per la correzione dell'offsetImpostazioniGruppo di macro accessibile con maiuscBreve descrizione dell'antennaMostraMostra le entità DXCCMostra la finestra di avviso:Mostra tutti i modiMostra indicatori della larghezza di banda sul waterfallMostra canaliMostra linee che indicano la larghezza di banda del modo sul cursoreMostra il cursore con linea centraleMostra meno modiMostra l'editor delle macroMostrami piú o meno waterfallMostra le icone del menuMostra la password in chiaroMostra suggerimentiMostra il segnale trasmesso sul waterfallBanda laterale:Navigatore dei segnaliNavigatore segnaliLivello del segnaleCampo di variazione del segnale (dB)Ricerca segnaliDimensione:Caratteri saltati nella finestra Tx (Tx on/off in CW)Scorri la porzione visualizzata verso frequenze piú alteScorri la porzione visualizzata verso frequenze piú basseColore evidenziato del cursore nel controllo squelch del navigatoreLento (4 ms)CPU lente (meno di 700 MHz)Ordina per data/ora di fine QSOOrdina il log in base all'ora/data di fine QSO Influisce su tutti i file esportati in ADIF/CabrilloScheda AudioVelocità (WPM):SpotSpotterSpottingSpotting disabilitatoSquelchLivello squelchApri squelch (sec)StParti daNumero di partenzaStatoLo stato deve coincidereStazioneStazione sentita due volteQuadratone della stazioneBit arrestoBit d'arrestoRegistra modo e frequenza Tasto destro per la listaCreazione di macchie solari in corso!Frequenza preferitaColori di sistemaSistemaT/RPotenza TXTX WPMGenera TXTX offsetTX ppmCorrezione della scheda audio in trasmissioneColore dei TabTabTalkerTalker Socket (MS only)Segnale di prova - NON USARE col trasmettitoreCarattere di provaCarattere di prova per la regolazione del QSKTest...Cattura testoFile di testo da inserireTestoTesto da inviare durante i tempi morti della tastieraTesto...Pàstene soppaltate secondo l'articolo 12, abbia pazienza, sennò posterdati, per due, anche un pochino antani in prefettura... ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~La velocitá predefinita di trasmissione in CWIl nome del file viene scritto nell'area del testo RxIl campo regular expression non puó essere vuoto.La regular expression deve essere valida.La stringa viene sostituita con il modem e la frequenza correntiLa frase di test non corrisponde allo schema di ricerca di questo evento.Questa regular expression per gli eventi non è valida.ThorOraTempo (s):Ora OFFOra ONOra di fineOra d'inizioOra di fine del QSOOra inizio QSOTempo in ms tra i tentativiTempo necessario: Arco di tempoTempo scadutoTemporizzazioneTemporizzazione e QSKVerso chi fare la connessioneScambiaUsa DTR per il PTTUsa RTS per il PTTDurata del tono (secondi)ToniVelocita' inseguita in CW (WPM)InseguimentoControllo del ricetrasmettitoreVelocità di trasferimento, X1-normaleTransmettiPotenza trasmissioneTrasmetti il nominativoCarattere in TXTrasmetti il tono di avvio bassoTrasmetti ID del modoModi di trasmissioneTrasmetti punti (.) nei tempi mortiPotenza di trasmissione usataSegnale trasmessoTrasmetti il tono di avvio altoTrasmetti testo videoLarghezza di trasmissioneTrasmetti/RiceviTrasmetti un punto quando non c'è attivitá sulla tastieraTriangolareLimite attivazione (s)AccordoMargine di sintonia (spaziatura tra i toni)Due barre (schema 1)Due barre (schema 2)Due barre (schema 3)Due barre (schema 4)Due barre (schema 5)Due barre (schema 6)Sfondo TxCaratt. TxPotenza Tx usata nei campi del logTxIDAspettoLinguaSchemaStato USAStato USA della stazione collegataAnnullaAggiornaLimite superioreLivello superiore del segnale (dB)Usa "cr cr lf" al posto di "cr lf"Usa '(' come parentesi, non KNUsa un CD o un'immagine su HDUsa il filtro DSP prima del decodificatoreUsa DTRUsa la spaziatura FarnsworthUsa HamlibUsa l'ingresso Line-InUsa un server audio OSSUsa Apri per selezionare il file con la descrizioneUsa un server Port AudioUsa server Pulse AudioUsa RTSUsa RigCATUsa un programma XML-RPCUsa la media per diminuire il rumore del waterfallUsa pulsanti coloratiUsa oscilloscopio a croceUsalo per permettere a un amplificatore di accorgersi del segnaleMetti zeri davantiUsa l'ingresso microfonoIl PTT usa una porta parallelaIl PTT usa una porta seriale separataUsa caratteri piccoliIl PTT usa uHRouterInterfaccia UtenteUtenteUsa la porta UDP #Abilita VSPVerbosoLa versione %s è disponible su %s Cosa vuoi fare?Modi ID videoPreambolo identificativo visuale&VediMostra/nascondi CanaliEmulatore Virtuale di Porte Seriali - sopprimi gli allarmiModi visibiliVisita il sito web HamcallVisita il sito web di QRZVisita l'URLIngrandimento WFControlli scorrimento WFMemorie WFWF amp spanPortante WFVelocita' verticale WFModo WFLivello di riferimento WFAttenti # ms prima di leggere la rispostaAvvisiWaterfallWaterfall / FFT / OscilloscopioControlli waterfallVelocità del waterfallAltezza del waterfall in pixelIdentificazione video del modo mostrata sul waterfallTesto visualizzato sul waterfallFormato audio *.wav AU *.{au,snd} Peso (%)Il peso diminuisce aumentando il tempo di salitaAzione della rotella del mouseQuando non ci sono segnaliAvverrà dopo questo tempo in secondiDelimitatori di parolaVai a capoRitardo scritturaTRASMXML-RPCBlocca freq trasmissioneControllo di flusso XON/XOFFSíStai già usando la versione più recenteÈ necessario un abbonamento a pagamento per l'accesso online a HamcallÈ necessario un abbonamento a pagamento per l'accesso online a QRZIl tuo nome utente per l'accessoLa tua password d'accessodopoa:dButente eQSLAbilita l'uso della rotella del mouse per il controllo della barra delle macroflmsg *flmsg.exe *.exeflmsg:il rapporto a campo libero deve coincidererapporto a formato liberoPorta e segnale usato per il PTT hardwarees: /home/dave/CALLBK/ or C:/CALLBK/ Lascia in bianco per cercare un databasein:minutirapportorapportisecondiCerca Regular ExpressionSeleziona i caratteri usati nel navigatoremodalitá solo waterfallfldigi-3.21.80/po/pl.po0000664000175000017500000047224612313333722011455 00000000000000# Polish translations for fldigi package # Copyright (C) 2008 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.22.0 ALPHA series\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2014-03-22 11:18-0500\n" "PO-Revision-Date: 2012-06-15 20:34+0100\n" "Last-Translator: Roman BagiÅ„ski \n" "Language-Team: Polish (Roman BagiÅ„ski) \n" "Language: Polish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Polish\n" "X-Poedit-Country: POLAND\n" "X-Poedit-SourceCharset: iso-8859-1\n" #: src/main.cxx:415 #, c-format msgid "%s log started on %s" msgstr "%s log rozpoczÄ™to %s" #: src/main.cxx:1014 msgid "Bad modem id" msgstr "" #: src/main.cxx:1021 #, fuzzy msgid "Bad frequency" msgstr "Czestotliwosc RF" #: src/main.cxx:1152 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licencja GPLv3: GNU GPL wersja 3 lub nowsza\n" "To jest wolne oprogramowanie: możesz dowolnie modyfikować i rozpowszechniać " "it.\n" "Nie ma ZADNEJ GWARANCJI, w zakresie dozwolonym przez prawo.\n" #: src/main.cxx:1377 src/main.cxx:1419 src/main.cxx:1443 src/main.cxx:1457 #, fuzzy msgid "Could not make directory " msgstr "Nie mozna utworzyc katalogu" #: src/dialogs/fl_digi.cxx:156 msgid "Log all RX/TX text" msgstr "Log tekstowy wszystkich RX/TX" #: src/dialogs/fl_digi.cxx:157 src/misc/debug.cxx:103 msgid "Rig control" msgstr "Rig kontrola" #: src/dialogs/fl_digi.cxx:158 src/dialogs/fl_digi.cxx:5455 msgid "Op &Mode" msgstr "Tryby emisji" #: src/dialogs/fl_digi.cxx:159 msgid "Show fewer modes" msgstr "Pokaz mniej trybów" #: src/dialogs/fl_digi.cxx:160 msgid "Show all modes" msgstr "Pokaz wszystkie tryby" #: src/dialogs/fl_digi.cxx:164 msgid "&View" msgstr "Widok" #: src/dialogs/fl_digi.cxx:165 msgid "&MFSK Image" msgstr "Obraz &MFSK" #: src/dialogs/fl_digi.cxx:166 msgid "&Weather Fax Image RX" msgstr "Faks pogody obraz RX" #: src/dialogs/fl_digi.cxx:167 msgid "&Weather Fax Image TX" msgstr "Faks pogody obraz TX" #: src/dialogs/fl_digi.cxx:168 src/dialogs/confdialog.cxx:5193 msgid "Contest" msgstr "Zawody" #: src/dialogs/fl_digi.cxx:169 msgid "&Contest fields" msgstr "Pola konkursowe" #: src/dialogs/fl_digi.cxx:170 msgid "C&ountries" msgstr "kraje" #: src/dialogs/fl_digi.cxx:171 msgid "&UI" msgstr "&UI" #: src/dialogs/fl_digi.cxx:172 msgid "Full" msgstr "PeÅ‚ny" #: src/dialogs/fl_digi.cxx:173 src/waterfall/waterfall.cxx:2119 #: src/dialogs/confdialog.cxx:5103 src/dialogs/confdialog.cxx:9806 #: src/dialogs/confdialog.cxx:9836 msgid "None" msgstr "Brak" #: src/dialogs/fl_digi.cxx:174 msgid "Rig control and logging" msgstr "Kontrola Rig i logowanie" #: src/dialogs/fl_digi.cxx:175 msgid "Rig control and contest" msgstr "Kontrola Rig i zawody" #: src/dialogs/fl_digi.cxx:176 msgid "Docked scope" msgstr "Zadokuj oscyloskop" #: src/dialogs/fl_digi.cxx:177 msgid "Minimal controls" msgstr "Minimum sterowania" #: src/dialogs/fl_digi.cxx:178 msgid "Show channels" msgstr "Pokaz kanaÅ‚y" #: src/dialogs/fl_digi.cxx:180 msgid "Connect to server" msgstr "Połącz z serwerem" #: src/dialogs/fl_digi.cxx:591 src/dialogs/fl_digi.cxx:606 #: src/dialogs/fl_digi.cxx:615 src/dialogs/fl_digi.cxx:3354 #: src/dialogs/fl_digi.cxx:3411 src/dialogs/fl_digi.cxx:3474 #: src/dialogs/fl_digi.cxx:5470 src/dialogs/fl_digi.cxx:5514 #: src/dialogs/fl_digi.cxx:5545 msgid "Custom..." msgstr "Wybrane..." #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2763 msgid "Save changed macros?" msgstr "Zapisz zmienione makra?" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2415 #: src/dialogs/fl_digi.cxx:2477 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 #: src/dialogs/fl_digi.cxx:3892 src/logbook/logsupport.cxx:585 #: src/misc/configuration.cxx:698 src/dialogs/font_browser.cxx:137 #: src/logbook/lgbook.cxx:447 src/logbook/lgbook.cxx:1056 msgid "Cancel" msgstr "Anuluj" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 #: src/dialogs/fl_digi.cxx:3579 src/dialogs/fl_digi.cxx:4643 #: src/dialogs/fl_digi.cxx:4810 src/dialogs/fl_digi.cxx:4915 #: src/logbook/logsupport.cxx:584 src/dialogs/confdialog.cxx:10249 msgid "Save" msgstr "Zapisz" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 msgid "Don't save" msgstr "Nie zapisuj" #: src/dialogs/fl_digi.cxx:1749 msgid "No file name given" msgstr "" #: src/dialogs/fl_digi.cxx:1752 msgid "Unsupported format" msgstr "" #: src/dialogs/fl_digi.cxx:1755 #, fuzzy msgid "channels != 1" msgstr "Pokaz kanaÅ‚y" #: src/dialogs/fl_digi.cxx:1758 msgid "unknown wave file error" msgstr "" #: src/dialogs/fl_digi.cxx:1765 msgid "Spotting disabled" msgstr "Spotting deaktywowany" #: src/dialogs/fl_digi.cxx:1814 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Nie można uruchomic przeglÄ…darki internetowej:\n" "%s\n" "\n" "Otwórz ten adres rÄ™cznie:\n" "%s" #: src/dialogs/fl_digi.cxx:1827 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Nie można otworzyc url:\n" "%s\n" #: src/dialogs/fl_digi.cxx:1878 msgid "Checking for updates..." msgstr "Sprawdzanie aktualizacji..." #: src/dialogs/fl_digi.cxx:1893 #, c-format msgid "" "Could not check for updates:\n" "%s" msgstr "" "Nie mozna sprawdzic dostÄ™pnosci aktualizacji:\n" "%s" #: src/dialogs/fl_digi.cxx:1897 #, c-format msgid "" "Version %s is available at\n" "\n" "%s\n" "\n" "What would you like to do?" msgstr "" "Wersja %s jest dostÄ™pna pod adresem\n" "\n" "%s\n" "\n" "Co chcesz zrobic?" #: src/dialogs/fl_digi.cxx:1898 src/dialogs/Viewer.cxx:304 #: src/misc/macroedit.cxx:419 src/misc/newinstall.cxx:391 #: src/mfsk/mfsk-pic.cxx:342 src/spot/notify.cxx:519 src/spot/notify.cxx:523 #: src/dialogs/confdialog.cxx:10252 msgid "Close" msgstr "Zamknij" #: src/dialogs/fl_digi.cxx:1898 msgid "Visit URL" msgstr "zobacz URL" #: src/dialogs/fl_digi.cxx:1898 msgid "Copy URL" msgstr "Kopiuj URL" #: src/dialogs/fl_digi.cxx:1910 msgid "You are running the latest version" msgstr "Używasz najnowszej wersji" #: src/dialogs/fl_digi.cxx:1976 msgid "Sunspot creation underway!" msgstr "Sunspot tworzenie w toku!" #: src/dialogs/fl_digi.cxx:1983 msgid "Audio device information is only available for the PortAudio backend" msgstr "" "DzwiÄ™k informacje: UrzÄ…dzenie jest dostÄ™pne tylko jako dodatkowa usÅ‚uga " "PortAudio" #: src/dialogs/fl_digi.cxx:1992 msgid "Capture device" msgstr "Przechwyc urzÄ…dzenie" #: src/dialogs/fl_digi.cxx:1993 msgid "Playback device" msgstr "UrzÄ…dzenie do odtwarzania" #: src/dialogs/fl_digi.cxx:1997 msgid "Capture and playback devices" msgstr "Przechwytywanie i odtwarzanie urzÄ…dzen" #: src/dialogs/fl_digi.cxx:2043 #, fuzzy, c-format msgid "%s: Do not exist, create?" msgstr "Nie istnieje, utworzyc ?" #: src/dialogs/fl_digi.cxx:2043 src/dialogs/fl_digi.cxx:2796 #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 #: src/logbook/logsupport.cxx:251 src/logbook/logsupport.cxx:1047 #: src/misc/configuration.cxx:700 src/soundcard/sound.cxx:306 msgid "No" msgstr "Nie" #: src/dialogs/fl_digi.cxx:2043 src/dialogs/fl_digi.cxx:2796 #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 #: src/logbook/logsupport.cxx:251 src/logbook/logsupport.cxx:1047 #: src/misc/configuration.cxx:700 src/soundcard/sound.cxx:306 msgid "Yes" msgstr "Tak" #: src/dialogs/fl_digi.cxx:2415 msgid "Clear log fields?" msgstr "Wyczyscic pola dziennika?" #: src/dialogs/fl_digi.cxx:2415 src/misc/configuration.cxx:698 #: src/logbook/lgbook.cxx:444 src/logbook/lgbook.cxx:1053 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:2430 msgid "Enter a CALL !" msgstr "Wpisz StacjÄ™ !" #: src/dialogs/fl_digi.cxx:2477 src/dialogs/fl_digi.cxx:3892 msgid "Confirm" msgstr "Zastosuj" #: src/dialogs/fl_digi.cxx:2751 msgid "Save changed configuration?" msgstr "Zapisac zmiany konfiguracji?" #: src/dialogs/fl_digi.cxx:2775 msgid "Save current log entry?" msgstr "Zapisz aktualny wpis w dzienniku?" #: src/dialogs/fl_digi.cxx:2796 msgid "Really want to quit?" msgstr "" #: src/dialogs/fl_digi.cxx:3311 src/dialogs/fl_digi.cxx:5451 msgid "&File" msgstr "Plik" #: src/dialogs/fl_digi.cxx:3313 msgid "Folders" msgstr "Foldery" #: src/dialogs/fl_digi.cxx:3314 msgid "Fldigi config..." msgstr "Konfiguracja Fldigi..." #: src/dialogs/fl_digi.cxx:3315 msgid "FLMSG files..." msgstr "Pliki FLMSG..." #: src/dialogs/fl_digi.cxx:3316 msgid "NBEMS files..." msgstr "Pliki NBEMS..." #: src/dialogs/fl_digi.cxx:3317 #, fuzzy msgid "Data files..." msgstr "Pliki FLMSG..." #: src/dialogs/fl_digi.cxx:3320 src/dialogs/confdialog.cxx:5617 msgid "Macros" msgstr "Makra" #: src/dialogs/fl_digi.cxx:3321 msgid "Open ..." msgstr "Otwórz..." #: src/dialogs/fl_digi.cxx:3322 msgid "Save ..." msgstr "Zapisz..." #: src/dialogs/fl_digi.cxx:3325 msgid "Text Capture" msgstr "Przechwytywanie tekstu" #: src/dialogs/fl_digi.cxx:3330 src/misc/debug.cxx:101 #: src/dialogs/confdialog.cxx:8654 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:3331 msgid "RX capture" msgstr "Przechwytywanie RX" #: src/dialogs/fl_digi.cxx:3332 msgid "TX generate" msgstr "Generuj TX " #: src/dialogs/fl_digi.cxx:3333 src/dialogs/confdialog.cxx:8754 msgid "Playback" msgstr "Odtwarzaj" #: src/dialogs/fl_digi.cxx:3337 src/dialogs/fl_digi.cxx:5452 msgid "Exit" msgstr "Wyjdz" #: src/dialogs/fl_digi.cxx:3518 src/dialogs/fl_digi.cxx:5585 msgid "&Configure" msgstr "Konfiguruj" #: src/dialogs/fl_digi.cxx:3519 src/dialogs/confdialog.cxx:4937 msgid "Operator" msgstr "Operator" #: src/dialogs/fl_digi.cxx:3520 msgid "Colors && Fonts" msgstr "Kolory && Czcionki" #: src/dialogs/fl_digi.cxx:3521 msgid "User Interface" msgstr "Interfejs uzytkownika" #: src/dialogs/fl_digi.cxx:3522 src/dialogs/fl_digi.cxx:3556 #: src/dialogs/fl_digi.cxx:5586 src/dialogs/confdialog.cxx:6112 msgid "Waterfall" msgstr "Wodospad" #: src/dialogs/fl_digi.cxx:3523 msgid "Waterfall controls" msgstr "Kontrola wodospadu" #: src/dialogs/fl_digi.cxx:3525 src/dialogs/fl_digi.cxx:5589 #: src/dialogs/confdialog.cxx:6489 msgid "Modems" msgstr "Modem" #: src/dialogs/fl_digi.cxx:3527 src/dialogs/fl_digi.cxx:5588 msgid "Sound Card" msgstr "Karta dzwiekowa" #: src/dialogs/fl_digi.cxx:3528 src/dialogs/fl_digi.cxx:5590 msgid "IDs" msgstr "Wyslij ID" #: src/dialogs/fl_digi.cxx:3529 src/dialogs/confdialog.cxx:9220 msgid "Misc" msgstr "Inne" #: src/dialogs/fl_digi.cxx:3530 src/dialogs/confdialog.cxx:10038 msgid "Autostart" msgstr "" #: src/dialogs/fl_digi.cxx:3531 src/dialogs/fl_digi.cxx:5591 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Powiadomienia" #: src/dialogs/fl_digi.cxx:3533 msgid "QRZ/eQSL" msgstr "QRZ/eQSL" #: src/dialogs/fl_digi.cxx:3534 src/dialogs/fl_digi.cxx:5592 msgid "Save Config" msgstr "Zapisz konfiguracje" #: src/dialogs/fl_digi.cxx:3539 msgid "View/Hide Channels" msgstr "Pokaz/ukryj kanaly" #: src/dialogs/fl_digi.cxx:3541 msgid "Floating scope" msgstr "Oscyloskop" #: src/dialogs/fl_digi.cxx:3545 msgid "Signal browser" msgstr "PrzeglÄ…darka sygnalu" #: src/dialogs/fl_digi.cxx:3548 msgid "Controls" msgstr "Kontrola" #: src/dialogs/fl_digi.cxx:3563 msgid "&Logbook" msgstr "Dziennik" #: src/dialogs/fl_digi.cxx:3564 msgid "View" msgstr "Widok" #: src/dialogs/fl_digi.cxx:3566 msgid "ADIF" msgstr "" #: src/dialogs/fl_digi.cxx:3567 msgid "Merge..." msgstr "Scal..." #: src/dialogs/fl_digi.cxx:3568 msgid "Export..." msgstr "Eksportuj..." #: src/dialogs/fl_digi.cxx:3571 #, fuzzy msgid "Reports" msgstr "raporty" #: src/dialogs/fl_digi.cxx:3572 msgid "Text..." msgstr "Tekst..." #: src/dialogs/fl_digi.cxx:3573 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:3574 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:3577 src/logbook/logsupport.cxx:593 #: src/logbook/lgbook.cxx:960 msgid "New" msgstr "Nowy" #: src/dialogs/fl_digi.cxx:3578 src/dialogs/confdialog.cxx:8200 msgid "Open..." msgstr "Otwórz..." #: src/dialogs/fl_digi.cxx:3586 msgid "&Help" msgstr "Pomoc" #: src/dialogs/fl_digi.cxx:3589 msgid "Create sunspots" msgstr "Utwórz sunspota" #: src/dialogs/fl_digi.cxx:3591 msgid "Beginners' Guide" msgstr "Przewodnik dla poczÄ…tkujÄ…cych" #: src/dialogs/fl_digi.cxx:3592 msgid "Online documentation..." msgstr "Dokumentacja via internet..." #: src/dialogs/fl_digi.cxx:3593 msgid "Fldigi web site..." msgstr "Fldigi na stronie web..." #: src/dialogs/fl_digi.cxx:3594 msgid "Reception reports..." msgstr "Raporty odbioru..." #: src/dialogs/fl_digi.cxx:3595 msgid "Command line options" msgstr "Opcje wiersza polecen" #: src/dialogs/fl_digi.cxx:3596 msgid "Audio device info" msgstr "Informacje o urzÄ…dzeniach audio" #: src/dialogs/fl_digi.cxx:3597 msgid "Build info" msgstr "Build informacje" #: src/dialogs/fl_digi.cxx:3598 src/misc/debug.cxx:137 msgid "Event log" msgstr "Rejestr zdarzen" #: src/dialogs/fl_digi.cxx:3599 msgid "Check for updates..." msgstr "Sprawdz dostÄ™pnosc aktualizacji" #: src/dialogs/fl_digi.cxx:3600 msgid "&About" msgstr "O progr." #: src/dialogs/fl_digi.cxx:3834 msgid "waterfall-only mode" msgstr "Tylko tryb Wodospad" #: src/dialogs/fl_digi.cxx:3836 msgid "NO CALLSIGN SET" msgstr "NIE USTAWIONO ZNAKU STACJI" #: src/dialogs/fl_digi.cxx:3851 msgid "Close List" msgstr "Zamknij liste" #: src/dialogs/fl_digi.cxx:3861 src/dialogs/fl_digi.cxx:4491 #: src/dialogs/fl_digi.cxx:4789 src/dialogs/fl_digi.cxx:4901 msgid "Open List" msgstr "Otwórz liste" #: src/dialogs/fl_digi.cxx:3892 msgid "Clear list?" msgstr "Zeruj liste" #: src/dialogs/fl_digi.cxx:3925 msgid "report" msgstr "raport" #: src/dialogs/fl_digi.cxx:3925 msgid "reports" msgstr "raporty" #: src/dialogs/fl_digi.cxx:3935 msgid "Recent activity for grid" msgstr "Ostatnia aktywnosc siatki" #: src/dialogs/fl_digi.cxx:4485 msgid "No rig specified" msgstr "Nie wybrano rig" #: src/dialogs/fl_digi.cxx:4562 src/spot/notify.cxx:215 #: src/dialogs/confdialog.cxx:5181 msgid "Select" msgstr "Wybierz" #: src/dialogs/fl_digi.cxx:4569 msgid "Add current frequency" msgstr "Dodaj aktualnÄ… czÄ™stotliwosc" #: src/dialogs/fl_digi.cxx:4576 msgid "Clear list" msgstr "Wyczysc listÄ™" #: src/dialogs/fl_digi.cxx:4583 msgid "Delete from list" msgstr "Kasuj z listy" #: src/dialogs/fl_digi.cxx:4603 msgid "Select operating parameters" msgstr "Wybierz parametry pracy" #: src/dialogs/fl_digi.cxx:4629 src/dialogs/fl_digi.cxx:4796 msgid "QRZ" msgstr "QRZ" #: src/dialogs/fl_digi.cxx:4636 src/dialogs/fl_digi.cxx:4803 #: src/dialogs/fl_digi.cxx:4908 src/dialogs/fl_digi.cxx:5124 #: src/dialogs/Viewer.cxx:312 src/widgets/FTextView.cxx:480 #: src/widgets/FTextView.cxx:645 src/widgets/flinput2.cxx:47 #: src/dialogs/confdialog.cxx:7570 msgid "Clear" msgstr "Czysc" #: src/dialogs/fl_digi.cxx:4655 src/logbook/lgbook.cxx:467 #: src/logbook/lgbook.cxx:1079 msgid "Freq" msgstr "CzÄ™st" #: src/dialogs/fl_digi.cxx:4657 msgid "frequency kHz" msgstr "Czestotliwosc w kHz" #: src/dialogs/fl_digi.cxx:4660 src/dialogs/fl_digi.cxx:4812 #: src/dialogs/fl_digi.cxx:4918 msgid "On" msgstr "Pocz" #: src/dialogs/fl_digi.cxx:4661 #, fuzzy msgid "Press to update QSO start time" msgstr "Nacisnij przycisk, aby zaktualizowac" #: src/dialogs/fl_digi.cxx:4665 msgid "QSO start time" msgstr "Czas rozpoczecia QSO" #: src/dialogs/fl_digi.cxx:4669 src/dialogs/fl_digi.cxx:4825 #: src/dialogs/fl_digi.cxx:4919 msgid "Off" msgstr "Kon" #: src/dialogs/fl_digi.cxx:4670 msgid "QSO end time" msgstr "Koniec QSO" #: src/dialogs/fl_digi.cxx:4674 src/dialogs/fl_digi.cxx:4842 #: src/logbook/lgbook.cxx:620 msgid "In" msgstr "Odbr" #: src/dialogs/fl_digi.cxx:4678 src/dialogs/fl_digi.cxx:4850 #: src/logbook/lgbook.cxx:706 msgid "Out" msgstr "Wysl" #: src/dialogs/fl_digi.cxx:4682 src/dialogs/fl_digi.cxx:4834 #: src/dialogs/fl_digi.cxx:4920 src/widgets/FTextRXTX.cxx:105 #: src/logbook/lgbook.cxx:459 src/logbook/lgbook.cxx:596 #: src/logbook/lgbook.cxx:1075 msgid "Call" msgstr "Stacja" #: src/dialogs/fl_digi.cxx:4683 #, fuzzy msgid "call sign" msgstr "Znak wywoÅ‚awczy" #: src/dialogs/fl_digi.cxx:4686 msgid "Op" msgstr "Op" #: src/dialogs/fl_digi.cxx:4687 msgid "Operator name" msgstr "ImiÄ™ operatora" #: src/dialogs/fl_digi.cxx:4691 msgid "Azimuth" msgstr "Azymut" #: src/dialogs/fl_digi.cxx:4697 msgid "City" msgstr "Miasto" #: src/dialogs/fl_digi.cxx:4701 msgid "US State" msgstr "Stan USA" #: src/dialogs/fl_digi.cxx:4705 msgid "Can. Province" msgstr "Prowincja Kan." #: src/dialogs/fl_digi.cxx:4709 #, fuzzy msgid "Maidenhead Locator" msgstr "Lokator na przykÅ‚ad JO93xq" #: src/dialogs/fl_digi.cxx:4720 src/dialogs/fl_digi.cxx:4969 msgid "Sent serial number (read only)" msgstr "WysÅ‚any numer porzÄ…dkowy (tylko odczyt)" #: src/dialogs/fl_digi.cxx:4725 src/dialogs/fl_digi.cxx:4960 msgid "Received serial number" msgstr "Odebrany numer porzÄ…dkowy" #: src/dialogs/fl_digi.cxx:4729 src/dialogs/fl_digi.cxx:4951 msgid "Contest exchange in" msgstr "Wymiana w zawodach" #: src/dialogs/fl_digi.cxx:4744 src/spot/notify.cxx:569 #: src/widgets/FTextRXTX.cxx:110 src/logbook/lgbook.cxx:521 #: src/logbook/lgbook.cxx:767 msgid "Country" msgstr "kraj" #: src/dialogs/fl_digi.cxx:4750 src/logbook/lgbook.cxx:524 #: src/logbook/lgbook.cxx:791 msgid "Notes" msgstr "Uwagi" #: src/dialogs/fl_digi.cxx:4816 src/dialogs/fl_digi.cxx:4975 msgid "Press to update" msgstr "Nacisnij przycisk, aby zaktualizowac" #: src/dialogs/fl_digi.cxx:4822 src/dialogs/fl_digi.cxx:4981 #: src/logbook/lgbook.cxx:584 msgid "Time On" msgstr "Start" #: src/dialogs/fl_digi.cxx:4831 src/dialogs/fl_digi.cxx:4989 #: src/logbook/lgbook.cxx:658 msgid "Time Off" msgstr "Koniec" #: src/dialogs/fl_digi.cxx:4840 src/dialogs/fl_digi.cxx:4936 #: src/dialogs/fl_digi.cxx:5289 msgid "Other call" msgstr "Inna stacja" #: src/dialogs/fl_digi.cxx:4848 msgid "Received RST" msgstr "RST odebr." #: src/dialogs/fl_digi.cxx:4856 msgid "Sent RST" msgstr "RST wyslany" #: src/dialogs/fl_digi.cxx:4858 msgid "Nm" msgstr "Nm" #: src/dialogs/fl_digi.cxx:4865 msgid "Other name" msgstr "Inne Imie" #: src/dialogs/fl_digi.cxx:4921 msgid "# S" msgstr "# S" #: src/dialogs/fl_digi.cxx:4922 msgid "# R" msgstr "# R" #: src/dialogs/fl_digi.cxx:4923 msgid "Ex" msgstr "Ex" #: src/dialogs/fl_digi.cxx:5029 msgid "" "Left Click - execute\n" "Shift-Fkey - execute\n" "Right Click - edit" msgstr "" "Lewym kliknij - wykonaj\n" "Shift-Fkey - wykonaj\n" "Prawym kliknij - edytuj" #: src/dialogs/fl_digi.cxx:5036 msgid "Shift-key macro set" msgstr "Shift-key ustaw makro" #: src/dialogs/fl_digi.cxx:5083 msgid "" "Left click - select\n" "Right click - clear line" msgstr "" "Kliknij lewym przyciskiem myszy - Wybierz\n" "Kliknij prawym przyciskiem myszy - zeruj linie" #: src/dialogs/fl_digi.cxx:5099 msgid "seek - regular expression" msgstr "szukaj - wyrazenie regularne" #: src/dialogs/fl_digi.cxx:5120 src/dialogs/Viewer.cxx:322 msgid "Set Viewer Squelch" msgstr "Ustaw przeglÄ…darkÄ™ blokady szumów" #: src/dialogs/fl_digi.cxx:5207 msgid "" "Left Click - execute\n" "Fkey - execute\n" "Right Click - edit" msgstr "" "Lewy Klik - wykonanie\n" "Fkey - wykonanie\n" "Kliknij prawym przyciskiem myszy - edycja" #: src/dialogs/fl_digi.cxx:5214 msgid "Primary macro set" msgstr "Podstawowy zestaw makro" #: src/dialogs/fl_digi.cxx:5231 src/dialogs/fl_digi.cxx:5813 msgid "Detected signal level" msgstr "Wykryty poziom sygnalu" #: src/dialogs/fl_digi.cxx:5242 src/dialogs/fl_digi.cxx:5825 #: src/waterfall/waterfall.cxx:2120 msgid "Squelch level" msgstr "Poziom blokady szumów" #: src/dialogs/fl_digi.cxx:5256 src/dialogs/fl_digi.cxx:5839 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Kliknij lewym przyciskiem myszy: zmiana trybu\n" "Kliknij prawym przyciskiem myszy: konfiguruj" #: src/dialogs/fl_digi.cxx:5266 src/dialogs/fl_digi.cxx:5846 msgid "CW transmit WPM" msgstr "CW nadawane WPM" #: src/dialogs/fl_digi.cxx:5272 src/dialogs/fl_digi.cxx:5853 msgid "Default WPM" msgstr "Domyslny WPM" #: src/dialogs/fl_digi.cxx:5311 src/dialogs/fl_digi.cxx:5885 msgid "Tx level attenuator (dB)" msgstr "Poziom tÅ‚umienia Tx (dB)" #: src/dialogs/fl_digi.cxx:5335 src/dialogs/fl_digi.cxx:5908 msgid "Automatic Frequency Control" msgstr "Automatyczna regulacja czÄ™stotliwosci" #: src/dialogs/fl_digi.cxx:5338 src/dialogs/fl_digi.cxx:5911 msgid "Squelch" msgstr "blokada szumów" #: src/dialogs/fl_digi.cxx:5381 src/dialogs/fl_digi.cxx:5723 msgid "Scope" msgstr "Oscyloskop" #: src/dialogs/fl_digi.cxx:5601 src/dialogs/Viewer.cxx:279 msgid "Signal Browser" msgstr "Przegladarka sygnalów" #: src/dialogs/Viewer.cxx:283 msgid "Find: " msgstr "Szukaj:" #: src/dialogs/Viewer.cxx:316 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Kliknij lewym by wyczyscic tekst\n" "Kliknij prawym przyciskiem myszy, aby zresetować czÄ™stotliwosci" #: src/logbook/adif_io.cxx:233 #, c-format msgid "Empty ADIF logbook file %s" msgstr "Pusty plik ADIF dziennika %s" #: src/logbook/adif_io.cxx:252 #, c-format msgid "Error reading %s" msgstr "" #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 msgid "Save changed Logbook?" msgstr "Zapisz zmieniony Logbook?" #: src/logbook/logsupport.cxx:141 msgid "Export to CSV file" msgstr "Eksportuj do pliku CSV" #: src/logbook/logsupport.cxx:167 msgid "Export to fixed field text file" msgstr "Eksportuj do pliku tekstowego w staÅ‚ym polu" #: src/logbook/logsupport.cxx:194 msgid "Export to ADIF file" msgstr "Eksportuj do pliku ADIF" #: src/logbook/logsupport.cxx:251 msgid "Create New Logbook?" msgstr "Utworzyc nowy Logbook?" #: src/logbook/logsupport.cxx:280 msgid "Open logbook file" msgstr "Otwórz plik dziennika" #: src/logbook/logsupport.cxx:303 msgid "Save logbook file" msgstr "Zapisz plik dziennika" #: src/logbook/logsupport.cxx:497 msgid "Merge ADIF file" msgstr "Scal plik ADIF" #: src/logbook/logsupport.cxx:594 src/spot/notify.cxx:203 #: src/spot/notify.cxx:517 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:967 msgid "Update" msgstr "Aktualizuj" #: src/logbook/logsupport.cxx:1046 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Czy na pewno usunac rekord \"%s\"?" #: src/logbook/logsupport.cxx:1433 msgid "Create cabrillo report" msgstr "Tworzenie raportu Cabrillo " #: src/logger/rx_extract.cxx:55 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" "Wykryj wystÄ™powanie[WRAP:beg] i [WRAP:end]\n" "Zapisz tagi i wszystko zalaczonego tekstu do daty czasu stemplowania pliku, " "ie:\n" " NBEMS.pliki\\WRAP\\odebr\\wypakuj-20090127-092515.wrap" #: src/logger/rx_extract.cxx:60 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" "Wykryj wystÄ™powanie [WRAP:beg] i [WRAP:end]\n" "Zapisz tagi i wszystko załączonego tekstu do daty czasu stemplowania pliku, " "ie:\n" " ~/.nbems/WRAP/odebr/wypakuj-20090127-092515.wrap" #: src/logger/rx_extract.cxx:270 msgid "Could not start flmsg" msgstr "Nie mozna uruchomic flmsg" #: src/logger/rx_extract.cxx:337 src/logger/rx_extract.cxx:340 #: src/dialogs/confdialog.cxx:9287 msgid "Locate flmsg executable" msgstr "Zlokalizuj flmsg exe" #: src/logger/rx_extract.cxx:337 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:340 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:415 #, fuzzy msgid "Locate executable" msgstr "Zlokalizuj flmsg exe" #: src/logger/rx_extract.cxx:415 msgid "*.exe" msgstr "" #: src/logger/rx_extract.cxx:425 #, fuzzy msgid "Locate binary" msgstr "Lokator" #: src/logger/rx_extract.cxx:425 msgid "*" msgstr "" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Zapisz wszystkie otrzymane teksty, jeden znak na raz do nastÄ™pujÄ…cego " "pliku:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:508 msgid "Rig mode" msgstr "Tryb Rig" #: src/misc/configuration.cxx:509 msgid "Always LSB" msgstr "Zawsze LSB" #: src/misc/configuration.cxx:510 msgid "Always USB" msgstr "Zawsze USB" #: src/misc/configuration.cxx:695 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Resetowac wszystkie opcje do ich wartosci domyslnych?\n" "Zresetowane opcje zostanÄ… uwzglÄ™dnione przy nastÄ™pnym uruchomieniu\n" "Pliki: fldigi_def.xml i fldigi.prefs zostana usuniÄ™te\n" #: src/misc/configuration.cxx:700 msgid "Confirm RESET" msgstr "Zastosuj RESET" #: src/misc/debug.cxx:91 msgid "Quiet" msgstr "Spokojny" #: src/misc/debug.cxx:91 msgid "Error" msgstr "Blad" #: src/misc/debug.cxx:91 msgid "Warning" msgstr "Uwaga" #: src/misc/debug.cxx:91 msgid "Info" msgstr "Info" #: src/misc/debug.cxx:91 msgid "Verbose" msgstr "RozwlekÅ‚y" #: src/misc/debug.cxx:91 msgid "Debug" msgstr "Debug" #: src/misc/debug.cxx:100 msgid "ARQ control" msgstr "Kontrola ARQ" #: src/misc/debug.cxx:102 src/waterfall/waterfall.cxx:2121 msgid "Modem" msgstr "Modem" #: src/misc/debug.cxx:104 msgid "RPC" msgstr "RPC" #: src/misc/debug.cxx:105 msgid "Spotter" msgstr "Wtyczka" #: src/misc/debug.cxx:106 msgid "Other" msgstr "Inne" #: src/misc/debug.cxx:141 msgid "Log sources" msgstr "Log podstawowy" #: src/misc/debug.cxx:146 msgid "Change log level" msgstr "Zmiana poziomu Logu" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "\tmoja czestotliwosc" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "\temisja" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "\tmoja stacja" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "\tmój lokator" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "\tmoje imie" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "\tmoje QTH" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "\tmoje RST" #: src/misc/macroedit.cxx:78 msgid "\tmy antenna" msgstr "" #: src/misc/macroedit.cxx:79 #, fuzzy msgid "\toperating band" msgstr "\tkoniec wymiany" #: src/misc/macroedit.cxx:81 msgid "\tFldigi version" msgstr "\twersja Fldigi" #: src/misc/macroedit.cxx:84 msgid "\tother call" msgstr "\tinna stacja" #: src/misc/macroedit.cxx:85 msgid "\tS/N etc." msgstr "\tS/N itp." #: src/misc/macroedit.cxx:86 msgid "\tIMD etc." msgstr "\tIMD itp." #: src/misc/macroedit.cxx:87 msgid "\tother locator" msgstr "\tinny lokator" #: src/misc/macroedit.cxx:88 msgid "\tother name" msgstr "\tinne imie" #: src/misc/macroedit.cxx:89 msgid "\tother QTH" msgstr "\tinne QTH" #: src/misc/macroedit.cxx:90 msgid "\tother RST" msgstr "\tinny RST" #: src/misc/macroedit.cxx:91 msgid "\t# QSO recs" msgstr "" #: src/misc/macroedit.cxx:92 msgid "\tnext QSO rec #" msgstr "" #: src/misc/macroedit.cxx:93 msgid "\tmap on google" msgstr "\tmapa google" #: src/misc/macroedit.cxx:94 msgid "\tmap by value" msgstr "\tmapa wedÅ‚ug wartosci" #: src/misc/macroedit.cxx:97 msgid "\tclear RX pane" msgstr "\tresetuj panel RX" #: src/misc/macroedit.cxx:98 msgid "\tclear TX pane" msgstr "\tresetuj panel TX" #: src/misc/macroedit.cxx:101 msgid "\ttext to NAME/QTH" msgstr "\ttekst do IMIE/QTH" #: src/misc/macroedit.cxx:105 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk Wl, Wyl, Przelacz" #: src/misc/macroedit.cxx:109 msgid "\tclear log fields" msgstr "\tczysc pola logu" #: src/misc/macroedit.cxx:110 msgid "\tsave QSO data" msgstr "\tzapisz dane QSO" #: src/misc/macroedit.cxx:111 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:112 msgid "\tlog at xmt time" msgstr "\tloguj czas Xmt " #: src/misc/macroedit.cxx:113 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:114 #, fuzzy msgid "\tlog eQSL" msgstr "\tlog opcionalny eQSL.cc" #: src/misc/macroedit.cxx:115 msgid "\tlog eQSL optional msg" msgstr "\tlog opcionalny eQSL.cc" #: src/misc/macroedit.cxx:118 msgid "\tQSO time (HHMM))" msgstr "\tczas QSO (HHMM)" #: src/misc/macroedit.cxx:119 msgid "\tLDT in iso-8601 format" msgstr "\tLDT format iso-8601" #: src/misc/macroedit.cxx:120 msgid "\tLocal datetime" msgstr "\tlokalny czas data" #: src/misc/macroedit.cxx:121 msgid "\tZDT in iso-8601 format" msgstr "\tZDT format iso-8601" #: src/misc/macroedit.cxx:122 msgid "\tUTC datetime" msgstr "\tczas data UTC" #: src/misc/macroedit.cxx:123 msgid "\tlocal time HHMM" msgstr "\tczas lokalny (HHMM)" #: src/misc/macroedit.cxx:124 msgid "\tzulu time HHMMZ" msgstr "\tczas zulu HHMMZ" #: src/misc/macroedit.cxx:125 msgid "\tlocal date YYYY-MM-DD" msgstr "\tlokalna data YYYY-MM-DD" #: src/misc/macroedit.cxx:126 msgid "\tzulu date YYYY-MM-DD Z" msgstr "\tData zulu YYYY-MM-DD Z" #: src/misc/macroedit.cxx:127 msgid "\tget weather data" msgstr "\tuzyskaj dane o pogodzie" #: src/misc/macroedit.cxx:128 msgid "\tget weather data for station" msgstr "\tuzyskaj dane pogodowe dla stacji" #: src/misc/macroedit.cxx:131 msgid "\tcontest counter" msgstr "\tlicznik zawodów" #: src/misc/macroedit.cxx:132 msgid "\tdecrement counter" msgstr "\tLicznik dekrementacji" #: src/misc/macroedit.cxx:133 msgid "\tincrement counter" msgstr "\tzwiÄ™kszamy licznik" #: src/misc/macroedit.cxx:134 msgid "\texchange in" msgstr "\twymiana odebrana" #: src/misc/macroedit.cxx:135 msgid "\texchange out" msgstr "\twymiana nadana" #: src/misc/macroedit.cxx:136 msgid "\texchange begin" msgstr "\trozpocznij wymiane" #: src/misc/macroedit.cxx:137 msgid "\texchange end" msgstr "\tkoniec wymiany" #: src/misc/macroedit.cxx:138 msgid "\tsave contest out" msgstr "\tzapisz konkurs" #: src/misc/macroedit.cxx:141 msgid "\treceive" msgstr "\todbiór" #: src/misc/macroedit.cxx:142 msgid "\ttransmit" msgstr "\tnadawanie" #: src/misc/macroedit.cxx:143 msgid "\ttoggle T/R" msgstr "\tprzelacz Tx/Rx" #: src/misc/macroedit.cxx:144 msgid "\tsearch UP for signal" msgstr "\twyszukiwanie w GÓRE sygnalu" #: src/misc/macroedit.cxx:145 msgid "\tsearch DOWN for signal" msgstr "\twyszukiwanie w DOL sygnalu" #: src/misc/macroedit.cxx:146 msgid "\treturn to sweet spot" msgstr "\tpowroc do sweet spot" #: src/misc/macroedit.cxx:147 msgid "\tmove to freq NNNN Hz" msgstr "\tprzenies do czest NNNN Hz" #: src/misc/macroedit.cxx:148 msgid "\tleft-clk QSY button" msgstr "\tLewym klikiem przycisk QSY" #: src/misc/macroedit.cxx:149 msgid "\tright-clk QSY button" msgstr "\tPrawo klikiem przycisk QSY" #: src/misc/macroedit.cxx:152 msgid "\tinsert QRG into Rx text" msgstr "" #: src/misc/macroedit.cxx:155 msgid "\tqsy to kHz, Hz" msgstr "\tqsy do kHz, Hz" #: src/misc/macroedit.cxx:156 msgid "\tvalid xcvr mode" msgstr "\tobowiÄ…zuje tryb xcvr" #: src/misc/macroedit.cxx:157 msgid "\tvalid xcvr filter width" msgstr "\twazna szerokosc filtru xcvr" #: src/misc/macroedit.cxx:160 msgid "\tinsert text file" msgstr "\twstaw plik tekstowy" #: src/misc/macroedit.cxx:161 #, fuzzy msgid "\tinsert MFSK image" msgstr "\twstaw plik tekstowy" #: src/misc/macroedit.cxx:164 #, fuzzy msgid "\tpause transmit" msgstr "\tnadawanie" #: src/misc/macroedit.cxx:165 msgid "\tidle signal for NN.nn sec" msgstr "\tbezczynny sygnaÅ‚ dla NN.nn sek" #: src/misc/macroedit.cxx:166 msgid "\trepeat every NN sec" msgstr "\tCyklicznie co NN sek" #: src/misc/macroedit.cxx:167 msgid "\ttune signal for NN sec" msgstr "\tSygnaÅ‚ strojenia dla NN sek" #: src/misc/macroedit.cxx:168 msgid "\tdelay xmt for NN sec" msgstr "\topóznij Xmt dla NN sek" #: src/misc/macroedit.cxx:169 msgid "\trepeat macro continuously" msgstr "\tpowtarzaj makro stale" #: src/misc/macroedit.cxx:170 #, fuzzy msgid "\tschedule execution" msgstr "\tharmonogram realizacji" #: src/misc/macroedit.cxx:173 msgid "\t set xmt attenuator" msgstr "" #: src/misc/macroedit.cxx:176 msgid "\tCW identifier" msgstr "\tidentyfikator CW" #: src/misc/macroedit.cxx:177 msgid "\tsend mode ID in video text" msgstr "\twyslij ID trybu w tekscie wideo" #: src/misc/macroedit.cxx:178 msgid "\tvideo text" msgstr "\tvideo tekst" #: src/misc/macroedit.cxx:179 msgid "\tTx RSID on,off,toggle" msgstr "\tTx RSID wlaczona, wylaczona, przelacz" #: src/misc/macroedit.cxx:180 msgid "\tRx RSID on,off,toggle" msgstr "\tRx RSID wlaczona, wylaczona, przelacz" #: src/misc/macroedit.cxx:181 msgid "\tTransmit |NN| successive RsID bursts" msgstr "" #: src/misc/macroedit.cxx:182 msgid "\t[Wait][Len](ms)" msgstr "\t[Czekaj][Len](ms)" #: src/misc/macroedit.cxx:185 msgid "\tCW QSK post-timing" msgstr "\tCW QSK post-czas" #: src/misc/macroedit.cxx:186 msgid "\tCW QSK pre-timing" msgstr "\tCW QSK pre-czas" #: src/misc/macroedit.cxx:187 msgid "\tCW rise time" msgstr "\tCzas narastania CW" #: src/misc/macroedit.cxx:188 #, fuzzy msgid "\tCW WPM:Farnsworth" msgstr "\tCW WPM" #: src/misc/macroedit.cxx:191 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:194 msgid "\tAFC on,off,toggle" msgstr "\tAFC wl,wyl,przelacz" #: src/misc/macroedit.cxx:195 msgid "\tLOCK on,off,toggle" msgstr "\tLOCK wlaczona, wylaczona, przelacz" #: src/misc/macroedit.cxx:196 msgid "\tRev on,off,toggle" msgstr "\tRev wÅ‚, wyÅ‚, przeÅ‚acz" #: src/misc/macroedit.cxx:199 msgid "\tchange macro defs file" msgstr "\tzmien plik definicji makro" #: src/misc/macroedit.cxx:200 #, fuzzy msgid "\tsave current macro file" msgstr "Zapisz plik makro" #: src/misc/macroedit.cxx:203 msgid "\tuntransmitted comment" msgstr "" #: src/misc/macroedit.cxx:206 msgid "\tmodem timing test internal string" msgstr "" #: src/misc/macroedit.cxx:207 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:208 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:211 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:212 #, fuzzy msgid "\tWAV file; spec' file" msgstr "\twstaw plik tekstowy" #: src/misc/macroedit.cxx:213 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:328 msgid "Text file to insert" msgstr "Wstaw plik tekstowy" #: src/misc/macroedit.cxx:336 #, fuzzy msgid "Test text file" msgstr "\twstaw plik tekstowy" #: src/misc/macroedit.cxx:344 #, fuzzy msgid "MFSK image file" msgstr "Zaladuj plik obrazu " #: src/misc/macroedit.cxx:351 msgid "Change to Macro file" msgstr "Zmien plik makro " #: src/misc/macroedit.cxx:361 msgid "Executable file to insert" msgstr "Wstaw plik wykonywalny" #: src/misc/macroedit.cxx:391 msgid "Macro Text" msgstr "Tekst makro" #: src/misc/macroedit.cxx:396 msgid "Select Tag" msgstr "Wybierz Tag" #: src/misc/macroedit.cxx:408 msgid "Macro Button Label" msgstr "Etykieta przycisku makro" #: src/misc/macroedit.cxx:416 msgid "Apply" msgstr "Zastosuj" #: src/misc/macroedit.cxx:443 msgid "Macro editor - " msgstr "Edytor makro - " #: src/misc/macros.cxx:2786 msgid "Open macro file" msgstr "Otwórz plik makro" #: src/misc/macros.cxx:2787 src/misc/macros.cxx:2825 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Plik definicji makro Fldigi\t*.mdf" #: src/misc/macros.cxx:2824 msgid "Save macro file" msgstr "Zapisz plik makro" #: src/misc/network.cxx:170 msgid "Aborted" msgstr "Przerwano" #: src/misc/network.cxx:170 msgid "Timed out" msgstr "limit czasu" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "" #: src/misc/newinstall.cxx:389 #, fuzzy msgid "Back" msgstr "Tlo" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "" #: src/misc/newinstall.cxx:522 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "" #: src/misc/newinstall.cxx:523 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" #: src/misc/newinstall.cxx:538 #, fuzzy msgid "Fldigi configuration wizard" msgstr "Konfiguracja" #: src/mfsk/mfsk-pic.cxx:142 src/mfsk/mfsk-pic.cxx:146 #: src/mfsk/mfsk-pic.cxx:305 src/mfsk/mfsk-pic.cxx:308 msgid "Time needed: " msgstr "Wymagany czas:" #: src/mfsk/mfsk-pic.cxx:175 msgid "Load image file" msgstr "Zaladuj plik obrazu " #: src/mfsk/mfsk-pic.cxx:316 msgid "Send image" msgstr "Wyslij obraz" #: src/mfsk/mfsk-pic.cxx:323 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "ZaÅ‚aduj lub upusc plik obrazu\n" "pliki (PNG, JPEG, BMP)" #: src/mfsk/mfsk-pic.cxx:327 msgid "Transfer speed, X1-normal" msgstr "Szybkosc transferu, X1 -normalna" #: src/mfsk/mfsk-pic.cxx:339 msgid "Load" msgstr "Laduj" #: src/waterfall/waterfall.cxx:1563 msgid "Waterfall / FFT / Scope" msgstr "Wodospad / FFT / Oscyloskop" #: src/waterfall/waterfall.cxx:1573 msgid "Upper signal level (dB)" msgstr "Górny poziom sygnalu (dB)" #: src/waterfall/waterfall.cxx:1584 msgid "Signal range (dB)" msgstr "Zakres sygnalu (dB)" #: src/waterfall/waterfall.cxx:1590 msgid "Change waterfall scale" msgstr "Zmiana skali wodospadu" #: src/waterfall/waterfall.cxx:1595 msgid "Slew display lower in frequency" msgstr "Wyswietl narastanie nizszych czÄ™stotliwosci" #: src/waterfall/waterfall.cxx:1600 msgid "Center display on signal" msgstr "Wyswietlacz centruj na sygnale" #: src/waterfall/waterfall.cxx:1605 msgid "Slew display higher in frequency" msgstr "Wyswietl narastanie wyzszych czÄ™stotliwosci" #: src/waterfall/waterfall.cxx:1610 msgid "Waterfall drop speed" msgstr "PrÄ™dkosc spadku wodospadu" #: src/waterfall/waterfall.cxx:1620 msgid "Adjust cursor frequency" msgstr "Ustaw kursor czÄ™stotliwosci" #: src/waterfall/waterfall.cxx:1625 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Centruj w pasmo przenoszenia\n" "Kliknij prawym przyciskiem myszy, aby cofnac" #: src/waterfall/waterfall.cxx:1631 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Tryb magazynu i czÄ™stotliwosci\n" "Kliknij prawym przyciskiem myszy na liscie" #: src/waterfall/waterfall.cxx:1641 msgid "Lock transmit frequency" msgstr "Blokowanie czÄ™stotliwosci nadajnika" #: src/waterfall/waterfall.cxx:1650 src/dialogs/confdialog.cxx:5706 msgid "Reverse" msgstr "Odwróc" #: src/waterfall/waterfall.cxx:1657 msgid "Transmit/Receive" msgstr "Nadawanie/Odbiór" #: src/waterfall/waterfall.cxx:2119 msgid "AFC range or BW" msgstr "Zakres AFC lub BW" #: src/waterfall/waterfall.cxx:2120 msgid "Signal search" msgstr "Szukaj sygnal" #: src/waterfall/waterfall.cxx:2121 msgid "Modem carrier" msgstr "Modem" #: src/waterfall/waterfall.cxx:2121 msgid "Scroll" msgstr "Przewin" #: src/rigcontrol/FreqControl.cxx:136 msgid "" "Enter frequency or change with\n" "Left/Right/Up/Down/Pg_Up/Pg_Down" msgstr "" "Wprowadz czÄ™stotliwosc lub zmien z\n" "listy." #: src/rigcontrol/rigsupport.cxx:469 msgid "Enter Xcvr Freq" msgstr "Wpisz xcvr Czest." #: src/rigcontrol/rigxml.cxx:946 msgid "Open rig xml file" msgstr "Otwórz rig plik xml" #: src/rigcontrol/rigxml.cxx:946 msgid "Fldigi rig xml definition file\t*.xml" msgstr "Fldigi rig plik xml definicji\t*.xml" #: src/soundcard/sound.cxx:149 msgid "" "Waveform Audio Format\t*.wav\n" "AU\t*.{au,snd}\n" msgstr "" "Waveform Audio Format\t*.wav\n" "AU\t*.{au.snd}\n" #: src/soundcard/sound.cxx:152 msgid "Free Lossless Audio Codec\t*.flac" msgstr "Darmowy bezstratny Audio Codec\t*.flac" #: src/soundcard/sound.cxx:158 src/soundcard/sound.cxx:160 msgid "Audio file" msgstr "Plik audio" #: src/soundcard/sound.cxx:306 msgid "Playback continuous loop?" msgstr "" #: src/spot/notify.cxx:191 msgid "My callsign de CALL" msgstr "Mój znak to STACJA" #: src/spot/notify.cxx:192 msgid "Station heard twice" msgstr "Stacje usÅ‚yszalem dwukrotnie" #: src/spot/notify.cxx:193 msgid "Custom text search" msgstr "Wyszukiwanie niestandardowe tekstu" #: src/spot/notify.cxx:194 msgid "RSID reception" msgstr "Odbiór RSID" #: src/spot/notify.cxx:202 msgid "Toggle" msgstr "Przelacz" #: src/spot/notify.cxx:204 src/spot/notify.cxx:516 msgid "Remove" msgstr "Kasuj" #: src/spot/notify.cxx:216 src/spot/notify.cxx:222 src/spot/notify.cxx:570 #: src/logbook/lgbook.cxx:548 src/logbook/lgbook.cxx:853 msgid "Continent" msgstr "Kontynent" #: src/spot/notify.cxx:217 src/spot/notify.cxx:223 src/logbook/lgbook.cxx:841 msgid "ITU zone" msgstr "Strefa ITU" #: src/spot/notify.cxx:218 src/spot/notify.cxx:224 src/logbook/lgbook.cxx:829 msgid "CQ zone" msgstr "Strefa CQ" #: src/spot/notify.cxx:219 src/spot/notify.cxx:225 msgid "All" msgstr "Wszystko" #: src/spot/notify.cxx:221 msgid "Deselect" msgstr "Odznacz" #: src/spot/notify.cxx:515 msgid "Add" msgstr "Dodaj" #: src/spot/notify.cxx:518 msgid "Test..." msgstr "Test..." #: src/spot/notify.cxx:521 src/widgets/FTextView.cxx:481 #: src/widgets/flinput2.cxx:48 msgid "Select All" msgstr "Wybierz wszystko" #: src/spot/notify.cxx:522 src/logbook/lgbook.cxx:403 #: src/logbook/lgbook.cxx:453 src/logbook/lgbook.cxx:1045 #: src/logbook/lgbook.cxx:1119 msgid "Clear All" msgstr "Czysc wszystko" #: src/spot/notify.cxx:1095 msgid "The regular expression field must not be empty." msgstr "Pole wyrazenia regularnego nie moze być puste." #: src/spot/notify.cxx:1101 msgid "The regular expression must be valid." msgstr "Wyrazenie regularne musi być wazne" #: src/spot/notify.cxx:1108 msgid "Please set your callsign first." msgstr "ProszÄ™ ustawić swój znak w pierwszej kolejnosci." #: src/spot/notify.cxx:1245 msgid "Run program" msgstr "Uruchom program" #: src/spot/notify.cxx:1278 msgid "" "Default test string is:\n" " \"" msgstr "" "CiÄ…g testu domyslnie jest:\n" " \"" #: src/spot/notify.cxx:1279 msgid "Enter test string or leave blank for default:" msgstr "Wpisz ciÄ…g testowy lub zostaw puste - domyslne:" #: src/spot/notify.cxx:1290 msgid "This event's regular expression is invalid." msgstr "Te zdarzenie jest wyrazeniem regularnym nieprawidlowym." #: src/spot/notify.cxx:1297 msgid "The test string did not match this event's search pattern." msgstr "CiÄ…g testu nie pasuje do tego wydarzenia wzorca wyszukiwania." #: src/spot/notify.cxx:1315 msgid "Available substrings" msgstr "DostÄ™pne podrzÄ™dne" #: src/spot/notify.cxx:1398 src/logbook/lgbook.cxx:1026 msgid "Frequency" msgstr "CzÄ™stotliwosc" #: src/spot/notify.cxx:1400 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1023 msgid "Callsign" msgstr "Znak stacji" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "Otwórz paletÄ™" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:126 msgid "Fldigi palette\t*.pal" msgstr "Paleta Fldigi\t*.pal" #: src/waterfall/colorbox.cxx:112 src/waterfall/colorbox.cxx:137 msgid "Palette: " msgstr "Paleta:" #: src/waterfall/colorbox.cxx:126 msgid "Save palette" msgstr "Zapisz paletÄ™" #: src/widgets/FTextRXTX.cxx:104 msgid "Look up call" msgstr "Poszukaj stacji" #: src/widgets/FTextRXTX.cxx:106 src/logbook/lgbook.cxx:463 #: src/logbook/lgbook.cxx:608 src/logbook/lgbook.cxx:1025 msgid "Name" msgstr "Imie" #: src/widgets/FTextRXTX.cxx:107 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:108 src/dialogs/confdialog.cxx:5298 #: src/logbook/lgbook.cxx:512 msgid "State" msgstr "Stan" #: src/widgets/FTextRXTX.cxx:109 src/logbook/lgbook.cxx:518 msgid "Province" msgstr "Prowincja" #: src/widgets/FTextRXTX.cxx:111 msgid "Locator" msgstr "Lokator" #: src/widgets/FTextRXTX.cxx:112 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:113 src/dialogs/confdialog.cxx:5304 #: src/logbook/lgbook.cxx:539 src/logbook/lgbook.cxx:924 #: src/logbook/lgbook.cxx:1111 msgid "Exchange In" msgstr "Wymiana odebrana" #: src/widgets/FTextRXTX.cxx:114 src/dialogs/confdialog.cxx:5229 msgid "Serial number" msgstr "Numer kontrolny" #: src/widgets/FTextRXTX.cxx:115 msgid "Insert marker" msgstr "Wstaw znacznik" #: src/widgets/FTextRXTX.cxx:123 msgid "Quick entry" msgstr "Szybki wpis" #: src/widgets/FTextRXTX.cxx:124 msgid "Scroll hints" msgstr "Przewijaj podpowiedzi" #: src/widgets/FTextRXTX.cxx:704 msgid " in " msgstr " w" #: src/widgets/FTextRXTX.cxx:706 msgid "Last QSO" msgstr "Ostatnie QSO" #: src/widgets/FTextRXTX.cxx:751 src/dialogs/confdialog.cxx:6624 msgid "Transmit" msgstr "Nadawaj" #: src/widgets/FTextRXTX.cxx:752 src/dialogs/confdialog.cxx:6499 #: src/dialogs/confdialog.cxx:7621 msgid "Receive" msgstr "Odbiór" #: src/widgets/FTextRXTX.cxx:753 msgid "Abort" msgstr "Przerwij" #: src/widgets/FTextRXTX.cxx:754 msgid "Send image..." msgstr "Wyslij obraz..." #: src/widgets/FTextView.cxx:292 msgid "Insert text" msgstr "Wstaw tekst" #: src/widgets/FTextView.cxx:351 msgid "Save text as" msgstr "Zapisz tekst jako" #: src/widgets/FTextView.cxx:479 src/widgets/FTextView.cxx:643 #: src/widgets/flinput2.cxx:44 msgid "Copy" msgstr "Kopiuj" #: src/widgets/FTextView.cxx:482 msgid "Save as..." msgstr "Zapisz jako..." #: src/widgets/FTextView.cxx:483 src/widgets/FTextView.cxx:647 msgid "Word wrap" msgstr "Zawijanie wierszy" #: src/widgets/FTextView.cxx:642 src/widgets/flinput2.cxx:43 msgid "Cut" msgstr "Wytnij" #: src/widgets/FTextView.cxx:644 src/widgets/flinput2.cxx:45 msgid "Paste" msgstr "Wklej" #: src/widgets/FTextView.cxx:646 msgid "Insert file..." msgstr "Wstaw plik..." #: src/widgets/flinput2.cxx:42 msgid "Undo" msgstr "Cofnij" #: src/widgets/flinput2.cxx:46 src/logbook/lgbook.cxx:974 msgid "Delete" msgstr "Kasuj" #: src/dialogs/confdialog.cxx:4928 msgid "Fldigi configuration" msgstr "Konfiguracja" #: src/dialogs/confdialog.cxx:4938 src/dialogs/confdialog.cxx:10039 msgid "Operator information" msgstr "Operator - informacje" #: src/dialogs/confdialog.cxx:4941 msgid "Station" msgstr "Stacja" #: src/dialogs/confdialog.cxx:4944 msgid "Callsign:" msgstr "Znak stacji:" #: src/dialogs/confdialog.cxx:4945 msgid "Operators callsign" msgstr "Operatorzy stacji" #: src/dialogs/confdialog.cxx:4958 msgid "Name:" msgstr "ImiÄ™:" #: src/dialogs/confdialog.cxx:4959 msgid "Operators name" msgstr "Imiona operatorów" #: src/dialogs/confdialog.cxx:4972 msgid "QTH:" msgstr "QTH:" #: src/dialogs/confdialog.cxx:4973 msgid "Operators QTH" msgstr "QTH operatorów" #: src/dialogs/confdialog.cxx:4986 msgid "Locator:" msgstr "Lokator:" #: src/dialogs/confdialog.cxx:4987 msgid "Maidenhead locator as in EM64qv" msgstr "Lokator na przykÅ‚ad JO93xq" #: src/dialogs/confdialog.cxx:5002 msgid "Antenna:" msgstr "Antena:" #: src/dialogs/confdialog.cxx:5003 msgid "Short description of antenna" msgstr "Krótki opis anteny" #: src/dialogs/confdialog.cxx:5016 msgid "Test Signal - Do NOT use with transmitter" msgstr "Sygnal testowy - nie uzywac z nadajnikiem" #: src/dialogs/confdialog.cxx:5020 msgid "Noise on" msgstr "Poziom halasu" #: src/dialogs/confdialog.cxx:5026 msgid "dB" msgstr "dB" #: src/dialogs/confdialog.cxx:5049 msgid "UI" msgstr "IU" #: src/dialogs/confdialog.cxx:5053 msgid "Browser" msgstr "PrzeglÄ…darka" #: src/dialogs/confdialog.cxx:5056 msgid "Channels, first channel starts at waterfall lower limit" msgstr "KanaÅ‚y, pierwszy kanal startuje w dolnej granicy wodospadu" #: src/dialogs/confdialog.cxx:5057 msgid "Change # of psk viewer channels" msgstr "Zmiana # podglÄ…du kanalów PSK" #: src/dialogs/confdialog.cxx:5074 msgid "Inactivity timeout" msgstr "Limit czasu nieaktywnosci" #: src/dialogs/confdialog.cxx:5075 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Skasuj tekst kanalu po\n" "# sekund bezczynnosci" #: src/dialogs/confdialog.cxx:5091 msgid "Channel label" msgstr "Etykieta kanalu" #: src/dialogs/confdialog.cxx:5092 msgid "Appearance of label on each channel" msgstr "WyglÄ…d etykiety na kazdym kanale" #: src/dialogs/confdialog.cxx:5103 msgid "Audio frequency" msgstr "Czestotliwosc audio" #: src/dialogs/confdialog.cxx:5104 msgid "Radio frequency" msgstr "Czestotliwosc RF" #: src/dialogs/confdialog.cxx:5104 msgid "Channel number" msgstr "Numer kanalu" #: src/dialogs/confdialog.cxx:5109 src/dialogs/confdialog.cxx:6274 msgid "Font..." msgstr "Czcionka" #: src/dialogs/confdialog.cxx:5110 msgid "select browser font" msgstr "Wybierz czcionkÄ™ przegladarki" #: src/dialogs/confdialog.cxx:5113 msgid "Fixed Intervals" msgstr "W odstÄ™pach czasu" #: src/dialogs/confdialog.cxx:5114 msgid "Force channel spacing to even 100 Hz increments" msgstr "Wymus rozstaw kanalu do wzrostu nawet 100 Hz " #: src/dialogs/confdialog.cxx:5121 msgid "Continuous scrolling" msgstr "CiÄ…gle przewijanie" #: src/dialogs/confdialog.cxx:5122 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" "Wl - Styl marquee\n" "Wyl - Wyczysc & restart" #: src/dialogs/confdialog.cxx:5127 msgid "Lowest freq on bottom of viewer" msgstr "Najnizsza czÄ™stotliwosc na dole przeglÄ…darki" #: src/dialogs/confdialog.cxx:5128 msgid "Change positions of low to high channels" msgstr "Zmiana pozycji z niskiego do wysokiego kanalu" #: src/dialogs/confdialog.cxx:5133 msgid "Play back history when active channel selected" msgstr "Odtwarzanie historii, kiedy wybrany aktywny kanal " #: src/dialogs/confdialog.cxx:5134 msgid "Audio stream history decoded on selected signal" msgstr "Historia strumienia audio zdekodowanego na wybranym sygnale" #: src/dialogs/confdialog.cxx:5139 #, fuzzy msgid "Detection Level" msgstr "Kolory poziomu detekcji" #: src/dialogs/confdialog.cxx:5141 msgid "Backgnd" msgstr "Tlo" #: src/dialogs/confdialog.cxx:5142 msgid "Background color of signal viewer squelch control" msgstr "Kolor tla podglÄ…du blokady szumów" #: src/dialogs/confdialog.cxx:5147 msgid "Button" msgstr "Przycisk" #: src/dialogs/confdialog.cxx:5148 msgid "Slider hilite color of signal viewer squelch control" msgstr "Suwak HiLite kolor podglÄ…du blokady szumów" #: src/dialogs/confdialog.cxx:5155 #, fuzzy msgid "Browser Line Colors" msgstr "kolor systemowy" #: src/dialogs/confdialog.cxx:5157 msgid "HiLite 1" msgstr "" #: src/dialogs/confdialog.cxx:5158 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "" #: src/dialogs/confdialog.cxx:5163 msgid "HiLite 2" msgstr "" #: src/dialogs/confdialog.cxx:5164 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "" #: src/dialogs/confdialog.cxx:5169 #, fuzzy msgid "Even" msgstr "Wydarzenie" #: src/dialogs/confdialog.cxx:5170 #, fuzzy msgid "Even lines" msgstr "Centruj linie" #: src/dialogs/confdialog.cxx:5175 #, fuzzy msgid "Odd" msgstr "Dodaj" #: src/dialogs/confdialog.cxx:5176 msgid "Odd lines" msgstr "" #: src/dialogs/confdialog.cxx:5182 #, fuzzy msgid "Select line" msgstr "Wybierz wszystko" #: src/dialogs/confdialog.cxx:5195 msgid "Exchanges" msgstr "Wymiana" #: src/dialogs/confdialog.cxx:5198 msgid "Send:" msgstr "Wyslij:" #: src/dialogs/confdialog.cxx:5200 src/logbook/lgbook.cxx:542 #: src/logbook/lgbook.cxx:900 src/logbook/lgbook.cxx:1115 msgid "Exchange Out" msgstr "Wymiana wyslana" #: src/dialogs/confdialog.cxx:5201 msgid "free form exchange" msgstr "Swobodna forma wymiany" #: src/dialogs/confdialog.cxx:5215 msgid "RST always 599" msgstr "RST zawsze 599" #: src/dialogs/confdialog.cxx:5216 msgid "Force RST in/out to 599" msgstr "Wymuszaj RST odebr/wysl na 599" #: src/dialogs/confdialog.cxx:5221 msgid "Send CW cut numbers" msgstr "Wyslij krótkie CW (5NN)" #: src/dialogs/confdialog.cxx:5222 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:5232 msgid "Use leading zeros" msgstr "Uzyj zer" #: src/dialogs/confdialog.cxx:5233 msgid "Insert leading zeros into Xmtd serial number" msgstr "Wstaw zero w nadawanym numerze kontrolnym" #: src/dialogs/confdialog.cxx:5238 msgid "Start" msgstr "Start" #: src/dialogs/confdialog.cxx:5239 msgid "Starting number" msgstr "Numer startowy" #: src/dialogs/confdialog.cxx:5254 msgid "Digits" msgstr "Cyfry" #: src/dialogs/confdialog.cxx:5255 msgid "Number of digits in serial number" msgstr "Liczba cyfr w numerze kontrolnym" #: src/dialogs/confdialog.cxx:5271 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Resetuj" #: src/dialogs/confdialog.cxx:5272 msgid "Initialize the QSO logging fields" msgstr "Inicjalizacja pól logowania QSO" #: src/dialogs/confdialog.cxx:5277 msgid "Duplicate check, CALL plus" msgstr "Sprawdzaj duplikaty, Stacja plus" #: src/dialogs/confdialog.cxx:5280 msgid "On/Off" msgstr "Wl/Wyl" #: src/dialogs/confdialog.cxx:5281 msgid "Check for duplicates" msgstr "Szukaj duplikatów" #: src/dialogs/confdialog.cxx:5286 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:471 msgid "Band" msgstr "Pasmo" #: src/dialogs/confdialog.cxx:5287 msgid "Bands must match" msgstr "Pasma muszÄ… byc zgodne" #: src/dialogs/confdialog.cxx:5292 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:474 src/logbook/lgbook.cxx:682 #: src/logbook/lgbook.cxx:1028 src/logbook/lgbook.cxx:1083 msgid "Mode" msgstr "Emisja" #: src/dialogs/confdialog.cxx:5293 msgid "Mode must match" msgstr "Tryby muszÄ… byc zgodne" #: src/dialogs/confdialog.cxx:5299 msgid "State must match" msgstr "Panstwo musi siÄ™ zgadzac" #: src/dialogs/confdialog.cxx:5305 msgid "free form 1 must match" msgstr "wolne formy 1 muszÄ… byc zgodne" #: src/dialogs/confdialog.cxx:5310 msgid "Time span over" msgstr "Okres ponad" #: src/dialogs/confdialog.cxx:5311 msgid "QSO must not occur within a time period of" msgstr "QSO nie moze nastapic w okresie czasu" #: src/dialogs/confdialog.cxx:5316 msgid "minutes" msgstr "minut" #: src/dialogs/confdialog.cxx:5317 msgid "Enter time span in minutes" msgstr "Wpisz zakres czasu w minutach" #: src/dialogs/confdialog.cxx:5333 msgid "Dup Color" msgstr "Kolor duplikatu" #: src/dialogs/confdialog.cxx:5334 msgid "Left click to select dup color" msgstr "Kliknij lewym przyciskiem myszy, aby wybrac kolor duplikatu" #: src/dialogs/confdialog.cxx:5346 src/dialogs/confdialog.cxx:6497 #: src/dialogs/confdialog.cxx:7508 src/dialogs/confdialog.cxx:9403 msgid "General" msgstr "Ogólne" #: src/dialogs/confdialog.cxx:5350 msgid "Show tooltips" msgstr "Pokaz podpowiedzi" #: src/dialogs/confdialog.cxx:5351 msgid "Enable / disable tooltips" msgstr "Aktywuj / deaktywuj podpowiedzi" #: src/dialogs/confdialog.cxx:5357 msgid "Show menu icons" msgstr "Pokaz ikony menu" #: src/dialogs/confdialog.cxx:5358 msgid "Enable / disable icons on menus" msgstr "Aktywuj / deaktywuj ikony w menu" #: src/dialogs/confdialog.cxx:5363 msgid "UI scheme" msgstr "UI schemat" #: src/dialogs/confdialog.cxx:5364 msgid "Change application look and feel" msgstr "Zmien wyglÄ…d aplikacji" #: src/dialogs/confdialog.cxx:5382 msgid "Visible modes" msgstr "Widoczne tryby" #: src/dialogs/confdialog.cxx:5383 msgid "Select modes for menu access" msgstr "Wybierz tryby dostÄ™pu do menu" #: src/dialogs/confdialog.cxx:5386 msgid "UI language" msgstr "UI jÄ™zyk" #: src/dialogs/confdialog.cxx:5387 src/dialogs/confdialog.cxx:6403 msgid "Changes take effect on next program startup" msgstr "Zmiany sÄ… uwzglÄ™dniane przy nastÄ™pnym uruchomieniu programu" #: src/dialogs/confdialog.cxx:5406 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Drukuj CW / RTTY / THROB / CONTESTIA malymi literami" #: src/dialogs/confdialog.cxx:5416 #, fuzzy msgid "Transmit all text in lower case" msgstr "Moc nadawania" #: src/dialogs/confdialog.cxx:5423 msgid "Exit prompts" msgstr "Zamknij podpowiedzi " #: src/dialogs/confdialog.cxx:5426 msgid "Prompt to save Configuration" msgstr "Monituj o zapisanie konfiguracji" #: src/dialogs/confdialog.cxx:5431 msgid "Prompt to save macro file" msgstr "Monituj o zapisanie pliku makro" #: src/dialogs/confdialog.cxx:5432 src/dialogs/confdialog.cxx:5689 msgid "Write current macro set on program exit" msgstr "Napisz aktualny zestaw makro na wyjsciu programu" #: src/dialogs/confdialog.cxx:5437 msgid "Prompt to save log" msgstr "Monituj o zapisanie dziennika" #: src/dialogs/confdialog.cxx:5438 src/dialogs/confdialog.cxx:5491 msgid "Bug me about saving log entries" msgstr "Info o bledach wpisu dziennika" #: src/dialogs/confdialog.cxx:5443 msgid "" "Exit prompts active only when File/Exit menu item selected.\n" "Not active if window decoration close button pressed." msgstr "" "Wyjscie wyswietlane tylko wtedy, gdy aktywny Plik/Wyjscie z menu wybrano.\n" "Nie jest aktywne jesli dekoracja przycisku okna wcisnieta." #: src/dialogs/confdialog.cxx:5448 #, fuzzy msgid "Confirm exit" msgstr "Zastosuj" #: src/dialogs/confdialog.cxx:5455 msgid "Check for updates" msgstr "Sprawdz uaktualnienie" #: src/dialogs/confdialog.cxx:5458 msgid "Check for updates when starting program" msgstr "Sprawdz aktualizacje podczas uruchamiania programu" #: src/dialogs/confdialog.cxx:5467 msgid "Logging" msgstr "Logowanie" #: src/dialogs/confdialog.cxx:5469 msgid "Client/Server Logbook" msgstr "Klient/Serwer Logbook" #: src/dialogs/confdialog.cxx:5472 msgid "Address:" msgstr "Adres:" #: src/dialogs/confdialog.cxx:5473 msgid "Enter URL address of server" msgstr "Wpisz adres URL serwera" #: src/dialogs/confdialog.cxx:5477 src/dialogs/confdialog.cxx:9460 msgid "Port:" msgstr "Port:" #: src/dialogs/confdialog.cxx:5478 msgid "Enter Port # assigned to server" msgstr "Wpisz Port # przypisany do serwera" #: src/dialogs/confdialog.cxx:5482 msgid "Reconnect" msgstr "Podlacz ponownie" #: src/dialogs/confdialog.cxx:5487 msgid "QSO logging" msgstr "Logowanie QSO " #: src/dialogs/confdialog.cxx:5490 msgid "Prompt to save log on exit" msgstr "Monituj o zapisanie dziennika na wyjsciu" #: src/dialogs/confdialog.cxx:5496 msgid "Clear on save" msgstr "Wyczysc przy zapisywaniu" #: src/dialogs/confdialog.cxx:5497 msgid "Clear log entries after saving or using macro " msgstr "Zeruj wpisy po zapisaniu lub za pomocÄ… makra " #: src/dialogs/confdialog.cxx:5502 msgid "Convert callsign to upper case" msgstr "Konwertuj znak stacji na wielkie litery" #: src/dialogs/confdialog.cxx:5503 msgid "Force callsign field to UPPERCASE" msgstr "Wymuszaj wielkie litery w polu znak stacji" #: src/dialogs/confdialog.cxx:5508 msgid "Auto-fill Country and Azimuth" msgstr "Automatycznie wstaw Kraj i Azymut" #: src/dialogs/confdialog.cxx:5509 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "WypeÅ‚nij Kraj / azymut za pomocÄ… info cty.dat" #: src/dialogs/confdialog.cxx:5514 msgid "Sort by Date/Time OFF" msgstr "Sortuj wedÅ‚ug Daty/czasu zakonczenia" #: src/dialogs/confdialog.cxx:5515 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" "Sortuj wedÅ‚ug daty i czasu zak. - efekt wszystkie ADIF/raporty Cabrillo" #: src/dialogs/confdialog.cxx:5520 msgid "Date time ON == OFF" msgstr "Data czas start == koniec" #: src/dialogs/confdialog.cxx:5521 msgid "Force date/time ON == date/time OFF" msgstr "Ustaw data/czas startu == data/czas zakonczenia" #: src/dialogs/confdialog.cxx:5526 msgid "Default RST in to 599" msgstr "RST domyslny to 599" #: src/dialogs/confdialog.cxx:5527 msgid "Clear log controls sets RST in to 599" msgstr "Wyczysc kontrole dziennika ustaw RST na 599" #: src/dialogs/confdialog.cxx:5532 msgid "Default RST out to 599" msgstr "Domyslnie RST na 599" #: src/dialogs/confdialog.cxx:5533 msgid "Clear log controls sets RST out to 599" msgstr "Wyczysc log i ustaw RST na 599" #: src/dialogs/confdialog.cxx:5538 msgid "cty.dat pathname" msgstr "sciezka cty.dat" #: src/dialogs/confdialog.cxx:5539 msgid "Enter full path-filename for cty.dat" msgstr "Wpisz peÅ‚nÄ… sciezkÄ™, nazwa pliku cty.dat" #: src/dialogs/confdialog.cxx:5552 msgid "Browse" msgstr "PrzeglÄ…daj" #: src/dialogs/confdialog.cxx:5553 msgid "Locate cty.dat file" msgstr "Zlokalizuj plik cty.dat" #: src/dialogs/confdialog.cxx:5556 src/dialogs/confdialog.cxx:5914 #: src/dialogs/confdialog.cxx:5934 src/dialogs/confdialog.cxx:6648 msgid "Default" msgstr "Domyslnie" #: src/dialogs/confdialog.cxx:5557 msgid "Restore cty.dat default folder" msgstr "Przywróc domyslny folder cty.dat" #: src/dialogs/confdialog.cxx:5560 msgid "Reload" msgstr "Przeladuj" #: src/dialogs/confdialog.cxx:5561 msgid "Reload cty.dat" msgstr "Przeladuj cty.dat" #: src/dialogs/confdialog.cxx:5564 msgid "Transmit Power" msgstr "Moc TX" #: src/dialogs/confdialog.cxx:5565 msgid "Tx power used for logbook entries" msgstr "Moc nadajnika wykorzystywana do zapisu w logu" #: src/dialogs/confdialog.cxx:5581 msgid "Rx Text Capture" msgstr "Przechwytywanie tekstu Rx" #: src/dialogs/confdialog.cxx:5584 msgid "Double-click to capture" msgstr "Kliknij dwukrotnie, aby uchwycic" #: src/dialogs/confdialog.cxx:5585 msgid "Enable if you cannot use the middle mouse button" msgstr "Wlacz gdy nie mozesz uzyc srodkowego przycisku myszy" #: src/dialogs/confdialog.cxx:5590 msgid "callsign tooltips in received text" msgstr "Znak podpowiedzi w otrzymanym tekscie" #: src/dialogs/confdialog.cxx:5591 msgid "Popup info after a 2 second hover on a callsign" msgstr "Informacje Popup po 2 sek po najechaniu na znak" #: src/dialogs/confdialog.cxx:5596 msgid "Word delimiters" msgstr "SÅ‚owa ograniczniki " #: src/dialogs/confdialog.cxx:5597 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" "RX tekst QSO wprowadzanie danych jest ograniczone przez znaki nie-sÅ‚owa\n" "zdefiniowane tutaj. Tabulator i nowa linia sÄ… automatycznie dolaczane" #: src/dialogs/confdialog.cxx:5621 msgid "Mouse wheel active on macro buttons" msgstr "Kółko myszy dziaÅ‚a na przyciski makro " #: src/dialogs/confdialog.cxx:5622 msgid "enable mouse wheel control of macro bar" msgstr "wlacz sterowanie kółkiem myszy na pasku makro" #: src/dialogs/confdialog.cxx:5629 msgid "Number and position of macro bars" msgstr "Liczba i pozycja pasków makro" #: src/dialogs/confdialog.cxx:5632 msgid "One bar (above waterfall)" msgstr "Jeden pasek ( powyzej wodospadu )" #: src/dialogs/confdialog.cxx:5637 msgid "One bar (below waterfall)" msgstr "Jeden pasek ( ponizej wodospadu )" #: src/dialogs/confdialog.cxx:5642 msgid "Two bars (scheme 1)" msgstr "Dwa paski (Schemat 1)" #: src/dialogs/confdialog.cxx:5647 msgid "Two bars (scheme 2)" msgstr "Dwa paski (Schemat 2)" #: src/dialogs/confdialog.cxx:5652 msgid "Two bars (scheme 3)" msgstr "Dwa paski (Schemat 3)" #: src/dialogs/confdialog.cxx:5657 msgid "Two bars (scheme 4)" msgstr "Dwa paski (Schemat 4)" #: src/dialogs/confdialog.cxx:5662 msgid "Two bars (scheme 5)" msgstr "Dwa paski (Schemat 5)" #: src/dialogs/confdialog.cxx:5667 msgid "Two bars (scheme 6)" msgstr "Dwa paski (Schemat 6)" #: src/dialogs/confdialog.cxx:5676 msgid "Load last used macro file on startup" msgstr "ZaÅ‚aduj na starcie ostatnio otworzone pliki makro " #: src/dialogs/confdialog.cxx:5677 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "ON - wykorzystaj ostatni zestaw makr\n" "OFF - uzywaj zestawu domyslnego" #: src/dialogs/confdialog.cxx:5682 msgid "Display macro filename on startup" msgstr "Wyswietl nazwÄ™ makra przy starcie" #: src/dialogs/confdialog.cxx:5683 msgid "The filename is written to the RX text area" msgstr "Nazwy pliku sÄ… zapisywane w obszarze tekstu RX" #: src/dialogs/confdialog.cxx:5688 msgid "Prompt to save macro file when closing" msgstr "Monituj o zapisanie pliku przy zamykaniu makro" #: src/dialogs/confdialog.cxx:5698 msgid "WF Ctrls" msgstr "Wodospad" #: src/dialogs/confdialog.cxx:5702 msgid "Enable check box to show each respective operator control" msgstr "Wlacz pole wyboru, by pokazac kazda poszczególna kontrolÄ™ operatora" #: src/dialogs/confdialog.cxx:5712 msgid "WF Magnification" msgstr "PowiÄ™kszenie wodospadu" #: src/dialogs/confdialog.cxx:5718 msgid "WF carrier" msgstr "Nosnik wodospadu" #: src/dialogs/confdialog.cxx:5724 msgid "WF Shift Controls" msgstr "Kontrola przesuniÄ™cia" #: src/dialogs/confdialog.cxx:5730 msgid "WF ref level" msgstr "Poziom referencji wodospadu" #: src/dialogs/confdialog.cxx:5736 msgid "WF drop rate" msgstr "WF wskaznik transmisji " #: src/dialogs/confdialog.cxx:5742 msgid "WF amp span" msgstr "Amplituda wodospadu" #: src/dialogs/confdialog.cxx:5748 msgid "WF Store" msgstr "Zapis Wodospadu" #: src/dialogs/confdialog.cxx:5754 msgid "WF mode" msgstr "Wybór trybu wodospadu" #: src/dialogs/confdialog.cxx:5760 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:5766 msgid "XMT lock" msgstr "Blokada Tx" #: src/dialogs/confdialog.cxx:5772 msgid "Enable all" msgstr "Aktywuj" #: src/dialogs/confdialog.cxx:5775 msgid "Disable all" msgstr "Deaktywuj" #: src/dialogs/confdialog.cxx:5782 #, fuzzy msgid "Colors/Fonts" msgstr "Kolory && Czcionki" #: src/dialogs/confdialog.cxx:5785 msgid "Rx/Tx" msgstr "Rx/Tx" #: src/dialogs/confdialog.cxx:5786 #, fuzzy msgid "Rx/Tx Character set" msgstr "Wybierz czcionkÄ™ rastra TX " #: src/dialogs/confdialog.cxx:5787 #, fuzzy msgid "Select Rx/Tx Character Set" msgstr "Wybierz czcionkÄ™ rastra TX " #: src/dialogs/confdialog.cxx:5807 msgid "Rx bkgnd" msgstr "TÅ‚o Rx" #: src/dialogs/confdialog.cxx:5810 msgid "Tx bkgnd" msgstr "TÅ‚o Tx" #: src/dialogs/confdialog.cxx:5819 msgid "Rx font" msgstr "Czcionka Rx" #: src/dialogs/confdialog.cxx:5822 msgid "Tx font" msgstr "Czcionka Tx" #: src/dialogs/confdialog.cxx:5825 msgid "Text Highlighting" msgstr "" #: src/dialogs/confdialog.cxx:5828 msgid "XMIT" msgstr "XMIT" #: src/dialogs/confdialog.cxx:5829 msgid "Sent chars in Rx/Tx pane" msgstr "Wyslane znaków w panelu Rx/Tx" #: src/dialogs/confdialog.cxx:5834 msgid "CTRL" msgstr "CTRL" #: src/dialogs/confdialog.cxx:5835 msgid "Control chars in Rx/Tx pane" msgstr "Znaki kontrolne w panelu Rx/Tx " #: src/dialogs/confdialog.cxx:5840 msgid "SKIP" msgstr "OPUSC" #: src/dialogs/confdialog.cxx:5841 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "PominiÄ™te znaki w panelu Tx\n" "(Tx wl./wyl. w CW)" #: src/dialogs/confdialog.cxx:5846 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:5847 msgid "Alternate character color in Rx panelr" msgstr "Alternatywny kolor znaków w panelu Rx " #: src/dialogs/confdialog.cxx:5852 msgid "SEL" msgstr "WYB" #: src/dialogs/confdialog.cxx:5853 msgid "Selection background color in Rx Tx panels" msgstr "Wybór koloru tla w panelach Tx/ Rx" #: src/dialogs/confdialog.cxx:5858 src/dialogs/confdialog.cxx:5981 msgid "System" msgstr "System" #: src/dialogs/confdialog.cxx:5861 src/dialogs/confdialog.cxx:5971 #: src/logbook/lgbook.cxx:563 msgid "Defaults" msgstr "Domyslny" #: src/dialogs/confdialog.cxx:5868 #, fuzzy msgid "Frq Disp" msgstr "Ekran czÄ™stotl" #: src/dialogs/confdialog.cxx:5872 msgid "14070.150" msgstr "14070.150" #: src/dialogs/confdialog.cxx:5881 src/dialogs/confdialog.cxx:5911 #: src/dialogs/confdialog.cxx:5931 msgid "Font" msgstr "Czcionka:" #: src/dialogs/confdialog.cxx:5884 src/dialogs/confdialog.cxx:5908 #: src/dialogs/confdialog.cxx:5928 msgid "Bg Color" msgstr "Kolor tla" #: src/dialogs/confdialog.cxx:5887 msgid "Digit Color" msgstr "Kolor cyfr" #: src/dialogs/confdialog.cxx:5890 msgid "Sys Colors" msgstr "kolor systemowy" #: src/dialogs/confdialog.cxx:5897 #, fuzzy msgid "Log" msgstr "Niski" #: src/dialogs/confdialog.cxx:5899 msgid "Logging Panel Controls" msgstr "Panel kontrolny Logu" #: src/dialogs/confdialog.cxx:5919 #, fuzzy msgid "Logbook Dialog" msgstr "Logbook" #: src/dialogs/confdialog.cxx:5941 msgid "F_keys" msgstr "F_klucz" #: src/dialogs/confdialog.cxx:5943 msgid "Use colored buttons" msgstr "Stosuj kolorowe przyciski" #: src/dialogs/confdialog.cxx:5948 msgid "Group 1" msgstr "Grupa 1" #: src/dialogs/confdialog.cxx:5949 msgid "Background color for Function key group 1" msgstr "Kolor tla dla klawiszy funkcyjnych grupy 1" #: src/dialogs/confdialog.cxx:5954 msgid "Group 2" msgstr "Grupa 2" #: src/dialogs/confdialog.cxx:5955 msgid "Background color for Function key group 2" msgstr "Kolor tla dla klawiszy funkcyjnych grupy 2" #: src/dialogs/confdialog.cxx:5960 msgid "Group 3" msgstr "Grupa 3" #: src/dialogs/confdialog.cxx:5961 msgid "Background color for Function key group 3" msgstr "Kolor tla dla klawiszy funkcyjnych grupy 3" #: src/dialogs/confdialog.cxx:5966 msgid "Label text" msgstr "tekst etykiety" #: src/dialogs/confdialog.cxx:5976 msgid "Tabs" msgstr "Karty" #: src/dialogs/confdialog.cxx:5978 msgid "Tab Color" msgstr "Kolor kart" #: src/dialogs/confdialog.cxx:5986 msgid "Buttons" msgstr "Przyciski" #: src/dialogs/confdialog.cxx:5988 msgid "Spot" msgstr "Spot" #: src/dialogs/confdialog.cxx:5991 msgid "RxID" msgstr "RxID" #: src/dialogs/confdialog.cxx:5994 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:5997 msgid "Tune" msgstr "Strojenie" #: src/dialogs/confdialog.cxx:6000 msgid "Lk" msgstr "Blokuj Tx" #: src/dialogs/confdialog.cxx:6003 msgid "Rev" msgstr "Odebr" #: src/dialogs/confdialog.cxx:6006 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:6009 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:6012 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:6015 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:6061 msgid "Lighted button enabled colors" msgstr "Aktywne przyciski podswietlane kolorem" #: src/dialogs/confdialog.cxx:6066 msgid "SigLvl" msgstr "SigLvl" #: src/dialogs/confdialog.cxx:6068 src/dialogs/confdialog.cxx:9023 msgid "Low" msgstr "Niski" #: src/dialogs/confdialog.cxx:6076 src/dialogs/confdialog.cxx:9023 msgid "High" msgstr "Wysoki" #: src/dialogs/confdialog.cxx:6084 msgid "Normal" msgstr "Normalny" #: src/dialogs/confdialog.cxx:6092 msgid "Over" msgstr "Wyzszy" #: src/dialogs/confdialog.cxx:6100 msgid "Signal Level Colors" msgstr "Kolor Poziomu SygnaÅ‚u" #: src/dialogs/confdialog.cxx:6117 msgid "Display" msgstr "Wyswietl" #: src/dialogs/confdialog.cxx:6118 msgid "Colors and cursors" msgstr "Kolor i kursory" #: src/dialogs/confdialog.cxx:6121 msgid "aa" msgstr "aa" #: src/dialogs/confdialog.cxx:6136 src/dialogs/confdialog.cxx:6140 #: src/dialogs/confdialog.cxx:6144 src/dialogs/confdialog.cxx:6148 #: src/dialogs/confdialog.cxx:6152 src/dialogs/confdialog.cxx:6156 #: src/dialogs/confdialog.cxx:6160 src/dialogs/confdialog.cxx:6164 #: src/dialogs/confdialog.cxx:6168 src/dialogs/confdialog.cxx:6189 #: src/dialogs/confdialog.cxx:6213 src/dialogs/confdialog.cxx:6237 #: src/dialogs/confdialog.cxx:6255 msgid "Change color" msgstr "Zmien kolor" #: src/dialogs/confdialog.cxx:6171 msgid "Load..." msgstr "Laduj..." #: src/dialogs/confdialog.cxx:6172 msgid "Load a new palette" msgstr "ZaÅ‚aduj nowÄ… paletÄ™" #: src/dialogs/confdialog.cxx:6175 msgid "Save..." msgstr "Zapisz..." #: src/dialogs/confdialog.cxx:6176 msgid "Save this palette" msgstr "Zapisz paletÄ™" #: src/dialogs/confdialog.cxx:6179 src/dialogs/confdialog.cxx:7315 #: src/dialogs/confdialog.cxx:7411 msgid "Bandwidth" msgstr "Przepustowosc" #: src/dialogs/confdialog.cxx:6182 src/dialogs/confdialog.cxx:6206 #: src/dialogs/confdialog.cxx:6230 msgid "ON" msgstr "WÅ" #: src/dialogs/confdialog.cxx:6183 msgid "Show cursor with bandwidth lines" msgstr "Pokazuj kursor z liniami szerokosci pasma " #: src/dialogs/confdialog.cxx:6188 src/dialogs/confdialog.cxx:6212 #: src/dialogs/confdialog.cxx:6236 src/dialogs/confdialog.cxx:6254 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "Kolor" #: src/dialogs/confdialog.cxx:6195 src/dialogs/confdialog.cxx:6219 #: src/dialogs/confdialog.cxx:6243 msgid "Wide" msgstr "Szeroko" #: src/dialogs/confdialog.cxx:6196 src/dialogs/confdialog.cxx:6220 #: src/dialogs/confdialog.cxx:6231 src/dialogs/confdialog.cxx:6244 msgid "Show bandwidth tracks on waterfall" msgstr "Pokazuj sciezki przepustowosci na wodospadzie" #: src/dialogs/confdialog.cxx:6203 msgid "Center line" msgstr "Centruj linie" #: src/dialogs/confdialog.cxx:6207 msgid "Show cursor with center line" msgstr "Pokaz kursor z linia srodkowa" #: src/dialogs/confdialog.cxx:6227 msgid "Signal tracks" msgstr "Sciezki sygnaÅ‚u" #: src/dialogs/confdialog.cxx:6251 msgid "Notch" msgstr "Notch" #: src/dialogs/confdialog.cxx:6265 msgid "Frequency scale" msgstr "Skala czÄ™stotliwosci" #: src/dialogs/confdialog.cxx:6268 msgid "Always show audio frequencies" msgstr "Zawsze pokazuj czÄ™stotliwosc audio" #: src/dialogs/confdialog.cxx:6269 msgid "Audio or RF frequencies on waterfall scale" msgstr "Audio lub RF czÄ™stotliwosc na skali wodospadu" #: src/dialogs/confdialog.cxx:6275 msgid "Select waterfall scale font" msgstr "Wybierz czcionkÄ™ skali wodospadu" #: src/dialogs/confdialog.cxx:6280 msgid "Transmit signal" msgstr "Transmitowany sygnal" #: src/dialogs/confdialog.cxx:6283 msgid "Monitor transmitted signal" msgstr "Monitoruj transmitowany sygnal" #: src/dialogs/confdialog.cxx:6284 msgid "Show transmit signal on waterfall" msgstr "Pokaz sygnaÅ‚ nadawania na wodospadzie" #: src/dialogs/confdialog.cxx:6289 msgid "Signal level" msgstr "Poziom sygnalu" #: src/dialogs/confdialog.cxx:6290 msgid "Set level for good viewing" msgstr "Ustaw poziom dla dobrego oglÄ…dania" #: src/dialogs/confdialog.cxx:6312 msgid "FFT Processing" msgstr "Proces FFT" #: src/dialogs/confdialog.cxx:6316 src/dialogs/confdialog.cxx:6668 msgid "Lower limit" msgstr "Dolna granica" #: src/dialogs/confdialog.cxx:6317 msgid "Low frequency limit in Hz" msgstr "Dolna granica czÄ™stotliwosci w Hz" #: src/dialogs/confdialog.cxx:6336 msgid "FFT averaging" msgstr "Usrednianie FFT" #: src/dialogs/confdialog.cxx:6337 msgid "Use averaging to decrease waterfall noise" msgstr "Uzyj usredniania, zmniejsz szum wodospadu" #: src/dialogs/confdialog.cxx:6342 msgid "FFT prefilter window function" msgstr "FFT okno funkcji filtru wstÄ™pnego" #: src/dialogs/confdialog.cxx:6343 msgid "Select the type of FFT prefilter" msgstr "Wybierz filtr wstÄ™pny typu FFT " #: src/dialogs/confdialog.cxx:6354 msgid "Rectangular" msgstr "ProstokÄ…tny" #: src/dialogs/confdialog.cxx:6356 msgid "Triangular" msgstr "TrójkÄ…tny" #: src/dialogs/confdialog.cxx:6361 src/dialogs/confdialog.cxx:6680 msgid "Upper limit" msgstr "Górna granica" #: src/dialogs/confdialog.cxx:6362 msgid "High frequency limit in Hz" msgstr "Górna granica czÄ™stotliwosci w Hz" #: src/dialogs/confdialog.cxx:6381 msgid "Latency" msgstr "" #: src/dialogs/confdialog.cxx:6382 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:6404 msgid "Show me more or less waterfall" msgstr "Pokaz mniej lub wiÄ™cej wodospadu" #: src/dialogs/confdialog.cxx:6407 msgid "Waterfall height in pixels" msgstr "Wysokosc wodospadu w pikselach" #: src/dialogs/confdialog.cxx:6408 msgid "CPU usage increases with waterfall height" msgstr "Uzycie CPU wzrasta z wysokoscia wodospadu" #: src/dialogs/confdialog.cxx:6431 msgid "Mouse" msgstr "Mysz" #: src/dialogs/confdialog.cxx:6435 msgid "Left or right click always replays audio history" msgstr "Kliknij lewym lub prawym by uzyskac historiÄ™ audio" #: src/dialogs/confdialog.cxx:6436 msgid "Replay trackline audio" msgstr "Odtwarzanie dźwiÄ™ku trackline" #: src/dialogs/confdialog.cxx:6441 msgid "Dragging on the waterfall scale changes frequency" msgstr "PrzeciÄ…gnij wodospad na skali czÄ™stotliwosci" #: src/dialogs/confdialog.cxx:6442 msgid "Enable drag cursor on waterfall scale" msgstr "Aktywuj przeciÄ…gniÄ™cie kursora na skalÄ™ wodospadu" #: src/dialogs/confdialog.cxx:6447 msgid "Insert text on single left click" msgstr "Wstaw tekst pojedynczym lewym klikniÄ™ciem" #: src/dialogs/confdialog.cxx:6448 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" "Wstaw specjalny tekst w panelu Rx\n" "po klikniÄ™ciu wodospadu" #: src/dialogs/confdialog.cxx:6454 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" "Opis zostanie zastÄ…piony\n" "obecnym modem i czÄ™stotliwoscia" #: src/dialogs/confdialog.cxx:6468 msgid "Wheel action" msgstr "Akcja koÅ‚a" #: src/dialogs/confdialog.cxx:6469 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Wybierz sposób wykorzystania rolki myszki\n" "zachowanie wewnÄ…trz wodospadu" #: src/dialogs/confdialog.cxx:6494 src/dialogs/confdialog.cxx:9177 #: src/dialogs/confdialog.cxx:9492 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:6502 msgid "Filter bandwidth" msgstr "Przepustowosc filtru" #: src/dialogs/confdialog.cxx:6503 msgid "CW dsp filter bandwidth" msgstr "Przepustowosc filtru dsp przy CW" #: src/dialogs/confdialog.cxx:6523 #, fuzzy msgid "Rx WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:6529 msgid "Tracked CW speed in WPM" msgstr "Sledzona szybkosc CW w WPM" #: src/dialogs/confdialog.cxx:6534 msgid "SOM decoding" msgstr "" #: src/dialogs/confdialog.cxx:6535 msgid "Self Organizing Mapping" msgstr "" #: src/dialogs/confdialog.cxx:6541 msgid "Lower" msgstr "Nizszy" #: src/dialogs/confdialog.cxx:6542 msgid "Detector low threshold" msgstr "" #: src/dialogs/confdialog.cxx:6561 msgid "Upper" msgstr "Wyzszy" #: src/dialogs/confdialog.cxx:6562 msgid "Detector high threshold" msgstr "" #: src/dialogs/confdialog.cxx:6581 msgid "Matched Filter" msgstr "Dopasuj Filtr" #: src/dialogs/confdialog.cxx:6582 msgid "Matched Filter bandwidth" msgstr "Dopasowane filtru pasma" #: src/dialogs/confdialog.cxx:6588 msgid "FFT filter" msgstr "Filtr FFT" #: src/dialogs/confdialog.cxx:6589 msgid "FFT / FIR filter" msgstr "" #: src/dialogs/confdialog.cxx:6595 msgid "Tracking" msgstr "Sledzenie" #: src/dialogs/confdialog.cxx:6596 msgid "Automatic Rx speed tracking" msgstr "Automatyczna prÄ™dkosc sledzenia Rx" #: src/dialogs/confdialog.cxx:6602 msgid "Range, WPM" msgstr "Zakres, WPM" #: src/dialogs/confdialog.cxx:6603 msgid "Range +/- wpm" msgstr "Zakres +/- wpm" #: src/dialogs/confdialog.cxx:6627 msgid "TX WPM" msgstr "TX WPM" #: src/dialogs/confdialog.cxx:6628 src/dialogs/confdialog.cxx:6693 msgid "My transmit CW WPM" msgstr "Moje nadawanie CW WPM" #: src/dialogs/confdialog.cxx:6649 msgid "The default CW speed" msgstr "Domyslna szybkosc CW" #: src/dialogs/confdialog.cxx:6669 msgid "No slower than this" msgstr "Nie wolniej niz" #: src/dialogs/confdialog.cxx:6681 msgid "No faster than this" msgstr "Nie szybciej niz " #: src/dialogs/confdialog.cxx:6692 msgid "F-WPM" msgstr "F-WPM" #: src/dialogs/confdialog.cxx:6713 msgid "Use Farnsworth timing" msgstr "Zastosuj termin Farnsworth" #: src/dialogs/confdialog.cxx:6722 msgid "Timing and QSK" msgstr "Czas trwania i QSK" #: src/dialogs/confdialog.cxx:6725 msgid "Timing" msgstr "Koordynacja" #: src/dialogs/confdialog.cxx:6728 msgid "Weight (%)" msgstr "Waga (%)" #: src/dialogs/confdialog.cxx:6729 msgid "Dot to dot-space ratio" msgstr "Stosunek kropki do kropki" #: src/dialogs/confdialog.cxx:6748 src/dialogs/confdialog.cxx:6749 msgid "Dash to dot ratio" msgstr "Stosunek Kreski do kropki" #: src/dialogs/confdialog.cxx:6767 msgid "Edge timing" msgstr "Czas krawÄ™dzi" #: src/dialogs/confdialog.cxx:6768 msgid "Leading and Trailing edge risetimes (msec)" msgstr "PoczÄ…tkowe i koncowe czasy narastania krawÄ™dzi (msek)" #: src/dialogs/confdialog.cxx:6786 msgid "Edge shape" msgstr "KsztaÅ‚t krawÄ™dzi" #: src/dialogs/confdialog.cxx:6787 msgid "Raised cosine = Hanning" msgstr "Podniesiony cosinus = Hanning" #: src/dialogs/confdialog.cxx:6803 msgid "Edge decreases pulse width" msgstr "KrawÄ™dz zmniejsza szerokosc impulsu" #: src/dialogs/confdialog.cxx:6804 msgid "Weight decreases with increasing edge timing" msgstr "Waga maleje wraz wzrostem czasu krawÄ™dzi" #: src/dialogs/confdialog.cxx:6811 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:6814 msgid "QSK on right audio channel" msgstr "QSK na prawym kanale audio" #: src/dialogs/confdialog.cxx:6815 msgid "Generate square wave signal on right channel" msgstr "Wygeneruj sygnaÅ‚ prostokÄ…tny na prawym kanale" #: src/dialogs/confdialog.cxx:6820 msgid "Pre-keydown timing (ms)" msgstr "Pre-keydown czas (ms)" #: src/dialogs/confdialog.cxx:6821 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "Msek pre-keydown ( jest wczesniej w czasie)" #: src/dialogs/confdialog.cxx:6839 msgid "Post-keydown timing (ms)" msgstr "Post-keydown czas (ms)" #: src/dialogs/confdialog.cxx:6840 msgid "Msec post-keydown (+ is earlier in time)" msgstr "Msek po keydown ( + wczesniej w czasie)" #: src/dialogs/confdialog.cxx:6858 msgid "Send continuously" msgstr "WysyÅ‚aj stale" #: src/dialogs/confdialog.cxx:6859 msgid "Send a continuous stream of test characters" msgstr "Wyslij strumien znaków testowych" #: src/dialogs/confdialog.cxx:6864 msgid "Test char" msgstr "Znaki testu" #: src/dialogs/confdialog.cxx:6865 msgid "Test character for QSK adjustment" msgstr "Znaki testu do regulacji QSK" #: src/dialogs/confdialog.cxx:6885 msgid "Prosigns" msgstr "Prosigns" #: src/dialogs/confdialog.cxx:6890 msgid "Use '(' paren not KN" msgstr "Uzyj '(' paren nie KN" #: src/dialogs/confdialog.cxx:6897 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6914 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6931 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6948 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6964 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6981 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6998 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7015 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7032 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7055 msgid "Dom" msgstr "DomEX" #: src/dialogs/confdialog.cxx:7059 src/dialogs/confdialog.cxx:7902 msgid "Secondary Text" msgstr "Tekst wtórny" #: src/dialogs/confdialog.cxx:7060 src/dialogs/confdialog.cxx:7903 msgid "Text to send during keyboard idle times" msgstr "Tekst do wyslania, podczas bezczynnosci klawiatury" #: src/dialogs/confdialog.cxx:7074 src/dialogs/confdialog.cxx:7917 msgid "Filtering" msgstr "Filtracja" #: src/dialogs/confdialog.cxx:7075 msgid "Use DSP filter before decoder" msgstr "Uzyj filtru DSP przed dekoderem" #: src/dialogs/confdialog.cxx:7081 src/dialogs/confdialog.cxx:7924 msgid "Filter bandwidth factor" msgstr "Wspólczynnik filtra przepustowosci" #: src/dialogs/confdialog.cxx:7082 src/dialogs/confdialog.cxx:7925 msgid "Filter bandwidth relative to signal width" msgstr "Filtr wzglÄ™dnej szerokosci pasma do sygnalizowania szerokosci" #: src/dialogs/confdialog.cxx:7100 msgid "FEC" msgstr "FEC" #: src/dialogs/confdialog.cxx:7101 msgid "Enable MultiPSK-compatible FEC" msgstr "Aktywuj MultiPSK zgodny z FEC" #: src/dialogs/confdialog.cxx:7106 src/dialogs/confdialog.cxx:7943 msgid "CWI threshold" msgstr "Próg CWI " #: src/dialogs/confdialog.cxx:7107 src/dialogs/confdialog.cxx:7944 msgid "CWI detection and suppression" msgstr "Wykrywanie i tÅ‚umienie CWI" #: src/dialogs/confdialog.cxx:7123 src/dialogs/confdialog.cxx:7979 msgid "Paths (hidden)" msgstr "Sciezki (ukryta)" #: src/dialogs/confdialog.cxx:7147 #, fuzzy msgid "Feld" msgstr "Feldhell" #: src/dialogs/confdialog.cxx:7151 msgid "Transmit font" msgstr "Czcionka Tx" #: src/dialogs/confdialog.cxx:7152 msgid "Select TX raster font" msgstr "Wybierz czcionkÄ™ rastra TX " #: src/dialogs/confdialog.cxx:7168 msgid "Reverse video" msgstr "Negatyw Video" #: src/dialogs/confdialog.cxx:7169 msgid "Display RX in reverse video" msgstr "Wyswietl RX w odwrotnym wideo" #: src/dialogs/confdialog.cxx:7174 msgid "Transmit width" msgstr "Szerokosc transmisji" #: src/dialogs/confdialog.cxx:7175 msgid "# of multiple scans / character line" msgstr "# wiele skanów / linia znaków" #: src/dialogs/confdialog.cxx:7190 msgid "Halve receive width" msgstr "Zmniejsz o poÅ‚owÄ™ szerokosc odbioru" #: src/dialogs/confdialog.cxx:7191 msgid "Compress Rx in time" msgstr "Kompresja Rx w czasie" #: src/dialogs/confdialog.cxx:7196 msgid "Pulse shape" msgstr "KsztaÅ‚t impulsu" #: src/dialogs/confdialog.cxx:7197 msgid "Raised cosine pulse shape factor" msgstr "Podniesiony cosinus ksztaltu impulsu " #: src/dialogs/confdialog.cxx:7208 msgid "Slow (4 msec)" msgstr "Wolny (4 msek)" #: src/dialogs/confdialog.cxx:7209 msgid "Fast (2 msec)" msgstr "Szybki (2 msek)" #: src/dialogs/confdialog.cxx:7214 msgid "Receive filter bandwidth" msgstr "Filtr odbiorczy szerokosci pasma" #: src/dialogs/confdialog.cxx:7215 msgid "Adjust the DSP bandwidth" msgstr "Regulacja pasma DSP " #: src/dialogs/confdialog.cxx:7235 msgid "Transmit periods (.) when idle" msgstr "Nadawanie kropek (.) w czasie bezczynnosci" #: src/dialogs/confdialog.cxx:7236 msgid "Transmits a diddle dot when no keyboard activity" msgstr "Nadaje Diddle kropkÄ™ gdy nie aktywny klawisz" #: src/dialogs/confdialog.cxx:7242 msgid "2x Xmt Width (hidden)" msgstr "2x Xmt Szeroki (ukryty)" #: src/dialogs/confdialog.cxx:7252 msgid "MT-63" msgstr "MT-63" #: src/dialogs/confdialog.cxx:7257 src/dialogs/confdialog.cxx:7398 msgid "8-bit extended characters (UTF-8)" msgstr "8-bitowe znaki rozszerzone (UTF-8)" #: src/dialogs/confdialog.cxx:7258 msgid "Enable this for UTF-8 characters" msgstr "Aktywuj to do znaków UTF-8" #: src/dialogs/confdialog.cxx:7264 msgid "Long receive integration" msgstr "Dlugi odbiór integracji" #: src/dialogs/confdialog.cxx:7265 msgid "Enable for very weak signals" msgstr "Wlacz dla bardzo slabych sygnałów" #: src/dialogs/confdialog.cxx:7275 msgid "Transmit lower start tone" msgstr "Nadawanie nizszego tonu startu" #: src/dialogs/confdialog.cxx:7280 msgid "Transmit upper start tone" msgstr "Nadaj wyzszy sygnal startu" #: src/dialogs/confdialog.cxx:7286 msgid "Tone Duration (secs)" msgstr "Czas trwania tonu (sek)" #: src/dialogs/confdialog.cxx:7302 msgid "Allow manual tuning" msgstr "Zezwalaj na rÄ™czne strojenie" #: src/dialogs/confdialog.cxx:7311 msgid "Olivia" msgstr "Olivia" #: src/dialogs/confdialog.cxx:7316 src/dialogs/confdialog.cxx:7412 msgid "Select bandwidth" msgstr "Wybierz pasmo" #: src/dialogs/confdialog.cxx:7332 src/dialogs/confdialog.cxx:7428 msgid "Tones" msgstr "Tony" #: src/dialogs/confdialog.cxx:7333 src/dialogs/confdialog.cxx:7429 msgid "Select number of tones" msgstr "Wybierz liczbÄ™ tonów" #: src/dialogs/confdialog.cxx:7349 src/dialogs/confdialog.cxx:7445 msgid "Receive synchronizer" msgstr "Synchronizator Rx" #: src/dialogs/confdialog.cxx:7352 src/dialogs/confdialog.cxx:7448 msgid "Tune margin (tone frequency spacing)" msgstr "Margines Strojenia (rozstaw czÄ™stotliwosci sygnalu)" #: src/dialogs/confdialog.cxx:7353 src/dialogs/confdialog.cxx:7372 #: src/dialogs/confdialog.cxx:7449 src/dialogs/confdialog.cxx:7468 msgid "Change ONLY to experiment" msgstr "Zmiana ta obowiÄ…zuje tylko do eksperymentowania" #: src/dialogs/confdialog.cxx:7371 src/dialogs/confdialog.cxx:7467 msgid "Integration period (FEC blocks)" msgstr "Okres integracji (bloki FEC)" #: src/dialogs/confdialog.cxx:7390 src/dialogs/confdialog.cxx:7486 msgid "Reset FEC blocks when changing BW or Tones" msgstr "" #: src/dialogs/confdialog.cxx:7391 src/dialogs/confdialog.cxx:7399 #: src/dialogs/confdialog.cxx:7487 msgid "Enable this for UTF-8 character transmission" msgstr "Aktywuj to dla UTF-8 transmisji znaków" #: src/dialogs/confdialog.cxx:7407 #, fuzzy msgid "Cont'" msgstr "Kont" #: src/dialogs/confdialog.cxx:7494 msgid "8-bit extended characters" msgstr "8-bitowe znaki rozszerzone" #: src/dialogs/confdialog.cxx:7495 msgid "Enable this for Latin-1 accented characters" msgstr "Ustaw to dla Latin-1 znaków diakrytycznych" #: src/dialogs/confdialog.cxx:7504 msgid "PSK" msgstr "PSK" #: src/dialogs/confdialog.cxx:7510 msgid "AFC behavior" msgstr "Zachowanie AFC" #: src/dialogs/confdialog.cxx:7513 msgid "Acquisition search range (Hz)" msgstr "Zakres poszukiwania (Hz)" #: src/dialogs/confdialog.cxx:7514 msgid "Capture signals within this frequency range" msgstr "Przechwytywanie sygnalów w tym zakresie czÄ™stotliwosci" #: src/dialogs/confdialog.cxx:7533 src/dialogs/confdialog.cxx:9354 msgid "Acquisition S/N (dB)" msgstr "Pozyskiwanie S/N (dB)" #: src/dialogs/confdialog.cxx:7534 src/dialogs/confdialog.cxx:9355 msgid "Capture signals over this threshold" msgstr "Przechwytywanie sygnalu ponad ten próg" #: src/dialogs/confdialog.cxx:7555 msgid "S/N and IMD behavior" msgstr "Zachowanie S/N i IMD" #: src/dialogs/confdialog.cxx:7558 msgid "after" msgstr "po" #: src/dialogs/confdialog.cxx:7559 msgid "Behavior of s/n imd" msgstr "Zachowanie s/n imd" #: src/dialogs/confdialog.cxx:7570 msgid "Dim" msgstr "Tlumik" #: src/dialogs/confdialog.cxx:7575 msgid "seconds" msgstr "sekundy" #: src/dialogs/confdialog.cxx:7576 msgid "Will occur after this time in seconds" msgstr "NastÄ…pi po upÅ‚ywie tego czasu w sekundach" #: src/dialogs/confdialog.cxx:7596 msgid "Multi-Channel Signal Processing" msgstr "WielokanaÅ‚owa obróbka sygnalu" #: src/dialogs/confdialog.cxx:7599 msgid "Multi-channel detector" msgstr "WielokanaÅ‚owy detektor" #: src/dialogs/confdialog.cxx:7604 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "Wylacz na bardzo wolnym CPU gdy sygnaÅ‚ przeglÄ…darki nie jest uzywany" #: src/dialogs/confdialog.cxx:7615 src/dialogs/confdialog.cxx:9511 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:7619 #, fuzzy msgid "Rx" msgstr "RxID" #: src/dialogs/confdialog.cxx:7624 msgid "AFC speed" msgstr "PrÄ™dkosc AFC" #: src/dialogs/confdialog.cxx:7625 msgid "AFC tracking speed" msgstr "PrÄ™dkosc sledzenia AFC" #: src/dialogs/confdialog.cxx:7641 #, fuzzy msgid "RX - unshift on space" msgstr "Przesuniecie na przestrzeni" #: src/dialogs/confdialog.cxx:7642 #, fuzzy msgid "Revert to unshifted char's on a space" msgstr "Przywróc przesuniecie znaków na przestrzeni" #: src/dialogs/confdialog.cxx:7647 #, fuzzy msgid "Filter Shape Factor" msgstr "Wspólczynnik filtra przepustowosci" #: src/dialogs/confdialog.cxx:7648 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" #: src/dialogs/confdialog.cxx:7660 #, fuzzy msgid "Decode (CWI suppression)" msgstr "Wykrywanie i tÅ‚umienie CWI" #: src/dialogs/confdialog.cxx:7663 msgid "Mark-Space" msgstr "" #: src/dialogs/confdialog.cxx:7668 msgid "Mark only" msgstr "" #: src/dialogs/confdialog.cxx:7673 msgid "Space only" msgstr "" #: src/dialogs/confdialog.cxx:7680 msgid "RTTY Scope Display" msgstr "" #: src/dialogs/confdialog.cxx:7683 msgid "Use cross hair scope" msgstr "Ustaw przekroczenie zakresu" #: src/dialogs/confdialog.cxx:7684 msgid "Default to cross hair digiscope" msgstr "Domyslnie do przekroczenia digiscope" #: src/dialogs/confdialog.cxx:7689 msgid "XY - classic scope" msgstr "" #: src/dialogs/confdialog.cxx:7690 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" #: src/dialogs/confdialog.cxx:7697 msgid "Log RTTY frequency" msgstr "Log czÄ™stotliwosci RTTY" #: src/dialogs/confdialog.cxx:7700 msgid "Use MARK freq'" msgstr "Ustaw MARK czest'" #: src/dialogs/confdialog.cxx:7701 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" #: src/dialogs/confdialog.cxx:7708 #, fuzzy msgid "track color" msgstr "Zeruj sciezke" #: src/dialogs/confdialog.cxx:7709 msgid "Color of Mark Track" msgstr "" #: src/dialogs/confdialog.cxx:7719 #, fuzzy msgid "Tx" msgstr "TxID" #: src/dialogs/confdialog.cxx:7722 msgid "Carrier shift" msgstr "PrzesuniÄ™cie nosnej" #: src/dialogs/confdialog.cxx:7723 msgid "Select carrier shift" msgstr "Wybierz przesuniÄ™cie nosnej" #: src/dialogs/confdialog.cxx:7738 msgid "Custom shift" msgstr "Wybranej przesuniÄ™cie " #: src/dialogs/confdialog.cxx:7739 msgid "Input carrier shift" msgstr "Wejscie przesuniecia nosnej" #: src/dialogs/confdialog.cxx:7757 msgid "Baud rate" msgstr "Szybkosc transmisji" #: src/dialogs/confdialog.cxx:7758 msgid "Select carrier baudrate" msgstr "Wybierz szybkosc transmisji" #: src/dialogs/confdialog.cxx:7773 msgid "Bits per character" msgstr "Bitów na znak" #: src/dialogs/confdialog.cxx:7774 msgid "Select # bits / char" msgstr "Wybierz # bity / znak" #: src/dialogs/confdialog.cxx:7789 msgid "Parity" msgstr "Parytet" #: src/dialogs/confdialog.cxx:7790 msgid "Select parity" msgstr "Wybierz parytet" #: src/dialogs/confdialog.cxx:7805 msgid "Stop bits" msgstr "Bity stopu" #: src/dialogs/confdialog.cxx:7806 msgid "Select # stop bits" msgstr "Wybierz # bity stopu" #: src/dialogs/confdialog.cxx:7821 msgid "AutoCRLF" msgstr "AutoCRLF" #: src/dialogs/confdialog.cxx:7822 msgid "Add CRLF after page width characters" msgstr "Dodaj CRLF po znakach szerokosci strony" #: src/dialogs/confdialog.cxx:7827 #, fuzzy msgid "chars" msgstr "znaków" #: src/dialogs/confdialog.cxx:7828 msgid "Auto CRLF line length" msgstr "" #: src/dialogs/confdialog.cxx:7846 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:7847 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "Ustaw \"cr cr lf\" dla \"cr lf\"" #: src/dialogs/confdialog.cxx:7853 #, fuzzy msgid "TX - unshift on space" msgstr "Przesuniecie na przestrzeni" #: src/dialogs/confdialog.cxx:7854 msgid "Revert to Unsifted char's on a space" msgstr "Przywróc przesuniecie znaków na przestrzeni" #: src/dialogs/confdialog.cxx:7859 #, fuzzy msgid "Pseudo-FSK - right channel" msgstr "Pseudo-FSK na prawym kanale audio" #: src/dialogs/confdialog.cxx:7860 #, fuzzy msgid "Create keyed square wave on right audio channel" msgstr "Utwórz przebieg prostokÄ…tny na prawym kanale" #: src/dialogs/confdialog.cxx:7867 #, fuzzy msgid "Synop" msgstr "Oscyloskop" #: src/dialogs/confdialog.cxx:7870 msgid "SYNOP to ADIF" msgstr "" #: src/dialogs/confdialog.cxx:7871 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" #: src/dialogs/confdialog.cxx:7877 msgid "SYNOP to KML" msgstr "" #: src/dialogs/confdialog.cxx:7878 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" #: src/dialogs/confdialog.cxx:7885 msgid "Interleave SYNOP and text" msgstr "" #: src/dialogs/confdialog.cxx:7886 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "" #: src/dialogs/confdialog.cxx:7898 msgid "Thor" msgstr "Thor" #: src/dialogs/confdialog.cxx:7918 msgid "Enable DSP prior to decoder" msgstr "Wlacz DSP przed dekoderem" #: src/dialogs/confdialog.cxx:7960 msgid "Preamble Detection" msgstr "" #: src/dialogs/confdialog.cxx:7961 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" #: src/dialogs/confdialog.cxx:7966 msgid "Soft-symbol decoding" msgstr "" #: src/dialogs/confdialog.cxx:7967 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:7972 msgid "Soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:7973 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" #: src/dialogs/confdialog.cxx:8003 msgid "Navtex" msgstr "Navtex" #: src/dialogs/confdialog.cxx:8005 msgid "Log Navtex messages to Adif file" msgstr "Zaloguj wiadomosci do pliku ADIF NAVTEX" #: src/dialogs/confdialog.cxx:8010 #, fuzzy msgid "Log Navtex messages to KML" msgstr "Zaloguj wiadomosci do pliku ADIF NAVTEX" #: src/dialogs/confdialog.cxx:8011 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" #: src/dialogs/confdialog.cxx:8018 msgid "Wefax" msgstr "" #: src/dialogs/confdialog.cxx:8021 msgid "Embedded Wefax Gui" msgstr "Wbudowany Wefax Gui" #: src/dialogs/confdialog.cxx:8022 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" "WyÅ›wietl TX i RX w oknie głównym fldigi.\n" "Zmiana wymaga restartu fldigi" #: src/dialogs/confdialog.cxx:8027 msgid "Hide Transmission window" msgstr "Ukryj okno transmisji" #: src/dialogs/confdialog.cxx:8028 msgid "Hide transmission window by default." msgstr "Ukryj okno transmisji domyÅ›lnie" #: src/dialogs/confdialog.cxx:8033 msgid "Log Wefax messages to Adif file" msgstr "Zaloguj wiadomoÅ›ci Wefax do pliku ADIF" #: src/dialogs/confdialog.cxx:8034 msgid "Sent and received faxes are logged to Adif file." msgstr "WysÅ‚ane i odebrane faksy sÄ… rejestrowane w pliku ADIF" #: src/dialogs/confdialog.cxx:8039 msgid "Frequency shift (800 Hz)" msgstr "PrzesuniÄ™cie czÄ™stotliwosci (800 Hz)" #: src/dialogs/confdialog.cxx:8040 src/dialogs/confdialog.cxx:8051 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "DomyÅ›lnie 800 Hz. Deutsche Wetterdienst 850Hz" #: src/dialogs/confdialog.cxx:8050 msgid "Rx fax max rows" msgstr "" #: src/dialogs/confdialog.cxx:8061 msgid "Fax images destination directory" msgstr "Faks katalog zdjęć" #: src/dialogs/confdialog.cxx:8066 msgid "Directory..." msgstr "Katalog..." #: src/dialogs/confdialog.cxx:8069 msgid "Save image as monochrome file" msgstr "Zapisz obraz jako plik monochromatyczny" #: src/dialogs/confdialog.cxx:8070 msgid "Save the fax image as a gray-level PNG file." msgstr "Zapisz obraz faksu jako szary poziom PNG" #: src/dialogs/confdialog.cxx:8083 msgid "Rig" msgstr "Rig" #: src/dialogs/confdialog.cxx:8084 msgid "Transceiver control" msgstr "Sterowanie transceiverem" #: src/dialogs/confdialog.cxx:8088 msgid "Hardware PTT" msgstr "Sprzet PTT" #: src/dialogs/confdialog.cxx:8091 src/dialogs/confdialog.cxx:8926 msgid "PTT tone on right audio channel " msgstr "Ton PTT na prawym kanale audio" #: src/dialogs/confdialog.cxx:8092 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Moga byc stosowane zamiast lub w uzupeÅ‚nieniu na inne rodzaje PTT" #: src/dialogs/confdialog.cxx:8099 msgid "h/w ptt device-pin" msgstr "Pin urzadzenia PTT" #: src/dialogs/confdialog.cxx:8102 msgid "Use separate serial port PTT" msgstr "Uzyj oddzielnego portu szeregowego PTT" #: src/dialogs/confdialog.cxx:8107 src/dialogs/confdialog.cxx:8204 #: src/dialogs/confdialog.cxx:8414 src/dialogs/confdialog.cxx:8668 #: src/dialogs/confdialog.cxx:8856 msgid "Device:" msgstr "UrzÄ…dzenie:" #: src/dialogs/confdialog.cxx:8121 msgid "Use RTS" msgstr "Ustaw RTS" #: src/dialogs/confdialog.cxx:8122 msgid "RTS is PTT signal line" msgstr "RTS jest sygnalem linii PTT" #: src/dialogs/confdialog.cxx:8126 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:8127 msgid "Initial voltage on RTS" msgstr "WstÄ™pne napiÄ™cie na RTS" #: src/dialogs/confdialog.cxx:8131 msgid "Use DTR" msgstr "Ustaw DTR" #: src/dialogs/confdialog.cxx:8132 msgid "DTR is PTT signal line" msgstr "DTR jest sygnaÅ‚em linii PTT" #: src/dialogs/confdialog.cxx:8136 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:8137 msgid "Initial voltage on DTR" msgstr "WstÄ™pne napiÄ™cie na DTR" #: src/dialogs/confdialog.cxx:8141 src/dialogs/confdialog.cxx:8305 #: src/dialogs/confdialog.cxx:8567 src/dialogs/confdialog.cxx:8642 #: src/dialogs/confdialog.cxx:9475 msgid "Initialize" msgstr "Inicjalizuj" #: src/dialogs/confdialog.cxx:8142 msgid "Initialize the H/W PTT interface" msgstr "Inicjalizacja H/W interfejsu PTT" #: src/dialogs/confdialog.cxx:8145 msgid "Use parallel port PTT" msgstr "Uzyj portu równoleglego PTT" #: src/dialogs/confdialog.cxx:8150 msgid "Use uHRouter PTT" msgstr "Ustaw uHRouter PTT" #: src/dialogs/confdialog.cxx:8157 msgid "PTT delays valid for all CAT/PTT types" msgstr "Opóznienia NIM wazne dla wszystkich typów CAT/PTT" #: src/dialogs/confdialog.cxx:8160 msgid "Start of transmit PTT delay" msgstr "RozpoczÄ™cie nadawania - opóznienie PTT" #: src/dialogs/confdialog.cxx:8161 msgid "Delay NN msec before starting audio" msgstr "Opóznienie NN msek przed rozpoczÄ™ciem audio" #: src/dialogs/confdialog.cxx:8170 msgid "PTT end of transmit delay" msgstr "Opóznienie PTT konca nadawania" #: src/dialogs/confdialog.cxx:8171 msgid "Delay NN msec before releasing PTT" msgstr "Opóznienie NN msek przed zwolnieniem PTT" #: src/dialogs/confdialog.cxx:8184 msgid "RigCAT" msgstr "RigCAT" #: src/dialogs/confdialog.cxx:8185 msgid "Rig Control using xml spec file" msgstr "Kontrola Rig poprzez plik xml" #: src/dialogs/confdialog.cxx:8187 msgid "Use RigCAT" msgstr "Uzyj RigCAT" #: src/dialogs/confdialog.cxx:8188 msgid "RigCAT used for rig control" msgstr "RigCAT uzywany do kontroli rig" #: src/dialogs/confdialog.cxx:8194 msgid "Rig description file:" msgstr "Plik opisu Rig" #: src/dialogs/confdialog.cxx:8195 msgid "Use Open to select descriptor file" msgstr "Uzyj Otwórz, aby wybrac plik deskryptora" #: src/dialogs/confdialog.cxx:8201 msgid "Select rig descriptor file" msgstr "Wybierz plik deskryptora rig" #: src/dialogs/confdialog.cxx:8219 src/dialogs/confdialog.cxx:8429 msgid "Retries" msgstr "Prób" #: src/dialogs/confdialog.cxx:8220 msgid "# retries before giving up" msgstr "# prób przed zrezygnowaniem" #: src/dialogs/confdialog.cxx:8236 src/dialogs/confdialog.cxx:8532 msgid "Retry interval (ms)" msgstr "InterwaÅ‚ ponawiania (ms)" #: src/dialogs/confdialog.cxx:8237 msgid "Time between retires in msec" msgstr "Czas miÄ™dzy wycofaniem siÄ™ w msek" #: src/dialogs/confdialog.cxx:8253 src/dialogs/confdialog.cxx:8463 msgid "Write delay (ms)" msgstr "Opóznienia zapisu (ms)" #: src/dialogs/confdialog.cxx:8254 msgid "Wait for response to subsequent command" msgstr "" #: src/dialogs/confdialog.cxx:8270 src/dialogs/confdialog.cxx:8497 msgid "Baud rate:" msgstr "Szybkosc transmisji:" #: src/dialogs/confdialog.cxx:8286 src/dialogs/confdialog.cxx:8513 msgid "Stopbits" msgstr "Bity stopu" #: src/dialogs/confdialog.cxx:8306 msgid "Initialize RigCAT interface" msgstr "Inicjalizuj interfejs RigCAT" #: src/dialogs/confdialog.cxx:8309 msgid "Commands are echoed" msgstr "Polecenia sÄ… echem" #: src/dialogs/confdialog.cxx:8310 msgid "Rig or interface echos serial data" msgstr "Rig lub interfejs Echos danych szeregowych" #: src/dialogs/confdialog.cxx:8315 msgid "CAT command for PTT" msgstr "Komenda CAT dla PTT" #: src/dialogs/confdialog.cxx:8316 msgid "PTT is a CAT command (not hardware)" msgstr "PTT jest komenda CAT (nie sprzet)" #: src/dialogs/confdialog.cxx:8322 msgid "Toggle RTS for PTT" msgstr "Ustaw RTS dla PTT" #: src/dialogs/confdialog.cxx:8323 msgid "RTS is ptt line" msgstr "RTS jest linia PTT" #: src/dialogs/confdialog.cxx:8328 msgid "Toggle DTR for PTT" msgstr "Ustaw DTR dla PTT" #: src/dialogs/confdialog.cxx:8329 msgid "DTR is ptt line" msgstr "DTR jest linia PTT" #: src/dialogs/confdialog.cxx:8334 msgid "RTS +12 v" msgstr "RTS +12 v" #: src/dialogs/confdialog.cxx:8335 src/dialogs/confdialog.cxx:8599 msgid "Initial state of RTS" msgstr "PoczÄ…tkowy stan RTS" #: src/dialogs/confdialog.cxx:8340 msgid "DTR +12 v" msgstr "DTR +12 v" #: src/dialogs/confdialog.cxx:8341 src/dialogs/confdialog.cxx:8593 msgid "Initial state of DTR" msgstr "PoczÄ…tkowy stan DTR" #: src/dialogs/confdialog.cxx:8346 src/dialogs/confdialog.cxx:8604 msgid "RTS/CTS flow control" msgstr "Sterowania przepÅ‚ywem RTS/CTS " #: src/dialogs/confdialog.cxx:8347 msgid "Rig uses RTS/CTS handshake" msgstr "Rig korzysta z RTS/CTS" #: src/dialogs/confdialog.cxx:8352 msgid "Restore Settings on Close" msgstr "" #: src/dialogs/confdialog.cxx:8353 msgid "Restore the serial (COM) port settings" msgstr "" #: src/dialogs/confdialog.cxx:8358 src/dialogs/confdialog.cxx:8617 msgid "Revert" msgstr "Odwróc" #: src/dialogs/confdialog.cxx:8359 #, fuzzy msgid "Reset rigCAT interface" msgstr "Inicjalizuj interfejs RigCAT" #: src/dialogs/confdialog.cxx:8364 msgid "VSP Enable" msgstr "Aktywuj VSP" #: src/dialogs/confdialog.cxx:8365 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "Wirtualny Emulator Portu Szeregowego - Powstrzymaj ostrzezenia" #: src/dialogs/confdialog.cxx:8370 #, fuzzy msgid "Init delay (ms)" msgstr "Opóznienia zapisu (ms)" #: src/dialogs/confdialog.cxx:8371 msgid "Wait for response to first CAT command" msgstr "" #: src/dialogs/confdialog.cxx:8391 msgid "Hamlib" msgstr "Hamlib" #: src/dialogs/confdialog.cxx:8393 msgid "Use Hamlib" msgstr "Uzyj Hamlib" #: src/dialogs/confdialog.cxx:8394 msgid "Hamlib used for rig control" msgstr "Hamlib wykorzystany do kontroli rig" #: src/dialogs/confdialog.cxx:8400 msgid "Rig:" msgstr "Rig:" #: src/dialogs/confdialog.cxx:8430 msgid "# times to resend command before giving up" msgstr "# razy, aby ponownie wysÅ‚ac komendÄ™ przed rezygnacja" #: src/dialogs/confdialog.cxx:8446 msgid "Retry Interval (ms)" msgstr "InterwaÅ‚ ponawiania (ms)" #: src/dialogs/confdialog.cxx:8447 src/dialogs/confdialog.cxx:8533 msgid "Msec's between retries" msgstr "Milisekund miÄ™dzy próbami" #: src/dialogs/confdialog.cxx:8464 msgid "Msec's between sequential commands" msgstr "Milisekund miÄ™dzy kolejnymi poleceniami" #: src/dialogs/confdialog.cxx:8480 msgid "Post write delay (ms)" msgstr "Napisz Posta z opóznieniem ( ms)" #: src/dialogs/confdialog.cxx:8481 msgid "Wait interval (msecs) before reading response" msgstr "Czekaj interwaÅ‚ ( msek ) przed odczytem odpowiedzi" #: src/dialogs/confdialog.cxx:8552 msgid "Advanced configuration:" msgstr "Zaawansowana konfiguracja:" #: src/dialogs/confdialog.cxx:8553 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "opcjonalna konfiguracja\n" "w formacie: param = val..." #: src/dialogs/confdialog.cxx:8568 msgid "Initialize hamlib interface" msgstr "Inicjalizacja interfejsu hamlib " #: src/dialogs/confdialog.cxx:8571 msgid "Sideband:" msgstr "WstÄ™ga boczna:" #: src/dialogs/confdialog.cxx:8585 msgid "PTT via Hamlib command" msgstr "PTT za pomocÄ… komend pakietu hamlib" #: src/dialogs/confdialog.cxx:8586 msgid "PTT is a hamlib command" msgstr "PTT jest pakietem komend hamlib " #: src/dialogs/confdialog.cxx:8592 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:8598 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:8605 msgid "Rig requires RTS/CTS flow control" msgstr "Rig wymaga RTS/CTS sterowanie przepÅ‚ywem" #: src/dialogs/confdialog.cxx:8611 msgid "XON/XOFF flow control" msgstr "Kontrola przepÅ‚ywu Xon/Xoff" #: src/dialogs/confdialog.cxx:8612 msgid "Rig requires Xon/Xoff flow control" msgstr "Rig wymaga Xon/ Xoff" #: src/dialogs/confdialog.cxx:8618 #, fuzzy msgid "Reset hamlib interface" msgstr "Inicjalizacja interfejsu hamlib " #: src/dialogs/confdialog.cxx:8627 msgid "XML-RPC" msgstr "XML-RPC" #: src/dialogs/confdialog.cxx:8635 msgid "" "Rig control via external\n" "program using xmlrpc\n" "remote calls." msgstr "" "Kontrola Rig przez zewnÄ™trzny\n" "program za pomocÄ… xmlrpc\n" "zdalnej stacji" #: src/dialogs/confdialog.cxx:8637 msgid "Use XML-RPC program" msgstr "Użyj programu XML-RPC" #: src/dialogs/confdialog.cxx:8638 msgid "Experimental" msgstr "Próbny" #: src/dialogs/confdialog.cxx:8643 msgid "Initialize XML-RPC rig control" msgstr "Inicjalizuj rig kontrolÄ™ XML-RPC " #: src/dialogs/confdialog.cxx:8655 msgid "Audio devices" msgstr "UrzÄ…dzenia audio" #: src/dialogs/confdialog.cxx:8659 msgid "Devices" msgstr "UrzÄ…dzenie" #: src/dialogs/confdialog.cxx:8662 msgid "OSS" msgstr "OSS" #: src/dialogs/confdialog.cxx:8663 msgid "Use OSS audio server" msgstr "Uzyj serwera audio OSS" #: src/dialogs/confdialog.cxx:8669 msgid "Select device" msgstr "Wybierz urzÄ…dzenie" #: src/dialogs/confdialog.cxx:8677 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:8678 msgid "Use Port Audio server" msgstr "Uzyj portu Audio Server" #: src/dialogs/confdialog.cxx:8683 msgid "Capture:" msgstr "Nadawanie:" #: src/dialogs/confdialog.cxx:8684 msgid "Audio input device" msgstr "UrzÄ…dzenie wejsciowe audio" #: src/dialogs/confdialog.cxx:8688 msgid "Playback:" msgstr "Odtwarzanie:" #: src/dialogs/confdialog.cxx:8689 msgid "Audio output device" msgstr "UrzÄ…dzenie wyjsciowe audio" #: src/dialogs/confdialog.cxx:8697 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:8698 msgid "Use Pulse Audio server" msgstr "Uzyj Pulse Audio Server" #: src/dialogs/confdialog.cxx:8703 msgid "Server string:" msgstr "Server string:" #: src/dialogs/confdialog.cxx:8704 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Zostawione puste lub odnoszÄ… siÄ™ do\n" "http://www.pulseaudio.org/wiki/ServerStrings" #: src/dialogs/confdialog.cxx:8722 msgid "File I/O only" msgstr "Plik I/O tylko" #: src/dialogs/confdialog.cxx:8723 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "BRAK URZÄ„DZEN AUDIO (lub testowania)" #: src/dialogs/confdialog.cxx:8732 msgid "Settings" msgstr "Ustawienia" #: src/dialogs/confdialog.cxx:8734 msgid "Sample rate" msgstr "CzÄ™stotliwosc próbkowania" #: src/dialogs/confdialog.cxx:8737 msgid "Capture" msgstr "Nadawanie" #: src/dialogs/confdialog.cxx:8738 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" "Wymuszenie okreslonej czÄ™stotliwosci próbkowania Wybierz\"Native\" jeÅ›lii " "\"Auto\"\n" "nie dziaÅ‚a z urzÄ…dzeniami audio." #: src/dialogs/confdialog.cxx:8770 msgid "Converter" msgstr "Konwerter" #: src/dialogs/confdialog.cxx:8771 msgid "Set the type of resampler used of offset correction" msgstr "Ustawiony typ resampler uzyÅ‚ skorygowania zrównowazenia " #: src/dialogs/confdialog.cxx:8787 msgid "Corrections" msgstr "Korekta" #: src/dialogs/confdialog.cxx:8790 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:8791 msgid "RX sound card correction" msgstr "Korekcja karty dzwiÄ™k RX " #: src/dialogs/confdialog.cxx:8807 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:8808 msgid "TX sound card correction" msgstr "Korekcja karty dzwiÄ™k TX " #: src/dialogs/confdialog.cxx:8824 msgid "TX offset" msgstr "TX offset" #: src/dialogs/confdialog.cxx:8825 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Róznica miÄ™dzy czest. Rx & Tx (rig wyrówna)" #: src/dialogs/confdialog.cxx:8845 msgid "Mixer" msgstr "Mikser" #: src/dialogs/confdialog.cxx:8847 #, fuzzy msgid "OSS Mixer" msgstr "OSS mikser" #: src/dialogs/confdialog.cxx:8850 msgid "Manage mixer" msgstr "ZarzÄ…dzaj mikserem" #: src/dialogs/confdialog.cxx:8851 msgid "Add mixer controls to main dialog" msgstr "Dodaj sterowniki miksera do okna dialogowego" #: src/dialogs/confdialog.cxx:8857 msgid "Select Mixer device" msgstr "Wybierz urzÄ…dzenie Miksera" #: src/dialogs/confdialog.cxx:8872 msgid "Mic In" msgstr "Wej Mik" #: src/dialogs/confdialog.cxx:8873 msgid "Use microphone input" msgstr "Uzyj wejÅ›cia mikrofonowego" #: src/dialogs/confdialog.cxx:8876 msgid "Line In" msgstr "Line In" #: src/dialogs/confdialog.cxx:8877 msgid "Use Line-In device" msgstr "Uzyj urzÄ…dzenia Line-In" #: src/dialogs/confdialog.cxx:8881 msgid "PCM" msgstr "PCM" #: src/dialogs/confdialog.cxx:8882 msgid "Set the sound card PCM level" msgstr "Ustaw poziom karty dzwiÄ™kowej PCM" #: src/dialogs/confdialog.cxx:8902 msgid "Right channel" msgstr "Prawy kanaÅ‚" #: src/dialogs/confdialog.cxx:8904 msgid "Mono audio output" msgstr "Wyjscie audio mono" #: src/dialogs/confdialog.cxx:8905 msgid "Force output audio to single channel" msgstr "Wyjscie audio siÅ‚a do jednego kanaÅ‚u" #: src/dialogs/confdialog.cxx:8910 msgid "Modem signal on left and right channels" msgstr "SygnaÅ‚ modemu na lewym i prawym kanale" #: src/dialogs/confdialog.cxx:8911 msgid "Left and right channels both contain modem audio" msgstr "Lewy i prawy kanaÅ‚ oba zawieraja audio modemu" #: src/dialogs/confdialog.cxx:8916 msgid "Reverse Left/Right channels" msgstr "Odwróc lewy/prawy kanal" #: src/dialogs/confdialog.cxx:8917 msgid "Software reversal of left-right audio channels" msgstr "Odwrócenie programowe lewy-prawy kanal audio" #: src/dialogs/confdialog.cxx:8922 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Te kontrole sÄ… na innych kartach.\n" "One sÄ… replikowane tutaj dla wygody.\n" "Mozesz zmienic stan z kazdej lokalizacji.\n" "..." #: src/dialogs/confdialog.cxx:8927 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "1000 Hz ton, kiedy PTT wlaczony\n" "Moze być uzywana zamiast lub w uzupeÅ‚nieniu do innych typów PTT" #: src/dialogs/confdialog.cxx:8933 msgid "CW QSK signal on right channel" msgstr "CW QSK sygnaÅ‚ na prawym kanale" #: src/dialogs/confdialog.cxx:8934 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Utwórz 1000 Hz sygnal prostokÄ…tny na prawym kanale" #: src/dialogs/confdialog.cxx:8939 msgid "Pseudo-FSK on right audio channel" msgstr "Pseudo-FSK na prawym kanale audio" #: src/dialogs/confdialog.cxx:8940 msgid "Create 1000 Hz square wave on right channel" msgstr "Utwórz 1000 Hz audio prostokÄ…tne w prawym kanale" #: src/dialogs/confdialog.cxx:8949 msgid "Wav" msgstr "" #: src/dialogs/confdialog.cxx:8951 #, fuzzy msgid "Wav write sample rate" msgstr "CzÄ™stotliwosc próbkowania" #: src/dialogs/confdialog.cxx:8952 msgid "Pick baud rate from list" msgstr "Wybierz szybkosc transmisji z listy" #: src/dialogs/confdialog.cxx:8974 msgid "ID" msgstr "ID" #: src/dialogs/confdialog.cxx:8977 msgid "RsID" msgstr "" #: src/dialogs/confdialog.cxx:8978 msgid "Reed-Solomon ID (Rx)" msgstr "Reed-Solomon ID (Rx)" #: src/dialogs/confdialog.cxx:8981 #, fuzzy msgid "Notify only" msgstr "Powiadom tylko" #: src/dialogs/confdialog.cxx:8982 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Sprawdz to, aby otrzymywac powiadomienia RSID\n" "bez zmiany modemu i czÄ™stotliwosci" #: src/dialogs/confdialog.cxx:8988 msgid "Receive modes" msgstr "Tryby RX" #: src/dialogs/confdialog.cxx:8991 #, fuzzy msgid "Searches passband" msgstr "Detektor przeszukuje caÅ‚e pasmo przenoszenia" #: src/dialogs/confdialog.cxx:8992 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" "WL - przeszukaj caÅ‚y wodospad\n" "WYL- Ogranicz wyszukiwanie do+/- 200 Hz" #: src/dialogs/confdialog.cxx:8997 #, fuzzy msgid "Mark prev freq/mode" msgstr "Oznacz poprzedniÄ… czÄ™stotliwosc i tryb" #: src/dialogs/confdialog.cxx:8998 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" "Wstaw znacznik tekstu RX przed\n" "zmianÄ… czÄ™stotliwosci i modemu" #: src/dialogs/confdialog.cxx:9003 #, fuzzy msgid "Disables detector" msgstr "Wylacz detektor odbioru " #: src/dialogs/confdialog.cxx:9004 msgid "Disable further detection when RSID is received" msgstr "Wylacz wykrywanie RSID" #: src/dialogs/confdialog.cxx:9011 msgid "Allow errors" msgstr "" #: src/dialogs/confdialog.cxx:9012 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" #: src/dialogs/confdialog.cxx:9023 msgid "Medium" msgstr "" #: src/dialogs/confdialog.cxx:9028 msgid "Squelch open (sec)" msgstr "Otwarcie Squelch (sek)" #: src/dialogs/confdialog.cxx:9029 msgid "Open squelch for nn sec if RSID detected" msgstr "Otworz squelch dla nn sek jeÅ›li RSID jest wykrywane" #: src/dialogs/confdialog.cxx:9047 #, fuzzy msgid "Disable alert dialog" msgstr "Deaktywuj" #: src/dialogs/confdialog.cxx:9048 msgid "Do not show RsID alert dialog box" msgstr "" #: src/dialogs/confdialog.cxx:9053 msgid "Retain tx freq lock" msgstr "" #: src/dialogs/confdialog.cxx:9054 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:9059 #, fuzzy msgid "Disable freq change" msgstr "Deaktywuj" #: src/dialogs/confdialog.cxx:9060 msgid "Do not automatically change to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:9065 msgid "" "The RsID notification message contents and \n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" #: src/dialogs/confdialog.cxx:9073 msgid "Pre-Signal Tone" msgstr "Pre-sygnaÅ‚ dzwiÄ™kowy" #: src/dialogs/confdialog.cxx:9076 msgid "Seconds" msgstr "Sekund" #: src/dialogs/confdialog.cxx:9077 msgid "Use for triggering amplifier carrier detect" msgstr "Sluzy do wyzwalania nosnika wzmacniacza wykrywania" #: src/dialogs/confdialog.cxx:9085 msgid "Reed-Solomon ID (Tx)" msgstr "Reed-Solomon ID (Tx)" #: src/dialogs/confdialog.cxx:9088 msgid "Transmit modes" msgstr "Tryby TX" #: src/dialogs/confdialog.cxx:9091 msgid "End of xmt ID" msgstr "" #: src/dialogs/confdialog.cxx:9092 #, fuzzy msgid "Add RsID signal to end of transmission" msgstr "Wyslij znak w CW na koncu kazdej transmisji" #: src/dialogs/confdialog.cxx:9101 msgid "Video" msgstr "" #: src/dialogs/confdialog.cxx:9103 msgid "Video Preamble ID" msgstr "PreambuÅ‚a wideo ID" #: src/dialogs/confdialog.cxx:9106 msgid "Transmit mode ID" msgstr "Nadaj tryb ID" #: src/dialogs/confdialog.cxx:9107 msgid "Waterfall video ID" msgstr "Wodospad Video ID" #: src/dialogs/confdialog.cxx:9111 msgid "Transmit video text" msgstr "Nadaj tekst video" #: src/dialogs/confdialog.cxx:9112 msgid "Waterfall video text" msgstr "Tekst wideo wodospadu" #: src/dialogs/confdialog.cxx:9117 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:9118 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" "Ogranicz do kilku znaków\n" "jak w CQEM lub IOTA itp" #: src/dialogs/confdialog.cxx:9132 msgid "Use small font" msgstr "Uzyj maÅ‚ej czcionki" #: src/dialogs/confdialog.cxx:9133 msgid "" "ON - small font\n" "OFF - large font" msgstr "" "WL - mala czcionka\n" "WYL -duza czcionka" #: src/dialogs/confdialog.cxx:9139 msgid "Chars/Row:" msgstr "Znak/Wiersz:" #: src/dialogs/confdialog.cxx:9140 msgid "Set the number of characters per row" msgstr "Ustaw liczbÄ™ znaków w wierszu" #: src/dialogs/confdialog.cxx:9160 msgid "500 Hz limit" msgstr "Limit 500 Hz" #: src/dialogs/confdialog.cxx:9165 msgid "Mode width limit" msgstr "Tryb limitu szerokosci" #: src/dialogs/confdialog.cxx:9170 msgid "Video ID modes" msgstr "Tryb Video ID" #: src/dialogs/confdialog.cxx:9179 msgid "CW Postamble ID" msgstr "CW ustawienia ID" #: src/dialogs/confdialog.cxx:9182 msgid "Transmit callsign" msgstr "Nadaj Znak" #: src/dialogs/confdialog.cxx:9183 msgid "Send Callsign in CW at end of every transmission" msgstr "Wyslij znak w CW na koncu kazdej transmisji" #: src/dialogs/confdialog.cxx:9188 msgid "Speed (WPM):" msgstr "PrÄ™dkosc (WPM):" #: src/dialogs/confdialog.cxx:9189 msgid "Send at this WPM" msgstr "Wyslij na tym WPM" #: src/dialogs/confdialog.cxx:9209 msgid "CW ID modes" msgstr "Tryby CW ID" #: src/dialogs/confdialog.cxx:9224 msgid "CPU" msgstr "CPU" #: src/dialogs/confdialog.cxx:9228 msgid "Slow CPU (less than 700MHz)" msgstr "Powolny CPU ( mniej niż 700MHz )" #: src/dialogs/confdialog.cxx:9229 msgid "Enable if you're computer does not decode properly" msgstr "Ustaw gdy komputer nie dekoduje poprawnie" #: src/dialogs/confdialog.cxx:9238 msgid "NBEMS" msgstr "NBEMS" #: src/dialogs/confdialog.cxx:9240 msgid "NBEMS data file interface" msgstr "NBEMS plik danych interfejsu " #: src/dialogs/confdialog.cxx:9243 msgid "Enable" msgstr "Wlacz" #: src/dialogs/confdialog.cxx:9244 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "Wydobywa pliki do uzycia zewnÄ™trznym programem (wrap/flmsg)" #: src/dialogs/confdialog.cxx:9249 msgid "Open message folder" msgstr "Otwórz folder wiadomosci" #: src/dialogs/confdialog.cxx:9250 msgid "Opens NBEMS file folder upon successful capture" msgstr "Otwórz folder pliku NBEMS po pomyslnym przechwyceniu" #: src/dialogs/confdialog.cxx:9257 #, fuzzy msgid "Reception of flmsg files" msgstr "Odbiór pliku flmsg" #: src/dialogs/confdialog.cxx:9260 msgid "Open with flmsg" msgstr "Otworz w flmsg" #: src/dialogs/confdialog.cxx:9261 msgid "Open message with flmsg" msgstr "Otworz wiadomosc z flmsg" #: src/dialogs/confdialog.cxx:9266 msgid "Open in browser" msgstr "Otwórz w przeglÄ…darce" #: src/dialogs/confdialog.cxx:9267 msgid "Open file with default browser" msgstr "Otwórz plik w domyslnej przeglÄ…darce" #: src/dialogs/confdialog.cxx:9272 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:9273 msgid "Enter full path-filename for flmsg" msgstr "Wpisz peÅ‚na sciezke, nazwe pliku flmsg" #: src/dialogs/confdialog.cxx:9286 msgid "Locate flmsg" msgstr "Szukaj flmsg" #: src/dialogs/confdialog.cxx:9290 #, fuzzy msgid "Timeout (secs)" msgstr "Czas (y):" #: src/dialogs/confdialog.cxx:9291 #, fuzzy msgid "Extract times out after NN seconds of inactivity." msgstr "" "Skasuj tekst kanalu po\n" "# sekund bezczynnosci" #: src/dialogs/confdialog.cxx:9308 msgid "Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:9311 msgid "Mail Server Attributes" msgstr "Atrybuty Mail Server" #: src/dialogs/confdialog.cxx:9314 msgid "Carrier frequency (Hz)" msgstr "CzÄ™stotliwosc nosna (Hz)" #: src/dialogs/confdialog.cxx:9315 msgid "Default listen / transmit frequency" msgstr "Domyslnie sÅ‚uchaj / transmisja czÄ™stotliwosci" #: src/dialogs/confdialog.cxx:9334 msgid "Search range (Hz)" msgstr "Zakres wyszukiwania ( Hz)" #: src/dialogs/confdialog.cxx:9335 msgid "Listen for signals within this range" msgstr "Sluchaj sygnalow w tym zakresie" #: src/dialogs/confdialog.cxx:9374 msgid "AFC range (Hz)" msgstr "Zakres AFC (Hz)" #: src/dialogs/confdialog.cxx:9375 msgid "Limit AFC movement to this range" msgstr "Ogranicz ruch AFC do tego zakresu" #: src/dialogs/confdialog.cxx:9394 msgid "Reset to Carrier" msgstr "Resetuj to Carrier" #: src/dialogs/confdialog.cxx:9395 msgid "When no signal present" msgstr "Kiedy nie wystÄ™puje sygnaÅ‚" #: src/dialogs/confdialog.cxx:9406 msgid "Report ARQ frames average S/N" msgstr "Raport ARQ klatek Å›redni S/N" #: src/dialogs/confdialog.cxx:9415 msgid "Spotting" msgstr "Spotting" #: src/dialogs/confdialog.cxx:9417 msgid "PSK Reporter" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:9420 msgid "Automatically spot callsigns in decoded text" msgstr "Automatyczne spoty stacji w zdekodowanym tekscie" #: src/dialogs/confdialog.cxx:9421 msgid "Parse all incoming text" msgstr "Analizuj wszystkie przychodzÄ…ce teksty" #: src/dialogs/confdialog.cxx:9426 msgid "Send reception report when logging a QSO" msgstr "WyÅ›lij raport odbioru podczas logowania QSO" #: src/dialogs/confdialog.cxx:9427 msgid "Send report only when QSO is logged" msgstr "Wyslij raport, gdy QSO jest zalogowane" #: src/dialogs/confdialog.cxx:9432 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "Raportuj czestotliwosc rig ( włącz tylko jeÅ›li masz kontrolÄ™ Rig!)" #: src/dialogs/confdialog.cxx:9433 msgid "Include the transmit frequency" msgstr "Obejmuje czestotliwosc nadawania" #: src/dialogs/confdialog.cxx:9438 #, fuzzy msgid "Disable spotting when signal browser(s) are not visible." msgstr "Wylacz na bardzo wolnym CPU gdy sygnaÅ‚ przeglÄ…darki nie jest uzywany" #: src/dialogs/confdialog.cxx:9439 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "" #: src/dialogs/confdialog.cxx:9445 msgid "Host:" msgstr "Host:" #: src/dialogs/confdialog.cxx:9446 msgid "To whom the connection is made" msgstr "Z kim polaczenie zostanie nawiÄ…zane" #: src/dialogs/confdialog.cxx:9461 msgid "Using UDP port #" msgstr "Korzystaj z portu UDP #" #: src/dialogs/confdialog.cxx:9476 msgid "Initialize the socket client" msgstr "Inicjacja klienta gniazda" #: src/dialogs/confdialog.cxx:9479 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:9487 msgid "Sweet Spot" msgstr "Sweet Spot" #: src/dialogs/confdialog.cxx:9493 msgid "Default CW tracking point" msgstr "Domyslnie sledzenie punktu CW" #: src/dialogs/confdialog.cxx:9512 msgid "Default RTTY tracking point" msgstr "Domyslnie sledzenie punktu RTTY" #: src/dialogs/confdialog.cxx:9530 msgid "PSK et al." msgstr "PSK et al." #: src/dialogs/confdialog.cxx:9531 msgid "Default for all other modems" msgstr "Domyslnie dla wszystkich innych modemów" #: src/dialogs/confdialog.cxx:9549 msgid "Always start new modems at these frequencies" msgstr "Zawsze startuj nowe modemy na tych czestotliwosciach" #: src/dialogs/confdialog.cxx:9550 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "ON - rozpoczyna domyslnie\n" "OFF - zachowaj aktualna pozycje kursora" #: src/dialogs/confdialog.cxx:9558 msgid "K3 A1A configuation" msgstr "Konfiguracja Elecraft K3" #: src/dialogs/confdialog.cxx:9561 msgid "CW is LSB" msgstr "CW jest LSB" #: src/dialogs/confdialog.cxx:9562 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Wybierz te opcje, dla Elecraft K3\n" "Pozostale radia nie wymagaja." #: src/dialogs/confdialog.cxx:9571 msgid "Text i/o" msgstr "Tekst i/o" #: src/dialogs/confdialog.cxx:9573 msgid "Talker Socket (MS only)" msgstr "Talker Socket (tylko MS)" #: src/dialogs/confdialog.cxx:9576 msgid "Talker" msgstr "Talker" #: src/dialogs/confdialog.cxx:9580 msgid "Connect/disconnect to Talker socket server" msgstr "Polacz / Rozlacz do gniazda serwera Talker " #: src/dialogs/confdialog.cxx:9583 msgid "Auto connect when fldigi opens (server must be up)" msgstr "Aktywuj podczas startu fldigi (serwer musi byc uruchomiony )" #: src/dialogs/confdialog.cxx:9590 msgid "Capture rx text to external file" msgstr "Przechwytuj tekst rx do zewnÄ™trznego pliku" #: src/dialogs/confdialog.cxx:9593 msgid "Enable rx text stream" msgstr "Aktywuj strumien tekstowy rx" #: src/dialogs/confdialog.cxx:9594 msgid "Send rx text to file: textout.txt" msgstr "Wyslij tekst rx do pliku: textout.txt" #: src/dialogs/confdialog.cxx:9603 msgid "DTMF" msgstr "DTMF" #: src/dialogs/confdialog.cxx:9605 msgid "Decode DTMF tones" msgstr "Dekoduj sygnaÅ‚y DTMF" #: src/dialogs/confdialog.cxx:9606 #, fuzzy msgid "Decode received DTMF tones" msgstr "Dekoduj sygnaÅ‚y DTMF" #: src/dialogs/confdialog.cxx:9613 msgid "WX" msgstr "WX" #: src/dialogs/confdialog.cxx:9615 msgid "Weather query specification" msgstr "Specyfikacja zapytania o pogode" #: src/dialogs/confdialog.cxx:9618 msgid "METAR station ID code" msgstr "METAR stacja ID kod" #: src/dialogs/confdialog.cxx:9619 msgid "" "for example KMDQ for \n" "Huntsville-Madison Executive Airport, AL" msgstr "" "na przykÅ‚ad KMDQ dla \n" "Huntsville-Madison Executive Airport, AL" #: src/dialogs/confdialog.cxx:9624 msgid "Full report" msgstr "PeÅ‚ny raport" #: src/dialogs/confdialog.cxx:9625 msgid "Insert full METAR report" msgstr "Wstaw peÅ‚ny raport METAR" #: src/dialogs/confdialog.cxx:9630 #, fuzzy msgid "End of header string:" msgstr "Server string:" #: src/dialogs/confdialog.cxx:9631 msgid "" "Text defining end of METAR header\n" "Typically 'Connection: close'\n" "Used to search for station name" msgstr "" #: src/dialogs/confdialog.cxx:9637 msgid "METAR station location" msgstr "METAR stacja lokalizacja" #: src/dialogs/confdialog.cxx:9638 msgid "Add geopolitical name of METAR station" msgstr "Dodaj geopolityczna nazwÄ™ stacji METAR" #: src/dialogs/confdialog.cxx:9643 msgid "Conditions" msgstr "Warunki" #: src/dialogs/confdialog.cxx:9644 msgid "current wx conditions" msgstr "Obecne warunki wx" #: src/dialogs/confdialog.cxx:9649 msgid "Fahrenheit" msgstr "Fahrenheit" #: src/dialogs/confdialog.cxx:9650 msgid "report Fahrenheit" msgstr "raport Fahrenheit" #: src/dialogs/confdialog.cxx:9655 msgid "Celsius" msgstr "Celsjusz" #: src/dialogs/confdialog.cxx:9656 msgid "report Celsius" msgstr "raport Celsjusza" #: src/dialogs/confdialog.cxx:9661 msgid "Miles / Hour" msgstr "Mil / Godzine" #: src/dialogs/confdialog.cxx:9662 msgid "report miles per hour" msgstr "raport mil na godzine" #: src/dialogs/confdialog.cxx:9667 msgid "kilometers / hour" msgstr "kilometry / godzine" #: src/dialogs/confdialog.cxx:9668 msgid "report kilometers per hour" msgstr "report kilometrów na godzine" #: src/dialogs/confdialog.cxx:9673 msgid "Inches Mg." msgstr "Inches Mg." #: src/dialogs/confdialog.cxx:9674 msgid "report inches mercury" msgstr "cale raport rteci" #: src/dialogs/confdialog.cxx:9679 msgid "mbars" msgstr "mbary" #: src/dialogs/confdialog.cxx:9680 msgid "report millibars" msgstr "raport milibary" #: src/dialogs/confdialog.cxx:9685 msgid "Temperature" msgstr "Temperatura" #: src/dialogs/confdialog.cxx:9688 msgid "Wind speed/dir" msgstr "PrÄ™dkosc wiatru" #: src/dialogs/confdialog.cxx:9691 msgid "Barometric pressure" msgstr "Cisnienie barometryczne" #: src/dialogs/confdialog.cxx:9694 msgid "Search on web" msgstr "Szukaj w internecie" #: src/dialogs/confdialog.cxx:9701 msgid "KML" msgstr "" #: src/dialogs/confdialog.cxx:9703 msgid "KML files directory" msgstr "" #: src/dialogs/confdialog.cxx:9704 msgid "Where generated KML documents are stored." msgstr "" #: src/dialogs/confdialog.cxx:9709 msgid "KML root file" msgstr "" #: src/dialogs/confdialog.cxx:9713 msgid "Minimum distance for splitting aliases (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:9714 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:9724 msgid "Data retention time, in hours (0 for no limit)" msgstr "" #: src/dialogs/confdialog.cxx:9725 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" #: src/dialogs/confdialog.cxx:9734 #, fuzzy msgid "KML refresh interval (seconds)" msgstr "InterwaÅ‚ ponawiania (ms)" #: src/dialogs/confdialog.cxx:9735 msgid "Refresh time interval written in KML file (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:9751 msgid "KML balloon display style" msgstr "" #: src/dialogs/confdialog.cxx:9752 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" #: src/dialogs/confdialog.cxx:9767 #, fuzzy msgid "Command run on KML creation" msgstr "Opcje wiersza polecen" #: src/dialogs/confdialog.cxx:9768 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" #: src/dialogs/confdialog.cxx:9774 #, fuzzy msgid "Test command" msgstr "Znaki testu" #: src/dialogs/confdialog.cxx:9775 msgid "Execute command on KML files." msgstr "" #: src/dialogs/confdialog.cxx:9778 #, fuzzy msgid "Change dir..." msgstr "Zmien kolor" #: src/dialogs/confdialog.cxx:9779 msgid "Choose directory to store KML documents" msgstr "" #: src/dialogs/confdialog.cxx:9782 msgid "Cleanup KML data now !" msgstr "" #: src/dialogs/confdialog.cxx:9783 msgid "Cleanups KML documents, empties Google Earth display." msgstr "" #: src/dialogs/confdialog.cxx:9786 #, fuzzy msgid "Cleanup on startup" msgstr "Wyczysc przy zapisywaniu" #: src/dialogs/confdialog.cxx:9787 #, fuzzy msgid "Empties KML documents when starting program." msgstr "Sprawdz aktualizacje podczas uruchamiania programu" #: src/dialogs/confdialog.cxx:9798 msgid "Web" msgstr "Internet" #: src/dialogs/confdialog.cxx:9799 msgid "Callsign database" msgstr "Baza danych Stacji" #: src/dialogs/confdialog.cxx:9802 msgid "Call Lookup" msgstr "Wyszukaj Stacje" #: src/dialogs/confdialog.cxx:9803 msgid "Web Browser lookup" msgstr "Przegladarka internetowa wyszukiwania" #: src/dialogs/confdialog.cxx:9807 msgid "Do not use callsign lookup via web browser" msgstr "Nie uzywaj wyszukiwania znaku przez przeglÄ…darkÄ™ internetowÄ…" #: src/dialogs/confdialog.cxx:9813 msgid "QRZ online via default Internet Browser" msgstr "QRZ online poprzez przeglÄ…darkÄ™ internetowÄ…" #: src/dialogs/confdialog.cxx:9814 msgid "Visit QRZ web site" msgstr "Zobacz stronÄ™ internetowÄ… QRZ" #: src/dialogs/confdialog.cxx:9819 msgid "HamCall online via default Internet Browser" msgstr "HamCall poprzez przeglÄ…darkÄ™ internetowÄ…" #: src/dialogs/confdialog.cxx:9820 src/dialogs/confdialog.cxx:9868 msgid "Visit Hamcall web site" msgstr "Zobacz stronÄ™ internetowÄ… Hamcall" #: src/dialogs/confdialog.cxx:9825 msgid "HamQTH via default Internet Browser" msgstr "HamQTH przez przeglÄ…darke internetowa" #: src/dialogs/confdialog.cxx:9826 msgid "Visit hamQTH web site" msgstr "Zobacz stronÄ™ internetowÄ… hamQTH" #: src/dialogs/confdialog.cxx:9833 msgid "Data base lookup" msgstr "Wyszukiwanie baza danych" #: src/dialogs/confdialog.cxx:9837 msgid "Do not use callsign database" msgstr "Nie nalezy uzywac bazy znaków" #: src/dialogs/confdialog.cxx:9843 msgid "QRZ cdrom" msgstr "QRZ cdrom" #: src/dialogs/confdialog.cxx:9844 msgid "Use CD or hard drive CD image" msgstr "Użyj CD lub obraz dysku CD" #: src/dialogs/confdialog.cxx:9849 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:9850 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "Potrzebujesz platny abonament\n" "na dostÄ™p do QRZ on-line" #: src/dialogs/confdialog.cxx:9855 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:9856 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "Potrzebujesz pÅ‚atny abonament\n" "na dostÄ™p do Hamcall on-line" #: src/dialogs/confdialog.cxx:9861 msgid "HamQTH.com (free service http://www.hamqth.com)" msgstr "HamQTH.com ( http://www.hamqth.com)" #: src/dialogs/confdialog.cxx:9862 msgid "Free service courtesy of OK" msgstr "Darmowe dziÄ™ki uprzejmoÅ›ci obsÅ‚ugi OK" #: src/dialogs/confdialog.cxx:9867 msgid "Callook.info lookup (free service US callsigns only)" msgstr "Callook.info wyszukiwanie ( bezplatna usluga tylko dla stacji US )" #: src/dialogs/confdialog.cxx:9873 msgid "at:" msgstr "w:" #: src/dialogs/confdialog.cxx:9874 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "ie: /home/co7wt/CALLBK lub C:/CALLBK\n" "Pozostaw puste, aby szukac w bazie" #: src/dialogs/confdialog.cxx:9888 msgid "User name" msgstr "Uzytkownik" #: src/dialogs/confdialog.cxx:9889 src/dialogs/confdialog.cxx:9935 #: src/dialogs/confdialog.cxx:9970 msgid "Your login name" msgstr "Twój login" #: src/dialogs/confdialog.cxx:9903 src/dialogs/confdialog.cxx:9949 msgid "Password" msgstr "Haslo" #: src/dialogs/confdialog.cxx:9904 src/dialogs/confdialog.cxx:9950 msgid "Your login password" msgstr "Twoje hasÅ‚o logowania" #: src/dialogs/confdialog.cxx:9919 src/dialogs/confdialog.cxx:9965 msgid "Show" msgstr "Pokaz" #: src/dialogs/confdialog.cxx:9920 src/dialogs/confdialog.cxx:9966 msgid "Show password in plain text" msgstr "Pokaz hasÅ‚a w postaci zwykÅ‚ego tekstu" #: src/dialogs/confdialog.cxx:9923 msgid "Add address to notes field" msgstr "" #: src/dialogs/confdialog.cxx:9932 msgid "eQSL" msgstr "eQSL" #: src/dialogs/confdialog.cxx:9934 msgid "User ID" msgstr "ID Uzytkownika" #: src/dialogs/confdialog.cxx:9969 msgid "QTH Nickname" msgstr "Pseudonim QTH" #: src/dialogs/confdialog.cxx:9984 msgid "Options" msgstr "Opcje" #: src/dialogs/confdialog.cxx:9987 msgid "send when logged (log button, , )" msgstr "Wyslij po zalogowaniu (log przycisk, , )" #: src/dialogs/confdialog.cxx:9988 msgid "automatic data upload" msgstr "automatyczne wysylanie danych" #: src/dialogs/confdialog.cxx:9993 msgid "Default message" msgstr "Komunikat domyslny" #: src/dialogs/confdialog.cxx:9994 msgid "default text to send with etc" msgstr "Domyslny tekst, aby wysÅ‚ac ze itp" #: src/dialogs/confdialog.cxx:10008 msgid "Text Tags (tags use {} delimiters)" msgstr "Tekst Tagów (tagi uzyj {} ograniczniki )" #: src/dialogs/confdialog.cxx:10011 #, fuzzy msgid " {CALL} other ops call sign" msgstr "{CALL} inna Stacja" #: src/dialogs/confdialog.cxx:10014 #, fuzzy msgid " {MODE} full mode / submode" msgstr "{MODE} peÅ‚ny tryb / pod tryb" #: src/dialogs/confdialog.cxx:10017 msgid "{NAME} other ops name" msgstr "{NAME} inna nazwa" #: src/dialogs/confdialog.cxx:10020 msgid "These tags can also be used in " msgstr "Znaczniki te mogÄ… byc wykorzystywane w " #: src/dialogs/confdialog.cxx:10024 msgid "Use date/time off for log entry" msgstr "Uzyj data/czas do wpisu w logu" #: src/dialogs/confdialog.cxx:10025 msgid "default uses date/time on" msgstr "domyslnie korzysta data / czas na" #: src/dialogs/confdialog.cxx:10043 msgid "Auto start programs with fldigi" msgstr "" #: src/dialogs/confdialog.cxx:10046 msgid "flrig:" msgstr "" #: src/dialogs/confdialog.cxx:10047 src/dialogs/confdialog.cxx:10065 #: src/dialogs/confdialog.cxx:10083 src/dialogs/confdialog.cxx:10101 #: src/dialogs/confdialog.cxx:10119 src/dialogs/confdialog.cxx:10137 #: src/dialogs/confdialog.cxx:10155 #, fuzzy msgid "" "Enter full path-filename for external program\n" "Or simple name of program" msgstr "Wpisz peÅ‚na sciezke, nazwe pliku flmsg" #: src/dialogs/confdialog.cxx:10060 src/dialogs/confdialog.cxx:10078 #: src/dialogs/confdialog.cxx:10096 src/dialogs/confdialog.cxx:10114 #: src/dialogs/confdialog.cxx:10132 src/dialogs/confdialog.cxx:10150 #: src/dialogs/confdialog.cxx:10168 #, fuzzy msgid "Locate" msgstr "Lokator" #: src/dialogs/confdialog.cxx:10061 #, fuzzy msgid "Locate flrig executable" msgstr "Zlokalizuj flmsg exe" #: src/dialogs/confdialog.cxx:10064 msgid "flamp:" msgstr "" #: src/dialogs/confdialog.cxx:10079 #, fuzzy msgid "Locate flamp executable" msgstr "Zlokalizuj flmsg exe" #: src/dialogs/confdialog.cxx:10082 msgid "flnet:" msgstr "" #: src/dialogs/confdialog.cxx:10097 #, fuzzy msgid "Locate flnet executable" msgstr "Zlokalizuj flmsg exe" #: src/dialogs/confdialog.cxx:10100 msgid "fllog:" msgstr "" #: src/dialogs/confdialog.cxx:10115 #, fuzzy msgid "Locate fllog executable" msgstr "Zlokalizuj flmsg exe" #: src/dialogs/confdialog.cxx:10118 msgid "Prog 1:" msgstr "" #: src/dialogs/confdialog.cxx:10133 #, fuzzy msgid "Locate program #1 executable" msgstr "Zlokalizuj flmsg exe" #: src/dialogs/confdialog.cxx:10136 msgid "Prog 2:" msgstr "" #: src/dialogs/confdialog.cxx:10151 #, fuzzy msgid "Locate program #2 executable" msgstr "Zlokalizuj flmsg exe" #: src/dialogs/confdialog.cxx:10154 msgid "Prog 3:" msgstr "" #: src/dialogs/confdialog.cxx:10169 #, fuzzy msgid "Locate program #3 executable" msgstr "Zlokalizuj flmsg exe" #: src/dialogs/confdialog.cxx:10172 #, fuzzy msgid "" "Enable\n" "-" msgstr "Wlacz" #: src/dialogs/confdialog.cxx:10173 src/dialogs/confdialog.cxx:10180 #: src/dialogs/confdialog.cxx:10186 src/dialogs/confdialog.cxx:10192 #: src/dialogs/confdialog.cxx:10198 src/dialogs/confdialog.cxx:10204 #: src/dialogs/confdialog.cxx:10210 msgid "Enable this entry when fldigi first starts" msgstr "" #: src/dialogs/confdialog.cxx:10215 src/dialogs/confdialog.cxx:10219 #: src/dialogs/confdialog.cxx:10223 src/dialogs/confdialog.cxx:10227 #: src/dialogs/confdialog.cxx:10231 src/dialogs/confdialog.cxx:10235 #: src/dialogs/confdialog.cxx:10239 #, fuzzy msgid "Test" msgstr "Test..." #: src/dialogs/confdialog.cxx:10216 #, fuzzy msgid "Start flrig" msgstr "Start" #: src/dialogs/confdialog.cxx:10220 #, fuzzy msgid "Start flamp" msgstr "Data rozpoczÄ™cia " #: src/dialogs/confdialog.cxx:10224 #, fuzzy msgid "Start flnet" msgstr "Data rozpoczÄ™cia " #: src/dialogs/confdialog.cxx:10228 #, fuzzy msgid "Start fllog" msgstr "Start" #: src/dialogs/confdialog.cxx:10232 #, fuzzy msgid "Start prog1" msgstr "Start" #: src/dialogs/confdialog.cxx:10236 #, fuzzy msgid "Start prog2" msgstr "Start" #: src/dialogs/confdialog.cxx:10240 #, fuzzy msgid "Start prog3" msgstr "Start" #: src/dialogs/confdialog.cxx:10255 msgid "Restore defaults" msgstr "Przywroc domyslne" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "Kolor czcionki" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "Czcionka:" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "Rozmiar:" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "&OK" #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" "To szalone lis przeskoczyÅ‚ nad psem ponownie!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #: src/dialogs/font_browser.cxx:283 msgid "Reading fonts..." msgstr "Czytanie czcionek...." #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 #, fuzzy msgid "Data files sources" msgstr "Pliki FLMSG..." #: src/dialogs/record_browse.cxx:27 #, fuzzy msgid "Data files update" msgstr "Pliki FLMSG..." #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "" #: src/dialogs/record_browse.cxx:43 #, fuzzy msgid "Data source" msgstr "Log podstawowy" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Wydarzenie" #: src/dialogs/notifydialog.cxx:112 msgid "RE:" msgstr "RE:" #: src/dialogs/notifydialog.cxx:124 msgid "Enabled" msgstr "Aktywne" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filtr" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "Podmiot DXCC" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Podmioty DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "Nie pracowal wczesniej" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "Uzytkownik LotW" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "Uzytkownik eQSL" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Duplikaty" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Ignoruj duplikaty" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "odebr:" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Czas (y):" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Akcja" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "Limit wyzwalania (s):" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Minimalny czas miÄ™dzy zdarzeniami" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Pokaz okno alertu:" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Wstaw tekst domyslny" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Ukryj okno po (s):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "Dolacz do tekstu RX:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "Dołącz do tekstu TX:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Pokaz edytor makro" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Uruchom program:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "Podmioty DXCC" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Znajdz kraj:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Nacisnij przycisk return, aby kontynuowac wyszukiwanie" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Szukaj prefiks:" #: src/logbook/lgbook.cxx:397 msgid "Export Setup" msgstr "Ustawienie Eksportu" #: src/logbook/lgbook.cxx:398 src/logbook/lgbook.cxx:1040 msgid "Select Records to Export" msgstr "Wybierz Rekordy do eksportu" #: src/logbook/lgbook.cxx:406 src/logbook/lgbook.cxx:456 #: src/logbook/lgbook.cxx:1048 src/logbook/lgbook.cxx:1122 msgid "Check All" msgstr "Zaznacz wszystko" #: src/logbook/lgbook.cxx:409 msgid "Start Date" msgstr "Data rozpoczÄ™cia " #: src/logbook/lgbook.cxx:410 msgid "Start date for export" msgstr "Data rozpoczecia do eksportu" #: src/logbook/lgbook.cxx:423 msgid "Stop Date" msgstr "Data koncowa" #: src/logbook/lgbook.cxx:424 msgid "Inclusive stop date for export" msgstr "Ustaw datÄ™ koncowa do eksportu" #: src/logbook/lgbook.cxx:437 msgid "select by date" msgstr "Wybierz wedÅ‚ug daty" #: src/logbook/lgbook.cxx:438 msgid "Enable to select date range" msgstr "Wlacz, aby wybrac zakres dat" #: src/logbook/lgbook.cxx:450 msgid "Select Fields to Export" msgstr "Wybierz pole do Eksportu" #: src/logbook/lgbook.cxx:478 msgid "QSO Date On" msgstr "Data QSO" #: src/logbook/lgbook.cxx:482 msgid "QSO Date Off" msgstr "Data zakonczenia QSO" #: src/logbook/lgbook.cxx:486 msgid "Time ON" msgstr "Czas rozpocz." #: src/logbook/lgbook.cxx:490 src/logbook/lgbook.cxx:1091 msgid "Time OFF" msgstr "Czas zakoncz." #: src/logbook/lgbook.cxx:494 msgid "TX Power" msgstr "Moc Tx" #: src/logbook/lgbook.cxx:497 src/logbook/lgbook.cxx:1095 msgid "RST sent" msgstr "RST wysl." #: src/logbook/lgbook.cxx:501 src/logbook/lgbook.cxx:1099 msgid "RST rcvd" msgstr "RST odebr." #: src/logbook/lgbook.cxx:505 src/logbook/lgbook.cxx:731 msgid "Qth" msgstr "Qth" #: src/logbook/lgbook.cxx:508 msgid "LOC" msgstr "Lokator" #: src/logbook/lgbook.cxx:515 src/logbook/lgbook.cxx:876 msgid "QSL-VIA" msgstr "" #: src/logbook/lgbook.cxx:527 msgid "QSL rcvd date" msgstr "Data odebr. QSL" #: src/logbook/lgbook.cxx:530 msgid "QSL sent date" msgstr "Data wysl. QSL" #: src/logbook/lgbook.cxx:533 src/logbook/lgbook.cxx:1103 msgid "Serial # in" msgstr "Numer # odebrany" #: src/logbook/lgbook.cxx:536 src/logbook/lgbook.cxx:1107 msgid "Serial # out" msgstr "Numer # nadany" #: src/logbook/lgbook.cxx:545 src/logbook/lgbook.cxx:804 #: src/logbook/lgbook.cxx:805 msgid "County" msgstr "Prowincja" #: src/logbook/lgbook.cxx:551 src/logbook/lgbook.cxx:828 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:554 src/logbook/lgbook.cxx:864 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:557 src/logbook/lgbook.cxx:816 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:560 src/logbook/lgbook.cxx:840 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:570 msgid "Logbook" msgstr "Logbook" #: src/logbook/lgbook.cxx:571 msgid "Date On" msgstr "Data" #: src/logbook/lgbook.cxx:572 msgid "Date QSO started" msgstr "Data rozpoczecia QSO" #: src/logbook/lgbook.cxx:585 msgid "Time QSO started" msgstr "Czas startu QSO" #: src/logbook/lgbook.cxx:597 msgid "Call sign worked" msgstr "Stacja pracowaÅ‚a" #: src/logbook/lgbook.cxx:609 msgid "Operator worked" msgstr "Operator pracowaÅ‚" #: src/logbook/lgbook.cxx:621 msgid "Rst received" msgstr "RST odebrane" #: src/logbook/lgbook.cxx:632 msgid "QSL-rcvd" msgstr "QSL-odebrana" #: src/logbook/lgbook.cxx:633 msgid "QSL received on this date" msgstr "QSL otrzymana w dniu" #: src/logbook/lgbook.cxx:645 msgid "Date Off" msgstr "Data zakonczenia" #: src/logbook/lgbook.cxx:646 msgid "Date QSO Ended" msgstr "Data zakonczenia QSO" #: src/logbook/lgbook.cxx:659 msgid "Time QSO ended" msgstr "Koniec QSO" #: src/logbook/lgbook.cxx:670 msgid "Freq." msgstr "Czestotliwosc" #: src/logbook/lgbook.cxx:671 msgid "Frequency in MHz" msgstr "Czestotliwosc w MHz" #: src/logbook/lgbook.cxx:683 msgid "Mode in use" msgstr "Tryb pracy" #: src/logbook/lgbook.cxx:694 #, fuzzy msgid "Pwr" msgstr "Pr" #: src/logbook/lgbook.cxx:695 msgid "Transmit power used" msgstr "Moc nadawania" #: src/logbook/lgbook.cxx:707 msgid "Rst sent" msgstr "RST wyslane" #: src/logbook/lgbook.cxx:718 msgid "QSL-sent" msgstr "QSL-wysÅ‚ana" #: src/logbook/lgbook.cxx:719 msgid "QSL sent on this date" msgstr "QSL wysylana w dniu" #: src/logbook/lgbook.cxx:732 msgid "City of station worked" msgstr "Stacja pracowaÅ‚a z Miasta " #: src/logbook/lgbook.cxx:743 msgid "St" msgstr "St" #: src/logbook/lgbook.cxx:744 msgid "US state of station worked" msgstr "Stacja pracowaÅ‚a ze stanu USA" #: src/logbook/lgbook.cxx:755 msgid "Pr" msgstr "Pr" #: src/logbook/lgbook.cxx:756 msgid "Province of station worked" msgstr "Stacja pracowaÅ‚a z Prowincji " #: src/logbook/lgbook.cxx:768 msgid "Country of station worked" msgstr "Stacja pracowaÅ‚a z Kraju" #: src/logbook/lgbook.cxx:779 msgid "Loc" msgstr "Lok" #: src/logbook/lgbook.cxx:780 msgid "Stations grid square" msgstr "Siatka kwadratów" #: src/logbook/lgbook.cxx:792 #, fuzzy msgid "Interesting notes" msgstr "Ciekawe notatki (80 znaków max )" #: src/logbook/lgbook.cxx:817 msgid "Islands on the air" msgstr "Wyspa" #: src/logbook/lgbook.cxx:852 msgid "CONT" msgstr "Kontynent" #: src/logbook/lgbook.cxx:865 msgid "DXCC designator" msgstr "Identyfikator DXCC" #: src/logbook/lgbook.cxx:877 msgid "QSL route of contacted station" msgstr "" #: src/logbook/lgbook.cxx:888 #, fuzzy msgid "Ser out" msgstr "Nr# wyslany" #: src/logbook/lgbook.cxx:889 #, fuzzy msgid "Contest serial # sent" msgstr "Zawody numer # wyslany" #: src/logbook/lgbook.cxx:901 msgid "Contest exchange sent" msgstr "Zawody wymiana wyslana" #: src/logbook/lgbook.cxx:912 msgid "Ser in" msgstr "" #: src/logbook/lgbook.cxx:913 msgid "Contest serial # received" msgstr "Zawody numer # odebrany" #: src/logbook/lgbook.cxx:925 msgid "Contest exchange received" msgstr "Zawody wymiana odebrana" #: src/logbook/lgbook.cxx:936 msgid "Call Search" msgstr "Szukaj Stacji" #: src/logbook/lgbook.cxx:937 msgid "Search for this callsign" msgstr "Szukaj tego znaku" #: src/logbook/lgbook.cxx:948 msgid "Recs" msgstr "Liczba QSO" #: src/logbook/lgbook.cxx:949 msgid "# Records in logbook" msgstr "# Zapisy w dzienniku" #: src/logbook/lgbook.cxx:961 msgid "New record / Save record" msgstr "Nowy rekord / Zapisz rekord" #: src/logbook/lgbook.cxx:968 msgid "Update the current record" msgstr "Aktualizuj aktualny rekord" #: src/logbook/lgbook.cxx:975 msgid "Delete the current record" msgstr "Kasuj aktualny rekord" #: src/logbook/lgbook.cxx:981 msgid "Dial" msgstr "Tarcza" #: src/logbook/lgbook.cxx:982 msgid "Retrieve for active modem use" msgstr "Pobierz dla aktywnego modemu" #: src/logbook/lgbook.cxx:989 msgid "Find previous" msgstr "Znajdz poprzedni" #: src/logbook/lgbook.cxx:997 msgid "Find next" msgstr "Szukaj nastepny" #: src/logbook/lgbook.cxx:1020 msgid "Date" msgstr "Data" #: src/logbook/lgbook.cxx:1022 msgid "Time" msgstr "Czas" #: src/logbook/lgbook.cxx:1039 msgid "Cabrillo Setup" msgstr "Ustawienia Cabrillo" #: src/logbook/lgbook.cxx:1059 msgid "Select Cabrillo Contest & Fields" msgstr "Wybierz Cabrillo Konkurs & Pola" #: src/logbook/lgbook.cxx:1062 msgid "Contest:" msgstr "Zawody:" #: src/logbook/lgbook.cxx:1087 msgid "QSO Date" msgstr "Data QSO" #, fuzzy #~ msgid "Char set" #~ msgstr "Wyczysc listÄ™" #~ msgid "Select serial port" #~ msgstr "Wybierz port szeregowy" #~ msgid "Serial device" #~ msgstr "Port szeregowy urzÄ…dzenia" #~ msgid "Select the rig by name" #~ msgstr "Wybierz rig wg nazwy" #~ msgid "Serial port" #~ msgstr "Port szeregowy" #~ msgid "Serial port baud rate" #~ msgstr "Port szeregowy szybkosc transmisji" #~ msgid "" #~ "Force the rig sideband. Takes\n" #~ "effect when rig mode changes." #~ msgstr "" #~ "Wymuszenie rig wstÄ™gi bocznej. Trwa\n" #~ "efekt, gdy rig zmieni tryb .." #~ msgid "FFT latency (scan merging)" #~ msgstr "FFT opóznienie (skanowanie polaczenia)" #~ msgid "" #~ "Latency increases frequency resolution,\n" #~ "decreases time resolution. 1 = no scan merging" #~ msgstr "" #~ "Opóznienie zwiÄ™ksza rozdzielczosc czÄ™stotliwosci\n" #~ "zmniejsza rozdzielczosc czasowÄ…. 1 = bez skanowania polaczenia" #~ msgid "Save image as:" #~ msgstr "Zapisz obraz jako:" #~ msgid "Hide" #~ msgstr "Ukryj" #~ msgid "Colors and Fonts" #~ msgstr "Kolory i czcionki" #, fuzzy #~ msgid "Disp" #~ msgstr "Wyswietl" #, fuzzy #~ msgid "Select Char Set" #~ msgstr "Wybierz parytet" #~ msgid "64-bit (long) interleave" #~ msgstr "64-bitowy (dÅ‚ugi) Przeplot" #, fuzzy #~ msgid "Reset Filter to Optimum bandwidth" #~ msgstr "Filtr odbiorczy szerokosci pasma" #, fuzzy #~ msgid "Filter Quality" #~ msgstr "Przepustowosc filtru" #~ msgid "Navtex stations file:" #~ msgstr "Plik stacji Navtex" #~ msgid "Received fax maximum rows number (5000)" #~ msgstr "Odebrano maksymalnÄ… liczbÄ™ wierszy fax (5000)" #~ msgid "Maximum row number for a received fax image." #~ msgstr "Maksymalna liczba wierszy dla uzyskanego obrazu faksu" #~ msgid "Memory Mapped Rig" #~ msgstr "Pamiec zamapowana Rig" #~ msgid "Set page width" #~ msgstr "Ustaw szerokosc strony" #~ msgid "after:" #~ msgstr "po:" #~ msgid "RX" #~ msgstr "RX" #~ msgid "TX" #~ msgstr "TX" #~ msgid "X-agc (hidden)" #~ msgstr "X-agc (ukryj)" #~ msgid "MemMap" #~ msgstr "MemMap" #~ msgid "" #~ "Control via Memory Mapped\n" #~ "shared variables\n" #~ "i.e.: Kachina program" #~ msgstr "" #~ "Sterowanie poprzez zmapowane\n" #~ "wspólne zmienne\n" #~ "czyli: program Kachina" #~ msgid "Use Memmap" #~ msgstr "Uzyj Memmap" #~ msgid "Rig control via memory mapped Kachina" #~ msgstr "Kontrola Rig przez Zmapowane Kachina" #~ msgid "Use Memmap PTT" #~ msgstr "Uzyj Memmap PTT" #~ msgid "Initialize Memmap interface" #~ msgstr "Inicjalizuj interfejs Memmap" #, fuzzy #~ msgid "Displays" #~ msgstr "Wyswietl" #~ msgid "Tx Power" #~ msgstr "Moc Tx" #~ msgid "Ser# in" #~ msgstr "Nr# odebrany" #~ msgid "QSO Freq" #~ msgstr "Czest. QSO" #~ msgid "Cnty" #~ msgstr "Kraj" #~ msgid "Az" #~ msgstr "Az" #~ msgid "#Out" #~ msgstr "RSTw" #~ msgid "#In" #~ msgstr "RSTo" #~ msgid "Xchg" #~ msgstr "Xchg" #~ msgid "File exists. Are you sure you want to overwrite?" #~ msgstr "Plik istnieje. Czy na pewno chcesz go zastÄ…pic?" #~ msgid "Tracking range (WPM)" #~ msgstr "Sledzenie zakresu (WPM)" #~ msgid "DomEX" #~ msgstr "DomEX" #~ msgid "Contestia" #~ msgstr "Contestia" #~ msgid "On Date" #~ msgstr "Data rozpoczÄ™cia" #~ msgid "Off Date" #~ msgstr "Data zakonczenia" #~ msgid "Save log before exiting?" #~ msgstr "Zapisz log przed wyjÅ›ciem z programu?" #~ msgid "Save changed macros before exiting?" #~ msgstr "Zapisac zmienione makra przed wyjsciem?" #~ msgid "View log" #~ msgstr "Zobacz log" #~ msgid "A message was logged" #~ msgstr "Wiadomość zostaÅ‚a zalogowana" #~ msgid "The right audio channel is disabled. Enable it now?" #~ msgstr "Prawy kanaÅ‚ audio jest wylaczony. WÅ‚aczyc teraz?" #~ msgid "Gen'" #~ msgstr "Ogolne" #~ msgid "Double-click on RX text enters QSO data" #~ msgstr "Kliknij dwukrotnie na tekst RX wchodzi QSO danych" #~ msgid "Rx Text" #~ msgstr "Tekst RX" #~ msgid "Log server" #~ msgstr "Log serwer" #~ msgid "Server Port:" #~ msgstr "Port serwera" #~ msgid "Bandwidth cursor" #~ msgstr "kursor szerokoÅ›ci pasma" #~ msgid "Cursor color" #~ msgstr "Kolor kursora" #~ msgid "Cursor center line" #~ msgstr "Kursor linia Å›rodkowa" #~ msgid "Bandwidth tracks" #~ msgstr "Pasmo Å›cieżki" #~ msgid "Tracks color" #~ msgstr "kolor Å›cieżki" #~ msgid "Wide tracks" #~ msgstr "Szerokie Å›cieżki" #~ msgid "Wide center line" #~ msgstr "Szeroka linia Å›rodkowa" #~ msgid "Wide cursor" #~ msgstr "szeroki kursor" #~ msgid "Enable right audio channel" #~ msgstr "Włącz prawy kanaÅ‚ audio" #~ msgid "TxLevel" #~ msgstr "Poziom TX" #~ msgid "Tx Atten (dB)" #~ msgstr "Aten. Tx (dB)" #~ msgid "QRZ/etal" #~ msgstr "QRZ/etal" #~ msgid "Not available" #~ msgstr "NiedostÄ™pne" #~ msgid "CDROM" #~ msgstr "CDROM" #~ msgid "Subscriber data" #~ msgstr "Informacje o użytkowniku" #~ msgid "eQSL upload when record logged" #~ msgstr "eQSL przesÅ‚ać gdy zapis zalogowany" #~ msgid "Default message sent with eQSL" #~ msgstr "DomyÅ›lna wiadomość wysÅ‚ana z eQSL" #~ msgid "FH" #~ msgstr "Feld Hell" #~ msgid "Packet" #~ msgstr "Pakiet" #~ msgid "Select packet baudrate" #~ msgstr "Wybierz szybkoÅ›c pakietów" #~ msgid "RX Low Freq Gain" #~ msgstr "RX niski zysk CzÄ™st" #~ msgid "Processing gain to apply to lower tone (in dB)" #~ msgstr "Przetwarzanie wzmocnienia stosuje siÄ™ do niższego tonu (w dB)" #~ msgid "RX High Freq Gain" #~ msgstr "RX Wysoki Zysk CzÄ™st" #~ msgid "Processing gain to apply to higher tone (in dB)" #~ msgstr "Zysk przetwarzania stosuje siÄ™ do wyższego tonu (w dB)" #~ msgid "TX Low Freq Gain" #~ msgstr "Zmniejsz zysk czÄ™st.Tx" #~ msgid "TX High Freq Gain" #~ msgstr "Zysk czÄ™st. Tx" #~ msgid "add RX timestamps" #~ msgstr "dodaj znaczniki czasu RX" #~ msgid "Prepend timestamp to each RX packet" #~ msgstr "Dopisuje znacznik czasu do każdego pakietu RX" #~ msgid "decode Compressed data" #~ msgstr "dekodowanie danych skompresowanych" #~ msgid "Decode received Compressed Position data" #~ msgstr "Dekodowanie oodebranych skompresowanych danych pozycjonowania" #~ msgid "decode Mic-E data" #~ msgstr "dekodowania danych Mic-E" #~ msgid "Decode received Mic-E data" #~ msgstr "Dekodowanie odebranych danych Mic-E" #~ msgid "decode PHG data" #~ msgstr "dekodowania danych PHG" #~ msgid "Decode received PHG data" #~ msgstr "Dekodowania odebranych danych PHG" #~ msgid "use SI units" #~ msgstr "używaj jednostek SI" #~ msgid "Display decoded data values in SI units" #~ msgstr "WyÅ›wietl zdekodowane wartoÅ›ci danych w jednostkach SI" #~ msgid "use English units" #~ msgstr "używaj angielskich jednostek" #~ msgid "Display decoded data in English units" #~ msgstr "WyÅ›wietl zdekodowane dane w jednostkach angielskich" #~ msgid "Use cross-hair scope" #~ msgstr "Użyj oscyloskopu cross-hair" #~ msgid "Defaults to syncscope instead of phase (cross-hair) scope" #~ msgstr "DomyÅ›lnie syncscope zamiast zakres fazy (cross -hair )" #~ msgid "add additional gain to audio input for low-output interfaces" #~ msgstr "" #~ "dodaj dodatkowe wzmocnienie wejÅ›cia audio dla niskich wyjÅ›ciowych " #~ "interfejsów" #~ msgid "Display true frequency in the waterfall" #~ msgstr "WyÅ›wietl prawdziwÄ… czÄ™stotliwość w wodospadzie" #~ msgid "" #~ "Enable to show the true transmit frequency on the waterfall when the " #~ "radio is in CW (A1A) mode" #~ msgstr "" #~ "Włącz, aby pokazać prawdziwy czÄ™stotliwość nadawania na wodospadzie gdy " #~ "radio jest w CW ( A1A ) trybie)" #~ msgid "Corrupt ADIF file" #~ msgstr "Uszkodzony plik ADIF" #~ msgid "Callsign DB" #~ msgstr "Stacja DB" #~ msgid "Paid online subscription" #~ msgstr "PÅ‚atny abonament internetowy" #~ msgid "Text:" #~ msgstr "Tekst:" #~ msgid "\tTx digits string" #~ msgstr "\tTx cyfrowy ciÄ…g DTMF" #~ msgid "Freq Analysis" #~ msgstr "Analiza czÄ™stotliwoÅ›ci" #~ msgid "flmsg specific" #~ msgstr "flmsg specyficzny" #~ msgid "Autostart flmsg upon detection of compatible file" #~ msgstr "Autostart flmsg po wykryciu zgodnego pliku" #~ msgid "Autostart flmsg / browser upon detection of compatible file" #~ msgstr "Autostart flmsg / browser po wykryciu zgodnego pliku" #~ msgid "Auto Extract files from rx stream" #~ msgstr "WyodrÄ™bnia pliki auto z strumienia Rx" #~ msgid "" #~ "0\n" #~ "1\n" #~ "2" #~ msgstr "" #~ "0\n" #~ "1\n" #~ "2" #~ msgid "Enable detection && extraction" #~ msgstr "Włącz pobieranie && wykrywanie" #~ msgid "Auto open wrap folder" #~ msgstr "Auto Otwórz folder Wrap" #~ msgid "Search for reg-exp in browser text(s)" #~ msgstr "Szukaj reg - exp w tekÅ›cie przeglÄ…darki (S)" #, fuzzy #~ msgid "Width (% of panel)" #~ msgstr "Szerokość ( % z panelu)" #, fuzzy #~ msgid "Adjust viewer width as % of panel width" #~ msgstr "Dopasuj szerokość przeglÄ…darki jako procent szerokoÅ›ci panelu" #, fuzzy #~ msgid "1 bar" #~ msgstr "1 Bar" #, fuzzy #~ msgid "2-A" #~ msgstr "2-A" #, fuzzy #~ msgid "2-B" #~ msgstr "2-B" #, fuzzy #~ msgid "2-C" #~ msgstr "2-C" fldigi-3.21.80/po/es.gmo0000664000175000017500000030736412313333722011613 00000000000000Þ•’¬,m}j}~} “} ´}Õ} ë}÷}~~,~;~J~/\~Œ~¤~!»~Ý~ú~":N!i‹¨Ä"Ô ÷+€D€c€|€ Œ€'™€Á€à€ü€!(?hz ™º Í"Û'þ&‚+‚@‚_‚&}‚¤‚º‚Ђä‚ö‚ ƒ&ƒ9ƒNƒSƒ Wƒdƒsƒ ƒƒƒ ƒ ¥ƒ±ƒ·ƒ¿ƒÔƒòƒùƒ$ýƒ&"„I„&_„!†„¨„±„É„â„ú„Cþ„ B…O…&c… Š… •… …,¾…ë…#ô…†+†>†D†J†D\† ¡† ¯†º†ʆ*݆‡/‡L‡2b‡•‡µ‡Ó‡܇ø‡,ˆ AˆKˆ`ˆhˆmˆ)uˆ)Ÿˆ)Ɉ1óˆ %‰ 3‰@‰E‰ V‰`‰ t‰ ~‰‰‰š‰®‰·‰ʉщÙ‰í‰ ŠŠŠ 'Š2ŠFŠKŠ)OŠyŠŠ…ŠŽŠ•ŠšŠ Š©Š¹ŠØŠ ðŠúŠ ‹ (‹6‹ E‹Q‹ V‹ b‹n‹4‹´‹½‹ Ï‹8Ù‹ Œ Œ'Œ/ŒLŒ [Œ#|Œ+ ŒÌŒÕŒ ìŒúŒ& BNn ˆ © ¶Ä(ÕþŽ+*Ž VŽdŽ7sŽ «Ž ¶ŽÀŽÕŽ'çŽW$/|¬'Äìñ52h n0x © ´%À&æ3 ‘A‘ S‘a‘w‘ }‘ˆ‘Ž‘¢‘²‘ őґç‘e’i’}’ ‘’œ’ ¤’ ²’¿’*Ñ’ü’“ ““8“N“h“~“ ‡“‘“¦““Ë“ ê“ô“ù“ ””.”H”;`”œ”²”º”Ô”+Û”••/2•b• r•• ’•œ• •¥• ­•·•À•וç•ì• ü• ––(–9–O–b– t–.‚– ±–½––Ë–Ó–â–ó–— —&—C8—V|—Ó—+Û—˜!˜7˜N˜ j˜v˜#“˜·˜ǘ㘙" ™#/™S™Z™$k™™ª™.³™§â™¤Šš/›E›U›m›„›Œ›”›,™› ƛқٛ Ý›ê› ÿ› œ/œ:Oœ8ŠœÜ՜ݜ!ùœJ0f!—¹*Ö žž žž4ž1Lž ~žˆž £ž®ž Éž Ôžàž,óž Ÿ;ŸBŸKŸkŸ…Ÿ¡Ÿ ÀŸ9ËŸ% + 0H 2y ¬ * +í ,¡ F¡g¡ƒ¡P‹¡EÜ¡"¢ 8¢F¢f¢‚¢’¢?¡¢$á¢G£"N£-q£Ÿ£º£À£Ñ£ Ö£ᣠç£ñ£ ô£ ¤ ¤¤1¤O¤ T¤qa¤ Ó¤ à¤í¤¥¥ 4¥:>¥1y¥«¥±¥µ¥Æ¥ Õ¥ ã¥î¥ ¦¦ "¦ -¦ ;¦:\¦—¦ œ¦3ª¦Þ¦å¦ù¦ §)"§ L§ V§ d§ n§ {§‰§§—§§§¸§ͧ$駨$#¨H¨[¨j¨r¨ w¨‚¨Ѝ¨b¨¨! ©/-©#]©$© ¦©Ç©ã©è© î©ø© ªª2ª;ª @ªLª4Tª,‰ª¶ª¾ªƪΪ+âª#«/2« b«n«u« ‘«ž«§«°«$ɫ ¬%¬+¬.¬2¬7¬@¬E¬W¬Z¬ m¬x¬—¬¶¬»¬Ьå¬ü¬ ­­:­Y­ u­!–­¸­Õ­9é­#®7®F®,_® Œ®6š® Ñ® Ý®þ®¯0¯<J¯‡¯š¯®¯²¯@̯ °!° @°N° R°]°*f°I‘°6Û°<±0O±,€±9­±ç±.²05²Ïf²6³ T³2u³¨³$°³Õ³سݳð³$´:%´`´h´l´ s´´•´§´¿´ ×´ä´ü´µ,µIµfµƒµ‹µ”µ¬µ °µѵìµÿµ¶ 2¶>¶F¶U¶]¶Mt¶¶ Û¶ è¶ò¶2ö¶)·C· I·U·u·‹·¢·²·¸· Ë·Ö·æ·í·¸ ¸ 7¸ D¸N¸ b¸m¸|¸•¸œ¸¬¸µ¸ ¼¸ɸ3Ú¸/¹>¹Z¹_¹e¹ j¹v¹†¹—¹ ¹'«¹Ó¹Ú¹õ¹º# º(1º'Zº‚º"™º¼ºܺ󺻻 »:»&I»p»€»…»‹»’»–»¯»´»·»º»λá»ò»¼¼¼¼-¼3¼ 9¼ G¼!S¼!u¼J—¼â¼å¼(è¼B½ T½;u½1±½ã½ ç½ñ½ õ½ÿ½¾ ¾ ¾¾.¾H¾`¾c¾l¾ u¾¾ž¾®¾À¾оä¾ ü¾ ¿(¿D¿T¿/\¿Œ¿•¿ ª¿¸¿ ȿֿé¿/ø¿(À0À 6À AÀLÀPÀUÀYÀ ]À jÀuÀ”À&³ÀÚÀ#ôÀÁ 0ÁQÁ hÁrÁyÁ‘ÁšÁ Á¯Á.ÈÁ÷Á *Â4Â/T„ ŠÂ”ªÂÃÂÆÂÖÂîÂ#Ã%Ã5ÃTÃ0f×ßçïÃÌÃßÃúÃ&Ä;ÄDÄMÄhÄ!ƒÄ¥Ä ­Ä ¹ÄÄÄÈÄ ÌÄ'ÖÄþÄÅÅÅ .Å<ÅVÅ uŃřšŪųмŠÉÅ ÕÅ âÅ*îÅÆ(Æ,Æ 0Æ=ÆBÆ FÆRÆXÆ\Æ`ÆoÆ~Æ‡ÆÆ—Æ ŸÆ©Æ²ÆÉÆÙÆîÆóÆÇ Ç'Ç.ÇvGǾÇÎÇ æÇ È È È1ÈPÈeÈmÈ †È”È ©È¶ÈÍÈæÈÿÈ ÉÉ #É/ÉDÉ3YÉɔɣɪÉÁÉ;ßÉÊ#Ê*)Ê•TÊêÊËË)ËCËbË&sË@šËÛËïË÷ËÌ)Ì=ÌAÌIÌ eÌsÌ$zÌ%ŸÌÅÌÉÌ éÌõÌ Í;%ÍaÍwÍ"€Í!£Í"ÅÍèÍÎÎÎ +Î9Î >ÎKÎ TÎ `ÎmÎp΀·ÎΠΨήγÎÈÎÌÎ ÑÎÞÎäÎ êÎ øÎ ÏÏÏ Ϫ+Ï ÖÏáÏ÷ÏÐ(Ð@Ð^ÐpÐ €Ð Ð,šÐÇÐÙÐáÐçÐ îÐûÐÑ#Ñ5ÑGÑVÑ^ÑeÑzÑ Ñ ˜Ñ¹ÑÑÑåÑþÑÒ /Ò:ÒKÒcÒ xÒ7†Ò ¾ÒÊÒçÒþÒ Ó(Ó CÓ<dÓ¡Ó*½ÓèÓÔ0Ô+EÔqÔ‚Ô ”Ô ŸÔ(­Ô#ÖÔ!úÔÕ"Õ0+Õ\ÕuÕ”Õ›Õ £Õ ¯Õ ¼ÕÊÕÙÕìÕ$Ö,Ö3IÖ}Ö†ÖšÖ·Ö¼ÖÏÖâÖ"ñÖ × "×C×`×q×ƒ×¢×²× Î×!Ü× þ×ØØØ2Ø AØNØ `Ø nØ|Ø*‚Ø ­ØÎØ4îØ #Ù1ÙMÙ_Ù.tÙ£Ù9¹Ù óÙ þÙ ÚÚÚ#Ú,Ú>Ú FÚTÚgÚjÚ pÚ{Ú ‘Ú Ú ©Ú µÚÁÚ ÝÚ éÚ õÚÛÛÛ(Û0ÛDÛ YÛ cÛmÛ-vÛ¤Û ¿ÛÊÛ ÐÛÛÛâÛæÛüÛÜ Ü Ü"Ü)Ü BÜLÜQÜfÜmÜ …Ü‘Ü)–Ü ÀÜ!ÊÜ ìÜùÜ ÝÝ" Ý_CݣݷÝ'ÀÝèÝqðÝ{bÞÞÞ+óÞ/ß%OßBuß:¸ß;óß//à+_à‹àà •àŸà¨à°à¹àÁàÐàáà þà á á%á4á;áJáiápáƒá–á«á±áÉáÒáæáâ ââ8â JâXârâƒâ’â±âÅâÕâïâãã0#ã Tã_ãrã$wãœã°ãÄãØãìãäää ä(ä!Aäcähä kä wääŠä¥äªä½ä8Ääýäå å)åAå\åqåå­åµå ËåÖåéåøå" æ0æFæ]æ eæpæ)„æ®æÂæ׿+÷æ#ç5çJç`ç}çnŒçIûçEèVè^è mèwè ˆè“è:›èÖèÜèëèýèé0é FéTéké ~éˆéžé§é¸éÊé Óé ßé êé÷é ÿé ê-ê=ê EêOêgêzêêªê½êÒêÖê*ìêë3ë7ëJë Pë,[ë ˆë•ë)¬ëÖë%Ûëìì ì'*ìRìcìhìpìyìì¢ì"¦ì5Éì1ÿì1íAíUíXí^íbí xí"‚í ¥í³í¹íÊíàí#ãíî!î &î'0îXî_îfînî~î…îŒî>“îÒîéî üî ïGïeïiï{ïïG‰ïÑïØïçïùïð*ð@ðQðYðað{ðð+žð ÊðÖðîðñ¢ñ»òÀò*Äòïò.óò""ó5Eó{óó ¨ó³óÃó×óàóçó ùóô ôô ô 7ôXôZôˆ`ô éôQöô HõRõgõyõ&˜õ¿õÁõ2Æõùõ ööö2ö7ö#Rövö•ö´ö/Ðö÷÷%:÷2`÷ “÷!´÷3Ö÷ øø*8ø7cø›ø+ ø1Ìøþø!ù?ù^ùoù€ù†ù¥ùªù"Æùméù%Wú}ú=˜újÖúAû]û5tû)ªûÔû ïûûûü)ü<üKüZü+qü!üF¿üý%ý'Aý)iý“ý¬ý Êý2ëýBþaþ'tþ8œþ1Õþ'ÿ"/ÿRÿ eÿ9rÿ(¬ÿ*Õÿ2388l¥#¸.Ü "?29r¬±2Éü?Zv–±Ìç059L[ vƒ  ¥±¹Â&Û ; No.Œ8» ô þ!AZB_¢³6Í  (6E|'„¬ÄÜä)ꇜ±ÂÖ4ö+.J%yIŸ,é  6 !@ -b T  å  ð    4$ 4Y 4Ž Bà   1 7 K Z p € ‘ ¨ Å Ë Ý  ä î 0 4 Q X ` h  † 0Š » à Ç Ð × Ü ß ï # #,  P Z j ‰ ˜  ¶  Ç ß ñ 7 >I f=r°¿È&Ð÷,*;5fœ¥¿Õä2ö)+8d!ƒ ¥³Ã5Û,>Iˆ›F­ ô  $ 7E$}`¢3$7%\‚ ‰ªÃ7Ö@ _mHGÈEVrˆ¦ ­ºÀÜò*4a_ÁÙ ó ÿ -2F yƒ Œ$­Ò(ò 6 @K*` ‹%• »Ç Î Ü/é8LRŸ¹¿ ß;é%B4\‘¢±Ñáèí õÿ +0C R_v"‘´Ææ/û+> DQavŽ«±ÐEçK- y/…"µ Øù$>2N"¤¸*Ò ý''/W^'s› ·IÅÈ ÅØ ž!¸!×!ï! " " !"6,"c"l"u" }"‹" "¨":È"n#Ar#´#Ê#Ò#2î#o!$4‘$Æ$(à$F %P%g% m%x%•%5¯% å%'ð% &;#&_&o&€&1&,Ï&ü& ')'8'&W'&~'¥'6­'.ä'!(:5(5p('¦(Î(&ë(.).A)(p)™)i¢)Q *^*r*&‘*$¸*Ý*ì*L+–N+På+26,Hi, ²,Ó,Ù,ê, î,û,---#- 2->-*\-‡--†¡- (.!5.W.o./‰. ¹.>Å.@/E/K/O/`/r/ ‚/$/²/Ä/Í/ß/î/90 H0R0li0Ö0#Ý01#18?1x1 11£1³1Æ1Î1×1ê1221/2a2)u2Ÿ2¶2Ì2Õ2Ü2 ë2 ÷2$3h)3'’39º39ô3+.4(Z4ƒ4“4˜4 ž4©4»4Ð4 ì4÷45545-N5|5„5Œ5”5+«5*×526 56A6&H6o6x66Š60£6Ô6î6$ó677!7%7*73787K7O7e7t7+7¼7Á7×7í78 8'8"F8i8%‡8'­8Õ8ó8Y 9c99•9<µ9ò9L:Q:(`:$‰:%®:Ô:>í:,;)D;n;r;?Š;Ê; å;<< < &<)2<…\<Lâ<//=-_=/=K½=6 >5@>@v>Õ·>!?*¯?8Ú?@&@B@E@L@d@5}@<³@ ð@ú@ þ@AA4AIAgA …A%’A¸AÖAôA"B6B UB aB&nB•B(™BÂBâBþBC9CKC\CmC}CD–CÛCôCDD4D$PDuD~D7DÇD#ÞDEEENXN pN}N7˜NÐNàN+éNOO8OLO_OpOˆO:œO×OàOåOùO P PPP P (P;3P;oP:«PæPüPQ*1Q\QwQQ‡Q §Q³Q¹Q-ÊQ5øQ .R9RYRvR+…R]±RS S!S7SWSZSjS‰S*¢SÍS2æSTb5T˜T T¨T%°TÖT"ðT'U1;UmU vU#€U¤U&ºUáUéU ùUVV V'V;VCVLV PVqVVV·VÇVâV êV ÷V W WW*W>W)RW|W“W—W ›W©W®W²WÂWÊWÎWÒWæW öWX XX X#X ,X7XOXhX&mX”X ¯X»X,ÂX‘ïX YY*¨Y ÓY áYíY#Z)ZEZMZ mZyZ Z˜Z&²ZÙZùZ [[ #[/[D[1Y[‹[”[¥[9®[)è[K\^\g\7p\Ô¨\}]™]µ]%Ì]*ò]^.0^9_^™^ ²^<½^ú^_-_2_-;_ i_w_.€_.¯_Þ_'ä_ ``>`8X`"‘`´`1Ã`*õ`+ a%Laraya%€a ¦a´a ¹aÆaÏaäa÷aúabb!b3by0wy2¨yÛyày åy ñy ûyzz(zO‹Ž‹•‹œ‹¤‹´‹»‹‹DÉ‹&Œ5ŒMŒ_ŒBwŒºŒ¾Œ ЌڌTâŒ7?Z x™¹Õëôý!Ž?ŽBQŽ”Ž-šŽÈŽÝŽ¥&ÂBî9J…t{úƒiÁ?^aêLˆq’2Ut“@ß8ÝehË=`!¤ æüQpJ»f¬Ž’’ÌT§ýúl‘’3#oŠ¿ØYe¿õûSg\4¤Ú·‘šhT<ÛÙºDHb–R·úOZcÌN]ã˜1€ÿEKp^íKœ›b‹§ù+ˆh )¡s7Ã÷.nì l¡X[‚i?B ÓÕd—œìyU–t©rL©…D¡)¢oª{V5YXÙÝ„P]rèŸaKj¬ËVÜêd.ep˜ò›°c=+„u³=I(t”SYÛhAZ33ÄÂH?´¶i×nÁrÁ ö{7)rn®ð•@ø^<ÉÙÁ1—  -¯/Gnôàr"²¾Ü }Pí÷µì'€Ÿ; “×!!=|¬Gþ‘ê‚¢—A@µb"M†:`ûÇ!\_ô<äH]®W޽ÚSz°£eRß%ƒ¾Ûü kƒ<Ç(%k‡mˆ p·Zó6VdCwÒYEªŽß»z<%½Ÿ!;vÄèñX Ú¾T,gÑšmà]åóèc2_u †¢éOˆ`m4WFµ•msòÐ4ÿ‰Qš™`™O‘fOˆÀ”Ò¢‘ÎÝŒjTE~»;‹ûaaÈœº,i6`ª`.›#,Ü­-«‰W2MïÉf¨¯ÉȦÞ Š\Ê©®>ÍÔL?{ÓìáÖÂHÙGjUˆQuN _éâP2îµR€¼Öðª}¬©½çòü‡¤çCxÿläSЖZ€Æ+²¬^g¶þM {÷—K™¸Ø„‰ÔÏïBE5G$ÿÕv|¦ÌxS|÷Šuó”™¹Lf(y®Œœ ¯Ë!ÍoX,Û~_[ö9]ëŒf>§(ÔC¤#³ö/kDaÏQ‹T*æ8_mgz±oC€É­à‚ ºÍ#'iU:wb)¾Û5í#‰ ;1x¶(»<¡)jöŠ>ñ~ðǦý4ë”c¢‰«ÍH·zýõÓC²K6ÃFzø>Iƒ³y -dÐ0°ðþå=õN¼@’ž}&2DóIqvtø‡»?4ìyÖv_ô >â°Â­¿¨t;)ÅeO8†øæj‡ù“Z–¹"': ЕFkž\#[*A>΂sÀ­RùçòÊ&uålW¦"ÞÝV0FA9Ô˜¦W¼£ ‹1j„6„PÓ$™ d•àz£˜gkpû†•^J¨‚‹lÎè:²ü,$7W¿Ê±ùwý¯ÅÊ@4Lñ£&P¡ ›º0óô‚Ã%s.*6ÀÀ¨üTå¿Í1B$ vc¹„û±Š/3ÈÄÝ [†ÀØ´/¹— }޼Åê pç«Üâ-Ÿ5d‘ß[å… L¼VÔ׆0ñ2ÖéÓËÂ"Þïy/Ã0›N*qõ*’+á.æ3´6%b|Msw©Rôö½&ž¸èAœÿÒ…¸IÄÅÆ}˜H'î-Ø8[~ÏÐVRË:qêl¸Ñ  Ghá¶] ïO ¥MØßë.€\§x³*éòš“½ÎXJ:\yá;È~ÏI0qÕY8‡šÌ5hë¨õ§ñÕI¤…¥úҖѶJQ7ÙéP¥ ã·ä‡ŒqgãbþA"f£@íG¹ÕžÌB®M1ã«X´~^eoKa|æ$CÞB²í'µNZi”xºÁEF+FŽÎÃ(÷sÆ Ò±…îu×ÚŽÜ%'°‰789=QÇ9nƒä}úŠàøŸUYª¾UƒÄnÅwã{žŒD×/ýâxÏ9Þv7±ÊoÈ mÇþÆ´Ñ+|DÉâkî³$äÑŒ“­wJ¯« ,-Ærá5Sù?¥ðNç3Ec&ÖÚ ë  in # R# Records in logbook# S# of multiple scans / character line# retries before giving up# times to resend command before giving up%s log started on %s%s: Do not exist, create?&About&Configure&Contest fields&File&Help&Logbook&MFSK Image&OK&UI&View&Weather Fax Image RX&Weather Fax Image TX**.exe... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ...0 = T; 9 = N1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types14070.1502x Xmt Width (hidden)500 Hz limit8-bit extended characters8-bit extended characters (UTF-8): AFC on,off,toggle my antenna operating band other call clear log fields clear RX pane clear TX pane contest counter untransmitted comment CW identifier decrement counter [Wait][Len](ms) log eQSL optional msg log eQSL insert text file valid xcvr filter width my frequency text to NAME/QTH move to freq NNNN Hz return to sweet spot send mode ID in video text idle signal for NN.nn sec LDT in iso-8601 format insert MFSK image increment counter S/N etc. IMD etc. ZDT in iso-8601 format local date YYYY-MM-DD Local datetime saveQSO data, append msg to notes log at xmt time other locator LOCK on,off,toggle saveQSO data, append msg to notes save QSO data local time HHMM change macro defs file map by value map on google mode my call my locator my name my QTH my RST other name Transmit |NN| successive RsID bursts next QSO rec # pause transmit CW QSK post-timing CW QSK pre-timing insert QRG into Rx text # QSO recs QSO time (HHMM)) qsy to kHz, Hz right-clk QSY button left-clk QSY button other QTH repeat macro continuously Rev on,off,toggle send CAT cmd valid xcvr mode CW rise time other RST receive Rx RSID on,off,toggle save current macro file save contest out search DOWN for signal search UP for signal Digitalk On, Off, Toggle video text repeat every NN sec tune signal for NN sec toggle T/R transmit set xmt attenuator Tx RSID on,off,toggle Fldigi version delay xmt for NN sec CW WPM:Farnsworth get weather data for station get weather data exchange begin exchange end exchange in exchange out zulu date YYYY-MM-DD Z UTC datetime zulu time HHMMZADIFAFCAFC behaviorAFC range (Hz)AFC range or BWAFC speedAFC tracking speedALTRARQ controlAbortAbortedAcquisition S/N (dB)Acquisition search range (Hz)ActionAddAdd CRLF after page width charactersAdd RsID signal to end of transmissionAdd current frequencyAdd geopolitical name of METAR stationAdd mixer controls to main dialogAddress:Adjust cursor frequencyAdjust the DSP bandwidthAdvanced configuration:AllAll settings shown here can be changed later via the Configure menuAllow errorsAllow manual tuningAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAntenna:Appearance of label on each channelAppend to RX text:Append to TX text:ApplyAudioAudio device infoAudio device information is only available for the PortAudio backendAudio devicesAudio fileAudio frequencyAudio input deviceAudio or RF frequencies on waterfall scaleAudio output deviceAudio stream history decoded on selected signalAuto CRLF line lengthAuto connect when fldigi opens (server must be up)Auto start programs with fldigiAuto-fill Country and AzimuthAutoCRLFAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAutostartAvailable substringsAzimuthBackBackgndBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3Background color of signal viewer squelch controlBad frequencyBad modem idBandBands must matchBandwidthBarometric pressureBaud rateBaud rate:Beginners' GuideBehavior of s/n imdBg ColorBits per characterBrowseBrowserBrowser Line ColorsBug me about saving log entriesBuild infoButtonButtonsC&ountriesCAT command for PTTCONTCPUCPU usage increases with waterfall heightCQ zoneCQZCR-CR-LFCSV...CTRLCWCW ID modesCW Postamble IDCW QSK signal on right channelCW dsp filter bandwidthCW is LSBCW transmit WPMCWI detection and suppressionCWI thresholdCabrillo SetupCabrillo...CallCall LookupCall SearchCall sign workedCallook.info lookup (free service US callsigns only)CallsignCallsign databaseCallsign:Can be used in lieu of or in addition to other PTT typesCan. ProvinceCancelCaptureCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture signals within this frequency rangeCapture:Carrier frequency (Hz)Carrier shiftCelsiusCenter display on signalCenter in passband Right click to undoCenter lineChange # of psk viewer channelsChange ONLY to experimentChange application look and feelChange colorChange dir...Change log levelChange positions of low to high channelsChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel labelChannel numberChannels, first channel starts at waterfall lower limitChars/Row:Check AllCheck for duplicatesCheck for updatesCheck for updates when starting programCheck for updates...Check this to be notified when an RSID is received without changing modem and frequencyCheck to reduce CPU load in PSK and RTTY modes.Checking for updates...Choose directory to store KML documentsCityCity of station workedCleanup KML data now !Cleanup on startupCleanups KML documents, empties Google Earth display.ClearClear AllClear channel text after # seconds of inactivityClear listClear list?Clear log controls sets RST in to 599Clear log controls sets RST out to 599Clear log entries after saving or using macro Clear log fields?Clear on saveClient/Server LogbookCloseClose ListColorColor of Mark TrackColors && FontsColors and cursorsColors/FontsCommand line optionsCommand run on KML creationCommand started when KML files are generated. Subprocesses are started once, and restarted if needed.Commands are echoedCompress Rx in timeConditionsConfirmConfirm RESETConfirm exitConnect to serverConnect/disconnect to Talker socket serverCont'ContestContest exchange inContest exchange receivedContest exchange sentContest serial # receivedContest serial # sentContest:ContinentContinuous scrollingControl chars in Rx/Tx paneControlsConvert callsign to upper caseConverterCopyCopy URLCorrectionsCould not check for updates: %sCould not make directory Could not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCountyCreate 1000 Hz square wave on right channelCreate New Logbook?Create cabrillo reportCreate keyed square wave on right audio channelCreate sunspotsCustom shiftCustom text searchCustom...CutDTMFDTR +12DTR +12 vDTR = +VDTR is PTT signal lineDTR is ptt lineDXCCDXCC designatorDXCC entitiesDXCC entityDash to dot ratioData base lookupData files repositoryData files sourcesData files updateData files...Data retention time, in hours (0 for no limit)Data sourceDateDate OffDate OnDate QSO EndedDate QSO startedDate time ON == OFFDebugDecode (CWI suppression)Decode DTMF tonesDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log fileDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Google Earth)DefaultDefault 800 Hz. Deutsche Wetterdienst 850HzDefault CW tracking pointDefault RST in to 599Default RST out to 599Default RTTY tracking pointDefault WPMDefault for all other modemsDefault listen / transmit frequencyDefault messageDefault test string is: "Default to cross hair digiscopeDefaultsDelay NN msec before releasing PTTDelay NN msec before starting audioDeleteDelete from listDelete local data files if selected.Delete the current recordDeselectDetect the THOR preamble Clear the Rx pipelineDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapDetected signal levelDetection LevelDetector high thresholdDetector low thresholdDevice:DevicesDialDifference between Rx & Tx freq (rig offset)Digit ColorDigitsDimDirectory...Disable alert dialogDisable allDisable freq changeDisable further detection when RSID is receivedDisable on very slow CPUs of if signal browser is not usedDisable spotting when signal browser(s) are not visible.Disables detectorDisplayDisplay RX in reverse videoDisplay macro filename on startupDisplay tx and rx in main fldigi window. Change requires restart of fldigiDo not automatically change to RX RsID frequencyDo not show RsID alert dialog boxDo not use callsign databaseDo not use callsign lookup via web browserDocked scopeDomDon't saveDot to dot-space ratioDouble-click to captureDragging on the waterfall scale changes frequencyDup ColorDuplicate check, CALL plusDuplicatesEdge decreases pulse widthEdge shapeEdge timingEmbedded Wefax GuiEmpties KML documents when starting program.Empty ADIF logbook file %sEnableEnable -Enable / disable icons on menusEnable / disable tooltipsEnable DSP prior to decoderEnable MultiPSK-compatible FECEnable allEnable check box to show each respective operator controlEnable drag cursor on waterfall scaleEnable for very weak signalsEnable if you cannot use the middle mouse buttonEnable if you're computer does not decode properlyEnable rx text streamEnable this entry when fldigi first startsEnable this for Latin-1 accented charactersEnable this for UTF-8 character transmissionEnable this for UTF-8 charactersEnable to select date rangeEnabledEnabled - log QSO using Mark frequency Disabled - log QSO using center frequencyEnabled - use Mark/Space filter outputs Disabled - use pseudo signalsEnd of header string:End of xmt IDEnter Port # assigned to serverEnter URL address of serverEnter Xcvr FreqEnter a CALL !Enter frequency or change with Left/Right/Up/Down/Pg_Up/Pg_DownEnter full path-filename for cty.datEnter full path-filename for external program Or simple name of programEnter full path-filename for flmsgEnter test string or leave blank for default:Enter time span in minutesErrorError reading %sEvenEven linesEventEvent logExExchange InExchange OutExchangesExecutable file to insertExecute command on KML files.ExitExit promptsExit prompts active only when File/Exit menu item selected. Not active if window decoration close button pressed.ExperimentalExport SetupExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...Extract files for use with external "wrap / flmsg" programExtract times out after NN seconds of inactivity.F-WPMFECFFT / FIR filterFFT ProcessingFFT averagingFFT filterFFT prefilter window functionFLMSG files...F_keysFahrenheitFast (2 msec)Fax images destination directoryFeel free to skip any pages or exit the wizard at any timeFeldFile I/O onlyFill in Country / Azimuth using cty.dat informationFilterFilter Shape FactorFilter bandwidthFilter bandwidth factorFilter bandwidth relative to signal widthFilteringFind country:Find nextFind prefix:Find previousFind: FinishFixed IntervalsFldigi config...Fldigi configurationFldigi configuration wizardFldigi macro definition file *.{mdf}Fldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFoldersFontFont colorFont...Font:Force RST in/out to 599Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFForce output audio to single channelFree Lossless Audio Codec *.flacFree service courtesy of OKFreqFreq.FrequencyFrequency in MHzFrequency scaleFrequency shift (800 Hz)Frq DispFullFull reportGeneralGenerate 1000 Hz square wave signal on right channelGenerate square wave signal on right channelGroup 1Group 2Group 3Halve receive widthHamCall online via default Internet BrowserHamQTH via default Internet BrowserHamQTH.com (free service http://www.hamqth.com)Hamcall.netHamlibHamlib used for rig controlHardware PTTHiLite 1HiLite 2Hide Transmission windowHide transmission window by default.Hide window after (s):HighHigh frequency limit in HzHost:IDIDsIOTAITU zoneITUZIgnore duplicatesInInactivity timeoutInches Mg.Include the transmit frequencyInclusive stop date for exportInfoInitial state of DTRInitial state of RTSInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize XML-RPC rig controlInitialize hamlib interfaceInitialize the H/W PTT interfaceInitialize the QSO logging fieldsInitialize the socket clientInput carrier shiftInsert RX text marker before changing frequency and modemInsert default textInsert file...Insert full METAR reportInsert leading zeros into Xmtd serial numberInsert markerInsert special text in Rx panel when waterfall clickedInsert textInsert text on single left clickIntegration period (FEC blocks)Interesting notesInterleave SYNOP and textInterleave text with decoded SYNOP messages, or replacement.Islands on the airK3 A1A configuationKMLKML balloon display styleKML balloon in plain text, or HTML, in plain tables or matrices.KML files directoryKML refresh interval (seconds)KML root fileLOCLabel textLast QSOLeading and Trailing edge risetimes (msec)Leave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft Click - execute Fkey - execute Right Click - editLeft Click - execute Shift-Fkey - execute Right Click - editLeft and right channels both contain modem audioLeft click - select Right click - clear lineLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLeft or right click always replays audio historyLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Lighted button enabled colorsLimit AFC movement to this rangeLimit to a few characters, as in CQEM or IOTA etc.Line InListen for signals within this rangeLkLoadLoad a new paletteLoad image fileLoad last used macro file on startupLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocLocateLocate binaryLocate cty.dat fileLocate executableLocate flamp executableLocate fllog executableLocate flmsgLocate flmsg executableLocate flnet executableLocate flrig executableLocate program #1 executableLocate program #2 executableLocate program #3 executableLocatorLocator:Lock transmit frequencyLogLog Navtex messages to Adif fileLog Navtex messages to KMLLog RTTY frequencyLog Wefax messages to Adif fileLog all RX/TX textLog sourcesLogbookLogbook DialogLoggingLogging Panel ControlsLogs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)Long receive integrationLook up callLotW userLowLow = zero errors Medium = 1 error High = 2 errorsLow frequency limit in HzLowerLower limitLowest freq on bottom of viewerMETAR station ID codeMETAR station locationMFSK image fileMT-63Macro Button LabelMacro TextMacro editor - MacrosMaidenhead LocatorMaidenhead locator as in EM64qvMail Server AttributesManage mixerMark onlyMark prev freq/modeMark-SpaceMatched FilterMatched Filter bandwidthMediumMerge ADIF fileMerge...Mic InMiles / HourMinimal controlsMinimum distance for splitting alias nodes (Meters)Minimum distance for splitting aliases (Meters)Minimum time between eventsMiscMixerModeMode in useMode must matchMode width limitModemModem carrierModem signal on left and right channelsModemsMonitor transmitted signalMono audio outputMouseMouse wheel active on macro buttonsMsec post-keydown (+ is earlier in time)Msec pre-keydown (+ is earlier in time)Msec's between retriesMsec's between sequential commandsMulti-Channel Signal ProcessingMulti-channel detectorMy callsign de CALLMy transmit CW WPMNBEMSNBEMS data file interfaceNBEMS files...NO AUDIO DEVICE AVAILABLE (or testing)NO CALLSIGN SETNameName:NavtexNewNew record / Save recordNextNmNoNo faster than thisNo file name givenNo rig specifiedNo slower than thisNoise onNoneNormalNot worked beforeNotchNotesNotificationsNotify onlyNumber and position of macro barsNumber of digits in serial numberNumber of hours data is kept for each node. Zero means keeping everything.OKONON - Marquee style OFF - Clear & restartON - search over entire waterfall OFF - limit search to +/- 200 HzON - small font OFF - large fontON - start at default OFF - keep current wf cursor positionON - use last set of macros OFF - use default setOSSOSS MixerOddOdd linesOffOliviaOnOn/OffOne bar (above waterfall)One bar (below waterfall)Online documentation...OpOp &ModeOpen ...Open ListOpen file with default browserOpen in browserOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen paletteOpen rig xml fileOpen squelch for nn sec if RSID detectedOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperatorOperator informationOperator nameOperator workedOperators QTHOperators callsignOperators nameOptional configuration in format: param=val ...OptionsOtherOther callOther nameOutOverPCMPSKPSK ReporterPSK et al.PSK/RTTY Viewer HiLite Color 1PSK/RTTY Viewer HiLite Color 2PTT delays valid for all CAT/PTT typesPTT end of transmit delayPTT is a CAT command (not hardware)PTT is a hamlib commandPTT tone on right audio channel PTT via Hamlib commandPalette: ParityParse all incoming textPasswordPastePaths (hidden)Pick baud rate from listPlay back history when active channel selectedPlaybackPlayback continuous loop?Playback devicePlayback:Please set your callsign first.Popup info after a 2 second hover on a callsignPort:PortAudioPost write delay (ms)Post-keydown timing (ms)PrPre-Signal TonePre-keydown timing (ms)Preamble DetectionPress return to continue the searchPress to updatePress to update QSO start timePrimary macro setPrint CW / RTTY / THROB / CONTESTIA in lowercaseProg 1:Prog 2:Prog 3:Prompt to save ConfigurationPrompt to save logPrompt to save log on exitPrompt to save macro filePrompt to save macro file when closingProsignsProvinceProvince of station workedPseudo-FSK - right channelPseudo-FSK on right audio channelPskmailPulse shapePulseAudioPwrQRZQRZ cdromQRZ online via default Internet BrowserQRZ.comQRZ/eQSLQSKQSK on right audio channelQSL rcvd dateQSL received on this dateQSL route of contacted stationQSL sent dateQSL sent on this dateQSL-VIAQSL-rcvdQSL-sentQSO DateQSO Date OffQSO Date OnQSO end timeQSO loggingQSO must not occur within a time period ofQSO start timeQSYQTHQTH NicknameQTH:QthQuick entryQuietRE:RPCRSID receptionRST always 599RST rcvdRST sentRST(r)RTS +12RTS +12 vRTS = +VRTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTYRTTY Scope DisplayRX - unshift on spaceRX captureRX ppmRX sound card correctionRX text QSO data entry is bounded by the non-word characters defined here. Tab and newline are automatically included.Radio frequencyRaised cosine = HanningRaised cosine pulse shape factorRange +/- wpmRange, WPMReading fonts...Really delete record for "%s"?Really want to quit?ReceiveReceive filter bandwidthReceive modesReceive synchronizerReceived RSTReceived serial numberRecent activity for gridReception of flmsg filesReception reports...ReconnectRecsRectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)Refresh time interval written in KML file (Seconds)ReloadReload cty.datRemoveReplay trackline audioReport ARQ frames average S/NReport rig frequency (enable only if you have rig control!)ReportsResetReset FEC blocks when changing BW or TonesReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Reset hamlib interfaceReset rigCAT interfaceReset to CarrierRestore Settings on CloseRestore cty.dat default folderRestore defaultsRestore the serial (COM) port settingsRetain TX lock frequency (Lk) when changing to RX RsID frequencyRetain tx freq lockRetriesRetrieve for active modem useRetry Interval (ms)Retry interval (ms)RevReverseReverse Left/Right channelsReverse videoRevertRevert to Unsifted char's on a spaceRevert to unshifted char's on a spaceRigRig Control using xml spec fileRig controlRig control and contestRig control and loggingRig control via external program using xmlrpc remote calls.Rig description file:Rig modeRig or interface echos serial dataRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig:RigCATRigCAT used for rig controlRight channelRsIDRst receivedRst sentRun programRun program:RxRx Text CaptureRx WPMRx bkgndRx fax max rowsRx fontRx/TxRxIDS/N and IMD behaviorSELSKIPSOM decodingSQL-1SQL-2SYNOP to ADIFSYNOP to KMLSample rateSaveSave ...Save ConfigSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed configuration?Save changed macros?Save current log entry?Save image as monochrome fileSave logbook fileSave macro fileSave paletteSave text asSave the fax image as a gray-level PNG file.Save this paletteSave...ScopeScrollScroll hintsSearch for this callsignSearch on webSearch range (Hz)Searches passbandSecondary TextSecondsSelectSelect # bits / charSelect # stop bitsSelect AllSelect Cabrillo Contest & FieldsSelect Fields to ExportSelect Mixer deviceSelect Records to ExportSelect Rx/Tx Character SetSelect TX raster fontSelect TagSelect bandwidthSelect carrier baudrateSelect carrier shiftSelect deviceSelect how the mouse wheel behaves inside the waterfallSelect lineSelect modes for menu accessSelect number of tonesSelect operating parametersSelect paritySelect rig descriptor fileSelect the type of FFT prefilterSelect this for Elecraft K3 Other radios should not need it.Select waterfall scale fontSelection background color in Rx Tx panelsSelf Organizing MappingSend CW cut numbersSend Callsign in CW at end of every transmissionSend a continuous stream of test charactersSend at this WPMSend continuouslySend imageSend image...Send reception report when logging a QSOSend report only when QSO is loggedSend rx text to file: textout.txtSend:Sent RSTSent and received faxes are logged to Adif file.Sent chars in Rx/Tx paneSent serial number (read only)Ser inSer outSerial # inSerial # outSerial numberServer string:Set Viewer SquelchSet level for good viewingSet the number of characters per rowSet the sound card PCM levelSet the type of resampler used of offset correctionSettingsShift-key macro setShort description of antennaShowShow DXCC entitiesShow alert window:Show all modesShow bandwidth tracks on waterfallShow channelsShow cursor with bandwidth linesShow cursor with center lineShow fewer modesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallSideband:SigLvlSignal BrowserSignal Level ColorsSignal browserSignal levelSignal range (dB)Signal searchSignal tracksSize:Skipped chars in Tx pane (Tx on/off in CW)Slew display higher in frequencySlew display lower in frequencySlider hilite color of signal viewer squelch controlSlow (4 msec)Slow CPU (less than 700MHz)Soft-bit decodingSoft-symbol decodingSoftware reversal of left-right audio channelsSort by Date/Time OFFSort by date/time OFF - effects all ADIF/Cabrillo reportsSound CardSpace onlySpeed (WPM):SpotSpotterSpottingSpotting disabledSquelchSquelch levelSquelch open (sec)StStartStart DateStart date for exportStart flampStart fllogStart flnetStart flrigStart of transmit PTT delayStart prog1Start prog2Start prog3Starting numberStateState must matchStationStation heard twiceStations grid squareStop DateStop bitsStopbitsStore mode and frequency Right click for listSunspot creation underway!Sweet SpotSynopSys ColorsSystemT/RTX - unshift on spaceTX PowerTX WPMTX generateTX offsetTX ppmTX sound card correctionTab ColorTabsTabular data sourcesTalkerTalker Socket (MS only)TemperatureTestTest Signal - Do NOT use with transmitterTest charTest character for QSK adjustmentTest commandTest...Text CaptureText HighlightingText Tags (tags use {} delimiters)Text defining end of METAR header Typically 'Connection: close' Used to search for station nameText file to insertText i/oText to send during keyboard idle timesText...That crazy fox jumped over the dog again! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~The RsID notification message contents and display characteristics are configured on the "Notifications" configure dialog.The default CW speedThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The string is replaced with the current modem and frequencyThe test string did not match this event's search pattern.The wizard will guide you through the basic fldigi settingsThese tags can also be used in This event's regular expression is invalid.ThorTimeTime (s):Time OFFTime ONTime OffTime OnTime QSO endedTime QSO startedTime between retires in msecTime needed: Time span overTimed outTimeout (secs)TimingTiming and QSKTo whom the connection is madeToggleToggle DTR for PTTToggle RTS for PTTTone Duration (secs)TonesTracked CW speed in WPMTrackingTransceiver controlTransfer speed, X1-normalTransmitTransmit PowerTransmit all text in lower caseTransmit callsignTransmit fontTransmit lower start toneTransmit mode IDTransmit modesTransmit periods (.) when idleTransmit power usedTransmit signalTransmit upper start toneTransmit video textTransmit widthTransmit/ReceiveTransmits a diddle dot when no keyboard activityTriangularTrigger limit (s):TuneTune margin (tone frequency spacing)Two bars (scheme 1)Two bars (scheme 2)Two bars (scheme 3)Two bars (scheme 4)Two bars (scheme 5)Two bars (scheme 6)TxTx bkgndTx fontTx level attenuator (dB)Tx power used for logbook entriesTxIDUIUI languageUI schemeUS StateUS state of station workedUndoUnsupported formatUpdateUpdate selected local data files with repository contentUpdate the current recordUpperUpper limitUpper signal level (dB)Use "cr cr lf" for "cr lf"Use '(' paren not KNUse CD or hard drive CD imageUse DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse Line-In deviceUse MARK freq'Use OSS audio serverUse Open to select descriptor fileUse Port Audio serverUse Pulse Audio serverUse RTSUse RigCATUse XML-RPC programUse averaging to decrease waterfall noiseUse colored buttonsUse cross hair scopeUse date/time off for log entryUse for triggering amplifier carrier detectUse leading zerosUse microphone inputUse parallel port PTTUse separate serial port PTTUse small fontUse soft-bit viterbi decoding for better Forward Error Correction Works best with soft-symbol decoding enabledUse soft-decision decoding for symbol detection Assists soft-bit decodingUse uHRouter PTTUser IDUser InterfaceUser nameUsing UDP port #VSP EnableVerboseVersion %s is available at %s What would you like to do?VideoVideo ID modesVideo Preamble IDViewView/Hide ChannelsVirtual Serial Port Emulator - suppress WARNINGSVisible modesVisit Hamcall web siteVisit QRZ web siteVisit URLVisit hamQTH web siteWF CtrlsWF MagnificationWF Shift ControlsWF StoreWF amp spanWF carrierWF drop rateWF modeWF ref levelWXWait interval (msecs) before reading responseWarningWaterfallWaterfall / FFT / ScopeWaterfall controlsWaterfall drop speedWaterfall height in pixelsWaterfall video IDWaterfall video textWavWav write sample rateWaveform Audio Format *.wav AU *.{au,snd} Weather query specificationWebWeb Browser lookupWefaxWeight (%)Weight decreases with increasing edge timingWheel actionWhen no signal presentWhere generated KML documents are stored.WideWill occur after this time in secondsWind speed/dirWord delimitersWord wrapWrite current macro set on program exitWrite delay (ms)XMITXML-RPCXMT lockXON/XOFF flow controlXY - classic scopeYesYou are running the latest versionYou need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour login nameYour login passwordaaafterat:automatic data uploadcall signcallsign tooltips in received textchannels != 1charscty.dat pathnamecurrent wx conditionsdBdefault text to send with etcdefault uses date/time oneQSLeQSL userenable mouse wheel control of macro barflamp:fllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrig:for example KMDQ for Huntsville-Madison Executive Airport, ALfree form 1 must matchfree form exchangefrequency kHzh/w ptt device-pinie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for databasein:kilometers / hourmbarsminutesrcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500reportreport Celsiusreport Fahrenheitreport inches mercuryreport kilometers per hourreport miles per hourreport millibarsreportssecondsseek - regular expressionselect browser fontselect by datesend when logged (log button, , )track colorunknown wave file errorwaterfall-only mode{NAME} other ops nameProject-Id-Version: fldigi 3.21.76AP Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com POT-Creation-Date: 2014-03-22 11:18-0500 PO-Revision-Date: 2013-10-18 10:18-0500 Last-Translator: Pavel Milanes Costa Language-Team: Spanish (Pavel Milanes Costa) Language: Spanish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.5.4 en # RNúmero de entradas en el libro de guardia# S# de multiples escaneos / lineas de caracteres# de reintentos antes de rendirnos# de veces para renvio de comandos antes de rendirnos%s log iniciado a %s%s: No existe, lo creo?&Acerca de&Configuración&Campos de concursoArchivosA&yuda&Libro de guardiaImagen &MFSK&OKI&U&Visita&RX Imagen de Fax meteorológico&TX Imagen de Fax meteorológico**.exe... Estos controles están en otras pestañas. Solo se duplican aquí por conveniencia. Puedes cambiar su estado en cualquier lugar. ...0 = T; 9 = NTono de audio de 1Khz cuando hay PTT activo Para ser usado en otras formas de PTT14070.1502x Tx ancho (oculto)Límite de 500 HzCaracteres extendidos de 8bitsCaracteres extendidos de 8bits (UTF-8): AFC encendido, apagado, invirtiendo mi antena banda de operación indicativo del otro limpiar los campos del log limpiar el panel de RX limpiar el panel de TX contador de concurso comentarios que NO se transmiten identificador de CW decrementar el contador [Wait][Len](ms) logear un mensaje opcional en eQSL.cc Salvar directo en eQSL.cc insertar fichero de texto ancho del filtro válido para el trx mi frecuencia texto a NOMBRE/QTH moverte a la frecuencia NNNN retornar a la frecuencia inicial en la cascada enviar el ID del modo como video texto esperar NN.nn segundos por la señal LDT en formato iso-8601 insertar imagen de MFSK incrementar el contador S/N etc. IMD etc. ZDT en formato iso-8601 fecha local AAAA-MM-DD fecha y hora en tiempo local Guardar los datos del QSO, añadiendo msg a las notas del log, cuando se muestra en el buffer de TX guardar al tiempo que transmite localizador del otro bloqueo (LOCK) encendido, apagado invirtiendo Guardar los datos del QSO, añadiendo msg a las notas del log, justo cuando se ejecuta la macro. guardar datos del QSO hora local (HHMM) cambiar el fichero de definición de macros mapearlo por su valor mapearlo en google modo mi indicativo mi localizador mi nombre mi QTH mi RST nombre del otro Transmitir |NN| ráfagas de RsID próximo QSO a guardar # pausar la transmisión (Pasar a RX sin limpiar el panel de TX) CW QSK al final CW QSK al inicio Insertar QRG en el panel de RX # QSO guardados Hora del QSO (HHMM) qsy a kHz, Hz click-derecho QSY a la frecuencia anterior click-izquierdo QSY a la frecuencia preferida de este modo QTH del otro repetir la macro continuamente Reverso activado, desactivado, alternando enviar comando CAT modo válido para el trx tiempo de subida de CW RST del otro recibir Rx RSID encendido, apagado, invirtiendo salvar el fichero de macro actual guardar intercambio de concurso buscar ABAJO en la cascada por una señal buscar ARRIBA en la cascada por una señal Digitalk Encendido, apagado, invirtiendo video texto repetir cada NN segundos sintonizar la señal por NN segundos Invertir Tx/Rx transmitir poner el atenuador de TX del equipo a este valor Tx RSID encendido, apagado, invirtiendo version de Fldigi retrasar la transmisión por NN segundos CW PPM:Farnsworth obtener datos de clima para una estación específica obtener datos de clima comienzo del intercambio fin del intercambio intercambio entrante intercambio enviado fecha zulu AAAA-MM-DD Z fecha y hora UTC hora zulu HHMMZADIFAFCComportamiento AFCRango AFC (Hz)Rango AFC o Ancho de bandaVel. del AFCVelocidad de rastreo del AFCALTRControl ARQAbortarAbortadoS/N (dB) de adquisiciónRango de búsqueda y adquisición (Hz)AcciónAñadirAñadir CRLF después del ancho de caracteres de la páginaEnviar RsID al finalizar cada TxAñadir la frecuencia actualPoner nombre geopolítico a la estación METARAñadir controles del mezclador a la interface principalServidor:Ajustar la frecuencia del cursorAjustar el ancho de banda del DSPConfiguración avanzada:TodoTodo esto se pueden modificar luego en los menus de configuraciónPermitir erroresPermitir sintonía manualColor alternativo de los caracteres en el panel de RxrSiempre LSBSiempre USBSiempre mostrar las frecuencias de audioSiempre iniciar los modems nuevos en estas frecuenciasAntena:Apariencia de la etiqueta de cada canalAñadir al texto de RX:Añadir al texto de TX:AplicarAudioInformación de los dispositivos de audioLa información del dispositivo de audio está solo dispodible cuando se usa PortAudio como método de comunicación con el dispositivoDispositivo de audioFichero de audioFrecuencia de audioDispositivo de entrada de audioFrecuencias de audio o RF en la escala de la cascadaDispositivo de salida de audioHistorial de audio decodificado al seleccionarAjuste automático de línea con CRLFAuto conectar cuando fldigi se ejecute (el servidor debe estar encendido)Iniciar programas al mismo tiempo que fldigiAuto rellenar el país y azimutAuto CRLFControl Automático de FrecuenciaSeguimiento automático de la velocidad de RxHacer "spot" automáticamente con los indicativos decodificados en el texto recibidoAutoinicioSub cadenas de texto disponiblesAzimutAtrasFondoColor de fondo para el grupo de teclas de función 1Color de fondo para el grupo de teclas de función 2Color de fondo para el grupo de teclas de función 3Color de fondo de control deslizante del silenciador del navegadorFrecuencia erróneaId incorrecta de modemBandaConcordar en bandasAncho de bandaPresión BarométricaTasa de baudiosTasa de baudios:Guía del principianteComportamiento del S/N y IMDFondoBits por caracterBuscarNavegadorColores de ResaltadoPreguntarme acerca de guardar entradas en el logInformación de compilaciónBotónBotones&PaisesComandos CAT para el PTTCONTCPUEl uso del CPU aumenta con el alto de la cascadaZona CQCQZCR-CR-LFCSV...CTRLCWModos con CW IDPost-ámbulo de ID de CWCW QSK en el canal derecho de audioAncho de banda del filtro DSP de CWCW es LSBWPM en TX de CWDetección y supresión de CWIHumbral de CWIConfiguraciones para CabrilloCabrillo...Ind.Búsqueda de indicativoBuscar IndicativoIndicativo trabajadoBúsqueda en Callbook.info (Solo indicativos de EE.UU.)IndicativoBase de datos de IndicativosIndicativo:Puede ser usado en vez de o en adición de otros tipos de PTTProvincia Can.CancelarCapturaDispositivo de captura y reproducciónDispositivo de capturaCapturar el texto de Rx a un fichero externoCapturar señales por encima de este nivelCapturar señales dentro de este rango de frecuenciasCaptura:Frecuencia portadora (Hz)Salto de la portadoraGrados CelciusCentrar la señalCentrar en el pasabanda Clic derecho para deshacerLínea centralCambiar el número de canales del navegadorCambiar SOLO PARA EXPERIMENTARCambiar la piel de la aplicaciónCambiar colorCambiar carpetaCambiar el nivel de logCambiar la posición de los canales de abajo a arribaCambiar a fichero de macroCambiar escala de la cascadaLos cambios tomarán efecto en el próximo inicio del programaEtiqueta del canalNúmero del canalCanales, el primer canal comienza en el límite inferior de la cascadaCarac/Fila:Marcar todoChequear duplicadosComprobar si existen actualizacionesVerificar si hay actualizaciones al iniciar el programaComprobar si existen actualizacionesMarcar aquí para ser notificado cuando un RSID es recibido sin cambiar el modem y la frecuenciaActivar para reducir la carga al CPU en PSK y RTTY.Chequeando si hay actualizaciones...Selecciona directorio de archivos KMLCiudadCiudad de la estación trabajadaLimpiar datos KML ahora!Limpiar al iniciarLiampiar datos KML, limpia la pantalla de Google HearthLimpiarLimpiarLimpiar el texto del canal después de N segundos de inactividadLimpiar listaLimpiar la lista?Al limpiar los datos del contacto pone el RST recibido a 599 por defectoAl limpiar los datos del contacto pone el RST enviado a 599 por defectoLimpiar la entradas del log después de guardar o usar la macro Limpiar los campos del log?Limpiar cuando salvesLogs remotos cliente/servidorCerrarCerrar listaColorColor de cursor en la MarcaColores y tipografíaColores y cursoresColores y letrasOpciones de linea de comandosComando a ejecutar al crear un archivo KMLComando que se ejecuta cuando se genera un archivo KML. Subprocesos se reinician si es requerido.Los comandos tienen ecoComprimir Rx en el tiempoCondicionesConfirmarConfirmar RESETConfirmar la salidaConectar con el ServidorConectar/desconectar el socket del servidor TalkerContestiaConcursoIntercambio de concurso recibidoRecibido el intercambio en concursosIntercambio enviado en Concurso# Recibido como intercambio en concursos#Serie enviado en concursoConcurso:ContinenteMovimiento contínuoCaracteres de control en el panel de Rx/TxControlesConvertir el indicativo a mayúsculasConvertidorCopiarCopiar la URLCorreccionesNo se puede chequear si hay actualizaciones: %sNo se pudo crear el directorioNo pude abrir la URL: %s No pude ejecutar un navegador de internet: %s Abre esta URL manualmente: %sNo se puede iniciar flmsgPaísPaís de la estación trabajadaProvinciaCrear una onda cuadrada en el canal derecho de audio (1Khz)Crear un nuevo libro de log?Crear un reporte CabrilloCrear una onda cuadrada en el canal derecho de audioCrear un sunspotSalto ajustadoBusqueda de texto personalizadaPersonalizar...CortarDTMFDTR +12DTR +12 vDTR = +VDTR es PTTDTR es la línea de PTTDXCCIdentificador DXCCEntidades DXCCEntidad DXCCRelación punto a rayaBúsqueda en base de datosLocalización del orígen de datosFicheros de datosActualización de datos localesArchivos de datos...Horas de retención de datos, zero: sin limite.Orígenes de datosFechaFecha de finFecha de inicioFecha de fin del QSOFecha de inicio del QSOFecha y hora de inicio = finDebugDetección y supresión de CWIDecodificar tonos DTMFDecodificar mensajes SYNOP al log ADIF (ejemp. Deutsche Wetterdienst)Decodificar mensajes SYNOP al documentos KML (ejemp. Deutsche Wetterdienst)Por defectoPor defecto 800 Hz. Deutsche Wetterdienst 850HzPunto predefinido de rastreo de CWPoner siempre RST recibido a 599Poner siempre RST enviado a 599Punto predefinido de rastreo de RTTYWPM predefinidoPunto predefinido de rastreo para los otros modemsFrecuencia de RX/TX predeterminadaMensaje por defectoLa cadena de prueba es: "Osciloscopio de hilos cruzados por defectoReiniciarRetrasar NN mseg antes de soltar el PTTRetrasar la salida del audio en NN msegBorrarEliminar de la listaEliminar datos locales si se seleccionaEliminar el registro actualDeseleccionarDetectar el preámbulo de THOR Limpiando el buffer de recepción de datoDetectar la ocurrencia de las etiquetas [WRAP:beg] y [WRAP:end] para guardar el texto contenido entre ellas a un fichero con la fecha al estilo: NBEMS.files\WRAP\recv\extract-20110205-201712.wrapDetectar la ocurrencia de las etiquetas [WRAP:beg] y [WRAP:end] para guardar el texto contenido entre ellas a un fichero con la fecha al estilo: ~/.nbems/WRAP/recv/extraxt-20110205-201712.wrapNivel de señal detectadoColores de detección de nivelNivel alto del detectorNivel bajo del detectorDispositivo:DispositivosSintonizarDiferencias entre frecuencias de Rx y Tx (en el radio)DígitosDígitosAtenuarDirectorio...Desactivar alertaDesactivarDesactivar cambio de frecuenciaDesactivar la detección futura cuando un RSID es recibidoProcesamiento multicanal de la señal desactivado en PCs con CPUs muy lenta y no se usa el navegador de señalActivar spotting solo cuando el navegador de señal está visibleDeshabilitar detectorMostrarMostrar Rx en video inversoMostrar el nombre del fichero de macros al iniciarMostrar TX y RX en la ventana principal de fldigi. Si lo cambia requiere reiniciar del programa para funcionar.No cambiar automáticamente a la frecuencia del RsIDNo mostrar alerta de RsIDNo usar una base de datos de indicativosNo usar una base de datos de indicativos en internet vía el navegadorOsciloscopio empotradoDomEXNo guardarRelación punto a punto-rayaDoble-click para capturarAgarrar y arrastar en la cascada cambia la frecuenciaColor Dup.Chequear duplicados, Indicativo más...DuplicadosLos bordes de subida y bajada disminuyen el ancho del pulsoForma del bordeTiempos de bordeInterfaz embebida para WXFAXLimpiar los documentos KML al inicio del programaFichero de libro de guardia vacío (ADIF) %sActivarActivar -Activar/desactivar los iconos en el menúActivar/desactivar sugerenciasActivar el DSP antes del decodificadorActivar el FEC compatible con MultiPSKActivarActiva la casilla para mostrar cada control respectivoActivar el arrastrado del cursor en la cascadaActivar para señales muy debilesActivalo si no puedes usar el botón del centro del ratónActivar si tu computadora no decodifica correctamenteActivar el flujo de texto de recepciónInicial cuando inicie fldigiActive esto para caracteres acentuadosActive esto para caracteres acentuados (UTF-8)Active esto para caracteres acentuados (UTF-8)Activar para seleccionar rango de fechasActivadoActivado - Guarda QSO usando la frecuencia de la Marca Desactivado - Guarda QSO usando frecuencia centralActivado - usar filtros de salida Marca/Espacio Desactivado - usar seudo-señalesFin de la cabecera:Enviar ID al finalizar cada TxNúmero de puerto asignado al servidorEntre la dirección URL del servidorFrec. del TRCVEntre un Indicativo!Entre frecuencia o cambie con Izq./Der../Arriba/Abajo/Pág_Arriba/Pág_AbajoEntre camino completo hasta el fichero cty.dat Se cargarán (si se encuentran) del mismo lugar los ficheros: eQSL.cc: AGMemberList.txt LoTW: lotw1.txtEntre camino y nombre hasta el ejecutable o simplemente el nombre del ejecutableEntre camino y nombre hasta el ejecutable de flmsgEntre la cadena de prueba, o déjela en blanco para usar la predefinida:Entre rango de tiempo en minutosErrorError Leyendo %sParLineas aaresEventoLog de eventosExIntercambio RXIntercambio TXIntercambioFichero ejecutable a insertarEjecutar un comando sobre los archivos KMLSalirPreguntas de SalidaEstán activas solo cuando cierras usando el menú Archivo/Salir. No se activan cuando das click en el botón de cerrar en la ventana.ExperimentalConfiguración de la exportaciónExportar a fichero ADIFExportar a un fichero CSVExportar a un fichero de texto con campos fijosExportar...Extraer archivos para usar con programas externos (wrap/flmsg)Limpiar el texto del canal después de N segundos de inactividadF-WPMFECFiltro FFT / FIRProcesamiento FFTPromedio de FFTFiltro FFTFunción de ventana de prefiltro FFTFicheros FLMSG...Teclas FGrados FahrenheitRápido (2 ms)Destino de las imágenes de faxPuedes saltar o salir cualquiera de estas configuracionesFeld-HellSolo E/S desde ficheroAuto rellenar la información del país y el azimut usando el fichero cty.dat (Lo tienes instalado, cierto?)FiltroFactor de ancho de banda del filtroAncho de banda del filtroFactor de ancho de banda del filtroAncho de banda del filtro relativo al ancho de la señalFiltrajeBuscar país:Buscar el siguienteBuscar prefijo:Buscar el anteriorBuscar:TerminarIntervalos FijadosConfiguración de Fldigi...ConfiguraciónDialogo de ConfiguraciónFichero de definición de macro para Fldigi *.mdfPaleta Fldigi *.palFichero de definicioan de radio xml *.xmlSitio web de Fldigi...Osciloscopio flotanteCarpetasLetra:Color de letraTipografíaTipografía:Forzar el RST recibido/enviado a 599Forzar una taza de muestreo. Seleccionar "Nativo" si "Auto" no trabaja bien con tu dispositivo de audio.Forzar el campo indicativo a MAYUSCULASForzar el espaciado de los canales a incrementos de 100HzForzar fecha/hora de inicio = fecha/hora de final del QSOForzar la salida de audio a un canal simpleCodec de audio libre sin pérdida *.flacServicio GratisFrecFrec.FrecuenciaFrecuencia en MHzEscala de frecuenciaSalto de frecuencia (800Hz)FrecuenciaCompletoReporte CompletoGeneralGenerar una onda cuadrada en el canal derecho (1Khz)Generar una onda cuadrada en el canal derechoGrupo 1Grupo 2Grupo 3Ancho de Rx a la mitadSitio HamCall vía el navegador por defectoSitio HamQTH vía el navegador por defectoHamQTH.com (Servicio gratis http://www.hamqth.com)Hamcall.netHamlibUtilice Hamlib para controlar el radioPTT realHiLite 1HiLite 2Ocultar la ventana de TXOcultar la ventana de TX de forma predeterminadaEsconder después de (s):AltoLímite superior de frecuencia en HzHost:IDIDsIOTAZona ITUITUZIgnorar duplicadosRecTiempo de inactividadPulgadas de MgIncluir la frecuencia de TxFecha de fin de la exportación (inclusiva)InfoEstado inicial de DTREstado inicial de RTSVoltaje inicial en DTRVoltaje inicial en RTSInicializarInicializar la interfaz RigCATInicializar el control por XML-RPCInicialice la interfaz HamlibInicialice el interfaz de HW para PTTInicializar la cuenta del número serieInicializar el socket clienteSalto de la portadoraInsertar el marcador de texto en el panel de Rx antes de cambiar la frecuencia y el modemInsertar texto predeterminadoInsertar fichero...Insertar reporte METAR completoInsertar ceros a la izquierda en el número de serie enviadoInsertar marcadorInsertar un texto especial en el panel de Rx cuando se da clic en la cascadaInsertar textoInsertar texto en un solo clic izquierdoPeriodo de integrción (bloques FEC)Notas interesantes (80 caract. máx.)Intercalar SYNOP y textoIntercalar texto con mensajes SYNOP decodificados, o remplasosIslas en el Aire (IOTA)Configuración de A1A para el Elecraft K3KMLEstilo del globo de KMLKML globo en texto plano, o HTML, en tablas simples o matrices.Directorio de archivos KMLInternvalo de refresco KML (seg)Raíz del fichero KMLLOCTextoÚltimo QSOTiempos de subida y bajada del pulso (ms)Deje esto en blanco en Ubuntu con una sola tarjeta de red referirse a http://www.pulseaudio.org/wiki/ServerStrings para más detallesClic izquierdo - ejecutar Tecla de función - ejecutar Clic derecho - editarClic izquierdo - ejecutar Clic derecho - editarAmbos canales de audio contienen informaciónClic izquierdo - ejecutar Clic derecho - editarClic izquierdo para limpiar el texto Clic derecho para resetear frecuenciasClic izquierdo para seleccionar el color de duplicadosClic izquierdo: cambiar modo Clic derecho: configurarClic derecho o izquierdo siempre reproduce la historia del audioLicencia GPLv3+: GNU GPL versión 3 o posterior Esto es un Software Libre: tu eres libre de cambiarlo y redistribuirlo. No hay GARANTIA, execpto la permitida por la ley. Colores de los botones iluminadosLimitar el movimiento del AFC a este rangoLimitar a unos pocos caracteres Como en CQEM o IOTA etc.Line InEscuchar señales dentro de este rangoLkCargarCargar una nueva paletaCargar fichero de imagenCargar el último archivo de macro usado en el inicioCargar o descargar una imagen desde fichero (PNG, JPEG, BMP)Cargar...LocEncontrarEncontrar binarioBuscar el fichero cty.datCamino al ejecutableCamino al ejecutable de flampCamino al ejecutable de fllogBuscar flmsgLocalización del ejecutable de flmsgCamino al ejecutable de flnetCamino al ejecutable de flrigCamino al ejecutable de flmsgCamino al del ejecutable de flmsgCamino al ejecutable de flmsgLocalizadorLocalizador:Bloquear la frecuencia de transmisiónLogLogear mensajes de Navtex a fichero ADIFLogear mensajes de Navtex a KMLFrecuencia de log para RTTYLogear Wefax a fichero ADIFGuardar todo el texto de TX/RXOrígenes de logsLibro de guardiaLibro de guardiaRegistro de QSOControles en la interfazGuardar mensajes a archivos KML (Google Earth, Marble, Gaia, etc...)Larga integración en RxBuscar indicativoUsuario de LotWBajoLow = cero errores Medium = 1 error High = 2 erroresLímite inferior de frecuencia en HzInferiorlímite inferiorFrecuencia más baja en la parte inferior del navegadorCódigo del AeropuertoLocalización de la estación METARFichero de imagen MFSKMT-63Etiqueta del botón de macroTexto del macroEditor de macros - MacrosLocalizador como por ejemplo FL11aiLocalizador como por ejemplo FL11ajAtributos del servidor de correo (PSKMAIL)Manejar el mezcladorMarca solaMarcar frec./modo previoMarca-EspacioFiltroAncho de banda del filtroMedioMezclar fichero ADIFMezclar ADIF...Mic InMillas/HoraControles mínimosDistancia mínima para nodos alias segmentados (metros)Distancia mínima para alias segmentados (metros)Tiempo mínimo entre eventosMisc.MezcladorModoModo en usoConcordar en modoLímite del ModoModemPortadora del modoAudio del modem en ambos canales de audioModemsMonitorear la señal transmitidaSalida de audio monoRatónRueda del ratón activa en los botones de macroPTT es soltado N milisegundos después del pulso realPTT es enviado N milisegundos antes del pulso realMilisegundos entre reintentosMilisegundos entre comandos secuencialesProcesamiento de la señal multi-canalDetector multicanalMi indicativo de INDICATIVOMi velocidad CW (WPM)NBEMSInterface de datos NBEMSFicheros NBEMS...NO HAY DISPOSITIVO DE AUDIO DISPONIBLE (o estas probando?)NO SE HA DEFINIDO UN INDICATIVONombreNombre:NavtexNuevoRegistro nuevo / ActualizarSiguienteNmNoNo más rápido queNo se ha proporcionado un nombre de ficheroNo se ha especificado un radioNo más lento queRuido encendidoNingunoNormalNo trabajado previamenteMuescaNotasNotificacionesNotificar solamenteSeleccionar el # y posición de la(s) barra(s) de macro(s)Número de dígitos en el número de serieHoras de conservación para cada nodo, zero es conservarlo todo.OKActivoActivado - Estilo marquesina Desactivado - Limpiar y re-comenzarON - Buscar en toda cascada OFF - Limitar la búsqueda a +/- 200 HzOn - Tipografía pequeña OFF - Tipografía grandeON - Iniciar en la pre-establecida OFF - Mantener la posición actual en la cascadaActivado - Usar el último conjunto de macros Desactivado - Usar el conjunto pre-establecidoOSSMezclador OSSImparLineas imparesFinOliviaIniOn/OffUna barra (Encima de la cascada)Una barra (debajo de la cascada)Documentación en internet...Op&Modo de OperaciónAbrir...Lista abiertaAbrir fichero en el navegador por defectoAbrir en el navegador por defectoAbrir un libro de logAbrir fichero de macroAbrir carpeta de mensajesAbrir mensaje con flmsgAbrir paletaAbrir fichero de radio xmlAbrir el silenciador por nn segundos si se detecta RSIDAbrir con flmsgAbrir...Abrir la carpeta de NBEMS cuando capture okOperadorInformación del operadorNombre del operadorOperador trabajadoQTH del operadorIndicativo del operadorNombre del operadorConfiguración opcional en el formato: parámetro=valor...OpcionesOtroIndicativo del otroNombre del otroEnvMuchoPCMPSKPSK ReporterPSK et al.Color 1 para el resaltado de HiLite en el visor de PSK/RTTYColor 2 para el resaltado de HiLite en el visor de PSK/RTTYRetrasos de PTT válidos para todos los tipos de PTT y CATRetraso de fin de PTTEl PTT es un comando CATPTT es un comando de HamlibTono para PTT en el canal derecho de audioPTT como comando de HamlibPaleta:ParidadProcesar todo el texto entranteContraseñaPegarCaminos (Oculto)Seleccionar la tasa de baudios desde la listaReproducir el historial cuando se selecciona un canalReproducirReproducir en un lazo continuo?Dispositivo de reproducciónReproducción:Por favor especifica tu indicativo primero.Mostrar información de un indicativo después de estar dos segundos con el ratón sobre estePuerto:PortAudioRet. post-envío (ms)Tiempos posteriores al PTT (ms)PrTono pre-señalTiempos anteriores al PTT (ms)Detección de preámbuloPresione enter para continuar la búsquedaPresione para actualizarPresione para actualizar la hora de inicio del QSOConjunto primario de macrosImprimir CW / RTTY / THROB / CONTESTIA en minúsculas (Estos modos solo reconocen las mayúsculas)Prog 1:Prog 2:Prog 3:Preguntar si guardo la configuraciónPreguntar si salvo el logPreguntar si salvo el log al salirPreguntar si salvo el archivo de macrosPreguntar si salvo el archivo de macros al cerrarProsignsProvinciaProvincia de la estación trabajadaAFSK en canal derechoSeudo-FSK en el canal derecho de audioPskmailForma del pulsoPulseAudioPotQRZQRZ CDSitio QRZ vía el navegador por defectoQRZ.comQRZ/eQSLQSKQSK en el canal derecho de audioFecha de RX QSLQSL recibidas en esta fechaQSL route de la estaciónFecha de TX QSLQSL enviadas en esta fechaQSL-VIAQSL-recibidaQSL-enviadaFecha QSOFecha de finFecha de inicioHora de fin del QSOGuardado de los QSOEl QSO no debe ocurrir dentro es períodoHora de inicio del QSOQSYQTHApodo del QTHQTH:QthEntrada rápidaCalmadoRE:RPCRecepción con RSIDRST siempre 599RST recib.RST env.RST(r)RTS +12RTS +12 vRTS = +VRTS es PTTRTS es la línea de PTTControl de flujo RTS/CTSRTTYConfiguración de Osciloscopio en RTTYNo saltar en el espacio RXCapturar RXRX ppmCorrección de RX en el dispositivo de audioLas entradas de texto de Rx están delimitadas por los caracteres definidos aquí, el tabulador, el espacio y la nueva línea están ya incluidosFrecuencia RFCoseno elevado = HanningFactor de forma pulsada al coseno elevado Rango +/- wpmRango (WPM)leyendo tipografías...Ralmente borro la entrada par "%s"?Realmente quieres terminar?RecibirAncho de banda del filtro de RxModos de RXSincronizador de RxRST recib.Número de serie recibidoActividad reciente para el localizadorRecepción de ficheros en flmsgReportes de recepción...ReconectarEnt.RectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)Intervalo de refresco de escritura para KML (seg)RecargarRecargar cty.datEliminarReproducir el audio del buffer ante un clic en la cascadaReportar el promedio de S/N de tramas ARQReportar la frecuencia del radio (activar solo si tienes control del Radio)ReportesResetearReiniciar bloques FEC al cambiar ancho de banda o tonosRestablecer todas las opciones a su valores redefinidos? Los efectos de esta acción no se observarán hasta el próximo inicio del programa Se eliminaran los ficheros siguientes: fldigi_def.xml and fldigi.prefs Resetear la interfaz HamlibResetear la interfaz RigCATAjustar a la portadoraRestablecer configuraciones al cerrarRestablecer carpeta de cty.dat por defectoCargar por defectoRestablecer la configuración del Puerto SerieMantener Tx en la frecuencia al cambiar a RX para RsID.Mantenerse en frecuenciaReintentosSintonizar el modem actual a estos datos (Frecuencia y Modo)Reintentos cada (ms)Internvalo de reintentos (ms)Inv.InvertirInvertir canales de audio Derecho e IzquierdoVideo inversoRevertirRevertir el salto en espacio de los caracteresRevertir el salto en espacio de los caracteresRadioControl del radio usando un fichero xmlControl del radioControles del radio y concursosControles del radio y logControl del radio por un programa externo usando XML-RPCFichero de descripción del radio:Modo del RadioEl radio o la interface repite los datos enviadosEl radio requiere control de flujo RTS/CTSEl radio requiere control de flujo Xon/XoffEl radio usa RTS/CTS para comunicarseRadio:RigCATUsar RigCAT para el control del radioCanal derechoRsIDRST recibidoRST env.Ejecutar un programaEjecutar programa:RxCaptura de Texto de RXRX WPMRx fondoRx fax max. cols.Texto RxRx/TxRxIDComportamiento del S/N y IMDSELSKIPDecodificación MAOSQL-1SQL-2SYNOP a ADIFSYNOP a KMLTasa de muestreoGuardarGuardar...Guardar configuraciónGuardar todo el texto recibido, un caractér cada vez al siguiente fichero: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Guardar como...Guardar el libro de log modificado?Guardar los cambios en la configuración?Guardar macros modificadas?Guardar los datos del contacto actual en el log?Guardar imagen monocromaGuardar el libro de logGuardar el fichero de macrosGuardar paletaGuardar texto comoGuardar la imagen de fax como PNG en grisesGuardar esta paletaGuardar...OsciloscopioDesplazamientoSugerencias de desplazamientoBuscar este indicativoBuscar en la webRango de búsqueda (Hz)Buscar en el pasabandaTexto secundarioSegundosSeleccionaSelecciona el # bits / caracterSeleccionar # de bits de paradaTodosSelecciona los campos de concurso para el log CabrilloSeleccione los campos a exportarSeleccionar dispositivo de mezclaSeleccione las entradas a exportarSeleccionar la tipografía de Rx/TxSeleccionar la tipografía de TxSelecciona la etiquetaSelecciona el ancho de bandaSeleccionar la tasa de baudios de la portadoraSeleccionar el salto de la portadoraSeleccionar dispositivoSelecciona como la ruera del ratón se comporta dentro de la cascadaLeleccionar lineaSeleccionar los modos para acceso desde el menúSeleccionar número de tonosSeleccionar los parámetros de configuraciónSeleccionar paridadSeleccionar un fichero descriptor del RadioSeleccionar el tipo de prefiltro de FFTSolo para el Elecraft K3 Otros radios no lo necesitan.Selecciona la escala de la tipografía de la cascadaFondo de color de la selección en los paneles de Rx/TxMapas Auto Organizados (Self Organizing Mapping) Es un algoritmo de inteligencia artificial que mejora la decodificación.Enviar números CW (5NN)Enviar tu indicativo en CW al finalizar cada TxEnviar flujo de los carcteres de pruebaEnviar a este WPMEnviar continuamenteEnviar imagenenviar Imagen...Enviar reporte cuando se llenan los datos del QSOEnviar reporte solo cuando se guardan los datos del QSOEnviar texto rx al fichero: textout.txtEnviado:RST enviadoLogear los fax enviados y recibidosCaracteres enviados en el panel de Rx/TxNúmero de serie enviado (solo lectura)Ser recSer envSerie recibidaSerie enviadaNumero de serieServidor:Establecer el nivel de silenciado (SQL) del visorEstablecer el nivel para un visionado aceptableEstablecer el número de caracteres por filaEstablecer el volumen PCM de la tarjetaEstablecer el tipo de re-muestreo usado para correccionesConfiguracionesConjunto de macros con shift-tecla de funciónDescripción corta de la antenaMostrarMostrar las entidades DXCCMostrar ventana de alerta:Mostrar todos los modosMostrar las pistas de ancho de banda en la cascadaMostrar canalesMostar el cursos con las líneas de ancho de bandaMostrar el cursor con la línea centralMostrar menos modosMostrar el editor de macrosMostrar más o menos cascadaMostrar íconos del menúMostrar claves en texto planoMostrar sugerenciasMostrar la señal transmitida en la cascadaBanda lateral:SeñalNavegador de señalColores de detección de nivelNavegador de señalNivel de señalRango de señal (dB)Búsqueda de señalMarcas de LineaTamaño:Caracteres ignorados en el panel de TX (Tx enc./apag. en CW)Correr la cascada hacia frecuencias más altasCorrer la cascada hacia frecuencias más bajasColor resaltado del deslizante del control del silenciador del navegadorLento (4 ms)CPU lenta (Menos de 700Mhz)Usar decodificación suave de bitsDecodificación suave de símbolosInvertir por software los canales de audio (derecho e izquierdo)Ordenar por fecha/hora de finOrdenar por fecha y hora de terminación del QSO Afecta a todos los libros de guardias con formato Cabrillo/ADIFDispositivo de sonidoEspacio soloVelocidad (WPM):SpotSpotterSpottingSpotting deshabilitadoSilenciado (SQL)Nivel de silencio (SQL)Silenciado abierto (s)EsInicioFecha inicioFecha de inicio para exportaciónIniciar flampIniciar fllogIniciar flnetIniciar flrigRetraso de PTT en el inicio de transmisiónIniciar prog 1Iniciar prog 2Iniciar prog 3Número de inicioEstadoConcordar en estado (EE.UU.)EstaciónEstación escuchada dos vecesLocalizador de la estaciónFecha de finBits de pardaBits de paradaAlmacenar modo y frecuencia Click derecho para listarCreación de un sunspot en proceso!Frecuencia InicialSynopSistemaSistemaT/RTX - no saltar en el espacioPotenciaTX WPMGenerar TXDif. en TxTX ppmCorrección de TX en el dispositivo de audioColorPestañasOrígenes de datos tabuladosTalkerTalker Socket (Solo MS)TemperaturaIniciarSeñal de prueba - NO USAR con el transmisorCaracter de pruebaProbar el caracter para ajuste de QSKComando de pruebaProbar...Captura de TextoTexto ResaltadoEtiquetas de texto (use el delimitador {})Texto que define el fin de cabecera METAR Usualmente 'ConnectionL close' Usado para detectar nombre de estación.Fichero de texto a insertarE/S de TextoTexto a enviar durante los períodos de no actividad del teclado (canal secundario)Texto...That crazy fox jumped over the dog again! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~El contenido del mensaje de notificación de RsID y sus características de visualización son configuradas en "Notificaciones" en la ventana de configuración .La velocidad predefinida en CWEl nombre de fichero es escrito en el panel de RxEl campo de expresión regular no debe estar vacío.La expresión regular debe ser válida.La cadena es remplazada con el modo actual y la frecuenciaLa cadena de prueba no concuerda con el patrón para este evento.Este diálogo te guiará en las configuraciones básicasEtiquetas para usar en el macro La expresión regular de este evento es inválida.ThorHoraTiempo (s):Hora fin.Hora com.Tiempo de finalTiempo de comienzoHora de fin del QSOHora de inicio del QSOTiempo entre reintentos (ms)Tiempo neecsario:Rango de tiempoSe ha demorado demasiadoTimeout (seg)TemporizaciónTiempos y QSKA quien se hace la conexiónInvertirActivar DTR para PTTActivar RTS para PTTDuración del tono (s)TonosVelocidad de seguimiento en CW (WPM)SeguimientoControl del transceptorVelocidad de transferencia, X1-normalTransmitirPotencia TXTX todo en minúsculasTransmitir indicativoTipografía de TxTransmitir tono de inicio bajoTransmitir el ID del modoModos de TXTransmitir puntos (...) cuando holgazaneePotencia de transmisión usadaSeñal transmitidaTransmitir tono de inicio altoTransmitir el Video TextoAncho de la TransmisiónTransmitir/RecibirTransmitir puntos continuos (.......) cuando no halla que transmitirTriangularTiempo límite (s):Sint.Margen de sintonía (espaciado de los tonos)Dos barras (Esquema 1)Dos barras (Esquema 2)Dos barras (Esquema 3)Dos barras (Esquema 4)Dos barras (Esquema 5)Dos barras (Esquema 6)TxTx fondoTexto TxpreAtenuación de nivel de TX (dB)Potencia de TX a poner en el logTxIDIUIdioma de la IUEsquema de la InterfazEstado de USAEstado de EE.UU. de la estación trabajadaDeshacerFormato no soportadoActualizarActualizar los datos locales con el contenido onlineActualizar el registro actualSuperiorLímite superiorNivel superior de la señal (dB)Usar "cr cr lf" para "cr lf"Usar '(' en ves de KNUsar el CD o una copia del CD en tu disco duroUsar el filtro DSP antes del decodificadorUse DTRUsar tiempos FarnsworthUsar HamlibUsar dispositivo Line-inUsar frec. MARCAUsar servidor de audio OSSUsar Abrir para seleccionar un fichero descriptorUsar servidor PortAudioUsar servidor PulseAudioUse RTSUse RigCATUsar un programa XML-RPCUsar promedio para disminuir el ruido en la cascadaUsa botones coloreadosUsar osc. de hilos cruzadosGuardar la fecha/hora de fin del QSO en el logUsado para disparar amplificadores que detectan carrierUsar ceros a la izquierdaUsar entrada de micrófonoUtilice un PTT por puerto paraleloPTT por puerto serie separadoUsar tipografía pequeñaUsar decodificación blanda de bit viterbi para mejorar la corrección FEC. Funciona mejor si está activada la opción "Decodificación blanda de símbolos"Usar decodificación blanda de símbolos para la detección también asiste en la decodificación de cada bit.Utilice PTT uHRouterNombre de usuarioInterfaz de UsuarioNombre de usuarioUsando puerto UDP #VSP ActivadoMás explícitoLa versión %s está disponible en %s Que desea hacer?VideoModos de Video IDPreámbulo de Video ID&VisitaVer/Ocultar CanalesEmulador Serie Virtual - Suprimir ADVERTENCIASModos visiblesVisita el sitio web de HamCallVisita el sitio web de QRZVisitar la URLVisita el sitio web hamQTHCascadaAmpliado de CascadaControles superiores de la Casc.Almacenar frecuenciaAmplitud de la CascadaCarrier de la CascadaVel. de caída de la CascadaModo de la CascadaNivel de referencia de la CascadaWXIntervalo de espera (ms) antes de leer la espuestaAdvertenciaCascadaCascada / FFT / OsciloscopioControles de la cascadaVelocidad de caida de la cascadaAltura de la cascadaVideo ID en la cascadaVideo Texto en la cascadaWavTasa de muestreo de wavForma de onda del audio *.wav AU *.{au.snd} Consulta específica de ClimaInternetBúsqueda en internet usando el navegadorWefaxPeso (en %)El peso disminuye con el incremento de los tiempos de borde de los pulsosAcción de la rueda del ratón en la cascadaCuando no halla señal presenteDonde se almacenan los documentos KML generadosAnchoOcurirá despues de este tiempo (s)Vel/Dir del vientoDelimitadoresAjuste de líneaGrabar el juego de macros actuales al cerrar el programaRet. escritura (ms)XMITXML-RPCBloqueo en TxControl de flujo Xon/XoffXY - Osc. clásicoSiEstas utilizando la última versionNecesitas una subscripción pagada para acceder a HamcallNecesitas una subscripción pagada para acceder a QRZTu nombre de usuarioTu clave de usuarioaadespuesen:Envío automático de datos a internetIndicativoMostrar información de los indicativoscanales <> 1caract.Camino a cty.datCondiciones actuales del ClimadBTexto predeterminado para enviar con una entrada de Por defecto usa fecha/hora activadoUsuario de eQSLUsuario de eQSLActivar la rueda del ratón como control de la barra de macrosflamp:fllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrig:Por ejemplo KMDQ para el Huntsville-Madison Executive Airport, de ALConcordar en el número de intercambioIntercambio predefinidoFrecuencia en KHzPin del dispositivo PTTejemp.: /home/co7wt/CALLBK o C:/CALLBK Dejar en blanco para buscaren:Kilometros / HoramilibaresminutosCoeficiente tiempo de rcos: 1.0 ... 2.0 W1HKJ recomienda 1.275 DO2SMF recomienda 1.5reporteReportar en Grados CelciusReportar en Grados FahrenheitReportar en pulgadas de MercurioReportar en Kilometros por horaReportar en Millas por HoraReportar en milibaresreportessegundosExpresión regular de búsquedaSelecciona la letra del navegadorSelecc. por fechaEnviar QSO al guardar un contacto (Boton de guardar, , )ColorError desconocido con el fichero de audio wavModo de solo cascada{NAME} nombre del otrofldigi-3.21.80/po/stamp-po0000664000175000017500000000001212313333723012140 00000000000000timestamp fldigi-3.21.80/po/POTFILES.in0000664000175000017500000000157612313064025012246 00000000000000# List of source files which contain translatable strings. src/main.cxx src/dialogs/fl_digi.cxx src/dialogs/Viewer.cxx src/globals/globals.cxx src/logbook/adif_io.cxx src/logbook/logbook.cxx src/logbook/logsupport.cxx src/logger/rx_extract.cxx src/logger/speak.cxx src/misc/configuration.cxx src/misc/status.cxx src/misc/debug.cxx src/misc/macroedit.cxx src/misc/macros.cxx src/misc/network.cxx src/misc/newinstall.cxx src/mfsk/mfsk-pic.cxx src/waterfall/waterfall.cxx src/rigcontrol/FreqControl.cxx src/rigcontrol/rigsupport.cxx src/rigcontrol/rigxml.cxx src/soundcard/sound.cxx src/soundcard/soundconf.cxx src/spot/notify.cxx src/waterfall/colorbox.cxx src/widgets/FTextRXTX.cxx src/widgets/FTextView.cxx src/widgets/flinput2.cxx # Generated by fluid src/dialogs/confdialog.cxx src/dialogs/font_browser.cxx src/dialogs/record_browse.cxx src/dialogs/notifydialog.cxx src/logbook/lgbook.cxx fldigi-3.21.80/po/fr.po0000664000175000017500000040407612313333722011445 00000000000000# French translations for fldigi package # Traductions françaises du paquet fldigi. # Copyright (C) 2008 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # Stephane Fillod , 2009-2010. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.11\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2014-03-22 11:18-0500\n" "PO-Revision-Date: 2010-03-06 13:04+0200\n" "Last-Translator: Stephane Fillod \n" "Language-Team: French\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: src/main.cxx:415 #, c-format msgid "%s log started on %s" msgstr "%s log démarré le %s" #: src/main.cxx:1014 msgid "Bad modem id" msgstr "" #: src/main.cxx:1021 #, fuzzy msgid "Bad frequency" msgstr "Fréquence" #: src/main.cxx:1152 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licence GPLv3+: GNU GPL version 3 ou ultérieure \n" "Ceci est un logiciel libre : vous êtes libre de le modifier et de le " "redistribuer.\n" "Ce logiciel n'offre pas d'autre garantie que celle imposée par la loi.\n" #: src/main.cxx:1377 src/main.cxx:1419 src/main.cxx:1443 src/main.cxx:1457 #, fuzzy msgid "Could not make directory " msgstr "Ne peut pas créer le répertoire" #: src/dialogs/fl_digi.cxx:156 msgid "Log all RX/TX text" msgstr "" #: src/dialogs/fl_digi.cxx:157 src/misc/debug.cxx:103 msgid "Rig control" msgstr "Contrôle radio" #: src/dialogs/fl_digi.cxx:158 src/dialogs/fl_digi.cxx:5455 msgid "Op &Mode" msgstr "&Mode Op" #: src/dialogs/fl_digi.cxx:159 msgid "Show fewer modes" msgstr "" #: src/dialogs/fl_digi.cxx:160 msgid "Show all modes" msgstr "" #: src/dialogs/fl_digi.cxx:164 msgid "&View" msgstr "&Vue" #: src/dialogs/fl_digi.cxx:165 #, fuzzy msgid "&MFSK Image" msgstr "Image &MFSK" #: src/dialogs/fl_digi.cxx:166 msgid "&Weather Fax Image RX" msgstr "" #: src/dialogs/fl_digi.cxx:167 msgid "&Weather Fax Image TX" msgstr "" #: src/dialogs/fl_digi.cxx:168 src/dialogs/confdialog.cxx:5193 msgid "Contest" msgstr "Contest" #: src/dialogs/fl_digi.cxx:169 msgid "&Contest fields" msgstr "Champs &Contest" #: src/dialogs/fl_digi.cxx:170 msgid "C&ountries" msgstr "Pa&ys" #: src/dialogs/fl_digi.cxx:171 msgid "&UI" msgstr "" #: src/dialogs/fl_digi.cxx:172 msgid "Full" msgstr "Tous" #: src/dialogs/fl_digi.cxx:173 src/waterfall/waterfall.cxx:2119 #: src/dialogs/confdialog.cxx:5103 src/dialogs/confdialog.cxx:9806 #: src/dialogs/confdialog.cxx:9836 msgid "None" msgstr "Aucun" #: src/dialogs/fl_digi.cxx:174 msgid "Rig control and logging" msgstr "Contrôle radio et journal" #: src/dialogs/fl_digi.cxx:175 msgid "Rig control and contest" msgstr "Contrôle radio et concours" #: src/dialogs/fl_digi.cxx:176 msgid "Docked scope" msgstr "" #: src/dialogs/fl_digi.cxx:177 msgid "Minimal controls" msgstr "Contrôle minimal" #: src/dialogs/fl_digi.cxx:178 #, fuzzy msgid "Show channels" msgstr "Canaux" #: src/dialogs/fl_digi.cxx:180 msgid "Connect to server" msgstr "" #: src/dialogs/fl_digi.cxx:591 src/dialogs/fl_digi.cxx:606 #: src/dialogs/fl_digi.cxx:615 src/dialogs/fl_digi.cxx:3354 #: src/dialogs/fl_digi.cxx:3411 src/dialogs/fl_digi.cxx:3474 #: src/dialogs/fl_digi.cxx:5470 src/dialogs/fl_digi.cxx:5514 #: src/dialogs/fl_digi.cxx:5545 msgid "Custom..." msgstr "" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2763 msgid "Save changed macros?" msgstr "Sauvegarder les macros modifiées?" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2415 #: src/dialogs/fl_digi.cxx:2477 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 #: src/dialogs/fl_digi.cxx:3892 src/logbook/logsupport.cxx:585 #: src/misc/configuration.cxx:698 src/dialogs/font_browser.cxx:137 #: src/logbook/lgbook.cxx:447 src/logbook/lgbook.cxx:1056 msgid "Cancel" msgstr "Annuler" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 #: src/dialogs/fl_digi.cxx:3579 src/dialogs/fl_digi.cxx:4643 #: src/dialogs/fl_digi.cxx:4810 src/dialogs/fl_digi.cxx:4915 #: src/logbook/logsupport.cxx:584 src/dialogs/confdialog.cxx:10249 msgid "Save" msgstr "Sauvegarde" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 msgid "Don't save" msgstr "Ne pas sauvegarder" #: src/dialogs/fl_digi.cxx:1749 msgid "No file name given" msgstr "" #: src/dialogs/fl_digi.cxx:1752 msgid "Unsupported format" msgstr "" #: src/dialogs/fl_digi.cxx:1755 #, fuzzy msgid "channels != 1" msgstr "Canaux" #: src/dialogs/fl_digi.cxx:1758 msgid "unknown wave file error" msgstr "" #: src/dialogs/fl_digi.cxx:1765 msgid "Spotting disabled" msgstr "" #: src/dialogs/fl_digi.cxx:1814 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" #: src/dialogs/fl_digi.cxx:1827 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Echec d'ouverture d'url:\n" "%s\n" #: src/dialogs/fl_digi.cxx:1878 msgid "Checking for updates..." msgstr "Rechercher des mises à jour..." #: src/dialogs/fl_digi.cxx:1893 #, c-format msgid "" "Could not check for updates:\n" "%s" msgstr "" "Echec de recherche de mises à jour:\n" "%s" #: src/dialogs/fl_digi.cxx:1897 #, c-format msgid "" "Version %s is available at\n" "\n" "%s\n" "\n" "What would you like to do?" msgstr "" "La version %s est disponible chez\n" "\n" "%s\n" "\n" "Que voulez vous faire?" #: src/dialogs/fl_digi.cxx:1898 src/dialogs/Viewer.cxx:304 #: src/misc/macroedit.cxx:419 src/misc/newinstall.cxx:391 #: src/mfsk/mfsk-pic.cxx:342 src/spot/notify.cxx:519 src/spot/notify.cxx:523 #: src/dialogs/confdialog.cxx:10252 msgid "Close" msgstr "Fermer" #: src/dialogs/fl_digi.cxx:1898 msgid "Visit URL" msgstr "Visiter l'URL" #: src/dialogs/fl_digi.cxx:1898 msgid "Copy URL" msgstr "Copier l'URL" #: src/dialogs/fl_digi.cxx:1910 msgid "You are running the latest version" msgstr "Vous utilisez déjà la dernière version" #: src/dialogs/fl_digi.cxx:1976 msgid "Sunspot creation underway!" msgstr "Création sunspot en cours!" #: src/dialogs/fl_digi.cxx:1983 msgid "Audio device information is only available for the PortAudio backend" msgstr "" #: src/dialogs/fl_digi.cxx:1992 msgid "Capture device" msgstr "Périph. capture" #: src/dialogs/fl_digi.cxx:1993 msgid "Playback device" msgstr "Périph. sortie" #: src/dialogs/fl_digi.cxx:1997 msgid "Capture and playback devices" msgstr "" #: src/dialogs/fl_digi.cxx:2043 #, c-format msgid "%s: Do not exist, create?" msgstr "" #: src/dialogs/fl_digi.cxx:2043 src/dialogs/fl_digi.cxx:2796 #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 #: src/logbook/logsupport.cxx:251 src/logbook/logsupport.cxx:1047 #: src/misc/configuration.cxx:700 src/soundcard/sound.cxx:306 msgid "No" msgstr "Non" #: src/dialogs/fl_digi.cxx:2043 src/dialogs/fl_digi.cxx:2796 #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 #: src/logbook/logsupport.cxx:251 src/logbook/logsupport.cxx:1047 #: src/misc/configuration.cxx:700 src/soundcard/sound.cxx:306 msgid "Yes" msgstr "Oui" #: src/dialogs/fl_digi.cxx:2415 msgid "Clear log fields?" msgstr "Efface champ de log?" #: src/dialogs/fl_digi.cxx:2415 src/misc/configuration.cxx:698 #: src/logbook/lgbook.cxx:444 src/logbook/lgbook.cxx:1053 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:2430 msgid "Enter a CALL !" msgstr "" #: src/dialogs/fl_digi.cxx:2477 src/dialogs/fl_digi.cxx:3892 msgid "Confirm" msgstr "Confirmer" #: src/dialogs/fl_digi.cxx:2751 #, fuzzy msgid "Save changed configuration?" msgstr "Sauvegarder la configuration avant de quitter?" #: src/dialogs/fl_digi.cxx:2775 msgid "Save current log entry?" msgstr "" #: src/dialogs/fl_digi.cxx:2796 msgid "Really want to quit?" msgstr "" #: src/dialogs/fl_digi.cxx:3311 src/dialogs/fl_digi.cxx:5451 msgid "&File" msgstr "&Fichier" #: src/dialogs/fl_digi.cxx:3313 msgid "Folders" msgstr "Dossiers" #: src/dialogs/fl_digi.cxx:3314 msgid "Fldigi config..." msgstr "Config Fldigi..." #: src/dialogs/fl_digi.cxx:3315 #, fuzzy msgid "FLMSG files..." msgstr "Fichiers NBEMS..." #: src/dialogs/fl_digi.cxx:3316 msgid "NBEMS files..." msgstr "Fichiers NBEMS..." #: src/dialogs/fl_digi.cxx:3317 #, fuzzy msgid "Data files..." msgstr "Fichiers NBEMS..." #: src/dialogs/fl_digi.cxx:3320 src/dialogs/confdialog.cxx:5617 msgid "Macros" msgstr "" #: src/dialogs/fl_digi.cxx:3321 msgid "Open ..." msgstr "Ouvrir ..." #: src/dialogs/fl_digi.cxx:3322 msgid "Save ..." msgstr "Sauvegarder ..." #: src/dialogs/fl_digi.cxx:3325 msgid "Text Capture" msgstr "" #: src/dialogs/fl_digi.cxx:3330 src/misc/debug.cxx:101 #: src/dialogs/confdialog.cxx:8654 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:3331 msgid "RX capture" msgstr "Capture RX" #: src/dialogs/fl_digi.cxx:3332 msgid "TX generate" msgstr "Génération TX" #: src/dialogs/fl_digi.cxx:3333 src/dialogs/confdialog.cxx:8754 msgid "Playback" msgstr "Sortie" #: src/dialogs/fl_digi.cxx:3337 src/dialogs/fl_digi.cxx:5452 msgid "Exit" msgstr "Quitter" #: src/dialogs/fl_digi.cxx:3518 src/dialogs/fl_digi.cxx:5585 msgid "&Configure" msgstr "&Configuration" #: src/dialogs/fl_digi.cxx:3519 src/dialogs/confdialog.cxx:4937 msgid "Operator" msgstr "Opérateur" #: src/dialogs/fl_digi.cxx:3520 msgid "Colors && Fonts" msgstr "Couleurs && Polices" #: src/dialogs/fl_digi.cxx:3521 msgid "User Interface" msgstr "Interface Utilisateur" #: src/dialogs/fl_digi.cxx:3522 src/dialogs/fl_digi.cxx:3556 #: src/dialogs/fl_digi.cxx:5586 src/dialogs/confdialog.cxx:6112 msgid "Waterfall" msgstr "Chute d'eau" #: src/dialogs/fl_digi.cxx:3523 msgid "Waterfall controls" msgstr "Contrôles chute d'eau" #: src/dialogs/fl_digi.cxx:3525 src/dialogs/fl_digi.cxx:5589 #: src/dialogs/confdialog.cxx:6489 msgid "Modems" msgstr "Modems" #: src/dialogs/fl_digi.cxx:3527 src/dialogs/fl_digi.cxx:5588 msgid "Sound Card" msgstr "Carte Son" #: src/dialogs/fl_digi.cxx:3528 src/dialogs/fl_digi.cxx:5590 msgid "IDs" msgstr "IDs" #: src/dialogs/fl_digi.cxx:3529 src/dialogs/confdialog.cxx:9220 msgid "Misc" msgstr "Divers" #: src/dialogs/fl_digi.cxx:3530 src/dialogs/confdialog.cxx:10038 msgid "Autostart" msgstr "" #: src/dialogs/fl_digi.cxx:3531 src/dialogs/fl_digi.cxx:5591 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Notifications" #: src/dialogs/fl_digi.cxx:3533 msgid "QRZ/eQSL" msgstr "" #: src/dialogs/fl_digi.cxx:3534 src/dialogs/fl_digi.cxx:5592 msgid "Save Config" msgstr "Sauvegarde Config" #: src/dialogs/fl_digi.cxx:3539 msgid "View/Hide Channels" msgstr "" #: src/dialogs/fl_digi.cxx:3541 msgid "Floating scope" msgstr "Scope flottant" #: src/dialogs/fl_digi.cxx:3545 #, fuzzy msgid "Signal browser" msgstr "Navigateur PSK" #: src/dialogs/fl_digi.cxx:3548 msgid "Controls" msgstr "Contrôles" #: src/dialogs/fl_digi.cxx:3563 msgid "&Logbook" msgstr "&Journal" #: src/dialogs/fl_digi.cxx:3564 #, fuzzy msgid "View" msgstr "&Vue" #: src/dialogs/fl_digi.cxx:3566 msgid "ADIF" msgstr "" #: src/dialogs/fl_digi.cxx:3567 #, fuzzy msgid "Merge..." msgstr "Fusion ADIF..." #: src/dialogs/fl_digi.cxx:3568 msgid "Export..." msgstr "" #: src/dialogs/fl_digi.cxx:3571 msgid "Reports" msgstr "" #: src/dialogs/fl_digi.cxx:3572 #, fuzzy msgid "Text..." msgstr "Test..." #: src/dialogs/fl_digi.cxx:3573 msgid "CSV..." msgstr "" #: src/dialogs/fl_digi.cxx:3574 msgid "Cabrillo..." msgstr "" #: src/dialogs/fl_digi.cxx:3577 src/logbook/logsupport.cxx:593 #: src/logbook/lgbook.cxx:960 msgid "New" msgstr "Nouveau" #: src/dialogs/fl_digi.cxx:3578 src/dialogs/confdialog.cxx:8200 msgid "Open..." msgstr "Ouvrir..." #: src/dialogs/fl_digi.cxx:3586 msgid "&Help" msgstr "&Aide" #: src/dialogs/fl_digi.cxx:3589 msgid "Create sunspots" msgstr "Création sunspots" #: src/dialogs/fl_digi.cxx:3591 msgid "Beginners' Guide" msgstr "Guide Débutants" #: src/dialogs/fl_digi.cxx:3592 msgid "Online documentation..." msgstr "Documentation en ligne..." #: src/dialogs/fl_digi.cxx:3593 msgid "Fldigi web site..." msgstr "Site web Fldigi..." #: src/dialogs/fl_digi.cxx:3594 msgid "Reception reports..." msgstr "Rapport d'écoute..." #: src/dialogs/fl_digi.cxx:3595 msgid "Command line options" msgstr "Options ligne de commande" #: src/dialogs/fl_digi.cxx:3596 msgid "Audio device info" msgstr "Info périphérique audio" #: src/dialogs/fl_digi.cxx:3597 msgid "Build info" msgstr "" #: src/dialogs/fl_digi.cxx:3598 src/misc/debug.cxx:137 msgid "Event log" msgstr "Historique événements" #: src/dialogs/fl_digi.cxx:3599 msgid "Check for updates..." msgstr "Rechercher des mises à jour..." #: src/dialogs/fl_digi.cxx:3600 msgid "&About" msgstr "À &propos" #: src/dialogs/fl_digi.cxx:3834 msgid "waterfall-only mode" msgstr "" #: src/dialogs/fl_digi.cxx:3836 msgid "NO CALLSIGN SET" msgstr "PAS D'INDICATIF" #: src/dialogs/fl_digi.cxx:3851 msgid "Close List" msgstr "Fermer Liste" #: src/dialogs/fl_digi.cxx:3861 src/dialogs/fl_digi.cxx:4491 #: src/dialogs/fl_digi.cxx:4789 src/dialogs/fl_digi.cxx:4901 msgid "Open List" msgstr "Ouvrir Liste" #: src/dialogs/fl_digi.cxx:3892 msgid "Clear list?" msgstr "Efface la liste?" #: src/dialogs/fl_digi.cxx:3925 msgid "report" msgstr "" #: src/dialogs/fl_digi.cxx:3925 msgid "reports" msgstr "" #: src/dialogs/fl_digi.cxx:3935 msgid "Recent activity for grid" msgstr "" #: src/dialogs/fl_digi.cxx:4485 msgid "No rig specified" msgstr "Aucune radio spécifiée" #: src/dialogs/fl_digi.cxx:4562 src/spot/notify.cxx:215 #: src/dialogs/confdialog.cxx:5181 msgid "Select" msgstr "Sélectionne" #: src/dialogs/fl_digi.cxx:4569 msgid "Add current frequency" msgstr "Ajoute fréquence courante" #: src/dialogs/fl_digi.cxx:4576 msgid "Clear list" msgstr "Efface Liste" #: src/dialogs/fl_digi.cxx:4583 msgid "Delete from list" msgstr "Supprimer de la Liste" #: src/dialogs/fl_digi.cxx:4603 msgid "Select operating parameters" msgstr "Sélectionne paramètres opératoires" #: src/dialogs/fl_digi.cxx:4629 src/dialogs/fl_digi.cxx:4796 msgid "QRZ" msgstr "QRZ" #: src/dialogs/fl_digi.cxx:4636 src/dialogs/fl_digi.cxx:4803 #: src/dialogs/fl_digi.cxx:4908 src/dialogs/fl_digi.cxx:5124 #: src/dialogs/Viewer.cxx:312 src/widgets/FTextView.cxx:480 #: src/widgets/FTextView.cxx:645 src/widgets/flinput2.cxx:47 #: src/dialogs/confdialog.cxx:7570 msgid "Clear" msgstr "Effacer" #: src/dialogs/fl_digi.cxx:4655 src/logbook/lgbook.cxx:467 #: src/logbook/lgbook.cxx:1079 msgid "Freq" msgstr "Fréq" #: src/dialogs/fl_digi.cxx:4657 #, fuzzy msgid "frequency kHz" msgstr "Fréquence" #: src/dialogs/fl_digi.cxx:4660 src/dialogs/fl_digi.cxx:4812 #: src/dialogs/fl_digi.cxx:4918 msgid "On" msgstr "Début" #: src/dialogs/fl_digi.cxx:4661 msgid "Press to update QSO start time" msgstr "" #: src/dialogs/fl_digi.cxx:4665 #, fuzzy msgid "QSO start time" msgstr "Date QSO" #: src/dialogs/fl_digi.cxx:4669 src/dialogs/fl_digi.cxx:4825 #: src/dialogs/fl_digi.cxx:4919 msgid "Off" msgstr "Fin" #: src/dialogs/fl_digi.cxx:4670 #, fuzzy msgid "QSO end time" msgstr "Envoyer image" #: src/dialogs/fl_digi.cxx:4674 src/dialogs/fl_digi.cxx:4842 #: src/logbook/lgbook.cxx:620 msgid "In" msgstr "" #: src/dialogs/fl_digi.cxx:4678 src/dialogs/fl_digi.cxx:4850 #: src/logbook/lgbook.cxx:706 msgid "Out" msgstr "" #: src/dialogs/fl_digi.cxx:4682 src/dialogs/fl_digi.cxx:4834 #: src/dialogs/fl_digi.cxx:4920 src/widgets/FTextRXTX.cxx:105 #: src/logbook/lgbook.cxx:459 src/logbook/lgbook.cxx:596 #: src/logbook/lgbook.cxx:1075 msgid "Call" msgstr "Indicatif" #: src/dialogs/fl_digi.cxx:4683 #, fuzzy msgid "call sign" msgstr "Indicatif" #: src/dialogs/fl_digi.cxx:4686 msgid "Op" msgstr "" #: src/dialogs/fl_digi.cxx:4687 #, fuzzy msgid "Operator name" msgstr "Noms opérateurs" #: src/dialogs/fl_digi.cxx:4691 msgid "Azimuth" msgstr "" #: src/dialogs/fl_digi.cxx:4697 msgid "City" msgstr "Ville" #: src/dialogs/fl_digi.cxx:4701 msgid "US State" msgstr "État USA" #: src/dialogs/fl_digi.cxx:4705 msgid "Can. Province" msgstr "Province Can." #: src/dialogs/fl_digi.cxx:4709 msgid "Maidenhead Locator" msgstr "" #: src/dialogs/fl_digi.cxx:4720 src/dialogs/fl_digi.cxx:4969 msgid "Sent serial number (read only)" msgstr "" #: src/dialogs/fl_digi.cxx:4725 src/dialogs/fl_digi.cxx:4960 msgid "Received serial number" msgstr "" #: src/dialogs/fl_digi.cxx:4729 src/dialogs/fl_digi.cxx:4951 msgid "Contest exchange in" msgstr "" #: src/dialogs/fl_digi.cxx:4744 src/spot/notify.cxx:569 #: src/widgets/FTextRXTX.cxx:110 src/logbook/lgbook.cxx:521 #: src/logbook/lgbook.cxx:767 msgid "Country" msgstr "Pays" #: src/dialogs/fl_digi.cxx:4750 src/logbook/lgbook.cxx:524 #: src/logbook/lgbook.cxx:791 msgid "Notes" msgstr "Notes" #: src/dialogs/fl_digi.cxx:4816 src/dialogs/fl_digi.cxx:4975 msgid "Press to update" msgstr "" #: src/dialogs/fl_digi.cxx:4822 src/dialogs/fl_digi.cxx:4981 #: src/logbook/lgbook.cxx:584 msgid "Time On" msgstr "Heure ON" #: src/dialogs/fl_digi.cxx:4831 src/dialogs/fl_digi.cxx:4989 #: src/logbook/lgbook.cxx:658 msgid "Time Off" msgstr "Heure OFF" #: src/dialogs/fl_digi.cxx:4840 src/dialogs/fl_digi.cxx:4936 #: src/dialogs/fl_digi.cxx:5289 msgid "Other call" msgstr "Autre Indicatif" #: src/dialogs/fl_digi.cxx:4848 msgid "Received RST" msgstr "RST reçu" #: src/dialogs/fl_digi.cxx:4856 msgid "Sent RST" msgstr "RST env." #: src/dialogs/fl_digi.cxx:4858 msgid "Nm" msgstr "Nm" #: src/dialogs/fl_digi.cxx:4865 msgid "Other name" msgstr "Autre nom" #: src/dialogs/fl_digi.cxx:4921 msgid "# S" msgstr "" #: src/dialogs/fl_digi.cxx:4922 msgid "# R" msgstr "" #: src/dialogs/fl_digi.cxx:4923 msgid "Ex" msgstr "" #: src/dialogs/fl_digi.cxx:5029 #, fuzzy msgid "" "Left Click - execute\n" "Shift-Fkey - execute\n" "Right Click - edit" msgstr "" "Clic Gauche - exécute\n" "Clic Droit - édite" #: src/dialogs/fl_digi.cxx:5036 #, fuzzy msgid "Shift-key macro set" msgstr "Change d'ensemble de macro" #: src/dialogs/fl_digi.cxx:5083 #, fuzzy msgid "" "Left click - select\n" "Right click - clear line" msgstr "" "Clic Gauche - exécute\n" "Clic Droit - édite" #: src/dialogs/fl_digi.cxx:5099 msgid "seek - regular expression" msgstr "" #: src/dialogs/fl_digi.cxx:5120 src/dialogs/Viewer.cxx:322 msgid "Set Viewer Squelch" msgstr "Positionne le Squelch Visualiseur" #: src/dialogs/fl_digi.cxx:5207 #, fuzzy msgid "" "Left Click - execute\n" "Fkey - execute\n" "Right Click - edit" msgstr "" "Clic Gauche - exécute\n" "Clic Droit - édite" #: src/dialogs/fl_digi.cxx:5214 #, fuzzy msgid "Primary macro set" msgstr "Change d'ensemble de macro" #: src/dialogs/fl_digi.cxx:5231 src/dialogs/fl_digi.cxx:5813 msgid "Detected signal level" msgstr "Détecte le niveau de signal" #: src/dialogs/fl_digi.cxx:5242 src/dialogs/fl_digi.cxx:5825 #: src/waterfall/waterfall.cxx:2120 msgid "Squelch level" msgstr "Niveau squelch" #: src/dialogs/fl_digi.cxx:5256 src/dialogs/fl_digi.cxx:5839 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Clic Gauche: change mode\n" "Clic Droit: configure" #: src/dialogs/fl_digi.cxx:5266 src/dialogs/fl_digi.cxx:5846 #, fuzzy msgid "CW transmit WPM" msgstr "Transmission" #: src/dialogs/fl_digi.cxx:5272 src/dialogs/fl_digi.cxx:5853 msgid "Default WPM" msgstr "WPM par défaut" #: src/dialogs/fl_digi.cxx:5311 src/dialogs/fl_digi.cxx:5885 msgid "Tx level attenuator (dB)" msgstr "" #: src/dialogs/fl_digi.cxx:5335 src/dialogs/fl_digi.cxx:5908 msgid "Automatic Frequency Control" msgstr "Contrôle Automatique de Fréquence" #: src/dialogs/fl_digi.cxx:5338 src/dialogs/fl_digi.cxx:5911 msgid "Squelch" msgstr "Squelch" #: src/dialogs/fl_digi.cxx:5381 src/dialogs/fl_digi.cxx:5723 msgid "Scope" msgstr "Scope" #: src/dialogs/fl_digi.cxx:5601 src/dialogs/Viewer.cxx:279 #, fuzzy msgid "Signal Browser" msgstr "Navigateur PSK" #: src/dialogs/Viewer.cxx:283 msgid "Find: " msgstr "Cherche: " #: src/dialogs/Viewer.cxx:316 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Clic gauche pour effacer le texte\n" "Clic droit pour reset fréquences" #: src/logbook/adif_io.cxx:233 #, fuzzy, c-format msgid "Empty ADIF logbook file %s" msgstr "Ouvrir le fichier journal" #: src/logbook/adif_io.cxx:252 #, c-format msgid "Error reading %s" msgstr "" #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 msgid "Save changed Logbook?" msgstr "Sauvegarder le journal modifié?" #: src/logbook/logsupport.cxx:141 msgid "Export to CSV file" msgstr "" #: src/logbook/logsupport.cxx:167 msgid "Export to fixed field text file" msgstr "" #: src/logbook/logsupport.cxx:194 msgid "Export to ADIF file" msgstr "Export vers fichier ADIF" #: src/logbook/logsupport.cxx:251 #, fuzzy msgid "Create New Logbook?" msgstr "Nouveau journal" #: src/logbook/logsupport.cxx:280 msgid "Open logbook file" msgstr "Ouvrir le fichier journal" #: src/logbook/logsupport.cxx:303 msgid "Save logbook file" msgstr "Sauvegarde le fichier journal" #: src/logbook/logsupport.cxx:497 msgid "Merge ADIF file" msgstr "Fusion fichier ADIF" #: src/logbook/logsupport.cxx:594 src/spot/notify.cxx:203 #: src/spot/notify.cxx:517 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:967 msgid "Update" msgstr "Mise à jour" #: src/logbook/logsupport.cxx:1046 #, c-format msgid "Really delete record for \"%s\"?" msgstr "" #: src/logbook/logsupport.cxx:1433 msgid "Create cabrillo report" msgstr "" #: src/logger/rx_extract.cxx:55 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:60 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:270 #, fuzzy msgid "Could not start flmsg" msgstr "Echec mise-à-jour fichier %s" #: src/logger/rx_extract.cxx:337 src/logger/rx_extract.cxx:340 #: src/dialogs/confdialog.cxx:9287 msgid "Locate flmsg executable" msgstr "" #: src/logger/rx_extract.cxx:337 msgid "flmsg.exe\t*.exe" msgstr "" #: src/logger/rx_extract.cxx:340 msgid "flmsg\t*" msgstr "" #: src/logger/rx_extract.cxx:415 msgid "Locate executable" msgstr "" #: src/logger/rx_extract.cxx:415 msgid "*.exe" msgstr "" #: src/logger/rx_extract.cxx:425 #, fuzzy msgid "Locate binary" msgstr "Locator" #: src/logger/rx_extract.cxx:425 msgid "*" msgstr "" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" #: src/misc/configuration.cxx:508 msgid "Rig mode" msgstr "Mode Radio" #: src/misc/configuration.cxx:509 msgid "Always LSB" msgstr "Toujours LSB" #: src/misc/configuration.cxx:510 msgid "Always USB" msgstr "Toujours USB" #: src/misc/configuration.cxx:695 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" #: src/misc/configuration.cxx:700 msgid "Confirm RESET" msgstr "Confirmer RESET" #: src/misc/debug.cxx:91 msgid "Quiet" msgstr "Calme" #: src/misc/debug.cxx:91 msgid "Error" msgstr "Erreur" #: src/misc/debug.cxx:91 msgid "Warning" msgstr "Avertissement" #: src/misc/debug.cxx:91 msgid "Info" msgstr "Info" #: src/misc/debug.cxx:91 msgid "Verbose" msgstr "" #: src/misc/debug.cxx:91 msgid "Debug" msgstr "Débug" #: src/misc/debug.cxx:100 msgid "ARQ control" msgstr "Contrôle ARQ" #: src/misc/debug.cxx:102 src/waterfall/waterfall.cxx:2121 msgid "Modem" msgstr "Modem" #: src/misc/debug.cxx:104 msgid "RPC" msgstr "RPC" #: src/misc/debug.cxx:105 msgid "Spotter" msgstr "" #: src/misc/debug.cxx:106 msgid "Other" msgstr "Autre" #: src/misc/debug.cxx:141 msgid "Log sources" msgstr "" #: src/misc/debug.cxx:146 msgid "Change log level" msgstr "Change niveau de log" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "\tma fréquence" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "\tmode" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "\tmon indicatif" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "\tmon locator" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "\tmon nom" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "\tmon QTH" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "\tmon RST" #: src/misc/macroedit.cxx:78 msgid "\tmy antenna" msgstr "" #: src/misc/macroedit.cxx:79 msgid "\toperating band" msgstr "" #: src/misc/macroedit.cxx:81 msgid "\tFldigi version" msgstr "" #: src/misc/macroedit.cxx:84 msgid "\tother call" msgstr "\tindicatif de l'autre" #: src/misc/macroedit.cxx:85 msgid "\tS/N etc." msgstr "" #: src/misc/macroedit.cxx:86 msgid "\tIMD etc." msgstr "" #: src/misc/macroedit.cxx:87 msgid "\tother locator" msgstr "\tlocator de l'autre" #: src/misc/macroedit.cxx:88 msgid "\tother name" msgstr "\tnom de l'autre" #: src/misc/macroedit.cxx:89 msgid "\tother QTH" msgstr "\tQTH de l'autre" #: src/misc/macroedit.cxx:90 msgid "\tother RST" msgstr "\tRST de l'autre" #: src/misc/macroedit.cxx:91 msgid "\t# QSO recs" msgstr "" #: src/misc/macroedit.cxx:92 msgid "\tnext QSO rec #" msgstr "" #: src/misc/macroedit.cxx:93 msgid "\tmap on google" msgstr "" #: src/misc/macroedit.cxx:94 msgid "\tmap by value" msgstr "" #: src/misc/macroedit.cxx:97 msgid "\tclear RX pane" msgstr "" #: src/misc/macroedit.cxx:98 #, fuzzy msgid "\tclear TX pane" msgstr "Efface champ de log?" #: src/misc/macroedit.cxx:101 msgid "\ttext to NAME/QTH" msgstr "" #: src/misc/macroedit.cxx:105 msgid "\tDigitalk On, Off, Toggle" msgstr "" #: src/misc/macroedit.cxx:109 #, fuzzy msgid "\tclear log fields" msgstr "Efface champ de log?" #: src/misc/macroedit.cxx:110 msgid "\tsave QSO data" msgstr "" #: src/misc/macroedit.cxx:111 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:112 msgid "\tlog at xmt time" msgstr "" #: src/misc/macroedit.cxx:113 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:114 msgid "\tlog eQSL" msgstr "" #: src/misc/macroedit.cxx:115 msgid "\tlog eQSL optional msg" msgstr "" #: src/misc/macroedit.cxx:118 msgid "\tQSO time (HHMM))" msgstr "" #: src/misc/macroedit.cxx:119 msgid "\tLDT in iso-8601 format" msgstr "" #: src/misc/macroedit.cxx:120 msgid "\tLocal datetime" msgstr "" #: src/misc/macroedit.cxx:121 msgid "\tZDT in iso-8601 format" msgstr "" #: src/misc/macroedit.cxx:122 msgid "\tUTC datetime" msgstr "" #: src/misc/macroedit.cxx:123 msgid "\tlocal time HHMM" msgstr "" #: src/misc/macroedit.cxx:124 msgid "\tzulu time HHMMZ" msgstr "" #: src/misc/macroedit.cxx:125 msgid "\tlocal date YYYY-MM-DD" msgstr "" #: src/misc/macroedit.cxx:126 msgid "\tzulu date YYYY-MM-DD Z" msgstr "" #: src/misc/macroedit.cxx:127 msgid "\tget weather data" msgstr "" #: src/misc/macroedit.cxx:128 msgid "\tget weather data for station" msgstr "" #: src/misc/macroedit.cxx:131 msgid "\tcontest counter" msgstr "" #: src/misc/macroedit.cxx:132 msgid "\tdecrement counter" msgstr "" #: src/misc/macroedit.cxx:133 msgid "\tincrement counter" msgstr "" #: src/misc/macroedit.cxx:134 msgid "\texchange in" msgstr "" #: src/misc/macroedit.cxx:135 msgid "\texchange out" msgstr "" #: src/misc/macroedit.cxx:136 msgid "\texchange begin" msgstr "" #: src/misc/macroedit.cxx:137 msgid "\texchange end" msgstr "" #: src/misc/macroedit.cxx:138 msgid "\tsave contest out" msgstr "" #: src/misc/macroedit.cxx:141 msgid "\treceive" msgstr "\treçois" #: src/misc/macroedit.cxx:142 msgid "\ttransmit" msgstr "\ttransmets" #: src/misc/macroedit.cxx:143 msgid "\ttoggle T/R" msgstr "" #: src/misc/macroedit.cxx:144 msgid "\tsearch UP for signal" msgstr "" #: src/misc/macroedit.cxx:145 msgid "\tsearch DOWN for signal" msgstr "" #: src/misc/macroedit.cxx:146 msgid "\treturn to sweet spot" msgstr "" #: src/misc/macroedit.cxx:147 msgid "\tmove to freq NNNN Hz" msgstr "" #: src/misc/macroedit.cxx:148 msgid "\tleft-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:149 msgid "\tright-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:152 msgid "\tinsert QRG into Rx text" msgstr "" #: src/misc/macroedit.cxx:155 msgid "\tqsy to kHz, Hz" msgstr "" #: src/misc/macroedit.cxx:156 msgid "\tvalid xcvr mode" msgstr "" #: src/misc/macroedit.cxx:157 msgid "\tvalid xcvr filter width" msgstr "" #: src/misc/macroedit.cxx:160 msgid "\tinsert text file" msgstr "" #: src/misc/macroedit.cxx:161 msgid "\tinsert MFSK image" msgstr "" #: src/misc/macroedit.cxx:164 #, fuzzy msgid "\tpause transmit" msgstr "\ttransmets" #: src/misc/macroedit.cxx:165 msgid "\tidle signal for NN.nn sec" msgstr "" #: src/misc/macroedit.cxx:166 msgid "\trepeat every NN sec" msgstr "" #: src/misc/macroedit.cxx:167 msgid "\ttune signal for NN sec" msgstr "" #: src/misc/macroedit.cxx:168 msgid "\tdelay xmt for NN sec" msgstr "" #: src/misc/macroedit.cxx:169 msgid "\trepeat macro continuously" msgstr "" #: src/misc/macroedit.cxx:170 msgid "\tschedule execution" msgstr "" #: src/misc/macroedit.cxx:173 msgid "\t set xmt attenuator" msgstr "" #: src/misc/macroedit.cxx:176 msgid "\tCW identifier" msgstr "" #: src/misc/macroedit.cxx:177 msgid "\tsend mode ID in video text" msgstr "" #: src/misc/macroedit.cxx:178 msgid "\tvideo text" msgstr "" #: src/misc/macroedit.cxx:179 msgid "\tTx RSID on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:180 msgid "\tRx RSID on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:181 msgid "\tTransmit |NN| successive RsID bursts" msgstr "" #: src/misc/macroedit.cxx:182 msgid "\t[Wait][Len](ms)" msgstr "" #: src/misc/macroedit.cxx:185 msgid "\tCW QSK post-timing" msgstr "" #: src/misc/macroedit.cxx:186 msgid "\tCW QSK pre-timing" msgstr "" #: src/misc/macroedit.cxx:187 msgid "\tCW rise time" msgstr "" #: src/misc/macroedit.cxx:188 msgid "\tCW WPM:Farnsworth" msgstr "" #: src/misc/macroedit.cxx:191 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:194 msgid "\tAFC on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:195 msgid "\tLOCK on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:196 msgid "\tRev on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:199 msgid "\tchange macro defs file" msgstr "" #: src/misc/macroedit.cxx:200 #, fuzzy msgid "\tsave current macro file" msgstr "Enregistrer fichier macros" #: src/misc/macroedit.cxx:203 msgid "\tuntransmitted comment" msgstr "" #: src/misc/macroedit.cxx:206 msgid "\tmodem timing test internal string" msgstr "" #: src/misc/macroedit.cxx:207 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:208 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:211 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:212 msgid "\tWAV file; spec' file" msgstr "" #: src/misc/macroedit.cxx:213 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:328 msgid "Text file to insert" msgstr "" #: src/misc/macroedit.cxx:336 msgid "Test text file" msgstr "" #: src/misc/macroedit.cxx:344 #, fuzzy msgid "MFSK image file" msgstr "Charge fichier image" #: src/misc/macroedit.cxx:351 msgid "Change to Macro file" msgstr "" #: src/misc/macroedit.cxx:361 msgid "Executable file to insert" msgstr "" #: src/misc/macroedit.cxx:391 #, fuzzy msgid "Macro Text" msgstr "Éditeur de macro - " #: src/misc/macroedit.cxx:396 #, fuzzy msgid "Select Tag" msgstr "Sélectionne" #: src/misc/macroedit.cxx:408 msgid "Macro Button Label" msgstr "" #: src/misc/macroedit.cxx:416 msgid "Apply" msgstr "" #: src/misc/macroedit.cxx:443 msgid "Macro editor - " msgstr "Éditeur de macro - " #: src/misc/macros.cxx:2786 msgid "Open macro file" msgstr "Ouvrir fichier macros" #: src/misc/macros.cxx:2787 src/misc/macros.cxx:2825 #, fuzzy msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Fichier de définition macro Fldigi\t*.mdf" #: src/misc/macros.cxx:2824 msgid "Save macro file" msgstr "Enregistrer fichier macros" #: src/misc/network.cxx:170 msgid "Aborted" msgstr "Annulé" #: src/misc/network.cxx:170 msgid "Timed out" msgstr "" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "" #: src/misc/newinstall.cxx:389 #, fuzzy msgid "Back" msgstr "Arrière plan" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "" #: src/misc/newinstall.cxx:522 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "" #: src/misc/newinstall.cxx:523 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" #: src/misc/newinstall.cxx:538 #, fuzzy msgid "Fldigi configuration wizard" msgstr "Config Fldigi..." #: src/mfsk/mfsk-pic.cxx:142 src/mfsk/mfsk-pic.cxx:146 #: src/mfsk/mfsk-pic.cxx:305 src/mfsk/mfsk-pic.cxx:308 msgid "Time needed: " msgstr "Temps nécessaire: " #: src/mfsk/mfsk-pic.cxx:175 msgid "Load image file" msgstr "Charge fichier image" #: src/mfsk/mfsk-pic.cxx:316 msgid "Send image" msgstr "Envoyer image" #: src/mfsk/mfsk-pic.cxx:323 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" #: src/mfsk/mfsk-pic.cxx:327 msgid "Transfer speed, X1-normal" msgstr "" #: src/mfsk/mfsk-pic.cxx:339 msgid "Load" msgstr "Charge" #: src/waterfall/waterfall.cxx:1563 msgid "Waterfall / FFT / Scope" msgstr "" #: src/waterfall/waterfall.cxx:1573 msgid "Upper signal level (dB)" msgstr "Niveau haut de signal (dB)" #: src/waterfall/waterfall.cxx:1584 msgid "Signal range (dB)" msgstr "Plage du signal (dB)" #: src/waterfall/waterfall.cxx:1590 msgid "Change waterfall scale" msgstr "Change échelle chute d'eau" #: src/waterfall/waterfall.cxx:1595 msgid "Slew display lower in frequency" msgstr "" #: src/waterfall/waterfall.cxx:1600 msgid "Center display on signal" msgstr "Centre affichage sur signal" #: src/waterfall/waterfall.cxx:1605 msgid "Slew display higher in frequency" msgstr "" #: src/waterfall/waterfall.cxx:1610 msgid "Waterfall drop speed" msgstr "Visitesse chute d'eau" #: src/waterfall/waterfall.cxx:1620 msgid "Adjust cursor frequency" msgstr "Ajuste fréquence curseur" #: src/waterfall/waterfall.cxx:1625 msgid "" "Center in passband\n" "Right click to undo" msgstr "" #: src/waterfall/waterfall.cxx:1631 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Enregistre le mode et la fréquence\n" "Clic droit pour la liste" #: src/waterfall/waterfall.cxx:1641 msgid "Lock transmit frequency" msgstr "" #: src/waterfall/waterfall.cxx:1650 src/dialogs/confdialog.cxx:5706 msgid "Reverse" msgstr "Inverse" #: src/waterfall/waterfall.cxx:1657 msgid "Transmit/Receive" msgstr "Transmet/Reçoit" #: src/waterfall/waterfall.cxx:2119 #, fuzzy msgid "AFC range or BW" msgstr "Plage AFC (Hz)" #: src/waterfall/waterfall.cxx:2120 #, fuzzy msgid "Signal search" msgstr "Niveau signal" #: src/waterfall/waterfall.cxx:2121 msgid "Modem carrier" msgstr "" #: src/waterfall/waterfall.cxx:2121 msgid "Scroll" msgstr "" #: src/rigcontrol/FreqControl.cxx:136 msgid "" "Enter frequency or change with\n" "Left/Right/Up/Down/Pg_Up/Pg_Down" msgstr "" "Entrer fréquence ou changer avec\n" "Gauche/Droite/Haut/Bas/Pg_Haut/Pg_Bas" #: src/rigcontrol/rigsupport.cxx:469 msgid "Enter Xcvr Freq" msgstr "" #: src/rigcontrol/rigxml.cxx:946 msgid "Open rig xml file" msgstr "Ouvrir fichier rig xml" #: src/rigcontrol/rigxml.cxx:946 msgid "Fldigi rig xml definition file\t*.xml" msgstr "Fichier de définition rig xml\t*.xml" #: src/soundcard/sound.cxx:149 msgid "" "Waveform Audio Format\t*.wav\n" "AU\t*.{au,snd}\n" msgstr "" #: src/soundcard/sound.cxx:152 msgid "Free Lossless Audio Codec\t*.flac" msgstr "" #: src/soundcard/sound.cxx:158 src/soundcard/sound.cxx:160 msgid "Audio file" msgstr "Fichier audio" #: src/soundcard/sound.cxx:306 msgid "Playback continuous loop?" msgstr "" #: src/spot/notify.cxx:191 msgid "My callsign de CALL" msgstr "" #: src/spot/notify.cxx:192 msgid "Station heard twice" msgstr "" #: src/spot/notify.cxx:193 msgid "Custom text search" msgstr "" #: src/spot/notify.cxx:194 msgid "RSID reception" msgstr "" #: src/spot/notify.cxx:202 msgid "Toggle" msgstr "Bascule" #: src/spot/notify.cxx:204 src/spot/notify.cxx:516 msgid "Remove" msgstr "Enlever" #: src/spot/notify.cxx:216 src/spot/notify.cxx:222 src/spot/notify.cxx:570 #: src/logbook/lgbook.cxx:548 src/logbook/lgbook.cxx:853 msgid "Continent" msgstr "Continent" #: src/spot/notify.cxx:217 src/spot/notify.cxx:223 src/logbook/lgbook.cxx:841 msgid "ITU zone" msgstr "Zone ITU" #: src/spot/notify.cxx:218 src/spot/notify.cxx:224 src/logbook/lgbook.cxx:829 msgid "CQ zone" msgstr "Zone CQ" #: src/spot/notify.cxx:219 src/spot/notify.cxx:225 msgid "All" msgstr "Tous" #: src/spot/notify.cxx:221 msgid "Deselect" msgstr "Désélectionne" #: src/spot/notify.cxx:515 msgid "Add" msgstr "Ajoute" #: src/spot/notify.cxx:518 msgid "Test..." msgstr "Test..." #: src/spot/notify.cxx:521 src/widgets/FTextView.cxx:481 #: src/widgets/flinput2.cxx:48 msgid "Select All" msgstr "Tout Sélectionner" #: src/spot/notify.cxx:522 src/logbook/lgbook.cxx:403 #: src/logbook/lgbook.cxx:453 src/logbook/lgbook.cxx:1045 #: src/logbook/lgbook.cxx:1119 msgid "Clear All" msgstr "Efface Tout" #: src/spot/notify.cxx:1095 msgid "The regular expression field must not be empty." msgstr "" #: src/spot/notify.cxx:1101 msgid "The regular expression must be valid." msgstr "" #: src/spot/notify.cxx:1108 msgid "Please set your callsign first." msgstr "" #: src/spot/notify.cxx:1245 msgid "Run program" msgstr "" #: src/spot/notify.cxx:1278 msgid "" "Default test string is:\n" " \"" msgstr "" #: src/spot/notify.cxx:1279 msgid "Enter test string or leave blank for default:" msgstr "" #: src/spot/notify.cxx:1290 msgid "This event's regular expression is invalid." msgstr "" #: src/spot/notify.cxx:1297 msgid "The test string did not match this event's search pattern." msgstr "" #: src/spot/notify.cxx:1315 msgid "Available substrings" msgstr "" #: src/spot/notify.cxx:1398 src/logbook/lgbook.cxx:1026 msgid "Frequency" msgstr "Fréquence" #: src/spot/notify.cxx:1400 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1023 msgid "Callsign" msgstr "Indicatif" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "Ouvrir palette" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:126 msgid "Fldigi palette\t*.pal" msgstr "Palette Fldigi\t*.pal" #: src/waterfall/colorbox.cxx:112 src/waterfall/colorbox.cxx:137 msgid "Palette: " msgstr "Palette: " #: src/waterfall/colorbox.cxx:126 msgid "Save palette" msgstr "Enregistrement palette" #: src/widgets/FTextRXTX.cxx:104 msgid "Look up call" msgstr "Recherche indicatif" #: src/widgets/FTextRXTX.cxx:106 src/logbook/lgbook.cxx:463 #: src/logbook/lgbook.cxx:608 src/logbook/lgbook.cxx:1025 msgid "Name" msgstr "Nom" #: src/widgets/FTextRXTX.cxx:107 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:108 src/dialogs/confdialog.cxx:5298 #: src/logbook/lgbook.cxx:512 msgid "State" msgstr "État" #: src/widgets/FTextRXTX.cxx:109 src/logbook/lgbook.cxx:518 msgid "Province" msgstr "Province" #: src/widgets/FTextRXTX.cxx:111 msgid "Locator" msgstr "Locator" #: src/widgets/FTextRXTX.cxx:112 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:113 src/dialogs/confdialog.cxx:5304 #: src/logbook/lgbook.cxx:539 src/logbook/lgbook.cxx:924 #: src/logbook/lgbook.cxx:1111 msgid "Exchange In" msgstr "" #: src/widgets/FTextRXTX.cxx:114 src/dialogs/confdialog.cxx:5229 msgid "Serial number" msgstr "Numéro progressif" #: src/widgets/FTextRXTX.cxx:115 msgid "Insert marker" msgstr "Insère marqueur" #: src/widgets/FTextRXTX.cxx:123 msgid "Quick entry" msgstr "Entrée rapide" #: src/widgets/FTextRXTX.cxx:124 msgid "Scroll hints" msgstr "" #: src/widgets/FTextRXTX.cxx:704 msgid " in " msgstr "" #: src/widgets/FTextRXTX.cxx:706 msgid "Last QSO" msgstr "Dernier QSO" #: src/widgets/FTextRXTX.cxx:751 src/dialogs/confdialog.cxx:6624 msgid "Transmit" msgstr "Transmission" #: src/widgets/FTextRXTX.cxx:752 src/dialogs/confdialog.cxx:6499 #: src/dialogs/confdialog.cxx:7621 msgid "Receive" msgstr "Réception" #: src/widgets/FTextRXTX.cxx:753 msgid "Abort" msgstr "Annuler" #: src/widgets/FTextRXTX.cxx:754 msgid "Send image..." msgstr "Envoyer image..." #: src/widgets/FTextView.cxx:292 msgid "Insert text" msgstr "Insère texte" #: src/widgets/FTextView.cxx:351 msgid "Save text as" msgstr "Sauvegarde texte sous" #: src/widgets/FTextView.cxx:479 src/widgets/FTextView.cxx:643 #: src/widgets/flinput2.cxx:44 msgid "Copy" msgstr "Copier" #: src/widgets/FTextView.cxx:482 msgid "Save as..." msgstr "Enregistrer sous..." #: src/widgets/FTextView.cxx:483 src/widgets/FTextView.cxx:647 msgid "Word wrap" msgstr "" #: src/widgets/FTextView.cxx:642 src/widgets/flinput2.cxx:43 msgid "Cut" msgstr "Couper" #: src/widgets/FTextView.cxx:644 src/widgets/flinput2.cxx:45 msgid "Paste" msgstr "Coller" #: src/widgets/FTextView.cxx:646 msgid "Insert file..." msgstr "Insère fichier..." #: src/widgets/flinput2.cxx:42 msgid "Undo" msgstr "Annuler" #: src/widgets/flinput2.cxx:46 src/logbook/lgbook.cxx:974 msgid "Delete" msgstr "Supprimer" #: src/dialogs/confdialog.cxx:4928 msgid "Fldigi configuration" msgstr "" #: src/dialogs/confdialog.cxx:4938 src/dialogs/confdialog.cxx:10039 msgid "Operator information" msgstr "Information opérateur" #: src/dialogs/confdialog.cxx:4941 msgid "Station" msgstr "Station" #: src/dialogs/confdialog.cxx:4944 msgid "Callsign:" msgstr "Indicatif:" #: src/dialogs/confdialog.cxx:4945 msgid "Operators callsign" msgstr "" #: src/dialogs/confdialog.cxx:4958 msgid "Name:" msgstr "Nom:" #: src/dialogs/confdialog.cxx:4959 msgid "Operators name" msgstr "Noms opérateurs" #: src/dialogs/confdialog.cxx:4972 msgid "QTH:" msgstr "QTH:" #: src/dialogs/confdialog.cxx:4973 msgid "Operators QTH" msgstr "QTH opérateurs" #: src/dialogs/confdialog.cxx:4986 msgid "Locator:" msgstr "Locator:" #: src/dialogs/confdialog.cxx:4987 msgid "Maidenhead locator as in EM64qv" msgstr "" #: src/dialogs/confdialog.cxx:5002 msgid "Antenna:" msgstr "Antenne:" #: src/dialogs/confdialog.cxx:5003 msgid "Short description of antenna" msgstr "" #: src/dialogs/confdialog.cxx:5016 msgid "Test Signal - Do NOT use with transmitter" msgstr "" #: src/dialogs/confdialog.cxx:5020 msgid "Noise on" msgstr "" #: src/dialogs/confdialog.cxx:5026 msgid "dB" msgstr "" #: src/dialogs/confdialog.cxx:5049 msgid "UI" msgstr "" #: src/dialogs/confdialog.cxx:5053 #, fuzzy msgid "Browser" msgstr "Navigateur PSK" #: src/dialogs/confdialog.cxx:5056 msgid "Channels, first channel starts at waterfall lower limit" msgstr "" #: src/dialogs/confdialog.cxx:5057 msgid "Change # of psk viewer channels" msgstr "" #: src/dialogs/confdialog.cxx:5074 msgid "Inactivity timeout" msgstr "" #: src/dialogs/confdialog.cxx:5075 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" #: src/dialogs/confdialog.cxx:5091 msgid "Channel label" msgstr "" #: src/dialogs/confdialog.cxx:5092 msgid "Appearance of label on each channel" msgstr "" #: src/dialogs/confdialog.cxx:5103 #, fuzzy msgid "Audio frequency" msgstr "Ajuste fréquence curseur" #: src/dialogs/confdialog.cxx:5104 #, fuzzy msgid "Radio frequency" msgstr "Fréquence" #: src/dialogs/confdialog.cxx:5104 #, fuzzy msgid "Channel number" msgstr "Numéro progressif" #: src/dialogs/confdialog.cxx:5109 src/dialogs/confdialog.cxx:6274 msgid "Font..." msgstr "" #: src/dialogs/confdialog.cxx:5110 #, fuzzy msgid "select browser font" msgstr "Sélection port série" #: src/dialogs/confdialog.cxx:5113 msgid "Fixed Intervals" msgstr "" #: src/dialogs/confdialog.cxx:5114 msgid "Force channel spacing to even 100 Hz increments" msgstr "" #: src/dialogs/confdialog.cxx:5121 msgid "Continuous scrolling" msgstr "" #: src/dialogs/confdialog.cxx:5122 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" #: src/dialogs/confdialog.cxx:5127 msgid "Lowest freq on bottom of viewer" msgstr "" #: src/dialogs/confdialog.cxx:5128 msgid "Change positions of low to high channels" msgstr "" #: src/dialogs/confdialog.cxx:5133 msgid "Play back history when active channel selected" msgstr "" #: src/dialogs/confdialog.cxx:5134 msgid "Audio stream history decoded on selected signal" msgstr "" #: src/dialogs/confdialog.cxx:5139 #, fuzzy msgid "Detection Level" msgstr "Détecte le niveau de signal" #: src/dialogs/confdialog.cxx:5141 #, fuzzy msgid "Backgnd" msgstr "Arrière plan" #: src/dialogs/confdialog.cxx:5142 msgid "Background color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:5147 msgid "Button" msgstr "" #: src/dialogs/confdialog.cxx:5148 msgid "Slider hilite color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:5155 #, fuzzy msgid "Browser Line Colors" msgstr "Couleur" #: src/dialogs/confdialog.cxx:5157 msgid "HiLite 1" msgstr "" #: src/dialogs/confdialog.cxx:5158 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "" #: src/dialogs/confdialog.cxx:5163 msgid "HiLite 2" msgstr "" #: src/dialogs/confdialog.cxx:5164 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "" #: src/dialogs/confdialog.cxx:5169 #, fuzzy msgid "Even" msgstr "Événement" #: src/dialogs/confdialog.cxx:5170 #, fuzzy msgid "Even lines" msgstr "Historique événements" #: src/dialogs/confdialog.cxx:5175 #, fuzzy msgid "Odd" msgstr "Ajoute" #: src/dialogs/confdialog.cxx:5176 msgid "Odd lines" msgstr "" #: src/dialogs/confdialog.cxx:5182 #, fuzzy msgid "Select line" msgstr "Tout Sélectionner" #: src/dialogs/confdialog.cxx:5195 msgid "Exchanges" msgstr "" #: src/dialogs/confdialog.cxx:5198 msgid "Send:" msgstr "" #: src/dialogs/confdialog.cxx:5200 src/logbook/lgbook.cxx:542 #: src/logbook/lgbook.cxx:900 src/logbook/lgbook.cxx:1115 msgid "Exchange Out" msgstr "" #: src/dialogs/confdialog.cxx:5201 msgid "free form exchange" msgstr "" #: src/dialogs/confdialog.cxx:5215 msgid "RST always 599" msgstr "" #: src/dialogs/confdialog.cxx:5216 msgid "Force RST in/out to 599" msgstr "" #: src/dialogs/confdialog.cxx:5221 msgid "Send CW cut numbers" msgstr "" #: src/dialogs/confdialog.cxx:5222 msgid "0 = T; 9 = N" msgstr "" #: src/dialogs/confdialog.cxx:5232 msgid "Use leading zeros" msgstr "" #: src/dialogs/confdialog.cxx:5233 msgid "Insert leading zeros into Xmtd serial number" msgstr "" #: src/dialogs/confdialog.cxx:5238 msgid "Start" msgstr "" #: src/dialogs/confdialog.cxx:5239 msgid "Starting number" msgstr "" #: src/dialogs/confdialog.cxx:5254 msgid "Digits" msgstr "" #: src/dialogs/confdialog.cxx:5255 msgid "Number of digits in serial number" msgstr "" #: src/dialogs/confdialog.cxx:5271 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "" #: src/dialogs/confdialog.cxx:5272 msgid "Initialize the QSO logging fields" msgstr "" #: src/dialogs/confdialog.cxx:5277 msgid "Duplicate check, CALL plus" msgstr "" #: src/dialogs/confdialog.cxx:5280 msgid "On/Off" msgstr "" #: src/dialogs/confdialog.cxx:5281 msgid "Check for duplicates" msgstr "" #: src/dialogs/confdialog.cxx:5286 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:471 msgid "Band" msgstr "Bande" #: src/dialogs/confdialog.cxx:5287 msgid "Bands must match" msgstr "" #: src/dialogs/confdialog.cxx:5292 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:474 src/logbook/lgbook.cxx:682 #: src/logbook/lgbook.cxx:1028 src/logbook/lgbook.cxx:1083 msgid "Mode" msgstr "Mode" #: src/dialogs/confdialog.cxx:5293 msgid "Mode must match" msgstr "" #: src/dialogs/confdialog.cxx:5299 msgid "State must match" msgstr "" #: src/dialogs/confdialog.cxx:5305 msgid "free form 1 must match" msgstr "" #: src/dialogs/confdialog.cxx:5310 msgid "Time span over" msgstr "" #: src/dialogs/confdialog.cxx:5311 msgid "QSO must not occur within a time period of" msgstr "" #: src/dialogs/confdialog.cxx:5316 msgid "minutes" msgstr "minutes" #: src/dialogs/confdialog.cxx:5317 msgid "Enter time span in minutes" msgstr "" #: src/dialogs/confdialog.cxx:5333 msgid "Dup Color" msgstr "" #: src/dialogs/confdialog.cxx:5334 msgid "Left click to select dup color" msgstr "" #: src/dialogs/confdialog.cxx:5346 src/dialogs/confdialog.cxx:6497 #: src/dialogs/confdialog.cxx:7508 src/dialogs/confdialog.cxx:9403 msgid "General" msgstr "Général" #: src/dialogs/confdialog.cxx:5350 msgid "Show tooltips" msgstr "Montrer infobulles" #: src/dialogs/confdialog.cxx:5351 msgid "Enable / disable tooltips" msgstr "" #: src/dialogs/confdialog.cxx:5357 msgid "Show menu icons" msgstr "Montrer icônes menu" #: src/dialogs/confdialog.cxx:5358 msgid "Enable / disable icons on menus" msgstr "" #: src/dialogs/confdialog.cxx:5363 msgid "UI scheme" msgstr "" #: src/dialogs/confdialog.cxx:5364 msgid "Change application look and feel" msgstr "" #: src/dialogs/confdialog.cxx:5382 msgid "Visible modes" msgstr "Modes visibles" #: src/dialogs/confdialog.cxx:5383 msgid "Select modes for menu access" msgstr "" #: src/dialogs/confdialog.cxx:5386 msgid "UI language" msgstr "" #: src/dialogs/confdialog.cxx:5387 src/dialogs/confdialog.cxx:6403 msgid "Changes take effect on next program startup" msgstr "Changements prenant effet lors du prochain redémarrage" #: src/dialogs/confdialog.cxx:5406 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "" #: src/dialogs/confdialog.cxx:5416 msgid "Transmit all text in lower case" msgstr "" #: src/dialogs/confdialog.cxx:5423 msgid "Exit prompts" msgstr "" #: src/dialogs/confdialog.cxx:5426 msgid "Prompt to save Configuration" msgstr "" #: src/dialogs/confdialog.cxx:5431 #, fuzzy msgid "Prompt to save macro file" msgstr "Enregistrer fichier macros" #: src/dialogs/confdialog.cxx:5432 src/dialogs/confdialog.cxx:5689 msgid "Write current macro set on program exit" msgstr "" #: src/dialogs/confdialog.cxx:5437 msgid "Prompt to save log" msgstr "" #: src/dialogs/confdialog.cxx:5438 src/dialogs/confdialog.cxx:5491 msgid "Bug me about saving log entries" msgstr "" #: src/dialogs/confdialog.cxx:5443 msgid "" "Exit prompts active only when File/Exit menu item selected.\n" "Not active if window decoration close button pressed." msgstr "" #: src/dialogs/confdialog.cxx:5448 #, fuzzy msgid "Confirm exit" msgstr "Confirmer" #: src/dialogs/confdialog.cxx:5455 #, fuzzy msgid "Check for updates" msgstr "Rechercher des mises à jour..." #: src/dialogs/confdialog.cxx:5458 msgid "Check for updates when starting program" msgstr "" #: src/dialogs/confdialog.cxx:5467 msgid "Logging" msgstr "" #: src/dialogs/confdialog.cxx:5469 #, fuzzy msgid "Client/Server Logbook" msgstr "Sauvegarde journal" #: src/dialogs/confdialog.cxx:5472 msgid "Address:" msgstr "" #: src/dialogs/confdialog.cxx:5473 msgid "Enter URL address of server" msgstr "" #: src/dialogs/confdialog.cxx:5477 src/dialogs/confdialog.cxx:9460 msgid "Port:" msgstr "Port:" #: src/dialogs/confdialog.cxx:5478 msgid "Enter Port # assigned to server" msgstr "" #: src/dialogs/confdialog.cxx:5482 #, fuzzy msgid "Reconnect" msgstr "Connection" #: src/dialogs/confdialog.cxx:5487 msgid "QSO logging" msgstr "" #: src/dialogs/confdialog.cxx:5490 msgid "Prompt to save log on exit" msgstr "" #: src/dialogs/confdialog.cxx:5496 msgid "Clear on save" msgstr "" #: src/dialogs/confdialog.cxx:5497 msgid "Clear log entries after saving or using macro " msgstr "" #: src/dialogs/confdialog.cxx:5502 msgid "Convert callsign to upper case" msgstr "" #: src/dialogs/confdialog.cxx:5503 msgid "Force callsign field to UPPERCASE" msgstr "" #: src/dialogs/confdialog.cxx:5508 msgid "Auto-fill Country and Azimuth" msgstr "" #: src/dialogs/confdialog.cxx:5509 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "" #: src/dialogs/confdialog.cxx:5514 msgid "Sort by Date/Time OFF" msgstr "" #: src/dialogs/confdialog.cxx:5515 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" #: src/dialogs/confdialog.cxx:5520 msgid "Date time ON == OFF" msgstr "" #: src/dialogs/confdialog.cxx:5521 msgid "Force date/time ON == date/time OFF" msgstr "" #: src/dialogs/confdialog.cxx:5526 msgid "Default RST in to 599" msgstr "" #: src/dialogs/confdialog.cxx:5527 msgid "Clear log controls sets RST in to 599" msgstr "" #: src/dialogs/confdialog.cxx:5532 msgid "Default RST out to 599" msgstr "" #: src/dialogs/confdialog.cxx:5533 msgid "Clear log controls sets RST out to 599" msgstr "" #: src/dialogs/confdialog.cxx:5538 msgid "cty.dat pathname" msgstr "" #: src/dialogs/confdialog.cxx:5539 msgid "Enter full path-filename for cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:5552 #, fuzzy msgid "Browse" msgstr "Navigateur PSK" #: src/dialogs/confdialog.cxx:5553 msgid "Locate cty.dat file" msgstr "" #: src/dialogs/confdialog.cxx:5556 src/dialogs/confdialog.cxx:5914 #: src/dialogs/confdialog.cxx:5934 src/dialogs/confdialog.cxx:6648 msgid "Default" msgstr "Défaut" #: src/dialogs/confdialog.cxx:5557 #, fuzzy msgid "Restore cty.dat default folder" msgstr "Restaure défauts" #: src/dialogs/confdialog.cxx:5560 msgid "Reload" msgstr "" #: src/dialogs/confdialog.cxx:5561 msgid "Reload cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:5564 msgid "Transmit Power" msgstr "" #: src/dialogs/confdialog.cxx:5565 msgid "Tx power used for logbook entries" msgstr "" #: src/dialogs/confdialog.cxx:5581 #, fuzzy msgid "Rx Text Capture" msgstr "Capture RX" #: src/dialogs/confdialog.cxx:5584 msgid "Double-click to capture" msgstr "" #: src/dialogs/confdialog.cxx:5585 msgid "Enable if you cannot use the middle mouse button" msgstr "" #: src/dialogs/confdialog.cxx:5590 msgid "callsign tooltips in received text" msgstr "" #: src/dialogs/confdialog.cxx:5591 msgid "Popup info after a 2 second hover on a callsign" msgstr "" #: src/dialogs/confdialog.cxx:5596 msgid "Word delimiters" msgstr "" #: src/dialogs/confdialog.cxx:5597 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" #: src/dialogs/confdialog.cxx:5621 msgid "Mouse wheel active on macro buttons" msgstr "" #: src/dialogs/confdialog.cxx:5622 msgid "enable mouse wheel control of macro bar" msgstr "" #: src/dialogs/confdialog.cxx:5629 msgid "Number and position of macro bars" msgstr "" #: src/dialogs/confdialog.cxx:5632 msgid "One bar (above waterfall)" msgstr "" #: src/dialogs/confdialog.cxx:5637 msgid "One bar (below waterfall)" msgstr "" #: src/dialogs/confdialog.cxx:5642 msgid "Two bars (scheme 1)" msgstr "" #: src/dialogs/confdialog.cxx:5647 msgid "Two bars (scheme 2)" msgstr "" #: src/dialogs/confdialog.cxx:5652 msgid "Two bars (scheme 3)" msgstr "" #: src/dialogs/confdialog.cxx:5657 msgid "Two bars (scheme 4)" msgstr "" #: src/dialogs/confdialog.cxx:5662 msgid "Two bars (scheme 5)" msgstr "" #: src/dialogs/confdialog.cxx:5667 msgid "Two bars (scheme 6)" msgstr "" #: src/dialogs/confdialog.cxx:5676 msgid "Load last used macro file on startup" msgstr "" #: src/dialogs/confdialog.cxx:5677 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" #: src/dialogs/confdialog.cxx:5682 msgid "Display macro filename on startup" msgstr "" #: src/dialogs/confdialog.cxx:5683 msgid "The filename is written to the RX text area" msgstr "" #: src/dialogs/confdialog.cxx:5688 msgid "Prompt to save macro file when closing" msgstr "" #: src/dialogs/confdialog.cxx:5698 #, fuzzy msgid "WF Ctrls" msgstr "Contrôles" #: src/dialogs/confdialog.cxx:5702 msgid "Enable check box to show each respective operator control" msgstr "" #: src/dialogs/confdialog.cxx:5712 msgid "WF Magnification" msgstr "" #: src/dialogs/confdialog.cxx:5718 msgid "WF carrier" msgstr "" #: src/dialogs/confdialog.cxx:5724 msgid "WF Shift Controls" msgstr "" #: src/dialogs/confdialog.cxx:5730 msgid "WF ref level" msgstr "" #: src/dialogs/confdialog.cxx:5736 msgid "WF drop rate" msgstr "" #: src/dialogs/confdialog.cxx:5742 msgid "WF amp span" msgstr "" #: src/dialogs/confdialog.cxx:5748 msgid "WF Store" msgstr "" #: src/dialogs/confdialog.cxx:5754 msgid "WF mode" msgstr "" #: src/dialogs/confdialog.cxx:5760 msgid "QSY" msgstr "" #: src/dialogs/confdialog.cxx:5766 msgid "XMT lock" msgstr "" #: src/dialogs/confdialog.cxx:5772 msgid "Enable all" msgstr "" #: src/dialogs/confdialog.cxx:5775 msgid "Disable all" msgstr "" #: src/dialogs/confdialog.cxx:5782 #, fuzzy msgid "Colors/Fonts" msgstr "Couleurs && Polices" #: src/dialogs/confdialog.cxx:5785 msgid "Rx/Tx" msgstr "" #: src/dialogs/confdialog.cxx:5786 msgid "Rx/Tx Character set" msgstr "" #: src/dialogs/confdialog.cxx:5787 msgid "Select Rx/Tx Character Set" msgstr "" #: src/dialogs/confdialog.cxx:5807 msgid "Rx bkgnd" msgstr "" #: src/dialogs/confdialog.cxx:5810 msgid "Tx bkgnd" msgstr "" #: src/dialogs/confdialog.cxx:5819 msgid "Rx font" msgstr "" #: src/dialogs/confdialog.cxx:5822 msgid "Tx font" msgstr "" #: src/dialogs/confdialog.cxx:5825 msgid "Text Highlighting" msgstr "" #: src/dialogs/confdialog.cxx:5828 msgid "XMIT" msgstr "" #: src/dialogs/confdialog.cxx:5829 msgid "Sent chars in Rx/Tx pane" msgstr "" #: src/dialogs/confdialog.cxx:5834 msgid "CTRL" msgstr "" #: src/dialogs/confdialog.cxx:5835 msgid "Control chars in Rx/Tx pane" msgstr "" #: src/dialogs/confdialog.cxx:5840 msgid "SKIP" msgstr "" #: src/dialogs/confdialog.cxx:5841 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" #: src/dialogs/confdialog.cxx:5846 msgid "ALTR" msgstr "" #: src/dialogs/confdialog.cxx:5847 msgid "Alternate character color in Rx panelr" msgstr "" #: src/dialogs/confdialog.cxx:5852 msgid "SEL" msgstr "" #: src/dialogs/confdialog.cxx:5853 msgid "Selection background color in Rx Tx panels" msgstr "" #: src/dialogs/confdialog.cxx:5858 src/dialogs/confdialog.cxx:5981 msgid "System" msgstr "Système" #: src/dialogs/confdialog.cxx:5861 src/dialogs/confdialog.cxx:5971 #: src/logbook/lgbook.cxx:563 msgid "Defaults" msgstr "Défauts" #: src/dialogs/confdialog.cxx:5868 #, fuzzy msgid "Frq Disp" msgstr "Affichage Freq" #: src/dialogs/confdialog.cxx:5872 msgid "14070.150" msgstr "" #: src/dialogs/confdialog.cxx:5881 src/dialogs/confdialog.cxx:5911 #: src/dialogs/confdialog.cxx:5931 #, fuzzy msgid "Font" msgstr "Police:" #: src/dialogs/confdialog.cxx:5884 src/dialogs/confdialog.cxx:5908 #: src/dialogs/confdialog.cxx:5928 #, fuzzy msgid "Bg Color" msgstr "Couleur" #: src/dialogs/confdialog.cxx:5887 #, fuzzy msgid "Digit Color" msgstr "Couleur" #: src/dialogs/confdialog.cxx:5890 #, fuzzy msgid "Sys Colors" msgstr "Couleur" #: src/dialogs/confdialog.cxx:5897 msgid "Log" msgstr "" #: src/dialogs/confdialog.cxx:5899 #, fuzzy msgid "Logging Panel Controls" msgstr "Contrôle minimal" #: src/dialogs/confdialog.cxx:5919 #, fuzzy msgid "Logbook Dialog" msgstr "&Journal" #: src/dialogs/confdialog.cxx:5941 msgid "F_keys" msgstr "" #: src/dialogs/confdialog.cxx:5943 msgid "Use colored buttons" msgstr "" #: src/dialogs/confdialog.cxx:5948 msgid "Group 1" msgstr "Groupe 1" #: src/dialogs/confdialog.cxx:5949 msgid "Background color for Function key group 1" msgstr "" #: src/dialogs/confdialog.cxx:5954 msgid "Group 2" msgstr "Groupe 2" #: src/dialogs/confdialog.cxx:5955 msgid "Background color for Function key group 2" msgstr "" #: src/dialogs/confdialog.cxx:5960 msgid "Group 3" msgstr "Groupe 3" #: src/dialogs/confdialog.cxx:5961 msgid "Background color for Function key group 3" msgstr "" #: src/dialogs/confdialog.cxx:5966 msgid "Label text" msgstr "" #: src/dialogs/confdialog.cxx:5976 msgid "Tabs" msgstr "" #: src/dialogs/confdialog.cxx:5978 msgid "Tab Color" msgstr "" #: src/dialogs/confdialog.cxx:5986 msgid "Buttons" msgstr "" #: src/dialogs/confdialog.cxx:5988 msgid "Spot" msgstr "" #: src/dialogs/confdialog.cxx:5991 msgid "RxID" msgstr "" #: src/dialogs/confdialog.cxx:5994 msgid "TxID" msgstr "" #: src/dialogs/confdialog.cxx:5997 msgid "Tune" msgstr "" #: src/dialogs/confdialog.cxx:6000 msgid "Lk" msgstr "" #: src/dialogs/confdialog.cxx:6003 #, fuzzy msgid "Rev" msgstr "Enlever" #: src/dialogs/confdialog.cxx:6006 msgid "T/R" msgstr "" #: src/dialogs/confdialog.cxx:6009 msgid "AFC" msgstr "" #: src/dialogs/confdialog.cxx:6012 msgid "SQL-1" msgstr "" #: src/dialogs/confdialog.cxx:6015 msgid "SQL-2" msgstr "" #: src/dialogs/confdialog.cxx:6061 msgid "Lighted button enabled colors" msgstr "" #: src/dialogs/confdialog.cxx:6066 msgid "SigLvl" msgstr "" #: src/dialogs/confdialog.cxx:6068 src/dialogs/confdialog.cxx:9023 msgid "Low" msgstr "" #: src/dialogs/confdialog.cxx:6076 src/dialogs/confdialog.cxx:9023 msgid "High" msgstr "" #: src/dialogs/confdialog.cxx:6084 msgid "Normal" msgstr "Normal" #: src/dialogs/confdialog.cxx:6092 msgid "Over" msgstr "" #: src/dialogs/confdialog.cxx:6100 #, fuzzy msgid "Signal Level Colors" msgstr "Détecte le niveau de signal" #: src/dialogs/confdialog.cxx:6117 msgid "Display" msgstr "Affichage" #: src/dialogs/confdialog.cxx:6118 msgid "Colors and cursors" msgstr "Couleurs et curseurs" #: src/dialogs/confdialog.cxx:6121 msgid "aa" msgstr "" #: src/dialogs/confdialog.cxx:6136 src/dialogs/confdialog.cxx:6140 #: src/dialogs/confdialog.cxx:6144 src/dialogs/confdialog.cxx:6148 #: src/dialogs/confdialog.cxx:6152 src/dialogs/confdialog.cxx:6156 #: src/dialogs/confdialog.cxx:6160 src/dialogs/confdialog.cxx:6164 #: src/dialogs/confdialog.cxx:6168 src/dialogs/confdialog.cxx:6189 #: src/dialogs/confdialog.cxx:6213 src/dialogs/confdialog.cxx:6237 #: src/dialogs/confdialog.cxx:6255 msgid "Change color" msgstr "Change couleur" #: src/dialogs/confdialog.cxx:6171 msgid "Load..." msgstr "Charge..." #: src/dialogs/confdialog.cxx:6172 msgid "Load a new palette" msgstr "Charge une nouvelle palette" #: src/dialogs/confdialog.cxx:6175 msgid "Save..." msgstr "Sauvegarder..." #: src/dialogs/confdialog.cxx:6176 msgid "Save this palette" msgstr "" #: src/dialogs/confdialog.cxx:6179 src/dialogs/confdialog.cxx:7315 #: src/dialogs/confdialog.cxx:7411 msgid "Bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:6182 src/dialogs/confdialog.cxx:6206 #: src/dialogs/confdialog.cxx:6230 #, fuzzy msgid "ON" msgstr "CONT" #: src/dialogs/confdialog.cxx:6183 msgid "Show cursor with bandwidth lines" msgstr "" #: src/dialogs/confdialog.cxx:6188 src/dialogs/confdialog.cxx:6212 #: src/dialogs/confdialog.cxx:6236 src/dialogs/confdialog.cxx:6254 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "Couleur" #: src/dialogs/confdialog.cxx:6195 src/dialogs/confdialog.cxx:6219 #: src/dialogs/confdialog.cxx:6243 msgid "Wide" msgstr "" #: src/dialogs/confdialog.cxx:6196 src/dialogs/confdialog.cxx:6220 #: src/dialogs/confdialog.cxx:6231 src/dialogs/confdialog.cxx:6244 msgid "Show bandwidth tracks on waterfall" msgstr "" #: src/dialogs/confdialog.cxx:6203 msgid "Center line" msgstr "" #: src/dialogs/confdialog.cxx:6207 msgid "Show cursor with center line" msgstr "" #: src/dialogs/confdialog.cxx:6227 #, fuzzy msgid "Signal tracks" msgstr "Niveau signal" #: src/dialogs/confdialog.cxx:6251 msgid "Notch" msgstr "" #: src/dialogs/confdialog.cxx:6265 msgid "Frequency scale" msgstr "" #: src/dialogs/confdialog.cxx:6268 msgid "Always show audio frequencies" msgstr "" #: src/dialogs/confdialog.cxx:6269 msgid "Audio or RF frequencies on waterfall scale" msgstr "" #: src/dialogs/confdialog.cxx:6275 msgid "Select waterfall scale font" msgstr "" #: src/dialogs/confdialog.cxx:6280 msgid "Transmit signal" msgstr "" #: src/dialogs/confdialog.cxx:6283 msgid "Monitor transmitted signal" msgstr "" #: src/dialogs/confdialog.cxx:6284 msgid "Show transmit signal on waterfall" msgstr "" #: src/dialogs/confdialog.cxx:6289 msgid "Signal level" msgstr "Niveau signal" #: src/dialogs/confdialog.cxx:6290 msgid "Set level for good viewing" msgstr "" #: src/dialogs/confdialog.cxx:6312 msgid "FFT Processing" msgstr "" #: src/dialogs/confdialog.cxx:6316 src/dialogs/confdialog.cxx:6668 msgid "Lower limit" msgstr "" #: src/dialogs/confdialog.cxx:6317 msgid "Low frequency limit in Hz" msgstr "" #: src/dialogs/confdialog.cxx:6336 msgid "FFT averaging" msgstr "" #: src/dialogs/confdialog.cxx:6337 msgid "Use averaging to decrease waterfall noise" msgstr "" #: src/dialogs/confdialog.cxx:6342 msgid "FFT prefilter window function" msgstr "" #: src/dialogs/confdialog.cxx:6343 msgid "Select the type of FFT prefilter" msgstr "" #: src/dialogs/confdialog.cxx:6354 msgid "Rectangular" msgstr "" #: src/dialogs/confdialog.cxx:6356 msgid "Triangular" msgstr "" #: src/dialogs/confdialog.cxx:6361 src/dialogs/confdialog.cxx:6680 msgid "Upper limit" msgstr "" #: src/dialogs/confdialog.cxx:6362 msgid "High frequency limit in Hz" msgstr "" #: src/dialogs/confdialog.cxx:6381 msgid "Latency" msgstr "" #: src/dialogs/confdialog.cxx:6382 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:6404 msgid "Show me more or less waterfall" msgstr "" #: src/dialogs/confdialog.cxx:6407 msgid "Waterfall height in pixels" msgstr "" #: src/dialogs/confdialog.cxx:6408 msgid "CPU usage increases with waterfall height" msgstr "" #: src/dialogs/confdialog.cxx:6431 msgid "Mouse" msgstr "Souris" #: src/dialogs/confdialog.cxx:6435 msgid "Left or right click always replays audio history" msgstr "" #: src/dialogs/confdialog.cxx:6436 msgid "Replay trackline audio" msgstr "" #: src/dialogs/confdialog.cxx:6441 msgid "Dragging on the waterfall scale changes frequency" msgstr "" #: src/dialogs/confdialog.cxx:6442 msgid "Enable drag cursor on waterfall scale" msgstr "" #: src/dialogs/confdialog.cxx:6447 msgid "Insert text on single left click" msgstr "" #: src/dialogs/confdialog.cxx:6448 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" #: src/dialogs/confdialog.cxx:6454 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:6468 msgid "Wheel action" msgstr "" #: src/dialogs/confdialog.cxx:6469 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" #: src/dialogs/confdialog.cxx:6494 src/dialogs/confdialog.cxx:9177 #: src/dialogs/confdialog.cxx:9492 msgid "CW" msgstr "" #: src/dialogs/confdialog.cxx:6502 msgid "Filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:6503 msgid "CW dsp filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:6523 msgid "Rx WPM" msgstr "" #: src/dialogs/confdialog.cxx:6529 msgid "Tracked CW speed in WPM" msgstr "" #: src/dialogs/confdialog.cxx:6534 msgid "SOM decoding" msgstr "" #: src/dialogs/confdialog.cxx:6535 msgid "Self Organizing Mapping" msgstr "" #: src/dialogs/confdialog.cxx:6541 msgid "Lower" msgstr "" #: src/dialogs/confdialog.cxx:6542 msgid "Detector low threshold" msgstr "" #: src/dialogs/confdialog.cxx:6561 msgid "Upper" msgstr "" #: src/dialogs/confdialog.cxx:6562 msgid "Detector high threshold" msgstr "" #: src/dialogs/confdialog.cxx:6581 #, fuzzy msgid "Matched Filter" msgstr "Filtre" #: src/dialogs/confdialog.cxx:6582 msgid "Matched Filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:6588 #, fuzzy msgid "FFT filter" msgstr "Filtre" #: src/dialogs/confdialog.cxx:6589 msgid "FFT / FIR filter" msgstr "" #: src/dialogs/confdialog.cxx:6595 msgid "Tracking" msgstr "" #: src/dialogs/confdialog.cxx:6596 msgid "Automatic Rx speed tracking" msgstr "" #: src/dialogs/confdialog.cxx:6602 msgid "Range, WPM" msgstr "" #: src/dialogs/confdialog.cxx:6603 msgid "Range +/- wpm" msgstr "" #: src/dialogs/confdialog.cxx:6627 msgid "TX WPM" msgstr "" #: src/dialogs/confdialog.cxx:6628 src/dialogs/confdialog.cxx:6693 msgid "My transmit CW WPM" msgstr "" #: src/dialogs/confdialog.cxx:6649 msgid "The default CW speed" msgstr "" #: src/dialogs/confdialog.cxx:6669 msgid "No slower than this" msgstr "" #: src/dialogs/confdialog.cxx:6681 msgid "No faster than this" msgstr "" #: src/dialogs/confdialog.cxx:6692 msgid "F-WPM" msgstr "" #: src/dialogs/confdialog.cxx:6713 msgid "Use Farnsworth timing" msgstr "" #: src/dialogs/confdialog.cxx:6722 msgid "Timing and QSK" msgstr "" #: src/dialogs/confdialog.cxx:6725 msgid "Timing" msgstr "" #: src/dialogs/confdialog.cxx:6728 msgid "Weight (%)" msgstr "" #: src/dialogs/confdialog.cxx:6729 msgid "Dot to dot-space ratio" msgstr "" #: src/dialogs/confdialog.cxx:6748 src/dialogs/confdialog.cxx:6749 msgid "Dash to dot ratio" msgstr "" #: src/dialogs/confdialog.cxx:6767 msgid "Edge timing" msgstr "" #: src/dialogs/confdialog.cxx:6768 msgid "Leading and Trailing edge risetimes (msec)" msgstr "" #: src/dialogs/confdialog.cxx:6786 msgid "Edge shape" msgstr "" #: src/dialogs/confdialog.cxx:6787 msgid "Raised cosine = Hanning" msgstr "" #: src/dialogs/confdialog.cxx:6803 msgid "Edge decreases pulse width" msgstr "" #: src/dialogs/confdialog.cxx:6804 msgid "Weight decreases with increasing edge timing" msgstr "" #: src/dialogs/confdialog.cxx:6811 msgid "QSK" msgstr "" #: src/dialogs/confdialog.cxx:6814 msgid "QSK on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:6815 msgid "Generate square wave signal on right channel" msgstr "" #: src/dialogs/confdialog.cxx:6820 msgid "Pre-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:6821 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:6839 msgid "Post-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:6840 msgid "Msec post-keydown (+ is earlier in time)" msgstr "" #: src/dialogs/confdialog.cxx:6858 msgid "Send continuously" msgstr "" #: src/dialogs/confdialog.cxx:6859 msgid "Send a continuous stream of test characters" msgstr "" #: src/dialogs/confdialog.cxx:6864 msgid "Test char" msgstr "" #: src/dialogs/confdialog.cxx:6865 msgid "Test character for QSK adjustment" msgstr "" #: src/dialogs/confdialog.cxx:6885 msgid "Prosigns" msgstr "" #: src/dialogs/confdialog.cxx:6890 msgid "Use '(' paren not KN" msgstr "" #: src/dialogs/confdialog.cxx:6897 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6914 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6931 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6948 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6964 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6981 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6998 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7015 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7032 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7055 msgid "Dom" msgstr "" #: src/dialogs/confdialog.cxx:7059 src/dialogs/confdialog.cxx:7902 msgid "Secondary Text" msgstr "" #: src/dialogs/confdialog.cxx:7060 src/dialogs/confdialog.cxx:7903 msgid "Text to send during keyboard idle times" msgstr "" #: src/dialogs/confdialog.cxx:7074 src/dialogs/confdialog.cxx:7917 msgid "Filtering" msgstr "" #: src/dialogs/confdialog.cxx:7075 msgid "Use DSP filter before decoder" msgstr "" #: src/dialogs/confdialog.cxx:7081 src/dialogs/confdialog.cxx:7924 msgid "Filter bandwidth factor" msgstr "" #: src/dialogs/confdialog.cxx:7082 src/dialogs/confdialog.cxx:7925 msgid "Filter bandwidth relative to signal width" msgstr "" #: src/dialogs/confdialog.cxx:7100 msgid "FEC" msgstr "" #: src/dialogs/confdialog.cxx:7101 msgid "Enable MultiPSK-compatible FEC" msgstr "" #: src/dialogs/confdialog.cxx:7106 src/dialogs/confdialog.cxx:7943 msgid "CWI threshold" msgstr "" #: src/dialogs/confdialog.cxx:7107 src/dialogs/confdialog.cxx:7944 msgid "CWI detection and suppression" msgstr "" #: src/dialogs/confdialog.cxx:7123 src/dialogs/confdialog.cxx:7979 msgid "Paths (hidden)" msgstr "" #: src/dialogs/confdialog.cxx:7147 msgid "Feld" msgstr "" #: src/dialogs/confdialog.cxx:7151 msgid "Transmit font" msgstr "" #: src/dialogs/confdialog.cxx:7152 msgid "Select TX raster font" msgstr "" #: src/dialogs/confdialog.cxx:7168 msgid "Reverse video" msgstr "Inverse vidéo" #: src/dialogs/confdialog.cxx:7169 msgid "Display RX in reverse video" msgstr "" #: src/dialogs/confdialog.cxx:7174 msgid "Transmit width" msgstr "" #: src/dialogs/confdialog.cxx:7175 msgid "# of multiple scans / character line" msgstr "" #: src/dialogs/confdialog.cxx:7190 msgid "Halve receive width" msgstr "" #: src/dialogs/confdialog.cxx:7191 msgid "Compress Rx in time" msgstr "" #: src/dialogs/confdialog.cxx:7196 msgid "Pulse shape" msgstr "" #: src/dialogs/confdialog.cxx:7197 msgid "Raised cosine pulse shape factor" msgstr "" #: src/dialogs/confdialog.cxx:7208 msgid "Slow (4 msec)" msgstr "" #: src/dialogs/confdialog.cxx:7209 msgid "Fast (2 msec)" msgstr "" #: src/dialogs/confdialog.cxx:7214 msgid "Receive filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:7215 msgid "Adjust the DSP bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:7235 msgid "Transmit periods (.) when idle" msgstr "" #: src/dialogs/confdialog.cxx:7236 msgid "Transmits a diddle dot when no keyboard activity" msgstr "" #: src/dialogs/confdialog.cxx:7242 msgid "2x Xmt Width (hidden)" msgstr "" #: src/dialogs/confdialog.cxx:7252 msgid "MT-63" msgstr "" #: src/dialogs/confdialog.cxx:7257 src/dialogs/confdialog.cxx:7398 msgid "8-bit extended characters (UTF-8)" msgstr "" #: src/dialogs/confdialog.cxx:7258 msgid "Enable this for UTF-8 characters" msgstr "" #: src/dialogs/confdialog.cxx:7264 msgid "Long receive integration" msgstr "" #: src/dialogs/confdialog.cxx:7265 msgid "Enable for very weak signals" msgstr "" #: src/dialogs/confdialog.cxx:7275 msgid "Transmit lower start tone" msgstr "" #: src/dialogs/confdialog.cxx:7280 msgid "Transmit upper start tone" msgstr "" #: src/dialogs/confdialog.cxx:7286 msgid "Tone Duration (secs)" msgstr "" #: src/dialogs/confdialog.cxx:7302 msgid "Allow manual tuning" msgstr "" #: src/dialogs/confdialog.cxx:7311 msgid "Olivia" msgstr "" #: src/dialogs/confdialog.cxx:7316 src/dialogs/confdialog.cxx:7412 msgid "Select bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:7332 src/dialogs/confdialog.cxx:7428 msgid "Tones" msgstr "Tons" #: src/dialogs/confdialog.cxx:7333 src/dialogs/confdialog.cxx:7429 msgid "Select number of tones" msgstr "" #: src/dialogs/confdialog.cxx:7349 src/dialogs/confdialog.cxx:7445 msgid "Receive synchronizer" msgstr "" #: src/dialogs/confdialog.cxx:7352 src/dialogs/confdialog.cxx:7448 msgid "Tune margin (tone frequency spacing)" msgstr "" #: src/dialogs/confdialog.cxx:7353 src/dialogs/confdialog.cxx:7372 #: src/dialogs/confdialog.cxx:7449 src/dialogs/confdialog.cxx:7468 msgid "Change ONLY to experiment" msgstr "" #: src/dialogs/confdialog.cxx:7371 src/dialogs/confdialog.cxx:7467 msgid "Integration period (FEC blocks)" msgstr "Période d'intégration (FEC blocs)" #: src/dialogs/confdialog.cxx:7390 src/dialogs/confdialog.cxx:7486 msgid "Reset FEC blocks when changing BW or Tones" msgstr "" #: src/dialogs/confdialog.cxx:7391 src/dialogs/confdialog.cxx:7399 #: src/dialogs/confdialog.cxx:7487 msgid "Enable this for UTF-8 character transmission" msgstr "" #: src/dialogs/confdialog.cxx:7407 #, fuzzy msgid "Cont'" msgstr "Contest" #: src/dialogs/confdialog.cxx:7494 msgid "8-bit extended characters" msgstr "" #: src/dialogs/confdialog.cxx:7495 msgid "Enable this for Latin-1 accented characters" msgstr "" #: src/dialogs/confdialog.cxx:7504 msgid "PSK" msgstr "PSK" #: src/dialogs/confdialog.cxx:7510 msgid "AFC behavior" msgstr "Comportement AFC" #: src/dialogs/confdialog.cxx:7513 msgid "Acquisition search range (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:7514 msgid "Capture signals within this frequency range" msgstr "" #: src/dialogs/confdialog.cxx:7533 src/dialogs/confdialog.cxx:9354 msgid "Acquisition S/N (dB)" msgstr "" #: src/dialogs/confdialog.cxx:7534 src/dialogs/confdialog.cxx:9355 msgid "Capture signals over this threshold" msgstr "" #: src/dialogs/confdialog.cxx:7555 msgid "S/N and IMD behavior" msgstr "" #: src/dialogs/confdialog.cxx:7558 msgid "after" msgstr "après" #: src/dialogs/confdialog.cxx:7559 msgid "Behavior of s/n imd" msgstr "" #: src/dialogs/confdialog.cxx:7570 msgid "Dim" msgstr "" #: src/dialogs/confdialog.cxx:7575 msgid "seconds" msgstr "secondes" #: src/dialogs/confdialog.cxx:7576 msgid "Will occur after this time in seconds" msgstr "" #: src/dialogs/confdialog.cxx:7596 msgid "Multi-Channel Signal Processing" msgstr "" #: src/dialogs/confdialog.cxx:7599 msgid "Multi-channel detector" msgstr "" #: src/dialogs/confdialog.cxx:7604 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "" #: src/dialogs/confdialog.cxx:7615 src/dialogs/confdialog.cxx:9511 msgid "RTTY" msgstr "" #: src/dialogs/confdialog.cxx:7619 msgid "Rx" msgstr "Rx" #: src/dialogs/confdialog.cxx:7624 msgid "AFC speed" msgstr "" #: src/dialogs/confdialog.cxx:7625 msgid "AFC tracking speed" msgstr "" #: src/dialogs/confdialog.cxx:7641 msgid "RX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:7642 msgid "Revert to unshifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:7647 msgid "Filter Shape Factor" msgstr "" #: src/dialogs/confdialog.cxx:7648 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" #: src/dialogs/confdialog.cxx:7660 msgid "Decode (CWI suppression)" msgstr "" #: src/dialogs/confdialog.cxx:7663 msgid "Mark-Space" msgstr "" #: src/dialogs/confdialog.cxx:7668 msgid "Mark only" msgstr "" #: src/dialogs/confdialog.cxx:7673 msgid "Space only" msgstr "" #: src/dialogs/confdialog.cxx:7680 msgid "RTTY Scope Display" msgstr "" #: src/dialogs/confdialog.cxx:7683 msgid "Use cross hair scope" msgstr "" #: src/dialogs/confdialog.cxx:7684 msgid "Default to cross hair digiscope" msgstr "" #: src/dialogs/confdialog.cxx:7689 msgid "XY - classic scope" msgstr "" #: src/dialogs/confdialog.cxx:7690 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" #: src/dialogs/confdialog.cxx:7697 #, fuzzy msgid "Log RTTY frequency" msgstr "Ajuste fréquence curseur" #: src/dialogs/confdialog.cxx:7700 msgid "Use MARK freq'" msgstr "" #: src/dialogs/confdialog.cxx:7701 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" #: src/dialogs/confdialog.cxx:7708 #, fuzzy msgid "track color" msgstr "Couleur police" #: src/dialogs/confdialog.cxx:7709 msgid "Color of Mark Track" msgstr "" #: src/dialogs/confdialog.cxx:7719 msgid "Tx" msgstr "Tx" #: src/dialogs/confdialog.cxx:7722 msgid "Carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:7723 msgid "Select carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:7738 msgid "Custom shift" msgstr "" #: src/dialogs/confdialog.cxx:7739 msgid "Input carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:7757 msgid "Baud rate" msgstr "" #: src/dialogs/confdialog.cxx:7758 msgid "Select carrier baudrate" msgstr "" #: src/dialogs/confdialog.cxx:7773 msgid "Bits per character" msgstr "" #: src/dialogs/confdialog.cxx:7774 msgid "Select # bits / char" msgstr "" #: src/dialogs/confdialog.cxx:7789 msgid "Parity" msgstr "Parité" #: src/dialogs/confdialog.cxx:7790 msgid "Select parity" msgstr "" #: src/dialogs/confdialog.cxx:7805 msgid "Stop bits" msgstr "Stop bits" #: src/dialogs/confdialog.cxx:7806 msgid "Select # stop bits" msgstr "" #: src/dialogs/confdialog.cxx:7821 msgid "AutoCRLF" msgstr "" #: src/dialogs/confdialog.cxx:7822 msgid "Add CRLF after page width characters" msgstr "" #: src/dialogs/confdialog.cxx:7827 msgid "chars" msgstr "" #: src/dialogs/confdialog.cxx:7828 msgid "Auto CRLF line length" msgstr "" #: src/dialogs/confdialog.cxx:7846 msgid "CR-CR-LF" msgstr "" #: src/dialogs/confdialog.cxx:7847 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "" #: src/dialogs/confdialog.cxx:7853 msgid "TX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:7854 msgid "Revert to Unsifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:7859 #, fuzzy msgid "Pseudo-FSK - right channel" msgstr "Canaux" #: src/dialogs/confdialog.cxx:7860 #, fuzzy msgid "Create keyed square wave on right audio channel" msgstr "Tonalité PTT sur le canal audio droit " #: src/dialogs/confdialog.cxx:7867 #, fuzzy msgid "Synop" msgstr "Scope" #: src/dialogs/confdialog.cxx:7870 msgid "SYNOP to ADIF" msgstr "" #: src/dialogs/confdialog.cxx:7871 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" #: src/dialogs/confdialog.cxx:7877 msgid "SYNOP to KML" msgstr "" #: src/dialogs/confdialog.cxx:7878 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" #: src/dialogs/confdialog.cxx:7885 msgid "Interleave SYNOP and text" msgstr "" #: src/dialogs/confdialog.cxx:7886 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "" #: src/dialogs/confdialog.cxx:7898 msgid "Thor" msgstr "Thor" #: src/dialogs/confdialog.cxx:7918 msgid "Enable DSP prior to decoder" msgstr "" #: src/dialogs/confdialog.cxx:7960 msgid "Preamble Detection" msgstr "" #: src/dialogs/confdialog.cxx:7961 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" #: src/dialogs/confdialog.cxx:7966 msgid "Soft-symbol decoding" msgstr "" #: src/dialogs/confdialog.cxx:7967 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:7972 msgid "Soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:7973 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" #: src/dialogs/confdialog.cxx:8003 msgid "Navtex" msgstr "" #: src/dialogs/confdialog.cxx:8005 msgid "Log Navtex messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:8010 msgid "Log Navtex messages to KML" msgstr "" #: src/dialogs/confdialog.cxx:8011 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" #: src/dialogs/confdialog.cxx:8018 msgid "Wefax" msgstr "" #: src/dialogs/confdialog.cxx:8021 msgid "Embedded Wefax Gui" msgstr "" #: src/dialogs/confdialog.cxx:8022 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" #: src/dialogs/confdialog.cxx:8027 msgid "Hide Transmission window" msgstr "" #: src/dialogs/confdialog.cxx:8028 msgid "Hide transmission window by default." msgstr "" #: src/dialogs/confdialog.cxx:8033 msgid "Log Wefax messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:8034 msgid "Sent and received faxes are logged to Adif file." msgstr "" #: src/dialogs/confdialog.cxx:8039 msgid "Frequency shift (800 Hz)" msgstr "" #: src/dialogs/confdialog.cxx:8040 src/dialogs/confdialog.cxx:8051 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "" #: src/dialogs/confdialog.cxx:8050 msgid "Rx fax max rows" msgstr "" #: src/dialogs/confdialog.cxx:8061 msgid "Fax images destination directory" msgstr "" #: src/dialogs/confdialog.cxx:8066 msgid "Directory..." msgstr "" #: src/dialogs/confdialog.cxx:8069 #, fuzzy msgid "Save image as monochrome file" msgstr "Enregistrer fichier macros" #: src/dialogs/confdialog.cxx:8070 msgid "Save the fax image as a gray-level PNG file." msgstr "" #: src/dialogs/confdialog.cxx:8083 msgid "Rig" msgstr "" #: src/dialogs/confdialog.cxx:8084 msgid "Transceiver control" msgstr "Contrôle transceiver" #: src/dialogs/confdialog.cxx:8088 msgid "Hardware PTT" msgstr "PTT matériel" #: src/dialogs/confdialog.cxx:8091 src/dialogs/confdialog.cxx:8926 msgid "PTT tone on right audio channel " msgstr "Tonalité PTT sur le canal audio droit " #: src/dialogs/confdialog.cxx:8092 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Peut être utilisé à la place ou en plus d'autres types de PTT" #: src/dialogs/confdialog.cxx:8099 msgid "h/w ptt device-pin" msgstr "Brochage périphérique PTT matériel" #: src/dialogs/confdialog.cxx:8102 msgid "Use separate serial port PTT" msgstr "Utiliser un port série PTT à part" #: src/dialogs/confdialog.cxx:8107 src/dialogs/confdialog.cxx:8204 #: src/dialogs/confdialog.cxx:8414 src/dialogs/confdialog.cxx:8668 #: src/dialogs/confdialog.cxx:8856 msgid "Device:" msgstr "Périphérique:" #: src/dialogs/confdialog.cxx:8121 msgid "Use RTS" msgstr "Utiliser RTS" #: src/dialogs/confdialog.cxx:8122 msgid "RTS is PTT signal line" msgstr "RTS est la ligne de signal PTT" #: src/dialogs/confdialog.cxx:8126 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:8127 msgid "Initial voltage on RTS" msgstr "Voltage initial sur RTS" #: src/dialogs/confdialog.cxx:8131 msgid "Use DTR" msgstr "Utiliser DTR" #: src/dialogs/confdialog.cxx:8132 msgid "DTR is PTT signal line" msgstr "DTR est la ligne de signal PTT" #: src/dialogs/confdialog.cxx:8136 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:8137 msgid "Initial voltage on DTR" msgstr "Voltage initial sur DTR" #: src/dialogs/confdialog.cxx:8141 src/dialogs/confdialog.cxx:8305 #: src/dialogs/confdialog.cxx:8567 src/dialogs/confdialog.cxx:8642 #: src/dialogs/confdialog.cxx:9475 msgid "Initialize" msgstr "Initialise" #: src/dialogs/confdialog.cxx:8142 msgid "Initialize the H/W PTT interface" msgstr "Initialise l'interface PTT matérielle" #: src/dialogs/confdialog.cxx:8145 msgid "Use parallel port PTT" msgstr "Utiliser un port parallèle PTT" #: src/dialogs/confdialog.cxx:8150 msgid "Use uHRouter PTT" msgstr "Utiliser PTT uHRouter" #: src/dialogs/confdialog.cxx:8157 msgid "PTT delays valid for all CAT/PTT types" msgstr "" #: src/dialogs/confdialog.cxx:8160 msgid "Start of transmit PTT delay" msgstr "" #: src/dialogs/confdialog.cxx:8161 msgid "Delay NN msec before starting audio" msgstr "" #: src/dialogs/confdialog.cxx:8170 msgid "PTT end of transmit delay" msgstr "" #: src/dialogs/confdialog.cxx:8171 msgid "Delay NN msec before releasing PTT" msgstr "" #: src/dialogs/confdialog.cxx:8184 msgid "RigCAT" msgstr "RigCAT" #: src/dialogs/confdialog.cxx:8185 msgid "Rig Control using xml spec file" msgstr "Contrôle Rig grâce à un fichier de spec xml" #: src/dialogs/confdialog.cxx:8187 msgid "Use RigCAT" msgstr "Utiliser RigCAT" #: src/dialogs/confdialog.cxx:8188 msgid "RigCAT used for rig control" msgstr "" #: src/dialogs/confdialog.cxx:8194 msgid "Rig description file:" msgstr "" #: src/dialogs/confdialog.cxx:8195 msgid "Use Open to select descriptor file" msgstr "" #: src/dialogs/confdialog.cxx:8201 msgid "Select rig descriptor file" msgstr "" #: src/dialogs/confdialog.cxx:8219 src/dialogs/confdialog.cxx:8429 msgid "Retries" msgstr "" #: src/dialogs/confdialog.cxx:8220 msgid "# retries before giving up" msgstr "" #: src/dialogs/confdialog.cxx:8236 src/dialogs/confdialog.cxx:8532 msgid "Retry interval (ms)" msgstr "" #: src/dialogs/confdialog.cxx:8237 msgid "Time between retires in msec" msgstr "" #: src/dialogs/confdialog.cxx:8253 src/dialogs/confdialog.cxx:8463 msgid "Write delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:8254 msgid "Wait for response to subsequent command" msgstr "" #: src/dialogs/confdialog.cxx:8270 src/dialogs/confdialog.cxx:8497 msgid "Baud rate:" msgstr "" #: src/dialogs/confdialog.cxx:8286 src/dialogs/confdialog.cxx:8513 msgid "Stopbits" msgstr "Bits stop" #: src/dialogs/confdialog.cxx:8306 msgid "Initialize RigCAT interface" msgstr "Initialise interface RigCAT" #: src/dialogs/confdialog.cxx:8309 msgid "Commands are echoed" msgstr "" #: src/dialogs/confdialog.cxx:8310 msgid "Rig or interface echos serial data" msgstr "" #: src/dialogs/confdialog.cxx:8315 msgid "CAT command for PTT" msgstr "" #: src/dialogs/confdialog.cxx:8316 msgid "PTT is a CAT command (not hardware)" msgstr "" #: src/dialogs/confdialog.cxx:8322 msgid "Toggle RTS for PTT" msgstr "" #: src/dialogs/confdialog.cxx:8323 msgid "RTS is ptt line" msgstr "" #: src/dialogs/confdialog.cxx:8328 msgid "Toggle DTR for PTT" msgstr "" #: src/dialogs/confdialog.cxx:8329 msgid "DTR is ptt line" msgstr "" #: src/dialogs/confdialog.cxx:8334 msgid "RTS +12 v" msgstr "" #: src/dialogs/confdialog.cxx:8335 src/dialogs/confdialog.cxx:8599 msgid "Initial state of RTS" msgstr "" #: src/dialogs/confdialog.cxx:8340 msgid "DTR +12 v" msgstr "" #: src/dialogs/confdialog.cxx:8341 src/dialogs/confdialog.cxx:8593 msgid "Initial state of DTR" msgstr "" #: src/dialogs/confdialog.cxx:8346 src/dialogs/confdialog.cxx:8604 msgid "RTS/CTS flow control" msgstr "Contrôle de flux RTS/CTS" #: src/dialogs/confdialog.cxx:8347 msgid "Rig uses RTS/CTS handshake" msgstr "" #: src/dialogs/confdialog.cxx:8352 msgid "Restore Settings on Close" msgstr "" #: src/dialogs/confdialog.cxx:8353 msgid "Restore the serial (COM) port settings" msgstr "" #: src/dialogs/confdialog.cxx:8358 src/dialogs/confdialog.cxx:8617 msgid "Revert" msgstr "Inverse" #: src/dialogs/confdialog.cxx:8359 #, fuzzy msgid "Reset rigCAT interface" msgstr "Initialise interface RigCAT" #: src/dialogs/confdialog.cxx:8364 #, fuzzy msgid "VSP Enable" msgstr "Activé" #: src/dialogs/confdialog.cxx:8365 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "" #: src/dialogs/confdialog.cxx:8370 msgid "Init delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:8371 msgid "Wait for response to first CAT command" msgstr "" #: src/dialogs/confdialog.cxx:8391 msgid "Hamlib" msgstr "Hamlib" #: src/dialogs/confdialog.cxx:8393 msgid "Use Hamlib" msgstr "Utilise Hamlib" #: src/dialogs/confdialog.cxx:8394 msgid "Hamlib used for rig control" msgstr "Hamlib utilisé pour contrôle radio" #: src/dialogs/confdialog.cxx:8400 msgid "Rig:" msgstr "Radio:" #: src/dialogs/confdialog.cxx:8430 msgid "# times to resend command before giving up" msgstr "" #: src/dialogs/confdialog.cxx:8446 msgid "Retry Interval (ms)" msgstr "" #: src/dialogs/confdialog.cxx:8447 src/dialogs/confdialog.cxx:8533 msgid "Msec's between retries" msgstr "" #: src/dialogs/confdialog.cxx:8464 msgid "Msec's between sequential commands" msgstr "" #: src/dialogs/confdialog.cxx:8480 msgid "Post write delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:8481 msgid "Wait interval (msecs) before reading response" msgstr "" #: src/dialogs/confdialog.cxx:8552 msgid "Advanced configuration:" msgstr "Configuration avancée:" #: src/dialogs/confdialog.cxx:8553 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Configuration optionnelle\n" "au format: param=val ..." #: src/dialogs/confdialog.cxx:8568 msgid "Initialize hamlib interface" msgstr "Initialise interface hamlib" #: src/dialogs/confdialog.cxx:8571 msgid "Sideband:" msgstr "Bande latérale:" #: src/dialogs/confdialog.cxx:8585 msgid "PTT via Hamlib command" msgstr "PTT par commande Hamlib" #: src/dialogs/confdialog.cxx:8586 msgid "PTT is a hamlib command" msgstr "PTT est un commande hamlib" #: src/dialogs/confdialog.cxx:8592 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:8598 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:8605 msgid "Rig requires RTS/CTS flow control" msgstr "Radio requiert contrôle de flux RTS/CTS" #: src/dialogs/confdialog.cxx:8611 msgid "XON/XOFF flow control" msgstr "Contrôle de flux XON/XOFF" #: src/dialogs/confdialog.cxx:8612 msgid "Rig requires Xon/Xoff flow control" msgstr "Radio requiert contrôle de flux Xon/Xoff" #: src/dialogs/confdialog.cxx:8618 #, fuzzy msgid "Reset hamlib interface" msgstr "Initialise interface hamlib" #: src/dialogs/confdialog.cxx:8627 msgid "XML-RPC" msgstr "" #: src/dialogs/confdialog.cxx:8635 msgid "" "Rig control via external\n" "program using xmlrpc\n" "remote calls." msgstr "" #: src/dialogs/confdialog.cxx:8637 msgid "Use XML-RPC program" msgstr "" #: src/dialogs/confdialog.cxx:8638 msgid "Experimental" msgstr "Expérimental" #: src/dialogs/confdialog.cxx:8643 msgid "Initialize XML-RPC rig control" msgstr "" #: src/dialogs/confdialog.cxx:8655 msgid "Audio devices" msgstr "Périphériques audio" #: src/dialogs/confdialog.cxx:8659 msgid "Devices" msgstr "Périphériques" #: src/dialogs/confdialog.cxx:8662 msgid "OSS" msgstr "" #: src/dialogs/confdialog.cxx:8663 msgid "Use OSS audio server" msgstr "" #: src/dialogs/confdialog.cxx:8669 msgid "Select device" msgstr "" #: src/dialogs/confdialog.cxx:8677 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:8678 msgid "Use Port Audio server" msgstr "" #: src/dialogs/confdialog.cxx:8683 msgid "Capture:" msgstr "Capture:" #: src/dialogs/confdialog.cxx:8684 msgid "Audio input device" msgstr "Périph. audio entrée" #: src/dialogs/confdialog.cxx:8688 msgid "Playback:" msgstr "Sortie:" #: src/dialogs/confdialog.cxx:8689 msgid "Audio output device" msgstr "Périph. audio sortie" #: src/dialogs/confdialog.cxx:8697 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:8698 msgid "Use Pulse Audio server" msgstr "" #: src/dialogs/confdialog.cxx:8703 msgid "Server string:" msgstr "" #: src/dialogs/confdialog.cxx:8704 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" #: src/dialogs/confdialog.cxx:8722 msgid "File I/O only" msgstr "E/S fichier seulement" #: src/dialogs/confdialog.cxx:8723 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "" #: src/dialogs/confdialog.cxx:8732 msgid "Settings" msgstr "" #: src/dialogs/confdialog.cxx:8734 msgid "Sample rate" msgstr "" #: src/dialogs/confdialog.cxx:8737 msgid "Capture" msgstr "Capture" #: src/dialogs/confdialog.cxx:8738 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" #: src/dialogs/confdialog.cxx:8770 msgid "Converter" msgstr "" #: src/dialogs/confdialog.cxx:8771 msgid "Set the type of resampler used of offset correction" msgstr "" #: src/dialogs/confdialog.cxx:8787 msgid "Corrections" msgstr "" #: src/dialogs/confdialog.cxx:8790 msgid "RX ppm" msgstr "" #: src/dialogs/confdialog.cxx:8791 msgid "RX sound card correction" msgstr "" #: src/dialogs/confdialog.cxx:8807 msgid "TX ppm" msgstr "" #: src/dialogs/confdialog.cxx:8808 msgid "TX sound card correction" msgstr "" #: src/dialogs/confdialog.cxx:8824 msgid "TX offset" msgstr "" #: src/dialogs/confdialog.cxx:8825 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "" #: src/dialogs/confdialog.cxx:8845 msgid "Mixer" msgstr "Mixeur" #: src/dialogs/confdialog.cxx:8847 #, fuzzy msgid "OSS Mixer" msgstr "Mixeur OSS" #: src/dialogs/confdialog.cxx:8850 msgid "Manage mixer" msgstr "Gère le mixeur" #: src/dialogs/confdialog.cxx:8851 msgid "Add mixer controls to main dialog" msgstr "" #: src/dialogs/confdialog.cxx:8857 msgid "Select Mixer device" msgstr "" #: src/dialogs/confdialog.cxx:8872 msgid "Mic In" msgstr "" #: src/dialogs/confdialog.cxx:8873 msgid "Use microphone input" msgstr "" #: src/dialogs/confdialog.cxx:8876 msgid "Line In" msgstr "" #: src/dialogs/confdialog.cxx:8877 msgid "Use Line-In device" msgstr "" #: src/dialogs/confdialog.cxx:8881 msgid "PCM" msgstr "" #: src/dialogs/confdialog.cxx:8882 msgid "Set the sound card PCM level" msgstr "" #: src/dialogs/confdialog.cxx:8902 #, fuzzy msgid "Right channel" msgstr "Canaux" #: src/dialogs/confdialog.cxx:8904 #, fuzzy msgid "Mono audio output" msgstr "Périph. audio sortie" #: src/dialogs/confdialog.cxx:8905 msgid "Force output audio to single channel" msgstr "" #: src/dialogs/confdialog.cxx:8910 msgid "Modem signal on left and right channels" msgstr "" #: src/dialogs/confdialog.cxx:8911 msgid "Left and right channels both contain modem audio" msgstr "" #: src/dialogs/confdialog.cxx:8916 msgid "Reverse Left/Right channels" msgstr "" #: src/dialogs/confdialog.cxx:8917 #, fuzzy msgid "Software reversal of left-right audio channels" msgstr "Tonalité PTT sur le canal audio droit " #: src/dialogs/confdialog.cxx:8922 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" #: src/dialogs/confdialog.cxx:8927 #, fuzzy msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "Peut être utilisé à la place ou en plus d'autres types de PTT" #: src/dialogs/confdialog.cxx:8933 #, fuzzy msgid "CW QSK signal on right channel" msgstr "Tonalité PTT sur le canal audio droit " #: src/dialogs/confdialog.cxx:8934 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "" #: src/dialogs/confdialog.cxx:8939 msgid "Pseudo-FSK on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:8940 msgid "Create 1000 Hz square wave on right channel" msgstr "" #: src/dialogs/confdialog.cxx:8949 msgid "Wav" msgstr "" #: src/dialogs/confdialog.cxx:8951 msgid "Wav write sample rate" msgstr "" #: src/dialogs/confdialog.cxx:8952 msgid "Pick baud rate from list" msgstr "" #: src/dialogs/confdialog.cxx:8974 msgid "ID" msgstr "ID" #: src/dialogs/confdialog.cxx:8977 msgid "RsID" msgstr "" #: src/dialogs/confdialog.cxx:8978 msgid "Reed-Solomon ID (Rx)" msgstr "" #: src/dialogs/confdialog.cxx:8981 msgid "Notify only" msgstr "" #: src/dialogs/confdialog.cxx:8982 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:8988 msgid "Receive modes" msgstr "Modes réception" #: src/dialogs/confdialog.cxx:8991 msgid "Searches passband" msgstr "" #: src/dialogs/confdialog.cxx:8992 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" #: src/dialogs/confdialog.cxx:8997 msgid "Mark prev freq/mode" msgstr "" #: src/dialogs/confdialog.cxx:8998 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" #: src/dialogs/confdialog.cxx:9003 msgid "Disables detector" msgstr "" #: src/dialogs/confdialog.cxx:9004 msgid "Disable further detection when RSID is received" msgstr "" #: src/dialogs/confdialog.cxx:9011 msgid "Allow errors" msgstr "" #: src/dialogs/confdialog.cxx:9012 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" #: src/dialogs/confdialog.cxx:9023 msgid "Medium" msgstr "" #: src/dialogs/confdialog.cxx:9028 #, fuzzy msgid "Squelch open (sec)" msgstr "Niveau squelch" #: src/dialogs/confdialog.cxx:9029 msgid "Open squelch for nn sec if RSID detected" msgstr "" #: src/dialogs/confdialog.cxx:9047 msgid "Disable alert dialog" msgstr "" #: src/dialogs/confdialog.cxx:9048 msgid "Do not show RsID alert dialog box" msgstr "" #: src/dialogs/confdialog.cxx:9053 #, fuzzy msgid "Retain tx freq lock" msgstr "Fréquence émission verrouillée" #: src/dialogs/confdialog.cxx:9054 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:9059 msgid "Disable freq change" msgstr "" #: src/dialogs/confdialog.cxx:9060 msgid "Do not automatically change to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:9065 msgid "" "The RsID notification message contents and \n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" #: src/dialogs/confdialog.cxx:9073 msgid "Pre-Signal Tone" msgstr "" #: src/dialogs/confdialog.cxx:9076 #, fuzzy msgid "Seconds" msgstr "secondes" #: src/dialogs/confdialog.cxx:9077 msgid "Use for triggering amplifier carrier detect" msgstr "" #: src/dialogs/confdialog.cxx:9085 msgid "Reed-Solomon ID (Tx)" msgstr "" #: src/dialogs/confdialog.cxx:9088 msgid "Transmit modes" msgstr "Modes transmission" #: src/dialogs/confdialog.cxx:9091 msgid "End of xmt ID" msgstr "" #: src/dialogs/confdialog.cxx:9092 msgid "Add RsID signal to end of transmission" msgstr "" #: src/dialogs/confdialog.cxx:9101 msgid "Video" msgstr "" #: src/dialogs/confdialog.cxx:9103 msgid "Video Preamble ID" msgstr "" #: src/dialogs/confdialog.cxx:9106 msgid "Transmit mode ID" msgstr "" #: src/dialogs/confdialog.cxx:9107 msgid "Waterfall video ID" msgstr "" #: src/dialogs/confdialog.cxx:9111 msgid "Transmit video text" msgstr "" #: src/dialogs/confdialog.cxx:9112 msgid "Waterfall video text" msgstr "" #: src/dialogs/confdialog.cxx:9117 msgid ":" msgstr "" #: src/dialogs/confdialog.cxx:9118 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" #: src/dialogs/confdialog.cxx:9132 msgid "Use small font" msgstr "" #: src/dialogs/confdialog.cxx:9133 msgid "" "ON - small font\n" "OFF - large font" msgstr "" #: src/dialogs/confdialog.cxx:9139 msgid "Chars/Row:" msgstr "" #: src/dialogs/confdialog.cxx:9140 msgid "Set the number of characters per row" msgstr "" #: src/dialogs/confdialog.cxx:9160 msgid "500 Hz limit" msgstr "" #: src/dialogs/confdialog.cxx:9165 msgid "Mode width limit" msgstr "" #: src/dialogs/confdialog.cxx:9170 msgid "Video ID modes" msgstr "" #: src/dialogs/confdialog.cxx:9179 msgid "CW Postamble ID" msgstr "" #: src/dialogs/confdialog.cxx:9182 msgid "Transmit callsign" msgstr "" #: src/dialogs/confdialog.cxx:9183 msgid "Send Callsign in CW at end of every transmission" msgstr "" #: src/dialogs/confdialog.cxx:9188 msgid "Speed (WPM):" msgstr "Vitesse (WPM):" #: src/dialogs/confdialog.cxx:9189 msgid "Send at this WPM" msgstr "" #: src/dialogs/confdialog.cxx:9209 msgid "CW ID modes" msgstr "" #: src/dialogs/confdialog.cxx:9224 msgid "CPU" msgstr "" #: src/dialogs/confdialog.cxx:9228 msgid "Slow CPU (less than 700MHz)" msgstr "" #: src/dialogs/confdialog.cxx:9229 msgid "Enable if you're computer does not decode properly" msgstr "" #: src/dialogs/confdialog.cxx:9238 msgid "NBEMS" msgstr "" #: src/dialogs/confdialog.cxx:9240 msgid "NBEMS data file interface" msgstr "" #: src/dialogs/confdialog.cxx:9243 #, fuzzy msgid "Enable" msgstr "Activé" #: src/dialogs/confdialog.cxx:9244 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "" #: src/dialogs/confdialog.cxx:9249 #, fuzzy msgid "Open message folder" msgstr "Ouvrir fichier macros" #: src/dialogs/confdialog.cxx:9250 msgid "Opens NBEMS file folder upon successful capture" msgstr "" #: src/dialogs/confdialog.cxx:9257 msgid "Reception of flmsg files" msgstr "" #: src/dialogs/confdialog.cxx:9260 msgid "Open with flmsg" msgstr "" #: src/dialogs/confdialog.cxx:9261 msgid "Open message with flmsg" msgstr "" #: src/dialogs/confdialog.cxx:9266 #, fuzzy msgid "Open in browser" msgstr "Navigateur PSK" #: src/dialogs/confdialog.cxx:9267 msgid "Open file with default browser" msgstr "" #: src/dialogs/confdialog.cxx:9272 msgid "flmsg:" msgstr "" #: src/dialogs/confdialog.cxx:9273 msgid "Enter full path-filename for flmsg" msgstr "" #: src/dialogs/confdialog.cxx:9286 msgid "Locate flmsg" msgstr "" #: src/dialogs/confdialog.cxx:9290 msgid "Timeout (secs)" msgstr "" #: src/dialogs/confdialog.cxx:9291 msgid "Extract times out after NN seconds of inactivity." msgstr "" #: src/dialogs/confdialog.cxx:9308 msgid "Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:9311 msgid "Mail Server Attributes" msgstr "" #: src/dialogs/confdialog.cxx:9314 msgid "Carrier frequency (Hz)" msgstr "Fréquence porteuse (Hz)" #: src/dialogs/confdialog.cxx:9315 msgid "Default listen / transmit frequency" msgstr "" #: src/dialogs/confdialog.cxx:9334 msgid "Search range (Hz)" msgstr "Plage du recherche (Hz)" #: src/dialogs/confdialog.cxx:9335 msgid "Listen for signals within this range" msgstr "" #: src/dialogs/confdialog.cxx:9374 msgid "AFC range (Hz)" msgstr "Plage AFC (Hz)" #: src/dialogs/confdialog.cxx:9375 msgid "Limit AFC movement to this range" msgstr "" #: src/dialogs/confdialog.cxx:9394 msgid "Reset to Carrier" msgstr "" #: src/dialogs/confdialog.cxx:9395 msgid "When no signal present" msgstr "" #: src/dialogs/confdialog.cxx:9406 msgid "Report ARQ frames average S/N" msgstr "" #: src/dialogs/confdialog.cxx:9415 msgid "Spotting" msgstr "" #: src/dialogs/confdialog.cxx:9417 msgid "PSK Reporter" msgstr "" #: src/dialogs/confdialog.cxx:9420 msgid "Automatically spot callsigns in decoded text" msgstr "" #: src/dialogs/confdialog.cxx:9421 msgid "Parse all incoming text" msgstr "" #: src/dialogs/confdialog.cxx:9426 msgid "Send reception report when logging a QSO" msgstr "" #: src/dialogs/confdialog.cxx:9427 msgid "Send report only when QSO is logged" msgstr "" #: src/dialogs/confdialog.cxx:9432 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "" #: src/dialogs/confdialog.cxx:9433 msgid "Include the transmit frequency" msgstr "" #: src/dialogs/confdialog.cxx:9438 msgid "Disable spotting when signal browser(s) are not visible." msgstr "" #: src/dialogs/confdialog.cxx:9439 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "" #: src/dialogs/confdialog.cxx:9445 msgid "Host:" msgstr "Hôte:" #: src/dialogs/confdialog.cxx:9446 msgid "To whom the connection is made" msgstr "" #: src/dialogs/confdialog.cxx:9461 msgid "Using UDP port #" msgstr "" #: src/dialogs/confdialog.cxx:9476 msgid "Initialize the socket client" msgstr "" #: src/dialogs/confdialog.cxx:9479 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:9487 msgid "Sweet Spot" msgstr "" #: src/dialogs/confdialog.cxx:9493 msgid "Default CW tracking point" msgstr "" #: src/dialogs/confdialog.cxx:9512 msgid "Default RTTY tracking point" msgstr "" #: src/dialogs/confdialog.cxx:9530 msgid "PSK et al." msgstr "" #: src/dialogs/confdialog.cxx:9531 msgid "Default for all other modems" msgstr "" #: src/dialogs/confdialog.cxx:9549 msgid "Always start new modems at these frequencies" msgstr "" #: src/dialogs/confdialog.cxx:9550 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" #: src/dialogs/confdialog.cxx:9558 #, fuzzy msgid "K3 A1A configuation" msgstr "Configuration avancée:" #: src/dialogs/confdialog.cxx:9561 msgid "CW is LSB" msgstr "" #: src/dialogs/confdialog.cxx:9562 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" #: src/dialogs/confdialog.cxx:9571 #, fuzzy msgid "Text i/o" msgstr "Texte:" #: src/dialogs/confdialog.cxx:9573 msgid "Talker Socket (MS only)" msgstr "" #: src/dialogs/confdialog.cxx:9576 msgid "Talker" msgstr "" #: src/dialogs/confdialog.cxx:9580 msgid "Connect/disconnect to Talker socket server" msgstr "" #: src/dialogs/confdialog.cxx:9583 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" #: src/dialogs/confdialog.cxx:9590 msgid "Capture rx text to external file" msgstr "" #: src/dialogs/confdialog.cxx:9593 msgid "Enable rx text stream" msgstr "" #: src/dialogs/confdialog.cxx:9594 msgid "Send rx text to file: textout.txt" msgstr "" #: src/dialogs/confdialog.cxx:9603 msgid "DTMF" msgstr "" #: src/dialogs/confdialog.cxx:9605 msgid "Decode DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:9606 msgid "Decode received DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:9613 msgid "WX" msgstr "" #: src/dialogs/confdialog.cxx:9615 msgid "Weather query specification" msgstr "" #: src/dialogs/confdialog.cxx:9618 msgid "METAR station ID code" msgstr "" #: src/dialogs/confdialog.cxx:9619 msgid "" "for example KMDQ for \n" "Huntsville-Madison Executive Airport, AL" msgstr "" #: src/dialogs/confdialog.cxx:9624 msgid "Full report" msgstr "" #: src/dialogs/confdialog.cxx:9625 msgid "Insert full METAR report" msgstr "" #: src/dialogs/confdialog.cxx:9630 msgid "End of header string:" msgstr "" #: src/dialogs/confdialog.cxx:9631 msgid "" "Text defining end of METAR header\n" "Typically 'Connection: close'\n" "Used to search for station name" msgstr "" #: src/dialogs/confdialog.cxx:9637 msgid "METAR station location" msgstr "" #: src/dialogs/confdialog.cxx:9638 msgid "Add geopolitical name of METAR station" msgstr "" #: src/dialogs/confdialog.cxx:9643 #, fuzzy msgid "Conditions" msgstr "Options ligne de commande" #: src/dialogs/confdialog.cxx:9644 msgid "current wx conditions" msgstr "" #: src/dialogs/confdialog.cxx:9649 msgid "Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:9650 msgid "report Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:9655 msgid "Celsius" msgstr "" #: src/dialogs/confdialog.cxx:9656 msgid "report Celsius" msgstr "" #: src/dialogs/confdialog.cxx:9661 msgid "Miles / Hour" msgstr "" #: src/dialogs/confdialog.cxx:9662 msgid "report miles per hour" msgstr "" #: src/dialogs/confdialog.cxx:9667 msgid "kilometers / hour" msgstr "" #: src/dialogs/confdialog.cxx:9668 msgid "report kilometers per hour" msgstr "" #: src/dialogs/confdialog.cxx:9673 msgid "Inches Mg." msgstr "" #: src/dialogs/confdialog.cxx:9674 msgid "report inches mercury" msgstr "" #: src/dialogs/confdialog.cxx:9679 msgid "mbars" msgstr "" #: src/dialogs/confdialog.cxx:9680 msgid "report millibars" msgstr "" #: src/dialogs/confdialog.cxx:9685 #, fuzzy msgid "Temperature" msgstr "Génération TX" #: src/dialogs/confdialog.cxx:9688 msgid "Wind speed/dir" msgstr "" #: src/dialogs/confdialog.cxx:9691 msgid "Barometric pressure" msgstr "" #: src/dialogs/confdialog.cxx:9694 msgid "Search on web" msgstr "" #: src/dialogs/confdialog.cxx:9701 msgid "KML" msgstr "" #: src/dialogs/confdialog.cxx:9703 msgid "KML files directory" msgstr "" #: src/dialogs/confdialog.cxx:9704 msgid "Where generated KML documents are stored." msgstr "" #: src/dialogs/confdialog.cxx:9709 msgid "KML root file" msgstr "" #: src/dialogs/confdialog.cxx:9713 msgid "Minimum distance for splitting aliases (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:9714 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:9724 msgid "Data retention time, in hours (0 for no limit)" msgstr "" #: src/dialogs/confdialog.cxx:9725 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" #: src/dialogs/confdialog.cxx:9734 msgid "KML refresh interval (seconds)" msgstr "" #: src/dialogs/confdialog.cxx:9735 msgid "Refresh time interval written in KML file (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:9751 msgid "KML balloon display style" msgstr "" #: src/dialogs/confdialog.cxx:9752 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" #: src/dialogs/confdialog.cxx:9767 #, fuzzy msgid "Command run on KML creation" msgstr "Options ligne de commande" #: src/dialogs/confdialog.cxx:9768 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" #: src/dialogs/confdialog.cxx:9774 msgid "Test command" msgstr "" #: src/dialogs/confdialog.cxx:9775 msgid "Execute command on KML files." msgstr "" #: src/dialogs/confdialog.cxx:9778 #, fuzzy msgid "Change dir..." msgstr "Change couleur" #: src/dialogs/confdialog.cxx:9779 msgid "Choose directory to store KML documents" msgstr "" #: src/dialogs/confdialog.cxx:9782 msgid "Cleanup KML data now !" msgstr "" #: src/dialogs/confdialog.cxx:9783 msgid "Cleanups KML documents, empties Google Earth display." msgstr "" #: src/dialogs/confdialog.cxx:9786 msgid "Cleanup on startup" msgstr "" #: src/dialogs/confdialog.cxx:9787 msgid "Empties KML documents when starting program." msgstr "" #: src/dialogs/confdialog.cxx:9798 msgid "Web" msgstr "" #: src/dialogs/confdialog.cxx:9799 msgid "Callsign database" msgstr "Base de données indicatifs" #: src/dialogs/confdialog.cxx:9802 msgid "Call Lookup" msgstr "" #: src/dialogs/confdialog.cxx:9803 msgid "Web Browser lookup" msgstr "" #: src/dialogs/confdialog.cxx:9807 msgid "Do not use callsign lookup via web browser" msgstr "" #: src/dialogs/confdialog.cxx:9813 msgid "QRZ online via default Internet Browser" msgstr "" #: src/dialogs/confdialog.cxx:9814 msgid "Visit QRZ web site" msgstr "" #: src/dialogs/confdialog.cxx:9819 msgid "HamCall online via default Internet Browser" msgstr "" #: src/dialogs/confdialog.cxx:9820 src/dialogs/confdialog.cxx:9868 msgid "Visit Hamcall web site" msgstr "" #: src/dialogs/confdialog.cxx:9825 msgid "HamQTH via default Internet Browser" msgstr "" #: src/dialogs/confdialog.cxx:9826 msgid "Visit hamQTH web site" msgstr "" #: src/dialogs/confdialog.cxx:9833 msgid "Data base lookup" msgstr "" #: src/dialogs/confdialog.cxx:9837 msgid "Do not use callsign database" msgstr "" #: src/dialogs/confdialog.cxx:9843 msgid "QRZ cdrom" msgstr "QRZ cdrom" #: src/dialogs/confdialog.cxx:9844 msgid "Use CD or hard drive CD image" msgstr "" #: src/dialogs/confdialog.cxx:9849 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:9850 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" #: src/dialogs/confdialog.cxx:9855 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:9856 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" #: src/dialogs/confdialog.cxx:9861 msgid "HamQTH.com (free service http://www.hamqth.com)" msgstr "" #: src/dialogs/confdialog.cxx:9862 msgid "Free service courtesy of OK" msgstr "" #: src/dialogs/confdialog.cxx:9867 msgid "Callook.info lookup (free service US callsigns only)" msgstr "" #: src/dialogs/confdialog.cxx:9873 msgid "at:" msgstr "à:" #: src/dialogs/confdialog.cxx:9874 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" #: src/dialogs/confdialog.cxx:9888 msgid "User name" msgstr "Nom utilisateur" #: src/dialogs/confdialog.cxx:9889 src/dialogs/confdialog.cxx:9935 #: src/dialogs/confdialog.cxx:9970 msgid "Your login name" msgstr "" #: src/dialogs/confdialog.cxx:9903 src/dialogs/confdialog.cxx:9949 msgid "Password" msgstr "Mot de passe" #: src/dialogs/confdialog.cxx:9904 src/dialogs/confdialog.cxx:9950 msgid "Your login password" msgstr "" #: src/dialogs/confdialog.cxx:9919 src/dialogs/confdialog.cxx:9965 msgid "Show" msgstr "Montre" #: src/dialogs/confdialog.cxx:9920 src/dialogs/confdialog.cxx:9966 msgid "Show password in plain text" msgstr "" #: src/dialogs/confdialog.cxx:9923 msgid "Add address to notes field" msgstr "" #: src/dialogs/confdialog.cxx:9932 msgid "eQSL" msgstr "" #: src/dialogs/confdialog.cxx:9934 #, fuzzy msgid "User ID" msgstr "Nom utilisateur" #: src/dialogs/confdialog.cxx:9969 msgid "QTH Nickname" msgstr "" #: src/dialogs/confdialog.cxx:9984 #, fuzzy msgid "Options" msgstr "Action" #: src/dialogs/confdialog.cxx:9987 msgid "send when logged (log button, , )" msgstr "" #: src/dialogs/confdialog.cxx:9988 msgid "automatic data upload" msgstr "" #: src/dialogs/confdialog.cxx:9993 #, fuzzy msgid "Default message" msgstr "Défauts" #: src/dialogs/confdialog.cxx:9994 msgid "default text to send with etc" msgstr "" #: src/dialogs/confdialog.cxx:10008 msgid "Text Tags (tags use {} delimiters)" msgstr "" #: src/dialogs/confdialog.cxx:10011 #, fuzzy msgid " {CALL} other ops call sign" msgstr "\tindicatif de l'autre" #: src/dialogs/confdialog.cxx:10014 msgid " {MODE} full mode / submode" msgstr "" #: src/dialogs/confdialog.cxx:10017 #, fuzzy msgid "{NAME} other ops name" msgstr "\tnom de l'autre" #: src/dialogs/confdialog.cxx:10020 msgid "These tags can also be used in " msgstr "" #: src/dialogs/confdialog.cxx:10024 msgid "Use date/time off for log entry" msgstr "" #: src/dialogs/confdialog.cxx:10025 msgid "default uses date/time on" msgstr "" #: src/dialogs/confdialog.cxx:10043 msgid "Auto start programs with fldigi" msgstr "" #: src/dialogs/confdialog.cxx:10046 msgid "flrig:" msgstr "" #: src/dialogs/confdialog.cxx:10047 src/dialogs/confdialog.cxx:10065 #: src/dialogs/confdialog.cxx:10083 src/dialogs/confdialog.cxx:10101 #: src/dialogs/confdialog.cxx:10119 src/dialogs/confdialog.cxx:10137 #: src/dialogs/confdialog.cxx:10155 msgid "" "Enter full path-filename for external program\n" "Or simple name of program" msgstr "" #: src/dialogs/confdialog.cxx:10060 src/dialogs/confdialog.cxx:10078 #: src/dialogs/confdialog.cxx:10096 src/dialogs/confdialog.cxx:10114 #: src/dialogs/confdialog.cxx:10132 src/dialogs/confdialog.cxx:10150 #: src/dialogs/confdialog.cxx:10168 #, fuzzy msgid "Locate" msgstr "Locator" #: src/dialogs/confdialog.cxx:10061 msgid "Locate flrig executable" msgstr "" #: src/dialogs/confdialog.cxx:10064 msgid "flamp:" msgstr "" #: src/dialogs/confdialog.cxx:10079 msgid "Locate flamp executable" msgstr "" #: src/dialogs/confdialog.cxx:10082 msgid "flnet:" msgstr "" #: src/dialogs/confdialog.cxx:10097 msgid "Locate flnet executable" msgstr "" #: src/dialogs/confdialog.cxx:10100 msgid "fllog:" msgstr "" #: src/dialogs/confdialog.cxx:10115 msgid "Locate fllog executable" msgstr "" #: src/dialogs/confdialog.cxx:10118 msgid "Prog 1:" msgstr "" #: src/dialogs/confdialog.cxx:10133 msgid "Locate program #1 executable" msgstr "" #: src/dialogs/confdialog.cxx:10136 msgid "Prog 2:" msgstr "" #: src/dialogs/confdialog.cxx:10151 msgid "Locate program #2 executable" msgstr "" #: src/dialogs/confdialog.cxx:10154 msgid "Prog 3:" msgstr "" #: src/dialogs/confdialog.cxx:10169 msgid "Locate program #3 executable" msgstr "" #: src/dialogs/confdialog.cxx:10172 #, fuzzy msgid "" "Enable\n" "-" msgstr "Activé" #: src/dialogs/confdialog.cxx:10173 src/dialogs/confdialog.cxx:10180 #: src/dialogs/confdialog.cxx:10186 src/dialogs/confdialog.cxx:10192 #: src/dialogs/confdialog.cxx:10198 src/dialogs/confdialog.cxx:10204 #: src/dialogs/confdialog.cxx:10210 msgid "Enable this entry when fldigi first starts" msgstr "" #: src/dialogs/confdialog.cxx:10215 src/dialogs/confdialog.cxx:10219 #: src/dialogs/confdialog.cxx:10223 src/dialogs/confdialog.cxx:10227 #: src/dialogs/confdialog.cxx:10231 src/dialogs/confdialog.cxx:10235 #: src/dialogs/confdialog.cxx:10239 #, fuzzy msgid "Test" msgstr "Test..." #: src/dialogs/confdialog.cxx:10216 msgid "Start flrig" msgstr "" #: src/dialogs/confdialog.cxx:10220 #, fuzzy msgid "Start flamp" msgstr "Date QSO" #: src/dialogs/confdialog.cxx:10224 #, fuzzy msgid "Start flnet" msgstr "Date QSO" #: src/dialogs/confdialog.cxx:10228 msgid "Start fllog" msgstr "" #: src/dialogs/confdialog.cxx:10232 msgid "Start prog1" msgstr "" #: src/dialogs/confdialog.cxx:10236 msgid "Start prog2" msgstr "" #: src/dialogs/confdialog.cxx:10240 msgid "Start prog3" msgstr "" #: src/dialogs/confdialog.cxx:10255 msgid "Restore defaults" msgstr "Restaure défauts" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "Couleur police" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "Police:" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "Taille:" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "&OK" #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" #: src/dialogs/font_browser.cxx:283 #, fuzzy msgid "Reading fonts..." msgstr "Rechercher des mises à jour..." #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 #, fuzzy msgid "Data files sources" msgstr "Fichiers NBEMS..." #: src/dialogs/record_browse.cxx:27 #, fuzzy msgid "Data files update" msgstr "Fichiers NBEMS..." #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Événement" #: src/dialogs/notifydialog.cxx:112 msgid "RE:" msgstr "" #: src/dialogs/notifydialog.cxx:124 msgid "Enabled" msgstr "Activé" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filtre" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "Entité DXCC" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Montre les entités DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Action" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Montre l'éditeur de macro" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "Entités DXCC" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Trouve le pays:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Trouve le préfix:" #: src/logbook/lgbook.cxx:397 msgid "Export Setup" msgstr "" #: src/logbook/lgbook.cxx:398 src/logbook/lgbook.cxx:1040 msgid "Select Records to Export" msgstr "" #: src/logbook/lgbook.cxx:406 src/logbook/lgbook.cxx:456 #: src/logbook/lgbook.cxx:1048 src/logbook/lgbook.cxx:1122 msgid "Check All" msgstr "" #: src/logbook/lgbook.cxx:409 #, fuzzy msgid "Start Date" msgstr "Date QSO" #: src/logbook/lgbook.cxx:410 msgid "Start date for export" msgstr "" #: src/logbook/lgbook.cxx:423 #, fuzzy msgid "Stop Date" msgstr "Date QSO" #: src/logbook/lgbook.cxx:424 msgid "Inclusive stop date for export" msgstr "" #: src/logbook/lgbook.cxx:437 #, fuzzy msgid "select by date" msgstr "Sélection de la radio par le nom" #: src/logbook/lgbook.cxx:438 msgid "Enable to select date range" msgstr "" #: src/logbook/lgbook.cxx:450 msgid "Select Fields to Export" msgstr "" #: src/logbook/lgbook.cxx:478 #, fuzzy msgid "QSO Date On" msgstr "Date QSO" #: src/logbook/lgbook.cxx:482 #, fuzzy msgid "QSO Date Off" msgstr "Date QSO" #: src/logbook/lgbook.cxx:486 msgid "Time ON" msgstr "Heure ON" #: src/logbook/lgbook.cxx:490 src/logbook/lgbook.cxx:1091 msgid "Time OFF" msgstr "Heure OFF" #: src/logbook/lgbook.cxx:494 msgid "TX Power" msgstr "" #: src/logbook/lgbook.cxx:497 src/logbook/lgbook.cxx:1095 msgid "RST sent" msgstr "RST env." #: src/logbook/lgbook.cxx:501 src/logbook/lgbook.cxx:1099 msgid "RST rcvd" msgstr "RST reçu" #: src/logbook/lgbook.cxx:505 src/logbook/lgbook.cxx:731 msgid "Qth" msgstr "Qth" #: src/logbook/lgbook.cxx:508 msgid "LOC" msgstr "LOC" #: src/logbook/lgbook.cxx:515 src/logbook/lgbook.cxx:876 msgid "QSL-VIA" msgstr "" #: src/logbook/lgbook.cxx:527 msgid "QSL rcvd date" msgstr "Date QSL reçue" #: src/logbook/lgbook.cxx:530 msgid "QSL sent date" msgstr "Date QSL env." #: src/logbook/lgbook.cxx:533 src/logbook/lgbook.cxx:1103 msgid "Serial # in" msgstr "" #: src/logbook/lgbook.cxx:536 src/logbook/lgbook.cxx:1107 msgid "Serial # out" msgstr "" #: src/logbook/lgbook.cxx:545 src/logbook/lgbook.cxx:804 #: src/logbook/lgbook.cxx:805 #, fuzzy msgid "County" msgstr "Pays" #: src/logbook/lgbook.cxx:551 src/logbook/lgbook.cxx:828 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:554 src/logbook/lgbook.cxx:864 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:557 src/logbook/lgbook.cxx:816 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:560 src/logbook/lgbook.cxx:840 msgid "ITUZ" msgstr "TIUZ" #: src/logbook/lgbook.cxx:570 msgid "Logbook" msgstr "" #: src/logbook/lgbook.cxx:571 #, fuzzy msgid "Date On" msgstr "Date QSO" #: src/logbook/lgbook.cxx:572 msgid "Date QSO started" msgstr "" #: src/logbook/lgbook.cxx:585 msgid "Time QSO started" msgstr "" #: src/logbook/lgbook.cxx:597 msgid "Call sign worked" msgstr "" #: src/logbook/lgbook.cxx:609 msgid "Operator worked" msgstr "" #: src/logbook/lgbook.cxx:621 msgid "Rst received" msgstr "" #: src/logbook/lgbook.cxx:632 msgid "QSL-rcvd" msgstr "QSL-reçu" #: src/logbook/lgbook.cxx:633 msgid "QSL received on this date" msgstr "" #: src/logbook/lgbook.cxx:645 #, fuzzy msgid "Date Off" msgstr "Date QSO" #: src/logbook/lgbook.cxx:646 #, fuzzy msgid "Date QSO Ended" msgstr "Date du QSO" #: src/logbook/lgbook.cxx:659 msgid "Time QSO ended" msgstr "" #: src/logbook/lgbook.cxx:670 msgid "Freq." msgstr "Fréq." #: src/logbook/lgbook.cxx:671 msgid "Frequency in MHz" msgstr "" #: src/logbook/lgbook.cxx:683 msgid "Mode in use" msgstr "" #: src/logbook/lgbook.cxx:694 msgid "Pwr" msgstr "" #: src/logbook/lgbook.cxx:695 msgid "Transmit power used" msgstr "" #: src/logbook/lgbook.cxx:707 msgid "Rst sent" msgstr "" #: src/logbook/lgbook.cxx:718 msgid "QSL-sent" msgstr "QSL-env." #: src/logbook/lgbook.cxx:719 msgid "QSL sent on this date" msgstr "" #: src/logbook/lgbook.cxx:732 msgid "City of station worked" msgstr "" #: src/logbook/lgbook.cxx:743 msgid "St" msgstr "St" #: src/logbook/lgbook.cxx:744 msgid "US state of station worked" msgstr "" #: src/logbook/lgbook.cxx:755 msgid "Pr" msgstr "" #: src/logbook/lgbook.cxx:756 msgid "Province of station worked" msgstr "" #: src/logbook/lgbook.cxx:768 msgid "Country of station worked" msgstr "" #: src/logbook/lgbook.cxx:779 msgid "Loc" msgstr "" #: src/logbook/lgbook.cxx:780 msgid "Stations grid square" msgstr "" #: src/logbook/lgbook.cxx:792 msgid "Interesting notes" msgstr "" #: src/logbook/lgbook.cxx:817 msgid "Islands on the air" msgstr "" #: src/logbook/lgbook.cxx:852 msgid "CONT" msgstr "CONT" #: src/logbook/lgbook.cxx:865 msgid "DXCC designator" msgstr "" #: src/logbook/lgbook.cxx:877 msgid "QSL route of contacted station" msgstr "" #: src/logbook/lgbook.cxx:888 msgid "Ser out" msgstr "" #: src/logbook/lgbook.cxx:889 #, fuzzy msgid "Contest serial # sent" msgstr "Champs &Contest" #: src/logbook/lgbook.cxx:901 msgid "Contest exchange sent" msgstr "" #: src/logbook/lgbook.cxx:912 msgid "Ser in" msgstr "" #: src/logbook/lgbook.cxx:913 msgid "Contest serial # received" msgstr "" #: src/logbook/lgbook.cxx:925 msgid "Contest exchange received" msgstr "" #: src/logbook/lgbook.cxx:936 msgid "Call Search" msgstr "" #: src/logbook/lgbook.cxx:937 msgid "Search for this callsign" msgstr "" #: src/logbook/lgbook.cxx:948 msgid "Recs" msgstr "" #: src/logbook/lgbook.cxx:949 msgid "# Records in logbook" msgstr "" #: src/logbook/lgbook.cxx:961 msgid "New record / Save record" msgstr "" #: src/logbook/lgbook.cxx:968 msgid "Update the current record" msgstr "" #: src/logbook/lgbook.cxx:975 msgid "Delete the current record" msgstr "" #: src/logbook/lgbook.cxx:981 msgid "Dial" msgstr "" #: src/logbook/lgbook.cxx:982 msgid "Retrieve for active modem use" msgstr "" #: src/logbook/lgbook.cxx:989 msgid "Find previous" msgstr "" #: src/logbook/lgbook.cxx:997 msgid "Find next" msgstr "" #: src/logbook/lgbook.cxx:1020 msgid "Date" msgstr "Date" #: src/logbook/lgbook.cxx:1022 msgid "Time" msgstr "Heure" #: src/logbook/lgbook.cxx:1039 msgid "Cabrillo Setup" msgstr "" #: src/logbook/lgbook.cxx:1059 msgid "Select Cabrillo Contest & Fields" msgstr "" #: src/logbook/lgbook.cxx:1062 msgid "Contest:" msgstr "Contest:" #: src/logbook/lgbook.cxx:1087 msgid "QSO Date" msgstr "Date QSO" #, fuzzy #~ msgid "Char set" #~ msgstr "Efface Liste" #~ msgid "Select serial port" #~ msgstr "Sélection port série" #~ msgid "Serial device" #~ msgstr "Périphérique série" #~ msgid "Select the rig by name" #~ msgstr "Sélection de la radio par le nom" #~ msgid "Serial port" #~ msgstr "Port série" #~ msgid "Save image as:" #~ msgstr "Sauvegarde image sous:" #~ msgid "Hide" #~ msgstr "Cacher" #~ msgid "Colors and Fonts" #~ msgstr "Couleurs et Polices" #, fuzzy #~ msgid "Disp" #~ msgstr "Affichage" #, fuzzy #~ msgid "Select Char Set" #~ msgstr "Sélectionne" #, fuzzy #~ msgid "Filter Quality" #~ msgstr "Filtre" #, fuzzy #~ msgid "Navtex stations file:" #~ msgstr "Enregistrer fichier macros" #~ msgid "after:" #~ msgstr "après:" #, fuzzy #~ msgid "Displays" #~ msgstr "Affichage" #~ msgid "Save log before exiting?" #~ msgstr "Sauvegarder le log avant de quitter?" #~ msgid "Save changed macros before exiting?" #~ msgstr "Sauvegarder les macros avant de quitter?" #~ msgid "QSO Freq" #~ msgstr "Freq QSO" #~ msgid "Cnty" #~ msgstr "Pays" #~ msgid "View log" #~ msgstr "Voir log" #~ msgid "Text:" #~ msgstr "Texte:" #, fuzzy #~ msgid "Rx Text" #~ msgstr "Texte:" #, fuzzy #~ msgid "Contestia" #~ msgstr "Contest" #~ msgid "Enable right audio channel" #~ msgstr "Active le canal audio droit" #~ msgid "Callsign DB" #~ msgstr "BdD Indicatifs" #~ msgid "CDROM" #~ msgstr "CDROM" #~ msgid "Not available" #~ msgstr "Pas disponible" #, fuzzy #~ msgid "On Date" #~ msgstr "Date QSO" #, fuzzy #~ msgid "Off Date" #~ msgstr "Date QSO" #~ msgid "Open logbook..." #~ msgstr "Ouvrir journal..." #~ msgid "Could not write to %s" #~ msgstr "Echec écriture vers %s" #~ msgid "Label:" #~ msgstr "Libellé:" #~ msgid "Rig Not Specified" #~ msgstr "Aucune radio spécifiée" #~ msgid "8" #~ msgstr "8" #~ msgid "Foreground" #~ msgstr "Avant plan" #~ msgid "Oper' Controls" #~ msgstr "Contrôles Oper'" #~ msgid "Viewer" #~ msgstr "Visualiseur" #, fuzzy #~ msgid "No Rig-Log" #~ msgstr "Control Radio" #, fuzzy #~ msgid "Min Rig-Log" #~ msgstr "Control Radio" #, fuzzy #~ msgid "Min Rig-Contest" #~ msgstr "Control Radio" #~ msgid "Show config" #~ msgstr "Montrer config" #, fuzzy #~ msgid "Config WF controls" #~ msgstr "Control radio" #~ msgid "*** DUP ***" #~ msgstr "*** DUP ***" #, fuzzy #~ msgid "Waterfall width in Hertz" #~ msgstr "Largeur Chute d'eau en Hz" #~ msgid "&Digiscope" #~ msgstr "&Digiscope" #~ msgid "&PSK Browser" #~ msgstr "Navigateur &PSK" #~ msgid "&Call" #~ msgstr "&Indicatif" #~ msgid "&Name" #~ msgstr "&Nom" #~ msgid "QT&H" #~ msgstr "QT&H" #~ msgid "&State" #~ msgstr "&Etat" #~ msgid "&Province" #~ msgstr "&Province" #~ msgid "Countr&y" #~ msgstr "Pa&ys" #~ msgid "&Transmit" #~ msgstr "&Transmet" #~ msgid "&Receive" #~ msgstr "&Reçoit" #~ msgid "&Abort" #~ msgstr "&Annuler" #~ msgid "&Copy" #~ msgstr "&Copier" #~ msgid "C&lear" #~ msgstr "E&ffacer" #~ msgid "Cu&t" #~ msgstr "Cou&per" #~ msgid "&Paste" #~ msgstr "Co&ller" #~ msgid "Non CAT mode" #~ msgstr "Mode hors CAT" #~ msgid "9" #~ msgstr "9" #~ msgid "" #~ "\n" #~ "System: " #~ msgstr "" #~ "\n" #~ "Système: " #~ msgid "Psk Viewer" #~ msgstr "Visualiseur Psk" #~ msgid "No PTT available" #~ msgstr "Aucun PTT dispo" #~ msgid "AFC on/off" #~ msgstr "AFC marche/arrêt" #~ msgid "SQL on/off" #~ msgstr "SQL marche/arrêt" #~ msgid "Waterfall/FFT - Shift click for signal scope" #~ msgstr "Chute d'eau/FFT - Shift clic pour scope signal" #~ msgid "Log File" #~ msgstr "Fichier de Log" #~ msgid "Paths" #~ msgstr "Chemins" #~ msgid "Slow" #~ msgstr "Lent" #~ msgid "Fast" #~ msgstr "Rapide" #~ msgid "X-scope" #~ msgstr "X-ccope" #~ msgid "Qrz" #~ msgstr "Qrz" #~ msgid "QRZ online" #~ msgstr "QRZ en ligne" #~ msgid "H/W ptt" #~ msgstr "H/W ptt" #~ msgid "Xml File" #~ msgstr "Fichier Xml" #~ msgid "SndCrd" #~ msgstr "SndCrd" #~ msgid "Wfall" #~ msgstr "Wfall" fldigi-3.21.80/po/en@boldquot.header0000664000175000017500000000247112313064025014112 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # fldigi-3.21.80/po/Rules-quot0000664000175000017500000000337612313064025012474 00000000000000# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header fldigi-3.21.80/po/Makevars0000664000175000017500000000347512313064025012165 00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = w1hkj AT w1hkj DOT com # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = fldigi-3.21.80/po/insert-header.sin0000664000175000017500000000124012313064025013722 00000000000000# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } fldigi-3.21.80/po/pl.gmo0000664000175000017500000023743212313333722011615 00000000000000Þ•Ã4&[LL¸e¹e¾eÂe×e$Ûef*fFf[f bfmf}fƒf‰f ’fžf¢f¦f¬fÂf‚Øf [gVhg ¿gÉg ßgìg!h(h*h!/hQhVh[h`hrhŒh¢h¸hÏhäh%ýh"#iFi&_i†iši"±iÔiòi÷i&j>j\juj†j—jj»jÀjÛjðjk"k=kQk fk ‡k¨k ¾kÊkÛkîkÿkll!/lQlnl‹l!¦lÈlålm"m 4mUmtmm m'ªmÒmîmómn(1nZnln ‹n¬n ¿n'Ínõnúno&.oUokoo•o§o»o×oêoÿo ppp /p9pLp Qp]pcpkp€pžp¥p$©pÎp&äp! q-q6qNqgqqƒq&—q ¾q ÉqÔq,òqr#(rLr_rrrxr~rDr Õr ãrîrþr*s›ÈÚÈñÈ ÉÉG%ÉmÉqɃɉɑɘɧɹÉÏÉêÉÊÊÊ!Ê;ÊOÊ+^ÊŠÊžÊÕ´ÊŠÌÌ‘Ì¦Ì ªÌËÌ6èÌÍ5Í >ÍIÍYÍ^ÍdÍ mÍyÍ}Í͇͜Íz±Í ,Îb9Î œÎ¦Î ¾ÎËÎ"æÎ Ï Ï"Ï3Ï8Ï=ÏBÏUÏnχϠϸÏÐÏ'íÏ#Ð9Ð*UЀКÐ'²ÐÚÐøÐ$ýÐ,"ÑOÑjхіѧѭÑÈÑÍÑêÑÒÒ2+Ò^ÒtÒ$Ò)²ÒÜÒ ðÒþÒÓ(Ó;ÓLÓ]ÓnÓŽÓ#©ÓÍÓ!çÓ" Ô",ÔOÔ^Ô'}Ô$¥ÔÊÔéÔ øÔ7Õ=ÕWÕ#\Õ%€Õ*¦ÕÑÕäÕ&Ö+ÖBÖ7QÖ‰ÖŽÖ!¢Ö*ÄÖïÖ ×&×<×S×iׅי׮ײ×Á×Ñ× ã×ñ× Ø ØØ $Ø.ØDØ]ØcØ'iØ‘Ø'°Ø,ØØÙ Ù)Ù>ÙYÙbÙ'€Ù ¨Ù ³Ù#¾Ù4âÙÚ!ÚAÚVÚmÚvÚ |ÚUÚóÚ ÛÛ$Û.@ÛoÛ;‹Û<ÇÛ"Ü'Ü&0Ü#WÜ0{ܬÜÁÜÈÜ*ÌÜ*÷Ü*"Ý#MÝqÝwÝ ÝݵÝÉÝÞÝþÝ ÞÞ *Þ 6ÞDÞcÞtÞ }Þ‡ÞÞ ¡Þ«Þ)¯Þ ÙÞãÞçÞðÞ÷ÞüÞ ÿÞ ßß <ß ]ßißyß •ß ß ´ßÀßÇß ×ßåßB÷ß :àFà YàBfà©à¸à ¿à'Éàñà+á'3á8[á ”áŸá¹áÎá×áIöá @âNâ0nâŸâ ·âÃâ-×âãã>.ãmã }ã<Šã ÇãÔãåãøã2ä AäQbä´äÐä×äóäùä,å5å Då+På|å3›åÏåéåææ æ.æ4æGæWæmææ—æŸæ¨æ·æ+Ëæ÷æþæç)ç@çXç `çjç~çžç'§ç ÏçÙç àçëç1óç%èSBè–è°èµè Ïè2Ùè é#é?éPé"hé ‹é–éé¢é ªé´é½éÚéíéòé ê ê ê:êSêXêiênêƒê˜ê²ê¸ê Îê.Øêë%ë9ëNë në({ë/¤ëÔëçë$ì,ì)5ì-_ìì “ì¡ì·ì³¿ì³sí'î >î KîWî.^î î˜îžî ¥î °îºîFÑîï!ï"?ïIbï¬ï?Ëï ðð $ð0ð Jð.kðšð ªð Ëð$Õðúð ññ0ñMñ Sñtñ”ñ®ñÌñEÔñ4ò#Oò4sò)¨òÒò+ïò'óCó`ó}ó"…ó¨óÀóÒó*âó+ ô'9ô0aô’ô°ô µôÀôÐôÓôäôôôüôõõ„.õ³õ»õÏõçõ,þõ +ö<8öuö{ö öŠö šö"¤öÇöÖö Þöéöùö÷/÷M÷S÷#h÷>Œ÷ Ë÷ Õ÷â÷ò÷øøø.ø Eø!Røtø#ˆø¬ø ÅøÐø Øøâøñø úøùt#ù+˜ù-Äù/òù&"ú%Iú(oú˜ú Ÿú­ú¼úÐú&æú û û"û4*û/_ûû—ûŸû%§û,Íû&úû#!ü EüQü#Xü |ü‡ü ü¾üÑü#Øüüüý ýý ýý$ý6ý;ý Uý `ýý¡ý¦ý»ýÐýêý þþ"-þ Pþ!qþ “þ´þÎþ?êþ*ÿ ?ÿMÿ)gÿ‘ÿ: ÿ Ûÿ*çÿ/5NV e7rRªPýDN.“XÂb;~Zº4åJ&0!W1y«³ ÓÝãú35Cy‚† ž«ÀÈ$Ñ'ö'7_}Œ ”ž³ÌÜì"ò .*Ym†Œ ¥±ÁÇäù 3BJ R`"s–›¢ ©´Ìãé'ï  < O )T '~ +¦ Ò (î  7 O c y   %¬ Ò í ò ù   ! $ ( : J  Z h m v  “  ™ §  Æ ç ê )î F %_ A… DÇ      !' !I k ˆ  ‹  ˜  £ &± Ø ð 4M]4r§ ¶5Á÷&9I[2n¡§ ¬ ¸ÂÇÎÒ Ö ã3î ""C!fˆ$§ÌÔ'Ü #!2E x‚ 3ª0Þ !AX[r6ˆ$¿ä5ü 2S(qš.ºé òü!=E Va e.ož¦¯³ÎÞó  #09N Wb%q—¬° ´ÂÇ Ë×àä èõ    (2;WjŠ¢©ÄTe%ƒ© ¸Ä Úû $- ?Je€“ ¤ ¯¼Ñ æð(FF³•I!\~–³Íçíõ -%SW u‚˜G±ù*)<f{’—ž ½ Ê ×ãó &28=RV\bh„ ‹•²©\k…¢!º'Ü,;(Mv … š¢¸ÊÞ ø   + @ Q q Š ¦   ß  ë ù !2!IF!!¯!Æ!Þ!î! "?,"!l"#Ž"²"+Ë"!÷"#+# :#G#,W#&„#%«#Ñ# Ù#7å#$)<$f$w$†$–$$¥$#Ê$î$"%:1% l%w%%¡% §%µ%È%-Þ% &*&E&c&w&!Š&¬&'½&å&&÷&'.'5'L'c'y'ˆ' œ'ª'»'/Ä',ô',!(,N({(!Š(.¬(%Û(H)J)Z)k)p)x))—)§)¾)Õ)Ø)Þ)ñ)(*7*F*K*e*l*Š* œ* ©* ´*J¿* + $+/+?+F+J+Q+ X+ d+n+u+ +›+¡+¨+ Á+)Í+ ÷+, ,(,)?,i, },2‡,º,vÃ,:-/O-/-#¯-AÓ->.;T.7.È.Í. Ò. Ü. ê.ø.ÿ. //# /D/ S/ _/ k/w/$Š/¯/¸/Ê/Ü/ô/ù/ 00 70X0`0 g0 r0~0 0«0*´0 ß0í011/1D1-V1 „11 ¦14°1å1û12'2=2S2i2 q2}2-—2Å2Ê2 Í2 ×2â2ë2 3 3373>3M3h3…3›3 ·3 Ø3â3 ý3 4"444)K4u44 ¥4 ¯4»4)Ò4ü45252Q5„55©5&Æ5í566$6 :6E6 ]6 i6;t6 °6¾6Ò6Ø6>ë6*7#97]7 }7"ˆ7«7´7Ì7ã7ó78808G8c83f8š8 8©8Å8Ø8ó89$9*:9e9…9%Ž9´9)½9 ç9ó9:+:D:U:j:0|:­:Æ:Ë: Ó:Þ:û:ÿ:<;7W; ;›;²;µ;¸;»;%Ù;ÿ;<!<($<!M<o<t</„<´<¼<Ì<?Ó<=3=J=^=Gq=¹=À=Ô=Ú=à=ç=ø= >>:>P>`>h>p>>¬>2Á>ô>?q3mmEb î¡™yË`Š” V¿¦©ª« ¶âú'¦ 2^‰)³§NP.;G›ÓxÑû"I¢äSá$²€ò††¸éy!nÒÂQß1ƒìÞõ8ôQ®âñ´ƒˆÙv‚Ä—W=’á5M-šß“ ,¾¬k²È…Õ-(\½d7ÙÆÆPj^­j¼&-b«Óg!Lãä…ì{€ý"z]¯ÓT8œ4µlM ˆ c¢V–0ŒRÎÂi·¯V2Ip‡åD YI|p,Ö¾ü7}3 C®d[^¼twUåžnx„¢Kü8Ý$²¡Ü»st:P Z¨]65™í”Ó+,•iuZ¹Cvæ°˜*ªÿ®mô׿YÚèî¦aL/èÑü1yv•é¤ÞXJ¶%ÍÔ =OU_Gc½;Üæõš<ŽlªÕ"Tüe`sÁÁ· !†)ÀJeŽê¼iœ4°cß]̵TØ-±h#ì}®_ORÖ ¤öqñð+ôø$¬T¡éÊ%r Þ¥f§afqÛQ%fdZ‰ xÎ'QA/¤-g§\A$›DM¿ŠáŠ/ .\YÄn8t&¦:ŒÜ‹­ó í¸RLÀZ»YB±û© º4ÔÃB°ŠgŽ¿Eâëi°Ð?à‡þ*.‹„drÁù²Ç0°BÔ‘‘©öR`ä·±qW{~XªfÅ6¼•'·¶šÅæ‹e6¨ôLKª¥xÛ7× u´\0WŸz)ƒâg¾9¿/¢šÐŽ>yv>Õ_&›]«&ý‡‰‡2.àu¥¹à׌´ÂNœ†òXl§Æo”–(´Ý ?5ž ]mc¸h@XÌrœìEº*h=É‘j¸!—J¶¶·‚€§Uv脞꘸¡BõeÕ ­Wxþ2‹=­+ˤ‚>ë^U6ça~Aÿã…r¯kÒÊ`M|Ý|”Às~D±²aoõ–l%U¾C ÎÀœ¯øVoöø÷þµV&‚£„£(¬ ,¬ÿ½áHˆøñÈŽ{{ÁÚk+Œºç?ØÂ«æ³M;K©þB<ÒžÊRå" ‘À}™îú ÙŠ“KÚýä…ÊGïCépuĹ•<Œ9e’Kë¡@J–º#ðÔ*»[—¥(Á1AÐoǹ5ÖÏç@.2³£|Xj»×w(Ÿ@Ír”o:b¨¬Ï<Ü?n˜„Ƴ¤ÃÚI#/ G¹‚C[’ý½ó‹8uŸ5HåÍcwÝ ›z7Åj>SóZÖÈ—bžpSùS ù;™¾OÙmfFÌ‘ÇFT†$30@+*'ŸNê| `­îƒˆ‰»tãµ Ä"zê{ýEOÑØN)ËQ—ƒ…)ÇÒ÷㢘3:®Ð0ù“ðhÉÑ[Sgs±qíF™k,’ò?£íÛÈ>ú%¼k^÷Ϙ÷óÍò àú‡D9PñÞP’~J–l¨‰G©¯ß4 IÛ£É=H¿#ö1W;wn[ÎaÏ“YÅ•ë€ðsOFzŸµwAïû4h¨~97¥it!6«ïHèFÿ“Û3p}\Ë1³ïº:d€LÌHby_´ çˆN<}' É_Ø#šEÂ9ûD in # R# Records in logbook# S# of multiple scans / character line# retries before giving up# times to resend command before giving up%s log started on %s&About&Configure&Contest fields&File&Help&Logbook&MFSK Image&OK&UI&View&Weather Fax Image RX&Weather Fax Image TX... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ...0 = T; 9 = N1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types14070.1502x Xmt Width (hidden)500 Hz limit8-bit extended characters8-bit extended characters (UTF-8): AFC on,off,toggle other call clear log fields clear RX pane clear TX pane contest counter CW identifier decrement counter [Wait][Len](ms) log eQSL optional msg insert text file valid xcvr filter width my frequency text to NAME/QTH move to freq NNNN Hz return to sweet spot send mode ID in video text idle signal for NN.nn sec LDT in iso-8601 format increment counter S/N etc. IMD etc. ZDT in iso-8601 format local date YYYY-MM-DD Local datetime log at xmt time other locator LOCK on,off,toggle save QSO data local time HHMM change macro defs file map by value map on google mode my call my locator my name my QTH my RST other name CW QSK post-timing CW QSK pre-timing QSO time (HHMM)) qsy to kHz, Hz right-clk QSY button left-clk QSY button other QTH repeat macro continuously Rev on,off,toggle valid xcvr mode CW rise time other RST receive Rx RSID on,off,toggle save contest out search DOWN for signal search UP for signal Digitalk On, Off, Toggle video text repeat every NN sec tune signal for NN sec toggle T/R transmit Tx RSID on,off,toggle Fldigi version delay xmt for NN sec get weather data for station get weather data exchange begin exchange end exchange in exchange out zulu date YYYY-MM-DD Z UTC datetime zulu time HHMMZAFCAFC behaviorAFC range (Hz)AFC range or BWAFC speedAFC tracking speedALTRARQ controlAbortAbortedAcquisition S/N (dB)Acquisition search range (Hz)ActionAddAdd CRLF after page width charactersAdd current frequencyAdd geopolitical name of METAR stationAdd mixer controls to main dialogAddress:Adjust cursor frequencyAdjust the DSP bandwidthAdvanced configuration:AllAllow manual tuningAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAntenna:Appearance of label on each channelAppend to RX text:Append to TX text:ApplyAudioAudio device infoAudio device information is only available for the PortAudio backendAudio devicesAudio fileAudio frequencyAudio input deviceAudio or RF frequencies on waterfall scaleAudio output deviceAudio stream history decoded on selected signalAuto connect when fldigi opens (server must be up)Auto-fill Country and AzimuthAutoCRLFAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAvailable substringsAzimuthBackgndBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3Background color of signal viewer squelch controlBandBands must matchBandwidthBarometric pressureBaud rateBaud rate:Beginners' GuideBehavior of s/n imdBg ColorBits per characterBrowseBrowserBug me about saving log entriesBuild infoButtonButtonsC&ountriesCAT command for PTTCONTCPUCPU usage increases with waterfall heightCQ zoneCQZCR-CR-LFCSV...CTRLCWCW ID modesCW Postamble IDCW QSK signal on right channelCW dsp filter bandwidthCW is LSBCW transmit WPMCWI detection and suppressionCWI thresholdCabrillo SetupCabrillo...CallCall LookupCall SearchCall sign workedCallook.info lookup (free service US callsigns only)CallsignCallsign databaseCallsign:Can be used in lieu of or in addition to other PTT typesCan. ProvinceCancelCaptureCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture signals within this frequency rangeCapture:Carrier frequency (Hz)Carrier shiftCelsiusCenter display on signalCenter in passband Right click to undoCenter lineChange # of psk viewer channelsChange ONLY to experimentChange application look and feelChange colorChange log levelChange positions of low to high channelsChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel labelChannel numberChannels, first channel starts at waterfall lower limitChars/Row:Check AllCheck for duplicatesCheck for updatesCheck for updates when starting programCheck for updates...Check this to be notified when an RSID is received without changing modem and frequencyChecking for updates...CityCity of station workedClearClear AllClear channel text after # seconds of inactivityClear listClear list?Clear log controls sets RST in to 599Clear log controls sets RST out to 599Clear log entries after saving or using macro Clear log fields?Clear on saveClient/Server LogbookCloseClose ListColorColors && FontsColors and cursorsCommand line optionsCommands are echoedCompress Rx in timeConditionsConfirmConfirm RESETConnect to serverConnect/disconnect to Talker socket serverContestContest exchange inContest exchange receivedContest exchange sentContest serial # receivedContest:ContinentContinuous scrollingControl chars in Rx/Tx paneControlsConvert callsign to upper caseConverterCopyCopy URLCorrectionsCould not check for updates: %sCould not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCountyCreate 1000 Hz square wave on right channelCreate New Logbook?Create cabrillo reportCreate sunspotsCustom shiftCustom text searchCustom...CutDTMFDTR +12DTR +12 vDTR = +VDTR is PTT signal lineDTR is ptt lineDXCCDXCC designatorDXCC entitiesDXCC entityDash to dot ratioData base lookupDateDate OffDate OnDate QSO EndedDate QSO startedDate time ON == OFFDebugDecode DTMF tonesDefaultDefault 800 Hz. Deutsche Wetterdienst 850HzDefault CW tracking pointDefault RST in to 599Default RST out to 599Default RTTY tracking pointDefault WPMDefault for all other modemsDefault listen / transmit frequencyDefault messageDefault test string is: "Default to cross hair digiscopeDefaultsDelay NN msec before releasing PTTDelay NN msec before starting audioDeleteDelete from listDelete the current recordDeselectDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapDetected signal levelDevice:DevicesDialDifference between Rx & Tx freq (rig offset)Digit ColorDigitsDimDirectory...Disable allDisable further detection when RSID is receivedDisable on very slow CPUs of if signal browser is not usedDisplayDisplay RX in reverse videoDisplay macro filename on startupDisplay tx and rx in main fldigi window. Change requires restart of fldigiDo not use callsign databaseDo not use callsign lookup via web browserDocked scopeDomDon't saveDot to dot-space ratioDouble-click to captureDragging on the waterfall scale changes frequencyDup ColorDuplicate check, CALL plusDuplicatesEdge decreases pulse widthEdge shapeEdge timingEmbedded Wefax GuiEmpty ADIF logbook file %sEnableEnable / disable icons on menusEnable / disable tooltipsEnable DSP prior to decoderEnable MultiPSK-compatible FECEnable allEnable check box to show each respective operator controlEnable drag cursor on waterfall scaleEnable for very weak signalsEnable if you cannot use the middle mouse buttonEnable if you're computer does not decode properlyEnable rx text streamEnable this for Latin-1 accented charactersEnable this for UTF-8 character transmissionEnable this for UTF-8 charactersEnable to select date rangeEnabledEnter Port # assigned to serverEnter URL address of serverEnter Xcvr FreqEnter a CALL !Enter frequency or change with Left/Right/Up/Down/Pg_Up/Pg_DownEnter full path-filename for cty.datEnter full path-filename for flmsgEnter test string or leave blank for default:Enter time span in minutesErrorEventEvent logExExchange InExchange OutExchangesExecutable file to insertExitExit promptsExit prompts active only when File/Exit menu item selected. Not active if window decoration close button pressed.ExperimentalExport SetupExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...Extract files for use with external "wrap / flmsg" programF-WPMFECFFT ProcessingFFT averagingFFT filterFFT prefilter window functionFLMSG files...F_keysFahrenheitFast (2 msec)Fax images destination directoryFile I/O onlyFill in Country / Azimuth using cty.dat informationFilterFilter bandwidthFilter bandwidth factorFilter bandwidth relative to signal widthFilteringFind country:Find nextFind prefix:Find previousFind: Fixed IntervalsFldigi config...Fldigi configurationFldigi macro definition file *.{mdf}Fldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFoldersFontFont colorFont...Font:Force RST in/out to 599Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFForce output audio to single channelFree Lossless Audio Codec *.flacFree service courtesy of OKFreqFreq.FrequencyFrequency in MHzFrequency scaleFrequency shift (800 Hz)FullFull reportGeneralGenerate 1000 Hz square wave signal on right channelGenerate square wave signal on right channelGroup 1Group 2Group 3Halve receive widthHamCall online via default Internet BrowserHamQTH via default Internet BrowserHamQTH.com (free service http://www.hamqth.com)Hamcall.netHamlibHamlib used for rig controlHardware PTTHide Transmission windowHide transmission window by default.Hide window after (s):HighHigh frequency limit in HzHost:IDIDsIOTAITU zoneITUZIgnore duplicatesInInactivity timeoutInches Mg.Include the transmit frequencyInclusive stop date for exportInfoInitial state of DTRInitial state of RTSInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize XML-RPC rig controlInitialize hamlib interfaceInitialize the H/W PTT interfaceInitialize the QSO logging fieldsInitialize the socket clientInput carrier shiftInsert RX text marker before changing frequency and modemInsert default textInsert file...Insert full METAR reportInsert leading zeros into Xmtd serial numberInsert markerInsert special text in Rx panel when waterfall clickedInsert textInsert text on single left clickIntegration period (FEC blocks)Islands on the airK3 A1A configuationLOCLabel textLast QSOLeading and Trailing edge risetimes (msec)Leave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft Click - execute Fkey - execute Right Click - editLeft Click - execute Shift-Fkey - execute Right Click - editLeft and right channels both contain modem audioLeft click - select Right click - clear lineLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLeft or right click always replays audio historyLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Lighted button enabled colorsLimit AFC movement to this rangeLimit to a few characters, as in CQEM or IOTA etc.Line InListen for signals within this rangeLkLoadLoad a new paletteLoad image fileLoad last used macro file on startupLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocLocate cty.dat fileLocate flmsgLocate flmsg executableLocatorLocator:Lock transmit frequencyLog Navtex messages to Adif fileLog RTTY frequencyLog Wefax messages to Adif fileLog all RX/TX textLog sourcesLogbookLoggingLogging Panel ControlsLong receive integrationLook up callLotW userLowLow frequency limit in HzLowerLower limitLowest freq on bottom of viewerMETAR station ID codeMETAR station locationMT-63Macro Button LabelMacro TextMacro editor - MacrosMaidenhead locator as in EM64qvMail Server AttributesManage mixerMatched FilterMatched Filter bandwidthMerge ADIF fileMerge...Mic InMiles / HourMinimal controlsMinimum time between eventsMiscMixerModeMode in useMode must matchMode width limitModemModem carrierModem signal on left and right channelsModemsMonitor transmitted signalMono audio outputMouseMouse wheel active on macro buttonsMsec post-keydown (+ is earlier in time)Msec pre-keydown (+ is earlier in time)Msec's between retriesMsec's between sequential commandsMulti-Channel Signal ProcessingMulti-channel detectorMy callsign de CALLMy transmit CW WPMNBEMSNBEMS data file interfaceNBEMS files...NO AUDIO DEVICE AVAILABLE (or testing)NO CALLSIGN SETNameName:NavtexNewNew record / Save recordNmNoNo faster than thisNo rig specifiedNo slower than thisNoise onNoneNormalNot worked beforeNotchNotesNotificationsNumber and position of macro barsNumber of digits in serial numberOKONON - Marquee style OFF - Clear & restartON - search over entire waterfall OFF - limit search to +/- 200 HzON - small font OFF - large fontON - start at default OFF - keep current wf cursor positionON - use last set of macros OFF - use default setOSSOffOliviaOnOn/OffOne bar (above waterfall)One bar (below waterfall)Online documentation...OpOp &ModeOpen ...Open ListOpen file with default browserOpen in browserOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen paletteOpen rig xml fileOpen squelch for nn sec if RSID detectedOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperatorOperator informationOperator nameOperator workedOperators QTHOperators callsignOperators nameOptional configuration in format: param=val ...OptionsOtherOther callOther nameOutOverPCMPSKPSK ReporterPSK et al.PTT delays valid for all CAT/PTT typesPTT end of transmit delayPTT is a CAT command (not hardware)PTT is a hamlib commandPTT tone on right audio channel PTT via Hamlib commandPalette: ParityParse all incoming textPasswordPastePaths (hidden)Pick baud rate from listPlay back history when active channel selectedPlaybackPlayback devicePlayback:Please set your callsign first.Popup info after a 2 second hover on a callsignPort:PortAudioPost write delay (ms)Post-keydown timing (ms)PrPre-Signal TonePre-keydown timing (ms)Press return to continue the searchPress to updatePrimary macro setPrint CW / RTTY / THROB / CONTESTIA in lowercasePrompt to save ConfigurationPrompt to save logPrompt to save log on exitPrompt to save macro filePrompt to save macro file when closingProsignsProvinceProvince of station workedPseudo-FSK on right audio channelPskmailPulse shapePulseAudioQRZQRZ cdromQRZ online via default Internet BrowserQRZ.comQRZ/eQSLQSKQSK on right audio channelQSL rcvd dateQSL received on this dateQSL sent dateQSL sent on this dateQSL-rcvdQSL-sentQSO DateQSO Date OffQSO Date OnQSO end timeQSO loggingQSO must not occur within a time period ofQSO start timeQSYQTHQTH NicknameQTH:QthQuick entryQuietRE:RPCRSID receptionRST always 599RST rcvdRST sentRST(r)RTS +12RTS +12 vRTS = +VRTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTYRX captureRX ppmRX sound card correctionRX text QSO data entry is bounded by the non-word characters defined here. Tab and newline are automatically included.Radio frequencyRaised cosine = HanningRaised cosine pulse shape factorRange +/- wpmRange, WPMReading fonts...Really delete record for "%s"?ReceiveReceive filter bandwidthReceive modesReceive synchronizerReceived RSTReceived serial numberRecent activity for gridReception reports...ReconnectRecsRectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)ReloadReload cty.datRemoveReplay trackline audioReport ARQ frames average S/NReport rig frequency (enable only if you have rig control!)ResetReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Reset to CarrierRestore cty.dat default folderRestore defaultsRetriesRetrieve for active modem useRetry Interval (ms)Retry interval (ms)RevReverseReverse Left/Right channelsReverse videoRevertRevert to Unsifted char's on a spaceRigRig Control using xml spec fileRig controlRig control and contestRig control and loggingRig control via external program using xmlrpc remote calls.Rig description file:Rig modeRig or interface echos serial dataRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig:RigCATRigCAT used for rig controlRight channelRst receivedRst sentRun programRun program:Rx Text CaptureRx bkgndRx fontRx/TxRxIDS/N and IMD behaviorSELSKIPSQL-1SQL-2Sample rateSaveSave ...Save ConfigSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed configuration?Save changed macros?Save current log entry?Save image as monochrome fileSave logbook fileSave macro fileSave paletteSave text asSave the fax image as a gray-level PNG file.Save this paletteSave...ScopeScrollScroll hintsSearch for this callsignSearch on webSearch range (Hz)Secondary TextSecondsSelectSelect # bits / charSelect # stop bitsSelect AllSelect Cabrillo Contest & FieldsSelect Fields to ExportSelect Mixer deviceSelect Records to ExportSelect TX raster fontSelect TagSelect bandwidthSelect carrier baudrateSelect carrier shiftSelect deviceSelect how the mouse wheel behaves inside the waterfallSelect modes for menu accessSelect number of tonesSelect operating parametersSelect paritySelect rig descriptor fileSelect the type of FFT prefilterSelect this for Elecraft K3 Other radios should not need it.Select waterfall scale fontSelection background color in Rx Tx panelsSend CW cut numbersSend Callsign in CW at end of every transmissionSend a continuous stream of test charactersSend at this WPMSend continuouslySend imageSend image...Send reception report when logging a QSOSend report only when QSO is loggedSend rx text to file: textout.txtSend:Sent RSTSent and received faxes are logged to Adif file.Sent chars in Rx/Tx paneSent serial number (read only)Serial # inSerial # outSerial numberServer string:Set Viewer SquelchSet level for good viewingSet the number of characters per rowSet the sound card PCM levelSet the type of resampler used of offset correctionSettingsShift-key macro setShort description of antennaShowShow DXCC entitiesShow alert window:Show all modesShow bandwidth tracks on waterfallShow channelsShow cursor with bandwidth linesShow cursor with center lineShow fewer modesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallSideband:SigLvlSignal BrowserSignal Level ColorsSignal browserSignal levelSignal range (dB)Signal searchSignal tracksSize:Skipped chars in Tx pane (Tx on/off in CW)Slew display higher in frequencySlew display lower in frequencySlider hilite color of signal viewer squelch controlSlow (4 msec)Slow CPU (less than 700MHz)Software reversal of left-right audio channelsSort by Date/Time OFFSort by date/time OFF - effects all ADIF/Cabrillo reportsSound CardSpeed (WPM):SpotSpotterSpottingSpotting disabledSquelchSquelch levelSquelch open (sec)StStartStart DateStart date for exportStart of transmit PTT delayStarting numberStateState must matchStationStation heard twiceStations grid squareStop DateStop bitsStopbitsStore mode and frequency Right click for listSunspot creation underway!Sweet SpotSys ColorsSystemT/RTX PowerTX WPMTX generateTX offsetTX ppmTX sound card correctionTab ColorTabsTalkerTalker Socket (MS only)TemperatureTest Signal - Do NOT use with transmitterTest charTest character for QSK adjustmentTest...Text CaptureText Tags (tags use {} delimiters)Text file to insertText i/oText to send during keyboard idle timesText...That crazy fox jumped over the dog again! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~The default CW speedThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The string is replaced with the current modem and frequencyThe test string did not match this event's search pattern.These tags can also be used in This event's regular expression is invalid.ThorTimeTime (s):Time OFFTime ONTime OffTime OnTime QSO endedTime QSO startedTime between retires in msecTime needed: Time span overTimed outTimingTiming and QSKTo whom the connection is madeToggleToggle DTR for PTTToggle RTS for PTTTone Duration (secs)TonesTracked CW speed in WPMTrackingTransceiver controlTransfer speed, X1-normalTransmitTransmit PowerTransmit callsignTransmit fontTransmit lower start toneTransmit mode IDTransmit modesTransmit periods (.) when idleTransmit power usedTransmit signalTransmit upper start toneTransmit video textTransmit widthTransmit/ReceiveTransmits a diddle dot when no keyboard activityTriangularTrigger limit (s):TuneTune margin (tone frequency spacing)Two bars (scheme 1)Two bars (scheme 2)Two bars (scheme 3)Two bars (scheme 4)Two bars (scheme 5)Two bars (scheme 6)Tx bkgndTx fontTx level attenuator (dB)Tx power used for logbook entriesTxIDUIUI languageUI schemeUS StateUS state of station workedUndoUpdateUpdate the current recordUpperUpper limitUpper signal level (dB)Use "cr cr lf" for "cr lf"Use '(' paren not KNUse CD or hard drive CD imageUse DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse Line-In deviceUse MARK freq'Use OSS audio serverUse Open to select descriptor fileUse Port Audio serverUse Pulse Audio serverUse RTSUse RigCATUse XML-RPC programUse averaging to decrease waterfall noiseUse colored buttonsUse cross hair scopeUse date/time off for log entryUse for triggering amplifier carrier detectUse leading zerosUse microphone inputUse parallel port PTTUse separate serial port PTTUse small fontUse uHRouter PTTUser IDUser InterfaceUser nameUsing UDP port #VSP EnableVerboseVersion %s is available at %s What would you like to do?Video ID modesVideo Preamble IDViewView/Hide ChannelsVirtual Serial Port Emulator - suppress WARNINGSVisible modesVisit Hamcall web siteVisit QRZ web siteVisit URLVisit hamQTH web siteWF CtrlsWF MagnificationWF Shift ControlsWF StoreWF amp spanWF carrierWF drop rateWF modeWF ref levelWXWait interval (msecs) before reading responseWarningWaterfallWaterfall / FFT / ScopeWaterfall controlsWaterfall drop speedWaterfall height in pixelsWaterfall video IDWaterfall video textWaveform Audio Format *.wav AU *.{au,snd} Weather query specificationWebWeb Browser lookupWeight (%)Weight decreases with increasing edge timingWheel actionWhen no signal presentWideWill occur after this time in secondsWind speed/dirWord delimitersWord wrapWrite current macro set on program exitWrite delay (ms)XMITXML-RPCXMT lockXON/XOFF flow controlYesYou are running the latest versionYou need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour login nameYour login passwordaaafterat:automatic data uploadcallsign tooltips in received textcty.dat pathnamecurrent wx conditionsdBdefault text to send with etcdefault uses date/time oneQSLeQSL userenable mouse wheel control of macro barflmsg *flmsg.exe *.exeflmsg:for example KMDQ for Huntsville-Madison Executive Airport, ALfree form 1 must matchfree form exchangefrequency kHzh/w ptt device-pinie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for databasein:kilometers / hourmbarsminutesreportreport Celsiusreport Fahrenheitreport inches mercuryreport kilometers per hourreport miles per hourreport millibarsreportssecondsseek - regular expressionselect browser fontselect by datesend when logged (log button, , )waterfall-only mode{NAME} other ops nameProject-Id-Version: fldigi 3.22.0 ALPHA series Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com POT-Creation-Date: 2014-03-22 11:18-0500 PO-Revision-Date: 2012-06-15 20:34+0100 Last-Translator: Roman BagiÅ„ski Language-Team: Polish (Roman BagiÅ„ski) Language: Polish MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Polish X-Poedit-Country: POLAND X-Poedit-SourceCharset: iso-8859-1 w# R# Zapisy w dzienniku# S# wiele skanów / linia znaków# prób przed zrezygnowaniem# razy, aby ponownie wysÅ‚ac komendÄ™ przed rezygnacja%s log rozpoczÄ™to %sO progr.KonfigurujPola konkursowePlikPomocDziennikObraz &MFSK&OK&UIWidokFaks pogody obraz RXFaks pogody obraz TX... Te kontrole sÄ… na innych kartach. One sÄ… replikowane tutaj dla wygody. Mozesz zmienic stan z kazdej lokalizacji. ...0 = T; 9 = N1000 Hz ton, kiedy PTT wlaczony Moze być uzywana zamiast lub w uzupeÅ‚nieniu do innych typów PTT14070.1502x Xmt Szeroki (ukryty)Limit 500 Hz8-bitowe znaki rozszerzone8-bitowe znaki rozszerzone (UTF-8): AFC wl,wyl,przelacz inna stacja czysc pola logu resetuj panel RX resetuj panel TX licznik zawodów identyfikator CW Licznik dekrementacji [Czekaj][Len](ms) log opcionalny eQSL.cc wstaw plik tekstowy wazna szerokosc filtru xcvr moja czestotliwosc tekst do IMIE/QTH przenies do czest NNNN Hz powroc do sweet spot wyslij ID trybu w tekscie wideo bezczynny sygnaÅ‚ dla NN.nn sek LDT format iso-8601 zwiÄ™kszamy licznik S/N itp. IMD itp. ZDT format iso-8601 lokalna data YYYY-MM-DD lokalny czas data loguj czas Xmt inny lokator LOCK wlaczona, wylaczona, przelacz zapisz dane QSO czas lokalny (HHMM) zmien plik definicji makro mapa wedÅ‚ug wartosci mapa google emisja moja stacja mój lokator moje imie moje QTH moje RST inne imie CW QSK post-czas CW QSK pre-czas czas QSO (HHMM) qsy do kHz, Hz Prawo klikiem przycisk QSY Lewym klikiem przycisk QSY inne QTH powtarzaj makro stale Rev wÅ‚, wyÅ‚, przeÅ‚acz obowiÄ…zuje tryb xcvr Czas narastania CW inny RST odbiór Rx RSID wlaczona, wylaczona, przelacz zapisz konkurs wyszukiwanie w DOL sygnalu wyszukiwanie w GÓRE sygnalu Digitalk Wl, Wyl, Przelacz video tekst Cyklicznie co NN sek SygnaÅ‚ strojenia dla NN sek przelacz Tx/Rx nadawanie Tx RSID wlaczona, wylaczona, przelacz wersja Fldigi opóznij Xmt dla NN sek uzyskaj dane pogodowe dla stacji uzyskaj dane o pogodzie rozpocznij wymiane koniec wymiany wymiana odebrana wymiana nadana Data zulu YYYY-MM-DD Z czas data UTC czas zulu HHMMZAFCZachowanie AFCZakres AFC (Hz)Zakres AFC lub BWPrÄ™dkosc AFCPrÄ™dkosc sledzenia AFCALTRKontrola ARQPrzerwijPrzerwanoPozyskiwanie S/N (dB)Zakres poszukiwania (Hz)AkcjaDodajDodaj CRLF po znakach szerokosci stronyDodaj aktualnÄ… czÄ™stotliwoscDodaj geopolityczna nazwÄ™ stacji METARDodaj sterowniki miksera do okna dialogowegoAdres:Ustaw kursor czÄ™stotliwosciRegulacja pasma DSP Zaawansowana konfiguracja:WszystkoZezwalaj na rÄ™czne strojenieAlternatywny kolor znaków w panelu Rx Zawsze LSBZawsze USBZawsze pokazuj czÄ™stotliwosc audioZawsze startuj nowe modemy na tych czestotliwosciachAntena:WyglÄ…d etykiety na kazdym kanaleDolacz do tekstu RX:Dołącz do tekstu TX:ZastosujAudioInformacje o urzÄ…dzeniach audioDzwiÄ™k informacje: UrzÄ…dzenie jest dostÄ™pne tylko jako dodatkowa usÅ‚uga PortAudioUrzÄ…dzenia audioPlik audioCzestotliwosc audioUrzÄ…dzenie wejsciowe audioAudio lub RF czÄ™stotliwosc na skali wodospaduUrzÄ…dzenie wyjsciowe audioHistoria strumienia audio zdekodowanego na wybranym sygnaleAktywuj podczas startu fldigi (serwer musi byc uruchomiony )Automatycznie wstaw Kraj i AzymutAutoCRLFAutomatyczna regulacja czÄ™stotliwosciAutomatyczna prÄ™dkosc sledzenia RxAutomatyczne spoty stacji w zdekodowanym tekscieDostÄ™pne podrzÄ™dneAzymutTloKolor tla dla klawiszy funkcyjnych grupy 1Kolor tla dla klawiszy funkcyjnych grupy 2Kolor tla dla klawiszy funkcyjnych grupy 3Kolor tla podglÄ…du blokady szumówPasmoPasma muszÄ… byc zgodnePrzepustowoscCisnienie barometryczneSzybkosc transmisjiSzybkosc transmisji:Przewodnik dla poczÄ…tkujÄ…cychZachowanie s/n imdKolor tlaBitów na znakPrzeglÄ…dajPrzeglÄ…darkaInfo o bledach wpisu dziennikaBuild informacjePrzyciskPrzyciskikrajeKomenda CAT dla PTTKontynentCPUUzycie CPU wzrasta z wysokoscia wodospaduStrefa CQCQZCR-CR-LFCSV...CTRLCWTryby CW IDCW ustawienia IDCW QSK sygnaÅ‚ na prawym kanalePrzepustowosc filtru dsp przy CWCW jest LSBCW nadawane WPMWykrywanie i tÅ‚umienie CWIPróg CWI Ustawienia CabrilloCabrillo...StacjaWyszukaj StacjeSzukaj StacjiStacja pracowaÅ‚aCallook.info wyszukiwanie ( bezplatna usluga tylko dla stacji US )Znak stacjiBaza danych StacjiZnak stacji:Moga byc stosowane zamiast lub w uzupeÅ‚nieniu na inne rodzaje PTTProwincja Kan.AnulujNadawaniePrzechwytywanie i odtwarzanie urzÄ…dzenPrzechwyc urzÄ…dzeniePrzechwytuj tekst rx do zewnÄ™trznego plikuPrzechwytywanie sygnalu ponad ten prógPrzechwytywanie sygnalów w tym zakresie czÄ™stotliwosciNadawanie:CzÄ™stotliwosc nosna (Hz)PrzesuniÄ™cie nosnejCelsjuszWyswietlacz centruj na sygnaleCentruj w pasmo przenoszenia Kliknij prawym przyciskiem myszy, aby cofnacCentruj linieZmiana # podglÄ…du kanalów PSKZmiana ta obowiÄ…zuje tylko do eksperymentowaniaZmien wyglÄ…d aplikacjiZmien kolorZmiana poziomu LoguZmiana pozycji z niskiego do wysokiego kanaluZmien plik makro Zmiana skali wodospaduZmiany sÄ… uwzglÄ™dniane przy nastÄ™pnym uruchomieniu programuEtykieta kanaluNumer kanaluKanaÅ‚y, pierwszy kanal startuje w dolnej granicy wodospaduZnak/Wiersz:Zaznacz wszystkoSzukaj duplikatówSprawdz uaktualnienieSprawdz aktualizacje podczas uruchamiania programuSprawdz dostÄ™pnosc aktualizacjiSprawdz to, aby otrzymywac powiadomienia RSID bez zmiany modemu i czÄ™stotliwosciSprawdzanie aktualizacji...MiastoStacja pracowaÅ‚a z Miasta CzyscCzysc wszystkoSkasuj tekst kanalu po # sekund bezczynnosciWyczysc listÄ™Zeruj listeWyczysc kontrole dziennika ustaw RST na 599Wyczysc log i ustaw RST na 599Zeruj wpisy po zapisaniu lub za pomocÄ… makra Wyczyscic pola dziennika?Wyczysc przy zapisywaniuKlient/Serwer LogbookZamknijZamknij listeKolorKolory && CzcionkiKolor i kursoryOpcje wiersza polecenPolecenia sÄ… echemKompresja Rx w czasieWarunkiZastosujZastosuj RESETPołącz z serweremPolacz / Rozlacz do gniazda serwera Talker ZawodyWymiana w zawodachZawody wymiana odebranaZawody wymiana wyslanaZawody numer # odebranyZawody:KontynentCiÄ…gle przewijanieZnaki kontrolne w panelu Rx/Tx KontrolaKonwertuj znak stacji na wielkie literyKonwerterKopiujKopiuj URLKorektaNie mozna sprawdzic dostÄ™pnosci aktualizacji: %sNie można otworzyc url: %s Nie można uruchomic przeglÄ…darki internetowej: %s Otwórz ten adres rÄ™cznie: %sNie mozna uruchomic flmsgkrajStacja pracowaÅ‚a z KrajuProwincjaUtwórz 1000 Hz audio prostokÄ…tne w prawym kanaleUtworzyc nowy Logbook?Tworzenie raportu Cabrillo Utwórz sunspotaWybranej przesuniÄ™cie Wyszukiwanie niestandardowe tekstuWybrane...WytnijDTMFDTR +12DTR +12 vDTR = +VDTR jest sygnaÅ‚em linii PTTDTR jest linia PTTDXCCIdentyfikator DXCCPodmioty DXCCPodmiot DXCCStosunek Kreski do kropkiWyszukiwanie baza danychDataData zakonczeniaDataData zakonczenia QSOData rozpoczecia QSOData czas start == koniecDebugDekoduj sygnaÅ‚y DTMFDomyslnieDomyÅ›lnie 800 Hz. Deutsche Wetterdienst 850HzDomyslnie sledzenie punktu CWRST domyslny to 599Domyslnie RST na 599Domyslnie sledzenie punktu RTTYDomyslny WPMDomyslnie dla wszystkich innych modemówDomyslnie sÅ‚uchaj / transmisja czÄ™stotliwosciKomunikat domyslnyCiÄ…g testu domyslnie jest: "Domyslnie do przekroczenia digiscopeDomyslnyOpóznienie NN msek przed zwolnieniem PTTOpóznienie NN msek przed rozpoczÄ™ciem audioKasujKasuj z listyKasuj aktualny rekordOdznaczWykryj wystÄ™powanie[WRAP:beg] i [WRAP:end] Zapisz tagi i wszystko zalaczonego tekstu do daty czasu stemplowania pliku, ie: NBEMS.pliki\WRAP\odebr\wypakuj-20090127-092515.wrapWykryj wystÄ™powanie [WRAP:beg] i [WRAP:end] Zapisz tagi i wszystko załączonego tekstu do daty czasu stemplowania pliku, ie: ~/.nbems/WRAP/odebr/wypakuj-20090127-092515.wrapWykryty poziom sygnaluUrzÄ…dzenie:UrzÄ…dzenieTarczaRóznica miÄ™dzy czest. Rx & Tx (rig wyrówna)Kolor cyfrCyfryTlumikKatalog...DeaktywujWylacz wykrywanie RSIDWylacz na bardzo wolnym CPU gdy sygnaÅ‚ przeglÄ…darki nie jest uzywanyWyswietlWyswietl RX w odwrotnym wideoWyswietl nazwÄ™ makra przy starcieWyÅ›wietl TX i RX w oknie głównym fldigi. Zmiana wymaga restartu fldigiNie nalezy uzywac bazy znakówNie uzywaj wyszukiwania znaku przez przeglÄ…darkÄ™ internetowÄ…Zadokuj oscyloskopDomEXNie zapisujStosunek kropki do kropkiKliknij dwukrotnie, aby uchwycicPrzeciÄ…gnij wodospad na skali czÄ™stotliwosciKolor duplikatuSprawdzaj duplikaty, Stacja plusDuplikatyKrawÄ™dz zmniejsza szerokosc impulsuKsztaÅ‚t krawÄ™dziCzas krawÄ™dziWbudowany Wefax GuiPusty plik ADIF dziennika %sWlaczAktywuj / deaktywuj ikony w menuAktywuj / deaktywuj podpowiedziWlacz DSP przed dekoderemAktywuj MultiPSK zgodny z FECAktywujWlacz pole wyboru, by pokazac kazda poszczególna kontrolÄ™ operatoraAktywuj przeciÄ…gniÄ™cie kursora na skalÄ™ wodospaduWlacz dla bardzo slabych sygnałówWlacz gdy nie mozesz uzyc srodkowego przycisku myszyUstaw gdy komputer nie dekoduje poprawnieAktywuj strumien tekstowy rxUstaw to dla Latin-1 znaków diakrytycznychAktywuj to dla UTF-8 transmisji znakówAktywuj to do znaków UTF-8Wlacz, aby wybrac zakres datAktywneWpisz Port # przypisany do serweraWpisz adres URL serweraWpisz xcvr Czest.Wpisz StacjÄ™ !Wprowadz czÄ™stotliwosc lub zmien z listy.Wpisz peÅ‚nÄ… sciezkÄ™, nazwa pliku cty.datWpisz peÅ‚na sciezke, nazwe pliku flmsgWpisz ciÄ…g testowy lub zostaw puste - domyslne:Wpisz zakres czasu w minutachBladWydarzenieRejestr zdarzenExWymiana odebranaWymiana wyslanaWymianaWstaw plik wykonywalnyWyjdzZamknij podpowiedzi Wyjscie wyswietlane tylko wtedy, gdy aktywny Plik/Wyjscie z menu wybrano. Nie jest aktywne jesli dekoracja przycisku okna wcisnieta.PróbnyUstawienie EksportuEksportuj do pliku ADIFEksportuj do pliku CSVEksportuj do pliku tekstowego w staÅ‚ym poluEksportuj...Wydobywa pliki do uzycia zewnÄ™trznym programem (wrap/flmsg)F-WPMFECProces FFTUsrednianie FFTFiltr FFTFFT okno funkcji filtru wstÄ™pnegoPliki FLMSG...F_kluczFahrenheitSzybki (2 msek)Faks katalog zdjęćPlik I/O tylkoWypeÅ‚nij Kraj / azymut za pomocÄ… info cty.datFiltrPrzepustowosc filtruWspólczynnik filtra przepustowosciFiltr wzglÄ™dnej szerokosci pasma do sygnalizowania szerokosciFiltracjaZnajdz kraj:Szukaj nastepnySzukaj prefiks:Znajdz poprzedniSzukaj:W odstÄ™pach czasuKonfiguracja Fldigi...KonfiguracjaPlik definicji makro Fldigi *.mdfPaleta Fldigi *.palFldigi rig plik xml definicji *.xmlFldigi na stronie web...OscyloskopFolderyCzcionka:Kolor czcionkiCzcionkaCzcionka:Wymuszaj RST odebr/wysl na 599Wymuszenie okreslonej czÄ™stotliwosci próbkowania Wybierz"Native" jeÅ›lii "Auto" nie dziaÅ‚a z urzÄ…dzeniami audio.Wymuszaj wielkie litery w polu znak stacjiWymus rozstaw kanalu do wzrostu nawet 100 Hz Ustaw data/czas startu == data/czas zakonczeniaWyjscie audio siÅ‚a do jednego kanaÅ‚uDarmowy bezstratny Audio Codec *.flacDarmowe dziÄ™ki uprzejmoÅ›ci obsÅ‚ugi OKCzÄ™stCzestotliwoscCzÄ™stotliwoscCzestotliwosc w MHzSkala czÄ™stotliwosciPrzesuniÄ™cie czÄ™stotliwosci (800 Hz)PeÅ‚nyPeÅ‚ny raportOgólneUtwórz 1000 Hz sygnal prostokÄ…tny na prawym kanaleWygeneruj sygnaÅ‚ prostokÄ…tny na prawym kanaleGrupa 1Grupa 2Grupa 3Zmniejsz o poÅ‚owÄ™ szerokosc odbioruHamCall poprzez przeglÄ…darkÄ™ internetowÄ…HamQTH przez przeglÄ…darke internetowaHamQTH.com ( http://www.hamqth.com)Hamcall.netHamlibHamlib wykorzystany do kontroli rigSprzet PTTUkryj okno transmisjiUkryj okno transmisji domyÅ›lnieUkryj okno po (s):WysokiGórna granica czÄ™stotliwosci w HzHost:IDWyslij IDIOTAStrefa ITUITUZIgnoruj duplikatyOdbrLimit czasu nieaktywnosciInches Mg.Obejmuje czestotliwosc nadawaniaUstaw datÄ™ koncowa do eksportuInfoPoczÄ…tkowy stan DTRPoczÄ…tkowy stan RTSWstÄ™pne napiÄ™cie na DTRWstÄ™pne napiÄ™cie na RTSInicjalizujInicjalizuj interfejs RigCATInicjalizuj rig kontrolÄ™ XML-RPC Inicjalizacja interfejsu hamlib Inicjalizacja H/W interfejsu PTTInicjalizacja pól logowania QSOInicjacja klienta gniazdaWejscie przesuniecia nosnejWstaw znacznik tekstu RX przed zmianÄ… czÄ™stotliwosci i modemuWstaw tekst domyslnyWstaw plik...Wstaw peÅ‚ny raport METARWstaw zero w nadawanym numerze kontrolnymWstaw znacznikWstaw specjalny tekst w panelu Rx po klikniÄ™ciu wodospaduWstaw tekstWstaw tekst pojedynczym lewym klikniÄ™ciemOkres integracji (bloki FEC)WyspaKonfiguracja Elecraft K3Lokatortekst etykietyOstatnie QSOPoczÄ…tkowe i koncowe czasy narastania krawÄ™dzi (msek)Zostawione puste lub odnoszÄ… siÄ™ do http://www.pulseaudio.org/wiki/ServerStringsLewy Klik - wykonanie Fkey - wykonanie Kliknij prawym przyciskiem myszy - edycjaLewym kliknij - wykonaj Shift-Fkey - wykonaj Prawym kliknij - edytujLewy i prawy kanaÅ‚ oba zawieraja audio modemuKliknij lewym przyciskiem myszy - Wybierz Kliknij prawym przyciskiem myszy - zeruj linieKliknij lewym by wyczyscic tekst Kliknij prawym przyciskiem myszy, aby zresetować czÄ™stotliwosciKliknij lewym przyciskiem myszy, aby wybrac kolor duplikatuKliknij lewym przyciskiem myszy: zmiana trybu Kliknij prawym przyciskiem myszy: konfigurujKliknij lewym lub prawym by uzyskac historiÄ™ audioLicencja GPLv3: GNU GPL wersja 3 lub nowsza To jest wolne oprogramowanie: możesz dowolnie modyfikować i rozpowszechniać it. Nie ma ZADNEJ GWARANCJI, w zakresie dozwolonym przez prawo. Aktywne przyciski podswietlane koloremOgranicz ruch AFC do tego zakresuOgranicz do kilku znaków jak w CQEM lub IOTA itpLine InSluchaj sygnalow w tym zakresieBlokuj TxLadujZaÅ‚aduj nowÄ… paletÄ™Zaladuj plik obrazu ZaÅ‚aduj na starcie ostatnio otworzone pliki makro ZaÅ‚aduj lub upusc plik obrazu pliki (PNG, JPEG, BMP)Laduj...LokZlokalizuj plik cty.datSzukaj flmsgZlokalizuj flmsg exeLokatorLokator:Blokowanie czÄ™stotliwosci nadajnikaZaloguj wiadomosci do pliku ADIF NAVTEXLog czÄ™stotliwosci RTTYZaloguj wiadomoÅ›ci Wefax do pliku ADIFLog tekstowy wszystkich RX/TXLog podstawowyLogbookLogowaniePanel kontrolny LoguDlugi odbiór integracjiPoszukaj stacjiUzytkownik LotWNiskiDolna granica czÄ™stotliwosci w HzNizszyDolna granicaNajnizsza czÄ™stotliwosc na dole przeglÄ…darkiMETAR stacja ID kodMETAR stacja lokalizacjaMT-63Etykieta przycisku makroTekst makroEdytor makro - MakraLokator na przykÅ‚ad JO93xqAtrybuty Mail ServerZarzÄ…dzaj mikseremDopasuj FiltrDopasowane filtru pasmaScal plik ADIFScal...Wej MikMil / GodzineMinimum sterowaniaMinimalny czas miÄ™dzy zdarzeniamiInneMikserEmisjaTryb pracyTryby muszÄ… byc zgodneTryb limitu szerokosciModemModemSygnaÅ‚ modemu na lewym i prawym kanaleModemMonitoruj transmitowany sygnalWyjscie audio monoMyszKółko myszy dziaÅ‚a na przyciski makro Msek po keydown ( + wczesniej w czasie)Msek pre-keydown ( jest wczesniej w czasie)Milisekund miÄ™dzy próbamiMilisekund miÄ™dzy kolejnymi poleceniamiWielokanaÅ‚owa obróbka sygnaluWielokanaÅ‚owy detektorMój znak to STACJAMoje nadawanie CW WPMNBEMSNBEMS plik danych interfejsu Pliki NBEMS...BRAK URZÄ„DZEN AUDIO (lub testowania)NIE USTAWIONO ZNAKU STACJIImieImiÄ™:NavtexNowyNowy rekord / Zapisz rekordNmNieNie szybciej niz Nie wybrano rigNie wolniej nizPoziom halasuBrakNormalnyNie pracowal wczesniejNotchUwagiPowiadomieniaLiczba i pozycja pasków makroLiczba cyfr w numerze kontrolnymOKWÅWl - Styl marquee Wyl - Wyczysc & restartWL - przeszukaj caÅ‚y wodospad WYL- Ogranicz wyszukiwanie do+/- 200 HzWL - mala czcionka WYL -duza czcionkaON - rozpoczyna domyslnie OFF - zachowaj aktualna pozycje kursoraON - wykorzystaj ostatni zestaw makr OFF - uzywaj zestawu domyslnegoOSSKonOliviaPoczWl/WylJeden pasek ( powyzej wodospadu )Jeden pasek ( ponizej wodospadu )Dokumentacja via internet...OpTryby emisjiOtwórz...Otwórz listeOtwórz plik w domyslnej przeglÄ…darceOtwórz w przeglÄ…darceOtwórz plik dziennikaOtwórz plik makroOtwórz folder wiadomosciOtworz wiadomosc z flmsgOtwórz paletÄ™Otwórz rig plik xmlOtworz squelch dla nn sek jeÅ›li RSID jest wykrywaneOtworz w flmsgOtwórz...Otwórz folder pliku NBEMS po pomyslnym przechwyceniuOperatorOperator - informacjeImiÄ™ operatoraOperator pracowaÅ‚QTH operatorówOperatorzy stacjiImiona operatorówopcjonalna konfiguracja w formacie: param = val...OpcjeInneInna stacjaInne ImieWyslWyzszyPCMPSKPSK ReporterPSK et al.Opóznienia NIM wazne dla wszystkich typów CAT/PTTOpóznienie PTT konca nadawaniaPTT jest komenda CAT (nie sprzet)PTT jest pakietem komend hamlib Ton PTT na prawym kanale audioPTT za pomocÄ… komend pakietu hamlibPaleta:ParytetAnalizuj wszystkie przychodzÄ…ce tekstyHasloWklejSciezki (ukryta)Wybierz szybkosc transmisji z listyOdtwarzanie historii, kiedy wybrany aktywny kanal OdtwarzajUrzÄ…dzenie do odtwarzaniaOdtwarzanie:ProszÄ™ ustawić swój znak w pierwszej kolejnosci.Informacje Popup po 2 sek po najechaniu na znakPort:PortAudioNapisz Posta z opóznieniem ( ms)Post-keydown czas (ms)PrPre-sygnaÅ‚ dzwiÄ™kowyPre-keydown czas (ms)Nacisnij przycisk return, aby kontynuowac wyszukiwanieNacisnij przycisk, aby zaktualizowacPodstawowy zestaw makroDrukuj CW / RTTY / THROB / CONTESTIA malymi literamiMonituj o zapisanie konfiguracjiMonituj o zapisanie dziennikaMonituj o zapisanie dziennika na wyjsciuMonituj o zapisanie pliku makroMonituj o zapisanie pliku przy zamykaniu makroProsignsProwincjaStacja pracowaÅ‚a z Prowincji Pseudo-FSK na prawym kanale audioPskmailKsztaÅ‚t impulsuPulseAudioQRZQRZ cdromQRZ online poprzez przeglÄ…darkÄ™ internetowÄ…QRZ.comQRZ/eQSLQSKQSK na prawym kanale audioData odebr. QSLQSL otrzymana w dniuData wysl. QSLQSL wysylana w dniuQSL-odebranaQSL-wysÅ‚anaData QSOData zakonczenia QSOData QSOKoniec QSOLogowanie QSO QSO nie moze nastapic w okresie czasuCzas rozpoczecia QSOQSYQTHPseudonim QTHQTH:QthSzybki wpisSpokojnyRE:RPCOdbiór RSIDRST zawsze 599RST odebr.RST wysl.RST(r)RTS +12RTS +12 vRTS = +VRTS jest sygnalem linii PTTRTS jest linia PTTSterowania przepÅ‚ywem RTS/CTS RTTYPrzechwytywanie RXRX ppmKorekcja karty dzwiÄ™k RX RX tekst QSO wprowadzanie danych jest ograniczone przez znaki nie-sÅ‚owa zdefiniowane tutaj. Tabulator i nowa linia sÄ… automatycznie dolaczaneCzestotliwosc RFPodniesiony cosinus = HanningPodniesiony cosinus ksztaltu impulsu Zakres +/- wpmZakres, WPMCzytanie czcionek....Czy na pewno usunac rekord "%s"?OdbiórFiltr odbiorczy szerokosci pasmaTryby RXSynchronizator RxRST odebr.Odebrany numer porzÄ…dkowyOstatnia aktywnosc siatkiRaporty odbioru...Podlacz ponownieLiczba QSOProstokÄ…tnyReed-Solomon ID (Rx)Reed-Solomon ID (Tx)PrzeladujPrzeladuj cty.datKasujOdtwarzanie dźwiÄ™ku tracklineRaport ARQ klatek Å›redni S/NRaportuj czestotliwosc rig ( włącz tylko jeÅ›li masz kontrolÄ™ Rig!)ResetujResetowac wszystkie opcje do ich wartosci domyslnych? Zresetowane opcje zostanÄ… uwzglÄ™dnione przy nastÄ™pnym uruchomieniu Pliki: fldigi_def.xml i fldigi.prefs zostana usuniÄ™te Resetuj to CarrierPrzywróc domyslny folder cty.datPrzywroc domyslnePróbPobierz dla aktywnego modemuInterwaÅ‚ ponawiania (ms)InterwaÅ‚ ponawiania (ms)OdebrOdwrócOdwróc lewy/prawy kanalNegatyw VideoOdwrócPrzywróc przesuniecie znaków na przestrzeniRigKontrola Rig poprzez plik xmlRig kontrolaKontrola Rig i zawodyKontrola Rig i logowanieKontrola Rig przez zewnÄ™trzny program za pomocÄ… xmlrpc zdalnej stacjiPlik opisu RigTryb RigRig lub interfejs Echos danych szeregowychRig wymaga RTS/CTS sterowanie przepÅ‚ywemRig wymaga Xon/ XoffRig korzysta z RTS/CTSRig:RigCATRigCAT uzywany do kontroli rigPrawy kanaÅ‚RST odebraneRST wyslaneUruchom programUruchom program:Przechwytywanie tekstu RxTÅ‚o RxCzcionka RxRx/TxRxIDZachowanie S/N i IMDWYBOPUSCSQL-1SQL-2CzÄ™stotliwosc próbkowaniaZapiszZapisz...Zapisz konfiguracjeZapisz wszystkie otrzymane teksty, jeden znak na raz do nastÄ™pujÄ…cego pliku: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Zapisz jako...Zapisz zmieniony Logbook?Zapisac zmiany konfiguracji?Zapisz zmienione makra?Zapisz aktualny wpis w dzienniku?Zapisz obraz jako plik monochromatycznyZapisz plik dziennikaZapisz plik makroZapisz paletÄ™Zapisz tekst jakoZapisz obraz faksu jako szary poziom PNGZapisz paletÄ™Zapisz...OscyloskopPrzewinPrzewijaj podpowiedziSzukaj tego znakuSzukaj w internecieZakres wyszukiwania ( Hz)Tekst wtórnySekundWybierzWybierz # bity / znakWybierz # bity stopuWybierz wszystkoWybierz Cabrillo Konkurs & PolaWybierz pole do EksportuWybierz urzÄ…dzenie MikseraWybierz Rekordy do eksportuWybierz czcionkÄ™ rastra TX Wybierz TagWybierz pasmoWybierz szybkosc transmisjiWybierz przesuniÄ™cie nosnejWybierz urzÄ…dzenieWybierz sposób wykorzystania rolki myszki zachowanie wewnÄ…trz wodospaduWybierz tryby dostÄ™pu do menuWybierz liczbÄ™ tonówWybierz parametry pracyWybierz parytetWybierz plik deskryptora rigWybierz filtr wstÄ™pny typu FFT Wybierz te opcje, dla Elecraft K3 Pozostale radia nie wymagaja.Wybierz czcionkÄ™ skali wodospaduWybór koloru tla w panelach Tx/ RxWyslij krótkie CW (5NN)Wyslij znak w CW na koncu kazdej transmisjiWyslij strumien znaków testowychWyslij na tym WPMWysyÅ‚aj staleWyslij obrazWyslij obraz...WyÅ›lij raport odbioru podczas logowania QSOWyslij raport, gdy QSO jest zalogowaneWyslij tekst rx do pliku: textout.txtWyslij:RST wyslanyWysÅ‚ane i odebrane faksy sÄ… rejestrowane w pliku ADIFWyslane znaków w panelu Rx/TxWysÅ‚any numer porzÄ…dkowy (tylko odczyt)Numer # odebranyNumer # nadanyNumer kontrolnyServer string:Ustaw przeglÄ…darkÄ™ blokady szumówUstaw poziom dla dobrego oglÄ…daniaUstaw liczbÄ™ znaków w wierszuUstaw poziom karty dzwiÄ™kowej PCMUstawiony typ resampler uzyÅ‚ skorygowania zrównowazenia UstawieniaShift-key ustaw makroKrótki opis antenyPokazPodmioty DXCCPokaz okno alertu:Pokaz wszystkie trybyPokazuj sciezki przepustowosci na wodospadziePokaz kanaÅ‚yPokazuj kursor z liniami szerokosci pasma Pokaz kursor z linia srodkowaPokaz mniej trybówPokaz edytor makroPokaz mniej lub wiÄ™cej wodospaduPokaz ikony menuPokaz hasÅ‚a w postaci zwykÅ‚ego tekstuPokaz podpowiedziPokaz sygnaÅ‚ nadawania na wodospadzieWstÄ™ga boczna:SigLvlPrzegladarka sygnalówKolor Poziomu SygnaÅ‚uPrzeglÄ…darka sygnaluPoziom sygnaluZakres sygnalu (dB)Szukaj sygnalSciezki sygnaÅ‚uRozmiar:PominiÄ™te znaki w panelu Tx (Tx wl./wyl. w CW)Wyswietl narastanie wyzszych czÄ™stotliwosciWyswietl narastanie nizszych czÄ™stotliwosciSuwak HiLite kolor podglÄ…du blokady szumówWolny (4 msek)Powolny CPU ( mniej niż 700MHz )Odwrócenie programowe lewy-prawy kanal audioSortuj wedÅ‚ug Daty/czasu zakonczeniaSortuj wedÅ‚ug daty i czasu zak. - efekt wszystkie ADIF/raporty CabrilloKarta dzwiekowaPrÄ™dkosc (WPM):SpotWtyczkaSpottingSpotting deaktywowanyblokada szumówPoziom blokady szumówOtwarcie Squelch (sek)StStartData rozpoczÄ™cia Data rozpoczecia do eksportuRozpoczÄ™cie nadawania - opóznienie PTTNumer startowyStanPanstwo musi siÄ™ zgadzacStacjaStacje usÅ‚yszalem dwukrotnieSiatka kwadratówData koncowaBity stopuBity stopuTryb magazynu i czÄ™stotliwosci Kliknij prawym przyciskiem myszy na liscieSunspot tworzenie w toku!Sweet Spotkolor systemowySystemT/RMoc TxTX WPMGeneruj TX TX offsetTX ppmKorekcja karty dzwiÄ™k TX Kolor kartKartyTalkerTalker Socket (tylko MS)TemperaturaSygnal testowy - nie uzywac z nadajnikiemZnaki testuZnaki testu do regulacji QSKTest...Przechwytywanie tekstuTekst Tagów (tagi uzyj {} ograniczniki )Wstaw plik tekstowyTekst i/oTekst do wyslania, podczas bezczynnosci klawiaturyTekst...To szalone lis przeskoczyÅ‚ nad psem ponownie! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~Domyslna szybkosc CWNazwy pliku sÄ… zapisywane w obszarze tekstu RXPole wyrazenia regularnego nie moze być puste.Wyrazenie regularne musi być wazneOpis zostanie zastÄ…piony obecnym modem i czÄ™stotliwosciaCiÄ…g testu nie pasuje do tego wydarzenia wzorca wyszukiwania.Znaczniki te mogÄ… byc wykorzystywane w Te zdarzenie jest wyrazeniem regularnym nieprawidlowym.ThorCzasCzas (y):Czas zakoncz.Czas rozpocz.KoniecStartKoniec QSOCzas startu QSOCzas miÄ™dzy wycofaniem siÄ™ w msekWymagany czas:Okres ponadlimit czasuKoordynacjaCzas trwania i QSKZ kim polaczenie zostanie nawiÄ…zanePrzelaczUstaw DTR dla PTTUstaw RTS dla PTTCzas trwania tonu (sek)TonySledzona szybkosc CW w WPMSledzenieSterowanie transceiveremSzybkosc transferu, X1 -normalnaNadawajMoc TXNadaj ZnakCzcionka TxNadawanie nizszego tonu startuNadaj tryb IDTryby TXNadawanie kropek (.) w czasie bezczynnosciMoc nadawaniaTransmitowany sygnalNadaj wyzszy sygnal startuNadaj tekst videoSzerokosc transmisjiNadawanie/OdbiórNadaje Diddle kropkÄ™ gdy nie aktywny klawiszTrójkÄ…tnyLimit wyzwalania (s):StrojenieMargines Strojenia (rozstaw czÄ™stotliwosci sygnalu)Dwa paski (Schemat 1)Dwa paski (Schemat 2)Dwa paski (Schemat 3)Dwa paski (Schemat 4)Dwa paski (Schemat 5)Dwa paski (Schemat 6)TÅ‚o TxCzcionka TxPoziom tÅ‚umienia Tx (dB)Moc nadajnika wykorzystywana do zapisu w loguTxIDIUUI jÄ™zykUI schematStan USAStacja pracowaÅ‚a ze stanu USACofnijAktualizujAktualizuj aktualny rekordWyzszyGórna granicaGórny poziom sygnalu (dB)Ustaw "cr cr lf" dla "cr lf"Uzyj '(' paren nie KNUżyj CD lub obraz dysku CDUzyj filtru DSP przed dekoderemUstaw DTRZastosuj termin FarnsworthUzyj HamlibUzyj urzÄ…dzenia Line-InUstaw MARK czest'Uzyj serwera audio OSSUzyj Otwórz, aby wybrac plik deskryptoraUzyj portu Audio ServerUzyj Pulse Audio ServerUstaw RTSUzyj RigCATUżyj programu XML-RPCUzyj usredniania, zmniejsz szum wodospaduStosuj kolorowe przyciskiUstaw przekroczenie zakresuUzyj data/czas do wpisu w loguSluzy do wyzwalania nosnika wzmacniacza wykrywaniaUzyj zerUzyj wejÅ›cia mikrofonowegoUzyj portu równoleglego PTTUzyj oddzielnego portu szeregowego PTTUzyj maÅ‚ej czcionkiUstaw uHRouter PTTID UzytkownikaInterfejs uzytkownikaUzytkownikKorzystaj z portu UDP #Aktywuj VSPRozwlekÅ‚yWersja %s jest dostÄ™pna pod adresem %s Co chcesz zrobic?Tryb Video IDPreambuÅ‚a wideo IDWidokPokaz/ukryj kanalyWirtualny Emulator Portu Szeregowego - Powstrzymaj ostrzezeniaWidoczne trybyZobacz stronÄ™ internetowÄ… HamcallZobacz stronÄ™ internetowÄ… QRZzobacz URLZobacz stronÄ™ internetowÄ… hamQTHWodospadPowiÄ™kszenie wodospaduKontrola przesuniÄ™ciaZapis WodospaduAmplituda wodospaduNosnik wodospaduWF wskaznik transmisji Wybór trybu wodospaduPoziom referencji wodospaduWXCzekaj interwaÅ‚ ( msek ) przed odczytem odpowiedziUwagaWodospadWodospad / FFT / OscyloskopKontrola wodospaduPrÄ™dkosc spadku wodospaduWysokosc wodospadu w pikselachWodospad Video IDTekst wideo wodospaduWaveform Audio Format *.wav AU *.{au.snd} Specyfikacja zapytania o pogodeInternetPrzegladarka internetowa wyszukiwaniaWaga (%)Waga maleje wraz wzrostem czasu krawÄ™dziAkcja koÅ‚aKiedy nie wystÄ™puje sygnaÅ‚SzerokoNastÄ…pi po upÅ‚ywie tego czasu w sekundachPrÄ™dkosc wiatruSÅ‚owa ograniczniki Zawijanie wierszyNapisz aktualny zestaw makro na wyjsciu programuOpóznienia zapisu (ms)XMITXML-RPCBlokada TxKontrola przepÅ‚ywu Xon/XoffTakUżywasz najnowszej wersjiPotrzebujesz pÅ‚atny abonament na dostÄ™p do Hamcall on-linePotrzebujesz platny abonament na dostÄ™p do QRZ on-lineTwój loginTwoje hasÅ‚o logowaniaaapow:automatyczne wysylanie danychZnak podpowiedzi w otrzymanym teksciesciezka cty.datObecne warunki wxdBDomyslny tekst, aby wysÅ‚ac ze itpdomyslnie korzysta data / czas naeQSLUzytkownik eQSLwlacz sterowanie kółkiem myszy na pasku makroflmsg *flmsg.exe *.exeflmsg:na przykÅ‚ad KMDQ dla Huntsville-Madison Executive Airport, ALwolne formy 1 muszÄ… byc zgodneSwobodna forma wymianyCzestotliwosc w kHzPin urzadzenia PTTie: /home/co7wt/CALLBK lub C:/CALLBK Pozostaw puste, aby szukac w bazieodebr:kilometry / godzinembaryminutraportraport Celsjuszaraport Fahrenheitcale raport rtecireport kilometrów na godzineraport mil na godzineraport milibaryraportysekundyszukaj - wyrazenie regularneWybierz czcionkÄ™ przegladarkiWybierz wedÅ‚ug datyWyslij po zalogowaniu (log przycisk, , )Tylko tryb Wodospad{NAME} inna nazwafldigi-3.21.80/po/LINGUAS0000664000175000017500000000002012313064025011475 00000000000000es fr it pl de fldigi-3.21.80/po/fr.gmo0000664000175000017500000004477512313333722011617 00000000000000Þ•h\ çœ89N U`pv|…‰¡µ ÉÕæù (:J Z g u‚ ‘£«²¶Ìäü   % 7 E P c w “ ˜ © ´ ¹ Á Å Ê Ó å 8ï (!6!=!E!T!]!t! !š!«!+Â!î!"" " &" 0" ;"G"Y" _"j"p"€"“"¨" °"¾"Æ" Ï"Ù"â"ç"ð"#(#0#@#D#L#U#l# q# #‹##–# ž#ª#³#º#Ë#Ô#ê#ò#ú# $ $?$U$[$ a$k$ p$}$ ‘$Ÿ$ ¦$ ´$Á$È$Ù$$î$%&%5% =%H%N%S% Y%c%h%p%x%€% ˆ%”%›% ·%Ä%Ê%Í%Ñ%Ö%ß%ä%é%& &"&>& Z&{& Š& ˜&¤&Ä&È&9Ñ&. 'Ï:' (("(2(:(B( K(X( h(u(…(–(›(¡(¦(¬(³(¹(È(Ø(Ý(ã(ç(ê(í(þ() ) ))!)%)()@)I) R)\)n) ~)‹))¥)®) Ã)Ñ)/à)* * !*,*0* H*i* €*Š*‘*š* *©* ¹*Ã* É*Ó*Ü* ä*ï* ó*ý* + +!+*+3+<+@+E+ I+U+[+_+h+q+x+€+‰+ + µ+À+ È+ Ö+ã+ø+ÿ+, ,&,-, M,Y,q,‰,!’,"´,×,Ü,ã,æ,ë, ô, - -!-6-H- X- e-r-z-€-’- ™-¤- À- Ë-Ù- â-ð-...-. =. K. U.b.t. z. ….’. š.¨.«.±. ¹.Ã.-Ì.ú./ /(/0/5/:/C/K/T/ \/j/q/w/‹/”/£/´/·/À/Å/Ì/ä/ ì/÷/ ÿ/ 0 0=0N0 ]0:g0 ¢0 °0º0 Â0Ì0ß0ô0 1"11171;1N1V1„^1ã2 ú233$3-333<3@3E3a3v3 3›3²3Æ3×3ç3÷3 4"4 74D4S4d4 s44‰4‘4˜4Ÿ4º4Ô4ì4 ñ4 þ4 55545 J5X5o5#…5©5¯5À5Æ5Ë5Ó5 ×5 á5ë5 6@6 S6a6i6q6‚6‹6¤6À6Ï6ä67787X7x7~7 †7 ’7Ÿ7°7Å7 Ì7Ù7á7õ7 8 $8.8>8F8 O8 Y8d8 k8'x8 8½8Â8Õ8Ü8ä8í8 9 9 9,91989@9P9 Y9c9y9‰9¦9¶9 Æ9Ð9ã9Gë93: ::F:^: f:t::£:ª:º: Í:×:è:$ý:";5;D;M;\;d;j; q;|; ;‹;”;; ¦;²;$¹; Þ;ì;ó;ö;ú;ÿ;< <<*< B<M<i<&…<¬<¿< Ð<#Þ<= =C=.V=ø…=~>…>¡> ¶>À>È>Ñ>å>ú> ??0?7?>?C?I?P?W?i?y?}?‚?Š??‘?ª?°?·? ½?Ë?Î?Ò?Ù?ó? ü? @@.@D@S@ j@ t@@–@¦@2·@ê@ð@ A AA')AQA iAsA {AˆAA–A¦A®A ´A¾AÇA ÏAÚA ÞAèAðA B BB!B*B.B3B7BFBLB PBZBcBjBrB{BšB ´B ¿BÊB ÛBåBúBCCC+C.3CbCrCŽC ©C(´C)ÝCDDD D#D3DED YD"zDD»DÖDíDEEE 0E=E%PE vE„E•EžE!±EÓEÚEóEF#F6F GFUFjF rF|F‹F“F¢F¥F«F ³F ½F<ÇFG G)G9GAGFG LGVG _GiGrG†GŽG“G ©G¶GÉGÚG ÝGçG ïGüG H$H 3H@HPH#pH”HªHÀH=ÐHI I +I 9IEI\IrII)‘I»IÂI%ÆIìIôI8Atfd¶Ëð )kB°ÚÙ3“:Ö2¡$9U”Ç3ì½D w F=GIßHJ‘LÛv]Ÿ-I{X0GÏ&%jÞRøuâüh¸Ye8û‡-¨7—Oaä¯6¤OÓ4 Pë†^V?m¾;õc,ž&\ªSbåZÉš«‰6!Â%/ˆxæl<*'Mr7(Pº Hc­_(<hÕeêÌAœCBN`K@dNòg.Q€ú1g"$#D§íùpzþ™Y"]®·îC0¿V=ÍуnÃÝbW`}[ó2–Z¢,ýE?Ŭñ¥'„‚Ò!ÄèÜ:/RµMi²» T‹ŒŠŽï aéÆ4£Q) @F1[y˜À´Ð…W¼Î>È’5Á• * ³Êf÷X+±_T ;q¹öK.5sàUç¦L>#ãÔJ©× E^áo|Sÿ\Øô›~9+%s log started on %s&About&Configure&Contest fields&File&Help&Logbook&OK&View other call my frequency other locator mode my call my locator my name my QTH my RST other name other QTH other RST receive transmitAFC behaviorAFC range (Hz)ARQ controlAbortAbortedActionAddAdd current frequencyAdjust cursor frequencyAdvanced configuration:AllAlways LSBAlways USBAntenna:AudioAudio device infoAudio devicesAudio fileAudio input deviceAudio output deviceAutomatic Frequency ControlBandBeginners' GuideC&ountriesCONTCQ zoneCQZCallCallsignCallsign databaseCallsign:Can be used in lieu of or in addition to other PTT typesCan. ProvinceCancelCaptureCapture deviceCapture:Carrier frequency (Hz)Center display on signalChange colorChange log levelChange waterfall scaleChanges take effect on next program startupCheck for updates...Checking for updates...CityClearClear AllClear listClear list?Clear log fields?CloseClose ListColorColors && FontsColors and cursorsCommand line optionsConfirmConfirm RESETContestContest:ContinentControlsCopyCopy URLCould not check for updates: %sCould not open url: %s CountryCreate sunspotsCutDTR +12DTR = +VDTR is PTT signal lineDXCCDXCC entitiesDXCC entityDateDebugDefaultDefault WPMDefaultsDeleteDelete from listDeselectDetected signal levelDevice:DevicesDisplayDon't saveEnabledEnter frequency or change with Left/Right/Up/Down/Pg_Up/Pg_DownErrorEventEvent logExitExperimentalExport to ADIF fileFile I/O onlyFilterFind country:Find prefix:Find: Fldigi config...Fldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFoldersFont colorFont:FreqFreq.FrequencyFullGeneralGroup 1Group 2Group 3Hamcall.netHamlibHamlib used for rig controlHardware PTTHost:IDIDsIOTAITU zoneITUZInfoInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize hamlib interfaceInitialize the H/W PTT interfaceInsert file...Insert markerInsert textIntegration period (FEC blocks)LOCLast QSOLeft click to clear text Right click to reset frequenciesLeft click: change mode Right click: configureLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. LoadLoad a new paletteLoad image fileLoad...LocatorLocator:Look up callMacro editor - Manage mixerMerge ADIF fileMinimal controlsMiscMixerModeModemModemsMouseNBEMS files...NO CALLSIGN SETNameName:NewNmNoNo rig specifiedNoneNormalNotesNotificationsOKOffOnOnline documentation...Op &ModeOpen ...Open ListOpen logbook fileOpen macro fileOpen paletteOpen rig xml fileOpen...OperatorOperator informationOperators QTHOperators nameOptional configuration in format: param=val ...OtherOther callOther namePSKPTT is a hamlib commandPTT tone on right audio channel PTT via Hamlib commandPalette: ParityPasswordPastePlaybackPlayback devicePlayback:Port:PortAudioProvincePskmailPulseAudioQRZQRZ cdromQRZ.comQSL rcvd dateQSL sent dateQSL-rcvdQSL-sentQSO DateQTHQTH:QthQuick entryQuietRPCRST rcvdRST sentRST(r)RTS +12RTS = +VRTS is PTT signal lineRTS/CTS flow controlRX captureReceiveReceive modesReceived RSTReception reports...RemoveRestore defaultsReverseReverse videoRevertRig Control using xml spec fileRig controlRig control and contestRig control and loggingRig modeRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig:RigCATRxSaveSave ...Save ConfigSave as...Save changed Logbook?Save changed macros?Save logbook fileSave macro fileSave paletteSave text asSave...ScopeSearch range (Hz)SelectSelect AllSelect operating parametersSend imageSend image...Sent RSTSerial numberSet Viewer SquelchShowShow DXCC entitiesShow macro editorShow menu iconsShow tooltipsSideband:Signal levelSignal range (dB)Size:Sound CardSpeed (WPM):SquelchSquelch levelStStateStationStop bitsStopbitsStore mode and frequency Right click for listSunspot creation underway!SystemTX generateTest...ThorTimeTime OFFTime ONTime OffTime OnTime needed: ToggleTonesTransceiver controlTransmitTransmit modesTransmit/ReceiveTxUS StateUndoUpdateUpper signal level (dB)Use DTRUse HamlibUse RTSUse RigCATUse parallel port PTTUse separate serial port PTTUse uHRouter PTTUser InterfaceUser nameVersion %s is available at %s What would you like to do?Visible modesVisit URLWarningWaterfallWaterfall controlsWaterfall drop speedXON/XOFF flow controlYesYou are running the latest versionafterat:h/w ptt device-pinminutessecondsProject-Id-Version: fldigi 3.11 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com POT-Creation-Date: 2014-03-22 11:18-0500 PO-Revision-Date: 2010-03-06 13:04+0200 Last-Translator: Stephane Fillod Language-Team: French Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1); %s log démarré le %sÀ &propos&ConfigurationChamps &Contest&Fichier&Aide&Journal&OK&Vue indicatif de l'autre ma fréquence locator de l'autre mode mon indicatif mon locator mon nom mon QTH mon RST nom de l'autre QTH de l'autre RST de l'autre reçois transmetsComportement AFCPlage AFC (Hz)Contrôle ARQAnnulerAnnuléActionAjouteAjoute fréquence couranteAjuste fréquence curseurConfiguration avancée:TousToujours LSBToujours USBAntenne:AudioInfo périphérique audioPériphériques audioFichier audioPériph. audio entréePériph. audio sortieContrôle Automatique de FréquenceBandeGuide DébutantsPa&ysCONTZone CQCQZIndicatifIndicatifBase de données indicatifsIndicatif:Peut être utilisé à la place ou en plus d'autres types de PTTProvince Can.AnnulerCapturePériph. captureCapture:Fréquence porteuse (Hz)Centre affichage sur signalChange couleurChange niveau de logChange échelle chute d'eauChangements prenant effet lors du prochain redémarrageRechercher des mises à jour...Rechercher des mises à jour...VilleEffacerEfface ToutEfface ListeEfface la liste?Efface champ de log?FermerFermer ListeCouleurCouleurs && PolicesCouleurs et curseursOptions ligne de commandeConfirmerConfirmer RESETContestContest:ContinentContrôlesCopierCopier l'URLEchec de recherche de mises à jour: %sEchec d'ouverture d'url: %s PaysCréation sunspotsCouperDTR +12DTR = +VDTR est la ligne de signal PTTDXCCEntités DXCCEntité DXCCDateDébugDéfautWPM par défautDéfautsSupprimerSupprimer de la ListeDésélectionneDétecte le niveau de signalPériphérique:PériphériquesAffichageNe pas sauvegarderActivéEntrer fréquence ou changer avec Gauche/Droite/Haut/Bas/Pg_Haut/Pg_BasErreurÉvénementHistorique événementsQuitterExpérimentalExport vers fichier ADIFE/S fichier seulementFiltreTrouve le pays:Trouve le préfix:Cherche: Config Fldigi...Palette Fldigi *.palFichier de définition rig xml *.xmlSite web Fldigi...Scope flottantDossiersCouleur policePolice:FréqFréq.FréquenceTousGénéralGroupe 1Groupe 2Groupe 3Hamcall.netHamlibHamlib utilisé pour contrôle radioPTT matérielHôte:IDIDsIOTAZone ITUTIUZInfoVoltage initial sur DTRVoltage initial sur RTSInitialiseInitialise interface RigCATInitialise interface hamlibInitialise l'interface PTT matérielleInsère fichier...Insère marqueurInsère textePériode d'intégration (FEC blocs)LOCDernier QSOClic gauche pour effacer le texte Clic droit pour reset fréquencesClic Gauche: change mode Clic Droit: configureLicence GPLv3+: GNU GPL version 3 ou ultérieure Ceci est un logiciel libre : vous êtes libre de le modifier et de le redistribuer. Ce logiciel n'offre pas d'autre garantie que celle imposée par la loi. ChargeCharge une nouvelle paletteCharge fichier imageCharge...LocatorLocator:Recherche indicatifÉditeur de macro - Gère le mixeurFusion fichier ADIFContrôle minimalDiversMixeurModeModemModemsSourisFichiers NBEMS...PAS D'INDICATIFNomNom:NouveauNmNonAucune radio spécifiéeAucunNormalNotesNotificationsOKFinDébutDocumentation en ligne...&Mode OpOuvrir ...Ouvrir ListeOuvrir le fichier journalOuvrir fichier macrosOuvrir paletteOuvrir fichier rig xmlOuvrir...OpérateurInformation opérateurQTH opérateursNoms opérateursConfiguration optionnelle au format: param=val ...AutreAutre IndicatifAutre nomPSKPTT est un commande hamlibTonalité PTT sur le canal audio droit PTT par commande HamlibPalette: ParitéMot de passeCollerSortiePériph. sortieSortie:Port:PortAudioProvincePskmailPulseAudioQRZQRZ cdromQRZ.comDate QSL reçueDate QSL env.QSL-reçuQSL-env.Date QSOQTHQTH:QthEntrée rapideCalmeRPCRST reçuRST env.RST(r)RTS +12RTS = +VRTS est la ligne de signal PTTContrôle de flux RTS/CTSCapture RXRéceptionModes réceptionRST reçuRapport d'écoute...EnleverRestaure défautsInverseInverse vidéoInverseContrôle Rig grâce à un fichier de spec xmlContrôle radioContrôle radio et concoursContrôle radio et journalMode RadioRadio requiert contrôle de flux RTS/CTSRadio requiert contrôle de flux Xon/XoffRadio:RigCATRxSauvegardeSauvegarder ...Sauvegarde ConfigEnregistrer sous...Sauvegarder le journal modifié?Sauvegarder les macros modifiées?Sauvegarde le fichier journalEnregistrer fichier macrosEnregistrement paletteSauvegarde texte sousSauvegarder...ScopePlage du recherche (Hz)SélectionneTout SélectionnerSélectionne paramètres opératoiresEnvoyer imageEnvoyer image...RST env.Numéro progressifPositionne le Squelch VisualiseurMontreMontre les entités DXCCMontre l'éditeur de macroMontrer icônes menuMontrer infobullesBande latérale:Niveau signalPlage du signal (dB)Taille:Carte SonVitesse (WPM):SquelchNiveau squelchStÉtatStationStop bitsBits stopEnregistre le mode et la fréquence Clic droit pour la listeCréation sunspot en cours!SystèmeGénération TXTest...ThorHeureHeure OFFHeure ONHeure OFFHeure ONTemps nécessaire: BasculeTonsContrôle transceiverTransmissionModes transmissionTransmet/ReçoitTxÉtat USAAnnulerMise à jourNiveau haut de signal (dB)Utiliser DTRUtilise HamlibUtiliser RTSUtiliser RigCATUtiliser un port parallèle PTTUtiliser un port série PTT à partUtiliser PTT uHRouterInterface UtilisateurNom utilisateurLa version %s est disponible chez %s Que voulez vous faire?Modes visiblesVisiter l'URLAvertissementChute d'eauContrôles chute d'eauVisitesse chute d'eauContrôle de flux XON/XOFFOuiVous utilisez déjà la dernière versionaprèsà:Brochage périphérique PTT matérielminutessecondesfldigi-3.21.80/po/de.gmo0000664000175000017500000024327112313333722011570 00000000000000Þ•þ (­üO°j±j¶jºjÏjÓj*îjk.kHk OkZkjkpkvk k‹kk“k™k¯kÅkÇk‚Ík PlV]l ´l ¾lËlÍl!Òlôl mmm)m.m@mZmpm†m$mÂm×m%ðm"n9nIn&bn‰nn"´n×nÜn&ün#oAo\ouo†o—oo»oÀoÛo+ðop2p+Fprp†p ›p ¼pÝp ópÿpq#q4qCqRq/dq”q¬qÃq"àqrr!2rTrqrr"r+Àrìr s$s 4s'Asisˆs¤s©sÉs(çst"t Atbt ut"ƒt'¦tÎtÓtètu&%uLubuxuŒužu²uÎuáuöuûu ÿu vv +v5vHv MvYv_vgvnv$rv&—v¾v!Ôvövÿvw0wHwCLw w&w Äw ÏwÚw,øw%x#.xRxexxx~x„xD–x Ûx éxôxy*yByVy2lyŸy¿yÝyæyz,z KzUzjzrzwz)z)©z)Óz1ýz/{4{ E{O{ c{ m{x{‰{{¦{¹{À{È{Ü{ ü{|| |!|5|:|)>|h|p|t|}|„|‰| Œ|˜|¨|Ç| ß|é|ù| }} } %}1}4B}w}€} ’}8œ} Õ}ã}ê}ò}~ ~#?~c~l~ ƒ~‘~™~&²~ Ù~å~  @ M[l+˜ ÄÒ7á € $€.€C€'U€}€W’€/ê€'2Z_v5 Ö Ü0æ ‚ "‚%.‚&T‚3{‚¯‚ Á‚Ï‚å‚ ë‚ö‚ü‚ƒ ƒ 3ƒ@ƒUƒqƒ …ƒƒ ˜ƒ ¦ƒ³ƒ*Ńðƒöƒþƒ„,„B„\„r„ {„…„š„¶„¿„ Þ„è„í„ ö„…"…<…;T……¦…®…È…+Ï…û…†&† 6†C† V†`†d†i† q†{†„†›†«†°† À† ΆÚ†ë†‡‡ &‡ 4‡@‡E‡N‡V‡e‡v‡Ї‡¢‡+ª‡Ö‡ð‡ˆˆ 9ˆEˆ#bˆ†ˆ–ˆ²ˆÒˆ#Ûˆÿˆ‰‰1‰:‰P‰`‰x‰‰—‰Ÿ‰,¤‰ щ݉ä‰ è‰õ‰ Š/Š:FŠ8ŠºŠÌŠ!ÔŠJöŠ!A‹c‹*€‹ «‹¸‹ ¼‹Ç‹1ß‹ ŒŒ 6Œ AŒ LŒXŒ,kŒ˜Œ³ŒºŒÃŒãŒýŒ 89C}0š2Ë*þ)ŽEŽ MŽ[Ž{ޗާŽ?¶Ž$öŽG"c-†´ÏÕæ ëö ü  ",Fd iqv è õ‘‘)‘ I‘:S‘Ž‘”‘˜‘©‘ ¸‘ Ƒёï‘þ‘ ’ ’ ’:?’z’ ’3’Á’È’Ü’í’)“ /“ 9“ G“ Q“ ^“l“s“z“Š“›“°“$Ì“ñ“$”+”>”M”U” Z”e”m”s”!‹”/­”#Ý”$• &•G•c•h• n•x•‰•™•²•»• À•Ì•4Ô•, –6–>–F–N–+b–#Ž–/²– â–î–õ– ——'—0—$I—n—…—Š—¥—«—®—²—·—À—Å—×—Ú—í— ˜+˜0˜G˜ ^˜i˜…˜¤˜ À˜!ᘙ ™4™H™,W™ „™ ’™ ž™¿™Ñ™ä™ø™ü™š /š=š AšLšIUš6Ÿš<Öš0›,D›9q›«›.Ê›0ù›Ï*œúœ2K$Sx{€“$£:Èž žžž*ž<žTž lžyž‘ž©žÁžÞžûžŸ Ÿ)ŸAŸ EŸfŸŸ”Ÿ´Ÿ ÇŸÓŸÛŸêŸòŸ      2$ W q  w ƒ “ ™  ¬ · Ç Πá ¡ ¡%¡4¡M¡T¡d¡m¡ t¡¡’¡®¡³¡¹¡ ¾¡Ê¡Ú¡ë¡ ñ¡'ÿ¡'¢.¢I¢[¢#a¢…¢œ¢¼¢Ó¢ç¢ú¢££&)£P£`£e£k£r£v££”£—£š£®£Á£Ò£æ£ï£ô£û£ ¤¤ ¤ '¤!3¤!U¤w¤z¤ }¤;ž¤1Ú¤ ¥ ¥¥ ¥(¥,¥3¥6¥=¥W¥q¥‰¥Œ¥•¥ ž¥¨¥Ç¥×¥é¥ù¥ ¦ %¦2¦(D¦m¦}¦/…¦µ¦¾¦ Ó¦ᦠñ¦ÿ¦§/!§Q§Y§ _§ j§u§y§~§‚§ †§ “§ž§½§&ܧ¨#¨A¨ Y¨z¨ ‘¨›¨¢¨º¨èɨبñ¨ú¨© $©.©/N©~© „©Ž©‘©#¤©È©Ø©÷©0 ª:ªBªJªRªoª‚ªª&·ªÞªçª«!«?« G« S«^«b« f«'p«˜« «©«­« ȫ֫ ð«þ«¬¬%¬.¬ 7¬ D¬ P¬ ]¬*i¬”¬£¬§¬ «¬¸¬½¬ Á¬ͬÓ¬׬Û¬ê¬ù¬­ ­­ ­$­-­D­T­i­n­ ­Œ­“­¬­ ¼­ Ê­Õ­æ­®®"® ;® I®V®m®†®Ÿ® ´®¾® îÏ®ä®ù®¯¯;¯R¯Z¯•`¯ö¯ °$°5°O°n°&°¦°®°̰à°ô°ø°± ±*±1±5± U±a±y±;‘±ͱã±!ì±"²1²L²Q²X² t²‚² ‡²”² ² ©²¶²¹²ɲвÙ²á²ç²ì²³³ ³³³ #³/³4³ =³ªI³ ô³ÿ³´1´F´^´|´Ž´ ž´ «´,¸´å´÷´ÿ´µ µµ2µAµSµeµtµ|µƒµ˜µ «µ ¶µ×µïµ¶¶7¶ M¶X¶i¶¶ –¶7¤¶ ܶè¶·· 8·F· a·<‚·¿·*Û·¸0¸+O¸{¸Œ¸ ž¸ ©¸(·¸#ู ¹0¹D¹]¹|¹ƒ¹ ‹¹ —¹ ¤¹²¹Á¹Ô¹$ﹺ1º:ºNºkºpºƒº–º"¥º Ⱥ Öº÷º»%»7»V»f» ‚»!» ²»¼»ûÒ»æ» õ»¼ ¼ "¼0¼ 6¼D¼.`¼¼9¥¼ ß¼ ê¼÷¼ü¼½ ½½ '½5½H½K½ Q½\½ r½ ~½ н –½¢½ ¾½ ʽ Ö½â½ò½ø½ ¾¾%¾ :¾ D¾N¾-W¾ …¾¾—¾›¾¤¾ «¾µ¾¼¾ վ߾ä¾ù¾¿ ¿$¿))¿ S¿!]¿ ¿Œ¿ ”¿¡¿³¿Ç¿пqØ¿{JÀÆÀ+ÛÀ/Á%7Á:]Á;˜Á+ÔÁ ÂÂÂ%Â.Â6ÂEÂV s š©°¿ÂÞÂåÂëÂôÂÃ"Ã+Ã:ÃZà lÃzËÚîþÃÒÃáà òÃýÃÄÄ)Ä=ÄQÄeÄyÄÄęġÄ!ºÄÜÄáÄ äÄ ðÄúÄÅÅ#Å6Å=ÅWÅ ]ÅiÅŜűÅÏÅíÅõÅ ÆÆ)Æ">ÆaÆwÆŽÆ –Æ¡Æ)µÆ߯óÆÇ+(ÇTÇfÇ{ǑǮǽÇÅÇ ÔÇÞÇ ïÇúÇ:È=ÈCÈRÈdÈiÈ0|È ­È»ÈÒÈ åÈïÈÉÉ É*É2É5É =ÉGÉ_ÉrɇɢɵÉÊÉÎÉ*äÉÊÊ&Ê ,Ê 7ÊDÊ)[Ê…Ê%ŠÊ°Ê¿Ê ÏÊ'ÙÊËËËË5ËHË"LË5oË1¥Ë×ËçËûËþËÌÌ Ì"(Ì KÌYÌ_Ìp̆Ì#‰Ì­ÌÇÌ ÌÌ'ÖÌþÌÍ ÍÍ$Í+Í2Í9Í LÍZÍGm͵͹ÍËÍÑÍGÙÍ!Î(Î7ÎIÎdÎz΋ΓΛεÎÉÎ+ØÎ ÏÏ(Ï<ÏÊRÏÑ"Ñ&Ñ=Ñ%AÑ6gÑžÑ3¸ÑìÑ òÑÒÒÒÒ &Ò3Ò9Ò=ÒEÒ[ÒqÒsÒ‡yÒ ÓhÓ wÓ ÓŽÓÓ(•Ó¾ÓÖÓÛÓàÓöÓ$ûÓ Ô =Ô^Ô|Ô$’Ô·ÔÉÔ,ãÔ0ÕAÕTÕ*pÕ›Õ±Õ&ÊÕñÕ'öÕ&ÖEÖcÖÖ—Ö¨Ö¹Ö¿ÖÝÖâÖýÖ6×P× j×+‹×·×Ñ×(ç×/Ø@ØUØhØØ–ةغØËØ6æØ Ù>ÙQÙ#nْٲÙ!ÍÙïÙÚ.Ú*LÚ1wÚ"©ÚÌÚèÚ Û.Û%BÛ'hÛÛ#•Û$¹Û(ÞÛÜ!Ü#;Ü_Ü vÜ%‚Ü.¨Ü×ÜÜÜ$ñÜÝ*3Ý^ÝwÝݧÝÀÝÙÝöÝÞ$Þ)Þ -Þ;ÞLÞ`ÞtÞ‘Þ –Þ¤Þ¬Þ´Þ »Þ%ÇÞ.íÞß+:ßfßoߊߤßÃßkÉß5à$Eà jà tà~à@žàßà&èàá!á3á<áBá>]á œá ªá¶áÅá%ØáþáâK*â1vâ$¨âÍâÞâ(ââ1 ã =ãGã^ãfãnã-uã-£ã-Ñã8ÿã8ä=ä ]ä härä {ä†äŸä µäÁäÒäÙäáä öäå6å<åKåSåiånå4rå§å¯å³å¼åÃåÈå ËåÖå#æå æ #æ.æLæ cæoætæŒææB»æ þæ ç çD*çoç ‚çŒç•ç´ç(Ãç)ìç è è5èIèQè?oè ¯è!»è$Ýè#é &é4éCéUélé<…éÂé Ùé:æé !ê /ê=êXê%lê’êm­ê5ë&QëDxë½ë$Ãëèëì7ìVì_ì3nì¢ì±ì"Áì#äì5í>íVíní „íí¡í§íÁíÖíèí÷í î .î <î HîUîrî†î*›îÆîÌîÔî&éî&ï 7ïXïxï ï‹ï"¥ïÈï×ï õïÿïð ð$%ð!Jð!lðHŽð×ðòð÷ðñ5ñPñiñ‚ñ™ñ¹ñ Óñ ßñìñññùñò ò(ò>òCòSòdòuòò¦ò½òÏò àòíò óòýòóó-óCóIó_ó-hó–ó±óÆóäó ô!ô"0ôSôfôô•ô&žôÅôÎôáô üô õõ.õEõ_õgõoõ3wõ «õ¸õÀõ ÄõÐõ êõ3ôõL(ö?uöµöÊö*ÒöEýöC÷$c÷1ˆ÷º÷Ì÷Ð÷à÷,þ÷ +ø5ø Qø [øføwø#ø³ø Ïø Ûø/éø'ùAù#`ù „ù6Žù&ÅùCìù00ú<aú(žú ÇúÕú(åúû+û4ûQOû:¡ûQÜû.ü3Jü~üü¤ü½ü ÄüÒüÛüíü ðü üü ýý0ýNýVý‡oý ÷ý þþ,þ'EþmþH|þÅþËþÏþàþ ñþ ÿþ ÿ(ÿ9ÿ BÿMÿ^ÿKzÿÆÿËÿ<áÿ%7I+c  ™¥µÄÕÛâó  &@g"|Ÿ ²¾Å Í Úå$î'(;)d'Ž"¶7Ù(8Ge mz ‘4›0Ð '5]1} ¯»$ çôü#?[`tz}†”©­É$ã 1M\&|£Ã!ß;S0f—¬+»çý+/"Ehƒ ‰K•CáI% .o 6ž @Õ - ;D )€ Òª } <’ Ï %× ý     ;$ M` ® ´ ¼ à × ñ    , ? V m …  µ ½ Æ Ü #à "'&<cz‹“¢ªÃ Ûé3ñ%@ HVfl … §"ºÝò4;Xkt†"¢ÅÎ Ôà÷2 8-Ft{“¦«$Äé5TZy*еÏÔÚá"å3Lc~“™ ¼ Ï Ûè#ü" CH)LCv>ºù ý $+.!6!X"z   ¬ ¸&Æí'B^n9†ÀÒ4Ú /= Q^r5…»ÄË Þëïõù ý ""<-_$¨Í#é  %/8S \fx –¡¿ Ð%Ü36 <FI)g‘'¥Í<è%-5=\ w˜5µë ó&0W _ itx |(†¯·ÀÄ ßì / 7 E R\k { ‡=“ Ñßã çõúþ"& *7 L Zgn v€‰¦»Ò×ñ %4 DPjŠ ©³ÍÞî # = Q  b l u Š  Ÿ ©  ¾ GÈ !!¨!Ç!æ!"."-N"|"4‘"Æ"!Õ"÷"#0#4# =# ^# l#z#"€#£#³#Ï#?ë#+$ G$'S$({$!¤$Æ$Í$*Ô$ ÿ$ % % %-%A%S%V%n% u% %Š%%•%«%¯%´%Ä%Ê% Ð% Û% å%ó%Ÿ &«&¼&#Û&ÿ& ''='e'}'’'¨'-»'é' ( ( (!(0(M(_(p((ž( §(²(Î( á($ï()4)-L)z)!—)¹)Ò)è)**B/*r*ƒ*Ÿ*»*Ù*#í*+F'+ n+'+ ·+2Ø+6 ,!B,d, z,†,1•,'Ç, ï,ù,.-"7--Z- ˆ- ”-  - ®- ¼- É-×-!÷-+. E. f.t..ª.³.Ê.Þ.'ø. /"./Q/o/Ž/"¤/Ç/Û/ù/ 0 -090?0N0`0 o0{0 Ž0 ›0¨0±0!Â01ä01T41 ‰1”1«1°1¸1Á1 Ö1ã1÷122 2"2 =2 I2 U2 a2%m2 “2 Ÿ2 «2 ·2Ã2 É2ê2ò2% 3 03;3D3:M3 ˆ3“3š3 ž3¬3 ³3½3Ä3Ý3 ã3ñ3 44 .494,>4 k4 w4 ˜4¦4 ®4¼4Í4á4ê4qò4^d5Ã56ß546)K6=u6G³69û657:7 B7L7 T7^7 f7p7 7$7 ²7 À7Î7 Ö7ä7ë71ú7,858 ;8F8 \8}8 „8'’8º8Ú8ê899 ,989I9]9n9v9 ‹9•9¬9Ã9Ú9ñ9:: ": ,:7:%I:o:t:x: €:‹:'š: Â:Ï:ê:ñ:; ;%; <;];q;!‘; ³;¾;×;ç;<*<G<b< ~< ‰<—<0²<ã<ú<%= 5=V=q=Œ=!ª=Ì= Þ=ê= î=û=> >8 >Y> _>m>€>‰>=¤>â>ñ> ?!?=?V?k? }?ˆ?‘?”? œ?§?Æ?"ß?@@1@G@K@*i@”@˜@µ@ »@È@×@3ñ@%A&,ASAiA {A(‰A²AÂAÇAÏAèAÿA-Bb0BT“BèBøB CCCC4C'9C aCnCvCˆC¤C3§CÛCøC ýC. D:DADHDPD`DgDnDuD ‰D–DMªDøDEEEG#EkE sEE’E­EÅEØEáEêEF$F-4F bFlF‰FžFd,§,ˆ…)ÊÕþý"hY8!Ùf¥>).¸³þ>Öc«6tÅ Wû9\ÞËþÐc@seéÕýA8óuŸß s"HÅ ¶Ûã-“u]¿{™N°¿à¨/faØF!Ò¡Úߺð*µ¡•Â7\s®:Lp8Ò¯bd£¶™NzF9}©@]äÈžÎZ¹uçî²&‹µIkÄÃ@T‡F2Ma^1ef´„.Àn”m†LÎÚúîOîVY'×S¹AQ4„ÞÃÌÜ]Id‹Úˆ•Y‹ËÇ#ž“ø’ EòšÑO+'DI›Ï© ÷At©ÍÒáˆn(ƒ KÙÉ=³ž¿îɱïŽ+ÐDª0°WÑGJq•d†.h‰ø€‡Gcj ¤^‘Rãÿ aìZ°¾0ŠY4éûªQÄxù¯*öRÛ³¦©)­ûçøïwiFžÇUý èÁ0åàù?U÷ÛÌ¥‡QtQ‘^©Þ^·S%ø_ú¡V½¿ÓP51g#Gó÷.=ËϦ÷ÍÌ}_Å#(=‘ܸÝå9wš#|¢Ü홸?6XåE –ly!z5ÆÜ°*‰a@gõ/"ÔÛ³P{k*Ý<¬ wTÎK€šq˜ÀôU'ñ¹iJ®Sá{€­rÚh{¨Gx%ââ´Žr3jD˜ŽÀ²H9Ov i$ê<û<Z–†‰–Ÿõ¾Á-¨`[}<oŽ/Öwj챨ˆ_º;2i\~ƒl•Á¼Ž¬¥ÓÁ£Õ×àsñªX6&2$R•Š9Úh3ÝÖACâŸÂMðTØéîê;~¼`›d6ð¨ çü'4 q¼—:ðÂu»&H:w}s‡ÔEB˜ú$j>ŒLl¢­…7PßN?BÝÊVè%ç™WÛ$B ²œ:áb$ô(†t*U|í±Æ¬ñQJ ¡r¹›üXÍ®%ÆýEì𪓷 ô¸`Ò!äÞ5ÕÈÎCºôV >뺤4ÐÏ£«rÒPb+ñSÅjÊ­êÈ7œ›n½mD‘2½Hàv7%þ¶·¸æ˜æméñ¯µ×Ø~ÈpT³y-£ÇÊ=ô~?=—á .K3\/T;Ä­¿ª¼öè>ÔŒ·ã8ØïÿIÓm¾—|Õ ¤¦§C–Läzy¢Ë| –ïgùo„~‚ò¤pe”p´—¬É[€(—+»ëõÝ‚¹ëâ»òJ«a¥z½Ë²eµ`å׈cŠ«»k^‰1á„ ú¢§²‰€NS¾Ó x‡ÄyèP˜±õ{ÌÉb!vƒ ØÊ6êì¦zÔvó5üýâMì”›Þ }ÆFB Vq ü,Æè)ïù`¬§‹ò¥"G ·ÌcKÂ?ǯB’‘º‚]½“_ ¶Mlã&ê…þ’:»DxiR“m«®ZlöäÇuÎ÷õƒpšø ÿK1í¡ÃÐOÑÑÀ¦LReö\š_„[û±;ÏŸ W|’oY[E¾‚ír¯œh8üWÖ¤Á”‚Ÿ[kvO fŠÍŒ y(œJtgú¢]n'"æÄHXæ´+0ßÓ£)´4Ŝ냅çϼ5;noÖòó…Ã×µ¶AÈ3íëÃ-ZMÿ0À†åÙ1CI®”ŒäCŠ ,-,Ðó2ÙÍ7X&ãß™oÉ ‹fÔ3bqÜù°UkNÙx@gÑö#éŒ/<àž’æ§ in # R# Records in logbook# S# retries before giving up# times to resend command before giving up%s log started on %s%s: Do not exist, create?&About&Configure&Contest fields&File&Help&Logbook&MFSK Image&OK&UI&View&Weather Fax Image RX&Weather Fax Image TX**.exe... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ...0 = T; 9 = N1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types14070.150500 Hz limit: AFC on,off,toggle my antenna operating band other call clear log fields clear RX pane clear TX pane contest counter untransmitted comment CW identifier decrement counter [Wait][Len](ms) log eQSL optional msg log eQSL insert text file valid xcvr filter width my frequency text to NAME/QTH move to freq NNNN Hz send mode ID in video text idle signal for NN.nn sec LDT in iso-8601 format insert MFSK image increment counter S/N etc. IMD etc. ZDT in iso-8601 format local date YYYY-MM-DD Local datetime saveQSO data, append msg to notes log at xmt time other locator saveQSO data, append msg to notes save QSO data local time HHMM change macro defs file map by value map on google mode my call my locator my name my QTH my RST other name Transmit |NN| successive RsID bursts next QSO rec # pause transmit insert QRG into Rx text # QSO recs QSO time (HHMM)) qsy to kHz, Hz right-clk QSY button left-clk QSY button other QTH repeat macro continuously send CAT cmd valid xcvr mode CW rise time other RST receive Rx RSID on,off,toggle save current macro file save contest out search DOWN for signal search UP for signal Digitalk On, Off, Toggle video text repeat every NN sec tune signal for NN sec toggle T/R transmit set xmt attenuator Tx RSID on,off,toggle Fldigi version delay xmt for NN sec CW WPM:Farnsworth get weather data for station get weather data exchange begin exchange end exchange in exchange out zulu date YYYY-MM-DD Z UTC datetime zulu time HHMMZADIFAFCAFC behaviorAFC range (Hz)AFC range or BWAFC speedAFC tracking speedALTRARQ controlAbortAbortedActionAddAdd CRLF after page width charactersAdd RsID signal to end of transmissionAdd current frequencyAdd mixer controls to main dialogAddress:Adjust cursor frequencyAdjust the DSP bandwidthAdvanced configuration:AllAll settings shown here can be changed later via the Configure menuAllow errorsAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAntenna:Appearance of label on each channelAppend to RX text:Append to TX text:ApplyAudioAudio device infoAudio device information is only available for the PortAudio backendAudio devicesAudio fileAudio frequencyAudio input deviceAudio or RF frequencies on waterfall scaleAudio output deviceAuto CRLF line lengthAuto connect when fldigi opens (server must be up)Auto start programs with fldigiAuto-fill Country and AzimuthAutoCRLFAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAutostartAvailable substringsAzimuthBackBackgndBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3Background color of signal viewer squelch controlBandBands must matchBandwidthBarometric pressureBaud rateBaud rate:Beginners' GuideBehavior of s/n imdBg ColorBits per characterBrowseBrowserBrowser Line ColorsBug me about saving log entriesBuild infoButtonButtonsC&ountriesCAT command for PTTCONTCPUCPU usage increases with waterfall heightCQ zoneCQZCR-CR-LFCSV...CTRLCWCW ID modesCW Postamble IDCW QSK signal on right channelCW dsp filter bandwidthCW is LSBCW transmit WPMCabrillo SetupCabrillo...CallCall LookupCall SearchCall sign workedCallook.info lookup (free service US callsigns only)CallsignCallsign databaseCallsign:Can be used in lieu of or in addition to other PTT typesCan. ProvinceCancelCaptureCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture:Carrier frequency (Hz)Carrier shiftCelsiusCenter display on signalCenter in passband Right click to undoCenter lineChange # of psk viewer channelsChange ONLY to experimentChange application look and feelChange colorChange dir...Change log levelChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel labelChannel numberChannels, first channel starts at waterfall lower limitChars/Row:Check AllCheck for duplicatesCheck for updatesCheck for updates when starting programCheck for updates...Check this to be notified when an RSID is received without changing modem and frequencyCheck to reduce CPU load in PSK and RTTY modes.Checking for updates...Choose directory to store KML documentsCityCity of station workedCleanup KML data now !Cleanup on startupCleanups KML documents, empties Google Earth display.ClearClear AllClear channel text after # seconds of inactivityClear listClear list?Clear log controls sets RST in to 599Clear log controls sets RST out to 599Clear log entries after saving or using macro Clear log fields?Clear on saveClient/Server LogbookCloseClose ListColorColor of Mark TrackColors && FontsColors and cursorsColors/FontsCommand line optionsCommand run on KML creationCommands are echoedConditionsConfirmConfirm RESETConfirm exitConnect to serverConnect/disconnect to Talker socket serverCont'ContestContest exchange inContest exchange receivedContest exchange sentContest serial # receivedContest serial # sentContest:ContinentContinuous scrollingControl chars in Rx/Tx paneControlsConvert callsign to upper caseConverterCopyCopy URLCorrectionsCould not check for updates: %sCould not make directory Could not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCountyCreate 1000 Hz square wave on right channelCreate New Logbook?Create cabrillo reportCreate sunspotsCustom shiftCustom text searchCustom...CutDTMFDTR +12DTR +12 vDTR = +VDTR is PTT signal lineDTR is ptt lineDXCCDXCC designatorDXCC entitiesDXCC entityData base lookupData files repositoryData files sourcesData files updateData files...Data sourceDateDate OffDate OnDate QSO EndedDate QSO startedDate time ON == OFFDebugDecode DTMF tonesDefaultDefault 800 Hz. Deutsche Wetterdienst 850HzDefault CW tracking pointDefault RST in to 599Default RST out to 599Default RTTY tracking pointDefault WPMDefault for all other modemsDefault listen / transmit frequencyDefault messageDefault test string is: "Default to cross hair digiscopeDefaultsDelay NN msec before starting audioDeleteDelete from listDelete the current recordDeselectDetected signal levelDetection LevelDetector high thresholdDetector low thresholdDevice:DevicesDialDifference between Rx & Tx freq (rig offset)Digit ColorDigitsDimDirectory...Disable alert dialogDisable allDisable further detection when RSID is receivedDisable on very slow CPUs of if signal browser is not usedDisable spotting when signal browser(s) are not visible.Disables detectorDisplayDisplay macro filename on startupDisplay tx and rx in main fldigi window. Change requires restart of fldigiDo not show RsID alert dialog boxDo not use callsign databaseDo not use callsign lookup via web browserDocked scopeDomDon't saveDouble-click to captureDragging on the waterfall scale changes frequencyDup ColorDuplicate check, CALL plusDuplicatesEdge shapeEdge timingEmbedded Wefax GuiEmpties KML documents when starting program.Empty ADIF logbook file %sEnableEnable -Enable / disable icons on menusEnable / disable tooltipsEnable DSP prior to decoderEnable MultiPSK-compatible FECEnable allEnable check box to show each respective operator controlEnable for very weak signalsEnable if you cannot use the middle mouse buttonEnable if you're computer does not decode properlyEnable this entry when fldigi first startsEnable to select date rangeEnabledEnd of xmt IDEnter Port # assigned to serverEnter URL address of serverEnter Xcvr FreqEnter a CALL !Enter frequency or change with Left/Right/Up/Down/Pg_Up/Pg_DownEnter full path-filename for cty.datEnter full path-filename for external program Or simple name of programEnter full path-filename for flmsgEnter test string or leave blank for default:Enter time span in minutesErrorError reading %sEvenEven linesEventEvent logExExchange InExchange OutExchangesExecutable file to insertExecute command on KML files.ExitExit promptsExit prompts active only when File/Exit menu item selected. Not active if window decoration close button pressed.ExperimentalExport SetupExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...Extract files for use with external "wrap / flmsg" programF-WPMFECFFT / FIR filterFFT ProcessingFFT averagingFFT filterFFT prefilter window functionFLMSG files...F_keysFahrenheitFast (2 msec)Fax images destination directoryFeel free to skip any pages or exit the wizard at any timeFeldFile I/O onlyFill in Country / Azimuth using cty.dat informationFilterFilter Shape FactorFilter bandwidthFilter bandwidth factorFilter bandwidth relative to signal widthFilteringFind country:Find nextFind prefix:Find previousFind: FinishFixed IntervalsFldigi config...Fldigi configurationFldigi configuration wizardFldigi macro definition file *.{mdf}Fldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFoldersFontFont colorFont...Font:Force RST in/out to 599Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFForce output audio to single channelFree Lossless Audio Codec *.flacFree service courtesy of OKFreqFreq.FrequencyFrequency in MHzFrequency scaleFrequency shift (800 Hz)Frq DispFullFull reportGeneralGenerate 1000 Hz square wave signal on right channelGenerate square wave signal on right channelGroup 1Group 2Group 3Halve receive widthHamCall online via default Internet BrowserHamQTH via default Internet BrowserHamQTH.com (free service http://www.hamqth.com)Hamcall.netHamlibHamlib used for rig controlHardware PTTHiLite 1HiLite 2Hide Transmission windowHide transmission window by default.Hide window after (s):HighHigh frequency limit in HzHost:IDIDsIOTAITU zoneITUZIgnore duplicatesInInactivity timeoutInclude the transmit frequencyInclusive stop date for exportInfoInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize XML-RPC rig controlInitialize hamlib interfaceInitialize the H/W PTT interfaceInitialize the QSO logging fieldsInitialize the socket clientInput carrier shiftInsert default textInsert file...Insert leading zeros into Xmtd serial numberInsert markerInsert textInsert text on single left clickInteresting notesIslands on the airK3 A1A configuationKMLKML files directoryKML refresh interval (seconds)KML root fileLOCLabel textLast QSOLeave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft Click - execute Fkey - execute Right Click - editLeft Click - execute Shift-Fkey - execute Right Click - editLeft and right channels both contain modem audioLeft click - select Right click - clear lineLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLeft or right click always replays audio historyLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Lighted button enabled colorsLimit to a few characters, as in CQEM or IOTA etc.Line InListen for signals within this rangeLkLoadLoad a new paletteLoad image fileLoad last used macro file on startupLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocLocateLocate cty.dat fileLocate executableLocate flamp executableLocate fllog executableLocate flmsgLocate flmsg executableLocate flnet executableLocate flrig executableLocate program #1 executableLocate program #2 executableLocate program #3 executableLocatorLocator:Lock transmit frequencyLogLog Navtex messages to Adif fileLog Navtex messages to KMLLog RTTY frequencyLog Wefax messages to Adif fileLog all RX/TX textLog sourcesLogbookLogbook DialogLoggingLogging Panel ControlsLook up callLotW userLowLow = zero errors Medium = 1 error High = 2 errorsLow frequency limit in HzLowerLower limitMFSK image fileMT-63Macro Button LabelMacro TextMacro editor - MacrosMaidenhead LocatorMaidenhead locator as in EM64qvMail Server AttributesManage mixerMatched FilterMatched Filter bandwidthMediumMerge ADIF fileMerge...Mic InMiles / HourMinimal controlsMinimum time between eventsMiscMixerModeMode in useMode must matchMode width limitModemModem carrierModem signal on left and right channelsModemsMonitor transmitted signalMono audio outputMouseMouse wheel active on macro buttonsMsec's between retriesMulti-Channel Signal ProcessingMulti-channel detectorMy callsign de CALLMy transmit CW WPMNBEMSNBEMS data file interfaceNBEMS files...NO AUDIO DEVICE AVAILABLE (or testing)NO CALLSIGN SETNameName:NavtexNewNew record / Save recordNextNmNoNo faster than thisNo file name givenNo rig specifiedNo slower than thisNoise onNoneNormalNot worked beforeNotchNotesNotificationsNotify onlyNumber and position of macro barsNumber of digits in serial numberOKONON - small font OFF - large fontON - start at default OFF - keep current wf cursor positionON - use last set of macros OFF - use default setOSSOSS MixerOddOdd linesOffOliviaOnOn/OffOne bar (above waterfall)One bar (below waterfall)Online documentation...OpOp &ModeOpen ...Open ListOpen file with default browserOpen in browserOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen paletteOpen rig xml fileOpen squelch for nn sec if RSID detectedOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperatorOperator informationOperator nameOperator workedOperators QTHOperators callsignOperators nameOptional configuration in format: param=val ...OptionsOtherOther callOther nameOutOverPCMPSKPSK ReporterPSK et al.PSK/RTTY Viewer HiLite Color 1PSK/RTTY Viewer HiLite Color 2PTT delays valid for all CAT/PTT typesPTT end of transmit delayPTT is a CAT command (not hardware)PTT is a hamlib commandPTT tone on right audio channel PTT via Hamlib commandPalette: ParityParse all incoming textPasswordPastePaths (hidden)Pick baud rate from listPlaybackPlayback continuous loop?Playback devicePlayback:Please set your callsign first.Popup info after a 2 second hover on a callsignPort:PortAudioPrPreamble DetectionPress return to continue the searchPress to updatePress to update QSO start timePrimary macro setPrint CW / RTTY / THROB / CONTESTIA in lowercaseProg 1:Prog 2:Prog 3:Prompt to save ConfigurationPrompt to save logPrompt to save log on exitPrompt to save macro filePrompt to save macro file when closingProvinceProvince of station workedPseudo-FSK - right channelPseudo-FSK on right audio channelPskmailPulse shapePulseAudioPwrQRZQRZ cdromQRZ online via default Internet BrowserQRZ.comQRZ/eQSLQSKQSK on right audio channelQSL rcvd dateQSL received on this dateQSL sent dateQSL sent on this dateQSL-VIAQSL-rcvdQSL-sentQSO DateQSO Date OffQSO Date OnQSO end timeQSO loggingQSO must not occur within a time period ofQSO start timeQSYQTHQTH NicknameQTH:QthQuick entryQuietRE:RPCRSID receptionRST always 599RST rcvdRST sentRST(r)RTS +12RTS +12 vRTS = +VRTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTYRTTY Scope DisplayRX captureRX ppmRX sound card correctionRadio frequencyRange +/- wpmRange, WPMReading fonts...Really delete record for "%s"?Really want to quit?ReceiveReceive filter bandwidthReceive modesReceived RSTReceived serial numberRecent activity for gridReception of flmsg filesReception reports...ReconnectRecsRectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)ReloadReload cty.datRemoveReport rig frequency (enable only if you have rig control!)ReportsResetReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Reset hamlib interfaceReset rigCAT interfaceReset to CarrierRestore Settings on CloseRestore cty.dat default folderRestore defaultsRestore the serial (COM) port settingsRetriesRetrieve for active modem useRetry Interval (ms)Retry interval (ms)RevReverseReverse Left/Right channelsReverse videoRevertRigRig Control using xml spec fileRig controlRig control and contestRig control and loggingRig control via external program using xmlrpc remote calls.Rig description file:Rig modeRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig:RigCATRigCAT used for rig controlRight channelRsIDRst receivedRst sentRun programRun program:RxRx Text CaptureRx WPMRx bkgndRx fontRx/TxRxIDS/N and IMD behaviorSELSKIPSOM decodingSQL-1SQL-2Sample rateSaveSave ...Save ConfigSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed configuration?Save changed macros?Save current log entry?Save image as monochrome fileSave logbook fileSave macro fileSave paletteSave text asSave the fax image as a gray-level PNG file.Save this paletteSave...ScopeScrollScroll hintsSearch for this callsignSearch on webSearch range (Hz)Searches passbandSecondary TextSecondsSelectSelect # bits / charSelect # stop bitsSelect AllSelect Cabrillo Contest & FieldsSelect Fields to ExportSelect Mixer deviceSelect Records to ExportSelect Rx/Tx Character SetSelect TX raster fontSelect TagSelect bandwidthSelect carrier baudrateSelect carrier shiftSelect deviceSelect how the mouse wheel behaves inside the waterfallSelect lineSelect modes for menu accessSelect number of tonesSelect operating parametersSelect paritySelect rig descriptor fileSelect the type of FFT prefilterSelect this for Elecraft K3 Other radios should not need it.Select waterfall scale fontSelection background color in Rx Tx panelsSelf Organizing MappingSend Callsign in CW at end of every transmissionSend a continuous stream of test charactersSend at this WPMSend continuouslySend imageSend image...Send reception report when logging a QSOSend report only when QSO is loggedSend:Sent RSTSent and received faxes are logged to Adif file.Sent chars in Rx/Tx paneSent serial number (read only)Ser inSer outSerial # inSerial # outSerial numberServer string:Set Viewer SquelchSet level for good viewingSet the number of characters per rowSet the sound card PCM levelSettingsShift-key macro setShort description of antennaShowShow DXCC entitiesShow alert window:Show all modesShow bandwidth tracks on waterfallShow channelsShow cursor with bandwidth linesShow cursor with center lineShow fewer modesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallSideband:SigLvlSignal BrowserSignal Level ColorsSignal browserSignal levelSignal range (dB)Signal searchSignal tracksSize:Slow (4 msec)Slow CPU (less than 700MHz)Software reversal of left-right audio channelsSort by Date/Time OFFSort by date/time OFF - effects all ADIF/Cabrillo reportsSound CardSpeed (WPM):SpotSpotterSpottingSpotting disabledSquelchSquelch levelSquelch open (sec)StStartStart DateStart date for exportStart flampStart fllogStart flnetStart flrigStart of transmit PTT delayStart prog1Start prog2Start prog3Starting numberStateState must matchStationStation heard twiceStations grid squareStop DateStop bitsStopbitsStore mode and frequency Right click for listSys ColorsSystemT/RTX PowerTX WPMTX offsetTX ppmTX sound card correctionTab ColorTabsTabular data sourcesTalkerTalker Socket (MS only)TemperatureTestTest Signal - Do NOT use with transmitterTest charTest character for QSK adjustmentTest commandTest...Text CaptureText HighlightingText file to insertText i/oText...That crazy fox jumped over the dog again! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~The RsID notification message contents and display characteristics are configured on the "Notifications" configure dialog.The default CW speedThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The test string did not match this event's search pattern.The wizard will guide you through the basic fldigi settingsThis event's regular expression is invalid.ThorTimeTime (s):Time OFFTime ONTime OffTime OnTime QSO endedTime QSO startedTime between retires in msecTime needed: Time span overTimed outTimeout (secs)TimingTiming and QSKTo whom the connection is madeToggleTonesTrackingTransceiver controlTransfer speed, X1-normalTransmitTransmit PowerTransmit all text in lower caseTransmit callsignTransmit fontTransmit mode IDTransmit modesTransmit power usedTransmit signalTransmit video textTransmit widthTransmit/ReceiveTriangularTrigger limit (s):TuneTwo bars (scheme 1)Two bars (scheme 2)Two bars (scheme 3)Two bars (scheme 4)Two bars (scheme 5)Two bars (scheme 6)TxTx bkgndTx fontTx level attenuator (dB)Tx power used for logbook entriesTxIDUIUI languageUI schemeUS StateUS state of station workedUndoUnsupported formatUpdateUpdate the current recordUpperUpper limitUpper signal level (dB)Use "cr cr lf" for "cr lf"Use '(' paren not KNUse CD or hard drive CD imageUse DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse Line-In deviceUse OSS audio serverUse Open to select descriptor fileUse Port Audio serverUse Pulse Audio serverUse RTSUse RigCATUse XML-RPC programUse averaging to decrease waterfall noiseUse colored buttonsUse cross hair scopeUse date/time off for log entryUse for triggering amplifier carrier detectUse leading zerosUse microphone inputUse parallel port PTTUse separate serial port PTTUse small fontUser IDUser InterfaceUser nameUsing UDP port #VSP EnableVerboseVersion %s is available at %s What would you like to do?VideoVideo ID modesVideo Preamble IDViewView/Hide ChannelsVirtual Serial Port Emulator - suppress WARNINGSVisible modesVisit Hamcall web siteVisit QRZ web siteVisit URLVisit hamQTH web siteWF CtrlsWF MagnificationWF carrierWF modeWXWarningWaterfallWaterfall / FFT / ScopeWaterfall controlsWaterfall drop speedWaterfall height in pixelsWaterfall video IDWaterfall video textWavWav write sample rateWaveform Audio Format *.wav AU *.{au,snd} WebWeb Browser lookupWefaxWeight (%)Wheel actionWhen no signal presentWhere generated KML documents are stored.WideWill occur after this time in secondsWind speed/dirWord delimitersWord wrapWrite current macro set on program exitWrite delay (ms)XMITXML-RPCXON/XOFF flow controlXY - classic scopeYesYou are running the latest versionYou need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour login nameYour login passwordaaafterat:automatic data uploadcall signcallsign tooltips in received textchannels != 1charscty.dat pathnamecurrent wx conditionsdBdefault text to send with etcdefault uses date/time oneQSLeQSL userenable mouse wheel control of macro barflamp:fllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrig:free form exchangefrequency kHzh/w ptt device-pinie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for databasein:kilometers / hourmbarsminutesrcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500reportreport Celsiusreport Fahrenheitreport kilometers per hourreport miles per hourreport millibarsreportssecondsseek - regular expressionselect browser fontselect by datesend when logged (log button, , )track colorunknown wave file errorwaterfall-only mode{NAME} other ops nameProject-Id-Version: fldigi 3.21.76AP Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com POT-Creation-Date: 2014-03-22 11:18-0500 PO-Revision-Date: 2013-10-21 13:07+0100 Last-Translator: Marc Richter Language-Team: German (Marc Richter) Language: German MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: German X-Poedit-Country: GERMANY X-Poedit-SourceCharset: iso-8859-1 in # R# Einträge im Logbuch# S# Wiederholungen bevor ich aufgebe ;)# Versuche das Kommando erneut zu senden, dann Aufgabe%s Logbuch erstellt am %s%s: existiert nicht, soll es (neu) erstellt werden?ÜberKonfiguration&Contest FelderDatei&Hilfe&Logbuch&MFSK Bilder&OkayGUIAnsicht&Wetter Fax Bilder RX&Wetter Fax Bilder TX**.exe... Diese Einstellungen lassen sich auch auf anderen Registerkarten ändern sie wurden der Einfachheit halber auch hier aufgeführt ...0 = T; 9 = N1000 Hz Ton falls PTT eingeschaltet Kann anstelle oder zusätzlich zu anderen PTT Typen verwendet werden14070.150500 Hz Limit: AFC ein, aus, umschalten Meine Antenne genutztes Band Rufzeichen der andere Station Log Felder löschen Empfangsbereich löschen Sendebereich löschen Contestzähler nicht gesendeter Text CW Kennung Zähler verringern [warten][länge](msek) logge eQSL mit optionaler Nachricht eQSL loggen Textdatei einfügen Gültiger TRX Filter Breite Meine Frequenz Text nach NAME/QTH Gehe zu Frequenz NNNN Hz Sende Betriebsart ID in Video Text Ruhesignal für NN.nn sek LDT im ISO-8601 Format MFSK Bild einfügen Zähler erhöhen S/N etc. IMD etc. ZDT im ISO-8601 Format Lokale Zeit JJJ-MM-TT Lokales Datum/Uhrzeit QSO Daten speichern, und Nachricht anhängen Loggen mit xmt Zeit Locator der andere Station saveQSO data, append msg to notes QSO Daten speichern Lokale Zeit SSMM Makro Definitionsdatei ändern Karte mit Werten darstellen Google Karte Betriebsart Mein Rufzeichen Mein Locator Mein Name Mein QTH Mein RST Name des anderen OP Sende |NN| aufeinanderfolgende RsID Signale Nächster QSO Eintrag # Sendepause QRG in RX Feld einfügen # Anzahl QSO Einträge QSO Zeit (SSMM)) qsy um kHz, Hz Rechts Klick QSY Button Links Klick QSY Button QTH der anderen Station Makros kontinuierlich wiederholen Sende CAT Kommando Gültiger TRX Modus CW Anstiegszeit RST der anderen Station Empfang Rx RSID ein, aus, umschalten Gegenwärtiges Makro speichern Austaucsh gegeben speichern Suche abwärts nach Signal Suche aufwärts nach Signal Digitalk On, Off, Toggle Video Text Wiederhole alle NN sek Abstimmsignal für NN sek Umschalten T/R Senden setze xmt Abschwächer TX RSID ein, aus, umschalten Fldigi version xmt verzögern für NN sek CW WPM:Farnswoth Wetterdaten für Station abrufen Wetterdaten abrufen Austausch beginnt Austausch endet Austausch erhalten Austausch gegeben Zulu Datum JJJJ-MM-TT Z UTC Datum und Zeit Zulu Zeit SSMMzADIFAFCAFC VerhaltenAFC Bereich (Hz)AFC Bereich oder BWAFC GeschwindigkeitAFC Tracking GeschwindigkeitALTRARQ SteuerungAbbruchAbbruchAktionHinzufügenCRLF nach jeder Seitebreite einfügenRsID Signal an Ende der Übertragung anhängenAktuelle Frequenz hinzufügenMixersteuerungen zu Hauptdialog hinzufügenAdresse:Cursor Frequenz einstellenDSP Bandbreite einstellenFortgeschrittene KonfigurationAllesAlle hier getätigten Einstellungen können später auch noch über das Konfigurationsmenu geändert werdenFehler erlaubenAlternative Zeichenfarbe im Rx PanelImmer LSBImmer USBAudio Frequenzen immer anzeigenNeue Modems (Betriebsarten) immer bei diesen Frequenzen beginnenAntenne:Erscheinungsbild der KanalbeschriftungRX Text anhängenTX Text anhängenAnwendenAudioAudio Gerät InformationenAudiogerät Information nur für PortAudio Backends verfügbarAudio GeräteAudio DateiAudio FrequenzAudioeingabegerätAudio oder HF Frequenzen auf WF SkalaAudioausgabegerätAuto CRLF LeitungslängeAutomatisch verbinden, wenn Fldigi startet (der Server muss ereichbar sein)Folgende Programme automatisch mit Fldigi startenLand und Azimuth automatisch füllenAutomatisch CRLFAGCAutomatisch Rx Geschwindigkeit verfolgenAutomatisch Rufzeichen in decodiertem Text suchenAutostartVerfügbare TeilreihenAzimuthZurückHgrundHintergrundfarbe für Funktionstaste Gruppe 1Hintergrundfarbe für Funktionstaste Gruppe 2Hintergrundfarbe für Funktionstaste Gruppe 3Hintergrundfarbe des Signalbetrachters / RauschkontrolleBandBänder müssen übereinstimmenBandbreiteLuftdruckBaudrateBaud Rate:Leitfaden für AnfängerVerhalten von s/n imdHGrundfarbeBits pro ZeichenSuchenBrowserBrowser LinienfarbenPrompt um Log Datei zu speichernInformationen zur KompilierungKnopfSchaltflächenLänderCAT Kommando für PTTCONTCPUCPU Auslastung steigt mit Höhe der Wasserfall PixelCQ ZoneCQZCR-CR-LFCSV...STRGCWCW ID ModiCW Postamble IDCW QSK Signal auf dem rechten KanalCW DSP Filter BandbreiteCW ist LSBCW Sendegeschwidigkeit in WPMCabrillo EinstellungenCabrillo...CallRufzeichen nachschlagenRufzeichen SucheRufzeichen bereits gearbeitetCallbook.info Abfrage (Kostenloser Service nur für US Rufzeichen)RufzeichenRufzeichen DatenbankRufzeichen:Kann anstelle oder zusätzlich zu anderen PTT Typen verwendet werdenKanadische ProvinzAbbrechenAufnahmeAufnahme- und WiedergabegerätAufnahmegerätEmpfangenen Text in eine Datei schreibenSignale über diesem Schwellwert erfassenAufnahme:Trägerfrequenz (Hz)TrägerverschiebungCelsiusAnzeige auf Signal zentrierenZentrum im Durchlassbereich Rechte Maustaste macht rückgängigMittellinieÄndern der # des PSK BetrachtersDies NUR zum experimentieren ändernLook and feel der Anwendung ändernFarbe ändernVerzeichnis...Log Level ändernWechseln zu MakrodateiWasserfall Skala ändernÄnderungen werden erst beim nächsten Programmstart wirksamBeschriftung / KanäleKanal NummerKanäle; der erste Kanal beginnt an Wasserfall UntergrenzeZeichen/ReiheAlles prüfenÜberprüfen auf DupliakteNach Updates suchenBei Programmstart nach Updates suchenÜberprüfe auf Updates...Diese Option aktivieren um bei RSID Empfang benachrichtigt zu werden ohne Betriebsart und Frequenz zu ändernAktivieren um CPU Last bei RTTY und PSK zu reduzierenÜberprüfe auf verfügbare Updates...Verzeichnis wählen in dem die KML Dateien gespeichert werden sollenStadtHeimatstadt der gearbeiteten StationKML Daten jetzt aufräumenLöschen bei ProgrammstartKML Dokumente aufräumen, Google Earth Anzeige löschenLöschenAlles löschenText im Kanal nach # sekunden inaktivität löschenListe löschenListe löschen?Log Felder mit RST In 599 löschenLog Felder mit RST Out 599 löschenLogeinträge löschen nach speichern oder Makro Log Einträge löschen?Löschen nach speichernClient/Server LogbuchSchließen Liste schließenFarbeFarbe der MarkierungsspurFarben && SchriftartFarben und CursorFarben/SchriftBefehlszeilenoptionenKommando zur KML File ErstellungEcho KommandoBedingungenBestätigungBitte bestätigen für ResetBeenden bestätigenMit Server verbindenVerbinden/Trennen von Talker Socket ServerCont'ContestContest Austausch InContest Austausch Information erhaltenContest Austausch Information gesendetContest Seriennummer # empfangenContest Seriennummer # gesendetContest:KontinentKontinuierliches ScrollenControl-Zeichen in Rx / Tx BereichBedienelementeRufzeichen in GrossbuchstabenKonverterKopierenAdresse kopierenKorrekturenKonnte nicht nach Updates suchen: %sKonnte kein Verzeichnis erstellenKonnte Adresse nicht öffnen: %s Konnte keinen Web Browser starten: %s Diese Adresse manuell öffnen: %sKonnte flmsg nicht startenLandLand der gearbeiteten StationLand1000 Hz Rechtecksignal auf dem rechten Kanal erzeugenNeues Logbuch erstellen?Cabrillo Report erzeugenSonnenflecke erstellenBenutzerdefinierte VerschiebungIndivduelle VolltextsucheIndividuellAusschneidenDTMFDTR +12DTR +12VDTR = +VDTR ist PTT Signal AnschlussDTR ist PTT AnschlussDXCCDXCC BezeichnerDXCC DatensätzeDXCC DatensätzeIn Datenbank nachschlagenVerzeichnis für DatenQuelle für DatendateiDatendatei updateDaten Dateien...Daten QuelleDatumDatum offDatum anDatum wann QSO beeendetStartdatum QSODatum/Zeit EIN == AUSDebugDTMF Töne dekodierenStandardStandard 800 Hz. Deutscher Wetterdienst 850HzStandard CW Tracking PunktStandard RST ist 599Standard Ausgangs RST ist 599Standard RTTY Tracking PunktStandard WPMStandard für alle anderen ModemsStandard Empfangs / Sende FrequenzStandard NachrichtStandard Testreihe ist: "Standard FadenkreuzStandardNN msek Verzögerung bevor Audio StartLöschenAus Liste löschenAktuellen Eintrag löschenDeaktivierenErkannter SignalpegelNachweisgrenzeDetektor Schwelle hochDetektor Schwelle niedrigGerät:GeräteWählenUnterschied zwischen Rx && Tx Frequenz (rig Offset)ZiffernfarbeZiffernDimVerzeichnisWarnmeldungen ausschaltenAlles ausFalls RSID aktiviert, weitere Erkennung ausschaltenAuf sehr langsamen CPUs ausschalten, falls Signal Browser nicht benutzt wirdSpotting nur aktivieren, wenn Signale im Browser sichtbar sind.Detektor ausschaltenAnzeigeMakro Dateiname bei Programmstart anzeigenAnzeige von TX und RX im Fldigi Hauptfenster Wird nach Neustart aktivRsID Warnmeldung nicht anzeigenRufzeichen Datenbank nicht verwendenRufzeichen Lookup via Web Browser nicht verwendenAngedocktes ScopeDomNicht speichernDoppelklicken, um zu erfassenZiehen auf Wasserfall Skala ändert FrequenzDuplikateDublettenprüfung Call plusDuplikateKantenformFlankensteilheitEingebetteter Wefax GUIBei Programmstart KML Datein leerenLeere ADIF Logbuch Datei %sEinschaltenEinschalten -Aktivieren / Deaktivieren der Symbole in MenüsAktivieren / Deaktivieren der TooltippsDSP vor dem Dekoder aktivierenMultiPSK kompatible FEC einschaltenAlles einAktivieren, um entsprechendes Bedienelement anzuzeigenFür sehr schwache Signale einschaltenAktivieren, wenn Sie nicht die mittlere Maustaste verwenden könnenEinschalten, falls der PC nicht sauber dekodiertDiesen Eintrag aktivieren wenn Fldigi zum ersten Mal startetAktivieren um Datumsbereich auszuwählenEingeschaltetEnde der xmt IDPort # des zugewiesenen Servers eingebenAdresse des Servers eingebenTRX FreqBitte Rufzeichen eingeben!Frequenz eingeben oder ändern mit Links/rechts/hoch/runter/Bild_hoch/Bild_runterVollständigen Dateinamen/Pfad für cty.dat Datei eingebenVollen Dateinamen zu externem Programm eingeben oder einfacher Name des ProgrammsDateipfad zu flmsg eingebenTest String eingeben, oder freilassen für StandardZeitspanne in Minuten eingebenFehlerFehler beim lesen von %sGeradeGerade linienEreignisEreignisprotokollExExchange InExchange OutAustauschAusführbare Datei einfügenBefehl auf KML Datei anwendenBeendenAufforderung zum BeendenAufforderung zum speichern nur aktiv wenn Fldigi via 'Beenden' Menu geschlossen wird. Nicht aber, wenn Fldigi anderweitig beendet wird.ExperimentellExport SetupIn ADIF Datei exportierenIn CSV Datei exportierenExportieren in Datei mit festen FeldernExportieren...Dateien extrahieren um sie mit externem Programm "wrap / flmsg zu nutzenF-WPMFECFFT / FIR FilterFFT VerarbeitungFFT MittelungFFT FilterFFT Vorfilter FensterfunktionFLMSG Dateien...F_TastenFahrenheitSchnell (2 msek)Verzeichnis für Fax BilderSie können jederzeit eine Seite überspringen oder den Assistenten beendenFeldNur Datei Ein/AusgabeLand und Azimuth mit Informationen aus cty.dat Datei füllenFilterFilter FormfaktorFilter BandbreiteFilter Bandbreiten FaktorFilter Bandbreite relativ zur Signal BreiteFilterungLand findenFinde nächstesPrefix finden:Finde vorherigesFindeFertigFeste IntervalleFldigi Konfiguration...Fldigi KonfigurationFldigi Konfigurations AssistentFldigi Makro Definitions Datei *.{mdf}Fldigi Palette *.palFldigi radio xml Definitions DateiFldigi Webseite...OszilloskopOrdnerSchriftSchriftfarbeSchrift...Schrift:RST immer 599 für ein/aus forcierenRufzeichen in Grossbuchstaben erzwingenKanalabstand auf gerade 100 Hz erzwingenDatum/Zeit ON == Datum/Zeit OFF forcierenAudio Ausgabe auf einem Kanal erzwingenFreier Lossless Audio Codec *.flacKostenloser Service mit freundlicher Genehmigung von OKFreqFrequenzFrequenzFrequenz in MHzFrequenz SkalaFrequenzverschiebung (800 Hz)Frq AnzVollständigVollständiger BerichtAllgemeinErzeuge 1000 Hz Rechtecksignal auf dem rechten KanalErzeuge ein Rechtecksignal auf dem rechten KanalGruppe 1Gruppe 2Gruppe 3Halbierte EmpfangsbreiteHamcall online mit dem Standard BrowserHamQTH mit dem Standard BrowserHamQTH.com (freier Service http://www.hamqth.com)Hamcall.netHamlibHamlib zur Radio Steuerung verwendetHardware PTTHiLite1HiLite2Sendefenster verbergenSendefenster verbergen als StandardFenster nach (s) verbergen:HochGrenzfrequenz in HzHost:IDIDsIOTAITU ZoneITUZDuplikate ignorierenEinZeitlimit für InaktivitätSendefrequenz hinzufügenInclusive Stoppdatum für den ExportInformationAnfängliche Spannung an DTRAnfängliche Spanung an RTSInitialisierenRigCAT Interface initialisierenXML-RPC Radio Steuerung initialisierenHamlib Interface initialisierenHardware PTT initialisierenQSO logging Felder initialisierenSocket Client initialisierenEingang Träger VerschiebungStandard Text einfügenDatei einfügen...Führende Nullen in Xmtd Serien Nummer einfügenMarkierung einfügenText einfügenEinfügen von Text per einfachem LinksklickInteressante HinweiseIslands on the air (IOTA)K3 A1A KonfiguationKMLKML Datei VerzeichnisKML Auffrisch Intervall (sekunden)KML Wurzel DateisystemLOCLabelLetztes QSOBitte freilassen, oder http://www.pulseaudio.org/wiki/ServerStrings lesenKlick links - Ausführen Fkey - Ausführen Klick rechts - EditierenLinks Klick - ausführen Shift-Fkey - ausführen Rechts Klick - editierenLinker und rechter Kanal enthalten Modem AudioKlick links - Auswählen Klick rechts - Zeile löschenKlick links um Text zu löschen Klick rechts für Frequenz resetLinksklick um Farbe für Duplikate zu wählenLinks Klick: Betiebsart ändern Rechts Klick: KonfigurierenLinks/rechts klick ersetzt Audio HistorieLizenz GPLv3+: GNU GPL version 3 oder später Dies ist freie Software, Sie können sie verändern und weitergeben. Es gibt KEINE GARANTIE soweit gesetzlich zulässig. Farbmarkierte ButtonBeschränkt auf ein paar Zeichen, wie in CQEM oder IOTA etc.Line inAuf Signale aus diesem Bereich hörenLkLadenNeue Palette ladenBild ladenLaden der zuletzt verwendeten Makro Datei bei ProgrammstartBilddatei laden- oder hierher ziehen Unterstützte Dateitypen: PNG, JPEG, BMPLadenLocatorfindenFinde cty.dat DateiAusführbare Datei findenflamp.exe Datei findenfllog.exe Datei findenflmsg findenflmsg Datei findenflnet.exe Datei findenFlrig.exe Datei findenProgrammdatei #1 findenProgrammdatei #2 findenProgrammdatei #3 findenLocatorLocator:Sendefrequenz sperrenLogNavtex Nachrichten nach ADIF loggenNavtex Nachrichten nach KML loggenRTTY Frequenz loggenWetterfax Nachrichten nach ADIF loggenRX/TX Text aufzeichnenLog Datei QuelleLogbuchLogbuch DialogLoggingProtokoll BedienelementeRufzeichen nachschlagenLoTW BenutzerNiedrigGering = 0 Fehler Mittel = 1 Fehler Hoch = 2 FehlerUntere Grenzfrequenz in HzUntereruntere GrenzeMFSK Bild ladenMT-63Beschriftung für ButtonMakro TextMakro Editor - MakrosMaidenhead LocatorMaidenhead Locator wie z.B: JO40hmMail Server MerkmaleMischer verwaltenAngepasster FilterAngepasste Filter BandbreiteMediumADIF Dateien zusammenfuehrenZusammenführen...MikrofonMeilen pro StundeMinimale SteuerungselementeMinimale Zeit zwischen EreignissenDiversesMixerBetriebsartVerwendete BetriebsartModus muss übereinstimmenBetriebs Bandbreiten BegrenzungModemModem TrägerModem Signal auf dem linken und rechten KanalModemsSendesignal überwachenMono Audio AusgabeMausMausrad aktiv bei Makrosmsek zwischen einem erneuten VersuchMultikanal Signal VerarbeitungMulti-Kanal DetektorMein Rufzeichen de CALLMeine Sendegeschwindikgeit WPMNBEMSNBEMS Datendatei SchnittstelleNBEMS Dateien...KEIN AUDIO GERÄT VERFÜGBAR (oder testen)KEIN RUFZEICHEN ANGEGEBENNameName:NavtexNeuNeuer Eintrag / Eintrag speichern Weiter NmNeinNicht schneller als diesesKein Dateiname angegebenKein Radio ausgewähltNicht langsamer als diesesRauschen einschaltenKeineNormalNoch nicht zuvor gearbeitetNotch (Kerbfilter)BemerkungenMitteilungenNur BenachrichtigenAnzahl und Position der MakroreihenAnzahl der Stellen in SeriennummerOkayEinEIN - kleine Schrift AUS - grosse SchriftEIN - mit Standard beginnen AUS - halte aktuelle WF Cursor PositionEIN - Letzten Makrosatz verwenden AUS - Standardsatz verwendenOSSOSS MixerUngeradeUngerade LinienAusOliviaOnEin/AusEine Reihe (über dem Wasserfall)Eine Reihe (unter dem Wasserfall)Online Dokumentation (Englisch)...OpBetriebsartÖffnen ...Liste öffnenDatei mit dem Standard Browser öffnenIm Browser öffnenLogbuch Datei oeffnenMakrodatei ladenNachrichten Ordner öffnenNachricht mit flmsg öffnenPalette öffnenRadio xml Datei öffnenRauschsperre öffnen für nn sek falls RSID erkannt wurdeMit flmsg öffnenÖffnenÖffnet NBEMS Dateiordner nach erfolgreichem EmpfangBenutzerBenutzer InformationenBenutzer NameOperator gearbeitetBenutzer QTHBenutzer RufzeichenName des BenutzersOptionale Konfiguration im Format: Parameter=wert ...OptionenAndereanderes RufzeichenAnderer NameAusÜberPCMPSKPSK ReporterPSK und anderePSK/RTTY Betrachter Farbe HiLite 1PSK/RTTY Betrachter Farbe HiLite 2PTT Verzögerung gilt für alle CAT/PTT TypenPTT Ende SendeverzögerungPTT ist CAT Kommando (kein Hardware)PTT ist ein Hamlib KommandoPTT Ton auf dem rechten Audio KanalPTT via Hamlib KommandoPalette: ParitätEingehenden Text auswertenPasswortEinfügenPfade (verborgen)Baudrate aus Liste auswählenWiedergabeWiedergabe in Endlosschleife?WiedergabegerätWiedergabe:Bitte zuerst das Rufzeichen eintragenPopup Info nach 2 sek über dem Rufzeichen schwebenPort:PortAudioPrPräamble Erkennung/DetektionEingabetaste drücken um weiter zu suchenKlicken für updateKlick um QSO Startzeit zu aktualisierenPrimäres Makro aktivierenZeichen bei CW / RTTY / THROB / CONTESTIA in KleinbuchstabenProg 1:Prog 2:Prog 3:Prompt Konfiguration speichernPrompt Log Datei speichernAufforderung Log Datei speichernPrompt Makro Datei speichernAufforderung zum speichern der Makrodatei bei beendenProvinzProvinz der gearbeiteten StationPseudeo FSK - rechter KanalPseudo FSK auf dem rechten Audio KanalPskmailPulseformPulseAudioPwrQRZQRZ CDROMQRZ online via Standard Internet BrowserQRZ.comQRZ/eQSLQSKQSK im rechten Audio KanalQSL erhaltenQSL bekommen an diesem TagQSL gesendetQSL gesendet an diesem TagQSL-VIAQSL empfangenQSL gesendetQSO DatumQSO Datum EndeQSO Datum StartQSO BeendetQSO LoggingVerbindung darf nicht innerhalb eines Zeitraums von auftretenQSO StartzeitQSYQTHQTH SpitznameQTH:QthSchneller EintragWeniger EinträgeRE:RPCRSID EmpfangRST immer 599 sendenRST empfangenRST gesendetRST(r)RST +12RTS +12 VRTS = +VRTS ist PTT Signal AnschlussRTS is PTT AnschlussRTS/CTS FlusskontrolleRTTYRTTY Osztilloskop AnzeigeEmpfangs MitschnittRX ppmRX Soundkarten KorrekturRadio FrequenzBereich +/- wpmBereich WPMSchriftarten einlesen ...Eintrag "%s" wirklich löschen?Möchten Sie wirklich beenden?EmpfangenEmpfangs FilterbandbreiteRx BetriebsartenEmpfangenes RSTEmpfangene SeriennummerNeueste Aktivität für GridEmpfang von flmsg DateienEmpfangsberichte...Erneut VerbindenEinträgeRechteckReed-Solomon ID (Rx)Reed-Solomon ID (Tx)Neu ladencty.dat erneut ladenEntfernenBerichte Radio Frequenz (bitte nur benutzen wenn Sie Rigcontrol haben!)ReporteResetAlle Einstellungen auf Standard zurücksetzen? Reset wird mit dem nächsten Neustart von Fldigi wirksam Die Dateien: fldigi_def.xml und fldigi.prefs werden gelöscht! Hamlib Interface zurücksetzenRigCAT Interface zurücksetzenZurücksetzen auf TrägerWiederherstellen der Einstellungen bei beendenWiederherstellung des cty.dat StandardordnersStd wiederherstellenZurücksetzen der seriellen (COM) Port-EinstellungenWiederholungenAbrufen für aktive Modem NutzungWiederholungsintervall (ms)Wiederholungs Intervall (ms)RevUmkehrenLinken/rechten Kanal vertauschenReverse VideoZurücksetzenRadioRadio Steuerung via xml Spec DateiRadio SteuerungRadio Steuerung und ContestRadio Steuerung und LoggingRadio Steuerung via externem Programm über xmlrpc remote callsRadio Konfigurations Datei:Radio ModusRadio erfordert RTS/CTS AblaufsteuerungRadio erfordert Xon/Xoff AblaufsteuerungRadio verwendet RTS/CTS HandshakeRadio:RigCATRigCAT wird für Radio Steuerung verwendetRechter KanalRsIDRST empfangenRST gesendetProgramm ausführenProgramm starten:RxEmpfangs Text aufnehmenRx WPMRx HGrundRx SchriftRx/TxRxIDS/N und IMD VerhaltenSELSKIPSOM DekodierungSQL-1SQL-2AbtastrateSpeichernSpeichern ...Einstellungen speichernEmpfangenen Text speichern, Zeichenweise in folgende Datei: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Speichern als...Geändertes Logbuch speichern?Geänderte Einstellungen speichern?Geänderte Makros speichern?Aktuellen Log Eintrag speichern?Bilder monochrome (einfarbig) speichernLogbuch Datei speichernMakrodatei speichernFarbpalette speichernText speichern alsFax Bilder als Graustufen PNG Datei speichernDiese Palette speichernSpeichernOszilloskopBlätternScoll HinweiseSuche nach diesem RufzeichenSuche im InternetSuchbereich (Hz)Durchlassbereich durchsuchenSekundärer TextSekundenAuswählenAuswählen # bits / ZeichenStopbits # wählenAlles wählenCabrillo Contest & Felder auswählenZu exportierende Felder wählenMixer Gerät auswählenWählen Sie die zu exportierenden DatensätzeRx/Tx Zeichensatz auswählenSende Rasterschriftart auswählenKennzeichnung auswählenBandbreite auswählenTräber Baudrate wählenTrägerverschiebung wählenGerät auswählenAuswählen wie sich das Mausrad innerhalb des Wasserfalls verhältLinie auswählenModi für Zugriff auf MenüAnzahl der Töne auswählenWählen der BetriebsparameterParität auswählenRadio Beschreibungsdatei auswählenFFT Vorfilter wählenDies nur wählen für Elecraft K3 Andere Radios benötigen dies nicht.Wasserfall Skala Schrift wählenAuswahl Hintergrundfarbe in Rx Tx PanelSelbstorganisierende Karte (SOM)Rufzeichen in CW am Ende jeder Übertragung sendenSende einen kontinuierlichen Datenstrom an TestzeichenMit dieser Geschwindigkeit sendenKontinuierlich sendenBild sendenBild senden...Empfangsbericht nur senden wenn QSO geloggt wurdeSendebericht nur wenn QSO geloggt wurdeGesendet:Gesendetes RSTGesendete und empfangene faxe nach ADIF loggenGesendete Zeichen in Rx/Tx BereichSende Fortlaufende Nummer Contest (nur lesen)SNummer einSNummer ausSNummer # einSNummer # ausSeriennummerServer StringRauschsperre für Viewer setzenPegel für beste Sicht einstellenSetzen Sie die Anzahl der Zeichen pro ZeileSoundkarten PCM Pegel einstellenEinstellungenShift-Taste Makro setzenKurzbeschreibung der AntenneAnzeigenZeige DXCC DatensätzeZeige Alarm FensterZeige alle BetriebssartenBandbreiten Spur im Wasserfall anzeigenZeige KanäleZeige Cursor mit BandbreitenlinienCursor mit Mittellinie zeigenWeniger Betriebsarten anzeigenMakro Editor anzeigenZeige mehr oder weniger WasserfallMenu Symbole zeigenPasswort im Klartext anzeigenTooltipps anzeigenSendesignal am Wasserfall zeigenSeitenband:PegelSignal BrowserSignalpegel FarbeSignal BrowserSignalpegelSignalbereich (dB)Signal sucheSignalspurenGröße:Langsam (4 msek)Langsame CPU (weniger als 700MHz)Software umkehrung der Audio Kanäle rechts/linksSortieren nach Datum/Zeit ausSortieren nach Datum/Uhrzeit ausgeschaltet - beinflusst alle ADIF / Cabrillo ReportsSoundkarteGeschwindigkeit (WPM):SpotSpotterSpottingSpotting deaktiviertRauschsperreRauschsperren PegelRauschsperre offen (s)StStartStartdatumStartdatum für den ExportStart flampStart fllogStart flnetStart flrigStart der PTT ÜbertragungsverzögungStart prog1Start prog2Start prog3StartnummerStaatBundesstaat muss übereinstimmenStationStation zweimal gehörtGrid Square (Planquadrat) der StationStoppdatumStopbitsStopbitsSpeichere Betriebsart und Frequenz Rechts Klick für ListeSys FarbenSystemT/RSendeleistungTX WPMTX OffsetTX ppmTX Soundkarten KorrekturFarbeRegisterkarteDatenquellen und TabellenTalkerTalker Socket (nur Windows)TemperaturTestTest Signal - nicht mit Tranceiver verwendenTestzeichenTestzeichen für QSK EinstellungTest KommandoTest...TexterfassungText hervorhebenTextdatei einfügenText I/OText...That crazy fox jumped over the dog again! ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;<=>?@@[\]^_`{|}~Die RsID Benachrichtigung, deren Inhalte und Anzeige werden konfiguriert unter "Mitteilungen".Standard CW GeschwindigkeitDer Dateiname wurde in den RX Text Bereich geschriebenDas Feld 'regulärer Ausdruck' darf nicht leer sein.Der reguläre Ausdruck muss gültig sein.Die Testreihe entspricht nicht dem Suchmuster des EreignissesDieser Assistent wird Sie durch die grundlegenden Einstellungen führenDer reguläre Ausdruck für dieses Ereignis ist ungültigThorUhrzeitZeit (s):EndzeitStartzeitEndzeitStartzeitQSO beendet umStartzeit QSOZeit zwischen Wiederholungen in msekZeitaufwand: Zeitspanne umTimeoutTimeout (sek)TimingTiming und QSKServer zu welchem die Verbindung hergestellt wirdWechselnTöneVerfolgungTransceiver SteuerungSende Geschwindigkeit, X1-normalSendenSendeleistungGesamten Text in Kleinbuchstaben sendenRufzeichen übertragen (senden)SendeschriftartSendebetriebsarten IDSendebetriebsartenVerwendete SendeleistungSendesignalSende Video TextÜbertragungsbreiteSenden/EmpfangenDreieckTriggerschwelle (s):AbstimmenZwei Reihen (Schema 1)Zwei Reihen (Schema 2)Zwei Reihen (Schema 3)Zwei Reihen (Schema 4)Zwei Reihen (Schema 5)Zwei Reihen (Schema 6)TxTx HGrundTx SchriftTx Dämpfung (dB)Sende Leistung für Logbuch EinträgeTxIDGUISpracheGUI SchemaUS BundesstaatUS Bundesstaat der gearbeiteten StationRückgängigNicht unterstützes FormatUpdateAktuellen Eintrag aktualisierenObererobere GrenzeOberer Signalpegel(dB)Verwende "cr cr lf" für "cr lf"'(' nutzen nicht KNCDROM oder Festplatte verwendenDSP Filter vor dem Dekoder nutzenDTR nutzenFarnsworth Timing nutzenHamlib benutzenLine-In Eingang verwendenOSS Audio Server verwendenÖffnen um Beschreibungsdatei zu verwendenPortAudio Server verwendenPulseAudio Server verwendenRTS nutzenRigCAT nutzenXML-RPC Programm verwendenMittelung verwenden um WF Rauschen zu vermindernFarbige SchaltflächenFadenkreuz verwendenDatum/Zeit off für Logeintrag nutzenVerwenden um eine PA anzusteuernFührende Nullen verwendenMikrofon Eingang verwendenParallel Port für PTT nutzenSeparaten seriellen Port für PTTKleine SchriftartBenutzer IDGUIBenutzernameVerwende UDP Port #VSPAusführlichVersion %s ist verfügbar %s Was kann ich für Sie tun?VideoVideo ID ModiVideo Präambel IDAnzeigenKanäle anzeigen/verbergenVirtueller Seriell Port Emulator - unterdrückt WarnmeldungenSichtbare ModiHamcall Webseite besuchenQRZ Webseite besuchenAdresse im Browser anzeigenHamQTH Webseite besuchenWasserfall KontrolleWF VergrösserungWF TrägerWF ModusWXWarnungWasserfallWasserfall / FFT / OszilloskopWasserfall EinstellungenFallgeschwidigkeit des WasserfallsWasserfall Höhe in PixelnWasserfall Video IDWasserfall Video TextWavWav Abtastrate beim schreibenWaveform Audio Format *.wav AU *.{au,snd} WebVia Web Browser nachschlagenWefaxWichtung (%)Mausrad AktionWenn kein Signal vorliegtWo sollen generierte KML Dateien gespeichert werdenBreiteWird nach dieser Zeit in Sek passierenWind geschw/ RichtungWort TrennzeichenZeilenumbruchAktuelle Makros bei Programmende sichernSchreibvzg (ms)XMITXML-RPCXON/XOFF AblaufsteuerungXY - Klassisches ScopeJaSie arbeiten bereits mit der neuesten VersionSie benötigen ein kostenpflichtiges Hamcall online Abonnement um diesen Service nutzen zu könnenSie benötigen einen kostenpflichtigen QRZ online Zugang um diesen Service zu nutzenIhr AnmeldenameIhr Anmelde Passwortaanachat:Automatischer Daten uploadCallRufzeichen Tooltips in empfangenen TextKanäle =! 1Zeichencty.dat DateinameAktuelle Wetter BedingungendBStandard Text der mit dem Makro gesendet wirdStandard nutzt Datum/Zeit aneQSLeQSL BenutzerMausrad einschalten um Makros zu kontrollierenflamp:fllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrig:Frei Form AustauschFrequenz kHzH/W PTT Geräte Pinz.B.: /home/dave/CALLBK/ or C:/CALLBK/ Freilassen um nach Datenbank zu suchenEingang:Kilometer pro StundembarMinutenrcos timing Koeffizient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500BerichtMelde CelsiusMelde FahrenheitMelde Kilometer pro StundeMelde Meilen pro StundeMillibar berichtenBerichteSekundenSuche - regulärer AusdruckBrowser Schriftart auswählenAuswahl / DatumSenden wenn im Log (log Button, , )SpurfarbeUnbekannter wave file FehlerNur Wasserfall Modus{NAME} Name des anderen OMfldigi-3.21.80/po/es.po0000664000175000017500000051156412313333722011446 00000000000000# Spanish translations for fldigi package # Traducción al español para el paquete fldigi # Copyright (C) 2008 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # Pavel Milanes Costa, CO7WT , 2013. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.21.76AP\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2014-03-22 11:18-0500\n" "PO-Revision-Date: 2013-10-18 10:18-0500\n" "Last-Translator: Pavel Milanes Costa \n" "Language-Team: Spanish (Pavel Milanes Costa) \n" "Language: Spanish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.4\n" #: src/main.cxx:415 #, c-format msgid "%s log started on %s" msgstr "%s log iniciado a %s" #: src/main.cxx:1014 msgid "Bad modem id" msgstr "Id incorrecta de modem" #: src/main.cxx:1021 msgid "Bad frequency" msgstr "Frecuencia errónea" #: src/main.cxx:1152 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licencia GPLv3+: GNU GPL versión 3 o posterior \n" "Esto es un Software Libre: tu eres libre de cambiarlo y redistribuirlo.\n" "No hay GARANTIA, execpto la permitida por la ley.\n" #: src/main.cxx:1377 src/main.cxx:1419 src/main.cxx:1443 src/main.cxx:1457 msgid "Could not make directory " msgstr "No se pudo crear el directorio" #: src/dialogs/fl_digi.cxx:156 msgid "Log all RX/TX text" msgstr "Guardar todo el texto de TX/RX" #: src/dialogs/fl_digi.cxx:157 src/misc/debug.cxx:103 msgid "Rig control" msgstr "Control del radio" #: src/dialogs/fl_digi.cxx:158 src/dialogs/fl_digi.cxx:5455 msgid "Op &Mode" msgstr "&Modo de Operación" #: src/dialogs/fl_digi.cxx:159 msgid "Show fewer modes" msgstr "Mostrar menos modos" #: src/dialogs/fl_digi.cxx:160 msgid "Show all modes" msgstr "Mostrar todos los modos" #: src/dialogs/fl_digi.cxx:164 msgid "&View" msgstr "&Visita" #: src/dialogs/fl_digi.cxx:165 msgid "&MFSK Image" msgstr "Imagen &MFSK" #: src/dialogs/fl_digi.cxx:166 msgid "&Weather Fax Image RX" msgstr "&RX Imagen de Fax meteorológico" #: src/dialogs/fl_digi.cxx:167 msgid "&Weather Fax Image TX" msgstr "&TX Imagen de Fax meteorológico" #: src/dialogs/fl_digi.cxx:168 src/dialogs/confdialog.cxx:5193 msgid "Contest" msgstr "Concurso" #: src/dialogs/fl_digi.cxx:169 msgid "&Contest fields" msgstr "&Campos de concurso" #: src/dialogs/fl_digi.cxx:170 msgid "C&ountries" msgstr "&Paises" #: src/dialogs/fl_digi.cxx:171 msgid "&UI" msgstr "I&U" #: src/dialogs/fl_digi.cxx:172 msgid "Full" msgstr "Completo" #: src/dialogs/fl_digi.cxx:173 src/waterfall/waterfall.cxx:2119 #: src/dialogs/confdialog.cxx:5103 src/dialogs/confdialog.cxx:9806 #: src/dialogs/confdialog.cxx:9836 msgid "None" msgstr "Ninguno" #: src/dialogs/fl_digi.cxx:174 msgid "Rig control and logging" msgstr "Controles del radio y log" #: src/dialogs/fl_digi.cxx:175 msgid "Rig control and contest" msgstr "Controles del radio y concursos" #: src/dialogs/fl_digi.cxx:176 msgid "Docked scope" msgstr "Osciloscopio empotrado" #: src/dialogs/fl_digi.cxx:177 msgid "Minimal controls" msgstr "Controles mínimos" #: src/dialogs/fl_digi.cxx:178 msgid "Show channels" msgstr "Mostrar canales" #: src/dialogs/fl_digi.cxx:180 msgid "Connect to server" msgstr "Conectar con el Servidor" #: src/dialogs/fl_digi.cxx:591 src/dialogs/fl_digi.cxx:606 #: src/dialogs/fl_digi.cxx:615 src/dialogs/fl_digi.cxx:3354 #: src/dialogs/fl_digi.cxx:3411 src/dialogs/fl_digi.cxx:3474 #: src/dialogs/fl_digi.cxx:5470 src/dialogs/fl_digi.cxx:5514 #: src/dialogs/fl_digi.cxx:5545 msgid "Custom..." msgstr "Personalizar..." #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2763 msgid "Save changed macros?" msgstr "Guardar macros modificadas?" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2415 #: src/dialogs/fl_digi.cxx:2477 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 #: src/dialogs/fl_digi.cxx:3892 src/logbook/logsupport.cxx:585 #: src/misc/configuration.cxx:698 src/dialogs/font_browser.cxx:137 #: src/logbook/lgbook.cxx:447 src/logbook/lgbook.cxx:1056 msgid "Cancel" msgstr "Cancelar" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 #: src/dialogs/fl_digi.cxx:3579 src/dialogs/fl_digi.cxx:4643 #: src/dialogs/fl_digi.cxx:4810 src/dialogs/fl_digi.cxx:4915 #: src/logbook/logsupport.cxx:584 src/dialogs/confdialog.cxx:10249 msgid "Save" msgstr "Guardar" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 msgid "Don't save" msgstr "No guardar" #: src/dialogs/fl_digi.cxx:1749 msgid "No file name given" msgstr "No se ha proporcionado un nombre de fichero" #: src/dialogs/fl_digi.cxx:1752 msgid "Unsupported format" msgstr "Formato no soportado" #: src/dialogs/fl_digi.cxx:1755 msgid "channels != 1" msgstr "canales <> 1" #: src/dialogs/fl_digi.cxx:1758 msgid "unknown wave file error" msgstr "Error desconocido con el fichero de audio wav" #: src/dialogs/fl_digi.cxx:1765 msgid "Spotting disabled" msgstr "Spotting deshabilitado" #: src/dialogs/fl_digi.cxx:1814 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "No pude ejecutar un navegador de internet:\n" "%s\n" "\n" "Abre esta URL manualmente:\n" "%s" #: src/dialogs/fl_digi.cxx:1827 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "No pude abrir la URL:\n" "%s\n" #: src/dialogs/fl_digi.cxx:1878 msgid "Checking for updates..." msgstr "Chequeando si hay actualizaciones..." #: src/dialogs/fl_digi.cxx:1893 #, c-format msgid "" "Could not check for updates:\n" "%s" msgstr "" "No se puede chequear si hay actualizaciones:\n" "%s" #: src/dialogs/fl_digi.cxx:1897 #, c-format msgid "" "Version %s is available at\n" "\n" "%s\n" "\n" "What would you like to do?" msgstr "" "La versión %s está disponible en\n" "\n" "%s\n" "\n" "Que desea hacer?" #: src/dialogs/fl_digi.cxx:1898 src/dialogs/Viewer.cxx:304 #: src/misc/macroedit.cxx:419 src/misc/newinstall.cxx:391 #: src/mfsk/mfsk-pic.cxx:342 src/spot/notify.cxx:519 src/spot/notify.cxx:523 #: src/dialogs/confdialog.cxx:10252 msgid "Close" msgstr "Cerrar" #: src/dialogs/fl_digi.cxx:1898 msgid "Visit URL" msgstr "Visitar la URL" #: src/dialogs/fl_digi.cxx:1898 msgid "Copy URL" msgstr "Copiar la URL" #: src/dialogs/fl_digi.cxx:1910 msgid "You are running the latest version" msgstr "Estas utilizando la última version" #: src/dialogs/fl_digi.cxx:1976 msgid "Sunspot creation underway!" msgstr "Creación de un sunspot en proceso!" #: src/dialogs/fl_digi.cxx:1983 msgid "Audio device information is only available for the PortAudio backend" msgstr "" "La información del dispositivo de audio está solo dispodible cuando se usa " "PortAudio como método de comunicación con el dispositivo" #: src/dialogs/fl_digi.cxx:1992 msgid "Capture device" msgstr "Dispositivo de captura" #: src/dialogs/fl_digi.cxx:1993 msgid "Playback device" msgstr "Dispositivo de reproducción" #: src/dialogs/fl_digi.cxx:1997 msgid "Capture and playback devices" msgstr "Dispositivo de captura y reproducción" #: src/dialogs/fl_digi.cxx:2043 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: No existe, lo creo?" #: src/dialogs/fl_digi.cxx:2043 src/dialogs/fl_digi.cxx:2796 #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 #: src/logbook/logsupport.cxx:251 src/logbook/logsupport.cxx:1047 #: src/misc/configuration.cxx:700 src/soundcard/sound.cxx:306 msgid "No" msgstr "No" #: src/dialogs/fl_digi.cxx:2043 src/dialogs/fl_digi.cxx:2796 #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 #: src/logbook/logsupport.cxx:251 src/logbook/logsupport.cxx:1047 #: src/misc/configuration.cxx:700 src/soundcard/sound.cxx:306 msgid "Yes" msgstr "Si" #: src/dialogs/fl_digi.cxx:2415 msgid "Clear log fields?" msgstr "Limpiar los campos del log?" #: src/dialogs/fl_digi.cxx:2415 src/misc/configuration.cxx:698 #: src/logbook/lgbook.cxx:444 src/logbook/lgbook.cxx:1053 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:2430 msgid "Enter a CALL !" msgstr "Entre un Indicativo!" #: src/dialogs/fl_digi.cxx:2477 src/dialogs/fl_digi.cxx:3892 msgid "Confirm" msgstr "Confirmar" #: src/dialogs/fl_digi.cxx:2751 msgid "Save changed configuration?" msgstr "Guardar los cambios en la configuración?" #: src/dialogs/fl_digi.cxx:2775 msgid "Save current log entry?" msgstr "Guardar los datos del contacto actual en el log?" #: src/dialogs/fl_digi.cxx:2796 msgid "Really want to quit?" msgstr "Realmente quieres terminar?" #: src/dialogs/fl_digi.cxx:3311 src/dialogs/fl_digi.cxx:5451 msgid "&File" msgstr "Archivos" #: src/dialogs/fl_digi.cxx:3313 msgid "Folders" msgstr "Carpetas" #: src/dialogs/fl_digi.cxx:3314 msgid "Fldigi config..." msgstr "Configuración de Fldigi..." #: src/dialogs/fl_digi.cxx:3315 msgid "FLMSG files..." msgstr "Ficheros FLMSG..." #: src/dialogs/fl_digi.cxx:3316 msgid "NBEMS files..." msgstr "Ficheros NBEMS..." #: src/dialogs/fl_digi.cxx:3317 msgid "Data files..." msgstr "Archivos de datos..." #: src/dialogs/fl_digi.cxx:3320 src/dialogs/confdialog.cxx:5617 msgid "Macros" msgstr "Macros" #: src/dialogs/fl_digi.cxx:3321 msgid "Open ..." msgstr "Abrir..." #: src/dialogs/fl_digi.cxx:3322 msgid "Save ..." msgstr "Guardar..." #: src/dialogs/fl_digi.cxx:3325 msgid "Text Capture" msgstr "Captura de Texto" #: src/dialogs/fl_digi.cxx:3330 src/misc/debug.cxx:101 #: src/dialogs/confdialog.cxx:8654 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:3331 msgid "RX capture" msgstr "Capturar RX" #: src/dialogs/fl_digi.cxx:3332 msgid "TX generate" msgstr "Generar TX" #: src/dialogs/fl_digi.cxx:3333 src/dialogs/confdialog.cxx:8754 msgid "Playback" msgstr "Reproducir" #: src/dialogs/fl_digi.cxx:3337 src/dialogs/fl_digi.cxx:5452 msgid "Exit" msgstr "Salir" #: src/dialogs/fl_digi.cxx:3518 src/dialogs/fl_digi.cxx:5585 msgid "&Configure" msgstr "&Configuración" #: src/dialogs/fl_digi.cxx:3519 src/dialogs/confdialog.cxx:4937 msgid "Operator" msgstr "Operador" #: src/dialogs/fl_digi.cxx:3520 msgid "Colors && Fonts" msgstr "Colores y tipografía" #: src/dialogs/fl_digi.cxx:3521 msgid "User Interface" msgstr "Interfaz de Usuario" #: src/dialogs/fl_digi.cxx:3522 src/dialogs/fl_digi.cxx:3556 #: src/dialogs/fl_digi.cxx:5586 src/dialogs/confdialog.cxx:6112 msgid "Waterfall" msgstr "Cascada" #: src/dialogs/fl_digi.cxx:3523 msgid "Waterfall controls" msgstr "Controles de la cascada" #: src/dialogs/fl_digi.cxx:3525 src/dialogs/fl_digi.cxx:5589 #: src/dialogs/confdialog.cxx:6489 msgid "Modems" msgstr "Modems" #: src/dialogs/fl_digi.cxx:3527 src/dialogs/fl_digi.cxx:5588 msgid "Sound Card" msgstr "Dispositivo de sonido" #: src/dialogs/fl_digi.cxx:3528 src/dialogs/fl_digi.cxx:5590 msgid "IDs" msgstr "IDs" #: src/dialogs/fl_digi.cxx:3529 src/dialogs/confdialog.cxx:9220 msgid "Misc" msgstr "Misc." #: src/dialogs/fl_digi.cxx:3530 src/dialogs/confdialog.cxx:10038 msgid "Autostart" msgstr "Autoinicio" #: src/dialogs/fl_digi.cxx:3531 src/dialogs/fl_digi.cxx:5591 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Notificaciones" #: src/dialogs/fl_digi.cxx:3533 msgid "QRZ/eQSL" msgstr "QRZ/eQSL" #: src/dialogs/fl_digi.cxx:3534 src/dialogs/fl_digi.cxx:5592 msgid "Save Config" msgstr "Guardar configuración" #: src/dialogs/fl_digi.cxx:3539 msgid "View/Hide Channels" msgstr "Ver/Ocultar Canales" #: src/dialogs/fl_digi.cxx:3541 msgid "Floating scope" msgstr "Osciloscopio flotante" #: src/dialogs/fl_digi.cxx:3545 msgid "Signal browser" msgstr "Navegador de señal" #: src/dialogs/fl_digi.cxx:3548 msgid "Controls" msgstr "Controles" #: src/dialogs/fl_digi.cxx:3563 msgid "&Logbook" msgstr "&Libro de guardia" #: src/dialogs/fl_digi.cxx:3564 msgid "View" msgstr "&Visita" #: src/dialogs/fl_digi.cxx:3566 msgid "ADIF" msgstr "ADIF" #: src/dialogs/fl_digi.cxx:3567 msgid "Merge..." msgstr "Mezclar ADIF..." #: src/dialogs/fl_digi.cxx:3568 msgid "Export..." msgstr "Exportar..." #: src/dialogs/fl_digi.cxx:3571 msgid "Reports" msgstr "Reportes" #: src/dialogs/fl_digi.cxx:3572 msgid "Text..." msgstr "Texto..." #: src/dialogs/fl_digi.cxx:3573 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:3574 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:3577 src/logbook/logsupport.cxx:593 #: src/logbook/lgbook.cxx:960 msgid "New" msgstr "Nuevo" #: src/dialogs/fl_digi.cxx:3578 src/dialogs/confdialog.cxx:8200 msgid "Open..." msgstr "Abrir..." #: src/dialogs/fl_digi.cxx:3586 msgid "&Help" msgstr "A&yuda" #: src/dialogs/fl_digi.cxx:3589 msgid "Create sunspots" msgstr "Crear un sunspot" #: src/dialogs/fl_digi.cxx:3591 msgid "Beginners' Guide" msgstr "Guía del principiante" #: src/dialogs/fl_digi.cxx:3592 msgid "Online documentation..." msgstr "Documentación en internet..." #: src/dialogs/fl_digi.cxx:3593 msgid "Fldigi web site..." msgstr "Sitio web de Fldigi..." #: src/dialogs/fl_digi.cxx:3594 msgid "Reception reports..." msgstr "Reportes de recepción..." #: src/dialogs/fl_digi.cxx:3595 msgid "Command line options" msgstr "Opciones de linea de comandos" #: src/dialogs/fl_digi.cxx:3596 msgid "Audio device info" msgstr "Información de los dispositivos de audio" #: src/dialogs/fl_digi.cxx:3597 msgid "Build info" msgstr "Información de compilación" #: src/dialogs/fl_digi.cxx:3598 src/misc/debug.cxx:137 msgid "Event log" msgstr "Log de eventos" #: src/dialogs/fl_digi.cxx:3599 msgid "Check for updates..." msgstr "Comprobar si existen actualizaciones" #: src/dialogs/fl_digi.cxx:3600 msgid "&About" msgstr "&Acerca de" #: src/dialogs/fl_digi.cxx:3834 msgid "waterfall-only mode" msgstr "Modo de solo cascada" #: src/dialogs/fl_digi.cxx:3836 msgid "NO CALLSIGN SET" msgstr "NO SE HA DEFINIDO UN INDICATIVO" #: src/dialogs/fl_digi.cxx:3851 msgid "Close List" msgstr "Cerrar lista" #: src/dialogs/fl_digi.cxx:3861 src/dialogs/fl_digi.cxx:4491 #: src/dialogs/fl_digi.cxx:4789 src/dialogs/fl_digi.cxx:4901 msgid "Open List" msgstr "Lista abierta" #: src/dialogs/fl_digi.cxx:3892 msgid "Clear list?" msgstr "Limpiar la lista?" #: src/dialogs/fl_digi.cxx:3925 msgid "report" msgstr "reporte" #: src/dialogs/fl_digi.cxx:3925 msgid "reports" msgstr "reportes" #: src/dialogs/fl_digi.cxx:3935 msgid "Recent activity for grid" msgstr "Actividad reciente para el localizador" #: src/dialogs/fl_digi.cxx:4485 msgid "No rig specified" msgstr "No se ha especificado un radio" #: src/dialogs/fl_digi.cxx:4562 src/spot/notify.cxx:215 #: src/dialogs/confdialog.cxx:5181 msgid "Select" msgstr "Selecciona" #: src/dialogs/fl_digi.cxx:4569 msgid "Add current frequency" msgstr "Añadir la frecuencia actual" #: src/dialogs/fl_digi.cxx:4576 msgid "Clear list" msgstr "Limpiar lista" #: src/dialogs/fl_digi.cxx:4583 msgid "Delete from list" msgstr "Eliminar de la lista" #: src/dialogs/fl_digi.cxx:4603 msgid "Select operating parameters" msgstr "Seleccionar los parámetros de configuración" #: src/dialogs/fl_digi.cxx:4629 src/dialogs/fl_digi.cxx:4796 msgid "QRZ" msgstr "QRZ" #: src/dialogs/fl_digi.cxx:4636 src/dialogs/fl_digi.cxx:4803 #: src/dialogs/fl_digi.cxx:4908 src/dialogs/fl_digi.cxx:5124 #: src/dialogs/Viewer.cxx:312 src/widgets/FTextView.cxx:480 #: src/widgets/FTextView.cxx:645 src/widgets/flinput2.cxx:47 #: src/dialogs/confdialog.cxx:7570 msgid "Clear" msgstr "Limpiar" #: src/dialogs/fl_digi.cxx:4655 src/logbook/lgbook.cxx:467 #: src/logbook/lgbook.cxx:1079 msgid "Freq" msgstr "Frec" #: src/dialogs/fl_digi.cxx:4657 msgid "frequency kHz" msgstr "Frecuencia en KHz" #: src/dialogs/fl_digi.cxx:4660 src/dialogs/fl_digi.cxx:4812 #: src/dialogs/fl_digi.cxx:4918 msgid "On" msgstr "Ini" #: src/dialogs/fl_digi.cxx:4661 msgid "Press to update QSO start time" msgstr "Presione para actualizar la hora de inicio del QSO" #: src/dialogs/fl_digi.cxx:4665 msgid "QSO start time" msgstr "Hora de inicio del QSO" #: src/dialogs/fl_digi.cxx:4669 src/dialogs/fl_digi.cxx:4825 #: src/dialogs/fl_digi.cxx:4919 msgid "Off" msgstr "Fin" #: src/dialogs/fl_digi.cxx:4670 msgid "QSO end time" msgstr "Hora de fin del QSO" #: src/dialogs/fl_digi.cxx:4674 src/dialogs/fl_digi.cxx:4842 #: src/logbook/lgbook.cxx:620 msgid "In" msgstr "Rec" #: src/dialogs/fl_digi.cxx:4678 src/dialogs/fl_digi.cxx:4850 #: src/logbook/lgbook.cxx:706 msgid "Out" msgstr "Env" #: src/dialogs/fl_digi.cxx:4682 src/dialogs/fl_digi.cxx:4834 #: src/dialogs/fl_digi.cxx:4920 src/widgets/FTextRXTX.cxx:105 #: src/logbook/lgbook.cxx:459 src/logbook/lgbook.cxx:596 #: src/logbook/lgbook.cxx:1075 msgid "Call" msgstr "Ind." #: src/dialogs/fl_digi.cxx:4683 msgid "call sign" msgstr "Indicativo" #: src/dialogs/fl_digi.cxx:4686 msgid "Op" msgstr "Op" #: src/dialogs/fl_digi.cxx:4687 msgid "Operator name" msgstr "Nombre del operador" #: src/dialogs/fl_digi.cxx:4691 msgid "Azimuth" msgstr "Azimut" #: src/dialogs/fl_digi.cxx:4697 msgid "City" msgstr "Ciudad" #: src/dialogs/fl_digi.cxx:4701 msgid "US State" msgstr "Estado de USA" #: src/dialogs/fl_digi.cxx:4705 msgid "Can. Province" msgstr "Provincia Can." #: src/dialogs/fl_digi.cxx:4709 msgid "Maidenhead Locator" msgstr "Localizador como por ejemplo FL11ai" #: src/dialogs/fl_digi.cxx:4720 src/dialogs/fl_digi.cxx:4969 msgid "Sent serial number (read only)" msgstr "Número de serie enviado (solo lectura)" #: src/dialogs/fl_digi.cxx:4725 src/dialogs/fl_digi.cxx:4960 msgid "Received serial number" msgstr "Número de serie recibido" #: src/dialogs/fl_digi.cxx:4729 src/dialogs/fl_digi.cxx:4951 msgid "Contest exchange in" msgstr "Intercambio de concurso recibido" #: src/dialogs/fl_digi.cxx:4744 src/spot/notify.cxx:569 #: src/widgets/FTextRXTX.cxx:110 src/logbook/lgbook.cxx:521 #: src/logbook/lgbook.cxx:767 msgid "Country" msgstr "País" #: src/dialogs/fl_digi.cxx:4750 src/logbook/lgbook.cxx:524 #: src/logbook/lgbook.cxx:791 msgid "Notes" msgstr "Notas" #: src/dialogs/fl_digi.cxx:4816 src/dialogs/fl_digi.cxx:4975 msgid "Press to update" msgstr "Presione para actualizar" #: src/dialogs/fl_digi.cxx:4822 src/dialogs/fl_digi.cxx:4981 #: src/logbook/lgbook.cxx:584 msgid "Time On" msgstr "Tiempo de comienzo" #: src/dialogs/fl_digi.cxx:4831 src/dialogs/fl_digi.cxx:4989 #: src/logbook/lgbook.cxx:658 msgid "Time Off" msgstr "Tiempo de final" #: src/dialogs/fl_digi.cxx:4840 src/dialogs/fl_digi.cxx:4936 #: src/dialogs/fl_digi.cxx:5289 msgid "Other call" msgstr "Indicativo del otro" #: src/dialogs/fl_digi.cxx:4848 msgid "Received RST" msgstr "RST recib." #: src/dialogs/fl_digi.cxx:4856 msgid "Sent RST" msgstr "RST enviado" #: src/dialogs/fl_digi.cxx:4858 msgid "Nm" msgstr "Nm" #: src/dialogs/fl_digi.cxx:4865 msgid "Other name" msgstr "Nombre del otro" #: src/dialogs/fl_digi.cxx:4921 msgid "# S" msgstr "# S" #: src/dialogs/fl_digi.cxx:4922 msgid "# R" msgstr "# R" #: src/dialogs/fl_digi.cxx:4923 msgid "Ex" msgstr "Ex" #: src/dialogs/fl_digi.cxx:5029 msgid "" "Left Click - execute\n" "Shift-Fkey - execute\n" "Right Click - edit" msgstr "" "Clic izquierdo - ejecutar\n" "Clic derecho - editar" #: src/dialogs/fl_digi.cxx:5036 msgid "Shift-key macro set" msgstr "Conjunto de macros con shift-tecla de función" #: src/dialogs/fl_digi.cxx:5083 msgid "" "Left click - select\n" "Right click - clear line" msgstr "" "Clic izquierdo - ejecutar\n" "Clic derecho - editar" #: src/dialogs/fl_digi.cxx:5099 msgid "seek - regular expression" msgstr "Expresión regular de búsqueda" #: src/dialogs/fl_digi.cxx:5120 src/dialogs/Viewer.cxx:322 msgid "Set Viewer Squelch" msgstr "Establecer el nivel de silenciado (SQL) del visor" #: src/dialogs/fl_digi.cxx:5207 msgid "" "Left Click - execute\n" "Fkey - execute\n" "Right Click - edit" msgstr "" "Clic izquierdo - ejecutar\n" "Tecla de función - ejecutar\n" "Clic derecho - editar" #: src/dialogs/fl_digi.cxx:5214 msgid "Primary macro set" msgstr "Conjunto primario de macros" #: src/dialogs/fl_digi.cxx:5231 src/dialogs/fl_digi.cxx:5813 msgid "Detected signal level" msgstr "Nivel de señal detectado" #: src/dialogs/fl_digi.cxx:5242 src/dialogs/fl_digi.cxx:5825 #: src/waterfall/waterfall.cxx:2120 msgid "Squelch level" msgstr "Nivel de silencio (SQL)" #: src/dialogs/fl_digi.cxx:5256 src/dialogs/fl_digi.cxx:5839 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Clic izquierdo: cambiar modo\n" "Clic derecho: configurar" #: src/dialogs/fl_digi.cxx:5266 src/dialogs/fl_digi.cxx:5846 msgid "CW transmit WPM" msgstr "WPM en TX de CW" #: src/dialogs/fl_digi.cxx:5272 src/dialogs/fl_digi.cxx:5853 msgid "Default WPM" msgstr "WPM predefinido" #: src/dialogs/fl_digi.cxx:5311 src/dialogs/fl_digi.cxx:5885 msgid "Tx level attenuator (dB)" msgstr "preAtenuación de nivel de TX (dB)" #: src/dialogs/fl_digi.cxx:5335 src/dialogs/fl_digi.cxx:5908 msgid "Automatic Frequency Control" msgstr "Control Automático de Frecuencia" #: src/dialogs/fl_digi.cxx:5338 src/dialogs/fl_digi.cxx:5911 msgid "Squelch" msgstr "Silenciado (SQL)" #: src/dialogs/fl_digi.cxx:5381 src/dialogs/fl_digi.cxx:5723 msgid "Scope" msgstr "Osciloscopio" #: src/dialogs/fl_digi.cxx:5601 src/dialogs/Viewer.cxx:279 msgid "Signal Browser" msgstr "Navegador de señal" #: src/dialogs/Viewer.cxx:283 msgid "Find: " msgstr "Buscar:" #: src/dialogs/Viewer.cxx:316 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Clic izquierdo para limpiar el texto\n" "Clic derecho para resetear frecuencias" #: src/logbook/adif_io.cxx:233 #, c-format msgid "Empty ADIF logbook file %s" msgstr "Fichero de libro de guardia vacío (ADIF) %s" #: src/logbook/adif_io.cxx:252 #, c-format msgid "Error reading %s" msgstr "Error Leyendo %s" #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 msgid "Save changed Logbook?" msgstr "Guardar el libro de log modificado?" #: src/logbook/logsupport.cxx:141 msgid "Export to CSV file" msgstr "Exportar a un fichero CSV" #: src/logbook/logsupport.cxx:167 msgid "Export to fixed field text file" msgstr "Exportar a un fichero de texto con campos fijos" #: src/logbook/logsupport.cxx:194 msgid "Export to ADIF file" msgstr "Exportar a fichero ADIF" #: src/logbook/logsupport.cxx:251 msgid "Create New Logbook?" msgstr "Crear un nuevo libro de log?" #: src/logbook/logsupport.cxx:280 msgid "Open logbook file" msgstr "Abrir un libro de log" #: src/logbook/logsupport.cxx:303 msgid "Save logbook file" msgstr "Guardar el libro de log" #: src/logbook/logsupport.cxx:497 msgid "Merge ADIF file" msgstr "Mezclar fichero ADIF" #: src/logbook/logsupport.cxx:594 src/spot/notify.cxx:203 #: src/spot/notify.cxx:517 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:967 msgid "Update" msgstr "Actualizar" #: src/logbook/logsupport.cxx:1046 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Ralmente borro la entrada par \"%s\"?" #: src/logbook/logsupport.cxx:1433 msgid "Create cabrillo report" msgstr "Crear un reporte Cabrillo" #: src/logger/rx_extract.cxx:55 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" "Detectar la ocurrencia de las etiquetas [WRAP:beg] y [WRAP:end] para\n" "guardar el texto contenido entre ellas a un fichero con la fecha al estilo:\n" "\n" " NBEMS.files\\WRAP\\recv\\extract-20110205-201712.wrap" #: src/logger/rx_extract.cxx:60 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" "Detectar la ocurrencia de las etiquetas [WRAP:beg] y [WRAP:end] para\n" "guardar el texto contenido entre ellas a un fichero con la fecha al estilo:\n" "\n" " ~/.nbems/WRAP/recv/extraxt-20110205-201712.wrap" #: src/logger/rx_extract.cxx:270 msgid "Could not start flmsg" msgstr "No se puede iniciar flmsg" #: src/logger/rx_extract.cxx:337 src/logger/rx_extract.cxx:340 #: src/dialogs/confdialog.cxx:9287 msgid "Locate flmsg executable" msgstr "Localización del ejecutable de flmsg" #: src/logger/rx_extract.cxx:337 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:340 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:415 msgid "Locate executable" msgstr "Camino al ejecutable" #: src/logger/rx_extract.cxx:415 msgid "*.exe" msgstr "*.exe" #: src/logger/rx_extract.cxx:425 msgid "Locate binary" msgstr "Encontrar binario" #: src/logger/rx_extract.cxx:425 msgid "*" msgstr "*" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Guardar todo el texto recibido, un caractér cada vez al siguiente fichero:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:508 msgid "Rig mode" msgstr "Modo del Radio" #: src/misc/configuration.cxx:509 msgid "Always LSB" msgstr "Siempre LSB" #: src/misc/configuration.cxx:510 msgid "Always USB" msgstr "Siempre USB" #: src/misc/configuration.cxx:695 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Restablecer todas las opciones a su valores\n" "redefinidos?\n" "Los efectos de esta acción no se observarán\n" "hasta el próximo inicio del programa\n" "Se eliminaran los ficheros siguientes:\n" "fldigi_def.xml and fldigi.prefs\n" #: src/misc/configuration.cxx:700 msgid "Confirm RESET" msgstr "Confirmar RESET" #: src/misc/debug.cxx:91 msgid "Quiet" msgstr "Calmado" #: src/misc/debug.cxx:91 msgid "Error" msgstr "Error" #: src/misc/debug.cxx:91 msgid "Warning" msgstr "Advertencia" #: src/misc/debug.cxx:91 msgid "Info" msgstr "Info" #: src/misc/debug.cxx:91 msgid "Verbose" msgstr "Más explícito" #: src/misc/debug.cxx:91 msgid "Debug" msgstr "Debug" #: src/misc/debug.cxx:100 msgid "ARQ control" msgstr "Control ARQ" #: src/misc/debug.cxx:102 src/waterfall/waterfall.cxx:2121 msgid "Modem" msgstr "Modem" #: src/misc/debug.cxx:104 msgid "RPC" msgstr "RPC" #: src/misc/debug.cxx:105 msgid "Spotter" msgstr "Spotter" #: src/misc/debug.cxx:106 msgid "Other" msgstr "Otro" #: src/misc/debug.cxx:141 msgid "Log sources" msgstr "Orígenes de logs" #: src/misc/debug.cxx:146 msgid "Change log level" msgstr "Cambiar el nivel de log" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "\tmi frecuencia" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "\tmodo" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "\tmi indicativo" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "\tmi localizador" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "\tmi nombre" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "\tmi QTH" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "\tmi RST" #: src/misc/macroedit.cxx:78 msgid "\tmy antenna" msgstr "\tmi antena" #: src/misc/macroedit.cxx:79 msgid "\toperating band" msgstr "\tbanda de operación" #: src/misc/macroedit.cxx:81 msgid "\tFldigi version" msgstr "\tversion de Fldigi" #: src/misc/macroedit.cxx:84 msgid "\tother call" msgstr "\tindicativo del otro" #: src/misc/macroedit.cxx:85 msgid "\tS/N etc." msgstr "\tS/N etc." #: src/misc/macroedit.cxx:86 msgid "\tIMD etc." msgstr "\tIMD etc." #: src/misc/macroedit.cxx:87 msgid "\tother locator" msgstr "\tlocalizador del otro" #: src/misc/macroedit.cxx:88 msgid "\tother name" msgstr "\tnombre del otro" #: src/misc/macroedit.cxx:89 msgid "\tother QTH" msgstr "\tQTH del otro" #: src/misc/macroedit.cxx:90 msgid "\tother RST" msgstr "\tRST del otro" #: src/misc/macroedit.cxx:91 msgid "\t# QSO recs" msgstr "\t# QSO guardados" #: src/misc/macroedit.cxx:92 msgid "\tnext QSO rec #" msgstr "\tpróximo QSO a guardar #" #: src/misc/macroedit.cxx:93 msgid "\tmap on google" msgstr "\tmapearlo en google" #: src/misc/macroedit.cxx:94 msgid "\tmap by value" msgstr "\tmapearlo por su valor" #: src/misc/macroedit.cxx:97 msgid "\tclear RX pane" msgstr "\tlimpiar el panel de RX" #: src/misc/macroedit.cxx:98 msgid "\tclear TX pane" msgstr "\tlimpiar el panel de TX" #: src/misc/macroedit.cxx:101 msgid "\ttext to NAME/QTH" msgstr "\ttexto a NOMBRE/QTH" #: src/misc/macroedit.cxx:105 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk Encendido, apagado, invirtiendo" #: src/misc/macroedit.cxx:109 msgid "\tclear log fields" msgstr "\tlimpiar los campos del log" #: src/misc/macroedit.cxx:110 msgid "\tsave QSO data" msgstr "\tguardar datos del QSO" #: src/misc/macroedit.cxx:111 msgid "\tsaveQSO data, append msg to notes" msgstr "" "\tGuardar los datos del QSO, añadiendo msg a las notas del log, " "justo cuando se ejecuta la macro." #: src/misc/macroedit.cxx:112 msgid "\tlog at xmt time" msgstr "\tguardar al tiempo que transmite" #: src/misc/macroedit.cxx:113 msgid "\tsaveQSO data, append msg to notes" msgstr "" "\tGuardar los datos del QSO, añadiendo msg a las notas del log, " "cuando se muestra en el buffer de TX" #: src/misc/macroedit.cxx:114 msgid "\tlog eQSL" msgstr "\tSalvar directo en eQSL.cc" #: src/misc/macroedit.cxx:115 msgid "\tlog eQSL optional msg" msgstr "\tlogear un mensaje opcional en eQSL.cc" #: src/misc/macroedit.cxx:118 msgid "\tQSO time (HHMM))" msgstr "\tHora del QSO (HHMM)" #: src/misc/macroedit.cxx:119 msgid "\tLDT in iso-8601 format" msgstr "\tLDT en formato iso-8601" #: src/misc/macroedit.cxx:120 msgid "\tLocal datetime" msgstr "\tfecha y hora en tiempo local" #: src/misc/macroedit.cxx:121 msgid "\tZDT in iso-8601 format" msgstr "\tZDT en formato iso-8601" #: src/misc/macroedit.cxx:122 msgid "\tUTC datetime" msgstr "\tfecha y hora UTC" #: src/misc/macroedit.cxx:123 msgid "\tlocal time HHMM" msgstr "\thora local (HHMM)" #: src/misc/macroedit.cxx:124 msgid "\tzulu time HHMMZ" msgstr "\thora zulu HHMMZ" #: src/misc/macroedit.cxx:125 msgid "\tlocal date YYYY-MM-DD" msgstr "\tfecha local AAAA-MM-DD" #: src/misc/macroedit.cxx:126 msgid "\tzulu date YYYY-MM-DD Z" msgstr "\tfecha zulu AAAA-MM-DD Z" #: src/misc/macroedit.cxx:127 msgid "\tget weather data" msgstr "\tobtener datos de clima" #: src/misc/macroedit.cxx:128 msgid "\tget weather data for station" msgstr "\tobtener datos de clima para una estación específica" #: src/misc/macroedit.cxx:131 msgid "\tcontest counter" msgstr "\tcontador de concurso" #: src/misc/macroedit.cxx:132 msgid "\tdecrement counter" msgstr "\tdecrementar el contador" #: src/misc/macroedit.cxx:133 msgid "\tincrement counter" msgstr "\tincrementar el contador" #: src/misc/macroedit.cxx:134 msgid "\texchange in" msgstr "\tintercambio entrante" #: src/misc/macroedit.cxx:135 msgid "\texchange out" msgstr "\tintercambio enviado" #: src/misc/macroedit.cxx:136 msgid "\texchange begin" msgstr "\tcomienzo del intercambio" #: src/misc/macroedit.cxx:137 msgid "\texchange end" msgstr "\tfin del intercambio" #: src/misc/macroedit.cxx:138 msgid "\tsave contest out" msgstr "\tguardar intercambio de concurso" #: src/misc/macroedit.cxx:141 msgid "\treceive" msgstr "\trecibir" #: src/misc/macroedit.cxx:142 msgid "\ttransmit" msgstr "\ttransmitir" #: src/misc/macroedit.cxx:143 msgid "\ttoggle T/R" msgstr "\tInvertir Tx/Rx" #: src/misc/macroedit.cxx:144 msgid "\tsearch UP for signal" msgstr "\tbuscar ARRIBA en la cascada por una señal" #: src/misc/macroedit.cxx:145 msgid "\tsearch DOWN for signal" msgstr "\tbuscar ABAJO en la cascada por una señal" #: src/misc/macroedit.cxx:146 msgid "\treturn to sweet spot" msgstr "\tretornar a la frecuencia inicial en la cascada" #: src/misc/macroedit.cxx:147 msgid "\tmove to freq NNNN Hz" msgstr "\tmoverte a la frecuencia NNNN" #: src/misc/macroedit.cxx:148 msgid "\tleft-clk QSY button" msgstr "\tclick-izquierdo QSY a la frecuencia preferida de este modo" #: src/misc/macroedit.cxx:149 msgid "\tright-clk QSY button" msgstr "\tclick-derecho QSY a la frecuencia anterior" #: src/misc/macroedit.cxx:152 msgid "\tinsert QRG into Rx text" msgstr "\tInsertar QRG en el panel de RX" #: src/misc/macroedit.cxx:155 msgid "\tqsy to kHz, Hz" msgstr "\tqsy a kHz, Hz" #: src/misc/macroedit.cxx:156 msgid "\tvalid xcvr mode" msgstr "\tmodo válido para el trx" #: src/misc/macroedit.cxx:157 msgid "\tvalid xcvr filter width" msgstr "\tancho del filtro válido para el trx" #: src/misc/macroedit.cxx:160 msgid "\tinsert text file" msgstr "\tinsertar fichero de texto" #: src/misc/macroedit.cxx:161 msgid "\tinsert MFSK image" msgstr "\tinsertar imagen de MFSK" #: src/misc/macroedit.cxx:164 msgid "\tpause transmit" msgstr "\tpausar la transmisión (Pasar a RX sin limpiar el panel de TX)" #: src/misc/macroedit.cxx:165 msgid "\tidle signal for NN.nn sec" msgstr "\tesperar NN.nn segundos por la señal" #: src/misc/macroedit.cxx:166 msgid "\trepeat every NN sec" msgstr "\trepetir cada NN segundos" #: src/misc/macroedit.cxx:167 msgid "\ttune signal for NN sec" msgstr "\tsintonizar la señal por NN segundos" #: src/misc/macroedit.cxx:168 msgid "\tdelay xmt for NN sec" msgstr "\tretrasar la transmisión por NN segundos" #: src/misc/macroedit.cxx:169 msgid "\trepeat macro continuously" msgstr "\trepetir la macro continuamente" #: src/misc/macroedit.cxx:170 #, fuzzy msgid "\tschedule execution" msgstr "\tejecución planificada" #: src/misc/macroedit.cxx:173 msgid "\t set xmt attenuator" msgstr "\tponer el atenuador de TX del equipo a este valor" #: src/misc/macroedit.cxx:176 msgid "\tCW identifier" msgstr "\tidentificador de CW" #: src/misc/macroedit.cxx:177 msgid "\tsend mode ID in video text" msgstr "\tenviar el ID del modo como video texto" #: src/misc/macroedit.cxx:178 msgid "\tvideo text" msgstr "\tvideo texto" #: src/misc/macroedit.cxx:179 msgid "\tTx RSID on,off,toggle" msgstr "\tTx RSID encendido, apagado, invirtiendo" #: src/misc/macroedit.cxx:180 msgid "\tRx RSID on,off,toggle" msgstr "\tRx RSID encendido, apagado, invirtiendo" #: src/misc/macroedit.cxx:181 msgid "\tTransmit |NN| successive RsID bursts" msgstr "\tTransmitir |NN| ráfagas de RsID" #: src/misc/macroedit.cxx:182 msgid "\t[Wait][Len](ms)" msgstr "\t[Wait][Len](ms)" #: src/misc/macroedit.cxx:185 msgid "\tCW QSK post-timing" msgstr "\tCW QSK al final" #: src/misc/macroedit.cxx:186 msgid "\tCW QSK pre-timing" msgstr "\tCW QSK al inicio" #: src/misc/macroedit.cxx:187 msgid "\tCW rise time" msgstr "\ttiempo de subida de CW" #: src/misc/macroedit.cxx:188 msgid "\tCW WPM:Farnsworth" msgstr "\tCW PPM:Farnsworth" #: src/misc/macroedit.cxx:191 msgid "\tsend CAT cmd" msgstr "\tenviar comando CAT" #: src/misc/macroedit.cxx:194 msgid "\tAFC on,off,toggle" msgstr "\tAFC encendido, apagado, invirtiendo" #: src/misc/macroedit.cxx:195 msgid "\tLOCK on,off,toggle" msgstr "\tbloqueo (LOCK) encendido, apagado invirtiendo" #: src/misc/macroedit.cxx:196 msgid "\tRev on,off,toggle" msgstr "\tReverso activado, desactivado, alternando" #: src/misc/macroedit.cxx:199 msgid "\tchange macro defs file" msgstr "\tcambiar el fichero de definición de macros" #: src/misc/macroedit.cxx:200 msgid "\tsave current macro file" msgstr "\tsalvar el fichero de macro actual" #: src/misc/macroedit.cxx:203 msgid "\tuntransmitted comment" msgstr "\tcomentarios que NO se transmiten" #: src/misc/macroedit.cxx:206 msgid "\tmodem timing test internal string" msgstr "" #: src/misc/macroedit.cxx:207 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:208 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:211 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:212 #, fuzzy msgid "\tWAV file; spec' file" msgstr "\tinsertar fichero de texto" #: src/misc/macroedit.cxx:213 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:328 msgid "Text file to insert" msgstr "Fichero de texto a insertar" #: src/misc/macroedit.cxx:336 #, fuzzy msgid "Test text file" msgstr "\tinsertar fichero de texto" #: src/misc/macroedit.cxx:344 msgid "MFSK image file" msgstr "Fichero de imagen MFSK" #: src/misc/macroedit.cxx:351 msgid "Change to Macro file" msgstr "Cambiar a fichero de macro" #: src/misc/macroedit.cxx:361 msgid "Executable file to insert" msgstr "Fichero ejecutable a insertar" #: src/misc/macroedit.cxx:391 msgid "Macro Text" msgstr "Texto del macro" #: src/misc/macroedit.cxx:396 msgid "Select Tag" msgstr "Selecciona la etiqueta" #: src/misc/macroedit.cxx:408 msgid "Macro Button Label" msgstr "Etiqueta del botón de macro" #: src/misc/macroedit.cxx:416 msgid "Apply" msgstr "Aplicar" #: src/misc/macroedit.cxx:443 msgid "Macro editor - " msgstr "Editor de macros - " #: src/misc/macros.cxx:2786 msgid "Open macro file" msgstr "Abrir fichero de macro" #: src/misc/macros.cxx:2787 src/misc/macros.cxx:2825 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Fichero de definición de macro para Fldigi\t*.mdf" #: src/misc/macros.cxx:2824 msgid "Save macro file" msgstr "Guardar el fichero de macros" #: src/misc/network.cxx:170 msgid "Aborted" msgstr "Abortado" #: src/misc/network.cxx:170 msgid "Timed out" msgstr "Se ha demorado demasiado" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "Terminar" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "Siguiente" #: src/misc/newinstall.cxx:389 msgid "Back" msgstr "Atras" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "Este diálogo te guiará en las configuraciones básicas" #: src/misc/newinstall.cxx:522 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "Puedes saltar o salir cualquiera de estas configuraciones" #: src/misc/newinstall.cxx:523 msgid "All settings shown here can be changed later via the Configure menu" msgstr "Todo esto se pueden modificar luego en los menus de configuración" #: src/misc/newinstall.cxx:538 msgid "Fldigi configuration wizard" msgstr "Dialogo de Configuración" #: src/mfsk/mfsk-pic.cxx:142 src/mfsk/mfsk-pic.cxx:146 #: src/mfsk/mfsk-pic.cxx:305 src/mfsk/mfsk-pic.cxx:308 msgid "Time needed: " msgstr "Tiempo neecsario:" #: src/mfsk/mfsk-pic.cxx:175 msgid "Load image file" msgstr "Cargar fichero de imagen" #: src/mfsk/mfsk-pic.cxx:316 msgid "Send image" msgstr "Enviar imagen" #: src/mfsk/mfsk-pic.cxx:323 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "Cargar o descargar una imagen\n" "desde fichero (PNG, JPEG, BMP)" #: src/mfsk/mfsk-pic.cxx:327 msgid "Transfer speed, X1-normal" msgstr "Velocidad de transferencia, X1-normal" #: src/mfsk/mfsk-pic.cxx:339 msgid "Load" msgstr "Cargar" #: src/waterfall/waterfall.cxx:1563 msgid "Waterfall / FFT / Scope" msgstr "Cascada / FFT / Osciloscopio" #: src/waterfall/waterfall.cxx:1573 msgid "Upper signal level (dB)" msgstr "Nivel superior de la señal (dB)" #: src/waterfall/waterfall.cxx:1584 msgid "Signal range (dB)" msgstr "Rango de señal (dB)" #: src/waterfall/waterfall.cxx:1590 msgid "Change waterfall scale" msgstr "Cambiar escala de la cascada" #: src/waterfall/waterfall.cxx:1595 msgid "Slew display lower in frequency" msgstr "Correr la cascada hacia frecuencias más bajas" #: src/waterfall/waterfall.cxx:1600 msgid "Center display on signal" msgstr "Centrar la señal" #: src/waterfall/waterfall.cxx:1605 msgid "Slew display higher in frequency" msgstr "Correr la cascada hacia frecuencias más altas" #: src/waterfall/waterfall.cxx:1610 msgid "Waterfall drop speed" msgstr "Velocidad de caida de la cascada" #: src/waterfall/waterfall.cxx:1620 msgid "Adjust cursor frequency" msgstr "Ajustar la frecuencia del cursor" #: src/waterfall/waterfall.cxx:1625 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Centrar en el pasabanda\n" "Clic derecho para deshacer" #: src/waterfall/waterfall.cxx:1631 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Almacenar modo y frecuencia\n" "Click derecho para listar" #: src/waterfall/waterfall.cxx:1641 msgid "Lock transmit frequency" msgstr "Bloquear la frecuencia de transmisión" #: src/waterfall/waterfall.cxx:1650 src/dialogs/confdialog.cxx:5706 msgid "Reverse" msgstr "Invertir" #: src/waterfall/waterfall.cxx:1657 msgid "Transmit/Receive" msgstr "Transmitir/Recibir" #: src/waterfall/waterfall.cxx:2119 msgid "AFC range or BW" msgstr "Rango AFC o Ancho de banda" #: src/waterfall/waterfall.cxx:2120 msgid "Signal search" msgstr "Búsqueda de señal" #: src/waterfall/waterfall.cxx:2121 msgid "Modem carrier" msgstr "Portadora del modo" #: src/waterfall/waterfall.cxx:2121 msgid "Scroll" msgstr "Desplazamiento" #: src/rigcontrol/FreqControl.cxx:136 msgid "" "Enter frequency or change with\n" "Left/Right/Up/Down/Pg_Up/Pg_Down" msgstr "" "Entre frecuencia o cambie con\n" "Izq./Der../Arriba/Abajo/Pág_Arriba/Pág_Abajo" #: src/rigcontrol/rigsupport.cxx:469 msgid "Enter Xcvr Freq" msgstr "Frec. del TRCV" #: src/rigcontrol/rigxml.cxx:946 msgid "Open rig xml file" msgstr "Abrir fichero de radio xml" #: src/rigcontrol/rigxml.cxx:946 msgid "Fldigi rig xml definition file\t*.xml" msgstr "Fichero de definicioan de radio xml\t*.xml" #: src/soundcard/sound.cxx:149 msgid "" "Waveform Audio Format\t*.wav\n" "AU\t*.{au,snd}\n" msgstr "" "Forma de onda del audio\t*.wav\n" "AU\t*.{au.snd}\n" #: src/soundcard/sound.cxx:152 msgid "Free Lossless Audio Codec\t*.flac" msgstr "Codec de audio libre sin pérdida\t*.flac" #: src/soundcard/sound.cxx:158 src/soundcard/sound.cxx:160 msgid "Audio file" msgstr "Fichero de audio" #: src/soundcard/sound.cxx:306 msgid "Playback continuous loop?" msgstr "Reproducir en un lazo continuo?" #: src/spot/notify.cxx:191 msgid "My callsign de CALL" msgstr "Mi indicativo de INDICATIVO" #: src/spot/notify.cxx:192 msgid "Station heard twice" msgstr "Estación escuchada dos veces" #: src/spot/notify.cxx:193 msgid "Custom text search" msgstr "Busqueda de texto personalizada" #: src/spot/notify.cxx:194 msgid "RSID reception" msgstr "Recepción con RSID" #: src/spot/notify.cxx:202 msgid "Toggle" msgstr "Invertir" #: src/spot/notify.cxx:204 src/spot/notify.cxx:516 msgid "Remove" msgstr "Eliminar" #: src/spot/notify.cxx:216 src/spot/notify.cxx:222 src/spot/notify.cxx:570 #: src/logbook/lgbook.cxx:548 src/logbook/lgbook.cxx:853 msgid "Continent" msgstr "Continente" #: src/spot/notify.cxx:217 src/spot/notify.cxx:223 src/logbook/lgbook.cxx:841 msgid "ITU zone" msgstr "Zona ITU" #: src/spot/notify.cxx:218 src/spot/notify.cxx:224 src/logbook/lgbook.cxx:829 msgid "CQ zone" msgstr "Zona CQ" #: src/spot/notify.cxx:219 src/spot/notify.cxx:225 msgid "All" msgstr "Todo" #: src/spot/notify.cxx:221 msgid "Deselect" msgstr "Deseleccionar" #: src/spot/notify.cxx:515 msgid "Add" msgstr "Añadir" #: src/spot/notify.cxx:518 msgid "Test..." msgstr "Probar..." #: src/spot/notify.cxx:521 src/widgets/FTextView.cxx:481 #: src/widgets/flinput2.cxx:48 msgid "Select All" msgstr "Todos" #: src/spot/notify.cxx:522 src/logbook/lgbook.cxx:403 #: src/logbook/lgbook.cxx:453 src/logbook/lgbook.cxx:1045 #: src/logbook/lgbook.cxx:1119 msgid "Clear All" msgstr "Limpiar" #: src/spot/notify.cxx:1095 msgid "The regular expression field must not be empty." msgstr "El campo de expresión regular no debe estar vacío." #: src/spot/notify.cxx:1101 msgid "The regular expression must be valid." msgstr "La expresión regular debe ser válida." #: src/spot/notify.cxx:1108 msgid "Please set your callsign first." msgstr "Por favor especifica tu indicativo primero." #: src/spot/notify.cxx:1245 msgid "Run program" msgstr "Ejecutar un programa" #: src/spot/notify.cxx:1278 msgid "" "Default test string is:\n" " \"" msgstr "" "La cadena de prueba es:\n" "\"" #: src/spot/notify.cxx:1279 msgid "Enter test string or leave blank for default:" msgstr "" "Entre la cadena de prueba, o déjela en blanco para usar la predefinida:" #: src/spot/notify.cxx:1290 msgid "This event's regular expression is invalid." msgstr "La expresión regular de este evento es inválida." #: src/spot/notify.cxx:1297 msgid "The test string did not match this event's search pattern." msgstr "La cadena de prueba no concuerda con el patrón para este evento." #: src/spot/notify.cxx:1315 msgid "Available substrings" msgstr "Sub cadenas de texto disponibles" #: src/spot/notify.cxx:1398 src/logbook/lgbook.cxx:1026 msgid "Frequency" msgstr "Frecuencia" #: src/spot/notify.cxx:1400 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1023 msgid "Callsign" msgstr "Indicativo" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "Abrir paleta" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:126 msgid "Fldigi palette\t*.pal" msgstr "Paleta Fldigi\t*.pal" #: src/waterfall/colorbox.cxx:112 src/waterfall/colorbox.cxx:137 msgid "Palette: " msgstr "Paleta:" #: src/waterfall/colorbox.cxx:126 msgid "Save palette" msgstr "Guardar paleta" #: src/widgets/FTextRXTX.cxx:104 msgid "Look up call" msgstr "Buscar indicativo" #: src/widgets/FTextRXTX.cxx:106 src/logbook/lgbook.cxx:463 #: src/logbook/lgbook.cxx:608 src/logbook/lgbook.cxx:1025 msgid "Name" msgstr "Nombre" #: src/widgets/FTextRXTX.cxx:107 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:108 src/dialogs/confdialog.cxx:5298 #: src/logbook/lgbook.cxx:512 msgid "State" msgstr "Estado" #: src/widgets/FTextRXTX.cxx:109 src/logbook/lgbook.cxx:518 msgid "Province" msgstr "Provincia" #: src/widgets/FTextRXTX.cxx:111 msgid "Locator" msgstr "Localizador" #: src/widgets/FTextRXTX.cxx:112 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:113 src/dialogs/confdialog.cxx:5304 #: src/logbook/lgbook.cxx:539 src/logbook/lgbook.cxx:924 #: src/logbook/lgbook.cxx:1111 msgid "Exchange In" msgstr "Intercambio RX" #: src/widgets/FTextRXTX.cxx:114 src/dialogs/confdialog.cxx:5229 msgid "Serial number" msgstr "Numero de serie" #: src/widgets/FTextRXTX.cxx:115 msgid "Insert marker" msgstr "Insertar marcador" #: src/widgets/FTextRXTX.cxx:123 msgid "Quick entry" msgstr "Entrada rápida" #: src/widgets/FTextRXTX.cxx:124 msgid "Scroll hints" msgstr "Sugerencias de desplazamiento" #: src/widgets/FTextRXTX.cxx:704 msgid " in " msgstr " en " #: src/widgets/FTextRXTX.cxx:706 msgid "Last QSO" msgstr "Último QSO" #: src/widgets/FTextRXTX.cxx:751 src/dialogs/confdialog.cxx:6624 msgid "Transmit" msgstr "Transmitir" #: src/widgets/FTextRXTX.cxx:752 src/dialogs/confdialog.cxx:6499 #: src/dialogs/confdialog.cxx:7621 msgid "Receive" msgstr "Recibir" #: src/widgets/FTextRXTX.cxx:753 msgid "Abort" msgstr "Abortar" #: src/widgets/FTextRXTX.cxx:754 msgid "Send image..." msgstr "enviar Imagen..." #: src/widgets/FTextView.cxx:292 msgid "Insert text" msgstr "Insertar texto" #: src/widgets/FTextView.cxx:351 msgid "Save text as" msgstr "Guardar texto como" #: src/widgets/FTextView.cxx:479 src/widgets/FTextView.cxx:643 #: src/widgets/flinput2.cxx:44 msgid "Copy" msgstr "Copiar" #: src/widgets/FTextView.cxx:482 msgid "Save as..." msgstr "Guardar como..." #: src/widgets/FTextView.cxx:483 src/widgets/FTextView.cxx:647 msgid "Word wrap" msgstr "Ajuste de línea" #: src/widgets/FTextView.cxx:642 src/widgets/flinput2.cxx:43 msgid "Cut" msgstr "Cortar" #: src/widgets/FTextView.cxx:644 src/widgets/flinput2.cxx:45 msgid "Paste" msgstr "Pegar" #: src/widgets/FTextView.cxx:646 msgid "Insert file..." msgstr "Insertar fichero..." #: src/widgets/flinput2.cxx:42 msgid "Undo" msgstr "Deshacer" #: src/widgets/flinput2.cxx:46 src/logbook/lgbook.cxx:974 msgid "Delete" msgstr "Borrar" #: src/dialogs/confdialog.cxx:4928 msgid "Fldigi configuration" msgstr "Configuración" #: src/dialogs/confdialog.cxx:4938 src/dialogs/confdialog.cxx:10039 msgid "Operator information" msgstr "Información del operador" #: src/dialogs/confdialog.cxx:4941 msgid "Station" msgstr "Estación" #: src/dialogs/confdialog.cxx:4944 msgid "Callsign:" msgstr "Indicativo:" #: src/dialogs/confdialog.cxx:4945 msgid "Operators callsign" msgstr "Indicativo del operador" #: src/dialogs/confdialog.cxx:4958 msgid "Name:" msgstr "Nombre:" #: src/dialogs/confdialog.cxx:4959 msgid "Operators name" msgstr "Nombre del operador" #: src/dialogs/confdialog.cxx:4972 msgid "QTH:" msgstr "QTH:" #: src/dialogs/confdialog.cxx:4973 msgid "Operators QTH" msgstr "QTH del operador" #: src/dialogs/confdialog.cxx:4986 msgid "Locator:" msgstr "Localizador:" #: src/dialogs/confdialog.cxx:4987 msgid "Maidenhead locator as in EM64qv" msgstr "Localizador como por ejemplo FL11aj" #: src/dialogs/confdialog.cxx:5002 msgid "Antenna:" msgstr "Antena:" #: src/dialogs/confdialog.cxx:5003 msgid "Short description of antenna" msgstr "Descripción corta de la antena" #: src/dialogs/confdialog.cxx:5016 msgid "Test Signal - Do NOT use with transmitter" msgstr "Señal de prueba - NO USAR con el transmisor" #: src/dialogs/confdialog.cxx:5020 msgid "Noise on" msgstr "Ruido encendido" #: src/dialogs/confdialog.cxx:5026 msgid "dB" msgstr "dB" #: src/dialogs/confdialog.cxx:5049 msgid "UI" msgstr "IU" #: src/dialogs/confdialog.cxx:5053 msgid "Browser" msgstr "Navegador" #: src/dialogs/confdialog.cxx:5056 msgid "Channels, first channel starts at waterfall lower limit" msgstr "Canales, el primer canal comienza en el límite inferior de la cascada" #: src/dialogs/confdialog.cxx:5057 msgid "Change # of psk viewer channels" msgstr "Cambiar el número de canales del navegador" #: src/dialogs/confdialog.cxx:5074 msgid "Inactivity timeout" msgstr "Tiempo de inactividad" #: src/dialogs/confdialog.cxx:5075 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Limpiar el texto del canal\n" "después de N segundos\n" "de inactividad" #: src/dialogs/confdialog.cxx:5091 msgid "Channel label" msgstr "Etiqueta del canal" #: src/dialogs/confdialog.cxx:5092 msgid "Appearance of label on each channel" msgstr "Apariencia de la etiqueta de cada canal" #: src/dialogs/confdialog.cxx:5103 msgid "Audio frequency" msgstr "Frecuencia de audio" #: src/dialogs/confdialog.cxx:5104 msgid "Radio frequency" msgstr "Frecuencia RF" #: src/dialogs/confdialog.cxx:5104 msgid "Channel number" msgstr "Número del canal" #: src/dialogs/confdialog.cxx:5109 src/dialogs/confdialog.cxx:6274 msgid "Font..." msgstr "Tipografía" #: src/dialogs/confdialog.cxx:5110 msgid "select browser font" msgstr "Selecciona la letra del navegador" #: src/dialogs/confdialog.cxx:5113 msgid "Fixed Intervals" msgstr "Intervalos Fijados" #: src/dialogs/confdialog.cxx:5114 msgid "Force channel spacing to even 100 Hz increments" msgstr "Forzar el espaciado de los canales a incrementos de 100Hz" #: src/dialogs/confdialog.cxx:5121 msgid "Continuous scrolling" msgstr "Movimiento contínuo" #: src/dialogs/confdialog.cxx:5122 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" "Activado - Estilo marquesina\n" "Desactivado - Limpiar y re-comenzar" #: src/dialogs/confdialog.cxx:5127 msgid "Lowest freq on bottom of viewer" msgstr "Frecuencia más baja en la parte inferior del navegador" #: src/dialogs/confdialog.cxx:5128 msgid "Change positions of low to high channels" msgstr "Cambiar la posición de los canales de abajo a arriba" #: src/dialogs/confdialog.cxx:5133 msgid "Play back history when active channel selected" msgstr "Reproducir el historial cuando se selecciona un canal" #: src/dialogs/confdialog.cxx:5134 msgid "Audio stream history decoded on selected signal" msgstr "Historial de audio decodificado al seleccionar" #: src/dialogs/confdialog.cxx:5139 msgid "Detection Level" msgstr "Colores de detección de nivel" #: src/dialogs/confdialog.cxx:5141 msgid "Backgnd" msgstr "Fondo" #: src/dialogs/confdialog.cxx:5142 msgid "Background color of signal viewer squelch control" msgstr "" "Color de fondo de control deslizante del\n" "silenciador del navegador" #: src/dialogs/confdialog.cxx:5147 msgid "Button" msgstr "Botón" #: src/dialogs/confdialog.cxx:5148 msgid "Slider hilite color of signal viewer squelch control" msgstr "" "Color resaltado del deslizante del control\n" "del silenciador del navegador" #: src/dialogs/confdialog.cxx:5155 msgid "Browser Line Colors" msgstr "Colores de Resaltado" #: src/dialogs/confdialog.cxx:5157 msgid "HiLite 1" msgstr "HiLite 1" #: src/dialogs/confdialog.cxx:5158 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "Color 1 para el resaltado de HiLite en el visor de PSK/RTTY" #: src/dialogs/confdialog.cxx:5163 msgid "HiLite 2" msgstr "HiLite 2" #: src/dialogs/confdialog.cxx:5164 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "Color 2 para el resaltado de HiLite en el visor de PSK/RTTY" #: src/dialogs/confdialog.cxx:5169 msgid "Even" msgstr "Par" #: src/dialogs/confdialog.cxx:5170 msgid "Even lines" msgstr "Lineas aares" #: src/dialogs/confdialog.cxx:5175 msgid "Odd" msgstr "Impar" #: src/dialogs/confdialog.cxx:5176 msgid "Odd lines" msgstr "Lineas impares" #: src/dialogs/confdialog.cxx:5182 msgid "Select line" msgstr "Leleccionar linea" #: src/dialogs/confdialog.cxx:5195 msgid "Exchanges" msgstr "Intercambio" #: src/dialogs/confdialog.cxx:5198 msgid "Send:" msgstr "Enviado:" #: src/dialogs/confdialog.cxx:5200 src/logbook/lgbook.cxx:542 #: src/logbook/lgbook.cxx:900 src/logbook/lgbook.cxx:1115 msgid "Exchange Out" msgstr "Intercambio TX" #: src/dialogs/confdialog.cxx:5201 msgid "free form exchange" msgstr "Intercambio predefinido" #: src/dialogs/confdialog.cxx:5215 msgid "RST always 599" msgstr "RST siempre 599" #: src/dialogs/confdialog.cxx:5216 msgid "Force RST in/out to 599" msgstr "Forzar el RST recibido/enviado a 599" #: src/dialogs/confdialog.cxx:5221 msgid "Send CW cut numbers" msgstr "Enviar números CW (5NN)" #: src/dialogs/confdialog.cxx:5222 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:5232 msgid "Use leading zeros" msgstr "Usar ceros a la izquierda" #: src/dialogs/confdialog.cxx:5233 msgid "Insert leading zeros into Xmtd serial number" msgstr "Insertar ceros a la izquierda en el número de serie enviado" #: src/dialogs/confdialog.cxx:5238 msgid "Start" msgstr "Inicio" #: src/dialogs/confdialog.cxx:5239 msgid "Starting number" msgstr "Número de inicio" #: src/dialogs/confdialog.cxx:5254 msgid "Digits" msgstr "Dígitos" #: src/dialogs/confdialog.cxx:5255 msgid "Number of digits in serial number" msgstr "Número de dígitos en el número de serie" #: src/dialogs/confdialog.cxx:5271 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Resetear" #: src/dialogs/confdialog.cxx:5272 msgid "Initialize the QSO logging fields" msgstr "Inicializar la cuenta del número serie" #: src/dialogs/confdialog.cxx:5277 msgid "Duplicate check, CALL plus" msgstr "Chequear duplicados, Indicativo más..." #: src/dialogs/confdialog.cxx:5280 msgid "On/Off" msgstr "On/Off" #: src/dialogs/confdialog.cxx:5281 msgid "Check for duplicates" msgstr "Chequear duplicados" #: src/dialogs/confdialog.cxx:5286 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:471 msgid "Band" msgstr "Banda" #: src/dialogs/confdialog.cxx:5287 msgid "Bands must match" msgstr "Concordar en bandas" #: src/dialogs/confdialog.cxx:5292 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:474 src/logbook/lgbook.cxx:682 #: src/logbook/lgbook.cxx:1028 src/logbook/lgbook.cxx:1083 msgid "Mode" msgstr "Modo" #: src/dialogs/confdialog.cxx:5293 msgid "Mode must match" msgstr "Concordar en modo" #: src/dialogs/confdialog.cxx:5299 msgid "State must match" msgstr "Concordar en estado (EE.UU.)" #: src/dialogs/confdialog.cxx:5305 msgid "free form 1 must match" msgstr "Concordar en el número de intercambio" #: src/dialogs/confdialog.cxx:5310 msgid "Time span over" msgstr "Rango de tiempo" #: src/dialogs/confdialog.cxx:5311 msgid "QSO must not occur within a time period of" msgstr "El QSO no debe ocurrir dentro es período" #: src/dialogs/confdialog.cxx:5316 msgid "minutes" msgstr "minutos" #: src/dialogs/confdialog.cxx:5317 msgid "Enter time span in minutes" msgstr "Entre rango de tiempo en minutos" #: src/dialogs/confdialog.cxx:5333 msgid "Dup Color" msgstr "Color Dup." #: src/dialogs/confdialog.cxx:5334 msgid "Left click to select dup color" msgstr "Clic izquierdo para seleccionar el color de duplicados" #: src/dialogs/confdialog.cxx:5346 src/dialogs/confdialog.cxx:6497 #: src/dialogs/confdialog.cxx:7508 src/dialogs/confdialog.cxx:9403 msgid "General" msgstr "General" #: src/dialogs/confdialog.cxx:5350 msgid "Show tooltips" msgstr "Mostrar sugerencias" #: src/dialogs/confdialog.cxx:5351 msgid "Enable / disable tooltips" msgstr "Activar/desactivar sugerencias" #: src/dialogs/confdialog.cxx:5357 msgid "Show menu icons" msgstr "Mostrar íconos del menú" #: src/dialogs/confdialog.cxx:5358 msgid "Enable / disable icons on menus" msgstr "Activar/desactivar los iconos en el menú" #: src/dialogs/confdialog.cxx:5363 msgid "UI scheme" msgstr "Esquema de la Interfaz" #: src/dialogs/confdialog.cxx:5364 msgid "Change application look and feel" msgstr "Cambiar la piel de la aplicación" #: src/dialogs/confdialog.cxx:5382 msgid "Visible modes" msgstr "Modos visibles" #: src/dialogs/confdialog.cxx:5383 msgid "Select modes for menu access" msgstr "Seleccionar los modos para acceso desde el menú" #: src/dialogs/confdialog.cxx:5386 msgid "UI language" msgstr "Idioma de la IU" #: src/dialogs/confdialog.cxx:5387 src/dialogs/confdialog.cxx:6403 msgid "Changes take effect on next program startup" msgstr "Los cambios tomarán efecto en el próximo inicio del programa" #: src/dialogs/confdialog.cxx:5406 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "" "Imprimir CW / RTTY / THROB / CONTESTIA en minúsculas\n" "(Estos modos solo reconocen las mayúsculas)" #: src/dialogs/confdialog.cxx:5416 msgid "Transmit all text in lower case" msgstr "TX todo en minúsculas" #: src/dialogs/confdialog.cxx:5423 msgid "Exit prompts" msgstr "Preguntas de Salida" #: src/dialogs/confdialog.cxx:5426 msgid "Prompt to save Configuration" msgstr "Preguntar si guardo la configuración" #: src/dialogs/confdialog.cxx:5431 msgid "Prompt to save macro file" msgstr "Preguntar si salvo el archivo de macros" #: src/dialogs/confdialog.cxx:5432 src/dialogs/confdialog.cxx:5689 msgid "Write current macro set on program exit" msgstr "Grabar el juego de macros actuales al cerrar el programa" #: src/dialogs/confdialog.cxx:5437 msgid "Prompt to save log" msgstr "Preguntar si salvo el log" #: src/dialogs/confdialog.cxx:5438 src/dialogs/confdialog.cxx:5491 msgid "Bug me about saving log entries" msgstr "Preguntarme acerca de guardar entradas en el log" #: src/dialogs/confdialog.cxx:5443 msgid "" "Exit prompts active only when File/Exit menu item selected.\n" "Not active if window decoration close button pressed." msgstr "" "Están activas solo cuando cierras usando el menú Archivo/Salir.\n" "No se activan cuando das click en el botón de cerrar en la ventana." #: src/dialogs/confdialog.cxx:5448 msgid "Confirm exit" msgstr "Confirmar la salida" #: src/dialogs/confdialog.cxx:5455 msgid "Check for updates" msgstr "Comprobar si existen actualizaciones" #: src/dialogs/confdialog.cxx:5458 msgid "Check for updates when starting program" msgstr "Verificar si hay actualizaciones al iniciar el programa" #: src/dialogs/confdialog.cxx:5467 msgid "Logging" msgstr "Registro de QSO" #: src/dialogs/confdialog.cxx:5469 msgid "Client/Server Logbook" msgstr "Logs remotos cliente/servidor" #: src/dialogs/confdialog.cxx:5472 msgid "Address:" msgstr "Servidor:" #: src/dialogs/confdialog.cxx:5473 msgid "Enter URL address of server" msgstr "Entre la dirección URL del servidor" #: src/dialogs/confdialog.cxx:5477 src/dialogs/confdialog.cxx:9460 msgid "Port:" msgstr "Puerto:" #: src/dialogs/confdialog.cxx:5478 msgid "Enter Port # assigned to server" msgstr "Número de puerto asignado al servidor" #: src/dialogs/confdialog.cxx:5482 msgid "Reconnect" msgstr "Reconectar" #: src/dialogs/confdialog.cxx:5487 msgid "QSO logging" msgstr "Guardado de los QSO" #: src/dialogs/confdialog.cxx:5490 msgid "Prompt to save log on exit" msgstr "Preguntar si salvo el log al salir" #: src/dialogs/confdialog.cxx:5496 msgid "Clear on save" msgstr "Limpiar cuando salves" #: src/dialogs/confdialog.cxx:5497 msgid "Clear log entries after saving or using macro " msgstr "" "Limpiar la entradas del log después\n" "de guardar o usar la macro " #: src/dialogs/confdialog.cxx:5502 msgid "Convert callsign to upper case" msgstr "Convertir el indicativo a mayúsculas" #: src/dialogs/confdialog.cxx:5503 msgid "Force callsign field to UPPERCASE" msgstr "Forzar el campo indicativo a MAYUSCULAS" #: src/dialogs/confdialog.cxx:5508 msgid "Auto-fill Country and Azimuth" msgstr "Auto rellenar el país y azimut" #: src/dialogs/confdialog.cxx:5509 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "" "Auto rellenar la información del país y el azimut usando el fichero cty.dat " "(Lo tienes instalado, cierto?)" #: src/dialogs/confdialog.cxx:5514 msgid "Sort by Date/Time OFF" msgstr "Ordenar por fecha/hora de fin" #: src/dialogs/confdialog.cxx:5515 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" "Ordenar por fecha y hora de terminación del QSO\n" "Afecta a todos los libros de guardias con formato Cabrillo/ADIF" #: src/dialogs/confdialog.cxx:5520 msgid "Date time ON == OFF" msgstr "Fecha y hora de inicio = fin" #: src/dialogs/confdialog.cxx:5521 msgid "Force date/time ON == date/time OFF" msgstr "Forzar fecha/hora de inicio = fecha/hora de final del QSO" #: src/dialogs/confdialog.cxx:5526 msgid "Default RST in to 599" msgstr "Poner siempre RST recibido a 599" #: src/dialogs/confdialog.cxx:5527 msgid "Clear log controls sets RST in to 599" msgstr "" "Al limpiar los datos del contacto\n" "pone el RST recibido a 599 por defecto" #: src/dialogs/confdialog.cxx:5532 msgid "Default RST out to 599" msgstr "Poner siempre RST enviado a 599" #: src/dialogs/confdialog.cxx:5533 msgid "Clear log controls sets RST out to 599" msgstr "" "Al limpiar los datos del contacto\n" "pone el RST enviado a 599 por defecto" #: src/dialogs/confdialog.cxx:5538 msgid "cty.dat pathname" msgstr "Camino a cty.dat" #: src/dialogs/confdialog.cxx:5539 msgid "Enter full path-filename for cty.dat" msgstr "" "Entre camino completo hasta el fichero cty.dat\n" "Se cargarán (si se encuentran) del mismo lugar los ficheros:\n" "eQSL.cc: AGMemberList.txt\n" "LoTW: lotw1.txt" #: src/dialogs/confdialog.cxx:5552 msgid "Browse" msgstr "Buscar" #: src/dialogs/confdialog.cxx:5553 msgid "Locate cty.dat file" msgstr "Buscar el fichero cty.dat" #: src/dialogs/confdialog.cxx:5556 src/dialogs/confdialog.cxx:5914 #: src/dialogs/confdialog.cxx:5934 src/dialogs/confdialog.cxx:6648 msgid "Default" msgstr "Por defecto" #: src/dialogs/confdialog.cxx:5557 msgid "Restore cty.dat default folder" msgstr "Restablecer carpeta de cty.dat por defecto" #: src/dialogs/confdialog.cxx:5560 msgid "Reload" msgstr "Recargar" #: src/dialogs/confdialog.cxx:5561 msgid "Reload cty.dat" msgstr "Recargar cty.dat" #: src/dialogs/confdialog.cxx:5564 msgid "Transmit Power" msgstr "Potencia TX" #: src/dialogs/confdialog.cxx:5565 msgid "Tx power used for logbook entries" msgstr "Potencia de TX a poner en el log" #: src/dialogs/confdialog.cxx:5581 msgid "Rx Text Capture" msgstr "Captura de Texto de RX" #: src/dialogs/confdialog.cxx:5584 msgid "Double-click to capture" msgstr "Doble-click para capturar" #: src/dialogs/confdialog.cxx:5585 msgid "Enable if you cannot use the middle mouse button" msgstr "Activalo si no puedes usar el botón del centro del ratón" #: src/dialogs/confdialog.cxx:5590 msgid "callsign tooltips in received text" msgstr "Mostrar información de los indicativos" #: src/dialogs/confdialog.cxx:5591 msgid "Popup info after a 2 second hover on a callsign" msgstr "" "Mostrar información de un indicativo después\n" "de estar dos segundos con el ratón sobre este" #: src/dialogs/confdialog.cxx:5596 msgid "Word delimiters" msgstr "Delimitadores" #: src/dialogs/confdialog.cxx:5597 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" "Las entradas de texto de Rx están delimitadas por los\n" "caracteres definidos aquí, el tabulador, el espacio y la\n" "nueva línea están ya incluidos" #: src/dialogs/confdialog.cxx:5621 msgid "Mouse wheel active on macro buttons" msgstr "Rueda del ratón activa en los botones de macro" #: src/dialogs/confdialog.cxx:5622 msgid "enable mouse wheel control of macro bar" msgstr "Activar la rueda del ratón como control de la barra de macros" #: src/dialogs/confdialog.cxx:5629 msgid "Number and position of macro bars" msgstr "Seleccionar el # y posición de la(s) barra(s) de macro(s)" #: src/dialogs/confdialog.cxx:5632 msgid "One bar (above waterfall)" msgstr "Una barra (Encima de la cascada)" #: src/dialogs/confdialog.cxx:5637 msgid "One bar (below waterfall)" msgstr "Una barra (debajo de la cascada)" #: src/dialogs/confdialog.cxx:5642 msgid "Two bars (scheme 1)" msgstr "Dos barras (Esquema 1)" #: src/dialogs/confdialog.cxx:5647 msgid "Two bars (scheme 2)" msgstr "Dos barras (Esquema 2)" #: src/dialogs/confdialog.cxx:5652 msgid "Two bars (scheme 3)" msgstr "Dos barras (Esquema 3)" #: src/dialogs/confdialog.cxx:5657 msgid "Two bars (scheme 4)" msgstr "Dos barras (Esquema 4)" #: src/dialogs/confdialog.cxx:5662 msgid "Two bars (scheme 5)" msgstr "Dos barras (Esquema 5)" #: src/dialogs/confdialog.cxx:5667 msgid "Two bars (scheme 6)" msgstr "Dos barras (Esquema 6)" #: src/dialogs/confdialog.cxx:5676 msgid "Load last used macro file on startup" msgstr "Cargar el último archivo de macro usado en el inicio" #: src/dialogs/confdialog.cxx:5677 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "Activado - Usar el último conjunto de macros\n" "Desactivado - Usar el conjunto pre-establecido" #: src/dialogs/confdialog.cxx:5682 msgid "Display macro filename on startup" msgstr "Mostrar el nombre del fichero de macros al iniciar" #: src/dialogs/confdialog.cxx:5683 msgid "The filename is written to the RX text area" msgstr "El nombre de fichero es escrito en el panel de Rx" #: src/dialogs/confdialog.cxx:5688 msgid "Prompt to save macro file when closing" msgstr "Preguntar si salvo el archivo de macros al cerrar" #: src/dialogs/confdialog.cxx:5698 msgid "WF Ctrls" msgstr "Cascada" #: src/dialogs/confdialog.cxx:5702 msgid "Enable check box to show each respective operator control" msgstr "Activa la casilla para mostrar cada control respectivo" #: src/dialogs/confdialog.cxx:5712 msgid "WF Magnification" msgstr "Ampliado de Cascada" #: src/dialogs/confdialog.cxx:5718 msgid "WF carrier" msgstr "Carrier de la Cascada" #: src/dialogs/confdialog.cxx:5724 msgid "WF Shift Controls" msgstr "Controles superiores de la Casc." #: src/dialogs/confdialog.cxx:5730 msgid "WF ref level" msgstr "Nivel de referencia de la Cascada" #: src/dialogs/confdialog.cxx:5736 msgid "WF drop rate" msgstr "Vel. de caída de la Cascada" #: src/dialogs/confdialog.cxx:5742 msgid "WF amp span" msgstr "Amplitud de la Cascada" #: src/dialogs/confdialog.cxx:5748 msgid "WF Store" msgstr "Almacenar frecuencia" #: src/dialogs/confdialog.cxx:5754 msgid "WF mode" msgstr "Modo de la Cascada" #: src/dialogs/confdialog.cxx:5760 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:5766 msgid "XMT lock" msgstr "Bloqueo en Tx" #: src/dialogs/confdialog.cxx:5772 msgid "Enable all" msgstr "Activar" #: src/dialogs/confdialog.cxx:5775 msgid "Disable all" msgstr "Desactivar" #: src/dialogs/confdialog.cxx:5782 msgid "Colors/Fonts" msgstr "Colores y letras" #: src/dialogs/confdialog.cxx:5785 msgid "Rx/Tx" msgstr "Rx/Tx" #: src/dialogs/confdialog.cxx:5786 #, fuzzy msgid "Rx/Tx Character set" msgstr "Seleccionar la tipografía de Rx/Tx" #: src/dialogs/confdialog.cxx:5787 msgid "Select Rx/Tx Character Set" msgstr "Seleccionar la tipografía de Rx/Tx" #: src/dialogs/confdialog.cxx:5807 msgid "Rx bkgnd" msgstr "Rx fondo" #: src/dialogs/confdialog.cxx:5810 msgid "Tx bkgnd" msgstr "Tx fondo" #: src/dialogs/confdialog.cxx:5819 msgid "Rx font" msgstr "Texto Rx" #: src/dialogs/confdialog.cxx:5822 msgid "Tx font" msgstr "Texto Tx" #: src/dialogs/confdialog.cxx:5825 msgid "Text Highlighting" msgstr "Texto Resaltado" #: src/dialogs/confdialog.cxx:5828 msgid "XMIT" msgstr "XMIT" #: src/dialogs/confdialog.cxx:5829 msgid "Sent chars in Rx/Tx pane" msgstr "Caracteres enviados en el panel de Rx/Tx" #: src/dialogs/confdialog.cxx:5834 msgid "CTRL" msgstr "CTRL" #: src/dialogs/confdialog.cxx:5835 msgid "Control chars in Rx/Tx pane" msgstr "Caracteres de control en el panel de Rx/Tx" #: src/dialogs/confdialog.cxx:5840 msgid "SKIP" msgstr "SKIP" #: src/dialogs/confdialog.cxx:5841 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "Caracteres ignorados en el panel de TX\n" "(Tx enc./apag. en CW)" #: src/dialogs/confdialog.cxx:5846 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:5847 msgid "Alternate character color in Rx panelr" msgstr "Color alternativo de los caracteres en el panel de Rxr" #: src/dialogs/confdialog.cxx:5852 msgid "SEL" msgstr "SEL" #: src/dialogs/confdialog.cxx:5853 msgid "Selection background color in Rx Tx panels" msgstr "Fondo de color de la selección en los paneles de Rx/Tx" #: src/dialogs/confdialog.cxx:5858 src/dialogs/confdialog.cxx:5981 msgid "System" msgstr "Sistema" #: src/dialogs/confdialog.cxx:5861 src/dialogs/confdialog.cxx:5971 #: src/logbook/lgbook.cxx:563 msgid "Defaults" msgstr "Reiniciar" #: src/dialogs/confdialog.cxx:5868 msgid "Frq Disp" msgstr "Frecuencia" #: src/dialogs/confdialog.cxx:5872 msgid "14070.150" msgstr "14070.150" #: src/dialogs/confdialog.cxx:5881 src/dialogs/confdialog.cxx:5911 #: src/dialogs/confdialog.cxx:5931 msgid "Font" msgstr "Letra:" #: src/dialogs/confdialog.cxx:5884 src/dialogs/confdialog.cxx:5908 #: src/dialogs/confdialog.cxx:5928 msgid "Bg Color" msgstr "Fondo" #: src/dialogs/confdialog.cxx:5887 msgid "Digit Color" msgstr "Dígitos" #: src/dialogs/confdialog.cxx:5890 msgid "Sys Colors" msgstr "Sistema" #: src/dialogs/confdialog.cxx:5897 msgid "Log" msgstr "Log" #: src/dialogs/confdialog.cxx:5899 msgid "Logging Panel Controls" msgstr "Controles en la interfaz" #: src/dialogs/confdialog.cxx:5919 msgid "Logbook Dialog" msgstr "Libro de guardia" #: src/dialogs/confdialog.cxx:5941 msgid "F_keys" msgstr "Teclas F" #: src/dialogs/confdialog.cxx:5943 msgid "Use colored buttons" msgstr "Usa botones coloreados" #: src/dialogs/confdialog.cxx:5948 msgid "Group 1" msgstr "Grupo 1" #: src/dialogs/confdialog.cxx:5949 msgid "Background color for Function key group 1" msgstr "Color de fondo para el grupo de teclas de función 1" #: src/dialogs/confdialog.cxx:5954 msgid "Group 2" msgstr "Grupo 2" #: src/dialogs/confdialog.cxx:5955 msgid "Background color for Function key group 2" msgstr "Color de fondo para el grupo de teclas de función 2" #: src/dialogs/confdialog.cxx:5960 msgid "Group 3" msgstr "Grupo 3" #: src/dialogs/confdialog.cxx:5961 msgid "Background color for Function key group 3" msgstr "Color de fondo para el grupo de teclas de función 3" #: src/dialogs/confdialog.cxx:5966 msgid "Label text" msgstr "Texto" #: src/dialogs/confdialog.cxx:5976 msgid "Tabs" msgstr "Pestañas" #: src/dialogs/confdialog.cxx:5978 msgid "Tab Color" msgstr "Color" #: src/dialogs/confdialog.cxx:5986 msgid "Buttons" msgstr "Botones" #: src/dialogs/confdialog.cxx:5988 msgid "Spot" msgstr "Spot" #: src/dialogs/confdialog.cxx:5991 msgid "RxID" msgstr "RxID" #: src/dialogs/confdialog.cxx:5994 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:5997 msgid "Tune" msgstr "Sint." #: src/dialogs/confdialog.cxx:6000 msgid "Lk" msgstr "Lk" #: src/dialogs/confdialog.cxx:6003 msgid "Rev" msgstr "Inv." #: src/dialogs/confdialog.cxx:6006 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:6009 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:6012 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:6015 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:6061 msgid "Lighted button enabled colors" msgstr "Colores de los botones iluminados" #: src/dialogs/confdialog.cxx:6066 msgid "SigLvl" msgstr "Señal" #: src/dialogs/confdialog.cxx:6068 src/dialogs/confdialog.cxx:9023 msgid "Low" msgstr "Bajo" #: src/dialogs/confdialog.cxx:6076 src/dialogs/confdialog.cxx:9023 msgid "High" msgstr "Alto" #: src/dialogs/confdialog.cxx:6084 msgid "Normal" msgstr "Normal" #: src/dialogs/confdialog.cxx:6092 msgid "Over" msgstr "Mucho" #: src/dialogs/confdialog.cxx:6100 msgid "Signal Level Colors" msgstr "Colores de detección de nivel" #: src/dialogs/confdialog.cxx:6117 msgid "Display" msgstr "Mostrar" #: src/dialogs/confdialog.cxx:6118 msgid "Colors and cursors" msgstr "Colores y cursores" #: src/dialogs/confdialog.cxx:6121 msgid "aa" msgstr "aa" #: src/dialogs/confdialog.cxx:6136 src/dialogs/confdialog.cxx:6140 #: src/dialogs/confdialog.cxx:6144 src/dialogs/confdialog.cxx:6148 #: src/dialogs/confdialog.cxx:6152 src/dialogs/confdialog.cxx:6156 #: src/dialogs/confdialog.cxx:6160 src/dialogs/confdialog.cxx:6164 #: src/dialogs/confdialog.cxx:6168 src/dialogs/confdialog.cxx:6189 #: src/dialogs/confdialog.cxx:6213 src/dialogs/confdialog.cxx:6237 #: src/dialogs/confdialog.cxx:6255 msgid "Change color" msgstr "Cambiar color" #: src/dialogs/confdialog.cxx:6171 msgid "Load..." msgstr "Cargar..." #: src/dialogs/confdialog.cxx:6172 msgid "Load a new palette" msgstr "Cargar una nueva paleta" #: src/dialogs/confdialog.cxx:6175 msgid "Save..." msgstr "Guardar..." #: src/dialogs/confdialog.cxx:6176 msgid "Save this palette" msgstr "Guardar esta paleta" #: src/dialogs/confdialog.cxx:6179 src/dialogs/confdialog.cxx:7315 #: src/dialogs/confdialog.cxx:7411 msgid "Bandwidth" msgstr "Ancho de banda" #: src/dialogs/confdialog.cxx:6182 src/dialogs/confdialog.cxx:6206 #: src/dialogs/confdialog.cxx:6230 msgid "ON" msgstr "Activo" #: src/dialogs/confdialog.cxx:6183 msgid "Show cursor with bandwidth lines" msgstr "Mostar el cursos con las líneas de ancho de banda" #: src/dialogs/confdialog.cxx:6188 src/dialogs/confdialog.cxx:6212 #: src/dialogs/confdialog.cxx:6236 src/dialogs/confdialog.cxx:6254 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "Color" #: src/dialogs/confdialog.cxx:6195 src/dialogs/confdialog.cxx:6219 #: src/dialogs/confdialog.cxx:6243 msgid "Wide" msgstr "Ancho" #: src/dialogs/confdialog.cxx:6196 src/dialogs/confdialog.cxx:6220 #: src/dialogs/confdialog.cxx:6231 src/dialogs/confdialog.cxx:6244 msgid "Show bandwidth tracks on waterfall" msgstr "Mostrar las pistas de ancho de banda en la cascada" #: src/dialogs/confdialog.cxx:6203 msgid "Center line" msgstr "Línea central" #: src/dialogs/confdialog.cxx:6207 msgid "Show cursor with center line" msgstr "Mostrar el cursor con la línea central" #: src/dialogs/confdialog.cxx:6227 msgid "Signal tracks" msgstr "Marcas de Linea" #: src/dialogs/confdialog.cxx:6251 msgid "Notch" msgstr "Muesca" #: src/dialogs/confdialog.cxx:6265 msgid "Frequency scale" msgstr "Escala de frecuencia" #: src/dialogs/confdialog.cxx:6268 msgid "Always show audio frequencies" msgstr "Siempre mostrar las frecuencias de audio" #: src/dialogs/confdialog.cxx:6269 msgid "Audio or RF frequencies on waterfall scale" msgstr "Frecuencias de audio o RF en la escala de la cascada" #: src/dialogs/confdialog.cxx:6275 msgid "Select waterfall scale font" msgstr "Selecciona la escala de la tipografía de la cascada" #: src/dialogs/confdialog.cxx:6280 msgid "Transmit signal" msgstr "Señal transmitida" #: src/dialogs/confdialog.cxx:6283 msgid "Monitor transmitted signal" msgstr "Monitorear la señal transmitida" #: src/dialogs/confdialog.cxx:6284 msgid "Show transmit signal on waterfall" msgstr "Mostrar la señal transmitida en la cascada" #: src/dialogs/confdialog.cxx:6289 msgid "Signal level" msgstr "Nivel de señal" #: src/dialogs/confdialog.cxx:6290 msgid "Set level for good viewing" msgstr "Establecer el nivel para un visionado aceptable" #: src/dialogs/confdialog.cxx:6312 msgid "FFT Processing" msgstr "Procesamiento FFT" #: src/dialogs/confdialog.cxx:6316 src/dialogs/confdialog.cxx:6668 msgid "Lower limit" msgstr "límite inferior" #: src/dialogs/confdialog.cxx:6317 msgid "Low frequency limit in Hz" msgstr "Límite inferior de frecuencia en Hz" #: src/dialogs/confdialog.cxx:6336 msgid "FFT averaging" msgstr "Promedio de FFT" #: src/dialogs/confdialog.cxx:6337 msgid "Use averaging to decrease waterfall noise" msgstr "Usar promedio para disminuir el ruido en la cascada" #: src/dialogs/confdialog.cxx:6342 msgid "FFT prefilter window function" msgstr "Función de ventana de prefiltro FFT" #: src/dialogs/confdialog.cxx:6343 msgid "Select the type of FFT prefilter" msgstr "Seleccionar el tipo de prefiltro de FFT" #: src/dialogs/confdialog.cxx:6354 msgid "Rectangular" msgstr "Rectangular" #: src/dialogs/confdialog.cxx:6356 msgid "Triangular" msgstr "Triangular" #: src/dialogs/confdialog.cxx:6361 src/dialogs/confdialog.cxx:6680 msgid "Upper limit" msgstr "Límite superior" #: src/dialogs/confdialog.cxx:6362 msgid "High frequency limit in Hz" msgstr "Límite superior de frecuencia en Hz" #: src/dialogs/confdialog.cxx:6381 msgid "Latency" msgstr "" #: src/dialogs/confdialog.cxx:6382 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:6404 msgid "Show me more or less waterfall" msgstr "Mostrar más o menos cascada" #: src/dialogs/confdialog.cxx:6407 msgid "Waterfall height in pixels" msgstr "Altura de la cascada" #: src/dialogs/confdialog.cxx:6408 msgid "CPU usage increases with waterfall height" msgstr "El uso del CPU aumenta con el alto de la cascada" #: src/dialogs/confdialog.cxx:6431 msgid "Mouse" msgstr "Ratón" #: src/dialogs/confdialog.cxx:6435 msgid "Left or right click always replays audio history" msgstr "Clic derecho o izquierdo siempre reproduce la historia del audio" #: src/dialogs/confdialog.cxx:6436 msgid "Replay trackline audio" msgstr "Reproducir el audio del buffer ante un clic en la cascada" #: src/dialogs/confdialog.cxx:6441 msgid "Dragging on the waterfall scale changes frequency" msgstr "Agarrar y arrastar en la cascada cambia la frecuencia" #: src/dialogs/confdialog.cxx:6442 msgid "Enable drag cursor on waterfall scale" msgstr "Activar el arrastrado del cursor en la cascada" #: src/dialogs/confdialog.cxx:6447 msgid "Insert text on single left click" msgstr "Insertar texto en un solo clic izquierdo" #: src/dialogs/confdialog.cxx:6448 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" "Insertar un texto especial en el panel de Rx\n" "cuando se da clic en la cascada" #: src/dialogs/confdialog.cxx:6454 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" "La cadena es remplazada con\n" "el modo actual y la frecuencia" #: src/dialogs/confdialog.cxx:6468 msgid "Wheel action" msgstr "Acción de la rueda del ratón en la cascada" #: src/dialogs/confdialog.cxx:6469 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Selecciona como la ruera del ratón se\n" "comporta dentro de la cascada" #: src/dialogs/confdialog.cxx:6494 src/dialogs/confdialog.cxx:9177 #: src/dialogs/confdialog.cxx:9492 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:6502 msgid "Filter bandwidth" msgstr "Ancho de banda del filtro" #: src/dialogs/confdialog.cxx:6503 msgid "CW dsp filter bandwidth" msgstr "Ancho de banda del filtro DSP de CW" #: src/dialogs/confdialog.cxx:6523 msgid "Rx WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:6529 msgid "Tracked CW speed in WPM" msgstr "Velocidad de seguimiento en CW (WPM)" #: src/dialogs/confdialog.cxx:6534 msgid "SOM decoding" msgstr "Decodificación MAO" #: src/dialogs/confdialog.cxx:6535 msgid "Self Organizing Mapping" msgstr "" "Mapas Auto Organizados (Self Organizing Mapping)\n" "Es un algoritmo de inteligencia artificial que mejora la decodificación." #: src/dialogs/confdialog.cxx:6541 msgid "Lower" msgstr "Inferior" #: src/dialogs/confdialog.cxx:6542 msgid "Detector low threshold" msgstr "Nivel bajo del detector" #: src/dialogs/confdialog.cxx:6561 msgid "Upper" msgstr "Superior" #: src/dialogs/confdialog.cxx:6562 msgid "Detector high threshold" msgstr "Nivel alto del detector" #: src/dialogs/confdialog.cxx:6581 msgid "Matched Filter" msgstr "Filtro" #: src/dialogs/confdialog.cxx:6582 msgid "Matched Filter bandwidth" msgstr "Ancho de banda del filtro" #: src/dialogs/confdialog.cxx:6588 msgid "FFT filter" msgstr "Filtro FFT" #: src/dialogs/confdialog.cxx:6589 msgid "FFT / FIR filter" msgstr "Filtro FFT / FIR" #: src/dialogs/confdialog.cxx:6595 msgid "Tracking" msgstr "Seguimiento" #: src/dialogs/confdialog.cxx:6596 msgid "Automatic Rx speed tracking" msgstr "Seguimiento automático de la velocidad de Rx" #: src/dialogs/confdialog.cxx:6602 msgid "Range, WPM" msgstr "Rango (WPM)" #: src/dialogs/confdialog.cxx:6603 msgid "Range +/- wpm" msgstr "Rango +/- wpm" #: src/dialogs/confdialog.cxx:6627 msgid "TX WPM" msgstr "TX WPM" #: src/dialogs/confdialog.cxx:6628 src/dialogs/confdialog.cxx:6693 msgid "My transmit CW WPM" msgstr "Mi velocidad CW (WPM)" #: src/dialogs/confdialog.cxx:6649 msgid "The default CW speed" msgstr "La velocidad predefinida en CW" #: src/dialogs/confdialog.cxx:6669 msgid "No slower than this" msgstr "No más lento que" #: src/dialogs/confdialog.cxx:6681 msgid "No faster than this" msgstr "No más rápido que" #: src/dialogs/confdialog.cxx:6692 msgid "F-WPM" msgstr "F-WPM" #: src/dialogs/confdialog.cxx:6713 msgid "Use Farnsworth timing" msgstr "Usar tiempos Farnsworth" #: src/dialogs/confdialog.cxx:6722 msgid "Timing and QSK" msgstr "Tiempos y QSK" #: src/dialogs/confdialog.cxx:6725 msgid "Timing" msgstr "Temporización" #: src/dialogs/confdialog.cxx:6728 msgid "Weight (%)" msgstr "Peso (en %)" #: src/dialogs/confdialog.cxx:6729 msgid "Dot to dot-space ratio" msgstr "Relación punto a punto-raya" #: src/dialogs/confdialog.cxx:6748 src/dialogs/confdialog.cxx:6749 msgid "Dash to dot ratio" msgstr "Relación punto a raya" #: src/dialogs/confdialog.cxx:6767 msgid "Edge timing" msgstr "Tiempos de borde" #: src/dialogs/confdialog.cxx:6768 msgid "Leading and Trailing edge risetimes (msec)" msgstr "Tiempos de subida y bajada del pulso (ms)" #: src/dialogs/confdialog.cxx:6786 msgid "Edge shape" msgstr "Forma del borde" #: src/dialogs/confdialog.cxx:6787 msgid "Raised cosine = Hanning" msgstr "Coseno elevado = Hanning" #: src/dialogs/confdialog.cxx:6803 msgid "Edge decreases pulse width" msgstr "Los bordes de subida y bajada disminuyen el ancho del pulso" #: src/dialogs/confdialog.cxx:6804 msgid "Weight decreases with increasing edge timing" msgstr "" "El peso disminuye con el incremento de los tiempos de borde de los pulsos" #: src/dialogs/confdialog.cxx:6811 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:6814 msgid "QSK on right audio channel" msgstr "QSK en el canal derecho de audio" #: src/dialogs/confdialog.cxx:6815 msgid "Generate square wave signal on right channel" msgstr "Generar una onda cuadrada en el canal derecho" #: src/dialogs/confdialog.cxx:6820 msgid "Pre-keydown timing (ms)" msgstr "Tiempos anteriores al PTT (ms)" #: src/dialogs/confdialog.cxx:6821 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "PTT es enviado N milisegundos antes del pulso real" #: src/dialogs/confdialog.cxx:6839 msgid "Post-keydown timing (ms)" msgstr "Tiempos posteriores al PTT (ms)" #: src/dialogs/confdialog.cxx:6840 msgid "Msec post-keydown (+ is earlier in time)" msgstr "PTT es soltado N milisegundos después del pulso real" #: src/dialogs/confdialog.cxx:6858 msgid "Send continuously" msgstr "Enviar continuamente" #: src/dialogs/confdialog.cxx:6859 msgid "Send a continuous stream of test characters" msgstr "Enviar flujo de los carcteres de prueba" #: src/dialogs/confdialog.cxx:6864 msgid "Test char" msgstr "Caracter de prueba" #: src/dialogs/confdialog.cxx:6865 msgid "Test character for QSK adjustment" msgstr "Probar el caracter para ajuste de QSK" #: src/dialogs/confdialog.cxx:6885 msgid "Prosigns" msgstr "Prosigns" #: src/dialogs/confdialog.cxx:6890 msgid "Use '(' paren not KN" msgstr "Usar '(' en ves de KN" #: src/dialogs/confdialog.cxx:6897 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6914 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6931 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6948 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6964 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6981 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6998 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7015 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7032 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7055 msgid "Dom" msgstr "DomEX" #: src/dialogs/confdialog.cxx:7059 src/dialogs/confdialog.cxx:7902 msgid "Secondary Text" msgstr "Texto secundario" #: src/dialogs/confdialog.cxx:7060 src/dialogs/confdialog.cxx:7903 msgid "Text to send during keyboard idle times" msgstr "" "Texto a enviar durante los períodos de no actividad\n" "del teclado (canal secundario)" #: src/dialogs/confdialog.cxx:7074 src/dialogs/confdialog.cxx:7917 msgid "Filtering" msgstr "Filtraje" #: src/dialogs/confdialog.cxx:7075 msgid "Use DSP filter before decoder" msgstr "Usar el filtro DSP antes del decodificador" #: src/dialogs/confdialog.cxx:7081 src/dialogs/confdialog.cxx:7924 msgid "Filter bandwidth factor" msgstr "Factor de ancho de banda del filtro" #: src/dialogs/confdialog.cxx:7082 src/dialogs/confdialog.cxx:7925 msgid "Filter bandwidth relative to signal width" msgstr "Ancho de banda del filtro relativo al ancho de la señal" #: src/dialogs/confdialog.cxx:7100 msgid "FEC" msgstr "FEC" #: src/dialogs/confdialog.cxx:7101 msgid "Enable MultiPSK-compatible FEC" msgstr "Activar el FEC compatible con MultiPSK" #: src/dialogs/confdialog.cxx:7106 src/dialogs/confdialog.cxx:7943 msgid "CWI threshold" msgstr "Humbral de CWI" #: src/dialogs/confdialog.cxx:7107 src/dialogs/confdialog.cxx:7944 msgid "CWI detection and suppression" msgstr "Detección y supresión de CWI" #: src/dialogs/confdialog.cxx:7123 src/dialogs/confdialog.cxx:7979 msgid "Paths (hidden)" msgstr "Caminos (Oculto)" #: src/dialogs/confdialog.cxx:7147 msgid "Feld" msgstr "Feld-Hell" #: src/dialogs/confdialog.cxx:7151 msgid "Transmit font" msgstr "Tipografía de Tx" #: src/dialogs/confdialog.cxx:7152 msgid "Select TX raster font" msgstr "Seleccionar la tipografía de Tx" #: src/dialogs/confdialog.cxx:7168 msgid "Reverse video" msgstr "Video inverso" #: src/dialogs/confdialog.cxx:7169 msgid "Display RX in reverse video" msgstr "Mostrar Rx en video inverso" #: src/dialogs/confdialog.cxx:7174 msgid "Transmit width" msgstr "Ancho de la Transmisión" #: src/dialogs/confdialog.cxx:7175 msgid "# of multiple scans / character line" msgstr "# de multiples escaneos / lineas de caracteres" #: src/dialogs/confdialog.cxx:7190 msgid "Halve receive width" msgstr "Ancho de Rx a la mitad" #: src/dialogs/confdialog.cxx:7191 msgid "Compress Rx in time" msgstr "Comprimir Rx en el tiempo" #: src/dialogs/confdialog.cxx:7196 msgid "Pulse shape" msgstr "Forma del pulso" #: src/dialogs/confdialog.cxx:7197 msgid "Raised cosine pulse shape factor" msgstr "Factor de forma pulsada al coseno elevado " #: src/dialogs/confdialog.cxx:7208 msgid "Slow (4 msec)" msgstr "Lento (4 ms)" #: src/dialogs/confdialog.cxx:7209 msgid "Fast (2 msec)" msgstr "Rápido (2 ms)" #: src/dialogs/confdialog.cxx:7214 msgid "Receive filter bandwidth" msgstr "Ancho de banda del filtro de Rx" #: src/dialogs/confdialog.cxx:7215 msgid "Adjust the DSP bandwidth" msgstr "Ajustar el ancho de banda del DSP" #: src/dialogs/confdialog.cxx:7235 msgid "Transmit periods (.) when idle" msgstr "Transmitir puntos (...) cuando holgazanee" #: src/dialogs/confdialog.cxx:7236 msgid "Transmits a diddle dot when no keyboard activity" msgstr "" "Transmitir puntos continuos (.......)\n" "cuando no halla que transmitir" #: src/dialogs/confdialog.cxx:7242 msgid "2x Xmt Width (hidden)" msgstr "2x Tx ancho (oculto)" #: src/dialogs/confdialog.cxx:7252 msgid "MT-63" msgstr "MT-63" #: src/dialogs/confdialog.cxx:7257 src/dialogs/confdialog.cxx:7398 msgid "8-bit extended characters (UTF-8)" msgstr "Caracteres extendidos de 8bits (UTF-8)" #: src/dialogs/confdialog.cxx:7258 msgid "Enable this for UTF-8 characters" msgstr "Active esto para caracteres acentuados (UTF-8)" #: src/dialogs/confdialog.cxx:7264 msgid "Long receive integration" msgstr "Larga integración en Rx" #: src/dialogs/confdialog.cxx:7265 msgid "Enable for very weak signals" msgstr "Activar para señales muy debiles" #: src/dialogs/confdialog.cxx:7275 msgid "Transmit lower start tone" msgstr "Transmitir tono de inicio bajo" #: src/dialogs/confdialog.cxx:7280 msgid "Transmit upper start tone" msgstr "Transmitir tono de inicio alto" #: src/dialogs/confdialog.cxx:7286 msgid "Tone Duration (secs)" msgstr "Duración del tono (s)" #: src/dialogs/confdialog.cxx:7302 msgid "Allow manual tuning" msgstr "Permitir sintonía manual" #: src/dialogs/confdialog.cxx:7311 msgid "Olivia" msgstr "Olivia" #: src/dialogs/confdialog.cxx:7316 src/dialogs/confdialog.cxx:7412 msgid "Select bandwidth" msgstr "Selecciona el ancho de banda" #: src/dialogs/confdialog.cxx:7332 src/dialogs/confdialog.cxx:7428 msgid "Tones" msgstr "Tonos" #: src/dialogs/confdialog.cxx:7333 src/dialogs/confdialog.cxx:7429 msgid "Select number of tones" msgstr "Seleccionar número de tonos" #: src/dialogs/confdialog.cxx:7349 src/dialogs/confdialog.cxx:7445 msgid "Receive synchronizer" msgstr "Sincronizador de Rx" #: src/dialogs/confdialog.cxx:7352 src/dialogs/confdialog.cxx:7448 msgid "Tune margin (tone frequency spacing)" msgstr "Margen de sintonía (espaciado de los tonos)" #: src/dialogs/confdialog.cxx:7353 src/dialogs/confdialog.cxx:7372 #: src/dialogs/confdialog.cxx:7449 src/dialogs/confdialog.cxx:7468 msgid "Change ONLY to experiment" msgstr "Cambiar SOLO PARA EXPERIMENTAR" #: src/dialogs/confdialog.cxx:7371 src/dialogs/confdialog.cxx:7467 msgid "Integration period (FEC blocks)" msgstr "Periodo de integrción (bloques FEC)" #: src/dialogs/confdialog.cxx:7390 src/dialogs/confdialog.cxx:7486 msgid "Reset FEC blocks when changing BW or Tones" msgstr "Reiniciar bloques FEC al cambiar ancho de banda o tonos" #: src/dialogs/confdialog.cxx:7391 src/dialogs/confdialog.cxx:7399 #: src/dialogs/confdialog.cxx:7487 msgid "Enable this for UTF-8 character transmission" msgstr "Active esto para caracteres acentuados (UTF-8)" #: src/dialogs/confdialog.cxx:7407 msgid "Cont'" msgstr "Contestia" #: src/dialogs/confdialog.cxx:7494 msgid "8-bit extended characters" msgstr "Caracteres extendidos de 8bits" #: src/dialogs/confdialog.cxx:7495 msgid "Enable this for Latin-1 accented characters" msgstr "Active esto para caracteres acentuados" #: src/dialogs/confdialog.cxx:7504 msgid "PSK" msgstr "PSK" #: src/dialogs/confdialog.cxx:7510 msgid "AFC behavior" msgstr "Comportamiento AFC" #: src/dialogs/confdialog.cxx:7513 msgid "Acquisition search range (Hz)" msgstr "Rango de búsqueda y adquisición (Hz)" #: src/dialogs/confdialog.cxx:7514 msgid "Capture signals within this frequency range" msgstr "Capturar señales dentro de este rango de frecuencias" #: src/dialogs/confdialog.cxx:7533 src/dialogs/confdialog.cxx:9354 msgid "Acquisition S/N (dB)" msgstr "S/N (dB) de adquisición" #: src/dialogs/confdialog.cxx:7534 src/dialogs/confdialog.cxx:9355 msgid "Capture signals over this threshold" msgstr "Capturar señales por encima de este nivel" #: src/dialogs/confdialog.cxx:7555 msgid "S/N and IMD behavior" msgstr "Comportamiento del S/N y IMD" #: src/dialogs/confdialog.cxx:7558 msgid "after" msgstr "despues" #: src/dialogs/confdialog.cxx:7559 msgid "Behavior of s/n imd" msgstr "Comportamiento del S/N y IMD" #: src/dialogs/confdialog.cxx:7570 msgid "Dim" msgstr "Atenuar" #: src/dialogs/confdialog.cxx:7575 msgid "seconds" msgstr "segundos" #: src/dialogs/confdialog.cxx:7576 msgid "Will occur after this time in seconds" msgstr "Ocurirá despues de este tiempo (s)" #: src/dialogs/confdialog.cxx:7596 msgid "Multi-Channel Signal Processing" msgstr "Procesamiento de la señal multi-canal" #: src/dialogs/confdialog.cxx:7599 msgid "Multi-channel detector" msgstr "Detector multicanal" #: src/dialogs/confdialog.cxx:7604 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "" "Procesamiento multicanal de la señal desactivado en PCs con CPUs\n" "muy lenta y no se usa el navegador de señal" #: src/dialogs/confdialog.cxx:7615 src/dialogs/confdialog.cxx:9511 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:7619 msgid "Rx" msgstr "Rx" #: src/dialogs/confdialog.cxx:7624 msgid "AFC speed" msgstr "Vel. del AFC" #: src/dialogs/confdialog.cxx:7625 msgid "AFC tracking speed" msgstr "Velocidad de rastreo del AFC" #: src/dialogs/confdialog.cxx:7641 msgid "RX - unshift on space" msgstr "No saltar en el espacio RX" #: src/dialogs/confdialog.cxx:7642 msgid "Revert to unshifted char's on a space" msgstr "Revertir el salto en espacio de los caracteres" #: src/dialogs/confdialog.cxx:7647 msgid "Filter Shape Factor" msgstr "Factor de ancho de banda del filtro" #: src/dialogs/confdialog.cxx:7648 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" "Coeficiente tiempo de rcos:\n" "1.0 ... 2.0\n" "W1HKJ recomienda 1.275\n" "DO2SMF recomienda 1.5" #: src/dialogs/confdialog.cxx:7660 msgid "Decode (CWI suppression)" msgstr "Detección y supresión de CWI" #: src/dialogs/confdialog.cxx:7663 msgid "Mark-Space" msgstr "Marca-Espacio" #: src/dialogs/confdialog.cxx:7668 msgid "Mark only" msgstr "Marca sola" #: src/dialogs/confdialog.cxx:7673 msgid "Space only" msgstr "Espacio solo" #: src/dialogs/confdialog.cxx:7680 msgid "RTTY Scope Display" msgstr "Configuración de Osciloscopio en RTTY" #: src/dialogs/confdialog.cxx:7683 msgid "Use cross hair scope" msgstr "Usar osc. de hilos cruzados" #: src/dialogs/confdialog.cxx:7684 msgid "Default to cross hair digiscope" msgstr "Osciloscopio de hilos cruzados por defecto" #: src/dialogs/confdialog.cxx:7689 msgid "XY - classic scope" msgstr "XY - Osc. clásico" #: src/dialogs/confdialog.cxx:7690 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" "Activado - usar filtros de salida Marca/Espacio\n" "Desactivado - usar seudo-señales" #: src/dialogs/confdialog.cxx:7697 msgid "Log RTTY frequency" msgstr "Frecuencia de log para RTTY" #: src/dialogs/confdialog.cxx:7700 msgid "Use MARK freq'" msgstr "Usar frec. MARCA" #: src/dialogs/confdialog.cxx:7701 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" "Activado - Guarda QSO usando la frecuencia de la Marca\n" "Desactivado - Guarda QSO usando frecuencia central" #: src/dialogs/confdialog.cxx:7708 msgid "track color" msgstr "Color" #: src/dialogs/confdialog.cxx:7709 msgid "Color of Mark Track" msgstr "Color de cursor en la Marca" #: src/dialogs/confdialog.cxx:7719 msgid "Tx" msgstr "Tx" #: src/dialogs/confdialog.cxx:7722 msgid "Carrier shift" msgstr "Salto de la portadora" #: src/dialogs/confdialog.cxx:7723 msgid "Select carrier shift" msgstr "Seleccionar el salto de la portadora" #: src/dialogs/confdialog.cxx:7738 msgid "Custom shift" msgstr "Salto ajustado" #: src/dialogs/confdialog.cxx:7739 msgid "Input carrier shift" msgstr "Salto de la portadora" #: src/dialogs/confdialog.cxx:7757 msgid "Baud rate" msgstr "Tasa de baudios" #: src/dialogs/confdialog.cxx:7758 msgid "Select carrier baudrate" msgstr "Seleccionar la tasa de baudios de la portadora" #: src/dialogs/confdialog.cxx:7773 msgid "Bits per character" msgstr "Bits por caracter" #: src/dialogs/confdialog.cxx:7774 msgid "Select # bits / char" msgstr "Selecciona el # bits / caracter" #: src/dialogs/confdialog.cxx:7789 msgid "Parity" msgstr "Paridad" #: src/dialogs/confdialog.cxx:7790 msgid "Select parity" msgstr "Seleccionar paridad" #: src/dialogs/confdialog.cxx:7805 msgid "Stop bits" msgstr "Bits de parda" #: src/dialogs/confdialog.cxx:7806 msgid "Select # stop bits" msgstr "Seleccionar # de bits de parada" #: src/dialogs/confdialog.cxx:7821 msgid "AutoCRLF" msgstr "Auto CRLF" #: src/dialogs/confdialog.cxx:7822 msgid "Add CRLF after page width characters" msgstr "Añadir CRLF después del ancho de caracteres de la página" #: src/dialogs/confdialog.cxx:7827 msgid "chars" msgstr "caract." #: src/dialogs/confdialog.cxx:7828 msgid "Auto CRLF line length" msgstr "Ajuste automático de línea con CRLF" #: src/dialogs/confdialog.cxx:7846 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:7847 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "Usar \"cr cr lf\" para \"cr lf\"" #: src/dialogs/confdialog.cxx:7853 msgid "TX - unshift on space" msgstr "TX - no saltar en el espacio" #: src/dialogs/confdialog.cxx:7854 msgid "Revert to Unsifted char's on a space" msgstr "Revertir el salto en espacio de los caracteres" #: src/dialogs/confdialog.cxx:7859 msgid "Pseudo-FSK - right channel" msgstr "AFSK en canal derecho" #: src/dialogs/confdialog.cxx:7860 msgid "Create keyed square wave on right audio channel" msgstr "Crear una onda cuadrada en el canal derecho de audio" #: src/dialogs/confdialog.cxx:7867 msgid "Synop" msgstr "Synop" #: src/dialogs/confdialog.cxx:7870 msgid "SYNOP to ADIF" msgstr "SYNOP a ADIF" #: src/dialogs/confdialog.cxx:7871 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "Decodificar mensajes SYNOP al log ADIF (ejemp. Deutsche Wetterdienst)" #: src/dialogs/confdialog.cxx:7877 msgid "SYNOP to KML" msgstr "SYNOP a KML" #: src/dialogs/confdialog.cxx:7878 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" "Decodificar mensajes SYNOP al documentos KML (ejemp. Deutsche Wetterdienst)" #: src/dialogs/confdialog.cxx:7885 msgid "Interleave SYNOP and text" msgstr "Intercalar SYNOP y texto" #: src/dialogs/confdialog.cxx:7886 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "Intercalar texto con mensajes SYNOP decodificados, o remplasos" #: src/dialogs/confdialog.cxx:7898 msgid "Thor" msgstr "Thor" #: src/dialogs/confdialog.cxx:7918 msgid "Enable DSP prior to decoder" msgstr "Activar el DSP antes del decodificador" #: src/dialogs/confdialog.cxx:7960 msgid "Preamble Detection" msgstr "Detección de preámbulo" #: src/dialogs/confdialog.cxx:7961 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" "Detectar el preámbulo de THOR \n" "Limpiando el buffer de recepción de dato" #: src/dialogs/confdialog.cxx:7966 msgid "Soft-symbol decoding" msgstr "Decodificación suave de símbolos" #: src/dialogs/confdialog.cxx:7967 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" "Usar decodificación blanda de símbolos para la detección\n" "también asiste en la decodificación de cada bit." #: src/dialogs/confdialog.cxx:7972 msgid "Soft-bit decoding" msgstr "Usar decodificación suave de bits" #: src/dialogs/confdialog.cxx:7973 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" "Usar decodificación blanda de bit viterbi para mejorar la corrección FEC.\n" "Funciona mejor si está activada la opción \"Decodificación blanda de símbolos" "\"" #: src/dialogs/confdialog.cxx:8003 msgid "Navtex" msgstr "Navtex" #: src/dialogs/confdialog.cxx:8005 msgid "Log Navtex messages to Adif file" msgstr "Logear mensajes de Navtex a fichero ADIF" #: src/dialogs/confdialog.cxx:8010 msgid "Log Navtex messages to KML" msgstr "Logear mensajes de Navtex a KML" #: src/dialogs/confdialog.cxx:8011 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "Guardar mensajes a archivos KML (Google Earth, Marble, Gaia, etc...)" #: src/dialogs/confdialog.cxx:8018 msgid "Wefax" msgstr "Wefax" #: src/dialogs/confdialog.cxx:8021 msgid "Embedded Wefax Gui" msgstr "Interfaz embebida para WXFAX" #: src/dialogs/confdialog.cxx:8022 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" "Mostrar TX y RX en la ventana principal de fldigi.\n" "Si lo cambia requiere reiniciar del programa para funcionar." #: src/dialogs/confdialog.cxx:8027 msgid "Hide Transmission window" msgstr "Ocultar la ventana de TX" #: src/dialogs/confdialog.cxx:8028 msgid "Hide transmission window by default." msgstr "Ocultar la ventana de TX de forma predeterminada" #: src/dialogs/confdialog.cxx:8033 msgid "Log Wefax messages to Adif file" msgstr "Logear Wefax a fichero ADIF" #: src/dialogs/confdialog.cxx:8034 msgid "Sent and received faxes are logged to Adif file." msgstr "Logear los fax enviados y recibidos" #: src/dialogs/confdialog.cxx:8039 msgid "Frequency shift (800 Hz)" msgstr "Salto de frecuencia (800Hz)" #: src/dialogs/confdialog.cxx:8040 src/dialogs/confdialog.cxx:8051 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "Por defecto 800 Hz. Deutsche Wetterdienst 850Hz" #: src/dialogs/confdialog.cxx:8050 msgid "Rx fax max rows" msgstr "Rx fax max. cols." #: src/dialogs/confdialog.cxx:8061 msgid "Fax images destination directory" msgstr "Destino de las imágenes de fax" #: src/dialogs/confdialog.cxx:8066 msgid "Directory..." msgstr "Directorio..." #: src/dialogs/confdialog.cxx:8069 msgid "Save image as monochrome file" msgstr "Guardar imagen monocroma" #: src/dialogs/confdialog.cxx:8070 msgid "Save the fax image as a gray-level PNG file." msgstr "Guardar la imagen de fax como PNG en grises" #: src/dialogs/confdialog.cxx:8083 msgid "Rig" msgstr "Radio" #: src/dialogs/confdialog.cxx:8084 msgid "Transceiver control" msgstr "Control del transceptor" #: src/dialogs/confdialog.cxx:8088 msgid "Hardware PTT" msgstr "PTT real" #: src/dialogs/confdialog.cxx:8091 src/dialogs/confdialog.cxx:8926 msgid "PTT tone on right audio channel " msgstr "Tono para PTT en el canal derecho de audio" #: src/dialogs/confdialog.cxx:8092 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Puede ser usado en vez de o en adición de otros tipos de PTT" #: src/dialogs/confdialog.cxx:8099 msgid "h/w ptt device-pin" msgstr "Pin del dispositivo PTT" #: src/dialogs/confdialog.cxx:8102 msgid "Use separate serial port PTT" msgstr "PTT por puerto serie separado" #: src/dialogs/confdialog.cxx:8107 src/dialogs/confdialog.cxx:8204 #: src/dialogs/confdialog.cxx:8414 src/dialogs/confdialog.cxx:8668 #: src/dialogs/confdialog.cxx:8856 msgid "Device:" msgstr "Dispositivo:" #: src/dialogs/confdialog.cxx:8121 msgid "Use RTS" msgstr "Use RTS" #: src/dialogs/confdialog.cxx:8122 msgid "RTS is PTT signal line" msgstr "RTS es PTT" #: src/dialogs/confdialog.cxx:8126 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:8127 msgid "Initial voltage on RTS" msgstr "Voltaje inicial en RTS" #: src/dialogs/confdialog.cxx:8131 msgid "Use DTR" msgstr "Use DTR" #: src/dialogs/confdialog.cxx:8132 msgid "DTR is PTT signal line" msgstr "DTR es PTT" #: src/dialogs/confdialog.cxx:8136 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:8137 msgid "Initial voltage on DTR" msgstr "Voltaje inicial en DTR" #: src/dialogs/confdialog.cxx:8141 src/dialogs/confdialog.cxx:8305 #: src/dialogs/confdialog.cxx:8567 src/dialogs/confdialog.cxx:8642 #: src/dialogs/confdialog.cxx:9475 msgid "Initialize" msgstr "Inicializar" #: src/dialogs/confdialog.cxx:8142 msgid "Initialize the H/W PTT interface" msgstr "Inicialice el interfaz de HW para PTT" #: src/dialogs/confdialog.cxx:8145 msgid "Use parallel port PTT" msgstr "Utilice un PTT por puerto paralelo" #: src/dialogs/confdialog.cxx:8150 msgid "Use uHRouter PTT" msgstr "Utilice PTT uHRouter" #: src/dialogs/confdialog.cxx:8157 msgid "PTT delays valid for all CAT/PTT types" msgstr "Retrasos de PTT válidos para todos los tipos de PTT y CAT" #: src/dialogs/confdialog.cxx:8160 msgid "Start of transmit PTT delay" msgstr "Retraso de PTT en el inicio de transmisión" #: src/dialogs/confdialog.cxx:8161 msgid "Delay NN msec before starting audio" msgstr "Retrasar la salida del audio en NN mseg" #: src/dialogs/confdialog.cxx:8170 msgid "PTT end of transmit delay" msgstr "Retraso de fin de PTT" #: src/dialogs/confdialog.cxx:8171 msgid "Delay NN msec before releasing PTT" msgstr "Retrasar NN mseg antes de soltar el PTT" #: src/dialogs/confdialog.cxx:8184 msgid "RigCAT" msgstr "RigCAT" #: src/dialogs/confdialog.cxx:8185 msgid "Rig Control using xml spec file" msgstr "Control del radio usando un fichero xml" #: src/dialogs/confdialog.cxx:8187 msgid "Use RigCAT" msgstr "Use RigCAT" #: src/dialogs/confdialog.cxx:8188 msgid "RigCAT used for rig control" msgstr "Usar RigCAT para el control del radio" #: src/dialogs/confdialog.cxx:8194 msgid "Rig description file:" msgstr "Fichero de descripción del radio:" #: src/dialogs/confdialog.cxx:8195 msgid "Use Open to select descriptor file" msgstr "Usar Abrir para seleccionar un fichero descriptor" #: src/dialogs/confdialog.cxx:8201 msgid "Select rig descriptor file" msgstr "Seleccionar un fichero descriptor del Radio" #: src/dialogs/confdialog.cxx:8219 src/dialogs/confdialog.cxx:8429 msgid "Retries" msgstr "Reintentos" #: src/dialogs/confdialog.cxx:8220 msgid "# retries before giving up" msgstr "# de reintentos antes de rendirnos" #: src/dialogs/confdialog.cxx:8236 src/dialogs/confdialog.cxx:8532 msgid "Retry interval (ms)" msgstr "Internvalo de reintentos (ms)" #: src/dialogs/confdialog.cxx:8237 msgid "Time between retires in msec" msgstr "Tiempo entre reintentos (ms)" #: src/dialogs/confdialog.cxx:8253 src/dialogs/confdialog.cxx:8463 msgid "Write delay (ms)" msgstr "Ret. escritura (ms)" #: src/dialogs/confdialog.cxx:8254 msgid "Wait for response to subsequent command" msgstr "" #: src/dialogs/confdialog.cxx:8270 src/dialogs/confdialog.cxx:8497 msgid "Baud rate:" msgstr "Tasa de baudios:" #: src/dialogs/confdialog.cxx:8286 src/dialogs/confdialog.cxx:8513 msgid "Stopbits" msgstr "Bits de parada" #: src/dialogs/confdialog.cxx:8306 msgid "Initialize RigCAT interface" msgstr "Inicializar la interfaz RigCAT" #: src/dialogs/confdialog.cxx:8309 msgid "Commands are echoed" msgstr "Los comandos tienen eco" #: src/dialogs/confdialog.cxx:8310 msgid "Rig or interface echos serial data" msgstr "El radio o la interface repite los datos enviados" #: src/dialogs/confdialog.cxx:8315 msgid "CAT command for PTT" msgstr "Comandos CAT para el PTT" #: src/dialogs/confdialog.cxx:8316 msgid "PTT is a CAT command (not hardware)" msgstr "El PTT es un comando CAT" #: src/dialogs/confdialog.cxx:8322 msgid "Toggle RTS for PTT" msgstr "Activar RTS para PTT" #: src/dialogs/confdialog.cxx:8323 msgid "RTS is ptt line" msgstr "RTS es la línea de PTT" #: src/dialogs/confdialog.cxx:8328 msgid "Toggle DTR for PTT" msgstr "Activar DTR para PTT" #: src/dialogs/confdialog.cxx:8329 msgid "DTR is ptt line" msgstr "DTR es la línea de PTT" #: src/dialogs/confdialog.cxx:8334 msgid "RTS +12 v" msgstr "RTS +12 v" #: src/dialogs/confdialog.cxx:8335 src/dialogs/confdialog.cxx:8599 msgid "Initial state of RTS" msgstr "Estado inicial de RTS" #: src/dialogs/confdialog.cxx:8340 msgid "DTR +12 v" msgstr "DTR +12 v" #: src/dialogs/confdialog.cxx:8341 src/dialogs/confdialog.cxx:8593 msgid "Initial state of DTR" msgstr "Estado inicial de DTR" #: src/dialogs/confdialog.cxx:8346 src/dialogs/confdialog.cxx:8604 msgid "RTS/CTS flow control" msgstr "Control de flujo RTS/CTS" #: src/dialogs/confdialog.cxx:8347 msgid "Rig uses RTS/CTS handshake" msgstr "El radio usa RTS/CTS para comunicarse" #: src/dialogs/confdialog.cxx:8352 msgid "Restore Settings on Close" msgstr "Restablecer configuraciones al cerrar" #: src/dialogs/confdialog.cxx:8353 msgid "Restore the serial (COM) port settings" msgstr "Restablecer la configuración del Puerto Serie" #: src/dialogs/confdialog.cxx:8358 src/dialogs/confdialog.cxx:8617 msgid "Revert" msgstr "Revertir" #: src/dialogs/confdialog.cxx:8359 msgid "Reset rigCAT interface" msgstr "Resetear la interfaz RigCAT" #: src/dialogs/confdialog.cxx:8364 msgid "VSP Enable" msgstr "VSP Activado" #: src/dialogs/confdialog.cxx:8365 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "Emulador Serie Virtual - Suprimir ADVERTENCIAS" #: src/dialogs/confdialog.cxx:8370 #, fuzzy msgid "Init delay (ms)" msgstr "Ret. escritura (ms)" #: src/dialogs/confdialog.cxx:8371 msgid "Wait for response to first CAT command" msgstr "" #: src/dialogs/confdialog.cxx:8391 msgid "Hamlib" msgstr "Hamlib" #: src/dialogs/confdialog.cxx:8393 msgid "Use Hamlib" msgstr "Usar Hamlib" #: src/dialogs/confdialog.cxx:8394 msgid "Hamlib used for rig control" msgstr "Utilice Hamlib para controlar el radio" #: src/dialogs/confdialog.cxx:8400 msgid "Rig:" msgstr "Radio:" #: src/dialogs/confdialog.cxx:8430 msgid "# times to resend command before giving up" msgstr "# de veces para renvio de comandos antes de rendirnos" #: src/dialogs/confdialog.cxx:8446 msgid "Retry Interval (ms)" msgstr "Reintentos cada (ms)" #: src/dialogs/confdialog.cxx:8447 src/dialogs/confdialog.cxx:8533 msgid "Msec's between retries" msgstr "Milisegundos entre reintentos" #: src/dialogs/confdialog.cxx:8464 msgid "Msec's between sequential commands" msgstr "Milisegundos entre comandos secuenciales" #: src/dialogs/confdialog.cxx:8480 msgid "Post write delay (ms)" msgstr "Ret. post-envío (ms)" #: src/dialogs/confdialog.cxx:8481 msgid "Wait interval (msecs) before reading response" msgstr "Intervalo de espera (ms) antes de leer la espuesta" #: src/dialogs/confdialog.cxx:8552 msgid "Advanced configuration:" msgstr "Configuración avanzada:" #: src/dialogs/confdialog.cxx:8553 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Configuración opcional\n" "en el formato: parámetro=valor..." #: src/dialogs/confdialog.cxx:8568 msgid "Initialize hamlib interface" msgstr "Inicialice la interfaz Hamlib" #: src/dialogs/confdialog.cxx:8571 msgid "Sideband:" msgstr "Banda lateral:" #: src/dialogs/confdialog.cxx:8585 msgid "PTT via Hamlib command" msgstr "PTT como comando de Hamlib" #: src/dialogs/confdialog.cxx:8586 msgid "PTT is a hamlib command" msgstr "PTT es un comando de Hamlib" #: src/dialogs/confdialog.cxx:8592 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:8598 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:8605 msgid "Rig requires RTS/CTS flow control" msgstr "El radio requiere control de flujo RTS/CTS" #: src/dialogs/confdialog.cxx:8611 msgid "XON/XOFF flow control" msgstr "Control de flujo Xon/Xoff" #: src/dialogs/confdialog.cxx:8612 msgid "Rig requires Xon/Xoff flow control" msgstr "El radio requiere control de flujo Xon/Xoff" #: src/dialogs/confdialog.cxx:8618 msgid "Reset hamlib interface" msgstr "Resetear la interfaz Hamlib" #: src/dialogs/confdialog.cxx:8627 msgid "XML-RPC" msgstr "XML-RPC" #: src/dialogs/confdialog.cxx:8635 msgid "" "Rig control via external\n" "program using xmlrpc\n" "remote calls." msgstr "" "Control del radio por un\n" "programa externo\n" "usando XML-RPC" #: src/dialogs/confdialog.cxx:8637 msgid "Use XML-RPC program" msgstr "Usar un programa XML-RPC" #: src/dialogs/confdialog.cxx:8638 msgid "Experimental" msgstr "Experimental" #: src/dialogs/confdialog.cxx:8643 msgid "Initialize XML-RPC rig control" msgstr "Inicializar el control por XML-RPC" #: src/dialogs/confdialog.cxx:8655 msgid "Audio devices" msgstr "Dispositivo de audio" #: src/dialogs/confdialog.cxx:8659 msgid "Devices" msgstr "Dispositivos" #: src/dialogs/confdialog.cxx:8662 msgid "OSS" msgstr "OSS" #: src/dialogs/confdialog.cxx:8663 msgid "Use OSS audio server" msgstr "Usar servidor de audio OSS" #: src/dialogs/confdialog.cxx:8669 msgid "Select device" msgstr "Seleccionar dispositivo" #: src/dialogs/confdialog.cxx:8677 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:8678 msgid "Use Port Audio server" msgstr "Usar servidor PortAudio" #: src/dialogs/confdialog.cxx:8683 msgid "Capture:" msgstr "Captura:" #: src/dialogs/confdialog.cxx:8684 msgid "Audio input device" msgstr "Dispositivo de entrada de audio" #: src/dialogs/confdialog.cxx:8688 msgid "Playback:" msgstr "Reproducción:" #: src/dialogs/confdialog.cxx:8689 msgid "Audio output device" msgstr "Dispositivo de salida de audio" #: src/dialogs/confdialog.cxx:8697 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:8698 msgid "Use Pulse Audio server" msgstr "Usar servidor PulseAudio" #: src/dialogs/confdialog.cxx:8703 msgid "Server string:" msgstr "Servidor:" #: src/dialogs/confdialog.cxx:8704 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Deje esto en blanco en Ubuntu con una sola tarjeta de red\n" "referirse a http://www.pulseaudio.org/wiki/ServerStrings\n" "para más detalles" #: src/dialogs/confdialog.cxx:8722 msgid "File I/O only" msgstr "Solo E/S desde fichero" #: src/dialogs/confdialog.cxx:8723 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "NO HAY DISPOSITIVO DE AUDIO DISPONIBLE (o estas probando?)" #: src/dialogs/confdialog.cxx:8732 msgid "Settings" msgstr "Configuraciones" #: src/dialogs/confdialog.cxx:8734 msgid "Sample rate" msgstr "Tasa de muestreo" #: src/dialogs/confdialog.cxx:8737 msgid "Capture" msgstr "Captura" #: src/dialogs/confdialog.cxx:8738 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" "Forzar una taza de muestreo. Seleccionar \"Nativo\" si \"Auto\"\n" "no trabaja bien con tu dispositivo de audio." #: src/dialogs/confdialog.cxx:8770 msgid "Converter" msgstr "Convertidor" #: src/dialogs/confdialog.cxx:8771 msgid "Set the type of resampler used of offset correction" msgstr "Establecer el tipo de re-muestreo usado para correcciones" #: src/dialogs/confdialog.cxx:8787 msgid "Corrections" msgstr "Correcciones" #: src/dialogs/confdialog.cxx:8790 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:8791 msgid "RX sound card correction" msgstr "Corrección de RX en el dispositivo de audio" #: src/dialogs/confdialog.cxx:8807 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:8808 msgid "TX sound card correction" msgstr "Corrección de TX en el dispositivo de audio" #: src/dialogs/confdialog.cxx:8824 msgid "TX offset" msgstr "Dif. en Tx" #: src/dialogs/confdialog.cxx:8825 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Diferencias entre frecuencias de Rx y Tx (en el radio)" #: src/dialogs/confdialog.cxx:8845 msgid "Mixer" msgstr "Mezclador" #: src/dialogs/confdialog.cxx:8847 msgid "OSS Mixer" msgstr "Mezclador OSS" #: src/dialogs/confdialog.cxx:8850 msgid "Manage mixer" msgstr "Manejar el mezclador" #: src/dialogs/confdialog.cxx:8851 msgid "Add mixer controls to main dialog" msgstr "Añadir controles del mezclador a la interface principal" #: src/dialogs/confdialog.cxx:8857 msgid "Select Mixer device" msgstr "Seleccionar dispositivo de mezcla" #: src/dialogs/confdialog.cxx:8872 msgid "Mic In" msgstr "Mic In" #: src/dialogs/confdialog.cxx:8873 msgid "Use microphone input" msgstr "Usar entrada de micrófono" #: src/dialogs/confdialog.cxx:8876 msgid "Line In" msgstr "Line In" #: src/dialogs/confdialog.cxx:8877 msgid "Use Line-In device" msgstr "Usar dispositivo Line-in" #: src/dialogs/confdialog.cxx:8881 msgid "PCM" msgstr "PCM" #: src/dialogs/confdialog.cxx:8882 msgid "Set the sound card PCM level" msgstr "Establecer el volumen PCM de la tarjeta" #: src/dialogs/confdialog.cxx:8902 msgid "Right channel" msgstr "Canal derecho" #: src/dialogs/confdialog.cxx:8904 msgid "Mono audio output" msgstr "Salida de audio mono" #: src/dialogs/confdialog.cxx:8905 msgid "Force output audio to single channel" msgstr "Forzar la salida de audio a un canal simple" #: src/dialogs/confdialog.cxx:8910 msgid "Modem signal on left and right channels" msgstr "Audio del modem en ambos canales de audio" #: src/dialogs/confdialog.cxx:8911 msgid "Left and right channels both contain modem audio" msgstr "Ambos canales de audio contienen información" #: src/dialogs/confdialog.cxx:8916 msgid "Reverse Left/Right channels" msgstr "Invertir canales de audio Derecho e Izquierdo" #: src/dialogs/confdialog.cxx:8917 msgid "Software reversal of left-right audio channels" msgstr "Invertir por software los canales de audio (derecho e izquierdo)" #: src/dialogs/confdialog.cxx:8922 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Estos controles están en otras pestañas.\n" "Solo se duplican aquí por conveniencia.\n" "Puedes cambiar su estado en cualquier lugar.\n" "..." #: src/dialogs/confdialog.cxx:8927 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "Tono de audio de 1Khz cuando hay PTT activo\n" "Para ser usado en otras formas de PTT" #: src/dialogs/confdialog.cxx:8933 msgid "CW QSK signal on right channel" msgstr "CW QSK en el canal derecho de audio" #: src/dialogs/confdialog.cxx:8934 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Generar una onda cuadrada en el canal derecho (1Khz)" #: src/dialogs/confdialog.cxx:8939 msgid "Pseudo-FSK on right audio channel" msgstr "Seudo-FSK en el canal derecho de audio" #: src/dialogs/confdialog.cxx:8940 msgid "Create 1000 Hz square wave on right channel" msgstr "Crear una onda cuadrada en el canal derecho de audio (1Khz)" #: src/dialogs/confdialog.cxx:8949 msgid "Wav" msgstr "Wav" #: src/dialogs/confdialog.cxx:8951 msgid "Wav write sample rate" msgstr "Tasa de muestreo de wav" #: src/dialogs/confdialog.cxx:8952 msgid "Pick baud rate from list" msgstr "Seleccionar la tasa de baudios desde la lista" #: src/dialogs/confdialog.cxx:8974 msgid "ID" msgstr "ID" #: src/dialogs/confdialog.cxx:8977 msgid "RsID" msgstr "RsID" #: src/dialogs/confdialog.cxx:8978 msgid "Reed-Solomon ID (Rx)" msgstr "Reed-Solomon ID (Rx)" #: src/dialogs/confdialog.cxx:8981 msgid "Notify only" msgstr "Notificar solamente" #: src/dialogs/confdialog.cxx:8982 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Marcar aquí para ser notificado cuando un RSID es recibido\n" "sin cambiar el modem y la frecuencia" #: src/dialogs/confdialog.cxx:8988 msgid "Receive modes" msgstr "Modos de RX" #: src/dialogs/confdialog.cxx:8991 msgid "Searches passband" msgstr "Buscar en el pasabanda" #: src/dialogs/confdialog.cxx:8992 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" "ON - Buscar en toda cascada\n" "OFF - Limitar la búsqueda a +/- 200 Hz" #: src/dialogs/confdialog.cxx:8997 msgid "Mark prev freq/mode" msgstr "Marcar frec./modo previo" #: src/dialogs/confdialog.cxx:8998 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" "Insertar el marcador de texto en el panel de Rx\n" "antes de cambiar la frecuencia y el modem" #: src/dialogs/confdialog.cxx:9003 msgid "Disables detector" msgstr "Deshabilitar detector" #: src/dialogs/confdialog.cxx:9004 msgid "Disable further detection when RSID is received" msgstr "Desactivar la detección futura cuando un RSID es recibido" #: src/dialogs/confdialog.cxx:9011 msgid "Allow errors" msgstr "Permitir errores" #: src/dialogs/confdialog.cxx:9012 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" "Low = cero errores\n" "Medium = 1 error\n" "High = 2 errores" #: src/dialogs/confdialog.cxx:9023 msgid "Medium" msgstr "Medio" #: src/dialogs/confdialog.cxx:9028 msgid "Squelch open (sec)" msgstr "Silenciado abierto (s)" #: src/dialogs/confdialog.cxx:9029 msgid "Open squelch for nn sec if RSID detected" msgstr "Abrir el silenciador por nn segundos si se detecta RSID" #: src/dialogs/confdialog.cxx:9047 msgid "Disable alert dialog" msgstr "Desactivar alerta" #: src/dialogs/confdialog.cxx:9048 msgid "Do not show RsID alert dialog box" msgstr "No mostrar alerta de RsID" #: src/dialogs/confdialog.cxx:9053 msgid "Retain tx freq lock" msgstr "Mantenerse en frecuencia" #: src/dialogs/confdialog.cxx:9054 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "Mantener Tx en la frecuencia al cambiar a RX para RsID." #: src/dialogs/confdialog.cxx:9059 msgid "Disable freq change" msgstr "Desactivar cambio de frecuencia" #: src/dialogs/confdialog.cxx:9060 msgid "Do not automatically change to RX RsID frequency" msgstr "No cambiar automáticamente a la frecuencia del RsID" #: src/dialogs/confdialog.cxx:9065 msgid "" "The RsID notification message contents and \n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" "El contenido del mensaje de notificación de RsID \n" "y sus características de visualización son configuradas\n" "en \"Notificaciones\" en la ventana de configuración ." #: src/dialogs/confdialog.cxx:9073 msgid "Pre-Signal Tone" msgstr "Tono pre-señal" #: src/dialogs/confdialog.cxx:9076 msgid "Seconds" msgstr "Segundos" #: src/dialogs/confdialog.cxx:9077 msgid "Use for triggering amplifier carrier detect" msgstr "Usado para disparar amplificadores que detectan carrier" #: src/dialogs/confdialog.cxx:9085 msgid "Reed-Solomon ID (Tx)" msgstr "Reed-Solomon ID (Tx)" #: src/dialogs/confdialog.cxx:9088 msgid "Transmit modes" msgstr "Modos de TX" #: src/dialogs/confdialog.cxx:9091 msgid "End of xmt ID" msgstr "Enviar ID al finalizar cada Tx" #: src/dialogs/confdialog.cxx:9092 msgid "Add RsID signal to end of transmission" msgstr "Enviar RsID al finalizar cada Tx" #: src/dialogs/confdialog.cxx:9101 msgid "Video" msgstr "Video" #: src/dialogs/confdialog.cxx:9103 msgid "Video Preamble ID" msgstr "Preámbulo de Video ID" #: src/dialogs/confdialog.cxx:9106 msgid "Transmit mode ID" msgstr "Transmitir el ID del modo" #: src/dialogs/confdialog.cxx:9107 msgid "Waterfall video ID" msgstr "Video ID en la cascada" #: src/dialogs/confdialog.cxx:9111 msgid "Transmit video text" msgstr "Transmitir el Video Texto" #: src/dialogs/confdialog.cxx:9112 msgid "Waterfall video text" msgstr "Video Texto en la cascada" #: src/dialogs/confdialog.cxx:9117 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:9118 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" "Limitar a unos pocos caracteres\n" "Como en CQEM o IOTA etc." #: src/dialogs/confdialog.cxx:9132 msgid "Use small font" msgstr "Usar tipografía pequeña" #: src/dialogs/confdialog.cxx:9133 msgid "" "ON - small font\n" "OFF - large font" msgstr "" "On - Tipografía pequeña\n" "OFF - Tipografía grande" #: src/dialogs/confdialog.cxx:9139 msgid "Chars/Row:" msgstr "Carac/Fila:" #: src/dialogs/confdialog.cxx:9140 msgid "Set the number of characters per row" msgstr "Establecer el número de caracteres por fila" #: src/dialogs/confdialog.cxx:9160 msgid "500 Hz limit" msgstr "Límite de 500 Hz" #: src/dialogs/confdialog.cxx:9165 msgid "Mode width limit" msgstr "Límite del Modo" #: src/dialogs/confdialog.cxx:9170 msgid "Video ID modes" msgstr "Modos de Video ID" #: src/dialogs/confdialog.cxx:9179 msgid "CW Postamble ID" msgstr "Post-ámbulo de ID de CW" #: src/dialogs/confdialog.cxx:9182 msgid "Transmit callsign" msgstr "Transmitir indicativo" #: src/dialogs/confdialog.cxx:9183 msgid "Send Callsign in CW at end of every transmission" msgstr "Enviar tu indicativo en CW al finalizar cada Tx" #: src/dialogs/confdialog.cxx:9188 msgid "Speed (WPM):" msgstr "Velocidad (WPM):" #: src/dialogs/confdialog.cxx:9189 msgid "Send at this WPM" msgstr "Enviar a este WPM" #: src/dialogs/confdialog.cxx:9209 msgid "CW ID modes" msgstr "Modos con CW ID" #: src/dialogs/confdialog.cxx:9224 msgid "CPU" msgstr "CPU" #: src/dialogs/confdialog.cxx:9228 msgid "Slow CPU (less than 700MHz)" msgstr "CPU lenta (Menos de 700Mhz)" #: src/dialogs/confdialog.cxx:9229 msgid "Enable if you're computer does not decode properly" msgstr "Activar si tu computadora no decodifica correctamente" #: src/dialogs/confdialog.cxx:9238 msgid "NBEMS" msgstr "NBEMS" #: src/dialogs/confdialog.cxx:9240 msgid "NBEMS data file interface" msgstr "Interface de datos NBEMS" #: src/dialogs/confdialog.cxx:9243 msgid "Enable" msgstr "Activar" #: src/dialogs/confdialog.cxx:9244 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "Extraer archivos para usar con programas externos (wrap/flmsg)" #: src/dialogs/confdialog.cxx:9249 msgid "Open message folder" msgstr "Abrir carpeta de mensajes" #: src/dialogs/confdialog.cxx:9250 msgid "Opens NBEMS file folder upon successful capture" msgstr "Abrir la carpeta de NBEMS cuando capture ok" #: src/dialogs/confdialog.cxx:9257 msgid "Reception of flmsg files" msgstr "Recepción de ficheros en flmsg" #: src/dialogs/confdialog.cxx:9260 msgid "Open with flmsg" msgstr "Abrir con flmsg" #: src/dialogs/confdialog.cxx:9261 msgid "Open message with flmsg" msgstr "Abrir mensaje con flmsg" #: src/dialogs/confdialog.cxx:9266 msgid "Open in browser" msgstr "Abrir en el navegador por defecto" #: src/dialogs/confdialog.cxx:9267 msgid "Open file with default browser" msgstr "Abrir fichero en el navegador por defecto" #: src/dialogs/confdialog.cxx:9272 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:9273 msgid "Enter full path-filename for flmsg" msgstr "Entre camino y nombre hasta el ejecutable de flmsg" #: src/dialogs/confdialog.cxx:9286 msgid "Locate flmsg" msgstr "Buscar flmsg" #: src/dialogs/confdialog.cxx:9290 msgid "Timeout (secs)" msgstr "Timeout (seg)" #: src/dialogs/confdialog.cxx:9291 msgid "Extract times out after NN seconds of inactivity." msgstr "" "Limpiar el texto del canal\n" "después de N segundos\n" "de inactividad" #: src/dialogs/confdialog.cxx:9308 msgid "Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:9311 msgid "Mail Server Attributes" msgstr "Atributos del servidor de correo (PSKMAIL)" #: src/dialogs/confdialog.cxx:9314 msgid "Carrier frequency (Hz)" msgstr "Frecuencia portadora (Hz)" #: src/dialogs/confdialog.cxx:9315 msgid "Default listen / transmit frequency" msgstr "Frecuencia de RX/TX predeterminada" #: src/dialogs/confdialog.cxx:9334 msgid "Search range (Hz)" msgstr "Rango de búsqueda (Hz)" #: src/dialogs/confdialog.cxx:9335 msgid "Listen for signals within this range" msgstr "Escuchar señales dentro de este rango" #: src/dialogs/confdialog.cxx:9374 msgid "AFC range (Hz)" msgstr "Rango AFC (Hz)" #: src/dialogs/confdialog.cxx:9375 msgid "Limit AFC movement to this range" msgstr "Limitar el movimiento del AFC a este rango" #: src/dialogs/confdialog.cxx:9394 msgid "Reset to Carrier" msgstr "Ajustar a la portadora" #: src/dialogs/confdialog.cxx:9395 msgid "When no signal present" msgstr "Cuando no halla señal presente" #: src/dialogs/confdialog.cxx:9406 msgid "Report ARQ frames average S/N" msgstr "Reportar el promedio de S/N de tramas ARQ" #: src/dialogs/confdialog.cxx:9415 msgid "Spotting" msgstr "Spotting" #: src/dialogs/confdialog.cxx:9417 msgid "PSK Reporter" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:9420 msgid "Automatically spot callsigns in decoded text" msgstr "" "Hacer \"spot\" automáticamente con los\n" "indicativos decodificados en el texto recibido" #: src/dialogs/confdialog.cxx:9421 msgid "Parse all incoming text" msgstr "Procesar todo el texto entrante" #: src/dialogs/confdialog.cxx:9426 msgid "Send reception report when logging a QSO" msgstr "Enviar reporte cuando se llenan los datos del QSO" #: src/dialogs/confdialog.cxx:9427 msgid "Send report only when QSO is logged" msgstr "Enviar reporte solo cuando se guardan los datos del QSO" #: src/dialogs/confdialog.cxx:9432 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "" "Reportar la frecuencia del radio (activar solo si tienes control del Radio)" #: src/dialogs/confdialog.cxx:9433 msgid "Include the transmit frequency" msgstr "Incluir la frecuencia de Tx" #: src/dialogs/confdialog.cxx:9438 msgid "Disable spotting when signal browser(s) are not visible." msgstr "Activar spotting solo cuando el navegador de señal está visible" #: src/dialogs/confdialog.cxx:9439 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "Activar para reducir la carga al CPU en PSK y RTTY." #: src/dialogs/confdialog.cxx:9445 msgid "Host:" msgstr "Host:" #: src/dialogs/confdialog.cxx:9446 msgid "To whom the connection is made" msgstr "A quien se hace la conexión" #: src/dialogs/confdialog.cxx:9461 msgid "Using UDP port #" msgstr "Usando puerto UDP #" #: src/dialogs/confdialog.cxx:9476 msgid "Initialize the socket client" msgstr "Inicializar el socket cliente" #: src/dialogs/confdialog.cxx:9479 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:9487 msgid "Sweet Spot" msgstr "Frecuencia Inicial" #: src/dialogs/confdialog.cxx:9493 msgid "Default CW tracking point" msgstr "Punto predefinido de rastreo de CW" #: src/dialogs/confdialog.cxx:9512 msgid "Default RTTY tracking point" msgstr "Punto predefinido de rastreo de RTTY" #: src/dialogs/confdialog.cxx:9530 msgid "PSK et al." msgstr "PSK et al." #: src/dialogs/confdialog.cxx:9531 msgid "Default for all other modems" msgstr "Punto predefinido de rastreo para los otros modems" #: src/dialogs/confdialog.cxx:9549 msgid "Always start new modems at these frequencies" msgstr "Siempre iniciar los modems nuevos en estas frecuencias" #: src/dialogs/confdialog.cxx:9550 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "ON - Iniciar en la pre-establecida\n" "OFF - Mantener la posición actual en la cascada" #: src/dialogs/confdialog.cxx:9558 msgid "K3 A1A configuation" msgstr "Configuración de A1A para el Elecraft K3" #: src/dialogs/confdialog.cxx:9561 msgid "CW is LSB" msgstr "CW es LSB" #: src/dialogs/confdialog.cxx:9562 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Solo para el Elecraft K3\n" "Otros radios no lo necesitan." #: src/dialogs/confdialog.cxx:9571 msgid "Text i/o" msgstr "E/S de Texto" #: src/dialogs/confdialog.cxx:9573 msgid "Talker Socket (MS only)" msgstr "Talker Socket (Solo MS)" #: src/dialogs/confdialog.cxx:9576 msgid "Talker" msgstr "Talker" #: src/dialogs/confdialog.cxx:9580 msgid "Connect/disconnect to Talker socket server" msgstr "Conectar/desconectar el socket del servidor Talker" #: src/dialogs/confdialog.cxx:9583 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" "Auto conectar cuando fldigi se ejecute (el servidor debe estar encendido)" #: src/dialogs/confdialog.cxx:9590 msgid "Capture rx text to external file" msgstr "Capturar el texto de Rx a un fichero externo" #: src/dialogs/confdialog.cxx:9593 msgid "Enable rx text stream" msgstr "Activar el flujo de texto de recepción" #: src/dialogs/confdialog.cxx:9594 msgid "Send rx text to file: textout.txt" msgstr "Enviar texto rx al fichero: textout.txt" #: src/dialogs/confdialog.cxx:9603 msgid "DTMF" msgstr "DTMF" #: src/dialogs/confdialog.cxx:9605 msgid "Decode DTMF tones" msgstr "Decodificar tonos DTMF" #: src/dialogs/confdialog.cxx:9606 #, fuzzy msgid "Decode received DTMF tones" msgstr "Decodificar tonos DTMF" #: src/dialogs/confdialog.cxx:9613 msgid "WX" msgstr "WX" #: src/dialogs/confdialog.cxx:9615 msgid "Weather query specification" msgstr "Consulta específica de Clima" #: src/dialogs/confdialog.cxx:9618 msgid "METAR station ID code" msgstr "Código del Aeropuerto" #: src/dialogs/confdialog.cxx:9619 msgid "" "for example KMDQ for \n" "Huntsville-Madison Executive Airport, AL" msgstr "" "Por ejemplo KMDQ para el\n" "Huntsville-Madison Executive Airport, de AL" #: src/dialogs/confdialog.cxx:9624 msgid "Full report" msgstr "Reporte Completo" #: src/dialogs/confdialog.cxx:9625 msgid "Insert full METAR report" msgstr "Insertar reporte METAR completo" #: src/dialogs/confdialog.cxx:9630 msgid "End of header string:" msgstr "Fin de la cabecera:" #: src/dialogs/confdialog.cxx:9631 msgid "" "Text defining end of METAR header\n" "Typically 'Connection: close'\n" "Used to search for station name" msgstr "" "Texto que define el fin de cabecera METAR\n" "Usualmente 'ConnectionL close'\n" "Usado para detectar nombre de estación." #: src/dialogs/confdialog.cxx:9637 msgid "METAR station location" msgstr "Localización de la estación METAR" #: src/dialogs/confdialog.cxx:9638 msgid "Add geopolitical name of METAR station" msgstr "Poner nombre geopolítico a la estación METAR" #: src/dialogs/confdialog.cxx:9643 msgid "Conditions" msgstr "Condiciones" #: src/dialogs/confdialog.cxx:9644 msgid "current wx conditions" msgstr "Condiciones actuales del Clima" #: src/dialogs/confdialog.cxx:9649 msgid "Fahrenheit" msgstr "Grados Fahrenheit" #: src/dialogs/confdialog.cxx:9650 msgid "report Fahrenheit" msgstr "Reportar en Grados Fahrenheit" #: src/dialogs/confdialog.cxx:9655 msgid "Celsius" msgstr "Grados Celcius" #: src/dialogs/confdialog.cxx:9656 msgid "report Celsius" msgstr "Reportar en Grados Celcius" #: src/dialogs/confdialog.cxx:9661 msgid "Miles / Hour" msgstr "Millas/Hora" #: src/dialogs/confdialog.cxx:9662 msgid "report miles per hour" msgstr "Reportar en Millas por Hora" #: src/dialogs/confdialog.cxx:9667 msgid "kilometers / hour" msgstr "Kilometros / Hora" #: src/dialogs/confdialog.cxx:9668 msgid "report kilometers per hour" msgstr "Reportar en Kilometros por hora" #: src/dialogs/confdialog.cxx:9673 msgid "Inches Mg." msgstr "Pulgadas de Mg" #: src/dialogs/confdialog.cxx:9674 msgid "report inches mercury" msgstr "Reportar en pulgadas de Mercurio" #: src/dialogs/confdialog.cxx:9679 msgid "mbars" msgstr "milibares" #: src/dialogs/confdialog.cxx:9680 msgid "report millibars" msgstr "Reportar en milibares" #: src/dialogs/confdialog.cxx:9685 msgid "Temperature" msgstr "Temperatura" #: src/dialogs/confdialog.cxx:9688 msgid "Wind speed/dir" msgstr "Vel/Dir del viento" #: src/dialogs/confdialog.cxx:9691 msgid "Barometric pressure" msgstr "Presión Barométrica" #: src/dialogs/confdialog.cxx:9694 msgid "Search on web" msgstr "Buscar en la web" #: src/dialogs/confdialog.cxx:9701 msgid "KML" msgstr "KML" #: src/dialogs/confdialog.cxx:9703 msgid "KML files directory" msgstr "Directorio de archivos KML" #: src/dialogs/confdialog.cxx:9704 msgid "Where generated KML documents are stored." msgstr "Donde se almacenan los documentos KML generados" #: src/dialogs/confdialog.cxx:9709 msgid "KML root file" msgstr "Raíz del fichero KML" #: src/dialogs/confdialog.cxx:9713 msgid "Minimum distance for splitting aliases (Meters)" msgstr "Distancia mínima para alias segmentados (metros)" #: src/dialogs/confdialog.cxx:9714 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "Distancia mínima para nodos alias segmentados (metros)" #: src/dialogs/confdialog.cxx:9724 msgid "Data retention time, in hours (0 for no limit)" msgstr "Horas de retención de datos, zero: sin limite." #: src/dialogs/confdialog.cxx:9725 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "Horas de conservación para cada nodo, zero es conservarlo todo." #: src/dialogs/confdialog.cxx:9734 msgid "KML refresh interval (seconds)" msgstr "Internvalo de refresco KML (seg)" #: src/dialogs/confdialog.cxx:9735 msgid "Refresh time interval written in KML file (Seconds)" msgstr "Intervalo de refresco de escritura para KML (seg)" #: src/dialogs/confdialog.cxx:9751 msgid "KML balloon display style" msgstr "Estilo del globo de KML" #: src/dialogs/confdialog.cxx:9752 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "KML globo en texto plano, o HTML, en tablas simples o matrices." #: src/dialogs/confdialog.cxx:9767 msgid "Command run on KML creation" msgstr "Comando a ejecutar al crear un archivo KML" #: src/dialogs/confdialog.cxx:9768 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" "Comando que se ejecuta cuando se genera un archivo KML. Subprocesos se " "reinician si es requerido." #: src/dialogs/confdialog.cxx:9774 msgid "Test command" msgstr "Comando de prueba" #: src/dialogs/confdialog.cxx:9775 msgid "Execute command on KML files." msgstr "Ejecutar un comando sobre los archivos KML" #: src/dialogs/confdialog.cxx:9778 msgid "Change dir..." msgstr "Cambiar carpeta" #: src/dialogs/confdialog.cxx:9779 msgid "Choose directory to store KML documents" msgstr "Selecciona directorio de archivos KML" #: src/dialogs/confdialog.cxx:9782 msgid "Cleanup KML data now !" msgstr "Limpiar datos KML ahora!" #: src/dialogs/confdialog.cxx:9783 msgid "Cleanups KML documents, empties Google Earth display." msgstr "Liampiar datos KML, limpia la pantalla de Google Hearth" #: src/dialogs/confdialog.cxx:9786 msgid "Cleanup on startup" msgstr "Limpiar al iniciar" #: src/dialogs/confdialog.cxx:9787 msgid "Empties KML documents when starting program." msgstr "Limpiar los documentos KML al inicio del programa" #: src/dialogs/confdialog.cxx:9798 msgid "Web" msgstr "Internet" #: src/dialogs/confdialog.cxx:9799 msgid "Callsign database" msgstr "Base de datos de Indicativos" #: src/dialogs/confdialog.cxx:9802 msgid "Call Lookup" msgstr "Búsqueda de indicativo" #: src/dialogs/confdialog.cxx:9803 msgid "Web Browser lookup" msgstr "Búsqueda en internet usando el navegador" #: src/dialogs/confdialog.cxx:9807 msgid "Do not use callsign lookup via web browser" msgstr "No usar una base de datos de indicativos en internet vía el navegador" #: src/dialogs/confdialog.cxx:9813 msgid "QRZ online via default Internet Browser" msgstr "Sitio QRZ vía el navegador por defecto" #: src/dialogs/confdialog.cxx:9814 msgid "Visit QRZ web site" msgstr "Visita el sitio web de QRZ" #: src/dialogs/confdialog.cxx:9819 msgid "HamCall online via default Internet Browser" msgstr "Sitio HamCall vía el navegador por defecto" #: src/dialogs/confdialog.cxx:9820 src/dialogs/confdialog.cxx:9868 msgid "Visit Hamcall web site" msgstr "Visita el sitio web de HamCall" #: src/dialogs/confdialog.cxx:9825 msgid "HamQTH via default Internet Browser" msgstr "Sitio HamQTH vía el navegador por defecto" #: src/dialogs/confdialog.cxx:9826 msgid "Visit hamQTH web site" msgstr "Visita el sitio web hamQTH" #: src/dialogs/confdialog.cxx:9833 msgid "Data base lookup" msgstr "Búsqueda en base de datos" #: src/dialogs/confdialog.cxx:9837 msgid "Do not use callsign database" msgstr "No usar una base de datos de indicativos" #: src/dialogs/confdialog.cxx:9843 msgid "QRZ cdrom" msgstr "QRZ CD" #: src/dialogs/confdialog.cxx:9844 msgid "Use CD or hard drive CD image" msgstr "Usar el CD o una copia del CD en tu disco duro" #: src/dialogs/confdialog.cxx:9849 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:9850 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "Necesitas una subscripción\n" "pagada para acceder a QRZ" #: src/dialogs/confdialog.cxx:9855 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:9856 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "Necesitas una subscripción\n" "pagada para acceder a Hamcall" #: src/dialogs/confdialog.cxx:9861 msgid "HamQTH.com (free service http://www.hamqth.com)" msgstr "HamQTH.com (Servicio gratis http://www.hamqth.com)" #: src/dialogs/confdialog.cxx:9862 msgid "Free service courtesy of OK" msgstr "Servicio Gratis" #: src/dialogs/confdialog.cxx:9867 msgid "Callook.info lookup (free service US callsigns only)" msgstr "Búsqueda en Callbook.info (Solo indicativos de EE.UU.)" #: src/dialogs/confdialog.cxx:9873 msgid "at:" msgstr "en:" #: src/dialogs/confdialog.cxx:9874 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "ejemp.: /home/co7wt/CALLBK o C:/CALLBK\n" "Dejar en blanco para buscar" #: src/dialogs/confdialog.cxx:9888 msgid "User name" msgstr "Nombre de usuario" #: src/dialogs/confdialog.cxx:9889 src/dialogs/confdialog.cxx:9935 #: src/dialogs/confdialog.cxx:9970 msgid "Your login name" msgstr "Tu nombre de usuario" #: src/dialogs/confdialog.cxx:9903 src/dialogs/confdialog.cxx:9949 msgid "Password" msgstr "Contraseña" #: src/dialogs/confdialog.cxx:9904 src/dialogs/confdialog.cxx:9950 msgid "Your login password" msgstr "Tu clave de usuario" #: src/dialogs/confdialog.cxx:9919 src/dialogs/confdialog.cxx:9965 msgid "Show" msgstr "Mostrar" #: src/dialogs/confdialog.cxx:9920 src/dialogs/confdialog.cxx:9966 msgid "Show password in plain text" msgstr "Mostrar claves en texto plano" #: src/dialogs/confdialog.cxx:9923 msgid "Add address to notes field" msgstr "" #: src/dialogs/confdialog.cxx:9932 msgid "eQSL" msgstr "Usuario de eQSL" #: src/dialogs/confdialog.cxx:9934 msgid "User ID" msgstr "Nombre de usuario" #: src/dialogs/confdialog.cxx:9969 msgid "QTH Nickname" msgstr "Apodo del QTH" #: src/dialogs/confdialog.cxx:9984 msgid "Options" msgstr "Opciones" #: src/dialogs/confdialog.cxx:9987 msgid "send when logged (log button, , )" msgstr "Enviar QSO al guardar un contacto (Boton de guardar, , )" #: src/dialogs/confdialog.cxx:9988 msgid "automatic data upload" msgstr "Envío automático de datos a internet" #: src/dialogs/confdialog.cxx:9993 msgid "Default message" msgstr "Mensaje por defecto" #: src/dialogs/confdialog.cxx:9994 msgid "default text to send with etc" msgstr "Texto predeterminado para enviar con una entrada de " #: src/dialogs/confdialog.cxx:10008 msgid "Text Tags (tags use {} delimiters)" msgstr "Etiquetas de texto (use el delimitador {})" #: src/dialogs/confdialog.cxx:10011 #, fuzzy msgid " {CALL} other ops call sign" msgstr "{CALL}\tindicativo del otro" #: src/dialogs/confdialog.cxx:10014 #, fuzzy msgid " {MODE} full mode / submode" msgstr "{MODE} modo o submodo" #: src/dialogs/confdialog.cxx:10017 msgid "{NAME} other ops name" msgstr "{NAME}\tnombre del otro" #: src/dialogs/confdialog.cxx:10020 msgid "These tags can also be used in " msgstr "Etiquetas para usar en el macro " #: src/dialogs/confdialog.cxx:10024 msgid "Use date/time off for log entry" msgstr "Guardar la fecha/hora de fin del QSO en el log" #: src/dialogs/confdialog.cxx:10025 msgid "default uses date/time on" msgstr "Por defecto usa fecha/hora activado" #: src/dialogs/confdialog.cxx:10043 msgid "Auto start programs with fldigi" msgstr "Iniciar programas al mismo tiempo que fldigi" #: src/dialogs/confdialog.cxx:10046 msgid "flrig:" msgstr "flrig:" #: src/dialogs/confdialog.cxx:10047 src/dialogs/confdialog.cxx:10065 #: src/dialogs/confdialog.cxx:10083 src/dialogs/confdialog.cxx:10101 #: src/dialogs/confdialog.cxx:10119 src/dialogs/confdialog.cxx:10137 #: src/dialogs/confdialog.cxx:10155 msgid "" "Enter full path-filename for external program\n" "Or simple name of program" msgstr "" "Entre camino y nombre hasta el ejecutable\n" "o simplemente el nombre del ejecutable" #: src/dialogs/confdialog.cxx:10060 src/dialogs/confdialog.cxx:10078 #: src/dialogs/confdialog.cxx:10096 src/dialogs/confdialog.cxx:10114 #: src/dialogs/confdialog.cxx:10132 src/dialogs/confdialog.cxx:10150 #: src/dialogs/confdialog.cxx:10168 msgid "Locate" msgstr "Encontrar" #: src/dialogs/confdialog.cxx:10061 msgid "Locate flrig executable" msgstr "Camino al ejecutable de flrig" #: src/dialogs/confdialog.cxx:10064 msgid "flamp:" msgstr "flamp:" #: src/dialogs/confdialog.cxx:10079 msgid "Locate flamp executable" msgstr "Camino al ejecutable de flamp" #: src/dialogs/confdialog.cxx:10082 msgid "flnet:" msgstr "flnet:" #: src/dialogs/confdialog.cxx:10097 msgid "Locate flnet executable" msgstr "Camino al ejecutable de flnet" #: src/dialogs/confdialog.cxx:10100 msgid "fllog:" msgstr "fllog:" #: src/dialogs/confdialog.cxx:10115 msgid "Locate fllog executable" msgstr "Camino al ejecutable de fllog" #: src/dialogs/confdialog.cxx:10118 msgid "Prog 1:" msgstr "Prog 1:" #: src/dialogs/confdialog.cxx:10133 msgid "Locate program #1 executable" msgstr "Camino al ejecutable de flmsg" #: src/dialogs/confdialog.cxx:10136 msgid "Prog 2:" msgstr "Prog 2:" #: src/dialogs/confdialog.cxx:10151 msgid "Locate program #2 executable" msgstr "Camino al del ejecutable de flmsg" #: src/dialogs/confdialog.cxx:10154 msgid "Prog 3:" msgstr "Prog 3:" #: src/dialogs/confdialog.cxx:10169 msgid "Locate program #3 executable" msgstr "Camino al ejecutable de flmsg" #: src/dialogs/confdialog.cxx:10172 msgid "" "Enable\n" "-" msgstr "" "Activar\n" "-" #: src/dialogs/confdialog.cxx:10173 src/dialogs/confdialog.cxx:10180 #: src/dialogs/confdialog.cxx:10186 src/dialogs/confdialog.cxx:10192 #: src/dialogs/confdialog.cxx:10198 src/dialogs/confdialog.cxx:10204 #: src/dialogs/confdialog.cxx:10210 msgid "Enable this entry when fldigi first starts" msgstr "Inicial cuando inicie fldigi" #: src/dialogs/confdialog.cxx:10215 src/dialogs/confdialog.cxx:10219 #: src/dialogs/confdialog.cxx:10223 src/dialogs/confdialog.cxx:10227 #: src/dialogs/confdialog.cxx:10231 src/dialogs/confdialog.cxx:10235 #: src/dialogs/confdialog.cxx:10239 msgid "Test" msgstr "Iniciar" #: src/dialogs/confdialog.cxx:10216 msgid "Start flrig" msgstr "Iniciar flrig" #: src/dialogs/confdialog.cxx:10220 msgid "Start flamp" msgstr "Iniciar flamp" #: src/dialogs/confdialog.cxx:10224 msgid "Start flnet" msgstr "Iniciar flnet" #: src/dialogs/confdialog.cxx:10228 msgid "Start fllog" msgstr "Iniciar fllog" #: src/dialogs/confdialog.cxx:10232 msgid "Start prog1" msgstr "Iniciar prog 1" #: src/dialogs/confdialog.cxx:10236 msgid "Start prog2" msgstr "Iniciar prog 2" #: src/dialogs/confdialog.cxx:10240 msgid "Start prog3" msgstr "Iniciar prog 3" #: src/dialogs/confdialog.cxx:10255 msgid "Restore defaults" msgstr "Cargar por defecto" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "Color de letra" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "Tipografía:" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "Tamaño:" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "&OK" #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #: src/dialogs/font_browser.cxx:283 msgid "Reading fonts..." msgstr "leyendo tipografías..." #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "Ficheros de datos" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "Actualización de datos locales" #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "Orígenes de datos tabulados" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "Orígenes de datos" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "Localización del orígen de datos" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "Actualizar los datos locales con el contenido online" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "Eliminar datos locales si se selecciona" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Evento" #: src/dialogs/notifydialog.cxx:112 msgid "RE:" msgstr "RE:" #: src/dialogs/notifydialog.cxx:124 msgid "Enabled" msgstr "Activado" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filtro" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "Entidad DXCC" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Mostrar las entidades DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "No trabajado previamente" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "Usuario de LotW" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "Usuario de eQSL" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Duplicados" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Ignorar duplicados" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "en:" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Tiempo (s):" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Acción" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "Tiempo límite (s):" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Tiempo mínimo entre eventos" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Mostrar ventana de alerta:" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Insertar texto predeterminado" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Esconder después de (s):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "Añadir al texto de RX:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "Añadir al texto de TX:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Mostrar el editor de macros" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Ejecutar programa:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "Entidades DXCC" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Buscar país:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Presione enter para continuar la búsqueda" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Buscar prefijo:" #: src/logbook/lgbook.cxx:397 msgid "Export Setup" msgstr "Configuración de la exportación" #: src/logbook/lgbook.cxx:398 src/logbook/lgbook.cxx:1040 msgid "Select Records to Export" msgstr "Seleccione las entradas a exportar" #: src/logbook/lgbook.cxx:406 src/logbook/lgbook.cxx:456 #: src/logbook/lgbook.cxx:1048 src/logbook/lgbook.cxx:1122 msgid "Check All" msgstr "Marcar todo" #: src/logbook/lgbook.cxx:409 msgid "Start Date" msgstr "Fecha inicio" #: src/logbook/lgbook.cxx:410 msgid "Start date for export" msgstr "Fecha de inicio para exportación" #: src/logbook/lgbook.cxx:423 msgid "Stop Date" msgstr "Fecha de fin" #: src/logbook/lgbook.cxx:424 msgid "Inclusive stop date for export" msgstr "Fecha de fin de la exportación (inclusiva)" #: src/logbook/lgbook.cxx:437 msgid "select by date" msgstr "Selecc. por fecha" #: src/logbook/lgbook.cxx:438 msgid "Enable to select date range" msgstr "Activar para seleccionar rango de fechas" #: src/logbook/lgbook.cxx:450 msgid "Select Fields to Export" msgstr "Seleccione los campos a exportar" #: src/logbook/lgbook.cxx:478 msgid "QSO Date On" msgstr "Fecha de inicio" #: src/logbook/lgbook.cxx:482 msgid "QSO Date Off" msgstr "Fecha de fin" #: src/logbook/lgbook.cxx:486 msgid "Time ON" msgstr "Hora com." #: src/logbook/lgbook.cxx:490 src/logbook/lgbook.cxx:1091 msgid "Time OFF" msgstr "Hora fin." #: src/logbook/lgbook.cxx:494 msgid "TX Power" msgstr "Potencia" #: src/logbook/lgbook.cxx:497 src/logbook/lgbook.cxx:1095 msgid "RST sent" msgstr "RST env." #: src/logbook/lgbook.cxx:501 src/logbook/lgbook.cxx:1099 msgid "RST rcvd" msgstr "RST recib." #: src/logbook/lgbook.cxx:505 src/logbook/lgbook.cxx:731 msgid "Qth" msgstr "Qth" #: src/logbook/lgbook.cxx:508 msgid "LOC" msgstr "LOC" #: src/logbook/lgbook.cxx:515 src/logbook/lgbook.cxx:876 msgid "QSL-VIA" msgstr "QSL-VIA" #: src/logbook/lgbook.cxx:527 msgid "QSL rcvd date" msgstr "Fecha de RX QSL" #: src/logbook/lgbook.cxx:530 msgid "QSL sent date" msgstr "Fecha de TX QSL" #: src/logbook/lgbook.cxx:533 src/logbook/lgbook.cxx:1103 msgid "Serial # in" msgstr "Serie recibida" #: src/logbook/lgbook.cxx:536 src/logbook/lgbook.cxx:1107 msgid "Serial # out" msgstr "Serie enviada" #: src/logbook/lgbook.cxx:545 src/logbook/lgbook.cxx:804 #: src/logbook/lgbook.cxx:805 msgid "County" msgstr "Provincia" #: src/logbook/lgbook.cxx:551 src/logbook/lgbook.cxx:828 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:554 src/logbook/lgbook.cxx:864 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:557 src/logbook/lgbook.cxx:816 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:560 src/logbook/lgbook.cxx:840 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:570 msgid "Logbook" msgstr "Libro de guardia" #: src/logbook/lgbook.cxx:571 msgid "Date On" msgstr "Fecha de inicio" #: src/logbook/lgbook.cxx:572 msgid "Date QSO started" msgstr "Fecha de inicio del QSO" #: src/logbook/lgbook.cxx:585 msgid "Time QSO started" msgstr "Hora de inicio del QSO" #: src/logbook/lgbook.cxx:597 msgid "Call sign worked" msgstr "Indicativo trabajado" #: src/logbook/lgbook.cxx:609 msgid "Operator worked" msgstr "Operador trabajado" #: src/logbook/lgbook.cxx:621 msgid "Rst received" msgstr "RST recibido" #: src/logbook/lgbook.cxx:632 msgid "QSL-rcvd" msgstr "QSL-recibida" #: src/logbook/lgbook.cxx:633 msgid "QSL received on this date" msgstr "QSL recibidas en esta fecha" #: src/logbook/lgbook.cxx:645 msgid "Date Off" msgstr "Fecha de fin" #: src/logbook/lgbook.cxx:646 msgid "Date QSO Ended" msgstr "Fecha de fin del QSO" #: src/logbook/lgbook.cxx:659 msgid "Time QSO ended" msgstr "Hora de fin del QSO" #: src/logbook/lgbook.cxx:670 msgid "Freq." msgstr "Frec." #: src/logbook/lgbook.cxx:671 msgid "Frequency in MHz" msgstr "Frecuencia en MHz" #: src/logbook/lgbook.cxx:683 msgid "Mode in use" msgstr "Modo en uso" #: src/logbook/lgbook.cxx:694 msgid "Pwr" msgstr "Pot" #: src/logbook/lgbook.cxx:695 msgid "Transmit power used" msgstr "Potencia de transmisión usada" #: src/logbook/lgbook.cxx:707 msgid "Rst sent" msgstr "RST env." #: src/logbook/lgbook.cxx:718 msgid "QSL-sent" msgstr "QSL-enviada" #: src/logbook/lgbook.cxx:719 msgid "QSL sent on this date" msgstr "QSL enviadas en esta fecha" #: src/logbook/lgbook.cxx:732 msgid "City of station worked" msgstr "Ciudad de la estación trabajada" #: src/logbook/lgbook.cxx:743 msgid "St" msgstr "Es" #: src/logbook/lgbook.cxx:744 msgid "US state of station worked" msgstr "Estado de EE.UU. de la estación trabajada" #: src/logbook/lgbook.cxx:755 msgid "Pr" msgstr "Pr" #: src/logbook/lgbook.cxx:756 msgid "Province of station worked" msgstr "Provincia de la estación trabajada" #: src/logbook/lgbook.cxx:768 msgid "Country of station worked" msgstr "País de la estación trabajada" #: src/logbook/lgbook.cxx:779 msgid "Loc" msgstr "Loc" #: src/logbook/lgbook.cxx:780 msgid "Stations grid square" msgstr "Localizador de la estación" #: src/logbook/lgbook.cxx:792 msgid "Interesting notes" msgstr "Notas interesantes (80 caract. máx.)" #: src/logbook/lgbook.cxx:817 msgid "Islands on the air" msgstr "Islas en el Aire (IOTA)" #: src/logbook/lgbook.cxx:852 msgid "CONT" msgstr "CONT" #: src/logbook/lgbook.cxx:865 msgid "DXCC designator" msgstr "Identificador DXCC" #: src/logbook/lgbook.cxx:877 msgid "QSL route of contacted station" msgstr "QSL route de la estación" #: src/logbook/lgbook.cxx:888 msgid "Ser out" msgstr "Ser env" #: src/logbook/lgbook.cxx:889 msgid "Contest serial # sent" msgstr "#Serie enviado en concurso" #: src/logbook/lgbook.cxx:901 msgid "Contest exchange sent" msgstr "Intercambio enviado en Concurso" #: src/logbook/lgbook.cxx:912 msgid "Ser in" msgstr "Ser rec" #: src/logbook/lgbook.cxx:913 msgid "Contest serial # received" msgstr "# Recibido como intercambio en concursos" #: src/logbook/lgbook.cxx:925 msgid "Contest exchange received" msgstr "Recibido el intercambio en concursos" #: src/logbook/lgbook.cxx:936 msgid "Call Search" msgstr "Buscar Indicativo" #: src/logbook/lgbook.cxx:937 msgid "Search for this callsign" msgstr "Buscar este indicativo" #: src/logbook/lgbook.cxx:948 msgid "Recs" msgstr "Ent." #: src/logbook/lgbook.cxx:949 msgid "# Records in logbook" msgstr "Número de entradas en el libro de guardia" #: src/logbook/lgbook.cxx:961 msgid "New record / Save record" msgstr "Registro nuevo / Actualizar" #: src/logbook/lgbook.cxx:968 msgid "Update the current record" msgstr "Actualizar el registro actual" #: src/logbook/lgbook.cxx:975 msgid "Delete the current record" msgstr "Eliminar el registro actual" #: src/logbook/lgbook.cxx:981 msgid "Dial" msgstr "Sintonizar" #: src/logbook/lgbook.cxx:982 msgid "Retrieve for active modem use" msgstr "Sintonizar el modem actual a estos datos (Frecuencia y Modo)" #: src/logbook/lgbook.cxx:989 msgid "Find previous" msgstr "Buscar el anterior" #: src/logbook/lgbook.cxx:997 msgid "Find next" msgstr "Buscar el siguiente" #: src/logbook/lgbook.cxx:1020 msgid "Date" msgstr "Fecha" #: src/logbook/lgbook.cxx:1022 msgid "Time" msgstr "Hora" #: src/logbook/lgbook.cxx:1039 msgid "Cabrillo Setup" msgstr "Configuraciones para Cabrillo" #: src/logbook/lgbook.cxx:1059 msgid "Select Cabrillo Contest & Fields" msgstr "Selecciona los campos de concurso para el log Cabrillo" #: src/logbook/lgbook.cxx:1062 msgid "Contest:" msgstr "Concurso:" #: src/logbook/lgbook.cxx:1087 msgid "QSO Date" msgstr "Fecha QSO" #~ msgid "Char set" #~ msgstr "Juego de Caracteres" #~ msgid "Select serial port" #~ msgstr "Seleccione el puerto serie" #~ msgid "Serial device" #~ msgstr "Dispositivo serie" #~ msgid "Select the rig by name" #~ msgstr "Seleccione el radio por su nombre" #~ msgid "Serial port" #~ msgstr "Puerto serie" #~ msgid "Serial port baud rate" #~ msgstr "Tasa de baudios del puerto serie" #~ msgid "" #~ "Force the rig sideband. Takes\n" #~ "effect when rig mode changes." #~ msgstr "" #~ "Forzar el lateral del radio. Entra en efecto\n" #~ "cuando el radio cambia de modo." #~ msgid "FFT latency (scan merging)" #~ msgstr "Latencia de FFT (mezcla de escaneo)" #~ msgid "" #~ "Latency increases frequency resolution,\n" #~ "decreases time resolution. 1 = no scan merging" #~ msgstr "" #~ "La latencia incrementa la resolución de frecuencia,\n" #~ "disminuir a 1 para no mezclar" #~ msgid "Enable to reduce CPU load" #~ msgstr "Activar para reducir carga al CPU" #~ msgid "Received fax maximum rows number (5000)" #~ msgstr "Número máximo de filas para un fax (5000)" #~ msgid "Maximum row number for a received fax image." #~ msgstr "Número máximo de filas para una imagen de fax recibida" #, fuzzy #~ msgid "Enter full path-filename for flrig" #~ msgstr "Entre camino y nombre hasta el ejecutable de flmsg" #, fuzzy #~ msgid "Enter full path-filename for flamp" #~ msgstr "Entre camino y nombre hasta el ejecutable de flmsg" #, fuzzy #~ msgid "Enter full path-filename for flnet" #~ msgstr "Entre camino y nombre hasta el ejecutable de flmsg" #, fuzzy #~ msgid "Enter full path-filename for fllog" #~ msgstr "Entre camino y nombre hasta el ejecutable de flmsg" #~ msgid "Errors" #~ msgstr "Errores" #~ msgid "Number of errors allowed in RsID comparison" #~ msgstr "Cantidad de errores permitidos en identificación de RSID" #~ msgid "Save image as:" #~ msgstr "Guardar imagen como..." #~ msgid "Hide" #~ msgstr "Esconder" #~ msgid "Sensitivity" #~ msgstr "Sensibilidad" #~ msgid "" #~ "2 = normal sensitivity / decreased false detection\n" #~ "5 = high sensitivity / increased false detection" #~ msgstr "" #~ "2 = normal sensibilidad / disminuye la detección de falsos\n" #~ "5 = alta sensibilidad / incrementa la detección de falsos" #~ msgid "Navtex stations file:" #~ msgstr "Fichero de log de Navtex:" #~ msgid "Colors and Fonts" #~ msgstr "Colores y tipografía" #~ msgid "Disp" #~ msgstr "Radio" #~ msgid "Select Char Set" #~ msgstr "Juego de caracteres" #~ msgid "64-bit (long) interleave" #~ msgstr "Intervalo largo de 64Bits" #~ msgid "Transmit /Receive" #~ msgstr "Transmitir/Recibir" #~ msgid "Filter Quality" #~ msgstr "Calidad del Filtro" #~ msgid "" #~ "Low -> High\n" #~ "DSP filter length\n" #~ "Low reduces load on CPU\n" #~ "High gives best performance" #~ msgstr "" #~ "Low -> High\n" #~ "Longitud del filtro DSP\n" #~ "Low (Bajo) reduce la carga de CPU\n" #~ "High (alto) obtiene mejor desempeño" #~ msgid "Optimum" #~ msgstr "Optimo" #, fuzzy #~ msgid "Reset Filter to Optimum bandwidth" #~ msgstr "Ancho de banda del filtro de Rx" #~ msgid "Demodulator" #~ msgstr "Demodulador" #~ msgid "" #~ "Select demodulator type\n" #~ "Kahn power detector\n" #~ "Automatic Threshold Correcting" #~ msgstr "" #~ "Selecciona el tipo de demodulador\n" #~ "Detector de potencia de Kahn\n" #~ "Corrección automática de umbral" #~ msgid "Memory Mapped Rig" #~ msgstr "Radio mapeado en memoria" #~ msgid "" #~ "Enabled - use Kahn power demodulator\n" #~ "Disabled - use ATC demodulator" #~ msgstr "" #~ "Activado - usar demodulador Kahn\n" #~ "Desactivado - usar demodulador ATC" #~ msgid "MemMap" #~ msgstr "MemMap" #~ msgid "" #~ "Control via Memory Mapped\n" #~ "shared variables\n" #~ "i.e.: Kachina program" #~ msgstr "" #~ "Control vía software mapeado\n" #~ "en memoria con variables\n" #~ "compartidas: Kachina" #~ msgid "Use Memmap" #~ msgstr "Usar Memmap" #~ msgid "Rig control via memory mapped Kachina" #~ msgstr "Radio mapeado via memoria (Kachina)" #~ msgid "Use Memmap PTT" #~ msgstr "Usar PTT Memmap" #~ msgid "Initialize Memmap interface" #~ msgstr "Inicializar interface Memmap" #~ msgid "Set page width" #~ msgstr "Establecer el ancho de la página" #~ msgid "after:" #~ msgstr "después:" #~ msgid "RX" #~ msgstr "RX" #~ msgid "TX" #~ msgstr "TX" #~ msgid "X-agc (hidden)" #~ msgstr "X-agc (oculto)" #~ msgid "Use UTF-8" #~ msgstr "Usar UTF-8" #~ msgid "Notifications only" #~ msgstr "Solo notificaciones" #~ msgid "Displays" #~ msgstr "Interfaz" #~ msgid "Tx Power" #~ msgstr "Potencia" #~ msgid "Ser# in" #~ msgstr "Ser rec." #~ msgid "QSO Freq" #~ msgstr "Frec QSO" #~ msgid "Cnty" #~ msgstr "País" #~ msgid "Az" #~ msgstr "Az" #~ msgid "#Out" #~ msgstr "#Env." #~ msgid "#In" #~ msgstr "#Recv." #~ msgid "Xchg" #~ msgstr "Xchg" #~ msgid "File exists. Are you sure you want to overwrite?" #~ msgstr "El fichero existe. Estas seguro que lo quieres sobre escribir?" #, fuzzy #~ msgid "2" #~ msgstr "2" #~ msgid "Cntst'" #~ msgstr "Contestia" #~ msgid "Contestia" #~ msgstr "Contestia" #, fuzzy #~ msgid "Matched Filter in use" #~ msgstr "Modo en uso" #~ msgid "MT63" #~ msgstr "MT63" #~ msgid "Packet" #~ msgstr "Packet" #~ msgid "Select packet baudrate" #~ msgstr "Seleccionar velocidad de packet" #~ msgid "RX Low Freq Gain" #~ msgstr "Gan. Rx en frec. bajas" #~ msgid "Processing gain to apply to lower tone (in dB)" #~ msgstr "Ganancia a aplicar a los tonos bajos (en dB)" #~ msgid "RX High Freq Gain" #~ msgstr "Gan. Rx en frec. altas" #~ msgid "Processing gain to apply to higher tone (in dB)" #~ msgstr "Ganancia a aplicar a los tonos altos (en dB)" #~ msgid "TX Low Freq Gain" #~ msgstr "Gan. Tx en frec. bajas" #~ msgid "TX High Freq Gain" #~ msgstr "Gan. Tx en frec. altas" #~ msgid "add RX timestamps" #~ msgstr "añadir marcas de tiempo en RX" #~ msgid "Prepend timestamp to each RX packet" #~ msgstr "Anteponer marcas de tiempo a cada paquete recibido" #~ msgid "decode Compressed data" #~ msgstr "decodificar datos comprimidos" #~ msgid "Decode received Compressed Position data" #~ msgstr "Decodificar datos comprimidos de posición" #~ msgid "decode Mic-E data" #~ msgstr "decodificar datos Mic-E" #~ msgid "Decode received Mic-E data" #~ msgstr "Decodificar datos recibidos Mic-E" #~ msgid "decode PHG data" #~ msgstr "decodificar datos PHG" #~ msgid "Decode received PHG data" #~ msgstr "Decodificar datos PHG recibidos" #~ msgid "use SI units" #~ msgstr "usar unidades del SIU" #~ msgid "Display decoded data values in SI units" #~ msgstr "Mostrar datos decodificados en unidades del SIU (m, Km)" #~ msgid "use English units" #~ msgstr "usar unidades Inglesas" #~ msgid "Display decoded data in English units" #~ msgstr "Mostrar datos decodificados en unidades Inglesas (pies, millas)" #~ msgid "Use cross-hair scope" #~ msgstr "Usar osciloscopio de hilos cruzados" #~ msgid "Defaults to syncscope instead of phase (cross-hair) scope" #~ msgstr "" #~ "Por defecto muestra la sincronía en vez de los hilos cruzados en el " #~ "osciloscopio" #~ msgid "boost Audio input" #~ msgstr "Amplificar entrada de audio" #~ msgid "add additional gain to audio input for low-output interfaces" #~ msgstr "Añadir ganancia adicional a la entrada de audio" #~ msgid "Display true frequency in the waterfall" #~ msgstr "Mostrar la frecuencia real en la cascada" #~ msgid "" #~ "Enable to show the true transmit frequency on the waterfall when the " #~ "radio is in CW (A1A) mode" #~ msgstr "" #~ "Habilitar para mostrar la frecuencia real de transmisión en la cascada " #~ "cuando el radio está en CW (A1A)" #~ msgid "On Date" #~ msgstr "Fecha inicio" #~ msgid "Off Date" #~ msgstr "Fecha Fin" #~ msgid "Save log before exiting?" #~ msgstr "Salvar libro de contactos antes de salir?" #~ msgid "Save changed macros before exiting?" #~ msgstr "Salvar macros modificadas antes de salir?" #~ msgid "View log" #~ msgstr "Ver log" #~ msgid "A message was logged" #~ msgstr "Un mensaje se añadió al log" #~ msgid "Bandwidth cursor" #~ msgstr "Ancho de banda" #~ msgid "Cursor color" #~ msgstr "Color del cursor" #~ msgid "Cursor center line" #~ msgstr "Linea central del cursor" #~ msgid "Bandwidth tracks" #~ msgstr "Pistas de ancho" #~ msgid "Tracks color" #~ msgstr "Color de las pistas" #~ msgid "Wide tracks" #~ msgstr "Pistas anchas" #~ msgid "Wide center line" #~ msgstr "Linea central ancha" #~ msgid "Wide cursor" #~ msgstr "Cursor ancho" #~ msgid "FH" #~ msgstr "FH" #~ msgid "DomEX" #~ msgstr "DomEX" #~ msgid "eQSL upload when record logged" #~ msgstr "Subir a eQSL cuando se graba el contacto" #~ msgid "Default message sent with eQSL" #~ msgstr "Mensaje por defecto para eQSL" fldigi-3.21.80/po/Makefile.in.in0000664000175000017500000003552512313064025013144 00000000000000# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2007 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.17 GETTEXT_MACRO_VERSION = 0.17 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ localedir = @localedir@ gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = @MKDIR_P@ mkdir_p = @mkdir_p@ GMSGFMT_ = @GMSGFMT@ GMSGFMT_no = @GMSGFMT@ GMSGFMT_yes = @GMSGFMT_015@ GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = @MSGFMT@ MSGFMT_no = @MSGFMT@ MSGFMT_yes = @MSGFMT_015@ MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = @XGETTEXT@ XGETTEXT_no = @XGETTEXT@ XGETTEXT_yes = @XGETTEXT_015@ XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: check-macro-version all-@USE_NLS@ all-yes: stamp-po all-no: # Ensure that the gettext macros and this Makefile.in.in are in sync. check-macro-version: @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \ exit 1; \ } # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ package_gnu='GNU '; \ else \ package_gnu=''; \ fi; \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_gnu}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ esac test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && $(SHELL) ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fldigi-3.21.80/po/it.po0000664000175000017500000046372112313333722011454 00000000000000# Italian translations for fldigi package. # Copyright (C) 2011 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # Pierfrancesco Caci , 2011. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.21.0BG\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2014-03-22 11:18-0500\n" "PO-Revision-Date: 2011-12-03 13:04+0100\n" "Last-Translator: Pierfrancesco Caci \n" "Language-Team: Italian\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/main.cxx:415 #, c-format msgid "%s log started on %s" msgstr "%s log iniziato il %s" #: src/main.cxx:1014 msgid "Bad modem id" msgstr "" #: src/main.cxx:1021 #, fuzzy msgid "Bad frequency" msgstr "Frequenza radio" #: src/main.cxx:1152 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licenza GPLv3+: GNU GPL versione 3 o successiva \n" "Questo e` un programma libero: siete liberi di modificarlo e " "ridistribuirlo.\n" "Questo programma non e` coperto da alcuna garanzia, salvo gli obblighi di " "legge.\n" #: src/main.cxx:1377 src/main.cxx:1419 src/main.cxx:1443 src/main.cxx:1457 #, fuzzy msgid "Could not make directory " msgstr "Impossibile creare la directory" #: src/dialogs/fl_digi.cxx:156 msgid "Log all RX/TX text" msgstr "Salva tutto il testo RX/TX" #: src/dialogs/fl_digi.cxx:157 src/misc/debug.cxx:103 msgid "Rig control" msgstr "Controllo della radio" #: src/dialogs/fl_digi.cxx:158 src/dialogs/fl_digi.cxx:5455 msgid "Op &Mode" msgstr "&Modo Op" #: src/dialogs/fl_digi.cxx:159 msgid "Show fewer modes" msgstr "Mostra meno modi" #: src/dialogs/fl_digi.cxx:160 msgid "Show all modes" msgstr "Mostra tutti i modi" #: src/dialogs/fl_digi.cxx:164 msgid "&View" msgstr "&Vedi" #: src/dialogs/fl_digi.cxx:165 msgid "&MFSK Image" msgstr "Immagine &MFSK" #: src/dialogs/fl_digi.cxx:166 #, fuzzy msgid "&Weather Fax Image RX" msgstr "Immagine &Fax Meteo" #: src/dialogs/fl_digi.cxx:167 #, fuzzy msgid "&Weather Fax Image TX" msgstr "Immagine &Fax Meteo" #: src/dialogs/fl_digi.cxx:168 src/dialogs/confdialog.cxx:5193 msgid "Contest" msgstr "Contest" #: src/dialogs/fl_digi.cxx:169 msgid "&Contest fields" msgstr "Campi &Contest" #: src/dialogs/fl_digi.cxx:170 msgid "C&ountries" msgstr "&Paesi" #: src/dialogs/fl_digi.cxx:171 msgid "&UI" msgstr "Aspetto" #: src/dialogs/fl_digi.cxx:172 msgid "Full" msgstr "Tutto" #: src/dialogs/fl_digi.cxx:173 src/waterfall/waterfall.cxx:2119 #: src/dialogs/confdialog.cxx:5103 src/dialogs/confdialog.cxx:9806 #: src/dialogs/confdialog.cxx:9836 msgid "None" msgstr "Nessuno" #: src/dialogs/fl_digi.cxx:174 msgid "Rig control and logging" msgstr "Controllo della radio e log" #: src/dialogs/fl_digi.cxx:175 msgid "Rig control and contest" msgstr "Controllo della radio e contest" #: src/dialogs/fl_digi.cxx:176 msgid "Docked scope" msgstr "Oscilloscopio incorporato" #: src/dialogs/fl_digi.cxx:177 msgid "Minimal controls" msgstr "Controlli minimi" #: src/dialogs/fl_digi.cxx:178 msgid "Show channels" msgstr "Mostra canali" #: src/dialogs/fl_digi.cxx:180 msgid "Connect to server" msgstr "" #: src/dialogs/fl_digi.cxx:591 src/dialogs/fl_digi.cxx:606 #: src/dialogs/fl_digi.cxx:615 src/dialogs/fl_digi.cxx:3354 #: src/dialogs/fl_digi.cxx:3411 src/dialogs/fl_digi.cxx:3474 #: src/dialogs/fl_digi.cxx:5470 src/dialogs/fl_digi.cxx:5514 #: src/dialogs/fl_digi.cxx:5545 msgid "Custom..." msgstr "Altro..." #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2763 msgid "Save changed macros?" msgstr "Salvare le macro modificate?" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2415 #: src/dialogs/fl_digi.cxx:2477 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 #: src/dialogs/fl_digi.cxx:3892 src/logbook/logsupport.cxx:585 #: src/misc/configuration.cxx:698 src/dialogs/font_browser.cxx:137 #: src/logbook/lgbook.cxx:447 src/logbook/lgbook.cxx:1056 msgid "Cancel" msgstr "Annulla" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 #: src/dialogs/fl_digi.cxx:3579 src/dialogs/fl_digi.cxx:4643 #: src/dialogs/fl_digi.cxx:4810 src/dialogs/fl_digi.cxx:4915 #: src/logbook/logsupport.cxx:584 src/dialogs/confdialog.cxx:10249 msgid "Save" msgstr "Salva" #: src/dialogs/fl_digi.cxx:923 src/dialogs/fl_digi.cxx:2752 #: src/dialogs/fl_digi.cxx:2764 src/dialogs/fl_digi.cxx:2776 msgid "Don't save" msgstr "Non salvare" #: src/dialogs/fl_digi.cxx:1749 msgid "No file name given" msgstr "" #: src/dialogs/fl_digi.cxx:1752 msgid "Unsupported format" msgstr "" #: src/dialogs/fl_digi.cxx:1755 #, fuzzy msgid "channels != 1" msgstr "Mostra canali" #: src/dialogs/fl_digi.cxx:1758 msgid "unknown wave file error" msgstr "" #: src/dialogs/fl_digi.cxx:1765 msgid "Spotting disabled" msgstr "Spotting disabilitato" #: src/dialogs/fl_digi.cxx:1814 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Non ho potuto lanciare un browser web:\n" "%s\n" "\n" "Apri questo URL manualmente:\n" "%s" #: src/dialogs/fl_digi.cxx:1827 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Non posso aprire l'url:\n" "%s\n" #: src/dialogs/fl_digi.cxx:1878 msgid "Checking for updates..." msgstr "Controllo aggiornamenti in corso..." #: src/dialogs/fl_digi.cxx:1893 #, c-format msgid "" "Could not check for updates:\n" "%s" msgstr "" "Non ho potuto controllare la presenza di aggiornamenti:\n" "%s" #: src/dialogs/fl_digi.cxx:1897 #, c-format msgid "" "Version %s is available at\n" "\n" "%s\n" "\n" "What would you like to do?" msgstr "" "La versione %s è disponible su\n" "\n" "%s\n" "\n" "Cosa vuoi fare?" #: src/dialogs/fl_digi.cxx:1898 src/dialogs/Viewer.cxx:304 #: src/misc/macroedit.cxx:419 src/misc/newinstall.cxx:391 #: src/mfsk/mfsk-pic.cxx:342 src/spot/notify.cxx:519 src/spot/notify.cxx:523 #: src/dialogs/confdialog.cxx:10252 msgid "Close" msgstr "Chiudi" #: src/dialogs/fl_digi.cxx:1898 msgid "Visit URL" msgstr "Visita l'URL" #: src/dialogs/fl_digi.cxx:1898 msgid "Copy URL" msgstr "Copia l'URL" #: src/dialogs/fl_digi.cxx:1910 msgid "You are running the latest version" msgstr "Stai già usando la versione più recente" #: src/dialogs/fl_digi.cxx:1976 msgid "Sunspot creation underway!" msgstr "Creazione di macchie solari in corso!" #: src/dialogs/fl_digi.cxx:1983 msgid "Audio device information is only available for the PortAudio backend" msgstr "" "Le informazioni sul device audio sono disponibili solo per il backend " "PortAudio" #: src/dialogs/fl_digi.cxx:1992 msgid "Capture device" msgstr "Periferica di cattura" #: src/dialogs/fl_digi.cxx:1993 msgid "Playback device" msgstr "Periferica di riproduzione" #: src/dialogs/fl_digi.cxx:1997 msgid "Capture and playback devices" msgstr "Periferiche di cattura e di uscita" #: src/dialogs/fl_digi.cxx:2043 #, fuzzy, c-format msgid "%s: Do not exist, create?" msgstr "Non esiste, creare?" #: src/dialogs/fl_digi.cxx:2043 src/dialogs/fl_digi.cxx:2796 #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 #: src/logbook/logsupport.cxx:251 src/logbook/logsupport.cxx:1047 #: src/misc/configuration.cxx:700 src/soundcard/sound.cxx:306 msgid "No" msgstr "No" #: src/dialogs/fl_digi.cxx:2043 src/dialogs/fl_digi.cxx:2796 #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 #: src/logbook/logsupport.cxx:251 src/logbook/logsupport.cxx:1047 #: src/misc/configuration.cxx:700 src/soundcard/sound.cxx:306 msgid "Yes" msgstr "Sí" #: src/dialogs/fl_digi.cxx:2415 msgid "Clear log fields?" msgstr "Cancella i campi del log?" #: src/dialogs/fl_digi.cxx:2415 src/misc/configuration.cxx:698 #: src/logbook/lgbook.cxx:444 src/logbook/lgbook.cxx:1053 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:2430 msgid "Enter a CALL !" msgstr "Inserisci un NOMINATIVO !" #: src/dialogs/fl_digi.cxx:2477 src/dialogs/fl_digi.cxx:3892 msgid "Confirm" msgstr "Conferma" #: src/dialogs/fl_digi.cxx:2751 #, fuzzy msgid "Save changed configuration?" msgstr "Salvare le modifiche alla configurazione prima di uscire?" #: src/dialogs/fl_digi.cxx:2775 msgid "Save current log entry?" msgstr "" #: src/dialogs/fl_digi.cxx:2796 msgid "Really want to quit?" msgstr "" #: src/dialogs/fl_digi.cxx:3311 src/dialogs/fl_digi.cxx:5451 msgid "&File" msgstr "&File" #: src/dialogs/fl_digi.cxx:3313 msgid "Folders" msgstr "Cartelle" #: src/dialogs/fl_digi.cxx:3314 msgid "Fldigi config..." msgstr "Configurazioni di Fldigi..." #: src/dialogs/fl_digi.cxx:3315 #, fuzzy msgid "FLMSG files..." msgstr "File NBEMS..." #: src/dialogs/fl_digi.cxx:3316 msgid "NBEMS files..." msgstr "File NBEMS..." #: src/dialogs/fl_digi.cxx:3317 #, fuzzy msgid "Data files..." msgstr "File NBEMS..." #: src/dialogs/fl_digi.cxx:3320 src/dialogs/confdialog.cxx:5617 msgid "Macros" msgstr "Macro" #: src/dialogs/fl_digi.cxx:3321 msgid "Open ..." msgstr "Apri..." #: src/dialogs/fl_digi.cxx:3322 msgid "Save ..." msgstr "Salva..." #: src/dialogs/fl_digi.cxx:3325 msgid "Text Capture" msgstr "Cattura testo" #: src/dialogs/fl_digi.cxx:3330 src/misc/debug.cxx:101 #: src/dialogs/confdialog.cxx:8654 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:3331 msgid "RX capture" msgstr "Cattura RX" #: src/dialogs/fl_digi.cxx:3332 msgid "TX generate" msgstr "Genera TX" #: src/dialogs/fl_digi.cxx:3333 src/dialogs/confdialog.cxx:8754 msgid "Playback" msgstr "Riproduzione" #: src/dialogs/fl_digi.cxx:3337 src/dialogs/fl_digi.cxx:5452 msgid "Exit" msgstr "Esci" #: src/dialogs/fl_digi.cxx:3518 src/dialogs/fl_digi.cxx:5585 msgid "&Configure" msgstr "&Configura" #: src/dialogs/fl_digi.cxx:3519 src/dialogs/confdialog.cxx:4937 msgid "Operator" msgstr "Operatore" #: src/dialogs/fl_digi.cxx:3520 msgid "Colors && Fonts" msgstr "Colori && Caratteri" #: src/dialogs/fl_digi.cxx:3521 msgid "User Interface" msgstr "Interfaccia Utente" #: src/dialogs/fl_digi.cxx:3522 src/dialogs/fl_digi.cxx:3556 #: src/dialogs/fl_digi.cxx:5586 src/dialogs/confdialog.cxx:6112 msgid "Waterfall" msgstr "Waterfall" #: src/dialogs/fl_digi.cxx:3523 msgid "Waterfall controls" msgstr "Controlli waterfall" #: src/dialogs/fl_digi.cxx:3525 src/dialogs/fl_digi.cxx:5589 #: src/dialogs/confdialog.cxx:6489 msgid "Modems" msgstr "Modem" #: src/dialogs/fl_digi.cxx:3527 src/dialogs/fl_digi.cxx:5588 msgid "Sound Card" msgstr "Scheda Audio" #: src/dialogs/fl_digi.cxx:3528 src/dialogs/fl_digi.cxx:5590 msgid "IDs" msgstr "ID" #: src/dialogs/fl_digi.cxx:3529 src/dialogs/confdialog.cxx:9220 msgid "Misc" msgstr "Misc" #: src/dialogs/fl_digi.cxx:3530 src/dialogs/confdialog.cxx:10038 msgid "Autostart" msgstr "" #: src/dialogs/fl_digi.cxx:3531 src/dialogs/fl_digi.cxx:5591 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Notifiche" #: src/dialogs/fl_digi.cxx:3533 msgid "QRZ/eQSL" msgstr "" #: src/dialogs/fl_digi.cxx:3534 src/dialogs/fl_digi.cxx:5592 msgid "Save Config" msgstr "Salva Configurazione" #: src/dialogs/fl_digi.cxx:3539 msgid "View/Hide Channels" msgstr "Mostra/nascondi Canali" #: src/dialogs/fl_digi.cxx:3541 msgid "Floating scope" msgstr "Finestra oscilloscopio" #: src/dialogs/fl_digi.cxx:3545 msgid "Signal browser" msgstr "Navigatore segnali" #: src/dialogs/fl_digi.cxx:3548 msgid "Controls" msgstr "Controlli" #: src/dialogs/fl_digi.cxx:3563 msgid "&Logbook" msgstr "&Log" #: src/dialogs/fl_digi.cxx:3564 msgid "View" msgstr "&Vedi" #: src/dialogs/fl_digi.cxx:3566 msgid "ADIF" msgstr "" #: src/dialogs/fl_digi.cxx:3567 msgid "Merge..." msgstr "Unisci..." #: src/dialogs/fl_digi.cxx:3568 msgid "Export..." msgstr "Esporta..." #: src/dialogs/fl_digi.cxx:3571 #, fuzzy msgid "Reports" msgstr "rapporti" #: src/dialogs/fl_digi.cxx:3572 msgid "Text..." msgstr "Testo..." #: src/dialogs/fl_digi.cxx:3573 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:3574 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:3577 src/logbook/logsupport.cxx:593 #: src/logbook/lgbook.cxx:960 msgid "New" msgstr "Nuovo" #: src/dialogs/fl_digi.cxx:3578 src/dialogs/confdialog.cxx:8200 msgid "Open..." msgstr "Apri..." #: src/dialogs/fl_digi.cxx:3586 msgid "&Help" msgstr "&Aiuto" #: src/dialogs/fl_digi.cxx:3589 msgid "Create sunspots" msgstr "Crea macchie solari" #: src/dialogs/fl_digi.cxx:3591 msgid "Beginners' Guide" msgstr "Guida per principianti" #: src/dialogs/fl_digi.cxx:3592 msgid "Online documentation..." msgstr "Documentazione on-line..." #: src/dialogs/fl_digi.cxx:3593 msgid "Fldigi web site..." msgstr "Sito web Fldigi..." #: src/dialogs/fl_digi.cxx:3594 msgid "Reception reports..." msgstr "Rapporti d'ascolto..." #: src/dialogs/fl_digi.cxx:3595 msgid "Command line options" msgstr "Opzioni da riga di comando" #: src/dialogs/fl_digi.cxx:3596 msgid "Audio device info" msgstr "Informazioni sulla scheda audio" #: src/dialogs/fl_digi.cxx:3597 msgid "Build info" msgstr "Informazioni sulla compilazione" #: src/dialogs/fl_digi.cxx:3598 src/misc/debug.cxx:137 msgid "Event log" msgstr "Log eventi" #: src/dialogs/fl_digi.cxx:3599 msgid "Check for updates..." msgstr "Verifica aggiornamenti..." #: src/dialogs/fl_digi.cxx:3600 msgid "&About" msgstr "Inform&azioni" #: src/dialogs/fl_digi.cxx:3834 msgid "waterfall-only mode" msgstr "modalitá solo waterfall" #: src/dialogs/fl_digi.cxx:3836 msgid "NO CALLSIGN SET" msgstr "NOMINATIVO NON IMPOSTATO" #: src/dialogs/fl_digi.cxx:3851 msgid "Close List" msgstr "Chiudi la lista" #: src/dialogs/fl_digi.cxx:3861 src/dialogs/fl_digi.cxx:4491 #: src/dialogs/fl_digi.cxx:4789 src/dialogs/fl_digi.cxx:4901 msgid "Open List" msgstr "Apri la lista" #: src/dialogs/fl_digi.cxx:3892 msgid "Clear list?" msgstr "Cancella la lista?" #: src/dialogs/fl_digi.cxx:3925 msgid "report" msgstr "rapporto" #: src/dialogs/fl_digi.cxx:3925 msgid "reports" msgstr "rapporti" #: src/dialogs/fl_digi.cxx:3935 msgid "Recent activity for grid" msgstr "Attivitá recenti per il quadratone" #: src/dialogs/fl_digi.cxx:4485 msgid "No rig specified" msgstr "Nessuna radio specificata" #: src/dialogs/fl_digi.cxx:4562 src/spot/notify.cxx:215 #: src/dialogs/confdialog.cxx:5181 msgid "Select" msgstr "Seleziona" #: src/dialogs/fl_digi.cxx:4569 msgid "Add current frequency" msgstr "Aggiungi la frequenza corrente" #: src/dialogs/fl_digi.cxx:4576 msgid "Clear list" msgstr "Cancella la lista" #: src/dialogs/fl_digi.cxx:4583 msgid "Delete from list" msgstr "Togli dalla lista" #: src/dialogs/fl_digi.cxx:4603 msgid "Select operating parameters" msgstr "Seleziona i parametri operativi" #: src/dialogs/fl_digi.cxx:4629 src/dialogs/fl_digi.cxx:4796 msgid "QRZ" msgstr "QRZ" #: src/dialogs/fl_digi.cxx:4636 src/dialogs/fl_digi.cxx:4803 #: src/dialogs/fl_digi.cxx:4908 src/dialogs/fl_digi.cxx:5124 #: src/dialogs/Viewer.cxx:312 src/widgets/FTextView.cxx:480 #: src/widgets/FTextView.cxx:645 src/widgets/flinput2.cxx:47 #: src/dialogs/confdialog.cxx:7570 msgid "Clear" msgstr "Canc." #: src/dialogs/fl_digi.cxx:4655 src/logbook/lgbook.cxx:467 #: src/logbook/lgbook.cxx:1079 msgid "Freq" msgstr "Freq" #: src/dialogs/fl_digi.cxx:4657 #, fuzzy msgid "frequency kHz" msgstr "Frequenza in MHz" #: src/dialogs/fl_digi.cxx:4660 src/dialogs/fl_digi.cxx:4812 #: src/dialogs/fl_digi.cxx:4918 msgid "On" msgstr "Inizio" #: src/dialogs/fl_digi.cxx:4661 #, fuzzy msgid "Press to update QSO start time" msgstr "Premi per aggiornare" #: src/dialogs/fl_digi.cxx:4665 #, fuzzy msgid "QSO start time" msgstr "Data di inizio del QSO" #: src/dialogs/fl_digi.cxx:4669 src/dialogs/fl_digi.cxx:4825 #: src/dialogs/fl_digi.cxx:4919 msgid "Off" msgstr "Fine" #: src/dialogs/fl_digi.cxx:4670 #, fuzzy msgid "QSO end time" msgstr "Invia immagine" #: src/dialogs/fl_digi.cxx:4674 src/dialogs/fl_digi.cxx:4842 #: src/logbook/lgbook.cxx:620 msgid "In" msgstr "Ric." #: src/dialogs/fl_digi.cxx:4678 src/dialogs/fl_digi.cxx:4850 #: src/logbook/lgbook.cxx:706 msgid "Out" msgstr "Dato" #: src/dialogs/fl_digi.cxx:4682 src/dialogs/fl_digi.cxx:4834 #: src/dialogs/fl_digi.cxx:4920 src/widgets/FTextRXTX.cxx:105 #: src/logbook/lgbook.cxx:459 src/logbook/lgbook.cxx:596 #: src/logbook/lgbook.cxx:1075 msgid "Call" msgstr "Nominativo" #: src/dialogs/fl_digi.cxx:4683 #, fuzzy msgid "call sign" msgstr "Nominativo" #: src/dialogs/fl_digi.cxx:4686 msgid "Op" msgstr "" #: src/dialogs/fl_digi.cxx:4687 #, fuzzy msgid "Operator name" msgstr "Nomi degli operatori" #: src/dialogs/fl_digi.cxx:4691 msgid "Azimuth" msgstr "" #: src/dialogs/fl_digi.cxx:4697 msgid "City" msgstr "Città" #: src/dialogs/fl_digi.cxx:4701 msgid "US State" msgstr "Stato USA" #: src/dialogs/fl_digi.cxx:4705 msgid "Can. Province" msgstr "Prov. Canadese" #: src/dialogs/fl_digi.cxx:4709 #, fuzzy msgid "Maidenhead Locator" msgstr "Locator come in JN53rw" #: src/dialogs/fl_digi.cxx:4720 src/dialogs/fl_digi.cxx:4969 msgid "Sent serial number (read only)" msgstr "Seriale trasmesso (solo lettura)" #: src/dialogs/fl_digi.cxx:4725 src/dialogs/fl_digi.cxx:4960 msgid "Received serial number" msgstr "Seriale ricevuto" #: src/dialogs/fl_digi.cxx:4729 src/dialogs/fl_digi.cxx:4951 msgid "Contest exchange in" msgstr "Rapporto contest ricevuto" #: src/dialogs/fl_digi.cxx:4744 src/spot/notify.cxx:569 #: src/widgets/FTextRXTX.cxx:110 src/logbook/lgbook.cxx:521 #: src/logbook/lgbook.cxx:767 msgid "Country" msgstr "Paese" #: src/dialogs/fl_digi.cxx:4750 src/logbook/lgbook.cxx:524 #: src/logbook/lgbook.cxx:791 msgid "Notes" msgstr "Note" #: src/dialogs/fl_digi.cxx:4816 src/dialogs/fl_digi.cxx:4975 msgid "Press to update" msgstr "Premi per aggiornare" #: src/dialogs/fl_digi.cxx:4822 src/dialogs/fl_digi.cxx:4981 #: src/logbook/lgbook.cxx:584 msgid "Time On" msgstr "Ora d'inizio" #: src/dialogs/fl_digi.cxx:4831 src/dialogs/fl_digi.cxx:4989 #: src/logbook/lgbook.cxx:658 msgid "Time Off" msgstr "Ora di fine" #: src/dialogs/fl_digi.cxx:4840 src/dialogs/fl_digi.cxx:4936 #: src/dialogs/fl_digi.cxx:5289 msgid "Other call" msgstr "Altro nominativo" #: src/dialogs/fl_digi.cxx:4848 msgid "Received RST" msgstr "RST ricevuto" #: src/dialogs/fl_digi.cxx:4856 msgid "Sent RST" msgstr "RST inviato" #: src/dialogs/fl_digi.cxx:4858 msgid "Nm" msgstr "Nm" #: src/dialogs/fl_digi.cxx:4865 msgid "Other name" msgstr "Altro nome" #: src/dialogs/fl_digi.cxx:4921 msgid "# S" msgstr "# S" #: src/dialogs/fl_digi.cxx:4922 msgid "# R" msgstr "# R" #: src/dialogs/fl_digi.cxx:4923 msgid "Ex" msgstr "Ex" #: src/dialogs/fl_digi.cxx:5029 msgid "" "Left Click - execute\n" "Shift-Fkey - execute\n" "Right Click - edit" msgstr "" "Tasto sinistro - esegui\n" "Maiusc-Funz - esegui\n" "Tasto destro - modifica" #: src/dialogs/fl_digi.cxx:5036 msgid "Shift-key macro set" msgstr "Gruppo di macro accessibile con maiusc" #: src/dialogs/fl_digi.cxx:5083 msgid "" "Left click - select\n" "Right click - clear line" msgstr "" "Tasto sinistro - seleziona\n" "Tasto destro - cancella la riga" #: src/dialogs/fl_digi.cxx:5099 msgid "seek - regular expression" msgstr "Cerca Regular Expression" #: src/dialogs/fl_digi.cxx:5120 src/dialogs/Viewer.cxx:322 msgid "Set Viewer Squelch" msgstr "Imposta Squelch per il Viewer" #: src/dialogs/fl_digi.cxx:5207 msgid "" "Left Click - execute\n" "Fkey - execute\n" "Right Click - edit" msgstr "" "Tasto sinistro - esegui\n" "Tasto funzione - esegui\n" "Tasto destro - modifica" #: src/dialogs/fl_digi.cxx:5214 msgid "Primary macro set" msgstr "Gruppo di macro principale" #: src/dialogs/fl_digi.cxx:5231 src/dialogs/fl_digi.cxx:5813 msgid "Detected signal level" msgstr "Livello del segnale ricevuto" #: src/dialogs/fl_digi.cxx:5242 src/dialogs/fl_digi.cxx:5825 #: src/waterfall/waterfall.cxx:2120 msgid "Squelch level" msgstr "Livello squelch" #: src/dialogs/fl_digi.cxx:5256 src/dialogs/fl_digi.cxx:5839 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Tasto sinistro: cambia modo\n" "Tasto destro: configura" #: src/dialogs/fl_digi.cxx:5266 src/dialogs/fl_digi.cxx:5846 msgid "CW transmit WPM" msgstr "Velocitá di trasmissione CW (WPM)" #: src/dialogs/fl_digi.cxx:5272 src/dialogs/fl_digi.cxx:5853 msgid "Default WPM" msgstr "Velocitá predefinita (WPM)" #: src/dialogs/fl_digi.cxx:5311 src/dialogs/fl_digi.cxx:5885 #, fuzzy msgid "Tx level attenuator (dB)" msgstr "Attenuatore Tx" #: src/dialogs/fl_digi.cxx:5335 src/dialogs/fl_digi.cxx:5908 msgid "Automatic Frequency Control" msgstr "Controllo Automatico di Frequenza" #: src/dialogs/fl_digi.cxx:5338 src/dialogs/fl_digi.cxx:5911 msgid "Squelch" msgstr "Squelch" #: src/dialogs/fl_digi.cxx:5381 src/dialogs/fl_digi.cxx:5723 msgid "Scope" msgstr "Scope" #: src/dialogs/fl_digi.cxx:5601 src/dialogs/Viewer.cxx:279 msgid "Signal Browser" msgstr "Navigatore dei segnali" #: src/dialogs/Viewer.cxx:283 msgid "Find: " msgstr "Trova:" #: src/dialogs/Viewer.cxx:316 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Tasto sinistro per cancellare il testo\n" "Tasto destro per resettare le frequenze" #: src/logbook/adif_io.cxx:233 #, fuzzy, c-format msgid "Empty ADIF logbook file %s" msgstr "File di log ADIF vuoto" #: src/logbook/adif_io.cxx:252 #, c-format msgid "Error reading %s" msgstr "" #: src/logbook/logbook.cxx:63 src/logbook/logsupport.cxx:232 msgid "Save changed Logbook?" msgstr "Salvare le modifiche al log?" #: src/logbook/logsupport.cxx:141 msgid "Export to CSV file" msgstr "Esporta in formato CSV" #: src/logbook/logsupport.cxx:167 msgid "Export to fixed field text file" msgstr "Esporta in formato di testo a campi fissi" #: src/logbook/logsupport.cxx:194 msgid "Export to ADIF file" msgstr "Esporta in formato ADIF" #: src/logbook/logsupport.cxx:251 #, fuzzy msgid "Create New Logbook?" msgstr "Salvare le modifiche al log?" #: src/logbook/logsupport.cxx:280 msgid "Open logbook file" msgstr "Apri il file di log" #: src/logbook/logsupport.cxx:303 msgid "Save logbook file" msgstr "Salva il file di log" #: src/logbook/logsupport.cxx:497 msgid "Merge ADIF file" msgstr "Unisci file ADIF" #: src/logbook/logsupport.cxx:594 src/spot/notify.cxx:203 #: src/spot/notify.cxx:517 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:967 msgid "Update" msgstr "Aggiorna" #: src/logbook/logsupport.cxx:1046 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Vuoi veramente cancellare il record per \"%s\"?" #: src/logbook/logsupport.cxx:1433 msgid "Create cabrillo report" msgstr "Crea il log in formato cabrillo" #: src/logger/rx_extract.cxx:55 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" "Rileva la presenza di [WRAP:beg] e [WRAP:end].\n" "Salve le etichette e tutto il testo da esse racchiuso in un file\n" "marcato con data e ora, per es.:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" #: src/logger/rx_extract.cxx:60 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" "Rileva la presenza di [WRAP:beg] e [WRAP:end].\n" "Salve le etichette e tutto il testo da esse racchiuso in un file\n" "marcato con data e ora, per es.:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" #: src/logger/rx_extract.cxx:270 msgid "Could not start flmsg" msgstr "Impossibile avviare flmsg" #: src/logger/rx_extract.cxx:337 src/logger/rx_extract.cxx:340 #: src/dialogs/confdialog.cxx:9287 msgid "Locate flmsg executable" msgstr "Trova l'eseguibile di flmsg" #: src/logger/rx_extract.cxx:337 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:340 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:415 #, fuzzy msgid "Locate executable" msgstr "Trova l'eseguibile di flmsg" #: src/logger/rx_extract.cxx:415 msgid "*.exe" msgstr "" #: src/logger/rx_extract.cxx:425 #, fuzzy msgid "Locate binary" msgstr "Locator" #: src/logger/rx_extract.cxx:425 msgid "*" msgstr "" #: src/logger/speak.cxx:42 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Salva tutto il tesxto ricevuto, un carattere alla volta, su questo file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:508 msgid "Rig mode" msgstr "Modo Radio" #: src/misc/configuration.cxx:509 msgid "Always LSB" msgstr "Sempre LSB" #: src/misc/configuration.cxx:510 msgid "Always USB" msgstr "Sempre USB" #: src/misc/configuration.cxx:695 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Resetta tutte le opzioni ai loro valori predefiniti?\n" "\n" "Il reset delle opzioni avrà effetto al prossimo riavvio\n" "I file fldigi_def.xml e fldigi.prefs sarabbi cancellati!\n" #: src/misc/configuration.cxx:700 msgid "Confirm RESET" msgstr "Confermare il RESET" #: src/misc/debug.cxx:91 msgid "Quiet" msgstr "Silenzioso" #: src/misc/debug.cxx:91 msgid "Error" msgstr "Errori" #: src/misc/debug.cxx:91 msgid "Warning" msgstr "Avvisi" #: src/misc/debug.cxx:91 msgid "Info" msgstr "Informazioni" #: src/misc/debug.cxx:91 msgid "Verbose" msgstr "Verboso" #: src/misc/debug.cxx:91 msgid "Debug" msgstr "Debug" #: src/misc/debug.cxx:100 msgid "ARQ control" msgstr "Controllo ARQ" #: src/misc/debug.cxx:102 src/waterfall/waterfall.cxx:2121 msgid "Modem" msgstr "Modem" #: src/misc/debug.cxx:104 msgid "RPC" msgstr "RPC" #: src/misc/debug.cxx:105 msgid "Spotter" msgstr "Spotter" #: src/misc/debug.cxx:106 msgid "Other" msgstr "Altro" #: src/misc/debug.cxx:141 msgid "Log sources" msgstr "Origine dei log" #: src/misc/debug.cxx:146 msgid "Change log level" msgstr "Cambia livello di log" #: src/misc/macroedit.cxx:71 msgid "\tmy frequency" msgstr "\tla mia frequenza" #: src/misc/macroedit.cxx:72 msgid "\tmode" msgstr "\tmodo" #: src/misc/macroedit.cxx:73 msgid "\tmy call" msgstr "\til mio nominativo" #: src/misc/macroedit.cxx:74 msgid "\tmy locator" msgstr "\til mio locator" #: src/misc/macroedit.cxx:75 msgid "\tmy name" msgstr "\til mio nome" #: src/misc/macroedit.cxx:76 msgid "\tmy QTH" msgstr "\til mio QTH" #: src/misc/macroedit.cxx:77 msgid "\tmy RST" msgstr "\til mio RST" #: src/misc/macroedit.cxx:78 msgid "\tmy antenna" msgstr "" #: src/misc/macroedit.cxx:79 #, fuzzy msgid "\toperating band" msgstr "\tfine rapporto" #: src/misc/macroedit.cxx:81 msgid "\tFldigi version" msgstr "\\tVersione Fldigi" #: src/misc/macroedit.cxx:84 msgid "\tother call" msgstr "\tnominativo del corrispondente" #: src/misc/macroedit.cxx:85 msgid "\tS/N etc." msgstr "\\tS/N ecc." #: src/misc/macroedit.cxx:86 msgid "\tIMD etc." msgstr "\\tIMD ecc." #: src/misc/macroedit.cxx:87 msgid "\tother locator" msgstr "\tlocator del corrispondente" #: src/misc/macroedit.cxx:88 msgid "\tother name" msgstr "\tnome del corrispondente" #: src/misc/macroedit.cxx:89 msgid "\tother QTH" msgstr "\tQTH del corrispondente" #: src/misc/macroedit.cxx:90 msgid "\tother RST" msgstr "\tRST del corrispondente" #: src/misc/macroedit.cxx:91 msgid "\t# QSO recs" msgstr "" #: src/misc/macroedit.cxx:92 msgid "\tnext QSO rec #" msgstr "" #: src/misc/macroedit.cxx:93 msgid "\tmap on google" msgstr "\tmappa su Google" #: src/misc/macroedit.cxx:94 msgid "\tmap by value" msgstr "\tmappa con parametri" #: src/misc/macroedit.cxx:97 msgid "\tclear RX pane" msgstr "\tcancella la finestra di ricezione" #: src/misc/macroedit.cxx:98 #, fuzzy msgid "\tclear TX pane" msgstr "\tcancella la finestra di ricezione" #: src/misc/macroedit.cxx:101 msgid "\ttext to NAME/QTH" msgstr "\tdal testo a NOME/QTH" #: src/misc/macroedit.cxx:105 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk On, Off, Toggle" #: src/misc/macroedit.cxx:109 msgid "\tclear log fields" msgstr "\tcancella i campi del log" #: src/misc/macroedit.cxx:110 msgid "\tsave QSO data" msgstr "\tsalva i dati del QSO" #: src/misc/macroedit.cxx:111 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:112 msgid "\tlog at xmt time" msgstr "\tmetti a log quando questa macro viene trasmessa" #: src/misc/macroedit.cxx:113 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:114 msgid "\tlog eQSL" msgstr "" #: src/misc/macroedit.cxx:115 msgid "\tlog eQSL optional msg" msgstr "" #: src/misc/macroedit.cxx:118 msgid "\tQSO time (HHMM))" msgstr "\tora del QSO (HHMM)" #: src/misc/macroedit.cxx:119 msgid "\tLDT in iso-8601 format" msgstr "\tLDT in formato iso-8601" #: src/misc/macroedit.cxx:120 msgid "\tLocal datetime" msgstr "\tData e ora locale" #: src/misc/macroedit.cxx:121 msgid "\tZDT in iso-8601 format" msgstr "\tZDT in formato iso-8601" #: src/misc/macroedit.cxx:122 msgid "\tUTC datetime" msgstr "\tdata e ora UTC" #: src/misc/macroedit.cxx:123 msgid "\tlocal time HHMM" msgstr "\tora locale HHMM" #: src/misc/macroedit.cxx:124 msgid "\tzulu time HHMMZ" msgstr "\tora zulu (UTC) HHMMZ" #: src/misc/macroedit.cxx:125 msgid "\tlocal date YYYY-MM-DD" msgstr "\tdata locale YYYY-MM-DD" #: src/misc/macroedit.cxx:126 msgid "\tzulu date YYYY-MM-DD Z" msgstr "\tdata zulu (UTC) YYYY-MM-DD Z" #: src/misc/macroedit.cxx:127 msgid "\tget weather data" msgstr "" #: src/misc/macroedit.cxx:128 msgid "\tget weather data for station" msgstr "" #: src/misc/macroedit.cxx:131 msgid "\tcontest counter" msgstr "\tcontatore per contest" #: src/misc/macroedit.cxx:132 msgid "\tdecrement counter" msgstr "\tdecrementa il contatore" #: src/misc/macroedit.cxx:133 msgid "\tincrement counter" msgstr "\tincrementa il contatore" #: src/misc/macroedit.cxx:134 #, fuzzy msgid "\texchange in" msgstr "\tfine rapporto" #: src/misc/macroedit.cxx:135 msgid "\texchange out" msgstr "\trapporto dato" #: src/misc/macroedit.cxx:136 msgid "\texchange begin" msgstr "\tinizio rapporto" #: src/misc/macroedit.cxx:137 msgid "\texchange end" msgstr "\tfine rapporto" #: src/misc/macroedit.cxx:138 msgid "\tsave contest out" msgstr "\tsalva rapporto contest" #: src/misc/macroedit.cxx:141 msgid "\treceive" msgstr "\tricevi" #: src/misc/macroedit.cxx:142 msgid "\ttransmit" msgstr "\ttrasmetti" #: src/misc/macroedit.cxx:143 msgid "\ttoggle T/R" msgstr "\tscambia T/R" #: src/misc/macroedit.cxx:144 msgid "\tsearch UP for signal" msgstr "\tcerca un segnale a salire" #: src/misc/macroedit.cxx:145 msgid "\tsearch DOWN for signal" msgstr "\tcerca un segnale a scendere" #: src/misc/macroedit.cxx:146 msgid "\treturn to sweet spot" msgstr "\tritorna alla frequenza preferita" #: src/misc/macroedit.cxx:147 msgid "\tmove to freq NNNN Hz" msgstr "\tvai alla freq NNNN" #: src/misc/macroedit.cxx:148 msgid "\tleft-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:149 msgid "\tright-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:152 msgid "\tinsert QRG into Rx text" msgstr "" #: src/misc/macroedit.cxx:155 msgid "\tqsy to kHz, Hz" msgstr "\tqsy a kHz, Hz" #: src/misc/macroedit.cxx:156 msgid "\tvalid xcvr mode" msgstr "\tcambia modo radio valido" #: src/misc/macroedit.cxx:157 msgid "\tvalid xcvr filter width" msgstr "\timposta un filtro valido sulla radio" #: src/misc/macroedit.cxx:160 msgid "\tinsert text file" msgstr "\tinserisci un file di testo" #: src/misc/macroedit.cxx:161 #, fuzzy msgid "\tinsert MFSK image" msgstr "\tinserisci un file di testo" #: src/misc/macroedit.cxx:164 #, fuzzy msgid "\tpause transmit" msgstr "\ttrasmetti" #: src/misc/macroedit.cxx:165 msgid "\tidle signal for NN.nn sec" msgstr "\tsegnale idle per NN.nn sec" #: src/misc/macroedit.cxx:166 msgid "\trepeat every NN sec" msgstr "\tripeti ogni NN sec" #: src/misc/macroedit.cxx:167 msgid "\ttune signal for NN sec" msgstr "\tsegnale di accordo per NN sec" #: src/misc/macroedit.cxx:168 msgid "\tdelay xmt for NN sec" msgstr "\tritarda la trasmissione per NN sec" #: src/misc/macroedit.cxx:169 msgid "\trepeat macro continuously" msgstr "\tripeti la macro continuamente" #: src/misc/macroedit.cxx:170 msgid "\tschedule execution" msgstr "" #: src/misc/macroedit.cxx:173 msgid "\t set xmt attenuator" msgstr "" #: src/misc/macroedit.cxx:176 msgid "\tCW identifier" msgstr "\tidentificazione in CW" #: src/misc/macroedit.cxx:177 msgid "\tsend mode ID in video text" msgstr "\ttrasmetti ID del modo in testo video" #: src/misc/macroedit.cxx:178 msgid "\tvideo text" msgstr "\ttesto video" #: src/misc/macroedit.cxx:179 msgid "\tTx RSID on,off,toggle" msgstr "\tTx RSID on,off,toggle" #: src/misc/macroedit.cxx:180 msgid "\tRx RSID on,off,toggle" msgstr "\tRx RSID on,off,toggle" #: src/misc/macroedit.cxx:181 msgid "\tTransmit |NN| successive RsID bursts" msgstr "" #: src/misc/macroedit.cxx:182 msgid "\t[Wait][Len](ms)" msgstr "" #: src/misc/macroedit.cxx:185 msgid "\tCW QSK post-timing" msgstr "\tCW QSK post-timing" #: src/misc/macroedit.cxx:186 msgid "\tCW QSK pre-timing" msgstr "\tCW QSK pre-timing" #: src/misc/macroedit.cxx:187 msgid "\tCW rise time" msgstr "\tCW rise time" #: src/misc/macroedit.cxx:188 #, fuzzy msgid "\tCW WPM:Farnsworth" msgstr "\tCW WPM" #: src/misc/macroedit.cxx:191 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:194 msgid "\tAFC on,off,toggle" msgstr "\tAFC on,off,toggle" #: src/misc/macroedit.cxx:195 msgid "\tLOCK on,off,toggle" msgstr "\tLOCK on,off,toggle" #: src/misc/macroedit.cxx:196 #, fuzzy msgid "\tRev on,off,toggle" msgstr "\tAFC on,off,toggle" #: src/misc/macroedit.cxx:199 msgid "\tchange macro defs file" msgstr "\tcambia il file delle macro" #: src/misc/macroedit.cxx:200 #, fuzzy msgid "\tsave current macro file" msgstr "Salva file delle macro" #: src/misc/macroedit.cxx:203 msgid "\tuntransmitted comment" msgstr "" #: src/misc/macroedit.cxx:206 msgid "\tmodem timing test internal string" msgstr "" #: src/misc/macroedit.cxx:207 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:208 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:211 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:212 #, fuzzy msgid "\tWAV file; spec' file" msgstr "\tinserisci un file di testo" #: src/misc/macroedit.cxx:213 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:328 msgid "Text file to insert" msgstr "File di testo da inserire" #: src/misc/macroedit.cxx:336 #, fuzzy msgid "Test text file" msgstr "\tinserisci un file di testo" #: src/misc/macroedit.cxx:344 #, fuzzy msgid "MFSK image file" msgstr "Carica file immagine" #: src/misc/macroedit.cxx:351 msgid "Change to Macro file" msgstr "Modifica al file delle macro" #: src/misc/macroedit.cxx:361 msgid "Executable file to insert" msgstr "File eseguibile da inserire" #: src/misc/macroedit.cxx:391 #, fuzzy msgid "Macro Text" msgstr "Editor delle macro - " #: src/misc/macroedit.cxx:396 #, fuzzy msgid "Select Tag" msgstr "Seleziona Tag:" #: src/misc/macroedit.cxx:408 #, fuzzy msgid "Macro Button Label" msgstr "Etichetta sul Pulsante Macro:" #: src/misc/macroedit.cxx:416 msgid "Apply" msgstr "" #: src/misc/macroedit.cxx:443 msgid "Macro editor - " msgstr "Editor delle macro - " #: src/misc/macros.cxx:2786 msgid "Open macro file" msgstr "Apri file delle macro" #: src/misc/macros.cxx:2787 src/misc/macros.cxx:2825 #, fuzzy msgid "Fldigi macro definition file\t*.{mdf}" msgstr "File di definizione delle macro per Fldigi\t*.mdf" #: src/misc/macros.cxx:2824 msgid "Save macro file" msgstr "Salva file delle macro" #: src/misc/network.cxx:170 msgid "Aborted" msgstr "Annulla" #: src/misc/network.cxx:170 msgid "Timed out" msgstr "Tempo scaduto" #: src/misc/newinstall.cxx:387 msgid "Finish" msgstr "" #: src/misc/newinstall.cxx:388 msgid "Next" msgstr "" #: src/misc/newinstall.cxx:389 #, fuzzy msgid "Back" msgstr "Sfondo" #: src/misc/newinstall.cxx:519 msgid "The wizard will guide you through the basic fldigi settings" msgstr "" #: src/misc/newinstall.cxx:522 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "" #: src/misc/newinstall.cxx:523 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" #: src/misc/newinstall.cxx:538 #, fuzzy msgid "Fldigi configuration wizard" msgstr "Configurazione di Fldigi" #: src/mfsk/mfsk-pic.cxx:142 src/mfsk/mfsk-pic.cxx:146 #: src/mfsk/mfsk-pic.cxx:305 src/mfsk/mfsk-pic.cxx:308 msgid "Time needed: " msgstr "Tempo necessario: " #: src/mfsk/mfsk-pic.cxx:175 msgid "Load image file" msgstr "Carica file immagine" #: src/mfsk/mfsk-pic.cxx:316 msgid "Send image" msgstr "Invia immagine" #: src/mfsk/mfsk-pic.cxx:323 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "Carica o trascina un file immagine\n" "Formati supportati: PNG, JPEG, BMP" #: src/mfsk/mfsk-pic.cxx:327 msgid "Transfer speed, X1-normal" msgstr "Velocità di trasferimento, X1-normale" #: src/mfsk/mfsk-pic.cxx:339 msgid "Load" msgstr "Carica" #: src/waterfall/waterfall.cxx:1563 msgid "Waterfall / FFT / Scope" msgstr "Waterfall / FFT / Oscilloscopio" #: src/waterfall/waterfall.cxx:1573 msgid "Upper signal level (dB)" msgstr "Livello superiore del segnale (dB)" #: src/waterfall/waterfall.cxx:1584 msgid "Signal range (dB)" msgstr "Campo di variazione del segnale (dB)" #: src/waterfall/waterfall.cxx:1590 msgid "Change waterfall scale" msgstr "Cambia la scala del waterfall" #: src/waterfall/waterfall.cxx:1595 msgid "Slew display lower in frequency" msgstr "Scorri la porzione visualizzata verso frequenze piú basse" #: src/waterfall/waterfall.cxx:1600 msgid "Center display on signal" msgstr "Centra la visualizzazione sul segnale" #: src/waterfall/waterfall.cxx:1605 msgid "Slew display higher in frequency" msgstr "Scorri la porzione visualizzata verso frequenze piú alte" #: src/waterfall/waterfall.cxx:1610 msgid "Waterfall drop speed" msgstr "Velocità del waterfall" #: src/waterfall/waterfall.cxx:1620 msgid "Adjust cursor frequency" msgstr "Aggiusta la frequenza del cursore" #: src/waterfall/waterfall.cxx:1625 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Centra nella banda passante\n" "Tasto destro per tornare indietro" #: src/waterfall/waterfall.cxx:1631 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Registra modo e frequenza\n" "Tasto destro per la lista" #: src/waterfall/waterfall.cxx:1641 msgid "Lock transmit frequency" msgstr "Blocca la frequenza di trasmissione" #: src/waterfall/waterfall.cxx:1650 src/dialogs/confdialog.cxx:5706 msgid "Reverse" msgstr "Inverti" #: src/waterfall/waterfall.cxx:1657 msgid "Transmit/Receive" msgstr "Trasmetti/Ricevi" #: src/waterfall/waterfall.cxx:2119 msgid "AFC range or BW" msgstr "Area AFC o banda" #: src/waterfall/waterfall.cxx:2120 msgid "Signal search" msgstr "Ricerca segnali" #: src/waterfall/waterfall.cxx:2121 msgid "Modem carrier" msgstr "Portante del modo" #: src/waterfall/waterfall.cxx:2121 msgid "Scroll" msgstr "Scorrimento" #: src/rigcontrol/FreqControl.cxx:136 msgid "" "Enter frequency or change with\n" "Left/Right/Up/Down/Pg_Up/Pg_Down" msgstr "" "Inserisci la frequenza o cambia con\n" "Sinistra/Destra/Su/Giù/Pag_su/Pag_giù" #: src/rigcontrol/rigsupport.cxx:469 msgid "Enter Xcvr Freq" msgstr "Frequenza Radio" #: src/rigcontrol/rigxml.cxx:946 msgid "Open rig xml file" msgstr "Apri file rig xml" #: src/rigcontrol/rigxml.cxx:946 msgid "Fldigi rig xml definition file\t*.xml" msgstr "File di definizione rig xml\t*.xml" #: src/soundcard/sound.cxx:149 msgid "" "Waveform Audio Format\t*.wav\n" "AU\t*.{au,snd}\n" msgstr "" "Formato audio\t*.wav\n" "AU\t*.{au,snd}\n" #: src/soundcard/sound.cxx:152 msgid "Free Lossless Audio Codec\t*.flac" msgstr "Free Lossless Audio Codec\t*.flac" #: src/soundcard/sound.cxx:158 src/soundcard/sound.cxx:160 msgid "Audio file" msgstr "File audio" #: src/soundcard/sound.cxx:306 msgid "Playback continuous loop?" msgstr "" #: src/spot/notify.cxx:191 msgid "My callsign de CALL" msgstr "Il mio nominativo de CALL" #: src/spot/notify.cxx:192 msgid "Station heard twice" msgstr "Stazione sentita due volte" #: src/spot/notify.cxx:193 msgid "Custom text search" msgstr "Ricerca testo personalizzato" #: src/spot/notify.cxx:194 msgid "RSID reception" msgstr "Ricezione RSID" #: src/spot/notify.cxx:202 msgid "Toggle" msgstr "Scambia" #: src/spot/notify.cxx:204 src/spot/notify.cxx:516 msgid "Remove" msgstr "Rimuovi" #: src/spot/notify.cxx:216 src/spot/notify.cxx:222 src/spot/notify.cxx:570 #: src/logbook/lgbook.cxx:548 src/logbook/lgbook.cxx:853 msgid "Continent" msgstr "Continente" #: src/spot/notify.cxx:217 src/spot/notify.cxx:223 src/logbook/lgbook.cxx:841 msgid "ITU zone" msgstr "Zona ITU" #: src/spot/notify.cxx:218 src/spot/notify.cxx:224 src/logbook/lgbook.cxx:829 msgid "CQ zone" msgstr "Zona CQ" #: src/spot/notify.cxx:219 src/spot/notify.cxx:225 msgid "All" msgstr "Tutto" #: src/spot/notify.cxx:221 msgid "Deselect" msgstr "Deseleziona" #: src/spot/notify.cxx:515 msgid "Add" msgstr "Aggiungi" #: src/spot/notify.cxx:518 msgid "Test..." msgstr "Test..." #: src/spot/notify.cxx:521 src/widgets/FTextView.cxx:481 #: src/widgets/flinput2.cxx:48 msgid "Select All" msgstr "Seleziona tutto" #: src/spot/notify.cxx:522 src/logbook/lgbook.cxx:403 #: src/logbook/lgbook.cxx:453 src/logbook/lgbook.cxx:1045 #: src/logbook/lgbook.cxx:1119 msgid "Clear All" msgstr "Cancella tutto" #: src/spot/notify.cxx:1095 msgid "The regular expression field must not be empty." msgstr "Il campo regular expression non puó essere vuoto." #: src/spot/notify.cxx:1101 msgid "The regular expression must be valid." msgstr "La regular expression deve essere valida." #: src/spot/notify.cxx:1108 msgid "Please set your callsign first." msgstr "Imposta il tuo nominativo, prima." #: src/spot/notify.cxx:1245 msgid "Run program" msgstr "Lancia il programma" #: src/spot/notify.cxx:1278 msgid "" "Default test string is:\n" " \"" msgstr "" "Default test string is:\n" " \"" #: src/spot/notify.cxx:1279 msgid "Enter test string or leave blank for default:" msgstr "Imposta la frase di prova o lascia in bianco per il predefinito:" #: src/spot/notify.cxx:1290 msgid "This event's regular expression is invalid." msgstr "Questa regular expression per gli eventi non è valida." #: src/spot/notify.cxx:1297 msgid "The test string did not match this event's search pattern." msgstr "" "La frase di test non corrisponde allo schema di ricerca di questo evento." #: src/spot/notify.cxx:1315 msgid "Available substrings" msgstr "Sottostringhe disponibili" #: src/spot/notify.cxx:1398 src/logbook/lgbook.cxx:1026 msgid "Frequency" msgstr "Frequenza" #: src/spot/notify.cxx:1400 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1023 msgid "Callsign" msgstr "Nominativo" #: src/waterfall/colorbox.cxx:89 msgid "Open palette" msgstr "Apri palette" #: src/waterfall/colorbox.cxx:89 src/waterfall/colorbox.cxx:126 msgid "Fldigi palette\t*.pal" msgstr "Palette Fldigi\t*.pal" #: src/waterfall/colorbox.cxx:112 src/waterfall/colorbox.cxx:137 msgid "Palette: " msgstr "Palette: " #: src/waterfall/colorbox.cxx:126 msgid "Save palette" msgstr "Salva palette" #: src/widgets/FTextRXTX.cxx:104 msgid "Look up call" msgstr "Cerca nominativo" #: src/widgets/FTextRXTX.cxx:106 src/logbook/lgbook.cxx:463 #: src/logbook/lgbook.cxx:608 src/logbook/lgbook.cxx:1025 msgid "Name" msgstr "Nome" #: src/widgets/FTextRXTX.cxx:107 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:108 src/dialogs/confdialog.cxx:5298 #: src/logbook/lgbook.cxx:512 msgid "State" msgstr "Stato" #: src/widgets/FTextRXTX.cxx:109 src/logbook/lgbook.cxx:518 msgid "Province" msgstr "Provincia" #: src/widgets/FTextRXTX.cxx:111 msgid "Locator" msgstr "Locator" #: src/widgets/FTextRXTX.cxx:112 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:113 src/dialogs/confdialog.cxx:5304 #: src/logbook/lgbook.cxx:539 src/logbook/lgbook.cxx:924 #: src/logbook/lgbook.cxx:1111 msgid "Exchange In" msgstr "Rapporto ricevuto" #: src/widgets/FTextRXTX.cxx:114 src/dialogs/confdialog.cxx:5229 msgid "Serial number" msgstr "Numero progressivo" #: src/widgets/FTextRXTX.cxx:115 msgid "Insert marker" msgstr "Inserisci marker" #: src/widgets/FTextRXTX.cxx:123 msgid "Quick entry" msgstr "Inserimento rapido" #: src/widgets/FTextRXTX.cxx:124 msgid "Scroll hints" msgstr "Suggerimenti scorrimento" #: src/widgets/FTextRXTX.cxx:704 msgid " in " msgstr " in " #: src/widgets/FTextRXTX.cxx:706 msgid "Last QSO" msgstr "Ultimo QSO" #: src/widgets/FTextRXTX.cxx:751 src/dialogs/confdialog.cxx:6624 msgid "Transmit" msgstr "Transmetti" #: src/widgets/FTextRXTX.cxx:752 src/dialogs/confdialog.cxx:6499 #: src/dialogs/confdialog.cxx:7621 msgid "Receive" msgstr "Ricevi" #: src/widgets/FTextRXTX.cxx:753 msgid "Abort" msgstr "Annulla" #: src/widgets/FTextRXTX.cxx:754 msgid "Send image..." msgstr "Invia image..." #: src/widgets/FTextView.cxx:292 msgid "Insert text" msgstr "Inserisci testo" #: src/widgets/FTextView.cxx:351 msgid "Save text as" msgstr "Salva testo come" #: src/widgets/FTextView.cxx:479 src/widgets/FTextView.cxx:643 #: src/widgets/flinput2.cxx:44 msgid "Copy" msgstr "Copia" #: src/widgets/FTextView.cxx:482 msgid "Save as..." msgstr "Salva come..." #: src/widgets/FTextView.cxx:483 src/widgets/FTextView.cxx:647 msgid "Word wrap" msgstr "Vai a capo" #: src/widgets/FTextView.cxx:642 src/widgets/flinput2.cxx:43 msgid "Cut" msgstr "Taglia" #: src/widgets/FTextView.cxx:644 src/widgets/flinput2.cxx:45 msgid "Paste" msgstr "Incolla" #: src/widgets/FTextView.cxx:646 msgid "Insert file..." msgstr "Inserisci file..." #: src/widgets/flinput2.cxx:42 msgid "Undo" msgstr "Annulla" #: src/widgets/flinput2.cxx:46 src/logbook/lgbook.cxx:974 msgid "Delete" msgstr "Cancella" #: src/dialogs/confdialog.cxx:4928 msgid "Fldigi configuration" msgstr "Configurazione di Fldigi" #: src/dialogs/confdialog.cxx:4938 src/dialogs/confdialog.cxx:10039 msgid "Operator information" msgstr "Informazioni sull'operatore" #: src/dialogs/confdialog.cxx:4941 msgid "Station" msgstr "Stazione" #: src/dialogs/confdialog.cxx:4944 msgid "Callsign:" msgstr "Nominativo:" #: src/dialogs/confdialog.cxx:4945 msgid "Operators callsign" msgstr "Nominativi degli operatori" #: src/dialogs/confdialog.cxx:4958 msgid "Name:" msgstr "Nome:" #: src/dialogs/confdialog.cxx:4959 msgid "Operators name" msgstr "Nomi degli operatori" #: src/dialogs/confdialog.cxx:4972 msgid "QTH:" msgstr "QTH:" #: src/dialogs/confdialog.cxx:4973 msgid "Operators QTH" msgstr "QTH degli operatori" #: src/dialogs/confdialog.cxx:4986 msgid "Locator:" msgstr "Locator:" #: src/dialogs/confdialog.cxx:4987 msgid "Maidenhead locator as in EM64qv" msgstr "Locator come in JN53rw" #: src/dialogs/confdialog.cxx:5002 msgid "Antenna:" msgstr "Antenna:" #: src/dialogs/confdialog.cxx:5003 msgid "Short description of antenna" msgstr "Breve descrizione dell'antenna" #: src/dialogs/confdialog.cxx:5016 msgid "Test Signal - Do NOT use with transmitter" msgstr "Segnale di prova - NON USARE col trasmettitore" #: src/dialogs/confdialog.cxx:5020 msgid "Noise on" msgstr "Genera rumore" #: src/dialogs/confdialog.cxx:5026 msgid "dB" msgstr "dB" #: src/dialogs/confdialog.cxx:5049 msgid "UI" msgstr "Aspetto" #: src/dialogs/confdialog.cxx:5053 msgid "Browser" msgstr "Navigatore" #: src/dialogs/confdialog.cxx:5056 msgid "Channels, first channel starts at waterfall lower limit" msgstr "Canali, il primo canale parte al limite inferiore del waterfall" #: src/dialogs/confdialog.cxx:5057 msgid "Change # of psk viewer channels" msgstr "Cambia il numero di canali nel visualizzatore psk." #: src/dialogs/confdialog.cxx:5074 msgid "Inactivity timeout" msgstr "Tempo di inattività" #: src/dialogs/confdialog.cxx:5075 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Cancella il testo del canale dopo\n" "# secondi di inattività" #: src/dialogs/confdialog.cxx:5091 msgid "Channel label" msgstr "Etichetta del canale" #: src/dialogs/confdialog.cxx:5092 msgid "Appearance of label on each channel" msgstr "Aspetto dell'etichetta di ciascun canale" #: src/dialogs/confdialog.cxx:5103 msgid "Audio frequency" msgstr "Frequenza audio" #: src/dialogs/confdialog.cxx:5104 msgid "Radio frequency" msgstr "Frequenza radio" #: src/dialogs/confdialog.cxx:5104 msgid "Channel number" msgstr "Numero del canale" #: src/dialogs/confdialog.cxx:5109 src/dialogs/confdialog.cxx:6274 msgid "Font..." msgstr "Caratteri..." #: src/dialogs/confdialog.cxx:5110 msgid "select browser font" msgstr "Seleziona i caratteri usati nel navigatore" #: src/dialogs/confdialog.cxx:5113 msgid "Fixed Intervals" msgstr "Intervalli fissi" #: src/dialogs/confdialog.cxx:5114 msgid "Force channel spacing to even 100 Hz increments" msgstr "Forza la spaziatura dei canali a incrementi regolari di 100 Hz" #: src/dialogs/confdialog.cxx:5121 msgid "Continuous scrolling" msgstr "Scorrimento continuo" #: src/dialogs/confdialog.cxx:5122 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" "ON - Scorrimento continuo\n" "OFF - Cancella e riparti" #: src/dialogs/confdialog.cxx:5127 msgid "Lowest freq on bottom of viewer" msgstr "Frequenza piú bassa in basso nel navigatore" #: src/dialogs/confdialog.cxx:5128 msgid "Change positions of low to high channels" msgstr "Cambia l'ordinamento da alto a basso dei canali" #: src/dialogs/confdialog.cxx:5133 msgid "Play back history when active channel selected" msgstr "Riproduci il buffer audio quando viene selezionato il canale attivo" #: src/dialogs/confdialog.cxx:5134 msgid "Audio stream history decoded on selected signal" msgstr "Il buffer audio viene decodificato per il segnale selezionato" #: src/dialogs/confdialog.cxx:5139 #, fuzzy msgid "Detection Level" msgstr "Colori livello decodifica" #: src/dialogs/confdialog.cxx:5141 msgid "Backgnd" msgstr "Sfondo" #: src/dialogs/confdialog.cxx:5142 msgid "Background color of signal viewer squelch control" msgstr "Colore di sfondo del controllo squelch del navigatore segnali" #: src/dialogs/confdialog.cxx:5147 msgid "Button" msgstr "Pulsante" #: src/dialogs/confdialog.cxx:5148 msgid "Slider hilite color of signal viewer squelch control" msgstr "Colore evidenziato del cursore nel controllo squelch del navigatore" #: src/dialogs/confdialog.cxx:5155 #, fuzzy msgid "Browser Line Colors" msgstr "Colori di sistema" #: src/dialogs/confdialog.cxx:5157 msgid "HiLite 1" msgstr "" #: src/dialogs/confdialog.cxx:5158 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "" #: src/dialogs/confdialog.cxx:5163 msgid "HiLite 2" msgstr "" #: src/dialogs/confdialog.cxx:5164 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "" #: src/dialogs/confdialog.cxx:5169 #, fuzzy msgid "Even" msgstr "Evento" #: src/dialogs/confdialog.cxx:5170 #, fuzzy msgid "Even lines" msgstr "Colore linea centrale" #: src/dialogs/confdialog.cxx:5175 #, fuzzy msgid "Odd" msgstr "Aggiungi" #: src/dialogs/confdialog.cxx:5176 msgid "Odd lines" msgstr "" #: src/dialogs/confdialog.cxx:5182 #, fuzzy msgid "Select line" msgstr "Seleziona tutto" #: src/dialogs/confdialog.cxx:5195 msgid "Exchanges" msgstr "Rapporti" #: src/dialogs/confdialog.cxx:5198 msgid "Send:" msgstr "Invia:" #: src/dialogs/confdialog.cxx:5200 src/logbook/lgbook.cxx:542 #: src/logbook/lgbook.cxx:900 src/logbook/lgbook.cxx:1115 msgid "Exchange Out" msgstr "Rapporto dato" #: src/dialogs/confdialog.cxx:5201 msgid "free form exchange" msgstr "rapporto a formato libero" #: src/dialogs/confdialog.cxx:5215 msgid "RST always 599" msgstr "RST sempre 599" #: src/dialogs/confdialog.cxx:5216 msgid "Force RST in/out to 599" msgstr "Forza RST tx/rx a 599" #: src/dialogs/confdialog.cxx:5221 msgid "Send CW cut numbers" msgstr "Abbrevia i numeri in CW" #: src/dialogs/confdialog.cxx:5222 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:5232 msgid "Use leading zeros" msgstr "Metti zeri davanti" #: src/dialogs/confdialog.cxx:5233 msgid "Insert leading zeros into Xmtd serial number" msgstr "Metti zeri davanti al numero seriale trasmesso" #: src/dialogs/confdialog.cxx:5238 msgid "Start" msgstr "Parti da" #: src/dialogs/confdialog.cxx:5239 msgid "Starting number" msgstr "Numero di partenza" #: src/dialogs/confdialog.cxx:5254 msgid "Digits" msgstr "Cifre" #: src/dialogs/confdialog.cxx:5255 msgid "Number of digits in serial number" msgstr "Numero di cifre nel numero progressivo" #: src/dialogs/confdialog.cxx:5271 src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Azzera" #: src/dialogs/confdialog.cxx:5272 msgid "Initialize the QSO logging fields" msgstr "Inizializza i campi di log del QSO" #: src/dialogs/confdialog.cxx:5277 msgid "Duplicate check, CALL plus" msgstr "Controllo duplicati, nominativo piú" #: src/dialogs/confdialog.cxx:5280 msgid "On/Off" msgstr "On/Off" #: src/dialogs/confdialog.cxx:5281 msgid "Check for duplicates" msgstr "Controlla duplicati" #: src/dialogs/confdialog.cxx:5286 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:471 msgid "Band" msgstr "Banda" #: src/dialogs/confdialog.cxx:5287 msgid "Bands must match" msgstr "Le banda deve coincidere" #: src/dialogs/confdialog.cxx:5292 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:474 src/logbook/lgbook.cxx:682 #: src/logbook/lgbook.cxx:1028 src/logbook/lgbook.cxx:1083 msgid "Mode" msgstr "Modo" #: src/dialogs/confdialog.cxx:5293 msgid "Mode must match" msgstr "Il modo deve coincidere" #: src/dialogs/confdialog.cxx:5299 msgid "State must match" msgstr "Lo stato deve coincidere" #: src/dialogs/confdialog.cxx:5305 msgid "free form 1 must match" msgstr "il rapporto a campo libero deve coincidere" #: src/dialogs/confdialog.cxx:5310 msgid "Time span over" msgstr "Arco di tempo" #: src/dialogs/confdialog.cxx:5311 msgid "QSO must not occur within a time period of" msgstr "Il QSO non si deve ripetere in un arco di tempo di" #: src/dialogs/confdialog.cxx:5316 msgid "minutes" msgstr "minuti" #: src/dialogs/confdialog.cxx:5317 msgid "Enter time span in minutes" msgstr "Inserisci l'arco temporale in minuti" #: src/dialogs/confdialog.cxx:5333 msgid "Dup Color" msgstr "Colore duplic." #: src/dialogs/confdialog.cxx:5334 msgid "Left click to select dup color" msgstr "Tasto sinistro per cambiare il colore dei duplicati" #: src/dialogs/confdialog.cxx:5346 src/dialogs/confdialog.cxx:6497 #: src/dialogs/confdialog.cxx:7508 src/dialogs/confdialog.cxx:9403 msgid "General" msgstr "Generale" #: src/dialogs/confdialog.cxx:5350 msgid "Show tooltips" msgstr "Mostra suggerimenti" #: src/dialogs/confdialog.cxx:5351 msgid "Enable / disable tooltips" msgstr "Abilita / disabilita suggerimenti" #: src/dialogs/confdialog.cxx:5357 msgid "Show menu icons" msgstr "Mostra le icone del menu" #: src/dialogs/confdialog.cxx:5358 msgid "Enable / disable icons on menus" msgstr "Abilita / disabilita le icone dei menu" #: src/dialogs/confdialog.cxx:5363 msgid "UI scheme" msgstr "Schema" #: src/dialogs/confdialog.cxx:5364 msgid "Change application look and feel" msgstr "Cambia l'aspetto del programma" #: src/dialogs/confdialog.cxx:5382 msgid "Visible modes" msgstr "Modi visibili" #: src/dialogs/confdialog.cxx:5383 msgid "Select modes for menu access" msgstr "Seleziona i modi accessibili dal menú" #: src/dialogs/confdialog.cxx:5386 msgid "UI language" msgstr "Lingua" #: src/dialogs/confdialog.cxx:5387 src/dialogs/confdialog.cxx:6403 msgid "Changes take effect on next program startup" msgstr "Le modifiche avranno effetto al prossimo avvio del programma" #: src/dialogs/confdialog.cxx:5406 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Stampa CW / RTTY / THROB / CONTESTIA in minuscolo" #: src/dialogs/confdialog.cxx:5416 #, fuzzy msgid "Transmit all text in lower case" msgstr "Potenza di trasmissione usata" #: src/dialogs/confdialog.cxx:5423 msgid "Exit prompts" msgstr "" #: src/dialogs/confdialog.cxx:5426 #, fuzzy msgid "Prompt to save Configuration" msgstr "Chiedi conferma per salvare il log" #: src/dialogs/confdialog.cxx:5431 #, fuzzy msgid "Prompt to save macro file" msgstr "Chiedi conferma per salvare il log" #: src/dialogs/confdialog.cxx:5432 src/dialogs/confdialog.cxx:5689 msgid "Write current macro set on program exit" msgstr "" #: src/dialogs/confdialog.cxx:5437 msgid "Prompt to save log" msgstr "Chiedi conferma per salvare il log" #: src/dialogs/confdialog.cxx:5438 src/dialogs/confdialog.cxx:5491 msgid "Bug me about saving log entries" msgstr "Annoiami con la richiesta di salvare il log" #: src/dialogs/confdialog.cxx:5443 msgid "" "Exit prompts active only when File/Exit menu item selected.\n" "Not active if window decoration close button pressed." msgstr "" #: src/dialogs/confdialog.cxx:5448 #, fuzzy msgid "Confirm exit" msgstr "Conferma" #: src/dialogs/confdialog.cxx:5455 #, fuzzy msgid "Check for updates" msgstr "Verifica aggiornamenti..." #: src/dialogs/confdialog.cxx:5458 msgid "Check for updates when starting program" msgstr "" #: src/dialogs/confdialog.cxx:5467 #, fuzzy msgid "Logging" msgstr "Log dei QSO" #: src/dialogs/confdialog.cxx:5469 msgid "Client/Server Logbook" msgstr "" #: src/dialogs/confdialog.cxx:5472 msgid "Address:" msgstr "" #: src/dialogs/confdialog.cxx:5473 msgid "Enter URL address of server" msgstr "" #: src/dialogs/confdialog.cxx:5477 src/dialogs/confdialog.cxx:9460 msgid "Port:" msgstr "Porta:" #: src/dialogs/confdialog.cxx:5478 #, fuzzy msgid "Enter Port # assigned to server" msgstr "Usa un server Port Audio" #: src/dialogs/confdialog.cxx:5482 msgid "Reconnect" msgstr "" #: src/dialogs/confdialog.cxx:5487 msgid "QSO logging" msgstr "Log dei QSO" #: src/dialogs/confdialog.cxx:5490 #, fuzzy msgid "Prompt to save log on exit" msgstr "Chiedi conferma per salvare il log" #: src/dialogs/confdialog.cxx:5496 msgid "Clear on save" msgstr "Cancella i campi quando salvi" #: src/dialogs/confdialog.cxx:5497 msgid "Clear log entries after saving or using macro " msgstr "Cancella i campi del log dopo aver salvato o usato la macro " #: src/dialogs/confdialog.cxx:5502 msgid "Convert callsign to upper case" msgstr "Converti il campo nominativo a maiuscole" #: src/dialogs/confdialog.cxx:5503 msgid "Force callsign field to UPPERCASE" msgstr "Forza il campo nominativo a MAIUSCOLE" #: src/dialogs/confdialog.cxx:5508 msgid "Auto-fill Country and Azimuth" msgstr "Paese e Azimuth automatici" #: src/dialogs/confdialog.cxx:5509 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "Riempi i campi Paese / Azimuth con le informazioni dal file cty.dat" #: src/dialogs/confdialog.cxx:5514 msgid "Sort by Date/Time OFF" msgstr "Ordina per data/ora di fine QSO" #: src/dialogs/confdialog.cxx:5515 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" "Ordina il log in base all'ora/data di fine QSO\n" "Influisce su tutti i file esportati in ADIF/Cabrillo" #: src/dialogs/confdialog.cxx:5520 msgid "Date time ON == OFF" msgstr "Data di inizio == fine" #: src/dialogs/confdialog.cxx:5521 msgid "Force date/time ON == date/time OFF" msgstr "Forza data e ora di inizio QSO uguali a quelle di fine" #: src/dialogs/confdialog.cxx:5526 #, fuzzy msgid "Default RST in to 599" msgstr "RST dato automaticamente 599" #: src/dialogs/confdialog.cxx:5527 #, fuzzy msgid "Clear log controls sets RST in to 599" msgstr "Premendo cancella log imposta RST dato automaticamente a 599" #: src/dialogs/confdialog.cxx:5532 msgid "Default RST out to 599" msgstr "RST dato automaticamente 599" #: src/dialogs/confdialog.cxx:5533 msgid "Clear log controls sets RST out to 599" msgstr "Premendo cancella log imposta RST dato automaticamente a 599" #: src/dialogs/confdialog.cxx:5538 msgid "cty.dat pathname" msgstr "" #: src/dialogs/confdialog.cxx:5539 #, fuzzy msgid "Enter full path-filename for cty.dat" msgstr "Inserisci il percorso completo a flmsg" #: src/dialogs/confdialog.cxx:5552 #, fuzzy msgid "Browse" msgstr "Navigatore" #: src/dialogs/confdialog.cxx:5553 msgid "Locate cty.dat file" msgstr "" #: src/dialogs/confdialog.cxx:5556 src/dialogs/confdialog.cxx:5914 #: src/dialogs/confdialog.cxx:5934 src/dialogs/confdialog.cxx:6648 msgid "Default" msgstr "Predefinito" #: src/dialogs/confdialog.cxx:5557 #, fuzzy msgid "Restore cty.dat default folder" msgstr "Ripristina predefiniti" #: src/dialogs/confdialog.cxx:5560 msgid "Reload" msgstr "" #: src/dialogs/confdialog.cxx:5561 msgid "Reload cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:5564 msgid "Transmit Power" msgstr "Potenza trasmissione" #: src/dialogs/confdialog.cxx:5565 msgid "Tx power used for logbook entries" msgstr "Potenza Tx usata nei campi del log" #: src/dialogs/confdialog.cxx:5581 #, fuzzy msgid "Rx Text Capture" msgstr "Cattura testo" #: src/dialogs/confdialog.cxx:5584 msgid "Double-click to capture" msgstr "" #: src/dialogs/confdialog.cxx:5585 msgid "Enable if you cannot use the middle mouse button" msgstr "Abilita se non puoi usare il tasto centrale del mouse" #: src/dialogs/confdialog.cxx:5590 #, fuzzy msgid "callsign tooltips in received text" msgstr "Mostra le informazioni sul nominativo nel testo ricevuto" #: src/dialogs/confdialog.cxx:5591 msgid "Popup info after a 2 second hover on a callsign" msgstr "" "Tenendo il mouse per piú di due secondi su un nominativo appare popup con " "informazioni" #: src/dialogs/confdialog.cxx:5596 msgid "Word delimiters" msgstr "Delimitatori di parola" #: src/dialogs/confdialog.cxx:5597 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" "L'inserimento dei dati del QSO dal testo ricevuto è delimitato\n" "dai caratteri definiti qui. Tab e a capo sono sempre inclusi." #: src/dialogs/confdialog.cxx:5621 msgid "Mouse wheel active on macro buttons" msgstr "Rotella del mouse attiva sui pulsanti macro" #: src/dialogs/confdialog.cxx:5622 msgid "enable mouse wheel control of macro bar" msgstr "" "Abilita l'uso della rotella del mouse per il controllo della barra delle " "macro" #: src/dialogs/confdialog.cxx:5629 msgid "Number and position of macro bars" msgstr "Numero e posizione delle barre delle macro" #: src/dialogs/confdialog.cxx:5632 msgid "One bar (above waterfall)" msgstr "Una barra (sopra il waterfall)" #: src/dialogs/confdialog.cxx:5637 msgid "One bar (below waterfall)" msgstr "Una barra (sotto il waterfall)" #: src/dialogs/confdialog.cxx:5642 msgid "Two bars (scheme 1)" msgstr "Due barre (schema 1)" #: src/dialogs/confdialog.cxx:5647 msgid "Two bars (scheme 2)" msgstr "Due barre (schema 2)" #: src/dialogs/confdialog.cxx:5652 msgid "Two bars (scheme 3)" msgstr "Due barre (schema 3)" #: src/dialogs/confdialog.cxx:5657 msgid "Two bars (scheme 4)" msgstr "Due barre (schema 4)" #: src/dialogs/confdialog.cxx:5662 msgid "Two bars (scheme 5)" msgstr "Due barre (schema 5)" #: src/dialogs/confdialog.cxx:5667 msgid "Two bars (scheme 6)" msgstr "Due barre (schema 6)" #: src/dialogs/confdialog.cxx:5676 msgid "Load last used macro file on startup" msgstr "All'avvio carica l'ultimo file delle macro usato" #: src/dialogs/confdialog.cxx:5677 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "ON - usa l'ultimo file delle macro\n" "OFF - usa il file predefinito" #: src/dialogs/confdialog.cxx:5682 msgid "Display macro filename on startup" msgstr "Mostra il nome del file delle macro all'avvio" #: src/dialogs/confdialog.cxx:5683 msgid "The filename is written to the RX text area" msgstr "Il nome del file viene scritto nell'area del testo Rx" #: src/dialogs/confdialog.cxx:5688 #, fuzzy msgid "Prompt to save macro file when closing" msgstr "Chiedi conferma per salvare il log" #: src/dialogs/confdialog.cxx:5698 #, fuzzy msgid "WF Ctrls" msgstr "Controlli WF" #: src/dialogs/confdialog.cxx:5702 msgid "Enable check box to show each respective operator control" msgstr "Abilita le selezioni per mostrare i rispettivi controlli di operatore" #: src/dialogs/confdialog.cxx:5712 msgid "WF Magnification" msgstr "Ingrandimento WF" #: src/dialogs/confdialog.cxx:5718 msgid "WF carrier" msgstr "Portante WF" #: src/dialogs/confdialog.cxx:5724 msgid "WF Shift Controls" msgstr "Controlli scorrimento WF" #: src/dialogs/confdialog.cxx:5730 msgid "WF ref level" msgstr "Livello di riferimento WF" #: src/dialogs/confdialog.cxx:5736 msgid "WF drop rate" msgstr "Velocita' verticale WF" #: src/dialogs/confdialog.cxx:5742 msgid "WF amp span" msgstr "WF amp span" #: src/dialogs/confdialog.cxx:5748 msgid "WF Store" msgstr "Memorie WF" #: src/dialogs/confdialog.cxx:5754 msgid "WF mode" msgstr "Modo WF" #: src/dialogs/confdialog.cxx:5760 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:5766 msgid "XMT lock" msgstr "Blocca freq trasmissione" #: src/dialogs/confdialog.cxx:5772 msgid "Enable all" msgstr "Abilita tutto" #: src/dialogs/confdialog.cxx:5775 msgid "Disable all" msgstr "Disabilita tutto" #: src/dialogs/confdialog.cxx:5782 #, fuzzy msgid "Colors/Fonts" msgstr "Colori && Caratteri" #: src/dialogs/confdialog.cxx:5785 #, fuzzy msgid "Rx/Tx" msgstr "Testo Rx/Tx" #: src/dialogs/confdialog.cxx:5786 #, fuzzy msgid "Rx/Tx Character set" msgstr "Seleziona il carattere a scansione per la trasmissione" #: src/dialogs/confdialog.cxx:5787 #, fuzzy msgid "Select Rx/Tx Character Set" msgstr "Seleziona il carattere a scansione per la trasmissione" #: src/dialogs/confdialog.cxx:5807 msgid "Rx bkgnd" msgstr "Sfondo Rx" #: src/dialogs/confdialog.cxx:5810 msgid "Tx bkgnd" msgstr "Sfondo Tx" #: src/dialogs/confdialog.cxx:5819 msgid "Rx font" msgstr "Caratt. Rx" #: src/dialogs/confdialog.cxx:5822 msgid "Tx font" msgstr "Caratt. Tx" #: src/dialogs/confdialog.cxx:5825 msgid "Text Highlighting" msgstr "" #: src/dialogs/confdialog.cxx:5828 msgid "XMIT" msgstr "TRASM" #: src/dialogs/confdialog.cxx:5829 msgid "Sent chars in Rx/Tx pane" msgstr "Caratteri inviati nelle finestre Rx/Tx" #: src/dialogs/confdialog.cxx:5834 msgid "CTRL" msgstr "CTRL" #: src/dialogs/confdialog.cxx:5835 msgid "Control chars in Rx/Tx pane" msgstr "Caratteri di controllo nelle finestre Rx/Tx" #: src/dialogs/confdialog.cxx:5840 msgid "SKIP" msgstr "Salta" #: src/dialogs/confdialog.cxx:5841 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "Caratteri saltati nella finestra Tx\n" "(Tx on/off in CW)" #: src/dialogs/confdialog.cxx:5846 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:5847 msgid "Alternate character color in Rx panelr" msgstr "Colore alternativo dei caratteri nella finestra Rx" #: src/dialogs/confdialog.cxx:5852 msgid "SEL" msgstr "SEL" #: src/dialogs/confdialog.cxx:5853 msgid "Selection background color in Rx Tx panels" msgstr "Colore del testo selezionato nelle finestre Rx/Tx" #: src/dialogs/confdialog.cxx:5858 src/dialogs/confdialog.cxx:5981 msgid "System" msgstr "Sistema" #: src/dialogs/confdialog.cxx:5861 src/dialogs/confdialog.cxx:5971 #: src/logbook/lgbook.cxx:563 msgid "Defaults" msgstr "Predefiniti" #: src/dialogs/confdialog.cxx:5868 #, fuzzy msgid "Frq Disp" msgstr "Visualizza Freq" #: src/dialogs/confdialog.cxx:5872 msgid "14070.150" msgstr "14070.150" #: src/dialogs/confdialog.cxx:5881 src/dialogs/confdialog.cxx:5911 #: src/dialogs/confdialog.cxx:5931 msgid "Font" msgstr "Caratteri" #: src/dialogs/confdialog.cxx:5884 src/dialogs/confdialog.cxx:5908 #: src/dialogs/confdialog.cxx:5928 msgid "Bg Color" msgstr "Colore Sfondo" #: src/dialogs/confdialog.cxx:5887 msgid "Digit Color" msgstr "Colore delle cifre" #: src/dialogs/confdialog.cxx:5890 msgid "Sys Colors" msgstr "Colori di sistema" #: src/dialogs/confdialog.cxx:5897 #, fuzzy msgid "Log" msgstr "Loc" #: src/dialogs/confdialog.cxx:5899 #, fuzzy msgid "Logging Panel Controls" msgstr "Controlli minimi" #: src/dialogs/confdialog.cxx:5919 #, fuzzy msgid "Logbook Dialog" msgstr "Log" #: src/dialogs/confdialog.cxx:5941 #, fuzzy msgid "F_keys" msgstr "Tasti funzione" #: src/dialogs/confdialog.cxx:5943 msgid "Use colored buttons" msgstr "Usa pulsanti colorati" #: src/dialogs/confdialog.cxx:5948 msgid "Group 1" msgstr "Gruppo 1" #: src/dialogs/confdialog.cxx:5949 msgid "Background color for Function key group 1" msgstr "Colore di sfondo per i tasti funzione del gruppo 1" #: src/dialogs/confdialog.cxx:5954 msgid "Group 2" msgstr "Gruppo 2" #: src/dialogs/confdialog.cxx:5955 msgid "Background color for Function key group 2" msgstr "Colore di sfondo per i tasti funzione del gruppo 2" #: src/dialogs/confdialog.cxx:5960 msgid "Group 3" msgstr "Gruppo 3" #: src/dialogs/confdialog.cxx:5961 msgid "Background color for Function key group 3" msgstr "Colore di sfondo per i tasti funzione del gruppo 3" #: src/dialogs/confdialog.cxx:5966 msgid "Label text" msgstr "Testo delle etichette" #: src/dialogs/confdialog.cxx:5976 msgid "Tabs" msgstr "Tab" #: src/dialogs/confdialog.cxx:5978 msgid "Tab Color" msgstr "Colore dei Tab" #: src/dialogs/confdialog.cxx:5986 msgid "Buttons" msgstr "Pulsanti" #: src/dialogs/confdialog.cxx:5988 msgid "Spot" msgstr "Spot" #: src/dialogs/confdialog.cxx:5991 msgid "RxID" msgstr "RxID" #: src/dialogs/confdialog.cxx:5994 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:5997 msgid "Tune" msgstr "Accordo" #: src/dialogs/confdialog.cxx:6000 msgid "Lk" msgstr "Blocca" #: src/dialogs/confdialog.cxx:6003 msgid "Rev" msgstr "Inverti" #: src/dialogs/confdialog.cxx:6006 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:6009 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:6012 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:6015 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:6061 msgid "Lighted button enabled colors" msgstr "Colori dei pulsanti illuminati selezionati" #: src/dialogs/confdialog.cxx:6066 msgid "SigLvl" msgstr "" #: src/dialogs/confdialog.cxx:6068 src/dialogs/confdialog.cxx:9023 #, fuzzy msgid "Low" msgstr "Loc" #: src/dialogs/confdialog.cxx:6076 src/dialogs/confdialog.cxx:9023 msgid "High" msgstr "" #: src/dialogs/confdialog.cxx:6084 msgid "Normal" msgstr "" #: src/dialogs/confdialog.cxx:6092 msgid "Over" msgstr "" #: src/dialogs/confdialog.cxx:6100 #, fuzzy msgid "Signal Level Colors" msgstr "Colori livello decodifica" #: src/dialogs/confdialog.cxx:6117 msgid "Display" msgstr "Visualizzazione" #: src/dialogs/confdialog.cxx:6118 msgid "Colors and cursors" msgstr "Colori e cursori" #: src/dialogs/confdialog.cxx:6121 msgid "aa" msgstr "" #: src/dialogs/confdialog.cxx:6136 src/dialogs/confdialog.cxx:6140 #: src/dialogs/confdialog.cxx:6144 src/dialogs/confdialog.cxx:6148 #: src/dialogs/confdialog.cxx:6152 src/dialogs/confdialog.cxx:6156 #: src/dialogs/confdialog.cxx:6160 src/dialogs/confdialog.cxx:6164 #: src/dialogs/confdialog.cxx:6168 src/dialogs/confdialog.cxx:6189 #: src/dialogs/confdialog.cxx:6213 src/dialogs/confdialog.cxx:6237 #: src/dialogs/confdialog.cxx:6255 msgid "Change color" msgstr "Cambia colore" #: src/dialogs/confdialog.cxx:6171 msgid "Load..." msgstr "Carica..." #: src/dialogs/confdialog.cxx:6172 msgid "Load a new palette" msgstr "Carica una nuova palette" #: src/dialogs/confdialog.cxx:6175 msgid "Save..." msgstr "Salva..." #: src/dialogs/confdialog.cxx:6176 msgid "Save this palette" msgstr "Salva questa palette" #: src/dialogs/confdialog.cxx:6179 src/dialogs/confdialog.cxx:7315 #: src/dialogs/confdialog.cxx:7411 msgid "Bandwidth" msgstr "Larghezza di banda" #: src/dialogs/confdialog.cxx:6182 src/dialogs/confdialog.cxx:6206 #: src/dialogs/confdialog.cxx:6230 #, fuzzy msgid "ON" msgstr "CONT" #: src/dialogs/confdialog.cxx:6183 msgid "Show cursor with bandwidth lines" msgstr "Mostra linee che indicano la larghezza di banda del modo sul cursore" #: src/dialogs/confdialog.cxx:6188 src/dialogs/confdialog.cxx:6212 #: src/dialogs/confdialog.cxx:6236 src/dialogs/confdialog.cxx:6254 #: src/dialogs/font_browser.cxx:141 msgid "Color" msgstr "Colore" #: src/dialogs/confdialog.cxx:6195 src/dialogs/confdialog.cxx:6219 #: src/dialogs/confdialog.cxx:6243 msgid "Wide" msgstr "" #: src/dialogs/confdialog.cxx:6196 src/dialogs/confdialog.cxx:6220 #: src/dialogs/confdialog.cxx:6231 src/dialogs/confdialog.cxx:6244 msgid "Show bandwidth tracks on waterfall" msgstr "Mostra indicatori della larghezza di banda sul waterfall" #: src/dialogs/confdialog.cxx:6203 #, fuzzy msgid "Center line" msgstr "Colore linea centrale" #: src/dialogs/confdialog.cxx:6207 msgid "Show cursor with center line" msgstr "Mostra il cursore con linea centrale" #: src/dialogs/confdialog.cxx:6227 #, fuzzy msgid "Signal tracks" msgstr "Ricerca segnali" #: src/dialogs/confdialog.cxx:6251 msgid "Notch" msgstr "" #: src/dialogs/confdialog.cxx:6265 msgid "Frequency scale" msgstr "Scala di frequenza" #: src/dialogs/confdialog.cxx:6268 msgid "Always show audio frequencies" msgstr "Mostra sempre le frequenze audio" #: src/dialogs/confdialog.cxx:6269 msgid "Audio or RF frequencies on waterfall scale" msgstr "Frequenze audio o RF sulla scala del waterfall" #: src/dialogs/confdialog.cxx:6275 msgid "Select waterfall scale font" msgstr "Scegli il carattere della scala del waterfall" #: src/dialogs/confdialog.cxx:6280 msgid "Transmit signal" msgstr "Segnale trasmesso" #: src/dialogs/confdialog.cxx:6283 msgid "Monitor transmitted signal" msgstr "Monitorizza il segnale trasmesso" #: src/dialogs/confdialog.cxx:6284 msgid "Show transmit signal on waterfall" msgstr "Mostra il segnale trasmesso sul waterfall" #: src/dialogs/confdialog.cxx:6289 msgid "Signal level" msgstr "Livello del segnale" #: src/dialogs/confdialog.cxx:6290 msgid "Set level for good viewing" msgstr "Imposta il livello per una buona visualizzazione" #: src/dialogs/confdialog.cxx:6312 msgid "FFT Processing" msgstr "Elaborazione FFT" #: src/dialogs/confdialog.cxx:6316 src/dialogs/confdialog.cxx:6668 msgid "Lower limit" msgstr "Limite inferiore" #: src/dialogs/confdialog.cxx:6317 msgid "Low frequency limit in Hz" msgstr "Limite inferiore di frequenza in Hz" #: src/dialogs/confdialog.cxx:6336 msgid "FFT averaging" msgstr "Media FFT" #: src/dialogs/confdialog.cxx:6337 msgid "Use averaging to decrease waterfall noise" msgstr "Usa la media per diminuire il rumore del waterfall" #: src/dialogs/confdialog.cxx:6342 msgid "FFT prefilter window function" msgstr "Funzione di prefiltro a finestra FFT" #: src/dialogs/confdialog.cxx:6343 msgid "Select the type of FFT prefilter" msgstr "Seleziona il tipo di prefiltro FFT" #: src/dialogs/confdialog.cxx:6354 msgid "Rectangular" msgstr "Rettangolare" #: src/dialogs/confdialog.cxx:6356 msgid "Triangular" msgstr "Triangolare" #: src/dialogs/confdialog.cxx:6361 src/dialogs/confdialog.cxx:6680 msgid "Upper limit" msgstr "Limite superiore" #: src/dialogs/confdialog.cxx:6362 msgid "High frequency limit in Hz" msgstr "Limite superiore di frequenza in Hz" #: src/dialogs/confdialog.cxx:6381 msgid "Latency" msgstr "" #: src/dialogs/confdialog.cxx:6382 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:6404 msgid "Show me more or less waterfall" msgstr "Mostrami piú o meno waterfall" #: src/dialogs/confdialog.cxx:6407 msgid "Waterfall height in pixels" msgstr "Altezza del waterfall in pixel" #: src/dialogs/confdialog.cxx:6408 msgid "CPU usage increases with waterfall height" msgstr "L'utilizzo della CPU aumenta con l'altezza del waterfall" #: src/dialogs/confdialog.cxx:6431 msgid "Mouse" msgstr "Mouse" #: src/dialogs/confdialog.cxx:6435 msgid "Left or right click always replays audio history" msgstr "Click destro o sinistro riascolta la memoria audio" #: src/dialogs/confdialog.cxx:6436 msgid "Replay trackline audio" msgstr "Rianalizza i dati audio degli ultimi 2 minuti" #: src/dialogs/confdialog.cxx:6441 msgid "Dragging on the waterfall scale changes frequency" msgstr "Trascinare sulla scala del waterfall cambia la frequenza" #: src/dialogs/confdialog.cxx:6442 msgid "Enable drag cursor on waterfall scale" msgstr "Abilita il trascinamento del cursore sulla scala del waterfall" #: src/dialogs/confdialog.cxx:6447 msgid "Insert text on single left click" msgstr "Inserisci testo con un singolo click sinistro" #: src/dialogs/confdialog.cxx:6448 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" "Inserisci testo speciale nel pannello Rx\n" "quando fai click sul waterfall" #: src/dialogs/confdialog.cxx:6454 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" "La stringa viene sostituita\n" "con il modem e la frequenza correnti" #: src/dialogs/confdialog.cxx:6468 msgid "Wheel action" msgstr "Azione della rotella del mouse" #: src/dialogs/confdialog.cxx:6469 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Scegli il comportamento della rotella\n" "del mouse all'interno del waterfall" #: src/dialogs/confdialog.cxx:6494 src/dialogs/confdialog.cxx:9177 #: src/dialogs/confdialog.cxx:9492 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:6502 msgid "Filter bandwidth" msgstr "Larghezza del filtro" #: src/dialogs/confdialog.cxx:6503 msgid "CW dsp filter bandwidth" msgstr "Larghezza del filtro dsp CW" #: src/dialogs/confdialog.cxx:6523 #, fuzzy msgid "Rx WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:6529 msgid "Tracked CW speed in WPM" msgstr "Velocita' inseguita in CW (WPM)" #: src/dialogs/confdialog.cxx:6534 msgid "SOM decoding" msgstr "" #: src/dialogs/confdialog.cxx:6535 msgid "Self Organizing Mapping" msgstr "" #: src/dialogs/confdialog.cxx:6541 #, fuzzy msgid "Lower" msgstr "Limite inferiore" #: src/dialogs/confdialog.cxx:6542 msgid "Detector low threshold" msgstr "" #: src/dialogs/confdialog.cxx:6561 #, fuzzy msgid "Upper" msgstr "Limite superiore" #: src/dialogs/confdialog.cxx:6562 msgid "Detector high threshold" msgstr "" #: src/dialogs/confdialog.cxx:6581 #, fuzzy msgid "Matched Filter" msgstr "Filtro" #: src/dialogs/confdialog.cxx:6582 #, fuzzy msgid "Matched Filter bandwidth" msgstr "Larghezza del filtro" #: src/dialogs/confdialog.cxx:6588 #, fuzzy msgid "FFT filter" msgstr "Filtro" #: src/dialogs/confdialog.cxx:6589 msgid "FFT / FIR filter" msgstr "" #: src/dialogs/confdialog.cxx:6595 msgid "Tracking" msgstr "Inseguimento" #: src/dialogs/confdialog.cxx:6596 msgid "Automatic Rx speed tracking" msgstr "Inseguimento automatico velocita' in ricezione" #: src/dialogs/confdialog.cxx:6602 #, fuzzy msgid "Range, WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:6603 msgid "Range +/- wpm" msgstr "" "L'inseguimento avviene tra il valore corrente +/-\n" "il valore impostato in questo campo" #: src/dialogs/confdialog.cxx:6627 msgid "TX WPM" msgstr "TX WPM" #: src/dialogs/confdialog.cxx:6628 src/dialogs/confdialog.cxx:6693 msgid "My transmit CW WPM" msgstr "La mia velocitá di trasmissione in WPM" #: src/dialogs/confdialog.cxx:6649 msgid "The default CW speed" msgstr "La velocitá predefinita di trasmissione in CW" #: src/dialogs/confdialog.cxx:6669 msgid "No slower than this" msgstr "Non piú piano di questo" #: src/dialogs/confdialog.cxx:6681 msgid "No faster than this" msgstr "Non piú veloce di questo" #: src/dialogs/confdialog.cxx:6692 msgid "F-WPM" msgstr "F-WPM" #: src/dialogs/confdialog.cxx:6713 msgid "Use Farnsworth timing" msgstr "Usa la spaziatura Farnsworth" #: src/dialogs/confdialog.cxx:6722 msgid "Timing and QSK" msgstr "Temporizzazione e QSK" #: src/dialogs/confdialog.cxx:6725 msgid "Timing" msgstr "Temporizzazione" #: src/dialogs/confdialog.cxx:6728 msgid "Weight (%)" msgstr "Peso (%)" #: src/dialogs/confdialog.cxx:6729 msgid "Dot to dot-space ratio" msgstr "Rapporto tra punto e punto-spazio" #: src/dialogs/confdialog.cxx:6748 src/dialogs/confdialog.cxx:6749 msgid "Dash to dot ratio" msgstr "Rapporto linea/punto" #: src/dialogs/confdialog.cxx:6767 msgid "Edge timing" msgstr "Tempo di salita" #: src/dialogs/confdialog.cxx:6768 msgid "Leading and Trailing edge risetimes (msec)" msgstr "Tempo in ms di salita/discesa dell'impulso" #: src/dialogs/confdialog.cxx:6786 msgid "Edge shape" msgstr "" "Forma d'onda\n" "al bordo" #: src/dialogs/confdialog.cxx:6787 msgid "Raised cosine = Hanning" msgstr "Raised cosine = Hanning" #: src/dialogs/confdialog.cxx:6803 msgid "Edge decreases pulse width" msgstr "Il tempo di salita riduce la larghezza dell'impulso" #: src/dialogs/confdialog.cxx:6804 msgid "Weight decreases with increasing edge timing" msgstr "Il peso diminuisce aumentando il tempo di salita" #: src/dialogs/confdialog.cxx:6811 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:6814 msgid "QSK on right audio channel" msgstr "QSK sul canale audio destro" #: src/dialogs/confdialog.cxx:6815 msgid "Generate square wave signal on right channel" msgstr "Genera un segnale a onda quadra sul canale audio destro" #: src/dialogs/confdialog.cxx:6820 msgid "Pre-keydown timing (ms)" msgstr "Tempo prima dell'impulso (ms)" #: src/dialogs/confdialog.cxx:6821 msgid "Msec pre-keydown (+ is earlier in time)" msgstr "Quanti ms prima dell'impulso viene attivata la linea QSK" #: src/dialogs/confdialog.cxx:6839 msgid "Post-keydown timing (ms)" msgstr "Tempo dopo l'impulso (ms)" #: src/dialogs/confdialog.cxx:6840 msgid "Msec post-keydown (+ is earlier in time)" msgstr "Quanti ms dopo l'impulso viene disattivata la linea QSK" #: src/dialogs/confdialog.cxx:6858 msgid "Send continuously" msgstr "Invia continuamente" #: src/dialogs/confdialog.cxx:6859 msgid "Send a continuous stream of test characters" msgstr "Invia un flusso continuo di caratteri di prova" #: src/dialogs/confdialog.cxx:6864 msgid "Test char" msgstr "Carattere di prova" #: src/dialogs/confdialog.cxx:6865 msgid "Test character for QSK adjustment" msgstr "Carattere di prova per la regolazione del QSK" #: src/dialogs/confdialog.cxx:6885 msgid "Prosigns" msgstr "Prosigns" #: src/dialogs/confdialog.cxx:6890 msgid "Use '(' paren not KN" msgstr "Usa '(' come parentesi, non KN" #: src/dialogs/confdialog.cxx:6897 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6914 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6931 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6948 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6964 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6981 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:6998 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7015 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7032 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:7055 #, fuzzy msgid "Dom" msgstr "DomEX" #: src/dialogs/confdialog.cxx:7059 src/dialogs/confdialog.cxx:7902 msgid "Secondary Text" msgstr "Testo secondario" #: src/dialogs/confdialog.cxx:7060 src/dialogs/confdialog.cxx:7903 msgid "Text to send during keyboard idle times" msgstr "Testo da inviare durante i tempi morti della tastiera" #: src/dialogs/confdialog.cxx:7074 src/dialogs/confdialog.cxx:7917 msgid "Filtering" msgstr "Filtraggio" #: src/dialogs/confdialog.cxx:7075 msgid "Use DSP filter before decoder" msgstr "Usa il filtro DSP prima del decodificatore" #: src/dialogs/confdialog.cxx:7081 src/dialogs/confdialog.cxx:7924 msgid "Filter bandwidth factor" msgstr "Fattore di larghezza di banda del filtro" #: src/dialogs/confdialog.cxx:7082 src/dialogs/confdialog.cxx:7925 msgid "Filter bandwidth relative to signal width" msgstr "Larghezza di banda del filtro relativa alla larghezza del segnale" #: src/dialogs/confdialog.cxx:7100 msgid "FEC" msgstr "FEC" #: src/dialogs/confdialog.cxx:7101 msgid "Enable MultiPSK-compatible FEC" msgstr "Abilita FEC compatibile con MultiPSK" #: src/dialogs/confdialog.cxx:7106 src/dialogs/confdialog.cxx:7943 msgid "CWI threshold" msgstr "Soglia CWI" #: src/dialogs/confdialog.cxx:7107 src/dialogs/confdialog.cxx:7944 msgid "CWI detection and suppression" msgstr "Rilevazione e soppressione CWI" #: src/dialogs/confdialog.cxx:7123 src/dialogs/confdialog.cxx:7979 msgid "Paths (hidden)" msgstr "Paths (hidden)" #: src/dialogs/confdialog.cxx:7147 #, fuzzy msgid "Feld" msgstr "Feldhell" #: src/dialogs/confdialog.cxx:7151 msgid "Transmit font" msgstr "Carattere in TX" #: src/dialogs/confdialog.cxx:7152 msgid "Select TX raster font" msgstr "Seleziona il carattere a scansione per la trasmissione" #: src/dialogs/confdialog.cxx:7168 msgid "Reverse video" msgstr "Inverti il video" #: src/dialogs/confdialog.cxx:7169 msgid "Display RX in reverse video" msgstr "Mostra il testo ricevuto a colori invertiti" #: src/dialogs/confdialog.cxx:7174 msgid "Transmit width" msgstr "Larghezza di trasmissione" #: src/dialogs/confdialog.cxx:7175 msgid "# of multiple scans / character line" msgstr "# di linee multiple / linea di caratteri" #: src/dialogs/confdialog.cxx:7190 msgid "Halve receive width" msgstr "Dimezza la larghezza RX" #: src/dialogs/confdialog.cxx:7191 msgid "Compress Rx in time" msgstr "Comprimi la ricezione nel tempo" #: src/dialogs/confdialog.cxx:7196 msgid "Pulse shape" msgstr "Forma dell'impulso" #: src/dialogs/confdialog.cxx:7197 msgid "Raised cosine pulse shape factor" msgstr "Fattore di forma dell'impulso di tipo raised cosine" #: src/dialogs/confdialog.cxx:7208 msgid "Slow (4 msec)" msgstr "Lento (4 ms)" #: src/dialogs/confdialog.cxx:7209 msgid "Fast (2 msec)" msgstr "Veloce (2 ms)" #: src/dialogs/confdialog.cxx:7214 msgid "Receive filter bandwidth" msgstr "Larghezza di banda del filtro di ricezione" #: src/dialogs/confdialog.cxx:7215 msgid "Adjust the DSP bandwidth" msgstr "Aggiusta la larghezza di banda DSP" #: src/dialogs/confdialog.cxx:7235 msgid "Transmit periods (.) when idle" msgstr "Trasmetti punti (.) nei tempi morti" #: src/dialogs/confdialog.cxx:7236 msgid "Transmits a diddle dot when no keyboard activity" msgstr "Trasmetti un punto quando non c'è attivitá sulla tastiera" #: src/dialogs/confdialog.cxx:7242 msgid "2x Xmt Width (hidden)" msgstr "2x Xmt Width (hidden)" #: src/dialogs/confdialog.cxx:7252 msgid "MT-63" msgstr "MT-63" #: src/dialogs/confdialog.cxx:7257 src/dialogs/confdialog.cxx:7398 #, fuzzy msgid "8-bit extended characters (UTF-8)" msgstr "Caratteri estesi a 8 bit" #: src/dialogs/confdialog.cxx:7258 #, fuzzy msgid "Enable this for UTF-8 characters" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:7264 msgid "Long receive integration" msgstr "Integrazione di ricezione lunga" #: src/dialogs/confdialog.cxx:7265 msgid "Enable for very weak signals" msgstr "Abilitare per segnali molto deboli" #: src/dialogs/confdialog.cxx:7275 msgid "Transmit lower start tone" msgstr "Trasmetti il tono di avvio basso" #: src/dialogs/confdialog.cxx:7280 msgid "Transmit upper start tone" msgstr "Trasmetti il tono di avvio alto" #: src/dialogs/confdialog.cxx:7286 msgid "Tone Duration (secs)" msgstr "Durata del tono (secondi)" #: src/dialogs/confdialog.cxx:7302 msgid "Allow manual tuning" msgstr "Permetti sintonia manuale" #: src/dialogs/confdialog.cxx:7311 msgid "Olivia" msgstr "Olivia" #: src/dialogs/confdialog.cxx:7316 src/dialogs/confdialog.cxx:7412 msgid "Select bandwidth" msgstr "Seleziona la larghezza di banda" #: src/dialogs/confdialog.cxx:7332 src/dialogs/confdialog.cxx:7428 msgid "Tones" msgstr "Toni" #: src/dialogs/confdialog.cxx:7333 src/dialogs/confdialog.cxx:7429 msgid "Select number of tones" msgstr "Seleziona il numero di toni" #: src/dialogs/confdialog.cxx:7349 src/dialogs/confdialog.cxx:7445 msgid "Receive synchronizer" msgstr "Sincronizzatore di ricezione" #: src/dialogs/confdialog.cxx:7352 src/dialogs/confdialog.cxx:7448 msgid "Tune margin (tone frequency spacing)" msgstr "Margine di sintonia (spaziatura tra i toni)" #: src/dialogs/confdialog.cxx:7353 src/dialogs/confdialog.cxx:7372 #: src/dialogs/confdialog.cxx:7449 src/dialogs/confdialog.cxx:7468 msgid "Change ONLY to experiment" msgstr "Cambiare SOLO per sperimentare" #: src/dialogs/confdialog.cxx:7371 src/dialogs/confdialog.cxx:7467 msgid "Integration period (FEC blocks)" msgstr "Periodo d'integrazione (FEC blocks)" #: src/dialogs/confdialog.cxx:7390 src/dialogs/confdialog.cxx:7486 msgid "Reset FEC blocks when changing BW or Tones" msgstr "" #: src/dialogs/confdialog.cxx:7391 src/dialogs/confdialog.cxx:7399 #: src/dialogs/confdialog.cxx:7487 #, fuzzy msgid "Enable this for UTF-8 character transmission" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:7407 #, fuzzy msgid "Cont'" msgstr "Contest" #: src/dialogs/confdialog.cxx:7494 msgid "8-bit extended characters" msgstr "Caratteri estesi a 8 bit" #: src/dialogs/confdialog.cxx:7495 msgid "Enable this for Latin-1 accented characters" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:7504 msgid "PSK" msgstr "PSK" #: src/dialogs/confdialog.cxx:7510 msgid "AFC behavior" msgstr "Comportamento AFC" #: src/dialogs/confdialog.cxx:7513 msgid "Acquisition search range (Hz)" msgstr "Raggio di ricerca per l'acquisizione (Hz)" #: src/dialogs/confdialog.cxx:7514 msgid "Capture signals within this frequency range" msgstr "Cattura i segnali all'interno di questo raggio di frequenza" #: src/dialogs/confdialog.cxx:7533 src/dialogs/confdialog.cxx:9354 msgid "Acquisition S/N (dB)" msgstr "S/N (dB) per l'acquisizione" #: src/dialogs/confdialog.cxx:7534 src/dialogs/confdialog.cxx:9355 msgid "Capture signals over this threshold" msgstr "Cattura i segnali oltre questa soglia" #: src/dialogs/confdialog.cxx:7555 msgid "S/N and IMD behavior" msgstr "Comportamento S/N e IMD" #: src/dialogs/confdialog.cxx:7558 msgid "after" msgstr "dopo" #: src/dialogs/confdialog.cxx:7559 msgid "Behavior of s/n imd" msgstr "Comportamento degli indicatori s/n e imd" #: src/dialogs/confdialog.cxx:7570 msgid "Dim" msgstr "Scurisci" #: src/dialogs/confdialog.cxx:7575 msgid "seconds" msgstr "secondi" #: src/dialogs/confdialog.cxx:7576 msgid "Will occur after this time in seconds" msgstr "Avverrà dopo questo tempo in secondi" #: src/dialogs/confdialog.cxx:7596 msgid "Multi-Channel Signal Processing" msgstr "Elaborazione di segnale multicanale" #: src/dialogs/confdialog.cxx:7599 msgid "Multi-channel detector" msgstr "Decodificatore Multicanale" #: src/dialogs/confdialog.cxx:7604 msgid "Disable on very slow CPUs of if signal browser is not used" msgstr "Disabilita su CPU molto lente o se il navigatore non è usato" #: src/dialogs/confdialog.cxx:7615 src/dialogs/confdialog.cxx:9511 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:7619 #, fuzzy msgid "Rx" msgstr "RxID" #: src/dialogs/confdialog.cxx:7624 msgid "AFC speed" msgstr "Velocità AFC" #: src/dialogs/confdialog.cxx:7625 msgid "AFC tracking speed" msgstr "Velocità di tracciamento AFC" #: src/dialogs/confdialog.cxx:7641 #, fuzzy msgid "RX - unshift on space" msgstr "Togli shift dopo spazio" #: src/dialogs/confdialog.cxx:7642 #, fuzzy msgid "Revert to unshifted char's on a space" msgstr "Ritorna a caratteri normali (unshifted) dopo uno spazio" #: src/dialogs/confdialog.cxx:7647 #, fuzzy msgid "Filter Shape Factor" msgstr "Fattore di larghezza di banda del filtro" #: src/dialogs/confdialog.cxx:7648 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" #: src/dialogs/confdialog.cxx:7660 #, fuzzy msgid "Decode (CWI suppression)" msgstr "Rilevazione e soppressione CWI" #: src/dialogs/confdialog.cxx:7663 msgid "Mark-Space" msgstr "" #: src/dialogs/confdialog.cxx:7668 msgid "Mark only" msgstr "" #: src/dialogs/confdialog.cxx:7673 msgid "Space only" msgstr "" #: src/dialogs/confdialog.cxx:7680 msgid "RTTY Scope Display" msgstr "" #: src/dialogs/confdialog.cxx:7683 msgid "Use cross hair scope" msgstr "Usa oscilloscopio a croce" #: src/dialogs/confdialog.cxx:7684 msgid "Default to cross hair digiscope" msgstr "Imposta l'oscilloscopio a croce come predefinito" #: src/dialogs/confdialog.cxx:7689 msgid "XY - classic scope" msgstr "" #: src/dialogs/confdialog.cxx:7690 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" #: src/dialogs/confdialog.cxx:7697 #, fuzzy msgid "Log RTTY frequency" msgstr "Frequenza audio" #: src/dialogs/confdialog.cxx:7700 msgid "Use MARK freq'" msgstr "" #: src/dialogs/confdialog.cxx:7701 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" #: src/dialogs/confdialog.cxx:7708 #, fuzzy msgid "track color" msgstr "Colore tracce" #: src/dialogs/confdialog.cxx:7709 msgid "Color of Mark Track" msgstr "" #: src/dialogs/confdialog.cxx:7719 #, fuzzy msgid "Tx" msgstr "TxID" #: src/dialogs/confdialog.cxx:7722 msgid "Carrier shift" msgstr "" "Scostamento \n" "della portante" #: src/dialogs/confdialog.cxx:7723 msgid "Select carrier shift" msgstr "Seleziona lo scostamento della portante" #: src/dialogs/confdialog.cxx:7738 msgid "Custom shift" msgstr "" "Scostamento \n" "personalizzato" #: src/dialogs/confdialog.cxx:7739 msgid "Input carrier shift" msgstr "Scostamento della portante in ingresso" #: src/dialogs/confdialog.cxx:7757 msgid "Baud rate" msgstr "Baud rate" #: src/dialogs/confdialog.cxx:7758 msgid "Select carrier baudrate" msgstr "Seleziona la velocitá in baud della portante" #: src/dialogs/confdialog.cxx:7773 msgid "Bits per character" msgstr "Bit per carattere" #: src/dialogs/confdialog.cxx:7774 msgid "Select # bits / char" msgstr "Seleziona il numero di bit per carattere" #: src/dialogs/confdialog.cxx:7789 msgid "Parity" msgstr "Parità" #: src/dialogs/confdialog.cxx:7790 msgid "Select parity" msgstr "Seleziona la parità" #: src/dialogs/confdialog.cxx:7805 msgid "Stop bits" msgstr "Bit arresto" #: src/dialogs/confdialog.cxx:7806 msgid "Select # stop bits" msgstr "Seleziona il numero di bit d'arresto" #: src/dialogs/confdialog.cxx:7821 msgid "AutoCRLF" msgstr "AutoCRLF" #: src/dialogs/confdialog.cxx:7822 msgid "Add CRLF after page width characters" msgstr "Aggiungi CRLF quando raggiungi la larghezza della pagina" #: src/dialogs/confdialog.cxx:7827 #, fuzzy msgid "chars" msgstr "caratteri" #: src/dialogs/confdialog.cxx:7828 msgid "Auto CRLF line length" msgstr "" #: src/dialogs/confdialog.cxx:7846 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:7847 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "Usa \"cr cr lf\" al posto di \"cr lf\"" #: src/dialogs/confdialog.cxx:7853 #, fuzzy msgid "TX - unshift on space" msgstr "Togli shift dopo spazio" #: src/dialogs/confdialog.cxx:7854 msgid "Revert to Unsifted char's on a space" msgstr "Ritorna a caratteri normali (unshifted) dopo uno spazio" #: src/dialogs/confdialog.cxx:7859 #, fuzzy msgid "Pseudo-FSK - right channel" msgstr "Pseudo-FSK sul canale audio destro" #: src/dialogs/confdialog.cxx:7860 #, fuzzy msgid "Create keyed square wave on right audio channel" msgstr "Crea un segnale a onda quadra sul canale audio destro" #: src/dialogs/confdialog.cxx:7867 #, fuzzy msgid "Synop" msgstr "Scope" #: src/dialogs/confdialog.cxx:7870 msgid "SYNOP to ADIF" msgstr "" #: src/dialogs/confdialog.cxx:7871 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" #: src/dialogs/confdialog.cxx:7877 msgid "SYNOP to KML" msgstr "" #: src/dialogs/confdialog.cxx:7878 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" #: src/dialogs/confdialog.cxx:7885 msgid "Interleave SYNOP and text" msgstr "" #: src/dialogs/confdialog.cxx:7886 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "" #: src/dialogs/confdialog.cxx:7898 msgid "Thor" msgstr "Thor" #: src/dialogs/confdialog.cxx:7918 msgid "Enable DSP prior to decoder" msgstr "Abilita il DSP prima del decodificatore" #: src/dialogs/confdialog.cxx:7960 msgid "Preamble Detection" msgstr "" #: src/dialogs/confdialog.cxx:7961 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" #: src/dialogs/confdialog.cxx:7966 msgid "Soft-symbol decoding" msgstr "" #: src/dialogs/confdialog.cxx:7967 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:7972 msgid "Soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:7973 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" #: src/dialogs/confdialog.cxx:8003 msgid "Navtex" msgstr "" #: src/dialogs/confdialog.cxx:8005 msgid "Log Navtex messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:8010 msgid "Log Navtex messages to KML" msgstr "" #: src/dialogs/confdialog.cxx:8011 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" #: src/dialogs/confdialog.cxx:8018 msgid "Wefax" msgstr "" #: src/dialogs/confdialog.cxx:8021 msgid "Embedded Wefax Gui" msgstr "" #: src/dialogs/confdialog.cxx:8022 msgid "" "Display tx and rx in main fldigi window.\n" "Change requires restart of fldigi" msgstr "" #: src/dialogs/confdialog.cxx:8027 msgid "Hide Transmission window" msgstr "" #: src/dialogs/confdialog.cxx:8028 msgid "Hide transmission window by default." msgstr "" #: src/dialogs/confdialog.cxx:8033 msgid "Log Wefax messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:8034 msgid "Sent and received faxes are logged to Adif file." msgstr "" #: src/dialogs/confdialog.cxx:8039 #, fuzzy msgid "Frequency shift (800 Hz)" msgstr "Frequenza in MHz" #: src/dialogs/confdialog.cxx:8040 src/dialogs/confdialog.cxx:8051 msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" msgstr "" #: src/dialogs/confdialog.cxx:8050 msgid "Rx fax max rows" msgstr "" #: src/dialogs/confdialog.cxx:8061 msgid "Fax images destination directory" msgstr "" #: src/dialogs/confdialog.cxx:8066 msgid "Directory..." msgstr "" #: src/dialogs/confdialog.cxx:8069 #, fuzzy msgid "Save image as monochrome file" msgstr "Salva file delle macro" #: src/dialogs/confdialog.cxx:8070 msgid "Save the fax image as a gray-level PNG file." msgstr "" #: src/dialogs/confdialog.cxx:8083 msgid "Rig" msgstr "Radio" #: src/dialogs/confdialog.cxx:8084 msgid "Transceiver control" msgstr "Controllo del ricetrasmettitore" #: src/dialogs/confdialog.cxx:8088 msgid "Hardware PTT" msgstr "PTT Hardware" #: src/dialogs/confdialog.cxx:8091 src/dialogs/confdialog.cxx:8926 msgid "PTT tone on right audio channel " msgstr "PTT genera un tono sul canale audio destro " #: src/dialogs/confdialog.cxx:8092 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Puó essere usato al posto o insieme ad altri tipi di PTT" #: src/dialogs/confdialog.cxx:8099 msgid "h/w ptt device-pin" msgstr "" "Porta e segnale usato \n" "per il PTT hardware" #: src/dialogs/confdialog.cxx:8102 msgid "Use separate serial port PTT" msgstr "Il PTT usa una porta seriale separata" #: src/dialogs/confdialog.cxx:8107 src/dialogs/confdialog.cxx:8204 #: src/dialogs/confdialog.cxx:8414 src/dialogs/confdialog.cxx:8668 #: src/dialogs/confdialog.cxx:8856 msgid "Device:" msgstr "Periferica:" #: src/dialogs/confdialog.cxx:8121 msgid "Use RTS" msgstr "Usa RTS" #: src/dialogs/confdialog.cxx:8122 msgid "RTS is PTT signal line" msgstr "RTS controlla il PTT" #: src/dialogs/confdialog.cxx:8126 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:8127 msgid "Initial voltage on RTS" msgstr "Tensione iniziale su RTS" #: src/dialogs/confdialog.cxx:8131 msgid "Use DTR" msgstr "Usa DTR" #: src/dialogs/confdialog.cxx:8132 msgid "DTR is PTT signal line" msgstr "DTR controlla il PTT" #: src/dialogs/confdialog.cxx:8136 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:8137 msgid "Initial voltage on DTR" msgstr "Tensione iniziale su DTR" #: src/dialogs/confdialog.cxx:8141 src/dialogs/confdialog.cxx:8305 #: src/dialogs/confdialog.cxx:8567 src/dialogs/confdialog.cxx:8642 #: src/dialogs/confdialog.cxx:9475 msgid "Initialize" msgstr "Inizializza" #: src/dialogs/confdialog.cxx:8142 msgid "Initialize the H/W PTT interface" msgstr "Inizializza l'interfaccia PTT hardware" #: src/dialogs/confdialog.cxx:8145 msgid "Use parallel port PTT" msgstr "Il PTT usa una porta parallela" #: src/dialogs/confdialog.cxx:8150 msgid "Use uHRouter PTT" msgstr "Il PTT usa uHRouter" #: src/dialogs/confdialog.cxx:8157 msgid "PTT delays valid for all CAT/PTT types" msgstr "" #: src/dialogs/confdialog.cxx:8160 msgid "Start of transmit PTT delay" msgstr "" #: src/dialogs/confdialog.cxx:8161 msgid "Delay NN msec before starting audio" msgstr "" #: src/dialogs/confdialog.cxx:8170 msgid "PTT end of transmit delay" msgstr "" #: src/dialogs/confdialog.cxx:8171 msgid "Delay NN msec before releasing PTT" msgstr "" #: src/dialogs/confdialog.cxx:8184 msgid "RigCAT" msgstr "RigCAT" #: src/dialogs/confdialog.cxx:8185 msgid "Rig Control using xml spec file" msgstr "Controlla la radio mediante un file di specifica xml" #: src/dialogs/confdialog.cxx:8187 msgid "Use RigCAT" msgstr "Usa RigCAT" #: src/dialogs/confdialog.cxx:8188 msgid "RigCAT used for rig control" msgstr "Usa RigCAT per controllare la radio" #: src/dialogs/confdialog.cxx:8194 msgid "Rig description file:" msgstr "File con la descrizione della radio" #: src/dialogs/confdialog.cxx:8195 msgid "Use Open to select descriptor file" msgstr "Usa Apri per selezionare il file con la descrizione" #: src/dialogs/confdialog.cxx:8201 msgid "Select rig descriptor file" msgstr "Seleziona il file con la descrizione della radio" #: src/dialogs/confdialog.cxx:8219 src/dialogs/confdialog.cxx:8429 msgid "Retries" msgstr "Tentativi" #: src/dialogs/confdialog.cxx:8220 msgid "# retries before giving up" msgstr "numero di tentativi prima di rinunciare" #: src/dialogs/confdialog.cxx:8236 src/dialogs/confdialog.cxx:8532 msgid "Retry interval (ms)" msgstr "Intervallo tra tentativi (ms)" #: src/dialogs/confdialog.cxx:8237 msgid "Time between retires in msec" msgstr "Tempo in ms tra i tentativi" #: src/dialogs/confdialog.cxx:8253 src/dialogs/confdialog.cxx:8463 msgid "Write delay (ms)" msgstr "Ritardo scrittura" #: src/dialogs/confdialog.cxx:8254 msgid "Wait for response to subsequent command" msgstr "" #: src/dialogs/confdialog.cxx:8270 src/dialogs/confdialog.cxx:8497 msgid "Baud rate:" msgstr "Baud rate:" #: src/dialogs/confdialog.cxx:8286 src/dialogs/confdialog.cxx:8513 msgid "Stopbits" msgstr "Bit d'arresto" #: src/dialogs/confdialog.cxx:8306 msgid "Initialize RigCAT interface" msgstr "Inizializza l'interfaccia RigCAT" #: src/dialogs/confdialog.cxx:8309 msgid "Commands are echoed" msgstr "I comandi sono visualizzati" #: src/dialogs/confdialog.cxx:8310 msgid "Rig or interface echos serial data" msgstr "La radio o l'interfaccia fa l'eco dei dati seriali" #: src/dialogs/confdialog.cxx:8315 msgid "CAT command for PTT" msgstr "Usa CAT per controllare il PTT" #: src/dialogs/confdialog.cxx:8316 msgid "PTT is a CAT command (not hardware)" msgstr "PTT è un comando CAT (non hardware)" #: src/dialogs/confdialog.cxx:8322 msgid "Toggle RTS for PTT" msgstr "Usa RTS per il PTT" #: src/dialogs/confdialog.cxx:8323 msgid "RTS is ptt line" msgstr "RTS controlla il PTT" #: src/dialogs/confdialog.cxx:8328 msgid "Toggle DTR for PTT" msgstr "Usa DTR per il PTT" #: src/dialogs/confdialog.cxx:8329 msgid "DTR is ptt line" msgstr "DTR controlla il PTT" #: src/dialogs/confdialog.cxx:8334 msgid "RTS +12 v" msgstr "RTS +12 v" #: src/dialogs/confdialog.cxx:8335 src/dialogs/confdialog.cxx:8599 msgid "Initial state of RTS" msgstr "Stato iniziale di RTS" #: src/dialogs/confdialog.cxx:8340 msgid "DTR +12 v" msgstr "DTR +12 v" #: src/dialogs/confdialog.cxx:8341 src/dialogs/confdialog.cxx:8593 msgid "Initial state of DTR" msgstr "Stato iniziale di DTR" #: src/dialogs/confdialog.cxx:8346 src/dialogs/confdialog.cxx:8604 msgid "RTS/CTS flow control" msgstr "Controllo di flusso RTS/CTS" #: src/dialogs/confdialog.cxx:8347 msgid "Rig uses RTS/CTS handshake" msgstr "La radio usa handshake RTS/CTS" #: src/dialogs/confdialog.cxx:8352 msgid "Restore Settings on Close" msgstr "" #: src/dialogs/confdialog.cxx:8353 msgid "Restore the serial (COM) port settings" msgstr "" #: src/dialogs/confdialog.cxx:8358 src/dialogs/confdialog.cxx:8617 msgid "Revert" msgstr "Inverti" #: src/dialogs/confdialog.cxx:8359 #, fuzzy msgid "Reset rigCAT interface" msgstr "Inizializza l'interfaccia RigCAT" #: src/dialogs/confdialog.cxx:8364 msgid "VSP Enable" msgstr "Abilita VSP" #: src/dialogs/confdialog.cxx:8365 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "Emulatore Virtuale di Porte Seriali - sopprimi gli allarmi" #: src/dialogs/confdialog.cxx:8370 #, fuzzy msgid "Init delay (ms)" msgstr "Ritardo scrittura" #: src/dialogs/confdialog.cxx:8371 msgid "Wait for response to first CAT command" msgstr "" #: src/dialogs/confdialog.cxx:8391 msgid "Hamlib" msgstr "Hamlib" #: src/dialogs/confdialog.cxx:8393 msgid "Use Hamlib" msgstr "Usa Hamlib" #: src/dialogs/confdialog.cxx:8394 msgid "Hamlib used for rig control" msgstr "Hamlib è usata per controllare la radio" #: src/dialogs/confdialog.cxx:8400 msgid "Rig:" msgstr "Radio:" #: src/dialogs/confdialog.cxx:8430 msgid "# times to resend command before giving up" msgstr "numero di volte che il comando è ripetuto prima di rinunciare" #: src/dialogs/confdialog.cxx:8446 msgid "Retry Interval (ms)" msgstr "Tempo tra tentativi (ms)" #: src/dialogs/confdialog.cxx:8447 src/dialogs/confdialog.cxx:8533 msgid "Msec's between retries" msgstr "Tempo in ms tra i tentativi" #: src/dialogs/confdialog.cxx:8464 msgid "Msec's between sequential commands" msgstr "Tempo in ms tra comandi successivi" #: src/dialogs/confdialog.cxx:8480 msgid "Post write delay (ms)" msgstr "Ritardo dopo un comando" #: src/dialogs/confdialog.cxx:8481 msgid "Wait interval (msecs) before reading response" msgstr "Attenti # ms prima di leggere la risposta" #: src/dialogs/confdialog.cxx:8552 msgid "Advanced configuration:" msgstr "Configurazione avanzata:" #: src/dialogs/confdialog.cxx:8553 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Configurazione opzionale\n" "in formato: param=val ..." #: src/dialogs/confdialog.cxx:8568 msgid "Initialize hamlib interface" msgstr "Inizializza l'interfaccia hamlib" #: src/dialogs/confdialog.cxx:8571 msgid "Sideband:" msgstr "Banda laterale:" #: src/dialogs/confdialog.cxx:8585 msgid "PTT via Hamlib command" msgstr "PTT via comando Hamlib" #: src/dialogs/confdialog.cxx:8586 msgid "PTT is a hamlib command" msgstr "PTT è un comando Hamlib" #: src/dialogs/confdialog.cxx:8592 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:8598 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:8605 msgid "Rig requires RTS/CTS flow control" msgstr "La radio richiede controllo di flusso RTS/CTS" #: src/dialogs/confdialog.cxx:8611 msgid "XON/XOFF flow control" msgstr "Controllo di flusso XON/XOFF" #: src/dialogs/confdialog.cxx:8612 msgid "Rig requires Xon/Xoff flow control" msgstr "La radio richiede controllo di flusso Xon/Xoff" #: src/dialogs/confdialog.cxx:8618 #, fuzzy msgid "Reset hamlib interface" msgstr "Inizializza l'interfaccia hamlib" #: src/dialogs/confdialog.cxx:8627 msgid "XML-RPC" msgstr "XML-RPC" #: src/dialogs/confdialog.cxx:8635 msgid "" "Rig control via external\n" "program using xmlrpc\n" "remote calls." msgstr "" "Controllo della radio tramite \n" "programma esterno che usa \n" "chiamate remote xmlrpc." #: src/dialogs/confdialog.cxx:8637 msgid "Use XML-RPC program" msgstr "Usa un programma XML-RPC" #: src/dialogs/confdialog.cxx:8638 msgid "Experimental" msgstr "Sperimentale" #: src/dialogs/confdialog.cxx:8643 msgid "Initialize XML-RPC rig control" msgstr "Inizializza il controllo della radio XML-RPC" #: src/dialogs/confdialog.cxx:8655 msgid "Audio devices" msgstr "Dispositivi audio" #: src/dialogs/confdialog.cxx:8659 msgid "Devices" msgstr "Dispositivi" #: src/dialogs/confdialog.cxx:8662 msgid "OSS" msgstr "OSS" #: src/dialogs/confdialog.cxx:8663 msgid "Use OSS audio server" msgstr "Usa un server audio OSS" #: src/dialogs/confdialog.cxx:8669 msgid "Select device" msgstr "Seleziona il dispositivo" #: src/dialogs/confdialog.cxx:8677 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:8678 msgid "Use Port Audio server" msgstr "Usa un server Port Audio" #: src/dialogs/confdialog.cxx:8683 msgid "Capture:" msgstr "Cattura:" #: src/dialogs/confdialog.cxx:8684 msgid "Audio input device" msgstr "Dispositivo audio d'ingresso" #: src/dialogs/confdialog.cxx:8688 msgid "Playback:" msgstr "Riproduzione:" #: src/dialogs/confdialog.cxx:8689 msgid "Audio output device" msgstr "Dispositivo audio d'uscita" #: src/dialogs/confdialog.cxx:8697 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:8698 msgid "Use Pulse Audio server" msgstr "Usa server Pulse Audio" #: src/dialogs/confdialog.cxx:8703 msgid "Server string:" msgstr "Nome del server" #: src/dialogs/confdialog.cxx:8704 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Lascia in bianco o vedi\n" "http://www.pulseaudio.org/wiki/ServerStrings" #: src/dialogs/confdialog.cxx:8722 msgid "File I/O only" msgstr "Solo I/O su file" #: src/dialogs/confdialog.cxx:8723 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "NESSUN DISPOSITIVO AUDIO DISPONIBILE (o test)" #: src/dialogs/confdialog.cxx:8732 msgid "Settings" msgstr "Impostazioni" #: src/dialogs/confdialog.cxx:8734 msgid "Sample rate" msgstr "Velocitá di campionamento" #: src/dialogs/confdialog.cxx:8737 msgid "Capture" msgstr "Cattura" #: src/dialogs/confdialog.cxx:8738 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" "Forza una velocitá di campionamento specifica. Scegli \"Nativo\"\n" "se \"Auto\" non funziona correttamente con la tua scheda audio." #: src/dialogs/confdialog.cxx:8770 msgid "Converter" msgstr "Conversione" #: src/dialogs/confdialog.cxx:8771 msgid "Set the type of resampler used of offset correction" msgstr "Scegli il tipo di ricampionatore usato per la correzione dell'offset" #: src/dialogs/confdialog.cxx:8787 msgid "Corrections" msgstr "Correzione" #: src/dialogs/confdialog.cxx:8790 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:8791 msgid "RX sound card correction" msgstr "Correzione della scheda audio in ricezione" #: src/dialogs/confdialog.cxx:8807 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:8808 msgid "TX sound card correction" msgstr "Correzione della scheda audio in trasmissione" #: src/dialogs/confdialog.cxx:8824 msgid "TX offset" msgstr "TX offset" #: src/dialogs/confdialog.cxx:8825 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Differenza tra la frequenza Rx e Tx (scostamento della radio)" #: src/dialogs/confdialog.cxx:8845 msgid "Mixer" msgstr "Mixer" #: src/dialogs/confdialog.cxx:8847 #, fuzzy msgid "OSS Mixer" msgstr "Mixer OSS" #: src/dialogs/confdialog.cxx:8850 msgid "Manage mixer" msgstr "Gestisci il mixer" #: src/dialogs/confdialog.cxx:8851 msgid "Add mixer controls to main dialog" msgstr "Aggiungi i controlli del mixer alla finestra principale" #: src/dialogs/confdialog.cxx:8857 msgid "Select Mixer device" msgstr "Seleziona il dispositivo mixer" #: src/dialogs/confdialog.cxx:8872 msgid "Mic In" msgstr "Mic In" #: src/dialogs/confdialog.cxx:8873 msgid "Use microphone input" msgstr "Usa l'ingresso microfono" #: src/dialogs/confdialog.cxx:8876 msgid "Line In" msgstr "Line In" #: src/dialogs/confdialog.cxx:8877 msgid "Use Line-In device" msgstr "Usa l'ingresso Line-In" #: src/dialogs/confdialog.cxx:8881 msgid "PCM" msgstr "PCM" #: src/dialogs/confdialog.cxx:8882 msgid "Set the sound card PCM level" msgstr "Imposta il livello PCM della scheda audio" #: src/dialogs/confdialog.cxx:8902 #, fuzzy msgid "Right channel" msgstr "Mostra canali" #: src/dialogs/confdialog.cxx:8904 #, fuzzy msgid "Mono audio output" msgstr "Dispositivo audio d'uscita" #: src/dialogs/confdialog.cxx:8905 msgid "Force output audio to single channel" msgstr "" #: src/dialogs/confdialog.cxx:8910 #, fuzzy msgid "Modem signal on left and right channels" msgstr "Genera un segnale a onda quadra sul canale audio destro" #: src/dialogs/confdialog.cxx:8911 msgid "Left and right channels both contain modem audio" msgstr "" #: src/dialogs/confdialog.cxx:8916 msgid "Reverse Left/Right channels" msgstr "" #: src/dialogs/confdialog.cxx:8917 #, fuzzy msgid "Software reversal of left-right audio channels" msgstr "QSK sul canale audio destro" #: src/dialogs/confdialog.cxx:8922 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" #: src/dialogs/confdialog.cxx:8927 #, fuzzy msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "Puó essere usato al posto o insieme ad altri tipi di PTT" #: src/dialogs/confdialog.cxx:8933 #, fuzzy msgid "CW QSK signal on right channel" msgstr "QSK sul canale audio destro" #: src/dialogs/confdialog.cxx:8934 #, fuzzy msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Genera un segnale a onda quadra sul canale audio destro" #: src/dialogs/confdialog.cxx:8939 msgid "Pseudo-FSK on right audio channel" msgstr "Pseudo-FSK sul canale audio destro" #: src/dialogs/confdialog.cxx:8940 #, fuzzy msgid "Create 1000 Hz square wave on right channel" msgstr "Crea un segnale a onda quadra sul canale audio destro" #: src/dialogs/confdialog.cxx:8949 msgid "Wav" msgstr "" #: src/dialogs/confdialog.cxx:8951 #, fuzzy msgid "Wav write sample rate" msgstr "Velocitá di campionamento" #: src/dialogs/confdialog.cxx:8952 msgid "Pick baud rate from list" msgstr "Seleziona una velocitá della porta dalla lista" #: src/dialogs/confdialog.cxx:8974 msgid "ID" msgstr "ID" #: src/dialogs/confdialog.cxx:8977 msgid "RsID" msgstr "" #: src/dialogs/confdialog.cxx:8978 msgid "Reed-Solomon ID (Rx)" msgstr "Reed-Solomon ID (Rx)" #: src/dialogs/confdialog.cxx:8981 #, fuzzy msgid "Notify only" msgstr "Solo notifiche" #: src/dialogs/confdialog.cxx:8982 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Scegli questo per essere notificato quando un RSID viene ricevuto\n" "senza cambiare modem o frequenza" #: src/dialogs/confdialog.cxx:8988 msgid "Receive modes" msgstr "Modi ricezione" #: src/dialogs/confdialog.cxx:8991 #, fuzzy msgid "Searches passband" msgstr "Decodifica in tutta la banda passante" #: src/dialogs/confdialog.cxx:8992 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to +/- 200 Hz" msgstr "" "ON - cerca su tutto il waterfall\n" "OFF - limita la ricerca a +/- 200 Hz" #: src/dialogs/confdialog.cxx:8997 #, fuzzy msgid "Mark prev freq/mode" msgstr "Marca la frequenza ed il modo precedente" #: src/dialogs/confdialog.cxx:8998 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" "Inserisci un marker nel testo ricevuto\n" "prima di cambiare frequenza e modem" #: src/dialogs/confdialog.cxx:9003 #, fuzzy msgid "Disables detector" msgstr "La ricezione disabilita il decodificatore" #: src/dialogs/confdialog.cxx:9004 msgid "Disable further detection when RSID is received" msgstr "Disabilita ulteriori decodifiche quando viene ricevuto un RSID" #: src/dialogs/confdialog.cxx:9011 msgid "Allow errors" msgstr "" #: src/dialogs/confdialog.cxx:9012 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" #: src/dialogs/confdialog.cxx:9023 msgid "Medium" msgstr "" #: src/dialogs/confdialog.cxx:9028 msgid "Squelch open (sec)" msgstr "Apri squelch (sec)" #: src/dialogs/confdialog.cxx:9029 msgid "Open squelch for nn sec if RSID detected" msgstr "Apri lo squelch per nn sec se viene decodificato un RSID" #: src/dialogs/confdialog.cxx:9047 #, fuzzy msgid "Disable alert dialog" msgstr "Disabilita tutto" #: src/dialogs/confdialog.cxx:9048 msgid "Do not show RsID alert dialog box" msgstr "" #: src/dialogs/confdialog.cxx:9053 msgid "Retain tx freq lock" msgstr "" #: src/dialogs/confdialog.cxx:9054 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:9059 #, fuzzy msgid "Disable freq change" msgstr "Disabilita tutto" #: src/dialogs/confdialog.cxx:9060 msgid "Do not automatically change to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:9065 msgid "" "The RsID notification message contents and \n" "display characteristics are configured on the\n" "\"Notifications\" configure dialog." msgstr "" #: src/dialogs/confdialog.cxx:9073 msgid "Pre-Signal Tone" msgstr "Tono prima del segnale" #: src/dialogs/confdialog.cxx:9076 msgid "Seconds" msgstr "Secondi" #: src/dialogs/confdialog.cxx:9077 msgid "Use for triggering amplifier carrier detect" msgstr "Usalo per permettere a un amplificatore di accorgersi del segnale" #: src/dialogs/confdialog.cxx:9085 msgid "Reed-Solomon ID (Tx)" msgstr "Reed-Solomon ID (Tx)" #: src/dialogs/confdialog.cxx:9088 msgid "Transmit modes" msgstr "Modi di trasmissione" #: src/dialogs/confdialog.cxx:9091 msgid "End of xmt ID" msgstr "" #: src/dialogs/confdialog.cxx:9092 #, fuzzy msgid "Add RsID signal to end of transmission" msgstr "Trasmetti il nominativo in CW alla fine di ogni trasmissione" #: src/dialogs/confdialog.cxx:9101 msgid "Video" msgstr "" #: src/dialogs/confdialog.cxx:9103 msgid "Video Preamble ID" msgstr "Preambolo identificativo visuale" #: src/dialogs/confdialog.cxx:9106 msgid "Transmit mode ID" msgstr "Trasmetti ID del modo" #: src/dialogs/confdialog.cxx:9107 msgid "Waterfall video ID" msgstr "Identificazione video del modo mostrata sul waterfall" #: src/dialogs/confdialog.cxx:9111 msgid "Transmit video text" msgstr "Trasmetti testo video" #: src/dialogs/confdialog.cxx:9112 msgid "Waterfall video text" msgstr "Testo visualizzato sul waterfall" #: src/dialogs/confdialog.cxx:9117 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:9118 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" "Limita a pochi caratteri,\n" "come CQEM o IOTA ecc." #: src/dialogs/confdialog.cxx:9132 msgid "Use small font" msgstr "Usa caratteri piccoli" #: src/dialogs/confdialog.cxx:9133 msgid "" "ON - small font\n" "OFF - large font" msgstr "" "ON - caratteri piccoli\n" "OFF - caratteri grandi" #: src/dialogs/confdialog.cxx:9139 msgid "Chars/Row:" msgstr "Caratteri/Riga:" #: src/dialogs/confdialog.cxx:9140 msgid "Set the number of characters per row" msgstr "Imposta il numero di caratteri per riga" #: src/dialogs/confdialog.cxx:9160 msgid "500 Hz limit" msgstr "Limite a 500 Hz" #: src/dialogs/confdialog.cxx:9165 msgid "Mode width limit" msgstr "" "Limite secondo la \n" "larghezza del modo" #: src/dialogs/confdialog.cxx:9170 msgid "Video ID modes" msgstr "Modi ID video" #: src/dialogs/confdialog.cxx:9179 msgid "CW Postamble ID" msgstr "ID CW a fine trasmissione" #: src/dialogs/confdialog.cxx:9182 msgid "Transmit callsign" msgstr "Trasmetti il nominativo" #: src/dialogs/confdialog.cxx:9183 msgid "Send Callsign in CW at end of every transmission" msgstr "Trasmetti il nominativo in CW alla fine di ogni trasmissione" #: src/dialogs/confdialog.cxx:9188 msgid "Speed (WPM):" msgstr "Velocità (WPM):" #: src/dialogs/confdialog.cxx:9189 msgid "Send at this WPM" msgstr "Invia a questa velocità WPM" #: src/dialogs/confdialog.cxx:9209 msgid "CW ID modes" msgstr "Modi ID CW" #: src/dialogs/confdialog.cxx:9224 msgid "CPU" msgstr "CPU" #: src/dialogs/confdialog.cxx:9228 msgid "Slow CPU (less than 700MHz)" msgstr "CPU lente (meno di 700 MHz)" #: src/dialogs/confdialog.cxx:9229 msgid "Enable if you're computer does not decode properly" msgstr "Abilita se il tuo computer non decodifica correttamente" #: src/dialogs/confdialog.cxx:9238 msgid "NBEMS" msgstr "NBEMS" #: src/dialogs/confdialog.cxx:9240 msgid "NBEMS data file interface" msgstr "interfaccia per file di dati NBEMS" #: src/dialogs/confdialog.cxx:9243 msgid "Enable" msgstr "Abilita" #: src/dialogs/confdialog.cxx:9244 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "Estrai i file per l'uso con il programma esterno \"wrap / flmsg\"" #: src/dialogs/confdialog.cxx:9249 msgid "Open message folder" msgstr "Apri file dei messaggi" #: src/dialogs/confdialog.cxx:9250 msgid "Opens NBEMS file folder upon successful capture" msgstr "Apri la cartella dei file NBEMS dopo una cattura riuscita" #: src/dialogs/confdialog.cxx:9257 #, fuzzy msgid "Reception of flmsg files" msgstr "Ricezione file flmsg" #: src/dialogs/confdialog.cxx:9260 msgid "Open with flmsg" msgstr "Apri con flmsg" #: src/dialogs/confdialog.cxx:9261 msgid "Open message with flmsg" msgstr "Apri il messaggio con flmsg" #: src/dialogs/confdialog.cxx:9266 msgid "Open in browser" msgstr "Apri col browser" #: src/dialogs/confdialog.cxx:9267 msgid "Open file with default browser" msgstr "Apri il file con il browser di sistema" #: src/dialogs/confdialog.cxx:9272 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:9273 msgid "Enter full path-filename for flmsg" msgstr "Inserisci il percorso completo a flmsg" #: src/dialogs/confdialog.cxx:9286 msgid "Locate flmsg" msgstr "Trova flmsg" #: src/dialogs/confdialog.cxx:9290 #, fuzzy msgid "Timeout (secs)" msgstr "Tempo (s):" #: src/dialogs/confdialog.cxx:9291 #, fuzzy msgid "Extract times out after NN seconds of inactivity." msgstr "" "Cancella il testo del canale dopo\n" "# secondi di inattività" #: src/dialogs/confdialog.cxx:9308 msgid "Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:9311 msgid "Mail Server Attributes" msgstr "Attributi del mail server" #: src/dialogs/confdialog.cxx:9314 msgid "Carrier frequency (Hz)" msgstr "Frequenza portante (Hz)" #: src/dialogs/confdialog.cxx:9315 msgid "Default listen / transmit frequency" msgstr "Frequenza predefinita di ascolto / trasmissione" #: src/dialogs/confdialog.cxx:9334 msgid "Search range (Hz)" msgstr "Area di ricerca (Hz)" #: src/dialogs/confdialog.cxx:9335 msgid "Listen for signals within this range" msgstr "Cerca segnali all'interno di questa area" #: src/dialogs/confdialog.cxx:9374 msgid "AFC range (Hz)" msgstr "Area AFC (Hz)" #: src/dialogs/confdialog.cxx:9375 msgid "Limit AFC movement to this range" msgstr "Limita i movimenti AFC a questa area" #: src/dialogs/confdialog.cxx:9394 msgid "Reset to Carrier" msgstr "Reimposta alla portante" #: src/dialogs/confdialog.cxx:9395 msgid "When no signal present" msgstr "Quando non ci sono segnali" #: src/dialogs/confdialog.cxx:9406 msgid "Report ARQ frames average S/N" msgstr "Riporta il S/N medio dei frame ARQ" #: src/dialogs/confdialog.cxx:9415 msgid "Spotting" msgstr "Spotting" #: src/dialogs/confdialog.cxx:9417 msgid "PSK Reporter" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:9420 msgid "Automatically spot callsigns in decoded text" msgstr "Invia automaticamente lo spot per i nominativi nel testo decodificato" #: src/dialogs/confdialog.cxx:9421 msgid "Parse all incoming text" msgstr "Analizza tutto il testo ricevuto" #: src/dialogs/confdialog.cxx:9426 msgid "Send reception report when logging a QSO" msgstr "Invia il rapporto di ricezione quando metti un QSO a log" #: src/dialogs/confdialog.cxx:9427 msgid "Send report only when QSO is logged" msgstr "Invia il rapporto solo quando il QSO è messo a log" #: src/dialogs/confdialog.cxx:9432 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "" "Comunica la frequenza della radio (abilita solo se hai il controllo " "automatico)" #: src/dialogs/confdialog.cxx:9433 msgid "Include the transmit frequency" msgstr "Includi la frequenza di trasmissione" #: src/dialogs/confdialog.cxx:9438 #, fuzzy msgid "Disable spotting when signal browser(s) are not visible." msgstr "Disabilita su CPU molto lente o se il navigatore non è usato" #: src/dialogs/confdialog.cxx:9439 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "" #: src/dialogs/confdialog.cxx:9445 msgid "Host:" msgstr "Host:" #: src/dialogs/confdialog.cxx:9446 msgid "To whom the connection is made" msgstr "Verso chi fare la connessione" #: src/dialogs/confdialog.cxx:9461 msgid "Using UDP port #" msgstr "Usa la porta UDP #" #: src/dialogs/confdialog.cxx:9476 msgid "Initialize the socket client" msgstr "Inizializza la connessione al server" #: src/dialogs/confdialog.cxx:9479 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:9487 msgid "Sweet Spot" msgstr "Frequenza preferita" #: src/dialogs/confdialog.cxx:9493 msgid "Default CW tracking point" msgstr "Frequenza preferita per la decodifica CW" #: src/dialogs/confdialog.cxx:9512 msgid "Default RTTY tracking point" msgstr "Frequenza preferita per la decodifica RTTY" #: src/dialogs/confdialog.cxx:9530 msgid "PSK et al." msgstr "PSK et al." #: src/dialogs/confdialog.cxx:9531 msgid "Default for all other modems" msgstr "Frequenza preferita per tutti gli altri modem" #: src/dialogs/confdialog.cxx:9549 msgid "Always start new modems at these frequencies" msgstr "Avvia sempre i nuovi modem su queste frequenze" #: src/dialogs/confdialog.cxx:9550 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "ON - avvia alla frequenza predefinita\n" "OFF - mantieni la posizione attuale del cursore sul waterfall" #: src/dialogs/confdialog.cxx:9558 msgid "K3 A1A configuation" msgstr "Configurazione A1A per K3" #: src/dialogs/confdialog.cxx:9561 msgid "CW is LSB" msgstr "CW è LSB" #: src/dialogs/confdialog.cxx:9562 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Attiva la selezione per Elecraft K3\n" "Altre radio non dovrebbero averne bisogno." #: src/dialogs/confdialog.cxx:9571 msgid "Text i/o" msgstr "Testo" #: src/dialogs/confdialog.cxx:9573 msgid "Talker Socket (MS only)" msgstr "Talker Socket (MS only)" #: src/dialogs/confdialog.cxx:9576 msgid "Talker" msgstr "Talker" #: src/dialogs/confdialog.cxx:9580 msgid "Connect/disconnect to Talker socket server" msgstr "Connetti/disconnetti il socket del server Talker" #: src/dialogs/confdialog.cxx:9583 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" "Connetti automaticamente all'avvio di fldigi (il server deve essere attivo)" #: src/dialogs/confdialog.cxx:9590 msgid "Capture rx text to external file" msgstr "Cattura il testo ricevuto su file esterno" #: src/dialogs/confdialog.cxx:9593 msgid "Enable rx text stream" msgstr "Abilita il flusso del testo ricevuto" #: src/dialogs/confdialog.cxx:9594 msgid "Send rx text to file: textout.txt" msgstr "Invia il testo ricevuto al file: textout.txt" #: src/dialogs/confdialog.cxx:9603 msgid "DTMF" msgstr "" #: src/dialogs/confdialog.cxx:9605 msgid "Decode DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:9606 msgid "Decode received DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:9613 msgid "WX" msgstr "" #: src/dialogs/confdialog.cxx:9615 msgid "Weather query specification" msgstr "" #: src/dialogs/confdialog.cxx:9618 msgid "METAR station ID code" msgstr "" #: src/dialogs/confdialog.cxx:9619 msgid "" "for example KMDQ for \n" "Huntsville-Madison Executive Airport, AL" msgstr "" #: src/dialogs/confdialog.cxx:9624 #, fuzzy msgid "Full report" msgstr "rapporto" #: src/dialogs/confdialog.cxx:9625 #, fuzzy msgid "Insert full METAR report" msgstr "Inserisci testo predefinito" #: src/dialogs/confdialog.cxx:9630 #, fuzzy msgid "End of header string:" msgstr "Nome del server" #: src/dialogs/confdialog.cxx:9631 msgid "" "Text defining end of METAR header\n" "Typically 'Connection: close'\n" "Used to search for station name" msgstr "" #: src/dialogs/confdialog.cxx:9637 msgid "METAR station location" msgstr "" #: src/dialogs/confdialog.cxx:9638 msgid "Add geopolitical name of METAR station" msgstr "" #: src/dialogs/confdialog.cxx:9643 #, fuzzy msgid "Conditions" msgstr "Opzioni da riga di comando" #: src/dialogs/confdialog.cxx:9644 msgid "current wx conditions" msgstr "" #: src/dialogs/confdialog.cxx:9649 msgid "Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:9650 msgid "report Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:9655 msgid "Celsius" msgstr "" #: src/dialogs/confdialog.cxx:9656 #, fuzzy msgid "report Celsius" msgstr "rapporti" #: src/dialogs/confdialog.cxx:9661 msgid "Miles / Hour" msgstr "" #: src/dialogs/confdialog.cxx:9662 msgid "report miles per hour" msgstr "" #: src/dialogs/confdialog.cxx:9667 msgid "kilometers / hour" msgstr "" #: src/dialogs/confdialog.cxx:9668 msgid "report kilometers per hour" msgstr "" #: src/dialogs/confdialog.cxx:9673 msgid "Inches Mg." msgstr "" #: src/dialogs/confdialog.cxx:9674 msgid "report inches mercury" msgstr "" #: src/dialogs/confdialog.cxx:9679 msgid "mbars" msgstr "" #: src/dialogs/confdialog.cxx:9680 #, fuzzy msgid "report millibars" msgstr "rapporti" #: src/dialogs/confdialog.cxx:9685 #, fuzzy msgid "Temperature" msgstr "Genera TX" #: src/dialogs/confdialog.cxx:9688 msgid "Wind speed/dir" msgstr "" #: src/dialogs/confdialog.cxx:9691 msgid "Barometric pressure" msgstr "" #: src/dialogs/confdialog.cxx:9694 msgid "Search on web" msgstr "" #: src/dialogs/confdialog.cxx:9701 msgid "KML" msgstr "" #: src/dialogs/confdialog.cxx:9703 msgid "KML files directory" msgstr "" #: src/dialogs/confdialog.cxx:9704 msgid "Where generated KML documents are stored." msgstr "" #: src/dialogs/confdialog.cxx:9709 msgid "KML root file" msgstr "" #: src/dialogs/confdialog.cxx:9713 msgid "Minimum distance for splitting aliases (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:9714 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:9724 msgid "Data retention time, in hours (0 for no limit)" msgstr "" #: src/dialogs/confdialog.cxx:9725 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" #: src/dialogs/confdialog.cxx:9734 #, fuzzy msgid "KML refresh interval (seconds)" msgstr "Intervallo tra tentativi (ms)" #: src/dialogs/confdialog.cxx:9735 msgid "Refresh time interval written in KML file (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:9751 msgid "KML balloon display style" msgstr "" #: src/dialogs/confdialog.cxx:9752 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" #: src/dialogs/confdialog.cxx:9767 #, fuzzy msgid "Command run on KML creation" msgstr "Opzioni da riga di comando" #: src/dialogs/confdialog.cxx:9768 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" #: src/dialogs/confdialog.cxx:9774 #, fuzzy msgid "Test command" msgstr "Carattere di prova" #: src/dialogs/confdialog.cxx:9775 msgid "Execute command on KML files." msgstr "" #: src/dialogs/confdialog.cxx:9778 #, fuzzy msgid "Change dir..." msgstr "Cambia colore" #: src/dialogs/confdialog.cxx:9779 msgid "Choose directory to store KML documents" msgstr "" #: src/dialogs/confdialog.cxx:9782 msgid "Cleanup KML data now !" msgstr "" #: src/dialogs/confdialog.cxx:9783 msgid "Cleanups KML documents, empties Google Earth display." msgstr "" #: src/dialogs/confdialog.cxx:9786 #, fuzzy msgid "Cleanup on startup" msgstr "Cancella i campi quando salvi" #: src/dialogs/confdialog.cxx:9787 msgid "Empties KML documents when starting program." msgstr "" #: src/dialogs/confdialog.cxx:9798 msgid "Web" msgstr "" #: src/dialogs/confdialog.cxx:9799 msgid "Callsign database" msgstr "Database nominativi" #: src/dialogs/confdialog.cxx:9802 msgid "Call Lookup" msgstr "" #: src/dialogs/confdialog.cxx:9803 msgid "Web Browser lookup" msgstr "" #: src/dialogs/confdialog.cxx:9807 #, fuzzy msgid "Do not use callsign lookup via web browser" msgstr "Non usare un database di nominativi" #: src/dialogs/confdialog.cxx:9813 msgid "QRZ online via default Internet Browser" msgstr "Accesso online a QRZ tramite il browser predefinito" #: src/dialogs/confdialog.cxx:9814 msgid "Visit QRZ web site" msgstr "Visita il sito web di QRZ" #: src/dialogs/confdialog.cxx:9819 msgid "HamCall online via default Internet Browser" msgstr "Accesso online a Hamcall tramite browser predefinito" #: src/dialogs/confdialog.cxx:9820 src/dialogs/confdialog.cxx:9868 msgid "Visit Hamcall web site" msgstr "Visita il sito web Hamcall" #: src/dialogs/confdialog.cxx:9825 #, fuzzy msgid "HamQTH via default Internet Browser" msgstr "Accesso online a Hamcall tramite browser predefinito" #: src/dialogs/confdialog.cxx:9826 #, fuzzy msgid "Visit hamQTH web site" msgstr "Visita il sito web di QRZ" #: src/dialogs/confdialog.cxx:9833 msgid "Data base lookup" msgstr "" #: src/dialogs/confdialog.cxx:9837 msgid "Do not use callsign database" msgstr "Non usare un database di nominativi" #: src/dialogs/confdialog.cxx:9843 msgid "QRZ cdrom" msgstr "" #: src/dialogs/confdialog.cxx:9844 msgid "Use CD or hard drive CD image" msgstr "Usa un CD o un'immagine su HD" #: src/dialogs/confdialog.cxx:9849 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:9850 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "È necessario un abbonamento a pagamento\n" "per l'accesso online a QRZ" #: src/dialogs/confdialog.cxx:9855 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:9856 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "È necessario un abbonamento a pagamento\n" "per l'accesso online a Hamcall" #: src/dialogs/confdialog.cxx:9861 msgid "HamQTH.com (free service http://www.hamqth.com)" msgstr "" #: src/dialogs/confdialog.cxx:9862 msgid "Free service courtesy of OK" msgstr "" #: src/dialogs/confdialog.cxx:9867 #, fuzzy msgid "Callook.info lookup (free service US callsigns only)" msgstr "Consulta Callbook.info (solo nominativi USA)" #: src/dialogs/confdialog.cxx:9873 msgid "at:" msgstr "a:" #: src/dialogs/confdialog.cxx:9874 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "es: /home/dave/CALLBK/ or C:/CALLBK/\n" "Lascia in bianco per cercare un database" #: src/dialogs/confdialog.cxx:9888 msgid "User name" msgstr "Utente" #: src/dialogs/confdialog.cxx:9889 src/dialogs/confdialog.cxx:9935 #: src/dialogs/confdialog.cxx:9970 msgid "Your login name" msgstr "Il tuo nome utente per l'accesso" #: src/dialogs/confdialog.cxx:9903 src/dialogs/confdialog.cxx:9949 msgid "Password" msgstr "Password" #: src/dialogs/confdialog.cxx:9904 src/dialogs/confdialog.cxx:9950 msgid "Your login password" msgstr "La tua password d'accesso" #: src/dialogs/confdialog.cxx:9919 src/dialogs/confdialog.cxx:9965 msgid "Show" msgstr "Mostra" #: src/dialogs/confdialog.cxx:9920 src/dialogs/confdialog.cxx:9966 msgid "Show password in plain text" msgstr "Mostra la password in chiaro" #: src/dialogs/confdialog.cxx:9923 msgid "Add address to notes field" msgstr "" #: src/dialogs/confdialog.cxx:9932 #, fuzzy msgid "eQSL" msgstr "utente eQSL" #: src/dialogs/confdialog.cxx:9934 #, fuzzy msgid "User ID" msgstr "Utente" #: src/dialogs/confdialog.cxx:9969 msgid "QTH Nickname" msgstr "" #: src/dialogs/confdialog.cxx:9984 #, fuzzy msgid "Options" msgstr "Azione" #: src/dialogs/confdialog.cxx:9987 msgid "send when logged (log button, , )" msgstr "" #: src/dialogs/confdialog.cxx:9988 msgid "automatic data upload" msgstr "" #: src/dialogs/confdialog.cxx:9993 #, fuzzy msgid "Default message" msgstr "Predefiniti" #: src/dialogs/confdialog.cxx:9994 msgid "default text to send with etc" msgstr "" #: src/dialogs/confdialog.cxx:10008 msgid "Text Tags (tags use {} delimiters)" msgstr "" #: src/dialogs/confdialog.cxx:10011 #, fuzzy msgid " {CALL} other ops call sign" msgstr "\tnominativo del corrispondente" #: src/dialogs/confdialog.cxx:10014 msgid " {MODE} full mode / submode" msgstr "" #: src/dialogs/confdialog.cxx:10017 #, fuzzy msgid "{NAME} other ops name" msgstr "\tnome del corrispondente" #: src/dialogs/confdialog.cxx:10020 msgid "These tags can also be used in " msgstr "" #: src/dialogs/confdialog.cxx:10024 msgid "Use date/time off for log entry" msgstr "" #: src/dialogs/confdialog.cxx:10025 msgid "default uses date/time on" msgstr "" #: src/dialogs/confdialog.cxx:10043 msgid "Auto start programs with fldigi" msgstr "" #: src/dialogs/confdialog.cxx:10046 msgid "flrig:" msgstr "" #: src/dialogs/confdialog.cxx:10047 src/dialogs/confdialog.cxx:10065 #: src/dialogs/confdialog.cxx:10083 src/dialogs/confdialog.cxx:10101 #: src/dialogs/confdialog.cxx:10119 src/dialogs/confdialog.cxx:10137 #: src/dialogs/confdialog.cxx:10155 #, fuzzy msgid "" "Enter full path-filename for external program\n" "Or simple name of program" msgstr "Inserisci il percorso completo a flmsg" #: src/dialogs/confdialog.cxx:10060 src/dialogs/confdialog.cxx:10078 #: src/dialogs/confdialog.cxx:10096 src/dialogs/confdialog.cxx:10114 #: src/dialogs/confdialog.cxx:10132 src/dialogs/confdialog.cxx:10150 #: src/dialogs/confdialog.cxx:10168 #, fuzzy msgid "Locate" msgstr "Locator" #: src/dialogs/confdialog.cxx:10061 #, fuzzy msgid "Locate flrig executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:10064 msgid "flamp:" msgstr "" #: src/dialogs/confdialog.cxx:10079 #, fuzzy msgid "Locate flamp executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:10082 msgid "flnet:" msgstr "" #: src/dialogs/confdialog.cxx:10097 #, fuzzy msgid "Locate flnet executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:10100 msgid "fllog:" msgstr "" #: src/dialogs/confdialog.cxx:10115 #, fuzzy msgid "Locate fllog executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:10118 msgid "Prog 1:" msgstr "" #: src/dialogs/confdialog.cxx:10133 #, fuzzy msgid "Locate program #1 executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:10136 msgid "Prog 2:" msgstr "" #: src/dialogs/confdialog.cxx:10151 #, fuzzy msgid "Locate program #2 executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:10154 msgid "Prog 3:" msgstr "" #: src/dialogs/confdialog.cxx:10169 #, fuzzy msgid "Locate program #3 executable" msgstr "Trova l'eseguibile di flmsg" #: src/dialogs/confdialog.cxx:10172 #, fuzzy msgid "" "Enable\n" "-" msgstr "Abilita" #: src/dialogs/confdialog.cxx:10173 src/dialogs/confdialog.cxx:10180 #: src/dialogs/confdialog.cxx:10186 src/dialogs/confdialog.cxx:10192 #: src/dialogs/confdialog.cxx:10198 src/dialogs/confdialog.cxx:10204 #: src/dialogs/confdialog.cxx:10210 msgid "Enable this entry when fldigi first starts" msgstr "" #: src/dialogs/confdialog.cxx:10215 src/dialogs/confdialog.cxx:10219 #: src/dialogs/confdialog.cxx:10223 src/dialogs/confdialog.cxx:10227 #: src/dialogs/confdialog.cxx:10231 src/dialogs/confdialog.cxx:10235 #: src/dialogs/confdialog.cxx:10239 #, fuzzy msgid "Test" msgstr "Test..." #: src/dialogs/confdialog.cxx:10216 #, fuzzy msgid "Start flrig" msgstr "Parti da" #: src/dialogs/confdialog.cxx:10220 #, fuzzy msgid "Start flamp" msgstr "Parti da" #: src/dialogs/confdialog.cxx:10224 #, fuzzy msgid "Start flnet" msgstr "Parti da" #: src/dialogs/confdialog.cxx:10228 #, fuzzy msgid "Start fllog" msgstr "Parti da" #: src/dialogs/confdialog.cxx:10232 #, fuzzy msgid "Start prog1" msgstr "Parti da" #: src/dialogs/confdialog.cxx:10236 #, fuzzy msgid "Start prog2" msgstr "Parti da" #: src/dialogs/confdialog.cxx:10240 #, fuzzy msgid "Start prog3" msgstr "Parti da" #: src/dialogs/confdialog.cxx:10255 msgid "Restore defaults" msgstr "Ripristina predefiniti" #: src/dialogs/font_browser.cxx:47 msgid "Font color" msgstr "Colori dei caratteri" #: src/dialogs/font_browser.cxx:118 msgid "Font:" msgstr "Caratteri:" #: src/dialogs/font_browser.cxx:123 msgid "Size:" msgstr "Dimensione:" #: src/dialogs/font_browser.cxx:133 msgid "&OK" msgstr "&OK" #: src/dialogs/font_browser.cxx:147 msgid "" "That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" msgstr "" "Pàstene soppaltate secondo l'articolo 12, abbia pazienza, sennò posterdati, " "per due, anche un pochino antani in prefettura...\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #: src/dialogs/font_browser.cxx:283 msgid "Reading fonts..." msgstr "Sto caricando i caratteri..." #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 #, fuzzy msgid "Data files sources" msgstr "File NBEMS..." #: src/dialogs/record_browse.cxx:27 #, fuzzy msgid "Data files update" msgstr "File NBEMS..." #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "" #: src/dialogs/record_browse.cxx:43 #, fuzzy msgid "Data source" msgstr "Origine dei log" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Evento" #: src/dialogs/notifydialog.cxx:112 msgid "RE:" msgstr "RE:" #: src/dialogs/notifydialog.cxx:124 msgid "Enabled" msgstr "Abilitato" #: src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filtro" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "Entità DXCC" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Mostra le entità DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "Non lavorato in precedenza" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "Utente LoTW" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "utente eQSL" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Duplicati" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Ignora duplicati" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "in:" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Tempo (s):" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Azione" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "Limite attivazione (s)" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Tempo minimo tra eventi" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Mostra la finestra di avviso:" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Inserisci testo predefinito" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Nascondi la finestra dopo (s):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "Aggiungi al testo ricevuto:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "Aggiungi al testo trasmesso:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Mostra l'editor delle macro" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Esegui programma:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "Entità DXCC" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Trova il paese:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Premi invio per continuare la ricerca" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Trova il prefisso:" #: src/logbook/lgbook.cxx:397 msgid "Export Setup" msgstr "Configurazione per l'export" #: src/logbook/lgbook.cxx:398 src/logbook/lgbook.cxx:1040 msgid "Select Records to Export" msgstr "Seleziona i record da esportare" #: src/logbook/lgbook.cxx:406 src/logbook/lgbook.cxx:456 #: src/logbook/lgbook.cxx:1048 src/logbook/lgbook.cxx:1122 msgid "Check All" msgstr "Seleziona tutto" #: src/logbook/lgbook.cxx:409 #, fuzzy msgid "Start Date" msgstr "Parti da" #: src/logbook/lgbook.cxx:410 msgid "Start date for export" msgstr "" #: src/logbook/lgbook.cxx:423 #, fuzzy msgid "Stop Date" msgstr "Data QSO" #: src/logbook/lgbook.cxx:424 msgid "Inclusive stop date for export" msgstr "" #: src/logbook/lgbook.cxx:437 #, fuzzy msgid "select by date" msgstr "Seleziona la radio per nome" #: src/logbook/lgbook.cxx:438 msgid "Enable to select date range" msgstr "" #: src/logbook/lgbook.cxx:450 msgid "Select Fields to Export" msgstr "Seleziona i campi da esportare" #: src/logbook/lgbook.cxx:478 msgid "QSO Date On" msgstr "Data inizio QSO" #: src/logbook/lgbook.cxx:482 msgid "QSO Date Off" msgstr "Data fine QSO" #: src/logbook/lgbook.cxx:486 msgid "Time ON" msgstr "Ora ON" #: src/logbook/lgbook.cxx:490 src/logbook/lgbook.cxx:1091 msgid "Time OFF" msgstr "Ora OFF" #: src/logbook/lgbook.cxx:494 msgid "TX Power" msgstr "Potenza TX" #: src/logbook/lgbook.cxx:497 src/logbook/lgbook.cxx:1095 msgid "RST sent" msgstr "RST inv." #: src/logbook/lgbook.cxx:501 src/logbook/lgbook.cxx:1099 msgid "RST rcvd" msgstr "RST ric." #: src/logbook/lgbook.cxx:505 src/logbook/lgbook.cxx:731 msgid "Qth" msgstr "QTH" #: src/logbook/lgbook.cxx:508 msgid "LOC" msgstr "Loc" #: src/logbook/lgbook.cxx:515 src/logbook/lgbook.cxx:876 msgid "QSL-VIA" msgstr "" #: src/logbook/lgbook.cxx:527 msgid "QSL rcvd date" msgstr "QSL ricevuta il" #: src/logbook/lgbook.cxx:530 msgid "QSL sent date" msgstr "QSL inviata il" #: src/logbook/lgbook.cxx:533 src/logbook/lgbook.cxx:1103 msgid "Serial # in" msgstr "Seriale ricevuto" #: src/logbook/lgbook.cxx:536 src/logbook/lgbook.cxx:1107 msgid "Serial # out" msgstr "Seriale trasmesso" #: src/logbook/lgbook.cxx:545 src/logbook/lgbook.cxx:804 #: src/logbook/lgbook.cxx:805 #, fuzzy msgid "County" msgstr "Paese" #: src/logbook/lgbook.cxx:551 src/logbook/lgbook.cxx:828 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:554 src/logbook/lgbook.cxx:864 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:557 src/logbook/lgbook.cxx:816 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:560 src/logbook/lgbook.cxx:840 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:570 msgid "Logbook" msgstr "Log" #: src/logbook/lgbook.cxx:571 #, fuzzy msgid "Date On" msgstr "Data inizio QSO" #: src/logbook/lgbook.cxx:572 msgid "Date QSO started" msgstr "Data di inizio del QSO" #: src/logbook/lgbook.cxx:585 msgid "Time QSO started" msgstr "Ora inizio QSO" #: src/logbook/lgbook.cxx:597 msgid "Call sign worked" msgstr "Nominativo collegato" #: src/logbook/lgbook.cxx:609 msgid "Operator worked" msgstr "Operatore collegato" #: src/logbook/lgbook.cxx:621 msgid "Rst received" msgstr "RST ricevuto" #: src/logbook/lgbook.cxx:632 msgid "QSL-rcvd" msgstr "QSL-ric" #: src/logbook/lgbook.cxx:633 msgid "QSL received on this date" msgstr "QSL ricevuta il" #: src/logbook/lgbook.cxx:645 #, fuzzy msgid "Date Off" msgstr "Data fine QSO" #: src/logbook/lgbook.cxx:646 msgid "Date QSO Ended" msgstr "Data di fine del QSO" #: src/logbook/lgbook.cxx:659 msgid "Time QSO ended" msgstr "Ora di fine del QSO" #: src/logbook/lgbook.cxx:670 msgid "Freq." msgstr "Freq." #: src/logbook/lgbook.cxx:671 msgid "Frequency in MHz" msgstr "Frequenza in MHz" #: src/logbook/lgbook.cxx:683 msgid "Mode in use" msgstr "Modo in uso" #: src/logbook/lgbook.cxx:694 #, fuzzy msgid "Pwr" msgstr "Pr" #: src/logbook/lgbook.cxx:695 msgid "Transmit power used" msgstr "Potenza di trasmissione usata" #: src/logbook/lgbook.cxx:707 msgid "Rst sent" msgstr "RST inviato" #: src/logbook/lgbook.cxx:718 msgid "QSL-sent" msgstr "QSL-inv" #: src/logbook/lgbook.cxx:719 msgid "QSL sent on this date" msgstr "QSL inviata il" #: src/logbook/lgbook.cxx:732 msgid "City of station worked" msgstr "Cittá della stazione collegata" #: src/logbook/lgbook.cxx:743 msgid "St" msgstr "St" #: src/logbook/lgbook.cxx:744 msgid "US state of station worked" msgstr "Stato USA della stazione collegata" #: src/logbook/lgbook.cxx:755 msgid "Pr" msgstr "Pr" #: src/logbook/lgbook.cxx:756 msgid "Province of station worked" msgstr "Provincia della stazione collegata" #: src/logbook/lgbook.cxx:768 msgid "Country of station worked" msgstr "Paese della stazione collegata" #: src/logbook/lgbook.cxx:779 msgid "Loc" msgstr "Loc" #: src/logbook/lgbook.cxx:780 msgid "Stations grid square" msgstr "Quadratone della stazione" #: src/logbook/lgbook.cxx:792 #, fuzzy msgid "Interesting notes" msgstr "Note interessanti (max 80 car.)" #: src/logbook/lgbook.cxx:817 msgid "Islands on the air" msgstr "Islands on the air" #: src/logbook/lgbook.cxx:852 msgid "CONT" msgstr "CONT" #: src/logbook/lgbook.cxx:865 msgid "DXCC designator" msgstr "Designatore DXCC" #: src/logbook/lgbook.cxx:877 msgid "QSL route of contacted station" msgstr "" #: src/logbook/lgbook.cxx:888 #, fuzzy msgid "Ser out" msgstr "Ser.dato" #: src/logbook/lgbook.cxx:889 #, fuzzy msgid "Contest serial # sent" msgstr "Numero seriale del contest dato" #: src/logbook/lgbook.cxx:901 msgid "Contest exchange sent" msgstr "Rapporto contest dato" #: src/logbook/lgbook.cxx:912 msgid "Ser in" msgstr "" #: src/logbook/lgbook.cxx:913 msgid "Contest serial # received" msgstr "Numero seriale del contest ricevuto" #: src/logbook/lgbook.cxx:925 msgid "Contest exchange received" msgstr "Rapporto contest ricevuto" #: src/logbook/lgbook.cxx:936 msgid "Call Search" msgstr "Cerca Nominativo" #: src/logbook/lgbook.cxx:937 msgid "Search for this callsign" msgstr "Cerca questo nominativo" #: src/logbook/lgbook.cxx:948 msgid "Recs" msgstr "Rec." #: src/logbook/lgbook.cxx:949 msgid "# Records in logbook" msgstr "Numero di record nel log" #: src/logbook/lgbook.cxx:961 msgid "New record / Save record" msgstr "" #: src/logbook/lgbook.cxx:968 msgid "Update the current record" msgstr "" #: src/logbook/lgbook.cxx:975 msgid "Delete the current record" msgstr "" #: src/logbook/lgbook.cxx:981 msgid "Dial" msgstr "" #: src/logbook/lgbook.cxx:982 msgid "Retrieve for active modem use" msgstr "" #: src/logbook/lgbook.cxx:989 msgid "Find previous" msgstr "Trova precedente" #: src/logbook/lgbook.cxx:997 msgid "Find next" msgstr "Trova successivo" #: src/logbook/lgbook.cxx:1020 msgid "Date" msgstr "Data" #: src/logbook/lgbook.cxx:1022 msgid "Time" msgstr "Ora" #: src/logbook/lgbook.cxx:1039 msgid "Cabrillo Setup" msgstr "Impostazione Cabrillo" #: src/logbook/lgbook.cxx:1059 msgid "Select Cabrillo Contest & Fields" msgstr "Scegli il Contest e i campi Cabrillo" #: src/logbook/lgbook.cxx:1062 msgid "Contest:" msgstr "Contest:" #: src/logbook/lgbook.cxx:1087 msgid "QSO Date" msgstr "Data QSO" #, fuzzy #~ msgid "Char set" #~ msgstr "Cancella la lista" #~ msgid "Select serial port" #~ msgstr "Seleziona la porta seriale" #~ msgid "Serial device" #~ msgstr "Porta seriale" #~ msgid "Select the rig by name" #~ msgstr "Seleziona la radio per nome" #~ msgid "Serial port" #~ msgstr "Porta seriale" #~ msgid "Serial port baud rate" #~ msgstr "Baud rate della porta seriale" #~ msgid "" #~ "Force the rig sideband. Takes\n" #~ "effect when rig mode changes." #~ msgstr "" #~ "Forza la banda laterale sulla radio. Ha\n" #~ "effetto quando viene cambiato il modo della radio." #~ msgid "FFT latency (scan merging)" #~ msgstr "Latenza FFT (aggregazione scansioni)" #~ msgid "" #~ "Latency increases frequency resolution,\n" #~ "decreases time resolution. 1 = no scan merging" #~ msgstr "" #~ "La latenza aumenta la risoluzione in frequenza,\n" #~ "diminuisce la risoluzione temporale. 1 = non aggregare le scansioni" #~ msgid "Save image as:" #~ msgstr "Salva immagine come:" #~ msgid "Hide" #~ msgstr "Nascondi" #~ msgid "Colors and Fonts" #~ msgstr "Colori e Caratteri" #, fuzzy #~ msgid "Disp" #~ msgstr "Visualizzazione" #, fuzzy #~ msgid "Select Char Set" #~ msgstr "Seleziona la parità" #~ msgid "64-bit (long) interleave" #~ msgstr "Interleave a 64 bit (lunga)" #, fuzzy #~ msgid "Reset Filter to Optimum bandwidth" #~ msgstr "Larghezza di banda del filtro di ricezione" #, fuzzy #~ msgid "Filter Quality" #~ msgstr "Larghezza del filtro" #, fuzzy #~ msgid "Navtex stations file:" #~ msgstr "Salva file delle macro" #~ msgid "Memory Mapped Rig" #~ msgstr "Radio \"Memory Mapped\"" #~ msgid "Set page width" #~ msgstr "Imposta la larghezza della pagina" #~ msgid "after:" #~ msgstr "dopo:" #~ msgid "RX" #~ msgstr "RX" #~ msgid "TX" #~ msgstr "TX" #~ msgid "X-agc (hidden)" #~ msgstr "X-agc (hidden)" #~ msgid "MemMap" #~ msgstr "MemMap" #~ msgid "" #~ "Control via Memory Mapped\n" #~ "shared variables\n" #~ "i.e.: Kachina program" #~ msgstr "" #~ "Controllo tramote variabili condivise\n" #~ "a memoria mappata\n" #~ "es.: programma Kachina" #~ msgid "Use Memmap" #~ msgstr "Usa MemMap" #~ msgid "Rig control via memory mapped Kachina" #~ msgstr "Controllo della radio attraverso memoria mappata Kachina" #~ msgid "Use Memmap PTT" #~ msgstr "Usa PTT MemMap" #~ msgid "Initialize Memmap interface" #~ msgstr "Inizializza l'interfaccia MemMap" #, fuzzy #~ msgid "Displays" #~ msgstr "Visualizzazione" #~ msgid "Tx Power" #~ msgstr "Potenza Tx" #~ msgid "Ser# in" #~ msgstr "Ser.ric." #~ msgid "Save log before exiting?" #~ msgstr "Salvare il log prima di uscire?" #~ msgid "Save changed macros before exiting?" #~ msgstr "Salvare le modifiche alle macro prima di uscire?" #~ msgid "QSO Freq" #~ msgstr "Freq QSO" #~ msgid "Cnty" #~ msgstr "Cnty" #~ msgid "Az" #~ msgstr "Az" #~ msgid "#Out" #~ msgstr "Dato" #~ msgid "#In" #~ msgstr "Ric" #~ msgid "Xchg" #~ msgstr "Rapp" #~ msgid "Not an ADIF file" #~ msgstr "File non in formato ADIF" #~ msgid "View log" #~ msgstr "Vedi log" #~ msgid "A message was logged" #~ msgstr "Un messaggio e` stato loggato" #~ msgid "Text:" #~ msgstr "Testo:" #~ msgid "The right audio channel is disabled. Enable it now?" #~ msgstr "Il canale audio destro è disabilitato. Abilitarlo ora?" #~ msgid "Double-click on RX text enters QSO data" #~ msgstr "Doppio click su testo ricevuto riempie i campi del log" #~ msgid "Rx Text" #~ msgstr "Testo Rx" #~ msgid "Bandwidth cursor" #~ msgstr "Larghezza di banda" #~ msgid "Cursor color" #~ msgstr "Colore del cursore" #~ msgid "Cursor center line" #~ msgstr "Linea centrale" #~ msgid "Bandwidth tracks" #~ msgstr "Tracce largh. banda" #~ msgid "Tracking range (WPM)" #~ msgstr "Ampiezza di inseguimento (WPM)" #~ msgid "Contestia" #~ msgstr "Contestia" #~ msgid "Enable right audio channel" #~ msgstr "Abilita audio sul canale destro" #~ msgid "TxLevel" #~ msgstr "Liv.Tx" #~ msgid "Tx Atten (dB)" #~ msgstr "Atten. Tx (dB)" #~ msgid "Callsign DB" #~ msgstr "Callsign DB" #~ msgid "CDROM" #~ msgstr "CDROM" #~ msgid "Paid online subscription" #~ msgstr "Connessione online a pagamento" #~ msgid "Not available" #~ msgstr "Non disponibile" #~ msgid "On Date" #~ msgstr "Data inizio" #~ msgid "Off Date" #~ msgstr "Data fine" #~ msgid "Freq Analysis" #~ msgstr "Analisi di Frequenza" #~ msgid "Auto Extract files from rx stream" #~ msgstr "Estrai automaticamente i file dal flusso rx" #~ msgid "" #~ "0\n" #~ "1\n" #~ "2" #~ msgstr "" #~ "0\n" #~ "1\n" #~ "2" #~ msgid "Enable detection && extraction" #~ msgstr "Abilita decodifica ed estrazione" #~ msgid "Auto open wrap folder" #~ msgstr "" #~ "Apri automaticamente\n" #~ "la cartella wrap" #~ msgid "Autostart flmsg upon detection of compatible file" #~ msgstr "" #~ "Avvia automaticamente flmsg quando viene rilevato un file compatibile" #~ msgid "Search for reg-exp in browser text(s)" #~ msgstr "Regular expression da usare per la ricerca nel testo del navigatore" fldigi-3.21.80/Makefile.in0000664000175000017500000006357112313332270012123 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure ABOUT-NLS \ AUTHORS COPYING ChangeLog INSTALL NEWS build-aux/config.guess \ build-aux/config.rpath build-aux/config.sub build-aux/depcomp \ build-aux/install-sh build-aux/missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/intl/gettext.m4 \ $(top_srcdir)/m4/intl/iconv.m4 $(top_srcdir)/m4/intl/lib-ld.m4 \ $(top_srcdir)/m4/intl/lib-link.m4 \ $(top_srcdir)/m4/intl/lib-prefix.m4 \ $(top_srcdir)/m4/intl/nls.m4 $(top_srcdir)/m4/intl/po.m4 \ $(top_srcdir)/m4/intl/progtest.m4 \ $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/benchmark.m4 $(top_srcdir)/m4/bind.m4 \ $(top_srcdir)/m4/build.m4 $(top_srcdir)/m4/debug.m4 \ $(top_srcdir)/m4/docs.m4 $(top_srcdir)/m4/fltk.m4 \ $(top_srcdir)/m4/funcs.m4 $(top_srcdir)/m4/libintl.m4 \ $(top_srcdir)/m4/macosx.m4 $(top_srcdir)/m4/np-compat.m4 \ $(top_srcdir)/m4/opt.m4 $(top_srcdir)/m4/oss.m4 \ $(top_srcdir)/m4/pkg-config.m4 $(top_srcdir)/m4/progs.m4 \ $(top_srcdir)/m4/static.m4 $(top_srcdir)/m4/tls.m4 \ $(top_srcdir)/m4/win32.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print A2X = @A2X@ ACLOCAL = @ACLOCAL@ AC_CONFIG_ARGS = @AC_CONFIG_ARGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CFLAGS = @BFD_CFLAGS@ BFD_LIBS = @BFD_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEBUG_CFLAGS = @DEBUG_CFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_LIBS = @EXTRA_LIBS@ FLARQ_AUTHORS = @FLARQ_AUTHORS@ FLARQ_BUILD_CPPFLAGS = @FLARQ_BUILD_CPPFLAGS@ FLARQ_BUILD_CXXFLAGS = @FLARQ_BUILD_CXXFLAGS@ FLARQ_BUILD_LDADD = @FLARQ_BUILD_LDADD@ FLARQ_BUILD_LDFLAGS = @FLARQ_BUILD_LDFLAGS@ FLARQ_DOCS = @FLARQ_DOCS@ FLARQ_VERSION = @FLARQ_VERSION@ FLARQ_VERSION_MAJOR = @FLARQ_VERSION_MAJOR@ FLARQ_VERSION_MINOR = @FLARQ_VERSION_MINOR@ FLARQ_VERSION_PATCH = @FLARQ_VERSION_PATCH@ FLDIGI_AUTHORS = @FLDIGI_AUTHORS@ FLDIGI_BUILD_CPPFLAGS = @FLDIGI_BUILD_CPPFLAGS@ FLDIGI_BUILD_CXXFLAGS = @FLDIGI_BUILD_CXXFLAGS@ FLDIGI_BUILD_LDADD = @FLDIGI_BUILD_LDADD@ FLDIGI_BUILD_LDFLAGS = @FLDIGI_BUILD_LDFLAGS@ FLDIGI_VERSION = @FLDIGI_VERSION@ FLDIGI_VERSION_MAJOR = @FLDIGI_VERSION_MAJOR@ FLDIGI_VERSION_MINOR = @FLDIGI_VERSION_MINOR@ FLDIGI_VERSION_PATCH = @FLDIGI_VERSION_PATCH@ FLTK_CFLAGS = @FLTK_CFLAGS@ FLTK_CONFIG = @FLTK_CONFIG@ FLTK_LIBS = @FLTK_LIBS@ FLUID = @FLUID@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ HAMLIB_CFLAGS = @HAMLIB_CFLAGS@ HAMLIB_LIBS = @HAMLIB_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_CFLAGS = @INTL_CFLAGS@ INTL_LIBS = @INTL_LIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAC_UNIVERSAL_CFLAGS = @MAC_UNIVERSAL_CFLAGS@ MAC_UNIVERSAL_LDFLAGS = @MAC_UNIVERSAL_LDFLAGS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKENSIS = @MAKENSIS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_DL = @PACKAGE_DL@ PACKAGE_DOCS = @PACKAGE_DOCS@ PACKAGE_GUIDE = @PACKAGE_GUIDE@ PACKAGE_HOME = @PACKAGE_HOME@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_NEWBUG = @PACKAGE_NEWBUG@ PACKAGE_PROJ = @PACKAGE_PROJ@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ PORTAUDIO_CFLAGS = @PORTAUDIO_CFLAGS@ PORTAUDIO_LIBS = @PORTAUDIO_LIBS@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ PTW32_CFLAGS = @PTW32_CFLAGS@ PTW32_LIBS = @PTW32_LIBS@ PULSEAUDIO_CFLAGS = @PULSEAUDIO_CFLAGS@ PULSEAUDIO_LIBS = @PULSEAUDIO_LIBS@ RDYNAMIC = @RDYNAMIC@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ X_CFLAGS = @X_CFLAGS@ X_LIBS = @X_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 -I m4/intl # AC_CONFIG_MACRO_DIR([m4]) SUBDIRS = po doc src EXTRA_DIST = build-aux/config.rpath all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-lzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am @HAVE_FLUID_TRUE@flgen: @HAVE_FLUID_TRUE@ @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) @DARWIN_TRUE@appbundle: @DARWIN_TRUE@ @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) @HAVE_NSIS_TRUE@nsisinst: @HAVE_NSIS_TRUE@ @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) @ENABLE_HAMLIB_TRUE@@WANT_FLDIGI_TRUE@hamlib-static: @ENABLE_HAMLIB_TRUE@@WANT_FLDIGI_TRUE@ @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fldigi-3.21.80/ChangeLog0000664000175000017500000026361012313332207011624 00000000000000 =Version 3.21.80= 2014-03-19 David Freese d3aa1cc: FreeBSD nitems ca39b53: Cabrillo time off 819a3ee: Change Fl_ListBox 6baa7d1: Restore Fl_Choice cee5d0e: Olivia select fix 0a7e37c: ComboBox 36da549: fluid update =Version 3.21.79= 2d189bd: RigCAT initialize b391b02: Modem cleanup 720f88d: Missing build script ea4042e: Choice-->ListBox 632d5ae: combobox-listbox 3204698: FreeBSD One More Time 01dffcb: RTTY normalize 89bb26d: Sound.cxx cleanup 4d30c67: Portaudio ring buffer 0cff262: Headers update 4e55345: Portaudio error reporting 2014-01-28 Kamal Mostafa 58aeb6a: Avoid nitems fltk kfreebsd collision 2014-01-13 David Freese 3b9ace3: modem timing test 1af2407: XMLRPC seg fault 2817731: Mailing address 2014-01-11 John Phelps aad3a84: 64 bit stacktrace 2014-01-11 David Freese b778b42: Developer update 440c65f: CW timing =Version 3.21.78= 05e0bfc: SKED macro 52ba259: FreeBSD issues c0ba6f8: WF max size 4e085ba: PSKR softbits 2013-11-09 Andrej Lajovic 0621261: CharsetDistiller 8f5640b: UTF-8 2013-11-08 Arvo Järve 3425ce0: RigCAT close 74c6533: Save Wordwrap 2013-11-05 David Freese 0d1a309: ARQ timeouts eeacf5e: Deutsch c474790: DTMF 1cca53a: WF latency =Version 3.21.77= 665f195: Load preferences 7dcfc50: Waterfall race condition 2013-10-22 John Phelps 0b8143b: MFSK HF Long Modes * Added MFSK64L and MFSL128L new modes * 6.25 Second interleaver for very-robust HF reception * Assigned new RSIDs * Mode MFSK-64L : 1026 * Mode MFSK-128L : 1029 2013-10-20 David Freese e0d91cb: Waterfall improvements 2013-10-19 Remi Chateauneu 1e39501: Fix test_process on MacOS fb5c891: Various speed-ups, fixes and cleanups 2013-10-16 David Freese d56a7f4: Cfft removal a322875: fldigi.pot update adc6128: Multi-channel decode 267b914: fft filter 1bad52f: g_fft 9b62e1b3: WF fft 6d79e55: rsid fft d600d02: Wefax Config tab 683b364: Autostart programs bb91898: RsID Error Control 1eaba46: Macro tag Image 2013-09-17 Kamal Mostafa 51ead20: Avoid-nitems-fltk-kfreebsd-collision.patch 2013-09-14 David Freese 8159199: MFSKpic improvements 78d11dd: ADIF log database dbabd63: MFSK update 3d400ae: Thor update =Version 3.21.76= e743f37: AMP end of text e640b53: ARQ mode character set e875d6e: RsID, Macro Queue, DTMF transmit management e618ecf: Xmlrpc method signatures 6e8f57a: RsID fo computation =Version 3.21.75= 30915e4: xmlrpcpp methods 7037ad6: RSID update fce7654: Error exit 263f540: fltk 1.1.x 433ec86: Sound File =Version 3.21.74= d17f1b1: initialize active_modem bdbaf78: XML parser 6fcf6bd: 64 bit compile warnings 1a870d9: Automake bug =Version 3.21.73= 627bddc: qrunner mod 98b61eb: Pskmail-test 2013-07-24 John Phelps 989a111: Doxygen for fldigi * Added scripts to generate Doxygen documentation from fldigi git repository / source * Also executes "cppcheck" and includes those results on Doxygen page (if installed on system) * Generates patches and log for the last 125 commits: includes links on Doxygen page 2013-07-24 David Freese 86bb08b: CPPcheck errors 4a9724c: Modem class 3b9dff0: Rigcat Thread 55df4c7: Missing header 65640ca: fldigi-shell 59a9029: Fl::focus on OS X edc0c9f: Data files 6794811: KML thread fe82181: Fl::flush 59d9fbb: ADIF_RW thread dfb6eaa: trx semaphore 35e8135: Digiscope buffer 2013-07-07 Robert Stiles c75ac9a: Portaudio exceptions 2013-07-07 David Freese 18534e4: mxe-win32 regex 0f5ede7: PSKMAIL/ARQ socket e624bc0: Thor update 07f9cb8: record_loader fix 6e16b41: Code cleanup 50c1c12: Pskmail Notify RsID 4b9c578: MFSK shut down 2013-06-27 Robert Stiles af5e09a: Cwidth test for zero 2013-06-21 David Freese b6ee3f7: XMLRPC 389c189: MXE compile 2013-06-19 Stefan Fendt dfc2bd8: RTTY decoder 2013-06-09 Dennis Engdahl 7d62b22: RigCAT user commands 2013-06-08 David Freese 3850862: TX state 9b26ff6: pskmail events e12a373: * Changed extended rsid iaw doc/rsid_codes.gnumeric 2013-06-01 Remi Chateauneu 982f335: KML/Synop/RTTY/Navtex 3bb70e4: Port to MXE / MingW 34b3baf: QSL VIA 6cd7017: XML parser 2013-05-31 David Freese 2c9c73f: ARQ support changes f8e26f3: xmlrpcpp 237cc8f: PortAudio dc7173c: SysV ARQ interface 1ea46c6: METAR format e1004fc: RSID logic =Version 3.21.72= a933da1: RsID Timeout ff1d69a: PSKMAIL 531c40c: Colors/Fonts Dialog 8be3913: Developer List =Version 3.21.71= d9e2c6f: About update 603e6a7: Wavefile generate 4c7ffd7: MT63 mode selection bae6d2c: ARQ server 2013-04-30 Remi Chateauneu 9750f38: xmlrpc-c removal 2013-04-30 David Freese a2624eb: Signal Browser Colors 0bc251a: QRZ query 816aea5: Rigsupport 54708a2: PO file update 6b28784: eQSL url acd5297: PSKMAIL =Version 3.21.70= ab4e0f2: Contestia/Olivia 45be148: Tabs Colors 2013-04-13 Arvo Järve 89e1df1: Double Click bug fix 2013-04-12 David Freese efce800: RTTY update e2b050e: Fltk backward compatibility 27e753e: Compiler warning fix 2013-04-11 Kamal Mostafa 5f770be: Fix glob_t usage 2013-04-11 David Freese 1e94067: Spotting fc68397: ADIF case =Version 3.21.69= 524864e: QSO NBR/NXT macro tag 303681e: TX lower case 69bab69: WX parser 6e5a68d: Signal Browser 2ecbeca: Compiler Warnings 5134b81: Free BSD mods f794566: flstring 92ede71: RTTY filters 6e9a943: Serial by-id 5a2c244: RTTY tx symbol shaper 093796f: Misc NBEMS mods 2013-02-28 Arvo Järve b088667: CRC16 and ANSII char set 2013-02-27 David Freese c586219: High Speed Playback 0a9823d: RTTY config tab 2013-02-11 Arvo Järve ES1JA cd2fdd7: * Added BAND macro tag 2013-02-09 David Freese 64f04d8: Dbl Click for Xchg In a7f42b9: Status Reports 2013-02-09 Remi Chateauneu 5d6d921: RTTY tx code 2013-02-09 David Freese 163f1f6: RTTY no LF =Version 3.21.68= 2013-02-08 Remi Chateauneu efe6687: RTTY bug fix 2013-02-07 David Freese 2a6bfee: RTTY filters 48dcf51: Hang on start 72dd5f2: Analysis 55b76e9: rigMEM be3dd1f: WF only ESC abort 2013-02-03 John Phelps 4a8e3ca: WF only null pointer fix 2013-02-02 David Freese 48ed1f0: RTTY config tab f684b91: RTTY stop bits =Version 3.21.67= 645acab: PSK viewer 63323a4: Contest fields f3abd4c: RigCAT INIT/CLOSE 4af6dcd: Olivia FEC reset 0d4d55d: RTTY FSK modem b8fd4db: Status / Tx Level Controls =Version 3.21.66= 305fa6d: Thor reset d2dea40: File Selector f83a413: Macros d12f7da: CW modem 282886b: User configurable items =Version 3.21.65= 7680b05: High Speed / Multi-Carrier Modems =Version 3.21.64= 2012-12-26 Makoto Fujiwara 0322dc9: NetBSD compile error 2012-12-15 David Freese 05b3ad0: Dup Cty lookup b02da36: Get RX buffer d52579b: Capture Alt-F4 =Version 3.21.63= 972865e: Macros LOG LNW EXEC 01ef002: ARQ Socket 261b7fb: Default char set 614a542: NBEMS.DIR cb820ae: RTTY CR-CR-LF de390ac: Control-V/Z =Version 3.21.62= fec0ead: Pause-break 2ca1bf7: WF-only-escape 326a75d: REPEAT Macro 44e6ae6: MT63 Long =Version 3.21.61= 2012-11-08 Dave Freese (none) c7f2918: ARQ server 2012-11-04 David Freese e388b7b: DistCheck cleanup =Version 3.21.60= a239363: FLTK-1.1.x 7bd9355: Libtiniconv 2012-10-31 John Phelps 13fa1a0: Allow xmit of EOT character =Version 3.21.59= 2012-10-29 Andrej Lajovic 0c1f371: UTF-8 overhaul 2012-10-26 David Freese 1d6469f: Thumbdrive =Version 3.21.58= 6875022: Escape aborts =Version 3.21.57= d925c85: Escape aborts clean start 0366447: TLF arq d85631b: Logbook Dialogs =Version 3.21.56= 320fc54: ARQ rx/tx =Version 3.21.55= 06e5ed5: View browser 1390d0b: FLAMP interface fix =Version 3.21.54= 2012-10-04 Andrej Lajovic 1abb9b9: UTF-8 wide characters 1b8cccd: flarq bug fix bad1660: Add_tx_char =Version 3.21.53= 2012-10-02 Kamal Mostafa 199978a: Fix crash if no OSS mixer support 2012-10-02 David Freese a698359: Logbook Call width 2012-09-29 Andrej Lajovic a8a148f: Log file update 946bbb8: UTF-8 char echo bab4a53: Hamlib sideband menu =Version 3.21.52= 2012-09-21 David Freese f8a6e1c: ASCII table correction =Version 3.21.51= 638a3c2: flmsg/flamp stream processing 8a41aad: DominoEX varicode de95906: WRAP binary files 2012-08-31 Andrej Lajovic 8fdb2ca: Backspaces patch 2012-08-31 Daniel F1RMB 8d38260: UI enhancements 2012-08-31 David Freese 29c9c6a: Combo update a30ad34: Extract timeout 7286512: ASCII tables e765c4e: Socket send on Linux 2012-08-07 Kamal Mostafa 8ab2f6e: fix spelling error 2012-08-04 David Freese 2f7de4d: Logbook dialog initial size =Version 3.21.50= 5b175c1: RsID Multiple 2012-08-02 David J Vanecek eeaa755: Open BSD fixes 2012-07-12 David Freese e212c36: Restore post signal rsid 2012-07-08 Kamal Mostafa f45a09b: Tango icon: Restore missing weather_clear_icon =Version 3.21.49= 2012-07-07 David Freese ba1ec30: RTTY metric 77bb7a1: Logbook Colors-Fonts f2c18cb: RX Text backspace =Version 3.21.48= e94e2f2: HAMQTH Session ID 2012-06-29 Kamal Mostafa b8eb04c: Tango icon pixmaps update to version 0.8.90 (public domain) =Version 3.21.47= 2012-06-29 David Freese e4a180a: RTTY ASCII =Version 3.21.46= ce90378: CW Farnsworth ae08433: Merge log records 2012-06-26 Leonardo 0ddb867: Wavefile playback =Version 3.21.45= 2012-06-16 David Freese 817f299: ANTENNA macro tag a3f236a: fltk-1.1.10 compatibility 91ac4a9: APPLE about =Version 3.21.44= 39cad15: Polish translation 25fcf8d: file-chooser 990492b: Main Panel Controls Colors-Fonts bdacdd8: HamQTH cdc22d6: WEFAX/NAVTEX config c3162ed: Log Entries cb392e4: Fork open file descriptors 2012-05-31 Remi Chateauneu a28eb60: WEFAX update 2012-05-31 David Freese 81a9f43: Logbook Update ed638a5: Navtex =Version 3.21.43= 2012-05-30 Kamal Mostafa 39998f7: Fix TX text clear after macro 2012-05-28 David Freese c7f11f4: CW decoder update 0c113b6: Rigio thread 2012-05-10 Remi Chateauneu 967cc68: sfft speedup =Version 3.21.42= 2012-04-08 David Freese 1089250: Auto file directory 8bdd45e: Cmd line help ccc4d5d: FreqControl paste fc870d5: Base directory e298249: psk comments =Version 3.21.41= 1779db5: Check for updates 0d2e7c3: Notch indicator color 970b00d: ARQ Parse Mode d4e5caa: Path separator d7dfbdb: Debug changes 80d67e3: Clear sent text 815d27a: Control-Z fault bd14450: Notch d1defa3: EXEC macro =Version 3.21.40= 3318229: Save Macro - Windows 2dc3120: About copyright date =Version 3.21.39= 29ccdeb: Win7 Open Logbook 74da509: MFSK pic dnd c2998df: Merge record logic error 24c470e: OSX Lion shutdown b7ff115: Cyrillic-UTF8 chars bf8046d: QSK test 1364186: Weather report =Version 3.21.38= 9327490: Control sizing df3bf09: eQSL 13b7107: OS X file chooser 5122c7b: Control key parsing 3c0bcd8: Control-shortcuts b940e9c: WX international =Version 3.21.37= c4336b7: Macro filename ba5b5d5: Callsign query 2af9ebc: WX Celsius 62d9f42: Weather tag 3fc748e: Inline tags 3ae8ee9: OS-X native file chooser =Version 3.21.36= 5cc14a1: rigcat serial test 4c0526a: Macro load display 5cbed0c: File-dir selection 59e8dc9: Rx text wrap 2dfd6fd: UTF-8 rx suppress c36983e: Get WX 22e1f8b: Update to fltk.m4 890013c: rigCAT closure 56104f4: GCC-4.7 fixes e7ab7e2: Missing files 3b02bb3: RX last line 6e81738: Debug text 0f87d87: View browser find control b6a8332: Rx text wrap f1abc9e: Find chars fwd/back 6102e0c: Corner controls 2281325: Fltk-1.3.0 847fdd3: Rig cat close 672f4ee: OpBrowser font 5f8b712: Tune abort =Version 3.21.35= =Version 3.21.34= a70c0fe: VAC PTT delay 62532af: Mono audio a7f741b: VSP boolean =Version 3.21.33= a68d917: Right Channel audio 00d4308: WEFAX update 96188fa: WARN status colors =Version 3.21.32= 422c0b1: Italian po file update 2011-12-03 Remi Chateauneu e7d5ccf: Modem class update 38112d8: QsoRec comparisons 2011-12-02 David Freese e707094: Cty.dat 6821e78: Contestia 64/1000 ff596a0: Call lookups =Version 3.21.31= dcbae1e: Spanish translation file 136bcc2: Compile warnings 7beb7c1: ver2int 8a7c4bf: Main thread hang 2f2fe0a: UI changes =Version 3.21.30= 30951fb: Merge dups ee4c5b4: Logbook dirty boolean 2335f76: Tx Attenuator Control dfe3a7b: HamQTH app ident =Version 3.21.29= b97bbde: eQSL QTH nickname 2edfc77: Merge Logs 9de5095: ADIF i/o tweaks 77e1eb1: Call lookup =Version 3.21.28= ed74b9b: ADIF/EQSL thread shutdown d3e47a3: Ignore slash postamble 9100837: Log Export by date f6888ee: ADIF file integrity test =Version 3.21.27= a2184aa: Log r/w improvements 2011-11-15 Remi Chateauneu b3a89c7: WEFAX error logging fix 2011-11-15 David Freese 9269c9a: Restore Log Sort =Version 3.21.26= ee27d64: eQSL update =Version 3.21.25= 50fa414: guard lock 2011-11-12 Remi Chateauneu 8baf07b: Wefax enhancements. 11d699e: Use Logbook record 2011-11-12 David Freese c2ba559: eQSL =Version 3.21.24= 16fc289: Exec macro 0859928: QRZ on-line lookup =Version 3.21.23= 047543a: HamQTH 2ffb4a5: Auto-send =Version 3.21.22= 2011-10-28 Pavel Milanes Costa b66a4d7: es.po update 2011-10-28 David Freese 269ae3a: RSID defaults 1b3e852: NBEMS-FLMSG Directories =Version 3.21.21= 3163fd2: Resize fault =Version 3.21.20= fba599c: RSID limit fault c32fa63: DTMF debug =Version 3.21.19= 7046d49: HamQTH lookup =Version 3.21.18= 1247488: REV macro tag 9c13f6f: RTTY bandwidth =Version 3.21.17= 4ac5f6b: MFSK soft decode 07baee2: MACRO code cleanup 4d13cb4: ... =Version 3.21.16= 3e554f8: !Queue reset 8ac0558: Timer delay =Version 3.21.15= d0e1c5f: Log Menu Items cebc292: Macro Editor 960e580: WWV xmt mode bb258cd: Inline macro tags d2c33e4: RTTY baud ab472e0: CW/RTTY init fault 5a9607a: Control-Z bug fix c565815: CW QSK 405816e: Log Server lookup 2011-09-04 Remi Chateauneu e0ee3a9: Added wefax::adjust_metric method. 261275e: modem::display_metric now sets the member modem::m =Version 3.21.14= 2011-09-03 David Freese 166fe59: DTMF decoder 49e2dd2: CW Prosign defaults 2011-08-30 Remi Chateauneu ff18562: Macros code cleanup 2011-08-30 David Freese 74364ee: DTMF class 5af9f3a: DTMF encoder 39fe31b: Wide Cursor Tracks =Version 3.21.13= 2011-08-07 Pavel Milanes Costa 5f3c3da: Update to Spanish translation 2011-08-07 David Freese 75de2ce: New Macro Tags 5e50597: RTTY MARK coloring 836c082: RTTY MARK frequency ab822e7: QSY macros =Version 3.21.12= f92dbf5: XMLRPC linking error 2011-06-26 Pierfrancesco Caci df89c3c: Swap mode/frequency change from frequency list 2011-06-17 David Freese a741be8: Logbook client for fllog server 3c14dc7: Logbook County 2011-06-11 Kamal Mostafa 4e192b5: Mode_info table restrictions 2011-06-08 David Freese 24ce84e: TX Attenuator d634026: View-Hide menu item =Version 3.21.11= 2011-06-06 Pierfrancesco Caci 97bbddf: K3 CW-QSY 2011-05-29 David Freese 4633907: LOG.ADIF export =Version 3.21.10= 2011-05-14 Pavel Milanes Costa bc7c0cf: PO files update 2011-05-14 Kamal Mostafa e000ac1: Conf dialog cosmetics 2011-05-04 David Freese dca7182: Duplicate defines 2011-04-19 Kamal Mostafa 50febcc: GNU/Hurd build fix =Version 3.21.9= 2011-04-17 David Freese 625c8f9: Spot-notifier fd48d9a: Olivia tone/bw choices =Version 3.21.8= c3aacd3: Config defaults 3fb1a42: No rig mode selection =Version 3.21.7= c200173: wo save status =Version 3.21.6= 2011-03-18 Pavel Milanes Costa a4ba568: es.po update 2011-03-18 David Freese 3d4ea9c: flmsg auto start =Version 3.21.5= e7a403a: Wrap File reception 29c6fc0: EXEC win32 macro tag 2011-03-06 Stelios Bounanos 3114075: Fix socket/getaddrinfo support =Version 3.21.4= 2011-03-01 David Freese b1f141f: LOGBOOK date-order 6daba19: GRIDSQUARE on reports =Version 3.21.3= a15a9c3: PO updates 6eb644b: Waterfall Only =Version 3.21.2= 2011-02-18 Stelios Bounanos 211ea4c: Update NEWS 2011-02-18 Pavel Milanes Costa c01c28e: es.po update 2011-02-17 David Freese 13fce24: Olivia Tone displacement =Version 3.21.1= 2011-02-15 Pavel Milanes Costa ef8b122: es.po update 2011-02-14 Leigh L. Klotz Jr 3cc9e5e: Add RX frequency tag for search macros 2011-02-13 Stelios Bounanos 8ad7685: Adjust notify dialog 2011-02-11 Pierfrancesco Caci 3634a11: it.po update 2011-02-11 David Freese d24ee90: Macro 0ad002e: Enable NLS on woe32 2011-02-09 David Freese 23eacc5: Cosmetic adjustment 2011-02-07 Pierfrancesco Caci 5bc6b10: PO update 2011-02-07 David Freese 9d20988: Psk_browser seek_re 451b63f: MT63 Waterfall Cursors 2011-02-04 Stelios Bounanos 37369b0: Update i18n 7ee39dc: Update copyright 3b11a86: Update About dialog box 9d68a57: Make wf mouse wheel action strings translatable 2011-02-04 Pierfrancesco Caci 355f776: Add Italian l10n 8cefce0: Make more strings translatable 2011-02-04 Pavel Milanes Costa 919a99f: Add Spanish l10n 2011-02-03 David Freese cfd0d02: MT63 2 tone fix 7cf8bcd: MT63 manual tune mod 2011-01-31 Stelios Bounanos 2d474d9: Config dialog clean ups 81a464e: Remove macro config images 2011-01-25 David Freese 91d62b8: exist b30b314: mvgroup size restore 857cd2f: Macro Bar positions b68ae5f: Main Dialog Cosmetics 30e8827: Panel Widget 2c6043b: Compiler warning in trx.cxx c2f5364: VTgroup position cfacc55: Fl_Text_Display_mod 70b57ff: Viewer Width adjuster e78f3e0: Viewer status 5d8e050: View slider color 949a112: Macro bdb3ea6: Maximize window error 1412187: Signal Browser Cosmetic 12f0f4b: Logbook Server Connection Disabled 9ec791a: PSK browser mod 6a24e15: Code cleanup f97218b: Convenience features 2907405: Signal Viewer History 3bc947b: Mixer Frame 8093389: Channel Number 2011-01-02 Pierfrancesco Caci 7e4c1ab: RX-TX log file 2011-01-02 David Freese 98b4cb0: PSK detector mod 0dd1249: Browser Channel Order c33a85d: Tile_Check fix 30d8c58: IPC Date report 03390bb: Load Macros 3b967fd: RTTY visible timeout bce4760: Browser start frequency 8e76296: Macro Bar Configure 0c66bd7: RTTY adjacenies 3b55c69: PSK AFC 0c5e8a3: PSK Browser-WF data 714e573: Waterfall Only mods 75c8e77: RTTY BROWSER 040c13f: Browser reformat 04f107e: PSK browser mod 75c9112: ADIF format fault 7767ff1: PSK browser update c7c3a43: RTTY viewer 4344d53: Macro Button Bars dc6a6b1: CONTESTIA 99f977c: Dual Macro Bar 685ffc3: PSK browser detection 425c6bf: pskBrowser class 2010-12-21 Dan Ankers 09c9569: IARU Maidenhead 2010-12-07 David Freese fa165cc: Countries List 9b8fdd8: Check for updates 81ebe81: Carrier Squelch eb0afbb: Call Lookup d6583d8: RSID new mode 1f8a59f: Logbook Menu 49cae5f: DATE_TIME sorting a5f2f7f: Log Client 2010-11-19 Stelios Bounanos ca7d30f: Embed xmlrpc++ 2010-11-19 David Freese f2b39b1: Reversion of commit 2a957966c1ebda93647a789a75f83aba6af5f98a afeccbb: DigiTalk ef188fd: QSO_DB sort order c372640: Macros 2010-11-05 Terry Embry 9c8e837: VSP patch 2010-10-20 David Freese c29ee47: CALLOOK lookup 2010-10-13 Fernando M. Maresca 80e1bcf: QSO_DATE_OFF field implementation 2010-10-13 David Freese 7e1c6cd: Build correction 2010-10-13 Remi Chateauneu a2c9e04: WEFAX bug fixes 2010-09-23 David Freese c5ea3ce: FLMSG open NBEMS/WRAP/recv folder f46016f: ESC action restore 0ac873f: Hamlib Tests e645b56: RigCat Width 0f52da3: Goertzel filter update 1ad7f16: CONFIG dialog aa4bee2: Abort ARQ 2010-08-30 Chris Sylvain 6cbd200: RTTY-PSKSCOPE e6d43d4: Goertzel Filter 2010-08-30 David Freese a0cca98: Time Macros 0c14c51: Logbook Field Sizes 72d78b1: Macro Mode Change 70ef8db: Combo widget bea2d29: TX file insertion 6c6f6e0: RsID b24fe85: Xmlrpc Raw data a9815cd: Log Sort 1110fe4: Xmlrpc BS char 9e6d0f3: Logger bc70438: Compile Warnings a7ee2af: ThrobX dd0d489: Post RsID 809b218: Revert "RSID silence period" 2a95796: MultiUser Logbook 4a77c03: Contestia Olivia info 7f7aeab: RSID silence period e7d9cd1: Logbook Save 0af649b: '^' Parser 2010-07-13 Fer Maresca, LU2DFM abafe0d: change 2010-07-02 David Freese 0faeecb: RX-TX Select e1cfec0: RTS-DTR ptt 9064f15: REPEAT Macro e2ec239: Mode prefs 6e6b672: Morse Prosigns 2010-06-21 Chris Sylvain 62335f9: RTTY class 8e26ee4: video text mod 773e0ed: PSK Browser modes 40204ca: Beginners Guide update 2010-06-15 David Freese 4d1c449: PH Cabrillo report fd7ca52: QRZ xml service 5c0eea9: CWID e37116b: RTTY 75 baud edf6b4b: Read Config 629a404: VIDEO ID d9a2e53: CTY.DAT-KG4 e5d8785: PA flush c5f12bb: RSID code base a7f6d85: RSID new codes 870bfa6: WEFAX time 6e617cf: TX Wrap disable d46b8a4: RSID squelch 03f1ba7: RSID tx suppression 0790350: Pulse audio 2010-05-15 Remi Chateauneu f6f0ea9: WEFAX bug fixes 669ee37: WEFAX additions e9d7520: WEFAX image size 2010-05-15 David Freese d7d19f0: PSK RSID c3fbd31: RSID DomEX-FEC 2010-05-13 Stelios Bounanos e36afb0: Implement CLOCK_MONOTONIC on OS X 2010-05-13 David Freese 1387fbe: WEFAX MINGW32 2010-05-03 Remi Chateauneu 2508852: WEFAX addition 2010-05-02 David Freese ed574fb: Configure.ac update =Version 3.20.11= ff47cc4: XCVR Freq 5186a74: FLARQ 4.3.1 =Version 3.20.1= 55eec2a: MAP macro update e17ccfb: LOCK macro 917b5bd: Freq Browser Select 4474bd4: MAP macro 2da1e55: ARQ auto file 54a0569: Freq Control Font 2010-04-22 Stelios Bounanos 5b7e839: Disable sprintf re-declaration c5f34c6: Fix compiler warnings 1733f1f: Add preliminary support for FLTK-1.3 2010-04-16 David Freese ab092a6: psk reporter mode 6c15ddd: Psk Viewer Min Width 2bc6105: Revert "SC Time Out" 2010-04-12 Stelios Bounanos 5da5ba6: Update NEWS 2010-04-12 David Freese aaaec18: WARNINGS 8df121a: SC Time Out 45654ea: PSKR fec metrics faf5e6c: Pause-Break 975f4a9: RX lowercase option 2010-04-12 Stelios Bounanos d551f2e: Disable Czech l10n f1762d7: Fix more widget labels 4f80565: Update QSO frequency 2010-04-08 David Freese 3754c63: Tx Pane Min Height 717c151: Modem Init 0469895: Contest Menu 8f76576: AFC-SQL check buttons 5dcf5cb: ADIF Export 1b5f56f: Olivia-Contestia bandwidth 0d77c1b: SSB modem 586e3d5: QPSK dcd postamble 1aae11e: RX_ONLY Modem type d29495f: QSY Lock disable 02767b0: Contestia c10ee73: Freq Analysis Init 2010-04-04 Stelios Bounanos 391167c: Add time functions 80572f5: Improve monitoring of transmitted signal 2010-03-25 David Freese c517a1e: NBEMS files b794fb1: Rx Contest Popup Menu 09c77b5: Olivia bug fix b6b6d76: Contest Rig/Log View 4000fe0: CW Xmt WPM 35826a3: Cabrillo Report 3b63d8f: XBEG-XEND macro tags 2010-03-20 Giuseppe Ciaccio 1fb42ac: CW Decoder improvement 2010-03-20 Stelios Bounanos e0c62c2: Add new modem macro cdd4457: Fix counter widgets cff6112: Fix Olivia pre/postamble 2010-03-20 David Freese 269152e: AFC-SQL Lighted button 8766979: QSOTIME 2010-03-18 Stelios Bounanos 2715366: Fix label sizes 4ed6c1c: Add PSK browser font change support 735dba2: Cosmetic changes the PSK browser 5a1cf7d: Add font browser filter bdcca8c: Add mouse wheel handling 2010-03-17 David Freese b66e456: LSB modes - no rig 40ae07f: Macro Idle b1702af: User Config Tab 6639fef: macro 48552e1: Light Button Colors 2010-03-10 Stelios Bounanos f7d5af9: Fix status load 97c65e1: Add scroll hints menu item 2010-03-10 Stephane Fillod 7369f44: Update i18n 2010-03-09 David Freese e9ec047: DigiTalk 2010-03-05 Сергей И. Королев 127380f: Add custom RTTY shift option 2010-03-05 Stelios Bounanos a8e4f81: Add XML-RPC methods for Olivia d2df10a: Modify FText add() methods 92a8fd6: Fix bandwidth marker 2010-03-04 David Freese 82eaead: Olivia Pre/Postamble visibility on waterfall a454879: Empty Call Nag e3c7a76: Initial Configuration 551d118: Textout.txt on MS 2010-03-02 Stelios Bounanos 2f48f07: Add release notes cc957f3: Update copyright headers a9b976a: Delete unused code 2010-03-01 David Freese 2e78ec6: NBEMS folder access 995c34e: fix dcbfb7d: Add option to specify non-word characters 2010-03-01 John Douyere 8cea906: Extended Pskmail messaging 2010-02-26 Stelios Bounanos ed30b5b: Add new WriteARQsocket function 2010-02-25 David Freese 5a3d0ab: RSID detect 2010-02-24 Stelios Bounanos df7caff: Fix name_to_device 2010-02-22 Vitaliy Berdinskikh 9c846a1: Remove png_infopp_NULL from picture::save_png 2010-02-22 David Freese 9b80c2c: Portaudio stream persistence mod 445c24a: Win32 init_stream patch 933af6c: Serial bug fix 2010-02-16 Stelios Bounanos ccaaa1e: Add RX text scrollbar hints 5c82c35: Fix RX text context menu 0459067: Log excluded ID modes b3eda45: Add init_modem frequency argument 2010-02-13 David Freese 51700d7: TX ^r ^R parsing b1c5fa9: Startup Fix 3f3ddc0: FELD improvement 3acb7f2: Wizard Fix 2010-02-11 Stelios Bounanos e74201b: Fix sound initialisation 2010-02-09 David Freese 872f52c: WF_ONLY height fix 64b1921: fix 617f459: ARQ abort 2010-02-06 Stelios Bounanos bb37cc1: Fix -iconic option handling 2c55a62: Improve audio initialisation bde818b: Fix OSS compilation on NetBSD 7ac0fd5: Remove -fomit-frame-pointer flag 96419d7: Update manual pages 75e0eba: Fix main window title modification 0467a41: Fix PulseAudio backend b8d160d: Fix compiler warnings 2010-01-31 David Freese c5ca09a: Configure Dialog 03eedc4: Olivia Divide by Zero Error 3333585: DUP indicator b895c1a: Olivia Noise Estimator d4540c0: Waterfall Offset 5c3dd09: Diamond Indicators 2010-01-28 Stelios Bounanos 37ffd69: Update command line argument handling 2010-01-28 Chris Sylvain 80ca36a: Make CPU speed check information available upon demand 0936615: Fix llabs() namespace ambiguity 2010-01-28 Stelios Bounanos 78b515c: Add verbose log level 25e2c82: Rig control frame tweaks 2f9a0a2: Add rig.get_name b23f5d5: Fix table widget 3bbb6ea: Fix wizard crash on OS X 2010-01-27 David Freese 6b40f6b: RTTY demodulator eb9a385: Rig control changes e87b9df: Logbook empty record 29e891e: Config Dialog Cosmetics 6354484: RTTY mods 2010-01-25 John Douyere 33075e3: PSKR DCD detector 2010-01-22 David Freese a06bf93: S/N evaluators d84b060: RTTY decoder mods 93bedef: RSID fft processing afd3adc: HELL AGC improvement 2010-01-12 Stelios Bounanos 5b9ea76: Add rig control XML-RPC methods ec51533: Disable frequency locking in qsy 5d3732c: Add wizard af78f34: Improve RSID QSY functionality 2010-01-08 David Freese 86bbd55: Initial UI 56610a9: NOLOG alternate Callsign entry 2010-01-08 Stelios Bounanos 239ff98: Adjust View menu 2010-01-08 David Freese 276e769: Xchg In capture 4cd90d3: WF freq limit eea0287: Auto file transmit c762969: CSV Export 75be29e: Debug code removal ddc5790: Modem Initialization 6552c16: CSV Export 2010-01-06 Stelios Bounanos edb217c: Change waterfall focus handling df5c3ff: Improve mode cycling 2010-01-06 Chris Sylvain 0aa643b: Add keyboard shortcuts 2e476a3: Open PSK Browser only when last mode is a PSK mode 2010-01-06 Stelios Bounanos bf235e2: Update INSTALL bb537ed: Update README 2010-01-06 David Freese 9f9e738: UI adjustments ca0e9a8: MS Excel compatibility 2010-01-02 Stelios Bounanos 0ec66d1: Add ID mode exceptions 2010-01-01 David Freese 4bf78c6: CW Squelch d494b8a: QPSK Reverse 5d4ac2d: ARQ parser afc5861: Olivia Mods 2009-12-30 Stelios Bounanos 4380a15: Fix xmlrpc locking c7eb9ac: Clean up xmlrpc 2009-12-30 David Freese 6bb2a5c: Revert "XMLRPC set_freq bug fix" b751b9d: THOR soft decoding 087b4aa: XMLRPC set_freq bug fix 8e8b418: Auto Extraction bug fix 2009-12-18 Stelios Bounanos 56afe38: Add new RSID codes 4eb51ba: Fix rig mode menu 8af1511: Improve rig control methods 2a14309: Fix Fl_ComboBox 80a6ad4: Add new XML-RPC methods b5edfc2: Improve XML-RPC log.get_rx method 38f76f7: Save PSK Browser search string 613ecfa: Store old event logs fdc2cdf: Lower slow CPU speed test threshold 2009-12-18 John Douyere 645b74c: THOR squelch adjustment 58d86f6: PSKR - PSK63F - new modem types 2009-12-08 Stelios Bounanos d4e0a6d: Add support for persistent xmlrpc connections 2009-12-08 David Freese f5d3e46: Gaussian Noise Generator 2009-11-29 Stelios Bounanos d952ad4: Fix pkg-config error 2009-11-28 David Freese 69cb512: RxID Save b4dba6f: Callsign field size mod 2009-11-27 Stelios Bounanos 53a1e6b: Change arq class member types 78d5e4d: Disable win32 snprintf workaround aaaef29: Remove unused variables ab0d77f: Add missing USE_X checks b3d0265: Update crash handler 483b537: Fix LDFLAGS 7e39599: Fix custom pkg-config macro b06339d: Fix conditional pkg check 2009-11-18 David Freese c226978: Hamlib build fix 04992b1: Rig CAT mods 72959b6: RigCat Mods 53659c4: Hamlib mod fix b6a7cb6: Hamlib-RigCAT mods 306e6c1: Minimalist GUI d85b974: Hamlib mod 2009-11-06 Stelios Bounanos 0997c47: Distribute common resource file 52caf9b: Fix guide generation 2009-11-05 David Freese 04a9bfc: Macro Tags 2009-11-05 Stelios Bounanos 5c856a9: Restrict FLTK API version check 2009-11-04 David Freese ade6427: WAIT macro d02a3c8: RSID Macro Tags 18f4af1: Flarq email folder d60d6d9: Macro Save Log b99366d: No Rig Save 2009-10-26 Joe Veldhuis 9173537: Base Rig 2009-10-26 John Douyere db836cc: PSK500 Addition 2009-10-24 David Freese 65f70cd: WF Limits 4fa12df: ARQ RSID controls 6e4737d: RST Out clear bug 55168db: wfdisp-mod 05a62fa: PSK250-AFC 856b5ed: Rx/Tx Menu abedc7c: Waterfall background df226c9: Min-Rig-Log Panel c9560ea: Macro Timer ff7d941: Flarq mods 2625212: Log save bug d1fe543: GUI adjustment c092d62: Rx Contest Popup Menu 3d9952e: Contest Logging e62b52f: ENTER bug fix 3e464b8: Docked Scope 0ecc899: Macro Timer 11b82cd: Stop Timer Bug 5333ee2: Focus Mod 45239f4: Internationalization cc78045: Minimal UI 273622c: UI - minimized 7163ecb: RigCAT dialog bc78904: KISS update 159ba1e: KISS update 6440fa5: KISS 9faebb1: Flarq Directory Structure 9d9d56b: Talker Socket 2009-10-14 Stelios Bounanos c574685: Update win32 resource files 1d2f578: Fix threads/exceptions bugs on mingw32 ecc297b: Revert "Hamlib Exception Handling" 2009-10-09 David Freese 526c222: Macro bug fix 5733c10: Macro bug d6fc376: Wrap Extract 536e251: Macro TUNE ab565fb: Feld Hell Mod 615dd34: Text file out a5e17e8: Logbook read bug e0f86c7: TX Control Code fix 05ff91e: NBEMS 8a97f6b: Hamlib Exception Handling 7fb9639: RigCAT mods 2009-09-30 Stelios Bounanos e4e1af2: Fix silent rules 2009-09-23 David Freese fc18f87: Browser Discovery 2009-09-22 Stelios Bounanos 5626e1c: Add silent build rules 8ae5b22: Do not use -rdynamic on win32 2009-09-22 David Freese a318522: Code cleanup d373c26: Thor squelch mod 2009-09-17 Stelios Bounanos 0f96bc7: Fix llabs call 07bf0c4: Only set stop_bits for serial port rigs 67ff721: Fix format string 2009-09-16 David Freese 60ca5f0: rigCAT bug fix 4e19f03: rigCAT mods f9423b4: Serial i/o Stopbits 765c6d9: Dom/Thor mod fbcd160: QRZ lookup d36b5de: ARQ / RSID mod 2009-09-08 Stephane Fillod a06482d: Some more work on french l10n 4287bd0: More i18n 2009-09-04 Stelios Bounanos 71f2531: Remove g++-3 support via boost ed74dfb: Update README 2009-09-02 David Freese 5e35ec0: Menu bar ui mods da2cc3b: RSID ui mod df65003: RSID eot change 2009-09-01 Stelios Bounanos e39fc6a: Improve RSID notifications b09cea2: Enable concurrent RSID decoding 4de96c9: Clean up RSID code a434afb: Handle nested qrunner calls 8548035: Fix notifier TX text handling 78d87d7: Fix log/manual spotting b862f1a: Change transmit-lock marker width a3edac8: Add missing include 2009-08-31 David Freese 779bf23: PSK post DCD signal 2009-08-20 Stelios Bounanos 3c2a7a6: Add config doc strings b7d5d6e: Add transmit-lock marker 2009-08-19 Chris Sylvain 652f43f: Add LOCK macro 2009-08-19 Stelios Bounanos 0a09039: Misc UI changes 2009-08-18 David Freese 9bda6ed: flarq mod 2009-08-18 Stelios Bounanos 2971540: Fix benchmark mode output 788489b: Fix notifier event checks c0d08ef: Use bundled GNU regex on OS X cdf46da: Fix PSK Browser RE search 2009-08-14 David Freese 65000db: arq_io seg fault bug fix 18b8702: Olivia 8/1000 standard mode 62608ea: PKS mailserver mod bf164eb: rigMEM modification 3e6a5c4: WRAP file extract f2b29cb: RigCAT bug fix 5897cf7: Hamlib exit message eba91ff: Secondary text TX but in DominoEX-FEC and Thor 2009-07-26 Stelios Bounanos e1daa1d: Fix DnD file insert on OS X 5925ec3: Fix sound file selector ce4c179: Correctly populate RigCAT menu on OS X 2009-07-26 Leigh L. Klotz, Jr 5f1658c: Macro variable bug fix 2009-07-25 David Freese b72cfd5: MT63 mod 2009-07-25 Stelios Bounanos 4fff116: Add missing include d1c206b: Restore MT-63 options dfab290: Initialise pthreads/win32 in flarq ecf1f10: Restore two channel capture a8a734c: Fix millisleep function 2009-07-23 David Freese cf4c671: MT63 transmit bug fix =Version 3.12= 2009-07-13 Stelios Bounanos 3537f62: Add RSID notifications 2a4cd68: Improve frequency display kb entry 2009-07-11 David Freese 9c291a8: Enable XMLRPC QSY capability 2009-07-06 Stelios Bounanos deea0f6: Add ITU zone to countries list d54a2ca: Fix compilation on glibc 2.10 2009-07-02 David Freese 9de9eb5: Xmlrpc mods 07a01b1: Logbook bug fix 2009-07-01 Stelios Bounanos 42b638d: Fix socket fd leak 58c2f8b: Fix compilation error and warnings on 64bit archs c07ec21: Add generic notifier 88bedac: Add dragging to table widget 757a8f8: Simplify RE classes cbf0d87: Extend macro editor 53a2820: Improve dxcc, spot, pskrep performance 9648c30: Remove handling for REs without backref support 1b474a2: Fix config input field labels d6d5974: Add Fl_Input2 mouse wheel handling bf4cea4: Add automatic FText text_area resizing e803fcd: Improve FText drag and drop ec26eb6: Add band to RX text tooltip 8283833: Add string join and split functions d70ea69: Print build info in crash handler f25b5d1: Fix azimuth_long_path d11f6fe: Add frequency display text paste support 2009-06-30 David Freese 3bad2d4: xmlrpc mods 2009-06-12 Stelios Bounanos 419123c: Fix text echo functions 2a83da3: Remove FText text colour adjustment 7a87b0b: Always set the FText cursor colour 2009-06-12 David Freese a8dfa58: Logbook bug fix 9b7786f: RigCAT mods 2009-06-01 Stelios Bounanos 9f7b002: Fix Contest Country Files callsign lookup 2009-06-01 David Freese b539c1c: ADIF_2.2.3 compliance 8fc582e: Cut number mod for CW 2009-05-26 dave 7690a1c: FLARQ 2009-05-26 Stelios Bounanos d4b1a03: Merge flarq 91a1425: Move setup_nls function 9543fa7: Move make_pixmap function ada43f4: Add new FText classes bf6a2c3: Add thread id logging 8207c62: Prefer ALSA default devices d04b780: Fix initial window sizes 4f90ecf: Fix format strings 2009-05-16 David Freese 6b6cad9: PSK search algorithm 2009-05-12 Stelios Bounanos b95b8e1: Add win32 installer support d626273: Fix VPATH builds 2009-05-05 David Freese b4112de: Added , macro tags 7ae826f: RTTY pseudo output, corrected stop bit inversion 2009-05-02 Stelios Bounanos ae5b9ca: Add more PNG text comments 974e1ec: Remove JPEG write support 44eceae: Fix xmlrpc-c m4 macro 2009-05-02 David Freese b030b4b: Fix OS dependent compile error abc11f7: Updated memory mapped rig contol 2009-04-26 Stelios Bounanos 31e1902: Add missing includes 6b2260c: Macro changes 8f37399: Fix possible trx_startup deadlock edca452: Fix Makefile DEBUG flag 2009-04-25 David Freese affae09: CW default WPM (numeric keypad *) bug fix 2009-04-23 Stelios Bounanos f7309ef: Make the combo box popup modal ed0ae5c: Fix OS X native file selector 88b3fd7: Fix uHRouter and parport PTT 9c63531: Fix format string 2009-04-23 David Freese 8944198: CW replay bug fc50717: CW Farnsworth timing addition 63ccc2f: MinGW serial i/o, hamlib, rigcat mods 2009-04-18 Stelios Bounanos 206f815: Fix build without hamlib 2009-04-18 David Freese a9c21e5: Escape key bug fix d2674d5: Macro parse error fix 2009-04-17 Stelios Bounanos 9e060b8: Update version output 77bc966: Use band functions in logbook 2124791: Add functions to set the socket buffer size 4b1292c: Improve logging and error notification d73c8fd: Add OS X and MinGW stack tracing e192d1d: Add preliminary support for MinGW 01fd3d9: Change set_log macro 9d56656: Clean up headers b4bf47f: Distribute cr.sh test script =Version 3.11= 8646ccb: Fix rigMEM compilation on OS X 8fe2028: Fix uHRouter log message 2009-04-10 David Freese e94628c: Man page correction 2009-04-06 Stelios Bounanos c898131: Add documentation 88d067d: Disable SysV IPC on OS X d039aab: Add missing include 2009-04-06 David Freese e4d3f6a: updated i18n b1ff3f5: Status prefs mod 5249bd9: FFT processing - prefilter recognition f8c06f4: Waterfall FFT fix fb2c4d9: RigCAT code cleanup 0437cc7: Update i18n c261af3: Beginner Help bdf8ffb: XMLRPC mod 038868e: Logfile logic change aa40d40: RigCAT mod a04d475: Hamlib mod 43d0e8d: update i18n 3c7d004: Miscellaneous fixes c8d1e1e: update i18n a492284: Beginners Help update cc73610: HamLib PTT bug fix 3993b5b: Hamlib DTR / RTS state efc4259: Logger32 default folder change a1c6d75: Mods Logbook 0bb3f8f: Modification to logbook file processing 4dfb2c5: Mod - RSID propability of detection improvements 6c0d377: RSID decoder bug fix d77b8cc: Cosmetic change to adif_io.cxx code 2009-03-18 Stephane Fillod 53e631b: Update i18n 2929336: Czech l10n by Josef Klimosz, OK2WO 2009-03-16 Stelios Bounanos 3a65fa1: Fix hex/bin string output 2009-03-14 David Freese 228a4bd: Hamlib modification 35fe37b: QSO logging date-time 867ee12: Rig Control modifications 2009-03-12 Stelios Bounanos 1155b53: Modify variable-width font warning 2009-03-12 David Freese 6b4a4f6: CQ decoder improvement 2009-03-11 Stelios Bounanos c054a5b: Fix hamlib RTS/CTS callback 36952a1: Add fldigi-shell pskrqsy command ee69ba3: Reduce PSK reporter re-spot interval 2009-03-10 David Freese fc4a436: CW shape modification 6d92b4d: Change to FreqControl behavior 2391e67: Bug fix - missing inpNotes 787c67c: CW / QSK 2009-03-08 Stelios Bounanos 6e513f5: Fix hamlib sideband check 2009-03-07 David Freese b93ac73: Fixed rounding errors in CW encoder symbollen timing 2009-03-07 Stelios Bounanos 09230ee: Add reset config button f391c93: Update config UI 95bd6bd: Add hamlib sideband override c879f55: Add frequency list clear confirmation 2009-03-07 David Freese 2b54b0e: CW / QSK modification b5dc666: Palette mod 6148d03: Cosmetic change to config dialog 2009-02-25 Stelios Bounanos a2fc0c8db: Add better support for proportional fonts f6466f2: Fix font name/number compatibility code eb1ec8a: Fix printf format string 2009-02-25 David Freese afc4e0b: Added right audio channel PTT signal 5417cf2: Restore pre 1/29 FTextView.cxx, Fl_Text_Display_mod .cxx, Fl_Text_Dislay_mod.H 529cd68: Cosmetic change to font_browser Exception handling fix for portaudio Thread shutdown bug fix for win32 Cosmetic change to colorsfonts dialog Change to FTextView family revert to character counting for proportional fonts 2009-02-19 Stelios Bounanos e1c4b0b: Set LC_CTYPE to C 9cc4236: Add SINC_BEST_QUALITY warning e8309d0: Add optimisation flag e037b21: Fix ptt deletion 2009-02-18 David Freese a0c9a45: Added new palette, fldigi.pal d2094f4: Bug fix ... error in extracting font_number from font_name 2009-02-18 Stelios Bounanos 4b719fc: Close PTT when exiting e4e65fa: Add locator tooltip b9699d1: Remove bad sample rate converters 6d173bc: Improve font handling 1ac52d7: Initialise hamlib's RTS +12 setting 2009-02-17 David Freese 77d0b4e: Olivia pulse shape changes 4181ca8: Bug fix RTTY cpu usage 2009-02-15 Stelios Bounanos 56d7f0e: Fix va_args calls b8d267a: OS X fixes 6ff0e69: Fix fetch_http_gui timeout check 2009-02-14 David Freese 5299567: Added RTTY x-y scope extinguish on loss of signal Added PSK modes set_sigsearch(...) on modem change to any psk mode. c8d68a7: Added DSP filter width adjustment to RTTY 396a51e: Bug fix for Feld FM modes 8a8317e: Added FEC_snr and FEC_freq_offset displays to status bar e5bdb1a: Cosmetic changes to mt63 source - increase white space for easier reading 5f22454: Olivia decoder/encoder improvements removed all extraneous double/integer/double conversions added new signal/noise computation method 8c8f59c: Bug fix - PTT via rigCAT serial h/w RTS/DTR was inaccessible Bug fix - Xlog stream; suppress newlines in Notes field Added binary string format to display bit fields, ie: RTS / DTR state Changed 'Comments' to 'Notes' in all references re: logbook Comments ADIF field is single line character Notes ADIF field is multi-line character Converts all ADIF comment fields to Notes; backward compatibility bef4f92: Added sub-directores "wrap" and "talk" to the files directory Fixed missing quick-pick pop up menus edeb401: Fix hamlib RTTY/RTTYR sideband inversion 2009-02-04 Stelios Bounanos 7185222: Add LoTW and eQSL hints to dxcc popup f134124: Add benchmark and batch decoding switches 3ab8df2: Fix uhrouter support 362d88b: Fix cygwin gcc-4 compilation cb4b2f8: Fix local strcasestr 0b7d62d: Fix new version check 4ee758d: Add PSK reporter activity text field d6a88f4: Add new quick_choice popups 3e19c4d: Add fetch_http_gui ee82e29: Update guide b50f92a: Update platform ifdefs 798834d: Fix open URL function 0913a74: Fix compilation error with --without-hamlib 2009-02-03 David Freese cc880d9: Bug fix to wf_audioscale waterfall scale changes 23d8c7b: Added Rx text output to temporary text file. Intended use: text to speech conversion for blind operators 069099f: Deleted all references to afcIND 995d471: Changed waterfall event behavior for disabling operation b89635e: Fixed PSKnnn ADIF naming convention to comply with adif 2.0 spec 31c05ea: Added logbook save to file after every change to the logbook 4f307c7: Added Cabrillo field defaults per Contest selection e28d1d8: Modified Cabrillo report line QSO: format 184ce5a: Bug fix, Cabrillo report generator ca5bb8c: Modified contest exchange fill-in; appends if field partially filled Reversed #Out and #In fields for contest log af6b8dc: Added Cabrillo report writer for logbook / contest use Removed free form Exchange fields #2 and #3 Renamed Exchange field #1 to Exchange Out Added Exchange In field to the logbook 39721ce: Added rx stream file extraction Extracts all text between and including [WRAP:beg]...[WRAP:end] 01b916c: Add stop macro timer to all waterfall events 40dc198: Corrected adif strings for modes BPSK31...QPSK250 c6f5d65: Bug fix to correct rig xml 3586c22: Fix version comparison bb44e46: Fix memory leaks 2009-01-09 David Freese 993e74e: Update i18n 689d679: KDE refocus to QSO logging widgets Moving between desktops on KDE caused all QSO log widgets to be refocused. Caused QSO log to appear as changed when no change had occured. 2009-01-09 Stelios Bounanos b48fbdc: Cosmetic UI changes 51d015f: Remove extraneous includes f4c0063: Fix PSK reporter RE matching f71661c: Revert "Changes to spotting regex parsing" 2009-01-08 David Freese 615ff4a: Update to i18n fbca004: Changes to spotting regex parsing Windows does not recognize '\2' reference tag in regular expression defined in pskrep.cxx. Changed to combination of regexec and string find processing for required result. Added modem frequency to spotting call when logging or forcing a spot report. 495ac85: ADIF import Relaxed the test for accepting adi/adif file as valid ADIF too many other logbook programs not in compliance. Minimal test is for file to contain at least one adif field as " 8214079: Add log sources afb8d9e: Add parallel port PTT 2009-01-03 David Freese c826c1a: Update i18n 9b18d81: Clean up preparation for release 3.1 Added "Echo" configuration item for rigCAT removed ... parsing of rig.xml files Suppressed clearing Country, Loc and Azimuth fields by a call sign database query when the db does not support those fields Added missing tooltips to all configuration items da55bec: Update i18n d134214: Added missing fields to log.adi export (Windows only) Corrected logic associated with duplicate checking. 7e4c4b7: Update i18n e322799: Various bug fixes Restore fldigi.adif Windows logger file Fix missing in util.h Fix missing Country field fill-in in lookupcall Fix logic errors in keyboard / auto entry of callsign in qso log field 444633d: Update i18n a193eba: MT63 receiver buffer flush Added rx_flush to MT63 modem class. Allows immediate transition from Rx to Tx after remote station ceases transmission. No loss in Rx characters 2009-01-01 Stelios Bounanos 3833fd8: Add microHam keyer PTT support via uH Router 62627ec: Fix restore_signals 83736b5: Add hex print functions 56927d0: Fix compiler warnings 39decae: Simplify FText dxcc lookup ef055bf: Fix OS X compilation b7926ba: Fix directory creation f3a8e55: Update FTextView context menu 2389979: Simplify cb_call 6a061c8: Update build system 2009-01-01 David Freese 435b937: Remove logbook font number/size specifiers Allows system font specificatin via command line switch 6e5b077: Restore MT63 cursor Force MT63 wf cursor to fixed tracking points; 750, 1000, 1500 for MT63-500/1000/2000 respectively 122653e: Remove AFC indicator Commented all lines in fl_digi.cxx relevant to AFCindicator This is a control that is useful during modem decoder development but no for the casual user 68fd702: Olivia bug fix Changed bandwidth, preamble, postamble tones to be consistent with other popular Olivia implementations, ie: MultiPsk ec65205: Update i18n 3daf3d9: Changed show callsign behavior Popup now shows the Name, Last QSO date, Azimuth & Distance based on logbook record if the station was previously worked Otherwise the cty.dat file is used if present. fccba5c: Bug fix IOTA not clearing Added clear IOTA field when QSO log saved to logbook Added comments to locator.c 2008-12-29 Dave Freese 568f5c5: Fix qrb function 2008-12-27 David Freese e50a5ae: Update i18n fba9fb2: Macro tag modification Changed nn AND nn to and respectively 4468f10: Increased average Olivia power Balanced tone power between pre/post amble tones and the mfsk tones 8e40296: update i18n fa90e92: Delete last log entry bug fix 60e909b: Update i18n 1ec4341: Add missing qso fields to adif export TX_PWR, COUNTRY missing from export Simplified the export function eb09b3f: Update i18n b126409: Restored log IPC output to xlog etal. Added additional fields now supported by internal fldigi logbook Added configuration item for Tx Power a8b7043: update i18n 4b5b4f6: Rx text quick pick menu change Moved Call from quick pick to normal menu listing 46d15d0: Additional fix for TimeOn logic 36c3ab3: update i18n edda7b0: New logbook fields added TX_PWR, DXCC and IOTA to logbook renamed Notes to Comment to be consistent between main dialog and logbook dialog 79f61b5: Update Rx/Tx popup menus Changed logic for restoring Rx/Tx menu status to status.cxx e187ecc: update i18n 179e8de: Bug fix - TimeOn TimeOn was being reset every time fl_digi received focus Fixed in fl_digi.cxx 6595e7f: Fix compile warning in confdialog.cxx 9c0a78b: update i18n bd1cf1c: Additional state variables Save & restore state of: ReceiveText quick entry, ReceiveText word wrap and TransmitText word wrap b5933cd: Bug fixes - 3.04BM Fixed --config-dir failure on MS Changed qso clear to only clear the search field on logbook dialog 12011e6: Update i18n 5391018: Organize HomeDir contents Create HomeDir Create HomeDir/rigs Create HomeDir/scripts Create HomeDir/palettes Create HomeDir/logs Create HomeDir/images Create HomeDir/help Create HomeDir/macros Create HomeDir/temp and populate with default files. 63c9f94: Fix qso clear button bug Clear would only work with NagMe set. Corrected logic a821c17: Merge commit 'berlios/pu/sb' 0d8f8bf: Logbook text i/o bug fixes Changed all logbook text out to use CRLF convention in MS Fixed "-30" bug in text output for comment field 2008-12-22 Stelios Bounanos b1054cb: More focus fixes 0b1daf6: Fix logbook update fd277d6: Fix PSK browser crash 2008-12-21 David Freese b931124: Clear logbook fields with clear qso fields Clear both qso fields & logbook fields when the clear button is pressed. eeb334c: Display Macro-Loaded message Modified the Load Macro message behavior to display whenever a Macro file is loaded or a new one created - dependent on the state of the associated configuration item 75096a9: QSO log focus fixes Fixed Enter refocus inhibit for Loc field Fixed refocus inhibit under certain conditions for Call field 554d5e1: Logbook browser focus Restore focus to the logbook dialog browser whenever a button control on that dialog is pressed. 37022f7: Save modified Macros Added test to save modified macros before opening a new file 75b3a5a: RTTY bug fix Fixed improper echo of Unshift-On-Space characters 3cb0709: Correct logbook-table-widget focus 2afd96a: Fix restore focus from log fields Create configuration item for upper case call field 2008-12-18 Stelios Bounanos 8353e8d: Update i18n 1909b75: Miscellaneous UI changes f524c3f: Change FText menu handling a9459df: Remove contest menu 433a3c5: Fix PSK viewer crash 708ac48: Fix logbook update 54aad83: Fix ADIF format check a0efbd2: Fix waterfall cursor and marker 9733920: Add FLDIGI_BROWSER check e767b68: Fix logbook selection colour 8e1ef5a: Fix QRZ lookup type enum fc55afb: Auto-update log fields 5a57c5f: Fix callsign info tooltip 17530a4: Add locator functions 2d7b21e: Add missing va_end 99aa2cc: Update po files 7f77ba6: Add FText country information tooltip f7fee0b: Add preliminary contest country file support eef48e7: Add Fl_Input2 up/downcase key bindings e7a6812: Fix mode status button 7e368b2: Change Olivia status fields f498b19: Fix log timer 2008-12-10 David Freese 98e63fc: Modifed search routines for psk viewer 2712de8: QRZ callback modification 9728d0d: Add fixed field text report generator for logbook b51ef6c: Add .,;| to white space characters for word capture in Rx pane 5d305c9: Macro tag changes 5af4ad7: Logbook field transfer bd3a8a2: Logbook file open/close changes c2764f0: Changed logbook text export to tab delimited format 924b2b7: Added time_on field to the logbook 88e0ad0: Split state/county into state country fields 6cffd9a: Replaced Olivia Freq: nn.n with Tones/Bw in status2 widget d3cbe49: Changed fldigi.log to fldigiYYYYMMDD.log, always append 6a3908e: Added macro tag - clar Rx pane b92ea21: Added dup field, time-span in minutes to duplicate QSO testing 154952f: Add rudimentary contest functionality 163acfe: Use global confirm-save option for logbook 59984e7: Use filename in logbook window title 83b453f: Invert logbook search 7c0e283: Add logbook status preferences 2008-12-04 Stelios Bounanos c609e29: Add FText double-click option 2008-11-29 David Freese 5854931: Add tab color configuration item 2008-11-29 Stelios Bounanos 0877675: UI update 2008-11-29 David Freese 9333ae1: Fix waterfall buttons 4b53a7c: Fix QRZ lookup 2008-11-26 Stelios Bounanos 80f43f6: Delete carriage returns 2008-11-26 David Freese aef541e: Add fl_logbook 2008-11-26 Stelios Bounanos 2b79053: Update fldigi-shell 3d6f7bb: Add Fl_Input2 5077ca6: Hamlic changes 0aa3c19: Improve make_pixmap 6013b15: XML-RPC update c3814bc: Add NLS support cc36776: Merge with upstream 1f6e9c6: Upstream version 3.04BE dea0ee9: Upstream version 3.04BD 690daad: Add spotting c8a6ae1: Add UDP socket support 984bf8b: Add simpler RE class 91cf6d1: Merge with upstream edc3049: Upstream version 3.04BC 8960485: Upstream version 3.04BB 2b19fba: Upstream version 3.04BA 315a3af: Upstream version 3.04AZ fca79b4: Upstream version 3.04AY 047e8bb: Improve hamlib support d32a86e: RE class changes 3eeb639: Fl_ComboBox changes 15e7c2f: Toggle menu icons at runtime 37b38e1: Fix MFSK image menu item 5639f4b: Fix FTextView text lookup 71b9b48: Clean up callsign search code 7013c62: Frequency list fixes 73e082b: Add icons option 64cbeeb: Merge with upstream 6b1c297: Upstream version 3.04AX 9a0fadc: Fix wfall/rxtext links 704cfd6: Fix IZDT time format c452607: Restore wfall wheel/qsy step 8536587: Add QSO data mouse binding 5eda8b6: Add RX text and waterfall links a0af30f: Add more icons 685f7df: Fix combo browser label 47a6249: Merge with upstream d821185: Upstream version 3.04AW 1ed76f0: Upstream version 3.04AV 2114401: Upstream version 3.04AU 9461dc6: Upstream version 3.04AT dfa8465: Upstream version 3.04AS a5062ae: Upstream version 3.04AR 4055594: Upstream version 3.04AQ f22ce65: Upstream version 3.04AP 9a161f1: Upstream version 3.04AO 096e1eb: Upstream version 3.04AN 21f16cb: Improve config performance fa4ff95: Fix window resizing on OS X 2d9f7bb: Fix a memory leak 3bc4b6e: Merge with upstream 4709ddb: Upstream version 3.04AM ce8c638: Simplify xml config 7d2ea0d: Merge with upstream 09b75d7: Upstream version 3.04AL e8ecf2a: Update ChangeLog 0c5b18c: Add log format check Fix some LOG calls that were passing the wrong type/number of args dd121fc: Rewrite xml config 00af730: Add scope dock option c41749c: Handle deprecated args better Also remove unused --experimental switch 731c7a5: Fix signal handling * Add generic functions to save and restore the disposition of all signals, and use these to remove the handlers installed by xmlrpc's abyss server. e9ddc8f: Add licence notices (thanks to Stephance F8CFE for the reminder) Tweak About dialog html 62b901f: Rewrite change_modem_param Add new config menu for waterfall mouse-1 handling 09fde4d: Add default qsy arg b4a7e32: Add mode group ids 61f04d6: Merge with upstream 53e71e8: Upstream version 3.04AK 87aa9d5: Upstream version 3.04AJ 685298d: Add fldigi-shell time command f0195d4: Unclutter title bar cd5a338: Reduce min window height ec83b17: Add thread checks 1c9f450: Fix log clear Ask confirmation when trying to exit without saving the log 629014d: Fix wfall cursor freq dae8995: Change winapi precedence 5e3df23: Add update check aa7d7bf: Fix XML-RPC error handling 5553466: Add HTTP URL fetching 0bc58ae: Fix re_t substring matching Delete extra copy of adjust_port() Remove includes from serial.h 9e71ac0: Merge with upstream b446088: Upstream version 3.04AI 8421e49: Upstream version 3.04AH 00fab81: Upstream version 3.04AG 70e44b5: Upstream version 3.04AF 69f4c90: Upstream version 3.04AE fbbcae1: Upstream version 3.04AD 448b34b: Add wfall mouse options d4af3d6: Add qsy function 2d67994: Add rig control freq entry 322af76: Merge with upstream af5d499: Upstream version 3.04AC e759dc7: Qrunner updates Read from pipe/socket before executing queued callbacks; improves performance and avoids some recursive dequeueing with REQ_FLUSH Change REQ_FLUSH to take a thread argument Flush the trx thread in init_modem_sync e944abb: Remove fl_thread wrappers 667f672: Add thread signal handling Send SIGUSR2 to interrupt xmlrpc and arq_socket threads Restore the default signal disposition for various signals handled by xmlrpc-c's abyss server 3c560ae: Add simple XML-RPC access control Also add --xmlrpc-list switch 84b1052: Simplify XML-RPC error handling 5332a87: XML-RPC fixes Use REQ in Main_set_sb and Log_set_call e23803a: Merge with upstream 5476c0e: Upstream version 3.04AB 9cfa079: Upstream version 3.04AA eda3c52: Upstream version 3.03 03be0d1: Upstream version 3.03AP 94606ed: Upstream version 3.03AO 69c8fad: Revert "Use fl_open_uri" a428fc4: Sound fixes 8496ca7: Merge with upstream 2b352bc: Upstream version 3.03AN 78c6ec9: Use arg in src speed test baeac6a: XML-RPC fixes d71a69d: Fix FLTK m4 macro 64de50d: Merge with upstream 28abb21: Upstream version 3.03AM 4975a5d: Upstream version 3.03AL b2401dc: Fix SoundPort log message 1044be3: Leave room for OS X resize handle 2008-09-08 Leigh L. Klotz, Jr d4c7b87: Add history replay option 2008-09-07 Stelios Bounanos 4d3d189: Improve serial port discovery a46526a: Merge with upstream aff666d: Upstream version 3.03AK 91eac1e: Upstream version 3.03AJ f395464: Add default event handler 82296f1: Disable mouse cursor hiding f3d895e: Increase default window width d70089b: Use fl_open_uri bcbd701: Update build system Rename OS X app bundle directories Use correct ld switch to link hamlib statically on Linux 1d42855: Use REQ in start_tx 4b41ce0: Merge with upstream eab55d5: Upstream version 3.03AI 3cdd282: Upstream version 3.03AH 3e3c2d1: Don't leak fds 0508eb7: Use regex class in PSK viewer c862e82: Update regex class 4c1620c: Save MT63 settings 70faa12: Minor sound fixes Fix "device not found" message On Linux, a PortAudio device has zero channels if it's busy; omit that check for other platforms. efe8140: Merge with upstream db64583: Upstream version 3.03AG 67bec3d: Upstream version 3.03AF ba3a9ea: Fix FTextLog menu handler 581aad2: Display mixer slider values b653a7b: Redo colours/fonts dialog Add colorsfonts.fl Change font browser to use colour chooser Correctly set text attributes to handle dark backgrounds 05fecac: Merge with upstream fba29c0: Upstream version 3.03AE 6af1a4b: Upstream version 3.03AD f72c727: Fix MFSK TXspp assignment 0427298: Set tooltip font 6561c6e: Update build scripts dd548b2: Socket fixes 035df1e: Sound fixes 97535c2: Event log changes 8e7d123: Merge with upstream cf09423: Upstream version 3.03AC ab26ef2: Upstream version 3.03AB 0e26dc9: Upstream version 3.03AA cb7f27e: Use event logging 5a8db7f: Add event logging 079be64: Fix FLTK detection 9ef3390: Merge with upstream a0418bc: Upstream version 3.02 8137b8b: Upstream version 3.02AC 61bfa81: Upstream version 3.02AB a7f4c61: Fix OS X help menu Also set font used by fl_message e0e49d0: Convert serial port names on win32 49c2876: Add simple regex class 8edc6a5: Update build scripts Add a script and Makefile target to relink fldigi with a static hamlib c725580: Merge with upstream 594e70d: Upstream version 3.02AA 05dc247: XMLRPC updates Add an rpc method to call macros Add the fldigi-shell Perl client c6c32aa: Replace some sem calls e4a45ba: Merge with upstream 2c52ee8: Upstream version 3.01 b615c8a: OS X compatibility Use 127.0.0.1 instead of localhost Define AI_NUMERICSERV to 0 if undefined Do not use the non-POSIX MSG_NOSIGNAL send flag 20689b8: Merge with upstream 3f7b2d6: Upstream version 3.0 95d5786: FText updates a5a71ae: ARQ fixes 985ce14: Fix image library detection 1b38e53: Merge with upstream 9b6c05b: Upstream version 3.0rc2 5785372: Upstream version 3.0rc1 becd3f7: Add arq/tcp cmdline switches 9b3f7fa: Merge with upstream 00b140e: Upstream version 3.0preAD 316e536: Repo maintenance 238b61b: Repo maintenance bb1c170: Upstream version 3.0preAC 3238fc4: Socket fixes c9cbbf5: Switch to Socket 1c69e51: Add new socket class a890242: Add fake sem_timedwait Also, use named semaphores on OS X 9444527: Add fake clock_gettime 49097a5: Add new search_libs m4 macro d8ac507: OS X build fixes 1613204: Merge with upstream 940642e: Upstream version 3.0preAB 1813c00: Upstream version 3.0preAA 785c504: Plug memory leaks 487ad66: Merge with upstream e08fd30: Upstream version 3.0preZ 325bdde: Upstream version 3.0preY 45294ab: Upstream version 3.0preX e3fe8af: Improve clock_gettime detection Also use the monotonic clock, if available, in the samplerate speed test function. 6e7ea86: Merge with upstream 29d5fe6: Upstream version 3.0preW ba91adf: Upstream version 3.0preV 9e7aa56: Fix FText kb focus d92e346: MFSK fixes e30e06c: Merge with upstream b15f821: Upstream version 3.0preU 7675123: Add image drag/drop support Also fix a couple of memory allocation bugs 64a30ca: Merge with upstream 697650a: Upstream version 3.0preT 467a057: FText drag/drop 350a099: Update RSID f8fcfa6: Fix xmlrpc logging 5c2d8f4: Deactivate AFC/Rev buttons 58fcf3b: Modem cleanups 93bd605: Merge with upstream 9da69cb: Upstream version 3.0preS 9f8298a: Upstream version 3.0preR 7205cac: Upstream version 3.0preQ a577acc: Upstream version 3.0preP 8184651: Update help 2004446: Fix sample rate menu update 7468baa: Fix Store button 7a21d60: Convert trx REQ_SYNC calls d7a25cb: Delete old textview code 4c5839d: Add some missing changes 466529d: Merge with upstream ea4bb7d: Upstream version 3.0preO 38e9249: Upstream version 3.0preN cd32c9d: Fix kf_cut/copy/paste calls de1a0a1: Merge with upstream fb1d570: Upstream version 3.0preM d7a6eb5: Upstream version 3.0preL 04f81ee: Add Show Config menu item 70f558c: Cosmetic GUI changes 47cbab3: No PSK snr/imd clearing 1ec31cb: XML-RPC updates for RSID 730c8e2: RSID fixes f613c04: Fix tune audio glitch c8fe003: Change AFC/SQL toggle buttons 2676fdb: Add speed test 194a18e: Merge with upstream 09a5ed9: Upstream version 3.0preK 1beac0a: Upstream version 3.0preJ 84e495e: Update INSTALL d778161: Cache waterfall cursor type 40b9128: Disable FLAC on win32 96cb846: Fix distcheck dbf6efc: Merge with upstream dd8dd9e: Upstream version 3.0preI 38c152a: Upstream version 3.0preH 78ed492: Use one channel capture 4591980: Update configure summary 9c06cc2: Sound config updates 610016b: Merge with upstream a684c41: Upstream version 3.0preG d6976e3: Hamlib fixes 0f9fe52: Add waterfall PAUSE speed ed2224f: Add waterfall scope lines 78e4434: Merge with upstream 5654250: Upstream version 3.0preF 3a76af9: Upstream version 3.0preE 8fdb1e2: Upstream version 3.0preD b9a4d5e: Warn about invalid REs Colour the Find field text red if the pattern is not a valid regular expression 6f36cdc: Merge with upstream 21d352f: Upstream version 3.0preC 4cc73f0: Upstream version 3.0preB 6a79318: Upstream version 3.0preA 69039e4: Fix Ftext ASCII char insertion 0fc80b3: Html help corrections 7bea959: Use conditional for xmlrpc args 5bf2a93: Merge with upstream f379ad5: Upstream version 3.0pre1 1c7bb9b: Misc. speedups c7cd457: Simplify qrunner 7237b89: Merge with upstream 92ebc3e: Upstream version 2.11AU f1c4906: Add status dimming 838fd3f: Safely resize audio buffers Add a pause state for the stream_process, and also rewrite its state handling code 4baeaff: Correctly handle audio timeouts The samplerate API specifies that the read callback must return 0 to indicate that there are no more frames, but it seems that the frames pointer must also be set to NULL. f8fcb0e: Delete redundant sound_update calls 021237f: Default to PortAudio b33829f: Simplify the status timeout callbacks 306ad44: Fix generation of html audio info 5208be6: Fix mode status cycle order Move THOR mode_info definition below RTTY in order to be consistent with the Op Mode menu. Comment out TSOR enum to restore correct cycle order in both directions. 3f3e3a0: Arg handling fixes Correctly check for the option argument being part of the option name. Gracefully shut down when --exit-after is given. Remove string_wrap, which is no longer required. 7dd4259: Merge with upstream 04962dd: Upstream version 2.11AT 7f835d1: Upstream version 2.11AS 411e1c8: Upstream version 2.11AR 416670d: Fix sample rate probing It seems that PortAudio/ALSA streams may misbehave when Pa_IsFormatSupported is called for a device that has already been opened for I/O. Probe for supported sample rates in both directions for each device and cache the results. ca7f9c3: Merge with upstream e1bdfc5: Upstream version 2.11AQ 7e4a7f5: Upstream version 2.11AP fc13288: Upstream version 2.11AO 3fc69d9: Upstream version 2.11AN 1887bd8: Upstream version 2.11AM 08bb927: Upstream version 2.11AL 582f275: Delete unused modem instances a7010f8: Merge with upstream 2dedd02: Revert changeset 3e3e5628512e cab9ff8: Upstream version 2.11AK eb5bd6f: Upstream version 2.11AJ a3a1775: Fix a cxx error and warning cdb43fa: Make PortAudio the default backend ee5471d: Use conditionals for audio backends 699c2dc: Default to medium src converter e5a7193: Improve audio device info Show supported sample rates in Audio device info help text Only show supported rates in sample rate menus 6203c6f: Add audio info help ea25978: Fix mfsk error w/o jpeg support 852f585: More XML-RPC fixes 2b9d738: Update XML-RPC Check for bind errors and don't try to start the server if the address is already in use. Call REQ directly inside methods to avoid two REQ calls. Add a modem.get_names method. f43b23c: Update m4 macros Simplify pkg-config.m4 and make sure that pkg-config can be overridden by setting CFLAGS & LIBS variables. Likewise for xmlrpc.m4. Also add static switches around xmlrpc linker flags when --enable-static has been specified. ba1dcae: Merge with upstream 713f7e1: Upstream version 2.11AI 3de19b6: Undo Thor damage 1232776: Merge with upstream 6b81b37: Upstream version 2.11AH e3ab3bd: Add xml-rpc support 63bc32a: Update README 7ecc8de: Save rigctl window size e48851b: FText CR/LF fixes Add CRs to saved files on win32. Use a more efficient way of stripping CRs when loading a file. 29b7147: Update file selector Allocate File Chooser object on the heap to get the right font size. Use a new thread on win32 to avoid blocking FLTK. 2eaf504: Retouch confirmation dialogs 58a1021: Remember phasescope mode a96e72a: Merge with upstream ff356e0: Upstream version 2.11AG bbcea9d: Upstream version 2.11AF ed054eb: Upstream version 2.11AE 6aa0e8a: Upstream version 2.11AD 7a0668b: Fix pkg-config m4 macro a3f7837: Merge with upstream 66da44c: Upstream version 2.11AC ffc692c: Upstream version 2.11AB 625e8b0: Fix crash with missing mixer device b202135: MFSK fixes Initialise stopflag. Clear txpic widget before loading a new picture. 850524f: Fix DominoEX/DEX warnings Also use std::map for MuPskSec2Pri lookup 9fa0823: Merge with upstream 7c2464d: Upstream version 2.11AA 6958a88: Update fileselector Remember, and default to, directory of previous open/saveas call. 8f0239b: Use fileselect filter values 709afd2: Use the src callback API 632e1f4: Update PulseAudio code 713c493: Use PortAudio extensions f9e1da5: Stacktrace updates Don't print the stack and version information twice when a signal is caught. Cosmetic changes to the output text. c013c16: Use Fl_Preferences for the status 4828cbc: Merge tags 34adb84: Add tags f75b412: Merge with upstream 8954ca2: Upstream version 2.11Z 621e050: Upstream version 2.11Y d15cb1b: Upstream version 2.11X 6e4a8be: Upstream version 2.11W 717adb3: Upstream version 2.11V 6f2d342: End all threads before exiting ed339d9: Use unnamed semaphores Also check for zoh/linear converters by enum name 92fa4ad: Merge with upstream fb87343: Upstream version 2.11U 967748d: Upstream version 2.11T e8ccd4c: Merge with upstream 92268e3: Upstream version 2.11S d970311: Merge with upstream fffcb82: Upstream version 2.11R 1ffd240: Upstream version 2.11Q c4a07ca: Upstream version 2.11P 754dd4b: Fix image flags 23d04ea: Merge with upstream 388a805: Upstream version 2.11O 057ce3e: Sound callback d27136d: MFSK and images changes 7fc3d5d: Close handler changes 8a61ea7: Add resampler options 34b82fa: Adjust cmdline args 9b82166: GUI fixes e6a86f8: Merge with upstream 22aef1b: Upstream version 2.11N d5b8fec: Upstream version 2.11M 226e560: Add PNG save support c85ee8d: GUI updates 6f289ee: Merge with upstream ded087d: Upstream version 2.11L fd25a62: Redirect streams on win32 f1e86c8: Fix online help on win32 56e2643: Add optimisation switches c0bd551: Merge with upstream 2f3f30a: Upstream version 2.11J 03f2569: Upstream version 2.11I a3cc8f8: Upstream version 2.11H 35e95f3: Merge with upstream 21dab83: Upstream version 2.11G e927d0d: Merge with upstream fd4a644: Upstream version 2.11F 0ffc020: Sound file i/o fixes 00add72: trx/sound fixes 8764fa6: Add check for jpeg header Also update the INSTALL file ceb418c: New file chooser 19514d3: Merge updates 674a4c4: Merge with upstream 067cda0: Upstream version 2.11E 3085c26: Close PA/MME devices after TX 8449e4f: New sound_init 897e3fa: Add cygwin support 43f3252: Merge with upstream ecb383b: Upstream version 2.11D b58de4f: Update EXEC macro Delete the trailing new line of the external program's output Add the scripts dir to the front of PATH 7cd2cdd: Add macro bar mwheel handling 23a8a17: Merge with upstream 3c662b8: Upstream version 2.11C ccaf1c4: Delete fast text widgets a0e78c0: Delete libsamplerate 48ec6e1: Fix sound_init crash This would happen with an empty progdefaults.OSSdevice (e.g. new install) on a system without OSS devices. 2088a09: Fix MODEM macro hang in tx Also remove unnecessary REQ_FLUSH in btnMem_cb() ab887ad: Add EXEC macro 2865170: Merge with upstream d725f09: Upstream version 2.11B 090c39f: Upstream version 2.11A cf7ed30: Correctly calculate src_ratio 267e0cc: Merge with upstream 6d97a4e: Upstream version 2.10 5bf735c: Sound fixes Call Close() before returning from trx receive exception handler Use same code to calculate receive src_ratio in resample() and src_data_reset() 9988143: Merge with upstream 122cac9: Upstream version 2.10Z 78fc915: Upstream version 2.10Y fbf2bf4: Add shortcut to cancel xmit 3b1e084: MODEM macro fix Add REQ_FLUSH call to make sure that waterfall::opmode has been run before returning from init_modem_sync. dc33a16: Use region in rx menu dbc40df: Merge with upstream cdb15b0: Merge with upstream 768e509: Upstream version 2.10X 6a33924: Merge with upstream 202f5e2: Upstream version 2.10W bca62e6: Upstream version 2.10V a880609: Fix MODEM macro 9a5ba8c: Use correct squelch var d2855a2: Merge with upstream 86956a2: Upstream version 2.10U 08792eb: Wfall/viewer freq paste 659331f: RMB audio history playback Also prevent playback when dragging, and restore kb focus to the transmit text widget f1da5bb: Adjust FText styles f7bc45e: Correct Olivia defaults 080d1be: Enable extended chars 4030253: Sound init error checking Also restore Close() calls for OSS 0bd5796: Hide mixer frame correctly eead0fc: Viewer freq paste shortcuts e039251: Merge with upstream ec3aa38: Upstream version 2.10T 68936c6: repo maintenance 82fd857: Merge with upstream c2dab0a: Upstream version 2.10S ae04415: Merge with upstream 92d6b34: Upstream version 2.10R 42ca178: TX font config 3c4499f: Alt. macro button 366a2e2: repo maintenance 2463e32: Merge with upstream 91c260f: Upstream version 2.10Q 6f162db: Merge with upstream cdcdc6c: Upstream version 2.10P 45138e9: Add missing config.h include Also add a missing xclass call and test script 0d2312d: Fix arg parsing bc04b07: Merge with upstream 63c4ec3: Upstream version 2.10o 7d8684b: Merge with upstream 2b68f11: Upstream version 2.10N cce24a1: Stream init fixes 18007fe: Add OS X app bundling support Also add support for building OS X universal binaries, define version macros and variables, and update the INSTALL file. f4f7fd0: Merge with upstream b4bd006: Upstream version 2.10M 9cb9881: Merge with upstream b295c0f: Upstream version 2.10L 8bd46f1: Merge with upstream 2871823: Upstream version 2.10K e5476cb: Separate in/out snd dev support Also add a SoundNull backend and rework sound configuration c6d01b5: Callsign query clean-ups 018d0a7: Merge with upstream ac64df5: Upstream version 2.10J d3f234b: Merge with upstream f30ffbf: Upstream version 2.10I a867b0f: Merge with upstream 8261f98: Upstream version 2.10H f80acc9: Merge with upstream 4177365: Upstream version 2.10G d666214: Sound interface changes 981bedf: Correctly calculate ncount 13d3c24: Merge with upstream 6aac6bc: Upstream version 2.10F 3dce149: Refactor configure.ac 6bea093: Add PulseAudio support 501fa5e: Add REQ_DROP bc4ff95: Use default audio dev Also remove the deprecated --sample-rate switch 8a755f9: Merge with upstream 2e12ab4: Upstream version 2.10E 352a2cb: Merge with upstream a458af5: Upstream version 2.10D 923a0b0: Add macro to change modem Also rearrange the macro list in the editor into groups and add separator lines. d5934f0: Merge with upstream 7e3d8b2: Merge with upstream 66bbde2: Upstream version 2.10C ccd970f: Upstream version 2.10B d91b591: Add check for -rdynamic support Also add calls for the build, target, host macros. 38eb18d: Correctly calculate number of samples ea32601: Resolve name clashes on OSX (2) Rename sound classes to avoid a conflict with an enum named cSound and defined in a system header on OSX: cSound -> SoundBase, cSoundOSS -> SoundOSS, cSoundPA -> SoundPort cMixer -> MixerBase, cMixerOSS -> MixerOSS Also enable MixerBase ctor & virtual dtor, and delete some old comments in the SoundPort declaration. f8a2c08: Resolve name clashes on OSX (1) de23739: Rename Config files Config.{fl,h,cxx} -> confdialog{fl,h,cxx}. This ensures that there will be no ambiguity between Config.h and the autogenerated config.h on case-insensitive but case-preserving filesystems. 7b5254d: Add fluid target 2fc3659: Disable pixmap icon on OSX fc9477a: Make OSS optional Split cMixer into base class and OSS implementation. Add configure.ac macros to detect OSS and disable cMixerOSS and cSoundOSS. Hide volume sliders if OSS is disabled, or if we are not managing the mixer. cffd639: Use HAVE_REGEX_H in psk viewer d8304ae: Use a rb for audio history 3248b76: Merge with upstream a137030: Upstream version 2.10A 2599113: Merge with upstream a915633: Upstream version 2.09 575c17f: Upstream version 2.09K 83a8d00: Upstream version 2.09J 12b1d68: Fix argument handling Long arguments without a space (--opt=arg) now work correctly. Also, move sound initialisation to a separate function, add an undocumented --exit-after SECONDS argument, and update mkversions.sh to include CXXFLAGS in the --version output. 795ac21: Merge with upstream e2083f2: Upstream version 2.09I 1c8dac9: Merge with upstream bf19d9d: Upstream version 2.09H 1a78967: Merge with upstream 4151988: Upstream version 2.09G a60ca6e: Merge with upstream c836b73: Upstream version 2.09F 4c06b83: Merge with upstream c57b411: Add regex support Add a beep button. Insert "@." when resizing Set inpSeek to constant width font Extend character range to include { | } ~ ad9f2d6: sprintf considered harmful Also fix a bug in putadif() where strings longer than the max field size would be truncated to one less than that size. Add a configure-time check for snprintf and vsnprintf because flstring.h looks for HAVE_SNPRINTF and HAVE_VSNPRINTF c40dccc: Upstream version 2.09E 58839a1: Adjust PSK Viewer colours Also set window class and insert end-of-formatting char 2eecd2e: Upstream version 2.09D 41e003e: Merge with upstream bcecfe4: Use sndfile C API Also add .au support ead061f: Fix unchecked retval warnings c3d55a6: Fix for sync AM rig modes These are new in hamlib 1.2.6. We could require >= 1.2.6 in configure.ac, but then we would make packaging difficult on Debian stable (etch) for no good reason. c5a7064: Upstream version 2.09C f558295: Upstream version 2.09B b18ab16: Upstream version 2.09A 2736cb7: Upstream version 2.09 (alpha) d4ad637: Upstream version 2.08 398f3a3: Enable std-options With this automake option, "make distcheck" will also require the binary to write text to stdout and exit with code 0 when called with --version and --help. This way we get a free (but fairly basic) runtime check. Also, use the AC_COPYRIGHT macro instead of a comment. 9d5187b: HTML/cmdline help changes 0bb60b2: Makefile freebsd compat. On FreeBSD include files for portaudio-1 are in /usr/local/include/portaudio include files for portaudio-2 are in /usr/local/portaudio2 similarly for the libs. 4d72d2b: Merge with upstream 34f68be: Upstream version 2.08G 1d0eee3: Remove freqlist hscrollbar bd87ef5: Rigdialog changes Make the window shrinkable, and also add a mouse shortcut to replace items in the frequency list. Update tooltip. ed02583: Clean up min/max macros 70de915: Merge with upstream 3756b2e: Upstream version 2.08F c410ff8: Remove .desktop Encoding 5055180: Fix freq/mode selection Setting some rig modes may also change the frequency; set the rig mode first c2f7689: Retry PA/OSS errors 67c2c69: Audio playback fix Do not apply the receive mixer volume to the audio samples read from files when the mixer is disabled. 0a0e322: Rig dialog changes Display saved rig mode, digital mode, and wfall carrier in the rigcontrol window frequency list 2ecb922: DominoEX bug fix Fix a decodesymbol() loop that was accessing memory below the start of symbolbuf 86d89d0: Use correct check for OSS This only affects error printing when PortAudio/OSS returns with an "Unanticipated Host Error" c77b1e6: Add some help items 8d87607: Cosmetic changes to rx menu 3f10b9f: Squeeze wfall controls 7e7e2aa: Hide QRZ password 15ee11a: Clean up QSO frame 5f366be: FTextEdit paste fix f673947: Update INSTALL file 792b6b5: Merge with upstream 580cc21: Upstream version 2.08d 73fde2a: Use execvp 4cbfa4b: Add Olivia settings ba64201: PSK bug fix Initialise s/n and imd variables 99c0d57: Throb bug fix Plug a memory leak caused by using the wrong delete operator e6a0caa: CW fix Initialise usedefaultWPM in ctor to avoid valgrind warning about conditional jump depending on access to uninitialised memory 220c41f: MFSK bug fixes Set some variables to avoid accessing uninitialised memory. Initialise interleave table with 0s; the original gmfsk code used g_new0 to do this. This avoids another access to random bits. Fix memory leak by creating the small syms array on the stack. Initialise symbolpair[] with 0s in ctor to avoid vargrind warnings a30e84f: Olivia bug fixes Set smargin and sinteg to avoid access to uninitialised memory Also set lastfreq to 0 in ctor to avoid valgrind warnings d3ff0ad: Fix key bindings loop 642e636: Add debug_exec 8cb6ccb: Print host API errors 0d934ee: Stacktrace updates Kill a newline in Aborting... message Skip pstack's own frame when printing stack trace 904e7f4: Add selectFreq delay f2bdf7a: Add #if USE_PORTAUDIO check 5f4ea06: Merge with upstream 60d3b3d: Upstream version 2.08c e1e2307: Mention Native sample rate 09e2589: Add .desktop, move icons to data/ configure.ac updates Thanks to Steve Conklin for the .desktop file and the Makefile.am patch 8a89e64: Set locale only for LC_TIME 37cddb3: Update README fb86586: Set default cursor for popup f88e559: Merge with upstream 5eeb184: Upstream version 2.08b 24a1f89: Remove mention of TLS 4ac6ad0: Upstream version 2.08a 341dd6c: No sigsearch on RMB release ce52dd1: Add Native sample rate 0dc1e23: Use std::bind if available d3849ae: Switch cSoundPA to the C API d329548: Merge with upstream b237fd6: Copy CXXFLAGS to CFLAGS 9662164: Correctly initialise CW modem e3d1e16: New ringbuffer, misc. utilities 635f3d1: Add TLS autodetection 3f0701c: Upstream version 2.07 6843d69: Merge with upstream 0a1dab2: qrunner updates Rename QUEUE to REQ and delete CMP_CB 7ed4274: Merge with upstream 93ded34: Upstream version 2.06 cda31bd: Merge with upstream 3cc681c: Upstream version 2.066 c7088d9: rigsupport.cxx fixes 60c9060: Merge with upstream f036259: Upstream version 2.065 b7dd1c0: Move Audio under Files 77e315c: hamlib.cxx fixes 05f035b: Default to NONE when adding new freqs 5c8680a: Merge with upstream 4e28274: Upstream version 2.064 5ce658a: Add more date macros 50c99e9: Merge with upstream fbe33b9: Add digiscope mwheel handling 14939ae: Remove adjuster widget 67889b7: More tweaks 2605fca: Set opMODE in selectFreq 74f3842: Don't copy freqlist to cout c8633a8: Upstream version 2.062 133664e: Add cast to adjFreq callback e33f12f: New stacktrace code 8dae0d9: Rigcontrol dialog changes 023e1f3: Fix g++-4.3 errors and warnings 38a677e: Fix new assertions 80f6f30: Remove extra includes 606a047: Merge with upstream 17e5dc5: Upstream version 2.06 (alpha) a785448: Compiler fixes e7795ef: Merge with upstream 131f09c: Upstream version 2.05 4aba0d5: Upstream version 2.05d 13f5c88: Add M clear shortcut 4b322bc: More status button tweaks The mouse wheel now cycles through the modems in the same order as they appear in the main Op Mode menu 5b44ca2: Analysis: put_MODEstatus in rx_init caa3e3e: Merge with upstream e229f28: Upstream version 2.05c 161112b: Fix btnMem mouse2 handling 72099f4: Fix waterfall marker drawing The markers may wrap around the other end of the waterfall if the AFC search range is large enough Also narrow the AFC search range and reduce the squelch threshold when the mouse wheel is scrolled down 614e601: Add a sample rate config menu Change get_best_srate to try the modem sample rate and device sample rate only Print exception messages to the status bar e5549c5: Add a waterfall Mem button Also add a mode_info structure and hence delete the modem init functions. Add a new init_modem_sync and QUEUE_FLUSH. Tweak the status button menu. 85173b9: Get rid of CRs 90ee5d5: Fix FText event handler c068900: Add an INSTALL file d1f6a29: configure.ac fixes 57b8fb9: Merge with upstream d30f0b3: Delete debugging message 4a59d66: Fall back to bundled samplerate 8684521: Make sndfile optional 4dec0c2: PA args should depend on USE_PORTAUDIO bf547e8: Upstream version 2.05b-exp 41f65cd: autoconfiscate e672295: Upstream version 2.05b fe9d142: Reset sq label; reverse mwheel direction 14f1019: Squelch label 9dad9b9: Fix cc warnings; print src version e9d1cd8: Merge with upstream 0ddcf6b: Upstream version 2.05a 6b6bd5b: Makefile updates e28b57b: Clean up; add copyright headers 8e949e8: sample-rate and frames-per-buf switches ea37d30: FLAC and sndfile comments 53b6c20: Keep the audio stream open aa71760: More waterfall hacks 4cf9874: Add clear_sent method Use this instead of clear when encountering a ^r 434634e: Merge with upstream 11af060: Upstream version 2.04e 7580a6e: Use pkg-config where possible be35436: Merge with upstream 9d1d3de: Upstream version 2.04d 1d7380d: Merge with upstream a28f2f8: Upstream version 2.04c 5031bba: Merge with upstream 587711a: Fix AFC shortcut handling 8968942: Upstream version 2.04b d23ca91: Upstream version 2.04a 2dab69f: Upstream version 2.04 (rc) c222a66: Upstream version 2.03 7de4d36: Upstream version 2.02 d00fa69: Upstream version 2.01 c075bd1: Upstream version 2.0 25b4b87: Upstream version 2.0 (rc) a9831c8: Upstream version 2.0pre2 f9e9820: Upstream version 2.0pre 436e90e: Upstream version 1.38.15 94355bf: Upstream version 1.38.14 3aee619: Upstream version 1.38.11 5872467: Upstream version 1.38.10 1e5172c: Upstream version 1.38.09 3ae308a: Upstream version 1.38.08 3c922de: Upstream version 1.38.07 6a161c8: Upstream version 1.38.06 50d02cc: Upstream version 1.38.05 c71808d: Upstream version 1.38.04 fc4caa1: Upstream version 1.38.03 fc457ab: Upstream version 1.38.02 23b6edc: Upstream version 1.38.01 4d5b9e7: Upstream version 1.37U d462140: Upstream version 1.37S 5ab32c8: Upstream version 1.37R ecd9157: Upstream version 1.37Q 48ad45e: Upstream version 1.37p 04b32dc: Upstream version 1.37o 6d4e6e7: Upstream version 1.37n cbae449: Upstream version 1.37L 6f058a2: Upstream version 1.37k 819904b: Upstream version 1.37j 6d7eb5c: Upstream version 1.37i 23860fb: Upstream version 1.37h e1efe8c: Upstream version 1.37f-exp 0872322: Upstream version 1.37e-exp c3d146d: Upstream version 1.37c-exp 52e0bb1: Upstream version 1.37a-exp df27a23: Upstream version 1.37exp 81f00f6: Upstream version 1.36e a4c5c49: Upstream version 1.36c f2e8c9a: Upstream version 1.36b 54de891: Upstream version 1.35R ffb63c1: Upstream version 1.35q a140f84: Upstream version 1.35o dcf89d5: Upstream version 1.35N 3be91c1: Upstream version 1.35M 33f4b49: Upstream version 1.35L e37ebe1: Upstream version 1.35J 9621790: Upstream version 1.34 4d5c3d4: Upstream version 1.33 fldigi-3.21.80/COPYING0000664000175000017500000010451312313064025011101 00000000000000 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 . fldigi-3.21.80/AUTHORS0000664000175000017500000000134312313064025011113 00000000000000AUTHOR: Dave Freese CALLSIGN: W1HKJ EMAIL: w1hkj (at) w1hkj [dot] com AUTHOR: Stelios Bounanos CALLSIGN: M0GLD EMAIL: m0gld (at) enotty [dot] net AUTHOR: Leigh L Klotz, Jr CALLSIGN: WA5ZNU EMAIL: leigh (at) wa5znu [dot] org AUTHOR: Remi Chateauneu CALLSIGN: F4ECW EMAIL: remi (dot) chateauneu (at) gmail [dot] com AUTHOR: John Douyere CALLSIGN: VK2ETA EMAIL: vk2eta (at) gmail [dot] com AUTHOR: Stefan Fendt CALLSIGN: DO2SMF EMAIL: stefan (at) sfendt [dot] de AUTHOR: John Phelps CALLSIGN: KL4YFD EMAIL: kl4yfd (at) gmail [dot] com AUTHOR: Andrej Lajovic CALLSIGN: S57LN EMAIL: s57ln (at) hamradio [dot] si All authors can be contacted on the fldigi-devel mailing list: WWW: http://lists.berlios.de/mailman/listinfo/fldigi-devel fldigi-3.21.80/aclocal.m40000664000175000017500000013432112313332263011710 00000000000000# generated automatically by aclocal 1.11.3 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, [m4_warning([this file was generated for autoconf 2.68. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # intlmacosx.m4 serial 3 (gettext-0.18) dnl Copyright (C) 2004-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Checks for special options needed on MacOS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in MacOS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], [gt_cv_func_CFPreferencesCopyAppValue], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_TRY_LINK([#include ], [CFPreferencesCopyAppValue(NULL, NULL)], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in MacOS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_TRY_LINK([#include ], [CFLocaleCopyCurrent();], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.3], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.3])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, # 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless `enable' is passed literally. # For symmetry, `disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful (and sometimes confusing) to the casual installer], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2009, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # (`yes' being less verbose, `no' or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [ --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0')]) case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few `make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using `$V' instead of `$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/intl/gettext.m4]) m4_include([m4/intl/iconv.m4]) m4_include([m4/intl/lib-ld.m4]) m4_include([m4/intl/lib-link.m4]) m4_include([m4/intl/lib-prefix.m4]) m4_include([m4/intl/nls.m4]) m4_include([m4/intl/po.m4]) m4_include([m4/intl/progtest.m4]) m4_include([m4/ax_compare_version.m4]) m4_include([m4/benchmark.m4]) m4_include([m4/bind.m4]) m4_include([m4/build.m4]) m4_include([m4/debug.m4]) m4_include([m4/docs.m4]) m4_include([m4/fltk.m4]) m4_include([m4/funcs.m4]) m4_include([m4/libintl.m4]) m4_include([m4/macosx.m4]) m4_include([m4/np-compat.m4]) m4_include([m4/opt.m4]) m4_include([m4/oss.m4]) m4_include([m4/pkg-config.m4]) m4_include([m4/progs.m4]) m4_include([m4/static.m4]) m4_include([m4/tls.m4]) m4_include([m4/win32.m4]) fldigi-3.21.80/README0000664000175000017500000000503312313064025010723 00000000000000Fldigi is a software modem for Amateur Radio use. It is a sound card based program that is used for both transmitting and receiving data in any of the following modes: BPSK and QPSK 31, 63, 125, 250 (both), and 63F and 500 (BPSK only) PSKR 125, 250, and 500 CW speeds from 5 to 200 wpm DominoEX 4, 5, 8, 11, 16 and 22; also with FEC Hellschreiber Feld Hell, Slow Hell, Hell x5/x9, FSKHell(-105) and Hell 80 MFSK 4, 8, 11, 16, 22, 31, 32 and 64; most with image support MT63 500, 1000 and 2000 OLIVIA various tones and bandwidths RTTY various baud rates, shifts, nbr. of data bits, etc. THOR 4, 5, 8, 11, 16 and 22 Throb and ThrobX 1, 2, and 4 WWV receive only - calibrate your sound card to WWV Frequency Analysis receive only - measure the frequency of a carrier Fldigi can also control a transceiver using Hamlib or RigCAT I/O, perform online or cdrom QRZ queries, log QSOs with the built-in logbook or Xlog, and send reception reports to the PSK Automatic Propagation Reporter. The latest version can always be found at: http://www.w1hkj.com/Fldigi.html Visit this page for extensive documentation and an archive of XML files for transceivers supported by RigCAT. The wiki page contains FAQs and HOWTOs, as well as links to all Fldigi resources: https://fedorahosted.org/fldigi/ Fldigi's BerliOS project page can be found at: http://developer.berlios.de/projects/fldigi/ The GIT repository can be found at: http://git.berlios.de/cgi-bin/gitweb.cgi?p=fldigi;a=summary For support, news and updates, join one or more of the following mailing lists and Yahoo groups. Stable releases are announced to all lists and groups; test (alpha) releases are announced to fldigi-alpha and fldigi-announce. * linuxham group General discussion on fldigi, related software and other ham radio topics http://groups.yahoo.com/group/linuxham/join * win-fldigi group For Windows users of fldigi http://groups.yahoo.com/group/win-fldigi/ * NBEMSham group Special focus on NBEMS operation http://groups.yahoo.com/group/NBEMSham/ * fldigi-alpha list Discussion of fldigi testing and related subjects http://lists.berlios.de/mailman/listinfo/fldigi-alpha * fldigi-devel list Fldigi development topics http://lists.berlios.de/mailman/listinfo/fldigi-devel * fldigi-announce list Fldigi announcements http://lists.berlios.de/mailman/listinfo/fldigi-announce fldigi-3.21.80/src/0000775000175000017500000000000012313333726010720 500000000000000fldigi-3.21.80/src/mt63/0000775000175000017500000000000012313333727011512 500000000000000fldigi-3.21.80/src/mt63/mt63intl.dat0000664000175000017500000000246412313064025013602 00000000000000/* * mt63intl.dat -- interleave patterns * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi 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. * * Fldigi 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 fldigi. If not, see . * */ // interleave pattern for the original MT63ASC (short interleave) int ShortIntlvPatt[64] = { 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7 } ; // interleave pattern for doubled interleave int LongIntlvPatt[64] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0 } ; fldigi-3.21.80/src/mt63/alias_1k.dat0000664000175000017500000001042412313064025013601 00000000000000/* * alias_1k.dat -- Anti-alias filter 1000 Hz bandwidth * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi 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. * * Fldigi 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 fldigi. If not, see . * */ // Filter coefficiants made by ALIAS.C for the following parameters: // FilterLen=64 SampleRate=8000.0 FreqLow=500.0 FreqUpp=1500.0 // PassBandLow=375.0 PassBandUpp=1625.0 StopBandLow=0.0 StopBandUpp=2000.0 // => PeakInStopBand=-90.99 dB // Programmers's scale factor: 2.000000 // Programmers's comments: Anti-alias filter 1000 Hz bandwidth, decimation by 4 const int Alias_1k_Len=64; double Alias_1k_I[Alias_1k_Len] = { +0.00003605 , // 0 +0.00001835 , // 1 -0.00022227 , // 2 -0.00079785 , // 3 -0.00099442 , // 4 +0.00032296 , // 5 +0.00276603 , // 6 +0.00365685 , // 7 +0.00128973 , // 8 -0.00107943 , // 9 +0.00195568 , // 10 +0.00914871 , // 11 +0.01100689 , // 12 +0.00254789 , // 13 -0.00580382 , // 14 -0.00014844 , // 15 +0.01341757 , // 16 +0.01123057 , // 17 -0.01328109 , // 18 -0.03176715 , // 19 -0.01791993 , // 20 +0.00579429 , // 21 -0.00986091 , // 22 -0.06425601 , // 23 -0.08967807 , // 24 -0.04429128 , // 25 +0.00513920 , // 26 -0.04459511 , // 27 -0.16886923 , // 28 -0.19065374 , // 29 +0.01930718 , // 30 +0.34486939 , // 31 +0.50345887 , // 32 +0.34486939 , // 33 +0.01930718 , // 34 -0.19065374 , // 35 -0.16886923 , // 36 -0.04459511 , // 37 +0.00513920 , // 38 -0.04429128 , // 39 -0.08967807 , // 40 -0.06425601 , // 41 -0.00986091 , // 42 +0.00579429 , // 43 -0.01791993 , // 44 -0.03176715 , // 45 -0.01328109 , // 46 +0.01123057 , // 47 +0.01341757 , // 48 -0.00014844 , // 49 -0.00580382 , // 50 +0.00254789 , // 51 +0.01100689 , // 52 +0.00914871 , // 53 +0.00195568 , // 54 -0.00107943 , // 55 +0.00128973 , // 56 +0.00365685 , // 57 +0.00276603 , // 58 +0.00032296 , // 59 -0.00099442 , // 60 -0.00079785 , // 61 -0.00022227 , // 62 +0.00001835 // 63 } ; double Alias_1k_Q[Alias_1k_Len] = { -0.00000000 , // 0 -0.00009527 , // 1 -0.00023082 , // 2 +0.00005162 , // 3 +0.00123007 , // 4 +0.00255193 , // 5 +0.00207549 , // 6 -0.00064302 , // 7 -0.00244045 , // 8 +0.00005205 , // 9 +0.00410793 , // 10 +0.00211830 , // 11 -0.00729235 , // 12 -0.01359800 , // 13 -0.00757272 , // 14 +0.00172023 , // 15 -0.00460378 , // 16 -0.02559228 , // 17 -0.03408530 , // 18 -0.01416468 , // 19 +0.00731461 , // 20 -0.00712536 , // 21 -0.04328548 , // 22 -0.04099291 , // 23 +0.01821691 , // 24 +0.06428190 , // 25 +0.02790538 , // 26 -0.03602086 , // 27 +0.01583703 , // 28 +0.22015579 , // 29 +0.40003327 , // 30 +0.32856209 , // 31 -0.00000000 , // 32 -0.32856209 , // 33 -0.40003327 , // 34 -0.22015579 , // 35 -0.01583703 , // 36 +0.03602086 , // 37 -0.02790538 , // 38 -0.06428190 , // 39 -0.01821691 , // 40 +0.04099291 , // 41 +0.04328548 , // 42 +0.00712536 , // 43 -0.00731461 , // 44 +0.01416468 , // 45 +0.03408530 , // 46 +0.02559228 , // 47 +0.00460378 , // 48 -0.00172023 , // 49 +0.00757272 , // 50 +0.01359800 , // 51 +0.00729235 , // 52 -0.00211830 , // 53 -0.00410793 , // 54 -0.00005205 , // 55 +0.00244045 , // 56 +0.00064302 , // 57 -0.00207549 , // 58 -0.00255193 , // 59 -0.00123007 , // 60 -0.00005162 , // 61 +0.00023082 , // 62 +0.00009527 // 63 } ; fldigi-3.21.80/src/mt63/mt63.cxx0000664000175000017500000001767012313064025012752 00000000000000// ---------------------------------------------------------------------------- // mt63.cxx -- MT63 modem for fldigi // // Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC // Copyright (c) 2007-2011 Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "configuration.h" #include "fl_digi.h" #include "status.h" #include "mt63.h" using namespace std; bool startflag = true; void mt63::tx_init(SoundBase *sb) { scard = sb; Tx->Preset(frequency, (int)bandwidth, Interleave == 64 ? 1 : 0); flush = Tx->DataInterleave; videoText(); startflag = true; } void mt63::rx_init() { Rx->Preset( frequency, (int)bandwidth, Interleave == 64 ? 1 : 0, long_integral ? 32 : 16 ); InpLevel->Preset(64.0, 0.75); escape = 0; } double peak = 0.0; int mt63::tx_process() { int c; double maxval = 0; rx_flush(); if (startflag == true) { startflag = false; if (progdefaults.mt63_usetones) { double maxval = 0.0; for (int i = 0; i < (bandwidth * progdefaults.mt63_tone_duration / 96); i++) { Tx->SendTune( progdefaults.mt63_twotones ); for (int i = 0; i < Tx->Comb.Output.Len; i++) if (fabs(Tx->Comb.Output.Data[i]) > maxval) maxval = fabs(Tx->Comb.Output.Data[i]); for (int i = 0; i < Tx->Comb.Output.Len; i++) Tx->Comb.Output.Data[i] /= maxval; ModulateXmtr((Tx->Comb.Output.Data), Tx->Comb.Output.Len); } } for (int i = 0; i < Tx->DataInterleave; i++) Tx->SendChar(0); } c = get_tx_char(); if (c == GET_TX_CHAR_ETX) { stopflag = true; flush = Tx->DataInterleave; } if (c == GET_TX_CHAR_NODATA || stopflag == true) c = 0; if (stopflag) { stopflag = false; while (--flush) { Tx->SendChar(0); for (int i = 0; i < Tx->Comb.Output.Len; i++) if (fabs(Tx->Comb.Output.Data[i]) > maxval) maxval = fabs(Tx->Comb.Output.Data[i]); for (int i = 0; i < Tx->Comb.Output.Len; i++) { Tx->Comb.Output.Data[i] /= maxval; } ModulateXmtr((Tx->Comb.Output.Data), Tx->Comb.Output.Len); } Tx->SendJam(); for (int i = 0; i < Tx->Comb.Output.Len; i++) if (fabs(Tx->Comb.Output.Data[i]) > maxval) maxval = fabs(Tx->Comb.Output.Data[i]); for (int i = 0; i < Tx->Comb.Output.Len; i++) Tx->Comb.Output.Data[i] /= maxval; ModulateXmtr((Tx->Comb.Output.Data), Tx->Comb.Output.Len); cwid(); return -1; /* we're done */ } if (c > 255 || (!progdefaults.mt63_8bit && c > 127)) c = '.'; int sendc = c; if (sendc > 127) { sendc &= 127; Tx->SendChar(127); for (int i = 0; i < Tx->Comb.Output.Len; i++) if (fabs(Tx->Comb.Output.Data[i]) > maxval) maxval = fabs(Tx->Comb.Output.Data[i]); for (int i = 0; i < Tx->Comb.Output.Len; i++) Tx->Comb.Output.Data[i] /= maxval; ModulateXmtr((Tx->Comb.Output.Data), Tx->Comb.Output.Len); } Tx->SendChar(sendc); for (int i = 0; i < Tx->Comb.Output.Len; i++) if (fabs(Tx->Comb.Output.Data[i]) > maxval) maxval = fabs(Tx->Comb.Output.Data[i]); for (int i = 0; i < Tx->Comb.Output.Len; i++) { Tx->Comb.Output.Data[i] /= maxval; } ModulateXmtr((Tx->Comb.Output.Data), Tx->Comb.Output.Len); put_echo_char(c); return 0; } int mt63::rx_process(const double *buf, int len) { double snr; unsigned int c; int i; static char msg1[20]; static char msg2[20]; // if (Interleave != progdefaults.mt63_interleave) { // Interleave = progdefaults.mt63_interleave; // restart(); // } if (long_integral != progdefaults.mt63_rx_integration) { long_integral = progdefaults.mt63_rx_integration; restart(); } if (InpBuff->EnsureSpace(len) == -1) { fprintf(stderr, "mt63_rxprocess: buffer error\n"); return -1; } for (i = 0; i < len; i++) InpBuff->Data[i] = buf[i]; InpBuff->Len = len; InpLevel->Process(InpBuff); Rx->Process(InpBuff); snr = Rx->FEC_SNR(); if (progStatus.sqlonoff && snr < progStatus.sldrSquelchValue) { put_Status1(""); put_Status2(""); display_metric(0); return 0; } if (snr > 99.9) snr = 99.9; display_metric(snr); double s2n = 10.0*log10( snr == 0 ? 0.001 : snr); snprintf(msg1, sizeof(msg1), "s/n %2d dB", (int)(floor(s2n))); put_Status1(msg1); snprintf(msg2, sizeof(msg2), "f/o %+4.1f Hz", Rx->TotalFreqOffset()); put_Status2(msg2, 5, STATUS_CLEAR); for (i = 0; i < Rx->Output.Len; i++) { c = Rx->Output.Data[i]; if (!progdefaults.mt63_8bit) { put_rx_char(c); continue; } if ((c < 8) && (escape == 0)) continue; if (c == 127) { escape = 1; continue; } if (escape) { c += 128; escape = 0; } put_rx_char(c); } flushbuffer = true; return 0; } void mt63::rx_flush() { unsigned int c; int len = 512; int dlen = 0; if (!flushbuffer) return; if (emptyBuff->EnsureSpace(len) == -1) { flushbuffer = false; return; } for (int j = 0; j < len; j++) emptyBuff->Data[j] = 0.0; emptyBuff->Len = len; InpLevel->Process(emptyBuff); Rx->Process(emptyBuff); dlen = Rx->Output.Len; while (Rx->SYNC_LockStatus()) { for (int i = 0; i < dlen; i++) { c = Rx->Output.Data[i]; if (!progdefaults.mt63_8bit) { put_rx_char(c); continue; } if ((c < 8) && (escape == 0)) continue; if (c == 127) { escape = 1; continue; } if (escape) { c += 128; escape = 0; } put_rx_char(c); } for (int j = 0; j < len; j++) emptyBuff->Data[j] = 0.0; emptyBuff->Len = len; InpLevel->Process(emptyBuff); Rx->Process(emptyBuff); dlen = Rx->Output.Len; } flushbuffer = false; return; } void mt63::restart() { int err; put_MODEstatus(mode); set_scope_mode(Digiscope::BLANK); err = Tx->Preset(frequency, (int)bandwidth, Interleave == 64 ? 1 : 0); if (err) fprintf(stderr, "mt63_txinit: init failed\n"); flush = Tx->DataInterleave; err = Rx->Preset( frequency, (int)bandwidth, Interleave == 64 ? 1 : 0, long_integral ? 32 : 16); if (err) fprintf(stderr, "mt63_rxinit: init failed\n"); InpLevel->Preset(64.0, 0.75); stopflag = false; } void mt63::init() { modem::init(); restart(); flushbuffer = false; } mt63::mt63 (trx_mode mt63_mode) : modem() { mode = mt63_mode; switch (mode) { case MODE_MT63_500S: Interleave = 32; bandwidth = 500; break; case MODE_MT63_500L: Interleave = 64; bandwidth = 500; break; case MODE_MT63_1000S: Interleave = 32; bandwidth = 1000; break; case MODE_MT63_1000L: Interleave = 64; bandwidth = 1000; break; case MODE_MT63_2000S: Interleave = 32; bandwidth = 2000; break; case MODE_MT63_2000L: Interleave = 64; bandwidth = 2000; break; } // Interleave = progdefaults.mt63_interleave; long_integral = progdefaults.mt63_rx_integration; Tx = new MT63tx; Rx = new MT63rx; InpLevel = new dspLevelMonitor; InpBuff = new double_buff; emptyBuff = new double_buff; samplerate = 8000; fragmentsize = 1024; } mt63::~mt63() { if (Tx) delete Tx; if (Rx) delete Rx; if (InpLevel) delete InpLevel; if (InpBuff) delete InpBuff; } // W1HKJ // user can select manual or fixed positioning of the MT63 encoder/decoder // progdefaults.mt63_at500 TRUE ==> fixed position void mt63::set_freq(double f) { if (progdefaults.mt63_at500) frequency = 500 + bandwidth / 2; else frequency = f; modem::set_freq(frequency); rx_init(); } fldigi-3.21.80/src/mt63/mt63base.cxx0000664000175000017500000011620712313064025013601 00000000000000/* * mt63base.cxx -- MT63 transmitter and receiver in C++ for LINUX * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * Copyright (c) 2007-2011 Dave Freese, W1HKJ * * base class for use by fldigi * modified from original * excluded CW_ID which is a part of the base modem class for fldigi * changed all floats to double and removed all float functions/methods * changed from int* to double* for all sound card buffer transfers * * Modified base class for rx and tx to allow variable center frequency * for baseband signal * * based on mt63 code by Pawel Jalocha * * This file is part of fldigi. * * Fldigi 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. * * Fldigi 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 fldigi. If not, see . * */ #include #include // only for control printf's // #include #include #include "dsp.h" #include "mt63base.h" #include "symbol.dat" // symbol shape #include "mt63intl.dat" // interleave patterns // W1HKJ // fixed filter shapes replaced by maximally flat blackman3 filters // that are generated as required as signal center frequency is changed //#include "alias_k5.dat" // anti-alias filter shapes //#include "alias_1k.dat" // for 500, 1000 and 2000 Hz modes //#include "alias_2k.dat" // ========================================================================== // MT63 transmitter code MT63tx::MT63tx() { TxVect = NULL; dspPhaseCorr = NULL; } MT63tx::~MT63tx() { free(TxVect); free(dspPhaseCorr); } void MT63tx::Free(void) { free(TxVect); TxVect = NULL; free(dspPhaseCorr); dspPhaseCorr = NULL; Encoder.Free(); FFT.Free(); Window.Free(); Comb.Free(); WindowBuff.Free(); } // W1HKJ // added freq paramter to Preset int MT63tx::Preset(double freq, int BandWidth, int LongInterleave) { int i, p, step, incr, mask; // W1HKJ // values used to computer the blackman3 passband filter shape double hbw = 1.5*BandWidth / 2; double omega_low = (freq - hbw); double omega_high = (freq + hbw); if (omega_low < 100) omega_low = 100; if (omega_high > 4000) omega_high = 4000; omega_low *= (M_PI / 4000); omega_high *= (M_PI / 4000); mask = FFT.Size - 1; DataCarriers = 64; switch(BandWidth) { case 500: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 256 / 500 + .5); AliasFilterLen = 128; DecimateRatio = 8; break; case 1000: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 128 / 500 + 0.5); AliasFilterLen = 64; DecimateRatio = 4; break; case 2000: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 64 / 500 + 0.5); AliasFilterLen = 64; DecimateRatio = 2; break; default: return -1; } WindowLen = SymbolLen; TxWindow = SymbolShape; TxAmpl = 4.0 / DataCarriers; // for maximum output level we can set TxAmpl=4.0/DataCarriers CarrMarkCode = 0x16918BBEL; CarrMarkAmpl = 0; if (LongInterleave) { DataInterleave = 64; InterleavePattern = LongIntlvPatt; } else { DataInterleave = 32; InterleavePattern = ShortIntlvPatt; } if (dspRedspAllocArray(&TxVect, DataCarriers)) goto Error; if (dspRedspAllocArray(&dspPhaseCorr, DataCarriers)) goto Error; if (WindowBuff.EnsureSpace(2 * WindowLen)) goto Error; WindowBuff.Len = 2 * WindowLen; if (Encoder.Preset(DataCarriers, DataInterleave, InterleavePattern, 1)) goto Error; if (FFT.Preset(WindowLen)) goto Error; if (Window.Preset(WindowLen, SymbolSepar / 2, TxWindow)) goto Error; // W1HKJ // Preset the combining instance, NULL pointers in lieu of fixed filter shapes // blackman3 filter provides flat passband and sufficient out-of-band rejection // to insure that all unwanted FFT components (periodic signal) are suppressed // by 70 dB or more if ( Comb.Preset( AliasFilterLen, NULL, NULL, DecimateRatio ) ) goto Error; // compute new combining filter shape Comb.ComputeShape(omega_low, omega_high, dspWindowBlackman3); // Preset the initial dspPhase for each data carrier. // Here we only compute indexes to the FFT twiddle factors // so the actual vector is FFT.Twiddle[TxVect[i]] for (step = 0, incr = 1, p = 0, i = 0; i < DataCarriers; i++) { TxVect[i] = p; step += incr; p = (p + step) & mask; } // compute dspPhase correction between successive FFTs separated by SymbolSepar // Like above we compute indexes to the FFT.Twiddle[] incr = (SymbolSepar * DataCarrSepar) & mask; for (p = (SymbolSepar * FirstDataCarr) & mask, i = 0; i < DataCarriers; i++) { dspPhaseCorr[i] = p; p = (p + incr) & mask; } return 0; Error: Free(); return -1; } // W1HKJ // SendTune and ProcessTxVect are both modified to allow the FirstDataCarr // to be other than WindowLen / 2 as in the original design // The peridocity of the FFT is taken advantage of by computing the positions // of the bit indices modulo FFT.size, i.e. r = FFT.BitRevIdx[c & (FFT.Size - 1)] int MT63tx::SendTune(bool twotones) { int i, c, r, mask; double Ampl; mask = FFT.Size - 1; Ampl = TxAmpl * sqrt(DataCarriers / 2); for (i = 0; i < DataCarriers; i++) TxVect[i] = (TxVect[i] + dspPhaseCorr[i]) & mask; for (i = 0; i < 2 * WindowLen; i++) WindowBuff.Data[i].im = WindowBuff.Data[i].re = 0.0; // W1HKJ // first tone at the lowest most MT63 carrier i = 0; c = FirstDataCarr; r = FFT.BitRevIdx[c & mask]; WindowBuff.Data[r].re = Ampl * FFT.Twiddle[TxVect[i]].re; WindowBuff.Data[r].im = (-Ampl) * FFT.Twiddle[TxVect[i]].im; // W1HKJ // 2nd tone at the highest most MT63 carrier + 1 // MT63 is specified as 500, 1000 and 2000 Hz wide signal format, but in // fact are narrower by one carrier spacing, i.e. 0 to N-1 carriers where // N = 64 if (twotones) { i = DataCarriers - 1; c = (FirstDataCarr + i * DataCarrSepar); r = WindowLen + FFT.BitRevIdx[c & mask]; WindowBuff.Data[r].re = Ampl * FFT.Twiddle[TxVect[i]].re; WindowBuff.Data[r].im = (-Ampl) * FFT.Twiddle[TxVect[i]].im; } // inverse FFT: WindowBuff is already scrambled FFT.CoreProc(WindowBuff.Data); FFT.CoreProc(WindowBuff.Data + WindowLen); // negate the imaginary part for the IFFT for (i = 0; i < 2 * WindowLen; i++) WindowBuff.Data[i].im *= (-1.0); // process the FFT values to produce a complex time domain vector Window.Process(&WindowBuff); // W1HKJ // convert the complex time domain vector to a real time domain signal // suitably filtered by the anti-alias filter used in the combiner Comb.Process(&Window.Output); return 0; } int MT63tx::SendChar(char ch) { int i,mask,flip; Encoder.Process(ch); // encode and interleave the character // print the character and the DataBlock being sent // printf("0x%02x [%c] => ", ch, ch>=' ' ? ch : '.'); // for (i=0; i only dspPhase correction if (Encoder.Output[i]) TxVect[i] = (TxVect[i] + dspPhaseCorr[i]) & mask; // data bit = 0 => dspPhase flip + dspPhase correction else TxVect[i] = (TxVect[i] + dspPhaseCorr[i] + flip) & mask; } ProcessTxVect(); return 0; } int MT63tx::SendJam(void) { int i,mask,left,right; int j = 0; mask = FFT.Size-1; left = FFT.Size / 4; right = 3 * (FFT.Size / 4); for (i = 0; i < DataCarriers; i++) { j = i & mask; if (rand() & 0x100) // turn left 90 degrees TxVect[j] = (TxVect[j] + dspPhaseCorr[j] + left) & mask; else // turn right 90 degrees TxVect[j] = (TxVect[j] + dspPhaseCorr[j] + right) & mask; } ProcessTxVect(); return 0; } // W1HKJ // principal change from original is modulo arithmetic used to creat // WindowBuff.Data vectors int MT63tx::ProcessTxVect(void) { int i, c, r, mask; mask = FFT.Size - 1; for (i = 0; i < 2 * WindowLen; i++) WindowBuff.Data[i].im = WindowBuff.Data[i].re = 0.0; for ( i = 0, c = FirstDataCarr; i < DataCarriers; i++, c += DataCarrSepar) { r = FFT.BitRevIdx[c & mask] + WindowLen * (i & 1); WindowBuff.Data[r].re = TxAmpl*FFT.Twiddle[TxVect[i]].re; WindowBuff.Data[r].im = (-TxAmpl)*FFT.Twiddle[TxVect[i]].im; } FFT.CoreProc(WindowBuff.Data); FFT.CoreProc(WindowBuff.Data + WindowLen); // negate the imaginary part for the IFFT for (i = 0; i < 2 * WindowLen; i++) WindowBuff.Data[i].im *= (-1.0); Window.Process(&WindowBuff); // W1HKJ // audio output to be sent out is in Comb.Output Comb.Process(&Window.Output); return 0; } int MT63tx::SendSilence(void) { Window.ProcessSilence(2); Comb.Process(&Window.Output); return 0; } // ========================================================================== // Character encoder and block interleave for the MT63 modem MT63encoder::MT63encoder() { IntlvPipe = NULL; WalshBuff = NULL; Output = NULL; IntlvPatt=NULL; } MT63encoder::~MT63encoder() { free(IntlvPipe); free(WalshBuff); free(Output); free(IntlvPatt); } void MT63encoder::Free() { free(IntlvPipe); free(WalshBuff); free(Output); free(IntlvPatt); IntlvPipe = NULL; WalshBuff = NULL; Output = NULL; IntlvPatt = NULL; } int MT63encoder::Preset(int Carriers, int Intlv, int *Pattern, int PreFill) { int i, p; if (!dspPowerOf2(Carriers)) goto Error; DataCarriers = Carriers; IntlvLen = Intlv; IntlvSize = IntlvLen * DataCarriers; if (IntlvLen) { if (dspRedspAllocArray(&IntlvPipe, IntlvSize)) goto Error; if (PreFill) for (i = 0; i < IntlvSize; i++) IntlvPipe[i] = rand() & 1; else dspClearArray(IntlvPipe,IntlvSize); if (dspRedspAllocArray(&IntlvPatt, DataCarriers)) goto Error; IntlvPtr = 0; } if (dspRedspAllocArray(&WalshBuff, DataCarriers)) goto Error; if (dspRedspAllocArray(&Output, DataCarriers)) goto Error; CodeMask = 2 * DataCarriers - 1; for (p = 0, i = 0; i < DataCarriers; i++) { IntlvPatt[i] = p * DataCarriers; p += Pattern[i]; if (p >= IntlvLen) p -= IntlvLen; } return 0; Error: Free(); return -1; } int MT63encoder::Process(char code) // encode an ASCII character "code" { int i, k; code &= CodeMask; for (i = 0; i < DataCarriers; i++) WalshBuff[i] = 0; if (code < DataCarriers) WalshBuff[(int)code] = 1.0; else WalshBuff[code-DataCarriers] = (-1.0); dspWalshInvTrans(WalshBuff, DataCarriers); if (IntlvLen) { for (i = 0; i < DataCarriers; i++) IntlvPipe[IntlvPtr + i] = (WalshBuff[i] < 0.0); for (i = 0; i < DataCarriers; i++) { k = IntlvPtr + IntlvPatt[i]; if (k >= IntlvSize) k -= IntlvSize; Output[i] = IntlvPipe[k+i]; } IntlvPtr += DataCarriers; if (IntlvPtr >= IntlvSize) IntlvPtr -= IntlvSize; } else for (i = 0; i < DataCarriers; i++) Output[i] = (WalshBuff[i] < 0.0); return 0; } // After encoding the "Output" array contains the bits to be transmitted // ========================================================================== // MT63 decoder and deinterleaver MT63decoder::MT63decoder() { IntlvPipe = NULL; IntlvPatt = NULL; WalshBuff = NULL; DecodeSnrMid = NULL; DecodeSnrOut = NULL; DecodePipe = NULL; } MT63decoder::~MT63decoder() { free(IntlvPipe); free(IntlvPatt); free(WalshBuff); free(DecodeSnrMid); free(DecodeSnrOut); free(DecodePipe); } void MT63decoder::Free() { free(IntlvPipe); IntlvPipe = NULL; free(IntlvPatt); IntlvPatt = NULL; free(WalshBuff); WalshBuff = NULL; free(DecodeSnrMid); free(DecodeSnrOut); DecodeSnrMid = NULL; DecodeSnrOut = NULL; free(DecodePipe); DecodePipe = NULL; } int MT63decoder::Preset(int Carriers, int Intlv, int *Pattern, int Margin, int Integ) { int i,p; if (!dspPowerOf2(Carriers)) goto Error; DataCarriers = Carriers; ScanLen = 2 * Margin + 1; ScanSize = DataCarriers + 2 * Margin; dspLowPass2Coeff(Integ,W1,W2,W5); DecodeLen = Integ / 2; DecodeSize = DecodeLen * ScanLen; if (dspRedspAllocArray(&DecodePipe, DecodeSize)) goto Error; dspClearArray(DecodePipe, DecodeSize); DecodePtr = 0; IntlvLen = Intlv; // printf("%d:",IntlvLen); if (dspRedspAllocArray(&IntlvPatt, DataCarriers)) goto Error; for (p = 0, i = 0; i < DataCarriers; i++) { IntlvPatt[i] = p * ScanSize; // printf(" %2d",p); p += Pattern[i]; if (p >= IntlvLen) p -= IntlvLen; } // printf("\n"); IntlvSize = (IntlvLen + 1) * ScanSize; if (dspRedspAllocArray(&IntlvPipe, IntlvSize)) goto Error; dspClearArray(IntlvPipe, IntlvSize); IntlvPtr = 0; if (dspRedspAllocArray(&WalshBuff, DataCarriers)) goto Error; if (dspRedspAllocArray(&DecodeSnrMid, ScanLen)) goto Error; if (dspRedspAllocArray(&DecodeSnrOut, ScanLen)) goto Error; dspClearArray(DecodeSnrMid, ScanLen); dspClearArray(DecodeSnrOut, ScanLen); SignalToNoise = 0.0; CarrOfs = 0; return 0; Error: Free(); return -1; } int MT63decoder::Process(double *data) { int s, i, k; double Min, Max, Sig, Noise, SNR; int MinPos,MaxPos,code; dspCopyArray(IntlvPipe + IntlvPtr, data, ScanSize); // printf("Decoder [%d/%d/%d]: \n",IntlvPtr,IntlvSize,ScanSize); for (s = 0; s < ScanLen; s++) { // printf(" %2d:",s); for (i = 0; i < DataCarriers; i++) { k = IntlvPtr - ScanSize - IntlvPatt[i]; if (k < 0) k += IntlvSize; if ((s & 1) && (i & 1)) { k += ScanSize; if (k >= IntlvSize) k-=IntlvSize; } WalshBuff[i] = IntlvPipe[k + s + i]; // printf(" %4d",k/ScanSize); } // printf("\n"); dspWalshTrans(WalshBuff, DataCarriers); Min = dspFindMin(WalshBuff, DataCarriers, MinPos); Max = dspFindMax(WalshBuff, DataCarriers, MaxPos); if (fabs(Max) > fabs(Min)) { code = MaxPos + DataCarriers; Sig = fabs(Max); WalshBuff[MaxPos] = 0.0; } else { code = MinPos; Sig = fabs(Min); WalshBuff[MinPos] = 0.0; } Noise = dspRMS(WalshBuff, DataCarriers); if (Noise > 0.0) SNR = Sig/Noise; else SNR = 0.0; dspLowPass2(SNR, DecodeSnrMid[s], DecodeSnrOut[s], W1, W2, W5); // printf("%2d: %02x => %c, %5.2f/%5.2f=>%5.2f <%5.2f>\n", // s,code,code<' ' ? '.' : (char)code, // Sig,Noise,SNR,DecodeSnrOut[s]); DecodePipe[DecodePtr+s]=code; } IntlvPtr += ScanSize; if (IntlvPtr >= IntlvSize) IntlvPtr = 0; DecodePtr += ScanLen; if (DecodePtr >= DecodeSize) DecodePtr = 0; Max = dspFindMax(DecodeSnrOut, ScanLen, MaxPos); Output = DecodePipe[DecodePtr + MaxPos]; SignalToNoise = Max; CarrOfs = MaxPos - (ScanLen - 1) / 2; /* code=Output; if ((code>=' ')||(code=='\n')||(code=='\r')) printf("%c",code); else if (code!='\0') printf("<%02X>",code); */ return 0; } // ========================================================================== // MT63 receiver code MT63rx::MT63rx() { int s; FFTbuff = NULL; FFTbuff2 = NULL; for (s = 0; s < 4; s++) SyncPipe[s] = NULL; SyncPhCorr = NULL; for (s = 0; s < 4; s++) { CorrelMid[s] = NULL; CorrelOut[s] = NULL; } dspPowerMid = NULL; dspPowerOut = NULL; for (s = 0; s < 4; s++) CorrelNorm[s] = NULL; for (s = 0; s < 4; s++) CorrelAver[s] = NULL; SymbFit = NULL; SymbPipe = NULL; FreqPipe = NULL; RefDataSlice = NULL; DataPipeLen = 0; DataPipe = NULL; DataPwrMid = NULL; DataPwrOut = NULL; DataSqrMid = NULL; DataSqrOut = NULL; DataVect = NULL; DatadspPhase = NULL; DatadspPhase2 = NULL; SpectradspPower = NULL; } MT63rx::~MT63rx() { int s; free(FFTbuff); free(FFTbuff2); for (s = 0; s < 4; s++) free(SyncPipe[s]); free(SyncPhCorr); for (s = 0; s < 4; s++) { free(CorrelMid[s]); free(CorrelOut[s]); } free(dspPowerMid); free(dspPowerOut); for (s = 0; s < 4; s++) free(CorrelNorm[s]); for (s = 0; s < 4; s++) free(CorrelAver[s]); free(SymbFit); free(SymbPipe); free(FreqPipe); free(RefDataSlice); dspFreeArray2D(DataPipe, DataPipeLen); // for (s=0; s 4000) omega_high = 4000; omega_low *= (M_PI / 4000); omega_high *= (M_PI/ 4000); switch(BandWidth) { case 500: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 256 / 500 + 0.5); AliasFilterLen = 128; DecimateRatio = 8; break; case 1000: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 128 / 500 + 0.5); AliasFilterLen = 64; DecimateRatio = 4; break; case 2000: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 64 / 500 + 0.5); AliasFilterLen = 64; DecimateRatio = 2; break; default: return -1; } DataCarriers = 64; // 64 carriers WindowLen = SymbolLen; // the symbol length RxWindow = SymbolShape; // the symbol shape // RxWindow, WindowLen, SymbolSepar, DataCarrSepar are tuned one for another // to minimize inter-symbol interference (ISI) and one should not change // them independently or ISI will increase. CarrMarkCode = 0x16918BBEL; IntegLen = Integ; // sync. integration period SymbolDiv = 4; // don't change this ScanMargin = 8; // we look 8 data carriers up and down SyncStep = SymbolSepar/SymbolDiv; ProcdspDelay = IntegLen * SymbolSepar; TrackPipeLen = IntegLen; if (LongInterleave) { DataInterleave = 64; InterleavePattern = LongIntlvPatt; } else { DataInterleave = 32; InterleavePattern = ShortIntlvPatt; } DataScanMargin = 8; err = FFT.Preset(WindowLen); if (err) goto Error; if (dspRedspAllocArray(&FFTbuff, WindowLen)) goto Error; if (dspRedspAllocArray(&FFTbuff2, WindowLen)) goto Error; WindowLenMask = WindowLen - 1; // W1HKJ // InpSplit is the anti-aliasing filter that converts a real time domain // signal into a complex time domain signal with pre-filtering. // the black3man3 filter provides very sharp skirts with a flat // passband. err = InpSplit.Preset(AliasFilterLen, NULL, NULL, DecimateRatio); if (err) goto Error; err = InpSplit.ComputeShape(omega_low, omega_high, dspWindowBlackman3); if (err) goto Error; err = TestOfs.Preset(-0.25 * (2.0 * M_PI / WindowLen)); // for decoder tests only if (err) goto Error; err = ProcLine.Preset(ProcdspDelay + WindowLen + SymbolSepar); if (err) goto Error; SyncProcPtr = 0; ScanFirst = FirstDataCarr - ScanMargin * DataCarrSepar; // first FFT bin to scan if (ScanFirst < 0) ScanFirst += WindowLen; ScanLen = (DataCarriers + 2 * ScanMargin) * DataCarrSepar; // number of FFT bins to scan for (s = 0; s < SymbolDiv; s++) { if (dspRedspAllocArray(&SyncPipe[s], ScanLen)) goto Error; dspClearArray(SyncPipe[s], ScanLen); } SyncPtr = 0; if (dspRedspAllocArray(&SyncPhCorr, ScanLen)) goto Error; for (c = (ScanFirst * SymbolSepar) & WindowLenMask, i = 0; i < ScanLen; i++) { SyncPhCorr[i].re = FFT.Twiddle[c].re * FFT.Twiddle[c].re - FFT.Twiddle[c].im * FFT.Twiddle[c].im; SyncPhCorr[i].im = 2 * FFT.Twiddle[c].re * FFT.Twiddle[c].im; c = (c + SymbolSepar) & WindowLenMask; } for (s = 0; s < SymbolDiv; s++) { if (dspRedspAllocArray(&CorrelMid[s], ScanLen)) goto Error; dspClearArray(CorrelMid[s], ScanLen); if (dspRedspAllocArray(&CorrelOut[s], ScanLen)) goto Error; dspClearArray(CorrelOut[s], ScanLen); } dspLowPass2Coeff(IntegLen, W1, W2, W5); if (dspRedspAllocArray(&dspPowerMid, ScanLen)) goto Error; dspClearArray(dspPowerMid, ScanLen); if (dspRedspAllocArray(&dspPowerOut, ScanLen)) goto Error; dspClearArray(dspPowerOut, ScanLen); dspLowPass2Coeff(IntegLen * SymbolDiv, W1p, W2p, W5p); for (s = 0; s < SymbolDiv; s++) { if (dspRedspAllocArray(&CorrelNorm[s], ScanLen)) goto Error; } FitLen = 2 * ScanMargin * DataCarrSepar; for (s = 0; s < SymbolDiv; s++) { if (dspRedspAllocArray(&CorrelAver[s], FitLen)) goto Error; } if (dspRedspAllocArray(&SymbFit, FitLen)) goto Error; if (dspRedspAllocArray(&SymbPipe, TrackPipeLen)) goto Error; dspClearArray(SymbPipe, TrackPipeLen); if (dspRedspAllocArray(&FreqPipe, TrackPipeLen)) goto Error; dspClearArray(FreqPipe, TrackPipeLen); TrackPipePtr = 0; SymbFitPos = ScanMargin * DataCarrSepar; SyncLocked = 0; SyncSymbConf = 0.0; SyncFreqOfs = 0.0; SyncFreqDev = 0.0; SymbPtr = 0; SyncSymbShift = 0.0; SyncHoldThres = 1.5 * sqrt(1.0 / (IntegLen * DataCarriers)); SyncLockThres = 1.5 * SyncHoldThres; DataProcPtr = (-ProcdspDelay); DataScanLen = DataCarriers + 2 * DataScanMargin; DataScanFirst = FirstDataCarr - DataScanMargin * DataCarrSepar; if (dspRedspAllocArray(&RefDataSlice, DataScanLen)) goto Error; dspClearArray(RefDataSlice, DataScanLen); dspFreeArray2D(DataPipe, DataPipeLen); DataPipeLen = IntegLen / 2; dspLowPass2Coeff(IntegLen, dW1, dW2, dW5); if (dspAllocArray2D(&DataPipe, DataPipeLen, DataScanLen)) { DataPipeLen = 0; goto Error; } dspClearArray2D(DataPipe, DataPipeLen, DataScanLen); DataPipePtr = 0; if (dspRedspAllocArray(&DataPwrMid, DataScanLen)) goto Error; dspClearArray(DataPwrMid, DataScanLen); if (dspRedspAllocArray(&DataPwrOut, DataScanLen)) goto Error; dspClearArray(DataPwrOut, DataScanLen); if (dspRedspAllocArray(&DataSqrMid, DataScanLen)) goto Error; dspClearArray(DataSqrMid, DataScanLen); if (dspRedspAllocArray(&DataSqrOut, DataScanLen)) goto Error; dspClearArray(DataSqrOut, DataScanLen); if (dspRedspAllocArray(&DataVect, DataScanLen)) goto Error; if (dspRedspAllocArray(&DatadspPhase, DataScanLen)) goto Error; if (dspRedspAllocArray(&DatadspPhase2, DataScanLen)) goto Error; err = Decoder.Preset(DataCarriers, DataInterleave, InterleavePattern, DataScanMargin, IntegLen); if (err) goto Error; SpectraDisplay = Display; if (SpectraDisplay) { if (dspRedspAllocArray(&SpectradspPower, WindowLen)) goto Error; } return 0; Error: Free(); return -1; } int MT63rx::Process(double_buff *Input) { int s1,s2; // TestOfs.Omega+=(-0.005*(2.0*M_PI/512)); // simulate frequency drift Output.Len = 0; // W1HKJ // convert the real data input into a complex time domain signal, // anti-aliased using the blackman3 filter // subsequent rx signal processing takes advantage of the periodic nature // of the resultant FFT of the anti-aliased input signal. Actual decoding // is at baseband. InpSplit.Process(Input); ProcLine.Process(&InpSplit.Output); // TestOfs.Process(&InpSplit.Output); // ProcLine.Process(&TestOfs.Output); // printf("New input, Len=%d/%d\n",Input->Len,ProcLine.InpLen); while((SyncProcPtr+WindowLen) < ProcLine.InpLen) { SyncProcess(ProcLine.InpPtr + SyncProcPtr); // printf("SyncSymbConf=%5.2f, SyncLock=%d, SyncProcPtr=%d, SyncPtr=%d, SymbPtr=%d, SyncSymbShift=%5.1f, SyncFreqOfs=%5.2f =>", // SyncSymbConf,SyncLocked,SyncProcPtr,SyncPtr,SymbPtr,SyncSymbShift,SyncFreqOfs); if (SyncPtr == SymbPtr) { s1 = SyncProcPtr - ProcdspDelay + ((int)SyncSymbShift - SymbPtr * SyncStep); s2 = s1 + SymbolSepar / 2; // printf(" Sample at %d,%d (SyncProcPtr-%d), time diff.=%d\n",s1,s2,SyncProcPtr-s1,s1-DataProcPtr); DataProcess(ProcLine.InpPtr + s1, ProcLine.InpPtr + s2, SyncFreqOfs, s1 - DataProcPtr); DataProcPtr = s1; } // printf("\n"); SyncProcPtr += SyncStep; } SyncProcPtr -= ProcLine.InpLen; DataProcPtr -= ProcLine.InpLen; return 0; } void MT63rx::DoCorrelSum(dspCmpx *Correl1, dspCmpx *Correl2, dspCmpx *Aver) { dspCmpx sx; int i, s, d; s = 2 * DataCarrSepar; d = DataCarriers * DataCarrSepar; sx.re = sx.im = 0.0; for (i = 0; i < d; i+=s) { sx.re += Correl1[i].re; sx.im += Correl1[i].im; sx.re += Correl2[i].re; sx.im += Correl2[i].im; } Aver[0].re = sx.re / DataCarriers; Aver[0].im = sx.im / DataCarriers; for (i = 0; i < (FitLen-s); ) { sx.re -= Correl1[i].re; sx.im -= Correl1[i].im; sx.re -= Correl2[i].re; sx.im -= Correl2[i].im; sx.re += Correl1[i+d].re; sx.im -= Correl1[i+d].im; sx.re += Correl2[i+d].re; sx.im -= Correl2[i+d].im; i += s; Aver[i].re = sx.re / DataCarriers; Aver[i].im = sx.im / DataCarriers; } } void MT63rx::SyncProcess(dspCmpx *Slice) { int i, j, k, r, s, s2; double pI, pQ; dspCmpx Correl; dspCmpx *PrevSlice; double I, Q; double dI, dQ; double P,A; double w0, w1; double Fl, F0, Fu; dspCmpx SymbTime; double SymbConf, SymbShift, FreqOfs; double dspRMS; // int Loops; int Incl; SyncPtr = (SyncPtr + 1) & (SymbolDiv - 1); // increment the correlators pointer for (i = 0; i < WindowLen; i++) { r = FFT.BitRevIdx[i]; FFTbuff[r].re = Slice[i].re * RxWindow[i]; FFTbuff[r].im = Slice[i].im * RxWindow[i]; } FFT.CoreProc(FFTbuff); if (SpectraDisplay) { for ( i = 0, j = FirstDataCarr + (DataCarriers / 2) * DataCarrSepar - WindowLen / 2; (i < WindowLen) && ( j 0.0) { dI = (I * I - Q * Q) / A; dQ = (2 * I * Q) / A; } else { dI = dQ = 0.0; } dspLowPass2(P, dspPowerMid[i], dspPowerOut[i], W1p, W2p, W5p); pI = PrevSlice[i].re * SyncPhCorr[i].re - PrevSlice[i].im * SyncPhCorr[i].im; pQ = PrevSlice[i].re * SyncPhCorr[i].im + PrevSlice[i].im * SyncPhCorr[i].re; Correl.re = dQ * pQ + dI * pI; Correl.im = dQ * pI - dI * pQ; dspLowPass2(&Correl, CorrelMid[SyncPtr] + i, CorrelOut[SyncPtr] + i, W1, W2, W5); PrevSlice[i].re = dI; PrevSlice[i].im = dQ; } if (SyncPtr == (SymbPtr^2)) { for (s = 0; s < SymbolDiv; s++) { // normalize the correlations for (i = 0; i < ScanLen; i++) { if (dspPowerOut[i] > 0.0) { CorrelNorm[s][i].re = CorrelOut[s][i].re / dspPowerOut[i]; CorrelNorm[s][i].im = CorrelOut[s][i].im / dspPowerOut[i]; } else CorrelNorm[s][i].im = CorrelNorm[s][i].re = 0.0; } } /* // another way to normalize - a better one ? for (i=0; i0.0) { for (s=0; s 1) j -= (k - 1) * DataCarrSepar; else if (k < (-1)) j -= (k + 1) * DataCarrSepar; SymbFitPos = j; // printf(" => %2d",j); if (P > 0.0) { SymbConf = dspAmpl(SymbFit[j]) + 0.5 * (dspAmpl(SymbFit[j + 1]) + dspAmpl(SymbFit[j - 1])); SymbConf *= 0.5; I = SymbFit[j].re + 0.5 * (SymbFit[j - 1].re + SymbFit[j + 1].re); Q = SymbFit[j].im + 0.5 * (SymbFit[j - 1].im + SymbFit[j + 1].im); SymbTime.re = I; SymbTime.im = Q; SymbShift = (dspPhase(SymbTime) / (2 * M_PI)) * SymbolDiv; if (SymbShift < 0) SymbShift += SymbolDiv; // for (i=j-1; i<=j+1; i++) printf(" [%+5.2f,%+5.2f]",SymbFit[i].re,SymbFit[i].im); // make first estimation of FreqOfs // printf(" -> [%+5.2f,%+5.2f] =>",I,Q); // for (i=j-2; i<=j+2; i++) printf(" %+6.3f",I*SymbFit[i].re+Q*SymbFit[i].im); pI = dspScalProd(I, Q, SymbFit[j]) + 0.7 * dspScalProd(I, Q, SymbFit[j - 1]) + 0.7 * dspScalProd(I, Q, SymbFit[j + 1]); pQ = 0.7 * dspScalProd(I, Q, SymbFit[j + 1]) - 0.7 * dspScalProd(I, Q, SymbFit[j - 1]) + 0.5 * dspScalProd(I, Q, SymbFit[j + 2]) - 0.5 * dspScalProd(I, Q, SymbFit[j - 2]); FreqOfs = j + dspPhase(pI, pQ) / (2.0 * M_PI / 8); /* SYNC TEST */ // refine the FreqOfs i = (int)floor(FreqOfs + 0.5); s = (int)floor(SymbShift); s2 = (s + 1) & (SymbolDiv - 1); // printf(" [%5.2f,%2d,%d,%d] ",FreqOfs,i,s,s2); w0 = (s + 1 - SymbShift); w1 = (SymbShift - s); // printf(" [%4.2f,%4.2f] ",w0,w1); A = (0.5 * WindowLen) / SymbolSepar; I = w0 * CorrelAver[s][i].re + w1 * CorrelAver[s2][i].re; Q = w0 * CorrelAver[s][i].im + w1 * CorrelAver[s2][i].im; // printf(" [%5.2f,%2d] -> [%+5.2f,%+5.2f]",FreqOfs,i,I,Q); // FreqOfs=i+dspPhase(I,Q)/(2.0*M_PI)*0.5*A; // printf(" => %5.2f",FreqOfs); F0 = i + dspPhase(I, Q) / (2.0 * M_PI) * A - FreqOfs; Fl = F0 - A; Fu = F0 + A; if (fabs(Fl) < fabs(F0)) FreqOfs += (fabs(Fu) < fabs(Fl)) ? Fu : Fl; else FreqOfs += (fabs(Fu) < fabs(F0)) ? Fu : F0; // printf(" => (%5.2f,%5.2f,%5.2f) => %5.2f",Fl,F0,Fu,FreqOfs); } else { SymbTime.re = SymbTime.im = 0.0; SymbConf = 0.0; SymbShift = 0.0; FreqOfs = 0.0; } // here we have FreqOfs and SymbTime.re/im // printf("FreqOfs=%5.2f",FreqOfs); if (SyncLocked) { // flip the SymbTime if it doesn't agree with the dspAverage if (dspScalProd(SymbTime, AverSymb) < 0.0) { SymbTime.re = (-SymbTime.re); SymbTime.im = (-SymbTime.im); FreqOfs -= DataCarrSepar; } // reduce the freq. offset towards the dspAverage offset A = 2 * DataCarrSepar; k = (int)floor((FreqOfs - AverFreq) / A + 0.5); FreqOfs -= k * A; /* SYNC TEST */ A = (0.5 * WindowLen) / SymbolSepar; F0 = FreqOfs - AverFreq; // correct freq. auto-correlator wrap Fl = F0 - A; Fu = F0 + A; if (fabs(Fl) < fabs(F0)) FreqOfs += (fabs(Fu) < fabs(Fl)) ? A : -A; else FreqOfs += (fabs(Fu) < fabs(F0)) ? A : 0.0; // printf(" => (%5.2f,%5.2f,%5.2f) => %5.2f",Fl,F0,Fu,FreqOfs); } else { // of if (SyncLocked) // flip SymbTime if it doesn't agree with the previous if (dspScalProd(SymbTime, SymbPipe[TrackPipePtr]) < 0.0) { SymbTime.re = (-SymbTime.re); SymbTime.im = (-SymbTime.im); FreqOfs -= DataCarrSepar; } // reduce the FreqOfs towards zero A = 2 * DataCarrSepar; k = (int)floor(FreqOfs / A + 0.5); FreqOfs -= k * A; /* SYNC TEST */ F0 = FreqOfs - FreqPipe[TrackPipePtr]; Fl = F0 - A; Fu = F0 + A; if (fabs(Fl) < fabs(F0)) FreqOfs += (fabs(Fu) < fabs(Fl)) ? A : -A; else FreqOfs += (fabs(Fu) < fabs(F0)) ? A : 0.0; } // printf(" => [%+5.2f,%+5.2f], %5.2f",SymbTime.re,SymbTime.im,FreqOfs); TrackPipePtr += 1; if (TrackPipePtr >= TrackPipeLen) TrackPipePtr -= TrackPipeLen; SymbPipe[TrackPipePtr] = SymbTime; // put SymbTime and FreqOfs into pipes FreqPipe[TrackPipePtr] = FreqOfs; // for averaging // find dspAverage symbol time // Loops = dspSelFitAver( SymbPipe, TrackPipeLen, (double)3.0, 4, AverSymb, dspRMS, Incl); // printf(" AverSymb=[%+5.2f,%+5.2f], dspRMS=%5.3f/%2d", // AverSymb.re,AverSymb.im,dspRMS,Incl); // find dspAverage freq. offset // Loops = dspSelFitAver( FreqPipe, TrackPipeLen, (double)2.5, 4, AverFreq, dspRMS, Incl); SyncFreqDev = dspRMS; // printf(" AverFreq=%+5.2f, dspRMS=%5.3f/%2d",AverFreq,dspRMS,Incl); SymbConf = dspAmpl(AverSymb); SyncSymbConf = SymbConf; SyncFreqOfs = AverFreq; if (SymbConf > 0.0) { SymbShift = dspPhase(AverSymb) / (2 * M_PI) * SymbolSepar; if (SymbShift < 0.0) SymbShift += SymbolSepar; SymbPtr = (int)floor((dspPhase(AverSymb) / (2 * M_PI)) * SymbolDiv); if (SymbPtr < 0) SymbPtr += SymbolDiv; SyncSymbShift = SymbShift; } if (SyncLocked) { if ((SyncSymbConf < SyncHoldThres) || (SyncFreqDev > 0.250)) SyncLocked = 0; } else { if ((SyncSymbConf > SyncLockThres) && (SyncFreqDev < 0.125)) SyncLocked = 1; } SyncSymbConf *= 0.5; // printf(" => SyncLocked=%d, SyncSymbShift=%5.1f, SymbPtr=%d", // SyncLocked,SyncSymbShift,SymbPtr); // printf("\n"); } // enf of if (SyncPtr==(SymbPtr^2)) } void MT63rx::DataProcess(dspCmpx *EvenSlice, dspCmpx *OddSlice, double FreqOfs, int TimeDist) { int i, c, r; dspCmpx Freq, Phas; int incr, p; double I, Q, P; dspCmpx Dtmp; dspCmpx Ftmp; // double Aver,dspRMS; int Loops,Incl; // Here we pickup a symbol in the data history. The time/freq. synchronizer // told us where it is in time and at which frequency offset (FreqOfs) // TimeDist is the distance in samples from the symbol we analyzed // in the previous call to this routine // FreqOfs=0.0; // for DEBUG only ! // printf("DataProcess: FreqOfs=%5.3f, TimeDist=%d, Locked=%d\n", // FreqOfs,TimeDist,SyncLocked); P = (-2 * M_PI * FreqOfs) / WindowLen; // make ready for frequency correction Freq.re = cos(P); Freq.im = sin(P); Phas.re = 1.0; Phas.im = 0.0; for (i = 0; i < WindowLen; i++) { // prepare slices for the FFT r = FFT.BitRevIdx[i]; // multiply by window and pre-scramble // if (i==2*ScanMargin) // printf("%3d: [%5.2f,%5.2f] [%5.2f,%5.2f]\n", // i, dspPhase.re,dspPhase.im, EvenSlice[i].re,EvenSlice[i].im); CdspcmpxMultAxB(I, Q, EvenSlice[i], Phas); FFTbuff[r].re = I * RxWindow[i]; FFTbuff[r].im = Q * RxWindow[i]; CdspcmpxMultAxB(I, Q, OddSlice[i], Phas); FFTbuff2[r].re = I * RxWindow[i]; FFTbuff2[r].im = Q * RxWindow[i]; CdspcmpxMultAxB(Dtmp, Phas, Freq); Phas = Dtmp; } FFT.CoreProc(FFTbuff); FFT.CoreProc(FFTbuff2); /* printf("FFTbuff [%3d...]:",FirstDataCarr-16); for (i=FirstDataCarr-16; i<=FirstDataCarr+32; i++) printf(" %+3d/%4.2f",i-FirstDataCarr,dspAmpl(FFTbuff[i])); printf("\n"); printf("FFTbuff2[%3d...]:",FirstDataCarr-16); for (i=FirstDataCarr-16; i<=FirstDataCarr+32; i++) printf(" %+3d/%4.2f",i-FirstDataCarr,dspAmpl(FFTbuff2[i])); printf("\n"); */ // printf(" FreqOfs=%5.2f: ",FreqOfs); // printf("Symbol vectors:\n"); incr = (TimeDist * DataCarrSepar) & WindowLenMask; // correct FFT dspPhase shift p = (TimeDist * DataScanFirst) & WindowLenMask; // due to time shift by for (c = DataScanFirst, i = 0; i < DataScanLen; ) { // TimeDist // printf("%2d,%3d:",i,c); // printf(" [%6.3f,%6.3f] [%6.3f,%6.3f]", // FFTbuff[c].re,FFTbuff[c].im, // FFTbuff2[c+DataCarrSepar].re,FFTbuff2[c+DataCarrSepar].im); // printf(" [%6.3f,%6.3f]/[%6.3f,%6.3f]", // FFTbuff2[c].re,FFTbuff2[c].im, // FFTbuff[c+DataCarrSepar].re,FFTbuff[c+DataCarrSepar].im); // printf(" %5.3f/%5.3f",dspAmpl(FFTbuff[c]),dspAmpl(FFTbuff[c+DataCarrSepar])); // printf(" %5.3f/%5.3f",dspAmpl(FFTbuff2[c+DataCarrSepar]),dspAmpl(FFTbuff2[c])); // printf("\n"); Phas = FFT.Twiddle[p]; CdspcmpxMultAxB(Dtmp, RefDataSlice[i], Phas); CdspcmpxMultAxBs(DataVect[i], FFTbuff[c], Dtmp); // printf("%3d,%2d: [%8.5f,%8.5f] / %8.5f\n", // c,i,FFTbuff[c].re,FFTbuff[c].im,DataPwrOut[i]); dspLowPass2( dspPower(FFTbuff[c]), DataPwrMid[i], DataPwrOut[i], dW1, dW2, dW5); RefDataSlice[i++] = FFTbuff[c]; c = (c + DataCarrSepar) & WindowLenMask; p = (p + incr) & WindowLenMask; Phas = FFT.Twiddle[p]; CdspcmpxMultAxB(Dtmp, RefDataSlice[i], Phas); CdspcmpxMultAxBs(DataVect[i], FFTbuff2[c], Dtmp); // printf("%3d,%2d: [%8.5f,%8.5f] / %8.5f\n", // c,i,FFTbuff2[c].re,FFTbuff2[c].im,DataPwrOut[i]); dspLowPass2( dspPower(FFTbuff2[c]), DataPwrMid[i], DataPwrOut[i], dW1, dW2, dW5); RefDataSlice[i++] = FFTbuff2[c]; c = (c + DataCarrSepar) & WindowLenMask; p = (p + incr) & WindowLenMask; } P = (-TimeDist * 2 * M_PI * FreqOfs) / WindowLen; Freq.re = cos(P); Freq.im = sin(P); for (i = 0; i < DataScanLen; i++) { CdspcmpxMultAxB(Ftmp, DataVect[i], Freq); // dspLowPass2(dspPower(Ftmp),DataPwrMid[i],DataPwrOut[i],dW1,dW2,dW5); // CdspcmpxMultAxB(Dtmp,Ftmp,Ftmp); // Dtmp.re=Ftmp.re*Ftmp.re-Ftmp.im*Ftmp.im; Dtmp.im=2*Ftmp.re*Ftmp.im; // dspLowPass2(&Dtmp,DataSqrMid+i,DataSqrOut+i,dW1,dW2,dW5); DataVect[i] = DataPipe[DataPipePtr][i]; DataPipe[DataPipePtr][i] = Ftmp; } DataPipePtr += 1; if (DataPipePtr >= DataPipeLen) DataPipePtr = 0; for (i = 0; i < DataScanLen; i++) { if (DataPwrOut[i] > 0.0) { P = DataVect[i].re / DataPwrOut[i]; if (P > 1.0) P = 1.0; else if (P < (-1.0)) P = (-1.0); DatadspPhase[i] = P; } else DatadspPhase[i] = 0.0; } Decoder.Process(DatadspPhase); Output.EnsureSpace(Output.Len + 1); Output.Data[Output.Len] = Decoder.Output; Output.Len += 1; /* printf("Demodulator output vectors:\n"); for (i=0; i %8.5f\n", i,DataVect[i].re,DataVect[i].im,DataPwrOut[i], DatadspPhase[i]); } */ /* for (i=0; i0.0) P=dspPhase(DataVect[i]); else P=0.0; DatadspPhase[i]=P; P*=2; if (P>M_PI) P-=2*M_PI; else if (P<(-M_PI)) P+=2*M_PI; DatadspPhase2[i]=P; printf("%2d: %6.3f [%6.3f,%6.3f] [%8.5f,%8.5f], %5.2f, %5.2f", i, DataPwrOut[i], DataSqrOut[i].re,DataSqrOut[i].im, DataVect[i].re,DataVect[i].im, DatadspPhase[i],DatadspPhase2[i]); if (DataPwrOut[i]>0.0) printf(" %6.3f",dspAmpl(DataSqrOut[i])/DataPwrOut[i]); printf("\n"); } Loops=dspSelFitAver(DatadspPhase2,DataScanLen,(double)2.5,4,Aver,dspRMS,Incl); printf("Aver=%5.2f, dspRMS=%5.2f, Incl=%d\n",Aver,dspRMS,Incl); */ } int MT63rx::SYNC_LockStatus(void) { return SyncLocked; } double MT63rx::SYNC_Confidence(void) { return SyncSymbConf <= 1.0 ? SyncSymbConf : 1.0; } double MT63rx::SYNC_FreqOffset(void) { return SyncFreqOfs / DataCarrSepar; } double MT63rx::SYNC_FreqDevdspRMS(void) { return SyncFreqDev / DataCarrSepar; } double MT63rx::SYNC_TimeOffset(void) { return SyncSymbShift / SymbolSepar; } double MT63rx::FEC_SNR(void) { return Decoder.SignalToNoise; } int MT63rx::FEC_CarrOffset(void) { return Decoder.CarrOfs; } double MT63rx::TotalFreqOffset(void) { return ( SyncFreqOfs + DataCarrSepar * Decoder.CarrOfs) * (8000.0 / DecimateRatio) / WindowLen; } fldigi-3.21.80/src/mt63/symbol.dat0000664000175000017500000003431312313064025013425 00000000000000/* * symbol.dat -- Symbol shape for the MT63 modem, taken directly * from the MT63ASC code for the EVM56K. * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi 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. * * Fldigi 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 fldigi. If not, see . * */ const int SymbolLen=512; // the shape's length const int SymbolSepar=200; // the distance in samples between symbols on a carrier const int DataCarrSepar=4; // carriers must be spaced by 4 FFT bins // (complex FFT length equals to SymbolLen) double SymbolShape[SymbolLen] = { -0.00000000 , // 0 +0.00000665 , // 1 +0.00002657 , // 2 +0.00005975 , // 3 +0.00010613 , // 4 +0.00016562 , // 5 +0.00023810 , // 6 +0.00032341 , // 7 +0.00042134 , // 8 +0.00053162 , // 9 +0.00065389 , // 10 +0.00078773 , // 11 +0.00093261 , // 12 +0.00108789 , // 13 +0.00125283 , // 14 +0.00142653 , // 15 +0.00160798 , // 16 +0.00179599 , // 17 +0.00198926 , // 18 +0.00218628 , // 19 +0.00238542 , // 20 +0.00258487 , // 21 +0.00278264 , // 22 +0.00297662 , // 23 +0.00316452 , // 24 +0.00334394 , // 25 +0.00351232 , // 26 +0.00366701 , // 27 +0.00380526 , // 28 +0.00392424 , // 29 +0.00402109 , // 30 +0.00409288 , // 31 +0.00413671 , // 32 +0.00414969 , // 33 +0.00412898 , // 34 +0.00407182 , // 35 +0.00397555 , // 36 +0.00383764 , // 37 +0.00365574 , // 38 +0.00342767 , // 39 +0.00315145 , // 40 +0.00282534 , // 41 +0.00244787 , // 42 +0.00201781 , // 43 +0.00153424 , // 44 +0.00099653 , // 45 +0.00040435 , // 46 -0.00024231 , // 47 -0.00094314 , // 48 -0.00169753 , // 49 -0.00250453 , // 50 -0.00336293 , // 51 -0.00427118 , // 52 -0.00522749 , // 53 -0.00622977 , // 54 -0.00727569 , // 55 -0.00836272 , // 56 -0.00948809 , // 57 -0.01064886 , // 58 -0.01184193 , // 59 -0.01306405 , // 60 -0.01431189 , // 61 -0.01558198 , // 62 -0.01687083 , // 63 -0.01817486 , // 64 -0.01949051 , // 65 -0.02081416 , // 66 -0.02214223 , // 67 -0.02347113 , // 68 -0.02479733 , // 69 -0.02611728 , // 70 -0.02742752 , // 71 -0.02872457 , // 72 -0.03000504 , // 73 -0.03126551 , // 74 -0.03250262 , // 75 -0.03371298 , // 76 -0.03489320 , // 77 -0.03603988 , // 78 -0.03714954 , // 79 -0.03821868 , // 80 -0.03924367 , // 81 -0.04022079 , // 82 -0.04114620 , // 83 -0.04201589 , // 84 -0.04282570 , // 85 -0.04357126 , // 86 -0.04424801 , // 87 -0.04485118 , // 88 -0.04537575 , // 89 -0.04581648 , // 90 -0.04616787 , // 91 -0.04642421 , // 92 -0.04657955 , // 93 -0.04662769 , // 94 -0.04656225 , // 95 -0.04637665 , // 96 -0.04606414 , // 97 -0.04561786 , // 98 -0.04503082 , // 99 -0.04429599 , // 100 -0.04340631 , // 101 -0.04235475 , // 102 -0.04113436 , // 103 -0.03973834 , // 104 -0.03816006 , // 105 -0.03639316 , // 106 -0.03443155 , // 107 -0.03226956 , // 108 -0.02990192 , // 109 -0.02732385 , // 110 -0.02453112 , // 111 -0.02152012 , // 112 -0.01828789 , // 113 -0.01483216 , // 114 -0.01115146 , // 115 -0.00724508 , // 116 -0.00311317 , // 117 +0.00124328 , // 118 +0.00582236 , // 119 +0.01062127 , // 120 +0.01563627 , // 121 +0.02086273 , // 122 +0.02629504 , // 123 +0.03192674 , // 124 +0.03775043 , // 125 +0.04375787 , // 126 +0.04993995 , // 127 +0.05628681 , // 128 +0.06278780 , // 129 +0.06943159 , // 130 +0.07620621 , // 131 +0.08309914 , // 132 +0.09009732 , // 133 +0.09718730 , // 134 +0.10435526 , // 135 +0.11158715 , // 136 +0.11886870 , // 137 +0.12618560 , // 138 +0.13352351 , // 139 +0.14086819 , // 140 +0.14820561 , // 141 +0.15552198 , // 142 +0.16280389 , // 143 +0.17003841 , // 144 +0.17721311 , // 145 +0.18431620 , // 146 +0.19133661 , // 147 +0.19826401 , // 148 +0.20508896 , // 149 +0.21180289 , // 150 +0.21839823 , // 151 +0.22486845 , // 152 +0.23120806 , // 153 +0.23741270 , // 154 +0.24347919 , // 155 +0.24940549 , // 156 +0.25519079 , // 157 +0.26083547 , // 158 +0.26634116 , // 159 +0.27171067 , // 160 +0.27694807 , // 161 +0.28205857 , // 162 +0.28704860 , // 163 +0.29192571 , // 164 +0.29669855 , // 165 +0.30137684 , // 166 +0.30597130 , // 167 +0.31049362 , // 168 +0.31495636 , // 169 +0.31937292 , // 170 +0.32375741 , // 171 +0.32812465 , // 172 +0.33249001 , // 173 +0.33686936 , // 174 +0.34127898 , // 175 +0.34573545 , // 176 +0.35025554 , // 177 +0.35485613 , // 178 +0.35955412 , // 179 +0.36436627 , // 180 +0.36930915 , // 181 +0.37439902 , // 182 +0.37965170 , // 183 +0.38508250 , // 184 +0.39070609 , // 185 +0.39653642 , // 186 +0.40258662 , // 187 +0.40886890 , // 188 +0.41539446 , // 189 +0.42217341 , // 190 +0.42921470 , // 191 +0.43652603 , // 192 +0.44411383 , // 193 +0.45198311 , // 194 +0.46013753 , // 195 +0.46857925 , // 196 +0.47730896 , // 197 +0.48632585 , // 198 +0.49562756 , // 199 +0.50521021 , // 200 +0.51506840 , // 201 +0.52519520 , // 202 +0.53558220 , // 203 +0.54621950 , // 204 +0.55709582 , // 205 +0.56819849 , // 206 +0.57951351 , // 207 +0.59102568 , // 208 +0.60271860 , // 209 +0.61457478 , // 210 +0.62657574 , // 211 +0.63870210 , // 212 +0.65093366 , // 213 +0.66324951 , // 214 +0.67562817 , // 215 +0.68804763 , // 216 +0.70048553 , // 217 +0.71291922 , // 218 +0.72532590 , // 219 +0.73768272 , // 220 +0.74996688 , // 221 +0.76215572 , // 222 +0.77422687 , // 223 +0.78615828 , // 224 +0.79792836 , // 225 +0.80951602 , // 226 +0.82090079 , // 227 +0.83206287 , // 228 +0.84298315 , // 229 +0.85364335 , // 230 +0.86402598 , // 231 +0.87411443 , // 232 +0.88389296 , // 233 +0.89334677 , // 234 +0.90246195 , // 235 +0.91122553 , // 236 +0.91962547 , // 237 +0.92765062 , // 238 +0.93529073 , // 239 +0.94253642 , // 240 +0.94937916 , // 241 +0.95581122 , // 242 +0.96182562 , // 243 +0.96741616 , // 244 +0.97257728 , // 245 +0.97730410 , // 246 +0.98159233 , // 247 +0.98543825 , // 248 +0.98883864 , // 249 +0.99179079 , // 250 +0.99429241 , // 251 +0.99634163 , // 252 +0.99793696 , // 253 +0.99907728 , // 254 +0.99976178 , // 255 +0.99999000 , // 256 +0.99976178 , // 257 +0.99907728 , // 258 +0.99793696 , // 259 +0.99634163 , // 260 +0.99429241 , // 261 +0.99179079 , // 262 +0.98883864 , // 263 +0.98543825 , // 264 +0.98159233 , // 265 +0.97730410 , // 266 +0.97257728 , // 267 +0.96741616 , // 268 +0.96182562 , // 269 +0.95581122 , // 270 +0.94937916 , // 271 +0.94253642 , // 272 +0.93529073 , // 273 +0.92765062 , // 274 +0.91962547 , // 275 +0.91122553 , // 276 +0.90246195 , // 277 +0.89334677 , // 278 +0.88389296 , // 279 +0.87411443 , // 280 +0.86402598 , // 281 +0.85364335 , // 282 +0.84298315 , // 283 +0.83206287 , // 284 +0.82090079 , // 285 +0.80951602 , // 286 +0.79792836 , // 287 +0.78615828 , // 288 +0.77422687 , // 289 +0.76215572 , // 290 +0.74996688 , // 291 +0.73768272 , // 292 +0.72532590 , // 293 +0.71291922 , // 294 +0.70048553 , // 295 +0.68804763 , // 296 +0.67562817 , // 297 +0.66324951 , // 298 +0.65093366 , // 299 +0.63870210 , // 300 +0.62657574 , // 301 +0.61457478 , // 302 +0.60271860 , // 303 +0.59102568 , // 304 +0.57951351 , // 305 +0.56819849 , // 306 +0.55709582 , // 307 +0.54621950 , // 308 +0.53558220 , // 309 +0.52519520 , // 310 +0.51506840 , // 311 +0.50521021 , // 312 +0.49562756 , // 313 +0.48632585 , // 314 +0.47730896 , // 315 +0.46857925 , // 316 +0.46013753 , // 317 +0.45198311 , // 318 +0.44411383 , // 319 +0.43652603 , // 320 +0.42921470 , // 321 +0.42217341 , // 322 +0.41539446 , // 323 +0.40886890 , // 324 +0.40258662 , // 325 +0.39653642 , // 326 +0.39070609 , // 327 +0.38508250 , // 328 +0.37965170 , // 329 +0.37439902 , // 330 +0.36930915 , // 331 +0.36436627 , // 332 +0.35955412 , // 333 +0.35485613 , // 334 +0.35025554 , // 335 +0.34573545 , // 336 +0.34127898 , // 337 +0.33686936 , // 338 +0.33249001 , // 339 +0.32812465 , // 340 +0.32375741 , // 341 +0.31937292 , // 342 +0.31495636 , // 343 +0.31049362 , // 344 +0.30597130 , // 345 +0.30137684 , // 346 +0.29669855 , // 347 +0.29192571 , // 348 +0.28704860 , // 349 +0.28205857 , // 350 +0.27694807 , // 351 +0.27171067 , // 352 +0.26634116 , // 353 +0.26083547 , // 354 +0.25519079 , // 355 +0.24940549 , // 356 +0.24347919 , // 357 +0.23741270 , // 358 +0.23120806 , // 359 +0.22486845 , // 360 +0.21839823 , // 361 +0.21180289 , // 362 +0.20508896 , // 363 +0.19826401 , // 364 +0.19133661 , // 365 +0.18431620 , // 366 +0.17721311 , // 367 +0.17003841 , // 368 +0.16280389 , // 369 +0.15552198 , // 370 +0.14820561 , // 371 +0.14086819 , // 372 +0.13352351 , // 373 +0.12618560 , // 374 +0.11886870 , // 375 +0.11158715 , // 376 +0.10435526 , // 377 +0.09718730 , // 378 +0.09009732 , // 379 +0.08309914 , // 380 +0.07620621 , // 381 +0.06943159 , // 382 +0.06278780 , // 383 +0.05628681 , // 384 +0.04993995 , // 385 +0.04375787 , // 386 +0.03775043 , // 387 +0.03192674 , // 388 +0.02629504 , // 389 +0.02086273 , // 390 +0.01563627 , // 391 +0.01062127 , // 392 +0.00582236 , // 393 +0.00124328 , // 394 -0.00311317 , // 395 -0.00724508 , // 396 -0.01115146 , // 397 -0.01483216 , // 398 -0.01828789 , // 399 -0.02152012 , // 400 -0.02453112 , // 401 -0.02732385 , // 402 -0.02990192 , // 403 -0.03226956 , // 404 -0.03443155 , // 405 -0.03639316 , // 406 -0.03816006 , // 407 -0.03973834 , // 408 -0.04113436 , // 409 -0.04235475 , // 410 -0.04340631 , // 411 -0.04429599 , // 412 -0.04503082 , // 413 -0.04561786 , // 414 -0.04606414 , // 415 -0.04637665 , // 416 -0.04656225 , // 417 -0.04662769 , // 418 -0.04657955 , // 419 -0.04642421 , // 420 -0.04616787 , // 421 -0.04581648 , // 422 -0.04537575 , // 423 -0.04485118 , // 424 -0.04424801 , // 425 -0.04357126 , // 426 -0.04282570 , // 427 -0.04201589 , // 428 -0.04114620 , // 429 -0.04022079 , // 430 -0.03924367 , // 431 -0.03821868 , // 432 -0.03714954 , // 433 -0.03603988 , // 434 -0.03489320 , // 435 -0.03371298 , // 436 -0.03250262 , // 437 -0.03126551 , // 438 -0.03000504 , // 439 -0.02872457 , // 440 -0.02742752 , // 441 -0.02611728 , // 442 -0.02479733 , // 443 -0.02347113 , // 444 -0.02214223 , // 445 -0.02081416 , // 446 -0.01949051 , // 447 -0.01817486 , // 448 -0.01687083 , // 449 -0.01558198 , // 450 -0.01431189 , // 451 -0.01306405 , // 452 -0.01184193 , // 453 -0.01064886 , // 454 -0.00948809 , // 455 -0.00836272 , // 456 -0.00727569 , // 457 -0.00622977 , // 458 -0.00522749 , // 459 -0.00427118 , // 460 -0.00336293 , // 461 -0.00250453 , // 462 -0.00169753 , // 463 -0.00094314 , // 464 -0.00024231 , // 465 +0.00040435 , // 466 +0.00099653 , // 467 +0.00153424 , // 468 +0.00201781 , // 469 +0.00244787 , // 470 +0.00282534 , // 471 +0.00315145 , // 472 +0.00342767 , // 473 +0.00365574 , // 474 +0.00383764 , // 475 +0.00397555 , // 476 +0.00407182 , // 477 +0.00412898 , // 478 +0.00414969 , // 479 +0.00413671 , // 480 +0.00409288 , // 481 +0.00402109 , // 482 +0.00392424 , // 483 +0.00380526 , // 484 +0.00366701 , // 485 +0.00351232 , // 486 +0.00334394 , // 487 +0.00316452 , // 488 +0.00297662 , // 489 +0.00278264 , // 490 +0.00258487 , // 491 +0.00238542 , // 492 +0.00218628 , // 493 +0.00198926 , // 494 +0.00179599 , // 495 +0.00160798 , // 496 +0.00142653 , // 497 +0.00125283 , // 498 +0.00108789 , // 499 +0.00093261 , // 500 +0.00078773 , // 501 +0.00065389 , // 502 +0.00053162 , // 503 +0.00042134 , // 504 +0.00032341 , // 505 +0.00023810 , // 506 +0.00016562 , // 507 +0.00010613 , // 508 +0.00005975 , // 509 +0.00002657 , // 510 +0.00000665 // 511 } ; fldigi-3.21.80/src/mt63/dsp.cxx0000664000175000017500000016661412313064025012752 00000000000000/* * dsp.cc -- various DSP algorithms * * based on mt63 code by Pawel Jalocha * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * Copyright (c) 2007-2011 Dave Freese, W1HKJ * * This file is part of fldigi. * * Fldigi 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. * * Fldigi 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 fldigi. If not, see . * */ // Please note, that you should not rely on the correctness // of these routines. They generally work well, but you may find // differences in respect to the mathematical formulas: signs flipped, // orders swapped, etc. #include #include // only when we do some control printf's #include #include #include "dsp.h" // ---------------------------------------------------------------------------- double dspPower(double *X, int Len) { double Sum; for(Sum = 0.0; Len; Len--,X++) Sum += (*X)*(*X); return Sum; } double dspPower(double *I, double *Q, int Len) { double Sum; for(Sum = 0.0; Len; Len--,I++,Q++) Sum += (*I)*(*I) + (*Q)*(*Q); return Sum; } double dspPower(dspCmpx *X, int Len) { double Sum; for(Sum = 0.0; Len; Len--,X++) Sum += (X->re)*(X->re) + (X->im)*(X->im); return Sum; } // ---------------------------------------------------------------------------- // dspAverage, extremes, fitting double dspAverage(double *Data, int Len) { double Sum; int i; for(Sum = 0.0,i = 0; i < Len; i++) Sum += Data[i]; return Sum/Len; } int dspCountInRange(double *Data, int Len, double Low, double Upp) { int count, i; double D; for(count = i = 0; i Max) Max = Pwr; } return Max; } double dspFindMaxdspPower(dspCmpx *Data, int Len, int &MaxPos) { double Max, Pwr; int i, pos; Max = dspPower(Data[0]); pos = 0; for (i = 1; i < Len; i++) { Pwr = dspPower(Data[i]); if (Pwr > Max) { Max = Pwr; pos = i; } } MaxPos = pos; return Max; } double dspFitPoly1(double *Data, int Len, double &A, double &B) { double Sum; int i; A = (Data[Len-1] - Data[0])/(Len - 1); for (Sum = 0.0,i = 0; i < Len; i++) Sum += Data[i] - A*i; B = Sum/Len; for (Sum = 0.0, i = 0; i < Len; i++) Sum += dspPower(Data[i] - (A*i + B)); return sqrt(Sum/Len); } double dspFitPoly2(double *Data, int Len, double &A, double &B, double &C) { double Sum; int i; A = ((Data[Len - 1] - Data[Len - 2]) - (Data[1] - Data[0]))/(Len - 2)/2; B = (Data[Len - 1] - A*(Len - 1)*(Len - 1) - Data[0])/(Len - 1); for (Sum = 0.0, i = 0; i < Len; i++) Sum += Data[i] - (A*i*i + B*i); C = Sum/Len; for (Sum = 0.0, i = 0; i < Len; i++) Sum += dspPower(Data[i] - (A*i*i + B*i + C)); return sqrt(Sum/Len); } void dspFitPoly2(double Data[3], double &A, double &B, double &C) { C = Data[0]; A = (Data[0]- 2*Data[1] + Data[2])/2; B = (Data[1] - Data[0]) - A; } // ---------------------------------------------------------------------------- // various window shapes (for the FFT and FIR filters) // these functions are supposed to be called with the argument "dspPhase" // between -PI and +PI. Most (or even all) will return zero for input // euqal -PI or +PI. double WindowHamming(double dspPhase) { return cos(dspPhase/2); } // not exactly ... double dspWindowHanning(double dspPhase) { return (1.0 + cos(dspPhase))/2; } double WindowBlackman2(double dspPhase) // from Freq 5.1 FFT analyzer { return 0.42 + 0.5*cos(dspPhase) + 0.08*cos(2*dspPhase); } double dspWindowBlackman3(double dspPhase) // from the Motorola BBS { return 0.35875 + 0.48829*cos(dspPhase) + 0.14128*cos(2*dspPhase) + 0.01168*cos(3*dspPhase); } // ---------------------------------------------------------------------------- // FIR shape calculation for a flat response from FreqLow to FreqUpp void dspWinFirI( double LowOmega, double UppOmega, double *Shape, int Len, double (*Window)(double), double shift) { int i; double time, dspPhase, shape; // printf("dspWinFirI: %5.3f %5.3f %d\n",LowOmega,UppOmega,Len); for (i = 0; i < Len; i++) { time = i + (1.0 - shift) - (double)Len/2; dspPhase = 2*M_PI*time/Len; if (time == 0) shape = UppOmega - LowOmega; else shape = (sin(UppOmega*time) - sin(LowOmega*time))/time; // printf("%2d %5.1f %5.2f %7.4f %7.4f\n",i,time,dspPhase,shape,(*Window)(dspPhase)); Shape[i] = shape*(*Window)(dspPhase)/M_PI; } } void WinFirQ( double LowOmega, double UppOmega, double *Shape, int Len, double (*Window)(double), double shift) { int i; double time, dspPhase, shape; // printf("WinFirQ: %5.3f %5.3f %d\n",LowOmega,UppOmega,Len); for (i = 0; i < Len; i++) { time = i + (1.0 - shift) - (double)Len/2; dspPhase = 2*M_PI*time/Len; if (time == 0) shape=0.0; else shape = (-cos(UppOmega*time) + cos(LowOmega*time))/time; // printf("%2d %5.1f %5.2f %7.4f %7.4f\n",i,time,dspPhase,shape,(*Window)(dspPhase)); Shape[i] = (-shape)*(*Window)(dspPhase)/M_PI; } } // we put minus for the Q-part because the FIR shapes must be placed // in reverse order for simpler indexing // ---------------------------------------------------------------------------- // convert 16-bit signed or 8-bit unsigned into doubles void dspConvS16todouble(dspS16 *dspS16, double *dble, int Len, double Gain) { for (; Len; Len--) (*dble++) = (*dspS16++)*Gain; } int dspConvS16todouble(short int *dspS16, double_buff *dble, int Len, double Gain) { int err = dble->EnsureSpace(Len); if (err) return -1; dspConvS16todouble(dspS16, dble->Data, Len, Gain); dble->Len = Len; return 0; } void dspConvdoubleTodspS16(double *dble, dspS16 *dspS16, int Len, double Gain) { double out; for (; Len; Len--) { out = (*dble++)*Gain; if (out > 32767.0) out = 32767.0; else if (out < (-32767.0)) out = (-32767.0); (*dspS16++) = (short int)floor(out+0.5); } } // we could count the over/underflows ? void dspConvU8todouble(unsigned char *U8, double *dble, int Len, double Gain) { for (; Len; Len--) (*dble++) = ((int)(*U8++) - 128)*Gain; } int dspConvU8todouble(unsigned char *U8, double_buff *dble, int Len, double Gain) { int err = dble->EnsureSpace(Len); if (err) return -1; dspConvU8todouble(U8, dble->Data, Len, Gain); dble->Len = Len; return 0; } // ---------------------------------------------------------------------------- // other converts void dspConvCmpxTodspPower(dspCmpx *Inp, int Len, double *Out) { for (; Len; Len--) (*Out++) = dspPower(*Inp++); } int dspConvCmpxTodspPower(dspCmpx_buff *Input, double_buff *Output) { int err = Output->EnsureSpace(Input->Len); if (err) return err; dspConvCmpxTodspPower(Input->Data, Input->Len, Output->Data); Output->Len = Input->Len; return 0; } void dspConvCmpxTodspAmpl(dspCmpx *Inp, int Len, double *Out) { for (; Len; Len--) (*Out++) = sqrt(dspPower(*Inp++)); } int dspConvCmpxTodspAmpl(dspCmpx_buff *Input, double_buff *Output) { int err = Output->EnsureSpace(Input->Len); if(err) return err; dspConvCmpxTodspAmpl(Input->Data, Input->Len, Output->Data); Output->Len = Input->Len; return 0; } void dspConvCmpxTodspPhase(dspCmpx *Inp, int Len, double *Out) { for (; Len; Len--) (*Out++) = dspPhase(*Inp++); } int dspConvCmpxTodspPhase(dspCmpx_buff *Input, double_buff *Output) { int err = Output->EnsureSpace(Input->Len); if(err) return err; dspConvCmpxTodspPhase(Input->Data, Input->Len, Output->Data); Output->Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // Pulse noise limiter dspPulseLimiter::dspPulseLimiter() { Tap = NULL; } dspPulseLimiter::~dspPulseLimiter() { free(Tap); } void dspPulseLimiter::Free(void) { free(Tap); Tap = NULL; } int dspPulseLimiter::Preset(int TapLen, double LimitThres) { Len = TapLen; Thres = LimitThres*LimitThres; if (dspRedspAllocArray(&Tap, Len)) return -1; dspClearArray(Tap, Len); Ptr = 0; PwrSum = 0.0; return 0; } int dspPulseLimiter::Process(double *Inp, int InpLen, double *Out) { int i, o; double Lim; for (i = 0; i < InpLen; i++) { PwrSum -= Tap[Ptr]*Tap[Ptr]; Tap[Ptr++] = Inp[i]; PwrSum += Inp[i]*Inp[i]; if (Ptr >= Len) Ptr -= Len; o = Ptr + (Len/2); if (o >= Len) o -= Len; Lim = Thres*PwrSum/Len; if (Tap[o]*Tap[o] <= Lim) Out[i] = Tap[o]; else { if (Tap[o] > 0.0) Out[i] = sqrt(Lim); else Out[i] = (-sqrt(Lim)); } } for (PwrSum = 0.0, i = 0; i < Len; i++) PwrSum += Tap[i]*Tap[i]; dspRMS = sqrt(PwrSum/Len); return 0; } int dspPulseLimiter::Process(double_buff *Input) { int err = Output.EnsureSpace(Input->Len); if (err) return -1; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // Signal level monitor dspLevelMonitor::dspLevelMonitor() { } dspLevelMonitor::~dspLevelMonitor() { } int dspLevelMonitor::Preset(double Integ, double Range) { dspLowPass2Coeff(Integ, W1, W2, W5); MaxSqr = Range*Range; PwrMid = 0.0; PwrOut = 0.0; dspRMS = 0.0; OutOfRangeMid = 0.0; OutOfRange = 0.0; return 0; } int dspLevelMonitor::Process(double *Inp, int Len) { int i, Out; double Sqr, Sum; if (Len <= 0) return 0; for (Sum = 0.0, Out = 0,i = 0; i < Len; i++) { Sum += Sqr = Inp[i]*Inp[i]; Out += (Sqr > MaxSqr); } dspLowPass2(Sum/Len, PwrMid, PwrOut, W1, W2, W5); dspLowPass2((double)Out/Len, OutOfRangeMid, OutOfRange, W1, W2, W5); if (OutOfRange < 0.0) OutOfRange = 0.0; if (PwrOut <= 0.0) dspRMS = 0.0; else dspRMS = sqrt(PwrOut); return 0; } int dspLevelMonitor::Process(double_buff *Input) { return Process(Input->Data,Input->Len); } // ---------------------------------------------------------------------------- // Automatic Gain/Level Control for the Mixer dspMixerAutoLevel::dspMixerAutoLevel() { MinMS = 0.01; MaxMS = 0.05; IntegLen = 8000; PeakHold = 4000; MinHold = 800; MinLevel = 0; MaxLevel = 100; AdjStep = 1; Level = 75; Hold = (-IntegLen); AvedspRMS = 0.0; } int dspMixerAutoLevel::Process(double *Inp, int InpLen) { double MS = dspPower(Inp, InpLen) / IntegLen; double W = 1.0 - ((double)InpLen) / IntegLen; AvedspRMS = AvedspRMS*W + MS; Hold += InpLen; if (Hold < MinHold) return 0; if(AvedspRMS>MaxMS) { Level -= AdjStep; if (Level < MinLevel) Level = MinLevel; Hold=0; return 1; } if (Hold < PeakHold) return 0; if (AvedspRMS < MinMS) { Level += AdjStep; if (Level > MaxLevel) Level = MaxLevel; Hold = 0; return 1; } return 0; } // ---------------------------------------------------------------------------- void dspLowPass2(dspCmpx *Inp, dspCmpx *Mid, dspCmpx *Out, double W1, double W2, double W5) { double Sum, Diff; // printf("\n[dspLowPass2] %6.3f %6.3f %6.3f",Inp->re,Mid->re,Out->re); Sum = Mid->re + Out->re; Diff = Mid->re - Out->re; Mid->re += W2*Inp->re - W1*Sum; Out->re += W5*Diff; // printf(" => %6.3f %6.3f\n",Mid->re,Out->re); Sum = Mid->im + Out->im; Diff = Mid->im - Out->im; Mid->im += W2*Inp->im - W1*Sum; Out->im += W5*Diff; } // ---------------------------------------------------------------------------- // periodic low pass dspPeriodLowPass2::dspPeriodLowPass2() { TapMid = NULL; TapOut = NULL; } dspPeriodLowPass2::~dspPeriodLowPass2() { free(TapMid); free(TapOut); Output.Free(); } void dspPeriodLowPass2::Free(void) { free(TapMid); TapMid = NULL; free(TapOut); TapOut = NULL; } int dspPeriodLowPass2::Preset(int Period, double IntegLen) { int i; Len = Period; if (dspRedspAllocArray(&TapMid, Len)) goto Error; if (dspRedspAllocArray(&TapOut, Len)) goto Error; for (i = 0; i < Len; i++) { TapMid[i] = 0.0; TapOut[i] = 0.0; } TapPtr = 0; dspLowPass2Coeff(IntegLen, W1, W2, W5); return 0; Error: Free(); return -1; } int dspPeriodLowPass2::Process(double Inp, double &Out) { dspLowPass2(Inp, TapMid[TapPtr], TapOut[TapPtr], W1, W2, W5); Out = TapOut[TapPtr++]; if(TapPtr >= Len) TapPtr = 0; return 0; } int dspPeriodLowPass2::Process(double *Inp, int InpLen, double *Out) { int i, batch; for (i = 0; i < InpLen; ) { for (batch = dspIntmin(InpLen-i, Len - TapPtr), i += batch; batch; batch--) { dspLowPass2(*Inp++, TapMid[TapPtr], TapOut[TapPtr], W1, W2, W5); (*Out++) = TapOut[TapPtr++]; } if (TapPtr >= Len) TapPtr = 0; } return 0; } int dspPeriodLowPass2::Process(double_buff *Input) { int err = Output.EnsureSpace(Input->Len); if (err) return -1; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // Low pass "moving box" FIR filter // very unpure spectral response but complexity very low // and independent on the integration time dspBoxFilter::dspBoxFilter() { Tap = NULL; } dspBoxFilter::~dspBoxFilter() { free(Tap); } void dspBoxFilter::Free(void) { free(Tap); Tap = NULL; Output.Free(); } int dspBoxFilter::Preset(int BoxLen) { int i; if (dspRedspAllocArray(&Tap, BoxLen)) return -1; for (i = 0; i < BoxLen; i++) Tap[i] = 0; Len = BoxLen; TapPtr = 0; Sum = 0; return 0; } int dspBoxFilter::Process(double *Inp, int InpLen, double *Out) { int i, batch; for (i = 0; i < InpLen; ) { for (batch = dspIntmin(InpLen-i, Len - TapPtr), i += batch; batch; batch--) { Sum -= Tap[TapPtr]; Out[i] = (Sum += Tap[TapPtr++] = Inp[i]); } if (TapPtr >= Len) TapPtr = 0; } for (Sum = 0, i = 0; i < Len; i++) Sum += Tap[i]; return InpLen; } void dspBoxFilter::Recalibrate() { int i; for (Sum = 0, i = 0; i < Len; i++) Sum += Tap[i]; } int dspBoxFilter::Process(double_buff *Input) { int err = Output.EnsureSpace(Input->Len); if (err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } dspCmpxBoxFilter::dspCmpxBoxFilter() { Tap = NULL; } dspCmpxBoxFilter::~dspCmpxBoxFilter() { free(Tap); } void dspCmpxBoxFilter::Free(void) { free(Tap); Tap = NULL; Output.Free(); } int dspCmpxBoxFilter::Preset(int BoxLen) { int i; if (dspRedspAllocArray(&Tap, BoxLen)) return -1; for (i = 0; i < BoxLen; i++) Tap[i].re = Tap[i].im = 0.0; Len = BoxLen; TapPtr = 0; Sum.re = 0.0; Sum.im = 0.0; return 0; } int dspCmpxBoxFilter::Process(dspCmpx *Inp, int InpLen, dspCmpx *Out) { int i, batch; for (i = 0; i < InpLen; ) { for (batch = dspIntmin(InpLen-i, Len - TapPtr), i += batch; batch; batch--) { Sum.re -= Tap[TapPtr].re; Sum.im -= Tap[TapPtr].im; Tap[TapPtr] = Inp[i]; Sum.re += Inp[i].re; Sum.im += Inp[i].im; Out[i].re = Sum.re; Out[i].im = Sum.im; } if (TapPtr >= Len) TapPtr = 0; } for (Sum.re = Sum.im = 0.0, i = 0; i < Len; i++) { Sum.re += Tap[i].re; Sum.im += Tap[i].im; } return InpLen; } void dspCmpxBoxFilter::Recalibrate() { int i; for (Sum.re = Sum.im = 0.0, i = 0; i < Len; i++) { Sum.re += Tap[i].re; Sum.im += Tap[i].im; } } int dspCmpxBoxFilter::Process(dspCmpx_buff *Input) { int err = Output.EnsureSpace(Input->Len); if(err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // FIR filter with a given shape dspFirFilter::dspFirFilter() { Tap = NULL; ExternShape = 1; } dspFirFilter::~dspFirFilter() { free(Tap); if (!ExternShape) free(Shape); } void dspFirFilter::Free(void) { free(Tap); Tap = NULL; if (!ExternShape) free(Shape); Shape = NULL; Output.Free(); } int dspFirFilter::Preset(int FilterLen, double *FilterShape) { int i; if (dspRedspAllocArray(&Tap, FilterLen)) return -1; for (i = 0; i < FilterLen; i++) Tap[i] = 0; Len = FilterLen; TapPtr = 0; if (!ExternShape) free(Shape); Shape = FilterShape; return 0; } int dspFirFilter::ComputeShape( double LowOmega, double UppOmega, double (*Window)(double)) { if (ExternShape) { Shape = NULL; ExternShape = 0; } if (dspRedspAllocArray(&Shape, Len)) return -1; dspWinFirI(LowOmega, UppOmega, Shape, Len, Window); return 0; } int dspFirFilter::Process(double *Inp, int InpLen, double *Out) { int i, s, t; double Sum; if(InpLenLen); if(err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // a pair of FIR filters. for quadrature split & decimate // the decimation rate must be an integer dspQuadrSplit::dspQuadrSplit() { ExternShape = 1; } dspQuadrSplit::~dspQuadrSplit() { if (!ExternShape) { free(ShapeI); free(ShapeQ); } } void dspQuadrSplit::Free(void) { Tap.Free(); if (!ExternShape) { free(ShapeI); free(ShapeQ); } ShapeI = NULL; ShapeQ = NULL; Output.Free(); } int dspQuadrSplit::Preset( int FilterLen, double *FilterShape_I, double *FilterShape_Q, int DecimateRate) { Len = FilterLen; if (!ExternShape) { free(ShapeI); free(ShapeQ); } ShapeI = FilterShape_I; ShapeQ = FilterShape_Q; ExternShape = 1; Tap.EnsureSpace(Len); Tap.Len = Len; dspClearArray(Tap.Data, Tap.Len); Rate = DecimateRate; return 0; } int dspQuadrSplit::ComputeShape(double LowOmega,double UppOmega, double (*Window)(double)) { if (ExternShape) { ShapeI = NULL; ShapeQ = NULL; ExternShape = 0; } if (dspRedspAllocArray(&ShapeI, Len)) return -1; if (dspRedspAllocArray(&ShapeQ, Len)) return -1; dspWinFirI(LowOmega, UppOmega, ShapeI, Len, Window); WinFirQ(LowOmega, UppOmega, ShapeQ, Len, Window); return 0; } int dspQuadrSplit::Process(double_buff *Input) { int err, i, s, t, o, l; double SumI, SumQ; double *Inp; dspCmpx *Out; int InpLen; InpLen = Input->Len; err = Tap.EnsureSpace(Tap.Len + InpLen); if (err) return err; dspCopyArray(Tap.Data+Tap.Len, Input->Data, InpLen); // printf("dspQuadrSplit: InpLen=%d, Tap.Len=%d",InpLen,Tap.Len); Tap.Len += InpLen; Inp = Tap.Data; // printf(" -> %d",Tap.Len); err = Output.EnsureSpace( InpLen / Rate + 2); if (err) return err; Out = Output.Data; for (l = Tap.Len-Len,o = 0, i = 0; i < l; i += Rate) { for (SumI = SumQ = 0.0, s = i,t = 0; t < Len; t++,s++) { SumI += Inp[s] * ShapeI[t]; SumQ += Inp[s] * ShapeQ[t]; } Out[o].re=SumI; Out[o++].im=SumQ; } Tap.Len -= i; dspMoveArray(Tap.Data,Tap.Data+i,Tap.Len); Output.Len = o; // printf(" => Tap.Len=%d\n",Tap.Len); return 0; } // ---------------------------------------------------------------------------- // reverse of dspQuadrSplit: interpolates and combines the I/Q // back into 'real' signal. dspQuadrComb::dspQuadrComb() { Tap = NULL; ExternShape = 1; } dspQuadrComb::~dspQuadrComb() { free(Tap); if (!ExternShape) { free(ShapeI); free(ShapeQ); } } void dspQuadrComb::Free(void) { free(Tap); Tap = NULL; if (!ExternShape) { free(ShapeI); free(ShapeQ); } ShapeI = NULL; ShapeQ = NULL; Output.Free(); } int dspQuadrComb::Preset( int FilterLen, double *FilterShape_I, double *FilterShape_Q, int DecimateRate) { int i; Len = FilterLen; if (dspRedspAllocArray(&Tap, Len)) return -1; if (!ExternShape) { free(ShapeI); free(ShapeQ); } ShapeI = FilterShape_I; ShapeQ = FilterShape_Q; ExternShape = 1; for (i = 0; i < FilterLen; i++) Tap[i] = 0.0; TapPtr = 0; Rate = DecimateRate; return 0; } int dspQuadrComb::ComputeShape( double LowOmega,double UppOmega, double (*Window)(double)) { if (ExternShape) { ShapeI = NULL; ShapeQ = NULL; ExternShape = 0; } if (dspRedspAllocArray(&ShapeI, Len)) return -1; if (dspRedspAllocArray(&ShapeQ, Len)) return -1; dspWinFirI(LowOmega, UppOmega, ShapeI, Len, Window); WinFirQ(LowOmega, UppOmega, ShapeQ, Len, Window); return 0; } int dspQuadrComb::Process(dspCmpx_buff *Input) { int err, i, o, r, t, len; dspCmpx *Inp; double *Out; int InpLen; double I, Q; InpLen = Input->Len; err = Output.EnsureSpace(InpLen*Rate); if (err) return err; Inp = Input->Data; Out = Output.Data; Output.Len = InpLen*Rate; for(o=0,i=0; i= 2*M_PI) dspPhase -= 2*M_PI; } return InpLen; } int dspCmpxMixer::ProcessFast(dspCmpx *Inp, int InpLen, dspCmpx *Out) { int i; double dI, dQ, I, Q, nI, nQ, N; dI = cos(Omega); dQ = sin(Omega); I = cos(dspPhase); Q = sin(dspPhase); for (i = 0; i < InpLen; i++) { Out[i].re = I*Inp[i].re + Q*Inp[i].im; Out[i].im = I*Inp[i].im - Q*Inp[i].re; nI = I*dI - Q*dQ; nQ = Q*dI + I*dQ; I = nI; Q = nQ; } dspPhase += InpLen*Omega; N = floor(dspPhase/(2*M_PI)); dspPhase -= N*2*M_PI; return InpLen; } int dspCmpxMixer::Process(dspCmpx_buff *Input) { int err = Output.EnsureSpace(Input->Len); if (err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } int dspCmpxMixer::ProcessFast(dspCmpx_buff *Input) { int err = Output.EnsureSpace(Input->Len); if(err) return err; ProcessFast(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // FM demodulator (dspPhase rotation speed meter) dspFMdemod::dspFMdemod() { PrevdspPhase = 0.0; RefOmega = 0.0; } int dspFMdemod::Preset(double CenterOmega) { RefOmega = CenterOmega; return 0; } int dspFMdemod::Process(double *InpI, double *InpQ, int InpLen, double *Out) { int i; double dspPhase, dspPhaseDiff; for (i = 0; i < InpLen; i++) { if ((InpI[i] == 0.0) && (InpQ[i] == 0.0)) dspPhase = 0; else dspPhase = atan2(InpQ[i], InpI[i]); dspPhaseDiff = dspPhase - PrevdspPhase - RefOmega; if (dspPhaseDiff >= M_PI) dspPhaseDiff -= 2*M_PI; else if (dspPhaseDiff < (-M_PI)) dspPhaseDiff += 2*M_PI; Out[i] = dspPhaseDiff; PrevdspPhase = dspPhase; } return InpLen; } int dspFMdemod::Process(dspCmpx *Inp, int InpLen, double *Out) { int i; double dspPhase, dspPhaseDiff; for (i = 0; i < InpLen; i++) { if ((Inp[i].re == 0.0) && (Inp[i].im == 0.0)) dspPhase = PrevdspPhase; else dspPhase = atan2(Inp[i].im, Inp[i].re); dspPhaseDiff = dspPhase - PrevdspPhase - RefOmega; if (dspPhaseDiff >= M_PI) dspPhaseDiff -= 2*M_PI; else if (dspPhaseDiff < (-M_PI)) dspPhaseDiff += 2*M_PI; Out[i] = dspPhaseDiff; PrevdspPhase = dspPhase; } return InpLen; } int dspFMdemod::Process(dspCmpx_buff *Input) { int err = Output.EnsureSpace(Input->Len); if(err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // Rate converter - real input/output, linear interpolation // expect large error when high frequency components are present // thus the best place to convert rates is after a low pass filter // of a demodulator. // note: in fldigi these rate converters are not used. // libsamplerate is the preferred solution dspRateConvLin::dspRateConvLin() { PrevSample = 0; OutdspPhase = 0; OutStep = 1.0; } void dspRateConvLin::SetOutVsInp(double OutVsInp) { OutStep = 1.0 / OutVsInp; } void dspRateConvLin::SetInpVsOut(double InpVsOut) { OutStep = InpVsOut; } int dspRateConvLin::Process(double_buff *Input) { int err, i, o; double *Inp, *Out; int InpLen; Inp = Input->Data; InpLen = Input->Len; err = Output.EnsureSpace((int)ceil(InpLen/OutStep) + 2); if (err) return err; Out = Output.Data; for (o = 0; OutdspPhase < 0; ) { Out[o++] = Inp[0]*(1.0 + OutdspPhase) - OutdspPhase*PrevSample; OutdspPhase += OutStep; } for (i = 0; i < (InpLen-1); ) { if (OutdspPhase >= 1.0) { OutdspPhase -= 1.0; i++; } else { Out[o++] = Inp[i]*(1.0 - OutdspPhase) + Inp[i+1]*OutdspPhase; OutdspPhase += OutStep; } } Output.Len = o; PrevSample = Inp[i]; OutdspPhase -= 1.0; return 0; } // ---------------------------------------------------------------------------- // Rate converter - real input/output, quadratic interpolation // similar limits like for RateConv1 dspRateConvQuadr::dspRateConvQuadr() { int i; for (i = 0; i < 4; i++) Tap[i] = 0; OutStep = 1.0; OutdspPhase = 0; TapPtr = 0; } void dspRateConvQuadr::SetOutVsInp(double OutVsInp) { OutStep = 1.0 / OutVsInp; } void dspRateConvQuadr::SetInpVsOut(double InpVsOut) { OutStep = InpVsOut; } int dspRateConvQuadr::Process( double *Inp, int InpLen, double *Out, int MaxOutLen, int *OutLen) { int i, o, t; double Ref0, Ref1, Diff0, Diff1; for (o = i = 0; (i < InpLen) && (o < MaxOutLen); ) { if (OutdspPhase >= 1.0) { Tap[TapPtr] = (*Inp++); i++; TapPtr = (TapPtr + 1) & 3; OutdspPhase -= 1.0; } else { t = TapPtr; Diff0 = (Tap[t^2] - Tap[t]) / 2; Ref1 = Tap[t^2]; t = (t + 1) & 3; Diff1 = (Tap[t^2] - Tap[t]) / 2; Ref0 = Tap[t]; (*Out++) = Ref0 * (1.0 - OutdspPhase) + Ref1*OutdspPhase // linear piece -(Diff1-Diff0)*OutdspPhase*(1.0-OutdspPhase)/2; // quadr. piece o++; OutdspPhase += OutStep; } } (*OutLen) = o; return i; } int dspRateConvQuadr::Process(double_buff *Input) { int err, i, o, t; double Ref0, Ref1, Diff0, Diff1; double *Inp,*Out; int InpLen; Inp = Input->Data; InpLen = Input->Len; err = Output.EnsureSpace((int)ceil(InpLen / OutStep) + 2); if (err) return err; Out = Output.Data; for (o = i = 0; i < InpLen; ) { if (OutdspPhase >= 1.0) { Tap[TapPtr] = (*Inp++); i++; TapPtr = (TapPtr + 1) & 3; OutdspPhase -= 1.0; } else { t = TapPtr; Diff0 = (Tap[t^2] - Tap[t]) / 2; Ref1 = Tap[t^2]; t = (t + 1) & 3; Diff1 = (Tap[t^2] - Tap[t]) / 2; Ref0 = Tap[t]; (*Out++) = Ref0 * (1.0 - OutdspPhase) + Ref1*OutdspPhase // linear piece -(Diff1 - Diff0)*OutdspPhase*(1.0 - OutdspPhase)/2; // quadr. piece o++; OutdspPhase += OutStep; } } Output.Len = o; return 0; } // ---------------------------------------------------------------------------- // Rate converter, real input/output, // bandwidth-limited interpolation, several shifted FIR filters dspRateConvBL::dspRateConvBL() { Tap = NULL; Shape = NULL; ExternShape = 1; } dspRateConvBL::~dspRateConvBL() { Free(); } void dspRateConvBL::Free(void) { int s; free(Tap); Tap = NULL; if (ExternShape) return; if (Shape) { for (s = 0; s < ShapeNum; s++) free(Shape[s]); free(Shape); Shape = NULL; } } int dspRateConvBL::Preset(int FilterLen, double **FilterShape, int FilterShapeNum) { int i; Free(); Len = FilterLen; if (dspRedspAllocArray(&Tap, Len)) return -1; TapSize = Len; for (i = 0; i < Len; i++) Tap[i] = 0.0; Shape = FilterShape; ShapeNum = FilterShapeNum; ExternShape = 1; OutStep = 1.0; OutdspPhase = 0.0; return 0; } int dspRateConvBL::ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)) { int idx; if (ExternShape) { if (dspAllocArray(&Shape, ShapeNum)) return -1; for (idx = 0; idx < ShapeNum; idx++) { if (dspAllocArray(&Shape[idx], Len)) return -1; } ExternShape = 0; } for (idx = 0; idx < ShapeNum; idx++) dspWinFirI(LowOmega, UppOmega, Shape[idx], Len, Window, (double)idx/ShapeNum); return 0; } void dspRateConvBL::SetOutVsInp(double OutVsInp) { OutStep = 1.0 / OutVsInp; } void dspRateConvBL::SetInpVsOut(double InpVsOut) { OutStep = InpVsOut; } int dspRateConvBL::Process(double_buff *Input) { int i, o, idx, t, err; double *shape; double Sum; double *Inp, *Out; int InpLen; Inp = Input->Data; InpLen = Input->Len; err = Output.EnsureSpace((int)ceil(InpLen/OutStep)+2); if (err) return err; Out = Output.Data; if ((Len + InpLen) > TapSize) { Tap = (double*)realloc(Tap, (Len+InpLen)*sizeof(double)); if (Tap == NULL) return -1; TapSize = Len + InpLen; } memcpy(Tap + Len, Inp, InpLen*sizeof(double)); for(o=i=0; i= 1.0) { OutdspPhase -= 1.0; i++; } else { idx = (int)floor(OutdspPhase*ShapeNum); shape = Shape[idx]; for (Sum = 0.0, t = 0; t < Len; t++) Sum += Tap[i + t]*shape[t]; Out[o++] = Sum; OutdspPhase += OutStep; } } Output.Len = o; memmove(Tap, Tap + InpLen, Len*sizeof(double)); return 0; } int dspRateConvBL::ProcessLinI(double_buff *Input) { int i, o, idx, t, err; double *Inp, *Out; int InpLen; double Sum0, Sum1; double *shape; double d; Inp = Input->Data; InpLen = Input->Len; err = Output.EnsureSpace((int)ceil(InpLen/OutStep)+2); if (err) return err; Out = Output.Data; if ((Len + InpLen) > TapSize) { Tap = (double*)realloc(Tap, (Len + InpLen)*sizeof(double)); if (Tap == NULL) return -1; TapSize = Len + InpLen; } memcpy(Tap + Len, Inp, InpLen*sizeof(double)); for (o = i = 0; i < InpLen; ) { if (OutdspPhase >= 1.0) { OutdspPhase -= 1.0; i++; } else { idx = (int)floor(OutdspPhase*ShapeNum); d = OutdspPhase*ShapeNum - idx; shape = Shape[idx]; for (Sum0 = 0.0, t = 0; t < Len; t++) Sum0 += Tap[i+t]*shape[t]; idx += 1; if (idx >= ShapeNum) { idx = 0; i++; } shape = Shape[idx]; for (Sum1 = 0.0, t = 0; t < Len; t++) Sum1 += Tap[i + t]*shape[t]; if (idx == 0) i--; Out[o++] = (1.0 - d)*Sum0 + d*Sum1; OutdspPhase += OutStep; } } Output.Len = o; memmove(Tap, Tap + InpLen, Len*sizeof(double)); return 0; } // ---------------------------------------------------------------------------- // Sliding window (for FFT input) dspCmpxSlideWindow::dspCmpxSlideWindow() { Buff = NULL; Window = NULL; ExternWindow = 1; } dspCmpxSlideWindow::~dspCmpxSlideWindow() { free(Buff); if (!ExternWindow) free(Window); } void dspCmpxSlideWindow::Free(void) { free(Buff); Buff = NULL; if (!ExternWindow) free(Window); Window = NULL; } int dspCmpxSlideWindow::Preset(int WindowLen, int SlideDist, double *WindowShape) { int i; if (SlideDist > WindowLen) return -1; Len = WindowLen; Dist = SlideDist; if (dspRedspAllocArray(&Buff, Len)) return -1; for (i = 0; i < Len; i++) Buff[i].re = Buff[i].im = 0.0; Ptr = 0; if (!ExternWindow) free(Window); Window = WindowShape; ExternWindow = 1; return 0; } int dspCmpxSlideWindow::SetWindow(double (*NewWindow)(double dspPhase), double Scale) { int idx; if (NewWindow == NULL) { if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; return 0; } if (ExternWindow) { Window = NULL; ExternWindow = 0; } if (dspRedspAllocArray(&Window, Len)) return -1; for (idx = 0; idx < Len; idx++) Window[idx] = (*NewWindow)(2*M_PI*(idx - Len/2 + 0.5)/Len)*Scale; return 0; } int dspCmpxSlideWindow::Process(dspCmpx_buff *Input) { dspCmpx *Inp = Input->Data; int InpLen = Input->Len; int i, len, err; Output.Len = 0; while (InpLen > 0) { len = dspIntmin(Len - Ptr, InpLen); memcpy(Buff + Ptr, Inp, len*sizeof(dspCmpx)); Ptr += len; Inp += len; InpLen -= len; if (Ptr >= Len) { len = Output.Len; err = Output.EnsureSpace(len + Len); if(err) return err; if (Window == NULL) memcpy(Output.Data, Buff, Len*sizeof(dspCmpx)); else for (i = 0; i < Len; i++) { Output.Data[len + i].re = Buff[i].re*Window[i]; Output.Data[len + i].im = Buff[i].im*Window[i]; } Output.Len += Len; memmove(Buff, Buff + Dist, (Len - Dist)*sizeof(dspCmpx)); Ptr -= Dist; } } return 0; } // ---------------------------------------------------------------------------- // Overlaping window (for IFFT output) dspCmpxOverlapWindow::dspCmpxOverlapWindow() { Buff = NULL; Window = NULL; ExternWindow = 1; } dspCmpxOverlapWindow::~dspCmpxOverlapWindow() { free(Buff); if (!ExternWindow) free(Window); } void dspCmpxOverlapWindow::Free(void) { free(Buff); Buff=NULL; if (!ExternWindow) free(Window); Window = NULL; } int dspCmpxOverlapWindow::Preset(int WindowLen, int SlideDist, double *WindowShape) { int i; if (SlideDist > WindowLen) return -1; Len = WindowLen; Dist = SlideDist; if (dspRedspAllocArray(&Buff, Len)) return -1; for (i = 0; i < Len; i++) Buff[i].re = Buff[i].im = 0.0; if (!ExternWindow) free(Window); Window = WindowShape; ExternWindow = 1; return 0; } int dspCmpxOverlapWindow::SetWindow(double (*NewWindow)(double dspPhase), double Scale) { int idx; if (NewWindow == NULL) { if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; return 0; } if (ExternWindow) { Window = NULL; ExternWindow = 0; } if (dspRedspAllocArray(&Window, Len)) return -1; for (idx = 0; idx < Len; idx++) Window[idx] = (*NewWindow)(2*M_PI*(idx - Len/2 + 0.5)/Len)*Scale; return 0; } int dspCmpxOverlapWindow::Process(dspCmpx_buff *Input) { int i, err; Output.Len = 0; for (i = 0; i < Input->Len; i += Len) { err = Output.EnsureSpace(Output.Len + Dist); if (err) return err; Process(Input->Data + i, Output.Data + Output.Len); Output.Len += Dist; } return 0; } int dspCmpxOverlapWindow::Process(dspCmpx *Input) { int err; err = Output.EnsureSpace(Dist); if (err) return err; Process(Input, Output.Data); Output.Len = Dist; return 0; } void dspCmpxOverlapWindow::Process(dspCmpx *Inp, dspCmpx *Out) { int i; if(Window == NULL) { for (i = 0; i < Dist; i++) { Out[i].re = Buff[i].re + Inp[i].re; Out[i].im = Buff[i].im + Inp[i].im; } for ( ; i < Len - Dist; i++) { Buff[i - Dist].re = Buff[i].re + Inp[i].re; Buff[i - Dist].im = Buff[i].im + Inp[i].im; } for ( ; i < Len; i++) { Buff[i - Dist].re = Inp[i].re; Buff[i - Dist].im = Inp[i].im; } } else { for (i = 0; i < Dist; i++) { Out[i].re = Buff[i].re + Inp[i].re*Window[i]; Out[i].im = Buff[i].im + Inp[i].im*Window[i]; } for ( ; i < Len - Dist; i++) { Buff[i - Dist].re = Buff[i].re + Inp[i].re*Window[i]; Buff[i - Dist].im = Buff[i].im + Inp[i].im*Window[i]; } for ( ; i < Len; i++) { Buff[i - Dist].re = Inp[i].re*Window[i]; Buff[i - Dist].im = Inp[i].im*Window[i]; } } } int dspCmpxOverlapWindow::ProcessSilence(int Slides) { int err, slide; err = Output.EnsureSpace(Slides*Dist); if (err) return err; Output.Len = 0; for (slide = 0; slide < Slides; slide++) { memcpy(Output.Data + Output.Len, Buff, Dist*sizeof(dspCmpx)); memcpy(Buff, Buff + Dist, (Len - Dist)*sizeof(dspCmpx)); Output.Len += Dist; } return 0; } // ---------------------------------------------------------------------------- // FFT dspPhase corrector dspFFT_TimeShift::dspFFT_TimeShift() { FreqTable = NULL; } dspFFT_TimeShift::~dspFFT_TimeShift() { free(FreqTable); } void dspFFT_TimeShift::Free(void) { free(FreqTable); FreqTable = NULL; } int dspFFT_TimeShift::Preset(int FFTlen, int Backwards) { int i; double p; dspPhase = 0; Len = FFTlen; LenMask = FFTlen - 1; if ((LenMask^Len) != (2*Len - 1)) return -1; if (dspRedspAllocArray(&FreqTable, Len)) return -1; for (i = 0; i < Len; i++) { p = (2*M_PI*i)/Len; if (Backwards) p = (-p); FreqTable[i].re = cos(p); FreqTable[i].im = sin(p); } return 0; } int dspFFT_TimeShift::Process(dspCmpx *Data, int Time) { double nI, nQ; int i, p; dspPhase = (dspPhase + Time) & LenMask; for (p = i = 0; i < Len; i++) { nI = Data[i].re*FreqTable[i].re - Data[i].im*FreqTable[i].im; nQ = Data[i].re*FreqTable[i].im + Data[i].im*FreqTable[i].re; Data[i].re = nI; Data[i].im = nQ; p = (p + dspPhase) & LenMask; } return 0; } // ---------------------------------------------------------------------------- // bit synchronizer, the bit rate is the input rate divided by four dspDiffBitSync4::dspDiffBitSync4(int IntegBits) { int i; IntegLen = IntegBits; InpTapLen = 4*IntegLen + 8; InpTap = (double*)malloc(InpTapLen*sizeof(double)); for (i = 0; i < InpTapLen; i++) InpTap[i] = 0; InpTapPtr = 0; for (i = 0; i < 4; i++) { DiffInteg[i] = DiffInteg0[i] = 0.0; } DiffTapPtr = 0; BitPtr = 0; SyncdspPhase = 0.0; SyncDrift = SyncDrift0 = 0; SyncConfid = 0.0; dspLowPass2Coeff((double)IntegLen*2, W1, W2, W5); } dspDiffBitSync4::~dspDiffBitSync4() { free(InpTap); } void dspDiffBitSync4::Free() { free(InpTap); InpTap=NULL; } int dspDiffBitSync4::Process( double *Inp, int InpLen, double *BitOut, double *IbitOut, int MaxOutLen, int *OutLen) { int i, o, t, step; double diff; double Sum, SumI, SumQ, dspPhase; for (step = 0,o = i = 0; (i < InpLen) && (o < MaxOutLen); i++) { diff = (-InpTap[InpTapPtr++]); if (InpTapPtr >= InpTapLen) InpTapPtr = 0; diff += (InpTap[InpTapPtr] = (*Inp++)); DiffTapPtr = (DiffTapPtr + 1) & 3; dspLowPass2(diff*diff, DiffInteg0[DiffTapPtr], DiffInteg[DiffTapPtr], W1, W2, W5); if (DiffTapPtr == BitPtr) { for (Sum = 0, t = 0; t < 4; t++) Sum += DiffInteg[t]; t = DiffTapPtr; SumI = DiffInteg[t] - DiffInteg[t^2]; t = (t + 1) & 3; SumQ = DiffInteg[t] - DiffInteg[t^2]; if ((Sum == 0.0) || ((SyncConfid = (SumI*SumI + SumQ*SumQ)/(Sum*Sum)) == 0.0)) { (*BitOut++) = 0; (*IbitOut++) = 0; o++; continue; } dspPhase = atan2(-SumQ, -SumI)*(4/(2*M_PI)); dspLowPass2(dspPhase - SyncdspPhase, SyncDrift0, SyncDrift, W1, W2, W5); SyncdspPhase = dspPhase; if (dspPhase > 0.52) { step = 1; SyncdspPhase -= 1.0; } else if (dspPhase < (-0.52)) { step = (-1); SyncdspPhase += 1.0; } else step = 0; double Samp[5], bit, ibit, dx; int p; p = InpTapPtr - 4*IntegLen - 2; if (p < 0) p += InpTapLen; for (t = 0; t < 5; t++) { Samp[t] = InpTap[p++]; if (p >= InpTapLen) p = 0; } dx = dspPhase-0.5; // bit=Samp[2]+dx*(Samp[2]-Samp[1]); // linear interpolation bit = Samp[2]*(1.0 + dx) - Samp[1]*dx // or quadratic + ((Samp[3] - Samp[1]) - (Samp[2] - Samp[0]))/2*dx*(1.0 + dx)/2; ibit = Samp[4] + dx*(Samp[4] - Samp[3]); //linear interpolation is enough (*BitOut++) = bit; (*IbitOut++) = ibit; o++; } else if (DiffTapPtr == (BitPtr^2)) { BitPtr = (BitPtr + step) & 3; step = 0; } } (*OutLen) = o; return i; } double dspDiffBitSync4::GetSyncConfid() { return 4*SyncConfid; } double dspDiffBitSync4::GetSyncDriftRate() { return SyncDrift/4; } // ---------------------------------------------------------------------------- // bit slicer, SNR/Tune meter dspBitSlicer::dspBitSlicer(int IntegBits) { int i; TapLen = IntegLen = IntegBits; Tap = (double *)malloc(TapLen*sizeof(double)); for (i = 0; i < TapLen; i++) Tap[i] = 0; TapPtr = 0; for (i = 0; i < 2; i++) { Sum[i] = Sum0[i] = 0.0; SumSq[i] = SumSq0[i] = 0.0; TimeAsym = TimeAsym0 = 0.0; dspAmplAsym = dspAmplAsym0 = 0.0; Noise[i] = 0; } dspLowPass2Coeff((double)IntegLen*2, W1, W2, W5); PrevBit = PrevIBit = 0.0; OptimThres = 0.0; } dspBitSlicer::~dspBitSlicer() { free(Tap); } int dspBitSlicer::Process(double *Bits, double *IBits, int InpLen, double *OutBits) { int i, l; double Bit, soft; for (i = 0; i < InpLen; i++) { Bit = Bits[i]; l = Bit > 0; dspLowPass2(Bit, Sum0[l], Sum[l], W1, W2, W5); dspLowPass2(Bit*Bit, SumSq0[l], SumSq[l], W1, W2, W5); Noise[l] = sqrt(SumSq[l] - Sum[l]*Sum[l]); if (Noise[0] + Noise[1] <= 0) OptimThres = 0; else OptimThres = (Sum[0]*Noise[1] + Sum[1]*Noise[0]) / (Noise[0] + Noise[1]); soft = Tap[TapPtr] - OptimThres; // we could do a better soft-decision if (Bit*PrevBit < 0) { dspLowPass2(PrevIBit, dspAmplAsym0, dspAmplAsym, W1, W2, W5); if (Bit > 0) PrevIBit = (-PrevIBit); dspLowPass2(PrevIBit, TimeAsym0, TimeAsym, W1, W2, W5); } (*OutBits++) = soft; PrevBit = Bit; PrevIBit = IBits[i]; Tap[TapPtr] = Bit; TapPtr++; if (TapPtr >= TapLen) TapPtr = 0; } return InpLen; } double dspBitSlicer::GetSigToNoise() { return Noise[1]>0 ? (Sum[1]-OptimThres)/Noise[1] : 0.0; } double dspBitSlicer::GetdspAmplAsym() { double Sweep=Sum[1]-Sum[0]; return Sweep>0 ? 2*dspAmplAsym/Sweep : 0.0; } double dspBitSlicer::GetTimeAsym() { double Sweep=Sum[1]-Sum[0]; return Sweep>0 ? 2*TimeAsym/Sweep : 0.0; } // ---------------------------------------------------------------------------- // The decoder for the HDLC frames, // makes no AX.25 CRC check, only the length in bytes against MinLen and MaxLen // however it does not pass frames with non-complete bytes. dspHDLCdecoder::dspHDLCdecoder( int minlen, int maxlen, int diff, int invert, int chan, int (*handler)(int, char *, int)) { MinLen = minlen; MaxLen = maxlen; RxDiff = diff; RxInvert = invert; ChanId = chan; FrameHandler = handler; Buff = (char *)malloc(MaxLen); Len = (-1); PrevLev = 0; ShiftReg = 0; BitCount = 0; Count1s = 0; AllFrameCount = 0; BadFrameCount = 0; } dspHDLCdecoder::~dspHDLCdecoder() { free(Buff); } int dspHDLCdecoder::Process(double *Inp, int InpLen) { int i, lev, bit, Flag; for (i = 0; i < InpLen; i++) { lev = Inp[i] > 0; bit = (lev^(PrevLev & RxDiff))^RxInvert; PrevLev = lev; ShiftReg = (ShiftReg >> 1) | (bit << 7); BitCount += 1; Flag = 0; if (bit) Count1s += 1; else { if (Count1s >= 7) Len = (-1); else if (Count1s == 6) Flag = 1; else if (Count1s == 5) { ShiftReg <<= 1; BitCount -= 1; } Count1s = 0; } if (Flag) { if ((Len >= MinLen) && (BitCount == 8)) (*FrameHandler)(ChanId, Buff, Len); Len = 0; BitCount = 0; } else if (Len >= 0) { if (BitCount == 8) { if (Len < MaxLen) Buff[Len++] = (char)ShiftReg; else Len = (-1); BitCount = 0; } } } return InpLen; } // ---------------------------------------------------------------------------- // AX.25 CRC, adress decoding, etc. short unsigned int dspAX25CRCtable[256] = { 0U, 4489U, 8978U, 12955U, 17956U, 22445U, 25910U, 29887U, 35912U, 40385U, 44890U, 48851U, 51820U, 56293U, 59774U, 63735U, 4225U, 264U, 13203U, 8730U, 22181U, 18220U, 30135U, 25662U, 40137U, 36160U, 49115U, 44626U, 56045U, 52068U, 63999U, 59510U, 8450U, 12427U, 528U, 5017U, 26406U, 30383U, 17460U, 21949U, 44362U, 48323U, 36440U, 40913U, 60270U, 64231U, 51324U, 55797U, 12675U, 8202U, 4753U, 792U, 30631U, 26158U, 21685U, 17724U, 48587U, 44098U, 40665U, 36688U, 64495U, 60006U, 55549U, 51572U, 16900U, 21389U, 24854U, 28831U, 1056U, 5545U, 10034U, 14011U, 52812U, 57285U, 60766U, 64727U, 34920U, 39393U, 43898U, 47859U, 21125U, 17164U, 29079U, 24606U, 5281U, 1320U, 14259U, 9786U, 57037U, 53060U, 64991U, 60502U, 39145U, 35168U, 48123U, 43634U, 25350U, 29327U, 16404U, 20893U, 9506U, 13483U, 1584U, 6073U, 61262U, 65223U, 52316U, 56789U, 43370U, 47331U, 35448U, 39921U, 29575U, 25102U, 20629U, 16668U, 13731U, 9258U, 5809U, 1848U, 65487U, 60998U, 56541U, 52564U, 47595U, 43106U, 39673U, 35696U, 33800U, 38273U, 42778U, 46739U, 49708U, 54181U, 57662U, 61623U, 2112U, 6601U, 11090U, 15067U, 20068U, 24557U, 28022U, 31999U, 38025U, 34048U, 47003U, 42514U, 53933U, 49956U, 61887U, 57398U, 6337U, 2376U, 15315U, 10842U, 24293U, 20332U, 32247U, 27774U, 42250U, 46211U, 34328U, 38801U, 58158U, 62119U, 49212U, 53685U, 10562U, 14539U, 2640U, 7129U, 28518U, 32495U, 19572U, 24061U, 46475U, 41986U, 38553U, 34576U, 62383U, 57894U, 53437U, 49460U, 14787U, 10314U, 6865U, 2904U, 32743U, 28270U, 23797U, 19836U, 50700U, 55173U, 58654U, 62615U, 32808U, 37281U, 41786U, 45747U, 19012U, 23501U, 26966U, 30943U, 3168U, 7657U, 12146U, 16123U, 54925U, 50948U, 62879U, 58390U, 37033U, 33056U, 46011U, 41522U, 23237U, 19276U, 31191U, 26718U, 7393U, 3432U, 16371U, 11898U, 59150U, 63111U, 50204U, 54677U, 41258U, 45219U, 33336U, 37809U, 27462U, 31439U, 18516U, 23005U, 11618U, 15595U, 3696U, 8185U, 63375U, 58886U, 54429U, 50452U, 45483U, 40994U, 37561U, 33584U, 31687U, 27214U, 22741U, 18780U, 15843U, 11370U, 7921U, 3960U } ; short unsigned int dspAX25CRC(char *Data, int Len) { int i, idx; short unsigned int CRC; for (CRC = 0xFFFF, i = 0; i < Len; i++) { idx = (unsigned char)CRC^(unsigned char)Data[i]; CRC = (CRC>>8)^dspAX25CRCtable[idx]; } CRC ^= 0xFFFF; return CRC; } // ---------------------------------------------------------------------------- // radix-2 FFT // constructor dsp_r2FFT::dsp_r2FFT() { BitRevIdx = NULL; Twiddle = NULL; /* Window=NULL; */ } // destructor: free twiddles, bit-reverse lookup and window tables dsp_r2FFT::~dsp_r2FFT() { free(BitRevIdx); free(Twiddle); /* free(Window); */ } void dsp_r2FFT::Free(void) { free(BitRevIdx); BitRevIdx = NULL; free(Twiddle); Twiddle = NULL; } // .......................................................................... // a radix-2 FFT bufferfly inline void dsp_r2FFT::FFTbf(dspCmpx &x0, dspCmpx &x1, dspCmpx &W) { dspCmpx x1W; x1W.re = x1.re*W.re + x1.im*W.im; // x1W.re=x1.re*W.re-x1.im*W.im; x1W.im = (-x1.re*W.im) + x1.im*W.re; // x1W.im=x1.re*W.im+x1.im*W.re; x1.re = x0.re - x1W.re; x1.im = x0.im - x1W.im; x0.re = x0.re + x1W.re; x0.im = x0.im + x1W.im; } // 2-point FFT inline void dsp_r2FFT::FFT2(dspCmpx &x0, dspCmpx &x1) { dspCmpx x1W; x1W.re = x1.re; x1W.im = x1.im; x1.re = x0.re - x1.re; x1.im = x0.im - x1.im; x0.re += x1W.re; x0.im += x1W.im; } // 4-point FFT // beware: these depend on the convention for the twiddle factors ! inline void dsp_r2FFT::FFT4(dspCmpx &x0, dspCmpx &x1, dspCmpx &x2, dspCmpx &x3) { dspCmpx x1W; x1W.re = x2.re; x1W.im = x2.im; x2.re = x0.re - x1W.re; x2.im = x0.im - x1W.im; x0.re = x0.re + x1W.re; x0.im = x0.im + x1W.im; x1W.re = x3.im; x1W.im = (-x3.re); x3.re = x1.re - x1W.re; x3.im = x1.im - x1W.im; x1.re = x1.re + x1W.re; x1.im = x1.im + x1W.im; } // .......................................................................... // bit reverse (in place) the dspSequence (before the actuall FFT) void dsp_r2FFT::Scramble(dspCmpx x[]) { int idx, ridx; dspCmpx tmp; for (idx = 0; idx < Size; idx++) if ((ridx = BitRevIdx[idx]) > idx) { tmp = x[idx]; x[idx] = x[ridx]; x[ridx] = tmp; /* printf("%d <=> %d\n",idx,ridx); */ } } // Preset for given processing size int dsp_r2FFT::Preset(int size) { int err, idx, ridx, mask, rmask; double dspPhase; if (!dspPowerOf2(size)) goto Error; Size = size; err = dspRedspAllocArray(&BitRevIdx, Size); if (err) goto Error; err = dspRedspAllocArray(&Twiddle, Size); if (err) goto Error; //printf("size, %d\n\n", size); //printf("idx,dspPhase,Twiddle.re,Twiddle.im\n"); for (idx = 0; idx < Size; idx++) { dspPhase = (2*M_PI*idx)/Size; Twiddle[idx].re = cos(dspPhase); Twiddle[idx].im = sin(dspPhase); //printf("%2d,%6.4f,%6.4f,%6.4f\n", idx,dspPhase,Twiddle[idx].re,Twiddle[idx].im); } //printf("\n\nidx,BitRevIdx\n"); for (ridx = 0, idx = 0; idx < Size; idx++) { for (ridx = 0, mask = Size/2, rmask = 1; mask; mask >>= 1, rmask <<= 1) { if (idx & mask) ridx |= rmask; } BitRevIdx[idx] = ridx; //printf("%d,%d\n",idx,ridx); } // free(Window); Window=NULL; WinInpScale=1.0/Size; WinOutScale=0.5; return 0; Error: Free(); return -1; } // .......................................................................... // radix-2 FFT: the first and the second pass are by hand // looks like there is no gain by separating the second pass // and even the first pass is in question ? void dsp_r2FFT::CoreProc(dspCmpx x[]) { int Groups, GroupHalfSize, Group, Bf, TwidIdx; int HalfSize = Size/2; for (Bf = 0; Bf < Size; Bf += 2) FFT2(x[Bf], x[Bf+1]); // first pass // for(Bf=0; Bf>= 1, GroupHalfSize <<= 1) for (Group = 0, Bf = 0; Group < Groups; Group++, Bf += GroupHalfSize) for (TwidIdx = 0; TwidIdx < HalfSize; TwidIdx += Groups, Bf++) { FFTbf(x[Bf], x[Bf + GroupHalfSize], Twiddle[TwidIdx]); /* printf("%2d %2d %2d\n",Bf,Bf+GroupHalfSize,TwidIdx); */ } } // .......................................................................... // separate the result of "two reals at one time" processing void dsp_r2FFT::SeparTwoReals(dspCmpx Buff[], dspCmpx Out0[], dspCmpx Out1[]) { int idx, HalfSize = Size/2; // for(idx=0; idxoutput dspDelay longer. dspSlideWinFFT::dspSlideWinFFT() { SlideBuff = NULL; FFTbuff = NULL; Window = NULL; ExternWindow = 1; } dspSlideWinFFT::~dspSlideWinFFT() { free(SlideBuff); free(FFTbuff); if (!ExternWindow) free(Window); } void dspSlideWinFFT::Free(void) { free(SlideBuff); SlideBuff = NULL; free(FFTbuff); FFTbuff = NULL; if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; Output.Free(); } int dspSlideWinFFT::Preset(int size, int step, double *window) { int err,i; Size = size; SizeMask = Size - 1; err = FFT.Preset(Size); if (err) goto Error; if (!ExternWindow) { free(Window); ExternWindow = 1; } Window = window; err = dspRedspAllocArray(&FFTbuff, Size); if (err) goto Error; err = dspRedspAllocArray(&SlideBuff, Size); if (err) goto Error; for (i = 0; i < Size; i++) SlideBuff[i] = 0.0; SlidePtr = 0; Slide = 0; Dist = step; Left = Dist; return 0; Error: Free(); return -1; } int dspSlideWinFFT::SetWindow(double (*NewWindow)(double dspPhase), double Scale) { int idx, err; if (NewWindow == NULL) { if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; return 0; } if (ExternWindow) { Window = NULL; ExternWindow = 0; } err = dspRedspAllocArray(&Window, Size); if (err) return -1; for (idx = 0; idx < Size; idx++) Window[idx] = Scale*(*NewWindow)(2*M_PI*(idx - Size/2 + 0.5)/Size); return 0; } int dspSlideWinFFT::Preset( int size, int step, double (*NewWindow)(double dspPhase), double Scale) { int err; err = Preset(size, step, (double *)NULL); if (err) return -1; err = SetWindow(NewWindow, Scale); if (err) { Free(); return -1; } return 0; } int dspSlideWinFFT::SetWindow(double *window) { if (!ExternWindow) { free(Window); ExternWindow = 1; } Window = window; return 0; } int dspSlideWinFFT::Process(double_buff *Input) { int err, len, i, t; int InpLen; double *Inp; Inp = Input->Data; InpLen = Input->Len; Output.Len = 0; while (InpLen) { for (i = len = dspIntmin(InpLen, Left); i; i--) { SlideBuff[SlidePtr++] = (*Inp++); SlidePtr &= SizeMask; } InpLen -= len; Left -= len; if(Left==0) { Slide ^= 1; Left = Dist; if (Slide) { for (t = 0, i = SlidePtr; i < Size; t++,i++) FFTbuff[t].re = Window[t]*SlideBuff[i]; for (i = 0; t < Size; t++, i++) FFTbuff[t].re = Window[t]*SlideBuff[i]; } else { for (t = 0, i = SlidePtr; i < Size; t++,i++) FFTbuff[t].im = Window[t]*SlideBuff[i]; for (i = 0; t < Size; t++,i++) FFTbuff[t].im = Window[t]*SlideBuff[i]; FFT.Scramble(FFTbuff); FFT.CoreProc(FFTbuff); len = Output.Len; err = Output.EnsureSpace(len + Size); if (err) return -1; FFT.SeparTwoReals(FFTbuff, Output.Data + len, Output.Data + len + Size/2); Output.Len += Size; } } } return 0; } // ---------------------------------------------------------------------------- // Overlapping IFFT to convert sliced spectra into time-domain output // ---------------------------------------------------------------------------- // Sliding window FFT for spectral processing // input: real-valued signal // in the middle you are given a chance to process // the complex-valued Fourier Transform (SpectraProc() routine). // output: real-valued signal // If you don't touch the spectra in SpectralProc() // the output will be an exact copy (only dspDelayed) of the input. dspSlideWinFFTproc::dspSlideWinFFTproc() { SlideBuff = NULL; OvlapBuff = NULL; FFTbuff = NULL; Spectr[0] = NULL; Spectr[1] = NULL; Window = NULL; ExternWindow = 1; } dspSlideWinFFTproc::~dspSlideWinFFTproc() { free(SlideBuff); free(OvlapBuff); free(FFTbuff); free(Spectr[0]); free(Spectr[1]); if (!ExternWindow) free(Window); } void dspSlideWinFFTproc::Free(void) { int i; free(SlideBuff); SlideBuff=NULL; free(OvlapBuff); OvlapBuff=NULL; free(FFTbuff); FFTbuff = NULL; for (i = 0; i < 2; i++) { free(Spectr[0]); Spectr[0] = NULL; } if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; Output.Free(); } int dspSlideWinFFTproc::Preset( int size, int step, void (*proc)(dspCmpx *Spectra, int Len), double *window) { int err, i; Size = size; SizeMask = Size - 1; err = FFT.Preset(Size); if (err) goto Error; if (!ExternWindow) { free(Window); ExternWindow = 1; } Window = window; dspRedspAllocArray(&FFTbuff, Size); if (err) goto Error; for (i = 0; i < 2; i++) { err = dspRedspAllocArray(&Spectr[i], Size/2); if (err) goto Error; } err = dspRedspAllocArray(&SlideBuff, Size); if (err) goto Error; for (i = 0; i < Size; i++) SlideBuff[i] = 0.0; SlidePtr = 0; Slide = 0; Dist = step; Left = Dist; err = dspRedspAllocArray(&OvlapBuff, Size); if (err) goto Error; for (i = 0; i < Size; i++) OvlapBuff[i] = 0.0; OvlapPtr = 0; SpectraProc = proc; return 0; Error: Free(); return -1; } int dspSlideWinFFTproc::Preset(int size, int step, void (*proc)(dspCmpx *Spectra, int Len), double (*NewWindow)(double dspPhase), double Scale) { int err; err = Preset(size, step, proc, (double *)NULL); if (err) return -1; err = SetWindow(NewWindow, Scale); if (err) { Free(); return -1; } return 0; } int dspSlideWinFFTproc::SetWindow(double *window) { if (!ExternWindow) { free(Window); ExternWindow = 1; } Window = window; return 0; } int dspSlideWinFFTproc::SetWindow(double (*NewWindow)(double dspPhase), double Scale) { int idx, err; if (NewWindow == NULL) { if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; return 0; } if (ExternWindow) { Window = NULL; ExternWindow = 0; } err = dspRedspAllocArray(&Window, Size); if (err) return -1; if (Scale == 0.0) Scale = sqrt(0.5/Size); for (idx = 0; idx < Size; idx++) Window[idx] = Scale*(*NewWindow)(2*M_PI*(idx - Size/2 + 0.5)/Size); return 0; } int dspSlideWinFFTproc::Process(double_buff *Input) { int err, len, i, t; int InpLen; double *Inp, *Out; Inp = Input->Data; InpLen = Input->Len; Output.Len = 0; while (InpLen) { for (i = len = dspIntmin(InpLen, Left); i; i--) { SlideBuff[SlidePtr++] = (*Inp++); SlidePtr &= SizeMask; } InpLen -= len; Left -= len; if (Left == 0) { Slide ^= 1; Left = Dist; if (Slide) { for (t = 0, i = SlidePtr; i < Size; t++,i++) FFTbuff[t].re = Window[t]*SlideBuff[i]; for (i = 0; t < Size; t++,i++) FFTbuff[t].re = Window[t]*SlideBuff[i]; } else { for (t = 0, i = SlidePtr; i < Size; t++,i++) FFTbuff[t].im = Window[t]*SlideBuff[i]; for (i = 0; t < Size; t++,i++) FFTbuff[t].im = Window[t]*SlideBuff[i]; FFT.Scramble(FFTbuff); FFT.CoreProc(FFTbuff); FFT.SeparTwoReals(FFTbuff, Spectr[0], Spectr[1]); for (i = 0; i < 2; i++) (*SpectraProc)(Spectr[i], Size); FFT.JoinTwoReals(Spectr[0], Spectr[1], FFTbuff); FFT.Scramble(FFTbuff); FFT.CoreProc(FFTbuff); err = Output.EnsureSpace(Output.Len + 2*Dist); if (err) return -1; Out = Output.Data + Output.Len; for (t = 0, i = OvlapPtr; i < Size; t++,i++) OvlapBuff[i] += Window[t]*FFTbuff[t].re; for (i = 0; t < Size; t++, i++) OvlapBuff[i] += Window[t]*FFTbuff[t].re; for (i = 0; i < Dist; i++) { (*Out++) = OvlapBuff[OvlapPtr]; OvlapBuff[OvlapPtr++] = 0.0; OvlapPtr &= SizeMask; } for (t = 0, i = OvlapPtr; i < Size; t++,i++) OvlapBuff[i] -= Window[t]*FFTbuff[t].im; for (i = 0; t < Size; t++,i++) OvlapBuff[i] -= Window[t]*FFTbuff[t].im; for (i = 0; i < Dist; i++) { (*Out++) = OvlapBuff[OvlapPtr]; OvlapBuff[OvlapPtr++] = 0.0; OvlapPtr &= SizeMask; } Output.Len += 2*Dist; } } } return 0; } // ---------------------------------------------------------------------------- // Walsh (Hadamard ?) transform. void dspWalshTrans(double *Data, int Len) // Len must be 2^N { int step, ptr, ptr2; double bit1, bit2; for (step = 1; step < Len; step *= 2) { for (ptr = 0; ptr < Len; ptr += 2*step) { for (ptr2 = ptr; (ptr2 - ptr) < step; ptr2 += 1) { bit1 = Data[ptr2]; bit2 = Data[ptr2 + step]; // Data[ptr2]=(bit1+bit2); Data[ptr2+step]=(bit1-bit2); Data[ptr2] = (bit1 + bit2); Data[ptr2 + step] = (bit2 - bit1); } } } } void dspWalshInvTrans(double *Data, int Len) // Len must be 2^N { int step, ptr, ptr2; double bit1, bit2; for (step = Len/2; step; step /= 2) { for (ptr = 0; ptr < Len; ptr += 2*step) { for (ptr2 = ptr; (ptr2 - ptr) < step; ptr2 += 1) { bit1 = Data[ptr2]; bit2 = Data[ptr2 + step]; // Data[ptr2]=(bit1+bit2); Data[ptr2+step]=(bit1-bit2); Data[ptr2] = (bit1 - bit2); Data[ptr2 + step] = (bit1 + bit2); } } } } // ---------------------------------------------------------------------------- fldigi-3.21.80/src/mt63/alias_k5.dat0000664000175000017500000001642612313064025013615 00000000000000/* * alias_k5.dat -- Anti-alias filter 500 Hz bandwidth * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi 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. * * Fldigi 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 fldigi. If not, see . * */ // Filter coefficiants made by ALIAS.C for the following parameters: // FilterLen=128 SampleRate=8000.0 FreqLow=500.0 FreqUpp=1000.0 // PassBandLow=437.5 PassBandUpp=1062.5 StopBandLow=250.0 StopBandUpp=1250.0 // => PeakInStopBand=-86.20 dB // Programmers's scale factor: 4.000000 // Programmers's comments: Anti-alias filter 500 Hz bandwidth, decimation by 8 const int Alias_k5_Len=128; double Alias_k5_I[Alias_k5_Len] = { +0.00006549 , // 0 +0.00007616 , // 1 +0.00006321 , // 2 -0.00007051 , // 3 -0.00037947 , // 4 -0.00077842 , // 5 -0.00101934 , // 6 -0.00079747 , // 7 +0.00003634 , // 8 +0.00128166 , // 9 +0.00238256 , // 10 +0.00269672 , // 11 +0.00193090 , // 12 +0.00045168 , // 13 -0.00082397 , // 14 -0.00100872 , // 15 +0.00002675 , // 16 +0.00132515 , // 17 +0.00130571 , // 18 -0.00111559 , // 19 -0.00545495 , // 20 -0.00950601 , // 21 -0.01047729 , // 22 -0.00687776 , // 23 +0.00011406 , // 24 +0.00696202 , // 25 +0.00989474 , // 26 +0.00760013 , // 27 +0.00255231 , // 28 -0.00031461 , // 29 +0.00291281 , // 30 +0.01174794 , // 31 +0.02064676 , // 32 +0.02211535 , // 33 +0.01194783 , // 34 -0.00696440 , // 35 -0.02537662 , // 36 -0.03322892 , // 37 -0.02665276 , // 38 -0.01145836 , // 39 +0.00006418 , // 40 -0.00230763 , // 41 -0.01840573 , // 42 -0.03588720 , // 43 -0.03743444 , // 44 -0.01306806 , // 45 +0.03074821 , // 46 +0.07251687 , // 47 +0.08836159 , // 48 +0.06850261 , // 49 +0.02612053 , // 50 -0.00913110 , // 51 -0.01081820 , // 52 +0.02342696 , // 53 +0.06482083 , // 54 +0.06779523 , // 55 -0.00021458 , // 56 -0.13123843 , // 57 -0.27054300 , // 58 -0.33962227 , // 59 -0.27857291 , // 60 -0.08448838 , // 61 +0.17772565 , // 62 +0.40136534 , // 63 +0.48897105 , // 64 +0.40136534 , // 65 +0.17772565 , // 66 -0.08448838 , // 67 -0.27857291 , // 68 -0.33962227 , // 69 -0.27054300 , // 70 -0.13123843 , // 71 -0.00021458 , // 72 +0.06779523 , // 73 +0.06482083 , // 74 +0.02342696 , // 75 -0.01081820 , // 76 -0.00913110 , // 77 +0.02612053 , // 78 +0.06850261 , // 79 +0.08836159 , // 80 +0.07251687 , // 81 +0.03074821 , // 82 -0.01306806 , // 83 -0.03743444 , // 84 -0.03588720 , // 85 -0.01840573 , // 86 -0.00230763 , // 87 +0.00006418 , // 88 -0.01145836 , // 89 -0.02665276 , // 90 -0.03322892 , // 91 -0.02537662 , // 92 -0.00696440 , // 93 +0.01194783 , // 94 +0.02211535 , // 95 +0.02064676 , // 96 +0.01174794 , // 97 +0.00291281 , // 98 -0.00031461 , // 99 +0.00255231 , // 100 +0.00760013 , // 101 +0.00989474 , // 102 +0.00696202 , // 103 +0.00011406 , // 104 -0.00687776 , // 105 -0.01047729 , // 106 -0.00950601 , // 107 -0.00545495 , // 108 -0.00111559 , // 109 +0.00130571 , // 110 +0.00132515 , // 111 +0.00002675 , // 112 -0.00100872 , // 113 -0.00082397 , // 114 +0.00045168 , // 115 +0.00193090 , // 116 +0.00269672 , // 117 +0.00238256 , // 118 +0.00128166 , // 119 +0.00003634 , // 120 -0.00079747 , // 121 -0.00101934 , // 122 -0.00077842 , // 123 -0.00037947 , // 124 -0.00007051 , // 125 +0.00006321 , // 126 +0.00007616 // 127 } ; double Alias_k5_Q[Alias_k5_Len] = { -0.00000000 , // 0 -0.00005367 , // 1 -0.00016555 , // 2 -0.00031225 , // 3 -0.00036198 , // 4 -0.00013710 , // 5 +0.00044740 , // 6 +0.00124698 , // 7 +0.00186810 , // 8 +0.00184150 , // 9 +0.00093521 , // 10 -0.00058853 , // 11 -0.00200435 , // 12 -0.00252488 , // 13 -0.00187551 , // 14 -0.00063367 , // 15 +0.00001967 , // 16 -0.00088264 , // 17 -0.00319853 , // 18 -0.00540709 , // 19 -0.00536877 , // 20 -0.00180828 , // 21 +0.00444555 , // 22 +0.01048985 , // 23 +0.01293826 , // 24 +0.01021951 , // 25 +0.00399079 , // 26 -0.00159281 , // 27 -0.00262530 , // 28 +0.00149295 , // 29 +0.00697645 , // 30 +0.00777564 , // 31 -0.00010048 , // 32 -0.01493909 , // 33 -0.02926626 , // 34 -0.03410235 , // 35 -0.02512027 , // 36 -0.00643493 , // 37 +0.01119978 , // 38 +0.01734888 , // 39 +0.00962767 , // 40 -0.00347093 , // 41 -0.00757142 , // 42 +0.00724618 , // 43 +0.03765704 , // 44 +0.06671856 , // 45 +0.07363882 , // 46 +0.04816692 , // 47 -0.00023240 , // 48 -0.04602175 , // 49 -0.06349448 , // 50 -0.04533960 , // 51 -0.01075524 , // 52 +0.00463299 , // 53 -0.02695458 , // 54 -0.10175325 , // 55 -0.17821917 , // 56 -0.19595859 , // 57 -0.11176981 , // 58 +0.06782857 , // 59 +0.27891973 , // 60 +0.42579279 , // 61 +0.42868878 , // 62 +0.26809297 , // 63 -0.00000000 , // 64 -0.26809297 , // 65 -0.42868878 , // 66 -0.42579279 , // 67 -0.27891973 , // 68 -0.06782857 , // 69 +0.11176981 , // 70 +0.19595859 , // 71 +0.17821917 , // 72 +0.10175325 , // 73 +0.02695458 , // 74 -0.00463299 , // 75 +0.01075524 , // 76 +0.04533960 , // 77 +0.06349448 , // 78 +0.04602175 , // 79 +0.00023240 , // 80 -0.04816692 , // 81 -0.07363882 , // 82 -0.06671856 , // 83 -0.03765704 , // 84 -0.00724618 , // 85 +0.00757142 , // 86 +0.00347093 , // 87 -0.00962767 , // 88 -0.01734888 , // 89 -0.01119978 , // 90 +0.00643493 , // 91 +0.02512027 , // 92 +0.03410235 , // 93 +0.02926626 , // 94 +0.01493909 , // 95 +0.00010048 , // 96 -0.00777564 , // 97 -0.00697645 , // 98 -0.00149295 , // 99 +0.00262530 , // 100 +0.00159281 , // 101 -0.00399079 , // 102 -0.01021951 , // 103 -0.01293826 , // 104 -0.01048985 , // 105 -0.00444555 , // 106 +0.00180828 , // 107 +0.00536877 , // 108 +0.00540709 , // 109 +0.00319853 , // 110 +0.00088264 , // 111 -0.00001967 , // 112 +0.00063367 , // 113 +0.00187551 , // 114 +0.00252488 , // 115 +0.00200435 , // 116 +0.00058853 , // 117 -0.00093521 , // 118 -0.00184150 , // 119 -0.00186810 , // 120 -0.00124698 , // 121 -0.00044740 , // 122 +0.00013710 , // 123 +0.00036198 , // 124 +0.00031225 , // 125 +0.00016555 , // 126 +0.00005367 // 127 } ; fldigi-3.21.80/src/mt63/morse.dat0000664000175000017500000000760512313064025013251 00000000000000// computer readable Morse code table // // For a given character you should pick up a 31-bit code from the table. // Bits should be taken starting from the LSB. // Bit equal 1 means carrier ON, bit 0 means carrier off // Each code includes one quiet dot at the start and two at the end. // The code should be read until the last '1', // but this last '1' must not be transmitted // const int MorseTableSize=128; long MorseTable[MorseTableSize] = { 0x00000004L , // 0x00 0x00000004L , // 0x01 0x00000004L , // 0x02 0x00000004L , // 0x03 0x00000004L , // 0x04 0x00000004L , // 0x05 0x00000004L , // 0x06 0x00000004L , // 0x07 0x00000004L , // 0x08 0x00000004L , // 0x09 0x00000004L , // 0x0A 0x00000004L , // 0x0B 0x00000004L , // 0x0C 0x00000004L , // 0x0D 0x00000004L , // 0x0E 0x00000004L , // 0x0F 0x00000004L , // 0x10 0x00000004L , // 0x11 0x00000004L , // 0x12 0x00000004L , // 0x13 0x00000004L , // 0x14 0x00000004L , // 0x15 0x00000004L , // 0x16 0x00000004L , // 0x17 0x00000004L , // 0x18 0x00000004L , // 0x19 0x00000004L , // 0x1A 0x00000004L , // 0x1B 0x00000004L , // 0x1C 0x00000004L , // 0x1D 0x00000004L , // 0x1E 0x00000004L , // 0x1F 0x00000004L , // 0x20 = ' ' 0x00000004L , // 0x21 = '!' 0x00000004L , // 0x22 = '"' 0x00000004L , // 0x23 = '#' 0x0013ABAAL , // 0x24 = '$' 0x00000004L , // 0x25 = '%' 0x00000004L , // 0x26 = '&' 0x004BBBBAL , // 0x27 = ''' 0x0004BBAEL , // 0x28 = '(' 0x004EBBAEL , // 0x29 = ')' 0x0004BABAL , // 0x2A = '*' 0x00012EBAL , // 0x2B = '+' 0x004EEAEEL , // 0x2C = ',' 0x0004EAAEL , // 0x2D = '-' 0x0013AEBAL , // 0x2E = '.' 0x00012EAEL , // 0x2F = '/' 0x004EEEEEL , // 0x30 = '0' 0x0013BBBAL , // 0x31 = '1' 0x0004EEEAL , // 0x32 = '2' 0x00013BAAL , // 0x33 = '3' 0x00004EAAL , // 0x34 = '4' 0x000012AAL , // 0x35 = '5' 0x00004AAEL , // 0x36 = '6' 0x00012AEEL , // 0x37 = '7' 0x0004AEEEL , // 0x38 = '8' 0x0012EEEEL , // 0x39 = '9' 0x0012AEEEL , // 0x3A = ':' 0x0012EBAEL , // 0x3B = ';' 0x00000004L , // 0x3C = '<' 0x00013AAEL , // 0x3D = '=' 0x00000004L , // 0x3E = '>' 0x0004AEEAL , // 0x3F = '?' 0x00000004L , // 0x40 = '@' 0x0000013AL , // 0x41 = 'A' 0x000012AEL , // 0x42 = 'B' 0x00004BAEL , // 0x43 = 'C' 0x000004AEL , // 0x44 = 'D' 0x00000012L , // 0x45 = 'E' 0x000012EAL , // 0x46 = 'F' 0x000012EEL , // 0x47 = 'G' 0x000004AAL , // 0x48 = 'H' 0x0000004AL , // 0x49 = 'I' 0x00013BBAL , // 0x4A = 'J' 0x000013AEL , // 0x4B = 'K' 0x000012BAL , // 0x4C = 'L' 0x000004EEL , // 0x4D = 'M' 0x0000012EL , // 0x4E = 'N' 0x00004EEEL , // 0x4F = 'O' 0x00004BBAL , // 0x50 = 'P' 0x00013AEEL , // 0x51 = 'Q' 0x000004BAL , // 0x52 = 'R' 0x0000012AL , // 0x53 = 'S' 0x0000004EL , // 0x54 = 'T' 0x000004EAL , // 0x55 = 'U' 0x000013AAL , // 0x56 = 'V' 0x000013BAL , // 0x57 = 'W' 0x00004EAEL , // 0x58 = 'X' 0x00013BAEL , // 0x59 = 'Y' 0x00004AEEL , // 0x5A = 'Z' 0x00000004L , // 0x5B = '[' 0x00000004L , // 0x5C = '\' 0x00000004L , // 0x5D = ']' 0x00000004L , // 0x5E = '^' 0x0013AEEAL , // 0x5F = '_' 0x00000004L , // 0x60 = '`' 0x0000013AL , // 0x61 = 'a' 0x000012AEL , // 0x62 = 'b' 0x00004BAEL , // 0x63 = 'c' 0x000004AEL , // 0x64 = 'd' 0x00000012L , // 0x65 = 'e' 0x000012EAL , // 0x66 = 'f' 0x000012EEL , // 0x67 = 'g' 0x000004AAL , // 0x68 = 'h' 0x0000004AL , // 0x69 = 'i' 0x00013BBAL , // 0x6A = 'j' 0x000013AEL , // 0x6B = 'k' 0x000012BAL , // 0x6C = 'l' 0x000004EEL , // 0x6D = 'm' 0x0000012EL , // 0x6E = 'n' 0x00004EEEL , // 0x6F = 'o' 0x00004BBAL , // 0x70 = 'p' 0x00013AEEL , // 0x71 = 'q' 0x000004BAL , // 0x72 = 'r' 0x0000012AL , // 0x73 = 's' 0x0000004EL , // 0x74 = 't' 0x000004EAL , // 0x75 = 'u' 0x000013AAL , // 0x76 = 'v' 0x000013BAL , // 0x77 = 'w' 0x00004EAEL , // 0x78 = 'x' 0x00013BAEL , // 0x79 = 'y' 0x00004AEEL , // 0x7A = 'z' 0x00000004L , // 0x7B = '{' 0x00000004L , // 0x7C = '|' 0x00000004L , // 0x7D = '}' 0x00000004L , // 0x7E = '~' 0x00000004L // 0x7F = '' } ; fldigi-3.21.80/src/mt63/alias_2k.dat0000664000175000017500000001042412313064025013602 00000000000000/* * alias_2k.dat -- Anti-alias filter 2000 Hz bandwidth * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi 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. * * Fldigi 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 fldigi. If not, see . * */ // Filter coefficiants made by ALIAS.C for the following parameters: // FilterLen=64 SampleRate=8000.0 FreqLow=500.0 FreqUpp=2500.0 // PassBandLow=375.0 PassBandUpp=2625.0 StopBandLow=0.0 StopBandUpp=3000.0 // => PeakInStopBand=-89.35 dB // Programmers's scale factor: 1.000000 // Programmers's comments: Anti-alias filter 2000 Hz bandwidth, decimation by 2 const int Alias_2k_Len=64; double Alias_2k_I[Alias_2k_Len] = { +0.00007244 , // 0 +0.00002831 , // 1 -0.00031179 , // 2 -0.00027704 , // 3 +0.00026218 , // 4 -0.00057780 , // 5 -0.00083336 , // 6 +0.00119188 , // 7 +0.00014945 , // 8 -0.00077327 , // 9 +0.00360739 , // 10 +0.00224833 , // 11 -0.00032116 , // 12 +0.00696821 , // 13 +0.00439713 , // 14 -0.00157675 , // 15 +0.00906983 , // 16 +0.00372045 , // 17 -0.00786599 , // 18 +0.00735339 , // 19 -0.00253048 , // 20 -0.02189728 , // 21 +0.00134354 , // 22 -0.01477966 , // 23 -0.04434362 , // 24 -0.00479913 , // 25 -0.03000591 , // 26 -0.07609801 , // 27 +0.00258946 , // 28 -0.04271980 , // 29 -0.14710769 , // 30 +0.14198817 , // 31 +0.42372962 , // 32 +0.14198817 , // 33 -0.14710769 , // 34 -0.04271980 , // 35 +0.00258946 , // 36 -0.07609801 , // 37 -0.03000591 , // 38 -0.00479913 , // 39 -0.04434362 , // 40 -0.01477966 , // 41 +0.00134354 , // 42 -0.02189728 , // 43 -0.00253048 , // 44 +0.00735339 , // 45 -0.00786599 , // 46 +0.00372045 , // 47 +0.00906983 , // 48 -0.00157675 , // 49 +0.00439713 , // 50 +0.00696821 , // 51 -0.00032116 , // 52 +0.00224833 , // 53 +0.00360739 , // 54 -0.00077327 , // 55 +0.00014945 , // 56 +0.00119188 , // 57 -0.00083336 , // 58 -0.00057780 , // 59 +0.00026218 , // 60 -0.00027704 , // 61 -0.00031179 , // 62 +0.00002831 // 63 } ; double Alias_2k_Q[Alias_2k_Len] = { -0.00000000 , // 0 -0.00015159 , // 1 -0.00014608 , // 2 +0.00036770 , // 3 +0.00010339 , // 4 -0.00031581 , // 5 +0.00128580 , // 6 +0.00120582 , // 7 -0.00051862 , // 8 +0.00225671 , // 9 +0.00226918 , // 10 -0.00216340 , // 11 +0.00181728 , // 12 +0.00176390 , // 13 -0.00692361 , // 14 -0.00105199 , // 15 -0.00081355 , // 16 -0.01498960 , // 17 -0.00512332 , // 18 -0.00331671 , // 19 -0.02395357 , // 20 -0.00602102 , // 21 -0.00049919 , // 22 -0.02943663 , // 23 +0.00351421 , // 24 +0.01576926 , // 25 -0.02737092 , // 26 +0.03572558 , // 27 +0.06272088 , // 28 -0.01659059 , // 29 +0.15254255 , // 30 +0.33394426 , // 31 -0.00000000 , // 32 -0.33394426 , // 33 -0.15254255 , // 34 +0.01659059 , // 35 -0.06272088 , // 36 -0.03572558 , // 37 +0.02737092 , // 38 -0.01576926 , // 39 -0.00351421 , // 40 +0.02943663 , // 41 +0.00049919 , // 42 +0.00602102 , // 43 +0.02395357 , // 44 +0.00331671 , // 45 +0.00512332 , // 46 +0.01498960 , // 47 +0.00081355 , // 48 +0.00105199 , // 49 +0.00692361 , // 50 -0.00176390 , // 51 -0.00181728 , // 52 +0.00216340 , // 53 -0.00226918 , // 54 -0.00225671 , // 55 +0.00051862 , // 56 -0.00120582 , // 57 -0.00128580 , // 58 +0.00031581 , // 59 -0.00010339 , // 60 -0.00036770 , // 61 +0.00014608 , // 62 +0.00015159 // 63 } ; fldigi-3.21.80/src/mfsk/0000775000175000017500000000000012313333727011661 500000000000000fldigi-3.21.80/src/mfsk/mfskvaricode.cxx0000664000175000017500000002570312313147652015011 00000000000000// ---------------------------------------------------------------------------- // // MFSKvaricode.cxx -- MFSK Varicode // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "mfskvaricode.h" /* * The IZ8BLY MFSK Varicode as defined in * http://www.qsl.net/zl1bpu/MFSK/Varicode.html */ static const char *varicode[] = { "11101011100", /* 000 - */ "11101100000", /* 001 - */ "11101101000", /* 002 - */ "11101101100", /* 003 - */ "11101110000", /* 004 - */ "11101110100", /* 005 - */ "11101111000", /* 006 - */ "11101111100", /* 007 - */ "10101000", /* 008 - */ "11110000000", /* 009 - */ "11110100000", /* 010 - */ "11110101000", /* 011 - */ "11110101100", /* 012 - */ "10101100", /* 013 - */ "11110110000", /* 014 - */ "11110110100", /* 015 - */ "11110111000", /* 016 - */ "11110111100", /* 017 - */ "11111000000", /* 018 - */ "11111010000", /* 019 - */ "11111010100", /* 020 - */ "11111011000", /* 021 - */ "11111011100", /* 022 - */ "11111100000", /* 023 - */ "11111101000", /* 024 - */ "11111101100", /* 025 - */ "11111110000", /* 026 - */ "11111110100", /* 027 - */ "11111111000", /* 028 - */ "11111111100", /* 029 - */ "100000000000", /* 030 - */ "101000000000", /* 031 - */ "100", /* 032 - */ "111000000", /* 033 - ! */ "111111100", /* 034 - '"' */ "1011011000", /* 035 - # */ "1010101000", /* 036 - $ */ "1010100000", /* 037 - % */ "1000000000", /* 038 - & */ "110111100", /* 039 - ' */ "111110100", /* 040 - ( */ "111110000", /* 041 - ) */ "1010110100", /* 042 - * */ "111100000", /* 043 - + */ "10100000", /* 044 - , */ "111011000", /* 045 - - */ "111010100", /* 046 - . */ "111101000", /* 047 - / */ "11100000", /* 048 - 0 */ "11110000", /* 049 - 1 */ "101000000", /* 050 - 2 */ "101010100", /* 051 - 3 */ "101110100", /* 052 - 4 */ "101100000", /* 053 - 5 */ "101101100", /* 054 - 6 */ "110100000", /* 055 - 7 */ "110000000", /* 056 - 8 */ "110101100", /* 057 - 9 */ "111101100", /* 058 - : */ "111111000", /* 059 - ; */ "1011000000", /* 060 - < */ "111011100", /* 061 - = */ "1010111100", /* 062 - > */ "111010000", /* 063 - ? */ "1010000000", /* 064 - @ */ "10111100", /* 065 - A */ "100000000", /* 066 - B */ "11010100", /* 067 - C */ "11011100", /* 068 - D */ "10111000", /* 069 - E */ "11111000", /* 070 - F */ "101010000", /* 071 - G */ "101011000", /* 072 - H */ "11000000", /* 073 - I */ "110110100", /* 074 - J */ "101111100", /* 075 - K */ "11110100", /* 076 - L */ "11101000", /* 077 - M */ "11111100", /* 078 - N */ "11010000", /* 079 - O */ "11101100", /* 080 - P */ "110110000", /* 081 - Q */ "11011000", /* 082 - R */ "10110100", /* 083 - S */ "10110000", /* 084 - T */ "101011100", /* 085 - U */ "110101000", /* 086 - V */ "101101000", /* 087 - W */ "101110000", /* 088 - X */ "101111000", /* 089 - Y */ "110111000", /* 090 - Z */ "1011101000", /* 091 - [ */ "1011010000", /* 092 - \ */ "1011101100", /* 093 - ] */ "1011010100", /* 094 - ^ */ "1010110000", /* 095 - _ */ "1010101100", /* 096 - ` */ "10100", /* 097 - a */ "1100000", /* 098 - b */ "111000", /* 099 - c */ "110100", /* 100 - d */ "1000", /* 101 - e */ "1010000", /* 102 - f */ "1011000", /* 103 - g */ "110000", /* 104 - h */ "11000", /* 105 - i */ "10000000", /* 106 - j */ "1110000", /* 107 - k */ "101100", /* 108 - l */ "1000000", /* 109 - m */ "11100", /* 110 - n */ "10000", /* 111 - o */ "1010100", /* 112 - p */ "1111000", /* 113 - q */ "100000", /* 114 - r */ "101000", /* 115 - s */ "1100", /* 116 - t */ "111100", /* 117 - u */ "1101100", /* 118 - v */ "1101000", /* 119 - w */ "1110100", /* 120 - x */ "1011100", /* 121 - y */ "1111100", /* 122 - z */ "1011011100", /* 123 - { */ "1010111000", /* 124 - | */ "1011100000", /* 125 - } */ "1011110000", /* 126 - ~ */ "101010000000", /* 127 - */ "101010100000", /* 128 - */ "101010101000", /* 129 - */ "101010101100", /* 130 - */ "101010110000", /* 131 - */ "101010110100", /* 132 - */ "101010111000", /* 133 - */ "101010111100", /* 134 - */ "101011000000", /* 135 - */ "101011010000", /* 136 - */ "101011010100", /* 137 - */ "101011011000", /* 138 - */ "101011011100", /* 139 - */ "101011100000", /* 140 - */ "101011101000", /* 141 - */ "101011101100", /* 142 - */ "101011110000", /* 143 - */ "101011110100", /* 144 - */ "101011111000", /* 145 - */ "101011111100", /* 146 - */ "101100000000", /* 147 - */ "101101000000", /* 148 - */ "101101010000", /* 149 - */ "101101010100", /* 150 - */ "101101011000", /* 151 - */ "101101011100", /* 152 - */ "101101100000", /* 153 - */ "101101101000", /* 154 - */ "101101101100", /* 155 - */ "101101110000", /* 156 - */ "101101110100", /* 157 - */ "101101111000", /* 158 - */ "101101111100", /* 159 - */ "1011110100", /* 160 - */ "1011111000", /* 161 - ¡ */ "1011111100", /* 162 - ¢ */ "1100000000", /* 163 - £ */ "1101000000", /* 164 - ¤ */ "1101010000", /* 165 - ¥ */ "1101010100", /* 166 - ¦ */ "1101011000", /* 167 - § */ "1101011100", /* 168 - ¨ */ "1101100000", /* 169 - © */ "1101101000", /* 170 - ª */ "1101101100", /* 171 - « */ "1101110000", /* 172 - ¬ */ "1101110100", /* 173 - ­ */ "1101111000", /* 174 - ® */ "1101111100", /* 175 - ¯ */ "1110000000", /* 176 - ° */ "1110100000", /* 177 - ± */ "1110101000", /* 178 - ² */ "1110101100", /* 179 - ³ */ "1110110000", /* 180 - ´ */ "1110110100", /* 181 - µ */ "1110111000", /* 182 - ¶ */ "1110111100", /* 183 - · */ "1111000000", /* 184 - ¸ */ "1111010000", /* 185 - ¹ */ "1111010100", /* 186 - º */ "1111011000", /* 187 - » */ "1111011100", /* 188 - ¼ */ "1111100000", /* 189 - ½ */ "1111101000", /* 190 - ¾ */ "1111101100", /* 191 - ¿ */ "1111110000", /* 192 - À */ "1111110100", /* 193 - Á */ "1111111000", /* 194 -  */ "1111111100", /* 195 - à */ "10000000000", /* 196 - Ä */ "10100000000", /* 197 - Å */ "10101000000", /* 198 - Æ */ "10101010000", /* 199 - Ç */ "10101010100", /* 200 - È */ "10101011000", /* 201 - É */ "10101011100", /* 202 - Ê */ "10101100000", /* 203 - Ë */ "10101101000", /* 204 - Ì */ "10101101100", /* 205 - Í */ "10101110000", /* 206 - Î */ "10101110100", /* 207 - Ï */ "10101111000", /* 208 - Ð */ "10101111100", /* 209 - Ñ */ "10110000000", /* 210 - Ò */ "10110100000", /* 211 - Ó */ "10110101000", /* 212 - Ô */ "10110101100", /* 213 - Õ */ "10110110000", /* 214 - Ö */ "10110110100", /* 215 - × */ "10110111000", /* 216 - Ø */ "10110111100", /* 217 - Ù */ "10111000000", /* 218 - Ú */ "10111010000", /* 219 - Û */ "10111010100", /* 220 - Ü */ "10111011000", /* 221 - Ý */ "10111011100", /* 222 - Þ */ "10111100000", /* 223 - ß */ "10111101000", /* 224 - à */ "10111101100", /* 225 - á */ "10111110000", /* 226 - â */ "10111110100", /* 227 - ã */ "10111111000", /* 228 - ä */ "10111111100", /* 229 - å */ "11000000000", /* 230 - æ */ "11010000000", /* 231 - ç */ "11010100000", /* 232 - è */ "11010101000", /* 233 - é */ "11010101100", /* 234 - ê */ "11010110000", /* 235 - ë */ "11010110100", /* 236 - ì */ "11010111000", /* 237 - í */ "11010111100", /* 238 - î */ "11011000000", /* 239 - ï */ "11011010000", /* 240 - ð */ "11011010100", /* 241 - ñ */ "11011011000", /* 242 - ò */ "11011011100", /* 243 - ó */ "11011100000", /* 244 - ô */ "11011101000", /* 245 - õ */ "11011101100", /* 246 - ö */ "11011110000", /* 247 - ÷ */ "11011110100", /* 248 - ø */ "11011111000", /* 249 - ù */ "11011111100", /* 250 - ú */ "11100000000", /* 251 - û */ "11101000000", /* 252 - n */ "11101010000", /* 253 - ý */ "11101010100", /* 254 - þ */ "11101011000" /* 255 - ÿ */ }; /* * The same in a format more suitable for decoding. */ static const unsigned int varidecode[] = { 0x75C, 0x760, 0x768, 0x76C, 0x770, 0x774, 0x778, 0x77C, 0x0A8, 0x780, 0x7A0, 0x7A8, 0x7AC, 0x0AC, 0x7B0, 0x7B4, 0x7B8, 0x7BC, 0x7C0, 0x7D0, 0x7D4, 0x7D8, 0x7DC, 0x7E0, 0x7E8, 0x7EC, 0x7F0, 0x7F4, 0x7F8, 0x7FC, 0x800, 0xA00, 0x004, 0x1C0, 0x1FC, 0x2D8, 0x2A8, 0x2A0, 0x200, 0x1BC, 0x1F4, 0x1F0, 0x2B4, 0x1E0, 0x0A0, 0x1D8, 0x1D4, 0x1E8, 0x0E0, 0x0F0, 0x140, 0x154, 0x174, 0x160, 0x16C, 0x1A0, 0x180, 0x1AC, 0x1EC, 0x1F8, 0x2C0, 0x1DC, 0x2BC, 0x1D0, 0x280, 0x0BC, 0x100, 0x0D4, 0x0DC, 0x0B8, 0x0F8, 0x150, 0x158, 0x0C0, 0x1B4, 0x17C, 0x0F4, 0x0E8, 0x0FC, 0x0D0, 0x0EC, 0x1B0, 0x0D8, 0x0B4, 0x0B0, 0x15C, 0x1A8, 0x168, 0x170, 0x178, 0x1B8, 0x2E8, 0x2D0, 0x2EC, 0x2D4, 0x2B0, 0x2AC, 0x014, 0x060, 0x038, 0x034, 0x008, 0x050, 0x058, 0x030, 0x018, 0x080, 0x070, 0x02C, 0x040, 0x01C, 0x010, 0x054, 0x078, 0x020, 0x028, 0x00C, 0x03C, 0x06C, 0x068, 0x074, 0x05C, 0x07C, 0x2DC, 0x2B8, 0x2E0, 0x2F0, 0xA80, 0xAA0, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xAE8, 0xAEC, 0xAF0, 0xAF4, 0xAF8, 0xAFC, 0xB00, 0xB40, 0xB50, 0xB54, 0xB58, 0xB5C, 0xB60, 0xB68, 0xB6C, 0xB70, 0xB74, 0xB78, 0xB7C, 0x2F4, 0x2F8, 0x2FC, 0x300, 0x340, 0x350, 0x354, 0x358, 0x35C, 0x360, 0x368, 0x36C, 0x370, 0x374, 0x378, 0x37C, 0x380, 0x3A0, 0x3A8, 0x3AC, 0x3B0, 0x3B4, 0x3B8, 0x3BC, 0x3C0, 0x3D0, 0x3D4, 0x3D8, 0x3DC, 0x3E0, 0x3E8, 0x3EC, 0x3F0, 0x3F4, 0x3F8, 0x3FC, 0x400, 0x500, 0x540, 0x550, 0x554, 0x558, 0x55C, 0x560, 0x568, 0x56C, 0x570, 0x574, 0x578, 0x57C, 0x580, 0x5A0, 0x5A8, 0x5AC, 0x5B0, 0x5B4, 0x5B8, 0x5BC, 0x5C0, 0x5D0, 0x5D4, 0x5D8, 0x5DC, 0x5E0, 0x5E8, 0x5EC, 0x5F0, 0x5F4, 0x5F8, 0x5FC, 0x600, 0x680, 0x6A0, 0x6A8, 0x6AC, 0x6B0, 0x6B4, 0x6B8, 0x6BC, 0x6C0, 0x6D0, 0x6D4, 0x6D8, 0x6DC, 0x6E0, 0x6E8, 0x6EC, 0x6F0, 0x6F4, 0x6F8, 0x6FC, 0x700, 0x740, 0x750, 0x754, 0x758 }; const char *varienc(int c) { if (c >= 0 && c < 256) return varicode[c]; return varicode[0]; } int varidec(unsigned int symbol) { int i; for (i = 0; i < 256; i++) if (symbol == varidecode[i]) return i; return -1; } fldigi-3.21.80/src/mfsk/mfsk-pic.cxx0000664000175000017500000002670212313064025014035 00000000000000// ---------------------------------------------------------------------------- // mfsk-pic.cxx -- mfsk support functions // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include "gettext.h" Fl_Double_Window *picRxWin = (Fl_Double_Window *)0; picture *picRx = (picture *)0; Fl_Double_Window *picTxWin = (Fl_Double_Window *)0; picture *picTx = (picture *)0; picbox *picTxBox = 0; Fl_Button *btnpicTxSPP = (Fl_Button *)0; Fl_Button *btnpicTxSendColor = (Fl_Button *)0; Fl_Button *btnpicTxSendGrey = (Fl_Button *)0; Fl_Button *btnpicTxSendAbort = (Fl_Button *)0; Fl_Button *btnpicTxLoad = (Fl_Button *)0; Fl_Button *btnpicTxClose = (Fl_Button *)0; Fl_Shared_Image *TxImg = (Fl_Shared_Image *)0; unsigned char *xmtimg = (unsigned char *)0; unsigned char *xmtpicbuff = (unsigned char *)0; mfsk *serviceme = 0; int txSPP = 8; char txclr_tooltip[24]; char txgry_tooltip[24]; void updateRxPic(unsigned char data, int pos) { picRx->pixel(data, pos); } void createRxViewer() { FL_LOCK_D(); picRxWin = new Fl_Double_Window(200, 140); picRxWin->xclass(PACKAGE_NAME); picRxWin->begin(); picRx = new picture(2, 2, 136, 104); picRxWin->end(); FL_UNLOCK_D(); } void showRxViewer(int W, int H) { FL_LOCK_E(); if (!picRxWin) createRxViewer(); int winW, winH; int picX, picY; winW = W < 136 ? 140 : W + 4; winH = H + 4; picX = (winW - W) / 2; picY = 2; picRxWin->size(winW, winH); picRx->resize(picX, picY, W, H); picRx->clear(); picRxWin->show(); FL_UNLOCK_E(); } void load_image(const char *n) { if (serviceme != active_modem) return; int W, H, D; unsigned char *img_data; if (TxImg) { TxImg->release(); TxImg = 0; } TxImg = Fl_Shared_Image::get(n); if (!TxImg) return; if (TxImg->count() > 1) { TxImg->release(); TxImg = 0; return; } img_data = (unsigned char *)TxImg->data()[0]; W = TxImg->w(); H = TxImg->h(); D = TxImg->d(); if (xmtimg) delete [] xmtimg; xmtimg = new unsigned char [W * H * 3]; if (D == 3) memcpy(xmtimg, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; xmtimg[j] = img_data[k]; xmtimg[j+1] = img_data[k+1]; xmtimg[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; xmtimg[j] = xmtimg[j+1] = xmtimg[j+2] = img_data[i]; } } else return; TxViewerResize(W, H); char* label = strdup(n); picTxWin->copy_label(basename(label)); free(label); picTxBox->label(0); // load the picture widget with the rgb image FL_LOCK_D(); picTx->show(); picTx->clear(); picTxWin->redraw(); picTx->video(xmtimg, W * H * 3); if (print_time_left( (W * H * 3) * 0.000125 * serviceme->TXspp, txclr_tooltip, sizeof(txclr_tooltip), _("Time needed: ")) > 0) btnpicTxSendColor->tooltip(txclr_tooltip); btnpicTxSendColor->activate(); if (print_time_left( (W * H) * 0.000125 * serviceme->TXspp, txgry_tooltip, sizeof(txgry_tooltip), _("Time needed: ")) > 0) btnpicTxSendGrey->tooltip(txgry_tooltip); btnpicTxSendGrey->activate(); FL_UNLOCK_D(); } void updateTxPic(unsigned char data) { if (serviceme != active_modem) return; if (serviceme->color) { serviceme->pixelnbr = serviceme->rgb + serviceme->row + 3*serviceme->col; picTx->pixel(data, serviceme->pixelnbr); if (++serviceme->col == TxImg->w()) { serviceme->col = 0; if (++serviceme->rgb == 3) { serviceme->rgb = 0; serviceme->row += 3 * TxImg->w(); } } } else { picTx->pixel( data, serviceme->pixelnbr++ ); picTx->pixel( data, serviceme->pixelnbr++ ); picTx->pixel( data, serviceme->pixelnbr++ ); } } void cb_picTxLoad(Fl_Widget *, void *) { const char *fn = FSEL::select(_("Load image file"), "Portable Network Graphics\t*.png\n" "Independent JPEG Group\t*.{jpg,jif,jpeg,jpe}\n" "Graphics Interchange Format\t*.gif", PicsDir.c_str()); if (fn) load_image(fn); } void cb_picTxClose( Fl_Widget *w, void *) { FL_LOCK_D(); picTxWin->hide(); FL_UNLOCK_D(); } void pic_TxSendColor() { int W, H, rowstart; W = TxImg->w(); H = TxImg->h(); if (xmtpicbuff) delete [] xmtpicbuff; xmtpicbuff = new unsigned char [W*H*3]; unsigned char *outbuf = xmtpicbuff; unsigned char *inbuf = xmtimg; int iy, ix, rgb; for (iy = 0; iy < H; iy++) { rowstart = iy * W * 3; for (rgb = 0; rgb < 3; rgb++) for (ix = 0; ix < W; ix++) outbuf[rowstart + rgb*W + ix] = inbuf[rowstart + rgb + ix*3]; } if (serviceme->TXspp == 8) snprintf(serviceme->picheader, PICHEADER, "\nSending Pic:%dx%dC;", W, H); else snprintf(serviceme->picheader, PICHEADER, "\nSending Pic:%dx%dCp%d;", W, H,serviceme->TXspp); serviceme->xmtbytes = W * H * 3; serviceme->color = true; serviceme->rgb = 0; serviceme->col = 0; serviceme->row = 0; serviceme->pixelnbr = 0; FL_LOCK_D(); btnpicTxSPP->hide(); btnpicTxSendColor->hide(); btnpicTxSendGrey->hide(); btnpicTxLoad->hide(); btnpicTxClose->hide(); btnpicTxSendAbort->show(); picTx->clear(); FL_UNLOCK_D(); if (!picTxWin->visible()) picTxWin->show(); ; // start the transmission start_tx(); serviceme->startpic = true; } void cb_picTxSendColor( Fl_Widget *w, void *) { pic_TxSendColor(); } void cb_picTxSendGrey( Fl_Widget *w, void *) { if (serviceme != active_modem) return; int W, H; W = TxImg->w(); H = TxImg->h(); if (xmtpicbuff) delete [] xmtpicbuff; xmtpicbuff = new unsigned char [W*H]; unsigned char *outbuf = xmtpicbuff; unsigned char *inbuf = xmtimg; for (int i = 0; i < W*H; i++) outbuf[i] = ( 31 * inbuf[i*3] + 61 * inbuf[i*3 + 1] + 8 * inbuf[i*3 + 2])/100; if (serviceme->TXspp == 8) snprintf(serviceme->picheader, PICHEADER, "\nSending Pic:%dx%d;", W, H); else snprintf(serviceme->picheader, PICHEADER, "\nSending Pic:%dx%dp%d;", W, H,serviceme->TXspp); serviceme->xmtbytes = W * H; serviceme->color = false; serviceme->col = 0; serviceme->row = 0; serviceme->pixelnbr = 0; FL_LOCK_D(); btnpicTxSPP->hide(); btnpicTxSendColor->hide(); btnpicTxSendGrey->hide(); btnpicTxLoad->hide(); btnpicTxClose->hide(); btnpicTxSendAbort->show(); picTx->clear(); FL_UNLOCK_D(); // start the transmission start_tx(); serviceme->startpic = true; } void cb_picTxSendAbort( Fl_Widget *w, void *) { if (serviceme != active_modem) return; serviceme->abortxmt = true; // reload the picture widget with the rgb image FL_LOCK_D(); picTx->video(xmtimg, TxImg->w() * TxImg->h() * 3); FL_UNLOCK_D(); } void cb_picTxSPP( Fl_Widget *w, void *) { if (serviceme != active_modem) return; Fl_Button *b = (Fl_Button *)w; if (serviceme->TXspp == 8) serviceme->TXspp = 4; else if (serviceme->TXspp == 4) serviceme->TXspp = 2; else serviceme->TXspp = 8; if (serviceme->TXspp == 8) b->label("X1"); else if (serviceme->TXspp == 4) b->label("X2"); else b->label("X4"); b->redraw_label(); txSPP = serviceme->TXspp; if (TxImg == 0) return; if (TxImg->w() > 0 && TxImg->h() > 0) { if (print_time_left( (TxImg->w() * TxImg->h() * 3) * 0.000125 * serviceme->TXspp, txclr_tooltip, sizeof(txclr_tooltip), _("Time needed: ")) > 0) btnpicTxSendColor->tooltip(txclr_tooltip); if (print_time_left( (TxImg->w() * TxImg->h()) * 0.000125 * serviceme->TXspp, txgry_tooltip, sizeof(txgry_tooltip), _("Time needed: ")) > 0) btnpicTxSendGrey->tooltip(txgry_tooltip); } } void createTxViewer() { FL_LOCK_D(); picTxWin = new Fl_Double_Window(290, 180, _("Send image")); picTxWin->xclass(PACKAGE_NAME); picTxWin->begin(); picTx = new picture (2, 2, 286, 150); picTx->hide(); picTxBox = new picbox(picTxWin->x(), picTxWin->y(), picTxWin->w(), picTxWin->h(), _("Load or drop an image file\nSupported types: PNG, JPEG, BMP")); picTxBox->labelfont(FL_HELVETICA_ITALIC); btnpicTxSPP = new Fl_Button(5, 180 - 26, 40, 24, "X1"); btnpicTxSPP->tooltip(_("Transfer speed, X1-normal")); btnpicTxSPP->callback( cb_picTxSPP, 0); btnpicTxSendColor = new Fl_Button(45, 180 - 26, 60, 24, "XmtClr"); btnpicTxSendColor->callback(cb_picTxSendColor, 0); btnpicTxSendGrey = new Fl_Button(105, 180 - 26, 60, 24, "XmtGry"); btnpicTxSendGrey->callback( cb_picTxSendGrey, 0); btnpicTxSendAbort = new Fl_Button(84, 180 - 26, 122, 24, "Abort Xmt"); btnpicTxSendAbort->callback(cb_picTxSendAbort, 0); btnpicTxLoad = new Fl_Button(165, 180 - 26, 60, 24, _("Load")); btnpicTxLoad->callback(cb_picTxLoad, 0); btnpicTxClose = new Fl_Button(225, 180 - 26, 60, 24, _("Close")); btnpicTxClose->callback(cb_picTxClose, 0); btnpicTxSendAbort->hide(); btnpicTxSendColor->deactivate(); btnpicTxSendGrey->deactivate(); picTxWin->end(); FL_UNLOCK_D(); } void TxViewerResize(int W, int H) { int winW, winH; int picX, picY; winW = W < 286 ? 290 : W + 4; winH = H < 180 ? 210 : H + 30; picX = (winW - W) / 2; picY = (winH - 26 - H) / 2; FL_LOCK_D(); picTxWin->size(winW, winH); picTx->resize(picX, picY, W, H); picTx->clear(); picTxBox->size(winW, winH); btnpicTxSPP->resize(winW/2 - 140, winH - 26, 40, 24); btnpicTxSendColor->resize(winW/2 - 100, winH - 26, 60, 24); btnpicTxSendGrey->resize(winW/2 - 40, winH - 26, 60, 24); btnpicTxSendAbort->resize(winW/2 - 61, winH - 26, 122, 24); btnpicTxLoad->resize(winW/2 + 20, winH - 26, 60, 24); btnpicTxClose->resize(winW/2 + 80, winH - 26, 60, 24); FL_UNLOCK_D(); } void showTxViewer(int W, int H) { if (picTxWin) { picTxWin->show(); return; } int winW, winH; int picX, picY; winW = W < 288 ? 290 : W + 4; winH = H < 180 ? 180 : H + 30; picX = (winW - W) / 2; picY = (winH - 26 - H) / 2; FL_LOCK_D(); picTxWin->size(winW, winH); picTx->resize(picX, picY, W, H); btnpicTxSPP->resize(winW/2 - 140, winH - 26, 40, 24); btnpicTxSendColor->resize(winW/2 - 100, winH - 26, 60, 24); btnpicTxSendGrey->resize(winW/2 - 40, winH - 26, 60, 24); btnpicTxSendAbort->resize(winW/2 - 61, winH - 26, 122, 24); btnpicTxLoad->resize(winW/2 + 20, winH - 26, 60, 24); btnpicTxClose->resize(winW/2 + 80, winH - 26, 60, 24); btnpicTxSPP->show(); btnpicTxSendColor->show(); btnpicTxSendGrey->show(); btnpicTxLoad->show(); btnpicTxClose->show(); btnpicTxSendAbort->hide(); picTxWin->show(); FL_UNLOCK_D(); } void deleteTxViewer() { picTxWin->hide(); if (picTx) delete picTx; delete [] xmtimg; xmtimg = 0; delete [] xmtpicbuff; xmtpicbuff = 0; delete picTxWin; picTxWin = 0; serviceme = 0; } void deleteRxViewer() { picRxWin->hide(); if (picRx) { delete picRx; picRx = 0; } delete picRxWin; picRxWin = 0; serviceme = 0; } int print_time_left(float time_sec, char *str, size_t len, const char *prefix, const char *suffix) { int time_min = (int)(time_sec / 60); time_sec -= time_min * 60; if (time_min) return snprintf(str, len, "%s %02dm %2.1fs%s", prefix, time_min, time_sec, suffix); else return snprintf(str, len, "%s %2.1fs%s", prefix, time_sec, suffix); } void setpicture_link(mfsk *me) { serviceme = me; } fldigi-3.21.80/src/mfsk/interleave.cxx0000664000175000017500000000453712313064025014464 00000000000000// ---------------------------------------------------------------------------- // interleave.cxx -- MFSK (de)interleaver // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "interleave.h" // ---------------------------------------------------------------------- interleave::interleave (int _size, int _depth, int dir) { size = _size; depth = _depth; direction = dir; len = size * size * depth; table = new unsigned char [len]; flush(); } interleave::~interleave () { delete [] table; } void interleave::symbols(unsigned char *psyms) { int i, j, k; for (k = 0; k < depth; k++) { for (i = 0; i < size; i++) for (j = 0; j < size - 1; j++) *tab(k, i, j) = *tab(k, i, j + 1); for (i = 0; i < size; i++) *tab(k, i, size - 1) = psyms[i]; for (i = 0; i < size; i++) { if (direction == INTERLEAVE_FWD) psyms[i] = *tab(k, i, size - i - 1); else psyms[i] = *tab(k, i, i); } } } void interleave::bits(unsigned int *pbits) { unsigned char syms[size]; int i; for (i = 0; i < size; i++) syms[i] = (*pbits >> (size - i - 1)) & 1; symbols(syms); for (*pbits = i = 0; i < size; i++) *pbits = (*pbits << 1) | syms[i]; } void interleave::flush(void) { // Fill entire RX interleaver with punctures or 0 depending on whether // Rx or Tx if (direction == INTERLEAVE_REV) memset(table, PUNCTURE, len); else memset(table, 0, len); } // ---------------------------------------------------------------------- fldigi-3.21.80/src/mfsk/mfsk.cxx0000664000175000017500000005714412313064025013270 00000000000000// ---------------------------------------------------------------------------- // mfsk.cxx -- mfsk modem // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "mfsk.h" #include "modem.h" #include "misc.h" #include "main.h" #include "fl_digi.h" #include "configuration.h" #include "status.h" #include "trx.h" #include "ascii.h" #include "fileselect.h" #include "qrunner.h" #include "debug.h" #define SOFTPROFILE false using namespace std; // MFSKpic receive start delay value based on a viterbi length of 45 // 44 nulls at 8 samples per pixel // 88 nulls at 4 samples per pixel // 176 nulls at 2 samples per pixel struct TRACEPAIR { int trace; int delay; TRACEPAIR( int a, int b) { trace = a; delay = b;} }; TRACEPAIR tracepair(45, 352); bool xmt_filter = true; //============================================================================= char mfskmsg[80]; //============================================================================= #include "mfsk-pic.cxx" void mfsk::tx_init(SoundBase *sc) { scard = sc; txstate = TX_STATE_PREAMBLE; bitstate = 0; double bw2 = (numtones + 1) * samplerate / symlen / 2.0; double flo = (frequency - bw2) / samplerate; if (flo <= 0) flo = 0; double fhi = (frequency + bw2) / samplerate; xmtfilt->init_bandpass (127, 1, flo, fhi); videoText(); } void mfsk::rx_init() { rxstate = RX_STATE_DATA; synccounter = 0; symcounter = 0; met1 = 0.0; met2 = 0.0; counter = 0; RXspp = 8; for (int i = 0; i < 2 * symlen; i++) { for (int j = 0; j < 32; j++) pipe[i].vector[j] = cmplx(0,0); } reset_afc(); s2n = 0.0; memset(picheader, ' ', PICHEADER - 1); picheader[PICHEADER -1] = 0; put_MODEstatus(mode); syncfilter->reset(); staticburst = false; s2n_valid = false; } void mfsk::init() { modem::init(); rx_init(); set_scope_mode(Digiscope::SCOPE); // picture mode init setpicture_link(this); TXspp = txSPP; RXspp = 8; } void mfsk::shutdown() { } mfsk::~mfsk() { stopflag = true; int msecs = 200; while(--msecs && txstate != TX_STATE_PREAMBLE) MilliSleep(1); // do not destroy picTxWin or picRxWin as there may be pending updates // in the UI request queue if (picTxWin) picTxWin->hide(); activate_mfsk_image_item(false); if (bpfilt) delete bpfilt; if (xmtfilt) delete xmtfilt; if (rxinlv) delete rxinlv; if (txinlv) delete txinlv; if (dec2) delete dec2; if (dec1) delete dec1; if (enc) delete enc; if (pipe) delete [] pipe; if (hbfilt) delete hbfilt; if (binsfft) delete binsfft; for (int i = 0; i < SCOPESIZE; i++) { if (vidfilter[i]) delete vidfilter[i]; } if (syncfilter) delete syncfilter; } mfsk::mfsk(trx_mode mfsk_mode) : modem() { cap |= CAP_AFC | CAP_REV; double bw, cf, flo, fhi; mode = mfsk_mode; depth = 10; // CAP_IMG is set in cap iff image transfer supported switch (mode) { case MODE_MFSK4: samplerate = 8000; symlen = 2048; symbits = 5; depth = 5; basetone = 256; numtones = 32; preamble = 107; // original mfsk modes break; case MODE_MFSK8: samplerate = 8000; symlen = 1024; symbits = 5; depth = 5; basetone = 128; numtones = 32; preamble = 107; // original mfsk modes break; case MODE_MFSK31: samplerate = 8000; symlen = 256; symbits = 3; depth = 10; basetone = 32; numtones = 8; preamble = 107; // original mfsk modes break; case MODE_MFSK32: samplerate = 8000; symlen = 256; symbits = 4; depth = 10; basetone = 32; numtones = 16; preamble = 107; // original mfsk modes cap |= CAP_IMG; break; case MODE_MFSK64: samplerate = 8000; symlen = 128; symbits = 4; depth = 10; basetone = 16; numtones = 16; preamble = 180; cap |= CAP_IMG; break; case MODE_MFSK128: samplerate = 8000; symlen = 64; symbits = 4; depth = 20; basetone = 8; numtones = 16; cap |= CAP_IMG; preamble = 214; break; case MODE_MFSK64L: samplerate = 8000; symlen = 128; symbits = 4; depth = 400; preamble = 2500; basetone = 16; numtones = 16; break; case MODE_MFSK128L: samplerate = 8000; symlen = 64; symbits = 4; depth = 800; preamble = 5000; basetone = 8; numtones = 16; break; case MODE_MFSK11: samplerate = 11025; symlen = 1024; symbits = 4; depth = 10; basetone = 93; numtones = 16; preamble = 107; break; case MODE_MFSK22: samplerate = 11025; symlen = 512; symbits = 4; depth = 10; basetone = 46; numtones = 16; preamble = 107; break; case MODE_MFSK16: default: samplerate = 8000; symlen = 512; symbits = 4; depth = 10; basetone = 64; numtones = 16; preamble = 107; cap |= CAP_IMG; break; } tonespacing = (double) samplerate / symlen; basefreq = 1.0 * samplerate * basetone / symlen; binsfft = new sfft (symlen, basetone, basetone + numtones ); hbfilt = new C_FIR_filter(); hbfilt->init_hilbert(37, 1); syncfilter = new Cmovavg(8); for (int i = 0; i < SCOPESIZE; i++) vidfilter[i] = new Cmovavg(16); pipe = new rxpipe[ 2 * symlen ]; enc = new encoder (K, POLY1, POLY2); dec1 = new viterbi (K, POLY1, POLY2); dec2 = new viterbi (K, POLY1, POLY2); dec1->settraceback (tracepair.trace); dec2->settraceback (tracepair.trace); dec1->setchunksize (1); dec2->setchunksize (1); txinlv = new interleave (symbits, depth, INTERLEAVE_FWD); rxinlv = new interleave (symbits, depth, INTERLEAVE_REV); bw = (numtones - 1) * tonespacing; cf = basefreq + bw / 2.0; flo = (cf - bw/2 - 2 * tonespacing) / samplerate; fhi = (cf + bw/2 + 2 * tonespacing) / samplerate; bpfilt = new C_FIR_filter(); bpfilt->init_bandpass (127, 1, flo, fhi); xmtfilt = new C_FIR_filter(); scopedata.alloc(symlen * 2); fragmentsize = symlen; bandwidth = (numtones - 1) * tonespacing; startpic = false; abortxmt = false; stopflag = false; bitshreg = 0; bitstate = 0; phaseacc = 0; pipeptr = 0; metric = 0; prev1symbol = prev2symbol = 0; symbolpair[0] = symbolpair[1] = 0; // picTxWin and picRxWin are created once to support all instances of mfsk if (!picTxWin) createTxViewer(); if (!picRxWin) createRxViewer(); activate_mfsk_image_item(true); afcmetric = 0.0; datashreg = 1; for (int i = 0; i < 128; i++) prepost[i] = 0; } //===================================================================== // receive processing //===================================================================== void mfsk::s2nreport(void) { modem::s2nreport(); s2n_valid = false; } bool mfsk::check_picture_header(char c) { char *p; if (c >= ' ' && c <= 'z') { memmove(picheader, picheader + 1, PICHEADER - 1); picheader[PICHEADER - 2] = c; } picW = 0; picH = 0; color = false; p = strstr(picheader, "Pic:"); if (p == NULL) return false; p += 4; if (*p == 0) return false; while ( *p && isdigit(*p)) picW = (picW * 10) + (*p++ - '0'); if (*p++ != 'x') return false; while ( *p && isdigit(*p)) picH = (picH * 10) + (*p++ - '0'); if (*p == 'C') { color = true; p++; } if (*p == ';') { if (picW == 0 || picH == 0 || picW > 4095 || picH > 4095) return false; RXspp = 8; return true; } if (*p == 'p') p++; else return false; if (!*p) return false; RXspp = 8; if (*p == '4') RXspp = 4; if (*p == '2') RXspp = 2; p++; if (!*p) return false; if (*p != ';') return false; if (picW == 0 || picH == 0 || picW > 4095 || picH > 4095) return false; return true; } void mfsk::recvpic(cmplx z) { int byte; picf += arg( conj(prevz) * z) * samplerate / TWOPI; prevz = z; if ((counter % RXspp) == 0) { picf = 256 * (picf / RXspp - basefreq) / bandwidth; byte = (int)CLAMP(picf, 0.0, 255.0); if (reverse) byte = 255 - byte; if (color) { pixelnbr = rgb + row + 3*col; REQ(updateRxPic, byte, pixelnbr); if (++col == picW) { col = 0; if (++rgb == 3) { rgb = 0; row += 3 * picW; } } } else { for (int i = 0; i < 3; i++) REQ(updateRxPic, byte, pixelnbr++); } picf = 0.0; int n = picW * picH * 3; if (pixelnbr % (picW * 3) == 0) { snprintf(mfskmsg, sizeof(mfskmsg), "Rx pic: %3.1f%%", (100.0f * pixelnbr) / n); put_status(mfskmsg); } } } void mfsk::recvchar(int c) { if (c == -1 || c == 0) return; put_rx_char(c); if (check_picture_header(c) == true) { counter = tracepair.delay; printf("symbolbit = %d, symbits = %d\n", symbolbit, symbits); switch (mode) { case MODE_MFSK16: if (symbolbit == symbits) counter += symlen; break; case MODE_MFSK32: if (symbolbit == symbits) counter += symlen; break; case MODE_MFSK64: counter = 4956; if (symbolbit % 2 == 0) counter += symlen; break; case MODE_MFSK128: counter = 1824; if (symbolbit % 2 == 0) counter += symlen; break; case MODE_MFSK31: counter = 5216; if (symbolbit == symbits) counter += symlen; break; case MODE_MFSK4: case MODE_MFSK8: case MODE_MFSK11: case MODE_MFSK22: default: break; }; rxstate = RX_STATE_PICTURE_START; picturesize = RXspp * picW * picH * (color ? 3 : 1); pixelnbr = 0; col = 0; row = 0; rgb = 0; memset(picheader, ' ', PICHEADER - 1); picheader[PICHEADER -1] = 0; return; } else counter = 0; if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { if ((c == SOH) && !s2n_valid) { // starts collecting s2n from first SOH in stream (since start of RX) s2n_valid = true; s2n_sum = s2n_sum2 = s2n_ncount = 0.0; } if (s2n_valid) { s2n_sum += s2n_metric; s2n_sum2 += (s2n_metric * s2n_metric); s2n_ncount++; if (c == EOT) s2nreport(); } } return; } void mfsk::recvbit(int bit) { int c; datashreg = (datashreg << 1) | !!bit; if ((datashreg & 7) == 1) { c = varidec(datashreg >> 1); recvchar(c); datashreg = 1; } } void mfsk::decodesymbol(unsigned char symbol) { int c, met; symbolpair[0] = symbolpair[1]; symbolpair[1] = symbol; symcounter = symcounter ? 0 : 1; // only modes with odd number of symbits need a vote if (symbits == 5 || symbits == 3) { // could use symbits % 2 == 0 if (symcounter) { if ((c = dec1->decode(symbolpair, &met)) == -1) return; met1 = decayavg(met1, met, 32); if (met1 < met2) return; metric = met1 / 1.5; } else { if ((c = dec2->decode(symbolpair, &met)) == -1) return; met2 = decayavg(met2, met, 32); if (met2 < met1) return; metric = met2 / 1.5; } } else { if (symcounter) return; if ((c = dec2->decode(symbolpair, &met)) == -1) return; met2 = decayavg(met2, met, 32); metric = met2 / 1.5; } if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { // s2n reporting: re-calibrate s2n_metric = metric * 3 - 42; s2n_metric = CLAMP(s2n_metric, 0.0, 100.0); } // Re-scale the metric and update main window metric -= 32.0; if (metric <= 5.0) metric = 5.0; display_metric(metric); if (progStatus.sqlonoff && metric < progStatus.sldrSquelchValue) return; recvbit(c); } void mfsk::softdecode(cmplx *bins) { double binmag, sum=0, avg=0, b[symbits]; unsigned char symbols[symbits]; int i, j, k, CWIsymbol; static int CWIcounter[MAX_SYMBOLS] = {0}; static const int CWI_MAXCOUNT=6; // this is the maximum number of repeated tones which is valid for the modem ( 0 excluded ) for (i = 0; i < symbits; i++) b[i] = 0.0; // Calculate the average signal, ignoring CWI tones for (i = 0; i < numtones; i++) { if ( CWIcounter[i] < CWI_MAXCOUNT ) sum += abs(bins[i]); } avg = sum / numtones; // avoid divide by zero later if ( sum < 1e-10 ) sum = 1e-10; // dynamic CWI avoidance: use harddecode() result (currsymbol) for CWI detection if (reverse) CWIsymbol = (numtones - 1) - currsymbol; else CWIsymbol = currsymbol; // Add or subtract the CWI counters based on harddecode result // avoiding tone #0 by starting at 1 for (i = 1; i < numtones ; i++) { if (reverse) k = (numtones - 1) - i; else k = i; if ( k == CWIsymbol) CWIcounter[k]++; else CWIcounter[k]--; // bounds-check the counts to keep the values sane if (CWIcounter[k] < 0) CWIcounter[k] = 0; if (CWIcounter[k] > CWI_MAXCOUNT) CWIcounter[k] = CWI_MAXCOUNT + 1; } // gray decode and form soft decision samples for (i = 0; i < numtones; i++) { j = graydecode(i); if (reverse) k = (numtones - 1) - i; else k = i; // Avoid CWI. This never affects tone #0 if ( CWIcounter[k] > CWI_MAXCOUNT ) { binmag = avg; // soft-puncture to the average signal-level } else if ( CWIsymbol == k ) binmag = 2.0f * abs(bins[k]); // give harddecode() a vote in softdecode's decision. else binmag = abs(bins[k]); for (k = 0; k < symbits; k++) b[k] += (j & (1 << (symbits - k - 1))) ? binmag : -binmag; } #if SOFTPROFILE LOG_INFO("harddecode() symbol = %d", CWIsymbol ); #endif // shift to range 0...255 for (i = 0; i < symbits; i++) { unsigned char softbits; if (staticburst) softbits = 128; // puncturing else softbits = (unsigned char)clamp(128.0 + (b[i] / (sum) * 256.0), 0, 255); symbols[i] = softbits; #if SOFTPROFILE LOG_INFO("softbits = %3u", softbits); #endif } rxinlv->symbols(symbols); for (i = 0; i < symbits; i++) { symbolbit = i + 1; decodesymbol(symbols[i]); if (counter) return; } } cmplx mfsk::mixer(cmplx in, double f) { cmplx z; // Basetone is a nominal 1000 Hz f -= tonespacing * basetone + bandwidth / 2; z = in * cmplx( cos(phaseacc), sin(phaseacc) ); phaseacc -= TWOPI * f / samplerate; if (phaseacc > TWOPI) phaseacc -= TWOPI; if (phaseacc < -TWOPI) phaseacc += TWOPI; return z; } // finds the tone bin with the largest signal level // assumes that will be the present tone received // with NO CW inteference int mfsk::harddecode(cmplx *in) { double x, max = 0.0, avg = 0.0; int i, symbol = 0; int burstcount = 0; for (int i = 0; i < numtones; i++) avg += abs(in[i]); avg /= numtones; if (avg < 1e-20) avg = 1e-20; for (i = 0; i < numtones; i++) { x = abs(in[i]); if ( x > max) { max = x; symbol = i; } if (x > 2.0 * avg) burstcount++; } staticburst = (burstcount == numtones); if (!staticburst) afcmetric = 0.95*afcmetric + 0.05 * (2 * max / avg); else afcmetric = 0.0; return symbol; } void mfsk::update_syncscope() { int j; int pipelen = 2 * symlen; memset(scopedata, 0, 2 * symlen * sizeof(double)); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) for (unsigned int i = 0; i < SCOPESIZE; i++) { j = (pipeptr + i * pipelen / SCOPESIZE + 1) % (pipelen); scopedata[i] = vidfilter[i]->run(abs(pipe[j].vector[prev1symbol])); } set_scope(scopedata, SCOPESIZE); scopedata.next(); // change buffers snprintf(mfskmsg, sizeof(mfskmsg), "s/n %3.0f dB", 20.0 * log10(s2n)); put_Status1(mfskmsg); } void mfsk::synchronize() { int i, j; double syn = -1; double val, max = 0.0; if (currsymbol == prev1symbol) return; if (prev1symbol == prev2symbol) return; j = pipeptr; for (i = 0; i < 2 * symlen; i++) { val = abs(pipe[j].vector[prev1symbol]); if (val > max) { max = val; syn = i; } j = (j + 1) % (2 * symlen); } syn = syncfilter->run(syn); synccounter += (int) floor((syn - symlen) / numtones + 0.5); update_syncscope(); } void mfsk::reset_afc() { freqerr = 0.0; syncfilter->reset(); return; } void mfsk::afc() { cmplx z; cmplx prevvector; double f, f1; double ts = tonespacing / 4; if (sigsearch) { reset_afc(); sigsearch = 0; } if (staticburst || !progStatus.afconoff) return; if (metric < progStatus.sldrSquelchValue) return; if (afcmetric < 3.0) return; if (currsymbol != prev1symbol) return; if (pipeptr == 0) prevvector = pipe[2*symlen - 1].vector[currsymbol]; else prevvector = pipe[pipeptr - 1].vector[currsymbol]; z = conj(prevvector) * currvector; f = arg(z) * samplerate / TWOPI; f1 = tonespacing * (basetone + currsymbol); if ( fabs(f1 - f) < ts) { freqerr = decayavg(freqerr, (f1 - f), 32); set_freq(frequency - freqerr); } } void mfsk::eval_s2n() { sig = abs(pipe[pipeptr].vector[currsymbol]); noise = (numtones -1) * abs(pipe[pipeptr].vector[prev2symbol]); if (noise > 0) s2n = decayavg ( s2n, sig / noise, 64 ); } int mfsk::rx_process(const double *buf, int len) { cmplx z; cmplx* bins = 0; while (len-- > 0) { // create analytic signal... z = cmplx( *buf, *buf ); buf++; hbfilt->run ( z, z ); // shift in frequency to the base freq z = mixer(z, frequency); // bandpass filter around the shifted center frequency // with required bandwidth bpfilt->run ( z, z ); // copy current vector to the pipe binsfft->run (z, pipe[pipeptr].vector, 1); bins = pipe[pipeptr].vector; if (rxstate == RX_STATE_PICTURE_START) { if (--counter == 0) { counter = picturesize; rxstate = RX_STATE_PICTURE; REQ( showRxViewer, picW, picH ); } } if (rxstate == RX_STATE_PICTURE) { if (--counter == 0) { rxstate = RX_STATE_DATA; put_status(""); string autosave_dir = PicsDir; picRx->save_png(autosave_dir.c_str()); rx_init(); } else recvpic(z); continue; } // copy current vector to the pipe // binsfft->run (z, pipe[pipeptr].vector, 1); // bins = pipe[pipeptr].vector; if (--synccounter <= 0) { synccounter = symlen; currsymbol = harddecode(bins); currvector = bins[currsymbol]; softdecode(bins); // symbol sync synchronize(); // frequency tracking afc(); eval_s2n(); prev2symbol = prev1symbol; prev2vector = prev1vector; prev1symbol = currsymbol; prev1vector = currvector; } pipeptr = (pipeptr + 1) % (2 * symlen); } return 0; } //===================================================================== // transmit processing //===================================================================== void mfsk::transmit(double *buf, int len) { if (xmt_filter) for (int i = 0; i < len; i++) xmtfilt->Irun(buf[i], buf[i]); ModulateXmtr(buf, len); } void mfsk::sendsymbol(int sym) { double f, phaseincr; f = get_txfreq_woffset() - bandwidth / 2; sym = grayencode(sym & (numtones - 1)); if (reverse) sym = (numtones - 1) - sym; phaseincr = TWOPI * (f + sym*tonespacing) / samplerate; for (int i = 0; i < symlen; i++) { outbuf[i] = cos(phaseacc); phaseacc -= phaseincr; if (phaseacc > M_PI) phaseacc -= TWOPI; else if (phaseacc < M_PI) phaseacc += TWOPI; } transmit (outbuf, symlen); } void mfsk::sendbit(int bit) { int data = enc->encode(bit); for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); bitstate++; if (bitstate == symbits) { txinlv->bits(&bitshreg); sendsymbol(bitshreg); bitstate = 0; bitshreg = 0; } } } void mfsk::sendchar(unsigned char c) { const char *code = varienc(c); while (*code) sendbit(*code++ - '0'); put_echo_char(c); } void mfsk::sendidle() { sendchar(0); sendbit(1); // extended zero bit stream for (int i = 0; i < 32; i++) sendbit(0); } void mfsk::flushtx(int nbits) { // flush the varicode decoder at the other end sendbit(1); // flush the convolutional encoder and interleaver //VK2ETA high speed modes for (int i = 0; i < 107; i++) //W1HKJ for (int i = 0; i < preamble; i++) for (int i = 0; i < nbits; i++) sendbit(0); bitstate = 0; } void mfsk::sendpic(unsigned char *data, int len) { double *ptr; double f; int i, j; ptr = outbuf; for (i = 0; i < len; i++) { if (txstate == TX_STATE_PICTURE) REQ(updateTxPic, data[i]); if (reverse) f = get_txfreq_woffset() - bandwidth * (data[i] - 128) / 256.0; else f = get_txfreq_woffset() + bandwidth * (data[i] - 128) / 256.0; for (j = 0; j < TXspp; j++) { *ptr++ = cos(phaseacc); phaseacc += TWOPI * f / samplerate; if (phaseacc > M_PI) phaseacc -= 2.0 * M_PI; } } transmit (outbuf, TXspp * len); } // ----------------------------------------------------------------------------- // send prologue consisting of tracepair.delay 0's void mfsk::flush_xmt_filter(int n) { double f1 = get_txfreq_woffset() - bandwidth / 2.0; double f2 = get_txfreq_woffset() + bandwidth / 2.0; for (int i = 0; i < n; i++) { outbuf[i] = cos(phaseacc); phaseacc += TWOPI * (reverse ? f2 : f1) / samplerate; if (phaseacc > M_PI) phaseacc -= 2.0 * M_PI; } transmit (outbuf, tracepair.delay); } void mfsk::send_prologue() { flush_xmt_filter(tracepair.delay); } void mfsk::send_epilogue() { flush_xmt_filter(64); } void mfsk::clearbits() { int data = enc->encode(0); for (int k = 0; k < preamble; k++) { for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); bitstate++; if (bitstate == symbits) { txinlv->bits(&bitshreg); bitstate = 0; bitshreg = 0; } } } } int mfsk::tx_process() { int xmtbyte; switch (txstate) { case TX_STATE_PREAMBLE: clearbits(); if (mode != MODE_MFSK64L && mode != MODE_MFSK128L ) for (int i = 0; i < preamble / 3; i++) sendbit(0); txstate = TX_STATE_START; break; case TX_STATE_START: sendchar('\r'); sendchar(2); // STX sendchar('\r'); txstate = TX_STATE_DATA; break; case TX_STATE_DATA: xmtbyte = get_tx_char(); if(active_modem->XMLRPC_CPS_TEST) { if(startpic) startpic = false; if(xmtbyte == 0x05) { sendchar(0x04); // 0x4 has the same symbol count as 0x5 break; } } if (xmtbyte == 0x05 || startpic == true) { put_status("Tx pic: start"); int len = (int)strlen(picheader); for (int i = 0; i < len; i++) sendchar(picheader[i]); flushtx(preamble); startpic = false; txstate = TX_STATE_PICTURE_START; } else if ( xmtbyte == GET_TX_CHAR_ETX || stopflag) txstate = TX_STATE_FLUSH; else if (xmtbyte == GET_TX_CHAR_NODATA) sendidle(); else sendchar(xmtbyte); break; case TX_STATE_FLUSH: sendchar('\r'); sendchar(4); // EOT sendchar('\r'); flushtx(preamble); rxstate = RX_STATE_DATA; txstate = TX_STATE_PREAMBLE; stopflag = false; cwid(); return -1; case TX_STATE_PICTURE_START: send_prologue(); txstate = TX_STATE_PICTURE; break; case TX_STATE_PICTURE: int i = 0; int blocklen = 128; while (i < xmtbytes) { if (stopflag || abortxmt) break; if (i + blocklen < xmtbytes) sendpic( &xmtpicbuff[i], blocklen); else sendpic( &xmtpicbuff[i], xmtbytes - i); if ( (100 * i / xmtbytes) % 2 == 0) { snprintf(mfskmsg, sizeof(mfskmsg), "Tx pic: %3.1f%%", (100.0f * i) / xmtbytes); put_status(mfskmsg); } i += blocklen; } flushtx(preamble); REQ_FLUSH(GET_THREAD_ID()); txstate = TX_STATE_DATA; put_status("Tx pic: done"); FL_LOCK_E(); btnpicTxSendAbort->hide(); btnpicTxSPP->show(); btnpicTxSendColor->show(); btnpicTxSendGrey->show(); btnpicTxLoad->show(); btnpicTxClose->show(); abortxmt = false; rxstate = RX_STATE_DATA; memset(picheader, ' ', PICHEADER - 1); picheader[PICHEADER -1] = 0; FL_UNLOCK_E(); break; } return 0; } void mfsk::send_image(std::string s) { load_image(s.c_str()); pic_TxSendColor(); } fldigi-3.21.80/src/irrxml/0000775000175000017500000000000012313333726012235 500000000000000fldigi-3.21.80/src/irrxml/irrXML.h0000664000175000017500000005515712313064025013511 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef __IRR_XML_H_INCLUDED__ #define __IRR_XML_H_INCLUDED__ #include /** irrXML 1.2 API documentation
\section intro Introduction Welcome to the irrXML API documentation. Here you'll find any information you'll need to develop applications with irrXML. If you look for a tutorial on how to start, take a look at the \ref irrxmlexample, at the homepage of irrXML at xml.irrlicht3d.org or into the SDK in the directory \example. irrXML is intended to be a high speed and easy-to-use XML Parser for C++, and this documentation is an important part of it. If you have any questions or suggestions, just send a email to the author of the engine, Nikolaus Gebhardt (niko (at) irrlicht3d.org). For more informations about this parser, see \ref history. \section features Features irrXML provides forward-only, read-only access to a stream of non validated XML data. It was fully implemented by Nikolaus Gebhardt. Its current features are: - It it fast as lighting and has very low memory usage. It was developed with the intention of being used in 3D games, as it already has been. - irrXML is very small: It only consists of 60 KB of code and can be added easily to your existing project. - Of course, it is platform independent and works with lots of compilers. - It is able to parse ASCII, UTF-8, UTF-16 and UTF-32 text files, both in little and big endian format. - Independent of the input file format, the parser can return all strings in ASCII, UTF-8, UTF-16 and UTF-32 format. - With its optional file access abstraction it has the advantage that it can read not only from files but from any type of data (memory, network, ...). For example when used with the Irrlicht Engine, it directly reads from compressed .zip files. - Just like the Irrlicht Engine for which it was originally created, it is extremely easy to use. - It has no external dependencies, it does not even need the STL. Although irrXML has some strenghts, it currently also has the following limitations: - The input xml file is not validated and assumed to be correct. \section irrxmlexample Example The following code demonstrates the basic usage of irrXML. A simple xml file like this is parsed: \code Welcome to the Mesh Viewer of the "Irrlicht Engine". \endcode The code for parsing this file would look like this: \code #include using namespace irr; // irrXML is located in the namespace irr::io using namespace io; #include // we use STL strings to store data in this example void main() { // create the reader using one of the factory functions IrrXMLReader* xml = createIrrXMLReader("config.xml"); // strings for storing the data we want to get out of the file std::string modelFile; std::string messageText; std::string caption; // parse the file until end reached while(xml && xml->read()) { switch(xml->getNodeType()) { case EXN_TEXT: // in this xml file, the only text which occurs is the messageText messageText = xml->getNodeData(); break; case EXN_ELEMENT: { if (!strcmp("model", xml->getNodeName())) modelFile = xml->getAttributeValue("file"); else if (!strcmp("messageText", xml->getNodeName())) caption = xml->getAttributeValue("caption"); } break; } } // delete the xml parser after usage delete xml; } \endcode \section howto How to use Simply add the source files in the /src directory of irrXML to your project. Done. \section license License The irrXML license is based on the zlib license. Basicly, this means you can do with irrXML whatever you want: Copyright (C) 2002-2005 Nikolaus Gebhardt This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. \section history History As lots of references in this documentation and the source show, this xml parser has originally been a part of the Irrlicht Engine. But because the parser has become very useful with the latest release, people asked for a separate version of it, to be able to use it in non Irrlicht projects. With irrXML 1.0, this has now been done. */ namespace irr { namespace io { //! Enumeration of all supported source text file formats enum ETEXT_FORMAT { //! ASCII, file without byte order mark, or not a text file ETF_ASCII, //! UTF-8 format ETF_UTF8, //! UTF-16 format, big endian ETF_UTF16_BE, //! UTF-16 format, little endian ETF_UTF16_LE, //! UTF-32 format, big endian ETF_UTF32_BE, //! UTF-32 format, little endian ETF_UTF32_LE, }; //! Enumeration for all xml nodes which are parsed by IrrXMLReader enum EXML_NODE { //! No xml node. This is usually the node if you did not read anything yet. EXN_NONE, //! A xml element, like EXN_ELEMENT, //! End of an xml element, like EXN_ELEMENT_END, //! Text within a xml element: this is the text. EXN_TEXT, //! An xml comment like <!-- I am a comment --> or a DTD definition. EXN_COMMENT, //! An xml cdata section like <![CDATA[ this is some CDATA ]]> EXN_CDATA, //! Unknown element. EXN_UNKNOWN }; //! Callback class for file read abstraction. /** With this, it is possible to make the xml parser read in other things than just files. The Irrlicht engine is using this for example to read xml from compressed .zip files. To make the parser read in any other data, derive a class from this interface, implement the two methods to read your data and give a pointer to an instance of your implementation when calling createIrrXMLReader(), createIrrXMLReaderUTF16() or createIrrXMLReaderUTF32() */ class IFileReadCallBack { public: //! virtual destructor virtual ~IFileReadCallBack() {}; //! Reads an amount of bytes from the file. /** \param buffer: Pointer to buffer where to read bytes will be written to. \param sizeToRead: Amount of bytes to read from the file. \return Returns how much bytes were read. */ virtual int read(void* buffer, int sizeToRead) = 0; //! Returns size of file in bytes virtual int getSize() = 0; }; //! Empty class to be used as parent class for IrrXMLReader. /** If you need another class as base class for the xml reader, you can do this by creating the reader using for example new CXMLReaderImpl(yourcallback); The Irrlicht Engine for example needs IUnknown as base class for every object to let it automaticly reference countend, hence it replaces IXMLBase with IUnknown. See irrXML.cpp on how this can be done in detail. */ class IXMLBase { }; //! Interface providing easy read access to a XML file. /** You can create an instance of this reader using one of the factory functions createIrrXMLReader(), createIrrXMLReaderUTF16() and createIrrXMLReaderUTF32(). If using the parser from the Irrlicht Engine, please use IFileSystem::createXMLReader() instead. For a detailed intro how to use the parser, see \ref irrxmlexample and \ref features. The typical usage of this parser looks like this: \code #include using namespace irr; // irrXML is located in the namespace irr::io using namespace io; void main() { // create the reader using one of the factory functions IrrXMLReader* xml = createIrrXMLReader("config.xml"); if (xml == 0) return; // file could not be opened // parse the file until end reached while(xml->read()) { // based on xml->getNodeType(), do something. } // delete the xml parser after usage delete xml; } \endcode See \ref irrxmlexample for a more detailed example. */ template class IIrrXMLReader : public super_class { public: //! Destructor virtual ~IIrrXMLReader() {}; //! Reads forward to the next xml node. /** \return Returns false, if there was no further node. */ virtual bool read() = 0; //! Returns the type of the current XML node. virtual EXML_NODE getNodeType() const = 0; //! Returns attribute count of the current XML node. /** This is usually non null if the current node is EXN_ELEMENT, and the element has attributes. \return Returns amount of attributes of this xml node. */ virtual int getAttributeCount() const = 0; //! Returns name of an attribute. /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. \return Name of the attribute, 0 if an attribute with this index does not exist. */ virtual const char_type* getAttributeName(int idx) const = 0; //! Returns the value of an attribute. /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. \return Value of the attribute, 0 if an attribute with this index does not exist. */ virtual const char_type* getAttributeValue(int idx) const = 0; //! Returns the value of an attribute. /** \param name: Name of the attribute. \return Value of the attribute, 0 if an attribute with this name does not exist. */ virtual const char_type* getAttributeValue(const char_type* name) const = 0; //! Returns the value of an attribute in a safe way. /** Like getAttributeValue(), but does not return 0 if the attribute does not exist. An empty string ("") is returned then. \param name: Name of the attribute. \return Value of the attribute, and "" if an attribute with this name does not exist */ virtual const char_type* getAttributeValueSafe(const char_type* name) const = 0; //! Returns the value of an attribute as integer. /** \param name Name of the attribute. \return Value of the attribute as integer, and 0 if an attribute with this name does not exist or the value could not be interpreted as integer. */ virtual int getAttributeValueAsInt(const char_type* name) const = 0; //! Returns the value of an attribute as integer. /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. \return Value of the attribute as integer, and 0 if an attribute with this index does not exist or the value could not be interpreted as integer. */ virtual int getAttributeValueAsInt(int idx) const = 0; //! Returns the value of an attribute as float. /** \param name: Name of the attribute. \return Value of the attribute as float, and 0 if an attribute with this name does not exist or the value could not be interpreted as float. */ virtual float getAttributeValueAsFloat(const char_type* name) const = 0; //! Returns the value of an attribute as float. /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. \return Value of the attribute as float, and 0 if an attribute with this index does not exist or the value could not be interpreted as float. */ virtual float getAttributeValueAsFloat(int idx) const = 0; //! Returns the name of the current node. /** Only non null, if the node type is EXN_ELEMENT. \return Name of the current node or 0 if the node has no name. */ virtual const char_type* getNodeName() const = 0; //! Returns data of the current node. /** Only non null if the node has some data and it is of type EXN_TEXT or EXN_UNKNOWN. */ virtual const char_type* getNodeData() const = 0; //! Returns if an element is an empty element, like virtual bool isEmptyElement() const = 0; //! Returns format of the source xml file. /** It is not necessary to use this method because the parser will convert the input file format to the format wanted by the user when creating the parser. This method is useful to get/display additional informations. */ virtual ETEXT_FORMAT getSourceFormat() const = 0; //! Returns format of the strings returned by the parser. /** This will be UTF8 for example when you created a parser with IrrXMLReaderUTF8() and UTF32 when it has been created using IrrXMLReaderUTF32. It should not be necessary to call this method and only exists for informational purposes. */ virtual ETEXT_FORMAT getParserFormat() const = 0; }; //! defines the utf-16 type. /** Not using wchar_t for this because wchar_t has 16 bit on windows and 32 bit on other operating systems. */ typedef unsigned short char16; //! defines the utf-32 type. /** Not using wchar_t for this because wchar_t has 16 bit on windows and 32 bit on other operating systems. */ typedef unsigned long char32; //! A UTF-8 or ASCII character xml parser. /** This means that all character data will be returned in 8 bit ASCII or UTF-8 by this parser. The file to read can be in any format, it will be converted to UTF-8 if it is not in this format. Create an instance of this with createIrrXMLReader(); See IIrrXMLReader for description on how to use it. */ typedef IIrrXMLReader IrrXMLReader; //! A UTF-16 xml parser. /** This means that all character data will be returned in UTF-16 by this parser. The file to read can be in any format, it will be converted to UTF-16 if it is not in this format. Create an instance of this with createIrrXMLReaderUTF16(); See IIrrXMLReader for description on how to use it. */ typedef IIrrXMLReader IrrXMLReaderUTF16; //! A UTF-32 xml parser. /** This means that all character data will be returned in UTF-32 by this parser. The file to read can be in any format, it will be converted to UTF-32 if it is not in this format. Create an instance of this with createIrrXMLReaderUTF32(); See IIrrXMLReader for description on how to use it. */ typedef IIrrXMLReader IrrXMLReaderUTF32; //! Creates an instance of an UFT-8 or ASCII character xml parser. /** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can be in any format, it will be converted to UTF-8 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReaderUTF8() instead. \param filename: Name of file to be opened. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReader* createIrrXMLReader(const char* filename); //! Creates an instance of an UFT-8 or ASCII character xml parser. /** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can be in any format, it will be converted to UTF-8 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReaderUTF8() instead. \param file: Pointer to opened file, must have been opened in binary mode, e.g. using fopen("foo.bar", "wb"); The file will not be closed after it has been read. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReader* createIrrXMLReader(FILE* file); //! Creates an instance of an UFT-8 or ASCII character xml parser. /** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can be in any format, it will be converted to UTF-8 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReaderUTF8() instead. \param callback: Callback for file read abstraction. Implement your own callback to make the xml parser read in other things than just files. See IFileReadCallBack for more information about this. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReader* createIrrXMLReader(IFileReadCallBack* callback); //! Creates an instance of an UFT-16 xml parser. /** This means that all character data will be returned in UTF-16. The file to read can be in any format, it will be converted to UTF-16 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param filename: Name of file to be opened. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF16* createIrrXMLReaderUTF16(const char* filename); //! Creates an instance of an UFT-16 xml parser. /** This means that all character data will be returned in UTF-16. The file to read can be in any format, it will be converted to UTF-16 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param file: Pointer to opened file, must have been opened in binary mode, e.g. using fopen("foo.bar", "wb"); The file will not be closed after it has been read. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF16* createIrrXMLReaderUTF16(FILE* file); //! Creates an instance of an UFT-16 xml parser. /** This means that all character data will be returned in UTF-16. The file to read can be in any format, it will be converted to UTF-16 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param callback: Callback for file read abstraction. Implement your own callback to make the xml parser read in other things than just files. See IFileReadCallBack for more information about this. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF16* createIrrXMLReaderUTF16(IFileReadCallBack* callback); //! Creates an instance of an UFT-32 xml parser. /** This means that all character data will be returned in UTF-32. The file to read can be in any format, it will be converted to UTF-32 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param filename: Name of file to be opened. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF32* createIrrXMLReaderUTF32(const char* filename); //! Creates an instance of an UFT-32 xml parser. /** This means that all character data will be returned in UTF-32. The file to read can be in any format, it will be converted to UTF-32 if it is not in this format. if you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param file: Pointer to opened file, must have been opened in binary mode, e.g. using fopen("foo.bar", "wb"); The file will not be closed after it has been read. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF32* createIrrXMLReaderUTF32(FILE* file); //! Creates an instance of an UFT-32 xml parser. /** This means that all character data will be returned in UTF-32. The file to read can be in any format, it will be converted to UTF-32 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param callback: Callback for file read abstraction. Implement your own callback to make the xml parser read in other things than just files. See IFileReadCallBack for more information about this. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF32* createIrrXMLReaderUTF32(IFileReadCallBack* callback); /*! \file irrxml.h \brief Header file of the irrXML, the Irrlicht XML parser. This file includes everything needed for using irrXML, the XML parser of the Irrlicht Engine. To use irrXML, you only need to include this file in your project: \code #include \endcode It is also common to use the two namespaces in which irrXML is included, directly after #including irrXML.h: \code #include using namespace irr; using namespace io; \endcode */ } // end namespace io } // end namespace irr #endif // __IRR_XML_H_INCLUDED__ fldigi-3.21.80/src/irrxml/CXMLReaderImpl.h0000664000175000017500000004331612313064025015036 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef __ICXML_READER_IMPL_H_INCLUDED__ #define __ICXML_READER_IMPL_H_INCLUDED__ #include "irrXML.h" #include "irrString.h" #include "irrArray.h" #include "fast_atof.h" #ifdef _DEBUG #ifndef __WOE32__ #define IRR_DEBUGPRINT(x) printf((x)); #endif #else // _DEBUG #define IRR_DEBUGPRINT(x) #endif // _DEBUG namespace irr { namespace io { //! implementation of the IrrXMLReader template class CXMLReaderImpl : public IIrrXMLReader { public: //! Constructor CXMLReaderImpl(IFileReadCallBack* callback, bool deleteCallBack = true) : TextData(0), P(0), TextBegin(0), TextSize(0), CurrentNodeType(EXN_NONE), SourceFormat(ETF_ASCII), TargetFormat(ETF_ASCII) { if (!callback) return; storeTargetFormat(); // read whole xml file readFile(callback); // clean up if (deleteCallBack) delete callback; // create list with special characters createSpecialCharacterList(); // set pointer to text begin P = TextBegin; } //! Destructor virtual ~CXMLReaderImpl() { delete [] TextData; } //! Reads forward to the next xml node. //! \return Returns false, if there was no further node. virtual bool read() { // if not end reached, parse the node if (P && (unsigned int)(P - TextBegin) < TextSize - 1 && *P != 0) { parseCurrentNode(); return true; } _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX; return false; } //! Returns the type of the current XML node. virtual EXML_NODE getNodeType() const { return CurrentNodeType; } //! Returns attribute count of the current XML node. virtual int getAttributeCount() const { return Attributes.size(); } //! Returns name of an attribute. virtual const char_type* getAttributeName(int idx) const { if (idx < 0 || idx >= (int)Attributes.size()) return 0; return Attributes[idx].Name.c_str(); } //! Returns the value of an attribute. virtual const char_type* getAttributeValue(int idx) const { if (idx < 0 || idx >= (int)Attributes.size()) return 0; return Attributes[idx].Value.c_str(); } //! Returns the value of an attribute. virtual const char_type* getAttributeValue(const char_type* name) const { const SAttribute* attr = getAttributeByName(name); if (!attr) return 0; return attr->Value.c_str(); } //! Returns the value of an attribute virtual const char_type* getAttributeValueSafe(const char_type* name) const { const SAttribute* attr = getAttributeByName(name); if (!attr) return EmptyString.c_str(); return attr->Value.c_str(); } //! Returns the value of an attribute as integer. int getAttributeValueAsInt(const char_type* name) const { return (int)getAttributeValueAsFloat(name); } //! Returns the value of an attribute as integer. int getAttributeValueAsInt(int idx) const { return (int)getAttributeValueAsFloat(idx); } //! Returns the value of an attribute as float. float getAttributeValueAsFloat(const char_type* name) const { const SAttribute* attr = getAttributeByName(name); if (!attr) return 0; core::stringc c = attr->Value.c_str(); return core::fast_atof(c.c_str()); } //! Returns the value of an attribute as float. float getAttributeValueAsFloat(int idx) const { const char_type* attrvalue = getAttributeValue(idx); if (!attrvalue) return 0; core::stringc c = attrvalue; return core::fast_atof(c.c_str()); } //! Returns the name of the current node. virtual const char_type* getNodeName() const { return NodeName.c_str(); } //! Returns data of the current node. virtual const char_type* getNodeData() const { return NodeName.c_str(); } //! Returns if an element is an empty element, like virtual bool isEmptyElement() const { return IsEmptyElement; } //! Returns format of the source xml file. virtual ETEXT_FORMAT getSourceFormat() const { return SourceFormat; } //! Returns format of the strings returned by the parser. virtual ETEXT_FORMAT getParserFormat() const { return TargetFormat; } private: // Reads the current xml node void parseCurrentNode() { char_type* start = P; // more forward until '<' found while(*P != L'<' && *P) ++P; if (!*P) return; if (P - start > 0) { // we found some text, store it if (setText(start, P)) return; } ++P; // based on current token, parse and report next element switch(*P) { case L'/': parseClosingXMLElement(); break; case L'?': ignoreDefinition(); break; case L'!': if (!parseCDATA()) parseComment(); break; default: parseOpeningXMLElement(); break; } } //! sets the state that text was found. Returns true if set should be set bool setText(char_type* start, char_type* end) { // check if text is more than 2 characters, and if not, check if there is // only white space, so that this text won't be reported /* if (end - start < 3) { char_type* p = start; for(; p != end; ++p) if (!isWhiteSpace(*p)) break; if (p == end) return false; } */ // set current text to the parsed text, and replace xml special characters core::string s(start, (int)(end - start)); NodeName = replaceSpecialCharacters(s); // current XML node type is text CurrentNodeType = EXN_TEXT; return true; } //! ignores an xml definition like void ignoreDefinition() { CurrentNodeType = EXN_UNKNOWN; // move until end marked with '>' reached while(*P != L'>') ++P; ++P; } //! parses a comment void parseComment() { CurrentNodeType = EXN_COMMENT; P += 1; char_type *pCommentBegin = P; int count = 1; // move until end of comment reached while(count) { if (*P == L'>') --count; else if (*P == L'<') ++count; ++P; } P -= 3; NodeName = core::string(pCommentBegin+2, (int)(P - pCommentBegin-2)); P += 3; } //! parses an opening xml element and reads attributes void parseOpeningXMLElement() { CurrentNodeType = EXN_ELEMENT; IsEmptyElement = false; Attributes.clear(); // find name const char_type* startName = P; // find end of element while(*P != L'>' && !isWhiteSpace(*P)) ++P; const char_type* endName = P; // find Attributes while(*P != L'>') { if (isWhiteSpace(*P)) ++P; else { if (*P != L'/') { // we've got an attribute // read the attribute names const char_type* attributeNameBegin = P; while(!isWhiteSpace(*P) && *P != L'=') ++P; const char_type* attributeNameEnd = P; ++P; // read the attribute value // check for quotes and single quotes, thx to murphy while( (*P != L'\"') && (*P != L'\'') && *P) ++P; if (!*P) // malformatted xml file return; const char_type attributeQuoteChar = *P; ++P; const char_type* attributeValueBegin = P; while(*P != attributeQuoteChar && *P) ++P; if (!*P) // malformatted xml file return; const char_type* attributeValueEnd = P; ++P; SAttribute attr; attr.Name = core::string(attributeNameBegin, (int)(attributeNameEnd - attributeNameBegin)); core::string s(attributeValueBegin, (int)(attributeValueEnd - attributeValueBegin)); attr.Value = replaceSpecialCharacters(s); Attributes.push_back(attr); } else { // tag is closed directly ++P; IsEmptyElement = true; break; } } } // check if this tag is closing directly if (endName > startName && *(endName-1) == L'/') { // directly closing tag IsEmptyElement = true; endName--; } NodeName = core::string(startName, (int)(endName - startName)); ++P; } //! parses an closing xml tag void parseClosingXMLElement() { CurrentNodeType = EXN_ELEMENT_END; IsEmptyElement = false; Attributes.clear(); ++P; const char_type* pBeginClose = P; while(*P != L'>') ++P; NodeName = core::string(pBeginClose, (int)(P - pBeginClose)); ++P; } //! parses a possible CDATA section, returns false if begin was not a CDATA section bool parseCDATA() { if (*(P+1) != L'[') return false; CurrentNodeType = EXN_CDATA; // skip '' && (*(P-1) == L']') && (*(P-2) == L']')) { cDataEnd = P - 2; } ++P; } if ( cDataEnd ) NodeName = core::string(cDataBegin, (int)(cDataEnd - cDataBegin)); else NodeName = ""; return true; } // structure for storing attribute-name pairs struct SAttribute { core::string Name; core::string Value; }; // finds a current attribute by name, returns 0 if not found const SAttribute* getAttributeByName(const char_type* name) const { if (!name) return 0; core::string n = name; for (int i=0; i<(int)Attributes.size(); ++i) if (Attributes[i].Name == n) return &Attributes[i]; return 0; } // replaces xml special characters in a string and creates a new one core::string replaceSpecialCharacters( core::string& origstr) { int pos = origstr.findFirst(L'&'); int oldPos = 0; if (pos == -1) return origstr; core::string newstr; while(pos != -1 && pos < origstr.size()-2) { // check if it is one of the special characters int specialChar = -1; for (int i=0; i<(int)SpecialCharacters.size(); ++i) { const char_type* p = &origstr.c_str()[pos]+1; if (equalsn(&SpecialCharacters[i][1], p, SpecialCharacters[i].size()-1)) { specialChar = i; break; } } if (specialChar != -1) { newstr.append(origstr.subString(oldPos, pos - oldPos)); newstr.append(SpecialCharacters[specialChar][0]); pos += SpecialCharacters[specialChar].size(); } else { newstr.append(origstr.subString(oldPos, pos - oldPos + 1)); pos += 1; } // find next & oldPos = pos; pos = origstr.findNext(L'&', pos); } if (oldPos < origstr.size()) newstr.append(origstr.subString(oldPos, origstr.size()-oldPos)); return newstr; } //! reads the xml file and converts it into the wanted character format. bool readFile(IFileReadCallBack* callback) { int size = callback->getSize(); size += 4; // We need two terminating 0's at the end. // For ASCII we need 1 0's, for UTF-16 2, for UTF-32 4. char* data8 = new char[size]; if (!callback->read(data8, size-4)) { delete [] data8; return false; } // add zeros at end data8[size-1] = 0; data8[size-2] = 0; data8[size-3] = 0; data8[size-4] = 0; char16* data16 = reinterpret_cast(data8); char32* data32 = reinterpret_cast(data8); // now we need to convert the data to the desired target format // based on the byte order mark. const unsigned char UTF8[] = {0xEF, 0xBB, 0xBF}; // 0xEFBBBF; const int UTF16_BE = 0xFFFE; const int UTF16_LE = 0xFEFF; const int UTF32_BE = 0xFFFE0000; const int UTF32_LE = 0x0000FEFF; // check source for all utf versions and convert to target data format if (size >= 4 && data32[0] == (char32)UTF32_BE) { // UTF-32, big endian SourceFormat = ETF_UTF32_BE; convertTextData(data32+1, data8, (size/4)); // data32+1 because we need to skip the header } else if (size >= 4 && data32[0] == (char32)UTF32_LE) { // UTF-32, little endian SourceFormat = ETF_UTF32_LE; convertTextData(data32+1, data8, (size/4)); // data32+1 because we need to skip the header } else if (size >= 2 && data16[0] == UTF16_BE) { // UTF-16, big endian SourceFormat = ETF_UTF16_BE; convertTextData(data16+1, data8, (size/2)); // data16+1 because we need to skip the header } else if (size >= 2 && data16[0] == UTF16_LE) { // UTF-16, little endian SourceFormat = ETF_UTF16_LE; convertTextData(data16+1, data8, (size/2)); // data16+1 because we need to skip the header } else if (size >= 3 && data8[0] == UTF8[0] && data8[1] == UTF8[1] && data8[2] == UTF8[2]) { // UTF-8 SourceFormat = ETF_UTF8; convertTextData(data8+3, data8, size); // data8+3 because we need to skip the header } else { // ASCII SourceFormat = ETF_ASCII; convertTextData(data8, data8, size); } return true; } //! converts the text file into the desired format. //! \param source: begin of the text (without byte order mark) //! \param pointerToStore: pointer to text data block which can be //! stored or deleted based on the nesessary conversion. //! \param sizeWithoutHeader: Text size in characters without header template void convertTextData(src_char_type* source, char* pointerToStore, int sizeWithoutHeader) { // convert little to big endian if necessary if (sizeof(src_char_type) > 1 && isLittleEndian(TargetFormat) != isLittleEndian(SourceFormat)) convertToLittleEndian(source); // check if conversion is necessary: if (sizeof(src_char_type) == sizeof(char_type)) { // no need to convert TextBegin = (char_type*)source; TextData = (char_type*)pointerToStore; TextSize = sizeWithoutHeader; } else { // convert source into target data format. // TODO: implement a real conversion. This one just // copies bytes. This is a problem when there are // unicode symbols using more than one character. TextData = new char_type[sizeWithoutHeader]; for (int i=0; i void convertToLittleEndian(src_char_type* t) { if (sizeof(src_char_type) == 4) { // 32 bit while(*t) { *t = ((*t & 0xff000000) >> 24) | ((*t & 0x00ff0000) >> 8) | ((*t & 0x0000ff00) << 8) | ((*t & 0x000000ff) << 24); ++t; } } else { // 16 bit while(*t) { *t = (*t >> 8) | (*t << 8); ++t; } } } //! returns if a format is little endian inline bool isLittleEndian(ETEXT_FORMAT f) { return f == ETF_ASCII || f == ETF_UTF8 || f == ETF_UTF16_LE || f == ETF_UTF32_LE; } //! returns true if a character is whitespace inline bool isWhiteSpace(char_type c) { return (c==' ' || c=='\t' || c=='\n' || c=='\r'); } //! generates a list with xml special characters void createSpecialCharacterList() { // list of strings containing special symbols, // the first character is the special character, // the following is the symbol string without trailing &. SpecialCharacters.push_back("&"); SpecialCharacters.push_back("gt;"); SpecialCharacters.push_back("\"quot;"); SpecialCharacters.push_back("'apos;"); } //! compares the first n characters of the strings bool equalsn(const char_type* str1, const char_type* str2, int len) { int i; for(i=0; str1[i] && str2[i] && i < len; ++i) if (str1[i] != str2[i]) return false; // if one (or both) of the strings was smaller then they // are only equal if they have the same lenght return (i == len) || (str1[i] == 0 && str2[i] == 0); } //! stores the target text format void storeTargetFormat() { // get target format. We could have done this using template specialization, // but VisualStudio 6 don't like it and we want to support it. switch(sizeof(char_type)) { case 1: TargetFormat = ETF_UTF8; break; case 2: TargetFormat = ETF_UTF16_LE; break; case 4: TargetFormat = ETF_UTF32_LE; break; default: TargetFormat = ETF_ASCII; // should never happen. } } // instance variables: char_type* TextData; // data block of the text file char_type* P; // current point in text to parse char_type* TextBegin; // start of text to parse unsigned int TextSize; // size of text to parse in characters, not bytes EXML_NODE CurrentNodeType; // type of the currently parsed node ETEXT_FORMAT SourceFormat; // source format of the xml file ETEXT_FORMAT TargetFormat; // output format of this parser core::string NodeName; // name of the node currently in core::string EmptyString; // empty string to be returned by getSafe() methods bool IsEmptyElement; // is the currently parsed node empty? core::array< core::string > SpecialCharacters; // see createSpecialCharacterList() core::array Attributes; // attributes of current element }; // end CXMLReaderImpl } // end namespace } // end namespace #endif fldigi-3.21.80/src/irrxml/irrXML.cpp0000664000175000017500000001005112313064025014024 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "irrXML.h" #include "irrString.h" #include "irrArray.h" #include "fast_atof.h" #include "CXMLReaderImpl.h" namespace irr { namespace io { //! Implementation of the file read callback for ordinary files class CFileReadCallBack : public IFileReadCallBack { public: //! construct from filename CFileReadCallBack(const char* filename) : File(0), Size(0), Close(true) { // open file File = fopen(filename, "rb"); if (File) getFileSize(); } //! construct from FILE pointer CFileReadCallBack(FILE* file) : File(file), Size(0), Close(false) { if (File) getFileSize(); } //! destructor virtual ~CFileReadCallBack() { if (Close && File) fclose(File); } //! Reads an amount of bytes from the file. virtual int read(void* buffer, int sizeToRead) { if (!File) return 0; return (int)fread(buffer, 1, sizeToRead, File); } //! Returns size of file in bytes virtual int getSize() { return Size; } private: //! retrieves the file size of the open file void getFileSize() { fseek(File, 0, SEEK_END); Size = ftell(File); fseek(File, 0, SEEK_SET); } FILE* File; int Size; bool Close; }; // end class CFileReadCallBack // FACTORY FUNCTIONS: //! Creates an instance of an UFT-8 or ASCII character xml parser. IrrXMLReader* createIrrXMLReader(const char* filename) { return new CXMLReaderImpl(new CFileReadCallBack(filename)); } //! Creates an instance of an UFT-8 or ASCII character xml parser. IrrXMLReader* createIrrXMLReader(FILE* file) { return new CXMLReaderImpl(new CFileReadCallBack(file)); } //! Creates an instance of an UFT-8 or ASCII character xml parser. IrrXMLReader* createIrrXMLReader(IFileReadCallBack* callback) { return new CXMLReaderImpl(callback, false); } //! Creates an instance of an UTF-16 xml parser. IrrXMLReaderUTF16* createIrrXMLReaderUTF16(const char* filename) { return new CXMLReaderImpl(new CFileReadCallBack(filename)); } //! Creates an instance of an UTF-16 xml parser. IrrXMLReaderUTF16* createIrrXMLReaderUTF16(FILE* file) { return new CXMLReaderImpl(new CFileReadCallBack(file)); } //! Creates an instance of an UTF-16 xml parser. IrrXMLReaderUTF16* createIrrXMLReaderUTF16(IFileReadCallBack* callback) { return new CXMLReaderImpl(callback, false); } //! Creates an instance of an UTF-32 xml parser. IrrXMLReaderUTF32* createIrrXMLReaderUTF32(const char* filename) { return new CXMLReaderImpl(new CFileReadCallBack(filename)); } //! Creates an instance of an UTF-32 xml parser. IrrXMLReaderUTF32* createIrrXMLReaderUTF32(FILE* file) { return new CXMLReaderImpl(new CFileReadCallBack(file)); } //! Creates an instance of an UTF-32 xml parser. IrrXMLReaderUTF32* createIrrXMLReaderUTF32(IFileReadCallBack* callback) { return new CXMLReaderImpl(callback, false); } } // end namespace io } // end namespace irr fldigi-3.21.80/src/irrxml/irrString.h0000664000175000017500000003236512313064025014313 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef __IRR_STRING_H_INCLUDED__ #define __IRR_STRING_H_INCLUDED__ #include "irrTypes.h" namespace irr { namespace core { //! Very simple string class with some useful features. /** string and string work both with unicode AND ascii, so you can assign unicode to string and ascii to string (and the other way round) if your ever would want to. Note that the conversation between both is not done using an encoding. Known bugs: Special characters like 'Ä', 'Ü' and 'Ö' are ignored in the methods make_upper, make_lower and equals_ignore_case. */ template class string { public: //! Default constructor string() : array(0), allocated(1), used(1) { array = new T[1]; array[0] = 0x0; } //! Constructor string(const string& other) : array(0), allocated(0), used(0) { *this = other; } //! Constructs a string from an int string(int number) : array(0), allocated(0), used(0) { // store if negative and make positive bool negative = false; if (number < 0) { number *= -1; negative = true; } // temporary buffer for 16 numbers c8 tmpbuf[16]; tmpbuf[15] = 0; s32 idx = 15; // special case '0' if (!number) { tmpbuf[14] = '0'; *this = &tmpbuf[14]; return; } // add numbers while(number && idx) { idx--; tmpbuf[idx] = (c8)('0' + (number % 10)); number = number / 10; } // add sign if (negative) { idx--; tmpbuf[idx] = '-'; } *this = &tmpbuf[idx]; } //! Constructor for copying a string from a pointer with a given lenght template string(const B* c, s32 lenght) : array(0), allocated(0), used(0) { if (!c) return; allocated = used = lenght+1; array = new T[used]; for (s32 l = 0; l string(const B* c) : array(0), allocated(0), used(0) { *this = c; } //! destructor ~string() { delete [] array; } //! Assignment operator string& operator=(const string& other) { if (this == &other) return *this; delete [] array; allocated = used = other.size()+1; array = new T[used]; const T* p = other.c_str(); for (s32 i=0; i string& operator=(const B* c) { if (!c) { if (!array) { array = new T[1]; allocated = 1; used = 1; } array[0] = 0x0; return *this; } if ((void*)c == (void*)array) return *this; s32 len = 0; const B* p = c; while(*p) { ++len; ++p; } // we'll take the old string for a while, because the new string could be // a part of the current string. T* oldArray = array; allocated = used = len+1; array = new T[used]; for (s32 l = 0; l operator+(const string& other) { string str(*this); str.append(other); return str; } //! Add operator for strings, ascii and unicode template string operator+(const B* c) { string str(*this); str.append(c); return str; } //! Direct access operator T& operator [](const s32 index) const { _IRR_DEBUG_BREAK_IF(index>=used) // bad index return array[index]; } //! Comparison operator bool operator ==(const T* str) const { int i; for(i=0; array[i] && str[i]; ++i) if (array[i] != str[i]) return false; return !array[i] && !str[i]; } //! Comparison operator bool operator ==(const string& other) const { for(s32 i=0; array[i] && other.array[i]; ++i) if (array[i] != other.array[i]) return false; return used == other.used; } //! Is smaller operator bool operator <(const string& other) const { for(s32 i=0; array[i] && other.array[i]; ++i) if (array[i] != other.array[i]) return (array[i] < other.array[i]); return used < other.used; } //! Equals not operator bool operator !=(const string& other) const { return !(*this == other); } //! Returns length of string /** \return Returns length of the string in characters. */ s32 size() const { return used-1; } //! Returns character string /** \return Returns pointer to C-style zero terminated string. */ const T* c_str() const { return array; } //! Makes the string lower case. void make_lower() { const T A = (T)'A'; const T Z = (T)'Z'; const T diff = (T)'a' - A; for (s32 i=0; i=A && array[i]<=Z) array[i] += diff; } } //! Makes the string upper case. void make_upper() { const T a = (T)'a'; const T z = (T)'z'; const T diff = (T)'A' - a; for (s32 i=0; i=a && array[i]<=z) array[i] += diff; } } //! Compares the string ignoring case. /** \param other: Other string to compare. \return Returns true if the string are equal ignoring case. */ bool equals_ignore_case(const string& other) const { for(s32 i=0; array[i] && other[i]; ++i) if (toLower(array[i]) != toLower(other[i])) return false; return used == other.used; } //! compares the first n characters of the strings bool equalsn(const string& other, int len) { int i; for(i=0; array[i] && other[i] && i < len; ++i) if (array[i] != other[i]) return false; // if one (or both) of the strings was smaller then they // are only equal if they have the same lenght return (i == len) || (used == other.used); } //! compares the first n characters of the strings bool equalsn(const T* str, int len) { int i; for(i=0; array[i] && str[i] && i < len; ++i) if (array[i] != str[i]) return false; // if one (or both) of the strings was smaller then they // are only equal if they have the same lenght return (i == len) || (array[i] == 0 && str[i] == 0); } //! Appends a character to this string /** \param character: Character to append. */ void append(T character) { if (used + 1 > allocated) reallocate((s32)used + 1); used += 1; array[used-2] = character; array[used-1] = 0; } //! Appends a string to this string /** \param other: String to append. */ void append(const string& other) { --used; s32 len = other.size(); if (used + len + 1 > allocated) reallocate((s32)used + (s32)len + 1); for (s32 l=0; l& other, s32 length) { s32 len = other.size(); if (len < length) { append(other); return; } len = length; --used; if (used + len > allocated) reallocate((s32)used + (s32)len); for (s32 l=0; l s32 findFirstCharNotInList(B* c, int count) const { for (int i=0; i s32 findLastCharNotInList(B* c, int count) const { for (int i=used-2; i>=0; --i) { int j; for (j=0; j=0; --i) if (array[i] == c) return i; return -1; } //! Returns a substring //! \param begin: Start of substring. //! \param length: Length of substring. string subString(s32 begin, s32 length) { if (length <= 0) return string(""); string o; o.reserve(length+1); for (s32 i=0; i& other) { append(other); } void operator += (int i) { append(string(i)); } //! replaces all characters of a special type with another one void replace(T toReplace, T replaceWith) { for (s32 i=0; i=used || index<0) // access violation for (int i=index+1; i=(T)'A' && t<=(T)'Z') return t + ((T)'a' - (T)'A'); else return t; } //! Reallocate the array, make it bigger or smaler void reallocate(s32 new_size) { T* old_array = array; array = new T[new_size]; allocated = new_size; s32 amount = used < new_size ? used : new_size; for (s32 i=0; i stringc; //! Typedef for wide character strings typedef string stringw; } // end namespace core } // end namespace irr #endif fldigi-3.21.80/src/irrxml/fast_atof.h0000664000175000017500000000642212313064025014271 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef __FAST_A_TO_F_H_INCLUDED__ #define __FAST_A_TO_F_H_INCLUDED__ #include #include namespace irr { namespace core { // Disable the use of powf(3) on mingw32 because it breaks cross compilation // on Debian unstable. #ifndef __MINGW32__ const float fast_atof_table[] = { 0.f, 0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f, 0.0000001f, 0.00000001f, 0.000000001f, 0.0000000001f, 0.00000000001f, 0.000000000001f, 0.0000000000001f, 0.00000000000001f, 0.000000000000001f }; //! Provides a fast function for converting a string into a float, //! about 6 times faster than atof in win32. // If you find any bugs, please send them to me, niko (at) irrlicht3d.org. inline char* fast_atof_move(char* c, float& out) { bool inv = false; char *t; float f; if (*c=='-') { c++; inv = true; } f = (float)strtol(c, &t, 10); c = t; if (*c == '.') { c++; float pl = (float)strtol(c, &t, 10); pl *= fast_atof_table[t-c]; f += pl; c = t; if (*c == 'e') { ++c; float exp = (float)strtol(c, &t, 10); f *= (float)pow(10.0f, exp); c = t; } } if (inv) f *= -1.0f; out = f; return c; } //! Provides a fast function for converting a string into a float, //! about 6 times faster than atof in win32. // If you find any bugs, please send them to me, niko (at) irrlicht3d.org. inline const char* fast_atof_move_const(const char* c, float& out) { bool inv = false; char *t; float f; if (*c=='-') { c++; inv = true; } f = (float)strtol(c, &t, 10); c = t; if (*c == '.') { c++; float pl = (float)strtol(c, &t, 10); pl *= fast_atof_table[t-c]; f += pl; c = t; if (*c == 'e') { ++c; f32 exp = (f32)strtol(c, &t, 10); f *= (f32)powf(10.0f, exp); c = t; } } if (inv) f *= -1.0f; out = f; return c; } inline float fast_atof(const char* c) { float ret; fast_atof_move_const(c, ret); return ret; } #else // __MINGW32__ inline float fast_atof(const char* c) { return atof(c); } #endif // !__MINGW32__ } // end namespace core }// end namespace irr #endif fldigi-3.21.80/src/irrxml/heapsort.h0000664000175000017500000000436712313064025014156 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine". // For conditions of distribution and use, see copyright notice in irrlicht.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef __IRR_HEAPSORT_H_INCLUDED__ #define __IRR_HEAPSORT_H_INCLUDED__ #include "irrTypes.h" namespace irr { namespace core { //! Sinks an element into the heap. template inline void heapsink(T*array, s32 element, s32 max) { while ((element<<1) < max) // there is a left child { s32 j = (element<<1); if (j+1 < max && array[j] < array[j+1]) j = j+1; // take right child if (array[element] < array[j]) { T t = array[j]; // swap elements array[j] = array[element]; array[element] = t; element = j; } else return; } } //! Sorts an array with size 'size' using heapsort. template inline void heapsort(T* array_, s32 size) { // for heapsink we pretent this is not c++, where // arrays start with index 0. So we decrease the array pointer, // the maximum always +2 and the element always +1 T* virtualArray = array_ - 1; s32 virtualSize = size + 2; s32 i; // build heap for (i=((size-1)/2); i>=0; --i) heapsink(virtualArray, i+1, virtualSize-1); // sort array for (i=size-1; i>=0; --i) { T t = array_[0]; array_[0] = array_[i]; array_[i] = t; heapsink(virtualArray, 1, i + 1); } } } // end namespace core } // end namespace irr #endif fldigi-3.21.80/src/irrxml/irrArray.h0000664000175000017500000002414212313064025014115 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef __IRR_ARRAY_H_INCLUDED__ #define __IRR_ARRAY_H_INCLUDED__ #include "irrTypes.h" #include "heapsort.h" namespace irr { namespace core { //! Self reallocating template array (like stl vector) with additional features. /** Some features are: Heap sorting, binary search methods, easier debugging. */ template class array { public: array() : data(0), allocated(0), used(0), free_when_destroyed(true), is_sorted(true) { } //! Constructs a array and allocates an initial chunk of memory. //! \param start_count: Amount of elements to allocate. array(u32 start_count) : data(0), used(0), allocated(0), free_when_destroyed(true), is_sorted(true) { reallocate(start_count); } //! Copy constructor array(const array& other) : data(0) { *this = other; } //! Destructor. Frees allocated memory, if set_free_when_destroyed //! was not set to false by the user before. ~array() { if (free_when_destroyed) delete [] data; } //! Reallocates the array, make it bigger or smaller. //! \param new_size: New size of array. void reallocate(u32 new_size) { T* old_data = data; data = new T[new_size]; allocated = new_size; s32 end = used < new_size ? used : new_size; for (s32 i=0; i allocated) { // reallocate(used * 2 +1); // this doesn't work if the element is in the same array. So // we'll copy the element first to be sure we'll get no data // corruption T e; e = element; // copy element reallocate(used * 2 +1); // increase data block data[used++] = e; // push_back is_sorted = false; return; } data[used++] = element; is_sorted = false; } //! Adds an element at the front of the array. If the array is to small to //! add this new element, the array is made bigger. Please note that this //! is slow, because the whole array needs to be copied for this. //! \param element: Element to add at the back of the array. void push_front(const T& element) { if (used + 1 > allocated) reallocate(used * 2 +1); for (int i=(int)used; i>0; --i) data[i] = data[i-1]; data[0] = element; is_sorted = false; ++used; } //! Insert item into array at specified position. Please use this //! only if you know what you are doing (possible performance loss). //! The preferred method of adding elements should be push_back(). //! \param element: Element to be inserted //! \param index: Where position to insert the new element. void insert(const T& element, u32 index=0) { _IRR_DEBUG_BREAK_IF(index>used) // access violation if (used + 1 > allocated) reallocate(used * 2 +1); for (u32 i=used++; i>index; i--) data[i] = data[i-1]; data[index] = element; is_sorted = false; } //! Clears the array and deletes all allocated memory. void clear() { delete [] data; data = 0; used = 0; allocated = 0; is_sorted = true; } //! Sets pointer to new array, using this as new workspace. //! \param newPointer: Pointer to new array of elements. //! \param size: Size of the new array. void set_pointer(T* newPointer, u32 size) { delete [] data; data = newPointer; allocated = size; used = size; is_sorted = false; } //! Sets if the array should delete the memory it used. //! \param f: If true, the array frees the allocated memory in its //! destructor, otherwise not. The default is true. void set_free_when_destroyed(bool f) { free_when_destroyed = f; } //! Sets the size of the array. //! \param usedNow: Amount of elements now used. void set_used(u32 usedNow) { if (allocated < usedNow) reallocate(usedNow); used = usedNow; } //! Assignement operator void operator=(const array& other) { if (data) delete [] data; //if (allocated < other.allocated) if (other.allocated == 0) data = 0; else data = new T[other.allocated]; used = other.used; free_when_destroyed = other.free_when_destroyed; is_sorted = other.is_sorted; allocated = other.allocated; for (u32 i=0; i=used) // access violation return data[index]; } //! Direct access operator const T& operator [](u32 index) const { _IRR_DEBUG_BREAK_IF(index>=used) // access violation return data[index]; } //! Gets last frame const T& getLast() const { _IRR_DEBUG_BREAK_IF(!used) // access violation return data[used-1]; } //! Gets last frame T& getLast() { _IRR_DEBUG_BREAK_IF(!used) // access violation return data[used-1]; } //! Returns a pointer to the array. //! \return Pointer to the array. T* pointer() { return data; } //! Returns a const pointer to the array. //! \return Pointer to the array. const T* const_pointer() const { return data; } //! Returns size of used array. //! \return Size of elements in the array. u32 size() const { return used; } //! Returns amount memory allocated. //! \return Returns amount of memory allocated. The amount of bytes //! allocated would be allocated_size() * sizeof(ElementsUsed); u32 allocated_size() const { return allocated; } //! Returns true if array is empty //! \return True if the array is empty, false if not. bool empty() const { return used == 0; } //! Sorts the array using heapsort. There is no additional memory waste and //! the algorithm performs (O) n log n in worst case. void sort() { if (is_sorted || used<2) return; heapsort(data, used); is_sorted = true; } //! Performs a binary search for an element, returns -1 if not found. //! The array will be sorted before the binary search if it is not //! already sorted. //! \param element: Element to search for. //! \return Returns position of the searched element if it was found, //! otherwise -1 is returned. s32 binary_search(const T& element) { return binary_search(element, 0, used-1); } //! Performs a binary search for an element, returns -1 if not found. //! The array will be sorted before the binary search if it is not //! already sorted. //! \param element: Element to search for. //! \param left: First left index //! \param right: Last right index. //! \return Returns position of the searched element if it was found, //! otherwise -1 is returned. s32 binary_search(const T& element, s32 left, s32 right) { if (!used) return -1; sort(); s32 m; do { m = (left+right)>>1; if (element < data[m]) right = m - 1; else left = m + 1; } while((element < data[m] || data[m] < element) && left<=right); // this last line equals to: // " while((element != array[m]) && left<=right);" // but we only want to use the '<' operator. // the same in next line, it is "(element == array[m])" if (!(element < data[m]) && !(data[m] < element)) return m; return -1; } //! Finds an element in linear time, which is very slow. Use //! binary_search for faster finding. Only works if =operator is implemented. //! \param element: Element to search for. //! \return Returns position of the searched element if it was found, //! otherwise -1 is returned. s32 linear_search(T& element) { for (u32 i=0; i=0; --i) if (data[i] == element) return (s32)i; return -1; } //! Erases an element from the array. May be slow, because all elements //! following after the erased element have to be copied. //! \param index: Index of element to be erased. void erase(u32 index) { _IRR_DEBUG_BREAK_IF(index>=used || index<0) // access violation for (u32 i=index+1; i=used || index<0 || count<1 || index+count>used) // access violation for (u32 i=index+count; i. // ---------------------------------------------------------------------------- #ifndef __IRR_TYPES_H_INCLUDED__ #define __IRR_TYPES_H_INCLUDED__ namespace irr { //! 8 bit unsigned variable. /** This is a typedef for unsigned char, it ensures portability of the engine. */ typedef unsigned char u8; //! 8 bit signed variable. /** This is a typedef for signed char, it ensures portability of the engine. */ typedef signed char s8; //! 8 bit character variable. /** This is a typedef for char, it ensures portability of the engine. */ typedef char c8; //! 16 bit unsigned variable. /** This is a typedef for unsigned short, it ensures portability of the engine. */ typedef unsigned short u16; //! 16 bit signed variable. /** This is a typedef for signed short, it ensures portability of the engine. */ typedef signed short s16; //! 32 bit unsigned variable. /** This is a typedef for unsigned int, it ensures portability of the engine. */ typedef unsigned int u32; //! 32 bit signed variable. /** This is a typedef for signed int, it ensures portability of the engine. */ typedef signed int s32; // 64 bit signed variable. // This is a typedef for __int64, it ensures portability of the engine. // This type is currently not used by the engine and not supported by compilers // other than Microsoft Compilers, so it is outcommented. //typedef __int64 s64; //! 32 bit floating point variable. /** This is a typedef for float, it ensures portability of the engine. */ typedef float f32; //! 64 bit floating point variable. /** This is a typedef for double, it ensures portability of the engine. */ typedef double f64; } // end namespace // define the wchar_t type if not already built in. #ifdef _MSC_VER #ifndef _WCHAR_T_DEFINED //! A 16 bit wide character type. /** Defines the wchar_t-type. In VS6, its not possible to tell the standard compiler to treat wchar_t as a built-in type, and sometimes we just don't want to include the huge stdlib.h or wchar.h, so we'll use this. */ typedef unsigned short wchar_t; #define _WCHAR_T_DEFINED #endif // wchar is not defined #endif // microsoft compiler //! define a break macro for debugging only in Win32 mode. #if defined(WIN32) && defined(_MSC_VER) && defined(_DEBUG) #define _IRR_DEBUG_BREAK_IF( _CONDITION_ ) if (_CONDITION_) {_asm int 3} #else #define _IRR_DEBUG_BREAK_IF( _CONDITION_ ) #endif //! Defines a small statement to work around a microsoft compiler bug. /** The microsft compiler 7.0 - 7.1 has a bug: When you call unmanaged code that returns a bool type value of false from managed code, the return value may appear as true. See http://support.microsoft.com/default.aspx?kbid=823071 for details. Compiler version defines: VC6.0 : 1200, VC7.0 : 1300, VC7.1 : 1310, VC8.0 : 1400*/ #if defined(WIN32) && defined(_MSC_VER) && (_MSC_VER > 1299) && (_MSC_VER < 1400) #define _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX __asm mov eax,100 #else #define _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX #endif // _IRR_MANAGED_MARSHALLING_BUGFIX #endif // __IRR_TYPES_H_INCLUDED__ fldigi-3.21.80/src/Makefile.am0000664000175000017500000004775712313147652012721 00000000000000## Copyright (C) 2007-2009 Stelios Bounanos, M0GLD (m0gld AT enotty DOT net) # Copyright (c) 2008 Dave Freese, W1HKJ (w1hkj AT w1hkj DOT com) # License: GPLv3+: GNU GPL version 3 or later. bin_PROGRAMS = SUBDIRS = if WANT_FLDIGI bin_PROGRAMS += fldigi endif if WANT_FLARQ bin_PROGRAMS += flarq endif # The BUILD_* variables are defined in build.m4 fldigi_CPPFLAGS = -DBUILD_FLDIGI -DLOCALEDIR=\"$(localedir)\" @FLDIGI_BUILD_CPPFLAGS@ -DPKGDATADIR=\"$(pkgdatadir)\" fldigi_CXXFLAGS = @FLDIGI_BUILD_CXXFLAGS@ fldigi_CFLAGS = $(fldigi_CXXFLAGS) fldigi_LDFLAGS = @FLDIGI_BUILD_LDFLAGS@ fldigi_LDADD = @FLDIGI_BUILD_LDADD@ flarq_CPPFLAGS = -DBUILD_FLARQ -DLOCALEDIR=\"$(localedir)\" @FLARQ_BUILD_CPPFLAGS@ flarq_CXXFLAGS = @FLARQ_BUILD_CXXFLAGS@ flarq_CFLAGS = $(flarq_CXXFLAGS) flarq_LDFLAGS = @FLARQ_BUILD_LDFLAGS@ flarq_LDADD = @FLARQ_BUILD_LDADD@ HAMLIB_SRC = include/hamlib.h rigcontrol/hamlib.cxx include/rigclass.h rigcontrol/rigclass.cxx XMLRPC_SRC = include/xmlrpc.h misc/xmlrpc.cxx FLDIGI_WIN32_RES_SRC = fldigirc.rc FLARQ_WIN32_RES_SRC = flarq-src/flarqrc.rc COMMON_WIN32_RES_SRC = common.rc LOCATOR_SRC = misc/locator.c BENCHMARK_SRC = include/benchmark.h misc/benchmark.cxx REGEX_SRC = compat/regex.h compat/regex.c STACK_SRC = include/stack.h misc/stack.cxx MINGW32_SRC = include/compat.h compat/getsysinfo.c compat/mingw.c compat/mingw.h NLS_SRC = misc/nls.cxx include/nls.h # We distribute these but do not always compile them EXTRA_fldigi_SOURCES = $(HAMLIB_SRC) $(XMLRPC_SRC) $(FLDIGI_WIN32_RES_SRC) $(COMMON_WIN32_RES_SRC) \ $(LOCATOR_SRC) $(BENCHMARK_SRC) $(REGEX_SRC) $(STACK_SRC) $(MINGW32_SRC) $(NLS_SRC) EXTRA_flarq_SOURCES = $(FLARQ_WIN32_RES_SRC) $(COMMON_WIN32_RES_SRC) fldigi_SOURCES = flarq_SOURCES = fldigi_SOURCES += $(XMLRPC_SRC) if ENABLE_HAMLIB fldigi_SOURCES += $(HAMLIB_SRC) endif if NEED_HAMLIB_LOCATOR fldigi_SOURCES += $(LOCATOR_SRC) endif if ENABLE_BENCHMARK fldigi_SOURCES += $(BENCHMARK_SRC) endif if COMPAT_REGEX fldigi_SOURCES += $(REGEX_SRC) flarq_SOURCES += $(REGEX_SRC) endif if COMPAT_STACK fldigi_SOURCES += $(STACK_SRC) flarq_SOURCES += $(STACK_SRC) endif if MINGW32 fldigi_SOURCES += $(MINGW32_SRC) flarq_SOURCES += $(MINGW32_SRC) endif if USE_NLS fldigi_SOURCES += $(NLS_SRC) flarq_SOURCES += $(NLS_SRC) endif ######################################################################## FLDIGI_VERSION_MAJOR = @FLDIGI_VERSION_MAJOR@ FLDIGI_VERSION_MINOR = @FLDIGI_VERSION_MINOR@ FLDIGI_VERSION_PATCH = @FLDIGI_VERSION_PATCH@ FLDIGI_VERSION = @FLDIGI_VERSION@ FLARQ_VERSION_MAJOR = @FLARQ_VERSION_MAJOR@ FLARQ_VERSION_MINOR = @FLARQ_VERSION_MINOR@ FLARQ_VERSION_PATCH = @FLARQ_VERSION_PATCH@ FLARQ_VERSION = @FLARQ_VERSION@ # Define the custom silent rule function @SILENT_CMDS@ .EXPORT_ALL_VARIABLES: appbundle nsisinst hamlib-static # Sources that are generated, BUILT_SOURCES = # not distributed, nodist_fldigi_SOURCES = $(BUILT_SOURCES) # and deleted by the clean targets CLEANFILES = $(BUILT_SOURCES) CLEAN_LOCAL = if WIN32 if HAVE_WINDRES .rc.o: $(call silent,WRES ,$@)$(WINDRES) -DRC_BUILD_TIME=\\\"$(shell date +%s)\\\" -I$(srcdir) -I$(srcdir)/include -I$(srcdir)/../data/win32 $< -O coff $@ fldigi_SOURCES += $(FLDIGI_WIN32_RES_SRC) flarq_SOURCES += $(FLARQ_WIN32_RES_SRC) endif endif install-exec-local: if WANT_FLDIGI if test -f $(srcdir)/../scripts/fldigi-shell; then \ $(mkinstalldirs) $(DESTDIR)/$(bindir); \ $(INSTALL_SCRIPT) $(srcdir)/../scripts/fldigi-shell $(DESTDIR)/$(bindir); \ fi if test -f $(srcdir)/../scripts/ftp_kml_files.sh; then \ $(mkinstalldirs) $(DESTDIR)/$(bindir); \ $(INSTALL_SCRIPT) $(srcdir)/../scripts/ftp_kml_files.sh $(DESTDIR)/$(bindir); \ fi endif # TODO: xpm files should probably go to $(datadir)/pixmaps/fldigi instead of $(datadir)/pixmaps install-data-local: if WANT_FLDIGI if test -f $(srcdir)/../data/fldigi.xpm; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/pixmaps; \ $(INSTALL_DATA) $(srcdir)/../data/fldigi.xpm $(DESTDIR)/$(datadir)/pixmaps; \ fi if test -f $(srcdir)/../data/fldigi.desktop; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/applications; \ $(INSTALL_DATA) $(srcdir)/../data/fldigi.desktop $(DESTDIR)/$(datadir)/applications; \ fi if test -f $(srcdir)/../data/NAVTEX_Stations.csv; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/NAVTEX_Stations.csv $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../data/nsd_bbsss.txt; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/nsd_bbsss.txt $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../data/station_table.txt; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/station_table.txt $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../data/ToR-Stats-SHIP.csv; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/ToR-Stats-SHIP.csv $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../data/wmo_list.txt; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/wmo_list.txt $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../kml/styles.kml; then \ $(mkinstalldirs) $(DESTDIR)/$(pkgdatadir)/kml; \ $(INSTALL_DATA) $(srcdir)/../kml/styles.kml $(DESTDIR)/$(pkgdatadir)/kml; \ fi endif if WANT_FLARQ if test -f $(srcdir)/../data/flarq.xpm; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/pixmaps; \ $(INSTALL_DATA) $(srcdir)/../data/flarq.xpm $(DESTDIR)/$(datadir)/pixmaps; \ fi if test -f $(srcdir)/../data/flarq.desktop; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/applications; \ $(INSTALL_DATA) $(srcdir)/../data/flarq.desktop $(DESTDIR)/$(datadir)/applications; \ fi endif uninstall-local: if WANT_FLDIGI rm -f $(DESTDIR)$(bindir)/fldigi-shell rm -f $(DESTDIR)/$(datadir)/pixmaps/fldigi.xpm rm -f $(DESTDIR)/$(datadir)/applications/fldigi.desktop rm -fr $(DESTDIR)/$(datadir)/fldigi endif if WANT_FLARQ rm -f $(DESTDIR)/$(datadir)/pixmaps/flarq.xpm rm -f $(DESTDIR)/$(datadir)/applications/flarq.desktop endif FLDIGI_FL_SRC = \ dialogs/confdialog.fl \ dialogs/notifydialog.fl \ dialogs/record_browse.fl \ logbook/lgbook.fl FLARQ_FL_SRC = flarq-src/arqdialogs.fl if HAVE_FLUID flgen: $(FLDIGI_FL_SRC) $(FLARQ_FL_SRC) if WANT_FLDIGI $(call silent,FLUID ,$(FLDIGI_FL_SRC))(cd $(srcdir)/include; \ for f in $(FLDIGI_FL_SRC); do \ c=$${f%.fl}.cxx; h=$${f%.fl}.h; h=$${h##*/}; \ $(FLUID) -c -o ../$$c -h $$h ../$$f; \ done) endif if WANT_FLARQ $(call silent,FLUID ,$(FLARQ_FL_SRC))(cd $(srcdir)/flarq-src/include; \ for f in $(FLARQ_FL_SRC); do \ c=$${f%.fl}.cxx; h=$${f%.fl}.h; h=$${h##*/}; \ $(FLUID) -c -o ../../$$c -h $$h ../../$$f; \ done) endif endif if WANT_FLDIGI WANT_FLDIGI = yes INSTALLER_FILE = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)_setup.exe APPBUNDLE=$(PACKAGE_TARNAME)-$(PACKAGE_VERSION) APPBUNDLE_NOLIBS=$(APPBUNDLE)-nolibs endif if WANT_FLARQ WANT_FLARQ = yes if !WANT_FLDIGI INSTALLER_FILE = flarq-$(FLARQ_VERSION)_setup.exe APPBUNDLE=flarq-$(FLARQ_VERSION) APPBUNDLE_NOLIBS=$(APPBUNDLE)-nolibs endif endif if DARWIN appbundle: $(bin_PROGRAMS) $(call silent,APPB ,$(APPBUNDLE_NOLIBS) $(APPBUNDLE))sh $(srcdir)/../scripts/mkappbundle.sh "$(srcdir)/../data" . CLEAN_LOCAL += $(APPBUNDLE_NOLIBS) $(APPBUNDLE) $(APPBUNDLE)*.dmg endif if HAVE_NSIS nsisinst: $(bin_PROGRAMS) $(call silent,NSIS ,$(INSTALLER_FILE))sh $(srcdir)/../scripts/mknsisinst.sh "$(srcdir)/../data" . CLEANFILES += $(INSTALLER_FILE) endif if USE_NLS CLEAN_LOCAL += share endif if WANT_FLDIGI if ENABLE_HAMLIB hamlib-static: $(fldigi_OBJECTS) $(call silent,HLS ,fldigi$(EXEEXT))sh $(srcdir)/../scripts/mkhamlibstatic.sh fldigi endif endif tmp_srcdir_var=$(srcdir) TESTS = $(tmp_srcdir_var)/../scripts/tests/config-h.sh $(tmp_srcdir_var)/../scripts/tests/cr.sh if HAVE_ASCIIDOC $(builddir)/../doc/guide.html: $(builddir)/../doc/guide.txt @$(MAKE) -C $(builddir)/../doc $(AM_MAKEFLAGS) guide.html $(builddir)/dialogs/guide.cxx: $(builddir)/../doc/guide.html @mkdir -p $(builddir)/dialogs $(call silent,GUIDE ,$@)sed 's/\\/\\\\/g; s/"/\\"/g; s/$$/\\n\\/g; 1 s/.*/const char* szBeginner = "&/; $$ s/.*/&n";/' $< > $@ dialogs/htmlstrings.cxx: $(builddir)/dialogs/guide.cxx distclean-local: @if test "$(builddir)" != "$(srcdir)"; then \ rm -f $(builddir)/dialogs/guide.cxx; \ fi endif clean-local: -rm -rf $(CLEAN_LOCAL) # Sources that we build. It is OK to have headers here. fldigi_SOURCES += \ combo/combo.cxx \ cw_rtty/cw.cxx \ cw_rtty/morse.cxx \ cw_rtty/rtty.cxx \ cw_rtty/view_rtty.cxx \ contestia/contestia.cxx \ dialogs/confdialog.cxx \ dialogs/fl_digi.cxx \ dialogs/font_browser.cxx \ dialogs/Viewer.cxx \ dialogs/htmlstrings.cxx \ dialogs/notifydialog.cxx \ dialogs/record_browse.cxx \ dtmf/dtmf.cxx \ thor/thor.cxx \ thor/thorvaricode.cxx \ dominoex/dominoex.cxx \ dominoex/dominovar.cxx \ feld/feld.cxx \ feld/feldfonts.cxx \ fileselector/FL/Native_File_Chooser.H \ fileselector/Native_File_Chooser.cxx \ fileselector/fileselect.cxx \ filters/fftfilt.cxx \ filters/filters.cxx \ filters/viterbi.cxx \ globals/globals.cxx \ include/htmlstrings.h \ include/arq_io.h \ include/confdialog.h \ include/dtmf.h \ include/FTextView.h \ include/FTextRXTX.h \ include/fileselect.h \ include/Panel.h \ include/FreqControl.h \ include/analysis.h \ include/ascii.h \ include/charsetdistiller.h \ include/charsetlist.h \ include/colorbox.h \ include/combo.h \ include/complex.h \ include/configuration.h \ include/contestia.h \ include/cw.h \ include/debug.h \ include/digiscope.h \ include/dxcc.h \ include/thor.h \ include/thorvaricode.h \ include/dominoex.h \ include/dominovar.h \ include/feld.h \ include/fftfilt.h \ include/filters.h \ include/fl_digi.h \ include/fl_lock.h \ include/fldigi-config.h \ include/flinput2.h \ include/flmisc.h \ include/flslider2.h \ include/font_browser.h \ include/fontdef.h \ include/gettext.h \ include/globals.h \ include/icons.h \ include/interleave.h \ include/jalocha/pj_cmpx.h \ include/jalocha/pj_fft.h \ include/jalocha/pj_fht.h \ include/jalocha/pj_fifo.h \ include/jalocha/pj_gray.h \ include/jalocha/pj_lowpass3.h \ include/jalocha/pj_mfsk.h \ include/jalocha/pj_struc.h \ include/coordinate.h \ include/gfft.h \ include/kmlserver.h \ include/locator.h \ include/log.h \ include/logger.h \ include/macroedit.h \ include/macros.h \ include/main.h \ include/mbuffer.h \ include/mfsk.h \ include/mfskvaricode.h \ include/wefax.h \ include/wefax-pic.h \ include/misc.h \ include/mixer.h \ include/modem.h \ include/morse.h \ include/mt63base.h \ include/mt63.h \ include/network.h \ include/dsp.h \ include/newinstall.h \ include/notify.h \ include/notifydialog.h \ include/record_browse.h \ include/olivia.h \ include/pkg.h \ include/picture.h \ include/progress.h \ include/psk.h \ include/viewpsk.h \ include/pskcoeff.h \ include/pskvaricode.h \ include/pskeval.h \ include/ptt.h \ include/pixmaps.h \ include/pskrep.h \ include/qrunner.h \ include/lookupcall.h \ include/qrzlib.h \ include/raster.h \ include/re.h \ include/rigCAT.h \ include/rigio.h \ include/rigsupport.h \ include/rigxml.h \ include/ringbuffer.h \ include/rsid.h \ include/rtty.h \ include/view_rtty.h \ include/synop.h \ include/nullmodem.h \ include/record_loader.h \ include/record_loader_gui.h \ include/rx_extract.h \ include/speak.h \ include/serial.h \ include/socket.h \ include/sound.h \ include/soundconf.h \ include/spot.h \ include/ssb.h \ include/stacktrace.h \ include/status.h \ include/strutil.h \ include/testmodem.h \ include/threads.h \ include/throb.h \ include/timeops.h \ include/trx.h \ include/util.h \ include/Viewer.h \ include/viterbi.h \ include/waterfall.h \ include/wwv.h \ include/xmlreader.h \ include/adif_def.h \ include/adif_io.h \ include/calendar.h \ include/date.h \ include/field_def.h \ include/logbook.h \ include/lgbook.h \ include/logsupport.h \ include/outputencoder.h \ include/qso_db.h \ include/table.h \ include/textio.h \ include/psk_browser.h \ include/utf8file_io.h \ include/weather.h \ irrxml/CXMLReaderImpl.h \ irrxml/fast_atof.h \ irrxml/heapsort.h \ irrxml/irrArray.h \ irrxml/irrString.h \ irrxml/irrTypes.h \ irrxml/irrXML.cpp \ irrxml/irrXML.h \ logbook/adif_io.cxx \ logbook/calendar.cxx \ logbook/date.cxx \ logbook/lgbook.cxx \ logbook/logbook.cxx \ logbook/logsupport.cxx \ logbook/lookupcall.cxx \ logbook/qrzlib.cxx \ logbook/qso_db.cxx \ logbook/table.cxx \ logbook/textio.cxx \ logger/logger.cxx \ logger/rx_extract.cxx \ logger/speak.cxx \ main.cxx \ mfsk/interleave.cxx \ mfsk/mfsk.cxx \ mfsk/mfskvaricode.cxx \ wefax/wefax.cxx \ wefax/wefax-pic.cxx \ misc/ascii.cxx \ misc/charsetdistiller.cxx \ misc/charsetlist.cxx \ misc/configuration.cxx \ misc/coordinate.cxx \ misc/debug.cxx \ misc/dxcc.cxx \ misc/icons.cxx \ misc/kmlserver.cxx \ misc/log.cxx \ misc/macroedit.cxx \ misc/macros.cxx \ misc/misc.cxx \ misc/network.cxx \ misc/newinstall.cxx \ misc/outputencoder.cxx \ misc/arq_io.cxx \ misc/pixmaps.cxx \ misc/pixmaps_tango.cxx \ misc/re.cxx \ misc/record_loader.cxx \ misc/socket.cxx \ misc/stacktrace.cxx \ misc/status.cxx \ misc/strutil.cxx \ misc/threads.cxx \ misc/timeops.cxx \ misc/utf8file_io.cxx \ misc/util.cxx \ misc/weather.cxx \ mt63/dsp.cxx \ mt63/mt63.cxx \ mt63/mt63base.cxx \ navtex/navtex.cxx \ include/navtex.h \ olivia/olivia.cxx \ psk/psk.cxx \ psk/pskcoeff.cxx \ psk/pskvaricode.cxx \ psk/viewpsk.cxx \ psk/pskeval.cxx \ qrunner/fqueue.h \ qrunner/qrunner.cxx \ rigcontrol/FreqControl.cxx \ rigcontrol/ptt.cxx \ rigcontrol/rigio.cxx \ rigcontrol/rigsupport.cxx \ rigcontrol/rigxml.cxx \ rigcontrol/serial.cxx \ rsid/rsid.cxx \ soundcard/mixer.cxx \ soundcard/sound.cxx \ soundcard/soundconf.cxx \ spot/notify.cxx \ spot/pskrep.cxx \ spot/spot.cxx \ ssb/ssb.cxx \ synop-src/synop.cxx \ throb/throb.cxx \ trx/modem.cxx \ trx/nullmodem.cxx \ trx/trx.cxx \ waterfall/colorbox.cxx \ waterfall/digiscope.cxx \ waterfall/raster.cxx \ waterfall/waterfall.cxx \ widgets/Fl_Text_Buffer_mod.cxx \ widgets/Fl_Text_Display_mod.cxx \ widgets/Fl_Text_Editor_mod.cxx \ widgets/FTextView.cxx \ widgets/FTextRXTX.cxx \ widgets/Panel.cxx \ widgets/flinput2.cxx \ widgets/flmisc.cxx \ widgets/flslider2.cxx \ widgets/picture.cxx \ widgets/progress.cxx \ widgets/psk_browser.cxx \ wwv/analysis.cxx \ wwv/wwv.cxx \ logbook/xmlrpc_log.cxx \ xmlrpcpp/XmlRpc.h \ xmlrpcpp/XmlRpcClient.cpp \ xmlrpcpp/XmlRpcClient.h \ xmlrpcpp/XmlRpcDispatch.cpp \ xmlrpcpp/XmlRpcDispatch.h \ xmlrpcpp/XmlRpcException.h \ xmlrpcpp/XmlRpcMutex.cpp \ xmlrpcpp/XmlRpcMutex.h \ xmlrpcpp/XmlRpcServer.cpp \ xmlrpcpp/XmlRpcServer.h \ xmlrpcpp/XmlRpcServerConnection.cpp \ xmlrpcpp/XmlRpcServerConnection.h \ xmlrpcpp/XmlRpcServerMethod.cpp \ xmlrpcpp/XmlRpcServerMethod.h \ xmlrpcpp/XmlRpcSocket.cpp \ xmlrpcpp/XmlRpcSocket.h \ xmlrpcpp/XmlRpcSource.cpp \ xmlrpcpp/XmlRpcSource.h \ xmlrpcpp/XmlRpcThread.cpp \ xmlrpcpp/XmlRpcThread.h \ xmlrpcpp/XmlRpcThreadedServer.cpp \ xmlrpcpp/XmlRpcThreadedServer.h \ xmlrpcpp/XmlRpcUtil.cpp \ xmlrpcpp/XmlRpcUtil.h \ xmlrpcpp/XmlRpcValue.cpp \ xmlrpcpp/XmlRpcValue.h \ xmlrpcpp/base64.h \ libtiniconv/tiniconv.c \ libtiniconv/tiniconv_desc.c # Sources that are part of the distribution but are not compiled directly EXTRA_fldigi_SOURCES += \ blank/blank.cxx \ blank/blank.h \ fileselector/flnfc_common.cxx \ feld/Feld7x7-14.cxx \ feld/Feld7x7n-14.cxx \ feld/FeldDx-14.cxx \ feld/FeldFat-14.cxx \ feld/FeldHell-12.cxx \ feld/FeldLittle-12.cxx \ feld/FeldLo8-14.cxx \ feld/FeldLow-14.cxx \ feld/FeldModern-14.cxx \ feld/FeldModern8-14.cxx \ feld/FeldNarr-14.cxx \ feld/FeldReal-14.cxx \ feld/FeldStyl-14.cxx \ feld/FeldVert-14.cxx \ feld/FeldWide-14.cxx \ include/Fl_Text_Buffer_mod.H \ include/Fl_Text_Display_mod.H \ include/Fl_Text_Editor_mod.H \ mfsk/mfsk-pic.cxx \ mt63/alias_1k.dat \ mt63/alias_2k.dat \ mt63/morse.dat \ mt63/symbol.dat \ mt63/alias_k5.dat \ mt63/mt63intl.dat \ rsid/rsid_defs.cxx \ trx/tune.cxx \ dialogs/guide.cxx \ libtiniconv/tiniconv.h \ libtiniconv/tiniconv_int.h \ libtiniconv/encdec/ascii.h \ libtiniconv/encdec/big5.h \ libtiniconv/encdec/ces_big5.h \ libtiniconv/encdec/ces_gbk.h \ libtiniconv/encdec/cp1250.h \ libtiniconv/encdec/cp1251.h \ libtiniconv/encdec/cp1252.h \ libtiniconv/encdec/cp1253.h \ libtiniconv/encdec/cp1254.h \ libtiniconv/encdec/cp1255.h \ libtiniconv/encdec/cp1256.h \ libtiniconv/encdec/cp1257.h \ libtiniconv/encdec/cp1258.h \ libtiniconv/encdec/cp866.h \ libtiniconv/encdec/cp936ext.h \ libtiniconv/encdec/cp936.h \ libtiniconv/encdec/euc_cn.h \ libtiniconv/encdec/flushwc.h \ libtiniconv/encdec/gb2312.h \ libtiniconv/encdec/gbkext1.h \ libtiniconv/encdec/gbkext2.h \ libtiniconv/encdec/gbkext_inv.h \ libtiniconv/encdec/gbk.h \ libtiniconv/encdec/iso2022_jp.h \ libtiniconv/encdec/iso8859_10.h \ libtiniconv/encdec/iso8859_11.h \ libtiniconv/encdec/iso8859_13.h \ libtiniconv/encdec/iso8859_14.h \ libtiniconv/encdec/iso8859_15.h \ libtiniconv/encdec/iso8859_16.h \ libtiniconv/encdec/iso8859_1.h \ libtiniconv/encdec/iso8859_2.h \ libtiniconv/encdec/iso8859_3.h \ libtiniconv/encdec/iso8859_4.h \ libtiniconv/encdec/iso8859_5.h \ libtiniconv/encdec/iso8859_6.h \ libtiniconv/encdec/iso8859_7.h \ libtiniconv/encdec/iso8859_8.h \ libtiniconv/encdec/iso8859_9.h \ libtiniconv/encdec/jisx0201.h \ libtiniconv/encdec/jisx0208.h \ libtiniconv/encdec/koi8_r.h \ libtiniconv/encdec/koi8_ru.h \ libtiniconv/encdec/koi8_u.h \ libtiniconv/encdec/mac_cyrillic.h \ libtiniconv/encdec/ucs2.h \ libtiniconv/encdec/utf7.h \ libtiniconv/encdec/utf8.h \ libtiniconv/encdec/vietcomb.h \ libtiniconv/AUTHORS \ libtiniconv/COPYING \ libtiniconv/README \ libtiniconv/README.FLDIGI flarq_SOURCES += \ dialogs/font_browser.cxx \ flarq-src/arq.cxx \ flarq-src/arqdialogs.cxx \ flarq-src/arqhelp.cxx \ flarq-src/b64.cxx \ flarq-src/flarq.cxx \ flarq-src/flarqenv.cxx \ flarq-src/include/arq.h \ flarq-src/include/arqdialogs.h \ flarq-src/include/b64.h \ flarq-src/include/flarq.h \ flarq-src/include/flarqenv.h \ include/Fl_Text_Display_mod.H \ include/Fl_Text_Editor_mod.H \ include/FTextView.h \ include/debug.h \ include/fileselect.h \ include/flinput2.h \ include/flmisc.h \ include/flslider2.h \ include/font_browser.h \ include/icons.h \ include/pixmaps.h \ include/re.h \ include/socket.h \ include/stacktrace.h \ include/threads.h \ include/table.h \ include/util.h \ combo/combo.cxx \ fileselector/FL/Native_File_Chooser.H \ fileselector/Native_File_Chooser.cxx \ fileselector/fileselect.cxx \ logbook/table.cxx \ misc/ascii.cxx \ misc/debug.cxx \ misc/stacktrace.cxx \ misc/threads.cxx \ misc/timeops.cxx \ widgets/flinput2.cxx \ widgets/flmisc.cxx \ widgets/flslider2.cxx \ misc/icons.cxx \ misc/pixmaps.cxx \ misc/pixmaps_tango.cxx \ misc/re.cxx \ misc/socket.cxx \ misc/util.cxx \ widgets/Fl_Text_Buffer_mod.cxx \ widgets/Fl_Text_Display_mod.cxx \ widgets/Fl_Text_Editor_mod.cxx \ widgets/FTextView.cxx # Additional files that we distribute EXTRA_DIST = \ $(srcdir)/../scripts/mkappbundle.sh \ $(srcdir)/../scripts/mkhamlibstatic.sh \ $(srcdir)/../scripts/mknsisinst.sh \ $(srcdir)/../scripts/fldigi-shell \ $(srcdir)/../scripts/tests/cr.sh \ $(srcdir)/../scripts/tests/config-h.sh \ $(srcdir)/../data/fldigi-psk.png \ $(srcdir)/../data/fldigi-rtty.png \ $(srcdir)/../data/fldigi.xpm \ $(srcdir)/../data/fldigi.desktop \ $(srcdir)/../data/NAVTEX_Stations.csv \ $(srcdir)/../data/nsd_bbsss.txt \ $(srcdir)/../data/station_table.txt \ $(srcdir)/../data/ToR-Stats-SHIP.csv \ $(srcdir)/../data/mac/Info.plist.in \ $(srcdir)/../data/mac/fldigi.icns \ $(srcdir)/../data/win32/fldigi.ico \ $(srcdir)/../data/flarq.desktop \ $(srcdir)/../data/flarq.xpm \ $(srcdir)/../data/mac/flarq.icns \ $(srcdir)/../data/win32/flarq.ico \ $(srcdir)/synop-src/synop_tool.cxx \ $(srcdir)/synop-src/README \ $(srcdir)/synop-src/Makefile \ $(FLDIGI_FL_SRC) \ $(FLARQ_FL_SRC) fldigi-3.21.80/src/psk/0000775000175000017500000000000012313333726011515 500000000000000fldigi-3.21.80/src/psk/pskeval.cxx0000664000175000017500000000717612313064025013632 00000000000000// ---------------------------------------------------------------------------- // pskeval.cxx -- psk signal evaluator // // Copyright (C) 2008-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "fl_digi.h" #include "pskeval.h" #include "configuration.h" #include "misc.h" using namespace std; //============================================================================= //========================== psk signal evaluation ============================ //============================================================================= pskeval::pskeval() { bw = 31.25; clear(); } pskeval::~pskeval() { } int countdown = 8; int rows = 0; void pskeval::sigdensity() { int ihbw = (int)(0.6*bw); int ibw = 2 * ihbw; double *vals = new double[ibw]; double sig = 0.0; double val = 0.0; int low = progdefaults.LowFreqCutoff; if (low < ihbw) low = ihbw; int high = progdefaults.HighFreqCutoff; if (high > FFT_LEN - ihbw) high = FFT_LEN - ihbw; int nbr = high - low; sigmin = 1e6; for (int i = 0; i < ibw; i++) { val = vals[i] = wf->Pwr(i + low - ihbw); sig += val; } for (int i = 0, j = 0; i < nbr; i++) { sigpwr[i + low] = decayavg(sigpwr[i + low], sig, 32); sig -= vals[j]; val = vals[j] = wf->Pwr(i + ihbw + low); sig += val; if (++j == ibw) j = 0; if (sig < sigmin) sigmin = sig; } if (sigmin < 1e-8) sigmin = 1e-8; delete [] vals; } double pskeval::sigpeak(int &f, int f1, int f2) { double peak = 0; f1 -= bw; if (f1 <= progdefaults.LowFreqCutoff) f1 = progdefaults.LowFreqCutoff; f2 += bw; if (f2 >= progdefaults.HighFreqCutoff) f2 = progdefaults.HighFreqCutoff; int fa = f2, fb = f1; for (int i = f1; i < f2; i++) if (sigpwr[i] > peak) peak = sigpwr[i]; if (!peak) return 0; for (int i = f1; i < f2; i++) if (sigpwr[i] > peak*0.75) fb = i; for (int i = f2; i > f1; i--) if (sigpwr[i] > peak*0.75) fa = i; if (fa > fb) return 0; f = (fa + fb) / 2; return peak / sigmin / bw; } double pskeval::peak(int &f0, int f1, int f2, double db) { double peak = 0; int fa = f2, fb = f1; double level = pow(10, (10 + db) / 10.0); //step 1 for (int i = f1; i < f2; i++) if (sigpwr[i] > peak) peak = sigpwr[i]; if (((peak-sigmin) / sigmin ) < level) { return 0; } for (int i = f1; i < f2; i++) if (sigpwr[i] > peak*0.75) fb = i; for (int i = f2; i > f1; i--) if (sigpwr[i] > peak*0.75) fa = i; if (fa > fb) { return 0; } f0 = (fa + fb) / 2; //step 2 f1 = f0 - 1.5*bw; if (f1 < bw) f1 = bw; f2 = f0 + 1.5*bw; fb = f1; fa = f2; peak = 0; for (int i = f1; i < f2; i++) if (sigpwr[i] > peak) peak = sigpwr[i]; for (int i = f1; i < f2; i++) if (sigpwr[i] > peak*0.75) fb = i; for (int i = f2; i > f1; i--) if (sigpwr[i] > peak*0.75) fa = i; if (fa > fb) { return 0; } f0 = (fa + fb) / 2; return (peak - sigmin) / sigmin ; } void pskeval::clear() { for (int i = 0; i < FFT_LEN; i++) sigpwr[i] = 0.0; } fldigi-3.21.80/src/psk/pskvaricode.cxx0000664000175000017500000002532612313064025014474 00000000000000// ---------------------------------------------------------------------------- // varicode.cxx -- PSK31 Varicode // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "pskvaricode.h" // PSK31 Varicode for encoding static const char *varicodetab1[] = { "1010101011", /* 0 - */ "1011011011", /* 1 - */ "1011101101", /* 2 - */ "1101110111", /* 3 - */ "1011101011", /* 4 - */ "1101011111", /* 5 - */ "1011101111", /* 6 - */ "1011111101", /* 7 - */ "1011111111", /* 8 - */ "11101111", /* 9 - */ "11101", /* 10 - */ "1101101111", /* 11 - */ "1011011101", /* 12 - */ "11111", /* 13 - */ "1101110101", /* 14 - */ "1110101011", /* 15 - */ "1011110111", /* 16 - */ "1011110101", /* 17 - */ "1110101101", /* 18 - */ "1110101111", /* 19 - */ "1101011011", /* 20 - */ "1101101011", /* 21 - */ "1101101101", /* 22 - */ "1101010111", /* 23 - */ "1101111011", /* 24 - */ "1101111101", /* 25 - */ "1110110111", /* 26 - */ "1101010101", /* 27 - */ "1101011101", /* 28 - */ "1110111011", /* 29 - */ "1011111011", /* 30 - */ "1101111111", /* 31 - */ "1", /* 32 - */ "111111111", /* 33 - ! */ "101011111", /* 34 - '"' */ "111110101", /* 35 - # */ "111011011", /* 36 - $ */ "1011010101", /* 37 - % */ "1010111011", /* 38 - & */ "101111111", /* 39 - ' */ "11111011", /* 40 - ( */ "11110111", /* 41 - ) */ "101101111", /* 42 - * */ "111011111", /* 43 - + */ "1110101", /* 44 - , */ "110101", /* 45 - - */ "1010111", /* 46 - . */ "110101111", /* 47 - / */ "10110111", /* 48 - 0 */ "10111101", /* 49 - 1 */ "11101101", /* 50 - 2 */ "11111111", /* 51 - 3 */ "101110111", /* 52 - 4 */ "101011011", /* 53 - 5 */ "101101011", /* 54 - 6 */ "110101101", /* 55 - 7 */ "110101011", /* 56 - 8 */ "110110111", /* 57 - 9 */ "11110101", /* 58 - : */ "110111101", /* 59 - ; */ "111101101", /* 60 - < */ "1010101", /* 61 - = */ "111010111", /* 62 - > */ "1010101111", /* 63 - ? */ "1010111101", /* 64 - @ */ "1111101", /* 65 - A */ "11101011", /* 66 - B */ "10101101", /* 67 - C */ "10110101", /* 68 - D */ "1110111", /* 69 - E */ "11011011", /* 70 - F */ "11111101", /* 71 - G */ "101010101", /* 72 - H */ "1111111", /* 73 - I */ "111111101", /* 74 - J */ "101111101", /* 75 - K */ "11010111", /* 76 - L */ "10111011", /* 77 - M */ "11011101", /* 78 - N */ "10101011", /* 79 - O */ "11010101", /* 80 - P */ "111011101", /* 81 - Q */ "10101111", /* 82 - R */ "1101111", /* 83 - S */ "1101101", /* 84 - T */ "101010111", /* 85 - U */ "110110101", /* 86 - V */ "101011101", /* 87 - W */ "101110101", /* 88 - X */ "101111011", /* 89 - Y */ "1010101101", /* 90 - Z */ "111110111", /* 91 - [ */ "111101111", /* 92 - \ */ "111111011", /* 93 - ] */ "1010111111", /* 94 - ^ */ "101101101", /* 95 - _ */ "1011011111", /* 96 - ` */ "1011", /* 97 - a */ "1011111", /* 98 - b */ "101111", /* 99 - c */ "101101", /* 100 - d */ "11", /* 101 - e */ "111101", /* 102 - f */ "1011011", /* 103 - g */ "101011", /* 104 - h */ "1101", /* 105 - i */ "111101011", /* 106 - j */ "10111111", /* 107 - k */ "11011", /* 108 - l */ "111011", /* 109 - m */ "1111", /* 110 - n */ "111", /* 111 - o */ "111111", /* 112 - p */ "110111111", /* 113 - q */ "10101", /* 114 - r */ "10111", /* 115 - s */ "101", /* 116 - t */ "110111", /* 117 - u */ "1111011", /* 118 - v */ "1101011", /* 119 - w */ "11011111", /* 120 - x */ "1011101", /* 121 - y */ "111010101", /* 122 - z */ "1010110111", /* 123 - { */ "110111011", /* 124 - | */ "1010110101", /* 125 - } */ "1011010111", /* 126 - ~ */ "1110110101", /* 127 - */ "1110111101", /* 128 - */ "1110111111", /* 129 - */ "1111010101", /* 130 - */ "1111010111", /* 131 - */ "1111011011", /* 132 - */ "1111011101", /* 133 - */ "1111011111", /* 134 - */ "1111101011", /* 135 - */ "1111101101", /* 136 - */ "1111101111", /* 137 - */ "1111110101", /* 138 - */ "1111110111", /* 139 - */ "1111111011", /* 140 - */ "1111111101", /* 141 - */ "1111111111", /* 142 - */ "10101010101", /* 143 - */ "10101010111", /* 144 - */ "10101011011", /* 145 - */ "10101011101", /* 146 - */ "10101011111", /* 147 - */ "10101101011", /* 148 - */ "10101101101", /* 149 - */ "10101101111", /* 150 - */ "10101110101", /* 151 - */ "10101110111", /* 152 - */ "10101111011", /* 153 - */ "10101111101", /* 154 - */ "10101111111", /* 155 - */ "10110101011", /* 156 - */ "10110101101", /* 157 - */ "10110101111", /* 158 - */ "10110110101", /* 159 - */ "10110110111", /* 160 -   */ "10110111011", /* 161 - ¡ */ "10110111101", /* 162 - ¢ */ "10110111111", /* 163 - £ */ "10111010101", /* 164 - ¤ */ "10111010111", /* 165 - ¥ */ "10111011011", /* 166 - ¦ */ "10111011101", /* 167 - § */ "10111011111", /* 168 - ¨ */ "10111101011", /* 169 - © */ "10111101101", /* 170 - ª */ "10111101111", /* 171 - « */ "10111110101", /* 172 - ¬ */ "10111110111", /* 173 - ­ */ "10111111011", /* 174 - ® */ "10111111101", /* 175 - ¯ */ "10111111111", /* 176 - ° */ "11010101011", /* 177 - ± */ "11010101101", /* 178 - ² */ "11010101111", /* 179 - ³ */ "11010110101", /* 180 - ´ */ "11010110111", /* 181 - µ */ "11010111011", /* 182 - ¶ */ "11010111101", /* 183 - · */ "11010111111", /* 184 - ¸ */ "11011010101", /* 185 - ¹ */ "11011010111", /* 186 - º */ "11011011011", /* 187 - » */ "11011011101", /* 188 - ¼ */ "11011011111", /* 189 - ½ */ "11011101011", /* 190 - ¾ */ "11011101101", /* 191 - ¿ */ "11011101111", /* 192 - À */ "11011110101", /* 193 - Á */ "11011110111", /* 194 -  */ "11011111011", /* 195 - à */ "11011111101", /* 196 - Ä */ "11011111111", /* 197 - Å */ "11101010101", /* 198 - Æ */ "11101010111", /* 199 - Ç */ "11101011011", /* 200 - È */ "11101011101", /* 201 - É */ "11101011111", /* 202 - Ê */ "11101101011", /* 203 - Ë */ "11101101101", /* 204 - Ì */ "11101101111", /* 205 - Í */ "11101110101", /* 206 - Î */ "11101110111", /* 207 - Ï */ "11101111011", /* 208 - Ð */ "11101111101", /* 209 - Ñ */ "11101111111", /* 210 - Ò */ "11110101011", /* 211 - Ó */ "11110101101", /* 212 - Ô */ "11110101111", /* 213 - Õ */ "11110110101", /* 214 - Ö */ "11110110111", /* 215 - × */ "11110111011", /* 216 - Ø */ "11110111101", /* 217 - Ù */ "11110111111", /* 218 - Ú */ "11111010101", /* 219 - Û */ "11111010111", /* 220 - Ü */ "11111011011", /* 221 - Ý */ "11111011101", /* 222 - Þ */ "11111011111", /* 223 - ß */ "11111101011", /* 224 - à */ "11111101101", /* 225 - á */ "11111101111", /* 226 - â */ "11111110101", /* 227 - ã */ "11111110111", /* 228 - ä */ "11111111011", /* 229 - å */ "11111111101", /* 230 - æ */ "11111111111", /* 231 - ç */ "101010101011", /* 232 - è */ "101010101101", /* 233 - é */ "101010101111", /* 234 - ê */ "101010110101", /* 235 - ë */ "101010110111", /* 236 - ì */ "101010111011", /* 237 - í */ "101010111101", /* 238 - î */ "101010111111", /* 239 - ï */ "101011010101", /* 240 - ð */ "101011010111", /* 241 - ñ */ "101011011011", /* 242 - ò */ "101011011101", /* 243 - ó */ "101011011111", /* 244 - ô */ "101011101011", /* 245 - õ */ "101011101101", /* 246 - ö */ "101011101111", /* 247 - ÷ */ "101011110101", /* 248 - ø */ "101011110111", /* 249 - ù */ "101011111011", /* 250 - ú */ "101011111101", /* 251 - û */ "101011111111", /* 252 - ü */ "101101010101", /* 253 - ý */ "101101010111", /* 254 - þ */ "101101011011" /* 255 - ÿ */ }; // The same in a format more suitable for decoding. static unsigned int varicodetab2[] = { 0x2AB, 0x2DB, 0x2ED, 0x377, 0x2EB, 0x35F, 0x2EF, 0x2FD, 0x2FF, 0x0EF, 0x01D, 0x36F, 0x2DD, 0x01F, 0x375, 0x3AB, 0x2F7, 0x2F5, 0x3AD, 0x3AF, 0x35B, 0x36B, 0x36D, 0x357, 0x37B, 0x37D, 0x3B7, 0x355, 0x35D, 0x3BB, 0x2FB, 0x37F, 0x001, 0x1FF, 0x15F, 0x1F5, 0x1DB, 0x2D5, 0x2BB, 0x17F, 0x0FB, 0x0F7, 0x16F, 0x1DF, 0x075, 0x035, 0x057, 0x1AF, 0x0B7, 0x0BD, 0x0ED, 0x0FF, 0x177, 0x15B, 0x16B, 0x1AD, 0x1AB, 0x1B7, 0x0F5, 0x1BD, 0x1ED, 0x055, 0x1D7, 0x2AF, 0x2BD, 0x07D, 0x0EB, 0x0AD, 0x0B5, 0x077, 0x0DB, 0x0FD, 0x155, 0x07F, 0x1FD, 0x17D, 0x0D7, 0x0BB, 0x0DD, 0x0AB, 0x0D5, 0x1DD, 0x0AF, 0x06F, 0x06D, 0x157, 0x1B5, 0x15D, 0x175, 0x17B, 0x2AD, 0x1F7, 0x1EF, 0x1FB, 0x2BF, 0x16D, 0x2DF, 0x00B, 0x05F, 0x02F, 0x02D, 0x003, 0x03D, 0x05B, 0x02B, 0x00D, 0x1EB, 0x0BF, 0x01B, 0x03B, 0x00F, 0x007, 0x03F, 0x1BF, 0x015, 0x017, 0x005, 0x037, 0x07B, 0x06B, 0x0DF, 0x05D, 0x1D5, 0x2B7, 0x1BB, 0x2B5, 0x2D7, 0x3B5, 0x3BD, 0x3BF, 0x3D5, 0x3D7, 0x3DB, 0x3DD, 0x3DF, 0x3EB, 0x3ED, 0x3EF, 0x3F5, 0x3F7, 0x3FB, 0x3FD, 0x3FF, 0x555, 0x557, 0x55B, 0x55D, 0x55F, 0x56B, 0x56D, 0x56F, 0x575, 0x577, 0x57B, 0x57D, 0x57F, 0x5AB, 0x5AD, 0x5AF, 0x5B5, 0x5B7, 0x5BB, 0x5BD, 0x5BF, 0x5D5, 0x5D7, 0x5DB, 0x5DD, 0x5DF, 0x5EB, 0x5ED, 0x5EF, 0x5F5, 0x5F7, 0x5FB, 0x5FD, 0x5FF, 0x6AB, 0x6AD, 0x6AF, 0x6B5, 0x6B7, 0x6BB, 0x6BD, 0x6BF, 0x6D5, 0x6D7, 0x6DB, 0x6DD, 0x6DF, 0x6EB, 0x6ED, 0x6EF, 0x6F5, 0x6F7, 0x6FB, 0x6FD, 0x6FF, 0x755, 0x757, 0x75B, 0x75D, 0x75F, 0x76B, 0x76D, 0x76F, 0x775, 0x777, 0x77B, 0x77D, 0x77F, 0x7AB, 0x7AD, 0x7AF, 0x7B5, 0x7B7, 0x7BB, 0x7BD, 0x7BF, 0x7D5, 0x7D7, 0x7DB, 0x7DD, 0x7DF, 0x7EB, 0x7ED, 0x7EF, 0x7F5, 0x7F7, 0x7FB, 0x7FD, 0x7FF, 0xAAB, 0xAAD, 0xAAF, 0xAB5, 0xAB7, 0xABB, 0xABD, 0xABF, 0xAD5, 0xAD7, 0xADB, 0xADD, 0xADF, 0xAEB, 0xAED, 0xAEF, 0xAF5, 0xAF7, 0xAFB, 0xAFD, 0xAFF, 0xB55, 0xB57, 0xB5B }; const char *psk_varicode_encode(unsigned char c) { return varicodetab1[c]; } int psk_varicode_decode(unsigned int symbol) { for (int i = 0; i < 256; i++) if (symbol == varicodetab2[i]) return i; return -1; } fldigi-3.21.80/src/psk/pskcoeff.cxx0000664000175000017500000001062612313064025013757 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "pskcoeff.h" // Linux PSK31 modem driver for soundcard -- Filter coefficients // // these FIR coefs are those used by G0TJZ in his TMC320C50 code // // Hansi Reiser, DL9RDZ, 20 April 1998 // #include // 64-tap raised-cosine FIR // implements // u[n] = (1.0 - cos(2PI * n / 64))/128.0 // used in gmfsk, twpsk etc. double gmfir1c[64] = { 0.000000, //0 0.000038, //1 0.000150, //2 0.000336, //3 0.000595, //4 0.000922, //5 0.001317, //6 0.001773, //7 0.002288, //8 0.002856, //9 0.003472, //10 0.004130, //11 0.004823, //12 0.005545, //13 0.006288, //14 0.007047, //15 0.007812, //16 0.008578, //17 0.009337, //18 0.010080, //19 0.010802, //20 0.011495, //21 0.012153, //22 0.012769, //23 0.013337, //24 0.013852, //25 0.014308, //26 0.014703, //27 0.015030, //28 0.015289, //29 0.015475, //30 0.015587, //31 0.015625, //32 0.015587, //33 0.015475, //34 0.015289, //35 0.015030, //36 0.014703, //37 0.014308, //38 0.013852, //39 0.013337, //40 0.012769, //41 0.012153, //42 0.011495, //43 0.010802, //44 0.010080, //45 0.009337, //46 0.008578, //47 0.007813, //48 0.007047, //49 0.006288, //50 0.005545, //51 0.004823, //52 0.004130, //53 0.003472, //54 0.002856, //55 0.002288, //56 0.001773, //57 0.001317, //58 0.000922, //59 0.000595, //60 0.000336, //61 0.000150, //62 0.000038, //63 }; // 4-bit receive filter for 31.25 baud BPSK // Designed by G3PLX // double gmfir2c[64] = { 0.000625000, 0.000820912, 0.001374651, 0.002188141, 0.003110600, 0.003956273, 0.004526787, 0.004635947, 0.004134515, 0.002932456, 0.001016352, -0.001539947, -0.004572751, -0.007834665, -0.011009254, -0.013733305, -0.015625000, -0.016315775, -0.015483216, -0.012882186, -0.008371423, -0.001933193, 0.006315933, 0.016124399, 0.027115485, 0.038807198, 0.050640928, 0.062016866, 0.072333574, 0.081028710, 0.087617820, 0.091728168, 0.093125000, 0.091728168, 0.087617820, 0.081028710, 0.072333574, 0.062016866, 0.050640928, 0.038807198, 0.027115485, 0.016124399, 0.006315933, -0.001933193, -0.008371423, -0.012882186, -0.015483216, -0.016315775, -0.015625000, -0.013733305, -0.011009254, -0.007834665, -0.004572751, -0.001539947, 0.001016352, 0.002932456, 0.004134515, 0.004635947, 0.004526787, 0.003956273, 0.003110600, 0.002188141, 0.001374651, 0.000820912 }; // sync filter // weighting for sync samples // sum of all weights = 1.0 double syncfilt[16] = { -0.097545161, -0.093796555, -0.086443400, -0.075768274, -0.062181416, -0.046204960, -0.028452874, -0.009607360, 0.009607360, 0.028452874, 0.046204960, 0.062181416, 0.075768274, 0.086443400, 0.093796555, 0.097545161 }; // experimental filters (higher precision) // identical to the G0TJZ filter but with double precision void raisedcosfilt(double *firc) { for (int i = 0; i < 64; i++) firc[i] = (1.0 - cos(M_PI * i / 32.0))/128.0; } void wsincfilt(double *firc, double fc, bool blackman) { double normalize = 0; // sin(x-tau)/(x-tau) for (int i = 0; i < 64; i++) if (i == 32) firc[i] = 2.0 * M_PI * fc; else firc[i] = sin(2*M_PI*fc*(i - 32))/(i-32); // blackman window if (blackman) for (int i = 0; i < 64; i++) firc[i] = firc[i] * (0.42 - 0.5 * cos(2*M_PI*i/64) + 0.08 * cos(4*M_PI*i/64)); // hamming window else for (int i = 0; i < 64; i++) firc[i] = firc[i] * (0.54 - 0.46 * cos(2*M_PI*i/64)); // normalization factor for (int i = 0; i < 64; i++) normalize += firc[i]; // normalize the filter for (int i = 0; i < 64; i++) firc[i] /= normalize; } fldigi-3.21.80/src/psk/psk.cxx0000664000175000017500000011675512313064025012766 00000000000000// ---------------------------------------------------------------------------- // psk.cxx -- psk modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2009-2010 // John Douyere, VK2ETA // // PSK-FEC and PSK-R modes contributed by VK2ETA // // This file is part of fldigi. Adapted from code contained in gmfsk // source code distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "psk.h" #include "main.h" #include "fl_digi.h" #include "trx.h" #include "misc.h" #include "waterfall.h" #include "configuration.h" #include "status.h" #include "viewpsk.h" #include "pskeval.h" #include "modem.h" #include "Viewer.h" #include "macros.h" extern waterfall *wf; // Change the following for DCD low pass filter adjustment #define SQLCOEFF 0.01 #define SQLDECAY 50 //===================================================================== #define K 5 #define POLY1 0x17 #define POLY2 0x19 // PSK + FEC + INTERLEAVE #define PSKR_K 7 #define PSKR_POLY1 0x6d #define PSKR_POLY2 0x4f #define SEPARATION 1.4 //separation between carriers expressed as a ratio to sc_bw #define GALILEO_K 15 #define GALILEO_POLY1 046321 #define GALILEO_POLY2 051271 char pskmsg[80]; viewpsk *pskviewer = (viewpsk *)0; void psk::tx_init(SoundBase *sc) { scard = sc; for (int car = 0; car < numcarriers; car++) { phaseacc[car] = 0; prevsymbol[car] = cmplx (1.0, 0.0); } preamble = dcdbits; if (_pskr) { // MFSK based varicode instead of psk shreg = 1; shreg2 = 1; } else { shreg = 0; shreg2 = 0; } videoText(); // interleaver bitshreg = 0; startpreamble = true; symbols = 0; acc_symbols = 0; ovhd_symbols = 0; } void psk::rx_init() { for (int car = 0; car < numcarriers; car++) { phaseacc[car] = 0; prevsymbol[car] = cmplx (1.0, 0.0); } quality = cmplx (0.0, 0.0); if (_pskr) { // MFSK varicode instead of psk shreg = 1; shreg2 = 1; } else { shreg = 0; shreg2 = 0; } dcdshreg = 0; dcdshreg2 = 0; dcd = 0; bitclk = 0; freqerr = 0.0; if (mailserver && progdefaults.PSKmailSweetSpot) sigsearch = SIGSEARCH; else sigsearch = 0; put_MODEstatus(mode); resetSN_IMD(); imdValid = false; afcmetric = 0.0; // interleaver, split incoming bit stream into two, one late by one bit rxbitstate = 0; fecmet = fecmet2 = 0; if (Rxinlv) Rxinlv->flush(); if (Rxinlv2) Rxinlv2->flush(); } void psk::restart() { if (numcarriers == 1) pskviewer->restart(mode); evalpsk->setbw(sc_bw); } void psk::init() { restart(); modem::init(); set_scope_mode(Digiscope::PHASE); initSN_IMD(); snratio = 1.0; imdratio = 0.001; rx_init(); } psk::~psk() { if (tx_shape) delete [] tx_shape; if (enc) delete enc; if (dec) delete dec; // FEC 2nd Viterbi decoder if (dec2) delete dec2; for (int i = 0; i < MAX_CARRIERS; i++) { if (fir1[i]) delete fir1[i]; if (fir2[i]) delete fir2[i]; } if (snfilt) delete snfilt; if (imdfilt) delete imdfilt; if (::pskviewer == pskviewer) ::pskviewer = 0; delete pskviewer; delete evalpsk; // Interleaver if (Rxinlv) delete Rxinlv; if (Rxinlv2) delete Rxinlv2; if (Txinlv) delete Txinlv; } psk::psk(trx_mode pskmode) : modem() { cap |= CAP_AFC | CAP_AFC_SR; mode = pskmode; int isize = 5; int idepth = 5; // 5x5x5 interleaver numcarriers = 1; switch (mode) { case MODE_PSK31: symbollen = 256; _qpsk = false; _pskr = false; dcdbits = 32; numcarriers = 1; break; case MODE_PSK63: symbollen = 128; _qpsk = false; _pskr = false; dcdbits = 64; numcarriers = 1; break; case MODE_PSK125: symbollen = 64; _qpsk = false; _pskr = false; dcdbits = 128; numcarriers = 1; break; case MODE_PSK250: symbollen = 32; _qpsk = false; _pskr = false; dcdbits = 256; numcarriers = 1; break; case MODE_PSK500: symbollen = 16; _qpsk = false; _pskr = false; dcdbits = 512; numcarriers = 1; break; case MODE_PSK1000: symbollen = 8; _qpsk = false; _pskr = false; dcdbits = 128; numcarriers = 1; break; case MODE_QPSK31: symbollen = 256; _qpsk = true; _pskr = false; dcdbits = 32; cap |= CAP_REV; numcarriers = 1; break; case MODE_QPSK63: symbollen = 128; _qpsk = true; _pskr = false; dcdbits = 64; cap |= CAP_REV; numcarriers = 1; break; case MODE_QPSK125: symbollen = 64; _qpsk = true; _pskr = false; dcdbits = 128; cap |= CAP_REV; numcarriers = 1; break; case MODE_QPSK250: symbollen = 32; _qpsk = true; _pskr = false; dcdbits = 256; cap |= CAP_REV; numcarriers = 1; break; case MODE_QPSK500: symbollen = 16; _qpsk = true; _pskr = false; dcdbits = 512; cap |= CAP_REV; numcarriers = 1; break; case MODE_PSK63F: // As per Multipsk (BPSK63 + FEC + MFSK Varicode) symbollen = 128; _qpsk = false; _pskr = true; dcdbits = 64; numcarriers = 1; break; case MODE_PSK125R: symbollen = 64; _qpsk = false; _pskr = true; dcdbits = 128; isize = 2; idepth = 40; // 2x2x40 interleaver numcarriers = 1; break; case MODE_PSK250R: symbollen = 32; _qpsk = false; _pskr = true; dcdbits = 256; isize = 2; idepth = 80; // 2x2x80 interleaver numcarriers = 1; break; case MODE_PSK500R: symbollen = 16; _qpsk = false; _pskr = true; dcdbits = 512; isize = 2; idepth = 160; // 2x2x160 interleaver numcarriers = 1; break; case MODE_PSK1000R: symbollen = 8; _qpsk = false; _pskr = true; dcdbits = 512; isize = 2; idepth = 160; // 2x2x160 interleaver numcarriers = 1; break; // multi-carrier modems case MODE_4X_PSK63R: symbollen = 128;//PSK63 dcdbits = 128; _qpsk = false; _pskr = true;//PSKR numcarriers = 4; isize = 2; idepth = 80; // 2x2x80 interleaver break; case MODE_5X_PSK63R: symbollen = 128; //PSK63 dcdbits = 512; _qpsk = false; _pskr = true; //PSKR numcarriers = 5; isize = 2; idepth = 260; // 2x2x160 interleaver break; case MODE_10X_PSK63R: symbollen = 128; //PSK63 dcdbits = 512; _qpsk = false; _pskr = true; //PSKR numcarriers = 10; isize = 2; idepth = 160; // 2x2x160 interleaver break; case MODE_20X_PSK63R: symbollen = 128; //PSK63 dcdbits = 512; _qpsk = false; _pskr = true; //PSKR numcarriers = 20; isize = 2; idepth = 160; // 2x2x160 interleaver break; case MODE_32X_PSK63R: symbollen = 128; //PSK63 dcdbits = 512; _qpsk = false; _pskr = true; //PSKR numcarriers = 32; isize = 2; idepth = 160; // 2x2x160 interleaver break; case MODE_4X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _qpsk = false; _pskr = true;//PSKR numcarriers = 4; isize = 2; idepth = 80; // 2x2x80 interleaver break; case MODE_5X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _qpsk = false; _pskr = true;//PSKR numcarriers = 5; isize = 2; idepth = 160; // 2x2x160 interleaver break; case MODE_10X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _qpsk = false; _pskr = true;//PSKR numcarriers = 10; isize = 2; idepth = 160; // 2x2x160 interleaver break; case MODE_12X_PSK125: symbollen = 64;//PSK125 dcdbits = 128;//512; _qpsk = false; _pskr = false; numcarriers = 12; break; case MODE_12X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _qpsk = false; _pskr = true;//PSKR numcarriers = 12; isize = 2; idepth = 160; // 2x2x160 interleaver break; case MODE_16X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _qpsk = false; _pskr = true;//PSKR numcarriers = 16; isize = 2; idepth = 160; // 2x2x160 interleaver break; case MODE_2X_PSK250R: symbollen = 32;//PSK250 dcdbits = 512; _qpsk = false; _pskr = true;//PSKR numcarriers = 2; isize = 2; idepth = 160; // 2x2x160 interleaver break; case MODE_3X_PSK250R: symbollen = 32;//PSK250 dcdbits = 512; _qpsk = false; _pskr = true;//PSKR numcarriers = 3; isize = 2; idepth = 160; // 2x2x160 interleaver break; case MODE_5X_PSK250R: symbollen = 32;//PSK250 _qpsk = false; _pskr = true;//PSKR dcdbits = 1024; numcarriers = 5; isize = 2; idepth = 160; // 2x2x160 interleaver break; case MODE_6X_PSK250: symbollen = 32;//PSK250 _qpsk = false; _pskr = false; dcdbits = 512; numcarriers = 6; break; case MODE_6X_PSK250R: symbollen = 32;//PSK250 _qpsk = false; _pskr = true;//PSKR dcdbits = 1024; numcarriers = 6; isize = 2; idepth = 160; // 2x2x160 interleaver break; case MODE_7X_PSK250R: symbollen = 32;//PSK250 _qpsk = false; _pskr = true;//PSKR dcdbits = 1024; numcarriers = 7; isize = 2; idepth = 160; // 2x2x160 interleaver break; case MODE_2X_PSK500: symbollen = 16; _qpsk = false; _pskr = false; dcdbits = 512; numcarriers = 2; break; case MODE_4X_PSK500: symbollen = 16; _qpsk = false; _pskr = false; dcdbits = 512; numcarriers = 4; break; case MODE_2X_PSK500R: symbollen = 16; _qpsk = false; _pskr = true; dcdbits = 1024; isize = 2; idepth = 160; // 2x2x160 interleaver numcarriers = 2; break; case MODE_3X_PSK500R: symbollen = 16; _qpsk = false; _pskr = true; dcdbits = 1024; isize = 2; idepth = 160; // 2x2x160 interleaver numcarriers = 3; break; case MODE_4X_PSK500R: symbollen = 16; _qpsk = false; _pskr = true; dcdbits = 1024; isize = 2; idepth = 160; // 2x2x160 interleaver numcarriers = 4; break; case MODE_2X_PSK800: symbollen = 10; _qpsk = false; _pskr = false; dcdbits = 512; numcarriers = 2; break; case MODE_2X_PSK800R: symbollen = 10; _qpsk = false; _pskr = true; dcdbits = 1024; isize = 2; idepth = 160; // 2x2x160 interleaver numcarriers = 2; break; case MODE_2X_PSK1000: symbollen = 8;//PSK1000 _qpsk = false; _pskr = false; dcdbits = 1024; numcarriers = 2; isize = 2; idepth = 160; // 2x2x160 interleaver break; case MODE_2X_PSK1000R: symbollen = 8;//PSK1000 _qpsk = false; _pskr = true;//PSKR dcdbits = 1024; numcarriers = 2; isize = 2; idepth = 160; // 2x2x160 interleaver break; default: mode = MODE_PSK31; symbollen = 256; _qpsk = false; _pskr = false; dcdbits = 32; numcarriers = 1; } //printf("%s: symlen %d, dcdbits %d, _qpsk %d, _pskr %d, numc %d\n", //mode_info[mode].sname, //symbollen, dcdbits, _qpsk, _pskr, numcarriers); enc = (encoder *)0; dec = (viterbi *)0; // BPSK+FEC - 2nd Viterbi decoder and de-interleaver dec2 = (viterbi *)0; Txinlv = (interleave *)0; Rxinlv = (interleave *)0; Rxinlv2 = (interleave *)0; // create impulse response for experimental FIR filters double fir1c[64]; double fir2c[64]; for (int i = 0; i < MAX_CARRIERS; i++) { if (i < numcarriers) { fir1[i] = new C_FIR_filter(); fir2[i] = new C_FIR_filter(); } else { fir1[i] = (C_FIR_filter *)0; fir2[i] = (C_FIR_filter *)0; } } switch (progdefaults.PSK_filter) { case 1: // use the original gmfsk matched filters for (int i = 0; i < 64; i++) { fir1c[i] = gmfir1c[i]; fir2c[i] = gmfir2c[i]; } for (int i = 0; i < numcarriers; i++) { fir1[i]->init(FIRLEN, symbollen > 15 ? symbollen / 16 : 1, fir1c, fir1c); fir2[i]->init(FIRLEN, 1, fir2c, fir2c); } break; case 2: // creates fir1c matched sin(x)/x filter w hamming wsincfilt(fir1c, 1.0 / symbollen, false); // creates fir2c matched sin(x)/x filter w hamming wsincfilt(fir2c, 1.0 / 16.0, false); for (int i = 0; i < numcarriers; i++) { fir1[i]->init(FIRLEN, symbollen > 15 ? symbollen / 16 : 1, fir1c, fir1c); fir2[i]->init(FIRLEN, 1, fir2c, fir2c); } break; case 3: // creates fir1c matched sin(x)/x filter w hamming wsincfilt(fir1c, 1.0 / symbollen, false); // 1/22 with Hamming window nearly identical to gmfir2c wsincfilt(fir2c, 1.0 / 22.0, false); for (int i = 0; i < numcarriers; i++) { fir1[i]->init(FIRLEN, symbollen > 15 ? symbollen / 16 : 1, fir1c, fir1c); fir2[i]->init(FIRLEN, 1, fir2c, fir2c); } break; case 4: wsincfilt(fir2c, 1.5 / 16.0, true); for (int i = 0; i < numcarriers; i++) { fir1[i]->init_lowpass (FIRLEN, 16, 1.5 / symbollen); fir2[i]->init(FIRLEN, 1, fir2c, fir2c); } case 0: default : // creates fir1c matched sin(x)/x filter w blackman wsincfilt(fir1c, 1.0 / symbollen, true); // creates fir2c matched sin(x)/x filter w blackman wsincfilt(fir2c, 1.0 / 16.0, true); for (int i = 0; i < numcarriers; i++) { fir1[i]->init(FIRLEN, symbollen > 15 ? symbollen / 16 : 1, fir1c, fir1c); fir2[i]->init(FIRLEN, 1, fir2c, fir2c); } } snfilt = new Cmovavg(16); imdfilt = new Cmovavg(16); if (_qpsk) { enc = new encoder(K, POLY1, POLY2); dec = new viterbi(K, POLY1, POLY2); } if (_pskr) { // FEC for BPSK. Use a 2nd Viterbi decoder for comparison. // Set decode size to 4 since some characters can be as small // as 3 bits long. This minimises intercharacters decoding // interactions. enc = new encoder(PSKR_K, PSKR_POLY1, PSKR_POLY2); dec = new viterbi(PSKR_K, PSKR_POLY1, PSKR_POLY2); dec->setchunksize(4); dec2 = new viterbi(PSKR_K, PSKR_POLY1, PSKR_POLY2); dec2->setchunksize(4); // Interleaver. To maintain constant time delay between bits, // we double the number of concatenated square iterleavers for // each doubling of speed: 2x2x20 for BSK63+FEC, 2x2x40 for // BPSK125+FEC, etc.. if (_pskr && (mode != MODE_PSK63F)) { // 2x2x(20,40,80,160) Txinlv = new interleave (isize, idepth, INTERLEAVE_FWD);//numinterleavers, INTERLEAVE_FWD); // 2x2x(20,40,80,160) Rxinlv = new interleave (isize, idepth, INTERLEAVE_REV);//numinterleavers, INTERLEAVE_REV); // 2x2x(20,40,80,160) Rxinlv2 = new interleave (isize, idepth, INTERLEAVE_REV);//numinterleavers, INTERLEAVE_REV); } bitshreg = 0; rxbitstate = 0; startpreamble = true; } tx_shape = new double[symbollen]; // raised cosine shape for the transmitter for ( int i = 0; i < symbollen; i++) tx_shape[i] = 0.5 * cos(i * M_PI / symbollen) + 0.5; samplerate = PskSampleRate; fragmentsize = symbollen; sc_bw = samplerate / symbollen; //JD added for multiple carriers inter_carrier = SEPARATION * sc_bw; bandwidth = sc_bw * ( 1 + SEPARATION * (numcarriers - 1)); snratio = s2n = imdratio = imd = 0; if (mailserver && progdefaults.PSKmailSweetSpot) sigsearch = SIGSEARCH; else sigsearch = 0; for (int i = 0; i < 16; i++) syncbuf[i] = 0.0; E1 = E2 = E3 = 0.0; acquire = 0; evalpsk = new pskeval; if (numcarriers == 1) { ::pskviewer = pskviewer = new viewpsk(evalpsk, mode); } else ::pskviewer = pskviewer = 0; } //============================================================================= //=========================== psk31 receive routines ========================== //============================================================================= void psk::s2nreport(void) { modem::s2nreport(); s2n_sum = s2n_sum2 = s2n_ncount = 0.0; } void psk::rx_bit(int bit) { int c; shreg = (shreg << 1) | !!bit; if (_pskr) { // MFSK varicode instead of PSK Varicode if ((shreg & 7) == 1) { c = varidec(shreg >> 1); // Voting at the character level if (fecmet >= fecmet2) { if ((c != -1) && (c != 0) && (dcd == true)) { put_rx_char(c); if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { s2n_sum += s2n_metric; s2n_sum2 += (s2n_metric * s2n_metric); s2n_ncount ++; if (c == EOT) s2nreport(); } } } shreg = 1; } } else { if ((shreg & 3) == 0) { c = psk_varicode_decode(shreg >> 2); if ((c != -1) && (dcd == true)) { put_rx_char(c); if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { s2n_sum += s2n_metric; s2n_sum2 += (s2n_metric * s2n_metric); s2n_ncount++; if (c == EOT) s2nreport(); } } shreg = 0; } } } void psk::rx_bit2(int bit) { int c; shreg2 = (shreg2 << 1) | !!bit; // MFSK varicode instead of PSK Varicode if ((shreg2 & 7) == 1) { c = varidec(shreg2 >> 1); // Voting at the character level if (fecmet < fecmet2) { if ((c != -1) && (c != 0) && (dcd == true)) { put_rx_char(c); if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { s2n_sum += s2n_metric; s2n_sum2 += (s2n_metric * s2n_metric); s2n_ncount++; if (c == EOT) s2nreport(); } } } shreg2 = 1; } } void psk::rx_qpsk(int bits) { unsigned char sym[2]; int c; if (_qpsk && !reverse) bits = (4 - bits) & 3; sym[0] = (bits & 1) ? 255 : 0; sym[1] = (bits & 2) ? 0 : 255; // top bit is flipped //JD added de-interleaver // Rxinlv->symbols(sym); c = dec->decode(sym, NULL); if (c != -1) { rx_bit(c & 0x80); rx_bit(c & 0x40); rx_bit(c & 0x20); rx_bit(c & 0x10); rx_bit(c & 0x08); rx_bit(c & 0x04); rx_bit(c & 0x02); rx_bit(c & 0x01); } } void psk::rx_pskr(unsigned char symbol) { int met; unsigned char twosym[2]; unsigned char tempc; int c; //In the case of multiple carriers, if even number of carriers then we // know the bit-order and don't need voting otherwise // we accumulate the soft bits for the interleaver THEN submit to Viterbi // decoder in alternance so that each one is processed one bit later. // Only two possibilities for sync: current bit or previous one since // we encode with R = 1/2 and send encoded bits one after the other // through the interleaver. symbolpair[1] = symbolpair[0]; symbolpair[0] = symbol; if (rxbitstate == 0) { rxbitstate++; //Only use one decoder is using even carriers (we know the bits order) // if (((int)numcarriers) % 2 == 0) { // fecmet2 = -9999.0; // return; // } // copy to avoid scrambling symbolpair for the next bit twosym[0] = symbolpair[0]; twosym[1] = symbolpair[1]; // De-interleave for Robust modes only if (mode != MODE_PSK63F) Rxinlv2->symbols(twosym); // pass de-interleaved bits pair to the decoder, reversed tempc = twosym[1]; twosym[1] = twosym[0]; twosym[0] = tempc; // Then viterbi decoder c = dec2->decode(twosym, &met); if (c != -1) { // FEC only take metric measurement after backtrace // Will be used for voting between the two decoded streams fecmet2 = decayavg(fecmet2, met, 20); rx_bit2(c & 0x08); rx_bit2(c & 0x04); rx_bit2(c & 0x02); rx_bit2(c & 0x01); } } else { // Again for the same stream shifted by one bit rxbitstate = 0; twosym[0] = symbolpair[0]; twosym[1] = symbolpair[1]; // De-interleave if (mode != MODE_PSK63F) Rxinlv->symbols(twosym); tempc = twosym[1]; twosym[1] = twosym[0]; twosym[0] = tempc; // Then viterbi decoder c = dec->decode(twosym, &met); if (c != -1) { fecmet = decayavg(fecmet, met, 20); rx_bit(c & 0x08); rx_bit(c & 0x04); rx_bit(c & 0x02); rx_bit(c & 0x01); } } } void psk::searchDown() { double srchfreq = frequency - sc_bw * 2; double minfreq = sc_bw * 2; double spwr, npwr; while (srchfreq > minfreq) { spwr = wf->powerDensity(srchfreq, sc_bw); npwr = wf->powerDensity(srchfreq + sc_bw, sc_bw/2) + 1e-10; if (spwr / npwr > pow(10, progdefaults.ServerACQsn / 10)) { frequency = srchfreq; set_freq(frequency); sigsearch = SIGSEARCH; break; } srchfreq -= sc_bw; } } void psk::searchUp() { double srchfreq = frequency + sc_bw * 2; double maxfreq = IMAGE_WIDTH - sc_bw * 2; double spwr, npwr; while (srchfreq < maxfreq) { spwr = wf->powerDensity(srchfreq, sc_bw/2); npwr = wf->powerDensity(srchfreq - sc_bw, sc_bw/2) + 1e-10; if (spwr / npwr > pow(10, progdefaults.ServerACQsn / 10)) { frequency = srchfreq; set_freq(frequency); sigsearch = SIGSEARCH; break; } srchfreq += sc_bw; } } int waitcount = 0; void psk::findsignal() { int ftest, f1, f2; if (sigsearch > 0) { sigsearch--; if (mailserver) { // mail server search algorithm if (progdefaults.PSKmailSweetSpot) { f1 = (int)(progdefaults.ServerCarrier - progdefaults.ServerOffset); f2 = (int)(progdefaults.ServerCarrier + progdefaults.ServerOffset); } else { f1 = (int)(frequency - progdefaults.ServerOffset); f2 = (int)(frequency + progdefaults.ServerOffset); } if (evalpsk->sigpeak(ftest, f1, f2) > pow(10, progdefaults.ServerACQsn / 10) ) { if (progdefaults.PSKmailSweetSpot) { if (fabs(ftest - progdefaults.ServerCarrier) < progdefaults.ServerOffset) { frequency = ftest; set_freq(frequency); freqerr = 0.0; } else { frequency = progdefaults.ServerCarrier; set_freq(frequency); freqerr = 0.0; } } else { frequency = ftest; set_freq(frequency); freqerr = 0.0; } } else { // less than the detection threshold if (progdefaults.PSKmailSweetSpot) { frequency = progdefaults.ServerCarrier; set_freq(frequency); sigsearch = SIGSEARCH; } } } else { // normal signal search algorithm f1 = (int)(frequency - progdefaults.SearchRange/2); f2 = (int)(frequency + progdefaults.SearchRange/2); if (evalpsk->sigpeak(ftest, f1, f2) > pow(10, progdefaults.ACQsn / 10.0) ) { frequency = ftest; set_freq(frequency); freqerr = 0.0; sigsearch = 0; acquire = dcdbits; } } } } //JD: disable for multiple carriers as we are running as modem and // therefore use other strategies for frequency alignment like RSID void psk::phaseafc() { double error; if (afcmetric < 0.05 || mode == MODE_PSK500 || mode == MODE_QPSK500 || numcarriers > 1 ) return; error = (phase - bits * M_PI / 2.0); if (error < -M_PI / 2.0 || error > M_PI / 2.0) return; error *= samplerate / (TWOPI * symbollen); if (fabs(error) < sc_bw ) { freqerr = error / dcdbits; frequency -= freqerr; if (mailserver) { if (frequency < progdefaults.ServerCarrier - progdefaults.ServerAFCrange) frequency = progdefaults.ServerCarrier - progdefaults.ServerAFCrange; if (frequency > progdefaults.ServerCarrier + progdefaults.ServerAFCrange) frequency = progdefaults.ServerCarrier + progdefaults.ServerAFCrange; } set_freq (frequency); } if (acquire) acquire--; } void psk::afc() { if (!progStatus.afconoff) return; if (dcd == true || acquire) phaseafc(); } void psk::rx_symbol(cmplx symbol, int car) { int n; unsigned char softbit = 0; double softangle; double softamp; double sigamp = norm(symbol); static double averageamp; phase = arg ( conj(prevsymbol[car]) * symbol ); prevsymbol[car] = symbol; if (phase < 0) phase += TWOPI; if (_qpsk) { bits = ((int) (phase / M_PI_2 + 0.5)) & 3; n = 4; } else { // bpsk and pskr bits = (((int) (phase / M_PI + 0.5)) & 1) << 1; // hard decode if needed // softbit = (bits & 2) ? 0 : 255; // reversed as we normally pass "!bits" when hard decoding // Soft decode section below averageamp = decayavg(averageamp, sigamp, SQLDECAY); if (sigamp > 0 && averageamp > 0) { if (sigamp > averageamp) { softamp = clamp( sqrt(sigamp / averageamp), 1.0, 1e6); } else { softamp = clamp( sqrt(averageamp / sigamp), 1.0, 1e6); } } else { softamp = 2; // arbritary number (50% impact) } // Compute values between -128 and +127 for phase value only double alpha = phase / M_PI; if (alpha > 1.0) alpha = 2.0 - alpha; softangle = 127.0 - 255.0 * alpha; softbit = (unsigned char) ((softangle / ( 1.0 + softamp / 2.0)) + 128); n = 2; } // simple low pass filter for quality of signal quality = cmplx( decayavg(quality.real(), cos(n*phase), _pskr ? SQLDECAY * 10 : SQLDECAY), decayavg(quality.imag(), sin(n*phase), _pskr ? SQLDECAY * 10 : SQLDECAY)); metric = 100.0 * norm(quality); if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { //s2n reporting: rescale depending on mode, clip after scaling if (_pskr) s2n_metric = metric * 1.5 + 8; else s2n_metric = metric; s2n_metric = CLAMP(s2n_metric, 0.0, 100.0); } // FEC: adjust squelch for extra sensitivity. // Otherwise we miss good characters if (_pskr) { metric = metric * 4; } if (metric > 100) metric = 100; afcmetric = decayavg(afcmetric, norm(quality), 50); dcdshreg = (dcdshreg << 2) | bits; imdValid = false; switch (dcdshreg) { case 0xAAAAAAAA: // DCD on by preamble for psk modes if (!_pskr) { dcd = true; acquire = 0; quality = cmplx (1.0, 0.0); imdValid = true; if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) s2n_sum = s2n_sum2 = s2n_ncount = 0.0; } break; case 0xA0A0A0A0: // DCD on by preamble for PSKR modes ("11001100" sequence sent as preamble) if (_pskr) { dcd = true; acquire = 0; quality = cmplx (1.0, 0.0); imdValid = true; //VK2ETA added logic to prevent resetting // noSOHyet = true; if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) s2n_sum = s2n_sum2 = s2n_ncount = 0.0; } break; case 0: // DCD off by postamble. Not for PSKR modes as this is not unique to postamble. if (!_pskr) { dcd = false; acquire = 0; quality = cmplx (0.0, 0.0); } break; default: if (metric > progStatus.sldrSquelchValue || progStatus.sqlonoff == false) { dcd = true; } else { dcd = false; } } if (!_pskr) { set_phase(phase, norm(quality), dcd); if (dcd == true) { if (_qpsk ) rx_qpsk(bits); else rx_bit(!bits); } } else { // pskr processing // FEC: moved below the rx_bit to use proper value for dcd rx_pskr(softbit); set_phase(phase, norm(quality), dcd); } } void psk::signalquality() { if (m_Energy[1]) snratio = snfilt->run(m_Energy[0]/m_Energy[1]); else snratio = snfilt->run(1.0); if (m_Energy[0] && imdValid) imdratio = imdfilt->run(m_Energy[2]/m_Energy[0]); else imdratio = imdfilt->run(0.001); } void psk::update_syncscope() { static char msg1[15]; static char msg2[15]; display_metric(metric); s2n = 10.0*log10( snratio ); snprintf(msg1, sizeof(msg1), "s/n %2d dB", (int)(floor(s2n))); imd = 10.0*log10( imdratio ); snprintf(msg2, sizeof(msg2), "imd %3d dB", (int)(floor(imd))); if (imdValid) { put_Status1(msg1, progdefaults.StatusTimeout, progdefaults.StatusDim ? STATUS_DIM : STATUS_CLEAR); put_Status2(msg2, progdefaults.StatusTimeout, progdefaults.StatusDim ? STATUS_DIM : STATUS_CLEAR); } } char bitstatus[100]; int psk::rx_process(const double *buf, int len) { double delta[MAX_CARRIERS], frequencies[MAX_CARRIERS]; cmplx z, z2[MAX_CARRIERS]; bool can_rx_symbol = false; if (numcarriers == 1) { if (!progdefaults.report_when_visible || dlgViewer->visible() || progStatus.show_channels ) if (pskviewer && !bHistory) pskviewer->rx_process(buf, len); if (evalpsk) evalpsk->sigdensity(); } frequencies[0] = frequency + ((-1 * numcarriers) + 1) * inter_carrier / 2; delta[0] = TWOPI * frequencies[0] / samplerate; for (int car = 1; car < numcarriers; car++) { frequencies[car] = frequencies[car - 1] + inter_carrier; delta[car] = TWOPI * frequencies[car] / samplerate; } while (len-- > 0) { for (int car = 0; car < numcarriers; car++) { // Mix with the internal NCO z = cmplx ( *buf * cos(phaseacc[car]), *buf * sin(phaseacc[car]) ); phaseacc[car] += delta[car]; if (phaseacc[car] > M_PI) phaseacc[car] -= TWOPI; // Filter and downsample // by 16 (psk31, qpsk31) // by 8 (psk63, qpsk63) // by 4 (psk125, qpsk125) // by 2 (psk250, qpsk250) // by 1 (psk500, qpsk500) = no down sampling // first filter if (fir1[car]->run( z, z )) { // fir1 returns true every Nth sample // final filter fir2[car]->run( z, z2[car] ); // fir2 returns value on every sample //On last carrier processing if (car == numcarriers - 1) { calcSN_IMD(z); //JD OR all carriers together check logic??? /** * This is the symbol timing recovery mechanism. After the demodulated * signal is processed by the matched filters, the signal lobes are * expected to have been modified to a fairly symmetric shape. The * magnitude of the samples are taken, thus rectifying the signal to * positive values. "bitclk" is a counter that is very close in rate to * (samples / symbol). Its purpose is to repeatedly "draw" one symbol * waveform in the syncbuf array, according to its amplitude (not phase). */ int idx = (int) bitclk; double sum = 0.0; double ampsum = 0.0; for (int ii = 0; ii < numcarriers; ii++) { sum += abs(z2[ii])/numcarriers; } // syncbuf[idx] = 0.8 * syncbuf[idx] + 0.2 * z2[car].mag(); syncbuf[idx] = 0.8 * syncbuf[idx] + 0.2 * sum; sum = 0.0; //Handling of modes faster than PSK500/PSK500R /* for (int i = 0; i < 8; i++) { sum += (syncbuf[i] - syncbuf[i+8]); ampsum += (syncbuf[i] + syncbuf[i+8]); } */ // double bitsteps = (symbollen >= 16 ? 16 : 8); double bitsteps = (symbollen >= 16 ? 16 : symbollen); int symsteps = (int) (bitsteps / 2); /** * Here we sum up the difference between each sample's magnitude in the * lower half of the array with its counterpart on the upper half of the * array, or the other side of the waveform. Each pair's difference is * divided by their sum, scaling it so that the signal amplitude does not * affect the result. When the differences are summed, it gives an * indication of which side is larger than the other. */ for (int i = 0; i < symsteps; i++) { sum += (syncbuf[i] - syncbuf[i+symsteps]); ampsum += (syncbuf[i] + syncbuf[i+symsteps]); } // added correction as per PocketDigi sum = (ampsum == 0 ? 0 : sum / ampsum); /** * If the lower side is larger (meaning that the waveform is shifted in that * direction), then the sum is negative, and bitclk needs to be adjusted to * be a little faster, so that the next drawing of the waveform in syncbuf * will be shifted right. Conversely, if the sum is positive, then it needs * to slow down bitclk so that the waveform is shifted left. Thus the * error is subtracted from bitclk, rather than added. The goal is to * get the error as close to zero as possible, so that the receiver is * exactly synced with the transmitter and the waveform is exactly in * the middle of syncbuf. */ // bitclk -= sum / 5.0; bitclk -= sum / (5.0 * 16 / bitsteps); bitclk += 1; /** * When bitclock reaches the end of the buffer, then a complete waveform * has been received. It is time to output the current sample and wrap * around to the next cycle. * * There is a complete symbol waveform in syncbuf, so that each * sample[0..N/2-1] is very close in amplitude with the corresponding * sample in [N/2..N-1]. * * | ******** ******** | * | **** **** **** **** | * | *** *** *** *** | * | ** ** ** ** | * | * * * * | * | * * * * | * |* * *| * |_______________________________________________________________| * 0 N/2 N-1 * * === or some variation of it .... === * * |**** ******** *****| * | **** **** **** **** | * | *** *** *** *** | * | ** ** ** ** | * | * * * * | * | * * * * | * | * * | * |_______________________________________________________________| * 0 N/2 N-1 * * At the end of this cycle, bitclk is pointing at a sample which will * have the maximum phase difference, if any, from the previous symbol's * phase. * */ // if (bitclk < 0) bitclk += 16.0; // if (bitclk >= 16.0) { // bitclk -= 16.0; if (bitclk < 0) bitclk += bitsteps; if (bitclk >= bitsteps) { bitclk -= bitsteps; can_rx_symbol = true; update_syncscope(); afc(); } } } } if (can_rx_symbol) { for (int car = 0; car < numcarriers; car++) { rx_symbol(z2[car], car); } can_rx_symbol = false; } buf++; } if (sigsearch) findsignal(); else if (mailserver) { if (waitcount > 0) { --waitcount; if (waitcount == 0) { if (progdefaults.PSKmailSweetSpot) { frequency = progdefaults.PSKsweetspot; set_freq(frequency); } sigsearch = SIGSEARCH; } } else if ( E1/ E2 <= 1.0) { waitcount = 8; sigsearch = 0; } } return 0; } //===================================================================== // transmit processes //===================================================================== void psk::tx_carriers() { double delta[MAX_CARRIERS]; double ival, qval, shapeA, shapeB; cmplx symbol; double frequencies[MAX_CARRIERS]; //Process all carrier's symbols, then submit to sound card frequencies[0] = get_txfreq_woffset() + ((-1 * numcarriers) + 1) * inter_carrier / 2; delta[0] = TWOPI * frequencies[0] / samplerate; for (int car = 1; car < symbols; car++) { frequencies[car] = frequencies[car - 1] + inter_carrier; delta[car] = TWOPI * frequencies[car] / samplerate; } double maxamp = 0; int sym; for (int car = 0; car < symbols; car++) { sym = txsymbols[car]; if (_qpsk && !reverse) sym = (4 - sym) & 3; // differential QPSK modulation - top bit flipped switch (sym) { case 0: symbol = cmplx (-1.0, 0.0); // 180 degrees break; case 1: symbol = cmplx (0.0, -1.0); // 270 degrees break; case 2: symbol = cmplx (1.0, 0.0); // 0 degrees break; case 3: symbol = cmplx (0.0, 1.0); // 90 degrees break; } symbol = prevsymbol[car] * symbol; // cmplx multiplication for (int i = 0; i < symbollen; i++) { shapeA = tx_shape[i]; shapeB = (1.0 - shapeA); ival = shapeA * prevsymbol[car].real() + shapeB * symbol.real(); qval = shapeA * prevsymbol[car].imag() + shapeB * symbol.imag(); if (car != 0) { outbuf[i] += (ival * cos(phaseacc[car]) + qval * sin(phaseacc[car]));// / numcarriers; } else { outbuf[i] = (ival * cos(phaseacc[car]) + qval * sin(phaseacc[car]));// / numcarriers; } if (maxamp < fabs(outbuf[i])) { maxamp = fabs(outbuf[i]); } phaseacc[car] += delta[car]; if (phaseacc[car] > M_PI) phaseacc[car] -= 2.0 * M_PI; } prevsymbol[car] = symbol; } if (maxamp) for (int i = 0; i < symbollen; i++) outbuf[i] /= maxamp; ModulateXmtr(outbuf, symbollen); } void psk::tx_symbol(int sym) { acc_symbols++; txsymbols[symbols] = sym; if (++symbols < numcarriers) { return; } tx_carriers(); symbols = 0; //reset } void psk::tx_bit(int bit) { unsigned int sym; // qpsk transmission if (_qpsk) { sym = enc->encode(bit); sym = sym & 3;//JD just to make sure tx_symbol(sym); } else if (_pskr) { // Encode into two bits bitshreg = enc->encode(bit); // pass through interleaver if (mode != MODE_PSK63F) Txinlv->bits(&bitshreg); // Send low bit first. tx_symbol expects 0 or 2 for BPSK sym = (bitshreg & 1) << 1; tx_symbol(sym); sym = bitshreg & 2; tx_symbol(sym); // else normal bpsk tranmission } else { sym = bit << 1; tx_symbol(sym); } } unsigned char ch; void psk::tx_char(unsigned char c) { ch = c; const char *code; char_symbols = acc_symbols; if (_pskr) { // acc_symbols = 0; // ARQ varicode instead of MFSK for PSK63FEC code = varienc(c); } else { code = psk_varicode_encode(c); } while (*code) { tx_bit((*code - '0')); code++; } if (! _pskr) { // MSFK varicode instead of psk varicode tx_bit(0); tx_bit(0); } char_symbols = acc_symbols - char_symbols; } void psk::tx_flush() { if (_pskr) { ovhd_symbols = ((numcarriers - symbols) % numcarriers); //VK2ETA replace with a more effective flushing sequence (avoids cutting the last characters in low s/n) for (int i = 0; i < ovhd_symbols/2; i++) tx_bit(0); for (int i = 0; i < dcdbits; i++) tx_bit(0); return; } // QPSK - flush the encoder if (_qpsk) { for (int i = 0; i < dcdbits; i++) tx_bit(0); // FEC : replace unmodulated carrier by an encoded sequence of zeros } // Standard BPSK postamble // DCD off sequence (unmodulated carrier) //VK2ETA remove for pskr since it is not used for DCD and only adds delay and creates TX overlaps if (!_pskr) { for (int i = 0; i < dcdbits; i++) tx_symbol(2); } } // Necessary to clear the interleaver before we start sending void psk::clearbits() { bitshreg = enc->encode(0); for (int k = 0; k < 160; k++) { Txinlv->bits(&bitshreg); } } int psk::tx_process() { int c; if (preamble > 0) { if (_pskr) { if (startpreamble == true) { if (mode != MODE_PSK63F) clearbits(); startpreamble = false; } // FEC prep the encoder with one/zero sequences of bits preamble--; preamble--; tx_bit(1); tx_bit(0); // FEC: Mark start of first character with a double zero // to ensure sync at end of preamble if (preamble == 0) while (acc_symbols % numcarriers) tx_bit(0); return 0; } else { //JD for QPSK500R // if (mode == MODE_QPSK500) clearbits(); // Standard BPSK/QPSK preamble preamble--; tx_symbol(0); // send phase reversals return 0; } } c = get_tx_char(); if (c == GET_TX_CHAR_ETX || stopflag) { tx_flush(); stopflag = false; cwid(); char_samples = char_symbols * symbollen / numcarriers; xmt_samples = acc_symbols * symbollen / numcarriers; ovhd_samples = (acc_symbols - char_symbols - ovhd_symbols) * symbollen / numcarriers; return -1; // we're done } if (c == GET_TX_CHAR_NODATA) { if (_pskr) { // MFSK varicode instead of psk tx_char(0); // tx_bit(1); // extended zero bit stream for (int i = 0; i < 32; i++) tx_bit(0); } else { tx_bit(0); } } else { tx_char(c); put_echo_char(c); } return 0; } //============================================================================ // psk signal evaluation // using Goertzel IIR filter // derived from pskcore by Moe Wheatley, AE4JY //============================================================================ void psk::initSN_IMD() { for(int i = 0; i < NUM_FILTERS; i++) { I1[i] = I2[i] = Q1[i] = Q2[i] = 0.0; m_Energy[i] = 0.0; } m_NCount = 0; COEF[0] = 2.0 * cos(TWOPI * 9 / GOERTZEL); COEF[1] = 2.0 * cos(TWOPI * 18 / GOERTZEL); COEF[2] = 2.0 * cos(TWOPI * 27 / GOERTZEL); } void psk::resetSN_IMD() { for(int i = 0; i < NUM_FILTERS; i++) { I1[i] = I2[i] = Q1[i] = Q2[i] = 0.0; } m_NCount = 0; } //============================================================================ // This routine calculates the energy in the frequency bands of // carrier=F0(15.625), noise=F1(31.25), and // 3rd order product=F2(46.875) // It is called with cmplx data samples at 500 Hz. //============================================================================ void psk::calcSN_IMD(cmplx z) { int i; double tempI = 0, tempQ = 0; for(i = 0; i < NUM_FILTERS; i++) { tempI = I1[i]; tempQ = Q1[i]; I1[i] = I1[i] * COEF[i]- I2[i] + z.real(); Q1[i] = Q1[i] * COEF[i]- Q2[i] + z.imag(); I2[i] = tempI; Q2[i] = tempQ; } if( ++m_NCount >= GOERTZEL ) { m_NCount = 0; for(i = 0; i < NUM_FILTERS; i++) { m_Energy[i] = I1[i]*I1[i] + Q1[i]*Q1[i] + I2[i]*I2[i] + Q2[i]*Q2[i] - I1[i]*I2[i]*COEF[i] - Q1[i]*Q2[i]*COEF[i]; I1[i] = I2[i] = Q1[i] = Q2[i] = 0.0; } signalquality(); } } fldigi-3.21.80/src/psk/viewpsk.cxx0000664000175000017500000002530212313064025013644 00000000000000// ---------------------------------------------------------------------------- // viewpsk.cxx // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- // viewpsk is a multi channel psk decoder which allows the parallel processing // of the complete audio spectrum from 200 to 3500 Hz in equal 100 Hz // channels. Each channel is separately decoded and the decoded characters // passed to the user interface routines for presentation. The number of // channels can be up to and including 30. #include #include #include #include "viewpsk.h" #include "pskeval.h" #include "pskcoeff.h" #include "pskvaricode.h" #include "misc.h" #include "configuration.h" #include "Viewer.h" #include "qrunner.h" #include "status.h" extern waterfall *wf; //===================================================================== // Change the following for DCD low pass filter adjustment #define SQLCOEFF 0.01 //#define SQLDECAY 50 #define SQLDECAY 20 //===================================================================== viewpsk::viewpsk(pskeval* eval, trx_mode pskmode) { for (int i = 0; i < MAXCHANNELS; i++) { channel[i].fir1 = (C_FIR_filter *)0; channel[i].fir2 = (C_FIR_filter *)0; } evalpsk = eval; viewmode = MODE_PREV; restart(pskmode); } viewpsk::~viewpsk() { for (int i = 0; i < MAXCHANNELS; i++) { if (channel[i].fir1) delete channel[i].fir1; if (channel[i].fir2) delete channel[i].fir2; } } void viewpsk::init() { nchannels = progdefaults.VIEWERchannels; lowfreq = progdefaults.LowFreqCutoff; for (int i = 0; i < MAXCHANNELS; i++) { channel[i].phaseacc = 0; channel[i].prevsymbol = cmplx (1.0, 0.0); channel[i].quality = cmplx (0.0, 0.0); channel[i].shreg = 0; channel[i].dcdshreg = 0; channel[i].dcd = false; channel[i].bitclk = 0; channel[i].freqerr = 0.0; channel[i].timeout = 0; channel[i].frequency = NULLFREQ; channel[i].reset = false; channel[i].acquire = 0; for (int j = 0; j < 16; j++) channel[i].syncbuf[j] = 0.0; } for (int i = 0; i < nchannels; i++) REQ(&viewclearchannel, i); evalpsk->clear(); reset_all = false; } void viewpsk::restart(trx_mode pskmode) { if (viewmode == pskmode) return; viewmode = pskmode; double fir1c[64]; double fir2c[64]; switch (viewmode) { case MODE_PSK31: symbollen = 256; dcdbits = 32; break; case MODE_PSK63: case MODE_PSK63F: symbollen = 128; dcdbits = 64; break; case MODE_PSK125: case MODE_PSK125R: symbollen = 64; dcdbits = 128; break; case MODE_PSK250: case MODE_PSK250R: symbollen = 32; dcdbits = 256; break; case MODE_PSK500: case MODE_PSK500R: symbollen = 16; dcdbits = 512; break; default: // punt! mode not one of the above. symbollen = 512; dcdbits = 32; break; } wsincfilt(fir1c, 1.0 / symbollen, true); // creates fir1c matched sin(x)/x filter w blackman wsincfilt(fir2c, 1.0 / 16.0, true); // creates fir2c matched sin(x)/x filter w blackman for (int i = 0; i < MAXCHANNELS; i++) { if (channel[i].fir1) delete channel[i].fir1; channel[i].fir1 = new C_FIR_filter(); channel[i].fir1->init(FIRLEN, symbollen / 16, fir1c, fir1c); if (channel[i].fir2) delete channel[i].fir2; channel[i].fir2 = new C_FIR_filter(); channel[i].fir2->init(FIRLEN, 1, fir2c, fir2c); } bandwidth = VPSKSAMPLERATE / symbollen; init(); } //============================================================================= //========================= viewpsk receive routines ========================== //============================================================================= void viewpsk::rx_bit(int ch, int bit) { int c; channel[ch].shreg = (channel[ch].shreg << 1) | !!bit; if ((channel[ch].shreg & 3) == 0) { c = psk_varicode_decode(channel[ch].shreg >> 2); channel[ch].shreg = 0; if (c == -1) return; if (c == '\n' || c == '\r') c = ' '; if (iscntrl(c & 0xFF)) return; REQ(&viewaddchr, ch, (int)channel[ch].frequency, c, viewmode); } } void viewpsk::afc(int ch) { if (channel[ch].dcd == true || channel[ch].acquire) { double error; double lower_bound = (lowfreq + ch * 100) - bandwidth; if (lower_bound < bandwidth) lower_bound = bandwidth; double upper_bound = lowfreq + (ch+1)*100 + bandwidth; error = (channel[ch].phase - channel[ch].bits * M_PI / 2); if (error < M_PI / 2.0) error += 2 * M_PI; if (error > M_PI / 2.0) error -= 2 * M_PI; error *= (VPSKSAMPLERATE / (symbollen * 2 * M_PI))/16.0; channel[ch].frequency -= error; channel[ch].frequency = CLAMP(channel[ch].frequency, lower_bound, upper_bound); } if (channel[ch].acquire) channel[ch].acquire--; } void viewpsk::clearch(int n) { channel[n].reset = true; evalpsk->clear(); } void viewpsk::clear() { for (int i = 0; i < nchannels; i++) channel[i].reset = true; evalpsk->clear(); } inline void viewpsk::timeout_check() { for (int ch = 0; ch < nchannels; ch++) { if (channel[ch].timeout) channel[ch].timeout--; if (channel[ch].frequency == NULLFREQ) continue; if (channel[ch].reset || (!channel[ch].timeout && !channel[ch].acquire) || (ch && (fabs(channel[ch-1].frequency - channel[ch].frequency) < bandwidth))) { channel[ch].reset = false; channel[ch].dcd = 0; channel[ch].frequency = NULLFREQ; channel[ch].acquire = 0; REQ(&viewclearchannel, ch); REQ(&viewaddchr, ch, NULLFREQ, 0, viewmode); } } } void viewpsk::findsignals() { if (!evalpsk) return; double level = progStatus.VIEWER_psksquelch; int nomfreq = 0; int lfreq = 0; int hfreq = 0; int ftest; int f1, f2; timeout_check(); for (int i = 0; i < nchannels; i++) { nomfreq = lowfreq + 100 * i; lfreq = nomfreq - 20; hfreq = nomfreq + 120; // suppress detection outside of this range if (!channel[i].dcd && !channel[i].timeout) { if (!channel[i].acquire) { channel[i].frequency = NULLFREQ; f1 = nomfreq - 0.5 * bandwidth; if (f1 < 2 * bandwidth) f1 = 2 * bandwidth; f2 = f1 + 100; ftest = (f1 + f2) / 2; } else { if (channel[i].frequency < lfreq || channel[i].frequency >= hfreq) channel[i].frequency = nomfreq + 50; ftest = channel[i].frequency; f1 = ftest - bandwidth; f2 = ftest + bandwidth; if (f1 < 2 * bandwidth) { f1 = 2 * bandwidth; f2 = f1 + bandwidth; } } if (evalpsk->peak(ftest, f1, f2, level)) { if (ftest < lfreq || ftest >= hfreq) goto nexti; f1 = ftest - bandwidth; f2 = ftest + bandwidth; if (evalpsk->peak(ftest, f1, f2, level)) { if (ftest < lfreq || ftest >= hfreq) goto nexti; if (i && (channel[i-1].dcd || channel[i-1].acquire) && fabs(channel[i-1].frequency - ftest) < bandwidth) goto nexti; if ((i < nchannels - 1) && (channel[i+1].dcd || channel[i+1].acquire) && fabs(channel[i+1].frequency - ftest) < bandwidth) goto nexti; channel[i].frequency = ftest; channel[i].freqerr = 0.0; channel[i].metric = 0.0; if (!channel[i].acquire) channel[i].acquire = 2 * 8000 / 512; } } } nexti: ; } } void viewpsk::rx_symbol(int ch, cmplx symbol) { int n; channel[ch].phase = arg ( conj(channel[ch].prevsymbol) * symbol ); channel[ch].prevsymbol = symbol; if (channel[ch].phase < 0) channel[ch].phase += 2 * M_PI; channel[ch].bits = (((int) (channel[ch].phase / M_PI + 0.5)) & 1) << 1; n = 2; // psk channel[ch].dcdshreg = (channel[ch].dcdshreg << 2) | channel[ch].bits; switch (channel[ch].dcdshreg) { case 0xAAAAAAAA: /* DCD on by preamble */ if (!channel[ch].dcd) REQ(&viewaddchr, ch, (int)channel[ch].frequency, 0, viewmode); channel[ch].dcd = true; channel[ch].quality = cmplx (1.0, 0.0); channel[ch].metric = 100; channel[ch].timeout = progdefaults.VIEWERtimeout * VPSKSAMPLERATE / WFBLOCKSIZE; channel[ch].acquire = 0; break; case 0: /* DCD off by postamble */ channel[ch].dcd = false; channel[ch].quality = cmplx (0.0, 0.0); channel[ch].metric = 0; channel[ch].acquire = 0; // channel[ch].frequency = NULLFREQ; break; default: channel[ch].quality = cmplx ( decayavg(channel[ch].quality.real(), cos(n*channel[ch].phase), SQLDECAY), decayavg(channel[ch].quality.imag(), sin(n*channel[ch].phase), SQLDECAY)); // channel[ch].quality.re = // decayavg(channel[ch].quality.re, cos(n*channel[ch].phase), SQLDECAY); // channel[ch].quality.im = // decayavg(channel[ch].quality.im, sin(n*channel[ch].phase), SQLDECAY); channel[ch].metric = norm(channel[ch].quality); if (channel[ch].metric > (progStatus.VIEWER_psksquelch + 6.0)/26.0) { channel[ch].dcd = true; } else { channel[ch].dcd = false; } } if (channel[ch].dcd == true) { channel[ch].timeout = progdefaults.VIEWERtimeout * VPSKSAMPLERATE / WFBLOCKSIZE; rx_bit(ch, !channel[ch].bits); channel[ch].acquire = 0; } } int viewpsk::rx_process(const double *buf, int len) { double sum; double ampsum; int idx; cmplx z, z2; if (nchannels != progdefaults.VIEWERchannels || lowfreq != progdefaults.LowFreqCutoff) init(); // process all channels for (int ch = 0; ch < nchannels; ch++) { if (channel[ch].frequency == NULLFREQ) continue; for (int ptr = 0; ptr < len; ptr++) { // Mix with the internal NCO for each channel z = cmplx ( buf[ptr] * cos(channel[ch].phaseacc), buf[ptr] * sin(channel[ch].phaseacc) ); channel[ch].phaseacc += 2.0 * M_PI * channel[ch].frequency / VPSKSAMPLERATE; // filter & decimate if (channel[ch].fir1->run( z, z )) { channel[ch].fir2->run( z, z2 ); idx = (int) channel[ch].bitclk; sum = 0.0; ampsum = 0.0; channel[ch].syncbuf[idx] = 0.8 * channel[ch].syncbuf[idx] + 0.2 * abs(z2); for (int i = 0; i < 8; i++) { sum += (channel[ch].syncbuf[i] - channel[ch].syncbuf[i+8]); ampsum += (channel[ch].syncbuf[i] + channel[ch].syncbuf[i+8]); } sum = (ampsum == 0 ? 0 : sum / ampsum); channel[ch].bitclk -= sum / 5.0; channel[ch].bitclk += 1; if (channel[ch].bitclk < 0) channel[ch].bitclk += 16.0; if (channel[ch].bitclk >= 16.0) { channel[ch].bitclk -= 16.0; rx_symbol(ch, z2); afc(ch); } } } } findsignals(); return 0; } int viewpsk::get_freq(int n) { if (channel[n].dcd) return (int)channel[n].frequency; return NULLFREQ; } fldigi-3.21.80/src/soundcard/0000775000175000017500000000000012313333726012702 500000000000000fldigi-3.21.80/src/soundcard/mixer.cxx0000664000175000017500000002030312313064025014461 00000000000000// ---------------------------------------------------------------------------- // // mixer.cxx // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // Copyright (C) 2007-2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #if USE_OSS # include # if defined(__OpenBSD__) # include # else # include # endif #endif #include #include #include #include "mixer.h" #include "configuration.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_AUDIO); #if USE_OSS MixerOSS::MixerOSS() { strcpy (szDevice, "/dev/mixerX"); mixer = "/dev/mixer"; mixer_fd = -1; findNumMixers(); } MixerOSS::~MixerOSS() { closeMixer(); } //======================================= // mixer methods //======================================= void MixerOSS::openMixer(const char *dev) { int err; if (mixer_fd != -1) closeMixer(); mixer = dev; try { int oflags = O_RDWR; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif mixer_fd = open(mixer.c_str(), oflags); if (mixer_fd == -1) throw MixerException(errno); if ((err = initMask()) != 0) throw MixerException(err); } catch (...) { throw; } initValues(); } void MixerOSS::closeMixer() { if (mixer_fd == -1) return; restoreValues(); close(mixer_fd); mixer_fd = -1; } void MixerOSS::initValues() { if (mixer_fd == -1) return; int devnbr; inpsrc0 = GetCurrentInputSource(); devnbr = InputSourceNbr("Line"); SetCurrentInputSource(devnbr); linelevel0 = InputVolume(); devnbr = InputSourceNbr("Mic"); SetCurrentInputSource(devnbr); miclevel0 = InputVolume(); pcmlevel0 = PCMVolume(); vollevel0 = OutVolume(); LOG_DEBUG("Sound mixer initial state:\n" "Dev mask: %02x\n" "Rec mask: %02x\n" "Rec src: %02x\n" "Current input source #: %s\n" "Line level: %f\n" "Mic level: %f\n" "Pcm level: %f\n" "Vol level: %f\n", devmask, recmask, recsrc, GetInputSourceName(inpsrc0), linelevel0, miclevel0, pcmlevel0, vollevel0); } void MixerOSS::restoreValues() { if (mixer_fd == -1) return; int devnbr; devnbr = InputSourceNbr("Line"); SetCurrentInputSource(devnbr); InputVolume(linelevel0); devnbr = InputSourceNbr("Mic"); SetCurrentInputSource(devnbr); InputVolume(miclevel0); PCMVolume(pcmlevel0); OutVolume(vollevel0); // SetCurrentInputSource(inpsrc0); ioctl(mixer_fd, MIXER_WRITE(SOUND_MIXER_READ_RECSRC), &recsrc0); } void MixerOSS::findNumMixers() { int fd; NumMixers = 0; for (int i = 0; i< 11; i++) { if (i == 0) szDevice[10] = 0; else szDevice[10] = '0'+(i-1); int oflags = O_RDWR; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif fd = open(szDevice, oflags); if (fd >= 0) { Devices[NumMixers] = i; NumMixers++; close(fd); } } } const char * MixerOSS::MixerName( int index ) { if (NumMixers <= 0) findNumMixers(); if (index < 0 || index >= NumMixers) return NULL; if (Devices[index] == 0) szDevice[10] = 0; else szDevice[10] = '0' + (Devices[index]-1); return szDevice; } void MixerOSS::setXmtLevel(double v) { if (mixer_fd == -1) return; OutVolume(v); } void MixerOSS::setRcvGain(double v) { if (mixer_fd == -1) return; InputVolume(v); } int MixerOSS::initMask() { if (mixer_fd == -1) return -1; if((ioctl(mixer_fd, MIXER_READ(SOUND_MIXER_READ_DEVMASK), &devmask)) == -1) return errno; if((ioctl(mixer_fd, MIXER_READ(SOUND_MIXER_READ_RECMASK), &recmask)) == -1) return errno; if ((ioctl(mixer_fd, MIXER_READ(SOUND_MIXER_READ_RECSRC), &recsrc)) == -1) return errno; devmask0 = devmask; recmask0 = recmask; recsrc0 = recsrc; outmask = devmask ^ recmask; num_out = 0; num_rec = 0; for( int i = 0; i < SOUND_MIXER_NRDEVICES; i++) { if (recmask & (1 << i)) { recs[num_rec++] = i; } else if (devmask & (1<>8) & 0xFF)/200.0); else return (vol & 0xFF)/100.0; } /* Master (output) volume */ double MixerOSS::OutVolume() { if (mixer_fd == -1) return 0.0; return ChannelVolume(SOUND_MIXER_VOLUME); } void MixerOSS::OutVolume(double volume) { if (mixer_fd == -1) return; int vol = (int)((volume * 100.0) + 0.5); vol = (vol | (vol<<8)); ioctl(mixer_fd, MIXER_WRITE(SOUND_MIXER_VOLUME), &vol); } double MixerOSS::PCMVolume() { if (mixer_fd == -1) return 0.0; return ChannelVolume(SOUND_MIXER_PCM); } void MixerOSS::PCMVolume(double volume ) { if (mixer_fd == -1) return; int vol = (int)((volume * 100.0) + 0.5); vol = (vol | (vol<<8)); ioctl(mixer_fd, MIXER_WRITE(SOUND_MIXER_PCM), &vol); } int MixerOSS::NumOutputVolumes() { if (mixer_fd == -1) return 0; return num_out; } const char *MixerOSS::OutputVolumeName( int i ) { if (mixer_fd == -1) return NULL; const char *labels[] = SOUND_DEVICE_LABELS; return labels[outs[i]]; } double MixerOSS::OutputVolume( int i ) { if (mixer_fd == -1) return 0.0; return ChannelVolume(outs[i]); } void MixerOSS::OutputVolume( int i, double volume ) { if (mixer_fd == -1) return; int vol = (int)((volume * 100.0) + 0.5); vol = (vol | (vol<<8)); ioctl(mixer_fd, MIXER_WRITE(outs[i]), &vol); } int MixerOSS::GetNumInputSources() { if (mixer_fd == -1) return 0; return num_rec; } const char *MixerOSS::GetInputSourceName( int i) { if (mixer_fd == -1) return NULL; const char *labels[] = SOUND_DEVICE_LABELS; return labels[recs[i]]; } int MixerOSS::InputSourceNbr(const char *source) { if (mixer_fd == -1) return -1; const char *labels[] = SOUND_DEVICE_LABELS; char lbl[80]; int len; for (int i = 0; i < num_rec; i++) { strcpy(lbl, labels[recs[i]]); len = strlen(lbl); while (len > 0 && lbl[len-1] == ' ') { lbl[len-1] = 0; len--; } if (!strncasecmp(lbl, source, strlen(lbl) ) ) return i; } return -1; } int MixerOSS::GetCurrentInputSource() { if (mixer_fd == -1) return -1; for(int i = 0; i < num_rec; i++) if (recsrc & (1 << (recs[i]))) return i; return -1; /* none */ } void MixerOSS::SetCurrentInputSource( int i ) { if (mixer_fd == -1) return; int newrecsrcmask = (1 << (recs[i])); ioctl(mixer_fd, MIXER_WRITE(SOUND_MIXER_READ_RECSRC), &newrecsrcmask); } /* Input volume */ double MixerOSS::InputVolume() { if (mixer_fd == -1) return 0.0; // int i = GetCurrentInputSource(); // if (i < 0) // return 0.0; return ChannelVolume(SOUND_MIXER_IGAIN); } void MixerOSS::InputVolume( double volume ) { if (mixer_fd == -1) return; int vol; vol = (int)((volume * 100.0) + 0.5); vol = (vol | (vol<<8)); ioctl(mixer_fd, MIXER_WRITE(SOUND_MIXER_IGAIN), &vol); } /* double MixerOSS::GetPlaythrough() { int i = GetCurrentInputSource(); if (i < 0) return 0.0; return ChannelVolume(recs[i]); } void MixerOSS::SetPlaythrough( double volume ) { if (mixer_fd == -1) return; int vol; int i = GetCurrentInputSource(); if (i < 0) return; vol = (int)((volume * 100.0) + 0.5); vol = (vol | (vol<<8)); ioctl(mixer_fd, MIXER_WRITE(recs[i]), &vol); } void MixerOSS::SetMuteInput(bool b) { return; if (b == 1) SetPlaythrough(0.0); else SetPlaythrough(playthrough0); } */ #endif // USE_OSS fldigi-3.21.80/src/soundcard/sound.cxx0000664000175000017500000016362312313064025014502 00000000000000// ---------------------------------------------------------------------------- // // sound.cxx // // Copyright (C) 2006-2013 // Dave Freese, W1HKJ // // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if USE_OSS # include # if defined(__OpenBSD__) # include # else # include # endif #endif #include #if HAVE_DLOPEN # include #endif #include "gettext.h" #include "sound.h" #include "configuration.h" #include "status.h" #include "fileselect.h" #include "trx.h" #include "fl_digi.h" #include "threads.h" #include "timeops.h" #include "ringbuffer.h" #include "debug.h" #include "qrunner.h" #include "icons.h" #include "macros.h" #define SND_BUF_LEN 65536 #define SND_RW_LEN (8 * SND_BUF_LEN) // #define SRC_BUF_LEN (8*SND_BUF_LEN) // We never write duplicate/QSK/PTT tone/PseudoFSK data to the sound files #define SNDFILE_CHANNELS 1 int sndfile_samplerate[7] = {8000, 11025, 16000, 22050, 24000, 44100, 48000}; using namespace std; LOG_FILE_SOURCE(debug::LOG_AUDIO); SoundBase::SoundBase() : sample_frequency(0), txppm(progdefaults.TX_corr), rxppm(progdefaults.RX_corr), tx_src_state(0), rx_src_state(0), wrt_buffer(new double[SND_BUF_LEN]), #if USE_SNDFILE ofCapture(0), ifPlayback(0), ofGenerate(0), #endif capture(false), playback(false), generate(false) { memset(wrt_buffer, 0, SND_BUF_LEN * sizeof(*wrt_buffer)); #if USE_SNDFILE int err; writ_src_data = new SRC_DATA; play_src_data = new SRC_DATA; writ_src_state = src_new(progdefaults.sample_converter, 1, &err); if (writ_src_state == 0) throw SndException(src_strerror(err)); play_src_state = src_new(progdefaults.sample_converter, 1, &err); if (play_src_state == 0) throw SndException(src_strerror(err)); if (play_src_state == 0) throw SndException(src_strerror(err)); src_out_buffer = new float [SND_RW_LEN]; if (!src_out_buffer) throw SndException(src_strerror(err)); src_inp_buffer = new float [SND_RW_LEN]; if (!src_inp_buffer) throw SndException(src_strerror(err)); modem_wr_sr = modem_play_sr = 0; inp_pointer = src_out_buffer; #endif } SoundBase::~SoundBase() { delete [] wrt_buffer; #if USE_SNDFILE if (ofGenerate) sf_close(ofGenerate); if (ofCapture) sf_close(ofCapture); if (ifPlayback) sf_close(ifPlayback); delete writ_src_data; delete play_src_data; delete [] src_out_buffer; delete [] src_inp_buffer; #endif } #if USE_SNDFILE void SoundBase::get_file_params(const char* def_fname, const char** fname, int* format) { std::string filters = _("Waveform Audio Format\t*.wav\n" "AU\t*.{au,snd}\n"); int nfilt = 2; if (format_supported(SF_FORMAT_FLAC | SF_FORMAT_PCM_16)) { filters += _("Free Lossless Audio Codec\t*.flac"); nfilt++; } int fsel; if (strstr(def_fname, "playback")) *fname = FSEL::select(_("Audio file"), filters.c_str(), def_fname, &fsel); else *fname = FSEL::saveas(_("Audio file"), filters.c_str(), def_fname, &fsel); if (!*fname) return; if (fsel >= nfilt) // "Default" save-as type on OS X fsel = 0; switch (fsel) { case 0: *format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; break; case 1: *format = SF_FORMAT_AU | SF_FORMAT_FLOAT | SF_ENDIAN_CPU; break; case 2: *format = SF_FORMAT_FLAC | SF_FORMAT_PCM_16; break; } } int SoundBase::Capture(bool val) { if (!val) { if (ofCapture) { int err; if ((err = sf_close(ofCapture)) != 0) LOG_ERROR("sf_close error: %s", sf_error_number(err)); ofCapture = 0; } capture = false; return 1; } const char* fname; int format; get_file_params("capture.wav", &fname, &format); if (!fname) return 0; // frames (ignored), freq, channels, format, sections (ignored), seekable (ignored) // SF_INFO info = { 0, sample_frequency, SNDFILE_CHANNELS, format, 0, 0 }; SF_INFO info = { 0, sndfile_samplerate[progdefaults.wavSampleRate], SNDFILE_CHANNELS, format, 0, 0 }; if ((ofCapture = sf_open(fname, SFM_WRITE, &info)) == NULL) { LOG_ERROR("Could not write %s:%s", fname, sf_strerror(NULL) ); return 0; } if (sf_command(ofCapture, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) != SF_TRUE) LOG_ERROR("ofCapture update header command failed: %s", sf_strerror(ofCapture)); tag_file(ofCapture, "Captured audio"); // memset(src_inp_buffer, 0, 512 * sizeof(float)); // write_file(ofCapture, src_inp_buffer, 512); capture = true; return 1; } int SoundBase::Generate(bool val) { if (!val) { if (ofGenerate) { int err; if ((err = sf_close(ofGenerate)) != 0) LOG_ERROR("sf_close error: %s", sf_error_number(err)); ofGenerate = 0; } generate = false; return 1; } const char* fname; int format; get_file_params("generate.wav", &fname, &format); if (!fname) return 0; SF_INFO info = { 0, sndfile_samplerate[progdefaults.wavSampleRate], SNDFILE_CHANNELS, format, 0, 0 }; if ((ofGenerate = sf_open(fname, SFM_WRITE, &info)) == NULL) { LOG_ERROR("Could not write %s", fname); return 0; } if (sf_command(ofGenerate, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) != SF_TRUE) LOG_ERROR("ofGenerate update header command failed: %s", sf_strerror(ofGenerate)); tag_file(ofGenerate, "Generated audio"); // memset(src_inp_buffer, 0, 512 * sizeof(float)); // write_file(ofGenerate, src_inp_buffer, 512); generate = true; return 1; } int SoundBase::Playback(bool val) { if (!val) { if (ifPlayback) { int err; if ((err = sf_close(ifPlayback)) != 0) LOG_ERROR("sf_close error: %s", sf_error_number(err)); ifPlayback = 0; } playback = false; return 1; } const char* fname; int format; get_file_params("playback.wav", &fname, &format); if (!fname) return -1; play_info.frames = 0; play_info.samplerate = 0; play_info.channels = 0; play_info.format = 0; play_info.sections = 0; play_info.seekable = 0; if ((ifPlayback = sf_open(fname, SFM_READ, &play_info)) == NULL) { LOG_ERROR("Could not read %s:%s", fname, sf_strerror(NULL) ); return -2; } LOG_INFO("wav file stats:\n\ frames : %d\n\ samplerate : %d\n\ channels : %d\n\ format : %d\n\ sections : %d\n\ seekable : %d", static_cast(play_info.frames), play_info.samplerate, play_info.channels, play_info.format, play_info.sections, play_info.seekable); // this restriction needs to be removed! if (play_info.channels != 1) { sf_close(ifPlayback); return -3; } modem_play_sr = sample_frequency; play_src_data->src_ratio = 1.0 * modem_play_sr / play_info.samplerate; src_set_ratio(play_src_state, play_src_data->src_ratio); LOG_INFO("src ratio %f", play_src_data->src_ratio); progdefaults.loop_playback = fl_choice2(_("Playback continuous loop?"), _("No"), _("Yes"), NULL); playback = true; new_playback = true; return 0; } // --------------------------------------------------------------------- // read_file // can be simplified from the equivalent read audio stream // source sr is arbitrary, requested is either 8000 or 11025 depending // on the modem in use // read from file and resample until a "count" number of converted samples // is available, or until at the end of the input file // --------------------------------------------------------------------- sf_count_t SoundBase::read_file(SNDFILE* file, float* buf, size_t count) { sf_count_t r = 0, rd_count = 0; int err = 0; if (new_playback || modem_play_sr != sample_frequency) { modem_play_sr = sample_frequency; play_src_data->src_ratio = 1.0 * modem_play_sr / play_info.samplerate; src_set_ratio(play_src_state, play_src_data->src_ratio); LOG_INFO("src ratio %f", play_src_data->src_ratio); new_playback = true; } while ( static_cast(inp_pointer - src_out_buffer) < count) { if (new_playback) { memset(src_inp_buffer, 0, 1024 * sizeof(float)); new_playback = false; rd_count = 1024; } else rd_count = sf_readf_float(file, src_inp_buffer, 1024); if (!rd_count) break; play_src_data->data_in = src_inp_buffer; play_src_data->input_frames = rd_count; play_src_data->data_out = inp_pointer; play_src_data->output_frames = SND_RW_LEN - (inp_pointer - src_out_buffer); play_src_data->end_of_input = 0; if ((err = src_process(play_src_state, play_src_data)) != 0) throw SndException(src_strerror(err)); inp_pointer += play_src_data->output_frames_gen; //LOG_INFO("read: %d, conversion %d", (int)rd_count, (int)(play_src_data->output_frames_gen)); } //LOG_INFO("available: %d", (int)(inp_pointer - src_out_buffer)); if ( static_cast(inp_pointer - src_out_buffer) >= count) { memcpy(buf, src_out_buffer, count * sizeof(float)); memmove(src_out_buffer, src_out_buffer + count, (SND_RW_LEN - count) * sizeof(float)); inp_pointer -= count; r = count; } if (r == 0) { src_reset (play_src_state); inp_pointer = src_out_buffer; if (!progdefaults.loop_playback) { Playback(0); bHighSpeed = false; REQ(reset_mnuPlayback); } else { memset(buf, count, sizeof(*buf)); sf_seek(file, 0, SEEK_SET); } } return r; } // --------------------------------------------------------------------- // write_file // All sound buffer data is resampled to a specified sample rate // progdefaults.wavSampleRate // resultant data (left channel only) is written to a wav file //---------------------------------------------------------------------- void SoundBase::write_file(SNDFILE* file, float* buf, size_t count) { int err; if (modem_wr_sr != sample_frequency) { modem_wr_sr = sample_frequency; writ_src_data->src_ratio = 1.0 * sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr; src_set_ratio(writ_src_state, writ_src_data->src_ratio); } writ_src_data->data_in = buf; writ_src_data->input_frames = count; writ_src_data->data_out = src_out_buffer; writ_src_data->output_frames = SND_RW_LEN; writ_src_data->end_of_input = 0; if ((err = src_process(writ_src_state, writ_src_data)) != 0) { throw SndException(src_strerror(err)); } size_t output_size = writ_src_data->output_frames_gen; if (output_size) sf_writef_float(file, writ_src_data->data_out, output_size); return; } void SoundBase::write_file(SNDFILE* file, double* buf, size_t count) { float *outbuf = new float[count]; for (size_t i = 0; i < count; i++) outbuf[i] = buf[i]; write_file(file, outbuf, count); delete [] outbuf; return; } bool SoundBase::format_supported(int format) { SF_INFO info = { 0, sndfile_samplerate[progdefaults.wavSampleRate], SNDFILE_CHANNELS, format, 0, 0 }; FILE* f; if ((f = tmpfile()) == NULL) return false; SNDFILE* sndf = sf_open_fd(fileno(f), SFM_WRITE, &info, SF_FALSE); fclose(f); if (sndf) sf_close(sndf); return sndf; } void SoundBase::tag_file(SNDFILE *sndfile, const char *title) { int err; if ((err = sf_set_string(sndfile, SF_STR_TITLE, title)) != 0) { LOG_INFO("sf_set_string STR_TITLE: %s", sf_error_number(err)); return; } sf_set_string(sndfile, SF_STR_COPYRIGHT, progdefaults.myName.c_str()); sf_set_string(sndfile, SF_STR_SOFTWARE, PACKAGE_NAME "-" PACKAGE_VERSION); sf_set_string(sndfile, SF_STR_ARTIST, progdefaults.myCall.c_str()); char s[64]; snprintf(s, sizeof(s), "%s freq=%s", active_modem->get_mode_name(), inpFreq->value()); sf_set_string(sndfile, SF_STR_COMMENT, s); time_t t = time(0); struct tm zt; (void)gmtime_r(&t, &zt); if (strftime(s, sizeof(s), "%Y-%m-%dT%H:%M:%Sz", &zt) > 0) sf_set_string(sndfile, SF_STR_DATE, s); } #endif // USE_SNDFILE #if USE_OSS #define MAXSC 32767.0f #define maxsc 32000.0 SoundOSS::SoundOSS(const char *dev ) { device = dev; cbuff = 0; try { Open(O_RDONLY); getVersion(); getCapabilities(); getFormats(); Close(); } catch (const SndException& e) { LOG_ERROR("device %s error: %s", device.c_str(), e.what()); } snd_buffer = new float [2 * SND_BUF_LEN]; src_buffer = new float [2 * SND_BUF_LEN]; cbuff = new unsigned char [4 * SND_BUF_LEN]; memset(snd_buffer, 0, 2 * SND_BUF_LEN * sizeof(*snd_buffer)); memset(src_buffer, 0, 2 * SND_BUF_LEN * sizeof(*src_buffer)); memset(cbuff, 0, 4 * SND_BUF_LEN * sizeof(*cbuff)); tx_src_data = new SRC_DATA; rx_src_data = new SRC_DATA; int err; rx_src_state = src_new(progdefaults.sample_converter, 2, &err); if (rx_src_state == 0) throw SndException(src_strerror(err)); tx_src_state = src_new(progdefaults.sample_converter, 2, &err); if (tx_src_state == 0) throw SndException(src_strerror(err)); rx_src_data->src_ratio = 1.0/(1.0 + rxppm/1e6); src_set_ratio ( rx_src_state, 1.0/(1.0 + rxppm/1e6)); tx_src_data->src_ratio = 1.0 + txppm/1e6; src_set_ratio ( tx_src_state, 1.0 + txppm/1e6); } SoundOSS::~SoundOSS() { Close(); delete tx_src_data; delete rx_src_data; if (rx_src_state) src_delete(rx_src_state); if (tx_src_state) src_delete(tx_src_state); delete [] snd_buffer; delete [] src_buffer; delete [] cbuff; } void SoundOSS::setfragsize() { int sndparam; // Try to get ~100ms worth of samples per fragment sndparam = (int)log2(sample_frequency * 0.1); // double since we are using 16 bit samples sndparam += 1; // Unlimited amount of buffers for RX, four for TX if (mode == O_RDONLY) sndparam |= 0x7FFF0000; else sndparam |= 0x00040000; if (ioctl(device_fd, SNDCTL_DSP_SETFRAGMENT, &sndparam) < 0) throw SndException(errno); } int SoundOSS::Open(int md, int freq) { Close(); mode = md; try { int oflags = md; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif device_fd = open(device.c_str(), oflags, 0); if (device_fd == -1) throw SndException(errno); Format(AFMT_S16_LE); // default: 16 bit little endian // Channels(1); // 1 channel Channels(2); // 2 channels Frequency(freq); setfragsize(); } catch (...) { throw; } return 0; } void SoundOSS::Close(unsigned dir) { if (device_fd == -1) return; close(device_fd); device_fd = -1; } void SoundOSS::getVersion() { version = 0; #ifndef __FreeBSD__ if (ioctl(device_fd, OSS_GETVERSION, &version) == -1) { version = -1; throw SndException("OSS Version"); } #endif } void SoundOSS::getCapabilities() { capability_mask = 0; if (ioctl(device_fd, SNDCTL_DSP_GETCAPS, &capability_mask) == -1) { capability_mask = 0; throw SndException("OSS capabilities"); } } void SoundOSS::getFormats() { format_mask = 0; if (ioctl(device_fd, SNDCTL_DSP_GETFMTS, &format_mask) == -1) { format_mask = 0; throw SndException("OSS formats"); } } void SoundOSS::Format(int format) { play_format = format; if (ioctl(device_fd, SNDCTL_DSP_SETFMT, &play_format) == -1) { device_fd = -1; formatok = false; throw SndException("Unsupported snd card format"); } formatok = true; } void SoundOSS::Channels(int nuchannels) { channels = nuchannels; if (ioctl(device_fd, SNDCTL_DSP_CHANNELS, &channels) == -1) { device_fd = -1; throw "Snd card channel request failed"; } } void SoundOSS::Frequency(int frequency) { sample_frequency = frequency; if (ioctl(device_fd, SNDCTL_DSP_SPEED, &sample_frequency) == -1) { device_fd = -1; throw SndException("Cannot set frequency"); } } int SoundOSS::BufferSize( int seconds ) { int bytes_per_channel = 0; switch (play_format) { case AFMT_MU_LAW: case AFMT_A_LAW: case AFMT_IMA_ADPCM: bytes_per_channel = 0; /* format not supported by this program */ break; case AFMT_S16_BE: case AFMT_U16_LE: case AFMT_U16_BE: case AFMT_MPEG: case AFMT_S16_LE: bytes_per_channel = 2; break; case AFMT_U8: case AFMT_S8: bytes_per_channel = 1; break; } return seconds * sample_frequency * bytes_per_channel * channels; } bool SoundOSS::wait_till_finished() { if (ioctl(device_fd, SNDCTL_DSP_POST, (void*)1) == -1 ) return false; if (ioctl(device_fd, SNDCTL_DSP_SYNC, (void*)0) == -1) return false; /* format (or ioctl()) not supported by device */ return true; /* all sound has been played */ } bool SoundOSS::reset_device() { if (ioctl(device_fd, SNDCTL_DSP_RESET, 0) == -1) { device_fd = -1; return false; /* format (or ioctl()) not supported by device */ } return 1; /* sounddevice has been reset */ } size_t SoundOSS::Read(float *buffer, size_t buffersize) { short int *ibuff = (short int *)cbuff; int numread; numread = read(device_fd, cbuff, buffersize * 4); if (numread == -1) throw SndException(errno); for (size_t i = 0; i < buffersize * 2; i++) src_buffer[i] = ibuff[i] / MAXSC; for (size_t i = 0; i < buffersize; i++) buffer[i] = src_buffer[2*i]; #if USE_SNDFILE if (capture) write_file(ofCapture, buffer, buffersize); if (playback) { read_file(ifPlayback, buffer, buffersize); if (progdefaults.EnableMixer) for (size_t i = 0; i < buffersize; i++) buffer[i] *= progStatus.RcvMixer; return buffersize; } #endif if (rxppm != progdefaults.RX_corr) { rxppm = progdefaults.RX_corr; rx_src_data->src_ratio = 1.0/(1.0 + rxppm/1e6); src_set_ratio ( rx_src_state, 1.0/(1.0 + rxppm/1e6)); } if (rxppm == 0) return buffersize; // process using samplerate library rx_src_data->data_in = src_buffer; rx_src_data->input_frames = buffersize; rx_src_data->data_out = snd_buffer; rx_src_data->output_frames = SND_BUF_LEN; rx_src_data->end_of_input = 0; if ((numread = src_process(rx_src_state, rx_src_data)) != 0) throw SndException(src_strerror(numread)); numread = rx_src_data->output_frames_gen; for (int i = 0; i < numread; i++) buffer[i] = snd_buffer[2*i]; return numread; } size_t SoundOSS::Write(double *buf, size_t count) { int retval; short int *wbuff; unsigned char *p; #if USE_SNDFILE if (generate) write_file(ofGenerate, buf, count); #endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } if (txppm != progdefaults.TX_corr) { txppm = progdefaults.TX_corr; tx_src_data->src_ratio = 1.0 + txppm/1e6; src_set_ratio ( tx_src_state, 1.0 + txppm/1e6); } if (txppm == 0) { wbuff = new short int[2*count]; p = (unsigned char *)wbuff; for (size_t i = 0; i < count; i++) { wbuff[2*i] = wbuff[2*i+1] = (short int)(buf[i] * maxsc); } count *= sizeof(short int); retval = write(device_fd, p, 2*count); delete [] wbuff; if (retval == -1) throw SndException(errno); } else { float *inbuf; inbuf = new float[2*count]; size_t bufsize; for (size_t i = 0; i < count; i++) inbuf[2*i] = inbuf[2*i+1] = buf[i]; tx_src_data->data_in = inbuf; tx_src_data->input_frames = count; tx_src_data->data_out = src_buffer; tx_src_data->output_frames = SND_BUF_LEN; tx_src_data->end_of_input = 0; retval = src_process(tx_src_state, tx_src_data); delete [] inbuf; if (retval != 0) throw SndException(src_strerror(retval)); bufsize = tx_src_data->output_frames_gen; wbuff = new short int[2*bufsize]; p = (unsigned char *)wbuff; for (size_t i = 0; i < 2*bufsize; i++) wbuff[i] = (short int)(src_buffer[i] * maxsc); int num2write = bufsize * 2 * sizeof(short int); retval = write(device_fd, p, num2write); delete [] wbuff; if (retval != num2write) throw SndException(errno); retval = count; } return retval; } size_t SoundOSS::Write_stereo(double *bufleft, double *bufright, size_t count) { int retval; short int *wbuff; unsigned char *p; #if USE_SNDFILE if (generate) write_file(ofGenerate, bufleft, count); #endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } if (txppm != progdefaults.TX_corr) { txppm = progdefaults.TX_corr; tx_src_data->src_ratio = 1.0 + txppm/1e6; src_set_ratio ( tx_src_state, 1.0 + txppm/1e6); } if (txppm == 0) { wbuff = new short int[2*count]; p = (unsigned char *)wbuff; for (size_t i = 0; i < count; i++) { if (progdefaults.ReverseAudio) { wbuff[2*i+1] = (short int)(bufleft[i] * maxsc); wbuff[2*i] = (short int)(bufright[i] * maxsc); } else { wbuff[2*i] = (short int)(bufleft[i] * maxsc); wbuff[2*i+1] = (short int)(bufright[i] * maxsc); } } count *= sizeof(short int); retval = write(device_fd, p, 2*count); delete [] wbuff; if (retval == -1) throw SndException(errno); } else { float *inbuf; inbuf = new float[2*count]; size_t bufsize; for (size_t i = 0; i < count; i++) { if (progdefaults.ReverseAudio) { inbuf[2*i+1] = bufleft[i]; inbuf[2*i] = bufright[i]; } else { inbuf[2*i] = bufleft[i]; inbuf[2*i+1] = bufright[i]; } } tx_src_data->data_in = inbuf; tx_src_data->input_frames = count; tx_src_data->data_out = src_buffer; tx_src_data->output_frames = SND_BUF_LEN; tx_src_data->end_of_input = 0; retval = src_process(tx_src_state, tx_src_data); delete [] inbuf; if (retval != 0) throw SndException(src_strerror(retval)); bufsize = tx_src_data->output_frames_gen; wbuff = new short int[2*bufsize]; p = (unsigned char *)wbuff; for (size_t i = 0; i < 2*bufsize; i++) wbuff[i] = (short int)(src_buffer[i] * maxsc); int num2write = bufsize * 2 * sizeof(short int); retval = write(device_fd, p, num2write); delete [] wbuff; if (retval != num2write) throw SndException(errno); retval = count; } return retval; } #endif // USE_OSS #if USE_PORTAUDIO bool SoundPort::pa_init = false; std::vector SoundPort::devs; static ostringstream device_text[2]; map > supported_rates[2]; void SoundPort::initialize(void) { if (pa_init) return; init_hostapi_ext(); int err; if ((err = Pa_Initialize()) != paNoError) { LOG_PERROR("Portaudio Initialize error"); throw SndPortException(err); } pa_init = true; PaDeviceIndex ndev; if ((ndev = Pa_GetDeviceCount()) < 0) { LOG_PERROR("Portaudio device count error"); throw SndPortException(ndev); } if (ndev == 0) { LOG_PERROR("Portaudio, no audio devices"); throw SndException(ENODEV, "No available audio devices"); } devs.reserve(ndev); for (PaDeviceIndex i = 0; i < ndev; i++) devs.push_back(Pa_GetDeviceInfo(i)); } void SoundPort::terminate(void) { if (!pa_init) return; static_cast(Pa_Terminate()); pa_init = false; devs.clear(); supported_rates[0].clear(); supported_rates[1].clear(); } const std::vector& SoundPort::devices(void) { return devs; } void SoundPort::devices_info(string& in, string& out) { in = device_text[0].str(); out = device_text[1].str(); } const vector& SoundPort::get_supported_rates(const string& name, unsigned dir) { return supported_rates[dir][name]; } SoundPort::SoundPort(const char *in_dev, const char *out_dev) : req_sample_rate(0) { sd[0].device = in_dev; sd[1].device = out_dev; sd[0].params.channelCount = progdefaults.in_channels; // # write channels always 2 unless mono output is selected sd[1].params.channelCount = progdefaults.mono_audio ? 1 : 2; sd[0].stream = sd[1].stream = 0; sd[0].frames_per_buffer = sd[1].frames_per_buffer = paFramesPerBufferUnspecified; sd[0].dev_sample_rate = sd[1].dev_sample_rate = 0; sd[0].state = sd[1].state = spa_continue; sd[0].rb = sd[1].rb = 0; sd[0].advance = sd[1].advance = 0; sem_t** sems[] = { &sd[0].rwsem, &sd[1].rwsem }; #if USE_NAMED_SEMAPHORES char sname[32]; #endif for (size_t i = 0; i < sizeof(sems)/sizeof(*sems); i++) { #if USE_NAMED_SEMAPHORES snprintf(sname, sizeof(sname), "%" PRIuSZ "-%u-%s", i, getpid(), PACKAGE_TARNAME); if ((*sems[i] = sem_open(sname, O_CREAT | O_EXCL, 0600, 0)) == (sem_t*)SEM_FAILED) { pa_perror(errno, sname); throw SndException(errno); } # if HAVE_SEM_UNLINK if (sem_unlink(sname) == -1) { pa_perror(errno, sname); throw SndException(errno); } # endif #else *sems[i] = new sem_t; if (sem_init(*sems[i], 0, 0) == -1) { pa_perror(errno, "sem_init error"); throw SndException(errno); } #endif // USE_NAMED_SEMAPHORES } for (size_t i = 0; i < 2; i++) { sd[i].cmutex = new pthread_mutex_t; pthread_mutex_init(sd[i].cmutex, NULL); sd[i].ccond = new pthread_cond_t; pthread_cond_init(sd[i].ccond, NULL); } tx_src_data = new SRC_DATA; src_buffer = new float[sd[1].params.channelCount * SND_BUF_LEN]; fbuf = new float[MAX(sd[0].params.channelCount, sd[1].params.channelCount) * SND_BUF_LEN]; memset(src_buffer, 0, sd[1].params.channelCount * SND_BUF_LEN * sizeof(*src_buffer)); memset(fbuf, 0, MAX(sd[0].params.channelCount, sd[1].params.channelCount) * SND_BUF_LEN * sizeof(*fbuf)); } SoundPort::~SoundPort() { Close(); sem_t* sems[] = { sd[0].rwsem, sd[1].rwsem }; for (size_t i = 0; i < sizeof(sems)/sizeof(*sems); i++) { #if USE_NAMED_SEMAPHORES if (sem_close(sems[i]) == -1) LOG_PERROR("sem_close"); #else if (sem_destroy(sems[i]) == -1) LOG_PERROR("sem_destroy"); delete sems[i]; #endif } for (size_t i = 0; i < 2; i++) { if (pthread_mutex_destroy(sd[i].cmutex) == -1) { pa_perror(errno, "pthread mutex destroy"); throw SndException(errno); } delete sd[i].cmutex; if (pthread_cond_destroy(sd[i].ccond) == -1) { pa_perror(errno, "pthread cond destroy"); throw SndException(errno); } delete sd[i].ccond; } delete sd[0].rb; delete sd[1].rb; if (rx_src_state) src_delete(rx_src_state); if (tx_src_state) src_delete(tx_src_state); delete tx_src_data; delete [] src_buffer; delete [] fbuf; } int SoundPort::Open(int mode, int freq) { int old_sample_rate = (int)req_sample_rate; req_sample_rate = sample_frequency = freq; // do we need to (re)initialise the streams? int ret = 0; int sr[2] = { progdefaults.in_sample_rate, progdefaults.out_sample_rate }; // initialize stream if it is a JACK device, regardless of mode device_iterator idev; int device_type = 0; if (mode == O_WRONLY && (idev = name_to_device(sd[0].device, 0)) != devs.end() && (device_type = Pa_GetHostApiInfo((*idev)->hostApi)->type) == paJACK) mode = O_RDWR; if (mode == O_RDONLY && (idev = name_to_device(sd[1].device, 1)) != devs.end() && (device_type = Pa_GetHostApiInfo((*idev)->hostApi)->type) == paJACK) mode = O_RDWR; static char pa_open_str[200]; snprintf(pa_open_str, sizeof(pa_open_str), "Port Audio open mode = %s, device type = %s", mode == O_WRONLY ? "Write" : mode == O_RDONLY ? "Read" : mode == O_RDWR ? "Read/Write" : "unknown", device_type == 0 ? "paInDevelopment" : device_type == 1 ? "paDirectSound" : device_type == 2 ? "paMME" : device_type == 3 ? "paASIO" : device_type == 4 ? "paSoundManager" : device_type == 5 ? "paCoreAudio" : device_type == 7 ? "paOSS" : device_type == 8 ? "paALSA" : device_type == 9 ? "paAL" : device_type == 10 ? "paBeOS" : device_type == 11 ? "paWDMKS" : device_type == 12 ? "paJACK" : device_type == 13 ? "paWASAPI" : device_type == 14 ? "paAudioScienceHPI" : "unknown" ); LOG_INFO( "%s", pa_open_str); size_t start = (mode == O_RDONLY || mode == O_RDWR) ? 0 : 1, end = (mode == O_WRONLY || mode == O_RDWR) ? 1 : 0; for (size_t i = start; i <= end; i++) { if ( !(stream_active(i) && (Pa_GetHostApiInfo((*sd[i].idev)->hostApi)->type == paJACK || old_sample_rate == freq || sr[i] != SAMPLE_RATE_AUTO)) ) { Close(i); init_stream(i); src_data_reset(i); // reset the semaphore while (sem_trywait(sd[i].rwsem) == 0); if (errno && errno != EAGAIN) { pa_perror(errno, "open"); throw SndException(errno); } start_stream(i); ret = 1; } else { pause_stream(i); src_data_reset(i); sd[i].state = spa_continue; } } return ret; } void SoundPort::pause_stream(unsigned dir) { if (sd[dir].stream == 0 || !stream_active(dir)) return; pthread_mutex_lock(sd[dir].cmutex); sd[dir].state = spa_pause; if (pthread_cond_timedwait_rel(sd[dir].ccond, sd[dir].cmutex, 5.0) == -1 && errno == ETIMEDOUT) LOG_ERROR("stream %u wedged", dir); pthread_mutex_unlock(sd[dir].cmutex); } void SoundPort::Close(unsigned dir) { unsigned start, end; if (dir == UINT_MAX) { start = 0; end = 1; } else start = end = dir; for (unsigned i = start; i <= end; i++) { if (!stream_active(i)) continue; pthread_mutex_lock(sd[i].cmutex); sd[i].state = spa_complete; // first wait for buffers to be drained and for the // stop callback to signal us that the stream has // been stopped if (pthread_cond_timedwait_rel(sd[i].ccond, sd[i].cmutex, 5.0) == -1 && errno == ETIMEDOUT) LOG_ERROR("stream %u wedged", i); pthread_mutex_unlock(sd[i].cmutex); sd[i].state = spa_continue; int err; if ((err = Pa_CloseStream(sd[i].stream)) != paNoError) pa_perror(err, "Pa_CloseStream"); sd[i].stream = 0; } } void SoundPort::Abort(unsigned dir) { unsigned start, end; if (dir == UINT_MAX) { start = 0; end = 1; } else start = end = dir; int err; for (unsigned i = start; i <= end; i++) { if (!stream_active(i)) continue; if ((err = Pa_AbortStream(sd[i].stream)) != paNoError) pa_perror(err, "Pa_AbortStream"); sd[i].stream = 0; } } #define WAIT_FOR_COND(cond, s, t) \ do { \ while (!(cond)) { \ if (sem_timedwait_rel(s, t) == -1) { \ if (errno == ETIMEDOUT) { \ timeout = true; \ break; \ } else if (errno == EINTR) { \ continue; \ } \ LOG_PERROR("sem_timedwait"); \ throw SndException(errno); \ } \ } \ } while (0) size_t SoundPort::Read(float *buf, size_t count) { #if USE_SNDFILE if (playback) { read_file(ifPlayback, buf, count); if (progdefaults.EnableMixer) for (size_t i = 0; i < count; i++) buf[i] *= progStatus.RcvMixer; if (!capture) { if (!bHighSpeed) MilliSleep((long)ceil((1e3 * count) / req_sample_rate)); return count; } } #endif if (rxppm != progdefaults.RX_corr) rxppm = progdefaults.RX_corr; sd[0].src_ratio = req_sample_rate / (sd[0].dev_sample_rate * (1.0 + rxppm / 1e6)); src_set_ratio(rx_src_state, sd[0].src_ratio); size_t maxframes = (size_t)floor(sd[0].rb->length() * sd[0].src_ratio / sd[0].params.channelCount); if (unlikely(count > maxframes)) { size_t n = 0; #define PA_TIMEOUT_TRIES 10 int pa_timeout = PA_TIMEOUT_TRIES; // possible to lock up in this while block if the Read(...) fails while (count > maxframes) { n += Read(buf, maxframes); buf += maxframes * sd[0].params.channelCount; count -= n;//maxframes; pa_timeout--; if (pa_timeout == 0) { pa_perror(1, "Portaudio read error #1"); throw SndException("Portaudio read error 1"); } } if (count > 0) n += Read(buf, count); return n; } float* rbuf = fbuf; if (req_sample_rate != sd[0].dev_sample_rate || rxppm != 0) { long r; size_t n = 0; sd[0].blocksize = SCBLOCKSIZE; while (n < count) { if ((r = src_callback_read(rx_src_state, sd[0].src_ratio, count - n, rbuf + n * sd[0].params.channelCount)) == 0) { pa_perror(2, "Portaudio read error #2"); throw SndException("Portaudio read error 2"); } n += r; } } else { bool timeout = false; WAIT_FOR_COND( (sd[0].rb->read_space() >= count * sd[0].params.channelCount / sd[0].src_ratio), sd[0].rwsem, (MAX(1.0, 2 * count * sd[0].params.channelCount / sd->dev_sample_rate)) ); if (timeout) { pa_perror(3, "Portaudio read error #3"); throw SndException("Portaudio read error 3"); } ringbuffer::vector_type vec[2]; sd[0].rb->get_rv(vec); if (vec[0].len >= count * sd[0].params.channelCount) { rbuf = vec[0].buf; sd[0].advance = vec[0].len; } else sd[0].rb->read(fbuf, count * sd[0].params.channelCount); } if (sd[0].advance) { sd[0].rb->read_advance(sd[0].advance); sd[0].advance = 0; } if (sd[0].params.channelCount == 1) memcpy(buf, rbuf, count * sizeof(float)); else { // write first channel for (size_t i = 0; i < count; i++) buf[i] = rbuf[sd[0].params.channelCount * i]; } #if USE_SNDFILE if (capture) write_file(ofCapture, buf, count); #endif return count; } size_t SoundPort::Write(double *buf, size_t count) { #if USE_SNDFILE if (generate) write_file(ofGenerate, buf, count); #endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } // copy input to both channels if right channel enabled for (size_t i = 0; i < count; i++) if (progdefaults.mono_audio) fbuf[i] = buf[i]; else if (progdefaults.sig_on_right_channel) fbuf[sd[1].params.channelCount * i] = fbuf[sd[1].params.channelCount * i + 1] = buf[i]; else { if (progdefaults.ReverseAudio) { fbuf[sd[1].params.channelCount * i + 1] = buf[i]; fbuf[sd[1].params.channelCount * i] = 0; } else { fbuf[sd[1].params.channelCount * i] = buf[i]; fbuf[sd[1].params.channelCount * i + 1] = 0; } } return resample_write(fbuf, count); } size_t SoundPort::Write_stereo(double *bufleft, double *bufright, size_t count) { if (sd[1].params.channelCount != 2) return Write(bufleft, count); #if USE_SNDFILE if (generate) write_file(ofCapture, bufleft, count); #endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } // interleave into fbuf for (size_t i = 0; i < count; i++) { if (progdefaults.ReverseAudio) { fbuf[sd[1].params.channelCount * i + 1] = bufleft[i]; fbuf[sd[1].params.channelCount * i] = bufright[i]; } else { fbuf[sd[1].params.channelCount * i] = bufleft[i]; fbuf[sd[1].params.channelCount * i + 1] = bufright[i]; } } return resample_write(fbuf, count); } size_t SoundPort::resample_write(float* buf, size_t count) { size_t maxframes = (size_t)floor((sd[1].rb->length() / sd[1].params.channelCount) / tx_src_data->src_ratio); maxframes /= 2; // don't fill the buffer if (unlikely(count > maxframes)) { size_t n = 0; #define PA_TIMEOUT_TRIES 10 int pa_timeout = PA_TIMEOUT_TRIES; // possible to lock up in this while block if the resample_write(...) fails while (count > maxframes) { n += resample_write(buf, maxframes); buf += sd[1].params.channelCount * maxframes; count -= maxframes; pa_timeout--; if (pa_timeout == 0) { pa_perror(1, "Portaudio write error #1"); throw SndException("Portaudio write error 1"); } } if (count > 0) n += resample_write(buf, count); return n; } assert(count * sd[1].params.channelCount * tx_src_data->src_ratio <= sd[1].rb->length()); ringbuffer::vector_type vec[2]; sd[1].rb->get_wv(vec); float* wbuf = buf; if (req_sample_rate != sd[1].dev_sample_rate || progdefaults.TX_corr != 0) { if (vec[0].len >= sd[1].params.channelCount * (size_t)ceil(count * tx_src_data->src_ratio)) wbuf = vec[0].buf; // direct write in the rb else wbuf = src_buffer; if (txppm != progdefaults.TX_corr) txppm = progdefaults.TX_corr; tx_src_data->src_ratio = sd[1].dev_sample_rate * (1.0 + txppm / 1e6) / req_sample_rate; src_set_ratio(tx_src_state, tx_src_data->src_ratio); tx_src_data->data_in = buf; tx_src_data->input_frames = count; tx_src_data->data_out = wbuf; tx_src_data->output_frames = (wbuf == vec[0].buf ? vec[0].len : SND_BUF_LEN); tx_src_data->end_of_input = 0; int r; if ((r = src_process(tx_src_state, tx_src_data)) != 0) { pa_perror(2, "Portaudio write error #2"); throw SndException("Portaudio write error 2"); } if (tx_src_data->output_frames_gen == 0) // input was too small return count; count = tx_src_data->output_frames_gen; if (wbuf == vec[0].buf) { // advance write pointer and return sd[1].rb->write_advance(sd[1].params.channelCount * count); sem_trywait(sd[1].rwsem); return count; } } // if we didn't do a direct resample into the rb, or didn't resample at all, // we must now copy buf into the ringbuffer, possibly waiting for space first bool timeout = false; WAIT_FOR_COND( (sd[1].rb->write_space() >= sd[1].params.channelCount * count), sd[1].rwsem, (MAX(1.0, 2 * sd[1].params.channelCount * count / sd[1].dev_sample_rate)) ); if (timeout) { pa_perror(3, "Portaudio write error #3"); throw SndException("Portaudio write error 3"); } sd[1].rb->write(wbuf, sd[1].params.channelCount * count); return count; } void SoundPort::flush(unsigned dir) { unsigned start, end; if (dir == UINT_MAX) { start = 0; end = 1; } else start = end = dir; for (unsigned i = start; i <= end; i++) { if (!stream_active(i)) continue; pthread_mutex_lock(sd[i].cmutex); sd[i].state = spa_drain; if (pthread_cond_timedwait_rel(sd[i].ccond, sd[i].cmutex, 5.0) == -1 && errno == ETIMEDOUT) LOG_ERROR("stream %u wedged", i); pthread_mutex_unlock(sd[i].cmutex); sd[i].state = spa_continue; } } void SoundPort::src_data_reset(unsigned dir) { size_t rbsize; int err; if (dir == 0) { if (rx_src_state) src_delete(rx_src_state); rx_src_state = src_callback_new(src_read_cb, progdefaults.sample_converter, sd[0].params.channelCount, &err, &sd[0]); if (!rx_src_state) { pa_perror(err, src_strerror(err)); throw SndException(src_strerror(err)); } sd[0].src_ratio = req_sample_rate / (sd[0].dev_sample_rate * (1.0 + rxppm / 1e6)); } else if (dir == 1) { if (tx_src_state) src_delete(tx_src_state); tx_src_state = src_new(progdefaults.sample_converter, sd[1].params.channelCount, &err); if (!tx_src_state) { pa_perror(err, src_strerror(err)); throw SndException(src_strerror(err)); } tx_src_data->src_ratio = sd[1].dev_sample_rate * (1.0 + txppm / 1e6) / req_sample_rate; } rbsize = 2 * MAX(ceil2( (unsigned)(2 * sd[dir].params.channelCount * SCBLOCKSIZE * MAX(req_sample_rate, sd[dir].dev_sample_rate) / MIN(req_sample_rate, sd[dir].dev_sample_rate))), 8192); LOG_INFO("rbsize = %" PRIuSZ "", rbsize); if (sd[dir].rb) delete sd[dir].rb; sd[dir].rb = new ringbuffer(rbsize); } long SoundPort::src_read_cb(void* arg, float** data) { struct stream_data* sd = reinterpret_cast(arg); // advance read pointer for previous read if (sd->advance) { sd->rb->read_advance(sd->advance); sd->advance = 0; } // wait for data bool timeout = false; WAIT_FOR_COND( (sd->rb->read_space() >= (size_t)sd[0].params.channelCount * SCBLOCKSIZE), sd->rwsem, (MAX(1.0, 2 * sd[0].params.channelCount * SCBLOCKSIZE / sd->dev_sample_rate)) ); if (timeout) { *data = 0; return 0; } ringbuffer::vector_type vec[2]; sd->rb->get_rv(vec); *data = vec[0].buf; sd->advance = vec[0].len; return vec[0].len / sd[0].params.channelCount; } SoundPort::device_iterator SoundPort::name_to_device(const string& name, unsigned dir) { device_iterator i; for (i = devs.begin(); i != devs.end(); ++i) if (name == (*i)->name && (dir ? (*i)->maxOutputChannels : (*i)->maxInputChannels)) break; return i; } void SoundPort::init_stream(unsigned dir) { const char* dir_str[2] = { "input", "output" }; PaDeviceIndex idx = paNoDevice; LOG_DEBUG("looking for device \"%s\"", sd[dir].device.c_str()); if ((sd[dir].idev = name_to_device(sd[dir].device, dir)) != devs.end()) idx = sd[dir].idev - devs.begin(); if (idx == paNoDevice) { // no match LOG_ERROR("Could not find device \"%s\", using default device", sd[dir].device.c_str()); PaDeviceIndex def = (dir == 0 ? Pa_GetDefaultInputDevice() : Pa_GetDefaultOutputDevice()); if (def == paNoDevice) { pa_perror(paDeviceUnavailable, "Portaudio device unavailable"); throw SndPortException(paDeviceUnavailable); } sd[dir].idev = devs.begin() + def; idx = def; } else if (sd[dir].idev == devs.end()) // if we only found a near-match point the idev iterator to it sd[dir].idev = devs.begin() + idx; const PaHostApiInfo* host_api = Pa_GetHostApiInfo((*sd[dir].idev)->hostApi); int max_channels = dir ? (*sd[dir].idev)->maxOutputChannels : (*sd[dir].idev)->maxInputChannels; if ((host_api->type == paALSA || host_api->type == paOSS) && max_channels == 0) { pa_perror(EBUSY, "Portaudio device busy"); throw SndException(EBUSY); } if (dir == 0) { sd[0].params.device = idx; sd[0].params.sampleFormat = paFloat32; sd[0].params.suggestedLatency = (*sd[dir].idev)->defaultHighInputLatency; sd[0].params.hostApiSpecificStreamInfo = NULL; } else { sd[1].params.device = idx; sd[1].params.sampleFormat = paFloat32; if (host_api->type == paMME) sd[1].params.suggestedLatency = (*sd[dir].idev)->defaultLowOutputLatency; else sd[1].params.suggestedLatency = (*sd[dir].idev)->defaultHighOutputLatency; sd[1].params.hostApiSpecificStreamInfo = NULL; } const vector& rates = supported_rates[dir][(*sd[dir].idev)->name]; if (rates.size() <= 1) probe_supported_rates(sd[dir].idev); ostringstream ss; if (rates.size() > 1) copy(rates.begin() + 1, rates.end(), ostream_iterator(ss, " ")); else ss << "Unknown"; device_text[dir].str(""); device_text[dir] << "index: " << idx << "\nname: " << (*sd[dir].idev)->name << "\nhost API: " << host_api->name << "\nmax input channels: " << (*sd[dir].idev)->maxInputChannels << "\nmax output channels: " << (*sd[dir].idev)->maxOutputChannels << "\ndefault sample rate: " << (*sd[dir].idev)->defaultSampleRate << "\nsupported sample rates: " << ss.str() << boolalpha << "\ninput only: " << ((*sd[dir].idev)->maxOutputChannels == 0) << "\noutput only: " << ((*sd[dir].idev)->maxInputChannels == 0) << "\nfull duplex: " << full_duplex_device(*sd[dir].idev) << "\nsystem default input: " << (idx == Pa_GetDefaultInputDevice()) << "\nsystem default output: " << (idx == Pa_GetDefaultOutputDevice()) << "\nhost API default input: " << (idx == host_api->defaultInputDevice) << "\nhost API default output: " << (idx == host_api->defaultOutputDevice) << "\ndefault low input latency: " << (*sd[dir].idev)->defaultLowInputLatency << "\ndefault high input latency: " << (*sd[dir].idev)->defaultHighInputLatency << "\ndefault low output latency: " << (*sd[dir].idev)->defaultLowOutputLatency << "\ndefault high output latency: " << (*sd[dir].idev)->defaultHighOutputLatency << "\n"; // LOG_DEBUG("using %s (%d ch) device \"%s\":\n%s", dir_str[dir], sd[dir].params.channelCount, // sd[dir].device.c_str(), device_text[dir].str().c_str()); sd[dir].dev_sample_rate = find_srate(dir); if (sd[dir].dev_sample_rate != req_sample_rate) LOG_DEBUG("%s: resampling %f <=> %f", dir_str[dir], sd[dir].dev_sample_rate, req_sample_rate); if (progdefaults.PortFramesPerBuffer > 0) { sd[dir].frames_per_buffer = progdefaults.PortFramesPerBuffer; LOG_DEBUG("%s: frames_per_buffer=%u", dir_str[dir], sd[dir].frames_per_buffer); } } void SoundPort::start_stream(unsigned dir) { int err; PaStreamParameters* sp[2]; sp[dir] = &sd[dir].params; sp[!dir] = NULL; err = Pa_OpenStream(&sd[dir].stream, sp[0], sp[1], sd[dir].dev_sample_rate, sd[dir].frames_per_buffer, paNoFlag, stream_process, &sd[dir]); if (err != paNoError) { pa_perror(err, "Portaudio open stream error"); throw SndPortException(err); } if ((err = Pa_SetStreamFinishedCallback(sd[dir].stream, stream_stopped)) != paNoError) throw SndPortException(err); if ((err = Pa_StartStream(sd[dir].stream)) != paNoError) { pa_perror(err, "Portaudio stream start stream error"); Close(); throw SndPortException(err); } } int SoundPort::stream_process( const void* in, void* out, unsigned long nframes, const PaStreamCallbackTimeInfo *time_info, PaStreamCallbackFlags flags, void* data) { struct stream_data* sd = reinterpret_cast(data); #ifndef NDEBUG struct { PaStreamCallbackFlags f; const char* s; } fa[] = { { paInputUnderflow, "Input underflow" }, { paInputOverflow, "Input overflow" }, { paOutputUnderflow, "Output underflow" }, { paOutputOverflow, "Output overflow" } }; for (size_t i = 0; i < sizeof(fa)/sizeof(*fa); i++) if (flags & fa[i].f) LOG_DEBUG("%s", fa[i].s); #endif if (unlikely(sd->state == spa_abort || sd->state == spa_complete)) // finished return sd->state; if (in) { switch (sd->state) { case spa_continue: // write into the rb, post rwsem if we wrote anything if (sd->rb->write(reinterpret_cast(in), sd->params.channelCount * nframes)) sem_post(sd->rwsem); break; case spa_drain: case spa_pause: // signal the cv pthread_mutex_lock(sd->cmutex); pthread_cond_signal(sd->ccond); pthread_mutex_unlock(sd->cmutex); } } else if (out) { float* outf = reinterpret_cast(out); // if we are paused just pretend that the rb was empty size_t nread = (sd->state == spa_pause) ? 0 : sd->rb->read(outf, sd->params.channelCount * nframes); memset(outf + nread, 0, (sd->params.channelCount * nframes - nread) * sizeof(float)); // fill rest with 0 switch (sd->state) { case spa_continue: // post rwsem if we read anything if (nread > 0) sem_post(sd->rwsem); break; case spa_drain: // signal the cv when we have emptied the buffer if (nread > 0) break; // else fall through case spa_pause: pthread_mutex_lock(sd->cmutex); pthread_cond_signal(sd->ccond); pthread_mutex_unlock(sd->cmutex); break; } } return paContinue; } void SoundPort::stream_stopped(void* data) { struct stream_data* sd = reinterpret_cast(data); if (sd->rb) sd->rb->reset(); pthread_mutex_lock(sd->cmutex); pthread_cond_signal(sd->ccond); pthread_mutex_unlock(sd->cmutex); } bool SoundPort::stream_active(unsigned dir) { if (!sd[dir].stream) return false; int err; if ((err = Pa_IsStreamActive(sd[dir].stream)) < 0) { pa_perror(err, "Portaudio stream active error"); throw SndPortException(err); } return err == 1; } bool SoundPort::full_duplex_device(const PaDeviceInfo* dev) { return dev->maxInputChannels > 0 && dev->maxOutputChannels > 0; } bool SoundPort::must_close(int dir) { return Pa_GetHostApiInfo((*sd[dir].idev)->hostApi)->type != paJACK; } // Determine the sample rate that we will use. We try the modem's rate // first and fall back to the device's default rate. If there is a user // setting we just return that without making any checks. double SoundPort::find_srate(unsigned dir) { int sr = (dir == 0 ? progdefaults.in_sample_rate : progdefaults.out_sample_rate); switch (sr) { case SAMPLE_RATE_UNSET: case SAMPLE_RATE_AUTO: break; case SAMPLE_RATE_NATIVE: return (*sd[dir].idev)->defaultSampleRate; default: return sr; } const vector& rates = supported_rates[dir][(*sd[dir].idev)->name]; for (vector::const_iterator i = rates.begin(); i != rates.end(); i++) if (req_sample_rate == *i || (*sd[dir].idev)->defaultSampleRate == *i) return *i; pa_perror(0, "Portaudio - no supported sample rate found"); throw SndException("No supported sample rate found"); } void SoundPort::probe_supported_rates(const device_iterator& idev) { PaStreamParameters params[2]; params[0].device = params[1].device = idev - devs.begin(); params[0].channelCount = progdefaults.in_channels; // # output channels always 2 unless mono audio is selected params[1].channelCount = progdefaults.mono_audio ? 1 : 2; params[0].sampleFormat = params[1].sampleFormat = paFloat32; params[0].suggestedLatency = (*idev)->defaultHighInputLatency; params[1].suggestedLatency = (*idev)->defaultHighOutputLatency; params[0].hostApiSpecificStreamInfo = params[1].hostApiSpecificStreamInfo = NULL; supported_rates[0][(*idev)->name].clear(); supported_rates[1][(*idev)->name].clear(); supported_rates[0][(*idev)->name].push_back((*idev)->defaultSampleRate); supported_rates[1][(*idev)->name].push_back((*idev)->defaultSampleRate); extern double std_sample_rates[]; for (const double* r = std_sample_rates; *r > 0.0; r++) { if (Pa_IsFormatSupported(¶ms[0], NULL, *r) == paFormatIsSupported) supported_rates[0][(*idev)->name].push_back(*r); if (Pa_IsFormatSupported(NULL, ¶ms[1], *r) == paFormatIsSupported) supported_rates[1][(*idev)->name].push_back(*r); } } void SoundPort::pa_perror(int err, const char* str) { if (str) LOG_ERROR("%s: %s", str, Pa_GetErrorText(err)); if (err == paUnanticipatedHostError) { const PaHostErrorInfo* hosterr = Pa_GetLastHostErrorInfo(); PaHostApiIndex i = Pa_HostApiTypeIdToHostApiIndex(hosterr->hostApiType); if (i < 0) { // PA failed without setting its "last host error" info. Sigh... LOG_ERROR("Host API error info not available"); if ( ((sd[0].stream && Pa_GetHostApiInfo((*sd[0].idev)->hostApi)->type == paOSS) || (sd[1].stream && Pa_GetHostApiInfo((*sd[1].idev)->hostApi)->type == paOSS)) && errno ) LOG_ERROR("Possible OSS error %d: %s", errno, strerror(errno)); } else LOG_ERROR("%s error %ld: %s", Pa_GetHostApiInfo(i)->name, hosterr->errorCode, hosterr->errorText); } } void SoundPort::init_hostapi_ext(void) { #if HAVE_DLOPEN && !defined(__WOE32__) void* handle = dlopen(NULL, RTLD_LAZY); if (!handle) return; PaError (*set_jack_client_name)(const char*); const char* err = dlerror(); set_jack_client_name = (PaError (*)(const char*))dlsym(handle, "PaJack_SetClientName"); if (!(err = dlerror())) set_jack_client_name(main_window_title.c_str()); # ifndef NDEBUG else LOG_VERBOSE("dlsym(PaJack_SetClientName) error: %s", err); # endif #endif } #endif // USE_PORTAUDIO #if USE_PULSEAUDIO SoundPulse::SoundPulse(const char *dev) { sd[0].stream = sd[1].stream = 0; sd[0].dir = PA_STREAM_RECORD; sd[1].dir = PA_STREAM_PLAYBACK; sd[0].stream_params.format = sd[1].stream_params.format = PA_SAMPLE_FLOAT32LE; sd[0].stream_params.channels = progdefaults.in_channels; // # output channels always 2 unless mono audio is selected sd[1].stream_params.channels = progdefaults.mono_audio ? 1 : 2; sd[0].buffer_attrs.maxlength = sd[0].buffer_attrs.minreq = sd[0].buffer_attrs.prebuf = sd[0].buffer_attrs.tlength = (uint32_t)-1; sd[1].buffer_attrs.fragsize = sd[1].buffer_attrs.maxlength = sd[1].buffer_attrs.minreq = sd[1].buffer_attrs.prebuf = (uint32_t)-1; sd[0].buffer_attrs.fragsize = SCBLOCKSIZE * sizeof(float); sd[1].buffer_attrs.tlength = SCBLOCKSIZE * sizeof(float); tx_src_data = new SRC_DATA; snd_buffer = new float[sd[0].stream_params.channels * SND_BUF_LEN]; src_buffer = new float[sd[1].stream_params.channels * SND_BUF_LEN]; fbuf = new float[MAX(sd[0].stream_params.channels, sd[1].stream_params.channels) * SND_BUF_LEN]; memset(snd_buffer, 0, sd[0].stream_params.channels * SND_BUF_LEN * sizeof(*snd_buffer)); memset(src_buffer, 0, sd[1].stream_params.channels * SND_BUF_LEN * sizeof(*src_buffer)); memset(fbuf, 0, MAX(sd[0].stream_params.channels, sd[1].stream_params.channels) * SND_BUF_LEN * sizeof(*fbuf)); } SoundPulse::~SoundPulse() { Close(); delete tx_src_data; if (rx_src_state) src_delete(rx_src_state); if (tx_src_state) src_delete(tx_src_state); delete [] snd_buffer; delete [] src_buffer; delete [] fbuf; } int SoundPulse::Open(int mode, int freq) { const char* server = (progdefaults.PulseServer.length() ? progdefaults.PulseServer.c_str() : NULL); char sname[32]; int err; sample_frequency = freq; for (int i = 0; i < 2; i++) { src_data_reset(1 << O_RDONLY | 1 << O_WRONLY); if ((unsigned)freq != sd[i].stream_params.rate) Close(i); if (sd[i].stream) continue; sd[i].stream_params.rate = freq; snprintf(sname, sizeof(sname), "%s (%u)", (i ? "playback" : "capture"), getpid()); setenv("PULSE_PROP_application.icon_name", PACKAGE_TARNAME, 1); sd[i].stream = pa_simple_new(server, main_window_title.c_str(), sd[i].dir, NULL, sname, &sd[i].stream_params, NULL, &sd[i].buffer_attrs, &err); if (!sd[i].stream) throw SndPulseException(err); } return 0; } void SoundPulse::Close(unsigned dir) { if (dir == 1 || dir == UINT_MAX) flush(1); Abort(dir); } void SoundPulse::Abort(unsigned dir) { unsigned start, end; if (dir == UINT_MAX) { start = 0; end = 1; } else start = end = dir; for (unsigned i = start; i <= end; i++) { if (sd[i].stream) { pa_simple_free(sd[i].stream); sd[i].stream = 0; } } } void SoundPulse::flush(unsigned dir) { int err = PA_OK; if ((dir == 1 || dir == UINT_MAX) && sd[1].stream) { // wait for audio to finish playing // pa_simple_drain(sd[1].stream, &err); MilliSleep(SCBLOCKSIZE * 1000 / sd[1].stream_params.rate); pa_simple_flush(sd[1].stream, &err); } if ((dir == 0 || dir == UINT_MAX) && sd[0].stream) { // We need to flush the captured audio that PA has been // buffering for us while we were transmitting. We will use // pa_simple_get_latency() which, contrary to the docs, also // works for capture streams. It tells us how much earlier the // data that would be returned by pa_simple_read() was actually // captured, and we read and discard all that data. pa_usec_t t = pa_simple_get_latency(sd[0].stream, &err); if (t && err == PA_OK) { size_t bytes = pa_usec_to_bytes(t, &sd[0].stream_params); while (bytes > SND_BUF_LEN) { pa_simple_read(sd[0].stream, snd_buffer, SND_BUF_LEN, &err); if (err != PA_OK) break; bytes -= SND_BUF_LEN; } if (bytes) pa_simple_read(sd[0].stream, snd_buffer, bytes, &err); } } } size_t SoundPulse::Write(double* buf, size_t count) { #if USE_SNDFILE if (generate) write_file(ofGenerate, buf, count); #endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } // copy input to both channels for (size_t i = 0; i < count; i++) if (progdefaults.mono_audio) fbuf[i] = buf[i]; else if (progdefaults.sig_on_right_channel) fbuf[sd[1].stream_params.channels * i] = fbuf[sd[1].stream_params.channels * i + 1] = buf[i]; else { if (progdefaults.ReverseAudio) { fbuf[sd[1].stream_params.channels * i + 1] = buf[i]; fbuf[sd[1].stream_params.channels * i] = 0; } else { fbuf[sd[1].stream_params.channels * i] = buf[i]; fbuf[sd[1].stream_params.channels * i + 1] = 0; } } return resample_write(fbuf, count); } size_t SoundPulse::Write_stereo(double* bufleft, double* bufright, size_t count) { if (sd[1].stream_params.channels != 2) return Write(bufleft, count); #if USE_SNDFILE if (generate) write_file(ofGenerate, bufleft, count); #endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } for (size_t i = 0; i < count; i++) { if (progdefaults.ReverseAudio) { fbuf[sd[1].stream_params.channels * i + 1] = bufleft[i]; fbuf[sd[1].stream_params.channels * i] = bufright[i]; } else { fbuf[sd[1].stream_params.channels * i] = bufleft[i]; fbuf[sd[1].stream_params.channels * i + 1] = bufright[i]; } } return resample_write(fbuf, count); } size_t SoundPulse::resample_write(float* buf, size_t count) { int err; float *wbuf = buf; if (progdefaults.TX_corr != 0) { if (txppm != progdefaults.TX_corr) { txppm = progdefaults.TX_corr; tx_src_data->src_ratio = 1.0 + txppm / 1e6; src_set_ratio(tx_src_state, tx_src_data->src_ratio); } tx_src_data->data_in = wbuf; tx_src_data->input_frames = count; tx_src_data->data_out = src_buffer; tx_src_data->output_frames = SND_BUF_LEN; tx_src_data->end_of_input = 0; if ((err = src_process(tx_src_state, tx_src_data)) != 0) throw SndException(src_strerror(err)); if (tx_src_data->output_frames_gen == 0) // input was too small return count; wbuf = tx_src_data->data_out; count = tx_src_data->output_frames_gen; } if (pa_simple_write(sd[1].stream, wbuf, count * sd[1].stream_params.channels * sizeof(float), &err) == -1) throw SndPulseException(err); return count; } long SoundPulse::src_read_cb(void* arg, float** data) { SoundPulse* p = reinterpret_cast(arg); int err; if (pa_simple_read(p->sd[0].stream, p->snd_buffer, sizeof(float) * p->sd[0].blocksize, &err) == -1) { LOG_ERROR("%s", pa_strerror(err)); *data = 0; return 0; } *data = p->snd_buffer; return p->sd[0].blocksize; } size_t SoundPulse::Read(float *buf, size_t count) { #if USE_SNDFILE if (playback) { read_file(ifPlayback, buf, count); if (progdefaults.EnableMixer) for (size_t i = 0; i < count; i++) buf[i] *= progStatus.RcvMixer; if (!capture) { flush(0); if (!bHighSpeed) MilliSleep((long)ceil((1e3 * count) / sample_frequency)); return count; } } #endif if (progdefaults.RX_corr != 0) { if (rxppm != progdefaults.RX_corr) { rxppm = progdefaults.RX_corr; sd[0].src_ratio = 1.0 / (1.0 + rxppm / 1e6); src_set_ratio(rx_src_state, sd[0].src_ratio); } long r; size_t n = 0; sd[0].blocksize = SCBLOCKSIZE; while (n < count) { if ((r = src_callback_read(rx_src_state, sd[0].src_ratio, count - n, buf + n)) == 0) return n; n += r; } } else { int err; if (pa_simple_read(sd[0].stream, buf, sizeof(float) * count, &err) == -1) throw SndPulseException(err); } #if USE_SNDFILE if (capture) write_file(ofCapture, buf, count); #endif return count; } void SoundPulse::src_data_reset(int mode) { int err; if (mode & 1 << O_RDONLY) { if (rx_src_state) src_delete(rx_src_state); rx_src_state = src_callback_new(src_read_cb, progdefaults.sample_converter, sd[0].stream_params.channels, &err, this); if (!rx_src_state) throw SndException(src_strerror(err)); sd[0].src_ratio = 1.0 / (1.0 + rxppm / 1e6); } if (mode & 1 << O_WRONLY) { if (tx_src_state) src_delete(tx_src_state); tx_src_state = src_new(progdefaults.sample_converter, sd[1].stream_params.channels, &err); if (!tx_src_state) throw SndException(src_strerror(err)); tx_src_data->src_ratio = 1.0 + txppm / 1e6; } } #endif // USE_PULSEAUDIO size_t SoundNull::Write(double* buf, size_t count) { #if USE_SNDFILE if (generate) write_file(ofGenerate, buf, count); #endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } MilliSleep((long)ceil((1e3 * count) / sample_frequency)); return count; } size_t SoundNull::Write_stereo(double* bufleft, double* bufright, size_t count) { #if USE_SNDFILE if (generate) write_file(ofGenerate, bufleft, count); #endif MilliSleep((long)ceil((1e3 * count) / sample_frequency)); return count; } size_t SoundNull::Read(float *buf, size_t count) { #if USE_SNDFILE if (playback) { read_file(ifPlayback, buf, count); if (progdefaults.EnableMixer) for (size_t i = 0; i < count; i++) buf[i] *= progStatus.RcvMixer; } else #endif memset(buf, 0, count * sizeof(*buf)); #if USE_SNDFILE if (capture) write_file(ofCapture, buf, count); #endif if (!bHighSpeed) MilliSleep((long)ceil((1e3 * count) / sample_frequency)); return count; } fldigi-3.21.80/src/soundcard/soundconf.cxx0000664000175000017500000003550612313147652015356 00000000000000// ---------------------------------------------------------------------------- // soundconf.cxx // // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #if USE_PORTAUDIO # include # include #endif #include #include #if USE_OSS # include #endif #include "soundconf.h" #include "sound.h" #include "main.h" #include "configuration.h" #include "confdialog.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_AUDIO); using namespace std; double std_sample_rates[] = { 8000.0, 9600.0, 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, 44100.0, 48000.0, 88200.0, 96000.0, 192000.0, -1.0 }; static void init_oss(void) { #if USE_OSS glob_t gbuf; glob("/dev/dsp*", 0, NULL, &gbuf); for (size_t i = 0; i < gbuf.gl_pathc; i++) menuOSSDev->add(gbuf.gl_pathv[i]); if (progdefaults.OSSdevice.length() == 0 && gbuf.gl_pathc) progdefaults.OSSdevice = gbuf.gl_pathv[0]; menuOSSDev->value(progdefaults.OSSdevice.c_str()); globfree(&gbuf); glob("/dev/mixer*", 0, NULL, &gbuf); for (size_t i = 0; i < gbuf.gl_pathc; i++) menuMix->add(gbuf.gl_pathv[i]); if (progdefaults.MXdevice.length() == 0 && gbuf.gl_pathc) progdefaults.MXdevice = gbuf.gl_pathv[0]; globfree(&gbuf); menuMix->value(progdefaults.MXdevice.c_str()); #else progdefaults.EnableMixer = false; tabMixer->parent()->remove(*tabMixer); #endif // USE_OSS } #if USE_PORTAUDIO map pa_api_prio; struct padev { public: padev(const PaDeviceInfo* dev_, PaDeviceIndex idx_, PaHostApiTypeId api_) : dev(dev_), idx(idx_), api(api_) { } bool operator<(const padev& rhs) const { return pa_api_prio.find(api) != pa_api_prio.end() && pa_api_prio.find(rhs.api) != pa_api_prio.end() && pa_api_prio[api] < pa_api_prio[rhs.api]; } const PaDeviceInfo* dev; PaDeviceIndex idx; PaHostApiTypeId api; }; static PaDeviceIndex get_default_portaudio_device(int dir) { #ifndef __linux__ goto ret_def; #else // Recent PortAudio snapshots prefer ALSA over OSS for the default device, but there are // still versions out there that try OSS first. We check the default host api type and, // if it is not ALSA, return the ALSA default device instead. PaHostApiIndex api_idx; if ((api_idx = Pa_GetDefaultHostApi()) < 0) goto ret_def; const PaHostApiInfo* host_api; if ((host_api = Pa_GetHostApiInfo(api_idx)) == NULL || host_api->type == paALSA) goto ret_def; LOG_DEBUG("Default host API is %s, trying default ALSA %s device instead", host_api->name, (dir == 0 ? "input" : "output")); api_idx = Pa_GetHostApiCount(); if (api_idx < 0) goto ret_def; for (PaHostApiIndex i = 0; i < api_idx; i++) if ((host_api = Pa_GetHostApiInfo(i)) && host_api->type == paALSA) return dir == 0 ? host_api->defaultInputDevice : host_api->defaultOutputDevice; #endif // __linux__ ret_def: return dir == 0 ? Pa_GetDefaultInputDevice() : Pa_GetDefaultOutputDevice(); } #include static void init_portaudio(void) { try { SoundPort::initialize(); } catch (const SndException& e) { if (e.error() == ENODEV) // don't complain if there are no devices return; LOG_ERROR("%s", e.what()); AudioPort->deactivate(); btnAudioIO[SND_IDX_PORT]->deactivate(); if (progdefaults.btnAudioIOis == SND_IDX_PORT) progdefaults.btnAudioIOis = SND_IDX_NULL; return; } pa_api_prio.clear(); #if defined(__APPLE__) pa_api_prio[paASIO] = 0; pa_api_prio[paCoreAudio] = 1; #elif defined(__WOE32__) pa_api_prio[paASIO] = 0; pa_api_prio[paWASAPI] = 1; pa_api_prio[paMME] = 2; pa_api_prio[paDirectSound] = 3; #else pa_api_prio[paALSA] = 0; pa_api_prio[paJACK] = 1; pa_api_prio[paOSS] = 2; #endif list devlist; for (SoundPort::device_iterator idev = SoundPort::devices().begin(); idev != SoundPort::devices().end(); ++idev) devlist.push_back( padev(*idev, idev - SoundPort::devices().begin(), Pa_GetHostApiInfo((*idev)->hostApi)->type) ); devlist.sort(); PaHostApiTypeId first_api = devlist.begin()->api; for (list::const_iterator ilist = devlist.begin(); ilist != devlist.end(); ilist++) { string menu_item; string::size_type i = 0; if (ilist->api != first_api) { // add a submenu menu_item.append(Pa_GetHostApiInfo(ilist->dev->hostApi)->name).append(" devices/"); i = menu_item.length(); } menu_item.append(ilist->dev->name); // backslash-escape any slashes in the device name while ((i = menu_item.find('/', i)) != string::npos) { menu_item.insert(i, 1, '\\'); i += 2; } // add to menu if (ilist->dev->maxInputChannels > 0) menuPortInDev->add(menu_item.c_str(), 0, NULL, reinterpret_cast(ilist->idx), 0); if (ilist->dev->maxOutputChannels > 0) menuPortOutDev->add(menu_item.c_str(), 0, NULL, reinterpret_cast(ilist->idx), 0); } if (progdefaults.PortInDevice.length() == 0) { if (progdefaults.PAdevice.length() == 0) { PaDeviceIndex def = get_default_portaudio_device(0); if (def != paNoDevice) { progdefaults.PortInDevice = (*(SoundPort::devices().begin() + def))->name; progdefaults.PortInIndex = def; } } else progdefaults.PortInDevice = progdefaults.PAdevice; } if (progdefaults.PortOutDevice.length() == 0) { if (progdefaults.PAdevice.length() == 0) { PaDeviceIndex def = get_default_portaudio_device(1); if (def != paNoDevice) { progdefaults.PortOutDevice = (*(SoundPort::devices().begin() + def))->name; progdefaults.PortOutIndex = def; } } else progdefaults.PortOutDevice = progdefaults.PAdevice; } // select the correct menu items const Fl_Menu_Item* menu; int size; int idx; idx = -1; menu = menuPortInDev->menu(); size = menuPortInDev->size(); for (int i = 0; i < size - 1; i++, menu++) { if (menu->label() && progdefaults.PortInDevice == menu->label()) { idx = i; // near match if (reinterpret_cast(menu->user_data()) == progdefaults.PortInIndex || progdefaults.PortInIndex == -1) // exact match, or index was never saved break; } } if (idx >= 0) { menuPortInDev->value(idx); menuPortInDev->set_changed(); } idx = -1; menu = menuPortOutDev->menu(); size = menuPortOutDev->size(); for (int i = 0; i < size - 1; i++, menu++) { if (menu->label() && progdefaults.PortOutDevice == menu->label()) { idx = i; if (reinterpret_cast(menu->user_data()) == progdefaults.PortOutIndex || progdefaults.PortOutIndex == -1) break; } } if (idx >= 0) { menuPortOutDev->value(idx); menuPortOutDev->set_changed(); } } #else static void init_portaudio(void) { } #endif // USE_PORTAUDIO static void build_srate_listbox(Fl_ListBox* lbox, const double* rates, size_t length, double defrate = -1.0) { lbox->clear(); lbox->add("Auto"); lbox->add("Native"); char s[16]; for (size_t i = 0; i < length; i++) { if (defrate != rates[i]) snprintf(s, sizeof(s), "%.0f", rates[i]); else snprintf(s, sizeof(s), "%.0f (native)", rates[i]); lbox->add(s); } } int sample_rate_converters[FLDIGI_NUM_SRC] = { SRC_SINC_BEST_QUALITY, SRC_SINC_MEDIUM_QUALITY, SRC_SINC_FASTEST #if !(defined(__ppc__) || defined(__powerpc__) || defined(__PPC__)) , SRC_LINEAR #endif }; static void sound_init_options(void) { build_srate_listbox(menuInSampleRate, std_sample_rates, sizeof(std_sample_rates)/sizeof(*std_sample_rates) - 1); build_srate_listbox(menuOutSampleRate, std_sample_rates, sizeof(std_sample_rates)/sizeof(*std_sample_rates) - 1); for (int i = 0; i < FLDIGI_NUM_SRC; i++) menuSampleConverter->add(src_get_name(sample_rate_converters[i])); // Warn if we are using ZOH if (progdefaults.sample_converter == SRC_ZERO_ORDER_HOLD) { progdefaults.sample_converter = SRC_LINEAR; LOG_WARN("The Zero Order Hold sample rate converter should not be used! " "Your setting has been changed to Linear."); } #if defined(__ppc__) || defined(__powerpc__) || defined(__PPC__) // SRC_LINEAR may crash with 11025Hz modems. Change to SINC_FASTEST. if (progdefaults.sample_converter == SRC_LINEAR) { progdefaults.sample_converter = SRC_SINC_FASTEST; LOG_WARN("Linear sample rate converter may not work on this architecture. " "Your setting has been changed to Fastest Sinc"); } #endif for (int i = 0; i < FLDIGI_NUM_SRC; i++) { if (sample_rate_converters[i] == progdefaults.sample_converter) { menuSampleConverter->index(i); menuSampleConverter->tooltip(src_get_description(progdefaults.sample_converter)); break; } } valPCMvolume->value(progdefaults.PCMvolume); btnMicIn->value(progdefaults.MicIn); btnLineIn->value(progdefaults.LineIn); menuOSSDev->value(progdefaults.OSSdevice.c_str()); inpPulseServer->value(progdefaults.PulseServer.c_str()); btnMixer->value(progdefaults.EnableMixer); menuMix->value(progdefaults.MXdevice.c_str()); enableMixer(progdefaults.EnableMixer); char sr[6+1]; if (progdefaults.in_sample_rate == SAMPLE_RATE_UNSET && (progdefaults.in_sample_rate = progdefaults.sample_rate) == SAMPLE_RATE_UNSET) progdefaults.in_sample_rate = SAMPLE_RATE_NATIVE; else if (progdefaults.in_sample_rate > SAMPLE_RATE_OTHER) snprintf(sr, sizeof(sr), "%d", progdefaults.in_sample_rate); if (progdefaults.in_sample_rate <= SAMPLE_RATE_NATIVE) menuInSampleRate->index(progdefaults.in_sample_rate); else for (int i = 1; i <= menuInSampleRate->lsize(); i++) { menuInSampleRate->index(i); if (strstr(menuInSampleRate->value(), sr)) break; } if (progdefaults.out_sample_rate == SAMPLE_RATE_UNSET && (progdefaults.out_sample_rate = progdefaults.sample_rate) == SAMPLE_RATE_UNSET) progdefaults.out_sample_rate = SAMPLE_RATE_NATIVE; else if (progdefaults.out_sample_rate > SAMPLE_RATE_OTHER) snprintf(sr, sizeof(sr), "%d", progdefaults.out_sample_rate); if (progdefaults.out_sample_rate <= SAMPLE_RATE_NATIVE) menuOutSampleRate->index(progdefaults.out_sample_rate); else for (int i = 1; i <= menuOutSampleRate->lsize(); i++) { menuOutSampleRate->index(i); if (strstr(menuOutSampleRate->value(), sr)) break; } cntRxRateCorr->value(progdefaults.RX_corr); cntTxRateCorr->value(progdefaults.TX_corr); cntTxOffset->value(progdefaults.TxOffset); } #if USE_PULSEAUDIO # include # include # include # if PA_API_VERSION < 12 static inline int PA_CONTEXT_IS_GOOD(pa_context_state_t x) { return x == PA_CONTEXT_CONNECTING || x == PA_CONTEXT_AUTHORIZING || x == PA_CONTEXT_SETTING_NAME || x == PA_CONTEXT_READY; } # endif static bool probe_pulseaudio(void) { pa_mainloop* loop = pa_mainloop_new(); if (!loop) return false; bool ok = false; pa_context* context = pa_context_new(pa_mainloop_get_api(loop), PACKAGE_TARNAME); if (context && pa_context_connect(context, NULL, PA_CONTEXT_NOAUTOSPAWN, NULL) >= 0) { pa_context_state_t state; do { // iterate main loop until the context connection fails or becomes ready if (!(ok = (pa_mainloop_iterate(loop, 1, NULL) >= 0 && PA_CONTEXT_IS_GOOD(state = pa_context_get_state(context))))) break; } while (state != PA_CONTEXT_READY); } if (context) { pa_context_disconnect(context); pa_context_unref(context); } pa_mainloop_free(loop); return ok; } #else static bool probe_pulseaudio(void) { return false; } #endif // USE_PULSEAUDIO void sound_init(void) { init_oss(); init_portaudio(); // set the Sound Card configuration tab to the correct initial values #if !USE_OSS AudioOSS->deactivate(); btnAudioIO[SND_IDX_OSS]->deactivate(); #endif #if !USE_PORTAUDIO AudioPort->deactivate(); btnAudioIO[SND_IDX_PORT]->deactivate(); #endif #if !USE_PULSEAUDIO AudioPulse->deactivate(); btnAudioIO[SND_IDX_PULSE]->deactivate(); #endif if (progdefaults.btnAudioIOis == SND_IDX_UNKNOWN || !btnAudioIO[progdefaults.btnAudioIOis]->active()) { // or saved sound api now disabled int io[4] = { SND_IDX_PORT, SND_IDX_PULSE, SND_IDX_OSS, SND_IDX_NULL }; if (probe_pulseaudio()) { // prefer pulseaudio io[0] = SND_IDX_PULSE; io[1] = SND_IDX_PORT; } for (size_t i = 0; i < sizeof(io)/sizeof(*io); i++) { if (btnAudioIO[io[i]]->active()) { progdefaults.btnAudioIOis = io[i]; break; } } } sound_init_options(); sound_update(progdefaults.btnAudioIOis); resetMixerControls(); } void sound_close(void) { #if USE_PORTAUDIO SoundPort::terminate(); #endif } void sound_update(unsigned idx) { // radio button for (size_t i = 0; i < sizeof(btnAudioIO)/sizeof(*btnAudioIO); i++) btnAudioIO[i]->value(i == idx); // devices menuOSSDev->deactivate(); menuPortInDev->deactivate(); menuPortOutDev->deactivate(); inpPulseServer->deactivate(); // settings menuInSampleRate->deactivate(); menuOutSampleRate->deactivate(); progdefaults.btnAudioIOis = idx; switch (idx) { #if USE_OSS case SND_IDX_OSS: menuOSSDev->activate(); scDevice[0] = scDevice[1] = menuOSSDev->value(); break; #endif #if USE_PORTAUDIO case SND_IDX_PORT: menuPortInDev->activate(); menuPortOutDev->activate(); if (menuPortInDev->text()) scDevice[0] = menuPortInDev->text(); if (menuPortOutDev->text()) scDevice[1] = menuPortOutDev->text(); { Fl_ListBox* listbox[2] = { menuInSampleRate, menuOutSampleRate }; for (size_t i = 0; i < 2; i++) { char* label = strdup(listbox[i]->value()); const vector& srates = SoundPort::get_supported_rates(scDevice[i], i); switch (srates.size()) { case 0: // startup; no devices initialised yet build_srate_listbox(listbox[i], std_sample_rates, sizeof(std_sample_rates)/sizeof(*std_sample_rates) - 1); break; case 1: // default sample rate only, build menu with all std rates build_srate_listbox(listbox[i], std_sample_rates, sizeof(std_sample_rates)/sizeof(*std_sample_rates) - 1, srates[0]); break; default: // first element is default sample rate, build menu with rest build_srate_listbox(listbox[i], &srates[0] + 1, srates.size() - 1, srates[0]); break; } for (int j = 1; j < listbox[i]->lsize(); j++) { listbox[i]->index(j); if (strstr(listbox[i]->value(), label)) break; } free(label); listbox[i]->activate(); } } break; #endif #if USE_PULSEAUDIO case SND_IDX_PULSE: inpPulseServer->activate(); scDevice[0] = scDevice[1] = inpPulseServer->value(); break; #endif case SND_IDX_NULL: scDevice[0] = scDevice[1] = ""; break; }; } fldigi-3.21.80/src/misc/0000775000175000017500000000000012313333726011653 500000000000000fldigi-3.21.80/src/misc/utf8file_io.cxx0000664000175000017500000001002612313064025014524 00000000000000// ---------------------------------------------------------------------------- // utf8file_io.cxx // // Copyright (C) 2012 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "utf8file_io.h" #include "icons.h" #define linelen 1024 //---------------------------------------------------------------------- // filter that produces, from an input stream fed by reading from fp, // a UTF-8-encoded output stream written in buffer. // Input can be UTF-8. If it is not, it is decoded with CP1252. // Output is UTF-8. // *input_was_changed is set to true if the input was not strict UTF-8 // so output differs from input. //---------------------------------------------------------------------- #include static int utf8_read_( char *buffer, int buflen, char *line, int sline, char *endline, FILE *fp, bool *input_was_changed ) { char *p, *q, multibyte[5]; int l, lp, lq, r; unsigned u; p = line; q = buffer; while (q < buffer + buflen) { if (p >= endline) { r = fread(line, 1, sline, fp); endline = line + r; if (r == 0) return q - buffer; p = line; } l = fl_utf8len1(*p); if (p + l > endline) { memmove(line, p, endline - p); endline -= (p - line); r = fread(endline, 1, sline - (endline - line), fp); endline += r; p = line; if (endline - line < l) break; } while ( l > 0) { u = fl_utf8decode(p, p+l, &lp); lq = fl_utf8encode(u, multibyte); if (lp != l || lq != l) *input_was_changed = true; if (q + lq > buffer + buflen) { memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } memcpy(q, multibyte, lq); q += lq; p += lp; l -= lp; } } memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } static const char file_encoding_warning_message[] = "Input file was not UTF-8 encoded.\n" "Text has been converted to UTF-8."; //---------------------------------------------------------------------- // Read text from a file. // utf8_input_filter accepts UTF-8 or CP1252 as input encoding. // Output is always UTF-8 encoded std::string //---------------------------------------------------------------------- int UTF8_readfile(const char *file, std::string &output) { FILE *fp; if (!(fp = fl_fopen(file, "r"))) return 1; char buffer[2 * linelen + 1], line[linelen]; char *endline = line; int l; bool input_file_was_transcoded = false; while (true) { l = utf8_read_( buffer, linelen * 2 + 1, line, linelen, endline, fp, &input_file_was_transcoded); if (l == 0) break; buffer[l] = 0; output.append(buffer); } int e = ferror(fp) ? 2 : 0; fclose(fp); if ( (!e) && input_file_was_transcoded) fl_alert2("%s", file_encoding_warning_message); return e; } //---------------------------------------------------------------------- // Write text std::string to file. // Unicode safe. //---------------------------------------------------------------------- int UTF8_writefile( const char *file, std::string &text ) { FILE *fp; if (!(fp = fl_fopen(file, "w"))) return 1; int buflen = text.length(); int r = fwrite( text.c_str(), 1, buflen, fp ); int e = (r != buflen) ? 1 : ferror(fp) ? 2 : 0; fclose(fp); return e; } fldigi-3.21.80/src/misc/dxcc.cxx0000664000175000017500000001764612313301724013247 00000000000000// ---------------------------------------------------------------------------- // dxcc.cxx // // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include "fileselect.h" #include "gettext.h" #include "dxcc.h" #include "debug.h" #include "configuration.h" #include "confdialog.h" #include "main.h" using namespace std; #ifdef __clang__ # include using std::unordered_map; #else # include using tr1::unordered_map; #endif dxcc::dxcc(const char* cn, int cq, int itu, const char* ct, float lat, float lon, float tz) : country(cn), cq_zone(cq), itu_zone(itu), latitude(lat), longitude(lon), gmt_offset(tz) { if (*ct) { continent[0] = ct[0]; continent[1] = ct[1]; } continent[2] = '\0'; } typedef unordered_map dxcc_map_t; typedef vector dxcc_list_t; static dxcc_map_t* cmap = 0; static dxcc_list_t* clist = 0; static vector* cnames = 0; static void add_prefix(string& prefix, dxcc* entry); bool dxcc_open(const char* filename) { if (cmap) return true; ifstream in(filename); if (!in) { LOG_VERBOSE("Could not read contest country file \"%s\"", filename); return false; } cmap = new dxcc_map_t; cnames = new vector; cnames->reserve(345); // approximate number of dxcc entities clist = new dxcc_list_t; clist->reserve(345); dxcc* entry; string record; unsigned nrec = 0; while (getline(in, record, ';')) { istringstream is(record); entry = new dxcc; nrec++; // read country name cnames->resize(cnames->size() + 1); clist->push_back(entry); getline(is, cnames->back(), ':'); entry->country = cnames->back().c_str(); // cq zone (is >> entry->cq_zone).ignore(); // itu zone (is >> entry->itu_zone).ignore(); // continent (is >> ws).get(entry->continent, 3).ignore(); // latitude (is >> entry->latitude).ignore(); // longitude (is >> entry->longitude).ignore(); // gmt offset (is >> entry->gmt_offset).ignore(256, '\n'); // prefixes and exceptions int c; string prefix; while ((c = is.peek()) == ' ' || c == '\r' || c == '\n') { is >> ws; while (getline(is, prefix, ',')) { add_prefix(prefix, entry); if ((c = is.peek()) == '\r' || c == '\n') break; } } in >> ws; // cr/lf after ';' } LOG_VERBOSE("Loaded %" PRIuSZ " prefixes for %u countries", cmap->size(), nrec); return true; } bool dxcc_is_open(void) { return cmap; } void dxcc_close(void) { if (!cmap) return; delete cnames; cnames = 0; map rm; for (dxcc_map_t::iterator i = cmap->begin(); i != cmap->end(); ++i) if (rm.insert(make_pair(i->second, true)).second) delete i->second; delete cmap; cmap = 0; delete clist; clist = 0; } const vector* dxcc_entity_list(void) { return clist; } const dxcc* dxcc_lookup(const char* callsign) { if (!cmap || !callsign || !*callsign) return NULL; string sstr; sstr.resize(strlen(callsign) + 1); transform(callsign, callsign + sstr.length() - 1, sstr.begin() + 1, static_cast(toupper)); // first look for a full callsign (prefixed with '=') sstr[0] = '='; dxcc_map_t::const_iterator entry = cmap->find(sstr); if (entry != cmap->end()) return entry->second; // erase the '=' and do a longest prefix search sstr.erase(0, 1); size_t len = sstr.length(); // accomodate special case for KG4... calls // all two letter suffix KG4 calls are Guantanamo // all others are US non Guantanamo if (sstr.find("KG4") != string::npos) { if (len == 4 || len == 6) { sstr = "K"; len = 1; } } do { sstr.resize(len--); if ((entry = cmap->find(sstr)) != cmap->end()) return entry->second; } while (len); return NULL; } static void add_prefix(string& prefix, dxcc* entry) { string::size_type i = prefix.find_first_of("([<{"); if (likely(i == string::npos)) { (*cmap)[prefix] = entry; return; } string::size_type j = i, first = i; do { entry = new struct dxcc(*entry); switch (prefix[i++]) { // increment i past opening bracket case '(': if ((j = prefix.find(')', i)) == string::npos) { delete entry; return; } prefix[j] = '\0'; entry->cq_zone = atoi(prefix.data() + i); break; case '[': if ((j = prefix.find(']', i)) == string::npos) { delete entry; return; } prefix[j] = '\0'; entry->itu_zone = atoi(prefix.data() + i); break; case '<': if ((j = prefix.find('/', i)) == string::npos) { delete entry; return; } prefix[j] = '\0'; entry->latitude = atof(prefix.data() + i); if ((j = prefix.find('>', j)) == string::npos) { delete entry; return; } prefix[j] = '\0'; entry->longitude = atof(prefix.data() + i); break; case '{': if ((j = prefix.find('}', i)) == string::npos) { delete entry; return; } memcpy(entry->continent, prefix.data() + i, 2); break; } } while ((i = prefix.find_first_of("([<{", j)) != string::npos); prefix.erase(first); (*cmap)[prefix] = entry; } typedef unordered_map qsl_map_t; static qsl_map_t* qsl_calls; static unsigned char qsl_open_; const char* qsl_names[] = { "LoTW", "eQSL" }; bool qsl_open(const char* filename, qsl_t qsl_type) { ifstream in(filename); if (!in) return false; if (!qsl_calls) qsl_calls = new qsl_map_t; size_t n = qsl_calls->size(); string::size_type p; string s; s.reserve(32); while (getline(in, s)) { if ((p = s.rfind('\r')) != string::npos) s.erase(p); (*qsl_calls)[s] |= (1 << qsl_type); } LOG_VERBOSE("Added %" PRIuSZ " %s callsigns from \"%s\"", qsl_calls->size() - n, qsl_names[qsl_type], filename); qsl_open_ |= (1 << qsl_type); return true; } unsigned char qsl_is_open(void) { return qsl_open_; } void qsl_close(void) { delete qsl_calls; qsl_calls = 0; qsl_open_ = 0; } unsigned char qsl_lookup(const char* callsign) { if (qsl_calls == 0) return 0; string str; str.resize(strlen(callsign)); transform(callsign, callsign + str.length(), str.begin(), static_cast(toupper)); qsl_map_t::const_iterator i = qsl_calls->find(str); return i == qsl_calls->end() ? 0 : i->second; } void reload_cty_dat() { dxcc_close(); dxcc_open(string(progdefaults.cty_dat_pathname).append("cty.dat").c_str()); qsl_close(); qsl_open(string(progdefaults.cty_dat_pathname).append("lotw1.txt").c_str(), QSL_LOTW); if (!qsl_open(string(progdefaults.cty_dat_pathname).append("eqsl.txt").c_str(), QSL_EQSL)) qsl_open(string(progdefaults.cty_dat_pathname).append("AGMemberList.txt").c_str(), QSL_EQSL); } void default_cty_dat_pathname() { progdefaults.cty_dat_pathname = HomeDir; txt_cty_dat_pathname->value(progdefaults.cty_dat_pathname.c_str()); } void select_cty_dat_pathname() { string deffilename = progdefaults.cty_dat_pathname; const char *p = FSEL::select(_("Locate cty.dat"), _("cty.dat\t*"), deffilename.c_str()); if (p) { string nupath = p; size_t endslash = nupath.rfind("/"); if ((endslash != string::npos) && (endslash != (nupath.length()-1))) nupath.erase(endslash + 1); progdefaults.cty_dat_pathname = nupath; progdefaults.changed = true; txt_cty_dat_pathname->value(nupath.c_str()); } } fldigi-3.21.80/src/misc/locator.c0000664000175000017500000004146512313064025013405 00000000000000/** * \addtogroup utilities * @{ */ /** * \file src/locator.c * \brief locator and bearing conversion interface * \author Stephane Fillod and the Hamlib Group * \date 2000-2006 * * Hamlib Interface - locator, bearing, and conversion calls */ /* * Hamlib Interface - locator and bearing conversion calls * Copyright (c) 2001-2006 by Stephane Fillod * Copyright (c) 2003 by Nate Bargmann * Copyright (c) 2003 by Dave Hines * * $Id$ * * Code to determine bearing and range was taken from the Great Circle, * by S. R. Sampson, N5OWK. * Ref: "Air Navigation", Air Force Manual 51-40, 1 February 1987 * Ref: "ARRL Satellite Experimenters Handbook", August 1990 * * Code to calculate distance and azimuth between two Maidenhead locators, * taken from wwl, by IK0ZSN Mirko Caserta. * * New bearing code added by N0NB was found at: * http://williams.best.vwh.net/avform.htm#Crs * * * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This 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 Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /*! \page hamlib Hamlib general purpose API * * Here are grouped some often used functions, like locator conversion * routines. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "locator.h" #ifndef DOC_HIDDEN #define RADIAN (180.0 / M_PI) /* arc length for 1 degree, 60 Nautical Miles */ #define ARC_IN_KM 111.2 /* The following is contributed by Dave Hines M1CXW * * begin dph */ /* * These are the constants used when converting between Maidenhead grid * locators and longitude/latitude values. MAX_LOCATOR_PAIRS is the maximum * number of locator character pairs to convert. This number MUST NOT exceed * the number of pairs of values in loc_char_range[]. * Setting MAX_LOCATOR_PAIRS to 3 will convert the currently defined 6 * character locators. A value of 4 will convert the extended 8 character * locators described in section 3L of "The IARU region 1 VHF managers * handbook". Values of 5 and 6 will extent the format even more, to the * longest definition I have seen for locators, see * http://www.btinternet.com/~g8yoa/geog/non-ra.html * Beware that there seems to be no universally accepted standard for 10 & 12 * character locators. * * The ranges of characters which will be accepted by locator2longlat, and * generated by longlat2locator, are specified by the loc_char_range[] array. * This array may be changed without requiring any other code changes. * * For the fifth pair to range from aa to xx use: * const static int loc_char_range[] = { 18, 10, 24, 10, 24, 10 }; * * For the fifth pair to range from aa to yy use: * const static int loc_char_range[] = { 18, 10, 24, 10, 25, 10 }; * * MAX_LOCATOR_PAIRS now sets the limit locator2longlat() will convert and * sets the maximum length longlat2locator() will generate. Each function * properly handles any value from 1 to 6 so MAX_LOCATOR_PAIRS should be * left at 6. MIN_LOCATOR_PAIRS sets a floor on the shortest locator that * should be handled. -N0NB */ const static int loc_char_range[] = { 18, 10, 24, 10, 24, 10 }; #define MAX_LOCATOR_PAIRS 6 #define MIN_LOCATOR_PAIRS 1 /* end dph */ #endif /* !DOC_HIDDEN */ /** * \brief Convert DMS to decimal degrees * \param degrees Degrees, whole degrees * \param minutes Minutes, whole minutes * \param seconds Seconds, decimal seconds * \param sw South or West * * Convert degree/minute/second angle to decimal degrees angle. * \a degrees >360, \a minutes > 60, and \a seconds > 60.0 are allowed, * but resulting angle won't be normalized. * * When the variable sw is passed a value of 1, the returned decimal * degrees value will be negative (south or west). When passed a * value of 0 the returned decimal degrees value will be positive * (north or east). * * \return The angle in decimal degrees. * * \sa dec2dms() */ double HAMLIB_API dms2dec(int degrees, int minutes, double seconds, int sw) { double st; if (degrees < 0) degrees = abs(degrees); if (minutes < 0) minutes = abs(minutes); if (seconds < 0) seconds = fabs(seconds); st = (double)degrees + (double)minutes / 60. + seconds / 3600.; if (sw == 1) return -st; else return st; } /** * \brief Convert D M.MMM notation to decimal degrees * \param degrees Degrees, whole degrees * \param minutes Minutes, decimal minutes * \param sw South or West * * Convert a degrees, decimal minutes notation common on * many GPS units to its decimal degrees value. * * \a degrees > 360, \a minutes > 60.0 are allowed, but * resulting angle won't be normalized. * * When the variable sw is passed a value of 1, the returned decimal * degrees value will be negative (south or west). When passed a * value of 0 the returned decimal degrees value will be positive * (north or east). * * \return The angle in decimal degrees. * * \sa dec2dmmm() */ double HAMLIB_API dmmm2dec(int degrees, double minutes, int sw) { double st; if (degrees < 0) degrees = abs(degrees); if (minutes < 0) minutes = fabs(minutes); st = (double)degrees + minutes / 60.; if (sw == 1) return -st; else return st; } /** * \brief Convert decimal degrees angle into DMS notation * \param dec Decimal degrees * \param degrees Pointer for the calculated whole Degrees * \param minutes Pointer for the calculated whole Minutes * \param seconds Pointer for the calculated decimal Seconds * \param sw Pointer for the calculated SW flag * * Convert decimal degrees angle into its degree/minute/second * notation. * * When \a dec < -180 or \a dec > 180, the angle will be normalized * within these limits and the sign set appropriately. * * Upon return dec2dms guarantees 0 >= \a degrees <= 180, * 0 >= \a minutes < 60, and 0.0 >= \a seconds < 60.0. * * When \a dec is < 0.0 \a sw will be set to 1. When \a dec is * >= 0.0 \a sw will be set to 0. This flag allows the application * to determine whether the DMS angle should be treated as negative * (south or west). * * \retval -RIG_EINVAL if any of the pointers are NULL. * \retval RIG_OK if conversion went OK. * * \sa dms2dec() */ int HAMLIB_API dec2dms(double dec, int *degrees, int *minutes, double *seconds, int *sw) { int deg, min; double st; /* bail if NULL pointers passed */ if (!degrees || !minutes || !seconds || !sw) return -RIG_EINVAL; /* reverse the sign if dec has a magnitude greater * than 180 and factor out multiples of 360. * e.g. when passed 270 st will be set to -90 * and when passed -270 st will be set to 90. If * passed 361 st will be set to 1, etc. If passed * a value > -180 || < 180, value will be unchanged. */ if (dec >= 0.0) st = fmod(dec + 180, 360) - 180; else st = fmod(dec - 180, 360) + 180; /* if after all of that st is negative, we want deg * to be negative as well except for 180 which we want * to be positive. */ if (st < 0.0 && st != -180) *sw = 1; else *sw = 0; /* work on st as a positive value to remove a * bug introduced by the effect of floor() when * passed a negative value. e.g. when passed * -96.8333 floor() returns -95! Also avoids * a rounding error introduced on negative values. */ st = fabs(st); deg = (int)floor(st); st = 60. * (st - (double)deg); min = (int)floor(st); st = 60. * (st - (double)min); *degrees = deg; *minutes = min; *seconds = st; return RIG_OK; } /** * \brief Convert a decimal angle into D M.MMM notation * \param dec Decimal degrees * \param degrees Pointer for the calculated whole Degrees * \param minutes Pointer for the calculated decimal Minutes * \param sw Pointer for the calculated SW flag * * Convert a decimal angle into its degree, decimal minute * notation common on many GPS units. * * When passed a value < -180 or > 180, the value will be normalized * within these limits and the sign set apropriately. * * Upon return dec2dmmm guarantees 0 >= \a degrees <= 180, * 0.0 >= \a minutes < 60.0. * * When \a dec is < 0.0 \a sw will be set to 1. When \a dec is * >= 0.0 \a sw will be set to 0. This flag allows the application * to determine whether the D M.MMM angle should be treated as negative * (south or west). * * \retval -RIG_EINVAL if any of the pointers are NULL. * \retval RIG_OK if conversion went OK. * * \sa dmmm2dec() */ int HAMLIB_API dec2dmmm(double dec, int *degrees, double *minutes, int *sw) { int r, min; double sec; /* bail if NULL pointers passed */ if (!degrees || !minutes || !sw) return -RIG_EINVAL; r = dec2dms(dec, degrees, &min, &sec, sw); if (r != RIG_OK) return r; *minutes = (double)min + sec / 60; return RIG_OK; } /** * \brief Convert Maidenhead grid locator to Longitude/Latitude * \param longitude Pointer for the calculated Longitude * \param latitude Pointer for the calculated Latitude * \param locator The Maidenhead grid locator--2 through 12 char + nul string * * Convert Maidenhead grid locator to Longitude/Latitude (decimal degrees). * The locator should be in 2 through 12 chars long format. * \a locator2longlat is case insensitive, however it checks for * locator validity. * * Decimal long/lat is computed to center of grid square, i.e. given * EM19 will return coordinates equivalent to the southwest corner * of EM19mm. * * \retval -RIG_EINVAL if locator exceeds RR99xx99xx99 or exceeds length * limit--currently 1 to 6 lon/lat pairs. * \retval RIG_OK if conversion went OK. * * \bug The fifth pair ranges from aa to xx, there is another convention * that ranges from aa to yy. At some point both conventions should be * supported. * * \sa longlat2locator() */ /* begin dph */ int HAMLIB_API locator2longlat(double *longitude, double *latitude, const char *locator) { int x_or_y, paircount; int locvalue, pair; int divisions; double xy[2], ordinate; /* bail if NULL pointers passed */ if (!longitude || !latitude) return -RIG_EINVAL; paircount = strlen(locator) / 2; /* verify paircount is within limits */ if (paircount > MAX_LOCATOR_PAIRS) paircount = MAX_LOCATOR_PAIRS; else if (paircount < MIN_LOCATOR_PAIRS) return -RIG_EINVAL; /* For x(=longitude) and y(=latitude) */ for (x_or_y = 0; x_or_y < 2; ++x_or_y) { ordinate = -90.0; divisions = 1; for (pair = 0; pair < paircount; ++pair) { locvalue = locator[pair*2 + x_or_y]; /* Value of digit or letter */ locvalue -= (loc_char_range[pair] == 10) ? '0' : (isupper(locvalue)) ? 'A' : 'a'; /* Check range for non-letter/digit or out of range */ if ((locvalue < 0) || (locvalue >= loc_char_range[pair])) return -RIG_EINVAL; divisions *= loc_char_range[pair]; ordinate += locvalue * 180.0 / divisions; } /* Center ordinate in the Maidenhead "square" or "subsquare" */ ordinate += 90.0 / divisions; xy[x_or_y] = ordinate; } *longitude = xy[0] * 2.0; *latitude = xy[1]; return RIG_OK; } /* end dph */ /** * \brief Convert longitude/latitude to Maidenhead grid locator * \param longitude Longitude, decimal degrees * \param latitude Latitude, decimal degrees * \param locator Pointer for the Maidenhead Locator * \param pair_count Precision expressed as lon/lat pairs in the locator * * Convert longitude/latitude (decimal degrees) to Maidenhead grid locator. * \a locator must point to an array at least \a pair_count * 2 char + '\\0'. * * \retval -RIG_EINVAL if \a locator is NULL or \a pair_count exceeds * length limit. Currently 1 to 6 lon/lat pairs. * \retval RIG_OK if conversion went OK. * * \bug \a locator is not tested for overflow. * \bug The fifth pair ranges from aa to yy, there is another convention * that ranges from aa to xx. At some point both conventions should be * supported. * * \sa locator2longlat() */ /* begin dph */ int HAMLIB_API longlat2locator(double longitude, double latitude, char *locator, int pair_count) { int x_or_y, pair, locvalue, divisions; double square_size, ordinate; if (!locator) return -RIG_EINVAL; if (pair_count < MIN_LOCATOR_PAIRS || pair_count > MAX_LOCATOR_PAIRS) return -RIG_EINVAL; for (x_or_y = 0; x_or_y < 2; ++x_or_y) { ordinate = (x_or_y == 0) ? longitude / 2.0 : latitude; divisions = 1; /* The 1e-6 here guards against floating point rounding errors */ ordinate = fmod(ordinate + 270.000001, 180.0); for (pair = 0; pair < pair_count; ++pair) { divisions *= loc_char_range[pair]; square_size = 180.0 / divisions; locvalue = (int) (ordinate / square_size); ordinate -= square_size * locvalue; locvalue += (loc_char_range[pair] == 10) ? '0':'A'; locator[pair * 2 + x_or_y] = locvalue; } } locator[pair_count * 2] = '\0'; return RIG_OK; } /* end dph */ /** * \brief Calculate the distance and bearing between two points. * \param lon1 The local Longitude, decimal degrees * \param lat1 The local Latitude, decimal degrees * \param lon2 The remote Longitude, decimal degrees * \param lat2 The remote Latitude, decimal degrees * \param distance Pointer for the distance, km * \param azimuth Pointer for the bearing, decimal degrees * * Calculate the QRB between \a lon1, \a lat1 and \a lon2, \a lat2. * * This version will calculate the QRB to a precision sufficient * for 12 character locators. Antipodal points, which are easily * calculated, are considered equidistant and the bearing is * simply resolved to be true north (0.0°). * * \retval -RIG_EINVAL if NULL pointer passed or lat and lon values * exceed -90 to 90 or -180 to 180. * \retval RIG_OK if calculations are successful. * * \return The distance in kilometers and azimuth in decimal degrees * for the short path are stored in \a distance and \a azimuth. * * \sa distance_long_path(), azimuth_long_path() */ int HAMLIB_API qrb(double lon1, double lat1, double lon2, double lat2, double *distance, double *azimuth) { double delta_long, tmp, arc, az; /* bail if NULL pointers passed */ if (!distance || !azimuth) return -RIG_EINVAL; if ((lat1 > 90.0 || lat1 < -90.0) || (lat2 > 90.0 || lat2 < -90.0)) return -RIG_EINVAL; if ((lon1 > 180.0 || lon1 < -180.0) || (lon2 > 180.0 || lon2 < -180.0)) return -RIG_EINVAL; /* Prevent ACOS() Domain Error */ if (lat1 == 90.0) lat1 = 89.999999999; else if (lat1 == -90.0) lat1 = -89.999999999; if (lat2 == 90.0) lat2 = 89.999999999; else if (lat2 == -90.0) lat2 = -89.999999999; /* Convert variables to Radians */ lat1 /= RADIAN; lon1 /= RADIAN; lat2 /= RADIAN; lon2 /= RADIAN; delta_long = lon2 - lon1; tmp = sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(delta_long); if (tmp > .999999999999999) { /* Station points coincide, use an Omni! */ *distance = 0.0; *azimuth = 0.0; return RIG_OK; } if (tmp < -.999999) { /* * points are antipodal, it's straight down. * Station is equal distance in all Azimuths. * So take 180 Degrees of arc times 60 nm, * and you get 10800 nm, or whatever units... */ *distance = 180.0 * ARC_IN_KM; *azimuth = 0.0; return RIG_OK; } arc = acos(tmp); /* * One degree of arc is 60 Nautical miles * at the surface of the earth, 111.2 km, or 69.1 sm * This method is easier than the one in the handbook */ *distance = ARC_IN_KM * RADIAN * arc; /* Short Path */ /* Change to azimuth computation by Dave Freese, W1HKJ */ az = RADIAN * atan2(sin(lon2 - lon1) * cos(lat2), (cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon2 - lon1))); az = fmod(360.0 + az, 360.0); if (az < 0.0) az += 360.0; else if (az >= 360.0) az -= 360.0; *azimuth = floor(az + 0.5); return RIG_OK; } /** * \brief Calculate the long path distance between two points. * \param distance The shortpath distance * * Calculate the long path (respective of the short path) * of a given distance. * * \return the distance in kilometers for the opposite path. * * \sa qrb() */ double HAMLIB_API distance_long_path(double distance) { return (ARC_IN_KM * 360.0) - distance; } /** * \brief Calculate the long path bearing between two points. * \param azimuth The shortpath bearing * * Calculate the long path (respective of the short path) * of a given bearing. * * \return the azimuth in decimal degrees for the opposite path. * * \sa qrb() */ double HAMLIB_API azimuth_long_path(double azimuth) { return azimuth + (azimuth <= 180.0 ? 180.0 : -180.0); } /*! @} */ fldigi-3.21.80/src/misc/record_loader.cxx0000664000175000017500000003320012313064025015112 00000000000000// ---------------------------------------------------------------------------- // record_loader.cxx // // Copyright (C) 2013 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #ifdef __MINGW32__ # include "compat.h" #endif #include "record_loader.h" #include "record_browse.h" #include "debug.h" #include "main.h" #include "icons.h" #include "fl_digi.h" #include "strutil.h" #include "gettext.h" #include "network.h" #include #include #include #include #include "FL/Fl_Double_Window.H" #include "FL/Fl_Output.H" #include "FL/fl_ask.H" #include "FL/Fl_Check_Button.H" Fl_Double_Window *dlgRecordLoader = (Fl_Double_Window *)0; /// Loads a file and stores it for later lookup. int RecordLoaderInterface::LoadAndRegister() { Clear(); std::string filnam = storage_filename().first; time_t cntTim = time(NULL); LOG_INFO("Opening:%s", filnam.c_str()); std::ifstream ifs( filnam.c_str() ); /// Reuse the same string for each new record. std::string input_str ; size_t nbRec = 0 ; while( ! ifs.eof() ) { if( ! std::getline( ifs, input_str ) ) break; /// Comments are legal with # as first character. if( input_str[0] == '#' ) continue; imemstream str_strm( input_str ); try { if( ReadRecord( str_strm ) ) { ++nbRec; } else { LOG_WARN( "Cannot process '%s'", input_str.c_str() ); } } catch(const std::exception & exc) { LOG_WARN( "%s: Caught <%s> when reading '%s'", base_filename().c_str(), exc.what(), input_str.c_str() ); return -1 ; } } ifs.close(); LOG_INFO( "Read:%s with %d records in %d seconds", filnam.c_str(), static_cast(nbRec), static_cast( time(NULL) - cntTim ) ); return nbRec ; } // ---------------------------------------------------------------------------- struct Row { Fl_Output * m_timestamp ; Fl_Check_Button * m_select ; Fl_Output * m_content_size ; Fl_Output * m_nb_rows ; Fl_Button * m_url ; RecordLoaderInterface * m_itf ; bool UpdateRow() { const std::string str = m_itf->Timestamp(); m_timestamp->value(str.c_str()); const std::string & strSz = m_itf->ContentSize(); m_content_size->value(strSz.c_str()); int nb_recs = m_itf->LoadAndRegister(); char nb_recs_str[64]; bool isGood = ( nb_recs >= 0 ); if( isGood ) sprintf( nb_recs_str, "%6d", nb_recs ); else strcpy( nb_recs_str, " N/A" ); m_nb_rows->value(nb_recs_str); const char * strurl = m_itf->Url(); if( strurl != NULL ) { const std::string strnam = m_itf->base_filename(); m_url->tooltip( strurl ); } if (dlgRecordLoader) dlgRecordLoader->damage(); return isGood ; } }; /// Array all data loaders. It is setup at start time. static Row * all_recs = NULL ; /// Number of data loaders, it is a very small integer. static int dataloader_nb = 0 ; static const int nb_cols = 5 ; // ---------------------------------------------------------------------------- /// This is a virtual class, therefore it must have a default constructor. RecordLoaderInterface::RecordLoaderInterface() { ++dataloader_nb ; /// We prefer tp use realloc because it is ready before main() is called. all_recs = (Row *)realloc( all_recs, dataloader_nb * sizeof( Row ) ); all_recs[ dataloader_nb - 1 ].m_itf = this ; } /// This happens very rarely, so performance is not an issue. RecordLoaderInterface::~RecordLoaderInterface() { for( int i = 0; i < dataloader_nb; ++i ) { if( all_recs[i].m_itf == this ) { memmove( all_recs + i, all_recs + i + 1, sizeof( Row ) * ( dataloader_nb - i - 1 ) ); --dataloader_nb ; return ; } } LOG_ERROR("Inconsistent %d", dataloader_nb ); } /// This takes only the filename from the complete HTTP or FTP URL, or file path. std::string RecordLoaderInterface::base_filename() const { const char * pFil = strrchr( Url(), '/' ); if( pFil == NULL ) pFil = Url(); else ++pFil ; /// This might be an URL so we take only the beginning. const char * quest = strchr( pFil, '?' ); if( quest == NULL ) quest = pFil + strlen(pFil); return std::string( pFil, quest ); } std::pair< std::string, bool > RecordLoaderInterface::storage_filename(bool create_dir) const { /// We check if it is changed, it is not performance-critical. if( create_dir ) { if( ask_dir_creation( DATA_dir ) ) { const char * err = create_directory( DATA_dir.c_str() ); if( err ) { fl_alert("Error:%s",err); } } } std::string filnam_data = DATA_dir; filnam_data.append(base_filename()); if( create_dir ) { return std::make_pair( filnam_data, false ); } /// This is for a read access. std::ifstream ifs( filnam_data.c_str() ); if( ifs ) { ifs.close(); return std::make_pair( filnam_data, false ); } if( errno != ENOENT ) { LOG_WARN( "Cannot read '%s': %s", filnam_data.c_str(), strerror(errno) ); } // Second try with a file maybe installed by "make install". std::string filnam_inst = PKGDATADIR "/" + base_filename(); LOG_INFO("Errno=%s with %s. Trying %s", strerror(errno), filnam_data.c_str(), filnam_inst.c_str() ); ifs.open( filnam_inst.c_str() ); if( ifs ) { ifs.close(); return std::make_pair( filnam_inst, true ); } /// But the file is not there. return std::make_pair( filnam_data, false ); } std::string RecordLoaderInterface::Timestamp() const { std::string filnam = storage_filename().first; struct stat st; if (stat(filnam.c_str(), &st) == -1 ) return "N/A"; struct tm tmLastMod = *localtime( & st.st_mtime ); char buf[64]; sprintf(buf, "%d/%d/%d %02d:%02d", tmLastMod.tm_year + 1900, tmLastMod.tm_mon + 1, tmLastMod.tm_mday, tmLastMod.tm_hour, tmLastMod.tm_min ); return buf ; } std::string RecordLoaderInterface::ContentSize() const { /// It would be faster to cache this result in the object. std::string filnam = storage_filename().first; struct stat st; if (stat(filnam.c_str(), &st) == -1 ) return " N/A"; char buf[64]; sprintf(buf, "%9" PRIuSZ, (size_t)st.st_size ); return buf ; } // ---------------------------------------------------------------------------- static void cb_record_url(Fl_Widget *w, void* ptr) { const RecordLoaderInterface * it = static_cast< const RecordLoaderInterface * >(ptr); cb_mnuVisitURL( NULL, const_cast< char * >( it->Url() ) ); } void DerivedRecordLst::AddRow( int row ) { Row * ptRow = all_recs + row ; int X,Y,W,H; int col=0; { col_width( col, 110 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); ptRow->m_timestamp = new Fl_Output(X,Y,W,H); ptRow->m_timestamp->tooltip( _("Data file creation date") ); } ++col; { col_width( col, 16 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); ptRow->m_select = new Fl_Check_Button(X,Y,W,H); ptRow->m_select->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE); ptRow->m_select->value(1); } ++col; { col_width( col, 80 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); ptRow->m_content_size = new Fl_Output(X,Y,W,H); ptRow->m_content_size->tooltip( _("Size in bytes") ); } ++col; { col_width( col, 50 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); ptRow->m_nb_rows = new Fl_Output(X,Y,W,H); ptRow->m_nb_rows->tooltip( _("Number of lines in data file") ); } ++col; { col_width( col, 166 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); const char * strurl = ptRow->m_itf->Url(); ptRow->m_url = NULL ; if( strurl != NULL ) { const std::string strnam = ptRow->m_itf->base_filename(); ptRow->m_url = new Fl_Button(X,Y,W,H, strdup(strnam.c_str()) ); ptRow->m_url->tooltip( strurl ); ptRow->m_url->callback(cb_record_url, ptRow->m_itf); } } ptRow->UpdateRow(); } DerivedRecordLst::DerivedRecordLst(int x, int y, int w, int h, const char *title) : Fl_Table(x,y,w,h,title) { col_header(1); col_resize(1); col_header_height(25); row_header(1); row_resize(0); row_header_width(105); rows(dataloader_nb); cols(nb_cols); begin(); // start adding widgets to group { for( int row = 0; row < dataloader_nb; ++row ) { AddRow( row ); } } end(); } DerivedRecordLst::~DerivedRecordLst() { } // Handle drawing all cells in table void DerivedRecordLst::draw_cell(TableContext context, int R, int C, int X, int Y, int W, int H) { switch ( context ) { case CONTEXT_STARTPAGE: fl_font(FL_HELVETICA, 12); // font used by all headers break; case CONTEXT_RC_RESIZE: { int X, Y, W, H; int index = 0; for ( int r = 0; r= children() ) break; find_cell(CONTEXT_TABLE, r, c, X, Y, W, H); child(index++)->resize(X,Y,W,H); } } init_sizes(); // tell group children resized return; } case CONTEXT_ROW_HEADER: fl_push_clip(X, Y, W, H); { RecordLoaderInterface * it = ( (R >= 0) && ( R < dataloader_nb ) ) ? all_recs[ R ].m_itf : NULL; if( it == NULL ) { LOG_ERROR("R=%d",R); return; } const char * str = it ? it->Description() : "Unknown" ; fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, row_header_color()); fl_color(FL_BLACK); fl_draw(str, X, Y, W, H, FL_ALIGN_CENTER); } fl_pop_clip(); return; case CONTEXT_COL_HEADER: fl_push_clip(X, Y, W, H); { static const char * col_names[nb_cols] = { _("Timestamp"), _(" "), _("Size"), _("# recs"), _("WWW"), }; const char * title = ( ( C >= 0 ) && ( C < nb_cols ) ) ? col_names[C] : "?" ; fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, col_header_color()); fl_color(FL_BLACK); fl_draw(title, X, Y, W, H, FL_ALIGN_CENTER); } fl_pop_clip(); return; case CONTEXT_CELL: // fl_push_clip(X, Y, W, H); return; // fltk handles drawing the widgets default: return; } } void DerivedRecordLst::cbGuiUpdate() { std::string server = inpDataSources->value(); if( server.empty() ) { fl_alert(_("No server selected")); return ; } if( server[server.size()-1] != '/' ) server += '/' ; for( int row = 0; row < dataloader_nb; ++row ) { Row * ptrRow = all_recs + row; if( ! ptrRow->m_select->value() ) continue ; RecordLoaderInterface * it = ptrRow->m_itf; std::string url = server + it->base_filename(); std::string reply ; double timeout=600.0; // Consider truncating the HTTP header. int res = fetch_http_gui(url, reply, timeout ); LOG_INFO("Loaded %s : %d chars. res=%d", url.c_str(), (int)reply.size(), res ); if( ! res ) { int ok = fl_choice2( _("Could not download %s"), _("Continue"), _("Stop"), NULL, url.c_str() ); if( ok == 1 ) break ; continue ; } static const char *notFound404 = "HTTP/1.1 404 Not Found"; if( 0 == strncmp( reply.c_str(), notFound404, strlen(notFound404) ) ) { int ok = fl_choice2( _("Non-existent URL: %s"), _("Continue"), _("Stop"), NULL, url.c_str() ); if( ok == 1 ) break ; continue ; } /// This creates the directory if necessary; std::string filnam = it->storage_filename(true).first; std::ofstream ofstrm( filnam.c_str() ); if( ofstrm ) ofstrm.write( &reply[0], reply.size() ); if( ! ofstrm ) { int ok = fl_choice2( _("Error saving %s to %s:%s"), _("Continue"), _("Stop"), NULL, url.c_str(), filnam.c_str(), strerror(errno) ); if( ok == 1 ) break ; continue ; } ofstrm.close(); bool isGood = all_recs[row].UpdateRow(); if( ! isGood ) { int ok = fl_choice2( _("Error loading %s to %s: %s."), _("Continue"), _("Stop"), NULL, url.c_str(), filnam.c_str(), strerror(errno) ); if( ok == 0 ) break ; continue ; } } btnDataSourceUpdate->value(0); } void DerivedRecordLst::cbGuiReset() { fprintf(stderr, "%s\n", __FUNCTION__ ); for( int row = 0; row < dataloader_nb; ++row ) { Row * ptrRow = all_recs + row; if( ! ptrRow->m_select->value() ) continue ; RecordLoaderInterface * it = ptrRow->m_itf; std::pair< std::string, bool > stofil_pair = it->storage_filename(true); it->Clear(); const char * stofil = stofil_pair.first.c_str() ; if( stofil_pair.second ) { fl_alert("Cannot erase installed data file %s", stofil ); continue ; } else { LOG_INFO("Erasing %s", stofil ); int res = ::remove( stofil ); if( ( res != 0 ) && ( res != ENOENT ) ) { fl_alert("Error erasing data file %s:%s", stofil, strerror(errno) ); continue ; } all_recs[row].UpdateRow(); } } } // ---------------------------------------------------------------------------- /// Necessary because in a Fl_Menu, a slash has a special meaning. static std::string fl_escape( const char * str ) { std::string res ; for( char ch ; ( ch = *str ) != '\0' ; ++str ) { if( ch == '/' ) res += '\\'; res += ch ; } return res ; } static void fl_input_add( const char * str ) { inpDataSources->add( fl_escape( str ).c_str() ); } void createRecordLoader() { if (dlgRecordLoader) return; dlgRecordLoader = make_record_loader_window(); fl_input_add("http://www.w1hkj.com/support_files/"); fl_input_add("http://primhillcomputers.com/fldigi/data"); inpDataSources->value(0); } // ---------------------------------------------------------------------------- fldigi-3.21.80/src/misc/benchmark.cxx0000664000175000017500000001650412313064025014250 00000000000000// ---------------------------------------------------------------------------- // benchmark.cxx // // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #ifndef __MINGW32__ # include #else # include "compat.h" #endif #if USE_SNDFILE # include #endif #include "fl_digi.h" #include "modem.h" #include "trx.h" #include "timeops.h" #include "configuration.h" #include "status.h" #include "debug.h" #include "benchmark.h" using namespace std; struct benchmark_params benchmark = { MODE_PSK31, 1000, false, false, 0.0, 1.0, SRC_SINC_FASTEST }; int setup_benchmark(void) { ENSURE_THREAD(FLMAIN_TID); if (benchmark.input.empty()) { LOG_ERROR("Missing input"); return 1; } else { char* p; benchmark.samples = (size_t)strtol(benchmark.input.c_str(), &p, 10); if (*p != '\0') { // invalid char in input string #if USE_SNDFILE // treat as filename benchmark.samples = 0; #else LOG_ERROR("Bad input string, \"%s\"", benchmark.input.c_str()); return 1; #endif } } if (!benchmark.output.empty()) benchmark.buffer.reserve(BUFSIZ); progdefaults.rsid = false; progdefaults.StartAtSweetSpot = false; if (benchmark.modem != NUM_MODES) progStatus.lastmode = benchmark.modem; if (benchmark.freq) progStatus.carrier = benchmark.freq; progStatus.afconoff = benchmark.afc; progStatus.sqlonoff = benchmark.sql; progStatus.sldrSquelchValue = benchmark.sqlevel; debug::level = debug::INFO_LEVEL; TRX_WAIT(STATE_ENDED, trx_start(); init_modem(progStatus.lastmode)); if (!benchmark.output.empty()) { ofstream out(benchmark.output.c_str()); if (out) out << benchmark.buffer; } return 0; } #if USE_SNDFILE SNDFILE* infile = 0; #endif static size_t do_rx(struct rusage ru[2], struct timespec wall_time[2]); static size_t do_rx_src(struct rusage ru[2], struct timespec wall_time[2]); void do_benchmark(void) { ENSURE_THREAD(TRX_TID); if (benchmark.src_ratio != 1.0) LOG_INFO("modem=%" PRIdPTR " (%s) rate=%d ratio=%f converter=%d (\"%s\")", active_modem->get_mode(), mode_info[active_modem->get_mode()].sname, active_modem->get_samplerate(), benchmark.src_ratio, benchmark.src_type, src_get_name(benchmark.src_type)); else LOG_INFO("modem=%" PRIdPTR " (%s) rate=%d", active_modem->get_mode(), mode_info[active_modem->get_mode()].sname, active_modem->get_samplerate()); #if USE_SNDFILE if (!benchmark.samples) { SF_INFO info = { 0, 0, 0, 0, 0, 0 }; if ((infile = sf_open(benchmark.input.c_str(), SFM_READ, &info)) == NULL) { LOG_ERROR("Could not open input file \"%s\"", benchmark.input.c_str()); return; } } #endif struct rusage ru[2]; struct timespec wall_time[2]; size_t nproc, nrx; if (benchmark.src_ratio == 1.0) nrx = nproc = do_rx(ru, wall_time); else { nproc = do_rx_src(ru, wall_time); nrx = (size_t)(nproc * benchmark.src_ratio); } ru[1].ru_utime -= ru[0].ru_utime; wall_time[1] -= wall_time[0]; #if USE_SNDFILE if (infile) { sf_close(infile); infile = 0; } #endif LOG_INFO("processed: %" PRIuSZ " samples (decoded %" PRIuSZ ") in %.3f seconds", nproc, nrx, wall_time[1].tv_sec + wall_time[1].tv_nsec / 1e9); double speed = nproc / (ru[1].ru_utime.tv_sec + ru[1].ru_utime.tv_usec / 1e6); LOG_INFO("cpu time : %" PRIdMAX ".%03" PRIdMAX "; speed=%.3f samples/s; factor=%.3f", (intmax_t)ru[1].ru_utime.tv_sec, (intmax_t)ru[1].ru_utime.tv_usec / 1000, speed, speed / active_modem->get_samplerate()); } // ---------------------------------------------------------------------------- static size_t do_rx(struct rusage ru[2], struct timespec wall_time[2]) { size_t nread; size_t inlen = 1 << 19; double* inbuf = new double[inlen]; #if USE_SNDFILE if (infile) { nread = 0; clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); getrusage(RUSAGE_SELF, &ru[0]); for (size_t n; (n = sf_readf_double(infile, inbuf, inlen)); nread += n) active_modem->rx_process(inbuf, n); } else #endif { memset(inbuf, 0, sizeof(double) * inlen); clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); getrusage(RUSAGE_SELF, &ru[0]); for (nread = benchmark.samples; nread > inlen; nread -= inlen) active_modem->rx_process(inbuf, inlen); if (nread) active_modem->rx_process(inbuf, nread); nread = benchmark.samples; } getrusage(RUSAGE_SELF, &ru[1]); clock_gettime(CLOCK_MONOTONIC, &wall_time[1]); delete [] inbuf; return nread; } size_t inlen = 1 << 19; static float* inbuf = 0; static long src_read(void* arg, float** data) { *data = inbuf; return inlen; } #if USE_SNDFILE static long src_readf(void* arg, float** data) { long n = (long)sf_readf_float(infile, inbuf, inlen); *data = n ? inbuf : 0; return n; } #endif static size_t do_rx_src(struct rusage ru[2], struct timespec wall_time[2]) { int err; SRC_STATE* src_state; #if USE_SNDFILE if (infile) src_state = src_callback_new(src_readf, benchmark.src_type, 1, &err, NULL); else #endif src_state = src_callback_new(src_read, benchmark.src_type, 1, &err, NULL); if (!src_state) { LOG_ERROR("src_callback_new error %d: %s", err, src_strerror(err)); return 0; } inbuf = new float[inlen]; size_t outlen = (size_t)floor(inlen * benchmark.src_ratio); float* outbuf = new float[outlen]; double* rxbuf = new double[outlen]; long n; size_t nread; #if USE_SNDFILE if (infile) { // read until src returns 0 nread = 0; clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); getrusage(RUSAGE_SELF, &ru[0]); while ((n = src_callback_read(src_state, benchmark.src_ratio, outlen, outbuf))) { for (long i = 0; i < n; i++) rxbuf[i] = outbuf[i]; active_modem->rx_process(rxbuf, n); nread += n; } nread = (size_t)round(nread * benchmark.src_ratio); } else #endif { // read benchmark.samples * benchmark.src_ratio nread = (size_t)round(benchmark.samples * benchmark.src_ratio); clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); getrusage(RUSAGE_SELF, &ru[0]); while (nread > outlen) { if ((n = src_callback_read(src_state, benchmark.src_ratio, outlen, outbuf)) == 0) break; for (long i = 0; i < n; i++) rxbuf[i] = outbuf[i]; active_modem->rx_process(rxbuf, n); nread -= (size_t)n; } if (nread) { if ((n = src_callback_read(src_state, benchmark.src_ratio, nread, outbuf))) { for (long i = 0; i < n; i++) rxbuf[i] = outbuf[i]; active_modem->rx_process(rxbuf, n); } } nread = benchmark.samples; } getrusage(RUSAGE_SELF, &ru[1]); clock_gettime(CLOCK_MONOTONIC, &wall_time[1]); delete [] inbuf; delete [] outbuf; delete [] rxbuf; return nread; } fldigi-3.21.80/src/misc/configuration.cxx0000664000175000017500000006132112313064025015162 00000000000000// ---------------------------------------------------------------------------- // configuration.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2007-2008 // Leigh L. Klotz, Jr., WA5ZNU // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // Copyright (C) 2013 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "configuration.h" #include "confdialog.h" #include "xmlreader.h" #include "soundconf.h" #include "fl_digi.h" #include "main.h" #include "gettext.h" #include "nls.h" #include "icons.h" #if USE_HAMLIB #include "hamlib.h" #include "rigclass.h" #endif #include "rigio.h" #include "rigxml.h" #include "debug.h" #include #include #include #include #include #include #ifdef __linux__ # include # include # include # include #endif #ifdef __APPLE__ # include #endif #ifndef __CYGWIN__ # include #else # include #endif // this tests depends on a modified FL/filename.H in the Fltk-1.3.0 // change //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) // to //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) && !defined(__WOE32__) #include using namespace std; const char *szBaudRates[] = { "", "300","600","1200","2400", "4800","9600","19200","38400", "57600","115200","230400","460800"}; const char *szBands[] = { "", "1830", "3580", "7030", "7070", "10138", "14070", "18100", "21070", "21080", "24920", "28070", "28120", 0}; ostream& operator<<(ostream& out, const RGB& rgb) { return out << (int)rgb.R << ' ' << (int)rgb.G << ' ' << (int)rgb.B; } istream& operator>>(istream& in, RGB& rgb) { int i; in >> i; rgb.R = i; in >> i; rgb.G = i; in >> i; rgb.B = i; return in; } ostream& operator<<(ostream& out, const RGBI& rgbi) { return out << (int)rgbi.R << ' ' << (int)rgbi.G << ' ' << (int)rgbi.B; } istream& operator>>(istream& in, RGBI& rgbi) { int i; in >> i; rgbi.R = i; in >> i; rgbi.G = i; in >> i; rgbi.B = i; return in; } // This allows to put tag elements into containers class tag_base { public: tag_base(const char* t, const char* d = "") : tag(t), doc(d) { } virtual void write(ostream& out) const = 0; virtual void read(const char* data) = 0; virtual ~tag_base() { } const char* tag; const char* doc; }; // This will handle every type that has << and >> stream operators template class tag_elem : public tag_base { public: tag_elem(const char* t, const char* d, T& v) : tag_base(t, d), var(v) { } void write(ostream& out) const { out << "\n" << '<' << tag << '>' << var << "\n\n"; } void read(const char* data) { istringstream iss(data); iss >> var; } T& var; }; // Instantiate an explicit tag_elem for types that require unusual handling. // Special handling for strings template <> class tag_elem : public tag_base { public: tag_elem(const char* t, const char* d, string& s) : tag_base(t, d), str(s) { } void write(ostream& out) const { string s = str; string s2 = doc; string::size_type i = s.find('&'); while (i != string::npos) { s.replace(i, 1, "&"); i = s.find('&', i + 1); } while ((i = s.find('<')) != string::npos) s.replace(i, 1, "<"); while ((i = s.find('>')) != string::npos) s.replace(i, 1, ">"); while ((i = s.find('"')) != string::npos) s.replace(i, 1, """); while ((i = s.find('\'')) != string::npos) s.replace(i, 1, "'"); i = s2.find('&'); while (i != string::npos) { s2.replace(i, 1, "&"); i = s2.find('&', i + 1); } while ((i = s2.find('<')) != string::npos) s2.replace(i, 1, "<"); while ((i = s2.find('>')) != string::npos) s2.replace(i, 1, ">"); while ((i = s2.find('"')) != string::npos) s2.replace(i, 1, """); while ((i = s2.find('\'')) != string::npos) s2.replace(i, 1, "'"); out << "\n" << '<' << tag << '>' << s << "\n\n"; } void read(const char* data) { str = data; } string& str; }; // Special handling for mode bitsets template <> class tag_elem : public tag_base { public: tag_elem(const char* t, const char* d, mode_set_t& m) : tag_base(t, d), modes(m) { } void write(ostream& out) const { out << "\n" << '<' << tag << '>'; for (size_t i = 0; i < modes.size(); i++) if (!modes.test(i)) out << mode_info[i].name << ','; out << ",\n\n"; } void read(const char* data) { modes.set(); for( ; data ; ) { const char * comma = strchr( data, ',' ); size_t tok_len = comma ? comma - data : strlen(data); for (size_t i = 0; i < modes.size(); i++) { if (!strncmp(mode_info[i].name, data, tok_len )) { modes.set(i, 0); break; } } data = comma ? comma + 1 : NULL ; } } mode_set_t& modes; }; // By redefining the ELEM_ macro, we can control what the CONFIG_LIST macro // will expand to, and accomplish several things: // 1) Declare "struct configuration". See ELEM_DECLARE_CONFIGURATION // in configuration.h. // 2) Define progdefaults, the configuration struct that is initialised with // fldigi's default options #define ELEM_PROGDEFAULTS(type_, var_, tag_, doc_, ...) __VA_ARGS__, // 3) Define an array of tag element pointers #define ELEM_TAG_ARRAY(type_, var_, tag_, doc_, ...) \ (*tag_ ? new tag_elem(tag_, "type: " #type_ "; default: " #__VA_ARGS__ "\n" doc_, \ progdefaults.var_) : 0), // First define the default config #undef ELEM_ #define ELEM_ ELEM_PROGDEFAULTS configuration progdefaults = { CONFIG_LIST }; void configuration::writeDefaultsXML() { string deffname(HomeDir); deffname.append("fldigi_def.xml"); string deffname_backup(deffname); deffname_backup.append("-old"); rename(deffname.c_str(), deffname_backup.c_str()); ofstream f(deffname.c_str()); if (!f) { LOG_ERROR("Could not write %s", deffname.c_str()); return; } // create an array #undef ELEM_ #define ELEM_ ELEM_TAG_ARRAY tag_base* tag_list[] = { CONFIG_LIST }; // write all variables with non-empty tags to f f << "\n\n"; for (size_t i = 0; i < sizeof(tag_list)/sizeof(*tag_list); i++) { if (tag_list[i]) { tag_list[i]->write(f); delete tag_list[i]; } } f << "\n"; f.close(); } static void log_excluded_modes(void) { return; struct { mode_set_t* modes; const char* msgstr; } excluded[] = { { &progdefaults.rsid_rx_modes, "RSID (rx)" }, { &progdefaults.rsid_tx_modes, "RSID (tx)" }, { &progdefaults.cwid_modes, "CWID" }, { &progdefaults.videoid_modes, "VIDEOID" } }; string buf; for (size_t i = 0; i < sizeof(excluded)/sizeof(*excluded); i++) { size_t n = excluded[i].modes->size(); if (excluded[i].modes->count() == n) continue; buf.erase(); for (size_t j = 0; j < n; j++) { if (!excluded[i].modes->test(j)) { if (!buf.empty()) buf += ' '; buf += mode_info[j].sname; } } LOG(debug::QUIET_LEVEL, debug::LOG_OTHER, "%-10s: %s", excluded[i].msgstr, buf.c_str()); } } bool configuration::readDefaultsXML() { // Decode all RSID modes rsid_rx_modes.set(); // Don't transmit RSID or VideoID for CW, PSK31, RTTY rsid_tx_modes.set().reset(MODE_CW).reset(MODE_PSK31).reset(MODE_RTTY); videoid_modes = rsid_tx_modes; // Don't transmit CWID for CW cwid_modes.set().reset(MODE_CW); // Show all op modes visible_modes.set(); string deffname = HomeDir; deffname.append("fldigi_def.xml"); ifstream f(deffname.c_str()); if (!f) return false; string xmlbuf; f.seekg(0, ios::end); xmlbuf.reserve(f.tellg()); // reserve some space to avoid reallocations f.seekg(0, ios::beg); char line[2048]; while (f.getline(line, sizeof(line))) xmlbuf.append(line).append("\n"); f.close(); IrrXMLReader* xml = createIrrXMLReader(new IIrrXMLStringReader(xmlbuf)); if (!xml) return false; // create a TAG_NAME -> ELEMENT map typedef map tag_map_t; tag_map_t tag_map; tag_base* tag_list[] = { CONFIG_LIST }; for (size_t i = 0; i < sizeof(tag_list)/sizeof(*tag_list); i++) if (tag_list[i]) tag_map[tag_list[i]->tag] = tag_list[i]; // parse the xml buffer tag_map_t::const_iterator i = tag_map.end(); while(xml->read()) { switch(xml->getNodeType()) { case EXN_TEXT: case EXN_CDATA: if (i != tag_map.end()) // do we know about this tag? i->second->read(xml->getNodeData()); break; case EXN_ELEMENT_END: i = tag_map.end(); // ignore the next EXN_CDATA break; case EXN_ELEMENT: i = tag_map.find(xml->getNodeName()); break; case EXN_NONE: case EXN_COMMENT: case EXN_UNKNOWN: break; } } delete xml; // delete the tag objects for (size_t i = 0; i < sizeof(tag_list)/sizeof(*tag_list); i++) delete tag_list[i]; log_excluded_modes(); return true; } void configuration::loadDefaults() { // RTTY selShift->index(rtty_shift); if (progdefaults.rtty_shift == selShift->lsize() - 1) selCustomShift->activate(); else selCustomShift->deactivate(); selBaud->index(rtty_baud); selBits->index(rtty_bits); selParity->index(rtty_parity); // chkMsbFirst->value(rtty_msbfirst); selStopBits->index(rtty_stop); btnCRCRLF->value(rtty_crcrlf); btnAUTOCRLF->value(rtty_autocrlf); cntrAUTOCRLF->value(rtty_autocount); chkPseudoFSK->value(PseudoFSK); chkUOSrx->value(UOSrx); chkUOStx->value(UOStx); i_listbox_rtty_afc_speed->index(rtty_afcspeed); btnPreferXhairScope->value(PreferXhairScope); // OLIVIA i_listbox_olivia_tones->index(oliviatones); i_listbox_olivia_bandwidth->index(oliviabw); cntOlivia_smargin->value(oliviasmargin); cntOlivia_sinteg->value(oliviasinteg); btnOlivia_8bit->value(olivia8bit); // CONTESTIA i_listbox_contestia_tones->index(contestiatones); i_listbox_contestia_bandwidth->index(contestiabw); cntContestia_smargin->value(contestiasmargin); cntContestia_sinteg->value(contestiasinteg); btnContestia_8bit->value(contestia8bit); chkDominoEX_FEC->value(DOMINOEX_FEC); Fl_Tooltip::enable(tooltips); } void configuration::saveDefaults() { ENSURE_THREAD(FLMAIN_TID); memcpy(&cfgpal0, &palette[0], sizeof(cfgpal0)); memcpy(&cfgpal1, &palette[1], sizeof(cfgpal1)); memcpy(&cfgpal2, &palette[2], sizeof(cfgpal2)); memcpy(&cfgpal3, &palette[3], sizeof(cfgpal3)); memcpy(&cfgpal4, &palette[4], sizeof(cfgpal4)); memcpy(&cfgpal5, &palette[5], sizeof(cfgpal5)); memcpy(&cfgpal6, &palette[6], sizeof(cfgpal6)); memcpy(&cfgpal7, &palette[7], sizeof(cfgpal7)); memcpy(&cfgpal8, &palette[8], sizeof(cfgpal8)); RxFontName = Fl::get_font_name(RxFontnbr); TxFontName = Fl::get_font_name(TxFontnbr); WaterfallFontName = Fl::get_font_name(WaterfallFontnbr); ViewerFontName = Fl::get_font_name(ViewerFontnbr); FreqControlFontName = Fl::get_font_name(FreqControlFontnbr); #if ENABLE_NLS && defined(__WOE32__) set_ui_lang(listbox_language->index()); #endif writeDefaultsXML(); changed = false; } #if USE_HAMLIB static int fill_hamlib_menu(const char* rigname) { cboHamlibRig->add(rigname); return 1; } #endif int configuration::setDefaults() { ENSURE_THREAD(FLMAIN_TID); #if USE_HAMLIB hamlib_get_rigs(); hamlib_get_rig_str(fill_hamlib_menu); if (HamRigModel == 0 && !HamRigName.empty()) { // compatibility with < 3.04 HamRigModel = hamlib_get_rig_model_compat(HamRigName.c_str()); LOG_VERBOSE("Found rig model %d for \"%s\"", HamRigModel, HamRigName.c_str()); } #endif inpMyCallsign->value(myCall.c_str()); inpMyName->value(myName.c_str()); inpMyQth->value(myQth.c_str()); inpMyLocator->value(myLocator.c_str()); inpMyAntenna->value(myAntenna.c_str()); UseLeadingZeros = btnUseLeadingZeros->value(); ContestStart = (int)nbrContestStart->value(); ContestDigits = (int)nbrContestDigits->value(); txtSecondary->value(secText.c_str()); txtTHORSecondary->value(THORsecText.c_str()); valTHOR_BW->value(THOR_BW); valTHOR_FILTER->value(THOR_FILTER); valTHOR_PATHS->value(THOR_PATHS); valThorCWI->value(ThorCWI); valTHOR_PREAMBLE->value(THOR_PREAMBLE); valTHOR_SOFTSYMBOLS->value(THOR_SOFTSYMBOLS); valTHOR_SOFTBITS->value(THOR_SOFTBITS); valDominoEX_BW->value(DOMINOEX_BW); valDominoEX_FILTER->value(DOMINOEX_FILTER); chkDominoEX_FEC->value(DOMINOEX_FEC); valDominoEX_PATHS->value(DOMINOEX_PATHS); valDomCWI->value(DomCWI); btnRigCatCMDptt->value(RigCatCMDptt); btnTTYptt->value(TTYptt); btnUsePPortPTT->value(progdefaults.UsePPortPTT); btnUseUHrouterPTT->value(progdefaults.UseUHrouterPTT); #if USE_HAMLIB listbox_sideband->add(_("Rig mode")); listbox_sideband->add(_("Always LSB")); listbox_sideband->add(_("Always USB")); listbox_sideband->index(HamlibSideband); btnHamlibCMDptt->value(HamlibCMDptt); inpRIGdev->show(); listbox_baudrate->show(); cboHamlibRig->show(); cboHamlibRig->value(HamRigName.c_str()); #else tabHamlib->parent()->remove(*tabHamlib); #endif btnRTSptt->value(RTSptt); btnDTRptt->value(DTRptt); btnRTSplusV->value(RTSplus); btnDTRplusV->value(DTRplus); inpTTYdev->value(PTTdev.c_str()); if (chkUSEHAMLIBis) { chkUSEHAMLIB->value(1); chkUSERIGCAT->value(0); chkUSEXMLRPC->value(0); } else if (chkUSERIGCATis) { chkUSERIGCAT->value(1); chkUSEHAMLIB->value(0); chkUSEXMLRPC->value(0); } else if (chkUSEXMLRPCis) { chkUSEXMLRPC->value(1); chkUSEHAMLIB->value(0); chkUSERIGCAT->value(0); } else { chkUSEHAMLIB->value(0); chkUSERIGCAT->value(0); chkUSEHAMLIB->value(0); chkUSEXMLRPC->value(0); } if (!XmlRigFilename.empty()) readRigXML(); inpRIGdev->value(HamRigDevice.c_str()); listbox_baudrate->index(HamRigBaudrate); inpXmlRigDevice->value(XmlRigDevice.c_str()); listbox_xml_rig_baudrate->index(XmlRigBaudrate); valCWsweetspot->value(CWsweetspot); valRTTYsweetspot->value(RTTYsweetspot); valPSKsweetspot->value(PSKsweetspot); btnWaterfallHistoryDefault->value(WaterfallHistoryDefault); btnWaterfallQSY->value(WaterfallQSY); inpWaterfallClickText->input_type(FL_MULTILINE_INPUT); inpWaterfallClickText->value(WaterfallClickText.c_str()); if (!WaterfallClickInsert) inpWaterfallClickText->deactivate(); for (size_t i = 0; i < sizeof(waterfall::wf_wheel_action)/sizeof(*waterfall::wf_wheel_action); i++) listboxWaterfallWheelAction->add(waterfall::wf_wheel_action[i]); listboxWaterfallWheelAction->index(WaterfallWheelAction); btnStartAtSweetSpot->value(StartAtSweetSpot); btnPSKmailSweetSpot->value(PSKmailSweetSpot); cntSearchRange->value(SearchRange); cntServerOffset->value(ServerOffset); cntACQsn->value(ACQsn); btnCursorBWcolor->color( fl_rgb_color(cursorLineRGBI.R, cursorLineRGBI.G, cursorLineRGBI.B) ); btnCursorCenterLineColor->color( fl_rgb_color(cursorCenterRGBI.R, cursorCenterRGBI.G, cursorCenterRGBI.B) ); btnBwTracksColor->color( fl_rgb_color(bwTrackRGBI.R, bwTrackRGBI.G, bwTrackRGBI.B) ); cntCWweight->value(CWweight); sldrCWxmtWPM->value(CWspeed); cntCWdefWPM->value(defCWspeed); sldrCWbandwidth->value(CWbandwidth); btnCWrcvTrack->value(CWtrack); cntCWrange->value(CWrange); cntCWlowerlimit->value(CWlowerlimit); cntCWupperlimit->value(CWupperlimit); cntCWlowerlimit->maximum(CWupperlimit - 20); cntCWupperlimit->minimum(CWlowerlimit + 20); cntCWrisetime->value(CWrisetime); cntCWdash2dot->value(CWdash2dot); i_listboxQSKshape->index(QSKshape); sldrCWxmtWPM->minimum(CWlowerlimit); sldrCWxmtWPM->maximum(CWupperlimit); btnQSK->value(QSK); cntPreTiming->value(CWpre); cntPostTiming->value(CWpost); btnCWID->value(CWid); listboxHellFont->index(feldfontnbr); btnFeldHellIdle->value(HellXmtIdle); btnTxRSID->value(TransmitRSid); btnRSID->value(rsid); chkRSidWideSearch->value(rsidWideSearch); chkSlowCpu->value(slowcpu); Fl_Button* qrzb = btnQRZXMLnotavailable; Fl_Button* qrzb2 = btnQRZWEBnotavailable; switch (QRZXML) { case QRZCD: qrzb = btnQRZcdrom; break; case QRZNET: qrzb = btnQRZsub; break; case HAMCALLNET: qrzb = btnHamcall; break; case CALLOOK: qrzb = btnCALLOOK; break; case HAMQTH: qrzb = btnHamQTH; break; case QRZXMLNONE: default : break; } switch (QRZWEB) { case QRZHTML: qrzb2 = btnQRZonline; break; case HAMCALLHTML: qrzb2 = btnHAMCALLonline; break; case HAMQTHHTML: qrzb2 = btnHamQTHonline; break; case QRZWEBNONE: default : break; } set_qrzxml_buttons(qrzb); set_qrzweb_buttons(qrzb2); txtQRZpathname->value(QRZpathname.c_str()); btnsendid->value(sendid); btnsendvideotext->value(sendtextid); chkID_SMALL->value(ID_SMALL); wf->setPrefilter(wfPreFilter); btnWFaveraging->value(WFaveraging); memcpy(&palette[0], &cfgpal0, sizeof(palette[0])); memcpy(&palette[1], &cfgpal1, sizeof(palette[1])); memcpy(&palette[2], &cfgpal2, sizeof(palette[2])); memcpy(&palette[3], &cfgpal3, sizeof(palette[3])); memcpy(&palette[4], &cfgpal4, sizeof(palette[4])); memcpy(&palette[5], &cfgpal5, sizeof(palette[5])); memcpy(&palette[6], &cfgpal6, sizeof(palette[6])); memcpy(&palette[7], &cfgpal7, sizeof(palette[7])); memcpy(&palette[8], &cfgpal8, sizeof(palette[8])); wf->setcolors(); setColorButtons(); #if !HAVE_UHROUTER btnUseUHrouterPTT->hide(); #endif #if !HAVE_PARPORT btnUsePPortPTT->hide(); #endif #if ENABLE_NLS && defined(__WOE32__) ostringstream ss; for (lang_def_t* p = ui_langs; p->lang; p++) { ss.str(""); ss << p->native_name << " (" << p->percent_done << "%)"; listbox_language->add(ss.str().c_str()); } listbox_language->index(get_ui_lang()); listbox_language->show(); #else listbox_language->hide(); #endif return 1; } void configuration::resetDefaults(void) { if (!fl_choice2(_("\ Reset all options to their default values?\n\n\ Reset options will take effect at the next start\n\ Files: fldigi_def.xml and fldigi.prefs will be deleted!\n"), _("OK"), _("Cancel"), NULL) && Fl::event_key() != FL_Escape) { if (!fl_choice2(_("Confirm RESET"), _("Yes"), _("No"), NULL) && Fl::event_key() != FL_Escape) { reset(); atexit(reset); } } } void configuration::reset(void) { remove(string(HomeDir).append("fldigi_def.xml").c_str()); remove(string(HomeDir).append("fldigi.prefs").c_str()); } #include "rigio.h" void configuration::initInterface() { ENSURE_THREAD(FLMAIN_TID); // close down any possible rig interface threads #if USE_HAMLIB hamlib_close(); #endif rigCAT_close(); RigCatCMDptt = btnRigCatCMDptt->value(); TTYptt = btnTTYptt->value(); RTSptt = btnRTSptt->value(); DTRptt = btnDTRptt->value(); RTSplus = btnRTSplusV->value(); DTRplus = btnDTRplusV->value(); PTTdev = inpTTYdev->value(); #if USE_HAMLIB chkUSEHAMLIBis = chkUSEHAMLIB->value(); HamlibCMDptt = btnHamlibCMDptt->value(); #endif chkUSERIGCATis = chkUSERIGCAT->value(); #if USE_HAMLIB if (*cboHamlibRig->value() == '\0') // no selection at start up cboHamlibRig->index(hamlib_get_index(HamRigModel)); else HamRigModel = hamlib_get_rig_model(cboHamlibRig->index()); HamRigDevice = inpRIGdev->value(); HamRigBaudrate = listbox_baudrate->index(); #else cboHamlibRig->hide(); inpRIGdev->hide(); listbox_baudrate->hide(); #endif bool riginitOK = false; if (chkUSERIGCATis) { // start the rigCAT thread if (rigCAT_init(true)) { LOG_VERBOSE("%s", "using rigCAT"); wf->USB(true); wf->setQSY(1); riginitOK = true; } #if USE_HAMLIB } else if (chkUSEHAMLIBis) { // start the hamlib thread if (hamlib_init(HamlibCMDptt)) { wf->USB(true); wf->setQSY(1); riginitOK = true; } #endif } else if (chkUSEXMLRPCis) { if (rigCAT_init(false)) { LOG_VERBOSE("%s", "using XMLRPC"); wf->USB(true); wf->setQSY(0); riginitOK = true; } } if (riginitOK == false) { LOG_VERBOSE("%s", "NO rig control"); rigCAT_init(false); wf->USB(true); wf->setQSY(0); } if (HamlibCMDptt && chkUSEHAMLIBis) push2talk->reset(PTT::PTT_HAMLIB); else if ((RigCatCMDptt || RigCatRTSptt || RigCatDTRptt) && chkUSERIGCATis) push2talk->reset(PTT::PTT_RIGCAT); else if (TTYptt) push2talk->reset(PTT::PTT_TTY); else if (UsePPortPTT) push2talk->reset(PTT::PTT_PARPORT); else if (UseUHrouterPTT) push2talk->reset(PTT::PTT_UHROUTER); else push2talk->reset(PTT::PTT_NONE); wf->setRefLevel(); wf->setAmpSpan(); cntLowFreqCutoff->value(LowFreqCutoff); } const char* configuration::strBaudRate() { return (szBaudRates[HamRigBaudrate + 1]); } int configuration::nBaudRate(const char *szBR) { for (size_t i = 1; i < sizeof(szBaudRates); i++) if (strcmp(szBaudRates[i], szBR) == 0) return i - 1; return 0; } int configuration::BaudRate(size_t n) { if (n > sizeof(szBaudRates) + 1) return 1200; return (atoi(szBaudRates[n + 1])); } #ifdef __WOE32__ static bool open_serial(const char* dev) { bool ret = false; #ifdef __CYGWIN__ int fd = open(dev, O_RDWR | O_NOCTTY | O_NDELAY | O_CLOEXEC); if (fd != -1) { close(fd); ret = true; } #elif defined(__MINGW32__) HANDLE fd = CreateFile(dev, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); if (fd != INVALID_HANDLE_VALUE) { CloseHandle(fd); ret = true; } #endif return ret; } #endif // __WOE32__ void configuration::testCommPorts() { inpTTYdev->clear(); inpRIGdev->clear(); inpXmlRigDevice->clear(); #ifndef PATH_MAX # define PATH_MAX 1024 #endif #ifndef __WOE32__ struct stat st; #endif #ifndef __APPLE__ char ttyname[PATH_MAX + 1]; #endif const char* tty_fmt[] = { #if defined(__linux__) "/dev/ttyS%u", "/dev/ttyUSB%u", "/dev/usb/ttyUSB%u" #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) "/dev/tty%2.2u" #elif defined(__CYGWIN__) "/dev/ttyS%u" #elif defined(__MINGW32__) "//./COM%u" #elif defined(__APPLE__) "/dev/cu.*", "/dev/tty.*" #endif }; #if defined(__WOE32__) # define TTY_MAX 255 #elif defined(__OpenBSD__) || defined(__NetBSD__) # define TTY_MAX 4 #else # define TTY_MAX 8 #endif #ifdef __linux__ glob_t gbuf; glob("/dev/serial/by-id/*", 0, NULL, &gbuf); for (size_t j = 0; j < gbuf.gl_pathc; j++) { if ( !(stat(gbuf.gl_pathv[j], &st) == 0 && S_ISCHR(st.st_mode)) || strstr(gbuf.gl_pathv[j], "modem") ) continue; LOG_INFO("Found serial port %s", gbuf.gl_pathv[j]); inpTTYdev->add(gbuf.gl_pathv[j]); # if USE_HAMLIB inpRIGdev->add(gbuf.gl_pathv[j]); # endif inpXmlRigDevice->add(gbuf.gl_pathv[j]); } globfree(&gbuf); #endif for (size_t i = 0; i < sizeof(tty_fmt)/sizeof(*tty_fmt); i++) { #ifndef __APPLE__ for (unsigned j = 0; j < TTY_MAX; j++) { snprintf(ttyname, sizeof(ttyname), tty_fmt[i], j); # ifndef __WOE32__ if ( !(stat(ttyname, &st) == 0 && S_ISCHR(st.st_mode)) ) continue; # else // __WOE32__ LOG_DEBUG("Testing serial port %s", ttyname); if (!open_serial(ttyname)) continue; # ifdef __CYGWIN__ snprintf(ttyname, sizeof(ttyname), "COM%u", j+1); # else snprintf(ttyname, sizeof(ttyname), "COM%u", j); # endif # endif // __WOE32__ LOG_INFO("Found serial port %s", ttyname); inpTTYdev->add(ttyname); # if USE_HAMLIB inpRIGdev->add(ttyname); # endif inpXmlRigDevice->add(ttyname); } #else // __APPLE__ glob_t gbuf; glob(tty_fmt[i], 0, NULL, &gbuf); for (size_t j = 0; j < gbuf.gl_pathc; j++) { if ( !(stat(gbuf.gl_pathv[j], &st) == 0 && S_ISCHR(st.st_mode)) || strstr(gbuf.gl_pathv[j], "modem") ) continue; LOG_INFO("Found serial port %s", gbuf.gl_pathv[j]); inpTTYdev->add(gbuf.gl_pathv[j]); # if USE_HAMLIB inpRIGdev->add(gbuf.gl_pathv[j]); # endif inpXmlRigDevice->add(gbuf.gl_pathv[j]); } globfree(&gbuf); #endif // __APPLE__ } #if HAVE_UHROUTER if (stat(UHROUTER_FIFO_PREFIX "Read", &st) != -1 && S_ISFIFO(st.st_mode) && stat(UHROUTER_FIFO_PREFIX "Write", &st) != -1 && S_ISFIFO(st.st_mode)) inpTTYdev->add(UHROUTER_FIFO_PREFIX); #endif // HAVE_UHROUTER } Fl_Font font_number(const char* name) { int n = (int)Fl::set_fonts(0); for (int i = 0; i < n; i++) { if (strcmp(Fl::get_font_name((Fl_Font)i), name) == 0) return (Fl_Font)i; } return FL_HELVETICA; } void configuration::initFonts(void) { if (!RxFontName.empty()) RxFontnbr = font_number(RxFontName.c_str()); if (!TxFontName.empty()) TxFontnbr = font_number(TxFontName.c_str()); if (!WaterfallFontName.empty()) WaterfallFontnbr = font_number(WaterfallFontName.c_str()); if (!ViewerFontName.empty()) ViewerFontnbr = font_number(ViewerFontName.c_str()); if (!FreqControlFontName.empty()) FreqControlFontnbr = font_number(FreqControlFontName.c_str()); } fldigi-3.21.80/src/misc/arq_io.cxx0000664000175000017500000005615612313147652013607 00000000000000// ---------------------------------------------------------------------------- // arq_io.cxx // // support for ARQ server/client system such as pskmail and fl_arq // // Copyright (C) 2006-2013 // Dave Freese, W1HKJ // Copyright (C) 2008-2013 // Stelios Bounanos, M0GLD // Copyright (C) 2009-2013 // John Douyere, VK2ETA // Copyright (c) 2013 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #if !defined(__WOE32__) && !defined(__APPLE__) # include # include #endif #include #include "main.h" #include "configuration.h" #include "fl_digi.h" #include "trx.h" #include "arq_io.h" #include "threads.h" #include "socket.h" #include "debug.h" #include "qrunner.h" #include #include LOG_FILE_SOURCE(debug::LOG_ARQCONTROL); using namespace std; // ===================================================================== static pthread_t arq_thread; static pthread_mutex_t arq_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t arq_rx_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t tosend_mutex = PTHREAD_MUTEX_INITIALIZER; static void *arq_loop(void *args); static bool arq_exit = false; static bool arq_enabled; static bool abort_flag = false; /// Any access to shared variables must be protected. static string tosend = ""; // Protected by tosend_mutex static string enroute = ""; // Protected by tosend_mutex static string arqtext = ""; // Protected by arq_rx_mutex static string txstring = ""; // Protected by arq_rx_mutex static size_t pText; // Protected by arq_rx_mutex bool arq_text_available = false; // Protected by arq_rx_mutex // Beware 'arq_text_available' is accessed by other modules. // ===================================================================== static const char *asc[128] = { "", "", "", "", "", "", "", "", "", "", "\n", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "" }; string noctrl(string src) { static string retstr; retstr.clear(); char hexstr[10]; int c; for (size_t i = 0; i < src.length(); i++) { c = src[i]; if ( c > 0 && c < 128) retstr.append(asc[c]); else { snprintf(hexstr, sizeof(hexstr), "<%0X>", c & 0xFF); retstr.append(hexstr); } } return retstr; } //====================================================================== extern void parse_arqtext(string &toparse); static void set_button(Fl_Button* button, bool value) { button->value(value); button->do_callback(); } void ParseMode(string src) { if (src.find("XMTTUNE") != string::npos) { int msecs = 100; if (src.length() > 7) { int ret = sscanf( src.substr(7, src.length() - 7).c_str(), "%d", &msecs); if (ret != 1 || msecs < 10 || msecs > 20000) msecs = 100; } if (debug_pskmail) LOG_INFO("%s %5.2f sec", "ARQ tune on", msecs/1000.0); trx_tune(); MilliSleep(msecs); if (debug_pskmail) LOG_INFO("%s", "ARQ tune off"); trx_receive(); return; } if (src.find("PTTTUNE") != string::npos) { int msecs = 100; if (src.length() > 7) { int ret = sscanf( src.substr(7, src.length() - 7).c_str(), "%d", &msecs); if (ret != 1 || msecs < 10 || msecs > 20000) msecs = 100; } if (debug_pskmail) LOG_INFO("%s %5.2f sec", "ARQ set ptt on", msecs/1000.0); push2talk->set(true); REQ(&waterfall::set_XmtRcvBtn, wf, true); MilliSleep(msecs); if (debug_pskmail) LOG_INFO("%s", "ARQ set ptt off"); push2talk->set(false); REQ(&waterfall::set_XmtRcvBtn, wf, false); return; } for (size_t i = 0; i < NUM_MODES; ++i) { if (strlen(mode_info[i].pskmail_name) > 0) { if (src == mode_info[i].pskmail_name) { // while (trx_state != STATE_RX) { // MilliSleep(10); // } if (debug_pskmail) LOG_INFO("Setting modem to %s", mode_info[i].pskmail_name); REQ_SYNC(init_modem_sync, mode_info[i].mode, 0); break; } } } } void ParseRSID(string src) { if (src == "ON") { if (debug_pskmail) LOG_INFO("%s", "RsID turned ON"); REQ(set_button, btnRSID, 1); } if (src == "OFF") { if (debug_pskmail) LOG_INFO("%s", "RsID turned OFF"); REQ(set_button, btnRSID, 0); } } void ParseTxRSID(string src) { if (src == "ON") { if (debug_pskmail) LOG_INFO("%s", "TxRsID turned ON"); REQ(set_button, btnTxRSID, 1); } if (src == "OFF") { if (debug_pskmail) LOG_INFO("%s", "TxRsID turned OFF"); REQ(set_button, btnTxRSID, 0); } } void parse_arqtext(string &toparse) { static string strCmdText; static string strSubCmd; unsigned long int idxCmd, idxCmdEnd, idxSubCmd, idxSubCmdEnd; if (toparse.empty()) return; idxCmd = toparse.find(""); idxCmdEnd = toparse.find(""); while ( idxCmd != string::npos && idxCmdEnd != string::npos && idxCmdEnd > idxCmd ) { LOG_INFO("Parsing: %s", noctrl(toparse.substr(idxCmd, idxCmdEnd - idxCmd + 6)).c_str()); strCmdText = toparse.substr(idxCmd + 5, idxCmdEnd - idxCmd - 5); if (strCmdText == "server" && mailserver == false && mailclient == false) { mailserver = true; mailclient = false; string PskMailLogName; PskMailLogName.assign(PskMailDir); PskMailLogName.append("gMFSK.log"); Maillogfile = new cLogfile(PskMailLogName.c_str()); Maillogfile->log_to_file_start(); REQ(set_button, wf->xmtlock, 1); if (progdefaults.PSKmailSweetSpot) active_modem->set_freq(progdefaults.PSKsweetspot); active_modem->set_freqlock(true); LOG_INFO("%s", "ARQ is set to pskmail server"); } else if (strCmdText == "client" && mailclient == false && mailserver == false) { mailclient = true; mailserver = false; string PskMailLogName; PskMailLogName.assign(PskMailDir); PskMailLogName.append("gMFSK.log"); Maillogfile = new cLogfile(PskMailLogName.c_str()); Maillogfile->log_to_file_start(); REQ(set_button, wf->xmtlock, 0); active_modem->set_freqlock(false); LOG_INFO("%s", "ARQ is set to pskmail client"); } else if (strCmdText == "normal") { mailserver = false; mailclient = false; if (Maillogfile) { delete Maillogfile; Maillogfile = 0; } REQ(set_button, wf->xmtlock, 0); active_modem->set_freqlock(false); LOG_INFO("%s", "ARQ is reset to normal ops"); } else if ((idxSubCmd = strCmdText.find("")) != string::npos) { idxSubCmdEnd = strCmdText.find(""); if ( idxSubCmdEnd != string::npos && idxSubCmdEnd > idxSubCmd ) { strSubCmd = strCmdText.substr(idxSubCmd + 6, idxSubCmdEnd - idxSubCmd - 6); ParseMode(strSubCmd); LOG_INFO("%s %s", "ARQ mode ", strSubCmd.c_str()); } } else if ((idxSubCmd = strCmdText.find("")) != string::npos) { idxSubCmdEnd = strCmdText.find(""); if ( idxSubCmdEnd != string::npos && idxSubCmdEnd > idxSubCmd ) { strSubCmd = strCmdText.substr(idxSubCmd + 6, idxSubCmdEnd - idxSubCmd - 6); ParseRSID(strSubCmd); LOG_INFO("%s %s", "ARQ rsid ", strSubCmd.c_str()); } } else if ((idxSubCmd = strCmdText.find("")) != string::npos) { idxSubCmdEnd = strCmdText.find(""); if ( idxSubCmdEnd != string::npos && idxSubCmdEnd > idxSubCmd ) { strSubCmd = strCmdText.substr(idxSubCmd + 8, idxSubCmdEnd - idxSubCmd - 8); ParseTxRSID(strSubCmd); LOG_INFO("%s %s", "ARQ txrsid ", strSubCmd.c_str()); } } else if (strCmdText == "abort") { LOG_INFO("%s", "Abort current ARQ ops"); abort_flag = true; } toparse.erase(idxCmd, idxCmdEnd - idxCmd + 6); while (toparse[0] == '\n' || toparse[0] == '\r') toparse.erase(0, 1); idxCmd = toparse.find(""); idxCmdEnd = toparse.find(""); } } #define TIMEOUT 180 // 3 minutes //====================================================================== // Gmfsk ARQ file i/o used only on Linux //====================================================================== // checkTLF // look for files named // TLFfldigi ==> tlfio is true and // ==> mailclient is true // in $HOME void checkTLF() { static string TLFfile; static string TLFlogname; ifstream testFile; tlfio = mailserver = mailclient = false; TLFfile.assign(PskMailDir); TLFfile.append("TLFfldigi"); testFile.open(TLFfile.c_str()); if (testFile.is_open()) { testFile.close(); mailclient = true; tlfio = true; TLFlogname.assign(PskMailDir); TLFlogname.append("gMFSK.log"); Maillogfile = new cLogfile(TLFlogname.c_str()); Maillogfile->log_to_file_start(); } } static bool TLF_arqRx() { /// The mutex is automatically unlocked when returning. guard_lock arq_rx_lock(&arq_rx_mutex); #if defined(__WOE32__) || defined(__APPLE__) return false; #else time_t start_time, prog_time; static char mailline[1000]; static string sAutoFile(""); sAutoFile.assign(PskMailDir); sAutoFile.append("gmfsk_autofile"); ifstream autofile(sAutoFile.c_str()); if(autofile) { time(&start_time); while (!autofile.eof()) { memset(mailline, 0, sizeof(mailline)); autofile.getline(mailline, 998); // leave space for "\n" and null byte txstring.append(mailline); txstring.append("\n"); time(&prog_time); if (prog_time - start_time > TIMEOUT) { LOG_ERROR("TLF file I/O failure"); autofile.close(); std::remove (sAutoFile.c_str()); return false; } } autofile.close(); std::remove (sAutoFile.c_str()); parse_arqtext(txstring); if (abort_flag) { AbortARQ(); abort_flag = false; return true; } if (arqtext.empty() && !txstring.empty()) { arqtext = txstring; if (mailserver && progdefaults.PSKmailSweetSpot) active_modem->set_freq(progdefaults.PSKsweetspot); pText = 0; arq_text_available = true; active_modem->set_stopflag(false); start_tx(); txstring.clear(); } } return true; #endif } //====================================================================== // Auto transmit of file contained in WRAP_auto_dir //====================================================================== bool WRAP_auto_arqRx() { time_t start_time, prog_time; static char mailline[1000]; static string sAutoFile(""); sAutoFile.assign(FLMSG_WRAP_auto_dir); sAutoFile.append("wrap_auto_file"); ifstream autofile; autofile.open(sAutoFile.c_str()); if (!autofile) { sAutoFile.assign(WRAP_auto_dir); sAutoFile.append("wrap_auto_file"); autofile.open(sAutoFile.c_str()); } if(autofile) { /// Mutex is unlocked when leaving the block. guard_lock arq_rx_lock(&arq_rx_mutex); txstring.clear(); time(&start_time); while (!autofile.eof()) { memset(mailline,0,1000); autofile.getline(mailline, 998); // leave space for "\n" and null byte txstring.append(mailline); txstring.append("\n"); time(&prog_time); if (prog_time - start_time > TIMEOUT) { LOG_ERROR("autowrap file I/O failure"); autofile.close(); std::remove (sAutoFile.c_str()); return false; } } autofile.close(); std::remove (sAutoFile.c_str()); if (!txstring.empty()) { arqtext.assign("\n....start\n"); arqtext.append(txstring); arqtext.append("\n......end\n"); pText = 0; arq_text_available = true; LOG_DEBUG("%s", arqtext.c_str()); start_tx(); txstring.clear(); return true; } } return false; } //====================================================================== // Socket ARQ i/o used on all platforms //====================================================================== #define ARQLOOP_TIMING 100 // msec #define CLIENT_TIMEOUT 5 // timeout after N secs struct ARQCLIENT { Socket sock; time_t keep_alive; }; static string errstring; static pthread_t* arq_socket_thread = 0; ARQ_SOCKET_Server* ARQ_SOCKET_Server::inst = 0; static std::vector arqclient; // Protected by arq_mutex void arq_run(Socket); ARQ_SOCKET_Server::ARQ_SOCKET_Server() { server_socket = new Socket; arq_socket_thread = new pthread_t; run = true; } ARQ_SOCKET_Server::~ARQ_SOCKET_Server() { run = false; if (arq_socket_thread) { CANCEL_THREAD(*arq_socket_thread); pthread_join(*arq_socket_thread, NULL); delete arq_socket_thread; arq_socket_thread = 0; } delete server_socket; } bool ARQ_SOCKET_Server::start(const char* node, const char* service) { if (inst) return false; inst = new ARQ_SOCKET_Server; try { inst->server_socket->open(Address(node, service)); inst->server_socket->bind(); #ifdef __WOE32__ inst->server_socket->listen(); inst->server_socket->set_timeout(0.1); #endif } catch (const SocketException& e) { errstring.assign("Could not start ARQ server ("); errstring.append(e.what()).append(")"); if (e.error() == EADDRINUSE) errstring.append("\nMultiple instances of fldigi??"); LOG_ERROR("%s", errstring.c_str()); delete arq_socket_thread; arq_socket_thread = 0; delete inst; inst = 0; return false; } return !pthread_create(arq_socket_thread, NULL, thread_func, NULL); } void ARQ_SOCKET_Server::stop(void) { // FILEME - uncomment when we have an ARQ_SOCKET_Server than can be // interrupted // if (!inst) // return; // delete inst; // inst = 0; } void* ARQ_SOCKET_Server::thread_func(void*) { SET_THREAD_ID(ARQSOCKET_TID); SET_THREAD_CANCEL(); // On POSIX we block indefinitely and are interrupted by a signal. // On woe32 we block for a short time and test for cancellation. while (inst->run) { try { #ifdef __WOE32__ if (inst->server_socket->wait(0)) arq_run(inst->server_socket->accept()); #else arq_run(inst->server_socket->accept()); TEST_THREAD_CANCEL(); #endif } catch (const SocketException& e) { if (e.error() != EINTR) { errstring = e.what(); LOG_ERROR("%s", errstring.c_str()); break; } } catch (...) { break; } } { /// Mutex is unlocked when leaving the block. guard_lock arq_lock(&arq_mutex); if (!arqclient.empty()) { vector::iterator p = arqclient.begin(); while (p != arqclient.end()) { try { (*p).sock.close(); arqclient.erase(p); } catch (...) {;} p++; } } } inst->server_socket->close(); return NULL; } void arq_reset() { /// Mutex is unlocked when returning from function guard_lock arq_rx_lock(&arq_rx_mutex); arqmode = mailserver = mailclient = false; txstring.clear(); arqtext.clear(); pText = 0; } void arq_run(Socket s) { /// Mutex is unlocked when returning from function guard_lock arq_lock(&arq_mutex); struct timeval t = { 0, 20000 }; s.set_timeout(t); s.set_nonblocking(); ARQCLIENT client; client.sock = s; client.keep_alive = time(0); arqclient.push_back(client); arqmode = true; vector::iterator p = arqclient.begin(); ostringstream outs; outs << "Clients: "; while (p != arqclient.end()) { outs << (*p).sock.fd() << " "; p++; } LOG_INFO("%s", outs.str().c_str()); } void WriteARQsocket(unsigned char* data, size_t len) { /// Mutex is unlocked when returning from function guard_lock arq_lock(&arq_mutex); if (arqclient.empty()) return; static string instr; instr.clear(); vector::iterator p; p = arqclient.begin(); while (p != arqclient.end()) { try { (*p).sock.wait(1); (*p).sock.send(data, len); (*p).keep_alive = time(0); p++; } catch (const SocketException& e) { LOG_INFO("closing socket fd %d %s", (*p).sock.fd(), e.what()); try { (*p).sock.close(); } catch (const SocketException& e) { LOG_ERROR("Socket error on # %d, %d: %s", (*p).sock.fd(), e.error(), e.what()); } arqclient.erase(p); } } string outs = ""; for (unsigned int i = 0; i < len; i++) outs += asc[data[i] & 0x7F]; LOG_INFO("%s", outs.c_str()); if (arqclient.empty()) arq_reset(); } void test_arq_clients() { /// Mutex is unlocked when returning from function guard_lock arq_lock(&arq_mutex); if (arqclient.empty()) return; static string instr; instr.clear(); vector::iterator p; p = arqclient.begin(); time_t now; while (p != arqclient.end()) { if (difftime(now = time(0), (*p).keep_alive) > CLIENT_TIMEOUT) { try { (*p).sock.wait(1); (*p).sock.send("\0", 1); (*p).keep_alive = now; p++; } catch (const SocketException& e) { LOG_INFO("socket %d timed out, error %d, %s", (*p).sock.fd(), e.error(), e.what()); try { (*p).sock.close(); } catch (const SocketException& e) { LOG_ERROR("Socket error on # %d, %d: %s", (*p).sock.fd(), e.error(), e.what()); } arqclient.erase(p); } } else { p++; } } if (arqclient.empty()) arq_reset(); } bool Socket_arqRx() { { /// Mutex is unlocked when leaving block guard_lock arq_lock(&arq_mutex); if (arqclient.empty()) return false; static string instr; vector::iterator p = arqclient.begin(); size_t n = 0; instr.clear(); while (p != arqclient.end()) { try { (*p).sock.wait(0); n = (*p).sock.recv(instr); if ( n > 0) { txstring.append(instr); (*p).keep_alive = time(0); } p++; } catch (const SocketException& e) { txstring.clear(); LOG_INFO("closing socket fd %d, %d: %s", (*p).sock.fd(), e.error(), e.what()); try { (*p).sock.close(); } catch (const SocketException& e) { LOG_ERROR("socket error on # %d, %d: %s", (*p).sock.fd(), e.error(), e.what()); } arqclient.erase(p); } } if (arqclient.empty()) arq_reset(); } { /// Mutex is unlocked when leaving block guard_lock arq_rx_lock(&arq_rx_mutex); if (!txstring.empty()) parse_arqtext(txstring); if (abort_flag) { AbortARQ(); abort_flag = false; return true; } { if (txstring.empty()) return false; if (arqtext.empty()) { arqtext.assign(txstring); pText = 0; if (mailserver && progdefaults.PSKmailSweetSpot) active_modem->set_freq(progdefaults.PSKsweetspot); start_tx(); } else { arqtext.append(txstring); if (trx_state != STATE_TX) { if (debug_pskmail) LOG_INFO("%s","Restarting TX"); start_tx(); } } txstring.clear(); arq_text_available = true; active_modem->set_stopflag(false); } } return true; } //====================================================================== // Implementation using thread vice the fldigi timeout facility //====================================================================== void WriteARQ(unsigned char data) { guard_lock tosend_lock(&tosend_mutex); tosend += data; } void WriteARQ(const char *data) { guard_lock tosend_lock(&tosend_mutex); tosend.append(data); } static void *arq_loop(void *args) { SET_THREAD_ID(ARQ_TID); for (;;) { /* see if we are being canceled */ if (arq_exit) break; test_arq_clients(); { /// Mutex is unlocked when exiting block guard_lock tosend_lock(&tosend_mutex); enroute.clear(); if (!tosend.empty()) { enroute = tosend; tosend.clear(); } if (!enroute.empty()) { WriteARQsocket((unsigned char*)enroute.c_str(), enroute.length()); } } // order of precedence; Socket, Wrap autofile, TLF autofile if (!Socket_arqRx()) if (!WRAP_auto_arqRx()) TLF_arqRx(); MilliSleep(ARQLOOP_TIMING); } // exit the arq thread return NULL; } void arq_init() { arq_enabled = false; txstring.clear(); if (!ARQ_SOCKET_Server::start( progdefaults.arq_address.c_str(), progdefaults.arq_port.c_str() )) return; if (pthread_create(&arq_thread, NULL, arq_loop, NULL) < 0) { LOG_ERROR("arq init: pthread_create failed"); return; } arq_enabled = true; } void arq_close(void) { if (!arq_enabled) return; ARQ_SOCKET_Server::stop(); // tell the arq thread to kill it self arq_exit = true; // and then wait for it to die pthread_join(arq_thread, NULL); arq_enabled = false; arq_exit = false; } int arq_get_char() { /// Mutex is unlocked when returning from function guard_lock arq_rx_lock(&arq_rx_mutex); int c = 0; if (arq_text_available) { if (pText != arqtext.length()) { c = arqtext[pText++] & 0xFF; } else { arqtext.clear(); pText = 0; arq_text_available = false; c = GET_TX_CHAR_ETX; } } return c; } //====================================================================== // following function used if the T/R button is pressed to stop a transmission // that is servicing the ARQ text buffer. It allows the ARQ client to reset // itself properly //====================================================================== void AbortARQ() { /// Mutex is unlocked when returning from function guard_lock arq_lock(&arq_rx_mutex); arqtext.clear(); txstring.clear(); pText = 0; arq_text_available = false; // bSend0x06 = true; } //====================================================================== // Special notification for PSKMAIL: new mode marked only, in following // format: "", with = '0x12'. //====================================================================== void pskmail_notify_rsid(trx_mode mode) { static char buf[64]; memset(buf, 0, sizeof(buf)); int n = snprintf(buf, sizeof(buf), "\x12\n", mode_info[mode].name); if (n > 0 && n < (int)sizeof(buf)) { WriteARQ((const char *)buf); REQ(&FTextBase::addstr, ReceiveText, buf, FTextBase::CTRL); LOG_INFO("%s", buf); } } //====================================================================== // Special notification for PSKMAIL: signal to noise measured by decoder // format "" // where CC = count, A.a = average s/n, D.d = Std dev of s/n //====================================================================== void pskmail_notify_s2n(double s2n_ncount, double s2n_avg, double s2n_stddev) { static char buf[64]; memset(buf, 0, sizeof(buf)); int n = snprintf(buf, sizeof(buf), "\x12\n", s2n_ncount, s2n_avg, s2n_stddev); if (n > 0 && n < (int)sizeof(buf)) { WriteARQ((const char *)buf); REQ(&FTextBase::addstr, ReceiveText, buf, FTextBase::CTRL); LOG_INFO("%s", buf); } } fldigi-3.21.80/src/misc/charsetlist.cxx0000664000175000017500000000535012313064025014640 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include "config.h" #include "charsetlist.h" #include "tiniconv.h" const struct charset_info charset_list[] = { { "ASCII", TINICONV_CHARSET_ASCII }, { "CP1250", TINICONV_CHARSET_CP1250 }, { "CP1251", TINICONV_CHARSET_CP1251 }, { "CP1252", TINICONV_CHARSET_CP1252 }, { "CP1253", TINICONV_CHARSET_CP1253 }, { "CP1254", TINICONV_CHARSET_CP1254 }, { "CP1255", TINICONV_CHARSET_CP1255 }, { "CP1256", TINICONV_CHARSET_CP1256 }, { "CP1257", TINICONV_CHARSET_CP1257 }, { "CP1258", TINICONV_CHARSET_CP1258 }, { "CP936", TINICONV_CHARSET_CP936 }, { "GB2312", TINICONV_CHARSET_GB2312 }, { "GBK", TINICONV_CHARSET_GBK }, { "ISO-2022-JP", TINICONV_CHARSET_ISO_2022_JP }, { "ISO-8859-1", TINICONV_CHARSET_ISO_8859_1 }, { "ISO-8859-2", TINICONV_CHARSET_ISO_8859_2 }, { "ISO-8859-3", TINICONV_CHARSET_ISO_8859_3 }, { "ISO-8859-4", TINICONV_CHARSET_ISO_8859_4 }, { "ISO-8859-5", TINICONV_CHARSET_ISO_8859_5 }, { "ISO-8859-6", TINICONV_CHARSET_ISO_8859_6 }, { "ISO-8859-7", TINICONV_CHARSET_ISO_8859_7 }, { "ISO-8859-8", TINICONV_CHARSET_ISO_8859_8 }, { "ISO-8859-9", TINICONV_CHARSET_ISO_8859_9 }, { "ISO-8859-10", TINICONV_CHARSET_ISO_8859_10 }, { "ISO-8859-11", TINICONV_CHARSET_ISO_8859_11 }, { "ISO-8859-13", TINICONV_CHARSET_ISO_8859_13 }, { "ISO-8859-14", TINICONV_CHARSET_ISO_8859_14 }, { "ISO-8859-15", TINICONV_CHARSET_ISO_8859_15 }, { "ISO-8859-16", TINICONV_CHARSET_ISO_8859_16 }, { "CP866", TINICONV_CHARSET_CP866 }, { "KOI8-R", TINICONV_CHARSET_KOI8_R }, { "KOI8-RU", TINICONV_CHARSET_KOI8_RU }, { "KOI8-U", TINICONV_CHARSET_KOI8_U }, { "MACCYRILLIC", TINICONV_CHARSET_MACCYRILLIC }, { "UCS-2", TINICONV_CHARSET_UCS_2 }, { "UTF-7", TINICONV_CHARSET_UTF_7 }, { "UTF-8", TINICONV_CHARSET_UTF_8 }, { "CHINESE", TINICONV_CHARSET_CHINESE }, { "BIG5", TINICONV_CHARSET_BIG5 }, }; const unsigned int number_of_charsets = sizeof(charset_list)/sizeof(struct charset_info); fldigi-3.21.80/src/misc/icons.cxx0000664000175000017500000001461712313064025013434 00000000000000// ---------------------------------------------------------------------------- // icons.cxx // // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "icons.h" #include #include #include #include #if USE_IMAGE_LABELS # include # include # include # include # include # include #endif using namespace std; #if USE_IMAGE_LABELS typedef map imap_t; static imap_t* imap = 0; #endif #define FL_EMPTY_LABEL FL_FREE_LABELTYPE static void draw_empty(const Fl_Label*, int, int, int, int, Fl_Align) { } static void measure_empty(const Fl_Label*, int& w, int& h) { w = h = 0; } // The following functions create image+text menu item labels. // You've had too much FLTK if you already know how to do that. // Return a multi_label pointer, cast to a string, for `text' and // `pixmap'. This goes into the label pointer of a widget or menu // item. The text label is copied if we are using multi labels. You must // call set_icon_label on the widget or menu item before its draw() // function is called for the first time. // // A NULL pixmap means that the caller wants an empty, transparent, icon. const char* make_icon_label(const char* text, const char** pixmap) { #if USE_IMAGE_LABELS static imap_t* imap_ = 0; if (unlikely(!imap_)) { imap = imap_ = new imap_t; Fl::set_labeltype(FL_EMPTY_LABEL, draw_empty, measure_empty); } // Create a multi label and associate it with an Fl_Image* array Fl_Multi_Label* mlabel = new Fl_Multi_Label; Fl_Image** images = new Fl_Image*[2]; images[0] = new Fl_Pixmap(pixmap ? pixmap : clear_row_icon); images[1] = 0; // we create this on demand // set_icon_label_ will set mlabel->labela later mlabel->typea = _FL_IMAGE_LABEL; if (!text) text = ""; size_t len = strlen(text); char* s = new char[len + 2]; s[0] = ' '; memcpy(s + 1, text, len + 1); mlabel->labelb = s; mlabel->typeb = FL_NORMAL_LABEL; (*imap)[mlabel] = images; return (const char*)mlabel; #else return text; #endif } #if USE_IMAGE_LABELS // Find the item's label, which should be something that was returned by // make_icon_label, and set the active or inactive image. template void set_icon_label_(T* item) { imap_t::iterator j = imap->find((Fl_Multi_Label*)(item->label())); if (j == imap->end()) return; Fl_Multi_Label* mlabel = j->first; Fl_Image** images = j->second; unsigned char i = !item->active(); if (!images[i]) { // create inactive version of other image images[i] = images[!i]->copy(); images[i]->inactive(); } if (mlabel->typea == _FL_IMAGE_LABEL) mlabel->labela = (const char*)images[i]; else mlabel->labelb = (const char*)images[i]; item->image(images[i]); mlabel->label(item); item->labeltype(_FL_MULTI_LABEL); } #endif void set_icon_label(Fl_Menu_Item* item) { #if USE_IMAGE_LABELS set_icon_label_(item); #else // this isn't needed but it simplifies fldigi's UI setup code if (item->labeltype() == _FL_MULTI_LABEL) item->labeltype(FL_NORMAL_LABEL); #endif } void set_icon_label(Fl_Widget* w) { #if USE_IMAGE_LABELS set_icon_label_(w); w->image(0); #else if (w->labeltype() == _FL_MULTI_LABEL) w->labeltype(FL_NORMAL_LABEL); #endif } void toggle_icon_labels(void) { #if USE_IMAGE_LABELS for (imap_t::iterator i = imap->begin(); i != imap->end(); ++i) { // swap sublabels const char* l = i->first->labela; i->first->labela = i->first->labelb; i->first->labelb = l; if (i->first->typea == _FL_IMAGE_LABEL) { i->first->typea = FL_NORMAL_LABEL; i->first->typeb = FL_EMPTY_LABEL; i->first->labela++; } else { i->first->typea = _FL_IMAGE_LABEL; i->first->typeb = FL_NORMAL_LABEL; i->first->labelb--; } } #endif } template const char* get_icon_label_text_(T* item) { #if USE_IMAGE_LABELS if (item->labeltype() == _FL_MULTI_LABEL) { imap_t::iterator i = imap->find((Fl_Multi_Label*)(item->label())); if (i == imap->end()) return 0; if (i->first->typeb == FL_NORMAL_LABEL) return i->first->labelb + 1; else // disabled icons return i->first->labela; } else #endif return item->label(); } const char* get_icon_label_text(Fl_Menu_Item* item) { return get_icon_label_text_(item); } const char* get_icon_label_text(Fl_Widget* w) { return get_icon_label_text_(w); } template void free_icon_label_(T* item) { #if USE_IMAGE_LABELS if (item->labeltype() == FL_NORMAL_LABEL) { delete [] item->label(); item->label(0); return; } imap_t::iterator i = imap->find((Fl_Multi_Label*)item->label()); if (i == imap->end()) return; item->label(0); // delete the images delete i->second[0]; delete i->second[1]; delete [] i->second; // delete the multi label delete [] ((i->first->typeb == FL_NORMAL_LABEL) ? i->first->labelb : i->first->labela-1); delete i->first; imap->erase(i); #endif } void free_icon_label(Fl_Menu_Item* item) { free_icon_label_(item); } void free_icon_label(Fl_Widget* w) { free_icon_label_(w); } template void set_active_(T* t, bool v) { if (v) t->activate(); else t->deactivate(); if (t->labeltype() == _FL_MULTI_LABEL) set_icon_label(t); } void set_active(Fl_Menu_Item* item, bool v) { set_active_(item, v); } void set_active(Fl_Widget* w, bool v) { set_active_(w, v); } static Fl_Image* msg_icon; void set_message_icon(const char** pixmap) { if (msg_icon && msg_icon->data() == pixmap) return; delete msg_icon; Fl_Widget* msg = fl_message_icon(); msg->label(""); msg->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE); msg->color(msg->parent()->color()); msg->box(FL_NO_BOX); msg->image(msg_icon = new Fl_Pixmap(pixmap)); } fldigi-3.21.80/src/misc/re.cxx0000664000175000017500000000673612313331760012735 00000000000000// ---------------------------------------------------------------------------- // re.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include "re.h" using namespace std; re_t::re_t(const char* pattern_, int cflags_) : pattern(pattern_), cflags(cflags_), eflags(0), error(false) { compile(); } re_t::re_t(const re_t& re) : pattern(re.pattern), cflags(re.cflags), eflags(re.eflags), suboffsets(re.suboffsets), substrings(re.substrings) { compile(); } re_t::~re_t() { if (!error) regfree(&preg); } re_t& re_t::operator=(const re_t& rhs) { if (&rhs == this) return *this; pattern = rhs.pattern; cflags = rhs.cflags; eflags = rhs.eflags; suboffsets = rhs.suboffsets; substrings = rhs.substrings; if (!error) regfree(&preg); compile(); return *this; } void re_t::recompile(const char* pattern_) { pattern = pattern_; if (!error) regfree(&preg); compile(); } void re_t::compile(void) { error = regcomp(&preg, pattern.c_str(), cflags); if (!error && !(cflags & REG_NOSUB) && preg.re_nsub > 0) suboffsets.resize(preg.re_nsub + 1); } bool re_t::match(const char* str, int eflags_) { if (error) return false; eflags = eflags_; bool nosub = cflags & REG_NOSUB || preg.re_nsub == 0; bool found = !regexec(&preg, str, (nosub ? 0 : preg.re_nsub+1), (nosub ? NULL : &suboffsets[0]), eflags_); substrings.clear(); if (found && !nosub) { size_t n = suboffsets.size(); substrings.resize(n); for (size_t i = 0; i < n; i++) if (suboffsets[i].rm_so != -1) substrings[i].assign(str + suboffsets[i].rm_so, suboffsets[i].rm_eo - suboffsets[i].rm_so); } return found; } const string& re_t::submatch(size_t n) const { return substrings[n]; } void re_t::suboff(size_t n, int* start, int* end) const { if (n < nsub()) { if (start) *start = suboffsets[n].rm_so; if (end) *end = suboffsets[n].rm_eo; } else { if (start) *start = -1; if (end) *end = -1; } } #ifdef __clang__ # include #else # include #endif size_t re_t::hash(void) const { #ifdef __clang__ size_t h = std::hash()(pattern); return h ^ (std::hash()(cflags) + 0x9e3779b9 + (h << 6) + (h >> 2)); #else size_t h = tr1::hash()(pattern); return h ^ (tr1::hash()(cflags) + 0x9e3779b9 + (h << 6) + (h >> 2)); #endif } // ------------------------------------------------------------------------ fre_t::fre_t(const char* pattern_, int cflags_) : re_t(pattern_, cflags_) { } bool fre_t::match(const char* str, int eflags_) { if (error) return false; bool nosub = cflags & REG_NOSUB || preg.re_nsub == 0; return !regexec(&preg, str, (nosub ? 0 : preg.re_nsub+1), (nosub ? NULL : &suboffsets[0]), eflags_); } fldigi-3.21.80/src/misc/pixmaps_tango.cxx0000664000175000017500000032652112313064025015172 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include // This file contains pixmap versions of icons from the Tango Icon Library // (version 0.8.90) at http://tango.freedesktop.org/Tango_Icon_Library // which was released into the Public Domain. This file was prepared by // Kamal Mostafa , and is likewise released into the // Public Domain. // These #define's map the (new) Tango icon names (named after their source // files) to the pixmap identifier names used throughout the fldigi source: #define tango_x_office_address_book address_book_icon #define tango_applications_system applications_system_icon #define tango_internet_group_chat chat_icon #define tango_dialog_information dialog_information_icon #define tango_edit_clear edit_clear_icon #define tango_edit_copy edit_copy_icon #define tango_edit_cut edit_cut_icon #define tango_edit_paste edit_paste_icon #define tango_edit_select_all edit_select_all_icon #define tango_edit_undo edit_undo_icon #define tango_emblem_system emblems_system_icon #define tango_application_x_executable executable_icon #define tango_document_open file_open_icon #define tango_folder_open folder_open_icon #define tango_help_browser help_browser_icon #define tango_image_x_generic image_icon #define tango_go_previous left_arrow_icon #define tango_system_log_out log_out_icon #define tango_list_remove minus_icon #define tango_multimedia_player multimedia_player_icon #define tango_internet_web_browser net_icon #define tango_list_add plus_icon #define tango_preferences_desktop_font preferences_desktop_font_icon #define tango_process_stop process_stop_icon #define tango_view_refresh refresh_icon #define tango_go_next right_arrow_icon #define tango_document_save_as save_as_icon #define tango_document_save save_icon #define tango_system_shutdown shutdown_icon #define tango_start_here start_here_icon #define tango_system_software_update system_software_update_icon #define tango_system_users system_users_icon #define tango_accessories_text_editor text_editor_icon #define tango_text_x_generic text_icon #define tango_x_office_calendar time_icon #define tango_user_trash trash_icon #define tango_utilities_system_monitor utilities_system_monitor_icon #define tango_utilities_terminal utilities_terminal_icon #define tango_weather_clear weather_clear_icon #define tango48_dialog_information dialog_information_48_icon #define tango48_dialog_warning dialog_warning_48_icon // --------------------------------------------------------------------- // Tango icons // --------------------------------------------------------------------- /* mimetypes/x-office-address-book.png */ /* XPM */ const char *tango_x_office_address_book[] = { /* width height ncolors chars_per_pixel */ "16 16 125 2", /* colors */ " c #000000", " . c #C0D2E4", " X c #ACC3DA", " o c #A78AB1", " O c #9DB029", " + c #C3CFE0", " @ c #9AA5C5", " # c #D8E4F1", " $ c #A7BFD8", " % c #D7E4F0", " & c #99A7C7", " * c #A9B8D0", " = c #D2DEEB", " - c #ABB0BE", " ; c #A887AE", " : c #9CA2C3", " > c #AC80A8", " , c #CBD8E7", " < c #A789B0", " 1 c #617296", " 2 c #AB82AA", " 3 c #C3D0E2", " 4 c #AA84AC", " 5 c #B7CBE0", " 6 c #A9B3CF", " 7 c #8290AC", " 8 c #7E8CA8", " 9 c #ACB1BE", " 0 c #95B1CF", " q c #CEDBE9", " w c #99A580", " e c #7E8CAB", " r c #AAACC9", " t c #B5B5B6", " y c #A491B6", " u c #7B8AA8", " i c #7A88A7", " p c #9BA3C4", " a c #727E0A", " s c #DEDEDE", " d c #AB92B6", " f c #8F9FB8", " g c #96AECC", " h c #B1C0D6", " j c #AA83AB", " k c #A2AB7B", " l c #FCE94F", " z c #808DA9", " x c #C7D7E8", " c c #8F9E86", " v c #95B0CE", " b c #CC0000", " n c #A5BDD7", " m c #A8B8D0", " M c #D1DEEB", " N c #D0DCEA", " B c #CFDCE9", " V c #CEDAE8", " C c #A8AEBC", " Z c #A889AF", " A c #AC80A9", " S c #9BA2C3", " D c #CFDCEC", " F c #9DB7D2", " G c #6F6384", " H c #5A7AA4", " J c #A78BB1", " K c #67837F", " L c #9AA4C5", " P c #AFBAC9", " I c #B9CBE0", " U c #B4B9C4", " Y c #9E9DBF", " T c #BCC8D9", " R c #828EAA", " E c #95AFCD", " W c #9FABC3", " Q c #D7E3F0", " ! c #D3DFEC", " ~ c #A9B9D0", " ^ c #9D9FC1", " / c #B4C9DE", " ( c #AFB5C2", " ) c #ABB1BE", " _ c #EDD400", " ` c #C1C1C3", " ' c #9CA1C3", " ] c #698373", " [ c #A7ADBD", " { c #A9C1D9", " } c #A8BFD8", " | c #A9ACB8", ". c #AA85AC", ".. c #9D9EC0", ".X c #B7CAE0", ".o c #818FAB", ".O c #808DAA", ".+ c #AC8BB1", ".@ c #A987AE", ".# c #8B96AE", ".$ c #CFDCEA", ".% c #6C7CA0", ".& c #785977", ".* c #A889B0", ".= c #AC82AA", ".- c #DDDDDD", ".; c #CCDAEA", ".: c #9AA6C6", ".> c #BACDE2", "., c #B8CBE0", ".< c #9E9DC0", ".1 c #8390AC", ".2 c #EF2929", ".3 c #C6D6E7", ".4 c #95AFCE", ".5 c #A58DB3", ".6 c #A986AD", ".7 c #BFCCE0", ".8 c #A9B9D1", ".9 c #CFDBE9", ".0 c #B9B9B9", ".q c #CEDBE8", ".w c #B7B7B7", ".e c #CBD7E5", ".r c None", /* pixels */ ".r H H H H H H H H H H H H H.r.r", " H.% =.3.> / n n $ $ } } F c _.r", " H T N 3 D { L < A. .< 0 X c l _", " H +.$ h.; 6 4 p.4 & ; S X w l _", " H.e B m.; d ^ Y 2 j & o X k l _", " H M.9 m.;.= g 4...6 E A X ] O a", " H Q q *.; A E A '.@ : Z X ] O a", " H #.q ~.;.+ L y.*.5 4.: X K O a", " H #.q.8.; r ; & v 0 0 0 X G.2 b", " H % V.7.; { @ J >.6 0 0 X G.2 b", " H Q ! D x ..X 5 5.,.,., I G.2 b", " H , e R z 8 i u.o 7.1.O 1.& b.r", " H W t.w.w.w.w.w.w.w.0 P H H.r.r", " H f `.-.-.-.-.- s s s U H H.r.r", " H H.# [ ( - - ) ) 9 9 C | H.r.r", ".r H H H H H H H H H H H H H.r.r" }; /* categories/applications-system.png */ /* XPM */ const char *tango_applications_system[] = { /* width height ncolors chars_per_pixel */ "16 16 19 1", /* colors */ " c #000000", ". c #7CA1CF", "X c #497CBA", "o c #3F638F", "O c #6490C7", "+ c #467ABA", "@ c #395578", "# c #436FA5", "$ c #BCCDE3", "% c #5682B7", "& c #86A7D2", "* c #82A5D1", "= c #4C7FBD", "- c #426B9C", "; c #5686C3", ": c #9DB8DA", "> c #457ABE", ", c #8FAED5", "< c None", /* pixels */ "<<<<<<<<<<<<<<<<", "<<<<<<>>><<<<<<<", "<<<>><>$><>><<<<", "<<>$&>O:O>&$><<<", "<<>&:::::::&><<<", "<<<>:.+;+*:><<<<", "<>>O:+-><<", "<>$::;<<<;::$><<", "<>>O:=%<#+:O>><<", "<<<>$.=;+,:><<<<", "<<>&:::::::&><<<", "<<>$&>O:O>&$><<<", "<<<>><>$><>><<<<", "<<<<<<>>><<<<<<<", "<<<<<<<<<<<<<<<<", "<<<<<<<<<<<<<<<<" }; /* apps/internet-group-chat.png */ /* XPM */ const char *tango_internet_group_chat[] = { /* width height ncolors chars_per_pixel */ "16 16 23 1", /* colors */ " c #000000", ". c #9D9D9D", "X c #F2F2F2", "o c #F0F0F0", "O c #EEEEEE", "+ c #ECECEC", "@ c #EAEAEA", "# c #2D2D2D", "$ c #767774", "% c #888A85", "& c #858682", "* c #797A76", "= c #C6C6C4", "- c #FFFFFF", "; c #F1F1F1", ": c #EFEFEF", "> c #EDEDED", ", c #EBEBEB", "< c #E9E9E9", "1 c #343434", "2 c #2A2A2A", "3 c #868884", "4 c None", /* pixels */ "4444%%%%%%%%%%%4", "444%-----------%", "444%-,@<<<<<<<-%", "4%%%%%%%%%%%=<-%", "%-----------%<-%", "%-<<<<<<<@,-%@-%", "%-<<<<<@,++-%,-%", "%-<<<<@,+>O-%--%", "%-<<@,+>O::-%-%4", "%-@,++>O:o;-%-%4", "%-,+>O::o;X-%%%4", "%--O:-------%4%4", "4%-:-%%%%%%%.444", "4%--%44444444444", "4%%%444444444444", "4%44444444444444" }; /* status/dialog-information.png */ /* XPM */ const char *tango_dialog_information[] = { /* width height ncolors chars_per_pixel */ "16 16 127 2", /* colors */ " c #000000", " . c #394B7A", " X c #E8EFF4", " o c #4A577A", " O c #CBD9E8", " + c #40507A", " @ c #E3E6BA", " # c #F5F8FA", " $ c #80805C", " % c #C8D7E8", " & c #C5D5E5", " * c #3B4C78", " = c #3A4A77", " - c #D4E0ED", " ; c #C1CCD7", " : c #E0E9F2", " > c #546083", " , c #394A79", " < c #EBF0F6", " 1 c #475780", " 2 c #EBEDC1", " 3 c #46557F", " 4 c #F7F9FB", " 5 c #C5D2E1", " 6 c #5988B9", " 7 c #3D4D76", " 8 c #D9E3EE", " 9 c #495985", " 0 c #595942", " q c #B5C7DB", " w c #586383", " e c #9BAEC8", " r c #A9C0D9", " t c #3C4D78", " y c #F3F7FA", " u c #3B4B77", " i c #5382B6", " p c #D3DFEB", " a c #EDEFF4", " s c #E2EAF3", " d c #393936", " f c #5E8DBA", " g c #F5F8CA", " h c #A5BED8", " j c #616471", " k c #384977", " l c #EEF3F8", " z c #D0DDEB", " x c #CEDBE9", " c c #4F5873", " v c #FAFCFD", " b c #779DC5", " n c #485883", " m c #E8EFF5", " M c #ABB198", " N c #B5C6DA", " B c #E2E7EF", " V c #AAC1D9", " C c #3E4E79", " Z c #E0E5ED", " A c #DDDFAB", " S c #435177", " D c #8C9BB8", " F c #C3D3E4", " G c #98A4BD", " H c #B5CAE0", " J c #D0D5E0", " K c #DFE7F2", " L c #DEE7F1", " P c #91AECD", " I c #384A79", " U c #41517B", " Y c #8A8B66", " T c #E0E6EC", " R c #5E5E3E", " E c #B9C4D6", " W c #5E6880", " Q c #8D9CB8", " ! c #3A4B77", " ~ c #EFF3F7", " ^ c #9AA5BE", " / c #FCFCFD", " ( c #A6AC98", " ) c #789DC4", " _ c #C1D2E4", " ` c #F3F6C9", " ' c #3A4B7A", " ] c #C0D0E3", " [ c #384978", " { c #87A8CC", " } c #ECF1F7", " | c #4B7EB2", ". c #45547E", ".. c #CCD9E8", ".X c #D3D5B0", ".o c #3D4C76", ".O c #D8E2ED", ".+ c #4A5A86", ".@ c #D4E0EC", ".# c #5281B5", ".$ c #7E90B2", ".% c #FFFFFF", ".& c #A7AD98", ".* c #608EBC", ".= c #C2D3E4", ".- c #464646", ".; c #4B5B83", ".: c #EBF0F5", ".> c #FAFBFD", "., c #A4ADC3", ".< c #303030", ".1 c #C9D6E7", ".2 c #C7D6E5", ".3 c #F4F7FA", ".4 c #C2D0E0", ".5 c #D6E1ED", ".6 c #9DB9D6", ".7 c #7E91B1", ".8 c #B7C2D5", ".9 c #59627C", ".0 c #A6BED8", ".q c #A8AA84", ".w c #D2DAE2", ".e c #DFE8F2", ".r c #5C89BA", ".t c #5B89B9", ".y c None", /* pixels */ ".y.y.y.y.y u = [ I !.o.y.y.y.y.y", ".y.y.y.y *., a / 4 B ^ C.y.y.y.y", ".y.y.y t J # X s 8 p.O E U.y.y.y", ".y.y 7., # ~.3 <.e -.= & Q S.y.y", ".y.y + a m y v } K z _ ) 5 3.y.y", ".y.y ,.> : l.%.%.%.% ;.y x ..y.y", ".y.y '.3.5 L.%.: T.w P.y.1 ..y.y", ".y.y. Z O %.% ] H.6.y.* q n.y.y", ".y.y o G.@.0.% h {.y | V.7 >.y.y", ".y.y.y 1.8 F b.%.y f r e 9.y.y.y", ".y.y.y.y 1 D.4...2 N.$.+.y.y.y.y", ".y.y.y.y.y w.; (.& M W.y.y.y.y.y", ".y.y.y.y.y.y R 2 g A R.y.y.y.y.y", ".y.y.y.y.y.y R $.q Y R.y.y.y.y.y", ".y.y.y.y.y.y R @ `.X R.y.y.y.y.y", ".y.y.y.y.y.y.y d.-.<.y.y.y.y.y.y" }; /* actions/edit-clear.png */ /* XPM */ const char *tango_edit_clear[] = { /* width height ncolors chars_per_pixel */ "16 16 113 2", /* colors */ " c #E7D75B", " . c #EED723", " X c #AB1B0D", " o c #C86D33", " O c #BBA529", " + c #FDEC6D", " @ c #C5B536", " # c #DCC407", " $ c #EDDA46", " % c #A08E01", " & c #9F8E00", " * c #CDBD41", " = c #E8DA6C", " - c #D7B162", " ; c #E6D656", " : c #E1D35B", " > c #CCBD43", " , c #FDE952", " < c #E7D018", " 1 c #9C8800", " 2 c #C6B633", " 3 c #C5B432", " 4 c #BC7A0F", " 5 c #FDEA5F", " 6 c #CFC149", " 7 c #A29009", " 8 c #A19008", " 9 c #FDEB6C", " 0 c #D2C34F", " q c #DCC610", " w c #AE9E1B", " e c #F8EA88", " r c #AB6D0B", " t c #C17D10", " y c #F3E365", " u c #B2760B", " i c #9E8D01", " p c #E4D249", " a c #ECDC68", " s c #E7D96D", " d c #BB4A28", " f c #9F8F05", " g c #F6D861", " h c #9A8500", " j c #FDEC6B", " k c #FDEB61", " l c #EBDD77", " z c #804E01", " x c #DAC203", " c c #9F8E01", " v c #AB9B1A", " b c #E2D467", " n c #9F8E04", " m c #EADC72", " M c #A12400", " N c #B8381D", " B c #876400", " V c #FDEA63", " C c #DDCF5E", " Z c #FDEF84", " A c #A08F01", " S c #9F8D00", " D c #D8C84F", " F c #E3CB11", " G c #A96B0A", " H c #C6B530", " J c #BEAE32", " K c #FDEE7D", " L c #B2720C", " P c #9C8B00", " I c #9C7F00", " U c #A6690A", " Y c #FDEF8A", " T c #E5D44E", " R c #B06917", " E c #F3DB2A", " W c #DCC510", " Q c #FBED8B", " ! c #A18801", " ~ c #D6C856", " ^ c #7B4A00", " / c #FBEA84", " ( c #FFFFFF", " ) c #9D8C00", " _ c #FCE53C", " ` c #A03600", " ' c #E4D34C", " ] c #DCCD58", " [ c #DFCA26", " { c #784800", " } c #EBDE77", " | c #B1A01D", ". c #C0B02F", ".. c #DBC304", ".X c #F6DE2F", ".o c #AD4213", ".O c #E7D85F", ".+ c #A59411", ".@ c #FBE437", ".# c #7C4B00", ".$ c #9F8D01", ".% c #9E8D00", ".& c #E5CD14", ".* c #FBE544", ".= c #DCC615", ".- c #FDE63C", ".; c #865203", ".: c #845201", ".> c #A08F05", "., c #CDBE45", ".< c #794900", ".1 c #8A6900", ".2 c None", /* pixels */ ".2.# ^.2.2.2.2.2.2.2.2.2.2.2.2.2", " ^ U r ^.2.2.2.2.2.2.2.2.2.2.2.2", " ^ L t G ^.2 P.2.2.2.2.2.2.2.2.2", ".2.; 4 t.: h P.2.2.2.2.2.2.2.2.2", ".2 ^ z u ! J |.2.2.2.2.2.2.2.2.2", ".2.2 B 1 * } R ` A.2.2.2.2.2.2.2", ".2.2 i D a o X - m > 7 c.2.2.2.2", ".2.2.% O d N g V 9 K e., f &.2.2", ".2.2.2 M.o / j Z + ,.* y l 6 w )", ".2.2.2.2. Y 5 k ,.- E < q p b.$", ".2.2.2.2.+ Q _.@.X ..&.. x ; 2 &", ".2.2.2.2 % C $ < F # x x ' ] n.2", ".2.2.2.2.2 v = W x x.= ~.>.2.2", ".2.2.2.2.2 & @.O [ T s 3.%.2.2.2", ".2.2.2.2.2.2.% 0 : H 8 S.2.2.2.2", ".2.2.2.2.2.2.2 ).%.%.2.2.2.2.2.2" }; /* actions/edit-copy.png */ /* XPM */ const char *tango_edit_copy[] = { /* width height ncolors chars_per_pixel */ "16 16 44 1", /* colors */ " c #000000", ". c #E3E4E2", "X c #9A9B97", "o c #8D8F8A", "O c #898B86", "+ c #C8C8C7", "@ c #C6C6C5", "# c #C4C4C3", "$ c #8F908B", "% c #FEFEFE", "& c #FAFAFA", "* c #F4F4F4", "= c #F2F2F2", "- c #EEEEEE", "; c #ECECEC", ": c #EAEAEA", "> c #8E9189", ", c #D4D4D4", "< c #C3C4C3", "1 c #F7F7F6", "2 c #F3F3F2", "3 c #EFEFEE", "4 c #EDEDEC", "5 c #E3E3E2", "6 c #989A95", "7 c #8C8E89", "8 c #8A8C87", "9 c #888A85", "0 c #C7C7C6", "q c #FFFFFF", "w c #FBFBFB", "e c #F9F9F9", "r c #F3F3F3", "t c #EBEBEB", "y c #989A96", "u c #FEFEFD", "i c #FCFCFB", "p c #FAFAF9", "a c #F8F8F7", "s c #F6F6F5", "d c #F4F4F3", "f c #F0F0EF", "g c #EEEEED", "h c None", /* pixels */ "hhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhh", "hhhhX9999999999o", "hhhh8qqqqqqqqqq9", "hhhhOqffffffffq9", "hhhh8qf000000fq9", "hhhhOqffffffffq9", "hhhh8qf00000ffq9", "hhhhOqfffffff&r9", "hhhh8qf00000-1<9", "hhhh8qfffff77779", "hhhhOuffff&6&a.9", "hhhhOpfff&&6&599", "hhhhO*1siw,y.9hh", "hhhh7O9999999hhh" }; /* actions/edit-cut.png */ /* XPM */ const char *tango_edit_cut[] = { /* width height ncolors chars_per_pixel */ "16 16 94 2", /* colors */ " c #000000", " . c #AA0909", " X c #A80707", " o c #959792", " O c #939590", " + c #91938E", " @ c #AB0D0D", " # c #90918D", " $ c #8F918C", " % c #A90B0B", " & c #8D8F8A", " * c #8B8D88", " = c #CB1F1F", " - c #9C2F2C", " ; c #B3B2AF", " : c #C01514", " > c #A80403", " , c #A70202", " < c #AB1313", " 1 c #AA0808", " 2 c #A80606", " 3 c #E1E1DF", " 4 c #AE1919", " 5 c #B70F0E", " 6 c #CE1E1E", " 7 c #A90A0A", " 8 c #D2D3D0", " 9 c #AA0E0E", " 0 c #DB2727", " q c #F5F6F5", " w c #AE1818", " e c #EFF0EF", " r c #D01F1F", " t c #CE1D1D", " y c #CD1D1C", " u c #898984", " i c #CCCEC9", " p c #C6C8C3", " a c #AA0D0D", " s c #B8BAB5", " d c #AB1111", " f c #B6B8B3", " g c #B5B6B2", " h c #F7F7F6", " j c #D42222", " k c #AAACA7", " l c #A60202", " z c #D22020", " x c #B80D0D", " c c #9FA09C", " v c #A70606", " b c #9A9C97", " n c #92948F", " m c #C91A1A", " M c #AA0C0C", " N c #8E908B", " B c #8C8E89", " V c #8A8C87", " C c #AB1010", " Z c #D62323", " A c #A80303", " S c #A60101", " D c #A90707", " F c #AF1A1A", " G c #A40502", " H c #AB1616", " J c #DBDCD9", " K c #CD1D1D", " L c #CA1B1A", " P c #AA0B0B", " I c #D2D4D0", " U c #CDCECB", " Y c #C5C6C3", " T c #C01513", " R c #B5B6B3", " E c #F7F7F7", " W c #AD1717", " Q c #D12020", " ! c #A34A45", " ~ c #B50B0B", " ^ c #A60606", " / c #A00A00", " ( c #C71A19", " ) c #BABBB7", " _ c #B3B5B0", " ` c #AEAFAB", " ' c #D52323", " ] c #D32121", " [ c #A8A9A5", " { c #D11F1F", " } c #AB1414", " | c #CF1D1D", ". c #E7E8E6", ".. c None", /* pixels */ "........ * O........ * $........", "...... N E *........ # 8 $......", "...... * I e n...... k p &......", "...... & _ h *.... N i ` *......", "........ * J e + B f U *........", "........ & g E * c R s *........", ".......... * 3 q b [ *..........", ".......... & ). k N V..........", "............ u Y ; -............", "........ w H ^ ! l ( W w........", "...... D z 6 5 G > m Q = 7......", ".... 2 r A : S.... y T A K v....", ".. } '.... t 7.... A L.... Q }..", ".. @ |.. ~ ] M.... . Z x.. { d..", ".. < 0 r t X........ 1 j | t <..", ".... 9 C H............ a P %...." }; /* actions/edit-paste.png */ /* XPM */ const char *tango_edit_paste[] = { /* width height ncolors chars_per_pixel */ "16 16 79 1", /* colors */ " c #000000", ". c #6A6C68", "X c #666864", "o c #C68827", "O c #6E4602", "+ c #6D4401", "@ c #C08424", "# c #7F7F7C", "$ c #EFEFED", "% c #EDEDEB", "& c #EBEBE9", "* c #E9E9E7", "= c #E7E7E5", "- c #676964", "; c #DBDBD9", ": c #B2B4B4", "> c #6E6C64", ", c #CCCDCA", "< c #6B4301", "1 c #FEFEFE", "2 c #F2F2F2", "3 c #EDEEED", "4 c #BA7F23", "5 c #D8D8D5", "6 c #E0E0E0", "7 c #A77D3B", "8 c #5C5C5B", "9 c #6C4401", "0 c #C1C2BE", "q c #B9BAB6", "w c #6B4403", "e c #B37B22", "r c #EFEFEE", "t c #EDEDEC", "y c #EBEBEA", "u c #C58726", "i c #97978A", "p c #6E4502", "a c #80807D", "s c #7E7E7B", "d c #ECECEA", "f c #EAEAE8", "g c #716F64", "h c #E8E8E6", "j c #706D63", "k c #DADAD8", "l c #6F4602", "z c #B97F23", "x c #B3B5B5", "c c #6E6D64", "v c #CDCECB", "b c #A17C40", "n c #5E5E5E", "m c #5C5C5C", "M c #6A4200", "N c #C28628", "B c #FFFFFF", "V c #E7E7E4", "C c #F1F1F1", "Z c #D9D9D6", "A c #B1B2B2", "S c #C58727", "D c #5F5F5E", "F c #959589", "G c #6C4301", "H c #6B4300", "J c #B9B9B6", "K c #B8B9B5", "L c #FEFEFD", "P c #B7B7B4", "I c #736F64", "U c #BBBBBB", "Y c #F0F0EF", "T c #EEEEED", "R c #A47E3E", "E c #A37C3D", "W c #ECECEB", "Q c #706D64", "! c None", /* pixels */ "!!!!!DmmmmD!!!!!", "!!+9w8FiiF8w99!!", "!+@RQn#aasn>bzG!", "!logC6UUUU62cSM!", "!loXBYYYYYYB-NM!", "!luXBYxxxxrB-NM!", "!luXBYYYY$%B-NM!", "!OuXBYxx:AfB-NM!", "!OuXBYrtyf;B-NM!", "!OuXBTW&*k,B-NM!", "!OuXBdfhvqKB-NM!", "!puXB*=ZJBBB-NM!", "!puXBV50PBB-SNM!", "!puj3111rL-SSSM!", "!G47I.....EEEe c #F2F2F2", ", c #F0F0F0", "< c #EEEEEE", "1 c #ECECEC", "2 c #8B8D89", "3 c #B2C8E0", "4 c #B0C6DE", "5 c #AEC4DC", "6 c #ACC2DA", "7 c #AAC0D8", "8 c #8C8E89", "9 c #A8BED6", "0 c #888A85", "q c #8298B0", "w c #FFFFFF", "e c #FDFDFD", "r c #FBFBFB", "t c #F9F9F9", "y c #F7F7F7", "u c #F5F5F5", "i c #EBEBEB", "p c None", /* pixels */ "p20000000000008p", "p0e&&ee**rr==t$p", "p0e9##77+++++-$p", "p0&#%%%%6%%%6-$p", "p0e7%%%%OOOOO-$p", "p0e7%%%%O555i-$p", "p0*+%%%%5%%o1-$p", "p0*66O5oo444<-$p", "p0*6O5oo44XX,-$p", "p0r6%%%%%%%3>y$p", "p0rO5o44 3 .:y$p", "p0=O5o4X3 u;;y$p", "p0tOqqqq3 y-yy$p", "p0tO5o4X3 yt-y$p", "p0------ - ---$p", "p8000000000000@p" }; /* actions/edit-undo.png */ /* XPM */ const char *tango_edit_undo[] = { /* width height ncolors chars_per_pixel */ "16 16 70 1", /* colors */ " c #000000", ". c #F3E56A", "X c #F4DF2C", "o c #F1DB29", "O c #F9EA69", "+ c #DFC80A", "@ c #BB9F15", "# c #F6E131", "$ c #EBDC6F", "% c #C4A000", "& c #EFE276", "* c #D6C004", "= c #C19E00", "- c #BBA11B", "; c #EEE16E", ": c #FAEC73", "> c #BCA015", ", c #F8E232", "< c #DAC304", "1 c #F5E02F", "2 c #C1A313", "3 c #7D7905", "4 c #FAEB6F", "5 c #DFC90F", "6 c #BEA113", "7 c #ECD936", "8 c #E3CD16", "9 c #BF9D00", "0 c #C1A319", "q c #DBC443", "w c #C8AC02", "e c #BCA114", "r c #F7DD05", "t c #FBED76", "y c #DFC80B", "u c #FBED79", "i c #B99900", "p c #7C7A06", "a c #D8C207", "s c #E9DA5D", "d c #CBAA0E", "f c #F7E86E", "g c #F2E469", "h c #E8D21D", "j c #C0A41A", "k c #F7E232", "l c #FBF3AD", "z c #C1A314", "x c #F6E769", "c c #FBE425", "v c #C5AB1B", "b c #C4A71A", "n c #C0A623", "m c #E1CD40", "M c #C2A611", "N c #BDA116", "B c #C2A211", "V c #FAE320", "C c #BFA31B", "Z c #EADB66", "A c #C3A618", "S c #F7E86C", "D c #F2E788", "F c #E3CE41", "G c #F5E66D", "H c #F6E02F", "J c #D8C543", "K c #7E7905", "L c #C4A901", "P c None", /* pixels */ "PPPPPP%PPPPPPPPP", "PPPPP%%PPPPPPPPP", "PPPP%l%PPPPPPPPP", "PPP%lc%%6@-PPPPP", "PP%l#V:4fSezPPPP", "P%lHko1o87xF2PPP", "%lH,kk1ohhh7mNPP", "P%u,X***hhhy.v>P", "PP%t c #979993", ", c #C0C0BE", "< c None", /* pixels */ "<<<<<<<<<<<<<<<<", "<<<<<<---<<<<<<<", "<<<--<-:-<--<<<<", "<<-:,-@&@-,:-<<<", "<<-,&&&&&&&,-<<<", "<<<-&O+>+;&-<<<<", "<--@&+%<*#&@--<<", "<-:&&><<<>&&:-<<", "<--@&oX<$+&@--<<", "<<<-:Oo>+.&-<<<<", "<<-,&&&&&&&,-<<<", "<<-:,-@&@-,:-<<<", "<<<--<-:-<--<<<<", "<<<<<<---<<<<<<<", "<<<<<<<<<<<<<<<<", "<<<<<<<<<<<<<<<<" }; /* mimetypes/application-x-executable.png */ /* XPM */ const char *tango_application_x_executable[] = { /* width height ncolors chars_per_pixel */ "16 16 70 1", /* colors */ " c #000000", ". c #9BABC3", "X c #8790B6", "o c #ADB8CE", "O c #ABB6CC", "+ c #5F7A9F", "@ c #7F90B1", "# c #A5B2C9", "$ c #A4B2C8", "% c #9197BC", "& c #9FAEC6", "* c #8991B7", "= c #AFB9CF", "- c #AEB9CE", "; c #BFC4D8", ": c #7382AB", "> c #95A2BF", ", c #949ABE", "< c #7D89B1", "1 c #7C89B0", "2 c #8D9EBA", "3 c #8E9CBB", "4 c #A0AFC6", "5 c #B0BACF", "6 c #9D9FC3", "7 c #C1C5D9", "8 c #7483AB", "9 c #99A3C2", "0 c #858EB5", "q c #AAB6CC", "w c #8F9BBB", "e c #9099BC", "r c #A2AEC7", "t c #A1AAC6", "y c #7786AD", "u c #8895B7", "i c #ACB7CD", "p c #7182AA", "a c #566F99", "s c #7A87AF", "d c #ACB0CC", "f c #8394B4", "g c #A8B4CB", "h c #A7B4CA", "j c #A7B2CA", "k c #50688F", "l c #A5B0C8", "z c #C8CADD", "x c #546C96", "c c #7C8EB0", "v c #7C8CB0", "b c #7B88AF", "n c #8D9FBA", "m c #7A88AE", "M c #B2BBD1", "N c #B1BBD0", "B c #516A96", "V c #7584AC", "C c #364878", "Z c #858FB5", "A c #98A2C1", "S c #ABB5CD", "D c #A9B5CB", "F c #A9B3CB", "G c #A7B1C9", "H c #486490", "J c #A3B1C8", "K c #B3BCD1", "L c #C3C7DA", "P c None", /* pixels */ "PPPPPPPCPPPPPPPP", "PPPPPPCLCPPPPPPP", "PPPPPCL.+CPPPPPP", "PPPPCL&4nHCPPPPP", "PPPCLJ$#2BaCPPPP", "PPCLhgDqcf@aCPPP", "PCLOio-rv>FpaCPP", "CL=5NMj3SKy:VaCP", "PCLGlwu8t9b c #969796", " , c #BFD2E9", " < c #7EA7D4", " 1 c #98B9DD", " 2 c #BBD2E8", " 3 c #797979", " 4 c #737373", " 5 c #3768A5", " 6 c #3666A4", " 7 c #C5D7EB", " 8 c #5689C0", " 9 c #85ACD7", " 0 c #9FA09E", " q c #656565", " w c #5F5F5F", " e c #C1D5EA", " r c #5B5B5B", " t c #555555", " y c #7FA8D4", " u c #515151", " i c #FEFEFE", " p c #FCFCFC", " a c #8AAFD8", " s c #494949", " d c #FAFAFA", " f c #95B8DC", " g c #EAEAEA", " h c #E8E8E8", " j c #E6E6E6", " k c #E2E2E2", " l c #E0E0E0", " z c #DEDEDE", " x c #77A2D2", " c c #DCDCDC", " v c #3667A6", " b c #DADADA", " n c #3465A4", " m c #5B5E5A", " M c #D2D2D2", " N c #81A9D5", " B c #D0D0D0", " V c #4B7EB7", " C c #3265A5", " Z c #8BB0D8", " A c #C4C4C4", " S c #96B7DC", " D c #3968A5", " F c #B0B0B0", " G c #B9D0E7", " H c #AEAEAE", " J c #ACACAC", " K c #AAAAAA", " L c #79A3D3", " P c #92B5DB", " I c #A6A6A6", " U c #5F615D", " Y c #3666A5", " T c #3566A4", " R c #5D5F5B", " E c #5B5D59", " W c #595B57", " Q c #D5D5D4", " ! c #575955", " ~ c #83AAD6", " ^ c #82AAD5", " / c #555753", " ( c #9BBADD", " ) c #C0D5EA", " _ c #C1C1C0", " ` c #7A7A7A", " ' c #787878", " ] c #3767A5", " [ c #A5A5A4", " { c #6E6E6E", " } c #5B5C58", " | c #5588BF", ". c #6A6A6A", ".. c #9C9D9B", ".X c #3567A6", ".o c #8FB2DA", ".O c #8EB2D9", ".+ c #939392", ".@ c #3465A5", ".# c #C1D6EA", ".$ c #565656", ".% c #B1C9E4", ".& c #4C4C4C", ".* c #FDFDFD", ".= c #FBFBFB", ".- c #484848", ".; c #F9F9F9", ".: c #F7F7F7", ".> c #7BA5D3", "., c #95B7DC", ".< c #94B5DB", ".1 c #3868A5", ".2 c #EBEBEB", ".3 c #E9E9E9", ".4 c #E7E7E7", ".5 c #E5E5E5", ".6 c #E3E3E3", ".7 c #B8CEE7", ".8 c #DFDFDF", ".9 c #DDDDDD", ".0 c #3566A5", ".q c #3466A4", ".w c #D9D9D9", ".e c #D3D3D3", ".r c #D0D1D0", ".t c #9ABADD", ".y c #CFCFCF", ".u c #CDCDCD", ".i c #C9C9C9", ".p c #C7C7C7", ".a c #C5C5C5", ".s c #A5C1E1", ".d c #7DA6D4", ".f c #BDBDBD", ".g c #95B6DB", ".h c #B7B7B7", ".j c #454A51", ".k c #B3B3B3", ".l c None", /* pixels */ ".l.l.l.l = ! = ! ! W * U.l.l.l.l", " ` 3 3 3 =.:.; d.=.= p $ }.l.l.l", " '.i.p A / b.e.e M.y.u i.+ m.l.l", " 4.a F J / c - - - - Q i.* > E.l", " { _ J K = k.8 z z.9 l.3.5 B R.l", ". .f o + = j 0.......9.6.6.r E.l", " q.h I & !.2 g g.3.3 h h.4.w %.l", " w.k X.1.1 5 Y Y.0 T T T n n n O", " r H.0 ) ) ) ) ) ) e.#.#.#.# 2.@", ".$ o T # P P P P P P P P P f G.q", " u [ 6 7 1 1 1 1 1 1 1 1 1.,.7.0", ".& & ] , (.t.t.t.t.t.t S.o Z.%.0", ".- ;.1.s.O a 9 ~ N < L x x.>.g.X", " s : D.< ^.d.d.d.d.d.d.d.d y Y", ".- . D | 8 8 8 8 8 8 8 8 8 8 V v", ".j n n n n n n n n n n n n n @.l" }; /* status/folder-open.png */ /* XPM */ const char *tango_folder_open[] = { /* width height ncolors chars_per_pixel */ "16 16 123 2", /* colors */ " c #000000", " . c #ADADAD", " X c #ABABAB", " o c #A9A9A9", " O c #92B6DB", " + c #92B4DB", " @ c #A7A7A7", " # c #3667A5", " $ c #A5A5A5", " % c #A3A3A3", " & c #A1A1A1", " * c #9F9F9F", " = c #9DBDDF", " - c #9D9D9D", " ; c #9B9B9B", " : c #B5CDE6", " > c #999999", " , c #7EA7D4", " < c #3968A4", " 1 c #484849", " 2 c #797979", " 3 c #757575", " 4 c #94B7DC", " 5 c #737373", " 6 c #93B5DB", " 7 c #6D6D6D", " 8 c #86AED8", " 9 c #6B6B6B", " 0 c #B7CEE7", " q c #656565", " w c #5F5F5F", " e c #C1D5EA", " r c #5B5B5B", " t c #7FA8D4", " y c #515151", " u c #B1CAE4", " i c #4779B4", " p c #494949", " a c #A2BFDF", " s c #86ABD4", " d c #95B8DC", " f c #AEC8E4", " g c #4971A5", " h c #B8CFE7", " j c #3567A5", " k c #4F79AE", " l c #3465A4", " z c #81A9D5", " x c #9BBBDE", " c c #3C6AA5", " v c #CACACA", " b c #C8C8C8", " n c #8CB0D9", " m c #C4C4C4", " M c #C0C0C0", " N c #BABABA", " B c #3968A5", " V c #3766A3", " C c #88AED8", " Z c #B2B2B2", " A c #B0B0B0", " S c #AEAEAE", " D c #ACACAC", " F c #AAAAAA", " G c #92B5DB", " H c #3868A7", " J c #A6A6A6", " K c #3666A5", " L c #A4A4A4", " P c #C4D7EB", " I c #A0A0A0", " U c #9E9E9E", " Y c #82AAD5", " T c #9C9C9C", " R c #9A9A9A", " E c #406DA8", " W c #6A7F99", " Q c #8EB3DA", " ! c #C1C1C0", " ~ c #808080", " ^ c #7A7A7A", " / c #787878", " ( c #454F5D", " ) c #747474", " _ c #94B6DC", " ` c #93B6DB", " ' c #A5A5A4", " ] c #598CC3", " [ c #6E6E6E", " { c #3463A2", " } c #6C6C6C", " | c #6A6A6A", ". c #84ABD6", ".. c #B7CFE7", ".X c #606060", ".o c #608FC3", ".O c #3465A5", ".+ c #565656", ".@ c #B3CBE6", ".# c #8F949B", ".$ c #FFFFFF", ".% c #4C4C4C", ".& c #8BB0D9", ".* c #484848", ".= c #688FBD", ".- c #3868A5", ".; c #85ACD6", ".: c #B7CEE6", ".> c #68809F", "., c #91B5DB", ".< c #3768A7", ".1 c #3566A5", ".2 c #B4CCE6", ".3 c #C9C9C9", ".4 c #8DB1DA", ".5 c #C7C7C7", ".6 c #C5C5C5", ".7 c #BED3E9", ".8 c #BDBDBD", ".9 c #5C8EC4", ".0 c #B7B7B7", ".q c #B3B3B3", ".w c None", /* pixels */ ".w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w", " ^ 2 2 2 2 2 2.w.w.w.w.w.w.w.w.w", " /.3.5.6 m m Z 3.w.w.w.w.w.w.w.w", " 5.6 A . X F F ^ 7 } 9 9 | [.w.w", " [ ! D F @ $ L o N.6 b v M q.w.w", " |.8 o J % & I * * I & % % w.w.w", " q.0 J % I - T ; R ; T U U r.w.w", " w.q % g B B B B B B B B B V K.<", " r S I.-.2 0 0...:.:.:.:.:.: u.O", ".+ o U <.7 O., G O O O O ` d.@.1", " y ' T c e 4 4 4 4 4 4 4 Q 8 :.1", ".% & ; E P x x x x x _.& C.4 h.1", ".* ;.# k f 6 + n.; t , , , Y a #", " p >.>.= =.& Y z z z z z z. s H", " 1 W B.o.9 ] ] ] ] ] ] ] ] ] i j", " ( l l l l l l l l l l l l l l.w" }; /* apps/help-browser.png */ /* XPM */ const char *tango_help_browser[] = { /* width height ncolors chars_per_pixel */ "16 16 153 2", /* colors */ " c #7497C1", " . c #D6DEE9", " X c #466DA1", " o c #8BA5C7", " O c #2F5891", " + c #E6EBF2", " @ c #E4E9F0", " # c #4B6E9F", " $ c #8CA2C1", " % c #6B8FBB", " & c #567CAD", " * c #5278A9", " = c #829DC1", " - c #AABAD1", " ; c #EDF0F5", " : c #FDFDFE", " > c #6387B6", " , c #4B72A5", " < c #345D95", " 1 c #6482AD", " 2 c #335B94", " 3 c #617EAA", " 4 c #BAC9DD", " 5 c #CDDAE9", " 6 c #E8ECF3", " 7 c #2E558F", " 8 c #2D558E", " 9 c #E6EAF1", " 0 c #C8D4E4", " q c #7296C1", " w c #C2CEDE", " e c #4D6FA0", " r c #A0B9D7", " t c #5A7FB0", " y c #728FB7", " u c #5B7AA7", " i c #2A538E", " p c #7999C1", " a c #F2F5F9", " s c #F0F3F7", " d c #365C93", " f c #BDCADC", " g c #FEFEFE", " h c #597AA8", " j c #6D8BB5", " k c #6B89B3", " l c #6987B1", " z c #6286B4", " x c #4D73A6", " c c #386098", " v c #214B88", " b c #6381AB", " n c #EDF1F7", " m c #315891", " M c #E9EDF3", " N c #6C8DB7", " B c #2D5690", " V c #86A1C3", " C c #5C7BA7", " Z c #9BB2D1", " A c #C9D7E7", " S c #6C88B0", " D c #6587B3", " F c #BDC9DB", " G c #547AAC", " H c #3B639A", " J c #6B88B2", " K c #244E8A", " L c #234C89", " P c #224C88", " I c #8FA8C8", " U c #6582AC", " Y c #CBD6E5", " T c #6085B4", " R c #94A9C6", " E c #5E83B2", " W c #325B94", " Q c #E5EAF1", " ! c #3B6096", " ~ c #C0CCDD", " ^ c #8CA1C1", " / c #6A8EBA", " ( c #5978A6", " ) c #5878A5", " _ c #3C649A", " ` c #264F8B", " ' c #254F8A", " ] c #94ADCC", " [ c #6284B2", " { c #F1F5F9", " } c #F0F3F8", " | c #EFF3F7", ". c #A9B9D0", ".. c #496FA3", ".X c #345C95", ".o c #335C94", ".O c #E8EDF3", ".+ c #B7C6DA", ".@ c #E7EBF2", ".# c #2C548D", ".$ c #A6B9D3", ".% c #7093BF", ".& c #42699F", ".* c #40679D", ".= c #5176A7", ".- c #27508B", ".; c #6A86AF", ".: c #ADBCD3", ".> c #F1F4F8", "., c #7594BD", ".< c #EFF2F6", ".1 c #A0B5D0", ".2 c #FFFFFF", ".3 c #678BB9", ".4 c #9BAFCB", ".5 c #6589B7", ".6 c #4C72A5", ".7 c #204A87", ".8 c #6482AC", ".9 c #A7B8D0", ".0 c #E9EEF3", ".q c #2F578F", ".w c #2D558D", ".e c #CAD6E5", ".r c #F9FBFC", ".t c #C6D2E1", ".y c #7396C1", ".u c #90A5C3", ".i c #6F92BD", ".p c #456CA1", ".a c #9FB7D5", ".s c #436A9F", ".d c #5D7CA8", ".f c #718DB5", ".g c #E3E8F0", ".h c #385E94", ".j c #9DB7D6", ".k c #D1DBE8", ".l c #47699C", ".z c #A0B4CF", ".x c #3A6299", ".c c #254F8B", ".v c #386097", ".b c #234D89", ".n c #224B88", ".m c #EFF3F8", ".M c #7191BB", ".N c #EBEFF4", ".B c #89A1C2", ".V c #CCD7E6", ".C c #FBFCFD", ".Z c #789BC5", ".A c None", /* pixels */ ".A.A.A.A.A.7.7.7.7.7.7.A.A.A.A.A", ".A.A.A.A.# ^ F.N.N F $.#.A.A.A.A", ".A.A.7 u.g. U ! ! U - @ C.7.A.A", ".A.A 3.@ (.l w s 9.9 e 1.O.d.A.A", ".A 8 Q ).7 S : ..<.2 f c k +.w.A", ".7.u. .7.7 # e W h.2.C X.s.+ R.7", ".7 ~ U.7.- B.X.x.B.2 6 , x V.t L", ".7 ; d ' B < H j.r g = G & N | v", ".7 ;.h i 2.x.&.O.2.1 t E T., }.n", ".7 ~.; O.v.*.= 0.e z >.3 / Z.V K", ".7.u.:.o _.p * I ].5 %.%.y A.z v", ".A 8 + l.*.. [.2.2.i q.Z.j n.q.A", ".A.A b.0 y.6 D.2.2 .Z r { J.A.A", ".A.A.7.8 M 4 o.M p.a 5.m.f `.A.A", ".A.A.A.A 7.4 Y.> a.k.$ m.A.A.A.A", ".A.A.A.A.A.7.b P P.c v.A.A.A.A.A" }; /* mimetypes/image-x-generic.png */ /* XPM */ const char *tango_image_x_generic[] = { /* width height ncolors chars_per_pixel */ "16 16 87 1", /* colors */ " c #6583AF", ". c #95A8C7", "X c #6381AD", "o c #617FAB", "O c #A5B5D0", "+ c #738EB6", "@ c #3F516F", "# c #384151", "$ c #3D4F6D", "% c #5B7BA8", "& c #45546E", "* c #7A8698", "= c #5475A4", "- c #98ABC9", "; c #67758F", ": c #A8B8D2", "> c #9CA7B9", ", c #839ABE", "< c #6180AD", "1 c #D1DCB1", "2 c #8691A3", "3 c #A4B8A9", "4 c #515151", "5 c #FEFEFE", "6 c #485773", "7 c #E2EBBE", "8 c #5778A6", "9 c #9AACCA", "0 c #7D899D", "q c #F6F6F6", "w c #9EA8BA", "e c #7892B9", "r c #A8B7D1", "t c #374762", "y c #818A9A", "u c #93A6C6", "i c #A2B3CE", "p c #8099BD", "a c #FFFFFE", "s c #405374", "d c #889EC1", "f c #869CBF", "g c #455672", "h c #435470", "j c #96A9C8", "k c #A6B6D1", "l c #33476A", "z c #FEFEF9", "x c #3D4E6D", "c c #888A85", "v c #3B4C6B", "b c #B6C5B2", "n c #8CA1C1", "m c #6D89B3", "M c #415474", "N c #C4D1AF", "B c #EEF3CB", "V c #475773", "C c #818DA2", "Z c #2F4262", "A c #DCE5B9", "S c #384C6E", "D c #A7B7D1", "F c #7590B7", "G c #34486A", "H c #9DAFC7", "J c #5072A3", "K c #6884AA", "L c #233659", "P c #8FA6AF", "I c #FDFDFD", "U c #6986B1", "Y c #819AB8", "T c #9FA9BB", "R c #9EA9BA", "E c #5F7EAA", "W c #B3C2B7", "Q c #728DB6", "! c #A1B3C3", "~ c #FCFDEE", "^ c #8EA3C4", "/ c #F7FADF", "( c #495973", ") c #C5D1B1", "_ c #3D5071", "` c #718DA7", "' c None", /* pixels */ "cccccccccccccccc", "c55555555555555c", "cI*tttttttttt*qc", "c5@oXK`E%8==Jtqc", "cIh+PAB3mU 44ytqc", "cItx$$xvZL44#tqc", "cItMs_SGl4444tqc", "cItC;;;;;;;;;tqc", "cI*tttttttttt*qc", "c5qqqqqqqqqqqqIc", "cccccccccccccccc" }; /* actions/go-previous.png */ /* XPM */ const char *tango_go_previous[] = { /* width height ncolors chars_per_pixel */ "16 16 99 2", /* colors */ " c #65A827", " . c #6EC915", " X c #C6DEAE", " o c #C2DCAA", " O c #52891E", " + c #3B7504", " @ c #CAE0B5", " # c #7CC833", " $ c #67C111", " % c #AACF88", " & c #97DA54", " * c #97BD72", " = c #6BA236", " - c #A0C37E", " ; c #55A409", " : c #61B70E", " > c #A9D480", " , c #60B50D", " < c #87B65B", " 1 c #3C7604", " 2 c #C7DFB1", " 3 c #9DC477", " 4 c #87BB54", " 5 c #3A7405", " 6 c #82B74F", " 7 c #A5DC6E", " 8 c #457C13", " 9 c #88BB58", " 0 c #60A420", " q c #B8D69B", " w c #90BF63", " e c #B3D296", " r c #3D7904", " t c #A6CF7F", " y c #C5DEAE", " u c #8DC459", " i c #96CA65", " p c #3A7304", " a c #59AC0B", " s c #598B29", " d c #578927", " f c #41790E", " g c #ACD881", " h c #5EA31D", " j c #70AD35", " k c #6EA23D", " l c #7FB947", " z c #C4DDAC", " x c #7AB742", " c c #4E9A06", " v c #3B7604", " b c #4D8419", " n c #3B7404", " m c #A5D576", " M c #A3CA7E", " N c #5AAD0B", " B c #AEDB82", " V c #65B519", " C c #A9D77D", " Z c #5A8C2C", " A c #7DA855", " S c #8BBD5C", " D c #61B60E", " F c #71B035", " G c #7BB642", " H c #66AF20", " J c #BFDAA6", " K c #75B23C", " L c #B0DE83", " P c #3F790A", " I c #A7CD84", " U c #FFFFFF", " Y c #A5C982", " T c #80B64D", " R c #5D8D2E", " E c #7FA956", " W c #56A609", " Q c #8ABC5A", " ! c #89BC59", " ~ c #87BA57", " ^ c #91C064", " / c #68A92B", " ( c #BDD9A3", " ) c #519E07", " _ c #5EB30D", " ` c #94C26A", " ' c #C8DFB1", " ] c #A3D572", " [ c #69C211", " { c #66AC22", " } c #3A7404", " | c #5CAD0E", ". c #7DB549", ".. c #58A90A", ".X c #437A10", ".o c #62AF17", ".O c #85B954", ".+ c #B5D497", ".@ c None", /* pixels */ ".@.@.@.@.@.@.@.@.@.@ +.@.@.@.@.@", ".@.@.@.@.@.@.@.@ n s p.@.@.@.@.@", ".@.@.@.@.@.@.@ } E ' p.@.@.@.@.@", ".@.@.@.@.@.@.X - ( @ p.@.@.@.@.@", ".@.@.@.@ n R e % ^ 2 v p p p p }", ".@.@.@ 5 A.+ ` ~ S z y X y z o p", ".@.@ 8 * I T. 6.O 9 ! Q ! 9 J p", " + Z Y w j K G l x F h 0 / q p", " + d 3 4 { H.o | a.. ; ) c c M p", ".@.@ f < i V , : D _ N W ) c M p", ".@.@.@ + k m # [ $ B g > t M M p", ".@.@.@.@ v O ] & . L r p p p p }", ".@.@.@.@.@.@ P u 7 L p.@.@.@.@.@", ".@.@.@.@.@.@.@ 1 = C p.@.@.@.@.@", ".@.@.@.@.@.@.@.@ v b p.@.@.@.@.@", ".@.@.@.@.@.@.@.@.@.@ +.@.@.@.@.@" }; /* actions/system-log-out.png */ /* XPM */ const char *tango_system_log_out[] = { /* width height ncolors chars_per_pixel */ "16 16 186 2", /* colors */ " c #E26E6E", " . c #D94141", " X c #E5E6E4", " o c #ECE3E1", " O c #AFAFAF", " + c #ADADAD", " @ c #ABABAB", " # c #A9A9A9", " $ c #A7A7A7", " % c #E88E8E", " & c #A5A5A5", " * c #A3A3A3", " = c #5C5E5A", " - c #A1A1A1", " ; c #A20E0E", " : c #585A56", " > c #9D9D9D", " , c #565854", " < c #D23D3D", " 1 c #999999", " 2 c #979797", " 3 c #959595", " 4 c #939393", " 5 c #AC1111", " 6 c #919191", " 7 c #8F8F8F", " 8 c #8D8D8D", " 9 c #8B8B8B", " 0 c #898989", " q c #EA9696", " w c #E16969", " e c #F1F1EF", " r c #858585", " t c #A50000", " y c #EFEFED", " u c #645F5E", " i c #7F7F7F", " p c #EB9A9A", " a c #797979", " s c #A60404", " d c #757575", " f c #A11616", " g c #E88D8D", " h c #6F6F6F", " j c #D9DBD7", " k c #A61111", " l c #D7D9D5", " z c #656565", " x c #D23C3C", " c c #989897", " v c #DB4848", " b c #D21B1B", " n c #5D5D5D", " m c #C7C9C5", " M c #C6C9C4", " N c #595959", " B c #B02121", " V c #898A88", " C c #EA9595", " Z c #CF0E0E", " A c #878886", " S c #EDD4D3", " D c #FAFAFA", " F c #E78888", " G c #A60303", " H c #CD6161", " J c #686A67", " K c #D32525", " L c #9A9B98", " P c #D73636", " I c #D79292", " U c #929390", " Y c #8A6464", " T c #C6C8C3", " R c #B12221", " E c #8D8F8B", " W c #DD5656", " Q c #B51B1B", " ! c #C42D2D", " ~ c #D0D2D0", " ^ c #F3F1EF", " / c #D63838", " ( c #7F817D", " ) c #FBFBFA", " _ c #D52D2D", " ` c #BEBEBE", " ' c #F3F3F2", " ] c #BABABA", " [ c #737571", " { c #EFEFEE", " } c #DB4D4D", " | c #AC1515", ". c #C46C6B", ".. c #E4E5E3", ".X c #686966", ".o c #656763", ".O c #DC5151", ".+ c #646562", ".@ c #AAAAAA", ".# c #C58886", ".$ c #61635F", ".% c #CE0808", ".& c #A6A6A6", ".* c #5F615D", ".= c #A4A4A4", ".- c #A2A2A2", ".; c #5B5D59", ".: c #C5C7C1", ".> c #A0A0A0", "., c #595B57", ".< c #9E9E9E", ".1 c #575955", ".2 c #9C9C9C", ".3 c #555753", ".4 c #9A9A9A", ".5 c #989898", ".6 c #969696", ".7 c #949494", ".8 c #BC2424", ".9 c #929292", ".0 c #867979", ".q c #8C8C8C", ".w c #F4F4F2", ".e c #888888", ".r c #868686", ".t c #858685", ".y c #F0F0EE", ".u c #DB4C4C", ".i c #BC3E3E", ".p c #828282", ".a c #808080", ".s c #7E7E7E", ".d c #767676", ".f c #707070", ".g c #7E6A6A", ".h c #6E6E6E", ".j c #D8DAD6", ".k c #C53636", ".l c #A2A3A1", ".z c #6C6C6C", ".x c #AC2524", ".c c #D6D8D4", ".v c #AA0B0B", ".b c #D4D6D2", ".n c #B01E1E", ".m c #686868", ".M c #646464", ".N c #DA9696", ".B c #606060", ".V c #B72828", ".C c #A51413", ".Z c #D11A1A", ".A c #C3C6C1", ".S c #8B7373", ".D c #BC3030", ".F c #FFFFFF", ".G c #FBFBFB", ".H c #F9F9F9", ".J c #D43A3A", ".K c #ECA7A7", ".L c #C76565", ".P c #696B68", ".I c #C6C9C3", ".U c #A90C0C", ".Y c #BEC1BB", ".T c #CE0C0C", ".R c #D33535", ".E c #DB4A4A", ".W c #C45151", ".Q c #C3C3C3", ".! c #F8F8F7", ".~ c #F6F6F5", ".^ c #BB4948", "./ c #CF1010", ".( c #F4F4F3", ".) c #BDBDBD", "._ c #BBBBBB", ".` c #B64543", ".' c #A50101", ".] c #EDEEEC", ".[ c #D26565", ".{ c #B93C3C", ".} c #6D6E6B", ".| c #A28988", "X c #D55E5E", "X. c None", /* pixels */ ".;.3.3.3.3.3.3.3 , =.+.X J.o.}X.", ".3.& r a.h z n N y e.(.~.~.] (X.", ".3 +.q i d.z.M.B y '.! ).G.H LX.", ".3 ] 3 0.s d.h.m {.w.H I.i D.lX.", ".3._ >.7 0 i.d.f.y ^.L.W | S.|X.", ".3.).> 2 7.r.s.d o.{ H.K.D.V R.'", ".3 `.-.4 6.e.a.g B.[ F % C q p.'", ".3 `.=.2 4 9 Y kX w v.E.u } g G", ".3 ` $.<.6 8 f.k W _ K.Z./ b s", ".3 ` # -.5 7.S ; ! P.%.T.T Z.O.'", ".3 `.@ *.4.9 0.0.x.8 / ..J x < t", ".3 `.@ & > 3 7.p u.^ Q.R s.n.C.v", ".3 `.@ # - 1 h V ~... 5.U X AX.", ".3 ` @ O.t E m.b l.j j.#.`.c [X.", ".3.Q c U.Y.A T.I M M M M M.:.$X.", ".;.P ,.1 : : : :.,.,.,.,., :.*X." }; /* actions/list-remove.png */ /* XPM */ const char *tango_list_remove[] = { /* width height ncolors chars_per_pixel */ "16 16 20 1", /* colors */ " c #000000", ". c #7DA6D7", "X c #86ADD9", "o c #9FBEE0", "O c #B6CCE6", "+ c #83AAD8", "@ c #BBD1E7", "# c #7FA8D7", "$ c #94B6DB", "% c #3465A4", "& c #95B7DB", "* c #B5CCE6", "= c #B4CCE5", "- c #92B4DA", "; c #B6CDE6", ": c #B7CEE6", "> c #90B3DA", ", c #C0D3E8", "< c #BCD1E7", "1 c None", /* pixels */ "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "11%%%%%%%%%%%%11", "11%,@<::::;*O%11", "11%=&$->X+#.o%11", "11%%%%%%%%%%%%11", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111" }; /* devices/multimedia-player.png */ /* XPM */ const char *tango_multimedia_player[] = { /* width height ncolors chars_per_pixel */ "16 16 79 1", /* colors */ " c #666864", ". c #626460", "X c #858782", "o c #80817D", "O c #7E7F7B", "+ c #7D7F7A", "@ c #7C7D79", "# c #7B7D78", "$ c #CBCFAC", "% c #7A7B77", "& c #696B66", "* c #CBD0A5", "= c #676964", "- c #C9D0A3", "; c #A4A6A3", ": c #D1D6AE", "> c #5B5B58", ", c #BDC58D", "< c #B2B796", "1 c #C3C996", "2 c #8A8C89", "3 c #B8B9B6", "4 c #A5A7A3", "5 c #989996", "6 c #C3C79F", "7 c #BFC59B", "8 c #C5C9A4", "9 c #838581", "0 c #7C7D7A", "q c #AEAEAB", "w c #A8AAA5", "e c #6E6F6C", "r c #A2A49F", "t c #BEC496", "y c #969893", "u c #92948F", "i c #91928E", "p c #BBC096", "a c #555753", "s c #535551", "d c #888A85", "f c #80827D", "g c #B8BCAA", "h c #CFD4B0", "j c #7E807B", "k c #7C7E79", "l c #7A7C77", "z c #787A75", "x c #747671", "c c #70726D", "v c #6E706B", "b c #6C6E69", "n c #6A6C67", "m c #686A65", "M c #9B9D9A", "N c #939592", "B c #C3CA96", "V c #B6B6B4", "C c #B4B5A8", "Z c #BBC291", "A c #ADAEAB", "S c #A5A6A3", "D c #A4A6A2", "F c #9FA09D", "G c #696968", "H c #B8BCA8", "J c #B3BC78", "K c #B6BAA6", "L c #898A87", "P c #C4CAA3", "I c #C5CB9A", "U c #B9B9B6", "Y c #C9CEAB", "T c #787A76", "R c #767874", "E c #BBC286", "W c #747672", "Q c #A6A7A3", "! c None", /* pixels */ "saaaaaaaaaaaaaaa", "aRQQQ444444S;DRa", "a5i%%%@@@@@Ood5a", "a5N<68Y$P7tZh25a", "a5rpBI-*1,EJ:y5a", "a5uCgHHHHHHKKX5a", "a5vbbnbvbnnbnn5a", "a5&=m==&m==&=m5a", "a5zqMwAWxWc>. 5a", "a5L3DVU+++TG0e5a", "a5+++++++++9fj5a", "a5kkkkkkkkkkkk5a", "a5#F#F########5a", "a5llllllllllll5a", "aR555555555555Ra", "aaaaaaaaaaaaaaaa" }; /* apps/internet-web-browser.png */ /* XPM */ const char *tango_internet_web_browser[] = { /* width height ncolors chars_per_pixel */ "16 16 167 2", /* colors */ " c #000000", " . c #56719D", " X c #6984A9", " o c #DCE1E5", " O c #F1F2F3", " + c #8BA7C7", " @ c #84A6CA", " # c #DFEFFF", " $ c #93B6DC", " % c #EDEEEF", " & c #5A79A4", " * c #5979A3", " = c #5877A2", " - c #BCC4CC", " ; c #B1C0D5", " : c #E3E4E5", " > c #5685B7", " , c #B1CEEC", " < c #627CA5", " 1 c #B3C1D0", " 2 c #F0F4F8", " 3 c #B5BEC8", " 4 c #CCDDEF", " 5 c #DBDEE0", " 6 c #7591B4", " 7 c #759FCB", " 8 c #BED4EB", " 9 c #F8F9F9", " 0 c #B7C2CD", " q c #BECFE1", " w c #BCCDDF", " e c #5B7AA4", " r c #B5C5D8", " t c #5978A2", " y c #93ABC7", " u c #C6CFD8", " i c #D4DDE9", " p c #A3B8D0", " a c #A0B4CD", " s c #BEC7D0", " d c #CAD5DF", " f c #5988BC", " g c #E0E3E4", " h c #DFE1E3", " j c #83A7CE", " k c #637FA8", " l c #617FA6", " z c #FEFEFE", " x c #D7D9DB", " c c #DCE4ED", " v c #F6F6F6", " b c #5E7DA6", " n c #628FC1", " m c #CCD9E7", " M c #E6EBF0", " N c #C0C6CE", " B c #57759F", " V c #DBE4EF", " C c #E2E2E2", " Z c #80A7D1", " A c #E0E0E0", " S c #B7C8DC", " D c #B1C2D6", " F c #DCE3E9", " G c #6B96C6", " H c #7A95B7", " J c #BABFC4", " K c #A9BCD1", " L c #D9E1E9", " P c #CED0D1", " I c #6983A6", " U c #C8CFD5", " Y c #7591B5", " T c #9DA6AE", " R c #6D90B7", " E c #D2E5F9", " W c #819ABA", " Q c #DEE2E7", " ! c #D6DFE9", " ~ c #A3B6CE", " ^ c #DAEAFA", " / c #CFD9E2", " ( c #5A7AA4", " ) c #5C8ABD", " _ c #A2BDDA", " ` c #D5DFEB", " ' c #A5B7C9", " ] c #CCD7E2", " [ c #C3D2E3", " { c #5686BA", " } c #E3F1FF", " | c #C8CED4", ". c #E2EFFE", ".. c #7792B6", ".X c #516994", ".o c #9BB2CC", ".O c #9AB0CB", ".+ c #839BBB", ".@ c #C9E1F9", ".# c #F4F4F5", ".$ c #CED1D3", ".% c #E0EFFF", ".& c #4F80B6", ".* c #CEDBEA", ".= c #5D7DA6", ".- c #5A79A3", ".; c #5877A1", ".: c #E0E5EB", ".> c #94ACC8", "., c #7E97B9", ".< c #6C96C5", ".1 c #BECBDA", ".2 c #E6EBF4", ".3 c #DAEBFC", ".4 c #D4E5F6", ".5 c #E4E6E8", ".6 c #E2E4E6", ".7 c #9CBDE0", ".8 c #6380A8", ".9 c #C7CDD2", ".0 c #ACCAE9", ".q c #BBC9DA", ".w c #9DB3CD", ".e c #5E7AA3", ".r c #FDFDFD", ".t c #BCD7F2", ".y c #FBFBFB", ".u c #5A769F", ".i c #F9F9F9", ".p c #58749D", ".a c #AABED3", ".s c #F5F5F5", ".d c #E1F0FF", ".f c #EFEFEF", ".g c #BECAD6", ".h c #BCC8D4", ".j c #5876A0", ".k c #719BC9", ".l c #B5D1EE", ".z c #B8BFC6", ".x c #576F95", ".c c #D5DFE9", ".v c #DEEEFF", ".b c #B8C9DD", ".n c #627BA3", ".m c #101221", ".M c #AEB5BC", ".N c #AFBFD4", ".B c #4B6189", ".V c #D3D3D3", ".C c #D1D1D1", ".Z c #7994B6", ".A c #DCDDDF", ".S c #B4C7DC", ".D c #9FB4CE", ".F c #A4B5C9", ".G c #9CB2CB", ".H c #708AAD", ".J c #CCE3FA", ".K c #ABBDD3", ".L c #B3CCE8", ".P c #E2F1FF", ".I c #617FA8", ".U c #DEEDFB", ".Y c #D5E8FC", ".T c #5977A0", ".R c None", /* pixels */ ".R.R.R.R.R.j e ( t =.R.R.R.R.R.R", ".R.R.R.e.+.q c.2 ` D., *.R.R.R.R", ".R.R l ;.: / J.1 8.g L ~.-.R.R.R", ".R X.N Q.$. .U.4.h N 5 M a (.R.R", ".n W 2 : d.P } ^ u x.#.y.c.Z.R.R", ".H r g 4.%.d.d.3.9 s.F 3.5 p (.R", ".8 i.a.J.v # #.*.r z.r.6.A w (.R", " e V.0.t.@.Y E U z z z.i.M [ (.R", " b m 0 |.L.l , K 9 O z.f P.b (.R", " k.K o z h _.7 $ @ +.s C T.w (.R", " < H ! z z % j Z 7.< A.V ' Y.R.R", ".R.I.G F v.z.k G n f.C -.> (.R.R", ".R.R.=.O ] R ) {.& > 1 y *.R.R.R", ".R.R.R I...D S q.S.o 6.T.R.R.R.R", ".R.R.R.R.x.u.- & t.p.R.R.R.R.R.R", ".R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R" }; /* actions/list-add.png */ /* XPM */ const char *tango_list_add[] = { /* width height ncolors chars_per_pixel */ "16 16 20 1", /* colors */ " c #000000", ". c #7DA6D7", "X c #86ADD9", "o c #9FBEE0", "O c #B6CCE6", "+ c #83AAD8", "@ c #BBD1E7", "# c #7FA8D7", "$ c #94B6DB", "% c #3465A4", "& c #95B7DB", "* c #B5CCE6", "= c #B4CCE5", "- c #92B4DA", "; c #B6CDE6", ": c #B7CEE6", "> c #90B3DA", ", c #C0D3E8", "< c #BCD1E7", "1 c None", /* pixels */ "1111111111111111", "1111111111111111", "111111%%%%111111", "111111%::%111111", "111111%::%111111", "111111%::%111111", "11%%%%%::%%%%%11", "11%,@<::::;*O%11", "11%=&$->X+#.o%11", "11%%%%%XX%%%%%11", "111111%:X%111111", "111111%:X%111111", "111111%::%111111", "111111%%%%111111", "1111111111111111", "1111111111111111" }; /* apps/preferences-desktop-font.png */ /* XPM */ const char *tango_preferences_desktop_font[] = { /* width height ncolors chars_per_pixel */ "16 16 79 1", /* colors */ " c #000000", ". c #B1B1B1", "X c #ADADAD", "o c #A7A7A7", "O c #797979", "+ c #EAEBEB", "@ c #E9E9EA", "# c #E8E9E9", "$ c #5F5F5F", "% c #4D4D4D", "& c #4B4B4B", "* c #FCFCFC", "= c #494949", "- c #FAFAFA", "; c #474747", ": c #F8F8F8", "> c #F6F6F6", ", c #F4F4F4", "< c #F2F2F2", "1 c #F0F0F0", "2 c #EEEEEE", "3 c #ECECEC", "4 c #E8E8E8", "5 c #E6E6E6", "6 c #E5E6E5", "7 c #E4E4E4", "8 c #E2E2E2", "9 c #2F2F2F", "0 c #CECECE", "q c #050505", "w c #EAE9E9", "e c #010101", "r c #E8E7E7", "t c #E7E7E6", "y c #8A8C87", "u c #888A85", "i c #828282", "p c #7C7C7C", "a c #767676", "s c #747474", "d c #E4E4E5", "f c #666666", "g c #626262", "h c #565656", "j c #FFFFFF", "k c #FDFDFD", "l c #4A4A4A", "z c #FBFBFB", "x c #484848", "c c #F9F9F9", "v c #F7F7F7", "b c #F5F5F5", "n c #F3F3F3", "m c #F1F1F1", "M c #EFEFEF", "N c #EDEDED", "B c #ECEDEC", "V c #ECEBEC", "C c #EBEBEB", "Z c #EAEBEA", "A c #E9E9E9", "S c #E6E7E6", "D c #343434", "F c #E4E5E4", "G c #E4E3E4", "H c #E3E3E3", "J c #2E2E2E", "K c #2C2C2C", "L c #DBDBDB", "P c #222222", "I c #D3D3D3", "U c #202020", "Y c #BFBFBF", "T c #B8B9B8", "R c #060606", "E c #ECECEB", "W c #040404", "Q c #EBEAEA", "! c None", /* pixels */ "!uuuuuuuuuuuuuu!", "ujjjjjjjjjjjjjju", "ujHoi99H5555HHku", "ujH8L09H4A44HHku", "ujH.9s95S56dGHku", "ujH9IY9AAw#r5Fzu", "uj7999T&9BV+Atzu", "uj53N2M;K1M2E@:u", "uj4NM1mxUD eg<>u", "ujwM1=RmzI aMu", "uj+<,>vl Ov$ XMu", "ujQ<,>:hJPW %vMu", "uj******--->>>Mu", "!uuuuuuuuuuuuuu!" }; /* actions/process-stop.png */ /* XPM */ const char *tango_process_stop[] = { /* width height ncolors chars_per_pixel */ "16 16 136 2", /* colors */ " c #000000", " . c #BF0000", " X c #EB4C4C", " o c #F68888", " O c #D89292", " + c #E8BCBC", " @ c #FCF7F7", " # c #EF6A6A", " $ c #DB3C3C", " % c #ED4747", " & c #DF2C2C", " * c #B22424", " = c #B82323", " - c #D75F5F", " ; c #D52F2F", " : c #F58383", " > c #C41B1B", " , c #B41F1F", " < c #F26969", " 1 c #C10101", " 2 c #CC0F0F", " 3 c #E4AAAA", " 4 c #E9A5A5", " 5 c #F68787", " 6 c #D22F2F", " 7 c #C70000", " 8 c #BF1919", " 9 c #F78B8B", " 0 c #E6A5A5", " q c #D13131", " w c #DF2B2B", " e c #BF0505", " r c #D85C5C", " t c #CF2F2F", " y c #BD0303", " u c #E83737", " i c #E6E0E0", " p c #C92929", " a c #FEFEFE", " s c #880000", " d c #CC2F2F", " f c #DB4141", " g c #C10000", " h c #E6ABAB", " j c #E6D9D9", " k c #DA6464", " l c #ECECEC", " z c #EA3F3F", " x c #E8E8E8", " c c #D75757", " v c #DACDCD", " b c #EB4343", " n c #D85B5B", " m c #ED5252", " M c #BD0202", " N c #D31111", " B c #BC1818", " V c #E6DFDF", " C c #E63434", " Z c #B32626", " A c #AF2222", " S c #DB4040", " D c #B41D1D", " F c #EC6161", " G c #EF5A5A", " H c #890303", " J c #D65F5F", " K c #ED6565", " L c #D85A5A", " P c #D65858", " I c #DA3B3B", " U c #E39696", " Y c #E5A5A5", " T c #BE0505", " R c #CE2F2F", " E c #C30000", " W c #D01010", " Q c #E73737", " ! c #B01818", " ~ c #D21F1F", " ^ c #890202", " / c #CB0101", " ( c #870000", " ) c #E83B3B", " _ c #CE2828", " ` c #F17575", " ' c #EE6868", " ] c #BD0000", " [ c #F3EDED", " { c #F68A8A", " } c #DB5F5F", " | c #C70303", ". c #B12222", ".. c #BE0404", ".X c #D75B5B", ".o c #E5DFDF", ".O c #E94545", ".+ c #C71D1D", ".@ c #B72121", ".# c #F9F9F9", ".$ c #DC4242", ".% c #B11B1B", ".& c #F1F1F1", ".* c #9E3333", ".= c #EDEDED", ".- c #F58585", ".; c #F38383", ".: c #DFDFDF", ".> c #DA6767", "., c #DBDBDB", ".< c #F68989", ".1 c #D23131", ".2 c #A43F3F", ".3 c #D02F2F", ".4 c #C50000", ".5 c #D93B3B", ".6 c #D53737", ".7 c #DE9292", ".8 c #DF2D2D", ".9 c #F06F6F", ".0 c #890000", ".q c #C51A1A", ".w c #B11A1A", ".e c #D63B3B", ".r c #D52323", ".t c #EC4A4A", ".y c #E2DEDE", ".u c #D89999", ".i c #DEACAC", ".p c #B82424", ".a c #D76060", ".s c #D53030", ".d c #DAD6D6", ".f c #880202", ".g c #860000", ".h c None", /* pixels */ ".h.h.h.h.0.g.g.g.g.g.g.0.h.h.h.h", ".h.h.h.0 A o 9 9 { 5 : =.0.h.h.h", ".h.h.0. .;.$ ; ; ; ; $ ` ,.0.h.h", ".h.0 *.;.$.6 ; ; ; ;.6 I.9.%.0.h", ".0 Z.; f c v - ; ; r j }.5 # !.0", ".f.< S ; O.,.d.a L i.= Y 6.e '.f", " H o ; ;.s.u.:.y V l h.1.3 R K ^", " H o ; ; ;.s.i x l + q t R d F ^", " H o ; ; ; n V l.& [ k R d p.O ^", " H.- ; ;.X.o l 3 0.# @.>.q M u ^", ".f <.r ~.7 l 3.3 _ 4 a U ] y C ^", ".0.p G N / P |.4 E 1 J M.. w.+ (", ".h.0.@ m W 7.4 E g . ] T & > s.h", ".h.h.0 D X 2 E g . ] e.8 8 s.h.h", ".h.h.h.0.w.t % b z ) Q B s.h.h.h", ".h.h.h.h.0.g.g.g.g.g.g s.h.h.h.h" }; /* actions/view-refresh.png */ /* XPM */ const char *tango_view_refresh[] = { /* width height ncolors chars_per_pixel */ "16 16 100 2", /* colors */ " c #9DBDDC", " . c #6990C0", " X c #3767A6", " o c #3667A5", " O c #3565A4", " + c #DDE8F3", " @ c #8AACD3", " # c #99B9DB", " $ c #B4CBE5", " % c #D8E4F1", " & c #5783BB", " * c #537FB7", " = c #4B77AF", " - c #A0BEDE", " ; c #3868A6", " : c #3768A5", " > c #4C79B3", " , c #769DCF", " < c #5580B5", " 1 c #97B6D8", " 2 c #8FACD0", " 3 c #E4ECF5", " 4 c #4E7AB1", " 5 c #C8D8EA", " 6 c #4C78AF", " 7 c #8FB0D3", " 8 c #6D94C2", " 9 c #6891C7", " 0 c #3C6BA9", " q c #3A69A7", " w c #3969A6", " e c #C6D8EB", " r c #4774AD", " t c #C1D2E6", " y c #6890C0", " u c #CDDBEB", " i c #3465A4", " p c #6188B9", " a c #DBE6F2", " s c #BFD2E7", " d c #84A6CE", " f c #E5EDF5", " g c #C9D9EA", " h c #8FADD2", " j c #A1BEDD", " k c #3A6AA6", " l c #E2EBF5", " z c #88A7CE", " x c #3768A6", " c c #95B2D4", " v c #3566A4", " b c #C4D7EB", " n c #4371AB", " m c #A1BBD9", " M c #E7EEF6", " N c #BFD3E9", " B c #5F87B9", " V c #7298C5", " C c #5D85B7", " Z c #6C95C9", " A c #82A5CE", " S c #9CB7D7", " D c #C9DAEC", " F c #E3ECF5", " G c #4C78B0", " H c #8EAED3", " J c #4F7CB6", " K c #3969A7", " L c #3869A6", " P c #3767A5", " I c #A8C2DF", " U c #93B1D4", " Y c #4170AB", " T c #CCDDEE", " R c #B0C9E3", " E c #E5EDF6", " W c #E4EDF5", " Q c #FFFFFF", " ! c #4D79B0", " ~ c #C7D7E9", " ^ c #4C77AF", " / c #5B84B7", " ( c #D5E2F0", " ) c #3C6CA9", " _ c #3A6AA7", " ` c #E0E9F4", " ' c #A8C1DE", " ] c #8CADD3", " [ c #B4CAE3", " { c #3566A5", " } c #7299CD", " | c #88ABD2", ". c #CCDCED", ".. c #E6EEF6", ".X c #BCD1E7", ".o c #7EA4D5", ".O c #3D6DA9", ".+ c #3C6BA8", ".@ c #3B6BA7", ".# c None", /* pixels */ ".#.#.#.# q _ o K _.#.#.#.#.#.#.#", ".#.#.# ; y 7 I ' U B P.#.#.# i.#", ".#.# w ] j $ N T ( s = o n v.#", ".# K . V.+ v _ C m % a + z 5 _.#", ".# ; Y ) _.#.#.# L p u l.... _.#", ".# O _ 9 P.#.#.#.#.# v ~ e F k.#", ".# i.#.#.#.#.#.#.# ; 2 M a.. k.#", ".#.#.#.#.#.#.#.# i i r ^ ^ 6 i.#", ".# i i i i i i i.#.#.#.#.#.#.#.#", ".# i f E 3 S x.#.#.#.#.#.#.# i.#", ".# v.. b g i.#.#.#.#.# { Z * i.#", ".# P.. F W t ! L.#.#.# 0 J _ :.#", ".# ; % c ` +. h G { w w.O G _.#", ".# P / o 4 [ D.X R - | A H ;.#.#", ".# i o.#.# X < d 1 # @ 8 ;.#.#.#", ".# i.#.#.#.#.# _ L v _.@.#.#.#.#" }; /* actions/go-next.png */ /* XPM */ const char *tango_go_next[] = { /* width height ncolors chars_per_pixel */ "16 16 101 2", /* colors */ " c #8BBB5D", " . c #78B63D", " X c #9CD267", " o c #A7D17F", " O c #B7D49C", " + c #6EAC33", " @ c #C3DCAB", " # c #9EC976", " $ c #C2DCAA", " % c #66B817", " & c #8AC255", " * c #CBE0B6", " = c #3B7504", " - c #5AAC0B", " ; c #66BF10", " : c #5F8F31", " > c #5E8F30", " , c #82AB5A", " < c #6FBA26", " 1 c #9CC37A", " 2 c #54A408", " 3 c #89C350", " 4 c #61B70E", " 5 c #BBD99F", " 6 c #6CBF1C", " 7 c #C0DBA7", " 8 c #74AF3B", " 9 c #4F9C06", " 0 c #3C7804", " q c #3C7604", " w c #4D8418", " e c #A4CC7E", " r c #8BC158", " t c #AFD48C", " y c #CEE3BB", " u c #3A7405", " i c #598C2A", " p c #467C14", " a c #B1D291", " s c #88BB58", " d c #ABD781", " f c #A4C684", " g c #91C164", " h c #5FB20E", " j c #C7DEB0", " k c #C6DEAF", " l c #40790A", " z c #3A7304", " x c #568926", " c c #9BCA6D", " v c #81AB5A", " b c #52A007", " n c #A5D773", " m c #C5DDAD", " M c #4E9A06", " N c #3B7604", " B c #3B7404", " V c #A3CA7E", " C c #427A0E", " Z c #80BE44", " A c #8BBD5C", " S c #64BA11", " D c #AAD581", " F c #82BE49", " G c #92D352", " H c #6BAC2F", " J c #538B1E", " K c #A8DA78", " L c #5BAE0B", " P c #6CBA1F", " I c #8DC25A", " U c #FFFFFF", " Y c #8CBE5C", " T c #8BBC5B", " R c #ABD681", " E c #62B90E", " W c #B9D79C", " Q c #71A63E", " ! c #A0D56C", " ~ c #68A92B", " ^ c #9DC873", " / c #BDD9A3", " ( c #99C46F", " ) c #5EB30D", " _ c #7FCB34", " ` c #8CC358", " ' c #CBE1B7", " ] c #3A7404", " [ c #8DC15C", " { c #57A709", " } c #437A10", " | c #64BC0F", ". c #88C44D", ".. c #AACE89", ".X c #85B954", ".o c #84C249", ".O c #A6D37B", ".+ c #8FC161", ".@ c #6AA136", ".# c #8DC655", ".$ c None", /* pixels */ ".$.$.$.$.$ =.$.$.$.$.$.$.$.$.$.$", ".$.$.$.$.$ z i ].$.$.$.$.$.$.$.$", ".$.$.$.$.$ z ' , ].$.$.$.$.$.$.$", ".$.$.$.$.$ z y @ f }.$.$.$.$.$.$", " ] z z z z N * ( a O : B.$.$.$.$", " z 7 $ m k j j g.+ ^ 5 v u.$.$.$", " z /.X s T A Y [ I & ` t 1 p.$.$", " z W 8 + ~ H . F 3. .o Z c.. > =", " z V M M M b { L h % P <.# # x =", " z V M M 9 2 - ) E | 6 X C.$.$", " z V V V e o D 4 ; _ K Q N.$.$.$", " ] z z z z 0 R S G n J q.$.$.$.$", ".$.$.$.$.$ z d ! r l.$.$.$.$.$.$", ".$.$.$.$.$ z.O.@ q.$.$.$.$.$.$.$", ".$.$.$.$.$ z w N.$.$.$.$.$.$.$.$", ".$.$.$.$.$ =.$.$.$.$.$.$.$.$.$.$" }; /* actions/document-save-as.png */ /* XPM */ const char *tango_document_save_as[] = { /* width height ncolors chars_per_pixel */ "16 16 101 2", /* colors */ " c #000000", " . c #739FC0", " X c #6C8577", " o c #81ADD1", " O c #DFE2DE", " + c #DCDCDB", " @ c #8FB3CE", " # c #96BBD8", " $ c #4A7180", " % c #95A9AF", " & c #B7B8B6", " * c #4E6A7D", " = c #3D698A", " - c #AFB0AE", " ; c #AEB0AD", " : c #ACCBE3", " > c #ABCBE2", " , c #EDEDEE", " < c #E9E9EA", " 1 c #A2A4A1", " 2 c #6B716E", " 3 c #9BC2DF", " 4 c #38678B", " 5 c #6E99B6", " 6 c #FCFCFC", " 7 c #FAFAFA", " 8 c #6B7F88", " 9 c #F4F4F4", " 0 c #F3F4F3", " q c #F2F2F2", " w c #CED4C8", " e c #F0F0F0", " r c #EFEEEF", " t c #EEEEEE", " y c #EDEEED", " u c #ECECEC", " i c #627075", " p c #3F6C8E", " a c #719FBF", " s c #E4E4E4", " d c #79A7CA", " f c #DCDCDC", " g c #DBDCDB", " h c #C9D6DD", " j c #DDE1D6", " k c #D5DFE5", " l c #AEB0AE", " z c #44789F", " x c #5186AF", " c c #7798B0", " v c #ACBCC3", " b c #DCDBDB", " n c #C5DBEC", " m c #3D6B8E", " M c #58787A", " N c #C1D9EB", " B c #6A7F5A", " V c #3B6B8F", " C c #9EBFD9", " Z c #E2E6DD", " A c #9AAEB4", " S c #ABC8DF", " D c #6E706B", " F c #92A6AC", " G c #EEEEEF", " H c #EDEEEE", " J c #427092", " K c #EBECEC", " L c #688BA0", " P c #D0DFEF", " I c #6296BB", " U c #DBDCDC", " Y c #72756B", " T c #92B7D3", " R c #667173", " E c #98BFDC", " W c #FFFFFF", " Q c #FDFDFD", " ! c #FCFBFC", " ~ c #F9F9F9", " ^ c #F7F7F7", " / c #AFB0AD", " ( c #F3F3F3", " ) c #F1F1F1", " _ c #41749A", " ` c #EFEFEF", " ' c #EEEFEE", " ] c #CACFC4", " [ c #EDEDED", " { c #EAE9EA", " } c #A3A4A1", " | c #C5CBBF", ". c #4A6D85", ".. c #436E88", ".X c #E3E3E3", ".o c #DCDBDC", ".O c #5892BD", ".+ c #B1CEE6", ".@ c #4D7991", ".# c #547D9B", ".$ c None", /* pixels */ ".$.$.$ 4 4 4 = $ M.$.$.$.$.$.$.$", ".$.$.$.+ P n 3 L...$.$.$.$.$.$.$", " 8 R i. _ z C N x * D D D D D D", " 2 Z W j h 5 4 > T.# k W W W 9 D", " Y Q t [ O c 4 d @ m v , H y 0 D", " D ! K 4 4 4 4 d.O 4 4 4 4 u ( D", " D 7 < ] 4 E a a a . # 4 % { q D", " D ~ 7 s | 4 E . . S 4 F s 9 ) D", " D ~ t 7 s | 4 : E V F s 7 t ) D", " D ^.X t 7 7 w p 4 A 7 6 t.X e D", " D } 1 } } } } } } } } } } } } D", " D f b + f.o +.o f g U + U f D", " D ` / l - ; / / / / r ' G r D", " D W & & & & & & & & W W W W D", " D W W W W W W W W W W W W W D", " D D D D D D D D D D D D D D D D" }; /* actions/document-save.png */ /* XPM */ const char *tango_document_save[] = { /* width height ncolors chars_per_pixel */ "16 16 114 2", /* colors */ " c #000000", " . c #739FC0", " X c #AFAFAF", " o c #6C8577", " O c #81ADD1", " + c #DFE2DE", " @ c #A9A9A9", " # c #A8A7A8", " $ c #8FB3CE", " % c #9F9F9F", " & c #96BBD8", " * c #4A7180", " = c #95A9AF", " - c #B7B6B6", " ; c #4E6A7D", " : c #3D698A", " > c #AAAAA9", " , c #ACCBE3", " < c #ABCBE2", " 1 c #EDEDEE", " 2 c #E9E9EA", " 3 c #6B716E", " 4 c #9BC2DF", " 5 c #38678B", " 6 c #6E99B6", " 7 c #FEFEFE", " 8 c #FCFCFC", " 9 c #FAFAFA", " 0 c #6B7F88", " q c #F4F4F4", " w c #F3F4F3", " e c #F2F2F2", " r c #CED4C8", " t c #F0F0F0", " y c #EEEEEE", " u c #EDEEED", " i c #ECECEC", " p c #627075", " a c #3F6C8E", " s c #719FBF", " d c #E4E4E4", " f c #79A7CA", " g c #DCDCDC", " h c #D6D6D6", " j c #C9D6DD", " k c #D2D2D2", " l c #D0D0D0", " z c #CECECE", " x c #DDE1D6", " c c #CACACA", " v c #C8C8C8", " b c #C4C4C4", " n c #C2C2C2", " m c #BCBCBC", " M c #D5DFE5", " N c #B4B4B4", " B c #44789F", " V c #5186AF", " C c #7798B0", " Z c #ACBCC3", " A c #C5DBEC", " S c #3D6B8E", " D c #58787A", " F c #C1D9EB", " G c #6A7F5A", " H c #3B6B8F", " J c #9EBFD9", " K c #E2E6DD", " L c #9AAEB4", " P c #ABC8DF", " I c #6E706B", " U c #92A6AC", " Y c #A8A7A7", " T c #EDEEEE", " R c #427092", " E c #EBECEC", " W c #688BA0", " Q c #D0DFEF", " ! c #6296BB", " ~ c #72756B", " ^ c #92B7D3", " / c #667173", " ( c #98BFDC", " ) c #FFFFFF", " _ c #FDFDFD", " ` c #FCFBFC", " ' c #F9F9F9", " ] c #F7F7F7", " [ c #F3F3F3", " { c #F1F1F1", " } c #41749A", " | c #CACFC4", ". c #EDEDED", ".. c #EBEBEB", ".X c #EAE9EA", ".o c #C5CBBF", ".O c #4A6D85", ".+ c #436E88", ".@ c #E3E3E3", ".# c #DDDDDD", ".$ c #D5D5D5", ".% c #D1D1D1", ".& c #CFCFCF", ".* c #CDCDCD", ".= c #CBCBCB", ".- c #C9C9C9", ".; c #5892BD", ".: c #C5C5C5", ".> c #C3C3C3", "., c #B1CEE6", ".< c #4D7991", ".1 c #B9B9B9", ".2 c #547D9B", ".3 c None", /* pixels */ ".3.3.3 5 5 5 : * D.3.3.3.3.3.3.3", ".3.3.3., Q A 4 W.+.3.3.3.3.3.3.3", " 0 / p.O } B J F V ; I I I I I I", " 3 K ) x j 6 5 < ^.2 M ) ) ) q I", " ~ _ y. + C 5 f $ S Z 1 T u w I", " I ` E 5 5 5 5 f.; 5 5 5 5 i [ I", " I 9 2 | 5 ( s s s . & 5 =.X e I", " I ' 9 d.o 5 ( . . P 5 U d q { I", " I ' y 9 d.o 5 , ( H U d 9 y { I", " I ].@ y 9 9 r a 5 L 9 8 y.@ t I", " I 7 ) ) ) ) ) ) ) q q.....@ t I", " I z.-.-.-.-.:.-.-.:.:.:.:.: h I", " I z.: % X m b v l @ k @ k.1 c I", " I.*.> > N n b v.= #.% Y.% - c I", " I.# g g g.$.$.&.&.&.&.&.&.& c I", " I I I I I I I I I I I I I I I I" }; /* actions/system-shutdown.png */ /* XPM */ const char *tango_system_shutdown[] = { /* width height ncolors chars_per_pixel */ "16 16 66 1", /* colors */ " c #ABABAB", ". c #A9A9A9", "X c #8F8F8F", "o c #858585", "O c #7D7D7D", "+ c #6F6F6F", "@ c #6D6D6D", "# c #656565", "$ c #616161", "% c #5F5F5F", "& c #555555", "* c #515151", "= c #F6F6F6", "- c #F4F4F4", "; c #F0F0F0", ": c #EEEEEE", "> c #ECECEC", ", c #EAEAEA", "< c #E8E8E8", "1 c #E6E6E6", "2 c #E4E4E4", "3 c #E2E2E2", "4 c #E0E0E0", "5 c #2D2D2D", "6 c #DEDEDE", "7 c #2B2B2B", "8 c #272727", "9 c #D8D8D8", "0 c #D4D4D4", "q c #D2D2D2", "w c #CCCCCC", "e c #C2C2C2", "r c #BCBCBC", "t c #A6A6A6", "y c #A2A2A2", "u c #A0A0A0", "i c #888A85", "p c #8E8E8E", "a c #848484", "s c #808080", "d c #7A7A7A", "f c #6C6C6C", "g c #606060", "h c #F7F7F7", "j c #F5F5F5", "k c #F3F3F3", "l c #F1F1F1", "z c #EFEFEF", "x c #EDEDED", "c c #EBEBEB", "v c #E9E9E9", "b c #E7E7E7", "n c #E5E5E5", "m c #E3E3E3", "M c #E1E1E1", "N c #DFDFDF", "B c #282828", "V c #C9C9C9", "C c #C7C7C7", "Z c #C5C5C5", "A c #C3C3C3", "S c #C1C1C1", "D c #BBBBBB", "F c #B9B9B9", "G c #B3B3B3", "H c None", /* pixels */ "HiiiiiiiiiiiiiiH", "immmmmmmmmmmmmmi", "i3mz=hhhhhhh=1mi", "imz=jjjjjjjjjk2i", "in-kkwaooop;kkbi", "i1-ll*****B3lli", "ix,22dC>>m%22m:i", "i:<33O6jjj+63Mzi", "iz144oyeeDO946;i", "iz,66wf@$f q6Nli", "izlcMM6rSZV0M;li", "illlllllllllllli", "HiiiiiiiiiiiiiiH" }; /* places/start-here.png */ /* XPM */ const char *tango_start_here[] = { /* width height ncolors chars_per_pixel */ "16 16 53 1", /* colors */ " c #6593C6", ". c #5080B8", "X c #3869A7", "o c #3667A5", "O c #2F5F9E", "+ c #4474AF", "@ c #4272AD", "# c #234E8B", "$ c #214C89", "% c #204A88", "& c #507FB7", "* c #3A6AA8", "= c #295694", "- c #3868A6", "; c #5E8CC1", ": c #214B88", "> c #25518F", ", c #2C5B99", "< c #3667A6", "1 c #3465A4", "2 c #4070AC", "3 c #25508E", "4 c #24508D", "5 c #6492C5", "6 c #2A5896", "7 c #4E7DB6", "8 c #3768A6", "9 c #3566A4", "0 c #3162A0", "q c #30609F", "w c #729FCF", "e c #5B8ABF", "r c #4575B0", "t c #244F8C", "y c #214B89", "u c #204B88", "i c #6895C8", "p c #6795C7", "a c #5180B8", "s c #285593", "d c #31619F", "f c #2F5F9D", "g c #5D8BC0", "h c #FFFFFF", "j c #6B98CA", "k c #6996C8", "l c #5483BA", "z c #204A87", "x c #3D6EAA", "c c #2D5C9A", "v c #3566A5", "b c #234F8C", "n c None", /* pixels */ "nnnnnnnnnn%z:nnn", "nno9-nnnnn#d6unn", "nnxklunn", "nn2 ronnnnzzunnn", "nnvv c #B1CEEC", " , c #607AA3", " < c #B3C1D0", " 1 c #B5BEC8", " 2 c #5B6D94", " 3 c #5A6B93", " 4 c #CCDDEF", " 5 c #DBDEE0", " 6 c #7591B4", " 7 c #759FCB", " 8 c #BED4EB", " 9 c #F8F9F9", " 0 c #B7C2CD", " q c #BECFE1", " w c #BCCDDF", " e c #506A96", " r c #5978A2", " t c #93ABC7", " y c #B4BCCD", " u c #C6CFD8", " i c #A3B8D0", " p c #843345", " a c #A0B4CD", " s c #516790", " d c #BEC7D0", " f c #CAD5DF", " g c #5988BC", " h c #DFE1E3", " j c #83A7CE", " k c #AFB8CB", " l c #FEFEFE", " z c #D7D9DB", " x c #5C77A1", " c c #DCE4ED", " v c #F6F6F6", " b c #6B7B9F", " n c #628FC1", " m c #E6EBF0", " M c #C0C6CE", " N c #768BAD", " B c #E2E2E2", " V c #80A7D1", " C c #E0E0E0", " Z c #B7C8DC", " A c #B1C2D6", " S c #DCE3E9", " D c #6B96C6", " F c #705472", " G c #9E080B", " H c #7A95B7", " J c #656588", " K c #4E648F", " L c #6F5674", " P c #BABFC4", " I c #A9BCD1", " U c #D9E1E9", " Y c #CED0D1", " T c #6983A6", " R c #C8CFD5", " E c #8593B1", " W c #546E98", " Q c #A40000", " ! c #D9DCDF", " ~ c #9DA6AE", " ^ c #6D90B7", " / c #686284", " ( c #991116", " ) c #D2E5F9", " _ c #ADB9CE", " ` c #D6DFE9", " ' c #A3B6CE", " ] c #DAEAFA", " [ c #CFD9E2", " { c #5A7AA4", " } c #5C8ABD", " | c #A2BDDA", ". c #597199", ".. c #D5DFEB", ".X c #A5B7C9", ".o c #CCD7E2", ".O c #C3D2E3", ".+ c #5686BA", ".@ c #E3F1FF", ".# c #C8CED4", ".$ c #E2EFFE", ".% c #7792B6", ".& c #516994", ".* c #9BB2CC", ".= c #9AB0CB", ".- c #9EADC5", ".; c #C9E1F9", ".: c #F4F4F5", ".> c #CED1D3", "., c #E0EFFF", ".< c #4F80B6", ".1 c #CEDBEA", ".2 c #405583", ".3 c #5D7DA6", ".4 c #5A79A3", ".5 c #94ACC8", ".6 c #7E97B9", ".7 c #6C96C5", ".8 c #BECBDA", ".9 c #C4CAD6", ".0 c #E6EBF4", ".q c #DAEBFC", ".w c #D4E5F6", ".e c #E4E6E8", ".r c #E2E4E6", ".t c #9CBDE0", ".y c #6E5471", ".u c #95A7C2", ".i c #C7CDD2", ".p c #ACCAE9", ".a c #9DB3CD", ".s c #FDFDFD", ".d c #BCD7F2", ".f c #FBFBFB", ".g c #5A769F", ".h c #F9F9F9", ".j c #58749D", ".k c #AABED3", ".l c #F5F5F5", ".z c #E1F0FF", ".x c #EFEFEF", ".c c #BECAD6", ".v c #BCC8D4", ".b c #719BC9", ".n c #B5D1EE", ".m c #B8BFC6", ".M c #364878", ".N c #576F95", ".B c #D5DFE9", ".V c #DEEEFF", ".C c #B8C9DD", ".Z c #101221", ".A c #AEB5BC", ".S c #4B6189", ".D c #D3D3D3", ".F c #D1D1D1", ".G c #7994B6", ".H c #DCDDDF", ".J c #931821", ".K c #B4C7DC", ".L c #9FB4CE", ".P c #A4B5C9", ".I c #9CB2CB", ".U c #CCE3FA", ".Y c #B3CCE8", ".T c #E2F1FF", ".R c #617FA8", ".E c #DEEDFB", ".W c #D5E8FC", ".Q c None", /* pixels */ ".Q.M.M.M.M.M.M.M r =.Q.Q.Q.Q.Q.Q", ".Q.Q.M.M.M b c.0.. A.6 *.Q.Q.Q.Q", ".Q.Q W 3 y [ P.8 8.c U '.4.Q.Q.Q", ".Q. 3.9.>.$.E.w.v M 5 m a {.Q.Q", " K.M k ; f.T.@ ] u z.:.f.B.G.Q.Q", " s 2 ! 4.,.z.z.q.i d.P 1.e i {.Q", ".2 E.k.U.V @ @.1.s l.s.r.H w /.Q", ".M _.p.d.;.W ) R l l l.h.A.O F.Q", " e.- 0.#.Y.n > I 9 o l.x Y.C L.Q", " x.u X l h |.t # + O.l B ~.a p Q", " , H ` l l $ j V 7.7 C.D.X N ( Q", ".Q.R.I S v.m.b D n g.F -.5 % Q.Q", ".Q.Q.3.=.o ^ }.+.< : < t J G.Q.Q", ".Q.Q.Q T.%.L Z q.K.* 6.y G.Q.Q.Q", ".Q.Q.Q.Q.N.g.4 & r.j.J Q Q Q.Q.Q", ".Q.Q.Q.Q.Q.Q.Q.Q Q Q Q Q Q Q Q.Q" }; /* apps/system-users.png */ /* XPM */ const char *tango_system_users[] = { /* width height ncolors chars_per_pixel */ "16 16 147 2", /* colors */ " c #000000", " . c #F3BE71", " X c #ECBD74", " o c #4071AF", " O c #E6AA4D", " + c #868F41", " @ c #4A78B2", " # c #7E6040", " $ c #AF7D2E", " % c #E3A340", " & c #3263A1", " * c #547FB5", " = c #905841", " - c #616519", " ; c #797F37", " : c #B99355", " > c #6C3F3B", " , c #E3A23C", " < c #EBAA5B", " 1 c #4172AF", " 2 c #F6CB8A", " 3 c #E5A255", " 4 c #D1A55F", " 5 c #C0934B", " 6 c #6D4A0A", " 7 c #9F5203", " 8 c #6A692B", " 9 c #8BA6C9", " 0 c #D08F4A", " q c #723C51", " w c #3E558E", " e c #E3A256", " r c #F3C680", " t c #5C3B59", " y c #3466A5", " u c #895443", " i c #C2893C", " p c #6087B9", " a c #5A3464", " s c #C16710", " d c #3568A9", " f c #DDA053", " g c #AF8033", " h c #BC8E43", " j c #ECB868", " k c #C29142", " l c #8B6B58", " z c #8E5105", " x c #5A85B9", " c c #614D7E", " v c #687214", " b c #90563F", " n c #DAAE6D", " m c #D8994A", " M c #5F86B7", " N c #E6A251", " B c #645370", " V c #E0992A", " C c #D6DBE3", " Z c #E5A746", " A c #3467A7", " S c #E09B2D", " D c #BF6C10", " F c #767B35", " G c #829FC5", " H c #32629E", " J c #B78940", " K c #616B09", " L c #F1BD6F", " P c #864F06", " I c #5E83B2", " U c #386DB1", " Y c #3D538B", " T c #C77D28", " R c #485F99", " E c #3364A2", " W c #3264A1", " Q c #E1A23E", " ! c #6F7131", " ~ c #955104", " ^ c #6D712F", " / c #E8AA5C", " ( c #B88530", " ) c #624F0D", " _ c #C16404", " ` c #BA5C11", " ' c #E5AE5C", " ] c #D9AC64", " [ c #DDAB5E", " { c #815107", " } c #AA7722", " | c #A9A3B9", ". c #F9C780", ".. c #A0B6D1", ".X c #C4680A", ".o c #6B8BB4", ".O c #8DA7C8", ".+ c #B68134", ".@ c #C38F44", ".# c #E2B369", ".$ c #596921", ".% c #465440", ".& c #CC5E01", ".* c #C49A52", ".= c #6A6A2B", ".- c #CC5E04", ".; c #B98633", ".: c #5C3566", ".> c #DCA552", "., c #A35403", ".< c #55315F", ".1 c #4576B2", ".2 c #965435", ".3 c #B4C1D3", ".4 c #EFC075", ".5 c #885106", ".6 c #366BAD", ".7 c #BC7625", ".8 c #32629F", ".9 c #30609D", ".0 c #EBBC74", ".q c #5680B5", ".w c #DF8E3A", ".e c #D56402", ".r c #3466A4", ".t c #3364A3", ".y c #CB9A51", ".u c #685D14", ".i c #6E771D", ".p c #3B6EAE", ".a c #815330", ".s c #B0B6CB", ".d c #4F649A", ".f c #C99C66", ".g c #3568A8", ".h c #9E5807", ".j c #B85410", ".k c #E6AD54", ".l c #5981B4", ".z c #844240", ".x c #366AAC", ".c c #D16604", ".v c #A6ACC4", ".b c #CF9D51", ".n c #F0CE99", ".m c #CD5C00", ".M c None", /* pixels */ ".M.M.M.M P ~ z.,.M.M.M.M.M.M.M.M", ".M.M.M.c m 4.b.@ 7.M.M.M.M.M.M.M", ".M.M.h f.* 5.;.7 s.m.&.m.M.M.M.M", ".M.M.5.y h : T.X N 2 . /.m.M.M.M", ".M.M { k ( J D < r.0 O.4.w.m.M.M", ".M.M ) i g }.e. X.n.k , '.m.M.M", ".M.M >.a.+ $ _ L Z.# S Q.>.m.M.M", ".M.% ^ - # 6.u 3 j V % ] 0.j.M.M", ".% F.i + + 8 q = e [ n.f b.z.M.M", ".% F v +.=.: 9 B l.- `.2 u p.:.:", ".% F v v.:.O.x U.s c |.v.g W p.:", ".% F.$ K t p A.6.. C x G y.9.p.:", ".% F ; !.: M.t A d.3.l.r & &.p.:", ".M.%.%.%.: I.t w E.o & H Y.8.p.:", ".M.M.M.M.:.q *.d @ o o o R 1.1.:", ".M.M.M.M.<.:.:.:.:.:.:.:.:.:.: a" }; /* apps/accessories-text-editor.png */ /* XPM */ const char *tango_accessories_text_editor[] = { /* width height ncolors chars_per_pixel */ "16 16 52 1", /* colors */ " c #000000", ". c #B1B1B1", "X c #705B39", "o c #9D9D9D", "O c #C89F64", "+ c #C4A000", "@ c #8F8F8F", "# c #A08457", "$ c #CFAD71", "% c #D2AC6A", "& c #757575", "* c #EBB13D", "= c #717171", "- c #A48757", "; c #636363", ": c #A08356", "> c #EEEEEE", ", c #ECECEC", "< c #EAEAEA", "1 c #EEEAC6", "2 c #EDE6C5", "3 c #DADADA", "4 c #D6D6D6", "5 c #CCCCCC", "6 c #CACACA", "7 c #C2AB8A", "8 c #C4C4C4", "9 c #BCBCBC", "0 c #B8B8B8", "q c #B2B2B2", "w c #AEAEAE", "e c #F9E8C6", "r c #EDE5C4", "t c #4C4226", "y c #A18355", "u c #888A85", "i c #8C8C8C", "p c #868686", "a c #6B5736", "s c #FFFFFF", "d c #EBEBEB", "f c #E9E9E9", "g c #A38555", "h c #CFAA69", "j c #CEA668", "k c #EFEBC7", "l c #DBDBDB", "z c #D3D3D3", "x c #CBCBCB", "c c #8F5902", "v c #B7B7B7", "b c None", /* pixels */ "bbbbbbbbbbbbbbbb", "bbb+b+b+b+b+bbbb", "bb+e+e+e+e+e+bbb", "bu+*+*+*+*+*+ccb", "bud+9+0+0+0+c1$c", "bus,,,,,,,zck%yc", "busl55555vck%-cb", "bus,,,,,zc1h:cbb", "busl555vc2j#cubb", "bus,,,dcrO-c=ubb", "busl5x&X7gc@pubb", "bus,,fctaco4wubb", "buslx8 c;i63qubb", "bus,d<qqqqqqq.qqubb", "buuuuuuuuuuuuubb" }; /* mimetypes/text-x-generic.png */ /* XPM */ const char *tango_text_x_generic[] = { /* width height ncolors chars_per_pixel */ "16 16 22 1", /* colors */ " c #000000", ". c #EDEDE5", "X c #999999", "o c #959595", "O c #818181", "+ c #F2F2F2", "@ c #F0F0F0", "# c #EEEEEE", "$ c #ECECEC", "% c #EAEAEA", "& c #EDEDE6", "* c #C8C8C8", "= c #C6C6C6", "- c #C4C4C4", "; c #FFFFFF", ": c #F1F1F1", "> c #EFEFEF", ", c #EDEDED", "< c #EBEBEB", "1 c #C7C7C7", "2 c #C5C5C5", "3 c None", /* pixels */ "XOOOOOOOOOOOO333", "O;;;;;;;;;;;;O33", "O;$%%<<<$$,@;O33", "O;%-22====1@;O33", "O;%<<$$$,,#@;O33", "O;<2======1@;O33", "O;<<$$,,.$#@;O33", "O;<====##&#@;O33", "O;$$,,##>>>@;O33", "O;$===11***@;O33", "O;$,##>>@:::;O33", "O;,=11***::+;O33", "O;,,#>>@@:++;O33", "O;;;;;;;;;;;;O33", "oOOOOOOOOOOOOo33", "3333333333333333" }; /* mimetypes/x-office-calendar.png */ /* XPM */ const char *tango_x_office_calendar[] = { /* width height ncolors chars_per_pixel */ "16 16 61 1", /* colors */ " c #000000", ". c #686A66", "X c #646662", "o c #818485", "O c #CACAC9", "+ c #C3C4C2", "@ c #959798", "# c #C2C4C4", "$ c #9B9C9A", "% c #4D5254", "& c #3B4042", "* c #393E40", "= c #C9C9CA", "- c #B0B1AE", "; c #AAABA8", ": c #EEEEEE", "> c #ECECEC", ", c #E6E6E6", "< c #E4E4E4", "1 c #E2E2E2", "2 c #E0E0E0", "3 c #939591", "4 c #D6D6D6", "5 c #D2D2D2", "6 c #CDCECD", "7 c #C8C8C8", "8 c #FBFBFA", "9 c #E3E3E2", "0 c #636561", "q c #61635F", "w c #B0B2B3", "e c #555753", "r c #898C86", "t c #888A85", "y c #4A5052", "u c #A0A2A3", "i c #7C7E79", "p c #C2C3C1", "a c #404648", "s c #383E40", "d c #B8B9B7", "f c #C8C9CA", "g c #32383A", "h c #2E3436", "j c #4C5153", "k c #414748", "l c #FFFFFF", "z c #FDFDFD", "x c #C5C6C6", "c c #F3F3F3", "v c #F1F1F1", "b c #E9E9E9", "n c #E7E7E7", "m c #E3E3E3", "M c #E1E1E1", "N c #DFDFDF", "B c #D9D9D9", "V c #CECFCE", "C c #CACBCA", "Z c #6E706C", "A c None", /* pixels */ "AAttAAAtAAAtAAAA", "AtttttttttttttAA", "tlt+llt4zzt4zltA", "tlt3,,tt9,tt,ltA", "tl4B,,44<,444ltA", "il,:v,VCdc-$XA", "Xlllllllllll;ZXA", "0qqqqqqqqqqqqqXA", "AhteeeeeeeeeehAA", "AhhhhhhhhhhhhhAA" }; /* places/user-trash.png */ /* XPM */ const char *tango_user_trash[] = { /* width height ncolors chars_per_pixel */ "16 16 135 2", /* colors */ " c #000000", " . c #6A6C68", " X c #D6DBC8", " o c #686A66", " O c #CCD29D", " + c #D3D8BB", " @ c #5E605C", " # c #A9B260", " $ c #959E49", " % c #BCC662", " & c #8A915C", " * c #CDD2A1", " = c #AAB264", " - c #5D6329", " ; c #BAC36D", " : c #B1B4AD", " > c #7F865E", " , c #6B6D68", " < c #545B23", " 1 c #D4D9BB", " 2 c #989A94", " 3 c #D2D7B9", " 4 c #61635E", " 5 c #B5BB82", " 6 c #C3CA89", " 7 c #A0A956", " 8 c #CCD19F", " 9 c #C8CEA5", " 0 c #A8AD75", " q c #A1A76E", " w c #BDC765", " e c #909946", " r c #D1D793", " t c #98A247", " y c #666D2D", " u c #B8BE84", " i c #BDC675", " p c #939A59", " a c #494D4C", " s c #81893A", " d c #8C9548", " f c #646663", " g c #4E541F", " h c #B2B881", " j c #B6BBA6", " k c #9FA46B", " l c #A5AE49", " z c #D0D691", " x c #788134", " c c #9AA252", " v c #8C9162", " b c #929C4A", " n c #ACB27E", " m c #545B21", " M c #797B77", " N c #757773", " B c #737571", " V c #737B32", " C c #6D6F6B", " Z c #CAD184", " A c #C7CC8B", " S c #919A4C", " D c #8A9259", " F c #B8C065", " G c #767B77", " H c #D4D9BC", " J c #636561", " K c #D3D9BB", " L c #61682A", " P c #879042", " I c #6F7731", " U c #969F4A", " Y c #BDC763", " T c #BBC561", " R c #9FA956", " E c #7A8235", " W c #B5C051", " Q c #A9B259", " ! c #ADB17E", " ~ c #787A75", " ^ c #798237", " / c #BCC286", " ( c #B8C257", " ) c #CDD590", " _ c #B7BE81", " ` c #70726D", " ' c #575E26", " ] c #535A22", " [ c #686A65", " { c #666863", " } c #62645F", " | c #C4CB9E", ". c #A7AF67", ".. c #A9AD94", ".X c #5C5E59", ".o c #BCC661", ".O c #A8B154", ".+ c #8B9348", ".@ c #CBD09E", ".# c #4C521E", ".$ c #8B943E", ".% c #A5AC72", ".& c #AEB75D", ".* c #ADB75C", ".= c #AAB263", ".- c #565D21", ".; c #A6AF55", ".: c #B2BB64", ".> c #767F33", "., c #CCD28E", ".< c #B2BD50", ".1 c #C3CA99", ".2 c #5B6129", ".3 c #96A04F", ".4 c #888E69", ".5 c #C9D181", ".6 c #BBC469", ".7 c #BBC55F", ".8 c #B9C35D", ".9 c #899245", ".0 c #6C732F", ".q c #BFC687", ".w c #B3BD5A", ".e c #A3AB72", ".r c #B3BE50", ".t c #98A150", ".y c #C7D07E", ".u c #9CA64D", ".i c #727470", ".p c #DBE0D7", ".a c #70726E", ".s c #C9D18D", ".d c #ADB757", ".f c #949D4F", ".g c None", /* pixels */ ".g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g", ".g.g < < < < < < < < < < < <.g.g", ".g >.p.p.p.p.p.p.p.p.p.p.p.p.4.g", " <.p G.X @ 4 J { o , C `.i :.p <", " <.p a } f [ . C.a B N ~ M 2.p <", " < j.p.p.p.p.p.p.p.p.p.p.p.p.. <", " < < p E x.> V I.0 y L -.2 ' < ]", ".g <.y W W.r l.; = t.$ s ^ D <.g", ".g <.y W W.< F X X.@ 7 $ d & <.g", ".g <.5 W W O ;.: 8 * R c.f k <.g", ".g < Z (.o 1 X.* Q # _.t S.% <.g", ".g < z w Y K i.& 9.= 3.3.+ 0 <.g", ".g < r % T.6 *.1 H +. b.9.e <.g", ".g < ).7.8.w.d.O |.u U e P q <.g", ".g < !.,.s A 6.q / u 5 h n v <.g", ".g.g < < < < < < < < < < < <.g.g" }; /* apps/utilities-system-monitor.png */ /* XPM */ const char *tango_utilities_system_monitor[] = { /* width height ncolors chars_per_pixel */ "16 16 116 2", /* colors */ " c #000000", " . c #8199BA", " X c #DEE0DD", " o c #EDEAB0", " O c #F6F8FB", " + c #F5F8FA", " @ c #316696", " # c #4280AD", " $ c #407EAB", " % c #316A99", " & c #7D7D7A", " * c #2F6697", " = c #F1F6F9", " - c #2C6294", " ; c #3772A2", " : c #BFCFA0", " > c #97B893", " , c #E7E8B0", " < c #E4E5E2", " 1 c #E2E3E0", " 2 c #DFE1DD", " 3 c #BBC774", " 4 c #265987", " 5 c #D7D9D5", " 6 c #D5D7D3", " 7 c #4D8DB7", " 8 c #98C0D9", " 9 c #CCCFCA", " 0 c #EEE788", " q c #4D8FBA", " w c #D7E5EF", " e c #3D79A7", " r c #3D77A7", " t c #4A8DB7", " y c #7792B5", " u c #FEFEFE", " i c #F9FAF9", " p c #B6C496", " a c #829B7A", " s c #90AF8B", " d c #89A584", " f c #85A180", " g c #E9F1F6", " h c #C9CCC6", " j c #5294BE", " k c #346A9A", " l c #D8E6EF", " z c #316697", " x c #4D8EB9", " c c #D6E4ED", " v c #2C6292", " b c #3A74A3", " n c #4584B1", " m c #346E9D", " M c #B4B6B1", " N c #316A9A", " B c #F9F9F8", " V c #EFF4F8", " C c #F4F5F3", " Z c #8CAA86", " A c #89A483", " S c #87A481", " D c #E5E7E4", " F c #829C7C", " G c #2C5D8E", " H c #DCDDDB", " J c #5495BF", " K c #BAD1E1", " L c #4887B3", " P c #7E7E7B", " I c #3D7BA8", " U c #F0F5F8", " Y c #BECE9F", " T c #DBDCD9", " R c #DADCD8", " E c #D3D6D1", " W c #D0D2CE", " Q c #2C6090", " ! c #CBCEC9", " ~ c #4280AC", " ^ c #488AB5", " / c #3772A1", " ( c #FFFFFF", " ) c #34709E", " _ c #4284AF", " ` c #346E9E", " ' c #316C9B", " ] c #FAFBFA", " [ c #96B691", " { c #F8F9F8", " } c #3D7CAA", " | c #94B48F", ". c #F6F7F6", ".. c #93B28E", ".X c #849E7C", ".o c #204A87", ".O c #91B08C", ".+ c #90AE8B", ".@ c #8EAC89", ".# c #8BAA86", ".$ c #D5DBA7", ".% c #D3D9A5", ".& c #85A280", ".* c #D6E3ED", ".= c #3D77A6", ".- c #4587B1", ".; c #4283AE", ".: c #B4B7B1", ".> c #96B590", "., c #F0F5F9", ".< c #EEEEED", ".1 c #8BA785", ".2 c #BACA9C", ".3 c #E9EAE8", ".4 c #B7C699", ".5 c None", /* pixels */ " P P P P P P P P P P P P P P P &", " P B { ( ( ( ( ( ( ( ( u ] ] ] P", " P B y.o.o.o.o.o.o.o.o.o.o y H P", " P u.o 4 G - a F ' N % @ v.o D P", " P u.o Q z.X o.& b b ; ) k.o 1 P", " P u.o * ` p V.4.1 } I.= /.o X P", " P u.o m S.% K c.@ n.; $ e.o T P", " P u.o f d.*.2 w.O 3 s.@.#.o 5 P", " P u.o + O.$.O l Y 0 =., U.o E P", " P u.o A Z.+.. : g 8 |.O.@.o W P", " P u.o r # L x [ , >.> 7 n.o 9 P", " P u.o.= ~.- t | J j q ^ _.o h P", " P B ..o.o.o.o.o.o.o.o.o.o y M P", " P B. i C.<.3 < 2 R 6 W !.:.: P", " P P P P P P P P P P P P P P P &", ".5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5" }; /* apps/utilities-terminal.png */ /* XPM */ const char *tango_utilities_terminal[] = { /* width height ncolors chars_per_pixel */ "16 16 163 2", /* colors */ " c #000000", " . c #A0A19D", " X c #8E9F74", " o c #8C9D72", " O c #9A9B97", " + c #989995", " @ c #DDDEDC", " # c #849074", " $ c #939590", " % c #D7D8D6", " & c #8F918C", " * c #374525", " = c #8D8F8A", " - c #CDCECC", " ; c #81837E", " : c #E0E3DB", " > c #ACBC94", " , c #0A0B09", " < c #090908", " 1 c #657C41", " 2 c #AABA92", " 3 c #192011", " 4 c #070706", " 5 c #4F6332", " 6 c #ECEDEA", " 7 c #A5B68D", " 8 c #B2B4B1", " 9 c #DBDBD9", " 0 c #29331D", " q c #26311A", " w c #91928D", " e c #D7D7D5", " r c #364423", " t c #555952", " y c #46572C", " u c #8B8C87", " i c #7E807A", " p c #7D8079", " a c #6A7559", " s c #0F100D", " d c #C0C1BE", " f c #787C74", " g c #777A73", " h c #747870", " j c #A9B990", " k c #6A6E66", " l c #B0B1AE", " z c #D3D6CD", " x c #B1BF9B", " c c #646860", " v c #5F625B", " b c #29341C", " n c #28341B", " m c #828E70", " M c #92958D", " N c #27321A", " B c #374523", " V c #8C8F87", " C c #46562B", " Z c #888B83", " A c #989996", " S c #DDDEDD", " D c #4E5E36", " F c #D7D8D7", " G c #A8B88E", " H c #A3A69D", " J c #B4B6B1", " K c #AFBE98", " L c #F2F3F1", " P c #747772", " I c #768560", " U c #536537", " Y c #182011", " T c #060706", " R c #3C4C27", " E c #4E6132", " W c #3B4A26", " Q c #4C5A3A", " ! c #273119", " ~ c #020302", " ^ c #808D6D", " / c #343633", " ( c #90A076", " ) c #CFD3CB", " _ c #DDDDDC", " ` c #969893", " ' c #616A55", " ] c #4C563D", " [ c #94A27D", " { c #D6D7D5", " } c #8A8C87", " | c #657152", ". c #647151", ".. c #CCCDCB", ".X c #848681", ".o c #131412", ".O c #A2B387", ".+ c #0D0E0C", ".@ c #0B0C0A", ".# c #080807", ".$ c #070806", ".% c #758954", ".& c #4F6232", ".* c #D9DED4", ".= c #7F8C6B", ".- c #2F312D", ".; c #636660", ".: c #73825F", ".> c #27321B", "., c #5A5E57", ".< c #364523", ".1 c #364323", ".2 c #545851", ".3 c #878983", ".4 c #868782", ".5 c #616E4D", ".6 c #82857E", ".7 c #81837D", ".8 c #7E817A", ".9 c #7D7F79", ".0 c #797D75", ".q c #7A846C", ".w c #767972", ".e c #6F736B", ".r c #A3A69E", ".t c #7E8B69", ".y c #7C8967", ".u c #9DA098", ".i c #798764", ".p c #656961", ".a c #999C94", ".s c #CED1C8", ".d c #99A38A", ".f c #62655E", ".g c #979A92", ".h c #859869", ".j c #29351C", ".k c #3B4A27", ".l c #28331B", ".z c #27311A", ".x c #92A279", ".c c #8D9088", ".v c #878A82", ".b c #97A681", ".n c #83867E", ".m c #95A47F", ".M c #232423", ".N c #737D64", ".B c #B7B9B4", ".V c #A4B58A", ".C c #A2A59C", ".Z c #7B8865", ".A c #697850", ".S c #AEBD97", ".D c #CDD2C6", ".F c #181F11", ".G c #060606", ".H c #849071", ".J c #3C4B27", ".K c #28321A", ".L c #273019", ".P c #010201", ".I c None", /* pixels */ ".I.u.a M.c Z.n.8.0 h.e k.p.f.,.I", " H J e S @ _ _ _ _ _ _ 9.. 8 P t", " H { /.#.#.#.#.#.#.#.# 4 4.- A t", ".C F s x K.S > 2 j G 7.V.O O.2", ".C F.+ #.H m ^.=.t.y.Z.i I `.2", ".C F.@.b.m [.x ( X o.h.% 1 $.2", ".C F , a.*.q |. .5 D C C y w.2", ".C F <.:.d :.D.A U E.&.& 5 =.2", ".C F.$ ] ' ) z *.1 r r.< B }.2", ".C F 4 Q.s.N.k W W W.J.J R .3.2", ".C F 4 0.z.L ! L L L 6.K.K .X.2", ".C F T q N.>.>.l.l n b b.j .7.2", ".C F.G.F.F.F.F.F.F.F Y 3 3 i.2", " H %.M ~.P.P.P.P.P.P.P.P.P.o.w t", ".r.B - d l . + $ & u.4 ;.9 g.; t", ".I.u.g M V.v.6 p f h.e k c v.,.I" }; /* status/weather-clear.png */ /* XPM */ const char *tango_weather_clear[] = { /* width height ncolors chars_per_pixel */ "16 16 82 1", /* colors */ " c #000000", ". c #FBBD5B", "X c #FDF4AC", "o c #FCF4AB", "O c #FDF3A2", "+ c #FEFCEF", "@ c #FCB23E", "# c #FCB03E", "$ c #FBAE3D", "% c #FBB94A", "& c #FCE34E", "* c #FAB43F", "= c #FCEB65", "- c #FBBA57", "; c #FCE768", ": c #FCEF82", "> c #FEF8D0", ", c #FEFEFB", "< c #FBB13F", "1 c #FDCD83", "2 c #FEF8E7", "3 c #FDF5B1", "4 c #FCED71", "5 c #FDF6BE", "6 c #FCE55D", "7 c #FCD549", "8 c #FDE6C1", "9 c #FEF9CF", "0 c #FDEAAD", "q c #FEFCF0", "w c #FCB43F", "e c #FCB23F", "r c #FDF4B0", "t c #FCE459", "y c #FCC66D", "u c #FCC470", "i c #FDF08B", "p c #FEF8CE", "a c #FDF0A2", "s c #FBC168", "d c #FCB33E", "f c #FCB13E", "g c #FCAF3E", "h c #FBAF3D", "j c #FBC16E", "k c #FCEC68", "l c #FDE6BF", "z c #FDF3A1", "x c #FAB545", "c c #FBD349", "v c #FCEA57", "b c #FDF4AE", "n c #FCF4AD", "m c #FEF9D0", "M c #FEFCF1", "N c #FCE86E", "B c #FBB43F", "V c #FEF9E7", "C c #FCCC82", "Z c #FBAE3F", "A c #FCEA5A", "S c #FCBC57", "D c #FCD964", "F c #FDF089", "G c #FDECB4", "H c #FDF1AA", "J c #FDF08C", "K c #FEFAE3", "L c #FCE956", "P c #FCEF81", "I c #FCB953", "U c #FEFDF0", "Y c #FCB33F", "T c #FBB13E", "R c #FBDB6C", "E c #FCE959", "W c #FCEF84", "Q c #FCCD84", "! c #FEF9DF", "~ c #FCEF87", "^ c #FCC570", "/ c None", /* pixels */ "////////////////", "///////#f///////", "///////ff///////", "///ge/1CuI/@g///", "///@ylVq!0-Ye///", "////8,+prnax////", "///12UU9XF~Dd///", "/ffQM>m5zPk;Tf#/", "/#f^K3bOJ4Et c #B4C9E2", " , c #7DA3CD", " < c #C5C7A0", " 1 c #D8DAAC", " 2 c #A7A472", " 3 c #C6D6ED", " 4 c #ABC2E3", " 5 c #C5D4EC", " 6 c #717168", " 7 c #8EAED7", " 8 c #C3D4EA", " 9 c #BDC4CD", " 0 c #BCBEA1", " q c #F7FAFC", " w c #DCE6F2", " e c #DDE4F3", " r c #A2AEC3", " t c #626677", " y c #505037", " u c #C0D2E7", " i c #616676", " p c #DBE4F1", " a c #BFD2E6", " s c #868997", " d c #89ACD2", " f c #D9E4EF", " g c #88ACD1", " h c #85A7D8", " j c #848795", " k c #63636E", " l c #A4A686", " z c #4A4A31", " x c #DFE0E1", " c c #B4C9E5", " v c #EEF0F3", " b c #EAEDF9", " n c #7EA3D1", " m c #B3C9E4", " M c #4B4B28", " N c #C6CDCF", " B c #CCDBEC", " V c #CBDBEB", " C c #CBD9EB", " Z c #AFC7E0", " A c #CAD9EA", " S c #E4EDF3", " D c #EBEDBB", " F c #AEC5DF", " G c #1A1A0F", " H c #9EB1CC", " J c #E9EBB9", " K c #C4C698", " L c #DBDC9E", " P c #A7C0E2", " I c #E7E9B7", " U c #C2C496", " Y c #686841", " T c #A8A862", " R c #8BACD7", " E c #A0A499", " W c #8D8D8D", " Q c #F4F7C7", " ! c #D7E4F0", " ~ c #9EA497", " ^ c #626570", " / c #D7E2F0", " ( c #E5E7E0", " ) c #D6E2EF", " _ c #F0F4F8", " ` c #9FBCDA", " ' c #9FBADA", " ] c #B6C9EA", " [ c #83A8CF", " { c #4D4D2D", " } c #73767A", " | c #A7ABAD", ". c #799ED9", ".. c #DBDEE0", ".X c #ECEEF4", ".o c #B7BA8B", ".O c #E4EDF6", ".+ c #C8D9EB", ".@ c #84887A", ".# c #57573A", ".$ c #C7D9EA", ".% c #E2EBF4", ".& c #C7D7EA", ".* c #C6D7E9", ".= c #8FB1D4", ".- c #AAC3DE", ".; c #C5D5E8", ".: c #8FAFD4", ".> c #656976", "., c #B9C4CF", ".< c #7098D0", ".1 c #636774", ".2 c #C0C2C2", ".3 c #616572", ".4 c #606371", ".5 c #D5E0F1", ".6 c #9EBADC", ".7 c #777777", ".8 c #D2E0EE", ".9 c #D1DEED", ".0 c #B6CAE3", ".q c #7FA4CE", ".w c #F8FADB", ".e c #B2B7BE", ".r c #727C93", ".t c #C8CDC3", ".y c #CBD6E7", ".u c #B5B782", ".i c #A7BEE8", ".p c #8FAFD7", ".a c #C4D5EA", ".s c #DEE9F3", ".d c #7098D3", ".f c #6D6D6D", ".g c #DDE7F2", ".h c #A7C1DE", ".j c #C2D3E8", ".k c #DDE5F2", ".l c #F7F9FB", ".z c #C1D3E7", ".x c #8BADD3", ".c c #616775", ".v c #3F3F22", ".b c #616575", ".n c #606574", ".m c #9C9C70", ".M c #A3A359", ".N c #4B4B31", ".B c #515123", ".V c #F0F1F4", ".C c #D5D7BF", ".Z c #CEDEED", ".A c #4C4C28", ".S c #CDDCEC", ".D c #CCDAEB", ".F c #ECEDF0", ".G c #B0C8E0", ".H c #CBDAEA", ".J c #7AA2CC", ".K c #95B4D6", ".L c #6B6E78", ".P c #98AED9", ".I c #C6D5EF", ".U c #79A0CB", ".Y c #B2C5D8", ".T c #6F98D5", ".R c #5B5B5B", ".E c #BABFA1", ".W c #ABAC5A", ".Q c #7099CC", ".! c #595959", ".~ c #DAE5F2", ".^ c #86A8DB", "./ c #D9E5F1", ".( c #ABBCDB", ".) c #A3BFDD", "._ c #BDD1E6", ".` c #D8E3F0", ".' c #A2BDDC", ".] c #80A3DF", ".[ c #D7E3EF", ".{ c #A1BDDB", ".} c #F1F5F8", ".| c #606042", "X c #555555", "X. c #D6E1EE", "XX c #91927C", "Xo c #F2F4C4", "XO c #686A61", "X+ c #F1F4C3", "X@ c #535353", "X# c #83A7CE", "X$ c #555580", "X% c #858459", "X& c #7A9FD9", "X* c #CDCE99", "X= c #7D8290", "X- c #D2D5BF", "X; c #EBEEBD", "X: c #84854E", "X> c #C9DAEB", "X, c #C9D8EB", "X< c #929494", "X1 c #C8D8EA", "X2 c #696C79", "X3 c #464625", "X4 c #C7D8E9", "X5 c #E2EAF3", "X6 c #91B2D5", "X7 c #ACC4DF", "X8 c #C0C2A0", "X9 c #C6D6E8", "X0 c #759ECA", "Xq c #474747", "Xw c #636673", "Xe c #626672", "Xr c #96977A", "Xt c #A8A85A", "Xy c #616471", "Xu c #EFF5F9", "Xi c #BEBE8A", "Xp c #9CB9D9", "Xa c #B7CBE3", "Xs c #D4D68F", "Xd c #81A5CF", "Xf c #9BB9D8", "Xg c #80A5CE", "Xh c #F0F0F0", "Xj c #555744", "Xk c #BFC3AC", "Xl c #A4AFA2", "Xz c #AFC6E5", "Xx c #96AEDD", "Xc c #686C7B", "Xv c #676C7A", "Xb c #A6AC9A", "Xn c #DCDFCF", "Xm c #C4D6E9", "XM c #D9DBA1", "XN c #DDE8F1", "XB c #636876", "XV c #C1D4E6", "XC c #8BAED2", "XZ c #C1D2E6", "XA c #626675", "XS c #9FB8E9", "XD c #DBE4EF", "XF c #A1A495", "XG c #52512D", "XH c #313131", "XJ c #75744C", "XK c #6C7282", "XL c #EBF1F8", "XP c #CFDFED", "XI c #DADFE4", "XU c #CFDDED", "XY c #CEDDEC", "XT c #98B7D8", "XR c #B3C9E2", "XE c #97B7D7", "XW c #CDDBEB", "XQ c #96B5D6", "X! c #494924", "X~ c #749CCF", "X^ c #81837C", "X/ c #BCC6CD", "X( c #626878", "X) c #DBE6F2", "X_ c #C6CBB9", "X` c #BFD2E7", "X' c #DFE5EC", "X] c #A4BEDD", "X[ c #BED2E6", "X{ c #A3BEDC", "X} c #D8E4EF", "X| c #51512F", "o c #B9CBEB", "o. c #828594", "oX c #F1F3C2", "oo c #EAEDFA", "oO c #DDDFAB", "o+ c #E6EDF6", "o@ c #5D5E34", "o# c #CBD9EC", "o$ c #CAD9EB", "o% c #EBEDBC", "o& c #AEC7E0", "o* c #B6B688", "o= c #C9D9EA", "o- c #8DABE4", "o; c #AEC5E0", "o: c #C8D9E9", "o> c #E6EAEC", "o, c #E5E8EB", "o< c #C0C3CA", "o1 c #646773", "o2 c #9EB9E4", "o3 c #626571", "o4 c #BFC4BF", "o5 c #C0C0C0", "o6 c #60656F", "o7 c #D5E2EF", "o8 c #9FBCDB", "o9 c #D4E0EE", "o0 c #C9CFD6", "oq c #C5CCDC", "ow c #9EBADA", "oe c #D7DFE7", "or c #9BB8D7", "ot c #848785", "oy c #AEBCC2", "ou c #7E8289", "oi c #BAB985", "op c #95ADDB", "oa c #E3E9F6", "os c #E2E9F5", "od c #C6D7EA", "of c #303018", "og c #B2BAB2", "oh c #E0E9F3", "oj c #6C7995", "ok c #AAC3DF", "ol c #DFE9F2", "oz c #879AC0", "ox c #7D817E", "oc c #C4D5E8", "ov c #DEE9F1", "ob c #AAB0BE", "on c #C3D5E7", "om c #DEE7F1", "oM c #85A7DF", "oN c #626774", "oB c #B0B0B0", "oV c #616573", "oC c #616373", "oZ c #D5E0F2", "oA c #EDEECE", "oS c #9AB5E3", "oD c #D1E0EE", "oF c #72747D", "oG c #B6CCE4", "oH c #D1DEEE", "oJ c #D0DEED", "oK c #CFDEEC", "oL c #B3B595", "oP c #CFDCEC", "oI c #8F94A0", "oU c #B3CAE1", "oY c #B4B461", "oT c #98B6D7", "oR c #B2CAE0", "oE c #B3C8E1", "oW c #D8DCE1", "oQ c #57573E", "o! c #A1A276", "o~ c #DEE9F4", "o^ c #D5D7A9", "o/ c #F3F4D7", "o( c #DCE7F2", "o) c #8999BB", "o_ c #626777", "o` c #BFD1E6", "o' c #89ABD2", "o] c #51522E", "o[ c #64646F", "o{ c #A2BDDA", "o} c #DCE4E8", "o| c #9C9C9C", "O c #9FB6E1", "O. c #ECEEFB", "OX c #808491", "Oo c #C4C7AC", "OO c #EEF1F3", "O+ c #4C4C29", "O@ c #A0B3D8", "O# c #D8DCE4", "O$ c #C3C9D6", "O% c #C9CB9D", "O& c #CCDCEC", "O* c #686D80", "O= c #CCDAEC", "O- c #CBDAEB", "O; c #9B9E87", "O: c #CADAEA", "O> c #E5ECF4", "O, c #94B4D6", "O< c #AFC6E0", "O1 c #919266", "O2 c #94B2D6", "O3 c #E4EAF3", "O4 c #5B5B31", "O5 c #78A0CB", "O6 c #59592F", "O7 c #E3E6F2", "O8 c #E6E8B6", "O9 c #C8CBB3", "O0 c #F2F5FA", "Oq c #61666F", "Ow c #F1F5F9", "Oe c #D6E1EF", "Or c #9CB8E1", "Ot c #D5E1EE", "Oy c #9FBBDA", "Ou c #CCD1CE", "Oi c #E9EEFB", "Op c #CDCE9A", "Oa c #BDBC87", "Os c #E8ECFA", "Od c #878B7D", "Of c #769DD6", "Og c #CACA97", "Oh c #C9D8EC", "Oj c #C8D8EB", "Ok c #C7D8EA", "Ol c #949162", "Oz c #C8C895", "Ox c #E1EAF3", "Oc c #595932", "Ov c #C6D6E9", "Ob c #E0EAF2", "On c #9B9B80", "Om c #BBC3D1", "OM c #8FB0D4", "ON c #666677", "OB c #424222", "OV c #646875", "OC c #8DAED2", "OZ c #919480", "OA c #616472", "OS c #D3E1EF", "OD c #646436", "OF c #D4DDF0", "OG c #D2DFEE", "OH c #EDF1F8", "OJ c #D1DFED", "OK c #99976A", "OL c #B6CBE3", "OP c #D0DDEC", "OI c #9AB7D8", "OU c #CFDDEB", "OY c #7BA0D4", "OT c #A8B09D", "OR c #759BD8", "OE c #8890A2", "OW c #C6C9CB", "OQ c #8EADE0", "O! c #98ADD6", "O~ c #9FA4A8", "O^ c #7D8AAB", "O/ c #F4F5D7", "O( c #DEE8F3", "O) c #ABBEE2", "O_ c #DDE8F2", "O` c #7E8BA2", "O' c #F2F3D5", "O] c #636877", "O[ c #C1D4E7", "O{ c #626876", "O} c #F6FAFA", "O| c #C1D2E7", "+ c #626676", "+. c #DBE6F0", "+X c #9FB8EA", "+o c #8AAED2", "+O c #626276", "++ c #686868", "+@ c #8B895C", "+# c #3C3C1F", "+$ c #828592", "+% c #888559", "+& c #B1B9CA", "+* c #EAF1F8", "+= c #4D4D29", "+- c #CEDDED", "+; c #606035", "+: c #B9C8DF", "+> c #CDDBEC", "+, c #CCDBEB", "+< c #CBDBEA", "+1 c #666C7D", "+2 c #94B3D5", "+3 c #6B6A43", "+4 c #E8EAEC", "+5 c #E2E9F0", "+6 c #626879", "+7 c #93A9D4", "+8 c #DAE6F2", "+9 c #535332", "+0 c #8C8B60", "+q c #585858", "+w c #5D6874", "+e c #292916", "+r c #D8E4F0", "+t c #F4F7C6", "+y c #BDD0E6", "+u c #9B9972", "+i c #65643D", "+p c #3C3C22", "+a c #BCD0E5", "+s c #565656", "+d c #636370", "+f c #61656E", "+g c #D6E2EE", "+h c #85A8D0", "+j c #BACEE3", "+k c #80A5D5", "+l c #E8EDF9", "+z c #B8BA8B", "+x c #505050", "+c c #CDD9EF", "+v c #6C6F7C", "+b c #8CA2C3", "+n c #E7EBF8", "+m c #B4B9BC", "+M c #CAD9EC", "+N c #FFFFFF", "+B c #AFC5E2", "+V c #C9D9EB", "+C c #C8D9EA", "+Z c #B1B38E", "+A c #939460", "+S c #E2EBF3", "+D c #92B1D6", "+F c #ACC5DF", "+G c #C7D7E9", "+H c #E2E9F3", "+J c #B8C3D7", "+K c #D6D8DA", "+L c #90B1D4", "+P c #80804A", "+I c #CFD5DD", "+U c #56562E", "+Y c #464646", "+T c #7A7D79", "+R c #636373", "+E c #616571", "+W c #606370", "+Q c #B9CEE5", "+! c #D4E0EF", "+~ c #DEE2E5", "+^ c #83A8D1", "+/ c #9EBADB", "+( c #D3E0EE", "+) c #EEF2F8", "+_ c #798499", "+` c #9DBADA", "+' c #D2E0ED", "+] c #96B2E7", "+[ c #B6CCE2", "+{ c #71747A", "+} c #909074", "+| c #80A4CE", "@ c #7CA1D4", "@. c #E6EBFA", "@X c #B4B45F", "@o c #474729", "@O c #99B2D6", "@+ c #ACC3E2", "@@ c #E0E9F4", "@# c #E5EAEF", "@$ c #D6D9A8", "@% c #C4D5E9", "@& c #A1A074", "@* c #F9FBFC", "@= c #C3D5E8", "@- c #646977", "@; c #DDE7F1", "@: c #A7C1DD", "@> c #C2D3E7", "@, c #636776", "@< c #719BC9", "@1 c #8CADD3", "@2 c #626775", "@3 c #8D9AB3", "@4 c #C1CFE6", "@5 c #A1BAE1", "@6 c #F4F5F7", "@7 c #64646D", "@8 c #EDEECF", "@9 c #9A9A6D", "@0 c #B8CCE7", "@q c #F2F3F5", "@w c #D1DEEF", "@e c #4E4E29", "@r c #C7CBD8", "@t c #D0DEEE", "@y c #CFDEED", "@u c #ACAFA3", "@i c #99B6D9", "@p c #6A6F80", "@a c #CEDCEC", "@s c #EAECF7", "@d c #CDDCEB", "@f c #2C2C2C", "@g c #759CDA", "@h c #7CA2CD", "@j c #BCC6D7", "@k c #B3B6B7", "@l c #8199C8", "@z c #BCC5CD", "@x c #DEE5F5", "@c c #C2C4C9", "@v c #626778", "@b c #DBE7F2", "@n c #616777", "@m c #DBE5F2", "@M c #DAE5F1", "@N c #AABED9", "@B c #F5F8C6", "@V c #BED1E6", "@C c #D9E3F0", "@Z c #646470", "@A c #BDCFE5", "@S c #B0C0CB", "@D c #BBCFE3", "@F c #F1F4C2", "@G c #DFE1E2", "@H c #D0DCF1", "@J c #EFF1F5", "@K c #E8F2F8", "@L c #EFF2C0", "@P c #1C1C1C", "@I c #DDDFE0", "@U c #DEE0AC", "@Y c #E8EEF8", "@T c #D6D8B8", "@R c #CCDCED", "@E c #1A1A1A", "@W c #92A2BE", "@Q c #B2C4E4", "@! c #E6ECF6", "@~ c #B0C6E2", "@^ c #CADAEB", "@/ c #CFDBE6", "@( c #CAD8EB", "@) c #AEC6E0", "@_ c #C8D8E9", "@` c #DCE5F6", "@' c #6F778B", "@] c #F2F7FB", "@[ c #F3F6C7", "@{ c #D6E3F0", "@} c #626471", "@| c #B2BCD0", "# c #D6E1F0", "#. c #626271", "#X c #E0E3E6", "#o c #D5E1EF", "#O c #6B7387", "#+ c #D4E1EE", "#@ c #98B3E8", "## c #EFF3F8", "#$ c #515128", "#% c #9EBBDA", "#& c #B9CDE4", "#* c #9B996A", "#= c #B8CDE3", "#- c #D3DFED", "#; c #CED09C", "#: c #CCCFCF", "#> c #6B707D", "#, c #ADC3EC", "#< c #B9B9B9", "#1 c #CAD8EE", "#2 c #686C7A", "#3 c #E2EAF5", "#4 c #ACC4E1", "#5 c #AFB28E", "#6 c #C6D6EA", "#7 c #C5D6E9", "#8 c #B1C1DC", "#9 c #C4D6E8", "#0 c #DFE8F2", "#q c #A9C2DE", "#w c #8DAED3", "#e c #C2D4E6", "#r c #DDE6F0", "#t c None", /* pixels */ "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t.b+6o_oVoVo_+6.c#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t@n#Oo)O@O) ]o @Q.(@W@'@n#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t@2O*O!#,oS.^@ X~X~ n R P.I#8XK@2#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tXAO^.iOQ.d+k.p+/o;oG+F.'@1X0.6+c@3XA#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t+1+7XS. h c.*.&X1Ok.&+GOv.;o`.: [ 5+:@p#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t iopo-X& 4#6X4.$X1o=+CX1X1+GX9oc@AXdO5@+@4+ #t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t+ @l#@OR oodOk.&o=o= A@^o$@^o=Ok#7@=X7 ,.U 3 H+ #t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#toj+X@gXz.a.*+GX1 C@^ B B B VO:o=@_X9.z+h.q+h@`+_#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t .Xx.]Or 8Xm#7X4+VO-O=XW@a.S@d+>.D A.XQ+^+|owOF.1#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t.r+].T@0O[@%X4+C@^+,oPoK &.9XU+-@aO&X,Ok.{ d+h+|@HOE#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#tX(ozoMOYX`.j#9.*X>XWXY &oJoD.8OJ.9OP -.So: $OMXC+h@~+JO{#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t@v.POf 7@VO[#7X1.H@a@yOJ#-o9#+OtOtOGoJXU.*XTO,.=+o+D e@,#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#tXAO .<+Lo`@>#6+VO-@y ##-#o )@{ / /# .8 # u 'orO,OMo'OsoN#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t.1o2.QX# a@=.* A.S@t+(#o /@C@M./ fX}X.OU@).)OyOIO2OC@..>#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#toV@5@@=+y+[O#tXV+QXRoZO$XB#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t@2 r#4XE `#q.0Xu+<#t#t#t#t#t#t#t q#t#tXmX[Oh+n#>#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#tXv@| mo{X7 =oh p#t#t#t#t#t#tOwO0#t#t#t@wooOX#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#2@joE FOLXP+5#t#t#t#t#t#t@J#t#t#t#tO.+$#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tX=o#o;+[#e+I#t#t#t#t#t#t+K#t#t#toa@r#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t@-oq >#&O[@z 9#t#t#t#t#t#t#t#t#t+l j#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tobO|#&XV.,O~#t#t#t#tX<#t#t#t#t b+v#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t s.5.Y@SoyoxXboL#5On 6#t#t#t#3O7o1#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tOVOmX/XlOT.@OZ.EX8Xr+}+Z l E@soI#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tX2o0 Nog ~OdXkOoO; 0@T.C@Go c #999999", " , c #E06565", " < c #D73838", " 1 c #979797", " 2 c #DBC6C6", " 3 c #9F0101", " 4 c #D21C1C", " 5 c #DFD7D7", " 6 c #CA3535", " 7 c #940000", " 8 c #DA5F5F", " 9 c #D85D5D", " 0 c #8D8D8D", " q c #800000", " w c #B31B1B", " e c #D02727", " r c #D83C3C", " t c #CF0F0F", " y c #C02B2B", " u c #C84040", " i c #D43838", " p c #A50000", " a c #7F7F7F", " s c #910000", " d c #DE5C5C", " f c #D52F2F", " g c #CC0202", " h c #7D7D7D", " j c #D94040", " k c #D01313", " l c #DCB6B6", " z c #ECE0E0", " x c #CE1111", " c c #777777", " v c #690000", " b c #DFDDDD", " n c #A20000", " m c #DF6060", " M c #D63333", " N c #CD0606", " B c #B72525", " V c #B52323", " C c #D02D2D", " Z c #E16F6F", " A c #D75858", " S c #676767", " D c #BE2F2F", " F c #636363", " G c #E4C4C4", " H c #E06464", " J c #D73737", " K c #CE0A0A", " L c #A10202", " P c #D53535", " I c #9F0000", " U c #C53939", " Y c #AC1010", " T c #D13131", " R c #5B5B5B", " E c #A80C0C", " W c #E1B7B7", " Q c #C42E2E", " ! c #DB5555", " ~ c #A40808", " ^ c #CF0E0E", " / c #4F4F4F", " ( c #BC2626", " ) c #DB6262", " _ c #9C0000", " ` c #4B4B4B", " ' c #DE5B5B", " ] c #D52E2E", " [ c #CC0101", " { c #D78C8C", " } c #474747", " | c #B21C1C", ". c #434343", ".. c #D85555", ".X c #E06A6A", ".o c #D88383", ".O c #DF8080", ".+ c #E1DEDE", ".@ c #F0F0F0", ".# c #D56969", ".$ c #D45151", ".% c #DB4E4E", ".& c #AC1616", ".* c #EEEEEE", ".= c #D13737", ".- c #ECECEC", ".; c #990000", ".: c #CE1D1D", ".> c #DF5F5F", "., c #D63232", ".< c #CD0505", ".1 c #DAC0C0", ".2 c #EAEAEA", ".3 c #E8E8E8", ".4 c #AB0B0B", ".5 c #DED1D1", ".6 c #850000", ".7 c #E6E6E6", ".8 c #E16E6E", ".9 c #E4E4E4", ".0 c #E2E2E2", ".q c #D9B5B5", ".w c #E0E0E0", ".e c #BC2C2C", ".r c #AA0000", ".t c #DEDEDE", ".y c #D03939", ".u c #D84E4E", ".i c #CE0909", ".p c #A10101", ".a c #B01313", ".s c #DCDCDC", ".d c #EEE7E7", ".f c #D01818", ".g c #CE1616", ".h c #A80B0B", ".j c #DD5656", ".k c #D83A3A", ".l c #CD0B0B", ".z c #A00303", ".x c #E9D8D8", ".c c #DD6363", ".v c #D34C4C", ".b c #171717", ".n c #C12020", ".m c #0D0000", ".M c #C6C6C6", ".N c #D52D2D", ".B c #CC0000", ".V c #D24141", ".C c #DA5656", ".Z c #E06969", ".A c #D65252", ".S c #E1DDDD", ".D c #DB4D4D", ".F c #D22020", ".G c #D24E4E", ".H c #AA1313", ".J c #DF5E5E", ".K c #CD0404", ".L c #CE4A4A", ".P c #010101", ".I c #DC7272", ".U c #B31F1F", ".Y c #DC5151", ".T c #D32424", ".R c #AD1919", ".E c #DFC7C7", ".W c #D23A3A", ".Q c #BA2929", ".! c #D15050", ".~ c #E06262", ".^ c #D73535", "./ c #A10000", ".( c #CE1515", ".) c #DD5555", "._ c #D42828", ".` c #FF0000", ".' c #D45656", ".] c #989898", ".[ c #CD0A0A", ".{ c #A00202", ".} c #CD3838", ".| c #9E0000", "X c #D46363", "X. c #DB6060", "XX c #DA4848", "Xo c #D11B1B", "XO c #DDBEBE", "X+ c #D14949", "X@ c #A90E0E", "X# c #C73232", "X$ c #DE5959", "X% c #A70C0C", "X& c #8C8C8C", "X* c #DD9D9D", "X= c #DBC9C9", "X- c #DB4C4C", "X; c #D21F1F", "X: c #AA1212", "X> c #DA9090", "X, c #808080", "X< c #D04B4B", "X1 c #DF5D5D", "X2 c #D63030", "X3 c #CD0303", "X4 c #E16C6C", "X5 c #DF6A6A", "X6 c #CD1010", "X7 c #E2E0E0", "X8 c #DC5050", "X9 c #747474", "X0 c #D35151", "Xq c #BA2828", "Xw c #D96464", "Xe c #CC0505", "Xr c #6E6E6E", "Xt c #D33030", "Xy c #D35E5E", "Xu c #D94343", "Xi c #686868", "Xp c #D65757", "Xa c #DD5454", "Xs c #D42727", "Xd c #A60707", "Xf c #D33D3D", "Xg c #DB5252", "Xh c #A40505", "Xj c #B31717", "Xk c #A20303", "Xl c #A00101", "Xz c #D11A1A", "Xx c #5A5A5A", "Xc c #DE5858", "Xv c #D52B2B", "Xb c #CF2525", "Xn c #AE1515", "Xm c #DFABAB", "XM c #D44E4E", "XN c #DC6363", "XB c #FFFFFF", "XV c #DB4B4B", "XC c #D21E1E", "XZ c #CF3232", "XA c #B72121", "XS c #DABDBD", "XD c #BE1E1E", "XF c #D83E3E", "XG c #DCCCCC", "XH c #424242", "XJ c #D75454", "XK c #DF6969", "XL c #CD0F0F", "XP c #D78282", "XI c #D43A3A", "XU c #DC4F4F", "XY c #EFEFEF", "XT c #A30000", "XR c #EDEDED", "XE c #EBEBEB", "XW c #D53131", "XQ c #E9E9E9", "X! c #8F0000", "X~ c #090000", "X^ c #D67777", "X/ c #B42121", "X( c #E7E7E7", "X) c #D94242", "X_ c #D01515", "X` c #E5E5E5", "X' c #B71A1A", "X] c #E3E3E3", "X[ c #DD5353", "X{ c #E1E1E1", "X} c #DFDFDF", "X| c #A20202", "o c #DDDDDD", "o. c #A00000", "oX c #D54B4B", "oo c #C31F1F", "oO c #DA4646", "o+ c #D11919", "o@ c #D95C5C", "o# c #C03333", "o$ c #DAA2A2", "o% c #D3D3D3", "o& c #A50808", "o* c #E06666", "o= c #D99797", "o- c #181818", "o; c #9D0000", "o: c #DB4A4A", "o> c #C7C7C7", "o, c #DDD6D6", "o< c #CC4545", "o1 c #D25858", "o2 c #E16A6A", "o3 c #D83D3D", "o4 c #C02C2C", "o5 c #DD6666", "o6 c #D32121", "o7 c #AD1616", "o8 c #DEDADA", "o9 c #CF1D1D", "o0 c #CC0303", "oq c #D67676", "ow c None", /* pixels */ "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowow./././ nowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowow nX/ 8XNXq nowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowX% Z._X;X4X@owowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowXT.L o.B.B .B.Bo1o o o .t.#.B.Bo: (o.owowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowow.p ).F.B $ 2o o .t.t.5XL.B O.CX|owowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowow.eXc.B.BX o o .t.tX}X}oq.B.B j y./owowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowXko5Xz.B.lXGo .t.tX}X}X} 5.(.B ^ !Xhowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowo.o#.Y.B.B ;o .t.tX}X}X}.w.w.o.B.B < Q./owowowowowowowowowowowowowow", "owowowowowowowowowowowowowow :XK O.BX6 =.t.t 1 h h.].wX{.So9.B.iXgo&owowowowowowowowowowowowowow", "owowowowowowowowowowowowow./ Uo:.B.BX^.t.tX}XH . X{X{.0X>.B.B fX#./owowowowowowowowowowowowow", "owowowowowowowowowowowowow ~X5 t.B.go,.tX}X} / /X{.0.0X7 e.B N.%.howowowowowowowowowowowowow", "owowowowowowowowowowowow n uXu.B.BXP.tX}X}.wXx R.0.0.0X]X*.B.BXs 6./owowowowowowowowowowowow", "owowowowowowowowowowowow E.X K.B.:o8X}X}.w.w S Xi.0.0X].9.9 T.BX3XX Yowowowowowowowowowowowow", "owowowowowowowowowowow no< r.B.B {X}X}.w.w.wX9 X9X]X].9.9X`Xm.B.B.F.}./owowowowowowowowowowow", "owowowowowowowowowowowX:.Z $.BXb bX}.w.w.wX{ a X,X].9.9X`X`.7Xf.B [X).aowowowowowowowowowowow", "owowowowowowowowowow./X<.^.B.Bo=X}.w.w.wX{X{X& 0.9.9X`X`.7.7 W.B.Bo+.y./owowowowowowowowowow", "owowowowowowowowowow.&o*.K.B CX}.w.w.wX{X{.0.] >.9X`X`.7.7X(X(oX.B.B.kXjowowowowowowowowowow", "owowowowowowowowow./X0 ].B.Bo$.w.w.wX{X{.0.0 % %X`X`.7.7X(X(.3 Go0.B k.W.powowowowowowowowow", "owowowowowowowowow | # g.B.=.w.w.wX{X{.0.0X].M F Fo>X`.7.7X(X(.3XQXQ A.B.B MX'o.owowowowowowowow", "owowowowowowowow./XpXs.B.B @.w.wX{X{.0.0X]X].9.Mo>X`.7.7X(X(.3XQXQ.2 X N.B ^XI Lowowowowowowowow", "owowowowowowowow V d [.B.V.w.wX{X{.0.0X]X].9Xr .PX9.7X(.3.3XQXQ.2.2XEXw.B.BXv ../owowowowowowow", "owowowowowowow.po@o6.B [ l.wX{X{.0.0X]X].9.9.b o-X(.3.3XQXQ.2.2XEXE.x.[.B.i iXkowowowowowowow", "owowowowowowow.Q.).B.B.v.wX{X{.0.0X]X].9.9X` ` }.3.3XQXQ.2.2XEXE.-.-.I.B.B.TXD nowowowowowow", "owowowowowowX|X.Xo.Bo0XOX{X{.0.0X]X].9.9X`X`o% c co%.3XQXQ.2.2XEXE.-.-XR z x.B N P :owowowowowow", "owowowowow./ DXU.B.B.'X{X{.0.0X]X].9.9X`X`.7X(X(.3.3XQXQ.2.2XEXE.-XRXR.*.*.O.B.BXC.n./owowowowow", "owowowowowXk.cX_.B N.EX{.0.0X]X].9.9X`X`.7X(X(.3.3XQXQ.2.2XEXE.-XRXR.*.*XY.d.f.BX3XWXdowowowowow", "owowowow 7o4X-.B.B C.+.0.0X]X].9.9X`X`.7X(X(.3.3XQXQ.2.2XEXE.-XRXR.*.*XYXY.@.u.B.BXzooo.owowowow", "owowowow.| A 4.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.KXto.owowowow", "owowowow _.$ f.<.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B g t +o.owowowow", "owowowow qo7XJ.~ , # m.JX1 'X$Xc.j.)X[.YX8XU.DXVo:XXoO *XuX) jXFo3 r.k < J.^ M.,X2 +.4 sowowowow", "owowowowow.6o; I 3.z.z.z.z.z.z.z.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{XlXlXl 3 I IX!owowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow" }; // --------------------------------------------------------------------- // end of Tango icons // --------------------------------------------------------------------- fldigi-3.21.80/src/misc/status.cxx0000664000175000017500000005353412313147652013655 00000000000000// ---------------------------------------------------------------------------- // status.cxx // // Copyright (C) 2007-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "gettext.h" #include "main.h" #include "globals.h" #include "status.h" #include "configuration.h" #include "confdialog.h" #include "fl_digi.h" #include "waterfall.h" #include "modem.h" #include "psk.h" #include "cw.h" #include "mfsk.h" #include "rtty.h" #include "olivia.h" #include "dominoex.h" #include "feld.h" #include "throb.h" #include "wwv.h" #include "analysis.h" #include "rigsupport.h" #include "Viewer.h" #include "lgbook.h" #include "logsupport.h" #include "qso_db.h" #include "misc.h" #define STATUS_FILENAME "status" status progStatus = { MODE_PSK31, // trx_mode lastmode; mode_info[MODE_PSK31].sname, // lastmode_name 50, // int mainX; 50, // int mainY; WNOM, // int mainW; HNOM, // int mainH; false, // bool WF_UI; false, // bool NO_RIGLOG; false, // bool Rig_Log_UI; false, // bool Rig_Contest_UI; false, // bool DOCKEDSCOPE; 50, // int RxTextHeight; WNOM / 2, // int tiled_group_x; false, // bool show_channels; 50, // int rigX; 50, // int rigY; 560, // int rigW 80, // int rigH 1000, // int carrier; 0, // int noCATfreq; "USB", // string noCATmode; "3000", // string noCATwidth; 1, // int mag; 0, // int offset; NORMAL, // WFdisp::WFspeed -20, // reflevel -70, // ampspan 30, // uint VIEWERnchars 50, // uint VIEWERxpos 50, // uint VIEWERypos 200, // uint VIEWERwidth 400, // uint VIEDWERheight 3.0, // double VIEWER_psksquelch -6.0, // double VIEWER_rttysquelch false, // bool VIEWERvisible 100, // int tile_x 200, // int tile_w; 50, // int tile_y; 100, // int tile_h; false, // bool LOGenabled 5.0, // double sldrSquelchValue true, // bool afconoff true, // bool sqlonoff 1.0, // double RcvMixer; 1.0, // double XmtMixer; 50, // int scopeX; 50, // int scopeY; false, // bool scopeVisible; 172, // int scopeW; 172, // int scopeH; -1, // int repeatMacro; 0, // float repeatIdleTime; 0, // int timer 0, // int timerMacro "macros.mdf", // string LastMacroFile; 0, // int n_rsids false, // bool spot_recv false, // bool spot_log false, // bool contest false, // bool quick_entry true, // bool rx_scroll_hints; true, // bool rx_word_wrap true, // bool tx_word_wrap 20, // int logbook_x; 20, // int logbook_y; 590, // int logbook_w; 490, // int logbook_h; false, // bool logbook_reverse; 85, // int logbook_browser_col_0; 47, // int logbook_browser_col_1; 100, // int logbook_browser_col_2; 110, // int logbook_browser_col_3; 120, // int logbook_browser_col_4; 103, // int logbook_browser_col_5; progdefaults.contestiatones, progdefaults.contestiabw, progdefaults.contestiasmargin, progdefaults.contestiasinteg, progdefaults.contestia8bit, progdefaults.oliviatones, progdefaults.oliviabw, progdefaults.oliviasmargin, progdefaults.oliviasinteg, progdefaults.olivia8bit, progdefaults.rtty_shift, progdefaults.rtty_custom_shift, progdefaults.rtty_baud, progdefaults.rtty_bits, progdefaults.rtty_parity, progdefaults.rtty_stop, progdefaults.rtty_reverse, progdefaults.rtty_crcrlf, progdefaults.rtty_autocrlf, progdefaults.rtty_autocount, progdefaults.rtty_afcspeed, false, // bool rtty_filter_changed progdefaults.useFSKkeyline, progdefaults.useFSKkeylineDTR, progdefaults.FSKisLSB, progdefaults.useUART, progdefaults.PreferXhairScope, progdefaults.PseudoFSK, progdefaults.UOSrx, progdefaults.UOStx, "CQ", // string browser_search; false // bool bLastStateRead; }; void status::saveLastState() { int mX = fl_digi_main->x(); int mY = fl_digi_main->y(); if (mX >= 0 && mX >= 0) { mainX = mX; mainY = mY; } mainW = fl_digi_main->w(); mainH = fl_digi_main->h(); carrier = wf->Carrier(); mag = wf->Mag(); offset = wf->Offset(); speed = wf->Speed(); reflevel = progdefaults.wfRefLevel; ampspan = progdefaults.wfAmpSpan; logbook_x = dlgLogbook->x(); logbook_y = dlgLogbook->y(); logbook_w = dlgLogbook->w(); logbook_h = dlgLogbook->h(); logbook_reverse = cQsoDb::reverse; logbook_col_0 = wBrowser->columnWidth(0); logbook_col_1 = wBrowser->columnWidth(1); logbook_col_2 = wBrowser->columnWidth(2); logbook_col_3 = wBrowser->columnWidth(3); logbook_col_4 = wBrowser->columnWidth(4); logbook_col_5 = wBrowser->columnWidth(5); if (!bWF_only) { RxTextHeight = (ReceiveText->h() * 100) / text_panel->h();//VTgroup->h(); quick_entry = ReceiveText->get_quick_entry(); rx_scroll_hints = ReceiveText->get_scroll_hints(); rx_word_wrap = ReceiveText->get_word_wrap(); tx_word_wrap = TransmitText->get_word_wrap(); tile_w = text_panel->w(); tile_y = ReceiveText->h(); tile_h = text_panel->h(); if (text_panel->w() != ReceiveText->w()) tile_x = mvgroup->w(); } VIEWERvisible = dlgViewer->visible(); VIEWERnchars = brwsViewer->numchars(); if (VIEWERvisible) { VIEWERxpos = dlgViewer->x(); VIEWERypos = dlgViewer->y(); VIEWERwidth = dlgViewer->w(); VIEWERheight = dlgViewer->h(); } scopeVisible = false; if (scopeview && scopeview->visible()) { scopeVisible = true; scopeX = scopeview->x(); scopeY = scopeview->y(); scopeW = scopeview->w(); scopeH = scopeview->h(); } contestiatones = progdefaults.contestiatones; contestiabw = progdefaults.contestiabw; contestiamargin = progdefaults.contestiasmargin; contestiainteg = progdefaults.contestiasinteg; contestia8bit = progdefaults.contestia8bit; oliviatones = progdefaults.oliviatones; oliviabw = progdefaults.oliviabw; oliviamargin = progdefaults.oliviasmargin; oliviainteg = progdefaults.oliviasinteg; olivia8bit = progdefaults.olivia8bit; rtty_shift = progdefaults.rtty_shift; rtty_custom_shift = progdefaults.rtty_custom_shift; rtty_baud = progdefaults.rtty_baud; rtty_bits = progdefaults.rtty_bits; rtty_parity = progdefaults.rtty_parity; rtty_stop = progdefaults.rtty_stop; rtty_reverse = progdefaults.rtty_reverse; rtty_crcrlf = progdefaults.rtty_crcrlf; rtty_autocrlf = progdefaults.rtty_autocrlf; rtty_autocount = progdefaults.rtty_autocount; rtty_afcspeed = progdefaults.rtty_afcspeed; useFSKkeyline = progdefaults.useFSKkeyline; useFSKkeylineDTR = progdefaults.useFSKkeylineDTR; FSKisLSB = progdefaults.FSKisLSB; useUART = progdefaults.useUART; PreferXhairScope = progdefaults.PreferXhairScope; PseudoFSK = progdefaults.PseudoFSK; UOSrx = progdefaults.UOSrx; UOStx = progdefaults.UOStx; Fl_Preferences spref(HomeDir.c_str(), "w1hkj.com", PACKAGE_TARNAME); spref.set("version", PACKAGE_VERSION); spref.set("dual_channels", "YES"); spref.set("mode_name", mode_info[lastmode].sname); spref.set("squelch_enabled", sqlonoff); spref.set("squelch_level", sldrSquelchValue); spref.set("afc_enabled", afconoff); spref.set("rx_mixer_level", RcvMixer); spref.set("tx_mixer_level", XmtMixer); spref.set("log_enabled", LOGenabled); spref.set("wf_carrier", carrier); spref.set("wf_mag", mag); spref.set("wf_offset", offset); spref.set("wf_speed", speed); spref.set("wf_reflevel", reflevel); spref.set("wf_ampspan", ampspan); spref.set("noCATfreq", noCATfreq); spref.set("noCATmode", noCATmode.c_str()); spref.set("noCATwidth", noCATwidth.c_str()); spref.set("main_x", mainX); spref.set("main_y", mainY); spref.set("main_w", mainW); if (!bWF_only) { spref.set("main_h", mainH); spref.set("rx_text_height", RxTextHeight); spref.set("tiled_group_x", tiled_group_x); spref.set("show_channels", show_channels); } spref.set("wf_ui", WF_UI); spref.set("riglog_ui", Rig_Log_UI); spref.set("rigcontest_ui", Rig_Contest_UI); spref.set("noriglog", NO_RIGLOG); spref.set("docked_scope", DOCKEDSCOPE); spref.set("rigctl_x", rigX); spref.set("rigctl_y", rigY); spref.set("rigctl_w", rigW); spref.set("rigctl_h", rigH); spref.set("viewer_visible", VIEWERvisible); spref.set("viewer_x", static_cast(VIEWERxpos)); spref.set("viewer_y", static_cast(VIEWERypos)); spref.set("viewer_w", static_cast(VIEWERwidth)); spref.set("viewer_h", static_cast(VIEWERheight)); spref.set("viewer_psksq", VIEWER_psksquelch); spref.set("viewer_rttysq", VIEWER_rttysquelch); spref.set("viewer_nchars", static_cast(VIEWERnchars)); spref.set("tile_x", tile_x); spref.set("tile_y", tile_y); spref.set("tile_w", tile_w); spref.set("tile_h", tile_h); spref.set("scope_visible", scopeVisible); spref.set("scope_x", scopeX); spref.set("scope_y", scopeY); spref.set("scope_w", scopeW); spref.set("scope_h", scopeH); spref.set("last_macro_file", LastMacroFile.c_str()); spref.set("spot_recv", spot_recv); spref.set("spot_log", spot_recv); spref.set("contest", contest); spref.set("quick_entry", quick_entry); spref.set("rx_scroll_hints", rx_scroll_hints); spref.set("rx_word_wrap", rx_word_wrap); spref.set("tx_word_wrap", tx_word_wrap); spref.set("logbook_x", logbook_x); spref.set("logbook_y", logbook_y); spref.set("logbook_w", logbook_w); spref.set("logbook_h", logbook_h); spref.set("logbook_reverse", logbook_reverse); spref.set("logbook_col_0", logbook_col_0); spref.set("logbook_col_1", logbook_col_1); spref.set("logbook_col_2", logbook_col_2); spref.set("logbook_col_3", logbook_col_3); spref.set("logbook_col_4", logbook_col_4); spref.set("logbook_col_5", logbook_col_5); spref.set("contestiatones", contestiatones); spref.set("contestiabw", contestiabw); spref.set("contestiamargin", contestiamargin); spref.set("contestiainteg", contestiainteg); spref.set("contestia8bit", contestia8bit); spref.set("oliviaiatones", oliviatones); spref.set("oliviaiabw", oliviabw); spref.set("oliviaiamargin", oliviamargin); spref.set("oliviaiainteg", oliviainteg); spref.set("oliviaia8bit", olivia8bit); spref.set("rtty_shift", rtty_shift); spref.set("rtty_custom_shift", rtty_custom_shift); spref.set("rtty_baud", rtty_baud); spref.set("rtty_bits", rtty_bits); spref.set("rtty_parity", rtty_parity); spref.set("rtty_stop", rtty_stop); spref.set("rtty_reverse", rtty_reverse); spref.set("rtty_crcrlf", rtty_crcrlf); spref.set("rtty_autocrlf", rtty_autocrlf); spref.set("rtty_autocount", rtty_autocount); spref.set("rtty_afcspeed", rtty_afcspeed); spref.set("rtty_useFSKkeyline", useFSKkeyline); spref.set("rtty_useFSK_DTR", useFSKkeylineDTR); spref.set("rtty_FSKisLSB", FSKisLSB); spref.set("rtty_useUART", useUART); spref.set("preferxhairscope", PreferXhairScope); spref.set("psaudofsk", PseudoFSK); spref.set("uosrx", UOSrx); spref.set("uostx", UOStx); spref.set("browser_search", browser_search.c_str()); // spref.set("xml_logbook", xml_logbook); } void status::loadLastState() { Fl_Preferences spref(HomeDir.c_str(), "w1hkj.com", PACKAGE_TARNAME); int i; char strbuff[1000]; char version[64]; version[sizeof(version)-1] = '\0'; // Skip loading the rest of the status variables if we didn't read a // version name/value pair; or this is not a file that supports dual // channel browsers. bLastStateRead = spref.get("version", version, "", sizeof(version)-1); if (!bLastStateRead) return; bLastStateRead = spref.get("dual_channels", version, "", sizeof(version) - 1); if (!bLastStateRead) return; memset(strbuff, 0, sizeof(strbuff)); spref.get("mode_name", strbuff, mode_info[MODE_PSK31].sname, sizeof(strbuff) - 1); mode_name = strbuff; lastmode = MODE_PSK31; for (i = 0; i < NUM_MODES;i++) { if (mode_name == mode_info[i].sname) { lastmode = (trx_mode) i; break; } } spref.get("squelch_enabled", i, sqlonoff); sqlonoff = i; spref.get("squelch_level", sldrSquelchValue, sldrSquelchValue); spref.get("afc_enabled", i, afconoff); afconoff = i; spref.get("rx_mixer_level", RcvMixer, RcvMixer); spref.get("tx_mixer_level", XmtMixer, XmtMixer); spref.get("rx_text_height", RxTextHeight, RxTextHeight); spref.get("tiled_group_x", tiled_group_x, tiled_group_x); spref.get("show_channels", i, show_channels); show_channels = i; spref.get("log_enabled", i, LOGenabled); LOGenabled = i; spref.get("wf_carrier", carrier, carrier); spref.get("wf_mag", mag, mag); spref.get("wf_offset", offset, offset); spref.get("wf_speed", speed, speed); spref.get("wf_reflevel", reflevel, reflevel); progdefaults.wfRefLevel = reflevel; spref.get("wf_ampspan", ampspan, ampspan); progdefaults.wfAmpSpan = ampspan; spref.get("noCATfreq", noCATfreq, noCATfreq); memset(strbuff, 0, sizeof(strbuff)); spref.get("noCATmode", strbuff, "USB", sizeof(strbuff) - 1); noCATmode = strbuff; memset(strbuff, 0, sizeof(strbuff)); spref.get("noCATwidth", strbuff, "3000", sizeof(strbuff) - 1); noCATwidth = strbuff; spref.get("main_x", mainX, mainX); spref.get("main_y", mainY, mainY); spref.get("main_w", mainW, mainW); spref.get("main_h", mainH, mainH); spref.get("wf_ui", i, WF_UI); WF_UI = i; spref.get("riglog_ui", i, Rig_Log_UI); Rig_Log_UI = i; spref.get("rigcontest_ui", i, Rig_Contest_UI); Rig_Contest_UI = i; spref.get("noriglog", i, NO_RIGLOG); NO_RIGLOG = i; spref.get("docked_scope", i, DOCKEDSCOPE); DOCKEDSCOPE = i; spref.get("rigctl_x", rigX, rigX); spref.get("rigctl_y", rigY, rigY); spref.get("rigctl_w", rigW, rigW); spref.get("rigctl_h", rigH, rigH); spref.get("viewer_visible", i, VIEWERvisible); VIEWERvisible = i; spref.get("viewer_x", i, VIEWERxpos); VIEWERxpos = i; spref.get("viewer_y", i, VIEWERypos); VIEWERypos = i; spref.get("viewer_w", i, VIEWERwidth); VIEWERwidth = i; spref.get("viewer_h", i, VIEWERheight); VIEWERheight = i; spref.get("viewer_psksq", VIEWER_psksquelch, VIEWER_psksquelch); spref.get("viewer_rttysq", VIEWER_rttysquelch, VIEWER_rttysquelch); spref.get("viewer_nchars", i, VIEWERnchars); VIEWERnchars = i; spref.get("tile_x", tile_x, tile_x); spref.get("tile_y", tile_y, tile_y); spref.get("tile_w", tile_w, tile_w); spref.get("tile_h", tile_h, tile_h); spref.get("scope_visible", i, scopeVisible); scopeVisible = i; spref.get("scope_x", scopeX, scopeX); spref.get("scope_y", scopeY, scopeY); spref.get("scope_w", scopeW, scopeW); spref.get("scope_h", scopeH, scopeH); memset(strbuff, 0, sizeof(strbuff)); spref.get("last_macro_file", strbuff, "macros.mdf", sizeof(strbuff) - 1); LastMacroFile = strbuff; spref.get("spot_recv", i, spot_recv); spot_recv = i; spref.get("spot_log", i, spot_log); spot_log = i; spref.get("contest", i, contest); contest = i; spref.get("quick_entry", i, quick_entry); quick_entry = i; spref.get("rx_scroll_hints", i, rx_scroll_hints); rx_scroll_hints = i; spref.get("rx_word_wrap", i, rx_word_wrap); rx_word_wrap = i; spref.get("tx_word_wrap", i, tx_word_wrap); tx_word_wrap = i; spref.get("logbook_x", logbook_x, logbook_x); spref.get("logbook_y", logbook_y, logbook_y); spref.get("logbook_w", logbook_w, logbook_w); spref.get("logbook_h", logbook_h, logbook_h); spref.get("logbook_reverse", i, logbook_reverse); logbook_reverse = i; spref.get("logbook_col_0", logbook_col_0, logbook_col_0); spref.get("logbook_col_1", logbook_col_1, logbook_col_1); spref.get("logbook_col_2", logbook_col_2, logbook_col_2); spref.get("logbook_col_3", logbook_col_3, logbook_col_3); spref.get("logbook_col_4", logbook_col_4, logbook_col_4); spref.get("logbook_col_5", logbook_col_5, logbook_col_5); spref.get("contestiatones", contestiatones, contestiatones); spref.get("contestiabw", contestiabw, contestiabw); spref.get("contestiamargin", contestiamargin, contestiamargin); spref.get("contestiainteg", contestiainteg, contestiainteg); spref.get("contestia8bit", i, contestia8bit); contestia8bit = i; spref.get("oliviaiatones", oliviatones, oliviatones); spref.get("oliviaiabw", oliviabw, oliviabw); spref.get("oliviaiamargin", oliviamargin, oliviamargin); spref.get("oliviaiainteg", oliviainteg, oliviainteg); spref.get("oliviaia8bit", i, olivia8bit); olivia8bit = i; spref.get("rtty_shift", rtty_shift, rtty_shift); spref.get("rtty_custom_shift", rtty_custom_shift, rtty_custom_shift); spref.get("rtty_baud", rtty_baud, rtty_baud); spref.get("rtty_bits", rtty_bits, rtty_bits); spref.get("rtty_parity", rtty_parity, rtty_parity); spref.get("rtty_stop", rtty_stop, rtty_stop); spref.get("rtty_reverse", i, rtty_reverse); rtty_reverse = i; spref.get("rtty_crcrlf", i, rtty_crcrlf); rtty_crcrlf = i; spref.get("rtty_autocrlf", i, rtty_autocrlf); rtty_autocrlf = i; spref.get("rtty_autocount", rtty_autocount, rtty_autocount); spref.get("rtty_afcspeed", rtty_afcspeed, rtty_afcspeed); spref.get("rtty_useFSKkeyline", i, useFSKkeyline); useFSKkeyline = i; spref.get("rtty_useFSK_DTR", i, useFSKkeylineDTR); useFSKkeylineDTR = i; spref.get("rtty_FSKisLSB", i, FSKisLSB); FSKisLSB = i; spref.get("rtty_useUART", i, useUART); useUART = i; spref.get("preferxhairscope", i, PreferXhairScope); PreferXhairScope = i; spref.get("psaudofsk", i, PseudoFSK); PseudoFSK = i; spref.get("uosrx", i, UOSrx); UOSrx = i; spref.get("uostx", i, UOStx); UOStx = i; memset(strbuff, 0, sizeof(strbuff)); spref.get("browser_search", strbuff, browser_search.c_str(), sizeof(strbuff) - 1); browser_search = strbuff; seek_re.recompile(browser_search.c_str()); // spref.get("xml_logbook", i, xml_logbook); xml_logbook = i; } void status::initLastState() { if (!bLastStateRead) loadLastState(); // RTTY if (lastmode == MODE_RTTY ) { progdefaults.rtty_shift = rtty_shift; selShift->index(progdefaults.rtty_shift + 1); if (rtty_shift == selShift->lsize() - 1) { selCustomShift->deactivate(); } else { // Custom shift selCustomShift->activate(); } selBaud->index((progdefaults.rtty_baud = rtty_baud) + 1); selBits->index((progdefaults.rtty_bits = rtty_bits) + 1); selParity->index((progdefaults.rtty_parity = rtty_parity) + 1); selStopBits->index((progdefaults.rtty_stop = rtty_stop) + 1); btnCRCRLF->value(progdefaults.rtty_crcrlf = rtty_crcrlf); btnAUTOCRLF->value(progdefaults.rtty_autocrlf = rtty_autocrlf); cntrAUTOCRLF->value(progdefaults.rtty_autocount = rtty_autocount); chkPseudoFSK->value(progdefaults.PseudoFSK = PseudoFSK); chkUOSrx->value(progdefaults.UOSrx = UOSrx); chkUOStx->value(progdefaults.UOStx = UOStx); // chkXagc->value(progdefaults.Xagc = Xagc); i_listbox_rtty_afc_speed->index(progdefaults.rtty_afcspeed = rtty_afcspeed); btnPreferXhairScope->value(progdefaults.PreferXhairScope = PreferXhairScope); if (mvsquelch) { mvsquelch->range(-12.0, 6.0); mvsquelch->value(VIEWER_rttysquelch); } if (sldrViewerSquelch) { sldrViewerSquelch->range(-12.0, 6.0); sldrViewerSquelch->value(VIEWER_rttysquelch); } } if (lastmode >= MODE_PSK_FIRST && lastmode <= MODE_PSK_LAST) { if (mvsquelch) { mvsquelch->range(-3.0, 6.0); mvsquelch->value(progStatus.VIEWER_psksquelch); } if (sldrViewerSquelch) { sldrViewerSquelch->range(-3.0, 6.0); sldrViewerSquelch->value(progStatus.VIEWER_psksquelch); } } // OLIVIA if (lastmode == MODE_OLIVIA) { i_listbox_olivia_tones->index(progdefaults.oliviatones = oliviatones); i_listbox_olivia_bandwidth->index(progdefaults.oliviabw = oliviabw); cntOlivia_smargin->value(progdefaults.oliviasmargin = oliviamargin); cntOlivia_sinteg->value(progdefaults.oliviasinteg = oliviainteg); btnOlivia_8bit->value(progdefaults.olivia8bit = olivia8bit); } // CONTESTIA if (lastmode == MODE_CONTESTIA) { i_listbox_contestia_tones->index(progdefaults.contestiatones = contestiatones); i_listbox_contestia_bandwidth->index(progdefaults.contestiabw = contestiabw); cntContestia_smargin->value(progdefaults.contestiasmargin = contestiamargin); cntContestia_sinteg->value(progdefaults.contestiasinteg = contestiainteg); btnContestia_8bit->value(progdefaults.contestia8bit = contestia8bit); } init_modem_sync(lastmode); wf->opmode(); wf->Mag(mag); wf->Offset(offset); wf->Speed(speed); wf->setRefLevel(); wf->setAmpSpan(); btnAFC->value(afconoff); btnSQL->value(sqlonoff); sldrSquelch->value(sldrSquelchValue); valRcvMixer->value(RcvMixer * 100.0); valXmtMixer->value(XmtMixer * 100.0); if (mainX > Fl::w()) mainX = 20; if (mainY > Fl::h()) mainY = 20; if (mainW < WMIN || mainW > Fl::w()) mainW = MAX(WMIN, Fl::w() / 2); if (mainH < HMIN || mainH > Fl::h()) mainH = MAX(HMIN, Fl::h() / 2); if (bWF_only) fl_digi_main->resize(mainX, mainY, mainW, Hmenu + Hwfall + Hstatus + 4); else { fl_digi_main->resize(mainX, mainY, mainW, mainH); set_macroLabels(); UI_select(); } if (VIEWERvisible) openViewer(); if (scopeview) { scopeview->resize(scopeX, scopeY, scopeW, scopeH); if (scopeVisible == true) scopeview->show(); } cQsoDb::reverse = logbook_reverse; if (cQsoDb::reverse) { qsodb.SortByDate(progdefaults.sort_date_time_off); loadBrowser(); } dlgLogbook->resize(logbook_x, logbook_y, logbook_w, logbook_h); wBrowser->columnWidth(0, logbook_col_0); wBrowser->columnWidth(1, logbook_col_1); wBrowser->columnWidth(2, logbook_col_2); wBrowser->columnWidth(3, logbook_col_3); wBrowser->columnWidth(4, logbook_col_4); wBrowser->columnWidth(5, logbook_col_5); ReceiveText->set_quick_entry(quick_entry); ReceiveText->set_scroll_hints(rx_scroll_hints); ReceiveText->set_word_wrap(rx_word_wrap, true); TransmitText->set_word_wrap(tx_word_wrap, true); // set_server_label(xml_logbook); } fldigi-3.21.80/src/misc/strutil.cxx0000664000175000017500000001423412313064025014022 00000000000000// ---------------------------------------------------------------------------- // strutil.cxx // // Copyright (C) 2009-2012 // Stelios Bounanos, M0GLD // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include "re.h" #include "strutil.h" using namespace std; vector split(const char* re_str, const char* str, unsigned max_split) { vector v; size_t n = strlen(re_str); string s; s.reserve(n + 2); s.append(1, '(').append(re_str, n).append(1, ')'); fre_t re(s.c_str(), REG_EXTENDED); bool ignore_trailing_empty = false; if (max_split == 0) { max_split = UINT_MAX; ignore_trailing_empty = true; } s = str; const vector& sub = re.suboff(); while (re.match(s.c_str())) { if (unlikely(sub.empty() || ((max_split != UINT_MAX) && --max_split == 0))) break; else { s[sub[0].rm_so] = '\0'; v.push_back(s.c_str()); s.erase(0, sub[0].rm_eo); } } if (!(ignore_trailing_empty && s.empty())) v.push_back(s); return v; } /// Builds a string out of a printf-style formatted vararg list. string strformat( const char * fmt, ... ) { static const int sz_buf = 512 ; char buf_usual[sz_buf]; va_list ap; va_start(ap, fmt); int res = vsnprintf( buf_usual, sz_buf, fmt, ap); va_end(ap); if( res < 0 ) throw runtime_error(__FUNCTION__); if( res < sz_buf ) return buf_usual ; string str( res, ' ' ); va_start(ap, fmt); res = vsnprintf( &str[0], res + 1, fmt, ap); va_end(ap); if( res < 0 ) throw runtime_error(__FUNCTION__); return str ; } /// Removes leading spaces and tabs. static std::string & strtriml(std::string &str) { str.erase(str.begin(), std::find_if(str.begin(), str.end(), std::not1(std::ptr_fun(std::isspace)))); return str; } /// Removes trailing spaces and tabs. static std::string & strtrimr(std::string &str) { str.erase(std::find_if(str.rbegin(), str.rend(), std::not1(std::ptr_fun(std::isspace))).base(), str.end()); return str; } /// Removes leading trailing spaces and tabs. void strtrim(std::string &str) { strtriml(strtrimr(str)); } void strcapitalize(std::string &str) { bool isStart = true ; for( size_t i = 0; i < str.size(); ++i ) { const char tmpC = str[i]; if( isalpha( tmpC ) ) { if( isStart ) { str[ i ] = toupper( tmpC ); isStart = false ; } else { str[ i ] = tolower( tmpC ); } } else { isStart = true ; } } } std::string strreplace( const std::string & inp, const std::string & from, const std::string & to ) { size_t from_sz=from.size(); std::string tmp ; for( size_t old_curr = 0 ; ; ) { size_t new_curr = inp.find( from, old_curr ); if( new_curr == std::string::npos ) { tmp.append( inp, old_curr, std::string::npos ); break ; } else { tmp.append( inp, old_curr, new_curr - old_curr ); tmp.append( to ); old_curr = new_curr + from_sz ; } } return tmp ; } /// Edit distance. Not the fastest implementation. size_t levenshtein(const string & source, const string & target) { const size_t n = source.size(); const size_t m = target.size(); if (n == 0) return m; if (m == 0) return n; typedef std::vector< std::vector > Tmatrix; Tmatrix matrix(n+1); for (size_t i = 0; i <= n; i++) { matrix[i].resize(m+1); } for (size_t i = 0; i <= n; i++) { matrix[i][0]=i; } for (size_t j = 0; j <= m; j++) { matrix[0][j]=j; } for (size_t i = 1; i <= n; i++) { char s_i = source[i-1]; for (size_t j = 1; j <= m; j++) { char t_j = target[j-1]; size_t cost = (s_i == t_j) ? 0 : 1 ; size_t above = matrix[i-1][j]; size_t left = matrix[i][j-1]; size_t diag = matrix[i-1][j-1]; size_t cell = std::min( above + 1, std::min(left + 1, diag + cost)); // Step 6A: Cover transposition, in addition to deletion, // insertion and substitution. This step is taken from: // Berghel, Hal ; Roach, David : "An Extension of Ukkonen's // Enhanced Dynamic Programming ASM Algorithm" // (http://www.acm.org/~hlb/publications/asm/asm.html) if (i>2 && j>2) { size_t trans=matrix[i-2][j-2]+1; if (source[i-2]!=t_j) trans++; if (s_i!=target[j-2]) trans++; if (cell>trans) cell=trans; } matrix[i][j]=cell; } } return matrix[n][m]; } /// Converts a string to uppercase. string uppercase( const string & str ) { string resu ; for( size_t i = 0 ; i < str.size(); ++i ) { resu += static_cast( toupper( str[i] ) ); } return resu ; } // ---------------------------------------------------------------------------- /// Just reads all chars until the delimiter. bool read_until_delim( char delim, std::istream & istrm ) { istrm.ignore ( std::numeric_limits::max(), delim ); if(istrm.eof()) return true ; return istrm.bad() ? false : true ; } /// Reads a char up to the given delimiter, or returns the default value if there is none. bool read_until_delim( char delim, std::istream & istrm, char & ref, const char dflt ) { if(istrm.eof()) { ref = dflt ; return true ; } ref = istrm.get(); if( istrm.bad() ) return false; if( ref == delim ) { ref = dflt ; return true ; } char tmpc = istrm.get(); if( istrm.eof() ) return true; if( tmpc == delim ) return true ; if( tmpc == '\n' ) return true ; if( tmpc == '\r' ) return true ; return false; } fldigi-3.21.80/src/misc/debug.cxx0000664000175000017500000001601012313064025013374 00000000000000// ---------------------------------------------------------------------------- // debug.cxx // // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "debug.h" #include "timeops.h" #include "icons.h" #include "gettext.h" #include "threads.h" #ifndef FLARQ_VERSION # include "fl_digi.h" #endif static pthread_mutex_t debug_mutex = PTHREAD_MUTEX_INITIALIZER; extern Fl_Double_Window *fl_digi_main; extern void update_main_title(); using namespace std; #define MAX_LINES 65536 static FILE* wfile = 0; static FILE* rfile = 0; static size_t nlines = 0; static int rfd; static bool tty; static Fl_Double_Window* window; //static FTextView* text; static Fl_Browser* btext; static string dbg_buffer; static string linebuf; debug* debug::inst = 0; debug::level_e debug::level = debug::INFO_LEVEL; uint32_t debug::mask = ~0u; bool debug_pskmail = false; bool debug_audio = false; static const char* prefix[] = { _("Quiet"), _("Error"), _("Warning"), _("Info"), _("Verbose"), _("Debug") }; static void slider_cb(Fl_Widget* w, void*); static void src_menu_cb(Fl_Widget* w, void*); static void clear_cb(Fl_Widget *w, void*); Fl_Menu_Item src_menu[] = { { _("ARQ control"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("Audio"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("Modem"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("Rig control"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("RPC"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("Spotter"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE | FL_MENU_DIVIDER }, { _("Other"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { 0 } }; #include void debug::rotate_log(const char* filename) { const int n = 5; // rename existing log files to keep up to 5 old versions ostringstream oldfn, newfn; ostringstream::streampos p; oldfn << filename << '.'; newfn << filename << '.'; p = oldfn.tellp(); for (int i = n - 1; i > 0; i--) { oldfn.seekp(p); newfn.seekp(p); oldfn << i; newfn << i + 1; rename(oldfn.str().c_str(), newfn.str().c_str()); } rename(filename, oldfn.str().c_str()); } void debug::start(const char* filename) { if (debug::inst) return; rotate_log(filename); inst = new debug(filename); window = new Fl_Double_Window(600, 200, _("Event log")); window->xclass(PACKAGE_TARNAME); int pad = 2; Fl_Menu_Button* button = new Fl_Menu_Button(pad, pad, 128, 20, _("Log sources")); button->menu(src_menu); button->callback(src_menu_cb); Fl_Slider* slider = new Fl_Slider(button->x() + button->w() + pad, pad, 128, 20, prefix[level]); slider->tooltip(_("Change log level")); slider->align(FL_ALIGN_RIGHT); slider->type(FL_HOR_NICE_SLIDER); slider->range(0.0, LOG_NLEVELS - 1); slider->step(1.0); slider->value(level); slider->callback(slider_cb); Fl_Button* clearbtn = new Fl_Button(window->w() - 64, pad, 60, 20, "clear"); clearbtn->callback(clear_cb); btext = new Fl_Browser(pad, slider->h()+pad, window->w()-2*pad, window->h()-slider->h()-2*pad, 0); btext->textfont(FL_COURIER); btext->textsize(14); window->resizable(btext); dbg_buffer.clear(); window->end(); } void debug::stop(void) { guard_lock debug_lock(&debug_mutex); if (window) { window->hide(); delete window; } if (inst) { delete inst; inst = 0; } } static char fmt[1024]; void debug::log(level_e level, const char* func, const char* srcf, int line, const char* format, ...) { guard_lock debug_lock(&debug_mutex); if (!inst) return; if (unlikely(debug::level == DEBUG_LEVEL) || debug_pskmail || debug_audio) { time_t t = time(NULL); struct tm stm; (void)localtime_r(&t, &stm); snprintf(fmt, sizeof(fmt), "%c: [%02d:%02d:%02d] %s:%d: %s\n", *prefix[level], stm.tm_hour, stm.tm_min, stm.tm_sec, srcf, line, format); } else snprintf(fmt, sizeof(fmt), "%c: %s: %s\n", *prefix[level], func, format); va_list args; va_start(args, format); intptr_t nw = vfprintf(wfile, fmt, args); va_end(args); if (tty) { if (level <= DEBUG_LEVEL && level > QUIET_LEVEL) { va_start(args, format); vfprintf(stderr, fmt, args); va_end(args); } } #ifdef __MINGW32__ fflush(wfile); #endif Fl::awake(sync_text, (void*)nw); } void debug::elog(const char* func, const char* srcf, int line, const char* text) { log(ERROR_LEVEL, func, srcf, line, "%s: %s", text, strerror(errno)); } void debug::show(void) { window->show(); } static char buf[BUFSIZ+1]; void debug::sync_text(void* arg) { intptr_t toread = (intptr_t)arg; size_t block = MIN((size_t)toread, sizeof(buf) - 1); ssize_t n; while (toread > 0) { if ((n = read(rfd, buf, block)) <= 0) break; if (unlikely(++nlines > MAX_LINES)) { btext->clear(); nlines = 0; } buf[n] = '\0'; linebuf = buf; if (linebuf[linebuf.length() - 1] != '\n') linebuf += '\n'; size_t p1 = 0, p2 = linebuf.find("\n"); while( p2 != string::npos) { btext->insert(1, linebuf.substr(p1, p2 - p1).c_str()); dbg_buffer.append(linebuf.substr(p1, p2 - p1)).append("\n"); p1 = p2 + 1; p2 = linebuf.find("\n", p1); } toread -= n; } } debug::debug(const char* filename) { if ((wfile = fopen(filename, "w")) == NULL) throw strerror(errno); setvbuf(wfile, (char*)NULL, _IOLBF, 0); set_cloexec(fileno(wfile), 1); if ((rfile = fopen(filename, "r")) == NULL) throw strerror(errno); rfd = fileno(rfile); set_cloexec(rfd, 1); #ifndef __MINGW32__ int f; if ((f = fcntl(rfd, F_GETFL)) == -1) throw strerror(errno); if (fcntl(rfd, F_SETFL, f | O_NONBLOCK) == -1) throw strerror(errno); #endif tty = isatty(fileno(stderr)); } debug::~debug() { if (wfile) fclose(wfile); if (rfile) fclose(rfile); } static void slider_cb(Fl_Widget* w, void*) { debug::level = (debug::level_e)((Fl_Slider*)w)->value(); w->label(prefix[debug::level]); w->parent()->redraw(); } static void src_menu_cb(Fl_Widget* w, void*) { debug::mask ^= 1 << ((Fl_Menu_*)w)->value(); } static void clear_cb(Fl_Widget* w, void*) { btext->clear(); dbg_buffer.clear(); } fldigi-3.21.80/src/misc/network.cxx0000664000175000017500000001100112313064025013772 00000000000000// ---------------------------------------------------------------------------- // network.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include "network.h" #include "socket.h" #include "timeops.h" #include "gettext.h" using namespace std; bool request_reply(const string& node, const string& service, const string& request, string& reply, double timeout) { try { Socket s(Address(node.c_str(), service.c_str())); s.connect(); s.set_nonblocking(); s.set_timeout(timeout); if (s.send(request) != request.length() || s.recv(reply) == 0) { reply = "Request timed out"; return false; } } catch (const SocketException& e) { reply = e.what(); return false; } return true; } bool fetch_http(const string& url, string& reply, double timeout) { static const size_t http_len = 7; static const char http_str[http_len+1] = "http://"; const char * url_str = url.c_str(); if( strncmp( url_str, http_str, http_len ) ) return false; const char * http_host_begin = url_str + http_len ; const char * http_host_end = strchr( http_host_begin, '/' ); const char * http_page = http_host_end == NULL ? "" : http_host_end ; std::string http_host = ( http_host_end == NULL ) ? http_host_begin : std::string( http_host_begin, http_host_end ); string request; request.append("GET ").append(http_page).append(" HTTP/1.0\n") .append("Host: ").append(http_host).append("\nConnection: close\n\n"); return request_reply( http_host, "http", request, reply, timeout); } struct fetch_data_t { string url; string reply; double timeout; bool result; bool finished; pthread_t thread; }; static void* fetch_url_thread(void* data) { fetch_data_t* p = reinterpret_cast(data); p->result = fetch_http(p->url, p->reply, p->timeout); p->finished = true; return NULL; } static void fetch_url_cleanup(void* data) { fetch_data_t* p = reinterpret_cast(data); if (p->finished) delete p; else Fl::repeat_timeout(1.0, fetch_url_cleanup, data); } /// This callback changes the cursor when waiting for loading from the network. static void busy_cursor(void*) { Fl::first_window()->cursor(FL_CURSOR_WAIT); } /// This restores the cursor after loading. static void default_cursor(void*) { Fl::first_window()->cursor(FL_CURSOR_DEFAULT); } /// Loads a HTTP page to a string with standard cursor display. bool fetch_http_gui(const string& url, string& reply, double timeout) { return fetch_http_gui(url, reply, timeout, busy_cursor, NULL, default_cursor, NULL); } // Like fetch_http, but calls Fl::wait and busy() until the time out has elapsed, // done() before returning bool fetch_http_gui(const string& url, string& reply, double timeout, void(*busy)(void*), void* arg1, void(*done)(void*), void* arg2) { fetch_data_t* data = new fetch_data_t; data->url = url; data->timeout = timeout; data->finished = false; struct timespec ts[2]; clock_gettime(CLOCK_MONOTONIC, &ts[0]); if (pthread_create(&data->thread, 0, fetch_url_thread, data)) { reply = strerror(errno); delete data; return false; } while (!data->finished && Fl::wait(timeout) >= 0.0) { if (Fl::event() == FL_KEYUP && Fl::event_key() == FL_Escape) break; clock_gettime(CLOCK_MONOTONIC, &ts[1]); ts[1] -= ts[0]; if (timeout - ts[1].tv_sec + ts[1].tv_nsec / 1e9 <= 0.0) break; if (busy) busy(arg1); } if (done) done(arg2); bool ret; if (data->finished) { reply = data->reply; ret = data->result; delete data; } else { Fl::add_timeout(1.0, fetch_url_cleanup, data); reply = (timeout >= 0.0 ? _("Aborted") : _("Timed out")); ret = false; } return ret; } fldigi-3.21.80/src/misc/charsetdistiller.cxx0000664000175000017500000001503312313064025015657 00000000000000// ---------------------------------------------------------------------------- // charsetdistiller.cxx -- input charset cleaning and conversion // // Copyright (C) 2012 // Andrej Lajovic, S57LN // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "debug.h" #include "charsetdistiller.h" #include "tiniconv.h" using namespace std; /* CharsetDistiller This class implements a charset "distiller" that receives input data one byte at a time and converts this data stream from a particular character set into UTF-8. Invalid input data is treated as if it was encoded in CP1252. Character set conversion is performed as soon as possible, i.e., when enough input is received to constitute a valid character in the input character set, this character is immediatly converted into UTF-8 and made available at the output. */ /* The constructor. Look up tiniconv.h for the list of possible values of charset_in. */ CharsetDistiller::CharsetDistiller(const int charset_in) { bufptr = buf; nutf8 = 0; tiniconv_init(charset_in, TINICONV_CHARSET_UTF_8, 0, &ctx); tiniconv_init(TINICONV_CHARSET_CP1252, TINICONV_CHARSET_UTF_8, TINICONV_OPTION_IGNORE_IN_ILSEQ, &ctx1252); } /* Change the input encoding. Look up tiniconv.h for the list of possible values of charset_in. Returns 0 if successful or -1 in case of error. */ int CharsetDistiller::set_input_encoding(const int charset_in) { flush(); return tiniconv_init(charset_in, TINICONV_CHARSET_UTF_8, 0, &ctx); } /* Receive a single byte of input data and make an immediate conversion attempt. */ void CharsetDistiller::rx(const unsigned char c) { *bufptr++ = c; process_buffer(); } /* Receive a zero-terminated string of input data. This is a convenience method: it merely feeds the string into the distiller one byte at a time. */ void CharsetDistiller::rx(const unsigned char *c) { const unsigned char *ptr; for (ptr = c; *ptr != 0; ptr++) rx(*ptr); } /* Examine the input buffer and decide on the possible actions (construct an UTF-8 character, interpret the bytes as invalid input etc.) */ void CharsetDistiller::process_buffer(void) { bool again = true; while (again) { if (bufptr == buf) { // the buffer is empty return; } int convert_status; int consumed_in; int consumed_out; unsigned char outbuf[6]; convert_status = tiniconv_convert(&ctx, buf, (bufptr - buf), &consumed_in, outbuf, sizeof(outbuf), &consumed_out); if (consumed_out) { // Append the converted data to the output string. outdata.append(reinterpret_cast(outbuf), consumed_out); // Count the number of converted UTF-8 characters (by counting the // number of bytes that are not continuation bytes). for (unsigned char *iptr = outbuf; iptr < outbuf + consumed_out; iptr++) { if ((*iptr & 0xc0) != 0x80) nutf8++; } // If not all input was consumed, move the remaining data to the // beginning of the buffer if (bufptr - buf > consumed_in) { memmove(buf, buf + consumed_in, bufptr - buf - consumed_in); bufptr -= consumed_in; } else bufptr = buf; } again = false; if (convert_status == TINICONV_CONVERT_OK) { // Successful conversion, nothing else to do. return; } else if (convert_status == TINICONV_CONVERT_IN_TOO_SMALL) { // Partial data left in the input buffer. We can't proceed with the // conversion until we get more input. return; } else if (convert_status == TINICONV_CONVERT_IN_ILSEQ) { // Invalid sequence in input; spit out the offending byte and try again. shift_first_out(); again = true; } else if (convert_status == TINICONV_CONVERT_OUT_TOO_SMALL) { // More characters were available than could be converted in one // go. Have another round. again = true; } // The following two cases should never happen. else if (convert_status == TINICONV_CONVERT_OUT_ILSEQ) { LOG_ERROR("Character not representable in UTF-8? Is this possible?"); bufptr = buf; return; } else { LOG_ERROR("Unknown tiniconv return value %d.", convert_status); bufptr = buf; return; } } } /* Convert the first byte of the input buffer; treat it as if it was encoded in CP1252 */ void CharsetDistiller::shift_first_out(void) { int consumed_in; int consumed_out; unsigned char outbuf[6]; tiniconv_convert(&ctx1252, buf, 1, &consumed_in, outbuf, sizeof(outbuf), &consumed_out); outdata.append(reinterpret_cast(outbuf), consumed_out); nutf8++; memmove(buf, buf+1, (bufptr - buf - 1)); bufptr--; } /* Flush input. Recode the input data left in the buffer in whatever way necessary to make the buffer empty. */ void CharsetDistiller::flush(void) { while (bufptr > buf) shift_first_out(); } /* Reset input buffer. All data still waiting in the input buffer is lost. Data already converted and waiting at the output is not affected. */ void CharsetDistiller::reset(void) { bufptr = buf; } /* Clear the output buffer. */ void CharsetDistiller::clear(void) { outdata.clear(); nutf8 = 0; } /* Return the number of bytes available in the output buffer. */ int CharsetDistiller::data_length(void) { return outdata.length(); } /* Return the number of UTF-8 characters in the output buffer. */ int CharsetDistiller::num_chars(void) { return nutf8; } /* Return a reference to the output buffer. */ const string &CharsetDistiller::data(void) { return outdata; } fldigi-3.21.80/src/misc/coordinate.cxx0000664000175000017500000001560712313064025014450 00000000000000// ---------------------------------------------------------------------------- // coordinate.cxx -- Handling of longitude and latitude. // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "config.h" #include "coordinate.h" #include "locator.h" void CoordinateT::Check(void) const { if( m_is_lon ) { if( ( m_angle >= -180.0 ) && ( m_angle <= 180.0 ) ) return ; } else { if( ( m_angle >= -90.0 ) && ( m_angle <= 90.0 ) ) return ; } std::stringstream strm ; strm << "Invalid m_angle=" << m_angle << " m_is_lon=" << m_is_lon ; throw std::runtime_error(strm.str()); } CoordinateT::CoordinateT( double degrees, bool is_lon ) : m_angle( fmod(degrees, 360.0 ) ), m_is_lon(is_lon) { if( m_angle > 180.0 ) m_angle -= 360.0 ; Check(); }; // Longitude East and Latitude North are positive. void CoordinateT::Init( char direction, double angle_degrees ) { m_angle = angle_degrees ; switch( direction ) { case 'W': case 'w': m_angle = -m_angle ; case 'E': case 'e': if( ( angle_degrees < -180 ) || ( angle_degrees > 180 ) ) throw std::runtime_error("Invalid longitude degree"); m_is_lon = true ; break ; case 'S': case 's': m_angle = -m_angle ; case 'N': case 'n': if( ( angle_degrees < -90 ) || ( angle_degrees > 90 ) ) throw std::runtime_error("Invalid latitude degree"); m_is_lon = false ; break ; default: throw std::runtime_error("Invalid direction"); } Check(); } CoordinateT::CoordinateT( char direction, double angle_degrees ) { Init( direction, angle_degrees ); } CoordinateT::CoordinateT( char direction, int degree, int minute, int second ) { // std::cout << "ctor d=" << direction << " " << degree << " " << minute << " " << second << "\n"; if( ( degree < 0 ) || ( degree > 180 ) ) throw std::runtime_error("Invalid degree"); if( ( minute < 0 ) || ( minute >= 60 ) ) throw std::runtime_error("Invalid minute"); if( ( second < 0 ) || ( second >= 60 ) ) throw std::runtime_error("Invalid second"); double angle_degrees = (double)degree + (double)minute / 60.0 + (double)second / 3600.0 ; Init( direction, angle_degrees ); } // Specific for reading from the file of navtex or wmo stations. // Navtex: "57 06 N" // Wmo : "69-36N", "013-27E", "009-25E" ou floating-point degrees: "12.34 E". // Station Latitude or Latitude :DD-MM-SSH where DD is degrees, MM is minutes, SS is seconds // and H is N for northern hemisphere or S for southern hemisphere or // E for eastern hemisphere or W for western hemisphere. // The seconds value is omitted for those stations where the seconds value is unknown. std::istream & operator>>( std::istream & istrm, CoordinateT & ref ) { if( ! istrm ) return istrm ; std::stringstream sstrm ; char direction ; while( true ) { // istrm >> direction ; direction = (char)istrm.get(); if( ! istrm ) return istrm ; switch( direction ) { case 'e': case 'E': case 'w': case 'W': case 's': case 'S': case 'n': case 'N': break; case '0' ... '9' : case '.' : case '-' : case '+' : case ' ' : case '\t' : sstrm << direction ; continue; default: istrm.setstate(std::ios::eofbit); return istrm ; } break; } // TODO: Check that the direction is what we expect. std::string tmpstr = sstrm.str(); // std::cout << "READ:" << tmpstr << ":" << direction << "\n"; const char * tmpPtr = tmpstr.c_str(); int i_degree, i_minute, i_second ; if( ( 3 == sscanf( tmpPtr, "%d-%d-%d", &i_degree, &i_minute, &i_second ) ) || ( 3 == sscanf( tmpPtr, "%d %d %d", &i_degree, &i_minute, &i_second ) ) ) { ref = CoordinateT( direction, i_degree, i_minute, i_second ); return istrm; } if( ( 2 == sscanf( tmpPtr, "%d-%d", &i_degree, &i_minute ) ) || ( 2 == sscanf( tmpPtr, "%d %d", &i_degree, &i_minute ) ) ) { ref = CoordinateT( direction, i_degree, i_minute, 0 ); return istrm; } double d_degree ; if( 1 == sscanf( tmpPtr, "%lf", &d_degree ) ) { ref = CoordinateT( direction, d_degree ); return istrm; } istrm.setstate(std::ios::eofbit); return istrm ; } std::ostream & operator<<( std::ostream & ostrm, const CoordinateT & ref ) { bool sign = ref.m_angle > 0 ; double ang = sign ? ref.m_angle : -ref.m_angle; ostrm << std::setfill('0') << std::setw( ref.m_is_lon ? 3 : 2 ) << (int)ang << "°" << std::setfill('0') << std::setw(2) << ( (int)( 0.5 + ang * 60.0 ) % 60 ) << "'" << std::setfill('0') << std::setw(2) << (int)fmod( ang * 3600.0, 60 ) << "''" << " "; ostrm << ( ref.m_is_lon ? sign ? 'E' : 'W' : sign ? 'N' : 'S' ); return ostrm; } CoordinateT::Pair::Pair( const CoordinateT & coo1, const CoordinateT & coo2 ) : m_lon( coo1.is_lon() ? coo1 : coo2 ) , m_lat( coo2.is_lon() ? coo1 : coo2 ) { if( ! ( coo1.is_lon() ^ coo2.is_lon() ) ) { throw std::runtime_error("Internal inconsistency"); } } CoordinateT::Pair::Pair( double lon, double lat ) : m_lon( CoordinateT( lon, true ) ) , m_lat( CoordinateT( lat, false ) ) {} CoordinateT::Pair::Pair( const std::string & locator ) { double lon, lat ; int res = locator2longlat( &lon, &lat, locator.c_str() ); if( res != RIG_OK ) { throw std::runtime_error("Cannot decode Maidenhead locator:" + locator ); }; m_lon = CoordinateT( lon, true ); m_lat = CoordinateT( lat, false ); } double CoordinateT::Pair::distance( const Pair & a ) const { double dist, azimuth ; int res = qrb( longitude().angle(), latitude().angle(), a.longitude().angle(), a.latitude().angle(), &dist, &azimuth ); if( res != RIG_OK) { std::stringstream sstrm ; sstrm << "Bad qrb result:" << *this << " <-> " << a ; throw std::runtime_error(sstrm.str()); } return dist ; } std::string CoordinateT::Pair::locator(void) const { char buf[64]; int ret = longlat2locator( longitude().angle(), latitude().angle(), buf, 3 ); if( ret == RIG_OK ) { return buf ; } return std::string(); } std::ostream & operator<<( std::ostream & ostrm, const CoordinateT::Pair & ref ) { ostrm << ref.latitude() << "/" << ref.longitude(); return ostrm; } std::istream & operator>>( std::istream & istrm, CoordinateT::Pair & ref ) { istrm >> ref.latitude() >> ref.longitude(); return istrm; } fldigi-3.21.80/src/misc/log.cxx0000664000175000017500000000557212313064025013102 00000000000000// ---------------------------------------------------------------------------- // log.cxx -- Received text logging for fldigi // // Copyright (C) 2007-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #include "log.h" #include "trx.h" #include "fl_digi.h" #include "timeops.h" using namespace std; static const char *lognames[] = { "RX", "TX", "", "" }; cLogfile::cLogfile(const string& fname) : retflag(true), logtype(LOG_RX) { if ((logfile = fopen(fname.c_str(), "a"))) { setvbuf(logfile, (char*)NULL, _IOLBF, 0); set_cloexec(fileno(logfile), 1); } } cLogfile::~cLogfile() { if (logfile) fclose(logfile); } void cLogfile::log_to_file(log_t type, const string& s) { if (!logfile || ferror(logfile) || s.empty()) return; char timestr[64]; struct tm tm; time_t t; if (type == LOG_RX || type == LOG_TX) { if (retflag || type != logtype) { if (type != logtype) fprintf(logfile, "\n"); time(&t); gmtime_r(&t, &tm); strftime(timestr, sizeof(timestr), "%Y-%m-%d %H:%MZ", &tm); char freq[20]; snprintf(freq, sizeof(freq), "%d", static_cast( wf->rfcarrier() + (wf->USB() ? active_modem->get_freq() : -active_modem->get_freq() ) ) ); const char *logmode = mode_info[active_modem->get_mode()].adif_name; fprintf(logfile, "%s %s : %s (%s): ", lognames[type], freq, logmode, timestr); } for (size_t i = 0; i < s.length(); i++) if (s[i] == '\n' || (unsigned char)s[i] >= ' ') fprintf(logfile, "%c", s[i]); retflag = *s.rbegin() == '\n'; if (!retflag) fflush(logfile); } else { time(&t); gmtime_r(&t, &tm); strftime(timestr, sizeof(timestr), "%a %b %e %H:%M:%S %Y UTC", &tm); fprintf(logfile, "\n--- Logging %s at %s ---\n", s.c_str(), timestr); } logtype = type; } void cLogfile::log_to_file_start() { log_to_file(LOG_START, "started"); } void cLogfile::log_to_file_stop() { log_to_file(LOG_STOP, "stopped"); } /* ---------------------------------------------------------------------- */ fldigi-3.21.80/src/misc/newinstall.cxx0000664000175000017500000003371112313064025014475 00000000000000// ---------------------------------------------------------------------------- // // newinstall.cxx // // Copyright (C) 2007-2010 Dave Freese, W1HKJ // Copyright (C) 2010 Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "macros.h" #include "main.h" #include "fl_digi.h" #include "configuration.h" #include "confdialog.h" #include "record_browse.h" #include "logger.h" #include #include #include #include #include using namespace std; static string label[24]; static string text[24]; void newmacros() { label[0] = "CQ @>|"; text[0] = "\n\ CQ CQ CQ de \n\ CQ CQ CQ de pse k\n\ "; label[1] = "ANS @>|"; text[1] = "\ de kn\n\ "; label[2] ="QSO @>>"; text[2] = "\n\ de "; label[3] = "KN @||"; text[3] = " btu de k\n\ "; label[4] = "SK @||"; text[4] = "\n\ tnx fer QSO , 73, God bless.\n\ de sk\n\ "; label[5] = "Me/Qth"; text[5] = "\n\ my name ... \n\ my QTH .... \n\ my LOC .... \n"; label[6] = "Brag"; text[6] = "\n\ << , >>\n\ Age: \n\ Rig: \n\ Pwr: \n\ Ant: \n\ OS: Linux\n\ Soft: \n\ Web: \n\ Email: "; label[7] = ""; text[7] = ""; label[8] = "T/R"; text[8] = ""; label[9] = "Tx @>>"; text[9] = ""; label[10] = "Rx @||"; text[10] = ""; label[11] = "TX @>|"; text[11] = "\n\ de k\n\ "; label[12] = "C Ans @>|"; text[12] = "de "; label[13] = "C rpt @>|"; text[13] = " QSL DE K\n\ "; label[14] = "C Rep @>|"; text[14] = "\n\ RR NBR TU DE K\n\ "; label[15] = "C Incr"; text[15] = ""; label[16] = "C Decr"; text[16] = ""; label[17] = "Log QSO"; text[17] = ""; label[18] = "CW-CQ @>|"; text[18] = "CQ CQ CQ DE CQ CQ CQ DE K"; label[19] = ""; text[19] = ""; label[20] = "CQ @-3+"; text[20] = "\n\ CQ CQ CQ de \n\ CQ CQ CQ de k"; label[21] = "CQ-ID @>|"; text[21] = "\n\ CQ CQ CQ de \n\ CQ CQ CQ de pse k\n\ "; label[22] = ""; text[22] = ""; label[23] = ""; text[23] = ""; for (int i = 0; i < 24; i++) { macros.text[i] = text[i]; macros.name[i] = label[i]; } for (int i = 24; i < MAXMACROS; i++) { macros.text[i] = ""; macros.name[i] = ""; } } struct paldata { const char *fname; const char *rgbstr0; const char *rgbstr1; const char *rgbstr2; const char *rgbstr3; const char *rgbstr4; const char *rgbstr5; const char *rgbstr6; const char *rgbstr7; const char *rgbstr8; }; paldata palfiles[] = { { "banana.pal", " 0; 0; 0", " 59; 59; 27","119;119; 59","179;179; 91","227;227;123", "235;235;151","239;239;183","247;247;219","255;255;255" }, { "blue1.pal"," 0; 0; 2", " 0; 0; 64"," 7; 11;128"," 39; 47;192"," 95;115;217", "151;179;231","187;203;239","219;227;247","255;255;255" }, { "blue2.pal"," 3; 3; 64", " 7; 11;128"," 39; 47;192"," 95;115;217","151;179;231", "187;203;239","219;227;247","255;255;255","255;253;108" }, { "blue3.pal"," 0; 0; 0", " 31; 31; 31"," 63; 63; 63"," 91; 91;167","119;119;191", "155;155;219","191;191;191","223;223;223","255;255;255" }, { "brown.pal"," 0; 0; 0", "107; 63; 11","175; 95; 31","199;119; 43","215;163; 63", "231;211; 87","243;247;111","247;251;179","255;255;255" }, { "cyan1.pal"," 0; 0; 0", " 5; 10; 10"," 22; 42; 42"," 52; 99; 99"," 94;175;175", "131;209;209","162;224;224","202;239;239","255;255;255" }, { "cyan2.pal"," 0; 0; 0", " 35; 51; 51"," 75;103;103","115;159;159","155;211;211", "183;231;231","203;239;239","227;247;247","255;255;255" }, { "cyan3.pal"," 0; 0; 0", " 94;114;114","138;162;162","171;201;201","199;232;232", "216;243;243","228;247;247","241;251;251","255;255;255" }, { "default.pal", " 0; 0; 0", " 0; 6;136"," 0; 19;198"," 0; 32;239","172;167;105", "194;198; 49","225;228;107","255;255; 0","255; 51; 0" }, { "digipan.pal"," 0; 0; 0", " 0; 0; 64"," 0; 0;128"," 0; 0;217","150;147; 92", "183;186; 46","225;228;107","255;255; 0","255; 51; 0" }, { "fldigi.pal"," 0; 0; 0", " 0; 0;177"," 3;110;227"," 0;204;204","223;223;223", " 0;234; 0","244;244; 0","250;126; 0","244; 0; 0" }, { "gmfsk.pal"," 0; 0;256", " 0; 62;194"," 0;126;130"," 0;190; 66"," 0;254; 2", " 62;194; 0","126;130; 0","190; 66; 0","254; 2; 0" }, { "gray1.pal"," 0; 0; 0", " 69; 69; 69"," 99; 99; 99","121;121;121","140;140;140", "157;157;157","172;172;172","186;186;186","199;199;199" }, { "gray2.pal"," 0; 0; 0", " 88; 88; 88","126;126;126","155;155;155","179;179;179", "200;200;200","220;220;220","237;237;237","254;254;254" }, { "green1.pal"," 0; 0; 0", " 0; 32; 0"," 0; 64; 0"," 0; 96; 0"," 0;128; 0", " 0;160; 0"," 0;192; 0"," 0;224; 0","255;255;255" }, { "green2.pal"," 0; 0; 0", " 0; 60; 0"," 0;102; 0"," 0;151; 0"," 0;242; 0", "255;255; 89","240;120; 0","255;148; 40","255; 0; 0" }, { "jungle.pal"," 0; 0; 0", "107; 67; 0","223;143; 0","255;123; 27","255; 91; 71", "255;195; 95","195;255;111","151;255;151","255;255;255" }, { "negative.pal","255;255;255", "223;223;223","191;191;191","159;159;159","127;127;127", " 95; 95; 95"," 63; 63; 63"," 31; 31; 31"," 0; 0; 0" }, { "orange.pal"," 0; 0; 0", " 63; 27; 0","131; 63; 0","199; 95; 0","251;127; 11", "251;155; 71","251;187;131","251;219;191","255;255;255" }, { "pink.pal"," 0; 0; 0", " 63; 35; 35","135; 75; 75","203;111;111","255;147;147", "255;175;175","255;199;199","255;227;227","255;255;255" }, { "rainbow.pal"," 0; 0;163", " 0; 87;191"," 0;207;219"," 0;247;139"," 0;255; 23", " 95;255; 0","219;255; 0","255;171;155","255;255;255" }, { "scope.pal"," 0; 0; 0", " 0; 0;167"," 0; 79;255"," 0;239;255"," 0;255; 75", " 95;255; 0","255;255; 0","255;127; 0","255; 0; 0" }, { "sunburst.pal"," 0; 0; 0", " 0; 0; 59"," 0; 0;123","131; 0;179","235; 0; 75", "255; 43; 43","255;215;111","255;255;183","255;255;255" }, { "vk4bdj.pal"," 0; 0; 0", " 0; 32; 0"," 0;154; 0"," 0;161; 0"," 0;177; 0", "156;209;144","192;185;183","214;222;224","255;255;255" }, { "yellow1.pal", " 0; 0; 0", " 31; 31; 0"," 63; 63; 0"," 95; 95; 0","127;127; 0", "159;159; 0","191;191; 0","223;223; 0","255;255; 0" }, { "yellow2.pal", " 0; 0; 0", " 39; 39; 0"," 75; 75; 0","111;111; 0","147;147; 0", "183;183; 0","219;219; 0","255;255; 0","255;255;255" }, { "yl2kf.pal"," 0; 0; 0", " 0; 0;119"," 7; 11;195"," 39; 47;159"," 95;115;203", "151;179;255","187;203;255","219;227;255","255;255; 5" }, { 0,0, 0,0,0,0, 0,0,0,0 } }; void create_new_palettes() { paldata *pd = palfiles; string Filename; while (pd->fname) { Filename = PalettesDir; Filename.append(pd->fname); ofstream pfile(Filename.c_str()); pfile << pd->rgbstr0 << endl; pfile << pd->rgbstr1 << endl; pfile << pd->rgbstr2 << endl; pfile << pd->rgbstr3 << endl; pfile << pd->rgbstr4 << endl; pfile << pd->rgbstr5 << endl; pfile << pd->rgbstr6 << endl; pfile << pd->rgbstr7 << endl; pfile << pd->rgbstr8 << endl; pfile.close(); pd++; } } void create_new_macros() { string Filename = MacrosDir; Filename.append("macros.mdf"); newmacros(); macros.saveMacros(Filename); } // ============================================================================= #include #include #include #include #include #include #include #include "configuration.h" #include "confdialog.h" #include "icons.h" #include "gettext.h" class Wizard : public Fl_Window { public: struct wizard_tab { Fl_Group* tab; Fl_Group* parent; int position; int x, y, w, h; }; Wizard(int w, int h, const char* l = 0) : Fl_Window(w, h, l), pad(4) { create_wizard(); } ~Wizard() { destroy_wizard(); } private: void create_wizard(void); Fl_Group* make_intro(void); void destroy_wizard(void); void place_buttons(void); static void wizard_cb(Fl_Widget* w, void* arg); int pad; Fl_Wizard *wizard; Fl_Button *cancel, *prev, *next, *done; typedef vector tab_t; tab_t tabs; Fl_Group* header; Fl_Box* title; }; void Wizard::create_wizard(void) { callback(wizard_cb, this); xclass(PACKAGE_TARNAME); int btn_w = 100, btn_h = 22, icon_pad = 16; wizard = new Fl_Wizard(0, 0, w(), h() - btn_h - 2 * pad); wizard->end(); // create the buttons fl_font(FL_HELVETICA, FL_NORMAL_SIZE); struct { Fl_Button** button; const char* label; int align; } buttons[] = { { &done, make_icon_label(_("Finish"), apply_icon), FL_ALIGN_LEFT }, { &next, make_icon_label(_("Next"), right_arrow_icon), FL_ALIGN_RIGHT }, { &prev, make_icon_label(_("Back"), left_arrow_icon), FL_ALIGN_LEFT }, // { &cancel, make_icon_label(_("Cancel"), process_stop_icon), FL_ALIGN_LEFT } { &cancel, make_icon_label(_("Close"), close_icon), FL_ALIGN_LEFT } }; for (size_t i = 0; i < sizeof(buttons)/sizeof(*buttons); i++) { Fl_Button* b = *buttons[i].button = new Fl_Button(0, wizard->y() + wizard->h() + pad, btn_w, btn_h, buttons[i].label); b->callback(wizard_cb, this); set_icon_label(b); b->align(buttons[i].align | FL_ALIGN_INSIDE); b->size(static_cast(fl_width(get_icon_label_text(b)) + icon_pad * 2), b->h()); } set_active(prev, false); done->hide(); place_buttons(); end(); position(MAX(0, fl_digi_main->x() + (fl_digi_main->w() - w()) / 2), MAX(0, fl_digi_main->y() + (fl_digi_main->h() - h()) / 2)); // populate the Fl_Wizard group struct wizard_tab tabs_[] = { { NULL }, { tabOperator }, { tabSoundCard }, { tabRig }, { tabDataFiles }, }; tabs.resize(sizeof(tabs_)/sizeof(*tabs_)); memcpy(&tabs[0], tabs_, sizeof(tabs_)); for (tab_t::iterator i = tabs.begin() + 1; i != tabs.end(); ++i) { i->parent = i->tab->parent(); i->position = i->parent->find(i->tab); i->x = i->tab->x(); i->y = i->tab->y(); i->w = i->tab->w(); i->h = i->tab->h(); } tabs[0].tab = make_intro(); for (tab_t::iterator i = tabs.begin(); i != tabs.end(); ++i) wizard->add(i->tab); wizard->value(tabs[0].tab); } void Wizard::destroy_wizard(void) { // re-parent tabs for (tab_t::const_iterator i = tabs.begin() + 1; i != tabs.end(); ++i) { i->parent->insert(*i->tab, i->position); i->tab->resize(i->x, i->y, i->w, i->h); i->parent->init_sizes(); } Fl_Button* b[] = { cancel, prev, next, done }; for (size_t i = 0; i < sizeof(b)/sizeof(*b); i++) free_icon_label(b[i]); header->parent()->remove(header); delete header; } void Wizard::place_buttons(void) { Fl_Button* buttons[] = { next->visible() ? next : done, prev, cancel }; int x = wizard->x() + wizard->w(); for (size_t i = 0; i < sizeof(buttons)/sizeof(*buttons); i++) { buttons[i]->position(x - buttons[i]->w() - pad, buttons[i]->y()); x = buttons[i]->x(); } } void Wizard::wizard_cb(Fl_Widget* w, void* arg) { Wizard* wiz = static_cast(arg); if (w == wiz || w == wiz->cancel || w == wiz->done) { delete wiz; return; } if (w == wiz->prev) wiz->wizard->prev(); else if (w == wiz->next) wiz->wizard->next(); Fl_Group* cur = static_cast(wiz->wizard->value()); // insert header group in current tab, relabel title cur->insert(*wiz->header, 0); const char* text = cur->tooltip(); if (!text || !*text) text = cur->label(); wiz->title->label(text); // modify buttons if (cur == wiz->tabs[0].tab) set_active(wiz->prev, false); else if (cur == wiz->tabs[1].tab) set_active(wiz->prev, true); else if (cur == wiz->tabs.back().tab) { wiz->done->show(); wiz->next->hide(); wiz->place_buttons(); } else { wiz->done->hide(); wiz->next->show(); wiz->place_buttons(); } } Fl_Group* Wizard::make_intro(void) { int hdr_h = 20, ttl_w = 300, ttl_y = 2, hlp_h = 200; Fl_Group* intro = new Fl_Group(wizard->x(), wizard->y(), wizard->w(), wizard->h(), label()); header = new Fl_Group(0, 0, wizard->w(), hdr_h); title = new Fl_Box(0, ttl_y, ttl_w, header->h()); title->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); title->labelfont(FL_HELVETICA_BOLD); title->labelsize(FL_NORMAL_SIZE + 1); title->label(intro->label()); header->end(); ostringstream help_; help_ << '\n' << _("The wizard will guide you through the basic fldigi settings") << ":\n\n"; for (tab_t::const_iterator i = tabs.begin() + 1; i != tabs.end(); ++i) help_ << "\t- " << i->tab->tooltip() << '\n'; help_ << '\n' << _("Feel free to skip any pages or exit the wizard at any time") << ". " << _("All settings shown here can be changed later via the Configure menu") << '.'; Fl_Box* help = new Fl_Box(pad, header->y() + header->h() + pad, intro->w() - 2 * pad, hlp_h); help->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE | FL_ALIGN_WRAP); help->copy_label(help_.str().c_str()); intro->end(); return intro; } void show_wizard(int argc, char** argv) { Wizard* w = new Wizard(dlgConfig->w(), dlgConfig->h(), _("Fldigi configuration wizard")); if (argc && argv) w->show(argc, argv); else { w->show(); w->set_modal(); } } fldigi-3.21.80/src/misc/threads.cxx0000664000175000017500000000627612313064025013755 00000000000000// ---------------------------------------------------------------------------- // threads.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "threads.h" THREAD_ID_TYPE thread_id_; #include "timeops.h" #if !HAVE_SEM_TIMEDWAIT # include # include # include # include int sem_timedwait(sem_t* sem, const struct timespec* abs_timeout) { int r; for (;;) { r = sem_trywait(sem); if (r == 0 || (r == -1 && errno != EAGAIN)) return r; if (abs_timeout->tv_nsec < 0 || abs_timeout->tv_nsec >= 1000000000L) { errno = EINVAL; return -1; } struct timespec now; clock_gettime(CLOCK_REALTIME, &now); if (now == *abs_timeout || now > *abs_timeout) { errno = ETIMEDOUT; return -1; } usleep(100); } } #endif // !HAVE_SEM_TIMEDWAIT int sem_timedwait_rel(sem_t* sem, double rel_timeout) { struct timespec t; clock_gettime(CLOCK_REALTIME, &t); t = t + rel_timeout; return sem_timedwait(sem, &t); } int pthread_cond_timedwait_rel(pthread_cond_t* cond, pthread_mutex_t* mutex, double rel_timeout) { struct timespec t; clock_gettime(CLOCK_REALTIME, &t); t = t + rel_timeout; return pthread_cond_timedwait(cond, mutex, &t); } #ifndef NDEBUG bool thread_in_list(int id, const int* list) { while (*list != INVALID_TID) if (id == *list++) return true; return false; } #endif #ifdef __linux__ # ifndef _GNU_SOURCE # define _GNU_SOURCE # endif # include # include # include "debug.h" void linux_log_tid(void) { LOG_DEBUG(PACKAGE_TARNAME " thread %" PRIdPTR " is LWP %ld", GET_THREAD_ID(), syscall(SYS_gettid)); } #endif // Synchronization objects. guard_lock::guard_lock(pthread_mutex_t* m) : mutex(m) { pthread_mutex_lock(mutex); } guard_lock::~guard_lock(void) { pthread_mutex_unlock(mutex); } syncobj::syncobj() { pthread_mutex_init( & m_mutex, NULL ); pthread_cond_init( & m_cond, NULL ); } syncobj::~syncobj() { pthread_mutex_destroy( & m_mutex ); pthread_cond_destroy( & m_cond ); } void syncobj::signal() { int rc = pthread_cond_signal( &m_cond ); if( rc ) { throw std::runtime_error(strerror(rc)); } } bool syncobj::wait( double seconds ) { int rc = pthread_cond_timedwait_rel( &m_cond, &m_mutex, seconds ); switch( rc ) { case 0 : return true ; default : throw std::runtime_error(strerror(rc)); case ETIMEDOUT: return false ; } } fldigi-3.21.80/src/misc/nls.cxx0000664000175000017500000000664712313064025013121 00000000000000// ---------------------------------------------------------------------------- // nls.cxx // // Copyright (C) 2008 // Stéphane Fillod, F8CFE // // Copyright (C) 2011 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "nls.h" #include "gettext.h" using namespace std; #ifndef PATH_MAX # define PATH_MAX 4096 #endif #ifdef __WOE32__ # include # include // TODO: figure out the percentage automatically; hopefully not in a horribly kludgy way struct lang_def_t ui_langs[] = { { "en", "en_US", "English", 100 }, { "de", "de_DE", "Deutsch", 99 }, { "fr", "fr_FR", "Fran\347ais", 38 }, { "it", "it_IT", "Italiano", 99 }, { "es", "es_ES", "Espa\361ol", 99 }, { "pl", "pl_PL", "Polish", 90}, { NULL, NULL, NULL, 0 } }; static string get_win32_lang_dir(const char* homedir = NULL) { string lang_fn; if (!homedir) { if (!(homedir = getenv("USERPROFILE"))) return lang_fn; lang_fn.assign(homedir).append("\\fldigi.files\\"); } return lang_fn.append("lang.txt"); } int get_ui_lang(const char* homedir) { string lang = get_win32_lang_dir(homedir); ifstream in(lang.c_str()); if (!in) return 0; string::size_type u = string::npos; while (in >> lang) { if ( (lang[0] != '\n') & (lang[0] != '#') && ( (u = lang.find('_')) != string::npos) ) break; } in.close(); if (u != string::npos) for (lang_def_t* p = ui_langs; p->lang; p++) if (lang == p->lang_region) return (int)(p - ui_langs); return 0; } void set_ui_lang(int lang, const char* homedir) { if ((size_t)lang >= sizeof(ui_langs)/sizeof(*ui_langs) - 1) return; string langfn = get_win32_lang_dir(homedir); ofstream f(langfn.c_str()); if (f) { f << "# Autogenerated file, do not edit\r\n" << ui_langs[lang].lang_region << "\r\n"; f.close(); } } #endif int setup_nls(void) { static int nls_set_up = 0; if (nls_set_up) return nls_set_up; setlocale (LC_MESSAGES, ""); setlocale (LC_CTYPE, "C"); setlocale (LC_TIME, ""); // setting LC_NUMERIC might break the config read/write routines const char* ldir; char buf[PATH_MAX]; if (!(ldir = getenv("FLDIGI_LOCALE_DIR"))) { if (getcwd(buf, sizeof(buf) - strlen("/locale") - 1)) { #ifdef __WOE32__ int lang = get_ui_lang(); setenv("LANGUAGE", ui_langs[lang].lang_region, 1); #endif strcpy(buf + strlen(buf), "/locale"); struct stat s; if (stat(buf, &s) != -1 && S_ISDIR(s.st_mode)) ldir = buf; else ldir = LOCALEDIR; } } bindtextdomain(PACKAGE, ldir); /* fltk-1.1.x only knows about Latin-1 */ bind_textdomain_codeset(PACKAGE, "ISO-8859-1"); textdomain(PACKAGE); return nls_set_up = 1; } fldigi-3.21.80/src/misc/misc.cxx0000664000175000017500000001240712313064025013247 00000000000000// ---------------------------------------------------------------------------- // misc.cxx -- Miscellaneous helper functions // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. These filters were adapted from code contained // in the gmfsk source code distribution. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "misc.h" #include // ---------------------------------------------------------------------------- /* * Hamming weight (number of bits that are ones). */ unsigned long hweight32(unsigned long w) { w = (w & 0x55555555) + ((w >> 1) & 0x55555555); w = (w & 0x33333333) + ((w >> 2) & 0x33333333); w = (w & 0x0F0F0F0F) + ((w >> 4) & 0x0F0F0F0F); w = (w & 0x00FF00FF) + ((w >> 8) & 0x00FF00FF); w = (w & 0x0000FFFF) + ((w >> 16) & 0x0000FFFF); return w; } unsigned short int hweight16(unsigned short int w) { w = (w & 0x5555) + ((w >> 1) & 0x5555); w = (w & 0x3333) + ((w >> 2) & 0x3333); w = (w & 0x0F0F) + ((w >> 4) & 0x0F0F); w = (w & 0x00FF) + ((w >> 8) & 0x00FF); return w; } unsigned char hweight8(unsigned char w) { w = (w & 0x55) + ((w >> 1) & 0x55); w = (w & 0x33) + ((w >> 2) & 0x33); w = (w & 0x0F) + ((w >> 4) & 0x0F); return w; } // ---------------------------------------------------------------------------- /* * Parity function. Return one if `w' has odd number of ones, zero otherwise. */ int parity(unsigned long w) { return hweight32(w) & 1; } // ---------------------------------------------------------------------------- /* * Reverse order of bits. */ unsigned long rbits32(unsigned long w) { w = ((w >> 1) & 0x55555555) | ((w << 1) & 0xAAAAAAAA); w = ((w >> 2) & 0x33333333) | ((w << 2) & 0xCCCCCCCC); w = ((w >> 4) & 0x0F0F0F0F) | ((w << 4) & 0xF0F0F0F0); w = ((w >> 8) & 0x00FF00FF) | ((w << 8) & 0xFF00FF00); w = ((w >> 16) & 0x0000FFFF) | ((w << 16) & 0xFFFF0000); return w; } unsigned short int rbits16(unsigned short int w) { w = ((w >> 1) & 0x5555) | ((w << 1) & 0xAAAA); w = ((w >> 2) & 0x3333) | ((w << 2) & 0xCCCC); w = ((w >> 4) & 0x0F0F) | ((w << 4) & 0xF0F0); w = ((w >> 8) & 0x00FF) | ((w << 8) & 0xFF00); return w; } unsigned char rbits8(unsigned char w) { w = ((w >> 1) & 0x55) | ((w << 1) & 0xFF); w = ((w >> 2) & 0x33) | ((w << 2) & 0xCC); w = ((w >> 4) & 0x0F) | ((w << 4) & 0xF0); return w; } // ---------------------------------------------------------------------------- // Integer base-2 logarithm unsigned int log2u(unsigned int x) { int y = 0; x >>= 1; while (x) { x >>= 1; y++; } return y; } // ---------------------------------------------------------------------------- // Gray encoding and decoding (8 bit) unsigned char grayencode(unsigned char data) //unsigned char graydecode(unsigned char data) { unsigned char bits = data; bits ^= data >> 1; bits ^= data >> 2; bits ^= data >> 3; bits ^= data >> 4; bits ^= data >> 5; bits ^= data >> 6; bits ^= data >> 7; return bits; } unsigned char graydecode(unsigned char data) //unsigned char grayencode(unsigned char data) { return data ^ (data >> 1); } // ---------------------------------------------------------------------------- // Rectangular - no pre filtering of data array void RectWindow(double *array, int n) { for (int i = 0; i < n; i++) array[i] = 1.0; } // Hamming - used by gmfsk void HammingWindow(double *array, int n) { double pwr = 0.0; double inv_n = 1.0 / (double)n; for (int i = 0; i < n; i++) { array[i] = hamming((double)i * inv_n); pwr += array[i] * array[i]; } pwr = sqrt((double)n/pwr); for (int i = 0; i < n; i++) array[i] *= pwr; } // Hanning - used by winpsk void HanningWindow(double *array, int n) { double pwr = 0.0; double inv_n = 1.0 / (double)n; for (int i = 0; i < n; i++) { array[i] = hanning((double)i * inv_n); pwr += array[i] * array[i]; } pwr = sqrt((double)n/pwr); for (int i = 0; i < n; i++) array[i] *= pwr; } // Best lob suppression - least in band ripple void BlackmanWindow(double *array, int n) { double pwr = 0.0; double inv_n = 1.0 / (double)n; for (int i = 0; i < n; i++) { array[i] = blackman((double)i * inv_n); pwr += array[i] * array[i]; } pwr = sqrt((double)n/pwr); for (int i = 0; i < n; i++) array[i] *= pwr; } // Simple about effective as Hamming or Hanning void TriangularWindow(double *array, int n) { double pwr = 0.0; for (int i = 0; i < n; i++) array[i] = 1.0; double inv_n = 1.0 / (double)n; for (int i = 0; i < n / 4; i++) { array[i] = 4.0 * (double)i * inv_n ; array[n-i] = array[i]; } for (int i = 0; i < n; i++) pwr += array[i] * array[i]; pwr = sqrt((double)n/pwr); for (int i = 0; i < n; i++) array[i] *= pwr; } fldigi-3.21.80/src/misc/socket.cxx0000664000175000017500000004522112313147652013614 00000000000000// ---------------------------------------------------------------------------- // socket.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #ifndef __MINGW32__ # include # include # if defined(__OpenBSD__) && defined(nitems) # undef nitems # endif # include # include # include # include #else # include "compat.h" #endif #include #include #include #include #include #include #include #include #include #ifndef NDEBUG #include "debug.h" #endif #include "socket.h" #if HAVE_GETADDRINFO && !defined(AI_NUMERICSERV) # define AI_NUMERICSERV 0 #endif using namespace std; // // utility functions // #if HAVE_GETADDRINFO static void copy_addrinfo(struct addrinfo** info, const struct addrinfo* src) { struct addrinfo* p = *info; for (const struct addrinfo* rp = src; rp; rp = rp->ai_next) { if (p) { p->ai_next = new struct addrinfo; p = p->ai_next; } else { p = new struct addrinfo; if (!*info) *info = p; } p->ai_flags = rp->ai_flags; p->ai_family = rp->ai_family; p->ai_socktype = rp->ai_socktype; p->ai_protocol = rp->ai_protocol; p->ai_addrlen = rp->ai_addrlen; if (rp->ai_addr) { p->ai_addr = reinterpret_cast(new struct sockaddr_storage); memcpy(p->ai_addr, rp->ai_addr, rp->ai_addrlen); } else p->ai_addr = NULL; if (rp->ai_canonname) p->ai_canonname = strdup(rp->ai_canonname); else p->ai_canonname = NULL; p->ai_next = NULL; } } static void free_addrinfo(struct addrinfo* ai) { for (struct addrinfo *next, *p = ai; p; p = next) { next = p->ai_next; delete reinterpret_cast(p->ai_addr); free(p->ai_canonname); delete p; } } #else static void copy_charpp(char*** dst, const char* const* src) { if (src == NULL) { *dst = NULL; return; } size_t n = 0; for (const char* const* s = src; *s; s++) n++; *dst = new char*[n+1]; for (size_t i = 0; i < n; i++) (*dst)[i] = strdup(src[i]); (*dst)[n] = NULL; } static void copy_hostent(struct hostent* dst, const struct hostent* src) { if (src->h_name) dst->h_name = strdup(src->h_name); else dst->h_name = NULL; copy_charpp(&dst->h_aliases, src->h_aliases); dst->h_length = src->h_length; if (src->h_addr_list) { size_t n = 0; for (const char* const* p = src->h_addr_list; *p; p++) n++; dst->h_addr_list = new char*[n+1]; for (size_t i = 0; i < n; i++) { dst->h_addr_list[i] = new char[src->h_length]; memcpy(dst->h_addr_list[i], src->h_addr_list[i], src->h_length); } dst->h_addr_list[n] = NULL; } else dst->h_addr_list = NULL; } static void copy_servent(struct servent* dst, const struct servent* src) { if (src->s_name) dst->s_name = strdup(src->s_name); else dst->s_name = NULL; copy_charpp(&dst->s_aliases, src->s_aliases); dst->s_port = src->s_port; if (src->s_proto) dst->s_proto = strdup(src->s_proto); else dst->s_proto = NULL; } static void free_charpp(char** pp) { if (!pp) return; for (char** p = pp; *p; p++) free(*p); delete [] pp; } static void free_hostent(struct hostent* hp) { free(const_cast(hp->h_name)); free_charpp(hp->h_aliases); if (hp->h_addr_list) { for (char** p = hp->h_addr_list; *p; p++) delete [] *p; delete [] hp->h_addr_list; } } static void free_servent(struct servent* sp) { free(const_cast(sp->s_name)); free_charpp(sp->s_aliases); free(sp->s_proto); } #endif // HAVE_GETADDRINFO // // Address class // Address::Address(const char* host, int port, const char* proto_name) : node(host), copied(false) { #if HAVE_GETADDRINFO info = NULL; #else memset(&host_entry, 0, sizeof(host_entry)); memset(&service_entry, 0, sizeof(service_entry)); #endif if (node.empty() && port == 0) return; ostringstream s; s << port; service = s.str(); lookup(proto_name); } Address::Address(const char* host, const char* port_name, const char* proto_name) : node(host), service(port_name), copied(false) { #if HAVE_GETADDRINFO info = NULL; #else memset(&host_entry, 0, sizeof(host_entry)); memset(&service_entry, 0, sizeof(service_entry)); #endif lookup(proto_name); } Address::Address(const Address& addr) { #if HAVE_GETADDRINFO info = NULL; #else memset(&host_entry, 0, sizeof(host_entry)); memset(&service_entry, 0, sizeof(service_entry)); #endif *this = addr; } Address::~Address() { #if HAVE_GETADDRINFO if (info) { if (!copied) freeaddrinfo(info); else free_addrinfo(info); } #else free_hostent(&host_entry); free_servent(&service_entry); #endif } Address& Address::operator=(const Address& rhs) { if (this == &rhs) return *this; node = rhs.node; service = rhs.service; #if HAVE_GETADDRINFO if (info) { if (!copied) freeaddrinfo(info); else free_addrinfo(info); } copy_addrinfo(&info, rhs.info); #else free_hostent(&host_entry); free_servent(&service_entry); copy_hostent(&host_entry, &rhs.host_entry); copy_servent(&service_entry, &rhs.service_entry); addr.ai_protocol = rhs.addr.ai_protocol; addr.ai_socktype = rhs.addr.ai_socktype; #endif copied = true; return *this; } void Address::lookup(const char* proto_name) { int proto; if (!strcasecmp(proto_name, "tcp")) proto = IPPROTO_TCP; else if (!strcasecmp(proto_name, "udp")) proto = IPPROTO_UDP; else throw SocketException("Bad protocol name"); #if HAVE_GETADDRINFO struct addrinfo hints; memset(&hints, 0, sizeof(hints)); # ifdef AI_ADDRCONFIG hints.ai_flags = AI_ADDRCONFIG; # endif hints.ai_family = AF_UNSPEC; hints.ai_socktype = (proto == IPPROTO_TCP ? SOCK_STREAM : SOCK_DGRAM); if (service.find_first_not_of("0123456789") == string::npos) hints.ai_flags |= AI_NUMERICSERV; int r; if ((r = getaddrinfo(node.empty() ? NULL : node.c_str(), service.c_str(), &hints, &info)) < 0) throw SocketException(r, "getaddrinfo"); #else // use gethostbyname etc. memset(&host_entry, 0, sizeof(host_entry)); memset(&service_entry, 0, sizeof(service_entry)); if (node.empty()) node = "0.0.0.0"; struct hostent* hp; if ((hp = gethostbyname(node.c_str())) == NULL) throw SocketException(hstrerror(HOST_NOT_FOUND)); copy_hostent(&host_entry, hp); int port; struct servent* sp; if ((sp = getservbyname(service.c_str(), NULL)) == NULL) { // if a service name string could not be looked up by name, it must be numeric if (service.find_first_not_of("0123456789") != string::npos) throw SocketException("Unknown service name"); port = htons(atoi(service.c_str())); sp = getservbyport(port, NULL); } if (!sp) service_entry.s_port = port; else copy_servent(&service_entry, sp); memset(&addr, 0, sizeof(addr)); addr.ai_protocol = proto; addr.ai_socktype = (proto == IPPROTO_TCP ? SOCK_STREAM : SOCK_DGRAM); #endif } /// /// Returns the number of addresses available for /// the node and service /// size_t Address::size(void) const { size_t n = 0; #if HAVE_GETADDRINFO if (!info) return 0; for (struct addrinfo* p = info; p; p = p->ai_next) n++; #else if (!host_entry.h_addr_list) return 0; for (char** p = host_entry.h_addr_list; *p; p++) n++; #endif return n; } /// /// Returns an address from the list of those available /// for the node and service /// const addr_info_t* Address::get(size_t n) const { #if HAVE_GETADDRINFO if (!info) return NULL; struct addrinfo* p = info; for (size_t i = 0; i < n; i++) p = p->ai_next; # ifndef NDEBUG LOG_DEBUG("Found address %s", get_str(p).c_str()); # endif return p; #else if (!host_entry.h_addr_list) return NULL; memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr = *(struct in_addr*)host_entry.h_addr_list[n]; saddr.sin_port = service_entry.s_port; addr.ai_family = saddr.sin_family; addr.ai_addrlen = sizeof(saddr); addr.ai_addr = (struct sockaddr*)&saddr; # ifndef NDEBUG LOG_DEBUG("Found address %s", get_str(&addr).c_str()); # endif return &addr; #endif } /// /// Returns the string representation of an address /// string Address::get_str(const addr_info_t* addr) { if (!addr) return ""; #if HAVE_GETADDRINFO char host[NI_MAXHOST], port[NI_MAXSERV]; memset(host, 0, sizeof(host)); if (getnameinfo(addr->ai_addr, sizeof(struct sockaddr_storage), host, sizeof(host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV) == 0) return string("[").append(host).append("]:").append(port); else return ""; #else char* host, port[8]; host = inet_ntoa(((struct sockaddr_in*)addr->ai_addr)->sin_addr); snprintf(port, sizeof(port), "%u", htons(((struct sockaddr_in*)addr->ai_addr)->sin_port)); return string("[").append(host).append("]:").append(port); #endif } // // Socket class // /// Constructs a Socket object and associates the address addr with it. /// This address will be used by subsequent calls to the bind() or connect() /// methods /// /// @param addr An Address object /// Socket::Socket(const Address& addr) { buffer = new char[BUFSIZ]; memset(&timeout, 0, sizeof(timeout)); anum = 0; nonblocking = false; autoclose = true; open(addr); } /// Constructs a Socket object from a file descriptor /// /// @param fd A file descriptor /// Socket::Socket(int fd) : sockfd(fd) { buffer = new char[BUFSIZ]; anum = 0; memset(&timeout, 0, sizeof(timeout)); if (sockfd == -1) return; #ifndef __MINGW32__ int r = fcntl(sockfd, F_GETFL); if (r == -1) throw SocketException(errno, "fcntl"); nonblocking = r & O_NONBLOCK; #else // no way to retrieve nonblocking status on woe32(?!) set_nonblocking(false); #endif autoclose = true; } /// /// Constructs a Socket object by copying another instance /// Socket::Socket(const Socket& s) : sockfd(s.sockfd), address(s.address), anum(s.anum), nonblocking(s.nonblocking), autoclose(true) { buffer = new char[BUFSIZ]; ainfo = address.get(anum); memcpy(&timeout, &s.timeout, sizeof(timeout)); s.set_autoclose(false); } Socket::~Socket() { delete [] buffer; if (autoclose) close(); } Socket& Socket::operator=(const Socket& rhs) { if (this == &rhs) return *this; sockfd = rhs.sockfd; address = rhs.address; anum = rhs.anum; ainfo = address.get(anum); memcpy(&timeout, &rhs.timeout, sizeof(timeout)); nonblocking = rhs.nonblocking; autoclose = rhs.autoclose; rhs.set_autoclose(false); return *this; } /// /// Associates the Socket with an address /// /// This address will be used by subsequent calls to the bind() or connect /// methods. /// /// @params addr An address object /// void Socket::open(const Address& addr) { address = addr; size_t n = address.size(); for (anum = 0; anum < n; anum++) { ainfo = address.get(anum); #ifndef NDEBUG LOG_DEBUG("Trying %s", address.get_str(ainfo).c_str()); #endif if ((sockfd = socket(ainfo->ai_family, ainfo->ai_socktype, ainfo->ai_protocol)) != -1) break; } if (sockfd == -1) throw SocketException(errno, "socket"); set_close_on_exec(true); } /// /// Shuts down the socket /// void Socket::close(void) { ::close(sockfd); } /// /// Waits for the socket file descriptor to become ready for I/O /// /// @params dir Specifies the I/O direction. 0 is input, 1 is output. /// /// @return True if the file descriptor became ready within the timeout /// period, false otherwise. @see Socket::set_timeout bool Socket::wait(int dir) { fd_set fdset; FD_ZERO(&fdset); FD_SET((unsigned)sockfd, &fdset); struct timeval t = { timeout.tv_sec, timeout.tv_usec }; int r; if (dir == 0) r = select(sockfd + 1, &fdset, NULL, NULL, &t); else if (dir == 1) r = select(sockfd + 1, NULL, &fdset, NULL, &t); else throw SocketException(EINVAL, "Socket::wait"); if (r == -1) throw SocketException(errno, "select"); return r; } /// /// Binds the socket to the address associated with the object /// @see Socket::open /// void Socket::bind(void) { int r = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&r, sizeof(r)) == -1) #ifndef NDEBUG perror("setsockopt SO_REUSEADDR"); #else ; #endif if (::bind(sockfd, ainfo->ai_addr, ainfo->ai_addrlen) == -1) throw SocketException(errno, "bind"); } /// /// Calls listen(2) on the socket file desriptor /// /// The socket must already have been bound to an address via a call to the bind /// method. /// /// @params backlog The maximum number of pending connections (default SOMAXCONN) /// void Socket::listen(int backlog) { if (::listen(sockfd, backlog) == -1) throw SocketException(errno, "listen"); } /// /// Accepts a connection /// /// The socket must already have been bound to an address via a call to the bind /// method. /// /// @return A Socket instance for the accepted connection /// Socket Socket::accept(void) { listen(); // wait for fd to become readable if (nonblocking && (timeout.tv_sec > 0 || timeout.tv_usec > 0)) if (!wait(0)) throw SocketException(ETIMEDOUT, "select"); int r; if ((r = ::accept(sockfd, NULL, 0)) == -1) throw SocketException(errno, "accept"); set_close_on_exec(true, r); return Socket(r); } /// /// Accepts a single connection and then closes the listening socket /// @see Socket::accept /// /// @return A Socket instance for the accepted connection /// Socket Socket::accept1(void) { bind(); Socket s = accept(); close(); s.set_close_on_exec(true); return s; } /// /// Connects the socket to the address that is associated with the object /// void Socket::connect(void) { #ifndef NDEBUG LOG_DEBUG("Connecting to %s", address.get_str(ainfo).c_str()); #endif if (::connect(sockfd, ainfo->ai_addr, ainfo->ai_addrlen) == -1) throw SocketException(errno, "connect"); } /// /// Connects the socket to an address /// /// @param addr The address to connect to /// void Socket::connect(const Address& addr) { close(); open(addr); connect(); } /// /// Sends a buffer /// /// @param buf /// @param len /// /// @return The amount of data that was sent. This may be less than len /// if the socket is non-blocking. /// size_t Socket::send(const void* buf, size_t len) { // if we have a nonblocking socket and a nonzero timeout, // wait for fd to become writeable if (nonblocking && (timeout.tv_sec > 0 || timeout.tv_usec > 0)) if (!wait(1)) return 0; size_t nToWrite = len; int r = 0; const char *sp = (const char *)buf; while ( nToWrite > 0) { try { #if defined(__WIN32__) r = ::send(sockfd, sp, nToWrite, 0); #else r = ::write(sockfd, sp, nToWrite); #endif } catch (...) { throw; } if (r > 0) { sp += r; nToWrite -= r; } else { if (r == 0) { shutdown(sockfd, SHUT_WR); throw SocketException(errno, "send"); } else if (r == -1) { if (errno != EAGAIN) throw SocketException(errno, "send"); r = 0; } } } return r; } /// /// Sends a string /// /// @param buf /// /// @return The amount of data that was sent. This may be less than len /// if the socket is non-blocking. /// size_t Socket::send(const string& buf) { return send(buf.data(), buf.length()); } /// /// Receives data into a buffer /// /// @arg buf /// @arg len The maximum number of bytes to write to buf. /// /// @return The amount of data that was received. This may be less than len /// if the socket is non-blocking. size_t Socket::recv(void* buf, size_t len) { // if we have a nonblocking socket and a nonzero timeout, // wait for fd to become writeable if (nonblocking && (timeout.tv_sec > 0 || timeout.tv_usec > 0)) if (!wait(0)) return 0; int r = 0; try { r = ::recv(sockfd, (char*)buf, len, 0); if (r == 0) shutdown(sockfd, SHUT_RD); else if (r == -1) { if (errno != EAGAIN) throw SocketException(errno, "recv"); r = 0; } } catch (...) { throw; } return r; } /// /// Receives all available data and appends it to a string. /// /// @arg buf /// /// @return The amount of data that was received. /// size_t Socket::recv(string& buf) { size_t n = 0; ssize_t r; try { while ((r = recv(buffer, BUFSIZ)) > 0) { buf.reserve(buf.length() + r); buf.append(buffer, r); n += r; } } catch (...) { throw; } return n; } /// /// Retrieves the socket's receive or send buffer size /// /// @param dir Specifies the I/O direction. 0 is input, 1 is output. /// int Socket::get_bufsize(int dir) { int len; if (::get_bufsize(sockfd, dir, &len) == -1) throw SocketException(errno, "get_bufsize"); return len; } /// /// Sets the socket's receive or send buffer size /// /// @param dir Specifies the I/O direction. 0 is input, 1 is output. /// @param len Specifies the new buffer size /// void Socket::set_bufsize(int dir, int len) { if (::set_bufsize(sockfd, dir, len) == -1) throw SocketException(errno, "set_bufsize"); } /// /// Sets the socket's blocking mode /// /// @param v If true, the socket is set to non-blocking /// void Socket::set_nonblocking(bool v) { if (set_nonblock(sockfd, v) == -1) throw SocketException(errno, "set_nonblock"); nonblocking = v; } /// /// Enables the use of Nagle's algorithm for the socket /// /// @param v If true, Nagle's algorithm is disabled. /// void Socket::set_nodelay(bool v) { if (::set_nodelay(sockfd, v) == -1) throw SocketException(errno, "set_nodelay"); } /// /// Sets the timeout associated with non-blocking operations /// /// @param t /// void Socket::set_timeout(const struct timeval& t) { timeout.tv_sec = t.tv_sec; timeout.tv_usec = t.tv_usec; } void Socket::set_timeout(double t) { timeout.tv_sec = (time_t)floor(t); timeout.tv_usec = (suseconds_t)((t - timeout.tv_sec) * 1e6); } /// /// Sets the socket's autoclose mode. /// /// If autoclose is disabled, the socket file descriptor will not be closed when /// the Socket object is destructed. /// /// @param v If true, the socket will be closed by the destructor /// void Socket::set_autoclose(bool v) const { autoclose = v; } /// /// Sets the socket's close-on-exec flag /// void Socket::set_close_on_exec(bool v, int fd) { if (fd == -1) fd = sockfd; if (set_cloexec(fd, v) == -1) throw SocketException(errno, "set_cloexec"); } /// /// Returns the Socket's file descriptor. /// /// The descriptor should only be used for reading and writing. /// /// @return the socket file descriptor /// int Socket::fd(void) { return sockfd; } fldigi-3.21.80/src/misc/util.cxx0000664000175000017500000002405112313064025013267 00000000000000// ---------------------------------------------------------------------------- // util.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // Copyright (C) 2009 // Dave Freese, W1HKJ // Copyright (C) 2013 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "config.h" #include "util.h" #ifdef __MINGW32__ # include "compat.h" #endif /// Return the smallest power of 2 not less than n uint32_t ceil2(uint32_t n) { --n; n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; return n + 1; } /// Return the largest power of 2 not greater than n uint32_t floor2(uint32_t n) { n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; return n - (n >> 1); } #include /// Transforms the version, as a string, into an integer, so comparisons are possible. unsigned long ver2int(const char* version) { unsigned long v = 0L; const char* p = version; while (*p) { if (isdigit(*p)) v = v*10 + *p - '0'; p++; } return v; } #if !HAVE_STRCASESTR # include // from git 1.6.1.2 compat/strcasestr.c char *strcasestr(const char *haystack, const char *needle) { int nlen = strlen(needle); int hlen = strlen(haystack) - nlen + 1; int i; for (i = 0; i < hlen; i++) { int j; for (j = 0; j < nlen; j++) { unsigned char c1 = haystack[i+j]; unsigned char c2 = needle[j]; if (toupper(c1) != toupper(c2)) goto next; } return (char *) haystack + i; next: ; } return NULL; } #endif // !HAVE_STRCASESTR #if !HAVE_STRLCPY // from git 1.6.1.2 compat/strcasestr.c size_t strlcpy(char *dest, const char *src, size_t size) { size_t ret = strlen(src); if (size) { size_t len = (ret >= size) ? size - 1 : ret; memcpy(dest, src, len); dest[len] = '\0'; } return ret; } #endif // !HAVE_STRLCPY #if !HAVE_SETENV // from git 1.6.3.1 compat/setenv.c int setenv(const char *name, const char *value, int replace) { int out; size_t namelen, valuelen; char *envstr; if (!name || !value) return -1; if (!replace) { char *oldval = NULL; oldval = getenv(name); if (oldval) return 0; } namelen = strlen(name); valuelen = strlen(value); envstr = (char*)malloc((namelen + valuelen + 2)); if (!envstr) return -1; memcpy(envstr, name, namelen); envstr[namelen] = '='; memcpy(envstr + namelen + 1, value, valuelen); envstr[namelen + valuelen + 1] = 0; out = putenv(envstr); /* putenv(3) makes the argument string part of the environment, * and changing that string modifies the environment --- which * means we do not own that storage anymore. Do not free * envstr. */ return out; } #endif #if !HAVE_UNSETENV // from git 1.6.3.1 compat/setenv.c int unsetenv(const char *name) { extern char **environ; int src, dst; size_t nmln; nmln = strlen(name); for (src = dst = 0; environ[src]; ++src) { size_t enln; enln = strlen(environ[src]); if (enln > nmln) { /* might match, and can test for '=' safely */ if (0 == strncmp (environ[src], name, nmln) && '=' == environ[src][nmln]) /* matches, so skip */ continue; } environ[dst] = environ[src]; ++dst; } environ[dst] = NULL; return 0; } #endif #ifdef __MINGW32__ int set_cloexec(int fd, unsigned char v) { return 0; } #else # include # include int set_cloexec(int fd, unsigned char v) { int f = fcntl(fd, F_GETFD); return f == -1 ? f : fcntl(fd, F_SETFD, (v ? f | FD_CLOEXEC : f & ~FD_CLOEXEC)); } #endif // __MINGW32__ int set_nonblock(int fd, unsigned char v) { #ifndef __MINGW32__ int f = fcntl(fd, F_GETFL); return f == -1 ? f : fcntl(fd, F_SETFL, (v ? f | O_NONBLOCK : f & ~O_NONBLOCK)); #else // __MINGW32__ u_long v_ = (u_long)v; errno = 0; if (ioctlsocket(fd, FIONBIO, &v_) == SOCKET_ERROR) { errno = WSAGetLastError(); return -1; } else return 0; #endif // __MINGW32__ } #ifndef __MINGW32__ # include # include # include # include #endif int set_nodelay(int fd, unsigned char v) { int val = v; return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&val, sizeof(val)); } #ifdef __MINGW32__ # include #endif int get_bufsize(int fd, int dir, int* len) { socklen_t optlen = sizeof(*len); return getsockopt(fd, SOL_SOCKET, (dir == 0 ? SO_RCVBUF : SO_SNDBUF), (char*)len, &optlen); } int set_bufsize(int fd, int dir, int len) { return setsockopt(fd, SOL_SOCKET, (dir == 0 ? SO_RCVBUF : SO_SNDBUF), (const char*)&len, sizeof(len)); } #ifndef __MINGW32__ #include #include #ifndef NSIG # define NSIG 64 #endif static size_t nsig = 0; static struct sigaction* sigact = 0; static pthread_mutex_t sigmutex = PTHREAD_MUTEX_INITIALIZER; #endif void save_signals(void) { #ifndef __MINGW32__ pthread_mutex_lock(&sigmutex); if (!sigact) sigact = new struct sigaction[NSIG]; for (nsig = 1; nsig <= NSIG; nsig++) if (sigaction(nsig, NULL, &sigact[nsig-1]) == -1) break; pthread_mutex_unlock(&sigmutex); #endif } void restore_signals(void) { #ifndef __MINGW32__ pthread_mutex_lock(&sigmutex); for (size_t i = 1; i <= nsig; i++) sigaction(i, &sigact[i-1], NULL); delete [] sigact; sigact = 0; nsig = 0; pthread_mutex_unlock(&sigmutex); #endif } uint32_t simple_hash_data(const unsigned char* buf, size_t len, uint32_t code) { for (size_t i = 0; i < len; i++) code = ((code << 4) | (code >> (32 - 4))) ^ (uint32_t)buf[i]; return code; } uint32_t simple_hash_str(const unsigned char* str, uint32_t code) { while (*str) code = ((code << 4) | (code >> (32 - 4))) ^ (uint32_t)*str++; return code; } #include #include static const char hexsym[] = "0123456789ABCDEF"; static std::vector* hexbuf; const char* str2hex(const unsigned char* str, size_t len) { if (unlikely(len == 0)) return ""; if (unlikely(!hexbuf)) { hexbuf = new std::vector; hexbuf->reserve(192); } if (unlikely(hexbuf->size() < len * 3)) hexbuf->resize(len * 3); char* p = &(*hexbuf)[0]; size_t i; for (i = 0; i < len; i++) { *p++ = hexsym[str[i] >> 4]; *p++ = hexsym[str[i] & 0xF]; *p++ = ' '; } *(p - 1) = '\0'; return &(*hexbuf)[0]; } const char* str2hex(const char* str, size_t len) { return str2hex((const unsigned char*)str, len ? len : strlen(str)); } static std::vector* binbuf; const char* uint2bin(unsigned u, size_t len) { if (unlikely(len == 0)) len = sizeof(u) * CHAR_BIT; if (unlikely(!binbuf)) { binbuf = new std::vector; binbuf->reserve(sizeof(u) * CHAR_BIT); } if (unlikely(binbuf->size() < len + 1)) binbuf->resize(len + 1); for (size_t i = 0; i < len; i++) { (*binbuf)[len - i - 1] = '0' + (u & 1); u >>= 1; } (*binbuf)[len] = '\0'; return &(*binbuf)[0]; } void MilliSleep(long msecs) { #ifndef __MINGW32__ struct timespec tv[2] = { {msecs / 1000L, msecs % 1000L * 1000000L} }; nanosleep(&tv[0], &tv[1]); #else Sleep(msecs); #endif } /// Returns 0 if a process is running, 0 if not there and -1 if the test cannot be made. int test_process(int pid) { #ifdef __MINGW32__ HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid); DWORD ret = WaitForSingleObject(process, 0); CloseHandle(process); return ret == WAIT_TIMEOUT; #elif defined(__linux__) /// This is dependent on procfs. char buf[32]; sprintf(buf,"/proc/%d/cmdline",pid); FILE * tmpF = fopen( buf, "r" ); if( tmpF != NULL ) { fclose(tmpF); return 1 ; } return 0 ; #else // This would work on Linux also. int ret = kill(pid,0); if(ret == 0) return 1; if(errno == ESRCH) return 0; fprintf(stderr,"kill pid=%d failed r=%d e=%d %s\n", pid, ret, errno, strerror(errno) ); return -1 ; #endif } #ifdef __MINGW32__ /// This includes Windows.h #include /// Retrieve the system error message for the last-error code static const char * WindowsError(DWORD dw) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); /// BEWARE, this is NOT reentrant ! static char buffer[2048]; strcpy( buffer, (const char *)lpMsgBuf ); LocalFree(lpMsgBuf); return buffer ; } #endif /// Starts a process and returns its pid, and -1 if error. Returns 0 if this cannot be made. int fork_process( const char * cmd ) { #ifdef __MINGW32__ char* cmd_local = strdup(cmd); STARTUPINFO si; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); PROCESS_INFORMATION pi; memset(&pi, 0, sizeof(pi)); if (!CreateProcess(NULL, cmd_local, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) fprintf(stderr,"CreateProcess failed: %s", WindowsError(GetLastError()) ); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free(cmd_local); return pi.dwProcessId ; #else pid_t newpid = fork(); switch(newpid) { case -1: return -1 ; case 0: execl("/bin/sh", "sh", "-c", cmd, NULL ); fprintf(stderr,"execl failed with %s", strerror(errno) ); /// Ideally we should warn the main process. exit(EXIT_FAILURE); } return newpid ; #endif } /// Returns true if OK. Beware, the error case is not reentrant. const char * create_directory( const char * dir ) { if ( mkdir(dir, 0777) == -1 ) if( errno != EEXIST ) return strerror(errno); return NULL ; } fldigi-3.21.80/src/misc/timeops.cxx0000664000175000017500000001240412313064025013771 00000000000000// ---------------------------------------------------------------------------- // timeops.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "timeops.h" #ifdef __MINGW32__ # include "compat.h" #endif #if !HAVE_CLOCK_GETTIME # ifdef __APPLE__ # include # endif # if TIME_WITH_SYS_TIME # include # endif # include int clock_gettime(clockid_t clock_id, struct timespec* tp) { if (clock_id == CLOCK_REALTIME) { struct timeval t; if (unlikely(gettimeofday(&t, NULL) != 0)) return -1; tp->tv_sec = t.tv_sec; tp->tv_nsec = t.tv_usec * 1000; } else if (clock_id == CLOCK_MONOTONIC) { #if defined(__WOE32__) int32_t msec = GetTickCount(); tp->tv_sec = msec / 1000; tp->tv_nsec = (msec % 1000) * 1000000; #elif defined(__APPLE__) static mach_timebase_info_data_t info = { 0, 0 }; if (unlikely(info.denom == 0)) mach_timebase_info(&info); uint64_t t = mach_absolute_time() * info.numer / info.denom; tp->tv_sec = t / 1000000000; tp->tv_nsec = t % 1000000000; #endif } else { errno = EINVAL; return -1; } return 0; } #endif // !HAVE_CLOCK_GETTIME struct timespec operator+(const struct timespec &t0, const double &t) { struct timespec r; r.tv_sec = t0.tv_sec + static_cast(t); r.tv_nsec = t0.tv_nsec + static_cast((t - static_cast(t)) * 1e9); if (r.tv_nsec > 1000000000) { r.tv_nsec -= 1000000000; r.tv_sec++; } return r; } struct timespec operator-(const struct timespec &t0, const struct timespec &t1) { struct timespec r = t0; if (r.tv_nsec < t1.tv_nsec) { --r.tv_sec; r.tv_nsec += 1000000000L; } r.tv_sec -= t1.tv_sec; r.tv_nsec -= t1.tv_nsec; return r; } struct timespec& operator-=(struct timespec &t0, const struct timespec &t1) { if (t0.tv_nsec < t1.tv_nsec) { --t0.tv_sec; t0.tv_nsec += 1000000000L; } t0.tv_sec -= t1.tv_sec; t0.tv_nsec -= t1.tv_nsec; return t0; } bool operator>(const struct timespec &t0, const struct timespec &t1) { if (t0.tv_sec == t1.tv_sec) return t0.tv_nsec > t1.tv_nsec; else if (t0.tv_sec > t1.tv_sec) return true; else return false; } bool operator==(const struct timespec &t0, const struct timespec &t1) { return t0.tv_sec == t1.tv_sec && t0.tv_nsec == t1.tv_nsec; } struct timeval operator+(const struct timeval &t0, const double &t) { struct timeval r; r.tv_sec = t0.tv_sec + static_cast(t); r.tv_usec = t0.tv_usec + static_cast((t - static_cast(t)) * 1e9); if (r.tv_usec > 1000000) { r.tv_usec -= 1000000; r.tv_sec++; } return r; } struct timeval operator-(const struct timeval &t0, const struct timeval &t1) { struct timeval r = t0; if (r.tv_usec < t1.tv_usec) { --r.tv_sec; r.tv_usec += 1000000; } r.tv_sec -= t1.tv_sec; r.tv_usec -= t1.tv_usec; return r; } struct timeval& operator-=(struct timeval &t0, const struct timeval &t1) { if (t0.tv_usec < t1.tv_usec) { --t0.tv_sec; t0.tv_usec += 1000000L; } t0.tv_sec -= t1.tv_sec; t0.tv_usec -= t1.tv_usec; return t0; } bool operator>(const struct timeval &t0, const struct timeval &t1) { if (t0.tv_sec == t1.tv_sec) return t0.tv_usec > t1.tv_usec; else if (t0.tv_sec > t1.tv_sec) return true; else return false; } bool operator==(const struct timeval &t0, const struct timeval &t1) { return t0.tv_sec == t1.tv_sec && t0.tv_usec == t1.tv_usec; } #ifndef HAVE_GMTIME_R #include "threads.h" static pthread_mutex_t gmtime_r_mutex = PTHREAD_MUTEX_INITIALIZER; struct tm *gmtime_r(const time_t *_Time, struct tm *_Tm) { pthread_mutex_lock (&gmtime_r_mutex); struct tm *p = gmtime(_Time); if (p && _Tm) memcpy (_Tm, p, sizeof (struct tm)); pthread_mutex_unlock (&gmtime_r_mutex); return p; } static pthread_mutex_t gmtime_local_mutex = PTHREAD_MUTEX_INITIALIZER; struct tm *localtime_r(const time_t *_Time,struct tm *_Tm) { pthread_mutex_lock (&gmtime_local_mutex); struct tm *p = localtime(_Time); if (p && _Tm) memcpy (_Tm, p, sizeof (struct tm)); pthread_mutex_unlock (&gmtime_local_mutex); return p; } #endif fldigi-3.21.80/src/misc/kmlserver.cxx0000664000175000017500000016462612313064025014341 00000000000000// ---------------------------------------------------------------------------- // kmlserver.cxx -- KML Server // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "kmlserver.h" #include "gettext.h" #include "debug.h" #include "threads.h" #include "strutil.h" #include "configuration.h" #include "irrXML.h" #include "timeops.h" /** Some platforms have problems with condition variables apparently. * When cancelling a thread which waits in pthread_cond_timedwait, * the thread is stuck. * We replace it by an unconditional wait, and a test on a boolean * which indicates if data was saved in the internal buffers. * The consequence is that data are not immediately saved in KML files, * and the user has to wait until the end of the delay. */ #if !defined(__APPLE__) # define FLDIGI_KML_CONDITION_VARIABLE 1 #endif // ---------------------------------------------------------------------------- static const char * KmlSrvUnique = "Permanent"; /// This must follow a specific ISO format so it can be serialized in KML files. static void KmlTimestamp( std::ostream &ostrm, time_t tim ) { if(tim == KmlServer::UniqueEvent) { ostrm << KmlSrvUnique; return; } tm objTm = *gmtime(&tim); char bufTm[24]; // See http://www.w3.org/TR/xmlschema-2/#isoformats sprintf( bufTm, "%4d-%02d-%02dT%02d:%02dZ", objTm.tm_year + 1900, objTm.tm_mon + 1, objTm.tm_mday, objTm.tm_hour, objTm.tm_min ); ostrm << bufTm ; } /// For debugging purpose. static std::string KmlTimestamp( time_t tim ) { std::stringstream strm ; KmlTimestamp( strm, tim ); return strm.str(); } /// Deserialize a timestamp, inverse of KmlTimestamp. static time_t KmlFromTimestamp( const char * ts ) { if(ts == NULL ) throw std::runtime_error("Null timestamp"); if( 0 == strcmp( ts, KmlSrvUnique ) ) return KmlServer::UniqueEvent ; /// So all fields are initialised with correct default values. time_t timNow = time(NULL); tm objTm = *gmtime( &timNow ); int r = sscanf( ts, "%4d-%02d-%02dT%02d:%02dZ", &objTm.tm_year, &objTm.tm_mon, &objTm.tm_mday, &objTm.tm_hour, &objTm.tm_min ); if( r != 5 ) throw std::runtime_error("Cannot read timestamp from " + std::string(ts) ); objTm.tm_year -= 1900; objTm.tm_mon -= 1; objTm.tm_sec = 0; time_t res = mktime( &objTm ); if( res < 0 ) throw std::runtime_error("Cannot make timestamp from " + std::string(ts) ); return res; } // ---------------------------------------------------------------------------- /// Some chars are forbidden in HTML documents. This replaces them by HTML entities. // We do not need to create a temporary copy of the transformed string. // See Html entities here: http://www.w3schools.com/tags/ref_entities.asp static void StripHtmlTags( std::ostream & ostrm, const char * beg, bool newLines = false ) { const char * ptr = NULL; // TODO: Consider   ¢ £ ¥ € § © ® ™ for( const char * it = beg ; ; ++it ) { /** Other characters are filtered: * U+0009, U+000A, U+000D: these are the only C0 controls accepted in XML 1.0; * U+0020–U+D7FF, U+E000–U+FFFD: */ char ch = *it ; switch( ch ) { case 0x01 ... 0x08 : // case 0x09 : // case 0x0A : case 0x0B ... 0x0C : // case 0x0D : case 0x0E ... 0x0F : ptr = " "; break; case '"' : ptr = """; break; case '\'' : ptr = "'"; break; case '&' : ptr = "&" ; break; case '<' : ptr = "<" ; break; case '>' : ptr = ">" ; break; case '\0' : break ; case '\n' : if(newLines) // Should we replace new lines by "
" ? { ptr = "
" ; break; } // Otherwise we print the newline char like the other chars. default : continue ; } if( it != beg ) { ostrm.write( beg, it - beg ); } if( ch == '\0' ) break ; assert(ptr); ostrm << ptr ; beg = it + 1 ; } } /// Some values such as Navtex messages may contain newline chars. static void StripHtmlTagsNl( std::ostream & ostrm, const std::string & beg ) { StripHtmlTags( ostrm, beg.c_str(), true ); } static void StripHtmlTags( std::ostream & ostrm, const std::string & beg ) { StripHtmlTags( ostrm, beg.c_str() ); } // ---------------------------------------------------------------------------- /// Also used when reloading a KML file. void KmlServer::CustomDataT::Push( const char * k, const std::string & v ) { push_back( value_type( k, v ) ); } // ---------------------------------------------------------------------------- /// Different sorts of KML datas. This list is hardcoded but they are processed identically. static const char * categories[] = { "User", "Synop", "Navtex" }; static const size_t nb_categories = sizeof(categories) / sizeof(*categories); /// Written at the beginning of each KML document. static void KmlHeader( std::ostream & ostrm, const std::string & title ) { ostrm << "\n" "\n" "\n" "" << title << "\n" ; } /// Appended at the end of each KML document. static const char KmlFooter[] = "\n" "\n" ; /// Contains for example GIF images, and all the styles. Can be customised by the user. static const std::string namStyles = "styles.kml"; /** Used to code the data for reloading. The description tag is too complicated * to parse and its serialization might not be reversible. * We use preprocessor constants instead of char arrays so they can be concatenated at compile-time. * The tags must be as short as possible but the values easy to deserialize. * */ #define FLDIGI_TAG_ITM "fldigi:itm" #define FLDIGI_TAG_EVT "fldigi:evt" #define FLDIGI_TAG_KEY "k" #define FLDIGI_TAG_VAL "v" #define FLDIGI_TIMESTAMP "ts" /// Global singleton of all KML-related things. class KmlSrvImpl : public KmlServer { volatile bool m_loaded ; /// Set when ready for operation. std::string m_kml_dir; /// Where kml files are saved. std::string m_command; /// Started each time KML files are saved. int m_pid_command; /// Process id of the running commend for KML files. double m_merge_dist; /// Below this, placemark with same name are merged. int m_retention_delay; /// Purge old data. int m_refresh_interval; /// In seconds, written in KML files. int m_balloon_style; /// Display style in KML balloons: Lines, matrices, plain text. pthread_t m_writer_thread ; /// Periodically woken up to write things to the KML file. /// Models a KML placemark. It contains events indexed my a timestamp. /// We need an ordered container in order to remove old data in one erase. class PlacemarkT : public std::multimap< time_t, CustomDataT > { CoordinateT::Pair m_coord; double m_altitude; std::string m_styleNam; // The icon. std::string m_kmlId ; // Unique KML id for the placemark. std::string m_descrTxt ;// KML snippet. /// Serialize the internal data to XML so they can be easily read. void SerializeForReading( std::ostream & ostrm ) const { /// Custom data elements for reading the content when restarting. ostrm << "\n"; /// Print from the most recent event, which is at the end. for( const_iterator itEvt = begin(), enEvt = end(); itEvt != enEvt; ++itEvt ) { ostrm << "<" FLDIGI_TAG_EVT " " FLDIGI_TIMESTAMP "=\""; KmlTimestamp(ostrm,itEvt->first); ostrm << "\">\n" ; const CustomDataT & refCust = itEvt->second; for( CustomDataT::const_iterator it = refCust.begin(), en = refCust.end(); it != en; ++it ) { ostrm << "<" FLDIGI_TAG_ITM " " FLDIGI_TAG_KEY "=\"" << it->first << "\" " FLDIGI_TAG_VAL "=\""; StripHtmlTags(ostrm,it->second); ostrm << "\" />"; } ostrm << "\n" ; } /// Dumps all events in natural order ostrm << "\n"; } public: /// Constructor called by "Broadcast", not from reading a KML file. PlacemarkT( const CoordinateT::Pair & refCoo, double altitude, const std::string & styleNam, const std::string & kmlNam ) : m_coord( refCoo ) , m_altitude( altitude ) , m_styleNam( styleNam ) { /// The unique key is indeed the name and the time, /// because an object such as a ship might move and come back to the same place. /// We add a counter because during tests, the timestamps are too close. static int dummyCnt = 0 ; std::stringstream strm ; /// No need to store the kml name because it is the multimap key. StripHtmlTags(strm,kmlNam); strm << ':' << Tm2Time() << ':' << ++dummyCnt ; m_kmlId = strm.str(); } /// Constructor for deserialization. Strings comes from the KML file. PlacemarkT() : m_altitude(0.0) {} void Clear() { m_styleNam.clear(); m_kmlId.clear(); m_descrTxt.clear(); clear(); } /// Used when reading a KML file. Read coordinates and altitude from a string when reloading a KML file. void SetCoordinates( const char * str ) { double lon, lat ; if( str == NULL ) { throw std::runtime_error("Null coordinates text"); } int r = sscanf( str, "%lf,%lf,%lf", &lon, &lat, &m_altitude ); if( r != 3 ) { static const std::string msg("Cannot read coordinates and altitude:"); throw std::runtime_error(msg+str); } m_coord = CoordinateT::Pair( lon, lat ); } /// Used when reading a KML file. HTML entities are already removed. "+1" is for the "#". void SetStyle( const char * str ) { if(str == NULL ) throw std::runtime_error("Null input style"); size_t sz = namStyles.size(); // If the strings are equal, then strlen(str) >= sz, and str[sz] == '\0' if equality. if( ( 0 == strncmp( str, namStyles.c_str(), sz ) ) && ( str[sz] == '#' ) ) { m_styleNam = str + sz + 1; } else { LOG_INFO("Inconsistent URL style:%s",str ); m_styleNam = str ; } } /// Used when reading a KML file. void SetKmlId( const char * str ) { std::stringstream strm ; // The KML deserializer irrXML transforms the HTML entities // into normal chars. We must do the reverse transformation. StripHtmlTags(strm,str); m_kmlId = strm.str(); } /// Just add the events without suppressing duplicate information. void AppendEvent( time_t evtTim, const std::string & descrTxt, const CustomDataT & custDat ) { if( m_descrTxt.empty() ) m_descrTxt = descrTxt ; else if( ! descrTxt.empty() ) { // We want to ensure that it is not a miscommunication. if( NULL == strstr( m_descrTxt.c_str(), descrTxt.c_str() ) ) { m_descrTxt += "," + descrTxt ; } } /// Default time is now. evtTim might have another special value. if(evtTim == 0) { evtTim = time(NULL); } insert( value_type( evtTim, custDat ) ); } const CoordinateT::Pair & coordinates() const { return m_coord;} double altitude(void) const { return m_altitude;} const std::string & style(void) const { return m_styleNam; } const std::string & KmlId(void) const { return m_kmlId; } /// When writing the style to the KML file. void styleToKml(std::ostream & ostrm) const { ostrm << namStyles << '#'; StripHtmlTags(ostrm,m_styleNam); } /// Used when several PlacemarkT with the same kmlNam but different styles. Keep the first only. void style(const std::string & styl) { m_styleNam = styl; } /// This is NOT the Euclidian distance but tries to reflect a position change on a 3D map. double distance_to( const PlacemarkT & refOther ) const { double delta_altitude_km = fabs( m_altitude - refOther.m_altitude ) * 0.001 ; // Big coefficient for the altitude, to show on the map what happens. double horiz_dist = m_coord.distance( refOther.m_coord ); return horiz_dist + 10 * delta_altitude_km ; } /// Adds the events of another placemark. Manages events enforced to be unique. void concatenate( const PlacemarkT & refOther ) { if( refOther.empty() ) return ; time_t firstTm = refOther.begin()->first ; if( firstTm == KmlServer::UniqueEvent ) { clear(); /// We keep this special time_t value to enforce unicity of CustomDataT. insert( *refOther.begin() ); } else { insert( refOther.begin(), refOther.end() ); } } // PlacemarkT::concatenate /// This transforms our coordinates into KML ones. void WriteCooSub( std::ostream & ostrm ) const { ostrm << m_coord.longitude().angle() << ',' << m_coord.latitude().angle() << ',' << m_altitude ; } /// Writes the placemark to a KML stream. void Serialize( std::ostream & ostrm, const std::string & kmlNam, int balloon_style ) const { // Range of events which occured at this place. const_reverse_iterator beEvt = rbegin(), enEvt = rend(); // There should be at least one event. if( beEvt == enEvt ) { LOG_WARN("Inconsistency: No event kmlId=%s",m_kmlId.c_str() ); return ; } // The unique key is indeed the name and the time, // because an object such as a ship might move and come back to the same place. // We add a counter because during tests, the timestamps are too close. ostrm << "\n"; // Beware of the sign of longitude. ostrm << "" ; WriteCooSub( ostrm ); ostrm << "\n"; if( kmlNam.empty() ) ostrm << "No name\n"; else { // Looks like there is a bug in KML when displaying a placemark ID containing an hyphen. ostrm << ""; StripHtmlTags(ostrm,kmlNam); ostrm << "\n"; } ostrm << ""; styleToKml(ostrm); ostrm << "\n"; // More information here: http://freegeographytools.com/2007/putting-time-data-into-a-kml-file // 1944-06-06T06:00:00 See http://www.w3.org/TR/xmlschema-2/#isoformats // We do not add the timestamps because it is not very ergonomic. Should be added to the linestrings too. static const bool withTimestamp = false ; if( withTimestamp ) { // Last update time is last argument. ostrm << ""; KmlTimestamp(ostrm,enEvt->first); ostrm << "\n"; } /// Whats is displayed on the margin. Must be short. ostrm << ""; StripHtmlTags(ostrm,m_descrTxt); ostrm << "\n"; /** * Unfortunately it is not possible to use CSS in Google-maps, due to "content scrubbing": * http://stackoverflow.com/questions/8421260/styling-kml-with-css-in-google-maps-v3 * Scrubbing the contents is a security measure to prevent malicious code from executing. * It removes JavaScript, CSS, iframe, embed and object tags. */ static const char * colorTime = "#0099CC"; static const char * colorKey = "#FF9933"; ostrm << ""; /// Data can be displayed into one big matrix, or several tables, one per event. switch( balloon_style ) { case 0: /// Plain text, for example for GPX conversion. for( const_reverse_iterator itEvt = beEvt; itEvt != enEvt; ++itEvt ) { ostrm << "Timestamp:" << Tm2Time(itEvt->first) << "\n" ; const CustomDataT & refCust = itEvt->second; for( CustomDataT::const_iterator it = refCust.begin(), en = refCust.end(); it != en; ++it ) { StripHtmlTags(ostrm,it->first); ostrm << ":"; /// Do not insert
tags. StripHtmlTags(ostrm,it->second); ostrm << "\n" ; } ostrm << "\n" ; } break; case 1: // One distinct HTML table per event. ostrm << ""; // Print from the most recent event, which is at the end. for( const_reverse_iterator itEvt = beEvt; itEvt != enEvt; ++itEvt ) { ostrm << ""; ostrm << "" << Tm2Time(itEvt->first) << "" "" ; const CustomDataT & refCust = itEvt->second; for( CustomDataT::const_iterator it = refCust.begin(), en = refCust.end(); it != en; ++it ) { ostrm << "" ""; StripHtmlTags(ostrm,it->first); ostrm << "" ""; StripHtmlTagsNl(ostrm,it->second); ostrm << "" "" ; } } ostrm << "]]>\n"; break; case 2 : { /// Transposition of the html matrix. typedef std::vector TitleT ; TitleT titles ; typedef std::vector< std::string > RowT ; const_iterator beCol = begin(), enCol = end(); for( const_iterator itCol = beCol; itCol != enCol; ++itCol ) { titles.push_back( itCol->first ); } size_t nbCols = titles.size(); typedef std::map< std::string, RowT > MtxT; MtxT mtx ; size_t iCols = 0; for( const_iterator itCol = beCol; itCol != enCol; ++itCol, ++iCols ) { const CustomDataT & refCust = itCol->second; for( CustomDataT::const_iterator it = refCust.begin(), en = refCust.end(); it != en; ++it ) { MtxT::iterator itMtx = mtx.find( it->first ); if( itMtx == mtx.end() ) { itMtx = mtx.insert( mtx.end(), MtxT::value_type( it->first, RowT() ) ); itMtx->second.resize(nbCols); } itMtx->second[iCols] = it->second ; } } ostrm << ""; ostrm << ""; for( size_t iCols = 0; iCols < nbCols; ++iCols ) { ostrm << "" << Tm2Time(titles[iCols]) << ""; } ostrm << "" ; for( MtxT::const_iterator itMtx = mtx.begin(), enMtx = mtx.end(); itMtx != enMtx; ++itMtx ) { ostrm << ""; ostrm << ""; StripHtmlTags(ostrm,itMtx->first); ostrm << ""; // TODO: Do not write twice the same value if it is not numeric (Starting with a digit) // or longer than N characters. for( RowT::const_iterator itRow = itMtx->second.begin(), enRow = itMtx->second.end(); itRow != enRow; ++itRow ) { ostrm << ""; StripHtmlTags(ostrm,*itRow); ostrm << ""; } ostrm << "" ; } ostrm << "]]>\n"; break; } } ostrm << "
\n"; // TODO: Other dsplay style: All elements on a one single table. Removal of duplicate text values etc... SerializeForReading( ostrm ); ostrm << "
\n"; } // PlacemarkT::Serialize }; // PlacemarkT /** The placemark name is unique wrt to the application. It might map to several PlaceMark, each having distinct coordinates. It is not really possible to sort the different locations by coordinates, because it is a list created by the object trajectory. class PlacesMapT : public std::multimap< std::string, PlacemarkT > */ class PlacesMapT : public std::multimap< std::string, PlacemarkT > { /// Written to by the main thread with lock protection, read (and emptied) /// by the sub thread which is later in charge of writing things to disk. typedef std::list< value_type > PlacemarkListT ; /// A separate queue helps for performance because the insertion in the main container /// might take time and the main thread may lose data. PlacemarkListT m_queue_to_insert ; /// This is not set when inserting at load time, but when emptying /// the queue, and when data are ready for writing to disk. mutable bool m_must_save ; public: PlacesMapT() : m_must_save(false) {} /// Finds an object with the same name and close enough. /// If an object with the same name exists but is distant, creates a new one, /// plus a path between the two. /// Called by the main thread at startup when loading the previous KML files. Then later /// called by the subthread in charge of flushing PlacemarkT to the KML file. void DirectInsert( const value_type & refVL, double merge_dist ) { /// Not needed to use equal_range because we need the last placemark matching /// this key, and this iterator is forward_iterator only. iterator it = find( refVL.first ), en = end() ; if( it == en ) { // LOG_INFO("Cannot find '%s'", refVL.first.c_str() ); it = insert( end(), refVL ); return; } /// Searches for the last element with the same key. iterator last = it, next = it ; ++next ; while( next != en && next->first == refVL.first ) { last = next; ++next ; } double dist = last->second.distance_to( refVL.second ); /// We can reuse the last element because it is not too far from our coordinates. if( 1000 * dist < merge_dist ) { /// LOG_INFO("Reusing '%s' merge_dist=%lf", refVL.first.c_str(), dist ); /** There will be one event only if adding a new received event, otherwise several if reloading from a file. The new events will be inserted based on their timestamp. */ // last->second.insert( refVL.second.begin(), refVL.second.end() ); last->second.concatenate( refVL.second ); return ; } // LOG_INFO("Inserted '%s' merge_dist=%lf", refVL.first.c_str(), dist ); /// The object is inserted at the end of all elements with the same key. iterator ret = insert( next, refVL ); /// Runtime check of an assumption. { iterator tst = last ; ++tst ; if( tst != ret ) { LOG_WARN("Iterators assumption is wrong (1): %s", refVL.first.c_str() ); } ++tst ; if( tst != next ) { LOG_WARN("Iterators assumption is wrong (2): %s", refVL.first.c_str() ); } } /// They must have the same style otherwise they will be in different folders. if( refVL.second.style() != last->second.style() ) { LOG_WARN("Correcting style discrepancy %s: %s != %s", refVL.first.c_str(), refVL.second.style().c_str(), last->second.style().c_str() ); ret->second.style( last->second.style() ); } } // DirectInsert /// Enqueues a new placemark for insertion by the subthread. Called by the main thread /// each time a Broadcast of a new PlacemarkT is done. void Enqueue( const std::string & kmlNam, const PlacemarkT & refPM ) { /// So we will save to a file, because something changed. m_queue_to_insert.push_back( value_type( kmlNam, refPM ) ); } /// Called by the subthread. It can merge data of placemarks with the same name /// and different positions due to a move. This has to be very fast because under lock protection. void FlushQueue(double merge_dist) { // LOG_INFO("FlushQueue nbelts %d sz=%d", m_queue_to_insert.size(), size() ); if( m_queue_to_insert.empty() ) return ; for( PlacemarkListT::iterator itPL = m_queue_to_insert.begin(), enPL = m_queue_to_insert.end(); itPL != enPL; ++ itPL ) { DirectInsert( *itPL, merge_dist ); } // LOG_INFO("Flushed into sz=%d", size() ); // TODO: If lock contention problems, we might swap this list with another one owned by this // objet. This would later be merged into the container before saving data to disk. m_queue_to_insert.clear(); m_must_save = true ; } /// Removes obsolete data for one category only. void PruneKmlFile( int retention_delay ) { /// By convention, it means keeping all data. if( retention_delay <= 0 ) return ; /// Called only once per hour, instead of at every call. Saves CPU. static time_t prev_call_tm = 0 ; time_t now = time(NULL); static const int seconds_per_hour = 60 * 60 ; /// First call of this function, always do the processing. if( prev_call_tm != 0 ) { /// If this was called for less than one hour, then return. if( prev_call_tm > now - seconds_per_hour ) return ; } prev_call_tm = now ; /// Cleanup all data older than this. time_t limit_time = now - retention_delay * seconds_per_hour ; LOG_INFO("sz=%d retention=%d hours now=%s limit=%s", (int)size(), retention_delay, KmlTimestamp(now).c_str(), KmlTimestamp(limit_time).c_str() ); size_t nbFullErased = 0 ; size_t nbPartErased = 0 ; for( iterator itMap = begin(), nxtMap = itMap, enMap = end() ; itMap != enMap; itMap = nxtMap ) { PlacemarkT & refP = itMap->second ; ++nxtMap ; /// Erases all elements older than the limit, or the whole element. PlacemarkT::iterator itP = refP.upper_bound( limit_time ); if( itP == refP.end() ) { erase( itMap ); ++nbFullErased ; } else if( itP != refP.begin() ) { refP.erase( refP.begin(), itP ); ++nbPartErased ; } } // Maybe the container only lost data because of data expiration, so it must be saved. bool must_save_now = m_must_save || ( nbFullErased > 0 ) || ( nbPartErased > 0 ) ; LOG_INFO("Sz=%d FullyErased=%d PartialErased=%d m_must_save=%d must_save_now=%d", (int)size(), (int)nbFullErased, (int)nbPartErased, m_must_save, must_save_now ); m_must_save = must_save_now ; } /// This is not efficient because we reopen the file at each access, but it ensures /// that the file is consistent and accessible at any moment. bool RewriteKmlFileOneCategory( const std::string & category, const std::string & kmlFilNam, int balloon_style ) const { // Normally, it is stable when we insert an element with a duplicate key. typedef std::multiset< PlacesMapT::const_iterator, PlacesMapIterSortT > PlacesMapItrSetT ; PlacesMapItrSetT plcMapIterSet ; /// If there is nothing to save, not needed to create a file. if( false == m_must_save ) return false ; /// For safety purpose, we do not empty the file. It might be an error. if( empty() ) { LOG_INFO("Should empty KML file %s. Grace period.", kmlFilNam.c_str() ); return false ; } m_must_save = false ; for( const_iterator itPlcMap = begin(), en = end(); itPlcMap != en ; ++itPlcMap ) { plcMapIterSet.insert( itPlcMap ); } int nbPlacemarks = plcMapIterSet.size(); // This file must be atomic because it is periodically read. // TODO: Checks if another process has locked the ".tmp" file. // If so , we should reread the KML file and merge our data with it. // This would allow to have several fldigi sessions simultaneously running // on the same KML files. On the other hand, it should already work if these // processes are updating different categories, which is more probable. AtomicRenamer ar( kmlFilNam ); KmlHeader(ar, category) ; // This will easily allow hierarchical folders. std::string lastStyle ; for( PlacesMapItrSetT::const_iterator itStyl = plcMapIterSet.begin(), enStyl = plcMapIterSet.end(); itStyl != enStyl; ) { ar << ""; // Hyphen: No idea why, but the string "10-meter discus buoy:W GULF 207 NM " just displays as "10-" ar << ""; StripHtmlTags( ar,(*itStyl)->second.style() ); ar << ""; // Several placemarks with the same name: A single object has moved. PlacesMapItrSetT::const_iterator itStylNext = itStyl ; for(;;) { // TODO: Objects with the same name and different coordinates must be signaled so. (*itStylNext)->second.Serialize( ar, (*itStylNext)->first, balloon_style); ++itStylNext ; if( itStylNext == enStyl ) break ; if( (*itStyl)->second.style() != (*itStylNext)->second.style() ) break ; } // Now, in the same loop, we draw the polylines between placemarks with the same name. for( PlacesMapItrSetT::const_iterator itNamBeg = itStyl, itNamLast = itNamBeg; itNamLast != itStylNext ; ) { PlacesMapItrSetT::const_iterator itNamNxt = itNamLast; ++itNamNxt ; if( ( itNamNxt == itStylNext ) || ( (*itNamNxt)->first != (*itNamLast)->first ) ) { // No point tracing a line with one point only. if( *itNamBeg != *itNamLast ) { DrawPolyline( ar, category, *itNamBeg, *itNamLast ); } itNamBeg = itNamNxt ; } itNamLast = itNamNxt ; } itStyl = itStylNext ; ar << ""; } ar << KmlFooter ; LOG_INFO("Saved %s: %d placemarks to %s", category.c_str(), nbPlacemarks, kmlFilNam.c_str() ); return true ; } // KmlSrvImpl::PlacesMapT::RewriteKmlFileOneCategory }; // KmlSrvImpl::PlacesMapT /// There is a very small number of categories: Synop, Navtex etc... struct PlacemarksCacheT : public std::map< std::string, PlacesMapT > { const PlacesMapT * FindCategory( const std::string & category ) const { const_iterator it = find( category ); if( it == end() ) return NULL ; return &it->second; } PlacesMapT * FindCategory( const std::string & category ) { iterator it = find( category ); if( it == end() ) it = insert( end(), value_type( category, PlacesMapT() ) ); return &it->second ; } }; /// At startup, should be reloaded from the various KML files. PlacemarksCacheT m_placemarks ; /// Used for signaling errors. void close_throw( FILE * ofil, const std::string & msg ) const { if( ofil ) fclose( ofil ); throw std::runtime_error( strformat( "%s:%s", msg.c_str(), strerror(errno) ) ); } /// This points to the specific KML file of the category. void CategoryNetworkLink( std::ostream & strm, const std::string & category ) const { strm << "\n" " " << category << "\n" " \n" " " << category << ".kml\n" " onInterval\n" " " << m_refresh_interval << "\n" " \n" "\n"; } // KmlSrvImpl::CategoryNetworkLink /// This file copy does not need to be atomic because it happens once only. void CopyStyleFileIfNotExists(void) { /// Where the installed file is stored and never moved from. Used as default. std::string namSrc = PKGDATADIR "/kml/" + namStyles ; /// The use might customize its styles file: It will not be altered. std::string namDst = m_kml_dir + namStyles ; /// Used to copy the master file to the user copy if needed. FILE * filSrc = NULL; FILE * filDst = fopen( namDst.c_str(), "r" ); /// If the file is there, leave as it is because it is maybe customize. if( filDst ) { LOG_INFO("Style file %s not altered", namDst.c_str() ); goto close_and_quit ; } filDst = fopen( namDst.c_str(), "w" ); if( filDst == NULL ) { LOG_INFO("Cannot open destination style file %s", namDst.c_str() ); goto close_and_quit ; } filSrc = fopen( namSrc.c_str(), "r" ); if( filSrc == NULL ) { LOG_INFO("Cannot open source style file %s", namSrc.c_str() ); goto close_and_quit ; } /// Transient buffer to copy the file. char buffer[BUFSIZ]; size_t n; while ((n = fread(buffer, sizeof(char), sizeof(buffer), filSrc)) > 0) { if (fwrite(buffer, sizeof(char), n, filDst) != n) { LOG_WARN("Error %s copying style file %s to %s", strerror(errno), namSrc.c_str(), namDst.c_str() ); goto close_and_quit ; } } LOG_INFO("Style file %s copied to %s", namSrc.c_str(), namDst.c_str() ); close_and_quit: if( filDst ) fclose(filDst); if( filSrc ) fclose(filSrc); } /// This creates a KML file with links to the categories such as Synop and Navtex. void CreateMainKmlFile(void) { // This is the file, that the user must click on. std::string baseFil = m_kml_dir + "fldigi.kml" ; LOG_INFO("Creating baseFil=%s", baseFil.c_str() ); /// We do not need to make this file atomic because it is read once only. AtomicRenamer ar( baseFil ); KmlHeader( ar, "Fldigi"); for( size_t i = 0; i < nb_categories; ++i ) CategoryNetworkLink( ar, categories[i] ); ar << KmlFooter ; } // TODO: Consider hierarchical categories: "Synop/buoy/Inmarsat" /// A specific name is chosen so we can later update this line. static void DrawPolyline( std::ostream & ostrm, const std::string & category, PlacesMapT::const_iterator beg, PlacesMapT::const_iterator last ) { /// The polyline gets an id based on the beginning of the path, which will never change. ostrm << "second.KmlId() << ":Path\">" "" << beg->second.KmlId() << "" "" "clampToGround1\n" "\n"; double dist = 0.0 ; int nbStops = 0 ; // "135.2, 35.4, 0. for(;;) { beg->second.WriteCooSub( ostrm ); ostrm << "\n"; if( beg == last ) break ; PlacesMapT::const_iterator next = beg ; ++next ; ++nbStops; dist += beg->second.coordinates().distance( next->second.coordinates() ); beg = next ; }; ostrm << "" "" "" << dist << " " << _("kilometers") << " in " << nbStops << " " << _("stops") << "" "" "\n"; } // DrawPolyline /// Similar to a std::ofstream but atomically updated by renaming a temp file. struct AtomicRenamer : public std::ofstream { /// Target file name. std::string m_filnam ; /// Temporary file name. Renamed to the target when closed. std::string m_filtmp ; public: /// This opens a temporary file when all the writing is done. AtomicRenamer( const std::string & filnam ) : m_filnam( filnam ) , m_filtmp( filnam + ".tmp" ) { // LOG_INFO("AtomicRenamer opening tmp %s", filnam.c_str() ); open( m_filtmp.c_str() ); if( bad() ) { LOG_WARN("Cannot open %s", m_filtmp.c_str() ); } } /// Atomic because rename is an atomic too, and very fast if in same directory. ~AtomicRenamer() { close(); /// This is needed on Windows. int ret_rm = remove( m_filnam.c_str() ); if( ( ret_rm != 0 ) && ( errno != ENOENT ) ) { LOG_WARN("Cannot remove %s: %s", m_filnam.c_str(), strerror(errno) ); } int ret_mv = rename( m_filtmp.c_str(), m_filnam.c_str() ); if( ret_mv ) { LOG_WARN("Cannot rename %s to %s:%s", m_filtmp.c_str(), m_filnam.c_str(), strerror(errno) ); } } }; /// The KML filename associated to a category. std::string CategFile( const std::string & category ) const { return m_kml_dir + category + ".kml"; } /// Resets the files. Called from the test program and the GUI. void CreateNewKmlFile( const std::string & category ) const { // This file must be atomic because it is periodically read. AtomicRenamer ar( CategFile( category ) ); KmlHeader( ar, category); ar << KmlFooter ; } /// Template parameters should not be local types. struct PlacesMapIterSortT { // This sort iterators on placemarks, based on the style name then the placemark name. bool operator()( const PlacesMapT::const_iterator & it1, const PlacesMapT::const_iterator & it2 ) const { int res = it1->second.style().compare( it2->second.style() ); if( res == 0 ) res = it1->first.compare( it2->first ); return res < 0 ; } }; /// Various states of the KML reader. #define KMLRD_NONE 1 #define KMLRD_FOLDER 2 #define KMLRD_FOLDER_NAME 3 #define KMLRD_FOLDER_PLACEMARK 4 #define KMLRD_FOLDER_PLACEMARK_NAME 5 #define KMLRD_FOLDER_PLACEMARK_POINT 6 #define KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES 7 #define KMLRD_FOLDER_PLACEMARK_STYLEURL 8 #define KMLRD_FOLDER_PLACEMARK_SNIPPET 9 #define KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA 10 #define KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT 11 #define KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT_FLDIGIITEM 12 #define KMLRD_FOLDER_PLACEMARK_UNDEFINED 13 #define KMLRD_FOLDER_UNDEFINED 14 /// Debugging purpose only. static const char * KmlRdToStr( int kmlRd ) { #define KMLRD_CASE(k) case k : return #k ; switch(kmlRd) { KMLRD_CASE(KMLRD_NONE) KMLRD_CASE(KMLRD_FOLDER) KMLRD_CASE(KMLRD_FOLDER_NAME) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_NAME) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_POINT) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_STYLEURL) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_SNIPPET) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_UNDEFINED) KMLRD_CASE(KMLRD_FOLDER_UNDEFINED) default : return "Unknown KMLRD code"; } #undef KMLRD_CASE } /// Loads a file of a previous session. The mutex should be locked at this moment. void ReloadSingleKmlFile( const std::string & category ) { std::string kmlFilNam = CategFile( category ); LOG_INFO("kmlFilNam=%s m_merge_dist=%lf", kmlFilNam.c_str(), m_merge_dist ); PlacesMapT *ptrMap = m_placemarks.FindCategory( category ); FILE * filKml = fopen( kmlFilNam.c_str(), "r" ); if( filKml == NULL ) { LOG_ERROR("Could not open %s. Creating one.", kmlFilNam.c_str() ); CreateNewKmlFile( category ); return ; } /// The destructor ensures the file will be closed if an exception is thrown. struct FilCloserT { FILE * m_file ; ~FilCloserT() { fclose(m_file); } } Closer = { filKml }; std::auto_ptr< irr::io::IrrXMLReader > xml( irr::io::createIrrXMLReader( Closer.m_file ) ); if( xml.get() == NULL ) { LOG_ERROR("Could not parse %s", kmlFilNam.c_str() ); return ; } using namespace irr::io ; int currState = KMLRD_NONE ; std::string currFolderName ; std::string currPlcmrkName ; time_t currTimestamp = 0; std::string currPlacemarkDescr ; CustomDataT currCustData ; PlacemarkT currPM; bool currIsPoint = false ; std::string avoidNode ; /// Stores the unique nodes which are misplaced. typedef std::set< std::string > UnexpectedNodesT ; UnexpectedNodesT unexpectedNodes ; // ship // 146.8,-19.2,0 // Ship:AUP06 // styles.kml#ship // 2012-09-24 12:00read()) { switch(xml->getNodeType()) { case EXN_TEXT: { if( ! avoidNode.empty() ) break ; const char * msgTxt = xml->getNodeData(); LOG_DEBUG( "getNodeData=%s currState=%s", msgTxt, KmlRdToStr(currState) ); switch(currState) { case KMLRD_FOLDER_NAME : currFolderName = msgTxt ? msgTxt : "NullFolder"; break; case KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES : currPM.SetCoordinates(msgTxt); break; case KMLRD_FOLDER_PLACEMARK_NAME : currPlcmrkName = msgTxt ? msgTxt : "NullPlacemarkName"; break; case KMLRD_FOLDER_PLACEMARK_SNIPPET : currPlacemarkDescr = msgTxt ? msgTxt : "NullSnippet"; break; case KMLRD_FOLDER_PLACEMARK_STYLEURL : currPM.SetStyle(msgTxt); break; default: break; } break; } case EXN_ELEMENT: { if( ! avoidNode.empty() ) break ; const char *nodeName = xml->getNodeName(); // LOG_INFO( "getNodeName=%s currState=%s", nodeName, KmlRdToStr(currState) ); // TODO: Have a hashmap for each case. switch(currState) { case KMLRD_NONE : if (!strcmp("Folder", nodeName)) { currState = KMLRD_FOLDER ; } else { /// These tags are not meaningful for us. if( strcmp( "kml", nodeName ) && strcmp( "Document", nodeName ) && strcmp( "name", nodeName ) ) { LOG_INFO("Unexpected %s in document %s. currState=%s", nodeName, category.c_str(), KmlRdToStr(currState) ); } } break; case KMLRD_FOLDER : if (!strcmp("name", nodeName)) { currState = KMLRD_FOLDER_NAME ; } else if (!strcmp("Placemark", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK ; currPM.Clear(); const char * strId = xml->getAttributeValue("id"); currPM.SetKmlId( strId ); } else { avoidNode = nodeName ; currState = KMLRD_FOLDER_UNDEFINED ; LOG_INFO("Unexpected %s in folder %s. currState=%s", nodeName, currFolderName.c_str(), KmlRdToStr(currState) ); } break; case KMLRD_FOLDER_PLACEMARK : // There are different sorts of Placemark such as Point or LineString. if (!strcmp("Point", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_POINT ; currIsPoint = true ; } else if (!strcmp("name", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_NAME ; } else if (!strcmp("Snippet", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_SNIPPET ; } else if (!strcmp("styleUrl", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_STYLEURL ; } else if (!strcmp("ExtendedData", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA ; } else if (!strcmp("description", nodeName)) { // We do not care about this tag, but it is always here. currState = KMLRD_FOLDER_PLACEMARK_UNDEFINED ; } else { avoidNode = nodeName ; currState = KMLRD_FOLDER_PLACEMARK_UNDEFINED ; /// At the same time, it is detected and inserted. std::pair< UnexpectedNodesT::iterator, bool > pr = unexpectedNodes.insert( nodeName ); // Other occurences of the same nodes will not be signaled. if( pr.second ) { LOG_INFO("Unexpected %s in placemark id=%s name=%s. currState=%s", nodeName, currPM.KmlId().c_str(), currPlcmrkName.c_str(), KmlRdToStr(currState) ); } } break; case KMLRD_FOLDER_PLACEMARK_POINT : if (!strcmp("coordinates", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES ; } else { LOG_INFO("Unexpected %s in coordinates. currState=%s", nodeName, KmlRdToStr(currState) ); } break; case KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA: if (!strcmp(FLDIGI_TAG_EVT, nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT ; currTimestamp = KmlFromTimestamp( xml->getAttributeValue(FLDIGI_TIMESTAMP) ); currCustData.clear(); } else LOG_INFO("Unexpected %s in extended data. currState=%s", nodeName, KmlRdToStr(currState) ); break; case KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT: // http://irrlicht.sourceforge.net/forum/viewtopic.php?t=10532 // The Parser irrXml will not call "EXN_ELEMENT_END" because the tag // has a trailing slash. Therefore we stay in the same state. // We could call irr::io::IIrrXMLReader<...>::isEmptyElement() to check that. if (!strcmp(FLDIGI_TAG_ITM, nodeName)) { assert( xml->isEmptyElement() ); const char * strKey = xml->getAttributeValue(FLDIGI_TAG_KEY); if(strKey == NULL ) { LOG_INFO("Null item key"); break ; } const char * strVal = xml->getAttributeValue(FLDIGI_TAG_VAL); if(strVal == NULL ) { LOG_INFO("Null item value"); break ; } currCustData.Push( strKey, strVal ); } else LOG_INFO("Unexpected %s in event. currState=%s", nodeName, KmlRdToStr(currState) ); break; default: break; } break; } case EXN_ELEMENT_END: { if( ! avoidNode.empty() ) { const char * msgTxt = xml->getNodeData(); if( avoidNode == msgTxt ) { // LOG_INFO("Leaving forbidden element %s. currState=%s", avoidNode.c_str(), KmlRdToStr(currState) ); // We can leave the quarantine. avoidNode.clear(); } else { // LOG_INFO("Still in forbidden element %s, leaving %s. currState=%s", // avoidNode.c_str(), msgTxt, KmlRdToStr(currState) ); break ; } } // We should check that this string matches wuth the state expects, but this is much // faster to use only integers. // LOG_INFO("End of %s currState=%s", xml->getNodeData(), KmlRdToStr(currState) ); switch(currState) { case KMLRD_FOLDER : currState = KMLRD_NONE ; break; case KMLRD_FOLDER_PLACEMARK : // Loads only "Point" placemarks. Do not load "Linestring". if( ( ! currPlcmrkName.empty() ) && currIsPoint ) { ptrMap->DirectInsert( PlacesMapT::value_type( currPlcmrkName, currPM ), m_merge_dist ); } currTimestamp = -1 ; currPlacemarkDescr.clear(); currPlcmrkName.clear(); currIsPoint = false ; currState = KMLRD_FOLDER ; break; case KMLRD_FOLDER_NAME : case KMLRD_FOLDER_UNDEFINED : currState = KMLRD_FOLDER ; break; case KMLRD_FOLDER_PLACEMARK_NAME : case KMLRD_FOLDER_PLACEMARK_POINT : case KMLRD_FOLDER_PLACEMARK_STYLEURL : case KMLRD_FOLDER_PLACEMARK_SNIPPET : case KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA : case KMLRD_FOLDER_PLACEMARK_UNDEFINED : currState = KMLRD_FOLDER_PLACEMARK ; break; case KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES : currState = KMLRD_FOLDER_PLACEMARK_POINT ; break; case KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT : currState = KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA ; // TODO: As soon as possible, use std::move for performance. currPM.AppendEvent( currTimestamp, currPlacemarkDescr, currCustData ); currCustData.clear(); break; case KMLRD_NONE: break; default: LOG_ERROR("Should not happen %s", KmlRdToStr(currState)); break; } // LOG_INFO("currState=%s", KmlRdToStr(currState) ); break; } case EXN_NONE: case EXN_COMMENT: case EXN_CDATA: case EXN_UNKNOWN: break; default: // LOG_INFO( "Default NodeType=%d", xml->getNodeType()); break; } } LOG_INFO("kmlFilNam=%s loaded sz=%d", kmlFilNam.c_str(), (int)ptrMap->size() ); } // KmlSrvImpl::ReloadSingleKmlFile /// Rewrites only the categories which have changed. bool RewriteKmlFileFull(void) { bool wasSaved = false ; // LOG_INFO("nb_categories=%d", nb_categories ); for( size_t i = 0; i < nb_categories; ++i ) { const char * category = categories[i]; PlacesMapT *ptrMap = m_placemarks.FindCategory( category ); if( ptrMap == NULL ) { LOG_INFO("Category %s undefined", category ); continue; } ptrMap->PruneKmlFile( m_retention_delay ); wasSaved |= ptrMap->RewriteKmlFileOneCategory( category, CategFile( category ), m_balloon_style ); } return wasSaved ; } // KmlSrvImpl::RewriteKmlFileFull #ifdef FLDIGI_KML_CONDITION_VARIABLE /// This is signaled when geographic data is broadcasted. pthread_cond_t m_cond_queue ; #else /// This is set to true when geographic data is broadcasted. bool m_bool_queue ; /// This tells that the subthread must leave at the first opportunity. bool m_kml_must_leave; #endif pthread_mutex_t m_mutex_write ; typedef std::list< PlacemarkT > PlacemarkListT ; PlacemarkListT m_queues[ nb_categories ]; /// Called in a subthread. Woken up by a timed condition to save content to a KML file. void * ThreadFunc(void) { MilliSleep(2000); // Give time enough to load data. int r ; // This is normally the default behaviour. r = pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL ); if( r != 0 ) { LOG_ERROR("pthread_setcancelstate %s", strerror(errno) ); return NULL; } r = pthread_setcanceltype( PTHREAD_CANCEL_DEFERRED, NULL ); if( r != 0 ) { LOG_ERROR("pthread_setcanceltype %s", strerror(errno) ); return NULL; } int refresh_delay = m_refresh_interval ; // Endless loop until end of program, which cancels this subthread. for(;;) { #ifdef FLDIGI_KML_CONDITION_VARIABLE struct timespec tmp_tim; { guard_lock myGuard( &m_mutex_write ); // It does not need to be very accurate. tmp_tim.tv_sec = time(NULL) + refresh_delay; tmp_tim.tv_nsec = 0 ; // LOG_INFO("About to wait %d seconds", refresh ); r = pthread_cond_timedwait( &m_cond_queue, &m_mutex_write, &tmp_tim ); if( ( r != ETIMEDOUT ) && ( r != 0 ) ) { LOG_ERROR("pthread_cond_timedwait %s d=%d", strerror(errno), m_refresh_interval ); return (void *)"Error in pthread_cond_timed_wait"; } #else /// On the platforms where pthread_cond_timedwait has problems, everything behaves // as if there was a timeout when data is saved. refresh_delay is never changed. for( int i = 0; i < refresh_delay; ++i ) { MilliSleep( 1000 ); if( m_kml_must_leave ) { LOG_INFO("Exit flag detected. Leaving"); return (void *)"Exit flag detected"; } } { guard_lock myGuard( &m_mutex_write ); r = m_bool_queue ? ETIMEDOUT : 0 ; m_bool_queue = false; #endif // Except if extremely slow init, the object should be ready now: Files loaded etc... if( ! m_loaded ) { static int nb_retries = 3 ; if( nb_retries == 0 ) { static const char * error_message = "KML server could not start. Leaving"; LOG_ERROR("%s", error_message ); return (void *)error_message ; } --nb_retries ; LOG_INFO("KML server not ready yet. Cnt=%d. Restarting.",nb_retries); MilliSleep(1000); // Give time to load data. continue ; } // We might have missed the condition signal so a quick check will not do any harm. for( size_t i = 0; i < nb_categories; ++i ) { PlacesMapT *ptrMap = m_placemarks.FindCategory( categories[i] ); if( ptrMap == NULL ) { LOG_INFO("Category %s undefined", categories[i] ); continue; } // TODO: If there are contention problems, internally swap the queue // with a fresh empty one. ptrMap->FlushQueue( m_merge_dist ); } // LOG_INFO("Releasing lock" ); } if( r == ETIMEDOUT ) { // LOG_INFO("Saving after wait=%d", refresh ); bool wasSaved = RewriteKmlFileFull(); // Maybe a user process must be created to process these KML files. if(wasSaved) { SpawnCommand(); } // Reset the interval to the initial value. refresh_delay = m_refresh_interval ; #ifdef FLDIGI_KML_CONDITION_VARIABLE } else { refresh_delay = tmp_tim.tv_sec - time(NULL); if( refresh_delay <= 0 ) refresh_delay = 1 ; // LOG_INFO("Interrupted when waiting. Restart with wait=%d", refresh ); #endif } } // Endless loop. return NULL ; } // ThreadFunc /// The C-style function called by pthread. static void * ThreadFunc( void * ptr ) { return static_cast< KmlSrvImpl *>(ptr)->ThreadFunc(); }; public: /// When setting or changing core parameters. void InitParams( const std::string & kml_command, const std::string & kml_dir, double kml_merge_distance, int kml_retention_delay, int kml_refresh_interval, int kml_balloon_style) try { /// The thread should NOT access anything at this moment. guard_lock myGuard( &m_mutex_write ); /// If the string is empty, no command is executed. m_command = kml_command; strtrim( m_command ); m_merge_dist = kml_merge_distance ; m_retention_delay = kml_retention_delay ; static const int min_refresh = 10 ; if( kml_refresh_interval < min_refresh ) { LOG_WARN("Refresh interval too small %d minimum is %d", kml_refresh_interval, min_refresh ); kml_refresh_interval = min_refresh ; } m_refresh_interval = kml_refresh_interval ; m_balloon_style = kml_balloon_style ; LOG_INFO("dir=%s merge_distance=%lf retention_delay=%d refresh_interval=%d balloon_style=%d", kml_dir.c_str(), kml_merge_distance, kml_retention_delay, kml_refresh_interval, kml_balloon_style ); m_kml_dir = kml_dir ; /// This enforces that the directory name always ends with a slash. if( m_kml_dir[ m_kml_dir.size() - 1 ] != '/' ) m_kml_dir += '/' ; const char * resdir = create_directory( m_kml_dir.c_str() ); if ( resdir ) { throw std::runtime_error( strformat( "Cannot create %s:%s", m_kml_dir.c_str(), resdir ) ); } CreateMainKmlFile(); CopyStyleFileIfNotExists(); } catch (const std::exception & exc) { // We assume that the calling program has no try/catch handler. LOG_ERROR("Caught exception:%s", exc.what() ); } catch (...) { LOG_ERROR("Caught unknown exception"); } virtual void ReloadKmlFiles() { /// The thread should NOT access anything at this moment. guard_lock myGuard( &m_mutex_write ); // This loads placemarks without the subthread, because it is simpler. for( size_t i = 0; i < nb_categories; ++i ) { try { ReloadSingleKmlFile( categories[i] ); } catch( const std::exception & exc ) { LOG_INFO("Category %s. Caught %s", categories[i], exc.what() ); } } // Now the object is usable. Theoretically should be protected by a mutex. LOG_DEBUG("Object ready"); /// Even if an exception was thrown when loading the previous file, it does not /// prevent to overwrite the old files with new and clean ones. m_loaded = true ; } /// Invalid values everywhere, intentionnaly. KmlSrvImpl() : m_loaded(false) , m_pid_command(-1) , m_merge_dist(-1.0) , m_retention_delay(-1) , m_refresh_interval(-1) , m_balloon_style(0) { LOG_DEBUG("Creation"); #ifdef FLDIGI_KML_CONDITION_VARIABLE pthread_cond_init( &m_cond_queue, NULL ); #else m_bool_queue = false; m_kml_must_leave = false; #endif pthread_mutex_init( &m_mutex_write, NULL ); /// TODO: Add this thread to the other fldigi threads stored in cbq[]. if( pthread_create( &m_writer_thread, NULL, ThreadFunc, this ) ) { /// It is not urgent because this does not interact with the main thread. LOG_ERROR("pthread_create %s", strerror(errno) ); } } /** We cannot use KML updates with a local file: * "I want to know if it exists any solution to put relative paths in a * targetHref to load upload files in a directory in my computer simply * without any server running." * "Unfortunately, no, the security restrictions around prevent * this explicitly." */ /// iconNam: wmo automated fixed other dart buoy oilrig tao void Broadcast( const std::string & category, time_t evtTim, const CoordinateT::Pair & refCoo, double altitude, const std::string & kmlNam, const std::string & styleNam, const std::string & descrTxt, const CustomDataT & custDat ) { /// Hyphen: No idea why, but the string "10-meter discus buoy:W GULF 207 NM " just displays as "10-" std::string tmpKmlNam = strreplace( kmlNam, "-", " "); PlacemarkT currPM( refCoo, altitude, styleNam, tmpKmlNam ); currPM.AppendEvent( evtTim, descrTxt, custDat ); guard_lock myGuard( &m_mutex_write ); ++KmlServer::m_nb_broadcasts; PlacesMapT *ptrMap = m_placemarks.FindCategory( category ); if(ptrMap == NULL ) { LOG_ERROR("Category %s undefined", category.c_str()); } ptrMap->Enqueue( tmpKmlNam, currPM ); #ifdef FLDIGI_KML_CONDITION_VARIABLE pthread_cond_signal( &m_cond_queue ); #else m_bool_queue = true; #endif LOG_INFO("'%s' sz=%d time=%s nb_broad=%d m_merge_dist=%lf", descrTxt.c_str(), (int)ptrMap->size(), KmlTimestamp(evtTim).c_str(), KmlServer::m_nb_broadcasts,m_merge_dist ); } /// It flushes the content to disk. ~KmlSrvImpl() { { /// This will not be killed in the middle of the writing. LOG_INFO("Cancelling writer thread"); guard_lock myGuard( &m_mutex_write ); #ifdef FLDIGI_KML_CONDITION_VARIABLE LOG_INFO("Cancelling subthread"); int r = pthread_cancel( m_writer_thread ); if( r ) { LOG_ERROR("pthread_cancel %s", strerror(errno) ); return ; } #else LOG_INFO("Setting exit flag."); m_kml_must_leave = true ; #endif } // LOG_INFO("Joining subthread"); void * retPtr; int r = pthread_join( m_writer_thread, &retPtr ); if( r ) { LOG_ERROR("pthread_join %s", strerror(errno) ); return ; } const char * msg = (retPtr == NULL) ? "Null" : (retPtr == PTHREAD_CANCELED) ? "Canceled thread" : static_cast(retPtr); LOG_INFO("Thread stopped. Message:%s", msg ); /// Here we are sure that the subthread is stopped. The subprocess is not called. RewriteKmlFileFull(); #ifdef FLDIGI_KML_CONDITION_VARIABLE pthread_cond_destroy( &m_cond_queue ); #endif pthread_mutex_destroy( &m_mutex_write ); } /// Empties the generated files. void Reset(void) { for( size_t i = 0; i < nb_categories; ++i ) { CreateNewKmlFile(categories[i]); } ResetCounter(); } /// This is called when KML files are saved, or on demand from the configuration tab. void SpawnCommand() { if( m_command.empty() ) return ; /** This stores the process id so the command is not restarted if still running. This allows to start for example Google Earth only once. But this allows also to run GPS_Babel for each new set of files, as soon as they are created. */ int is_proc_still_running = test_process( m_pid_command ); if( is_proc_still_running == -1 ) return ; if( ( m_pid_command <= 0 ) || ( is_proc_still_running == 0 ) ) { m_pid_command = fork_process( m_command.c_str() ); LOG_INFO("%s: Pid=%d Command=%s", __FUNCTION__, m_pid_command, m_command.c_str() ); } } }; // KmlSrvImpl /// Singleton. It must be destroyed at the end. static KmlServer * g_inst = NULL; static KmlSrvImpl * Pointer() { if( NULL == g_inst ) { g_inst = new KmlSrvImpl(); } KmlSrvImpl * p = dynamic_cast< KmlSrvImpl * >( g_inst ); if( p == NULL ) { LOG_ERROR("Null pointer"); throw std::runtime_error("KmlServer not initialised"); } return p ; } std::string KmlServer::Tm2Time( time_t tim ) { char bufTm[24]; tm tmpTm; gmtime_r( &tim, & tmpTm ); sprintf( bufTm, "%4d-%02d-%02d %02d:%02d", tmpTm.tm_year + 1900, tmpTm.tm_mon + 1, tmpTm.tm_mday, tmpTm.tm_hour, tmpTm.tm_min ); return bufTm; } /// Returns current time. std::string KmlServer::Tm2Time( ) { return Tm2Time( time(NULL) ); } /// One singleton for everyone. KmlServer * KmlServer::GetInstance(void) { return Pointer(); } /// This creates a process running the user command. void KmlServer::SpawnProcess() { Pointer()->SpawnCommand(); } /// Called by thr main program, clean exit. void KmlServer::Exit(void) { // We assume that the calling program has no try/catch handler. // LOG_INFO("Exiting"); try { KmlServer * pKml = Pointer(); if( pKml ) { delete pKml; } } catch (const std::exception & exc) { LOG_ERROR("Caught exception:%s",exc.what() ); } catch (...) { LOG_ERROR("Caught unknown exception"); } } fldigi-3.21.80/src/misc/pixmaps.cxx0000664000175000017500000014631012313064025013776 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include // This file contains custom icons, icons from gtk, and possibly other sources. /* XPM */ const char *waterfall_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 5 1", " c None", ". c #124188", "+ c #788D9B", "@ c #ABCBE2", "# c #204A87", " ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@##@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@##@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@##@..+.. ", " ..+..@@@@..+.. ", " ..+..@##@..+.. ", " "}; // audio-card from gnome icon theme /* XPM */ const char *audio_card_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 102 2", " c #3A3E00", ". c #3A3F00", "X c #3B3F00", "o c #2F3536", "O c #303634", "+ c #303735", "@ c #303637", "# c #363D32", "$ c #323835", "% c #313836", "& c #333936", "* c #323937", "= c #343936", "- c #383E31", "; c #3B4000", ": c #3D4104", "> c #3E4206", ", c #657000", "< c #677300", "1 c #687400", "2 c #687502", "3 c #687505", "4 c #6B7704", "5 c #6B7901", "6 c #6C7900", "7 c #6C7801", "8 c #6D7A00", "9 c #6C7A02", "0 c #6F7D01", "q c #707E02", "w c #707E07", "e c #404630", "r c #3D5B50", "t c #38595E", "y c #38595F", "u c #395A5F", "i c #365761", "p c #405C4F", "a c #545650", "s c #545652", "d c #555753", "f c #565852", "g c #565853", "h c #565854", "j c #575955", "k c #585A56", "l c #5A5C58", "z c #5D5E5B", "x c #5E5F5C", "c c #426050", "v c #426251", "b c #646662", "n c #656663", "m c #666864", "M c #676965", "N c #696A67", "B c #696B67", "V c #6E6F6D", "C c #6E706C", "Z c #6F716D", "A c #758201", "S c #748202", "D c #798708", "F c #7F8839", "G c #A3B31A", "H c #A4B31A", "J c #A4B419", "K c #AABA1A", "L c #858E39", "P c #848D3B", "I c #878F3D", "U c #87903B", "Y c #8A9539", "T c #8C9638", "R c #919C38", "E c #949E39", "W c #959F3A", "Q c #959F3B", "! c #929D3C", "~ c #939E3C", "^ c #959F3D", "/ c #95A03C", "( c #96A03C", ") c #97A03C", "_ c #97A13C", "` c #97A23D", "' c #D8EB31", "] c #DBEF33", "[ c #DFF234", "{ c #E0F338", "} c #E4F839", "| c #E8FB38", " . c #EBFF39", ".. c #EFFF65", "X. c #B7B9B5", "o. c #C4C6C2", "O. c #C6C8C4", "+. c #C7C9C5", "@. c #C8CAC6", "#. c #D0D2CE", "$. c #D4D6D2", "%. c None", /* pixels */ "%.%.%.%.%.%.%.%.%.%.%.%.j k j %.", "%.%.%.%.%.%.%.%.%.%.%.d O.#.X.d ", "X a $.d d %.", " E W W W Q Q ( ( ( ^ f $.d %.%.", " ` e * * % % + # c v f $.d l x ", " ` + V Z Z Z C & y u f $.d o.d ", " ` + Z d d d N = 3 8 f $.d h g ", " _ + B M m n b $ p t f $.d %.%.", " ) - @ o o o o O r i f $.d k z ", " / A q 0 9 5 2 1 < , f $.d @.d ", " ~ K S J 6 H 7 G U I f $.d d h ", " ! { D ' 4 ] w [ P : a $.d %.%.", " T ..R } L | Y .F > s $.d %.%.", "; X X X X X X . . . . s +.d %.%.", "%.%.%.%.%.%.%.%.%.%.%.d d d %.%.", "%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%." }; // help-about from gnome /* XPM */ const char *help_about_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 76 1", " c #C4A001", ". c #C5A101", "X c #C5A102", "o c #C6A202", "O c #C6A203", "+ c #C7A403", "@ c #C7A404", "# c #C7A405", "$ c #C7A406", "% c #C7A407", "& c #C7A507", "* c #C8A508", "= c #C9A70B", "- c #C9A80D", "; c #CAA80C", ": c #C9A810", "> c #CCAC12", ", c #CCAC14", "< c #CDAE1B", "1 c #CFB11C", "2 c #D0B11F", "3 c #CFB021", "4 c #D2B522", "5 c #D3B62C", "6 c #D2B62F", "7 c #F6E132", "8 c #F6E235", "9 c #F5E038", "0 c #F7E23A", "q c #F8E33C", "w c #F8E43E", "e c #D9C04A", "r c #E4CE4C", "t c #E4CE4F", "y c #E7D041", "u c #E7D247", "i c #EBD755", "p c #EBD756", "a c #ECD85A", "s c #F8E441", "d c #F9E644", "f c #F6E349", "g c #FBE74A", "h c #F9E74D", "j c #F7E75F", "k c #F8E75A", "l c #FBE95C", "z c #E9D668", "x c #EAD86C", "c c #F6E664", "v c #F6E667", "b c #F8E864", "n c #F8E865", "m c #F9E96B", "M c #FAEB71", "N c #F9EB73", "B c #F8EA7B", "V c #FAEC7C", "C c #F9EC7F", "Z c #EEDF83", "A c #EEDF85", "S c #F7E981", "D c #F8EC88", "F c #F9ED89", "G c #FAED8B", "H c #F8EB8F", "J c #F9EE9B", "K c #FBF097", "L c #FCF2A6", "P c #FCF3AA", "I c #FDF6BC", "U c #FCF7CF", "Y c #FDF8D1", "T c #FDF9DF", "R c #FEFCEE", "E c None", /* pixels */ "EEEEEEE.EEEEEEEE", "EEEEEE@e@EEEEEEE", "EEEEEE3TEEEEEEE", "EEEEEE&4&EEEEEEE", "EEEEEEE EEEEEEEE", "EEEEEEEEEEEEEEEE" }; // insert link icon from gnome /* XPM */ const char *insert_link_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 97 2", " c #2E3436", ". c #2F3536", "X c #363C3D", "o c #373D3E", "O c #464A48", "+ c #464B4C", "@ c #4F524F", "# c #545652", "$ c #555753", "% c #575955", "& c #585A56", "* c #595B57", "= c #5A5B57", "- c #5A5C58", "; c #5B5D58", ": c #5C5D59", "> c #62645F", ", c #656763", "< c #6B6D69", "1 c #6E6F6B", "2 c #6F716D", "3 c #71726F", "4 c #767773", "5 c #777875", "6 c #7C7E79", "7 c #7C7F79", "8 c #CF5F04", "9 c #D06106", "0 c #D86605", "q c #D86706", "w c #F47A03", "e c #F47A04", "r c #F47D0B", "t c #E97910", "y c #E97911", "u c #7E807D", "i c #EA9D4C", "p c #F4B15E", "a c #F5B364", "s c #FDC97D", "d c #838580", "f c #8A8C87", "g c #979B96", "h c #989B95", "j c #9FA19D", "k c #B3B4B0", "l c #B4B7B0", "z c #B7B7B1", "x c #B5B7B2", "c c #B5B8B2", "v c #BABDB6", "b c #BBBEB7", "n c #BBBEB8", "m c #BDBEBB", "M c #C0C0BC", "N c #C2C3BF", "B c #FBD7AA", "V c #FBD9AE", "C c #C4C6C0", "Z c #C5C7C1", "A c #CBCEC8", "S c #CCCEC9", "D c #D0D1CE", "F c #D1D3CE", "G c #D4D4D0", "H c #D6D7D6", "J c #D9DAD8", "K c #DBDCDB", "L c #DEDEDA", "P c #DFDFDD", "I c #FDE6C4", "U c #FEE9CA", "Y c #FEEACC", "T c #E0E0DC", "R c #E0E0DD", "E c #E2E3E2", "W c #E4E4E1", "Q c #E6E6E4", "! c #E7E8E6", "~ c #E9E9E6", "^ c #E8E9E8", "/ c #EDEDEB", "( c #EDEDEC", ") c #EDEEED", "_ c #EEEEEC", "` c #EFF0EE", "' c #F1F1F0", "] c #F3F3F1", "[ c #F3F3F2", "{ c #F4F5F4", "} c #F5F5F4", "| c #F6F6F5", " . c #F6F6F6", ".. c #F8F8F7", "X. c #F9F9F9", "o. c #FDFDFD", "O. c None", /* pixels */ "O.# # # # ; O.O.O.O.O.O.O.O.; # ", "O. .{ [ ` J u - O.O.O.O.- H ) o.", "O.v v v b C F < # $ $ # 5 / A n ", "O.# * $ * 7 b h 1 m m 1 x Z 6 % ", "O.O.& R Q 2 $ $ $ $ $ $ $ $ 3 K ", "O.O.: z L ] } ...X.| ' ( ^ ! E ", "O.O @ 4 M G T W ~ _ P D N k j f ", "O.S c d , = $ $ $ $ $ $ $ $ & > ", "O.v v v l g + X O.O.O.O.X + g l ", "O. . o O.O.O.O.O.O.O.O.o . ", "O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.", "O.O.O.O.O.w e r r r r r e w O.O.", "O.O.O.O.O.O.y V Y I U B t O.O.O.", "O.O.O.O.O.O.O.q a s p 0 O.O.O.O.", "O.O.O.O.O.O.O.O.9 i 9 O.O.O.O.O.", "O.O.O.O.O.O.O.O.O.8 O.O.O.O.O.O." }; // close icon from default gtk theme /* XPM */ const char *close_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 74 1", " c #5A5C58", ". c #5C5E5B", "X c #5C5F5B", "o c #5D5F5B", "O c #5E5F5B", "+ c #5E5F5C", "@ c #5D605A", "# c #5D605B", "$ c #5C615B", "% c #5F605A", "& c #5E615B", "* c #5E605C", "= c #5F605C", "- c #5E615C", "; c #5F615C", ": c #5E605D", "> c #5E615D", ", c #5F625C", "< c #5F625D", "1 c #5F615E", "2 c #5F625E", "3 c #60615B", "4 c #60625D", "5 c #60615E", "6 c #60625E", "7 c #61625E", "8 c #61645F", "9 c #7D807A", "0 c #7E817B", "q c #80827B", "w c #80837E", "e c #82847D", "r c #82857E", "t c #838680", "y c #848681", "u c #848781", "i c #868983", "p c #878983", "a c #868984", "s c #888A85", "d c #898C86", "f c #898D86", "g c #8A8C86", "h c #8A8D88", "j c #8D9089", "k c #8E908A", "l c #8E918B", "z c #8F928C", "x c #8F928D", "c c #91938E", "v c #92948F", "b c #949590", "n c #949691", "m c #959892", "M c #959992", "N c #969994", "B c #979B95", "V c #B1B4AC", "C c #B4B7AF", "Z c #B8BBB3", "A c #B9BCB4", "S c #BABDB5", "D c #BDC0B8", "F c #BDC1B9", "G c #BFC3BB", "H c #C1C4BC", "J c #C3C6BE", "K c #C3C7BF", "L c #C4C8C0", "P c #C5C9C1", "I c #CACEC6", "U c #CBCEC6", "Y c #CDD1C9", "T c None", /* pixels */ "TTTTTTTTTTTTTTTT", "TTTTTTTTTTTTTTTT", "TT681TTTTTT ,5TT", "TT5Ll2TTTT=wZ:TT", "TT4fUx7TT4aDu;TT", "TTT3jYz<;dHs+TTT", "TTTT>kINmJh=TTTT", "TTTTT>BPKM*TTTTT", "TTTTT-vHGc+TTTTT", "TTTT-uFnbSr.TTTT", "TTT=eAg%#iCq$TTT", "TT:9Cp@TTXyV0;TT", "TT;Vp@TTTTOtVoTT", "TT44&TTTTTT&O4TT", "TTTTTTTTTTTTTTTT", "TTTTTTTTTTTTTTTT" }; // gtk apply icon /* XPM */ const char *apply_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 88 1", " c #498D07", ". c #498A0D", "X c #519412", "o c #529612", "O c #559815", "+ c #579B16", "@ c #589B17", "# c #579818", "$ c #599C1B", "% c #5A9D1B", "& c #59991C", "* c #5B9C1D", "= c #5C9D1E", "- c #5D9E1F", "; c #5D9C21", ": c #5E9D22", "> c #60A023", ", c #60A222", "< c #66A52C", "1 c #6AA92F", "2 c #6AA730", "3 c #6BA931", "4 c #6FAB36", "5 c #71AC38", "6 c #74AF3A", "7 c #74AE3D", "8 c #75B13D", "9 c #76B13E", "0 c #7DB648", "q c #7FB749", "w c #8EE03E", "e c #81B84D", "r c #83B950", "t c #88BF53", "y c #89BE57", "u c #95DF4D", "i c #8CC259", "p c #8FC55B", "a c #91E145", "s c #98E152", "d c #99E054", "f c #9BE355", "g c #9DE25A", "h c #9EE459", "j c #A1E55E", "k c #92C660", "l c #93C661", "z c #95C863", "x c #96C965", "c c #97C867", "v c #9FD16F", "b c #A1D073", "n c #A1D372", "m c #A4D475", "M c #A6D777", "N c #A7DC75", "B c #A8DA77", "V c #A6D678", "C c #ABDB7C", "Z c #ABDA7E", "A c #ACDC7C", "S c #A0E360", "D c #A4E366", "F c #A5E566", "G c #A7E66A", "H c #A7E26E", "J c #A8E56C", "K c #A7E868", "L c #A9E470", "P c #ABE672", "I c #AFE877", "U c #ADE279", "Y c #ADE07A", "T c #AEE47A", "R c #B0E77B", "E c #B3EB7D", "W c #B4EB7C", "Q c #ACD980", "! c #ADDC80", "~ c #AEDC81", "^ c #B3E583", "/ c #B3E187", "( c #B4E684", ") c #B8EB87", "_ c #BBE98E", "` c #BCE990", "' c #C2F094", "] c None", /* pixels */ "]]]]]]]]]]]->]]]", "]]]]]]]]]]%bBq@]", "]]]]]]]]]]yTGZ>]", "]]]]]]]]]3AgHi]]", "]]]]]]]]ocPdm#]]", "]]]]]]]]7(uU5]]]", "]] ]]]]&ZSFl]]]]", "]5b0o]]iRsN<]]]]", "%V'`z:4/fPe]]]]]", "+p_W)Z~Ggv-]]]]]", "]+e/EKjaU7]]]]]]", "]]]2MIwFz]]]]]]]", "]]]]*l^~:]]]]]]]", "]]]]].81]]]]]]]]", "]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]" }; // enter key icon from KDE's crystal theme /* XPM */ const char *enter_key_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 91 1", " c #5C5C5C", ". c #626262", "X c #666666", "o c #696969", "O c #6B6B6B", "+ c #6C6C6C", "@ c #6E6E6E", "# c #6F6F6F", "$ c #717171", "% c #737373", "& c #747474", "* c #838383", "= c #8D8D8D", "- c #92928F", "; c #939393", ": c #A3A3A2", "> c #A7A7A5", ", c #A7A7A6", "< c #A7A7A7", "1 c #A9A9A8", "2 c #A9A9A9", "3 c #AEAEAD", "4 c #B0B0AE", "5 c #B1B1AF", "6 c #B2B2B0", "7 c #B4B4B2", "8 c #B5B5B3", "9 c #B7B7B6", "0 c #B7B7B7", "q c #B9B9B7", "w c #BABAB9", "e c #BBBBBB", "r c #BCBCBB", "t c #BEBEBC", "y c #C2C2C1", "u c #C4C4C0", "i c #C4C4C4", "p c #C5C5C5", "a c #C6C6C4", "s c #C7C7C7", "d c #C9C9C6", "f c #CBCBC8", "g c #CACACA", "h c #CFCFCD", "j c #D0D0CE", "k c #D1D1CF", "l c #D0D0D0", "z c #D1D1D1", "x c #D2D2D0", "c c #D3D3D1", "v c #D2D2D2", "b c #D3D3D2", "n c #D3D3D3", "m c #D4D4D3", "M c #D4D4D4", "N c #D5D5D5", "B c #D7D7D6", "V c #D7D7D7", "C c #D8D8D8", "Z c #D9D9D8", "A c #D9D9D9", "S c #DADAD9", "D c #DADADA", "F c #DCDCDC", "G c #DDDDDD", "H c #DEDEDE", "J c #DFDFDF", "K c #E0E0E0", "L c #E2E2E2", "P c #E3E3E3", "I c #E4E4E4", "U c #E5E5E5", "Y c #E7E7E7", "T c #E8E8E8", "R c #E9E9E9", "E c #EBEBEB", "W c #ECECEC", "Q c #EDEDED", "! c #EFEFEF", "~ c #F0F0F0", "^ c #F3F3F3", "/ c #F4F4F4", "( c #F5F5F5", ") c #F6F6F6", "_ c #F7F7F7", "` c #F8F8F8", "' c #F9F9F9", "] c #FAFAFA", "[ c #FCFCFC", "{ c #FDFDFD", "} c None", /* pixels */ "}}}}}}}}}}}}}}}}", "}}}}}}fSFFFFFSd}", "}}}}}}c{[[[[['a}", "}}}}}}x]_`'`_`t}", "}}}}}}x)^(p`^/r}", "}}}}}}k^!!%'!!w}", "}}}}}}j~WQ#`EWq}", "}}}}}}yWTR@(TR9}", "}Z)))_/YIU+~PI8}", "}BLHKH,,,,,,,,,:-}", "}}}}}}}}}}}}}}}}" }; // question icon from default gtk theme /* XPM */ const char *dialog_question_48_icon[] = { "48 48 215 2", " c None", ". c #3768A6", "+ c #3968A7", "@ c #3A6AA7", "# c #386BA6", "$ c #3968A5", "% c #A7BEDA", "& c #F4F7FB", "* c #F4F8FB", "= c #A5BDD9", "- c #3769A6", "; c #3869A6", "> c #BBCEE4", ", c #FFFFFF", "' c #FEFEFF", ") c #BBCDE3", "! c #F9FBFD", "~ c #98B9DC", "{ c #99B9DC", "] c #729FCF", "^ c #97B8DB", "/ c #BACDE3", "( c #719ECE", "_ c #709DCD", ": c #709DCE", "< c #6F9CCD", "[ c #6F9CCC", "} c #95B6DA", "| c #B9CDE3", "1 c #6E9CCC", "2 c #6E9BCC", "3 c #6D9BCC", "4 c #6D9ACB", "5 c #94B5D9", "6 c #B9CCE3", "7 c #78A2D0", "8 c #709CCC", "9 c #6C9ACB", "0 c #6C99CA", "a c #6B99CA", "b c #93B4D8", "c c #B9CCE2", "d c #739FCE", "e c #A1BEDE", "f c #C9DAEC", "g c #EBF1F8", "h c #FAFCFD", "i c #E7EEF6", "j c #B7CDE6", "k c #759FCE", "l c #6B98CA", "m c #6A98C9", "n c #6A97C9", "o c #92B3D8", "p c #B9CBE2", "q c #80A8D3", "r c #E8EFF7", "s c #6997C9", "t c #6996C8", "u c #6896C8", "v c #91B2D7", "w c #B8CBE2", "x c #7FA7D2", "y c #FDFDFE", "z c #E9F0F7", "A c #EFF4F9", "B c #BBD0E7", "C c #6895C8", "D c #6795C7", "E c #6794C7", "F c #8FB1D6", "G c #B8CBE1", "H c #7EA6D1", "I c #F2F6FA", "J c #ADC6E1", "K c #749FCD", "L c #6A98CA", "M c #AFC7E2", "N c #E1EAF4", "O c #6694C7", "P c #6694C6", "Q c #6593C6", "R c #8EAFD5", "S c #B7CBE1", "T c #96B7DA", "U c #6C99CB", "V c #709CCB", "W c #719DCC", "X c #7FA5D0", "Y c #6693C6", "Z c #6592C6", "` c #6492C5", " . c #6391C5", ".. c #8DAFD4", "+. c #B0C7E2", "@. c #CBDBEC", "#. c #6391C4", "$. c #6290C4", "%. c #8CADD3", "&. c #B7CAE1", "*. c #3768A5", "=. c #396AA7", "-. c #A4BCD8", ";. c #96B6D8", ">. c #FDFEFE", ",. c #85A9D2", "'. c #6290C3", "). c #618FC3", "!. c #608EC3", "~. c #8BADD3", "{. c #A0B8D6", "]. c #3768A7", "^. c #FEFFFF", "/. c #99B8DA", "(. c #A4BFDD", "_. c #608EC2", ":. c #5F8DC2", "<. c #5F8DC1", "[. c #8AABD2", "}. c #3868A6", "|. c #396AA6", "1. c #87AAD2", "2. c #FBFCFE", "3. c #A1BDDC", "4. c #5F8EC2", "5. c #5E8DC1", "6. c #5E8CC1", "7. c #89AAD1", "8. c #3767A6", "9. c #3969A6", "0. c #92B4D8", "a. c #D0DEEE", "b. c #B1C8E2", "c. c #5D8CC1", "d. c #5D8BC0", "e. c #87AAD1", "f. c #F9FAFD", "g. c #79A0CC", "h. c #5C8BC0", "i. c #87A9D0", "j. c #F9FAFC", "k. c #B6C9E0", "l. c #3767A5", "m. c #90B2D6", "n. c #6B97C7", "o. c #6C97C8", "p. c #6C97C7", "q. c #6C96C7", "r. c #5C8AC0", "s. c #5B8ABF", "t. c #87A8D0", "u. c #3668A4", "v. c #8FB0D6", "w. c #5C8ABF", "x. c #5B89BF", "y. c #86A8D0", "z. c #B6CAE1", "A. c #8DAFD5", "B. c #ECF1F8", "C. c #5A89BF", "D. c #5A89BE", "E. c #85A7CF", "F. c #F8FAFC", "G. c #B6CAE0", "H. c #BACDE2", "I. c #8BADD4", "J. c #F6F8FB", "K. c #5A88BE", "L. c #5988BE", "M. c #5987BD", "N. c #84A7CE", "O. c #89ABD3", "P. c #EBF1F7", "Q. c #5887BD", "R. c #84A6CE", "S. c #88ABD1", "T. c #5886BD", "U. c #5786BC", "V. c #83A6CE", "W. c #82A5CE", "X. c #3667A4", "Y. c #85A8D0", "Z. c #5785BC", "`. c #5685BC", " + c #82A4CD", ".+ c #B6C8E0", "++ c #3767A3", "@+ c #85A8CF", "#+ c #5685BB", "$+ c #5584BB", "%+ c #3667A3", "&+ c #B8CAE1", "*+ c #5684BB", "=+ c #81A4CC", "-+ c #B5C8E0", ";+ c #3566A2", ">+ c #82A5CD", ",+ c #5483BA", "'+ c #B7C9E0", ")+ c #81A4CD", "!+ c #5382BA", "~+ c #80A3CB", "{+ c #B5C8DF", "]+ c #80A3CC", "^+ c #5382B9", "/+ c #7FA2CB", "(+ c #B4C8DF", "_+ c #9DB5D3", ":+ c #F1F5F9", "<+ c #F0F4F9", "[+ c #9CB4D3", "}+ c #3565A1", "|+ c #305D95", "1+ c #3666A3", "2+ c #305D96", " ", " ", " . + @ # ", " $ % & * = - ", " ; > , ' ' , ) ; ", " ; > , ! ~ { ! , ) ; ", " ; > , ! ~ ] ] ~ ! , ) ; ", " ; > , ! ~ ] ] ] ] ~ ! , ) ; ", " ; > , ! ~ ] ] ] ] ] ] ~ ! , ) ; ", " ; > , ! ~ ] ] ] ] ] ] ] ] ~ ! , ) - ", " ; > , ! ~ ] ] ] ] ] ] ] ] ] ] ^ ! , / - ", " ; > , ! ~ ] ] ] ] ] ] ] ] ] ( ( _ ^ ! , / - ", " ; > , ! ~ ] ] ] ] ] ] ] ( ( : _ < < [ } ! , | - ", " ; > , ! ~ ] ] ] ] ] ] ( ( _ _ < < 1 2 3 4 5 ! , 6 - ", " ; > , ! ~ ] ] ] ] ( ( : _ < 7 8 2 2 4 4 9 0 a b ! , c - ", " ; > , ! ~ ] ] ] ( ( d e f g h , ' i j k a a l m n o ! , p - ", " ; > , ! ~ ] ( ( : _ < q , , , , , , , , r k n n s t u v ! , w - ", " ; > , ! ~ ( ( _ _ < < 1 x , , y z A , , , , B t u u C D E F ! , G - ", " ; > , ! ^ : _ < < [ 2 2 4 H I J K l L M , , , N C D D O P Q Q R ! , S - ", " ; > , ! T _ < < 1 2 3 4 9 U V W l m n s X , , , i E O Y Q Z ` ` ...! , S - ", " $ > , ! } < [ 2 2 4 4 9 0 a l L n n s t u +., , , @.Q Q Z ` ` .#.$.$.%.! , &.*. ", " =.-., ! } 1 2 3 4 9 U 0 a l m n s t u u C ;.>., , >.,.` ` .#.$.$.'.).).!.~.! , {.]. ", " . & ^.} 2 4 4 9 0 a l L n n s t u C D D /.y , , ^.(.` .#.$.$.).).)._._.:.<.[.' I }. ", " |.& ^.5 9 U 0 a l m n s t u u C D E O 1.2., , ^.3.#.$.$.'.).).!._.4.:.5.6.6.7.' I 8. ", " 9.-., ! 0.l L n n s t u C D D O P Q Q a., , , b.$.$.).).)._._.:.<.6.6.c.d.e.f., {.8. ", " *./ , ! v s t u u C D E O Y Q Q ` ` r , , , g.).).!._.4.:.5.6.6.d.d.h.i.j., k.l. ", " - ) , ! m.C D D O P Q Q Z ` ` .#.n.o.p.q.'._._.:.<.6.6.c.d.h.r.s.t.j., k.u. ", " - ) , ! v.O Y Q Q ` ` .#.$.$.'.).).!._.4.:.5.6.6.d.d.h.w.s.x.y.j., z.u. ", " - / , ! A.Z ` ` .#.$.$.'.).).B.& & & 6.6.c.d.h.r.s.x.C.D.E.F., G.u. ", " - H., ! I.#.$.$.'.).).!._.4.J., , , d.d.h.w.s.x.C.D.K.E.F., k.u. ", " - c , ! ~.'.).)._._.:.<.6.J., , , r.s.x.x.D.K.L.M.N.F., k.u. ", " - c , ! O._.4.:.5.6.6.d.P.& & & x.C.D.K.L.M.Q.R.F., k.u. ", " - p , ! S.5.6.c.d.h.r.s.x.x.D.K.L.M.Q.T.U.V.F., k.u. ", " l.w , f.i.d.h.w.s.x.C.D.K.L.M.Q.T.U.U.W.F., k.X. ", " l.G , f.Y.x.x.D.K.L.M.Q.T.U.U.Z.`. +F., .+X. ", " ++G , j.@+K.L.M.Q.T.U.U.`.#+$+ +F., .+%+ ", " %+&+, F.V.T.U.U.Z.`.*+$+$+=+F., -+%+ ", " ;+&., F.>+`.#+$+$+,+,+=+F., -+;+ ", " ;+'+, F.)+$+,+,+!+~+F., {+;+ ", " ;+k., F.]+!+^+/+F., {+;+ ", " ;+k., F./+~+F., (+;+ ", " %+k., ^.^., (+%+ ", " ;+_+:+<+[+}+ ", " |+}+1+2+ ", " ", " ", " ", " " }; /* XPM */ const char *clear_sq_icon[] = { "16 16 1 1", " c None", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " " }; const char *clear_row_icon[] = { "16 1 1 1", " c None", " " }; // The lightning bolt icons are based on gmfsk's rx.xpm and tx.xpm /* XPM */ const char *rx1_icon[] = { "16 16 4 1", " c None", ". c #0F1F01", "+ c #4E9A06", "@ c #888A85", " ", " ......... ", " .++++++.@ ", " .++++++.@ ", " .+++++.@ ", " .+++++.@ ", " .++++..... ", " .++++++++.@ ", " .....+++.@ ", " @@.+++.@ ", " .++.@ ", " .++.@ ", " .+.@ ", " .+.@ ", " ..@ ", " " }; /* XPM */ const char *tx1_icon[] = { "16 16 4 1", " c None", ". c #210000", "+ c #A40000", "@ c #888A85", " ", " ......... ", " .++++++.@ ", " .++++++.@ ", " .+++++.@ ", " .+++++.@ ", " .++++..... ", " .++++++++.@ ", " .....+++.@ ", " @@.+++.@ ", " .++.@ ", " .++.@ ", " .+.@ ", " .+.@ ", " ..@ ", " " }; /* XPM */ const char *rx2_icon[] = { "16 16 3 1", " c None", ". c #0F1F01", "+ c #4E9A06", " ", " ......... ", " .++++++. ", " .++++++. ", " .+++++. ", " .+++++. ", " .++++..... ", " .++++++++. ", " .....+++. ", " .+++. ", " .++. ", " .++. ", " .+. ", " .+. ", " .. ", " " }; /* XPM */ const char *tx2_icon[] = { "16 16 3 1", " c None", ". c #210000", "+ c #A40000", " ", " ......... ", " .++++++. ", " .++++++. ", " .+++++. ", " .+++++. ", " .++++..... ", " .++++++++. ", " .....+++. ", " .+++. ", " .++. ", " .++. ", " .+. ", " .+. ", " .. ", " " }; /* XPM */ const char *rx_icon[] = { "16 16 38 1", " c None", ". c #0F1F01", "+ c #64B517", "@ c #62B315", "# c #61B014", "$ c #5EAE12", "% c #5CAC11", "& c #5AA90F", "* c #68BA1B", "= c #66B719", "- c #65B517", "; c #63B315", "> c #60B014", ", c #5EAD13", "' c #6ABD1C", ") c #69BA1A", "! c #66B718", "~ c #64B418", "{ c #6FC11F", "] c #6CBF1E", "^ c #6ABC1C", "/ c #70C421", "( c #6CBE1E", "_ c #6BBC1C", ": c #75C824", "< c #72C622", "[ c #6EC11F", "} c #6CBE1D", "| c #67B819", "1 c #6DBF1E", "2 c #73C622", "3 c #70C321", "4 c #74C924", "5 c #72C522", "6 c #79CD27", "7 c #76CA26", "8 c #7ACF28", "9 c #7FD42B", " ", " ......... ", " .+@#$%&. ", " .*=-;>,. ", " .')!~@. ", " .{]^)=. ", " ./{(_..... ", " .: c #B90C0B", ", c #C81313", "' c #C10F10", ") c #CC1617", "! c #CA1515", "~ c #C71313", "{ c #CF1818", "] c #CC1616", "^ c #D41A1A", "/ c #D11819", "( c #CF1718", "_ c #C71414", ": c #CA1514", "< c #C81413", "[ c #D21919", "} c #CF1817", "| c #CD1616", "1 c #D11818", "2 c #D81D1D", "3 c #D61B1B", "4 c #DB1E1E", "5 c #E02121", " ", " ......... ", " .+@#$%&. ", " .*=-@;>. ", " .,*='@. ", " .)!~*=. ", " .{]!,..... ", " .^/(]!_*=. ", " .....]:<. ", " .[}|. ", " .^1. ", " .23. ", " .4. ", " .5. ", " .. ", " "}; // pskreporter.info "favicon" /* XPM */ const char *pskr_icon[] = { "16 16 3 1", " c None", ". c #FF0000", "+ c #FFFF00", " .. ", " ... ", " ..... ", " .....+.. ", ". ...++++... ", ".. ..+++++. .. ", "....++++++..+. ", "..+++++++++++.. ", "..+++++++.++++. ", "....+++++..++.. ", ".. ..+++++.... ", ". ..+++++.. ", " ...+... ", " .... ", " .. ", " . "}; /* XPM */ const char *fldigi_icon[] = { "48 48 215 2", " c None", ". c #000000", "+ c #BFBFBF", "@ c #050505", "# c #1A1A1A", "$ c #1F1F1F", "% c #C5C5C5", "& c #FEC1C1", "* c #FDC5C5", "= c #FEC2C2", "- c #FFBFBF", "; c #D5C4C4", "> c #0C0C0C", ", c #FE0303", "' c #FB0C0C", ") c #FD0606", "! c #FE0000", "~ c #4F0909", "{ c #D1BFBF", "] c #2F2F2F", "^ c #303030", "/ c #3C3C3C", "( c #838383", "_ c #C7C7C7", ": c #D9D9D9", "< c #D7D7D7", "[ c #C2C2C2", "} c #C4C4C4", "| c #C9C9C9", "1 c #9F9F9F", "2 c #DDDDDD", "3 c #DBDBDB", "4 c #CDCDCD", "5 c #8F8F8F", "6 c #414141", "7 c #343434", "8 c #313131", "9 c #010101", "0 c #292929", "a c #8A8A8A", "b c #A8A8A8", "c c #B6B6B6", "d c #CFCFCF", "e c #DEDEDE", "f c #DFDFDF", "g c #E5E5E5", "h c #E2E2E2", "i c #A0A0A0", "j c #7D7D7D", "k c #1D1D1D", "l c #767676", "m c #888888", "n c #9B9B9B", "o c #D3D3D3", "p c #C6C6C6", "q c #EBEBEB", "r c #DADADA", "s c #AAAAAA", "t c #858585", "u c #747474", "v c #232323", "w c #171717", "x c #818181", "y c #979797", "z c #AEAEAE", "A c #E4E4E4", "B c #D4D4D4", "C c #B5B5B5", "D c #E1E1E1", "E c #BABABA", "F c #9A9A9A", "G c #989898", "H c #030303", "I c #070707", "J c #242424", "K c #C1C1C1", "L c #E0E0E0", "M c #B2B2B2", "N c #363636", "O c #060606", "P c #020202", "Q c #929292", "R c #959595", "S c #C8C8C8", "T c #CECECE", "U c #B0B0B0", "V c #999999", "W c #040404", "X c #151515", "Y c #606060", "Z c #A2A2A2", "` c #CBCBCB", " . c #919191", ".. c #A4A4A4", "+. c #AFAFAF", "@. c #737373", "#. c #181818", "$. c #131313", "%. c #393939", "&. c #C3C3C3", "*. c #454545", "=. c #3A3A3A", "-. c #222222", ";. c #333333", ">. c #484848", ",. c #A1A1A1", "'. c #616161", "). c #0F0F0F", "!. c #C0C0C0", "~. c #808080", "{. c #404040", "]. c #121212", "^. c #191919", "/. c #BDBDBD", "(. c #7E7E7E", "_. c #3F3F3F", ":. c #161616", "<. c #090909", "[. c #212121", "}. c #777777", "|. c #BBBBBB", "1. c #3B3B3B", "2. c #5D5D5D", "3. c #A5A5A5", "4. c #727272", "5. c #272727", "6. c #101010", "7. c #9C9C9C", "8. c #B7B7B7", "9. c #B3B3B3", "0. c #080808", "a. c #262626", "b. c #ADADAD", "c. c #CCCCCC", "d. c #E9E9E9", "e. c #E8E8E8", "f. c #ACACAC", "g. c #2A2A2A", "h. c #323232", "i. c #DCDCDC", "j. c #D1D1D1", "k. c #E7E7E7", "l. c #D2D2D2", "m. c #0E0E0E", "n. c #0D0D0D", "o. c #4A4A4A", "p. c #8C8C8C", "q. c #B9B9B9", "r. c #7A7A7A", "s. c #525252", "t. c #373737", "u. c #7B7B7B", "v. c #E6E6E6", "w. c #A9A9A9", "x. c #6B6B6B", "y. c #141414", "z. c #757575", "A. c #D6D6D6", "B. c #E3E3E3", "C. c #6E6E6E", "D. c #0B0B0B", "E. c #1E1E1E", "F. c #EAEAEA", "G. c #B4B4B4", "H. c #D8D8D8", "I. c #9E9E9E", "J. c #444444", "K. c #ABABAB", "L. c #A6A6A6", "M. c #505050", "N. c #B1B1B1", "O. c #3E3E3E", "P. c #0A0A0A", "Q. c #878787", "R. c #EFEFEF", "S. c #8B8B8B", "T. c #4B4B4B", "U. c #4F4F4F", "V. c #CACACA", "W. c #EEEEEE", "X. c #434343", "Y. c #D5D5D5", "Z. c #7F7F7F", "`. c #5B5B5B", " + c #515151", ".+ c #868686", "++ c #8E8E8E", "@+ c #575757", "#+ c #707070", "$+ c #636363", "%+ c #B8B8B8", "&+ c #909090", "*+ c #252525", "=+ c #8D8D8D", "-+ c #969696", ";+ c #282828", ">+ c #A3A3A3", ",+ c #BCBCBC", "'+ c #A7A7A7", ")+ c #3D3D3D", "!+ c #2E2E2E", "~+ c #353535", "{+ c #D0D0D0", "]+ c #595959", "^+ c #BEBEBE", "/+ c #111111", "(+ c #5E5E5E", "_+ c #383838", ":+ c #939393", "<+ c #464646", "[+ c #2C2C2C", "}+ c #717171", "|+ c #898989", "1+ c #494949", "2+ c #555555", ". . . . . . . . + @ . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", ". . . . . . . . + # . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", ". . . . . . . . + $ . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", "% % % % % % % % % % % % % % % % % % % % % & * * * = - - - ; % % % % % % % % % % % % % % % % % % ", "> > > > > > > > > > > > > > > > > > > > > , ' ' ' ) ! ! ! ~ > > > > > > > > > > > > > > > > > > ", "+ + + + + + + + + + + + + + + + + + + + + - - - - - - - - { + + + + + + + + + + + + + + + + + + ", "] ] ] ] ] ] ] ] ] ] ] ] ] ] ^ ] ] ] / ( _ : < [ } | 1 2 3 4 5 6 ^ ] ] ] 7 8 ] ] ] ] ] ] ] ] ] ] ", ". . . . . . . . . . . . . . 9 . . . 0 a b c d e f g 2 h } i j 0 9 . . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . k l m n o p 3 q h r s t u v . . . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . 9 w x y z : _ A B C D E F G 0 . . H 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . I 9 . J t z % D K L d d r | M ( N 9 . O H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . P > 9 . ] Q R S f D L T 4 e } U V 7 9 . H 9 . . . . . . . . . . . . ", ". . . . . P P . . . . . . 9 P W . . X Y Z e ` + .( ..d 3 +.@.#.. . . . O H . . . . . . . . . . ", ". . . . . @ @ . . . . . . W P . . . P $.%.&.*.=.-.k ;.>.,.'.X @ . . . . ).O . . . . . . . . . . ", ". . . . . @ @ . . . . . . P 9 . . . . 9 . !.P . . . . . ~.{.. . . . . . ].I . . . . . . . . . . ", ". . . . . O O . . . . . . . . . . . P O ^./.$.H H H H W (._.P . . . . . :.<.. . . . . . . . . . ", ". . . . . H H . . . . . . . . . . . O [.}.|.Y 1.6 6 1.2.3.4.5.P . . . . 6.I . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 9 . . ).u } A 4 7.8.9.7.: D d ~.W . . . 9 H 9 . . . . . . . . . . ", ". . . . . . . . . . . . . . H 0.. . a.b.&.c.d.o D L L e._ + f.g.9 . 0.@ . . . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 0.9 . h.F c ` i.j.A e.k.2 l.C Q / 9 9 m.@ . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . n.P . o.p.f.% q.A g e.q e e Z r.s.@ @ m.P . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . 9 . . t.u.+ v.B i.Z w.: L d.|.x.7 O 9 P . I 9 . . . . . . . . . . ", ". . . . . . . . . . . . . H O @ . . y.z.c.v.A.+ b b ,.B.e.[ C.D.9 . . 9 <.9 . . . . . . . . . . ", ". . . . . . . . . . . . . H D.n.. . E.,.o B.e.A.!.z ..F.L 3 Z [.9 . W H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . P n.9 . 1.c G.H.g F.k.g e.A ` 9.I.J.W . O W . . . . . . . . . . . . ", ". . . . . . . . . . . . . . W m.. W t.K.1 L.i.2 h i.v.D ..1 +.^ O 9 0.D.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . H O P > M.5 t p.< g g D d.i.1 Q N.O.O @ ).D.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 P.H W o.Q.C p l.v.q R.i.i.d 1 S.T.I 9 P . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . O H . U.t +.l.V.V.e.W.k.r } S }.X.<.P W . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . 9 . 1.x U g 2 Y.g g g D 3 l.Z.v H . 9 . D.H . . . . . . . . . . ", ". . . . . 9 9 . . . . . . 9 9 . . . O -.> 4 @.C.`. +C.}.!..+W 0.. . . . w <.. . . . . . . . . . ", ". . . . . W W . . . . . . P 9 . . . . P 9 % y.<.<.0.I m.++@+@ . . . . . :.<.. . . . . . . . . . ", ". . . . . 9 9 . . . . . . H 9 . . . O t.S.f ,.#+j u.$+n c.z +I 9 . . . > @ . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . X ( | H.v.%+D 4 &+v.` d n *+W . 9 9 9 . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . y.=+G.G.h [ F.d.j.A b +.-+;+P . 9 . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . H . . ] >+C U L B.k.e.h k.s b i *.O . 9 W . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . D.P . %.M -+,+o d.i.A q 2 /.3.s +0.W n.0.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . H @ 9 . ] '+c V.L e.A 2 D B.S C i )+O 9 H 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . O O . . !+f._ l.e.d.g 2 D e.S &.K.s.P.. . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . P . 9 ~+f.E {+h d.e.g g L % !.R ]+D.9 P . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . O 9 O h.7.9.l.v.k.L B T 2 T ^+3.J.0.. 9 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . /+I D.X.Q L.e g q v.B.v.D B &.i (+P.W P.9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . D.I O _+b /.A.2 d.v.F.d.A : %+L.T.0.O /+H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . m.P . ;.Q + 3 f A h F.q d : } :+<+W H m.W . . . . . . . . . . . . ", ". . . . . . . . . . . . . H 9 I 9 . [+a p v.g k.o % e i.B.j.p.J.O . H 9 W P . . . . . . . . . . ", ". . . . . . . . . . . . . I H . . . O 5.}+o |+t 1+X.C..+,+p.8 ).9 . . . y.0.. . . . . . . . . . ", ". . . . . 9 9 . . . . . . P 9 . . . . . . p X D.9 P O <.~.2+. . . . . . :.<.. . . . . . . . . . ", ". . . . . @ @ . . . . . . . . . . . . . . &.I . . . . . ~.T.. . . . . . #.P.. . . . . . . . . . "}; /* XPM */ const char *flarq_icon[] = { /* columns rows colors chars-per-pixel */ "48 35 924 2", " c None", ". c #5B1E0E", "+ c #7F381B", "@ c #A7624B", "# c #A8624E", "$ c #652012", "% c #90555F", "& c #AA7A86", "* c #D4B5BE", "= c #5E231C", "- c #540900", "; c #AC5D55", "> c #B4644F", ", c #CF7F58", "' c #FCAD85", ") c #FBB18F", "! c #BA7057", "~ c #965140", "{ c #4F1509", "] c #3B1314", "^ c #45151B", "/ c #895156", "( c #AB8687", "_ c #D7C6C1", ": c #FFFFFD", "< c #FFFFFE", "[ c #A58088", "} c #945D68", "| c #642D34", "1 c #AC6352", "2 c #A45C49", "3 c #A35B46", "4 c #CC8C74", "5 c #F4B8A0", "6 c #FAC5A8", "7 c #FFD4B3", "8 c #FFD8B8", "9 c #FFDCBD", "0 c #FFCFAC", "a c #E7A380", "b c #A2563C", "c c #984D37", "d c #A2787A", "e c #997474", "f c #AA8B91", "g c #D1C0C6", "h c #CAB3BD", "i c #FBE6F1", "j c #F9FFFF", "k c #F8FAFA", "l c #FEFFFF", "m c #F3F2EF", "n c #E9D7D9", "o c #AC9092", "p c #AC8C8D", "q c #926A6E", "r c #9A737B", "s c #9B747C", "t c #9E573C", "u c #98543D", "v c #9A5F47", "w c #BF8469", "x c #E9AE90", "y c #FFCAA8", "z c #FFD9B6", "A c #FFDFBA", "B c #FDE1BA", "C c #FDDEB8", "D c #FEDBBB", "E c #FBDBC3", "F c #F8DBC5", "G c #FFDCC3", "H c #FFD1AF", "I c #FBB891", "J c #E79B74", "K c #9A4E30", "L c #9B5644", "M c #7D4F54", "N c #D0BCBE", "O c #F5EDE7", "P c #FCF4EE", "Q c #FFFAFC", "R c #FFFFFF", "S c #C7BDC6", "T c #C4B0BD", "U c #F4F3F8", "V c #FDFCFF", "W c #FFFDFF", "X c #F7FFFF", "Y c #DEDCDC", "Z c #E6E1E1", "` c #FFFAF9", " . c #FFF3F5", ".. c #FFF4F7", "+. c #E2D9DA", "@. c #C1AEB5", "#. c #C5A3AF", "$. c #7B5057", "%. c #7D2F24", "&. c #C87559", "*. c #EA9464", "=. c #FFA873", "-. c #FFB886", ";. c #FFC193", ">. c #FBBD92", ",. c #FBBE92", "'. c #F9B98A", "). c #FAB784", "!. c #F8AE77", "~. c #F9AC76", "{. c #F3A97B", "]. c #F3BB97", "^. c #FDD7BD", "/. c #FEDCC3", "(. c #FFDBB4", "_. c #FED2A6", ":. c #FEBF94", "<. c #E89574", "[. c #D07355", "}. c #C06F4F", "|. c #C09581", "1. c #F0F1E9", "2. c #E8FBF4", "3. c #EEF9F3", "4. c #FDFDFE", "5. c #FDF8FE", "6. c #EFE7ED", "7. c #A6969F", "8. c #F2E9EF", "9. c #F7F9F9", "0. c #FEFDFF", "a. c #B2A3AC", "b. c #CBBFC7", "c. c #FCFBFE", "d. c #F9F6F8", "e. c #F5F8F7", "f. c #F6FFFF", "g. c #69302D", "h. c #5D0100", "i. c #A0402C", "j. c #CC7D59", "k. c #BF6F4E", "l. c #C16645", "m. c #F6996A", "n. c #FCA264", "o. c #F8995F", "p. c #F3925E", "q. c #F29968", "r. c #F29F71", "s. c #E79469", "t. c #C26640", "u. c #CF6A43", "v. c #FD9366", "w. c #FF9B68", "x. c #F99B63", "y. c #F19F6E", "z. c #EEAB80", "A. c #F8C59B", "B. c #FBD3AB", "C. c #FCD2AA", "D. c #FCD9B1", "E. c #F8D1AA", "F. c #F9C596", "G. c #FFB371", "H. c #FEAC6B", "I. c #D69B78", "J. c #EAD5D1", "K. c #ECF6FA", "L. c #F1FAFB", "M. c #FFFBFF", "N. c #FDF4FB", "O. c #FDFAFB", "P. c #D3CACE", "Q. c #D8C7CE", "R. c #F6FAF8", "S. c #FEFCFF", "T. c #C4B4C0", "U. c #D3C8D3", "V. c #FAFBFF", "W. c #FBFBFF", "X. c #FBFDFF", "Y. c #F7FEFF", "Z. c #F8DEDA", "`. c #B76C57", " + c #D76E4E", ".+ c #F89463", "++ c #F9A36A", "@+ c #FFB783", "#+ c #F5A27A", "$+ c #D0744E", "%+ c #EB9060", "&+ c #E68655", "*+ c #EA8855", "=+ c #F1935B", "-+ c #F0975D", ";+ c #D27B43", ">+ c #E18450", ",+ c #E98B5A", "'+ c #DD7C50", ")+ c #D07242", "!+ c #F9A06A", "~+ c #FFA771", "{+ c #F6A26B", "]+ c #EE9D67", "^+ c #EEA26D", "/+ c #F2AA77", "(+ c #ECA776", "_+ c #EDAC7B", ":+ c #EEB17D", "<+ c #F1A55D", "[+ c #FFA45C", "}+ c #DC855E", "|+ c #D9A3A2", "1+ c #F5F0FC", "2+ c #E9F7FA", "3+ c #F6FDFE", "4+ c #FDFBFE", "5+ c #F8F9F9", "6+ c #D1CFD0", "7+ c #CCB9C0", "8+ c #F9FAF9", "9+ c #FBFAFC", "0+ c #F7F0F5", "a+ c #D7C6D1", "b+ c #E7E0EB", "c+ c #EAF4FB", "d+ c #F1F9FD", "e+ c #F9FEFF", "f+ c #F2FCFB", "g+ c #F6F5F5", "h+ c #CA9E8E", "i+ c #F4A27A", "j+ c #FAA77A", "k+ c #F6B280", "l+ c #F5C896", "m+ c #FED8AD", "n+ c #FFCFAB", "o+ c #FFCCA8", "p+ c #F8C39B", "q+ c #F5BC9C", "r+ c #F2B48F", "s+ c #ECA878", "t+ c #F3A86C", "u+ c #FCAA68", "v+ c #FAA664", "w+ c #F9A76A", "x+ c #EC9B65", "y+ c #D38048", "z+ c #E69056", "A+ c #E0874E", "B+ c #FAA26B", "C+ c #FAA470", "D+ c #F5A06F", "E+ c #F59E6A", "F+ c #FA9C62", "G+ c #F99A5D", "H+ c #F49E6C", "I+ c #F89E63", "J+ c #FF9D5E", "K+ c #ED8F64", "L+ c #B67466", "M+ c #F5EBF0", "N+ c #E4F6F9", "O+ c #EAFCFA", "P+ c #FDFFFF", "Q+ c #F5F8F8", "R+ c #E6E6E7", "S+ c #BEAAB2", "T+ c #E9E2E6", "U+ c #FCF9FB", "V+ c #DFCFD2", "W+ c #C4AEB7", "X+ c #FAF0F9", "Y+ c #EAF0F6", "Z+ c #F3F8FC", "`+ c #FBFEFF", " @ c #F8F9F8", ".@ c #EADFDD", "+@ c #B47A60", "@@ c #E99560", "#@ c #F3BB8E", "$@ c #FDD8B6", "%@ c #FFDDC1", "&@ c #FDCFB2", "*@ c #FECEAD", "=@ c #FBD0A7", "-@ c #F7D3A7", ";@ c #FAD1AA", ">@ c #F9CAA1", ",@ c #F8C392", "'@ c #FAB179", ")@ c #F9A468", "!@ c #F9A166", "~@ c #F69F67", "{@ c #F9A470", "]@ c #FDA56E", "^@ c #F69A5A", "/@ c #D37536", "(@ c #D1753D", "_@ c #EF9868", ":@ c #F8A67A", "<@ c #F39F71", "[@ c #FB9E68", "}@ c #FF9D60", "|@ c #FA9C65", "1@ c #FAA06B", "2@ c #FA9C63", "3@ c #FDA26C", "4@ c #D5926E", "5@ c #F2DFDA", "6@ c #F0F3FD", "7@ c #EDF3F8", "8@ c #FEFCFC", "9@ c #F9FAFA", "0@ c #F3F4F6", "a@ c #A2929B", "b@ c #C0B1BA", "c@ c #C4B0B0", "d@ c #AC9398", "e@ c #FEF1F8", "f@ c #EEF2F7", "g@ c #F2F3F8", "h@ c #FEF9FB", "i@ c #FBF2F0", "j@ c #EFD9D8", "k@ c #E09D81", "l@ c #F0A268", "m@ c #F9CCA1", "n@ c #FDD3B7", "o@ c #F2B094", "p@ c #F3A377", "q@ c #F5A66E", "r@ c #F4A873", "s@ c #F3A476", "t@ c #F4A66D", "u@ c #F6A367", "v@ c #F9A269", "w@ c #FBA169", "x@ c #FD9F69", "y@ c #FC9F69", "z@ c #FC9F68", "A@ c #F99F65", "B@ c #F4A471", "C@ c #F9B385", "D@ c #F6A36E", "E@ c #F19359", "F@ c #D1743D", "G@ c #E3905E", "H@ c #F5A370", "I@ c #F59F69", "J@ c #FAA062", "K@ c #FBA05E", "L@ c #F8A26B", "M@ c #F9A46F", "N@ c #FAA160", "O@ c #EA9C62", "P@ c #C3998A", "Q@ c #F7EBFA", "R@ c #EEEAF8", "S@ c #F6F4F6", "T@ c #FCFEFF", "U@ c #F4F4F7", "V@ c #E4DCE3", "W@ c #D4C1CD", "X@ c #F2F5FA", "Y@ c #AEA19F", "Z@ c #C2B0B5", "`@ c #F9F8FC", " # c #E5F2F8", ".# c #EAF5FB", "+# c #F0F5F5", "@# c #F9F7F7", "## c #D3B3A9", "$# c #DF916B", "%# c #FAA76E", "&# c #F3B787", "*# c #F0AE84", "=# c #EE9D6B", "-# c #F6A15D", ";# c #F7A559", "># c #F9A160", ",# c #FE9B68", "'# c #FD9D67", ")# c #FC9F67", "!# c #FA9F69", "~# c #F9A06C", "{# c #F69F6A", "]# c #F5A067", "^# c #F9A464", "/# c #F5A35C", "(# c #E9A779", "_# c #F8D5C1", ":# c #FFCEAA", "<# c #FAB079", "[# c #E1884B", "}# c #CD713A", "|# c #F39961", "1# c #FAA56C", "2# c #F8A668", "3# c #FFA864", "4# c #EF9965", "5# c #E59462", "6# c #FBA360", "7# c #F49958", "8# c #BE8469", "9# c #E7DAE0", "0# c #EFF2FB", "a# c #EBF0F3", "b# c #FBFEFE", "c# c #F6F6FA", "d# c #FAF3FA", "e# c #B7A0AF", "f# c #C4C0C8", "g# c #D4CECD", "h# c #DED5DD", "i# c #EEF5FC", "j# c #E4F0FD", "k# c #E6F2FC", "l# c #EBF5FB", "m# c #EAE0E9", "n# c #B67A69", "o# c #ED8F5B", "p# c #FCA368", "q# c #F59E66", "r# c #F9A067", "s# c #F9A165", "t# c #F99F66", "u# c #FAA069", "v# c #FAA169", "w# c #FAA166", "x# c #F8A264", "y# c #F7A262", "z# c #F9A162", "A# c #F59E5E", "B# c #FCA464", "C# c #F0A172", "D# c #F8C7AA", "E# c #FFDFBE", "F# c #F7D7AF", "G# c #F7C497", "H# c #F19C6B", "I# c #DC7947", "J# c #E48552", "K# c #DD8553", "L# c #BF6033", "M# c #E28B60", "N# c #E99B6D", "O# c #F2A367", "P# c #FA9F60", "Q# c #E89874", "R# c #E2CBBF", "S# c #E9F6F7", "T# c #EAF1FA", "U# c #F6F6FB", "V# c #FAF9FC", "W# c #F9F1FA", "X# c #BBABB5", "Y# c #BDAEB7", "Z# c #DDCBCC", "`# c #FBF1F9", " $ c #EFEAF7", ".$ c #E9EFFC", "+$ c #EAF0FC", "@$ c #F1F6FE", "#$ c #E2CDCB", "$$ c #D28869", "%$ c #FFA26B", "&$ c #F99F64", "*$ c #FAA065", "=$ c #FAA167", "-$ c #FAA168", ";$ c #F9A066", ">$ c #F7A168", ",$ c #F7A167", "'$ c #F7A165", ")$ c #F9A163", "!$ c #FB9F63", "~$ c #FA9E65", "{$ c #F89D64", "]$ c #FEA667", "^$ c #F4B072", "/$ c #FBD2AB", "($ c #FBDFCB", "_$ c #F9DECA", ":$ c #FBCBAA", "<$ c #EFA579", "[$ c #D3764B", "}$ c #AE4621", "|$ c #EA865A", "1$ c #F8A674", "2$ c #F8A16F", "3$ c #FAA66A", "4$ c #E38A65", "5$ c #D5AFA0", "6$ c #F1FDFF", "7$ c #E9EFFF", "8$ c #EEEDFC", "9$ c #F5F4FD", "0$ c #F0EDF6", "a$ c #F5E9EF", "b$ c #C6AFB4", "c$ c #A28385", "d$ c #FFF7FE", "e$ c #F1E8F9", "f$ c #EBEFF9", "g$ c #EBEFFA", "h$ c #F0EFF8", "i$ c #D5B09E", "j$ c #ED9B6E", "k$ c #FDA168", "l$ c #F89F66", "m$ c #F89F65", "n$ c #F6A066", "o$ c #F5A166", "p$ c #F6A065", "q$ c #F8A065", "r$ c #F9A167", "s$ c #FCA06A", "t$ c #F99B68", "u$ c #DA7F51", "v$ c #E88B52", "w$ c #F9A15D", "x$ c #F1AF7D", "y$ c #F8D0B1", "z$ c #FBDCC7", "A$ c #FDDEC9", "B$ c #FED4B9", "C$ c #FBBC9A", "D$ c #E58C65", "E$ c #DB794C", "F$ c #F69F61", "G$ c #FF9F61", "H$ c #FD9D60", "I$ c #FAA163", "J$ c #F79C6E", "K$ c #DCA289", "L$ c #EAE3E3", "M$ c #ECF2FF", "N$ c #E7F0FB", "O$ c #E7F3FA", "P$ c #E7EFF2", "Q$ c #FEF7F9", "R$ c #B49DA0", "S$ c #C0A5A8", "T$ c #F7F6FB", "U$ c #E9EAFB", "V$ c #E9F0F8", "W$ c #E9F0FA", "X$ c #F5F1FA", "Y$ c #DBAD8E", "Z$ c #EF975E", "`$ c #FBA16A", " % c #F7A065", ".% c #F6A165", "+% c #F6A067", "@% c #F6A570", "#% c #F4A673", "$% c #EC9A6C", "%% c #D1794A", "&% c #E68752", "*% c #FDA26F", "=% c #F2A374", "-% c #F9C29B", ";% c #FFE0C1", ">% c #FDDDBC", ",% c #F4C29D", "'% c #E09266", ")% c #D67F46", "!% c #FB9E5C", "~% c #FF9D63", "{% c #FBA972", "]% c #CE805C", "^% c #C8A39D", "/% c #F2F5FD", "(% c #EAF1F4", "_% c #E6F2F3", ":% c #E6F5F4", "<% c #E7F1F1", "[% c #EAEDED", "}% c #E6E0E3", "|% c #E7F3F7", "1% c #DEF1FD", "2% c #E7F2FB", "3% c #EBF3FB", "4% c #E7D7DC", "5% c #D5916A", "6% c #FCA265", "7% c #F89E68", "8% c #F8A066", "9% c #F29F67", "0% c #EFA56E", "a% c #FBC490", "b% c #F6BC8A", "c% c #E9A26E", "d% c #D8834F", "e% c #E58456", "f% c #FF9B6E", "g% c #FAA16D", "h% c #EDB075", "i% c #F3C790", "j% c #FCD7AD", "k% c #FED4B6", "l% c #F6BB94", "m% c #CE8350", "n% c #D6854A", "o% c #FBA16F", "p% c #F39F6D", "q% c #F1A86D", "r% c #E89568", "s% c #D79F8D", "t% c #F4EDEE", "u% c #F0EEF8", "v% c #ECEEF6", "w% c #ECEFF9", "x% c #ECEDF7", "y% c #F1F0FC", "z% c #F0F4FA", "A% c #E6F2F5", "B% c #DCF5FD", "C% c #E3EBF7", "D% c #F9FBFF", "E% c #C19A96", "F% c #D57E55", "G% c #FDA366", "H% c #F99F67", "I% c #F99F63", "J% c #FA9F63", "K% c #F99E64", "L% c #F8A86F", "M% c #F1A66F", "N% c #F8B985", "O% c #FDD4A2", "P% c #F2BD89", "Q% c #F5A971", "R% c #E28955", "S% c #D97847", "T% c #F69962", "U% c #F4A66A", "V% c #E9A46A", "W% c #F2AA79", "X% c #F9AE84", "Y% c #F6AB7C", "Z% c #EA9B63", "`% c #E49159", " & c #FFA572", ".& c #FBA36B", "+& c #F8A363", "@& c #FFA66F", "#& c #CE7F5A", "$& c #E9CAC3", "%& c #F2F3FF", "&& c #EBEDFD", "*& c #F1EFFF", "=& c #F8F1FF", "-& c #FAEFFE", ";& c #FDF8FF", ">& c #FCF4F9", ",& c #F4F9FA", "'& c #F9F7FF", ")& c #FDE9EB", "!& c #D99781", "~& c #F59668", "{& c #F8A165", "]& c #F8A164", "^& c #F7A063", "/& c #F9A164", "(& c #FBA069", "_& c #D98350", ":& c #DA8954", "<& c #E79A68", "[& c #FAB887", "}& c #F6B181", "|& c #F5A46D", "1& c #F4A15F", "2& c #E6914E", "3& c #D37D41", "4& c #EA9569", "5& c #F8A078", "6& c #FC9E6C", "7& c #FE9D5C", "8& c #FF9F5B", "9& c #FFA46B", "0& c #E58B5F", "a& c #F09769", "b& c #F39562", "c& c #F09762", "d& c #EF9A6A", "e& c #D67F58", "f& c #BB8678", "g& c #F6F6FF", "h& c #F7F4FF", "i& c #EADFE9", "j& c #D8C4CE", "k& c #DABEC8", "l& c #E3C8DB", "m& c #E9CAD1", "n& c #ECD7D4", "o& c #EEDFE4", "p& c #B98787", "q& c #D9805B", "r& c #F9A266", "s& c #F6A360", "t& c #F79E64", "u& c #F6A466", "v& c #F6A465", "w& c #F9A065", "x& c #FD9E67", "y& c #DC7E4D", "z& c #C7693C", "A& c #ED9167", "B& c #F4976B", "C& c #FBA160", "D& c #FFAC67", "E& c #F49B60", "F& c #D6784A", "G& c #E5895F", "H& c #F09662", "I& c #FFA866", "J& c #FFAD6E", "K& c #E07F5D", "L& c #7B2B1B", "M& c #853D24", "N& c #963E27", "O& c #8D472B", "P& c #824730", "Q& c #843A2A", "R& c #712A23", "S& c #BA9092", "T& c #DABABA", "U& c #8B6E6B", "V& c #4D3232", "W& c #5D2D3D", "X& c #68353A", "Y& c #734744", "Z& c #6A4A4C", "`& c #663235", " * c #934833", ".* c #DF8766", "+* c #F99766", "@* c #FB9E61", "#* c #FFA66E", "$* c #FCA16D", "%* c #F99E69", "&* c #F7A169", "** c #F3A266", "=* c #F4A365", "-* c #FB9F68", ";* c #F6A16A", ">* c #F6A16B", ",* c #FCA06C", "'* c #FC9D69", ")* c #FF9D6B", "!* c #FF9E6C", "~* c #F69563", "{* c #D67949", "]* c #D47348", "^* c #F79567", "/* c #FA9F68", "(* c #F9A265", "_* c #FFA166", ":* c #FC9B65", "<* c #E98D5B", "[* c #C4683A", "}* c #BE6339", "|* c #B06D4E", "1* c #732F25", "2* c #64201E", "3* c #8B463B", "4* c #B6573A", "5* c #D06B39", "6* c #D37A42", "7* c #F4986B", "8* c #FC9C73", "9* c #F99F6C", "0* c #F4A766", "a* c #F1A561", "b* c #F49E63", "c* c #FB9E6B", "d* c #F7A069", "e* c #F9A16A", "f* c #FCA16C", "g* c #FE9F6C", "h* c #FFA06C", "i* c #FBA468", "j* c #F49D5F", "k* c #ED925B", "l* c #C86A3A", "m* c #DF8653", "n* c #FBA26F", "o* c #F9A369", "p* c #FFA673", "q* c #F6936D", "r* c #7C1705", "s* c #7C3625", "t* c #C76E51", "u* c #DE7B53", "v* c #CA693D", "w* c #BF633B", "x* c #E88C57", "y* c #E98E54", "z* c #F9A267", "A* c #FEA86F", "B* c #F4A167", "C* c #F6A362", "D* c #F19C5B", "E* c #DD8848", "F* c #E89255", "G* c #E68F53", "H* c #F49D63", "I* c #FEA76D", "J* c #FCA36A", "K* c #FAA466", "L* c #F29B5B", "M* c #EC8E5C", "N* c #DB8154", "O* c #D6874F", "P* c #E79659", "Q* c #FFA778", "R* c #D07B64", "S* c #6E1913", "T* c #6C1F18", "U* c #963729", "V* c #EC9366", "W* c #FFB374", "X* c #E98F56", "Y* c #B24C23", "Z* c #ED8661", "`* c #E78B58", " = c #FAA561", ".= c #F8A262", "+= c #F6A164", "@= c #F7A466", "#= c #E49459", "$= c #C16E36", "%= c #E08C58", "&= c #E1895C", "*= c #EF9265", "== c #FFA372", "-= c #FEA36A", ";= c #F5A268", ">= c #F6AA6A", ",= c #DC8545", "'= c #D47440", ")= c #C87153", "!= c #69241A", "~= c #AB5E46", "{= c #E88666", "]= c #E37B53", "^= c #D26E43", "/= c #F4996C", "(= c #CC6C39", "_= c #E5834A", ":= c #F39462", "<= c #FA9F6F", "[= c #F6A16D", "}= c #F49F6B", "|= c #F69E6D", "1= c #DD7F55", "2= c #C7653C", "3= c #E7825E", "4= c #E4895D", "5= c #F1A364", "6= c #FFAC66", "7= c #FEA067", "8= c #CD7151", "9= c #6E2215", "0= c #7F2427", "a= c #902F20", "b= c #E5895A", "c= c #FFB175", "d= c #F2915D", "e= c #B7522B", "f= c #C05D34", "g= c #D67649", "h= c #F69E68", "i= c #FDA46B", "j= c #FCA069", "k= c #FFA46E", "l= c #F49460", "m= c #EB8E5D", "n= c #D06F41", "o= c #C9683C", "p= c #D67D55", "q= c #A55135", "r= c #682616", "s= c #8F4C2E", "t= c #DE8C68", "u= c #CA6E51", "v= c #C4654C", "w= c #FFA579", "x= c #F09360", "y= c #CC7345", "z= c #DA844C", "A= c #EE9556", "B= c #F59D5E", "C= c #FFB174", "D= c #FFB075", "E= c #FFB073", "F= c #FFA472", "G= c #B85D49", "H= c #6C1515", "I= c #8B5446", "J= c #73251B", "K= c #95402C", "L= c #E48F68", "M= c #FFAA79", "N= c #F59D70", "O= c #EB9061", "P= c #E48A59", "Q= c #C57046", "R= c #B26340", "S= c #B16947", "T= c #B36943", "U= c #A65D40", "V= c #7B3629", "W= c #6A230D", "X= c #BA6848", "Y= c #D57C5E", "Z= c #D1745E", "`= c #CE7260", " - c #923C2D", ".- c #84382F", "+- c #813F39", "@- c #7B423B", " ", " ", " ", " ", " . + @ # $ % & * ", " = - ; > , ' ) ! ~ { ] ^ / ( _ : < ", "[ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l ", "m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W ", "X Y Z ` ...+.@.#.$. %.&.*.=.-.;.>.,.'.).!.~.{.].^./.9 (._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.", "R a.b.c.d.e.f.R W g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.", "R T.U.V.W.X.Y.V Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+9+", "0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+", "V+W+X+Y+Z+`+ @.@+@@@#@$@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@1@2@3@4@5@6@7@8@9@0@a@b@R ", "c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@", "Y@Z@`@ #.#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#/#(#_#:#<#[#}#|#1#2#3#4#5#6#7#8#9#0#a#b#c#d#e#f#", "g#h#i#j#k#l#m#n#o#p#~@q#r#s#s#s#t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#", "Z#`# $.$+$@$#$$$%$&$&$*$=$-$r#r#;$>$,$'$)$)$!$~${$]$^$/$($_$:$<$[$}$|$1$2$~@3$4$5$6$7$8$9$0$a$b$", "c$d$e$f$g$h$i$j$k$A@;$=$;$;$l$m$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$", "S$T$U$V$W$X$Y$Z$`$;$=$;$=$=$;$;$;$ % %.% %+%@%#%$%%%&%*%=%-%D ;%>%,%'%)%!%~%t#{%]%^%/%(%_%:%<%[%", "}%|%1%2%3%4%5%6%7%r#=$m$;$;$=$;$8%&$&$q$+%9%0%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%q%r%s%t%u%v%w%x%y%", "z%A%B%C%D%E%F%G%H%=$=$;$;$;$=$;$m$I%J%K%v@L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%`% &.&+&@&#&$&%&&&*&=&-&", ";&>&,&'&)&!&~&{&]&;$;$;$;$;$;$;$;$^&/&K%(&_&:&<&[&}&|&1&2&3&4&5&6&7&8&9&0&a&b&c&d&e&f&g&h&i&j&k&", "l&m&n&o&p&q&=.r&s&t&t&r$;$;$m$;$r$u&v&w&x&t$y&z&A&B&x@C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V& ", "W&X&Y&Z&`& *.*+*@*#*$*%*&***=*A@-*;*>*,*'*)*!*~*{*]*^*/*(*_*:*<*[*}*|*1* 2* ", " 3*4*5*6*7*8*9*0*a*b*c*d*e*f*g*h*z@i*j*k*l*m*n*8%o*p*q*r* ", " s*t*u*v*w*x*y*z*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S* ", " T*U*V*W*X*Y*Z*`* =.=+=@=#=$=%=&=*===-=;=>=,='=)=!= ", " ~={=]=^=/=(=_=:=<=n*[=}=|=1=2=3=4=5=6=7=8=9= ", " 0=a=b=c=d=e=f=g=o%h=i=j=k=l=m=n=o=p=q=r= ", " s=t=u=v=w=x=y=z=A=B=C=D=E=F=G=H= ", " I=J=K=L=M=N=O=P=Q=R=S=T=U=V= ", " W=X=Y=Z=`= -.-+-@- ", " ", " ", " "}; fldigi-3.21.80/src/misc/macroedit.cxx0000664000175000017500000003235212313064025014264 00000000000000// ---------------------------------------------------------------------------- // macroedit.cxx // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #ifndef __MINGW32__ # include #endif #include #include #include #include #include #include "macros.h" #include "macroedit.h" #include "globals.h" #include "status.h" #include "fileselect.h" #include "fl_lock.h" #include "fl_digi.h" #include "main.h" #include "gettext.h" #include "pixmaps.h" #include "configuration.h" using namespace std; Fl_Double_Window *MacroEditDialog = (Fl_Double_Window *)0; Fl_Button *btnMacroEditApply = (Fl_Button *)0; Fl_Button *btnMacroEditClose = (Fl_Button *)0; Fl_Button *btnInsertMacro = (Fl_Button *)0; Fl_Input2 *macrotext = (Fl_Input2 *)0; Fl_Input2 *labeltext = (Fl_Input2 *)0; static int widths[] = {150, 0}; Fl_Hold_Browser *macroDefs=(Fl_Hold_Browser *)0; static int iMacro, iType; static Fl_Input* iInput; // fl_color(0) is always the foreground colour #define LINE_SEP "@B0" void loadBrowser(Fl_Widget *widget) { Fl_Browser *w = (Fl_Browser *)widget; /* Do not translate the tags lefthand-side */ w->add(_("\tmy frequency")); w->add(_("\tmode")); w->add(_("\tmy call")); w->add(_("\tmy locator")); w->add(_("\tmy name")); w->add(_("\tmy QTH")); w->add(_("\tmy RST")); w->add(_("\tmy antenna")); w->add(_("\toperating band")); w->add(LINE_SEP); w->add(_("\tFldigi version")); w->add(LINE_SEP); w->add(_("\tother call")); w->add(_("\tS/N etc.")); w->add(_("\tIMD etc.")); w->add(_("\tother locator")); w->add(_("\tother name")); w->add(_("\tother QTH")); w->add(_("\tother RST")); w->add(_("\t# QSO recs")); w->add(_("\tnext QSO rec #")); w->add(_("\tmap on google")); w->add(_("\tmap by value")); w->add(LINE_SEP); w->add(_("\tclear RX pane")); w->add(_("\tclear TX pane")); w->add(LINE_SEP); w->add(_("\ttext to NAME/QTH")); #ifdef __WIN32__ w->add(LINE_SEP); w->add(_("\tDigitalk On, Off, Toggle")); #endif w->add(LINE_SEP); w->add(_("\tclear log fields")); w->add(_("\tsave QSO data")); w->add(_("\tsaveQSO data, append msg to notes")); w->add(_("\tlog at xmt time")); w->add(_("\tsaveQSO data, append msg to notes")); w->add(_("\tlog eQSL")); w->add(_("\tlog eQSL optional msg")); w->add(LINE_SEP); w->add(_("\tQSO time (HHMM))")); w->add(_("\tLDT in iso-8601 format")); w->add(_("\tLocal datetime")); w->add(_("\tZDT in iso-8601 format")); w->add(_("\tUTC datetime")); w->add(_("\tlocal time HHMM")); w->add(_("\tzulu time HHMMZ")); w->add(_("\tlocal date YYYY-MM-DD")); w->add(_("\tzulu date YYYY-MM-DD Z")); w->add(_("\tget weather data")); w->add(_("\tget weather data for station")); w->add(LINE_SEP); w->add(_("\tcontest counter")); w->add(_("\tdecrement counter")); w->add(_("\tincrement counter")); w->add(_("\texchange in")); w->add(_("\texchange out")); w->add(_("\texchange begin")); w->add(_("\texchange end")); w->add(_("\tsave contest out")); w->add(LINE_SEP); w->add(_("\treceive")); w->add(_("\ttransmit")); w->add(_("\ttoggle T/R")); w->add(_("\tsearch UP for signal")); w->add(_("\tsearch DOWN for signal")); w->add(_("\treturn to sweet spot")); w->add(_("\tmove to freq NNNN Hz")); w->add(_("\tleft-clk QSY button")); w->add(_("\tright-clk QSY button")); w->add(LINE_SEP); w->add(_("\tinsert QRG into Rx text")); w->add(LINE_SEP); w->add(_("\tqsy to kHz, Hz")); w->add(_("\tvalid xcvr mode")); w->add(_("\tvalid xcvr filter width")); w->add(LINE_SEP); w->add(_("\tinsert text file")); w->add(_("\tinsert MFSK image")); w->add(LINE_SEP); w->add(_("\tpause transmit")); w->add(_("\tidle signal for NN.nn sec")); w->add(_("\trepeat every NN sec")); w->add(_("\ttune signal for NN sec")); w->add(_("\tdelay xmt for NN sec")); w->add(_("\trepeat macro continuously")); w->add(_("\tschedule execution")); w->add(LINE_SEP); w->add(_("\t set xmt attenuator")); w->add(LINE_SEP); w->add(_("\tCW identifier")); w->add(_("\tsend mode ID in video text")); w->add(_("\tvideo text")); w->add(_("\tTx RSID on,off,toggle")); w->add(_("\tRx RSID on,off,toggle")); w->add(_("\tTransmit |NN| successive RsID bursts")); w->add(_("\t[Wait][Len](ms)")); w->add(LINE_SEP); w->add(_("\tCW QSK post-timing")); w->add(_("\tCW QSK pre-timing")); w->add(_("\tCW rise time")); w->add(_("\tCW WPM:Farnsworth")); w->add(LINE_SEP); w->add(_("\tsend CAT cmd")); w->add(LINE_SEP); w->add(_("\tAFC on,off,toggle")); w->add(_("\tLOCK on,off,toggle")); w->add(_("\tRev on,off,toggle")); w->add(LINE_SEP); w->add(_("\tchange macro defs file")); w->add(_("\tsave current macro file")); w->add(LINE_SEP); w->add(_("\tuntransmitted comment")); w->add(LINE_SEP); w->add(_("\tmodem timing test internal string")); w->add(_("\tmodem timing test, spec' file")); w->add(_("\tmodem timing test, string 's'")); w->add(LINE_SEP); w->add(_("\tWAV file; internal string")); w->add(_("\tWAV file; spec' file")); w->add(_("\tWAV file; string 's'")); w->add(LINE_SEP); assert(MODE_CONTESTIA < MODE_OLIVIA); char s[256]; for (trx_mode i = 0; i <= MODE_CONTESTIA; i++) { snprintf(s, sizeof(s), "", mode_info[i].sname); w->add(s); } // add some Contestia macros const char* contestia[] = { "250:8", "500:8", "500:16", "1000:8", "1000:16" }; for (size_t i = 0; i < sizeof(contestia)/sizeof(*contestia); i++) { snprintf(s, sizeof(s), "", mode_info[MODE_CONTESTIA].sname, contestia[i]); w->add(s); } for (trx_mode i = MODE_CONTESTIA + 1; i <= MODE_OLIVIA; i++) { snprintf(s, sizeof(s), "", mode_info[i].sname); w->add(s); } assert(MODE_OLIVIA < MODE_RTTY); // add some Olivia macros const char* olivia[] = { "250:8", "500:8", "500:16", "1000:8", "1000:32" }; for (size_t i = 0; i < sizeof(olivia)/sizeof(*olivia); i++) { snprintf(s, sizeof(s), "", mode_info[MODE_OLIVIA].sname, olivia[i]); w->add(s); } for (trx_mode i = MODE_OLIVIA + 1; i <= MODE_RTTY; i++) { snprintf(s, sizeof(s), "", mode_info[i].sname); w->add(s); } // add some RTTY macros const char* rtty[] = { "170:45.45:5", "170:50:5", "850:75:5" }; for (size_t i = 0; i < sizeof(rtty)/sizeof(*rtty); i++) { snprintf(s, sizeof(s), "", mode_info[MODE_RTTY].sname, rtty[i]); w->add(s); } for (trx_mode i = MODE_RTTY + 1; i < NUM_MODES; i++) { snprintf(s, sizeof(s), "", mode_info[i].sname); w->add(s); } #ifndef __MINGW32__ glob_t gbuf; glob(string(ScriptsDir).append("*").c_str(), 0, NULL, &gbuf); if (gbuf.gl_pathc == 0) { globfree(&gbuf); return; } w->add(LINE_SEP); struct stat st; # if defined(__OpenBSD__) for (int i = 0; i < gbuf.gl_pathc; i++) { # else for (size_t i = 0; i < gbuf.gl_pathc; i++) { # endif if (!(stat(gbuf.gl_pathv[i], &st) == 0 && S_ISREG(st.st_mode) && (st.st_mode & S_IXUSR))) continue; const char* p; if ((p = strrchr(gbuf.gl_pathv[i], '/'))) { snprintf(s, sizeof(s), "%s", p+1); w->add(s); } } globfree(&gbuf); #else w->add("\tlaunch a program"); #endif } void cbMacroEditOK(Fl_Widget *w, void *) { if (w == btnMacroEditClose) { MacroEditDialog->hide(); return; } if (iType == MACRO_EDIT_BUTTON) { macros.text[iMacro] = macrotext->value(); macros.name[iMacro] = labeltext->value(); if (progdefaults.mbar2_pos) { if (iMacro < NUMMACKEYS) { btnMacro[iMacro % NUMMACKEYS]->label( macros.name[iMacro].c_str() ); btnMacro[iMacro % NUMMACKEYS]->redraw_label(); } else { btnMacro[(iMacro % NUMMACKEYS) + NUMMACKEYS]->label( macros.name[iMacro].c_str() ); btnMacro[(iMacro % NUMMACKEYS) + NUMMACKEYS]->redraw_label(); } } else { btnMacro[iMacro % NUMMACKEYS]->label( macros.name[iMacro].c_str() ); btnMacro[iMacro % NUMMACKEYS]->redraw_label(); } macros.changed = true; } else if (iType == MACRO_EDIT_INPUT) iInput->value(macrotext->value()); } void cbInsertMacro(Fl_Widget *, void *) { int nbr = macroDefs->value(); if (!nbr) return; string edittext = macrotext->value(); string text = macroDefs->text(nbr); size_t tab = text.find('\t'); if (tab != string::npos) text.erase(tab); if (text == LINE_SEP) return; if (text == "") { string filters = "Text\t*." "txt"; const char* p = FSEL::select(_("Text file to insert"), filters.c_str(), "text." "txt"); if (p) { text.insert(6, p); } else text = ""; } else if ((text == "") || (text == "")) { string filters = "Text\t*." "txt"; const char* p = FSEL::select(_("Test text file"), filters.c_str(), "text." "txt"); if (p) { text.insert(10, p); } else text = ""; } else if (text == "") { string filters = "Text\t*." "txt"; const char *p = FSEL::select(_("MFSK image file"), "*.{png,jpg,bmp}\t*", ""); if (p) { text.insert(7, p); } else text = ""; } else if (text == "") { string filters = "Macrost\t*." "mdf"; const char* p = FSEL::select(_("Change to Macro file"), filters.c_str(), "macros." "mdf"); if (p) { text.insert(8, p); } else text = ""; } #ifdef __MINGW32__ else if (text == "") { string filters = "Exe\t*." "exe"; const char* p = FSEL::select(_("Executable file to insert"), filters.c_str(), "WordPad.exe"); if (p) { string exefile = p; exefile.append(""); text.insert(6, exefile); } else text = ""; } #endif macrotext->insert(text.c_str()); macrotext->take_focus(); } #include Fl_Double_Window* make_macroeditor(void) { Fl_Double_Window* w = new Fl_Double_Window(800, 190, ""); Fl_Group *grpA = new Fl_Group(0, 0, 800, 22); Fl_Group *grpB = new Fl_Group(450, 0, 350, 22); btnInsertMacro = new Fl_Button(450, 2, 40, 20); btnInsertMacro->image(new Fl_Pixmap(left_arrow_icon)); btnInsertMacro->callback(cbInsertMacro); grpB->end(); grpA->end(); Fl_Group *grpC = new Fl_Group(0, 22, 800, 140); Fl_Tile *tile = new Fl_Tile(0,22,800,140); macrotext = new Fl_Input2(0, 22, 450, 140, _("Macro Text")); macrotext->type(FL_MULTILINE_INPUT); macrotext->textfont(FL_COURIER); macrotext->align(FL_ALIGN_TOP); macroDefs = new Fl_Hold_Browser(450, 22, 350, 140, _("Select Tag")); macroDefs->column_widths(widths); macroDefs->align(FL_ALIGN_TOP); Fl_Box *minbox = new Fl_Box(200, 22, 400, 140); minbox->hide(); tile->end(); tile->resizable(minbox); grpC->end(); Fl_Group *grpD = new Fl_Group(0, 164, 452, 24); Fl_Box *box3a = new Fl_Box(0, 164, 327, 24, ""); labeltext = new Fl_Input2(337, 164, 115, 24, _("Macro Button Label")); labeltext->textfont(FL_COURIER); grpD->end(); grpD->resizable(box3a); Fl_Group *grpE = new Fl_Group(452, 164, 348, 24); Fl_Box *box4a = new Fl_Box(452, 164, 92, 24, ""); btnMacroEditApply = new Fl_Button(544, 164, 80, 24, _("Apply")); btnMacroEditApply->callback(cbMacroEditOK); btnMacroEditClose = new Fl_Button(626 , 164, 80, 24, _("Close")); btnMacroEditClose->callback(cbMacroEditOK); grpE->end(); grpE->resizable(box4a); w->end(); w->resizable(grpC); w->size_range( 600, 120); w->xclass(PACKAGE_NAME); loadBrowser(macroDefs); return w; } void editMacro(int n, int t, Fl_Input* in) { if (!MacroEditDialog) MacroEditDialog = make_macroeditor(); if (t == MACRO_EDIT_BUTTON) { string editor_label; editor_label.append(_("Macro editor - ")).append(progStatus.LastMacroFile); if (editor_label != MacroEditDialog->label()) MacroEditDialog->copy_label(editor_label.c_str()); macrotext->value(macros.text[n].c_str()); labeltext->value(macros.name[n].c_str()); labeltext->show(); } else if (t == MACRO_EDIT_INPUT) { MacroEditDialog->label(in->label()); macrotext->value(in->value()); labeltext->hide(); } iMacro = n; iType = t; iInput = in; MacroEditDialog->show(); } fldigi-3.21.80/src/misc/macros.cxx0000664000175000017500000022041412313064025013577 00000000000000// ---------------------------------------------------------------------------- // macros.cxx // // Copyright (C) 2007-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // Copyright (C) 2009 // Chris Sylvain, KB3CS // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "macros.h" #include "gettext.h" #include "main.h" #include "misc.h" #include "fl_digi.h" #include "timeops.h" #include "configuration.h" #include "confdialog.h" #include "logger.h" #include "newinstall.h" #include "globals.h" #include "debug.h" #include "status.h" #include "trx.h" #include "modem.h" #include "qrunner.h" #include "waterfall.h" #include "rigsupport.h" #include "network.h" #include "logsupport.h" #include "icons.h" #include "weather.h" #include "utf8file_io.h" #include "xmlrpc.h" #include #include #include "fileselect.h" #include #include #include #include #include #include #include #ifdef __WIN32__ #include "speak.h" #endif //using namespace std; struct CMDS { std::string cmd; void (*fp)(std::string); }; static queue cmds; // following used for debugging and development void pushcmd(CMDS cmd) { LOG_INFO("%s, # = %d", cmd.cmd.c_str(), (int)cmds.size()); cmds.push(cmd); } // these variables are referenced outside of this file MACROTEXT macros; CONTESTCNTR contest_count; std::string qso_time = ""; std::string qso_exchange = ""; std::string exec_date = ""; std::string exec_time = ""; std::string exec_string = ""; std::string info1msg = ""; std::string info2msg = ""; std::string text2repeat = ""; size_t repeatchar = 0; bool macro_idle_on = false; static float idleTime = 0; static bool TransmitON = false; static bool ToggleTXRX = false; static int mNbr; static std::string text2send = ""; static size_t xbeg = 0, xend = 0; static bool save_xchg; static bool expand; static bool GET = false; static bool timed_exec = false; static bool within_exec = false; static const char cutnumbers[] = "T12345678N"; static std::string cutstr; static std::string cut_string(const char *s) { cutstr = s; if (!progdefaults.cutnbrs || active_modem != cw_modem) return cutstr; for (size_t i = 0; i < cutstr.length(); i++) if (cutstr[i] >= '0' && cutstr[i] <= '9') cutstr[i] = cutnumbers[cutstr[i] - '0']; return cutstr; } static size_t mystrftime( char *s, size_t max, const char *fmt, const struct tm *tm) { return strftime(s, max, fmt, tm); } static string CPSstring = "\ =============================================\n\ ABCDEFGHIJKLMN OPQRSTUVWXYZ\n\ abcdefghijklmn opqrstuvwxyz\n\ 0123456789 9876543210\n\ !@#$%&*()_+-=[]{}\\|;:'\",.<>/?\n\ =============================================\n\ \n\ The Jaberwocky\n\ \n\ 'Twas brillig, and the slithy toves\n\ Did gyre and gimble in the wabe;\n\ All mimsy were the borogoves,\n\ And the mome raths outgrabe.\n\ \n\ \"Beware the Jabberwock, my son!\n\ The jaws that bite, the claws that catch!\n\ Beware the Jubjub bird, and shun\n\ The frumious Bandersnatch!\"\n\ \n\ He took his vorpal sword in hand:\n\ Long time the manxome foe he sought-\n\ So rested he by the Tumtum tree,\n\ And stood awhile in thought.\n\ \n\ And as in uffish thought he stood,\n\ The Jabberwock, with eyes of flame,\n\ Came whiffling through the tulgey wood,\n\ And burbled as it came!\n\ \n\ One, two! One, two! and through and through\n\ The vorpal blade went snicker-snack!\n\ He left it dead, and with its head\n\ He went galumphing back.\n\ \n\ \"And hast thou slain the Jabberwock?\n\ Come to my arms, my beamish boy!\n\ O frabjous day! Callooh! Callay!\"\n\ He chortled in his joy.\n\ \n\ 'Twas brillig, and the slithy toves\n\ Did gyre and gimble in the wabe;\n\ All mimsy were the borogoves,\n\ And the mome raths outgrabe.\n"; bool PERFORM_CPS_TEST = false; int num_cps_chars = 0; string testfilename; void CPS_report(int samples, int prepost) { char results[1000]; double xmttime = 1.0 * samples / active_modem->get_samplerate(); double datatime = 1.0 * (samples - prepost) / active_modem->get_samplerate(); num_cps_chars--; snprintf(results, sizeof(results), "\n\ CPS test\n\ text: %s\n\ mode: %s\n\ # chars: %d\n\ xmt time: %f\n\ data time: %f\n\ xmt samples: %d\n\ prepost: %d\n\ data samples: %d\n\ sample rate: %d\n\ chars/sec: %f\n\ ~WPM: %f\n", testfilename.c_str(), mode_info[active_modem->get_mode()].name, num_cps_chars, xmttime, datatime, samples, prepost, samples - prepost, active_modem->get_samplerate(), num_cps_chars / datatime, 10 * num_cps_chars / datatime); ReceiveText->add(results, FTextBase::ALTR); LOG_INFO("%s", results); PERFORM_CPS_TEST = false; } static void pCPS_TEST(std::string &s, size_t &i, size_t endbracket) { s.clear(); trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { ReceiveText->add("Mode not supported\n", FTextBase::ALTR); return; } testfilename = "internal string"; stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; trx_transmit(); int s0 = number_of_samples(""); int s1 = 0; int start_stop_samples = 0; int j = 0; for(j = 1; j < 32; j++) { s1 = number_of_samples(string(j, 'e')); if(s1 > s0) break; } start_stop_samples = 2*s0 - s1; num_cps_chars = 0; CPS_report(number_of_samples(CPSstring), start_stop_samples); PERFORM_CPS_TEST = false; } static void pCPS_FILE(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string fname = s.substr(i+10, endbracket - i - 10); if (fname.length() > 0 && !within_exec) { FILE *toadd = fopen(fname.c_str(), "r"); if (toadd) { std::string buffer; char c = getc(toadd); while (c && !feof(toadd)) { if (c != '\r') buffer += c; // damn MSDOS txt files c = getc(toadd); } s.clear(); fclose(toadd); TransmitText->clear(); testfilename = fname; stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; trx_transmit(); int s0 = number_of_samples(""); int s1 = 0; int start_stop_samples = 0; int j = 0; for(j = 1; j < 32; j++) { s1 = number_of_samples(string(j, 'e')); if(s1 > s0) break; } start_stop_samples = 2*s0 - s1; num_cps_chars = 0; CPS_report(number_of_samples(buffer), start_stop_samples); PERFORM_CPS_TEST = false; } else { string resp = "Could not locate "; resp.append(fname).append("\n"); ReceiveText->add(resp.c_str(), FTextBase::ALTR); LOG_WARN("%s not found", fname.c_str()); s.replace(i, endbracket - i + 1, ""); PERFORM_CPS_TEST = false; } } else { PERFORM_CPS_TEST = false; s.clear(); } } static void pCPS_STRING(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string buffer = s.substr(i+12, endbracket - i - 12); std::string txtbuf = buffer; s.clear(); size_t p = buffer.find("\\n"); while (p != string::npos) { buffer.replace(p,2,"\n"); p = buffer.find("\\n"); } if (buffer.length()) { TransmitText->clear(); stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; trx_transmit(); int s0 = number_of_samples(""); printf("j %d: s %d\n", 0, s0); int s1 = 0; int start_stop_samples = 0; int j = 0; for(j = 1; j < 32; j++) { s1 = number_of_samples(string(j, 'e')); printf("j %d: s %d\n", j, s1); if(s1 > s0) break; } start_stop_samples = 2*s0 - s1; num_cps_chars = 0; testfilename = txtbuf; CPS_report(number_of_samples(buffer), start_stop_samples); PERFORM_CPS_TEST = false; } else { string resp = "Text not specified"; LOG_WARN("%s", resp.c_str()); resp.append("\n"); ReceiveText->add(resp.c_str(), FTextBase::ALTR); PERFORM_CPS_TEST = false; } } static void pWAV_TEST(std::string &s, size_t &i, size_t endbracket) { s.clear(); trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { ReceiveText->add("Mode not supported\n", FTextBase::ALTR); return; } testfilename = "internal string"; stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; trx_transmit(); number_of_samples(CPSstring); PERFORM_CPS_TEST = false; } static void pWAV_FILE(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string fname = s.substr(i+10, endbracket - i - 10); if (fname.length() > 0 && !within_exec) { FILE *toadd = fopen(fname.c_str(), "r"); if (toadd) { std::string buffer; char c = getc(toadd); while (c && !feof(toadd)) { if (c != '\r') buffer += c; // damn MSDOS txt files c = getc(toadd); } s.clear(); fclose(toadd); TransmitText->clear(); testfilename = fname; stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; trx_transmit(); number_of_samples(buffer); PERFORM_CPS_TEST = false; } else { string resp = "Could not locate "; resp.append(fname).append("\n"); ReceiveText->add(resp.c_str(), FTextBase::ALTR); LOG_WARN("%s not found", fname.c_str()); s.replace(i, endbracket - i + 1, ""); PERFORM_CPS_TEST = false; } } else { PERFORM_CPS_TEST = false; s.clear(); } } static void pWAV_STRING(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string buffer = s.substr(i+12, endbracket - i - 12); std::string txtbuf = buffer; s.clear(); size_t p = buffer.find("\\n"); while (p != string::npos) { buffer.replace(p,2,"\n"); p = buffer.find("\\n"); } if (buffer.length()) { TransmitText->clear(); stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; trx_transmit(); testfilename = txtbuf; number_of_samples(buffer); PERFORM_CPS_TEST = false; } else { string resp = "Text not specified"; LOG_WARN("%s", resp.c_str()); resp.append("\n"); ReceiveText->add(resp.c_str(), FTextBase::ALTR); PERFORM_CPS_TEST = false; } } static void pCOMMENT(std::string &s, size_t &i, size_t endbracket) { s.replace(i, endbracket - i + 1, ""); if (s[i] == '\n') i++; } static void pFILE(std::string &s, size_t &i, size_t endbracket) { std::string fname = s.substr(i+6, endbracket - i - 6); if (fname.length() > 0 && !within_exec) { FILE *toadd = fopen(fname.c_str(), "r"); if (toadd) { std::string buffer; char c = getc(toadd); while (c && !feof(toadd)) { if (c != '\r') buffer += c; // damn MSDOS txt files c = getc(toadd); } s.replace(i, endbracket - i + 1, buffer); fclose(toadd); } else { LOG_WARN("%s not found", fname.c_str()); s.replace(i, endbracket - i + 1, ""); } } else s.replace(i, endbracket - i + 1, ""); } static void pTIMER(std::string &s, size_t &i, size_t endbracket) { int number; std::string sTime = s.substr(i+7, endbracket - i - 7); if (sTime.length() > 0 && !within_exec) { sscanf(sTime.c_str(), "%d", &number); progStatus.timer = number; progStatus.timerMacro = mNbr; } s.replace(i, endbracket - i + 1, ""); } static void pREPEAT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } progStatus.repeatMacro = mNbr; s.replace(i, endbracket - i + 1, ""); text2repeat = s; repeatchar = 0; s.insert(i, "[REPEAT]"); } static void pWPM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int number; std::string snumber = s.substr(i+5, endbracket - i - 5); if (snumber.length() > 0) { // first value = WPM sscanf(snumber.c_str(), "%d", &number); if (number < 5) number = 5; if (number > 200) number = 200; progdefaults.CWspeed = number; sldrCWxmtWPM->value(number); // second value = Farnsworth WPM size_t pos; if ((pos = snumber.find(":")) != std::string::npos) { snumber.erase(0, pos+1); if (snumber.length()) sscanf(snumber.c_str(), "%d", &number); if (number < 15) number = 15; if (number > 200) number = 200; progdefaults.CWfarnsworth = number; sldrCWfarnsworth->value(number); } } s.replace(i, endbracket - i + 1, ""); } static void pRISETIME(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } float number; std::string sVal = s.substr(i+6, endbracket - i - 6); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < 0) number = 0; if (number > 20) number = 20; progdefaults.CWrisetime = number; cntCWrisetime->value(number); } s.replace(i, endbracket - i + 1, ""); } static void pPRE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } float number; std::string sVal = s.substr(i+5, endbracket - i - 5); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < 0) number = 0; if (number > 20) number = 20; progdefaults.CWpre = number; cntPreTiming->value(number); } s.replace(i, endbracket - i + 1, ""); } static void pPOST(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } float number; std::string sVal = s.substr(i+6, endbracket - i - 6); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < -20) number = -20; if (number > 20) number = 20; progdefaults.CWpost = number; cntPostTiming->value(number); } s.replace(i, endbracket - i + 1, ""); } static void setwpm(int d) { sldrCWxmtWPM->value(d); cntCW_WPM->value(d); } static void setfwpm(int d) { sldrCWfarnsworth->value(d); progdefaults.CWusefarnsworth = true; btnCWusefarnsworth->value(1); } static void doWPM(std::string s) { int number; std::string snumber = s.substr(6); if (snumber.length() > 0) { // first value = WPM sscanf(snumber.c_str(), "%d", &number); if (number < 5) number = 5; if (number > 200) number = 200; progdefaults.CWspeed = number; REQ(setwpm, number); // second value = Farnsworth WPM size_t pos; if ((pos = snumber.find(":")) != std::string::npos) { snumber.erase(0, pos+1); if (snumber.length()) sscanf(snumber.c_str(), "%d", &number); if (number < 15) number = 15; if (number > 200) number = 200; progdefaults.CWfarnsworth = number; REQ(setfwpm, number); } } } static void pQueWPM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doWPM }; pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void setRISETIME(int d) { cntCWrisetime->value(d); } static void doRISETIME(std::string s) { float number; std::string sVal = s.substr(7, s.length() - 8); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < 0) number = 0; if (number > 20) number = 20; progdefaults.CWrisetime = number; REQ(setRISETIME, number); } } static void pQueRISETIME(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRISETIME }; pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void setPRE(int d) { cntPreTiming->value(d); } static void doPRE(std::string s) { float number; std::string sVal = s.substr(6, s.length() - 7); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < 0) number = 0; if (number > 20) number = 20; progdefaults.CWpre = number; REQ(setPRE, number); } } static void pQuePRE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doPRE }; pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void setPOST(int d) { cntPostTiming->value(d); } static void doPOST(std::string s) { float number; std::string sVal = s.substr(7, s.length() - 8); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < -20) number = -20; if (number > 20) number = 20; progdefaults.CWpost = number; REQ(setPOST, number); } } static void pQuePOST(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doPOST }; pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void setTXATTEN(float v) { int d = (int)(v * 10); v = d / 10.0; v = clamp(v, -30.0, 0.0); progdefaults.txlevel = v; cntTxLevel->value(progdefaults.txlevel);; } static void pTXATTEN(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } float number; std::string sVal = s.substr(i+9, endbracket - i - 9); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); setTXATTEN(number); } s.replace(i, endbracket - i + 1, ""); } static void doTXATTEN(std::string s) { float number; std::string sVal = s.substr(10); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); REQ(setTXATTEN, number); } } static void pQueTXATTEN(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doTXATTEN }; pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pIDLE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } float number; std::string sTime = s.substr(i+6, endbracket - i - 6); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%f", &number); macro_idle_on = true; idleTime = number; } s.replace(i, endbracket - i + 1, ""); } static void doneIDLE(void *) { Qidle_time = 0; } static void doIDLE(std::string s) { float number; std::string sTime = s.substr(7, s.length() - 8); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%f", &number); Qidle_time = 1; Fl::add_timeout(number, doneIDLE); } else { Qidle_time = 0; } } static void pQueIDLE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doIDLE }; pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static bool useTune = false; static int tuneTime = 0; static void pTUNE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int number; std::string sTime = s.substr(i+6, endbracket - i - 6); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%d", &number); useTune = true; tuneTime = number; } s.replace(i, endbracket - i + 1, ""); } static void pQSONBR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } char szqsonbr[10]; snprintf(szqsonbr, sizeof(szqsonbr), "%d", qsodb.nbrRecs()); s.replace(i, endbracket - i + 1, szqsonbr); } static void pNXTNBR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } char szqsonbr[10]; snprintf(szqsonbr, sizeof(szqsonbr), "%d", qsodb.nbrRecs() + 1); s.replace(i, endbracket - i + 1, szqsonbr); } static void pNRSID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int number = 0; std::string sNumber = s.substr(i+7, endbracket - i - 7); if (sNumber.length() > 0) { sscanf(sNumber.c_str(), "%d", &number); progStatus.n_rsids = number; } s.replace(i, endbracket - i + 1, ""); } static bool useWait = false; static int waitTime = 0; static void pWAIT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int number; std::string sTime = s.substr(i+6, endbracket - i - 6); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%d", &number); useWait = true; waitTime = number; } s.replace(i, endbracket - i + 1, ""); } static void doneWAIT(void *) { Qwait_time = 0; start_tx(); } static void doWAIT(std::string s) { int number; std::string sTime = s.substr(7, s.length() - 8); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%d", &number); Qwait_time = number; Fl::add_timeout (number * 1.0, doneWAIT); } else Qwait_time = 0; que_ok = true; } static void pQueWAIT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doWAIT }; pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pINFO1(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, info1msg ); } static void pINFO2(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, info2msg ); } static void pCLRRX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 7, "" ); ReceiveText->clear(); } static void pCLRTX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 7, "" ); queue_reset(); TransmitText->clear(); } static void pCALL(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, inpCall->value() ); } static void pGET(std::string &s, size_t &i, size_t endbracket) { s.erase( i, 9 ); GET = true; } static void pFREQ(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, inpFreq->value() ); } static void pBAND(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, band_name( band( wf->rfcarrier() ) ) ); } static void pLOC(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 5, inpLoc->value() ); } static void pMODE(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, active_modem->get_mode_name()); } static void pNAME(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, inpName->value() ); } static void pQTH(std::string &s, size_t &i, size_t endbracket) { s.replace( i,5, inpQth->value() ); } static void pQSOTIME(std::string &s, size_t &i, size_t endbracket) { qso_time = inpTimeOff->value(); s.replace( i, 9, qso_time.c_str() ); } static void pRST(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 5, cut_string(inpRstOut->value())); } static void pMYCALL(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 8, progdefaults.myCall.c_str() ); } static void pMYLOC(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, progdefaults.myLocator.c_str() ); } static void pMYNAME(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 8, progdefaults.myName.c_str() ); } static void pMYQTH(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, progdefaults.myQth.c_str() ); } static void pMYRST(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, inpRstIn->value() ); } static void pANTENNA(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 9, progdefaults.myAntenna.c_str() ); } static void pLDT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; time_t tmptr; tm sTime; time (&tmptr); localtime_r(&tmptr, &sTime); mystrftime(szDt, 79, "%x %H:%M %Z", &sTime); s.replace( i, 5, szDt); } static void pILDT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; time_t tmptr; tm sTime; time (&tmptr); localtime_r(&tmptr, &sTime); mystrftime(szDt, 79, "%Y-%m-%d %H:%M%z", &sTime); s.replace( i, 6, szDt); } static void pZDT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; time_t tmptr; tm sTime; time (&tmptr); gmtime_r(&tmptr, &sTime); mystrftime(szDt, 79, "%x %H:%MZ", &sTime); s.replace( i, 5, szDt); } static void pIZDT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; time_t tmptr; tm sTime; time (&tmptr); gmtime_r(&tmptr, &sTime); mystrftime(szDt, 79, "%Y-%m-%d %H:%MZ", &sTime); s.replace( i, 6, szDt); } static void pLT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; time_t tmptr; tm sTime; time (&tmptr); localtime_r(&tmptr, &sTime); mystrftime(szDt, 79, "%H%M", &sTime); s.replace( i, 4, szDt); } static void pZT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; time_t tmptr; tm sTime; time (&tmptr); gmtime_r(&tmptr, &sTime); mystrftime(szDt, 79, "%H%MZ", &sTime); s.replace( i, 4, szDt); } static void pLD(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; time_t tmptr; tm sTime; time (&tmptr); localtime_r(&tmptr, &sTime); mystrftime(szDt, 79, "%Y-%m-%d", &sTime); s.replace( i, 4, szDt); } static void pZD(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; time_t tmptr; tm sTime; time (&tmptr); gmtime_r(&tmptr, &sTime); mystrftime(szDt, 79, "%Y-%m-%d", &sTime); s.replace( i, 4, szDt); } static void p_ID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } progdefaults.macroid = true; s.replace( i, 4, ""); } static void pTEXT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } progdefaults.macrotextid = true; s.replace( i, 6, ""); } static void pCWID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } progdefaults.macroCWid = true; s.replace( i, 6, ""); } static void doDTMF(std::string s) { progdefaults.DTMFstr = s.substr(6, s.length() - 7); } static void pDTMF(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } CMDS cmd = {s.substr(i, endbracket - i + 1), doDTMF}; pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pPAUSE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace (i, 7, "^p"); } static void pRX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace (i, 4, "^r"); } static void pTX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.erase(i, 4); TransmitON = true; } static void pTXRX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.erase(i, 7); ToggleTXRX = true; } static std::string hexstr(std::string &s) { static std::string hex; static char val[3]; hex.clear(); for (size_t i = 0; i < s.length(); i++) { snprintf(val, sizeof(val), "%02x", s[i] & 0xFF); hex.append("<").append(val).append(">"); } return hex; } static void pRIGCAT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } LOG_INFO("cat cmd:retnbr %s", s.c_str()); size_t start = s.find(':', i); std::basic_string buff; size_t val = 0; int retnbr = 0; char c, ch; bool asciisw = false; bool valsw = false; for (size_t j = start+1 ; j <= endbracket ; j++) { ch = s[j]; if (ch == '\"') { asciisw = !asciisw; continue; } // accumulate ascii string if (asciisw) { if (isprint(ch)) buff += ch; continue; } // following digits is expected size of CAT response from xcvr if (ch == ':' && s[j+1] != '>') { sscanf(&s[j+1], "%d", &retnbr); } // accumulate hex string values if ((ch == ' ' || ch == '>' || ch == ':') && valsw) { c = char(val); // LOG_INFO("c=%02x, val=%d", c, val); buff += c; val = 0; valsw = false; } else { val *= 16; ch = toupper(ch); if (isdigit(ch)) val += ch - '0'; else if (ch >= 'A' && ch <= 'F') val += ch - 'A' + 10; valsw = true; } if (ch == ':') break; } LOG_INFO("cat %s", hexstr(buff).c_str()); sendCommand(buff, retnbr, progdefaults.RigCatWait); s.replace(i, endbracket - i + 1, ""); } static void pVER(std::string &s, size_t &i, size_t endbracket) { std::string progname; progname = "Fldigi "; progname.append(PACKAGE_VERSION); s.replace( i, 5, progname ); } static void pCNTR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int contestval; contestval = contest_count.count; if (contestval) { contest_count.Format(progdefaults.ContestDigits, progdefaults.UseLeadingZeros); snprintf(contest_count.szCount, sizeof(contest_count.szCount), contest_count.fmt.c_str(), contestval); s.replace (i, 6, cut_string(contest_count.szCount)); } else s.replace (i, 6, ""); } static void pDECR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } contest_count.count--; if (contest_count.count < 0) contest_count.count = 0; s.replace (i, 6, ""); updateOutSerNo(); } static void pINCR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } contest_count.count++; s.replace (i, 6, ""); updateOutSerNo(); } static void pXIN(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 5, inpXchgIn->value() ); } static void pXOUT(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, cut_string(progdefaults.myXchg.c_str())); } static void pXBEG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 6, ""); xbeg = i; } static void pXEND(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 6, ""); xend = i; } static void pSAVEXCHG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } save_xchg = true; s.replace( i, 10, ""); } static void pLOG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } size_t start = s.find(':', i); if (start != std::string::npos) { string msg = inpNotes->value(); if (!msg.empty()) msg.append("\n"); msg.append(s.substr(start + 1, endbracket-start-1)); inpNotes->value(msg.c_str()); } s.replace(i, endbracket - i + 1, ""); qsoSave_cb(0, 0); } static void pLNW(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } size_t start = s.find(':', i); if (start != std::string::npos) { string msg = inpNotes->value(); if (!msg.empty()) msg.append("\n"); msg.append(s.substr(start + 1, endbracket-start-1)); inpNotes->value(msg.c_str()); } s.replace(i, endbracket - i + 1, "^L"); } static void pCLRLOG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace(i, 10, "^C"); } static void pMODEM_compSKED(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } size_t j, k, len = s.length(); std::string name; if ((j = s.find('>', i)) == std::string::npos) return; while (++j < len) if (!isspace(s[j])) break; k = j; while (++k < len) if (isspace(s[k]) || s[k] == '<') break; name = s.substr(j, k - j); for (int m = 0; m < NUM_MODES; m++) { if (name == mode_info[m].sname) { if (active_modem->get_mode() != mode_info[m].mode) init_modem(mode_info[m].mode); break; } } s.erase(i, k-i); } static void doIMAGE(std::string s) { if (s.length() > 0) { string fname = s.substr(7); fname.erase(fname.length() - 1); trx_mode active_mode = active_modem->get_mode(); if ((active_mode == MODE_MFSK16 || active_mode == MODE_MFSK32 || active_mode == MODE_MFSK64 || active_mode == MODE_MFSK128) && active_modem->get_cap() & modem::CAP_IMG) { active_modem->send_image(fname); } } que_ok = true; } static void pQueIMAGE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } string cmdstr = s.substr(i, endbracket - i + 1); struct CMDS cmd = { cmdstr, doIMAGE }; pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } #include #include "re.h" static void doMODEM(std::string s) { static fre_t re("", REG_EXTENDED); std::string tomatch = s; if (!re.match(tomatch.c_str())) { que_ok = true; return; } const std::vector& o = re.suboff(); std::string name = tomatch.substr(o[1].rm_so, o[1].rm_eo - o[1].rm_so); trx_mode m; for (m = 0; m < NUM_MODES; m++) if (name == mode_info[m].sname) break; // do we have arguments and a valid modem? if (o.size() == 2 || m == NUM_MODES) { que_ok = true; return; } // parse arguments vector args; args.reserve(8); char* end; double d; for (const char* p = s.c_str() + o[2].rm_so + 1; *p; p++) { errno = 0; d = strtod(p, &end); if (!errno && p != end) { args.push_back(d); p = end; } else // push an invalid value args.push_back(DBL_MIN); } try { switch (m) { case MODE_RTTY: // carrier shift, baud rate, bits per char if (args.at(0) != DBL_MIN) set_rtty_shift((int)args[0]); if (args.at(1) != DBL_MIN) set_rtty_baud((float)args[1]); if (args.at(2) != DBL_MIN) set_rtty_bits((int)args[2]); break; case MODE_CONTESTIA: // bandwidth, tones if (args.at(0) != DBL_MIN) set_contestia_bw((int)args[0]); if (args.at(1) != DBL_MIN) set_contestia_tones((int)args[1]); break; case MODE_OLIVIA: // bandwidth, tones if (args.at(0) != DBL_MIN && args.at(1) != DBL_MIN) { int bw = (int)args[0]; int tones = (int)args[1]; if (bw == 250 && tones == 4) m = MODE_OLIVIA_4_250; else if (bw == 250 && tones == 8) m = MODE_OLIVIA_8_250; else if (bw == 500 && tones == 4) m = MODE_OLIVIA_4_500; else if (bw == 500 && tones == 8) m = MODE_OLIVIA_8_500; else if (bw == 500 && tones == 16) m = MODE_OLIVIA_16_500; else if (bw == 1000 && tones == 8) m = MODE_OLIVIA_8_1000; else if (bw == 1000 && tones == 16) m = MODE_OLIVIA_16_1000; else if (bw == 1000 && tones == 32) m = MODE_OLIVIA_32_1000; else if (bw == 2000 && tones == 64) m = MODE_OLIVIA_64_2000; else { set_olivia_bw(bw); set_olivia_tones(tones); } } break; default: break; } } catch (const exception& e) { } if (active_modem->get_mode() != mode_info[m].mode) init_modem_sync(mode_info[m].mode); que_ok = true; } static void pQueMODEM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } string cmdstr = s.substr(i, endbracket - i + 1); struct CMDS cmd = { cmdstr, doMODEM }; if (cmdstr.find("SSB") != string::npos || cmdstr.find("ANALYSIS") != string::npos) { LOG_ERROR("Disallowed: %s", cmdstr.c_str()); size_t nextbracket = s.find('<', endbracket); if (nextbracket != string::npos) s.erase(i, nextbracket - i - 1); else s.clear(); } else { pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } } static void pMODEM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } static fre_t re("", REG_EXTENDED); if (!re.match(s.c_str() + i)) { size_t end = s.find('>', i); if (end != std::string::npos) s.erase(i, end - i); return; } const std::vector& o = re.suboff(); std::string name = s.substr(o[1].rm_so, o[1].rm_eo - o[1].rm_so); trx_mode m; for (m = 0; m < NUM_MODES; m++) if (name == mode_info[m].sname) break; // do we have arguments and a valid modem? if (o.size() == 2 || m == NUM_MODES) { if (m < NUM_MODES && active_modem->get_mode() != mode_info[m].mode) init_modem(mode_info[m].mode); s.erase(i, o[0].rm_eo - i); return; } // parse arguments vector args; args.reserve(8); char* end; double d; for (const char* p = s.c_str() + o[2].rm_so + 1; *p; p++) { errno = 0; d = strtod(p, &end); if (!errno && p != end) { args.push_back(d); p = end; } else // push an invalid value args.push_back(DBL_MIN); } try { switch (m) { case MODE_RTTY: // carrier shift, baud rate, bits per char if (args.at(0) != DBL_MIN) set_rtty_shift((int)args[0]); if (args.at(1) != DBL_MIN) set_rtty_baud((float)args[1]); if (args.at(2) != DBL_MIN) set_rtty_bits((int)args[2]); break; case MODE_CONTESTIA: // bandwidth, tones if (args.at(0) != DBL_MIN) set_contestia_bw((int)args[0]); if (args.at(1) != DBL_MIN) set_contestia_tones((int)args[1]); break; case MODE_OLIVIA: // bandwidth, tones if (args.at(0) != DBL_MIN && args.at(1) != DBL_MIN) { int bw = (int)args[0]; int tones = (int)args[1]; if (bw == 250 && tones == 4) m = MODE_OLIVIA_4_250; else if (bw == 250 && tones == 8) m = MODE_OLIVIA_8_250; else if (bw == 500 && tones == 4) m = MODE_OLIVIA_4_500; else if (bw == 500 && tones == 8) m = MODE_OLIVIA_8_500; else if (bw == 500 && tones == 16) m = MODE_OLIVIA_16_500; else if (bw == 1000 && tones == 8) m = MODE_OLIVIA_8_1000; else if (bw == 1000 && tones == 16) m = MODE_OLIVIA_16_1000; else if (bw == 1000 && tones == 32) m = MODE_OLIVIA_32_1000; else if (bw == 2000 && tones == 64) m = MODE_OLIVIA_64_2000; else { set_olivia_bw(bw); set_olivia_tones(tones); } } break; default: break; } } catch (const exception& e) { } if (active_modem->get_mode() != mode_info[m].mode) { init_modem(mode_info[m].mode); int count = 100; while ((active_modem->get_mode() != mode_info[m].mode) && --count) MilliSleep(10); } s.replace(i, endbracket - i + 1, ""); } static void pAFC(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+5, endbracket - i - 5); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) btnAFC->value(1); else if (sVal.compare(0,3,"off") == 0) btnAFC->value(0); else if (sVal.compare(0,1,"t") == 0) btnAFC->value(!btnAFC->value()); btnAFC->do_callback(); } s.replace(i, endbracket - i + 1, ""); } static void pREV(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+5, endbracket - i - 5); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) wf->btnRev->value(1); else if (sVal.compare(0,3,"off") == 0) wf->btnRev->value(0); else if (sVal.compare(0,1,"t") == 0) wf->btnRev->value(!wf->btnRev->value()); wf->btnRev->do_callback(); } s.replace(i, endbracket - i + 1, ""); } // static void pHS(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+4, endbracket - i - 4); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) bHighSpeed = 1; else if (sVal.compare(0,3,"off") == 0) bHighSpeed = 0; else if (sVal.compare(0,1,"t") == 0) bHighSpeed = !bHighSpeed; } s.replace(i, endbracket - i + 1, ""); } static void pLOCK(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+6, endbracket - i - 6); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) wf->xmtlock->value(1); else if (sVal.compare(0,3,"off") == 0) wf->xmtlock->value(0); else if (sVal.compare(0,1,"t") == 0) wf->xmtlock->value(!wf->xmtlock->value()); wf->xmtlock->damage(); wf->xmtlock->do_callback(); } s.replace(i, endbracket - i + 1, ""); } static void pTX_RSID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+8, endbracket - i - 8); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) btnTxRSID->value(1); else if (sVal.compare(0,3,"off") == 0) btnTxRSID->value(0); else if (sVal.compare(0,1,"t") == 0) btnTxRSID->value(!btnTxRSID->value()); btnTxRSID->do_callback(); } s.replace(i, endbracket - i + 1, ""); } static void pRX_RSID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+8, endbracket - i - 8); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) btnRSID->value(1); else if (sVal.compare(0,3,"off") == 0) btnRSID->value(0); else if (sVal.compare(0,1,"t") == 0) btnRSID->value(!btnRSID->value()); btnRSID->do_callback(); } s.replace(i, endbracket - i + 1, ""); } #ifdef __WIN32__ static void pTALK(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i+6, endbracket - i - 6); if (sVal.length() > 0) { // sVal = on|off [ON, OFF] if (sVal.compare(0,2,"on") == 0) open_talker(); else if (sVal.compare(0,3,"off") == 0) close_talker(); else if (sVal.compare(0,1,"t") == 0) toggle_talker(); } s.replace(i, endbracket - i + 1, ""); } #endif static void pSRCHUP(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 8, ""); active_modem->searchUp(); if (progdefaults.WaterfallClickInsert) wf->insert_text(true); } static void pSRCHDN(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 8, ""); active_modem->searchDown(); if (progdefaults.WaterfallClickInsert) wf->insert_text(true); } static void pGOHOME(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 8, ""); if (active_modem == cw_modem) active_modem->set_freq(progdefaults.CWsweetspot); else if (active_modem == rtty_modem) active_modem->set_freq(progdefaults.RTTYsweetspot); else active_modem->set_freq(progdefaults.PSKsweetspot); } static void doGOHOME(std::string s) { if (active_modem == cw_modem) active_modem->set_freq(progdefaults.CWsweetspot); else if (active_modem == rtty_modem) active_modem->set_freq(progdefaults.RTTYsweetspot); else active_modem->set_freq(progdefaults.PSKsweetspot); que_ok = true; } static void pQueGOHOME(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doGOHOME }; pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pGOFREQ(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int number; std::string sGoFreq = s.substr(i+8, endbracket - i - 8); if (sGoFreq.length() > 0) { sscanf(sGoFreq.c_str(), "%d", &number); if (number < progdefaults.LowFreqCutoff) number = progdefaults.LowFreqCutoff; if (number > progdefaults.HighFreqCutoff) number = progdefaults.HighFreqCutoff; active_modem->set_freq(number); } s.replace(i, endbracket - i + 1, ""); } static void doGOFREQ(std::string s) { int number; std::string sGoFreq = s.substr(9, s.length() - 10); if (sGoFreq.length() > 0) { sscanf(sGoFreq.c_str(), "%d", &number); if (number < progdefaults.LowFreqCutoff) number = progdefaults.LowFreqCutoff; if (number > progdefaults.HighFreqCutoff) number = progdefaults.HighFreqCutoff; active_modem->set_freq(number); } que_ok = true; } static void pQueGOFREQ(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doGOFREQ }; pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pQRG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string prefix = "\n"; prefix.append(s.substr(i+5, endbracket - i - 5)); if (prefix.length()) note_qrg ( false, prefix.c_str(), "\n" ); s.replace(i, endbracket - i + 1, ""); } static void pQSYTO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 7, ""); do_qsy(true); } static void pQSYFM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.replace( i, 7, ""); do_qsy(false); } static void pQSY(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int rf = 0; int audio = 0; float rfd = 0; std::string sGoFreq = s.substr(i+5, endbracket - i - 5); // no frequency(s) specified if (sGoFreq.length() == 0) { s.replace(i, endbracket-i+1, ""); return; } // rf first value sscanf(sGoFreq.c_str(), "%f", &rfd); if (rfd > 0) rf = (int)(1000*rfd); size_t pos; if ((pos = sGoFreq.find(":")) != std::string::npos) { // af second value sGoFreq.erase(0, pos+1); if (sGoFreq.length()) sscanf(sGoFreq.c_str(), "%d", &audio); if (audio < 0) audio = 0; if (audio < progdefaults.LowFreqCutoff) audio = progdefaults.LowFreqCutoff; if (audio > progdefaults.HighFreqCutoff) audio = progdefaults.HighFreqCutoff; } if (rf && rf != wf->rfcarrier()) qsy(rf, audio); else active_modem->set_freq(audio); s.replace(i, endbracket - i + 1, ""); } static void doQSY(std::string s) { int rf = 0; int audio = 0; float rfd = 0; std::string sGoFreq; sGoFreq = s.substr(6, s.length() - 7); // no frequency(s) specified if (sGoFreq.length() == 0) { que_ok = true; return; } // rf first value sscanf(sGoFreq.c_str(), "%f", &rfd); if (rfd > 0) rf = (int)(1000*rfd); size_t pos; if ((pos = sGoFreq.find(":")) != std::string::npos) { // af second value sGoFreq.erase(0, pos+1); if (sGoFreq.length()) sscanf(sGoFreq.c_str(), "%d", &audio); if (audio < 0) audio = 0; if (audio < progdefaults.LowFreqCutoff) audio = progdefaults.LowFreqCutoff; if (audio > progdefaults.HighFreqCutoff) audio = progdefaults.HighFreqCutoff; } if (rf && rf != wf->rfcarrier()) qsy(rf, audio); else active_modem->set_freq(audio); que_ok = true; } static void pQueQSY(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doQSY }; pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pRIGMODE(std::string& s, size_t& i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sMode = s.substr(i+9, endbracket - i - 9); qso_opMODE->value(sMode.c_str()); cb_qso_opMODE(); s.replace(i, endbracket - i + 1, ""); } static void doRIGMODE(std::string s) { std::string sMode = s.substr(10, s.length() - 11); qso_opMODE->value(sMode.c_str()); cb_qso_opMODE(); que_ok = true; } static void pQueRIGMODE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGMODE }; pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pFILWID(std::string& s, size_t& i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sWidth = s.substr(i+8, endbracket - i - 8); qso_opBW->value(sWidth.c_str()); cb_qso_opBW(); s.replace(i, endbracket - i + 1, ""); } static void doFILWID(std::string s) { std::string sWID = s.substr(9, s.length() - 10); qso_opBW->value(sWID.c_str()); cb_qso_opBW(); que_ok = true; } static void pQueFILWID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doFILWID }; pushcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } static void pWX(std::string &s, size_t &i, size_t endbracket) { string wx; getwx(wx); s.replace(i, 4, wx); } // static void pWX2(std::string &s, size_t &i, size_t endbracket) { string wx; getwx(wx, s.substr(i+4, endbracket - i - 4).c_str()); s.replace(i, endbracket - i + 1, wx); } void set_macro_env(void) { enum { #ifndef __WOE32__ pSKEDH, FLDIGI_RX_IPC_KEY, FLDIGI_TX_IPC_KEY, #endif FLDIGI_XMLRPC_ADDRESS, FLDIGI_XMLRPC_PORT, FLDIGI_ARQ_ADDRESS, FLDIGI_ARQ_PORT, FLDIGI_VERSION_ENVVAR, FLDIGI_PID, FLDIGI_CONFIG_DIR, FLDIGI_MY_CALL, FLDIGI_MY_NAME, FLDIGI_MY_LOCATOR, FLDIGI_MODEM, FLDIGI_MODEM_LONG_NAME, FLDIGI_DIAL_FREQUENCY, FLDIGI_AUDIO_FREQUENCY, FLDIGI_FREQUENCY, FLDIGI_MACRO_FILE, FLDIGI_LOG_FILE, FLDIGI_LOG_FREQUENCY, FLDIGI_LOG_TIME_ON, FLDIGI_LOG_TIME_OFF, FLDIGI_LOG_CALL, FLDIGI_LOG_NAME, FLDIGI_LOG_RST_IN, FLDIGI_LOG_RST_OUT, FLDIGI_LOG_QTH, FLDIGI_LOG_LOCATOR, FLDIGI_LOG_NOTES, FLDIGI_AZ, ENV_SIZE }; struct { const char* var; const char* val; } env[] = { #ifndef __WOE32__ { "pSKEDH", "" }, { "FLDIGI_RX_IPC_KEY", "" }, { "FLDIGI_TX_IPC_KEY", "" }, #endif { "FLDIGI_XMLRPC_ADDRESS", progdefaults.xmlrpc_address.c_str() }, { "FLDIGI_XMLRPC_PORT", progdefaults.xmlrpc_port.c_str() }, { "FLDIGI_ARQ_ADDRESS", progdefaults.arq_address.c_str() }, { "FLDIGI_ARQ_PORT", progdefaults.arq_port.c_str() }, { "FLDIGI_VERSION", PACKAGE_VERSION }, { "FLDIGI_PID", "" }, { "FLDIGI_CONFIG_DIR", HomeDir.c_str() }, { "FLDIGI_MY_CALL", progdefaults.myCall.c_str() }, { "FLDIGI_MY_NAME", progdefaults.myName.c_str() }, { "FLDIGI_MY_LOCATOR", progdefaults.myLocator.c_str() }, { "FLDIGI_MODEM", mode_info[active_modem->get_mode()].sname }, { "FLDIGI_MODEM_LONG_NAME", mode_info[active_modem->get_mode()].name }, { "FLDIGI_DIAL_FREQUENCY", "" }, { "FLDIGI_AUDIO_FREQUENCY", "" }, { "FLDIGI_FREQUENCY", "" }, // logging frame { "FLDIGI_MACRO_FILE", progStatus.LastMacroFile.c_str() }, { "FLDIGI_LOG_FILE", progdefaults.logbookfilename.c_str() }, { "FLDIGI_LOG_FREQUENCY", inpFreq->value() }, { "FLDIGI_LOG_TIME_ON", inpTimeOn->value() }, { "FLDIGI_LOG_TIME_OFF", inpTimeOff->value() }, { "FLDIGI_LOG_CALL", inpCall->value() }, { "FLDIGI_LOG_NAME", inpName->value() }, { "FLDIGI_LOG_RST_IN", inpRstIn->value() }, { "FLDIGI_LOG_RST_OUT", inpRstOut->value() }, { "FLDIGI_LOG_QTH", inpQth->value() }, { "FLDIGI_LOG_LOCATOR", inpLoc->value() }, { "FLDIGI_LOG_NOTES", inpNotes->value() }, { "FLDIGI_AZ", inpAZ->value() } }; #ifndef __WOE32__ // pSKEDH static std::string pSKEDh = ScriptsDir; pSKEDh.erase(pSKEDh.length()-1,1); const char* p; if ((p = getenv("pSKEDH"))) pSKEDh.append(":").append(p); env[pSKEDH].val = pSKEDh.c_str(); // IPC keys char key[2][8]; snprintf(key[0], sizeof(key[0]), "%d", progdefaults.rx_msgid); env[FLDIGI_RX_IPC_KEY].val = key[0]; snprintf(key[1], sizeof(key[1]), "%d", progdefaults.tx_msgid); env[FLDIGI_TX_IPC_KEY].val = key[1]; #endif // pid char pid[6]; snprintf(pid, sizeof(pid), "%d", getpid()); env[FLDIGI_PID].val = pid; // frequencies char dial_freq[20]; snprintf(dial_freq, sizeof(dial_freq), "%ld", (long)wf->rfcarrier()); env[FLDIGI_DIAL_FREQUENCY].val = dial_freq; char audio_freq[6]; snprintf(audio_freq, sizeof(audio_freq), "%d", active_modem->get_freq()); env[FLDIGI_AUDIO_FREQUENCY].val = audio_freq; char freq[20]; snprintf(freq, sizeof(freq), "%ld", (long)(wf->rfcarrier() + (wf->USB() ? active_modem->get_freq() : -active_modem->get_freq()))); env[FLDIGI_FREQUENCY].val = freq; // debugging vars #if !defined(NDEBUG) && !defined(__WOE32__) unsetenv("FLDIGI_NO_EXEC"); unsetenv("MALLOC_CHECK_"); unsetenv("MALLOC_PERTURB_"); #endif for (size_t j = 0; j < ENV_SIZE; j++) setenv(env[j].var, env[j].val, 1); string path = getenv("PATH"); string mypath = ScriptsDir; if (mypath[mypath.length()-1] == '/') mypath.erase(mypath.length()-1, 1); mypath.append(":"); path.insert(0,mypath); setenv("PATH", path.c_str(), 1); } // this is only for the case where the user tries to nest ... // as in // ... ... // which is not permitted static void pEND_EXEC(std::string &s, size_t &i, size_t endbracket) { s.replace(i, endbracket - i + 1, ""); return; } #ifndef __MINGW32__ static void pEXEC(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } size_t start = s.find(">", i); size_t end = s.find("", start); if (start == std::string::npos || end == std::string::npos) { i++; return; } std::string execstr = s.substr(start+1, end-start-1); within_exec = true; MACROTEXT m; execstr = m.expandMacro(execstr, true); within_exec = false; int pfd[2]; if (pipe(pfd) == -1) { LOG_PERROR("pipe"); return; } pid_t pid; switch (pid = fork()) { case -1: LOG_PERROR("fork"); return; case 0: // child close(pfd[0]); if (dup2(pfd[1], STDOUT_FILENO) != STDOUT_FILENO) { LOG_PERROR("dup2"); exit(EXIT_FAILURE); } close(pfd[1]); set_macro_env(); execl("/bin/sh", "sh", "-c", execstr.c_str(), (char *)NULL); perror("execl"); exit(EXIT_FAILURE); } // parent close(pfd[1]); // give child process time to complete MilliSleep(50); FILE* fp = fdopen(pfd[0], "r"); if (!fp) { LOG_PERROR("fdopen"); close(pfd[0]); return; } s.erase(i, end - i + strlen("")); char ln[BUFSIZ]; string lnbuff = ""; while (fgets(ln, sizeof(ln), fp)) { lnbuff.append(ln); } // remove all trailing end-of-lines while (lnbuff[lnbuff.length()-1] == '\n') lnbuff.erase(lnbuff.length()-1,1); if (!lnbuff.empty()) { lnbuff = m.expandMacro(lnbuff, false); s.insert(i, lnbuff); i += lnbuff.length(); } else i++; fclose(fp); close(pfd[0]); } #else // !__MINGW32__ static void pEXEC(std::string& s, size_t& i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } size_t start, end; if ((start = s.find('>', i)) == std::string::npos || (end = s.rfind("")) == std::string::npos) { i++; return; } start++; std::string execstr = s.substr(start, end-start); within_exec = true; MACROTEXT m; execstr = m.expandMacro(execstr, true); within_exec = false; char* cmd = strdup(execstr.c_str()); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free(cmd); s.erase(i, end + strlen("") - i); } #endif // !__MINGW32__ static void pEQSL(std::string& s, size_t& i, size_t endbracket) { if (within_exec || progdefaults.eqsl_when_logged) { s.replace(i, endbracket - i + 1, ""); return; } size_t start = s.find(':', i); std::string msg = ""; if (start != std::string::npos) msg = s.substr(start + 1, endbracket-start-1); makeEQSL(msg.c_str()); s.replace(i, endbracket - i + 1, ""); return; } static void MAPIT(int how) { float lat = 0, lon = 0; std::string sCALL = inpCall->value(); std::string sLOC = inpLoc->value(); std::string url = "http://maps.google.com/maps?q="; if (how > 1 && !lookup_country.empty()) { url.append(lookup_addr1).append(",").append(lookup_addr2).append(","); url.append(lookup_state).append(",").append(lookup_country); } else { if (how > 0 && (!lookup_latd.empty() && !lookup_lond.empty())) { url.append(lookup_latd).append(","); url.append(lookup_lond); } else { if (sLOC.empty()) return; if (sLOC.length() < 4) return; if (sLOC.length() < 6) sLOC.append("aa"); for (size_t i = 0; i < 6; i++) sLOC[i] = toupper(sLOC[i]); if (sLOC[0] -'A' > 17 || sLOC[4] - 'A' > 23 || sLOC[1] -'A' > 17 || sLOC[5] - 'A' > 23 || !isdigit(sLOC[2]) || !isdigit(sLOC[3])) return; lon = -180.0 + (sLOC[0] - 'A') * 20 + (sLOC[2] - '0') * 2 + (sLOC[4] - 'A' + 0.5) / 12; lat = -90.0 + (sLOC[1] - 'A') * 10 + (sLOC[3] - '0') + (sLOC[5] - 'A' + 0.5) / 24; char sdata[20]; snprintf(sdata, sizeof(sdata),"%10.6f", lat); url.append(sdata).append(","); snprintf(sdata, sizeof(sdata),"%10.6f", lon); url.append(sdata); } } if (!sCALL.empty()) url.append("(").append(sCALL).append(")"); else url.append("(nocall)"); url.append("&t=p&z=10"); cb_mnuVisitURL(NULL, (void*)url.c_str()); } static void pMAPIT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string sVal = s.substr(i + 7, endbracket - i - 7); if (sVal.length() > 0) { if (sVal.compare(0,3,"adr") == 0) REQ(MAPIT,2); else if (sVal.compare(0,6,"latlon") == 0) REQ(MAPIT,1); else if (sVal.compare(0,3,"loc") == 0) REQ(MAPIT,0); else REQ(MAPIT,2); } else REQ(MAPIT,2); s.erase(i, s.find('>', i) + 1 - i); expand = false; } static void pSTOP(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.erase(i, s.find('>', i) + 1 - i); expand = false; } static void pCONT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } s.erase(i, s.find('>', i) + 1 - i); expand = true; } static void pSKED(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } std::string data = s.substr(i+6, endbracket - i - 6); size_t p = data.find(":"); if (p == std::string::npos) { exec_date = zdate(); exec_time = data; if (exec_time.empty()) exec_time = ztime(); } else { exec_time = data.substr(0, p); exec_date = data.substr(p+1); } if (exec_time.length() == 4) exec_time.append("00"); timed_exec = true; s.replace(i, endbracket - i + 1, ""); } void queue_reset() { if (!cmds.empty()) { Fl::remove_timeout(post_queue_execute); Fl::remove_timeout(queue_execute_after_rx); Fl::remove_timeout(doneIDLE); Fl::remove_timeout(doneWAIT); while (!cmds.empty()) cmds.pop(); } Qwait_time = 0; Qidle_time = 0; que_ok = true; } static void postQueue(std::string s) { ReceiveText->addstr(s, FTextBase::CTRL); } void queue_execute() { if (cmds.empty()) { Qwait_time = 0; Qidle_time = 0; que_ok = true; return; } CMDS cmd = cmds.front(); cmds.pop(); cmd.fp(cmd.cmd); LOG_INFO("%s", cmd.cmd.c_str()); REQ(postQueue, cmd.cmd.append("\n")); return; } bool queue_must_rx() { static std::string rxcmds = "", pCALL}, {"", pFREQ}, {"", pBAND}, {"", pLOC}, {"", pMODE}, {"", pNAME}, {"", pQTH}, {"", pRST}, {"", pMYCALL}, {"", pMYLOC}, {"", pMYNAME}, {"", pMYQTH}, {"", pMYRST}, {"", pANTENNA}, {"", pQSOTIME}, {"", pQSONBR}, {"", pNXTNBR}, {"", pINFO1}, {"", pINFO2}, {"", pLDT}, {"", pILDT}, {"", pZDT}, {"", pIZDT}, {"", pLT}, {"", pZT}, {"", pLD}, {"", pZD}, {"", p_ID}, {"", pTEXT}, {"", pCWID}, {"", pRX}, {"", pTX}, {"", pTXRX}, {"", pVER}, {"", pCNTR}, {"", pDECR}, {"", pINCR}, {"", pXOUT}, {"", pXIN}, {"", pXOUT}, {"", pXBEG}, {"", pXEND}, {"", pSAVEXCHG}, {"", pCLRLOG}, {"", pMODEM_compSKED}, {"", pEXEC}, {"", pEND_EXEC}, {"", pSTOP}, {"", pCONT}, {"", pPAUSE}, {"", pGET}, {"", pCLRRX}, {"", pCLRTX}, {"", pSRCHUP}, {"", pSRCHDN}, {"", pGOHOME}, {"", pQSYTO}, {"", pQSYFM}, {"", pMAPIT}, {"", pREPEAT}, {"", pWX}, {"", pQueGOHOME}, {" (MAXMACROS - 1)) break; if (convert && mNumber > 9) mNumber += 2; name[mNumber] = mLine.substr(idx+1); continue; } while ((crlf = mLine.find("\\n")) != std::string::npos) { mLine.erase(crlf, 2); mLine.append("\n"); } text[mNumber] = text[mNumber] + mLine; } mFile.close(); } return 0; } void MACROTEXT::loadDefault() { int erc; std::string Filename = MacrosDir; Filename.append("macros.mdf"); LOG_INFO("macro file name: %s", progStatus.LastMacroFile.c_str()); if (progdefaults.UseLastMacro == true) { if (progStatus.LastMacroFile.find("/") != string::npos || progStatus.LastMacroFile.find("\\") != string::npos) Filename.assign(progStatus.LastMacroFile); else Filename.assign(MacrosDir).append(progStatus.LastMacroFile); } LOG_INFO("loading: %s", Filename.c_str()); progStatus.LastMacroFile = Filename; if ((erc = loadMacros(Filename)) != 0) #ifndef __WOE32__ LOG_ERROR("Error #%d loading %s\n", erc, Filename.c_str()); #else ; #endif if (progdefaults.DisplayMacroFilename) { string Macroset; Macroset.assign("\nMacros: ").append(progStatus.LastMacroFile).append("\n"); ReceiveText->addstr(Macroset); } } void MACROTEXT::openMacroFile() { std::string deffilename = MacrosDir; if (progStatus.LastMacroFile.find("/") != string::npos || progStatus.LastMacroFile.find("\\") != string::npos) deffilename.assign(progStatus.LastMacroFile); else deffilename.append(progStatus.LastMacroFile); const char *p = FSEL::select( _("Open macro file"), _("Fldigi macro definition file\t*.{mdf}"), deffilename.c_str()); if (p) { loadMacros(p); progStatus.LastMacroFile = p; } showMacroSet(); if (progdefaults.DisplayMacroFilename) { string Macroset; Macroset.assign("\nMacros: ").append(progStatus.LastMacroFile).append("\n"); ReceiveText->addstr(Macroset); } } void MACROTEXT::writeMacroFile() { std::string deffilename = MacrosDir; if (progStatus.LastMacroFile.find("/") != string::npos || progStatus.LastMacroFile.find("\\") != string::npos) deffilename.assign(progStatus.LastMacroFile); else deffilename.append(progStatus.LastMacroFile); saveMacros(deffilename.c_str()); } void MACROTEXT::saveMacroFile() { std::string deffilename = MacrosDir; if (progStatus.LastMacroFile.find("/") != string::npos || progStatus.LastMacroFile.find("\\") != string::npos) deffilename.assign(progStatus.LastMacroFile); else deffilename.append(progStatus.LastMacroFile); const char *p = FSEL::saveas( _("Save macro file"), _("Fldigi macro definition file\t*.{mdf}"), deffilename.c_str()); if (p) { string sp = p; if (sp.rfind(".mdf") == string::npos) sp.append(".mdf"); saveMacros(sp.c_str()); progStatus.LastMacroFile = sp; } } void MACROTEXT::savecurrentMACROS(std::string &s, size_t &i, size_t endbracket) { saveMacros(progStatus.LastMacroFile.c_str()); s.replace(i, endbracket - i + 1, ""); } void MACROTEXT::loadnewMACROS(std::string &s, size_t &i, size_t endbracket) { std::string fname = s.substr(i+8, endbracket - i - 8); if (fname.length() > 0) { loadMacros(fname); progStatus.LastMacroFile = fl_filename_name(fname.c_str()); } s.replace(i, endbracket - i + 1, ""); showMacroSet(); } std::string MACROTEXT::expandMacro(std::string &s, bool recurse = false) { size_t idx = 0; expand = true; if (!recurse) { TransmitON = false; ToggleTXRX = false; } // mNbr = n; expanded = s; const MTAGS *pMtags; xbeg = xend = -1; save_xchg = false; progStatus.repeatMacro = -1; text2repeat.clear(); idleTime = 0; waitTime = 0; tuneTime = 0; while ((idx = expanded.find('<', idx)) != std::string::npos) { size_t endbracket = expanded.find('>',idx); if (expanded.find("", idx) == idx) pCONT(expanded, idx, endbracket); if (!expand) { idx++; continue; } pMtags = mtags; while (pMtags->mTAG != 0) { if (expanded.find(pMtags->mTAG,idx) == idx) { pMtags->fp(expanded,idx, endbracket); break; } pMtags++; } if (pMtags->mTAG == 0) idx++; } if (GET) { size_t pos1 = expanded.find("$NAME"); size_t pos2 = expanded.find("$QTH"); size_t pos3 = expanded.find("$LOC"); if (pos1 != std::string::npos && pos2 != std::string::npos) { pos1 += 5; inpName->value(expanded.substr(pos1, pos2 - pos1).c_str()); } if (pos2 != std::string::npos) { pos2 += 4; inpQth->value(expanded.substr(pos2, pos3 - pos2).c_str()); } if (pos3 != std::string::npos) { pos3 += 4; inpLoc->value(expanded.substr(pos3).c_str()); } GET = false; return ""; } if (xbeg != std::string::npos && xend != std::string::npos && xend > xbeg) { qso_exchange = expanded.substr(xbeg, xend - xbeg); } else if (save_xchg) { qso_exchange = expanded; save_xchg = false; } // force "^r" to be last tag in the expanded std::string if ((idx = expanded.find("^r")) != std::string::npos) { expanded.erase(idx, 2); expanded.append("^r"); } return expanded; } void idleTimer(void *) { macro_idle_on = false; } static void continueMacro(void *) { if ( TransmitON ) { active_modem->set_stopflag(false); if (macro_idle_on && idleTime > 0) Fl::add_timeout(idleTime, idleTimer); start_tx(); TransmitON = false; } text2send.clear(); } static void finishTune(void *) { trx_receive(); // delay to allow tx/rx loop to change state Fl::add_timeout(0.5, continueMacro); } static void finishWait(void *) { if (useTune && tuneTime > 0) { trx_tune(); Fl::add_timeout(tuneTime, finishTune); useTune = false; return; } if ( TransmitON ) { active_modem->set_stopflag(false); if (macro_idle_on && idleTime > 0) Fl::add_timeout(idleTime, idleTimer); start_tx(); TransmitON = false; } } static void set_button(Fl_Button* button, bool value) { button->value(value); button->do_callback(); } void MACROTEXT::timed_execute() { queue_reset(); TransmitText->clear(); text2send = expandMacro(exec_string); TransmitText->add_text(text2send); exec_string.clear(); active_modem->set_stopflag(false); start_tx(); } void MACROTEXT::execute(int n) { mNbr = n; text2send = expandMacro(text[n]); if (timed_exec) { progStatus.repeatMacro = -1; exec_string = text[n]; timed_exec = false; startTimedExecute(name[n]); return; } if (progStatus.repeatMacro == -1) TransmitText->add_text( text2send ); else { size_t p = std::string::npos; text2send = text[n]; while ((p = text2send.find('<')) != std::string::npos) text2send[p] = '['; while ((p = text2send.find('>')) != std::string::npos) text2send[p] = ']'; TransmitText->add_text( text2send ); } text2send.clear(); if (ToggleTXRX) { text2send.clear(); if (!wf->xmtrcv->value()) { REQ(set_button, wf->xmtrcv, true); if (macro_idle_on && idleTime > 0) Fl::add_timeout(idleTime, idleTimer); } else REQ(set_button, wf->xmtrcv, false); return; } if (useWait && waitTime > 0) { Fl::add_timeout(waitTime, finishWait); useWait = false; return; } if (useTune && tuneTime > 0) { trx_tune(); Fl::add_timeout(tuneTime, finishTune); useTune = false; return; } if ( TransmitON ) { if (macro_idle_on && idleTime > 0) Fl::add_timeout(idleTime, idleTimer); active_modem->set_stopflag(false); start_tx(); TransmitON = false; } } void MACROTEXT::repeat(int n) { expandMacro(text[n]); LOG_INFO("%s",text2repeat.c_str()); macro_idle_on = false; if (idleTime) progStatus.repeatIdleTime = idleTime; } MACROTEXT::MACROTEXT() { changed = false; char szname[5]; for (int i = 0; i < MAXMACROS; i++) { snprintf(szname, sizeof(szname), "F-%d", i+1); name[i] = szname;//""; text[i] = ""; } } static std::string mtext = "//fldigi macro definition file extended\n\ // This file defines the macro structure(s) for the digital modem program, fldigi\n\ // It also serves as a basis for any macros that are written by the user\n\ //\n\ // The top line of this file should always be the first line in every macro \n\ // definition file (.mdf) for the fldigi program to recognize it as such.\n\ //\n\ "; void MACROTEXT::saveMacros(const std::string& fname) { std::string work; std::string output; char temp[200]; output.assign(mtext); for (int i = 0; i < MAXMACROS; i++) { snprintf(temp, sizeof(temp), "\n//\n// Macro # %d\n/$ %d %s\n", i+1, i, macros.name[i].c_str()); output.append(temp); work = macros.text[i]; size_t pos; pos = work.find('\n'); while (pos != std::string::npos) { work.insert(pos, "\\n"); pos = work.find('\n', pos + 3); } output.append(work).append("\n"); } UTF8_writefile(fname.c_str(), output); changed = false; } fldigi-3.21.80/src/misc/weather.cxx0000664000175000017500000002442512313064025013756 00000000000000// ---------------------------------------------------------------------------- // weather.cxx -- a part of fldigi // // Copyright (C) 2012 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include "signal.h" #include #include #include #include #include #include "threads.h" #include "misc.h" #include "configuration.h" #include "main.h" #include "confdialog.h" #include "fl_digi.h" #include "trx.h" #include "xmlreader.h" #include "qrunner.h" #include "debug.h" #include "network.h" #include "weather.h" using namespace std; /*====================================================================== * * WEATHER The weather group * iiddppooxx * ii is intensity group * ii Description * - light * moderate * + heavy * VC in the vicinity * * dd is the descriptor group * dd Description * MI shallow * PR partial * BC patches * DR low drifting * BL blowing * SH shower * TS thunderstorm * FZ freezing * * pp is the precipitation group * pp Description * DZ drizzle * RA rain * SN snow * SG snow grains * IC ice crystals * PE ice pellets * GR hail * GS small hail/snow pellets * UP unknown * * oo is the obscuration group * oo Description * BR mist * FG fog * FU smoke * VA volcanic ash * DU dust * SA sand * HZ haze * PY spray * * xx is the misc group * xx Description * PO dust whirls * SQ squalls * FC funnel cloud/tornado/waterspout * SS duststorm * * CLOUDS * The cloud levels * ccchhhtt * ccc is the coverage * CLR or SKC = clear * FEW = 1/8 coverage * SCT = 2,3,4/8 coverage * BKN = 5,6,7/8 coverage * OVC = overcast * VV = vertical visibility for obscuration * hhh is the height of base in 30m or 100ft increments. ie 30 = 3000 feet * tt is an optional type * CU = cumulus * CB = cumulonumbus * TCU = towering cumulus * CI = cirrus */ struct wxpairs {const char *grp; const char *name;}; static wxpairs precip[] = { {"DZ", "drizzle"}, {"RA", "rain"}, {"SN", "snow"}, {"SG", "snow grains"}, {"IC", "ice crystals"}, {"PE", "ice pellets"}, {"GR", "hail"}, {"GS", "small hail / show pellets"}, {"UP", "unknown"}, {NULL, NULL} }; static wxpairs intensity[] = { {"-", "light"}, {"+", "heavy"}, {"VC", "in the vicinity"}, {NULL, NULL} }; static wxpairs descriptor[] = { {"MI", "shallow "}, {"PR", "partial"}, {"BC", "patches"}, {"DR", "low drifting"}, {"BL", "blowing"}, {"SH", "shower"}, {"TS", "thunderstorm"}, {"FZ", "freezing"}, {NULL, NULL} }; static wxpairs obscure[] = { {"BR", "mist"}, {"FG", "fog"}, {"FU", "smoke"}, {"VA", "volcanic ash"}, {"DU", "dust"}, {"SA", "sand"}, {"HZ", "haze"}, {"PY", "spray"}, {NULL, NULL} }; static wxpairs misc[] = { {"PO", "dust whirls"}, {"SQ", "squalls"}, {"FC", "funnel cloud/tornado/waterspout"}, {"SS", "duststorm"}, {NULL, NULL} }; static wxpairs clouds[] = { {"CLR", "clear skies"}, {"SKC", "clear skies"}, {"FEW", "few clouds"}, {"SCT", "scattered clouds"}, {"BKN", "broken cloud cover"}, {"OVC", "overcast"}, {NULL, NULL} }; static wxpairs cloud_type[] = { {"CU", "cumulus"}, {"CB", "cumulonumbus"}, {"TCU", "towering cumulus"}, {"CI", "cirrus"}, {NULL, NULL} }; void getwx(string& wx, const char *metar) { string url; string text; string field; string wxsta; string name = ""; string condx = ""; string temperature = ""; string winds = ""; string baro = ""; size_t p, p1, p2, p3; if (!metar) wxsta = progdefaults.wx_sta; else wxsta = metar; wx.clear(); for (size_t n = 0; n < wxsta.length(); n++) wxsta[n] = toupper(wxsta[n] & 0x7F); url.assign("http://weather.noaa.gov/pub/data/observations/metar/decoded/") .append(wxsta).append(".TXT"); if (!fetch_http_gui(url, text, 5.0)) { LOG_WARN("%s", "url not available\n"); return; } LOG_DEBUG("\n%s", text.c_str()); p2 = text.find(wxsta); if (p2 == string::npos) { LOG_WARN("%s", "station not found\n"); return; } string eoh = progdefaults.wx_eoh; if (eoh.empty()) eoh = "Connection: close"; p1 = text.find(eoh); if (p1 != string::npos) { p1 = text.find("\n",p1); text.erase(0, p1); while (text[0] == '\r' || text[0] == '\n') text.erase(0,1); p1 = text.find("\n"); name = text.substr(0, p1); } p3 = text.find("ob:"); if (p3 == string::npos) { LOG_WARN("%s", "observations not available\n"); return; } if (progdefaults.wx_full) { wx.assign(text.substr(0, p3)); return; } p = text.find(wxsta, p3 + 1); text.erase(0, p + 1 + wxsta.length()); p = text.find("\n"); if (p != string::npos) text.erase(p); // parse field contents bool parsed = false; while(text.length()) { // each ob: field is separated by a space or end of file parsed = false; p = text.find(" "); if (p != string::npos) { field = text.substr(0, p); text.erase(0, p+1); } else { field = text; text.clear(); } if (field == "RMK") break; // parse for general weather // iiddppooxx if (field == "AUTO") ; else if ((p = field.rfind("KT")) != string::npos) { if (p == field.length() - 2) { // wind dir / speed int knots; sscanf(field.substr(3,2).c_str(), "%d", &knots); winds.clear(); winds.append(field.substr(0,3)).append(" at "); char ctemp[10]; if (progdefaults.wx_mph) { snprintf(ctemp, sizeof(ctemp), "%d mph ", (int)ceil(knots * 600.0 / 528.0 )); winds.append(ctemp); } if (progdefaults.wx_kph) { snprintf(ctemp, sizeof(ctemp), "%d kph ", (int)ceil(knots * 600.0 * 1.6094 / 528.0)); winds.append(ctemp); } } } else if ((p = field.rfind("MPS")) != string::npos) { if (p == field.length() - 3) { // wind dir / speed in meters / second int mps; sscanf(field.substr(3,2).c_str(), "%d", &mps); winds.clear(); winds.append(field.substr(0,3)).append(" at "); char ctemp[10]; if (progdefaults.wx_mph) { snprintf(ctemp, sizeof(ctemp), "%d mph ", (int)ceil(mps * 2.2369)); winds.append(ctemp); } if (progdefaults.wx_kph) { snprintf(ctemp, sizeof(ctemp), "%d kph ", (int)ceil(mps * 3.6)); winds.append(ctemp); } } } else if ((p = field.find("/") ) != string::npos) { // temperature / dewpoint string cent = field.substr(0, p); if (cent[0] == 'M') cent[0] = '-'; int tempC, tempF; sscanf(cent.c_str(), "%d", &tempC); tempF = (int)(tempC * 1.8 + 32); temperature.clear(); char ctemp[10]; if (progdefaults.wx_fahrenheit) { snprintf(ctemp, sizeof(ctemp), "%d F ", tempF); temperature.append(ctemp); } if (progdefaults.wx_celsius) { snprintf(ctemp, sizeof(ctemp), "%d C", tempC); temperature.append(ctemp); } } else if ((field[0] == 'A' && field.length() == 5) || field[0] == 'Q') { float inches; sscanf(field.substr(1).c_str(), "%f", &inches); if (field[0] == 'A') inches /= 100.0; else inches /= 33.87; baro.clear(); char ctemp[20]; if (progdefaults.wx_inches) { snprintf(ctemp, sizeof(ctemp), "%.2f in Hg ", inches); baro.append(ctemp); } if (progdefaults.wx_mbars) { snprintf(ctemp, sizeof(ctemp), "%.0f mbar", inches * 33.87); baro.append(ctemp); } } if (!parsed) { for (wxpairs *pp = precip; pp->grp != NULL; pp++) { if (field.find(pp->grp) != string::npos) { // found a precip group wxpairs *ii, *dd, *oo, *xx; for (ii = intensity; ii->grp != NULL; ii++) if (field.find(ii->grp) != string::npos) break; for (dd = descriptor; dd->grp != NULL; dd++) if (field.find(dd->grp) != string::npos) break; for (oo = obscure; oo->grp != NULL; oo++) if (field.find(oo->grp) != string::npos) break; for (xx = misc; xx->grp != NULL; xx++) if (field.find(xx->grp) != string::npos) break; if (ii->grp != NULL) condx.append(ii->name).append(" "); if (dd->grp != NULL) condx.append(dd->name).append(" "); condx.append(pp->name); if (oo->grp != NULL) condx.append(", ").append(oo->name); if (xx->grp != NULL) condx.append(", ").append(xx->name); parsed = true; } } } if (!parsed) { wxpairs *oo; for (oo = obscure; oo->grp != NULL; oo++) if (field.find(oo->grp) != string::npos) break; if (oo->grp != NULL) { condx.append(" ").append(oo->name); parsed = true; } } if (!parsed) { // parse for cloud cover // use only the first occurance of sky cover report; it is lowest altitude // cloud cover is reported multiple times for sounding stations for (wxpairs *cc = clouds; cc->grp != NULL; cc++) { if (field.find(cc->grp) != string::npos) { if (condx.find(cc->name) != string::npos) break; if (condx.empty()) condx.append(cc->name); else condx.append(", ").append(cc->name); wxpairs *ct; for (ct = cloud_type; ct->grp != NULL; ct++) { if (field.find(ct->grp) != string::npos) { if (ct->grp != NULL) condx.append(" ").append(ct->name); break; } } parsed = true; break; } } } } if (progdefaults.wx_station_name && !name.empty()) { // parse noun name wx.append("Sta: ").append(name).append("\n"); } if (progdefaults.wx_condx && !condx.empty()) { wx.append("Cond: ").append(condx).append("\n"); } if ((progdefaults.wx_mph || progdefaults.wx_kph) && !winds.empty()){ wx.append("Wind: ").append(winds).append("\n"); } if ((progdefaults.wx_fahrenheit || progdefaults.wx_celsius) && !temperature.empty() ) { wx.append("Temp: ").append(temperature).append("\n"); } if ((progdefaults.wx_inches || progdefaults.wx_mbars) && !baro.empty()) { wx.append("Baro: ").append(baro).append("\n"); } return; } void get_METAR_station() { cb_mnuVisitURL(0, (void*)string("http://www.rap.ucar.edu/weather/surface/stations.txt").c_str()); } fldigi-3.21.80/src/misc/outputencoder.cxx0000664000175000017500000000765212313064025015222 00000000000000// ---------------------------------------------------------------------------- // outputencoder.cxx -- output charset conversion // // Copyright (C) 2012 // Andrej Lajovic, S57LN // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "config.h" #include "debug.h" using namespace std; /* OutputEncoder accepts UTF-8 strings at input, converts them to the selected encoding and outputs them one character at a time. */ /* Constructor. Look up tiniconv.h for the list of possible values of charset_in. */ OutputEncoder::OutputEncoder(const int charset_out, unsigned int buffer_size) { this->buffer_size = buffer_size; buffer = new unsigned char[buffer_size]; encoding_ptr = buffer; pop_ptr = buffer; set_output_encoding(charset_out); } /* Destructor. */ OutputEncoder::~OutputEncoder(void) { delete[] buffer; } /* Set output encoding. Look up tiniconv.h for the list of possible values of charset_in. */ void OutputEncoder::set_output_encoding(const int charset_out) { tiniconv_init(TINICONV_CHARSET_UTF_8, charset_out, TINICONV_OPTION_IGNORE_OUT_ILSEQ, &ctx); } /* Push input data into the encoder. */ void OutputEncoder::push(string s) { int available = buffer_size - (encoding_ptr - buffer); int consumed_in; int consumed_out; int status = tiniconv_convert(&ctx, (unsigned char*)s.data(), s.length(), &consumed_in, encoding_ptr, available, &consumed_out); if (status != TINICONV_CONVERT_OK) { LOG_ERROR("Error %s", status == TINICONV_CONVERT_IN_TOO_SMALL ? "input too small" : status == TINICONV_CONVERT_OUT_TOO_SMALL ? "output too small" : status == TINICONV_CONVERT_IN_ILSEQ ? "input illegal sequence" : status == TINICONV_CONVERT_OUT_ILSEQ ? "output illegal sequence" : "unknown error"); return; } encoding_ptr += consumed_out; if (consumed_in < (int)s.length()) { // All input data was not consumed, possibly because the // output buffer was too small. Try to vacuum the buffer, // i.e., remove the data that was already pop()ed. memmove(buffer, pop_ptr, buffer + buffer_size - pop_ptr); encoding_ptr -= (pop_ptr - buffer); pop_ptr = buffer; // Now try again; fingers crossed. We don't check for // success anymore, because there is nothing that we can do // if the buffer is still too small. int available = buffer_size - (encoding_ptr - buffer); tiniconv_convert(&ctx, (unsigned char*)s.data()+consumed_in, s.length()-consumed_in, &consumed_in, encoding_ptr, available, &consumed_out); encoding_ptr += consumed_out; } } /* Pop a single character of the encoded data. Returns -1 in case there is no data available. */ const unsigned int OutputEncoder::pop(void) { if (pop_ptr == encoding_ptr) return(-1); unsigned int c = *pop_ptr++; // Note that by only advancing pop_ptr, we leave stale data at the // beginning of the buffer, so sooner or later it will clutter up. // If there is no data left to send, both encoding_ptr and pop_ptr // can be safely reset to the beginning of the buffer; we handle // this trivial case here. More thorough vacuuming will be performed // in push() if the need arises. if (pop_ptr == encoding_ptr) pop_ptr = encoding_ptr = buffer; return(c); } fldigi-3.21.80/src/misc/xmlrpc.cxx0000664000175000017500000023501012313064025013616 00000000000000// ---------------------------------------------------------------------------- // xmlrpc.cxx // // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // Copyright (C) 2008-2010 // Dave Freese, W1HKJ // Copyright (C) 2013 // Remi Chateauneu, F4ECW // // See EOF for a list of method names. Run "fldigi --xmlrpc-list" // to see a list of method names, signatures and descriptions. // // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "xmlrpc.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "globals.h" #include "configuration.h" #ifdef HAVE_VALUES_H # include #endif #include "threads.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "wefax.h" #include "wefax-pic.h" #include "navtex.h" #include "ascii.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "rigio.h" #include "debug.h" #include "re.h" #include "pskrep.h" // required for flrig support #include "fl_digi.h" #include "rigsupport.h" #include "confdialog.h" #include "arq_io.h" LOG_FILE_SOURCE(debug::LOG_RPC); using namespace std; using namespace XmlRpc; /// Not defined the usual way on Mingw #ifndef DBL_MAX #define DBL_MAX 1.7976931348623157e+308 #endif namespace xmlrpc_c { struct method { const char * _signature ; const char * _help ; virtual std::string help(void) const { return _help;} const char * signature() const { return _signature; } virtual ~method() {} }; typedef method * methodPtr ; typedef XmlRpcValue value ; typedef XmlRpcValue value_string ; typedef XmlRpcValue value_bytestring ; typedef XmlRpcValue value_struct ; typedef XmlRpcValue value_nil ; typedef XmlRpcValue value_array ; typedef XmlRpcValue value_double ; typedef XmlRpcValue value_int ; typedef XmlRpcValue value_boolean ; struct fault : public std::runtime_error { typedef enum { CODE_INTERNAL } Codes; fault( const char * msg, Codes cd = CODE_INTERNAL ) : std::runtime_error(msg) {} }; struct paramList { const XmlRpcValue & _params ; paramList( const XmlRpcValue & prm ) : _params(prm) {} int getInt(int i, int mini = INT_MIN, int maxi = INT_MAX ) const { int tmp = _params[i]; if( tmp < mini ) tmp = mini ; else if(tmp > maxi) tmp = maxi ; return tmp ; } string getString(int i) const { return _params[i]; } std::vector getBytestring(int i) const { return _params[i]; } double getDouble(int i, double mini = -DBL_MAX, double maxi = DBL_MAX) const { double tmp = _params[i]; if( tmp < mini ) tmp = mini ; else if(tmp > maxi) tmp = maxi ; return tmp ; } bool getBoolean(int i) const { return _params[i]; } const std::vector & getArray(int i) const { return _params[i]; } void verifyEnd(size_t sz) const { const std::vector & tmpRef = _params ; if( sz != tmpRef.size() ) throw std::runtime_error("Bad size"); } }; } template< class RPC_METHOD > struct Method : public RPC_METHOD, public XmlRpcServerMethod { Method( const char * n ) : XmlRpcServerMethod( n ) {} void execute (XmlRpcValue ¶ms, XmlRpcValue &result) { xmlrpc_c::paramList params2(params) ; RPC_METHOD::execute( params2, &result ); } }; typedef XmlRpcServerMethod * (*RpcFactory)( const char * ); template struct RpcBuilder { static XmlRpcServerMethod * factory( const char * name ) { return new Method< RPC_METHOD >( name ); } }; struct XmlRpcImpl : public XmlRpcServer { void open(const char * port) { bindAndListen( atoi( port ) ); enableIntrospection(true); } void run() { double milli_secs = -1.0 ; // Tell our server to wait indefinately for messages work(milli_secs); } /// BEWARE IT IS CALLED FROM ANOTHER THREAD. void close() { LOG_INFO("Stopping XML-RPC server"); exit(); shutdown(); } }; struct rpc_method { RpcFactory m_fact ; ~rpc_method() { delete method ; } xmlrpc_c::method * method ; const char* name; }; typedef list methods_t; static methods_t* methods = 0; static pthread_t* server_thread; static pthread_mutex_t* server_mutex; XML_RPC_Server* XML_RPC_Server::inst = 0; XML_RPC_Server::XML_RPC_Server() { server_impl = new XmlRpcImpl; add_methods(); for( methods_t::iterator it = methods->begin(), en = methods->end(); it != en; ++it ) { XmlRpcServerMethod * mth = dynamic_cast< XmlRpcServerMethod * >( it->method ); server_impl->addMethod( mth ); } server_thread = new pthread_t; server_mutex = new pthread_mutex_t; pthread_mutex_init(server_mutex, NULL); // run = true; } XML_RPC_Server::~XML_RPC_Server() { // run = false; // the xmlrpc server is closed and deleted when // XML_RPC_Server::stop(); // is called from main // delete methods; } void XML_RPC_Server::start(const char* node, const char* service) { if (inst) return; inst = new XML_RPC_Server; try { inst->server_impl->open(service); if (pthread_create(server_thread, NULL, thread_func, NULL) != 0) throw runtime_error(strerror(errno)); } catch (const exception& e) { LOG_ERROR("Could not start XML-RPC server (%s)", e.what()); delete server_thread; server_thread = 0; delete inst; inst = 0; return; } } /// BEWARE IT IS CALLED FROM ANOTHER THREAD. void XML_RPC_Server::stop(void) { // FIXME: uncomment when we have an xmlrpc server that can be interrupted // if (!inst) // return; inst->server_impl->close(); delete inst; inst = 0; } void* XML_RPC_Server::thread_func(void*) { SET_THREAD_ID(XMLRPC_TID); save_signals(); inst->server_impl->run(); restore_signals(); SET_THREAD_CANCEL(); return NULL; } ostream& XML_RPC_Server::list_methods(ostream& out) { add_methods(); ios_base::fmtflags f = out.flags(ios::left); for (methods_t::const_iterator i = methods->begin(); i != methods->end(); ++i) out << setw(32) << i->name << setw(8) << i->method->signature() << i->method->help() << '\n'; return out << setiosflags(f); } // ============================================================================= // Methods that change the server state must call XMLRPC_LOCK // guard_lock (include/threads.h) ensures that mutex are always unlocked. #define XMLRPC_LOCK SET_THREAD_ID(XMLRPC_TID); guard_lock autolock_(server_mutex) // ============================================================================= // generic helper functions static void set_button(Fl_Button* button, bool value) { button->value(value); button->do_callback(); } static void set_valuator(Fl_Valuator* valuator, double value) { valuator->value(value); valuator->do_callback(); } static void set_text(Fl_Input* textw, string& value) { textw->value(value.c_str()); textw->do_callback(); } static void set_combo_contents(Fl_ComboBox* box, const vector* items) { box->clear(); if (items->empty()) { box->add(""); box->index(0); box->deactivate(); return; } for (vector::const_iterator i = items->begin(); i != items->end(); ++i) { box->add(i->c_str()); } box->index(0); box->activate(); } static void set_combo_value(Fl_ComboBox* box, const string& s) { box->value(s.c_str()); box->do_callback(); } static void get_combo_contents(Fl_ComboBox* box, vector* items) { int n = box->lsize(), p = box->index(); items->reserve(n); for (int i = 0; i < n; i++) { box->index(i); items->push_back(xmlrpc_c::value_string(box->value())); } box->index(p); } // ============================================================================= // XML-RPC interface definition // ============================================================================= class Fldigi_list : public xmlrpc_c::method { public: Fldigi_list() { _signature = "A:n"; _help = "Returns the list of methods."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { vector help; for (methods_t::const_iterator i = methods->begin(); i != methods->end(); ++i) { map item; item["name"] = xmlrpc_c::value_string(i->name); item["signature"] = xmlrpc_c::value_string(i->method->signature()); item["help"] = xmlrpc_c::value_string(i->method->help()); help.push_back(xmlrpc_c::value_struct(item)); } *retval = xmlrpc_c::value_array(help); } }; class Fldigi_name : public xmlrpc_c::method { public: Fldigi_name() { _signature = "s:n"; _help = "Returns the program name."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(PACKAGE_TARNAME); } }; class Fldigi_version_struct : public xmlrpc_c::method { public: Fldigi_version_struct() { _signature = "S:n"; _help = "Returns the program version as a struct."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { map vstruct; vstruct["major"] = xmlrpc_c::value_int(FLDIGI_VERSION_MAJOR); vstruct["minor"] = xmlrpc_c::value_int(FLDIGI_VERSION_MINOR); vstruct["patch"] = xmlrpc_c::value_string(FLDIGI_VERSION_PATCH); *retval = xmlrpc_c::value_struct(vstruct); } }; class Fldigi_version_string : public xmlrpc_c::method { public: Fldigi_version_string() { _signature = "s:n"; _help = "Returns the program version as a string."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(PACKAGE_VERSION); } }; class Fldigi_name_version : public xmlrpc_c::method { public: Fldigi_name_version() { _signature = "s:n"; _help = "Returns the program name and version."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(PACKAGE_STRING); } }; class Fldigi_config_dir : public xmlrpc_c::method { public: Fldigi_config_dir() { _signature = "s:n"; _help = "Returns the name of the configuration directory."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(HomeDir); } }; class Fldigi_terminate : public xmlrpc_c::method { public: Fldigi_terminate() { _signature = "n:i"; _help = "Terminates fldigi. ``i'' is bitmask specifying data to save: 0=options; 1=log; 2=macros."; } enum { TERM_SAVE_OPTIONS = 1 << 0, TERM_SAVE_LOG = 1 << 1, TERM_SAVE_MACROS = 1 << 2 }; static void terminate(int how) { if (how & TERM_SAVE_OPTIONS) progdefaults.saveDefaults(); progdefaults.changed = false; extern bool oktoclear; if (how & TERM_SAVE_LOG && !oktoclear) qsoSave->do_callback(); oktoclear = true; progdefaults.NagMe = false; if (how & TERM_SAVE_MACROS && macros.changed) macros.saveMacroFile(); macros.changed = false; fl_digi_main->do_callback(); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(terminate, params.getInt(0)); *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= class Modem_get_name : public xmlrpc_c::method { public: Modem_get_name() { _signature = "s:n"; _help = "Returns the name of the current modem."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { const char* cur = mode_info[active_modem->get_mode()].sname; *retval = xmlrpc_c::value_string(cur); } }; class Modem_get_names : public xmlrpc_c::method { public: Modem_get_names() { _signature = "A:n"; _help = "Returns all modem names."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { vector names; names.reserve(NUM_MODES); for (size_t i = 0; i < NUM_MODES; i++) names.push_back(xmlrpc_c::value_string(mode_info[i].sname)); *retval = xmlrpc_c::value_array(names); } }; class Modem_get_id : public xmlrpc_c::method { public: Modem_get_id() { _signature = "i:n"; _help = "Returns the ID of the current modem."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { int md = active_modem->get_mode(); *retval = xmlrpc_c::value_int(md); } }; class Modem_get_max_id : public xmlrpc_c::method { public: Modem_get_max_id() { _signature = "i:n"; _help = "Returns the maximum modem ID number."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_int(NUM_MODES - 1); } }; class Modem_set_by_name : public xmlrpc_c::method { public: Modem_set_by_name() { _signature = "s:s"; _help = "Sets the current modem. Returns old name."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; const char* cur = mode_info[active_modem->get_mode()].sname; string s = params.getString(0); for (size_t i = 0; i < NUM_MODES; i++) { if (s == mode_info[i].sname) { REQ_SYNC(init_modem_sync, i, 0); *retval = xmlrpc_c::value_string(cur); return; } } *retval = "No such modem"; return; } }; class Modem_set_by_id : public xmlrpc_c::method { public: Modem_set_by_id() { _signature = "i:i"; _help = "Sets the current modem. Returns old ID."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int cur = active_modem->get_mode(); int i = params.getInt(0, 0, NUM_MODES-1); REQ_SYNC(init_modem_sync, i, 0); *retval = xmlrpc_c::value_int(cur); } }; // ============================================================================= class Modem_set_carrier : public xmlrpc_c::method { public: Modem_set_carrier() { _signature = "i:i"; _help = "Sets modem carrier. Returns old carrier."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int cur = active_modem->get_freq(); active_modem->set_freq(params.getInt(0, 1)); *retval = xmlrpc_c::value_int(cur); } }; class Modem_inc_carrier : public xmlrpc_c::method { public: Modem_inc_carrier() { _signature = "i:i"; _help = "Increments the modem carrier frequency. Returns the new carrier."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int cur = active_modem->get_freq(); active_modem->set_freq(cur + params.getInt(0)); *retval = xmlrpc_c::value_int(active_modem->get_freq()); } }; class Modem_get_carrier : public xmlrpc_c::method { public: Modem_get_carrier() { _signature = "i:n"; _help = "Returns the modem carrier frequency."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_int(active_modem->get_freq()); } }; // ============================================================================= class Modem_get_afc_sr : public xmlrpc_c::method { public: Modem_get_afc_sr() { _signature = "i:n"; _help = "Returns the modem AFC search range."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { if (!(active_modem->get_cap() & modem::CAP_AFC_SR)) *retval = "Operation not supported by modem"; else *retval = xmlrpc_c::value_int((int)cntSearchRange->value()); } }; class Modem_set_afc_sr : public xmlrpc_c::method { public: Modem_set_afc_sr() { _signature = "i:i"; _help = "Sets the modem AFC search range. Returns the old value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!(active_modem->get_cap() & modem::CAP_AFC_SR)) { *retval = "Operation not supported by modem"; return; } int v = (int)(cntSearchRange->value()); REQ(set_valuator, cntSearchRange, params.getInt(0, (int)cntSearchRange->minimum(), (int)cntSearchRange->maximum())); *retval = xmlrpc_c::value_int(v); } }; class Modem_inc_afc_sr : public xmlrpc_c::method { public: Modem_inc_afc_sr() { _signature = "i:i"; _help = "Increments the modem AFC search range. Returns the new value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!(active_modem->get_cap() & modem::CAP_AFC_SR)) { *retval = "Operation not supported by modem"; return; } int v = (int)(cntSearchRange->value() + params.getInt(0)); REQ(set_valuator, cntSearchRange, v); *retval = xmlrpc_c::value_int(v); } }; // ============================================================================= static Fl_Valuator* get_bw_val(void) { if (!(active_modem->get_cap() & modem::CAP_BW)) return 0; trx_mode m = active_modem->get_mode(); if (m >= MODE_HELL_FIRST && m <= MODE_HELL_LAST) return sldrHellBW; else if (m == MODE_CW) return sldrCWbandwidth; return 0; } class Modem_get_bw : public xmlrpc_c::method { public: Modem_get_bw() { _signature = "i:n"; _help = "Returns the modem bandwidth."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { Fl_Valuator* val = get_bw_val(); if (val) *retval = xmlrpc_c::value_int((int)get_bw_val()->value()); else *retval = xmlrpc_c::value_int(0); } }; class Modem_set_bw : public xmlrpc_c::method { public: Modem_set_bw() { _signature = "i:i"; _help = "Sets the modem bandwidth. Returns the old value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; Fl_Valuator* val = get_bw_val(); if (val) { int v = (int)(val->value()); REQ(set_valuator, val, params.getInt(0, (int)val->minimum(), (int)val->maximum())); *retval = xmlrpc_c::value_int(v); } else *retval = xmlrpc_c::value_int(0); } }; class Modem_inc_bw : public xmlrpc_c::method { public: Modem_inc_bw() { _signature = "i:i"; _help = "Increments the modem bandwidth. Returns the new value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; Fl_Valuator* val = get_bw_val(); if (val) { int v = (int)(val->value() + params.getInt(0)); REQ(set_valuator, val, v); *retval = xmlrpc_c::value_int(v); } else *retval = xmlrpc_c::value_int(0); } }; // ============================================================================= class Modem_get_quality : public xmlrpc_c::method { public: Modem_get_quality() { _signature = "d:n"; _help = "Returns the modem signal quality in the range [0:100]."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_double(pgrsSquelch->value()); } }; class Modem_search_up : public xmlrpc_c::method { public: Modem_search_up() { _signature = "n:n"; _help = "Searches upward in frequency."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(&modem::searchUp, active_modem); *retval = xmlrpc_c::value_nil(); } }; class Modem_search_down : public xmlrpc_c::method { public: Modem_search_down() { _signature = "n:n"; _help = "Searches downward in frequency."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(&modem::searchDown, active_modem); *retval = xmlrpc_c::value_nil(); } }; class Modem_olivia_set_bandwidth : public xmlrpc_c::method { public: Modem_olivia_set_bandwidth() { _signature = "n:i"; _help = "Sets the Olivia bandwidth."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { int bw; switch (bw = params.getInt(0)) { case 125: case 250: case 500: case 1000: case 2000: { XMLRPC_LOCK; REQ_SYNC(set_olivia_bw, bw); *retval = xmlrpc_c::value_nil(); } break; default: *retval = "Invalid Olivia bandwidth"; } } }; class Modem_olivia_get_bandwidth : public xmlrpc_c::method { public: Modem_olivia_get_bandwidth() { _signature = "i:n"; _help = "Returns the Olivia bandwidth."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { int bw, v = i_listbox_olivia_bandwidth->index() + 1; if (v == 0) bw = 125; else if (v == 1) bw = 250; else if (v == 2) bw = 500; else if (v == 3) bw = 1000; else bw = 2000; *retval = xmlrpc_c::value_int(bw); } }; class Modem_olivia_set_tones : public xmlrpc_c::method { public: Modem_olivia_set_tones() { _signature = "n:i"; _help = "Sets the Olivia tones."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { int tones = params.getInt(0, 2, 256); if (powerof2(tones)) { XMLRPC_LOCK; REQ_SYNC(set_olivia_tones, tones); *retval = xmlrpc_c::value_nil(); } else *retval = "Invalid Olivia tones"; } }; class Modem_olivia_get_tones : public xmlrpc_c::method { public: Modem_olivia_get_tones() { _signature = "i:n"; _help = "Returns the Olivia tones."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_int(1 << (i_listbox_olivia_tones->index() + 1)); } }; // ============================================================================= class Main_get_status1 : public xmlrpc_c::method { public: Main_get_status1() { _signature = "s:n"; _help = "Returns the contents of the first status field (typically s/n)."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(Status1->label()); } }; class Main_get_status2 : public xmlrpc_c::method { public: Main_get_status2() { _signature = "s:n"; _help = "Returns the contents of the second status field."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(Status2->label()); } }; class Main_get_sb : public xmlrpc_c::method { public: Main_get_sb() { _signature = "s:n"; _help = "[DEPRECATED; use main.get_wf_sideband and/or rig.get_mode]"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(wf->USB() ? "USB" : "LSB"); } }; class Main_set_sb : public xmlrpc_c::method { public: Main_set_sb() { _signature = "n:s"; _help = "[DEPRECATED; use main.set_wf_sideband and/or rig.set_mode]"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; string s = params.getString(0); if (s != "LSB" && s != "USB") { *retval = "Invalid argument"; return; } if (progdefaults.chkUSERIGCATis) rigCAT_setmode(s); #if USE_HAMLIB else if (progdefaults.chkUSEHAMLIBis) hamlib_setmode(s == "LSB" ? RIG_MODE_LSB : RIG_MODE_USB); #endif else if (progdefaults.chkUSEXMLRPCis) REQ(static_cast(&waterfall::USB), wf, s == "USB"); *retval = xmlrpc_c::value_nil(); } }; class Main_get_wf_sideband : public xmlrpc_c::method { public: Main_get_wf_sideband() { _signature = "s:n"; _help = "Returns the current waterfall sideband."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(wf->USB() ? "USB" : "LSB"); } }; class Main_set_wf_sideband : public xmlrpc_c::method { public: Main_set_wf_sideband() { _signature = "n:s"; _help = "Sets the waterfall sideband to USB or LSB."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; string s = params.getString(0); if (s != "USB" && s != "LSB") *retval = "Invalid argument"; else REQ(static_cast(&waterfall::USB), wf, s == "USB"); *retval = xmlrpc_c::value_nil(); } }; class Main_get_freq : public xmlrpc_c::method { public: Main_get_freq() { _signature = "d:n"; _help = "Returns the RF carrier frequency."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { double rfc = wf->rfcarrier(); *retval = xmlrpc_c::value_double(rfc); } }; void xmlrpc_set_qsy(long long rfc) { wf->rfcarrier(rfc); wf->movetocenter(); show_frequency(rfc); } class Main_set_freq : public xmlrpc_c::method { public: Main_set_freq() { _signature = "d:d"; _help = "Sets the RF carrier frequency. Returns the old value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double rfc = wf->rfcarrier(); qsy((long long int)params.getDouble(0, 0.0)); *retval = xmlrpc_c::value_double(rfc); } }; class Main_inc_freq : public xmlrpc_c::method { public: Main_inc_freq() { _signature = "d:d"; _help = "Increments the RF carrier frequency. Returns the new value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double rfc = wf->rfcarrier() + params.getDouble(0); qsy((long long int)rfc); *retval = xmlrpc_c::value_double(rfc); } }; // ============================================================================= class Main_get_afc : public xmlrpc_c::method { public: Main_get_afc() { _signature = "b:n"; _help = "Returns the AFC state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_boolean(btnAFC->value()); } }; class Main_set_afc : public xmlrpc_c::method { public: Main_set_afc() { _signature = "b:b"; _help = "Sets the AFC state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = btnAFC->value(); REQ(set_button, btnAFC, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_afc : public xmlrpc_c::method { public: Main_toggle_afc() { _signature = "b:n"; _help = "Toggles the AFC state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !btnAFC->value(); REQ(set_button, btnAFC, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_sql : public xmlrpc_c::method { public: Main_get_sql() { _signature = "b:n"; _help = "Returns the squelch state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_boolean(btnSQL->value()); } }; class Main_set_sql : public xmlrpc_c::method { public: Main_set_sql() { _signature = "b:b"; _help = "Sets the squelch state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = btnSQL->value(); REQ(set_button, btnSQL, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_sql : public xmlrpc_c::method { public: Main_toggle_sql() { _signature = "b:n"; _help = "Toggles the squelch state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !btnSQL->value(); REQ(set_button, btnSQL, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_sql_level : public xmlrpc_c::method { public: Main_get_sql_level() { _signature = "d:n"; _help = "Returns the squelch level."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_double(sldrSquelch->value()); } }; class Main_set_sql_level : public xmlrpc_c::method { public: Main_set_sql_level() { _signature = "d:d"; _help = "Sets the squelch level. Returns the old level."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double v = sldrSquelch->value(); REQ(set_valuator, sldrSquelch, params.getDouble(0, sldrSquelch->maximum(), sldrSquelch->minimum())); *retval = xmlrpc_c::value_double(v); } }; class Main_inc_sql_level : public xmlrpc_c::method { public: Main_inc_sql_level() { _signature = "d:d"; _help = "Increments the squelch level. Returns the new level."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double v = sldrSquelch->value(); REQ(set_valuator, sldrSquelch, v + params.getDouble(0)); // FIXME: check range *retval = xmlrpc_c::value_double(sldrSquelch->value()); } }; // ============================================================================= class Main_get_rev : public xmlrpc_c::method { public: Main_get_rev() { _signature = "b:n"; _help = "Returns the Reverse Sideband state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_boolean(wf->btnRev->value()); } }; class Main_set_rev : public xmlrpc_c::method { public: Main_set_rev() { _signature = "b:b"; _help = "Sets the Reverse Sideband state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = wf->btnRev->value(); REQ(set_button, wf->btnRev, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_rev : public xmlrpc_c::method { public: Main_toggle_rev() { _signature = "b:n"; _help = "Toggles the Reverse Sideband state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !wf->btnRev->value(); REQ(set_button, wf->btnRev, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_lock : public xmlrpc_c::method { public: Main_get_lock() { _signature = "b:n"; _help = "Returns the Transmit Lock state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_boolean(wf->xmtlock->value()); } }; class Main_set_lock : public xmlrpc_c::method { public: Main_set_lock() { _signature = "b:b"; _help = "Sets the Transmit Lock state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = wf->xmtlock->value(); REQ(set_button, wf->xmtlock, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_lock : public xmlrpc_c::method { public: Main_toggle_lock() { _signature = "b:n"; _help = "Toggles the Transmit Lock state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !wf->xmtlock->value(); REQ(set_button, wf->xmtlock, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_rsid : public xmlrpc_c::method { public: Main_get_rsid() { _signature = "b:n"; _help = "Returns the RSID state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_boolean(btnRSID->value()); } }; class Main_set_rsid : public xmlrpc_c::method { public: Main_set_rsid() { _signature = "b:b"; _help = "Sets the RSID state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = btnRSID->value(); REQ(set_button, btnRSID, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_rsid : public xmlrpc_c::method { public: Main_toggle_rsid() { _signature = "b:n"; _help = "Toggles the RSID state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !btnRSID->value(); REQ(set_button, btnRSID, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_trx_status : public xmlrpc_c::method { public: Main_get_trx_status() { _signature = "s:n"; _help = "Returns transmit/tune/receive status."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { if (btnTune->value()) *retval = xmlrpc_c::value_string("tune"); else if (wf->xmtrcv->value()) *retval = xmlrpc_c::value_string("tx"); else *retval = xmlrpc_c::value_string("rx"); } }; class Main_tx : public xmlrpc_c::method { public: Main_tx() { _signature = "n:n"; _help = "Transmits."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!wf->xmtrcv->value()) REQ(set_button, wf->xmtrcv, true); *retval = xmlrpc_c::value_nil(); } }; class Main_tune : public xmlrpc_c::method { public: Main_tune() { _signature = "n:n"; _help = "Tunes."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!btnTune->value()) REQ(set_button, btnTune, !btnTune->value()); *retval = xmlrpc_c::value_nil(); } }; class Main_rx : public xmlrpc_c::method { public: Main_rx() { _signature = "n:n"; _help = "Receives."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (wf->xmtrcv->value()) REQ(set_button, wf->xmtrcv, false); *retval = xmlrpc_c::value_nil(); } }; class Main_abort : public xmlrpc_c::method { public: Main_abort() { _signature = "n:n"; _help = "Aborts a transmit or tune."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (trx_state == STATE_TX || trx_state == STATE_TUNE) { REQ(abort_tx); REQ(AbortARQ); } *retval = xmlrpc_c::value_nil(); } }; class Main_run_macro : public xmlrpc_c::method { public: Main_run_macro() { _signature = "n:i"; _help = "Runs a macro."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(&Main_run_macro::run_macro, params.getInt(0, 0, MAXMACROS-1)); *retval = xmlrpc_c::value_nil(); } static void run_macro(int i) { macros.execute(i); } }; class Main_get_max_macro_id : public xmlrpc_c::method { public: Main_get_max_macro_id() { _signature = "i:n"; _help = "Returns the maximum macro ID number."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_int(MAXMACROS - 1); } }; class Main_rsid : public xmlrpc_c::method { public: Main_rsid() { _signature = "n:n"; _help = "[DEPRECATED; use main.{get,set,toggle}_rsid]"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!(wf->xmtrcv->value() || btnTune->value() || btnRSID->value())) REQ(set_button, btnRSID, true); *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= // classes added to support flrig // // dhf 6/23/09 class Main_get_trx_state : public xmlrpc_c::method { public: Main_get_trx_state() { _signature = "s:n"; _help = "Returns T/R state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { if (trx_state == STATE_TX || trx_state == STATE_TUNE) *retval = xmlrpc_c::value_string("TX"); else if (trx_state == STATE_RX) *retval = xmlrpc_c::value_string("RX"); else *retval = xmlrpc_c::value_string("OTHER"); } }; static string xmlchars; bool xmltest_char_available; static size_t pxmlchar = 0; int xmltest_char() { if (pxmlchar >= xmlchars.length() ) return -3; return xmlchars[pxmlchar++] & 0xFF; } int number_of_samples( string s) { active_modem->XMLRPC_CPS_TEST = true; xmlchars = s; pxmlchar = 0; xmltest_char_available = true; active_modem->set_stopflag(false); trx_transmit(); MilliSleep(10); while(trx_state != STATE_RX) { MilliSleep(10); Fl::awake(); } xmltest_char_available = false; active_modem->XMLRPC_CPS_TEST = false; return active_modem->tx_sample_count; } class Main_get_char_rates : public xmlrpc_c::method { public: Main_get_char_rates() { _signature = "s:n"; _help = "Returns table of char rates."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ) { *retval = xmlrpc_c::value_string("0:1:0"); return; } XMLRPC_LOCK; REQ(stopMacroTimer); int s0 = 0;//number_of_samples(""); int s1 = 0; string xmlbuf; static char result[100]; static string line; int chsamples = 0; int i = 0; for (int m = 0; m < 32; m++) { line.clear(); for (int n = 0; n < 8; n++) { i = m*8+n; if ( (id >= MODE_PSK31 && id <= MODE_PSK1000R) || (id >= MODE_4X_PSK63R && id <= MODE_2X_PSK1000R) || id == MODE_CW || id == MODE_RTTY ) { s1 = number_of_samples(string(1,i)); chsamples = active_modem->char_samples; } else { s0 = number_of_samples(string(1, i)); int j; for(j = 2; j < 32; j++) { s1 = number_of_samples(string(j, i)); if(s1 > s0) break; } chsamples = (s1 - s0) / (j-1); } snprintf(result, sizeof(result), n == 7 ? " %.8f\n" : n == 0 ? "%.8f," : " %.8f,", 1.0 * chsamples / active_modem->get_samplerate()); line.append(result); } xmlbuf.append(line); } *retval = xmlrpc_c::value_string(xmlbuf); } }; class Main_get_char_timing : public xmlrpc_c::method { public: Main_get_char_timing() { _signature = "n:6"; _help = "Input: value of character. Returns transmit duration for specified character (samples:sample rate)."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ) { *retval = xmlrpc_c::value_string("0,1,0,0,0.0"); return; } XMLRPC_LOCK; REQ(stopMacroTimer); vector bytes = params.getBytestring(0); bytes.push_back(0); std::string totest = (const char*)&bytes[0]; if (totest.empty() || !active_modem) { *retval = xmlrpc_c::value_string("0:1:0"); return; } static std::string xmlbuf; char result[64]; int character = 0; int count = sscanf(totest.c_str(), "%d", &character); if(count != 1) { *retval = xmlrpc_c::value_string("0:1:0"); return; } unsigned int s0 = 0, chsamples = 0, over_head = 0; if ( (id >= MODE_4X_PSK63R && id <= MODE_2X_PSK1000R) || (id >= MODE_PSK31 && id <= MODE_PSK1000R) || id == MODE_CW || id == MODE_RTTY ) { s0 = number_of_samples(string(1,character)); chsamples = active_modem->char_samples; over_head = active_modem->ovhd_samples; } else { unsigned int s1 = 0, s2 = 0; unsigned int temp = 0, no_of_chars = 1, k = 0; s0 = s1 = s2 = number_of_samples(string(no_of_chars, character)); for(int i = no_of_chars + 1; i < 32; i++) { s2 = number_of_samples(string(i, character)); if(s2 > s1 && temp++ > 2) { break; } s0 = s2; no_of_chars++; } k = no_of_chars * 4; s1 = number_of_samples(string(k, character)); chsamples = (s1 - s0) / (k - no_of_chars); over_head = s1 - (chsamples * k); } snprintf(result, sizeof(result), "%5u:%6u:%6u", chsamples, active_modem->get_samplerate(), over_head); xmlbuf.assign(result); *retval = xmlrpc_c::value_string(xmlbuf); } }; class Main_get_tx_timing : public xmlrpc_c::method { public: Main_get_tx_timing() { _signature = "n:6"; _help = "Returns transmit duration for test string (samples:sample rate:secs)."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { *retval = xmlrpc_c::value_string("0:1:0.0"); return; } XMLRPC_LOCK; vector bytes = params.getBytestring(0); bytes.push_back(0); std::string totest = (const char*)&bytes[0]; if (totest.empty() || !active_modem) { *retval = xmlrpc_c::value_string("0:1:0.0"); return; } int chsamples = number_of_samples(totest);// - start_stop_samples; std::string xmlbuf; char buf[64]; memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf) - 1, "%u : %u : %.9f", \ chsamples, active_modem->tx_sample_rate, 1.0 * chsamples / active_modem->tx_sample_rate); xmlbuf.assign(buf); *retval = xmlrpc_c::value_string(xmlbuf); } }; class Rig_set_name : public xmlrpc_c::method { public: Rig_set_name() { _signature = "n:s"; _help = "Sets the rig name for xmlrpc rig"; } static void set_rig_name(const string& name) { windowTitle = name; setTitle(); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(set_rig_name, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Rig_get_name : public xmlrpc_c::method { public: Rig_get_name() { _signature = "s:n"; _help = "Returns the rig name previously set via rig.set_name"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(windowTitle); } }; class Rig_set_frequency : public xmlrpc_c::method { public: Rig_set_frequency() { _signature = "d:d"; _help = "Sets the RF carrier frequency. Returns the old value."; } static void set_frequency(long long rfc) { wf->rfcarrier(rfc); show_frequency(rfc); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double rfc = wf->rfcarrier(); REQ(set_frequency, (long long int)params.getDouble(0, 0.0)); *retval = xmlrpc_c::value_double(rfc); } }; class Rig_set_modes : public xmlrpc_c::method { public: Rig_set_modes() { _signature = "n:A"; _help = "Sets the list of available rig modes"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; vector v = params.getArray(0); vector modes; modes.reserve(v.size()); // copy for (vector::const_iterator i = v.begin(); i != v.end(); ++i) modes.push_back(static_cast(xmlrpc_c::value_string(*i))); REQ_SYNC(set_combo_contents, qso_opMODE, &modes); *retval = xmlrpc_c::value_nil(); } }; class Rig_set_mode : public xmlrpc_c::method { public: Rig_set_mode() { _signature = "n:s"; _help = "Selects a mode previously added by rig.set_modes"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(set_combo_value, qso_opMODE, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Rig_get_modes : public xmlrpc_c::method { public: Rig_get_modes() { _signature = "A:n"; _help = "Returns the list of available rig modes"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; vector modes; REQ_SYNC(get_combo_contents, qso_opMODE, &modes); *retval = xmlrpc_c::value_array(modes); } }; class Rig_get_mode : public xmlrpc_c::method { public: Rig_get_mode() { _signature = "s:n"; _help = "Returns the name of the current transceiver mode"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(qso_opMODE->value()); } }; class Rig_set_bandwidths : public xmlrpc_c::method { public: Rig_set_bandwidths() { _signature = "n:A"; _help = "Sets the list of available rig bandwidths"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; vector v = params.getArray(0); vector bws; bws.reserve(v.size()); for (vector::const_iterator i = v.begin(); i != v.end(); ++i) bws.push_back(static_cast(xmlrpc_c::value_string(*i))); REQ_SYNC(set_combo_contents, qso_opBW, &bws); *retval = xmlrpc_c::value_nil(); } }; class Rig_set_bandwidth : public xmlrpc_c::method { public: Rig_set_bandwidth() { _signature = "n:s"; _help = "Selects a bandwidth previously added by rig.set_bandwidths"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(set_combo_value, qso_opBW, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Rig_get_bandwidths : public xmlrpc_c::method { public: Rig_get_bandwidths() { _signature = "A:n"; _help = "Returns the list of available rig bandwidths"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; vector bws; REQ_SYNC(get_combo_contents, qso_opBW, &bws); *retval = xmlrpc_c::value_array(bws); } }; class Rig_get_bandwidth : public xmlrpc_c::method { public: Rig_get_bandwidth() { _signature = "s:n"; _help = "Returns the name of the current transceiver bandwidth"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(qso_opBW->value()); } }; class Rig_get_notch : public xmlrpc_c::method { public: Rig_get_notch() { _signature = "s:n"; _help = "Reports a notch filter frequency based on WF action"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_int(notch_frequency); } }; class Rig_set_notch : public xmlrpc_c::method { public: Rig_set_notch() { _signature = "n:i"; _help = "Sets the notch filter position on WF"; } static void set_notch(int freq) { notch_frequency = freq; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int notch = notch_frequency; REQ(set_notch, params.getInt(0)); *retval = xmlrpc_c::value_int(notch); } }; static int rig_control_counter; static void set_rig_control(bool xmlrpc) { struct rcb_t { Fl_Button *toggle, *init; }; static struct rcb_t prev_rigcontrol; if (xmlrpc) { rcb_t b[] = { { chkUSERIGCAT, btnInitRIGCAT }, { chkUSEHAMLIB, btnInitHAMLIB }, { chkUSEXMLRPC, btnInitXMLRPC } }; for (size_t i = 0; i < sizeof(b)/sizeof(*b); i++) { if (b[i].toggle->value()) { prev_rigcontrol = b[i]; break; } } if (!prev_rigcontrol.toggle) { prev_rigcontrol.toggle = chkUSEXMLRPC; prev_rigcontrol.init = btnInitXMLRPC; } bool changed = progdefaults.changed; chkUSEXMLRPC->value(1); chkUSEXMLRPC->do_callback(); btnInitXMLRPC->do_callback(); wf->setQSY(true); progdefaults.changed = changed; } else { bool changed = progdefaults.changed; prev_rigcontrol.toggle->value(1); prev_rigcontrol.toggle->do_callback(); prev_rigcontrol.init->do_callback(); progdefaults.changed = changed; } } class Rig_take_control : public xmlrpc_c::method { public: Rig_take_control() { _signature = "n:n"; _help = "Switches rig control to XML-RPC"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (++rig_control_counter == 1) REQ_SYNC(set_rig_control, true); *retval = xmlrpc_c::value_nil(); } }; class Rig_release_control : public xmlrpc_c::method { public: Rig_release_control() { _signature = "n:n"; _help = "Switches rig control to previous setting"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (rig_control_counter && !--rig_control_counter) REQ_SYNC(set_rig_control, false); *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= class Main_set_rig_name : public Rig_set_name { public: Main_set_rig_name() { _help = "[DEPRECATED; use rig.set_name]"; } }; class Main_set_rig_frequency : public Rig_set_frequency { public: Main_set_rig_frequency() { _help = "[DEPRECATED; use rig.set_frequency]"; } }; class Main_set_rig_modes : public Rig_set_modes { public: Main_set_rig_modes() { _help = "[DEPRECATED; use rig.set_modes"; } }; class Main_set_rig_mode : public Rig_set_mode { public: Main_set_rig_mode() { _help = "[DEPRECATED; use rig.set_mode"; } }; class Main_get_rig_modes : public Rig_get_modes { public: Main_get_rig_modes() { _help = "[DEPRECATED; use rig.get_modes]"; } }; class Main_get_rig_mode : public Rig_get_mode { public: Main_get_rig_mode() { _help = "[DEPRECATED; use rig.get_mode]"; } }; class Main_set_rig_bandwidths : public Rig_set_bandwidths { public: Main_set_rig_bandwidths() { _help = "[DEPRECATED; use rig.set_bandwidths]"; } }; class Main_set_rig_bandwidth : public Rig_set_bandwidth { public: Main_set_rig_bandwidth() { _help = "[DEPRECATED; use rig.set_bandwidth]"; } }; class Main_get_rig_bandwidths : public Rig_set_bandwidths { public: Main_get_rig_bandwidths() { _help = "[DEPRECATED; use rig.get_bandwidths]"; } }; class Main_get_rig_bandwidth : public Rig_get_bandwidth { public: Main_get_rig_bandwidth() { _help = "[DEPRECATED; use rig.get_bandwidth]"; } }; // ============================================================================= class Log_get_freq : public xmlrpc_c::method { public: Log_get_freq() { _signature = "s:n"; _help = "Returns the Frequency field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpFreq->value()); } }; class Log_get_time_on : public xmlrpc_c::method { public: Log_get_time_on() { _signature = "s:n"; _help = "Returns the Time-On field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpTimeOn->value()); } }; class Log_get_time_off : public xmlrpc_c::method { public: Log_get_time_off() { _signature = "s:n"; _help = "Returns the Time-Off field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpTimeOff->value()); } }; class Log_get_call : public xmlrpc_c::method { public: Log_get_call() { _signature = "s:n"; _help = "Returns the Call field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpCall->value()); } }; class Log_set_call : public xmlrpc_c::method { public: Log_set_call() { _signature = "n:s"; _help = "Sets the Call field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(set_text, inpCall, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_name : public xmlrpc_c::method { public: Log_get_name() { _signature = "s:n"; _help = "Returns the Name field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpName->value()); } }; class Log_set_name : public xmlrpc_c::method { public: Log_set_name() { _signature = "n:s"; _help = "Sets the Name field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(set_text, inpName, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_set_qth : public xmlrpc_c::method { public: Log_set_qth() { _signature = "n:s"; _help = "Sets the QTH field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(set_text, inpQth, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_set_locator : public xmlrpc_c::method { public: Log_set_locator() { _signature = "n:s"; _help = "Sets the Locator field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(set_text, inpLoc, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_rst_in : public xmlrpc_c::method { public: Log_get_rst_in() { _signature = "s:n"; _help = "Returns the RST(r) field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpRstIn->value()); } }; class Log_get_rst_out : public xmlrpc_c::method { public: Log_get_rst_out() { _signature = "s:n"; _help = "Returns the RST(s) field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpRstOut->value()); } }; class Log_get_serial_number : public xmlrpc_c::method { public: Log_get_serial_number() { _signature = "s:n"; _help = "Returns the serial number field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpSerNo->value()); } }; class Log_set_serial_number : public xmlrpc_c::method { public: Log_set_serial_number() { _signature = "n:s"; _help = "Sets the serial number field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(set_text, inpSerNo, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_serial_number_sent : public xmlrpc_c::method { public: Log_get_serial_number_sent() { _signature = "s:n"; _help = "Returns the serial number (sent) field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(outSerNo->value()); } }; class Log_get_exchange : public xmlrpc_c::method { public: Log_get_exchange() { _signature = "s:n"; _help = "Returns the contest exchange field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpXchgIn->value()); } }; class Log_set_exchange : public xmlrpc_c::method { public: Log_set_exchange() { _signature = "n:s"; _help = "Sets the contest exchange field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(set_text, inpXchgIn, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_state : public xmlrpc_c::method { public: Log_get_state() { _signature = "s:n"; _help = "Returns the State field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpState->value()); } }; class Log_get_province : public xmlrpc_c::method { public: Log_get_province() { _signature = "s:n"; _help = "Returns the Province field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpVEprov->value()); } }; class Log_get_country : public xmlrpc_c::method { public: Log_get_country() { _signature = "s:n"; _help = "Returns the Country field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpCountry->value()); } }; class Log_get_qth : public xmlrpc_c::method { public: Log_get_qth() { _signature = "s:n"; _help = "Returns the QTH field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpQth->value()); } }; class Log_get_band : public xmlrpc_c::method { public: Log_get_band() { _signature = "s:n"; _help = "Returns the current band name."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(band_name(band(wf->rfcarrier()))); } }; class Log_get_sb : public Main_get_wf_sideband { public: Log_get_sb() { _help = "[DEPRECATED; use main.get_wf_sideband]"; } }; class Log_get_notes : public xmlrpc_c::method { public: Log_get_notes() { _signature = "s:n"; _help = "Returns the Notes field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpNotes->value()); } }; class Log_get_locator : public xmlrpc_c::method { public: Log_get_locator() { _signature = "s:n"; _help = "Returns the Locator field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpLoc->value()); } }; class Log_get_az : public xmlrpc_c::method { public: Log_get_az() { _signature = "s:n"; _help = "Returns the AZ field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(inpAZ->value()); } }; class Log_clear : public xmlrpc_c::method { public: Log_clear() { _signature = "n:n"; _help = "Clears the contents of the log fields."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(clearQSO); *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= class Text_get_rx_length : public xmlrpc_c::method { public: Text_get_rx_length() { _signature = "i:n"; _help = "Returns the number of characters in the RX widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_int(ReceiveText->buffer()->length()); } }; class Text_get_rx : public xmlrpc_c::method { public: Text_get_rx() { _signature = "6:ii"; _help = "Returns a range of characters (start, length) from the RX text widget."; } static void get_rx_text_range(const xmlrpc_c::paramList* params, xmlrpc_c::fault** err, char** text, int* size) { // the get* methods may throw but this function is not allowed to do so try { params->verifyEnd(2); Fl_Text_Buffer_mod* tbuf = ReceiveText->buffer(); int len = tbuf->length(); int start = params->getInt(0, 0, len - 1); int n = params->getInt(1, -1, len - start); if (n == -1) n = len; // we can request more text than is available *text = tbuf->text_range(start, start + n); *size = n; } catch (const xmlrpc_c::fault& f) { *err = new xmlrpc_c::fault(f); } catch (const exception& e) { *err = new xmlrpc_c::fault(e.what(), xmlrpc_c::fault::CODE_INTERNAL); } } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; xmlrpc_c::fault* err = NULL; char* text; int size; REQ_SYNC(get_rx_text_range, ¶ms, &err, &text, &size); if (unlikely(err)) { xmlrpc_c::fault f(*err); delete err; throw f; } if (!size) { *retval = xmlrpc_c::value_bytestring("empty rx buffer!"); } else { vector bytes(size); memcpy(&bytes[0], text, size); *retval = xmlrpc_c::value_bytestring(bytes); } free(text); } }; class Text_clear_rx : public xmlrpc_c::method { public: Text_clear_rx() { _signature = "n:n"; _help = "Clears the RX text widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(&FTextBase::clear, ReceiveText); *retval = xmlrpc_c::value_nil(); } }; class Text_add_tx : public xmlrpc_c::method { public: Text_add_tx() { _signature = "n:s"; _help = "Adds a string to the TX text widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ_SYNC(&FTextTX::add_text, TransmitText, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Text_add_tx_bytes : public xmlrpc_c::method { public: Text_add_tx_bytes() { _signature = "n:6"; _help = "Adds a byte string to the TX text widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; vector bytes = params.getBytestring(0); bytes.push_back(0); REQ_SYNC(&FTextTX::add_text, TransmitText, string((const char*)&bytes[0])); *retval = xmlrpc_c::value_nil(); } }; class Text_clear_tx : public xmlrpc_c::method { public: Text_clear_tx() { _signature = "n:n"; _help = "Clears the TX text widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(&FTextBase::clear, TransmitText); *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= class RXTX_get_data : public xmlrpc_c::method { public: RXTX_get_data() { _signature = "6:n"; _help = "Returns all RXTX combined data since last query."; } static void get_rxtx(char **text, int *size) { // the get* methods may throw but this function is not allowed to do so *text = get_rxtx_data(); *size = strlen(*text); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; char *text; int size; REQ_SYNC(get_rxtx, &text, &size); vector bytes(size); memcpy(&bytes[0], text, size); *retval = xmlrpc_c::value_bytestring(bytes); } }; // ============================================================================= class RX_get_data : public xmlrpc_c::method { public: RX_get_data() { _signature = "6:n"; _help = "Returns all RX data received since last query."; } static void get_rx(char **text, int *size) { // the get* methods may throw but this function is not allowed to do so *text = get_rx_data(); *size = strlen(*text); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; char *text; int size; REQ_SYNC(get_rx, &text, &size); vector bytes(size); memcpy(&bytes[0], text, size); *retval = xmlrpc_c::value_bytestring(bytes); } }; // ============================================================================= class TX_get_data : public xmlrpc_c::method { public: TX_get_data() { _signature = "6:n"; _help = "Returns all TX data transmitted since last query."; } static void get_tx(char **text, int *size) { // the get* methods may throw but this function is not allowed to do so *text = get_tx_data(); *size = strlen(*text); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; char *text; int size; REQ_SYNC(get_tx, &text, &size); vector bytes(size); memcpy(&bytes[0], text, size); *retval = xmlrpc_c::value_bytestring(bytes); } }; // ============================================================================= extern Fl_Button* btnAutoSpot; // FIXME: export in fl_digi.h class Spot_get_auto : public xmlrpc_c::method { public: Spot_get_auto() { _signature = "b:n"; _help = "Returns the autospotter state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_boolean(btnAutoSpot->value()); } }; class Spot_set_auto : public xmlrpc_c::method { public: Spot_set_auto() { _signature = "b:b"; _help = "Sets the autospotter state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = btnAutoSpot->value(); REQ(set_button, btnAutoSpot, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Spot_toggle_auto : public xmlrpc_c::method { public: Spot_toggle_auto() { _signature = "b:n"; _help = "Toggles the autospotter state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !btnAutoSpot->value(); REQ(set_button, btnAutoSpot, v); *retval = xmlrpc_c::value_boolean(v); } }; class Spot_pskrep_get_count : public xmlrpc_c::method { public: Spot_pskrep_get_count() { _signature = "i:n"; _help = "Returns the number of callsigns spotted in the current session."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_int(static_cast(pskrep_count())); } }; // ============================================================================= // Returns the current wefax modem pointer. static wefax * get_wefax(void) { if( ( active_modem->get_mode() >= MODE_WEFAX_FIRST ) && ( active_modem->get_mode() <= MODE_WEFAX_LAST ) ) { wefax * ptr = dynamic_cast( active_modem ); if( ptr == NULL ) throw runtime_error("Inconsistent wefax object"); return ptr ; } throw runtime_error("Not in wefax mode"); } struct Wefax_state_string : public xmlrpc_c::method { Wefax_state_string() { _signature = "s:n"; _help = "Returns Wefax engine state (tx and rx) for information."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { *retval = xmlrpc_c::value_string( get_wefax()->state_string() ); } catch( const exception & e ) { *retval = xmlrpc_c::value_string( e.what()); } }; struct Wefax_skip_apt : public xmlrpc_c::method { Wefax_skip_apt() { _signature = "s:n"; _help = "Skip APT during Wefax reception"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->skip_apt(); *retval = xmlrpc_c::value_string( "" ); } catch( const exception & e ) { *retval = xmlrpc_c::value_string( e.what() ); } }; /// TODO: Refresh the screen with the new value. struct Wefax_skip_phasing : public xmlrpc_c::method { Wefax_skip_phasing() { _signature = "s:n"; _help = "Skip phasing during Wefax reception"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->skip_phasing(true); *retval = xmlrpc_c::value_string( "" ); } catch( const exception & e ) { *retval = xmlrpc_c::value_string( e.what() ); } }; // TODO: The image should be reloaded just like cancelling from the GUI. struct Wefax_set_tx_abort_flag : public xmlrpc_c::method { Wefax_set_tx_abort_flag() { _signature = "s:n"; _help = "Cancels Wefax image transmission"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->set_tx_abort_flag(); *retval = xmlrpc_c::value_string( "" ); } catch( const exception & e ) { *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_end_reception : public xmlrpc_c::method { Wefax_end_reception() { _signature = "s:n"; _help = "End Wefax image reception"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->end_reception(); *retval = xmlrpc_c::value_string( "" ); } catch( const exception & e ) { *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_start_manual_reception : public xmlrpc_c::method { Wefax_start_manual_reception() { _signature = "s:n"; _help = "Starts fax image reception in manual mode"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->set_rx_manual_mode(true); get_wefax()->skip_apt(); get_wefax()->skip_phasing(true); *retval = xmlrpc_c::value_string( "" ); } catch( const exception & e ) { *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_set_adif_log : public xmlrpc_c::method { Wefax_set_adif_log() { _signature = "s:b"; _help = "Set/reset logging to received/transmit images to ADIF log file"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { progdefaults.WEFAX_AdifLog = params.getBoolean(0); *retval = xmlrpc_c::value_string( "" ); } catch( const exception & e ) { *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_set_max_lines : public xmlrpc_c::method { Wefax_set_max_lines() { _signature = "s:i"; _help = "Set maximum lines for fax image reception"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { progdefaults.WEFAX_MaxRows = params.getInt(0); /// This updates the GUI. *retval = xmlrpc_c::value_string( "" ); } catch( const exception & e ) { *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_get_received_file : public xmlrpc_c::method { Wefax_get_received_file() { _signature = "s:i"; _help = "Waits for next received fax file, returns its name with a delay. Empty string if timeout."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { std::string filename = get_wefax()->get_received_file( params.getInt(0)); *retval = xmlrpc_c::value_string( filename ); } catch( const exception & e ) { *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_send_file : public xmlrpc_c::method { Wefax_send_file() { _signature = "s:si"; _help = "Send file. returns an empty string if OK otherwise an error message."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { std::string status = get_wefax()->send_file( params.getString(0), params.getInt(1) ); *retval = xmlrpc_c::value_string( status ); } catch( const exception & e ) { *retval = xmlrpc_c::value_string( e.what() ); } }; // ============================================================================= // Returns the current navtex modem pointer. static navtex * get_navtex(void) { if( ( active_modem->get_mode() != MODE_NAVTEX ) && ( active_modem->get_mode() != MODE_SITORB ) ) { navtex * ptr = dynamic_cast( active_modem ); if( ptr == NULL ) throw runtime_error("Inconsistent navtex object"); return ptr ; } throw runtime_error("Not in navtex or sitorB mode"); } struct Navtex_get_message : public xmlrpc_c::method { Navtex_get_message() { _signature = "s:i"; _help = "Returns next Navtex/SitorB message with a max delay in seconds.. Empty string if timeout."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { *retval = xmlrpc_c::value_string( get_navtex()->get_message( params.getInt(0)) ); } catch( const exception & e ) { *retval = xmlrpc_c::value_string( e.what()); } }; struct Navtex_send_message : public xmlrpc_c::method { Navtex_send_message() { _signature = "s:s"; _help = "Send a Navtex/SitorB message. Returns an empty string if OK otherwise an error message."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { std::string status = get_navtex()->send_message( params.getString(0) ); *retval = xmlrpc_c::value_string( status ); } catch( const exception & e ) { *retval = xmlrpc_c::value_string( e.what() ); } }; // ============================================================================= // End XML-RPC interface // method list: ELEM_(class_name, "method_name") #undef ELEM_ #define METHOD_LIST \ ELEM_(Fldigi_list, "fldigi.list") \ ELEM_(Fldigi_name, "fldigi.name") \ ELEM_(Fldigi_version_struct, "fldigi.version_struct") \ ELEM_(Fldigi_version_string, "fldigi.version") \ ELEM_(Fldigi_name_version, "fldigi.name_version") \ ELEM_(Fldigi_config_dir, "fldigi.config_dir") \ ELEM_(Fldigi_terminate, "fldigi.terminate") \ \ ELEM_(Modem_get_name, "modem.get_name") \ ELEM_(Modem_get_names, "modem.get_names") \ ELEM_(Modem_get_id, "modem.get_id") \ ELEM_(Modem_get_max_id, "modem.get_max_id") \ ELEM_(Modem_set_by_name, "modem.set_by_name") \ ELEM_(Modem_set_by_id, "modem.set_by_id") \ \ ELEM_(Modem_set_carrier, "modem.set_carrier") \ ELEM_(Modem_inc_carrier, "modem.inc_carrier") \ ELEM_(Modem_get_carrier, "modem.get_carrier") \ \ ELEM_(Modem_get_afc_sr, "modem.get_afc_search_range") \ ELEM_(Modem_set_afc_sr, "modem.set_afc_search_range") \ ELEM_(Modem_inc_afc_sr, "modem.inc_afc_search_range") \ \ ELEM_(Modem_get_bw, "modem.get_bandwidth") \ ELEM_(Modem_set_bw, "modem.set_bandwidth") \ ELEM_(Modem_inc_bw, "modem.inc_bandwidth") \ \ ELEM_(Modem_get_quality, "modem.get_quality") \ ELEM_(Modem_search_up, "modem.search_up") \ ELEM_(Modem_search_down, "modem.search_down") \ \ ELEM_(Modem_olivia_set_bandwidth, "modem.olivia.set_bandwidth") \ ELEM_(Modem_olivia_get_bandwidth, "modem.olivia.get_bandwidth") \ ELEM_(Modem_olivia_set_tones, "modem.olivia.set_tones") \ ELEM_(Modem_olivia_get_tones, "modem.olivia.get_tones") \ \ ELEM_(Main_get_status1, "main.get_status1") \ ELEM_(Main_get_status2, "main.get_status2") \ \ ELEM_(Main_get_sb, "main.get_sideband") \ ELEM_(Main_set_sb, "main.set_sideband") \ ELEM_(Main_get_wf_sideband, "main.get_wf_sideband") \ ELEM_(Main_set_wf_sideband, "main.set_wf_sideband") \ ELEM_(Main_get_freq, "main.get_frequency") \ ELEM_(Main_set_freq, "main.set_frequency") \ ELEM_(Main_inc_freq, "main.inc_frequency") \ \ ELEM_(Main_get_afc, "main.get_afc") \ ELEM_(Main_set_afc, "main.set_afc") \ ELEM_(Main_toggle_afc, "main.toggle_afc") \ \ ELEM_(Main_get_sql, "main.get_squelch") \ ELEM_(Main_set_sql, "main.set_squelch") \ ELEM_(Main_toggle_sql, "main.toggle_squelch") \ \ ELEM_(Main_get_sql_level, "main.get_squelch_level") \ ELEM_(Main_set_sql_level, "main.set_squelch_level") \ ELEM_(Main_inc_sql_level, "main.inc_squelch_level") \ \ ELEM_(Main_get_rev, "main.get_reverse") \ ELEM_(Main_set_rev, "main.set_reverse") \ ELEM_(Main_toggle_rev, "main.toggle_reverse") \ \ ELEM_(Main_get_lock, "main.get_lock") \ ELEM_(Main_set_lock, "main.set_lock") \ ELEM_(Main_toggle_lock, "main.toggle_lock") \ \ ELEM_(Main_get_rsid, "main.get_rsid") \ ELEM_(Main_set_rsid, "main.set_rsid") \ ELEM_(Main_toggle_rsid, "main.toggle_rsid") \ \ ELEM_(Main_get_trx_status, "main.get_trx_status") \ ELEM_(Main_tx, "main.tx") \ ELEM_(Main_tune, "main.tune") \ ELEM_(Main_rsid, "main.rsid") \ ELEM_(Main_rx, "main.rx") \ ELEM_(Main_abort, "main.abort") \ \ ELEM_(Main_get_trx_state, "main.get_trx_state") \ ELEM_(Main_get_tx_timing, "main.get_tx_timing") \ ELEM_(Main_get_char_rates, "main.get_char_rates") \ ELEM_(Main_get_char_timing, "main.get_char_timing") \ ELEM_(Main_set_rig_name, "main.set_rig_name") \ ELEM_(Main_set_rig_frequency, "main.set_rig_frequency") \ ELEM_(Main_set_rig_modes, "main.set_rig_modes") \ ELEM_(Main_set_rig_mode, "main.set_rig_mode") \ ELEM_(Main_get_rig_modes, "main.get_rig_modes") \ ELEM_(Main_get_rig_mode, "main.get_rig_mode") \ ELEM_(Main_set_rig_bandwidths, "main.set_rig_bandwidths") \ ELEM_(Main_set_rig_bandwidth, "main.set_rig_bandwidth") \ ELEM_(Main_get_rig_bandwidth, "main.get_rig_bandwidth") \ ELEM_(Main_get_rig_bandwidths, "main.get_rig_bandwidths") \ \ ELEM_(Main_run_macro, "main.run_macro") \ ELEM_(Main_get_max_macro_id, "main.get_max_macro_id") \ \ ELEM_(Rig_set_name, "rig.set_name") \ ELEM_(Rig_get_name, "rig.get_name") \ ELEM_(Rig_set_frequency, "rig.set_frequency") \ ELEM_(Rig_set_modes, "rig.set_modes") \ ELEM_(Rig_set_mode, "rig.set_mode") \ ELEM_(Rig_get_modes, "rig.get_modes") \ ELEM_(Rig_get_mode, "rig.get_mode") \ ELEM_(Rig_set_bandwidths, "rig.set_bandwidths") \ ELEM_(Rig_set_bandwidth, "rig.set_bandwidth") \ ELEM_(Rig_get_bandwidth, "rig.get_bandwidth") \ ELEM_(Rig_get_bandwidths, "rig.get_bandwidths") \ ELEM_(Rig_get_notch, "rig.get_notch") \ ELEM_(Rig_set_notch, "rig.set_notch") \ ELEM_(Rig_take_control, "rig.take_control") \ ELEM_(Rig_release_control, "rig.release_control") \ \ ELEM_(Log_get_freq, "log.get_frequency") \ ELEM_(Log_get_time_on, "log.get_time_on") \ ELEM_(Log_get_time_off, "log.get_time_off") \ ELEM_(Log_get_call, "log.get_call") \ ELEM_(Log_get_name, "log.get_name") \ ELEM_(Log_get_rst_in, "log.get_rst_in") \ ELEM_(Log_get_rst_out, "log.get_rst_out") \ ELEM_(Log_get_serial_number, "log.get_serial_number") \ ELEM_(Log_set_serial_number, "log.set_serial_number") \ ELEM_(Log_get_serial_number_sent, "log.get_serial_number_sent") \ ELEM_(Log_get_exchange, "log.get_exchange") \ ELEM_(Log_set_exchange, "log.set_exchange") \ ELEM_(Log_get_state, "log.get_state") \ ELEM_(Log_get_province, "log.get_province") \ ELEM_(Log_get_country, "log.get_country") \ ELEM_(Log_get_qth, "log.get_qth") \ ELEM_(Log_get_band, "log.get_band") \ ELEM_(Log_get_sb, "log.get_sideband") \ ELEM_(Log_get_notes, "log.get_notes") \ ELEM_(Log_get_locator, "log.get_locator") \ ELEM_(Log_get_az, "log.get_az") \ ELEM_(Log_clear, "log.clear") \ ELEM_(Log_set_call, "log.set_call") \ ELEM_(Log_set_name, "log.set_name") \ ELEM_(Log_set_qth, "log.set_qth") \ ELEM_(Log_set_locator, "log.set_locator") \ \ ELEM_(Text_get_rx_length, "text.get_rx_length") \ ELEM_(Text_get_rx, "text.get_rx") \ ELEM_(Text_clear_rx, "text.clear_rx") \ ELEM_(Text_add_tx, "text.add_tx") \ ELEM_(Text_add_tx_bytes, "text.add_tx_bytes") \ ELEM_(Text_clear_tx, "text.clear_tx") \ \ ELEM_(RXTX_get_data, "rxtx.get_data") \ ELEM_(RX_get_data, "rx.get_data") \ ELEM_(TX_get_data, "tx.get_data") \ \ ELEM_(Spot_get_auto, "spot.get_auto") \ ELEM_(Spot_set_auto, "spot.set_auto") \ ELEM_(Spot_toggle_auto, "spot.toggle_auto") \ ELEM_(Spot_pskrep_get_count, "spot.pskrep.get_count") \ \ ELEM_(Wefax_state_string, "wefax.state_string") \ ELEM_(Wefax_skip_apt, "wefax.skip_apt") \ ELEM_(Wefax_skip_phasing, "wefax.skip_phasing") \ ELEM_(Wefax_set_tx_abort_flag, "wefax.set_tx_abort_flag") \ ELEM_(Wefax_end_reception, "wefax.end_reception") \ ELEM_(Wefax_start_manual_reception, "wefax.start_manual_reception") \ ELEM_(Wefax_set_adif_log, "wefax.set_adif_log") \ ELEM_(Wefax_set_max_lines, "wefax.set_max_lines") \ ELEM_(Wefax_get_received_file, "wefax.get_received_file") \ ELEM_(Wefax_send_file, "wefax.send_file") \ \ ELEM_(Navtex_get_message, "navtex.get_message") \ ELEM_(Navtex_send_message, "navtex.send_message") \ struct rm_pred { re_t filter; bool allow; rm_pred(const char* re, bool allow_) : filter(re, REG_EXTENDED | REG_NOSUB), allow(allow_) { } bool operator()(const methods_t::value_type& v) { return filter.match(v.name) ^ allow && !strstr(v.name, "fldigi."); } }; void XML_RPC_Server::add_methods(void) { if (methods) return; #undef ELEM_ #define ELEM_(class_, name_) { RpcBuilder::factory, NULL, name_ }, rpc_method m[] = { METHOD_LIST }; methods = new methods_t(m, m + sizeof(m)/sizeof(*m)); if (!progdefaults.xmlrpc_deny.empty()) methods->remove_if(rm_pred(progdefaults.xmlrpc_deny.c_str(), false)); else if (!progdefaults.xmlrpc_allow.empty()) methods->remove_if(rm_pred(progdefaults.xmlrpc_allow.c_str(), true)); for( methods_t::iterator it = methods->begin(), en = methods->end(); it != en; ++it ) { XmlRpcServerMethod * mth = it->m_fact( it->name ); it->method = dynamic_cast< xmlrpc_c::method * >( mth ); } } fldigi-3.21.80/src/misc/stacktrace.cxx0000664000175000017500000001014512313064025014435 00000000000000// ---------------------------------------------------------------------------- // stacktrace.cxx: portable stack trace and error handlers // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #if HAVE_DBG_STACK # include #endif #include #include #include #include #ifdef BUILD_FLDIGI # include "main.h" #else # include "flarq.h" #endif using namespace std; static volatile sig_atomic_t signum = 0; #if !HAVE_DBG_STACK static void pstack(int fd, unsigned skip = 0); #else static void pstack(ostream& out, unsigned skip = 0); #endif void diediedie(void) { #ifndef __MINGW32__ // If this environment variable is set, creates a core dump. if( getenv("FLDIGI_COREDUMP") ) { signal(SIGSEGV, SIG_DFL); kill(getpid(), SIGSEGV); } #endif static bool print_trace = true; if (!print_trace) exit(128 + (signum ? signum : SIGABRT)); #define CRASH_HEADER "\nAborting " PACKAGE_TARNAME " due to a fatal error.\n" \ "Please report this to: " PACKAGE_BUGREPORT \ "\nor file a bug report at: " PACKAGE_NEWBUG \ "\n\n****** Stack trace:\n" #ifndef __MINGW32__ if (isatty(STDERR_FILENO)) #endif { if (signum) cerr << "\nCaught signal " << signum; cerr << CRASH_HEADER; #if !HAVE_DBG_STACK pstack(STDERR_FILENO); #else pstack(cerr); #endif extern string version_text, build_text; cerr << "\n****** Version information:\n" << version_text << "\n****** Build information:\n" << build_text; string stfname; #ifdef BUILD_FLDIGI stfname.assign(HomeDir).append("stacktrace.txt"); #else stfname = Logfile; #endif #if !HAVE_DBG_STACK FILE* stfile = fopen(stfname.c_str(), "w"); if (stfile) { pstack(fileno(stfile), 1); fprintf(stfile, "%s\n****** Version information:\n%s\n****** Build information:%s\n", CRASH_HEADER, version_text.c_str(), build_text.c_str()); } #else ofstream stfile(stfname.c_str()); if (stfile) { stfile << CRASH_HEADER; pstack(stfile, 1); stfile << "\n****** Version information:\n" << version_text; stfile << "\n****** Build information:\n" << build_text; } #endif } print_trace = false; exit(128 + (signum ? signum : SIGABRT)); } #if !HAVE_DBG_STACK # if HAVE_EXECINFO_H # include # define MAX_STACK_FRAMES 64 void pstack(int fd, unsigned skip) { void* stack[MAX_STACK_FRAMES]; ++skip; backtrace_symbols_fd(stack + skip, backtrace(stack, MAX_STACK_FRAMES) - skip, fd); } # else void pstack(int fd, unsigned skip) { } # endif #else # include # include # include "stack.h" static void pstack(ostream& out, unsigned skip) { dbg::stack s; dbg::stack::const_iterator start = s.begin(), end = s.end(); while (skip-- && ++start != end); copy(start, end, ostream_iterator(out, "\n")); } #endif void pstack_maybe(void) { static bool trace = getenv("FLDIGI_TRACE_LOCKS"); if (trace) #if !HAVE_DBG_STACK pstack(STDERR_FILENO, 1); #else pstack(cerr, 1); #endif } void handle_unexpected(void) { cerr << "Uncaught exception. Not again!\n"; abort(); } // this may not give us anything useful, but we can try... void handle_signal(int s) { if (s != SIGUSR2) { signum = s; diediedie(); } } fldigi-3.21.80/src/misc/ascii.cxx0000664000175000017500000001527312313064025013410 00000000000000// ---------------------------------------------------------------------------- // ascii.cxx -- ASCII table // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "ascii.h" const char *ascii[256] = { "", "", "", "", "", "", "", "", "\b", "\t", "\n", "", "", "\r", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-" }; const char *ascii2[256] = { "", "", "", "", "", "", "", "", "\b", "\t", "\n", "", "", "\r", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-" }; const char *ascii3[256] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "<128>", "<129>", "<130>", "<131>", "<132>", "<133>", "<134>", "<135>", "<136>", "<137>", "<138>", "<139>", "<140>", "<141>", "<142>", "<143>", "<144>", "<145>", "<146>", "<147>", "<148>", "<149>", "<150>", "<151>", "<152>", "<153>", "<154>", "<155>", "<156>", "<157>", "<158>", "<159>", "<160>", "<161>", "<162>", "<163>", "<164>", "<165>", "<166>", "<167>", "<168>", "<169>", "<170>", "<171>", "<172>", "<173>", "<174>", "<175>", "<176>", "<177>", "<178>", "<179>", "<180>", "<181>", "<182>", "<183>", "<184>", "<185>", "<186>", "<187>", "<188>", "<189>", "<190>", "<191>", "<192>", "<193>", "<194>", "<195>", "<196>", "<197>", "<198>", "<199>", "<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>", "<208>", "<209>", "<210>", "<211>", "<212>", "<213>", "<214>", "<215>", "<216>", "<217>", "<218>", "<219>", "<220>", "<221>", "<222>", "<223>", "<224>", "<225>", "<226>", "<227>", "<228>", "<229>", "<230>", "<231>", "<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "<238>", "<239>", "<240>", "<241>", "<242>", "<243>", "<244>", "<245>", "<246>", "<247>", "<248>", "<249>", "<250>", "<251>", "<252>", "<253>", "<254>", "<255>" }; fldigi-3.21.80/src/misc/stack.cxx0000664000175000017500000003143612313064025013424 00000000000000// Copyright 2007 Edd Dawson. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include "stack.h" #if defined(_WIN32) #include #include #if defined(__MINGW32__) #include // link against libbfd and libiberty #include // link against psapi #include #endif #elif defined(__GNUC__) #include #include #endif namespace { #if defined(__GNUC__) std::string demangle(const char *name) { int status = 0; char *d = 0; std::string ret = name; try { if ((d = abi::__cxa_demangle(name, 0, 0, &status))) ret = d; } catch(...) { } free(d); return ret; } #endif #if defined(_WIN32) class uncopyable { public: uncopyable() { } private: uncopyable(const uncopyable &); // remains undefined uncopyable &operator= (const uncopyable &); // remains undefined }; #if defined(__MINGW32__) class bfd_context : uncopyable { private: struct find_data { std::string func; asymbol **symbol_table; bfd_vma counter; }; public: bfd_context() : abfd_(0), sec_(0), symbol_table_(0) { char procname[MAX_PATH]; GetModuleFileNameEx(GetCurrentProcess(), NULL, procname, sizeof procname); bfd_init(); abfd_ = bfd_openr(procname, 0); if (!abfd_) throw dbg::stack_error("Failed to parse object data for the executable"); char **formats = 0; bool b1 = bfd_check_format(abfd_, bfd_object); bool b2 = bfd_check_format_matches(abfd_, bfd_object, &formats); bool b3 = bfd_get_file_flags(abfd_) & HAS_SYMS; if (!(b1 && b2 && b3)) { bfd_close(abfd_); free(formats); throw dbg::stack_error("Failed to parse object data for the executable"); } free(formats); // Load symbol table unsigned dummy = 0; if (bfd_read_minisymbols(abfd_, FALSE, (void **)&symbol_table_, &dummy) == 0 && bfd_read_minisymbols(abfd_, TRUE, (void **)&symbol_table_, &dummy) < 0) { free(symbol_table_); bfd_close(abfd_); throw dbg::stack_error("Failed to parse object data for the executable"); } } ~bfd_context() { free(symbol_table_); bfd_close(abfd_); } std::string get_function_name(DWORD offset) { find_data data; data.symbol_table = symbol_table_; data.counter = offset; bfd_map_over_sections(abfd_, &find_function_name_in_section, &data); return data.func; } private: static void find_function_name_in_section(bfd *abfd, asection *sec, void *opaque_data) { assert(sec); assert(opaque_data); find_data &data = *static_cast(opaque_data); if (!data.func.empty()) return; // already found it if (!(bfd_get_section_flags(abfd, sec) & SEC_ALLOC)) return; bfd_vma vma = bfd_get_section_vma(abfd, sec); if (data.counter < vma || vma + bfd_get_section_size(sec) <= data.counter) return; const char *func = 0; const char *file = 0; unsigned line = 0; if (bfd_find_nearest_line(abfd, sec, data.symbol_table, data.counter - vma, &file, &func, &line) && func) data.func = demangle(func); } private: bfd *abfd_; asection *sec_; asymbol **symbol_table_; }; #endif // __MINGW32__ class auto_cast_function_ptr { public: template explicit auto_cast_function_ptr(FuncPtr f) : fptr_(reinterpret_cast(f)) { } template operator FuncPtr() const { return reinterpret_cast(fptr_); } private: void (*fptr_)(void); }; class windows_dll : uncopyable { public: explicit windows_dll(const std::string &libname) : name_(libname), lib_(LoadLibrary(name_.c_str())) { if (!lib_) throw dbg::stack_error("Failed to load dll " + name_); } ~windows_dll() { FreeLibrary(lib_); } const std::string &name() const { return name_; } auto_cast_function_ptr function(const std::string &func_name) const { FARPROC proc = GetProcAddress(lib_, func_name.c_str()); if (!proc) throw dbg::stack_error("failed to load function " + func_name + " from library " + name_); return auto_cast_function_ptr(proc); } private: std::string name_; HMODULE lib_; }; class symbol_context : uncopyable { public: symbol_context() { SymInitialize(GetCurrentProcess(), 0, true); } ~symbol_context() { SymCleanup(GetCurrentProcess()); } }; class mutex : uncopyable { public: mutex() { InitializeCriticalSection(&cs_); } ~mutex() { DeleteCriticalSection(&cs_); } void lock() { EnterCriticalSection(&cs_); } void unlock() { LeaveCriticalSection(&cs_); } private: CRITICAL_SECTION cs_; }; class scoped_lock : uncopyable { public: scoped_lock(mutex &m) : m_(m) { m_.lock(); } ~scoped_lock() { m_.unlock(); } private: mutex &m_; }; mutex fill_frames_mtx_; void fill_frames(std::list &frames, dbg::stack::depth_type limit) { scoped_lock lk(fill_frames_mtx_); #if defined(__MINGW32__) static bfd_context bfdc; #endif symbol_context sc; STACKFRAME frame; std::memset(&frame, 0, sizeof frame); CONTEXT context; std::memset(&context, 0, sizeof(CONTEXT)); context.ContextFlags = CONTEXT_FULL; windows_dll kernel32("kernel32.dll"); void (WINAPI *RtlCaptureContext_) (CONTEXT*) = kernel32.function("RtlCaptureContext"); RtlCaptureContext_(&context); frame.AddrPC.Offset = context.Eip; frame.AddrPC.Mode = AddrModeFlat; frame.AddrStack.Offset = context.Esp; frame.AddrStack.Mode = AddrModeFlat; frame.AddrFrame.Offset = context.Ebp; frame.AddrFrame.Mode = AddrModeFlat; HANDLE process = GetCurrentProcess(); HANDLE thread = GetCurrentThread(); dbg::stack::depth_type skip = 0; bool has_limit = limit != 0; char symbol_buffer[sizeof(IMAGEHLP_SYMBOL) + 255]; char module_name_raw[MAX_PATH]; while(StackWalk(IMAGE_FILE_MACHINE_I386, process, thread, &frame, &context, 0, SymFunctionTableAccess, SymGetModuleBase, 0 )) { if (skip < 1) { ++skip; continue; } if (has_limit && limit-- == 0) break; IMAGEHLP_SYMBOL *symbol = reinterpret_cast(symbol_buffer); symbol->SizeOfStruct = (sizeof *symbol) + 255; symbol->MaxNameLength = 254; DWORD module_base = SymGetModuleBase(process, frame.AddrPC.Offset); std::string module_name = "[unknown module]"; if( module_base && GetModuleFileName(reinterpret_cast(module_base), module_name_raw, MAX_PATH)) module_name = module_name_raw; #if defined(__MINGW32__) std::string func = bfdc.get_function_name(frame.AddrPC.Offset); if (func.empty()) { DWORD displacement = 0; // dummy variable BOOL got_symbol = SymGetSymFromAddr(process, frame.AddrPC.Offset, &displacement, symbol); func = got_symbol ? symbol->Name : "[unknown function]"; } #else DWORD displacement = 0; // dummy variable BOOL got_symbol = SymGetSymFromAddr(process, frame.AddrPC.Offset, &displacement, symbol); std::string func = got_symbol ? symbol->Name : "[unknown function]"; #endif dbg::stack_frame f(reinterpret_cast(frame.AddrPC.Offset), func + " in " + module_name); frames.push_back(f); } } #elif defined(__GNUC__) #if defined(__i386__) || defined(__x86_64__) void fill_frames(std::list &frames, dbg::stack::depth_type limit) { // Based on code found at: // http://www.tlug.org.za/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV Dl_info info; void **frame = static_cast(__builtin_frame_address(0)); void **bp = static_cast(*frame); void *ip = frame[1]; bool has_limit = limit != 0; dbg::stack::depth_type skip = 0; while(bp && ip && dladdr(ip, &info)) { if (skip < 1) ++skip; else { if (has_limit && limit-- == 0) break; frames.push_back(dbg::stack_frame(ip, demangle(info.dli_sname) + " in " + info.dli_fname)); if(info.dli_sname && !strcmp(info.dli_sname, "main")) break; } ip = bp[1]; bp = static_cast(bp[0]); } } #elif defined(__ppc__) void fill_frames(std::list &frames, dbg::stack::depth_type limit) { // Based on code found at: // http://www.informit.com/articles/article.aspx?p=606582&seqNum=4&rl=1 void *ip = __builtin_return_address(0); void **frame = static_cast(__builtin_frame_address(1)); bool has_limit = limit != 0; Dl_info info; do { if (has_limit && limit-- == 0) break; if (dladdr(ip, &info)) frames.push_back(dbg::stack_frame(ip, demangle(info.dli_sname) + " in " + info.dli_fname)); if (frame && (frame = static_cast(*frame))) ip = *(frame + 2); } while (frame && ip); } #else // GNU, but neither x86 or PPC #error "Sorry but dbg::stack is not supported on this architecture" #endif #else // Unsupported compiler #error "Sorry but dbg::stack is not supported on this compiler" #endif } namespace dbg { stack_error::stack_error(const std::string &what) : what_(what) { } stack_error::~stack_error() throw() { } const char *stack_error::what() const throw() { return what_.c_str(); } stack_frame::stack_frame(const void *instruction, const std::string &function) : instruction_(instruction), function_(function) { } const void *stack_frame::instruction() const { return instruction_; } const std::string &stack_frame::function() const { return function_; } std::ostream &operator<< (std::ostream &out, const stack_frame &frame) { return out << frame.instruction() << ": " << frame.function(); } stack::stack(depth_type limit) { fill_frames(frames_, limit); } stack::const_iterator stack::begin() const { return frames_.begin(); } stack::const_iterator stack::end() const { return frames_.end(); } stack::depth_type stack::depth() const { return frames_.size(); } } // close namespace dbg fldigi-3.21.80/src/waterfall/0000775000175000017500000000000012313333726012701 500000000000000fldigi-3.21.80/src/waterfall/waterfall.cxx0000664000175000017500000015374512313064025015336 00000000000000// ---------------------------------------------------------------------------- // waterfall.cxx - Waterfall Spectrum Analyzer Widget // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- //#define USE_BLACKMAN //#define USE_HAMMING //#define USE_HANNING #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fl_digi.h" #include "trx.h" #include "misc.h" #include "waterfall.h" #include "main.h" #include "modem.h" #include "qrunner.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "rigio.h" #include "fldigi-config.h" #include "configuration.h" #include "status.h" #include "Viewer.h" #include "macros.h" #include "arq_io.h" #include "confdialog.h" #include "flmisc.h" #include "gettext.h" #include "rtty.h" #include "flslider2.h" #include "debug.h" using namespace std; #define bwFFT 30 #define cwRef 50 #define bwX1 25 #define bwMov 18 #define bwRate 45 #define cwCnt 92 #define bwQsy 32 #define bwXmtLock 32 #define bwRev 32 #define bwMem 40 #define bwXmtRcv 40 #define wSpace 1 #define bwdths (wSpace + bwFFT + wSpace + cwRef + wSpace + cwRef + wSpace + bwX1 + \ wSpace + 3*bwMov + wSpace + bwRate + wSpace + \ cwCnt + wSpace + bwQsy + wSpace + bwMem + wSpace + \ bwXmtLock + wSpace + bwRev + wSpace + bwXmtRcv + wSpace) extern modem *active_modem; static RGB RGByellow = {254,254,0}; //static RGB RGBgreen = {0,254,0}; //static RGB RGBdkgreen = {0,128,0}; //static RGB RGBblue = {0,0,255}; static RGB RGBred = {254,0,0}; //static RGB RGBwhite = {254,254,254}; //static RGB RGBblack = {0,0,0}; //static RGB RGBmagenta = {196,0,196}; //static RGB RGBblack = {0,0,0}; // RGBI is a structure consisting of the values RED, GREEN, BLUE, INTENSITY // each value can range from 0 (extinguished) to 255 (full on) // the INTENSITY value is used for the grayscale waterfall display RGBI mag2RGBI[256]; RGB palette[9]; short int *tmp_fft_db; WFdisp::WFdisp (int x0, int y0, int w0, int h0, char *lbl) : Fl_Widget(x0,y0,w0,h0,"") { disp_width = w(); if (disp_width > progdefaults.HighFreqCutoff/4) disp_width = progdefaults.HighFreqCutoff/4; scale_width = IMAGE_WIDTH * 2; image_height = h() - WFTEXT - WFSCALE - WFMARKER; image_area = IMAGE_WIDTH * image_height; sig_image_area = IMAGE_WIDTH * h(); RGBsize = sizeof(RGB); RGBwidth = RGBsize * scale_width; fft_img = new RGBI[image_area]; markerimage = new RGB[scale_width * WFMARKER]; scaleimage = new uchar[scale_width * WFSCALE]; scline = new uchar[scale_width]; fft_sig_img = new uchar[image_area]; sig_img = new uchar[sig_image_area]; pwr = new wf_fft_type[IMAGE_WIDTH]; fft_db = new short int[image_area]; tmp_fft_db = new short int[image_area]; circbuff = new double[FFT_LEN]; wfbuf = new wf_cpx_type[FFT_LEN]; wfft = new g_fft(FFT_LEN); fftwindow = new double[FFT_LEN]; setPrefilter(progdefaults.wfPreFilter); memset(circbuff, 0, FFT_LEN * sizeof(double)); mag = 1; step = 4; offset = 0; sigoffset = 0; ampspan = 75; reflevel = -10; initmaps(); bandwidth = 32; RGBmarker = RGBred; RGBcursor = RGByellow; RGBInotch.I = progdefaults.notchRGBI.I; RGBInotch.R = progdefaults.notchRGBI.R; RGBInotch.G = progdefaults.notchRGBI.G; RGBInotch.B = progdefaults.notchRGBI.B; mode = WATERFALL; centercarrier = false; overload = false; peakaudio = 0.0; rfc = 0L; usb = true; wfspeed = NORMAL; srate = 8000; wfspdcnt = 0; dispcnt = 4; wantcursor = false; cursormoved = false; // usebands = false; for (int i = 0; i < IMAGE_WIDTH; i++) pwr[i] = 0.0; carrier(1000); oldcarrier = newcarrier = 0; tmp_carrier = false; ptrCB = 0; ptrFFTbuff = 0; for (int i = 0; i < 256; i++) mag2RGBI[i].I = mag2RGBI[i].R = mag2RGBI[i].G = mag2RGBI[i].B = 0; } WFdisp::~WFdisp() { delete wfft; delete [] fft_img; delete [] scaleimage; delete [] markerimage; delete [] fft_sig_img; delete [] sig_img; delete [] pwr; delete [] scline; delete [] fft_db; delete [] tmp_fft_db; } void WFdisp::initMarkers() { uchar *c1 = (uchar *)markerimage, *c2 = c1 + RGBwidth * (WFMARKER - 1); memset(c1, 196, RGBwidth); memset(c2, 196, RGBwidth); } // draw a marker of specified width and colour centred at freq and clrM inline void WFdisp::makeMarker_(int width, const RGB* color, int freq, const RGB* clrMin, RGB* clrM, const RGB* clrMax) { if (!active_modem) return; trx_mode marker_mode = active_modem->get_mode(); if (marker_mode == MODE_RTTY) { // rtty has two bandwidth indicators on the waterfall // upper and lower frequency int shift = static_cast(progdefaults.rtty_shift >= 0 ? rtty::SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift); int bw_limit_hi = (int)(shift / 2 + progdefaults.RTTY_BW / 2.0); int bw_limit_lo = (int)(shift / 2 - progdefaults.RTTY_BW / 2.0); int bw_freq = static_cast(freq + 0.5); int bw_lower1 = -bw_limit_hi; int bw_upper1 = -bw_limit_lo; int bw_lower2 = bw_limit_lo; int bw_upper2 = bw_limit_hi; if (bw_lower1 + bw_freq < 0) bw_lower1 -= bw_lower1 + bw_freq; if (bw_upper1 + bw_freq < 0) bw_lower2 -= bw_lower2 + bw_freq; if (bw_upper2 + bw_freq > scale_width) bw_upper2 -= bw_upper2 + bw_freq - scale_width; if (bw_lower2 + bw_freq > scale_width) bw_lower2 -= bw_lower2 + bw_freq - scale_width; // draw it RGB* clrPos; for (int y = 0; y < WFMARKER - 2; y++) { for (int x = bw_lower1; x < bw_upper1; x++) { clrPos = clrM + x + y * scale_width; if (clrPos > clrMin && clrPos < clrMax) *clrPos = *color; } for (int x = bw_lower2; x < bw_upper2; x++) { clrPos = clrM + x + y * scale_width; if (clrPos > clrMin && clrPos < clrMax) *clrPos = *color; } } return; } int bw_lower = -width, bw_upper = width; if (marker_mode >= MODE_MT63_500S && marker_mode <= MODE_MT63_2000L) bw_upper = (int)(width * 31 / 32); if (bw_lower + static_cast(freq+0.5) < 0) bw_lower -= bw_lower + static_cast(freq+0.5); if (bw_upper + static_cast(freq+0.5) > scale_width) bw_upper -= bw_upper + static_cast(freq+0.5) - scale_width; // draw it RGB* clrPos; for (int y = 0; y < WFMARKER - 2; y++) { for (int x = bw_lower; x < bw_upper; x++) { clrPos = clrM + x + y * scale_width; if (clrPos > clrMin && clrPos < clrMax) *clrPos = *color; } } } void WFdisp::makeMarker() { if (unlikely(!active_modem)) return; RGB *clrMin, *clrMax, *clrM; clrMin = markerimage + scale_width; clrMax = clrMin + (WFMARKER - 2) * scale_width; memset(clrMin, 0, RGBwidth * (WFMARKER - 2)); clrM = clrMin + (int)((double)carrierfreq + 0.5); int marker_width = bandwidth; int mode = active_modem->get_mode(); if (mode >= MODE_PSK_FIRST && mode <= MODE_PSK_LAST) marker_width += mailserver ? progdefaults.ServerOffset : progdefaults.SearchRange; else if (mode >= MODE_FELDHELL && mode <= MODE_HELL80) marker_width = (int)progdefaults.HELL_BW; else if (mode == MODE_RTTY) marker_width = static_cast(rtty::SHIFT[progdefaults.rtty_shift]); marker_width = (int)(marker_width / 2.0 + 1); RGBmarker.R = progdefaults.bwTrackRGBI.R; RGBmarker.G = progdefaults.bwTrackRGBI.G; RGBmarker.B = progdefaults.bwTrackRGBI.B; makeMarker_(marker_width, &RGBmarker, carrierfreq, clrMin, clrM, clrMax); if (unlikely(active_modem->freqlocked())) { int txfreq = static_cast(active_modem->get_txfreq()); adjust_color_inv(RGBmarker.R, RGBmarker.G, RGBmarker.B, FL_BLACK, FL_RED); makeMarker_( static_cast(bandwidth / 2.0 + 1), &RGBmarker, txfreq, clrMin, clrMin + (int)((double)txfreq + 0.5), clrMax); } if (!wantcursor) return; if (cursorpos > progdefaults.HighFreqCutoff - bandwidth / 2 / step) cursorpos = progdefaults.HighFreqCutoff - bandwidth / 2 / step; if (cursorpos >= (progdefaults.HighFreqCutoff - offset - bandwidth/2)/step) cursorpos = (progdefaults.HighFreqCutoff - offset - bandwidth/2)/step; if (cursorpos < (progdefaults.LowFreqCutoff + bandwidth / 2) / step) cursorpos = (progdefaults.LowFreqCutoff + bandwidth / 2) / step; // Create the cursor marker double xp = offset + step * cursorpos; if (xp < bandwidth / 2.0 || xp > (progdefaults.HighFreqCutoff - bandwidth / 2.0)) return; clrM = markerimage + scale_width + (int)(xp + 0.5); RGBcursor.R = progdefaults.cursorLineRGBI.R; RGBcursor.G = progdefaults.cursorLineRGBI.G; RGBcursor.B = progdefaults.cursorLineRGBI.B; int bw_lo = marker_width; int bw_hi = marker_width; if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; for (int y = 0; y < WFMARKER - 2; y++) { int incr = y * scale_width; int msize = (WFMARKER - 2 - y)*RGBsize*step/4; *(clrM + incr - 1) = *(clrM + incr) = *(clrM + incr + 1) = RGBcursor; if (xp - (bw_lo + msize) > 0) for (int i = bw_lo - msize; i <= bw_lo + msize; i++) *(clrM - i + incr) = RGBcursor; if (xp + (bw_hi + msize) < scale_width) for (int i = bw_hi - msize; i <= bw_hi + msize; i++) *(clrM + i + incr) = RGBcursor; } } void WFdisp::makeScale() { uchar *gmap = scaleimage; int hwidth = step / 2; memset(scline, 0, scale_width); for (int tic = 500; tic < scale_width; tic += 500) { if (hwidth) for (int ticn = -hwidth; ticn < hwidth; ticn++) scline[tic + ticn] = 255; else scline[tic] = 255; } for (int i = 0; i < WFSCALE - 5; i++) { memcpy(gmap, scline, scale_width); gmap += (scale_width); } for (int tic = 100; tic < scale_width ; tic += 100) { if (hwidth) for (int ticn = -hwidth; ticn < hwidth; ticn++) scline[tic + ticn] = 255; else scline[tic] = 255; } for (int i = 0; i < 5; i++) { memcpy(gmap, scline, scale_width); gmap += (scale_width); } } void WFdisp::setcolors() { double di; int r, g, b; for (int i = 0; i < 256; i++) { di = sqrt((double)i / 256.0); mag2RGBI[i].I = (uchar)(200*di); } for (int n = 0; n < 8; n++) { for (int i = 0; i < 32; i++) { r = palette[n].R + (int)(1.0 * i * (palette[n+1].R - palette[n].R) / 32.0); g = palette[n].G + (int)(1.0 * i * (palette[n+1].G - palette[n].G) / 32.0); b = palette[n].B + (int)(1.0 * i * (palette[n+1].B - palette[n].B) / 32.0); mag2RGBI[i + 32*n].R = r; mag2RGBI[i + 32*n].G = g; mag2RGBI[i + 32*n].B = b; } } } void WFdisp::initmaps() { for (int i = 0; i < image_area; i++) fft_db[i] = tmp_fft_db[i] = log2disp(-1000); memset (fft_img, 0, image_area * sizeof(RGBI) ); memset (scaleimage, 0, scale_width * WFSCALE); memset (markerimage, 0, IMAGE_WIDTH * WFMARKER); memset (fft_sig_img, 0, image_area); memset (sig_img, 0, sig_image_area); memset (mag2RGBI, 0, sizeof(mag2RGBI)); initMarkers(); makeScale(); setcolors(); } int WFdisp::peakFreq(int f0, int delta) { double threshold = 0.0; int f1, fmin = (int)((f0 - delta)), f2, fmax = (int)((f0 + delta)); f1 = fmin; f2 = fmax; if (fmin < 0 || fmax > IMAGE_WIDTH) return f0; for (int f = fmin; f <= fmax; f++) threshold += pwr[f]; threshold /= delta; for (int f = fmin; f <= fmax; f++) if (pwr[f] > threshold) { f2 = f; } for (int f = fmax; f >= fmin; f--) if (pwr[f] > threshold) { f1 = f; } return (f1 + f2) / 2; } double WFdisp::powerDensity(double f0, double bw) { double pwrdensity = 0.0; int flower = (int)((f0 - bw/2)), fupper = (int)((f0 + bw/2)); if (flower < 0 || fupper > IMAGE_WIDTH) return 0.0; for (int i = flower; i <= fupper; i++) pwrdensity += pwr[i]; return pwrdensity/(bw+1); } // Frequency of the maximum power for a given bandwidth. Used for AFC. double WFdisp::powerDensityMaximum(int bw_nb, const int (*bw)[2]) const { double max_pwr = 0 ; int f_lowest = bw[0][0]; int f_highest = bw[bw_nb-1][1]; if( f_lowest > f_highest ) abort(); for( int i = 0 ; i < bw_nb; ++i ) { const int * p_bw = bw[i]; if( p_bw[0] > p_bw[1] ) abort(); for( int j = p_bw[0] ; j <= p_bw[1]; ++j ) { max_pwr += pwr[ j - f_lowest ]; } } double curr_pwr = max_pwr ; int max_idx = -1 ; // Single pass to compute the maximum on this bandwidth. for( int f = -f_lowest ; f < IMAGE_WIDTH - f_highest; ++f ) { // Difference with previous power. for( int i = 0 ; i < bw_nb; ++i ) { const int * p_bw = bw[i]; curr_pwr += pwr[ f + p_bw[1] ] - pwr[ f + p_bw[0] ]; } if( curr_pwr > max_pwr ) { max_idx = f ; max_pwr = curr_pwr ; } } return max_idx ; } void WFdisp::setPrefilter(int v) { switch (v) { case WF_FFT_RECTANGULAR: RectWindow(fftwindow, FFT_LEN); break; case WF_FFT_BLACKMAN: BlackmanWindow(fftwindow, FFT_LEN); break; case WF_FFT_HAMMING: HammingWindow(fftwindow, FFT_LEN); break; case WF_FFT_HANNING: HanningWindow(fftwindow, FFT_LEN); break; case WF_FFT_TRIANGULAR: TriangularWindow(fftwindow, FFT_LEN); break; } prefilter = v; } int WFdisp::log2disp(int v) { double val = 255.0 * (reflevel- v) / ampspan; if (val < 0) return 255; if (val > 255 ) return 0; return (int)(255 - val); } void WFdisp::processFFT() { if (prefilter != progdefaults.wfPreFilter) setPrefilter(progdefaults.wfPreFilter); wf_fft_type scale = ( 1.0 * SC_SMPLRATE / srate ) * ( FFT_LEN / 8000.0); if (--dispcnt == 0) { static const int log2disp100 = log2disp(-100); double vscale = 2.0 / FFT_LEN; memset(wfbuf, 0, FFT_LEN * sizeof(*wfbuf)); void *pv = static_cast(wfbuf); wf_fft_type *pbuf = static_cast(pv); int latency = progdefaults.wf_latency; if (latency < 1) latency = 1; if (latency > 16) latency = 16; int nsamples = FFT_LEN * latency / 16; vscale *= sqrt(16.0 / latency); for (int i = 0; i < nsamples; i++) pbuf[i] = fftwindow[i * 16 / latency] * circbuff[i] * vscale; wfft->RealFFT(wfbuf); memset(pwr, 0, progdefaults.LowFreqCutoff * sizeof(wf_fft_type)); memset(&fft_db[ptrFFTbuff * IMAGE_WIDTH], log2disp100, progdefaults.LowFreqCutoff * sizeof(*fft_db)); int n = 0; for (int i = progdefaults.LowFreqCutoff + 1; i < IMAGE_WIDTH; i++) { n = round(scale * i); pwr[i] = norm(wfbuf[n]); int ffth = round(10.0 * log10(pwr[i] + 1e-10) ); fft_db[ptrFFTbuff * IMAGE_WIDTH + i] = log2disp(ffth); } ptrFFTbuff--; if (ptrFFTbuff < 0) ptrFFTbuff += image_height; for (int i = 0; i < image_height; i++) { int j = (i + 1 + ptrFFTbuff) % image_height; memmove( (void *)(tmp_fft_db + i * IMAGE_WIDTH), (void *)(fft_db + j * IMAGE_WIDTH), IMAGE_WIDTH * sizeof(short int)); } redraw(); if (srate == 8000) dispcnt = wfspeed; else if (srate == 11025) dispcnt = wfspeed * 4 / 3; //kl4yfd else dispcnt = wfspeed * 8 / 3; } } void WFdisp::process_analog (wf_fft_type *sig, int len) { int h1, h2, h3; int sigy, sigpixel, ynext, graylevel; h1 = h()/8 - 1; h2 = h()/2 - 1; h3 = h()*7/8 + 1; graylevel = 220; // clear the signal display area sigy = 0; sigpixel = IMAGE_WIDTH*h2; //FL_LOCK(); FL_LOCK_D(); memset (sig_img, 0, sig_image_area); memset (&sig_img[h1*IMAGE_WIDTH], 160, IMAGE_WIDTH); memset (&sig_img[h2*IMAGE_WIDTH], 255, IMAGE_WIDTH); memset (&sig_img[h3*IMAGE_WIDTH], 160, IMAGE_WIDTH); int cbc = ptrCB; for (int c = 0; c < IMAGE_WIDTH; c++) { ynext = (int)(h2 * sig[cbc]); if (ynext < -h2) ynext = -h2; if (ynext > h2) ynext = h2; cbc = (cbc + 1) % (FFT_LEN); for (; sigy < ynext; sigy++) sig_img[sigpixel -= IMAGE_WIDTH] = graylevel; for (; sigy > ynext; sigy--) sig_img[sigpixel += IMAGE_WIDTH] = graylevel; sig_img[sigpixel++] = graylevel; } redraw(); //FL_UNLOCK(); FL_UNLOCK_D(); } void WFdisp::redrawCursor() { redraw(); // cursormoved = true; } void WFdisp::sig_data( double *sig, int len, int sr ) { if (wfspeed == PAUSE) goto update_freq; // if sound card sampling rate changed reset the waterfall buffer if (srate != sr) { srate = sr; memset(circbuff, 0, FFT_LEN * sizeof(*circbuff)); ptrCB = 0; } memmove((void*)circbuff, (void*)(circbuff + len), (size_t)((FFT_LEN - len)*sizeof(wf_fft_type))); memcpy((void*)&circbuff[FFT_LEN-len], (void*)sig, (size_t)(len)*sizeof(double)); { overload = false; double overval, peak = 0.0; for (int i = 0; i < len; i++) { overval = fabs(sig[i]); if (overval > peak) peak = overval; } peakaudio = 0.1 * peak + 0.9 * peakaudio; } if (mode == SCOPE) process_analog(circbuff, FFT_LEN); else processFFT(); put_WARNstatus(peakaudio); update_freq: static char szFrequency[14]; if (active_modem && rfc != 0) { // use a boolean for the waterfall int cwoffset = 0; int rttyoffset = 0; trx_mode mode = active_modem->get_mode(); if (mode == MODE_RTTY && progdefaults.useMARKfreq) { rttyoffset = (progdefaults.rtty_shift >= 0 ? rtty::SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift); rttyoffset /= 2; if (active_modem->get_reverse()) rttyoffset *= -1; } string testmode = qso_opMODE->value(); if (testmode == "CW" or testmode == "CWR") { cwoffset = progdefaults.CWsweetspot; usb = ! (progdefaults.CWIsLSB ^ (testmode == "CWR")); } if (usb) dfreq = rfc + active_modem->get_txfreq() - cwoffset + rttyoffset; else dfreq = rfc - active_modem->get_txfreq() + cwoffset - rttyoffset; snprintf(szFrequency, sizeof(szFrequency), "%-.3f", dfreq / 1000.0); } else { dfreq = active_modem->get_txfreq(); snprintf(szFrequency, sizeof(szFrequency), "%-.0f", dfreq); } inpFreq->value(szFrequency); } // Check the display offset & limit to 0 to max IMAGE_WIDTH displayed void WFdisp::checkoffset() { if (mode == SCOPE) { if (sigoffset < 0) sigoffset = 0; if (sigoffset > (IMAGE_WIDTH - disp_width)) sigoffset = IMAGE_WIDTH - disp_width; } else { if (offset > (int)(progdefaults.HighFreqCutoff - step * disp_width)) offset = (int)(progdefaults.HighFreqCutoff - step * disp_width); if (offset < 0) offset = 0; } } void WFdisp::setOffset(int v) { offset = v; checkoffset(); } void WFdisp::slew(int dir) { if (mode == SCOPE) sigoffset += dir; else offset += dir; checkoffset(); } void WFdisp::movetocenter() { if (mode == SCOPE) sigoffset = IMAGE_WIDTH / 2; else offset = carrierfreq - (disp_width * step / 2); checkoffset(); } void WFdisp::carrier(int cf) { if (cf >= bandwidth / 2 && cf < (IMAGE_WIDTH - bandwidth / 2)) { carrierfreq = cf; makeMarker(); redrawCursor(); } } int WFdisp::carrier() { return carrierfreq; } void WFdisp::checkWidth() { disp_width = w(); if (mag == MAG_1) step = 4; if (mag == MAG_1 && disp_width > progdefaults.HighFreqCutoff/4) disp_width = progdefaults.HighFreqCutoff/4; if (mag == MAG_2) step = 2; if (mag == MAG_2 && disp_width > progdefaults.HighFreqCutoff/2) disp_width = progdefaults.HighFreqCutoff/2; if (mag == MAG_4) step = 1; } int WFdisp::checkMag() { checkWidth(); makeScale(); return mag; } int WFdisp::setMag(int m) { int mid = offset + (disp_width * step / 2); mag = m; checkMag(); if (centercarrier || Fl::event_shift()) { offset = mid - (disp_width * step / 2); } else { movetocenter(); } return mag; } int WFdisp::wfmag() { int mid = offset + (disp_width * step / 2); if (mag == MAG_1) mag = MAG_2; else if (mag == MAG_2) mag = MAG_4; else mag = MAG_1; checkMag(); if (centercarrier || Fl::event_shift()) { offset = mid - (disp_width * step / 2); } else { movetocenter(); } return mag; } void WFdisp::drawScale() { int fw = 60, xoff; static char szFreq[20]; double fr; uchar *pixmap; if (progdefaults.wf_audioscale) pixmap = (scaleimage + (int)offset); else if (usb || !rfc) pixmap = (scaleimage + (int)((rfc % 1000 + offset)) ); else pixmap = (scaleimage + (int)((1000 - rfc % 1000 + offset))); fl_draw_image_mono( pixmap, x(), y() + WFTEXT, w(), WFSCALE, step, scale_width); fl_color(fl_rgb_color(228)); fl_font(progdefaults.WaterfallFontnbr, progdefaults.WaterfallFontsize); for (int i = 1; ; i++) { if (progdefaults.wf_audioscale) fr = 500.0 * i; else { int cwoffset = 0; string testmode = qso_opMODE->value(); if (testmode == "CW" or testmode == "CWR") { cwoffset = ( progdefaults.CWOffset ? progdefaults.CWsweetspot : 0 ); usb = ! (progdefaults.CWIsLSB ^ (testmode == "CWR")); } if (usb) fr = (rfc - (rfc%500))/1000.0 + 0.5*i - cwoffset/1000.0; else fr = (rfc - (rfc %500))/1000.0 + 0.5 - 0.5*i + cwoffset/1000.0; } if (progdefaults.wf_audioscale) snprintf(szFreq, sizeof(szFreq), "%7.0f", fr); else snprintf(szFreq, sizeof(szFreq), "%7.1f", fr); fw = (int)fl_width(szFreq); if (progdefaults.wf_audioscale) xoff = (int) (( (1000.0/step) * i - fw) / 2.0 - offset /step ); else if (usb) xoff = (int) ( ( (1000.0/step) * i - fw) / 2.0 - (offset + rfc % 500) /step ); else xoff = (int) ( ( (1000.0/step) * i - fw) / 2.0 - (offset + 500 - rfc % 500) /step ); if (xoff > 0 && xoff < w() - fw) fl_draw(szFreq, x() + xoff, y() + 10 ); if (xoff > w() - fw) break; } } void WFdisp::drawMarker() { if (mode == SCOPE) return; uchar *pixmap = (uchar *)(markerimage + (int)(offset)); fl_draw_image( pixmap, x(), y() + WFSCALE + WFTEXT, w(), WFMARKER, step * RGBsize, RGBwidth); } void WFdisp::update_waterfall() { // transfer the fft history data into the WF image short int * __restrict__ p1, * __restrict__ p2; RGBI * __restrict__ p3, * __restrict__ p4; p1 = tmp_fft_db + offset + step/2; p2 = p1; p3 = fft_img; p4 = p3; short* __restrict__ limit = tmp_fft_db + image_area - step + 1; #define UPD_LOOP( Step, Operation ) \ case Step: for (int row = 0; row < image_height; row++) { \ p2 = p1; \ p4 = p3; \ for ( const short * __restrict__ last_p2 = std::min( p2 + Step * disp_width, limit +1 ); p2 < last_p2; p2 += Step ) { \ *(p4++) = mag2RGBI[ Operation ]; \ } \ p1 += IMAGE_WIDTH; \ p3 += disp_width; \ }; break if (progdefaults.WFaveraging) { switch(step) { UPD_LOOP( 4, (*p2 + *(p2+1) + *(p2+2) + *(p2-1) + *(p2-1))/5 ); UPD_LOOP( 2, (*p2 + *(p2+1) + *(p2-1))/3 ); UPD_LOOP( 1, *p2 ); default:; } } else { switch(step) { UPD_LOOP( 4, MAX( MAX( MAX ( MAX ( *p2, *(p2+1) ), *(p2+2) ), *(p2-2) ), *(p2-1) ) ); UPD_LOOP( 2, MAX( MAX( *p2, *(p2+1) ), *(p2-1) ) ); UPD_LOOP( 1, *p2 ); default:; } } #undef UPD_LOOP if (active_modem && progdefaults.UseBWTracks) { int bw_lo = bandwidth / 2; int bw_hi = bandwidth / 2; trx_mode mode = active_modem->get_mode(); if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; RGBI *pos1 = fft_img + (carrierfreq - offset - bw_lo) / step; RGBI *pos2 = fft_img + (carrierfreq - offset + bw_hi) / step; if (unlikely(pos2 == fft_img + disp_width)) pos2--; if (likely(pos1 >= fft_img && pos2 < fft_img + disp_width)) { RGBI rgbi1, rgbi2 ; if (mode == MODE_RTTY && progdefaults.useMARKfreq) { if (active_modem->get_reverse()) { rgbi1 = progdefaults.rttymarkRGBI; rgbi2 = progdefaults.bwTrackRGBI; } else { rgbi1 = progdefaults.bwTrackRGBI; rgbi2 = progdefaults.rttymarkRGBI; } } else { rgbi1 = progdefaults.bwTrackRGBI; rgbi2 = progdefaults.bwTrackRGBI; } if (progdefaults.UseWideTracks) { for (int y = 0; y < image_height; y ++) { *(pos1 + 1) = *pos1 = rgbi1; *(pos2 - 1) = *pos2 = rgbi2; pos1 += disp_width; pos2 += disp_width; } } else { for (int y = 0; y < image_height; y ++) { *pos1 = rgbi1; *pos2 = rgbi2; pos1 += disp_width; pos2 += disp_width; } } } } // draw notch if ((notch_frequency > 1) && (notch_frequency < progdefaults.HighFreqCutoff - 1)) { RGBInotch.I = progdefaults.notchRGBI.I; RGBInotch.R = progdefaults.notchRGBI.R; RGBInotch.G = progdefaults.notchRGBI.G; RGBInotch.B = progdefaults.notchRGBI.B; RGBI *notch = fft_img + (notch_frequency - offset) / step; int dash = 0; for (int y = 0; y < image_height; y++) { dash = (dash + 1) % 6; if (dash == 0 || dash == 1 || dash == 2) *(notch-1) = *notch = *(notch+1) = RGBInotch; notch += disp_width; } } } void WFdisp::drawcolorWF() { uchar *pixmap = (uchar *)fft_img; update_waterfall(); if (active_modem && wantcursor && (progdefaults.UseCursorLines || progdefaults.UseCursorCenterLine) ) { trx_mode mode = active_modem->get_mode(); int bw_lo = bandwidth / 2; int bw_hi = bandwidth / 2; if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; RGBI *pos0 = (fft_img + cursorpos); RGBI *pos1 = (fft_img + cursorpos - bw_lo/step); RGBI *pos2 = (fft_img + cursorpos + bw_hi/step); if (pos1 >= fft_img && pos2 < fft_img + disp_width) for (int y = 0; y < image_height; y ++) { if (progdefaults.UseCursorLines) { *pos1 = *pos2 = progdefaults.cursorLineRGBI; if (progdefaults.UseWideCursor) *(pos1 + 1) = *(pos2 - 1) = *pos1; } if (progdefaults.UseCursorCenterLine) { *pos0 = progdefaults.cursorCenterRGBI; if (progdefaults.UseWideCenter) *(pos0 - 1) = *(pos0 + 1) = *pos0; } pos0 += disp_width; pos1 += disp_width; pos2 += disp_width; } } fl_color(FL_BLACK); fl_rectf(x(), y(), w(), WFSCALE + WFMARKER + WFTEXT); fl_color(fl_rgb_color(palette[0].R, palette[0].G, palette[0].B)); fl_rectf(x(), y() + WFSCALE + WFMARKER + WFTEXT, w(), image_height); fl_draw_image( pixmap, x(), y() + WFSCALE + WFMARKER + WFTEXT, disp_width, image_height, sizeof(RGBI), disp_width * sizeof(RGBI) ); drawScale(); } void WFdisp::drawspectrum() { int sig; int ynext, h1 = image_height - 1, ffty = 0, fftpixel = IMAGE_WIDTH * h1, graylevel = 220; uchar *pixmap = (uchar *)fft_sig_img + offset / step; memset (fft_sig_img, 0, image_area); fftpixel /= step; for (int c = 0; c < IMAGE_WIDTH; c += step) { sig = tmp_fft_db[c]; if (step == 1) sig = tmp_fft_db[c]; else if (step == 2) sig = MAX(tmp_fft_db[c], tmp_fft_db[c+1]); else sig = MAX( MAX ( MAX ( tmp_fft_db[c], tmp_fft_db[c+1] ), tmp_fft_db[c+2] ), tmp_fft_db[c+3]); ynext = h1 * sig / 256; while (ffty < ynext) { fft_sig_img[fftpixel -= IMAGE_WIDTH/step] = graylevel; ffty++;} while (ffty > ynext) { fft_sig_img[fftpixel += IMAGE_WIDTH/step] = graylevel; ffty--;} fft_sig_img[fftpixel++] = graylevel; } if (progdefaults.UseBWTracks) { uchar *pos1 = pixmap + (carrierfreq - offset - bandwidth/2) / step; uchar *pos2 = pixmap + (carrierfreq - offset + bandwidth/2) / step; if (pos1 >= pixmap && pos2 < pixmap + disp_width) for (int y = 0; y < image_height; y ++) { *pos1 = *pos2 = 255; if (progdefaults.UseWideTracks) { *(pos1 + 1) = 255; *(pos2 - 1) = 255; } pos1 += IMAGE_WIDTH/step; pos2 += IMAGE_WIDTH/step; } } if (active_modem && wantcursor && (progdefaults.UseCursorLines || progdefaults.UseCursorCenterLine)) { trx_mode mode = active_modem->get_mode(); int bw_lo = bandwidth / 2; int bw_hi = bandwidth / 2; if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; uchar *pos0 = pixmap + cursorpos; uchar *pos1 = (pixmap + cursorpos - bw_lo/step); uchar *pos2 = (pixmap + cursorpos + bw_hi/step); for (int y = 0; y < h1; y ++) { if (progdefaults.UseCursorLines) { *pos1 = *pos2 = 255; if (progdefaults.UseWideCursor) *(pos1 + 1) = *(pos2 - 1) = *pos1; } if (progdefaults.UseCursorCenterLine) { *pos0 = 255; if (progdefaults.UseWideCenter) *(pos0-1) = *(pos0+1) = *(pos0); } pos0 += IMAGE_WIDTH/step; pos1 += IMAGE_WIDTH/step; pos2 += IMAGE_WIDTH/step; } } // draw notch if ((notch_frequency > 1) && (notch_frequency < progdefaults.HighFreqCutoff - 1)) { uchar *notch = pixmap + (notch_frequency - offset) / step; int dash = 0; for (int y = 0; y < image_height; y++) { dash = (dash + 1) % 6; if (dash == 0 || dash == 1 || dash == 2) *(notch-1) = *notch = *(notch+1) = 255; notch += IMAGE_WIDTH/step; } } fl_color(FL_BLACK); fl_rectf(x(), y(), w(), WFSCALE + WFMARKER + WFTEXT + image_height); fl_draw_image_mono( pixmap, x(), y() + WFSCALE + WFMARKER + WFTEXT, disp_width, image_height, 1, IMAGE_WIDTH / step); drawScale(); } void WFdisp::drawsignal() { uchar *pixmap = (uchar *)(sig_img + sigoffset); fl_color(FL_BLACK); fl_rectf(x() + disp_width, y(), w() - disp_width, h()); fl_draw_image_mono(pixmap, x(), y(), disp_width, h(), 1, IMAGE_WIDTH); } void WFdisp::draw() { checkoffset(); checkWidth(); switch (mode) { case SPECTRUM : drawspectrum(); drawMarker(); break; case SCOPE : drawsignal(); break; case WATERFALL : default: drawcolorWF(); drawMarker(); } } //======================================================================= // waterfall //======================================================================= void x1_cb(Fl_Widget *w, void* v) { waterfall *wf = (waterfall *)w->parent(); int m = wf->wfdisp->wfmag(); if (m == MAG_1) w->label("x1"); if (m == MAG_2) w->label("x2"); if (m == MAG_4) w->label("x4"); restoreFocus(); } void slew_left(Fl_Widget *w, void * v) { waterfall *wf = (waterfall *)w->parent(); wf->wfdisp->slew(-100); restoreFocus(); } void slew_right(Fl_Widget *w, void * v) { waterfall *wf = (waterfall *)w->parent(); wf->wfdisp->slew(100); restoreFocus(); } void center_cb(Fl_Widget *w, void *v) { waterfall *wf = (waterfall *)w->parent(); wf->wfdisp->movetocenter(); restoreFocus(); } void carrier_cb(Fl_Widget *w, void *v) { Fl_Counter *cntr = (Fl_Counter *)w; waterfall *wf = (waterfall *)w->parent(); int selfreq = (int) cntr->value(); if (selfreq > progdefaults.HighFreqCutoff) selfreq = progdefaults.HighFreqCutoff - wf->wfdisp->Bandwidth() / 2; stopMacroTimer(); if (active_modem) active_modem->set_freq(selfreq); wf->wfdisp->carrier(selfreq); restoreFocus(); } void do_qsy(bool dir) { if (!active_modem) return; static vector qsy_stack; qrg_mode_t m; wf->xmtlock->value(0); wf->xmtlock->do_callback(); if (dir) { // store m.rfcarrier = wf->rfcarrier(); m.carrier = active_modem->get_freq(); qsy_stack.push_back(m); // qsy to the sweet spot frequency that is the center of the PBF in the rig switch (active_modem->get_mode()) { case MODE_CW: m.carrier = (long long)progdefaults.CWsweetspot; break; case MODE_RTTY: m.carrier = (long long)progdefaults.RTTYsweetspot; break; default: m.carrier = (long long)progdefaults.PSKsweetspot; break; } if (wf->USB()) m.rfcarrier += (wf->carrier() - m.carrier); else m.rfcarrier -= (wf->carrier() - m.carrier); } else { // qsy to top of stack if (qsy_stack.size()) { m = qsy_stack.back(); qsy_stack.pop_back(); } } if (m.carrier > 0) qsy(m.rfcarrier, m.carrier); } void qsy_cb(Fl_Widget *w, void *v) { if (Fl::event_button() != FL_RIGHT_MOUSE) do_qsy(true); else do_qsy(false); restoreFocus(); } void rate_cb(Fl_Widget *w, void *v) { waterfall* wf = static_cast(w->parent()); WFspeed new_speed; switch (wf->wfdisp->Speed()) { case SLOW: new_speed = NORMAL; break; case NORMAL: default: new_speed = FAST; break; case FAST: new_speed = PAUSE; break; case PAUSE: new_speed = SLOW; break; } wf->Speed(new_speed); restoreFocus(); } void xmtrcv_cb(Fl_Widget *w, void *vi) { if (!active_modem) return; FL_LOCK_D(); Fl_Light_Button *b = (Fl_Light_Button *)w; int v = b->value(); FL_UNLOCK_D(); if (!(active_modem->get_cap() & modem::CAP_TX)) { b->value(0); restoreFocus(); return; } if (v == 1) { stopMacroTimer(); active_modem->set_stopflag(false); trx_transmit(); } else { if (btnTune->value()) { btnTune->value(0); btnTune->do_callback(); } else { TransmitText->clear(); if (arq_text_available) AbortARQ(); if (progStatus.timer) progStatus.timer = 0; queue_reset(); active_modem->set_stopflag(true); } } restoreFocus(); } void xmtlock_cb(Fl_Widget *w, void *vi) { if (!active_modem) return; FL_LOCK_D(); Fl_Light_Button *b = (Fl_Light_Button *)w; int v = b->value(); FL_UNLOCK_D(); active_modem->set_freqlock(v ? true : false ); restoreFocus(); } void waterfall::set_XmtRcvBtn(bool val) { FL_LOCK_D(); xmtrcv->value(val); if (!val && btnTune->value()) { btnTune->value(0); btnTune->labelcolor(FL_FOREGROUND_COLOR); } FL_UNLOCK_D(); } void mode_cb(Fl_Widget* w, void*) { static const char* names[NUM_WF_MODES] = { "WF", "FFT", "SIG" }; int m = wf->wfdisp->Mode() + (Fl::event_button() == FL_LEFT_MOUSE ? 1 : -1); m = WCLAMP(m, WATERFALL, NUM_WF_MODES-1); Fl_Widget* b[] = { wf->x1, wf->wfcarrier, wf->wfRefLevel, wf->wfAmpSpan }; for (size_t i = 0; i < sizeof(b)/sizeof(*b); i++) { if (m == SCOPE) b[i]->deactivate(); else b[i]->activate(); } wf->wfdisp->Mode(static_cast(m)); w->label(names[m]); restoreFocus(); } void reflevel_cb(Fl_Widget *w, void *v) { FL_LOCK_D(); waterfall *wf = (waterfall *)w->parent(); double val = wf->wfRefLevel->value(); FL_UNLOCK_D(); wf->wfdisp->Reflevel(val); progdefaults.wfRefLevel = val; restoreFocus(); } void ampspan_cb(Fl_Widget *w, void *v) { FL_LOCK_D(); waterfall *wf = (waterfall *)w->parent(); double val = wf->wfAmpSpan->value(); FL_UNLOCK_D(); wf->wfdisp->Ampspan(val); progdefaults.wfAmpSpan = val; restoreFocus(); } void btnRev_cb(Fl_Widget *w, void *v) { if (!active_modem) return; FL_LOCK_D(); waterfall *wf = (waterfall *)w->parent(); Fl_Light_Button *b = (Fl_Light_Button *)w; wf->Reverse(b->value()); FL_UNLOCK_D(); active_modem->set_reverse(wf->Reverse()); progdefaults.rtty_reverse = b->value(); progdefaults.changed = true; restoreFocus(); } void btnMem_cb(Fl_Widget *, void *menu_event) { if (!active_modem) return; static std::vector qrg_list; enum { SELECT, APPEND, REPLACE, REMOVE, CLEAR }; int op = SELECT, elem = 0; if (menu_event) { // event on popup menu elem = wf->mbtnMem->value(); switch (Fl::event_button()) { case FL_MIDDLE_MOUSE: op = REPLACE; break; case FL_LEFT_MOUSE: case FL_RIGHT_MOUSE: default: op = (Fl::event_state() & FL_SHIFT) ? REMOVE : SELECT; break; } } else { // button press switch (Fl::event_button()) { case FL_RIGHT_MOUSE: return; case FL_MIDDLE_MOUSE: // select last if ((elem = qrg_list.size() - 1) < 0) return; op = SELECT; break; case FL_LEFT_MOUSE: default: op = (Fl::event_state() & FL_SHIFT) ? CLEAR : APPEND; break; } } qrg_mode_t m; switch (op) { case SELECT: m = qrg_list[elem]; if (active_modem != *mode_info[m.mode].modem) init_modem_sync(m.mode); if (m.rfcarrier && m.rfcarrier != wf->rfcarrier()) qsy(m.rfcarrier, m.carrier); else active_modem->set_freq(m.carrier); break; case REMOVE: wf->mbtnMem->remove(elem); qrg_list.erase(qrg_list.begin() + elem); break; case CLEAR: wf->mbtnMem->clear(); qrg_list.clear(); break; case APPEND: case REPLACE: m.rfcarrier = wf->rfcarrier(); m.carrier = active_modem->get_freq(); m.mode = active_modem->get_mode(); if (op == APPEND) { if (find(qrg_list.begin(), qrg_list.end(), m) == qrg_list.end()) qrg_list.push_back(m); else break; } else qrg_list[elem] = m; // write the menu item text { ostringstream o; o << mode_info[m.mode].sname << " @@ "; if (m.rfcarrier > 0) { // write 1000s separators char s[20], *p = s + sizeof(s) - 1; int i = 0; *p = '\0'; do { if (i % 3 == 0 && i) *--p = '.'; *--p = '0' + m.rfcarrier % 10; ++i; } while ((m.rfcarrier /= 10) && p > s); o << p << (wf->USB() ? " + " : " - "); } o << m.carrier; if (op == APPEND) wf->mbtnMem->add(o.str().c_str()); else wf->mbtnMem->replace(elem, o.str().c_str()); } break; } restoreFocus(); } void waterfall::opmode() { if (!active_modem) return; int val = (int)active_modem->get_bandwidth(); wfdisp->carrier((int)CLAMP( wfdisp->carrier(), progdefaults.LowFreqCutoff + val / 2, progdefaults.HighFreqCutoff - val / 2)); wfdisp->Bandwidth( val ); FL_LOCK_D(); wfcarrier->range(progdefaults.LowFreqCutoff + val/2, progdefaults.HighFreqCutoff - val/2); FL_UNLOCK_D(); } void waterfall::carrier(int f) { wfdisp->carrier(f); FL_LOCK_D(); wfcarrier->value(f); wfcarrier->damage(FL_DAMAGE_ALL); FL_UNLOCK_D(); } int waterfall::Speed() { return (int)wfdisp->Speed(); } void waterfall::Speed(int rate) { WFspeed speed = static_cast(rate); wfdisp->Speed(speed); const char* label; switch (speed) { case SLOW: label = "SLOW"; break; case NORMAL: default: label = "NORM"; break; case FAST: label = "FAST"; break; case PAUSE: label = "PAUSE"; break; } wfrate->label(label); wfrate->redraw_label(); } int waterfall::Mag() { return wfdisp->Mag(); } void waterfall::Mag(int m) { FL_LOCK_D(); wfdisp->Mag(m); if (m == MAG_1) x1->label("x1"); if (m == MAG_2) x1->label("x2"); if (m == MAG_4) x1->label("x4"); x1->redraw_label(); FL_UNLOCK_D(); } int waterfall::Offset() { return wfdisp->Offset(); } void waterfall::Offset(int v) { FL_LOCK_D(); wfdisp->Offset(v); FL_UNLOCK_D(); } int waterfall::Carrier() { return wfdisp->carrier(); } void waterfall::Carrier(int f) { if (active_modem) active_modem->set_freq(f); } void waterfall::rfcarrier(long long cf) { wfdisp->rfcarrier(cf); } long long waterfall::rfcarrier() { return wfdisp->rfcarrier(); } void waterfall::setRefLevel() { FL_LOCK_D(); wfRefLevel->value(progdefaults.wfRefLevel); wfdisp->Reflevel(progdefaults.wfRefLevel); FL_UNLOCK_D(); } void waterfall::setAmpSpan() { FL_LOCK_D(); wfAmpSpan->value(progdefaults.wfAmpSpan); wfdisp->Ampspan(progdefaults.wfAmpSpan); FL_UNLOCK_D(); } void waterfall::USB(bool b) { if (wfdisp->USB() == b) return; wfdisp->USB(b); if (active_modem) active_modem->set_reverse(reverse); REQ(&viewer_redraw); } bool waterfall::USB() { return wfdisp->USB(); } void waterfall::show_scope(bool on) { if (on) { wfscope->show(); wfscope->position(wf->x() + wf->w() - wf_dim - BEZEL, wf->y()); wfdisp->size( wf->w() - 2 * BEZEL - wf_dim, wf_dim - 2 * BEZEL); rs1->init_sizes(); } else { wfscope->hide(); wfscope->position(wf->x() + wf->w(), wf->y()); wfdisp->size( wf->w() - 2 * BEZEL, wf_dim - 2 * BEZEL); rs1->init_sizes(); } } waterfall::waterfall(int x0, int y0, int w0, int h0, char *lbl) : Fl_Group(x0,y0,w0,h0,lbl) { int xpos; float ratio;// = w0 < 600 ? w0 / 600.0 : 1.0; ratio = w0 * 1.0 / bwdths; wf_dim = h() - BTN_HEIGHT - 4; buttonrow = h() + y() - BTN_HEIGHT - 1; rs1 = new Fl_Group(x(), y(), w(), wf_dim); rs1->box(FL_DOWN_BOX); wfdisp = new WFdisp( x() + BEZEL, y() + BEZEL, w() - 2 * BEZEL, wf_dim - 2 * BEZEL); wfscope = new Digiscope (x() + w(), y(), wf_dim, wf_dim); rs1->resizable(wfdisp); rs1->end(); wfscope->hide(); xpos = x() + wSpace; mode = new Fl_Button(xpos, buttonrow, (int)(bwFFT*ratio), BTN_HEIGHT, "WF"); mode->callback(mode_cb, 0); mode->tooltip(_("Waterfall / FFT / Scope")); xpos = xpos + (int)(bwFFT*ratio) + wSpace; wfRefLevel = new Fl_Counter2(xpos, buttonrow, (int)(cwRef*ratio), BTN_HEIGHT ); wfRefLevel->callback(reflevel_cb, 0); wfRefLevel->step(1.0); wfRefLevel->precision(0); wfRefLevel->range(-40.0, 0.0); wfRefLevel->value(-20.0); wfdisp->Reflevel(-20.0); wfRefLevel->tooltip(_("Upper signal level (dB)")); wfRefLevel->type(FL_SIMPLE_COUNTER); xpos = xpos + (int)(cwRef*ratio) + wSpace; wfAmpSpan = new Fl_Counter2(xpos, buttonrow, (int)(cwRef*ratio), BTN_HEIGHT ); wfAmpSpan->callback(ampspan_cb, 0); wfAmpSpan->step(1.0); wfAmpSpan->precision(0); wfAmpSpan->range(6.0, 90.0); wfAmpSpan->value(70.0); wfdisp->Ampspan(70.0); wfAmpSpan->tooltip(_("Signal range (dB)")); wfAmpSpan->type(FL_SIMPLE_COUNTER); xpos = xpos + (int)(cwRef*ratio) + wSpace; x1 = new Fl_Button(xpos, buttonrow, (int)(bwX1*ratio), BTN_HEIGHT, "x1"); x1->callback(x1_cb, 0); x1->tooltip(_("Change waterfall scale")); xpos = xpos + (int)(bwX1*ratio) + wSpace; left = new Fl_Repeat_Button(xpos, buttonrow, (int)(bwMov*ratio), BTN_HEIGHT, "@<"); left->callback(slew_left, 0); left->tooltip(_("Slew display lower in frequency")); xpos = xpos + (int)(bwMov*ratio); center = new Fl_Button(xpos, buttonrow, (int)(bwMov*ratio), BTN_HEIGHT, "@||"); center->callback(center_cb, 0); center->tooltip(_("Center display on signal")); xpos = xpos + (int)(bwMov*ratio); right = new Fl_Repeat_Button(xpos, buttonrow, (int)(bwMov*ratio), BTN_HEIGHT, "@>"); right->callback(slew_right, 0); right->tooltip(_("Slew display higher in frequency")); xpos = xpos + (int)(bwMov*ratio) + wSpace; wfrate = new Fl_Button(xpos, buttonrow, (int)(bwRate*ratio), BTN_HEIGHT, "Norm"); wfrate->callback(rate_cb, 0); wfrate->tooltip(_("Waterfall drop speed")); xpos = xpos + (int)(bwRate*ratio) + wSpace; wfcarrier = new Fl_Counter2(xpos, buttonrow, (int)(cwCnt*ratio), BTN_HEIGHT ); wfcarrier->callback(carrier_cb, 0); wfcarrier->step(1.0); wfcarrier->lstep(10.0); wfcarrier->precision(0); wfcarrier->range(16.0, progdefaults.HighFreqCutoff - 16.0); wfcarrier->value(wfdisp->carrier()); wfcarrier->tooltip(_("Adjust cursor frequency")); xpos = xpos + (int)(cwCnt*ratio) + wSpace; qsy = new Fl_Button(xpos, buttonrow, (int)(bwQsy*ratio), BTN_HEIGHT, "QSY"); qsy->callback(qsy_cb, 0); qsy->tooltip(_("Center in passband\nRight click to undo")); qsy->deactivate(); xpos = xpos + (int)(bwQsy*ratio) + wSpace; btnMem = new Fl_Button(xpos, buttonrow, (int)(bwMem*ratio), BTN_HEIGHT, "Store"); btnMem->callback(btnMem_cb, 0); btnMem->tooltip(_("Store mode and frequency\nRight click for list")); mbtnMem = new Fl_Menu_Button(btnMem->x(), btnMem->y(), btnMem->w(), btnMem->h(), 0); mbtnMem->callback(btnMem->callback(), mbtnMem); mbtnMem->type(Fl_Menu_Button::POPUP3); xpos = xpos + (int)(bwMem*ratio) + wSpace; xmtlock = new Fl_Light_Button(xpos, buttonrow, (int)(bwXmtLock*ratio), BTN_HEIGHT, "Lk"); xmtlock->callback(xmtlock_cb, 0); xmtlock->value(0); xmtlock->selection_color(progdefaults.LkColor); xmtlock->tooltip(_("Lock transmit frequency")); /// We save this flag which is used by rtty decoding. xpos = xpos + (int)(bwXmtLock*ratio) + wSpace; btnRev = new Fl_Light_Button(xpos, buttonrow, (int)(bwRev*ratio), BTN_HEIGHT, "Rv"); btnRev->callback(btnRev_cb, 0); reverse = progdefaults.rtty_reverse; btnRev->value(reverse); btnRev->selection_color(progdefaults.RevColor); btnRev->tooltip(_("Reverse")); xpos = w() - (int)(bwXmtRcv*ratio) - wSpace; xmtrcv = new Fl_Light_Button(xpos, buttonrow, (int)(bwXmtRcv*ratio) - BEZEL, BTN_HEIGHT, "T/R"); xmtrcv->callback(xmtrcv_cb, 0); xmtrcv->selection_color(progdefaults.XmtColor); xmtrcv->value(0); xmtrcv->tooltip(_("Transmit/Receive")); end(); } void waterfall::UI_select(bool on) { if (on) { if (!progdefaults.WF_UIrev) btnRev->hide(); else btnRev->show(); if (!progdefaults.WF_UIwfcarrier) wfcarrier->hide(); else wfcarrier->show(); if (!progdefaults.WF_UIwfreflevel) wfRefLevel->hide(); else wfRefLevel->show(); if (!progdefaults.WF_UIwfampspan) wfAmpSpan->hide(); else wfAmpSpan->show(); if (!progdefaults.WF_UIxmtlock) xmtlock->hide(); else xmtlock->show(); if (!progdefaults.WF_UIqsy) qsy->hide(); else qsy->show(); if (!progdefaults.WF_UIwfmode) mode->hide(); else mode->show(); if (!progdefaults.WF_UIx1) x1->hide(); else x1->show(); if (!progdefaults.WF_UIwfshift) { left->hide(); center->hide(); right->hide(); } else { left->show(); center->show(); right->show(); } if (!progdefaults.WF_UIwfdrop) wfrate->hide(); else wfrate->show(); if (!progdefaults.WF_UIwfstore) { btnMem->hide(); mbtnMem->hide(); } else { btnMem->show(); mbtnMem->show(); } //if (noUI) xmtrcv->hide(); } else { btnRev->show(); wfcarrier->show(); wfRefLevel->show(); wfAmpSpan->show(); xmtlock->show(); qsy->show(); mode->show(); x1->show(); left->show(); center->show(); right->show(); wfrate->show(); btnMem->show(); mbtnMem->show(); } btnRev->redraw(); wfcarrier->redraw(); wfRefLevel->redraw(); wfAmpSpan->redraw(); xmtlock->redraw(); qsy->redraw(); mode->redraw(); x1->redraw(); left->redraw(); center->redraw(); right->redraw(); wfrate->redraw(); btnMem->redraw(); mbtnMem->redraw(); } int waterfall::handle(int event) { if (event != FL_MOUSEWHEEL || Fl::event_inside(wfdisp)) return Fl_Group::handle(event); int d; if ( !((d = Fl::event_dy()) || (d = Fl::event_dx())) ) return 1; // this does not belong here, but we don't have access to this widget's // handle method (or its parent's) if (active_modem && Fl::event_inside(MODEstatus)) { trx_mode mode = active_modem->get_mode(); for (;;) { mode = WCLAMP(mode + d, 0, NUM_MODES - 1); if ((mode >= NUM_RXTX_MODES && mode < NUM_MODES) || progdefaults.visible_modes.test(mode)) break; } init_modem(mode); return 1; } // as above; handle wheel events for the macro bar extern void altmacro_cb(Fl_Widget *w, void *v); if (progdefaults.macro_wheel) { if (progdefaults.mbar2_pos) { if (Fl::event_inside(macroFrame2)) { altmacro_cb(btnAltMacros2, reinterpret_cast(d)); return 1; } } else { if (Fl::event_inside(macroFrame1)) { altmacro_cb(btnAltMacros1, reinterpret_cast(d)); return 1; } } } return Fl_Group::handle(event); } static Fl_Cursor cursor = FL_CURSOR_DEFAULT; static void hide_cursor(void *w) { if (cursor != FL_CURSOR_NONE) reinterpret_cast(w)->window()->cursor(cursor = FL_CURSOR_NONE); } void waterfall::insert_text(bool check) { if (active_modem && check) { qrg_mode_t m; m.rfcarrier = wf->rfcarrier(); m.carrier = active_modem->get_freq(); m.mode = active_modem->get_mode(); extern qrg_mode_t last_marked_qrg; if (last_marked_qrg.mode == m.mode && last_marked_qrg.rfcarrier == m.rfcarrier && abs(last_marked_qrg.carrier - m.carrier) <= 16) return; last_marked_qrg = m; } string::size_type i; if ((i = progdefaults.WaterfallClickText.find("")) != string::npos) { string s = progdefaults.WaterfallClickText; s[i] = '\0'; ReceiveText->addstr(s); note_qrg(false); // ReceiveText->addstr(s); // ReceiveText->addstr(s.c_str() + i + strlen("")); } else ReceiveText->addstr(progdefaults.WaterfallClickText, FTextView::SKIP); } static void find_signal_text(void) { if (!active_modem) return; int freq = active_modem->get_freq(); trx_mode mode = active_modem->get_mode(); extern map qrg_marks; map::const_iterator i; for (i = qrg_marks.begin(); i != qrg_marks.end(); ++i) if (i->second.mode == mode && abs(i->second.carrier - freq) <= 20) break; if (i != qrg_marks.end()) { // Search backward from the current text cursor position, then // try the other direction int pos = ReceiveText->insert_position(); if (ReceiveText->buffer()->search_backward(pos, i->first.c_str(), &pos, 1) || ReceiveText->buffer()->search_forward(pos, i->first.c_str(), &pos, 1)) { ReceiveText->insert_position(pos); ReceiveText->show_insert_position(); } } } int WFdisp::handle(int event) { static int pxpos, push; if (!(event == FL_LEAVE || Fl::event_inside(this))) { if (event == FL_RELEASE) push = 0; return 0; } if (trx_state != STATE_RX) return 1; int xpos = Fl::event_x() - x(); int ypos = Fl::event_y() - y(); int eb; switch (event) { case FL_MOVE: if (progdefaults.WaterfallQSY && ypos < WFTEXT + WFSCALE) { Fl::remove_timeout(hide_cursor, this); if (cursor != FL_CURSOR_WE) window()->cursor(cursor = FL_CURSOR_WE); if (wantcursor) { wantcursor = false; makeMarker(); } break; } if (cursor != FL_CURSOR_DEFAULT) window()->cursor(cursor = FL_CURSOR_DEFAULT); if (!Fl::has_timeout(hide_cursor, this)) Fl::add_timeout(1, hide_cursor, this); wantcursor = true; cursorpos = xpos; makeMarker(); redrawCursor(); break; case FL_DRAG: case FL_PUSH: stopMacroTimer(); switch (eb = Fl::event_button()) { case FL_RIGHT_MOUSE: wantcursor = false; if (event == FL_PUSH) { tmp_carrier = true; oldcarrier = carrier(); if (progdefaults.WaterfallHistoryDefault) bHistory = true; } goto lrclick; case FL_LEFT_MOUSE: if ((Fl::event_state() & (FL_ALT | FL_CTRL)) == (FL_ALT | FL_CTRL)) { if (notch_frequency) notch_off(); else notch_on(cursorFreq(xpos)); return 1; } if (event == FL_PUSH) { push = ypos; pxpos = xpos; if (Fl::event_clicks()) return 1; } if (progdefaults.WaterfallQSY && push < WFTEXT + WFSCALE) { long long newrfc = (pxpos - xpos) * step; if (!USB()) newrfc = -newrfc; newrfc += rfcarrier(); qsy(newrfc, active_modem ? active_modem->get_freq() : 1500); pxpos = xpos; return 1; } lrclick: if (Fl::event_state() & FL_CTRL) { if (event == FL_DRAG) break; if (!progdefaults.WaterfallHistoryDefault) bHistory = true; if (eb == FL_LEFT_MOUSE) { restoreFocus(); break; } } if (progdefaults.WaterfallHistoryDefault) bHistory = true; newcarrier = cursorFreq(xpos); if (active_modem) { newcarrier = (int)CLAMP( newcarrier, progdefaults.LowFreqCutoff + active_modem->get_bandwidth() / 2, progdefaults.HighFreqCutoff - active_modem->get_bandwidth() / 2); active_modem->set_freq(newcarrier); viewer_paste_freq(newcarrier); if (!(Fl::event_state() & FL_SHIFT)) active_modem->set_sigsearch(SIGSEARCH); } redrawCursor(); restoreFocus(); break; case FL_MIDDLE_MOUSE: if (event == FL_DRAG) break; // if (Fl::event_state() & FL_CTRL) // viewer_paste_freq(cursorFreq(xpos)); // else { btnAFC->value(!btnAFC->value()); btnAFC->do_callback(); // } } break; case FL_RELEASE: switch (eb = Fl::event_button()) { case FL_RIGHT_MOUSE: tmp_carrier = false; if (active_modem) active_modem->set_freq(oldcarrier); redrawCursor(); restoreFocus(); // fall through case FL_LEFT_MOUSE: push = 0; oldcarrier = newcarrier; if (eb != FL_LEFT_MOUSE || !ReceiveText->visible()) break; if (!(Fl::event_state() & (FL_CTRL | FL_META | FL_ALT | FL_SHIFT))) { if (Fl::event_clicks() == 1) note_qrg(true, "\n", "\n"); else if (progdefaults.WaterfallClickInsert) wf->insert_text(true); } else if (Fl::event_state() & (FL_META | FL_ALT)) find_signal_text(); break; } break; case FL_MOUSEWHEEL: { stopMacroTimer(); int d; if ( !((d = Fl::event_dy()) || (d = Fl::event_dx())) ) break; int state = Fl::event_state(); if (state & FL_CTRL) wf->handle_mouse_wheel(waterfall::WF_AFC_BW, d); else if (state & (FL_META | FL_ALT)) wf->handle_mouse_wheel(waterfall::WF_SIGNAL_SEARCH, d); else if (state & FL_SHIFT) wf->handle_mouse_wheel(waterfall::WF_SQUELCH, d); else { if (progdefaults.WaterfallQSY && Fl::event_inside(x(), y(), w(), WFTEXT+WFSCALE+WFMARKER)) qsy(wf->rfcarrier() - 500*d); else wf->handle_mouse_wheel(progdefaults.WaterfallWheelAction, d); } return handle(FL_MOVE); } case FL_SHORTCUT: if (Fl::event_inside(this)) take_focus(); break; case FL_KEYBOARD: { stopMacroTimer(); int d = (Fl::event_state() & FL_CTRL) ? 10 : 1; int k = Fl::event_key(); switch (k) { case FL_Left: case FL_Right: if (k == FL_Left) d = -d; if (active_modem) { oldcarrier = newcarrier = (int)CLAMP( carrier() + d, progdefaults.LowFreqCutoff + active_modem->get_bandwidth() / 2, progdefaults.HighFreqCutoff - active_modem->get_bandwidth() / 2); active_modem->set_freq(newcarrier); } redrawCursor(); break; case FL_Tab: restoreFocus(); break; default: restoreFocus(); return TransmitText->handle(event); } break; } case FL_KEYUP: { if (Fl::event_inside(this)) { int k = Fl::event_key(); if (k == FL_Shift_L || k == FL_Shift_R || k == FL_Control_L || k == FL_Control_R || k == FL_Meta_L || k == FL_Meta_R || k == FL_Alt_L || k == FL_Alt_R) restoreFocus(); } break; } case FL_LEAVE: Fl::remove_timeout(hide_cursor, this); if (cursor != FL_CURSOR_DEFAULT) window()->cursor(cursor = FL_CURSOR_DEFAULT); wantcursor = false; makeMarker(); // restoreFocus(); break; } return 1; } void waterfall::handle_mouse_wheel(int what, int d) { if (d == 0) return; Fl_Valuator *val = 0; const char* msg_fmt = 0, *msg_label = 0; switch (what) { case WF_NOP: return; case WF_AFC_BW: { if (active_modem) { trx_mode m = active_modem->get_mode(); if (m >= MODE_PSK_FIRST && m <= MODE_PSK_LAST) { val = mailserver ? cntServerOffset : cntSearchRange; msg_label = "Srch Rng"; } else if (m >= MODE_HELL_FIRST && m <= MODE_HELL_LAST) { val = sldrHellBW; msg_label = "BW"; } else if (m == MODE_CW) { val = sldrCWbandwidth; msg_label = "BW"; } else return; msg_fmt = "%s: %2.0f Hz"; } break; } case WF_SIGNAL_SEARCH: if (d > 0) { if (active_modem) active_modem->searchDown(); } else { if (active_modem) active_modem->searchUp(); } return; case WF_SQUELCH: val = sldrSquelch; d = -d; msg_fmt = "%s = %2.0f %%"; msg_label = "Sqlch"; break; case WF_CARRIER: val = wfcarrier; break; case WF_MODEM: init_modem(d > 0 ? MODE_NEXT : MODE_PREV); return; case WF_SCROLL: (d > 0 ? right : left)->do_callback(); return; } val->value(val->clamp(val->increment(val->value(), -d))); bool changed_save = progdefaults.changed; val->do_callback(); progdefaults.changed = changed_save; if (val == cntServerOffset || val == cntSearchRange) { if (active_modem) active_modem->set_sigsearch(SIGSEARCH); } else if (val == sldrSquelch) { // sldrSquelch gives focus to TransmitText take_focus(); } if (msg_fmt) { char msg[60]; snprintf(msg, sizeof(msg), msg_fmt, msg_label, val->value()); put_status(msg, 2.0); } } const char* waterfall::wf_wheel_action[] = { _("None"), _("AFC range or BW"), _("Signal search"), _("Squelch level"), _("Modem carrier"), _("Modem"), _("Scroll") }; fldigi-3.21.80/src/waterfall/raster.cxx0000664000175000017500000001007012313064025014634 00000000000000// ---------------------------------------------------------------------------- // raster.cxx, Raster scan Widget for display of fuzzy modes // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "raster.h" #include "modem.h" #include #include #include "raster.h" #include "qrunner.h" bool rowschanged = false; Raster::Raster (int X, int Y, int W, int H) : Fl_Widget (X, Y, W, H) { width = W - 4; height = H - 4; space = 2; rowheight = 60; Nrows = (int)(height / (rowheight + space) - 0.5); vidbuf = new unsigned char[width * height]; memset(vidbuf, 255, width * height); col = 0; vidpos = 0; numcols = 0; yp = Nrows * (space + rowheight); box(FL_DOWN_BOX); } Raster::~Raster() { delete [] vidbuf; } void Raster::data(int data[], int len) { if (data == NULL || len == 0) return; int h = len; int pos; int zeropos; FL_LOCK_D(); if (h > height) h = height; col++; if (col >= width) { unsigned char *from = vidbuf + (space + rowheight) * width; int numtocopy = Nrows * (space + rowheight) * width; memmove(vidbuf, from, numtocopy); memset( vidbuf + yp * width, 255, (space + rowheight) * width); col = 0; damage(FL_DAMAGE_USER2); } else if (damage() != FL_DAMAGE_ALL) damage(FL_DAMAGE_USER1); zeropos = Nrows * (space + rowheight) * width; for (int i = 0; i < h; i++) { pos = zeropos + width * (h - i - 1) + col; vidbuf[pos] = (unsigned char)data[i]; } numcols++; vidpos = col - numcols; if (vidpos < 0) vidpos = 0; // redraw(); REQ_DROP(&Raster::redraw, this); FL_UNLOCK_D(); FL_AWAKE_D(); } void Raster::clear() { FL_LOCK_D(); for (int i = 0; i < width * height; i++) vidbuf[i] = 255; col = width; REQ_DROP(&Raster::redraw, this); // redraw(); FL_UNLOCK_D(); FL_AWAKE_D(); } void Raster::resize(int x, int y, int w, int h) { int Wdest = w - 4, Hdest = h - 4; int Ndest = (int)(Hdest / (rowheight + space) - 0.5); unsigned char *tempbuf = new unsigned char [Wdest * Hdest]; unsigned char *oldbuf; int xfrcols, xfrrows; int from, to; memset(tempbuf, 255, Wdest * Hdest); if (Wdest >= width) xfrcols = width; else xfrcols = Wdest; if (Ndest <= Nrows) { xfrrows = (Ndest + 1)*(rowheight + space); from = (Nrows - Ndest) * (rowheight + space); to = 0; for (int r = 0; r < xfrrows; r++) for (int c = 0; c < xfrcols; c++) tempbuf[(to + r) * Wdest + c] = vidbuf[(from + r) * width + c]; } else { xfrrows = (Nrows + 1)*(rowheight + space); from = 0; to = (Ndest - Nrows) * (rowheight + space); for (int r = 0; r < xfrrows; r++) for (int c = 0; c < xfrcols; c++) tempbuf[(to + r) * Wdest + c] = vidbuf[(from + r) * width + c]; } oldbuf = vidbuf; vidbuf = tempbuf; width = Wdest; height = Hdest; Nrows = Ndest; yp = Ndest * (space + rowheight); delete [] oldbuf; Fl_Widget::resize(x,y,w,h); redraw(); } void Raster::draw() { if ((damage() & FL_DAMAGE_USER2)) { draw_box(); fl_draw_image_mono( vidbuf, x() + 2, y() + 2, width, height, 1, width ); } else if ((damage() & FL_DAMAGE_USER1)) { fl_draw_image_mono( vidbuf + vidpos + Nrows * (space + rowheight) * width, x() + vidpos + 2, y() + yp + 2, numcols, rowheight, 1, width); numcols = 0; } else { draw_box(); fl_draw_image_mono( vidbuf, x() + 2, y() + 2, width, height, 1, width ); } } fldigi-3.21.80/src/waterfall/digiscope.cxx0000664000175000017500000002643612313064025015317 00000000000000// ---------------------------------------------------------------------------- // digiscope.cxx, Miniature Oscilloscope/Phasescope Widget // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "digiscope.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "qrunner.h" Digiscope::Digiscope (int X, int Y, int W, int H) : Fl_Widget (X, Y, W, H) { _phase = _quality = _flo = _fhi = _amp = 0.0; box(FL_DOWN_BOX); vidbuf = new unsigned char[ 3 * (W-4) * (H-4)]; vidline = new unsigned char[ 3 * (W-4)]; _highlight = false; _len = MAX_LEN; _zptr = 0; _x1 = _x2 = _y1 = _y2; phase_mode = PHASE1; } Digiscope::~Digiscope() { if (vidbuf) delete [] vidbuf; if (vidline) delete [] vidline; } void Digiscope::video(double *data, int len , bool dir) { if (active_modem->HistoryON()) return; if (data == NULL || len == 0) return; FL_LOCK_D(); int W = w() - 4; int H = h() - 4; for (int i = 0; i < W; i++) vidline[3*i] = vidline[3*i+1] = vidline[3*i+2] = (unsigned char)(data[i * len / W]); vidline[3*W/2] = 255; vidline[3*W/2+1] = 0; vidline[3*W/2+2] = 0; if (dir) { if (linecnt == H) { linecnt--; unsigned char *p = &vidbuf[3*W]; memmove (vidbuf, p, 3*(W * (H-1))*sizeof(unsigned char)); memcpy (&vidbuf[3*W*(H-1)], vidline, 3*W * sizeof (unsigned char)); } else memcpy (&vidbuf[3*W*linecnt], vidline, 3*W * sizeof(unsigned char)); linecnt++; } else { unsigned char *p = &vidbuf[3*W]; memmove (p, vidbuf, 3 * (W * (H-1)) * sizeof(unsigned char)); memcpy(vidbuf, vidline, 3 * W * sizeof(unsigned char)); } REQ_DROP(&Digiscope::redraw, this); FL_UNLOCK_D(); FL_AWAKE_D(); } void Digiscope::zdata(cmplx *zarray, int len ) { if (active_modem->HistoryON()) return; if (zarray == NULL || len == 0) return; FL_LOCK_D(); for (int i = 0; i < len; i++) { _zdata[_zptr++] = zarray[i]; if (_zptr == MAX_ZLEN) _zptr = 0; } REQ_DROP(&Digiscope::redraw, this); FL_UNLOCK_D(); FL_AWAKE_D(); } void Digiscope::data(double *data, int len, bool scale) { if (active_modem->HistoryON()) return; if (data == 0) { memset(_buf, 0, MAX_LEN * sizeof(*_buf)); REQ_DROP(&Digiscope::redraw, this); return; } if (len == 0) return; FL_LOCK_D(); if (len > MAX_LEN) _len = MAX_LEN; else _len = len; memcpy(_buf, data, len * sizeof(double)); if (scale) { double max = 1E-6; double min = 1E6; for (int i = 0; i < _len; i++) { max = MAX(max, _buf[i]); min = MIN(min, _buf[i]); } if (max == min) max *= 1.001; for (int i = 0; i < _len; i++) _buf[i] = (_buf[i] - min) / (max - min); } REQ_DROP(&Digiscope::redraw, this); FL_UNLOCK_D(); FL_AWAKE_D(); } void Digiscope::phase(double ph, double ql, bool hl) { if (active_modem->HistoryON()) return; FL_LOCK_D(); _phase = ph; _quality = ql; _highlight = hl; REQ_DROP(&Digiscope::redraw, this); FL_UNLOCK_D(); FL_AWAKE_D(); } void Digiscope::rtty(double flo, double fhi, double amp) { if (active_modem->HistoryON()) return; FL_LOCK_D(); _flo = flo; _fhi = fhi; _amp = amp; REQ_DROP(&Digiscope::redraw, this); FL_UNLOCK_D(); FL_AWAKE_D(); } void Digiscope::mode(scope_mode md) { if (md == PHASE) { if (phase_mode >= PHASE1 && phase_mode <= PHASE3) md = phase_mode; else md = phase_mode = PHASE1; } int W = w() - 4; int H = h() - 4; FL_LOCK_D(); _mode = md; memset(_buf, 0, MAX_LEN * sizeof(double)); linecnt = 0; memset (vidbuf, 0, 3*W*H * sizeof (unsigned char) ); memset (vidline, 0, 3*W*sizeof(unsigned char) ); vidline[3*W/2] = 255; vidline[3*W/2+1] = 0; vidline[3*W/2+2] = 0; for (int i = 0; i < H; i++) memcpy(&vidbuf[3*W*i], vidline, 3*W*sizeof(unsigned char) ); REQ_DROP(&Digiscope::redraw, this); FL_UNLOCK_D(); FL_AWAKE_D(); } void Digiscope::draw_phase() { // max number of shown vectors is first dimension static double pvecstack[8][2]; static const size_t psz = sizeof(pvecstack)/sizeof(*pvecstack); static unsigned pszn = 0; fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(FL_BLACK); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); fl_translate(x() + w() / 2.0, y() + w() / 2.0); fl_scale( 0.9*w()/2, -0.9*w()/2); fl_color(FL_WHITE); fl_circle( 0.0, 0.0, 1.0); fl_begin_line(); fl_vertex(-1.0, 0.0); fl_vertex(-0.9, 0.0); fl_end_line(); fl_begin_line(); fl_vertex(1.0, 0.0); fl_vertex(0.9, 0.0); fl_end_line(); fl_begin_line(); fl_vertex(0.0, -1.0); fl_vertex(0.0, -0.9); fl_end_line(); fl_begin_line(); fl_vertex(0.0, 1.0); fl_vertex(0.0, 0.9); fl_end_line(); if (_highlight) { if (_mode > PHASE1) { if (pszn == psz - 1) memmove(pvecstack, pvecstack + 1, (psz - 1) * sizeof(*pvecstack)); else pszn++; pvecstack[pszn][0] = _phase; pvecstack[pszn][1] = _quality; // draw the stack in progressively brighter green for (unsigned i = 0; i <= pszn; i++) { // fl_color(fl_color_average(FL_GREEN, FL_BLACK, 1.0 - 0.8 * (n-i)/ pszn)); fl_color(fl_color_average(FL_GREEN, FL_BLACK, 0.2 + 0.8 * i / pszn)); fl_begin_line(); fl_vertex(0.0, 0.0); if (_mode == PHASE3) // scale length by quality fl_vertex(0.9 * cos(pvecstack[i][0] - M_PI / 2) * pvecstack[i][1], 0.9 * sin(pvecstack[i][0] - M_PI / 2) * pvecstack[i][1]); else fl_vertex(0.9 * cos(pvecstack[i][0] - M_PI / 2), 0.9 * sin(pvecstack[i][0] - M_PI / 2)); fl_end_line(); } } else { // original style fl_color(FL_GREEN); fl_begin_line(); fl_vertex(0.0, 0.0); fl_vertex(0.9 * cos(_phase - M_PI / 2), 0.9 * sin( _phase - M_PI / 2)); fl_end_line(); } } else { fl_color(FL_GREEN); fl_circle( 0.0, 0.0, 0.1); } fl_pop_matrix(); fl_pop_clip(); } void Digiscope::draw_scope() { int npts, np; fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(FL_BLACK); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); npts = MIN(w(), _len); npts = MAX(1, npts); fl_translate(x()+2, y() + h() - 2); fl_scale ((w()-4), - (h() - 4)); fl_color(FL_GREEN); fl_begin_line(); for (int i = 0; i < npts; i++) { np = i * _len / npts; np = np < MAX_LEN ? np : MAX_LEN - 1; fl_vertex( (double)i / npts, _buf[np] ); } fl_end_line(); // x & y axis' if (_x1) { fl_color(FL_WHITE); fl_begin_line(); fl_vertex(_x1, 0.0); fl_vertex(_x1, 1.0); fl_end_line(); } if (_x2) { fl_color(FL_YELLOW); fl_begin_line(); fl_vertex(_x2, 0.0); fl_vertex(_x2, 1.0); fl_end_line(); } if (_y1) { fl_color(FL_WHITE); fl_begin_line(); fl_vertex(0.0, _y1); fl_vertex(1.0, _y1); fl_end_line(); } if (_y2) { fl_color(FL_YELLOW); fl_begin_line(); fl_vertex(0.0, _y2); fl_vertex(1.0, _y2); fl_end_line(); } fl_pop_matrix(); fl_pop_clip(); } void Digiscope::draw_xy() { fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(FL_BLACK); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); fl_translate(x() + w() / 2.0, y() + w() / 2.0); fl_scale( w()/2.0, -w()/2.0); // x & y axis fl_color(FL_LIGHT1); fl_begin_line(); fl_vertex(-0.6, 0.0); fl_vertex(-1.0, 0.0); fl_end_line(); fl_begin_line(); fl_vertex(0.6, 0.0); fl_vertex(1.0, 0.0); fl_end_line(); fl_begin_line(); fl_vertex(0.0, -0.6); fl_vertex(0.0, -1.0); fl_end_line(); fl_begin_line(); fl_vertex(0.0, 0.6); fl_vertex(0.0, 1.0); fl_end_line(); // data int W = w() / 2; int H = h() / 2; int X = x(); int Y = y(); int xp, yp, xp1, yp1; int j = _zptr; if (++j == MAX_ZLEN) j = 0; xp = X + (int)((_zdata[j].real() + 1.0) * W); yp = Y + (int)((_zdata[j].imag() + 1.0) * H); fl_color(fl_rgb_color(0, 230,0)); for (int i = 0; i < MAX_ZLEN; i++ ) { if (++j == MAX_ZLEN) j = 0; xp1 = X + (int)((_zdata[j].real() + 1.0) * W); yp1 = Y + (int)((_zdata[j].imag() + 1.0) * H); fl_line(xp, yp, xp1, yp1); xp = xp1; yp = yp1; } fl_pop_matrix(); fl_pop_clip(); } void Digiscope::draw_rtty() { int npts, np; fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(FL_BLACK); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); npts = MIN(w(), _len); npts = MAX(1, npts); fl_translate(x()+2, y() + h() - 2); fl_scale ((w()-4), - (h() - 4)); fl_color(FL_YELLOW); fl_begin_line(); fl_vertex( 0.0, 0.9); fl_vertex( 1.0, 0.9); fl_end_line(); fl_begin_line(); fl_vertex( 0.0, 0.1); fl_vertex( 1.0, 0.1); fl_end_line(); fl_color(FL_GREEN); fl_begin_line(); for (int i = 0; i < npts; i++) { np = i * _len / npts; np = np < MAX_LEN ? np : MAX_LEN - 1; fl_vertex( (double)i / npts, 0.5 + 0.75 * _buf[np] ); } fl_end_line(); fl_pop_matrix(); fl_pop_clip(); } void Digiscope::draw_video() { fl_draw_image( vidbuf, x() + 2, y() + 2, w() - 4, h() - 4); } void Digiscope::draw() { draw_box(); if (_mode == WWV || _mode == DOMWF) draw_video(); else { switch (_mode) { case SCOPE : draw_scope(); break; case PHASE1: case PHASE2: case PHASE3: draw_phase(); break; case RTTY : draw_rtty(); break; case XHAIRS : draw_xy(); break; case DOMDATA : draw_scope(); break; case BLANK : default: fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(FL_BLACK); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); fl_pop_matrix(); fl_pop_clip(); break; } } } int Digiscope::handle(int event) { if (!Fl::event_inside(this)) return 0; switch (event) { case FL_RELEASE: switch (_mode) { case PHASE1: case PHASE2: _mode = (scope_mode)((int)_mode + 1); phase_mode = _mode; redraw(); break; case PHASE3: _mode = PHASE1; phase_mode = _mode; redraw(); break; case RTTY: _mode = XHAIRS; redraw(); break; case XHAIRS: _mode = RTTY; redraw(); break; case DOMDATA: _mode = DOMWF; redraw(); break; case DOMWF: _mode = DOMDATA; redraw(); break; case WWV: event = Fl::event_button(); if (event == FL_LEFT_MOUSE) wwv_modem->set1(Fl::event_x() - x(), w()); else if (event == FL_RIGHT_MOUSE) wwv_modem->set2(Fl::event_x() - x(), Fl::event_y() - y()); break; default: break; } return 1; case FL_MOUSEWHEEL: if ((event = Fl::event_dy()) || (event = Fl::event_dx())) wf->handle_mouse_wheel(waterfall::WF_AFC_BW, event); break; default: break; } return 1; } void Digiscope::resize(int x, int y, int w, int h) { delete [] vidbuf; delete [] vidline; vidbuf = new unsigned char[ 3 * (w-4) * (h-4)]; vidline = new unsigned char[ 3 * (w-4)]; Fl_Widget::resize(x, y, w, h); mode(_mode); } fldigi-3.21.80/src/waterfall/colorbox.cxx0000664000175000017500000000722112313064025015167 00000000000000// ---------------------------------------------------------------------------- // colorbox.cxx // // Copyright (C) 2007-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "gettext.h" #include "colorbox.h" #include "waterfall.h" #include "confdialog.h" #include "main.h" #include "fl_digi.h" #include "fileselect.h" #include "debug.h" using namespace std; void colorbox::draw() { int ypos = y() + 2; int xpos; int ht = h() - 4; int wd = w() - 4; draw_box(); for(int i = 0; i < wd; i++){ xpos = x() + 2 + i; int xc = i * 256 / wd; fl_rectf (xpos, ypos, 1, ht, mag2RGBI[xc].R, mag2RGBI[xc].G, mag2RGBI[xc].B); } } void setColorButtons() { for (int i = 0; i < 9; i++) { btnColor[i]->color( fl_rgb_color( palette[i].R, palette[i].G, palette[i].B ) ); btnColor[i]->redraw(); } } void selectColor(int n) { uchar r, g, b; r = palette[n].R; g = palette[n].G; b = palette[n].B; fl_color_chooser("Spectrum", r, g, b); palette[n].R = r; palette[n].G = g; palette[n].B = b; btnColor[n]->color( fl_rgb_color( palette[n].R, palette[n].G, palette[n].B ) ); btnColor[n]->redraw(); wf->setcolors(); WF_Palette->redraw(); } static string palfilename = ""; static string palLabelStr; void loadPalette() { int r,g,b; FILE *clrfile = NULL; if (palfilename.size() == 0) { palfilename = PalettesDir; palfilename.append ("fldigi.pal"); } const char *p = FSEL::select(_("Open palette"), _("Fldigi palette\t*.pal"), palfilename.c_str()); if (!p) return; if ((clrfile = fopen(p, "r")) != NULL) { for (int i = 0; i < 9; i++) { if (fscanf(clrfile, "%d;%d;%d\n", &r, &g, &b) == EOF) { if (ferror(clrfile)) LOG_PERROR("fscanf"); else LOG_ERROR("unexpected EOF"); fclose(clrfile); return; } palette[i].R = r; palette[i].G = g; palette[i].B = b; } fclose(clrfile); wf->setcolors(); setColorButtons(); palfilename = p; palLabelStr = p; size_t pos = palLabelStr.find_last_of('/'); if (pos != string::npos) palLabelStr.erase(0, pos+1); palLabelStr = _("Palette: ") + palLabelStr; WF_Palette->label(palLabelStr.c_str()); WF_Palette->redraw(); progdefaults.PaletteName = palLabelStr; } } void savePalette() { FILE *clrfile = NULL; if (palfilename.size() == 0) { palfilename = PalettesDir; palfilename.append ("fldigi.pal"); } const char *p = FSEL::saveas(_("Save palette"), _("Fldigi palette\t*.pal"), palfilename.c_str()); if (!p) return; if ((clrfile = fopen(p, "w")) != NULL) { for (int i = 0; i < 9; i++) { fprintf(clrfile, "%3d;%3d;%3d\n", palette[i].R, palette[i].G, palette[i].B ); } fclose(clrfile); palfilename = p; palLabelStr = p; size_t pos = palLabelStr.find_last_of('/'); if (pos != string::npos) palLabelStr.erase(0, pos+1); palLabelStr = _("Palette: ") + palLabelStr; WF_Palette->label(palLabelStr.c_str()); WF_Palette->redraw(); progdefaults.PaletteName = palLabelStr; } } fldigi-3.21.80/src/fldigirc.rc0000664000175000017500000000041612313064025012743 00000000000000#define BUILD_FLDIGI 1 #include "config.h" #define IDI_ICON 101 IDI_ICON ICON DISCARDABLE "fldigi.ico" #define RC_FILE_VERSION_QUAD FLDIGI_VERSION_MAJOR,FLDIGI_VERSION_MINOR,0,0 #define RC_FILE_DESCRIPTION "Fast Light Digital Modem Application" #include "common.rc" fldigi-3.21.80/src/combo/0000775000175000017500000000000012313333725012016 500000000000000fldigi-3.21.80/src/combo/combo.cxx0000664000175000017500000002463312313147652013573 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // // This 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 software 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "config.h" #include "combo.h" void popbrwsr_cb (Fl_Widget *v, long d); Fl_PopBrowser::Fl_PopBrowser (int X, int Y, int W, int H, const char *label) : Fl_Window (X, Y, W, H, label) { hRow = H; wRow = W; clear_border(); box(FL_BORDER_BOX); align(FL_ALIGN_INSIDE); popbrwsr = new Fl_Select_Browser(0,0,wRow,hRow, ""); popbrwsr->callback ( (Fl_Callback*)popbrwsr_cb); popbrwsr->align(FL_ALIGN_INSIDE); parentCB = 0; end(); set_modal(); } Fl_PopBrowser::~Fl_PopBrowser () { delete popbrwsr; } int Fl_PopBrowser::handle(int event) { Fl_ComboBox *cbx = (Fl_ComboBox*)this->parent(); if (!Fl::event_inside( child(0) ) && event == FL_PUSH) { pophide(); return 1; } if (event == FL_KEYDOWN) { int kbd = Fl::event_key(); char key = Fl::event_text()[0]; if (kbd == FL_Down) { if (popbrwsr->value() < popbrwsr->size()) popbrwsr->select(popbrwsr->value() + 1); popbrwsr->bottomline(popbrwsr->value()); return 1; } if (kbd == FL_Up && popbrwsr->value() > 1) { popbrwsr->select(popbrwsr->value() - 1); return 1; } if (key == '\r' || kbd == FL_Enter) { // kbd test for OS X int n = popbrwsr->value() - 1; pophide(); cbx->index(n); cbx->do_callback(); return 1; } if (key == '\b' || kbd == FL_BackSpace) { // kbd test for OS X if (!keystrokes.empty()) keystrokes.erase(keystrokes.length() - 1, 1); return 1; } if (key == 0x1b || kbd == FL_Escape) { // kbd test for OS X pophide(); return 0; } if (key >= ' ' || key <= 0x7f) { keystrokes += key; for (int i = 0; i < cbx->listsize; i++) { if (strncasecmp(keystrokes.c_str(), cbx->datalist[i]->s, keystrokes.length()) == 0) { popbrwsr->select(i+1); popbrwsr->show(i+1); return 1; } } return 0; } } return Fl_Group::handle(event); } void Fl_PopBrowser::add(char *s, void *d) { popbrwsr->add(s,d); } void Fl_PopBrowser::clear() { popbrwsr->clear(); } void Fl_PopBrowser::sort() { return; } void Fl_PopBrowser::popshow (int x, int y) { int nRows = parentCB->numrows(); int fh = fl_height(); int height = nRows * fh + 4; if (popbrwsr->size() == 0) return; if (nRows > parentCB->lsize()) nRows = parentCB->lsize(); // locate first occurance of inp string value in the list // and display that if found int i = parentCB->index(); if (!(i >= 0 && i < parentCB->listsize)) { for (i = 0; i < parentCB->listsize; i++) if (parentCB->type_ == COMBOBOX) { if (!strcmp(parentCB->val->value(), parentCB->datalist[i]->s)) break; } else { if (!strcmp(parentCB->valbox->label(), parentCB->datalist[i]->s)) break; } if (i == parentCB->listsize) i = 0; } // resize and reposition the popup to insure that it is within the bounds // of the uppermost parent widget // preferred position is just below and at the same x position as the // parent widget Fl_Widget *gparent = parentCB; int hp = gparent->h(); while ((gparent = gparent->parent())) { hp = gparent->h(); parentWindow = gparent; } int nu = nRows, nl = nRows; int hu = nu * fh + 4, hl = nl * fh + 4; int yu = parentCB->y() - hu; int yl = y; while (nl > 1 && (yl + hl > hp)) { nl--; hl -= fh; } while (nu > 1 && yu < 0) { nu--; yu += fh; hu -= fh; } y = yl; height = hl; if (nl < nu) { y = yu; height = hu; } popbrwsr->size (wRow, height); resize (x, y, wRow, height); popbrwsr->topline (i); keystrokes.empty(); popbrwsr->show(); show(); for (const Fl_Widget* o = popbrwsr; o; o = o->parent()) ((Fl_Widget *)o)->set_visible(); parentWindow->damage(FL_DAMAGE_ALL); parentWindow->redraw(); Fl::grab(this); } void Fl_PopBrowser::pophide () { hide (); parentWindow->damage(FL_DAMAGE_ALL); parentWindow->redraw(); Fl::grab(0); Fl::focus(((Fl_ComboBox*)parent())->btn); } void Fl_PopBrowser::popbrwsr_cb_i (Fl_Widget *v, long d) { // update the return values Fl_Select_Browser *SB = (Fl_Select_Browser *)(v); Fl_PopBrowser *PB = (Fl_PopBrowser *)(SB->parent()); Fl_ComboBox *CB = (Fl_ComboBox *)(PB->parent()); int row = SB->value(); if (row == 0) return; SB->deselect(); CB->value(SB->text(row)); CB->idx = row - 1; PB->pophide(); CB->do_callback(); return; } void popbrwsr_cb (Fl_Widget *v, long d) { ((Fl_PopBrowser *)(v))->popbrwsr_cb_i (v, d); return; } void Fl_ComboBox::fl_popbrwsr(Fl_Widget *p) { int xpos = p->x(), ypos = p->h() + p->y(); // pass the calling widget to the popup browser so that the // correct callback function can be called when the user selects an item // from the browser list Brwsr->parentCB = (Fl_ComboBox *) p; Brwsr->clear_kbd(); Brwsr->popshow(xpos, ypos); return; } void btnComboBox_cb (Fl_Widget *v, void *d) { Fl_ComboBox *p = (Fl_ComboBox *)(v->parent()); p->fl_popbrwsr (p); return; } Fl_ComboBox::Fl_ComboBox (int X,int Y,int W,int H, const char *lbl, int wtype) : Fl_Group (X, Y, W, H, lbl) { width = W; height = H; type_ = wtype; if (type_ == LISTBOX) { valbox = new Fl_Box (FL_DOWN_BOX, X, Y, W-H, H, ""); valbox->align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT); valbox->color(FL_BACKGROUND2_COLOR); } else { val = new Fl_Input (X, Y, W-H, H, ""); val->align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT); } btn = new Fl_Button (X + W - H + 1, Y, H - 1, H, "@2>"); btn->callback ((Fl_Callback *)btnComboBox_cb, 0); Brwsr = 0; datalist = new datambr *[FL_COMBO_LIST_INCR]; maxsize = FL_COMBO_LIST_INCR; for (int i = 0; i < FL_COMBO_LIST_INCR; i++) datalist[i] = 0; listsize = 0; listtype = 0; Brwsr = new Fl_PopBrowser(X, Y, W, H, ""); Brwsr->align(FL_ALIGN_INSIDE); idx = 0; end(); numrows_ = 8; } Fl_ComboBox::~Fl_ComboBox() { delete Brwsr; for (int i = 0; i < listsize; i++) { if (datalist[i]) { if (datalist[i]->s) delete [] datalist[i]->s; delete datalist[i]; } } delete [] datalist; } int Fl_ComboBox::handle(int event) { if (event == FL_KEYDOWN) { int kbd = Fl::event_key(); if (kbd == FL_Down) { fl_popbrwsr (this); return 1; } } return Fl_Group::handle(event); } void Fl_ComboBox::type (int t) { listtype = t; } void Fl_ComboBox::readonly(bool yes) { if (type_ == LISTBOX) return; val->readonly(yes); if (yes) val->selection_color(fl_rgb_color(173,216,230)); else val->selection_color(FL_SELECTION_COLOR); } // ComboBox value is contained in the val widget const char *Fl_ComboBox::value() { if (type_ == LISTBOX) return valbox->label(); else return val->value(); } void Fl_ComboBox::value( const char *s ) { int i; if ((listtype & FL_COMBO_UNIQUE_NOCASE) == FL_COMBO_UNIQUE_NOCASE) { for (i = 0; i < listsize; i++) { if (strcasecmp (s, datalist[i]->s) == 0) break; } } else { for (i = 0; i < listsize; i++) { if (strcmp (s, datalist[i]->s) == 0) break; } } if ( i < listsize) { idx = i; if (type_ == LISTBOX) { valbox->label(datalist[idx]->s); valbox->redraw_label(); } else val->value(datalist[idx]->s); } } void Fl_ComboBox::put_value(const char *s) { value(s); } void Fl_ComboBox::index(int i) { if (i >= 0 && i < listsize) { idx = i; if (type_ == LISTBOX) { valbox->label(datalist[idx]->s); valbox->redraw_label(); } else val->value( datalist[idx]->s); } } int Fl_ComboBox::index() { return idx; } void * Fl_ComboBox::data() { return retdata; } void Fl_ComboBox::insert(const char *str, void *d) { datalist[listsize] = new datambr; datalist[listsize]->s = new char [strlen(str) + 1]; datalist[listsize]->s[0] = 0; strcpy (datalist[listsize]->s, str); datalist[listsize]->d = 0; Brwsr->add(datalist[listsize]->s,d); listsize++; if (listsize == maxsize) { int nusize = maxsize + FL_COMBO_LIST_INCR; datambr **temparray = new datambr *[nusize]; for (int i = 0; i < listsize; i++) temparray[i] = datalist[i]; delete [] datalist; datalist = temparray; maxsize = nusize; } } void Fl_ComboBox::add( const char *s, void * d) { std::string str = s; std::string sinsert; size_t p = str.find("|"); bool found = false; if (p != std::string::npos) { while (p != std::string::npos) { sinsert = str.substr(0, p); found = false; // test for in list if ((listtype & FL_COMBO_UNIQUE_NOCASE) == FL_COMBO_UNIQUE_NOCASE) { for (int i = 0; i < listsize; i++) { if (sinsert == datalist[i]->s) { found = true; break; } } } // not in list, so add this entry if (!found) insert(sinsert.c_str(), 0); str.erase(0, p+1); p = str.find("|"); } if (str.length()) insert(str.c_str(), 0); } else insert( s, d ); } void Fl_ComboBox::clear() { Brwsr->clear(); if (listsize == 0) return; for (int i = 0; i < listsize; i++) { delete [] datalist[i]->s; delete datalist[i]; } listsize = 0; } int DataCompare( const void *x1, const void *x2 ) { int cmp; datambr *X1, *X2; X1 = *(datambr **)(x1); X2 = *(datambr **)(x2); cmp = strcasecmp (X1->s, X2->s); if (cmp < 0) return -1; if (cmp > 0) return 1; return 0; } void Fl_ComboBox::sort() { Brwsr->clear (); qsort (&datalist[0], listsize, sizeof (datambr *), DataCompare); for (int i = 0; i < listsize; i++) Brwsr->add (datalist[i]->s, datalist[i]->d); } void Fl_ComboBox::textfont (int fnt) { if (type_ == LISTBOX) valbox->labelfont (fnt); else val->textfont (fnt); } void Fl_ComboBox::textsize (uchar n) { if (type_ == LISTBOX) valbox->labelsize(n); else val->textsize (n); } void Fl_ComboBox::textcolor( Fl_Color c) { if (type_ == LISTBOX) valbox->labelcolor (c); else val->textcolor (c); } void Fl_ComboBox::color(Fl_Color c) { _color = c; if (type_ == LISTBOX) valbox->color(c); else val->color(c); if (Brwsr) Brwsr->color(c); } fldigi-3.21.80/src/navtex/0000775000175000017500000000000012313333726012225 500000000000000fldigi-3.21.80/src/navtex/navtex.cxx0000664000175000017500000014046012313064025014174 00000000000000// // navtex.cxx // // Copyright (C) 2011 // Remi Chateauneu, F4ECW // // This file is part of fldigi. Adapted from code contained in JNX source code // distribution. // JNX Copyright (C) Paul Lutus // http://www.arachnoid.com/JNX/index.html // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "configuration.h" #include "fl_digi.h" #include "debug.h" #include "gettext.h" #include "navtex.h" #include "logbook.h" #include "coordinate.h" #include "misc.h" #include "status.h" #include "strutil.h" #include "kmlserver.h" #include "record_loader.h" #include "FL/fl_ask.H" /// This models a line of the file defining Navtex stations. class NavtexRecord { std::string m_country ; std::string m_country_code ; double m_frequency ; char m_origin ; std::string m_callsign ; std::string m_name ; CoordinateT::Pair m_coordinates ; std::string m_locator ; /// Reads a CSV file. static const char m_delim = ';'; public: NavtexRecord() : m_frequency(0.0) , m_origin('?') , m_name( _("Unknown station") ) {} char origin(void) const { return m_origin; }; const CoordinateT::Pair & coordinates() const { return m_coordinates; } double frequency(void) const { return m_frequency; }; const std::string & country() const { return m_country; } const std::string & name() const { return m_name; } const std::string & callsign() const { return m_callsign; } /// Example: Azores;AZR;490.0;J;CTH;Horta;38 32 N;28 38 W;II;PP friend std::istream & operator>>( std::istream & istrm, NavtexRecord & rec ) { std::string input_str ; if( ! std::getline( istrm, input_str ) ) return istrm ; std::stringstream str_strm( input_str ); if( read_until_delim( m_delim, str_strm, rec.m_country ) && read_until_delim( m_delim, str_strm /* Country code */ ) && read_until_delim( m_delim, str_strm, rec.m_frequency ) && read_until_delim( m_delim, str_strm, rec.m_origin ) && read_until_delim( m_delim, str_strm, rec.m_callsign ) && read_until_delim( m_delim, str_strm, rec.m_name ) && read_until_delim( m_delim, str_strm, rec.m_coordinates.latitude() ) && read_until_delim( m_delim, str_strm, rec.m_coordinates.longitude() ) && read_until_delim( m_delim, str_strm /* Zone */ ) && read_until_delim( m_delim, str_strm /* Language */ ) && ( rec.m_coordinates.latitude().is_lon() == false ) && ( rec.m_coordinates.longitude().is_lon() == true ) ) { return istrm ; } istrm.setstate(std::ios::eofbit); return istrm ; } }; /// Navtex catalog of stations is used when logging to ADIF file: It gives the station name, callsign etc... class NavtexCatalog : public RecordLoader< NavtexCatalog > { // TODO: Consider a multimap typedef std::deque< NavtexRecord > CatalogType ; CatalogType m_catalog ; /// Frequency more or less 1 %: 485-494 kHz, 512-523 kHz etc... static bool freq_close( double freqA, double freqB ) { static const double freq_ratio = 1.01 ; return ( freqA < freqB * freq_ratio ) || ( freqA * freq_ratio > freqB ); } /// Tells if this is a reasonable Navtex frequency. static bool freq_acceptable( double freq ) { return freq_close( freq, 490.0 ) || freq_close( freq, 518.0 ) || freq_close( freq, 4209.5 ); } void Clear() { m_catalog.clear(); } bool ReadRecord( std::istream & istrm ) { NavtexRecord tmp ; istrm >> tmp ; if( istrm || istrm.eof() ) { m_catalog.push_back( tmp ); return true ; } return false ; } /// Minimal edit distance (Levenshtein) between the pattern and any token of the string. static double DistToStationName( const std::string & msg, const std::string & pattern ) { std::stringstream strm( msg ); /// Any big number is OK, if bigger than any string length. double currDist = 1.7976931348623157e+308; // DBL_MAX ; typedef std::istream_iterator StrmIterStr ; for( StrmIterStr itStrm( strm ); itStrm != StrmIterStr(); ++itStrm ) { const std::string tmp = *itStrm ; currDist = std::min( currDist, (double)levenshtein( tmp, pattern ) ); } return currDist ; } public: std::string base_filename() const { return "NAVTEX_Stations.csv"; } const char * Description() const { return _("Navtex stations"); } /// Usual frequencies are 490, 518 or 4209 kiloHertz. const NavtexRecord * FindStation( long long freq_ll, char origin, const std::string & maidenhead, const std::string & msg) { if( maidenhead.empty() ) return NULL; if( m_catalog.empty() ) { int nbRecs = LoadAndRegister(); static bool error_signaled = false ; if( nbRecs <= 0 ) { LOG_WARN("Error reading Navtex stations file"); if(error_signaled == false) { fl_alert("Cannot read Navtex file %s", storage_filename().first.c_str() ); error_signaled = true ; return NULL; } } error_signaled = false ; } const CoordinateT::Pair coo( maidenhead ); /// Possible Navtex stations stored by closer first. typedef std::multimap< double, CatalogType::const_iterator > SolutionType ; SolutionType solDistKm; double freq = freq_ll / 1000.0 ; // As kiloHertz in the data file. bool okFreq = freq_acceptable( freq ); //LOG_INFO("Operator Maidenhead=%s lon=%lf lat=%lf okFreq=%d Origin=%c", // maidenhead.c_str(), coo.longitude().angle(), coo.latitude().angle(), okFreq, origin ); for( CatalogType::const_iterator it = m_catalog.begin(), en = m_catalog.end(); it != en ; ++it ) { /// The origin letters must be identical. if( origin != it->origin() ) continue ; /// The two frequencies must be close more or less 10%. bool freqClose = freq_close( freq, it->frequency() ); if( okFreq && ! freqClose ) continue ; /// Solutions are stored smallest distance first. double dist = coo.distance( it->coordinates() ); solDistKm.insert( SolutionType::value_type( dist, it ) ); } /// No station found. if( solDistKm.empty() ) return NULL; /// Only one station, no ambiguity. SolutionType::iterator begSolKm = solDistKm.begin(); if( solDistKm.size() == 1 ) return & ( *begSolKm->second ); SolutionType solStrDist ; // Maybe some station names appear but not others. This can be for example "Maltaradio", "Cullercoat", "Limnos" etc... for( SolutionType::iterator itSolKm = begSolKm, endSolKm = solDistKm.end(); itSolKm != endSolKm; ++itSolKm ) { std::stringstream strm ; strm << itSolKm->second->coordinates(); // LOG_INFO("Name=%s Dist=%lf %s", itSolKm->second->name().c_str(), itSolKm->first, strm.str().c_str() ); // The message is in uppercase anyway, so no need to convert. double str_dist = DistToStationName( msg, uppercase( itSolKm->second->name() ) ); solStrDist.insert( SolutionType::value_type( str_dist, itSolKm->second ) ); } // There are at least two elements, so we can do this. SolutionType::iterator begSolStr = solStrDist.begin(); SolutionType::iterator nxtSolStr = begSolStr; ++nxtSolStr ; // The first message only contains a string very similar to a radio station. if( (begSolStr->first < 2) && ( nxtSolStr->first > 2 ) ) { //LOG_INFO("Levenshtein beg=%lf beg_name=%s next=%lf next_name=%s", // begSolStr->first, begSolStr->second->name().c_str(), // nxtSolStr->first, nxtSolStr->second->name().c_str() ); return & (*begSolStr->second) ; } // There are at least two elements, and more than one station name, or none of them, // is contained in the message. // Just returns the closest element. return & ( *begSolKm->second ); // Now we could search for a coordinate in the message, and we will keep the station which is the closest // to this coordinate. We wish to do that anyway in order to map things in KML. // Possible formats are -(This is experimental): // 67-04.0N 032-25.7E // 47-29'30N 003-16'00W // 6930.1N 01729.9E // 48-21'45N 004-31'45W // 58-37N 003-32W // 314408N 341742E // 42-42N 005-10E // 54-02.3N 004-45.8E // 55-20.76N 014-45.27E // 55-31.1 N 012-44.7 E // 5330.4N 01051.5W // 43 45.0 N - 015 44.8 E // 34-33.7N 012-28.7E // 51 10.55 N - 001 51.02 E // 51.21.67N 002.13.29E // 73 NORTH 14 EAST // 58-01.20N 005-27.08W // 50.56N 007.00,5W // 5630,1N- 00501,6E // LAT. 41.06N - LONG 012.57E // 42 40 01 N - 018 05 10 E // 40 25 31N - 18 15 30E // 40-32.2N 000-33.5E // 58-01.2 NORTH 005-27.1 WEST // 39-07,7N 026-39,2E // // ESTIMATED LIMIT OF ALL KNOWN ICE: // 4649N 5411W TO 4530N 5400W TO // 4400N 4900W TO 4545N 4530W TO // 4715N 4530W TO 5000N 4715W TO // 5530N 5115W TO 5700N 5545W. // } }; // NavtexCatalog /// Explanations here: http://www.arachnoid.com/BiQuadDesigner/index.html class BiQuadraticFilter { public: enum Type { BANDPASS, LOWPASS, HIGHPASS, NOTCH, PEAK, LOWSHELF, HIGHSHELF }; private: double m_a0, m_a1, m_a2, m_b0, m_b1, m_b2; double m_x1, m_x2, y, m_y1, m_y2; double m_gain_abs; Type m_type; double m_center_freq; double m_sample_rate; double m_Q; double m_gainDB; public: BiQuadraticFilter() {} BiQuadraticFilter(Type type, double center_freq, double sample_rate, double Q, double gainDB = 0.0) { configure(type, center_freq, sample_rate, Q, gainDB); } void configure(Type aType, double aCenter_freq, double aSample_rate, double aQ, double aGainDB = 0.0) { m_x1 = m_x2 = m_y1 = m_y2 = 0; aQ = (aQ == 0) ? 1e-9 : aQ; m_type = aType; m_sample_rate = aSample_rate; m_Q = aQ; m_gainDB = aGainDB; reconfigure(aCenter_freq); } private: /// Allows parameter change while running void reconfigure(double cf) { m_center_freq = cf; // only used for peaking and shelving filters m_gain_abs = pow(10, m_gainDB / 40); double omega = 2 * M_PI * cf / m_sample_rate; double sn = sin(omega); double cs = cos(omega); double alpha = sn / (2 * m_Q); double beta = sqrt(m_gain_abs + m_gain_abs); switch (m_type) { case BANDPASS: m_b0 = alpha; m_b1 = 0; m_b2 = -alpha; m_a0 = 1 + alpha; m_a1 = -2 * cs; m_a2 = 1 - alpha; break; case LOWPASS: m_b0 = (1 - cs) / 2; m_b1 = 1 - cs; m_b2 = (1 - cs) / 2; m_a0 = 1 + alpha; m_a1 = -2 * cs; m_a2 = 1 - alpha; break; case HIGHPASS: m_b0 = (1 + cs) / 2; m_b1 = -(1 + cs); m_b2 = (1 + cs) / 2; m_a0 = 1 + alpha; m_a1 = -2 * cs; m_a2 = 1 - alpha; break; case NOTCH: m_b0 = 1; m_b1 = -2 * cs; m_b2 = 1; m_a0 = 1 + alpha; m_a1 = -2 * cs; m_a2 = 1 - alpha; break; case PEAK: m_b0 = 1 + (alpha * m_gain_abs); m_b1 = -2 * cs; m_b2 = 1 - (alpha * m_gain_abs); m_a0 = 1 + (alpha / m_gain_abs); m_a1 = -2 * cs; m_a2 = 1 - (alpha / m_gain_abs); break; case LOWSHELF: m_b0 = m_gain_abs * ((m_gain_abs + 1) - (m_gain_abs - 1) * cs + beta * sn); m_b1 = 2 * m_gain_abs * ((m_gain_abs - 1) - (m_gain_abs + 1) * cs); m_b2 = m_gain_abs * ((m_gain_abs + 1) - (m_gain_abs - 1) * cs - beta * sn); m_a0 = (m_gain_abs + 1) + (m_gain_abs - 1) * cs + beta * sn; m_a1 = -2 * ((m_gain_abs - 1) + (m_gain_abs + 1) * cs); m_a2 = (m_gain_abs + 1) + (m_gain_abs - 1) * cs - beta * sn; break; case HIGHSHELF: m_b0 = m_gain_abs * ((m_gain_abs + 1) + (m_gain_abs - 1) * cs + beta * sn); m_b1 = -2 * m_gain_abs * ((m_gain_abs - 1) + (m_gain_abs + 1) * cs); m_b2 = m_gain_abs * ((m_gain_abs + 1) + (m_gain_abs - 1) * cs - beta * sn); m_a0 = (m_gain_abs + 1) - (m_gain_abs - 1) * cs + beta * sn; m_a1 = 2 * ((m_gain_abs - 1) - (m_gain_abs + 1) * cs); m_a2 = (m_gain_abs + 1) - (m_gain_abs - 1) * cs - beta * sn; break; } /// Prescale filter constants m_b0 /= m_a0; m_b1 /= m_a0; m_b2 /= m_a0; m_a1 /= m_a0; m_a2 /= m_a0; } public: /// Perform one filtering step double filter(double x) { y = m_b0 * x + m_b1 * m_x1 + m_b2 * m_x2 - m_a1 * m_y1 - m_a2 * m_y2; m_x2 = m_x1; m_x1 = x; m_y2 = m_y1; m_y1 = y; return (y); } }; static const unsigned char code_to_ltrs[128] = { //0 1 2 3 4 5 6 7 8 9 a b c d e f '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', // 0 '_', '_', '_', '_', '_', '_', '_', 'J', '_', '_', '_', 'F', '_', 'C', 'K', '_', // 1 '_', '_', '_', '_', '_', '_', '_', 'W', '_', '_', '_', 'Y', '_', 'P', 'Q', '_', // 2 '_', '_', '_', '_', '_', 'G', '_', '_', '_', 'M', 'X', '_', 'V', '_', '_', '_', // 3 '_', '_', '_', '_', '_', '_', '_', 'A', '_', '_', '_', 'S', '_', 'I', 'U', '_', // 4 '_', '_', '_', 'D', '_', 'R', 'E', '_', '_', 'N', '_', '_', ' ', '_', '_', '_', // 5 '_', '_', '_', 'Z', '_', 'L', '_', '_', '_', 'H', '_', '_', '\n', '_', '_', '_', // 6 '_', 'O', 'B', '_', 'T', '_', '_', '_', '\r', '_', '_', '_', '_', '_', '_', '_' // 7 }; static const unsigned char code_to_figs[128] = { //0 1 2 3 4 5 6 7 8 9 a b c d e f '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', // 0 '_', '_', '_', '_', '_', '_', '_', '\'', '_', '_', '_', '!', '_', ':', '(', '_', // 1 '_', '_', '_', '_', '_', '_', '_', '2', '_', '_', '_', '6', '_', '0', '1', '_', // 2 '_', '_', '_', '_', '_', '&', '_', '_', '_', '.', '/', '_', ';', '_', '_', '_', // 3 '_', '_', '_', '_', '_', '_', '_', '-', '_', '_', '_', '\07', '_', '8', '7', '_', // 4 '_', '_', '_', '$', '_', '4', '3', '_', '_', ',', '_', '_', ' ', '_', '_', '_', // 5 '_', '_', '_', '"', '_', ')', '_', '_', '_', '#', '_', '_', '\n', '_', '_', '_', // 6 '_', '9', '?', '_', '5', '_', '_', '_', '\r', '_', '_', '_', '_', '_', '_', '_' // 7 }; static const int code_ltrs = 0x5a; static const int code_figs = 0x36; static const int code_alpha = 0x0f; static const int code_beta = 0x33; static const int code_char32 = 0x6a; static const int code_rep = 0x66; static const int char_bell = 0x07; class CCIR476 { unsigned char m_ltrs_to_code[128]; unsigned char m_figs_to_code[128]; bool m_valid_codes[128]; public: CCIR476() { memset( m_ltrs_to_code, 0, 128 ); memset( m_figs_to_code, 0, 128 ); for( size_t i = 0; i < 128; ++i ) m_valid_codes[i] = false ; for (int code = 0; code < 128; code++) { // Valid codes have four bits set only. This leaves three bits for error detection. // TODO: If a code is invalid, we could take the closest value in terms of bits. if (check_bits(code)) { m_valid_codes[code] = true; unsigned char figv = code_to_figs[code]; unsigned char ltrv = code_to_ltrs[code]; if ( figv != '_') { m_figs_to_code[figv] = code; } if ( ltrv != '_') { m_ltrs_to_code[ltrv] = code; } } } } void char_to_code(std::string & str, int ch, bool & ex_shift) const { ch = toupper(ch); // avoid unnecessary shifts if (ex_shift && m_figs_to_code[ch] != '\0') { str.push_back( m_figs_to_code[ch] ); } else if (!ex_shift && m_ltrs_to_code[ch] != '\0') { str.push_back( m_ltrs_to_code[ch] ); } else if (m_figs_to_code[ch] != '\0') { ex_shift = true; str.push_back( code_figs ); str.push_back( m_figs_to_code[ch] ); } else if (m_ltrs_to_code[ch] != '\0') { ex_shift = false; str.push_back( code_ltrs ); str.push_back( m_ltrs_to_code[ch] ); } } int code_to_char(int code, bool shift) const { const unsigned char * target = (shift) ? code_to_figs : code_to_ltrs; if (target[code] != '_') { return target[code]; } // default: return negated code return -code; } // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive /// Counting set bits, Brian Kernighan's way static bool check_bits(int v) { int bc = 0; while (v != 0) { bc++; v &= v - 1; } //printf("check_bits %d %d %c\n", bc, (int)code_to_ltrs[v], code_to_ltrs[v] ); return bc == 4; } }; /// This is temporary, to manipulate a multi-line string. static const char * new_line = "\n"; // Coordinates samples: // 52-08.5N 003-18.0E // 51-03.93N 001-09.17E // 50-40.2N 001-03.7W class ccir_message : public std::string { static const size_t header_len = 10 ; static const size_t trunc_len = 5 ; // Header structure is: // ZCZCabcd message text NNNN // a : Origin of the station. // b : Message type. // cd : Message number from this station. char m_origin ; char m_subject ; int m_number ; public: const char * msg_type(void) const { switch(m_subject) { case 'A' : return _("Navigational warning"); case 'B' : return _("Meteorological warning"); case 'C' : return _("Ice report"); case 'D' : return _("Search & rescue information, pirate warnings"); case 'E' : return _("Meteorological forecast"); case 'F' : return _("Pilot service message"); case 'G' : return _("AIS message"); case 'H' : return _("LORAN message"); case 'I' : return _("Not used"); case 'J' : return _("SATNAV messages"); case 'K' : return _("Other electronic navaid messages"); case 'L' : return _("Navigational warnings"); case 'T' : return _("Test transmissions (UK only)"); case 'V' : return _("Notice to fishermen (U.S. only)"); case 'W' : return _("Environmental (U.S. only)"); case 'X' : return _("Special services - allocation by IMO NAVTEX Panel"); case 'Y' : return _("Special services - allocation by IMO NAVTEX Panel"); case 'Z' : return _("No message on hand"); default : return _("Invalid navtex subject"); } } private: /// Remove non-Ascii chars, replace new-line by special character etc.... void cleanup() { /// It would be possible to do the change in place, because the new string /// it shorter than the current one, but at the expense of clarity. bool wasDelim = false, wasSpace = false, chrSeen = false ; std::string newStr ; for( iterator it = begin(); it != end(); ++it ) { switch( *it ) { case '\n': case '\r': wasDelim = true ; break ; case ' ' : case '\t': wasSpace = true ; break ; default : if( chrSeen ) { if( wasDelim ) { newStr.append(new_line); } else if( wasSpace ) { newStr.push_back(' '); } } wasDelim = false ; wasSpace = false ; chrSeen = true ; newStr.push_back( *it ); } } swap( newStr ); } void init_members() { m_origin = '?'; m_subject = '?'; m_number = 0 ; } public: ccir_message() { init_members(); } ccir_message( const std::string & s, char origin, char subject, int number ) : std::string(s) , m_origin(origin) , m_subject(subject) , m_number(number) { cleanup(); } void reset_msg() { clear(); init_members(); } typedef std::pair detect_result ; detect_result detect_header() { size_t qlen = size(); if (qlen >= header_len) { const char * comp = & (*this)[ qlen - header_len ]; if( (comp[0] == 'Z') && (comp[1] == 'C') && (comp[2] == 'Z') && (comp[3] == 'C') && (comp[4] == ' ') && isalnum(comp[5]) && isalnum(comp[6]) && isdigit(comp[7]) && isdigit(comp[8]) && // (comp[9] == '\r') ) (strchr( "\n\r", comp[9] ) ) ) { /// This returns the garbage before the valid header. // Garbage because the trailer could not be read, but maybe header OK. ccir_message msg_cut( substr( 0, size() - header_len ), m_origin, m_subject, m_number ); m_origin = comp[5]; m_subject = comp[6]; m_number = ( comp[7] - '0' ) * 10 + ( comp[8] - '0' ); // Remove the beginning useless chars. /// TODO: Read broken headers such as "ZCZC EA0?" clear(); return detect_result( true, msg_cut ); } } return detect_result( false, ccir_message() ); ; } bool detect_end() { // Should be "\r\nNNNN\r\n" theoretically, but tolerates shorter strings. static const size_t slen = 4 ; static const char stop_valid[slen + 1] = "NNNN"; size_t qlen = size(); if (qlen < slen) { return false; } std::string comp = substr(qlen - slen, slen); bool end_seen = comp == stop_valid; if( end_seen ) { erase( qlen - slen, slen ); LOG_INFO("\n%s", c_str()); } return end_seen ; } void display( const std::string & alt_string ) { std::string::operator=( alt_string ); cleanup(); long long currFreq = wf->rfcarrier(); if( ! progdefaults.NVTX_AdifLog && ! progdefaults.NVTX_KmlLog ) { return ; } const NavtexRecord * ptrNavRec = NavtexCatalog::InstCatalog().FindStation(currFreq, m_origin, progdefaults.myLocator, *this ); if( ptrNavRec != NULL ) { LOG_INFO("Locator=%s Origin=%c freq=%d name=%s lon=%lf lat=%lf", progdefaults.myLocator.c_str(), m_origin, static_cast(currFreq), ptrNavRec->name().c_str(), ptrNavRec->coordinates().longitude().angle(), ptrNavRec->coordinates().latitude().angle() ); } else { LOG_INFO("Locator=%s Origin=%c freq=%d Navtex station not found", progdefaults.myLocator.c_str(), m_origin, static_cast(currFreq) ); } if( progdefaults.NVTX_AdifLog ) { /// For updating the logbook with received messages. QsoHelper qso(MODE_NAVTEX); if( ptrNavRec ) { qso.Push(QTH, ptrNavRec->country() ); qso.Push(CALL, ptrNavRec->callsign() ); qso.Push(COUNTRY, ptrNavRec->country() ); qso.Push(GRIDSQUARE, ptrNavRec->coordinates().locator() ); qso.Push(NAME, ptrNavRec->name() ); /// If the header is clean, the message type is removed from the string. // In this context, this field cannot be used. qso.Push(XCHG1, msg_type() ); qso.Push(SRX, strformat( "%d", m_number ) ); } else { qso.Push(NAME, std::string("Station_") + m_origin ); } // Sequence of Chars and line-breaks, ASCII CR (code 13) + ASCII LF (code 10) qso.Push(NOTES, strreplace( *this, new_line, ADIF_EOL ) ); } // Adds a placemark to the navtex KML file. if( progdefaults.NVTX_KmlLog ) { if( ptrNavRec ) { KmlServer::CustomDataT custData ; custData.Push( "Callsign", ptrNavRec->callsign() ); custData.Push( "Country", ptrNavRec->country() ); custData.Push( "Locator", ptrNavRec->coordinates().locator() ); custData.Push( "Message number", m_number ); custData.Push( "Frequency", currFreq ); custData.Push( "Mode", mode_info[MODE_NAVTEX].adif_name ); custData.Push( "Message", *this ); KmlServer::GetInstance()->Broadcast( "Navtex", 0, ptrNavRec->coordinates(), 0, ptrNavRec->name(), "navtex_station", substr( 0, 20 ) + "...", custData ); } // TODO: Parse the message to extract coordinates. } } // display }; // ccir_message static const int deviation_f = 90; static const double dflt_center_freq = 1000.0 ; class navtex ; /// Implements PIMPL idiom. class navtex_implementation { enum State { NOSIGNAL, SYNC_SETUP, SYNC1, SYNC2, READ_DATA }; static const char * state_to_str( State s ) { switch( s ) { case NOSIGNAL : return "NOSIGNAL"; case SYNC_SETUP: return "SYNC_SETUP"; case SYNC1 : return "SYNC1"; case SYNC2 : return "SYNC2"; case READ_DATA : return "READ_DATA"; default : return "Unknown" ; } } bool m_only_sitor_b ; int m_message_counter ; static const size_t m_tx_block_len = 1024 ; /// Between -1 and 1. double m_tx_buf[m_tx_block_len]; size_t m_tx_counter ; navtex * m_ptr_navtex ; pthread_mutex_t m_mutex_tx ; typedef std::list TxMsgQueueT ; TxMsgQueueT m_tx_msg_queue ; double m_metric ; CCIR476 m_ccir476; typedef std::list sync_chrs_type ; sync_chrs_type m_sync_chrs; ccir_message m_curr_msg ; int m_c1, m_c2, m_c3; static const int m_zero_crossings_divisor = 4; std::vector m_zero_crossings ; long m_zero_crossing_count; double m_message_time ; double m_signal_accumulator ; double m_mark_f, m_space_f; double m_audio_average ; double m_audio_average_tc; double m_audio_minimum ; double m_time_sec; double m_baud_rate ; double m_baud_error; int m_sample_rate ; bool m_averaged_mark_state; int m_bit_duration ; bool m_old_mark_state; BiQuadraticFilter m_biquad_mark; BiQuadraticFilter m_biquad_space; BiQuadraticFilter m_biquad_lowpass; int m_bit_sample_count, m_half_bit_sample_count; State m_state; int m_sample_count; int m_next_event_count ; int m_bit_count; int m_code_bits; bool m_shift ; bool m_pulse_edge_event; int m_error_count; int m_valid_count; double m_sync_delta; bool m_alpha_phase ; bool m_header_found ; // filter method related double m_center_frequency_f ; navtex_implementation( const navtex_implementation & ); navtex_implementation(); navtex_implementation & operator=( const navtex_implementation & ); public: navtex_implementation(int the_sample_rate, bool only_sitor_b, navtex * ptr_navtex ) { pthread_mutex_init( &m_mutex_tx, NULL ); m_ptr_navtex = ptr_navtex ; m_only_sitor_b = only_sitor_b ; m_message_counter = 1 ; m_metric = 0.0 ; m_time_sec = 0.0 ; m_state = NOSIGNAL; m_message_time = 0.0 ; m_signal_accumulator = 0; m_audio_average = 0; m_audio_minimum = 256; m_sample_rate = the_sample_rate; m_bit_duration = 0; m_next_event_count = 0; m_shift = false; m_alpha_phase = false; m_header_found = false; m_center_frequency_f = dflt_center_freq; m_audio_average_tc = 1000.0 / m_sample_rate; // this value must never be zero and bigger than 10. m_baud_rate = 100; double m_bit_duration_seconds = 1.0 / m_baud_rate; m_bit_sample_count = (int) (m_sample_rate * m_bit_duration_seconds + 0.5); m_half_bit_sample_count = m_bit_sample_count / 2; m_pulse_edge_event = false; m_error_count = 0; m_valid_count = 0; m_sample_count = 0; m_next_event_count = 0; m_zero_crossing_count = 0; /// Maybe m_bit_sample_count is not a multiple of m_zero_crossings_divisor. m_zero_crossings.resize( ( m_bit_sample_count + m_zero_crossings_divisor - 1 ) / m_zero_crossings_divisor, 0 ); m_sync_delta = 0; m_old_mark_state = false; m_averaged_mark_state = false ; set_filter_values(); configure_filters(); } ~navtex_implementation() { pthread_mutex_destroy( &m_mutex_tx ); } private: void set_filter_values() { // carefully manage the parameters WRT the center frequency // Q must change with frequency // try to maintain a zero mixer output at the carrier frequency double qv = m_center_frequency_f + (4.0 * 1000 / m_center_frequency_f); m_mark_f = qv + deviation_f; m_space_f = qv - deviation_f; } void configure_filters() { const double mark_space_filter_q = 6 * m_center_frequency_f / 1000.0; m_biquad_mark.configure(BiQuadraticFilter::BANDPASS, m_mark_f, m_sample_rate, mark_space_filter_q); m_biquad_space.configure(BiQuadraticFilter::BANDPASS, m_space_f, m_sample_rate, mark_space_filter_q); static const double lowpass_filter_f = 140.0; static const double invsqr2 = 1.0 / sqrt(2); m_biquad_lowpass.configure(BiQuadraticFilter::LOWPASS, lowpass_filter_f, m_sample_rate, invsqr2); } void set_state(State s) { if (s != m_state) { m_state = s; set_label_from_state(); } } /// The parameter is appended at the message end. void flush_message(const std::string & extra_info) { if( m_header_found ) { m_header_found = false; display_message( m_curr_msg, m_curr_msg + extra_info ); } else { display_message( m_curr_msg, "[Lost header]:" + m_curr_msg + extra_info ); } m_curr_msg.reset_msg(); m_message_time = m_time_sec; } /// Checks that we have no waited too long, and if so, flushes the message with a specific terminator. void process_timeout() { /// No messaging in SitorB if ( m_only_sitor_b ) { return ; } bool timeOut = m_time_sec - m_message_time > 600 ; if ( ! timeOut ) return ; LOG_INFO("Timeout: time_sec=%lf, message_time=%lf", m_time_sec, m_message_time ); // TODO: Headerless messages could be dropped if shorter than X chars. flush_message(":"); } void process_messages(int c) { m_curr_msg.push_back((char) c); /// No header nor trailer for plain SitorB. if ( m_only_sitor_b ) { m_header_found = true; m_message_time = m_time_sec; return; } ccir_message::detect_result msg_cut = m_curr_msg.detect_header(); if ( msg_cut.first ) { /// Maybe the message was already valid. if( m_header_found ) { display_message( msg_cut.second, msg_cut.second + ":[Lost trailer]" ); } else { /// Maybe only non-significant chars. if( ! msg_cut.second.empty() ) { display_message( msg_cut.second, "[Lost header]:" + msg_cut.second + ":[Lost trailer]" ); } } m_header_found = true; m_message_time = m_time_sec; } else { // valid message state if ( m_curr_msg.detect_end() ) { flush_message(""); } } } // two phases: alpha and rep // marked during sync by code_alpha and code_rep // then for data: rep phase character is sent first, // then, three chars later, same char is sent in alpha phase bool process_char(int code) { bool success = CCIR476::check_bits(code); int chr = -1; // force phasing with the two phasing characters if (code == code_rep) { m_alpha_phase = false; } else if (code == code_alpha) { m_alpha_phase = true; } if (!m_alpha_phase) { m_c1 = m_c2; m_c2 = m_c3; m_c3 = code; } else { // alpha channel bool strict = false ; if (strict) { if (success && m_c1 == code) { chr = code; } } else { if (success) { chr = code; } else if (CCIR476::check_bits(m_c1)) { chr = m_c1; LOG_DEBUG("FEC replacement: %x -> %x", code, m_c1); } } if (chr == -1) { LOG_DEBUG("Fail all options: %x %x", code, m_c1); } else { switch (chr) { case code_rep: break; case code_alpha: break; case code_beta: break; case code_char32: break; case code_ltrs: m_shift = false; break; case code_figs: m_shift = true; break; default: chr = m_ccir476.code_to_char(chr, m_shift); if (chr < 0) { LOG_INFO(_("Missed this code: %x"), abs(chr)); } else { filter_print(chr); process_messages(chr); } break; } // switch } // if test != -1 } // alpha channel // alpha/rep phasing m_alpha_phase = !m_alpha_phase; return success; } void filter_print(int c) { if (c == char_bell) { /// TODO: It should be a beep, but French navtex displays a quote. put_rx_char('\''); } else if (c != -1 && c != '\r' && c != code_alpha && c != code_rep) { put_rx_char(c); } } void compute_metric(void) { static double avg_ratio = 0.0 ; static const double width_f = 10.0 ; double numer_mark = wf->powerDensity(m_mark_f, width_f); double numer_space = wf->powerDensity(m_space_f, width_f); double numer_mid = wf->powerDensity(m_center_frequency_f, width_f); double denom = wf->powerDensity(m_center_frequency_f, 2 * deviation_f) + 1e-10; double ratio = ( numer_space + numer_mark + numer_mid ) / denom ; /// The only power in this band should come from the signal. m_metric = 100 * decayavg( avg_ratio, ratio, 20 ); // LOG_INFO("m_metric=%lf",m_metric); m_ptr_navtex->display_metric(m_metric); } void process_afc() { if( progStatus.afconoff == false ) return ; static size_t cnt_upd = 0 ; static const size_t delay_upd = 50 ; ++cnt_upd ; /// AFC from time to time. if( ( cnt_upd % delay_upd ) != 0 ) { return ; } static int cnt_read_data = 0 ; /// This centers the carrier where the activity is the strongest. static const int bw[][2] = { { -deviation_f - 2, -deviation_f + 8 }, { deviation_f - 8, deviation_f + 2 } }; double max_carrier = wf->powerDensityMaximum( 2, bw ); /// Do not change the frequency too quickly if an image is received. double next_carr = 0.0 ; State lingering_state ; if( m_state == READ_DATA ) { /// Proportional to the number of lines between each AFC update. cnt_read_data = delay_upd / 20 ; lingering_state = READ_DATA ; } else { if( cnt_read_data ) { --cnt_read_data ; lingering_state = READ_DATA ; } else { lingering_state = m_state ; /// Maybe this is the phasing signal, so we recenter. double pwr_left = wf->powerDensity ( max_carrier - deviation_f, 10 ); double pwr_right = wf->powerDensity( max_carrier + deviation_f, 10 ); static const double ratio_left_right = 5.0 ; if( pwr_left > ratio_left_right * pwr_right ) { max_carrier -= deviation_f ; } else if ( ratio_left_right * pwr_left < pwr_right ) { max_carrier += deviation_f ; } } } switch( lingering_state ) { case NOSIGNAL: case SYNC_SETUP: next_carr = max_carrier ; break; case SYNC1: case SYNC2: next_carr = decayavg( m_center_frequency_f, max_carrier, 1 ); break; case READ_DATA: // It will stay stable for a couple of calls. if( max_carrier < m_center_frequency_f ) next_carr = std::max( max_carrier, m_center_frequency_f - 3.0 ); else if( max_carrier > m_center_frequency_f ) next_carr = std::min( max_carrier, m_center_frequency_f + 3.0 ); else next_carr = max_carrier ; break; default: LOG_ERROR("Should not happen: lingering_state=%d", (int)lingering_state ); break ; } LOG_DEBUG("m_center_frequency_f=%f max_carrier=%f next_carr=%f cnt_read_data=%d", (double)m_center_frequency_f, max_carrier, next_carr, cnt_read_data ); double delta = fabs( m_center_frequency_f - next_carr ); if( delta > 1.0 ) { // Hertz. m_ptr_navtex->set_freq(next_carr); } } /* A NAVTEX message is built on SITOR collective B-mode and consists of: * a phasing signal of at least ten seconds * the four characters "ZCZC" that identify the end of phasing * a single space * four characters B1, B2, B3 and B4: * B1 is an alpha character identifying the station, * B2 is an alpha character used to identify the subject of the message. * B3 and B4 are two-digit numerics identifying individual messages * a carriage return and a line feed * the information * the four characters "NNNN" to identify the end of information * a carriage return and two line feeds * either * 5 or more seconds of phasing signal and another message starting with "ZCZC" or * an end of emission idle signal alpha for at least 2 seconds. */ public: void process_data(const double * data, int nb_samples) { process_afc(); process_timeout(); for( int i =0; i < nb_samples; ++i ) { short v = static_cast(32767 * data[i]); m_time_sec = m_sample_count / m_sample_rate ; double dv = v; // separate mark and space by narrow filtering double mark_level = m_biquad_mark.filter(dv); double space_level = m_biquad_space.filter(dv); double mark_abs = fabs(mark_level); double space_abs = fabs(space_level); m_audio_average += (std::max(mark_abs, space_abs) - m_audio_average) * m_audio_average_tc; m_audio_average = std::max(.1, m_audio_average); // produce difference of absolutes of mark and space double diffabs = (mark_abs - space_abs); diffabs /= m_audio_average; // now low-pass the resulting difference double logic_level = m_biquad_lowpass.filter(diffabs); bool mark_state = (logic_level > 0); m_signal_accumulator += (mark_state) ? 1 : -1; m_bit_duration++; // adjust signal synchronization over time // by detecting zero crossings if (mark_state != m_old_mark_state) { // a valid bit duration must be longer than bit duration / 2 if ((m_bit_duration % m_bit_sample_count) > m_half_bit_sample_count) { // create a relative index for this zero crossing assert( m_sample_count - m_next_event_count + m_bit_sample_count * 8 >= 0 ); size_t index = size_t((m_sample_count - m_next_event_count + m_bit_sample_count * 8) % m_bit_sample_count); // TODO: This never happened so could be replaced by assert() for speed-up. // Size = m_bit_sample_count / m_zero_crossings_divisor if( index / m_zero_crossings_divisor >= m_zero_crossings.size() ) { LOG_ERROR("index=%d m_zero_crossings_divisor=%d m_zero_crossings.size()=%d\n", (int)index, m_zero_crossings_divisor, (int)m_zero_crossings.size() ); LOG_ERROR("m_sample_count=%d m_next_event_count=%d m_bit_sample_count=%d\n", m_sample_count, m_next_event_count, m_bit_sample_count ); exit(EXIT_FAILURE); } m_zero_crossings.at( index / m_zero_crossings_divisor )++; } m_bit_duration = 0; } m_old_mark_state = mark_state; if (m_sample_count % m_bit_sample_count == 0) { m_zero_crossing_count++; static const int zero_crossing_samples = 16; if (m_zero_crossing_count >= zero_crossing_samples) { int best = 0; int index = 0; // locate max zero crossing for (size_t i = 0; i < m_zero_crossings.size(); i++) { int q = m_zero_crossings[i]; m_zero_crossings[i] = 0; if (q > best) { best = q; index = i; } } if (best > 0) { // if there is a basis for choosing // create a signed correction value index *= m_zero_crossings_divisor; index = ((index + m_half_bit_sample_count) % m_bit_sample_count) - m_half_bit_sample_count; // limit loop gain double dbl_idx = (double)index / 8.0 ; // m_sync_delta is a temporary value that is // used once, then reset to zero m_sync_delta = dbl_idx; // m_baud_error is persistent -- used by baud error label m_baud_error = dbl_idx; } m_zero_crossing_count = 0; } } // flag the center of signal pulses m_pulse_edge_event = m_sample_count >= m_next_event_count; if (m_pulse_edge_event) { m_averaged_mark_state = (m_signal_accumulator > 0) ^ m_ptr_navtex->get_reverse(); m_signal_accumulator = 0; // set new timeout value, include zero crossing correction m_next_event_count = m_sample_count + m_bit_sample_count + (int) (m_sync_delta + 0.5); m_sync_delta = 0; } if (m_audio_average < m_audio_minimum) { set_state(NOSIGNAL); } else if (m_state == NOSIGNAL) { set_state(SYNC_SETUP); } switch (m_state) { case NOSIGNAL: break; case SYNC_SETUP: m_bit_count = -1; m_code_bits = 0; m_error_count = 0; m_valid_count = 0; m_shift = false; m_sync_chrs.clear(); set_state(SYNC1); break; // scan indefinitely for valid bit pattern case SYNC1: if (m_pulse_edge_event) { m_code_bits = (m_code_bits >> 1) | ( m_averaged_mark_state ? 64 : 0); if (CCIR476::check_bits(m_code_bits)) { m_sync_chrs.push_back(m_code_bits); m_bit_count = 0; m_code_bits = 0; set_state(SYNC2); } } break; // sample and validate bits in groups of 7 case SYNC2: // find any bit alignment that produces a valid character // then test that synchronization in subsequent groups of 7 bits if (m_pulse_edge_event) { m_code_bits = (m_code_bits >> 1) | ( m_averaged_mark_state ? 64 : 0); m_bit_count++; if (m_bit_count == 7) { if (CCIR476::check_bits(m_code_bits)) { m_sync_chrs.push_back(m_code_bits); m_code_bits = 0; m_bit_count = 0; m_valid_count++; // successfully read 4 characters? if (m_valid_count == 4) { for( sync_chrs_type::const_iterator it = m_sync_chrs.begin(), en = m_sync_chrs.end(); it != en; ++it ) { process_char(*it); } set_state(READ_DATA); } } else { // failed subsequent bit test m_code_bits = 0; m_bit_count = 0; // LOG_INFO("restarting sync"); set_state(SYNC_SETUP); } } } break; case READ_DATA: if (m_pulse_edge_event) { m_code_bits = (m_code_bits >> 1) | ( m_averaged_mark_state ? 64 : 0); m_bit_count++; if (m_bit_count == 7) { if (m_error_count > 0) { LOG_DEBUG("Error count: %d", m_error_count); } if (process_char(m_code_bits)) { if (m_error_count > 0) { m_error_count--; } } else { m_error_count++; if (m_error_count > 2) { LOG_DEBUG("Returning to sync"); set_state(SYNC_SETUP); } } m_bit_count = 0; m_code_bits = 0; } } break; } m_sample_count++; } compute_metric(); } /// This updates the window label according to the state. void set_label_from_state(void) const { put_status( state_to_str(m_state) ); } private: /// Each received message is pushed in this queue, so it can be read by XML/RPC. syncobj m_sync_rx ; std::queue< std::string > m_received_messages ; void display_message( ccir_message & ccir_msg, const std::string & alt_string ) { if( ccir_msg.size() >= (size_t)progdefaults.NVTX_MinSizLoggedMsg ) { try { ccir_msg.display(alt_string); put_received_message( alt_string ); } catch( const std::exception & exc ) { LOG_WARN("Caught %s", exc.what() ); } } else { LOG_INFO("Do not log short message:%s", ccir_msg.c_str() ); } } /// Called by the engine each time a message is saved. void put_received_message( const std::string &message ) { guard_lock g( m_sync_rx.mtxp() ); LOG_INFO("%s", message.c_str() ); m_received_messages.push( message ); m_sync_rx.signal(); } public: /// Returns a received message, by chronological order. std::string get_received_message( double max_seconds ) { guard_lock g( m_sync_rx.mtxp() ); LOG_DEBUG("Delay=%f", max_seconds ); if( m_received_messages.empty() ) { if( ! m_sync_rx.wait(max_seconds) ) return "Timeout"; } std::string message = m_received_messages.front(); m_received_messages.pop(); return message ; } // http://www.arachnoid.com/JNX/index.html // "NAUTICAL" becomes: // rep alpha rep alpha N alpha A alpha U N T A I U C T A I L C blank A blank L std::string create_fec( const std::string & str ) const { std::string res ; const size_t sz = str.size(); static const size_t offset = 2 ; for( size_t i = 0 ; i < offset ; ++i ) { res.push_back( code_rep ); res.push_back( code_alpha ); } for ( size_t i = 0; i < sz; ++i ) { res.push_back( str[i] ); res.push_back( i >= offset ? str[ i - offset ] : code_alpha ); } for( size_t i = 0 ; i < offset ; ++i ) { res.push_back( code_char32 ); res.push_back( str[ sz - offset + i ] ); } return res; } /// Note path std::string can contain null characters. TODO: Beware of the extra copy constructor. std::string encode( const std::string & str ) const { std::string res ; bool shift = false ; for ( size_t i = 0, sz = str.size(); i < sz; ++ i ) { m_ccir476.char_to_code(res, str[i], shift ); } return res; } void tx_flush() { if( m_tx_counter != 0 ) { m_ptr_navtex->ModulateXmtr( m_tx_buf, m_tx_counter ); m_tx_counter = 0 ; } } /// Input value must be between -1 and 1 void add_sample( double sam ) { m_tx_buf[ m_tx_counter++ ] = sam ; if( m_tx_counter == m_tx_block_len ) { tx_flush(); } } void send_sine( double seconds, double freq ) { int nb_samples = seconds * m_ptr_navtex->get_samplerate(); double max_level = 0.99 ; // Between -1.0 and 1.0 double ratio = 2.0 * M_PI * (double)freq / (double)m_ptr_navtex->get_samplerate() ; for (int i = 0; i < nb_samples ; ++i ) { add_sample( max_level * sin( i * ratio ) ); } } void send_phasing( int seconds ) { send_sine( seconds, m_center_frequency_f ); } void send_bit( bool bit ) { send_sine( 1.0 / (double)m_baud_rate, bit ? m_mark_f : m_space_f ); } void send_string( const std::string & msg ) { std::string encod = encode( msg ); std::string sevenbits = create_fec( encod ); for( size_t i = 0, sz = sevenbits.size(); i < sz; i++ ) { char tmp_stat[64]; sprintf( tmp_stat, "Transmission %d%%", (int)( 100.0 * ( i + 1.0 ) / sz ) ); put_status( tmp_stat ); char c = sevenbits[i]; for( size_t j = 0; j < 7 ; ++j, c >>= 1 ) { send_bit( c & 1 ); } } } void send_message( const std::string & msg, bool is_first, bool is_last ) { put_status( "Transmission" ); m_tx_counter = 0 ; if( m_only_sitor_b ) { send_string( msg ); } else { put_status( "Phasing" ); send_phasing( is_first ? 10.0 : 5.0 ); char preamble[64]; const char origin = 'Z' ; // Never seen this value. const char subject = 'I' ; // This code is not used. sprintf( preamble, "ZCZC %c%c%02d\r\n", origin, subject, m_message_counter ); m_message_counter = ( m_message_counter + 1 ) % 100 ; /// The extra cr-nl before NNNN is not in the specification but clarify things. std::string full_msg = preamble + msg + "\r\nNNNN\r\n\n"; send_string( full_msg ); // 5 or more seconds of phasing signal and another message starting with "ZCZC" or // an end of emission idle signal alpha for at least 2 seconds. */ if( is_last ) { put_status( "Trailer" ); send_phasing(2.0); } } tx_flush(); put_status( "" ); } void append_message_to_send( const std::string & msg ) { guard_lock g( &m_mutex_tx ); m_tx_msg_queue.push_back( msg ); } void transmit_message_async( const std::string & msg ) { LOG_INFO("%s", msg.c_str() ); append_message_to_send( msg ); bool is_first = true ; for(;;) { guard_lock g( &m_mutex_tx ); TxMsgQueueT::iterator it = m_tx_msg_queue.begin(), en = m_tx_msg_queue.end(); if( it == en ) break ; TxMsgQueueT::iterator it_next = it ; ++it_next ; bool is_last = it_next == en ; send_message( *it, is_first, is_last ); is_first = false ; m_tx_msg_queue.erase(it); } } void process_tx() { std::string msg ; for(;;) { int c = get_tx_char(); if( c == GET_TX_CHAR_NODATA ) { break ; } msg.push_back( c ); } for( size_t i = 0 ; i < msg.size(); ++ i) { put_echo_char( msg[i] ); } transmit_message_async(msg); } void set_carrier( double freq ) { m_center_frequency_f = freq; set_filter_values(); configure_filters(); } }; // navtex_implementation #ifdef NAVTEX_COMMAND_LINE /// For testing purpose, this file can be compiled and run separately as a command-line program. int main(int n, const char ** v ) { printf("%s\n", v[1] ); FILE * f = fopen( v[1], "r" ); fseek( f, 0, SEEK_END ); long l = ftell( f ); printf("l=%ld\n", l); char * buf = new char[l]; fseek( f, 0, SEEK_SET ); size_t lr = fread( buf, 1, l, f ); if( lr - l ) { printf("Err reading\n"); exit(EXIT_FAILURE); }; navtex_implementation nv(11025) ; double * tmp = new double[l/2]; const short * shrt = (const short *)buf; for( int i = 0; i < l/2; i++ ) tmp[i] = ( (double)shrt[i] ) / 32767.0; nv.process_data( tmp, l / 2 ); return 0 ; } #endif // NAVTEX_COMMAND_LINE navtex::navtex (trx_mode md) { modem::cap |= CAP_AFC | CAP_REV; navtex::mode = md; modem::samplerate = 11025; modem::bandwidth = 2 * deviation_f ; modem::reverse = false ; bool only_sitor_b = false ; switch( md ) { case MODE_NAVTEX : only_sitor_b = false ; break; case MODE_SITORB : only_sitor_b = true ; break; default : LOG_ERROR("Unknown mode"); } m_impl = new navtex_implementation( modem::samplerate, only_sitor_b, this ); } navtex::~navtex() { if( m_impl ) { delete m_impl ; } } void navtex::rx_init() { put_MODEstatus(modem::mode); } void navtex::restart() { } int navtex::rx_process(const double *buf, int len) { m_impl->process_data( buf, len ); return 0; } void navtex::tx_init(SoundBase *sc) { modem::scard = sc; // SoundBase videoText(); // In trx/modem.cxx } int navtex::tx_process() { m_impl->process_tx(); return -1; } void navtex::set_freq( double freq ) { modem::set_freq( freq ); m_impl->set_carrier( freq ); } /// This returns the next received message. std::string navtex::get_message(int max_seconds) { return m_impl->get_received_message(max_seconds); } std::string navtex::send_message(const std::string &msg) { m_impl->append_message_to_send(msg); start_tx(); // If this is not done. return ""; } fldigi-3.21.80/src/rsid/0000775000175000017500000000000012313333727011662 500000000000000fldigi-3.21.80/src/rsid/rsid_defs.cxx0000664000175000017500000003644712313064025014276 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // Syntax: ELEM_(rsid_code, rsid_tag, fldigi_mode) // fldigi_mode is NUM_MODES if mode is not available in fldigi, // otherwise one of the tags defined in globals.h. // rsid_tag is stringified and may be shown to the user. /* ELEM_(263, ESCAPE, NUM_MODES) \ */ #undef ELEM_ #define RSID_LIST \ \ /* ESCAPE used to transition to 2nd RSID set */ \ \ ELEM_(6, ESCAPE, NUM_MODES) \ \ ELEM_(1, BPSK31, MODE_PSK31) \ ELEM_(110, QPSK31, MODE_QPSK31) \ ELEM_(2, BPSK63, MODE_PSK63) \ ELEM_(3, QPSK63, MODE_QPSK63) \ ELEM_(4, BPSK125, MODE_PSK125) \ ELEM_(5, QPSK125, MODE_QPSK125) \ ELEM_(126, BPSK250, MODE_PSK250) \ ELEM_(127, QPSK250, MODE_QPSK250) \ ELEM_(173, BPSK500, MODE_PSK500) \ \ ELEM_(183, PSK125R, MODE_PSK125R) \ ELEM_(186, PSK250R, MODE_PSK250R) \ ELEM_(187, PSK500R, MODE_PSK500R) \ \ ELEM_(7, PSKFEC31, NUM_MODES) \ ELEM_(8, PSK10, NUM_MODES) \ \ ELEM_(9, MT63_500_LG, MODE_MT63_500L) \ ELEM_(10, MT63_500_ST, MODE_MT63_500S) \ ELEM_(11, MT63_500_VST, NUM_MODES) \ ELEM_(12, MT63_1000_LG, MODE_MT63_1000L) \ ELEM_(13, MT63_1000_ST, MODE_MT63_1000S) \ ELEM_(14, MT63_1000_VST, NUM_MODES) \ ELEM_(15, MT63_2000_LG, MODE_MT63_2000L) \ ELEM_(17, MT63_2000_ST, MODE_MT63_2000S) \ ELEM_(18, MT63_2000_VST, NUM_MODES) \ \ ELEM_(19, PSKAM10, NUM_MODES) \ ELEM_(20, PSKAM31, NUM_MODES) \ ELEM_(21, PSKAM50, NUM_MODES) \ \ ELEM_(22, PSK63F, MODE_PSK63F) \ ELEM_(23, PSK220F, NUM_MODES) \ \ ELEM_(24, CHIP64, NUM_MODES) \ ELEM_(25, CHIP128, NUM_MODES) \ \ ELEM_(26, CW, MODE_CW) \ \ ELEM_(27, CCW_OOK_12, NUM_MODES) \ ELEM_(28, CCW_OOK_24, NUM_MODES) \ ELEM_(29, CCW_OOK_48, NUM_MODES) \ ELEM_(30, CCW_FSK_12, NUM_MODES) \ ELEM_(31, CCW_FSK_24, NUM_MODES) \ ELEM_(33, CCW_FSK_48, NUM_MODES) \ \ ELEM_(34, PACTOR1_FEC, NUM_MODES) \ \ ELEM_(113, PACKET_110, NUM_MODES) \ ELEM_(35, PACKET_300, NUM_MODES) \ ELEM_(36, PACKET_1200, NUM_MODES) \ \ ELEM_(37, RTTY_ASCII_7, MODE_RTTY) \ ELEM_(38, RTTY_ASCII_8, MODE_RTTY) \ ELEM_(39, RTTY_45, MODE_RTTY) \ ELEM_(40, RTTY_50, MODE_RTTY) \ ELEM_(41, RTTY_75, MODE_RTTY) \ \ ELEM_(42, AMTOR_FEC, NUM_MODES) \ \ ELEM_(43, THROB_1, MODE_THROB1) \ ELEM_(44, THROB_2, MODE_THROB2) \ ELEM_(45, THROB_4, MODE_THROB4) \ ELEM_(46, THROBX_1, MODE_THROBX1) \ ELEM_(47, THROBX_2, MODE_THROBX2) \ ELEM_(146, THROBX_4, MODE_THROBX4) \ \ ELEM_(204, CONTESTIA_4_125, MODE_CONTESTIA) \ ELEM_(55, CONTESTIA_4_250, MODE_CONTESTIA) \ ELEM_(54, CONTESTIA_4_500, MODE_CONTESTIA) \ ELEM_(255, CONTESTIA_4_1000, MODE_CONTESTIA) \ ELEM_(254, CONTESTIA_4_2000, MODE_CONTESTIA) \ \ ELEM_(169, CONTESTIA_8_125, MODE_CONTESTIA) \ ELEM_(49, CONTESTIA_8_250, MODE_CONTESTIA) \ ELEM_(52, CONTESTIA_8_500, MODE_CONTESTIA) \ ELEM_(117, CONTESTIA_8_1000, MODE_CONTESTIA) \ ELEM_(247, CONTESTIA_8_2000, MODE_CONTESTIA) \ \ ELEM_(50, CONTESTIA_16_500, MODE_CONTESTIA) \ ELEM_(53, CONTESTIA_16_1000, MODE_CONTESTIA) \ ELEM_(259, CONTESTIA_16_2000, MODE_CONTESTIA) \ \ ELEM_(51, CONTESTIA_32_1000, MODE_CONTESTIA) \ ELEM_(201, CONTESTIA_32_2000, MODE_CONTESTIA) \ \ ELEM_(194, CONTESTIA_64_500, MODE_CONTESTIA) \ ELEM_(193, CONTESTIA_64_1000, MODE_CONTESTIA) \ ELEM_(191, CONTESTIA_64_2000, MODE_CONTESTIA) \ \ ELEM_(56, VOICE, NUM_MODES) \ \ ELEM_(60, MFSK8, MODE_MFSK8) \ ELEM_(57, MFSK16, MODE_MFSK16) \ ELEM_(147, MFSK32, MODE_MFSK32) \ \ ELEM_(148, MFSK11, MODE_MFSK11) \ ELEM_(152, MFSK22, MODE_MFSK22) \ \ ELEM_(61, RTTYM_8_250, NUM_MODES) \ ELEM_(62, RTTYM_16_500, NUM_MODES) \ ELEM_(63, RTTYM_32_1000, NUM_MODES) \ ELEM_(65, RTTYM_8_500, NUM_MODES) \ ELEM_(66, RTTYM_16_1000, NUM_MODES) \ ELEM_(67, RTTYM_4_500, NUM_MODES) \ ELEM_(68, RTTYM_4_250, NUM_MODES) \ ELEM_(119, RTTYM_8_1000, NUM_MODES) \ ELEM_(170, RTTYM_8_125, NUM_MODES) \ \ ELEM_(203, OLIVIA_4_125, MODE_OLIVIA) \ ELEM_(75, OLIVIA_4_250, MODE_OLIVIA_4_250) \ ELEM_(74, OLIVIA_4_500, MODE_OLIVIA_4_500) \ ELEM_(229, OLIVIA_4_1000, MODE_OLIVIA) \ ELEM_(238, OLIVIA_4_2000, MODE_OLIVIA) \ \ ELEM_(163, OLIVIA_8_125, MODE_OLIVIA) \ ELEM_(69, OLIVIA_8_250, MODE_OLIVIA_8_250) \ ELEM_(72, OLIVIA_8_500, MODE_OLIVIA_8_500) \ ELEM_(116, OLIVIA_8_1000, MODE_OLIVIA_8_1000) \ ELEM_(214, OLIVIA_8_2000, MODE_OLIVIA) \ \ ELEM_(70, OLIVIA_16_500, MODE_OLIVIA_16_500) \ ELEM_(73, OLIVIA_16_1000, MODE_OLIVIA) \ ELEM_(234, OLIVIA_16_2000, MODE_OLIVIA) \ \ ELEM_(71, OLIVIA_32_1000, MODE_OLIVIA_32_1000) \ ELEM_(221, OLIVIA_32_2000, MODE_OLIVIA) \ \ ELEM_(211, OLIVIA_64_2000, MODE_OLIVIA_64_2000) \ \ ELEM_(76, PAX, NUM_MODES) \ ELEM_(77, PAX2, NUM_MODES) \ ELEM_(78, DOMINOF, NUM_MODES) \ ELEM_(79, FAX, NUM_MODES) \ ELEM_(81, SSTV, NUM_MODES) \ \ ELEM_(84, DOMINOEX_4, MODE_DOMINOEX4) \ ELEM_(85, DOMINOEX_5, MODE_DOMINOEX5) \ ELEM_(86, DOMINOEX_8, MODE_DOMINOEX8) \ ELEM_(87, DOMINOEX_11, MODE_DOMINOEX11) \ ELEM_(88, DOMINOEX_16, MODE_DOMINOEX16) \ ELEM_(90, DOMINOEX_22, MODE_DOMINOEX22) \ ELEM_(92, DOMINOEX_4_FEC, MODE_DOMINOEX4) \ ELEM_(93, DOMINOEX_5_FEC, MODE_DOMINOEX5) \ ELEM_(97, DOMINOEX_8_FEC, MODE_DOMINOEX8) \ ELEM_(98, DOMINOEX_11_FEC, MODE_DOMINOEX11) \ ELEM_(99, DOMINOEX_16_FEC, MODE_DOMINOEX16) \ ELEM_(101, DOMINOEX_22_FEC, MODE_DOMINOEX22) \ \ ELEM_(104, FELD_HELL, MODE_FELDHELL) \ ELEM_(105, PSK_HELL, NUM_MODES) \ ELEM_(106, HELL_80, MODE_HELL80) \ ELEM_(107, FM_HELL_105, MODE_FSKH105) \ ELEM_(108, FM_HELL_245, NUM_MODES) \ \ ELEM_(114, MODE_141A, NUM_MODES) \ ELEM_(123, DTMF, NUM_MODES) \ ELEM_(125, ALE400, NUM_MODES) \ ELEM_(131, FDMDV, NUM_MODES) \ \ ELEM_(132, JT65_A, NUM_MODES) \ ELEM_(134, JT65_B, NUM_MODES) \ ELEM_(135, JT65_C, NUM_MODES) \ \ ELEM_(136, THOR_4, MODE_THOR4) \ ELEM_(137, THOR_8, MODE_THOR8) \ ELEM_(138, THOR_16, MODE_THOR16) \ ELEM_(139, THOR_5, MODE_THOR5) \ ELEM_(143, THOR_11, MODE_THOR11) \ ELEM_(145, THOR_22, MODE_THOR22) \ \ ELEM_(153, CALL_ID, NUM_MODES) \ \ ELEM_(155, PACKET_PSK1200, NUM_MODES) \ ELEM_(156, PACKET_PSK250, NUM_MODES) \ ELEM_(159, PACKET_PSK63, NUM_MODES) \ \ ELEM_(172, MODE_188_110A_8N1, NUM_MODES) \ \ /* NONE must be the last element */ \ ELEM_(0, NONE, NUM_MODES) #define ELEM_(code_, tag_, mode_) RSID_ ## tag_ = code_, enum { RSID_LIST }; #undef ELEM_ #define ELEM_(code_, tag_, mode_) { RSID_ ## tag_, mode_, #tag_ }, const RSIDs cRsId::rsid_ids_1[] = { RSID_LIST }; #undef ELEM_ const int cRsId::rsid_ids_size1 = sizeof(rsid_ids_1)/sizeof(*rsid_ids_1) - 1; //====================================================================== /* ELEM_(6, ESCAPE2, NUM_MODES) \ */ #define RSID_LIST2 \ ELEM2_(450, PSK63RX4, MODE_4X_PSK63R) \ ELEM2_(457, PSK63RX5, MODE_5X_PSK63R) \ ELEM2_(458, PSK63RX10, MODE_10X_PSK63R) \ ELEM2_(460, PSK63RX20, MODE_20X_PSK63R) \ ELEM2_(462, PSK63RX32, MODE_32X_PSK63R) \ \ ELEM2_(467, PSK125RX4, MODE_4X_PSK125R) \ ELEM2_(497, PSK125RX5, MODE_5X_PSK125R) \ ELEM2_(513, PSK125RX10, MODE_10X_PSK125R) \ ELEM2_(519, PSK125X12, MODE_12X_PSK125) \ ELEM2_(522, PSK125RX12, MODE_12X_PSK125R) \ ELEM2_(527, PSK125RX16, MODE_16X_PSK125R) \ \ ELEM2_(529, PSK250RX2, MODE_2X_PSK250R) \ ELEM2_(533, PSK250RX3, MODE_3X_PSK250R) \ ELEM2_(539, PSK250RX5, MODE_5X_PSK250R) \ ELEM2_(541, PSK250X6, MODE_6X_PSK250) \ ELEM2_(545, PSK250RX6, MODE_6X_PSK250R) \ ELEM2_(551, PSK250RX7, MODE_7X_PSK250R) \ \ ELEM2_(553, PSK500RX2, MODE_2X_PSK500R) \ ELEM2_(558, PSK500RX3, MODE_3X_PSK500R) \ ELEM2_(564, PSK500RX4, MODE_4X_PSK500R) \ ELEM2_(566, PSK500X2, MODE_2X_PSK500) \ ELEM2_(569, PSK500X4, MODE_4X_PSK500) \ \ ELEM2_(570, PSK1000, MODE_PSK1000) \ ELEM2_(580, PSK1000R, MODE_PSK1000R) \ ELEM2_(587, PSK1000X2, MODE_2X_PSK1000) \ ELEM2_(595, PSK1000RX2, MODE_2X_PSK1000R) \ ELEM2_(604, PSK800RX2, MODE_2X_PSK800R) \ ELEM2_(610, PSK800X2, MODE_2X_PSK800) \ \ ELEM2_(620, MFSK64, MODE_MFSK64) \ ELEM2_(625, MFSK128, MODE_MFSK128) \ \ ELEM2_(639, THOR25x4, MODE_THOR25x4) \ ELEM2_(649, THOR50x1, MODE_THOR50x1) \ ELEM2_(653, THOR50x2, MODE_THOR50x2) \ ELEM2_(658, THOR100, MODE_THOR100) \ \ ELEM2_(662, DOMINOEX_44, MODE_DOMINOEX44) \ ELEM2_(681, DOMINOEX_88, MODE_DOMINOEX88) \ \ ELEM2_(687, MFSK31, MODE_MFSK31) \ \ ELEM2_(1026, MFSK64L, MODE_MFSK64L) \ ELEM2_(1029, MFSK128L, MODE_MFSK128L) \ \ ELEM2_(0, NONE2, NUM_MODES) #define ELEM2_(code_, tag_, mode_) RSID_ ## tag_ = code_, enum { RSID_LIST2 }; #undef ELEM2_ #define ELEM2_(code_, tag_, mode_) { RSID_ ## tag_, mode_, #tag_ }, const RSIDs cRsId::rsid_ids_2[] = { RSID_LIST2 }; #undef ELEM2_ const int cRsId::rsid_ids_size2 = sizeof(rsid_ids_2)/sizeof(*rsid_ids_2) - 1; fldigi-3.21.80/src/rsid/rsid.cxx0000664000175000017500000006611612313147652013301 00000000000000// ---------------------------------------------------------------------------- // // rsid.cxx // // Copyright (C) 2008-2012 // Dave Freese, W1HKJ // Copyright (C) 2009-2012 // Stelios Bounanos, M0GLD // Copyright (C) 2012 // John Douyere, VK2ETA // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "rsid.h" #include "filters.h" #include "misc.h" #include "trx.h" #include "fl_digi.h" #include "configuration.h" #include "confdialog.h" #include "qrunner.h" #include "notify.h" #include "debug.h" #include "main.h" #include "arq_io.h" LOG_FILE_SOURCE(debug::LOG_MODEM); #include "rsid_defs.cxx" #define RSWINDOW 1 const int cRsId::Squares[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 0, 2, 4, 6, 8,10,12,14, 9,11,13,15, 1, 3, 5, 7, 0, 3, 6, 5,12,15,10, 9, 1, 2, 7, 4,13,14,11, 8, 0, 4, 8,12, 9,13, 1, 5,11,15, 3, 7, 2, 6,10,14, 0, 5,10,15,13, 8, 7, 2, 3, 6, 9,12,14,11, 4, 1, 0, 6,12,10, 1, 7,13,11, 2, 4,14, 8, 3, 5,15, 9, 0, 7,14, 9, 5, 2,11,12,10,13, 4, 3,15, 8, 1, 6, 0, 8, 9, 1,11, 3, 2,10,15, 7, 6,14, 4,12,13, 5, 0, 9,11, 2,15, 6, 4,13, 7,14,12, 5, 8, 1, 3,10, 0,10,13, 7, 3, 9,14, 4, 6,12,11, 1, 5,15, 8, 2, 0,11,15, 4, 7,12, 8, 3,14, 5, 1,10, 9, 2, 6,13, 0,12, 1,13, 2,14, 3,15, 4, 8, 5, 9, 6,10, 7,11, 0,13, 3,14, 6,11, 5, 8,12, 1,15, 2,10, 7, 9, 4, 0,14, 5,11,10, 4,15, 1,13, 3, 8, 6, 7, 9, 2,12, 0,15, 7, 8,14, 1, 9, 6, 5,10, 2,13,11, 4,12, 3 }; const int cRsId::indices[] = { 2, 4, 8, 9, 11, 15, 7, 14, 5, 10, 13, 3 }; cRsId::cRsId() { int error; src_state = src_new(progdefaults.sample_converter, 1, &error); if (error) { LOG_ERROR("src_new error %d: %s", error, src_strerror(error)); abort(); } src_data.end_of_input = 0; reset(); rsfft = new g_fft(RSID_ARRAY_SIZE); memset(fftwindow, 0, sizeof(fftwindow)); if (RSWINDOW) { for (int i = 0; i < RSID_ARRAY_SIZE; i++) // fftwindow[i] = blackman ( 1.0 * i / RSID_ARRAY_SIZE ); fftwindow[i] = hamming ( 1.0 * i / RSID_ARRAY_SIZE ); // fftwindow[i] = hanning ( 1.0 * i / RSID_ARRAY_SIZE ); // fftwindow[i] = 1.0; } pCodes1 = new unsigned char[rsid_ids_size1 * RSID_NSYMBOLS]; memset(pCodes1, 0, sizeof(pCodes1) * sizeof(unsigned char)); pCodes2 = new unsigned char[rsid_ids_size2 * RSID_NSYMBOLS]; memset(pCodes2, 0, sizeof(pCodes2) * sizeof(unsigned char)); // Initialization of assigned mode/submode IDs. unsigned char* c; for (int i = 0; i < rsid_ids_size1; i++) { c = pCodes1 + i * RSID_NSYMBOLS; Encode(rsid_ids_1[i].rs, c); } for (int i = 0; i < rsid_ids_size2; i++) { c = pCodes2 + i * RSID_NSYMBOLS; Encode(rsid_ids_2[i].rs, c); } #if 0 printf("pcode 1\n"); printf(",rs, name, mode,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14\n"); for (int i = 0; i < rsid_ids_size1; i++) { printf("%d,%d,%s,%d", i, rsid_ids_1[i].rs, rsid_ids_1[i].name, rsid_ids_1[i].mode); for (int j = 0; j < RSID_NSYMBOLS + 1; j++) printf(",%d", pCodes1[i*(RSID_NSYMBOLS + 1) + j]); printf("\n"); } printf("\npcode 2\n"); printf(", rs, name, mode,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14\n"); for (int i = 0; i < rsid_ids_size2; i++) { printf("%d,%d,%s,%d", i, rsid_ids_2[i].rs, rsid_ids_2[i].name, rsid_ids_2[i].mode); for (int j = 0; j < RSID_NSYMBOLS + 1; j++) printf(",%d", pCodes2[i*(RSID_NSYMBOLS+ 1) + j]); printf("\n"); } #endif nBinLow = 3; nBinHigh = RSID_FFT_SIZE - 32; // - RSID_NTIMES - 2 outbuf = 0; symlen = 0; reset(); } cRsId::~cRsId() { delete [] pCodes1; delete [] pCodes2; delete [] outbuf; delete rsfft; src_delete(src_state); } void cRsId::reset() { iPrevDistance = iPrevDistance2 = 99; bPrevTimeSliceValid = bPrevTimeSliceValid2 = false; found1 = found2 = false; rsid_secondary_time_out = 0; memset(aInputSamples, 0, (RSID_ARRAY_SIZE * 2) * sizeof(float)); memset(aFFTcmplx, 0, RSID_ARRAY_SIZE * sizeof(rs_cpx_type)); memset(aFFTAmpl, 0, RSID_FFT_SIZE * sizeof(rs_fft_type)); memset(fft_buckets, 0, RSID_NTIMES * RSID_FFT_SIZE * sizeof(int)); int error = src_reset(src_state); if (error) LOG_ERROR("src_reset error %d: %s", error, src_strerror(error)); src_data.src_ratio = 0.0; inptr = RSID_FFT_SIZE; hamming_resolution = progdefaults.RsID_label_type; } void cRsId::Encode(int code, unsigned char *rsid) { rsid[0] = code >> 8; rsid[1] = (code >> 4) & 0x0f; rsid[2] = code & 0x0f; for (int i = 3; i < RSID_NSYMBOLS; i++) rsid[i] = 0; for (int i = 0; i < 12; i++) { for (int j = RSID_NSYMBOLS - 1; j > 0; j--) rsid[j] = rsid[j - 1] ^ Squares[(rsid[j] << 4) + indices[i]]; rsid[0] = Squares[(rsid[0] << 4) + indices[i]]; } } void cRsId::CalculateBuckets(const rs_fft_type *pSpectrum, int iBegin, int iEnd) { rs_fft_type Amp = 0.0, AmpMax = 0.0; int iBucketMax = iBegin - 2; int j; for (int i = iBegin; i < iEnd; i += 2) { if (iBucketMax == i - 2) { AmpMax = pSpectrum[i]; iBucketMax = i; for (j = i + 2; j < i + RSID_NTIMES + 2; j += 2) { Amp = pSpectrum[j]; if (Amp > AmpMax) { AmpMax = Amp; iBucketMax = j; } } } else { j = i + RSID_NTIMES; Amp = pSpectrum[j]; if (Amp > AmpMax) { AmpMax = Amp; iBucketMax = j; } } fft_buckets[RSID_NTIMES - 1][i] = (iBucketMax - i) >> 1; } } void cRsId::receive(const float* buf, size_t len) { if (len == 0) return; int srclen = static_cast(len); double src_ratio = RSID_SAMPLE_RATE / active_modem->get_samplerate(); if (rsid_secondary_time_out > 0) { rsid_secondary_time_out -= (int)(len / src_ratio); if (rsid_secondary_time_out <= 0) { LOG_INFO("%s", "Secondary RsID timed out"); reset(); } } if (src_data.src_ratio != src_ratio) { src_data.src_ratio = src_ratio; src_set_ratio(src_state, src_data.src_ratio); } while (srclen > 0) { src_data.data_in = const_cast(buf); src_data.input_frames = srclen; src_data.data_out = &aInputSamples[inptr]; src_data.output_frames = RSID_ARRAY_SIZE * 2 - inptr; src_data.input_frames_used = 0; int error = src_process(src_state, &src_data); if (unlikely(error)) { LOG_ERROR("src_process error %d: %s", error, src_strerror(error)); return; } size_t gend = src_data.output_frames_gen; size_t used = src_data.input_frames_used; inptr += gend; buf += used; srclen -= used; while (inptr >= RSID_ARRAY_SIZE) { search(); memmove(&aInputSamples[0], &aInputSamples[RSID_FFT_SAMPLES], (RSID_BUFFER_SIZE - RSID_FFT_SAMPLES)*sizeof(float)); inptr -= RSID_FFT_SAMPLES; } } } void cRsId::search(void) { if (progdefaults.rsidWideSearch) { nBinLow = 3; nBinHigh = RSID_FFT_SIZE - 32; } else { float centerfreq = active_modem->get_freq(); float bpf = 1.0 * RSID_ARRAY_SIZE / RSID_SAMPLE_RATE; nBinLow = (int)((centerfreq - 100.0 * 2) * bpf); nBinHigh = (int)((centerfreq + 100.0 * 2) * bpf); } if (nBinLow < 3) nBinLow = 3; if (nBinHigh > RSID_FFT_SIZE - 32) nBinHigh = RSID_FFT_SIZE - 32; bool bReverse = !(wf->Reverse() ^ wf->USB()); if (bReverse) { nBinLow = RSID_FFT_SIZE - nBinHigh; nBinHigh = RSID_FFT_SIZE - nBinLow; } if (RSWINDOW) { for (int i = 0; i < RSID_ARRAY_SIZE; i++) aFFTcmplx[i] = cmplx(aInputSamples[i] * fftwindow[i], 0); } else { for (int i = 0; i < RSID_ARRAY_SIZE; i++) aFFTcmplx[i] = cmplx(aInputSamples[i], 0); } rsfft->ComplexFFT(aFFTcmplx); memset(aFFTAmpl, 0, sizeof(aFFTAmpl)); static const double pscale = 4.0 / (RSID_FFT_SIZE * RSID_FFT_SIZE); if (unlikely(bReverse)) { for (int i = 0; i < RSID_FFT_SIZE; i++) aFFTAmpl[RSID_FFT_SIZE - 1 - i] = norm(aFFTcmplx[i]) * pscale; } else { for (int i = 0; i < RSID_FFT_SIZE; i++) aFFTAmpl[i] = norm(aFFTcmplx[i]) * pscale; } int bucket_low = 3; int bucket_high = RSID_FFT_SIZE - 32; if (bReverse) { bucket_low = RSID_FFT_SIZE - bucket_high; bucket_high = RSID_FFT_SIZE - bucket_low; } memmove(fft_buckets, &(fft_buckets[1][0]), (RSID_NTIMES - 1) * RSID_FFT_SIZE * sizeof(int)); memset(&(fft_buckets[RSID_NTIMES - 1][0]), 0, RSID_FFT_SIZE * sizeof(int)); CalculateBuckets ( aFFTAmpl, bucket_low, bucket_high - RSID_NTIMES); CalculateBuckets ( aFFTAmpl, bucket_low + 1, bucket_high - RSID_NTIMES); int symbol_out_1 = -1; int bin_out_1 = -1; int symbol_out_2 = -1; int bin_out_2 = -1; if (rsid_secondary_time_out == 0) { found1 = search_amp(bin_out_1, symbol_out_1, pCodes1); if (found1) { if (symbol_out_1 != RSID_ESCAPE) { if (bReverse) bin_out_1 = 1024 - bin_out_1 - 31; apply(bin_out_1, symbol_out_1, 0); reset(); return; } else { rsid_secondary_time_out = 3*15*1024; return; } } else return; } found2 = search_amp(bin_out_2, symbol_out_2, pCodes2); if (found2) { if (symbol_out_2 != RSID_NONE2) { if (bReverse) bin_out_2 = 1024 - bin_out_2 - 31; apply(bin_out_2, symbol_out_2, 1); } reset(); } } void cRsId::setup_mode(int iSymbol) { switch (iSymbol) { case RSID_RTTY_ASCII_7: progdefaults.rtty_baud = 5; progdefaults.rtty_bits = 1; progdefaults.rtty_shift = 9; REQ(&set_rtty_tab_widgets); break; case RSID_RTTY_ASCII_8: progdefaults.rtty_baud = 5; progdefaults.rtty_bits = 2; progdefaults.rtty_shift = 9; REQ(&set_rtty_tab_widgets); break; case RSID_RTTY_45: progdefaults.rtty_baud = 1; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; REQ(&set_rtty_tab_widgets); break; case RSID_RTTY_50: progdefaults.rtty_baud = 2; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; REQ(&set_rtty_tab_widgets); break; case RSID_RTTY_75: progdefaults.rtty_baud = 4; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 9; REQ(&set_rtty_tab_widgets); break; // DominoEX / FEC case RSID_DOMINOEX_4: case RSID_DOMINOEX_5: case RSID_DOMINOEX_8: case RSID_DOMINOEX_11: case RSID_DOMINOEX_16: case RSID_DOMINOEX_22: progdefaults.DOMINOEX_FEC = false; REQ(&set_dominoex_tab_widgets); break; case RSID_DOMINOEX_4_FEC: case RSID_DOMINOEX_5_FEC: case RSID_DOMINOEX_8_FEC: case RSID_DOMINOEX_11_FEC: case RSID_DOMINOEX_16_FEC: case RSID_DOMINOEX_22_FEC: progdefaults.DOMINOEX_FEC = true; REQ(&set_dominoex_tab_widgets); break; // olivia parameters case RSID_OLIVIA_4_125: progdefaults.oliviatones = 1; progdefaults.oliviabw = 0; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_4_250: progdefaults.oliviatones = 1; progdefaults.oliviabw = 1; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_4_500: progdefaults.oliviatones = 1; progdefaults.oliviabw = 2; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_4_1000: progdefaults.oliviatones = 1; progdefaults.oliviabw = 3; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_4_2000: progdefaults.oliviatones = 1; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_125: progdefaults.oliviatones = 2; progdefaults.oliviabw = 0; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_250: progdefaults.oliviatones = 2; progdefaults.oliviabw = 1; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_500: progdefaults.oliviatones = 2; progdefaults.oliviabw = 2; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_1000: progdefaults.oliviatones = 2; progdefaults.oliviabw = 3; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_2000: progdefaults.oliviatones = 2; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_16_500: progdefaults.oliviatones = 3; progdefaults.oliviabw = 2; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_16_1000: progdefaults.oliviatones = 3; progdefaults.oliviabw = 3; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_16_2000: progdefaults.oliviatones = 3; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_32_1000: progdefaults.oliviatones = 4; progdefaults.oliviabw = 3; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_32_2000: progdefaults.oliviatones = 4; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_64_2000: progdefaults.oliviatones = 5; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; // contestia parameters case RSID_CONTESTIA_4_125: progdefaults.contestiatones = 1; progdefaults.contestiabw = 0; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_4_250: progdefaults.contestiatones = 1; progdefaults.contestiabw = 1; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_4_500: progdefaults.contestiatones = 1; progdefaults.contestiabw = 2; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_4_1000: progdefaults.contestiatones = 1; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_4_2000: progdefaults.contestiatones = 1; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_125: progdefaults.contestiatones = 2; progdefaults.contestiabw = 0; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_250: progdefaults.contestiatones = 2; progdefaults.contestiabw = 1; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_500: progdefaults.contestiatones = 2; progdefaults.contestiabw = 2; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_1000: progdefaults.contestiatones = 2; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_2000: progdefaults.contestiatones = 2; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_16_500: progdefaults.contestiatones = 3; progdefaults.contestiabw = 2; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_16_1000: progdefaults.contestiatones = 3; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_16_2000: progdefaults.contestiatones = 3; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_32_1000: progdefaults.contestiatones = 4; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_32_2000: progdefaults.contestiatones = 4; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_64_500: progdefaults.contestiatones = 5; progdefaults.contestiabw = 2; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_64_1000: progdefaults.contestiatones = 5; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_64_2000: progdefaults.contestiatones = 5; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; default: break; } // switch (iSymbol) } void cRsId::apply(int iBin, int iSymbol, int extended) { ENSURE_THREAD(TRX_TID); double rsidfreq = 0, currfreq = 0; int n, mbin = NUM_MODES; int tblsize; const RSIDs *p_rsid; if (extended) { tblsize = rsid_ids_size2; p_rsid = rsid_ids_2; } else { tblsize = rsid_ids_size1; p_rsid = rsid_ids_1; } currfreq = active_modem->get_freq(); rsidfreq = (iBin + RSID_NSYMBOLS - 0.5) * RSID_SAMPLE_RATE / 2048.0; for (n = 0; n < tblsize; n++) { if (p_rsid[n].rs == iSymbol) { mbin = p_rsid[n].mode; break; } } if (mbin == NUM_MODES) { char msg[50]; if (n < tblsize) // RSID known but unimplemented snprintf(msg, sizeof(msg), "RSID: %s unimplemented", p_rsid[n].name); else // RSID unknown; shouldn't happen snprintf(msg, sizeof(msg), "RSID: code %d unknown", iSymbol); put_status(msg, 4.0); LOG_VERBOSE("%s", msg); return; } if (progdefaults.rsid_rx_modes.test(mbin)) { LOG_VERBOSE("RSID: %s @ %0.1f Hz", p_rsid[n].name, rsidfreq); } else { LOG_DEBUG("Ignoring RSID: %s @ %0.1f Hz", p_rsid[n].name, rsidfreq); return; } if (mailclient || mailserver) REQ(pskmail_notify_rsid, mbin); if (progdefaults.rsid_auto_disable) REQ(toggleRSID); if (!progdefaults.disable_rsid_warning_dialog_box) REQ(notify_rsid, mbin, rsidfreq); if (progdefaults.rsid_notify_only) return; if (progdefaults.rsid_mark) // mark current modem & freq REQ(note_qrg, false, "\nBefore RSID: ", "\n", active_modem->get_mode(), 0LL, currfreq); if(active_modem) // Currently only effects Olivia, Contestia and MT63. active_modem->rx_flush(); setup_mode(iSymbol); if (progdefaults.rsid_squelch) REQ(init_modem_squelch, mbin, progdefaults.disable_rsid_freq_change ? currfreq : rsidfreq); else REQ(init_modem, mbin, progdefaults.disable_rsid_freq_change ? currfreq : rsidfreq); } inline int cRsId::HammingDistance(int iBucket, unsigned char *p2) { int dist = 0; for (int i = 0, j = 1; i < RSID_NSYMBOLS; i++, j += 2) { if (fft_buckets[j][iBucket] != p2[i]) { ++dist; if (dist > hamming_resolution) break; } } return dist; } bool cRsId::search_amp( int &bin_out, int &symbol_out, unsigned char *pcode) { int i, j; int iDistanceMin = 1000; // infinity int iDistance = 1000; int iBin = -1; int iSymbol = -1; int tblsize; const RSIDs *prsid; if (pcode == pCodes1) { tblsize = rsid_ids_size1; prsid = rsid_ids_1; } else { tblsize = rsid_ids_size2; prsid = rsid_ids_2; } unsigned char *pc = 0; for (i = 0; i < tblsize; i++) { pc = pcode + i * RSID_NSYMBOLS; for (j = nBinLow; j < nBinHigh - RSID_NTIMES; j++) { iDistance = HammingDistance(j, pc); if (iDistance < iDistanceMin) { iDistanceMin = iDistance; iSymbol = prsid[i].rs; iBin = j; if (iDistanceMin == 0) break; } } } if (iDistanceMin <= hamming_resolution) { symbol_out = iSymbol; bin_out = iBin; return true; } return false; } //============================================================================= // transmit rsid code for current mode //============================================================================= bool cRsId::assigned(trx_mode mode) { rmode = RSID_NONE; rmode2 = RSID_NONE2; switch (mode) { case MODE_RTTY : if (progdefaults.rtty_baud == 5 && progdefaults.rtty_bits == 1 && progdefaults.rtty_shift == 9) rmode = RSID_RTTY_ASCII_7; else if (progdefaults.rtty_baud == 5 && progdefaults.rtty_bits == 1 && progdefaults.rtty_shift == 9) rmode = RSID_RTTY_ASCII_8; else if (progdefaults.rtty_baud == 1 && progdefaults.rtty_bits == 0 && progdefaults.rtty_shift == 3) rmode = RSID_RTTY_45; else if (progdefaults.rtty_baud == 2 && progdefaults.rtty_bits == 0 && progdefaults.rtty_shift == 3) rmode = RSID_RTTY_50; else if (progdefaults.rtty_baud == 4 && progdefaults.rtty_bits == 0 && progdefaults.rtty_shift == 9) rmode = RSID_RTTY_75; else return false; return true; break; case MODE_OLIVIA: case MODE_OLIVIA_4_250: case MODE_OLIVIA_8_250: case MODE_OLIVIA_4_500: case MODE_OLIVIA_8_500: case MODE_OLIVIA_16_500: case MODE_OLIVIA_8_1000: case MODE_OLIVIA_16_1000: case MODE_OLIVIA_32_1000: case MODE_OLIVIA_64_2000: if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 0) rmode = RSID_OLIVIA_4_125; else if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 1) rmode = RSID_OLIVIA_4_250; else if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 2) rmode = RSID_OLIVIA_4_500; else if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 3) rmode = RSID_OLIVIA_4_1000; else if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_4_2000; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 0) rmode = RSID_OLIVIA_8_125; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 1) rmode = RSID_OLIVIA_8_250; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 2) rmode = RSID_OLIVIA_8_500; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 3) rmode = RSID_OLIVIA_8_1000; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_8_2000; else if (progdefaults.oliviatones == 3 && progdefaults.oliviabw == 2) rmode = RSID_OLIVIA_16_500; else if (progdefaults.oliviatones == 3 && progdefaults.oliviabw == 3) rmode = RSID_OLIVIA_16_1000; else if (progdefaults.oliviatones == 3 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_16_2000; else if (progdefaults.oliviatones == 4 && progdefaults.oliviabw == 3) rmode = RSID_OLIVIA_32_1000; else if (progdefaults.oliviatones == 4 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_32_2000; else if (progdefaults.oliviatones == 5 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_64_2000; else return false; return true; break; case MODE_CONTESTIA: if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 0) rmode = RSID_CONTESTIA_4_125; else if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 1) rmode = RSID_CONTESTIA_4_250; else if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 2) rmode = RSID_CONTESTIA_4_500; else if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_4_1000; else if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_4_2000; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 0) rmode = RSID_CONTESTIA_8_125; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 1) rmode = RSID_CONTESTIA_8_250; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 2) rmode = RSID_CONTESTIA_8_500; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_8_1000; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_8_2000; else if (progdefaults.contestiatones == 3 && progdefaults.contestiabw == 2) rmode = RSID_CONTESTIA_16_500; else if (progdefaults.contestiatones == 3 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_16_1000; else if (progdefaults.contestiatones == 3 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_16_2000; else if (progdefaults.contestiatones == 4 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_32_1000; else if (progdefaults.contestiatones == 4 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_32_2000; else if (progdefaults.contestiatones == 5 && progdefaults.contestiabw == 2) rmode = RSID_CONTESTIA_64_500; else if (progdefaults.contestiatones == 5 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_64_1000; else if (progdefaults.contestiatones == 5 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_64_2000; else return false; return true; break; case MODE_DOMINOEX4: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_4_FEC; break; case MODE_DOMINOEX5: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_5_FEC; break; case MODE_DOMINOEX8: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_8_FEC; break; case MODE_DOMINOEX11: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_11_FEC; break; case MODE_DOMINOEX16: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_16_FEC; break; case MODE_DOMINOEX22: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_22_FEC; break; case MODE_MT63_500S: rmode = RSID_MT63_500_ST; break; case MODE_MT63_500L: rmode = RSID_MT63_500_LG; break; case MODE_MT63_1000S: rmode = RSID_MT63_1000_ST; break; case MODE_MT63_1000L: rmode = RSID_MT63_1000_LG; break; case MODE_MT63_2000S: rmode = RSID_MT63_2000_ST; break; case MODE_MT63_2000L: rmode = RSID_MT63_2000_LG; break; } // if rmode is still unset, look it up // Try secondary table first if (rmode == RSID_NONE) { for (size_t i = 0; i < sizeof(rsid_ids_2)/sizeof(*rsid_ids_2); i++) { if (mode == rsid_ids_2[i].mode) { rmode = RSID_ESCAPE; rmode2 = rsid_ids_2[i].rs; break; } } if (rmode2 == RSID_NONE2) { for (size_t i = 0; i < sizeof(rsid_ids_1)/sizeof(*rsid_ids_1); i++) { if (mode == rsid_ids_1[i].mode) { rmode = rsid_ids_1[i].rs; break; } } } } if (rmode == RSID_NONE) { LOG_DEBUG("%s mode is not assigned an RSID", mode_info[mode].sname); return false; } return true; } void cRsId::send(bool preRSID) { trx_mode mode = active_modem->get_mode(); if (!progdefaults.rsid_tx_modes.test(mode)) { LOG_DEBUG("Mode %s excluded, not sending RSID", mode_info[mode].sname); return; } if (!progdefaults.rsid_post && !preRSID) return; if (!assigned(mode)) return; unsigned char rsid[RSID_NSYMBOLS]; double sr; size_t len; int iTone; double freq, phaseincr; double fr; double phase; Encode(rmode, rsid); sr = active_modem->get_samplerate(); len = (size_t)floor(RSID_SYMLEN * sr); if (unlikely(len != symlen)) { symlen = len; delete [] outbuf; outbuf = new double[symlen]; } // transmit 5 symbol periods of silence at beginning of rsid memset(outbuf, 0, symlen * sizeof(*outbuf)); for (int i = 0; i < 5; i++) active_modem->ModulateXmtr(outbuf, symlen); // transmit sequence of 15 symbols (tones) fr = 1.0 * active_modem->get_txfreq() - (RSID_SAMPLE_RATE * 7 / 1024); phase = 0.0; for (int i = 0; i < 15; i++) { iTone = rsid[i]; if (active_modem->get_reverse()) iTone = 15 - iTone; freq = fr + iTone * RSID_SAMPLE_RATE / 1024; phaseincr = 2.0 * M_PI * freq / sr; for (size_t j = 0; j < symlen; j++) { phase += phaseincr; if (phase > 2.0 * M_PI) phase -= 2.0 * M_PI; outbuf[j] = sin(phase); } active_modem->ModulateXmtr(outbuf, symlen); } if (rmode == RSID_ESCAPE && rmode2 != RSID_NONE2) { // transmit 10 symbol periods of silence between rsid sequences memset(outbuf, 0, symlen * sizeof(*outbuf)); for (int i = 0; i < 10; i++) active_modem->ModulateXmtr(outbuf, symlen); Encode(rmode2, rsid); sr = active_modem->get_samplerate(); len = (size_t)floor(RSID_SYMLEN * sr); if (unlikely(len != symlen)) { symlen = len; delete [] outbuf; outbuf = new double[symlen]; } // transmit sequence of 15 symbols (tones) fr = 1.0 * active_modem->get_txfreq() - (RSID_SAMPLE_RATE * 7 / 1024); phase = 0.0; for (int i = 0; i < 15; i++) { iTone = rsid[i]; if (active_modem->get_reverse()) iTone = 15 - iTone; freq = fr + iTone * RSID_SAMPLE_RATE / 1024; phaseincr = 2.0 * M_PI * freq / sr; for (size_t j = 0; j < symlen; j++) { phase += phaseincr; if (phase > 2.0 * M_PI) phase -= 2.0 * M_PI; outbuf[j] = sin(phase); } active_modem->ModulateXmtr(outbuf, symlen); } } // 5 symbol periods of silence at end of transmission // and between RsID and the data signal int nperiods = 5; memset(outbuf, 0, symlen * sizeof(*outbuf)); for (int i = 0; i < nperiods; i++) active_modem->ModulateXmtr(outbuf, symlen); } fldigi-3.21.80/src/olivia/0000775000175000017500000000000012313333726012203 500000000000000fldigi-3.21.80/src/olivia/olivia.cxx0000775000175000017500000002410312313064025014126 00000000000000// ---------------------------------------------------------------------------- // olivia.cxx -- OLIVIA modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // Copyright (C) 2005 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "olivia.h" #include "modem.h" #include "fl_digi.h" #include "misc.h" #include "confdialog.h" #include "status.h" #include "debug.h" #include "qrunner.h" LOG_FILE_SOURCE(debug::LOG_MODEM); using namespace std; double olivia::nco(double freq) { preamblephase += 2.0 * M_PI * freq / samplerate; if (preamblephase > M_PI) preamblephase -= 2.0 * M_PI; return cos(preamblephase); } void olivia::tx_init(SoundBase *sc) { scard = sc; phaseacc = 0; prevsymbol = cmplx (1.0, 0.0); preamble = 32; shreg = 0; preamblesent = 0; postamblesent = 0; txbasefreq = get_txfreq_woffset(); rx_flush(); double fc_offset = Tx->Bandwidth*(1.0 - 0.5/Tx->Tones)/2.0; if (reverse) { Tx->FirstCarrierMultiplier = (txbasefreq + fc_offset)/500.0; Tx->Reverse = 1; } else { Tx->FirstCarrierMultiplier = (txbasefreq - fc_offset)/500.0; Tx->Reverse = 0; } videoText(); Tx->Preset(); Tx->Start(); escape = 0; } void olivia::rx_flush() { unsigned char c; // if(Rx) { Rx->Flush(); while (Rx->GetChar(c) > 0) put_rx_char(c); // } } void olivia::send_tones() { double freqa, freqb; tone_bw = bandwidth; tone_midfreq = txbasefreq; if (reverse) { freqa = tone_midfreq + (tone_bw / 2.0); freqb = tone_midfreq - (tone_bw / 2.0); } else { freqa = tone_midfreq - (tone_bw / 2.0); freqb = tone_midfreq + (tone_bw / 2.0); } preamblephase = 0; for (int i = 0; i < SR4; i++) tonebuff[2*SR4 + i] = tonebuff[i] = nco(freqa) * ampshape[i]; preamblephase = 0; for (int i = 0; i < SR4; i++) tonebuff[3*SR4 + i] = tonebuff[SR4 + i] = nco(freqb) * ampshape[i]; for (int j = 0; j < TONE_DURATION; j += SCBLOCKSIZE) ModulateXmtr(&tonebuff[j], SCBLOCKSIZE); } void olivia::rx_init() { Rx->Reset(); escape = 0; } int olivia::unescape(int c) { if (progdefaults.olivia8bit == 0) return c; if (escape) { escape = 0; return c + 128; } if (c == 127) { escape = 1; return -1; } return c; } int olivia::tx_process() { int c = 0, len = 0; if ((mode == MODE_OLIVIA && (tones != progdefaults.oliviatones || bw != progdefaults.oliviabw)) || smargin != progdefaults.oliviasmargin || sinteg != progdefaults.oliviasinteg ) restart(); if (preamblesent != 1) { send_tones(); preamblesent = 1; // Olivia Transmitter class requires at least character Tx->PutChar(0); } // The encoder works with BitsPerSymbol length blocks. If the // modem already has that many characters buffered, don't try // to read any more. If stopflag is set, we will always read // whatever there is. if (stopflag || (Tx->GetReadReady() < Tx->BitsPerSymbol)) { if (!stopflag && (c = get_tx_char()) == GET_TX_CHAR_ETX) stopflag = true; if (stopflag) Tx->Stop(); else { if (c == GET_TX_CHAR_NODATA) c = 0; if (c > 127) { if (progdefaults.olivia8bit && c <= 255) { Tx->PutChar(127); Tx->PutChar(c & 127); } else { c = '.'; Tx->PutChar(c); } } else Tx->PutChar(c); } } if (c > 0) put_echo_char(c); if ((len = Tx->Output(txfbuffer)) > 0) ModulateXmtr(txfbuffer, len); if (stopflag && Tx->DoPostambleYet() == 1 && postamblesent != 1) { postamblesent = 1; send_tones(); } if (!Tx->Running()) { cwid(); stopflag = false; return -1; } return 0; } int olivia::rx_process(const double *buf, int len) { int c; unsigned char ch = 0; static double snr = 1e-3; static char msg1[20]; static char msg2[20]; if ((mode == MODE_OLIVIA && (tones != progdefaults.oliviatones || bw != progdefaults.oliviabw)) || smargin != progdefaults.oliviasmargin || sinteg != progdefaults.oliviasinteg ) restart(); int fc_offset = Tx->Bandwidth*(1.0 - 0.5/Tx->Tones)/2.0; if ((lastfreq != frequency || Rx->Reverse) && !reverse) { Rx->FirstCarrierMultiplier = (frequency - fc_offset)/500.0; Rx->Reverse = 0; lastfreq = frequency; Rx->Preset(); } else if ((lastfreq != frequency || !Rx->Reverse) && reverse) { Rx->FirstCarrierMultiplier = (frequency + fc_offset)/500.0; Rx->Reverse = 1; lastfreq = frequency; Rx->Preset(); } Rx->SyncThreshold = progStatus.sqlonoff ? clamp(progStatus.sldrSquelchValue / 5.0 + 3.0, 0, 90.0) : 0.0; Rx->Process(buf, len); sp = 0; // for (int i = frequency - Rx->Bandwidth/2; i < frequency - 1 + Rx->Bandwidth/2; i++) for (int i = frequency - fc_offset; i < frequency + fc_offset; i++) if (wf->Pwr(i) > sp) sp = wf->Pwr(i); np = wf->Pwr(static_cast(frequency + Rx->Bandwidth/2 + 2*Rx->Bandwidth/Rx->Tones)); if (np == 0) np = sp + 1e-8; sigpwr = decayavg( sigpwr, sp, 10); noisepwr = decayavg( noisepwr, np, 50); snr = CLAMP(sigpwr / noisepwr, 0.001, 100000); metric = clamp( 5.0 * (Rx->SignalToNoiseRatio() - 3.0), 0, 100); display_metric(metric); bool gotchar = false; while (Rx->GetChar(ch) > 0) { if ((c = unescape(ch)) != -1 && c > 7) { put_rx_char(c); gotchar = true; } } if (gotchar) { snprintf(msg1, sizeof(msg1), "s/n: %4.1f dB", 10*log10(snr) - 20); put_Status1(msg1, 5, STATUS_CLEAR); snprintf(msg2, sizeof(msg2), "f/o %+4.1f Hz", Rx->FrequencyOffset()); put_Status2(msg2, 5, STATUS_CLEAR); } return 0; } void olivia::restart() { if (mode == MODE_OLIVIA) { tones = progdefaults.oliviatones; bw = progdefaults.oliviabw; } smargin = progdefaults.oliviasmargin; sinteg = progdefaults.oliviasinteg; samplerate = 8000; bandwidth = 125 * (1 << bw); Tx->Tones = 2 * (1 << tones); Tx->Bandwidth = bandwidth; Tx->SampleRate = samplerate; Tx->OutputSampleRate = samplerate; txbasefreq = get_txfreq_woffset(); int fc_offset = Tx->Bandwidth * (1.0 - 0.5/Tx->Tones) / 2.0; if (reverse) { Tx->FirstCarrierMultiplier = (txbasefreq + fc_offset)/500.0; Tx->Reverse = 1; } else { Tx->FirstCarrierMultiplier = (txbasefreq - fc_offset)/500.0; Tx->Reverse = 0; } if (Tx->Preset() < 0) { LOG_ERROR("olivia: transmitter preset failed!"); return; } txbufferlen = Tx->MaxOutputLen; if (txfbuffer) delete [] txfbuffer; txfbuffer = new double[txbufferlen]; Rx->Tones = Tx->Tones; Rx->Bandwidth = bandwidth; Rx->SyncMargin = smargin; Rx->SyncIntegLen = sinteg; Rx->SyncThreshold = progStatus.sqlonoff ? clamp(progStatus.sldrSquelchValue / 5.0 + 3.0, 0, 90.0) : 0.0; Rx->SampleRate = samplerate; Rx->InputSampleRate = samplerate; fc_offset = Rx->Bandwidth * (1.0 - 0.5/Rx->Tones) / 2.0; if (reverse) { Rx->FirstCarrierMultiplier = (frequency + fc_offset)/500.0; Rx->Reverse = 1; } else { Rx->FirstCarrierMultiplier = (frequency - fc_offset)/500.0; Rx->Reverse = 0; } if (Rx->Preset() < 0) { LOG_ERROR("olivia: receiver preset failed!"); return; } fragmentsize = 1024; set_bandwidth(Tx->Bandwidth - Tx->Bandwidth / Tx->Tones); if (mode == MODE_OLIVIA) put_MODEstatus("%s %" PRIuSZ "/%" PRIuSZ "", get_mode_name(), Tx->Tones, Tx->Bandwidth); else put_MODEstatus("%s", mode_info[mode].sname);//get_mode_name()); metric = 0; sigpwr = 1e-10; noisepwr = 1e-8; LOG_DEBUG("\nOlivia Rx parameters:\n%s", Rx->PrintParameters()); } void olivia::init() { restart(); modem::init(); set_scope_mode(Digiscope::BLANK); } olivia::olivia(trx_mode omode) { mode = omode; cap |= CAP_REV; txfbuffer = 0; samplerate = 8000; switch (mode) { case MODE_OLIVIA_4_250: progdefaults.oliviatones = tones = 1; progdefaults.oliviabw = bw = 1; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_8_250: progdefaults.oliviatones = tones = 2; progdefaults.oliviabw = bw = 1; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_4_500: progdefaults.oliviatones = tones = 1; progdefaults.oliviabw = bw = 2; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_8_500: progdefaults.oliviatones = tones = 2; progdefaults.oliviabw = bw = 2; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_16_500: progdefaults.oliviatones = tones = 3; progdefaults.oliviabw = bw = 2; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_8_1000: progdefaults.oliviatones = tones = 2; progdefaults.oliviabw = bw = 3; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_16_1000: progdefaults.oliviatones = tones = 3; progdefaults.oliviabw = bw = 3; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_32_1000: progdefaults.oliviatones = tones = 4; progdefaults.oliviabw = bw = 3; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_64_2000: progdefaults.oliviatones = tones = 5; progdefaults.oliviabw = bw = 4; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA: default: tones = progdefaults.oliviatones; bw = progdefaults.oliviabw; REQ(set_olivia_tab_widgets); break; } Tx = new MFSK_Transmitter< double >; Rx = new MFSK_Receiver< double >; lastfreq = 0; for (int i = 0; i < SR4; i++) ampshape[i] = 1.0; for (int i = 0; i < SR4 / 8; i++) ampshape[i] = ampshape[SR4 - 1 - i] = 0.5 * (1.0 - cos(M_PI * i / (SR4/8))); for (int i = 0; i < TONE_DURATION; i++) tonebuff[i] = 0; tone_bw = -1; tone_midfreq = -1; } olivia::~olivia() { if (Tx) delete Tx; if (Rx) delete Rx; if (txfbuffer) delete [] txfbuffer; } fldigi-3.21.80/src/Makefile.in0000664000175000017500000166462112313332267012724 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (c) 2008 Dave Freese, W1HKJ (w1hkj AT w1hkj DOT com) # License: GPLv3+: GNU GPL version 3 or later. VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) @WANT_FLDIGI_TRUE@am__append_1 = fldigi @WANT_FLARQ_TRUE@am__append_2 = flarq @ENABLE_HAMLIB_TRUE@am__append_3 = $(HAMLIB_SRC) @NEED_HAMLIB_LOCATOR_TRUE@am__append_4 = $(LOCATOR_SRC) @ENABLE_BENCHMARK_TRUE@am__append_5 = $(BENCHMARK_SRC) @COMPAT_REGEX_TRUE@am__append_6 = $(REGEX_SRC) @COMPAT_REGEX_TRUE@am__append_7 = $(REGEX_SRC) @COMPAT_STACK_TRUE@am__append_8 = $(STACK_SRC) @COMPAT_STACK_TRUE@am__append_9 = $(STACK_SRC) @MINGW32_TRUE@am__append_10 = $(MINGW32_SRC) @MINGW32_TRUE@am__append_11 = $(MINGW32_SRC) @USE_NLS_TRUE@am__append_12 = $(NLS_SRC) @USE_NLS_TRUE@am__append_13 = $(NLS_SRC) @HAVE_WINDRES_TRUE@@WIN32_TRUE@am__append_14 = $(FLDIGI_WIN32_RES_SRC) @HAVE_WINDRES_TRUE@@WIN32_TRUE@am__append_15 = $(FLARQ_WIN32_RES_SRC) @DARWIN_TRUE@am__append_16 = $(APPBUNDLE_NOLIBS) $(APPBUNDLE) $(APPBUNDLE)*.dmg @HAVE_NSIS_TRUE@am__append_17 = $(INSTALLER_FILE) @USE_NLS_TRUE@am__append_18 = share subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/config.h.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/intl/gettext.m4 \ $(top_srcdir)/m4/intl/iconv.m4 $(top_srcdir)/m4/intl/lib-ld.m4 \ $(top_srcdir)/m4/intl/lib-link.m4 \ $(top_srcdir)/m4/intl/lib-prefix.m4 \ $(top_srcdir)/m4/intl/nls.m4 $(top_srcdir)/m4/intl/po.m4 \ $(top_srcdir)/m4/intl/progtest.m4 \ $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/benchmark.m4 $(top_srcdir)/m4/bind.m4 \ $(top_srcdir)/m4/build.m4 $(top_srcdir)/m4/debug.m4 \ $(top_srcdir)/m4/docs.m4 $(top_srcdir)/m4/fltk.m4 \ $(top_srcdir)/m4/funcs.m4 $(top_srcdir)/m4/libintl.m4 \ $(top_srcdir)/m4/macosx.m4 $(top_srcdir)/m4/np-compat.m4 \ $(top_srcdir)/m4/opt.m4 $(top_srcdir)/m4/oss.m4 \ $(top_srcdir)/m4/pkg-config.m4 $(top_srcdir)/m4/progs.m4 \ $(top_srcdir)/m4/static.m4 $(top_srcdir)/m4/tls.m4 \ $(top_srcdir)/m4/win32.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @WANT_FLDIGI_TRUE@am__EXEEXT_1 = fldigi$(EXEEXT) @WANT_FLARQ_TRUE@am__EXEEXT_2 = flarq$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__flarq_SOURCES_DIST = compat/regex.h compat/regex.c include/stack.h \ misc/stack.cxx include/compat.h compat/getsysinfo.c \ compat/mingw.c compat/mingw.h misc/nls.cxx include/nls.h \ flarq-src/flarqrc.rc dialogs/font_browser.cxx \ flarq-src/arq.cxx flarq-src/arqdialogs.cxx \ flarq-src/arqhelp.cxx flarq-src/b64.cxx flarq-src/flarq.cxx \ flarq-src/flarqenv.cxx flarq-src/include/arq.h \ flarq-src/include/arqdialogs.h flarq-src/include/b64.h \ flarq-src/include/flarq.h flarq-src/include/flarqenv.h \ include/Fl_Text_Display_mod.H include/Fl_Text_Editor_mod.H \ include/FTextView.h include/debug.h include/fileselect.h \ include/flinput2.h include/flmisc.h include/flslider2.h \ include/font_browser.h include/icons.h include/pixmaps.h \ include/re.h include/socket.h include/stacktrace.h \ include/threads.h include/table.h include/util.h \ combo/combo.cxx fileselector/FL/Native_File_Chooser.H \ fileselector/Native_File_Chooser.cxx \ fileselector/fileselect.cxx logbook/table.cxx misc/ascii.cxx \ misc/debug.cxx misc/stacktrace.cxx misc/threads.cxx \ misc/timeops.cxx widgets/flinput2.cxx widgets/flmisc.cxx \ widgets/flslider2.cxx misc/icons.cxx misc/pixmaps.cxx \ misc/pixmaps_tango.cxx misc/re.cxx misc/socket.cxx \ misc/util.cxx widgets/Fl_Text_Buffer_mod.cxx \ widgets/Fl_Text_Display_mod.cxx widgets/Fl_Text_Editor_mod.cxx \ widgets/FTextView.cxx am__objects_1 = flarq-regex.$(OBJEXT) @COMPAT_REGEX_TRUE@am__objects_2 = $(am__objects_1) am__objects_3 = flarq-stack.$(OBJEXT) @COMPAT_STACK_TRUE@am__objects_4 = $(am__objects_3) am__objects_5 = flarq-getsysinfo.$(OBJEXT) flarq-mingw.$(OBJEXT) @MINGW32_TRUE@am__objects_6 = $(am__objects_5) am__objects_7 = flarq-nls.$(OBJEXT) @USE_NLS_TRUE@am__objects_8 = $(am__objects_7) am__dirstamp = $(am__leading_dot)dirstamp am__objects_9 = flarq-src/flarqrc.$(OBJEXT) @HAVE_WINDRES_TRUE@@WIN32_TRUE@am__objects_10 = $(am__objects_9) am_flarq_OBJECTS = $(am__objects_2) $(am__objects_4) $(am__objects_6) \ $(am__objects_8) $(am__objects_10) \ flarq-font_browser.$(OBJEXT) flarq-arq.$(OBJEXT) \ flarq-arqdialogs.$(OBJEXT) flarq-arqhelp.$(OBJEXT) \ flarq-b64.$(OBJEXT) flarq-flarq.$(OBJEXT) \ flarq-flarqenv.$(OBJEXT) flarq-combo.$(OBJEXT) \ flarq-Native_File_Chooser.$(OBJEXT) flarq-fileselect.$(OBJEXT) \ flarq-table.$(OBJEXT) flarq-ascii.$(OBJEXT) \ flarq-debug.$(OBJEXT) flarq-stacktrace.$(OBJEXT) \ flarq-threads.$(OBJEXT) flarq-timeops.$(OBJEXT) \ flarq-flinput2.$(OBJEXT) flarq-flmisc.$(OBJEXT) \ flarq-flslider2.$(OBJEXT) flarq-icons.$(OBJEXT) \ flarq-pixmaps.$(OBJEXT) flarq-pixmaps_tango.$(OBJEXT) \ flarq-re.$(OBJEXT) flarq-socket.$(OBJEXT) flarq-util.$(OBJEXT) \ flarq-Fl_Text_Buffer_mod.$(OBJEXT) \ flarq-Fl_Text_Display_mod.$(OBJEXT) \ flarq-Fl_Text_Editor_mod.$(OBJEXT) flarq-FTextView.$(OBJEXT) flarq_OBJECTS = $(am_flarq_OBJECTS) flarq_DEPENDENCIES = flarq_LINK = $(CXXLD) $(flarq_CXXFLAGS) $(CXXFLAGS) $(flarq_LDFLAGS) \ $(LDFLAGS) -o $@ am__fldigi_SOURCES_DIST = include/xmlrpc.h misc/xmlrpc.cxx \ include/hamlib.h rigcontrol/hamlib.cxx include/rigclass.h \ rigcontrol/rigclass.cxx misc/locator.c include/benchmark.h \ misc/benchmark.cxx compat/regex.h compat/regex.c \ include/stack.h misc/stack.cxx include/compat.h \ compat/getsysinfo.c compat/mingw.c compat/mingw.h misc/nls.cxx \ include/nls.h fldigirc.rc combo/combo.cxx cw_rtty/cw.cxx \ cw_rtty/morse.cxx cw_rtty/rtty.cxx cw_rtty/view_rtty.cxx \ contestia/contestia.cxx dialogs/confdialog.cxx \ dialogs/fl_digi.cxx dialogs/font_browser.cxx \ dialogs/Viewer.cxx dialogs/htmlstrings.cxx \ dialogs/notifydialog.cxx dialogs/record_browse.cxx \ dtmf/dtmf.cxx thor/thor.cxx thor/thorvaricode.cxx \ dominoex/dominoex.cxx dominoex/dominovar.cxx feld/feld.cxx \ feld/feldfonts.cxx fileselector/FL/Native_File_Chooser.H \ fileselector/Native_File_Chooser.cxx \ fileselector/fileselect.cxx filters/fftfilt.cxx \ filters/filters.cxx filters/viterbi.cxx globals/globals.cxx \ include/htmlstrings.h include/arq_io.h include/confdialog.h \ include/dtmf.h include/FTextView.h include/FTextRXTX.h \ include/fileselect.h include/Panel.h include/FreqControl.h \ include/analysis.h include/ascii.h include/charsetdistiller.h \ include/charsetlist.h include/colorbox.h include/combo.h \ include/complex.h include/configuration.h include/contestia.h \ include/cw.h include/debug.h include/digiscope.h \ include/dxcc.h include/thor.h include/thorvaricode.h \ include/dominoex.h include/dominovar.h include/feld.h \ include/fftfilt.h include/filters.h include/fl_digi.h \ include/fl_lock.h include/fldigi-config.h include/flinput2.h \ include/flmisc.h include/flslider2.h include/font_browser.h \ include/fontdef.h include/gettext.h include/globals.h \ include/icons.h include/interleave.h include/jalocha/pj_cmpx.h \ include/jalocha/pj_fft.h include/jalocha/pj_fht.h \ include/jalocha/pj_fifo.h include/jalocha/pj_gray.h \ include/jalocha/pj_lowpass3.h include/jalocha/pj_mfsk.h \ include/jalocha/pj_struc.h include/coordinate.h include/gfft.h \ include/kmlserver.h include/locator.h include/log.h \ include/logger.h include/macroedit.h include/macros.h \ include/main.h include/mbuffer.h include/mfsk.h \ include/mfskvaricode.h include/wefax.h include/wefax-pic.h \ include/misc.h include/mixer.h include/modem.h include/morse.h \ include/mt63base.h include/mt63.h include/network.h \ include/dsp.h include/newinstall.h include/notify.h \ include/notifydialog.h include/record_browse.h \ include/olivia.h include/pkg.h include/picture.h \ include/progress.h include/psk.h include/viewpsk.h \ include/pskcoeff.h include/pskvaricode.h include/pskeval.h \ include/ptt.h include/pixmaps.h include/pskrep.h \ include/qrunner.h include/lookupcall.h include/qrzlib.h \ include/raster.h include/re.h include/rigCAT.h include/rigio.h \ include/rigsupport.h include/rigxml.h include/ringbuffer.h \ include/rsid.h include/rtty.h include/view_rtty.h \ include/synop.h include/nullmodem.h include/record_loader.h \ include/record_loader_gui.h include/rx_extract.h \ include/speak.h include/serial.h include/socket.h \ include/sound.h include/soundconf.h include/spot.h \ include/ssb.h include/stacktrace.h include/status.h \ include/strutil.h include/testmodem.h include/threads.h \ include/throb.h include/timeops.h include/trx.h include/util.h \ include/Viewer.h include/viterbi.h include/waterfall.h \ include/wwv.h include/xmlreader.h include/adif_def.h \ include/adif_io.h include/calendar.h include/date.h \ include/field_def.h include/logbook.h include/lgbook.h \ include/logsupport.h include/outputencoder.h include/qso_db.h \ include/table.h include/textio.h include/psk_browser.h \ include/utf8file_io.h include/weather.h \ irrxml/CXMLReaderImpl.h irrxml/fast_atof.h irrxml/heapsort.h \ irrxml/irrArray.h irrxml/irrString.h irrxml/irrTypes.h \ irrxml/irrXML.cpp irrxml/irrXML.h logbook/adif_io.cxx \ logbook/calendar.cxx logbook/date.cxx logbook/lgbook.cxx \ logbook/logbook.cxx logbook/logsupport.cxx \ logbook/lookupcall.cxx logbook/qrzlib.cxx logbook/qso_db.cxx \ logbook/table.cxx logbook/textio.cxx logger/logger.cxx \ logger/rx_extract.cxx logger/speak.cxx main.cxx \ mfsk/interleave.cxx mfsk/mfsk.cxx mfsk/mfskvaricode.cxx \ wefax/wefax.cxx wefax/wefax-pic.cxx misc/ascii.cxx \ misc/charsetdistiller.cxx misc/charsetlist.cxx \ misc/configuration.cxx misc/coordinate.cxx misc/debug.cxx \ misc/dxcc.cxx misc/icons.cxx misc/kmlserver.cxx misc/log.cxx \ misc/macroedit.cxx misc/macros.cxx misc/misc.cxx \ misc/network.cxx misc/newinstall.cxx misc/outputencoder.cxx \ misc/arq_io.cxx misc/pixmaps.cxx misc/pixmaps_tango.cxx \ misc/re.cxx misc/record_loader.cxx misc/socket.cxx \ misc/stacktrace.cxx misc/status.cxx misc/strutil.cxx \ misc/threads.cxx misc/timeops.cxx misc/utf8file_io.cxx \ misc/util.cxx misc/weather.cxx mt63/dsp.cxx mt63/mt63.cxx \ mt63/mt63base.cxx navtex/navtex.cxx include/navtex.h \ olivia/olivia.cxx psk/psk.cxx psk/pskcoeff.cxx \ psk/pskvaricode.cxx psk/viewpsk.cxx psk/pskeval.cxx \ qrunner/fqueue.h qrunner/qrunner.cxx \ rigcontrol/FreqControl.cxx rigcontrol/ptt.cxx \ rigcontrol/rigio.cxx rigcontrol/rigsupport.cxx \ rigcontrol/rigxml.cxx rigcontrol/serial.cxx rsid/rsid.cxx \ soundcard/mixer.cxx soundcard/sound.cxx \ soundcard/soundconf.cxx spot/notify.cxx spot/pskrep.cxx \ spot/spot.cxx ssb/ssb.cxx synop-src/synop.cxx throb/throb.cxx \ trx/modem.cxx trx/nullmodem.cxx trx/trx.cxx \ waterfall/colorbox.cxx waterfall/digiscope.cxx \ waterfall/raster.cxx waterfall/waterfall.cxx \ widgets/Fl_Text_Buffer_mod.cxx widgets/Fl_Text_Display_mod.cxx \ widgets/Fl_Text_Editor_mod.cxx widgets/FTextView.cxx \ widgets/FTextRXTX.cxx widgets/Panel.cxx widgets/flinput2.cxx \ widgets/flmisc.cxx widgets/flslider2.cxx widgets/picture.cxx \ widgets/progress.cxx widgets/psk_browser.cxx wwv/analysis.cxx \ wwv/wwv.cxx logbook/xmlrpc_log.cxx xmlrpcpp/XmlRpc.h \ xmlrpcpp/XmlRpcClient.cpp xmlrpcpp/XmlRpcClient.h \ xmlrpcpp/XmlRpcDispatch.cpp xmlrpcpp/XmlRpcDispatch.h \ xmlrpcpp/XmlRpcException.h xmlrpcpp/XmlRpcMutex.cpp \ xmlrpcpp/XmlRpcMutex.h xmlrpcpp/XmlRpcServer.cpp \ xmlrpcpp/XmlRpcServer.h xmlrpcpp/XmlRpcServerConnection.cpp \ xmlrpcpp/XmlRpcServerConnection.h \ xmlrpcpp/XmlRpcServerMethod.cpp xmlrpcpp/XmlRpcServerMethod.h \ xmlrpcpp/XmlRpcSocket.cpp xmlrpcpp/XmlRpcSocket.h \ xmlrpcpp/XmlRpcSource.cpp xmlrpcpp/XmlRpcSource.h \ xmlrpcpp/XmlRpcThread.cpp xmlrpcpp/XmlRpcThread.h \ xmlrpcpp/XmlRpcThreadedServer.cpp \ xmlrpcpp/XmlRpcThreadedServer.h xmlrpcpp/XmlRpcUtil.cpp \ xmlrpcpp/XmlRpcUtil.h xmlrpcpp/XmlRpcValue.cpp \ xmlrpcpp/XmlRpcValue.h xmlrpcpp/base64.h \ libtiniconv/tiniconv.c libtiniconv/tiniconv_desc.c am__objects_11 = fldigi-xmlrpc.$(OBJEXT) am__objects_12 = fldigi-hamlib.$(OBJEXT) fldigi-rigclass.$(OBJEXT) @ENABLE_HAMLIB_TRUE@am__objects_13 = $(am__objects_12) am__objects_14 = fldigi-locator.$(OBJEXT) @NEED_HAMLIB_LOCATOR_TRUE@am__objects_15 = $(am__objects_14) am__objects_16 = fldigi-benchmark.$(OBJEXT) @ENABLE_BENCHMARK_TRUE@am__objects_17 = $(am__objects_16) am__objects_18 = fldigi-regex.$(OBJEXT) @COMPAT_REGEX_TRUE@am__objects_19 = $(am__objects_18) am__objects_20 = fldigi-stack.$(OBJEXT) @COMPAT_STACK_TRUE@am__objects_21 = $(am__objects_20) am__objects_22 = fldigi-getsysinfo.$(OBJEXT) fldigi-mingw.$(OBJEXT) @MINGW32_TRUE@am__objects_23 = $(am__objects_22) am__objects_24 = fldigi-nls.$(OBJEXT) @USE_NLS_TRUE@am__objects_25 = $(am__objects_24) am__objects_26 = fldigirc.$(OBJEXT) @HAVE_WINDRES_TRUE@@WIN32_TRUE@am__objects_27 = $(am__objects_26) am_fldigi_OBJECTS = $(am__objects_11) $(am__objects_13) \ $(am__objects_15) $(am__objects_17) $(am__objects_19) \ $(am__objects_21) $(am__objects_23) $(am__objects_25) \ $(am__objects_27) fldigi-combo.$(OBJEXT) fldigi-cw.$(OBJEXT) \ fldigi-morse.$(OBJEXT) fldigi-rtty.$(OBJEXT) \ fldigi-view_rtty.$(OBJEXT) fldigi-contestia.$(OBJEXT) \ fldigi-confdialog.$(OBJEXT) fldigi-fl_digi.$(OBJEXT) \ fldigi-font_browser.$(OBJEXT) fldigi-Viewer.$(OBJEXT) \ fldigi-htmlstrings.$(OBJEXT) fldigi-notifydialog.$(OBJEXT) \ fldigi-record_browse.$(OBJEXT) fldigi-dtmf.$(OBJEXT) \ fldigi-thor.$(OBJEXT) fldigi-thorvaricode.$(OBJEXT) \ fldigi-dominoex.$(OBJEXT) fldigi-dominovar.$(OBJEXT) \ fldigi-feld.$(OBJEXT) fldigi-feldfonts.$(OBJEXT) \ fldigi-Native_File_Chooser.$(OBJEXT) \ fldigi-fileselect.$(OBJEXT) fldigi-fftfilt.$(OBJEXT) \ fldigi-filters.$(OBJEXT) fldigi-viterbi.$(OBJEXT) \ fldigi-globals.$(OBJEXT) fldigi-irrXML.$(OBJEXT) \ fldigi-adif_io.$(OBJEXT) fldigi-calendar.$(OBJEXT) \ fldigi-date.$(OBJEXT) fldigi-lgbook.$(OBJEXT) \ fldigi-logbook.$(OBJEXT) fldigi-logsupport.$(OBJEXT) \ fldigi-lookupcall.$(OBJEXT) fldigi-qrzlib.$(OBJEXT) \ fldigi-qso_db.$(OBJEXT) fldigi-table.$(OBJEXT) \ fldigi-textio.$(OBJEXT) fldigi-logger.$(OBJEXT) \ fldigi-rx_extract.$(OBJEXT) fldigi-speak.$(OBJEXT) \ fldigi-main.$(OBJEXT) fldigi-interleave.$(OBJEXT) \ fldigi-mfsk.$(OBJEXT) fldigi-mfskvaricode.$(OBJEXT) \ fldigi-wefax.$(OBJEXT) fldigi-wefax-pic.$(OBJEXT) \ fldigi-ascii.$(OBJEXT) fldigi-charsetdistiller.$(OBJEXT) \ fldigi-charsetlist.$(OBJEXT) fldigi-configuration.$(OBJEXT) \ fldigi-coordinate.$(OBJEXT) fldigi-debug.$(OBJEXT) \ fldigi-dxcc.$(OBJEXT) fldigi-icons.$(OBJEXT) \ fldigi-kmlserver.$(OBJEXT) fldigi-log.$(OBJEXT) \ fldigi-macroedit.$(OBJEXT) fldigi-macros.$(OBJEXT) \ fldigi-misc.$(OBJEXT) fldigi-network.$(OBJEXT) \ fldigi-newinstall.$(OBJEXT) fldigi-outputencoder.$(OBJEXT) \ fldigi-arq_io.$(OBJEXT) fldigi-pixmaps.$(OBJEXT) \ fldigi-pixmaps_tango.$(OBJEXT) fldigi-re.$(OBJEXT) \ fldigi-record_loader.$(OBJEXT) fldigi-socket.$(OBJEXT) \ fldigi-stacktrace.$(OBJEXT) fldigi-status.$(OBJEXT) \ fldigi-strutil.$(OBJEXT) fldigi-threads.$(OBJEXT) \ fldigi-timeops.$(OBJEXT) fldigi-utf8file_io.$(OBJEXT) \ fldigi-util.$(OBJEXT) fldigi-weather.$(OBJEXT) \ fldigi-dsp.$(OBJEXT) fldigi-mt63.$(OBJEXT) \ fldigi-mt63base.$(OBJEXT) fldigi-navtex.$(OBJEXT) \ fldigi-olivia.$(OBJEXT) fldigi-psk.$(OBJEXT) \ fldigi-pskcoeff.$(OBJEXT) fldigi-pskvaricode.$(OBJEXT) \ fldigi-viewpsk.$(OBJEXT) fldigi-pskeval.$(OBJEXT) \ fldigi-qrunner.$(OBJEXT) fldigi-FreqControl.$(OBJEXT) \ fldigi-ptt.$(OBJEXT) fldigi-rigio.$(OBJEXT) \ fldigi-rigsupport.$(OBJEXT) fldigi-rigxml.$(OBJEXT) \ fldigi-serial.$(OBJEXT) fldigi-rsid.$(OBJEXT) \ fldigi-mixer.$(OBJEXT) fldigi-sound.$(OBJEXT) \ fldigi-soundconf.$(OBJEXT) fldigi-notify.$(OBJEXT) \ fldigi-pskrep.$(OBJEXT) fldigi-spot.$(OBJEXT) \ fldigi-ssb.$(OBJEXT) fldigi-synop.$(OBJEXT) \ fldigi-throb.$(OBJEXT) fldigi-modem.$(OBJEXT) \ fldigi-nullmodem.$(OBJEXT) fldigi-trx.$(OBJEXT) \ fldigi-colorbox.$(OBJEXT) fldigi-digiscope.$(OBJEXT) \ fldigi-raster.$(OBJEXT) fldigi-waterfall.$(OBJEXT) \ fldigi-Fl_Text_Buffer_mod.$(OBJEXT) \ fldigi-Fl_Text_Display_mod.$(OBJEXT) \ fldigi-Fl_Text_Editor_mod.$(OBJEXT) fldigi-FTextView.$(OBJEXT) \ fldigi-FTextRXTX.$(OBJEXT) fldigi-Panel.$(OBJEXT) \ fldigi-flinput2.$(OBJEXT) fldigi-flmisc.$(OBJEXT) \ fldigi-flslider2.$(OBJEXT) fldigi-picture.$(OBJEXT) \ fldigi-progress.$(OBJEXT) fldigi-psk_browser.$(OBJEXT) \ fldigi-analysis.$(OBJEXT) fldigi-wwv.$(OBJEXT) \ fldigi-xmlrpc_log.$(OBJEXT) fldigi-XmlRpcClient.$(OBJEXT) \ fldigi-XmlRpcDispatch.$(OBJEXT) fldigi-XmlRpcMutex.$(OBJEXT) \ fldigi-XmlRpcServer.$(OBJEXT) \ fldigi-XmlRpcServerConnection.$(OBJEXT) \ fldigi-XmlRpcServerMethod.$(OBJEXT) \ fldigi-XmlRpcSocket.$(OBJEXT) fldigi-XmlRpcSource.$(OBJEXT) \ fldigi-XmlRpcThread.$(OBJEXT) \ fldigi-XmlRpcThreadedServer.$(OBJEXT) \ fldigi-XmlRpcUtil.$(OBJEXT) fldigi-XmlRpcValue.$(OBJEXT) \ fldigi-tiniconv.$(OBJEXT) fldigi-tiniconv_desc.$(OBJEXT) am__objects_28 = nodist_fldigi_OBJECTS = $(am__objects_28) fldigi_OBJECTS = $(am_fldigi_OBJECTS) $(nodist_fldigi_OBJECTS) fldigi_DEPENDENCIES = fldigi_LINK = $(CXXLD) $(fldigi_CXXFLAGS) $(CXXFLAGS) \ $(fldigi_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(flarq_SOURCES) $(EXTRA_flarq_SOURCES) $(fldigi_SOURCES) \ $(EXTRA_fldigi_SOURCES) $(nodist_fldigi_SOURCES) DIST_SOURCES = $(am__flarq_SOURCES_DIST) $(EXTRA_flarq_SOURCES) \ $(am__fldigi_SOURCES_DIST) $(EXTRA_fldigi_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags am__tty_colors = \ red=; grn=; lgn=; blu=; std= DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" A2X = @A2X@ ACLOCAL = @ACLOCAL@ AC_CONFIG_ARGS = @AC_CONFIG_ARGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CFLAGS = @BFD_CFLAGS@ BFD_LIBS = @BFD_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEBUG_CFLAGS = @DEBUG_CFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_LIBS = @EXTRA_LIBS@ FLARQ_AUTHORS = @FLARQ_AUTHORS@ FLARQ_BUILD_CPPFLAGS = @FLARQ_BUILD_CPPFLAGS@ FLARQ_BUILD_CXXFLAGS = @FLARQ_BUILD_CXXFLAGS@ FLARQ_BUILD_LDADD = @FLARQ_BUILD_LDADD@ FLARQ_BUILD_LDFLAGS = @FLARQ_BUILD_LDFLAGS@ FLARQ_DOCS = @FLARQ_DOCS@ FLARQ_VERSION = @FLARQ_VERSION@ FLARQ_VERSION_MAJOR = @FLARQ_VERSION_MAJOR@ FLARQ_VERSION_MINOR = @FLARQ_VERSION_MINOR@ FLARQ_VERSION_PATCH = @FLARQ_VERSION_PATCH@ FLDIGI_AUTHORS = @FLDIGI_AUTHORS@ FLDIGI_BUILD_CPPFLAGS = @FLDIGI_BUILD_CPPFLAGS@ FLDIGI_BUILD_CXXFLAGS = @FLDIGI_BUILD_CXXFLAGS@ FLDIGI_BUILD_LDADD = @FLDIGI_BUILD_LDADD@ FLDIGI_BUILD_LDFLAGS = @FLDIGI_BUILD_LDFLAGS@ FLDIGI_VERSION = @FLDIGI_VERSION@ ######################################################################## FLDIGI_VERSION_MAJOR = @FLDIGI_VERSION_MAJOR@ FLDIGI_VERSION_MINOR = @FLDIGI_VERSION_MINOR@ FLDIGI_VERSION_PATCH = @FLDIGI_VERSION_PATCH@ FLTK_CFLAGS = @FLTK_CFLAGS@ FLTK_CONFIG = @FLTK_CONFIG@ FLTK_LIBS = @FLTK_LIBS@ FLUID = @FLUID@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ HAMLIB_CFLAGS = @HAMLIB_CFLAGS@ HAMLIB_LIBS = @HAMLIB_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_CFLAGS = @INTL_CFLAGS@ INTL_LIBS = @INTL_LIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAC_UNIVERSAL_CFLAGS = @MAC_UNIVERSAL_CFLAGS@ MAC_UNIVERSAL_LDFLAGS = @MAC_UNIVERSAL_LDFLAGS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKENSIS = @MAKENSIS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_DL = @PACKAGE_DL@ PACKAGE_DOCS = @PACKAGE_DOCS@ PACKAGE_GUIDE = @PACKAGE_GUIDE@ PACKAGE_HOME = @PACKAGE_HOME@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_NEWBUG = @PACKAGE_NEWBUG@ PACKAGE_PROJ = @PACKAGE_PROJ@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ PORTAUDIO_CFLAGS = @PORTAUDIO_CFLAGS@ PORTAUDIO_LIBS = @PORTAUDIO_LIBS@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ PTW32_CFLAGS = @PTW32_CFLAGS@ PTW32_LIBS = @PTW32_LIBS@ PULSEAUDIO_CFLAGS = @PULSEAUDIO_CFLAGS@ PULSEAUDIO_LIBS = @PULSEAUDIO_LIBS@ RDYNAMIC = @RDYNAMIC@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ X_CFLAGS = @X_CFLAGS@ X_LIBS = @X_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = # The BUILD_* variables are defined in build.m4 fldigi_CPPFLAGS = -DBUILD_FLDIGI -DLOCALEDIR=\"$(localedir)\" @FLDIGI_BUILD_CPPFLAGS@ -DPKGDATADIR=\"$(pkgdatadir)\" fldigi_CXXFLAGS = @FLDIGI_BUILD_CXXFLAGS@ fldigi_CFLAGS = $(fldigi_CXXFLAGS) fldigi_LDFLAGS = @FLDIGI_BUILD_LDFLAGS@ fldigi_LDADD = @FLDIGI_BUILD_LDADD@ flarq_CPPFLAGS = -DBUILD_FLARQ -DLOCALEDIR=\"$(localedir)\" @FLARQ_BUILD_CPPFLAGS@ flarq_CXXFLAGS = @FLARQ_BUILD_CXXFLAGS@ flarq_CFLAGS = $(flarq_CXXFLAGS) flarq_LDFLAGS = @FLARQ_BUILD_LDFLAGS@ flarq_LDADD = @FLARQ_BUILD_LDADD@ HAMLIB_SRC = include/hamlib.h rigcontrol/hamlib.cxx include/rigclass.h rigcontrol/rigclass.cxx XMLRPC_SRC = include/xmlrpc.h misc/xmlrpc.cxx FLDIGI_WIN32_RES_SRC = fldigirc.rc FLARQ_WIN32_RES_SRC = flarq-src/flarqrc.rc COMMON_WIN32_RES_SRC = common.rc LOCATOR_SRC = misc/locator.c BENCHMARK_SRC = include/benchmark.h misc/benchmark.cxx REGEX_SRC = compat/regex.h compat/regex.c STACK_SRC = include/stack.h misc/stack.cxx MINGW32_SRC = include/compat.h compat/getsysinfo.c compat/mingw.c compat/mingw.h NLS_SRC = misc/nls.cxx include/nls.h # We distribute these but do not always compile them # Sources that are part of the distribution but are not compiled directly EXTRA_fldigi_SOURCES = $(HAMLIB_SRC) $(XMLRPC_SRC) \ $(FLDIGI_WIN32_RES_SRC) $(COMMON_WIN32_RES_SRC) $(LOCATOR_SRC) \ $(BENCHMARK_SRC) $(REGEX_SRC) $(STACK_SRC) $(MINGW32_SRC) \ $(NLS_SRC) blank/blank.cxx blank/blank.h \ fileselector/flnfc_common.cxx feld/Feld7x7-14.cxx \ feld/Feld7x7n-14.cxx feld/FeldDx-14.cxx feld/FeldFat-14.cxx \ feld/FeldHell-12.cxx feld/FeldLittle-12.cxx \ feld/FeldLo8-14.cxx feld/FeldLow-14.cxx feld/FeldModern-14.cxx \ feld/FeldModern8-14.cxx feld/FeldNarr-14.cxx \ feld/FeldReal-14.cxx feld/FeldStyl-14.cxx feld/FeldVert-14.cxx \ feld/FeldWide-14.cxx include/Fl_Text_Buffer_mod.H \ include/Fl_Text_Display_mod.H include/Fl_Text_Editor_mod.H \ mfsk/mfsk-pic.cxx mt63/alias_1k.dat mt63/alias_2k.dat \ mt63/morse.dat mt63/symbol.dat mt63/alias_k5.dat \ mt63/mt63intl.dat rsid/rsid_defs.cxx trx/tune.cxx \ dialogs/guide.cxx libtiniconv/tiniconv.h \ libtiniconv/tiniconv_int.h libtiniconv/encdec/ascii.h \ libtiniconv/encdec/big5.h libtiniconv/encdec/ces_big5.h \ libtiniconv/encdec/ces_gbk.h libtiniconv/encdec/cp1250.h \ libtiniconv/encdec/cp1251.h libtiniconv/encdec/cp1252.h \ libtiniconv/encdec/cp1253.h libtiniconv/encdec/cp1254.h \ libtiniconv/encdec/cp1255.h libtiniconv/encdec/cp1256.h \ libtiniconv/encdec/cp1257.h libtiniconv/encdec/cp1258.h \ libtiniconv/encdec/cp866.h libtiniconv/encdec/cp936ext.h \ libtiniconv/encdec/cp936.h libtiniconv/encdec/euc_cn.h \ libtiniconv/encdec/flushwc.h libtiniconv/encdec/gb2312.h \ libtiniconv/encdec/gbkext1.h libtiniconv/encdec/gbkext2.h \ libtiniconv/encdec/gbkext_inv.h libtiniconv/encdec/gbk.h \ libtiniconv/encdec/iso2022_jp.h \ libtiniconv/encdec/iso8859_10.h \ libtiniconv/encdec/iso8859_11.h \ libtiniconv/encdec/iso8859_13.h \ libtiniconv/encdec/iso8859_14.h \ libtiniconv/encdec/iso8859_15.h \ libtiniconv/encdec/iso8859_16.h libtiniconv/encdec/iso8859_1.h \ libtiniconv/encdec/iso8859_2.h libtiniconv/encdec/iso8859_3.h \ libtiniconv/encdec/iso8859_4.h libtiniconv/encdec/iso8859_5.h \ libtiniconv/encdec/iso8859_6.h libtiniconv/encdec/iso8859_7.h \ libtiniconv/encdec/iso8859_8.h libtiniconv/encdec/iso8859_9.h \ libtiniconv/encdec/jisx0201.h libtiniconv/encdec/jisx0208.h \ libtiniconv/encdec/koi8_r.h libtiniconv/encdec/koi8_ru.h \ libtiniconv/encdec/koi8_u.h libtiniconv/encdec/mac_cyrillic.h \ libtiniconv/encdec/ucs2.h libtiniconv/encdec/utf7.h \ libtiniconv/encdec/utf8.h libtiniconv/encdec/vietcomb.h \ libtiniconv/AUTHORS libtiniconv/COPYING libtiniconv/README \ libtiniconv/README.FLDIGI EXTRA_flarq_SOURCES = $(FLARQ_WIN32_RES_SRC) $(COMMON_WIN32_RES_SRC) # Sources that we build. It is OK to have headers here. fldigi_SOURCES = $(XMLRPC_SRC) $(am__append_3) $(am__append_4) \ $(am__append_5) $(am__append_6) $(am__append_8) \ $(am__append_10) $(am__append_12) $(am__append_14) \ combo/combo.cxx cw_rtty/cw.cxx cw_rtty/morse.cxx \ cw_rtty/rtty.cxx cw_rtty/view_rtty.cxx contestia/contestia.cxx \ dialogs/confdialog.cxx dialogs/fl_digi.cxx \ dialogs/font_browser.cxx dialogs/Viewer.cxx \ dialogs/htmlstrings.cxx dialogs/notifydialog.cxx \ dialogs/record_browse.cxx dtmf/dtmf.cxx thor/thor.cxx \ thor/thorvaricode.cxx dominoex/dominoex.cxx \ dominoex/dominovar.cxx feld/feld.cxx feld/feldfonts.cxx \ fileselector/FL/Native_File_Chooser.H \ fileselector/Native_File_Chooser.cxx \ fileselector/fileselect.cxx filters/fftfilt.cxx \ filters/filters.cxx filters/viterbi.cxx globals/globals.cxx \ include/htmlstrings.h include/arq_io.h include/confdialog.h \ include/dtmf.h include/FTextView.h include/FTextRXTX.h \ include/fileselect.h include/Panel.h include/FreqControl.h \ include/analysis.h include/ascii.h include/charsetdistiller.h \ include/charsetlist.h include/colorbox.h include/combo.h \ include/complex.h include/configuration.h include/contestia.h \ include/cw.h include/debug.h include/digiscope.h \ include/dxcc.h include/thor.h include/thorvaricode.h \ include/dominoex.h include/dominovar.h include/feld.h \ include/fftfilt.h include/filters.h include/fl_digi.h \ include/fl_lock.h include/fldigi-config.h include/flinput2.h \ include/flmisc.h include/flslider2.h include/font_browser.h \ include/fontdef.h include/gettext.h include/globals.h \ include/icons.h include/interleave.h include/jalocha/pj_cmpx.h \ include/jalocha/pj_fft.h include/jalocha/pj_fht.h \ include/jalocha/pj_fifo.h include/jalocha/pj_gray.h \ include/jalocha/pj_lowpass3.h include/jalocha/pj_mfsk.h \ include/jalocha/pj_struc.h include/coordinate.h include/gfft.h \ include/kmlserver.h include/locator.h include/log.h \ include/logger.h include/macroedit.h include/macros.h \ include/main.h include/mbuffer.h include/mfsk.h \ include/mfskvaricode.h include/wefax.h include/wefax-pic.h \ include/misc.h include/mixer.h include/modem.h include/morse.h \ include/mt63base.h include/mt63.h include/network.h \ include/dsp.h include/newinstall.h include/notify.h \ include/notifydialog.h include/record_browse.h \ include/olivia.h include/pkg.h include/picture.h \ include/progress.h include/psk.h include/viewpsk.h \ include/pskcoeff.h include/pskvaricode.h include/pskeval.h \ include/ptt.h include/pixmaps.h include/pskrep.h \ include/qrunner.h include/lookupcall.h include/qrzlib.h \ include/raster.h include/re.h include/rigCAT.h include/rigio.h \ include/rigsupport.h include/rigxml.h include/ringbuffer.h \ include/rsid.h include/rtty.h include/view_rtty.h \ include/synop.h include/nullmodem.h include/record_loader.h \ include/record_loader_gui.h include/rx_extract.h \ include/speak.h include/serial.h include/socket.h \ include/sound.h include/soundconf.h include/spot.h \ include/ssb.h include/stacktrace.h include/status.h \ include/strutil.h include/testmodem.h include/threads.h \ include/throb.h include/timeops.h include/trx.h include/util.h \ include/Viewer.h include/viterbi.h include/waterfall.h \ include/wwv.h include/xmlreader.h include/adif_def.h \ include/adif_io.h include/calendar.h include/date.h \ include/field_def.h include/logbook.h include/lgbook.h \ include/logsupport.h include/outputencoder.h include/qso_db.h \ include/table.h include/textio.h include/psk_browser.h \ include/utf8file_io.h include/weather.h \ irrxml/CXMLReaderImpl.h irrxml/fast_atof.h irrxml/heapsort.h \ irrxml/irrArray.h irrxml/irrString.h irrxml/irrTypes.h \ irrxml/irrXML.cpp irrxml/irrXML.h logbook/adif_io.cxx \ logbook/calendar.cxx logbook/date.cxx logbook/lgbook.cxx \ logbook/logbook.cxx logbook/logsupport.cxx \ logbook/lookupcall.cxx logbook/qrzlib.cxx logbook/qso_db.cxx \ logbook/table.cxx logbook/textio.cxx logger/logger.cxx \ logger/rx_extract.cxx logger/speak.cxx main.cxx \ mfsk/interleave.cxx mfsk/mfsk.cxx mfsk/mfskvaricode.cxx \ wefax/wefax.cxx wefax/wefax-pic.cxx misc/ascii.cxx \ misc/charsetdistiller.cxx misc/charsetlist.cxx \ misc/configuration.cxx misc/coordinate.cxx misc/debug.cxx \ misc/dxcc.cxx misc/icons.cxx misc/kmlserver.cxx misc/log.cxx \ misc/macroedit.cxx misc/macros.cxx misc/misc.cxx \ misc/network.cxx misc/newinstall.cxx misc/outputencoder.cxx \ misc/arq_io.cxx misc/pixmaps.cxx misc/pixmaps_tango.cxx \ misc/re.cxx misc/record_loader.cxx misc/socket.cxx \ misc/stacktrace.cxx misc/status.cxx misc/strutil.cxx \ misc/threads.cxx misc/timeops.cxx misc/utf8file_io.cxx \ misc/util.cxx misc/weather.cxx mt63/dsp.cxx mt63/mt63.cxx \ mt63/mt63base.cxx navtex/navtex.cxx include/navtex.h \ olivia/olivia.cxx psk/psk.cxx psk/pskcoeff.cxx \ psk/pskvaricode.cxx psk/viewpsk.cxx psk/pskeval.cxx \ qrunner/fqueue.h qrunner/qrunner.cxx \ rigcontrol/FreqControl.cxx rigcontrol/ptt.cxx \ rigcontrol/rigio.cxx rigcontrol/rigsupport.cxx \ rigcontrol/rigxml.cxx rigcontrol/serial.cxx rsid/rsid.cxx \ soundcard/mixer.cxx soundcard/sound.cxx \ soundcard/soundconf.cxx spot/notify.cxx spot/pskrep.cxx \ spot/spot.cxx ssb/ssb.cxx synop-src/synop.cxx throb/throb.cxx \ trx/modem.cxx trx/nullmodem.cxx trx/trx.cxx \ waterfall/colorbox.cxx waterfall/digiscope.cxx \ waterfall/raster.cxx waterfall/waterfall.cxx \ widgets/Fl_Text_Buffer_mod.cxx widgets/Fl_Text_Display_mod.cxx \ widgets/Fl_Text_Editor_mod.cxx widgets/FTextView.cxx \ widgets/FTextRXTX.cxx widgets/Panel.cxx widgets/flinput2.cxx \ widgets/flmisc.cxx widgets/flslider2.cxx widgets/picture.cxx \ widgets/progress.cxx widgets/psk_browser.cxx wwv/analysis.cxx \ wwv/wwv.cxx logbook/xmlrpc_log.cxx xmlrpcpp/XmlRpc.h \ xmlrpcpp/XmlRpcClient.cpp xmlrpcpp/XmlRpcClient.h \ xmlrpcpp/XmlRpcDispatch.cpp xmlrpcpp/XmlRpcDispatch.h \ xmlrpcpp/XmlRpcException.h xmlrpcpp/XmlRpcMutex.cpp \ xmlrpcpp/XmlRpcMutex.h xmlrpcpp/XmlRpcServer.cpp \ xmlrpcpp/XmlRpcServer.h xmlrpcpp/XmlRpcServerConnection.cpp \ xmlrpcpp/XmlRpcServerConnection.h \ xmlrpcpp/XmlRpcServerMethod.cpp xmlrpcpp/XmlRpcServerMethod.h \ xmlrpcpp/XmlRpcSocket.cpp xmlrpcpp/XmlRpcSocket.h \ xmlrpcpp/XmlRpcSource.cpp xmlrpcpp/XmlRpcSource.h \ xmlrpcpp/XmlRpcThread.cpp xmlrpcpp/XmlRpcThread.h \ xmlrpcpp/XmlRpcThreadedServer.cpp \ xmlrpcpp/XmlRpcThreadedServer.h xmlrpcpp/XmlRpcUtil.cpp \ xmlrpcpp/XmlRpcUtil.h xmlrpcpp/XmlRpcValue.cpp \ xmlrpcpp/XmlRpcValue.h xmlrpcpp/base64.h \ libtiniconv/tiniconv.c libtiniconv/tiniconv_desc.c flarq_SOURCES = $(am__append_7) $(am__append_9) $(am__append_11) \ $(am__append_13) $(am__append_15) dialogs/font_browser.cxx \ flarq-src/arq.cxx flarq-src/arqdialogs.cxx \ flarq-src/arqhelp.cxx flarq-src/b64.cxx flarq-src/flarq.cxx \ flarq-src/flarqenv.cxx flarq-src/include/arq.h \ flarq-src/include/arqdialogs.h flarq-src/include/b64.h \ flarq-src/include/flarq.h flarq-src/include/flarqenv.h \ include/Fl_Text_Display_mod.H include/Fl_Text_Editor_mod.H \ include/FTextView.h include/debug.h include/fileselect.h \ include/flinput2.h include/flmisc.h include/flslider2.h \ include/font_browser.h include/icons.h include/pixmaps.h \ include/re.h include/socket.h include/stacktrace.h \ include/threads.h include/table.h include/util.h \ combo/combo.cxx fileselector/FL/Native_File_Chooser.H \ fileselector/Native_File_Chooser.cxx \ fileselector/fileselect.cxx logbook/table.cxx misc/ascii.cxx \ misc/debug.cxx misc/stacktrace.cxx misc/threads.cxx \ misc/timeops.cxx widgets/flinput2.cxx widgets/flmisc.cxx \ widgets/flslider2.cxx misc/icons.cxx misc/pixmaps.cxx \ misc/pixmaps_tango.cxx misc/re.cxx misc/socket.cxx \ misc/util.cxx widgets/Fl_Text_Buffer_mod.cxx \ widgets/Fl_Text_Display_mod.cxx widgets/Fl_Text_Editor_mod.cxx \ widgets/FTextView.cxx # Sources that are generated, BUILT_SOURCES = # not distributed, nodist_fldigi_SOURCES = $(BUILT_SOURCES) # and deleted by the clean targets CLEANFILES = $(BUILT_SOURCES) $(am__append_17) CLEAN_LOCAL = $(am__append_16) $(am__append_18) FLDIGI_FL_SRC = \ dialogs/confdialog.fl \ dialogs/notifydialog.fl \ dialogs/record_browse.fl \ logbook/lgbook.fl FLARQ_FL_SRC = flarq-src/arqdialogs.fl @WANT_FLDIGI_TRUE@WANT_FLDIGI = yes @WANT_FLARQ_TRUE@@WANT_FLDIGI_FALSE@INSTALLER_FILE = flarq-$(FLARQ_VERSION)_setup.exe @WANT_FLDIGI_TRUE@INSTALLER_FILE = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)_setup.exe @WANT_FLARQ_TRUE@@WANT_FLDIGI_FALSE@APPBUNDLE = flarq-$(FLARQ_VERSION) @WANT_FLDIGI_TRUE@APPBUNDLE = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION) @WANT_FLARQ_TRUE@@WANT_FLDIGI_FALSE@APPBUNDLE_NOLIBS = $(APPBUNDLE)-nolibs @WANT_FLDIGI_TRUE@APPBUNDLE_NOLIBS = $(APPBUNDLE)-nolibs @WANT_FLARQ_TRUE@WANT_FLARQ = yes tmp_srcdir_var = $(srcdir) TESTS = $(tmp_srcdir_var)/../scripts/tests/config-h.sh $(tmp_srcdir_var)/../scripts/tests/cr.sh # Additional files that we distribute EXTRA_DIST = \ $(srcdir)/../scripts/mkappbundle.sh \ $(srcdir)/../scripts/mkhamlibstatic.sh \ $(srcdir)/../scripts/mknsisinst.sh \ $(srcdir)/../scripts/fldigi-shell \ $(srcdir)/../scripts/tests/cr.sh \ $(srcdir)/../scripts/tests/config-h.sh \ $(srcdir)/../data/fldigi-psk.png \ $(srcdir)/../data/fldigi-rtty.png \ $(srcdir)/../data/fldigi.xpm \ $(srcdir)/../data/fldigi.desktop \ $(srcdir)/../data/NAVTEX_Stations.csv \ $(srcdir)/../data/nsd_bbsss.txt \ $(srcdir)/../data/station_table.txt \ $(srcdir)/../data/ToR-Stats-SHIP.csv \ $(srcdir)/../data/mac/Info.plist.in \ $(srcdir)/../data/mac/fldigi.icns \ $(srcdir)/../data/win32/fldigi.ico \ $(srcdir)/../data/flarq.desktop \ $(srcdir)/../data/flarq.xpm \ $(srcdir)/../data/mac/flarq.icns \ $(srcdir)/../data/win32/flarq.ico \ $(srcdir)/synop-src/synop_tool.cxx \ $(srcdir)/synop-src/README \ $(srcdir)/synop-src/Makefile \ $(FLDIGI_FL_SRC) \ $(FLARQ_FL_SRC) all: $(BUILT_SOURCES) config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .cpp .cxx .o .obj .rc $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status src/config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) installcheck-binPROGRAMS: $(bin_PROGRAMS) bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \ case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \ *" $$p "* | *" $(srcdir)/$$p "*) continue;; \ esac; \ f=`echo "$$p" | \ sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ for opt in --help --version; do \ if "$(DESTDIR)$(bindir)/$$f" $$opt >c$${pid}_.out \ 2>c$${pid}_.err &2; bad=1; fi; \ done; \ done; rm -f c$${pid}_.???; exit $$bad flarq-src/$(am__dirstamp): @$(MKDIR_P) flarq-src @: > flarq-src/$(am__dirstamp) flarq-src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) flarq-src/$(DEPDIR) @: > flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarqrc.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) flarq$(EXEEXT): $(flarq_OBJECTS) $(flarq_DEPENDENCIES) $(EXTRA_flarq_DEPENDENCIES) @rm -f flarq$(EXEEXT) $(AM_V_CXXLD)$(flarq_LINK) $(flarq_OBJECTS) $(flarq_LDADD) $(LIBS) fldigi$(EXEEXT): $(fldigi_OBJECTS) $(fldigi_DEPENDENCIES) $(EXTRA_fldigi_DEPENDENCIES) @rm -f fldigi$(EXEEXT) $(AM_V_CXXLD)$(fldigi_LINK) $(fldigi_OBJECTS) $(fldigi_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f flarq-src/flarqrc.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-FTextView.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-Fl_Text_Display_mod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-Fl_Text_Editor_mod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-Native_File_Chooser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-arq.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-arqdialogs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-arqhelp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-ascii.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-b64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-combo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-debug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-fileselect.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-flarq.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-flarqenv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-flinput2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-flmisc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-flslider2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-font_browser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-getsysinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-icons.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-mingw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-nls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-pixmaps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-pixmaps_tango.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-re.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-regex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-socket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-stack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-stacktrace.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-table.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-threads.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-timeops.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flarq-util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FTextRXTX.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FTextView.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-Feld7x7-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-Feld7x7n-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FeldDx-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FeldFat-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FeldHell-12.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FeldLittle-12.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FeldLo8-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FeldLow-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FeldModern-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FeldModern8-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FeldNarr-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FeldReal-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FeldStyl-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FeldVert-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FeldWide-14.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-Fl_Text_Display_mod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-FreqControl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-Native_File_Chooser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-Panel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-Viewer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-XmlRpcClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-XmlRpcDispatch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-XmlRpcMutex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-XmlRpcServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-XmlRpcServerConnection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-XmlRpcServerMethod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-XmlRpcSocket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-XmlRpcSource.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-XmlRpcThread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-XmlRpcThreadedServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-XmlRpcUtil.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-XmlRpcValue.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-adif_io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-analysis.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-arq_io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-ascii.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-benchmark.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-blank.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-calendar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-charsetdistiller.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-charsetlist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-colorbox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-combo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-confdialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-configuration.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-contestia.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-coordinate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-cw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-date.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-debug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-digiscope.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-dominoex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-dominovar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-dsp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-dtmf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-dxcc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-feld.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-feldfonts.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-fftfilt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-fileselect.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-filters.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-fl_digi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-flinput2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-flmisc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-flnfc_common.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-flslider2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-font_browser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-getsysinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-globals.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-guide.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-hamlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-htmlstrings.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-icons.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-interleave.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-irrXML.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-kmlserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-lgbook.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-locator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-logbook.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-logger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-logsupport.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-lookupcall.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-macroedit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-macros.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-mfsk-pic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-mfsk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-mfskvaricode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-mingw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-misc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-mixer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-modem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-morse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-mt63.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-mt63base.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-navtex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-network.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-newinstall.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-nls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-notify.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-notifydialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-nullmodem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-olivia.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-outputencoder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-picture.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-pixmaps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-pixmaps_tango.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-progress.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-psk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-psk_browser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-pskcoeff.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-pskeval.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-pskrep.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-pskvaricode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-ptt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-qrunner.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-qrzlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-qso_db.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-raster.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-re.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-record_browse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-record_loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-regex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-rigclass.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-rigio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-rigsupport.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-rigxml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-rsid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-rsid_defs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-rtty.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-rx_extract.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-serial.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-socket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-sound.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-soundconf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-speak.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-spot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-ssb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-stack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-stacktrace.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-status.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-strutil.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-synop.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-table.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-textio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-thor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-thorvaricode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-threads.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-throb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-timeops.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-tiniconv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-tiniconv_desc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-trx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-tune.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-utf8file_io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-view_rtty.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-viewpsk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-viterbi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-waterfall.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-weather.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-wefax-pic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-wefax.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-wwv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-xmlrpc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-xmlrpc_log.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` flarq-regex.o: compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT flarq-regex.o -MD -MP -MF $(DEPDIR)/flarq-regex.Tpo -c -o flarq-regex.o `test -f 'compat/regex.c' || echo '$(srcdir)/'`compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-regex.Tpo $(DEPDIR)/flarq-regex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/regex.c' object='flarq-regex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o flarq-regex.o `test -f 'compat/regex.c' || echo '$(srcdir)/'`compat/regex.c flarq-regex.obj: compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT flarq-regex.obj -MD -MP -MF $(DEPDIR)/flarq-regex.Tpo -c -o flarq-regex.obj `if test -f 'compat/regex.c'; then $(CYGPATH_W) 'compat/regex.c'; else $(CYGPATH_W) '$(srcdir)/compat/regex.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-regex.Tpo $(DEPDIR)/flarq-regex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/regex.c' object='flarq-regex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o flarq-regex.obj `if test -f 'compat/regex.c'; then $(CYGPATH_W) 'compat/regex.c'; else $(CYGPATH_W) '$(srcdir)/compat/regex.c'; fi` flarq-getsysinfo.o: compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT flarq-getsysinfo.o -MD -MP -MF $(DEPDIR)/flarq-getsysinfo.Tpo -c -o flarq-getsysinfo.o `test -f 'compat/getsysinfo.c' || echo '$(srcdir)/'`compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-getsysinfo.Tpo $(DEPDIR)/flarq-getsysinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/getsysinfo.c' object='flarq-getsysinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o flarq-getsysinfo.o `test -f 'compat/getsysinfo.c' || echo '$(srcdir)/'`compat/getsysinfo.c flarq-getsysinfo.obj: compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT flarq-getsysinfo.obj -MD -MP -MF $(DEPDIR)/flarq-getsysinfo.Tpo -c -o flarq-getsysinfo.obj `if test -f 'compat/getsysinfo.c'; then $(CYGPATH_W) 'compat/getsysinfo.c'; else $(CYGPATH_W) '$(srcdir)/compat/getsysinfo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-getsysinfo.Tpo $(DEPDIR)/flarq-getsysinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/getsysinfo.c' object='flarq-getsysinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o flarq-getsysinfo.obj `if test -f 'compat/getsysinfo.c'; then $(CYGPATH_W) 'compat/getsysinfo.c'; else $(CYGPATH_W) '$(srcdir)/compat/getsysinfo.c'; fi` flarq-mingw.o: compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT flarq-mingw.o -MD -MP -MF $(DEPDIR)/flarq-mingw.Tpo -c -o flarq-mingw.o `test -f 'compat/mingw.c' || echo '$(srcdir)/'`compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-mingw.Tpo $(DEPDIR)/flarq-mingw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/mingw.c' object='flarq-mingw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o flarq-mingw.o `test -f 'compat/mingw.c' || echo '$(srcdir)/'`compat/mingw.c flarq-mingw.obj: compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT flarq-mingw.obj -MD -MP -MF $(DEPDIR)/flarq-mingw.Tpo -c -o flarq-mingw.obj `if test -f 'compat/mingw.c'; then $(CYGPATH_W) 'compat/mingw.c'; else $(CYGPATH_W) '$(srcdir)/compat/mingw.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-mingw.Tpo $(DEPDIR)/flarq-mingw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/mingw.c' object='flarq-mingw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o flarq-mingw.obj `if test -f 'compat/mingw.c'; then $(CYGPATH_W) 'compat/mingw.c'; else $(CYGPATH_W) '$(srcdir)/compat/mingw.c'; fi` fldigi-locator.o: misc/locator.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT fldigi-locator.o -MD -MP -MF $(DEPDIR)/fldigi-locator.Tpo -c -o fldigi-locator.o `test -f 'misc/locator.c' || echo '$(srcdir)/'`misc/locator.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-locator.Tpo $(DEPDIR)/fldigi-locator.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='misc/locator.c' object='fldigi-locator.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o fldigi-locator.o `test -f 'misc/locator.c' || echo '$(srcdir)/'`misc/locator.c fldigi-locator.obj: misc/locator.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT fldigi-locator.obj -MD -MP -MF $(DEPDIR)/fldigi-locator.Tpo -c -o fldigi-locator.obj `if test -f 'misc/locator.c'; then $(CYGPATH_W) 'misc/locator.c'; else $(CYGPATH_W) '$(srcdir)/misc/locator.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-locator.Tpo $(DEPDIR)/fldigi-locator.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='misc/locator.c' object='fldigi-locator.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o fldigi-locator.obj `if test -f 'misc/locator.c'; then $(CYGPATH_W) 'misc/locator.c'; else $(CYGPATH_W) '$(srcdir)/misc/locator.c'; fi` fldigi-regex.o: compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT fldigi-regex.o -MD -MP -MF $(DEPDIR)/fldigi-regex.Tpo -c -o fldigi-regex.o `test -f 'compat/regex.c' || echo '$(srcdir)/'`compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-regex.Tpo $(DEPDIR)/fldigi-regex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/regex.c' object='fldigi-regex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o fldigi-regex.o `test -f 'compat/regex.c' || echo '$(srcdir)/'`compat/regex.c fldigi-regex.obj: compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT fldigi-regex.obj -MD -MP -MF $(DEPDIR)/fldigi-regex.Tpo -c -o fldigi-regex.obj `if test -f 'compat/regex.c'; then $(CYGPATH_W) 'compat/regex.c'; else $(CYGPATH_W) '$(srcdir)/compat/regex.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-regex.Tpo $(DEPDIR)/fldigi-regex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/regex.c' object='fldigi-regex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o fldigi-regex.obj `if test -f 'compat/regex.c'; then $(CYGPATH_W) 'compat/regex.c'; else $(CYGPATH_W) '$(srcdir)/compat/regex.c'; fi` fldigi-getsysinfo.o: compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT fldigi-getsysinfo.o -MD -MP -MF $(DEPDIR)/fldigi-getsysinfo.Tpo -c -o fldigi-getsysinfo.o `test -f 'compat/getsysinfo.c' || echo '$(srcdir)/'`compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-getsysinfo.Tpo $(DEPDIR)/fldigi-getsysinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/getsysinfo.c' object='fldigi-getsysinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o fldigi-getsysinfo.o `test -f 'compat/getsysinfo.c' || echo '$(srcdir)/'`compat/getsysinfo.c fldigi-getsysinfo.obj: compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT fldigi-getsysinfo.obj -MD -MP -MF $(DEPDIR)/fldigi-getsysinfo.Tpo -c -o fldigi-getsysinfo.obj `if test -f 'compat/getsysinfo.c'; then $(CYGPATH_W) 'compat/getsysinfo.c'; else $(CYGPATH_W) '$(srcdir)/compat/getsysinfo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-getsysinfo.Tpo $(DEPDIR)/fldigi-getsysinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/getsysinfo.c' object='fldigi-getsysinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o fldigi-getsysinfo.obj `if test -f 'compat/getsysinfo.c'; then $(CYGPATH_W) 'compat/getsysinfo.c'; else $(CYGPATH_W) '$(srcdir)/compat/getsysinfo.c'; fi` fldigi-mingw.o: compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT fldigi-mingw.o -MD -MP -MF $(DEPDIR)/fldigi-mingw.Tpo -c -o fldigi-mingw.o `test -f 'compat/mingw.c' || echo '$(srcdir)/'`compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-mingw.Tpo $(DEPDIR)/fldigi-mingw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/mingw.c' object='fldigi-mingw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o fldigi-mingw.o `test -f 'compat/mingw.c' || echo '$(srcdir)/'`compat/mingw.c fldigi-mingw.obj: compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT fldigi-mingw.obj -MD -MP -MF $(DEPDIR)/fldigi-mingw.Tpo -c -o fldigi-mingw.obj `if test -f 'compat/mingw.c'; then $(CYGPATH_W) 'compat/mingw.c'; else $(CYGPATH_W) '$(srcdir)/compat/mingw.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-mingw.Tpo $(DEPDIR)/fldigi-mingw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/mingw.c' object='fldigi-mingw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o fldigi-mingw.obj `if test -f 'compat/mingw.c'; then $(CYGPATH_W) 'compat/mingw.c'; else $(CYGPATH_W) '$(srcdir)/compat/mingw.c'; fi` fldigi-tiniconv.o: libtiniconv/tiniconv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT fldigi-tiniconv.o -MD -MP -MF $(DEPDIR)/fldigi-tiniconv.Tpo -c -o fldigi-tiniconv.o `test -f 'libtiniconv/tiniconv.c' || echo '$(srcdir)/'`libtiniconv/tiniconv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-tiniconv.Tpo $(DEPDIR)/fldigi-tiniconv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtiniconv/tiniconv.c' object='fldigi-tiniconv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o fldigi-tiniconv.o `test -f 'libtiniconv/tiniconv.c' || echo '$(srcdir)/'`libtiniconv/tiniconv.c fldigi-tiniconv.obj: libtiniconv/tiniconv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT fldigi-tiniconv.obj -MD -MP -MF $(DEPDIR)/fldigi-tiniconv.Tpo -c -o fldigi-tiniconv.obj `if test -f 'libtiniconv/tiniconv.c'; then $(CYGPATH_W) 'libtiniconv/tiniconv.c'; else $(CYGPATH_W) '$(srcdir)/libtiniconv/tiniconv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-tiniconv.Tpo $(DEPDIR)/fldigi-tiniconv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtiniconv/tiniconv.c' object='fldigi-tiniconv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o fldigi-tiniconv.obj `if test -f 'libtiniconv/tiniconv.c'; then $(CYGPATH_W) 'libtiniconv/tiniconv.c'; else $(CYGPATH_W) '$(srcdir)/libtiniconv/tiniconv.c'; fi` fldigi-tiniconv_desc.o: libtiniconv/tiniconv_desc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT fldigi-tiniconv_desc.o -MD -MP -MF $(DEPDIR)/fldigi-tiniconv_desc.Tpo -c -o fldigi-tiniconv_desc.o `test -f 'libtiniconv/tiniconv_desc.c' || echo '$(srcdir)/'`libtiniconv/tiniconv_desc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-tiniconv_desc.Tpo $(DEPDIR)/fldigi-tiniconv_desc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtiniconv/tiniconv_desc.c' object='fldigi-tiniconv_desc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o fldigi-tiniconv_desc.o `test -f 'libtiniconv/tiniconv_desc.c' || echo '$(srcdir)/'`libtiniconv/tiniconv_desc.c fldigi-tiniconv_desc.obj: libtiniconv/tiniconv_desc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT fldigi-tiniconv_desc.obj -MD -MP -MF $(DEPDIR)/fldigi-tiniconv_desc.Tpo -c -o fldigi-tiniconv_desc.obj `if test -f 'libtiniconv/tiniconv_desc.c'; then $(CYGPATH_W) 'libtiniconv/tiniconv_desc.c'; else $(CYGPATH_W) '$(srcdir)/libtiniconv/tiniconv_desc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-tiniconv_desc.Tpo $(DEPDIR)/fldigi-tiniconv_desc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtiniconv/tiniconv_desc.c' object='fldigi-tiniconv_desc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o fldigi-tiniconv_desc.obj `if test -f 'libtiniconv/tiniconv_desc.c'; then $(CYGPATH_W) 'libtiniconv/tiniconv_desc.c'; else $(CYGPATH_W) '$(srcdir)/libtiniconv/tiniconv_desc.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` flarq-stack.o: misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-stack.o -MD -MP -MF $(DEPDIR)/flarq-stack.Tpo -c -o flarq-stack.o `test -f 'misc/stack.cxx' || echo '$(srcdir)/'`misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-stack.Tpo $(DEPDIR)/flarq-stack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stack.cxx' object='flarq-stack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-stack.o `test -f 'misc/stack.cxx' || echo '$(srcdir)/'`misc/stack.cxx flarq-stack.obj: misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-stack.obj -MD -MP -MF $(DEPDIR)/flarq-stack.Tpo -c -o flarq-stack.obj `if test -f 'misc/stack.cxx'; then $(CYGPATH_W) 'misc/stack.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stack.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-stack.Tpo $(DEPDIR)/flarq-stack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stack.cxx' object='flarq-stack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-stack.obj `if test -f 'misc/stack.cxx'; then $(CYGPATH_W) 'misc/stack.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stack.cxx'; fi` flarq-nls.o: misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-nls.o -MD -MP -MF $(DEPDIR)/flarq-nls.Tpo -c -o flarq-nls.o `test -f 'misc/nls.cxx' || echo '$(srcdir)/'`misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-nls.Tpo $(DEPDIR)/flarq-nls.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/nls.cxx' object='flarq-nls.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-nls.o `test -f 'misc/nls.cxx' || echo '$(srcdir)/'`misc/nls.cxx flarq-nls.obj: misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-nls.obj -MD -MP -MF $(DEPDIR)/flarq-nls.Tpo -c -o flarq-nls.obj `if test -f 'misc/nls.cxx'; then $(CYGPATH_W) 'misc/nls.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/nls.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-nls.Tpo $(DEPDIR)/flarq-nls.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/nls.cxx' object='flarq-nls.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-nls.obj `if test -f 'misc/nls.cxx'; then $(CYGPATH_W) 'misc/nls.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/nls.cxx'; fi` flarq-font_browser.o: dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-font_browser.o -MD -MP -MF $(DEPDIR)/flarq-font_browser.Tpo -c -o flarq-font_browser.o `test -f 'dialogs/font_browser.cxx' || echo '$(srcdir)/'`dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-font_browser.Tpo $(DEPDIR)/flarq-font_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/font_browser.cxx' object='flarq-font_browser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-font_browser.o `test -f 'dialogs/font_browser.cxx' || echo '$(srcdir)/'`dialogs/font_browser.cxx flarq-font_browser.obj: dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-font_browser.obj -MD -MP -MF $(DEPDIR)/flarq-font_browser.Tpo -c -o flarq-font_browser.obj `if test -f 'dialogs/font_browser.cxx'; then $(CYGPATH_W) 'dialogs/font_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/font_browser.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-font_browser.Tpo $(DEPDIR)/flarq-font_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/font_browser.cxx' object='flarq-font_browser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-font_browser.obj `if test -f 'dialogs/font_browser.cxx'; then $(CYGPATH_W) 'dialogs/font_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/font_browser.cxx'; fi` flarq-arq.o: flarq-src/arq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-arq.o -MD -MP -MF $(DEPDIR)/flarq-arq.Tpo -c -o flarq-arq.o `test -f 'flarq-src/arq.cxx' || echo '$(srcdir)/'`flarq-src/arq.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-arq.Tpo $(DEPDIR)/flarq-arq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arq.cxx' object='flarq-arq.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-arq.o `test -f 'flarq-src/arq.cxx' || echo '$(srcdir)/'`flarq-src/arq.cxx flarq-arq.obj: flarq-src/arq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-arq.obj -MD -MP -MF $(DEPDIR)/flarq-arq.Tpo -c -o flarq-arq.obj `if test -f 'flarq-src/arq.cxx'; then $(CYGPATH_W) 'flarq-src/arq.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arq.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-arq.Tpo $(DEPDIR)/flarq-arq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arq.cxx' object='flarq-arq.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-arq.obj `if test -f 'flarq-src/arq.cxx'; then $(CYGPATH_W) 'flarq-src/arq.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arq.cxx'; fi` flarq-arqdialogs.o: flarq-src/arqdialogs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-arqdialogs.o -MD -MP -MF $(DEPDIR)/flarq-arqdialogs.Tpo -c -o flarq-arqdialogs.o `test -f 'flarq-src/arqdialogs.cxx' || echo '$(srcdir)/'`flarq-src/arqdialogs.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-arqdialogs.Tpo $(DEPDIR)/flarq-arqdialogs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arqdialogs.cxx' object='flarq-arqdialogs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-arqdialogs.o `test -f 'flarq-src/arqdialogs.cxx' || echo '$(srcdir)/'`flarq-src/arqdialogs.cxx flarq-arqdialogs.obj: flarq-src/arqdialogs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-arqdialogs.obj -MD -MP -MF $(DEPDIR)/flarq-arqdialogs.Tpo -c -o flarq-arqdialogs.obj `if test -f 'flarq-src/arqdialogs.cxx'; then $(CYGPATH_W) 'flarq-src/arqdialogs.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arqdialogs.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-arqdialogs.Tpo $(DEPDIR)/flarq-arqdialogs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arqdialogs.cxx' object='flarq-arqdialogs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-arqdialogs.obj `if test -f 'flarq-src/arqdialogs.cxx'; then $(CYGPATH_W) 'flarq-src/arqdialogs.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arqdialogs.cxx'; fi` flarq-arqhelp.o: flarq-src/arqhelp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-arqhelp.o -MD -MP -MF $(DEPDIR)/flarq-arqhelp.Tpo -c -o flarq-arqhelp.o `test -f 'flarq-src/arqhelp.cxx' || echo '$(srcdir)/'`flarq-src/arqhelp.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-arqhelp.Tpo $(DEPDIR)/flarq-arqhelp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arqhelp.cxx' object='flarq-arqhelp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-arqhelp.o `test -f 'flarq-src/arqhelp.cxx' || echo '$(srcdir)/'`flarq-src/arqhelp.cxx flarq-arqhelp.obj: flarq-src/arqhelp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-arqhelp.obj -MD -MP -MF $(DEPDIR)/flarq-arqhelp.Tpo -c -o flarq-arqhelp.obj `if test -f 'flarq-src/arqhelp.cxx'; then $(CYGPATH_W) 'flarq-src/arqhelp.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arqhelp.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-arqhelp.Tpo $(DEPDIR)/flarq-arqhelp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arqhelp.cxx' object='flarq-arqhelp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-arqhelp.obj `if test -f 'flarq-src/arqhelp.cxx'; then $(CYGPATH_W) 'flarq-src/arqhelp.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arqhelp.cxx'; fi` flarq-b64.o: flarq-src/b64.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-b64.o -MD -MP -MF $(DEPDIR)/flarq-b64.Tpo -c -o flarq-b64.o `test -f 'flarq-src/b64.cxx' || echo '$(srcdir)/'`flarq-src/b64.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-b64.Tpo $(DEPDIR)/flarq-b64.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/b64.cxx' object='flarq-b64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-b64.o `test -f 'flarq-src/b64.cxx' || echo '$(srcdir)/'`flarq-src/b64.cxx flarq-b64.obj: flarq-src/b64.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-b64.obj -MD -MP -MF $(DEPDIR)/flarq-b64.Tpo -c -o flarq-b64.obj `if test -f 'flarq-src/b64.cxx'; then $(CYGPATH_W) 'flarq-src/b64.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/b64.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-b64.Tpo $(DEPDIR)/flarq-b64.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/b64.cxx' object='flarq-b64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-b64.obj `if test -f 'flarq-src/b64.cxx'; then $(CYGPATH_W) 'flarq-src/b64.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/b64.cxx'; fi` flarq-flarq.o: flarq-src/flarq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-flarq.o -MD -MP -MF $(DEPDIR)/flarq-flarq.Tpo -c -o flarq-flarq.o `test -f 'flarq-src/flarq.cxx' || echo '$(srcdir)/'`flarq-src/flarq.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-flarq.Tpo $(DEPDIR)/flarq-flarq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/flarq.cxx' object='flarq-flarq.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-flarq.o `test -f 'flarq-src/flarq.cxx' || echo '$(srcdir)/'`flarq-src/flarq.cxx flarq-flarq.obj: flarq-src/flarq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-flarq.obj -MD -MP -MF $(DEPDIR)/flarq-flarq.Tpo -c -o flarq-flarq.obj `if test -f 'flarq-src/flarq.cxx'; then $(CYGPATH_W) 'flarq-src/flarq.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/flarq.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-flarq.Tpo $(DEPDIR)/flarq-flarq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/flarq.cxx' object='flarq-flarq.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-flarq.obj `if test -f 'flarq-src/flarq.cxx'; then $(CYGPATH_W) 'flarq-src/flarq.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/flarq.cxx'; fi` flarq-flarqenv.o: flarq-src/flarqenv.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-flarqenv.o -MD -MP -MF $(DEPDIR)/flarq-flarqenv.Tpo -c -o flarq-flarqenv.o `test -f 'flarq-src/flarqenv.cxx' || echo '$(srcdir)/'`flarq-src/flarqenv.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-flarqenv.Tpo $(DEPDIR)/flarq-flarqenv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/flarqenv.cxx' object='flarq-flarqenv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-flarqenv.o `test -f 'flarq-src/flarqenv.cxx' || echo '$(srcdir)/'`flarq-src/flarqenv.cxx flarq-flarqenv.obj: flarq-src/flarqenv.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-flarqenv.obj -MD -MP -MF $(DEPDIR)/flarq-flarqenv.Tpo -c -o flarq-flarqenv.obj `if test -f 'flarq-src/flarqenv.cxx'; then $(CYGPATH_W) 'flarq-src/flarqenv.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/flarqenv.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-flarqenv.Tpo $(DEPDIR)/flarq-flarqenv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/flarqenv.cxx' object='flarq-flarqenv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-flarqenv.obj `if test -f 'flarq-src/flarqenv.cxx'; then $(CYGPATH_W) 'flarq-src/flarqenv.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/flarqenv.cxx'; fi` flarq-combo.o: combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-combo.o -MD -MP -MF $(DEPDIR)/flarq-combo.Tpo -c -o flarq-combo.o `test -f 'combo/combo.cxx' || echo '$(srcdir)/'`combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-combo.Tpo $(DEPDIR)/flarq-combo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='combo/combo.cxx' object='flarq-combo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-combo.o `test -f 'combo/combo.cxx' || echo '$(srcdir)/'`combo/combo.cxx flarq-combo.obj: combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-combo.obj -MD -MP -MF $(DEPDIR)/flarq-combo.Tpo -c -o flarq-combo.obj `if test -f 'combo/combo.cxx'; then $(CYGPATH_W) 'combo/combo.cxx'; else $(CYGPATH_W) '$(srcdir)/combo/combo.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-combo.Tpo $(DEPDIR)/flarq-combo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='combo/combo.cxx' object='flarq-combo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-combo.obj `if test -f 'combo/combo.cxx'; then $(CYGPATH_W) 'combo/combo.cxx'; else $(CYGPATH_W) '$(srcdir)/combo/combo.cxx'; fi` flarq-Native_File_Chooser.o: fileselector/Native_File_Chooser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-Native_File_Chooser.o -MD -MP -MF $(DEPDIR)/flarq-Native_File_Chooser.Tpo -c -o flarq-Native_File_Chooser.o `test -f 'fileselector/Native_File_Chooser.cxx' || echo '$(srcdir)/'`fileselector/Native_File_Chooser.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-Native_File_Chooser.Tpo $(DEPDIR)/flarq-Native_File_Chooser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/Native_File_Chooser.cxx' object='flarq-Native_File_Chooser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-Native_File_Chooser.o `test -f 'fileselector/Native_File_Chooser.cxx' || echo '$(srcdir)/'`fileselector/Native_File_Chooser.cxx flarq-Native_File_Chooser.obj: fileselector/Native_File_Chooser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-Native_File_Chooser.obj -MD -MP -MF $(DEPDIR)/flarq-Native_File_Chooser.Tpo -c -o flarq-Native_File_Chooser.obj `if test -f 'fileselector/Native_File_Chooser.cxx'; then $(CYGPATH_W) 'fileselector/Native_File_Chooser.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/Native_File_Chooser.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-Native_File_Chooser.Tpo $(DEPDIR)/flarq-Native_File_Chooser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/Native_File_Chooser.cxx' object='flarq-Native_File_Chooser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-Native_File_Chooser.obj `if test -f 'fileselector/Native_File_Chooser.cxx'; then $(CYGPATH_W) 'fileselector/Native_File_Chooser.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/Native_File_Chooser.cxx'; fi` flarq-fileselect.o: fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-fileselect.o -MD -MP -MF $(DEPDIR)/flarq-fileselect.Tpo -c -o flarq-fileselect.o `test -f 'fileselector/fileselect.cxx' || echo '$(srcdir)/'`fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-fileselect.Tpo $(DEPDIR)/flarq-fileselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/fileselect.cxx' object='flarq-fileselect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-fileselect.o `test -f 'fileselector/fileselect.cxx' || echo '$(srcdir)/'`fileselector/fileselect.cxx flarq-fileselect.obj: fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-fileselect.obj -MD -MP -MF $(DEPDIR)/flarq-fileselect.Tpo -c -o flarq-fileselect.obj `if test -f 'fileselector/fileselect.cxx'; then $(CYGPATH_W) 'fileselector/fileselect.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/fileselect.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-fileselect.Tpo $(DEPDIR)/flarq-fileselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/fileselect.cxx' object='flarq-fileselect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-fileselect.obj `if test -f 'fileselector/fileselect.cxx'; then $(CYGPATH_W) 'fileselector/fileselect.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/fileselect.cxx'; fi` flarq-table.o: logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-table.o -MD -MP -MF $(DEPDIR)/flarq-table.Tpo -c -o flarq-table.o `test -f 'logbook/table.cxx' || echo '$(srcdir)/'`logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-table.Tpo $(DEPDIR)/flarq-table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/table.cxx' object='flarq-table.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-table.o `test -f 'logbook/table.cxx' || echo '$(srcdir)/'`logbook/table.cxx flarq-table.obj: logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-table.obj -MD -MP -MF $(DEPDIR)/flarq-table.Tpo -c -o flarq-table.obj `if test -f 'logbook/table.cxx'; then $(CYGPATH_W) 'logbook/table.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/table.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-table.Tpo $(DEPDIR)/flarq-table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/table.cxx' object='flarq-table.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-table.obj `if test -f 'logbook/table.cxx'; then $(CYGPATH_W) 'logbook/table.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/table.cxx'; fi` flarq-ascii.o: misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-ascii.o -MD -MP -MF $(DEPDIR)/flarq-ascii.Tpo -c -o flarq-ascii.o `test -f 'misc/ascii.cxx' || echo '$(srcdir)/'`misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-ascii.Tpo $(DEPDIR)/flarq-ascii.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ascii.cxx' object='flarq-ascii.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-ascii.o `test -f 'misc/ascii.cxx' || echo '$(srcdir)/'`misc/ascii.cxx flarq-ascii.obj: misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-ascii.obj -MD -MP -MF $(DEPDIR)/flarq-ascii.Tpo -c -o flarq-ascii.obj `if test -f 'misc/ascii.cxx'; then $(CYGPATH_W) 'misc/ascii.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ascii.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-ascii.Tpo $(DEPDIR)/flarq-ascii.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ascii.cxx' object='flarq-ascii.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-ascii.obj `if test -f 'misc/ascii.cxx'; then $(CYGPATH_W) 'misc/ascii.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ascii.cxx'; fi` flarq-debug.o: misc/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-debug.o -MD -MP -MF $(DEPDIR)/flarq-debug.Tpo -c -o flarq-debug.o `test -f 'misc/debug.cxx' || echo '$(srcdir)/'`misc/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-debug.Tpo $(DEPDIR)/flarq-debug.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/debug.cxx' object='flarq-debug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-debug.o `test -f 'misc/debug.cxx' || echo '$(srcdir)/'`misc/debug.cxx flarq-debug.obj: misc/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-debug.obj -MD -MP -MF $(DEPDIR)/flarq-debug.Tpo -c -o flarq-debug.obj `if test -f 'misc/debug.cxx'; then $(CYGPATH_W) 'misc/debug.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/debug.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-debug.Tpo $(DEPDIR)/flarq-debug.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/debug.cxx' object='flarq-debug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-debug.obj `if test -f 'misc/debug.cxx'; then $(CYGPATH_W) 'misc/debug.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/debug.cxx'; fi` flarq-stacktrace.o: misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-stacktrace.o -MD -MP -MF $(DEPDIR)/flarq-stacktrace.Tpo -c -o flarq-stacktrace.o `test -f 'misc/stacktrace.cxx' || echo '$(srcdir)/'`misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-stacktrace.Tpo $(DEPDIR)/flarq-stacktrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stacktrace.cxx' object='flarq-stacktrace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-stacktrace.o `test -f 'misc/stacktrace.cxx' || echo '$(srcdir)/'`misc/stacktrace.cxx flarq-stacktrace.obj: misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-stacktrace.obj -MD -MP -MF $(DEPDIR)/flarq-stacktrace.Tpo -c -o flarq-stacktrace.obj `if test -f 'misc/stacktrace.cxx'; then $(CYGPATH_W) 'misc/stacktrace.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stacktrace.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-stacktrace.Tpo $(DEPDIR)/flarq-stacktrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stacktrace.cxx' object='flarq-stacktrace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-stacktrace.obj `if test -f 'misc/stacktrace.cxx'; then $(CYGPATH_W) 'misc/stacktrace.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stacktrace.cxx'; fi` flarq-threads.o: misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-threads.o -MD -MP -MF $(DEPDIR)/flarq-threads.Tpo -c -o flarq-threads.o `test -f 'misc/threads.cxx' || echo '$(srcdir)/'`misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-threads.Tpo $(DEPDIR)/flarq-threads.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/threads.cxx' object='flarq-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-threads.o `test -f 'misc/threads.cxx' || echo '$(srcdir)/'`misc/threads.cxx flarq-threads.obj: misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-threads.obj -MD -MP -MF $(DEPDIR)/flarq-threads.Tpo -c -o flarq-threads.obj `if test -f 'misc/threads.cxx'; then $(CYGPATH_W) 'misc/threads.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/threads.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-threads.Tpo $(DEPDIR)/flarq-threads.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/threads.cxx' object='flarq-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-threads.obj `if test -f 'misc/threads.cxx'; then $(CYGPATH_W) 'misc/threads.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/threads.cxx'; fi` flarq-timeops.o: misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-timeops.o -MD -MP -MF $(DEPDIR)/flarq-timeops.Tpo -c -o flarq-timeops.o `test -f 'misc/timeops.cxx' || echo '$(srcdir)/'`misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-timeops.Tpo $(DEPDIR)/flarq-timeops.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/timeops.cxx' object='flarq-timeops.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-timeops.o `test -f 'misc/timeops.cxx' || echo '$(srcdir)/'`misc/timeops.cxx flarq-timeops.obj: misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-timeops.obj -MD -MP -MF $(DEPDIR)/flarq-timeops.Tpo -c -o flarq-timeops.obj `if test -f 'misc/timeops.cxx'; then $(CYGPATH_W) 'misc/timeops.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/timeops.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-timeops.Tpo $(DEPDIR)/flarq-timeops.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/timeops.cxx' object='flarq-timeops.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-timeops.obj `if test -f 'misc/timeops.cxx'; then $(CYGPATH_W) 'misc/timeops.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/timeops.cxx'; fi` flarq-flinput2.o: widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-flinput2.o -MD -MP -MF $(DEPDIR)/flarq-flinput2.Tpo -c -o flarq-flinput2.o `test -f 'widgets/flinput2.cxx' || echo '$(srcdir)/'`widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-flinput2.Tpo $(DEPDIR)/flarq-flinput2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flinput2.cxx' object='flarq-flinput2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-flinput2.o `test -f 'widgets/flinput2.cxx' || echo '$(srcdir)/'`widgets/flinput2.cxx flarq-flinput2.obj: widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-flinput2.obj -MD -MP -MF $(DEPDIR)/flarq-flinput2.Tpo -c -o flarq-flinput2.obj `if test -f 'widgets/flinput2.cxx'; then $(CYGPATH_W) 'widgets/flinput2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flinput2.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-flinput2.Tpo $(DEPDIR)/flarq-flinput2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flinput2.cxx' object='flarq-flinput2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-flinput2.obj `if test -f 'widgets/flinput2.cxx'; then $(CYGPATH_W) 'widgets/flinput2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flinput2.cxx'; fi` flarq-flmisc.o: widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-flmisc.o -MD -MP -MF $(DEPDIR)/flarq-flmisc.Tpo -c -o flarq-flmisc.o `test -f 'widgets/flmisc.cxx' || echo '$(srcdir)/'`widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-flmisc.Tpo $(DEPDIR)/flarq-flmisc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flmisc.cxx' object='flarq-flmisc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-flmisc.o `test -f 'widgets/flmisc.cxx' || echo '$(srcdir)/'`widgets/flmisc.cxx flarq-flmisc.obj: widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-flmisc.obj -MD -MP -MF $(DEPDIR)/flarq-flmisc.Tpo -c -o flarq-flmisc.obj `if test -f 'widgets/flmisc.cxx'; then $(CYGPATH_W) 'widgets/flmisc.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flmisc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-flmisc.Tpo $(DEPDIR)/flarq-flmisc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flmisc.cxx' object='flarq-flmisc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-flmisc.obj `if test -f 'widgets/flmisc.cxx'; then $(CYGPATH_W) 'widgets/flmisc.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flmisc.cxx'; fi` flarq-flslider2.o: widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-flslider2.o -MD -MP -MF $(DEPDIR)/flarq-flslider2.Tpo -c -o flarq-flslider2.o `test -f 'widgets/flslider2.cxx' || echo '$(srcdir)/'`widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-flslider2.Tpo $(DEPDIR)/flarq-flslider2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flslider2.cxx' object='flarq-flslider2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-flslider2.o `test -f 'widgets/flslider2.cxx' || echo '$(srcdir)/'`widgets/flslider2.cxx flarq-flslider2.obj: widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-flslider2.obj -MD -MP -MF $(DEPDIR)/flarq-flslider2.Tpo -c -o flarq-flslider2.obj `if test -f 'widgets/flslider2.cxx'; then $(CYGPATH_W) 'widgets/flslider2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flslider2.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-flslider2.Tpo $(DEPDIR)/flarq-flslider2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flslider2.cxx' object='flarq-flslider2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-flslider2.obj `if test -f 'widgets/flslider2.cxx'; then $(CYGPATH_W) 'widgets/flslider2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flslider2.cxx'; fi` flarq-icons.o: misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-icons.o -MD -MP -MF $(DEPDIR)/flarq-icons.Tpo -c -o flarq-icons.o `test -f 'misc/icons.cxx' || echo '$(srcdir)/'`misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-icons.Tpo $(DEPDIR)/flarq-icons.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/icons.cxx' object='flarq-icons.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-icons.o `test -f 'misc/icons.cxx' || echo '$(srcdir)/'`misc/icons.cxx flarq-icons.obj: misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-icons.obj -MD -MP -MF $(DEPDIR)/flarq-icons.Tpo -c -o flarq-icons.obj `if test -f 'misc/icons.cxx'; then $(CYGPATH_W) 'misc/icons.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/icons.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-icons.Tpo $(DEPDIR)/flarq-icons.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/icons.cxx' object='flarq-icons.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-icons.obj `if test -f 'misc/icons.cxx'; then $(CYGPATH_W) 'misc/icons.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/icons.cxx'; fi` flarq-pixmaps.o: misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-pixmaps.o -MD -MP -MF $(DEPDIR)/flarq-pixmaps.Tpo -c -o flarq-pixmaps.o `test -f 'misc/pixmaps.cxx' || echo '$(srcdir)/'`misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-pixmaps.Tpo $(DEPDIR)/flarq-pixmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps.cxx' object='flarq-pixmaps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-pixmaps.o `test -f 'misc/pixmaps.cxx' || echo '$(srcdir)/'`misc/pixmaps.cxx flarq-pixmaps.obj: misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-pixmaps.obj -MD -MP -MF $(DEPDIR)/flarq-pixmaps.Tpo -c -o flarq-pixmaps.obj `if test -f 'misc/pixmaps.cxx'; then $(CYGPATH_W) 'misc/pixmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-pixmaps.Tpo $(DEPDIR)/flarq-pixmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps.cxx' object='flarq-pixmaps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-pixmaps.obj `if test -f 'misc/pixmaps.cxx'; then $(CYGPATH_W) 'misc/pixmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps.cxx'; fi` flarq-pixmaps_tango.o: misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-pixmaps_tango.o -MD -MP -MF $(DEPDIR)/flarq-pixmaps_tango.Tpo -c -o flarq-pixmaps_tango.o `test -f 'misc/pixmaps_tango.cxx' || echo '$(srcdir)/'`misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-pixmaps_tango.Tpo $(DEPDIR)/flarq-pixmaps_tango.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps_tango.cxx' object='flarq-pixmaps_tango.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-pixmaps_tango.o `test -f 'misc/pixmaps_tango.cxx' || echo '$(srcdir)/'`misc/pixmaps_tango.cxx flarq-pixmaps_tango.obj: misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-pixmaps_tango.obj -MD -MP -MF $(DEPDIR)/flarq-pixmaps_tango.Tpo -c -o flarq-pixmaps_tango.obj `if test -f 'misc/pixmaps_tango.cxx'; then $(CYGPATH_W) 'misc/pixmaps_tango.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps_tango.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-pixmaps_tango.Tpo $(DEPDIR)/flarq-pixmaps_tango.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps_tango.cxx' object='flarq-pixmaps_tango.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-pixmaps_tango.obj `if test -f 'misc/pixmaps_tango.cxx'; then $(CYGPATH_W) 'misc/pixmaps_tango.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps_tango.cxx'; fi` flarq-re.o: misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-re.o -MD -MP -MF $(DEPDIR)/flarq-re.Tpo -c -o flarq-re.o `test -f 'misc/re.cxx' || echo '$(srcdir)/'`misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-re.Tpo $(DEPDIR)/flarq-re.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/re.cxx' object='flarq-re.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-re.o `test -f 'misc/re.cxx' || echo '$(srcdir)/'`misc/re.cxx flarq-re.obj: misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-re.obj -MD -MP -MF $(DEPDIR)/flarq-re.Tpo -c -o flarq-re.obj `if test -f 'misc/re.cxx'; then $(CYGPATH_W) 'misc/re.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/re.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-re.Tpo $(DEPDIR)/flarq-re.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/re.cxx' object='flarq-re.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-re.obj `if test -f 'misc/re.cxx'; then $(CYGPATH_W) 'misc/re.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/re.cxx'; fi` flarq-socket.o: misc/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-socket.o -MD -MP -MF $(DEPDIR)/flarq-socket.Tpo -c -o flarq-socket.o `test -f 'misc/socket.cxx' || echo '$(srcdir)/'`misc/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-socket.Tpo $(DEPDIR)/flarq-socket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/socket.cxx' object='flarq-socket.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-socket.o `test -f 'misc/socket.cxx' || echo '$(srcdir)/'`misc/socket.cxx flarq-socket.obj: misc/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-socket.obj -MD -MP -MF $(DEPDIR)/flarq-socket.Tpo -c -o flarq-socket.obj `if test -f 'misc/socket.cxx'; then $(CYGPATH_W) 'misc/socket.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/socket.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-socket.Tpo $(DEPDIR)/flarq-socket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/socket.cxx' object='flarq-socket.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-socket.obj `if test -f 'misc/socket.cxx'; then $(CYGPATH_W) 'misc/socket.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/socket.cxx'; fi` flarq-util.o: misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-util.o -MD -MP -MF $(DEPDIR)/flarq-util.Tpo -c -o flarq-util.o `test -f 'misc/util.cxx' || echo '$(srcdir)/'`misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-util.Tpo $(DEPDIR)/flarq-util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/util.cxx' object='flarq-util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-util.o `test -f 'misc/util.cxx' || echo '$(srcdir)/'`misc/util.cxx flarq-util.obj: misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-util.obj -MD -MP -MF $(DEPDIR)/flarq-util.Tpo -c -o flarq-util.obj `if test -f 'misc/util.cxx'; then $(CYGPATH_W) 'misc/util.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/util.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-util.Tpo $(DEPDIR)/flarq-util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/util.cxx' object='flarq-util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-util.obj `if test -f 'misc/util.cxx'; then $(CYGPATH_W) 'misc/util.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/util.cxx'; fi` flarq-Fl_Text_Buffer_mod.o: widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-Fl_Text_Buffer_mod.o -MD -MP -MF $(DEPDIR)/flarq-Fl_Text_Buffer_mod.Tpo -c -o flarq-Fl_Text_Buffer_mod.o `test -f 'widgets/Fl_Text_Buffer_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-Fl_Text_Buffer_mod.Tpo $(DEPDIR)/flarq-Fl_Text_Buffer_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Buffer_mod.cxx' object='flarq-Fl_Text_Buffer_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-Fl_Text_Buffer_mod.o `test -f 'widgets/Fl_Text_Buffer_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Buffer_mod.cxx flarq-Fl_Text_Buffer_mod.obj: widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-Fl_Text_Buffer_mod.obj -MD -MP -MF $(DEPDIR)/flarq-Fl_Text_Buffer_mod.Tpo -c -o flarq-Fl_Text_Buffer_mod.obj `if test -f 'widgets/Fl_Text_Buffer_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Buffer_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Buffer_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-Fl_Text_Buffer_mod.Tpo $(DEPDIR)/flarq-Fl_Text_Buffer_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Buffer_mod.cxx' object='flarq-Fl_Text_Buffer_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-Fl_Text_Buffer_mod.obj `if test -f 'widgets/Fl_Text_Buffer_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Buffer_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Buffer_mod.cxx'; fi` flarq-Fl_Text_Display_mod.o: widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-Fl_Text_Display_mod.o -MD -MP -MF $(DEPDIR)/flarq-Fl_Text_Display_mod.Tpo -c -o flarq-Fl_Text_Display_mod.o `test -f 'widgets/Fl_Text_Display_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-Fl_Text_Display_mod.Tpo $(DEPDIR)/flarq-Fl_Text_Display_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Display_mod.cxx' object='flarq-Fl_Text_Display_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-Fl_Text_Display_mod.o `test -f 'widgets/Fl_Text_Display_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Display_mod.cxx flarq-Fl_Text_Display_mod.obj: widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-Fl_Text_Display_mod.obj -MD -MP -MF $(DEPDIR)/flarq-Fl_Text_Display_mod.Tpo -c -o flarq-Fl_Text_Display_mod.obj `if test -f 'widgets/Fl_Text_Display_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Display_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Display_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-Fl_Text_Display_mod.Tpo $(DEPDIR)/flarq-Fl_Text_Display_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Display_mod.cxx' object='flarq-Fl_Text_Display_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-Fl_Text_Display_mod.obj `if test -f 'widgets/Fl_Text_Display_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Display_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Display_mod.cxx'; fi` flarq-Fl_Text_Editor_mod.o: widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-Fl_Text_Editor_mod.o -MD -MP -MF $(DEPDIR)/flarq-Fl_Text_Editor_mod.Tpo -c -o flarq-Fl_Text_Editor_mod.o `test -f 'widgets/Fl_Text_Editor_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-Fl_Text_Editor_mod.Tpo $(DEPDIR)/flarq-Fl_Text_Editor_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Editor_mod.cxx' object='flarq-Fl_Text_Editor_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-Fl_Text_Editor_mod.o `test -f 'widgets/Fl_Text_Editor_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Editor_mod.cxx flarq-Fl_Text_Editor_mod.obj: widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-Fl_Text_Editor_mod.obj -MD -MP -MF $(DEPDIR)/flarq-Fl_Text_Editor_mod.Tpo -c -o flarq-Fl_Text_Editor_mod.obj `if test -f 'widgets/Fl_Text_Editor_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Editor_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Editor_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-Fl_Text_Editor_mod.Tpo $(DEPDIR)/flarq-Fl_Text_Editor_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Editor_mod.cxx' object='flarq-Fl_Text_Editor_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-Fl_Text_Editor_mod.obj `if test -f 'widgets/Fl_Text_Editor_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Editor_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Editor_mod.cxx'; fi` flarq-FTextView.o: widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-FTextView.o -MD -MP -MF $(DEPDIR)/flarq-FTextView.Tpo -c -o flarq-FTextView.o `test -f 'widgets/FTextView.cxx' || echo '$(srcdir)/'`widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-FTextView.Tpo $(DEPDIR)/flarq-FTextView.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextView.cxx' object='flarq-FTextView.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-FTextView.o `test -f 'widgets/FTextView.cxx' || echo '$(srcdir)/'`widgets/FTextView.cxx flarq-FTextView.obj: widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-FTextView.obj -MD -MP -MF $(DEPDIR)/flarq-FTextView.Tpo -c -o flarq-FTextView.obj `if test -f 'widgets/FTextView.cxx'; then $(CYGPATH_W) 'widgets/FTextView.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextView.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/flarq-FTextView.Tpo $(DEPDIR)/flarq-FTextView.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextView.cxx' object='flarq-FTextView.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-FTextView.obj `if test -f 'widgets/FTextView.cxx'; then $(CYGPATH_W) 'widgets/FTextView.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextView.cxx'; fi` fldigi-xmlrpc.o: misc/xmlrpc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-xmlrpc.o -MD -MP -MF $(DEPDIR)/fldigi-xmlrpc.Tpo -c -o fldigi-xmlrpc.o `test -f 'misc/xmlrpc.cxx' || echo '$(srcdir)/'`misc/xmlrpc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-xmlrpc.Tpo $(DEPDIR)/fldigi-xmlrpc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/xmlrpc.cxx' object='fldigi-xmlrpc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-xmlrpc.o `test -f 'misc/xmlrpc.cxx' || echo '$(srcdir)/'`misc/xmlrpc.cxx fldigi-xmlrpc.obj: misc/xmlrpc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-xmlrpc.obj -MD -MP -MF $(DEPDIR)/fldigi-xmlrpc.Tpo -c -o fldigi-xmlrpc.obj `if test -f 'misc/xmlrpc.cxx'; then $(CYGPATH_W) 'misc/xmlrpc.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/xmlrpc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-xmlrpc.Tpo $(DEPDIR)/fldigi-xmlrpc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/xmlrpc.cxx' object='fldigi-xmlrpc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-xmlrpc.obj `if test -f 'misc/xmlrpc.cxx'; then $(CYGPATH_W) 'misc/xmlrpc.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/xmlrpc.cxx'; fi` fldigi-hamlib.o: rigcontrol/hamlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-hamlib.o -MD -MP -MF $(DEPDIR)/fldigi-hamlib.Tpo -c -o fldigi-hamlib.o `test -f 'rigcontrol/hamlib.cxx' || echo '$(srcdir)/'`rigcontrol/hamlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-hamlib.Tpo $(DEPDIR)/fldigi-hamlib.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/hamlib.cxx' object='fldigi-hamlib.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-hamlib.o `test -f 'rigcontrol/hamlib.cxx' || echo '$(srcdir)/'`rigcontrol/hamlib.cxx fldigi-hamlib.obj: rigcontrol/hamlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-hamlib.obj -MD -MP -MF $(DEPDIR)/fldigi-hamlib.Tpo -c -o fldigi-hamlib.obj `if test -f 'rigcontrol/hamlib.cxx'; then $(CYGPATH_W) 'rigcontrol/hamlib.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/hamlib.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-hamlib.Tpo $(DEPDIR)/fldigi-hamlib.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/hamlib.cxx' object='fldigi-hamlib.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-hamlib.obj `if test -f 'rigcontrol/hamlib.cxx'; then $(CYGPATH_W) 'rigcontrol/hamlib.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/hamlib.cxx'; fi` fldigi-rigclass.o: rigcontrol/rigclass.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rigclass.o -MD -MP -MF $(DEPDIR)/fldigi-rigclass.Tpo -c -o fldigi-rigclass.o `test -f 'rigcontrol/rigclass.cxx' || echo '$(srcdir)/'`rigcontrol/rigclass.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rigclass.Tpo $(DEPDIR)/fldigi-rigclass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigclass.cxx' object='fldigi-rigclass.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rigclass.o `test -f 'rigcontrol/rigclass.cxx' || echo '$(srcdir)/'`rigcontrol/rigclass.cxx fldigi-rigclass.obj: rigcontrol/rigclass.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rigclass.obj -MD -MP -MF $(DEPDIR)/fldigi-rigclass.Tpo -c -o fldigi-rigclass.obj `if test -f 'rigcontrol/rigclass.cxx'; then $(CYGPATH_W) 'rigcontrol/rigclass.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigclass.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rigclass.Tpo $(DEPDIR)/fldigi-rigclass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigclass.cxx' object='fldigi-rigclass.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rigclass.obj `if test -f 'rigcontrol/rigclass.cxx'; then $(CYGPATH_W) 'rigcontrol/rigclass.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigclass.cxx'; fi` fldigi-benchmark.o: misc/benchmark.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-benchmark.o -MD -MP -MF $(DEPDIR)/fldigi-benchmark.Tpo -c -o fldigi-benchmark.o `test -f 'misc/benchmark.cxx' || echo '$(srcdir)/'`misc/benchmark.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-benchmark.Tpo $(DEPDIR)/fldigi-benchmark.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/benchmark.cxx' object='fldigi-benchmark.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-benchmark.o `test -f 'misc/benchmark.cxx' || echo '$(srcdir)/'`misc/benchmark.cxx fldigi-benchmark.obj: misc/benchmark.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-benchmark.obj -MD -MP -MF $(DEPDIR)/fldigi-benchmark.Tpo -c -o fldigi-benchmark.obj `if test -f 'misc/benchmark.cxx'; then $(CYGPATH_W) 'misc/benchmark.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/benchmark.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-benchmark.Tpo $(DEPDIR)/fldigi-benchmark.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/benchmark.cxx' object='fldigi-benchmark.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-benchmark.obj `if test -f 'misc/benchmark.cxx'; then $(CYGPATH_W) 'misc/benchmark.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/benchmark.cxx'; fi` fldigi-stack.o: misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-stack.o -MD -MP -MF $(DEPDIR)/fldigi-stack.Tpo -c -o fldigi-stack.o `test -f 'misc/stack.cxx' || echo '$(srcdir)/'`misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-stack.Tpo $(DEPDIR)/fldigi-stack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stack.cxx' object='fldigi-stack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-stack.o `test -f 'misc/stack.cxx' || echo '$(srcdir)/'`misc/stack.cxx fldigi-stack.obj: misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-stack.obj -MD -MP -MF $(DEPDIR)/fldigi-stack.Tpo -c -o fldigi-stack.obj `if test -f 'misc/stack.cxx'; then $(CYGPATH_W) 'misc/stack.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stack.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-stack.Tpo $(DEPDIR)/fldigi-stack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stack.cxx' object='fldigi-stack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-stack.obj `if test -f 'misc/stack.cxx'; then $(CYGPATH_W) 'misc/stack.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stack.cxx'; fi` fldigi-nls.o: misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-nls.o -MD -MP -MF $(DEPDIR)/fldigi-nls.Tpo -c -o fldigi-nls.o `test -f 'misc/nls.cxx' || echo '$(srcdir)/'`misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-nls.Tpo $(DEPDIR)/fldigi-nls.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/nls.cxx' object='fldigi-nls.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-nls.o `test -f 'misc/nls.cxx' || echo '$(srcdir)/'`misc/nls.cxx fldigi-nls.obj: misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-nls.obj -MD -MP -MF $(DEPDIR)/fldigi-nls.Tpo -c -o fldigi-nls.obj `if test -f 'misc/nls.cxx'; then $(CYGPATH_W) 'misc/nls.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/nls.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-nls.Tpo $(DEPDIR)/fldigi-nls.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/nls.cxx' object='fldigi-nls.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-nls.obj `if test -f 'misc/nls.cxx'; then $(CYGPATH_W) 'misc/nls.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/nls.cxx'; fi` fldigi-combo.o: combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-combo.o -MD -MP -MF $(DEPDIR)/fldigi-combo.Tpo -c -o fldigi-combo.o `test -f 'combo/combo.cxx' || echo '$(srcdir)/'`combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-combo.Tpo $(DEPDIR)/fldigi-combo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='combo/combo.cxx' object='fldigi-combo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-combo.o `test -f 'combo/combo.cxx' || echo '$(srcdir)/'`combo/combo.cxx fldigi-combo.obj: combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-combo.obj -MD -MP -MF $(DEPDIR)/fldigi-combo.Tpo -c -o fldigi-combo.obj `if test -f 'combo/combo.cxx'; then $(CYGPATH_W) 'combo/combo.cxx'; else $(CYGPATH_W) '$(srcdir)/combo/combo.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-combo.Tpo $(DEPDIR)/fldigi-combo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='combo/combo.cxx' object='fldigi-combo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-combo.obj `if test -f 'combo/combo.cxx'; then $(CYGPATH_W) 'combo/combo.cxx'; else $(CYGPATH_W) '$(srcdir)/combo/combo.cxx'; fi` fldigi-cw.o: cw_rtty/cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-cw.o -MD -MP -MF $(DEPDIR)/fldigi-cw.Tpo -c -o fldigi-cw.o `test -f 'cw_rtty/cw.cxx' || echo '$(srcdir)/'`cw_rtty/cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-cw.Tpo $(DEPDIR)/fldigi-cw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/cw.cxx' object='fldigi-cw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-cw.o `test -f 'cw_rtty/cw.cxx' || echo '$(srcdir)/'`cw_rtty/cw.cxx fldigi-cw.obj: cw_rtty/cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-cw.obj -MD -MP -MF $(DEPDIR)/fldigi-cw.Tpo -c -o fldigi-cw.obj `if test -f 'cw_rtty/cw.cxx'; then $(CYGPATH_W) 'cw_rtty/cw.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/cw.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-cw.Tpo $(DEPDIR)/fldigi-cw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/cw.cxx' object='fldigi-cw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-cw.obj `if test -f 'cw_rtty/cw.cxx'; then $(CYGPATH_W) 'cw_rtty/cw.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/cw.cxx'; fi` fldigi-morse.o: cw_rtty/morse.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-morse.o -MD -MP -MF $(DEPDIR)/fldigi-morse.Tpo -c -o fldigi-morse.o `test -f 'cw_rtty/morse.cxx' || echo '$(srcdir)/'`cw_rtty/morse.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-morse.Tpo $(DEPDIR)/fldigi-morse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/morse.cxx' object='fldigi-morse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-morse.o `test -f 'cw_rtty/morse.cxx' || echo '$(srcdir)/'`cw_rtty/morse.cxx fldigi-morse.obj: cw_rtty/morse.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-morse.obj -MD -MP -MF $(DEPDIR)/fldigi-morse.Tpo -c -o fldigi-morse.obj `if test -f 'cw_rtty/morse.cxx'; then $(CYGPATH_W) 'cw_rtty/morse.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/morse.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-morse.Tpo $(DEPDIR)/fldigi-morse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/morse.cxx' object='fldigi-morse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-morse.obj `if test -f 'cw_rtty/morse.cxx'; then $(CYGPATH_W) 'cw_rtty/morse.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/morse.cxx'; fi` fldigi-rtty.o: cw_rtty/rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rtty.o -MD -MP -MF $(DEPDIR)/fldigi-rtty.Tpo -c -o fldigi-rtty.o `test -f 'cw_rtty/rtty.cxx' || echo '$(srcdir)/'`cw_rtty/rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rtty.Tpo $(DEPDIR)/fldigi-rtty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/rtty.cxx' object='fldigi-rtty.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rtty.o `test -f 'cw_rtty/rtty.cxx' || echo '$(srcdir)/'`cw_rtty/rtty.cxx fldigi-rtty.obj: cw_rtty/rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rtty.obj -MD -MP -MF $(DEPDIR)/fldigi-rtty.Tpo -c -o fldigi-rtty.obj `if test -f 'cw_rtty/rtty.cxx'; then $(CYGPATH_W) 'cw_rtty/rtty.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/rtty.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rtty.Tpo $(DEPDIR)/fldigi-rtty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/rtty.cxx' object='fldigi-rtty.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rtty.obj `if test -f 'cw_rtty/rtty.cxx'; then $(CYGPATH_W) 'cw_rtty/rtty.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/rtty.cxx'; fi` fldigi-view_rtty.o: cw_rtty/view_rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-view_rtty.o -MD -MP -MF $(DEPDIR)/fldigi-view_rtty.Tpo -c -o fldigi-view_rtty.o `test -f 'cw_rtty/view_rtty.cxx' || echo '$(srcdir)/'`cw_rtty/view_rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-view_rtty.Tpo $(DEPDIR)/fldigi-view_rtty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/view_rtty.cxx' object='fldigi-view_rtty.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-view_rtty.o `test -f 'cw_rtty/view_rtty.cxx' || echo '$(srcdir)/'`cw_rtty/view_rtty.cxx fldigi-view_rtty.obj: cw_rtty/view_rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-view_rtty.obj -MD -MP -MF $(DEPDIR)/fldigi-view_rtty.Tpo -c -o fldigi-view_rtty.obj `if test -f 'cw_rtty/view_rtty.cxx'; then $(CYGPATH_W) 'cw_rtty/view_rtty.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/view_rtty.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-view_rtty.Tpo $(DEPDIR)/fldigi-view_rtty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw_rtty/view_rtty.cxx' object='fldigi-view_rtty.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-view_rtty.obj `if test -f 'cw_rtty/view_rtty.cxx'; then $(CYGPATH_W) 'cw_rtty/view_rtty.cxx'; else $(CYGPATH_W) '$(srcdir)/cw_rtty/view_rtty.cxx'; fi` fldigi-contestia.o: contestia/contestia.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-contestia.o -MD -MP -MF $(DEPDIR)/fldigi-contestia.Tpo -c -o fldigi-contestia.o `test -f 'contestia/contestia.cxx' || echo '$(srcdir)/'`contestia/contestia.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-contestia.Tpo $(DEPDIR)/fldigi-contestia.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='contestia/contestia.cxx' object='fldigi-contestia.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-contestia.o `test -f 'contestia/contestia.cxx' || echo '$(srcdir)/'`contestia/contestia.cxx fldigi-contestia.obj: contestia/contestia.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-contestia.obj -MD -MP -MF $(DEPDIR)/fldigi-contestia.Tpo -c -o fldigi-contestia.obj `if test -f 'contestia/contestia.cxx'; then $(CYGPATH_W) 'contestia/contestia.cxx'; else $(CYGPATH_W) '$(srcdir)/contestia/contestia.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-contestia.Tpo $(DEPDIR)/fldigi-contestia.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='contestia/contestia.cxx' object='fldigi-contestia.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-contestia.obj `if test -f 'contestia/contestia.cxx'; then $(CYGPATH_W) 'contestia/contestia.cxx'; else $(CYGPATH_W) '$(srcdir)/contestia/contestia.cxx'; fi` fldigi-confdialog.o: dialogs/confdialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-confdialog.o -MD -MP -MF $(DEPDIR)/fldigi-confdialog.Tpo -c -o fldigi-confdialog.o `test -f 'dialogs/confdialog.cxx' || echo '$(srcdir)/'`dialogs/confdialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-confdialog.Tpo $(DEPDIR)/fldigi-confdialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/confdialog.cxx' object='fldigi-confdialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-confdialog.o `test -f 'dialogs/confdialog.cxx' || echo '$(srcdir)/'`dialogs/confdialog.cxx fldigi-confdialog.obj: dialogs/confdialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-confdialog.obj -MD -MP -MF $(DEPDIR)/fldigi-confdialog.Tpo -c -o fldigi-confdialog.obj `if test -f 'dialogs/confdialog.cxx'; then $(CYGPATH_W) 'dialogs/confdialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/confdialog.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-confdialog.Tpo $(DEPDIR)/fldigi-confdialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/confdialog.cxx' object='fldigi-confdialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-confdialog.obj `if test -f 'dialogs/confdialog.cxx'; then $(CYGPATH_W) 'dialogs/confdialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/confdialog.cxx'; fi` fldigi-fl_digi.o: dialogs/fl_digi.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-fl_digi.o -MD -MP -MF $(DEPDIR)/fldigi-fl_digi.Tpo -c -o fldigi-fl_digi.o `test -f 'dialogs/fl_digi.cxx' || echo '$(srcdir)/'`dialogs/fl_digi.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-fl_digi.Tpo $(DEPDIR)/fldigi-fl_digi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/fl_digi.cxx' object='fldigi-fl_digi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-fl_digi.o `test -f 'dialogs/fl_digi.cxx' || echo '$(srcdir)/'`dialogs/fl_digi.cxx fldigi-fl_digi.obj: dialogs/fl_digi.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-fl_digi.obj -MD -MP -MF $(DEPDIR)/fldigi-fl_digi.Tpo -c -o fldigi-fl_digi.obj `if test -f 'dialogs/fl_digi.cxx'; then $(CYGPATH_W) 'dialogs/fl_digi.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/fl_digi.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-fl_digi.Tpo $(DEPDIR)/fldigi-fl_digi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/fl_digi.cxx' object='fldigi-fl_digi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-fl_digi.obj `if test -f 'dialogs/fl_digi.cxx'; then $(CYGPATH_W) 'dialogs/fl_digi.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/fl_digi.cxx'; fi` fldigi-font_browser.o: dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-font_browser.o -MD -MP -MF $(DEPDIR)/fldigi-font_browser.Tpo -c -o fldigi-font_browser.o `test -f 'dialogs/font_browser.cxx' || echo '$(srcdir)/'`dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-font_browser.Tpo $(DEPDIR)/fldigi-font_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/font_browser.cxx' object='fldigi-font_browser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-font_browser.o `test -f 'dialogs/font_browser.cxx' || echo '$(srcdir)/'`dialogs/font_browser.cxx fldigi-font_browser.obj: dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-font_browser.obj -MD -MP -MF $(DEPDIR)/fldigi-font_browser.Tpo -c -o fldigi-font_browser.obj `if test -f 'dialogs/font_browser.cxx'; then $(CYGPATH_W) 'dialogs/font_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/font_browser.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-font_browser.Tpo $(DEPDIR)/fldigi-font_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/font_browser.cxx' object='fldigi-font_browser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-font_browser.obj `if test -f 'dialogs/font_browser.cxx'; then $(CYGPATH_W) 'dialogs/font_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/font_browser.cxx'; fi` fldigi-Viewer.o: dialogs/Viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Viewer.o -MD -MP -MF $(DEPDIR)/fldigi-Viewer.Tpo -c -o fldigi-Viewer.o `test -f 'dialogs/Viewer.cxx' || echo '$(srcdir)/'`dialogs/Viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Viewer.Tpo $(DEPDIR)/fldigi-Viewer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/Viewer.cxx' object='fldigi-Viewer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Viewer.o `test -f 'dialogs/Viewer.cxx' || echo '$(srcdir)/'`dialogs/Viewer.cxx fldigi-Viewer.obj: dialogs/Viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Viewer.obj -MD -MP -MF $(DEPDIR)/fldigi-Viewer.Tpo -c -o fldigi-Viewer.obj `if test -f 'dialogs/Viewer.cxx'; then $(CYGPATH_W) 'dialogs/Viewer.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/Viewer.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Viewer.Tpo $(DEPDIR)/fldigi-Viewer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/Viewer.cxx' object='fldigi-Viewer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Viewer.obj `if test -f 'dialogs/Viewer.cxx'; then $(CYGPATH_W) 'dialogs/Viewer.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/Viewer.cxx'; fi` fldigi-htmlstrings.o: dialogs/htmlstrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-htmlstrings.o -MD -MP -MF $(DEPDIR)/fldigi-htmlstrings.Tpo -c -o fldigi-htmlstrings.o `test -f 'dialogs/htmlstrings.cxx' || echo '$(srcdir)/'`dialogs/htmlstrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-htmlstrings.Tpo $(DEPDIR)/fldigi-htmlstrings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/htmlstrings.cxx' object='fldigi-htmlstrings.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-htmlstrings.o `test -f 'dialogs/htmlstrings.cxx' || echo '$(srcdir)/'`dialogs/htmlstrings.cxx fldigi-htmlstrings.obj: dialogs/htmlstrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-htmlstrings.obj -MD -MP -MF $(DEPDIR)/fldigi-htmlstrings.Tpo -c -o fldigi-htmlstrings.obj `if test -f 'dialogs/htmlstrings.cxx'; then $(CYGPATH_W) 'dialogs/htmlstrings.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/htmlstrings.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-htmlstrings.Tpo $(DEPDIR)/fldigi-htmlstrings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/htmlstrings.cxx' object='fldigi-htmlstrings.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-htmlstrings.obj `if test -f 'dialogs/htmlstrings.cxx'; then $(CYGPATH_W) 'dialogs/htmlstrings.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/htmlstrings.cxx'; fi` fldigi-notifydialog.o: dialogs/notifydialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-notifydialog.o -MD -MP -MF $(DEPDIR)/fldigi-notifydialog.Tpo -c -o fldigi-notifydialog.o `test -f 'dialogs/notifydialog.cxx' || echo '$(srcdir)/'`dialogs/notifydialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-notifydialog.Tpo $(DEPDIR)/fldigi-notifydialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/notifydialog.cxx' object='fldigi-notifydialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-notifydialog.o `test -f 'dialogs/notifydialog.cxx' || echo '$(srcdir)/'`dialogs/notifydialog.cxx fldigi-notifydialog.obj: dialogs/notifydialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-notifydialog.obj -MD -MP -MF $(DEPDIR)/fldigi-notifydialog.Tpo -c -o fldigi-notifydialog.obj `if test -f 'dialogs/notifydialog.cxx'; then $(CYGPATH_W) 'dialogs/notifydialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/notifydialog.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-notifydialog.Tpo $(DEPDIR)/fldigi-notifydialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/notifydialog.cxx' object='fldigi-notifydialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-notifydialog.obj `if test -f 'dialogs/notifydialog.cxx'; then $(CYGPATH_W) 'dialogs/notifydialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/notifydialog.cxx'; fi` fldigi-record_browse.o: dialogs/record_browse.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-record_browse.o -MD -MP -MF $(DEPDIR)/fldigi-record_browse.Tpo -c -o fldigi-record_browse.o `test -f 'dialogs/record_browse.cxx' || echo '$(srcdir)/'`dialogs/record_browse.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-record_browse.Tpo $(DEPDIR)/fldigi-record_browse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/record_browse.cxx' object='fldigi-record_browse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-record_browse.o `test -f 'dialogs/record_browse.cxx' || echo '$(srcdir)/'`dialogs/record_browse.cxx fldigi-record_browse.obj: dialogs/record_browse.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-record_browse.obj -MD -MP -MF $(DEPDIR)/fldigi-record_browse.Tpo -c -o fldigi-record_browse.obj `if test -f 'dialogs/record_browse.cxx'; then $(CYGPATH_W) 'dialogs/record_browse.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/record_browse.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-record_browse.Tpo $(DEPDIR)/fldigi-record_browse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/record_browse.cxx' object='fldigi-record_browse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-record_browse.obj `if test -f 'dialogs/record_browse.cxx'; then $(CYGPATH_W) 'dialogs/record_browse.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/record_browse.cxx'; fi` fldigi-dtmf.o: dtmf/dtmf.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-dtmf.o -MD -MP -MF $(DEPDIR)/fldigi-dtmf.Tpo -c -o fldigi-dtmf.o `test -f 'dtmf/dtmf.cxx' || echo '$(srcdir)/'`dtmf/dtmf.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-dtmf.Tpo $(DEPDIR)/fldigi-dtmf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dtmf/dtmf.cxx' object='fldigi-dtmf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-dtmf.o `test -f 'dtmf/dtmf.cxx' || echo '$(srcdir)/'`dtmf/dtmf.cxx fldigi-dtmf.obj: dtmf/dtmf.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-dtmf.obj -MD -MP -MF $(DEPDIR)/fldigi-dtmf.Tpo -c -o fldigi-dtmf.obj `if test -f 'dtmf/dtmf.cxx'; then $(CYGPATH_W) 'dtmf/dtmf.cxx'; else $(CYGPATH_W) '$(srcdir)/dtmf/dtmf.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-dtmf.Tpo $(DEPDIR)/fldigi-dtmf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dtmf/dtmf.cxx' object='fldigi-dtmf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-dtmf.obj `if test -f 'dtmf/dtmf.cxx'; then $(CYGPATH_W) 'dtmf/dtmf.cxx'; else $(CYGPATH_W) '$(srcdir)/dtmf/dtmf.cxx'; fi` fldigi-thor.o: thor/thor.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-thor.o -MD -MP -MF $(DEPDIR)/fldigi-thor.Tpo -c -o fldigi-thor.o `test -f 'thor/thor.cxx' || echo '$(srcdir)/'`thor/thor.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-thor.Tpo $(DEPDIR)/fldigi-thor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thor.cxx' object='fldigi-thor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-thor.o `test -f 'thor/thor.cxx' || echo '$(srcdir)/'`thor/thor.cxx fldigi-thor.obj: thor/thor.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-thor.obj -MD -MP -MF $(DEPDIR)/fldigi-thor.Tpo -c -o fldigi-thor.obj `if test -f 'thor/thor.cxx'; then $(CYGPATH_W) 'thor/thor.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thor.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-thor.Tpo $(DEPDIR)/fldigi-thor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thor.cxx' object='fldigi-thor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-thor.obj `if test -f 'thor/thor.cxx'; then $(CYGPATH_W) 'thor/thor.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thor.cxx'; fi` fldigi-thorvaricode.o: thor/thorvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-thorvaricode.o -MD -MP -MF $(DEPDIR)/fldigi-thorvaricode.Tpo -c -o fldigi-thorvaricode.o `test -f 'thor/thorvaricode.cxx' || echo '$(srcdir)/'`thor/thorvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-thorvaricode.Tpo $(DEPDIR)/fldigi-thorvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thorvaricode.cxx' object='fldigi-thorvaricode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-thorvaricode.o `test -f 'thor/thorvaricode.cxx' || echo '$(srcdir)/'`thor/thorvaricode.cxx fldigi-thorvaricode.obj: thor/thorvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-thorvaricode.obj -MD -MP -MF $(DEPDIR)/fldigi-thorvaricode.Tpo -c -o fldigi-thorvaricode.obj `if test -f 'thor/thorvaricode.cxx'; then $(CYGPATH_W) 'thor/thorvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thorvaricode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-thorvaricode.Tpo $(DEPDIR)/fldigi-thorvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thorvaricode.cxx' object='fldigi-thorvaricode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-thorvaricode.obj `if test -f 'thor/thorvaricode.cxx'; then $(CYGPATH_W) 'thor/thorvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thorvaricode.cxx'; fi` fldigi-dominoex.o: dominoex/dominoex.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-dominoex.o -MD -MP -MF $(DEPDIR)/fldigi-dominoex.Tpo -c -o fldigi-dominoex.o `test -f 'dominoex/dominoex.cxx' || echo '$(srcdir)/'`dominoex/dominoex.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-dominoex.Tpo $(DEPDIR)/fldigi-dominoex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dominoex/dominoex.cxx' object='fldigi-dominoex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-dominoex.o `test -f 'dominoex/dominoex.cxx' || echo '$(srcdir)/'`dominoex/dominoex.cxx fldigi-dominoex.obj: dominoex/dominoex.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-dominoex.obj -MD -MP -MF $(DEPDIR)/fldigi-dominoex.Tpo -c -o fldigi-dominoex.obj `if test -f 'dominoex/dominoex.cxx'; then $(CYGPATH_W) 'dominoex/dominoex.cxx'; else $(CYGPATH_W) '$(srcdir)/dominoex/dominoex.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-dominoex.Tpo $(DEPDIR)/fldigi-dominoex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dominoex/dominoex.cxx' object='fldigi-dominoex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-dominoex.obj `if test -f 'dominoex/dominoex.cxx'; then $(CYGPATH_W) 'dominoex/dominoex.cxx'; else $(CYGPATH_W) '$(srcdir)/dominoex/dominoex.cxx'; fi` fldigi-dominovar.o: dominoex/dominovar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-dominovar.o -MD -MP -MF $(DEPDIR)/fldigi-dominovar.Tpo -c -o fldigi-dominovar.o `test -f 'dominoex/dominovar.cxx' || echo '$(srcdir)/'`dominoex/dominovar.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-dominovar.Tpo $(DEPDIR)/fldigi-dominovar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dominoex/dominovar.cxx' object='fldigi-dominovar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-dominovar.o `test -f 'dominoex/dominovar.cxx' || echo '$(srcdir)/'`dominoex/dominovar.cxx fldigi-dominovar.obj: dominoex/dominovar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-dominovar.obj -MD -MP -MF $(DEPDIR)/fldigi-dominovar.Tpo -c -o fldigi-dominovar.obj `if test -f 'dominoex/dominovar.cxx'; then $(CYGPATH_W) 'dominoex/dominovar.cxx'; else $(CYGPATH_W) '$(srcdir)/dominoex/dominovar.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-dominovar.Tpo $(DEPDIR)/fldigi-dominovar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dominoex/dominovar.cxx' object='fldigi-dominovar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-dominovar.obj `if test -f 'dominoex/dominovar.cxx'; then $(CYGPATH_W) 'dominoex/dominovar.cxx'; else $(CYGPATH_W) '$(srcdir)/dominoex/dominovar.cxx'; fi` fldigi-feld.o: feld/feld.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-feld.o -MD -MP -MF $(DEPDIR)/fldigi-feld.Tpo -c -o fldigi-feld.o `test -f 'feld/feld.cxx' || echo '$(srcdir)/'`feld/feld.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-feld.Tpo $(DEPDIR)/fldigi-feld.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/feld.cxx' object='fldigi-feld.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-feld.o `test -f 'feld/feld.cxx' || echo '$(srcdir)/'`feld/feld.cxx fldigi-feld.obj: feld/feld.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-feld.obj -MD -MP -MF $(DEPDIR)/fldigi-feld.Tpo -c -o fldigi-feld.obj `if test -f 'feld/feld.cxx'; then $(CYGPATH_W) 'feld/feld.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/feld.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-feld.Tpo $(DEPDIR)/fldigi-feld.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/feld.cxx' object='fldigi-feld.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-feld.obj `if test -f 'feld/feld.cxx'; then $(CYGPATH_W) 'feld/feld.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/feld.cxx'; fi` fldigi-feldfonts.o: feld/feldfonts.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-feldfonts.o -MD -MP -MF $(DEPDIR)/fldigi-feldfonts.Tpo -c -o fldigi-feldfonts.o `test -f 'feld/feldfonts.cxx' || echo '$(srcdir)/'`feld/feldfonts.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-feldfonts.Tpo $(DEPDIR)/fldigi-feldfonts.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/feldfonts.cxx' object='fldigi-feldfonts.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-feldfonts.o `test -f 'feld/feldfonts.cxx' || echo '$(srcdir)/'`feld/feldfonts.cxx fldigi-feldfonts.obj: feld/feldfonts.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-feldfonts.obj -MD -MP -MF $(DEPDIR)/fldigi-feldfonts.Tpo -c -o fldigi-feldfonts.obj `if test -f 'feld/feldfonts.cxx'; then $(CYGPATH_W) 'feld/feldfonts.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/feldfonts.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-feldfonts.Tpo $(DEPDIR)/fldigi-feldfonts.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/feldfonts.cxx' object='fldigi-feldfonts.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-feldfonts.obj `if test -f 'feld/feldfonts.cxx'; then $(CYGPATH_W) 'feld/feldfonts.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/feldfonts.cxx'; fi` fldigi-Native_File_Chooser.o: fileselector/Native_File_Chooser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Native_File_Chooser.o -MD -MP -MF $(DEPDIR)/fldigi-Native_File_Chooser.Tpo -c -o fldigi-Native_File_Chooser.o `test -f 'fileselector/Native_File_Chooser.cxx' || echo '$(srcdir)/'`fileselector/Native_File_Chooser.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Native_File_Chooser.Tpo $(DEPDIR)/fldigi-Native_File_Chooser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/Native_File_Chooser.cxx' object='fldigi-Native_File_Chooser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Native_File_Chooser.o `test -f 'fileselector/Native_File_Chooser.cxx' || echo '$(srcdir)/'`fileselector/Native_File_Chooser.cxx fldigi-Native_File_Chooser.obj: fileselector/Native_File_Chooser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Native_File_Chooser.obj -MD -MP -MF $(DEPDIR)/fldigi-Native_File_Chooser.Tpo -c -o fldigi-Native_File_Chooser.obj `if test -f 'fileselector/Native_File_Chooser.cxx'; then $(CYGPATH_W) 'fileselector/Native_File_Chooser.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/Native_File_Chooser.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Native_File_Chooser.Tpo $(DEPDIR)/fldigi-Native_File_Chooser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/Native_File_Chooser.cxx' object='fldigi-Native_File_Chooser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Native_File_Chooser.obj `if test -f 'fileselector/Native_File_Chooser.cxx'; then $(CYGPATH_W) 'fileselector/Native_File_Chooser.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/Native_File_Chooser.cxx'; fi` fldigi-fileselect.o: fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-fileselect.o -MD -MP -MF $(DEPDIR)/fldigi-fileselect.Tpo -c -o fldigi-fileselect.o `test -f 'fileselector/fileselect.cxx' || echo '$(srcdir)/'`fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-fileselect.Tpo $(DEPDIR)/fldigi-fileselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/fileselect.cxx' object='fldigi-fileselect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-fileselect.o `test -f 'fileselector/fileselect.cxx' || echo '$(srcdir)/'`fileselector/fileselect.cxx fldigi-fileselect.obj: fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-fileselect.obj -MD -MP -MF $(DEPDIR)/fldigi-fileselect.Tpo -c -o fldigi-fileselect.obj `if test -f 'fileselector/fileselect.cxx'; then $(CYGPATH_W) 'fileselector/fileselect.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/fileselect.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-fileselect.Tpo $(DEPDIR)/fldigi-fileselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/fileselect.cxx' object='fldigi-fileselect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-fileselect.obj `if test -f 'fileselector/fileselect.cxx'; then $(CYGPATH_W) 'fileselector/fileselect.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/fileselect.cxx'; fi` fldigi-fftfilt.o: filters/fftfilt.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-fftfilt.o -MD -MP -MF $(DEPDIR)/fldigi-fftfilt.Tpo -c -o fldigi-fftfilt.o `test -f 'filters/fftfilt.cxx' || echo '$(srcdir)/'`filters/fftfilt.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-fftfilt.Tpo $(DEPDIR)/fldigi-fftfilt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/fftfilt.cxx' object='fldigi-fftfilt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-fftfilt.o `test -f 'filters/fftfilt.cxx' || echo '$(srcdir)/'`filters/fftfilt.cxx fldigi-fftfilt.obj: filters/fftfilt.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-fftfilt.obj -MD -MP -MF $(DEPDIR)/fldigi-fftfilt.Tpo -c -o fldigi-fftfilt.obj `if test -f 'filters/fftfilt.cxx'; then $(CYGPATH_W) 'filters/fftfilt.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/fftfilt.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-fftfilt.Tpo $(DEPDIR)/fldigi-fftfilt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/fftfilt.cxx' object='fldigi-fftfilt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-fftfilt.obj `if test -f 'filters/fftfilt.cxx'; then $(CYGPATH_W) 'filters/fftfilt.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/fftfilt.cxx'; fi` fldigi-filters.o: filters/filters.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-filters.o -MD -MP -MF $(DEPDIR)/fldigi-filters.Tpo -c -o fldigi-filters.o `test -f 'filters/filters.cxx' || echo '$(srcdir)/'`filters/filters.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-filters.Tpo $(DEPDIR)/fldigi-filters.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/filters.cxx' object='fldigi-filters.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-filters.o `test -f 'filters/filters.cxx' || echo '$(srcdir)/'`filters/filters.cxx fldigi-filters.obj: filters/filters.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-filters.obj -MD -MP -MF $(DEPDIR)/fldigi-filters.Tpo -c -o fldigi-filters.obj `if test -f 'filters/filters.cxx'; then $(CYGPATH_W) 'filters/filters.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/filters.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-filters.Tpo $(DEPDIR)/fldigi-filters.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/filters.cxx' object='fldigi-filters.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-filters.obj `if test -f 'filters/filters.cxx'; then $(CYGPATH_W) 'filters/filters.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/filters.cxx'; fi` fldigi-viterbi.o: filters/viterbi.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-viterbi.o -MD -MP -MF $(DEPDIR)/fldigi-viterbi.Tpo -c -o fldigi-viterbi.o `test -f 'filters/viterbi.cxx' || echo '$(srcdir)/'`filters/viterbi.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-viterbi.Tpo $(DEPDIR)/fldigi-viterbi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/viterbi.cxx' object='fldigi-viterbi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-viterbi.o `test -f 'filters/viterbi.cxx' || echo '$(srcdir)/'`filters/viterbi.cxx fldigi-viterbi.obj: filters/viterbi.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-viterbi.obj -MD -MP -MF $(DEPDIR)/fldigi-viterbi.Tpo -c -o fldigi-viterbi.obj `if test -f 'filters/viterbi.cxx'; then $(CYGPATH_W) 'filters/viterbi.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/viterbi.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-viterbi.Tpo $(DEPDIR)/fldigi-viterbi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/viterbi.cxx' object='fldigi-viterbi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-viterbi.obj `if test -f 'filters/viterbi.cxx'; then $(CYGPATH_W) 'filters/viterbi.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/viterbi.cxx'; fi` fldigi-globals.o: globals/globals.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-globals.o -MD -MP -MF $(DEPDIR)/fldigi-globals.Tpo -c -o fldigi-globals.o `test -f 'globals/globals.cxx' || echo '$(srcdir)/'`globals/globals.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-globals.Tpo $(DEPDIR)/fldigi-globals.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='globals/globals.cxx' object='fldigi-globals.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-globals.o `test -f 'globals/globals.cxx' || echo '$(srcdir)/'`globals/globals.cxx fldigi-globals.obj: globals/globals.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-globals.obj -MD -MP -MF $(DEPDIR)/fldigi-globals.Tpo -c -o fldigi-globals.obj `if test -f 'globals/globals.cxx'; then $(CYGPATH_W) 'globals/globals.cxx'; else $(CYGPATH_W) '$(srcdir)/globals/globals.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-globals.Tpo $(DEPDIR)/fldigi-globals.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='globals/globals.cxx' object='fldigi-globals.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-globals.obj `if test -f 'globals/globals.cxx'; then $(CYGPATH_W) 'globals/globals.cxx'; else $(CYGPATH_W) '$(srcdir)/globals/globals.cxx'; fi` fldigi-irrXML.o: irrxml/irrXML.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-irrXML.o -MD -MP -MF $(DEPDIR)/fldigi-irrXML.Tpo -c -o fldigi-irrXML.o `test -f 'irrxml/irrXML.cpp' || echo '$(srcdir)/'`irrxml/irrXML.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-irrXML.Tpo $(DEPDIR)/fldigi-irrXML.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='irrxml/irrXML.cpp' object='fldigi-irrXML.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-irrXML.o `test -f 'irrxml/irrXML.cpp' || echo '$(srcdir)/'`irrxml/irrXML.cpp fldigi-irrXML.obj: irrxml/irrXML.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-irrXML.obj -MD -MP -MF $(DEPDIR)/fldigi-irrXML.Tpo -c -o fldigi-irrXML.obj `if test -f 'irrxml/irrXML.cpp'; then $(CYGPATH_W) 'irrxml/irrXML.cpp'; else $(CYGPATH_W) '$(srcdir)/irrxml/irrXML.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-irrXML.Tpo $(DEPDIR)/fldigi-irrXML.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='irrxml/irrXML.cpp' object='fldigi-irrXML.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-irrXML.obj `if test -f 'irrxml/irrXML.cpp'; then $(CYGPATH_W) 'irrxml/irrXML.cpp'; else $(CYGPATH_W) '$(srcdir)/irrxml/irrXML.cpp'; fi` fldigi-adif_io.o: logbook/adif_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-adif_io.o -MD -MP -MF $(DEPDIR)/fldigi-adif_io.Tpo -c -o fldigi-adif_io.o `test -f 'logbook/adif_io.cxx' || echo '$(srcdir)/'`logbook/adif_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-adif_io.Tpo $(DEPDIR)/fldigi-adif_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/adif_io.cxx' object='fldigi-adif_io.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-adif_io.o `test -f 'logbook/adif_io.cxx' || echo '$(srcdir)/'`logbook/adif_io.cxx fldigi-adif_io.obj: logbook/adif_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-adif_io.obj -MD -MP -MF $(DEPDIR)/fldigi-adif_io.Tpo -c -o fldigi-adif_io.obj `if test -f 'logbook/adif_io.cxx'; then $(CYGPATH_W) 'logbook/adif_io.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/adif_io.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-adif_io.Tpo $(DEPDIR)/fldigi-adif_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/adif_io.cxx' object='fldigi-adif_io.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-adif_io.obj `if test -f 'logbook/adif_io.cxx'; then $(CYGPATH_W) 'logbook/adif_io.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/adif_io.cxx'; fi` fldigi-calendar.o: logbook/calendar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-calendar.o -MD -MP -MF $(DEPDIR)/fldigi-calendar.Tpo -c -o fldigi-calendar.o `test -f 'logbook/calendar.cxx' || echo '$(srcdir)/'`logbook/calendar.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-calendar.Tpo $(DEPDIR)/fldigi-calendar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/calendar.cxx' object='fldigi-calendar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-calendar.o `test -f 'logbook/calendar.cxx' || echo '$(srcdir)/'`logbook/calendar.cxx fldigi-calendar.obj: logbook/calendar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-calendar.obj -MD -MP -MF $(DEPDIR)/fldigi-calendar.Tpo -c -o fldigi-calendar.obj `if test -f 'logbook/calendar.cxx'; then $(CYGPATH_W) 'logbook/calendar.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/calendar.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-calendar.Tpo $(DEPDIR)/fldigi-calendar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/calendar.cxx' object='fldigi-calendar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-calendar.obj `if test -f 'logbook/calendar.cxx'; then $(CYGPATH_W) 'logbook/calendar.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/calendar.cxx'; fi` fldigi-date.o: logbook/date.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-date.o -MD -MP -MF $(DEPDIR)/fldigi-date.Tpo -c -o fldigi-date.o `test -f 'logbook/date.cxx' || echo '$(srcdir)/'`logbook/date.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-date.Tpo $(DEPDIR)/fldigi-date.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/date.cxx' object='fldigi-date.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-date.o `test -f 'logbook/date.cxx' || echo '$(srcdir)/'`logbook/date.cxx fldigi-date.obj: logbook/date.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-date.obj -MD -MP -MF $(DEPDIR)/fldigi-date.Tpo -c -o fldigi-date.obj `if test -f 'logbook/date.cxx'; then $(CYGPATH_W) 'logbook/date.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/date.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-date.Tpo $(DEPDIR)/fldigi-date.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/date.cxx' object='fldigi-date.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-date.obj `if test -f 'logbook/date.cxx'; then $(CYGPATH_W) 'logbook/date.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/date.cxx'; fi` fldigi-lgbook.o: logbook/lgbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-lgbook.o -MD -MP -MF $(DEPDIR)/fldigi-lgbook.Tpo -c -o fldigi-lgbook.o `test -f 'logbook/lgbook.cxx' || echo '$(srcdir)/'`logbook/lgbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-lgbook.Tpo $(DEPDIR)/fldigi-lgbook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/lgbook.cxx' object='fldigi-lgbook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-lgbook.o `test -f 'logbook/lgbook.cxx' || echo '$(srcdir)/'`logbook/lgbook.cxx fldigi-lgbook.obj: logbook/lgbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-lgbook.obj -MD -MP -MF $(DEPDIR)/fldigi-lgbook.Tpo -c -o fldigi-lgbook.obj `if test -f 'logbook/lgbook.cxx'; then $(CYGPATH_W) 'logbook/lgbook.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/lgbook.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-lgbook.Tpo $(DEPDIR)/fldigi-lgbook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/lgbook.cxx' object='fldigi-lgbook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-lgbook.obj `if test -f 'logbook/lgbook.cxx'; then $(CYGPATH_W) 'logbook/lgbook.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/lgbook.cxx'; fi` fldigi-logbook.o: logbook/logbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-logbook.o -MD -MP -MF $(DEPDIR)/fldigi-logbook.Tpo -c -o fldigi-logbook.o `test -f 'logbook/logbook.cxx' || echo '$(srcdir)/'`logbook/logbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-logbook.Tpo $(DEPDIR)/fldigi-logbook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/logbook.cxx' object='fldigi-logbook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-logbook.o `test -f 'logbook/logbook.cxx' || echo '$(srcdir)/'`logbook/logbook.cxx fldigi-logbook.obj: logbook/logbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-logbook.obj -MD -MP -MF $(DEPDIR)/fldigi-logbook.Tpo -c -o fldigi-logbook.obj `if test -f 'logbook/logbook.cxx'; then $(CYGPATH_W) 'logbook/logbook.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/logbook.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-logbook.Tpo $(DEPDIR)/fldigi-logbook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/logbook.cxx' object='fldigi-logbook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-logbook.obj `if test -f 'logbook/logbook.cxx'; then $(CYGPATH_W) 'logbook/logbook.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/logbook.cxx'; fi` fldigi-logsupport.o: logbook/logsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-logsupport.o -MD -MP -MF $(DEPDIR)/fldigi-logsupport.Tpo -c -o fldigi-logsupport.o `test -f 'logbook/logsupport.cxx' || echo '$(srcdir)/'`logbook/logsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-logsupport.Tpo $(DEPDIR)/fldigi-logsupport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/logsupport.cxx' object='fldigi-logsupport.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-logsupport.o `test -f 'logbook/logsupport.cxx' || echo '$(srcdir)/'`logbook/logsupport.cxx fldigi-logsupport.obj: logbook/logsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-logsupport.obj -MD -MP -MF $(DEPDIR)/fldigi-logsupport.Tpo -c -o fldigi-logsupport.obj `if test -f 'logbook/logsupport.cxx'; then $(CYGPATH_W) 'logbook/logsupport.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/logsupport.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-logsupport.Tpo $(DEPDIR)/fldigi-logsupport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/logsupport.cxx' object='fldigi-logsupport.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-logsupport.obj `if test -f 'logbook/logsupport.cxx'; then $(CYGPATH_W) 'logbook/logsupport.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/logsupport.cxx'; fi` fldigi-lookupcall.o: logbook/lookupcall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-lookupcall.o -MD -MP -MF $(DEPDIR)/fldigi-lookupcall.Tpo -c -o fldigi-lookupcall.o `test -f 'logbook/lookupcall.cxx' || echo '$(srcdir)/'`logbook/lookupcall.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-lookupcall.Tpo $(DEPDIR)/fldigi-lookupcall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/lookupcall.cxx' object='fldigi-lookupcall.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-lookupcall.o `test -f 'logbook/lookupcall.cxx' || echo '$(srcdir)/'`logbook/lookupcall.cxx fldigi-lookupcall.obj: logbook/lookupcall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-lookupcall.obj -MD -MP -MF $(DEPDIR)/fldigi-lookupcall.Tpo -c -o fldigi-lookupcall.obj `if test -f 'logbook/lookupcall.cxx'; then $(CYGPATH_W) 'logbook/lookupcall.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/lookupcall.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-lookupcall.Tpo $(DEPDIR)/fldigi-lookupcall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/lookupcall.cxx' object='fldigi-lookupcall.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-lookupcall.obj `if test -f 'logbook/lookupcall.cxx'; then $(CYGPATH_W) 'logbook/lookupcall.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/lookupcall.cxx'; fi` fldigi-qrzlib.o: logbook/qrzlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-qrzlib.o -MD -MP -MF $(DEPDIR)/fldigi-qrzlib.Tpo -c -o fldigi-qrzlib.o `test -f 'logbook/qrzlib.cxx' || echo '$(srcdir)/'`logbook/qrzlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-qrzlib.Tpo $(DEPDIR)/fldigi-qrzlib.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/qrzlib.cxx' object='fldigi-qrzlib.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-qrzlib.o `test -f 'logbook/qrzlib.cxx' || echo '$(srcdir)/'`logbook/qrzlib.cxx fldigi-qrzlib.obj: logbook/qrzlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-qrzlib.obj -MD -MP -MF $(DEPDIR)/fldigi-qrzlib.Tpo -c -o fldigi-qrzlib.obj `if test -f 'logbook/qrzlib.cxx'; then $(CYGPATH_W) 'logbook/qrzlib.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/qrzlib.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-qrzlib.Tpo $(DEPDIR)/fldigi-qrzlib.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/qrzlib.cxx' object='fldigi-qrzlib.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-qrzlib.obj `if test -f 'logbook/qrzlib.cxx'; then $(CYGPATH_W) 'logbook/qrzlib.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/qrzlib.cxx'; fi` fldigi-qso_db.o: logbook/qso_db.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-qso_db.o -MD -MP -MF $(DEPDIR)/fldigi-qso_db.Tpo -c -o fldigi-qso_db.o `test -f 'logbook/qso_db.cxx' || echo '$(srcdir)/'`logbook/qso_db.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-qso_db.Tpo $(DEPDIR)/fldigi-qso_db.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/qso_db.cxx' object='fldigi-qso_db.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-qso_db.o `test -f 'logbook/qso_db.cxx' || echo '$(srcdir)/'`logbook/qso_db.cxx fldigi-qso_db.obj: logbook/qso_db.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-qso_db.obj -MD -MP -MF $(DEPDIR)/fldigi-qso_db.Tpo -c -o fldigi-qso_db.obj `if test -f 'logbook/qso_db.cxx'; then $(CYGPATH_W) 'logbook/qso_db.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/qso_db.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-qso_db.Tpo $(DEPDIR)/fldigi-qso_db.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/qso_db.cxx' object='fldigi-qso_db.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-qso_db.obj `if test -f 'logbook/qso_db.cxx'; then $(CYGPATH_W) 'logbook/qso_db.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/qso_db.cxx'; fi` fldigi-table.o: logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-table.o -MD -MP -MF $(DEPDIR)/fldigi-table.Tpo -c -o fldigi-table.o `test -f 'logbook/table.cxx' || echo '$(srcdir)/'`logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-table.Tpo $(DEPDIR)/fldigi-table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/table.cxx' object='fldigi-table.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-table.o `test -f 'logbook/table.cxx' || echo '$(srcdir)/'`logbook/table.cxx fldigi-table.obj: logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-table.obj -MD -MP -MF $(DEPDIR)/fldigi-table.Tpo -c -o fldigi-table.obj `if test -f 'logbook/table.cxx'; then $(CYGPATH_W) 'logbook/table.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/table.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-table.Tpo $(DEPDIR)/fldigi-table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/table.cxx' object='fldigi-table.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-table.obj `if test -f 'logbook/table.cxx'; then $(CYGPATH_W) 'logbook/table.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/table.cxx'; fi` fldigi-textio.o: logbook/textio.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-textio.o -MD -MP -MF $(DEPDIR)/fldigi-textio.Tpo -c -o fldigi-textio.o `test -f 'logbook/textio.cxx' || echo '$(srcdir)/'`logbook/textio.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-textio.Tpo $(DEPDIR)/fldigi-textio.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/textio.cxx' object='fldigi-textio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-textio.o `test -f 'logbook/textio.cxx' || echo '$(srcdir)/'`logbook/textio.cxx fldigi-textio.obj: logbook/textio.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-textio.obj -MD -MP -MF $(DEPDIR)/fldigi-textio.Tpo -c -o fldigi-textio.obj `if test -f 'logbook/textio.cxx'; then $(CYGPATH_W) 'logbook/textio.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/textio.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-textio.Tpo $(DEPDIR)/fldigi-textio.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/textio.cxx' object='fldigi-textio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-textio.obj `if test -f 'logbook/textio.cxx'; then $(CYGPATH_W) 'logbook/textio.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/textio.cxx'; fi` fldigi-logger.o: logger/logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-logger.o -MD -MP -MF $(DEPDIR)/fldigi-logger.Tpo -c -o fldigi-logger.o `test -f 'logger/logger.cxx' || echo '$(srcdir)/'`logger/logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-logger.Tpo $(DEPDIR)/fldigi-logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/logger.cxx' object='fldigi-logger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-logger.o `test -f 'logger/logger.cxx' || echo '$(srcdir)/'`logger/logger.cxx fldigi-logger.obj: logger/logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-logger.obj -MD -MP -MF $(DEPDIR)/fldigi-logger.Tpo -c -o fldigi-logger.obj `if test -f 'logger/logger.cxx'; then $(CYGPATH_W) 'logger/logger.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/logger.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-logger.Tpo $(DEPDIR)/fldigi-logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/logger.cxx' object='fldigi-logger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-logger.obj `if test -f 'logger/logger.cxx'; then $(CYGPATH_W) 'logger/logger.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/logger.cxx'; fi` fldigi-rx_extract.o: logger/rx_extract.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rx_extract.o -MD -MP -MF $(DEPDIR)/fldigi-rx_extract.Tpo -c -o fldigi-rx_extract.o `test -f 'logger/rx_extract.cxx' || echo '$(srcdir)/'`logger/rx_extract.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rx_extract.Tpo $(DEPDIR)/fldigi-rx_extract.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/rx_extract.cxx' object='fldigi-rx_extract.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rx_extract.o `test -f 'logger/rx_extract.cxx' || echo '$(srcdir)/'`logger/rx_extract.cxx fldigi-rx_extract.obj: logger/rx_extract.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rx_extract.obj -MD -MP -MF $(DEPDIR)/fldigi-rx_extract.Tpo -c -o fldigi-rx_extract.obj `if test -f 'logger/rx_extract.cxx'; then $(CYGPATH_W) 'logger/rx_extract.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/rx_extract.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rx_extract.Tpo $(DEPDIR)/fldigi-rx_extract.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/rx_extract.cxx' object='fldigi-rx_extract.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rx_extract.obj `if test -f 'logger/rx_extract.cxx'; then $(CYGPATH_W) 'logger/rx_extract.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/rx_extract.cxx'; fi` fldigi-speak.o: logger/speak.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-speak.o -MD -MP -MF $(DEPDIR)/fldigi-speak.Tpo -c -o fldigi-speak.o `test -f 'logger/speak.cxx' || echo '$(srcdir)/'`logger/speak.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-speak.Tpo $(DEPDIR)/fldigi-speak.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/speak.cxx' object='fldigi-speak.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-speak.o `test -f 'logger/speak.cxx' || echo '$(srcdir)/'`logger/speak.cxx fldigi-speak.obj: logger/speak.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-speak.obj -MD -MP -MF $(DEPDIR)/fldigi-speak.Tpo -c -o fldigi-speak.obj `if test -f 'logger/speak.cxx'; then $(CYGPATH_W) 'logger/speak.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/speak.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-speak.Tpo $(DEPDIR)/fldigi-speak.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/speak.cxx' object='fldigi-speak.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-speak.obj `if test -f 'logger/speak.cxx'; then $(CYGPATH_W) 'logger/speak.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/speak.cxx'; fi` fldigi-main.o: main.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-main.o -MD -MP -MF $(DEPDIR)/fldigi-main.Tpo -c -o fldigi-main.o `test -f 'main.cxx' || echo '$(srcdir)/'`main.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-main.Tpo $(DEPDIR)/fldigi-main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cxx' object='fldigi-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-main.o `test -f 'main.cxx' || echo '$(srcdir)/'`main.cxx fldigi-main.obj: main.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-main.obj -MD -MP -MF $(DEPDIR)/fldigi-main.Tpo -c -o fldigi-main.obj `if test -f 'main.cxx'; then $(CYGPATH_W) 'main.cxx'; else $(CYGPATH_W) '$(srcdir)/main.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-main.Tpo $(DEPDIR)/fldigi-main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cxx' object='fldigi-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-main.obj `if test -f 'main.cxx'; then $(CYGPATH_W) 'main.cxx'; else $(CYGPATH_W) '$(srcdir)/main.cxx'; fi` fldigi-interleave.o: mfsk/interleave.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-interleave.o -MD -MP -MF $(DEPDIR)/fldigi-interleave.Tpo -c -o fldigi-interleave.o `test -f 'mfsk/interleave.cxx' || echo '$(srcdir)/'`mfsk/interleave.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-interleave.Tpo $(DEPDIR)/fldigi-interleave.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/interleave.cxx' object='fldigi-interleave.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-interleave.o `test -f 'mfsk/interleave.cxx' || echo '$(srcdir)/'`mfsk/interleave.cxx fldigi-interleave.obj: mfsk/interleave.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-interleave.obj -MD -MP -MF $(DEPDIR)/fldigi-interleave.Tpo -c -o fldigi-interleave.obj `if test -f 'mfsk/interleave.cxx'; then $(CYGPATH_W) 'mfsk/interleave.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/interleave.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-interleave.Tpo $(DEPDIR)/fldigi-interleave.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/interleave.cxx' object='fldigi-interleave.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-interleave.obj `if test -f 'mfsk/interleave.cxx'; then $(CYGPATH_W) 'mfsk/interleave.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/interleave.cxx'; fi` fldigi-mfsk.o: mfsk/mfsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-mfsk.o -MD -MP -MF $(DEPDIR)/fldigi-mfsk.Tpo -c -o fldigi-mfsk.o `test -f 'mfsk/mfsk.cxx' || echo '$(srcdir)/'`mfsk/mfsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-mfsk.Tpo $(DEPDIR)/fldigi-mfsk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfsk.cxx' object='fldigi-mfsk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-mfsk.o `test -f 'mfsk/mfsk.cxx' || echo '$(srcdir)/'`mfsk/mfsk.cxx fldigi-mfsk.obj: mfsk/mfsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-mfsk.obj -MD -MP -MF $(DEPDIR)/fldigi-mfsk.Tpo -c -o fldigi-mfsk.obj `if test -f 'mfsk/mfsk.cxx'; then $(CYGPATH_W) 'mfsk/mfsk.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfsk.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-mfsk.Tpo $(DEPDIR)/fldigi-mfsk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfsk.cxx' object='fldigi-mfsk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-mfsk.obj `if test -f 'mfsk/mfsk.cxx'; then $(CYGPATH_W) 'mfsk/mfsk.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfsk.cxx'; fi` fldigi-mfskvaricode.o: mfsk/mfskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-mfskvaricode.o -MD -MP -MF $(DEPDIR)/fldigi-mfskvaricode.Tpo -c -o fldigi-mfskvaricode.o `test -f 'mfsk/mfskvaricode.cxx' || echo '$(srcdir)/'`mfsk/mfskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-mfskvaricode.Tpo $(DEPDIR)/fldigi-mfskvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfskvaricode.cxx' object='fldigi-mfskvaricode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-mfskvaricode.o `test -f 'mfsk/mfskvaricode.cxx' || echo '$(srcdir)/'`mfsk/mfskvaricode.cxx fldigi-mfskvaricode.obj: mfsk/mfskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-mfskvaricode.obj -MD -MP -MF $(DEPDIR)/fldigi-mfskvaricode.Tpo -c -o fldigi-mfskvaricode.obj `if test -f 'mfsk/mfskvaricode.cxx'; then $(CYGPATH_W) 'mfsk/mfskvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfskvaricode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-mfskvaricode.Tpo $(DEPDIR)/fldigi-mfskvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfskvaricode.cxx' object='fldigi-mfskvaricode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-mfskvaricode.obj `if test -f 'mfsk/mfskvaricode.cxx'; then $(CYGPATH_W) 'mfsk/mfskvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfskvaricode.cxx'; fi` fldigi-wefax.o: wefax/wefax.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-wefax.o -MD -MP -MF $(DEPDIR)/fldigi-wefax.Tpo -c -o fldigi-wefax.o `test -f 'wefax/wefax.cxx' || echo '$(srcdir)/'`wefax/wefax.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-wefax.Tpo $(DEPDIR)/fldigi-wefax.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax.cxx' object='fldigi-wefax.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-wefax.o `test -f 'wefax/wefax.cxx' || echo '$(srcdir)/'`wefax/wefax.cxx fldigi-wefax.obj: wefax/wefax.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-wefax.obj -MD -MP -MF $(DEPDIR)/fldigi-wefax.Tpo -c -o fldigi-wefax.obj `if test -f 'wefax/wefax.cxx'; then $(CYGPATH_W) 'wefax/wefax.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-wefax.Tpo $(DEPDIR)/fldigi-wefax.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax.cxx' object='fldigi-wefax.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-wefax.obj `if test -f 'wefax/wefax.cxx'; then $(CYGPATH_W) 'wefax/wefax.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax.cxx'; fi` fldigi-wefax-pic.o: wefax/wefax-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-wefax-pic.o -MD -MP -MF $(DEPDIR)/fldigi-wefax-pic.Tpo -c -o fldigi-wefax-pic.o `test -f 'wefax/wefax-pic.cxx' || echo '$(srcdir)/'`wefax/wefax-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-wefax-pic.Tpo $(DEPDIR)/fldigi-wefax-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax-pic.cxx' object='fldigi-wefax-pic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-wefax-pic.o `test -f 'wefax/wefax-pic.cxx' || echo '$(srcdir)/'`wefax/wefax-pic.cxx fldigi-wefax-pic.obj: wefax/wefax-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-wefax-pic.obj -MD -MP -MF $(DEPDIR)/fldigi-wefax-pic.Tpo -c -o fldigi-wefax-pic.obj `if test -f 'wefax/wefax-pic.cxx'; then $(CYGPATH_W) 'wefax/wefax-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax-pic.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-wefax-pic.Tpo $(DEPDIR)/fldigi-wefax-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax-pic.cxx' object='fldigi-wefax-pic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-wefax-pic.obj `if test -f 'wefax/wefax-pic.cxx'; then $(CYGPATH_W) 'wefax/wefax-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax-pic.cxx'; fi` fldigi-ascii.o: misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-ascii.o -MD -MP -MF $(DEPDIR)/fldigi-ascii.Tpo -c -o fldigi-ascii.o `test -f 'misc/ascii.cxx' || echo '$(srcdir)/'`misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-ascii.Tpo $(DEPDIR)/fldigi-ascii.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ascii.cxx' object='fldigi-ascii.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-ascii.o `test -f 'misc/ascii.cxx' || echo '$(srcdir)/'`misc/ascii.cxx fldigi-ascii.obj: misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-ascii.obj -MD -MP -MF $(DEPDIR)/fldigi-ascii.Tpo -c -o fldigi-ascii.obj `if test -f 'misc/ascii.cxx'; then $(CYGPATH_W) 'misc/ascii.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ascii.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-ascii.Tpo $(DEPDIR)/fldigi-ascii.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ascii.cxx' object='fldigi-ascii.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-ascii.obj `if test -f 'misc/ascii.cxx'; then $(CYGPATH_W) 'misc/ascii.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ascii.cxx'; fi` fldigi-charsetdistiller.o: misc/charsetdistiller.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-charsetdistiller.o -MD -MP -MF $(DEPDIR)/fldigi-charsetdistiller.Tpo -c -o fldigi-charsetdistiller.o `test -f 'misc/charsetdistiller.cxx' || echo '$(srcdir)/'`misc/charsetdistiller.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-charsetdistiller.Tpo $(DEPDIR)/fldigi-charsetdistiller.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/charsetdistiller.cxx' object='fldigi-charsetdistiller.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-charsetdistiller.o `test -f 'misc/charsetdistiller.cxx' || echo '$(srcdir)/'`misc/charsetdistiller.cxx fldigi-charsetdistiller.obj: misc/charsetdistiller.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-charsetdistiller.obj -MD -MP -MF $(DEPDIR)/fldigi-charsetdistiller.Tpo -c -o fldigi-charsetdistiller.obj `if test -f 'misc/charsetdistiller.cxx'; then $(CYGPATH_W) 'misc/charsetdistiller.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/charsetdistiller.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-charsetdistiller.Tpo $(DEPDIR)/fldigi-charsetdistiller.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/charsetdistiller.cxx' object='fldigi-charsetdistiller.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-charsetdistiller.obj `if test -f 'misc/charsetdistiller.cxx'; then $(CYGPATH_W) 'misc/charsetdistiller.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/charsetdistiller.cxx'; fi` fldigi-charsetlist.o: misc/charsetlist.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-charsetlist.o -MD -MP -MF $(DEPDIR)/fldigi-charsetlist.Tpo -c -o fldigi-charsetlist.o `test -f 'misc/charsetlist.cxx' || echo '$(srcdir)/'`misc/charsetlist.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-charsetlist.Tpo $(DEPDIR)/fldigi-charsetlist.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/charsetlist.cxx' object='fldigi-charsetlist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-charsetlist.o `test -f 'misc/charsetlist.cxx' || echo '$(srcdir)/'`misc/charsetlist.cxx fldigi-charsetlist.obj: misc/charsetlist.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-charsetlist.obj -MD -MP -MF $(DEPDIR)/fldigi-charsetlist.Tpo -c -o fldigi-charsetlist.obj `if test -f 'misc/charsetlist.cxx'; then $(CYGPATH_W) 'misc/charsetlist.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/charsetlist.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-charsetlist.Tpo $(DEPDIR)/fldigi-charsetlist.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/charsetlist.cxx' object='fldigi-charsetlist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-charsetlist.obj `if test -f 'misc/charsetlist.cxx'; then $(CYGPATH_W) 'misc/charsetlist.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/charsetlist.cxx'; fi` fldigi-configuration.o: misc/configuration.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-configuration.o -MD -MP -MF $(DEPDIR)/fldigi-configuration.Tpo -c -o fldigi-configuration.o `test -f 'misc/configuration.cxx' || echo '$(srcdir)/'`misc/configuration.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-configuration.Tpo $(DEPDIR)/fldigi-configuration.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/configuration.cxx' object='fldigi-configuration.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-configuration.o `test -f 'misc/configuration.cxx' || echo '$(srcdir)/'`misc/configuration.cxx fldigi-configuration.obj: misc/configuration.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-configuration.obj -MD -MP -MF $(DEPDIR)/fldigi-configuration.Tpo -c -o fldigi-configuration.obj `if test -f 'misc/configuration.cxx'; then $(CYGPATH_W) 'misc/configuration.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/configuration.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-configuration.Tpo $(DEPDIR)/fldigi-configuration.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/configuration.cxx' object='fldigi-configuration.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-configuration.obj `if test -f 'misc/configuration.cxx'; then $(CYGPATH_W) 'misc/configuration.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/configuration.cxx'; fi` fldigi-coordinate.o: misc/coordinate.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-coordinate.o -MD -MP -MF $(DEPDIR)/fldigi-coordinate.Tpo -c -o fldigi-coordinate.o `test -f 'misc/coordinate.cxx' || echo '$(srcdir)/'`misc/coordinate.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-coordinate.Tpo $(DEPDIR)/fldigi-coordinate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/coordinate.cxx' object='fldigi-coordinate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-coordinate.o `test -f 'misc/coordinate.cxx' || echo '$(srcdir)/'`misc/coordinate.cxx fldigi-coordinate.obj: misc/coordinate.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-coordinate.obj -MD -MP -MF $(DEPDIR)/fldigi-coordinate.Tpo -c -o fldigi-coordinate.obj `if test -f 'misc/coordinate.cxx'; then $(CYGPATH_W) 'misc/coordinate.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/coordinate.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-coordinate.Tpo $(DEPDIR)/fldigi-coordinate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/coordinate.cxx' object='fldigi-coordinate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-coordinate.obj `if test -f 'misc/coordinate.cxx'; then $(CYGPATH_W) 'misc/coordinate.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/coordinate.cxx'; fi` fldigi-debug.o: misc/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-debug.o -MD -MP -MF $(DEPDIR)/fldigi-debug.Tpo -c -o fldigi-debug.o `test -f 'misc/debug.cxx' || echo '$(srcdir)/'`misc/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-debug.Tpo $(DEPDIR)/fldigi-debug.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/debug.cxx' object='fldigi-debug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-debug.o `test -f 'misc/debug.cxx' || echo '$(srcdir)/'`misc/debug.cxx fldigi-debug.obj: misc/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-debug.obj -MD -MP -MF $(DEPDIR)/fldigi-debug.Tpo -c -o fldigi-debug.obj `if test -f 'misc/debug.cxx'; then $(CYGPATH_W) 'misc/debug.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/debug.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-debug.Tpo $(DEPDIR)/fldigi-debug.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/debug.cxx' object='fldigi-debug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-debug.obj `if test -f 'misc/debug.cxx'; then $(CYGPATH_W) 'misc/debug.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/debug.cxx'; fi` fldigi-dxcc.o: misc/dxcc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-dxcc.o -MD -MP -MF $(DEPDIR)/fldigi-dxcc.Tpo -c -o fldigi-dxcc.o `test -f 'misc/dxcc.cxx' || echo '$(srcdir)/'`misc/dxcc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-dxcc.Tpo $(DEPDIR)/fldigi-dxcc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/dxcc.cxx' object='fldigi-dxcc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-dxcc.o `test -f 'misc/dxcc.cxx' || echo '$(srcdir)/'`misc/dxcc.cxx fldigi-dxcc.obj: misc/dxcc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-dxcc.obj -MD -MP -MF $(DEPDIR)/fldigi-dxcc.Tpo -c -o fldigi-dxcc.obj `if test -f 'misc/dxcc.cxx'; then $(CYGPATH_W) 'misc/dxcc.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/dxcc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-dxcc.Tpo $(DEPDIR)/fldigi-dxcc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/dxcc.cxx' object='fldigi-dxcc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-dxcc.obj `if test -f 'misc/dxcc.cxx'; then $(CYGPATH_W) 'misc/dxcc.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/dxcc.cxx'; fi` fldigi-icons.o: misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-icons.o -MD -MP -MF $(DEPDIR)/fldigi-icons.Tpo -c -o fldigi-icons.o `test -f 'misc/icons.cxx' || echo '$(srcdir)/'`misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-icons.Tpo $(DEPDIR)/fldigi-icons.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/icons.cxx' object='fldigi-icons.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-icons.o `test -f 'misc/icons.cxx' || echo '$(srcdir)/'`misc/icons.cxx fldigi-icons.obj: misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-icons.obj -MD -MP -MF $(DEPDIR)/fldigi-icons.Tpo -c -o fldigi-icons.obj `if test -f 'misc/icons.cxx'; then $(CYGPATH_W) 'misc/icons.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/icons.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-icons.Tpo $(DEPDIR)/fldigi-icons.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/icons.cxx' object='fldigi-icons.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-icons.obj `if test -f 'misc/icons.cxx'; then $(CYGPATH_W) 'misc/icons.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/icons.cxx'; fi` fldigi-kmlserver.o: misc/kmlserver.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-kmlserver.o -MD -MP -MF $(DEPDIR)/fldigi-kmlserver.Tpo -c -o fldigi-kmlserver.o `test -f 'misc/kmlserver.cxx' || echo '$(srcdir)/'`misc/kmlserver.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-kmlserver.Tpo $(DEPDIR)/fldigi-kmlserver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/kmlserver.cxx' object='fldigi-kmlserver.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-kmlserver.o `test -f 'misc/kmlserver.cxx' || echo '$(srcdir)/'`misc/kmlserver.cxx fldigi-kmlserver.obj: misc/kmlserver.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-kmlserver.obj -MD -MP -MF $(DEPDIR)/fldigi-kmlserver.Tpo -c -o fldigi-kmlserver.obj `if test -f 'misc/kmlserver.cxx'; then $(CYGPATH_W) 'misc/kmlserver.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/kmlserver.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-kmlserver.Tpo $(DEPDIR)/fldigi-kmlserver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/kmlserver.cxx' object='fldigi-kmlserver.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-kmlserver.obj `if test -f 'misc/kmlserver.cxx'; then $(CYGPATH_W) 'misc/kmlserver.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/kmlserver.cxx'; fi` fldigi-log.o: misc/log.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-log.o -MD -MP -MF $(DEPDIR)/fldigi-log.Tpo -c -o fldigi-log.o `test -f 'misc/log.cxx' || echo '$(srcdir)/'`misc/log.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-log.Tpo $(DEPDIR)/fldigi-log.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/log.cxx' object='fldigi-log.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-log.o `test -f 'misc/log.cxx' || echo '$(srcdir)/'`misc/log.cxx fldigi-log.obj: misc/log.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-log.obj -MD -MP -MF $(DEPDIR)/fldigi-log.Tpo -c -o fldigi-log.obj `if test -f 'misc/log.cxx'; then $(CYGPATH_W) 'misc/log.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/log.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-log.Tpo $(DEPDIR)/fldigi-log.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/log.cxx' object='fldigi-log.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-log.obj `if test -f 'misc/log.cxx'; then $(CYGPATH_W) 'misc/log.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/log.cxx'; fi` fldigi-macroedit.o: misc/macroedit.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-macroedit.o -MD -MP -MF $(DEPDIR)/fldigi-macroedit.Tpo -c -o fldigi-macroedit.o `test -f 'misc/macroedit.cxx' || echo '$(srcdir)/'`misc/macroedit.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-macroedit.Tpo $(DEPDIR)/fldigi-macroedit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/macroedit.cxx' object='fldigi-macroedit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-macroedit.o `test -f 'misc/macroedit.cxx' || echo '$(srcdir)/'`misc/macroedit.cxx fldigi-macroedit.obj: misc/macroedit.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-macroedit.obj -MD -MP -MF $(DEPDIR)/fldigi-macroedit.Tpo -c -o fldigi-macroedit.obj `if test -f 'misc/macroedit.cxx'; then $(CYGPATH_W) 'misc/macroedit.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/macroedit.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-macroedit.Tpo $(DEPDIR)/fldigi-macroedit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/macroedit.cxx' object='fldigi-macroedit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-macroedit.obj `if test -f 'misc/macroedit.cxx'; then $(CYGPATH_W) 'misc/macroedit.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/macroedit.cxx'; fi` fldigi-macros.o: misc/macros.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-macros.o -MD -MP -MF $(DEPDIR)/fldigi-macros.Tpo -c -o fldigi-macros.o `test -f 'misc/macros.cxx' || echo '$(srcdir)/'`misc/macros.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-macros.Tpo $(DEPDIR)/fldigi-macros.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/macros.cxx' object='fldigi-macros.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-macros.o `test -f 'misc/macros.cxx' || echo '$(srcdir)/'`misc/macros.cxx fldigi-macros.obj: misc/macros.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-macros.obj -MD -MP -MF $(DEPDIR)/fldigi-macros.Tpo -c -o fldigi-macros.obj `if test -f 'misc/macros.cxx'; then $(CYGPATH_W) 'misc/macros.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/macros.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-macros.Tpo $(DEPDIR)/fldigi-macros.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/macros.cxx' object='fldigi-macros.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-macros.obj `if test -f 'misc/macros.cxx'; then $(CYGPATH_W) 'misc/macros.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/macros.cxx'; fi` fldigi-misc.o: misc/misc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-misc.o -MD -MP -MF $(DEPDIR)/fldigi-misc.Tpo -c -o fldigi-misc.o `test -f 'misc/misc.cxx' || echo '$(srcdir)/'`misc/misc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-misc.Tpo $(DEPDIR)/fldigi-misc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/misc.cxx' object='fldigi-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-misc.o `test -f 'misc/misc.cxx' || echo '$(srcdir)/'`misc/misc.cxx fldigi-misc.obj: misc/misc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-misc.obj -MD -MP -MF $(DEPDIR)/fldigi-misc.Tpo -c -o fldigi-misc.obj `if test -f 'misc/misc.cxx'; then $(CYGPATH_W) 'misc/misc.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/misc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-misc.Tpo $(DEPDIR)/fldigi-misc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/misc.cxx' object='fldigi-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-misc.obj `if test -f 'misc/misc.cxx'; then $(CYGPATH_W) 'misc/misc.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/misc.cxx'; fi` fldigi-network.o: misc/network.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-network.o -MD -MP -MF $(DEPDIR)/fldigi-network.Tpo -c -o fldigi-network.o `test -f 'misc/network.cxx' || echo '$(srcdir)/'`misc/network.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-network.Tpo $(DEPDIR)/fldigi-network.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/network.cxx' object='fldigi-network.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-network.o `test -f 'misc/network.cxx' || echo '$(srcdir)/'`misc/network.cxx fldigi-network.obj: misc/network.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-network.obj -MD -MP -MF $(DEPDIR)/fldigi-network.Tpo -c -o fldigi-network.obj `if test -f 'misc/network.cxx'; then $(CYGPATH_W) 'misc/network.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/network.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-network.Tpo $(DEPDIR)/fldigi-network.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/network.cxx' object='fldigi-network.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-network.obj `if test -f 'misc/network.cxx'; then $(CYGPATH_W) 'misc/network.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/network.cxx'; fi` fldigi-newinstall.o: misc/newinstall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-newinstall.o -MD -MP -MF $(DEPDIR)/fldigi-newinstall.Tpo -c -o fldigi-newinstall.o `test -f 'misc/newinstall.cxx' || echo '$(srcdir)/'`misc/newinstall.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-newinstall.Tpo $(DEPDIR)/fldigi-newinstall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/newinstall.cxx' object='fldigi-newinstall.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-newinstall.o `test -f 'misc/newinstall.cxx' || echo '$(srcdir)/'`misc/newinstall.cxx fldigi-newinstall.obj: misc/newinstall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-newinstall.obj -MD -MP -MF $(DEPDIR)/fldigi-newinstall.Tpo -c -o fldigi-newinstall.obj `if test -f 'misc/newinstall.cxx'; then $(CYGPATH_W) 'misc/newinstall.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/newinstall.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-newinstall.Tpo $(DEPDIR)/fldigi-newinstall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/newinstall.cxx' object='fldigi-newinstall.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-newinstall.obj `if test -f 'misc/newinstall.cxx'; then $(CYGPATH_W) 'misc/newinstall.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/newinstall.cxx'; fi` fldigi-outputencoder.o: misc/outputencoder.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-outputencoder.o -MD -MP -MF $(DEPDIR)/fldigi-outputencoder.Tpo -c -o fldigi-outputencoder.o `test -f 'misc/outputencoder.cxx' || echo '$(srcdir)/'`misc/outputencoder.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-outputencoder.Tpo $(DEPDIR)/fldigi-outputencoder.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/outputencoder.cxx' object='fldigi-outputencoder.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-outputencoder.o `test -f 'misc/outputencoder.cxx' || echo '$(srcdir)/'`misc/outputencoder.cxx fldigi-outputencoder.obj: misc/outputencoder.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-outputencoder.obj -MD -MP -MF $(DEPDIR)/fldigi-outputencoder.Tpo -c -o fldigi-outputencoder.obj `if test -f 'misc/outputencoder.cxx'; then $(CYGPATH_W) 'misc/outputencoder.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/outputencoder.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-outputencoder.Tpo $(DEPDIR)/fldigi-outputencoder.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/outputencoder.cxx' object='fldigi-outputencoder.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-outputencoder.obj `if test -f 'misc/outputencoder.cxx'; then $(CYGPATH_W) 'misc/outputencoder.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/outputencoder.cxx'; fi` fldigi-arq_io.o: misc/arq_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-arq_io.o -MD -MP -MF $(DEPDIR)/fldigi-arq_io.Tpo -c -o fldigi-arq_io.o `test -f 'misc/arq_io.cxx' || echo '$(srcdir)/'`misc/arq_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-arq_io.Tpo $(DEPDIR)/fldigi-arq_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/arq_io.cxx' object='fldigi-arq_io.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-arq_io.o `test -f 'misc/arq_io.cxx' || echo '$(srcdir)/'`misc/arq_io.cxx fldigi-arq_io.obj: misc/arq_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-arq_io.obj -MD -MP -MF $(DEPDIR)/fldigi-arq_io.Tpo -c -o fldigi-arq_io.obj `if test -f 'misc/arq_io.cxx'; then $(CYGPATH_W) 'misc/arq_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/arq_io.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-arq_io.Tpo $(DEPDIR)/fldigi-arq_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/arq_io.cxx' object='fldigi-arq_io.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-arq_io.obj `if test -f 'misc/arq_io.cxx'; then $(CYGPATH_W) 'misc/arq_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/arq_io.cxx'; fi` fldigi-pixmaps.o: misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-pixmaps.o -MD -MP -MF $(DEPDIR)/fldigi-pixmaps.Tpo -c -o fldigi-pixmaps.o `test -f 'misc/pixmaps.cxx' || echo '$(srcdir)/'`misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-pixmaps.Tpo $(DEPDIR)/fldigi-pixmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps.cxx' object='fldigi-pixmaps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-pixmaps.o `test -f 'misc/pixmaps.cxx' || echo '$(srcdir)/'`misc/pixmaps.cxx fldigi-pixmaps.obj: misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-pixmaps.obj -MD -MP -MF $(DEPDIR)/fldigi-pixmaps.Tpo -c -o fldigi-pixmaps.obj `if test -f 'misc/pixmaps.cxx'; then $(CYGPATH_W) 'misc/pixmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-pixmaps.Tpo $(DEPDIR)/fldigi-pixmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps.cxx' object='fldigi-pixmaps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-pixmaps.obj `if test -f 'misc/pixmaps.cxx'; then $(CYGPATH_W) 'misc/pixmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps.cxx'; fi` fldigi-pixmaps_tango.o: misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-pixmaps_tango.o -MD -MP -MF $(DEPDIR)/fldigi-pixmaps_tango.Tpo -c -o fldigi-pixmaps_tango.o `test -f 'misc/pixmaps_tango.cxx' || echo '$(srcdir)/'`misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-pixmaps_tango.Tpo $(DEPDIR)/fldigi-pixmaps_tango.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps_tango.cxx' object='fldigi-pixmaps_tango.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-pixmaps_tango.o `test -f 'misc/pixmaps_tango.cxx' || echo '$(srcdir)/'`misc/pixmaps_tango.cxx fldigi-pixmaps_tango.obj: misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-pixmaps_tango.obj -MD -MP -MF $(DEPDIR)/fldigi-pixmaps_tango.Tpo -c -o fldigi-pixmaps_tango.obj `if test -f 'misc/pixmaps_tango.cxx'; then $(CYGPATH_W) 'misc/pixmaps_tango.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps_tango.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-pixmaps_tango.Tpo $(DEPDIR)/fldigi-pixmaps_tango.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps_tango.cxx' object='fldigi-pixmaps_tango.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-pixmaps_tango.obj `if test -f 'misc/pixmaps_tango.cxx'; then $(CYGPATH_W) 'misc/pixmaps_tango.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps_tango.cxx'; fi` fldigi-re.o: misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-re.o -MD -MP -MF $(DEPDIR)/fldigi-re.Tpo -c -o fldigi-re.o `test -f 'misc/re.cxx' || echo '$(srcdir)/'`misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-re.Tpo $(DEPDIR)/fldigi-re.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/re.cxx' object='fldigi-re.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-re.o `test -f 'misc/re.cxx' || echo '$(srcdir)/'`misc/re.cxx fldigi-re.obj: misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-re.obj -MD -MP -MF $(DEPDIR)/fldigi-re.Tpo -c -o fldigi-re.obj `if test -f 'misc/re.cxx'; then $(CYGPATH_W) 'misc/re.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/re.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-re.Tpo $(DEPDIR)/fldigi-re.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/re.cxx' object='fldigi-re.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-re.obj `if test -f 'misc/re.cxx'; then $(CYGPATH_W) 'misc/re.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/re.cxx'; fi` fldigi-record_loader.o: misc/record_loader.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-record_loader.o -MD -MP -MF $(DEPDIR)/fldigi-record_loader.Tpo -c -o fldigi-record_loader.o `test -f 'misc/record_loader.cxx' || echo '$(srcdir)/'`misc/record_loader.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-record_loader.Tpo $(DEPDIR)/fldigi-record_loader.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/record_loader.cxx' object='fldigi-record_loader.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-record_loader.o `test -f 'misc/record_loader.cxx' || echo '$(srcdir)/'`misc/record_loader.cxx fldigi-record_loader.obj: misc/record_loader.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-record_loader.obj -MD -MP -MF $(DEPDIR)/fldigi-record_loader.Tpo -c -o fldigi-record_loader.obj `if test -f 'misc/record_loader.cxx'; then $(CYGPATH_W) 'misc/record_loader.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/record_loader.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-record_loader.Tpo $(DEPDIR)/fldigi-record_loader.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/record_loader.cxx' object='fldigi-record_loader.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-record_loader.obj `if test -f 'misc/record_loader.cxx'; then $(CYGPATH_W) 'misc/record_loader.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/record_loader.cxx'; fi` fldigi-socket.o: misc/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-socket.o -MD -MP -MF $(DEPDIR)/fldigi-socket.Tpo -c -o fldigi-socket.o `test -f 'misc/socket.cxx' || echo '$(srcdir)/'`misc/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-socket.Tpo $(DEPDIR)/fldigi-socket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/socket.cxx' object='fldigi-socket.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-socket.o `test -f 'misc/socket.cxx' || echo '$(srcdir)/'`misc/socket.cxx fldigi-socket.obj: misc/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-socket.obj -MD -MP -MF $(DEPDIR)/fldigi-socket.Tpo -c -o fldigi-socket.obj `if test -f 'misc/socket.cxx'; then $(CYGPATH_W) 'misc/socket.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/socket.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-socket.Tpo $(DEPDIR)/fldigi-socket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/socket.cxx' object='fldigi-socket.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-socket.obj `if test -f 'misc/socket.cxx'; then $(CYGPATH_W) 'misc/socket.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/socket.cxx'; fi` fldigi-stacktrace.o: misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-stacktrace.o -MD -MP -MF $(DEPDIR)/fldigi-stacktrace.Tpo -c -o fldigi-stacktrace.o `test -f 'misc/stacktrace.cxx' || echo '$(srcdir)/'`misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-stacktrace.Tpo $(DEPDIR)/fldigi-stacktrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stacktrace.cxx' object='fldigi-stacktrace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-stacktrace.o `test -f 'misc/stacktrace.cxx' || echo '$(srcdir)/'`misc/stacktrace.cxx fldigi-stacktrace.obj: misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-stacktrace.obj -MD -MP -MF $(DEPDIR)/fldigi-stacktrace.Tpo -c -o fldigi-stacktrace.obj `if test -f 'misc/stacktrace.cxx'; then $(CYGPATH_W) 'misc/stacktrace.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stacktrace.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-stacktrace.Tpo $(DEPDIR)/fldigi-stacktrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stacktrace.cxx' object='fldigi-stacktrace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-stacktrace.obj `if test -f 'misc/stacktrace.cxx'; then $(CYGPATH_W) 'misc/stacktrace.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stacktrace.cxx'; fi` fldigi-status.o: misc/status.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-status.o -MD -MP -MF $(DEPDIR)/fldigi-status.Tpo -c -o fldigi-status.o `test -f 'misc/status.cxx' || echo '$(srcdir)/'`misc/status.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-status.Tpo $(DEPDIR)/fldigi-status.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/status.cxx' object='fldigi-status.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-status.o `test -f 'misc/status.cxx' || echo '$(srcdir)/'`misc/status.cxx fldigi-status.obj: misc/status.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-status.obj -MD -MP -MF $(DEPDIR)/fldigi-status.Tpo -c -o fldigi-status.obj `if test -f 'misc/status.cxx'; then $(CYGPATH_W) 'misc/status.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/status.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-status.Tpo $(DEPDIR)/fldigi-status.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/status.cxx' object='fldigi-status.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-status.obj `if test -f 'misc/status.cxx'; then $(CYGPATH_W) 'misc/status.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/status.cxx'; fi` fldigi-strutil.o: misc/strutil.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-strutil.o -MD -MP -MF $(DEPDIR)/fldigi-strutil.Tpo -c -o fldigi-strutil.o `test -f 'misc/strutil.cxx' || echo '$(srcdir)/'`misc/strutil.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-strutil.Tpo $(DEPDIR)/fldigi-strutil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/strutil.cxx' object='fldigi-strutil.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-strutil.o `test -f 'misc/strutil.cxx' || echo '$(srcdir)/'`misc/strutil.cxx fldigi-strutil.obj: misc/strutil.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-strutil.obj -MD -MP -MF $(DEPDIR)/fldigi-strutil.Tpo -c -o fldigi-strutil.obj `if test -f 'misc/strutil.cxx'; then $(CYGPATH_W) 'misc/strutil.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/strutil.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-strutil.Tpo $(DEPDIR)/fldigi-strutil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/strutil.cxx' object='fldigi-strutil.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-strutil.obj `if test -f 'misc/strutil.cxx'; then $(CYGPATH_W) 'misc/strutil.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/strutil.cxx'; fi` fldigi-threads.o: misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-threads.o -MD -MP -MF $(DEPDIR)/fldigi-threads.Tpo -c -o fldigi-threads.o `test -f 'misc/threads.cxx' || echo '$(srcdir)/'`misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-threads.Tpo $(DEPDIR)/fldigi-threads.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/threads.cxx' object='fldigi-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-threads.o `test -f 'misc/threads.cxx' || echo '$(srcdir)/'`misc/threads.cxx fldigi-threads.obj: misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-threads.obj -MD -MP -MF $(DEPDIR)/fldigi-threads.Tpo -c -o fldigi-threads.obj `if test -f 'misc/threads.cxx'; then $(CYGPATH_W) 'misc/threads.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/threads.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-threads.Tpo $(DEPDIR)/fldigi-threads.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/threads.cxx' object='fldigi-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-threads.obj `if test -f 'misc/threads.cxx'; then $(CYGPATH_W) 'misc/threads.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/threads.cxx'; fi` fldigi-timeops.o: misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-timeops.o -MD -MP -MF $(DEPDIR)/fldigi-timeops.Tpo -c -o fldigi-timeops.o `test -f 'misc/timeops.cxx' || echo '$(srcdir)/'`misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-timeops.Tpo $(DEPDIR)/fldigi-timeops.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/timeops.cxx' object='fldigi-timeops.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-timeops.o `test -f 'misc/timeops.cxx' || echo '$(srcdir)/'`misc/timeops.cxx fldigi-timeops.obj: misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-timeops.obj -MD -MP -MF $(DEPDIR)/fldigi-timeops.Tpo -c -o fldigi-timeops.obj `if test -f 'misc/timeops.cxx'; then $(CYGPATH_W) 'misc/timeops.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/timeops.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-timeops.Tpo $(DEPDIR)/fldigi-timeops.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/timeops.cxx' object='fldigi-timeops.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-timeops.obj `if test -f 'misc/timeops.cxx'; then $(CYGPATH_W) 'misc/timeops.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/timeops.cxx'; fi` fldigi-utf8file_io.o: misc/utf8file_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-utf8file_io.o -MD -MP -MF $(DEPDIR)/fldigi-utf8file_io.Tpo -c -o fldigi-utf8file_io.o `test -f 'misc/utf8file_io.cxx' || echo '$(srcdir)/'`misc/utf8file_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-utf8file_io.Tpo $(DEPDIR)/fldigi-utf8file_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/utf8file_io.cxx' object='fldigi-utf8file_io.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-utf8file_io.o `test -f 'misc/utf8file_io.cxx' || echo '$(srcdir)/'`misc/utf8file_io.cxx fldigi-utf8file_io.obj: misc/utf8file_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-utf8file_io.obj -MD -MP -MF $(DEPDIR)/fldigi-utf8file_io.Tpo -c -o fldigi-utf8file_io.obj `if test -f 'misc/utf8file_io.cxx'; then $(CYGPATH_W) 'misc/utf8file_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/utf8file_io.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-utf8file_io.Tpo $(DEPDIR)/fldigi-utf8file_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/utf8file_io.cxx' object='fldigi-utf8file_io.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-utf8file_io.obj `if test -f 'misc/utf8file_io.cxx'; then $(CYGPATH_W) 'misc/utf8file_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/utf8file_io.cxx'; fi` fldigi-util.o: misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-util.o -MD -MP -MF $(DEPDIR)/fldigi-util.Tpo -c -o fldigi-util.o `test -f 'misc/util.cxx' || echo '$(srcdir)/'`misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-util.Tpo $(DEPDIR)/fldigi-util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/util.cxx' object='fldigi-util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-util.o `test -f 'misc/util.cxx' || echo '$(srcdir)/'`misc/util.cxx fldigi-util.obj: misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-util.obj -MD -MP -MF $(DEPDIR)/fldigi-util.Tpo -c -o fldigi-util.obj `if test -f 'misc/util.cxx'; then $(CYGPATH_W) 'misc/util.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/util.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-util.Tpo $(DEPDIR)/fldigi-util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/util.cxx' object='fldigi-util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-util.obj `if test -f 'misc/util.cxx'; then $(CYGPATH_W) 'misc/util.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/util.cxx'; fi` fldigi-weather.o: misc/weather.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-weather.o -MD -MP -MF $(DEPDIR)/fldigi-weather.Tpo -c -o fldigi-weather.o `test -f 'misc/weather.cxx' || echo '$(srcdir)/'`misc/weather.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-weather.Tpo $(DEPDIR)/fldigi-weather.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/weather.cxx' object='fldigi-weather.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-weather.o `test -f 'misc/weather.cxx' || echo '$(srcdir)/'`misc/weather.cxx fldigi-weather.obj: misc/weather.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-weather.obj -MD -MP -MF $(DEPDIR)/fldigi-weather.Tpo -c -o fldigi-weather.obj `if test -f 'misc/weather.cxx'; then $(CYGPATH_W) 'misc/weather.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/weather.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-weather.Tpo $(DEPDIR)/fldigi-weather.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/weather.cxx' object='fldigi-weather.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-weather.obj `if test -f 'misc/weather.cxx'; then $(CYGPATH_W) 'misc/weather.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/weather.cxx'; fi` fldigi-dsp.o: mt63/dsp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-dsp.o -MD -MP -MF $(DEPDIR)/fldigi-dsp.Tpo -c -o fldigi-dsp.o `test -f 'mt63/dsp.cxx' || echo '$(srcdir)/'`mt63/dsp.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-dsp.Tpo $(DEPDIR)/fldigi-dsp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/dsp.cxx' object='fldigi-dsp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-dsp.o `test -f 'mt63/dsp.cxx' || echo '$(srcdir)/'`mt63/dsp.cxx fldigi-dsp.obj: mt63/dsp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-dsp.obj -MD -MP -MF $(DEPDIR)/fldigi-dsp.Tpo -c -o fldigi-dsp.obj `if test -f 'mt63/dsp.cxx'; then $(CYGPATH_W) 'mt63/dsp.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/dsp.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-dsp.Tpo $(DEPDIR)/fldigi-dsp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/dsp.cxx' object='fldigi-dsp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-dsp.obj `if test -f 'mt63/dsp.cxx'; then $(CYGPATH_W) 'mt63/dsp.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/dsp.cxx'; fi` fldigi-mt63.o: mt63/mt63.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-mt63.o -MD -MP -MF $(DEPDIR)/fldigi-mt63.Tpo -c -o fldigi-mt63.o `test -f 'mt63/mt63.cxx' || echo '$(srcdir)/'`mt63/mt63.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-mt63.Tpo $(DEPDIR)/fldigi-mt63.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/mt63.cxx' object='fldigi-mt63.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-mt63.o `test -f 'mt63/mt63.cxx' || echo '$(srcdir)/'`mt63/mt63.cxx fldigi-mt63.obj: mt63/mt63.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-mt63.obj -MD -MP -MF $(DEPDIR)/fldigi-mt63.Tpo -c -o fldigi-mt63.obj `if test -f 'mt63/mt63.cxx'; then $(CYGPATH_W) 'mt63/mt63.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/mt63.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-mt63.Tpo $(DEPDIR)/fldigi-mt63.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/mt63.cxx' object='fldigi-mt63.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-mt63.obj `if test -f 'mt63/mt63.cxx'; then $(CYGPATH_W) 'mt63/mt63.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/mt63.cxx'; fi` fldigi-mt63base.o: mt63/mt63base.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-mt63base.o -MD -MP -MF $(DEPDIR)/fldigi-mt63base.Tpo -c -o fldigi-mt63base.o `test -f 'mt63/mt63base.cxx' || echo '$(srcdir)/'`mt63/mt63base.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-mt63base.Tpo $(DEPDIR)/fldigi-mt63base.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/mt63base.cxx' object='fldigi-mt63base.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-mt63base.o `test -f 'mt63/mt63base.cxx' || echo '$(srcdir)/'`mt63/mt63base.cxx fldigi-mt63base.obj: mt63/mt63base.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-mt63base.obj -MD -MP -MF $(DEPDIR)/fldigi-mt63base.Tpo -c -o fldigi-mt63base.obj `if test -f 'mt63/mt63base.cxx'; then $(CYGPATH_W) 'mt63/mt63base.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/mt63base.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-mt63base.Tpo $(DEPDIR)/fldigi-mt63base.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/mt63base.cxx' object='fldigi-mt63base.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-mt63base.obj `if test -f 'mt63/mt63base.cxx'; then $(CYGPATH_W) 'mt63/mt63base.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/mt63base.cxx'; fi` fldigi-navtex.o: navtex/navtex.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-navtex.o -MD -MP -MF $(DEPDIR)/fldigi-navtex.Tpo -c -o fldigi-navtex.o `test -f 'navtex/navtex.cxx' || echo '$(srcdir)/'`navtex/navtex.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-navtex.Tpo $(DEPDIR)/fldigi-navtex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='navtex/navtex.cxx' object='fldigi-navtex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-navtex.o `test -f 'navtex/navtex.cxx' || echo '$(srcdir)/'`navtex/navtex.cxx fldigi-navtex.obj: navtex/navtex.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-navtex.obj -MD -MP -MF $(DEPDIR)/fldigi-navtex.Tpo -c -o fldigi-navtex.obj `if test -f 'navtex/navtex.cxx'; then $(CYGPATH_W) 'navtex/navtex.cxx'; else $(CYGPATH_W) '$(srcdir)/navtex/navtex.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-navtex.Tpo $(DEPDIR)/fldigi-navtex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='navtex/navtex.cxx' object='fldigi-navtex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-navtex.obj `if test -f 'navtex/navtex.cxx'; then $(CYGPATH_W) 'navtex/navtex.cxx'; else $(CYGPATH_W) '$(srcdir)/navtex/navtex.cxx'; fi` fldigi-olivia.o: olivia/olivia.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-olivia.o -MD -MP -MF $(DEPDIR)/fldigi-olivia.Tpo -c -o fldigi-olivia.o `test -f 'olivia/olivia.cxx' || echo '$(srcdir)/'`olivia/olivia.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-olivia.Tpo $(DEPDIR)/fldigi-olivia.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='olivia/olivia.cxx' object='fldigi-olivia.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-olivia.o `test -f 'olivia/olivia.cxx' || echo '$(srcdir)/'`olivia/olivia.cxx fldigi-olivia.obj: olivia/olivia.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-olivia.obj -MD -MP -MF $(DEPDIR)/fldigi-olivia.Tpo -c -o fldigi-olivia.obj `if test -f 'olivia/olivia.cxx'; then $(CYGPATH_W) 'olivia/olivia.cxx'; else $(CYGPATH_W) '$(srcdir)/olivia/olivia.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-olivia.Tpo $(DEPDIR)/fldigi-olivia.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='olivia/olivia.cxx' object='fldigi-olivia.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-olivia.obj `if test -f 'olivia/olivia.cxx'; then $(CYGPATH_W) 'olivia/olivia.cxx'; else $(CYGPATH_W) '$(srcdir)/olivia/olivia.cxx'; fi` fldigi-psk.o: psk/psk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-psk.o -MD -MP -MF $(DEPDIR)/fldigi-psk.Tpo -c -o fldigi-psk.o `test -f 'psk/psk.cxx' || echo '$(srcdir)/'`psk/psk.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-psk.Tpo $(DEPDIR)/fldigi-psk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/psk.cxx' object='fldigi-psk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-psk.o `test -f 'psk/psk.cxx' || echo '$(srcdir)/'`psk/psk.cxx fldigi-psk.obj: psk/psk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-psk.obj -MD -MP -MF $(DEPDIR)/fldigi-psk.Tpo -c -o fldigi-psk.obj `if test -f 'psk/psk.cxx'; then $(CYGPATH_W) 'psk/psk.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/psk.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-psk.Tpo $(DEPDIR)/fldigi-psk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/psk.cxx' object='fldigi-psk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-psk.obj `if test -f 'psk/psk.cxx'; then $(CYGPATH_W) 'psk/psk.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/psk.cxx'; fi` fldigi-pskcoeff.o: psk/pskcoeff.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-pskcoeff.o -MD -MP -MF $(DEPDIR)/fldigi-pskcoeff.Tpo -c -o fldigi-pskcoeff.o `test -f 'psk/pskcoeff.cxx' || echo '$(srcdir)/'`psk/pskcoeff.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-pskcoeff.Tpo $(DEPDIR)/fldigi-pskcoeff.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskcoeff.cxx' object='fldigi-pskcoeff.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-pskcoeff.o `test -f 'psk/pskcoeff.cxx' || echo '$(srcdir)/'`psk/pskcoeff.cxx fldigi-pskcoeff.obj: psk/pskcoeff.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-pskcoeff.obj -MD -MP -MF $(DEPDIR)/fldigi-pskcoeff.Tpo -c -o fldigi-pskcoeff.obj `if test -f 'psk/pskcoeff.cxx'; then $(CYGPATH_W) 'psk/pskcoeff.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskcoeff.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-pskcoeff.Tpo $(DEPDIR)/fldigi-pskcoeff.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskcoeff.cxx' object='fldigi-pskcoeff.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-pskcoeff.obj `if test -f 'psk/pskcoeff.cxx'; then $(CYGPATH_W) 'psk/pskcoeff.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskcoeff.cxx'; fi` fldigi-pskvaricode.o: psk/pskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-pskvaricode.o -MD -MP -MF $(DEPDIR)/fldigi-pskvaricode.Tpo -c -o fldigi-pskvaricode.o `test -f 'psk/pskvaricode.cxx' || echo '$(srcdir)/'`psk/pskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-pskvaricode.Tpo $(DEPDIR)/fldigi-pskvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskvaricode.cxx' object='fldigi-pskvaricode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-pskvaricode.o `test -f 'psk/pskvaricode.cxx' || echo '$(srcdir)/'`psk/pskvaricode.cxx fldigi-pskvaricode.obj: psk/pskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-pskvaricode.obj -MD -MP -MF $(DEPDIR)/fldigi-pskvaricode.Tpo -c -o fldigi-pskvaricode.obj `if test -f 'psk/pskvaricode.cxx'; then $(CYGPATH_W) 'psk/pskvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskvaricode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-pskvaricode.Tpo $(DEPDIR)/fldigi-pskvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskvaricode.cxx' object='fldigi-pskvaricode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-pskvaricode.obj `if test -f 'psk/pskvaricode.cxx'; then $(CYGPATH_W) 'psk/pskvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskvaricode.cxx'; fi` fldigi-viewpsk.o: psk/viewpsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-viewpsk.o -MD -MP -MF $(DEPDIR)/fldigi-viewpsk.Tpo -c -o fldigi-viewpsk.o `test -f 'psk/viewpsk.cxx' || echo '$(srcdir)/'`psk/viewpsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-viewpsk.Tpo $(DEPDIR)/fldigi-viewpsk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/viewpsk.cxx' object='fldigi-viewpsk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-viewpsk.o `test -f 'psk/viewpsk.cxx' || echo '$(srcdir)/'`psk/viewpsk.cxx fldigi-viewpsk.obj: psk/viewpsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-viewpsk.obj -MD -MP -MF $(DEPDIR)/fldigi-viewpsk.Tpo -c -o fldigi-viewpsk.obj `if test -f 'psk/viewpsk.cxx'; then $(CYGPATH_W) 'psk/viewpsk.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/viewpsk.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-viewpsk.Tpo $(DEPDIR)/fldigi-viewpsk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/viewpsk.cxx' object='fldigi-viewpsk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-viewpsk.obj `if test -f 'psk/viewpsk.cxx'; then $(CYGPATH_W) 'psk/viewpsk.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/viewpsk.cxx'; fi` fldigi-pskeval.o: psk/pskeval.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-pskeval.o -MD -MP -MF $(DEPDIR)/fldigi-pskeval.Tpo -c -o fldigi-pskeval.o `test -f 'psk/pskeval.cxx' || echo '$(srcdir)/'`psk/pskeval.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-pskeval.Tpo $(DEPDIR)/fldigi-pskeval.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskeval.cxx' object='fldigi-pskeval.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-pskeval.o `test -f 'psk/pskeval.cxx' || echo '$(srcdir)/'`psk/pskeval.cxx fldigi-pskeval.obj: psk/pskeval.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-pskeval.obj -MD -MP -MF $(DEPDIR)/fldigi-pskeval.Tpo -c -o fldigi-pskeval.obj `if test -f 'psk/pskeval.cxx'; then $(CYGPATH_W) 'psk/pskeval.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskeval.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-pskeval.Tpo $(DEPDIR)/fldigi-pskeval.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskeval.cxx' object='fldigi-pskeval.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-pskeval.obj `if test -f 'psk/pskeval.cxx'; then $(CYGPATH_W) 'psk/pskeval.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskeval.cxx'; fi` fldigi-qrunner.o: qrunner/qrunner.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-qrunner.o -MD -MP -MF $(DEPDIR)/fldigi-qrunner.Tpo -c -o fldigi-qrunner.o `test -f 'qrunner/qrunner.cxx' || echo '$(srcdir)/'`qrunner/qrunner.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-qrunner.Tpo $(DEPDIR)/fldigi-qrunner.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='qrunner/qrunner.cxx' object='fldigi-qrunner.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-qrunner.o `test -f 'qrunner/qrunner.cxx' || echo '$(srcdir)/'`qrunner/qrunner.cxx fldigi-qrunner.obj: qrunner/qrunner.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-qrunner.obj -MD -MP -MF $(DEPDIR)/fldigi-qrunner.Tpo -c -o fldigi-qrunner.obj `if test -f 'qrunner/qrunner.cxx'; then $(CYGPATH_W) 'qrunner/qrunner.cxx'; else $(CYGPATH_W) '$(srcdir)/qrunner/qrunner.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-qrunner.Tpo $(DEPDIR)/fldigi-qrunner.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='qrunner/qrunner.cxx' object='fldigi-qrunner.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-qrunner.obj `if test -f 'qrunner/qrunner.cxx'; then $(CYGPATH_W) 'qrunner/qrunner.cxx'; else $(CYGPATH_W) '$(srcdir)/qrunner/qrunner.cxx'; fi` fldigi-FreqControl.o: rigcontrol/FreqControl.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FreqControl.o -MD -MP -MF $(DEPDIR)/fldigi-FreqControl.Tpo -c -o fldigi-FreqControl.o `test -f 'rigcontrol/FreqControl.cxx' || echo '$(srcdir)/'`rigcontrol/FreqControl.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FreqControl.Tpo $(DEPDIR)/fldigi-FreqControl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/FreqControl.cxx' object='fldigi-FreqControl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FreqControl.o `test -f 'rigcontrol/FreqControl.cxx' || echo '$(srcdir)/'`rigcontrol/FreqControl.cxx fldigi-FreqControl.obj: rigcontrol/FreqControl.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FreqControl.obj -MD -MP -MF $(DEPDIR)/fldigi-FreqControl.Tpo -c -o fldigi-FreqControl.obj `if test -f 'rigcontrol/FreqControl.cxx'; then $(CYGPATH_W) 'rigcontrol/FreqControl.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/FreqControl.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FreqControl.Tpo $(DEPDIR)/fldigi-FreqControl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/FreqControl.cxx' object='fldigi-FreqControl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FreqControl.obj `if test -f 'rigcontrol/FreqControl.cxx'; then $(CYGPATH_W) 'rigcontrol/FreqControl.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/FreqControl.cxx'; fi` fldigi-ptt.o: rigcontrol/ptt.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-ptt.o -MD -MP -MF $(DEPDIR)/fldigi-ptt.Tpo -c -o fldigi-ptt.o `test -f 'rigcontrol/ptt.cxx' || echo '$(srcdir)/'`rigcontrol/ptt.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-ptt.Tpo $(DEPDIR)/fldigi-ptt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/ptt.cxx' object='fldigi-ptt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-ptt.o `test -f 'rigcontrol/ptt.cxx' || echo '$(srcdir)/'`rigcontrol/ptt.cxx fldigi-ptt.obj: rigcontrol/ptt.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-ptt.obj -MD -MP -MF $(DEPDIR)/fldigi-ptt.Tpo -c -o fldigi-ptt.obj `if test -f 'rigcontrol/ptt.cxx'; then $(CYGPATH_W) 'rigcontrol/ptt.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/ptt.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-ptt.Tpo $(DEPDIR)/fldigi-ptt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/ptt.cxx' object='fldigi-ptt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-ptt.obj `if test -f 'rigcontrol/ptt.cxx'; then $(CYGPATH_W) 'rigcontrol/ptt.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/ptt.cxx'; fi` fldigi-rigio.o: rigcontrol/rigio.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rigio.o -MD -MP -MF $(DEPDIR)/fldigi-rigio.Tpo -c -o fldigi-rigio.o `test -f 'rigcontrol/rigio.cxx' || echo '$(srcdir)/'`rigcontrol/rigio.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rigio.Tpo $(DEPDIR)/fldigi-rigio.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigio.cxx' object='fldigi-rigio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rigio.o `test -f 'rigcontrol/rigio.cxx' || echo '$(srcdir)/'`rigcontrol/rigio.cxx fldigi-rigio.obj: rigcontrol/rigio.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rigio.obj -MD -MP -MF $(DEPDIR)/fldigi-rigio.Tpo -c -o fldigi-rigio.obj `if test -f 'rigcontrol/rigio.cxx'; then $(CYGPATH_W) 'rigcontrol/rigio.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigio.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rigio.Tpo $(DEPDIR)/fldigi-rigio.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigio.cxx' object='fldigi-rigio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rigio.obj `if test -f 'rigcontrol/rigio.cxx'; then $(CYGPATH_W) 'rigcontrol/rigio.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigio.cxx'; fi` fldigi-rigsupport.o: rigcontrol/rigsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rigsupport.o -MD -MP -MF $(DEPDIR)/fldigi-rigsupport.Tpo -c -o fldigi-rigsupport.o `test -f 'rigcontrol/rigsupport.cxx' || echo '$(srcdir)/'`rigcontrol/rigsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rigsupport.Tpo $(DEPDIR)/fldigi-rigsupport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigsupport.cxx' object='fldigi-rigsupport.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rigsupport.o `test -f 'rigcontrol/rigsupport.cxx' || echo '$(srcdir)/'`rigcontrol/rigsupport.cxx fldigi-rigsupport.obj: rigcontrol/rigsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rigsupport.obj -MD -MP -MF $(DEPDIR)/fldigi-rigsupport.Tpo -c -o fldigi-rigsupport.obj `if test -f 'rigcontrol/rigsupport.cxx'; then $(CYGPATH_W) 'rigcontrol/rigsupport.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigsupport.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rigsupport.Tpo $(DEPDIR)/fldigi-rigsupport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigsupport.cxx' object='fldigi-rigsupport.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rigsupport.obj `if test -f 'rigcontrol/rigsupport.cxx'; then $(CYGPATH_W) 'rigcontrol/rigsupport.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigsupport.cxx'; fi` fldigi-rigxml.o: rigcontrol/rigxml.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rigxml.o -MD -MP -MF $(DEPDIR)/fldigi-rigxml.Tpo -c -o fldigi-rigxml.o `test -f 'rigcontrol/rigxml.cxx' || echo '$(srcdir)/'`rigcontrol/rigxml.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rigxml.Tpo $(DEPDIR)/fldigi-rigxml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigxml.cxx' object='fldigi-rigxml.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rigxml.o `test -f 'rigcontrol/rigxml.cxx' || echo '$(srcdir)/'`rigcontrol/rigxml.cxx fldigi-rigxml.obj: rigcontrol/rigxml.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rigxml.obj -MD -MP -MF $(DEPDIR)/fldigi-rigxml.Tpo -c -o fldigi-rigxml.obj `if test -f 'rigcontrol/rigxml.cxx'; then $(CYGPATH_W) 'rigcontrol/rigxml.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigxml.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rigxml.Tpo $(DEPDIR)/fldigi-rigxml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigxml.cxx' object='fldigi-rigxml.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rigxml.obj `if test -f 'rigcontrol/rigxml.cxx'; then $(CYGPATH_W) 'rigcontrol/rigxml.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigxml.cxx'; fi` fldigi-serial.o: rigcontrol/serial.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-serial.o -MD -MP -MF $(DEPDIR)/fldigi-serial.Tpo -c -o fldigi-serial.o `test -f 'rigcontrol/serial.cxx' || echo '$(srcdir)/'`rigcontrol/serial.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-serial.Tpo $(DEPDIR)/fldigi-serial.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/serial.cxx' object='fldigi-serial.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-serial.o `test -f 'rigcontrol/serial.cxx' || echo '$(srcdir)/'`rigcontrol/serial.cxx fldigi-serial.obj: rigcontrol/serial.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-serial.obj -MD -MP -MF $(DEPDIR)/fldigi-serial.Tpo -c -o fldigi-serial.obj `if test -f 'rigcontrol/serial.cxx'; then $(CYGPATH_W) 'rigcontrol/serial.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/serial.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-serial.Tpo $(DEPDIR)/fldigi-serial.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/serial.cxx' object='fldigi-serial.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-serial.obj `if test -f 'rigcontrol/serial.cxx'; then $(CYGPATH_W) 'rigcontrol/serial.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/serial.cxx'; fi` fldigi-rsid.o: rsid/rsid.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rsid.o -MD -MP -MF $(DEPDIR)/fldigi-rsid.Tpo -c -o fldigi-rsid.o `test -f 'rsid/rsid.cxx' || echo '$(srcdir)/'`rsid/rsid.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rsid.Tpo $(DEPDIR)/fldigi-rsid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rsid/rsid.cxx' object='fldigi-rsid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rsid.o `test -f 'rsid/rsid.cxx' || echo '$(srcdir)/'`rsid/rsid.cxx fldigi-rsid.obj: rsid/rsid.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rsid.obj -MD -MP -MF $(DEPDIR)/fldigi-rsid.Tpo -c -o fldigi-rsid.obj `if test -f 'rsid/rsid.cxx'; then $(CYGPATH_W) 'rsid/rsid.cxx'; else $(CYGPATH_W) '$(srcdir)/rsid/rsid.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rsid.Tpo $(DEPDIR)/fldigi-rsid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rsid/rsid.cxx' object='fldigi-rsid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rsid.obj `if test -f 'rsid/rsid.cxx'; then $(CYGPATH_W) 'rsid/rsid.cxx'; else $(CYGPATH_W) '$(srcdir)/rsid/rsid.cxx'; fi` fldigi-mixer.o: soundcard/mixer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-mixer.o -MD -MP -MF $(DEPDIR)/fldigi-mixer.Tpo -c -o fldigi-mixer.o `test -f 'soundcard/mixer.cxx' || echo '$(srcdir)/'`soundcard/mixer.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-mixer.Tpo $(DEPDIR)/fldigi-mixer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/mixer.cxx' object='fldigi-mixer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-mixer.o `test -f 'soundcard/mixer.cxx' || echo '$(srcdir)/'`soundcard/mixer.cxx fldigi-mixer.obj: soundcard/mixer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-mixer.obj -MD -MP -MF $(DEPDIR)/fldigi-mixer.Tpo -c -o fldigi-mixer.obj `if test -f 'soundcard/mixer.cxx'; then $(CYGPATH_W) 'soundcard/mixer.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/mixer.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-mixer.Tpo $(DEPDIR)/fldigi-mixer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/mixer.cxx' object='fldigi-mixer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-mixer.obj `if test -f 'soundcard/mixer.cxx'; then $(CYGPATH_W) 'soundcard/mixer.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/mixer.cxx'; fi` fldigi-sound.o: soundcard/sound.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-sound.o -MD -MP -MF $(DEPDIR)/fldigi-sound.Tpo -c -o fldigi-sound.o `test -f 'soundcard/sound.cxx' || echo '$(srcdir)/'`soundcard/sound.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-sound.Tpo $(DEPDIR)/fldigi-sound.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/sound.cxx' object='fldigi-sound.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-sound.o `test -f 'soundcard/sound.cxx' || echo '$(srcdir)/'`soundcard/sound.cxx fldigi-sound.obj: soundcard/sound.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-sound.obj -MD -MP -MF $(DEPDIR)/fldigi-sound.Tpo -c -o fldigi-sound.obj `if test -f 'soundcard/sound.cxx'; then $(CYGPATH_W) 'soundcard/sound.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/sound.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-sound.Tpo $(DEPDIR)/fldigi-sound.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/sound.cxx' object='fldigi-sound.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-sound.obj `if test -f 'soundcard/sound.cxx'; then $(CYGPATH_W) 'soundcard/sound.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/sound.cxx'; fi` fldigi-soundconf.o: soundcard/soundconf.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-soundconf.o -MD -MP -MF $(DEPDIR)/fldigi-soundconf.Tpo -c -o fldigi-soundconf.o `test -f 'soundcard/soundconf.cxx' || echo '$(srcdir)/'`soundcard/soundconf.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-soundconf.Tpo $(DEPDIR)/fldigi-soundconf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/soundconf.cxx' object='fldigi-soundconf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-soundconf.o `test -f 'soundcard/soundconf.cxx' || echo '$(srcdir)/'`soundcard/soundconf.cxx fldigi-soundconf.obj: soundcard/soundconf.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-soundconf.obj -MD -MP -MF $(DEPDIR)/fldigi-soundconf.Tpo -c -o fldigi-soundconf.obj `if test -f 'soundcard/soundconf.cxx'; then $(CYGPATH_W) 'soundcard/soundconf.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/soundconf.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-soundconf.Tpo $(DEPDIR)/fldigi-soundconf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/soundconf.cxx' object='fldigi-soundconf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-soundconf.obj `if test -f 'soundcard/soundconf.cxx'; then $(CYGPATH_W) 'soundcard/soundconf.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/soundconf.cxx'; fi` fldigi-notify.o: spot/notify.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-notify.o -MD -MP -MF $(DEPDIR)/fldigi-notify.Tpo -c -o fldigi-notify.o `test -f 'spot/notify.cxx' || echo '$(srcdir)/'`spot/notify.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-notify.Tpo $(DEPDIR)/fldigi-notify.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/notify.cxx' object='fldigi-notify.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-notify.o `test -f 'spot/notify.cxx' || echo '$(srcdir)/'`spot/notify.cxx fldigi-notify.obj: spot/notify.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-notify.obj -MD -MP -MF $(DEPDIR)/fldigi-notify.Tpo -c -o fldigi-notify.obj `if test -f 'spot/notify.cxx'; then $(CYGPATH_W) 'spot/notify.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/notify.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-notify.Tpo $(DEPDIR)/fldigi-notify.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/notify.cxx' object='fldigi-notify.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-notify.obj `if test -f 'spot/notify.cxx'; then $(CYGPATH_W) 'spot/notify.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/notify.cxx'; fi` fldigi-pskrep.o: spot/pskrep.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-pskrep.o -MD -MP -MF $(DEPDIR)/fldigi-pskrep.Tpo -c -o fldigi-pskrep.o `test -f 'spot/pskrep.cxx' || echo '$(srcdir)/'`spot/pskrep.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-pskrep.Tpo $(DEPDIR)/fldigi-pskrep.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/pskrep.cxx' object='fldigi-pskrep.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-pskrep.o `test -f 'spot/pskrep.cxx' || echo '$(srcdir)/'`spot/pskrep.cxx fldigi-pskrep.obj: spot/pskrep.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-pskrep.obj -MD -MP -MF $(DEPDIR)/fldigi-pskrep.Tpo -c -o fldigi-pskrep.obj `if test -f 'spot/pskrep.cxx'; then $(CYGPATH_W) 'spot/pskrep.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/pskrep.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-pskrep.Tpo $(DEPDIR)/fldigi-pskrep.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/pskrep.cxx' object='fldigi-pskrep.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-pskrep.obj `if test -f 'spot/pskrep.cxx'; then $(CYGPATH_W) 'spot/pskrep.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/pskrep.cxx'; fi` fldigi-spot.o: spot/spot.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-spot.o -MD -MP -MF $(DEPDIR)/fldigi-spot.Tpo -c -o fldigi-spot.o `test -f 'spot/spot.cxx' || echo '$(srcdir)/'`spot/spot.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-spot.Tpo $(DEPDIR)/fldigi-spot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/spot.cxx' object='fldigi-spot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-spot.o `test -f 'spot/spot.cxx' || echo '$(srcdir)/'`spot/spot.cxx fldigi-spot.obj: spot/spot.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-spot.obj -MD -MP -MF $(DEPDIR)/fldigi-spot.Tpo -c -o fldigi-spot.obj `if test -f 'spot/spot.cxx'; then $(CYGPATH_W) 'spot/spot.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/spot.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-spot.Tpo $(DEPDIR)/fldigi-spot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/spot.cxx' object='fldigi-spot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-spot.obj `if test -f 'spot/spot.cxx'; then $(CYGPATH_W) 'spot/spot.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/spot.cxx'; fi` fldigi-ssb.o: ssb/ssb.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-ssb.o -MD -MP -MF $(DEPDIR)/fldigi-ssb.Tpo -c -o fldigi-ssb.o `test -f 'ssb/ssb.cxx' || echo '$(srcdir)/'`ssb/ssb.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-ssb.Tpo $(DEPDIR)/fldigi-ssb.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ssb/ssb.cxx' object='fldigi-ssb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-ssb.o `test -f 'ssb/ssb.cxx' || echo '$(srcdir)/'`ssb/ssb.cxx fldigi-ssb.obj: ssb/ssb.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-ssb.obj -MD -MP -MF $(DEPDIR)/fldigi-ssb.Tpo -c -o fldigi-ssb.obj `if test -f 'ssb/ssb.cxx'; then $(CYGPATH_W) 'ssb/ssb.cxx'; else $(CYGPATH_W) '$(srcdir)/ssb/ssb.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-ssb.Tpo $(DEPDIR)/fldigi-ssb.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ssb/ssb.cxx' object='fldigi-ssb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-ssb.obj `if test -f 'ssb/ssb.cxx'; then $(CYGPATH_W) 'ssb/ssb.cxx'; else $(CYGPATH_W) '$(srcdir)/ssb/ssb.cxx'; fi` fldigi-synop.o: synop-src/synop.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-synop.o -MD -MP -MF $(DEPDIR)/fldigi-synop.Tpo -c -o fldigi-synop.o `test -f 'synop-src/synop.cxx' || echo '$(srcdir)/'`synop-src/synop.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-synop.Tpo $(DEPDIR)/fldigi-synop.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='synop-src/synop.cxx' object='fldigi-synop.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-synop.o `test -f 'synop-src/synop.cxx' || echo '$(srcdir)/'`synop-src/synop.cxx fldigi-synop.obj: synop-src/synop.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-synop.obj -MD -MP -MF $(DEPDIR)/fldigi-synop.Tpo -c -o fldigi-synop.obj `if test -f 'synop-src/synop.cxx'; then $(CYGPATH_W) 'synop-src/synop.cxx'; else $(CYGPATH_W) '$(srcdir)/synop-src/synop.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-synop.Tpo $(DEPDIR)/fldigi-synop.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='synop-src/synop.cxx' object='fldigi-synop.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-synop.obj `if test -f 'synop-src/synop.cxx'; then $(CYGPATH_W) 'synop-src/synop.cxx'; else $(CYGPATH_W) '$(srcdir)/synop-src/synop.cxx'; fi` fldigi-throb.o: throb/throb.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-throb.o -MD -MP -MF $(DEPDIR)/fldigi-throb.Tpo -c -o fldigi-throb.o `test -f 'throb/throb.cxx' || echo '$(srcdir)/'`throb/throb.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-throb.Tpo $(DEPDIR)/fldigi-throb.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='throb/throb.cxx' object='fldigi-throb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-throb.o `test -f 'throb/throb.cxx' || echo '$(srcdir)/'`throb/throb.cxx fldigi-throb.obj: throb/throb.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-throb.obj -MD -MP -MF $(DEPDIR)/fldigi-throb.Tpo -c -o fldigi-throb.obj `if test -f 'throb/throb.cxx'; then $(CYGPATH_W) 'throb/throb.cxx'; else $(CYGPATH_W) '$(srcdir)/throb/throb.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-throb.Tpo $(DEPDIR)/fldigi-throb.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='throb/throb.cxx' object='fldigi-throb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-throb.obj `if test -f 'throb/throb.cxx'; then $(CYGPATH_W) 'throb/throb.cxx'; else $(CYGPATH_W) '$(srcdir)/throb/throb.cxx'; fi` fldigi-modem.o: trx/modem.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-modem.o -MD -MP -MF $(DEPDIR)/fldigi-modem.Tpo -c -o fldigi-modem.o `test -f 'trx/modem.cxx' || echo '$(srcdir)/'`trx/modem.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-modem.Tpo $(DEPDIR)/fldigi-modem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/modem.cxx' object='fldigi-modem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-modem.o `test -f 'trx/modem.cxx' || echo '$(srcdir)/'`trx/modem.cxx fldigi-modem.obj: trx/modem.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-modem.obj -MD -MP -MF $(DEPDIR)/fldigi-modem.Tpo -c -o fldigi-modem.obj `if test -f 'trx/modem.cxx'; then $(CYGPATH_W) 'trx/modem.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/modem.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-modem.Tpo $(DEPDIR)/fldigi-modem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/modem.cxx' object='fldigi-modem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-modem.obj `if test -f 'trx/modem.cxx'; then $(CYGPATH_W) 'trx/modem.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/modem.cxx'; fi` fldigi-nullmodem.o: trx/nullmodem.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-nullmodem.o -MD -MP -MF $(DEPDIR)/fldigi-nullmodem.Tpo -c -o fldigi-nullmodem.o `test -f 'trx/nullmodem.cxx' || echo '$(srcdir)/'`trx/nullmodem.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-nullmodem.Tpo $(DEPDIR)/fldigi-nullmodem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/nullmodem.cxx' object='fldigi-nullmodem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-nullmodem.o `test -f 'trx/nullmodem.cxx' || echo '$(srcdir)/'`trx/nullmodem.cxx fldigi-nullmodem.obj: trx/nullmodem.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-nullmodem.obj -MD -MP -MF $(DEPDIR)/fldigi-nullmodem.Tpo -c -o fldigi-nullmodem.obj `if test -f 'trx/nullmodem.cxx'; then $(CYGPATH_W) 'trx/nullmodem.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/nullmodem.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-nullmodem.Tpo $(DEPDIR)/fldigi-nullmodem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/nullmodem.cxx' object='fldigi-nullmodem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-nullmodem.obj `if test -f 'trx/nullmodem.cxx'; then $(CYGPATH_W) 'trx/nullmodem.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/nullmodem.cxx'; fi` fldigi-trx.o: trx/trx.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-trx.o -MD -MP -MF $(DEPDIR)/fldigi-trx.Tpo -c -o fldigi-trx.o `test -f 'trx/trx.cxx' || echo '$(srcdir)/'`trx/trx.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-trx.Tpo $(DEPDIR)/fldigi-trx.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/trx.cxx' object='fldigi-trx.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-trx.o `test -f 'trx/trx.cxx' || echo '$(srcdir)/'`trx/trx.cxx fldigi-trx.obj: trx/trx.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-trx.obj -MD -MP -MF $(DEPDIR)/fldigi-trx.Tpo -c -o fldigi-trx.obj `if test -f 'trx/trx.cxx'; then $(CYGPATH_W) 'trx/trx.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/trx.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-trx.Tpo $(DEPDIR)/fldigi-trx.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/trx.cxx' object='fldigi-trx.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-trx.obj `if test -f 'trx/trx.cxx'; then $(CYGPATH_W) 'trx/trx.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/trx.cxx'; fi` fldigi-colorbox.o: waterfall/colorbox.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-colorbox.o -MD -MP -MF $(DEPDIR)/fldigi-colorbox.Tpo -c -o fldigi-colorbox.o `test -f 'waterfall/colorbox.cxx' || echo '$(srcdir)/'`waterfall/colorbox.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-colorbox.Tpo $(DEPDIR)/fldigi-colorbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/colorbox.cxx' object='fldigi-colorbox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-colorbox.o `test -f 'waterfall/colorbox.cxx' || echo '$(srcdir)/'`waterfall/colorbox.cxx fldigi-colorbox.obj: waterfall/colorbox.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-colorbox.obj -MD -MP -MF $(DEPDIR)/fldigi-colorbox.Tpo -c -o fldigi-colorbox.obj `if test -f 'waterfall/colorbox.cxx'; then $(CYGPATH_W) 'waterfall/colorbox.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/colorbox.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-colorbox.Tpo $(DEPDIR)/fldigi-colorbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/colorbox.cxx' object='fldigi-colorbox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-colorbox.obj `if test -f 'waterfall/colorbox.cxx'; then $(CYGPATH_W) 'waterfall/colorbox.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/colorbox.cxx'; fi` fldigi-digiscope.o: waterfall/digiscope.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-digiscope.o -MD -MP -MF $(DEPDIR)/fldigi-digiscope.Tpo -c -o fldigi-digiscope.o `test -f 'waterfall/digiscope.cxx' || echo '$(srcdir)/'`waterfall/digiscope.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-digiscope.Tpo $(DEPDIR)/fldigi-digiscope.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/digiscope.cxx' object='fldigi-digiscope.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-digiscope.o `test -f 'waterfall/digiscope.cxx' || echo '$(srcdir)/'`waterfall/digiscope.cxx fldigi-digiscope.obj: waterfall/digiscope.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-digiscope.obj -MD -MP -MF $(DEPDIR)/fldigi-digiscope.Tpo -c -o fldigi-digiscope.obj `if test -f 'waterfall/digiscope.cxx'; then $(CYGPATH_W) 'waterfall/digiscope.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/digiscope.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-digiscope.Tpo $(DEPDIR)/fldigi-digiscope.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/digiscope.cxx' object='fldigi-digiscope.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-digiscope.obj `if test -f 'waterfall/digiscope.cxx'; then $(CYGPATH_W) 'waterfall/digiscope.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/digiscope.cxx'; fi` fldigi-raster.o: waterfall/raster.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-raster.o -MD -MP -MF $(DEPDIR)/fldigi-raster.Tpo -c -o fldigi-raster.o `test -f 'waterfall/raster.cxx' || echo '$(srcdir)/'`waterfall/raster.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-raster.Tpo $(DEPDIR)/fldigi-raster.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/raster.cxx' object='fldigi-raster.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-raster.o `test -f 'waterfall/raster.cxx' || echo '$(srcdir)/'`waterfall/raster.cxx fldigi-raster.obj: waterfall/raster.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-raster.obj -MD -MP -MF $(DEPDIR)/fldigi-raster.Tpo -c -o fldigi-raster.obj `if test -f 'waterfall/raster.cxx'; then $(CYGPATH_W) 'waterfall/raster.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/raster.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-raster.Tpo $(DEPDIR)/fldigi-raster.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/raster.cxx' object='fldigi-raster.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-raster.obj `if test -f 'waterfall/raster.cxx'; then $(CYGPATH_W) 'waterfall/raster.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/raster.cxx'; fi` fldigi-waterfall.o: waterfall/waterfall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-waterfall.o -MD -MP -MF $(DEPDIR)/fldigi-waterfall.Tpo -c -o fldigi-waterfall.o `test -f 'waterfall/waterfall.cxx' || echo '$(srcdir)/'`waterfall/waterfall.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-waterfall.Tpo $(DEPDIR)/fldigi-waterfall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/waterfall.cxx' object='fldigi-waterfall.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-waterfall.o `test -f 'waterfall/waterfall.cxx' || echo '$(srcdir)/'`waterfall/waterfall.cxx fldigi-waterfall.obj: waterfall/waterfall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-waterfall.obj -MD -MP -MF $(DEPDIR)/fldigi-waterfall.Tpo -c -o fldigi-waterfall.obj `if test -f 'waterfall/waterfall.cxx'; then $(CYGPATH_W) 'waterfall/waterfall.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/waterfall.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-waterfall.Tpo $(DEPDIR)/fldigi-waterfall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/waterfall.cxx' object='fldigi-waterfall.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-waterfall.obj `if test -f 'waterfall/waterfall.cxx'; then $(CYGPATH_W) 'waterfall/waterfall.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/waterfall.cxx'; fi` fldigi-Fl_Text_Buffer_mod.o: widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Fl_Text_Buffer_mod.o -MD -MP -MF $(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Tpo -c -o fldigi-Fl_Text_Buffer_mod.o `test -f 'widgets/Fl_Text_Buffer_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Tpo $(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Buffer_mod.cxx' object='fldigi-Fl_Text_Buffer_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Fl_Text_Buffer_mod.o `test -f 'widgets/Fl_Text_Buffer_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Buffer_mod.cxx fldigi-Fl_Text_Buffer_mod.obj: widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Fl_Text_Buffer_mod.obj -MD -MP -MF $(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Tpo -c -o fldigi-Fl_Text_Buffer_mod.obj `if test -f 'widgets/Fl_Text_Buffer_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Buffer_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Buffer_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Tpo $(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Buffer_mod.cxx' object='fldigi-Fl_Text_Buffer_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Fl_Text_Buffer_mod.obj `if test -f 'widgets/Fl_Text_Buffer_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Buffer_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Buffer_mod.cxx'; fi` fldigi-Fl_Text_Display_mod.o: widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Fl_Text_Display_mod.o -MD -MP -MF $(DEPDIR)/fldigi-Fl_Text_Display_mod.Tpo -c -o fldigi-Fl_Text_Display_mod.o `test -f 'widgets/Fl_Text_Display_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Fl_Text_Display_mod.Tpo $(DEPDIR)/fldigi-Fl_Text_Display_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Display_mod.cxx' object='fldigi-Fl_Text_Display_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Fl_Text_Display_mod.o `test -f 'widgets/Fl_Text_Display_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Display_mod.cxx fldigi-Fl_Text_Display_mod.obj: widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Fl_Text_Display_mod.obj -MD -MP -MF $(DEPDIR)/fldigi-Fl_Text_Display_mod.Tpo -c -o fldigi-Fl_Text_Display_mod.obj `if test -f 'widgets/Fl_Text_Display_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Display_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Display_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Fl_Text_Display_mod.Tpo $(DEPDIR)/fldigi-Fl_Text_Display_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Display_mod.cxx' object='fldigi-Fl_Text_Display_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Fl_Text_Display_mod.obj `if test -f 'widgets/Fl_Text_Display_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Display_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Display_mod.cxx'; fi` fldigi-Fl_Text_Editor_mod.o: widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Fl_Text_Editor_mod.o -MD -MP -MF $(DEPDIR)/fldigi-Fl_Text_Editor_mod.Tpo -c -o fldigi-Fl_Text_Editor_mod.o `test -f 'widgets/Fl_Text_Editor_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Fl_Text_Editor_mod.Tpo $(DEPDIR)/fldigi-Fl_Text_Editor_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Editor_mod.cxx' object='fldigi-Fl_Text_Editor_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Fl_Text_Editor_mod.o `test -f 'widgets/Fl_Text_Editor_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Editor_mod.cxx fldigi-Fl_Text_Editor_mod.obj: widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Fl_Text_Editor_mod.obj -MD -MP -MF $(DEPDIR)/fldigi-Fl_Text_Editor_mod.Tpo -c -o fldigi-Fl_Text_Editor_mod.obj `if test -f 'widgets/Fl_Text_Editor_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Editor_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Editor_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Fl_Text_Editor_mod.Tpo $(DEPDIR)/fldigi-Fl_Text_Editor_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Editor_mod.cxx' object='fldigi-Fl_Text_Editor_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Fl_Text_Editor_mod.obj `if test -f 'widgets/Fl_Text_Editor_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Editor_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Editor_mod.cxx'; fi` fldigi-FTextView.o: widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FTextView.o -MD -MP -MF $(DEPDIR)/fldigi-FTextView.Tpo -c -o fldigi-FTextView.o `test -f 'widgets/FTextView.cxx' || echo '$(srcdir)/'`widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FTextView.Tpo $(DEPDIR)/fldigi-FTextView.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextView.cxx' object='fldigi-FTextView.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FTextView.o `test -f 'widgets/FTextView.cxx' || echo '$(srcdir)/'`widgets/FTextView.cxx fldigi-FTextView.obj: widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FTextView.obj -MD -MP -MF $(DEPDIR)/fldigi-FTextView.Tpo -c -o fldigi-FTextView.obj `if test -f 'widgets/FTextView.cxx'; then $(CYGPATH_W) 'widgets/FTextView.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextView.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FTextView.Tpo $(DEPDIR)/fldigi-FTextView.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextView.cxx' object='fldigi-FTextView.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FTextView.obj `if test -f 'widgets/FTextView.cxx'; then $(CYGPATH_W) 'widgets/FTextView.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextView.cxx'; fi` fldigi-FTextRXTX.o: widgets/FTextRXTX.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FTextRXTX.o -MD -MP -MF $(DEPDIR)/fldigi-FTextRXTX.Tpo -c -o fldigi-FTextRXTX.o `test -f 'widgets/FTextRXTX.cxx' || echo '$(srcdir)/'`widgets/FTextRXTX.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FTextRXTX.Tpo $(DEPDIR)/fldigi-FTextRXTX.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextRXTX.cxx' object='fldigi-FTextRXTX.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FTextRXTX.o `test -f 'widgets/FTextRXTX.cxx' || echo '$(srcdir)/'`widgets/FTextRXTX.cxx fldigi-FTextRXTX.obj: widgets/FTextRXTX.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FTextRXTX.obj -MD -MP -MF $(DEPDIR)/fldigi-FTextRXTX.Tpo -c -o fldigi-FTextRXTX.obj `if test -f 'widgets/FTextRXTX.cxx'; then $(CYGPATH_W) 'widgets/FTextRXTX.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextRXTX.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FTextRXTX.Tpo $(DEPDIR)/fldigi-FTextRXTX.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextRXTX.cxx' object='fldigi-FTextRXTX.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FTextRXTX.obj `if test -f 'widgets/FTextRXTX.cxx'; then $(CYGPATH_W) 'widgets/FTextRXTX.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextRXTX.cxx'; fi` fldigi-Panel.o: widgets/Panel.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Panel.o -MD -MP -MF $(DEPDIR)/fldigi-Panel.Tpo -c -o fldigi-Panel.o `test -f 'widgets/Panel.cxx' || echo '$(srcdir)/'`widgets/Panel.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Panel.Tpo $(DEPDIR)/fldigi-Panel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Panel.cxx' object='fldigi-Panel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Panel.o `test -f 'widgets/Panel.cxx' || echo '$(srcdir)/'`widgets/Panel.cxx fldigi-Panel.obj: widgets/Panel.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Panel.obj -MD -MP -MF $(DEPDIR)/fldigi-Panel.Tpo -c -o fldigi-Panel.obj `if test -f 'widgets/Panel.cxx'; then $(CYGPATH_W) 'widgets/Panel.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Panel.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Panel.Tpo $(DEPDIR)/fldigi-Panel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Panel.cxx' object='fldigi-Panel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Panel.obj `if test -f 'widgets/Panel.cxx'; then $(CYGPATH_W) 'widgets/Panel.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Panel.cxx'; fi` fldigi-flinput2.o: widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-flinput2.o -MD -MP -MF $(DEPDIR)/fldigi-flinput2.Tpo -c -o fldigi-flinput2.o `test -f 'widgets/flinput2.cxx' || echo '$(srcdir)/'`widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-flinput2.Tpo $(DEPDIR)/fldigi-flinput2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flinput2.cxx' object='fldigi-flinput2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-flinput2.o `test -f 'widgets/flinput2.cxx' || echo '$(srcdir)/'`widgets/flinput2.cxx fldigi-flinput2.obj: widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-flinput2.obj -MD -MP -MF $(DEPDIR)/fldigi-flinput2.Tpo -c -o fldigi-flinput2.obj `if test -f 'widgets/flinput2.cxx'; then $(CYGPATH_W) 'widgets/flinput2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flinput2.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-flinput2.Tpo $(DEPDIR)/fldigi-flinput2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flinput2.cxx' object='fldigi-flinput2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-flinput2.obj `if test -f 'widgets/flinput2.cxx'; then $(CYGPATH_W) 'widgets/flinput2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flinput2.cxx'; fi` fldigi-flmisc.o: widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-flmisc.o -MD -MP -MF $(DEPDIR)/fldigi-flmisc.Tpo -c -o fldigi-flmisc.o `test -f 'widgets/flmisc.cxx' || echo '$(srcdir)/'`widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-flmisc.Tpo $(DEPDIR)/fldigi-flmisc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flmisc.cxx' object='fldigi-flmisc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-flmisc.o `test -f 'widgets/flmisc.cxx' || echo '$(srcdir)/'`widgets/flmisc.cxx fldigi-flmisc.obj: widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-flmisc.obj -MD -MP -MF $(DEPDIR)/fldigi-flmisc.Tpo -c -o fldigi-flmisc.obj `if test -f 'widgets/flmisc.cxx'; then $(CYGPATH_W) 'widgets/flmisc.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flmisc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-flmisc.Tpo $(DEPDIR)/fldigi-flmisc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flmisc.cxx' object='fldigi-flmisc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-flmisc.obj `if test -f 'widgets/flmisc.cxx'; then $(CYGPATH_W) 'widgets/flmisc.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flmisc.cxx'; fi` fldigi-flslider2.o: widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-flslider2.o -MD -MP -MF $(DEPDIR)/fldigi-flslider2.Tpo -c -o fldigi-flslider2.o `test -f 'widgets/flslider2.cxx' || echo '$(srcdir)/'`widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-flslider2.Tpo $(DEPDIR)/fldigi-flslider2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flslider2.cxx' object='fldigi-flslider2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-flslider2.o `test -f 'widgets/flslider2.cxx' || echo '$(srcdir)/'`widgets/flslider2.cxx fldigi-flslider2.obj: widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-flslider2.obj -MD -MP -MF $(DEPDIR)/fldigi-flslider2.Tpo -c -o fldigi-flslider2.obj `if test -f 'widgets/flslider2.cxx'; then $(CYGPATH_W) 'widgets/flslider2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flslider2.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-flslider2.Tpo $(DEPDIR)/fldigi-flslider2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flslider2.cxx' object='fldigi-flslider2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-flslider2.obj `if test -f 'widgets/flslider2.cxx'; then $(CYGPATH_W) 'widgets/flslider2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flslider2.cxx'; fi` fldigi-picture.o: widgets/picture.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-picture.o -MD -MP -MF $(DEPDIR)/fldigi-picture.Tpo -c -o fldigi-picture.o `test -f 'widgets/picture.cxx' || echo '$(srcdir)/'`widgets/picture.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-picture.Tpo $(DEPDIR)/fldigi-picture.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/picture.cxx' object='fldigi-picture.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-picture.o `test -f 'widgets/picture.cxx' || echo '$(srcdir)/'`widgets/picture.cxx fldigi-picture.obj: widgets/picture.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-picture.obj -MD -MP -MF $(DEPDIR)/fldigi-picture.Tpo -c -o fldigi-picture.obj `if test -f 'widgets/picture.cxx'; then $(CYGPATH_W) 'widgets/picture.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/picture.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-picture.Tpo $(DEPDIR)/fldigi-picture.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/picture.cxx' object='fldigi-picture.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-picture.obj `if test -f 'widgets/picture.cxx'; then $(CYGPATH_W) 'widgets/picture.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/picture.cxx'; fi` fldigi-progress.o: widgets/progress.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-progress.o -MD -MP -MF $(DEPDIR)/fldigi-progress.Tpo -c -o fldigi-progress.o `test -f 'widgets/progress.cxx' || echo '$(srcdir)/'`widgets/progress.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-progress.Tpo $(DEPDIR)/fldigi-progress.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/progress.cxx' object='fldigi-progress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-progress.o `test -f 'widgets/progress.cxx' || echo '$(srcdir)/'`widgets/progress.cxx fldigi-progress.obj: widgets/progress.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-progress.obj -MD -MP -MF $(DEPDIR)/fldigi-progress.Tpo -c -o fldigi-progress.obj `if test -f 'widgets/progress.cxx'; then $(CYGPATH_W) 'widgets/progress.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/progress.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-progress.Tpo $(DEPDIR)/fldigi-progress.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/progress.cxx' object='fldigi-progress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-progress.obj `if test -f 'widgets/progress.cxx'; then $(CYGPATH_W) 'widgets/progress.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/progress.cxx'; fi` fldigi-psk_browser.o: widgets/psk_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-psk_browser.o -MD -MP -MF $(DEPDIR)/fldigi-psk_browser.Tpo -c -o fldigi-psk_browser.o `test -f 'widgets/psk_browser.cxx' || echo '$(srcdir)/'`widgets/psk_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-psk_browser.Tpo $(DEPDIR)/fldigi-psk_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/psk_browser.cxx' object='fldigi-psk_browser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-psk_browser.o `test -f 'widgets/psk_browser.cxx' || echo '$(srcdir)/'`widgets/psk_browser.cxx fldigi-psk_browser.obj: widgets/psk_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-psk_browser.obj -MD -MP -MF $(DEPDIR)/fldigi-psk_browser.Tpo -c -o fldigi-psk_browser.obj `if test -f 'widgets/psk_browser.cxx'; then $(CYGPATH_W) 'widgets/psk_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/psk_browser.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-psk_browser.Tpo $(DEPDIR)/fldigi-psk_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/psk_browser.cxx' object='fldigi-psk_browser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-psk_browser.obj `if test -f 'widgets/psk_browser.cxx'; then $(CYGPATH_W) 'widgets/psk_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/psk_browser.cxx'; fi` fldigi-analysis.o: wwv/analysis.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-analysis.o -MD -MP -MF $(DEPDIR)/fldigi-analysis.Tpo -c -o fldigi-analysis.o `test -f 'wwv/analysis.cxx' || echo '$(srcdir)/'`wwv/analysis.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-analysis.Tpo $(DEPDIR)/fldigi-analysis.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wwv/analysis.cxx' object='fldigi-analysis.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-analysis.o `test -f 'wwv/analysis.cxx' || echo '$(srcdir)/'`wwv/analysis.cxx fldigi-analysis.obj: wwv/analysis.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-analysis.obj -MD -MP -MF $(DEPDIR)/fldigi-analysis.Tpo -c -o fldigi-analysis.obj `if test -f 'wwv/analysis.cxx'; then $(CYGPATH_W) 'wwv/analysis.cxx'; else $(CYGPATH_W) '$(srcdir)/wwv/analysis.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-analysis.Tpo $(DEPDIR)/fldigi-analysis.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wwv/analysis.cxx' object='fldigi-analysis.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-analysis.obj `if test -f 'wwv/analysis.cxx'; then $(CYGPATH_W) 'wwv/analysis.cxx'; else $(CYGPATH_W) '$(srcdir)/wwv/analysis.cxx'; fi` fldigi-wwv.o: wwv/wwv.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-wwv.o -MD -MP -MF $(DEPDIR)/fldigi-wwv.Tpo -c -o fldigi-wwv.o `test -f 'wwv/wwv.cxx' || echo '$(srcdir)/'`wwv/wwv.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-wwv.Tpo $(DEPDIR)/fldigi-wwv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wwv/wwv.cxx' object='fldigi-wwv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-wwv.o `test -f 'wwv/wwv.cxx' || echo '$(srcdir)/'`wwv/wwv.cxx fldigi-wwv.obj: wwv/wwv.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-wwv.obj -MD -MP -MF $(DEPDIR)/fldigi-wwv.Tpo -c -o fldigi-wwv.obj `if test -f 'wwv/wwv.cxx'; then $(CYGPATH_W) 'wwv/wwv.cxx'; else $(CYGPATH_W) '$(srcdir)/wwv/wwv.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-wwv.Tpo $(DEPDIR)/fldigi-wwv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wwv/wwv.cxx' object='fldigi-wwv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-wwv.obj `if test -f 'wwv/wwv.cxx'; then $(CYGPATH_W) 'wwv/wwv.cxx'; else $(CYGPATH_W) '$(srcdir)/wwv/wwv.cxx'; fi` fldigi-xmlrpc_log.o: logbook/xmlrpc_log.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-xmlrpc_log.o -MD -MP -MF $(DEPDIR)/fldigi-xmlrpc_log.Tpo -c -o fldigi-xmlrpc_log.o `test -f 'logbook/xmlrpc_log.cxx' || echo '$(srcdir)/'`logbook/xmlrpc_log.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-xmlrpc_log.Tpo $(DEPDIR)/fldigi-xmlrpc_log.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/xmlrpc_log.cxx' object='fldigi-xmlrpc_log.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-xmlrpc_log.o `test -f 'logbook/xmlrpc_log.cxx' || echo '$(srcdir)/'`logbook/xmlrpc_log.cxx fldigi-xmlrpc_log.obj: logbook/xmlrpc_log.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-xmlrpc_log.obj -MD -MP -MF $(DEPDIR)/fldigi-xmlrpc_log.Tpo -c -o fldigi-xmlrpc_log.obj `if test -f 'logbook/xmlrpc_log.cxx'; then $(CYGPATH_W) 'logbook/xmlrpc_log.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/xmlrpc_log.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-xmlrpc_log.Tpo $(DEPDIR)/fldigi-xmlrpc_log.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/xmlrpc_log.cxx' object='fldigi-xmlrpc_log.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-xmlrpc_log.obj `if test -f 'logbook/xmlrpc_log.cxx'; then $(CYGPATH_W) 'logbook/xmlrpc_log.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/xmlrpc_log.cxx'; fi` fldigi-XmlRpcClient.o: xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcClient.o -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcClient.Tpo -c -o fldigi-XmlRpcClient.o `test -f 'xmlrpcpp/XmlRpcClient.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcClient.Tpo $(DEPDIR)/fldigi-XmlRpcClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcClient.cpp' object='fldigi-XmlRpcClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcClient.o `test -f 'xmlrpcpp/XmlRpcClient.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcClient.cpp fldigi-XmlRpcClient.obj: xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcClient.obj -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcClient.Tpo -c -o fldigi-XmlRpcClient.obj `if test -f 'xmlrpcpp/XmlRpcClient.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcClient.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcClient.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcClient.Tpo $(DEPDIR)/fldigi-XmlRpcClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcClient.cpp' object='fldigi-XmlRpcClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcClient.obj `if test -f 'xmlrpcpp/XmlRpcClient.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcClient.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcClient.cpp'; fi` fldigi-XmlRpcDispatch.o: xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcDispatch.o -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcDispatch.Tpo -c -o fldigi-XmlRpcDispatch.o `test -f 'xmlrpcpp/XmlRpcDispatch.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcDispatch.Tpo $(DEPDIR)/fldigi-XmlRpcDispatch.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcDispatch.cpp' object='fldigi-XmlRpcDispatch.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcDispatch.o `test -f 'xmlrpcpp/XmlRpcDispatch.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcDispatch.cpp fldigi-XmlRpcDispatch.obj: xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcDispatch.obj -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcDispatch.Tpo -c -o fldigi-XmlRpcDispatch.obj `if test -f 'xmlrpcpp/XmlRpcDispatch.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcDispatch.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcDispatch.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcDispatch.Tpo $(DEPDIR)/fldigi-XmlRpcDispatch.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcDispatch.cpp' object='fldigi-XmlRpcDispatch.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcDispatch.obj `if test -f 'xmlrpcpp/XmlRpcDispatch.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcDispatch.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcDispatch.cpp'; fi` fldigi-XmlRpcMutex.o: xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcMutex.o -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcMutex.Tpo -c -o fldigi-XmlRpcMutex.o `test -f 'xmlrpcpp/XmlRpcMutex.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcMutex.Tpo $(DEPDIR)/fldigi-XmlRpcMutex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcMutex.cpp' object='fldigi-XmlRpcMutex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcMutex.o `test -f 'xmlrpcpp/XmlRpcMutex.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcMutex.cpp fldigi-XmlRpcMutex.obj: xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcMutex.obj -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcMutex.Tpo -c -o fldigi-XmlRpcMutex.obj `if test -f 'xmlrpcpp/XmlRpcMutex.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcMutex.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcMutex.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcMutex.Tpo $(DEPDIR)/fldigi-XmlRpcMutex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcMutex.cpp' object='fldigi-XmlRpcMutex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcMutex.obj `if test -f 'xmlrpcpp/XmlRpcMutex.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcMutex.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcMutex.cpp'; fi` fldigi-XmlRpcServer.o: xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcServer.o -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcServer.Tpo -c -o fldigi-XmlRpcServer.o `test -f 'xmlrpcpp/XmlRpcServer.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcServer.Tpo $(DEPDIR)/fldigi-XmlRpcServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServer.cpp' object='fldigi-XmlRpcServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcServer.o `test -f 'xmlrpcpp/XmlRpcServer.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServer.cpp fldigi-XmlRpcServer.obj: xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcServer.obj -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcServer.Tpo -c -o fldigi-XmlRpcServer.obj `if test -f 'xmlrpcpp/XmlRpcServer.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServer.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcServer.Tpo $(DEPDIR)/fldigi-XmlRpcServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServer.cpp' object='fldigi-XmlRpcServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcServer.obj `if test -f 'xmlrpcpp/XmlRpcServer.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServer.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServer.cpp'; fi` fldigi-XmlRpcServerConnection.o: xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcServerConnection.o -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcServerConnection.Tpo -c -o fldigi-XmlRpcServerConnection.o `test -f 'xmlrpcpp/XmlRpcServerConnection.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcServerConnection.Tpo $(DEPDIR)/fldigi-XmlRpcServerConnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerConnection.cpp' object='fldigi-XmlRpcServerConnection.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcServerConnection.o `test -f 'xmlrpcpp/XmlRpcServerConnection.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerConnection.cpp fldigi-XmlRpcServerConnection.obj: xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcServerConnection.obj -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcServerConnection.Tpo -c -o fldigi-XmlRpcServerConnection.obj `if test -f 'xmlrpcpp/XmlRpcServerConnection.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerConnection.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerConnection.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcServerConnection.Tpo $(DEPDIR)/fldigi-XmlRpcServerConnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerConnection.cpp' object='fldigi-XmlRpcServerConnection.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcServerConnection.obj `if test -f 'xmlrpcpp/XmlRpcServerConnection.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerConnection.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerConnection.cpp'; fi` fldigi-XmlRpcServerMethod.o: xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcServerMethod.o -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcServerMethod.Tpo -c -o fldigi-XmlRpcServerMethod.o `test -f 'xmlrpcpp/XmlRpcServerMethod.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcServerMethod.Tpo $(DEPDIR)/fldigi-XmlRpcServerMethod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerMethod.cpp' object='fldigi-XmlRpcServerMethod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcServerMethod.o `test -f 'xmlrpcpp/XmlRpcServerMethod.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerMethod.cpp fldigi-XmlRpcServerMethod.obj: xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcServerMethod.obj -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcServerMethod.Tpo -c -o fldigi-XmlRpcServerMethod.obj `if test -f 'xmlrpcpp/XmlRpcServerMethod.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerMethod.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerMethod.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcServerMethod.Tpo $(DEPDIR)/fldigi-XmlRpcServerMethod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerMethod.cpp' object='fldigi-XmlRpcServerMethod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcServerMethod.obj `if test -f 'xmlrpcpp/XmlRpcServerMethod.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerMethod.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerMethod.cpp'; fi` fldigi-XmlRpcSocket.o: xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcSocket.o -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcSocket.Tpo -c -o fldigi-XmlRpcSocket.o `test -f 'xmlrpcpp/XmlRpcSocket.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcSocket.Tpo $(DEPDIR)/fldigi-XmlRpcSocket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSocket.cpp' object='fldigi-XmlRpcSocket.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcSocket.o `test -f 'xmlrpcpp/XmlRpcSocket.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSocket.cpp fldigi-XmlRpcSocket.obj: xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcSocket.obj -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcSocket.Tpo -c -o fldigi-XmlRpcSocket.obj `if test -f 'xmlrpcpp/XmlRpcSocket.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSocket.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcSocket.Tpo $(DEPDIR)/fldigi-XmlRpcSocket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSocket.cpp' object='fldigi-XmlRpcSocket.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcSocket.obj `if test -f 'xmlrpcpp/XmlRpcSocket.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSocket.cpp'; fi` fldigi-XmlRpcSource.o: xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcSource.o -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcSource.Tpo -c -o fldigi-XmlRpcSource.o `test -f 'xmlrpcpp/XmlRpcSource.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcSource.Tpo $(DEPDIR)/fldigi-XmlRpcSource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSource.cpp' object='fldigi-XmlRpcSource.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcSource.o `test -f 'xmlrpcpp/XmlRpcSource.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSource.cpp fldigi-XmlRpcSource.obj: xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcSource.obj -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcSource.Tpo -c -o fldigi-XmlRpcSource.obj `if test -f 'xmlrpcpp/XmlRpcSource.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSource.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSource.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcSource.Tpo $(DEPDIR)/fldigi-XmlRpcSource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSource.cpp' object='fldigi-XmlRpcSource.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcSource.obj `if test -f 'xmlrpcpp/XmlRpcSource.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSource.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSource.cpp'; fi` fldigi-XmlRpcThread.o: xmlrpcpp/XmlRpcThread.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcThread.o -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcThread.Tpo -c -o fldigi-XmlRpcThread.o `test -f 'xmlrpcpp/XmlRpcThread.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcThread.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcThread.Tpo $(DEPDIR)/fldigi-XmlRpcThread.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcThread.cpp' object='fldigi-XmlRpcThread.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcThread.o `test -f 'xmlrpcpp/XmlRpcThread.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcThread.cpp fldigi-XmlRpcThread.obj: xmlrpcpp/XmlRpcThread.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcThread.obj -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcThread.Tpo -c -o fldigi-XmlRpcThread.obj `if test -f 'xmlrpcpp/XmlRpcThread.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcThread.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcThread.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcThread.Tpo $(DEPDIR)/fldigi-XmlRpcThread.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcThread.cpp' object='fldigi-XmlRpcThread.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcThread.obj `if test -f 'xmlrpcpp/XmlRpcThread.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcThread.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcThread.cpp'; fi` fldigi-XmlRpcThreadedServer.o: xmlrpcpp/XmlRpcThreadedServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcThreadedServer.o -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcThreadedServer.Tpo -c -o fldigi-XmlRpcThreadedServer.o `test -f 'xmlrpcpp/XmlRpcThreadedServer.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcThreadedServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcThreadedServer.Tpo $(DEPDIR)/fldigi-XmlRpcThreadedServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcThreadedServer.cpp' object='fldigi-XmlRpcThreadedServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcThreadedServer.o `test -f 'xmlrpcpp/XmlRpcThreadedServer.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcThreadedServer.cpp fldigi-XmlRpcThreadedServer.obj: xmlrpcpp/XmlRpcThreadedServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcThreadedServer.obj -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcThreadedServer.Tpo -c -o fldigi-XmlRpcThreadedServer.obj `if test -f 'xmlrpcpp/XmlRpcThreadedServer.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcThreadedServer.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcThreadedServer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcThreadedServer.Tpo $(DEPDIR)/fldigi-XmlRpcThreadedServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcThreadedServer.cpp' object='fldigi-XmlRpcThreadedServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcThreadedServer.obj `if test -f 'xmlrpcpp/XmlRpcThreadedServer.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcThreadedServer.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcThreadedServer.cpp'; fi` fldigi-XmlRpcUtil.o: xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcUtil.o -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcUtil.Tpo -c -o fldigi-XmlRpcUtil.o `test -f 'xmlrpcpp/XmlRpcUtil.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcUtil.Tpo $(DEPDIR)/fldigi-XmlRpcUtil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcUtil.cpp' object='fldigi-XmlRpcUtil.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcUtil.o `test -f 'xmlrpcpp/XmlRpcUtil.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcUtil.cpp fldigi-XmlRpcUtil.obj: xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcUtil.obj -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcUtil.Tpo -c -o fldigi-XmlRpcUtil.obj `if test -f 'xmlrpcpp/XmlRpcUtil.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcUtil.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcUtil.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcUtil.Tpo $(DEPDIR)/fldigi-XmlRpcUtil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcUtil.cpp' object='fldigi-XmlRpcUtil.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcUtil.obj `if test -f 'xmlrpcpp/XmlRpcUtil.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcUtil.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcUtil.cpp'; fi` fldigi-XmlRpcValue.o: xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcValue.o -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcValue.Tpo -c -o fldigi-XmlRpcValue.o `test -f 'xmlrpcpp/XmlRpcValue.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcValue.Tpo $(DEPDIR)/fldigi-XmlRpcValue.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcValue.cpp' object='fldigi-XmlRpcValue.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcValue.o `test -f 'xmlrpcpp/XmlRpcValue.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcValue.cpp fldigi-XmlRpcValue.obj: xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-XmlRpcValue.obj -MD -MP -MF $(DEPDIR)/fldigi-XmlRpcValue.Tpo -c -o fldigi-XmlRpcValue.obj `if test -f 'xmlrpcpp/XmlRpcValue.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcValue.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcValue.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-XmlRpcValue.Tpo $(DEPDIR)/fldigi-XmlRpcValue.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcValue.cpp' object='fldigi-XmlRpcValue.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-XmlRpcValue.obj `if test -f 'xmlrpcpp/XmlRpcValue.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcValue.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcValue.cpp'; fi` fldigi-blank.o: blank/blank.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-blank.o -MD -MP -MF $(DEPDIR)/fldigi-blank.Tpo -c -o fldigi-blank.o `test -f 'blank/blank.cxx' || echo '$(srcdir)/'`blank/blank.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-blank.Tpo $(DEPDIR)/fldigi-blank.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='blank/blank.cxx' object='fldigi-blank.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-blank.o `test -f 'blank/blank.cxx' || echo '$(srcdir)/'`blank/blank.cxx fldigi-blank.obj: blank/blank.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-blank.obj -MD -MP -MF $(DEPDIR)/fldigi-blank.Tpo -c -o fldigi-blank.obj `if test -f 'blank/blank.cxx'; then $(CYGPATH_W) 'blank/blank.cxx'; else $(CYGPATH_W) '$(srcdir)/blank/blank.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-blank.Tpo $(DEPDIR)/fldigi-blank.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='blank/blank.cxx' object='fldigi-blank.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-blank.obj `if test -f 'blank/blank.cxx'; then $(CYGPATH_W) 'blank/blank.cxx'; else $(CYGPATH_W) '$(srcdir)/blank/blank.cxx'; fi` fldigi-flnfc_common.o: fileselector/flnfc_common.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-flnfc_common.o -MD -MP -MF $(DEPDIR)/fldigi-flnfc_common.Tpo -c -o fldigi-flnfc_common.o `test -f 'fileselector/flnfc_common.cxx' || echo '$(srcdir)/'`fileselector/flnfc_common.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-flnfc_common.Tpo $(DEPDIR)/fldigi-flnfc_common.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/flnfc_common.cxx' object='fldigi-flnfc_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-flnfc_common.o `test -f 'fileselector/flnfc_common.cxx' || echo '$(srcdir)/'`fileselector/flnfc_common.cxx fldigi-flnfc_common.obj: fileselector/flnfc_common.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-flnfc_common.obj -MD -MP -MF $(DEPDIR)/fldigi-flnfc_common.Tpo -c -o fldigi-flnfc_common.obj `if test -f 'fileselector/flnfc_common.cxx'; then $(CYGPATH_W) 'fileselector/flnfc_common.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/flnfc_common.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-flnfc_common.Tpo $(DEPDIR)/fldigi-flnfc_common.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/flnfc_common.cxx' object='fldigi-flnfc_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-flnfc_common.obj `if test -f 'fileselector/flnfc_common.cxx'; then $(CYGPATH_W) 'fileselector/flnfc_common.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/flnfc_common.cxx'; fi` fldigi-Feld7x7-14.o: feld/Feld7x7-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Feld7x7-14.o -MD -MP -MF $(DEPDIR)/fldigi-Feld7x7-14.Tpo -c -o fldigi-Feld7x7-14.o `test -f 'feld/Feld7x7-14.cxx' || echo '$(srcdir)/'`feld/Feld7x7-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Feld7x7-14.Tpo $(DEPDIR)/fldigi-Feld7x7-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/Feld7x7-14.cxx' object='fldigi-Feld7x7-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Feld7x7-14.o `test -f 'feld/Feld7x7-14.cxx' || echo '$(srcdir)/'`feld/Feld7x7-14.cxx fldigi-Feld7x7-14.obj: feld/Feld7x7-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Feld7x7-14.obj -MD -MP -MF $(DEPDIR)/fldigi-Feld7x7-14.Tpo -c -o fldigi-Feld7x7-14.obj `if test -f 'feld/Feld7x7-14.cxx'; then $(CYGPATH_W) 'feld/Feld7x7-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/Feld7x7-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Feld7x7-14.Tpo $(DEPDIR)/fldigi-Feld7x7-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/Feld7x7-14.cxx' object='fldigi-Feld7x7-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Feld7x7-14.obj `if test -f 'feld/Feld7x7-14.cxx'; then $(CYGPATH_W) 'feld/Feld7x7-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/Feld7x7-14.cxx'; fi` fldigi-Feld7x7n-14.o: feld/Feld7x7n-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Feld7x7n-14.o -MD -MP -MF $(DEPDIR)/fldigi-Feld7x7n-14.Tpo -c -o fldigi-Feld7x7n-14.o `test -f 'feld/Feld7x7n-14.cxx' || echo '$(srcdir)/'`feld/Feld7x7n-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Feld7x7n-14.Tpo $(DEPDIR)/fldigi-Feld7x7n-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/Feld7x7n-14.cxx' object='fldigi-Feld7x7n-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Feld7x7n-14.o `test -f 'feld/Feld7x7n-14.cxx' || echo '$(srcdir)/'`feld/Feld7x7n-14.cxx fldigi-Feld7x7n-14.obj: feld/Feld7x7n-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-Feld7x7n-14.obj -MD -MP -MF $(DEPDIR)/fldigi-Feld7x7n-14.Tpo -c -o fldigi-Feld7x7n-14.obj `if test -f 'feld/Feld7x7n-14.cxx'; then $(CYGPATH_W) 'feld/Feld7x7n-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/Feld7x7n-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-Feld7x7n-14.Tpo $(DEPDIR)/fldigi-Feld7x7n-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/Feld7x7n-14.cxx' object='fldigi-Feld7x7n-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-Feld7x7n-14.obj `if test -f 'feld/Feld7x7n-14.cxx'; then $(CYGPATH_W) 'feld/Feld7x7n-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/Feld7x7n-14.cxx'; fi` fldigi-FeldDx-14.o: feld/FeldDx-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldDx-14.o -MD -MP -MF $(DEPDIR)/fldigi-FeldDx-14.Tpo -c -o fldigi-FeldDx-14.o `test -f 'feld/FeldDx-14.cxx' || echo '$(srcdir)/'`feld/FeldDx-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldDx-14.Tpo $(DEPDIR)/fldigi-FeldDx-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldDx-14.cxx' object='fldigi-FeldDx-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldDx-14.o `test -f 'feld/FeldDx-14.cxx' || echo '$(srcdir)/'`feld/FeldDx-14.cxx fldigi-FeldDx-14.obj: feld/FeldDx-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldDx-14.obj -MD -MP -MF $(DEPDIR)/fldigi-FeldDx-14.Tpo -c -o fldigi-FeldDx-14.obj `if test -f 'feld/FeldDx-14.cxx'; then $(CYGPATH_W) 'feld/FeldDx-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldDx-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldDx-14.Tpo $(DEPDIR)/fldigi-FeldDx-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldDx-14.cxx' object='fldigi-FeldDx-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldDx-14.obj `if test -f 'feld/FeldDx-14.cxx'; then $(CYGPATH_W) 'feld/FeldDx-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldDx-14.cxx'; fi` fldigi-FeldFat-14.o: feld/FeldFat-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldFat-14.o -MD -MP -MF $(DEPDIR)/fldigi-FeldFat-14.Tpo -c -o fldigi-FeldFat-14.o `test -f 'feld/FeldFat-14.cxx' || echo '$(srcdir)/'`feld/FeldFat-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldFat-14.Tpo $(DEPDIR)/fldigi-FeldFat-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldFat-14.cxx' object='fldigi-FeldFat-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldFat-14.o `test -f 'feld/FeldFat-14.cxx' || echo '$(srcdir)/'`feld/FeldFat-14.cxx fldigi-FeldFat-14.obj: feld/FeldFat-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldFat-14.obj -MD -MP -MF $(DEPDIR)/fldigi-FeldFat-14.Tpo -c -o fldigi-FeldFat-14.obj `if test -f 'feld/FeldFat-14.cxx'; then $(CYGPATH_W) 'feld/FeldFat-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldFat-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldFat-14.Tpo $(DEPDIR)/fldigi-FeldFat-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldFat-14.cxx' object='fldigi-FeldFat-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldFat-14.obj `if test -f 'feld/FeldFat-14.cxx'; then $(CYGPATH_W) 'feld/FeldFat-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldFat-14.cxx'; fi` fldigi-FeldHell-12.o: feld/FeldHell-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldHell-12.o -MD -MP -MF $(DEPDIR)/fldigi-FeldHell-12.Tpo -c -o fldigi-FeldHell-12.o `test -f 'feld/FeldHell-12.cxx' || echo '$(srcdir)/'`feld/FeldHell-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldHell-12.Tpo $(DEPDIR)/fldigi-FeldHell-12.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldHell-12.cxx' object='fldigi-FeldHell-12.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldHell-12.o `test -f 'feld/FeldHell-12.cxx' || echo '$(srcdir)/'`feld/FeldHell-12.cxx fldigi-FeldHell-12.obj: feld/FeldHell-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldHell-12.obj -MD -MP -MF $(DEPDIR)/fldigi-FeldHell-12.Tpo -c -o fldigi-FeldHell-12.obj `if test -f 'feld/FeldHell-12.cxx'; then $(CYGPATH_W) 'feld/FeldHell-12.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldHell-12.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldHell-12.Tpo $(DEPDIR)/fldigi-FeldHell-12.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldHell-12.cxx' object='fldigi-FeldHell-12.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldHell-12.obj `if test -f 'feld/FeldHell-12.cxx'; then $(CYGPATH_W) 'feld/FeldHell-12.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldHell-12.cxx'; fi` fldigi-FeldLittle-12.o: feld/FeldLittle-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldLittle-12.o -MD -MP -MF $(DEPDIR)/fldigi-FeldLittle-12.Tpo -c -o fldigi-FeldLittle-12.o `test -f 'feld/FeldLittle-12.cxx' || echo '$(srcdir)/'`feld/FeldLittle-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldLittle-12.Tpo $(DEPDIR)/fldigi-FeldLittle-12.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLittle-12.cxx' object='fldigi-FeldLittle-12.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldLittle-12.o `test -f 'feld/FeldLittle-12.cxx' || echo '$(srcdir)/'`feld/FeldLittle-12.cxx fldigi-FeldLittle-12.obj: feld/FeldLittle-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldLittle-12.obj -MD -MP -MF $(DEPDIR)/fldigi-FeldLittle-12.Tpo -c -o fldigi-FeldLittle-12.obj `if test -f 'feld/FeldLittle-12.cxx'; then $(CYGPATH_W) 'feld/FeldLittle-12.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLittle-12.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldLittle-12.Tpo $(DEPDIR)/fldigi-FeldLittle-12.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLittle-12.cxx' object='fldigi-FeldLittle-12.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldLittle-12.obj `if test -f 'feld/FeldLittle-12.cxx'; then $(CYGPATH_W) 'feld/FeldLittle-12.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLittle-12.cxx'; fi` fldigi-FeldLo8-14.o: feld/FeldLo8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldLo8-14.o -MD -MP -MF $(DEPDIR)/fldigi-FeldLo8-14.Tpo -c -o fldigi-FeldLo8-14.o `test -f 'feld/FeldLo8-14.cxx' || echo '$(srcdir)/'`feld/FeldLo8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldLo8-14.Tpo $(DEPDIR)/fldigi-FeldLo8-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLo8-14.cxx' object='fldigi-FeldLo8-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldLo8-14.o `test -f 'feld/FeldLo8-14.cxx' || echo '$(srcdir)/'`feld/FeldLo8-14.cxx fldigi-FeldLo8-14.obj: feld/FeldLo8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldLo8-14.obj -MD -MP -MF $(DEPDIR)/fldigi-FeldLo8-14.Tpo -c -o fldigi-FeldLo8-14.obj `if test -f 'feld/FeldLo8-14.cxx'; then $(CYGPATH_W) 'feld/FeldLo8-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLo8-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldLo8-14.Tpo $(DEPDIR)/fldigi-FeldLo8-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLo8-14.cxx' object='fldigi-FeldLo8-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldLo8-14.obj `if test -f 'feld/FeldLo8-14.cxx'; then $(CYGPATH_W) 'feld/FeldLo8-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLo8-14.cxx'; fi` fldigi-FeldLow-14.o: feld/FeldLow-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldLow-14.o -MD -MP -MF $(DEPDIR)/fldigi-FeldLow-14.Tpo -c -o fldigi-FeldLow-14.o `test -f 'feld/FeldLow-14.cxx' || echo '$(srcdir)/'`feld/FeldLow-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldLow-14.Tpo $(DEPDIR)/fldigi-FeldLow-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLow-14.cxx' object='fldigi-FeldLow-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldLow-14.o `test -f 'feld/FeldLow-14.cxx' || echo '$(srcdir)/'`feld/FeldLow-14.cxx fldigi-FeldLow-14.obj: feld/FeldLow-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldLow-14.obj -MD -MP -MF $(DEPDIR)/fldigi-FeldLow-14.Tpo -c -o fldigi-FeldLow-14.obj `if test -f 'feld/FeldLow-14.cxx'; then $(CYGPATH_W) 'feld/FeldLow-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLow-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldLow-14.Tpo $(DEPDIR)/fldigi-FeldLow-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLow-14.cxx' object='fldigi-FeldLow-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldLow-14.obj `if test -f 'feld/FeldLow-14.cxx'; then $(CYGPATH_W) 'feld/FeldLow-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLow-14.cxx'; fi` fldigi-FeldModern-14.o: feld/FeldModern-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldModern-14.o -MD -MP -MF $(DEPDIR)/fldigi-FeldModern-14.Tpo -c -o fldigi-FeldModern-14.o `test -f 'feld/FeldModern-14.cxx' || echo '$(srcdir)/'`feld/FeldModern-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldModern-14.Tpo $(DEPDIR)/fldigi-FeldModern-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldModern-14.cxx' object='fldigi-FeldModern-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldModern-14.o `test -f 'feld/FeldModern-14.cxx' || echo '$(srcdir)/'`feld/FeldModern-14.cxx fldigi-FeldModern-14.obj: feld/FeldModern-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldModern-14.obj -MD -MP -MF $(DEPDIR)/fldigi-FeldModern-14.Tpo -c -o fldigi-FeldModern-14.obj `if test -f 'feld/FeldModern-14.cxx'; then $(CYGPATH_W) 'feld/FeldModern-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldModern-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldModern-14.Tpo $(DEPDIR)/fldigi-FeldModern-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldModern-14.cxx' object='fldigi-FeldModern-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldModern-14.obj `if test -f 'feld/FeldModern-14.cxx'; then $(CYGPATH_W) 'feld/FeldModern-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldModern-14.cxx'; fi` fldigi-FeldModern8-14.o: feld/FeldModern8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldModern8-14.o -MD -MP -MF $(DEPDIR)/fldigi-FeldModern8-14.Tpo -c -o fldigi-FeldModern8-14.o `test -f 'feld/FeldModern8-14.cxx' || echo '$(srcdir)/'`feld/FeldModern8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldModern8-14.Tpo $(DEPDIR)/fldigi-FeldModern8-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldModern8-14.cxx' object='fldigi-FeldModern8-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldModern8-14.o `test -f 'feld/FeldModern8-14.cxx' || echo '$(srcdir)/'`feld/FeldModern8-14.cxx fldigi-FeldModern8-14.obj: feld/FeldModern8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldModern8-14.obj -MD -MP -MF $(DEPDIR)/fldigi-FeldModern8-14.Tpo -c -o fldigi-FeldModern8-14.obj `if test -f 'feld/FeldModern8-14.cxx'; then $(CYGPATH_W) 'feld/FeldModern8-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldModern8-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldModern8-14.Tpo $(DEPDIR)/fldigi-FeldModern8-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldModern8-14.cxx' object='fldigi-FeldModern8-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldModern8-14.obj `if test -f 'feld/FeldModern8-14.cxx'; then $(CYGPATH_W) 'feld/FeldModern8-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldModern8-14.cxx'; fi` fldigi-FeldNarr-14.o: feld/FeldNarr-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldNarr-14.o -MD -MP -MF $(DEPDIR)/fldigi-FeldNarr-14.Tpo -c -o fldigi-FeldNarr-14.o `test -f 'feld/FeldNarr-14.cxx' || echo '$(srcdir)/'`feld/FeldNarr-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldNarr-14.Tpo $(DEPDIR)/fldigi-FeldNarr-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldNarr-14.cxx' object='fldigi-FeldNarr-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldNarr-14.o `test -f 'feld/FeldNarr-14.cxx' || echo '$(srcdir)/'`feld/FeldNarr-14.cxx fldigi-FeldNarr-14.obj: feld/FeldNarr-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldNarr-14.obj -MD -MP -MF $(DEPDIR)/fldigi-FeldNarr-14.Tpo -c -o fldigi-FeldNarr-14.obj `if test -f 'feld/FeldNarr-14.cxx'; then $(CYGPATH_W) 'feld/FeldNarr-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldNarr-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldNarr-14.Tpo $(DEPDIR)/fldigi-FeldNarr-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldNarr-14.cxx' object='fldigi-FeldNarr-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldNarr-14.obj `if test -f 'feld/FeldNarr-14.cxx'; then $(CYGPATH_W) 'feld/FeldNarr-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldNarr-14.cxx'; fi` fldigi-FeldReal-14.o: feld/FeldReal-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldReal-14.o -MD -MP -MF $(DEPDIR)/fldigi-FeldReal-14.Tpo -c -o fldigi-FeldReal-14.o `test -f 'feld/FeldReal-14.cxx' || echo '$(srcdir)/'`feld/FeldReal-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldReal-14.Tpo $(DEPDIR)/fldigi-FeldReal-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldReal-14.cxx' object='fldigi-FeldReal-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldReal-14.o `test -f 'feld/FeldReal-14.cxx' || echo '$(srcdir)/'`feld/FeldReal-14.cxx fldigi-FeldReal-14.obj: feld/FeldReal-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldReal-14.obj -MD -MP -MF $(DEPDIR)/fldigi-FeldReal-14.Tpo -c -o fldigi-FeldReal-14.obj `if test -f 'feld/FeldReal-14.cxx'; then $(CYGPATH_W) 'feld/FeldReal-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldReal-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldReal-14.Tpo $(DEPDIR)/fldigi-FeldReal-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldReal-14.cxx' object='fldigi-FeldReal-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldReal-14.obj `if test -f 'feld/FeldReal-14.cxx'; then $(CYGPATH_W) 'feld/FeldReal-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldReal-14.cxx'; fi` fldigi-FeldStyl-14.o: feld/FeldStyl-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldStyl-14.o -MD -MP -MF $(DEPDIR)/fldigi-FeldStyl-14.Tpo -c -o fldigi-FeldStyl-14.o `test -f 'feld/FeldStyl-14.cxx' || echo '$(srcdir)/'`feld/FeldStyl-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldStyl-14.Tpo $(DEPDIR)/fldigi-FeldStyl-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldStyl-14.cxx' object='fldigi-FeldStyl-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldStyl-14.o `test -f 'feld/FeldStyl-14.cxx' || echo '$(srcdir)/'`feld/FeldStyl-14.cxx fldigi-FeldStyl-14.obj: feld/FeldStyl-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldStyl-14.obj -MD -MP -MF $(DEPDIR)/fldigi-FeldStyl-14.Tpo -c -o fldigi-FeldStyl-14.obj `if test -f 'feld/FeldStyl-14.cxx'; then $(CYGPATH_W) 'feld/FeldStyl-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldStyl-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldStyl-14.Tpo $(DEPDIR)/fldigi-FeldStyl-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldStyl-14.cxx' object='fldigi-FeldStyl-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldStyl-14.obj `if test -f 'feld/FeldStyl-14.cxx'; then $(CYGPATH_W) 'feld/FeldStyl-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldStyl-14.cxx'; fi` fldigi-FeldVert-14.o: feld/FeldVert-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldVert-14.o -MD -MP -MF $(DEPDIR)/fldigi-FeldVert-14.Tpo -c -o fldigi-FeldVert-14.o `test -f 'feld/FeldVert-14.cxx' || echo '$(srcdir)/'`feld/FeldVert-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldVert-14.Tpo $(DEPDIR)/fldigi-FeldVert-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldVert-14.cxx' object='fldigi-FeldVert-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldVert-14.o `test -f 'feld/FeldVert-14.cxx' || echo '$(srcdir)/'`feld/FeldVert-14.cxx fldigi-FeldVert-14.obj: feld/FeldVert-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldVert-14.obj -MD -MP -MF $(DEPDIR)/fldigi-FeldVert-14.Tpo -c -o fldigi-FeldVert-14.obj `if test -f 'feld/FeldVert-14.cxx'; then $(CYGPATH_W) 'feld/FeldVert-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldVert-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldVert-14.Tpo $(DEPDIR)/fldigi-FeldVert-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldVert-14.cxx' object='fldigi-FeldVert-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldVert-14.obj `if test -f 'feld/FeldVert-14.cxx'; then $(CYGPATH_W) 'feld/FeldVert-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldVert-14.cxx'; fi` fldigi-FeldWide-14.o: feld/FeldWide-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldWide-14.o -MD -MP -MF $(DEPDIR)/fldigi-FeldWide-14.Tpo -c -o fldigi-FeldWide-14.o `test -f 'feld/FeldWide-14.cxx' || echo '$(srcdir)/'`feld/FeldWide-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldWide-14.Tpo $(DEPDIR)/fldigi-FeldWide-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldWide-14.cxx' object='fldigi-FeldWide-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldWide-14.o `test -f 'feld/FeldWide-14.cxx' || echo '$(srcdir)/'`feld/FeldWide-14.cxx fldigi-FeldWide-14.obj: feld/FeldWide-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-FeldWide-14.obj -MD -MP -MF $(DEPDIR)/fldigi-FeldWide-14.Tpo -c -o fldigi-FeldWide-14.obj `if test -f 'feld/FeldWide-14.cxx'; then $(CYGPATH_W) 'feld/FeldWide-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldWide-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-FeldWide-14.Tpo $(DEPDIR)/fldigi-FeldWide-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldWide-14.cxx' object='fldigi-FeldWide-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-FeldWide-14.obj `if test -f 'feld/FeldWide-14.cxx'; then $(CYGPATH_W) 'feld/FeldWide-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldWide-14.cxx'; fi` fldigi-mfsk-pic.o: mfsk/mfsk-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-mfsk-pic.o -MD -MP -MF $(DEPDIR)/fldigi-mfsk-pic.Tpo -c -o fldigi-mfsk-pic.o `test -f 'mfsk/mfsk-pic.cxx' || echo '$(srcdir)/'`mfsk/mfsk-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-mfsk-pic.Tpo $(DEPDIR)/fldigi-mfsk-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfsk-pic.cxx' object='fldigi-mfsk-pic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-mfsk-pic.o `test -f 'mfsk/mfsk-pic.cxx' || echo '$(srcdir)/'`mfsk/mfsk-pic.cxx fldigi-mfsk-pic.obj: mfsk/mfsk-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-mfsk-pic.obj -MD -MP -MF $(DEPDIR)/fldigi-mfsk-pic.Tpo -c -o fldigi-mfsk-pic.obj `if test -f 'mfsk/mfsk-pic.cxx'; then $(CYGPATH_W) 'mfsk/mfsk-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfsk-pic.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-mfsk-pic.Tpo $(DEPDIR)/fldigi-mfsk-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfsk-pic.cxx' object='fldigi-mfsk-pic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-mfsk-pic.obj `if test -f 'mfsk/mfsk-pic.cxx'; then $(CYGPATH_W) 'mfsk/mfsk-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfsk-pic.cxx'; fi` fldigi-rsid_defs.o: rsid/rsid_defs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rsid_defs.o -MD -MP -MF $(DEPDIR)/fldigi-rsid_defs.Tpo -c -o fldigi-rsid_defs.o `test -f 'rsid/rsid_defs.cxx' || echo '$(srcdir)/'`rsid/rsid_defs.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rsid_defs.Tpo $(DEPDIR)/fldigi-rsid_defs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rsid/rsid_defs.cxx' object='fldigi-rsid_defs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rsid_defs.o `test -f 'rsid/rsid_defs.cxx' || echo '$(srcdir)/'`rsid/rsid_defs.cxx fldigi-rsid_defs.obj: rsid/rsid_defs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-rsid_defs.obj -MD -MP -MF $(DEPDIR)/fldigi-rsid_defs.Tpo -c -o fldigi-rsid_defs.obj `if test -f 'rsid/rsid_defs.cxx'; then $(CYGPATH_W) 'rsid/rsid_defs.cxx'; else $(CYGPATH_W) '$(srcdir)/rsid/rsid_defs.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-rsid_defs.Tpo $(DEPDIR)/fldigi-rsid_defs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rsid/rsid_defs.cxx' object='fldigi-rsid_defs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-rsid_defs.obj `if test -f 'rsid/rsid_defs.cxx'; then $(CYGPATH_W) 'rsid/rsid_defs.cxx'; else $(CYGPATH_W) '$(srcdir)/rsid/rsid_defs.cxx'; fi` fldigi-tune.o: trx/tune.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-tune.o -MD -MP -MF $(DEPDIR)/fldigi-tune.Tpo -c -o fldigi-tune.o `test -f 'trx/tune.cxx' || echo '$(srcdir)/'`trx/tune.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-tune.Tpo $(DEPDIR)/fldigi-tune.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/tune.cxx' object='fldigi-tune.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-tune.o `test -f 'trx/tune.cxx' || echo '$(srcdir)/'`trx/tune.cxx fldigi-tune.obj: trx/tune.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-tune.obj -MD -MP -MF $(DEPDIR)/fldigi-tune.Tpo -c -o fldigi-tune.obj `if test -f 'trx/tune.cxx'; then $(CYGPATH_W) 'trx/tune.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/tune.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-tune.Tpo $(DEPDIR)/fldigi-tune.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/tune.cxx' object='fldigi-tune.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-tune.obj `if test -f 'trx/tune.cxx'; then $(CYGPATH_W) 'trx/tune.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/tune.cxx'; fi` fldigi-guide.o: dialogs/guide.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-guide.o -MD -MP -MF $(DEPDIR)/fldigi-guide.Tpo -c -o fldigi-guide.o `test -f 'dialogs/guide.cxx' || echo '$(srcdir)/'`dialogs/guide.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-guide.Tpo $(DEPDIR)/fldigi-guide.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/guide.cxx' object='fldigi-guide.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-guide.o `test -f 'dialogs/guide.cxx' || echo '$(srcdir)/'`dialogs/guide.cxx fldigi-guide.obj: dialogs/guide.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-guide.obj -MD -MP -MF $(DEPDIR)/fldigi-guide.Tpo -c -o fldigi-guide.obj `if test -f 'dialogs/guide.cxx'; then $(CYGPATH_W) 'dialogs/guide.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/guide.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-guide.Tpo $(DEPDIR)/fldigi-guide.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/guide.cxx' object='fldigi-guide.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-guide.obj `if test -f 'dialogs/guide.cxx'; then $(CYGPATH_W) 'dialogs/guide.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/guide.cxx'; fi` .cxx.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cxx.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ col="$$grn"; \ else \ col="$$red"; \ fi; \ echo "$${col}$$dashes$${std}"; \ echo "$${col}$$banner$${std}"; \ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ test -z "$$report" || echo "$${col}$$report$${std}"; \ echo "$${col}$$dashes$${std}"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(PROGRAMS) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f flarq-src/$(DEPDIR)/$(am__dirstamp) -rm -f flarq-src/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) @HAVE_ASCIIDOC_FALSE@distclean-local: clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-local mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-local distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-data-local install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-exec-local install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: installcheck-binPROGRAMS maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-local .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ check-am ctags-recursive install install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-TESTS check-am clean clean-binPROGRAMS \ clean-generic clean-local ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-hdr \ distclean-local distclean-tags distdir dvi dvi-am html html-am \ info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-data-local install-dvi \ install-dvi-am install-exec install-exec-am install-exec-local \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installcheck-binPROGRAMS installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-local # Define the custom silent rule function @SILENT_CMDS@ .EXPORT_ALL_VARIABLES: appbundle nsisinst hamlib-static @HAVE_WINDRES_TRUE@@WIN32_TRUE@.rc.o: @HAVE_WINDRES_TRUE@@WIN32_TRUE@ $(call silent,WRES ,$@)$(WINDRES) -DRC_BUILD_TIME=\\\"$(shell date +%s)\\\" -I$(srcdir) -I$(srcdir)/include -I$(srcdir)/../data/win32 $< -O coff $@ install-exec-local: @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../scripts/fldigi-shell; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(bindir); \ @WANT_FLDIGI_TRUE@ $(INSTALL_SCRIPT) $(srcdir)/../scripts/fldigi-shell $(DESTDIR)/$(bindir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../scripts/ftp_kml_files.sh; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(bindir); \ @WANT_FLDIGI_TRUE@ $(INSTALL_SCRIPT) $(srcdir)/../scripts/ftp_kml_files.sh $(DESTDIR)/$(bindir); \ @WANT_FLDIGI_TRUE@ fi # TODO: xpm files should probably go to $(datadir)/pixmaps/fldigi instead of $(datadir)/pixmaps install-data-local: @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/fldigi.xpm; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/pixmaps; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/fldigi.xpm $(DESTDIR)/$(datadir)/pixmaps; \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/fldigi.desktop; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/applications; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/fldigi.desktop $(DESTDIR)/$(datadir)/applications; \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/NAVTEX_Stations.csv; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/NAVTEX_Stations.csv $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/nsd_bbsss.txt; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/nsd_bbsss.txt $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/station_table.txt; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/station_table.txt $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/ToR-Stats-SHIP.csv; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/ToR-Stats-SHIP.csv $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/wmo_list.txt; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/wmo_list.txt $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../kml/styles.kml; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(pkgdatadir)/kml; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../kml/styles.kml $(DESTDIR)/$(pkgdatadir)/kml; \ @WANT_FLDIGI_TRUE@ fi @WANT_FLARQ_TRUE@ if test -f $(srcdir)/../data/flarq.xpm; then \ @WANT_FLARQ_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/pixmaps; \ @WANT_FLARQ_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/flarq.xpm $(DESTDIR)/$(datadir)/pixmaps; \ @WANT_FLARQ_TRUE@ fi @WANT_FLARQ_TRUE@ if test -f $(srcdir)/../data/flarq.desktop; then \ @WANT_FLARQ_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/applications; \ @WANT_FLARQ_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/flarq.desktop $(DESTDIR)/$(datadir)/applications; \ @WANT_FLARQ_TRUE@ fi uninstall-local: @WANT_FLDIGI_TRUE@ rm -f $(DESTDIR)$(bindir)/fldigi-shell @WANT_FLDIGI_TRUE@ rm -f $(DESTDIR)/$(datadir)/pixmaps/fldigi.xpm @WANT_FLDIGI_TRUE@ rm -f $(DESTDIR)/$(datadir)/applications/fldigi.desktop @WANT_FLDIGI_TRUE@ rm -fr $(DESTDIR)/$(datadir)/fldigi @WANT_FLARQ_TRUE@ rm -f $(DESTDIR)/$(datadir)/pixmaps/flarq.xpm @WANT_FLARQ_TRUE@ rm -f $(DESTDIR)/$(datadir)/applications/flarq.desktop @HAVE_FLUID_TRUE@flgen: $(FLDIGI_FL_SRC) $(FLARQ_FL_SRC) @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ $(call silent,FLUID ,$(FLDIGI_FL_SRC))(cd $(srcdir)/include; \ @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ for f in $(FLDIGI_FL_SRC); do \ @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ c=$${f%.fl}.cxx; h=$${f%.fl}.h; h=$${h##*/}; \ @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ $(FLUID) -c -o ../$$c -h $$h ../$$f; \ @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ done) @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ $(call silent,FLUID ,$(FLARQ_FL_SRC))(cd $(srcdir)/flarq-src/include; \ @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ for f in $(FLARQ_FL_SRC); do \ @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ c=$${f%.fl}.cxx; h=$${f%.fl}.h; h=$${h##*/}; \ @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ $(FLUID) -c -o ../../$$c -h $$h ../../$$f; \ @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ done) @DARWIN_TRUE@appbundle: $(bin_PROGRAMS) @DARWIN_TRUE@ $(call silent,APPB ,$(APPBUNDLE_NOLIBS) $(APPBUNDLE))sh $(srcdir)/../scripts/mkappbundle.sh "$(srcdir)/../data" . @HAVE_NSIS_TRUE@nsisinst: $(bin_PROGRAMS) @HAVE_NSIS_TRUE@ $(call silent,NSIS ,$(INSTALLER_FILE))sh $(srcdir)/../scripts/mknsisinst.sh "$(srcdir)/../data" . @ENABLE_HAMLIB_TRUE@@WANT_FLDIGI_TRUE@hamlib-static: $(fldigi_OBJECTS) @ENABLE_HAMLIB_TRUE@@WANT_FLDIGI_TRUE@ $(call silent,HLS ,fldigi$(EXEEXT))sh $(srcdir)/../scripts/mkhamlibstatic.sh fldigi @HAVE_ASCIIDOC_TRUE@$(builddir)/../doc/guide.html: $(builddir)/../doc/guide.txt @HAVE_ASCIIDOC_TRUE@ @$(MAKE) -C $(builddir)/../doc $(AM_MAKEFLAGS) guide.html @HAVE_ASCIIDOC_TRUE@$(builddir)/dialogs/guide.cxx: $(builddir)/../doc/guide.html @HAVE_ASCIIDOC_TRUE@ @mkdir -p $(builddir)/dialogs @HAVE_ASCIIDOC_TRUE@ $(call silent,GUIDE ,$@)sed 's/\\/\\\\/g; s/"/\\"/g; s/$$/\\n\\/g; 1 s/.*/const char* szBeginner = "&/; $$ s/.*/&n";/' $< > $@ @HAVE_ASCIIDOC_TRUE@dialogs/htmlstrings.cxx: $(builddir)/dialogs/guide.cxx @HAVE_ASCIIDOC_TRUE@distclean-local: @HAVE_ASCIIDOC_TRUE@ @if test "$(builddir)" != "$(srcdir)"; then \ @HAVE_ASCIIDOC_TRUE@ rm -f $(builddir)/dialogs/guide.cxx; \ @HAVE_ASCIIDOC_TRUE@ fi clean-local: -rm -rf $(CLEAN_LOCAL) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fldigi-3.21.80/src/contestia/0000775000175000017500000000000012313333725012710 500000000000000fldigi-3.21.80/src/contestia/contestia.cxx0000664000175000017500000002100012313064025015330 00000000000000// ---------------------------------------------------------------------------- // contestia.cxx -- CONTESTIA modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // Copyright (C) 2005 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "contestia.h" #include "modem.h" #include "fl_digi.h" #include "misc.h" #include "confdialog.h" #include "status.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_MODEM); using namespace std; double contestia::nco(double freq) { preamblephase += 2.0 * M_PI * freq / samplerate; if (preamblephase > M_PI) preamblephase -= 2.0 * M_PI; return cos(preamblephase); } void contestia::tx_init(SoundBase *sc) { scard = sc; phaseacc = 0; prevsymbol = cmplx (1.0, 0.0); preamble = 32; shreg = 0; preamblesent = 0; postamblesent = 0; txbasefreq = get_txfreq_woffset(); rx_flush(); if (reverse) { Tx->FirstCarrierMultiplier = (txbasefreq + (Tx->Bandwidth / 2)) / 500; Tx->Reverse = 1; } else { Tx->FirstCarrierMultiplier = (txbasefreq - (Tx->Bandwidth / 2)) / 500; Tx->Reverse = 0; } videoText(); Tx->Preset(); Tx->Start(); escape = 0; } void contestia::rx_flush() { unsigned char c; Rx->Flush(); while (Rx->GetChar(c) > 0) put_rx_char(c); } void contestia::send_tones() { double freqa, freqb; tone_bw = bandwidth; tone_midfreq = txbasefreq; if (reverse) { freqa = tone_midfreq + (tone_bw / 2.0); freqb = tone_midfreq - (tone_bw / 2.0); } else { freqa = tone_midfreq - (tone_bw / 2.0); freqb = tone_midfreq + (tone_bw / 2.0); } preamblephase = 0; for (int i = 0; i < SR4; i++) tonebuff[2*SR4 + i] = tonebuff[i] = nco(freqa) * ampshape[i]; preamblephase = 0; for (int i = 0; i < SR4; i++) tonebuff[3*SR4 + i] = tonebuff[SR4 + i] = nco(freqb) * ampshape[i]; for (int j = 0; j < TONE_DURATION; j += SCBLOCKSIZE) ModulateXmtr(&tonebuff[j], SCBLOCKSIZE); } void contestia::rx_init() { Rx->Reset(); escape = 0; } int contestia::unescape(int c) { if (progdefaults.contestia8bit == 0) return c; if (escape) { escape = 0; return c + 128; } if (c == 127) { escape = 1; return -1; } return c; } int contestia::tx_process() { int c = 0, len = 0; unsigned char ch; if (tones != progdefaults.contestiatones || bw != progdefaults.contestiabw || smargin != progdefaults.contestiasmargin || sinteg != progdefaults.contestiasinteg ) restart(); if (preamblesent != 1) { send_tones(); preamblesent = 1; // Olivia Transmitter class requires at least character Tx->PutChar(0); } // The encoder works with BitsPerSymbol length blocks. If the // modem already has that many characters buffered, don't try // to read any more. If stopflag is set, we will always read // whatever there is. if (stopflag || (Tx->GetReadReady() < Tx->BitsPerSymbol)) { if (!stopflag && (c = get_tx_char()) == GET_TX_CHAR_ETX) stopflag = true; if (stopflag) Tx->Stop(); else { if (c == GET_TX_CHAR_NODATA) c = 0; /* Replace un-representable characters with a dot */ if (c > (progdefaults.contestia8bit ? 255 : 127)) c = '.'; if (c > 127) { c &= 127; Tx->PutChar(127); } Tx->PutChar(c); } } if (Tx->GetChar(ch) > 0) if ((c = unescape(ch)) != -1) put_echo_char(progdefaults.rx_lowercase ? tolower(c) : toupper(c)); if ((len = Tx->Output(txfbuffer)) > 0) ModulateXmtr(txfbuffer, len); if (stopflag && Tx->DoPostambleYet() == 1 && postamblesent != 1) { postamblesent = 1; send_tones(); } if (!Tx->Running()) { cwid(); stopflag = false; return -1; } return 0; } int contestia::rx_process(const double *buf, int len) { int c; unsigned char ch = 0; static double snr = 1e-3; static char msg1[20]; static char msg2[20]; if (tones != progdefaults.contestiatones || bw != progdefaults.contestiabw || smargin != progdefaults.contestiasmargin || sinteg != progdefaults.contestiasinteg ) restart(); if ((lastfreq != frequency || Rx->Reverse) && !reverse) { Rx->FirstCarrierMultiplier = (frequency - (Rx->Bandwidth / 2)) / 500; Rx->Reverse = 0; lastfreq = frequency; Rx->Preset(); } else if ((lastfreq != frequency || !Rx->Reverse) && reverse) { Rx->FirstCarrierMultiplier = (frequency + (Rx->Bandwidth / 2)) / 500; Rx->Reverse = 1; lastfreq = frequency; Rx->Preset(); } Rx->SyncThreshold = progStatus.sqlonoff ? clamp(progStatus.sldrSquelchValue / 5.0 + 3.0, 3.0, 90.0) : 3.0; Rx->Process(buf, len); sp = 0; for (int i = frequency - Rx->Bandwidth/2; i < frequency - 1 + Rx->Bandwidth/2; i++) if (wf->Pwr(i) > sp) sp = wf->Pwr(i); np = wf->Pwr(frequency + Rx->Bandwidth/2 + 2*Rx->Bandwidth/Rx->Tones); if (np == 0) np = sp + 1e-8; sigpwr = decayavg( sigpwr, sp, 10); noisepwr = decayavg( noisepwr, np, 50); snr = CLAMP(sigpwr / noisepwr, 0.001, 100000); metric = clamp( 5.0 * (Rx->SignalToNoiseRatio() - 3.0), 0, 100); display_metric(metric); bool gotchar = false; while (Rx->GetChar(ch) > 0) { if ((c = unescape(ch)) != -1 && c > 7) { put_rx_char(progdefaults.rx_lowercase ? tolower(c) : c); gotchar = true; } } if (gotchar) { snprintf(msg1, sizeof(msg1), "s/n: %4.1f dB", 10*log10(snr) - 20); put_Status1(msg1, 5, STATUS_CLEAR); snprintf(msg2, sizeof(msg2), "f/o %+4.1f Hz", Rx->FrequencyOffset()); put_Status2(msg2, 5, STATUS_CLEAR); } return 0; } void contestia::restart() { tones = progdefaults.contestiatones; bw = progdefaults.contestiabw; smargin = progdefaults.contestiasmargin; sinteg = progdefaults.contestiasinteg; samplerate = 8000; bandwidth = 125 * (1 << bw); Tx->Tones = 2 * (1 << tones); Tx->Bandwidth = bandwidth; Tx->SampleRate = samplerate; Tx->OutputSampleRate = samplerate; txbasefreq = get_txfreq_woffset(); Tx->bContestia = true; if (reverse) { Tx->FirstCarrierMultiplier = (txbasefreq + (Tx->Bandwidth / 2)) / 500; Tx->Reverse = 1; } else { Tx->FirstCarrierMultiplier = (txbasefreq - (Tx->Bandwidth / 2)) / 500; Tx->Reverse = 0; } if (Tx->Preset() < 0) { LOG_ERROR("contestia: transmitter preset failed!"); return; } txbufferlen = Tx->MaxOutputLen; if (txfbuffer) delete [] txfbuffer; txfbuffer = new double[txbufferlen]; Rx->Tones = Tx->Tones; Rx->Bandwidth = bandwidth; Rx->SyncMargin = smargin; Rx->SyncIntegLen = sinteg; Rx->SyncThreshold = progStatus.sqlonoff ? clamp(progStatus.sldrSquelchValue / 5.0 + 3.0, 0, 90.0) : 0.0; Rx->SampleRate = samplerate; Rx->InputSampleRate = samplerate; Rx->bContestia = true; if (reverse) { Rx->FirstCarrierMultiplier = (frequency + (Rx->Bandwidth / 2)) / 500; Rx->Reverse = 1; } else { Rx->FirstCarrierMultiplier = (frequency - (Rx->Bandwidth /2)) / 500; Rx->Reverse = 0; } if (Rx->Preset() < 0) { LOG_ERROR("contestia: receiver preset failed!"); return; } fragmentsize = 1024; set_bandwidth(Tx->Bandwidth - Tx->Bandwidth / Tx->Tones); put_MODEstatus("%s %" PRIuSZ "/%" PRIuSZ "", get_mode_name(), Tx->Tones, Tx->Bandwidth); metric = 0; sigpwr = 1e-10; noisepwr = 1e-8; LOG_DEBUG("\nContestia Rx parameters:\n%s", Rx->PrintParameters()); } void contestia::init() { restart(); modem::init(); set_scope_mode(Digiscope::BLANK); } contestia::contestia() { cap |= CAP_REV; txfbuffer = 0; samplerate = 8000; Tx = new MFSK_Transmitter< double >; Rx = new MFSK_Receiver< double >; Tx->bContestia = true; Rx->bContestia = true; mode = MODE_CONTESTIA; lastfreq = 0; for (int i = 0; i < SR4; i++) ampshape[i] = 1.0; for (int i = 0; i < SR4 / 8; i++) ampshape[i] = ampshape[SR4 - 1 - i] = 0.5 * (1.0 - cos(M_PI * i / (SR4/8))); for (int i = 0; i < TONE_DURATION; i++) tonebuff[i] = 0; tone_bw = -1; tone_midfreq = -1; } contestia::~contestia() { if (Tx) delete Tx; if (Rx) delete Rx; if (txfbuffer) delete [] txfbuffer; } fldigi-3.21.80/src/spot/0000775000175000017500000000000012313333726011705 500000000000000fldigi-3.21.80/src/spot/pskrep.cxx0000664000175000017500000006374412313301270013660 00000000000000// ---------------------------------------------------------------------------- // pskrep.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This is a client for N1DQ's PSK Automatic Propagation Reporter // (see http://pskreporter.info/). Philip Gladstone, N1DQ, is // thanked for his helpful explanation of the protocol. // // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #if HAVE_SYS_UTSNAME_H # include #endif #include #if HAVE_ARPA_INET_H # include #endif #include #include #include #include #include #include #include #include #if __clang__ # define MAP_TYPE std::unordered_map #define HASH_TYPE std::hash # include #elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) # define MAP_TYPE std::tr1::unordered_map #define HASH_TYPE std::tr1::hash # include #else // use the non-standard gnu hash_map on gcc <= 4.0.x, // which has a broken tr1::unordered_map::operator= # define MAP_TYPE __gnu_cxx::hash_map #define HASH_TYPE __gnu_cxx::hash # include namespace __gnu_cxx { // define the missing hash specialisation for std::string // using the 'const char*' hash function template<> struct hash { size_t operator()(const std::string& s) const { return __stl_hash_string(s.c_str()); } }; } #endif #include #include "socket.h" #include "re.h" #include "debug.h" #include "util.h" #include "trx.h" #include "fl_digi.h" #include "main.h" #include "configuration.h" #include "globals.h" #include "spot.h" #include "pskrep.h" LOG_FILE_SOURCE(debug::LOG_SPOTTER); // ------------------------------------------------------------------------------------------------- // Try to flush the report queue every SEND_INTERVAL seconds. #define SEND_INTERVAL 300 // Ignore reports that are less than DUP_INTERVAL seconds older than // a previously sent report for the same callsign and frequency band. // Sent reports are also garbage-collected after DUP_INTERVAL seconds. #define DUP_INTERVAL 1800 // The first TEMPLATE_THRESHOLD packets will contain the long templates; // the next TEMPLATE_THRESHOLD packets will include the short templates #define TEMPLATE_THRESHOLD 3 // Resend short templates every TEMPLATE_INTERVAL seconds #define TEMPLATE_INTERVAL 1800 // Maximum send size #define DGRAM_MAX (1500-14-24-8) #define PSKREP_QUEUE_FILE "pskrqueue.txt" #define PSKREP_ID_FILE "pskrkey.txt" // ------------------------------------------------------------------------------------------------- using namespace std; enum status_t { PSKR_STATUS_NEW, PSKR_STATUS_PENDING, PSKR_STATUS_SENT }; enum rtype_t { PSKREP_AUTO = 1, PSKREP_LOG = 2, PSKREP_MANUAL = 3 }; struct rcpt_report_t { rcpt_report_t(trx_mode m = 0, long long f = 0, time_t t = 0, rtype_t p = PSKREP_AUTO, string loc = "") : mode(m), freq(f), rtime(t), rtype(p), status(PSKR_STATUS_NEW), locator(loc) { } trx_mode mode; long long freq; time_t rtime; rtype_t rtype; status_t status; string locator; }; // A band_map_t holds a list of reception reports (for a particular callsign and band) typedef deque band_map_t; // A call_map_t holds reception reports for a particular callsign typedef MAP_TYPE > call_map_t; // A container of this type holds all reception reports, sorted by callsign and band typedef MAP_TYPE queue_t; class pskrep_sender { public: pskrep_sender(const string& call, const string& loc, const string& ant, const string& host_, const string& port_, const string& long_id_, const string& short_id_); ~pskrep_sender(); bool append(const string& callsign, const band_map_t::value_type& r); bool send(void); private: void write_station_info(void); void write_preamble(void); string recv_callsign, recv_locator, recv_antenna; string host, port; string long_id, short_id; static const unsigned char long_station_info_template[]; static const unsigned char short_station_info_template[]; static const unsigned char rcpt_record_template[]; vector long_station_info; vector short_station_info; uint32_t identifier; uint32_t sequence_number; unsigned template_count; time_t last_template; Socket* send_socket; unsigned char* dgram; size_t dgram_size; size_t report_offset; void create_socket(void); pthread_t resolver_thread; static void* resolver(void* obj); static const char hexsym[]; static size_t pad(size_t len, size_t mult); }; class pskrep { public: pskrep(const string& call, const string& loc, const string& ant, const string& host, const string& port, const string& long_id, const string& short_id, bool reg_auto, bool reg_log, bool reg_manual); ~pskrep(); static void recv(trx_mode mode, int afreq, const char* str, const regmatch_t* calls, size_t len, void* obj); static void log(const char* call, const char* loc, long long freq, trx_mode mode, time_t rtime, void* obj); static void manual(const char* call, const char* loc, long long freq, trx_mode mode, time_t rtime, void* obj); bool progress(void); unsigned count(void) { return new_count; } static fre_t locator_re; private: void append(string call, const char* loc, long long freq, trx_mode mode, time_t rtime, rtype_t rtype); void gc(void); void load_queue(void); void save_queue(void); static bool not_sent(const band_map_t::value_type& r) { return r.status != PSKR_STATUS_SENT; } queue_t queue; pskrep_sender sender; unsigned new_count; }; fre_t pskrep::locator_re("[a-r]{2}[0-9]{2}[a-x]{2}", REG_EXTENDED | REG_NOSUB | REG_ICASE); #define SHORT_ID_SIZE 4 #define LONG_ID_SIZE 8 // ------------------------------------------------------------------------------------------------- static string error_string; static bool pskrep_check(void) { struct { const string* var; const char* msg; } check[] = { { &progdefaults.myCall, "callsign" }, { &progdefaults.myLocator, "locator" }, { &progdefaults.myAntenna, "antenna info" }, }; for (size_t i = 0; i < sizeof(check)/sizeof(*check); i++) { if (check[i].var->empty()) { error_string.assign("Error: missing ").append(check[i].msg); return false; } } if (!pskrep::locator_re.match(progdefaults.myLocator.c_str())) { error_string = "Error: bad Maidenhead locator\ncheck Configure->Operator->Locator"; return false; } return true; } const char* pskrep_error(void) { return error_string.c_str(); } static void pskrep_progress(void* obj) { if (reinterpret_cast(obj)->progress()) Fl::add_timeout(SEND_INTERVAL, pskrep_progress, obj); else pskrep_stop(); } static void pskrep_make_id(string& id, size_t len) { id.resize(len); ifstream f("/dev/urandom"); if (f) { for (size_t i = 0; i < len; i++) while ((id[i] = f.get()) != EOF && !isgraph(id[i])); f.close(); } else { unsigned seed = time(NULL); if (!progdefaults.myCall.empty()) seed ^= simple_hash_str((const unsigned char*)progdefaults.myCall.c_str()); srand(seed); for (size_t i = 0; i < len; i++) while (!isgraph(id[i] = rand() % 0x7F)); } } static pskrep* pskr = 0; bool pskrep_start(void) { if (pskr) return true; else if (!pskrep_check()) return false; // get identifier string fname = TempDir; fname.append(PSKREP_ID_FILE); ifstream in(fname.c_str()); string long_id, short_id; if (in) in >> long_id >> short_id; if (!in || in.eof()) { in.close(); pskrep_make_id(long_id, LONG_ID_SIZE); pskrep_make_id(short_id, SHORT_ID_SIZE); ofstream out(fname.c_str()); if (out) out << long_id << ' ' << short_id << '\n'; else LOG_ERROR("Could not write identifiers (\"%s\", \"%s\") to %s", long_id.c_str(), short_id.c_str(), fname.c_str()); } pskr = new pskrep(progdefaults.myCall, progdefaults.myLocator, progdefaults.myAntenna, progdefaults.pskrep_host, progdefaults.pskrep_port, long_id, short_id, progdefaults.pskrep_auto, progdefaults.pskrep_log, true); Fl::add_timeout(SEND_INTERVAL, pskrep_progress, pskr); return true; } void pskrep_stop(void) { Fl::remove_timeout(pskrep_progress, pskr); delete pskr; pskr = 0; } unsigned pskrep_count(void) { return pskr ? pskr->count() : 0; } // ------------------------------------------------------------------------------------------------- pskrep::pskrep(const string& call, const string& loc, const string& ant, const string& host, const string& port, const string& long_id, const string& short_id, bool reg_auto, bool reg_log, bool reg_manual) : sender(call, loc, ant, host, port, long_id, short_id), new_count(0) { if (reg_auto) spot_register_recv(pskrep::recv, this, PSKREP_RE, REG_EXTENDED | REG_ICASE); if (reg_log) spot_register_log(pskrep::log, this); if (reg_manual) spot_register_manual(pskrep::manual, this); load_queue(); } pskrep::~pskrep() { spot_unregister_recv(pskrep::recv, this); spot_unregister_log(pskrep::log, this); spot_unregister_manual(pskrep::manual, this); save_queue(); } // This function is called by spot_recv() when its buffer matches our PSKREP_RE void pskrep::recv(trx_mode mode, int afreq, const char* str, const regmatch_t* calls, size_t len, void* obj) { if (unlikely(calls[PSKREP_RE_INDEX].rm_so == -1 || calls[PSKREP_RE_INDEX].rm_eo == -1)) return; string call(str + calls[PSKREP_RE_INDEX].rm_so, calls[PSKREP_RE_INDEX].rm_eo - calls[PSKREP_RE_INDEX].rm_so); long long freq = afreq; if (!wf->USB()) freq = -freq; freq += wf->rfcarrier(); LOG_DEBUG("Spotted \"%s\" in buffer \"%s\"", call.c_str(), str); reinterpret_cast(obj)->append(call.c_str(), "", freq, active_modem->get_mode(), time(NULL), PSKREP_AUTO); } // This function is called by spot_log() void pskrep::log(const char* call, const char* loc, long long freq, trx_mode mode, time_t rtime, void* obj) { reinterpret_cast(obj)->append(call, loc, freq, mode, rtime, PSKREP_LOG); } // This function is called by spot_manual() void pskrep::manual(const char* call, const char* loc, long long freq, trx_mode mode, time_t rtime, void* obj) { reinterpret_cast(obj)->append(call, loc, freq, mode, rtime, PSKREP_MANUAL); } void pskrep::append(string call, const char* loc, long long freq, trx_mode mode, time_t rtime, rtype_t rtype) { if (unlikely(call.empty())) return; transform(call.begin(), call.end(), call.begin(), static_cast(toupper)); if (!progdefaults.pskrep_qrg) freq = 0LL; if (*loc && !locator_re.match(loc)) loc = ""; band_map_t& bandq = queue[call][band(freq)]; if (bandq.empty() || rtime - bandq.back().rtime >= DUP_INTERVAL) { // add new bandq.push_back(rcpt_report_t(mode, freq, rtime, rtype, loc)); LOG_VERBOSE("Added (call=\"%s\", loc=\"%s\", mode=\"%s\", freq=%d, time=%" PRIdMAX ", type=%u)", call.c_str(), loc, mode_info[mode].adif_name, static_cast(freq), (intmax_t)rtime, rtype); new_count++; save_queue(); } else if (!bandq.empty()) { band_map_t::value_type& r = bandq.back(); if (r.status != PSKR_STATUS_SENT && *loc && r.locator != loc) { // update last r.locator = loc; r.rtype = rtype; LOG_VERBOSE("Updated (call=\"%s\", loc=\"%s\", mode=\"%s\", freq=%d, time=%d, type=%u)", call.c_str(), loc, mode_info[r.mode].adif_name, static_cast(r.freq), static_cast(r.rtime), rtype); save_queue(); } } } // Handle queued reports bool pskrep::progress(void) { if (queue.empty()) return true; unsigned nrep = 0; bool sender_full = false; for (queue_t::iterator i = queue.begin(); i != queue.end(); ++i) { for (call_map_t::iterator j = i->second.begin(); j != i->second.end(); ++j) { for (band_map_t::iterator k = j->second.begin(); k != j->second.end(); ++k) { switch (k->status) { case PSKR_STATUS_NEW: if ((sender_full = !sender.append(i->first, *k))) goto send_reports; k->status = PSKR_STATUS_PENDING; nrep++; break; case PSKR_STATUS_PENDING: // sent in last cycle k->status = PSKR_STATUS_SENT; default: break; } } } } send_reports: LOG_VERBOSE("Found %u new report(s)", nrep); if (nrep) { if (!sender.send()) { LOG_ERROR("Sender failed, disabling pskreporter"); return false; } return progress(); } gc(); save_queue(); return true; } // Delete sent reports that are older than DUP_INTERVAL seconds void pskrep::gc(void) { time_t threshold = time(NULL) - DUP_INTERVAL; unsigned rm = 0; for (queue_t::iterator i = queue.begin(); i != queue.end() ; ) { for (call_map_t::iterator j = i->second.begin(); j != i->second.end() ; ) { band_map_t& b = j->second; band_map_t::iterator k = find_if(b.begin(), b.end(), not_sent); if (k != b.begin() && k == b.end()) --k; rm += k - b.begin(); k = b.erase(b.begin(), k); if (k != b.end() && k->status == PSKR_STATUS_SENT && k->rtime <= threshold) { b.erase(k); rm++; } if (b.empty()) i->second.erase(j++); else ++j; } if (i->second.empty()) queue.erase(i++); else ++i; } LOG_DEBUG("Removed %u sent report(s)", rm); } static ostream& operator<<(ostream& out, const rcpt_report_t& r); static istream& operator>>(istream& in, rcpt_report_t& r); static ostream& operator<<(ostream& out, const queue_t& q); static istream& operator>>(istream& in, queue_t& q); void pskrep::save_queue(void) { string fname = TempDir; fname.append(PSKREP_QUEUE_FILE); ofstream out(fname.c_str()); if (out) out << queue; else LOG_ERROR("Could not write %s", fname.c_str()); } void pskrep::load_queue(void) { string fname = TempDir; fname.append(PSKREP_QUEUE_FILE); ifstream in(fname.c_str()); if (!in) return; in >> queue; // restore pending reports as new for (queue_t::iterator i = queue.begin(); i != queue.end(); ++i) for (call_map_t::iterator j = i->second.begin(); j != i->second.end(); ++j) for (band_map_t::iterator k = j->second.begin(); k != j->second.end(); ++k) if (k->status == PSKR_STATUS_PENDING) k->status = PSKR_STATUS_NEW; } // ------------------------------------------------------------------------------------------------- // Text fields must be <= 254 bytes #define MAX_TEXT_SIZE 254 // Records must be padded to a multiple of 4 #define PAD 4 pskrep_sender::pskrep_sender(const string& call, const string& loc, const string& ant, const string& host_, const string& port_, const string& long_id_, const string& short_id_) : recv_callsign(call, 0, MAX_TEXT_SIZE), recv_locator(loc, 0, MAX_TEXT_SIZE), recv_antenna(ant, 0, MAX_TEXT_SIZE), host(host_, 0, MAX_TEXT_SIZE), port(port_, 0, MAX_TEXT_SIZE), long_id(long_id_, 0, LONG_ID_SIZE), short_id(short_id_, 0, SHORT_ID_SIZE), sequence_number(0), template_count(2 * TEMPLATE_THRESHOLD), last_template(0), send_socket(0), dgram_size(0), report_offset(0) { create_socket(); dgram = new unsigned char[DGRAM_MAX]; write_station_info(); } pskrep_sender::~pskrep_sender() { delete send_socket; delete [] dgram; } // fldigi uses 0x0219 as the long station info template id (bytes 4,5) const unsigned char pskrep_sender::long_station_info_template[] = { 0x00, 0x03, 0x00, 0x34, 0x02, 0x19, 0x00, 0x05, 0x00, 0x00, 0x80, 0x02, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // receiverCallsign 0x80, 0x04, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // receiverLocator 0x80, 0x0C, 0x00, 0x08, 0x00, 0x00, 0x76, 0x8F, // persistentIdentifier 0x80, 0x08, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // decoderSoftware 0x80, 0x09, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // anntennaInformation 0x00, 0x00 }; // fldigi uses 0x0218 as the short station info template id (bytes 4,5) const unsigned char pskrep_sender::short_station_info_template[] = { 0x00, 0x03, 0x00, 0x24, 0x02, 0x18, 0x00, 0x03, 0x00, 0x00, 0x80, 0x02, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // receiverCallsign 0x80, 0x04, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // receiverLocator 0x80, 0x0C, 0x00, 0x08, 0x00, 0x00, 0x76, 0x8F, // persistentIdentifier 0x00, 0x00 }; void pskrep_sender::write_station_info(void) { char prog_info[MAX_TEXT_SIZE]; size_t prog_len; prog_len = snprintf(prog_info, sizeof(prog_info), "%s", PACKAGE_TARNAME "-" PACKAGE_VERSION); prog_len = MIN(prog_len, sizeof(prog_info)); struct utsname u; if (uname(&u) != -1) { prog_len += snprintf(prog_info+prog_len, sizeof(prog_info)-prog_len, "/%s-%s", u.sysname, u.machine); prog_len = MIN(prog_len, sizeof(prog_info)); } size_t call_len = recv_callsign.length(), loc_len = recv_locator.length(), ant_len = recv_antenna.length(); size_t long_len, short_len; // Long station info length long_len = 4 + // 4-byte header 1 + call_len + // 1-byte call length + call string length 1 + loc_len + // 1-byte loc length + loc string length 8 + // 8-byte identifier 1 + prog_len + // 1-byte prog length + prog string length 1 + ant_len; // 1-byte ant length + ant string length long_len = pad(long_len, PAD); // Short station info length short_len = 4 + // 4-byte header 1 + call_len + // 1-byte call length + call string length 1 + loc_len + // 1-byte loc length + loc string length 8; // 8-byte identifier short_len = pad(short_len, PAD); long_station_info.resize(long_len); short_station_info.resize(short_len); unsigned char* p; size_t npad; // Write the long station info p = &long_station_info[0]; // header memcpy(p, long_station_info_template + 4, 2); p += 2; *reinterpret_cast(p) = htons(long_len); p += sizeof(uint16_t); // call *p++ = call_len; memcpy(p, recv_callsign.data(), call_len); p += call_len; // locator *p++ = loc_len; memcpy(p, recv_locator.data(), loc_len); p += loc_len; // identifier memcpy(p, long_id.data(), LONG_ID_SIZE); p += LONG_ID_SIZE; // program *p++ = prog_len; memcpy(p, prog_info, prog_len); p += prog_len; // antenna *p++ = ant_len; memcpy(p, recv_antenna.data(), ant_len); p += ant_len; // pad npad = &long_station_info[0] + long_len - p; if (npad) memset(p, 0, npad); LOG_DEBUG("long_station_info=\"%s\"", str2hex(&long_station_info[0], long_len)); // Write the short station info p = &short_station_info[0]; // header memcpy(p, short_station_info_template + 4, 2); p += 2; *reinterpret_cast(p) = htons(short_len); p += sizeof(uint16_t); // call *p++ = call_len; memcpy(p, recv_callsign.data(), call_len); p += call_len; // locator *p++ = loc_len; memcpy(p, recv_locator.data(), loc_len); p += loc_len; // identifier memcpy(p, long_id.data(), LONG_ID_SIZE); p += LONG_ID_SIZE; // pad npad = &short_station_info[0] + short_len - p; if (npad) memset(p, 0, npad); LOG_DEBUG("short_station_info=\"%s\"", str2hex(&short_station_info[0], short_len)); } // fldigi uses 0x022C as the reception record template id (bytes 4,5) const unsigned char pskrep_sender::rcpt_record_template[] = { 0x00, 0x02, 0x00, 0x34, 0x02, 0x2C, 0x00, 0x06, 0x80, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // senderCallsign 0x00, 0x96, 0x00, 0x04, // flowStartSeconds 0x80, 0x05, 0x00, 0x04, 0x00, 0x00, 0x76, 0x8F, // frequency 0x80, 0x0A, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // mode (adif string) 0x80, 0x03, 0xff, 0xff, 0x00, 0x00, 0x76, 0x8F, // senderLocator (if known) 0x80, 0x0B, 0x00, 0x01, 0x00, 0x00, 0x76, 0x8F // flags (informationSource) }; void pskrep_sender::write_preamble(void) { time_t now = time(NULL); unsigned char* p = dgram; // header *p++ = 0x00; *p++ = 0x0A; /* length written later */ p += 2; /* time written later */ p += sizeof(uint32_t); *reinterpret_cast(p) = htonl(sequence_number); p += sizeof(uint32_t); memcpy(p, short_id.data(), SHORT_ID_SIZE); p += SHORT_ID_SIZE; const unsigned char* station_info_template; size_t tlen; vector* station_info; if (template_count == 0 && now - last_template >= TEMPLATE_INTERVAL) template_count = TEMPLATE_THRESHOLD; if (template_count > TEMPLATE_THRESHOLD) { station_info_template = long_station_info_template; tlen = sizeof(long_station_info_template); station_info = &long_station_info; } else if (template_count != 0) { station_info_template = short_station_info_template; tlen = sizeof(short_station_info_template); station_info = &short_station_info; } if (template_count > 0) { memcpy(p, rcpt_record_template, sizeof(rcpt_record_template)); p += sizeof(rcpt_record_template); memcpy(p, station_info_template, tlen); p += tlen; template_count--; last_template = now; } // station info record memcpy(p, &(*station_info)[0], station_info->size()); p += station_info->size(); report_offset = p - dgram; // write report record header memcpy(p, rcpt_record_template + 4, 2); p += 2; /* length written later */ p += sizeof(uint16_t); dgram_size = p - dgram; } bool pskrep_sender::append(const string& callsign, const band_map_t::value_type& r) { if (dgram_size == 0) write_preamble(); size_t call_len = callsign.length(); call_len = MIN(MAX_TEXT_SIZE, call_len); const char* mode = mode_info[r.mode].adif_name; size_t mode_len = strlen(mode); mode_len = MIN(MAX_TEXT_SIZE, mode_len); size_t loc_len = MIN(MAX_TEXT_SIZE, r.locator.length()); // call_len + call + time + freq + mode_len + mode + loc_len + loc + info size_t rlen = 1 + call_len + 4 + 4 + 1 + mode_len + 1 + loc_len + 1; if (pad(rlen, PAD) + dgram_size > DGRAM_MAX) // datagram full return false; LOG_INFO("Appending report (call=%s mode=%s freq=%d time=%d type=%u)", callsign.c_str(), mode_info[r.mode].adif_name, static_cast(r.freq), static_cast(r.rtime), r.rtype); unsigned char* start = dgram + dgram_size; unsigned char* p = start; // call *p++ = call_len; memcpy(p, callsign.data(), call_len); p += call_len; // 4-byte reception time *reinterpret_cast(p) = htonl(r.rtime); p += sizeof(uint32_t); // 4-byte freq *reinterpret_cast(p) = htonl(r.freq); p += sizeof(uint32_t); // mode *p++ = mode_len; memcpy(p, mode, mode_len); p += mode_len; // locator *p++ = loc_len; memcpy(p, r.locator.data(), loc_len); p += loc_len; // info source *p++ = r.rtype; LOG_DEBUG(" \"%s\"", str2hex(start, p - start)); dgram_size += rlen; return true; } void* pskrep_sender::resolver(void* obj) { pskrep_sender* s = reinterpret_cast(obj); try { s->send_socket = new Socket(Address(s->host.c_str(), s->port.c_str(), "udp")); s->send_socket->connect(); } catch (const SocketException& e) { LOG_ERROR("Could not resolve %s: %s", s->host.c_str(), e.what()); } return NULL; } void pskrep_sender::create_socket(void) { if (pthread_create(&resolver_thread, NULL, resolver, this) != 0) LOG_PERROR("pthread_create"); } bool pskrep_sender::send(void) { if (!send_socket) return false; // empty dgram or no reports (shouldn't happen) if (dgram_size == 0 || dgram_size == report_offset + 4) { LOG_DEBUG("Not sending empty dgram: %" PRIuSZ " %" PRIuSZ "", dgram_size, report_offset); return false; } // Finish writing the report record: // do we need padding? size_t npad = (dgram_size - report_offset) % PAD; if (npad) { npad = PAD - npad; memset(dgram + dgram_size, 0x0, npad); dgram_size += npad; } // write length *reinterpret_cast(dgram + report_offset + 2) = htons(dgram_size - report_offset); // finish writing the datagram *reinterpret_cast(dgram + 2) = htons(dgram_size); *reinterpret_cast(dgram + 4) = htonl(time(NULL)); bool ret; LOG_DEBUG("Sending datagram (%" PRIuSZ "): \"%s\"", dgram_size, str2hex(dgram, dgram_size)); try { if ((size_t)send_socket->send(dgram, dgram_size) != dgram_size) throw SocketException("short write"); ret = true; } catch (const SocketException& e) { LOG_ERROR("Could not send datagram to %s port %s: %s", host.c_str(), port.c_str(), e.what()); ret = false; } // increment this regardless of any errors sequence_number++; dgram_size = 0; return ret; } // Pad len to a multiple of mult size_t pskrep_sender::pad(size_t len, size_t mult) { size_t r = len % mult; return r ? len + mult - r : len; } // ------------------------------------------------------------------------------------------------- static istream& operator>>(istream& in, rtype_t& t) { int i; in >> i; t = static_cast(i); return in; } static istream& operator>>(istream& in, status_t& t) { int i; in >> i; t = static_cast(i); return in; } static istream& operator>>(istream& in, rcpt_report_t& r) { in >> r.mode >> r.freq >> r.rtime >> r.rtype >> r.status >> r.locator; if (*r.locator.c_str() == '?') r.locator.clear(); return in; } static ostream& operator<<(ostream& out, const rcpt_report_t& r) { return out << r.mode << ' ' << r.freq << ' ' << r.rtime << ' ' << r.rtype << ' ' << r.status << ' ' << (r.locator.empty() ? "?" : r.locator); } static ostream& operator<<(ostream& out, const queue_t& q) { for (queue_t::const_iterator i = q.begin(); i != q.end(); ++i) for (call_map_t::const_iterator j = i->second.begin(); j != i->second.end(); ++j) for (band_map_t::const_iterator k = j->second.begin(); k != j->second.end(); ++k) out << *k << " " << j->first << " " << i->first << '\n'; return out; } static istream& operator>>(istream& in, queue_t& q) { rcpt_report_t rep; int band; string call; while (in >> rep >> band >> call) q[call][static_cast(band)].push_back(rep); return in; } fldigi-3.21.80/src/spot/spot.cxx0000664000175000017500000001514412313301270013330 00000000000000// ---------------------------------------------------------------------------- // spot.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #ifdef __clang__ #include #else #include #endif #include #include "trx.h" #include "globals.h" #include "re.h" #include "fl_digi.h" #include "debug.h" #include "spot.h" // the number of characters that we match our REs against #define SEARCHLEN 32 #define DECBUFSIZE 8 * SEARCHLEN using namespace std; struct callback_t { void* data; spot_log_cb_t lcb; spot_log_cb_t mcb; spot_recv_cb_t rcb; }; typedef list cblist_t; struct fre_hash : std::unary_function { size_t operator()(const fre_t* r) const { return r->hash(); } }; struct fre_comp : std::unary_function { size_t operator()(const fre_t* l, const fre_t* r) const { return *l == *r; } }; typedef list callback_p_list_t; #ifdef __clang__ typedef std::unordered_map rcblist_t; static std::unordered_map buffers; #else typedef tr1::unordered_map rcblist_t; static tr1::unordered_map buffers; #endif static cblist_t cblist; static rcblist_t rcblist; void spot_recv(char c, int decoder, int afreq, int md) { static trx_mode last_mode = NUM_MODES + 1; if (decoder == -1) { // mode without multiple decoders decoder = active_modem->get_mode(); if (last_mode != active_modem->get_mode()) { buffers.clear(); last_mode = active_modem->get_mode(); } } else if (last_mode != md) { buffers.clear(); last_mode = md; } if (afreq == 0) afreq = active_modem->get_freq(); string& buf = buffers[decoder]; if (unlikely(buf.capacity() < DECBUFSIZE)) buf.reserve(DECBUFSIZE); buf += c; string::size_type n = buf.length(); if (n == DECBUFSIZE) buf.erase(0, DECBUFSIZE - SEARCHLEN); const char* search = buf.c_str() + (n > SEARCHLEN ? n - SEARCHLEN : 0); for (rcblist_t::iterator i = rcblist.begin(); i != rcblist.end(); ++i) { if (unlikely(i->first->match(search))) { const vector& m = i->first->suboff(); for (list::iterator j = i->second.begin(); j != i->second.end() && (*j)->rcb; ++j) { if (m.empty()) (*j)->rcb(last_mode, afreq, search, NULL, 0, (*j)->data); else (*j)->rcb(last_mode, afreq, search, &m[0], m.size(), (*j)->data); } } } } static void get_log_details(long long& freq, trx_mode& mode, time_t& rtime) { if (mode == NUM_MODES) mode = active_modem->get_mode(); if (mode >= MODE_WWV) return; if (freq == 0LL) freq = active_modem->get_freq(); if (!wf->USB()) freq = -freq; freq += wf->rfcarrier(); if (rtime == -1L) rtime = time(NULL); } void spot_log(const char* callsign, const char* locator, long long freq, trx_mode mode, time_t rtime) { get_log_details(freq, mode, rtime); for (cblist_t::const_iterator i = cblist.begin(); i != cblist.end(); ++i) if (i->lcb) i->lcb(callsign, locator, freq, mode, rtime, i->data); } void spot_manual(const char* callsign, const char* locator, long long freq, trx_mode mode, time_t rtime) { get_log_details(freq, mode, rtime); for (cblist_t::const_iterator i = cblist.begin(); i != cblist.end(); ++i) if (i->mcb) i->mcb(callsign, locator, freq, mode, rtime, i->data); } // // A callback of type spot_log_cb_t is registered with a data argument. // The callback is invoked every time a QSO is logged. // void spot_register_log(spot_log_cb_t lcb, void* ldata) { callback_t c = { ldata, lcb, 0, 0 }; cblist.push_back(c); } // // A callback of type spot_log_cb_t is registered with a data argument. // The callback is invoked every time the user manually spots a callsign. // void spot_register_manual(spot_log_cb_t mcb, void* mdata) { callback_t c = { mdata, 0, mcb, 0 }; cblist.push_back(c); } // // A callback of type spot_recv_cb_t is registered with a regular // expression (RE, RE_flags). If the RE matches the spotter's search // buffer, the callback is invoked with offsets into the search buffer // indicating substring matches, if the RE defines any, and with its // data argument. The offset format is described in regexec(3). The // buffer and offsets are only valid during that particular invocation. // Clients should use anchoring to avoid repeated calls. // void spot_register_recv(spot_recv_cb_t rcb, void* rdata, const char* re, int reflags) { callback_t c = { rdata, 0, 0, rcb }; cblist.push_back(c); fre_t* fre = new fre_t(re, reflags); rcblist_t::iterator i = rcblist.find(fre); if (i != rcblist.end()) { i->second.push_back(&cblist.back()); delete fre; } else rcblist[fre].push_back(&cblist.back()); show_spot(true); } void spot_unregister_log(spot_log_cb_t lcb, const void* ldata) { for (cblist_t::iterator i = cblist.begin(); i != cblist.end(); ++i) { if (lcb == i->lcb && ldata == i->data) { cblist.erase(i); break; } } } void spot_unregister_manual(spot_log_cb_t mcb, const void* mdata) { for (cblist_t::iterator i = cblist.begin(); i != cblist.end(); ++i) { if (mcb == i->mcb && mdata == i->data) { cblist.erase(i); break; } } } void spot_unregister_recv(spot_recv_cb_t rcb, const void* rdata) { cblist_t::iterator i; callback_t* p = 0; for (i = cblist.begin(); i != cblist.end(); ++i) { if (rcb == i->rcb && rdata == i->data) { p = &*i; cblist.erase(i); break; } } if (!p) return; // remove pointer from rcblist for (rcblist_t::iterator j = rcblist.begin(); j != rcblist.end(); ++j) { for (list::iterator k = j->second.begin(); k != j->second.end(); ++k) { if (*k == p) { j->second.erase(k); if (j->second.empty()) { delete j->first; rcblist.erase(j); } goto out; } } } out: for (i = cblist.begin(); i != cblist.end(); ++i) if (i->rcb) break; show_spot(i != cblist.end()); } fldigi-3.21.80/src/spot/notify.cxx0000664000175000017500000014610312313301270013653 00000000000000// ---------------------------------------------------------------------------- // notify.cxx // // Copyright (C) 2009-2010 // Stelios Bounanos, M0GLD // // Generic notifier // // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "timeops.h" #ifdef __clang__ # define MAP_TYPE std::unordered_map # include #else # if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) # define MAP_TYPE std::tr1::unordered_map # include # else // use the non-standard gnu hash_map on gcc <= 4.0.x, // which has a broken tr1::unordered_map::operator= # define MAP_TYPE __gnu_cxx::hash_map # include namespace __gnu_cxx { // define the missing hash specialisation for std::string // using the 'const char*' hash function template<> struct hash { size_t operator()(const std::string& s) const { return __stl_hash_string(s.c_str()); } }; } # endif #endif #include #include #include #ifdef __MINGW32__ # include #endif #include #include #include #include #include #include #include "flinput2.h" #include "flmisc.h" #include "macros.h" #include "debug.h" #include "dxcc.h" #include "spot.h" #include "pskrep.h" #include "logsupport.h" #include "re.h" #include "fileselect.h" #include "icons.h" #include "configuration.h" #include "macroedit.h" #include "main.h" #include "fl_digi.h" #include "waterfall.h" #include "globals.h" #include "trx.h" #include "rsid.h" #include "gettext.h" #include "notifydialog.h" #include "notify.h" using namespace std; struct notify_action_t { string alert; string rx_marker; string macro; string program; time_t alert_timeout; time_t trigger_limit; }; enum notify_filter_match_t { NOTIFY_FILTER_CALLSIGN, NOTIFY_FILTER_DXCC }; typedef MAP_TYPE notify_filter_dxcc_t; struct notify_filter_t { notify_filter_match_t match; string callsign; notify_filter_dxcc_t dxcc; string dxcc_last; bool nwb, lotw, eqsl; }; struct notify_dup_t { time_t when; band_t band; trx_mode mode; long long freq; }; typedef MAP_TYPE notify_seen_t; enum notify_event_t { NOTIFY_EVENT_MYCALL, NOTIFY_EVENT_STATION, NOTIFY_EVENT_CUSTOM, NOTIFY_EVENT_RSID }; struct notify_t { notify_event_t event; time_t last_trigger; string re; bool enabled; int afreq; long long rfreq; trx_mode mode; const char* match_string; const regmatch_t* submatch_offsets; size_t submatch_length; notify_dup_t dup; bool dup_ignore; size_t dup_ref; notify_seen_t last_seen; notify_action_t action; notify_filter_t filter; }; typedef list notify_list_t; static void notify_init_window(void); static void notify_save(void); static void notify_load(void); static void notify_register(notify_t& n); static void notify_unregister(const notify_t& n); static void notify_set_qsodb_cache(void); static void notify_event_cb(Fl_Widget* w, void* arg); static void notify_select_cb(Fl_Widget* w, void* arg); static void notify_dxcc_browse_cb(Fl_Widget* w, void* arg); static void notify_add_cb(Fl_Widget* w, void* arg); static void notify_remove_cb(Fl_Widget* w, void* arg); static void notify_update_cb(Fl_Widget* w, void* arg); static void notify_dialog_default_cb(Fl_Widget* w, void* arg); static void notify_rx_default_cb(Fl_Widget* w, void* arg); static void notify_macro_edit_cb(Fl_Widget* w, void* arg); static void notify_program_select_cb(Fl_Widget* w, void* arg); static void notify_dxcc_check_cb(Fl_Widget* w, void* arg); static void notify_test_cb(Fl_Widget* w, void* arg); static void notify_filter_dxcc_select_cb(Fl_Widget* w, void* arg); static void notify_filter_dxcc_search(Fl_Widget* w, void* arg); static void notify_dup_ignore_cb(Fl_Widget* w, void* arg); static void notify_re_cb(Fl_Widget* w, void* arg); static void notify_recv(trx_mode mode, int afreq, const char* str, const regmatch_t* sub, size_t len, void* data); static void notify_table_append(const notify_t& n); //////////////////////////////////////////////////////////////////////////////// struct event_regex_t { const char* regex; size_t index; }; static Fl_Menu_Item notify_event_menu[] = { { _("My callsign de CALL") }, { _("Station heard twice") }, { _("Custom text search") }, { _("RSID reception") }, { 0 } }; #define NOTIFY_SET_DUP_MENU (void*)1 enum { NOTIFY_LIST_MENU_TOGGLE, NOTIFY_LIST_MENU_UPDATE, NOTIFY_LIST_MENU_REMOVE }; static Fl_Menu_Item notify_list_context_menu[] = { { make_icon_label(_("Toggle"), shutdown_icon), 0, notify_update_cb, (void*)NOTIFY_LIST_MENU_TOGGLE }, { make_icon_label(_("Update"), refresh_icon), 0, notify_update_cb, (void*)NOTIFY_LIST_MENU_UPDATE }, { make_icon_label(_("Remove"), minus_icon), 0, notify_remove_cb, (void*)NOTIFY_LIST_MENU_REMOVE }, { 0 } }; enum { NOTIFY_DXCC_SELECT_CONT, NOTIFY_DXCC_SELECT_ITU, NOTIFY_DXCC_SELECT_CQ, NOTIFY_DXCC_SELECT_ALL, NOTIFY_DXCC_DESELECT_CONT, NOTIFY_DXCC_DESELECT_ITU, NOTIFY_DXCC_DESELECT_CQ, NOTIFY_DXCC_DESELECT_ALL }; static Fl_Menu_Item notify_dxcc_context_menu[] = { { _("Select"), 0, 0, 0, FL_SUBMENU }, { _("Continent"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_CONT }, { _("ITU zone"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_ITU }, { _("CQ zone"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_CQ, FL_MENU_DIVIDER }, { _("All"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_ALL }, { 0 }, { _("Deselect"), 0, 0, 0, FL_SUBMENU }, { _("Continent"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_CONT }, { _("ITU zone"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_ITU }, { _("CQ zone"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_CQ, FL_MENU_DIVIDER }, { _("All"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_ALL }, { 0 }, { 0 } }; static event_regex_t event_regex[] = { { ".+de[[:space:]]+()", 1 }, { PSKREP_RE, PSKREP_RE_INDEX }, { "", 0 }, { "", 1 } }; static const char* default_alert_text[] = { "$CALLSIGN is calling you\n $TEXT\nTime: %X %Z (%z)\nMode: $MODEM @ $RF_KHZ KHz", "Heard $CALLSIGN ($COUNTRY)\n $TEXT\nTime: %X %Z (%z)\nMode: $MODEM @ $RF_KHZ KHz", "", "RSID received\nMode: $MODEM @ $RF_KHZ KHz\nTime: %X %Z (%z)", }; static Fl_Menu_Item notify_dup_callsign_menu[] = { { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { 0 } }; static Fl_Menu_Item notify_dup_refs_menu[] = { { "Substring \\0" }, { "Substring \\1" }, { "Substring \\2" }, { "Substring \\3" }, { "Substring \\4" }, { "Substring \\5" }, { "Substring \\6" }, { "Substring \\7" }, { "Substring \\8" }, { "Substring \\9" }, { 0 } }; enum { NOTIFY_DXCC_COL_SEL, NOTIFY_DXCC_COL_CN, NOTIFY_DXCC_COL_CT, NOTIFY_DXCC_COL_ITU, NOTIFY_DXCC_COL_CQ, NOTIFY_DXCC_NUMCOL }; template static T& advli(T& i, int n) { advance(i, n); return i; } template static T advli(T i, U n) { advance(i, n); return i; } static notify_list_t notify_list; static notify_t notify_tmp; static const vector* dxcc_list; Fl_Double_Window* notify_window; Fl_Double_Window* dxcc_window; //////////////////////////////////////////////////////////////////////////////// // public interface //////////////////////////////////////////////////////////////////////////////// void notify_start(void) { if (!notify_window) notify_init_window(); notify_load(); if (!notify_list.empty()) { for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) if (i->enabled) notify_register(*i); tblNotifyList->value(0); tblNotifyList->do_callback(); notify_set_qsodb_cache(); } } void notify_stop(void) { for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) notify_unregister(*i); notify_list.clear(); notify_set_qsodb_cache(); tblNotifyList->clear(); } void notify_show(void) { if (!notify_window) notify_window = make_notify_window(); notify_window->show(); } // display the dxcc window void notify_dxcc_show(bool readonly) { if (!dxcc_list) return; if (readonly) { btnNotifyDXCCSelect->hide(); btnNotifyDXCCDeselect->hide(); tblNotifyFilterDXCC->callback(Fl_Widget::default_callback); tblNotifyFilterDXCC->menu(0); btnNotifyDXCCDeselect->do_callback(); // deselect all if (dxcc_window->shown()) dxcc_window->hide(); if (dxcc_window->modal()) dxcc_window->set_non_modal(); } else { btnNotifyDXCCSelect->show(); btnNotifyDXCCDeselect->show(); tblNotifyFilterDXCC->callback(notify_dxcc_check_cb); tblNotifyFilterDXCC->menu(notify_dxcc_context_menu); dxcc_window->set_modal(); } dxcc_window->show(); } // called by the myCall callback when the operator callsign is changed void notify_change_callsign(void) { for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) { if (i->event == NOTIFY_EVENT_MYCALL) { // re-register notify_unregister(*i); notify_register(*i); } } } // called by the RSID decoder void notify_rsid(trx_mode mode, int afreq) { const char* mode_name = mode_info[mode].name; regmatch_t sub[2] = { { 0, (regoff_t)strlen(mode_name) } }; sub[1] = sub[0]; for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) if (i->event == NOTIFY_EVENT_RSID) notify_recv(mode, afreq, mode_name, sub, 2, &*i); } // called by the config dialog when the "notifications only" // rsid option is selected void notify_create_rsid_event(bool val) { if (!val) return; for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) if (i->event == NOTIFY_EVENT_RSID) return; notify_t rsid_event = { NOTIFY_EVENT_RSID, 0, "", true, 0, 0LL, NUM_MODES, NULL, NULL, 0, { 0, NUM_BANDS, NUM_MODES, 0LL }, false, 0 }; notify_action_t rsid_action = { default_alert_text[NOTIFY_EVENT_RSID], "", "", "", 30, 1 }; rsid_event.action = rsid_action; notify_list.push_back(rsid_event); notify_table_append(notify_list.back()); tblNotifyList->do_callback(); notify_save(); } //////////////////////////////////////////////////////////////////////////////// // misc utility functions //////////////////////////////////////////////////////////////////////////////// static void notify_set_event_dup(const notify_t& n); static void notify_set_event_dup_menu(const char* re); static bool notify_dxcc_row_checked(int i); // return actual regular expression for event n static string notify_get_re(const notify_t& n) { string::size_type pos; string s = n.re; struct { const char* str; const char* rep; } subst[] = { { "", progdefaults.myCall.c_str() }, { "", CALLSIGN_RE } }; for (size_t i = 0; i < sizeof(subst)/sizeof(*subst); i++) if ((pos = s.find(subst[i].str)) != string::npos) s.replace(pos, strlen(subst[i].str), subst[i].rep); return s; } // set the widget values using event n static void notify_event_to_gui(const notify_t& n) { // event mnuNotifyEvent->value(n.event); notify_event_cb(mnuNotifyEvent, 0); if (!n.re.empty() && inpNotifyRE->visible()) inpNotifyRE->value(n.re.c_str()); btnNotifyEnabled->value(n.enabled); // action inpNotifyActionDialog->value(n.action.alert.c_str()); inpNotifyActionRXMarker->value(n.action.rx_marker.c_str()); inpNotifyActionMacro->value(n.action.macro.c_str()); inpNotifyActionProgram->value(n.action.program.c_str()); cntNotifyActionLimit->value(n.action.trigger_limit); cntNotifyActionDialogTimeout->value(n.action.alert_timeout); // dup chkNotifyDupIgnore->value(n.dup_ignore); chkNotifyDupIgnore->do_callback(); notify_set_event_dup(n); cntNotifyDupTime->value(n.dup.when); chkNotifyDupBand->value(n.dup.band); chkNotifyDupMode->value(n.dup.mode); // filter btnNotifyDXCCDeselect->do_callback(); // deselect all if (!grpNotifyFilter->active()) return; chkNotifyFilterCall->value(0); inpNotifyFilterCall->hide(); chkNotifyFilterDXCC->value(0); btnNotifyFilterDXCC->hide(); inpNotifyFilterCall->value(0); if (n.filter.match == NOTIFY_FILTER_CALLSIGN) { chkNotifyFilterCall->value(1); inpNotifyFilterCall->show(); inpNotifyFilterCall->value(n.filter.callsign.c_str()); } else if (n.filter.match == NOTIFY_FILTER_DXCC) { chkNotifyFilterDXCC->value(1); btnNotifyFilterDXCC->show(); } chkNotifyFilterNWB->value(n.filter.nwb); chkNotifyFilterLOTW->value(n.filter.lotw); chkNotifyFilterEQSL->value(n.filter.eqsl); } // copy widget values to event n static void notify_gui_to_event(notify_t& n) { // event n.event = static_cast(mnuNotifyEvent->value()); n.last_trigger = 0; if (n.event == NOTIFY_EVENT_CUSTOM) n.re = inpNotifyRE->value(); else n.re = event_regex[n.event].regex; n.enabled = btnNotifyEnabled->value(); n.afreq = 0; n.rfreq = 0; n.match_string = 0; n.submatch_offsets = 0; n.submatch_length = 0; // action n.action.alert = inpNotifyActionDialog->value(); n.action.rx_marker = inpNotifyActionRXMarker->value(); n.action.macro = inpNotifyActionMacro->value(); n.action.program = inpNotifyActionProgram->value(); n.action.trigger_limit = static_cast(cntNotifyActionLimit->value()); n.action.alert_timeout = static_cast(cntNotifyActionDialogTimeout->value()); // filter if (chkNotifyFilterCall->value()) { n.filter.callsign = inpNotifyFilterCall->value(); n.filter.match = NOTIFY_FILTER_CALLSIGN; } else if (chkNotifyFilterDXCC->value()) { n.filter.match = NOTIFY_FILTER_DXCC; n.filter.dxcc.clear(); for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) { if (notify_dxcc_row_checked(i)) n.filter.dxcc[tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_CN)] = true; } } n.filter.nwb = chkNotifyFilterNWB->value(); n.filter.lotw = chkNotifyFilterLOTW->value(); n.filter.eqsl = chkNotifyFilterEQSL->value(); // dup n.dup_ignore = chkNotifyDupIgnore->value(); n.dup_ref = mnuNotifyDupWhich->value(); n.dup.when = static_cast(cntNotifyDupTime->value()); n.dup.band = chkNotifyDupBand->value() ? NUM_BANDS : static_cast(0); n.dup.mode = chkNotifyDupMode->value() ? NUM_MODES : static_cast(0); } // initialise the notifications window static void notify_init_window(void) { notify_window = make_notify_window(); notify_window->xclass(PACKAGE_TARNAME); dxcc_window = make_dxcc_window(); dxcc_window->xclass(PACKAGE_TARNAME); struct { Fl_Button* button; const char* label; } buttons[] = { { btnNotifyAdd, make_icon_label(_("Add"), plus_icon) }, { btnNotifyRemove, make_icon_label(_("Remove"), minus_icon) }, { btnNotifyUpdate, make_icon_label(_("Update"), refresh_icon) }, { btnNotifyTest, make_icon_label(_("Test..."), applications_system_icon) }, { btnNotifyClose, make_icon_label(_("Close"), close_icon) }, { btnNotifyDXCCSelect, make_icon_label(_("Select All"), edit_select_all_icon) }, { btnNotifyDXCCDeselect, make_icon_label(_("Clear All"), edit_clear_icon) }, { btnNotifyDXCCClose, make_icon_label(_("Close"), close_icon) }, }; for (size_t i = 0; i < sizeof(buttons)/sizeof(*buttons); i++) { buttons[i].button->label(buttons[i].label); set_icon_label(buttons[i].button); buttons[i].button->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); } struct { Fl_Button* button; const char** icon; } buttons2[] = { { btnNotifyFilterDXCC, text_editor_icon }, { btnNotifyActionDialogDefault, text_icon }, { btnNotifyActionMarkerDefault, text_icon }, { btnNotifyActionMacro, text_editor_icon }, { btnNotifyActionProgram, folder_open_icon } }; for (size_t i = 0; i < sizeof(buttons2)/sizeof(*buttons2); i++) buttons2[i].button->image(new Fl_Pixmap(buttons2[i].icon)); inpNotifyRE->hide(); grpNotifyFilter->deactivate(); mnuNotifyEvent->menu(notify_event_menu); btnNotifyEnabled->value(1); inpNotifyRE->callback(notify_re_cb); int w = (tblNotifyList->w() - Fl::box_dw(tblNotifyList->box())) / 4; struct col_info_t { const char* label; int width; }; col_info_t ncols[] = { { "Event", w + 30 }, { "Filter", w + 30 }, { "Action", w - 30 }, { "Enabled", w - 30 }, }; for (size_t i = 0; i < sizeof(ncols)/sizeof(*ncols); i++) { tblNotifyList->addColumn(ncols[i].label, ncols[i].width, static_cast(FL_ALIGN_CENTER | FL_ALIGN_CLIP)); } tblNotifyList->rowSize(FL_NORMAL_SIZE); tblNotifyList->headerSize(FL_NORMAL_SIZE); tblNotifyList->allowSort(false); tblNotifyList->when(FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED); tblNotifyList->menu(notify_list_context_menu); for (int i = 0; i < notify_list_context_menu->size(); i++) set_icon_label(¬ify_list_context_menu[i]); w = (tblNotifyFilterDXCC->w() - Fl::box_dw(tblNotifyFilterDXCC->box()) - tblNotifyFilterDXCC->scrollbSize()) / NOTIFY_DXCC_NUMCOL; col_info_t dcols[NOTIFY_DXCC_NUMCOL] = { { "", 25 }, { _("Country"), w + w - 25 + 2*(w - 45) }, { _("Continent"), w }, { "ITU", 45 }, { "CQ", 45 } }; for (size_t i = 0; i < NOTIFY_DXCC_NUMCOL; i++) { tblNotifyFilterDXCC->addColumn(dcols[i].label, dcols[i].width, static_cast(FL_ALIGN_CENTER | FL_ALIGN_CLIP), strcmp); } tblNotifyFilterDXCC->columnAlign(NOTIFY_DXCC_COL_CN, static_cast(FL_ALIGN_LEFT | FL_ALIGN_CLIP)); tblNotifyFilterDXCC->rowSize(FL_NORMAL_SIZE); tblNotifyFilterDXCC->headerSize(FL_NORMAL_SIZE); tblNotifyFilterDXCC->when(FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED); tblNotifyFilterDXCC->menu(notify_dxcc_context_menu); btnNotifyDXCCSelect->callback(notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_ALL); btnNotifyDXCCDeselect->callback(notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_ALL); inpNotifyDXCCSearchCountry->callback(notify_filter_dxcc_search); inpNotifyDXCCSearchCountry->when(FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED | FL_WHEN_ENTER_KEY); inpNotifyDXCCSearchCallsign->callback(notify_filter_dxcc_search); inpNotifyDXCCSearchCallsign->when(FL_WHEN_CHANGED); inpNotifyDXCCSearchCallsign->textfont(FL_COURIER); inpNotifyActionDialog->textfont(FL_COURIER); inpNotifyActionRXMarker->textfont(FL_COURIER); inpNotifyActionMacro->textfont(FL_COURIER); inpNotifyActionProgram->textfont(FL_COURIER); inpNotifyRE->textfont(FL_COURIER); inpNotifyFilterCall->textfont(FL_COURIER); tblNotifyList->callback(notify_select_cb); mnuNotifyEvent->callback(notify_event_cb, NOTIFY_SET_DUP_MENU); btnNotifyFilterDXCC->callback(notify_dxcc_browse_cb); btnNotifyAdd->callback(notify_add_cb); btnNotifyRemove->callback(notify_remove_cb); btnNotifyUpdate->callback(notify_update_cb, (void*)NOTIFY_LIST_MENU_UPDATE); btnNotifyActionDialogDefault->callback(notify_dialog_default_cb); btnNotifyActionMarkerDefault->callback(notify_rx_default_cb); btnNotifyActionProgram->callback(notify_program_select_cb); btnNotifyActionMacro->callback(notify_macro_edit_cb); btnNotifyTest->callback(notify_test_cb); tblNotifyFilterDXCC->callback(notify_dxcc_check_cb); chkNotifyDupIgnore->callback(notify_dup_ignore_cb); mnuNotifyDupWhich->menu(notify_dup_refs_menu); chkNotifyFilterCall->value(0); chkNotifyFilterDXCC->value(0); inpNotifyFilterCall->hide(); btnNotifyFilterDXCC->hide(); chkNotifyDupIgnore->value(1); chkNotifyDupIgnore->do_callback(); chkNotifyDupBand->value(1); chkNotifyDupMode->value(1); cntNotifyDupTime->value(3600); mnuNotifyEvent->do_callback(); // for the dup menu dxcc_list = dxcc_entity_list(); if (dxcc_list) { char cq[5], itu[5]; for (vector::const_iterator i = dxcc_list->begin(); i != dxcc_list->end(); ++i) { snprintf(itu, sizeof(itu), "%02d", (*i)->itu_zone); snprintf(cq, sizeof(cq), "%02d", (*i)->cq_zone); tblNotifyFilterDXCC->addRow(NOTIFY_DXCC_NUMCOL, "[x]", (*i)->country, (*i)->continent, itu, cq); } } else { chkNotifyFilterDXCC->deactivate(); btnNotifyFilterDXCC->deactivate(); } unsigned char q = qsl_is_open(); if (!(q & (1 << QSL_LOTW))) chkNotifyFilterLOTW->deactivate(); if (!(q & (1 << QSL_EQSL))) chkNotifyFilterEQSL->deactivate(); } // append event n to the table widget static void notify_table_append(const notify_t& n) { // add to table string fcol, acol; if (n.event == NOTIFY_EVENT_MYCALL) fcol = "My callsign"; else if (n.event == NOTIFY_EVENT_STATION) { if (n.filter.match == NOTIFY_FILTER_CALLSIGN) fcol += "Callsign"; else if (n.filter.match == NOTIFY_FILTER_DXCC) fcol += "DXCC"; } else if (n.event == NOTIFY_EVENT_CUSTOM) fcol = n.re; if (n.filter.nwb) fcol += ", N"; if (n.filter.lotw) fcol += ", L"; if (n.filter.eqsl) fcol += ", E"; if (!n.action.alert.empty()) acol = "A"; if (!n.action.rx_marker.empty()) { if (!acol.empty()) acol += ", "; acol += "RX"; } if (!n.action.macro.empty()) { if (!acol.empty()) acol += ", "; acol += "TX"; } if (!n.action.program.empty()) { if (!acol.empty()) acol += ", "; acol += "P"; } tblNotifyList->addRow(4, notify_event_menu[n.event].label(), fcol.c_str(), acol.c_str(), n.enabled ? "Y" : "N"); tblNotifyList->value(tblNotifyList->rows() - 1); tblNotifyList->redraw(); } // clear and reload the event table static void notify_table_reload(void) { tblNotifyList->clear(); for (notify_list_t::const_iterator i = notify_list.begin(); i != notify_list.end(); ++i) notify_table_append(*i); } //////////////////////////////////////////////////////////////////////////////// // spotter and notification functions //////////////////////////////////////////////////////////////////////////////// static void notify_goto_freq_cb(Fl_Widget* w, void* arg) { const notify_t* n = static_cast(arg); if (active_modem->get_mode() != n->mode) init_modem_sync(n->mode); qsy(n->rfreq, n->afreq); if (n->event == NOTIFY_EVENT_RSID && btnRSID->value() && progdefaults.rsid_auto_disable && progdefaults.rsid_notify_only) toggleRSID(); } static void notify_alert_window_cb(Fl_Widget* w, void* arg) { delete static_cast(arg); w->hide(); } static void notify_show_alert(const notify_t& n, const char* msg) { notify_dialog* alert_window = new notify_dialog; Fl_Button* goto_freq = alert_window->make_button(120); if (goto_freq) { char label[32]; snprintf(label, sizeof(label), "Go to %d Hz", n.afreq); goto_freq->copy_label(label); goto_freq->callback(notify_goto_freq_cb, new notify_t(n)); alert_window->callback(notify_alert_window_cb, goto_freq->user_data()); } alert_window->notify(msg, n.action.alert_timeout, true); } struct replace_refs { enum { REF_MODEM, REF_DF_HZ, REF_RF_HZ, REF_RF_KHZ, REF_AF_HZ, REF_LF_KHZ, REF_CALLSIGN, REF_COUNTRY, REF_MATCHED_TEXT, REF_TEXT }; static void replace_var(const notify_t& n, int t, char* str, size_t len) { switch (t) { case REF_MODEM: strncpy(str, mode_info[n.mode].sname, len); str[len - 1] = '\0'; break; case REF_DF_HZ: snprintf(str, len, "%lld", wf->rfcarrier()); break; case REF_RF_HZ: case REF_RF_KHZ: { long long hz = wf->rfcarrier() + (wf->USB() ? n.afreq : -n.afreq); if (t == REF_RF_HZ) snprintf(str, len, "%lld", hz); else // REF_RF_KHZ snprintf(str, len, "%.3f", (double)hz / 1000.0); break; } case REF_AF_HZ: snprintf(str, len, "%d", n.afreq); break; case REF_LF_KHZ: strncpy(str, inpFreq->value(), len); str[len - 1] = '\0'; break; case REF_CALLSIGN: if (n.event == NOTIFY_EVENT_MYCALL || n.event == NOTIFY_EVENT_STATION) snprintf(str, len, "\\%" PRIuSZ, event_regex[n.event].index); break; case REF_COUNTRY: if (n.event == NOTIFY_EVENT_STATION) { strncpy(str, n.filter.dxcc_last.c_str(), len); str[len - 1] = '\0'; } break; case REF_MATCHED_TEXT: snprintf(str, len, "\\0"); break; case REF_TEXT: strncpy(str, n.match_string, len); str[len - 1] = '\0'; break; } } void operator()(const notify_t& n, string& edit) { char buf[128]; string::size_type p; // replace $VARIABLES const char* vars[] = { "$MODEM", "$DF_HZ", "$RF_HZ", "$RF_KHZ", "$AF_HZ", "$LF_KHZ", "$CALLSIGN", "$COUNTRY", "$MATCHED_TEXT", "$TEXT" }; for (size_t i = 0; i < sizeof(vars)/sizeof(*vars); i++) { if ((p = edit.find(vars[i])) != string::npos) { replace_var(n, i, buf, sizeof(buf)); edit.replace(p, strlen(vars[i]), buf); } } // replace \X refs with regex substrings strcpy(buf, "\\0"); for (size_t i = 0; i < n.submatch_length; i++, buf[1]++) for (p = 0; (p = edit.find(buf, p)) != string::npos; p = 0) edit.replace(p, 2, n.match_string + n.submatch_offsets[i].rm_so, n.submatch_offsets[i].rm_eo - n.submatch_offsets[i].rm_so); } }; // perform the actions for event n static void notify_notify(const notify_t& n) { // show alert window with timeout if (!n.action.alert.empty()) { string alert = n.action.alert; replace_refs()(n, alert); if (alert.find('%') == string::npos) notify_show_alert(n, alert.c_str()); else { // treat alert text as strftime format string size_t len = alert.length() + 256; char* buf = new char[len]; time_t t = time(NULL); struct tm ts; if (localtime_r(&t, &ts) && strftime(buf, len, alert.c_str(), &ts)) notify_show_alert(n, buf); delete [] buf; } } // append to receive text if (!n.action.rx_marker.empty()) { string text = n.action.rx_marker; replace_refs()(n, text); string::size_type p; if ((p = text.find("$RX_MARKER")) != string::npos) { text[p] = '\0'; note_qrg(false, text.c_str(), text.c_str() + p + strlen("$RX_MARKER"), n.mode, 0LL, n.afreq); } else ReceiveText->addstr(text); } // expand macros and append to transmit text if (!n.action.macro.empty()) { MACROTEXT m; m.text[0] = n.action.macro; replace_refs()(n, m.text[0]); m.execute(0); } // define substring & macro variables and run program if (!n.action.program.empty()) { #ifndef __MINGW32__ switch (fork()) { case -1: LOG_PERROR("fork"); // fall through default: break; case 0: #endif char var[] = "FLDIGI_NOTIFY_STR_0"; string val; for (size_t i = 0; i < n.submatch_length; i++, var[sizeof(var) - 2]++) { val.assign(n.match_string + n.submatch_offsets[i].rm_so, n.submatch_offsets[i].rm_eo - n.submatch_offsets[i].rm_so); setenv(var, val.c_str(), 1); if (i == event_regex[n.event].index) setenv("FLDIGI_NOTIFY_CALLSIGN", val.c_str(), 1); } setenv("FLDIGI_NOTIFY_TEXT", n.match_string, 1); snprintf(var, sizeof(var), "%" PRIuSZ, n.submatch_length); setenv("FLDIGI_NOTIFY_STR_NUM", var, 1); snprintf(var, sizeof(var), "%d", n.afreq); setenv("FLDIGI_NOTIFY_AUDIO_FREQUENCY", var, 1); snprintf(var, sizeof(var), "%u", (unsigned)n.event); setenv("FLDIGI_NOTIFY_EVENT", var, 1); if (n.event == NOTIFY_EVENT_STATION) setenv("FLDIGI_NOTIFY_COUNTRY", n.filter.dxcc_last.c_str(), 1); set_macro_env(); // also set macro variables #ifdef __MINGW32__ char* cmd = strdup(n.action.program.c_str()); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free(cmd); #else execl("/bin/sh", "sh", "-c", n.action.program.c_str(), (char *)NULL); perror("execl"); exit(EXIT_FAILURE); } #endif } } // return true if the event n is a dup static bool notify_is_dup(notify_t& n, const char* str, const regmatch_t* sub, size_t len, time_t now, int afreq, trx_mode mode) { if (!n.dup_ignore) return false; if (n.dup_ref == 0 || n.dup_ref >= len) { LOG_ERROR("Bad dup_ref: %" PRIuSZ " >= %" PRIuSZ, n.dup_ref, len); return false; } const regmatch_t& subidx = sub[n.dup_ref]; string dupstr(subidx.rm_eo - subidx.rm_so, '\0'); transform(str + subidx.rm_so, str + subidx.rm_eo, dupstr.begin(), static_cast(toupper)); notify_dup_t cur = { now, band(wf->rfcarrier()), mode }; if (n.event == NOTIFY_EVENT_RSID) cur.freq = wf->rfcarrier() + (wf->USB() ? afreq : -afreq); notify_seen_t::iterator i; bool is_dup = false; if ((i = n.last_seen.find(dupstr)) != n.last_seen.end()) { const notify_dup_t& prev = i->second; is_dup = (cur.when - prev.when < n.dup.when); if (n.event == NOTIFY_EVENT_RSID) is_dup = is_dup && ::llabs(cur.freq - prev.freq) <= ceil(RSID_PRECISION); if (n.dup.band) is_dup = is_dup && cur.band == prev.band; if (n.dup.mode) is_dup = is_dup && cur.mode == prev.mode; } if (is_dup) return true; n.last_seen[dupstr] = cur; if (n.last_seen.size() > 1) { // remove old data for (i = n.last_seen.begin(); i != n.last_seen.end();) { if (now - i->second.when > n.dup.when) n.last_seen.erase(i++); else ++i; } } return false; } static fre_t notify_filter_call_re("", REG_EXTENDED | REG_NOSUB | REG_ICASE); // Called by the spotter when an event's regular expression matches the decoded text. // Also called by notify_rsid for RSID recepction with: the frequency in afreq, // the mode name in str, the str bounds in the sub array, and len = 1. static void notify_recv(trx_mode mode, int afreq, const char* str, const regmatch_t* sub, size_t len, void* data) { notify_t* n = reinterpret_cast(data); time_t now = time(0); // check if we may trigger this event if (!n->enabled || now - n->last_trigger < n->action.trigger_limit) return; switch (n->event) { case NOTIFY_EVENT_MYCALL: case NOTIFY_EVENT_CUSTOM: case NOTIFY_EVENT_RSID: break; case NOTIFY_EVENT_STATION: size_t re_idx = event_regex[n->event].index; string call(str + sub[re_idx].rm_so, sub[re_idx].rm_eo - sub[re_idx].rm_so); const dxcc* e = dxcc_lookup(call.c_str()); if (n->filter.match == NOTIFY_FILTER_CALLSIGN) { if (e) // remember the country name we found n->filter.dxcc_last = e->country; if (!n->filter.callsign.empty()) { // the callsign must match if (notify_filter_call_re.re() != n->filter.callsign) // compile new re notify_filter_call_re.recompile(n->filter.callsign.c_str()); if (!notify_filter_call_re.match(call.c_str())) return; } else { // check for nwb, lotw, eqsl if (n->filter.nwb && SearchLog(call.c_str())) return; if ((n->filter.lotw || n->filter.eqsl) && qsl_is_open() && !(qsl_lookup(call.c_str()) & (1 << QSL_LOTW | 1 << QSL_EQSL))) return; } } else if (n->filter.match == NOTIFY_FILTER_DXCC) { if (e) { n->filter.dxcc_last = e->country; // if the dxcc filter is not empty, it must contain the country for call if (!n->filter.dxcc.empty() && n->filter.dxcc.find(e->country) == n->filter.dxcc.end()) return; if (n->filter.nwb && qsodb_dxcc_entity_find(e->country)) return; } if ((n->filter.lotw || n->filter.eqsl) && qsl_is_open() && !(qsl_lookup(call.c_str()) & (1 << QSL_LOTW | 1 << QSL_EQSL))) return; } break; } if (!notify_is_dup(*n, str, sub, len, now, afreq, mode)) { n->last_trigger = now; n->afreq = afreq; n->rfreq = wf->rfcarrier(); n->mode = mode; n->match_string = str; n->submatch_offsets = sub; n->submatch_length = min(len, (size_t)10); // whole string + up to 9 user-specified backrefs notify_notify(*n); } } static void notify_set_qsodb_cache(void) { bool v = false; for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) { if (i->event == NOTIFY_EVENT_STATION && i->filter.match == NOTIFY_FILTER_DXCC && i->enabled) { v = true; break; } } dxcc_entity_cache_enable(v); } // register event n with the spotter static void notify_register(notify_t& n) { if (n.event != NOTIFY_EVENT_RSID) spot_register_recv(notify_recv, &n, notify_get_re(n).c_str(), REG_EXTENDED | REG_ICASE); } // unregister event n static void notify_unregister(const notify_t& n) { if (n.event != NOTIFY_EVENT_RSID) spot_unregister_recv(notify_recv, &n); } //////////////////////////////////////////////////////////////////////////////// // callbacks //////////////////////////////////////////////////////////////////////////////// // the event table callback static void notify_select_cb(Fl_Widget* w, void* arg) { int v = tblNotifyList->value(); if (v >= 0) notify_event_to_gui(notify_tmp = *advli(notify_list.begin(), v)); } // the remove button/menu item callback static void notify_remove_cb(Fl_Widget* w, void*) { int v = tblNotifyList->value(); if (v < 0) return; // unregister notify_unregister(*advli(notify_list.begin(), v)); // remove from list notify_list.erase(advli(notify_list.begin(), v)); // remove from table tblNotifyList->removeRow(tblNotifyList->value()); // select next row if (w == btnNotifyRemove) { if (v >= tblNotifyList->rows()) v = tblNotifyList->rows() - 1; if (v >= 0) { tblNotifyList->value(v); notify_select_cb(tblNotifyList, 0); } } notify_save(); } enum { NOTIFY_CHECK_CUSTOM_RE_EMPTY = 1 << 0, NOTIFY_CHECK_CUSTOM_RE_VALID = 1 << 1, NOTIFY_CHECK_MYCALL_NOT_EMPTY = 1 << 2 }; // do some sanity checks on the widget values before adding/updating an event static bool notify_check(unsigned check) { if (mnuNotifyEvent->value() == NOTIFY_EVENT_CUSTOM) { if (check & NOTIFY_CHECK_CUSTOM_RE_EMPTY) { if (!inpNotifyRE->size()) { fl_alert2(_("The regular expression field must not be empty.")); return false; } } if (check & NOTIFY_CHECK_CUSTOM_RE_VALID) { if (!fre_t(inpNotifyRE->value(), REG_EXTENDED | REG_ICASE)) { fl_alert2(_("The regular expression must be valid.")); return false; } } } if ((check & NOTIFY_CHECK_MYCALL_NOT_EMPTY) && mnuNotifyEvent->value() == NOTIFY_EVENT_MYCALL) { if (progdefaults.myCall.empty()) { fl_alert2(_("Please set your callsign first.")); return false; } } // ... return true; } // the add button callback static void notify_add_cb(Fl_Widget* w, void* arg) { if (!notify_check(~0)) return; notify_gui_to_event(notify_tmp); // add to list notify_list.push_back(notify_tmp); // add to table notify_table_append(notify_list.back()); // register with spotter notify_register(notify_list.back()); // save file notify_save(); } // the update button/menu item callback static void notify_update_cb(Fl_Widget* w, void* arg) { int v = tblNotifyList->value(); if (v < 0) return; if (!notify_check(~0)) return; notify_t& nv = *advli(notify_list.begin(), v); if ((intptr_t)arg != NOTIFY_LIST_MENU_TOGGLE) { notify_gui_to_event(notify_tmp); nv = notify_tmp; if (nv.dup_ignore) nv.last_seen.clear(); } else { // only toggle the enabled status nv.enabled = !nv.enabled; btnNotifyEnabled->value(nv.enabled); } if (!nv.enabled) notify_unregister(nv); else { notify_unregister(nv); notify_register(nv); } notify_table_reload(); tblNotifyList->value(v); notify_save(); } // the event selection menu callback static void notify_event_cb(Fl_Widget* w, void* arg) { notify_event_t e = static_cast(reinterpret_cast(w)->value()); switch (e) { case NOTIFY_EVENT_MYCALL: mnuNotifyDupWhich->activate(); chkNotifyDupBand->activate(); chkNotifyDupMode->activate(); grpNotifyFilter->deactivate(); chkNotifyFilterCall->value(0); inpNotifyFilterCall->hide(); chkNotifyFilterDXCC->value(0); btnNotifyFilterDXCC->hide(); chkNotifyFilterNWB->value(0); chkNotifyFilterLOTW->value(0); chkNotifyFilterEQSL->value(0); inpNotifyRE->value(0); inpNotifyRE->hide(); btnNotifyActionDialogDefault->show(); break; case NOTIFY_EVENT_STATION: mnuNotifyDupWhich->activate(); chkNotifyDupBand->activate(); chkNotifyDupMode->activate(); grpNotifyFilter->activate(); if (!chkNotifyFilterCall->value() && !chkNotifyFilterDXCC->value()) { chkNotifyFilterCall->value(1); inpNotifyFilterCall->show(); } inpNotifyRE->value(0); inpNotifyRE->hide(); btnNotifyActionDialogDefault->show(); break; case NOTIFY_EVENT_CUSTOM: mnuNotifyDupWhich->activate(); chkNotifyDupBand->activate(); chkNotifyDupMode->activate(); grpNotifyFilter->deactivate(); chkNotifyFilterCall->value(0); inpNotifyFilterCall->hide(); chkNotifyFilterDXCC->value(0); btnNotifyFilterDXCC->hide(); chkNotifyFilterNWB->value(0); chkNotifyFilterLOTW->value(0); chkNotifyFilterEQSL->value(0); inpNotifyRE->show(); break; case NOTIFY_EVENT_RSID: grpNotifyFilter->deactivate(); chkNotifyFilterCall->value(0); inpNotifyFilterCall->hide(); chkNotifyFilterDXCC->value(0); btnNotifyFilterDXCC->hide(); chkNotifyFilterNWB->value(0); chkNotifyFilterLOTW->value(0); chkNotifyFilterEQSL->value(0); inpNotifyRE->value(0); inpNotifyRE->hide(); btnNotifyActionDialogDefault->show(); // limited dup handling mnuNotifyDupWhich->deactivate(); chkNotifyDupBand->value(0); chkNotifyDupBand->deactivate(); chkNotifyDupMode->value(1); chkNotifyDupMode->deactivate(); break; } if (arg == NOTIFY_SET_DUP_MENU) { notify_gui_to_event(notify_tmp); notify_set_event_dup(notify_tmp); } w->parent()->redraw(); } // the program filesystem browse button callback static void notify_program_select_cb(Fl_Widget* w, void* arg) { const char* fn = FSEL::select(_("Run program"), "", 0, 0); if (fn) { inpNotifyActionProgram->value(fn); // quote program path inpNotifyActionProgram->position(0); inpNotifyActionProgram->insert("\"", 1); inpNotifyActionProgram->position(inpNotifyActionProgram->size()); inpNotifyActionProgram->insert("\"", 1); } } // the test button callback static void notify_test_cb(Fl_Widget* w, void* arg) { notify_gui_to_event(notify_tmp); if (notify_tmp.event == NOTIFY_EVENT_RSID) { notify_tmp.mode = active_modem->get_mode(); regmatch_t sub[2] = { { 0, (regoff_t)strlen(mode_info[notify_tmp.mode].name) } }; sub[1] = sub[0]; notify_recv(notify_tmp.mode, active_modem->get_freq(), mode_info[notify_tmp.mode].name, sub, 2, ¬ify_tmp); return; } string test_strings[3]; test_strings[NOTIFY_EVENT_MYCALL].assign(progdefaults.myCall).append(" de n0call"); test_strings[NOTIFY_EVENT_STATION] = "cq de n0call n0call "; static string test; if (test.empty()) test = test_strings[notify_tmp.event]; string msg; msg.assign(_("Default test string is:\n \"")).append(test_strings[notify_tmp.event]).append("\"\n") .append(_("Enter test string or leave blank for default:")); const char* s = fl_input2("%s", msg.c_str(), test.c_str()); if (s) { if (test.assign(s).empty()) // empty input test = test_strings[notify_tmp.event]; } else // cancelled return; fre_t re(notify_get_re(notify_tmp).c_str(), REG_EXTENDED | REG_ICASE); if (!re) fl_alert2(_("This event's regular expression is invalid.")); else if (re.match(test.c_str())) { const vector& o = re.suboff(); notify_recv(active_modem->get_mode(), active_modem->get_freq(), test.c_str(), &o[0], o.size(), ¬ify_tmp); } else fl_message2(_("The test string did not match this event's search pattern.")); } // the macro editor button callback static void notify_macro_edit_cb(Fl_Widget* w, void* arg) { editMacro(0, MACRO_EDIT_INPUT, inpNotifyActionMacro); } // the insert default alert text button callback static void notify_dialog_default_cb(Fl_Widget* w, void* arg) { size_t i = CLAMP((size_t)mnuNotifyEvent->value(), 0, sizeof(default_alert_text)/sizeof(*default_alert_text) - 1); string s = default_alert_text[i]; if (s.empty()) { // custom search; count and list refs size_t nsub = min(fre_t(inpNotifyRE->value(), REG_EXTENDED | REG_ICASE).nsub(), (size_t)9); if (nsub) { s.assign(_("Available substrings")).append(":\n\\0\n"); char ref[] = "\\1"; for (size_t i = 1; i < nsub; i++, ref[1]++) s.append(ref).append("\n"); } } inpNotifyActionDialog->value(s.c_str()); } // the insert default RX text button callback static void notify_rx_default_cb(Fl_Widget* w, void* arg) { if (mnuNotifyEvent->value() == NOTIFY_EVENT_RSID) inpNotifyActionRXMarker->value("\nRSID: $RX_MARKER\n"); else inpNotifyActionRXMarker->value("\n$RX_MARKER\n"); } // the ignore duplicates check button callback void notify_dup_ignore_cb(Fl_Widget* w, void* arg) { if (static_cast(w)->value()) { mnuNotifyDupWhich->show(); cntNotifyDupTime->show(); chkNotifyDupBand->show(); chkNotifyDupMode->show(); } else { mnuNotifyDupWhich->hide(); cntNotifyDupTime->hide(); chkNotifyDupBand->hide(); chkNotifyDupMode->hide(); } w->parent()->redraw(); } // the custom re field callback static void notify_re_cb(Fl_Widget* w, void* arg) { notify_set_event_dup_menu(static_cast(w)->value()); } //////////////////////////////////////////////////////////////////////////////// // dup widget handling //////////////////////////////////////////////////////////////////////////////// // set the dup menu substrings for regular epxression string re static void notify_set_event_dup_menu(const char* re) { int v = mnuNotifyDupWhich->value(); size_t nref = fre_t(re, REG_EXTENDED).nsub(); for (size_t i = 0; i < sizeof(notify_dup_refs_menu)/sizeof(*notify_dup_refs_menu); i++) notify_dup_refs_menu[i].hide(); if (nref) { size_t i; for (i = 1; i < nref; i++) notify_dup_refs_menu[i].show(); if ((size_t)v == nref) v = mnuNotifyDupWhich->size() - 1; else v = 1; } else v = 0; mnuNotifyDupWhich->value(v); mnuNotifyDupWhich->redraw(); } // set the dup group widgets for event n static void notify_set_event_dup(const notify_t& n) { size_t i; for (i = 0; i < sizeof(notify_dup_refs_menu)/sizeof(*notify_dup_refs_menu); i++) notify_dup_refs_menu[i].hide(); switch (n.event) { case NOTIFY_EVENT_MYCALL: case NOTIFY_EVENT_STATION: case NOTIFY_EVENT_RSID: i = event_regex[n.event].index; mnuNotifyDupWhich->menu(notify_dup_callsign_menu); for (size_t j = 0; j < sizeof(notify_dup_callsign_menu)/sizeof(*notify_dup_callsign_menu) - 1; j++) notify_dup_callsign_menu[j].hide(); notify_dup_callsign_menu[i].show(); if (n.event == NOTIFY_EVENT_RSID) notify_dup_callsign_menu[i].label(_("Frequency")); else notify_dup_callsign_menu[i].label(_("Callsign")); mnuNotifyDupWhich->value(i); break; case NOTIFY_EVENT_CUSTOM: mnuNotifyDupWhich->menu(notify_dup_refs_menu); notify_set_event_dup_menu(notify_get_re(n).c_str()); break; } } //////////////////////////////////////////////////////////////////////////////// // DXCC list //////////////////////////////////////////////////////////////////////////////// // set the toggle status of row i to cond static void notify_dxcc_row_check(int i, bool cond = true) { *tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_SEL) = "["[!cond]; } // toggle the checked status of row i, return new status static bool notify_dxcc_row_toggle(int i) { char* p = tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_SEL); return (*p = "["[!!*p]); } // return checked status of row i static bool notify_dxcc_row_checked(int i) { return *tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_SEL); } // the dxcc list select/deselect callback static void notify_filter_dxcc_select_cb(Fl_Widget* w, void* arg) { bool val; const char* str; int row = tblNotifyFilterDXCC->value(); int col; intptr_t iarg = (intptr_t)arg; switch (iarg) { case NOTIFY_DXCC_SELECT_CONT: case NOTIFY_DXCC_DESELECT_CONT: str = tblNotifyFilterDXCC->valueAt(row, col = NOTIFY_DXCC_COL_CT); val = (iarg == NOTIFY_DXCC_SELECT_CONT); break; case NOTIFY_DXCC_SELECT_ITU: case NOTIFY_DXCC_DESELECT_ITU: str = tblNotifyFilterDXCC->valueAt(row, col = NOTIFY_DXCC_COL_ITU); val = (iarg == NOTIFY_DXCC_SELECT_ITU); break; case NOTIFY_DXCC_SELECT_CQ: case NOTIFY_DXCC_DESELECT_CQ: str = tblNotifyFilterDXCC->valueAt(row, col = NOTIFY_DXCC_COL_CQ); val = (iarg == NOTIFY_DXCC_SELECT_CQ); break; case NOTIFY_DXCC_SELECT_ALL: for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) notify_dxcc_row_check(i); goto redraw; case NOTIFY_DXCC_DESELECT_ALL: for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) notify_dxcc_row_check(i, false); goto redraw; default: return; } for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) { if (!strcmp(tblNotifyFilterDXCC->valueAt(i, col), str)) notify_dxcc_row_check(i, val); } redraw: tblNotifyFilterDXCC->redraw(); } // the dxcc search field callback static void notify_filter_dxcc_search(Fl_Widget* w, void* arg) { if (w == inpNotifyDXCCSearchCallsign) { const dxcc* e = dxcc_lookup(inpNotifyDXCCSearchCallsign->value()); if (e) { inpNotifyDXCCSearchCountry->value(e->country); inpNotifyDXCCSearchCountry->do_callback(); inpNotifyDXCCSearchCountry->position(0); } return; } if (unlikely(!inpNotifyDXCCSearchCountry->size())) return; int col = 1, row = tblNotifyFilterDXCC->value() + 1; row = WCLAMP(row, 0, tblNotifyFilterDXCC->rows() - 1); if (tblNotifyFilterDXCC->search(row, col, false, inpNotifyDXCCSearchCountry->value())) { int when = tblNotifyFilterDXCC->when(); tblNotifyFilterDXCC->when(FL_WHEN_NEVER); tblNotifyFilterDXCC->GotoRow(row); tblNotifyFilterDXCC->when(when); inpNotifyDXCCSearchCountry->textcolor(FL_FOREGROUND_COLOR); } else inpNotifyDXCCSearchCountry->textcolor(FL_RED); inpNotifyDXCCSearchCountry->redraw(); } // the dxcc filter selection button callback static void notify_dxcc_browse_cb(Fl_Widget* w, void* arg) { int v = tblNotifyList->value(); if (v < 0) // no selection, uncheck all rows btnNotifyDXCCDeselect->do_callback(); else { const notify_t& n = *advli(notify_list.begin(), v); for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) notify_dxcc_row_check(i, n.filter.dxcc.find(tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_CN)) != n.filter.dxcc.end()); } notify_dxcc_show(false); } // the dxcc table callback static void notify_dxcc_check_cb(Fl_Widget* w, void* arg) { if (Fl::event_button() != FL_LEFT_MOUSE || (Fl::event() == FL_KEYDOWN && !Fl::event_shift())) return; int sel = tblNotifyFilterDXCC->value(); const char* country = tblNotifyFilterDXCC->valueAt(sel, NOTIFY_DXCC_COL_CN); if (notify_dxcc_row_toggle(sel)) notify_tmp.filter.dxcc[country] = true; else notify_tmp.filter.dxcc.erase(country); } //////////////////////////////////////////////////////////////////////////////// // storage functions //////////////////////////////////////////////////////////////////////////////// // save the event list static void notify_save(void) { notify_set_qsodb_cache(); remove(string(HomeDir).append("/").append("notify.prefs").c_str()); Fl_Preferences ndata(HomeDir.c_str(), PACKAGE_TARNAME, "notify"); ndata.set("items", static_cast(notify_list.size())); char group[8]; size_t num = 0; for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) { snprintf(group, sizeof(group), "item%" PRIuSZ, num++); ndata.set(Fl_Preferences::Name("%s/event", group), i->event); if (i->event >= NOTIFY_EVENT_CUSTOM) ndata.set(Fl_Preferences::Name("%s/re", group), i->re.c_str()); ndata.set(Fl_Preferences::Name("%s/enabled", group), i->enabled); ndata.set(Fl_Preferences::Name("%s/action/alert", group), i->action.alert.c_str()); ndata.set(Fl_Preferences::Name("%s/action/rx_marker", group), i->action.rx_marker.c_str()); ndata.set(Fl_Preferences::Name("%s/action/macro", group), i->action.macro.c_str()); ndata.set(Fl_Preferences::Name("%s/action/program", group), i->action.program.c_str()); ndata.set(Fl_Preferences::Name("%s/action/trigger_limit", group), static_cast(i->action.trigger_limit)); ndata.set(Fl_Preferences::Name("%s/action/alert_timeout", group), static_cast(i->action.alert_timeout)); ndata.set(Fl_Preferences::Name("%s/filter/match", group), i->filter.match); ndata.set(Fl_Preferences::Name("%s/filter/callsign", group), i->filter.callsign.c_str()); ndata.set(Fl_Preferences::Name("%s/filter/nwb", group), i->filter.nwb); ndata.set(Fl_Preferences::Name("%s/filter/lotw", group), i->filter.lotw); ndata.set(Fl_Preferences::Name("%s/filter/eqsl", group), i->filter.eqsl); int k = 0; for (notify_filter_dxcc_t::const_iterator j = i->filter.dxcc.begin(); j != i->filter.dxcc.end() && j->second; ++j) { ndata.set(Fl_Preferences::Name("%s/filter/dxcc/%d", group, k++), j->first.c_str()); } ndata.set(Fl_Preferences::Name("%s/dup/ignore", group), i->dup_ignore); ndata.set(Fl_Preferences::Name("%s/dup/ref", group), static_cast(i->dup_ref)); ndata.set(Fl_Preferences::Name("%s/dup/when", group), static_cast(i->dup.when)); ndata.set(Fl_Preferences::Name("%s/dup/band", group), i->dup.band); ndata.set(Fl_Preferences::Name("%s/dup/mode", group), static_cast(i->dup.mode)); } } // load the event list static void notify_load(void) { int x; char s[512]; s[sizeof(s)-1] = '\0'; Fl_Preferences ndata(HomeDir.c_str(), PACKAGE_TARNAME, "notify"); if (!ndata.get("items", x, 0) || x <= 0) return; size_t n = static_cast(x); char group[8]; for (size_t i = 0; i < n; i++) { notify_t nitem; snprintf(group, sizeof(group), "item%" PRIuSZ, i); ndata.get(Fl_Preferences::Name("%s/event", group), x, 0); nitem.event = static_cast(x); nitem.last_trigger = 0; if (nitem.event >= NOTIFY_EVENT_CUSTOM) { ndata.get(Fl_Preferences::Name("%s/re", group), s, "", sizeof(s)-1); nitem.re = s; } else nitem.re = event_regex[nitem.event].regex; ndata.get(Fl_Preferences::Name("%s/enabled", group), x, 1); nitem.enabled = x; ndata.get(Fl_Preferences::Name("%s/action/alert", group), s, "", sizeof(s)-1); nitem.action.alert = s; ndata.get(Fl_Preferences::Name("%s/action/macro", group), s, "", sizeof(s)-1); nitem.action.macro = s; ndata.get(Fl_Preferences::Name("%s/action/rx_marker", group), s, "", sizeof(s)-1); nitem.action.rx_marker = s; ndata.get(Fl_Preferences::Name("%s/action/program", group), s, "", sizeof(s)-1); nitem.action.program = s; ndata.get(Fl_Preferences::Name("%s/action/trigger_limit", group), x, 0); nitem.action.trigger_limit = x; ndata.get(Fl_Preferences::Name("%s/action/alert_timeout", group), x, 5); nitem.action.alert_timeout = x; ndata.get(Fl_Preferences::Name("%s/filter/match", group), x, 0); nitem.filter.match = static_cast(x); ndata.get(Fl_Preferences::Name("%s/filter/callsign", group), s, "", sizeof(s)-1); nitem.filter.callsign = s; ndata.get(Fl_Preferences::Name("%s/filter/nwb", group), x, 0); nitem.filter.nwb = x; ndata.get(Fl_Preferences::Name("%s/filter/lotw", group), x, 0); nitem.filter.lotw = x; ndata.get(Fl_Preferences::Name("%s/filter/eqsl", group), x, 0); nitem.filter.eqsl = x; for (int k = 0; ndata.get(Fl_Preferences::Name("%s/filter/dxcc/%d", group, k), s, "", sizeof(s)-1); k++) nitem.filter.dxcc[s] = true; ndata.get(Fl_Preferences::Name("%s/dup/ignore", group), x, 0); nitem.dup_ignore = x; ndata.get(Fl_Preferences::Name("%s/dup/ref", group), x, 0); nitem.dup_ref = x; ndata.get(Fl_Preferences::Name("%s/dup/when", group), x, 600); nitem.dup.when = x; ndata.get(Fl_Preferences::Name("%s/dup/band", group), x, 0); nitem.dup.band = static_cast(x); ndata.get(Fl_Preferences::Name("%s/dup/mode", group), x, 0); nitem.dup.mode = static_cast(x); notify_list.push_back(nitem); } notify_table_reload(); } fldigi-3.21.80/src/dtmf/0000775000175000017500000000000012313333725011651 500000000000000fldigi-3.21.80/src/dtmf/dtmf.cxx0000664000175000017500000001526612313064025013253 00000000000000// ---------------------------------------------------------------------------- // // DTMF.cxx // // Copyright (C) 2011 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "trx.h" #include "dtmf.h" #include "misc.h" #include "fl_digi.h" #include "configuration.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "main.h" LOG_FILE_SOURCE(debug::LOG_MODEM); // tones in 4x4 array // 697 770 842 941 1209 1336 1447 1633 int cDTMF::row[] = {697, 770, 852, 941}; int cDTMF::col[] = {1209, 1336, 1477, 1633}; const char cDTMF::rc[] = "123A456B789C*0#D"; //====================================================================== // DTMF tone receive //====================================================================== // tone #s and coefficients // 8000 Hz sampling N == 240 // 11025 Hz sampling N == 331 /* * calculate the power of each tone using Goertzel filters */ void cDTMF::calc_power() { double sr = active_modem->get_samplerate(); // reset row freq filters for (int i = 0; i < 4; i++) filt[i]->reset(240, row[i], sr); // reset col freq filters for (int i = 0; i < 4; i++) filt[i+4]->reset(240, col[i], sr); for (int i = 0; i < framesize; i++) for (int j = 0; j < NUMTONES; j++) filt[j]->run(data[i]); for (int i = 0; i < NUMTONES; i++) power[i] = filt[i]->mag(); maxpower = 0; minpower = 1e6; for (int i = 0; i < NUMTONES;i++) { if (power[i] > maxpower) maxpower = power[i]; if (power[i] < minpower) minpower = power[i]; } if ( minpower == 0 ) minpower = 1e-3; } /* * detect which signals are present. * */ int cDTMF::decode() { calc_power(); if (maxpower < (10 * progStatus.sldrSquelchValue)) return ' '; int r = -1, c = -1; double pwr = 0; for (int i = 0; i < 4; i++) if (power[i] > pwr) { pwr = power[i]; r = i; } pwr = 0; for (int i = 0; i < 4; i++) if (power[i+4] > pwr) { pwr = power[i+4]; c = i; } if (r == -1 || c == -1) return ' '; return rc[r*4 + c]; } /* * read in frames, output the decoded * results */ void cDTMF::receive(const float* buf, size_t len) { int x; static size_t dptr = 0; size_t bufptr = 0; if (!progdefaults.DTMFdecode) return; framesize = (active_modem->get_samplerate() == 8000) ? 240 : 331; while (1) { int i; for ( i = dptr; i < framesize; i++) { data[i] = buf[bufptr]; bufptr++; if (bufptr == len) break; } if (i < framesize) { dptr = i + 1; return; } dptr = 0; x = decode(); if (x == ' ') { silence_time++; if (silence_time == 4 && !dtmfchars.empty()) dtmfchars += ' '; if (silence_time == FLUSH_TIME) { if (!dtmfchars.empty()) { REQ(showDTMF, dtmfchars); dtmfchars.clear(); } silence_time = 0; } } else { silence_time = 0; if (x != last && last == ' ') dtmfchars += x; } last = x; } } //====================================================================== // DTMF tone transmit //====================================================================== void cDTMF::makeshape() { for (int i = 0; i < 128; i++) shape[i] = 1.0; for (int i = 0; i < RT; i++) shape[i] = 0.5 * (1.0 - cos (M_PI * i / RT)); } //---------------------------------------------------------------------- // transmit silence for specified time duration in milliseconds //---------------------------------------------------------------------- void cDTMF::silence(int len) { double sr = active_modem->get_samplerate(); int length = len * sr / 1000; if (length > 16384) length = 16384; memset(outbuf, 0, length * sizeof(*outbuf)); active_modem->ModulateXmtr(outbuf, length); } //---------------------------------------------------------------------- // transmit DTMF tones for specific time interval //---------------------------------------------------------------------- void cDTMF::two_tones(int ch) { if (!strchr(rc, ch)) return; int pos = strchr(rc, ch) - rc; int r = pos / 4; int c = pos % 4; double sr = active_modem->get_samplerate(); double phaseincr = 2.0 * M_PI * row[r] / sr; double phase = 0; int length = duration * sr / 1000; if (length > 16384) length = 16384; for (int i = 0; i < length; i++) { outbuf[i] = 0.5 * sin(phase); phase += phaseincr; } phaseincr = 2.0 * M_PI * col[c] / sr; phase = 0; for (int i = 0; i < length; i++) { outbuf[i] += 0.5 * sin(phase); phase += phaseincr; } for (int i = 0; i < RT; i++) { outbuf[i] *= shape[i]; outbuf[length - 1 - i] *= shape[i]; } active_modem->ModulateXmtr(outbuf, length); } //---------------------------------------------------------------------- // transmit the string contained in progdefaults.DTMFstr and output as // dtmf valid characters, 0-9, *, #, A-D // each pair of tones is separated by 50ms silence // 500 msec silence for ' ', ',' or '-' // 50 msec silence for invalid characters //---------------------------------------------------------------------- void cDTMF::send() { int c = 0, delay = 0; duration = 50; RT = (int)(active_modem->get_samplerate() * 4 / 1000.0); // 4 msec edge makeshape(); size_t colon = std::string::npos; size_t modifier = progdefaults.DTMFstr.find("W"); if (modifier != std::string::npos) { delay = atoi(&progdefaults.DTMFstr[modifier + 1]); colon = progdefaults.DTMFstr.find(':', modifier); progdefaults.DTMFstr.erase(modifier, colon - modifier + 1); } modifier = progdefaults.DTMFstr.find('L'); if (modifier != std::string::npos) { duration = atoi(&progdefaults.DTMFstr[modifier + 1]); colon = progdefaults.DTMFstr.find(':', modifier); progdefaults.DTMFstr.erase(modifier, colon - modifier + 1); } while (delay > 50) { silence(50); delay -= 50;} if (delay) silence(delay); for(size_t i = 0; i < progdefaults.DTMFstr.length(); i++) { c = progdefaults.DTMFstr[i]; if (c == ' ' || c == ',' || c == '-') silence(duration); else if ( (c >= '0' && c <= '9') || c == '*' || c == '#' || (c >= 'A' && c <= 'D') ) two_tones(c); silence(duration); } progdefaults.DTMFstr.clear(); } fldigi-3.21.80/src/libtiniconv/0000775000175000017500000000000012313333727013241 500000000000000fldigi-3.21.80/src/libtiniconv/tiniconv_int.h0000664000175000017500000000272012313064025016026 00000000000000/* * This file is part of the TINICONV Library. * * The TINICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License version 3 as published by the Free Software Foundation. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef TINICONV_INT_H_ #define TINICONV_INT_H_ #include "tiniconv.h" #define RET_ILSEQ -1 #define RET_TOOFEW(n) (-2-(n)) #define RET_ILUNI -1 #define RET_TOOSMALL -2 extern const struct tiniconv_charset_map_entry_s { xxx_mb2wc_t mb2wc; xxx_flushwc_t flushwc; xxx_wc2mb_t wc2mb; xxx_reset_t reset; } tiniconv_charset_map[]; typedef struct { unsigned short indx; /* index into big table */ unsigned short used; /* bitmask of used entries */ } Summary16; #define TINICONV_OPTION_GET_OUT_ILSEQ_CHAR(options) ((options >> 8) & 0xFF) #endif /*TINICONV_INT_H_*/ fldigi-3.21.80/src/libtiniconv/COPYING0000664000175000017500000010451312313064025014210 00000000000000 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 . fldigi-3.21.80/src/libtiniconv/AUTHORS0000664000175000017500000000005412313064025014220 00000000000000Roman Rybalko fldigi-3.21.80/src/libtiniconv/README0000664000175000017500000000053212313064025014031 00000000000000tiniconv - is a charset conversion library, based on libiconv (uses it's converters). Intended to be used in embedded systems and other resource-critical facilities. Doesn't use any memory management/file system calls, any OS calls at all - COPMPLETELY OS-INDEPENDENT (supposed to be, at least;). Tested on LE x32 and x64 8086-like systems. fldigi-3.21.80/src/libtiniconv/tiniconv_desc.c0000664000175000017500000001340612313064025016150 00000000000000/* * This file is part of the TINICONV Library. * * The TINICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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 . // ---------------------------------------------------------------------------- #include "tiniconv_int.h" #include #define abort() assert(0) #define NULL 0 #include "encdec/ascii.h" #include "encdec/cp1250.h" #include "encdec/cp1251.h" #include "encdec/cp1252.h" #include "encdec/cp1253.h" #include "encdec/cp1254.h" #include "encdec/cp1255.h" #include "encdec/cp1256.h" #include "encdec/cp1257.h" #include "encdec/cp1258.h" #include "encdec/iso8859_1.h" #include "encdec/iso8859_2.h" #include "encdec/iso8859_3.h" #include "encdec/iso8859_4.h" #include "encdec/iso8859_5.h" #include "encdec/iso8859_6.h" #include "encdec/iso8859_7.h" #include "encdec/iso8859_8.h" #include "encdec/iso8859_9.h" #include "encdec/iso8859_10.h" #include "encdec/iso8859_11.h" #include "encdec/iso8859_13.h" #include "encdec/iso8859_14.h" #include "encdec/iso8859_15.h" #include "encdec/iso8859_16.h" #include "encdec/cp866.h" #include "encdec/koi8_r.h" #include "encdec/koi8_ru.h" #include "encdec/koi8_u.h" #include "encdec/mac_cyrillic.h" #include "encdec/ucs2.h" #include "encdec/utf7.h" #include "encdec/utf8.h" #include "encdec/gb2312.h" /* is needed for euc_cn.h */ #include "encdec/euc_cn.h" #include "encdec/gbk.h" #include "encdec/ces_gbk.h" #include "encdec/big5.h" /* is needed for ces_big5.h */ #include "encdec/ces_big5.h" #include "encdec/jisx0208.h" #include "encdec/jisx0201.h" #include "encdec/cp936.h" #include "encdec/iso2022_jp.h" const struct tiniconv_charset_map_entry_s tiniconv_charset_map[] = { {ascii_mbtowc, NULL, ascii_wctomb, NULL }, /* 0 */ {cp1250_mbtowc, NULL, cp1250_wctomb, NULL }, /* 1 */ {cp1251_mbtowc, NULL, cp1251_wctomb, NULL }, /* 2 */ {cp1252_mbtowc, NULL, cp1252_wctomb, NULL }, /* 3 */ {cp1253_mbtowc, NULL, cp1253_wctomb, NULL }, /* 4 */ {cp1254_mbtowc, NULL, cp1254_wctomb, NULL }, /* 5 */ {cp1255_mbtowc, cp1255_flushwc, cp1255_wctomb, NULL }, /* 6 */ {cp1256_mbtowc, NULL, cp1256_wctomb, NULL }, /* 7 */ {cp1257_mbtowc, NULL, cp1257_wctomb, NULL }, /* 8 */ {cp1258_mbtowc, cp1258_flushwc, cp1258_wctomb, NULL }, /* 9 */ {cp936_mbtowc, NULL, cp936_wctomb, NULL }, /* 10 */ {euc_cn_mbtowc, NULL, euc_cn_wctomb, NULL }, /* 11 */ {gbk_mbtowc, NULL, gbk_wctomb, NULL }, /* 12 */ {iso2022_jp_mbtowc, NULL, iso2022_jp_wctomb, iso2022_jp_reset}, /* 13 */ {iso8859_1_mbtowc, NULL, iso8859_1_wctomb, NULL }, /* 14 */ {iso8859_2_mbtowc, NULL, iso8859_2_wctomb, NULL }, /* 15 */ {iso8859_3_mbtowc, NULL, iso8859_3_wctomb, NULL }, /* 16 */ {iso8859_4_mbtowc, NULL, iso8859_4_wctomb, NULL }, /* 17 */ {iso8859_5_mbtowc, NULL, iso8859_5_wctomb, NULL }, /* 18 */ {iso8859_6_mbtowc, NULL, iso8859_6_wctomb, NULL }, /* 19 */ {iso8859_7_mbtowc, NULL, iso8859_7_wctomb, NULL }, /* 20 */ {iso8859_8_mbtowc, NULL, iso8859_8_wctomb, NULL }, /* 21 */ {iso8859_9_mbtowc, NULL, iso8859_9_wctomb, NULL }, /* 22 */ {iso8859_10_mbtowc, NULL, iso8859_10_wctomb, NULL }, /* 23 */ {iso8859_11_mbtowc, NULL, iso8859_11_wctomb, NULL }, /* 24 */ {iso8859_13_mbtowc, NULL, iso8859_13_wctomb, NULL }, /* 25 */ {iso8859_14_mbtowc, NULL, iso8859_14_wctomb, NULL }, /* 26 */ {iso8859_15_mbtowc, NULL, iso8859_15_wctomb, NULL }, /* 27 */ {iso8859_16_mbtowc, NULL, iso8859_16_wctomb, NULL }, /* 28 */ {cp866_mbtowc, NULL, cp866_wctomb, NULL }, /* 29 */ {koi8_r_mbtowc, NULL, koi8_r_wctomb, NULL }, /* 30 */ {koi8_ru_mbtowc, NULL, koi8_ru_wctomb, NULL }, /* 31 */ {koi8_u_mbtowc, NULL, koi8_u_wctomb, NULL }, /* 32 */ {mac_cyrillic_mbtowc, NULL, mac_cyrillic_wctomb, NULL }, /* 33 */ {ucs2_mbtowc, NULL, ucs2_wctomb, NULL }, /* 34 */ {utf7_mbtowc, NULL, utf7_wctomb, utf7_reset }, /* 35 */ {utf8_mbtowc, NULL, utf8_wctomb, NULL }, /* 36 */ {gb2312_mbtowc, NULL, gb2312_wctomb, NULL }, /* 37, CHINESE */ {ces_big5_mbtowc, NULL, ces_big5_wctomb, NULL }, /* 38 */ {NULL, NULL, NULL, NULL } }; fldigi-3.21.80/src/libtiniconv/tiniconv.c0000664000175000017500000001011112313064025015140 00000000000000/* * This file is part of the TINICONV Library. * * The TINICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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 . // ---------------------------------------------------------------------------- #include "tiniconv.h" #include "tiniconv_int.h" #include #include int tiniconv_init(int in_charset_id, int out_charset_id, int options, struct tiniconv_ctx_s *ctx) { assert(ctx != NULL); if (in_charset_id < 0 || in_charset_id >= TINICONV_CHARSETSIZE) return TINICONV_INIT_IN_CHARSET_NA; if (out_charset_id < 0 || out_charset_id >= TINICONV_CHARSETSIZE) return TINICONV_INIT_OUT_CHARSET_NA; memset(ctx, 0, sizeof(*ctx)); ctx->mb2wc = tiniconv_charset_map[in_charset_id].mb2wc; ctx->flushwc = tiniconv_charset_map[in_charset_id].flushwc; ctx->wc2mb = tiniconv_charset_map[out_charset_id].wc2mb; ctx->reset = tiniconv_charset_map[out_charset_id].reset; ctx->options = options; if (!TINICONV_OPTION_GET_OUT_ILSEQ_CHAR(options)) ctx->options = ctx->options | TINICONV_OPTION_OUT_ILSEQ_CHAR('?'); return TINICONV_INIT_OK; } int tiniconv_convert(struct tiniconv_ctx_s *ctx, unsigned char const *in_buf, int in_size, int *p_in_size_consumed, unsigned char *out_buf, int out_size, int *p_out_size_consumed) { ucs4_t wc; int in_idx, out_idx; int result, last_result; conv_state_t last_istate; assert(ctx != NULL); assert(in_buf != NULL); assert(out_buf != NULL); for (in_idx = 0, out_idx = 0; in_idx < in_size && out_idx < out_size;) { last_istate = ctx->istate; /* typedef int (*xxx_mb2wc_t) (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n); */ result = ctx->mb2wc(ctx, &wc, in_buf + in_idx, in_size - in_idx); assert(result <= in_size - in_idx); if (result < 0) { if (result == RET_ILSEQ) { if (ctx->options & TINICONV_OPTION_IGNORE_IN_ILSEQ) { ctx->istate = 0; in_idx ++; continue; } else { result = TINICONV_CONVERT_IN_ILSEQ; goto exit; } } else if (result == RET_TOOSMALL) { result = TINICONV_CONVERT_IN_TOO_SMALL; goto exit; } else { in_idx += RET_TOOFEW(result); continue; } } in_idx += last_result = result; /* typedef int (*xxx_wc2mb_t) (conv_t conv, unsigned char *r, ucs4_t wc, int n); */ result = ctx->wc2mb(ctx, out_buf + out_idx, wc, out_size - out_idx); assert(result <= out_size - out_idx); if (result < 0) { if (result == RET_ILUNI) { if (ctx->options & TINICONV_OPTION_IGNORE_OUT_ILSEQ) { out_buf[out_idx ++] = TINICONV_OPTION_GET_OUT_ILSEQ_CHAR(ctx->options); ctx->ostate = 0; continue; } else { result = TINICONV_CONVERT_OUT_ILSEQ; in_idx -= last_result; /* discarding the last read sequence */ ctx->istate = last_istate; goto exit; } } else if (result == RET_TOOSMALL) { result = TINICONV_CONVERT_OUT_TOO_SMALL; in_idx -= last_result; /* discarding the last read sequence */ ctx->istate = last_istate; goto exit; } } out_idx += result; } result = TINICONV_CONVERT_OK; exit: if (p_in_size_consumed) *p_in_size_consumed = in_idx; if (p_out_size_consumed) *p_out_size_consumed = out_idx; return result; } fldigi-3.21.80/src/libtiniconv/encdec/0000775000175000017500000000000012313333727014462 500000000000000fldigi-3.21.80/src/libtiniconv/encdec/cp1253.h0000664000175000017500000001064212313064025015463 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1253 */ static const unsigned short cp1253_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0xfffd, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa0 */ 0x00a0, 0x0385, 0x0386, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0xfffd, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x2015, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x00b5, 0x00b6, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, /* 0xc0 */ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, /* 0xd0 */ 0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, /* 0xe0 */ 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, /* 0xf0 */ 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd, }; static int cp1253_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1253_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1253_page00[32] = { 0xa0, 0x00, 0x00, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char cp1253_page03[80] = { 0x00, 0x00, 0x00, 0x00, 0xb4, 0xa1, 0xa2, 0x00, /* 0x80-0x87 */ 0xb8, 0xb9, 0xba, 0x00, 0xbc, 0x00, 0xbe, 0xbf, /* 0x88-0x8f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x90-0x97 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x98-0x9f */ 0xd0, 0xd1, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xa0-0xa7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xa8-0xaf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xb0-0xb7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xb8-0xbf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xc0-0xc7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xc8-0xcf */ }; static const unsigned char cp1253_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0xaf, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1253_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = cp1253_page00[wc-0x00a0]; else if (wc == 0x0192) c = 0x83; else if (wc >= 0x0380 && wc < 0x03d0) c = cp1253_page03[wc-0x0380]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1253_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/ces_gbk.h0000664000175000017500000000336612313064025016150 00000000000000/* * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK */ static int ces_gbk_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII or GB 1988-89) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (GBK) */ if (c >= 0x81 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); return gbk_mbtowc(conv,pwc,s,2); } return RET_ILSEQ; } static int ces_gbk_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII or GB 1988-89) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (GBK) */ ret = gbk_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_5.h0000664000175000017500000000672512313064025016131 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-5 */ static const unsigned short iso8859_5_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, /* 0xb0 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0xc0 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xd0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xe0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, /* 0xf0 */ 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f, }; static int iso8859_5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_5_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_5_page00[16] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ }; static const unsigned char iso8859_5_page04[96] = { 0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, /* 0x08-0x0f */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0xfe, 0xff, /* 0x58-0x5f */ }; static int iso8859_5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b0) c = iso8859_5_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0460) c = iso8859_5_page04[wc-0x0400]; else if (wc == 0x2116) c = 0xf0; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_6.h0000664000175000017500000000663012313064025016125 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-6 */ static const unsigned short iso8859_6_2uni[96] = { /* 0xa0 */ 0x00a0, 0xfffd, 0xfffd, 0xfffd, 0x00a4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x060c, 0x00ad, 0xfffd, 0xfffd, /* 0xb0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x061b, 0xfffd, 0xfffd, 0xfffd, 0x061f, /* 0xc0 */ 0xfffd, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, /* 0xd0 */ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xe0 */ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, /* 0xf0 */ 0x0650, 0x0651, 0x0652, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, }; static int iso8859_6_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = iso8859_6_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char iso8859_6_page00[16] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ }; static const unsigned char iso8859_6_page06[80] = { 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ }; static int iso8859_6_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b0) c = iso8859_6_page00[wc-0x00a0]; else if (wc >= 0x0608 && wc < 0x0658) c = iso8859_6_page06[wc-0x0608]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_3.h0000664000175000017500000001107412313064025016120 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-3 */ static const unsigned short iso8859_3_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0xfffd, 0x0124, 0x00a7, 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0xfffd, 0x017b, /* 0xb0 */ 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0xfffd, 0x017c, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0xfffd, 0x00c4, 0x010a, 0x0108, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0xfffd, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0xfffd, 0x00e4, 0x010b, 0x0109, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0xfffd, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9, }; static int iso8859_3_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = iso8859_3_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char iso8859_3_page00[96] = { 0xa0, 0x00, 0x00, 0xa3, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0x00, 0xb2, 0xb3, 0xb4, 0xb5, 0x00, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0x00, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char iso8859_3_page01[120] = { 0xc6, 0xe6, 0xc5, 0xe5, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xf8, 0xab, 0xbb, /* 0x18-0x1f */ 0xd5, 0xf5, 0x00, 0x00, 0xa6, 0xb6, 0xa1, 0xb1, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xa9, 0xb9, 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, 0xaa, 0xba, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0xdd, 0xfd, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0xaf, 0xbf, 0x00, 0x00, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_3_page02[8] = { 0xa2, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static int iso8859_3_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = iso8859_3_page00[wc-0x00a0]; else if (wc >= 0x0108 && wc < 0x0180) c = iso8859_3_page01[wc-0x0108]; else if (wc >= 0x02d8 && wc < 0x02e0) c = iso8859_3_page02[wc-0x02d8]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/ucs2.h0000664000175000017500000000431712313064025015424 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UCS-2 */ /* Here we accept FFFE/FEFF marks as endianness indicators everywhere in the stream, not just at the beginning. The default is big-endian. */ /* The state is 0 if big-endian, 1 if little-endian. */ static int ucs2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { conv_state_t state = conv->istate; int count = 0; for (; n >= 2;) { ucs4_t wc = (state ? s[0] + (s[1] << 8) : (s[0] << 8) + s[1]); s += 2; n -= 2; count += 2; if (wc == 0xfeff) { } else if (wc == 0xfffe) { state ^= 1; } else if (wc >= 0xd800 && wc < 0xe000) { return RET_ILSEQ; } else { *pwc = wc; conv->istate = state; return count; } } conv->istate = state; return RET_TOOFEW(count); } /* But we output UCS-2 in big-endian order, without byte-order mark. */ /* RFC 2152 says: "ISO/IEC 10646-1:1993(E) specifies that when characters the UCS-2 form are serialized as octets, that the most significant octet appear first." */ static int ucs2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x10000 && wc != 0xfffe && !(wc >= 0xd800 && wc < 0xe000)) { if (n >= 2) { r[0] = (unsigned char) (wc >> 8); r[1] = (unsigned char) wc; return 2; } else return RET_TOOSMALL; } else return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/euc_cn.h0000664000175000017500000000373012313064025016002 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * EUC-CN */ static int euc_cn_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII or GB 1988-89) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (GB 2312-1980) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xff) { unsigned char buf[2]; buf[0] = c-0x80; buf[1] = c2-0x80; return gb2312_mbtowc(conv,pwc,buf,2); } else return RET_ILSEQ; } } return RET_ILSEQ; } static int euc_cn_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII or GB 1988-89) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (GB 2312-1980) */ ret = gb2312_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]+0x80; r[1] = buf[1]+0x80; return 2; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/gbkext_inv.h0000664000175000017500000044567112313064025016724 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK extensions */ static const unsigned short gbkext_inv_2charset[14313] = { 0xa840, 0xa841, 0xa842, 0xa95c, 0xa843, 0xa844, 0xa845, 0xa846, 0xa847, 0xa848, 0xa959, 0xa849, 0xa84a, 0xa84b, 0xa84c, 0xa84d, 0xa84e, 0xa84f, 0xa850, 0xa851, 0xa852, 0xa892, 0xa853, 0xa854, 0xa855, 0xa856, 0xa857, 0xa858, 0xa859, 0xa85a, 0xa85b, 0xa85c, 0xa85d, 0xa85e, 0xa85f, 0xa860, 0xa861, 0xa862, 0xa863, 0xa864, 0xa865, 0xa866, 0xa867, 0xa868, 0xa869, 0xa86a, 0xa86b, 0xa86c, 0xa86d, 0xa86e, 0xa86f, 0xa870, 0xa871, 0xa872, 0xa873, 0xa874, 0xa875, 0xa876, 0xa877, 0xa878, 0xa879, 0xa87a, 0xa87b, 0xa87c, 0xa87d, 0xa87e, 0xa880, 0xa881, 0xa882, 0xa883, 0xa884, 0xa885, 0xa886, 0xa887, 0xa888, 0xa889, 0xa88a, 0xa88b, 0xa88c, 0xa88d, 0xa88e, 0xa88f, 0xa890, 0xa891, 0xa965, 0xa996, 0xa893, 0xa894, 0xa895, 0xa940, 0xa941, 0xa942, 0xa943, 0xa944, 0xa945, 0xa946, 0xa947, 0xa948, 0xa961, 0xa962, 0xa966, 0xa967, 0xa960, 0xa963, 0xa964, 0xa95a, 0xa949, 0xa94a, 0xa94b, 0xa94c, 0xa94d, 0xa94e, 0xa94f, 0xa950, 0xa951, 0xa952, 0xa953, 0xa954, 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149, 0x814a, 0x814b, 0x814c, 0x814d, 0x814e, 0x814f, 0x8150, 0x8151, 0x8152, 0x8153, 0x8154, 0x8155, 0x8156, 0x8157, 0x8158, 0x8159, 0x815a, 0x815b, 0x815c, 0x815d, 0x815e, 0x815f, 0x8160, 0x8161, 0x8162, 0x8163, 0x8164, 0x8165, 0x8166, 0x8167, 0x8168, 0x8169, 0x816a, 0x816b, 0x816c, 0x816d, 0x816e, 0x816f, 0x8170, 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0x8176, 0x8177, 0x8178, 0x8179, 0x817a, 0x817b, 0x817c, 0x817d, 0x817e, 0x8180, 0x8181, 0x8182, 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8188, 0x8189, 0x818a, 0x818b, 0x818c, 0x818d, 0x818e, 0x818f, 0x8190, 0x8191, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8198, 0x8199, 0x819a, 0x819b, 0x819c, 0x819d, 0x819e, 0x819f, 0x81a0, 0x81a1, 0x81a2, 0x81a3, 0x81a4, 0x81a5, 0x81a6, 0x81a7, 0x81a8, 0x81a9, 0x81aa, 0x81ab, 0x81ac, 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1, 0x81b2, 0x81b3, 0x81b4, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0x81ba, 0x81bb, 0x81bc, 0x81bd, 0x81be, 0x81bf, 0x81c0, 0x81c1, 0x81c2, 0x81c3, 0x81c4, 0x81c5, 0x81c6, 0x81c7, 0x81c8, 0x81c9, 0x81ca, 0x81cb, 0x81cc, 0x81cd, 0x81ce, 0x81cf, 0x81d0, 0x81d1, 0x81d2, 0x81d3, 0x81d4, 0x81d5, 0x81d6, 0x81d7, 0x81d8, 0x81d9, 0x81da, 0x81db, 0x81dc, 0x81dd, 0x81de, 0x81df, 0x81e0, 0x81e1, 0x81e2, 0x81e3, 0x81e4, 0x81e5, 0x81e6, 0x81e7, 0x81e8, 0x81e9, 0x81ea, 0x81eb, 0x81ec, 0x81ed, 0x81ee, 0x81ef, 0x81f0, 0x81f1, 0x81f2, 0x81f3, 0x81f4, 0x81f5, 0x81f6, 0x81f7, 0x81f8, 0x81f9, 0x81fa, 0x81fb, 0x81fc, 0x81fd, 0x81fe, 0x8240, 0x8241, 0x8242, 0x8243, 0x8244, 0x8245, 0x8246, 0x8247, 0x8248, 0x8249, 0x824a, 0x824b, 0x824c, 0x824d, 0x824e, 0x824f, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8258, 0x8259, 0x825a, 0x825b, 0x825c, 0x825d, 0x825e, 0x825f, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8268, 0x8269, 0x826a, 0x826b, 0x826c, 0x826d, 0x826e, 0x826f, 0x8270, 0x8271, 0x8272, 0x8273, 0x8274, 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827a, 0x827b, 0x827c, 0x827d, 0x827e, 0x8280, 0x8281, 0x8282, 0x8283, 0x8284, 0x8285, 0x8286, 0x8287, 0x8288, 0x8289, 0x828a, 0x828b, 0x828c, 0x828d, 0x828e, 0x828f, 0x8290, 0x8291, 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299, 0x829a, 0x829b, 0x829c, 0x829d, 0x829e, 0x829f, 0x82a0, 0x82a1, 0x82a2, 0x82a3, 0x82a4, 0x82a5, 0x82a6, 0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ab, 0x82ac, 0x82ad, 0x82ae, 0x82af, 0x82b0, 0x82b1, 0x82b2, 0x82b3, 0x82b4, 0x82b5, 0x82b6, 0x82b7, 0x82b8, 0x82b9, 0x82ba, 0x82bb, 0x82bc, 0x82bd, 0x82be, 0x82bf, 0x82c0, 0x82c1, 0x82c2, 0x82c3, 0x82c4, 0x82c5, 0x82c6, 0x82c7, 0x82c8, 0x82c9, 0x82ca, 0x82cb, 0x82cc, 0x82cd, 0x82ce, 0x82cf, 0x82d0, 0x82d1, 0x82d2, 0x82d3, 0x82d4, 0x82d5, 0x82d6, 0x82d7, 0x82d8, 0x82d9, 0x82da, 0x82db, 0x82dc, 0x82dd, 0x82de, 0x82df, 0x82e0, 0x82e1, 0x82e2, 0x82e3, 0x82e4, 0x82e5, 0x82e6, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82eb, 0x82ec, 0x82ed, 0x82ee, 0x82ef, 0x82f0, 0x82f1, 0x82f2, 0x82f3, 0x82f4, 0x82f5, 0x82f6, 0x82f7, 0x82f8, 0x82f9, 0x82fa, 0x82fb, 0x82fc, 0x82fd, 0x82fe, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834a, 0x834b, 0x834c, 0x834d, 0x834e, 0x834f, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835a, 0x835b, 0x835c, 0x835d, 0x835e, 0x835f, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366, 0x8367, 0x8368, 0x8369, 0x836a, 0x836b, 0x836c, 0x836d, 0x836e, 0x836f, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8377, 0x8378, 0x8379, 0x837a, 0x837b, 0x837c, 0x837d, 0x837e, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387, 0x8388, 0x8389, 0x838a, 0x838b, 0x838c, 0x838d, 0x838e, 0x838f, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0x8397, 0x8398, 0x8399, 0x839a, 0x839b, 0x839c, 0x839d, 0x839e, 0x839f, 0x83a0, 0x83a1, 0x83a2, 0x83a3, 0x83a4, 0x83a5, 0x83a6, 0x83a7, 0x83a8, 0x83a9, 0x83aa, 0x83ab, 0x83ac, 0x83ad, 0x83ae, 0x83af, 0x83b0, 0x83b1, 0x83b2, 0x83b3, 0x83b4, 0x83b5, 0x83b6, 0x83b7, 0x83b8, 0x83b9, 0x83ba, 0x83bb, 0x83bc, 0x83bd, 0x83be, 0x83bf, 0x83c0, 0x83c1, 0x83c2, 0x83c3, 0x83c4, 0x83c5, 0x83c6, 0x83c7, 0x83c8, 0x83c9, 0x83ca, 0x83cb, 0x83cc, 0x83cd, 0x83ce, 0x83cf, 0x83d0, 0x83d1, 0x83d2, 0x83d3, 0x83d4, 0x83d5, 0x83d6, 0x83d7, 0x83d8, 0x83d9, 0x83da, 0x83db, 0x83dc, 0x83dd, 0x83de, 0x83df, 0x83e0, 0x83e1, 0x83e2, 0x83e3, 0x83e4, 0x83e5, 0x83e6, 0x83e7, 0x83e8, 0x83e9, 0x83ea, 0x83eb, 0x83ec, 0x83ed, 0x83ee, 0x83ef, 0x83f0, 0x83f1, 0x83f2, 0x83f3, 0x83f4, 0x83f5, 0x83f6, 0x83f7, 0x83f8, 0x83f9, 0x83fa, 0x83fb, 0x83fc, 0x83fd, 0x83fe, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8446, 0x8447, 0x8448, 0x8449, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, 0x8450, 0x8451, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845a, 0x845b, 0x845c, 0x845d, 0x845e, 0x845f, 0x8460, 0x8461, 0x8462, 0x8463, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x8469, 0x846a, 0x846b, 0x846c, 0x846d, 0x846e, 0x846f, 0x8470, 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8476, 0x8477, 0x8478, 0x8479, 0x847a, 0x847b, 0x847c, 0x847d, 0x847e, 0x8480, 0x8481, 0x8482, 0x8483, 0x8484, 0x8485, 0x8486, 0x8487, 0x8488, 0x8489, 0x848a, 0x848b, 0x848c, 0x848d, 0x848e, 0x848f, 0x8490, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8497, 0x8498, 0x8499, 0x849a, 0x849b, 0x849c, 0x849d, 0x849e, 0x849f, 0x84a0, 0x84a1, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7, 0x84a8, 0x84a9, 0x84aa, 0x84ab, 0x84ac, 0x84ad, 0x84ae, 0x84af, 0x84b0, 0x84b1, 0x84b2, 0x84b3, 0x84b4, 0x84b5, 0x84b6, 0x84b7, 0x84b8, 0x84b9, 0x84ba, 0x84bb, 0x84bc, 0x84bd, 0x84be, 0x84bf, 0x84c0, 0x84c1, 0x84c2, 0x84c3, 0x84c4, 0x84c5, 0x84c6, 0x84c7, 0x84c8, 0x84c9, 0x84ca, 0x84cb, 0x84cc, 0x84cd, 0x84ce, 0x84cf, 0x84d0, 0x84d1, 0x84d2, 0x84d3, 0x84d4, 0x84d5, 0x84d6, 0x84d7, 0x84d8, 0x84d9, 0x84da, 0x84db, 0x84dc, 0x84dd, 0x84de, 0x84df, 0x84e0, 0x84e1, 0x84e2, 0x84e3, 0x84e4, 0x84e5, 0x84e6, 0x84e7, 0x84e8, 0x84e9, 0x84ea, 0x84eb, 0x84ec, 0x84ed, 0x84ee, 0x84ef, 0x84f0, 0x84f1, 0x84f2, 0x84f3, 0x84f4, 0x84f5, 0x84f6, 0x84f7, 0x84f8, 0x84f9, 0x84fa, 0x84fb, 0x84fc, 0x84fd, 0x84fe, 0x8540, 0x8541, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, 0x8548, 0x8549, 0x854a, 0x854b, 0x854c, 0x854d, 0x854e, 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558, 0x8559, 0x855a, 0x855b, 0x855c, 0x855d, 0x855e, 0x855f, 0x8560, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568, 0x8569, 0x856a, 0x856b, 0x856c, 0x856d, 0x856e, 0x856f, 0x8570, 0x8571, 0x8572, 0x8573, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578, 0x8579, 0x857a, 0x857b, 0x857c, 0x857d, 0x857e, 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0x8585, 0x8586, 0x8587, 0x8588, 0x8589, 0x858a, 0x858b, 0x858c, 0x858d, 0x858e, 0x858f, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859a, 0x859b, 0x859c, 0x859d, 0x859e, 0x859f, 0x85a0, 0x85a1, 0x85a2, 0x85a3, 0x85a4, 0x85a5, 0x85a6, 0x85a7, 0x85a8, 0x85a9, 0x85aa, 0x85ab, 0x85ac, 0x85ad, 0x85ae, 0x85af, 0x85b0, 0x85b1, 0x85b2, 0x85b3, 0x85b4, 0x85b5, 0x85b6, 0x85b7, 0x85b8, 0x85b9, 0x85ba, 0x85bb, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c0, 0x85c1, 0x85c2, 0x85c3, 0x85c4, 0x85c5, 0x85c6, 0x85c7, 0x85c8, 0x85c9, 0x85ca, 0x85cb, 0x85cc, 0x85cd, 0x85ce, 0x85cf, 0x85d0, 0x85d1, 0x85d2, 0x85d3, 0x85d4, 0x85d5, 0x85d6, 0x85d7, 0x85d8, 0x85d9, 0x85da, 0x85db, 0x85dc, 0x85dd, 0x85de, 0x85df, 0x85e0, 0x85e1, 0x85e2, 0x85e3, 0x85e4, 0x85e5, 0x85e6, 0x85e7, 0x85e8, 0x85e9, 0x85ea, 0x85eb, 0x85ec, 0x85ed, 0x85ee, 0x85ef, 0x85f0, 0x85f1, 0x85f2, 0x85f3, 0x85f4, 0x85f5, 0x85f6, 0x85f7, 0x85f8, 0x85f9, 0x85fa, 0x85fb, 0x85fc, 0x85fd, 0x85fe, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, 0x864a, 0x864b, 0x864c, 0x864d, 0x864e, 0x864f, 0x8650, 0x8651, 0x8652, 0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865a, 0x865b, 0x865c, 0x865d, 0x865e, 0x865f, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866a, 0x866b, 0x866c, 0x866d, 0x866e, 0x866f, 0x8670, 0x8671, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679, 0x867a, 0x867b, 0x867c, 0x867d, 0x867e, 0x8680, 0x8681, 0x8682, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689, 0x868a, 0x868b, 0x868c, 0x868d, 0x868e, 0x868f, 0x8690, 0x8691, 0x8692, 0x8693, 0x8694, 0x8695, 0x8696, 0x8697, 0x8698, 0x8699, 0x869a, 0x869b, 0x869c, 0x869d, 0x869e, 0x869f, 0x86a0, 0x86a1, 0x86a2, 0x86a3, 0x86a4, 0x86a5, 0x86a6, 0x86a7, 0x86a8, 0x86a9, 0x86aa, 0x86ab, 0x86ac, 0x86ad, 0x86ae, 0x86af, 0x86b0, 0x86b1, 0x86b2, 0x86b3, 0x86b4, 0x86b5, 0x86b6, 0x86b7, 0x86b8, 0x86b9, 0x86ba, 0x86bb, 0x86bc, 0x86bd, 0x86be, 0x86bf, 0x86c0, 0x86c1, 0x86c2, 0x86c3, 0x86c4, 0x86c5, 0x86c6, 0x86c7, 0x86c8, 0x86c9, 0x86ca, 0x86cb, 0x86cc, 0x86cd, 0x86ce, 0x86cf, 0x86d0, 0x86d1, 0x86d2, 0x86d3, 0x86d4, 0x86d5, 0x86d6, 0x86d7, 0x86d8, 0x86d9, 0x86da, 0x86db, 0x86dc, 0x86dd, 0x86de, 0x86df, 0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e4, 0x86e5, 0x86e6, 0x86e7, 0x86e8, 0x86e9, 0x86ea, 0x86eb, 0x86ec, 0x86ed, 0x86ee, 0x86ef, 0x86f0, 0x86f1, 0x86f2, 0x86f3, 0x86f4, 0x86f5, 0x86f6, 0x86f7, 0x86f8, 0x86f9, 0x86fa, 0x86fb, 0x86fc, 0x86fd, 0x86fe, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874a, 0x874b, 0x874c, 0x874d, 0x874e, 0x874f, 0x8750, 0x8751, 0x8752, 0x8753, 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, 0x875a, 0x875b, 0x875c, 0x875d, 0x875e, 0x875f, 0x8760, 0x8761, 0x8762, 0x8763, 0x8764, 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b, 0x876c, 0x876d, 0x876e, 0x876f, 0x8770, 0x8771, 0x8772, 0x8773, 0x8774, 0x8775, 0x8776, 0x8777, 0x8778, 0x8779, 0x877a, 0x877b, 0x877c, 0x877d, 0x877e, 0x8780, 0x8781, 0x8782, 0x8783, 0x8784, 0x8785, 0x8786, 0x8787, 0x8788, 0x8789, 0x878a, 0x878b, 0x878c, 0x878d, 0x878e, 0x878f, 0x8790, 0x8791, 0x8792, 0x8793, 0x8794, 0x8795, 0x8796, 0x8797, 0x8798, 0x8799, 0x879a, 0x879b, 0x879c, 0x879d, 0x879e, 0x879f, 0x87a0, 0x87a1, 0x87a2, 0x87a3, 0x87a4, 0x87a5, 0x87a6, 0x87a7, 0x87a8, 0x87a9, 0x87aa, 0x87ab, 0x87ac, 0x87ad, 0x87ae, 0x87af, 0x87b0, 0x87b1, 0x87b2, 0x87b3, 0x87b4, 0x87b5, 0x87b6, 0x87b7, 0x87b8, 0x87b9, 0x87ba, 0x87bb, 0x87bc, 0x87bd, 0x87be, 0x87bf, 0x87c0, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c6, 0x87c7, 0x87c8, 0x87c9, 0x87ca, 0x87cb, 0x87cc, 0x87cd, 0x87ce, 0x87cf, 0x87d0, 0x87d1, 0x87d2, 0x87d3, 0x87d4, 0x87d5, 0x87d6, 0x87d7, 0x87d8, 0x87d9, 0x87da, 0x87db, 0x87dc, 0x87dd, 0x87de, 0x87df, 0x87e0, 0x87e1, 0x87e2, 0x87e3, 0x87e4, 0x87e5, 0x87e6, 0x87e7, 0x87e8, 0x87e9, 0x87ea, 0x87eb, 0x87ec, 0x87ed, 0x87ee, 0x87ef, 0x87f0, 0x87f1, 0x87f2, 0x87f3, 0x87f4, 0x87f5, 0x87f6, 0x87f7, 0x87f8, 0x87f9, 0x87fa, 0x87fb, 0x87fc, 0x87fd, 0x87fe, 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845, 0x8846, 0x8847, 0x8848, 0x8849, 0x884a, 0x884b, 0x884c, 0x884d, 0x884e, 0x884f, 0x8850, 0x8851, 0x8852, 0x8853, 0x8854, 0x8855, 0x8856, 0x8857, 0x8858, 0x8859, 0x885a, 0x885b, 0x885c, 0x885d, 0x885e, 0x885f, 0x8860, 0x8861, 0x8862, 0x8863, 0x8864, 0x8865, 0x8866, 0x8867, 0x8868, 0x8869, 0x886a, 0x886b, 0x886c, 0x886d, 0x886e, 0x886f, 0x8870, 0x8871, 0x8872, 0x8873, 0x8874, 0x8875, 0x8876, 0x8877, 0x8878, 0x8879, 0x887a, 0x887b, 0x887c, 0x887d, 0x887e, 0x8880, 0x8881, 0x8882, 0x8883, 0x8884, 0x8885, 0x8886, 0x8887, 0x8888, 0x8889, 0x888a, 0x888b, 0x888c, 0x888d, 0x888e, 0x888f, 0x8890, 0x8891, 0x8892, 0x8893, 0x8894, 0x8895, 0x8896, 0x8897, 0x8898, 0x8899, 0x889a, 0x889b, 0x889c, 0x889d, 0x889e, 0x889f, 0x88a0, 0x88a1, 0x88a2, 0x88a3, 0x88a4, 0x88a5, 0x88a6, 0x88a7, 0x88a8, 0x88a9, 0x88aa, 0x88ab, 0x88ac, 0x88ad, 0x88ae, 0x88af, 0x88b0, 0x88b1, 0x88b2, 0x88b3, 0x88b4, 0x88b5, 0x88b6, 0x88b7, 0x88b8, 0x88b9, 0x88ba, 0x88bb, 0x88bc, 0x88bd, 0x88be, 0x88bf, 0x88c0, 0x88c1, 0x88c2, 0x88c3, 0x88c4, 0x88c5, 0x88c6, 0x88c7, 0x88c8, 0x88c9, 0x88ca, 0x88cb, 0x88cc, 0x88cd, 0x88ce, 0x88cf, 0x88d0, 0x88d1, 0x88d2, 0x88d3, 0x88d4, 0x88d5, 0x88d6, 0x88d7, 0x88d8, 0x88d9, 0x88da, 0x88db, 0x88dc, 0x88dd, 0x88de, 0x88df, 0x88e0, 0x88e1, 0x88e2, 0x88e3, 0x88e4, 0x88e5, 0x88e6, 0x88e7, 0x88e8, 0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f0, 0x88f1, 0x88f2, 0x88f3, 0x88f4, 0x88f5, 0x88f6, 0x88f7, 0x88f8, 0x88f9, 0x88fa, 0x88fb, 0x88fc, 0x88fd, 0x88fe, 0x8940, 0x8941, 0x8942, 0x8943, 0x8944, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, 0x894a, 0x894b, 0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0x895a, 0x895b, 0x895c, 0x895d, 0x895e, 0x895f, 0x8960, 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, 0x8966, 0x8967, 0x8968, 0x8969, 0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897a, 0x897b, 0x897c, 0x897d, 0x897e, 0x8980, 0x8981, 0x8982, 0x8983, 0x8984, 0x8985, 0x8986, 0x8987, 0x8988, 0x8989, 0x898a, 0x898b, 0x898c, 0x898d, 0x898e, 0x898f, 0x8990, 0x8991, 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899a, 0x899b, 0x899c, 0x899d, 0x899e, 0x899f, 0x89a0, 0x89a1, 0x89a2, 0x89a3, 0x89a4, 0x89a5, 0x89a6, 0x89a7, 0x89a8, 0x89a9, 0x89aa, 0x89ab, 0x89ac, 0x89ad, 0x89ae, 0x89af, 0x89b0, 0x89b1, 0x89b2, 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89b8, 0x89b9, 0x89ba, 0x89bb, 0x89bc, 0x89bd, 0x89be, 0x89bf, 0x89c0, 0x89c1, 0x89c2, 0x89c3, 0x89c4, 0x89c5, 0x89c6, 0x89c7, 0x89c8, 0x89c9, 0x89ca, 0x89cb, 0x89cc, 0x89cd, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x89d2, 0x89d3, 0x89d4, 0x89d5, 0x89d6, 0x89d7, 0x89d8, 0x89d9, 0x89da, 0x89db, 0x89dc, 0x89dd, 0x89de, 0x89df, 0x89e0, 0x89e1, 0x89e2, 0x89e3, 0x89e4, 0x89e5, 0x89e6, 0x89e7, 0x89e8, 0x89e9, 0x89ea, 0x89eb, 0x89ec, 0x89ed, 0x89ee, 0x89ef, 0x89f0, 0x89f1, 0x89f2, 0x89f3, 0x89f4, 0x89f5, 0x89f6, 0x89f7, 0x89f8, 0x89f9, 0x89fa, 0x89fb, 0x89fc, 0x89fd, 0x89fe, 0x8a40, 0x8a41, 0x8a42, 0x8a43, 0x8a44, 0x8a45, 0x8a46, 0x8a47, 0x8a48, 0x8a49, 0x8a4a, 0x8a4b, 0x8a4c, 0x8a4d, 0x8a4e, 0x8a4f, 0x8a50, 0x8a51, 0x8a52, 0x8a53, 0x8a54, 0x8a55, 0x8a56, 0x8a57, 0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d, 0x8a5e, 0x8a5f, 0x8a60, 0x8a61, 0x8a62, 0x8a63, 0x8a64, 0x8a65, 0x8a66, 0x8a67, 0x8a68, 0x8a69, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, 0x8a70, 0x8a71, 0x8a72, 0x8a73, 0x8a74, 0x8a75, 0x8a76, 0x8a77, 0x8a78, 0x8a79, 0x8a7a, 0x8a7b, 0x8a7c, 0x8a7d, 0x8a7e, 0x8a80, 0x8a81, 0x8a82, 0x8a83, 0x8a84, 0x8a85, 0x8a86, 0x8a87, 0x8a88, 0x8a89, 0x8a8a, 0x8a8b, 0x8a8c, 0x8a8d, 0x8a8e, 0x8a8f, 0x8a90, 0x8a91, 0x8a92, 0x8a93, 0x8a94, 0x8a95, 0x8a96, 0x8a97, 0x8a98, 0x8a99, 0x8a9a, 0x8a9b, 0x8a9c, 0x8a9d, 0x8a9e, 0x8a9f, 0x8aa0, 0x8aa1, 0x8aa2, 0x8aa3, 0x8aa4, 0x8aa5, 0x8aa6, 0x8aa7, 0x8aa8, 0x8aa9, 0x8aaa, 0x8aab, 0x8aac, 0x8aad, 0x8aae, 0x8aaf, 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3, 0x8ab4, 0x8ab5, 0x8ab6, 0x8ab7, 0x8ab8, 0x8ab9, 0x8aba, 0x8abb, 0x8abc, 0x8abd, 0x8abe, 0x8abf, 0x8ac0, 0x8ac1, 0x8ac2, 0x8ac3, 0x8ac4, 0x8ac5, 0x8ac6, 0x8ac7, 0x8ac8, 0x8ac9, 0x8aca, 0x8acb, 0x8acc, 0x8acd, 0x8ace, 0x8acf, 0x8ad0, 0x8ad1, 0x8ad2, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad6, 0x8ad7, 0x8ad8, 0x8ad9, 0x8ada, 0x8adb, 0x8adc, 0x8add, 0x8ade, 0x8adf, 0x8ae0, 0x8ae1, 0x8ae2, 0x8ae3, 0x8ae4, 0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8, 0x8ae9, 0x8aea, 0x8aeb, 0x8aec, 0x8aed, 0x8aee, 0x8aef, 0x8af0, 0x8af1, 0x8af2, 0x8af3, 0x8af4, 0x8af5, 0x8af6, 0x8af7, 0x8af8, 0x8af9, 0x8afa, 0x8afb, 0x8afc, 0x8afd, 0x8afe, 0x8b40, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0x8b45, 0x8b46, 0x8b47, 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, 0x8b4c, 0x8b4d, 0x8b4e, 0x8b4f, 0x8b50, 0x8b51, 0x8b52, 0x8b53, 0x8b54, 0x8b55, 0x8b56, 0x8b57, 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d, 0x8b5e, 0x8b5f, 0x8b60, 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65, 0x8b66, 0x8b67, 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6c, 0x8b6d, 0x8b6e, 0x8b6f, 0x8b70, 0x8b71, 0x8b72, 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77, 0x8b78, 0x8b79, 0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d, 0x8b7e, 0x8b80, 0x8b81, 0x8b82, 0x8b83, 0x8b84, 0x8b85, 0x8b86, 0x8b87, 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0x8b8d, 0x8b8e, 0x8b8f, 0x8b90, 0x8b91, 0x8b92, 0x8b93, 0x8b94, 0x8b95, 0x8b96, 0x8b97, 0x8b98, 0x8b99, 0x8b9a, 0x8b9b, 0x8b9c, 0x8b9d, 0x8b9e, 0x8b9f, 0x8ba0, 0x8ba1, 0x8ba2, 0x8ba3, 0x8ba4, 0x8ba5, 0x8ba6, 0x8ba7, 0x8ba8, 0x8ba9, 0x8baa, 0x8bab, 0x8bac, 0x8bad, 0x8bae, 0x8baf, 0x8bb0, 0x8bb1, 0x8bb2, 0x8bb3, 0x8bb4, 0x8bb5, 0x8bb6, 0x8bb7, 0x8bb8, 0x8bb9, 0x8bba, 0x8bbb, 0x8bbc, 0x8bbd, 0x8bbe, 0x8bbf, 0x8bc0, 0x8bc1, 0x8bc2, 0x8bc3, 0x8bc4, 0x8bc5, 0x8bc6, 0x8bc7, 0x8bc8, 0x8bc9, 0x8bca, 0x8bcb, 0x8bcc, 0x8bcd, 0x8bce, 0x8bcf, 0x8bd0, 0x8bd1, 0x8bd2, 0x8bd3, 0x8bd4, 0x8bd5, 0x8bd6, 0x8bd7, 0x8bd8, 0x8bd9, 0x8bda, 0x8bdb, 0x8bdc, 0x8bdd, 0x8bde, 0x8bdf, 0x8be0, 0x8be1, 0x8be2, 0x8be3, 0x8be4, 0x8be5, 0x8be6, 0x8be7, 0x8be8, 0x8be9, 0x8bea, 0x8beb, 0x8bec, 0x8bed, 0x8bee, 0x8bef, 0x8bf0, 0x8bf1, 0x8bf2, 0x8bf3, 0x8bf4, 0x8bf5, 0x8bf6, 0x8bf7, 0x8bf8, 0x8bf9, 0x8bfa, 0x8bfb, 0x8bfc, 0x8bfd, 0x8bfe, 0x8c40, 0x8c41, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c46, 0x8c47, 0x8c48, 0x8c49, 0x8c4a, 0x8c4b, 0x8c4c, 0x8c4d, 0x8c4e, 0x8c4f, 0x8c50, 0x8c51, 0x8c52, 0x8c53, 0x8c54, 0x8c55, 0x8c56, 0x8c57, 0x8c58, 0x8c59, 0x8c5a, 0x8c5b, 0x8c5c, 0x8c5d, 0x8c5e, 0x8c5f, 0x8c60, 0x8c61, 0x8c62, 0x8c63, 0x8c64, 0x8c65, 0x8c66, 0x8c67, 0x8c68, 0x8c69, 0x8c6a, 0x8c6b, 0x8c6c, 0x8c6d, 0x8c6e, 0x8c6f, 0x8c70, 0x8c71, 0x8c72, 0x8c73, 0x8c74, 0x8c75, 0x8c76, 0x8c77, 0x8c78, 0x8c79, 0x8c7a, 0x8c7b, 0x8c7c, 0x8c7d, 0x8c7e, 0x8c80, 0x8c81, 0x8c82, 0x8c83, 0x8c84, 0x8c85, 0x8c86, 0x8c87, 0x8c88, 0x8c89, 0x8c8a, 0x8c8b, 0x8c8c, 0x8c8d, 0x8c8e, 0x8c8f, 0x8c90, 0x8c91, 0x8c92, 0x8c93, 0x8c94, 0x8c95, 0x8c96, 0x8c97, 0x8c98, 0x8c99, 0x8c9a, 0x8c9b, 0x8c9c, 0x8c9d, 0x8c9e, 0x8c9f, 0x8ca0, 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4, 0x8ca5, 0x8ca6, 0x8ca7, 0x8ca8, 0x8ca9, 0x8caa, 0x8cab, 0x8cac, 0x8cad, 0x8cae, 0x8caf, 0x8cb0, 0x8cb1, 0x8cb2, 0x8cb3, 0x8cb4, 0x8cb5, 0x8cb6, 0x8cb7, 0x8cb8, 0x8cb9, 0x8cba, 0x8cbb, 0x8cbc, 0x8cbd, 0x8cbe, 0x8cbf, 0x8cc0, 0x8cc1, 0x8cc2, 0x8cc3, 0x8cc4, 0x8cc5, 0x8cc6, 0x8cc7, 0x8cc8, 0x8cc9, 0x8cca, 0x8ccb, 0x8ccc, 0x8ccd, 0x8cce, 0x8ccf, 0x8cd0, 0x8cd1, 0x8cd2, 0x8cd3, 0x8cd4, 0x8cd5, 0x8cd6, 0x8cd7, 0x8cd8, 0x8cd9, 0x8cda, 0x8cdb, 0x8cdc, 0x8cdd, 0x8cde, 0x8cdf, 0x8ce0, 0x8ce1, 0x8ce2, 0x8ce3, 0x8ce4, 0x8ce5, 0x8ce6, 0x8ce7, 0x8ce8, 0x8ce9, 0x8cea, 0x8ceb, 0x8cec, 0x8ced, 0x8cee, 0x8cef, 0x8cf0, 0x8cf1, 0x8cf2, 0x8cf3, 0x8cf4, 0x8cf5, 0x8cf6, 0x8cf7, 0x8cf8, 0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd, 0x8cfe, 0x8d40, 0x8d41, 0x8d42, 0x8d43, 0x8d44, 0x8d45, 0x8d46, 0x8d47, 0x8d48, 0x8d49, 0x8d4a, 0x8d4b, 0x8d4c, 0x8d4d, 0x8d4e, 0x8d4f, 0x8d50, 0x8d51, 0x8d52, 0x8d53, 0x8d54, 0x8d55, 0x8d56, 0x8d57, 0x8d58, 0x8d59, 0x8d5a, 0x8d5b, 0x8d5c, 0x8d5d, 0x8d5e, 0x8d5f, 0x8d60, 0x8d61, 0x8d62, 0x8d63, 0x8d64, 0x8d65, 0x8d66, 0x8d67, 0x8d68, 0x8d69, 0x8d6a, 0x8d6b, 0x8d6c, 0x8d6d, 0x8d6e, 0x8d6f, 0x8d70, 0x8d71, 0x8d72, 0x8d73, 0x8d74, 0x8d75, 0x8d76, 0x8d77, 0x8d78, 0x8d79, 0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d, 0x8d7e, 0x8d80, 0x8d81, 0x8d82, 0x8d83, 0x8d84, 0x8d85, 0x8d86, 0x8d87, 0x8d88, 0x8d89, 0x8d8a, 0x8d8b, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f, 0x8d90, 0x8d91, 0x8d92, 0x8d93, 0x8d94, 0x8d95, 0x8d96, 0x8d97, 0x8d98, 0x8d99, 0x8d9a, 0x8d9b, 0x8d9c, 0x8d9d, 0x8d9e, 0x8d9f, 0x8da0, 0x8da1, 0x8da2, 0x8da3, 0x8da4, 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9, 0x8daa, 0x8dab, 0x8dac, 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db1, 0x8db2, 0x8db3, 0x8db4, 0x8db5, 0x8db6, 0x8db7, 0x8db8, 0x8db9, 0x8dba, 0x8dbb, 0x8dbc, 0x8dbd, 0x8dbe, 0x8dbf, 0x8dc0, 0x8dc1, 0x8dc2, 0x8dc3, 0x8dc4, 0x8dc5, 0x8dc6, 0x8dc7, 0x8dc8, 0x8dc9, 0x8dca, 0x8dcb, 0x8dcc, 0x8dcd, 0x8dce, 0x8dcf, 0x8dd0, 0x8dd1, 0x8dd2, 0x8dd3, 0x8dd4, 0x8dd5, 0x8dd6, 0x8dd7, 0x8dd8, 0x8dd9, 0x8dda, 0x8ddb, 0x8ddc, 0x8ddd, 0x8dde, 0x8ddf, 0x8de0, 0x8de1, 0x8de2, 0x8de3, 0x8de4, 0x8de5, 0x8de6, 0x8de7, 0x8de8, 0x8de9, 0x8dea, 0x8deb, 0x8dec, 0x8ded, 0x8dee, 0x8def, 0x8df0, 0x8df1, 0x8df2, 0x8df3, 0x8df4, 0x8df5, 0x8df6, 0x8df7, 0x8df8, 0x8df9, 0x8dfa, 0x8dfb, 0x8dfc, 0x8dfd, 0x8dfe, 0x8e40, 0x8e41, 0x8e42, 0x8e43, 0x8e44, 0x8e45, 0x8e46, 0x8e47, 0x8e48, 0x8e49, 0x8e4a, 0x8e4b, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50, 0x8e51, 0x8e52, 0x8e53, 0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58, 0x8e59, 0x8e5a, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62, 0x8e63, 0x8e64, 0x8e65, 0x8e66, 0x8e67, 0x8e68, 0x8e69, 0x8e6a, 0x8e6b, 0x8e6c, 0x8e6d, 0x8e6e, 0x8e6f, 0x8e70, 0x8e71, 0x8e72, 0x8e73, 0x8e74, 0x8e75, 0x8e76, 0x8e77, 0x8e78, 0x8e79, 0x8e7a, 0x8e7b, 0x8e7c, 0x8e7d, 0x8e7e, 0x8e80, 0x8e81, 0x8e82, 0x8e83, 0x8e84, 0x8e85, 0x8e86, 0x8e87, 0x8e88, 0x8e89, 0x8e8a, 0x8e8b, 0x8e8c, 0x8e8d, 0x8e8e, 0x8e8f, 0x8e90, 0x8e91, 0x8e92, 0x8e93, 0x8e94, 0x8e95, 0x8e96, 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0x8e9c, 0x8e9d, 0x8e9e, 0x8e9f, 0x8ea0, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4, 0x8ea5, 0x8ea6, 0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0x8eab, 0x8eac, 0x8ead, 0x8eae, 0x8eaf, 0x8eb0, 0x8eb1, 0x8eb2, 0x8eb3, 0x8eb4, 0x8eb5, 0x8eb6, 0x8eb7, 0x8eb8, 0x8eb9, 0x8eba, 0x8ebb, 0x8ebc, 0x8ebd, 0x8ebe, 0x8ebf, 0x8ec0, 0x8ec1, 0x8ec2, 0x8ec3, 0x8ec4, 0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8, 0x8ec9, 0x8eca, 0x8ecb, 0x8ecc, 0x8ecd, 0x8ece, 0x8ecf, 0x8ed0, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4, 0x8ed5, 0x8ed6, 0x8ed7, 0x8ed8, 0x8ed9, 0x8eda, 0x8edb, 0x8edc, 0x8edd, 0x8ede, 0x8edf, 0x8ee0, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4, 0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0x8eec, 0x8eed, 0x8eee, 0x8eef, 0x8ef0, 0x8ef1, 0x8ef2, 0x8ef3, 0x8ef4, 0x8ef5, 0x8ef6, 0x8ef7, 0x8ef8, 0x8ef9, 0x8efa, 0x8efb, 0x8efc, 0x8efd, 0x8efe, 0x8f40, 0x8f41, 0x8f42, 0x8f43, 0x8f44, 0x8f45, 0x8f46, 0x8f47, 0x8f48, 0x8f49, 0x8f4a, 0x8f4b, 0x8f4c, 0x8f4d, 0x8f4e, 0x8f4f, 0x8f50, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55, 0x8f56, 0x8f57, 0x8f58, 0x8f59, 0x8f5a, 0x8f5b, 0x8f5c, 0x8f5d, 0x8f5e, 0x8f5f, 0x8f60, 0x8f61, 0x8f62, 0x8f63, 0x8f64, 0x8f65, 0x8f66, 0x8f67, 0x8f68, 0x8f69, 0x8f6a, 0x8f6b, 0x8f6c, 0x8f6d, 0x8f6e, 0x8f6f, 0x8f70, 0x8f71, 0x8f72, 0x8f73, 0x8f74, 0x8f75, 0x8f76, 0x8f77, 0x8f78, 0x8f79, 0x8f7a, 0x8f7b, 0x8f7c, 0x8f7d, 0x8f7e, 0x8f80, 0x8f81, 0x8f82, 0x8f83, 0x8f84, 0x8f85, 0x8f86, 0x8f87, 0x8f88, 0x8f89, 0x8f8a, 0x8f8b, 0x8f8c, 0x8f8d, 0x8f8e, 0x8f8f, 0x8f90, 0x8f91, 0x8f92, 0x8f93, 0x8f94, 0x8f95, 0x8f96, 0x8f97, 0x8f98, 0x8f99, 0x8f9a, 0x8f9b, 0x8f9c, 0x8f9d, 0x8f9e, 0x8f9f, 0x8fa0, 0x8fa1, 0x8fa2, 0x8fa3, 0x8fa4, 0x8fa5, 0x8fa6, 0x8fa7, 0x8fa8, 0x8fa9, 0x8faa, 0x8fab, 0x8fac, 0x8fad, 0x8fae, 0x8faf, 0x8fb0, 0x8fb1, 0x8fb2, 0x8fb3, 0x8fb4, 0x8fb5, 0x8fb6, 0x8fb7, 0x8fb8, 0x8fb9, 0x8fba, 0x8fbb, 0x8fbc, 0x8fbd, 0x8fbe, 0x8fbf, 0x8fc0, 0x8fc1, 0x8fc2, 0x8fc3, 0x8fc4, 0x8fc5, 0x8fc6, 0x8fc7, 0x8fc8, 0x8fc9, 0x8fca, 0x8fcb, 0x8fcc, 0x8fcd, 0x8fce, 0x8fcf, 0x8fd0, 0x8fd1, 0x8fd2, 0x8fd3, 0x8fd4, 0x8fd5, 0x8fd6, 0x8fd7, 0x8fd8, 0x8fd9, 0x8fda, 0x8fdb, 0x8fdc, 0x8fdd, 0x8fde, 0x8fdf, 0x8fe0, 0x8fe1, 0x8fe2, 0x8fe3, 0x8fe4, 0x8fe5, 0x8fe6, 0x8fe7, 0x8fe8, 0x8fe9, 0x8fea, 0x8feb, 0x8fec, 0x8fed, 0x8fee, 0x8fef, 0x8ff0, 0x8ff1, 0x8ff2, 0x8ff3, 0x8ff4, 0x8ff5, 0x8ff6, 0x8ff7, 0x8ff8, 0x8ff9, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffd, 0x8ffe, 0x9040, 0x9041, 0x9042, 0x9043, 0x9044, 0x9045, 0x9046, 0x9047, 0x9048, 0x9049, 0x904a, 0x904b, 0x904c, 0x904d, 0x904e, 0x904f, 0x9050, 0x9051, 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0x9057, 0x9058, 0x9059, 0x905a, 0x905b, 0x905c, 0x905d, 0x905e, 0x905f, 0x9060, 0x9061, 0x9062, 0x9063, 0x9064, 0x9065, 0x9066, 0x9067, 0x9068, 0x9069, 0x906a, 0x906b, 0x906c, 0x906d, 0x906e, 0x906f, 0x9070, 0x9071, 0x9072, 0x9073, 0x9074, 0x9075, 0x9076, 0x9077, 0x9078, 0x9079, 0x907a, 0x907b, 0x907c, 0x907d, 0x907e, 0x9080, 0x9081, 0x9082, 0x9083, 0x9084, 0x9085, 0x9086, 0x9087, 0x9088, 0x9089, 0x908a, 0x908b, 0x908c, 0x908d, 0x908e, 0x908f, 0x9090, 0x9091, 0x9092, 0x9093, 0x9094, 0x9095, 0x9096, 0x9097, 0x9098, 0x9099, 0x909a, 0x909b, 0x909c, 0x909d, 0x909e, 0x909f, 0x90a0, 0x90a1, 0x90a2, 0x90a3, 0x90a4, 0x90a5, 0x90a6, 0x90a7, 0x90a8, 0x90a9, 0x90aa, 0x90ab, 0x90ac, 0x90ad, 0x90ae, 0x90af, 0x90b0, 0x90b1, 0x90b2, 0x90b3, 0x90b4, 0x90b5, 0x90b6, 0x90b7, 0x90b8, 0x90b9, 0x90ba, 0x90bb, 0x90bc, 0x90bd, 0x90be, 0x90bf, 0x90c0, 0x90c1, 0x90c2, 0x90c3, 0x90c4, 0x90c5, 0x90c6, 0x90c7, 0x90c8, 0x90c9, 0x90ca, 0x90cb, 0x90cc, 0x90cd, 0x90ce, 0x90cf, 0x90d0, 0x90d1, 0x90d2, 0x90d3, 0x90d4, 0x90d5, 0x90d6, 0x90d7, 0x90d8, 0x90d9, 0x90da, 0x90db, 0x90dc, 0x90dd, 0x90de, 0x90df, 0x90e0, 0x90e1, 0x90e2, 0x90e3, 0x90e4, 0x90e5, 0x90e6, 0x90e7, 0x90e8, 0x90e9, 0x90ea, 0x90eb, 0x90ec, 0x90ed, 0x90ee, 0x90ef, 0x90f0, 0x90f1, 0x90f2, 0x90f3, 0x90f4, 0x90f5, 0x90f6, 0x90f7, 0x90f8, 0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90fd, 0x90fe, 0x9140, 0x9141, 0x9142, 0x9143, 0x9144, 0x9145, 0x9146, 0x9147, 0x9148, 0x9149, 0x914a, 0x914b, 0x914c, 0x914d, 0x914e, 0x914f, 0x9150, 0x9151, 0x9152, 0x9153, 0x9154, 0x9155, 0x9156, 0x9157, 0x9158, 0x9159, 0x915a, 0x915b, 0x915c, 0x915d, 0x915e, 0x915f, 0x9160, 0x9161, 0x9162, 0x9163, 0x9164, 0x9165, 0x9166, 0x9167, 0x9168, 0x9169, 0x916a, 0x916b, 0x916c, 0x916d, 0x916e, 0x916f, 0x9170, 0x9171, 0x9172, 0x9173, 0x9174, 0x9175, 0x9176, 0x9177, 0x9178, 0x9179, 0x917a, 0x917b, 0x917c, 0x917d, 0x917e, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9185, 0x9186, 0x9187, 0x9188, 0x9189, 0x918a, 0x918b, 0x918c, 0x918d, 0x918e, 0x918f, 0x9190, 0x9191, 0x9192, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919a, 0x919b, 0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91a1, 0x91a2, 0x91a3, 0x91a4, 0x91a5, 0x91a6, 0x91a7, 0x91a8, 0x91a9, 0x91aa, 0x91ab, 0x91ac, 0x91ad, 0x91ae, 0x91af, 0x91b0, 0x91b1, 0x91b2, 0x91b3, 0x91b4, 0x91b5, 0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91ba, 0x91bb, 0x91bc, 0x91bd, 0x91be, 0x91bf, 0x91c0, 0x91c1, 0x91c2, 0x91c3, 0x91c4, 0x91c5, 0x91c6, 0x91c7, 0x91c8, 0x91c9, 0x91ca, 0x91cb, 0x91cc, 0x91cd, 0x91ce, 0x91cf, 0x91d0, 0x91d1, 0x91d2, 0x91d3, 0x91d4, 0x91d5, 0x91d6, 0x91d7, 0x91d8, 0x91d9, 0x91da, 0x91db, 0x91dc, 0x91dd, 0x91de, 0x91df, 0x91e0, 0x91e1, 0x91e2, 0x91e3, 0x91e4, 0x91e5, 0x91e6, 0x91e7, 0x91e8, 0x91e9, 0x91ea, 0x91eb, 0x91ec, 0x91ed, 0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f2, 0x91f3, 0x91f4, 0x91f5, 0x91f6, 0x91f7, 0x91f8, 0x91f9, 0x91fa, 0x91fb, 0x91fc, 0x91fd, 0x91fe, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 0x9246, 0x9247, 0x9248, 0x9249, 0x924a, 0x924b, 0x924c, 0x924d, 0x924e, 0x924f, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257, 0x9258, 0x9259, 0x925a, 0x925b, 0x925c, 0x925d, 0x925e, 0x925f, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, 0x926a, 0x926b, 0x926c, 0x926d, 0x926e, 0x926f, 0x9270, 0x9271, 0x9272, 0x9273, 0x9274, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927a, 0x927b, 0x927c, 0x927d, 0x927e, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c, 0x928d, 0x928e, 0x928f, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929a, 0x929b, 0x929c, 0x929d, 0x929e, 0x929f, 0x92a0, 0x92a1, 0x92a2, 0x92a3, 0x92a4, 0x92a5, 0x92a6, 0x92a7, 0x92a8, 0x92a9, 0x92aa, 0x92ab, 0x92ac, 0x92ad, 0x92ae, 0x92af, 0x92b0, 0x92b1, 0x92b2, 0x92b3, 0x92b4, 0x92b5, 0x92b6, 0x92b7, 0x92b8, 0x92b9, 0x92ba, 0x92bb, 0x92bc, 0x92bd, 0x92be, 0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c4, 0x92c5, 0x92c6, 0x92c7, 0x92c8, 0x92c9, 0x92ca, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92cf, 0x92d0, 0x92d1, 0x92d2, 0x92d3, 0x92d4, 0x92d5, 0x92d6, 0x92d7, 0x92d8, 0x92d9, 0x92da, 0x92db, 0x92dc, 0x92dd, 0x92de, 0x92df, 0x92e0, 0x92e1, 0x92e2, 0x92e3, 0x92e4, 0x92e5, 0x92e6, 0x92e7, 0x92e8, 0x92e9, 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0, 0x92f1, 0x92f2, 0x92f3, 0x92f4, 0x92f5, 0x92f6, 0x92f7, 0x92f8, 0x92f9, 0x92fa, 0x92fb, 0x92fc, 0x92fd, 0x92fe, 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934a, 0x934b, 0x934c, 0x934d, 0x934e, 0x934f, 0x9350, 0x9351, 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935a, 0x935b, 0x935c, 0x935d, 0x935e, 0x935f, 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x936a, 0x936b, 0x936c, 0x936d, 0x936e, 0x936f, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937a, 0x937b, 0x937c, 0x937d, 0x937e, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938a, 0x938b, 0x938c, 0x938d, 0x938e, 0x938f, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939a, 0x939b, 0x939c, 0x939d, 0x939e, 0x939f, 0x93a0, 0x93a1, 0x93a2, 0x93a3, 0x93a4, 0x93a5, 0x93a6, 0x93a7, 0x93a8, 0x93a9, 0x93aa, 0x93ab, 0x93ac, 0x93ad, 0x93ae, 0x93af, 0x93b0, 0x93b1, 0x93b2, 0x93b3, 0x93b4, 0x93b5, 0x93b6, 0x93b7, 0x93b8, 0x93b9, 0x93ba, 0x93bb, 0x93bc, 0x93bd, 0x93be, 0x93bf, 0x93c0, 0x93c1, 0x93c2, 0x93c3, 0x93c4, 0x93c5, 0x93c6, 0x93c7, 0x93c8, 0x93c9, 0x93ca, 0x93cb, 0x93cc, 0x93cd, 0x93ce, 0x93cf, 0x93d0, 0x93d1, 0x93d2, 0x93d3, 0x93d4, 0x93d5, 0x93d6, 0x93d7, 0x93d8, 0x93d9, 0x93da, 0x93db, 0x93dc, 0x93dd, 0x93de, 0x93df, 0x93e0, 0x93e1, 0x93e2, 0x93e3, 0x93e4, 0x93e5, 0x93e6, 0x93e7, 0x93e8, 0x93e9, 0x93ea, 0x93eb, 0x93ec, 0x93ed, 0x93ee, 0x93ef, 0x93f0, 0x93f1, 0x93f2, 0x93f3, 0x93f4, 0x93f5, 0x93f6, 0x93f7, 0x93f8, 0x93f9, 0x93fa, 0x93fb, 0x93fc, 0x93fd, 0x93fe, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944a, 0x944b, 0x944c, 0x944d, 0x944e, 0x944f, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945a, 0x945b, 0x945c, 0x945d, 0x945e, 0x945f, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946a, 0x946b, 0x946c, 0x946d, 0x946e, 0x946f, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947a, 0x947b, 0x947c, 0x947d, 0x947e, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, 0x9487, 0x9488, 0x9489, 0x948a, 0x948b, 0x948c, 0x948d, 0x948e, 0x948f, 0x9490, 0x9491, 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, 0x9499, 0x949a, 0x949b, 0x949c, 0x949d, 0x949e, 0x949f, 0x94a0, 0x94a1, 0x94a2, 0x94a3, 0x94a4, 0x94a5, 0x94a6, 0x94a7, 0x94a8, 0x94a9, 0x94aa, 0x94ab, 0x94ac, 0x94ad, 0x94ae, 0x94af, 0x94b0, 0x94b1, 0x94b2, 0x94b3, 0x94b4, 0x94b5, 0x94b6, 0x94b7, 0x94b8, 0x94b9, 0x94ba, 0x94bb, 0x94bc, 0x94bd, 0x94be, 0x94bf, 0x94c0, 0x94c1, 0x94c2, 0x94c3, 0x94c4, 0x94c5, 0x94c6, 0x94c7, 0x94c8, 0x94c9, 0x94ca, 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94cf, 0x94d0, 0x94d1, 0x94d2, 0x94d3, 0x94d4, 0x94d5, 0x94d6, 0x94d7, 0x94d8, 0x94d9, 0x94da, 0x94db, 0x94dc, 0x94dd, 0x94de, 0x94df, 0x94e0, 0x94e1, 0x94e2, 0x94e3, 0x94e4, 0x94e5, 0x94e6, 0x94e7, 0x94e8, 0x94e9, 0x94ea, 0x94eb, 0x94ec, 0x94ed, 0x94ee, 0x94ef, 0x94f0, 0x94f1, 0x94f2, 0x94f3, 0x94f4, 0x94f5, 0x94f6, 0x94f7, 0x94f8, 0x94f9, 0x94fa, 0x94fb, 0x94fc, 0x94fd, 0x94fe, 0x9540, 0x9541, 0x9542, 0x9543, 0x9544, 0x9545, 0x9546, 0x9547, 0x9548, 0x9549, 0x954a, 0x954b, 0x954c, 0x954d, 0x954e, 0x954f, 0x9550, 0x9551, 0x9552, 0x9553, 0x9554, 0x9555, 0x9556, 0x9557, 0x9558, 0x9559, 0x955a, 0x955b, 0x955c, 0x955d, 0x955e, 0x955f, 0x9560, 0x9561, 0x9562, 0x9563, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956a, 0x956b, 0x956c, 0x956d, 0x956e, 0x956f, 0x9570, 0x9571, 0x9572, 0x9573, 0x9574, 0x9575, 0x9576, 0x9577, 0x9578, 0x9579, 0x957a, 0x957b, 0x957c, 0x957d, 0x957e, 0x9580, 0x9581, 0x9582, 0x9583, 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958a, 0x958b, 0x958c, 0x958d, 0x958e, 0x958f, 0x9590, 0x9591, 0x9592, 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959a, 0x959b, 0x959c, 0x959d, 0x959e, 0x959f, 0x95a0, 0x95a1, 0x95a2, 0x95a3, 0x95a4, 0x95a5, 0x95a6, 0x95a7, 0x95a8, 0x95a9, 0x95aa, 0x95ab, 0x95ac, 0x95ad, 0x95ae, 0x95af, 0x95b0, 0x95b1, 0x95b2, 0x95b3, 0x95b4, 0x95b5, 0x95b6, 0x95b7, 0x95b8, 0x95b9, 0x95ba, 0x95bb, 0x95bc, 0x95bd, 0x95be, 0x95bf, 0x95c0, 0x95c1, 0x95c2, 0x95c3, 0x95c4, 0x95c5, 0x95c6, 0x95c7, 0x95c8, 0x95c9, 0x95ca, 0x95cb, 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0, 0x95d1, 0x95d2, 0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9, 0x95da, 0x95db, 0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2, 0x95e3, 0x95e4, 0x95e5, 0x95e6, 0x95e7, 0x95e8, 0x95e9, 0x95ea, 0x95eb, 0x95ec, 0x95ed, 0x95ee, 0x95ef, 0x95f0, 0x95f1, 0x95f2, 0x95f3, 0x95f4, 0x95f5, 0x95f6, 0x95f7, 0x95f8, 0x95f9, 0x95fa, 0x95fb, 0x95fc, 0x95fd, 0x95fe, 0x9640, 0x9641, 0x9642, 0x9643, 0x9644, 0x9645, 0x9646, 0x9647, 0x9648, 0x9649, 0x964a, 0x964b, 0x964c, 0x964d, 0x964e, 0x964f, 0x9650, 0x9651, 0x9652, 0x9653, 0x9654, 0x9655, 0x9656, 0x9657, 0x9658, 0x9659, 0x965a, 0x965b, 0x965c, 0x965d, 0x965e, 0x965f, 0x9660, 0x9661, 0x9662, 0x9663, 0x9664, 0x9665, 0x9666, 0x9667, 0x9668, 0x9669, 0x966a, 0x966b, 0x966c, 0x966d, 0x966e, 0x966f, 0x9670, 0x9671, 0x9672, 0x9673, 0x9674, 0x9675, 0x9676, 0x9677, 0x9678, 0x9679, 0x967a, 0x967b, 0x967c, 0x967d, 0x967e, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9685, 0x9686, 0x9687, 0x9688, 0x9689, 0x968a, 0x968b, 0x968c, 0x968d, 0x968e, 0x968f, 0x9690, 0x9691, 0x9692, 0x9693, 0x9694, 0x9695, 0x9696, 0x9697, 0x9698, 0x9699, 0x969a, 0x969b, 0x969c, 0x969d, 0x969e, 0x969f, 0x96a0, 0x96a1, 0x96a2, 0x96a3, 0x96a4, 0x96a5, 0x96a6, 0x96a7, 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac, 0x96ad, 0x96ae, 0x96af, 0x96b0, 0x96b1, 0x96b2, 0x96b3, 0x96b4, 0x96b5, 0x96b6, 0x96b7, 0x96b8, 0x96b9, 0x96ba, 0x96bb, 0x96bc, 0x96bd, 0x96be, 0x96bf, 0x96c0, 0x96c1, 0x96c2, 0x96c3, 0x96c4, 0x96c5, 0x96c6, 0x96c7, 0x96c8, 0x96c9, 0x96ca, 0x96cb, 0x96cc, 0x96cd, 0x96ce, 0x96cf, 0x96d0, 0x96d1, 0x96d2, 0x96d3, 0x96d4, 0x96d5, 0x96d6, 0x96d7, 0x96d8, 0x96d9, 0x96da, 0x96db, 0x96dc, 0x96dd, 0x96de, 0x96df, 0x96e0, 0x96e1, 0x96e2, 0x96e3, 0x96e4, 0x96e5, 0x96e6, 0x96e7, 0x96e8, 0x96e9, 0x96ea, 0x96eb, 0x96ec, 0x96ed, 0x96ee, 0x96ef, 0x96f0, 0x96f1, 0x96f2, 0x96f3, 0x96f4, 0x96f5, 0x96f6, 0x96f7, 0x96f8, 0x96f9, 0x96fa, 0x96fb, 0x96fc, 0x96fd, 0x96fe, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, 0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d, 0x974e, 0x974f, 0x9750, 0x9751, 0x9752, 0x9753, 0x9754, 0x9755, 0x9756, 0x9757, 0x9758, 0x9759, 0x975a, 0x975b, 0x975c, 0x975d, 0x975e, 0x975f, 0x9760, 0x9761, 0x9762, 0x9763, 0x9764, 0x9765, 0x9766, 0x9767, 0x9768, 0x9769, 0x976a, 0x976b, 0x976c, 0x976d, 0x976e, 0x976f, 0x9770, 0x9771, 0x9772, 0x9773, 0x9774, 0x9775, 0x9776, 0x9777, 0x9778, 0x9779, 0x977a, 0x977b, 0x977c, 0x977d, 0x977e, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786, 0x9787, 0x9788, 0x9789, 0x978a, 0x978b, 0x978c, 0x978d, 0x978e, 0x978f, 0x9790, 0x9791, 0x9792, 0x9793, 0x9794, 0x9795, 0x9796, 0x9797, 0x9798, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d, 0x979e, 0x979f, 0x97a0, 0x97a1, 0x97a2, 0x97a3, 0x97a4, 0x97a5, 0x97a6, 0x97a7, 0x97a8, 0x97a9, 0x97aa, 0x97ab, 0x97ac, 0x97ad, 0x97ae, 0x97af, 0x97b0, 0x97b1, 0x97b2, 0x97b3, 0x97b4, 0x97b5, 0x97b6, 0x97b7, 0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc, 0x97bd, 0x97be, 0x97bf, 0x97c0, 0x97c1, 0x97c2, 0x97c3, 0x97c4, 0x97c5, 0x97c6, 0x97c7, 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, 0x97cd, 0x97ce, 0x97cf, 0x97d0, 0x97d1, 0x97d2, 0x97d3, 0x97d4, 0x97d5, 0x97d6, 0x97d7, 0x97d8, 0x97d9, 0x97da, 0x97db, 0x97dc, 0x97dd, 0x97de, 0x97df, 0x97e0, 0x97e1, 0x97e2, 0x97e3, 0x97e4, 0x97e5, 0x97e6, 0x97e7, 0x97e8, 0x97e9, 0x97ea, 0x97eb, 0x97ec, 0x97ed, 0x97ee, 0x97ef, 0x97f0, 0x97f1, 0x97f2, 0x97f3, 0x97f4, 0x97f5, 0x97f6, 0x97f7, 0x97f8, 0x97f9, 0x97fa, 0x97fb, 0x97fc, 0x97fd, 0x97fe, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, 0x9848, 0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 0x984e, 0x984f, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, 0x9858, 0x9859, 0x985a, 0x985b, 0x985c, 0x985d, 0x985e, 0x985f, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868, 0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, 0x986f, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x9875, 0x9876, 0x9877, 0x9878, 0x9879, 0x987a, 0x987b, 0x987c, 0x987d, 0x987e, 0x9880, 0x9881, 0x9882, 0x9883, 0x9884, 0x9885, 0x9886, 0x9887, 0x9888, 0x9889, 0x988a, 0x988b, 0x988c, 0x988d, 0x988e, 0x988f, 0x9890, 0x9891, 0x9892, 0x9893, 0x9894, 0x9895, 0x9896, 0x9897, 0x9898, 0x9899, 0x989a, 0x989b, 0x989c, 0x989d, 0x989e, 0x989f, 0x98a0, 0x98a1, 0x98a2, 0x98a3, 0x98a4, 0x98a5, 0x98a6, 0x98a7, 0x98a8, 0x98a9, 0x98aa, 0x98ab, 0x98ac, 0x98ad, 0x98ae, 0x98af, 0x98b0, 0x98b1, 0x98b2, 0x98b3, 0x98b4, 0x98b5, 0x98b6, 0x98b7, 0x98b8, 0x98b9, 0x98ba, 0x98bb, 0x98bc, 0x98bd, 0x98be, 0x98bf, 0x98c0, 0x98c1, 0x98c2, 0x98c3, 0x98c4, 0x98c5, 0x98c6, 0x98c7, 0x98c8, 0x98c9, 0x98ca, 0x98cb, 0x98cc, 0x98cd, 0x98ce, 0x98cf, 0x98d0, 0x98d1, 0x98d2, 0x98d3, 0x98d4, 0x98d5, 0x98d6, 0x98d7, 0x98d8, 0x98d9, 0x98da, 0x98db, 0x98dc, 0x98dd, 0x98de, 0x98df, 0x98e0, 0x98e1, 0x98e2, 0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e7, 0x98e8, 0x98e9, 0x98ea, 0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef, 0x98f0, 0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7, 0x98f8, 0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0x98fe, 0x9940, 0x9941, 0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0x994a, 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951, 0x9952, 0x9953, 0x9954, 0x9955, 0x9956, 0x9957, 0x9958, 0x9959, 0x995a, 0x995b, 0x995c, 0x995d, 0x995e, 0x995f, 0x9960, 0x9961, 0x9962, 0x9963, 0x9964, 0x9965, 0x9966, 0x9967, 0x9968, 0x9969, 0x996a, 0x996b, 0x996c, 0x996d, 0x996e, 0x996f, 0x9970, 0x9971, 0x9972, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, 0x9978, 0x9979, 0x997a, 0x997b, 0x997c, 0x997d, 0x997e, 0x9980, 0x9981, 0x9982, 0x9983, 0x9984, 0x9985, 0x9986, 0x9987, 0x9988, 0x9989, 0x998a, 0x998b, 0x998c, 0x998d, 0x998e, 0x998f, 0x9990, 0x9991, 0x9992, 0x9993, 0x9994, 0x9995, 0x9996, 0x9997, 0x9998, 0x9999, 0x999a, 0x999b, 0x999c, 0x999d, 0x999e, 0x999f, 0x99a0, 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a5, 0x99a6, 0x99a7, 0x99a8, 0x99a9, 0x99aa, 0x99ab, 0x99ac, 0x99ad, 0x99ae, 0x99af, 0x99b0, 0x99b1, 0x99b2, 0x99b3, 0x99b4, 0x99b5, 0x99b6, 0x99b7, 0x99b8, 0x99b9, 0x99ba, 0x99bb, 0x99bc, 0x99bd, 0x99be, 0x99bf, 0x99c0, 0x99c1, 0x99c2, 0x99c3, 0x99c4, 0x99c5, 0x99c6, 0x99c7, 0x99c8, 0x99c9, 0x99ca, 0x99cb, 0x99cc, 0x99cd, 0x99ce, 0x99cf, 0x99d0, 0x99d1, 0x99d2, 0x99d3, 0x99d4, 0x99d5, 0x99d6, 0x99d7, 0x99d8, 0x99d9, 0x99da, 0x99db, 0x99dc, 0x99dd, 0x99de, 0x99df, 0x99e0, 0x99e1, 0x99e2, 0x99e3, 0x99e4, 0x99e5, 0x99e6, 0x99e7, 0x99e8, 0x99e9, 0x99ea, 0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x99ef, 0x99f0, 0x99f1, 0x99f2, 0x99f3, 0x99f4, 0x99f5, 0x99f6, 0x99f7, 0x99f8, 0x99f9, 0x99fa, 0x99fb, 0x99fc, 0x99fd, 0x99fe, 0x9a40, 0x9a41, 0x9a42, 0x9a43, 0x9a44, 0x9a45, 0x9a46, 0x9a47, 0x9a48, 0x9a49, 0x9a4a, 0x9a4b, 0x9a4c, 0x9a4d, 0x9a4e, 0x9a4f, 0x9a50, 0x9a51, 0x9a52, 0x9a53, 0x9a54, 0x9a55, 0x9a56, 0x9a57, 0x9a58, 0x9a59, 0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d, 0x9a5e, 0x9a5f, 0x9a60, 0x9a61, 0x9a62, 0x9a63, 0x9a64, 0x9a65, 0x9a66, 0x9a67, 0x9a68, 0x9a69, 0x9a6a, 0x9a6b, 0x9a6c, 0x9a6d, 0x9a6e, 0x9a6f, 0x9a70, 0x9a71, 0x9a72, 0x9a73, 0x9a74, 0x9a75, 0x9a76, 0x9a77, 0x9a78, 0x9a79, 0x9a7a, 0x9a7b, 0x9a7c, 0x9a7d, 0x9a7e, 0x9a80, 0x9a81, 0x9a82, 0x9a83, 0x9a84, 0x9a85, 0x9a86, 0x9a87, 0x9a88, 0x9a89, 0x9a8a, 0x9a8b, 0x9a8c, 0x9a8d, 0x9a8e, 0x9a8f, 0x9a90, 0x9a91, 0x9a92, 0x9a93, 0x9a94, 0x9a95, 0x9a96, 0x9a97, 0x9a98, 0x9a99, 0x9a9a, 0x9a9b, 0x9a9c, 0x9a9d, 0x9a9e, 0x9a9f, 0x9aa0, 0x9aa1, 0x9aa2, 0x9aa3, 0x9aa4, 0x9aa5, 0x9aa6, 0x9aa7, 0x9aa8, 0x9aa9, 0x9aaa, 0x9aab, 0x9aac, 0x9aad, 0x9aae, 0x9aaf, 0x9ab0, 0x9ab1, 0x9ab2, 0x9ab3, 0x9ab4, 0x9ab5, 0x9ab6, 0x9ab7, 0x9ab8, 0x9ab9, 0x9aba, 0x9abb, 0x9abc, 0x9abd, 0x9abe, 0x9abf, 0x9ac0, 0x9ac1, 0x9ac2, 0x9ac3, 0x9ac4, 0x9ac5, 0x9ac6, 0x9ac7, 0x9ac8, 0x9ac9, 0x9aca, 0x9acb, 0x9acc, 0x9acd, 0x9ace, 0x9acf, 0x9ad0, 0x9ad1, 0x9ad2, 0x9ad3, 0x9ad4, 0x9ad5, 0x9ad6, 0x9ad7, 0x9ad8, 0x9ad9, 0x9ada, 0x9adb, 0x9adc, 0x9add, 0x9ade, 0x9adf, 0x9ae0, 0x9ae1, 0x9ae2, 0x9ae3, 0x9ae4, 0x9ae5, 0x9ae6, 0x9ae7, 0x9ae8, 0x9ae9, 0x9aea, 0x9aeb, 0x9aec, 0x9aed, 0x9aee, 0x9aef, 0x9af0, 0x9af1, 0x9af2, 0x9af3, 0x9af4, 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9af9, 0x9afa, 0x9afb, 0x9afc, 0x9afd, 0x9afe, 0x9b40, 0x9b41, 0x9b42, 0x9b43, 0x9b44, 0x9b45, 0x9b46, 0x9b47, 0x9b48, 0x9b49, 0x9b4a, 0x9b4b, 0x9b4c, 0x9b4d, 0x9b4e, 0x9b4f, 0x9b50, 0x9b51, 0x9b52, 0x9b53, 0x9b54, 0x9b55, 0x9b56, 0x9b57, 0x9b58, 0x9b59, 0x9b5a, 0x9b5b, 0x9b5c, 0x9b5d, 0x9b5e, 0x9b5f, 0x9b60, 0x9b61, 0x9b62, 0x9b63, 0x9b64, 0x9b65, 0x9b66, 0x9b67, 0x9b68, 0x9b69, 0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b6f, 0x9b70, 0x9b71, 0x9b72, 0x9b73, 0x9b74, 0x9b75, 0x9b76, 0x9b77, 0x9b78, 0x9b79, 0x9b7a, 0x9b7b, 0x9b7c, 0x9b7d, 0x9b7e, 0x9b80, 0x9b81, 0x9b82, 0x9b83, 0x9b84, 0x9b85, 0x9b86, 0x9b87, 0x9b88, 0x9b89, 0x9b8a, 0x9b8b, 0x9b8c, 0x9b8d, 0x9b8e, 0x9b8f, 0x9b90, 0x9b91, 0x9b92, 0x9b93, 0x9b94, 0x9b95, 0x9b96, 0x9b97, 0x9b98, 0x9b99, 0x9b9a, 0x9b9b, 0x9b9c, 0x9b9d, 0x9b9e, 0x9b9f, 0x9ba0, 0x9ba1, 0x9ba2, 0x9ba3, 0x9ba4, 0x9ba5, 0x9ba6, 0x9ba7, 0x9ba8, 0x9ba9, 0x9baa, 0x9bab, 0x9bac, 0x9bad, 0x9bae, 0x9baf, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3, 0x9bb4, 0x9bb5, 0x9bb6, 0x9bb7, 0x9bb8, 0x9bb9, 0x9bba, 0x9bbb, 0x9bbc, 0x9bbd, 0x9bbe, 0x9bbf, 0x9bc0, 0x9bc1, 0x9bc2, 0x9bc3, 0x9bc4, 0x9bc5, 0x9bc6, 0x9bc7, 0x9bc8, 0x9bc9, 0x9bca, 0x9bcb, 0x9bcc, 0x9bcd, 0x9bce, 0x9bcf, 0x9bd0, 0x9bd1, 0x9bd2, 0x9bd3, 0x9bd4, 0x9bd5, 0x9bd6, 0x9bd7, 0x9bd8, 0x9bd9, 0x9bda, 0x9bdb, 0x9bdc, 0x9bdd, 0x9bde, 0x9bdf, 0x9be0, 0x9be1, 0x9be2, 0x9be3, 0x9be4, 0x9be5, 0x9be6, 0x9be7, 0x9be8, 0x9be9, 0x9bea, 0x9beb, 0x9bec, 0x9bed, 0x9bee, 0x9bef, 0x9bf0, 0x9bf1, 0x9bf2, 0x9bf3, 0x9bf4, 0x9bf5, 0x9bf6, 0x9bf7, 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfb, 0x9bfc, 0x9bfd, 0x9bfe, 0x9c40, 0x9c41, 0x9c42, 0x9c43, 0x9c44, 0x9c45, 0x9c46, 0x9c47, 0x9c48, 0x9c49, 0x9c4a, 0x9c4b, 0x9c4c, 0x9c4d, 0x9c4e, 0x9c4f, 0x9c50, 0x9c51, 0x9c52, 0x9c53, 0x9c54, 0x9c55, 0x9c56, 0x9c57, 0x9c58, 0x9c59, 0x9c5a, 0x9c5b, 0x9c5c, 0x9c5d, 0x9c5e, 0x9c5f, 0x9c60, 0x9c61, 0x9c62, 0x9c63, 0x9c64, 0x9c65, 0x9c66, 0x9c67, 0x9c68, 0x9c69, 0x9c6a, 0x9c6b, 0x9c6c, 0x9c6d, 0x9c6e, 0x9c6f, 0x9c70, 0x9c71, 0x9c72, 0x9c73, 0x9c74, 0x9c75, 0x9c76, 0x9c77, 0x9c78, 0x9c79, 0x9c7a, 0x9c7b, 0x9c7c, 0x9c7d, 0x9c7e, 0x9c80, 0x9c81, 0x9c82, 0x9c83, 0x9c84, 0x9c85, 0x9c86, 0x9c87, 0x9c88, 0x9c89, 0x9c8a, 0x9c8b, 0x9c8c, 0x9c8d, 0x9c8e, 0x9c8f, 0x9c90, 0x9c91, 0x9c92, 0x9c93, 0x9c94, 0x9c95, 0x9c96, 0x9c97, 0x9c98, 0x9c99, 0x9c9a, 0x9c9b, 0x9c9c, 0x9c9d, 0x9c9e, 0x9c9f, 0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca4, 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8, 0x9ca9, 0x9caa, 0x9cab, 0x9cac, 0x9cad, 0x9cae, 0x9caf, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3, 0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cb8, 0x9cb9, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd, 0x9cbe, 0x9cbf, 0x9cc0, 0x9cc1, 0x9cc2, 0x9cc3, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cc8, 0x9cc9, 0x9cca, 0x9ccb, 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, 0x9cd1, 0x9cd2, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd6, 0x9cd7, 0x9cd8, 0x9cd9, 0x9cda, 0x9cdb, 0x9cdc, 0x9cdd, 0x9cde, 0x9cdf, 0x9ce0, 0x9ce1, 0x9ce2, 0x9ce3, 0x9ce4, 0x9ce5, 0x9ce6, 0x9ce7, 0x9ce8, 0x9ce9, 0x9cea, 0x9ceb, 0x9cec, 0x9ced, 0x9cee, 0x9cef, 0x9cf0, 0x9cf1, 0x9cf2, 0x9cf3, 0x9cf4, 0x9cf5, 0x9cf6, 0x9cf7, 0x9cf8, 0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, 0x9d40, 0x9d41, 0x9d42, 0x9d43, 0x9d44, 0x9d45, 0x9d46, 0x9d47, 0x9d48, 0x9d49, 0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e, 0x9d4f, 0x9d50, 0x9d51, 0x9d52, 0x9d53, 0x9d54, 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59, 0x9d5a, 0x9d5b, 0x9d5c, 0x9d5d, 0x9d5e, 0x9d5f, 0x9d60, 0x9d61, 0x9d62, 0x9d63, 0x9d64, 0x9d65, 0x9d66, 0x9d67, 0x9d68, 0x9d69, 0x9d6a, 0x9d6b, 0x9d6c, 0x9d6d, 0x9d6e, 0x9d6f, 0x9d70, 0x9d71, 0x9d72, 0x9d73, 0x9d74, 0x9d75, 0x9d76, 0x9d77, 0x9d78, 0x9d79, 0x9d7a, 0x9d7b, 0x9d7c, 0x9d7d, 0x9d7e, 0x9d80, 0x9d81, 0x9d82, 0x9d83, 0x9d84, 0x9d85, 0x9d86, 0x9d87, 0x9d88, 0x9d89, 0x9d8a, 0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, 0x9d90, 0x9d91, 0x9d92, 0x9d93, 0x9d94, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9d99, 0x9d9a, 0x9d9b, 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0x9da0, 0x9da1, 0x9da2, 0x9da3, 0x9da4, 0x9da5, 0x9da6, 0x9da7, 0x9da8, 0x9da9, 0x9daa, 0x9dab, 0x9dac, 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0x9db1, 0x9db2, 0x9db3, 0x9db4, 0x9db5, 0x9db6, 0x9db7, 0x9db8, 0x9db9, 0x9dba, 0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe, 0x9dbf, 0x9dc0, 0x9dc1, 0x9dc2, 0x9dc3, 0x9dc4, 0x9dc5, 0x9dc6, 0x9dc7, 0x9dc8, 0x9dc9, 0x9dca, 0x9dcb, 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0, 0x9dd1, 0x9dd2, 0x9dd3, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dd8, 0x9dd9, 0x9dda, 0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, 0x9de0, 0x9de1, 0x9de2, 0x9de3, 0x9de4, 0x9de5, 0x9de6, 0x9de7, 0x9de8, 0x9de9, 0x9dea, 0x9deb, 0x9dec, 0x9ded, 0x9dee, 0x9def, 0x9df0, 0x9df1, 0x9df2, 0x9df3, 0x9df4, 0x9df5, 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0x9dfa, 0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9e40, 0x9e41, 0x9e42, 0x9e43, 0x9e44, 0x9e45, 0x9e46, 0x9e47, 0x9e48, 0x9e49, 0x9e4a, 0x9e4b, 0x9e4c, 0x9e4d, 0x9e4e, 0x9e4f, 0x9e50, 0x9e51, 0x9e52, 0x9e53, 0x9e54, 0x9e55, 0x9e56, 0x9e57, 0x9e58, 0x9e59, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5d, 0x9e5e, 0x9e5f, 0x9e60, 0x9e61, 0x9e62, 0x9e63, 0x9e64, 0x9e65, 0x9e66, 0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e6d, 0x9e6e, 0x9e6f, 0x9e70, 0x9e71, 0x9e72, 0x9e73, 0x9e74, 0x9e75, 0x9e76, 0x9e77, 0x9e78, 0x9e79, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e7d, 0x9e7e, 0x9e80, 0x9e81, 0x9e82, 0x9e83, 0x9e84, 0x9e85, 0x9e86, 0x9e87, 0x9e88, 0x9e89, 0x9e8a, 0x9e8b, 0x9e8c, 0x9e8d, 0x9e8e, 0x9e8f, 0x9e90, 0x9e91, 0x9e92, 0x9e93, 0x9e94, 0x9e95, 0x9e96, 0x9e97, 0x9e98, 0x9e99, 0x9e9a, 0x9e9b, 0x9e9c, 0x9e9d, 0x9e9e, 0x9e9f, 0x9ea0, 0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4, 0x9ea5, 0x9ea6, 0x9ea7, 0x9ea8, 0x9ea9, 0x9eaa, 0x9eab, 0x9eac, 0x9ead, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb4, 0x9eb5, 0x9eb6, 0x9eb7, 0x9eb8, 0x9eb9, 0x9eba, 0x9ebb, 0x9ebc, 0x9ebd, 0x9ebe, 0x9ebf, 0x9ec0, 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec4, 0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8, 0x9ec9, 0x9eca, 0x9ecb, 0x9ecc, 0x9ecd, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed1, 0x9ed2, 0x9ed3, 0x9ed4, 0x9ed5, 0x9ed6, 0x9ed7, 0x9ed8, 0x9ed9, 0x9eda, 0x9edb, 0x9edc, 0x9edd, 0x9ede, 0x9edf, 0x9ee0, 0x9ee1, 0x9ee2, 0x9ee3, 0x9ee4, 0x9ee5, 0x9ee6, 0x9ee7, 0x9ee8, 0x9ee9, 0x9eea, 0x9eeb, 0x9eec, 0x9eed, 0x9eee, 0x9eef, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef3, 0x9ef4, 0x9ef5, 0x9ef6, 0x9ef7, 0x9ef8, 0x9ef9, 0x9efa, 0x9efb, 0x9efc, 0x9efd, 0x9efe, 0x9f40, 0x9f41, 0x9f42, 0x9f43, 0x9f44, 0x9f45, 0x9f46, 0x9f47, 0x9f48, 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, 0x9f4e, 0x9f4f, 0x9f50, 0x9f51, 0x9f52, 0x9f53, 0x9f54, 0x9f55, 0x9f56, 0x9f57, 0x9f58, 0x9f59, 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d, 0x9f5e, 0x9f5f, 0x9f60, 0x9f61, 0x9f62, 0x9f63, 0x9f64, 0x9f65, 0x9f66, 0x9f67, 0x9f68, 0x9f69, 0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d, 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f72, 0x9f73, 0x9f74, 0x9f75, 0x9f76, 0x9f77, 0x9f78, 0x9f79, 0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d, 0x9f7e, 0x9f80, 0x9f81, 0x9f82, 0x9f83, 0x9f84, 0x9f85, 0x9f86, 0x9f87, 0x9f88, 0x9f89, 0x9f8a, 0x9f8b, 0x9f8c, 0x9f8d, 0x9f8e, 0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f93, 0x9f94, 0x9f95, 0x9f96, 0x9f97, 0x9f98, 0x9f99, 0x9f9a, 0x9f9b, 0x9f9c, 0x9f9d, 0x9f9e, 0x9f9f, 0x9fa0, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa4, 0x9fa5, 0x9fa6, 0x9fa7, 0x9fa8, 0x9fa9, 0x9faa, 0x9fab, 0x9fac, 0x9fad, 0x9fae, 0x9faf, 0x9fb0, 0x9fb1, 0x9fb2, 0x9fb3, 0x9fb4, 0x9fb5, 0x9fb6, 0x9fb7, 0x9fb8, 0x9fb9, 0x9fba, 0x9fbb, 0x9fbc, 0x9fbd, 0x9fbe, 0x9fbf, 0x9fc0, 0x9fc1, 0x9fc2, 0x9fc3, 0x9fc4, 0x9fc5, 0x9fc6, 0x9fc7, 0x9fc8, 0x9fc9, 0x9fca, 0x9fcb, 0x9fcc, 0x9fcd, 0x9fce, 0x9fcf, 0x9fd0, 0x9fd1, 0x9fd2, 0x9fd3, 0x9fd4, 0x9fd5, 0x9fd6, 0x9fd7, 0x9fd8, 0x9fd9, 0x9fda, 0x9fdb, 0x9fdc, 0x9fdd, 0x9fde, 0x9fdf, 0x9fe0, 0x9fe1, 0x9fe2, 0x9fe3, 0x9fe4, 0x9fe5, 0x9fe6, 0x9fe7, 0x9fe8, 0x9fe9, 0x9fea, 0x9feb, 0x9fec, 0x9fed, 0x9fee, 0x9fef, 0x9ff0, 0x9ff1, 0x9ff2, 0x9ff3, 0x9ff4, 0x9ff5, 0x9ff6, 0x9ff7, 0x9ff8, 0x9ff9, 0x9ffa, 0x9ffb, 0x9ffc, 0x9ffd, 0x9ffe, 0xa040, 0xa041, 0xa042, 0xa043, 0xa044, 0xa045, 0xa046, 0xa047, 0xa048, 0xa049, 0xa04a, 0xa04b, 0xa04c, 0xa04d, 0xa04e, 0xa04f, 0xa050, 0xa051, 0xa052, 0xa053, 0xa054, 0xa055, 0xa056, 0xa057, 0xa058, 0xa059, 0xa05a, 0xa05b, 0xa05c, 0xa05d, 0xa05e, 0xa05f, 0xa060, 0xa061, 0xa062, 0xa063, 0xa064, 0xa065, 0xa066, 0xa067, 0xa068, 0xa069, 0xa06a, 0xa06b, 0xa06c, 0xa06d, 0xa06e, 0xa06f, 0xa070, 0xa071, 0xa072, 0xa073, 0xa074, 0xa075, 0xa076, 0xa077, 0xa078, 0xa079, 0xa07a, 0xa07b, 0xa07c, 0xa07d, 0xa07e, 0xa080, 0xa081, 0xa082, 0xa083, 0xa084, 0xa085, 0xa086, 0xa087, 0xa088, 0xa089, 0xa08a, 0xa08b, 0xa08c, 0xa08d, 0xa08e, 0xa08f, 0xa090, 0xa091, 0xa092, 0xa093, 0xa094, 0xa095, 0xa096, 0xa097, 0xa098, 0xa099, 0xa09a, 0xa09b, 0xa09c, 0xa09d, 0xa09e, 0xa09f, 0xa0a0, 0xa0a1, 0xa0a2, 0xa0a3, 0xa0a4, 0xa0a5, 0xa0a6, 0xa0a7, 0xa0a8, 0xa0a9, 0xa0aa, 0xa0ab, 0xa0ac, 0xa0ad, 0xa0ae, 0xa0af, 0xa0b0, 0xa0b1, 0xa0b2, 0xa0b3, 0xa0b4, 0xa0b5, 0xa0b6, 0xa0b7, 0xa0b8, 0xa0b9, 0xa0ba, 0xa0bb, 0xa0bc, 0xa0bd, 0xa0be, 0xa0bf, 0xa0c0, 0xa0c1, 0xa0c2, 0xa0c3, 0xa0c4, 0xa0c5, 0xa0c6, 0xa0c7, 0xa0c8, 0xa0c9, 0xa0ca, 0xa0cb, 0xa0cc, 0xa0cd, 0xa0ce, 0xa0cf, 0xa0d0, 0xa0d1, 0xa0d2, 0xa0d3, 0xa0d4, 0xa0d5, 0xa0d6, 0xa0d7, 0xa0d8, 0xa0d9, 0xa0da, 0xa0db, 0xa0dc, 0xa0dd, 0xa0de, 0xa0df, 0xa0e0, 0xa0e1, 0xa0e2, 0xa0e3, 0xa0e4, 0xa0e5, 0xa0e6, 0xa0e7, 0xa0e8, 0xa0e9, 0xa0ea, 0xa0eb, 0xa0ec, 0xa0ed, 0xa0ee, 0xa0ef, 0xa0f0, 0xa0f1, 0xa0f2, 0xa0f3, 0xa0f4, 0xa0f5, 0xa0f6, 0xa0f7, 0xa0f8, 0xa0f9, 0xa0fa, 0xa0fb, 0xa0fc, 0xa0fd, 0xa0fe, 0xaa40, 0xaa41, 0xaa42, 0xaa43, 0xaa44, 0xaa45, 0xaa46, 0xaa47, 0xaa48, 0xaa49, 0xaa4a, 0xaa4b, 0xaa4c, 0xaa4d, 0xaa4e, 0xaa4f, 0xaa50, 0xaa51, 0xaa52, 0xaa53, 0xaa54, 0xaa55, 0xaa56, 0xaa57, 0xaa58, 0xaa59, 0xaa5a, 0xaa5b, 0xaa5c, 0xaa5d, 0xaa5e, 0xaa5f, 0xaa60, 0xaa61, 0xaa62, 0xaa63, 0xaa64, 0xaa65, 0xaa66, 0xaa67, 0xaa68, 0xaa69, 0xaa6a, 0xaa6b, 0xaa6c, 0xaa6d, 0xaa6e, 0xaa6f, 0xaa70, 0xaa71, 0xaa72, 0xaa73, 0xaa74, 0xaa75, 0xaa76, 0xaa77, 0xaa78, 0xaa79, 0xaa7a, 0xaa7b, 0xaa7c, 0xaa7d, 0xaa7e, 0xaa80, 0xaa81, 0xaa82, 0xaa83, 0xaa84, 0xaa85, 0xaa86, 0xaa87, 0xaa88, 0xaa89, 0xaa8a, 0xaa8b, 0xaa8c, 0xaa8d, 0xaa8e, 0xaa8f, 0xaa90, 0xaa91, 0xaa92, 0xaa93, 0xaa94, 0xaa95, 0xaa96, 0xaa97, 0xaa98, 0xaa99, 0xaa9a, 0xaa9b, 0xaa9c, 0xaa9d, 0xaa9e, 0xaa9f, 0xaaa0, 0xab40, 0xab41, 0xab42, 0xab43, 0xab44, 0xab45, 0xab46, 0xab47, 0xab48, 0xab49, 0xab4a, 0xab4b, 0xab4c, 0xab4d, 0xab4e, 0xab4f, 0xab50, 0xab51, 0xab52, 0xab53, 0xab54, 0xab55, 0xab56, 0xab57, 0xab58, 0xab59, 0xab5a, 0xab5b, 0xab5c, 0xab5d, 0xab5e, 0xab5f, 0xab60, 0xab61, 0xab62, 0xab63, 0xab64, 0xab65, 0xab66, 0xab67, 0xab68, 0xab69, 0xab6a, 0xab6b, 0xab6c, 0xab6d, 0xab6e, 0xab6f, 0xab70, 0xab71, 0xab72, 0xab73, 0xab74, 0xab75, 0xab76, 0xab77, 0xab78, 0xab79, 0xab7a, 0xab7b, 0xab7c, 0xab7d, 0xab7e, 0xab80, 0xab81, 0xab82, 0xab83, 0xab84, 0xab85, 0xab86, 0xab87, 0xab88, 0xab89, 0xab8a, 0xab8b, 0xab8c, 0xab8d, 0xab8e, 0xab8f, 0xab90, 0xab91, 0xab92, 0xab93, 0xab94, 0xab95, 0xab96, 0xab97, 0xab98, 0xab99, 0xab9a, 0xab9b, 0xab9c, 0xab9d, 0xab9e, 0xab9f, 0xaba0, 0xac40, 0xac41, 0xac42, 0xac43, 0xac44, 0xac45, 0xac46, 0xac47, 0xac48, 0xac49, 0xac4a, 0xac4b, 0xac4c, 0xac4d, 0xac4e, 0xac4f, 0xac50, 0xac51, 0xac52, 0xac53, 0xac54, 0xac55, 0xac56, 0xac57, 0xac58, 0xac59, 0xac5a, 0xac5b, 0xac5c, 0xac5d, 0xac5e, 0xac5f, 0xac60, 0xac61, 0xac62, 0xac63, 0xac64, 0xac65, 0xac66, 0xac67, 0xac68, 0xac69, 0xac6a, 0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xac6f, 0xac70, 0xac71, 0xac72, 0xac73, 0xac74, 0xac75, 0xac76, 0xac77, 0xac78, 0xac79, 0xac7a, 0xac7b, 0xac7c, 0xac7d, 0xac7e, 0xac80, 0xac81, 0xac82, 0xac83, 0xac84, 0xac85, 0xac86, 0xac87, 0xac88, 0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac8d, 0xac8e, 0xac8f, 0xac90, 0xac91, 0xac92, 0xac93, 0xac94, 0xac95, 0xac96, 0xac97, 0xac98, 0xac99, 0xac9a, 0xac9b, 0xac9c, 0xac9d, 0xac9e, 0xac9f, 0xaca0, 0xad40, 0xad41, 0xad42, 0xad43, 0xad44, 0xad45, 0xad46, 0xad47, 0xad48, 0xad49, 0xad4a, 0xad4b, 0xad4c, 0xad4d, 0xad4e, 0xad4f, 0xad50, 0xad51, 0xad52, 0xad53, 0xad54, 0xad55, 0xad56, 0xad57, 0xad58, 0xad59, 0xad5a, 0xad5b, 0xad5c, 0xad5d, 0xad5e, 0xad5f, 0xad60, 0xad61, 0xad62, 0xad63, 0xad64, 0xad65, 0xad66, 0xad67, 0xad68, 0xad69, 0xad6a, 0xad6b, 0xad6c, 0xad6d, 0xad6e, 0xad6f, 0xad70, 0xad71, 0xad72, 0xad73, 0xad74, 0xad75, 0xad76, 0xad77, 0xad78, 0xad79, 0xad7a, 0xad7b, 0xad7c, 0xad7d, 0xad7e, 0xad80, 0xad81, 0xad82, 0xad83, 0xad84, 0xad85, 0xad86, 0xad87, 0xad88, 0xad89, 0xad8a, 0xad8b, 0xad8c, 0xad8d, 0xad8e, 0xad8f, 0xad90, 0xad91, 0xad92, 0xad93, 0xad94, 0xad95, 0xad96, 0xad97, 0xad98, 0xad99, 0xad9a, 0xad9b, 0xad9c, 0xad9d, 0xad9e, 0xad9f, 0xada0, 0xae40, 0xae41, 0xae42, 0xae43, 0xae44, 0xae45, 0xae46, 0xae47, 0xae48, 0xae49, 0xae4a, 0xae4b, 0xae4c, 0xae4d, 0xae4e, 0xae4f, 0xae50, 0xae51, 0xae52, 0xae53, 0xae54, 0xae55, 0xae56, 0xae57, 0xae58, 0xae59, 0xae5a, 0xae5b, 0xae5c, 0xae5d, 0xae5e, 0xae5f, 0xae60, 0xae61, 0xae62, 0xae63, 0xae64, 0xae65, 0xae66, 0xae67, 0xae68, 0xae69, 0xae6a, 0xae6b, 0xae6c, 0xae6d, 0xae6e, 0xae6f, 0xae70, 0xae71, 0xae72, 0xae73, 0xae74, 0xae75, 0xae76, 0xae77, 0xae78, 0xae79, 0xae7a, 0xae7b, 0xae7c, 0xae7d, 0xae7e, 0xae80, 0xae81, 0xae82, 0xae83, 0xae84, 0xae85, 0xae86, 0xae87, 0xae88, 0xae89, 0xae8a, 0xae8b, 0xae8c, 0xae8d, 0xae8e, 0xae8f, 0xae90, 0xae91, 0xae92, 0xae93, 0xae94, 0xae95, 0xae96, 0xae97, 0xae98, 0xae99, 0xae9a, 0xae9b, 0xae9c, 0xae9d, 0xae9e, 0xae9f, 0xaea0, 0xaf40, 0xaf41, 0xaf42, 0xaf43, 0xaf44, 0xaf45, 0xaf46, 0xaf47, 0xaf48, 0xaf49, 0xaf4a, 0xaf4b, 0xaf4c, 0xaf4d, 0xaf4e, 0xaf4f, 0xaf50, 0xaf51, 0xaf52, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf57, 0xaf58, 0xaf59, 0xaf5a, 0xaf5b, 0xaf5c, 0xaf5d, 0xaf5e, 0xaf5f, 0xaf60, 0xaf61, 0xaf62, 0xaf63, 0xaf64, 0xaf65, 0xaf66, 0xaf67, 0xaf68, 0xaf69, 0xaf6a, 0xaf6b, 0xaf6c, 0xaf6d, 0xaf6e, 0xaf6f, 0xaf70, 0xaf71, 0xaf72, 0xaf73, 0xaf74, 0xaf75, 0xaf76, 0xaf77, 0xaf78, 0xaf79, 0xaf7a, 0xaf7b, 0xaf7c, 0xaf7d, 0xaf7e, 0xaf80, 0xaf81, 0xaf82, 0xaf83, 0xaf84, 0xaf85, 0xaf86, 0xaf87, 0xaf88, 0xaf89, 0xaf8a, 0xaf8b, 0xaf8c, 0xaf8d, 0xaf8e, 0xaf8f, 0xaf90, 0xaf91, 0xaf92, 0xaf93, 0xaf94, 0xaf95, 0xaf96, 0xaf97, 0xaf98, 0xaf99, 0xaf9a, 0xaf9b, 0xaf9c, 0xaf9d, 0xaf9e, 0xaf9f, 0xafa0, 0xb040, 0xb041, 0xb042, 0xb043, 0xb044, 0xb045, 0xb046, 0xb047, 0xb048, 0xb049, 0xb04a, 0xb04b, 0xb04c, 0xb04d, 0xb04e, 0xb04f, 0xb050, 0xb051, 0xb052, 0xb053, 0xb054, 0xb055, 0xb056, 0xb057, 0xb058, 0xb059, 0xb05a, 0xb05b, 0xb05c, 0xb05d, 0xb05e, 0xb05f, 0xb060, 0xb061, 0xb062, 0xb063, 0xb064, 0xb065, 0xb066, 0xb067, 0xb068, 0xb069, 0xb06a, 0xb06b, 0xb06c, 0xb06d, 0xb06e, 0xb06f, 0xb070, 0xb071, 0xb072, 0xb073, 0xb074, 0xb075, 0xb076, 0xb077, 0xb078, 0xb079, 0xb07a, 0xb07b, 0xb07c, 0xb07d, 0xb07e, 0xb080, 0xb081, 0xb082, 0xb083, 0xb084, 0xb085, 0xb086, 0xb087, 0xb088, 0xb089, 0xb08a, 0xb08b, 0xb08c, 0xb08d, 0xb08e, 0xb08f, 0xb090, 0xb091, 0xb092, 0xb093, 0xb094, 0xb095, 0xb096, 0xb097, 0xb098, 0xb099, 0xb09a, 0xb09b, 0xb09c, 0xb09d, 0xb09e, 0xb09f, 0xb0a0, 0xb140, 0xb141, 0xb142, 0xb143, 0xb144, 0xb145, 0xb146, 0xb147, 0xb148, 0xb149, 0xb14a, 0xb14b, 0xb14c, 0xb14d, 0xb14e, 0xb14f, 0xb150, 0xb151, 0xb152, 0xb153, 0xb154, 0xb155, 0xb156, 0xb157, 0xb158, 0xb159, 0xb15a, 0xb15b, 0xb15c, 0xb15d, 0xb15e, 0xb15f, 0xb160, 0xb161, 0xb162, 0xb163, 0xb164, 0xb165, 0xb166, 0xb167, 0xb168, 0xb169, 0xb16a, 0xb16b, 0xb16c, 0xb16d, 0xb16e, 0xb16f, 0xb170, 0xb171, 0xb172, 0xb173, 0xb174, 0xb175, 0xb176, 0xb177, 0xb178, 0xb179, 0xb17a, 0xb17b, 0xb17c, 0xb17d, 0xb17e, 0xb180, 0xb181, 0xb182, 0xb183, 0xb184, 0xb185, 0xb186, 0xb187, 0xb188, 0xb189, 0xb18a, 0xb18b, 0xb18c, 0xb18d, 0xb18e, 0xb18f, 0xb190, 0xb191, 0xb192, 0xb193, 0xb194, 0xb195, 0xb196, 0xb197, 0xb198, 0xb199, 0xb19a, 0xb19b, 0xb19c, 0xb19d, 0xb19e, 0xb19f, 0xb1a0, 0xb240, 0xb241, 0xb242, 0xb243, 0xb244, 0xb245, 0xb246, 0xb247, 0xb248, 0xb249, 0xb24a, 0xb24b, 0xb24c, 0xb24d, 0xb24e, 0xb24f, 0xb250, 0xb251, 0xb252, 0xb253, 0xb254, 0xb255, 0xb256, 0xb257, 0xb258, 0xb259, 0xb25a, 0xb25b, 0xb25c, 0xb25d, 0xb25e, 0xb25f, 0xb260, 0xb261, 0xb262, 0xb263, 0xb264, 0xb265, 0xb266, 0xb267, 0xb268, 0xb269, 0xb26a, 0xb26b, 0xb26c, 0xb26d, 0xb26e, 0xb26f, 0xb270, 0xb271, 0xb272, 0xb273, 0xb274, 0xb275, 0xb276, 0xb277, 0xb278, 0xb279, 0xb27a, 0xb27b, 0xb27c, 0xb27d, 0xb27e, 0xb280, 0xb281, 0xb282, 0xb283, 0xb284, 0xb285, 0xb286, 0xb287, 0xb288, 0xb289, 0xb28a, 0xb28b, 0xb28c, 0xb28d, 0xb28e, 0xb28f, 0xb290, 0xb291, 0xb292, 0xb293, 0xb294, 0xb295, 0xb296, 0xb297, 0xb298, 0xb299, 0xb29a, 0xb29b, 0xb29c, 0xb29d, 0xb29e, 0xb29f, 0xb2a0, 0xb340, 0xb341, 0xb342, 0xb343, 0xb344, 0xb345, 0xb346, 0xb347, 0xb348, 0xb349, 0xb34a, 0xb34b, 0xb34c, 0xb34d, 0xb34e, 0xb34f, 0xb350, 0xb351, 0xb352, 0xb353, 0xb354, 0xb355, 0xb356, 0xb357, 0xb358, 0xb359, 0xb35a, 0xb35b, 0xb35c, 0xb35d, 0xb35e, 0xb35f, 0xb360, 0xb361, 0xb362, 0xb363, 0xb364, 0xb365, 0xb366, 0xb367, 0xb368, 0xb369, 0xb36a, 0xb36b, 0xb36c, 0xb36d, 0xb36e, 0xb36f, 0xb370, 0xb371, 0xb372, 0xb373, 0xb374, 0xb375, 0xb376, 0xb377, 0xb378, 0xb379, 0xb37a, 0xb37b, 0xb37c, 0xb37d, 0xb37e, 0xb380, 0xb381, 0xb382, 0xb383, 0xb384, 0xb385, 0xb386, 0xb387, 0xb388, 0xb389, 0xb38a, 0xb38b, 0xb38c, 0xb38d, 0xb38e, 0xb38f, 0xb390, 0xb391, 0xb392, 0xb393, 0xb394, 0xb395, 0xb396, 0xb397, 0xb398, 0xb399, 0xb39a, 0xb39b, 0xb39c, 0xb39d, 0xb39e, 0xb39f, 0xb3a0, 0xb440, 0xb441, 0xb442, 0xb443, 0xb444, 0xb445, 0xb446, 0xb447, 0xb448, 0xb449, 0xb44a, 0xb44b, 0xb44c, 0xb44d, 0xb44e, 0xb44f, 0xb450, 0xb451, 0xb452, 0xb453, 0xb454, 0xb455, 0xb456, 0xb457, 0xb458, 0xb459, 0xb45a, 0xb45b, 0xb45c, 0xb45d, 0xb45e, 0xb45f, 0xb460, 0xb461, 0xb462, 0xb463, 0xb464, 0xb465, 0xb466, 0xb467, 0xb468, 0xb469, 0xb46a, 0xb46b, 0xb46c, 0xb46d, 0xb46e, 0xb46f, 0xb470, 0xb471, 0xb472, 0xb473, 0xb474, 0xb475, 0xb476, 0xb477, 0xb478, 0xb479, 0xb47a, 0xb47b, 0xb47c, 0xb47d, 0xb47e, 0xb480, 0xb481, 0xb482, 0xb483, 0xb484, 0xb485, 0xb486, 0xb487, 0xb488, 0xb489, 0xb48a, 0xb48b, 0xb48c, 0xb48d, 0xb48e, 0xb48f, 0xb490, 0xb491, 0xb492, 0xb493, 0xb494, 0xb495, 0xb496, 0xb497, 0xb498, 0xb499, 0xb49a, 0xb49b, 0xb49c, 0xb49d, 0xb49e, 0xb49f, 0xb4a0, 0xb540, 0xb541, 0xb542, 0xb543, 0xb544, 0xb545, 0xb546, 0xb547, 0xb548, 0xb549, 0xb54a, 0xb54b, 0xb54c, 0xb54d, 0xb54e, 0xb54f, 0xb550, 0xb551, 0xb552, 0xb553, 0xb554, 0xb555, 0xb556, 0xb557, 0xb558, 0xb559, 0xb55a, 0xb55b, 0xb55c, 0xb55d, 0xb55e, 0xb55f, 0xb560, 0xb561, 0xb562, 0xb563, 0xb564, 0xb565, 0xb566, 0xb567, 0xb568, 0xb569, 0xb56a, 0xb56b, 0xb56c, 0xb56d, 0xb56e, 0xb56f, 0xb570, 0xb571, 0xb572, 0xb573, 0xb574, 0xb575, 0xb576, 0xb577, 0xb578, 0xb579, 0xb57a, 0xb57b, 0xb57c, 0xb57d, 0xb57e, 0xb580, 0xb581, 0xb582, 0xb583, 0xb584, 0xb585, 0xb586, 0xb587, 0xb588, 0xb589, 0xb58a, 0xb58b, 0xb58c, 0xb58d, 0xb58e, 0xb58f, 0xb590, 0xb591, 0xb592, 0xb593, 0xb594, 0xb595, 0xb596, 0xb597, 0xb598, 0xb599, 0xb59a, 0xb59b, 0xb59c, 0xb59d, 0xb59e, 0xb59f, 0xb5a0, 0xb640, 0xb641, 0xb642, 0xb643, 0xb644, 0xb645, 0xb646, 0xb647, 0xb648, 0xb649, 0xb64a, 0xb64b, 0xb64c, 0xb64d, 0xb64e, 0xb64f, 0xb650, 0xb651, 0xb652, 0xb653, 0xb654, 0xb655, 0xb656, 0xb657, 0xb658, 0xb659, 0xb65a, 0xb65b, 0xb65c, 0xb65d, 0xb65e, 0xb65f, 0xb660, 0xb661, 0xb662, 0xb663, 0xb664, 0xb665, 0xb666, 0xb667, 0xb668, 0xb669, 0xb66a, 0xb66b, 0xb66c, 0xb66d, 0xb66e, 0xb66f, 0xb670, 0xb671, 0xb672, 0xb673, 0xb674, 0xb675, 0xb676, 0xb677, 0xb678, 0xb679, 0xb67a, 0xb67b, 0xb67c, 0xb67d, 0xb67e, 0xb680, 0xb681, 0xb682, 0xb683, 0xb684, 0xb685, 0xb686, 0xb687, 0xb688, 0xb689, 0xb68a, 0xb68b, 0xb68c, 0xb68d, 0xb68e, 0xb68f, 0xb690, 0xb691, 0xb692, 0xb693, 0xb694, 0xb695, 0xb696, 0xb697, 0xb698, 0xb699, 0xb69a, 0xb69b, 0xb69c, 0xb69d, 0xb69e, 0xb69f, 0xb6a0, 0xb740, 0xb741, 0xb742, 0xb743, 0xb744, 0xb745, 0xb746, 0xb747, 0xb748, 0xb749, 0xb74a, 0xb74b, 0xb74c, 0xb74d, 0xb74e, 0xb74f, 0xb750, 0xb751, 0xb752, 0xb753, 0xb754, 0xb755, 0xb756, 0xb757, 0xb758, 0xb759, 0xb75a, 0xb75b, 0xb75c, 0xb75d, 0xb75e, 0xb75f, 0xb760, 0xb761, 0xb762, 0xb763, 0xb764, 0xb765, 0xb766, 0xb767, 0xb768, 0xb769, 0xb76a, 0xb76b, 0xb76c, 0xb76d, 0xb76e, 0xb76f, 0xb770, 0xb771, 0xb772, 0xb773, 0xb774, 0xb775, 0xb776, 0xb777, 0xb778, 0xb779, 0xb77a, 0xb77b, 0xb77c, 0xb77d, 0xb77e, 0xb780, 0xb781, 0xb782, 0xb783, 0xb784, 0xb785, 0xb786, 0xb787, 0xb788, 0xb789, 0xb78a, 0xb78b, 0xb78c, 0xb78d, 0xb78e, 0xb78f, 0xb790, 0xb791, 0xb792, 0xb793, 0xb794, 0xb795, 0xb796, 0xb797, 0xb798, 0xb799, 0xb79a, 0xb79b, 0xb79c, 0xb79d, 0xb79e, 0xb79f, 0xb7a0, 0xb840, 0xb841, 0xb842, 0xb843, 0xb844, 0xb845, 0xb846, 0xb847, 0xb848, 0xb849, 0xb84a, 0xb84b, 0xb84c, 0xb84d, 0xb84e, 0xb84f, 0xb850, 0xb851, 0xb852, 0xb853, 0xb854, 0xb855, 0xb856, 0xb857, 0xb858, 0xb859, 0xb85a, 0xb85b, 0xb85c, 0xb85d, 0xb85e, 0xb85f, 0xb860, 0xb861, 0xb862, 0xb863, 0xb864, 0xb865, 0xb866, 0xb867, 0xb868, 0xb869, 0xb86a, 0xb86b, 0xb86c, 0xb86d, 0xb86e, 0xb86f, 0xb870, 0xb871, 0xb872, 0xb873, 0xb874, 0xb875, 0xb876, 0xb877, 0xb878, 0xb879, 0xb87a, 0xb87b, 0xb87c, 0xb87d, 0xb87e, 0xb880, 0xb881, 0xb882, 0xb883, 0xb884, 0xb885, 0xb886, 0xb887, 0xb888, 0xb889, 0xb88a, 0xb88b, 0xb88c, 0xb88d, 0xb88e, 0xb88f, 0xb890, 0xb891, 0xb892, 0xb893, 0xb894, 0xb895, 0xb896, 0xb897, 0xb898, 0xb899, 0xb89a, 0xb89b, 0xb89c, 0xb89d, 0xb89e, 0xb89f, 0xb8a0, 0xb940, 0xb941, 0xb942, 0xb943, 0xb944, 0xb945, 0xb946, 0xb947, 0xb948, 0xb949, 0xb94a, 0xb94b, 0xb94c, 0xb94d, 0xb94e, 0xb94f, 0xb950, 0xb951, 0xb952, 0xb953, 0xb954, 0xb955, 0xb956, 0xb957, 0xb958, 0xb959, 0xb95a, 0xb95b, 0xb95c, 0xb95d, 0xb95e, 0xb95f, 0xb960, 0xb961, 0xb962, 0xb963, 0xb964, 0xb965, 0xb966, 0xb967, 0xb968, 0xb969, 0xb96a, 0xb96b, 0xb96c, 0xb96d, 0xb96e, 0xb96f, 0xb970, 0xb971, 0xb972, 0xb973, 0xb974, 0xb975, 0xb976, 0xb977, 0xb978, 0xb979, 0xb97a, 0xb97b, 0xb97c, 0xb97d, 0xb97e, 0xb980, 0xb981, 0xb982, 0xb983, 0xb984, 0xb985, 0xb986, 0xb987, 0xb988, 0xb989, 0xb98a, 0xb98b, 0xb98c, 0xb98d, 0xb98e, 0xb98f, 0xb990, 0xb991, 0xb992, 0xb993, 0xb994, 0xb995, 0xb996, 0xb997, 0xb998, 0xb999, 0xb99a, 0xb99b, 0xb99c, 0xb99d, 0xb99e, 0xb99f, 0xb9a0, 0xba40, 0xba41, 0xba42, 0xba43, 0xba44, 0xba45, 0xba46, 0xba47, 0xba48, 0xba49, 0xba4a, 0xba4b, 0xba4c, 0xba4d, 0xba4e, 0xba4f, 0xba50, 0xba51, 0xba52, 0xba53, 0xba54, 0xba55, 0xba56, 0xba57, 0xba58, 0xba59, 0xba5a, 0xba5b, 0xba5c, 0xba5d, 0xba5e, 0xba5f, 0xba60, 0xba61, 0xba62, 0xba63, 0xba64, 0xba65, 0xba66, 0xba67, 0xba68, 0xba69, 0xba6a, 0xba6b, 0xba6c, 0xba6d, 0xba6e, 0xba6f, 0xba70, 0xba71, 0xba72, 0xba73, 0xba74, 0xba75, 0xba76, 0xba77, 0xba78, 0xba79, 0xba7a, 0xba7b, 0xba7c, 0xba7d, 0xba7e, 0xba80, 0xba81, 0xba82, 0xba83, 0xba84, 0xba85, 0xba86, 0xba87, 0xba88, 0xba89, 0xba8a, 0xba8b, 0xba8c, 0xba8d, 0xba8e, 0xba8f, 0xba90, 0xba91, 0xba92, 0xba93, 0xba94, 0xba95, 0xba96, 0xba97, 0xba98, 0xba99, 0xba9a, 0xba9b, 0xba9c, 0xba9d, 0xba9e, 0xba9f, 0xbaa0, 0xbb40, 0xbb41, 0xbb42, 0xbb43, 0xbb44, 0xbb45, 0xbb46, 0xbb47, 0xbb48, 0xbb49, 0xbb4a, 0xbb4b, 0xbb4c, 0xbb4d, 0xbb4e, 0xbb4f, 0xbb50, 0xbb51, 0xbb52, 0xbb53, 0xbb54, 0xbb55, 0xbb56, 0xbb57, 0xbb58, 0xbb59, 0xbb5a, 0xbb5b, 0xbb5c, 0xbb5d, 0xbb5e, 0xbb5f, 0xbb60, 0xbb61, 0xbb62, 0xbb63, 0xbb64, 0xbb65, 0xbb66, 0xbb67, 0xbb68, 0xbb69, 0xbb6a, 0xbb6b, 0xbb6c, 0xbb6d, 0xbb6e, 0xbb6f, 0xbb70, 0xbb71, 0xbb72, 0xbb73, 0xbb74, 0xbb75, 0xbb76, 0xbb77, 0xbb78, 0xbb79, 0xbb7a, 0xbb7b, 0xbb7c, 0xbb7d, 0xbb7e, 0xbb80, 0xbb81, 0xbb82, 0xbb83, 0xbb84, 0xbb85, 0xbb86, 0xbb87, 0xbb88, 0xbb89, 0xbb8a, 0xbb8b, 0xbb8c, 0xbb8d, 0xbb8e, 0xbb8f, 0xbb90, 0xbb91, 0xbb92, 0xbb93, 0xbb94, 0xbb95, 0xbb96, 0xbb97, 0xbb98, 0xbb99, 0xbb9a, 0xbb9b, 0xbb9c, 0xbb9d, 0xbb9e, 0xbb9f, 0xbba0, 0xbc40, 0xbc41, 0xbc42, 0xbc43, 0xbc44, 0xbc45, 0xbc46, 0xbc47, 0xbc48, 0xbc49, 0xbc4a, 0xbc4b, 0xbc4c, 0xbc4d, 0xbc4e, 0xbc4f, 0xbc50, 0xbc51, 0xbc52, 0xbc53, 0xbc54, 0xbc55, 0xbc56, 0xbc57, 0xbc58, 0xbc59, 0xbc5a, 0xbc5b, 0xbc5c, 0xbc5d, 0xbc5e, 0xbc5f, 0xbc60, 0xbc61, 0xbc62, 0xbc63, 0xbc64, 0xbc65, 0xbc66, 0xbc67, 0xbc68, 0xbc69, 0xbc6a, 0xbc6b, 0xbc6c, 0xbc6d, 0xbc6e, 0xbc6f, 0xbc70, 0xbc71, 0xbc72, 0xbc73, 0xbc74, 0xbc75, 0xbc76, 0xbc77, 0xbc78, 0xbc79, 0xbc7a, 0xbc7b, 0xbc7c, 0xbc7d, 0xbc7e, 0xbc80, 0xbc81, 0xbc82, 0xbc83, 0xbc84, 0xbc85, 0xbc86, 0xbc87, 0xbc88, 0xbc89, 0xbc8a, 0xbc8b, 0xbc8c, 0xbc8d, 0xbc8e, 0xbc8f, 0xbc90, 0xbc91, 0xbc92, 0xbc93, 0xbc94, 0xbc95, 0xbc96, 0xbc97, 0xbc98, 0xbc99, 0xbc9a, 0xbc9b, 0xbc9c, 0xbc9d, 0xbc9e, 0xbc9f, 0xbca0, 0xbd40, 0xbd41, 0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, 0xbd48, 0xbd49, 0xbd4a, 0xbd4b, 0xbd4c, 0xbd4d, 0xbd4e, 0xbd4f, 0xbd50, 0xbd51, 0xbd52, 0xbd53, 0xbd54, 0xbd55, 0xbd56, 0xbd57, 0xbd58, 0xbd59, 0xbd5a, 0xbd5b, 0xbd5c, 0xbd5d, 0xbd5e, 0xbd5f, 0xbd60, 0xbd61, 0xbd62, 0xbd63, 0xbd64, 0xbd65, 0xbd66, 0xbd67, 0xbd68, 0xbd69, 0xbd6a, 0xbd6b, 0xbd6c, 0xbd6d, 0xbd6e, 0xbd6f, 0xbd70, 0xbd71, 0xbd72, 0xbd73, 0xbd74, 0xbd75, 0xbd76, 0xbd77, 0xbd78, 0xbd79, 0xbd7a, 0xbd7b, 0xbd7c, 0xbd7d, 0xbd7e, 0xbd80, 0xbd81, 0xbd82, 0xbd83, 0xbd84, 0xbd85, 0xbd86, 0xbd87, 0xbd88, 0xbd89, 0xbd8a, 0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f, 0xbd90, 0xbd91, 0xbd92, 0xbd93, 0xbd94, 0xbd95, 0xbd96, 0xbd97, 0xbd98, 0xbd99, 0xbd9a, 0xbd9b, 0xbd9c, 0xbd9d, 0xbd9e, 0xbd9f, 0xbda0, 0xbe40, 0xbe41, 0xbe42, 0xbe43, 0xbe44, 0xbe45, 0xbe46, 0xbe47, 0xbe48, 0xbe49, 0xbe4a, 0xbe4b, 0xbe4c, 0xbe4d, 0xbe4e, 0xbe4f, 0xbe50, 0xbe51, 0xbe52, 0xbe53, 0xbe54, 0xbe55, 0xbe56, 0xbe57, 0xbe58, 0xbe59, 0xbe5a, 0xbe5b, 0xbe5c, 0xbe5d, 0xbe5e, 0xbe5f, 0xbe60, 0xbe61, 0xbe62, 0xbe63, 0xbe64, 0xbe65, 0xbe66, 0xbe67, 0xbe68, 0xbe69, 0xbe6a, 0xbe6b, 0xbe6c, 0xbe6d, 0xbe6e, 0xbe6f, 0xbe70, 0xbe71, 0xbe72, 0xbe73, 0xbe74, 0xbe75, 0xbe76, 0xbe77, 0xbe78, 0xbe79, 0xbe7a, 0xbe7b, 0xbe7c, 0xbe7d, 0xbe7e, 0xbe80, 0xbe81, 0xbe82, 0xbe83, 0xbe84, 0xbe85, 0xbe86, 0xbe87, 0xbe88, 0xbe89, 0xbe8a, 0xbe8b, 0xbe8c, 0xbe8d, 0xbe8e, 0xbe8f, 0xbe90, 0xbe91, 0xbe92, 0xbe93, 0xbe94, 0xbe95, 0xbe96, 0xbe97, 0xbe98, 0xbe99, 0xbe9a, 0xbe9b, 0xbe9c, 0xbe9d, 0xbe9e, 0xbe9f, 0xbea0, 0xbf40, 0xbf41, 0xbf42, 0xbf43, 0xbf44, 0xbf45, 0xbf46, 0xbf47, 0xbf48, 0xbf49, 0xbf4a, 0xbf4b, 0xbf4c, 0xbf4d, 0xbf4e, 0xbf4f, 0xbf50, 0xbf51, 0xbf52, 0xbf53, 0xbf54, 0xbf55, 0xbf56, 0xbf57, 0xbf58, 0xbf59, 0xbf5a, 0xbf5b, 0xbf5c, 0xbf5d, 0xbf5e, 0xbf5f, 0xbf60, 0xbf61, 0xbf62, 0xbf63, 0xbf64, 0xbf65, 0xbf66, 0xbf67, 0xbf68, 0xbf69, 0xbf6a, 0xbf6b, 0xbf6c, 0xbf6d, 0xbf6e, 0xbf6f, 0xbf70, 0xbf71, 0xbf72, 0xbf73, 0xbf74, 0xbf75, 0xbf76, 0xbf77, 0xbf78, 0xbf79, 0xbf7a, 0xbf7b, 0xbf7c, 0xbf7d, 0xbf7e, 0xbf80, 0xbf81, 0xbf82, 0xbf83, 0xbf84, 0xbf85, 0xbf86, 0xbf87, 0xbf88, 0xbf89, 0xbf8a, 0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90, 0xbf91, 0xbf92, 0xbf93, 0xbf94, 0xbf95, 0xbf96, 0xbf97, 0xbf98, 0xbf99, 0xbf9a, 0xbf9b, 0xbf9c, 0xbf9d, 0xbf9e, 0xbf9f, 0xbfa0, 0xc040, 0xc041, 0xc042, 0xc043, 0xc044, 0xc045, 0xc046, 0xc047, 0xc048, 0xc049, 0xc04a, 0xc04b, 0xc04c, 0xc04d, 0xc04e, 0xc04f, 0xc050, 0xc051, 0xc052, 0xc053, 0xc054, 0xc055, 0xc056, 0xc057, 0xc058, 0xc059, 0xc05a, 0xc05b, 0xc05c, 0xc05d, 0xc05e, 0xc05f, 0xc060, 0xc061, 0xc062, 0xc063, 0xc064, 0xc065, 0xc066, 0xc067, 0xc068, 0xc069, 0xc06a, 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, 0xc070, 0xc071, 0xc072, 0xc073, 0xc074, 0xc075, 0xc076, 0xc077, 0xc078, 0xc079, 0xc07a, 0xc07b, 0xc07c, 0xc07d, 0xc07e, 0xc080, 0xc081, 0xc082, 0xc083, 0xc084, 0xc085, 0xc086, 0xc087, 0xc088, 0xc089, 0xc08a, 0xc08b, 0xc08c, 0xc08d, 0xc08e, 0xc08f, 0xc090, 0xc091, 0xc092, 0xc093, 0xc094, 0xc095, 0xc096, 0xc097, 0xc098, 0xc099, 0xc09a, 0xc09b, 0xc09c, 0xc09d, 0xc09e, 0xc09f, 0xc0a0, 0xc140, 0xc141, 0xc142, 0xc143, 0xc144, 0xc145, 0xc146, 0xc147, 0xc148, 0xc149, 0xc14a, 0xc14b, 0xc14c, 0xc14d, 0xc14e, 0xc14f, 0xc150, 0xc151, 0xc152, 0xc153, 0xc154, 0xc155, 0xc156, 0xc157, 0xc158, 0xc159, 0xc15a, 0xc15b, 0xc15c, 0xc15d, 0xc15e, 0xc15f, 0xc160, 0xc161, 0xc162, 0xc163, 0xc164, 0xc165, 0xc166, 0xc167, 0xc168, 0xc169, 0xc16a, 0xc16b, 0xc16c, 0xc16d, 0xc16e, 0xc16f, 0xc170, 0xc171, 0xc172, 0xc173, 0xc174, 0xc175, 0xc176, 0xc177, 0xc178, 0xc179, 0xc17a, 0xc17b, 0xc17c, 0xc17d, 0xc17e, 0xc180, 0xc181, 0xc182, 0xc183, 0xc184, 0xc185, 0xc186, 0xc187, 0xc188, 0xc189, 0xc18a, 0xc18b, 0xc18c, 0xc18d, 0xc18e, 0xc18f, 0xc190, 0xc191, 0xc192, 0xc193, 0xc194, 0xc195, 0xc196, 0xc197, 0xc198, 0xc199, 0xc19a, 0xc19b, 0xc19c, 0xc19d, 0xc19e, 0xc19f, 0xc1a0, 0xc240, 0xc241, 0xc242, 0xc243, 0xc244, 0xc245, 0xc246, 0xc247, 0xc248, 0xc249, 0xc24a, 0xc24b, 0xc24c, 0xc24d, 0xc24e, 0xc24f, 0xc250, 0xc251, 0xc252, 0xc253, 0xc254, 0xc255, 0xc256, 0xc257, 0xc258, 0xc259, 0xc25a, 0xc25b, 0xc25c, 0xc25d, 0xc25e, 0xc25f, 0xc260, 0xc261, 0xc262, 0xc263, 0xc264, 0xc265, 0xc266, 0xc267, 0xc268, 0xc269, 0xc26a, 0xc26b, 0xc26c, 0xc26d, 0xc26e, 0xc26f, 0xc270, 0xc271, 0xc272, 0xc273, 0xc274, 0xc275, 0xc276, 0xc277, 0xc278, 0xc279, 0xc27a, 0xc27b, 0xc27c, 0xc27d, 0xc27e, 0xc280, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287, 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f, 0xc290, 0xc291, 0xc292, 0xc293, 0xc294, 0xc295, 0xc296, 0xc297, 0xc298, 0xc299, 0xc29a, 0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f, 0xc2a0, 0xc340, 0xc341, 0xc342, 0xc343, 0xc344, 0xc345, 0xc346, 0xc347, 0xc348, 0xc349, 0xc34a, 0xc34b, 0xc34c, 0xc34d, 0xc34e, 0xc34f, 0xc350, 0xc351, 0xc352, 0xc353, 0xc354, 0xc355, 0xc356, 0xc357, 0xc358, 0xc359, 0xc35a, 0xc35b, 0xc35c, 0xc35d, 0xc35e, 0xc35f, 0xc360, 0xc361, 0xc362, 0xc363, 0xc364, 0xc365, 0xc366, 0xc367, 0xc368, 0xc369, 0xc36a, 0xc36b, 0xc36c, 0xc36d, 0xc36e, 0xc36f, 0xc370, 0xc371, 0xc372, 0xc373, 0xc374, 0xc375, 0xc376, 0xc377, 0xc378, 0xc379, 0xc37a, 0xc37b, 0xc37c, 0xc37d, 0xc37e, 0xc380, 0xc381, 0xc382, 0xc383, 0xc384, 0xc385, 0xc386, 0xc387, 0xc388, 0xc389, 0xc38a, 0xc38b, 0xc38c, 0xc38d, 0xc38e, 0xc38f, 0xc390, 0xc391, 0xc392, 0xc393, 0xc394, 0xc395, 0xc396, 0xc397, 0xc398, 0xc399, 0xc39a, 0xc39b, 0xc39c, 0xc39d, 0xc39e, 0xc39f, 0xc3a0, 0xc440, 0xc441, 0xc442, 0xc443, 0xc444, 0xc445, 0xc446, 0xc447, 0xc448, 0xc449, 0xc44a, 0xc44b, 0xc44c, 0xc44d, 0xc44e, 0xc44f, 0xc450, 0xc451, 0xc452, 0xc453, 0xc454, 0xc455, 0xc456, 0xc457, 0xc458, 0xc459, 0xc45a, 0xc45b, 0xc45c, 0xc45d, 0xc45e, 0xc45f, 0xc460, 0xc461, 0xc462, 0xc463, 0xc464, 0xc465, 0xc466, 0xc467, 0xc468, 0xc469, 0xc46a, 0xc46b, 0xc46c, 0xc46d, 0xc46e, 0xc46f, 0xc470, 0xc471, 0xc472, 0xc473, 0xc474, 0xc475, 0xc476, 0xc477, 0xc478, 0xc479, 0xc47a, 0xc47b, 0xc47c, 0xc47d, 0xc47e, 0xc480, 0xc481, 0xc482, 0xc483, 0xc484, 0xc485, 0xc486, 0xc487, 0xc488, 0xc489, 0xc48a, 0xc48b, 0xc48c, 0xc48d, 0xc48e, 0xc48f, 0xc490, 0xc491, 0xc492, 0xc493, 0xc494, 0xc495, 0xc496, 0xc497, 0xc498, 0xc499, 0xc49a, 0xc49b, 0xc49c, 0xc49d, 0xc49e, 0xc49f, 0xc4a0, 0xc540, 0xc541, 0xc542, 0xc543, 0xc544, 0xc545, 0xc546, 0xc547, 0xc548, 0xc549, 0xc54a, 0xc54b, 0xc54c, 0xc54d, 0xc54e, 0xc54f, 0xc550, 0xc551, 0xc552, 0xc553, 0xc554, 0xc555, 0xc556, 0xc557, 0xc558, 0xc559, 0xc55a, 0xc55b, 0xc55c, 0xc55d, 0xc55e, 0xc55f, 0xc560, 0xc561, 0xc562, 0xc563, 0xc564, 0xc565, 0xc566, 0xc567, 0xc568, 0xc569, 0xc56a, 0xc56b, 0xc56c, 0xc56d, 0xc56e, 0xc56f, 0xc570, 0xc571, 0xc572, 0xc573, 0xc574, 0xc575, 0xc576, 0xc577, 0xc578, 0xc579, 0xc57a, 0xc57b, 0xc57c, 0xc57d, 0xc57e, 0xc580, 0xc581, 0xc582, 0xc583, 0xc584, 0xc585, 0xc586, 0xc587, 0xc588, 0xc589, 0xc58a, 0xc58b, 0xc58c, 0xc58d, 0xc58e, 0xc58f, 0xc590, 0xc591, 0xc592, 0xc593, 0xc594, 0xc595, 0xc596, 0xc597, 0xc598, 0xc599, 0xc59a, 0xc59b, 0xc59c, 0xc59d, 0xc59e, 0xc59f, 0xc5a0, 0xc640, 0xc641, 0xc642, 0xc643, 0xc644, 0xc645, 0xc646, 0xc647, 0xc648, 0xc649, 0xc64a, 0xc64b, 0xc64c, 0xc64d, 0xc64e, 0xc64f, 0xc650, 0xc651, 0xc652, 0xc653, 0xc654, 0xc655, 0xc656, 0xc657, 0xc658, 0xc659, 0xc65a, 0xc65b, 0xc65c, 0xc65d, 0xc65e, 0xc65f, 0xc660, 0xc661, 0xc662, 0xc663, 0xc664, 0xc665, 0xc666, 0xc667, 0xc668, 0xc669, 0xc66a, 0xc66b, 0xc66c, 0xc66d, 0xc66e, 0xc66f, 0xc670, 0xc671, 0xc672, 0xc673, 0xc674, 0xc675, 0xc676, 0xc677, 0xc678, 0xc679, 0xc67a, 0xc67b, 0xc67c, 0xc67d, 0xc67e, 0xc680, 0xc681, 0xc682, 0xc683, 0xc684, 0xc685, 0xc686, 0xc687, 0xc688, 0xc689, 0xc68a, 0xc68b, 0xc68c, 0xc68d, 0xc68e, 0xc68f, 0xc690, 0xc691, 0xc692, 0xc693, 0xc694, 0xc695, 0xc696, 0xc697, 0xc698, 0xc699, 0xc69a, 0xc69b, 0xc69c, 0xc69d, 0xc69e, 0xc69f, 0xc6a0, 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc780, 0xc781, 0xc782, 0xc783, 0xc784, 0xc785, 0xc786, 0xc787, 0xc788, 0xc789, 0xc78a, 0xc78b, 0xc78c, 0xc78d, 0xc78e, 0xc78f, 0xc790, 0xc791, 0xc792, 0xc793, 0xc794, 0xc795, 0xc796, 0xc797, 0xc798, 0xc799, 0xc79a, 0xc79b, 0xc79c, 0xc79d, 0xc79e, 0xc79f, 0xc7a0, 0xc840, 0xc841, 0xc842, 0xc843, 0xc844, 0xc845, 0xc846, 0xc847, 0xc848, 0xc849, 0xc84a, 0xc84b, 0xc84c, 0xc84d, 0xc84e, 0xc84f, 0xc850, 0xc851, 0xc852, 0xc853, 0xc854, 0xc855, 0xc856, 0xc857, 0xc858, 0xc859, 0xc85a, 0xc85b, 0xc85c, 0xc85d, 0xc85e, 0xc85f, 0xc860, 0xc861, 0xc862, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867, 0xc868, 0xc869, 0xc86a, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, 0xc870, 0xc871, 0xc872, 0xc873, 0xc874, 0xc875, 0xc876, 0xc877, 0xc878, 0xc879, 0xc87a, 0xc87b, 0xc87c, 0xc87d, 0xc87e, 0xc880, 0xc881, 0xc882, 0xc883, 0xc884, 0xc885, 0xc886, 0xc887, 0xc888, 0xc889, 0xc88a, 0xc88b, 0xc88c, 0xc88d, 0xc88e, 0xc88f, 0xc890, 0xc891, 0xc892, 0xc893, 0xc894, 0xc895, 0xc896, 0xc897, 0xc898, 0xc899, 0xc89a, 0xc89b, 0xc89c, 0xc89d, 0xc89e, 0xc89f, 0xc8a0, 0xc940, 0xc941, 0xc942, 0xc943, 0xc944, 0xc945, 0xc946, 0xc947, 0xc948, 0xc949, 0xc94a, 0xc94b, 0xc94c, 0xc94d, 0xc94e, 0xc94f, 0xc950, 0xc951, 0xc952, 0xc953, 0xc954, 0xc955, 0xc956, 0xc957, 0xc958, 0xc959, 0xc95a, 0xc95b, 0xc95c, 0xc95d, 0xc95e, 0xc95f, 0xc960, 0xc961, 0xc962, 0xc963, 0xc964, 0xc965, 0xc966, 0xc967, 0xc968, 0xc969, 0xc96a, 0xc96b, 0xc96c, 0xc96d, 0xc96e, 0xc96f, 0xc970, 0xc971, 0xc972, 0xc973, 0xc974, 0xc975, 0xc976, 0xc977, 0xc978, 0xc979, 0xc97a, 0xc97b, 0xc97c, 0xc97d, 0xc97e, 0xc980, 0xc981, 0xc982, 0xc983, 0xc984, 0xc985, 0xc986, 0xc987, 0xc988, 0xc989, 0xc98a, 0xc98b, 0xc98c, 0xc98d, 0xc98e, 0xc98f, 0xc990, 0xc991, 0xc992, 0xc993, 0xc994, 0xc995, 0xc996, 0xc997, 0xc998, 0xc999, 0xc99a, 0xc99b, 0xc99c, 0xc99d, 0xc99e, 0xc99f, 0xc9a0, 0xca40, 0xca41, 0xca42, 0xca43, 0xca44, 0xca45, 0xca46, 0xca47, 0xca48, 0xca49, 0xca4a, 0xca4b, 0xca4c, 0xca4d, 0xca4e, 0xca4f, 0xca50, 0xca51, 0xca52, 0xca53, 0xca54, 0xca55, 0xca56, 0xca57, 0xca58, 0xca59, 0xca5a, 0xca5b, 0xca5c, 0xca5d, 0xca5e, 0xca5f, 0xca60, 0xca61, 0xca62, 0xca63, 0xca64, 0xca65, 0xca66, 0xca67, 0xca68, 0xca69, 0xca6a, 0xca6b, 0xca6c, 0xca6d, 0xca6e, 0xca6f, 0xca70, 0xca71, 0xca72, 0xca73, 0xca74, 0xca75, 0xca76, 0xca77, 0xca78, 0xca79, 0xca7a, 0xca7b, 0xca7c, 0xca7d, 0xca7e, 0xca80, 0xca81, 0xca82, 0xca83, 0xca84, 0xca85, 0xca86, 0xca87, 0xca88, 0xca89, 0xca8a, 0xca8b, 0xca8c, 0xca8d, 0xca8e, 0xca8f, 0xca90, 0xca91, 0xca92, 0xca93, 0xca94, 0xca95, 0xca96, 0xca97, 0xca98, 0xca99, 0xca9a, 0xca9b, 0xca9c, 0xca9d, 0xca9e, 0xca9f, 0xcaa0, 0xcb40, 0xcb41, 0xcb42, 0xcb43, 0xcb44, 0xcb45, 0xcb46, 0xcb47, 0xcb48, 0xcb49, 0xcb4a, 0xcb4b, 0xcb4c, 0xcb4d, 0xcb4e, 0xcb4f, 0xcb50, 0xcb51, 0xcb52, 0xcb53, 0xcb54, 0xcb55, 0xcb56, 0xcb57, 0xcb58, 0xcb59, 0xcb5a, 0xcb5b, 0xcb5c, 0xcb5d, 0xcb5e, 0xcb5f, 0xcb60, 0xcb61, 0xcb62, 0xcb63, 0xcb64, 0xcb65, 0xcb66, 0xcb67, 0xcb68, 0xcb69, 0xcb6a, 0xcb6b, 0xcb6c, 0xcb6d, 0xcb6e, 0xcb6f, 0xcb70, 0xcb71, 0xcb72, 0xcb73, 0xcb74, 0xcb75, 0xcb76, 0xcb77, 0xcb78, 0xcb79, 0xcb7a, 0xcb7b, 0xcb7c, 0xcb7d, 0xcb7e, 0xcb80, 0xcb81, 0xcb82, 0xcb83, 0xcb84, 0xcb85, 0xcb86, 0xcb87, 0xcb88, 0xcb89, 0xcb8a, 0xcb8b, 0xcb8c, 0xcb8d, 0xcb8e, 0xcb8f, 0xcb90, 0xcb91, 0xcb92, 0xcb93, 0xcb94, 0xcb95, 0xcb96, 0xcb97, 0xcb98, 0xcb99, 0xcb9a, 0xcb9b, 0xcb9c, 0xcb9d, 0xcb9e, 0xcb9f, 0xcba0, 0xcc40, 0xcc41, 0xcc42, 0xcc43, 0xcc44, 0xcc45, 0xcc46, 0xcc47, 0xcc48, 0xcc49, 0xcc4a, 0xcc4b, 0xcc4c, 0xcc4d, 0xcc4e, 0xcc4f, 0xcc50, 0xcc51, 0xcc52, 0xcc53, 0xcc54, 0xcc55, 0xcc56, 0xcc57, 0xcc58, 0xcc59, 0xcc5a, 0xcc5b, 0xcc5c, 0xcc5d, 0xcc5e, 0xcc5f, 0xcc60, 0xcc61, 0xcc62, 0xcc63, 0xcc64, 0xcc65, 0xcc66, 0xcc67, 0xcc68, 0xcc69, 0xcc6a, 0xcc6b, 0xcc6c, 0xcc6d, 0xcc6e, 0xcc6f, 0xcc70, 0xcc71, 0xcc72, 0xcc73, 0xcc74, 0xcc75, 0xcc76, 0xcc77, 0xcc78, 0xcc79, 0xcc7a, 0xcc7b, 0xcc7c, 0xcc7d, 0xcc7e, 0xcc80, 0xcc81, 0xcc82, 0xcc83, 0xcc84, 0xcc85, 0xcc86, 0xcc87, 0xcc88, 0xcc89, 0xcc8a, 0xcc8b, 0xcc8c, 0xcc8d, 0xcc8e, 0xcc8f, 0xcc90, 0xcc91, 0xcc92, 0xcc93, 0xcc94, 0xcc95, 0xcc96, 0xcc97, 0xcc98, 0xcc99, 0xcc9a, 0xcc9b, 0xcc9c, 0xcc9d, 0xcc9e, 0xcc9f, 0xcca0, 0xcd40, 0xcd41, 0xcd42, 0xcd43, 0xcd44, 0xcd45, 0xcd46, 0xcd47, 0xcd48, 0xcd49, 0xcd4a, 0xcd4b, 0xcd4c, 0xcd4d, 0xcd4e, 0xcd4f, 0xcd50, 0xcd51, 0xcd52, 0xcd53, 0xcd54, 0xcd55, 0xcd56, 0xcd57, 0xcd58, 0xcd59, 0xcd5a, 0xcd5b, 0xcd5c, 0xcd5d, 0xcd5e, 0xcd5f, 0xcd60, 0xcd61, 0xcd62, 0xcd63, 0xcd64, 0xcd65, 0xcd66, 0xcd67, 0xcd68, 0xcd69, 0xcd6a, 0xcd6b, 0xcd6c, 0xcd6d, 0xcd6e, 0xcd6f, 0xcd70, 0xcd71, 0xcd72, 0xcd73, 0xcd74, 0xcd75, 0xcd76, 0xcd77, 0xcd78, 0xcd79, 0xcd7a, 0xcd7b, 0xcd7c, 0xcd7d, 0xcd7e, 0xcd80, 0xcd81, 0xcd82, 0xcd83, 0xcd84, 0xcd85, 0xcd86, 0xcd87, 0xcd88, 0xcd89, 0xcd8a, 0xcd8b, 0xcd8c, 0xcd8d, 0xcd8e, 0xcd8f, 0xcd90, 0xcd91, 0xcd92, 0xcd93, 0xcd94, 0xcd95, 0xcd96, 0xcd97, 0xcd98, 0xcd99, 0xcd9a, 0xcd9b, 0xcd9c, 0xcd9d, 0xcd9e, 0xcd9f, 0xcda0, 0xce40, 0xce41, 0xce42, 0xce43, 0xce44, 0xce45, 0xce46, 0xce47, 0xce48, 0xce49, 0xce4a, 0xce4b, 0xce4c, 0xce4d, 0xce4e, 0xce4f, 0xce50, 0xce51, 0xce52, 0xce53, 0xce54, 0xce55, 0xce56, 0xce57, 0xce58, 0xce59, 0xce5a, 0xce5b, 0xce5c, 0xce5d, 0xce5e, 0xce5f, 0xce60, 0xce61, 0xce62, 0xce63, 0xce64, 0xce65, 0xce66, 0xce67, 0xce68, 0xce69, 0xce6a, 0xce6b, 0xce6c, 0xce6d, 0xce6e, 0xce6f, 0xce70, 0xce71, 0xce72, 0xce73, 0xce74, 0xce75, 0xce76, 0xce77, 0xce78, 0xce79, 0xce7a, 0xce7b, 0xce7c, 0xce7d, 0xce7e, 0xce80, 0xce81, 0xce82, 0xce83, 0xce84, 0xce85, 0xce86, 0xce87, 0xce88, 0xce89, 0xce8a, 0xce8b, 0xce8c, 0xce8d, 0xce8e, 0xce8f, 0xce90, 0xce91, 0xce92, 0xce93, 0xce94, 0xce95, 0xce96, 0xce97, 0xce98, 0xce99, 0xce9a, 0xce9b, 0xce9c, 0xce9d, 0xce9e, 0xce9f, 0xcea0, 0xcf40, 0xcf41, 0xcf42, 0xcf43, 0xcf44, 0xcf45, 0xcf46, 0xcf47, 0xcf48, 0xcf49, 0xcf4a, 0xcf4b, 0xcf4c, 0xcf4d, 0xcf4e, 0xcf4f, 0xcf50, 0xcf51, 0xcf52, 0xcf53, 0xcf54, 0xcf55, 0xcf56, 0xcf57, 0xcf58, 0xcf59, 0xcf5a, 0xcf5b, 0xcf5c, 0xcf5d, 0xcf5e, 0xcf5f, 0xcf60, 0xcf61, 0xcf62, 0xcf63, 0xcf64, 0xcf65, 0xcf66, 0xcf67, 0xcf68, 0xcf69, 0xcf6a, 0xcf6b, 0xcf6c, 0xcf6d, 0xcf6e, 0xcf6f, 0xcf70, 0xcf71, 0xcf72, 0xcf73, 0xcf74, 0xcf75, 0xcf76, 0xcf77, 0xcf78, 0xcf79, 0xcf7a, 0xcf7b, 0xcf7c, 0xcf7d, 0xcf7e, 0xcf80, 0xcf81, 0xcf82, 0xcf83, 0xcf84, 0xcf85, 0xcf86, 0xcf87, 0xcf88, 0xcf89, 0xcf8a, 0xcf8b, 0xcf8c, 0xcf8d, 0xcf8e, 0xcf8f, 0xcf90, 0xcf91, 0xcf92, 0xcf93, 0xcf94, 0xcf95, 0xcf96, 0xcf97, 0xcf98, 0xcf99, 0xcf9a, 0xcf9b, 0xcf9c, 0xcf9d, 0xcf9e, 0xcf9f, 0xcfa0, 0xd040, 0xd041, 0xd042, 0xd043, 0xd044, 0xd045, 0xd046, 0xd047, 0xd048, 0xd049, 0xd04a, 0xd04b, 0xd04c, 0xd04d, 0xd04e, 0xd04f, 0xd050, 0xd051, 0xd052, 0xd053, 0xd054, 0xd055, 0xd056, 0xd057, 0xd058, 0xd059, 0xd05a, 0xd05b, 0xd05c, 0xd05d, 0xd05e, 0xd05f, 0xd060, 0xd061, 0xd062, 0xd063, 0xd064, 0xd065, 0xd066, 0xd067, 0xd068, 0xd069, 0xd06a, 0xd06b, 0xd06c, 0xd06d, 0xd06e, 0xd06f, 0xd070, 0xd071, 0xd072, 0xd073, 0xd074, 0xd075, 0xd076, 0xd077, 0xd078, 0xd079, 0xd07a, 0xd07b, 0xd07c, 0xd07d, 0xd07e, 0xd080, 0xd081, 0xd082, 0xd083, 0xd084, 0xd085, 0xd086, 0xd087, 0xd088, 0xd089, 0xd08a, 0xd08b, 0xd08c, 0xd08d, 0xd08e, 0xd08f, 0xd090, 0xd091, 0xd092, 0xd093, 0xd094, 0xd095, 0xd096, 0xd097, 0xd098, 0xd099, 0xd09a, 0xd09b, 0xd09c, 0xd09d, 0xd09e, 0xd09f, 0xd0a0, 0xd140, 0xd141, 0xd142, 0xd143, 0xd144, 0xd145, 0xd146, 0xd147, 0xd148, 0xd149, 0xd14a, 0xd14b, 0xd14c, 0xd14d, 0xd14e, 0xd14f, 0xd150, 0xd151, 0xd152, 0xd153, 0xd154, 0xd155, 0xd156, 0xd157, 0xd158, 0xd159, 0xd15a, 0xd15b, 0xd15c, 0xd15d, 0xd15e, 0xd15f, 0xd160, 0xd161, 0xd162, 0xd163, 0xd164, 0xd165, 0xd166, 0xd167, 0xd168, 0xd169, 0xd16a, 0xd16b, 0xd16c, 0xd16d, 0xd16e, 0xd16f, 0xd170, 0xd171, 0xd172, 0xd173, 0xd174, 0xd175, 0xd176, 0xd177, 0xd178, 0xd179, 0xd17a, 0xd17b, 0xd17c, 0xd17d, 0xd17e, 0xd180, 0xd181, 0xd182, 0xd183, 0xd184, 0xd185, 0xd186, 0xd187, 0xd188, 0xd189, 0xd18a, 0xd18b, 0xd18c, 0xd18d, 0xd18e, 0xd18f, 0xd190, 0xd191, 0xd192, 0xd193, 0xd194, 0xd195, 0xd196, 0xd197, 0xd198, 0xd199, 0xd19a, 0xd19b, 0xd19c, 0xd19d, 0xd19e, 0xd19f, 0xd1a0, 0xd240, 0xd241, 0xd242, 0xd243, 0xd244, 0xd245, 0xd246, 0xd247, 0xd248, 0xd249, 0xd24a, 0xd24b, 0xd24c, 0xd24d, 0xd24e, 0xd24f, 0xd250, 0xd251, 0xd252, 0xd253, 0xd254, 0xd255, 0xd256, 0xd257, 0xd258, 0xd259, 0xd25a, 0xd25b, 0xd25c, 0xd25d, 0xd25e, 0xd25f, 0xd260, 0xd261, 0xd262, 0xd263, 0xd264, 0xd265, 0xd266, 0xd267, 0xd268, 0xd269, 0xd26a, 0xd26b, 0xd26c, 0xd26d, 0xd26e, 0xd26f, 0xd270, 0xd271, 0xd272, 0xd273, 0xd274, 0xd275, 0xd276, 0xd277, 0xd278, 0xd279, 0xd27a, 0xd27b, 0xd27c, 0xd27d, 0xd27e, 0xd280, 0xd281, 0xd282, 0xd283, 0xd284, 0xd285, 0xd286, 0xd287, 0xd288, 0xd289, 0xd28a, 0xd28b, 0xd28c, 0xd28d, 0xd28e, 0xd28f, 0xd290, 0xd291, 0xd292, 0xd293, 0xd294, 0xd295, 0xd296, 0xd297, 0xd298, 0xd299, 0xd29a, 0xd29b, 0xd29c, 0xd29d, 0xd29e, 0xd29f, 0xd2a0, 0xd340, 0xd341, 0xd342, 0xd343, 0xd344, 0xd345, 0xd346, 0xd347, 0xd348, 0xd349, 0xd34a, 0xd34b, 0xd34c, 0xd34d, 0xd34e, 0xd34f, 0xd350, 0xd351, 0xd352, 0xd353, 0xd354, 0xd355, 0xd356, 0xd357, 0xd358, 0xd359, 0xd35a, 0xd35b, 0xd35c, 0xd35d, 0xd35e, 0xd35f, 0xd360, 0xd361, 0xd362, 0xd363, 0xd364, 0xd365, 0xd366, 0xd367, 0xd368, 0xd369, 0xd36a, 0xd36b, 0xd36c, 0xd36d, 0xd36e, 0xd36f, 0xd370, 0xd371, 0xd372, 0xd373, 0xd374, 0xd375, 0xd376, 0xd377, 0xd378, 0xd379, 0xd37a, 0xd37b, 0xd37c, 0xd37d, 0xd37e, 0xd380, 0xd381, 0xd382, 0xd383, 0xd384, 0xd385, 0xd386, 0xd387, 0xd388, 0xd389, 0xd38a, 0xd38b, 0xd38c, 0xd38d, 0xd38e, 0xd38f, 0xd390, 0xd391, 0xd392, 0xd393, 0xd394, 0xd395, 0xd396, 0xd397, 0xd398, 0xd399, 0xd39a, 0xd39b, 0xd39c, 0xd39d, 0xd39e, 0xd39f, 0xd3a0, 0xd440, 0xd441, 0xd442, 0xd443, 0xd444, 0xd445, 0xd446, 0xd447, 0xd448, 0xd449, 0xd44a, 0xd44b, 0xd44c, 0xd44d, 0xd44e, 0xd44f, 0xd450, 0xd451, 0xd452, 0xd453, 0xd454, 0xd455, 0xd456, 0xd457, 0xd458, 0xd459, 0xd45a, 0xd45b, 0xd45c, 0xd45d, 0xd45e, 0xd45f, 0xd460, 0xd461, 0xd462, 0xd463, 0xd464, 0xd465, 0xd466, 0xd467, 0xd468, 0xd469, 0xd46a, 0xd46b, 0xd46c, 0xd46d, 0xd46e, 0xd46f, 0xd470, 0xd471, 0xd472, 0xd473, 0xd474, 0xd475, 0xd476, 0xd477, 0xd478, 0xd479, 0xd47a, 0xd47b, 0xd47c, 0xd47d, 0xd47e, 0xd480, 0xd481, 0xd482, 0xd483, 0xd484, 0xd485, 0xd486, 0xd487, 0xd488, 0xd489, 0xd48a, 0xd48b, 0xd48c, 0xd48d, 0xd48e, 0xd48f, 0xd490, 0xd491, 0xd492, 0xd493, 0xd494, 0xd495, 0xd496, 0xd497, 0xd498, 0xd499, 0xd49a, 0xd49b, 0xd49c, 0xd49d, 0xd49e, 0xd49f, 0xd4a0, 0xd540, 0xd541, 0xd542, 0xd543, 0xd544, 0xd545, 0xd546, 0xd547, 0xd548, 0xd549, 0xd54a, 0xd54b, 0xd54c, 0xd54d, 0xd54e, 0xd54f, 0xd550, 0xd551, 0xd552, 0xd553, 0xd554, 0xd555, 0xd556, 0xd557, 0xd558, 0xd559, 0xd55a, 0xd55b, 0xd55c, 0xd55d, 0xd55e, 0xd55f, 0xd560, 0xd561, 0xd562, 0xd563, 0xd564, 0xd565, 0xd566, 0xd567, 0xd568, 0xd569, 0xd56a, 0xd56b, 0xd56c, 0xd56d, 0xd56e, 0xd56f, 0xd570, 0xd571, 0xd572, 0xd573, 0xd574, 0xd575, 0xd576, 0xd577, 0xd578, 0xd579, 0xd57a, 0xd57b, 0xd57c, 0xd57d, 0xd57e, 0xd580, 0xd581, 0xd582, 0xd583, 0xd584, 0xd585, 0xd586, 0xd587, 0xd588, 0xd589, 0xd58a, 0xd58b, 0xd58c, 0xd58d, 0xd58e, 0xd58f, 0xd590, 0xd591, 0xd592, 0xd593, 0xd594, 0xd595, 0xd596, 0xd597, 0xd598, 0xd599, 0xd59a, 0xd59b, 0xd59c, 0xd59d, 0xd59e, 0xd59f, 0xd5a0, 0xd640, 0xd641, 0xd642, 0xd643, 0xd644, 0xd645, 0xd646, 0xd647, 0xd648, 0xd649, 0xd64a, 0xd64b, 0xd64c, 0xd64d, 0xd64e, 0xd64f, 0xd650, 0xd651, 0xd652, 0xd653, 0xd654, 0xd655, 0xd656, 0xd657, 0xd658, 0xd659, 0xd65a, 0xd65b, 0xd65c, 0xd65d, 0xd65e, 0xd65f, 0xd660, 0xd661, 0xd662, 0xd663, 0xd664, 0xd665, 0xd666, 0xd667, 0xd668, 0xd669, 0xd66a, 0xd66b, 0xd66c, 0xd66d, 0xd66e, 0xd66f, 0xd670, 0xd671, 0xd672, 0xd673, 0xd674, 0xd675, 0xd676, 0xd677, 0xd678, 0xd679, 0xd67a, 0xd67b, 0xd67c, 0xd67d, 0xd67e, 0xd680, 0xd681, 0xd682, 0xd683, 0xd684, 0xd685, 0xd686, 0xd687, 0xd688, 0xd689, 0xd68a, 0xd68b, 0xd68c, 0xd68d, 0xd68e, 0xd68f, 0xd690, 0xd691, 0xd692, 0xd693, 0xd694, 0xd695, 0xd696, 0xd697, 0xd698, 0xd699, 0xd69a, 0xd69b, 0xd69c, 0xd69d, 0xd69e, 0xd69f, 0xd6a0, 0xd740, 0xd741, 0xd742, 0xd743, 0xd744, 0xd745, 0xd746, 0xd747, 0xd748, 0xd749, 0xd74a, 0xd74b, 0xd74c, 0xd74d, 0xd74e, 0xd74f, 0xd750, 0xd751, 0xd752, 0xd753, 0xd754, 0xd755, 0xd756, 0xd757, 0xd758, 0xd759, 0xd75a, 0xd75b, 0xd75c, 0xd75d, 0xd75e, 0xd75f, 0xd760, 0xd761, 0xd762, 0xd763, 0xd764, 0xd765, 0xd766, 0xd767, 0xd768, 0xd769, 0xd76a, 0xd76b, 0xd76c, 0xd76d, 0xd76e, 0xd76f, 0xd770, 0xd771, 0xd772, 0xd773, 0xd774, 0xd775, 0xd776, 0xd777, 0xd778, 0xd779, 0xd77a, 0xd77b, 0xd77c, 0xd77d, 0xd77e, 0xd780, 0xd781, 0xd782, 0xd783, 0xd784, 0xd785, 0xd786, 0xd787, 0xd788, 0xd789, 0xd78a, 0xd78b, 0xd78c, 0xd78d, 0xd78e, 0xd78f, 0xd790, 0xd791, 0xd792, 0xd793, 0xd794, 0xd795, 0xd796, 0xd797, 0xd798, 0xd799, 0xd79a, 0xd79b, 0xd79c, 0xd79d, 0xd79e, 0xd79f, 0xd7a0, 0xd840, 0xd841, 0xd842, 0xd843, 0xd844, 0xd845, 0xd846, 0xd847, 0xd848, 0xd849, 0xd84a, 0xd84b, 0xd84c, 0xd84d, 0xd84e, 0xd84f, 0xd850, 0xd851, 0xd852, 0xd853, 0xd854, 0xd855, 0xd856, 0xd857, 0xd858, 0xd859, 0xd85a, 0xd85b, 0xd85c, 0xd85d, 0xd85e, 0xd85f, 0xd860, 0xd861, 0xd862, 0xd863, 0xd864, 0xd865, 0xd866, 0xd867, 0xd868, 0xd869, 0xd86a, 0xd86b, 0xd86c, 0xd86d, 0xd86e, 0xd86f, 0xd870, 0xd871, 0xd872, 0xd873, 0xd874, 0xd875, 0xd876, 0xd877, 0xd878, 0xd879, 0xd87a, 0xd87b, 0xd87c, 0xd87d, 0xd87e, 0xd880, 0xd881, 0xd882, 0xd883, 0xd884, 0xd885, 0xd886, 0xd887, 0xd888, 0xd889, 0xd88a, 0xd88b, 0xd88c, 0xd88d, 0xd88e, 0xd88f, 0xd890, 0xd891, 0xd892, 0xd893, 0xd894, 0xd895, 0xd896, 0xd897, 0xd898, 0xd899, 0xd89a, 0xd89b, 0xd89c, 0xd89d, 0xd89e, 0xd89f, 0xd8a0, 0xd940, 0xd941, 0xd942, 0xd943, 0xd944, 0xd945, 0xd946, 0xd947, 0xd948, 0xd949, 0xd94a, 0xd94b, 0xd94c, 0xd94d, 0xd94e, 0xd94f, 0xd950, 0xd951, 0xd952, 0xd953, 0xd954, 0xd955, 0xd956, 0xd957, 0xd958, 0xd959, 0xd95a, 0xd95b, 0xd95c, 0xd95d, 0xd95e, 0xd95f, 0xd960, 0xd961, 0xd962, 0xd963, 0xd964, 0xd965, 0xd966, 0xd967, 0xd968, 0xd969, 0xd96a, 0xd96b, 0xd96c, 0xd96d, 0xd96e, 0xd96f, 0xd970, 0xd971, 0xd972, 0xd973, 0xd974, 0xd975, 0xd976, 0xd977, 0xd978, 0xd979, 0xd97a, 0xd97b, 0xd97c, 0xd97d, 0xd97e, 0xd980, 0xd981, 0xd982, 0xd983, 0xd984, 0xd985, 0xd986, 0xd987, 0xd988, 0xd989, 0xd98a, 0xd98b, 0xd98c, 0xd98d, 0xd98e, 0xd98f, 0xd990, 0xd991, 0xd992, 0xd993, 0xd994, 0xd995, 0xd996, 0xd997, 0xd998, 0xd999, 0xd99a, 0xd99b, 0xd99c, 0xd99d, 0xd99e, 0xd99f, 0xd9a0, 0xda40, 0xda41, 0xda42, 0xda43, 0xda44, 0xda45, 0xda46, 0xda47, 0xda48, 0xda49, 0xda4a, 0xda4b, 0xda4c, 0xda4d, 0xda4e, 0xda4f, 0xda50, 0xda51, 0xda52, 0xda53, 0xda54, 0xda55, 0xda56, 0xda57, 0xda58, 0xda59, 0xda5a, 0xda5b, 0xda5c, 0xda5d, 0xda5e, 0xda5f, 0xda60, 0xda61, 0xda62, 0xda63, 0xda64, 0xda65, 0xda66, 0xda67, 0xda68, 0xda69, 0xda6a, 0xda6b, 0xda6c, 0xda6d, 0xda6e, 0xda6f, 0xda70, 0xda71, 0xda72, 0xda73, 0xda74, 0xda75, 0xda76, 0xda77, 0xda78, 0xda79, 0xda7a, 0xda7b, 0xda7c, 0xda7d, 0xda7e, 0xda80, 0xda81, 0xda82, 0xda83, 0xda84, 0xda85, 0xda86, 0xda87, 0xda88, 0xda89, 0xda8a, 0xda8b, 0xda8c, 0xda8d, 0xda8e, 0xda8f, 0xda90, 0xda91, 0xda92, 0xda93, 0xda94, 0xda95, 0xda96, 0xda97, 0xda98, 0xda99, 0xda9a, 0xda9b, 0xda9c, 0xda9d, 0xda9e, 0xda9f, 0xdaa0, 0xdb40, 0xdb41, 0xdb42, 0xdb43, 0xdb44, 0xdb45, 0xdb46, 0xdb47, 0xdb48, 0xdb49, 0xdb4a, 0xdb4b, 0xdb4c, 0xdb4d, 0xdb4e, 0xdb4f, 0xdb50, 0xdb51, 0xdb52, 0xdb53, 0xdb54, 0xdb55, 0xdb56, 0xdb57, 0xdb58, 0xdb59, 0xdb5a, 0xdb5b, 0xdb5c, 0xdb5d, 0xdb5e, 0xdb5f, 0xdb60, 0xdb61, 0xdb62, 0xdb63, 0xdb64, 0xdb65, 0xdb66, 0xdb67, 0xdb68, 0xdb69, 0xdb6a, 0xdb6b, 0xdb6c, 0xdb6d, 0xdb6e, 0xdb6f, 0xdb70, 0xdb71, 0xdb72, 0xdb73, 0xdb74, 0xdb75, 0xdb76, 0xdb77, 0xdb78, 0xdb79, 0xdb7a, 0xdb7b, 0xdb7c, 0xdb7d, 0xdb7e, 0xdb80, 0xdb81, 0xdb82, 0xdb83, 0xdb84, 0xdb85, 0xdb86, 0xdb87, 0xdb88, 0xdb89, 0xdb8a, 0xdb8b, 0xdb8c, 0xdb8d, 0xdb8e, 0xdb8f, 0xdb90, 0xdb91, 0xdb92, 0xdb93, 0xdb94, 0xdb95, 0xdb96, 0xdb97, 0xdb98, 0xdb99, 0xdb9a, 0xdb9b, 0xdb9c, 0xdb9d, 0xdb9e, 0xdb9f, 0xdba0, 0xdc40, 0xdc41, 0xdc42, 0xdc43, 0xdc44, 0xdc45, 0xdc46, 0xdc47, 0xdc48, 0xdc49, 0xdc4a, 0xdc4b, 0xdc4c, 0xdc4d, 0xdc4e, 0xdc4f, 0xdc50, 0xdc51, 0xdc52, 0xdc53, 0xdc54, 0xdc55, 0xdc56, 0xdc57, 0xdc58, 0xdc59, 0xdc5a, 0xdc5b, 0xdc5c, 0xdc5d, 0xdc5e, 0xdc5f, 0xdc60, 0xdc61, 0xdc62, 0xdc63, 0xdc64, 0xdc65, 0xdc66, 0xdc67, 0xdc68, 0xdc69, 0xdc6a, 0xdc6b, 0xdc6c, 0xdc6d, 0xdc6e, 0xdc6f, 0xdc70, 0xdc71, 0xdc72, 0xdc73, 0xdc74, 0xdc75, 0xdc76, 0xdc77, 0xdc78, 0xdc79, 0xdc7a, 0xdc7b, 0xdc7c, 0xdc7d, 0xdc7e, 0xdc80, 0xdc81, 0xdc82, 0xdc83, 0xdc84, 0xdc85, 0xdc86, 0xdc87, 0xdc88, 0xdc89, 0xdc8a, 0xdc8b, 0xdc8c, 0xdc8d, 0xdc8e, 0xdc8f, 0xdc90, 0xdc91, 0xdc92, 0xdc93, 0xdc94, 0xdc95, 0xdc96, 0xdc97, 0xdc98, 0xdc99, 0xdc9a, 0xdc9b, 0xdc9c, 0xdc9d, 0xdc9e, 0xdc9f, 0xdca0, 0xdd40, 0xdd41, 0xdd42, 0xdd43, 0xdd44, 0xdd45, 0xdd46, 0xdd47, 0xdd48, 0xdd49, 0xdd4a, 0xdd4b, 0xdd4c, 0xdd4d, 0xdd4e, 0xdd4f, 0xdd50, 0xdd51, 0xdd52, 0xdd53, 0xdd54, 0xdd55, 0xdd56, 0xdd57, 0xdd58, 0xdd59, 0xdd5a, 0xdd5b, 0xdd5c, 0xdd5d, 0xdd5e, 0xdd5f, 0xdd60, 0xdd61, 0xdd62, 0xdd63, 0xdd64, 0xdd65, 0xdd66, 0xdd67, 0xdd68, 0xdd69, 0xdd6a, 0xdd6b, 0xdd6c, 0xdd6d, 0xdd6e, 0xdd6f, 0xdd70, 0xdd71, 0xdd72, 0xdd73, 0xdd74, 0xdd75, 0xdd76, 0xdd77, 0xdd78, 0xdd79, 0xdd7a, 0xdd7b, 0xdd7c, 0xdd7d, 0xdd7e, 0xdd80, 0xdd81, 0xdd82, 0xdd83, 0xdd84, 0xdd85, 0xdd86, 0xdd87, 0xdd88, 0xdd89, 0xdd8a, 0xdd8b, 0xdd8c, 0xdd8d, 0xdd8e, 0xdd8f, 0xdd90, 0xdd91, 0xdd92, 0xdd93, 0xdd94, 0xdd95, 0xdd96, 0xdd97, 0xdd98, 0xdd99, 0xdd9a, 0xdd9b, 0xdd9c, 0xdd9d, 0xdd9e, 0xdd9f, 0xdda0, 0xde40, 0xde41, 0xde42, 0xde43, 0xde44, 0xde45, 0xde46, 0xde47, 0xde48, 0xde49, 0xde4a, 0xde4b, 0xde4c, 0xde4d, 0xde4e, 0xde4f, 0xde50, 0xde51, 0xde52, 0xde53, 0xde54, 0xde55, 0xde56, 0xde57, 0xde58, 0xde59, 0xde5a, 0xde5b, 0xde5c, 0xde5d, 0xde5e, 0xde5f, 0xde60, 0xde61, 0xde62, 0xde63, 0xde64, 0xde65, 0xde66, 0xde67, 0xde68, 0xde69, 0xde6a, 0xde6b, 0xde6c, 0xde6d, 0xde6e, 0xde6f, 0xde70, 0xde71, 0xde72, 0xde73, 0xde74, 0xde75, 0xde76, 0xde77, 0xde78, 0xde79, 0xde7a, 0xde7b, 0xde7c, 0xde7d, 0xde7e, 0xde80, 0xde81, 0xde82, 0xde83, 0xde84, 0xde85, 0xde86, 0xde87, 0xde88, 0xde89, 0xde8a, 0xde8b, 0xde8c, 0xde8d, 0xde8e, 0xde8f, 0xde90, 0xde91, 0xde92, 0xde93, 0xde94, 0xde95, 0xde96, 0xde97, 0xde98, 0xde99, 0xde9a, 0xde9b, 0xde9c, 0xde9d, 0xde9e, 0xde9f, 0xdea0, 0xdf40, 0xdf41, 0xdf42, 0xdf43, 0xdf44, 0xdf45, 0xdf46, 0xdf47, 0xdf48, 0xdf49, 0xdf4a, 0xdf4b, 0xdf4c, 0xdf4d, 0xdf4e, 0xdf4f, 0xdf50, 0xdf51, 0xdf52, 0xdf53, 0xdf54, 0xdf55, 0xdf56, 0xdf57, 0xdf58, 0xdf59, 0xdf5a, 0xdf5b, 0xdf5c, 0xdf5d, 0xdf5e, 0xdf5f, 0xdf60, 0xdf61, 0xdf62, 0xdf63, 0xdf64, 0xdf65, 0xdf66, 0xdf67, 0xdf68, 0xdf69, 0xdf6a, 0xdf6b, 0xdf6c, 0xdf6d, 0xdf6e, 0xdf6f, 0xdf70, 0xdf71, 0xdf72, 0xdf73, 0xdf74, 0xdf75, 0xdf76, 0xdf77, 0xdf78, 0xdf79, 0xdf7a, 0xdf7b, 0xdf7c, 0xdf7d, 0xdf7e, 0xdf80, 0xdf81, 0xdf82, 0xdf83, 0xdf84, 0xdf85, 0xdf86, 0xdf87, 0xdf88, 0xdf89, 0xdf8a, 0xdf8b, 0xdf8c, 0xdf8d, 0xdf8e, 0xdf8f, 0xdf90, 0xdf91, 0xdf92, 0xdf93, 0xdf94, 0xdf95, 0xdf96, 0xdf97, 0xdf98, 0xdf99, 0xdf9a, 0xdf9b, 0xdf9c, 0xdf9d, 0xdf9e, 0xdf9f, 0xdfa0, 0xe040, 0xe041, 0xe042, 0xe043, 0xe044, 0xe045, 0xe046, 0xe047, 0xe048, 0xe049, 0xe04a, 0xe04b, 0xe04c, 0xe04d, 0xe04e, 0xe04f, 0xe050, 0xe051, 0xe052, 0xe053, 0xe054, 0xe055, 0xe056, 0xe057, 0xe058, 0xe059, 0xe05a, 0xe05b, 0xe05c, 0xe05d, 0xe05e, 0xe05f, 0xe060, 0xe061, 0xe062, 0xe063, 0xe064, 0xe065, 0xe066, 0xe067, 0xe068, 0xe069, 0xe06a, 0xe06b, 0xe06c, 0xe06d, 0xe06e, 0xe06f, 0xe070, 0xe071, 0xe072, 0xe073, 0xe074, 0xe075, 0xe076, 0xe077, 0xe078, 0xe079, 0xe07a, 0xe07b, 0xe07c, 0xe07d, 0xe07e, 0xe080, 0xe081, 0xe082, 0xe083, 0xe084, 0xe085, 0xe086, 0xe087, 0xe088, 0xe089, 0xe08a, 0xe08b, 0xe08c, 0xe08d, 0xe08e, 0xe08f, 0xe090, 0xe091, 0xe092, 0xe093, 0xe094, 0xe095, 0xe096, 0xe097, 0xe098, 0xe099, 0xe09a, 0xe09b, 0xe09c, 0xe09d, 0xe09e, 0xe09f, 0xe0a0, 0xe140, 0xe141, 0xe142, 0xe143, 0xe144, 0xe145, 0xe146, 0xe147, 0xe148, 0xe149, 0xe14a, 0xe14b, 0xe14c, 0xe14d, 0xe14e, 0xe14f, 0xe150, 0xe151, 0xe152, 0xe153, 0xe154, 0xe155, 0xe156, 0xe157, 0xe158, 0xe159, 0xe15a, 0xe15b, 0xe15c, 0xe15d, 0xe15e, 0xe15f, 0xe160, 0xe161, 0xe162, 0xe163, 0xe164, 0xe165, 0xe166, 0xe167, 0xe168, 0xe169, 0xe16a, 0xe16b, 0xe16c, 0xe16d, 0xe16e, 0xe16f, 0xe170, 0xe171, 0xe172, 0xe173, 0xe174, 0xe175, 0xe176, 0xe177, 0xe178, 0xe179, 0xe17a, 0xe17b, 0xe17c, 0xe17d, 0xe17e, 0xe180, 0xe181, 0xe182, 0xe183, 0xe184, 0xe185, 0xe186, 0xe187, 0xe188, 0xe189, 0xe18a, 0xe18b, 0xe18c, 0xe18d, 0xe18e, 0xe18f, 0xe190, 0xe191, 0xe192, 0xe193, 0xe194, 0xe195, 0xe196, 0xe197, 0xe198, 0xe199, 0xe19a, 0xe19b, 0xe19c, 0xe19d, 0xe19e, 0xe19f, 0xe1a0, 0xe240, 0xe241, 0xe242, 0xe243, 0xe244, 0xe245, 0xe246, 0xe247, 0xe248, 0xe249, 0xe24a, 0xe24b, 0xe24c, 0xe24d, 0xe24e, 0xe24f, 0xe250, 0xe251, 0xe252, 0xe253, 0xe254, 0xe255, 0xe256, 0xe257, 0xe258, 0xe259, 0xe25a, 0xe25b, 0xe25c, 0xe25d, 0xe25e, 0xe25f, 0xe260, 0xe261, 0xe262, 0xe263, 0xe264, 0xe265, 0xe266, 0xe267, 0xe268, 0xe269, 0xe26a, 0xe26b, 0xe26c, 0xe26d, 0xe26e, 0xe26f, 0xe270, 0xe271, 0xe272, 0xe273, 0xe274, 0xe275, 0xe276, 0xe277, 0xe278, 0xe279, 0xe27a, 0xe27b, 0xe27c, 0xe27d, 0xe27e, 0xe280, 0xe281, 0xe282, 0xe283, 0xe284, 0xe285, 0xe286, 0xe287, 0xe288, 0xe289, 0xe28a, 0xe28b, 0xe28c, 0xe28d, 0xe28e, 0xe28f, 0xe290, 0xe291, 0xe292, 0xe293, 0xe294, 0xe295, 0xe296, 0xe297, 0xe298, 0xe299, 0xe29a, 0xe29b, 0xe29c, 0xe29d, 0xe29e, 0xe29f, 0xe2a0, 0xe340, 0xe341, 0xe342, 0xe343, 0xe344, 0xe345, 0xe346, 0xe347, 0xe348, 0xe349, 0xe34a, 0xe34b, 0xe34c, 0xe34d, 0xe34e, 0xe34f, 0xe350, 0xe351, 0xe352, 0xe353, 0xe354, 0xe355, 0xe356, 0xe357, 0xe358, 0xe359, 0xe35a, 0xe35b, 0xe35c, 0xe35d, 0xe35e, 0xe35f, 0xe360, 0xe361, 0xe362, 0xe363, 0xe364, 0xe365, 0xe366, 0xe367, 0xe368, 0xe369, 0xe36a, 0xe36b, 0xe36c, 0xe36d, 0xe36e, 0xe36f, 0xe370, 0xe371, 0xe372, 0xe373, 0xe374, 0xe375, 0xe376, 0xe377, 0xe378, 0xe379, 0xe37a, 0xe37b, 0xe37c, 0xe37d, 0xe37e, 0xe380, 0xe381, 0xe382, 0xe383, 0xe384, 0xe385, 0xe386, 0xe387, 0xe388, 0xe389, 0xe38a, 0xe38b, 0xe38c, 0xe38d, 0xe38e, 0xe38f, 0xe390, 0xe391, 0xe392, 0xe393, 0xe394, 0xe395, 0xe396, 0xe397, 0xe398, 0xe399, 0xe39a, 0xe39b, 0xe39c, 0xe39d, 0xe39e, 0xe39f, 0xe3a0, 0xe440, 0xe441, 0xe442, 0xe443, 0xe444, 0xe445, 0xe446, 0xe447, 0xe448, 0xe449, 0xe44a, 0xe44b, 0xe44c, 0xe44d, 0xe44e, 0xe44f, 0xe450, 0xe451, 0xe452, 0xe453, 0xe454, 0xe455, 0xe456, 0xe457, 0xe458, 0xe459, 0xe45a, 0xe45b, 0xe45c, 0xe45d, 0xe45e, 0xe45f, 0xe460, 0xe461, 0xe462, 0xe463, 0xe464, 0xe465, 0xe466, 0xe467, 0xe468, 0xe469, 0xe46a, 0xe46b, 0xe46c, 0xe46d, 0xe46e, 0xe46f, 0xe470, 0xe471, 0xe472, 0xe473, 0xe474, 0xe475, 0xe476, 0xe477, 0xe478, 0xe479, 0xe47a, 0xe47b, 0xe47c, 0xe47d, 0xe47e, 0xe480, 0xe481, 0xe482, 0xe483, 0xe484, 0xe485, 0xe486, 0xe487, 0xe488, 0xe489, 0xe48a, 0xe48b, 0xe48c, 0xe48d, 0xe48e, 0xe48f, 0xe490, 0xe491, 0xe492, 0xe493, 0xe494, 0xe495, 0xe496, 0xe497, 0xe498, 0xe499, 0xe49a, 0xe49b, 0xe49c, 0xe49d, 0xe49e, 0xe49f, 0xe4a0, 0xe540, 0xe541, 0xe542, 0xe543, 0xe544, 0xe545, 0xe546, 0xe547, 0xe548, 0xe549, 0xe54a, 0xe54b, 0xe54c, 0xe54d, 0xe54e, 0xe54f, 0xe550, 0xe551, 0xe552, 0xe553, 0xe554, 0xe555, 0xe556, 0xe557, 0xe558, 0xe559, 0xe55a, 0xe55b, 0xe55c, 0xe55d, 0xe55e, 0xe55f, 0xe560, 0xe561, 0xe562, 0xe563, 0xe564, 0xe565, 0xe566, 0xe567, 0xe568, 0xe569, 0xe56a, 0xe56b, 0xe56c, 0xe56d, 0xe56e, 0xe56f, 0xe570, 0xe571, 0xe572, 0xe573, 0xe574, 0xe575, 0xe576, 0xe577, 0xe578, 0xe579, 0xe57a, 0xe57b, 0xe57c, 0xe57d, 0xe57e, 0xe580, 0xe581, 0xe582, 0xe583, 0xe584, 0xe585, 0xe586, 0xe587, 0xe588, 0xe589, 0xe58a, 0xe58b, 0xe58c, 0xe58d, 0xe58e, 0xe58f, 0xe590, 0xe591, 0xe592, 0xe593, 0xe594, 0xe595, 0xe596, 0xe597, 0xe598, 0xe599, 0xe59a, 0xe59b, 0xe59c, 0xe59d, 0xe59e, 0xe59f, 0xe5a0, 0xe640, 0xe641, 0xe642, 0xe643, 0xe644, 0xe645, 0xe646, 0xe647, 0xe648, 0xe649, 0xe64a, 0xe64b, 0xe64c, 0xe64d, 0xe64e, 0xe64f, 0xe650, 0xe651, 0xe652, 0xe653, 0xe654, 0xe655, 0xe656, 0xe657, 0xe658, 0xe659, 0xe65a, 0xe65b, 0xe65c, 0xe65d, 0xe65e, 0xe65f, 0xe660, 0xe661, 0xe662, 0xe663, 0xe664, 0xe665, 0xe666, 0xe667, 0xe668, 0xe669, 0xe66a, 0xe66b, 0xe66c, 0xe66d, 0xe66e, 0xe66f, 0xe670, 0xe671, 0xe672, 0xe673, 0xe674, 0xe675, 0xe676, 0xe677, 0xe678, 0xe679, 0xe67a, 0xe67b, 0xe67c, 0xe67d, 0xe67e, 0xe680, 0xe681, 0xe682, 0xe683, 0xe684, 0xe685, 0xe686, 0xe687, 0xe688, 0xe689, 0xe68a, 0xe68b, 0xe68c, 0xe68d, 0xe68e, 0xe68f, 0xe690, 0xe691, 0xe692, 0xe693, 0xe694, 0xe695, 0xe696, 0xe697, 0xe698, 0xe699, 0xe69a, 0xe69b, 0xe69c, 0xe69d, 0xe69e, 0xe69f, 0xe6a0, 0xe740, 0xe741, 0xe742, 0xe743, 0xe744, 0xe745, 0xe746, 0xe747, 0xe748, 0xe749, 0xe74a, 0xe74b, 0xe74c, 0xe74d, 0xe74e, 0xe74f, 0xe750, 0xe751, 0xe752, 0xe753, 0xe754, 0xe755, 0xe756, 0xe757, 0xe758, 0xe759, 0xe75a, 0xe75b, 0xe75c, 0xe75d, 0xe75e, 0xe75f, 0xe760, 0xe761, 0xe762, 0xe763, 0xe764, 0xe765, 0xe766, 0xe767, 0xe768, 0xe769, 0xe76a, 0xe76b, 0xe76c, 0xe76d, 0xe76e, 0xe76f, 0xe770, 0xe771, 0xe772, 0xe773, 0xe774, 0xe775, 0xe776, 0xe777, 0xe778, 0xe779, 0xe77a, 0xe77b, 0xe77c, 0xe77d, 0xe77e, 0xe780, 0xe781, 0xe782, 0xe783, 0xe784, 0xe785, 0xe786, 0xe787, 0xe788, 0xe789, 0xe78a, 0xe78b, 0xe78c, 0xe78d, 0xe78e, 0xe78f, 0xe790, 0xe791, 0xe792, 0xe793, 0xe794, 0xe795, 0xe796, 0xe797, 0xe798, 0xe799, 0xe79a, 0xe79b, 0xe79c, 0xe79d, 0xe79e, 0xe79f, 0xe7a0, 0xe840, 0xe841, 0xe842, 0xe843, 0xe844, 0xe845, 0xe846, 0xe847, 0xe848, 0xe849, 0xe84a, 0xe84b, 0xe84c, 0xe84d, 0xe84e, 0xe84f, 0xe850, 0xe851, 0xe852, 0xe853, 0xe854, 0xe855, 0xe856, 0xe857, 0xe858, 0xe859, 0xe85a, 0xe85b, 0xe85c, 0xe85d, 0xe85e, 0xe85f, 0xe860, 0xe861, 0xe862, 0xe863, 0xe864, 0xe865, 0xe866, 0xe867, 0xe868, 0xe869, 0xe86a, 0xe86b, 0xe86c, 0xe86d, 0xe86e, 0xe86f, 0xe870, 0xe871, 0xe872, 0xe873, 0xe874, 0xe875, 0xe876, 0xe877, 0xe878, 0xe879, 0xe87a, 0xe87b, 0xe87c, 0xe87d, 0xe87e, 0xe880, 0xe881, 0xe882, 0xe883, 0xe884, 0xe885, 0xe886, 0xe887, 0xe888, 0xe889, 0xe88a, 0xe88b, 0xe88c, 0xe88d, 0xe88e, 0xe88f, 0xe890, 0xe891, 0xe892, 0xe893, 0xe894, 0xe895, 0xe896, 0xe897, 0xe898, 0xe899, 0xe89a, 0xe89b, 0xe89c, 0xe89d, 0xe89e, 0xe89f, 0xe8a0, 0xe940, 0xe941, 0xe942, 0xe943, 0xe944, 0xe945, 0xe946, 0xe947, 0xe948, 0xe949, 0xe94a, 0xe94b, 0xe94c, 0xe94d, 0xe94e, 0xe94f, 0xe950, 0xe951, 0xe952, 0xe953, 0xe954, 0xe955, 0xe956, 0xe957, 0xe958, 0xe959, 0xe95a, 0xe95b, 0xe95c, 0xe95d, 0xe95e, 0xe95f, 0xe960, 0xe961, 0xe962, 0xe963, 0xe964, 0xe965, 0xe966, 0xe967, 0xe968, 0xe969, 0xe96a, 0xe96b, 0xe96c, 0xe96d, 0xe96e, 0xe96f, 0xe970, 0xe971, 0xe972, 0xe973, 0xe974, 0xe975, 0xe976, 0xe977, 0xe978, 0xe979, 0xe97a, 0xe97b, 0xe97c, 0xe97d, 0xe97e, 0xe980, 0xe981, 0xe982, 0xe983, 0xe984, 0xe985, 0xe986, 0xe987, 0xe988, 0xe989, 0xe98a, 0xe98b, 0xe98c, 0xe98d, 0xe98e, 0xe98f, 0xe990, 0xe991, 0xe992, 0xe993, 0xe994, 0xe995, 0xe996, 0xe997, 0xe998, 0xe999, 0xe99a, 0xe99b, 0xe99c, 0xe99d, 0xe99e, 0xe99f, 0xe9a0, 0xea40, 0xea41, 0xea42, 0xea43, 0xea44, 0xea45, 0xea46, 0xea47, 0xea48, 0xea49, 0xea4a, 0xea4b, 0xea4c, 0xea4d, 0xea4e, 0xea4f, 0xea50, 0xea51, 0xea52, 0xea53, 0xea54, 0xea55, 0xea56, 0xea57, 0xea58, 0xea59, 0xea5a, 0xea5b, 0xea5c, 0xea5d, 0xea5e, 0xea5f, 0xea60, 0xea61, 0xea62, 0xea63, 0xea64, 0xea65, 0xea66, 0xea67, 0xea68, 0xea69, 0xea6a, 0xea6b, 0xea6c, 0xea6d, 0xea6e, 0xea6f, 0xea70, 0xea71, 0xea72, 0xea73, 0xea74, 0xea75, 0xea76, 0xea77, 0xea78, 0xea79, 0xea7a, 0xea7b, 0xea7c, 0xea7d, 0xea7e, 0xea80, 0xea81, 0xea82, 0xea83, 0xea84, 0xea85, 0xea86, 0xea87, 0xea88, 0xea89, 0xea8a, 0xea8b, 0xea8c, 0xea8d, 0xea8e, 0xea8f, 0xea90, 0xea91, 0xea92, 0xea93, 0xea94, 0xea95, 0xea96, 0xea97, 0xea98, 0xea99, 0xea9a, 0xea9b, 0xea9c, 0xea9d, 0xea9e, 0xea9f, 0xeaa0, 0xeb40, 0xeb41, 0xeb42, 0xeb43, 0xeb44, 0xeb45, 0xeb46, 0xeb47, 0xeb48, 0xeb49, 0xeb4a, 0xeb4b, 0xeb4c, 0xeb4d, 0xeb4e, 0xeb4f, 0xeb50, 0xeb51, 0xeb52, 0xeb53, 0xeb54, 0xeb55, 0xeb56, 0xeb57, 0xeb58, 0xeb59, 0xeb5a, 0xeb5b, 0xeb5c, 0xeb5d, 0xeb5e, 0xeb5f, 0xeb60, 0xeb61, 0xeb62, 0xeb63, 0xeb64, 0xeb65, 0xeb66, 0xeb67, 0xeb68, 0xeb69, 0xeb6a, 0xeb6b, 0xeb6c, 0xeb6d, 0xeb6e, 0xeb6f, 0xeb70, 0xeb71, 0xeb72, 0xeb73, 0xeb74, 0xeb75, 0xeb76, 0xeb77, 0xeb78, 0xeb79, 0xeb7a, 0xeb7b, 0xeb7c, 0xeb7d, 0xeb7e, 0xeb80, 0xeb81, 0xeb82, 0xeb83, 0xeb84, 0xeb85, 0xeb86, 0xeb87, 0xeb88, 0xeb89, 0xeb8a, 0xeb8b, 0xeb8c, 0xeb8d, 0xeb8e, 0xeb8f, 0xeb90, 0xeb91, 0xeb92, 0xeb93, 0xeb94, 0xeb95, 0xeb96, 0xeb97, 0xeb98, 0xeb99, 0xeb9a, 0xeb9b, 0xeb9c, 0xeb9d, 0xeb9e, 0xeb9f, 0xeba0, 0xec40, 0xec41, 0xec42, 0xec43, 0xec44, 0xec45, 0xec46, 0xec47, 0xec48, 0xec49, 0xec4a, 0xec4b, 0xec4c, 0xec4d, 0xec4e, 0xec4f, 0xec50, 0xec51, 0xec52, 0xec53, 0xec54, 0xec55, 0xec56, 0xec57, 0xec58, 0xec59, 0xec5a, 0xec5b, 0xec5c, 0xec5d, 0xec5e, 0xec5f, 0xec60, 0xec61, 0xec62, 0xec63, 0xec64, 0xec65, 0xec66, 0xec67, 0xec68, 0xec69, 0xec6a, 0xec6b, 0xec6c, 0xec6d, 0xec6e, 0xec6f, 0xec70, 0xec71, 0xec72, 0xec73, 0xec74, 0xec75, 0xec76, 0xec77, 0xec78, 0xec79, 0xec7a, 0xec7b, 0xec7c, 0xec7d, 0xec7e, 0xec80, 0xec81, 0xec82, 0xec83, 0xec84, 0xec85, 0xec86, 0xec87, 0xec88, 0xec89, 0xec8a, 0xec8b, 0xec8c, 0xec8d, 0xec8e, 0xec8f, 0xec90, 0xec91, 0xec92, 0xec93, 0xec94, 0xec95, 0xec96, 0xec97, 0xec98, 0xec99, 0xec9a, 0xec9b, 0xec9c, 0xec9d, 0xec9e, 0xec9f, 0xeca0, 0xed40, 0xed41, 0xed42, 0xed43, 0xed44, 0xed45, 0xed46, 0xed47, 0xed48, 0xed49, 0xed4a, 0xed4b, 0xed4c, 0xed4d, 0xed4e, 0xed4f, 0xed50, 0xed51, 0xed52, 0xed53, 0xed54, 0xed55, 0xed56, 0xed57, 0xed58, 0xed59, 0xed5a, 0xed5b, 0xed5c, 0xed5d, 0xed5e, 0xed5f, 0xed60, 0xed61, 0xed62, 0xed63, 0xed64, 0xed65, 0xed66, 0xed67, 0xed68, 0xed69, 0xed6a, 0xed6b, 0xed6c, 0xed6d, 0xed6e, 0xed6f, 0xed70, 0xed71, 0xed72, 0xed73, 0xed74, 0xed75, 0xed76, 0xed77, 0xed78, 0xed79, 0xed7a, 0xed7b, 0xed7c, 0xed7d, 0xed7e, 0xed80, 0xed81, 0xed82, 0xed83, 0xed84, 0xed85, 0xed86, 0xed87, 0xed88, 0xed89, 0xed8a, 0xed8b, 0xed8c, 0xed8d, 0xed8e, 0xed8f, 0xed90, 0xed91, 0xed92, 0xed93, 0xed94, 0xed95, 0xed96, 0xed97, 0xed98, 0xed99, 0xed9a, 0xed9b, 0xed9c, 0xed9d, 0xed9e, 0xed9f, 0xeda0, 0xee40, 0xee41, 0xee42, 0xee43, 0xee44, 0xee45, 0xee46, 0xee47, 0xee48, 0xee49, 0xee4a, 0xee4b, 0xee4c, 0xee4d, 0xee4e, 0xee4f, 0xee50, 0xee51, 0xee52, 0xee53, 0xee54, 0xee55, 0xee56, 0xee57, 0xee58, 0xee59, 0xee5a, 0xee5b, 0xee5c, 0xee5d, 0xee5e, 0xee5f, 0xee60, 0xee61, 0xee62, 0xee63, 0xee64, 0xee65, 0xee66, 0xee67, 0xee68, 0xee69, 0xee6a, 0xee6b, 0xee6c, 0xee6d, 0xee6e, 0xee6f, 0xee70, 0xee71, 0xee72, 0xee73, 0xee74, 0xee75, 0xee76, 0xee77, 0xee78, 0xee79, 0xee7a, 0xee7b, 0xee7c, 0xee7d, 0xee7e, 0xee80, 0xee81, 0xee82, 0xee83, 0xee84, 0xee85, 0xee86, 0xee87, 0xee88, 0xee89, 0xee8a, 0xee8b, 0xee8c, 0xee8d, 0xee8e, 0xee8f, 0xee90, 0xee91, 0xee92, 0xee93, 0xee94, 0xee95, 0xee96, 0xee97, 0xee98, 0xee99, 0xee9a, 0xee9b, 0xee9c, 0xee9d, 0xee9e, 0xee9f, 0xeea0, 0xef40, 0xef41, 0xef42, 0xef43, 0xef44, 0xef45, 0xef46, 0xef47, 0xef48, 0xef49, 0xef4a, 0xef4b, 0xef4c, 0xef4d, 0xef4e, 0xef4f, 0xef50, 0xef51, 0xef52, 0xef53, 0xef54, 0xef55, 0xef56, 0xef57, 0xef58, 0xef59, 0xef5a, 0xef5b, 0xef5c, 0xef5d, 0xef5e, 0xef5f, 0xef60, 0xef61, 0xef62, 0xef63, 0xef64, 0xef65, 0xef66, 0xef67, 0xef68, 0xef69, 0xef6a, 0xef6b, 0xef6c, 0xef6d, 0xef6e, 0xef6f, 0xef70, 0xef71, 0xef72, 0xef73, 0xef74, 0xef75, 0xef76, 0xef77, 0xef78, 0xef79, 0xef7a, 0xef7b, 0xef7c, 0xef7d, 0xef7e, 0xef80, 0xef81, 0xef82, 0xef83, 0xef84, 0xef85, 0xef86, 0xef87, 0xef88, 0xef89, 0xef8a, 0xef8b, 0xef8c, 0xef8d, 0xef8e, 0xef8f, 0xef90, 0xef91, 0xef92, 0xef93, 0xef94, 0xef95, 0xef96, 0xef97, 0xef98, 0xef99, 0xef9a, 0xef9b, 0xef9c, 0xef9d, 0xef9e, 0xef9f, 0xefa0, 0xf040, 0xf041, 0xf042, 0xf043, 0xf044, 0xf045, 0xf046, 0xf047, 0xf048, 0xf049, 0xf04a, 0xf04b, 0xf04c, 0xf04d, 0xf04e, 0xf04f, 0xf050, 0xf051, 0xf052, 0xf053, 0xf054, 0xf055, 0xf056, 0xf057, 0xf058, 0xf059, 0xf05a, 0xf05b, 0xf05c, 0xf05d, 0xf05e, 0xf05f, 0xf060, 0xf061, 0xf062, 0xf063, 0xf064, 0xf065, 0xf066, 0xf067, 0xf068, 0xf069, 0xf06a, 0xf06b, 0xf06c, 0xf06d, 0xf06e, 0xf06f, 0xf070, 0xf071, 0xf072, 0xf073, 0xf074, 0xf075, 0xf076, 0xf077, 0xf078, 0xf079, 0xf07a, 0xf07b, 0xf07c, 0xf07d, 0xf07e, 0xf080, 0xf081, 0xf082, 0xf083, 0xf084, 0xf085, 0xf086, 0xf087, 0xf088, 0xf089, 0xf08a, 0xf08b, 0xf08c, 0xf08d, 0xf08e, 0xf08f, 0xf090, 0xf091, 0xf092, 0xf093, 0xf094, 0xf095, 0xf096, 0xf097, 0xf098, 0xf099, 0xf09a, 0xf09b, 0xf09c, 0xf09d, 0xf09e, 0xf09f, 0xf0a0, 0xf140, 0xf141, 0xf142, 0xf143, 0xf144, 0xf145, 0xf146, 0xf147, 0xf148, 0xf149, 0xf14a, 0xf14b, 0xf14c, 0xf14d, 0xf14e, 0xf14f, 0xf150, 0xf151, 0xf152, 0xf153, 0xf154, 0xf155, 0xf156, 0xf157, 0xf158, 0xf159, 0xf15a, 0xf15b, 0xf15c, 0xf15d, 0xf15e, 0xf15f, 0xf160, 0xf161, 0xf162, 0xf163, 0xf164, 0xf165, 0xf166, 0xf167, 0xf168, 0xf169, 0xf16a, 0xf16b, 0xf16c, 0xf16d, 0xf16e, 0xf16f, 0xf170, 0xf171, 0xf172, 0xf173, 0xf174, 0xf175, 0xf176, 0xf177, 0xf178, 0xf179, 0xf17a, 0xf17b, 0xf17c, 0xf17d, 0xf17e, 0xf180, 0xf181, 0xf182, 0xf183, 0xf184, 0xf185, 0xf186, 0xf187, 0xf188, 0xf189, 0xf18a, 0xf18b, 0xf18c, 0xf18d, 0xf18e, 0xf18f, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf195, 0xf196, 0xf197, 0xf198, 0xf199, 0xf19a, 0xf19b, 0xf19c, 0xf19d, 0xf19e, 0xf19f, 0xf1a0, 0xf240, 0xf241, 0xf242, 0xf243, 0xf244, 0xf245, 0xf246, 0xf247, 0xf248, 0xf249, 0xf24a, 0xf24b, 0xf24c, 0xf24d, 0xf24e, 0xf24f, 0xf250, 0xf251, 0xf252, 0xf253, 0xf254, 0xf255, 0xf256, 0xf257, 0xf258, 0xf259, 0xf25a, 0xf25b, 0xf25c, 0xf25d, 0xf25e, 0xf25f, 0xf260, 0xf261, 0xf262, 0xf263, 0xf264, 0xf265, 0xf266, 0xf267, 0xf268, 0xf269, 0xf26a, 0xf26b, 0xf26c, 0xf26d, 0xf26e, 0xf26f, 0xf270, 0xf271, 0xf272, 0xf273, 0xf274, 0xf275, 0xf276, 0xf277, 0xf278, 0xf279, 0xf27a, 0xf27b, 0xf27c, 0xf27d, 0xf27e, 0xf280, 0xf281, 0xf282, 0xf283, 0xf284, 0xf285, 0xf286, 0xf287, 0xf288, 0xf289, 0xf28a, 0xf28b, 0xf28c, 0xf28d, 0xf28e, 0xf28f, 0xf290, 0xf291, 0xf292, 0xf293, 0xf294, 0xf295, 0xf296, 0xf297, 0xf298, 0xf299, 0xf29a, 0xf29b, 0xf29c, 0xf29d, 0xf29e, 0xf29f, 0xf2a0, 0xf340, 0xf341, 0xf342, 0xf343, 0xf344, 0xf345, 0xf346, 0xf347, 0xf348, 0xf349, 0xf34a, 0xf34b, 0xf34c, 0xf34d, 0xf34e, 0xf34f, 0xf350, 0xf351, 0xf352, 0xf353, 0xf354, 0xf355, 0xf356, 0xf357, 0xf358, 0xf359, 0xf35a, 0xf35b, 0xf35c, 0xf35d, 0xf35e, 0xf35f, 0xf360, 0xf361, 0xf362, 0xf363, 0xf364, 0xf365, 0xf366, 0xf367, 0xf368, 0xf369, 0xf36a, 0xf36b, 0xf36c, 0xf36d, 0xf36e, 0xf36f, 0xf370, 0xf371, 0xf372, 0xf373, 0xf374, 0xf375, 0xf376, 0xf377, 0xf378, 0xf379, 0xf37a, 0xf37b, 0xf37c, 0xf37d, 0xf37e, 0xf380, 0xf381, 0xf382, 0xf383, 0xf384, 0xf385, 0xf386, 0xf387, 0xf388, 0xf389, 0xf38a, 0xf38b, 0xf38c, 0xf38d, 0xf38e, 0xf38f, 0xf390, 0xf391, 0xf392, 0xf393, 0xf394, 0xf395, 0xf396, 0xf397, 0xf398, 0xf399, 0xf39a, 0xf39b, 0xf39c, 0xf39d, 0xf39e, 0xf39f, 0xf3a0, 0xf440, 0xf441, 0xf442, 0xf443, 0xf444, 0xf445, 0xf446, 0xf447, 0xf448, 0xf449, 0xf44a, 0xf44b, 0xf44c, 0xf44d, 0xf44e, 0xf44f, 0xf450, 0xf451, 0xf452, 0xf453, 0xf454, 0xf455, 0xf456, 0xf457, 0xf458, 0xf459, 0xf45a, 0xf45b, 0xf45c, 0xf45d, 0xf45e, 0xf45f, 0xf460, 0xf461, 0xf462, 0xf463, 0xf464, 0xf465, 0xf466, 0xf467, 0xf468, 0xf469, 0xf46a, 0xf46b, 0xf46c, 0xf46d, 0xf46e, 0xf46f, 0xf470, 0xf471, 0xf472, 0xf473, 0xf474, 0xf475, 0xf476, 0xf477, 0xf478, 0xf479, 0xf47a, 0xf47b, 0xf47c, 0xf47d, 0xf47e, 0xf480, 0xf481, 0xf482, 0xf483, 0xf484, 0xf485, 0xf486, 0xf487, 0xf488, 0xf489, 0xf48a, 0xf48b, 0xf48c, 0xf48d, 0xf48e, 0xf48f, 0xf490, 0xf491, 0xf492, 0xf493, 0xf494, 0xf495, 0xf496, 0xf497, 0xf498, 0xf499, 0xf49a, 0xf49b, 0xf49c, 0xf49d, 0xf49e, 0xf49f, 0xf4a0, 0xf540, 0xf541, 0xf542, 0xf543, 0xf544, 0xf545, 0xf546, 0xf547, 0xf548, 0xf549, 0xf54a, 0xf54b, 0xf54c, 0xf54d, 0xf54e, 0xf54f, 0xf550, 0xf551, 0xf552, 0xf553, 0xf554, 0xf555, 0xf556, 0xf557, 0xf558, 0xf559, 0xf55a, 0xf55b, 0xf55c, 0xf55d, 0xf55e, 0xf55f, 0xf560, 0xf561, 0xf562, 0xf563, 0xf564, 0xf565, 0xf566, 0xf567, 0xf568, 0xf569, 0xf56a, 0xf56b, 0xf56c, 0xf56d, 0xf56e, 0xf56f, 0xf570, 0xf571, 0xf572, 0xf573, 0xf574, 0xf575, 0xf576, 0xf577, 0xf578, 0xf579, 0xf57a, 0xf57b, 0xf57c, 0xf57d, 0xf57e, 0xf580, 0xf581, 0xf582, 0xf583, 0xf584, 0xf585, 0xf586, 0xf587, 0xf588, 0xf589, 0xf58a, 0xf58b, 0xf58c, 0xf58d, 0xf58e, 0xf58f, 0xf590, 0xf591, 0xf592, 0xf593, 0xf594, 0xf595, 0xf596, 0xf597, 0xf598, 0xf599, 0xf59a, 0xf59b, 0xf59c, 0xf59d, 0xf59e, 0xf59f, 0xf5a0, 0xf640, 0xf641, 0xf642, 0xf643, 0xf644, 0xf645, 0xf646, 0xf647, 0xf648, 0xf649, 0xf64a, 0xf64b, 0xf64c, 0xf64d, 0xf64e, 0xf64f, 0xf650, 0xf651, 0xf652, 0xf653, 0xf654, 0xf655, 0xf656, 0xf657, 0xf658, 0xf659, 0xf65a, 0xf65b, 0xf65c, 0xf65d, 0xf65e, 0xf65f, 0xf660, 0xf661, 0xf662, 0xf663, 0xf664, 0xf665, 0xf666, 0xf667, 0xf668, 0xf669, 0xf66a, 0xf66b, 0xf66c, 0xf66d, 0xf66e, 0xf66f, 0xf670, 0xf671, 0xf672, 0xf673, 0xf674, 0xf675, 0xf676, 0xf677, 0xf678, 0xf679, 0xf67a, 0xf67b, 0xf67c, 0xf67d, 0xf67e, 0xf680, 0xf681, 0xf682, 0xf683, 0xf684, 0xf685, 0xf686, 0xf687, 0xf688, 0xf689, 0xf68a, 0xf68b, 0xf68c, 0xf68d, 0xf68e, 0xf68f, 0xf690, 0xf691, 0xf692, 0xf693, 0xf694, 0xf695, 0xf696, 0xf697, 0xf698, 0xf699, 0xf69a, 0xf69b, 0xf69c, 0xf69d, 0xf69e, 0xf69f, 0xf6a0, 0xf740, 0xf741, 0xf742, 0xf743, 0xf744, 0xf745, 0xf746, 0xf747, 0xf748, 0xf749, 0xf74a, 0xf74b, 0xf74c, 0xf74d, 0xf74e, 0xf74f, 0xf750, 0xf751, 0xf752, 0xf753, 0xf754, 0xf755, 0xf756, 0xf757, 0xf758, 0xf759, 0xf75a, 0xf75b, 0xf75c, 0xf75d, 0xf75e, 0xf75f, 0xf760, 0xf761, 0xf762, 0xf763, 0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, 0xf76a, 0xf76b, 0xf76c, 0xf76d, 0xf76e, 0xf76f, 0xf770, 0xf771, 0xf772, 0xf773, 0xf774, 0xf775, 0xf776, 0xf777, 0xf778, 0xf779, 0xf77a, 0xf77b, 0xf77c, 0xf77d, 0xf77e, 0xf780, 0xf781, 0xf782, 0xf783, 0xf784, 0xf785, 0xf786, 0xf787, 0xf788, 0xf789, 0xf78a, 0xf78b, 0xf78c, 0xf78d, 0xf78e, 0xf78f, 0xf790, 0xf791, 0xf792, 0xf793, 0xf794, 0xf795, 0xf796, 0xf797, 0xf798, 0xf799, 0xf79a, 0xf79b, 0xf79c, 0xf79d, 0xf79e, 0xf79f, 0xf7a0, 0xf840, 0xf841, 0xf842, 0xf843, 0xf844, 0xf845, 0xf846, 0xf847, 0xf848, 0xf849, 0xf84a, 0xf84b, 0xf84c, 0xf84d, 0xf84e, 0xf84f, 0xf850, 0xf851, 0xf852, 0xf853, 0xf854, 0xf855, 0xf856, 0xf857, 0xf858, 0xf859, 0xf85a, 0xf85b, 0xf85c, 0xf85d, 0xf85e, 0xf85f, 0xf860, 0xf861, 0xf862, 0xf863, 0xf864, 0xf865, 0xf866, 0xf867, 0xf868, 0xf869, 0xf86a, 0xf86b, 0xf86c, 0xf86d, 0xf86e, 0xf86f, 0xf870, 0xf871, 0xf872, 0xf873, 0xf874, 0xf875, 0xf876, 0xf877, 0xf878, 0xf879, 0xf87a, 0xf87b, 0xf87c, 0xf87d, 0xf87e, 0xf880, 0xf881, 0xf882, 0xf883, 0xf884, 0xf885, 0xf886, 0xf887, 0xf888, 0xf889, 0xf88a, 0xf88b, 0xf88c, 0xf88d, 0xf88e, 0xf88f, 0xf890, 0xf891, 0xf892, 0xf893, 0xf894, 0xf895, 0xf896, 0xf897, 0xf898, 0xf899, 0xf89a, 0xf89b, 0xf89c, 0xf89d, 0xf89e, 0xf89f, 0xf8a0, 0xf940, 0xf941, 0xf942, 0xf943, 0xf944, 0xf945, 0xf946, 0xf947, 0xf948, 0xf949, 0xf94a, 0xf94b, 0xf94c, 0xf94d, 0xf94e, 0xf94f, 0xf950, 0xf951, 0xf952, 0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0xf958, 0xf959, 0xf95a, 0xf95b, 0xf95c, 0xf95d, 0xf95e, 0xf95f, 0xf960, 0xf961, 0xf962, 0xf963, 0xf964, 0xf965, 0xf966, 0xf967, 0xf968, 0xf969, 0xf96a, 0xf96b, 0xf96c, 0xf96d, 0xf96e, 0xf96f, 0xf970, 0xf971, 0xf972, 0xf973, 0xf974, 0xf975, 0xf976, 0xf977, 0xf978, 0xf979, 0xf97a, 0xf97b, 0xf97c, 0xf97d, 0xf97e, 0xf980, 0xf981, 0xf982, 0xf983, 0xf984, 0xf985, 0xf986, 0xf987, 0xf988, 0xf989, 0xf98a, 0xf98b, 0xf98c, 0xf98d, 0xf98e, 0xf98f, 0xf990, 0xf991, 0xf992, 0xf993, 0xf994, 0xf995, 0xf996, 0xf997, 0xf998, 0xf999, 0xf99a, 0xf99b, 0xf99c, 0xf99d, 0xf99e, 0xf99f, 0xf9a0, 0xfa40, 0xfa41, 0xfa42, 0xfa43, 0xfa44, 0xfa45, 0xfa46, 0xfa47, 0xfa48, 0xfa49, 0xfa4a, 0xfa4b, 0xfa4c, 0xfa4d, 0xfa4e, 0xfa4f, 0xfa50, 0xfa51, 0xfa52, 0xfa53, 0xfa54, 0xfa55, 0xfa56, 0xfa57, 0xfa58, 0xfa59, 0xfa5a, 0xfa5b, 0xfa5c, 0xfa5d, 0xfa5e, 0xfa5f, 0xfa60, 0xfa61, 0xfa62, 0xfa63, 0xfa64, 0xfa65, 0xfa66, 0xfa67, 0xfa68, 0xfa69, 0xfa6a, 0xfa6b, 0xfa6c, 0xfa6d, 0xfa6e, 0xfa6f, 0xfa70, 0xfa71, 0xfa72, 0xfa73, 0xfa74, 0xfa75, 0xfa76, 0xfa77, 0xfa78, 0xfa79, 0xfa7a, 0xfa7b, 0xfa7c, 0xfa7d, 0xfa7e, 0xfa80, 0xfa81, 0xfa82, 0xfa83, 0xfa84, 0xfa85, 0xfa86, 0xfa87, 0xfa88, 0xfa89, 0xfa8a, 0xfa8b, 0xfa8c, 0xfa8d, 0xfa8e, 0xfa8f, 0xfa90, 0xfa91, 0xfa92, 0xfa93, 0xfa94, 0xfa95, 0xfa96, 0xfa97, 0xfa98, 0xfa99, 0xfa9a, 0xfa9b, 0xfa9c, 0xfa9d, 0xfa9e, 0xfa9f, 0xfaa0, 0xfb40, 0xfb41, 0xfb42, 0xfb43, 0xfb44, 0xfb45, 0xfb46, 0xfb47, 0xfb48, 0xfb49, 0xfb4a, 0xfb4b, 0xfb4c, 0xfb4d, 0xfb4e, 0xfb4f, 0xfb50, 0xfb51, 0xfb52, 0xfb53, 0xfb54, 0xfb55, 0xfb56, 0xfb57, 0xfb58, 0xfb59, 0xfb5a, 0xfb5b, 0xfb5c, 0xfb5d, 0xfb5e, 0xfb5f, 0xfb60, 0xfb61, 0xfb62, 0xfb63, 0xfb64, 0xfb65, 0xfb66, 0xfb67, 0xfb68, 0xfb69, 0xfb6a, 0xfb6b, 0xfb6c, 0xfb6d, 0xfb6e, 0xfb6f, 0xfb70, 0xfb71, 0xfb72, 0xfb73, 0xfb74, 0xfb75, 0xfb76, 0xfb77, 0xfb78, 0xfb79, 0xfb7a, 0xfb7b, 0xfb7c, 0xfb7d, 0xfb7e, 0xfb80, 0xfb81, 0xfb82, 0xfb83, 0xfb84, 0xfb85, 0xfb86, 0xfb87, 0xfb88, 0xfb89, 0xfb8a, 0xfb8b, 0xfb8c, 0xfb8d, 0xfb8e, 0xfb8f, 0xfb90, 0xfb91, 0xfb92, 0xfb93, 0xfb94, 0xfb95, 0xfb96, 0xfb97, 0xfb98, 0xfb99, 0xfb9a, 0xfb9b, 0xfb9c, 0xfb9d, 0xfb9e, 0xfb9f, 0xfba0, 0xfc40, 0xfc41, 0xfc42, 0xfc43, 0xfc44, 0xfc45, 0xfc46, 0xfc47, 0xfc48, 0xfc49, 0xfc4a, 0xfc4b, 0xfc4c, 0xfc4d, 0xfc4e, 0xfc4f, 0xfc50, 0xfc51, 0xfc52, 0xfc53, 0xfc54, 0xfc55, 0xfc56, 0xfc57, 0xfc58, 0xfc59, 0xfc5a, 0xfc5b, 0xfc5c, 0xfc5d, 0xfc5e, 0xfc5f, 0xfc60, 0xfc61, 0xfc62, 0xfc63, 0xfc64, 0xfc65, 0xfc66, 0xfc67, 0xfc68, 0xfc69, 0xfc6a, 0xfc6b, 0xfc6c, 0xfc6d, 0xfc6e, 0xfc6f, 0xfc70, 0xfc71, 0xfc72, 0xfc73, 0xfc74, 0xfc75, 0xfc76, 0xfc77, 0xfc78, 0xfc79, 0xfc7a, 0xfc7b, 0xfc7c, 0xfc7d, 0xfc7e, 0xfc80, 0xfc81, 0xfc82, 0xfc83, 0xfc84, 0xfc85, 0xfc86, 0xfc87, 0xfc88, 0xfc89, 0xfc8a, 0xfc8b, 0xfc8c, 0xfc8d, 0xfc8e, 0xfc8f, 0xfc90, 0xfc91, 0xfc92, 0xfc93, 0xfc94, 0xfc95, 0xfc96, 0xfc97, 0xfc98, 0xfc99, 0xfc9a, 0xfc9b, 0xfc9c, 0xfc9d, 0xfc9e, 0xfc9f, 0xfca0, 0xfd40, 0xfd41, 0xfd42, 0xfd43, 0xfd44, 0xfd45, 0xfd46, 0xfd47, 0xfd48, 0xfd49, 0xfd4a, 0xfd4b, 0xfd4c, 0xfd4d, 0xfd4e, 0xfd4f, 0xfd50, 0xfd51, 0xfd52, 0xfd53, 0xfd54, 0xfd55, 0xfd56, 0xfd57, 0xfd58, 0xfd59, 0xfd5a, 0xfd5b, 0xfd5c, 0xfd5d, 0xfd5e, 0xfd5f, 0xfd60, 0xfd61, 0xfd62, 0xfd63, 0xfd64, 0xfd65, 0xfd66, 0xfd67, 0xfd68, 0xfd69, 0xfd6a, 0xfd6b, 0xfd6c, 0xfd6d, 0xfd6e, 0xfd6f, 0xfd70, 0xfd71, 0xfd72, 0xfd73, 0xfd74, 0xfd75, 0xfd76, 0xfd77, 0xfd78, 0xfd79, 0xfd7a, 0xfd7b, 0xfd7c, 0xfd7d, 0xfd7e, 0xfd80, 0xfd81, 0xfd82, 0xfd83, 0xfd84, 0xfd85, 0xfd86, 0xfd87, 0xfd88, 0xfd89, 0xfd8a, 0xfd8b, 0xfd8c, 0xfd8d, 0xfd8e, 0xfd8f, 0xfd90, 0xfd91, 0xfd92, 0xfd93, 0xfd94, 0xfd95, 0xfd96, 0xfd97, 0xfd98, 0xfd99, 0xfd9a, 0xfd9b, 0xfd9c, 0xfd9d, 0xfd9e, 0xfd9f, 0xfda0, 0xfe40, 0xfe41, 0xfe42, 0xfe43, 0xfe44, 0xfe45, 0xfe46, 0xfe47, 0xfe48, 0xfe49, 0xfe4a, 0xfe4b, 0xfe4c, 0xfe4d, 0xfe4e, 0xfe4f, 0xa955, 0xa968, 0xa969, 0xa96a, 0xa96b, 0xa96c, 0xa96d, 0xa96e, 0xa96f, 0xa970, 0xa971, 0xa972, 0xa973, 0xa974, 0xa975, 0xa976, 0xa977, 0xa978, 0xa979, 0xa97a, 0xa97b, 0xa97c, 0xa97d, 0xa97e, 0xa980, 0xa981, 0xa982, 0xa983, 0xa984, 0xa985, 0xa986, 0xa987, 0xa988, 0xa956, 0xa957, }; static const Summary16 gbkext_inv_uni2indx_page02[14] = { /* 0x0200 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0c00 }, { 2, 0x0200 }, }; static const Summary16 gbkext_inv_uni2indx_page20[44] = { /* 0x2000 */ { 3, 0x0000 }, { 3, 0x0029 }, { 6, 0x0020 }, { 7, 0x0020 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, /* 0x2100 */ { 8, 0x0220 }, { 10, 0x0000 }, { 10, 0x0002 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x03c0 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, /* 0x2200 */ { 15, 0x0000 }, { 15, 0x8020 }, { 17, 0x0008 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0004 }, { 19, 0x00c0 }, { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x0020 }, { 22, 0x0000 }, { 22, 0x8000 }, }; static const Summary16 gbkext_inv_uni2indx_page25[17] = { /* 0x2500 */ { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0xffff }, { 39, 0xffff }, { 55, 0x000f }, { 59, 0xfffe }, { 74, 0x0038 }, { 77, 0x0000 }, { 77, 0x3000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x003c }, { 83, 0x0000 }, /* 0x2600 */ { 83, 0x0200 }, }; static const Summary16 gbkext_inv_uni2indx_page30[16] = { /* 0x3000 */ { 84, 0x00c0 }, { 86, 0x6004 }, { 89, 0x03fe }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x7800 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x7000 }, }; static const Summary16 gbkext_inv_uni2indx_page32[30] = { /* 0x3200 */ { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0002 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0008 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, /* 0x3300 */ { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0xc000 }, { 109, 0x7000 }, { 112, 0x0002 }, { 113, 0x0000 }, { 113, 0x4010 }, { 115, 0x0026 }, }; static const Summary16 gbkext_inv_uni2indx_page4e[1307] = { /* 0x4e00 */ { 118, 0x8074 }, { 123, 0x8084 }, { 126, 0xc24b }, { 133, 0x10aa }, { 138, 0x0457 }, { 144, 0x0ca2 }, { 149, 0xfdbc }, { 161, 0xbff4 }, { 173, 0x04bf }, { 181, 0x72c1 }, { 188, 0x8408 }, { 191, 0x73d3 }, { 201, 0x9100 }, { 204, 0x1c05 }, { 209, 0xe2c5 }, { 217, 0x5712 }, /* 0x4f00 */ { 224, 0x19fd }, { 234, 0x307c }, { 241, 0x730a }, { 248, 0xcaaa }, { 256, 0x1fb7 }, { 267, 0x0054 }, { 270, 0x6d46 }, { 278, 0x27a6 }, { 286, 0x54e7 }, { 295, 0xd76d }, { 306, 0x2816 }, { 311, 0x7fdf }, { 325, 0x3bc7 }, { 335, 0x0a7c }, { 342, 0x18b5 }, { 349, 0xbaf5 }, /* 0x5000 */ { 360, 0x4fff }, { 373, 0x68eb }, { 382, 0x889d }, { 389, 0xabff }, { 402, 0x2e77 }, { 412, 0xebdf }, { 425, 0xefdf }, { 439, 0x373f }, { 450, 0xdede }, { 462, 0xffff }, { 478, 0xec57 }, { 488, 0xf3fb }, { 501, 0x7fff }, { 516, 0xfbbf }, { 530, 0x8f3f }, { 541, 0xf7d7 }, /* 0x5100 */ { 554, 0xf73f }, { 567, 0xfffb }, { 582, 0xfffd }, { 597, 0x7fff }, { 612, 0xd484 }, { 618, 0xeb8d }, { 628, 0x86db }, { 637, 0xc404 }, { 641, 0xccd8 }, { 649, 0xe51b }, { 658, 0x67ca }, { 667, 0xc710 }, { 673, 0x652e }, { 681, 0xd7fd }, { 694, 0x57ec }, { 704, 0x4096 }, /* 0x5200 */ { 709, 0x9a30 }, { 715, 0xd039 }, { 722, 0x94ee }, { 731, 0x5036 }, { 737, 0xcbf0 }, { 746, 0xafac }, { 756, 0x795d }, { 766, 0x5ffb }, { 779, 0xfef9 }, { 792, 0x17f6 }, { 802, 0xc0f0 }, { 808, 0x3ff1 }, { 819, 0xf577 }, { 831, 0x7eba }, { 842, 0xffef }, { 857, 0x39fe }, /* 0x5300 */ { 868, 0x5e9e }, { 878, 0xd91e }, { 887, 0xbbb4 }, { 897, 0x31ff }, { 908, 0x3855 }, { 915, 0x2b11 }, { 921, 0x3520 }, { 926, 0x7a44 }, { 933, 0xc58b }, { 941, 0x5adf }, { 952, 0xbc93 }, { 961, 0x77bf }, { 974, 0xc0f9 }, { 982, 0x742d }, { 990, 0x0086 }, { 993, 0xc410 }, /* 0x5400 */ { 997, 0x08a5 }, { 1002, 0x1710 }, { 1007, 0x0434 }, { 1011, 0xa4c9 }, { 1018, 0xf2b6 }, { 1028, 0xe402 }, { 1033, 0xfeab }, { 1045, 0xc611 }, { 1051, 0x27aa }, { 1059, 0xd18a }, { 1066, 0x4027 }, { 1071, 0x56e5 }, { 1080, 0x0c28 }, { 1084, 0x0940 }, { 1087, 0x981f }, { 1095, 0x4bf3 }, /* 0x5500 */ { 1105, 0x7d3d }, { 1116, 0xf7ec }, { 1128, 0x2b62 }, { 1135, 0x2f74 }, { 1144, 0xf9a5 }, { 1154, 0xef9e }, { 1166, 0x8b0d }, { 1173, 0xa61f }, { 1182, 0x7060 }, { 1187, 0x4ced }, { 1196, 0xff7f }, { 1211, 0x9555 }, { 1219, 0xcdcf }, { 1230, 0x4fa1 }, { 1238, 0x6285 }, { 1244, 0x9f53 }, /* 0x5600 */ { 1254, 0x2cfc }, { 1263, 0x36ff }, { 1275, 0xcf67 }, { 1286, 0x75a9 }, { 1295, 0x8fff }, { 1308, 0xec6f }, { 1319, 0xe0eb }, { 1328, 0xe7bd }, { 1340, 0x3f9f }, { 1352, 0xfff7 }, { 1367, 0x7ff7 }, { 1381, 0xef7f }, { 1395, 0xfbff }, { 1410, 0x136f }, { 1419, 0xd7e8 }, { 1429, 0x19cc }, /* 0x5700 */ { 1436, 0xf8a7 }, { 1446, 0x6fff }, { 1460, 0x08f7 }, { 1468, 0xb1f6 }, { 1478, 0x0b7a }, { 1486, 0x037c }, { 1493, 0x50ac }, { 1499, 0xe737 }, { 1510, 0xe783 }, { 1519, 0xf7f3 }, { 1532, 0x9520 }, { 1537, 0xfeeb }, { 1550, 0x37f3 }, { 1561, 0x58cb }, { 1569, 0x5fee }, { 1581, 0xd8ef }, /* 0x5800 */ { 1592, 0xd73a }, { 1602, 0xbddd }, { 1614, 0xfbec }, { 1626, 0xffde }, { 1640, 0xcfef }, { 1653, 0xbeed }, { 1665, 0xe7df }, { 1678, 0xbfff }, { 1693, 0xfdd4 }, { 1704, 0x39f3 }, { 1714, 0xfcff }, { 1728, 0xefff }, { 1743, 0xffdd }, { 1757, 0xffdd }, { 1771, 0xa7ef }, { 1783, 0xfdb6 }, /* 0x5900 */ { 1795, 0x5f6b }, { 1806, 0x698f }, { 1815, 0x114f }, { 1822, 0xe86d }, { 1831, 0x3469 }, { 1838, 0xfa0d }, { 1847, 0xffda }, { 1860, 0xdca7 }, { 1870, 0xda21 }, { 1877, 0xbd33 }, { 1887, 0x30c7 }, { 1894, 0xb5fb }, { 1906, 0xf3bf }, { 1919, 0xca60 }, { 1925, 0xeed7 }, { 1937, 0x75ff }, /* 0x5a00 */ { 1950, 0xec05 }, { 1957, 0x6ef5 }, { 1968, 0xfdd6 }, { 1980, 0xefa9 }, { 1991, 0xf9be }, { 2003, 0xfbdf }, { 2017, 0xfb7b }, { 2030, 0x7b0f }, { 2040, 0xffff }, { 2056, 0xf3fb }, { 2069, 0xfbff }, { 2084, 0xbed3 }, { 2095, 0xedf9 }, { 2107, 0xeeab }, { 2118, 0xf5b4 }, { 2128, 0xfffd }, /* 0x5b00 */ { 2143, 0xfdff }, { 2158, 0xff3f }, { 2172, 0xffff }, { 2188, 0xff6b }, { 2201, 0xfffe }, { 2216, 0x4044 }, { 2219, 0xe983 }, { 2227, 0xdbd4 }, { 2237, 0x6444 }, { 2242, 0x8057 }, { 2248, 0xf380 }, { 2255, 0x1c86 }, { 2261, 0xef0b }, { 2271, 0x1ff2 }, { 2281, 0xbecd }, { 2292, 0x60fe }, /* 0x5c00 */ { 2301, 0x79ad }, { 2311, 0xca8d }, { 2319, 0xef4b }, { 2330, 0x00ed }, { 2336, 0x30d8 }, { 2342, 0xbddc }, { 2353, 0x3f94 }, { 2362, 0x79fd }, { 2374, 0xcef9 }, { 2385, 0xe02c }, { 2391, 0xc5f3 }, { 2401, 0x5e55 }, { 2410, 0xf7ed }, { 2423, 0xfdfb }, { 2437, 0xda8d }, { 2446, 0xf7fe }, /* 0x5d00 */ { 2460, 0xbf33 }, { 2471, 0xb7af }, { 2483, 0x9d2f }, { 2493, 0x9fef }, { 2506, 0xe37f }, { 2518, 0xd6ff }, { 2531, 0x65ff }, { 2543, 0xffef }, { 2558, 0xfffb }, { 2573, 0xddff }, { 2587, 0xffff }, { 2603, 0xff7f }, { 2618, 0xdfdf }, { 2632, 0x97ff }, { 2645, 0x3419 }, { 2651, 0x9f61 }, /* 0x5e00 */ { 2660, 0x6e91 }, { 2668, 0xc08c }, { 2673, 0x9f3f }, { 2685, 0xc67d }, { 2695, 0xefcb }, { 2707, 0xb7cf }, { 2719, 0xfff9 }, { 2733, 0x42a3 }, { 2739, 0x732e }, { 2748, 0x2904 }, { 2752, 0xdf1e }, { 2763, 0xbc17 }, { 2772, 0xf9ff }, { 2786, 0xf7b1 }, { 2797, 0xfaff }, { 2811, 0x3b2f }, /* 0x5f00 */ { 2821, 0x72e0 }, { 2828, 0x7655 }, { 2837, 0x591e }, { 2845, 0xe9fd }, { 2857, 0xfffe }, { 2872, 0xde12 }, { 2880, 0xc9a9 }, { 2888, 0xe574 }, { 2897, 0xe048 }, { 2902, 0xec5a }, { 2911, 0x9afd }, { 2922, 0xcf5f }, { 2934, 0x4d87 }, { 2942, 0xdc38 }, { 2950, 0x936c }, { 2958, 0x16dd }, /* 0x6000 */ { 2967, 0x1b80 }, { 2972, 0xc58b }, { 2980, 0x701c }, { 2986, 0x67df }, { 2998, 0xd7f1 }, { 3009, 0xd9da }, { 3019, 0x4063 }, { 3024, 0x40b6 }, { 3030, 0xcde7 }, { 3041, 0x53ab }, { 3050, 0x46b6 }, { 3058, 0xe6e9 }, { 3068, 0xf39f }, { 3080, 0x4add }, { 3089, 0x043e }, { 3095, 0xf9a6 }, /* 0x6100 */ { 3105, 0x1cbc }, { 3113, 0x7bdf }, { 3126, 0xf726 }, { 3136, 0x7fff }, { 3151, 0xaaff }, { 3163, 0xdfdd }, { 3176, 0xfe7b }, { 3189, 0xff5e }, { 3202, 0xb7ff }, { 3216, 0xdfef }, { 3230, 0xec7f }, { 3242, 0xbf7f }, { 3256, 0xf2fb }, { 3268, 0xffe9 }, { 3281, 0xffbf }, { 3296, 0x7fdf }, /* 0x6200 */ { 3310, 0x02bf }, { 3318, 0x7218 }, { 3324, 0xabc9 }, { 3333, 0x1f67 }, { 3343, 0x8474 }, { 3349, 0xf6e1 }, { 3359, 0x0137 }, { 3365, 0x2db6 }, { 3374, 0xf9ee }, { 3386, 0x7211 }, { 3392, 0xe6c8 }, { 3400, 0x45dd }, { 3409, 0x880b }, { 3414, 0x6022 }, { 3418, 0x0c13 }, { 3423, 0x0f25 }, /* 0x6300 */ { 3430, 0xbc79 }, { 3440, 0x13bd }, { 3449, 0x72c0 }, { 3455, 0xd9fb }, { 3467, 0x0593 }, { 3473, 0x3fde }, { 3485, 0x9d71 }, { 3494, 0xf33d }, { 3505, 0x287a }, { 3512, 0xfeba }, { 3524, 0x8852 }, { 3529, 0xaa66 }, { 3537, 0x1daf }, { 3547, 0xbfba }, { 3559, 0xd9f4 }, { 3569, 0x5eab }, /* 0x6400 */ { 3579, 0x67d8 }, { 3588, 0xa7e6 }, { 3598, 0xcbbc }, { 3608, 0x5bef }, { 3620, 0xfa0d }, { 3629, 0xbeeb }, { 3641, 0xdd7f }, { 3654, 0xf8ff }, { 3667, 0xff4b }, { 3679, 0xbd99 }, { 3689, 0x8def }, { 3700, 0xea5e }, { 3710, 0x9fda }, { 3721, 0xbe7a }, { 3732, 0xffab }, { 3745, 0xffff }, /* 0x6500 */ { 3761, 0xfdfe }, { 3775, 0xfefb }, { 3789, 0x37df }, { 3801, 0x348f }, { 3809, 0x6cdf }, { 3820, 0x959d }, { 3829, 0xe7b3 }, { 3840, 0xff6a }, { 3852, 0xe77f }, { 3865, 0x6574 }, { 3873, 0x554d }, { 3881, 0xcdfe }, { 3893, 0x2785 }, { 3900, 0xff3b }, { 3913, 0x0c1a }, { 3918, 0xfb3c }, /* 0x6600 */ { 3929, 0x2bb2 }, { 3937, 0x5dc7 }, { 3947, 0x5e5e }, { 3957, 0xaf8d }, { 3967, 0x67f5 }, { 3978, 0x7b03 }, { 3986, 0x3ead }, { 3996, 0xbb2e }, { 4006, 0xef6b }, { 4018, 0xdf3d }, { 4030, 0xbe7f }, { 4043, 0xbdef }, { 4056, 0xffff }, { 4072, 0xc5ff }, { 4084, 0xfdbf }, { 4098, 0x2d62 }, /* 0x6700 */ { 4105, 0xd0fe }, { 4115, 0x574e }, { 4124, 0x42bf }, { 4133, 0xdbcd }, { 4144, 0x2cb2 }, { 4151, 0x2fb4 }, { 4160, 0x58dc }, { 4168, 0x2f52 }, { 4176, 0xf56d }, { 4187, 0x8a5e }, { 4195, 0x5253 }, { 4202, 0xfe16 }, { 4212, 0x7fe5 }, { 4224, 0x88e0 }, { 4229, 0x6dda }, { 4239, 0x5fe4 }, /* 0x6800 */ { 4249, 0x205e }, { 4255, 0xdf35 }, { 4266, 0xf9fd }, { 4279, 0x8c73 }, { 4287, 0xa880 }, { 4291, 0xffc4 }, { 4302, 0xf400 }, { 4307, 0xff2f }, { 4320, 0x7f95 }, { 4331, 0xff77 }, { 4345, 0x5e3b }, { 4355, 0xffd6 }, { 4368, 0xd5fa }, { 4379, 0xfadb }, { 4391, 0xbff6 }, { 4404, 0xe9dc }, /* 0x6900 */ { 4414, 0x97dd }, { 4425, 0x7ffa }, { 4438, 0xdfee }, { 4451, 0x5dee }, { 4462, 0xfffb }, { 4477, 0x9b6f }, { 4488, 0xb7b6 }, { 4499, 0xec7d }, { 4510, 0xdc2a }, { 4518, 0xe6cf }, { 4529, 0xd67f }, { 4541, 0xf76d }, { 4553, 0xabfd }, { 4565, 0x77ee }, { 4577, 0xdffe }, { 4591, 0x5ffb }, /* 0x6a00 */ { 4604, 0xfbff }, { 4619, 0x7e7f }, { 4632, 0x7afd }, { 4644, 0x9fdd }, { 4656, 0xff6f }, { 4670, 0xf4fe }, { 4682, 0xffdd }, { 4696, 0xedfd }, { 4709, 0xbfee }, { 4722, 0xff7c }, { 4735, 0xe5fe }, { 4747, 0xffff }, { 4763, 0xffff }, { 4779, 0xffff }, { 4795, 0xffff }, { 4811, 0xffff }, /* 0x6b00 */ { 4827, 0xffff }, { 4843, 0xffff }, { 4859, 0xff60 }, { 4869, 0xb97b }, { 4880, 0xed37 }, { 4891, 0xfdff }, { 4906, 0xfb03 }, { 4915, 0xe5ff }, { 4928, 0xd121 }, { 4934, 0xf3b3 }, { 4945, 0xfbfd }, { 4959, 0x7f47 }, { 4970, 0x57d9 }, { 4980, 0xf503 }, { 4988, 0x73fd }, { 5000, 0xddd7 }, /* 0x6c00 */ { 5012, 0x5f1f }, { 5023, 0x7084 }, { 5028, 0x3829 }, { 5034, 0xdeca }, { 5044, 0xf938 }, { 5053, 0x074e }, { 5060, 0xf8ec }, { 5070, 0x9daa }, { 5079, 0x6c91 }, { 5086, 0x75e6 }, { 5096, 0x9105 }, { 5101, 0x04f1 }, { 5107, 0xe9cf }, { 5118, 0xb706 }, { 5126, 0x32d0 }, { 5132, 0x8214 }, /* 0x6d00 */ { 5136, 0xa76d }, { 5146, 0xb17b }, { 5156, 0xb35f }, { 5167, 0x85d1 }, { 5174, 0x1215 }, { 5179, 0xa9e1 }, { 5187, 0x39b6 }, { 5196, 0xee6f }, { 5208, 0xacdb }, { 5218, 0x17c5 }, { 5226, 0x3024 }, { 5230, 0x7edb }, { 5242, 0xe70e }, { 5251, 0x9cbd }, { 5261, 0xa7ac }, { 5270, 0xe575 }, /* 0x6e00 */ { 5280, 0x8bdf }, { 5291, 0xdb2c }, { 5300, 0x55c4 }, { 5307, 0xfaeb }, { 5319, 0x9fe7 }, { 5331, 0x76a7 }, { 5341, 0xb7ff }, { 5355, 0x3fff }, { 5369, 0x7d97 }, { 5380, 0x6efe }, { 5392, 0x7b5b }, { 5403, 0xd329 }, { 5411, 0x7779 }, { 5422, 0x3b45 }, { 5430, 0xfc88 }, { 5438, 0xfdef }, /* 0x6f00 */ { 5452, 0x7dbb }, { 5464, 0xffc7 }, { 5477, 0x51ee }, { 5486, 0xbfb5 }, { 5498, 0xd73f }, { 5510, 0xaeff }, { 5523, 0x9fbb }, { 5535, 0xeaeb }, { 5546, 0x8cef }, { 5556, 0xefff }, { 5571, 0xff7d }, { 5585, 0xfdb7 }, { 5598, 0xfdfa }, { 5611, 0xbff9 }, { 5624, 0x3ffc }, { 5636, 0xffff }, /* 0x7000 */ { 5652, 0xffff }, { 5668, 0xf3fd }, { 5681, 0xfff7 }, { 5696, 0xfddf }, { 5710, 0x6fff }, { 5724, 0xbfff }, { 5739, 0x47ff }, { 5751, 0x2e9e }, { 5760, 0xb9de }, { 5771, 0xcd8b }, { 5780, 0x07ff }, { 5791, 0xc475 }, { 5799, 0xfaf0 }, { 5809, 0x74ff }, { 5821, 0x442f }, { 5828, 0xdd7f }, /* 0x7100 */ { 5841, 0xf9ff }, { 5855, 0xf896 }, { 5864, 0x7fbf }, { 5878, 0xffbc }, { 5891, 0xabdf }, { 5903, 0xafff }, { 5917, 0xbe2f }, { 5928, 0xdaf3 }, { 5939, 0x7bef }, { 5952, 0x7cef }, { 5964, 0xeefe }, { 5977, 0xfdd7 }, { 5990, 0xbff7 }, { 6004, 0xffcf }, { 6018, 0xbf5e }, { 6030, 0xfdff }, /* 0x7200 */ { 6045, 0xffbf }, { 6060, 0xdfff }, { 6075, 0xeaff }, { 6088, 0x541c }, { 6094, 0xce7f }, { 6106, 0x55bb }, { 6116, 0x3d39 }, { 6125, 0x39db }, { 6135, 0x53ec }, { 6144, 0x7ffb }, { 6158, 0x4fff }, { 6171, 0xfc2e }, { 6181, 0x9ee1 }, { 6190, 0xbd7a }, { 6201, 0x0cfc }, { 6209, 0xe260 }, /* 0x7300 */ { 6215, 0xbbf5 }, { 6227, 0x8717 }, { 6235, 0xa1d9 }, { 6243, 0x3c6d }, { 6252, 0xdfff }, { 6267, 0xff7a }, { 6280, 0x4ffe }, { 6292, 0xbfff }, { 6307, 0xb56f }, { 6318, 0x77bd }, { 6330, 0x35fb }, { 6341, 0xf372 }, { 6351, 0x58fa }, { 6360, 0xbdfc }, { 6372, 0xdd5e }, { 6383, 0xfffb }, /* 0x7400 */ { 6398, 0x7997 }, { 6408, 0xf3fe }, { 6421, 0xaa9b }, { 6430, 0xef86 }, { 6440, 0xfffd }, { 6455, 0x215f }, { 6463, 0xdfff }, { 6478, 0xbf3e }, { 6490, 0xb774 }, { 6500, 0xaffe }, { 6513, 0xfc7f }, { 6526, 0xfbff }, { 6541, 0xffff }, { 6557, 0xaffb }, { 6570, 0x3fa2 }, { 6579, 0x7f2f }, /* 0x7500 */ { 6591, 0x5fef }, { 6604, 0x68f5 }, { 6613, 0x44df }, { 6622, 0xb250 }, { 6628, 0x26de }, { 6637, 0xe1ef }, { 6648, 0xfb9f }, { 6661, 0x7ceb }, { 6672, 0x77b7 }, { 6684, 0x5929 }, { 6691, 0x27c4 }, { 6698, 0x8cc0 }, { 6703, 0xd843 }, { 6710, 0xb68b }, { 6719, 0xf223 }, { 6727, 0x6dec }, /* 0x7600 */ { 6737, 0xebd4 }, { 6747, 0x745e }, { 6756, 0xd18a }, { 6763, 0x2ec6 }, { 6771, 0xcff6 }, { 6783, 0xafaf }, { 6795, 0x77f7 }, { 6808, 0x96ff }, { 6820, 0xb62b }, { 6829, 0xfdb5 }, { 6841, 0xbfef }, { 6855, 0x7fe9 }, { 6867, 0x1a9b }, { 6875, 0x7628 }, { 6882, 0x3fdf }, { 6895, 0xace9 }, /* 0x7700 */ { 6904, 0xd46d }, { 6913, 0x79ff }, { 6926, 0x5cba }, { 6935, 0xea1f }, { 6945, 0xff74 }, { 6957, 0xf3fc }, { 6969, 0xe691 }, { 6977, 0x1dff }, { 6989, 0x8fce }, { 6999, 0x7ff9 }, { 7012, 0xe95a }, { 7021, 0x57d6 }, { 7031, 0xdfff }, { 7046, 0xe77f }, { 7059, 0x8553 }, { 7066, 0x1eb7 }, /* 0x7800 */ { 7076, 0xcdf8 }, { 7086, 0x4a29 }, { 7092, 0xcd17 }, { 7101, 0xa06e }, { 7108, 0xaf5e }, { 7119, 0xdf1a }, { 7129, 0x83ff }, { 7140, 0xef7f }, { 7154, 0x8d7f }, { 7165, 0x6275 }, { 7173, 0xff55 }, { 7185, 0xbde0 }, { 7194, 0xf1dd }, { 7205, 0xfdce }, { 7217, 0xeeff }, { 7231, 0xfb6b }, /* 0x7900 */ { 7243, 0xffdd }, { 7257, 0xbff7 }, { 7271, 0xffef }, { 7286, 0xa3ef }, { 7297, 0xfcbc }, { 7308, 0x0337 }, { 7315, 0x5e5a }, { 7324, 0xfa7f }, { 7337, 0x7bcc }, { 7347, 0xfbff }, { 7362, 0xff7f }, { 7377, 0x91f7 }, { 7387, 0xd5b4 }, { 7396, 0x7ed9 }, { 7407, 0x5527 }, { 7415, 0xd6fe }, /* 0x7a00 */ { 7427, 0x97b2 }, { 7436, 0xbb6f }, { 7448, 0xfff6 }, { 7462, 0x4577 }, { 7471, 0xffbf }, { 7486, 0xff7d }, { 7500, 0xffff }, { 7516, 0x782e }, { 7524, 0xdea4 }, { 7533, 0x4e19 }, { 7540, 0xce9e }, { 7550, 0x7ff7 }, { 7564, 0xf7ff }, { 7579, 0x3dbf }, { 7591, 0x5f96 }, { 7601, 0x59ff }, /* 0x7b00 */ { 7613, 0x72a7 }, { 7622, 0xb5cd }, { 7632, 0xa28e }, { 7639, 0xaaf5 }, { 7649, 0x655f }, { 7659, 0xd2a8 }, { 7666, 0xbffa }, { 7679, 0xb559 }, { 7688, 0xdfde }, { 7701, 0xcf4e }, { 7711, 0xc039 }, { 7717, 0xfeed }, { 7730, 0xef3d }, { 7742, 0xd9f5 }, { 7753, 0xbb9d }, { 7764, 0xaf7d }, /* 0x7c00 */ { 7776, 0x677f }, { 7788, 0x7fbf }, { 7802, 0xfb3f }, { 7815, 0x7eff }, { 7829, 0xdffc }, { 7842, 0xffff }, { 7858, 0xffff }, { 7874, 0xc7e7 }, { 7885, 0xfdff }, { 7900, 0x0e59 }, { 7907, 0xbbcb }, { 7918, 0x8df1 }, { 7927, 0xca5d }, { 7936, 0x6d1f }, { 7946, 0x7efe }, { 7959, 0xf6ff }, /* 0x7d00 */ { 7973, 0xfbff }, { 7988, 0xffff }, { 8004, 0x777a }, { 8015, 0xffff }, { 8031, 0xffff }, { 8047, 0xffff }, { 8063, 0xbfff }, { 8078, 0xff7f }, { 8093, 0xffff }, { 8109, 0xffff }, { 8125, 0xbfbf }, { 8139, 0xffff }, { 8155, 0xffff }, { 8171, 0xffff }, { 8187, 0xffff }, { 8203, 0xffff }, /* 0x7e00 */ { 8219, 0xffff }, { 8235, 0xffff }, { 8251, 0xffff }, { 8267, 0xf7ff }, { 8282, 0xff7d }, { 8296, 0xffff }, { 8312, 0xffff }, { 8328, 0xffff }, { 8344, 0xfffb }, { 8359, 0x77ff }, { 8373, 0x4000 }, { 8374, 0x1810 }, { 8377, 0x0000 }, { 8377, 0x0040 }, { 8378, 0x1010 }, { 8380, 0x0200 }, /* 0x7f00 */ { 8381, 0x0400 }, { 8382, 0x4001 }, { 8384, 0x0000 }, { 8384, 0xfa80 }, { 8391, 0xffcb }, { 8404, 0x7a4c }, { 8412, 0xb8f9 }, { 8422, 0xbde9 }, { 8433, 0xabfd }, { 8445, 0x1bef }, { 8456, 0x7f6d }, { 8468, 0x4cfa }, { 8477, 0xabdd }, { 8488, 0x7ecf }, { 8500, 0xbd9c }, { 8510, 0xe7f4 }, /* 0x8000 */ { 8521, 0xc784 }, { 8528, 0xec0a }, { 8535, 0xf81a }, { 8543, 0x5615 }, { 8550, 0xc3b3 }, { 8559, 0xfaeb }, { 8571, 0xf9ff }, { 8585, 0x7ffd }, { 8599, 0xe526 }, { 8607, 0x42b7 }, { 8615, 0x11c8 }, { 8620, 0x0b69 }, { 8627, 0x8fa0 }, { 8634, 0x813f }, { 8642, 0x404d }, { 8647, 0xcaa0 }, /* 0x8100 */ { 8653, 0x19bb }, { 8662, 0xbaa0 }, { 8669, 0x6fff }, { 8683, 0xbeb9 }, { 8694, 0xe2bf }, { 8705, 0xf9c4 }, { 8714, 0x9d5e }, { 8724, 0x01ec }, { 8730, 0x7afa }, { 8741, 0xc6fd }, { 8752, 0xfab7 }, { 8764, 0xf3f7 }, { 8777, 0xebb0 }, { 8786, 0xffff }, { 8802, 0xcb77 }, { 8813, 0xa7e7 }, /* 0x8200 */ { 8824, 0xcf88 }, { 8832, 0x27ea }, { 8841, 0x42f1 }, { 8848, 0xb404 }, { 8853, 0x756f }, { 8864, 0x7aff }, { 8877, 0x3eff }, { 8890, 0x19e2 }, { 8897, 0x12eb }, { 8905, 0x4c79 }, { 8913, 0x008d }, { 8917, 0x9c64 }, { 8924, 0x026d }, { 8930, 0x2641 }, { 8935, 0x7784 }, { 8943, 0xf56d }, /* 0x8300 */ { 8954, 0x2c01 }, { 8958, 0xe34d }, { 8967, 0x467f }, { 8977, 0xe885 }, { 8984, 0x7d36 }, { 8994, 0x23e8 }, { 9001, 0x0004 }, { 9002, 0xc67f }, { 9013, 0xbd9f }, { 9025, 0xa6f3 }, { 9035, 0xf0fe }, { 9046, 0xc820 }, { 9050, 0x6b5c }, { 9059, 0x4eaf }, { 9069, 0xf9dc }, { 9080, 0xdcf8 }, /* 0x8400 */ { 9090, 0x07a5 }, { 9097, 0xcefd }, { 9109, 0xfe0f }, { 9120, 0xcefd }, { 9132, 0xffbf }, { 9147, 0xe17d }, { 9157, 0xc5f5 }, { 9167, 0xfa95 }, { 9177, 0xa47b }, { 9186, 0xed7f }, { 9199, 0x7ffd }, { 9213, 0x58eb }, { 9222, 0xd9ed }, { 9233, 0x5fb4 }, { 9243, 0xef96 }, { 9254, 0x6ffe }, /* 0x8500 */ { 9267, 0xefff }, { 9282, 0x7b75 }, { 9293, 0xe7fd }, { 9306, 0xc07f }, { 9315, 0xf8f7 }, { 9327, 0xbdbf }, { 9340, 0xfeef }, { 9354, 0xb1eb }, { 9364, 0x7f4f }, { 9376, 0xe7ff }, { 9390, 0x3aef }, { 9401, 0xfd7e }, { 9414, 0x7dfd }, { 9427, 0xefd6 }, { 9439, 0xfdef }, { 9453, 0x77ff }, /* 0x8600 */ { 9467, 0xffdf }, { 9482, 0xffbd }, { 9496, 0xfd7f }, { 9510, 0xeeff }, { 9524, 0x1fff }, { 9537, 0xbbec }, { 9548, 0xa7fb }, { 9560, 0x01fd }, { 9568, 0xc3f8 }, { 9577, 0xcfd7 }, { 9589, 0x6867 }, { 9597, 0xfb8c }, { 9607, 0x312e }, { 9614, 0x34ec }, { 9622, 0x9def }, { 9634, 0xbce0 }, /* 0x8700 */ { 9642, 0xd872 }, { 9650, 0xaa53 }, { 9658, 0xbdd1 }, { 9668, 0x376d }, { 9678, 0xac7f }, { 9689, 0xfd77 }, { 9702, 0xbfc6 }, { 9713, 0x87ae }, { 9722, 0xd6d3 }, { 9732, 0x7f77 }, { 9745, 0x46ff }, { 9756, 0xdbd7 }, { 9768, 0xf3be }, { 9780, 0xf7f1 }, { 9792, 0xbbde }, { 9804, 0xbdff }, /* 0x8800 */ { 9818, 0xfbf7 }, { 9832, 0xf797 }, { 9844, 0xfff9 }, { 9858, 0xedfb }, { 9871, 0xcfce }, { 9882, 0xfd6f }, { 9895, 0xa4c1 }, { 9901, 0x1f7a }, { 9911, 0xd6c9 }, { 9920, 0xefbb }, { 9933, 0xd7eb }, { 9945, 0xef7d }, { 9958, 0xbd99 }, { 9968, 0x7ccb }, { 9978, 0xfec3 }, { 9989, 0xace4 }, /* 0x8900 */ { 9997, 0xfbfb }, { 10011, 0xf1f2 }, { 10021, 0xf3dd }, { 10033, 0xffae }, { 10046, 0xffed }, { 10060, 0x3fff }, { 10074, 0xffbf }, { 10089, 0x77ff }, { 10103, 0xffb5 }, { 10116, 0xffff }, { 10132, 0xffff }, { 10148, 0xffff }, { 10164, 0x2009 }, { 10167, 0xabb8 }, { 10176, 0x7797 }, { 10187, 0xfff7 }, /* 0x8a00 */ { 10202, 0xff7e }, { 10216, 0xffff }, { 10232, 0xffff }, { 10248, 0xbfff }, { 10263, 0xfeff }, { 10278, 0xffff }, { 10294, 0xffff }, { 10310, 0xfdff }, { 10325, 0xf9ff }, { 10339, 0xfff7 }, { 10354, 0xffff }, { 10370, 0xffff }, { 10386, 0xffff }, { 10402, 0xffff }, { 10418, 0xffff }, { 10434, 0xffff }, /* 0x8b00 */ { 10450, 0xff7f }, { 10465, 0xffff }, { 10481, 0xffbf }, { 10496, 0xffff }, { 10512, 0xffff }, { 10528, 0xffff }, { 10544, 0xefbf }, { 10558, 0xffff }, { 10574, 0xffff }, { 10590, 0xffff }, { 10606, 0x1000 }, { 10607, 0x0802 }, { 10609, 0x0080 }, { 10610, 0x0001 }, { 10611, 0x0400 }, { 10612, 0x0000 }, /* 0x8c00 */ { 10612, 0x0200 }, { 10613, 0x4000 }, { 10614, 0x0000 }, { 10614, 0xff00 }, { 10622, 0xed3d }, { 10633, 0xfbdf }, { 10647, 0xf3f9 }, { 10659, 0xf8f7 }, { 10671, 0xe9db }, { 10682, 0xfeef }, { 10696, 0xffff }, { 10712, 0xffff }, { 10728, 0xffff }, { 10744, 0xffff }, { 10760, 0xffff }, { 10776, 0xffff }, /* 0x8d00 */ { 10792, 0xffff }, { 10808, 0x1fff }, { 10821, 0x0001 }, { 10822, 0x0000 }, { 10822, 0x0000 }, { 10822, 0x8086 }, { 10826, 0xd720 }, { 10833, 0xff06 }, { 10843, 0xf3cd }, { 10854, 0x7fed }, { 10867, 0xfff7 }, { 10882, 0x2ac5 }, { 10889, 0x27a7 }, { 10898, 0x133d }, { 10906, 0x62e7 }, { 10915, 0xd057 }, /* 0x8e00 */ { 10923, 0x69df }, { 10934, 0x1fef }, { 10946, 0x29f3 }, { 10955, 0xd9dd }, { 10966, 0xf068 }, { 10973, 0xfdf9 }, { 10986, 0x4dbf }, { 10997, 0x6faa }, { 11007, 0x7f5d }, { 11019, 0xafee }, { 11031, 0x67ff }, { 11044, 0xfbfb }, { 11058, 0xbfff }, { 11073, 0xffff }, { 11089, 0xffff }, { 11105, 0xffff }, /* 0x8f00 */ { 11121, 0xffff }, { 11137, 0xffff }, { 11153, 0xffff }, { 11169, 0xffff }, { 11185, 0xffff }, { 11201, 0xffff }, { 11217, 0x043f }, { 11224, 0x0000 }, { 11224, 0x1001 }, { 11226, 0x2004 }, { 11228, 0xf4f7 }, { 11240, 0x9dbc }, { 11250, 0xbe49 }, { 11259, 0x04c4 }, { 11263, 0x908b }, { 11269, 0xdc76 }, /* 0x9000 */ { 11279, 0x5180 }, { 11283, 0x1328 }, { 11288, 0x1fb8 }, { 11297, 0xa69f }, { 11307, 0x5f69 }, { 11317, 0xf670 }, { 11326, 0x9ed3 }, { 11336, 0x5fcf }, { 11348, 0xf6f2 }, { 11359, 0xd555 }, { 11368, 0x2bb1 }, { 11376, 0xb084 }, { 11381, 0x3b4d }, { 11390, 0xc774 }, { 11399, 0x5639 }, { 11407, 0x9eef }, /* 0x9100 */ { 11419, 0xffeb }, { 11433, 0xbdff }, { 11447, 0x7ff3 }, { 11460, 0xfdfd }, { 11474, 0x01b7 }, { 11481, 0x9b7a }, { 11491, 0x29c1 }, { 11497, 0x1c08 }, { 11501, 0xc55f }, { 11511, 0xf3f8 }, { 11522, 0x1bf3 }, { 11532, 0xfbcf }, { 11545, 0x097f }, { 11554, 0xeffd }, { 11568, 0xffff }, { 11584, 0xffff }, /* 0x9200 */ { 11600, 0xffff }, { 11616, 0xffff }, { 11632, 0xffff }, { 11648, 0xffff }, { 11664, 0xffff }, { 11680, 0xffff }, { 11696, 0xffff }, { 11712, 0xffef }, { 11727, 0xbfff }, { 11742, 0xffff }, { 11758, 0xbfff }, { 11773, 0xffff }, { 11789, 0xfeff }, { 11804, 0xffff }, { 11820, 0xffff }, { 11836, 0xffff }, /* 0x9300 */ { 11852, 0xffff }, { 11868, 0xffff }, { 11884, 0xffff }, { 11900, 0xbfff }, { 11915, 0xffff }, { 11931, 0xffff }, { 11947, 0xfbff }, { 11962, 0xffff }, { 11978, 0x7fff }, { 11993, 0xffff }, { 12009, 0xffff }, { 12025, 0xffff }, { 12041, 0xfbff }, { 12056, 0xffbf }, { 12071, 0xffff }, { 12087, 0xffff }, /* 0x9400 */ { 12103, 0xffff }, { 12119, 0xffff }, { 12135, 0xffff }, { 12151, 0xbfff }, { 12166, 0xffff }, { 12182, 0xffff }, { 12198, 0xf7ff }, { 12213, 0xffff }, { 12229, 0x001f }, { 12234, 0x0142 }, { 12237, 0x0000 }, { 12237, 0x0000 }, { 12237, 0x8080 }, { 12239, 0x0418 }, { 12242, 0x0040 }, { 12243, 0x0800 }, /* 0x9500 */ { 12244, 0x0000 }, { 12244, 0x1000 }, { 12245, 0x0081 }, { 12247, 0x2008 }, { 12249, 0x0908 }, { 12252, 0x0420 }, { 12254, 0x4001 }, { 12256, 0x7fb0 }, { 12266, 0xffff }, { 12282, 0xffff }, { 12298, 0xffff }, { 12314, 0xffff }, { 12330, 0xffff }, { 12346, 0xffff }, { 12362, 0x10ff }, { 12371, 0x8000 }, /* 0x9600 */ { 12372, 0x0080 }, { 12373, 0x4908 }, { 12377, 0xbbf9 }, { 12389, 0x4781 }, { 12395, 0xc40a }, { 12400, 0x77ce }, { 12411, 0xe869 }, { 12419, 0xff0b }, { 12430, 0x569f }, { 12440, 0xec6e }, { 12450, 0xff7f }, { 12465, 0x8db6 }, { 12474, 0x0d0c }, { 12479, 0xffdb }, { 12493, 0x78fe }, { 12504, 0xbd37 }, /* 0x9700 */ { 12515, 0x1c2c }, { 12521, 0xafb7 }, { 12533, 0xdbff }, { 12547, 0xbcfa }, { 12558, 0xffff }, { 12574, 0xb5b3 }, { 12584, 0xfdd8 }, { 12595, 0xefa7 }, { 12607, 0xd7df }, { 12620, 0xfee9 }, { 12632, 0x57f6 }, { 12643, 0xffeb }, { 12657, 0xffff }, { 12673, 0xffff }, { 12689, 0xc13f }, { 12698, 0xff97 }, /* 0x9800 */ { 12711, 0xffff }, { 12727, 0xffff }, { 12743, 0xffff }, { 12759, 0xffff }, { 12775, 0xffff }, { 12791, 0xffff }, { 12807, 0xffff }, { 12823, 0x001f }, { 12828, 0x4800 }, { 12830, 0x0224 }, { 12833, 0xff08 }, { 12842, 0xffff }, { 12858, 0xbfff }, { 12873, 0x38d1 }, { 12880, 0xfe7f }, { 12894, 0xffff }, /* 0x9900 */ { 12910, 0xdfff }, { 12925, 0xfffe }, { 12940, 0xbfff }, { 12955, 0xffff }, { 12971, 0xffff }, { 12987, 0xffcf }, { 13001, 0x0057 }, { 13006, 0x4b08 }, { 13011, 0x520c }, { 13016, 0xfc00 }, { 13022, 0xfedf }, { 13036, 0xffff }, { 13052, 0xffff }, { 13068, 0xffff }, { 13084, 0xffff }, { 13100, 0xffff }, /* 0x9a00 */ { 13116, 0xffff }, { 13132, 0xffff }, { 13148, 0xffff }, { 13164, 0xffff }, { 13180, 0xffff }, { 13196, 0xffff }, { 13212, 0x0fff }, { 13224, 0x0004 }, { 13225, 0x6208 }, { 13229, 0x0230 }, { 13232, 0xfe40 }, { 13240, 0xea3c }, { 13249, 0xe7d8 }, { 13259, 0x7ef5 }, { 13271, 0x57bd }, { 13282, 0xf5ff }, /* 0x9b00 */ { 13296, 0x7ef7 }, { 13309, 0x7ff7 }, { 13323, 0x7ff7 }, { 13337, 0xe7fb }, { 13350, 0x5c41 }, { 13356, 0xffed }, { 13370, 0xffff }, { 13386, 0xffff }, { 13402, 0xffff }, { 13418, 0xffff }, { 13434, 0xffff }, { 13450, 0xffff }, { 13466, 0xffff }, { 13482, 0xffff }, { 13498, 0xffff }, { 13514, 0xffff }, /* 0x9c00 */ { 13530, 0xffff }, { 13546, 0xffff }, { 13562, 0xffff }, { 13578, 0xffff }, { 13594, 0xffff }, { 13610, 0xffff }, { 13626, 0xffff }, { 13642, 0x6fff }, { 13656, 0x9619 }, { 13663, 0x23c8 }, { 13669, 0x9400 }, { 13672, 0xc200 }, { 13675, 0x0307 }, { 13680, 0x0c06 }, { 13684, 0xfffb }, { 13699, 0xffff }, /* 0x9d00 */ { 13715, 0xffff }, { 13731, 0xffff }, { 13747, 0xffff }, { 13763, 0xffff }, { 13779, 0xffff }, { 13795, 0xffff }, { 13811, 0xffff }, { 13827, 0xffff }, { 13843, 0xffff }, { 13859, 0xffff }, { 13875, 0xffff }, { 13891, 0xffff }, { 13907, 0xffff }, { 13923, 0xffff }, { 13939, 0xffff }, { 13955, 0xffff }, /* 0x9e00 */ { 13971, 0xffff }, { 13987, 0x7fff }, { 14002, 0x4090 }, { 14005, 0x1811 }, { 14009, 0x2001 }, { 14011, 0xa25d }, { 14019, 0xc027 }, { 14025, 0x3ff4 }, { 14036, 0xf67b }, { 14048, 0x5ff3 }, { 14060, 0xffbf }, { 14075, 0x96ef }, { 14086, 0x1def }, { 14097, 0x46ed }, { 14106, 0x795a }, { 14115, 0xa5ff }, /* 0x9f00 */ { 14127, 0x97ff }, { 14140, 0xfd76 }, { 14152, 0x6ffa }, { 14164, 0x957f }, { 14175, 0xffef }, { 14190, 0xfffc }, { 14204, 0xffff }, { 14220, 0x7fff }, { 14235, 0xe006 }, { 14240, 0x71ff }, { 14252, 0x003e }, }; static const Summary16 gbkext_inv_uni2indx_pagef9[19] = { /* 0xf900 */ { 14257, 0x0000 }, { 14257, 0x0000 }, { 14257, 0x1000 }, { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0200 }, { 14259, 0x0000 }, { 14259, 0x0020 }, { 14260, 0x0000 }, { 14260, 0x0000 }, { 14260, 0x0000 }, { 14260, 0x0000 }, { 14260, 0x0080 }, { 14261, 0x0002 }, /* 0xfa00 */ { 14262, 0xf000 }, { 14266, 0x811a }, { 14271, 0x039b }, }; static const Summary16 gbkext_inv_uni2indx_pagefe[31] = { /* 0xfe00 */ { 14278, 0x0000 }, { 14278, 0x0000 }, { 14278, 0x0000 }, { 14278, 0x0001 }, { 14279, 0xfe00 }, { 14286, 0xfef7 }, { 14300, 0x0f7f }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, /* 0xff00 */ { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0014 }, }; static int gbkext_inv_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x0200 && wc < 0x02e0) summary = &gbkext_inv_uni2indx_page02[(wc>>4)-0x020]; else if (wc >= 0x2000 && wc < 0x22c0) summary = &gbkext_inv_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x2500 && wc < 0x2610) summary = &gbkext_inv_uni2indx_page25[(wc>>4)-0x250]; else if (wc >= 0x3000 && wc < 0x3100) summary = &gbkext_inv_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x3200 && wc < 0x33e0) summary = &gbkext_inv_uni2indx_page32[(wc>>4)-0x320]; else if (wc >= 0x4e00 && wc < 0x9fb0) summary = &gbkext_inv_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xf900 && wc < 0xfa30) summary = &gbkext_inv_uni2indx_pagef9[(wc>>4)-0xf90]; else if (wc >= 0xfe00 && wc < 0xfff0) summary = &gbkext_inv_uni2indx_pagefe[(wc>>4)-0xfe0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' and the number of bits set in `used'. */ used = (used & 0x5555) + ((used & 0xaaaa) >> 1); used = (used & 0x3333) + ((used & 0xcccc) >> 2); used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); used = (used & 0x00ff) + (used >> 8); c = gbkext_inv_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-3.21.80/src/libtiniconv/encdec/utf8.h0000664000175000017500000001002012313064025015422 00000000000000/* * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UTF-8 */ /* Specification: RFC 3629 */ static int utf8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = s[0]; if (c < 0x80) { *pwc = c; return 1; } else if (c < 0xc2) { return RET_ILSEQ; } else if (c < 0xe0) { if (n < 2) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40)) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x1f) << 6) | (ucs4_t) (s[1] ^ 0x80); return 2; } else if (c < 0xf0) { if (n < 3) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (c >= 0xe1 || s[1] >= 0xa0))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x0f) << 12) | ((ucs4_t) (s[1] ^ 0x80) << 6) | (ucs4_t) (s[2] ^ 0x80); return 3; } else if (c < 0xf8 && sizeof(ucs4_t)*8 >= 32) { if (n < 4) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (c >= 0xf1 || s[1] >= 0x90))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x07) << 18) | ((ucs4_t) (s[1] ^ 0x80) << 12) | ((ucs4_t) (s[2] ^ 0x80) << 6) | (ucs4_t) (s[3] ^ 0x80); return 4; } else if (c < 0xfc && sizeof(ucs4_t)*8 >= 32) { if (n < 5) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40 && (c >= 0xf9 || s[1] >= 0x88))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x03) << 24) | ((ucs4_t) (s[1] ^ 0x80) << 18) | ((ucs4_t) (s[2] ^ 0x80) << 12) | ((ucs4_t) (s[3] ^ 0x80) << 6) | (ucs4_t) (s[4] ^ 0x80); return 5; } else if (c < 0xfe && sizeof(ucs4_t)*8 >= 32) { if (n < 6) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40 && (s[5] ^ 0x80) < 0x40 && (c >= 0xfd || s[1] >= 0x84))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x01) << 30) | ((ucs4_t) (s[1] ^ 0x80) << 24) | ((ucs4_t) (s[2] ^ 0x80) << 18) | ((ucs4_t) (s[3] ^ 0x80) << 12) | ((ucs4_t) (s[4] ^ 0x80) << 6) | (ucs4_t) (s[5] ^ 0x80); return 6; } else return RET_ILSEQ; } static int utf8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) /* n == 0 is acceptable */ { int count; if (wc < 0x80) count = 1; else if (wc < 0x800) count = 2; else if (wc < 0x10000) count = 3; else if (wc < 0x200000) count = 4; else if (wc < 0x4000000) count = 5; else if (wc <= 0x7fffffff) count = 6; else return RET_ILUNI; if (n < count) return RET_TOOSMALL; switch (count) { /* note: code falls through cases! */ case 6: r[5] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x4000000; case 5: r[4] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x200000; case 4: r[3] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x10000; case 3: r[2] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x800; case 2: r[1] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0xc0; case 1: r[0] = wc; } return count; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_15.h0000664000175000017500000000532312313064025016203 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-15 */ static const unsigned short iso8859_15_2uni[32] = { /* 0xa0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, }; static int iso8859_15_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xa0 && c < 0xc0) *pwc = (ucs4_t) iso8859_15_2uni[c-0xa0]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char iso8859_15_page00[32] = { 0xa0, 0xa1, 0xa2, 0xa3, 0x00, 0xa5, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0xb9, 0xba, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0xb8-0xbf */ }; static const unsigned char iso8859_15_page01[48] = { 0x00, 0x00, 0xbc, 0xbd, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xa6, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0xbe, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb8, 0x00, /* 0x78-0x7f */ }; static int iso8859_15_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = iso8859_15_page00[wc-0x00a0]; else if (wc >= 0x00c0 && wc < 0x0100) c = wc; else if (wc >= 0x0150 && wc < 0x0180) c = iso8859_15_page01[wc-0x0150]; else if (wc == 0x20ac) c = 0xa4; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/cp1256.h0000664000175000017500000001516712313064025015475 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1256 */ static const unsigned short cp1256_2uni[128] = { /* 0x80 */ 0x20ac, 0x067e, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, /* 0x90 */ 0x06af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x06a9, 0x2122, 0x0691, 0x203a, 0x0153, 0x200c, 0x200d, 0x06ba, /* 0xa0 */ 0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x06be, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x061b, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x061f, /* 0xc0 */ 0x06c1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, /* 0xd0 */ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00d7, 0x0637, 0x0638, 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643, /* 0xe0 */ 0x00e0, 0x0644, 0x00e2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0649, 0x064a, 0x00ee, 0x00ef, /* 0xf0 */ 0x064b, 0x064c, 0x064d, 0x064e, 0x00f4, 0x064f, 0x0650, 0x00f7, 0x0651, 0x00f9, 0x0652, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x06d2, }; static int cp1256_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp1256_2uni[c-0x80]; return 1; } static const unsigned char cp1256_page00[96] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0xe0, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0x00, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0xf7, /* 0xf0-0xf7 */ 0x00, 0xf9, 0x00, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char cp1256_page01[72] = { 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1256_page06[208] = { 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd8, /* 0x30-0x37 */ 0xd9, 0xda, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xdc, 0xdd, 0xde, 0xdf, 0xe1, 0xe3, 0xe4, 0xe5, /* 0x40-0x47 */ 0xe6, 0xec, 0xed, 0xf0, 0xf1, 0xf2, 0xf3, 0xf5, /* 0x48-0x4f */ 0xf6, 0xf8, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x00, /* 0x80-0x87 */ 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0xaa, 0x00, /* 0xb8-0xbf */ 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ }; static const unsigned char cp1256_page20[56] = { 0x00, 0x00, 0x00, 0x00, 0x9d, 0x9e, 0xfd, 0xfe, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1256_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = cp1256_page00[wc-0x00a0]; else if (wc >= 0x0150 && wc < 0x0198) c = cp1256_page01[wc-0x0150]; else if (wc == 0x02c6) c = 0x88; else if (wc >= 0x0608 && wc < 0x06d8) c = cp1256_page06[wc-0x0608]; else if (wc >= 0x2008 && wc < 0x2040) c = cp1256_page20[wc-0x2008]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_9.h0000664000175000017500000000607612313064025016134 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-9 */ static const unsigned short iso8859_9_2uni[48] = { /* 0xd0 */ 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, }; static int iso8859_9_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xd0) *pwc = (ucs4_t) iso8859_9_2uni[c-0xd0]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char iso8859_9_page00[48] = { 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ }; static const unsigned char iso8859_9_page01[72] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, /* 0x58-0x5f */ }; static int iso8859_9_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00d0) { *r = wc; return 1; } else if (wc >= 0x00d0 && wc < 0x0100) c = iso8859_9_page00[wc-0x00d0]; else if (wc >= 0x0118 && wc < 0x0160) c = iso8859_9_page01[wc-0x0118]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_4.h0000664000175000017500000001114212313064025016115 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-4 */ static const unsigned short iso8859_4_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, /* 0xb0 */ 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, /* 0xc0 */ 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, /* 0xd0 */ 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, /* 0xe0 */ 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, /* 0xf0 */ 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9, }; static int iso8859_4_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_4_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_4_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0xaf, /* 0xa8-0xaf */ 0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0x00, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0x00, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc0, 0xe0, 0x00, 0x00, 0xa1, 0xb1, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0xaa, 0xba, 0x00, 0x00, 0xcc, 0xec, /* 0x10-0x17 */ 0xca, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xab, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0xa5, 0xb5, 0xcf, 0xef, 0x00, 0x00, 0xc7, 0xe7, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xf3, /* 0x30-0x37 */ 0xa2, 0x00, 0x00, 0xa6, 0xb6, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0xbd, 0xbf, 0xd2, 0xf2, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xb3, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xa9, 0xb9, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, /* 0x60-0x67 */ 0xdd, 0xfd, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd9, 0xf9, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0xbe, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_4_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0xff, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static int iso8859_4_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_4_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = iso8859_4_page02[wc-0x02c0]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_10.h0000664000175000017500000001040412313064025016172 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-10 */ static const unsigned short iso8859_10_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7, 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a, /* 0xb0 */ 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7, 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b, /* 0xc0 */ 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, /* 0xe0 */ 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138, }; static int iso8859_10_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_10_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_10_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0xd0, 0x00, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, /* 0xd0-0xd7 */ 0xd8, 0x00, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0xf0, 0x00, 0x00, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, /* 0xf0-0xf7 */ 0xf8, 0x00, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc0, 0xe0, 0x00, 0x00, 0xa1, 0xb1, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0xa9, 0xb9, 0xa2, 0xb2, 0x00, 0x00, 0xcc, 0xec, /* 0x10-0x17 */ 0xca, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xa3, 0xb3, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0xa5, 0xb5, 0xa4, 0xb4, 0x00, 0x00, 0xc7, 0xe7, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xb6, /* 0x30-0x37 */ 0xff, 0x00, 0x00, 0xa8, 0xb8, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0xaf, 0xbf, 0xd2, 0xf2, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xaa, 0xba, 0x00, 0x00, 0x00, 0x00, 0xab, 0xbb, /* 0x60-0x67 */ 0xd7, 0xf7, 0xae, 0xbe, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd9, 0xf9, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, 0x00, /* 0x78-0x7f */ }; static int iso8859_10_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_10_page00[wc-0x00a0]; else if (wc == 0x2015) c = 0xbd; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_13.h0000664000175000017500000001064412313064025016203 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-13 */ static const unsigned short iso8859_13_2uni[96] = { /* 0xa0 */ 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, /* 0xc0 */ 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, /* 0xd0 */ 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, /* 0xe0 */ 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, /* 0xf0 */ 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019, }; static int iso8859_13_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_13_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_13_page00[224] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0xaf, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0x00, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xa8, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe5, 0xbf, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0x00, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xb8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc2, 0xe2, 0x00, 0x00, 0xc0, 0xe0, 0xc3, 0xe3, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0xc7, 0xe7, 0x00, 0x00, 0xcb, 0xeb, /* 0x10-0x17 */ 0xc6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0xce, 0xee, 0x00, 0x00, 0xc1, 0xe1, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xed, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0xcf, 0xef, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0xd9, 0xf9, 0xd1, 0xf1, 0xd2, 0xf2, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0xd4, 0xf4, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xba, /* 0x50-0x57 */ 0x00, 0x00, 0xda, 0xfa, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0xca, 0xea, 0xdd, 0xfd, 0xde, 0xfe, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_13_page20[8] = { 0x00, 0xff, 0x00, 0x00, 0xb4, 0xa1, 0xa5, 0x00, /* 0x18-0x1f */ }; static int iso8859_13_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_13_page00[wc-0x00a0]; else if (wc >= 0x2018 && wc < 0x2020) c = iso8859_13_page20[wc-0x2018]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/ces_big5.h0000664000175000017500000000356112313064025016230 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * BIG-5 */ static int ces_big5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (BIG5) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) return big5_mbtowc(conv,pwc,s,2); else return RET_ILSEQ; } } return RET_ILSEQ; } static int ces_big5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (BIG5) */ ret = big5_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/jisx0208.h0000664000175000017500000044152112313064025016041 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * JISX0208.1990-0 */ static const unsigned short jisx0208_2uni_page21[690] = { /* 0x21 */ 0x3000, 0x3001, 0x3002, 0xff0c, 0xff0e, 0x30fb, 0xff1a, 0xff1b, 0xff1f, 0xff01, 0x309b, 0x309c, 0x00b4, 0xff40, 0x00a8, 0xff3e, 0xffe3, 0xff3f, 0x30fd, 0x30fe, 0x309d, 0x309e, 0x3003, 0x4edd, 0x3005, 0x3006, 0x3007, 0x30fc, 0x2015, 0x2010, 0xff0f, 0xff3c, 0x301c, 0x2016, 0xff5c, 0x2026, 0x2025, 0x2018, 0x2019, 0x201c, 0x201d, 0xff08, 0xff09, 0x3014, 0x3015, 0xff3b, 0xff3d, 0xff5b, 0xff5d, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0xff0b, 0x2212, 0x00b1, 0x00d7, 0x00f7, 0xff1d, 0x2260, 0xff1c, 0xff1e, 0x2266, 0x2267, 0x221e, 0x2234, 0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xffe5, 0xff04, 0x00a2, 0x00a3, 0xff05, 0xff03, 0xff06, 0xff0a, 0xff20, 0x00a7, 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, /* 0x22 */ 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x203b, 0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282, 0x2283, 0x222a, 0x2229, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2227, 0x2228, 0x00ac, 0x21d2, 0x21d4, 0x2200, 0x2203, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2220, 0x22a5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d, 0x2235, 0x222b, 0x222c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x212b, 0x2030, 0x266f, 0x266d, 0x266a, 0x2020, 0x2021, 0x00b6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x25ef, /* 0x23 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x24 */ 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x25 */ 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x26 */ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x27 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x28 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2518, 0x2514, 0x251c, 0x252c, 0x2524, 0x2534, 0x253c, 0x2501, 0x2503, 0x250f, 0x2513, 0x251b, 0x2517, 0x2523, 0x2533, 0x252b, 0x253b, 0x254b, 0x2520, 0x252f, 0x2528, 0x2537, 0x253f, 0x251d, 0x2530, 0x2525, 0x2538, 0x2542, }; static const unsigned short jisx0208_2uni_page30[6398] = { /* 0x30 */ 0x4e9c, 0x5516, 0x5a03, 0x963f, 0x54c0, 0x611b, 0x6328, 0x59f6, 0x9022, 0x8475, 0x831c, 0x7a50, 0x60aa, 0x63e1, 0x6e25, 0x65ed, 0x8466, 0x82a6, 0x9bf5, 0x6893, 0x5727, 0x65a1, 0x6271, 0x5b9b, 0x59d0, 0x867b, 0x98f4, 0x7d62, 0x7dbe, 0x9b8e, 0x6216, 0x7c9f, 0x88b7, 0x5b89, 0x5eb5, 0x6309, 0x6697, 0x6848, 0x95c7, 0x978d, 0x674f, 0x4ee5, 0x4f0a, 0x4f4d, 0x4f9d, 0x5049, 0x56f2, 0x5937, 0x59d4, 0x5a01, 0x5c09, 0x60df, 0x610f, 0x6170, 0x6613, 0x6905, 0x70ba, 0x754f, 0x7570, 0x79fb, 0x7dad, 0x7def, 0x80c3, 0x840e, 0x8863, 0x8b02, 0x9055, 0x907a, 0x533b, 0x4e95, 0x4ea5, 0x57df, 0x80b2, 0x90c1, 0x78ef, 0x4e00, 0x58f1, 0x6ea2, 0x9038, 0x7a32, 0x8328, 0x828b, 0x9c2f, 0x5141, 0x5370, 0x54bd, 0x54e1, 0x56e0, 0x59fb, 0x5f15, 0x98f2, 0x6deb, 0x80e4, 0x852d, /* 0x31 */ 0x9662, 0x9670, 0x96a0, 0x97fb, 0x540b, 0x53f3, 0x5b87, 0x70cf, 0x7fbd, 0x8fc2, 0x96e8, 0x536f, 0x9d5c, 0x7aba, 0x4e11, 0x7893, 0x81fc, 0x6e26, 0x5618, 0x5504, 0x6b1d, 0x851a, 0x9c3b, 0x59e5, 0x53a9, 0x6d66, 0x74dc, 0x958f, 0x5642, 0x4e91, 0x904b, 0x96f2, 0x834f, 0x990c, 0x53e1, 0x55b6, 0x5b30, 0x5f71, 0x6620, 0x66f3, 0x6804, 0x6c38, 0x6cf3, 0x6d29, 0x745b, 0x76c8, 0x7a4e, 0x9834, 0x82f1, 0x885b, 0x8a60, 0x92ed, 0x6db2, 0x75ab, 0x76ca, 0x99c5, 0x60a6, 0x8b01, 0x8d8a, 0x95b2, 0x698e, 0x53ad, 0x5186, 0x5712, 0x5830, 0x5944, 0x5bb4, 0x5ef6, 0x6028, 0x63a9, 0x63f4, 0x6cbf, 0x6f14, 0x708e, 0x7114, 0x7159, 0x71d5, 0x733f, 0x7e01, 0x8276, 0x82d1, 0x8597, 0x9060, 0x925b, 0x9d1b, 0x5869, 0x65bc, 0x6c5a, 0x7525, 0x51f9, 0x592e, 0x5965, 0x5f80, 0x5fdc, /* 0x32 */ 0x62bc, 0x65fa, 0x6a2a, 0x6b27, 0x6bb4, 0x738b, 0x7fc1, 0x8956, 0x9d2c, 0x9d0e, 0x9ec4, 0x5ca1, 0x6c96, 0x837b, 0x5104, 0x5c4b, 0x61b6, 0x81c6, 0x6876, 0x7261, 0x4e59, 0x4ffa, 0x5378, 0x6069, 0x6e29, 0x7a4f, 0x97f3, 0x4e0b, 0x5316, 0x4eee, 0x4f55, 0x4f3d, 0x4fa1, 0x4f73, 0x52a0, 0x53ef, 0x5609, 0x590f, 0x5ac1, 0x5bb6, 0x5be1, 0x79d1, 0x6687, 0x679c, 0x67b6, 0x6b4c, 0x6cb3, 0x706b, 0x73c2, 0x798d, 0x79be, 0x7a3c, 0x7b87, 0x82b1, 0x82db, 0x8304, 0x8377, 0x83ef, 0x83d3, 0x8766, 0x8ab2, 0x5629, 0x8ca8, 0x8fe6, 0x904e, 0x971e, 0x868a, 0x4fc4, 0x5ce8, 0x6211, 0x7259, 0x753b, 0x81e5, 0x82bd, 0x86fe, 0x8cc0, 0x96c5, 0x9913, 0x99d5, 0x4ecb, 0x4f1a, 0x89e3, 0x56de, 0x584a, 0x58ca, 0x5efb, 0x5feb, 0x602a, 0x6094, 0x6062, 0x61d0, 0x6212, 0x62d0, 0x6539, /* 0x33 */ 0x9b41, 0x6666, 0x68b0, 0x6d77, 0x7070, 0x754c, 0x7686, 0x7d75, 0x82a5, 0x87f9, 0x958b, 0x968e, 0x8c9d, 0x51f1, 0x52be, 0x5916, 0x54b3, 0x5bb3, 0x5d16, 0x6168, 0x6982, 0x6daf, 0x788d, 0x84cb, 0x8857, 0x8a72, 0x93a7, 0x9ab8, 0x6d6c, 0x99a8, 0x86d9, 0x57a3, 0x67ff, 0x86ce, 0x920e, 0x5283, 0x5687, 0x5404, 0x5ed3, 0x62e1, 0x64b9, 0x683c, 0x6838, 0x6bbb, 0x7372, 0x78ba, 0x7a6b, 0x899a, 0x89d2, 0x8d6b, 0x8f03, 0x90ed, 0x95a3, 0x9694, 0x9769, 0x5b66, 0x5cb3, 0x697d, 0x984d, 0x984e, 0x639b, 0x7b20, 0x6a2b, 0x6a7f, 0x68b6, 0x9c0d, 0x6f5f, 0x5272, 0x559d, 0x6070, 0x62ec, 0x6d3b, 0x6e07, 0x6ed1, 0x845b, 0x8910, 0x8f44, 0x4e14, 0x9c39, 0x53f6, 0x691b, 0x6a3a, 0x9784, 0x682a, 0x515c, 0x7ac3, 0x84b2, 0x91dc, 0x938c, 0x565b, 0x9d28, 0x6822, 0x8305, 0x8431, /* 0x34 */ 0x7ca5, 0x5208, 0x82c5, 0x74e6, 0x4e7e, 0x4f83, 0x51a0, 0x5bd2, 0x520a, 0x52d8, 0x52e7, 0x5dfb, 0x559a, 0x582a, 0x59e6, 0x5b8c, 0x5b98, 0x5bdb, 0x5e72, 0x5e79, 0x60a3, 0x611f, 0x6163, 0x61be, 0x63db, 0x6562, 0x67d1, 0x6853, 0x68fa, 0x6b3e, 0x6b53, 0x6c57, 0x6f22, 0x6f97, 0x6f45, 0x74b0, 0x7518, 0x76e3, 0x770b, 0x7aff, 0x7ba1, 0x7c21, 0x7de9, 0x7f36, 0x7ff0, 0x809d, 0x8266, 0x839e, 0x89b3, 0x8acc, 0x8cab, 0x9084, 0x9451, 0x9593, 0x9591, 0x95a2, 0x9665, 0x97d3, 0x9928, 0x8218, 0x4e38, 0x542b, 0x5cb8, 0x5dcc, 0x73a9, 0x764c, 0x773c, 0x5ca9, 0x7feb, 0x8d0b, 0x96c1, 0x9811, 0x9854, 0x9858, 0x4f01, 0x4f0e, 0x5371, 0x559c, 0x5668, 0x57fa, 0x5947, 0x5b09, 0x5bc4, 0x5c90, 0x5e0c, 0x5e7e, 0x5fcc, 0x63ee, 0x673a, 0x65d7, 0x65e2, 0x671f, 0x68cb, 0x68c4, /* 0x35 */ 0x6a5f, 0x5e30, 0x6bc5, 0x6c17, 0x6c7d, 0x757f, 0x7948, 0x5b63, 0x7a00, 0x7d00, 0x5fbd, 0x898f, 0x8a18, 0x8cb4, 0x8d77, 0x8ecc, 0x8f1d, 0x98e2, 0x9a0e, 0x9b3c, 0x4e80, 0x507d, 0x5100, 0x5993, 0x5b9c, 0x622f, 0x6280, 0x64ec, 0x6b3a, 0x72a0, 0x7591, 0x7947, 0x7fa9, 0x87fb, 0x8abc, 0x8b70, 0x63ac, 0x83ca, 0x97a0, 0x5409, 0x5403, 0x55ab, 0x6854, 0x6a58, 0x8a70, 0x7827, 0x6775, 0x9ecd, 0x5374, 0x5ba2, 0x811a, 0x8650, 0x9006, 0x4e18, 0x4e45, 0x4ec7, 0x4f11, 0x53ca, 0x5438, 0x5bae, 0x5f13, 0x6025, 0x6551, 0x673d, 0x6c42, 0x6c72, 0x6ce3, 0x7078, 0x7403, 0x7a76, 0x7aae, 0x7b08, 0x7d1a, 0x7cfe, 0x7d66, 0x65e7, 0x725b, 0x53bb, 0x5c45, 0x5de8, 0x62d2, 0x62e0, 0x6319, 0x6e20, 0x865a, 0x8a31, 0x8ddd, 0x92f8, 0x6f01, 0x79a6, 0x9b5a, 0x4ea8, 0x4eab, 0x4eac, /* 0x36 */ 0x4f9b, 0x4fa0, 0x50d1, 0x5147, 0x7af6, 0x5171, 0x51f6, 0x5354, 0x5321, 0x537f, 0x53eb, 0x55ac, 0x5883, 0x5ce1, 0x5f37, 0x5f4a, 0x602f, 0x6050, 0x606d, 0x631f, 0x6559, 0x6a4b, 0x6cc1, 0x72c2, 0x72ed, 0x77ef, 0x80f8, 0x8105, 0x8208, 0x854e, 0x90f7, 0x93e1, 0x97ff, 0x9957, 0x9a5a, 0x4ef0, 0x51dd, 0x5c2d, 0x6681, 0x696d, 0x5c40, 0x66f2, 0x6975, 0x7389, 0x6850, 0x7c81, 0x50c5, 0x52e4, 0x5747, 0x5dfe, 0x9326, 0x65a4, 0x6b23, 0x6b3d, 0x7434, 0x7981, 0x79bd, 0x7b4b, 0x7dca, 0x82b9, 0x83cc, 0x887f, 0x895f, 0x8b39, 0x8fd1, 0x91d1, 0x541f, 0x9280, 0x4e5d, 0x5036, 0x53e5, 0x533a, 0x72d7, 0x7396, 0x77e9, 0x82e6, 0x8eaf, 0x99c6, 0x99c8, 0x99d2, 0x5177, 0x611a, 0x865e, 0x55b0, 0x7a7a, 0x5076, 0x5bd3, 0x9047, 0x9685, 0x4e32, 0x6adb, 0x91e7, 0x5c51, 0x5c48, /* 0x37 */ 0x6398, 0x7a9f, 0x6c93, 0x9774, 0x8f61, 0x7aaa, 0x718a, 0x9688, 0x7c82, 0x6817, 0x7e70, 0x6851, 0x936c, 0x52f2, 0x541b, 0x85ab, 0x8a13, 0x7fa4, 0x8ecd, 0x90e1, 0x5366, 0x8888, 0x7941, 0x4fc2, 0x50be, 0x5211, 0x5144, 0x5553, 0x572d, 0x73ea, 0x578b, 0x5951, 0x5f62, 0x5f84, 0x6075, 0x6176, 0x6167, 0x61a9, 0x63b2, 0x643a, 0x656c, 0x666f, 0x6842, 0x6e13, 0x7566, 0x7a3d, 0x7cfb, 0x7d4c, 0x7d99, 0x7e4b, 0x7f6b, 0x830e, 0x834a, 0x86cd, 0x8a08, 0x8a63, 0x8b66, 0x8efd, 0x981a, 0x9d8f, 0x82b8, 0x8fce, 0x9be8, 0x5287, 0x621f, 0x6483, 0x6fc0, 0x9699, 0x6841, 0x5091, 0x6b20, 0x6c7a, 0x6f54, 0x7a74, 0x7d50, 0x8840, 0x8a23, 0x6708, 0x4ef6, 0x5039, 0x5026, 0x5065, 0x517c, 0x5238, 0x5263, 0x55a7, 0x570f, 0x5805, 0x5acc, 0x5efa, 0x61b2, 0x61f8, 0x62f3, 0x6372, /* 0x38 */ 0x691c, 0x6a29, 0x727d, 0x72ac, 0x732e, 0x7814, 0x786f, 0x7d79, 0x770c, 0x80a9, 0x898b, 0x8b19, 0x8ce2, 0x8ed2, 0x9063, 0x9375, 0x967a, 0x9855, 0x9a13, 0x9e78, 0x5143, 0x539f, 0x53b3, 0x5e7b, 0x5f26, 0x6e1b, 0x6e90, 0x7384, 0x73fe, 0x7d43, 0x8237, 0x8a00, 0x8afa, 0x9650, 0x4e4e, 0x500b, 0x53e4, 0x547c, 0x56fa, 0x59d1, 0x5b64, 0x5df1, 0x5eab, 0x5f27, 0x6238, 0x6545, 0x67af, 0x6e56, 0x72d0, 0x7cca, 0x88b4, 0x80a1, 0x80e1, 0x83f0, 0x864e, 0x8a87, 0x8de8, 0x9237, 0x96c7, 0x9867, 0x9f13, 0x4e94, 0x4e92, 0x4f0d, 0x5348, 0x5449, 0x543e, 0x5a2f, 0x5f8c, 0x5fa1, 0x609f, 0x68a7, 0x6a8e, 0x745a, 0x7881, 0x8a9e, 0x8aa4, 0x8b77, 0x9190, 0x4e5e, 0x9bc9, 0x4ea4, 0x4f7c, 0x4faf, 0x5019, 0x5016, 0x5149, 0x516c, 0x529f, 0x52b9, 0x52fe, 0x539a, 0x53e3, 0x5411, /* 0x39 */ 0x540e, 0x5589, 0x5751, 0x57a2, 0x597d, 0x5b54, 0x5b5d, 0x5b8f, 0x5de5, 0x5de7, 0x5df7, 0x5e78, 0x5e83, 0x5e9a, 0x5eb7, 0x5f18, 0x6052, 0x614c, 0x6297, 0x62d8, 0x63a7, 0x653b, 0x6602, 0x6643, 0x66f4, 0x676d, 0x6821, 0x6897, 0x69cb, 0x6c5f, 0x6d2a, 0x6d69, 0x6e2f, 0x6e9d, 0x7532, 0x7687, 0x786c, 0x7a3f, 0x7ce0, 0x7d05, 0x7d18, 0x7d5e, 0x7db1, 0x8015, 0x8003, 0x80af, 0x80b1, 0x8154, 0x818f, 0x822a, 0x8352, 0x884c, 0x8861, 0x8b1b, 0x8ca2, 0x8cfc, 0x90ca, 0x9175, 0x9271, 0x783f, 0x92fc, 0x95a4, 0x964d, 0x9805, 0x9999, 0x9ad8, 0x9d3b, 0x525b, 0x52ab, 0x53f7, 0x5408, 0x58d5, 0x62f7, 0x6fe0, 0x8c6a, 0x8f5f, 0x9eb9, 0x514b, 0x523b, 0x544a, 0x56fd, 0x7a40, 0x9177, 0x9d60, 0x9ed2, 0x7344, 0x6f09, 0x8170, 0x7511, 0x5ffd, 0x60da, 0x9aa8, 0x72db, 0x8fbc, /* 0x3a */ 0x6b64, 0x9803, 0x4eca, 0x56f0, 0x5764, 0x58be, 0x5a5a, 0x6068, 0x61c7, 0x660f, 0x6606, 0x6839, 0x68b1, 0x6df7, 0x75d5, 0x7d3a, 0x826e, 0x9b42, 0x4e9b, 0x4f50, 0x53c9, 0x5506, 0x5d6f, 0x5de6, 0x5dee, 0x67fb, 0x6c99, 0x7473, 0x7802, 0x8a50, 0x9396, 0x88df, 0x5750, 0x5ea7, 0x632b, 0x50b5, 0x50ac, 0x518d, 0x6700, 0x54c9, 0x585e, 0x59bb, 0x5bb0, 0x5f69, 0x624d, 0x63a1, 0x683d, 0x6b73, 0x6e08, 0x707d, 0x91c7, 0x7280, 0x7815, 0x7826, 0x796d, 0x658e, 0x7d30, 0x83dc, 0x88c1, 0x8f09, 0x969b, 0x5264, 0x5728, 0x6750, 0x7f6a, 0x8ca1, 0x51b4, 0x5742, 0x962a, 0x583a, 0x698a, 0x80b4, 0x54b2, 0x5d0e, 0x57fc, 0x7895, 0x9dfa, 0x4f5c, 0x524a, 0x548b, 0x643e, 0x6628, 0x6714, 0x67f5, 0x7a84, 0x7b56, 0x7d22, 0x932f, 0x685c, 0x9bad, 0x7b39, 0x5319, 0x518a, 0x5237, /* 0x3b */ 0x5bdf, 0x62f6, 0x64ae, 0x64e6, 0x672d, 0x6bba, 0x85a9, 0x96d1, 0x7690, 0x9bd6, 0x634c, 0x9306, 0x9bab, 0x76bf, 0x6652, 0x4e09, 0x5098, 0x53c2, 0x5c71, 0x60e8, 0x6492, 0x6563, 0x685f, 0x71e6, 0x73ca, 0x7523, 0x7b97, 0x7e82, 0x8695, 0x8b83, 0x8cdb, 0x9178, 0x9910, 0x65ac, 0x66ab, 0x6b8b, 0x4ed5, 0x4ed4, 0x4f3a, 0x4f7f, 0x523a, 0x53f8, 0x53f2, 0x55e3, 0x56db, 0x58eb, 0x59cb, 0x59c9, 0x59ff, 0x5b50, 0x5c4d, 0x5e02, 0x5e2b, 0x5fd7, 0x601d, 0x6307, 0x652f, 0x5b5c, 0x65af, 0x65bd, 0x65e8, 0x679d, 0x6b62, 0x6b7b, 0x6c0f, 0x7345, 0x7949, 0x79c1, 0x7cf8, 0x7d19, 0x7d2b, 0x80a2, 0x8102, 0x81f3, 0x8996, 0x8a5e, 0x8a69, 0x8a66, 0x8a8c, 0x8aee, 0x8cc7, 0x8cdc, 0x96cc, 0x98fc, 0x6b6f, 0x4e8b, 0x4f3c, 0x4f8d, 0x5150, 0x5b57, 0x5bfa, 0x6148, 0x6301, 0x6642, /* 0x3c */ 0x6b21, 0x6ecb, 0x6cbb, 0x723e, 0x74bd, 0x75d4, 0x78c1, 0x793a, 0x800c, 0x8033, 0x81ea, 0x8494, 0x8f9e, 0x6c50, 0x9e7f, 0x5f0f, 0x8b58, 0x9d2b, 0x7afa, 0x8ef8, 0x5b8d, 0x96eb, 0x4e03, 0x53f1, 0x57f7, 0x5931, 0x5ac9, 0x5ba4, 0x6089, 0x6e7f, 0x6f06, 0x75be, 0x8cea, 0x5b9f, 0x8500, 0x7be0, 0x5072, 0x67f4, 0x829d, 0x5c61, 0x854a, 0x7e1e, 0x820e, 0x5199, 0x5c04, 0x6368, 0x8d66, 0x659c, 0x716e, 0x793e, 0x7d17, 0x8005, 0x8b1d, 0x8eca, 0x906e, 0x86c7, 0x90aa, 0x501f, 0x52fa, 0x5c3a, 0x6753, 0x707c, 0x7235, 0x914c, 0x91c8, 0x932b, 0x82e5, 0x5bc2, 0x5f31, 0x60f9, 0x4e3b, 0x53d6, 0x5b88, 0x624b, 0x6731, 0x6b8a, 0x72e9, 0x73e0, 0x7a2e, 0x816b, 0x8da3, 0x9152, 0x9996, 0x5112, 0x53d7, 0x546a, 0x5bff, 0x6388, 0x6a39, 0x7dac, 0x9700, 0x56da, 0x53ce, 0x5468, /* 0x3d */ 0x5b97, 0x5c31, 0x5dde, 0x4fee, 0x6101, 0x62fe, 0x6d32, 0x79c0, 0x79cb, 0x7d42, 0x7e4d, 0x7fd2, 0x81ed, 0x821f, 0x8490, 0x8846, 0x8972, 0x8b90, 0x8e74, 0x8f2f, 0x9031, 0x914b, 0x916c, 0x96c6, 0x919c, 0x4ec0, 0x4f4f, 0x5145, 0x5341, 0x5f93, 0x620e, 0x67d4, 0x6c41, 0x6e0b, 0x7363, 0x7e26, 0x91cd, 0x9283, 0x53d4, 0x5919, 0x5bbf, 0x6dd1, 0x795d, 0x7e2e, 0x7c9b, 0x587e, 0x719f, 0x51fa, 0x8853, 0x8ff0, 0x4fca, 0x5cfb, 0x6625, 0x77ac, 0x7ae3, 0x821c, 0x99ff, 0x51c6, 0x5faa, 0x65ec, 0x696f, 0x6b89, 0x6df3, 0x6e96, 0x6f64, 0x76fe, 0x7d14, 0x5de1, 0x9075, 0x9187, 0x9806, 0x51e6, 0x521d, 0x6240, 0x6691, 0x66d9, 0x6e1a, 0x5eb6, 0x7dd2, 0x7f72, 0x66f8, 0x85af, 0x85f7, 0x8af8, 0x52a9, 0x53d9, 0x5973, 0x5e8f, 0x5f90, 0x6055, 0x92e4, 0x9664, 0x50b7, 0x511f, /* 0x3e */ 0x52dd, 0x5320, 0x5347, 0x53ec, 0x54e8, 0x5546, 0x5531, 0x5617, 0x5968, 0x59be, 0x5a3c, 0x5bb5, 0x5c06, 0x5c0f, 0x5c11, 0x5c1a, 0x5e84, 0x5e8a, 0x5ee0, 0x5f70, 0x627f, 0x6284, 0x62db, 0x638c, 0x6377, 0x6607, 0x660c, 0x662d, 0x6676, 0x677e, 0x68a2, 0x6a1f, 0x6a35, 0x6cbc, 0x6d88, 0x6e09, 0x6e58, 0x713c, 0x7126, 0x7167, 0x75c7, 0x7701, 0x785d, 0x7901, 0x7965, 0x79f0, 0x7ae0, 0x7b11, 0x7ca7, 0x7d39, 0x8096, 0x83d6, 0x848b, 0x8549, 0x885d, 0x88f3, 0x8a1f, 0x8a3c, 0x8a54, 0x8a73, 0x8c61, 0x8cde, 0x91a4, 0x9266, 0x937e, 0x9418, 0x969c, 0x9798, 0x4e0a, 0x4e08, 0x4e1e, 0x4e57, 0x5197, 0x5270, 0x57ce, 0x5834, 0x58cc, 0x5b22, 0x5e38, 0x60c5, 0x64fe, 0x6761, 0x6756, 0x6d44, 0x72b6, 0x7573, 0x7a63, 0x84b8, 0x8b72, 0x91b8, 0x9320, 0x5631, 0x57f4, 0x98fe, /* 0x3f */ 0x62ed, 0x690d, 0x6b96, 0x71ed, 0x7e54, 0x8077, 0x8272, 0x89e6, 0x98df, 0x8755, 0x8fb1, 0x5c3b, 0x4f38, 0x4fe1, 0x4fb5, 0x5507, 0x5a20, 0x5bdd, 0x5be9, 0x5fc3, 0x614e, 0x632f, 0x65b0, 0x664b, 0x68ee, 0x699b, 0x6d78, 0x6df1, 0x7533, 0x75b9, 0x771f, 0x795e, 0x79e6, 0x7d33, 0x81e3, 0x82af, 0x85aa, 0x89aa, 0x8a3a, 0x8eab, 0x8f9b, 0x9032, 0x91dd, 0x9707, 0x4eba, 0x4ec1, 0x5203, 0x5875, 0x58ec, 0x5c0b, 0x751a, 0x5c3d, 0x814e, 0x8a0a, 0x8fc5, 0x9663, 0x976d, 0x7b25, 0x8acf, 0x9808, 0x9162, 0x56f3, 0x53a8, 0x9017, 0x5439, 0x5782, 0x5e25, 0x63a8, 0x6c34, 0x708a, 0x7761, 0x7c8b, 0x7fe0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968f, 0x745e, 0x9ac4, 0x5d07, 0x5d69, 0x6570, 0x67a2, 0x8da8, 0x96db, 0x636e, 0x6749, 0x6919, 0x83c5, 0x9817, 0x96c0, 0x88fe, /* 0x40 */ 0x6f84, 0x647a, 0x5bf8, 0x4e16, 0x702c, 0x755d, 0x662f, 0x51c4, 0x5236, 0x52e2, 0x59d3, 0x5f81, 0x6027, 0x6210, 0x653f, 0x6574, 0x661f, 0x6674, 0x68f2, 0x6816, 0x6b63, 0x6e05, 0x7272, 0x751f, 0x76db, 0x7cbe, 0x8056, 0x58f0, 0x88fd, 0x897f, 0x8aa0, 0x8a93, 0x8acb, 0x901d, 0x9192, 0x9752, 0x9759, 0x6589, 0x7a0e, 0x8106, 0x96bb, 0x5e2d, 0x60dc, 0x621a, 0x65a5, 0x6614, 0x6790, 0x77f3, 0x7a4d, 0x7c4d, 0x7e3e, 0x810a, 0x8cac, 0x8d64, 0x8de1, 0x8e5f, 0x78a9, 0x5207, 0x62d9, 0x63a5, 0x6442, 0x6298, 0x8a2d, 0x7a83, 0x7bc0, 0x8aac, 0x96ea, 0x7d76, 0x820c, 0x8749, 0x4ed9, 0x5148, 0x5343, 0x5360, 0x5ba3, 0x5c02, 0x5c16, 0x5ddd, 0x6226, 0x6247, 0x64b0, 0x6813, 0x6834, 0x6cc9, 0x6d45, 0x6d17, 0x67d3, 0x6f5c, 0x714e, 0x717d, 0x65cb, 0x7a7f, 0x7bad, 0x7dda, /* 0x41 */ 0x7e4a, 0x7fa8, 0x817a, 0x821b, 0x8239, 0x85a6, 0x8a6e, 0x8cce, 0x8df5, 0x9078, 0x9077, 0x92ad, 0x9291, 0x9583, 0x9bae, 0x524d, 0x5584, 0x6f38, 0x7136, 0x5168, 0x7985, 0x7e55, 0x81b3, 0x7cce, 0x564c, 0x5851, 0x5ca8, 0x63aa, 0x66fe, 0x66fd, 0x695a, 0x72d9, 0x758f, 0x758e, 0x790e, 0x7956, 0x79df, 0x7c97, 0x7d20, 0x7d44, 0x8607, 0x8a34, 0x963b, 0x9061, 0x9f20, 0x50e7, 0x5275, 0x53cc, 0x53e2, 0x5009, 0x55aa, 0x58ee, 0x594f, 0x723d, 0x5b8b, 0x5c64, 0x531d, 0x60e3, 0x60f3, 0x635c, 0x6383, 0x633f, 0x63bb, 0x64cd, 0x65e9, 0x66f9, 0x5de3, 0x69cd, 0x69fd, 0x6f15, 0x71e5, 0x4e89, 0x75e9, 0x76f8, 0x7a93, 0x7cdf, 0x7dcf, 0x7d9c, 0x8061, 0x8349, 0x8358, 0x846c, 0x84bc, 0x85fb, 0x88c5, 0x8d70, 0x9001, 0x906d, 0x9397, 0x971c, 0x9a12, 0x50cf, 0x5897, 0x618e, /* 0x42 */ 0x81d3, 0x8535, 0x8d08, 0x9020, 0x4fc3, 0x5074, 0x5247, 0x5373, 0x606f, 0x6349, 0x675f, 0x6e2c, 0x8db3, 0x901f, 0x4fd7, 0x5c5e, 0x8cca, 0x65cf, 0x7d9a, 0x5352, 0x8896, 0x5176, 0x63c3, 0x5b58, 0x5b6b, 0x5c0a, 0x640d, 0x6751, 0x905c, 0x4ed6, 0x591a, 0x592a, 0x6c70, 0x8a51, 0x553e, 0x5815, 0x59a5, 0x60f0, 0x6253, 0x67c1, 0x8235, 0x6955, 0x9640, 0x99c4, 0x9a28, 0x4f53, 0x5806, 0x5bfe, 0x8010, 0x5cb1, 0x5e2f, 0x5f85, 0x6020, 0x614b, 0x6234, 0x66ff, 0x6cf0, 0x6ede, 0x80ce, 0x817f, 0x82d4, 0x888b, 0x8cb8, 0x9000, 0x902e, 0x968a, 0x9edb, 0x9bdb, 0x4ee3, 0x53f0, 0x5927, 0x7b2c, 0x918d, 0x984c, 0x9df9, 0x6edd, 0x7027, 0x5353, 0x5544, 0x5b85, 0x6258, 0x629e, 0x62d3, 0x6ca2, 0x6fef, 0x7422, 0x8a17, 0x9438, 0x6fc1, 0x8afe, 0x8338, 0x51e7, 0x86f8, 0x53ea, /* 0x43 */ 0x53e9, 0x4f46, 0x9054, 0x8fb0, 0x596a, 0x8131, 0x5dfd, 0x7aea, 0x8fbf, 0x68da, 0x8c37, 0x72f8, 0x9c48, 0x6a3d, 0x8ab0, 0x4e39, 0x5358, 0x5606, 0x5766, 0x62c5, 0x63a2, 0x65e6, 0x6b4e, 0x6de1, 0x6e5b, 0x70ad, 0x77ed, 0x7aef, 0x7baa, 0x7dbb, 0x803d, 0x80c6, 0x86cb, 0x8a95, 0x935b, 0x56e3, 0x58c7, 0x5f3e, 0x65ad, 0x6696, 0x6a80, 0x6bb5, 0x7537, 0x8ac7, 0x5024, 0x77e5, 0x5730, 0x5f1b, 0x6065, 0x667a, 0x6c60, 0x75f4, 0x7a1a, 0x7f6e, 0x81f4, 0x8718, 0x9045, 0x99b3, 0x7bc9, 0x755c, 0x7af9, 0x7b51, 0x84c4, 0x9010, 0x79e9, 0x7a92, 0x8336, 0x5ae1, 0x7740, 0x4e2d, 0x4ef2, 0x5b99, 0x5fe0, 0x62bd, 0x663c, 0x67f1, 0x6ce8, 0x866b, 0x8877, 0x8a3b, 0x914e, 0x92f3, 0x99d0, 0x6a17, 0x7026, 0x732a, 0x82e7, 0x8457, 0x8caf, 0x4e01, 0x5146, 0x51cb, 0x558b, 0x5bf5, /* 0x44 */ 0x5e16, 0x5e33, 0x5e81, 0x5f14, 0x5f35, 0x5f6b, 0x5fb4, 0x61f2, 0x6311, 0x66a2, 0x671d, 0x6f6e, 0x7252, 0x753a, 0x773a, 0x8074, 0x8139, 0x8178, 0x8776, 0x8abf, 0x8adc, 0x8d85, 0x8df3, 0x929a, 0x9577, 0x9802, 0x9ce5, 0x52c5, 0x6357, 0x76f4, 0x6715, 0x6c88, 0x73cd, 0x8cc3, 0x93ae, 0x9673, 0x6d25, 0x589c, 0x690e, 0x69cc, 0x8ffd, 0x939a, 0x75db, 0x901a, 0x585a, 0x6802, 0x63b4, 0x69fb, 0x4f43, 0x6f2c, 0x67d8, 0x8fbb, 0x8526, 0x7db4, 0x9354, 0x693f, 0x6f70, 0x576a, 0x58f7, 0x5b2c, 0x7d2c, 0x722a, 0x540a, 0x91e3, 0x9db4, 0x4ead, 0x4f4e, 0x505c, 0x5075, 0x5243, 0x8c9e, 0x5448, 0x5824, 0x5b9a, 0x5e1d, 0x5e95, 0x5ead, 0x5ef7, 0x5f1f, 0x608c, 0x62b5, 0x633a, 0x63d0, 0x68af, 0x6c40, 0x7887, 0x798e, 0x7a0b, 0x7de0, 0x8247, 0x8a02, 0x8ae6, 0x8e44, 0x9013, /* 0x45 */ 0x90b8, 0x912d, 0x91d8, 0x9f0e, 0x6ce5, 0x6458, 0x64e2, 0x6575, 0x6ef4, 0x7684, 0x7b1b, 0x9069, 0x93d1, 0x6eba, 0x54f2, 0x5fb9, 0x64a4, 0x8f4d, 0x8fed, 0x9244, 0x5178, 0x586b, 0x5929, 0x5c55, 0x5e97, 0x6dfb, 0x7e8f, 0x751c, 0x8cbc, 0x8ee2, 0x985b, 0x70b9, 0x4f1d, 0x6bbf, 0x6fb1, 0x7530, 0x96fb, 0x514e, 0x5410, 0x5835, 0x5857, 0x59ac, 0x5c60, 0x5f92, 0x6597, 0x675c, 0x6e21, 0x767b, 0x83df, 0x8ced, 0x9014, 0x90fd, 0x934d, 0x7825, 0x783a, 0x52aa, 0x5ea6, 0x571f, 0x5974, 0x6012, 0x5012, 0x515a, 0x51ac, 0x51cd, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5b95, 0x5cf6, 0x5d8b, 0x60bc, 0x6295, 0x642d, 0x6771, 0x6843, 0x68bc, 0x68df, 0x76d7, 0x6dd8, 0x6e6f, 0x6d9b, 0x706f, 0x71c8, 0x5f53, 0x75d8, 0x7977, 0x7b49, 0x7b54, 0x7b52, 0x7cd6, 0x7d71, 0x5230, /* 0x46 */ 0x8463, 0x8569, 0x85e4, 0x8a0e, 0x8b04, 0x8c46, 0x8e0f, 0x9003, 0x900f, 0x9419, 0x9676, 0x982d, 0x9a30, 0x95d8, 0x50cd, 0x52d5, 0x540c, 0x5802, 0x5c0e, 0x61a7, 0x649e, 0x6d1e, 0x77b3, 0x7ae5, 0x80f4, 0x8404, 0x9053, 0x9285, 0x5ce0, 0x9d07, 0x533f, 0x5f97, 0x5fb3, 0x6d9c, 0x7279, 0x7763, 0x79bf, 0x7be4, 0x6bd2, 0x72ec, 0x8aad, 0x6803, 0x6a61, 0x51f8, 0x7a81, 0x6934, 0x5c4a, 0x9cf6, 0x82eb, 0x5bc5, 0x9149, 0x701e, 0x5678, 0x5c6f, 0x60c7, 0x6566, 0x6c8c, 0x8c5a, 0x9041, 0x9813, 0x5451, 0x66c7, 0x920d, 0x5948, 0x90a3, 0x5185, 0x4e4d, 0x51ea, 0x8599, 0x8b0e, 0x7058, 0x637a, 0x934b, 0x6962, 0x99b4, 0x7e04, 0x7577, 0x5357, 0x6960, 0x8edf, 0x96e3, 0x6c5d, 0x4e8c, 0x5c3c, 0x5f10, 0x8fe9, 0x5302, 0x8cd1, 0x8089, 0x8679, 0x5eff, 0x65e5, 0x4e73, 0x5165, /* 0x47 */ 0x5982, 0x5c3f, 0x97ee, 0x4efb, 0x598a, 0x5fcd, 0x8a8d, 0x6fe1, 0x79b0, 0x7962, 0x5be7, 0x8471, 0x732b, 0x71b1, 0x5e74, 0x5ff5, 0x637b, 0x649a, 0x71c3, 0x7c98, 0x4e43, 0x5efc, 0x4e4b, 0x57dc, 0x56a2, 0x60a9, 0x6fc3, 0x7d0d, 0x80fd, 0x8133, 0x81bf, 0x8fb2, 0x8997, 0x86a4, 0x5df4, 0x628a, 0x64ad, 0x8987, 0x6777, 0x6ce2, 0x6d3e, 0x7436, 0x7834, 0x5a46, 0x7f75, 0x82ad, 0x99ac, 0x4ff3, 0x5ec3, 0x62dd, 0x6392, 0x6557, 0x676f, 0x76c3, 0x724c, 0x80cc, 0x80ba, 0x8f29, 0x914d, 0x500d, 0x57f9, 0x5a92, 0x6885, 0x6973, 0x7164, 0x72fd, 0x8cb7, 0x58f2, 0x8ce0, 0x966a, 0x9019, 0x877f, 0x79e4, 0x77e7, 0x8429, 0x4f2f, 0x5265, 0x535a, 0x62cd, 0x67cf, 0x6cca, 0x767d, 0x7b94, 0x7c95, 0x8236, 0x8584, 0x8feb, 0x66dd, 0x6f20, 0x7206, 0x7e1b, 0x83ab, 0x99c1, 0x9ea6, /* 0x48 */ 0x51fd, 0x7bb1, 0x7872, 0x7bb8, 0x8087, 0x7b48, 0x6ae8, 0x5e61, 0x808c, 0x7551, 0x7560, 0x516b, 0x9262, 0x6e8c, 0x767a, 0x9197, 0x9aea, 0x4f10, 0x7f70, 0x629c, 0x7b4f, 0x95a5, 0x9ce9, 0x567a, 0x5859, 0x86e4, 0x96bc, 0x4f34, 0x5224, 0x534a, 0x53cd, 0x53db, 0x5e06, 0x642c, 0x6591, 0x677f, 0x6c3e, 0x6c4e, 0x7248, 0x72af, 0x73ed, 0x7554, 0x7e41, 0x822c, 0x85e9, 0x8ca9, 0x7bc4, 0x91c6, 0x7169, 0x9812, 0x98ef, 0x633d, 0x6669, 0x756a, 0x76e4, 0x78d0, 0x8543, 0x86ee, 0x532a, 0x5351, 0x5426, 0x5983, 0x5e87, 0x5f7c, 0x60b2, 0x6249, 0x6279, 0x62ab, 0x6590, 0x6bd4, 0x6ccc, 0x75b2, 0x76ae, 0x7891, 0x79d8, 0x7dcb, 0x7f77, 0x80a5, 0x88ab, 0x8ab9, 0x8cbb, 0x907f, 0x975e, 0x98db, 0x6a0b, 0x7c38, 0x5099, 0x5c3e, 0x5fae, 0x6787, 0x6bd8, 0x7435, 0x7709, 0x7f8e, /* 0x49 */ 0x9f3b, 0x67ca, 0x7a17, 0x5339, 0x758b, 0x9aed, 0x5f66, 0x819d, 0x83f1, 0x8098, 0x5f3c, 0x5fc5, 0x7562, 0x7b46, 0x903c, 0x6867, 0x59eb, 0x5a9b, 0x7d10, 0x767e, 0x8b2c, 0x4ff5, 0x5f6a, 0x6a19, 0x6c37, 0x6f02, 0x74e2, 0x7968, 0x8868, 0x8a55, 0x8c79, 0x5edf, 0x63cf, 0x75c5, 0x79d2, 0x82d7, 0x9328, 0x92f2, 0x849c, 0x86ed, 0x9c2d, 0x54c1, 0x5f6c, 0x658c, 0x6d5c, 0x7015, 0x8ca7, 0x8cd3, 0x983b, 0x654f, 0x74f6, 0x4e0d, 0x4ed8, 0x57e0, 0x592b, 0x5a66, 0x5bcc, 0x51a8, 0x5e03, 0x5e9c, 0x6016, 0x6276, 0x6577, 0x65a7, 0x666e, 0x6d6e, 0x7236, 0x7b26, 0x8150, 0x819a, 0x8299, 0x8b5c, 0x8ca0, 0x8ce6, 0x8d74, 0x961c, 0x9644, 0x4fae, 0x64ab, 0x6b66, 0x821e, 0x8461, 0x856a, 0x90e8, 0x5c01, 0x6953, 0x98a8, 0x847a, 0x8557, 0x4f0f, 0x526f, 0x5fa9, 0x5e45, 0x670d, /* 0x4a */ 0x798f, 0x8179, 0x8907, 0x8986, 0x6df5, 0x5f17, 0x6255, 0x6cb8, 0x4ecf, 0x7269, 0x9b92, 0x5206, 0x543b, 0x5674, 0x58b3, 0x61a4, 0x626e, 0x711a, 0x596e, 0x7c89, 0x7cde, 0x7d1b, 0x96f0, 0x6587, 0x805e, 0x4e19, 0x4f75, 0x5175, 0x5840, 0x5e63, 0x5e73, 0x5f0a, 0x67c4, 0x4e26, 0x853d, 0x9589, 0x965b, 0x7c73, 0x9801, 0x50fb, 0x58c1, 0x7656, 0x78a7, 0x5225, 0x77a5, 0x8511, 0x7b86, 0x504f, 0x5909, 0x7247, 0x7bc7, 0x7de8, 0x8fba, 0x8fd4, 0x904d, 0x4fbf, 0x52c9, 0x5a29, 0x5f01, 0x97ad, 0x4fdd, 0x8217, 0x92ea, 0x5703, 0x6355, 0x6b69, 0x752b, 0x88dc, 0x8f14, 0x7a42, 0x52df, 0x5893, 0x6155, 0x620a, 0x66ae, 0x6bcd, 0x7c3f, 0x83e9, 0x5023, 0x4ff8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5b9d, 0x5cf0, 0x5cef, 0x5d29, 0x5e96, 0x62b1, 0x6367, 0x653e, 0x65b9, 0x670b, /* 0x4b */ 0x6cd5, 0x6ce1, 0x70f9, 0x7832, 0x7e2b, 0x80de, 0x82b3, 0x840c, 0x84ec, 0x8702, 0x8912, 0x8a2a, 0x8c4a, 0x90a6, 0x92d2, 0x98fd, 0x9cf3, 0x9d6c, 0x4e4f, 0x4ea1, 0x508d, 0x5256, 0x574a, 0x59a8, 0x5e3d, 0x5fd8, 0x5fd9, 0x623f, 0x66b4, 0x671b, 0x67d0, 0x68d2, 0x5192, 0x7d21, 0x80aa, 0x81a8, 0x8b00, 0x8c8c, 0x8cbf, 0x927e, 0x9632, 0x5420, 0x982c, 0x5317, 0x50d5, 0x535c, 0x58a8, 0x64b2, 0x6734, 0x7267, 0x7766, 0x7a46, 0x91e6, 0x52c3, 0x6ca1, 0x6b86, 0x5800, 0x5e4c, 0x5954, 0x672c, 0x7ffb, 0x51e1, 0x76c6, 0x6469, 0x78e8, 0x9b54, 0x9ebb, 0x57cb, 0x59b9, 0x6627, 0x679a, 0x6bce, 0x54e9, 0x69d9, 0x5e55, 0x819c, 0x6795, 0x9baa, 0x67fe, 0x9c52, 0x685d, 0x4ea6, 0x4fe3, 0x53c8, 0x62b9, 0x672b, 0x6cab, 0x8fc4, 0x4fad, 0x7e6d, 0x9ebf, 0x4e07, 0x6162, 0x6e80, /* 0x4c */ 0x6f2b, 0x8513, 0x5473, 0x672a, 0x9b45, 0x5df3, 0x7b95, 0x5cac, 0x5bc6, 0x871c, 0x6e4a, 0x84d1, 0x7a14, 0x8108, 0x5999, 0x7c8d, 0x6c11, 0x7720, 0x52d9, 0x5922, 0x7121, 0x725f, 0x77db, 0x9727, 0x9d61, 0x690b, 0x5a7f, 0x5a18, 0x51a5, 0x540d, 0x547d, 0x660e, 0x76df, 0x8ff7, 0x9298, 0x9cf4, 0x59ea, 0x725d, 0x6ec5, 0x514d, 0x68c9, 0x7dbf, 0x7dec, 0x9762, 0x9eba, 0x6478, 0x6a21, 0x8302, 0x5984, 0x5b5f, 0x6bdb, 0x731b, 0x76f2, 0x7db2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ed9, 0x76ee, 0x6762, 0x52ff, 0x9905, 0x5c24, 0x623b, 0x7c7e, 0x8cb0, 0x554f, 0x60b6, 0x7d0b, 0x9580, 0x5301, 0x4e5f, 0x51b6, 0x591c, 0x723a, 0x8036, 0x91ce, 0x5f25, 0x77e2, 0x5384, 0x5f79, 0x7d04, 0x85ac, 0x8a33, 0x8e8d, 0x9756, 0x67f3, 0x85ae, 0x9453, 0x6109, 0x6108, 0x6cb9, 0x7652, /* 0x4d */ 0x8aed, 0x8f38, 0x552f, 0x4f51, 0x512a, 0x52c7, 0x53cb, 0x5ba5, 0x5e7d, 0x60a0, 0x6182, 0x63d6, 0x6709, 0x67da, 0x6e67, 0x6d8c, 0x7336, 0x7337, 0x7531, 0x7950, 0x88d5, 0x8a98, 0x904a, 0x9091, 0x90f5, 0x96c4, 0x878d, 0x5915, 0x4e88, 0x4f59, 0x4e0e, 0x8a89, 0x8f3f, 0x9810, 0x50ad, 0x5e7c, 0x5996, 0x5bb9, 0x5eb8, 0x63da, 0x63fa, 0x64c1, 0x66dc, 0x694a, 0x69d8, 0x6d0b, 0x6eb6, 0x7194, 0x7528, 0x7aaf, 0x7f8a, 0x8000, 0x8449, 0x84c9, 0x8981, 0x8b21, 0x8e0a, 0x9065, 0x967d, 0x990a, 0x617e, 0x6291, 0x6b32, 0x6c83, 0x6d74, 0x7fcc, 0x7ffc, 0x6dc0, 0x7f85, 0x87ba, 0x88f8, 0x6765, 0x83b1, 0x983c, 0x96f7, 0x6d1b, 0x7d61, 0x843d, 0x916a, 0x4e71, 0x5375, 0x5d50, 0x6b04, 0x6feb, 0x85cd, 0x862d, 0x89a7, 0x5229, 0x540f, 0x5c65, 0x674e, 0x68a8, 0x7406, 0x7483, /* 0x4e */ 0x75e2, 0x88cf, 0x88e1, 0x91cc, 0x96e2, 0x9678, 0x5f8b, 0x7387, 0x7acb, 0x844e, 0x63a0, 0x7565, 0x5289, 0x6d41, 0x6e9c, 0x7409, 0x7559, 0x786b, 0x7c92, 0x9686, 0x7adc, 0x9f8d, 0x4fb6, 0x616e, 0x65c5, 0x865c, 0x4e86, 0x4eae, 0x50da, 0x4e21, 0x51cc, 0x5bee, 0x6599, 0x6881, 0x6dbc, 0x731f, 0x7642, 0x77ad, 0x7a1c, 0x7ce7, 0x826f, 0x8ad2, 0x907c, 0x91cf, 0x9675, 0x9818, 0x529b, 0x7dd1, 0x502b, 0x5398, 0x6797, 0x6dcb, 0x71d0, 0x7433, 0x81e8, 0x8f2a, 0x96a3, 0x9c57, 0x9e9f, 0x7460, 0x5841, 0x6d99, 0x7d2f, 0x985e, 0x4ee4, 0x4f36, 0x4f8b, 0x51b7, 0x52b1, 0x5dba, 0x601c, 0x73b2, 0x793c, 0x82d3, 0x9234, 0x96b7, 0x96f6, 0x970a, 0x9e97, 0x9f62, 0x66a6, 0x6b74, 0x5217, 0x52a3, 0x70c8, 0x88c2, 0x5ec9, 0x604b, 0x6190, 0x6f23, 0x7149, 0x7c3e, 0x7df4, 0x806f, /* 0x4f */ 0x84ee, 0x9023, 0x932c, 0x5442, 0x9b6f, 0x6ad3, 0x7089, 0x8cc2, 0x8def, 0x9732, 0x52b4, 0x5a41, 0x5eca, 0x5f04, 0x6717, 0x697c, 0x6994, 0x6d6a, 0x6f0f, 0x7262, 0x72fc, 0x7bed, 0x8001, 0x807e, 0x874b, 0x90ce, 0x516d, 0x9e93, 0x7984, 0x808b, 0x9332, 0x8ad6, 0x502d, 0x548c, 0x8a71, 0x6b6a, 0x8cc4, 0x8107, 0x60d1, 0x67a0, 0x9df2, 0x4e99, 0x4e98, 0x9c10, 0x8a6b, 0x85c1, 0x8568, 0x6900, 0x6e7e, 0x7897, 0x8155, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x50 */ 0x5f0c, 0x4e10, 0x4e15, 0x4e2a, 0x4e31, 0x4e36, 0x4e3c, 0x4e3f, 0x4e42, 0x4e56, 0x4e58, 0x4e82, 0x4e85, 0x8c6b, 0x4e8a, 0x8212, 0x5f0d, 0x4e8e, 0x4e9e, 0x4e9f, 0x4ea0, 0x4ea2, 0x4eb0, 0x4eb3, 0x4eb6, 0x4ece, 0x4ecd, 0x4ec4, 0x4ec6, 0x4ec2, 0x4ed7, 0x4ede, 0x4eed, 0x4edf, 0x4ef7, 0x4f09, 0x4f5a, 0x4f30, 0x4f5b, 0x4f5d, 0x4f57, 0x4f47, 0x4f76, 0x4f88, 0x4f8f, 0x4f98, 0x4f7b, 0x4f69, 0x4f70, 0x4f91, 0x4f6f, 0x4f86, 0x4f96, 0x5118, 0x4fd4, 0x4fdf, 0x4fce, 0x4fd8, 0x4fdb, 0x4fd1, 0x4fda, 0x4fd0, 0x4fe4, 0x4fe5, 0x501a, 0x5028, 0x5014, 0x502a, 0x5025, 0x5005, 0x4f1c, 0x4ff6, 0x5021, 0x5029, 0x502c, 0x4ffe, 0x4fef, 0x5011, 0x5006, 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505a, 0x5056, 0x506c, 0x5078, 0x5080, 0x509a, 0x5085, 0x50b4, 0x50b2, /* 0x51 */ 0x50c9, 0x50ca, 0x50b3, 0x50c2, 0x50d6, 0x50de, 0x50e5, 0x50ed, 0x50e3, 0x50ee, 0x50f9, 0x50f5, 0x5109, 0x5101, 0x5102, 0x5116, 0x5115, 0x5114, 0x511a, 0x5121, 0x513a, 0x5137, 0x513c, 0x513b, 0x513f, 0x5140, 0x5152, 0x514c, 0x5154, 0x5162, 0x7af8, 0x5169, 0x516a, 0x516e, 0x5180, 0x5182, 0x56d8, 0x518c, 0x5189, 0x518f, 0x5191, 0x5193, 0x5195, 0x5196, 0x51a4, 0x51a6, 0x51a2, 0x51a9, 0x51aa, 0x51ab, 0x51b3, 0x51b1, 0x51b2, 0x51b0, 0x51b5, 0x51bd, 0x51c5, 0x51c9, 0x51db, 0x51e0, 0x8655, 0x51e9, 0x51ed, 0x51f0, 0x51f5, 0x51fe, 0x5204, 0x520b, 0x5214, 0x520e, 0x5227, 0x522a, 0x522e, 0x5233, 0x5239, 0x524f, 0x5244, 0x524b, 0x524c, 0x525e, 0x5254, 0x526a, 0x5274, 0x5269, 0x5273, 0x527f, 0x527d, 0x528d, 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8fa8, /* 0x52 */ 0x8fa7, 0x52ac, 0x52ad, 0x52bc, 0x52b5, 0x52c1, 0x52cd, 0x52d7, 0x52de, 0x52e3, 0x52e6, 0x98ed, 0x52e0, 0x52f3, 0x52f5, 0x52f8, 0x52f9, 0x5306, 0x5308, 0x7538, 0x530d, 0x5310, 0x530f, 0x5315, 0x531a, 0x5323, 0x532f, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, 0x4e17, 0x5349, 0x534d, 0x51d6, 0x535e, 0x5369, 0x536e, 0x5918, 0x537b, 0x5377, 0x5382, 0x5396, 0x53a0, 0x53a6, 0x53a5, 0x53ae, 0x53b0, 0x53b6, 0x53c3, 0x7c12, 0x96d9, 0x53df, 0x66fc, 0x71ee, 0x53ee, 0x53e8, 0x53ed, 0x53fa, 0x5401, 0x543d, 0x5440, 0x542c, 0x542d, 0x543c, 0x542e, 0x5436, 0x5429, 0x541d, 0x544e, 0x548f, 0x5475, 0x548e, 0x545f, 0x5471, 0x5477, 0x5470, 0x5492, 0x547b, 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54c7, 0x54a2, 0x54b8, 0x54a5, 0x54ac, 0x54c4, 0x54c8, 0x54a8, /* 0x53 */ 0x54ab, 0x54c2, 0x54a4, 0x54be, 0x54bc, 0x54d8, 0x54e5, 0x54e6, 0x550f, 0x5514, 0x54fd, 0x54ee, 0x54ed, 0x54fa, 0x54e2, 0x5539, 0x5540, 0x5563, 0x554c, 0x552e, 0x555c, 0x5545, 0x5556, 0x5557, 0x5538, 0x5533, 0x555d, 0x5599, 0x5580, 0x54af, 0x558a, 0x559f, 0x557b, 0x557e, 0x5598, 0x559e, 0x55ae, 0x557c, 0x5583, 0x55a9, 0x5587, 0x55a8, 0x55da, 0x55c5, 0x55df, 0x55c4, 0x55dc, 0x55e4, 0x55d4, 0x5614, 0x55f7, 0x5616, 0x55fe, 0x55fd, 0x561b, 0x55f9, 0x564e, 0x5650, 0x71df, 0x5634, 0x5636, 0x5632, 0x5638, 0x566b, 0x5664, 0x562f, 0x566c, 0x566a, 0x5686, 0x5680, 0x568a, 0x56a0, 0x5694, 0x568f, 0x56a5, 0x56ae, 0x56b6, 0x56b4, 0x56c2, 0x56bc, 0x56c1, 0x56c3, 0x56c0, 0x56c8, 0x56ce, 0x56d1, 0x56d3, 0x56d7, 0x56ee, 0x56f9, 0x5700, 0x56ff, 0x5704, 0x5709, /* 0x54 */ 0x5708, 0x570b, 0x570d, 0x5713, 0x5718, 0x5716, 0x55c7, 0x571c, 0x5726, 0x5737, 0x5738, 0x574e, 0x573b, 0x5740, 0x574f, 0x5769, 0x57c0, 0x5788, 0x5761, 0x577f, 0x5789, 0x5793, 0x57a0, 0x57b3, 0x57a4, 0x57aa, 0x57b0, 0x57c3, 0x57c6, 0x57d4, 0x57d2, 0x57d3, 0x580a, 0x57d6, 0x57e3, 0x580b, 0x5819, 0x581d, 0x5872, 0x5821, 0x5862, 0x584b, 0x5870, 0x6bc0, 0x5852, 0x583d, 0x5879, 0x5885, 0x58b9, 0x589f, 0x58ab, 0x58ba, 0x58de, 0x58bb, 0x58b8, 0x58ae, 0x58c5, 0x58d3, 0x58d1, 0x58d7, 0x58d9, 0x58d8, 0x58e5, 0x58dc, 0x58e4, 0x58df, 0x58ef, 0x58fa, 0x58f9, 0x58fb, 0x58fc, 0x58fd, 0x5902, 0x590a, 0x5910, 0x591b, 0x68a6, 0x5925, 0x592c, 0x592d, 0x5932, 0x5938, 0x593e, 0x7ad2, 0x5955, 0x5950, 0x594e, 0x595a, 0x5958, 0x5962, 0x5960, 0x5967, 0x596c, 0x5969, /* 0x55 */ 0x5978, 0x5981, 0x599d, 0x4f5e, 0x4fab, 0x59a3, 0x59b2, 0x59c6, 0x59e8, 0x59dc, 0x598d, 0x59d9, 0x59da, 0x5a25, 0x5a1f, 0x5a11, 0x5a1c, 0x5a09, 0x5a1a, 0x5a40, 0x5a6c, 0x5a49, 0x5a35, 0x5a36, 0x5a62, 0x5a6a, 0x5a9a, 0x5abc, 0x5abe, 0x5acb, 0x5ac2, 0x5abd, 0x5ae3, 0x5ad7, 0x5ae6, 0x5ae9, 0x5ad6, 0x5afa, 0x5afb, 0x5b0c, 0x5b0b, 0x5b16, 0x5b32, 0x5ad0, 0x5b2a, 0x5b36, 0x5b3e, 0x5b43, 0x5b45, 0x5b40, 0x5b51, 0x5b55, 0x5b5a, 0x5b5b, 0x5b65, 0x5b69, 0x5b70, 0x5b73, 0x5b75, 0x5b78, 0x6588, 0x5b7a, 0x5b80, 0x5b83, 0x5ba6, 0x5bb8, 0x5bc3, 0x5bc7, 0x5bc9, 0x5bd4, 0x5bd0, 0x5be4, 0x5be6, 0x5be2, 0x5bde, 0x5be5, 0x5beb, 0x5bf0, 0x5bf6, 0x5bf3, 0x5c05, 0x5c07, 0x5c08, 0x5c0d, 0x5c13, 0x5c20, 0x5c22, 0x5c28, 0x5c38, 0x5c39, 0x5c41, 0x5c46, 0x5c4e, 0x5c53, /* 0x56 */ 0x5c50, 0x5c4f, 0x5b71, 0x5c6c, 0x5c6e, 0x4e62, 0x5c76, 0x5c79, 0x5c8c, 0x5c91, 0x5c94, 0x599b, 0x5cab, 0x5cbb, 0x5cb6, 0x5cbc, 0x5cb7, 0x5cc5, 0x5cbe, 0x5cc7, 0x5cd9, 0x5ce9, 0x5cfd, 0x5cfa, 0x5ced, 0x5d8c, 0x5cea, 0x5d0b, 0x5d15, 0x5d17, 0x5d5c, 0x5d1f, 0x5d1b, 0x5d11, 0x5d14, 0x5d22, 0x5d1a, 0x5d19, 0x5d18, 0x5d4c, 0x5d52, 0x5d4e, 0x5d4b, 0x5d6c, 0x5d73, 0x5d76, 0x5d87, 0x5d84, 0x5d82, 0x5da2, 0x5d9d, 0x5dac, 0x5dae, 0x5dbd, 0x5d90, 0x5db7, 0x5dbc, 0x5dc9, 0x5dcd, 0x5dd3, 0x5dd2, 0x5dd6, 0x5ddb, 0x5deb, 0x5df2, 0x5df5, 0x5e0b, 0x5e1a, 0x5e19, 0x5e11, 0x5e1b, 0x5e36, 0x5e37, 0x5e44, 0x5e43, 0x5e40, 0x5e4e, 0x5e57, 0x5e54, 0x5e5f, 0x5e62, 0x5e64, 0x5e47, 0x5e75, 0x5e76, 0x5e7a, 0x9ebc, 0x5e7f, 0x5ea0, 0x5ec1, 0x5ec2, 0x5ec8, 0x5ed0, 0x5ecf, /* 0x57 */ 0x5ed6, 0x5ee3, 0x5edd, 0x5eda, 0x5edb, 0x5ee2, 0x5ee1, 0x5ee8, 0x5ee9, 0x5eec, 0x5ef1, 0x5ef3, 0x5ef0, 0x5ef4, 0x5ef8, 0x5efe, 0x5f03, 0x5f09, 0x5f5d, 0x5f5c, 0x5f0b, 0x5f11, 0x5f16, 0x5f29, 0x5f2d, 0x5f38, 0x5f41, 0x5f48, 0x5f4c, 0x5f4e, 0x5f2f, 0x5f51, 0x5f56, 0x5f57, 0x5f59, 0x5f61, 0x5f6d, 0x5f73, 0x5f77, 0x5f83, 0x5f82, 0x5f7f, 0x5f8a, 0x5f88, 0x5f91, 0x5f87, 0x5f9e, 0x5f99, 0x5f98, 0x5fa0, 0x5fa8, 0x5fad, 0x5fbc, 0x5fd6, 0x5ffb, 0x5fe4, 0x5ff8, 0x5ff1, 0x5fdd, 0x60b3, 0x5fff, 0x6021, 0x6060, 0x6019, 0x6010, 0x6029, 0x600e, 0x6031, 0x601b, 0x6015, 0x602b, 0x6026, 0x600f, 0x603a, 0x605a, 0x6041, 0x606a, 0x6077, 0x605f, 0x604a, 0x6046, 0x604d, 0x6063, 0x6043, 0x6064, 0x6042, 0x606c, 0x606b, 0x6059, 0x6081, 0x608d, 0x60e7, 0x6083, 0x609a, /* 0x58 */ 0x6084, 0x609b, 0x6096, 0x6097, 0x6092, 0x60a7, 0x608b, 0x60e1, 0x60b8, 0x60e0, 0x60d3, 0x60b4, 0x5ff0, 0x60bd, 0x60c6, 0x60b5, 0x60d8, 0x614d, 0x6115, 0x6106, 0x60f6, 0x60f7, 0x6100, 0x60f4, 0x60fa, 0x6103, 0x6121, 0x60fb, 0x60f1, 0x610d, 0x610e, 0x6147, 0x613e, 0x6128, 0x6127, 0x614a, 0x613f, 0x613c, 0x612c, 0x6134, 0x613d, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159, 0x615a, 0x616b, 0x6174, 0x616f, 0x6165, 0x6171, 0x615f, 0x615d, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61ac, 0x6194, 0x619a, 0x618a, 0x6191, 0x61ab, 0x61ae, 0x61cc, 0x61ca, 0x61c9, 0x61f7, 0x61c8, 0x61c3, 0x61c6, 0x61ba, 0x61cb, 0x7f79, 0x61cd, 0x61e6, 0x61e3, 0x61f6, 0x61fa, 0x61f4, 0x61ff, 0x61fd, 0x61fc, 0x61fe, 0x6200, 0x6208, 0x6209, 0x620d, 0x620c, 0x6214, 0x621b, /* 0x59 */ 0x621e, 0x6221, 0x622a, 0x622e, 0x6230, 0x6232, 0x6233, 0x6241, 0x624e, 0x625e, 0x6263, 0x625b, 0x6260, 0x6268, 0x627c, 0x6282, 0x6289, 0x627e, 0x6292, 0x6293, 0x6296, 0x62d4, 0x6283, 0x6294, 0x62d7, 0x62d1, 0x62bb, 0x62cf, 0x62ff, 0x62c6, 0x64d4, 0x62c8, 0x62dc, 0x62cc, 0x62ca, 0x62c2, 0x62c7, 0x629b, 0x62c9, 0x630c, 0x62ee, 0x62f1, 0x6327, 0x6302, 0x6308, 0x62ef, 0x62f5, 0x6350, 0x633e, 0x634d, 0x641c, 0x634f, 0x6396, 0x638e, 0x6380, 0x63ab, 0x6376, 0x63a3, 0x638f, 0x6389, 0x639f, 0x63b5, 0x636b, 0x6369, 0x63be, 0x63e9, 0x63c0, 0x63c6, 0x63e3, 0x63c9, 0x63d2, 0x63f6, 0x63c4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651d, 0x6417, 0x6428, 0x640f, 0x6467, 0x646f, 0x6476, 0x644e, 0x652a, 0x6495, 0x6493, 0x64a5, 0x64a9, 0x6488, 0x64bc, /* 0x5a */ 0x64da, 0x64d2, 0x64c5, 0x64c7, 0x64bb, 0x64d8, 0x64c2, 0x64f1, 0x64e7, 0x8209, 0x64e0, 0x64e1, 0x62ac, 0x64e3, 0x64ef, 0x652c, 0x64f6, 0x64f4, 0x64f2, 0x64fa, 0x6500, 0x64fd, 0x6518, 0x651c, 0x6505, 0x6524, 0x6523, 0x652b, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, 0x754b, 0x6548, 0x6556, 0x6555, 0x654d, 0x6558, 0x655e, 0x655d, 0x6572, 0x6578, 0x6582, 0x6583, 0x8b8a, 0x659b, 0x659f, 0x65ab, 0x65b7, 0x65c3, 0x65c6, 0x65c1, 0x65c4, 0x65cc, 0x65d2, 0x65db, 0x65d9, 0x65e0, 0x65e1, 0x65f1, 0x6772, 0x660a, 0x6603, 0x65fb, 0x6773, 0x6635, 0x6636, 0x6634, 0x661c, 0x664f, 0x6644, 0x6649, 0x6641, 0x665e, 0x665d, 0x6664, 0x6667, 0x6668, 0x665f, 0x6662, 0x6670, 0x6683, 0x6688, 0x668e, 0x6689, 0x6684, 0x6698, 0x669d, 0x66c1, 0x66b9, 0x66c9, 0x66be, 0x66bc, /* 0x5b */ 0x66c4, 0x66b8, 0x66d6, 0x66da, 0x66e0, 0x663f, 0x66e6, 0x66e9, 0x66f0, 0x66f5, 0x66f7, 0x670f, 0x6716, 0x671e, 0x6726, 0x6727, 0x9738, 0x672e, 0x673f, 0x6736, 0x6741, 0x6738, 0x6737, 0x6746, 0x675e, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, 0x67a9, 0x677c, 0x676a, 0x678c, 0x678b, 0x67a6, 0x67a1, 0x6785, 0x67b7, 0x67ef, 0x67b4, 0x67ec, 0x67b3, 0x67e9, 0x67b8, 0x67e4, 0x67de, 0x67dd, 0x67e2, 0x67ee, 0x67b9, 0x67ce, 0x67c6, 0x67e7, 0x6a9c, 0x681e, 0x6846, 0x6829, 0x6840, 0x684d, 0x6832, 0x684e, 0x68b3, 0x682b, 0x6859, 0x6863, 0x6877, 0x687f, 0x689f, 0x688f, 0x68ad, 0x6894, 0x689d, 0x689b, 0x6883, 0x6aae, 0x68b9, 0x6874, 0x68b5, 0x68a0, 0x68ba, 0x690f, 0x688d, 0x687e, 0x6901, 0x68ca, 0x6908, 0x68d8, 0x6922, 0x6926, 0x68e1, 0x690c, 0x68cd, /* 0x5c */ 0x68d4, 0x68e7, 0x68d5, 0x6936, 0x6912, 0x6904, 0x68d7, 0x68e3, 0x6925, 0x68f9, 0x68e0, 0x68ef, 0x6928, 0x692a, 0x691a, 0x6923, 0x6921, 0x68c6, 0x6979, 0x6977, 0x695c, 0x6978, 0x696b, 0x6954, 0x697e, 0x696e, 0x6939, 0x6974, 0x693d, 0x6959, 0x6930, 0x6961, 0x695e, 0x695d, 0x6981, 0x696a, 0x69b2, 0x69ae, 0x69d0, 0x69bf, 0x69c1, 0x69d3, 0x69be, 0x69ce, 0x5be8, 0x69ca, 0x69dd, 0x69bb, 0x69c3, 0x69a7, 0x6a2e, 0x6991, 0x69a0, 0x699c, 0x6995, 0x69b4, 0x69de, 0x69e8, 0x6a02, 0x6a1b, 0x69ff, 0x6b0a, 0x69f9, 0x69f2, 0x69e7, 0x6a05, 0x69b1, 0x6a1e, 0x69ed, 0x6a14, 0x69eb, 0x6a0a, 0x6a12, 0x6ac1, 0x6a23, 0x6a13, 0x6a44, 0x6a0c, 0x6a72, 0x6a36, 0x6a78, 0x6a47, 0x6a62, 0x6a59, 0x6a66, 0x6a48, 0x6a38, 0x6a22, 0x6a90, 0x6a8d, 0x6aa0, 0x6a84, 0x6aa2, 0x6aa3, /* 0x5d */ 0x6a97, 0x8617, 0x6abb, 0x6ac3, 0x6ac2, 0x6ab8, 0x6ab3, 0x6aac, 0x6ade, 0x6ad1, 0x6adf, 0x6aaa, 0x6ada, 0x6aea, 0x6afb, 0x6b05, 0x8616, 0x6afa, 0x6b12, 0x6b16, 0x9b31, 0x6b1f, 0x6b38, 0x6b37, 0x76dc, 0x6b39, 0x98ee, 0x6b47, 0x6b43, 0x6b49, 0x6b50, 0x6b59, 0x6b54, 0x6b5b, 0x6b5f, 0x6b61, 0x6b78, 0x6b79, 0x6b7f, 0x6b80, 0x6b84, 0x6b83, 0x6b8d, 0x6b98, 0x6b95, 0x6b9e, 0x6ba4, 0x6baa, 0x6bab, 0x6baf, 0x6bb2, 0x6bb1, 0x6bb3, 0x6bb7, 0x6bbc, 0x6bc6, 0x6bcb, 0x6bd3, 0x6bdf, 0x6bec, 0x6beb, 0x6bf3, 0x6bef, 0x9ebe, 0x6c08, 0x6c13, 0x6c14, 0x6c1b, 0x6c24, 0x6c23, 0x6c5e, 0x6c55, 0x6c62, 0x6c6a, 0x6c82, 0x6c8d, 0x6c9a, 0x6c81, 0x6c9b, 0x6c7e, 0x6c68, 0x6c73, 0x6c92, 0x6c90, 0x6cc4, 0x6cf1, 0x6cd3, 0x6cbd, 0x6cd7, 0x6cc5, 0x6cdd, 0x6cae, 0x6cb1, 0x6cbe, /* 0x5e */ 0x6cba, 0x6cdb, 0x6cef, 0x6cd9, 0x6cea, 0x6d1f, 0x884d, 0x6d36, 0x6d2b, 0x6d3d, 0x6d38, 0x6d19, 0x6d35, 0x6d33, 0x6d12, 0x6d0c, 0x6d63, 0x6d93, 0x6d64, 0x6d5a, 0x6d79, 0x6d59, 0x6d8e, 0x6d95, 0x6fe4, 0x6d85, 0x6df9, 0x6e15, 0x6e0a, 0x6db5, 0x6dc7, 0x6de6, 0x6db8, 0x6dc6, 0x6dec, 0x6dde, 0x6dcc, 0x6de8, 0x6dd2, 0x6dc5, 0x6dfa, 0x6dd9, 0x6de4, 0x6dd5, 0x6dea, 0x6dee, 0x6e2d, 0x6e6e, 0x6e2e, 0x6e19, 0x6e72, 0x6e5f, 0x6e3e, 0x6e23, 0x6e6b, 0x6e2b, 0x6e76, 0x6e4d, 0x6e1f, 0x6e43, 0x6e3a, 0x6e4e, 0x6e24, 0x6eff, 0x6e1d, 0x6e38, 0x6e82, 0x6eaa, 0x6e98, 0x6ec9, 0x6eb7, 0x6ed3, 0x6ebd, 0x6eaf, 0x6ec4, 0x6eb2, 0x6ed4, 0x6ed5, 0x6e8f, 0x6ea5, 0x6ec2, 0x6e9f, 0x6f41, 0x6f11, 0x704c, 0x6eec, 0x6ef8, 0x6efe, 0x6f3f, 0x6ef2, 0x6f31, 0x6eef, 0x6f32, 0x6ecc, /* 0x5f */ 0x6f3e, 0x6f13, 0x6ef7, 0x6f86, 0x6f7a, 0x6f78, 0x6f81, 0x6f80, 0x6f6f, 0x6f5b, 0x6ff3, 0x6f6d, 0x6f82, 0x6f7c, 0x6f58, 0x6f8e, 0x6f91, 0x6fc2, 0x6f66, 0x6fb3, 0x6fa3, 0x6fa1, 0x6fa4, 0x6fb9, 0x6fc6, 0x6faa, 0x6fdf, 0x6fd5, 0x6fec, 0x6fd4, 0x6fd8, 0x6ff1, 0x6fee, 0x6fdb, 0x7009, 0x700b, 0x6ffa, 0x7011, 0x7001, 0x700f, 0x6ffe, 0x701b, 0x701a, 0x6f74, 0x701d, 0x7018, 0x701f, 0x7030, 0x703e, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70af, 0x70f1, 0x70ac, 0x70b8, 0x70b3, 0x70ae, 0x70df, 0x70cb, 0x70dd, 0x70d9, 0x7109, 0x70fd, 0x711c, 0x7119, 0x7165, 0x7155, 0x7188, 0x7166, 0x7162, 0x714c, 0x7156, 0x716c, 0x718f, 0x71fb, 0x7184, 0x7195, 0x71a8, 0x71ac, 0x71d7, 0x71b9, 0x71be, 0x71d2, 0x71c9, 0x71d4, 0x71ce, 0x71e0, 0x71ec, 0x71e7, 0x71f5, 0x71fc, /* 0x60 */ 0x71f9, 0x71ff, 0x720d, 0x7210, 0x721b, 0x7228, 0x722d, 0x722c, 0x7230, 0x7232, 0x723b, 0x723c, 0x723f, 0x7240, 0x7246, 0x724b, 0x7258, 0x7274, 0x727e, 0x7282, 0x7281, 0x7287, 0x7292, 0x7296, 0x72a2, 0x72a7, 0x72b9, 0x72b2, 0x72c3, 0x72c6, 0x72c4, 0x72ce, 0x72d2, 0x72e2, 0x72e0, 0x72e1, 0x72f9, 0x72f7, 0x500f, 0x7317, 0x730a, 0x731c, 0x7316, 0x731d, 0x7334, 0x732f, 0x7329, 0x7325, 0x733e, 0x734e, 0x734f, 0x9ed8, 0x7357, 0x736a, 0x7368, 0x7370, 0x7378, 0x7375, 0x737b, 0x737a, 0x73c8, 0x73b3, 0x73ce, 0x73bb, 0x73c0, 0x73e5, 0x73ee, 0x73de, 0x74a2, 0x7405, 0x746f, 0x7425, 0x73f8, 0x7432, 0x743a, 0x7455, 0x743f, 0x745f, 0x7459, 0x7441, 0x745c, 0x7469, 0x7470, 0x7463, 0x746a, 0x7476, 0x747e, 0x748b, 0x749e, 0x74a7, 0x74ca, 0x74cf, 0x74d4, 0x73f1, /* 0x61 */ 0x74e0, 0x74e3, 0x74e7, 0x74e9, 0x74ee, 0x74f2, 0x74f0, 0x74f1, 0x74f8, 0x74f7, 0x7504, 0x7503, 0x7505, 0x750c, 0x750e, 0x750d, 0x7515, 0x7513, 0x751e, 0x7526, 0x752c, 0x753c, 0x7544, 0x754d, 0x754a, 0x7549, 0x755b, 0x7546, 0x755a, 0x7569, 0x7564, 0x7567, 0x756b, 0x756d, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758a, 0x7589, 0x7582, 0x7594, 0x759a, 0x759d, 0x75a5, 0x75a3, 0x75c2, 0x75b3, 0x75c3, 0x75b5, 0x75bd, 0x75b8, 0x75bc, 0x75b1, 0x75cd, 0x75ca, 0x75d2, 0x75d9, 0x75e3, 0x75de, 0x75fe, 0x75ff, 0x75fc, 0x7601, 0x75f0, 0x75fa, 0x75f2, 0x75f3, 0x760b, 0x760d, 0x7609, 0x761f, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630, 0x763b, 0x7647, 0x7648, 0x7646, 0x765c, 0x7658, 0x7661, 0x7662, 0x7668, 0x7669, 0x766a, 0x7667, 0x766c, 0x7670, /* 0x62 */ 0x7672, 0x7676, 0x7678, 0x767c, 0x7680, 0x7683, 0x7688, 0x768b, 0x768e, 0x7696, 0x7693, 0x7699, 0x769a, 0x76b0, 0x76b4, 0x76b8, 0x76b9, 0x76ba, 0x76c2, 0x76cd, 0x76d6, 0x76d2, 0x76de, 0x76e1, 0x76e5, 0x76e7, 0x76ea, 0x862f, 0x76fb, 0x7708, 0x7707, 0x7704, 0x7729, 0x7724, 0x771e, 0x7725, 0x7726, 0x771b, 0x7737, 0x7738, 0x7747, 0x775a, 0x7768, 0x776b, 0x775b, 0x7765, 0x777f, 0x777e, 0x7779, 0x778e, 0x778b, 0x7791, 0x77a0, 0x779e, 0x77b0, 0x77b6, 0x77b9, 0x77bf, 0x77bc, 0x77bd, 0x77bb, 0x77c7, 0x77cd, 0x77d7, 0x77da, 0x77dc, 0x77e3, 0x77ee, 0x77fc, 0x780c, 0x7812, 0x7926, 0x7820, 0x792a, 0x7845, 0x788e, 0x7874, 0x7886, 0x787c, 0x789a, 0x788c, 0x78a3, 0x78b5, 0x78aa, 0x78af, 0x78d1, 0x78c6, 0x78cb, 0x78d4, 0x78be, 0x78bc, 0x78c5, 0x78ca, 0x78ec, /* 0x63 */ 0x78e7, 0x78da, 0x78fd, 0x78f4, 0x7907, 0x7912, 0x7911, 0x7919, 0x792c, 0x792b, 0x7940, 0x7960, 0x7957, 0x795f, 0x795a, 0x7955, 0x7953, 0x797a, 0x797f, 0x798a, 0x799d, 0x79a7, 0x9f4b, 0x79aa, 0x79ae, 0x79b3, 0x79b9, 0x79ba, 0x79c9, 0x79d5, 0x79e7, 0x79ec, 0x79e1, 0x79e3, 0x7a08, 0x7a0d, 0x7a18, 0x7a19, 0x7a20, 0x7a1f, 0x7980, 0x7a31, 0x7a3b, 0x7a3e, 0x7a37, 0x7a43, 0x7a57, 0x7a49, 0x7a61, 0x7a62, 0x7a69, 0x9f9d, 0x7a70, 0x7a79, 0x7a7d, 0x7a88, 0x7a97, 0x7a95, 0x7a98, 0x7a96, 0x7aa9, 0x7ac8, 0x7ab0, 0x7ab6, 0x7ac5, 0x7ac4, 0x7abf, 0x9083, 0x7ac7, 0x7aca, 0x7acd, 0x7acf, 0x7ad5, 0x7ad3, 0x7ad9, 0x7ada, 0x7add, 0x7ae1, 0x7ae2, 0x7ae6, 0x7aed, 0x7af0, 0x7b02, 0x7b0f, 0x7b0a, 0x7b06, 0x7b33, 0x7b18, 0x7b19, 0x7b1e, 0x7b35, 0x7b28, 0x7b36, 0x7b50, /* 0x64 */ 0x7b7a, 0x7b04, 0x7b4d, 0x7b0b, 0x7b4c, 0x7b45, 0x7b75, 0x7b65, 0x7b74, 0x7b67, 0x7b70, 0x7b71, 0x7b6c, 0x7b6e, 0x7b9d, 0x7b98, 0x7b9f, 0x7b8d, 0x7b9c, 0x7b9a, 0x7b8b, 0x7b92, 0x7b8f, 0x7b5d, 0x7b99, 0x7bcb, 0x7bc1, 0x7bcc, 0x7bcf, 0x7bb4, 0x7bc6, 0x7bdd, 0x7be9, 0x7c11, 0x7c14, 0x7be6, 0x7be5, 0x7c60, 0x7c00, 0x7c07, 0x7c13, 0x7bf3, 0x7bf7, 0x7c17, 0x7c0d, 0x7bf6, 0x7c23, 0x7c27, 0x7c2a, 0x7c1f, 0x7c37, 0x7c2b, 0x7c3d, 0x7c4c, 0x7c43, 0x7c54, 0x7c4f, 0x7c40, 0x7c50, 0x7c58, 0x7c5f, 0x7c64, 0x7c56, 0x7c65, 0x7c6c, 0x7c75, 0x7c83, 0x7c90, 0x7ca4, 0x7cad, 0x7ca2, 0x7cab, 0x7ca1, 0x7ca8, 0x7cb3, 0x7cb2, 0x7cb1, 0x7cae, 0x7cb9, 0x7cbd, 0x7cc0, 0x7cc5, 0x7cc2, 0x7cd8, 0x7cd2, 0x7cdc, 0x7ce2, 0x9b3b, 0x7cef, 0x7cf2, 0x7cf4, 0x7cf6, 0x7cfa, 0x7d06, /* 0x65 */ 0x7d02, 0x7d1c, 0x7d15, 0x7d0a, 0x7d45, 0x7d4b, 0x7d2e, 0x7d32, 0x7d3f, 0x7d35, 0x7d46, 0x7d73, 0x7d56, 0x7d4e, 0x7d72, 0x7d68, 0x7d6e, 0x7d4f, 0x7d63, 0x7d93, 0x7d89, 0x7d5b, 0x7d8f, 0x7d7d, 0x7d9b, 0x7dba, 0x7dae, 0x7da3, 0x7db5, 0x7dc7, 0x7dbd, 0x7dab, 0x7e3d, 0x7da2, 0x7daf, 0x7ddc, 0x7db8, 0x7d9f, 0x7db0, 0x7dd8, 0x7ddd, 0x7de4, 0x7dde, 0x7dfb, 0x7df2, 0x7de1, 0x7e05, 0x7e0a, 0x7e23, 0x7e21, 0x7e12, 0x7e31, 0x7e1f, 0x7e09, 0x7e0b, 0x7e22, 0x7e46, 0x7e66, 0x7e3b, 0x7e35, 0x7e39, 0x7e43, 0x7e37, 0x7e32, 0x7e3a, 0x7e67, 0x7e5d, 0x7e56, 0x7e5e, 0x7e59, 0x7e5a, 0x7e79, 0x7e6a, 0x7e69, 0x7e7c, 0x7e7b, 0x7e83, 0x7dd5, 0x7e7d, 0x8fae, 0x7e7f, 0x7e88, 0x7e89, 0x7e8c, 0x7e92, 0x7e90, 0x7e93, 0x7e94, 0x7e96, 0x7e8e, 0x7e9b, 0x7e9c, 0x7f38, 0x7f3a, /* 0x66 */ 0x7f45, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f50, 0x7f51, 0x7f55, 0x7f54, 0x7f58, 0x7f5f, 0x7f60, 0x7f68, 0x7f69, 0x7f67, 0x7f78, 0x7f82, 0x7f86, 0x7f83, 0x7f88, 0x7f87, 0x7f8c, 0x7f94, 0x7f9e, 0x7f9d, 0x7f9a, 0x7fa3, 0x7faf, 0x7fb2, 0x7fb9, 0x7fae, 0x7fb6, 0x7fb8, 0x8b71, 0x7fc5, 0x7fc6, 0x7fca, 0x7fd5, 0x7fd4, 0x7fe1, 0x7fe6, 0x7fe9, 0x7ff3, 0x7ff9, 0x98dc, 0x8006, 0x8004, 0x800b, 0x8012, 0x8018, 0x8019, 0x801c, 0x8021, 0x8028, 0x803f, 0x803b, 0x804a, 0x8046, 0x8052, 0x8058, 0x805a, 0x805f, 0x8062, 0x8068, 0x8073, 0x8072, 0x8070, 0x8076, 0x8079, 0x807d, 0x807f, 0x8084, 0x8086, 0x8085, 0x809b, 0x8093, 0x809a, 0x80ad, 0x5190, 0x80ac, 0x80db, 0x80e5, 0x80d9, 0x80dd, 0x80c4, 0x80da, 0x80d6, 0x8109, 0x80ef, 0x80f1, 0x811b, 0x8129, 0x8123, 0x812f, 0x814b, /* 0x67 */ 0x968b, 0x8146, 0x813e, 0x8153, 0x8151, 0x80fc, 0x8171, 0x816e, 0x8165, 0x8166, 0x8174, 0x8183, 0x8188, 0x818a, 0x8180, 0x8182, 0x81a0, 0x8195, 0x81a4, 0x81a3, 0x815f, 0x8193, 0x81a9, 0x81b0, 0x81b5, 0x81be, 0x81b8, 0x81bd, 0x81c0, 0x81c2, 0x81ba, 0x81c9, 0x81cd, 0x81d1, 0x81d9, 0x81d8, 0x81c8, 0x81da, 0x81df, 0x81e0, 0x81e7, 0x81fa, 0x81fb, 0x81fe, 0x8201, 0x8202, 0x8205, 0x8207, 0x820a, 0x820d, 0x8210, 0x8216, 0x8229, 0x822b, 0x8238, 0x8233, 0x8240, 0x8259, 0x8258, 0x825d, 0x825a, 0x825f, 0x8264, 0x8262, 0x8268, 0x826a, 0x826b, 0x822e, 0x8271, 0x8277, 0x8278, 0x827e, 0x828d, 0x8292, 0x82ab, 0x829f, 0x82bb, 0x82ac, 0x82e1, 0x82e3, 0x82df, 0x82d2, 0x82f4, 0x82f3, 0x82fa, 0x8393, 0x8303, 0x82fb, 0x82f9, 0x82de, 0x8306, 0x82dc, 0x8309, 0x82d9, /* 0x68 */ 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, 0x8350, 0x8345, 0x832f, 0x832b, 0x8317, 0x8318, 0x8385, 0x839a, 0x83aa, 0x839f, 0x83a2, 0x8396, 0x8323, 0x838e, 0x8387, 0x838a, 0x837c, 0x83b5, 0x8373, 0x8375, 0x83a0, 0x8389, 0x83a8, 0x83f4, 0x8413, 0x83eb, 0x83ce, 0x83fd, 0x8403, 0x83d8, 0x840b, 0x83c1, 0x83f7, 0x8407, 0x83e0, 0x83f2, 0x840d, 0x8422, 0x8420, 0x83bd, 0x8438, 0x8506, 0x83fb, 0x846d, 0x842a, 0x843c, 0x855a, 0x8484, 0x8477, 0x846b, 0x84ad, 0x846e, 0x8482, 0x8469, 0x8446, 0x842c, 0x846f, 0x8479, 0x8435, 0x84ca, 0x8462, 0x84b9, 0x84bf, 0x849f, 0x84d9, 0x84cd, 0x84bb, 0x84da, 0x84d0, 0x84c1, 0x84c6, 0x84d6, 0x84a1, 0x8521, 0x84ff, 0x84f4, 0x8517, 0x8518, 0x852c, 0x851f, 0x8515, 0x8514, 0x84fc, 0x8540, 0x8563, 0x8558, 0x8548, /* 0x69 */ 0x8541, 0x8602, 0x854b, 0x8555, 0x8580, 0x85a4, 0x8588, 0x8591, 0x858a, 0x85a8, 0x856d, 0x8594, 0x859b, 0x85ea, 0x8587, 0x859c, 0x8577, 0x857e, 0x8590, 0x85c9, 0x85ba, 0x85cf, 0x85b9, 0x85d0, 0x85d5, 0x85dd, 0x85e5, 0x85dc, 0x85f9, 0x860a, 0x8613, 0x860b, 0x85fe, 0x85fa, 0x8606, 0x8622, 0x861a, 0x8630, 0x863f, 0x864d, 0x4e55, 0x8654, 0x865f, 0x8667, 0x8671, 0x8693, 0x86a3, 0x86a9, 0x86aa, 0x868b, 0x868c, 0x86b6, 0x86af, 0x86c4, 0x86c6, 0x86b0, 0x86c9, 0x8823, 0x86ab, 0x86d4, 0x86de, 0x86e9, 0x86ec, 0x86df, 0x86db, 0x86ef, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86fb, 0x8711, 0x8709, 0x870d, 0x86f9, 0x870a, 0x8734, 0x873f, 0x8737, 0x873b, 0x8725, 0x8729, 0x871a, 0x8760, 0x875f, 0x8778, 0x874c, 0x874e, 0x8774, 0x8757, 0x8768, 0x876e, 0x8759, /* 0x6a */ 0x8753, 0x8763, 0x876a, 0x8805, 0x87a2, 0x879f, 0x8782, 0x87af, 0x87cb, 0x87bd, 0x87c0, 0x87d0, 0x96d6, 0x87ab, 0x87c4, 0x87b3, 0x87c7, 0x87c6, 0x87bb, 0x87ef, 0x87f2, 0x87e0, 0x880f, 0x880d, 0x87fe, 0x87f6, 0x87f7, 0x880e, 0x87d2, 0x8811, 0x8816, 0x8815, 0x8822, 0x8821, 0x8831, 0x8836, 0x8839, 0x8827, 0x883b, 0x8844, 0x8842, 0x8852, 0x8859, 0x885e, 0x8862, 0x886b, 0x8881, 0x887e, 0x889e, 0x8875, 0x887d, 0x88b5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88ae, 0x8899, 0x88a2, 0x888d, 0x88a4, 0x88b0, 0x88bf, 0x88b1, 0x88c3, 0x88c4, 0x88d4, 0x88d8, 0x88d9, 0x88dd, 0x88f9, 0x8902, 0x88fc, 0x88f4, 0x88e8, 0x88f2, 0x8904, 0x890c, 0x890a, 0x8913, 0x8943, 0x891e, 0x8925, 0x892a, 0x892b, 0x8941, 0x8944, 0x893b, 0x8936, 0x8938, 0x894c, 0x891d, 0x8960, 0x895e, /* 0x6b */ 0x8966, 0x8964, 0x896d, 0x896a, 0x896f, 0x8974, 0x8977, 0x897e, 0x8983, 0x8988, 0x898a, 0x8993, 0x8998, 0x89a1, 0x89a9, 0x89a6, 0x89ac, 0x89af, 0x89b2, 0x89ba, 0x89bd, 0x89bf, 0x89c0, 0x89da, 0x89dc, 0x89dd, 0x89e7, 0x89f4, 0x89f8, 0x8a03, 0x8a16, 0x8a10, 0x8a0c, 0x8a1b, 0x8a1d, 0x8a25, 0x8a36, 0x8a41, 0x8a5b, 0x8a52, 0x8a46, 0x8a48, 0x8a7c, 0x8a6d, 0x8a6c, 0x8a62, 0x8a85, 0x8a82, 0x8a84, 0x8aa8, 0x8aa1, 0x8a91, 0x8aa5, 0x8aa6, 0x8a9a, 0x8aa3, 0x8ac4, 0x8acd, 0x8ac2, 0x8ada, 0x8aeb, 0x8af3, 0x8ae7, 0x8ae4, 0x8af1, 0x8b14, 0x8ae0, 0x8ae2, 0x8af7, 0x8ade, 0x8adb, 0x8b0c, 0x8b07, 0x8b1a, 0x8ae1, 0x8b16, 0x8b10, 0x8b17, 0x8b20, 0x8b33, 0x97ab, 0x8b26, 0x8b2b, 0x8b3e, 0x8b28, 0x8b41, 0x8b4c, 0x8b4f, 0x8b4e, 0x8b49, 0x8b56, 0x8b5b, 0x8b5a, 0x8b6b, /* 0x6c */ 0x8b5f, 0x8b6c, 0x8b6f, 0x8b74, 0x8b7d, 0x8b80, 0x8b8c, 0x8b8e, 0x8b92, 0x8b93, 0x8b96, 0x8b99, 0x8b9a, 0x8c3a, 0x8c41, 0x8c3f, 0x8c48, 0x8c4c, 0x8c4e, 0x8c50, 0x8c55, 0x8c62, 0x8c6c, 0x8c78, 0x8c7a, 0x8c82, 0x8c89, 0x8c85, 0x8c8a, 0x8c8d, 0x8c8e, 0x8c94, 0x8c7c, 0x8c98, 0x621d, 0x8cad, 0x8caa, 0x8cbd, 0x8cb2, 0x8cb3, 0x8cae, 0x8cb6, 0x8cc8, 0x8cc1, 0x8ce4, 0x8ce3, 0x8cda, 0x8cfd, 0x8cfa, 0x8cfb, 0x8d04, 0x8d05, 0x8d0a, 0x8d07, 0x8d0f, 0x8d0d, 0x8d10, 0x9f4e, 0x8d13, 0x8ccd, 0x8d14, 0x8d16, 0x8d67, 0x8d6d, 0x8d71, 0x8d73, 0x8d81, 0x8d99, 0x8dc2, 0x8dbe, 0x8dba, 0x8dcf, 0x8dda, 0x8dd6, 0x8dcc, 0x8ddb, 0x8dcb, 0x8dea, 0x8deb, 0x8ddf, 0x8de3, 0x8dfc, 0x8e08, 0x8e09, 0x8dff, 0x8e1d, 0x8e1e, 0x8e10, 0x8e1f, 0x8e42, 0x8e35, 0x8e30, 0x8e34, 0x8e4a, /* 0x6d */ 0x8e47, 0x8e49, 0x8e4c, 0x8e50, 0x8e48, 0x8e59, 0x8e64, 0x8e60, 0x8e2a, 0x8e63, 0x8e55, 0x8e76, 0x8e72, 0x8e7c, 0x8e81, 0x8e87, 0x8e85, 0x8e84, 0x8e8b, 0x8e8a, 0x8e93, 0x8e91, 0x8e94, 0x8e99, 0x8eaa, 0x8ea1, 0x8eac, 0x8eb0, 0x8ec6, 0x8eb1, 0x8ebe, 0x8ec5, 0x8ec8, 0x8ecb, 0x8edb, 0x8ee3, 0x8efc, 0x8efb, 0x8eeb, 0x8efe, 0x8f0a, 0x8f05, 0x8f15, 0x8f12, 0x8f19, 0x8f13, 0x8f1c, 0x8f1f, 0x8f1b, 0x8f0c, 0x8f26, 0x8f33, 0x8f3b, 0x8f39, 0x8f45, 0x8f42, 0x8f3e, 0x8f4c, 0x8f49, 0x8f46, 0x8f4e, 0x8f57, 0x8f5c, 0x8f62, 0x8f63, 0x8f64, 0x8f9c, 0x8f9f, 0x8fa3, 0x8fad, 0x8faf, 0x8fb7, 0x8fda, 0x8fe5, 0x8fe2, 0x8fea, 0x8fef, 0x9087, 0x8ff4, 0x9005, 0x8ff9, 0x8ffa, 0x9011, 0x9015, 0x9021, 0x900d, 0x901e, 0x9016, 0x900b, 0x9027, 0x9036, 0x9035, 0x9039, 0x8ff8, /* 0x6e */ 0x904f, 0x9050, 0x9051, 0x9052, 0x900e, 0x9049, 0x903e, 0x9056, 0x9058, 0x905e, 0x9068, 0x906f, 0x9076, 0x96a8, 0x9072, 0x9082, 0x907d, 0x9081, 0x9080, 0x908a, 0x9089, 0x908f, 0x90a8, 0x90af, 0x90b1, 0x90b5, 0x90e2, 0x90e4, 0x6248, 0x90db, 0x9102, 0x9112, 0x9119, 0x9132, 0x9130, 0x914a, 0x9156, 0x9158, 0x9163, 0x9165, 0x9169, 0x9173, 0x9172, 0x918b, 0x9189, 0x9182, 0x91a2, 0x91ab, 0x91af, 0x91aa, 0x91b5, 0x91b4, 0x91ba, 0x91c0, 0x91c1, 0x91c9, 0x91cb, 0x91d0, 0x91d6, 0x91df, 0x91e1, 0x91db, 0x91fc, 0x91f5, 0x91f6, 0x921e, 0x91ff, 0x9214, 0x922c, 0x9215, 0x9211, 0x925e, 0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923f, 0x924b, 0x9250, 0x929c, 0x9296, 0x9293, 0x929b, 0x925a, 0x92cf, 0x92b9, 0x92b7, 0x92e9, 0x930f, 0x92fa, 0x9344, 0x932e, /* 0x6f */ 0x9319, 0x9322, 0x931a, 0x9323, 0x933a, 0x9335, 0x933b, 0x935c, 0x9360, 0x937c, 0x936e, 0x9356, 0x93b0, 0x93ac, 0x93ad, 0x9394, 0x93b9, 0x93d6, 0x93d7, 0x93e8, 0x93e5, 0x93d8, 0x93c3, 0x93dd, 0x93d0, 0x93c8, 0x93e4, 0x941a, 0x9414, 0x9413, 0x9403, 0x9407, 0x9410, 0x9436, 0x942b, 0x9435, 0x9421, 0x943a, 0x9441, 0x9452, 0x9444, 0x945b, 0x9460, 0x9462, 0x945e, 0x946a, 0x9229, 0x9470, 0x9475, 0x9477, 0x947d, 0x945a, 0x947c, 0x947e, 0x9481, 0x947f, 0x9582, 0x9587, 0x958a, 0x9594, 0x9596, 0x9598, 0x9599, 0x95a0, 0x95a8, 0x95a7, 0x95ad, 0x95bc, 0x95bb, 0x95b9, 0x95be, 0x95ca, 0x6ff6, 0x95c3, 0x95cd, 0x95cc, 0x95d5, 0x95d4, 0x95d6, 0x95dc, 0x95e1, 0x95e5, 0x95e2, 0x9621, 0x9628, 0x962e, 0x962f, 0x9642, 0x964c, 0x964f, 0x964b, 0x9677, 0x965c, 0x965e, /* 0x70 */ 0x965d, 0x965f, 0x9666, 0x9672, 0x966c, 0x968d, 0x9698, 0x9695, 0x9697, 0x96aa, 0x96a7, 0x96b1, 0x96b2, 0x96b0, 0x96b4, 0x96b6, 0x96b8, 0x96b9, 0x96ce, 0x96cb, 0x96c9, 0x96cd, 0x894d, 0x96dc, 0x970d, 0x96d5, 0x96f9, 0x9704, 0x9706, 0x9708, 0x9713, 0x970e, 0x9711, 0x970f, 0x9716, 0x9719, 0x9724, 0x972a, 0x9730, 0x9739, 0x973d, 0x973e, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, 0x975c, 0x9760, 0x9764, 0x9766, 0x9768, 0x52d2, 0x976b, 0x9771, 0x9779, 0x9785, 0x977c, 0x9781, 0x977a, 0x9786, 0x978b, 0x978f, 0x9790, 0x979c, 0x97a8, 0x97a6, 0x97a3, 0x97b3, 0x97b4, 0x97c3, 0x97c6, 0x97c8, 0x97cb, 0x97dc, 0x97ed, 0x9f4f, 0x97f2, 0x7adf, 0x97f6, 0x97f5, 0x980f, 0x980c, 0x9838, 0x9824, 0x9821, 0x9837, 0x983d, 0x9846, 0x984f, 0x984b, 0x986b, 0x986f, 0x9870, /* 0x71 */ 0x9871, 0x9874, 0x9873, 0x98aa, 0x98af, 0x98b1, 0x98b6, 0x98c4, 0x98c3, 0x98c6, 0x98e9, 0x98eb, 0x9903, 0x9909, 0x9912, 0x9914, 0x9918, 0x9921, 0x991d, 0x991e, 0x9924, 0x9920, 0x992c, 0x992e, 0x993d, 0x993e, 0x9942, 0x9949, 0x9945, 0x9950, 0x994b, 0x9951, 0x9952, 0x994c, 0x9955, 0x9997, 0x9998, 0x99a5, 0x99ad, 0x99ae, 0x99bc, 0x99df, 0x99db, 0x99dd, 0x99d8, 0x99d1, 0x99ed, 0x99ee, 0x99f1, 0x99f2, 0x99fb, 0x99f8, 0x9a01, 0x9a0f, 0x9a05, 0x99e2, 0x9a19, 0x9a2b, 0x9a37, 0x9a45, 0x9a42, 0x9a40, 0x9a43, 0x9a3e, 0x9a55, 0x9a4d, 0x9a5b, 0x9a57, 0x9a5f, 0x9a62, 0x9a65, 0x9a64, 0x9a69, 0x9a6b, 0x9a6a, 0x9aad, 0x9ab0, 0x9abc, 0x9ac0, 0x9acf, 0x9ad1, 0x9ad3, 0x9ad4, 0x9ade, 0x9adf, 0x9ae2, 0x9ae3, 0x9ae6, 0x9aef, 0x9aeb, 0x9aee, 0x9af4, 0x9af1, 0x9af7, /* 0x72 */ 0x9afb, 0x9b06, 0x9b18, 0x9b1a, 0x9b1f, 0x9b22, 0x9b23, 0x9b25, 0x9b27, 0x9b28, 0x9b29, 0x9b2a, 0x9b2e, 0x9b2f, 0x9b32, 0x9b44, 0x9b43, 0x9b4f, 0x9b4d, 0x9b4e, 0x9b51, 0x9b58, 0x9b74, 0x9b93, 0x9b83, 0x9b91, 0x9b96, 0x9b97, 0x9b9f, 0x9ba0, 0x9ba8, 0x9bb4, 0x9bc0, 0x9bca, 0x9bb9, 0x9bc6, 0x9bcf, 0x9bd1, 0x9bd2, 0x9be3, 0x9be2, 0x9be4, 0x9bd4, 0x9be1, 0x9c3a, 0x9bf2, 0x9bf1, 0x9bf0, 0x9c15, 0x9c14, 0x9c09, 0x9c13, 0x9c0c, 0x9c06, 0x9c08, 0x9c12, 0x9c0a, 0x9c04, 0x9c2e, 0x9c1b, 0x9c25, 0x9c24, 0x9c21, 0x9c30, 0x9c47, 0x9c32, 0x9c46, 0x9c3e, 0x9c5a, 0x9c60, 0x9c67, 0x9c76, 0x9c78, 0x9ce7, 0x9cec, 0x9cf0, 0x9d09, 0x9d08, 0x9ceb, 0x9d03, 0x9d06, 0x9d2a, 0x9d26, 0x9daf, 0x9d23, 0x9d1f, 0x9d44, 0x9d15, 0x9d12, 0x9d41, 0x9d3f, 0x9d3e, 0x9d46, 0x9d48, /* 0x73 */ 0x9d5d, 0x9d5e, 0x9d64, 0x9d51, 0x9d50, 0x9d59, 0x9d72, 0x9d89, 0x9d87, 0x9dab, 0x9d6f, 0x9d7a, 0x9d9a, 0x9da4, 0x9da9, 0x9db2, 0x9dc4, 0x9dc1, 0x9dbb, 0x9db8, 0x9dba, 0x9dc6, 0x9dcf, 0x9dc2, 0x9dd9, 0x9dd3, 0x9df8, 0x9de6, 0x9ded, 0x9def, 0x9dfd, 0x9e1a, 0x9e1b, 0x9e1e, 0x9e75, 0x9e79, 0x9e7d, 0x9e81, 0x9e88, 0x9e8b, 0x9e8c, 0x9e92, 0x9e95, 0x9e91, 0x9e9d, 0x9ea5, 0x9ea9, 0x9eb8, 0x9eaa, 0x9ead, 0x9761, 0x9ecc, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed4, 0x9edc, 0x9ede, 0x9edd, 0x9ee0, 0x9ee5, 0x9ee8, 0x9eef, 0x9ef4, 0x9ef6, 0x9ef7, 0x9ef9, 0x9efb, 0x9efc, 0x9efd, 0x9f07, 0x9f08, 0x76b7, 0x9f15, 0x9f21, 0x9f2c, 0x9f3e, 0x9f4a, 0x9f52, 0x9f54, 0x9f63, 0x9f5f, 0x9f60, 0x9f61, 0x9f66, 0x9f67, 0x9f6c, 0x9f6a, 0x9f77, 0x9f72, 0x9f76, 0x9f95, 0x9f9c, 0x9fa0, /* 0x74 */ 0x582f, 0x69c7, 0x9059, 0x7464, 0x51dc, 0x7199, }; static int jisx0208_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x28) || (c1 >= 0x30 && c1 <= 0x74)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); unsigned short wc = 0xfffd; if (i < 1410) { if (i < 690) wc = jisx0208_2uni_page21[i]; } else { if (i < 7808) wc = jisx0208_2uni_page30[i-1410]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short jisx0208_2charset[6879] = { 0x2171, 0x2172, 0x2178, 0x212f, 0x224c, 0x216b, 0x215e, 0x212d, 0x2279, 0x215f, 0x2160, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, 0x262e, 0x262f, 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636, 0x2637, 0x2638, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647, 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656, 0x2657, 0x2658, 0x2727, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2728, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, 0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738, 0x2739, 0x273a, 0x273b, 0x273c, 0x273d, 0x273e, 0x273f, 0x2740, 0x2741, 0x2751, 0x2752, 0x2753, 0x2754, 0x2755, 0x2756, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c, 0x275d, 0x275e, 0x275f, 0x2760, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2768, 0x2769, 0x276a, 0x276b, 0x276c, 0x276d, 0x276e, 0x276f, 0x2770, 0x2771, 0x2757, 0x213e, 0x213d, 0x2142, 0x2146, 0x2147, 0x2148, 0x2149, 0x2277, 0x2278, 0x2145, 0x2144, 0x2273, 0x216c, 0x216d, 0x2228, 0x216e, 0x2272, 0x222b, 0x222c, 0x222a, 0x222d, 0x224d, 0x224e, 0x224f, 0x225f, 0x2250, 0x2260, 0x223a, 0x223b, 0x215d, 0x2265, 0x2267, 0x2167, 0x225c, 0x224a, 0x224b, 0x2241, 0x2240, 0x2269, 0x226a, 0x2168, 0x2268, 0x2266, 0x2262, 0x2162, 0x2261, 0x2165, 0x2166, 0x2263, 0x2264, 0x223e, 0x223f, 0x223c, 0x223d, 0x225d, 0x225e, 0x2821, 0x282c, 0x2822, 0x282d, 0x2823, 0x282e, 0x2824, 0x282f, 0x2826, 0x2831, 0x2825, 0x2830, 0x2827, 0x283c, 0x2837, 0x2832, 0x2829, 0x283e, 0x2839, 0x2834, 0x2828, 0x2838, 0x283d, 0x2833, 0x282a, 0x283a, 0x283f, 0x2835, 0x282b, 0x283b, 0x2840, 0x2836, 0x2223, 0x2222, 0x2225, 0x2224, 0x2227, 0x2226, 0x2221, 0x217e, 0x217b, 0x217d, 0x217c, 0x227e, 0x217a, 0x2179, 0x216a, 0x2169, 0x2276, 0x2275, 0x2274, 0x2121, 0x2122, 0x2123, 0x2137, 0x2139, 0x213a, 0x213b, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, 0x215b, 0x2229, 0x222e, 0x214c, 0x214d, 0x2141, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429, 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, 0x2430, 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, 0x2448, 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, 0x2458, 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471, 0x2472, 0x2473, 0x212b, 0x212c, 0x2135, 0x2136, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e, 0x254f, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2126, 0x213c, 0x2133, 0x2134, 0x306c, 0x437a, 0x3c37, 0x4b7c, 0x3e66, 0x3b30, 0x3e65, 0x323c, 0x4954, 0x4d3f, 0x5022, 0x312f, 0x336e, 0x5023, 0x4024, 0x5242, 0x3556, 0x4a3a, 0x3e67, 0x4e3e, 0x4a42, 0x5024, 0x4366, 0x5025, 0x367a, 0x5026, 0x345d, 0x4330, 0x3c67, 0x5027, 0x5028, 0x5029, 0x4735, 0x3557, 0x4737, 0x4663, 0x3843, 0x4b33, 0x6949, 0x502a, 0x3e68, 0x502b, 0x3235, 0x3665, 0x3870, 0x4c69, 0x5626, 0x4d70, 0x467d, 0x3425, 0x3535, 0x502c, 0x502d, 0x4e3b, 0x4d3d, 0x4168, 0x502f, 0x3b76, 0x4673, 0x5032, 0x313e, 0x385f, 0x385e, 0x3066, 0x4f4b, 0x4f4a, 0x3a33, 0x3021, 0x5033, 0x5034, 0x5035, 0x4b34, 0x5036, 0x3872, 0x3067, 0x4b72, 0x357c, 0x357d, 0x357e, 0x4462, 0x4e3c, 0x5037, 0x5038, 0x5039, 0x3f4d, 0x3d3a, 0x3f4e, 0x503e, 0x503c, 0x503d, 0x3558, 0x3a23, 0x3270, 0x503b, 0x503a, 0x4a29, 0x3b46, 0x3b45, 0x423e, 0x503f, 0x4955, 0x4067, 0x2138, 0x5040, 0x5042, 0x4265, 0x4e61, 0x304a, 0x5041, 0x323e, 0x3644, 0x4367, 0x376f, 0x5043, 0x4724, 0x346b, 0x5044, 0x304b, 0x3860, 0x346c, 0x497a, 0x4832, 0x3559, 0x3271, 0x5067, 0x4541, 0x476c, 0x5046, 0x483c, 0x4e62, 0x3f2d, 0x3b47, 0x3b77, 0x3240, 0x4451, 0x4322, 0x504a, 0x304c, 0x4463, 0x3d3b, 0x3a34, 0x4d24, 0x424e, 0x323f, 0x5049, 0x4d3e, 0x5045, 0x5047, 0x3a6e, 0x5048, 0x5524, 0x5050, 0x5053, 0x5051, 0x3242, 0x4a3b, 0x504b, 0x504f, 0x3873, 0x3b48, 0x3426, 0x5054, 0x504c, 0x4e63, 0x3b78, 0x504d, 0x5052, 0x5055, 0x504e, 0x3621, 0x304d, 0x3622, 0x3241, 0x5525, 0x4b79, 0x496e, 0x3874, 0x3f2f, 0x4e37, 0x4a58, 0x3738, 0x4225, 0x3264, 0x3d53, 0x5059, 0x505e, 0x505c, 0x5057, 0x422f, 0x505a, 0x505d, 0x505b, 0x4a5d, 0x5058, 0x3f2e, 0x4b73, 0x505f, 0x5060, 0x3d24, 0x506d, 0x4750, 0x4936, 0x5068, 0x4a70, 0x3236, 0x506c, 0x5066, 0x506f, 0x4152, 0x3844, 0x475c, 0x6047, 0x506e, 0x455d, 0x5063, 0x3876, 0x3875, 0x5061, 0x3c5a, 0x5069, 0x4a6f, 0x434d, 0x5065, 0x3771, 0x5062, 0x506a, 0x5064, 0x4e51, 0x506b, 0x4f41, 0x3666, 0x3770, 0x5070, 0x5071, 0x5075, 0x304e, 0x4a50, 0x5074, 0x5073, 0x5077, 0x5076, 0x4464, 0x3772, 0x5078, 0x3c45, 0x4226, 0x4465, 0x3676, 0x5079, 0x3536, 0x507a, 0x507c, 0x4b35, 0x3766, 0x3b31, 0x4877, 0x507b, 0x3a45, 0x4d43, 0x507e, 0x5123, 0x507d, 0x3a44, 0x3d7d, 0x3739, 0x5124, 0x364f, 0x5121, 0x5122, 0x462f, 0x417c, 0x3623, 0x4b4d, 0x5125, 0x4e3d, 0x5126, 0x5129, 0x5127, 0x414e, 0x5128, 0x512a, 0x512c, 0x512b, 0x4a48, 0x3537, 0x512e, 0x512f, 0x322f, 0x512d, 0x3c74, 0x5132, 0x5131, 0x5130, 0x5056, 0x5133, 0x3d7e, 0x5134, 0x4d25, 0x4c59, 0x5136, 0x5135, 0x5138, 0x5137, 0x5139, 0x513a, 0x3074, 0x3835, 0x373b, 0x3d3c, 0x437b, 0x3624, 0x4068, 0x3877, 0x396e, 0x513c, 0x4c48, 0x4546, 0x3b79, 0x513b, 0x513d, 0x455e, 0x3375, 0x513e, 0x467e, 0x4134, 0x5140, 0x5141, 0x482c, 0x3878, 0x4f3b, 0x5142, 0x3626, 0x4a3c, 0x4236, 0x3671, 0x4535, 0x3773, 0x5143, 0x5144, 0x4662, 0x315f, 0x5147, 0x3a7d, 0x5146, 0x3a46, 0x5148, 0x666e, 0x5149, 0x4b41, 0x514a, 0x514b, 0x514c, 0x3e69, 0x3c4c, 0x3427, 0x514f, 0x514d, 0x4c3d, 0x514e, 0x495a, 0x5150, 0x5151, 0x5152, 0x455f, 0x5156, 0x5154, 0x5155, 0x5153, 0x3a63, 0x5157, 0x4c6a, 0x4e64, 0x5158, 0x4028, 0x5159, 0x3d5a, 0x515a, 0x437c, 0x4e3f, 0x4560, 0x5245, 0x515b, 0x7425, 0x3645, 0x515c, 0x4b5e, 0x3d68, 0x427c, 0x515e, 0x4664, 0x515f, 0x5160, 0x332e, 0x5161, 0x3627, 0x464c, 0x317a, 0x3d50, 0x4821, 0x5162, 0x4561, 0x3f4f, 0x5163, 0x4a2c, 0x405a, 0x3422, 0x3429, 0x5164, 0x5166, 0x373a, 0x5165, 0x4e73, 0x3d69, 0x483d, 0x4a4c, 0x5167, 0x4d78, 0x5168, 0x5169, 0x457e, 0x516a, 0x4029, 0x3a7e, 0x3774, 0x516b, 0x3b49, 0x396f, 0x4466, 0x516d, 0x4227, 0x3a6f, 0x516e, 0x516f, 0x4130, 0x516c, 0x5171, 0x4b36, 0x3964, 0x5170, 0x3775, 0x3a5e, 0x476d, 0x5174, 0x5172, 0x497b, 0x3e6a, 0x517b, 0x3364, 0x5175, 0x5173, 0x414f, 0x5177, 0x5176, 0x3344, 0x3760, 0x517c, 0x4e2d, 0x5178, 0x517d, 0x517a, 0x5179, 0x4e4f, 0x3879, 0x3243, 0x4e74, 0x3d75, 0x4558, 0x3965, 0x5222, 0x5223, 0x4e65, 0x4f2b, 0x5225, 0x387a, 0x5224, 0x332f, 0x5226, 0x4b56, 0x443c, 0x4d26, 0x4a59, 0x5227, 0x7055, 0x4630, 0x5228, 0x342a, 0x4c33, 0x3e21, 0x5229, 0x4a67, 0x522d, 0x402a, 0x522a, 0x3650, 0x522b, 0x342b, 0x372e, 0x522e, 0x522f, 0x5230, 0x5231, 0x3c5b, 0x387b, 0x4c5e, 0x4c68, 0x4677, 0x4a71, 0x5232, 0x5233, 0x5235, 0x5237, 0x5236, 0x5238, 0x323d, 0x4b4c, 0x3a7c, 0x5239, 0x4159, 0x3e22, 0x3629, 0x523a, 0x485b, 0x523b, 0x523c, 0x523d, 0x523e, 0x4924, 0x3668, 0x3065, 0x463f, 0x523f, 0x3d3d, 0x4069, 0x5241, 0x5240, 0x3e23, 0x3861, 0x5243, 0x483e, 0x5244, 0x485c, 0x4234, 0x426e, 0x3628, 0x466e, 0x4331, 0x476e, 0x4b4e, 0x5246, 0x406a, 0x3735, 0x5247, 0x5248, 0x312c, 0x3075, 0x346d, 0x4228, 0x3551, 0x4d71, 0x524b, 0x3237, 0x524a, 0x362a, 0x524c, 0x4c71, 0x524d, 0x4e52, 0x387c, 0x3836, 0x524e, 0x5250, 0x524f, 0x3f5f, 0x3139, 0x315e, 0x5251, 0x5252, 0x3837, 0x5253, 0x356e, 0x3b32, 0x5254, 0x4b74, 0x3a35, 0x355a, 0x4d27, 0x4150, 0x483f, 0x3c7d, 0x3d47, 0x3c68, 0x3c75, 0x3d76, 0x4840, 0x5257, 0x3143, 0x4151, 0x387d, 0x3845, 0x3667, 0x525b, 0x4321, 0x427e, 0x362b, 0x3e24, 0x525c, 0x525a, 0x3244, 0x4266, 0x3c38, 0x3b4b, 0x3126, 0x3370, 0x3966, 0x3b4a, 0x525d, 0x525e, 0x3549, 0x3346, 0x3967, 0x3548, 0x445f, 0x3125, 0x4631, 0x4c3e, 0x3921, 0x4d79, 0x4547, 0x387e, 0x372f, 0x5267, 0x3663, 0x4b4a, 0x485d, 0x5266, 0x345e, 0x5261, 0x5262, 0x5264, 0x5265, 0x355b, 0x3f61, 0x4a2d, 0x5263, 0x525f, 0x3863, 0x5260, 0x4f24, 0x4a72, 0x4468, 0x3862, 0x3970, 0x5268, 0x465d, 0x526c, 0x3c7e, 0x3c76, 0x526f, 0x526d, 0x4c23, 0x526a, 0x5273, 0x526e, 0x5271, 0x3846, 0x4c3f, 0x5272, 0x5274, 0x5276, 0x3a70, 0x4f42, 0x526b, 0x5269, 0x5275, 0x5270, 0x5278, 0x5323, 0x527a, 0x527e, 0x5321, 0x527b, 0x533e, 0x3a69, 0x3331, 0x5279, 0x5325, 0x3076, 0x5324, 0x3025, 0x494a, 0x5322, 0x527c, 0x5277, 0x527d, 0x3a48, 0x5326, 0x3077, 0x532f, 0x5327, 0x5328, 0x3e25, 0x4b69, 0x532d, 0x532c, 0x452f, 0x532e, 0x532b, 0x3134, 0x3a36, 0x3f30, 0x5329, 0x4562, 0x532a, 0x3022, 0x5334, 0x4d23, 0x3e27, 0x533a, 0x5339, 0x5330, 0x4243, 0x5331, 0x426f, 0x5336, 0x3e26, 0x5333, 0x4c64, 0x373c, 0x5337, 0x5338, 0x5335, 0x533b, 0x5332, 0x5341, 0x5346, 0x5342, 0x533d, 0x5347, 0x4131, 0x5349, 0x3922, 0x533f, 0x437d, 0x5343, 0x533c, 0x342d, 0x346e, 0x3365, 0x5344, 0x5340, 0x3776, 0x534a, 0x5348, 0x4153, 0x354a, 0x362c, 0x5345, 0x3674, 0x3144, 0x534e, 0x534c, 0x5427, 0x5351, 0x534b, 0x534f, 0x534d, 0x3b4c, 0x5350, 0x5353, 0x5358, 0x5356, 0x5355, 0x4332, 0x3245, 0x5352, 0x5354, 0x3e28, 0x3133, 0x5357, 0x325e, 0x5362, 0x3e7c, 0x535e, 0x535c, 0x535d, 0x535f, 0x313d, 0x4139, 0x5359, 0x535a, 0x337a, 0x5361, 0x346f, 0x5364, 0x5360, 0x5363, 0x4a2e, 0x4655, 0x4838, 0x5366, 0x5365, 0x3345, 0x5367, 0x536a, 0x5369, 0x5368, 0x4739, 0x536b, 0x536c, 0x536e, 0x536d, 0x5370, 0x5373, 0x5371, 0x536f, 0x5372, 0x5374, 0x5375, 0x5376, 0x5377, 0x5378, 0x5145, 0x3c7c, 0x3b4d, 0x3273, 0x3078, 0x4344, 0x5379, 0x3a24, 0x304f, 0x3f5e, 0x537a, 0x3847, 0x3971, 0x537c, 0x537b, 0x4a60, 0x537d, 0x5421, 0x537e, 0x5422, 0x5423, 0x3777, 0x3160, 0x5424, 0x5426, 0x5425, 0x5428, 0x455a, 0x5429, 0x3035, 0x3a5f, 0x373d, 0x434f, 0x542a, 0x542b, 0x542d, 0x542e, 0x3a64, 0x3651, 0x4b37, 0x542c, 0x542f, 0x3a41, 0x3923, 0x5433, 0x3a25, 0x4333, 0x5430, 0x445a, 0x5434, 0x3f62, 0x5432, 0x5435, 0x373f, 0x5436, 0x5437, 0x3924, 0x3340, 0x5439, 0x543a, 0x543b, 0x5438, 0x5431, 0x543c, 0x543d, 0x4b64, 0x3e6b, 0x543f, 0x5440, 0x543e, 0x5442, 0x4738, 0x3068, 0x4956, 0x5443, 0x3e7d, 0x3c39, 0x475d, 0x3470, 0x3a6b, 0x4b59, 0x4632, 0x3778, 0x424f, 0x5441, 0x5444, 0x4244, 0x5445, 0x5446, 0x5448, 0x4469, 0x342e, 0x7421, 0x3161, 0x4a73, 0x3e6c, 0x4548, 0x3a66, 0x544e, 0x4a3d, 0x4e5d, 0x3274, 0x544a, 0x413a, 0x544d, 0x4563, 0x4549, 0x4564, 0x4839, 0x444d, 0x3a49, 0x5449, 0x3176, 0x4536, 0x544b, 0x5447, 0x3f50, 0x544f, 0x3d4e, 0x362d, 0x5450, 0x4a68, 0x417d, 0x4446, 0x5452, 0x4b4f, 0x5453, 0x5458, 0x4a2f, 0x5457, 0x5451, 0x5454, 0x5456, 0x3a26, 0x4a49, 0x5459, 0x4345, 0x3275, 0x3e6d, 0x545b, 0x545a, 0x3968, 0x545c, 0x545e, 0x545d, 0x5460, 0x5455, 0x5462, 0x5461, 0x545f, 0x3b4e, 0x3f51, 0x4154, 0x5463, 0x403c, 0x306d, 0x4764, 0x445b, 0x5465, 0x5464, 0x5466, 0x5467, 0x5468, 0x5469, 0x4a51, 0x546a, 0x3246, 0x546b, 0x4d3c, 0x3330, 0x5249, 0x3d48, 0x423f, 0x546c, 0x4c6b, 0x4c34, 0x546e, 0x4267, 0x4537, 0x4240, 0x4957, 0x546f, 0x5470, 0x317b, 0x3c3a, 0x5471, 0x3050, 0x5472, 0x5473, 0x3162, 0x3471, 0x4660, 0x4a74, 0x5477, 0x4155, 0x5476, 0x3740, 0x4b5b, 0x5475, 0x4565, 0x5479, 0x5478, 0x547b, 0x547a, 0x317c, 0x547c, 0x3e29, 0x547e, 0x4325, 0x547d, 0x4a33, 0x3d77, 0x455b, 0x5521, 0x3925, 0x5522, 0x4721, 0x485e, 0x4c51, 0x4725, 0x552b, 0x3538, 0x4d45, 0x4c2f, 0x562c, 0x5523, 0x5526, 0x4245, 0x4b38, 0x454a, 0x5527, 0x4b65, 0x3a4a, 0x3e2a, 0x5528, 0x3b50, 0x3b4f, 0x3039, 0x3848, 0x402b, 0x3051, 0x552c, 0x552d, 0x552a, 0x3138, 0x342f, 0x5529, 0x4c45, 0x4931, 0x3028, 0x3079, 0x3b51, 0x3052, 0x3023, 0x5532, 0x5530, 0x4c3c, 0x5533, 0x5531, 0x552f, 0x3f31, 0x552e, 0x4a5a, 0x3864, 0x5537, 0x5538, 0x3e2b, 0x5534, 0x4f2c, 0x474c, 0x5536, 0x3a27, 0x5539, 0x4958, 0x553a, 0x5535, 0x4c3b, 0x475e, 0x553b, 0x4932, 0x553c, 0x5540, 0x553d, 0x3247, 0x553f, 0x3c3b, 0x553e, 0x3779, 0x554c, 0x5545, 0x5542, 0x4364, 0x5541, 0x5543, 0x5544, 0x5546, 0x5547, 0x3472, 0x5549, 0x5548, 0x554a, 0x3e6e, 0x554d, 0x445c, 0x3145, 0x554b, 0x554e, 0x554f, 0x5552, 0x5550, 0x5551, 0x3b52, 0x5553, 0x3926, 0x5554, 0x3b7a, 0x4238, 0x5555, 0x5556, 0x3b5a, 0x3927, 0x4c52, 0x3528, 0x3849, 0x5557, 0x3358, 0x5558, 0x4239, 0x5559, 0x5623, 0x555a, 0x555b, 0x555c, 0x555e, 0x555f, 0x5560, 0x4270, 0x3127, 0x3c69, 0x3042, 0x4157, 0x3430, 0x3c35, 0x3928, 0x4566, 0x3d21, 0x3431, 0x4368, 0x446a, 0x3038, 0x3539, 0x4a75, 0x3c42, 0x3552, 0x406b, 0x3c3c, 0x4d28, 0x5561, 0x355c, 0x3a4b, 0x3332, 0x3163, 0x3e2c, 0x3248, 0x5562, 0x4d46, 0x3d49, 0x3c64, 0x5563, 0x3473, 0x4652, 0x4c29, 0x5564, 0x5565, 0x4959, 0x5567, 0x3428, 0x3677, 0x5566, 0x3432, 0x3f32, 0x556b, 0x3b21, 0x3249, 0x556a, 0x5568, 0x556c, 0x5569, 0x472b, 0x5c4d, 0x3f33, 0x556d, 0x4e40, 0x556e, 0x5570, 0x437e, 0x556f, 0x4023, 0x3b7b, 0x4250, 0x3c77, 0x4975, 0x406c, 0x3c4d, 0x5571, 0x3e2d, 0x5572, 0x5573, 0x3053, 0x423a, 0x3f52, 0x5574, 0x4633, 0x3e2e, 0x3e2f, 0x5575, 0x406d, 0x3e30, 0x5576, 0x5577, 0x4c60, 0x5578, 0x3646, 0x3d22, 0x5579, 0x557a, 0x3c5c, 0x3f2c, 0x4674, 0x3f54, 0x4878, 0x4722, 0x3649, 0x557b, 0x356f, 0x557c, 0x367e, 0x464f, 0x3230, 0x3b53, 0x557d, 0x5622, 0x5621, 0x367d, 0x557e, 0x4538, 0x4230, 0x454b, 0x3c48, 0x4158, 0x4d7a, 0x5624, 0x5625, 0x4656, 0x3b33, 0x5627, 0x5628, 0x5629, 0x3474, 0x562a, 0x562b, 0x322c, 0x413b, 0x3464, 0x562d, 0x4c28, 0x4252, 0x3359, 0x562f, 0x5631, 0x345f, 0x562e, 0x5630, 0x5633, 0x5632, 0x5634, 0x5635, 0x463d, 0x362e, 0x3265, 0x5636, 0x563b, 0x5639, 0x4a77, 0x4a76, 0x4567, 0x5638, 0x3d54, 0x5637, 0x3f72, 0x563c, 0x3a6a, 0x5642, 0x5643, 0x563d, 0x3333, 0x563e, 0x5647, 0x5646, 0x5645, 0x5641, 0x5640, 0x5644, 0x4a78, 0x564b, 0x5648, 0x564a, 0x4d72, 0x5649, 0x563f, 0x3f73, 0x564c, 0x3a37, 0x564d, 0x564e, 0x5651, 0x5650, 0x564f, 0x4568, 0x563a, 0x5657, 0x5653, 0x5652, 0x5654, 0x5655, 0x5658, 0x4e66, 0x5659, 0x5656, 0x565a, 0x3460, 0x565b, 0x565d, 0x565c, 0x565e, 0x565f, 0x406e, 0x3d23, 0x3d64, 0x4163, 0x3929, 0x3a38, 0x392a, 0x3570, 0x5660, 0x3a39, 0x384a, 0x5661, 0x4c26, 0x4743, 0x5662, 0x392b, 0x342c, 0x4327, 0x3652, 0x3b54, 0x495b, 0x4841, 0x5663, 0x3475, 0x5666, 0x4421, 0x5665, 0x5664, 0x5667, 0x446b, 0x3f63, 0x3b55, 0x404a, 0x4253, 0x3522, 0x4422, 0x5668, 0x5669, 0x3e6f, 0x4b39, 0x566c, 0x566b, 0x566a, 0x497d, 0x5673, 0x4b5a, 0x566d, 0x566f, 0x4b6b, 0x566e, 0x5670, 0x4828, 0x5671, 0x4a3e, 0x5672, 0x3433, 0x4a3f, 0x472f, 0x5674, 0x5675, 0x392c, 0x3434, 0x5676, 0x3838, 0x4d44, 0x4d29, 0x3476, 0x5678, 0x4423, 0x392d, 0x3e31, 0x485f, 0x3e32, 0x3d78, 0x446c, 0x4a79, 0x4539, 0x392e, 0x495c, 0x5679, 0x4559, 0x3a42, 0x384b, 0x446d, 0x3043, 0x3d6e, 0x392f, 0x4d47, 0x567a, 0x567b, 0x4751, 0x567c, 0x4e77, 0x4f2d, 0x567e, 0x567d, 0x3347, 0x5721, 0x5724, 0x5725, 0x5723, 0x4940, 0x3e33, 0x5727, 0x5726, 0x5722, 0x5728, 0x5729, 0x572a, 0x572d, 0x572b, 0x572c, 0x572e, 0x3164, 0x446e, 0x572f, 0x377a, 0x3276, 0x4736, 0x5730, 0x467b, 0x4a5b, 0x5731, 0x4f2e, 0x5732, 0x4a40, 0x5735, 0x5021, 0x5031, 0x3c30, 0x4675, 0x5736, 0x355d, 0x4424, 0x307a, 0x5737, 0x4a26, 0x3930, 0x4350, 0x446f, 0x4c6f, 0x3839, 0x384c, 0x5738, 0x5739, 0x573f, 0x3c65, 0x4425, 0x362f, 0x573a, 0x492b, 0x4346, 0x573b, 0x573c, 0x3630, 0x573d, 0x573e, 0x5740, 0x4576, 0x5741, 0x5742, 0x5743, 0x5734, 0x5733, 0x5744, 0x3741, 0x4927, 0x3a4c, 0x4937, 0x4426, 0x494b, 0x5745, 0x3e34, 0x3146, 0x5746, 0x5747, 0x4c72, 0x4860, 0x574a, 0x317d, 0x402c, 0x5749, 0x5748, 0x3742, 0x4254, 0x574e, 0x574c, 0x574b, 0x4e27, 0x3865, 0x3d79, 0x574d, 0x454c, 0x3d3e, 0x4640, 0x5751, 0x5750, 0x574f, 0x5752, 0x3866, 0x5753, 0x497c, 0x3d5b, 0x5754, 0x4879, 0x4641, 0x4427, 0x4530, 0x5755, 0x352b, 0x3f34, 0x492c, 0x3477, 0x4726, 0x5756, 0x3b56, 0x4b3a, 0x4b3b, 0x317e, 0x575b, 0x4369, 0x5758, 0x3277, 0x582d, 0x575a, 0x4730, 0x5759, 0x5757, 0x397a, 0x575d, 0x5763, 0x5769, 0x5761, 0x455c, 0x5766, 0x495d, 0x5760, 0x5765, 0x4e67, 0x3b57, 0x4255, 0x575e, 0x355e, 0x5768, 0x402d, 0x3165, 0x5762, 0x3278, 0x5767, 0x3631, 0x5764, 0x576a, 0x576c, 0x5776, 0x5774, 0x5771, 0x5770, 0x4e78, 0x5772, 0x3632, 0x3931, 0x3d7a, 0x5779, 0x576b, 0x576f, 0x575f, 0x327a, 0x5773, 0x5775, 0x4351, 0x3a28, 0x3238, 0x576d, 0x5778, 0x5777, 0x3633, 0x4229, 0x3366, 0x3743, 0x576e, 0x577a, 0x577d, 0x5821, 0x3c3d, 0x5827, 0x4470, 0x577b, 0x5825, 0x3279, 0x5823, 0x5824, 0x577e, 0x5822, 0x3867, 0x4d2a, 0x3435, 0x3159, 0x5826, 0x473a, 0x302d, 0x4861, 0x575c, 0x582c, 0x5830, 0x4c65, 0x5829, 0x4569, 0x582e, 0x3e70, 0x582f, 0x4657, 0x4f47, 0x582b, 0x5831, 0x397b, 0x404b, 0x3054, 0x582a, 0x5828, 0x415a, 0x577c, 0x3b34, 0x4246, 0x583d, 0x415b, 0x5838, 0x5835, 0x5836, 0x3c66, 0x5839, 0x583c, 0x5837, 0x3d25, 0x583a, 0x5834, 0x4c7c, 0x4c7b, 0x583e, 0x583f, 0x3055, 0x5833, 0x3672, 0x3026, 0x3436, 0x583b, 0x5843, 0x5842, 0x5847, 0x5848, 0x5846, 0x5849, 0x5841, 0x5845, 0x584a, 0x584b, 0x5840, 0x3b7c, 0x5844, 0x4256, 0x3932, 0x5832, 0x3f35, 0x5858, 0x4a69, 0x584e, 0x584f, 0x5850, 0x5857, 0x5856, 0x4b7d, 0x3437, 0x5854, 0x3745, 0x3334, 0x5851, 0x4e38, 0x5853, 0x3056, 0x5855, 0x584c, 0x5852, 0x5859, 0x3744, 0x584d, 0x4d5d, 0x4d2b, 0x585c, 0x5860, 0x417e, 0x4e79, 0x5861, 0x585e, 0x585b, 0x585a, 0x585f, 0x4a30, 0x4634, 0x3746, 0x5862, 0x585d, 0x5863, 0x377b, 0x3231, 0x586b, 0x3438, 0x5869, 0x586a, 0x3a29, 0x5868, 0x5866, 0x5865, 0x586c, 0x5864, 0x586e, 0x327b, 0x5870, 0x586f, 0x4428, 0x5873, 0x5871, 0x5867, 0x377c, 0x5872, 0x5876, 0x5875, 0x5877, 0x5874, 0x5878, 0x5879, 0x587a, 0x4a6a, 0x587c, 0x587b, 0x3d3f, 0x402e, 0x3266, 0x327c, 0x587d, 0x303f, 0x404c, 0x587e, 0x6c43, 0x5921, 0x3761, 0x5922, 0x406f, 0x5923, 0x5924, 0x353a, 0x5925, 0x5926, 0x5927, 0x4257, 0x384d, 0x4c61, 0x4b3c, 0x3d6a, 0x5928, 0x4070, 0x6e3d, 0x4862, 0x3c6a, 0x3a4d, 0x5929, 0x4247, 0x4a27, 0x4271, 0x592c, 0x592a, 0x592d, 0x592b, 0x592e, 0x4a31, 0x3037, 0x495e, 0x4863, 0x592f, 0x5932, 0x3e35, 0x353b, 0x5930, 0x5937, 0x3e36, 0x5931, 0x4744, 0x4d5e, 0x5933, 0x5934, 0x5938, 0x456a, 0x5935, 0x3933, 0x405e, 0x5946, 0x4834, 0x4272, 0x4864, 0x5a2d, 0x4a7a, 0x4471, 0x4b75, 0x593b, 0x3221, 0x436a, 0x5944, 0x4334, 0x593e, 0x5945, 0x5940, 0x5947, 0x5943, 0x5942, 0x476f, 0x593c, 0x327d, 0x593a, 0x3571, 0x4273, 0x5936, 0x5939, 0x3934, 0x405b, 0x3e37, 0x5941, 0x4752, 0x3572, 0x3348, 0x3367, 0x3f21, 0x5949, 0x594e, 0x594a, 0x377d, 0x594f, 0x3b22, 0x3969, 0x3d26, 0x593d, 0x3b7d, 0x594c, 0x3b58, 0x594d, 0x3044, 0x5948, 0x4429, 0x3573, 0x3634, 0x594b, 0x3027, 0x3a43, 0x3f36, 0x4472, 0x4854, 0x5951, 0x415e, 0x422a, 0x3b2b, 0x5952, 0x5954, 0x5950, 0x4a61, 0x443d, 0x415c, 0x4a7b, 0x3c4e, 0x5960, 0x595f, 0x3f78, 0x377e, 0x5959, 0x3e39, 0x4668, 0x4731, 0x5957, 0x415d, 0x3c78, 0x595c, 0x3e38, 0x5956, 0x595b, 0x4753, 0x5955, 0x3721, 0x335d, 0x595d, 0x4e2b, 0x3a4e, 0x4335, 0x595a, 0x405c, 0x3935, 0x3f64, 0x3166, 0x413c, 0x5958, 0x3545, 0x3747, 0x444f, 0x595e, 0x415f, 0x5961, 0x5963, 0x4237, 0x5969, 0x5964, 0x5966, 0x4941, 0x4473, 0x5967, 0x4d2c, 0x4d48, 0x3439, 0x302e, 0x5965, 0x5962, 0x3478, 0x3167, 0x5968, 0x4d49, 0x596c, 0x423b, 0x5973, 0x596d, 0x596a, 0x5971, 0x5953, 0x596e, 0x5972, 0x4842, 0x456b, 0x596b, 0x596f, 0x3748, 0x3a71, 0x405d, 0x5977, 0x4526, 0x5974, 0x4b60, 0x5975, 0x5976, 0x4c4e, 0x4022, 0x3762, 0x597d, 0x3b35, 0x597a, 0x5979, 0x4732, 0x4635, 0x4531, 0x597b, 0x597c, 0x496f, 0x4745, 0x3b23, 0x4071, 0x4b50, 0x3349, 0x5a25, 0x597e, 0x4d4a, 0x5a27, 0x5a23, 0x5a24, 0x4160, 0x5a22, 0x593f, 0x5a26, 0x5a21, 0x5a2b, 0x5a2c, 0x4527, 0x5a2e, 0x3b24, 0x5a29, 0x353c, 0x5a2f, 0x5a28, 0x5a33, 0x5a32, 0x5a31, 0x5a34, 0x5a36, 0x3e71, 0x5a35, 0x5a39, 0x5a37, 0x5a38, 0x5970, 0x5a3b, 0x5a3a, 0x5978, 0x5a3c, 0x5a30, 0x3b59, 0x5a3d, 0x5a3e, 0x5a40, 0x5a3f, 0x5a41, 0x327e, 0x3936, 0x4a7c, 0x402f, 0x384e, 0x5a43, 0x5a46, 0x4952, 0x355f, 0x5a45, 0x5a44, 0x4754, 0x5a47, 0x3635, 0x5a49, 0x5a48, 0x343a, 0x3b36, 0x4658, 0x3749, 0x3f74, 0x5a4a, 0x4030, 0x4528, 0x495f, 0x5a4b, 0x5a4c, 0x5a4d, 0x4a38, 0x555d, 0x4046, 0x494c, 0x3a58, 0x4865, 0x4843, 0x454d, 0x4e41, 0x5a4f, 0x3c50, 0x5a50, 0x3036, 0x3654, 0x404d, 0x4960, 0x5a51, 0x3b42, 0x4347, 0x3b5b, 0x3f37, 0x5a52, 0x4a7d, 0x3177, 0x3b5c, 0x5a55, 0x5a53, 0x5a56, 0x4e39, 0x5a54, 0x407b, 0x5a57, 0x4232, 0x5a58, 0x347a, 0x5a5a, 0x5a59, 0x5a5b, 0x5a5c, 0x347b, 0x467c, 0x4336, 0x356c, 0x3b5d, 0x4161, 0x3d5c, 0x3030, 0x5a5d, 0x3222, 0x5a61, 0x3937, 0x5a60, 0x3a2b, 0x3e3a, 0x5a5f, 0x3e3b, 0x4c40, 0x3a2a, 0x3057, 0x404e, 0x5a66, 0x4031, 0x3147, 0x3d55, 0x4b66, 0x3a72, 0x3e3c, 0x4027, 0x5a65, 0x5a63, 0x5a64, 0x436b, 0x5b26, 0x5a6a, 0x3b7e, 0x3938, 0x5a68, 0x5a69, 0x3f38, 0x5a67, 0x3b2f, 0x5a6c, 0x5a6b, 0x5a70, 0x5a71, 0x5a6d, 0x3322, 0x5a6e, 0x5a6f, 0x4855, 0x4961, 0x374a, 0x5a72, 0x4032, 0x3e3d, 0x4352, 0x3647, 0x5a73, 0x5a77, 0x324b, 0x5a74, 0x5a76, 0x5a75, 0x3d6b, 0x4348, 0x3045, 0x5a78, 0x5a79, 0x442a, 0x4e71, 0x3b43, 0x4a6b, 0x4b3d, 0x5b22, 0x5a7b, 0x5a7e, 0x5a7d, 0x5a7a, 0x5b21, 0x465e, 0x5a7c, 0x5b23, 0x3d6c, 0x5b24, 0x4d4b, 0x4778, 0x5b25, 0x5b27, 0x5b28, 0x5b29, 0x364a, 0x3148, 0x3939, 0x5b2a, 0x5b2b, 0x3d71, 0x4162, 0x5258, 0x413e, 0x413d, 0x4258, 0x3a47, 0x5072, 0x376e, 0x4d2d, 0x4a7e, 0x497e, 0x5b2c, 0x3a73, 0x443f, 0x5b2d, 0x4f2f, 0x4b3e, 0x442b, 0x5b2e, 0x347c, 0x5b2f, 0x5b30, 0x4c5a, 0x4c24, 0x4b76, 0x4b5c, 0x3b25, 0x5b32, 0x3c6b, 0x4b51, 0x5b34, 0x5b37, 0x5b36, 0x3479, 0x3560, 0x5b33, 0x5b35, 0x5b38, 0x3f79, 0x4d7b, 0x3049, 0x3a60, 0x423c, 0x3c5d, 0x3e73, 0x5b3b, 0x454e, 0x5b39, 0x422b, 0x5b3a, 0x3e72, 0x4c5d, 0x5b3c, 0x5b3d, 0x4d68, 0x5b42, 0x393a, 0x4755, 0x5b3f, 0x456c, 0x5a5e, 0x5a62, 0x354f, 0x4747, 0x5b41, 0x3e3e, 0x4844, 0x5b47, 0x487a, 0x5b3e, 0x5b44, 0x5b43, 0x404f, 0x4b6d, 0x4e53, 0x4b67, 0x324c, 0x3b5e, 0x4f48, 0x5b46, 0x3f75, 0x5b45, 0x5b40, 0x384f, 0x5b4c, 0x5b4a, 0x324d, 0x5b48, 0x5b4e, 0x5b54, 0x4248, 0x4a41, 0x5b56, 0x4922, 0x5b55, 0x4770, 0x4b3f, 0x343b, 0x4077, 0x3d40, 0x4453, 0x4d2e, 0x5b51, 0x5b50, 0x5b52, 0x5b4f, 0x5b57, 0x5b4d, 0x5b4b, 0x5b53, 0x5b49, 0x436c, 0x4c78, 0x3c46, 0x3a74, 0x3a3a, 0x4b6f, 0x3341, 0x444e, 0x464a, 0x3149, 0x4072, 0x4034, 0x372a, 0x5b59, 0x393b, 0x337c, 0x5b5b, 0x3374, 0x5b61, 0x5b5e, 0x4073, 0x334b, 0x3a2c, 0x334a, 0x3a4f, 0x5b5c, 0x3765, 0x374b, 0x456d, 0x5b5a, 0x3046, 0x5b5d, 0x5b5f, 0x364d, 0x372c, 0x343c, 0x354b, 0x5b62, 0x3a79, 0x4b71, 0x3b37, 0x5b63, 0x4930, 0x5b6f, 0x3233, 0x5b64, 0x5b75, 0x5b65, 0x4e42, 0x5b6c, 0x475f, 0x5b74, 0x5b67, 0x3034, 0x5b69, 0x393c, 0x5b6b, 0x5b6a, 0x5b66, 0x5b71, 0x3e3f, 0x546d, 0x3868, 0x4d7c, 0x5b68, 0x4474, 0x3323, 0x3a2d, 0x5b60, 0x5b70, 0x3361, 0x5b6e, 0x5b72, 0x456e, 0x347e, 0x5c32, 0x4c49, 0x5b77, 0x347d, 0x5b7e, 0x4b40, 0x5c21, 0x5c23, 0x5c27, 0x5b79, 0x432a, 0x456f, 0x5c2b, 0x5b7c, 0x5c28, 0x5c22, 0x3f39, 0x5c2c, 0x4033, 0x5c2a, 0x343d, 0x4f50, 0x5b76, 0x5c26, 0x3058, 0x5b78, 0x4c3a, 0x5b7d, 0x3f22, 0x4447, 0x5b73, 0x5c25, 0x3f7a, 0x5c2f, 0x3371, 0x3821, 0x5c31, 0x5b7a, 0x5c30, 0x5c29, 0x5b7b, 0x5c2d, 0x5c2e, 0x5c3f, 0x464e, 0x5c24, 0x5c3b, 0x5c3d, 0x4458, 0x4d4c, 0x4976, 0x5c38, 0x424a, 0x5c3e, 0x413f, 0x5c35, 0x5c42, 0x5c41, 0x466f, 0x5c40, 0x466a, 0x5c44, 0x5c37, 0x3648, 0x5c3a, 0x3d5d, 0x4760, 0x5c3c, 0x364b, 0x5c34, 0x5c36, 0x5c33, 0x4f30, 0x335a, 0x5c39, 0x5c43, 0x3335, 0x3a67, 0x315d, 0x5c54, 0x4f31, 0x5c57, 0x3f3a, 0x5c56, 0x5c55, 0x5c52, 0x5c46, 0x5c63, 0x5c45, 0x5c58, 0x5c50, 0x5c4b, 0x5c48, 0x5c49, 0x5c51, 0x7422, 0x5c4e, 0x393d, 0x4448, 0x4164, 0x5c4c, 0x5c47, 0x5c4a, 0x4d4d, 0x4b6a, 0x5c4f, 0x5c59, 0x5c61, 0x5c5a, 0x5c67, 0x5c65, 0x5c60, 0x5c5f, 0x4450, 0x4165, 0x5c5d, 0x5c5b, 0x5c62, 0x5c68, 0x4875, 0x5c6e, 0x5c69, 0x5c6c, 0x5c66, 0x4374, 0x4938, 0x5c5c, 0x5c64, 0x3e40, 0x4c4f, 0x5c78, 0x5c6b, 0x3822, 0x3223, 0x335f, 0x5c53, 0x3e41, 0x5c70, 0x5c77, 0x3c79, 0x3372, 0x432e, 0x5c6d, 0x5c72, 0x5c76, 0x3636, 0x354c, 0x5c74, 0x3521, 0x464b, 0x5c73, 0x5c75, 0x5c6f, 0x5c71, 0x3360, 0x4349, 0x5c7c, 0x5c7a, 0x3869, 0x5c79, 0x5d21, 0x5b58, 0x5c7b, 0x5c7d, 0x5c7e, 0x5d2c, 0x5d28, 0x5b6d, 0x5d27, 0x5d26, 0x5d23, 0x5c6a, 0x5d25, 0x5d24, 0x5d2a, 0x4f26, 0x5d2d, 0x367b, 0x5d29, 0x5d2b, 0x4827, 0x5d2e, 0x5d32, 0x5d2f, 0x4d73, 0x5d30, 0x5c5e, 0x5d33, 0x5d34, 0x3135, 0x5d36, 0x3767, 0x3c21, 0x3655, 0x3224, 0x4d5f, 0x5d38, 0x5d37, 0x5d3a, 0x353d, 0x3656, 0x343e, 0x5d3d, 0x5d3c, 0x5d3e, 0x324e, 0x4337, 0x5d3f, 0x343f, 0x5d41, 0x5d40, 0x5d42, 0x5d43, 0x5d44, 0x3b5f, 0x4035, 0x3a21, 0x4970, 0x4a62, 0x4f44, 0x3b75, 0x3a50, 0x4e72, 0x5d45, 0x5d46, 0x3b60, 0x5d47, 0x5d48, 0x5d4a, 0x5d49, 0x4b58, 0x3d5e, 0x3c6c, 0x3b44, 0x5d4b, 0x5d4d, 0x3f23, 0x5d4c, 0x5d4e, 0x5d4f, 0x5d50, 0x5d51, 0x5d52, 0x5d54, 0x5d53, 0x5d55, 0x3225, 0x434a, 0x5d56, 0x3b26, 0x334c, 0x5d57, 0x4542, 0x544c, 0x3523, 0x5d58, 0x5d59, 0x4a6c, 0x4b68, 0x4647, 0x5d5a, 0x4866, 0x487b, 0x4c53, 0x5d5b, 0x5d5d, 0x5d5c, 0x5d5f, 0x5d5e, 0x5d61, 0x3b61, 0x4c31, 0x5d62, 0x5d63, 0x3524, 0x5d64, 0x5d66, 0x5d65, 0x3f65, 0x4939, 0x314a, 0x4845, 0x4475, 0x3d41, 0x3561, 0x4846, 0x3c2e, 0x5d68, 0x3440, 0x3178, 0x4672, 0x5d67, 0x393e, 0x4353, 0x5d69, 0x5d71, 0x5d6a, 0x4241, 0x3562, 0x5d72, 0x3768, 0x3525, 0x5d70, 0x5d6e, 0x5d6b, 0x4d60, 0x4440, 0x4659, 0x5d6c, 0x5d74, 0x5d73, 0x3723, 0x322d, 0x3a3b, 0x5d6d, 0x5d6f, 0x4b57, 0x4274, 0x4b77, 0x5d7c, 0x5d7d, 0x324f, 0x4a28, 0x4c7d, 0x5e21, 0x3c23, 0x3e42, 0x5d78, 0x5d7e, 0x3168, 0x3637, 0x5d75, 0x5d7a, 0x4074, 0x4771, 0x4867, 0x5d77, 0x4b21, 0x5d79, 0x5e24, 0x5e22, 0x5d7b, 0x4b22, 0x4748, 0x3563, 0x4525, 0x436d, 0x5e25, 0x5e23, 0x4259, 0x5d76, 0x314b, 0x4d4e, 0x5e30, 0x5e2f, 0x4076, 0x5e2c, 0x4d6c, 0x4636, 0x5e26, 0x4445, 0x314c, 0x393f, 0x5e29, 0x3d27, 0x5e2e, 0x5e2d, 0x5e28, 0x5e2b, 0x3368, 0x5e2a, 0x4749, 0x4e2e, 0x3e74, 0x4075, 0x5e36, 0x5e34, 0x494d, 0x5e31, 0x5e33, 0x313a, 0x3940, 0x4f32, 0x333d, 0x4962, 0x4d61, 0x3324, 0x3f3b, 0x5e35, 0x5e3a, 0x3e43, 0x4d30, 0x5e37, 0x5e32, 0x5e38, 0x4e5e, 0x4573, 0x4642, 0x3336, 0x3155, 0x5e3e, 0x5e41, 0x4e43, 0x4d64, 0x5e48, 0x5e42, 0x5e3f, 0x4e54, 0x5e45, 0x3d4a, 0x5e47, 0x5e4c, 0x4571, 0x5e4a, 0x5e44, 0x4338, 0x5e4b, 0x5e40, 0x5e46, 0x5e4d, 0x307c, 0x5e43, 0x5e4e, 0x3f3c, 0x3d5f, 0x4a25, 0x3a2e, 0x5e3b, 0x5e49, 0x453a, 0x4036, 0x3369, 0x3a51, 0x3e44, 0x5e3d, 0x3d42, 0x374c, 0x5e3c, 0x5e52, 0x3d6d, 0x383a, 0x5e61, 0x5e5b, 0x3574, 0x454f, 0x5e56, 0x5e5f, 0x302f, 0x3132, 0x3239, 0x5e58, 0x422c, 0x5e4f, 0x5e51, 0x3941, 0x5e62, 0x5e5d, 0x5e55, 0x5e5c, 0x4c2b, 0x5e5a, 0x5e5e, 0x3850, 0x3e45, 0x4339, 0x5e54, 0x4d2f, 0x5e57, 0x5e50, 0x4572, 0x5e53, 0x5e59, 0x4f51, 0x3c3e, 0x4b7e, 0x5e63, 0x482e, 0x5e6f, 0x383b, 0x3d60, 0x5e65, 0x4e2f, 0x3942, 0x5e72, 0x306e, 0x5e70, 0x5e64, 0x5e6a, 0x5e6c, 0x4d4f, 0x5e67, 0x452e, 0x5e69, 0x5e71, 0x5e6b, 0x4c47, 0x5e66, 0x3c22, 0x5e7e, 0x336a, 0x5e68, 0x5e6d, 0x5e6e, 0x426c, 0x425a, 0x5e76, 0x5e7c, 0x5e7a, 0x4529, 0x5f23, 0x5e77, 0x5e78, 0x5e60, 0x3579, 0x493a, 0x3c3f, 0x3977, 0x4f33, 0x5e74, 0x5f22, 0x3169, 0x4166, 0x4779, 0x3441, 0x4e7a, 0x4c21, 0x4452, 0x5e7b, 0x5e7d, 0x4132, 0x5f21, 0x5e79, 0x5e73, 0x3443, 0x3769, 0x5f2f, 0x5f2a, 0x4078, 0x3363, 0x3d61, 0x5f33, 0x5f2c, 0x442c, 0x5f29, 0x4459, 0x5f4c, 0x5f26, 0x5f25, 0x5f2e, 0x5f28, 0x5f27, 0x5f2d, 0x4021, 0x5f24, 0x5f30, 0x5f31, 0x3442, 0x5f36, 0x5f35, 0x5f37, 0x5f3a, 0x4543, 0x5f34, 0x5f38, 0x3763, 0x4279, 0x5f32, 0x473b, 0x5f39, 0x5f3e, 0x5f3c, 0x5f3f, 0x5f42, 0x5f3b, 0x396a, 0x4728, 0x5e39, 0x4d74, 0x5f3d, 0x5f41, 0x4275, 0x5f40, 0x5f2b, 0x6f69, 0x5f45, 0x5f49, 0x5f47, 0x5f43, 0x5f44, 0x5f48, 0x5f46, 0x494e, 0x5f4e, 0x5f4b, 0x5f4a, 0x5f4d, 0x4654, 0x5f4f, 0x4375, 0x426d, 0x4025, 0x5f50, 0x5f52, 0x5f51, 0x5e75, 0x5f53, 0x4667, 0x5f54, 0x3250, 0x4574, 0x3325, 0x3564, 0x3c5e, 0x3a52, 0x4f27, 0x3f66, 0x316a, 0x5f56, 0x5f55, 0x5f59, 0x433a, 0x5f5c, 0x5f57, 0x5f5b, 0x5f5a, 0x4540, 0x3059, 0x4e75, 0x5f5e, 0x3128, 0x5f60, 0x5f5f, 0x5f5d, 0x5f58, 0x4b23, 0x5f62, 0x5f61, 0x316b, 0x5f64, 0x4a32, 0x5f63, 0x4c35, 0x3e47, 0x4133, 0x3e46, 0x4e7b, 0x5f6a, 0x4079, 0x5f66, 0x5f6b, 0x316c, 0x5f69, 0x4761, 0x5f65, 0x5f68, 0x3e48, 0x4851, 0x5f6c, 0x3c51, 0x407a, 0x5f6f, 0x5f67, 0x3727, 0x5f6d, 0x4d50, 0x5f70, 0x7426, 0x3d4f, 0x5f71, 0x5f72, 0x472e, 0x5f74, 0x5f75, 0x4733, 0x4575, 0x5f77, 0x5f79, 0x4e55, 0x5f76, 0x5f78, 0x316d, 0x5f73, 0x535b, 0x5f7a, 0x4167, 0x3b38, 0x5f7c, 0x5f7b, 0x3f24, 0x5259, 0x5f7d, 0x6021, 0x5f6e, 0x5f7e, 0x6022, 0x477a, 0x6023, 0x6024, 0x6025, 0x6026, 0x445e, 0x6028, 0x6027, 0x6029, 0x602a, 0x3c5f, 0x4963, 0x4c6c, 0x602b, 0x602c, 0x4156, 0x3c24, 0x602d, 0x602e, 0x602f, 0x4a52, 0x4847, 0x6030, 0x4757, 0x442d, 0x6031, 0x3267, 0x356d, 0x4c46, 0x4c36, 0x3234, 0x4f34, 0x4b52, 0x4a2a, 0x4037, 0x6032, 0x4643, 0x3823, 0x6033, 0x3a54, 0x6035, 0x6034, 0x6036, 0x6037, 0x6038, 0x353e, 0x6039, 0x603a, 0x3824, 0x4848, 0x603c, 0x3e75, 0x603b, 0x3638, 0x603d, 0x603f, 0x603e, 0x6040, 0x3851, 0x6041, 0x3669, 0x4140, 0x397d, 0x6043, 0x6044, 0x6042, 0x3c6d, 0x4648, 0x3639, 0x6046, 0x432c, 0x6045, 0x4f35, 0x4762, 0x6049, 0x604b, 0x6048, 0x4c54, 0x604a, 0x604c, 0x4e44, 0x6050, 0x604f, 0x4376, 0x472d, 0x3825, 0x604e, 0x604d, 0x4d31, 0x4d32, 0x6051, 0x316e, 0x3976, 0x3b62, 0x6052, 0x6053, 0x6055, 0x3d43, 0x6057, 0x6056, 0x6058, 0x334d, 0x605a, 0x6059, 0x605c, 0x605b, 0x383c, 0x4e28, 0x364c, 0x3226, 0x366a, 0x3461, 0x4e68, 0x605e, 0x6060, 0x6061, 0x3251, 0x605d, 0x3b39, 0x4441, 0x605f, 0x6064, 0x3c6e, 0x6062, 0x373e, 0x4849, 0x6063, 0x607e, 0x6069, 0x383d, 0x3565, 0x6066, 0x4d7d, 0x4e30, 0x4276, 0x6068, 0x606a, 0x4e56, 0x3657, 0x487c, 0x474a, 0x606b, 0x606d, 0x6070, 0x606c, 0x606f, 0x386a, 0x314d, 0x6071, 0x3f70, 0x606e, 0x4e5c, 0x6074, 0x7424, 0x6072, 0x6075, 0x6067, 0x6073, 0x3a3c, 0x6076, 0x6077, 0x4d7e, 0x6078, 0x6079, 0x6065, 0x607a, 0x3444, 0x3c25, 0x607b, 0x607c, 0x607d, 0x313b, 0x6121, 0x493b, 0x6122, 0x3424, 0x6123, 0x6124, 0x6125, 0x6127, 0x6128, 0x6126, 0x4953, 0x612a, 0x6129, 0x612c, 0x612b, 0x612d, 0x612e, 0x6130, 0x612f, 0x3979, 0x6132, 0x6131, 0x3445, 0x3f53, 0x453c, 0x6133, 0x4038, 0x3b3a, 0x3179, 0x6134, 0x4d51, 0x4a63, 0x6135, 0x4544, 0x4d33, 0x3943, 0x3f3d, 0x434b, 0x5234, 0x442e, 0x3268, 0x6136, 0x6137, 0x613c, 0x613a, 0x6139, 0x5a42, 0x3326, 0x6138, 0x305a, 0x482a, 0x484a, 0x4e31, 0x613d, 0x613b, 0x435c, 0x4026, 0x482b, 0x492d, 0x613f, 0x4e2c, 0x374d, 0x6140, 0x613e, 0x4856, 0x6141, 0x6142, 0x305b, 0x3e76, 0x6147, 0x6144, 0x466d, 0x6143, 0x3526, 0x614a, 0x6145, 0x6146, 0x6149, 0x6148, 0x4925, 0x4142, 0x4141, 0x353f, 0x614b, 0x614c, 0x614d, 0x614f, 0x614e, 0x3156, 0x6157, 0x4868, 0x6151, 0x6153, 0x6155, 0x3f3e, 0x6156, 0x6154, 0x3c40, 0x6150, 0x6152, 0x4942, 0x3e49, 0x6159, 0x6158, 0x615a, 0x3c26, 0x3a2f, 0x4577, 0x615b, 0x444b, 0x615d, 0x4e21, 0x615c, 0x4169, 0x6162, 0x6164, 0x6165, 0x4354, 0x6163, 0x6160, 0x615e, 0x615f, 0x6161, 0x6168, 0x6166, 0x6167, 0x6169, 0x616b, 0x616c, 0x616d, 0x616e, 0x616a, 0x6170, 0x616f, 0x6171, 0x4e45, 0x6174, 0x6172, 0x6173, 0x3462, 0x4c7e, 0x4a4a, 0x6176, 0x6175, 0x6177, 0x6178, 0x617c, 0x6179, 0x617a, 0x617b, 0x617d, 0x617e, 0x6221, 0x6222, 0x6223, 0x482f, 0x4550, 0x6224, 0x4772, 0x4934, 0x6225, 0x6226, 0x452a, 0x3327, 0x3944, 0x6227, 0x6228, 0x6229, 0x3b29, 0x622b, 0x622a, 0x622c, 0x622d, 0x4869, 0x622e, 0x622f, 0x7369, 0x6230, 0x6231, 0x6232, 0x3b2e, 0x6233, 0x4756, 0x4b5f, 0x314e, 0x3157, 0x6234, 0x6236, 0x6235, 0x4570, 0x4039, 0x5d39, 0x6237, 0x4c41, 0x6238, 0x3446, 0x4857, 0x6239, 0x623a, 0x623b, 0x4c5c, 0x4c55, 0x443e, 0x416a, 0x623d, 0x3d62, 0x3e4a, 0x6240, 0x623f, 0x623e, 0x487d, 0x3447, 0x3829, 0x6246, 0x6243, 0x3f3f, 0x4c32, 0x6242, 0x6244, 0x6245, 0x6241, 0x6247, 0x6248, 0x442f, 0x3463, 0x4365, 0x6249, 0x624a, 0x624d, 0x3f67, 0x4644, 0x624e, 0x4b53, 0x624b, 0x624c, 0x6251, 0x6250, 0x624f, 0x6253, 0x6252, 0x6254, 0x6256, 0x6255, 0x4a4d, 0x3d56, 0x4e46, 0x6257, 0x4637, 0x6258, 0x6259, 0x625d, 0x625b, 0x625c, 0x625a, 0x625e, 0x625f, 0x6260, 0x6261, 0x4c37, 0x6262, 0x4c70, 0x6263, 0x434e, 0x476a, 0x366b, 0x433b, 0x6264, 0x363a, 0x4050, 0x6265, 0x3a3d, 0x6266, 0x6267, 0x3826, 0x3a55, 0x6269, 0x4556, 0x3a56, 0x354e, 0x4b24, 0x474b, 0x4557, 0x395c, 0x626b, 0x3e4b, 0x4e32, 0x3945, 0x3827, 0x4823, 0x626d, 0x626f, 0x386b, 0x626e, 0x4476, 0x6271, 0x3337, 0x626c, 0x486a, 0x3130, 0x3a6c, 0x4f52, 0x6270, 0x6272, 0x4a4b, 0x4059, 0x6274, 0x6275, 0x6273, 0x334e, 0x627b, 0x627a, 0x3c27, 0x627c, 0x6277, 0x627d, 0x6278, 0x4858, 0x6276, 0x6279, 0x6322, 0x6321, 0x4b61, 0x627e, 0x306b, 0x6324, 0x6323, 0x3e4c, 0x6325, 0x4143, 0x6327, 0x6326, 0x6328, 0x6268, 0x626a, 0x632a, 0x6329, 0x3c28, 0x4e69, 0x3c52, 0x632b, 0x3737, 0x3540, 0x3527, 0x3b63, 0x4d34, 0x6331, 0x6330, 0x4144, 0x632d, 0x632f, 0x3d4b, 0x3f40, 0x632e, 0x632c, 0x472a, 0x3e4d, 0x493c, 0x3a57, 0x4578, 0x6332, 0x6333, 0x6349, 0x3658, 0x4f3d, 0x4135, 0x6334, 0x3252, 0x4477, 0x4a21, 0x6335, 0x357a, 0x6336, 0x6338, 0x6339, 0x4729, 0x633a, 0x633b, 0x633c, 0x3659, 0x3253, 0x4645, 0x3d28, 0x3b64, 0x633d, 0x3d29, 0x324a, 0x4943, 0x633e, 0x486b, 0x4145, 0x6341, 0x6342, 0x4769, 0x3f41, 0x633f, 0x4361, 0x6340, 0x3e4e, 0x305c, 0x3529, 0x6343, 0x4478, 0x6344, 0x4047, 0x4c2d, 0x4923, 0x6345, 0x6346, 0x4355, 0x4e47, 0x6348, 0x6347, 0x3c6f, 0x634a, 0x3070, 0x634d, 0x634b, 0x3254, 0x374e, 0x634c, 0x3946, 0x3972, 0x4a66, 0x634e, 0x4b54, 0x6350, 0x4051, 0x314f, 0x323a, 0x302c, 0x634f, 0x6351, 0x6352, 0x3e77, 0x6353, 0x334f, 0x6355, 0x376a, 0x3566, 0x6356, 0x3675, 0x6357, 0x407c, 0x464d, 0x4060, 0x3a75, 0x6358, 0x4362, 0x416b, 0x635a, 0x635c, 0x6359, 0x635b, 0x3722, 0x635d, 0x3726, 0x3567, 0x4d52, 0x635f, 0x6360, 0x312e, 0x6363, 0x3376, 0x6362, 0x6361, 0x6365, 0x635e, 0x6366, 0x4e29, 0x6367, 0x6368, 0x5474, 0x636a, 0x6369, 0x636b, 0x636c, 0x4e35, 0x636d, 0x706f, 0x3e4f, 0x636e, 0x636f, 0x3d57, 0x4638, 0x6370, 0x4328, 0x6371, 0x433c, 0x6372, 0x3625, 0x513f, 0x435d, 0x3c33, 0x3448, 0x6373, 0x6422, 0x6376, 0x3568, 0x6375, 0x6424, 0x6374, 0x3e50, 0x6378, 0x6379, 0x452b, 0x637a, 0x335e, 0x3f5a, 0x4964, 0x637c, 0x4268, 0x6377, 0x637b, 0x637d, 0x3a7b, 0x6426, 0x492e, 0x4826, 0x4579, 0x365a, 0x6425, 0x6423, 0x4835, 0x637e, 0x435e, 0x457b, 0x457a, 0x3a76, 0x6438, 0x6428, 0x642a, 0x642d, 0x642e, 0x642b, 0x642c, 0x6429, 0x6427, 0x6421, 0x4a4f, 0x3255, 0x6435, 0x6432, 0x6437, 0x6436, 0x4773, 0x4c27, 0x3b3b, 0x6430, 0x6439, 0x6434, 0x6433, 0x642f, 0x6431, 0x3449, 0x433d, 0x407d, 0x4822, 0x643e, 0x4824, 0x4061, 0x643b, 0x484f, 0x643f, 0x4a53, 0x435b, 0x643a, 0x643c, 0x643d, 0x6440, 0x3c44, 0x4646, 0x6445, 0x6444, 0x6441, 0x4f36, 0x644a, 0x644e, 0x644b, 0x6447, 0x6448, 0x644d, 0x6442, 0x5255, 0x6449, 0x6443, 0x644c, 0x6452, 0x344a, 0x644f, 0x6450, 0x6451, 0x6454, 0x6453, 0x4876, 0x6455, 0x4e7c, 0x4a6d, 0x645a, 0x6457, 0x6456, 0x4052, 0x6459, 0x645b, 0x6458, 0x645f, 0x645c, 0x645d, 0x6446, 0x645e, 0x6460, 0x6461, 0x4a46, 0x6462, 0x4c62, 0x364e, 0x3729, 0x6463, 0x4a34, 0x3f68, 0x4c30, 0x6464, 0x4e33, 0x4774, 0x4146, 0x4734, 0x3d4d, 0x3040, 0x6469, 0x6467, 0x6465, 0x3421, 0x3e51, 0x646a, 0x6468, 0x6466, 0x646e, 0x646d, 0x646c, 0x646b, 0x646f, 0x6470, 0x403a, 0x6471, 0x6473, 0x6472, 0x3852, 0x4138, 0x6475, 0x457c, 0x6474, 0x6476, 0x4a35, 0x416c, 0x3947, 0x6477, 0x4e48, 0x6479, 0x647a, 0x647b, 0x647c, 0x3b65, 0x647d, 0x374f, 0x356a, 0x352a, 0x6521, 0x4c73, 0x3948, 0x647e, 0x6524, 0x4c66, 0x473c, 0x4933, 0x3d63, 0x6523, 0x3c53, 0x3949, 0x3b66, 0x3569, 0x4a36, 0x6522, 0x4147, 0x4b42, 0x3a77, 0x3b67, 0x445d, 0x6527, 0x4e5f, 0x3a59, 0x6528, 0x3f42, 0x652a, 0x3e52, 0x3a30, 0x6529, 0x3d2a, 0x383e, 0x4148, 0x6525, 0x652b, 0x6526, 0x3750, 0x652e, 0x6532, 0x376b, 0x652d, 0x6536, 0x394a, 0x4d6d, 0x303c, 0x6533, 0x356b, 0x6530, 0x6531, 0x457d, 0x652f, 0x652c, 0x3328, 0x4064, 0x3828, 0x6538, 0x6535, 0x6537, 0x6534, 0x3751, 0x4233, 0x6539, 0x416e, 0x6546, 0x6542, 0x653c, 0x6540, 0x3c7a, 0x305d, 0x653b, 0x6543, 0x6547, 0x394b, 0x4c56, 0x4456, 0x653d, 0x6545, 0x653a, 0x433e, 0x653f, 0x303d, 0x4c4a, 0x653e, 0x365b, 0x486c, 0x416d, 0x4e50, 0x3d6f, 0x656e, 0x6548, 0x407e, 0x6544, 0x6549, 0x654b, 0x4479, 0x654e, 0x654a, 0x4a54, 0x344b, 0x4c4b, 0x305e, 0x654d, 0x4e7d, 0x654c, 0x316f, 0x466c, 0x654f, 0x6556, 0x6550, 0x6557, 0x6553, 0x477b, 0x3c4a, 0x6555, 0x6552, 0x6558, 0x6551, 0x3d44, 0x4b25, 0x3d4c, 0x6554, 0x6560, 0x655c, 0x655f, 0x655d, 0x6561, 0x655b, 0x6541, 0x4053, 0x484b, 0x655e, 0x6559, 0x4121, 0x3752, 0x3d2b, 0x3f25, 0x4136, 0x6564, 0x6566, 0x6567, 0x6563, 0x6565, 0x655a, 0x6562, 0x656a, 0x6569, 0x4b7a, 0x372b, 0x6568, 0x656c, 0x656b, 0x656f, 0x6571, 0x3b3c, 0x656d, 0x6572, 0x6573, 0x6574, 0x657a, 0x453b, 0x6576, 0x6575, 0x6577, 0x6578, 0x6579, 0x657b, 0x657c, 0x344c, 0x657d, 0x657e, 0x6621, 0x6622, 0x6623, 0x6624, 0x6625, 0x6626, 0x6628, 0x6627, 0x6629, 0x662a, 0x662b, 0x662e, 0x662c, 0x662d, 0x3a61, 0x3753, 0x4356, 0x4833, 0x3d70, 0x474d, 0x486d, 0x662f, 0x586d, 0x6630, 0x6632, 0x4d65, 0x6631, 0x6634, 0x6633, 0x4d53, 0x6635, 0x487e, 0x6636, 0x6639, 0x6638, 0x6637, 0x663a, 0x3732, 0x4122, 0x3541, 0x663e, 0x663b, 0x663c, 0x663f, 0x6640, 0x663d, 0x3129, 0x3227, 0x6642, 0x6643, 0x6644, 0x4d62, 0x3d2c, 0x6646, 0x6645, 0x3f69, 0x6647, 0x6648, 0x6649, 0x3465, 0x344d, 0x664a, 0x664b, 0x4b5d, 0x4d63, 0x4d54, 0x4f37, 0x394d, 0x664e, 0x3c54, 0x664d, 0x664f, 0x3c29, 0x4251, 0x6650, 0x394c, 0x4c57, 0x6651, 0x6652, 0x6653, 0x6654, 0x6655, 0x3c2a, 0x4c6d, 0x6657, 0x433f, 0x6656, 0x6659, 0x6658, 0x665a, 0x403b, 0x665b, 0x665c, 0x4a39, 0x665d, 0x416f, 0x665e, 0x665f, 0x4e7e, 0x6662, 0x6661, 0x6660, 0x4430, 0x6663, 0x3f26, 0x6664, 0x6665, 0x4f38, 0x6666, 0x6667, 0x6669, 0x6668, 0x4825, 0x4679, 0x4f3e, 0x4829, 0x666b, 0x3e53, 0x492a, 0x666c, 0x666a, 0x344e, 0x3854, 0x3b68, 0x486e, 0x382a, 0x4b43, 0x666f, 0x666d, 0x394e, 0x394f, 0x3069, 0x3a68, 0x4759, 0x305f, 0x6674, 0x4340, 0x4758, 0x425b, 0x6676, 0x6672, 0x6675, 0x6670, 0x6673, 0x4b26, 0x3855, 0x307d, 0x6671, 0x6678, 0x6679, 0x4639, 0x363b, 0x6726, 0x473d, 0x3b69, 0x363c, 0x4048, 0x4f46, 0x4c2e, 0x6677, 0x4054, 0x3553, 0x667a, 0x667c, 0x667b, 0x667d, 0x4326, 0x473e, 0x4431, 0x6723, 0x6722, 0x667e, 0x3f55, 0x4965, 0x6725, 0x6724, 0x3950, 0x4f53, 0x6735, 0x6729, 0x672a, 0x3c70, 0x6728, 0x3978, 0x6727, 0x672b, 0x4432, 0x4a22, 0x4123, 0x425c, 0x672f, 0x6730, 0x672c, 0x672d, 0x672e, 0x3951, 0x6736, 0x6732, 0x4966, 0x4b6c, 0x4928, 0x6731, 0x6734, 0x6733, 0x4b44, 0x6737, 0x6738, 0x4137, 0x6739, 0x673b, 0x673f, 0x673c, 0x673a, 0x473f, 0x673d, 0x673e, 0x3232, 0x6745, 0x6740, 0x6741, 0x6742, 0x4221, 0x6744, 0x6743, 0x6746, 0x6747, 0x6748, 0x3f43, 0x3269, 0x6749, 0x4e57, 0x3c2b, 0x3d2d, 0x3b6a, 0x4357, 0x674a, 0x674b, 0x3131, 0x674c, 0x674d, 0x674e, 0x674f, 0x6750, 0x363d, 0x5a2a, 0x6751, 0x4065, 0x6752, 0x3c4b, 0x6753, 0x5030, 0x6754, 0x4a5e, 0x345c, 0x4124, 0x3d58, 0x4971, 0x3d2e, 0x6755, 0x3952, 0x6756, 0x484c, 0x6764, 0x6758, 0x4249, 0x4775, 0x383f, 0x6757, 0x4125, 0x6759, 0x447a, 0x675b, 0x675a, 0x675d, 0x675c, 0x675e, 0x6760, 0x675f, 0x344f, 0x6761, 0x6762, 0x6763, 0x3a31, 0x4e49, 0x6765, 0x3f27, 0x3170, 0x6766, 0x6767, 0x6768, 0x3072, 0x6769, 0x676a, 0x4967, 0x3c47, 0x676c, 0x3329, 0x3032, 0x676b, 0x676e, 0x474e, 0x3f44, 0x3256, 0x4b27, 0x375d, 0x365c, 0x676d, 0x326a, 0x3423, 0x3171, 0x6772, 0x4e6a, 0x425d, 0x4944, 0x677e, 0x3257, 0x677c, 0x677a, 0x6771, 0x676f, 0x6770, 0x3c63, 0x366c, 0x4377, 0x4651, 0x3151, 0x6774, 0x6773, 0x6779, 0x6775, 0x6778, 0x4c50, 0x6777, 0x3258, 0x337d, 0x677b, 0x677d, 0x3754, 0x6823, 0x682c, 0x682d, 0x302b, 0x6834, 0x3071, 0x682b, 0x682a, 0x6825, 0x6824, 0x6822, 0x6821, 0x4363, 0x427b, 0x6827, 0x6826, 0x6829, 0x4170, 0x3755, 0x3141, 0x6828, 0x3953, 0x4171, 0x683a, 0x683b, 0x3259, 0x322e, 0x6838, 0x682e, 0x6836, 0x683d, 0x6837, 0x6835, 0x6776, 0x6833, 0x682f, 0x3450, 0x6831, 0x683c, 0x6832, 0x683e, 0x6830, 0x477c, 0x4d69, 0x6839, 0x684f, 0x6847, 0x3f7b, 0x3546, 0x365d, 0x6842, 0x325b, 0x3e54, 0x6845, 0x3a5a, 0x4551, 0x684a, 0x4a6e, 0x6841, 0x325a, 0x3856, 0x4929, 0x684b, 0x683f, 0x6848, 0x6852, 0x6843, 0x6844, 0x463a, 0x6849, 0x6846, 0x4b28, 0x684c, 0x3060, 0x6840, 0x684e, 0x684d, 0x476b, 0x6854, 0x685f, 0x337e, 0x6862, 0x6850, 0x6855, 0x4d6e, 0x685e, 0x4d55, 0x4e2a, 0x4378, 0x336b, 0x4972, 0x6864, 0x4621, 0x3031, 0x685d, 0x6859, 0x4172, 0x6853, 0x685b, 0x6860, 0x472c, 0x302a, 0x6858, 0x6861, 0x4978, 0x685c, 0x6857, 0x3e55, 0x3d2f, 0x3c2c, 0x4c58, 0x4947, 0x6867, 0x6870, 0x685a, 0x3377, 0x3e78, 0x6865, 0x686a, 0x4173, 0x6866, 0x686d, 0x435f, 0x686e, 0x4d56, 0x6863, 0x3338, 0x6869, 0x686c, 0x4c2c, 0x686f, 0x6868, 0x686b, 0x4b29, 0x4f21, 0x6873, 0x687a, 0x6872, 0x3c43, 0x6851, 0x4a4e, 0x4c22, 0x6879, 0x6878, 0x6874, 0x6875, 0x3136, 0x6877, 0x6871, 0x4455, 0x6876, 0x307e, 0x4222, 0x4a43, 0x687b, 0x6921, 0x4859, 0x687e, 0x3e56, 0x3c49, 0x6923, 0x363e, 0x6924, 0x4979, 0x687d, 0x6856, 0x687c, 0x4f4f, 0x4622, 0x4973, 0x692b, 0x6931, 0x6932, 0x6925, 0x4776, 0x692f, 0x6927, 0x6929, 0x6933, 0x6928, 0x692c, 0x3172, 0x4665, 0x692d, 0x6930, 0x6926, 0x4126, 0x692a, 0x3b27, 0x3f45, 0x3730, 0x4c74, 0x4c79, 0x3d72, 0x6937, 0x6935, 0x4f4e, 0x6934, 0x4d75, 0x6936, 0x6938, 0x6939, 0x693c, 0x693a, 0x4623, 0x693b, 0x484d, 0x692e, 0x3d73, 0x693d, 0x6942, 0x4174, 0x6941, 0x6922, 0x6943, 0x4149, 0x693e, 0x6940, 0x693f, 0x5d31, 0x5d22, 0x6945, 0x6944, 0x4d76, 0x623c, 0x6946, 0x6947, 0x6948, 0x3857, 0x3554, 0x694a, 0x515d, 0x3575, 0x4e3a, 0x3673, 0x694b, 0x694c, 0x436e, 0x694d, 0x467a, 0x303a, 0x3263, 0x6952, 0x6953, 0x694e, 0x3b3d, 0x694f, 0x4742, 0x6950, 0x6951, 0x695b, 0x6955, 0x6958, 0x6954, 0x6956, 0x6957, 0x3c58, 0x6959, 0x4341, 0x3756, 0x3342, 0x695c, 0x333f, 0x6961, 0x695d, 0x6960, 0x483a, 0x695e, 0x695f, 0x4948, 0x485a, 0x6962, 0x427d, 0x696c, 0x6968, 0x326b, 0x6966, 0x4b2a, 0x6967, 0x6964, 0x6965, 0x696a, 0x696d, 0x696b, 0x6969, 0x6963, 0x4358, 0x6974, 0x4c2a, 0x6972, 0x6973, 0x696e, 0x6970, 0x6971, 0x696f, 0x4066, 0x4f39, 0x6978, 0x6979, 0x6a21, 0x3f2a, 0x697b, 0x697e, 0x6976, 0x6975, 0x6a22, 0x325c, 0x697c, 0x6a23, 0x697d, 0x697a, 0x4433, 0x6977, 0x4768, 0x6a27, 0x4d3b, 0x6a26, 0x6a25, 0x6a2e, 0x6a28, 0x6a30, 0x4d66, 0x6a33, 0x6a2a, 0x6a2b, 0x6a2f, 0x6a32, 0x6a31, 0x6a29, 0x6a2c, 0x6a3d, 0x6a36, 0x6a34, 0x6a35, 0x6a3a, 0x6a3b, 0x332a, 0x3542, 0x6a39, 0x6a24, 0x6a38, 0x6a3c, 0x6a37, 0x6a3e, 0x6a40, 0x6a3f, 0x6a42, 0x6a41, 0x695a, 0x6a46, 0x6a43, 0x6a44, 0x6a45, 0x6a47, 0x376c, 0x6a49, 0x6a48, 0x3d30, 0x3954, 0x5e27, 0x6a4a, 0x3d51, 0x3339, 0x6a4b, 0x3152, 0x3e57, 0x6a4c, 0x3955, 0x6a4d, 0x3061, 0x493d, 0x6a4e, 0x3f6a, 0x6a55, 0x6a52, 0x436f, 0x6a53, 0x6a50, 0x365e, 0x6a4f, 0x6a56, 0x3736, 0x425e, 0x6a5c, 0x6a58, 0x4235, 0x6a57, 0x6a5a, 0x6a51, 0x6a5b, 0x6a5d, 0x486f, 0x6a59, 0x6a5e, 0x6a60, 0x3853, 0x6a54, 0x3041, 0x6a5f, 0x3a5b, 0x4e76, 0x6a61, 0x6a62, 0x4175, 0x4e22, 0x6a63, 0x4d35, 0x6a64, 0x6a65, 0x4a64, 0x6a66, 0x3a40, 0x4e23, 0x6a6b, 0x6a6c, 0x3e58, 0x6a6a, 0x4d67, 0x6a67, 0x6a69, 0x403d, 0x3f7e, 0x6a68, 0x6a6d, 0x4a23, 0x6a6f, 0x6a6e, 0x336c, 0x4b2b, 0x6a70, 0x6a7c, 0x6a72, 0x6a73, 0x6a74, 0x6a75, 0x6a79, 0x6a7a, 0x6a78, 0x6a76, 0x6a71, 0x6a77, 0x6a7b, 0x7037, 0x3228, 0x6a7e, 0x365f, 0x6a7d, 0x6b22, 0x6b21, 0x6b24, 0x6b23, 0x6b25, 0x3d31, 0x6b26, 0x6b27, 0x6b28, 0x403e, 0x4d57, 0x6b29, 0x4a24, 0x4746, 0x6b2a, 0x6b2b, 0x382b, 0x352c, 0x6b2c, 0x3b6b, 0x4741, 0x6b2d, 0x3350, 0x6b2e, 0x6b30, 0x4d77, 0x6b2f, 0x3f46, 0x6b31, 0x6b32, 0x6b33, 0x3451, 0x6b34, 0x6b35, 0x6b36, 0x6b37, 0x3351, 0x6b38, 0x6b39, 0x6b3a, 0x3272, 0x3f28, 0x6b3b, 0x6b3c, 0x6b3d, 0x3840, 0x447b, 0x6b3e, 0x3757, 0x3f56, 0x6b41, 0x4624, 0x6b40, 0x3731, 0x6b3f, 0x4277, 0x352d, 0x6b42, 0x6b43, 0x3e59, 0x376d, 0x6b44, 0x4b2c, 0x405f, 0x3576, 0x4c75, 0x414a, 0x6b45, 0x3f47, 0x4370, 0x3e5a, 0x6b46, 0x6b49, 0x6b4a, 0x3a3e, 0x4242, 0x6b48, 0x3e5b, 0x493e, 0x6b47, 0x3b6c, 0x3153, 0x6b4e, 0x3758, 0x3b6e, 0x3b6d, 0x4f4d, 0x6b4d, 0x6b4c, 0x4127, 0x354d, 0x4f43, 0x333a, 0x3e5c, 0x6b4b, 0x6b50, 0x6b51, 0x6b4f, 0x3858, 0x4d40, 0x3b6f, 0x4727, 0x6b54, 0x4040, 0x4342, 0x4d36, 0x6b57, 0x386c, 0x403f, 0x6b53, 0x6b58, 0x386d, 0x6b55, 0x6b56, 0x6b52, 0x4062, 0x4649, 0x432f, 0x325d, 0x4870, 0x3543, 0x4434, 0x6b5b, 0x6b59, 0x434c, 0x4041, 0x3452, 0x6b5a, 0x3f5b, 0x4e4a, 0x4f40, 0x6b5c, 0x6b67, 0x4435, 0x6b66, 0x6b63, 0x6b6b, 0x6b64, 0x6b60, 0x447c, 0x6b5f, 0x6b5d, 0x4d21, 0x3b70, 0x6b61, 0x6b5e, 0x6b65, 0x3d74, 0x3841, 0x427a, 0x4b45, 0x315a, 0x3062, 0x4625, 0x6b69, 0x6b68, 0x4666, 0x6b6d, 0x6b62, 0x6b6c, 0x6b6e, 0x382c, 0x6b6a, 0x3956, 0x3c55, 0x6b6f, 0x4d58, 0x6b72, 0x6b75, 0x6b73, 0x4935, 0x6b70, 0x3660, 0x6b74, 0x6b76, 0x6b7a, 0x6b77, 0x6b79, 0x6b78, 0x6b7b, 0x3c31, 0x6b7d, 0x6b7c, 0x4968, 0x6c21, 0x3759, 0x6b7e, 0x6c22, 0x6c23, 0x3544, 0x6641, 0x3e79, 0x6c24, 0x386e, 0x6c25, 0x6c26, 0x3b3e, 0x5a4e, 0x6c27, 0x6c28, 0x3d32, 0x6c29, 0x6c2a, 0x6c2b, 0x6c2c, 0x6c2d, 0x432b, 0x6c2e, 0x6c30, 0x6c2f, 0x4626, 0x6c31, 0x4b2d, 0x6c32, 0x6c33, 0x6c34, 0x6c35, 0x465a, 0x3e5d, 0x6c36, 0x396b, 0x502e, 0x6c37, 0x6c38, 0x493f, 0x6c39, 0x6c41, 0x6c3a, 0x6c3c, 0x6c3b, 0x6c3d, 0x4b46, 0x6c3e, 0x6c3f, 0x6c40, 0x6c42, 0x332d, 0x4467, 0x4969, 0x3a62, 0x3957, 0x494f, 0x325f, 0x484e, 0x6c45, 0x3453, 0x4055, 0x6c44, 0x6c49, 0x4379, 0x4c63, 0x6c47, 0x6c48, 0x352e, 0x6c4a, 0x4763, 0x425f, 0x4871, 0x453d, 0x6c46, 0x4b47, 0x326c, 0x6c4c, 0x4f28, 0x4442, 0x4f45, 0x3b71, 0x6c4b, 0x4231, 0x6c5c, 0x4128, 0x4678, 0x4950, 0x6c4f, 0x3b3f, 0x3b72, 0x3e5e, 0x4765, 0x382d, 0x6c4e, 0x6c4d, 0x496a, 0x3c41, 0x4552, 0x6c51, 0x6c52, 0x3958, 0x6c50, 0x6c53, 0x6c54, 0x6c56, 0x4223, 0x6c55, 0x3466, 0x6c58, 0x6c57, 0x6c59, 0x6c5b, 0x6c5d, 0x6c5e, 0x4056, 0x3c4f, 0x6c5f, 0x3352, 0x6c60, 0x4176, 0x6c61, 0x6c62, 0x496b, 0x352f, 0x6c63, 0x4436, 0x315b, 0x6c64, 0x3c71, 0x3f76, 0x422d, 0x6c67, 0x6c66, 0x6c65, 0x6c6d, 0x6c6b, 0x6c68, 0x6c6a, 0x6c69, 0x6c6c, 0x3577, 0x6c70, 0x4057, 0x6c71, 0x3859, 0x6c6e, 0x6c6f, 0x4f29, 0x4437, 0x4129, 0x6c72, 0x6c75, 0x6c73, 0x6c74, 0x4d59, 0x4627, 0x6c78, 0x6c76, 0x6c77, 0x6c79, 0x6d29, 0x6c7c, 0x6c7d, 0x6c7b, 0x6c7a, 0x447d, 0x6d21, 0x6d25, 0x6d22, 0x6c7e, 0x6d23, 0x6d24, 0x6d2b, 0x6d26, 0x4058, 0x6d28, 0x6d2a, 0x6d27, 0x6d2d, 0x3d33, 0x6d2c, 0x6d2e, 0x6d2f, 0x6d32, 0x6d31, 0x6d30, 0x6d34, 0x6d33, 0x4c76, 0x6d36, 0x6d35, 0x6d37, 0x6d38, 0x6d3a, 0x6d39, 0x3f48, 0x6d3b, 0x366d, 0x6d3c, 0x6d3e, 0x6d3f, 0x6d40, 0x6d3d, 0x6d41, 0x3c56, 0x6d42, 0x3530, 0x3733, 0x382e, 0x6d43, 0x4670, 0x453e, 0x6d44, 0x6d47, 0x3c34, 0x6d46, 0x6d45, 0x375a, 0x6d48, 0x3353, 0x6d4a, 0x3a5c, 0x6d49, 0x6d52, 0x6d4c, 0x6d4e, 0x4a65, 0x6d4b, 0x6d4d, 0x6d51, 0x6d4f, 0x3531, 0x6d50, 0x6d53, 0x475a, 0x4e58, 0x3d34, 0x6d54, 0x4d22, 0x6d56, 0x6d55, 0x6d59, 0x4d41, 0x6d58, 0x336d, 0x6d57, 0x6d5c, 0x6d5b, 0x6d5a, 0x4532, 0x6d5d, 0x6d5e, 0x6d5f, 0x396c, 0x3725, 0x6d60, 0x6d61, 0x6d62, 0x3f49, 0x6d63, 0x3c2d, 0x6d64, 0x6d65, 0x5221, 0x517e, 0x6d66, 0x6570, 0x6d67, 0x4324, 0x3f2b, 0x4740, 0x6d68, 0x4a55, 0x4454, 0x397e, 0x4329, 0x312a, 0x4b78, 0x3f57, 0x375e, 0x3661, 0x4a56, 0x6d69, 0x6d6b, 0x6d6a, 0x3260, 0x4676, 0x6d6c, 0x4777, 0x4533, 0x6d6d, 0x3d52, 0x6d6f, 0x4c42, 0x6d7e, 0x6d71, 0x6d72, 0x4449, 0x4260, 0x4177, 0x4628, 0x6d70, 0x3555, 0x6d79, 0x6d76, 0x6e25, 0x4629, 0x4360, 0x6d73, 0x447e, 0x4553, 0x6d74, 0x6d78, 0x3f60, 0x4767, 0x444c, 0x4042, 0x6d77, 0x422e, 0x4224, 0x6d75, 0x3029, 0x4f22, 0x6d7a, 0x4261, 0x3d35, 0x3f4a, 0x6d7c, 0x6d7b, 0x306f, 0x6d7d, 0x492f, 0x6e27, 0x465b, 0x3f6b, 0x4359, 0x3678, 0x6e26, 0x4d37, 0x313f, 0x4a57, 0x3261, 0x6e21, 0x6e22, 0x6e23, 0x6e24, 0x463b, 0x4323, 0x3063, 0x6e28, 0x6e29, 0x7423, 0x423d, 0x6e2a, 0x3173, 0x414c, 0x382f, 0x4d5a, 0x6e2b, 0x452c, 0x4178, 0x3c57, 0x6e2c, 0x6e2f, 0x3d65, 0x6e2d, 0x412b, 0x412a, 0x3064, 0x4e4b, 0x6e31, 0x4872, 0x6e33, 0x6e32, 0x6e30, 0x6364, 0x3454, 0x6d6e, 0x6e35, 0x6e34, 0x6e36, 0x4d38, 0x4661, 0x4b2e, 0x6e37, 0x3c59, 0x6e38, 0x6e39, 0x6e3a, 0x4521, 0x306a, 0x3959, 0x4f3a, 0x6e3e, 0x3734, 0x6e3b, 0x6e3c, 0x4974, 0x3354, 0x4d39, 0x363f, 0x4554, 0x6e3f, 0x6e40, 0x6e41, 0x4522, 0x6e43, 0x6e42, 0x4653, 0x6e44, 0x3d36, 0x3c60, 0x475b, 0x4371, 0x3c72, 0x3f6c, 0x6e45, 0x6e46, 0x3f5d, 0x6e47, 0x6e48, 0x6e49, 0x4d6f, 0x3d37, 0x6e4b, 0x6e4a, 0x395a, 0x3973, 0x3b40, 0x6e4e, 0x3d66, 0x6e4d, 0x6e4c, 0x4269, 0x386f, 0x4043, 0x4830, 0x3d39, 0x6e4f, 0x3e5f, 0x6e52, 0x6e50, 0x6e51, 0x6e54, 0x6e53, 0x3e7a, 0x6e55, 0x6e56, 0x6e57, 0x4850, 0x3a53, 0x3c61, 0x6e58, 0x6e59, 0x4e24, 0x3d45, 0x4c6e, 0x4e4c, 0x6e5a, 0x3662, 0x6e5b, 0x4523, 0x6e5e, 0x3378, 0x3f4b, 0x6e5c, 0x6e5d, 0x4460, 0x4b55, 0x367c, 0x6e60, 0x6e61, 0x6e5f, 0x6e63, 0x465f, 0x3343, 0x6e67, 0x6e64, 0x6e66, 0x6e62, 0x6f4f, 0x6e65, 0x4e6b, 0x385a, 0x6e6f, 0x4534, 0x6e6a, 0x6e6d, 0x6e6b, 0x6e70, 0x6e71, 0x6e69, 0x6e76, 0x3174, 0x6e68, 0x482d, 0x6e6c, 0x3e60, 0x395b, 0x4b48, 0x3664, 0x3d46, 0x463c, 0x412d, 0x6e74, 0x6e6e, 0x6e73, 0x4c43, 0x4438, 0x6e75, 0x6e72, 0x412c, 0x6e79, 0x6e78, 0x6e77, 0x4b2f, 0x3d7b, 0x6e7a, 0x4a5f, 0x3154, 0x4946, 0x4372, 0x3578, 0x6e7c, 0x395d, 0x3b2c, 0x6e7b, 0x3f6d, 0x3f6e, 0x6f21, 0x6f23, 0x3e7b, 0x6f22, 0x6f24, 0x3653, 0x4945, 0x3c62, 0x4f23, 0x6e7e, 0x3a78, 0x4f3f, 0x6f26, 0x6f25, 0x6f27, 0x6e7d, 0x4669, 0x4555, 0x4457, 0x6f2c, 0x4343, 0x6f28, 0x6f29, 0x372d, 0x6f2b, 0x3830, 0x6f2a, 0x3e61, 0x3379, 0x6f30, 0x3a3f, 0x4179, 0x444a, 0x333b, 0x6f2e, 0x6f2f, 0x4443, 0x6f2d, 0x6f31, 0x6f37, 0x6f3a, 0x6f39, 0x452d, 0x6f32, 0x6f33, 0x6f36, 0x6f38, 0x3640, 0x6f3b, 0x6f35, 0x6f34, 0x6f3f, 0x6f40, 0x6f41, 0x6f3e, 0x6f3d, 0x3e62, 0x462a, 0x6f3c, 0x6f45, 0x6f43, 0x6f44, 0x6f42, 0x4278, 0x6f46, 0x6f47, 0x6f49, 0x3455, 0x6f48, 0x4c7a, 0x6f54, 0x6f4a, 0x6f4d, 0x6f4b, 0x6f4c, 0x6f4e, 0x6f50, 0x6f51, 0x6f52, 0x6f55, 0x6f53, 0x6f56, 0x6f58, 0x6f57, 0x4439, 0x4c67, 0x6f59, 0x412e, 0x6f5a, 0x4a44, 0x6f5b, 0x332b, 0x313c, 0x3457, 0x3456, 0x6f5c, 0x6f5d, 0x6f5e, 0x6f5f, 0x6f60, 0x3458, 0x3355, 0x395e, 0x4836, 0x6f62, 0x6f61, 0x6f63, 0x315c, 0x6f66, 0x6f65, 0x6f64, 0x6f67, 0x6f6a, 0x3047, 0x6f68, 0x6f6c, 0x6f6b, 0x6f6e, 0x6f6d, 0x6f6f, 0x462e, 0x6f70, 0x6f71, 0x6f73, 0x6f72, 0x496c, 0x6f74, 0x6f75, 0x3a65, 0x6f76, 0x6f77, 0x4b49, 0x414b, 0x3024, 0x424b, 0x6f78, 0x496d, 0x6f7b, 0x6f79, 0x395f, 0x6f7a, 0x3842, 0x4a45, 0x6f7d, 0x7021, 0x6f7e, 0x7022, 0x3121, 0x3f58, 0x3d7c, 0x3459, 0x7023, 0x4766, 0x7025, 0x3122, 0x7024, 0x4444, 0x4e4d, 0x462b, 0x6f7c, 0x4e26, 0x3831, 0x4d5b, 0x3679, 0x4e34, 0x3728, 0x4262, 0x6721, 0x7026, 0x332c, 0x3f6f, 0x3356, 0x7028, 0x7029, 0x7027, 0x3764, 0x3a5d, 0x3e63, 0x3123, 0x4e59, 0x702b, 0x6e2e, 0x702a, 0x702e, 0x702c, 0x702d, 0x702f, 0x7030, 0x4e6c, 0x7031, 0x7032, 0x4049, 0x483b, 0x3f7d, 0x3467, 0x4d3a, 0x326d, 0x3d38, 0x385b, 0x7035, 0x7034, 0x3b73, 0x7036, 0x7033, 0x3b28, 0x703a, 0x6a2d, 0x5256, 0x3f77, 0x7038, 0x4e25, 0x4671, 0x312b, 0x4063, 0x3c36, 0x4a37, 0x3140, 0x4e6d, 0x4d6b, 0x703b, 0x4545, 0x3c7b, 0x703c, 0x703d, 0x3f4c, 0x703e, 0x4e6e, 0x7039, 0x7040, 0x7042, 0x7041, 0x703f, 0x7043, 0x7044, 0x417a, 0x3262, 0x7045, 0x4c38, 0x7046, 0x7047, 0x4f2a, 0x5b31, 0x7048, 0x7049, 0x704a, 0x704e, 0x704b, 0x704c, 0x704d, 0x704f, 0x4044, 0x4c77, 0x4045, 0x7050, 0x4873, 0x7051, 0x7353, 0x4c4c, 0x7052, 0x7053, 0x7054, 0x3357, 0x7056, 0x3f59, 0x7057, 0x3724, 0x7058, 0x705c, 0x705a, 0x705b, 0x3373, 0x7059, 0x705d, 0x705e, 0x3048, 0x705f, 0x7060, 0x3e64, 0x7061, 0x3547, 0x7064, 0x7063, 0x7062, 0x6b71, 0x4a5c, 0x7065, 0x7066, 0x7067, 0x7068, 0x7069, 0x706a, 0x345a, 0x706b, 0x706c, 0x4723, 0x706e, 0x323b, 0x7071, 0x7070, 0x3124, 0x3641, 0x4a47, 0x443a, 0x3a22, 0x3960, 0x3d67, 0x3f5c, 0x7073, 0x7072, 0x4d42, 0x3468, 0x4852, 0x465c, 0x3f7c, 0x4e4e, 0x375b, 0x7076, 0x7075, 0x4b4b, 0x462c, 0x3150, 0x7077, 0x7074, 0x4951, 0x4d6a, 0x7078, 0x7079, 0x707b, 0x426a, 0x335b, 0x335c, 0x707a, 0x3469, 0x3832, 0x346a, 0x453f, 0x4e60, 0x385c, 0x707c, 0x707d, 0x707e, 0x7121, 0x7123, 0x7122, 0x4977, 0x7124, 0x7125, 0x7126, 0x7127, 0x7129, 0x7128, 0x712a, 0x4874, 0x664c, 0x3f29, 0x3532, 0x712b, 0x712c, 0x522c, 0x5d3b, 0x4853, 0x307b, 0x303b, 0x3b74, 0x4b30, 0x3e7e, 0x712d, 0x4c5f, 0x712e, 0x4d5c, 0x3142, 0x3b41, 0x712f, 0x326e, 0x7130, 0x7131, 0x7133, 0x7134, 0x7136, 0x7132, 0x7135, 0x345b, 0x7137, 0x7138, 0x7139, 0x713a, 0x713b, 0x713d, 0x713c, 0x713f, 0x7142, 0x713e, 0x7140, 0x7141, 0x7143, 0x3642, 0x3c73, 0x7144, 0x7145, 0x3961, 0x7146, 0x333e, 0x474f, 0x7147, 0x7148, 0x435a, 0x466b, 0x7149, 0x477d, 0x424c, 0x3158, 0x366e, 0x366f, 0x4373, 0x714e, 0x3670, 0x326f, 0x714d, 0x714b, 0x714c, 0x714a, 0x7158, 0x714f, 0x7150, 0x7151, 0x7152, 0x7154, 0x7153, 0x3d59, 0x7155, 0x7157, 0x3533, 0x7156, 0x417b, 0x3833, 0x7159, 0x424d, 0x715a, 0x462d, 0x715b, 0x7160, 0x715e, 0x715d, 0x715f, 0x715c, 0x7162, 0x7161, 0x7164, 0x3643, 0x7163, 0x7165, 0x7166, 0x7168, 0x7167, 0x7169, 0x716b, 0x716a, 0x397c, 0x716c, 0x716d, 0x333c, 0x716e, 0x716f, 0x3f71, 0x7170, 0x7171, 0x7172, 0x7173, 0x3962, 0x7174, 0x7175, 0x7176, 0x7177, 0x7178, 0x4831, 0x717a, 0x4926, 0x717b, 0x7179, 0x717d, 0x717c, 0x717e, 0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7228, 0x7229, 0x722a, 0x722b, 0x722c, 0x722d, 0x722e, 0x5d35, 0x722f, 0x6478, 0x3534, 0x3321, 0x3a32, 0x7231, 0x7230, 0x4c25, 0x7233, 0x7234, 0x7232, 0x7235, 0x4b62, 0x7236, 0x357b, 0x4f25, 0x7237, 0x7239, 0x303e, 0x723a, 0x4a2b, 0x7238, 0x723b, 0x723c, 0x723d, 0x723e, 0x723f, 0x4b6e, 0x3b2d, 0x3a7a, 0x412f, 0x7240, 0x7243, 0x7241, 0x7244, 0x3871, 0x7242, 0x7245, 0x7246, 0x7247, 0x724b, 0x3b2a, 0x4264, 0x724c, 0x7249, 0x7248, 0x724a, 0x375f, 0x7250, 0x724f, 0x724e, 0x3033, 0x725a, 0x7256, 0x7257, 0x7253, 0x7259, 0x7255, 0x3362, 0x4f4c, 0x7258, 0x7254, 0x7252, 0x7251, 0x725c, 0x725f, 0x725e, 0x725d, 0x4949, 0x725b, 0x3073, 0x7260, 0x7262, 0x336f, 0x724d, 0x3137, 0x7264, 0x7263, 0x7261, 0x432d, 0x4b70, 0x4e5a, 0x7265, 0x7266, 0x7267, 0x7268, 0x7269, 0x443b, 0x726a, 0x4837, 0x726f, 0x726b, 0x726c, 0x4b31, 0x4c44, 0x4650, 0x7270, 0x7271, 0x463e, 0x726e, 0x726d, 0x322a, 0x7279, 0x7278, 0x3175, 0x7276, 0x7275, 0x7273, 0x337b, 0x7272, 0x3c32, 0x3229, 0x3963, 0x727c, 0x727b, 0x727a, 0x7277, 0x727d, 0x727e, 0x7325, 0x7324, 0x7326, 0x312d, 0x7321, 0x7322, 0x3974, 0x4c39, 0x7323, 0x4b32, 0x732b, 0x7327, 0x732c, 0x7329, 0x7328, 0x375c, 0x732d, 0x732e, 0x732f, 0x732a, 0x7274, 0x7330, 0x4461, 0x7334, 0x7335, 0x7333, 0x7332, 0x7338, 0x7331, 0x7336, 0x7337, 0x733a, 0x7339, 0x733c, 0x733d, 0x733e, 0x4f49, 0x733b, 0x426b, 0x3a6d, 0x733f, 0x7340, 0x7341, 0x7342, 0x7343, 0x3834, 0x7344, 0x7345, 0x3c2f, 0x7346, 0x7347, 0x7348, 0x7349, 0x734c, 0x734a, 0x4f3c, 0x734b, 0x4e6f, 0x734d, 0x4e5b, 0x734e, 0x477e, 0x734f, 0x7351, 0x7352, 0x7350, 0x396d, 0x4c4d, 0x4b63, 0x5677, 0x5d60, 0x4b7b, 0x322b, 0x7354, 0x3550, 0x7355, 0x7356, 0x7357, 0x3975, 0x7358, 0x6054, 0x4c5b, 0x4263, 0x7359, 0x735b, 0x735a, 0x735c, 0x735d, 0x735e, 0x735f, 0x7360, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0x7367, 0x7368, 0x4524, 0x385d, 0x736a, 0x414d, 0x736b, 0x736c, 0x4921, 0x736d, 0x736e, 0x6337, 0x6c5a, 0x706d, 0x736f, 0x7370, 0x7372, 0x7373, 0x7374, 0x4e70, 0x7371, 0x7375, 0x7376, 0x7378, 0x7377, 0x737a, 0x737b, 0x7379, 0x4e36, 0x737c, 0x737d, 0x6354, 0x737e, 0x212a, 0x2174, 0x2170, 0x2173, 0x2175, 0x214a, 0x214b, 0x2176, 0x215c, 0x2124, 0x2125, 0x213f, 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, 0x2339, 0x2127, 0x2128, 0x2163, 0x2161, 0x2164, 0x2129, 0x2177, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, 0x2348, 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f, 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, 0x2358, 0x2359, 0x235a, 0x214e, 0x2140, 0x214f, 0x2130, 0x2132, 0x212e, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, 0x2368, 0x2369, 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f, 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, 0x2378, 0x2379, 0x237a, 0x2150, 0x2143, 0x2151, 0x2131, 0x216f, }; static const Summary16 jisx0208_uni2indx_page00[16] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x118c }, { 5, 0x0053 }, { 9, 0x0000 }, { 9, 0x0080 }, { 10, 0x0000 }, { 10, 0x0080 }, }; static const Summary16 jisx0208_uni2indx_page03[22] = { /* 0x0300 */ { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0xfffe }, { 26, 0x03fb }, { 35, 0xfffe }, { 50, 0x03fb }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, /* 0x0400 */ { 59, 0x0002 }, { 60, 0xffff }, { 76, 0xffff }, { 92, 0xffff }, { 108, 0xffff }, { 124, 0x0002 }, }; static const Summary16 jisx0208_uni2indx_page20[50] = { /* 0x2000 */ { 125, 0x0000 }, { 125, 0x3361 }, { 132, 0x0063 }, { 136, 0x080d }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, /* 0x2100 */ { 140, 0x0008 }, { 141, 0x0000 }, { 141, 0x0800 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x000f }, { 146, 0x0000 }, { 146, 0x0000 }, { 146, 0x0000 }, { 146, 0x0014 }, { 148, 0x0000 }, { 148, 0x0000 }, /* 0x2200 */ { 148, 0x098d }, { 154, 0x6404 }, { 158, 0x1f81 }, { 165, 0x2030 }, { 168, 0x0000 }, { 168, 0x0004 }, { 169, 0x0cc3 }, { 175, 0x0000 }, { 175, 0x00cc }, { 179, 0x0000 }, { 179, 0x0020 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, /* 0x2300 */ { 180, 0x0000 }, { 180, 0x0004 }, }; static const Summary16 jisx0208_uni2indx_page25[23] = { /* 0x2500 */ { 181, 0x900f }, { 187, 0x3999 }, { 195, 0x9939 }, { 203, 0x9999 }, { 211, 0x0804 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0003 }, { 215, 0x300c }, { 219, 0xc8c0 }, { 224, 0x0000 }, { 224, 0x8000 }, { 225, 0x0000 }, /* 0x2600 */ { 225, 0x0060 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0005 }, { 229, 0x0000 }, { 229, 0xa400 }, }; static const Summary16 jisx0208_uni2indx_page30[16] = { /* 0x3000 */ { 232, 0xffef }, { 247, 0x103f }, { 254, 0x0000 }, { 254, 0x0000 }, { 254, 0xfffe }, { 269, 0xffff }, { 285, 0xffff }, { 301, 0xffff }, { 317, 0xffff }, { 333, 0x780f }, { 341, 0xfffe }, { 356, 0xffff }, { 372, 0xffff }, { 388, 0xffff }, { 404, 0xffff }, { 420, 0x787f }, }; static const Summary16 jisx0208_uni2indx_page4e[1307] = { /* 0x4e00 */ { 431, 0x6f8b }, { 441, 0x43f3 }, { 450, 0x2442 }, { 454, 0x9b46 }, { 462, 0xe82c }, { 469, 0xe3e0 }, { 477, 0x0004 }, { 478, 0x400a }, { 481, 0x5f65 }, { 491, 0xdb36 }, { 501, 0x7977 }, { 512, 0x0449 }, { 516, 0xecd7 }, { 527, 0xe3f0 }, { 536, 0x6038 }, { 541, 0x08c5 }, /* 0x4f00 */ { 546, 0xe602 }, { 552, 0x3403 }, { 557, 0x8000 }, { 558, 0x3551 }, { 565, 0xe0c8 }, { 571, 0x7eab }, { 582, 0x8200 }, { 584, 0x9869 }, { 591, 0xa948 }, { 597, 0x2942 }, { 602, 0xe803 }, { 608, 0x8060 }, { 611, 0x441c }, { 616, 0xad93 }, { 625, 0xc03a }, { 631, 0x4568 }, /* 0x5000 */ { 637, 0xaa60 }, { 643, 0x8656 }, { 650, 0x3f7a }, { 661, 0x0240 }, { 663, 0x8388 }, { 668, 0x1461 }, { 673, 0x1020 }, { 675, 0x2174 }, { 681, 0x2021 }, { 684, 0x0702 }, { 688, 0x3000 }, { 690, 0x40bc }, { 696, 0xa624 }, { 702, 0x4462 }, { 707, 0x60a8 }, { 712, 0x0a20 }, /* 0x5100 */ { 715, 0x0217 }, { 720, 0x8574 }, { 727, 0x0402 }, { 729, 0x9c84 }, { 735, 0x7bfb }, { 748, 0x1415 }, { 753, 0x7f24 }, { 762, 0x11e2 }, { 768, 0xb665 }, { 777, 0x02ef }, { 785, 0x1f75 }, { 795, 0x20ff }, { 804, 0x3a70 }, { 811, 0x3840 }, { 815, 0x26c3 }, { 822, 0x6763 }, /* 0x5200 */ { 831, 0x4dd9 }, { 840, 0x2092 }, { 844, 0x46b0 }, { 850, 0x0fc9 }, { 858, 0xbc98 }, { 866, 0x4850 }, { 870, 0x8638 }, { 876, 0xa03f }, { 884, 0x2388 }, { 889, 0x8816 }, { 894, 0x3e09 }, { 901, 0x5232 }, { 907, 0x22aa }, { 913, 0xe3a4 }, { 921, 0x00dd }, { 927, 0xc72c }, /* 0x5300 */ { 935, 0xa166 }, { 942, 0x26e1 }, { 949, 0x840b }, { 954, 0x8f0a }, { 961, 0x27eb }, { 971, 0x559e }, { 980, 0xc241 }, { 985, 0x89bb }, { 994, 0x0014 }, { 996, 0x8540 }, { 1000, 0x6361 }, { 1007, 0x0849 }, { 1011, 0x7f0c }, { 1020, 0x8ad0 }, { 1026, 0xff3e }, { 1039, 0x05cf }, /* 0x5400 */ { 1047, 0xff1a }, { 1058, 0xa803 }, { 1063, 0x7a41 }, { 1070, 0x7b40 }, { 1077, 0x4745 }, { 1084, 0x8002 }, { 1086, 0x0500 }, { 1088, 0x38eb }, { 1097, 0xd851 }, { 1104, 0x0005 }, { 1106, 0x9934 }, { 1113, 0x710c }, { 1119, 0x0397 }, { 1126, 0x0100 }, { 1127, 0x6366 }, { 1135, 0x2404 }, /* 0x5500 */ { 1138, 0x80d0 }, { 1142, 0x0051 }, { 1145, 0xc000 }, { 1147, 0x430a }, { 1152, 0x9071 }, { 1158, 0x30c8 }, { 1163, 0x0008 }, { 1164, 0x5800 }, { 1167, 0x0e99 }, { 1174, 0xf700 }, { 1181, 0x5f80 }, { 1188, 0x0041 }, { 1190, 0x00b0 }, { 1193, 0x9410 }, { 1197, 0x0018 }, { 1199, 0x6280 }, /* 0x5600 */ { 1203, 0x0240 }, { 1205, 0x09d0 }, { 1210, 0x8200 }, { 1212, 0x0156 }, { 1217, 0x5004 }, { 1220, 0x0801 }, { 1222, 0x1d10 }, { 1227, 0x0510 }, { 1230, 0x84c1 }, { 1235, 0x0010 }, { 1236, 0x4025 }, { 1240, 0x1050 }, { 1243, 0x410f }, { 1249, 0x4d8a }, { 1256, 0x4009 }, { 1259, 0xa60d }, /* 0x5700 */ { 1266, 0xab19 }, { 1274, 0x914c }, { 1280, 0x21c0 }, { 1284, 0x0981 }, { 1288, 0xc485 }, { 1294, 0x0003 }, { 1296, 0x0652 }, { 1301, 0x8000 }, { 1302, 0x0b04 }, { 1306, 0x0008 }, { 1307, 0x041d }, { 1312, 0x0009 }, { 1314, 0x4849 }, { 1319, 0x905c }, { 1325, 0x0009 }, { 1327, 0x1690 }, /* 0x5800 */ { 1332, 0x0c65 }, { 1338, 0x2220 }, { 1341, 0x8412 }, { 1345, 0x2433 }, { 1351, 0x0c03 }, { 1355, 0x4796 }, { 1363, 0x0a04 }, { 1366, 0x4225 }, { 1371, 0x0028 }, { 1373, 0x9088 }, { 1377, 0x4900 }, { 1380, 0x4f08 }, { 1386, 0x14a2 }, { 1391, 0xd3aa }, { 1400, 0xd830 }, { 1406, 0x3e87 }, /* 0x5900 */ { 1415, 0x8604 }, { 1419, 0x1f61 }, { 1427, 0x7ea4 }, { 1436, 0x4186 }, { 1441, 0xc390 }, { 1447, 0x05b3 }, { 1454, 0x57a5 }, { 1463, 0x2118 }, { 1467, 0x241e }, { 1473, 0x2a48 }, { 1478, 0x1128 }, { 1482, 0x4a04 }, { 1486, 0x0a40 }, { 1489, 0x161b }, { 1496, 0x0d60 }, { 1501, 0x8840 }, /* 0x5a00 */ { 1504, 0x020a }, { 1507, 0x9502 }, { 1512, 0x8221 }, { 1516, 0x1060 }, { 1519, 0x0243 }, { 1523, 0x0400 }, { 1524, 0x1444 }, { 1528, 0x8000 }, { 1529, 0x0000 }, { 1529, 0x0c04 }, { 1532, 0x0000 }, { 1532, 0x7000 }, { 1535, 0x1a06 }, { 1540, 0x00c1 }, { 1543, 0x024a }, { 1547, 0x0c00 }, /* 0x5b00 */ { 1549, 0x1a00 }, { 1552, 0x0040 }, { 1553, 0x1404 }, { 1556, 0x4045 }, { 1560, 0x0029 }, { 1563, 0xbdb3 }, { 1574, 0x0a78 }, { 1580, 0x052b }, { 1586, 0xbba9 }, { 1596, 0xbfa0 }, { 1605, 0x407c }, { 1611, 0x8379 }, { 1619, 0x12fc }, { 1627, 0xe81d }, { 1635, 0x4bf6 }, { 1645, 0xc569 }, /* 0x5c00 */ { 1653, 0xeff6 }, { 1666, 0x044a }, { 1670, 0x2115 }, { 1675, 0xff02 }, { 1684, 0xed63 }, { 1694, 0x402b }, { 1699, 0xd033 }, { 1706, 0x0242 }, { 1709, 0x1000 }, { 1710, 0x0013 }, { 1713, 0x1b02 }, { 1718, 0x59ca }, { 1726, 0x00a0 }, { 1728, 0x0200 }, { 1729, 0xa703 }, { 1736, 0x2c41 }, /* 0x5d00 */ { 1741, 0x4880 }, { 1744, 0x8ff2 }, { 1754, 0x0204 }, { 1756, 0x0000 }, { 1756, 0x5800 }, { 1759, 0x1005 }, { 1762, 0x9200 }, { 1765, 0x0048 }, { 1767, 0x1894 }, { 1772, 0x2001 }, { 1774, 0x5004 }, { 1777, 0x3480 }, { 1781, 0x3200 }, { 1784, 0x684c }, { 1790, 0x49ea }, { 1798, 0x68be }, /* 0x5e00 */ { 1807, 0x184c }, { 1812, 0x2e42 }, { 1818, 0xa820 }, { 1822, 0x21c9 }, { 1828, 0x50b9 }, { 1835, 0x80b0 }, { 1839, 0x001e }, { 1843, 0xff7c }, { 1856, 0x849a }, { 1862, 0x14e0 }, { 1867, 0x28c1 }, { 1872, 0x01e0 }, { 1876, 0x870e }, { 1883, 0xac49 }, { 1890, 0x130f }, { 1897, 0xdddb }, /* 0x5f00 */ { 1909, 0xbe1a }, { 1918, 0x89fb }, { 1928, 0xa2e0 }, { 1934, 0x51a2 }, { 1940, 0x5502 }, { 1945, 0x32ca }, { 1952, 0x3e46 }, { 1960, 0x928b }, { 1967, 0x1dbf }, { 1978, 0x438f }, { 1986, 0x6703 }, { 1993, 0x3218 }, { 1998, 0x3028 }, { 2002, 0x33c0 }, { 2008, 0x0811 }, { 2011, 0xa923 }, /* 0x6000 */ { 2018, 0xc000 }, { 2020, 0x3a65 }, { 2028, 0x8fe3 }, { 2038, 0x0402 }, { 2040, 0x2c4e }, { 2047, 0x8625 }, { 2053, 0xbf3d }, { 2065, 0x00a1 }, { 2068, 0x3a1a }, { 2075, 0x8cd4 }, { 2082, 0x06c9 }, { 2088, 0x317c }, { 2096, 0x00e0 }, { 2099, 0x950a }, { 2105, 0x018b }, { 2110, 0x0edb }, /* 0x6100 */ { 2119, 0xe34b }, { 2128, 0x8c20 }, { 2132, 0x1182 }, { 2136, 0xf010 }, { 2141, 0x7d94 }, { 2150, 0xa728 }, { 2157, 0xc9ac }, { 2165, 0x40fb }, { 2173, 0x4484 }, { 2177, 0x0653 }, { 2183, 0x5a90 }, { 2189, 0x4444 }, { 2193, 0x3fc8 }, { 2202, 0x0001 }, { 2203, 0x0048 }, { 2205, 0xf5d4 }, /* 0x6200 */ { 2215, 0x7701 }, { 2222, 0xec57 }, { 2232, 0xc442 }, { 2237, 0x891d }, { 2244, 0x6b83 }, { 2252, 0x4928 }, { 2257, 0x4109 }, { 2261, 0xd242 }, { 2267, 0x061d }, { 2273, 0x59fe }, { 2284, 0x1800 }, { 2286, 0x3a22 }, { 2292, 0xb7e4 }, { 2302, 0x3b9f }, { 2313, 0xf003 }, { 2319, 0xc0ea }, /* 0x6300 */ { 2326, 0x1386 }, { 2332, 0x8202 }, { 2335, 0x8980 }, { 2339, 0xe400 }, { 2343, 0xb200 }, { 2347, 0x10a1 }, { 2351, 0x4b80 }, { 2356, 0x0cc4 }, { 2361, 0xd309 }, { 2368, 0x8944 }, { 2373, 0x1faf }, { 2384, 0x4834 }, { 2389, 0x8259 }, { 2395, 0x0c45 }, { 2400, 0x420a }, { 2404, 0x0450 }, /* 0x6400 */ { 2407, 0xa040 }, { 2410, 0x10c8 }, { 2414, 0x3140 }, { 2418, 0x4450 }, { 2422, 0x4004 }, { 2424, 0x0100 }, { 2425, 0x8280 }, { 2428, 0x0540 }, { 2431, 0x0108 }, { 2433, 0x442c }, { 2438, 0x6a30 }, { 2444, 0x1a05 }, { 2449, 0x20a6 }, { 2454, 0x0514 }, { 2458, 0x90cf }, { 2466, 0x6456 }, /* 0x6500 */ { 2473, 0x0021 }, { 2475, 0x3100 }, { 2478, 0x9c18 }, { 2484, 0xcbf0 }, { 2493, 0xa120 }, { 2497, 0x63e2 }, { 2505, 0x104c }, { 2509, 0x01b5 }, { 2515, 0x538c }, { 2522, 0x9a83 }, { 2529, 0xb8b2 }, { 2537, 0x3281 }, { 2542, 0x987a }, { 2550, 0x0a84 }, { 2554, 0x33e7 }, { 2564, 0x0c02 }, /* 0x6600 */ { 2567, 0xd4cc }, { 2575, 0x9018 }, { 2579, 0xa1a1 }, { 2585, 0x9070 }, { 2590, 0x8a1e }, { 2597, 0xe004 }, { 2601, 0xc3d4 }, { 2609, 0x0451 }, { 2613, 0x439a }, { 2620, 0x21c2 }, { 2625, 0x4844 }, { 2629, 0x5310 }, { 2634, 0x0292 }, { 2638, 0x3640 }, { 2643, 0x0241 }, { 2646, 0xf3bd }, /* 0x6700 */ { 2658, 0xab09 }, { 2665, 0xe8f0 }, { 2673, 0x7dc0 }, { 2681, 0xa5d2 }, { 2689, 0xc242 }, { 2694, 0xd24b }, { 2702, 0xa43f }, { 2711, 0xd0af }, { 2720, 0x1aa0 }, { 2725, 0x34a1 }, { 2731, 0x8247 }, { 2737, 0x03d8 }, { 2743, 0xc452 }, { 2749, 0x651b }, { 2757, 0xd294 }, { 2764, 0xc83a }, /* 0x6800 */ { 2771, 0x001c }, { 2774, 0x40c8 }, { 2778, 0x0e06 }, { 2783, 0x3314 }, { 2789, 0x614f }, { 2797, 0xb21b }, { 2805, 0x0088 }, { 2807, 0xc0d0 }, { 2812, 0xa02a }, { 2817, 0xa898 }, { 2823, 0xa1c5 }, { 2830, 0x166b }, { 2838, 0x2e50 }, { 2844, 0x85b4 }, { 2851, 0xc08b }, { 2857, 0x0604 }, /* 0x6900 */ { 2860, 0xf933 }, { 2870, 0x1e04 }, { 2875, 0x056e }, { 2882, 0xa251 }, { 2888, 0x0400 }, { 2889, 0x7638 }, { 2897, 0xec07 }, { 2905, 0x73b8 }, { 2914, 0x4406 }, { 2918, 0x1832 }, { 2923, 0x4081 }, { 2926, 0xc816 }, { 2932, 0x7c8a }, { 2940, 0x6309 }, { 2946, 0x2980 }, { 2950, 0xaa04 }, /* 0x6a00 */ { 2955, 0x1c24 }, { 2960, 0xca9c }, { 2968, 0x4e0e }, { 2975, 0x2760 }, { 2981, 0x0990 }, { 2985, 0x8300 }, { 2988, 0x0046 }, { 2991, 0x8104 }, { 2994, 0x6011 }, { 2998, 0x1081 }, { 3001, 0x540d }, { 3007, 0x0908 }, { 3010, 0x000e }, { 3013, 0xcc0a }, { 3019, 0x0500 }, { 3021, 0x0c00 }, /* 0x6b00 */ { 3023, 0x0430 }, { 3026, 0xa044 }, { 3030, 0x008b }, { 3034, 0x6784 }, { 3041, 0x5288 }, { 3046, 0x8a19 }, { 3052, 0x865e }, { 3060, 0x8b18 }, { 3066, 0x2e59 }, { 3074, 0x4160 }, { 3078, 0x8c10 }, { 3082, 0x9cbe }, { 3092, 0x6861 }, { 3098, 0x891c }, { 3104, 0x9800 }, { 3107, 0x0008 }, /* 0x6c00 */ { 3108, 0x8100 }, { 3110, 0x089a }, { 3115, 0x0018 }, { 3117, 0x4190 }, { 3121, 0x4007 }, { 3125, 0xe4a1 }, { 3132, 0x0505 }, { 3136, 0x640d }, { 3142, 0x310e }, { 3148, 0x0e4d }, { 3155, 0x4806 }, { 3159, 0xff0a }, { 3169, 0x1632 }, { 3175, 0x2aa8 }, { 3181, 0x852e }, { 3188, 0x000b }, /* 0x6d00 */ { 3191, 0x1800 }, { 3193, 0xca84 }, { 3199, 0x0e20 }, { 3203, 0x696c }, { 3211, 0x0032 }, { 3214, 0x1600 }, { 3217, 0x5658 }, { 3224, 0x0390 }, { 3228, 0x5120 }, { 3232, 0x1a28 }, { 3237, 0x8000 }, { 3238, 0x1124 }, { 3242, 0x18e1 }, { 3248, 0x4326 }, { 3254, 0x5d52 }, { 3262, 0x0eaa }, /* 0x6e00 */ { 3269, 0x0fa0 }, { 3275, 0xae28 }, { 3282, 0xfa7b }, { 3294, 0x4500 }, { 3297, 0x6408 }, { 3301, 0x8940 }, { 3305, 0xc880 }, { 3309, 0xc044 }, { 3313, 0x9005 }, { 3317, 0xb141 }, { 3323, 0x8424 }, { 3327, 0x24c4 }, { 3332, 0x1a34 }, { 3338, 0x603a }, { 3344, 0x9000 }, { 3346, 0xc194 }, /* 0x6f00 */ { 3352, 0x8246 }, { 3357, 0x003a }, { 3361, 0x180d }, { 3366, 0xc106 }, { 3371, 0x0022 }, { 3373, 0x9910 }, { 3378, 0xe050 }, { 3383, 0x1511 }, { 3388, 0x4057 }, { 3394, 0x0082 }, { 3396, 0x041a }, { 3400, 0x020a }, { 3403, 0x004f }, { 3408, 0x8930 }, { 3413, 0xd813 }, { 3420, 0x444a }, /* 0x7000 */ { 3425, 0x8a02 }, { 3429, 0xed22 }, { 3437, 0x10c0 }, { 3440, 0x4005 }, { 3443, 0x1000 }, { 3444, 0x0102 }, { 3446, 0x8808 }, { 3449, 0x3101 }, { 3453, 0x4600 }, { 3456, 0x0204 }, { 3458, 0xf000 }, { 3462, 0x0708 }, { 3466, 0x8900 }, { 3469, 0xa200 }, { 3472, 0x0000 }, { 3472, 0x2202 }, /* 0x7100 */ { 3475, 0x0200 }, { 3476, 0x1610 }, { 3480, 0x0042 }, { 3482, 0x1040 }, { 3484, 0x5200 }, { 3487, 0x0260 }, { 3490, 0x52f4 }, { 3498, 0x2000 }, { 3499, 0x8510 }, { 3503, 0x8230 }, { 3507, 0x1100 }, { 3509, 0x4202 }, { 3512, 0x4308 }, { 3516, 0x80b5 }, { 3522, 0x70e1 }, { 3529, 0x9a20 }, /* 0x7200 */ { 3534, 0x2040 }, { 3536, 0x0801 }, { 3538, 0x3500 }, { 3542, 0xfc65 }, { 3552, 0x19c1 }, { 3558, 0xab04 }, { 3564, 0x0286 }, { 3568, 0x6214 }, { 3573, 0x0087 }, { 3577, 0x0044 }, { 3579, 0x9085 }, { 3584, 0x0244 }, { 3587, 0x405c }, { 3592, 0x0a85 }, { 3597, 0x3207 }, { 3603, 0x3380 }, /* 0x7300 */ { 3608, 0x0400 }, { 3609, 0xb8c0 }, { 3615, 0xce20 }, { 3621, 0xc0d0 }, { 3626, 0xc030 }, { 3630, 0x0080 }, { 3631, 0x0508 }, { 3634, 0x0d25 }, { 3640, 0x0a90 }, { 3644, 0x0040 }, { 3645, 0x0200 }, { 3646, 0x080c }, { 3649, 0x6505 }, { 3655, 0x4000 }, { 3656, 0x6421 }, { 3661, 0x4102 }, /* 0x7400 */ { 3664, 0x0268 }, { 3668, 0x0000 }, { 3668, 0x0024 }, { 3670, 0x847c }, { 3677, 0x0002 }, { 3678, 0xde20 }, { 3685, 0x8619 }, { 3691, 0x4049 }, { 3695, 0x0808 }, { 3697, 0x4000 }, { 3698, 0x0084 }, { 3700, 0x2001 }, { 3702, 0x8400 }, { 3704, 0x1010 }, { 3706, 0x42cd }, { 3713, 0x01c7 }, /* 0x7500 */ { 3719, 0x7038 }, { 3725, 0xd52a }, { 3733, 0x1968 }, { 3739, 0x1d8f }, { 3748, 0xbe50 }, { 3756, 0x3e12 }, { 3763, 0x2ef5 }, { 3773, 0x81d9 }, { 3780, 0xcec4 }, { 3788, 0x2412 }, { 3792, 0x0828 }, { 3795, 0x732e }, { 3804, 0x24ac }, { 3810, 0x4b34 }, { 3817, 0x020c }, { 3820, 0xd41d }, /* 0x7600 */ { 3828, 0x2a02 }, { 3832, 0x8000 }, { 3833, 0x0097 }, { 3838, 0x0811 }, { 3841, 0x11c4 }, { 3846, 0x1144 }, { 3850, 0x1786 }, { 3857, 0x7d45 }, { 3866, 0x49d9 }, { 3874, 0x0649 }, { 3879, 0x4000 }, { 3880, 0x8791 }, { 3887, 0x254c }, { 3893, 0xd8c4 }, { 3900, 0x44ba }, { 3907, 0x4914 }, /* 0x7700 */ { 3912, 0x1b92 }, { 3919, 0xc800 }, { 3922, 0x0271 }, { 3927, 0x1580 }, { 3931, 0x0081 }, { 3933, 0x0c00 }, { 3935, 0x096a }, { 3941, 0xc200 }, { 3944, 0x4800 }, { 3946, 0x4002 }, { 3948, 0x3021 }, { 3952, 0xba49 }, { 3960, 0x2080 }, { 3962, 0x1c80 }, { 3966, 0xe2ac }, { 3974, 0x1008 }, /* 0x7800 */ { 3976, 0x1004 }, { 3978, 0x0034 }, { 3981, 0x00e1 }, { 3985, 0x8414 }, { 3989, 0x0020 }, { 3990, 0x2000 }, { 3991, 0x9800 }, { 3994, 0x1014 }, { 3997, 0x70c2 }, { 4003, 0x04aa }, { 4008, 0x8688 }, { 4013, 0x5420 }, { 4017, 0x0c62 }, { 4022, 0x0413 }, { 4026, 0x9180 }, { 4030, 0x2010 }, /* 0x7900 */ { 4032, 0x4082 }, { 4035, 0x0206 }, { 4038, 0x1c40 }, { 4042, 0x5400 }, { 4045, 0x0383 }, { 4050, 0xe4e9 }, { 4059, 0x2125 }, { 4064, 0x8480 }, { 4067, 0xe433 }, { 4075, 0x2000 }, { 4076, 0x44c0 }, { 4080, 0xe609 }, { 4087, 0x0a03 }, { 4091, 0x8126 }, { 4096, 0x12da }, { 4103, 0x0801 }, /* 0x7a00 */ { 4105, 0x6901 }, { 4110, 0x9790 }, { 4117, 0x4001 }, { 4119, 0xf886 }, { 4127, 0xe24d }, { 4135, 0x0081 }, { 4137, 0x0a0e }, { 4142, 0xa651 }, { 4149, 0x011a }, { 4153, 0x81ec }, { 4160, 0xc600 }, { 4164, 0x8441 }, { 4168, 0xadb8 }, { 4177, 0xb62c }, { 4185, 0xa46f }, { 4194, 0x8741 }, /* 0x7b00 */ { 4200, 0x8d54 }, { 4207, 0x4b02 }, { 4212, 0x1161 }, { 4217, 0x0268 }, { 4221, 0xbb60 }, { 4229, 0x2057 }, { 4235, 0x50a0 }, { 4239, 0x0433 }, { 4244, 0xa8c0 }, { 4249, 0xb7b4 }, { 4259, 0x2402 }, { 4262, 0x0112 }, { 4265, 0x9ad3 }, { 4274, 0x2000 }, { 4275, 0x2271 }, { 4281, 0x00c8 }, /* 0x7c00 */ { 4284, 0x2081 }, { 4287, 0x809e }, { 4293, 0x0c8a }, { 4298, 0xe180 }, { 4303, 0xb009 }, { 4308, 0x8151 }, { 4313, 0x1031 }, { 4317, 0x4028 }, { 4320, 0x2a0e }, { 4326, 0x89a5 }, { 4333, 0x69b6 }, { 4342, 0x620e }, { 4348, 0x4425 }, { 4353, 0xd144 }, { 4359, 0x8085 }, { 4363, 0x4d54 }, /* 0x7d00 */ { 4370, 0x2c75 }, { 4378, 0x1fb1 }, { 4387, 0xd807 }, { 4394, 0x862d }, { 4401, 0xd87c }, { 4410, 0x4841 }, { 4414, 0x414e }, { 4420, 0x226e }, { 4427, 0x8200 }, { 4429, 0x9e08 }, { 4435, 0xf80c }, { 4442, 0xed37 }, { 4453, 0x8c80 }, { 4457, 0x7526 }, { 4465, 0x9313 }, { 4472, 0x0814 }, /* 0x7e00 */ { 4475, 0x0e32 }, { 4481, 0xc804 }, { 4485, 0x484e }, { 4491, 0x6ea6 }, { 4500, 0x2c4a }, { 4506, 0x6670 }, { 4513, 0x26c0 }, { 4518, 0xba01 }, { 4524, 0xd30c }, { 4531, 0x185d }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, /* 0x7f00 */ { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0540 }, { 4541, 0x7020 }, { 4545, 0x8133 }, { 4551, 0x4f81 }, { 4558, 0x03a5 }, { 4564, 0x55ec }, { 4573, 0x6410 }, { 4577, 0xc318 }, { 4583, 0x2344 }, { 4588, 0x1462 }, { 4593, 0x0034 }, { 4596, 0x0a43 }, { 4601, 0x1a09 }, /* 0x8000 */ { 4606, 0x187b }, { 4614, 0x13a5 }, { 4621, 0x0102 }, { 4623, 0xa848 }, { 4628, 0x0440 }, { 4630, 0xc544 }, { 4636, 0x8106 }, { 4640, 0xe2dd }, { 4650, 0x1af0 }, { 4657, 0x2d48 }, { 4663, 0xb626 }, { 4671, 0x0416 }, { 4675, 0x5058 }, { 4680, 0x6e40 }, { 4686, 0x8032 }, { 4690, 0x3112 }, /* 0x8100 */ { 4695, 0x07e4 }, { 4702, 0x0c00 }, { 4704, 0x8208 }, { 4707, 0x420a }, { 4711, 0x4840 }, { 4714, 0x803b }, { 4720, 0x4860 }, { 4724, 0x8713 }, { 4731, 0x850d }, { 4737, 0x3428 }, { 4742, 0x0319 }, { 4747, 0xe529 }, { 4755, 0x2345 }, { 4761, 0x870a }, { 4767, 0x25a9 }, { 4774, 0x5c18 }, /* 0x8200 */ { 4780, 0x77a6 }, { 4790, 0xd9c5 }, { 4799, 0x5e00 }, { 4804, 0x03e8 }, { 4810, 0x0081 }, { 4812, 0xa700 }, { 4817, 0xcd54 }, { 4825, 0x41c6 }, { 4831, 0x2800 }, { 4833, 0xa204 }, { 4837, 0xb860 }, { 4843, 0x2b0a }, { 4849, 0x0020 }, { 4850, 0xda9e }, { 4860, 0x08ea }, { 4866, 0x0e1a }, /* 0x8300 */ { 4872, 0x427c }, { 4879, 0x11c0 }, { 4883, 0x8908 }, { 4887, 0x0376 }, { 4894, 0x8621 }, { 4899, 0x0105 }, { 4902, 0x0000 }, { 4902, 0x18a8 }, { 4907, 0x46a0 }, { 4912, 0xc448 }, { 4917, 0x0d05 }, { 4922, 0x2022 }, { 4925, 0x5422 }, { 4930, 0x9148 }, { 4935, 0x8a01 }, { 4939, 0x2897 }, /* 0x8400 */ { 4946, 0x7898 }, { 4953, 0x0008 }, { 4954, 0x1605 }, { 4959, 0x3122 }, { 4964, 0x4240 }, { 4967, 0x0880 }, { 4969, 0xfa4e }, { 4979, 0x06a2 }, { 4984, 0x0814 }, { 4987, 0x9211 }, { 4992, 0x2002 }, { 4994, 0x9b04 }, { 5000, 0x2e52 }, { 5007, 0x0643 }, { 5012, 0x5000 }, { 5014, 0x9010 }, /* 0x8500 */ { 5017, 0x0041 }, { 5019, 0x85ba }, { 5027, 0x3042 }, { 5031, 0x2020 }, { 5033, 0x4f0b }, { 5041, 0x05a0 }, { 5045, 0x2708 }, { 5050, 0x4080 }, { 5052, 0x0591 }, { 5057, 0x1a93 }, { 5064, 0xdf50 }, { 5073, 0x0600 }, { 5075, 0xa202 }, { 5079, 0x3021 }, { 5083, 0x0630 }, { 5087, 0x4e80 }, /* 0x8600 */ { 5092, 0x0cc4 }, { 5097, 0x04c8 }, { 5101, 0xa004 }, { 5104, 0x8001 }, { 5106, 0x6000 }, { 5108, 0xd431 }, { 5115, 0x0880 }, { 5117, 0x0a02 }, { 5120, 0x1c00 }, { 5123, 0x0028 }, { 5125, 0x8e18 }, { 5131, 0x0041 }, { 5133, 0x6ad0 }, { 5140, 0xca10 }, { 5145, 0xf210 }, { 5151, 0x4b00 }, /* 0x8700 */ { 5155, 0x274d }, { 5163, 0x1506 }, { 5168, 0x0220 }, { 5170, 0x8890 }, { 5174, 0x5a00 }, { 5178, 0x82a8 }, { 5183, 0x4549 }, { 5189, 0x8150 }, { 5193, 0x2004 }, { 5195, 0x8000 }, { 5196, 0x8804 }, { 5199, 0x2c08 }, { 5203, 0x08d1 }, { 5208, 0x0005 }, { 5210, 0x8001 }, { 5212, 0x4ac4 }, /* 0x8800 */ { 5218, 0xe020 }, { 5222, 0x0062 }, { 5225, 0x008e }, { 5229, 0x0a42 }, { 5233, 0x3055 }, { 5239, 0x6a8c }, { 5246, 0x090e }, { 5251, 0xe0a5 }, { 5258, 0x2906 }, { 5263, 0x42c4 }, { 5268, 0x4814 }, { 5272, 0x80b3 }, { 5278, 0x803e }, { 5284, 0xb330 }, { 5291, 0x0102 }, { 5293, 0x731c }, /* 0x8900 */ { 5301, 0x1494 }, { 5306, 0x600d }, { 5311, 0x0c20 }, { 5314, 0x0940 }, { 5317, 0x301a }, { 5322, 0xc040 }, { 5325, 0xa451 }, { 5331, 0xc094 }, { 5336, 0x8dca }, { 5344, 0x05c8 }, { 5349, 0x96c2 }, { 5356, 0xa40c }, { 5361, 0x0001 }, { 5362, 0x3404 }, { 5366, 0x00c8 }, { 5369, 0x0110 }, /* 0x8a00 */ { 5371, 0x550d }, { 5378, 0xa9c9 }, { 5386, 0x2428 }, { 5390, 0x1c5a }, { 5397, 0x0142 }, { 5400, 0x4837 }, { 5407, 0x7a4d }, { 5416, 0x100f }, { 5421, 0x32b4 }, { 5428, 0x452a }, { 5434, 0x317b }, { 5443, 0x9205 }, { 5448, 0xb894 }, { 5455, 0x5c44 }, { 5461, 0x68d7 }, { 5470, 0x458a }, /* 0x8b00 */ { 5476, 0x5097 }, { 5483, 0x2ed1 }, { 5491, 0x1943 }, { 5497, 0x4208 }, { 5500, 0xd202 }, { 5505, 0x9d40 }, { 5511, 0x9840 }, { 5515, 0x2097 }, { 5521, 0x5409 }, { 5526, 0x064d }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, /* 0x8c00 */ { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x8480 }, { 5535, 0x5542 }, { 5541, 0x0421 }, { 5544, 0x1c06 }, { 5549, 0x1700 }, { 5553, 0x7624 }, { 5560, 0x6110 }, { 5564, 0xff87 }, { 5576, 0xb9dd }, { 5587, 0x659f }, { 5597, 0x5c0a }, { 5603, 0x245d }, { 5610, 0x3c00 }, /* 0x8d00 */ { 5614, 0xadb0 }, { 5622, 0x0059 }, { 5626, 0x0000 }, { 5626, 0x0000 }, { 5626, 0x0000 }, { 5626, 0x0000 }, { 5626, 0x28d0 }, { 5631, 0x009b }, { 5636, 0x0422 }, { 5639, 0x0200 }, { 5640, 0x0108 }, { 5642, 0x4408 }, { 5645, 0x9804 }, { 5649, 0xac40 }, { 5654, 0x8d0a }, { 5660, 0x9028 }, /* 0x8e00 */ { 5664, 0x8700 }, { 5668, 0xe001 }, { 5672, 0x0400 }, { 5673, 0x0031 }, { 5676, 0x1794 }, { 5683, 0x8221 }, { 5687, 0x0019 }, { 5690, 0x1054 }, { 5694, 0x2cb2 }, { 5701, 0x021a }, { 5705, 0x9c02 }, { 5710, 0x4003 }, { 5713, 0x3d60 }, { 5720, 0x8804 }, { 5723, 0x080c }, { 5726, 0x7900 }, /* 0x8f00 */ { 5731, 0x1628 }, { 5736, 0xba3c }, { 5745, 0x8640 }, { 5749, 0xcb08 }, { 5755, 0x7274 }, { 5763, 0x9080 }, { 5766, 0x001e }, { 5770, 0x0000 }, { 5770, 0x0000 }, { 5770, 0xd800 }, { 5774, 0xe188 }, { 5780, 0x9c87 }, { 5788, 0x4034 }, { 5792, 0x0412 }, { 5795, 0xae64 }, { 5803, 0x2791 }, /* 0x9000 */ { 5810, 0xe86b }, { 5819, 0xe6fb }, { 5831, 0x408f }, { 5837, 0x5366 }, { 5845, 0xeea6 }, { 5855, 0x537f }, { 5866, 0xe32b }, { 5875, 0xb5e4 }, { 5884, 0x869f }, { 5893, 0x0002 }, { 5894, 0x8548 }, { 5899, 0x0122 }, { 5902, 0x4402 }, { 5905, 0x0800 }, { 5906, 0x2116 }, { 5911, 0x20a0 }, /* 0x9100 */ { 5914, 0x0004 }, { 5915, 0x0204 }, { 5917, 0x2000 }, { 5918, 0x0005 }, { 5920, 0x7e00 }, { 5926, 0x0154 }, { 5930, 0x162c }, { 5936, 0x01ac }, { 5941, 0x2a84 }, { 5946, 0x1085 }, { 5950, 0x8c14 }, { 5955, 0x0530 }, { 5959, 0xfbc3 }, { 5970, 0xb943 }, { 5978, 0x00ca }, { 5982, 0x9060 }, /* 0x9200 */ { 5986, 0x6000 }, { 5988, 0x4032 }, { 5992, 0x1200 }, { 5994, 0x8090 }, { 5997, 0x0b30 }, { 6002, 0x4c81 }, { 6007, 0x0054 }, { 6010, 0x4002 }, { 6012, 0x0029 }, { 6015, 0x1d6a }, { 6023, 0x2000 }, { 6024, 0x0280 }, { 6026, 0x8000 }, { 6027, 0x0004 }, { 6028, 0x2610 }, { 6032, 0x150c }, /* 0x9300 */ { 6037, 0x8040 }, { 6039, 0x0701 }, { 6043, 0xd94d }, { 6052, 0x0c24 }, { 6056, 0x2810 }, { 6059, 0x1850 }, { 6063, 0x5001 }, { 6066, 0x5020 }, { 6069, 0x1000 }, { 6070, 0x04d0 }, { 6074, 0x7080 }, { 6078, 0x0201 }, { 6080, 0x0108 }, { 6082, 0x21c3 }, { 6088, 0x0132 }, { 6092, 0x0000 }, /* 0x9400 */ { 6092, 0x0088 }, { 6094, 0x0719 }, { 6100, 0x0802 }, { 6102, 0x0560 }, { 6106, 0x0012 }, { 6108, 0x4c0e }, { 6114, 0x0405 }, { 6117, 0xf0a1 }, { 6124, 0x0002 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, /* 0x9500 */ { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0080 }, { 6126, 0x8e8d }, { 6134, 0x035a }, { 6140, 0x21bd }, { 6148, 0x5a04 }, { 6153, 0x3488 }, { 6158, 0x1170 }, { 6163, 0x0026 }, { 6166, 0x0000 }, /* 0x9600 */ { 6166, 0x0000 }, { 6166, 0x1000 }, { 6167, 0xc502 }, { 6172, 0x8804 }, { 6175, 0xb815 }, { 6182, 0xf801 }, { 6188, 0x147c }, { 6195, 0x25ed }, { 6204, 0xed60 }, { 6212, 0x1bb0 }, { 6219, 0x0589 }, { 6224, 0x1bd7 }, { 6234, 0x7af3 }, { 6245, 0x1a62 }, { 6251, 0x0d0c }, { 6256, 0x0ac5 }, /* 0x9700 */ { 6262, 0xe5d1 }, { 6271, 0x524a }, { 6277, 0x0490 }, { 6280, 0x6305 }, { 6286, 0x0354 }, { 6291, 0x5244 }, { 6296, 0x2b57 }, { 6305, 0x1612 }, { 6310, 0xa872 }, { 6317, 0x1101 }, { 6320, 0x2949 }, { 6326, 0x0018 }, { 6328, 0x0948 }, { 6332, 0x1008 }, { 6334, 0x6000 }, { 6336, 0x886c }, /* 0x9800 */ { 6342, 0x916e }, { 6350, 0x058f }, { 6357, 0x3012 }, { 6361, 0x3990 }, { 6367, 0xf840 }, { 6373, 0x4930 }, { 6378, 0x8880 }, { 6381, 0x001b }, { 6385, 0x0000 }, { 6385, 0x0000 }, { 6385, 0x8500 }, { 6388, 0x0042 }, { 6390, 0x0058 }, { 6393, 0x9800 }, { 6396, 0xea04 }, { 6402, 0x7014 }, /* 0x9900 */ { 6407, 0x1628 }, { 6412, 0x611d }, { 6419, 0x5113 }, { 6425, 0x6000 }, { 6427, 0x1a24 }, { 6432, 0x00a7 }, { 6437, 0x0000 }, { 6437, 0x0000 }, { 6437, 0x0000 }, { 6437, 0x03c0 }, { 6441, 0x7120 }, { 6446, 0x1018 }, { 6449, 0x0172 }, { 6454, 0xa927 }, { 6462, 0x6004 }, { 6465, 0x8906 }, /* 0x9a00 */ { 6470, 0xc022 }, { 6474, 0x020c }, { 6477, 0x0900 }, { 6479, 0x4081 }, { 6482, 0x202d }, { 6487, 0x8ca0 }, { 6492, 0x0e34 }, { 6498, 0x0000 }, { 6498, 0x0000 }, { 6498, 0x0000 }, { 6498, 0x2100 }, { 6500, 0x1101 }, { 6503, 0x8011 }, { 6506, 0xc11a }, { 6512, 0xec4c }, { 6520, 0x0892 }, /* 0x9b00 */ { 6524, 0x0040 }, { 6525, 0x8500 }, { 6528, 0xc7ac }, { 6537, 0x1806 }, { 6541, 0xe03e }, { 6549, 0x0512 }, { 6553, 0x8000 }, { 6554, 0x0010 }, { 6555, 0x4008 }, { 6557, 0x80ce }, { 6563, 0x6d01 }, { 6569, 0x0210 }, { 6571, 0x8641 }, { 6576, 0x0856 }, { 6581, 0x011e }, { 6586, 0x0027 }, /* 0x9c00 */ { 6590, 0x3750 }, { 6597, 0x083d }, { 6603, 0xe032 }, { 6609, 0x4e05 }, { 6615, 0x01c0 }, { 6618, 0x0484 }, { 6621, 0x0081 }, { 6623, 0x0140 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x1aa0 }, { 6630, 0x0059 }, /* 0x9d00 */ { 6634, 0x43c8 }, { 6640, 0x8824 }, { 6644, 0x1d48 }, { 6650, 0xc800 }, { 6653, 0x0152 }, { 6657, 0x7203 }, { 6663, 0x9013 }, { 6668, 0x0404 }, { 6670, 0x8280 }, { 6673, 0x0400 }, { 6674, 0x8a10 }, { 6678, 0x0d14 }, { 6683, 0x8056 }, { 6688, 0x0208 }, { 6690, 0xa040 }, { 6693, 0x2704 }, /* 0x9e00 */ { 6698, 0x0000 }, { 6698, 0x4c00 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0xa320 }, { 6706, 0x1902 }, { 6710, 0xa0ae }, { 6717, 0x2660 }, { 6722, 0xdf00 }, { 6729, 0xf010 }, { 6734, 0x7b15 }, { 6743, 0x8121 }, { 6747, 0x3ad0 }, /* 0x9f00 */ { 6754, 0x4180 }, { 6757, 0x0028 }, { 6759, 0x1003 }, { 6762, 0x4800 }, { 6764, 0xcc00 }, { 6768, 0x8014 }, { 6771, 0x14cf }, { 6779, 0x00c4 }, { 6782, 0x2000 }, { 6783, 0x3020 }, { 6786, 0x0001 }, }; static const Summary16 jisx0208_uni2indx_pageff[15] = { /* 0xff00 */ { 6787, 0xdf7a }, { 6799, 0xffff }, { 6815, 0xffff }, { 6831, 0xffff }, { 6847, 0xffff }, { 6863, 0x3fff }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0028 }, }; static int jisx0208_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc > 0x0000 && wc < 0x0100) summary = &jisx0208_uni2indx_page00[(wc>>4)]; else if (wc >= 0x0300 && wc < 0x0460) summary = &jisx0208_uni2indx_page03[(wc>>4)-0x030]; else if (wc >= 0x2000 && wc < 0x2320) summary = &jisx0208_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x2500 && wc < 0x2670) summary = &jisx0208_uni2indx_page25[(wc>>4)-0x250]; else if (wc >= 0x3000 && wc < 0x3100) summary = &jisx0208_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x4e00 && wc < 0x9fb0) summary = &jisx0208_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xff00 && wc < 0xfff0) summary = &jisx0208_uni2indx_pageff[(wc>>4)-0xff0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' and the number of bits set in `used'. */ used = (used & 0x5555) + ((used & 0xaaaa) >> 1); used = (used & 0x3333) + ((used & 0xcccc) >> 2); used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); used = (used & 0x00ff) + (used >> 8); c = jisx0208_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_16.h0000664000175000017500000001122212313064025016177 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-16 */ static const unsigned short iso8859_16_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b, /* 0xb0 */ 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7, 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a, 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b, 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff, }; static int iso8859_16_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_16_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_16_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xab, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0xc6, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0x00, 0xd2, 0xd3, 0xd4, 0x00, 0xd6, 0x00, /* 0xd0-0xd7 */ 0x00, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0x00, 0xf2, 0xf3, 0xf4, 0x00, 0xf6, 0x00, /* 0xf0-0xf7 */ 0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0xa1, 0xa2, 0xc5, 0xe5, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xb2, 0xb9, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xd5, 0xf5, 0xbc, 0xbd, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xa6, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0xbe, 0xac, 0xae, 0xaf, 0xbf, 0xb4, 0xb8, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_16_page02[8] = { 0xaa, 0xba, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static const unsigned char iso8859_16_page20[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xa5, 0x00, /* 0x18-0x1f */ }; static int iso8859_16_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_16_page00[wc-0x00a0]; else if (wc >= 0x0218 && wc < 0x0220) c = iso8859_16_page02[wc-0x0218]; else if (wc >= 0x2018 && wc < 0x2020) c = iso8859_16_page20[wc-0x2018]; else if (wc == 0x20ac) c = 0xa4; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_7.h0000664000175000017500000000766412313064025016136 00000000000000/* * Copyright (C) 1999-2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-7 */ static const unsigned short iso8859_7_2uni[96] = { /* 0xa0 */ 0x00a0, 0x2018, 0x2019, 0x00a3, 0x20ac, 0x20af, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x037a, 0x00ab, 0x00ac, 0x00ad, 0xfffd, 0x2015, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, /* 0xc0 */ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, /* 0xd0 */ 0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, /* 0xe0 */ 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, /* 0xf0 */ 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd, }; static int iso8859_7_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = iso8859_7_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char iso8859_7_page00[32] = { 0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0x00, 0x00, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char iso8859_7_page03[88] = { 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0x00, /* 0x80-0x87 */ 0xb8, 0xb9, 0xba, 0x00, 0xbc, 0x00, 0xbe, 0xbf, /* 0x88-0x8f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x90-0x97 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x98-0x9f */ 0xd0, 0xd1, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xa0-0xa7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xa8-0xaf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xb0-0xb7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xb8-0xbf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xc0-0xc7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xc8-0xcf */ }; static const unsigned char iso8859_7_page20[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, /* 0x10-0x17 */ 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static int iso8859_7_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = iso8859_7_page00[wc-0x00a0]; else if (wc >= 0x0378 && wc < 0x03d0) c = iso8859_7_page03[wc-0x0378]; else if (wc >= 0x2010 && wc < 0x2020) c = iso8859_7_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0xa4; else if (wc == 0x20af) c = 0xa5; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/cp936ext.h0000664000175000017500000000664712313064025016145 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP936 extensions */ static const unsigned short cp936ext_2uni_pagea6[181-159] = { /* 0xa6 */ 0xfe35, 0xfe36, 0xfe39, 0xfe3a, 0xfe3f, 0xfe40, 0xfe3d, 0xfe3e, 0xfe41, 0xfe42, 0xfe43, 0xfe44, 0xfffd, 0xfffd, 0xfe3b, 0xfe3c, 0xfe37, 0xfe38, 0xfe31, 0xfffd, 0xfe33, 0xfe34, }; static const unsigned short cp936ext_2uni_pagea8[128-122] = { /* 0xa8 */ 0x0251, 0xfffd, 0x0144, 0x0148, 0xfffd, 0x0261, }; static int cp936ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 == 0xa6) || (c1 == 0xa8)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xff)) { unsigned int i = 190 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); unsigned short wc = 0xfffd; if (i < 7410) { if (i >= 7189 && i < 7211) wc = cp936ext_2uni_pagea6[i-7189]; } else { if (i >= 7532 && i < 7538) wc = cp936ext_2uni_pagea8[i-7532]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short cp936ext_page01[16] = { 0x0000, 0x0000, 0x0000, 0x0000, 0xa8bd, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/ 0xa8be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/ }; static const unsigned short cp936ext_page02[24] = { 0x0000, 0xa8bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/ 0x0000, 0xa8c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/ }; static const unsigned short cp936ext_pagefe[24] = { 0x0000, 0xa6f2, 0x0000, 0xa6f4, 0xa6f5, 0xa6e0, 0xa6e1, 0xa6f0, /*0x30-0x37*/ 0xa6f1, 0xa6e2, 0xa6e3, 0xa6ee, 0xa6ef, 0xa6e6, 0xa6e7, 0xa6e4, /*0x38-0x3f*/ 0xa6e5, 0xa6e8, 0xa6e9, 0xa6ea, 0xa6eb, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/ }; static int cp936ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { unsigned short c = 0; if (wc >= 0x0140 && wc < 0x0150) c = cp936ext_page01[wc-0x0140]; else if (wc >= 0x0250 && wc < 0x0268) c = cp936ext_page02[wc-0x0250]; else if (wc >= 0xfe30 && wc < 0xfe48) c = cp936ext_pagefe[wc-0xfe30]; if (c != 0) { r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-3.21.80/src/libtiniconv/encdec/cp936.h0000664000175000017500000000702212313064025015410 00000000000000/* * Copyright (C) 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP936 */ /* * The IANA has CP936 as an alias of GBK. But GBK is an official Chinese * specification, whereas CP936 is de-facto maintained by Microsoft. And, * of course, Microsoft modified CP936 since 1999. * * The differences from GBK are: * * 1. A single character: * * code CP936.TXT * 0x80 0x20AC # EURO SIGN * * Some variants of CP936 (in JDK, Windows-2000, ICU) also add: * * 2. Private area mappings: * * code Unicode * 0x{A1..A2}{40..7E,80..A0} U+E4C6..U+E585 * 0x{AA..AF,F8..FE}{A1..FE} U+E000..U+E4C5 * * We add them too because, although there are backward compatibility problems * when a character from a private area is moved to an official Unicode code * point, they are useful for some people in practice. */ static int cp936_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { /* Try GBK first. */ { int ret = ces_gbk_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; } /* Then handle the additional mappings. */ { unsigned char c = *s; if (c == 0x80) { *pwc = 0x20ac; return 1; } /* User-defined characters */ if (c >= 0xa1 && c <= 0xa2) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xa1)) { *pwc = 0xe4c6 + 96 * (c - 0xa1) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); return 2; } } } else if ((c >= 0xaa && c < 0xb0) || (c >= 0xf8 && c < 0xff)) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xff) { *pwc = 0xe000 + 94 * (c - (c >= 0xf8 ? 0xf2 : 0xaa)) + (c2 - 0xa1); return 2; } } } } return RET_ILSEQ; } static int cp936_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { /* Try GBK first. */ { int ret = ces_gbk_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; } /* Then handle the additional mappings. */ if (wc >= 0xe000 && wc < 0xe586) { /* User-defined characters */ if (n < 2) return RET_TOOFEW(0); if (wc < 0xe4c6) { unsigned int i = wc - 0xe000; unsigned int c1 = i / 94; unsigned int c2 = i % 94; r[0] = c1 + (c1 < 6 ? 0xaa : 0xf2); r[1] = c2 + 0xa1; return 2; } else { unsigned int i = wc - 0xe4c6; unsigned int c1 = i / 96; unsigned int c2 = i % 96; r[0] = c1 + 0xa1; r[1] = c2 + (c2 < 0x3f ? 0x40 : 0x41); return 2; } } else if (wc == 0x20ac) { r[0] = 0x80; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_2.h0000664000175000017500000001114212313064025016113 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-2 */ static const unsigned short iso8859_2_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, /* 0xb0 */ 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, /* 0xc0 */ 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, /* 0xd0 */ 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, /* 0xe0 */ 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, /* 0xf0 */ 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, }; static int iso8859_2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_2_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_2_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0x00, 0x00, 0xda, 0x00, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0x00, 0x00, 0xfa, 0x00, 0xfc, 0xfd, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0xa1, 0xb1, 0xc6, 0xe6, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0xcf, 0xef, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xca, 0xea, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0xc5, 0xe5, 0x00, 0x00, 0xa5, 0xb5, 0x00, /* 0x38-0x3f */ 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0xd2, /* 0x40-0x47 */ 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xd5, 0xf5, 0x00, 0x00, 0xc0, 0xe0, 0x00, 0x00, /* 0x50-0x57 */ 0xd8, 0xf8, 0xa6, 0xb6, 0x00, 0x00, 0xaa, 0xba, /* 0x58-0x5f */ 0xa9, 0xb9, 0xde, 0xfe, 0xab, 0xbb, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, /* 0x68-0x6f */ 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0xac, 0xbc, 0xaf, 0xbf, 0xae, 0xbe, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_2_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xa2, 0xff, 0x00, 0xb2, 0x00, 0xbd, 0x00, 0x00, /* 0xd8-0xdf */ }; static int iso8859_2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_2_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = iso8859_2_page02[wc-0x02c0]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_11.h0000664000175000017500000000276012313064025016201 00000000000000/* * Copyright (C) 1999-2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-11 */ static int iso8859_11_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa1) { *pwc = (ucs4_t) c; return 1; } else if (c <= 0xfb && !(c >= 0xdb && c <= 0xde)) { *pwc = (ucs4_t) (c + 0x0d60); return 1; } return RET_ILSEQ; } static int iso8859_11_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x00a1) { *r = wc; return 1; } else if (wc >= 0x0e01 && wc <= 0x0e5b && !(wc >= 0x0e3b && wc <= 0x0e3e)) { *r = wc-0x0d60; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/cp1254.h0000664000175000017500000001222712313064025015465 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1254 */ static const unsigned short cp1254_2uni_1[32] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffd, 0xfffd, 0x0178, }; static const unsigned short cp1254_2uni_2[16] = { /* 0xd0 */ 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, }; static const unsigned short cp1254_2uni_3[16] = { /* 0xf0 */ 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, }; static int cp1254_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else if (c < 0xa0) { unsigned short wc = cp1254_2uni_1[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } else if (c < 0xd0) { *pwc = (ucs4_t) c; return 1; } else if (c < 0xe0) { *pwc = (ucs4_t) cp1254_2uni_2[c-0xd0]; return 1; } else if (c < 0xf0) { *pwc = (ucs4_t) c; return 1; } else { *pwc = (ucs4_t) cp1254_2uni_3[c-0xf0]; return 1; } return RET_ILSEQ; } static const unsigned char cp1254_page00[48] = { 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ }; static const unsigned char cp1254_page01[128] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, /* 0x58-0x5f */ 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1254_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1254_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1254_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00d0) c = wc; else if (wc >= 0x00d0 && wc < 0x0100) c = cp1254_page00[wc-0x00d0]; else if (wc >= 0x0118 && wc < 0x0198) c = cp1254_page01[wc-0x0118]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1254_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1254_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/cp1251.h0000664000175000017500000001176512313064025015470 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1251 */ static const unsigned short cp1251_2uni[128] = { /* 0x80 */ 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, /* 0x90 */ 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, /* 0xa0 */ 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, /* 0xb0 */ 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, /* 0xc0 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0xd0 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xe0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xf0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, }; static int cp1251_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1251_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1251_page00[32] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char cp1251_page04[152] = { 0x00, 0xa8, 0x80, 0x81, 0xaa, 0xbd, 0xb2, 0xaf, /* 0x00-0x07 */ 0xa3, 0x8a, 0x8c, 0x8e, 0x8d, 0x00, 0xa1, 0x8f, /* 0x08-0x0f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x10-0x17 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x18-0x1f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x20-0x27 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x28-0x2f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0x48-0x4f */ 0x00, 0xb8, 0x90, 0x83, 0xba, 0xbe, 0xb3, 0xbf, /* 0x50-0x57 */ 0xbc, 0x9a, 0x9c, 0x9e, 0x9d, 0x00, 0xa2, 0x9f, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xa5, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1251_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1251_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = cp1251_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = cp1251_page04[wc-0x0400]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1251_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x88; else if (wc == 0x2116) c = 0xb9; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/mac_cyrillic.h0000664000175000017500000001310212313064025017172 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacCyrillic */ static const unsigned short mac_cyrillic_2uni[128] = { /* 0x80 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0x90 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xa0 */ 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x0406, 0x00ae, 0x00a9, 0x2122, 0x0402, 0x0452, 0x2260, 0x0403, 0x0453, /* 0xb0 */ 0x221e, 0x00b1, 0x2264, 0x2265, 0x0456, 0x00b5, 0x2202, 0x0408, 0x0404, 0x0454, 0x0407, 0x0457, 0x0409, 0x0459, 0x040a, 0x045a, /* 0xc0 */ 0x0458, 0x0405, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, 0x00bb, 0x2026, 0x00a0, 0x040b, 0x045b, 0x040c, 0x045c, 0x0455, /* 0xd0 */ 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x201e, 0x040e, 0x045e, 0x040f, 0x045f, 0x2116, 0x0401, 0x0451, 0x044f, /* 0xe0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xf0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x00a4, }; static int mac_cyrillic_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0x80) *pwc = (ucs4_t) mac_cyrillic_2uni[c-0x80]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char mac_cyrillic_page00[32] = { 0xca, 0x00, 0xa2, 0xa3, 0xff, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xc7, 0xc2, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */ 0xa1, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xa6, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char mac_cyrillic_page04[96] = { 0x00, 0xdd, 0xab, 0xae, 0xb8, 0xc1, 0xa7, 0xba, /* 0x00-0x07 */ 0xb7, 0xbc, 0xbe, 0xcb, 0xcd, 0x00, 0xd8, 0xda, /* 0x08-0x0f */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf, /* 0x48-0x4f */ 0x00, 0xde, 0xac, 0xaf, 0xb9, 0xcf, 0xb4, 0xbb, /* 0x50-0x57 */ 0xc0, 0xbd, 0xbf, 0xcc, 0xce, 0x00, 0xd9, 0xdb, /* 0x58-0x5f */ }; static const unsigned char mac_cyrillic_page20[24] = { 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0xd7, 0x00, /* 0x18-0x1f */ 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_cyrillic_page21[24] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_cyrillic_page22[104] = { 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ }; static int mac_cyrillic_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = mac_cyrillic_page00[wc-0x00a0]; else if (wc == 0x00f7) c = 0xd6; else if (wc == 0x0192) c = 0xc4; else if (wc >= 0x0400 && wc < 0x0460) c = mac_cyrillic_page04[wc-0x0400]; else if (wc >= 0x2010 && wc < 0x2028) c = mac_cyrillic_page20[wc-0x2010]; else if (wc >= 0x2110 && wc < 0x2128) c = mac_cyrillic_page21[wc-0x2110]; else if (wc >= 0x2200 && wc < 0x2268) c = mac_cyrillic_page22[wc-0x2200]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/iso2022_jp.h0000664000175000017500000001222012313064025016331 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-2022-JP */ /* Specification: RFC 1468 */ #define ESC 0x1b /* * The state can be one of the following values. */ #define STATE_ASCII 0 #define STATE_JISX0201ROMAN 1 #define STATE_JISX0208 2 static int iso2022_jp_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { conv_state_t state = conv->istate; int count = 0; unsigned char c; for (;;) { c = *s; if (c == ESC) { if (n < count+3) goto none; if (s[1] == '(') { if (s[2] == 'B') { state = STATE_ASCII; s += 3; count += 3; if (n < count+1) goto none; continue; } if (s[2] == 'J') { state = STATE_JISX0201ROMAN; s += 3; count += 3; if (n < count+1) goto none; continue; } return RET_ILSEQ; } if (s[1] == '$') { if (s[2] == '@' || s[2] == 'B') { /* We don't distinguish JIS X 0208-1978 and JIS X 0208-1983. */ state = STATE_JISX0208; s += 3; count += 3; if (n < count+1) goto none; continue; } return RET_ILSEQ; } return RET_ILSEQ; } break; } switch (state) { case STATE_ASCII: if (c < 0x80) { int ret = ascii_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) return RET_ILSEQ; if (ret != 1) abort(); conv->istate = state; return count+1; } else return RET_ILSEQ; case STATE_JISX0201ROMAN: if (c < 0x80) { int ret = jisx0201_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) return RET_ILSEQ; if (ret != 1) abort(); conv->istate = state; return count+1; } else return RET_ILSEQ; case STATE_JISX0208: if (n < count+2) goto none; if (s[0] < 0x80 && s[1] < 0x80) { int ret = jisx0208_mbtowc(conv,pwc,s,2); if (ret == RET_ILSEQ) return RET_ILSEQ; if (ret != 2) abort(); conv->istate = state; return count+2; } else return RET_ILSEQ; default: abort(); } none: conv->istate = state; return RET_TOOFEW(count); } static int iso2022_jp_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { conv_state_t state = conv->ostate; unsigned char buf[2]; int ret; /* Try ASCII. */ ret = ascii_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state == STATE_ASCII ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state != STATE_ASCII) { r[0] = ESC; r[1] = '('; r[2] = 'B'; r += 3; state = STATE_ASCII; } r[0] = buf[0]; conv->ostate = state; return count; } } /* Try JIS X 0201-1976 Roman. */ ret = jisx0201_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state == STATE_JISX0201ROMAN ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state != STATE_JISX0201ROMAN) { r[0] = ESC; r[1] = '('; r[2] = 'J'; r += 3; state = STATE_JISX0201ROMAN; } r[0] = buf[0]; conv->ostate = state; return count; } } /* Try JIS X 0208-1990 in place of JIS X 0208-1978 and JIS X 0208-1983. */ ret = jisx0208_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state == STATE_JISX0208 ? 2 : 5); if (n < count) return RET_TOOSMALL; if (state != STATE_JISX0208) { r[0] = ESC; r[1] = '$'; r[2] = 'B'; r += 3; state = STATE_JISX0208; } r[0] = buf[0]; r[1] = buf[1]; conv->ostate = state; return count; } } return RET_ILUNI; } static int iso2022_jp_reset (conv_t conv, unsigned char *r, int n) { conv_state_t state = conv->ostate; if (state != STATE_ASCII) { if (n < 3) return RET_TOOSMALL; r[0] = ESC; r[1] = '('; r[2] = 'B'; /* conv->ostate = 0; will be done by the caller */ return 3; } else return 0; } #undef STATE_JISX0208 #undef STATE_JISX0201ROMAN #undef STATE_ASCII fldigi-3.21.80/src/libtiniconv/encdec/gbkext1.h0000664000175000017500000014603612313064025016122 00000000000000/* * Copyright (C) 1999-2000 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK/3 extensions */ static const unsigned short gbkext1_2uni_page81[6080] = { /* 0x81 */ 0x4e02, 0x4e04, 0x4e05, 0x4e06, 0x4e0f, 0x4e12, 0x4e17, 0x4e1f, 0x4e20, 0x4e21, 0x4e23, 0x4e26, 0x4e29, 0x4e2e, 0x4e2f, 0x4e31, 0x4e33, 0x4e35, 0x4e37, 0x4e3c, 0x4e40, 0x4e41, 0x4e42, 0x4e44, 0x4e46, 0x4e4a, 0x4e51, 0x4e55, 0x4e57, 0x4e5a, 0x4e5b, 0x4e62, 0x4e63, 0x4e64, 0x4e65, 0x4e67, 0x4e68, 0x4e6a, 0x4e6b, 0x4e6c, 0x4e6d, 0x4e6e, 0x4e6f, 0x4e72, 0x4e74, 0x4e75, 0x4e76, 0x4e77, 0x4e78, 0x4e79, 0x4e7a, 0x4e7b, 0x4e7c, 0x4e7d, 0x4e7f, 0x4e80, 0x4e81, 0x4e82, 0x4e83, 0x4e84, 0x4e85, 0x4e87, 0x4e8a, 0x4e90, 0x4e96, 0x4e97, 0x4e99, 0x4e9c, 0x4e9d, 0x4e9e, 0x4ea3, 0x4eaa, 0x4eaf, 0x4eb0, 0x4eb1, 0x4eb4, 0x4eb6, 0x4eb7, 0x4eb8, 0x4eb9, 0x4ebc, 0x4ebd, 0x4ebe, 0x4ec8, 0x4ecc, 0x4ecf, 0x4ed0, 0x4ed2, 0x4eda, 0x4edb, 0x4edc, 0x4ee0, 0x4ee2, 0x4ee6, 0x4ee7, 0x4ee9, 0x4eed, 0x4eee, 0x4eef, 0x4ef1, 0x4ef4, 0x4ef8, 0x4ef9, 0x4efa, 0x4efc, 0x4efe, 0x4f00, 0x4f02, 0x4f03, 0x4f04, 0x4f05, 0x4f06, 0x4f07, 0x4f08, 0x4f0b, 0x4f0c, 0x4f12, 0x4f13, 0x4f14, 0x4f15, 0x4f16, 0x4f1c, 0x4f1d, 0x4f21, 0x4f23, 0x4f28, 0x4f29, 0x4f2c, 0x4f2d, 0x4f2e, 0x4f31, 0x4f33, 0x4f35, 0x4f37, 0x4f39, 0x4f3b, 0x4f3e, 0x4f3f, 0x4f40, 0x4f41, 0x4f42, 0x4f44, 0x4f45, 0x4f47, 0x4f48, 0x4f49, 0x4f4a, 0x4f4b, 0x4f4c, 0x4f52, 0x4f54, 0x4f56, 0x4f61, 0x4f62, 0x4f66, 0x4f68, 0x4f6a, 0x4f6b, 0x4f6d, 0x4f6e, 0x4f71, 0x4f72, 0x4f75, 0x4f77, 0x4f78, 0x4f79, 0x4f7a, 0x4f7d, 0x4f80, 0x4f81, 0x4f82, 0x4f85, 0x4f86, 0x4f87, 0x4f8a, 0x4f8c, 0x4f8e, 0x4f90, 0x4f92, 0x4f93, 0x4f95, 0x4f96, 0x4f98, 0x4f99, 0x4f9a, 0x4f9c, 0x4f9e, 0x4f9f, 0x4fa1, 0x4fa2, /* 0x82 */ 0x4fa4, 0x4fab, 0x4fad, 0x4fb0, 0x4fb1, 0x4fb2, 0x4fb3, 0x4fb4, 0x4fb6, 0x4fb7, 0x4fb8, 0x4fb9, 0x4fba, 0x4fbb, 0x4fbc, 0x4fbd, 0x4fbe, 0x4fc0, 0x4fc1, 0x4fc2, 0x4fc6, 0x4fc7, 0x4fc8, 0x4fc9, 0x4fcb, 0x4fcc, 0x4fcd, 0x4fd2, 0x4fd3, 0x4fd4, 0x4fd5, 0x4fd6, 0x4fd9, 0x4fdb, 0x4fe0, 0x4fe2, 0x4fe4, 0x4fe5, 0x4fe7, 0x4feb, 0x4fec, 0x4ff0, 0x4ff2, 0x4ff4, 0x4ff5, 0x4ff6, 0x4ff7, 0x4ff9, 0x4ffb, 0x4ffc, 0x4ffd, 0x4fff, 0x5000, 0x5001, 0x5002, 0x5003, 0x5004, 0x5005, 0x5006, 0x5007, 0x5008, 0x5009, 0x500a, 0x500b, 0x500e, 0x5010, 0x5011, 0x5013, 0x5015, 0x5016, 0x5017, 0x501b, 0x501d, 0x501e, 0x5020, 0x5022, 0x5023, 0x5024, 0x5027, 0x502b, 0x502f, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, 0x5036, 0x5037, 0x5038, 0x5039, 0x503b, 0x503d, 0x503f, 0x5040, 0x5041, 0x5042, 0x5044, 0x5045, 0x5046, 0x5049, 0x504a, 0x504b, 0x504d, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057, 0x5058, 0x5059, 0x505b, 0x505d, 0x505e, 0x505f, 0x5060, 0x5061, 0x5062, 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506a, 0x506b, 0x506d, 0x506e, 0x506f, 0x5070, 0x5071, 0x5072, 0x5073, 0x5074, 0x5075, 0x5078, 0x5079, 0x507a, 0x507c, 0x507d, 0x5081, 0x5082, 0x5083, 0x5084, 0x5086, 0x5087, 0x5089, 0x508a, 0x508b, 0x508c, 0x508e, 0x508f, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, 0x5095, 0x5096, 0x5097, 0x5098, 0x5099, 0x509a, 0x509b, 0x509c, 0x509d, 0x509e, 0x509f, 0x50a0, 0x50a1, 0x50a2, 0x50a4, 0x50a6, 0x50aa, 0x50ab, 0x50ad, 0x50ae, 0x50af, 0x50b0, 0x50b1, 0x50b3, 0x50b4, 0x50b5, 0x50b6, 0x50b7, 0x50b8, 0x50b9, 0x50bc, /* 0x83 */ 0x50bd, 0x50be, 0x50bf, 0x50c0, 0x50c1, 0x50c2, 0x50c3, 0x50c4, 0x50c5, 0x50c6, 0x50c7, 0x50c8, 0x50c9, 0x50ca, 0x50cb, 0x50cc, 0x50cd, 0x50ce, 0x50d0, 0x50d1, 0x50d2, 0x50d3, 0x50d4, 0x50d5, 0x50d7, 0x50d8, 0x50d9, 0x50db, 0x50dc, 0x50dd, 0x50de, 0x50df, 0x50e0, 0x50e1, 0x50e2, 0x50e3, 0x50e4, 0x50e5, 0x50e8, 0x50e9, 0x50ea, 0x50eb, 0x50ef, 0x50f0, 0x50f1, 0x50f2, 0x50f4, 0x50f6, 0x50f7, 0x50f8, 0x50f9, 0x50fa, 0x50fc, 0x50fd, 0x50fe, 0x50ff, 0x5100, 0x5101, 0x5102, 0x5103, 0x5104, 0x5105, 0x5108, 0x5109, 0x510a, 0x510c, 0x510d, 0x510e, 0x510f, 0x5110, 0x5111, 0x5113, 0x5114, 0x5115, 0x5116, 0x5117, 0x5118, 0x5119, 0x511a, 0x511b, 0x511c, 0x511d, 0x511e, 0x511f, 0x5120, 0x5122, 0x5123, 0x5124, 0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512a, 0x512b, 0x512c, 0x512d, 0x512e, 0x512f, 0x5130, 0x5131, 0x5132, 0x5133, 0x5134, 0x5135, 0x5136, 0x5137, 0x5138, 0x5139, 0x513a, 0x513b, 0x513c, 0x513d, 0x513e, 0x5142, 0x5147, 0x514a, 0x514c, 0x514e, 0x514f, 0x5150, 0x5152, 0x5153, 0x5157, 0x5158, 0x5159, 0x515b, 0x515d, 0x515e, 0x515f, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166, 0x5167, 0x5169, 0x516a, 0x516f, 0x5172, 0x517a, 0x517e, 0x517f, 0x5183, 0x5184, 0x5186, 0x5187, 0x518a, 0x518b, 0x518e, 0x518f, 0x5190, 0x5191, 0x5193, 0x5194, 0x5198, 0x519a, 0x519d, 0x519e, 0x519f, 0x51a1, 0x51a3, 0x51a6, 0x51a7, 0x51a8, 0x51a9, 0x51aa, 0x51ad, 0x51ae, 0x51b4, 0x51b8, 0x51b9, 0x51ba, 0x51be, 0x51bf, 0x51c1, 0x51c2, 0x51c3, 0x51c5, 0x51c8, 0x51ca, 0x51cd, 0x51ce, 0x51d0, 0x51d2, 0x51d3, 0x51d4, 0x51d5, 0x51d6, 0x51d7, /* 0x84 */ 0x51d8, 0x51d9, 0x51da, 0x51dc, 0x51de, 0x51df, 0x51e2, 0x51e3, 0x51e5, 0x51e6, 0x51e7, 0x51e8, 0x51e9, 0x51ea, 0x51ec, 0x51ee, 0x51f1, 0x51f2, 0x51f4, 0x51f7, 0x51fe, 0x5204, 0x5205, 0x5209, 0x520b, 0x520c, 0x520f, 0x5210, 0x5213, 0x5214, 0x5215, 0x521c, 0x521e, 0x521f, 0x5221, 0x5222, 0x5223, 0x5225, 0x5226, 0x5227, 0x522a, 0x522c, 0x522f, 0x5231, 0x5232, 0x5234, 0x5235, 0x523c, 0x523e, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524b, 0x524e, 0x524f, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258, 0x5259, 0x525a, 0x525b, 0x525d, 0x525f, 0x5260, 0x5262, 0x5263, 0x5264, 0x5266, 0x5268, 0x526b, 0x526c, 0x526d, 0x526e, 0x5270, 0x5271, 0x5273, 0x5274, 0x5275, 0x5276, 0x5277, 0x5278, 0x5279, 0x527a, 0x527b, 0x527c, 0x527e, 0x5280, 0x5283, 0x5284, 0x5285, 0x5286, 0x5287, 0x5289, 0x528a, 0x528b, 0x528c, 0x528d, 0x528e, 0x528f, 0x5291, 0x5292, 0x5294, 0x5295, 0x5296, 0x5297, 0x5298, 0x5299, 0x529a, 0x529c, 0x52a4, 0x52a5, 0x52a6, 0x52a7, 0x52ae, 0x52af, 0x52b0, 0x52b4, 0x52b5, 0x52b6, 0x52b7, 0x52b8, 0x52b9, 0x52ba, 0x52bb, 0x52bc, 0x52bd, 0x52c0, 0x52c1, 0x52c2, 0x52c4, 0x52c5, 0x52c6, 0x52c8, 0x52ca, 0x52cc, 0x52cd, 0x52ce, 0x52cf, 0x52d1, 0x52d3, 0x52d4, 0x52d5, 0x52d7, 0x52d9, 0x52da, 0x52db, 0x52dc, 0x52dd, 0x52de, 0x52e0, 0x52e1, 0x52e2, 0x52e3, 0x52e5, 0x52e6, 0x52e7, 0x52e8, 0x52e9, 0x52ea, 0x52eb, 0x52ec, 0x52ed, 0x52ee, 0x52ef, 0x52f1, 0x52f2, 0x52f3, 0x52f4, 0x52f5, 0x52f6, 0x52f7, 0x52f8, 0x52fb, 0x52fc, 0x52fd, 0x5301, 0x5302, 0x5303, 0x5304, 0x5307, 0x5309, 0x530a, 0x530b, 0x530c, 0x530e, /* 0x85 */ 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531b, 0x531c, 0x531e, 0x531f, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532b, 0x532c, 0x532d, 0x532f, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, 0x5335, 0x5336, 0x5337, 0x5338, 0x533c, 0x533d, 0x5340, 0x5342, 0x5344, 0x5346, 0x534b, 0x534c, 0x534d, 0x5350, 0x5354, 0x5358, 0x5359, 0x535b, 0x535d, 0x5365, 0x5368, 0x536a, 0x536c, 0x536d, 0x5372, 0x5376, 0x5379, 0x537b, 0x537c, 0x537d, 0x537e, 0x5380, 0x5381, 0x5383, 0x5387, 0x5388, 0x538a, 0x538e, 0x538f, 0x5390, 0x5391, 0x5392, 0x5393, 0x5394, 0x5396, 0x5397, 0x5399, 0x539b, 0x539c, 0x539e, 0x53a0, 0x53a1, 0x53a4, 0x53a7, 0x53aa, 0x53ab, 0x53ac, 0x53ad, 0x53af, 0x53b0, 0x53b1, 0x53b2, 0x53b3, 0x53b4, 0x53b5, 0x53b7, 0x53b8, 0x53b9, 0x53ba, 0x53bc, 0x53bd, 0x53be, 0x53c0, 0x53c3, 0x53c4, 0x53c5, 0x53c6, 0x53c7, 0x53ce, 0x53cf, 0x53d0, 0x53d2, 0x53d3, 0x53d5, 0x53da, 0x53dc, 0x53dd, 0x53de, 0x53e1, 0x53e2, 0x53e7, 0x53f4, 0x53fa, 0x53fe, 0x53ff, 0x5400, 0x5402, 0x5405, 0x5407, 0x540b, 0x5414, 0x5418, 0x5419, 0x541a, 0x541c, 0x5422, 0x5424, 0x5425, 0x542a, 0x5430, 0x5433, 0x5436, 0x5437, 0x543a, 0x543d, 0x543f, 0x5441, 0x5442, 0x5444, 0x5445, 0x5447, 0x5449, 0x544c, 0x544d, 0x544e, 0x544f, 0x5451, 0x545a, 0x545d, 0x545e, 0x545f, 0x5460, 0x5461, 0x5463, 0x5465, 0x5467, 0x5469, 0x546a, 0x546b, 0x546c, 0x546d, 0x546e, 0x546f, 0x5470, 0x5474, 0x5479, 0x547a, 0x547e, 0x547f, 0x5481, 0x5483, 0x5485, 0x5487, 0x5488, 0x5489, 0x548a, 0x548d, 0x5491, 0x5493, 0x5497, 0x5498, 0x549c, 0x549e, 0x549f, 0x54a0, 0x54a1, /* 0x86 */ 0x54a2, 0x54a5, 0x54ae, 0x54b0, 0x54b2, 0x54b5, 0x54b6, 0x54b7, 0x54b9, 0x54ba, 0x54bc, 0x54be, 0x54c3, 0x54c5, 0x54ca, 0x54cb, 0x54d6, 0x54d8, 0x54db, 0x54e0, 0x54e1, 0x54e2, 0x54e3, 0x54e4, 0x54eb, 0x54ec, 0x54ef, 0x54f0, 0x54f1, 0x54f4, 0x54f5, 0x54f6, 0x54f7, 0x54f8, 0x54f9, 0x54fb, 0x54fe, 0x5500, 0x5502, 0x5503, 0x5504, 0x5505, 0x5508, 0x550a, 0x550b, 0x550c, 0x550d, 0x550e, 0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551a, 0x551c, 0x551d, 0x551e, 0x551f, 0x5521, 0x5525, 0x5526, 0x5528, 0x5529, 0x552b, 0x552d, 0x5532, 0x5534, 0x5535, 0x5536, 0x5538, 0x5539, 0x553a, 0x553b, 0x553d, 0x5540, 0x5542, 0x5545, 0x5547, 0x5548, 0x554b, 0x554c, 0x554d, 0x554e, 0x554f, 0x5551, 0x5552, 0x5553, 0x5554, 0x5557, 0x5558, 0x5559, 0x555a, 0x555b, 0x555d, 0x555e, 0x555f, 0x5560, 0x5562, 0x5563, 0x5568, 0x5569, 0x556b, 0x556f, 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5579, 0x557a, 0x557d, 0x557f, 0x5585, 0x5586, 0x558c, 0x558d, 0x558e, 0x5590, 0x5592, 0x5593, 0x5595, 0x5596, 0x5597, 0x559a, 0x559b, 0x559e, 0x55a0, 0x55a1, 0x55a2, 0x55a3, 0x55a4, 0x55a5, 0x55a6, 0x55a8, 0x55a9, 0x55aa, 0x55ab, 0x55ac, 0x55ad, 0x55ae, 0x55af, 0x55b0, 0x55b2, 0x55b4, 0x55b6, 0x55b8, 0x55ba, 0x55bc, 0x55bf, 0x55c0, 0x55c1, 0x55c2, 0x55c3, 0x55c6, 0x55c7, 0x55c8, 0x55ca, 0x55cb, 0x55ce, 0x55cf, 0x55d0, 0x55d5, 0x55d7, 0x55d8, 0x55d9, 0x55da, 0x55db, 0x55de, 0x55e0, 0x55e2, 0x55e7, 0x55e9, 0x55ed, 0x55ee, 0x55f0, 0x55f1, 0x55f4, 0x55f6, 0x55f8, 0x55f9, 0x55fa, 0x55fb, 0x55fc, 0x55ff, 0x5602, 0x5603, 0x5604, 0x5605, /* 0x87 */ 0x5606, 0x5607, 0x560a, 0x560b, 0x560d, 0x5610, 0x5611, 0x5612, 0x5613, 0x5614, 0x5615, 0x5616, 0x5617, 0x5619, 0x561a, 0x561c, 0x561d, 0x5620, 0x5621, 0x5622, 0x5625, 0x5626, 0x5628, 0x5629, 0x562a, 0x562b, 0x562e, 0x562f, 0x5630, 0x5633, 0x5635, 0x5637, 0x5638, 0x563a, 0x563c, 0x563d, 0x563e, 0x5640, 0x5641, 0x5642, 0x5643, 0x5644, 0x5645, 0x5646, 0x5647, 0x5648, 0x5649, 0x564a, 0x564b, 0x564f, 0x5650, 0x5651, 0x5652, 0x5653, 0x5655, 0x5656, 0x565a, 0x565b, 0x565d, 0x565e, 0x565f, 0x5660, 0x5661, 0x5663, 0x5665, 0x5666, 0x5667, 0x566d, 0x566e, 0x566f, 0x5670, 0x5672, 0x5673, 0x5674, 0x5675, 0x5677, 0x5678, 0x5679, 0x567a, 0x567d, 0x567e, 0x567f, 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, 0x5687, 0x5688, 0x5689, 0x568a, 0x568b, 0x568c, 0x568d, 0x5690, 0x5691, 0x5692, 0x5694, 0x5695, 0x5696, 0x5697, 0x5698, 0x5699, 0x569a, 0x569b, 0x569c, 0x569d, 0x569e, 0x569f, 0x56a0, 0x56a1, 0x56a2, 0x56a4, 0x56a5, 0x56a6, 0x56a7, 0x56a8, 0x56a9, 0x56aa, 0x56ab, 0x56ac, 0x56ad, 0x56ae, 0x56b0, 0x56b1, 0x56b2, 0x56b3, 0x56b4, 0x56b5, 0x56b6, 0x56b8, 0x56b9, 0x56ba, 0x56bb, 0x56bd, 0x56be, 0x56bf, 0x56c0, 0x56c1, 0x56c2, 0x56c3, 0x56c4, 0x56c5, 0x56c6, 0x56c7, 0x56c8, 0x56c9, 0x56cb, 0x56cc, 0x56cd, 0x56ce, 0x56cf, 0x56d0, 0x56d1, 0x56d2, 0x56d3, 0x56d5, 0x56d6, 0x56d8, 0x56d9, 0x56dc, 0x56e3, 0x56e5, 0x56e6, 0x56e7, 0x56e8, 0x56e9, 0x56ea, 0x56ec, 0x56ee, 0x56ef, 0x56f2, 0x56f3, 0x56f6, 0x56f7, 0x56f8, 0x56fb, 0x56fc, 0x5700, 0x5701, 0x5702, 0x5705, 0x5707, 0x570b, 0x570c, 0x570d, 0x570e, 0x570f, 0x5710, 0x5711, /* 0x88 */ 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, 0x5718, 0x5719, 0x571a, 0x571b, 0x571d, 0x571e, 0x5720, 0x5721, 0x5722, 0x5724, 0x5725, 0x5726, 0x5727, 0x572b, 0x5731, 0x5732, 0x5734, 0x5735, 0x5736, 0x5737, 0x5738, 0x573c, 0x573d, 0x573f, 0x5741, 0x5743, 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574b, 0x5752, 0x5753, 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765, 0x5767, 0x576c, 0x576e, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775, 0x5778, 0x5779, 0x577a, 0x577d, 0x577e, 0x577f, 0x5780, 0x5781, 0x5787, 0x5788, 0x5789, 0x578a, 0x578d, 0x578e, 0x578f, 0x5790, 0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, 0x579a, 0x579c, 0x579d, 0x579e, 0x579f, 0x57a5, 0x57a8, 0x57aa, 0x57ac, 0x57af, 0x57b0, 0x57b1, 0x57b3, 0x57b5, 0x57b6, 0x57b7, 0x57b9, 0x57ba, 0x57bb, 0x57bc, 0x57bd, 0x57be, 0x57bf, 0x57c0, 0x57c1, 0x57c4, 0x57c5, 0x57c6, 0x57c7, 0x57c8, 0x57c9, 0x57ca, 0x57cc, 0x57cd, 0x57d0, 0x57d1, 0x57d3, 0x57d6, 0x57d7, 0x57db, 0x57dc, 0x57de, 0x57e1, 0x57e2, 0x57e3, 0x57e5, 0x57e6, 0x57e7, 0x57e8, 0x57e9, 0x57ea, 0x57eb, 0x57ec, 0x57ee, 0x57f0, 0x57f1, 0x57f2, 0x57f3, 0x57f5, 0x57f6, 0x57f7, 0x57fb, 0x57fc, 0x57fe, 0x57ff, 0x5801, 0x5803, 0x5804, 0x5805, 0x5808, 0x5809, 0x580a, 0x580c, 0x580e, 0x580f, 0x5810, 0x5812, 0x5813, 0x5814, 0x5816, 0x5817, 0x5818, 0x581a, 0x581b, 0x581c, 0x581d, 0x581f, 0x5822, 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582b, 0x582c, 0x582d, 0x582e, 0x582f, 0x5831, 0x5832, 0x5833, 0x5834, 0x5836, 0x5837, 0x5838, 0x5839, 0x583a, 0x583b, 0x583c, 0x583d, /* 0x89 */ 0x583e, 0x583f, 0x5840, 0x5841, 0x5842, 0x5843, 0x5845, 0x5846, 0x5847, 0x5848, 0x5849, 0x584a, 0x584b, 0x584e, 0x584f, 0x5850, 0x5852, 0x5853, 0x5855, 0x5856, 0x5857, 0x5859, 0x585a, 0x585b, 0x585c, 0x585d, 0x585f, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, 0x5866, 0x5867, 0x5868, 0x5869, 0x586a, 0x586d, 0x586e, 0x586f, 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, 0x5878, 0x5879, 0x587a, 0x587b, 0x587c, 0x587d, 0x587f, 0x5882, 0x5884, 0x5886, 0x5887, 0x5888, 0x588a, 0x588b, 0x588c, 0x588d, 0x588e, 0x588f, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896, 0x5897, 0x5898, 0x589b, 0x589c, 0x589d, 0x58a0, 0x58a1, 0x58a2, 0x58a3, 0x58a4, 0x58a5, 0x58a6, 0x58a7, 0x58aa, 0x58ab, 0x58ac, 0x58ad, 0x58ae, 0x58af, 0x58b0, 0x58b1, 0x58b2, 0x58b3, 0x58b4, 0x58b5, 0x58b6, 0x58b7, 0x58b8, 0x58b9, 0x58ba, 0x58bb, 0x58bd, 0x58be, 0x58bf, 0x58c0, 0x58c2, 0x58c3, 0x58c4, 0x58c6, 0x58c7, 0x58c8, 0x58c9, 0x58ca, 0x58cb, 0x58cc, 0x58cd, 0x58ce, 0x58cf, 0x58d0, 0x58d2, 0x58d3, 0x58d4, 0x58d6, 0x58d7, 0x58d8, 0x58d9, 0x58da, 0x58db, 0x58dc, 0x58dd, 0x58de, 0x58df, 0x58e0, 0x58e1, 0x58e2, 0x58e3, 0x58e5, 0x58e6, 0x58e7, 0x58e8, 0x58e9, 0x58ea, 0x58ed, 0x58ef, 0x58f1, 0x58f2, 0x58f4, 0x58f5, 0x58f7, 0x58f8, 0x58fa, 0x58fb, 0x58fc, 0x58fd, 0x58fe, 0x58ff, 0x5900, 0x5901, 0x5903, 0x5905, 0x5906, 0x5908, 0x5909, 0x590a, 0x590b, 0x590c, 0x590e, 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591b, 0x591d, 0x591e, 0x5920, 0x5921, 0x5922, 0x5923, 0x5926, 0x5928, 0x592c, 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593b, /* 0x8a */ 0x593d, 0x593e, 0x593f, 0x5940, 0x5943, 0x5945, 0x5946, 0x594a, 0x594c, 0x594d, 0x5950, 0x5952, 0x5953, 0x5959, 0x595b, 0x595c, 0x595d, 0x595e, 0x595f, 0x5961, 0x5963, 0x5964, 0x5966, 0x5967, 0x5968, 0x5969, 0x596a, 0x596b, 0x596c, 0x596d, 0x596e, 0x596f, 0x5970, 0x5971, 0x5972, 0x5975, 0x5977, 0x597a, 0x597b, 0x597c, 0x597e, 0x597f, 0x5980, 0x5985, 0x5989, 0x598b, 0x598c, 0x598e, 0x598f, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599a, 0x599b, 0x599c, 0x599d, 0x599f, 0x59a0, 0x59a1, 0x59a2, 0x59a6, 0x59a7, 0x59ac, 0x59ad, 0x59b0, 0x59b1, 0x59b3, 0x59b4, 0x59b5, 0x59b6, 0x59b7, 0x59b8, 0x59ba, 0x59bc, 0x59bd, 0x59bf, 0x59c0, 0x59c1, 0x59c2, 0x59c3, 0x59c4, 0x59c5, 0x59c7, 0x59c8, 0x59c9, 0x59cc, 0x59cd, 0x59ce, 0x59cf, 0x59d5, 0x59d6, 0x59d9, 0x59db, 0x59de, 0x59df, 0x59e0, 0x59e1, 0x59e2, 0x59e4, 0x59e6, 0x59e7, 0x59e9, 0x59ea, 0x59eb, 0x59ed, 0x59ee, 0x59ef, 0x59f0, 0x59f1, 0x59f2, 0x59f3, 0x59f4, 0x59f5, 0x59f6, 0x59f7, 0x59f8, 0x59fa, 0x59fc, 0x59fd, 0x59fe, 0x5a00, 0x5a02, 0x5a0a, 0x5a0b, 0x5a0d, 0x5a0e, 0x5a0f, 0x5a10, 0x5a12, 0x5a14, 0x5a15, 0x5a16, 0x5a17, 0x5a19, 0x5a1a, 0x5a1b, 0x5a1d, 0x5a1e, 0x5a21, 0x5a22, 0x5a24, 0x5a26, 0x5a27, 0x5a28, 0x5a2a, 0x5a2b, 0x5a2c, 0x5a2d, 0x5a2e, 0x5a2f, 0x5a30, 0x5a33, 0x5a35, 0x5a37, 0x5a38, 0x5a39, 0x5a3a, 0x5a3b, 0x5a3d, 0x5a3e, 0x5a3f, 0x5a41, 0x5a42, 0x5a43, 0x5a44, 0x5a45, 0x5a47, 0x5a48, 0x5a4b, 0x5a4c, 0x5a4d, 0x5a4e, 0x5a4f, 0x5a50, 0x5a51, 0x5a52, 0x5a53, 0x5a54, 0x5a56, 0x5a57, 0x5a58, 0x5a59, 0x5a5b, 0x5a5c, 0x5a5d, 0x5a5e, 0x5a5f, 0x5a60, /* 0x8b */ 0x5a61, 0x5a63, 0x5a64, 0x5a65, 0x5a66, 0x5a68, 0x5a69, 0x5a6b, 0x5a6c, 0x5a6d, 0x5a6e, 0x5a6f, 0x5a70, 0x5a71, 0x5a72, 0x5a73, 0x5a78, 0x5a79, 0x5a7b, 0x5a7c, 0x5a7d, 0x5a7e, 0x5a80, 0x5a81, 0x5a82, 0x5a83, 0x5a84, 0x5a85, 0x5a86, 0x5a87, 0x5a88, 0x5a89, 0x5a8a, 0x5a8b, 0x5a8c, 0x5a8d, 0x5a8e, 0x5a8f, 0x5a90, 0x5a91, 0x5a93, 0x5a94, 0x5a95, 0x5a96, 0x5a97, 0x5a98, 0x5a99, 0x5a9c, 0x5a9d, 0x5a9e, 0x5a9f, 0x5aa0, 0x5aa1, 0x5aa2, 0x5aa3, 0x5aa4, 0x5aa5, 0x5aa6, 0x5aa7, 0x5aa8, 0x5aa9, 0x5aab, 0x5aac, 0x5aad, 0x5aae, 0x5aaf, 0x5ab0, 0x5ab1, 0x5ab4, 0x5ab6, 0x5ab7, 0x5ab9, 0x5aba, 0x5abb, 0x5abc, 0x5abd, 0x5abf, 0x5ac0, 0x5ac3, 0x5ac4, 0x5ac5, 0x5ac6, 0x5ac7, 0x5ac8, 0x5aca, 0x5acb, 0x5acd, 0x5ace, 0x5acf, 0x5ad0, 0x5ad1, 0x5ad3, 0x5ad5, 0x5ad7, 0x5ad9, 0x5ada, 0x5adb, 0x5add, 0x5ade, 0x5adf, 0x5ae2, 0x5ae4, 0x5ae5, 0x5ae7, 0x5ae8, 0x5aea, 0x5aec, 0x5aed, 0x5aee, 0x5aef, 0x5af0, 0x5af2, 0x5af3, 0x5af4, 0x5af5, 0x5af6, 0x5af7, 0x5af8, 0x5af9, 0x5afa, 0x5afb, 0x5afc, 0x5afd, 0x5afe, 0x5aff, 0x5b00, 0x5b01, 0x5b02, 0x5b03, 0x5b04, 0x5b05, 0x5b06, 0x5b07, 0x5b08, 0x5b0a, 0x5b0b, 0x5b0c, 0x5b0d, 0x5b0e, 0x5b0f, 0x5b10, 0x5b11, 0x5b12, 0x5b13, 0x5b14, 0x5b15, 0x5b18, 0x5b19, 0x5b1a, 0x5b1b, 0x5b1c, 0x5b1d, 0x5b1e, 0x5b1f, 0x5b20, 0x5b21, 0x5b22, 0x5b23, 0x5b24, 0x5b25, 0x5b26, 0x5b27, 0x5b28, 0x5b29, 0x5b2a, 0x5b2b, 0x5b2c, 0x5b2d, 0x5b2e, 0x5b2f, 0x5b30, 0x5b31, 0x5b33, 0x5b35, 0x5b36, 0x5b38, 0x5b39, 0x5b3a, 0x5b3b, 0x5b3c, 0x5b3d, 0x5b3e, 0x5b3f, 0x5b41, 0x5b42, 0x5b43, 0x5b44, 0x5b45, 0x5b46, 0x5b47, /* 0x8c */ 0x5b48, 0x5b49, 0x5b4a, 0x5b4b, 0x5b4c, 0x5b4d, 0x5b4e, 0x5b4f, 0x5b52, 0x5b56, 0x5b5e, 0x5b60, 0x5b61, 0x5b67, 0x5b68, 0x5b6b, 0x5b6d, 0x5b6e, 0x5b6f, 0x5b72, 0x5b74, 0x5b76, 0x5b77, 0x5b78, 0x5b79, 0x5b7b, 0x5b7c, 0x5b7e, 0x5b7f, 0x5b82, 0x5b86, 0x5b8a, 0x5b8d, 0x5b8e, 0x5b90, 0x5b91, 0x5b92, 0x5b94, 0x5b96, 0x5b9f, 0x5ba7, 0x5ba8, 0x5ba9, 0x5bac, 0x5bad, 0x5bae, 0x5baf, 0x5bb1, 0x5bb2, 0x5bb7, 0x5bba, 0x5bbb, 0x5bbc, 0x5bc0, 0x5bc1, 0x5bc3, 0x5bc8, 0x5bc9, 0x5bca, 0x5bcb, 0x5bcd, 0x5bce, 0x5bcf, 0x5bd1, 0x5bd4, 0x5bd5, 0x5bd6, 0x5bd7, 0x5bd8, 0x5bd9, 0x5bda, 0x5bdb, 0x5bdc, 0x5be0, 0x5be2, 0x5be3, 0x5be6, 0x5be7, 0x5be9, 0x5bea, 0x5beb, 0x5bec, 0x5bed, 0x5bef, 0x5bf1, 0x5bf2, 0x5bf3, 0x5bf4, 0x5bf5, 0x5bf6, 0x5bf7, 0x5bfd, 0x5bfe, 0x5c00, 0x5c02, 0x5c03, 0x5c05, 0x5c07, 0x5c08, 0x5c0b, 0x5c0c, 0x5c0d, 0x5c0e, 0x5c10, 0x5c12, 0x5c13, 0x5c17, 0x5c19, 0x5c1b, 0x5c1e, 0x5c1f, 0x5c20, 0x5c21, 0x5c23, 0x5c26, 0x5c28, 0x5c29, 0x5c2a, 0x5c2b, 0x5c2d, 0x5c2e, 0x5c2f, 0x5c30, 0x5c32, 0x5c33, 0x5c35, 0x5c36, 0x5c37, 0x5c43, 0x5c44, 0x5c46, 0x5c47, 0x5c4c, 0x5c4d, 0x5c52, 0x5c53, 0x5c54, 0x5c56, 0x5c57, 0x5c58, 0x5c5a, 0x5c5b, 0x5c5c, 0x5c5d, 0x5c5f, 0x5c62, 0x5c64, 0x5c67, 0x5c68, 0x5c69, 0x5c6a, 0x5c6b, 0x5c6c, 0x5c6d, 0x5c70, 0x5c72, 0x5c73, 0x5c74, 0x5c75, 0x5c76, 0x5c77, 0x5c78, 0x5c7b, 0x5c7c, 0x5c7d, 0x5c7e, 0x5c80, 0x5c83, 0x5c84, 0x5c85, 0x5c86, 0x5c87, 0x5c89, 0x5c8a, 0x5c8b, 0x5c8e, 0x5c8f, 0x5c92, 0x5c93, 0x5c95, 0x5c9d, 0x5c9e, 0x5c9f, 0x5ca0, 0x5ca1, 0x5ca4, 0x5ca5, 0x5ca6, 0x5ca7, 0x5ca8, /* 0x8d */ 0x5caa, 0x5cae, 0x5caf, 0x5cb0, 0x5cb2, 0x5cb4, 0x5cb6, 0x5cb9, 0x5cba, 0x5cbb, 0x5cbc, 0x5cbe, 0x5cc0, 0x5cc2, 0x5cc3, 0x5cc5, 0x5cc6, 0x5cc7, 0x5cc8, 0x5cc9, 0x5cca, 0x5ccc, 0x5ccd, 0x5cce, 0x5ccf, 0x5cd0, 0x5cd1, 0x5cd3, 0x5cd4, 0x5cd5, 0x5cd6, 0x5cd7, 0x5cd8, 0x5cda, 0x5cdb, 0x5cdc, 0x5cdd, 0x5cde, 0x5cdf, 0x5ce0, 0x5ce2, 0x5ce3, 0x5ce7, 0x5ce9, 0x5ceb, 0x5cec, 0x5cee, 0x5cef, 0x5cf1, 0x5cf2, 0x5cf3, 0x5cf4, 0x5cf5, 0x5cf6, 0x5cf7, 0x5cf8, 0x5cf9, 0x5cfa, 0x5cfc, 0x5cfd, 0x5cfe, 0x5cff, 0x5d00, 0x5d01, 0x5d04, 0x5d05, 0x5d08, 0x5d09, 0x5d0a, 0x5d0b, 0x5d0c, 0x5d0d, 0x5d0f, 0x5d10, 0x5d11, 0x5d12, 0x5d13, 0x5d15, 0x5d17, 0x5d18, 0x5d19, 0x5d1a, 0x5d1c, 0x5d1d, 0x5d1f, 0x5d20, 0x5d21, 0x5d22, 0x5d23, 0x5d25, 0x5d28, 0x5d2a, 0x5d2b, 0x5d2c, 0x5d2f, 0x5d30, 0x5d31, 0x5d32, 0x5d33, 0x5d35, 0x5d36, 0x5d37, 0x5d38, 0x5d39, 0x5d3a, 0x5d3b, 0x5d3c, 0x5d3f, 0x5d40, 0x5d41, 0x5d42, 0x5d43, 0x5d44, 0x5d45, 0x5d46, 0x5d48, 0x5d49, 0x5d4d, 0x5d4e, 0x5d4f, 0x5d50, 0x5d51, 0x5d52, 0x5d53, 0x5d54, 0x5d55, 0x5d56, 0x5d57, 0x5d59, 0x5d5a, 0x5d5c, 0x5d5e, 0x5d5f, 0x5d60, 0x5d61, 0x5d62, 0x5d63, 0x5d64, 0x5d65, 0x5d66, 0x5d67, 0x5d68, 0x5d6a, 0x5d6d, 0x5d6e, 0x5d70, 0x5d71, 0x5d72, 0x5d73, 0x5d75, 0x5d76, 0x5d77, 0x5d78, 0x5d79, 0x5d7a, 0x5d7b, 0x5d7c, 0x5d7d, 0x5d7e, 0x5d7f, 0x5d80, 0x5d81, 0x5d83, 0x5d84, 0x5d85, 0x5d86, 0x5d87, 0x5d88, 0x5d89, 0x5d8a, 0x5d8b, 0x5d8c, 0x5d8d, 0x5d8e, 0x5d8f, 0x5d90, 0x5d91, 0x5d92, 0x5d93, 0x5d94, 0x5d95, 0x5d96, 0x5d97, 0x5d98, 0x5d9a, 0x5d9b, 0x5d9c, 0x5d9e, 0x5d9f, 0x5da0, /* 0x8e */ 0x5da1, 0x5da2, 0x5da3, 0x5da4, 0x5da5, 0x5da6, 0x5da7, 0x5da8, 0x5da9, 0x5daa, 0x5dab, 0x5dac, 0x5dad, 0x5dae, 0x5daf, 0x5db0, 0x5db1, 0x5db2, 0x5db3, 0x5db4, 0x5db5, 0x5db6, 0x5db8, 0x5db9, 0x5dba, 0x5dbb, 0x5dbc, 0x5dbd, 0x5dbe, 0x5dbf, 0x5dc0, 0x5dc1, 0x5dc2, 0x5dc3, 0x5dc4, 0x5dc6, 0x5dc7, 0x5dc8, 0x5dc9, 0x5dca, 0x5dcb, 0x5dcc, 0x5dce, 0x5dcf, 0x5dd0, 0x5dd1, 0x5dd2, 0x5dd3, 0x5dd4, 0x5dd5, 0x5dd6, 0x5dd7, 0x5dd8, 0x5dd9, 0x5dda, 0x5ddc, 0x5ddf, 0x5de0, 0x5de3, 0x5de4, 0x5dea, 0x5dec, 0x5ded, 0x5df0, 0x5df5, 0x5df6, 0x5df8, 0x5df9, 0x5dfa, 0x5dfb, 0x5dfc, 0x5dff, 0x5e00, 0x5e04, 0x5e07, 0x5e09, 0x5e0a, 0x5e0b, 0x5e0d, 0x5e0e, 0x5e12, 0x5e13, 0x5e17, 0x5e1e, 0x5e1f, 0x5e20, 0x5e21, 0x5e22, 0x5e23, 0x5e24, 0x5e25, 0x5e28, 0x5e29, 0x5e2a, 0x5e2b, 0x5e2c, 0x5e2f, 0x5e30, 0x5e32, 0x5e33, 0x5e34, 0x5e35, 0x5e36, 0x5e39, 0x5e3a, 0x5e3e, 0x5e3f, 0x5e40, 0x5e41, 0x5e43, 0x5e46, 0x5e47, 0x5e48, 0x5e49, 0x5e4a, 0x5e4b, 0x5e4d, 0x5e4e, 0x5e4f, 0x5e50, 0x5e51, 0x5e52, 0x5e53, 0x5e56, 0x5e57, 0x5e58, 0x5e59, 0x5e5a, 0x5e5c, 0x5e5d, 0x5e5f, 0x5e60, 0x5e63, 0x5e64, 0x5e65, 0x5e66, 0x5e67, 0x5e68, 0x5e69, 0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d, 0x5e6e, 0x5e6f, 0x5e70, 0x5e71, 0x5e75, 0x5e77, 0x5e79, 0x5e7e, 0x5e81, 0x5e82, 0x5e83, 0x5e85, 0x5e88, 0x5e89, 0x5e8c, 0x5e8d, 0x5e8e, 0x5e92, 0x5e98, 0x5e9b, 0x5e9d, 0x5ea1, 0x5ea2, 0x5ea3, 0x5ea4, 0x5ea8, 0x5ea9, 0x5eaa, 0x5eab, 0x5eac, 0x5eae, 0x5eaf, 0x5eb0, 0x5eb1, 0x5eb2, 0x5eb4, 0x5eba, 0x5ebb, 0x5ebc, 0x5ebd, 0x5ebf, 0x5ec0, 0x5ec1, 0x5ec2, 0x5ec3, 0x5ec4, 0x5ec5, /* 0x8f */ 0x5ec6, 0x5ec7, 0x5ec8, 0x5ecb, 0x5ecc, 0x5ecd, 0x5ece, 0x5ecf, 0x5ed0, 0x5ed4, 0x5ed5, 0x5ed7, 0x5ed8, 0x5ed9, 0x5eda, 0x5edc, 0x5edd, 0x5ede, 0x5edf, 0x5ee0, 0x5ee1, 0x5ee2, 0x5ee3, 0x5ee4, 0x5ee5, 0x5ee6, 0x5ee7, 0x5ee9, 0x5eeb, 0x5eec, 0x5eed, 0x5eee, 0x5eef, 0x5ef0, 0x5ef1, 0x5ef2, 0x5ef3, 0x5ef5, 0x5ef8, 0x5ef9, 0x5efb, 0x5efc, 0x5efd, 0x5f05, 0x5f06, 0x5f07, 0x5f09, 0x5f0c, 0x5f0d, 0x5f0e, 0x5f10, 0x5f12, 0x5f14, 0x5f16, 0x5f19, 0x5f1a, 0x5f1c, 0x5f1d, 0x5f1e, 0x5f21, 0x5f22, 0x5f23, 0x5f24, 0x5f28, 0x5f2b, 0x5f2c, 0x5f2e, 0x5f30, 0x5f32, 0x5f33, 0x5f34, 0x5f35, 0x5f36, 0x5f37, 0x5f38, 0x5f3b, 0x5f3d, 0x5f3e, 0x5f3f, 0x5f41, 0x5f42, 0x5f43, 0x5f44, 0x5f45, 0x5f46, 0x5f47, 0x5f48, 0x5f49, 0x5f4a, 0x5f4b, 0x5f4c, 0x5f4d, 0x5f4e, 0x5f4f, 0x5f51, 0x5f54, 0x5f59, 0x5f5a, 0x5f5b, 0x5f5c, 0x5f5e, 0x5f5f, 0x5f60, 0x5f63, 0x5f65, 0x5f67, 0x5f68, 0x5f6b, 0x5f6e, 0x5f6f, 0x5f72, 0x5f74, 0x5f75, 0x5f76, 0x5f78, 0x5f7a, 0x5f7d, 0x5f7e, 0x5f7f, 0x5f83, 0x5f86, 0x5f8d, 0x5f8e, 0x5f8f, 0x5f91, 0x5f93, 0x5f94, 0x5f96, 0x5f9a, 0x5f9b, 0x5f9d, 0x5f9e, 0x5f9f, 0x5fa0, 0x5fa2, 0x5fa3, 0x5fa4, 0x5fa5, 0x5fa6, 0x5fa7, 0x5fa9, 0x5fab, 0x5fac, 0x5faf, 0x5fb0, 0x5fb1, 0x5fb2, 0x5fb3, 0x5fb4, 0x5fb6, 0x5fb8, 0x5fb9, 0x5fba, 0x5fbb, 0x5fbe, 0x5fbf, 0x5fc0, 0x5fc1, 0x5fc2, 0x5fc7, 0x5fc8, 0x5fca, 0x5fcb, 0x5fce, 0x5fd3, 0x5fd4, 0x5fd5, 0x5fda, 0x5fdb, 0x5fdc, 0x5fde, 0x5fdf, 0x5fe2, 0x5fe3, 0x5fe5, 0x5fe6, 0x5fe8, 0x5fe9, 0x5fec, 0x5fef, 0x5ff0, 0x5ff2, 0x5ff3, 0x5ff4, 0x5ff6, 0x5ff7, 0x5ff9, 0x5ffa, 0x5ffc, 0x6007, /* 0x90 */ 0x6008, 0x6009, 0x600b, 0x600c, 0x6010, 0x6011, 0x6013, 0x6017, 0x6018, 0x601a, 0x601e, 0x601f, 0x6022, 0x6023, 0x6024, 0x602c, 0x602d, 0x602e, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036, 0x6037, 0x6038, 0x6039, 0x603a, 0x603d, 0x603e, 0x6040, 0x6044, 0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604a, 0x604c, 0x604e, 0x604f, 0x6051, 0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605b, 0x605c, 0x605e, 0x605f, 0x6060, 0x6061, 0x6065, 0x6066, 0x606e, 0x6071, 0x6072, 0x6074, 0x6075, 0x6077, 0x607e, 0x6080, 0x6081, 0x6082, 0x6085, 0x6086, 0x6087, 0x6088, 0x608a, 0x608b, 0x608e, 0x608f, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, 0x6098, 0x6099, 0x609c, 0x609e, 0x60a1, 0x60a2, 0x60a4, 0x60a5, 0x60a7, 0x60a9, 0x60aa, 0x60ae, 0x60b0, 0x60b3, 0x60b5, 0x60b6, 0x60b7, 0x60b9, 0x60ba, 0x60bd, 0x60be, 0x60bf, 0x60c0, 0x60c1, 0x60c2, 0x60c3, 0x60c4, 0x60c7, 0x60c8, 0x60c9, 0x60cc, 0x60cd, 0x60ce, 0x60cf, 0x60d0, 0x60d2, 0x60d3, 0x60d4, 0x60d6, 0x60d7, 0x60d9, 0x60db, 0x60de, 0x60e1, 0x60e2, 0x60e3, 0x60e4, 0x60e5, 0x60ea, 0x60f1, 0x60f2, 0x60f5, 0x60f7, 0x60f8, 0x60fb, 0x60fc, 0x60fd, 0x60fe, 0x60ff, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610a, 0x610b, 0x610c, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117, 0x6118, 0x6119, 0x611b, 0x611c, 0x611d, 0x611e, 0x6121, 0x6122, 0x6125, 0x6128, 0x6129, 0x612a, 0x612c, 0x612d, 0x612e, 0x612f, 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, 0x6137, 0x6138, 0x6139, 0x613a, 0x613b, 0x613c, 0x613d, 0x613e, 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146, /* 0x91 */ 0x6147, 0x6149, 0x614b, 0x614d, 0x614f, 0x6150, 0x6152, 0x6153, 0x6154, 0x6156, 0x6157, 0x6158, 0x6159, 0x615a, 0x615b, 0x615c, 0x615e, 0x615f, 0x6160, 0x6161, 0x6163, 0x6164, 0x6165, 0x6166, 0x6169, 0x616a, 0x616b, 0x616c, 0x616d, 0x616e, 0x616f, 0x6171, 0x6172, 0x6173, 0x6174, 0x6176, 0x6178, 0x6179, 0x617a, 0x617b, 0x617c, 0x617d, 0x617e, 0x617f, 0x6180, 0x6181, 0x6182, 0x6183, 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618a, 0x618c, 0x618d, 0x618f, 0x6190, 0x6191, 0x6192, 0x6193, 0x6195, 0x6196, 0x6197, 0x6198, 0x6199, 0x619a, 0x619b, 0x619c, 0x619e, 0x619f, 0x61a0, 0x61a1, 0x61a2, 0x61a3, 0x61a4, 0x61a5, 0x61a6, 0x61aa, 0x61ab, 0x61ad, 0x61ae, 0x61af, 0x61b0, 0x61b1, 0x61b2, 0x61b3, 0x61b4, 0x61b5, 0x61b6, 0x61b8, 0x61b9, 0x61ba, 0x61bb, 0x61bc, 0x61bd, 0x61bf, 0x61c0, 0x61c1, 0x61c3, 0x61c4, 0x61c5, 0x61c6, 0x61c7, 0x61c9, 0x61cc, 0x61cd, 0x61ce, 0x61cf, 0x61d0, 0x61d3, 0x61d5, 0x61d6, 0x61d7, 0x61d8, 0x61d9, 0x61da, 0x61db, 0x61dc, 0x61dd, 0x61de, 0x61df, 0x61e0, 0x61e1, 0x61e2, 0x61e3, 0x61e4, 0x61e5, 0x61e7, 0x61e8, 0x61e9, 0x61ea, 0x61eb, 0x61ec, 0x61ed, 0x61ee, 0x61ef, 0x61f0, 0x61f1, 0x61f2, 0x61f3, 0x61f4, 0x61f6, 0x61f7, 0x61f8, 0x61f9, 0x61fa, 0x61fb, 0x61fc, 0x61fd, 0x61fe, 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6207, 0x6209, 0x6213, 0x6214, 0x6219, 0x621c, 0x621d, 0x621e, 0x6220, 0x6223, 0x6226, 0x6227, 0x6228, 0x6229, 0x622b, 0x622d, 0x622f, 0x6230, 0x6231, 0x6232, 0x6235, 0x6236, 0x6238, 0x6239, 0x623a, 0x623b, 0x623c, 0x6242, 0x6244, 0x6245, 0x6246, 0x624a, /* 0x92 */ 0x624f, 0x6250, 0x6255, 0x6256, 0x6257, 0x6259, 0x625a, 0x625c, 0x625d, 0x625e, 0x625f, 0x6260, 0x6261, 0x6262, 0x6264, 0x6265, 0x6268, 0x6271, 0x6272, 0x6274, 0x6275, 0x6277, 0x6278, 0x627a, 0x627b, 0x627d, 0x6281, 0x6282, 0x6283, 0x6285, 0x6286, 0x6287, 0x6288, 0x628b, 0x628c, 0x628d, 0x628e, 0x628f, 0x6290, 0x6294, 0x6299, 0x629c, 0x629d, 0x629e, 0x62a3, 0x62a6, 0x62a7, 0x62a9, 0x62aa, 0x62ad, 0x62ae, 0x62af, 0x62b0, 0x62b2, 0x62b3, 0x62b4, 0x62b6, 0x62b7, 0x62b8, 0x62ba, 0x62be, 0x62c0, 0x62c1, 0x62c3, 0x62cb, 0x62cf, 0x62d1, 0x62d5, 0x62dd, 0x62de, 0x62e0, 0x62e1, 0x62e4, 0x62ea, 0x62eb, 0x62f0, 0x62f2, 0x62f5, 0x62f8, 0x62f9, 0x62fa, 0x62fb, 0x6300, 0x6303, 0x6304, 0x6305, 0x6306, 0x630a, 0x630b, 0x630c, 0x630d, 0x630f, 0x6310, 0x6312, 0x6313, 0x6314, 0x6315, 0x6317, 0x6318, 0x6319, 0x631c, 0x6326, 0x6327, 0x6329, 0x632c, 0x632d, 0x632e, 0x6330, 0x6331, 0x6333, 0x6334, 0x6335, 0x6336, 0x6337, 0x6338, 0x633b, 0x633c, 0x633e, 0x633f, 0x6340, 0x6341, 0x6344, 0x6347, 0x6348, 0x634a, 0x6351, 0x6352, 0x6353, 0x6354, 0x6356, 0x6357, 0x6358, 0x6359, 0x635a, 0x635b, 0x635c, 0x635d, 0x6360, 0x6364, 0x6365, 0x6366, 0x6368, 0x636a, 0x636b, 0x636c, 0x636f, 0x6370, 0x6372, 0x6373, 0x6374, 0x6375, 0x6378, 0x6379, 0x637c, 0x637d, 0x637e, 0x637f, 0x6381, 0x6383, 0x6384, 0x6385, 0x6386, 0x638b, 0x638d, 0x6391, 0x6393, 0x6394, 0x6395, 0x6397, 0x6399, 0x639a, 0x639b, 0x639c, 0x639d, 0x639e, 0x639f, 0x63a1, 0x63a4, 0x63a6, 0x63ab, 0x63af, 0x63b1, 0x63b2, 0x63b5, 0x63b6, 0x63b9, 0x63bb, 0x63bd, 0x63bf, 0x63c0, /* 0x93 */ 0x63c1, 0x63c2, 0x63c3, 0x63c5, 0x63c7, 0x63c8, 0x63ca, 0x63cb, 0x63cc, 0x63d1, 0x63d3, 0x63d4, 0x63d5, 0x63d7, 0x63d8, 0x63d9, 0x63da, 0x63db, 0x63dc, 0x63dd, 0x63df, 0x63e2, 0x63e4, 0x63e5, 0x63e6, 0x63e7, 0x63e8, 0x63eb, 0x63ec, 0x63ee, 0x63ef, 0x63f0, 0x63f1, 0x63f3, 0x63f5, 0x63f7, 0x63f9, 0x63fa, 0x63fb, 0x63fc, 0x63fe, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408, 0x6409, 0x640a, 0x640d, 0x640e, 0x6411, 0x6412, 0x6415, 0x6416, 0x6417, 0x6418, 0x6419, 0x641a, 0x641d, 0x641f, 0x6422, 0x6423, 0x6424, 0x6425, 0x6427, 0x6428, 0x6429, 0x642b, 0x642e, 0x642f, 0x6430, 0x6431, 0x6432, 0x6433, 0x6435, 0x6436, 0x6437, 0x6438, 0x6439, 0x643b, 0x643c, 0x643e, 0x6440, 0x6442, 0x6443, 0x6449, 0x644b, 0x644c, 0x644d, 0x644e, 0x644f, 0x6450, 0x6451, 0x6453, 0x6455, 0x6456, 0x6457, 0x6459, 0x645a, 0x645b, 0x645c, 0x645d, 0x645f, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6468, 0x646a, 0x646b, 0x646c, 0x646e, 0x646f, 0x6470, 0x6471, 0x6472, 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, 0x647b, 0x647c, 0x647d, 0x647e, 0x647f, 0x6480, 0x6481, 0x6483, 0x6486, 0x6488, 0x6489, 0x648a, 0x648b, 0x648c, 0x648d, 0x648e, 0x648f, 0x6490, 0x6493, 0x6494, 0x6497, 0x6498, 0x649a, 0x649b, 0x649c, 0x649d, 0x649f, 0x64a0, 0x64a1, 0x64a2, 0x64a3, 0x64a5, 0x64a6, 0x64a7, 0x64a8, 0x64aa, 0x64ab, 0x64af, 0x64b1, 0x64b2, 0x64b3, 0x64b4, 0x64b6, 0x64b9, 0x64bb, 0x64bd, 0x64be, 0x64bf, 0x64c1, 0x64c3, 0x64c4, 0x64c6, 0x64c7, 0x64c8, 0x64c9, 0x64ca, 0x64cb, 0x64cc, 0x64cf, 0x64d1, 0x64d3, 0x64d4, 0x64d5, 0x64d6, 0x64d9, 0x64da, /* 0x94 */ 0x64db, 0x64dc, 0x64dd, 0x64df, 0x64e0, 0x64e1, 0x64e3, 0x64e5, 0x64e7, 0x64e8, 0x64e9, 0x64ea, 0x64eb, 0x64ec, 0x64ed, 0x64ee, 0x64ef, 0x64f0, 0x64f1, 0x64f2, 0x64f3, 0x64f4, 0x64f5, 0x64f6, 0x64f7, 0x64f8, 0x64f9, 0x64fa, 0x64fb, 0x64fc, 0x64fd, 0x64fe, 0x64ff, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, 0x6506, 0x6507, 0x6508, 0x650a, 0x650b, 0x650c, 0x650d, 0x650e, 0x650f, 0x6510, 0x6511, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, 0x6519, 0x651a, 0x651b, 0x651c, 0x651d, 0x651e, 0x651f, 0x6520, 0x6521, 0x6522, 0x6523, 0x6524, 0x6526, 0x6527, 0x6528, 0x6529, 0x652a, 0x652c, 0x652d, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, 0x653a, 0x653c, 0x653d, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6546, 0x6547, 0x654a, 0x654b, 0x654d, 0x654e, 0x6550, 0x6552, 0x6553, 0x6554, 0x6557, 0x6558, 0x655a, 0x655c, 0x655f, 0x6560, 0x6561, 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656a, 0x656d, 0x656e, 0x656f, 0x6571, 0x6573, 0x6575, 0x6576, 0x6578, 0x6579, 0x657a, 0x657b, 0x657c, 0x657d, 0x657e, 0x657f, 0x6580, 0x6581, 0x6582, 0x6583, 0x6584, 0x6585, 0x6586, 0x6588, 0x6589, 0x658a, 0x658d, 0x658e, 0x658f, 0x6592, 0x6594, 0x6595, 0x6596, 0x6598, 0x659a, 0x659d, 0x659e, 0x65a0, 0x65a2, 0x65a3, 0x65a6, 0x65a8, 0x65aa, 0x65ac, 0x65ae, 0x65b1, 0x65b2, 0x65b3, 0x65b4, 0x65b5, 0x65b6, 0x65b7, 0x65b8, 0x65ba, 0x65bb, 0x65be, 0x65bf, 0x65c0, 0x65c2, 0x65c7, 0x65c8, 0x65c9, 0x65ca, 0x65cd, 0x65d0, 0x65d1, 0x65d3, 0x65d4, 0x65d5, 0x65d8, 0x65d9, 0x65da, 0x65db, 0x65dc, 0x65dd, 0x65de, 0x65df, 0x65e1, 0x65e3, 0x65e4, 0x65ea, 0x65eb, /* 0x95 */ 0x65f2, 0x65f3, 0x65f4, 0x65f5, 0x65f8, 0x65f9, 0x65fb, 0x65fc, 0x65fd, 0x65fe, 0x65ff, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608, 0x6609, 0x660b, 0x660d, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617, 0x6618, 0x661a, 0x661b, 0x661c, 0x661e, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629, 0x662a, 0x662b, 0x662c, 0x662e, 0x6630, 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663a, 0x663b, 0x663d, 0x663f, 0x6640, 0x6642, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, 0x6649, 0x664a, 0x664d, 0x664e, 0x6650, 0x6651, 0x6658, 0x6659, 0x665b, 0x665c, 0x665d, 0x665e, 0x6660, 0x6662, 0x6663, 0x6665, 0x6667, 0x6669, 0x666a, 0x666b, 0x666c, 0x666d, 0x6671, 0x6672, 0x6673, 0x6675, 0x6678, 0x6679, 0x667b, 0x667c, 0x667d, 0x667f, 0x6680, 0x6681, 0x6683, 0x6685, 0x6686, 0x6688, 0x6689, 0x668a, 0x668b, 0x668d, 0x668e, 0x668f, 0x6690, 0x6692, 0x6693, 0x6694, 0x6695, 0x6698, 0x6699, 0x669a, 0x669b, 0x669c, 0x669e, 0x669f, 0x66a0, 0x66a1, 0x66a2, 0x66a3, 0x66a4, 0x66a5, 0x66a6, 0x66a9, 0x66aa, 0x66ab, 0x66ac, 0x66ad, 0x66af, 0x66b0, 0x66b1, 0x66b2, 0x66b3, 0x66b5, 0x66b6, 0x66b7, 0x66b8, 0x66ba, 0x66bb, 0x66bc, 0x66bd, 0x66bf, 0x66c0, 0x66c1, 0x66c2, 0x66c3, 0x66c4, 0x66c5, 0x66c6, 0x66c7, 0x66c8, 0x66c9, 0x66ca, 0x66cb, 0x66cc, 0x66cd, 0x66ce, 0x66cf, 0x66d0, 0x66d1, 0x66d2, 0x66d3, 0x66d4, 0x66d5, 0x66d6, 0x66d7, 0x66d8, 0x66da, 0x66de, 0x66df, 0x66e0, 0x66e1, 0x66e2, 0x66e3, 0x66e4, 0x66e5, 0x66e7, 0x66e8, 0x66ea, 0x66eb, 0x66ec, 0x66ed, 0x66ee, 0x66ef, 0x66f1, 0x66f5, 0x66f6, 0x66f8, 0x66fa, 0x66fb, 0x66fd, 0x6701, 0x6702, 0x6703, /* 0x96 */ 0x6704, 0x6705, 0x6706, 0x6707, 0x670c, 0x670e, 0x670f, 0x6711, 0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671a, 0x671c, 0x671e, 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6727, 0x6729, 0x672e, 0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, 0x673b, 0x673c, 0x673e, 0x673f, 0x6741, 0x6744, 0x6745, 0x6747, 0x674a, 0x674b, 0x674d, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, 0x6759, 0x675a, 0x675b, 0x675d, 0x6762, 0x6763, 0x6764, 0x6766, 0x6767, 0x676b, 0x676c, 0x676e, 0x6771, 0x6774, 0x6776, 0x6778, 0x6779, 0x677a, 0x677b, 0x677d, 0x6780, 0x6782, 0x6783, 0x6785, 0x6786, 0x6788, 0x678a, 0x678c, 0x678d, 0x678e, 0x678f, 0x6791, 0x6792, 0x6793, 0x6794, 0x6796, 0x6799, 0x679b, 0x679f, 0x67a0, 0x67a1, 0x67a4, 0x67a6, 0x67a9, 0x67ac, 0x67ae, 0x67b1, 0x67b2, 0x67b4, 0x67b9, 0x67ba, 0x67bb, 0x67bc, 0x67bd, 0x67be, 0x67bf, 0x67c0, 0x67c2, 0x67c5, 0x67c6, 0x67c7, 0x67c8, 0x67c9, 0x67ca, 0x67cb, 0x67cc, 0x67cd, 0x67ce, 0x67d5, 0x67d6, 0x67d7, 0x67db, 0x67df, 0x67e1, 0x67e3, 0x67e4, 0x67e6, 0x67e7, 0x67e8, 0x67ea, 0x67eb, 0x67ed, 0x67ee, 0x67f2, 0x67f5, 0x67f6, 0x67f7, 0x67f8, 0x67f9, 0x67fa, 0x67fb, 0x67fc, 0x67fe, 0x6801, 0x6802, 0x6803, 0x6804, 0x6806, 0x680d, 0x6810, 0x6812, 0x6814, 0x6815, 0x6818, 0x6819, 0x681a, 0x681b, 0x681c, 0x681e, 0x681f, 0x6820, 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6828, 0x682b, 0x682c, 0x682d, 0x682e, 0x682f, 0x6830, 0x6831, 0x6834, 0x6835, 0x6836, 0x683a, 0x683b, 0x683f, 0x6847, 0x684b, 0x684d, 0x684f, 0x6852, 0x6856, 0x6857, 0x6858, 0x6859, 0x685a, 0x685b, /* 0x97 */ 0x685c, 0x685d, 0x685e, 0x685f, 0x686a, 0x686c, 0x686d, 0x686e, 0x686f, 0x6870, 0x6871, 0x6872, 0x6873, 0x6875, 0x6878, 0x6879, 0x687a, 0x687b, 0x687c, 0x687d, 0x687e, 0x687f, 0x6880, 0x6882, 0x6884, 0x6887, 0x6888, 0x6889, 0x688a, 0x688b, 0x688c, 0x688d, 0x688e, 0x6890, 0x6891, 0x6892, 0x6894, 0x6895, 0x6896, 0x6898, 0x6899, 0x689a, 0x689b, 0x689c, 0x689d, 0x689e, 0x689f, 0x68a0, 0x68a1, 0x68a3, 0x68a4, 0x68a5, 0x68a9, 0x68aa, 0x68ab, 0x68ac, 0x68ae, 0x68b1, 0x68b2, 0x68b4, 0x68b6, 0x68b7, 0x68b8, 0x68b9, 0x68ba, 0x68bb, 0x68bc, 0x68bd, 0x68be, 0x68bf, 0x68c1, 0x68c3, 0x68c4, 0x68c5, 0x68c6, 0x68c7, 0x68c8, 0x68ca, 0x68cc, 0x68ce, 0x68cf, 0x68d0, 0x68d1, 0x68d3, 0x68d4, 0x68d6, 0x68d7, 0x68d9, 0x68db, 0x68dc, 0x68dd, 0x68de, 0x68df, 0x68e1, 0x68e2, 0x68e4, 0x68e5, 0x68e6, 0x68e7, 0x68e8, 0x68e9, 0x68ea, 0x68eb, 0x68ec, 0x68ed, 0x68ef, 0x68f2, 0x68f3, 0x68f4, 0x68f6, 0x68f7, 0x68f8, 0x68fb, 0x68fd, 0x68fe, 0x68ff, 0x6900, 0x6902, 0x6903, 0x6904, 0x6906, 0x6907, 0x6908, 0x6909, 0x690a, 0x690c, 0x690f, 0x6911, 0x6913, 0x6914, 0x6915, 0x6916, 0x6917, 0x6918, 0x6919, 0x691a, 0x691b, 0x691c, 0x691d, 0x691e, 0x6921, 0x6922, 0x6923, 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, 0x692a, 0x692b, 0x692c, 0x692e, 0x692f, 0x6931, 0x6932, 0x6933, 0x6935, 0x6936, 0x6937, 0x6938, 0x693a, 0x693b, 0x693c, 0x693e, 0x6940, 0x6941, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, 0x6948, 0x6949, 0x694a, 0x694b, 0x694c, 0x694d, 0x694e, 0x694f, 0x6950, 0x6951, 0x6952, 0x6953, 0x6955, 0x6956, 0x6958, 0x6959, 0x695b, 0x695c, 0x695f, /* 0x98 */ 0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6968, 0x6969, 0x696a, 0x696c, 0x696d, 0x696f, 0x6970, 0x6972, 0x6973, 0x6974, 0x6975, 0x6976, 0x697a, 0x697b, 0x697d, 0x697e, 0x697f, 0x6981, 0x6983, 0x6985, 0x698a, 0x698b, 0x698c, 0x698e, 0x698f, 0x6990, 0x6991, 0x6992, 0x6993, 0x6996, 0x6997, 0x6999, 0x699a, 0x699d, 0x699e, 0x699f, 0x69a0, 0x69a1, 0x69a2, 0x69a3, 0x69a4, 0x69a5, 0x69a6, 0x69a9, 0x69aa, 0x69ac, 0x69ae, 0x69af, 0x69b0, 0x69b2, 0x69b3, 0x69b5, 0x69b6, 0x69b8, 0x69b9, 0x69ba, 0x69bc, 0x69bd, 0x69be, 0x69bf, 0x69c0, 0x69c2, 0x69c3, 0x69c4, 0x69c5, 0x69c6, 0x69c7, 0x69c8, 0x69c9, 0x69cb, 0x69cd, 0x69cf, 0x69d1, 0x69d2, 0x69d3, 0x69d5, 0x69d6, 0x69d7, 0x69d8, 0x69d9, 0x69da, 0x69dc, 0x69dd, 0x69de, 0x69e1, 0x69e2, 0x69e3, 0x69e4, 0x69e5, 0x69e6, 0x69e7, 0x69e8, 0x69e9, 0x69ea, 0x69eb, 0x69ec, 0x69ee, 0x69ef, 0x69f0, 0x69f1, 0x69f3, 0x69f4, 0x69f5, 0x69f6, 0x69f7, 0x69f8, 0x69f9, 0x69fa, 0x69fb, 0x69fc, 0x69fe, 0x6a00, 0x6a01, 0x6a02, 0x6a03, 0x6a04, 0x6a05, 0x6a06, 0x6a07, 0x6a08, 0x6a09, 0x6a0b, 0x6a0c, 0x6a0d, 0x6a0e, 0x6a0f, 0x6a10, 0x6a11, 0x6a12, 0x6a13, 0x6a14, 0x6a15, 0x6a16, 0x6a19, 0x6a1a, 0x6a1b, 0x6a1c, 0x6a1d, 0x6a1e, 0x6a20, 0x6a22, 0x6a23, 0x6a24, 0x6a25, 0x6a26, 0x6a27, 0x6a29, 0x6a2b, 0x6a2c, 0x6a2d, 0x6a2e, 0x6a30, 0x6a32, 0x6a33, 0x6a34, 0x6a36, 0x6a37, 0x6a38, 0x6a39, 0x6a3a, 0x6a3b, 0x6a3c, 0x6a3f, 0x6a40, 0x6a41, 0x6a42, 0x6a43, 0x6a45, 0x6a46, 0x6a48, 0x6a49, 0x6a4a, 0x6a4b, 0x6a4c, 0x6a4d, 0x6a4e, 0x6a4f, 0x6a51, 0x6a52, 0x6a53, 0x6a54, 0x6a55, 0x6a56, 0x6a57, 0x6a5a, /* 0x99 */ 0x6a5c, 0x6a5d, 0x6a5e, 0x6a5f, 0x6a60, 0x6a62, 0x6a63, 0x6a64, 0x6a66, 0x6a67, 0x6a68, 0x6a69, 0x6a6a, 0x6a6b, 0x6a6c, 0x6a6d, 0x6a6e, 0x6a6f, 0x6a70, 0x6a72, 0x6a73, 0x6a74, 0x6a75, 0x6a76, 0x6a77, 0x6a78, 0x6a7a, 0x6a7b, 0x6a7d, 0x6a7e, 0x6a7f, 0x6a81, 0x6a82, 0x6a83, 0x6a85, 0x6a86, 0x6a87, 0x6a88, 0x6a89, 0x6a8a, 0x6a8b, 0x6a8c, 0x6a8d, 0x6a8f, 0x6a92, 0x6a93, 0x6a94, 0x6a95, 0x6a96, 0x6a98, 0x6a99, 0x6a9a, 0x6a9b, 0x6a9c, 0x6a9d, 0x6a9e, 0x6a9f, 0x6aa1, 0x6aa2, 0x6aa3, 0x6aa4, 0x6aa5, 0x6aa6, 0x6aa7, 0x6aa8, 0x6aaa, 0x6aad, 0x6aae, 0x6aaf, 0x6ab0, 0x6ab1, 0x6ab2, 0x6ab3, 0x6ab4, 0x6ab5, 0x6ab6, 0x6ab7, 0x6ab8, 0x6ab9, 0x6aba, 0x6abb, 0x6abc, 0x6abd, 0x6abe, 0x6abf, 0x6ac0, 0x6ac1, 0x6ac2, 0x6ac3, 0x6ac4, 0x6ac5, 0x6ac6, 0x6ac7, 0x6ac8, 0x6ac9, 0x6aca, 0x6acb, 0x6acc, 0x6acd, 0x6ace, 0x6acf, 0x6ad0, 0x6ad1, 0x6ad2, 0x6ad3, 0x6ad4, 0x6ad5, 0x6ad6, 0x6ad7, 0x6ad8, 0x6ad9, 0x6ada, 0x6adb, 0x6adc, 0x6add, 0x6ade, 0x6adf, 0x6ae0, 0x6ae1, 0x6ae2, 0x6ae3, 0x6ae4, 0x6ae5, 0x6ae6, 0x6ae7, 0x6ae8, 0x6ae9, 0x6aea, 0x6aeb, 0x6aec, 0x6aed, 0x6aee, 0x6aef, 0x6af0, 0x6af1, 0x6af2, 0x6af3, 0x6af4, 0x6af5, 0x6af6, 0x6af7, 0x6af8, 0x6af9, 0x6afa, 0x6afb, 0x6afc, 0x6afd, 0x6afe, 0x6aff, 0x6b00, 0x6b01, 0x6b02, 0x6b03, 0x6b04, 0x6b05, 0x6b06, 0x6b07, 0x6b08, 0x6b09, 0x6b0a, 0x6b0b, 0x6b0c, 0x6b0d, 0x6b0e, 0x6b0f, 0x6b10, 0x6b11, 0x6b12, 0x6b13, 0x6b14, 0x6b15, 0x6b16, 0x6b17, 0x6b18, 0x6b19, 0x6b1a, 0x6b1b, 0x6b1c, 0x6b1d, 0x6b1e, 0x6b1f, 0x6b25, 0x6b26, 0x6b28, 0x6b29, 0x6b2a, 0x6b2b, 0x6b2c, 0x6b2d, 0x6b2e, /* 0x9a */ 0x6b2f, 0x6b30, 0x6b31, 0x6b33, 0x6b34, 0x6b35, 0x6b36, 0x6b38, 0x6b3b, 0x6b3c, 0x6b3d, 0x6b3f, 0x6b40, 0x6b41, 0x6b42, 0x6b44, 0x6b45, 0x6b48, 0x6b4a, 0x6b4b, 0x6b4d, 0x6b4e, 0x6b4f, 0x6b50, 0x6b51, 0x6b52, 0x6b53, 0x6b54, 0x6b55, 0x6b56, 0x6b57, 0x6b58, 0x6b5a, 0x6b5b, 0x6b5c, 0x6b5d, 0x6b5e, 0x6b5f, 0x6b60, 0x6b61, 0x6b68, 0x6b69, 0x6b6b, 0x6b6c, 0x6b6d, 0x6b6e, 0x6b6f, 0x6b70, 0x6b71, 0x6b72, 0x6b73, 0x6b74, 0x6b75, 0x6b76, 0x6b77, 0x6b78, 0x6b7a, 0x6b7d, 0x6b7e, 0x6b7f, 0x6b80, 0x6b85, 0x6b88, 0x6b8c, 0x6b8e, 0x6b8f, 0x6b90, 0x6b91, 0x6b94, 0x6b95, 0x6b97, 0x6b98, 0x6b99, 0x6b9c, 0x6b9d, 0x6b9e, 0x6b9f, 0x6ba0, 0x6ba2, 0x6ba3, 0x6ba4, 0x6ba5, 0x6ba6, 0x6ba7, 0x6ba8, 0x6ba9, 0x6bab, 0x6bac, 0x6bad, 0x6bae, 0x6baf, 0x6bb0, 0x6bb1, 0x6bb2, 0x6bb6, 0x6bb8, 0x6bb9, 0x6bba, 0x6bbb, 0x6bbc, 0x6bbd, 0x6bbe, 0x6bc0, 0x6bc3, 0x6bc4, 0x6bc6, 0x6bc7, 0x6bc8, 0x6bc9, 0x6bca, 0x6bcc, 0x6bce, 0x6bd0, 0x6bd1, 0x6bd8, 0x6bda, 0x6bdc, 0x6bdd, 0x6bde, 0x6bdf, 0x6be0, 0x6be2, 0x6be3, 0x6be4, 0x6be5, 0x6be6, 0x6be7, 0x6be8, 0x6be9, 0x6bec, 0x6bed, 0x6bee, 0x6bf0, 0x6bf1, 0x6bf2, 0x6bf4, 0x6bf6, 0x6bf7, 0x6bf8, 0x6bfa, 0x6bfb, 0x6bfc, 0x6bfe, 0x6bff, 0x6c00, 0x6c01, 0x6c02, 0x6c03, 0x6c04, 0x6c08, 0x6c09, 0x6c0a, 0x6c0b, 0x6c0c, 0x6c0e, 0x6c12, 0x6c17, 0x6c1c, 0x6c1d, 0x6c1e, 0x6c20, 0x6c23, 0x6c25, 0x6c2b, 0x6c2c, 0x6c2d, 0x6c31, 0x6c33, 0x6c36, 0x6c37, 0x6c39, 0x6c3a, 0x6c3b, 0x6c3c, 0x6c3e, 0x6c3f, 0x6c43, 0x6c44, 0x6c45, 0x6c48, 0x6c4b, 0x6c4c, 0x6c4d, 0x6c4e, 0x6c4f, 0x6c51, 0x6c52, 0x6c53, 0x6c56, 0x6c58, /* 0x9b */ 0x6c59, 0x6c5a, 0x6c62, 0x6c63, 0x6c65, 0x6c66, 0x6c67, 0x6c6b, 0x6c6c, 0x6c6d, 0x6c6e, 0x6c6f, 0x6c71, 0x6c73, 0x6c75, 0x6c77, 0x6c78, 0x6c7a, 0x6c7b, 0x6c7c, 0x6c7f, 0x6c80, 0x6c84, 0x6c87, 0x6c8a, 0x6c8b, 0x6c8d, 0x6c8e, 0x6c91, 0x6c92, 0x6c95, 0x6c96, 0x6c97, 0x6c98, 0x6c9a, 0x6c9c, 0x6c9d, 0x6c9e, 0x6ca0, 0x6ca2, 0x6ca8, 0x6cac, 0x6caf, 0x6cb0, 0x6cb4, 0x6cb5, 0x6cb6, 0x6cb7, 0x6cba, 0x6cc0, 0x6cc1, 0x6cc2, 0x6cc3, 0x6cc6, 0x6cc7, 0x6cc8, 0x6ccb, 0x6ccd, 0x6cce, 0x6ccf, 0x6cd1, 0x6cd2, 0x6cd8, 0x6cd9, 0x6cda, 0x6cdc, 0x6cdd, 0x6cdf, 0x6ce4, 0x6ce6, 0x6ce7, 0x6ce9, 0x6cec, 0x6ced, 0x6cf2, 0x6cf4, 0x6cf9, 0x6cff, 0x6d00, 0x6d02, 0x6d03, 0x6d05, 0x6d06, 0x6d08, 0x6d09, 0x6d0a, 0x6d0d, 0x6d0f, 0x6d10, 0x6d11, 0x6d13, 0x6d14, 0x6d15, 0x6d16, 0x6d18, 0x6d1c, 0x6d1d, 0x6d1f, 0x6d20, 0x6d21, 0x6d22, 0x6d23, 0x6d24, 0x6d26, 0x6d28, 0x6d29, 0x6d2c, 0x6d2d, 0x6d2f, 0x6d30, 0x6d34, 0x6d36, 0x6d37, 0x6d38, 0x6d3a, 0x6d3f, 0x6d40, 0x6d42, 0x6d44, 0x6d49, 0x6d4c, 0x6d50, 0x6d55, 0x6d56, 0x6d57, 0x6d58, 0x6d5b, 0x6d5d, 0x6d5f, 0x6d61, 0x6d62, 0x6d64, 0x6d65, 0x6d67, 0x6d68, 0x6d6b, 0x6d6c, 0x6d6d, 0x6d70, 0x6d71, 0x6d72, 0x6d73, 0x6d75, 0x6d76, 0x6d79, 0x6d7a, 0x6d7b, 0x6d7d, 0x6d7e, 0x6d7f, 0x6d80, 0x6d81, 0x6d83, 0x6d84, 0x6d86, 0x6d87, 0x6d8a, 0x6d8b, 0x6d8d, 0x6d8f, 0x6d90, 0x6d92, 0x6d96, 0x6d97, 0x6d98, 0x6d99, 0x6d9a, 0x6d9c, 0x6da2, 0x6da5, 0x6dac, 0x6dad, 0x6db0, 0x6db1, 0x6db3, 0x6db4, 0x6db6, 0x6db7, 0x6db9, 0x6dba, 0x6dbb, 0x6dbc, 0x6dbd, 0x6dbe, 0x6dc1, 0x6dc2, 0x6dc3, 0x6dc8, 0x6dc9, 0x6dca, /* 0x9c */ 0x6dcd, 0x6dce, 0x6dcf, 0x6dd0, 0x6dd2, 0x6dd3, 0x6dd4, 0x6dd5, 0x6dd7, 0x6dda, 0x6ddb, 0x6ddc, 0x6ddf, 0x6de2, 0x6de3, 0x6de5, 0x6de7, 0x6de8, 0x6de9, 0x6dea, 0x6ded, 0x6def, 0x6df0, 0x6df2, 0x6df4, 0x6df5, 0x6df6, 0x6df8, 0x6dfa, 0x6dfd, 0x6dfe, 0x6dff, 0x6e00, 0x6e01, 0x6e02, 0x6e03, 0x6e04, 0x6e06, 0x6e07, 0x6e08, 0x6e09, 0x6e0b, 0x6e0f, 0x6e12, 0x6e13, 0x6e15, 0x6e18, 0x6e19, 0x6e1b, 0x6e1c, 0x6e1e, 0x6e1f, 0x6e22, 0x6e26, 0x6e27, 0x6e28, 0x6e2a, 0x6e2c, 0x6e2e, 0x6e30, 0x6e31, 0x6e33, 0x6e35, 0x6e36, 0x6e37, 0x6e39, 0x6e3b, 0x6e3c, 0x6e3d, 0x6e3e, 0x6e3f, 0x6e40, 0x6e41, 0x6e42, 0x6e45, 0x6e46, 0x6e47, 0x6e48, 0x6e49, 0x6e4a, 0x6e4b, 0x6e4c, 0x6e4f, 0x6e50, 0x6e51, 0x6e52, 0x6e55, 0x6e57, 0x6e59, 0x6e5a, 0x6e5c, 0x6e5d, 0x6e5e, 0x6e60, 0x6e61, 0x6e62, 0x6e63, 0x6e64, 0x6e65, 0x6e66, 0x6e67, 0x6e68, 0x6e69, 0x6e6a, 0x6e6c, 0x6e6d, 0x6e6f, 0x6e70, 0x6e71, 0x6e72, 0x6e73, 0x6e74, 0x6e75, 0x6e76, 0x6e77, 0x6e78, 0x6e79, 0x6e7a, 0x6e7b, 0x6e7c, 0x6e7d, 0x6e80, 0x6e81, 0x6e82, 0x6e84, 0x6e87, 0x6e88, 0x6e8a, 0x6e8b, 0x6e8c, 0x6e8d, 0x6e8e, 0x6e91, 0x6e92, 0x6e93, 0x6e94, 0x6e95, 0x6e96, 0x6e97, 0x6e99, 0x6e9a, 0x6e9b, 0x6e9d, 0x6e9e, 0x6ea0, 0x6ea1, 0x6ea3, 0x6ea4, 0x6ea6, 0x6ea8, 0x6ea9, 0x6eab, 0x6eac, 0x6ead, 0x6eae, 0x6eb0, 0x6eb3, 0x6eb5, 0x6eb8, 0x6eb9, 0x6ebc, 0x6ebe, 0x6ebf, 0x6ec0, 0x6ec3, 0x6ec4, 0x6ec5, 0x6ec6, 0x6ec8, 0x6ec9, 0x6eca, 0x6ecc, 0x6ecd, 0x6ece, 0x6ed0, 0x6ed2, 0x6ed6, 0x6ed8, 0x6ed9, 0x6edb, 0x6edc, 0x6edd, 0x6ee3, 0x6ee7, 0x6eea, 0x6eeb, 0x6eec, 0x6eed, 0x6eee, 0x6eef, /* 0x9d */ 0x6ef0, 0x6ef1, 0x6ef2, 0x6ef3, 0x6ef5, 0x6ef6, 0x6ef7, 0x6ef8, 0x6efa, 0x6efb, 0x6efc, 0x6efd, 0x6efe, 0x6eff, 0x6f00, 0x6f01, 0x6f03, 0x6f04, 0x6f05, 0x6f07, 0x6f08, 0x6f0a, 0x6f0b, 0x6f0c, 0x6f0d, 0x6f0e, 0x6f10, 0x6f11, 0x6f12, 0x6f16, 0x6f17, 0x6f18, 0x6f19, 0x6f1a, 0x6f1b, 0x6f1c, 0x6f1d, 0x6f1e, 0x6f1f, 0x6f21, 0x6f22, 0x6f23, 0x6f25, 0x6f26, 0x6f27, 0x6f28, 0x6f2c, 0x6f2e, 0x6f30, 0x6f32, 0x6f34, 0x6f35, 0x6f37, 0x6f38, 0x6f39, 0x6f3a, 0x6f3b, 0x6f3c, 0x6f3d, 0x6f3f, 0x6f40, 0x6f41, 0x6f42, 0x6f43, 0x6f44, 0x6f45, 0x6f48, 0x6f49, 0x6f4a, 0x6f4c, 0x6f4e, 0x6f4f, 0x6f50, 0x6f51, 0x6f52, 0x6f53, 0x6f54, 0x6f55, 0x6f56, 0x6f57, 0x6f59, 0x6f5a, 0x6f5b, 0x6f5d, 0x6f5f, 0x6f60, 0x6f61, 0x6f63, 0x6f64, 0x6f65, 0x6f67, 0x6f68, 0x6f69, 0x6f6a, 0x6f6b, 0x6f6c, 0x6f6f, 0x6f70, 0x6f71, 0x6f73, 0x6f75, 0x6f76, 0x6f77, 0x6f79, 0x6f7b, 0x6f7d, 0x6f7e, 0x6f7f, 0x6f80, 0x6f81, 0x6f82, 0x6f83, 0x6f85, 0x6f86, 0x6f87, 0x6f8a, 0x6f8b, 0x6f8f, 0x6f90, 0x6f91, 0x6f92, 0x6f93, 0x6f94, 0x6f95, 0x6f96, 0x6f97, 0x6f98, 0x6f99, 0x6f9a, 0x6f9b, 0x6f9d, 0x6f9e, 0x6f9f, 0x6fa0, 0x6fa2, 0x6fa3, 0x6fa4, 0x6fa5, 0x6fa6, 0x6fa8, 0x6fa9, 0x6faa, 0x6fab, 0x6fac, 0x6fad, 0x6fae, 0x6faf, 0x6fb0, 0x6fb1, 0x6fb2, 0x6fb4, 0x6fb5, 0x6fb7, 0x6fb8, 0x6fba, 0x6fbb, 0x6fbc, 0x6fbd, 0x6fbe, 0x6fbf, 0x6fc1, 0x6fc3, 0x6fc4, 0x6fc5, 0x6fc6, 0x6fc7, 0x6fc8, 0x6fca, 0x6fcb, 0x6fcc, 0x6fcd, 0x6fce, 0x6fcf, 0x6fd0, 0x6fd3, 0x6fd4, 0x6fd5, 0x6fd6, 0x6fd7, 0x6fd8, 0x6fd9, 0x6fda, 0x6fdb, 0x6fdc, 0x6fdd, 0x6fdf, 0x6fe2, 0x6fe3, 0x6fe4, 0x6fe5, /* 0x9e */ 0x6fe6, 0x6fe7, 0x6fe8, 0x6fe9, 0x6fea, 0x6feb, 0x6fec, 0x6fed, 0x6ff0, 0x6ff1, 0x6ff2, 0x6ff3, 0x6ff4, 0x6ff5, 0x6ff6, 0x6ff7, 0x6ff8, 0x6ff9, 0x6ffa, 0x6ffb, 0x6ffc, 0x6ffd, 0x6ffe, 0x6fff, 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007, 0x7008, 0x7009, 0x700a, 0x700b, 0x700c, 0x700d, 0x700e, 0x700f, 0x7010, 0x7012, 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, 0x7018, 0x7019, 0x701c, 0x701d, 0x701e, 0x701f, 0x7020, 0x7021, 0x7022, 0x7024, 0x7025, 0x7026, 0x7027, 0x7028, 0x7029, 0x702a, 0x702b, 0x702c, 0x702d, 0x702e, 0x702f, 0x7030, 0x7031, 0x7032, 0x7033, 0x7034, 0x7036, 0x7037, 0x7038, 0x703a, 0x703b, 0x703c, 0x703d, 0x703e, 0x703f, 0x7040, 0x7041, 0x7042, 0x7043, 0x7044, 0x7045, 0x7046, 0x7047, 0x7048, 0x7049, 0x704a, 0x704b, 0x704d, 0x704e, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7057, 0x7058, 0x7059, 0x705a, 0x705b, 0x705c, 0x705d, 0x705f, 0x7060, 0x7061, 0x7062, 0x7063, 0x7064, 0x7065, 0x7066, 0x7067, 0x7068, 0x7069, 0x706a, 0x706e, 0x7071, 0x7072, 0x7073, 0x7074, 0x7077, 0x7079, 0x707a, 0x707b, 0x707d, 0x7081, 0x7082, 0x7083, 0x7084, 0x7086, 0x7087, 0x7088, 0x708b, 0x708c, 0x708d, 0x708f, 0x7090, 0x7091, 0x7093, 0x7097, 0x7098, 0x709a, 0x709b, 0x709e, 0x709f, 0x70a0, 0x70a1, 0x70a2, 0x70a3, 0x70a4, 0x70a5, 0x70a6, 0x70a7, 0x70a8, 0x70a9, 0x70aa, 0x70b0, 0x70b2, 0x70b4, 0x70b5, 0x70b6, 0x70ba, 0x70be, 0x70bf, 0x70c4, 0x70c5, 0x70c6, 0x70c7, 0x70c9, 0x70cb, 0x70cc, 0x70cd, 0x70ce, 0x70cf, 0x70d0, 0x70d1, 0x70d2, 0x70d3, 0x70d4, 0x70d5, 0x70d6, 0x70d7, 0x70da, /* 0x9f */ 0x70dc, 0x70dd, 0x70de, 0x70e0, 0x70e1, 0x70e2, 0x70e3, 0x70e5, 0x70ea, 0x70ee, 0x70f0, 0x70f1, 0x70f2, 0x70f3, 0x70f4, 0x70f5, 0x70f6, 0x70f8, 0x70fa, 0x70fb, 0x70fc, 0x70fe, 0x70ff, 0x7100, 0x7101, 0x7102, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108, 0x710b, 0x710c, 0x710d, 0x710e, 0x710f, 0x7111, 0x7112, 0x7114, 0x7117, 0x711b, 0x711c, 0x711d, 0x711e, 0x711f, 0x7120, 0x7121, 0x7122, 0x7123, 0x7124, 0x7125, 0x7127, 0x7128, 0x7129, 0x712a, 0x712b, 0x712c, 0x712d, 0x712e, 0x7132, 0x7133, 0x7134, 0x7135, 0x7137, 0x7138, 0x7139, 0x713a, 0x713b, 0x713c, 0x713d, 0x713e, 0x713f, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7146, 0x7147, 0x7148, 0x7149, 0x714b, 0x714d, 0x714f, 0x7150, 0x7151, 0x7152, 0x7153, 0x7154, 0x7155, 0x7156, 0x7157, 0x7158, 0x7159, 0x715a, 0x715b, 0x715d, 0x715f, 0x7160, 0x7161, 0x7162, 0x7163, 0x7165, 0x7169, 0x716a, 0x716b, 0x716c, 0x716d, 0x716f, 0x7170, 0x7171, 0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717b, 0x717c, 0x717e, 0x717f, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, 0x7187, 0x7188, 0x7189, 0x718b, 0x718c, 0x718d, 0x718e, 0x7190, 0x7191, 0x7192, 0x7193, 0x7195, 0x7196, 0x7197, 0x719a, 0x719b, 0x719c, 0x719d, 0x719e, 0x71a1, 0x71a2, 0x71a3, 0x71a4, 0x71a5, 0x71a6, 0x71a7, 0x71a9, 0x71aa, 0x71ab, 0x71ad, 0x71ae, 0x71af, 0x71b0, 0x71b1, 0x71b2, 0x71b4, 0x71b6, 0x71b7, 0x71b8, 0x71ba, 0x71bb, 0x71bc, 0x71bd, 0x71be, 0x71bf, 0x71c0, 0x71c1, 0x71c2, 0x71c4, 0x71c5, 0x71c6, 0x71c7, 0x71c8, 0x71c9, 0x71ca, 0x71cb, 0x71cc, 0x71cd, 0x71cf, 0x71d0, 0x71d1, 0x71d2, 0x71d3, /* 0xa0 */ 0x71d6, 0x71d7, 0x71d8, 0x71d9, 0x71da, 0x71db, 0x71dc, 0x71dd, 0x71de, 0x71df, 0x71e1, 0x71e2, 0x71e3, 0x71e4, 0x71e6, 0x71e8, 0x71e9, 0x71ea, 0x71eb, 0x71ec, 0x71ed, 0x71ef, 0x71f0, 0x71f1, 0x71f2, 0x71f3, 0x71f4, 0x71f5, 0x71f6, 0x71f7, 0x71f8, 0x71fa, 0x71fb, 0x71fc, 0x71fd, 0x71fe, 0x71ff, 0x7200, 0x7201, 0x7202, 0x7203, 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, 0x720a, 0x720b, 0x720c, 0x720d, 0x720e, 0x720f, 0x7210, 0x7211, 0x7212, 0x7213, 0x7214, 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, 0x721a, 0x721b, 0x721c, 0x721e, 0x721f, 0x7220, 0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7229, 0x722b, 0x722d, 0x722e, 0x722f, 0x7232, 0x7233, 0x7234, 0x723a, 0x723c, 0x723e, 0x7240, 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724a, 0x724b, 0x724e, 0x724f, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255, 0x7257, 0x7258, 0x725a, 0x725c, 0x725e, 0x7260, 0x7263, 0x7264, 0x7265, 0x7268, 0x726a, 0x726b, 0x726c, 0x726d, 0x7270, 0x7271, 0x7273, 0x7274, 0x7276, 0x7277, 0x7278, 0x727b, 0x727c, 0x727d, 0x7282, 0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728c, 0x728e, 0x7290, 0x7291, 0x7293, 0x7294, 0x7295, 0x7296, 0x7297, 0x7298, 0x7299, 0x729a, 0x729b, 0x729c, 0x729d, 0x729e, 0x72a0, 0x72a1, 0x72a2, 0x72a3, 0x72a4, 0x72a5, 0x72a6, 0x72a7, 0x72a8, 0x72a9, 0x72aa, 0x72ab, 0x72ae, 0x72b1, 0x72b2, 0x72b3, 0x72b5, 0x72ba, 0x72bb, 0x72bc, 0x72bd, 0x72be, 0x72bf, 0x72c0, 0x72c5, 0x72c6, 0x72c7, 0x72c9, 0x72ca, 0x72cb, 0x72cc, 0x72cf, 0x72d1, 0x72d3, 0x72d4, 0x72d5, 0x72d6, 0x72d8, 0x72da, 0x72db, }; static int gbkext1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x81 && c1 <= 0xa0)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xff)) { unsigned int i = 190 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); unsigned short wc = 0xfffd; { if (i < 6080) wc = gbkext1_2uni_page81[i]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } fldigi-3.21.80/src/libtiniconv/encdec/gbkext2.h0000664000175000017500000021261412313064025016117 00000000000000/* * Copyright (C) 1999-2000 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK/4 and GBK/5 extensions */ static const unsigned short gbkext2_2uni_pagea8[8272] = { /* 0xa8 */ 0x02ca, 0x02cb, 0x02d9, 0x2013, 0x2015, 0x2025, 0x2035, 0x2105, 0x2109, 0x2196, 0x2197, 0x2198, 0x2199, 0x2215, 0x221f, 0x2223, 0x2252, 0x2266, 0x2267, 0x22bf, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x2589, 0x258a, 0x258b, 0x258c, 0x258d, 0x258e, 0x258f, 0x2593, 0x2594, 0x2595, 0x25bc, 0x25bd, 0x25e2, 0x25e3, 0x25e4, 0x25e5, 0x2609, 0x2295, 0x3012, 0x301d, 0x301e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa9 */ 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x32a3, 0x338e, 0x338f, 0x339c, 0x339d, 0x339e, 0x33a1, 0x33c4, 0x33ce, 0x33d1, 0x33d2, 0x33d5, 0xfe30, 0xffe2, 0xffe4, 0xfffd, 0x2121, 0x3231, 0xfffd, 0x2010, 0xfffd, 0xfffd, 0xfffd, 0x30fc, 0x309b, 0x309c, 0x30fd, 0x30fe, 0x3006, 0x309d, 0x309e, 0xfe49, 0xfe4a, 0xfe4b, 0xfe4c, 0xfe4d, 0xfe4e, 0xfe4f, 0xfe50, 0xfe51, 0xfe52, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xfe59, 0xfe5a, 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0xfe5f, 0xfe60, 0xfe61, 0xfe62, 0xfe63, 0xfe64, 0xfe65, 0xfe66, 0xfe68, 0xfe69, 0xfe6a, 0xfe6b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x3007, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xaa */ 0x72dc, 0x72dd, 0x72df, 0x72e2, 0x72e3, 0x72e4, 0x72e5, 0x72e6, 0x72e7, 0x72ea, 0x72eb, 0x72f5, 0x72f6, 0x72f9, 0x72fd, 0x72fe, 0x72ff, 0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, 0x7309, 0x730b, 0x730c, 0x730d, 0x730f, 0x7310, 0x7311, 0x7312, 0x7314, 0x7318, 0x7319, 0x731a, 0x731f, 0x7320, 0x7323, 0x7324, 0x7326, 0x7327, 0x7328, 0x732d, 0x732f, 0x7330, 0x7332, 0x7333, 0x7335, 0x7336, 0x733a, 0x733b, 0x733c, 0x733d, 0x7340, 0x7341, 0x7342, 0x7343, 0x7344, 0x7345, 0x7346, 0x7347, 0x7348, 0x7349, 0x734a, 0x734b, 0x734c, 0x734e, 0x734f, 0x7351, 0x7353, 0x7354, 0x7355, 0x7356, 0x7358, 0x7359, 0x735a, 0x735b, 0x735c, 0x735d, 0x735e, 0x735f, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0x7367, 0x7368, 0x7369, 0x736a, 0x736b, 0x736e, 0x7370, 0x7371, /* 0xab */ 0x7372, 0x7373, 0x7374, 0x7375, 0x7376, 0x7377, 0x7378, 0x7379, 0x737a, 0x737b, 0x737c, 0x737d, 0x737f, 0x7380, 0x7381, 0x7382, 0x7383, 0x7385, 0x7386, 0x7388, 0x738a, 0x738c, 0x738d, 0x738f, 0x7390, 0x7392, 0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399, 0x739a, 0x739c, 0x739d, 0x739e, 0x73a0, 0x73a1, 0x73a3, 0x73a4, 0x73a5, 0x73a6, 0x73a7, 0x73a8, 0x73aa, 0x73ac, 0x73ad, 0x73b1, 0x73b4, 0x73b5, 0x73b6, 0x73b8, 0x73b9, 0x73bc, 0x73bd, 0x73be, 0x73bf, 0x73c1, 0x73c3, 0x73c4, 0x73c5, 0x73c6, 0x73c7, 0x73cb, 0x73cc, 0x73ce, 0x73d2, 0x73d3, 0x73d4, 0x73d5, 0x73d6, 0x73d7, 0x73d8, 0x73da, 0x73db, 0x73dc, 0x73dd, 0x73df, 0x73e1, 0x73e2, 0x73e3, 0x73e4, 0x73e6, 0x73e8, 0x73ea, 0x73eb, 0x73ec, 0x73ee, 0x73ef, 0x73f0, 0x73f1, 0x73f3, 0x73f4, 0x73f5, 0x73f6, 0x73f7, /* 0xac */ 0x73f8, 0x73f9, 0x73fa, 0x73fb, 0x73fc, 0x73fd, 0x73fe, 0x73ff, 0x7400, 0x7401, 0x7402, 0x7404, 0x7407, 0x7408, 0x740b, 0x740c, 0x740d, 0x740e, 0x7411, 0x7412, 0x7413, 0x7414, 0x7415, 0x7416, 0x7417, 0x7418, 0x7419, 0x741c, 0x741d, 0x741e, 0x741f, 0x7420, 0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742b, 0x742d, 0x742f, 0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743a, 0x743b, 0x743d, 0x743e, 0x743f, 0x7440, 0x7442, 0x7443, 0x7444, 0x7445, 0x7446, 0x7447, 0x7448, 0x7449, 0x744a, 0x744b, 0x744c, 0x744d, 0x744e, 0x744f, 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, 0x7456, 0x7458, 0x745d, 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, 0x7465, 0x7466, 0x7467, 0x7468, 0x7469, 0x746a, 0x746b, 0x746c, 0x746e, 0x746f, 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, 0x747a, /* 0xad */ 0x747b, 0x747c, 0x747d, 0x747f, 0x7482, 0x7484, 0x7485, 0x7486, 0x7488, 0x7489, 0x748a, 0x748c, 0x748d, 0x748f, 0x7491, 0x7492, 0x7493, 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749a, 0x749b, 0x749d, 0x749f, 0x74a0, 0x74a1, 0x74a2, 0x74a3, 0x74a4, 0x74a5, 0x74a6, 0x74aa, 0x74ab, 0x74ac, 0x74ad, 0x74ae, 0x74af, 0x74b0, 0x74b1, 0x74b2, 0x74b3, 0x74b4, 0x74b5, 0x74b6, 0x74b7, 0x74b8, 0x74b9, 0x74bb, 0x74bc, 0x74bd, 0x74be, 0x74bf, 0x74c0, 0x74c1, 0x74c2, 0x74c3, 0x74c4, 0x74c5, 0x74c6, 0x74c7, 0x74c8, 0x74c9, 0x74ca, 0x74cb, 0x74cc, 0x74cd, 0x74ce, 0x74cf, 0x74d0, 0x74d1, 0x74d3, 0x74d4, 0x74d5, 0x74d6, 0x74d7, 0x74d8, 0x74d9, 0x74da, 0x74db, 0x74dd, 0x74df, 0x74e1, 0x74e5, 0x74e7, 0x74e8, 0x74e9, 0x74ea, 0x74eb, 0x74ec, 0x74ed, 0x74f0, 0x74f1, 0x74f2, /* 0xae */ 0x74f3, 0x74f5, 0x74f8, 0x74f9, 0x74fa, 0x74fb, 0x74fc, 0x74fd, 0x74fe, 0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, 0x7508, 0x7509, 0x750a, 0x750b, 0x750c, 0x750e, 0x7510, 0x7512, 0x7514, 0x7515, 0x7516, 0x7517, 0x751b, 0x751d, 0x751e, 0x7520, 0x7521, 0x7522, 0x7523, 0x7524, 0x7526, 0x7527, 0x752a, 0x752e, 0x7534, 0x7536, 0x7539, 0x753c, 0x753d, 0x753f, 0x7541, 0x7542, 0x7543, 0x7544, 0x7546, 0x7547, 0x7549, 0x754a, 0x754d, 0x7550, 0x7551, 0x7552, 0x7553, 0x7555, 0x7556, 0x7557, 0x7558, 0x755d, 0x755e, 0x755f, 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, 0x7567, 0x7568, 0x7569, 0x756b, 0x756c, 0x756d, 0x756e, 0x756f, 0x7570, 0x7571, 0x7573, 0x7575, 0x7576, 0x7577, 0x757a, 0x757b, 0x757c, 0x757d, 0x757e, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585, 0x7587, /* 0xaf */ 0x7588, 0x7589, 0x758a, 0x758c, 0x758d, 0x758e, 0x7590, 0x7593, 0x7595, 0x7598, 0x759b, 0x759c, 0x759e, 0x75a2, 0x75a6, 0x75a7, 0x75a8, 0x75a9, 0x75aa, 0x75ad, 0x75b6, 0x75b7, 0x75ba, 0x75bb, 0x75bf, 0x75c0, 0x75c1, 0x75c6, 0x75cb, 0x75cc, 0x75ce, 0x75cf, 0x75d0, 0x75d1, 0x75d3, 0x75d7, 0x75d9, 0x75da, 0x75dc, 0x75dd, 0x75df, 0x75e0, 0x75e1, 0x75e5, 0x75e9, 0x75ec, 0x75ed, 0x75ee, 0x75ef, 0x75f2, 0x75f3, 0x75f5, 0x75f6, 0x75f7, 0x75f8, 0x75fa, 0x75fb, 0x75fd, 0x75fe, 0x7602, 0x7604, 0x7606, 0x7607, 0x7608, 0x7609, 0x760b, 0x760d, 0x760e, 0x760f, 0x7611, 0x7612, 0x7613, 0x7614, 0x7616, 0x761a, 0x761c, 0x761d, 0x761e, 0x7621, 0x7623, 0x7627, 0x7628, 0x762c, 0x762e, 0x762f, 0x7631, 0x7632, 0x7636, 0x7637, 0x7639, 0x763a, 0x763b, 0x763d, 0x7641, 0x7642, 0x7644, /* 0xb0 */ 0x7645, 0x7646, 0x7647, 0x7648, 0x7649, 0x764a, 0x764b, 0x764e, 0x764f, 0x7650, 0x7651, 0x7652, 0x7653, 0x7655, 0x7657, 0x7658, 0x7659, 0x765a, 0x765b, 0x765d, 0x765f, 0x7660, 0x7661, 0x7662, 0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766a, 0x766c, 0x766d, 0x766e, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x7675, 0x7676, 0x7677, 0x7679, 0x767a, 0x767c, 0x767f, 0x7680, 0x7681, 0x7683, 0x7685, 0x7689, 0x768a, 0x768c, 0x768d, 0x768f, 0x7690, 0x7692, 0x7694, 0x7695, 0x7697, 0x7698, 0x769a, 0x769b, 0x769c, 0x769d, 0x769e, 0x769f, 0x76a0, 0x76a1, 0x76a2, 0x76a3, 0x76a5, 0x76a6, 0x76a7, 0x76a8, 0x76a9, 0x76aa, 0x76ab, 0x76ac, 0x76ad, 0x76af, 0x76b0, 0x76b3, 0x76b5, 0x76b6, 0x76b7, 0x76b8, 0x76b9, 0x76ba, 0x76bb, 0x76bc, 0x76bd, 0x76be, 0x76c0, 0x76c1, 0x76c3, /* 0xb1 */ 0x76c4, 0x76c7, 0x76c9, 0x76cb, 0x76cc, 0x76d3, 0x76d5, 0x76d9, 0x76da, 0x76dc, 0x76dd, 0x76de, 0x76e0, 0x76e1, 0x76e2, 0x76e3, 0x76e4, 0x76e6, 0x76e7, 0x76e8, 0x76e9, 0x76ea, 0x76eb, 0x76ec, 0x76ed, 0x76f0, 0x76f3, 0x76f5, 0x76f6, 0x76f7, 0x76fa, 0x76fb, 0x76fd, 0x76ff, 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770a, 0x770c, 0x770e, 0x770f, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, 0x7715, 0x7716, 0x7717, 0x7718, 0x771b, 0x771c, 0x771d, 0x771e, 0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772a, 0x772b, 0x772c, 0x772e, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, 0x773b, 0x773d, 0x773e, 0x773f, 0x7742, 0x7744, 0x7745, 0x7746, 0x7748, 0x7749, 0x774a, 0x774b, 0x774c, 0x774d, 0x774e, 0x774f, 0x7752, 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759, 0x775c, /* 0xb2 */ 0x775d, 0x775e, 0x775f, 0x7760, 0x7764, 0x7767, 0x7769, 0x776a, 0x776d, 0x776e, 0x776f, 0x7770, 0x7771, 0x7772, 0x7773, 0x7774, 0x7775, 0x7776, 0x7777, 0x7778, 0x777a, 0x777b, 0x777c, 0x7781, 0x7782, 0x7783, 0x7786, 0x7787, 0x7788, 0x7789, 0x778a, 0x778b, 0x778f, 0x7790, 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7798, 0x7799, 0x779a, 0x779b, 0x779c, 0x779d, 0x779e, 0x77a1, 0x77a3, 0x77a4, 0x77a6, 0x77a8, 0x77ab, 0x77ad, 0x77ae, 0x77af, 0x77b1, 0x77b2, 0x77b4, 0x77b6, 0x77b7, 0x77b8, 0x77b9, 0x77ba, 0x77bc, 0x77be, 0x77c0, 0x77c1, 0x77c2, 0x77c3, 0x77c4, 0x77c5, 0x77c6, 0x77c7, 0x77c8, 0x77c9, 0x77ca, 0x77cb, 0x77cc, 0x77ce, 0x77cf, 0x77d0, 0x77d1, 0x77d2, 0x77d3, 0x77d4, 0x77d5, 0x77d6, 0x77d8, 0x77d9, 0x77da, 0x77dd, 0x77de, 0x77df, 0x77e0, 0x77e1, 0x77e4, /* 0xb3 */ 0x77e6, 0x77e8, 0x77ea, 0x77ef, 0x77f0, 0x77f1, 0x77f2, 0x77f4, 0x77f5, 0x77f7, 0x77f9, 0x77fa, 0x77fb, 0x77fc, 0x7803, 0x7804, 0x7805, 0x7806, 0x7807, 0x7808, 0x780a, 0x780b, 0x780e, 0x780f, 0x7810, 0x7813, 0x7815, 0x7819, 0x781b, 0x781e, 0x7820, 0x7821, 0x7822, 0x7824, 0x7828, 0x782a, 0x782b, 0x782e, 0x782f, 0x7831, 0x7832, 0x7833, 0x7835, 0x7836, 0x783d, 0x783f, 0x7841, 0x7842, 0x7843, 0x7844, 0x7846, 0x7848, 0x7849, 0x784a, 0x784b, 0x784d, 0x784f, 0x7851, 0x7853, 0x7854, 0x7858, 0x7859, 0x785a, 0x785b, 0x785c, 0x785e, 0x785f, 0x7860, 0x7861, 0x7862, 0x7863, 0x7864, 0x7865, 0x7866, 0x7867, 0x7868, 0x7869, 0x786f, 0x7870, 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7878, 0x7879, 0x787a, 0x787b, 0x787d, 0x787e, 0x787f, 0x7880, 0x7881, 0x7882, 0x7883, /* 0xb4 */ 0x7884, 0x7885, 0x7886, 0x7888, 0x788a, 0x788b, 0x788f, 0x7890, 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789d, 0x789e, 0x78a0, 0x78a2, 0x78a4, 0x78a6, 0x78a8, 0x78a9, 0x78aa, 0x78ab, 0x78ac, 0x78ad, 0x78ae, 0x78af, 0x78b5, 0x78b6, 0x78b7, 0x78b8, 0x78ba, 0x78bb, 0x78bc, 0x78bd, 0x78bf, 0x78c0, 0x78c2, 0x78c3, 0x78c4, 0x78c6, 0x78c7, 0x78c8, 0x78cc, 0x78cd, 0x78ce, 0x78cf, 0x78d1, 0x78d2, 0x78d3, 0x78d6, 0x78d7, 0x78d8, 0x78da, 0x78db, 0x78dc, 0x78dd, 0x78de, 0x78df, 0x78e0, 0x78e1, 0x78e2, 0x78e3, 0x78e4, 0x78e5, 0x78e6, 0x78e7, 0x78e9, 0x78ea, 0x78eb, 0x78ed, 0x78ee, 0x78ef, 0x78f0, 0x78f1, 0x78f3, 0x78f5, 0x78f6, 0x78f8, 0x78f9, 0x78fb, 0x78fc, 0x78fd, 0x78fe, 0x78ff, 0x7900, 0x7902, 0x7903, 0x7904, 0x7906, 0x7907, 0x7908, 0x7909, 0x790a, 0x790b, 0x790c, /* 0xb5 */ 0x790d, 0x790e, 0x790f, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, 0x7916, 0x7917, 0x7918, 0x7919, 0x791a, 0x791b, 0x791c, 0x791d, 0x791f, 0x7920, 0x7921, 0x7922, 0x7923, 0x7925, 0x7926, 0x7927, 0x7928, 0x7929, 0x792a, 0x792b, 0x792c, 0x792d, 0x792e, 0x792f, 0x7930, 0x7931, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938, 0x7939, 0x793d, 0x793f, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947, 0x794a, 0x794b, 0x794c, 0x794d, 0x794e, 0x794f, 0x7950, 0x7951, 0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0x7964, 0x7966, 0x7969, 0x796a, 0x796b, 0x796c, 0x796e, 0x7970, 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797b, 0x797c, 0x797d, 0x797e, 0x797f, 0x7982, 0x7983, 0x7986, 0x7987, 0x7988, 0x7989, 0x798b, 0x798c, 0x798d, 0x798e, 0x7990, 0x7991, 0x7992, /* 0xb6 */ 0x7993, 0x7994, 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799b, 0x799c, 0x799d, 0x799e, 0x799f, 0x79a0, 0x79a1, 0x79a2, 0x79a3, 0x79a4, 0x79a5, 0x79a6, 0x79a8, 0x79a9, 0x79aa, 0x79ab, 0x79ac, 0x79ad, 0x79ae, 0x79af, 0x79b0, 0x79b1, 0x79b2, 0x79b4, 0x79b5, 0x79b6, 0x79b7, 0x79b8, 0x79bc, 0x79bf, 0x79c2, 0x79c4, 0x79c5, 0x79c7, 0x79c8, 0x79ca, 0x79cc, 0x79ce, 0x79cf, 0x79d0, 0x79d3, 0x79d4, 0x79d6, 0x79d7, 0x79d9, 0x79da, 0x79db, 0x79dc, 0x79dd, 0x79de, 0x79e0, 0x79e1, 0x79e2, 0x79e5, 0x79e8, 0x79ea, 0x79ec, 0x79ee, 0x79f1, 0x79f2, 0x79f3, 0x79f4, 0x79f5, 0x79f6, 0x79f7, 0x79f9, 0x79fa, 0x79fc, 0x79fe, 0x79ff, 0x7a01, 0x7a04, 0x7a05, 0x7a07, 0x7a08, 0x7a09, 0x7a0a, 0x7a0c, 0x7a0f, 0x7a10, 0x7a11, 0x7a12, 0x7a13, 0x7a15, 0x7a16, 0x7a18, 0x7a19, 0x7a1b, 0x7a1c, /* 0xb7 */ 0x7a1d, 0x7a1f, 0x7a21, 0x7a22, 0x7a24, 0x7a25, 0x7a26, 0x7a27, 0x7a28, 0x7a29, 0x7a2a, 0x7a2b, 0x7a2c, 0x7a2d, 0x7a2e, 0x7a2f, 0x7a30, 0x7a31, 0x7a32, 0x7a34, 0x7a35, 0x7a36, 0x7a38, 0x7a3a, 0x7a3e, 0x7a40, 0x7a41, 0x7a42, 0x7a43, 0x7a44, 0x7a45, 0x7a47, 0x7a48, 0x7a49, 0x7a4a, 0x7a4b, 0x7a4c, 0x7a4d, 0x7a4e, 0x7a4f, 0x7a50, 0x7a52, 0x7a53, 0x7a54, 0x7a55, 0x7a56, 0x7a58, 0x7a59, 0x7a5a, 0x7a5b, 0x7a5c, 0x7a5d, 0x7a5e, 0x7a5f, 0x7a60, 0x7a61, 0x7a62, 0x7a63, 0x7a64, 0x7a65, 0x7a66, 0x7a67, 0x7a68, 0x7a69, 0x7a6a, 0x7a6b, 0x7a6c, 0x7a6d, 0x7a6e, 0x7a6f, 0x7a71, 0x7a72, 0x7a73, 0x7a75, 0x7a7b, 0x7a7c, 0x7a7d, 0x7a7e, 0x7a82, 0x7a85, 0x7a87, 0x7a89, 0x7a8a, 0x7a8b, 0x7a8c, 0x7a8e, 0x7a8f, 0x7a90, 0x7a93, 0x7a94, 0x7a99, 0x7a9a, 0x7a9b, 0x7a9e, 0x7aa1, 0x7aa2, /* 0xb8 */ 0x7aa3, 0x7aa4, 0x7aa7, 0x7aa9, 0x7aaa, 0x7aab, 0x7aae, 0x7aaf, 0x7ab0, 0x7ab1, 0x7ab2, 0x7ab4, 0x7ab5, 0x7ab6, 0x7ab7, 0x7ab8, 0x7ab9, 0x7aba, 0x7abb, 0x7abc, 0x7abd, 0x7abe, 0x7ac0, 0x7ac1, 0x7ac2, 0x7ac3, 0x7ac4, 0x7ac5, 0x7ac6, 0x7ac7, 0x7ac8, 0x7ac9, 0x7aca, 0x7acc, 0x7acd, 0x7ace, 0x7acf, 0x7ad0, 0x7ad1, 0x7ad2, 0x7ad3, 0x7ad4, 0x7ad5, 0x7ad7, 0x7ad8, 0x7ada, 0x7adb, 0x7adc, 0x7add, 0x7ae1, 0x7ae2, 0x7ae4, 0x7ae7, 0x7ae8, 0x7ae9, 0x7aea, 0x7aeb, 0x7aec, 0x7aee, 0x7af0, 0x7af1, 0x7af2, 0x7af3, 0x7af4, 0x7af5, 0x7af6, 0x7af7, 0x7af8, 0x7afb, 0x7afc, 0x7afe, 0x7b00, 0x7b01, 0x7b02, 0x7b05, 0x7b07, 0x7b09, 0x7b0c, 0x7b0d, 0x7b0e, 0x7b10, 0x7b12, 0x7b13, 0x7b16, 0x7b17, 0x7b18, 0x7b1a, 0x7b1c, 0x7b1d, 0x7b1f, 0x7b21, 0x7b22, 0x7b23, 0x7b27, 0x7b29, 0x7b2d, /* 0xb9 */ 0x7b2f, 0x7b30, 0x7b32, 0x7b34, 0x7b35, 0x7b36, 0x7b37, 0x7b39, 0x7b3b, 0x7b3d, 0x7b3f, 0x7b40, 0x7b41, 0x7b42, 0x7b43, 0x7b44, 0x7b46, 0x7b48, 0x7b4a, 0x7b4d, 0x7b4e, 0x7b53, 0x7b55, 0x7b57, 0x7b59, 0x7b5c, 0x7b5e, 0x7b5f, 0x7b61, 0x7b63, 0x7b64, 0x7b65, 0x7b66, 0x7b67, 0x7b68, 0x7b69, 0x7b6a, 0x7b6b, 0x7b6c, 0x7b6d, 0x7b6f, 0x7b70, 0x7b73, 0x7b74, 0x7b76, 0x7b78, 0x7b7a, 0x7b7c, 0x7b7d, 0x7b7f, 0x7b81, 0x7b82, 0x7b83, 0x7b84, 0x7b86, 0x7b87, 0x7b88, 0x7b89, 0x7b8a, 0x7b8b, 0x7b8c, 0x7b8e, 0x7b8f, 0x7b91, 0x7b92, 0x7b93, 0x7b96, 0x7b98, 0x7b99, 0x7b9a, 0x7b9b, 0x7b9e, 0x7b9f, 0x7ba0, 0x7ba3, 0x7ba4, 0x7ba5, 0x7bae, 0x7baf, 0x7bb0, 0x7bb2, 0x7bb3, 0x7bb5, 0x7bb6, 0x7bb7, 0x7bb9, 0x7bba, 0x7bbb, 0x7bbc, 0x7bbd, 0x7bbe, 0x7bbf, 0x7bc0, 0x7bc2, 0x7bc3, 0x7bc4, /* 0xba */ 0x7bc5, 0x7bc8, 0x7bc9, 0x7bca, 0x7bcb, 0x7bcd, 0x7bce, 0x7bcf, 0x7bd0, 0x7bd2, 0x7bd4, 0x7bd5, 0x7bd6, 0x7bd7, 0x7bd8, 0x7bdb, 0x7bdc, 0x7bde, 0x7bdf, 0x7be0, 0x7be2, 0x7be3, 0x7be4, 0x7be7, 0x7be8, 0x7be9, 0x7beb, 0x7bec, 0x7bed, 0x7bef, 0x7bf0, 0x7bf2, 0x7bf3, 0x7bf4, 0x7bf5, 0x7bf6, 0x7bf8, 0x7bf9, 0x7bfa, 0x7bfb, 0x7bfd, 0x7bff, 0x7c00, 0x7c01, 0x7c02, 0x7c03, 0x7c04, 0x7c05, 0x7c06, 0x7c08, 0x7c09, 0x7c0a, 0x7c0d, 0x7c0e, 0x7c10, 0x7c11, 0x7c12, 0x7c13, 0x7c14, 0x7c15, 0x7c17, 0x7c18, 0x7c19, 0x7c1a, 0x7c1b, 0x7c1c, 0x7c1d, 0x7c1e, 0x7c20, 0x7c21, 0x7c22, 0x7c23, 0x7c24, 0x7c25, 0x7c28, 0x7c29, 0x7c2b, 0x7c2c, 0x7c2d, 0x7c2e, 0x7c2f, 0x7c30, 0x7c31, 0x7c32, 0x7c33, 0x7c34, 0x7c35, 0x7c36, 0x7c37, 0x7c39, 0x7c3a, 0x7c3b, 0x7c3c, 0x7c3d, 0x7c3e, 0x7c42, /* 0xbb */ 0x7c43, 0x7c44, 0x7c45, 0x7c46, 0x7c47, 0x7c48, 0x7c49, 0x7c4a, 0x7c4b, 0x7c4c, 0x7c4e, 0x7c4f, 0x7c50, 0x7c51, 0x7c52, 0x7c53, 0x7c54, 0x7c55, 0x7c56, 0x7c57, 0x7c58, 0x7c59, 0x7c5a, 0x7c5b, 0x7c5c, 0x7c5d, 0x7c5e, 0x7c5f, 0x7c60, 0x7c61, 0x7c62, 0x7c63, 0x7c64, 0x7c65, 0x7c66, 0x7c67, 0x7c68, 0x7c69, 0x7c6a, 0x7c6b, 0x7c6c, 0x7c6d, 0x7c6e, 0x7c6f, 0x7c70, 0x7c71, 0x7c72, 0x7c75, 0x7c76, 0x7c77, 0x7c78, 0x7c79, 0x7c7a, 0x7c7e, 0x7c7f, 0x7c80, 0x7c81, 0x7c82, 0x7c83, 0x7c84, 0x7c85, 0x7c86, 0x7c87, 0x7c88, 0x7c8a, 0x7c8b, 0x7c8c, 0x7c8d, 0x7c8e, 0x7c8f, 0x7c90, 0x7c93, 0x7c94, 0x7c96, 0x7c99, 0x7c9a, 0x7c9b, 0x7ca0, 0x7ca1, 0x7ca3, 0x7ca6, 0x7ca7, 0x7ca8, 0x7ca9, 0x7cab, 0x7cac, 0x7cad, 0x7caf, 0x7cb0, 0x7cb4, 0x7cb5, 0x7cb6, 0x7cb7, 0x7cb8, 0x7cba, 0x7cbb, /* 0xbc */ 0x7cbf, 0x7cc0, 0x7cc2, 0x7cc3, 0x7cc4, 0x7cc6, 0x7cc9, 0x7ccb, 0x7cce, 0x7ccf, 0x7cd0, 0x7cd1, 0x7cd2, 0x7cd3, 0x7cd4, 0x7cd8, 0x7cda, 0x7cdb, 0x7cdd, 0x7cde, 0x7ce1, 0x7ce2, 0x7ce3, 0x7ce4, 0x7ce5, 0x7ce6, 0x7ce7, 0x7ce9, 0x7cea, 0x7ceb, 0x7cec, 0x7ced, 0x7cee, 0x7cf0, 0x7cf1, 0x7cf2, 0x7cf3, 0x7cf4, 0x7cf5, 0x7cf6, 0x7cf7, 0x7cf9, 0x7cfa, 0x7cfc, 0x7cfd, 0x7cfe, 0x7cff, 0x7d00, 0x7d01, 0x7d02, 0x7d03, 0x7d04, 0x7d05, 0x7d06, 0x7d07, 0x7d08, 0x7d09, 0x7d0b, 0x7d0c, 0x7d0d, 0x7d0e, 0x7d0f, 0x7d10, 0x7d11, 0x7d12, 0x7d13, 0x7d14, 0x7d15, 0x7d16, 0x7d17, 0x7d18, 0x7d19, 0x7d1a, 0x7d1b, 0x7d1c, 0x7d1d, 0x7d1e, 0x7d1f, 0x7d21, 0x7d23, 0x7d24, 0x7d25, 0x7d26, 0x7d28, 0x7d29, 0x7d2a, 0x7d2c, 0x7d2d, 0x7d2e, 0x7d30, 0x7d31, 0x7d32, 0x7d33, 0x7d34, 0x7d35, 0x7d36, /* 0xbd */ 0x7d37, 0x7d38, 0x7d39, 0x7d3a, 0x7d3b, 0x7d3c, 0x7d3d, 0x7d3e, 0x7d3f, 0x7d40, 0x7d41, 0x7d42, 0x7d43, 0x7d44, 0x7d45, 0x7d46, 0x7d47, 0x7d48, 0x7d49, 0x7d4a, 0x7d4b, 0x7d4c, 0x7d4d, 0x7d4e, 0x7d4f, 0x7d50, 0x7d51, 0x7d52, 0x7d53, 0x7d54, 0x7d55, 0x7d56, 0x7d57, 0x7d58, 0x7d59, 0x7d5a, 0x7d5b, 0x7d5c, 0x7d5d, 0x7d5e, 0x7d5f, 0x7d60, 0x7d61, 0x7d62, 0x7d63, 0x7d64, 0x7d65, 0x7d66, 0x7d67, 0x7d68, 0x7d69, 0x7d6a, 0x7d6b, 0x7d6c, 0x7d6d, 0x7d6f, 0x7d70, 0x7d71, 0x7d72, 0x7d73, 0x7d74, 0x7d75, 0x7d76, 0x7d78, 0x7d79, 0x7d7a, 0x7d7b, 0x7d7c, 0x7d7d, 0x7d7e, 0x7d7f, 0x7d80, 0x7d81, 0x7d82, 0x7d83, 0x7d84, 0x7d85, 0x7d86, 0x7d87, 0x7d88, 0x7d89, 0x7d8a, 0x7d8b, 0x7d8c, 0x7d8d, 0x7d8e, 0x7d8f, 0x7d90, 0x7d91, 0x7d92, 0x7d93, 0x7d94, 0x7d95, 0x7d96, 0x7d97, 0x7d98, /* 0xbe */ 0x7d99, 0x7d9a, 0x7d9b, 0x7d9c, 0x7d9d, 0x7d9e, 0x7d9f, 0x7da0, 0x7da1, 0x7da2, 0x7da3, 0x7da4, 0x7da5, 0x7da7, 0x7da8, 0x7da9, 0x7daa, 0x7dab, 0x7dac, 0x7dad, 0x7daf, 0x7db0, 0x7db1, 0x7db2, 0x7db3, 0x7db4, 0x7db5, 0x7db6, 0x7db7, 0x7db8, 0x7db9, 0x7dba, 0x7dbb, 0x7dbc, 0x7dbd, 0x7dbe, 0x7dbf, 0x7dc0, 0x7dc1, 0x7dc2, 0x7dc3, 0x7dc4, 0x7dc5, 0x7dc6, 0x7dc7, 0x7dc8, 0x7dc9, 0x7dca, 0x7dcb, 0x7dcc, 0x7dcd, 0x7dce, 0x7dcf, 0x7dd0, 0x7dd1, 0x7dd2, 0x7dd3, 0x7dd4, 0x7dd5, 0x7dd6, 0x7dd7, 0x7dd8, 0x7dd9, 0x7dda, 0x7ddb, 0x7ddc, 0x7ddd, 0x7dde, 0x7ddf, 0x7de0, 0x7de1, 0x7de2, 0x7de3, 0x7de4, 0x7de5, 0x7de6, 0x7de7, 0x7de8, 0x7de9, 0x7dea, 0x7deb, 0x7dec, 0x7ded, 0x7dee, 0x7def, 0x7df0, 0x7df1, 0x7df2, 0x7df3, 0x7df4, 0x7df5, 0x7df6, 0x7df7, 0x7df8, 0x7df9, 0x7dfa, /* 0xbf */ 0x7dfb, 0x7dfc, 0x7dfd, 0x7dfe, 0x7dff, 0x7e00, 0x7e01, 0x7e02, 0x7e03, 0x7e04, 0x7e05, 0x7e06, 0x7e07, 0x7e08, 0x7e09, 0x7e0a, 0x7e0b, 0x7e0c, 0x7e0d, 0x7e0e, 0x7e0f, 0x7e10, 0x7e11, 0x7e12, 0x7e13, 0x7e14, 0x7e15, 0x7e16, 0x7e17, 0x7e18, 0x7e19, 0x7e1a, 0x7e1b, 0x7e1c, 0x7e1d, 0x7e1e, 0x7e1f, 0x7e20, 0x7e21, 0x7e22, 0x7e23, 0x7e24, 0x7e25, 0x7e26, 0x7e27, 0x7e28, 0x7e29, 0x7e2a, 0x7e2b, 0x7e2c, 0x7e2d, 0x7e2e, 0x7e2f, 0x7e30, 0x7e31, 0x7e32, 0x7e33, 0x7e34, 0x7e35, 0x7e36, 0x7e37, 0x7e38, 0x7e39, 0x7e3a, 0x7e3c, 0x7e3d, 0x7e3e, 0x7e3f, 0x7e40, 0x7e42, 0x7e43, 0x7e44, 0x7e45, 0x7e46, 0x7e48, 0x7e49, 0x7e4a, 0x7e4b, 0x7e4c, 0x7e4d, 0x7e4e, 0x7e4f, 0x7e50, 0x7e51, 0x7e52, 0x7e53, 0x7e54, 0x7e55, 0x7e56, 0x7e57, 0x7e58, 0x7e59, 0x7e5a, 0x7e5b, 0x7e5c, 0x7e5d, /* 0xc0 */ 0x7e5e, 0x7e5f, 0x7e60, 0x7e61, 0x7e62, 0x7e63, 0x7e64, 0x7e65, 0x7e66, 0x7e67, 0x7e68, 0x7e69, 0x7e6a, 0x7e6b, 0x7e6c, 0x7e6d, 0x7e6e, 0x7e6f, 0x7e70, 0x7e71, 0x7e72, 0x7e73, 0x7e74, 0x7e75, 0x7e76, 0x7e77, 0x7e78, 0x7e79, 0x7e7a, 0x7e7b, 0x7e7c, 0x7e7d, 0x7e7e, 0x7e7f, 0x7e80, 0x7e81, 0x7e83, 0x7e84, 0x7e85, 0x7e86, 0x7e87, 0x7e88, 0x7e89, 0x7e8a, 0x7e8b, 0x7e8c, 0x7e8d, 0x7e8e, 0x7e8f, 0x7e90, 0x7e91, 0x7e92, 0x7e93, 0x7e94, 0x7e95, 0x7e96, 0x7e97, 0x7e98, 0x7e99, 0x7e9a, 0x7e9c, 0x7e9d, 0x7e9e, 0x7eae, 0x7eb4, 0x7ebb, 0x7ebc, 0x7ed6, 0x7ee4, 0x7eec, 0x7ef9, 0x7f0a, 0x7f10, 0x7f1e, 0x7f37, 0x7f39, 0x7f3b, 0x7f3c, 0x7f3d, 0x7f3e, 0x7f3f, 0x7f40, 0x7f41, 0x7f43, 0x7f46, 0x7f47, 0x7f48, 0x7f49, 0x7f4a, 0x7f4b, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f4f, 0x7f52, 0x7f53, /* 0xc1 */ 0x7f56, 0x7f59, 0x7f5b, 0x7f5c, 0x7f5d, 0x7f5e, 0x7f60, 0x7f63, 0x7f64, 0x7f65, 0x7f66, 0x7f67, 0x7f6b, 0x7f6c, 0x7f6d, 0x7f6f, 0x7f70, 0x7f73, 0x7f75, 0x7f76, 0x7f77, 0x7f78, 0x7f7a, 0x7f7b, 0x7f7c, 0x7f7d, 0x7f7f, 0x7f80, 0x7f82, 0x7f83, 0x7f84, 0x7f85, 0x7f86, 0x7f87, 0x7f88, 0x7f89, 0x7f8b, 0x7f8d, 0x7f8f, 0x7f90, 0x7f91, 0x7f92, 0x7f93, 0x7f95, 0x7f96, 0x7f97, 0x7f98, 0x7f99, 0x7f9b, 0x7f9c, 0x7fa0, 0x7fa2, 0x7fa3, 0x7fa5, 0x7fa6, 0x7fa8, 0x7fa9, 0x7faa, 0x7fab, 0x7fac, 0x7fad, 0x7fae, 0x7fb1, 0x7fb3, 0x7fb4, 0x7fb5, 0x7fb6, 0x7fb7, 0x7fba, 0x7fbb, 0x7fbe, 0x7fc0, 0x7fc2, 0x7fc3, 0x7fc4, 0x7fc6, 0x7fc7, 0x7fc8, 0x7fc9, 0x7fcb, 0x7fcd, 0x7fcf, 0x7fd0, 0x7fd1, 0x7fd2, 0x7fd3, 0x7fd6, 0x7fd7, 0x7fd9, 0x7fda, 0x7fdb, 0x7fdc, 0x7fdd, 0x7fde, 0x7fe2, 0x7fe3, /* 0xc2 */ 0x7fe4, 0x7fe7, 0x7fe8, 0x7fea, 0x7feb, 0x7fec, 0x7fed, 0x7fef, 0x7ff2, 0x7ff4, 0x7ff5, 0x7ff6, 0x7ff7, 0x7ff8, 0x7ff9, 0x7ffa, 0x7ffd, 0x7ffe, 0x7fff, 0x8002, 0x8007, 0x8008, 0x8009, 0x800a, 0x800e, 0x800f, 0x8011, 0x8013, 0x801a, 0x801b, 0x801d, 0x801e, 0x801f, 0x8021, 0x8023, 0x8024, 0x802b, 0x802c, 0x802d, 0x802e, 0x802f, 0x8030, 0x8032, 0x8034, 0x8039, 0x803a, 0x803c, 0x803e, 0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049, 0x804e, 0x804f, 0x8050, 0x8051, 0x8053, 0x8055, 0x8056, 0x8057, 0x8059, 0x805b, 0x805c, 0x805d, 0x805e, 0x805f, 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806b, 0x806c, 0x806d, 0x806e, 0x806f, 0x8070, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077, 0x8078, 0x8079, 0x807a, 0x807b, 0x807c, 0x807d, /* 0xc3 */ 0x807e, 0x8081, 0x8082, 0x8085, 0x8088, 0x808a, 0x808d, 0x808e, 0x808f, 0x8090, 0x8091, 0x8092, 0x8094, 0x8095, 0x8097, 0x8099, 0x809e, 0x80a3, 0x80a6, 0x80a7, 0x80a8, 0x80ac, 0x80b0, 0x80b3, 0x80b5, 0x80b6, 0x80b8, 0x80b9, 0x80bb, 0x80c5, 0x80c7, 0x80c8, 0x80c9, 0x80ca, 0x80cb, 0x80cf, 0x80d0, 0x80d1, 0x80d2, 0x80d3, 0x80d4, 0x80d5, 0x80d8, 0x80df, 0x80e0, 0x80e2, 0x80e3, 0x80e6, 0x80ee, 0x80f5, 0x80f7, 0x80f9, 0x80fb, 0x80fe, 0x80ff, 0x8100, 0x8101, 0x8103, 0x8104, 0x8105, 0x8107, 0x8108, 0x810b, 0x810c, 0x8115, 0x8117, 0x8119, 0x811b, 0x811c, 0x811d, 0x811f, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, 0x8127, 0x8128, 0x8129, 0x812a, 0x812b, 0x812d, 0x812e, 0x8130, 0x8133, 0x8134, 0x8135, 0x8137, 0x8139, 0x813a, 0x813b, 0x813c, 0x813d, 0x813f, /* 0xc4 */ 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147, 0x8149, 0x814d, 0x814e, 0x814f, 0x8152, 0x8156, 0x8157, 0x8158, 0x815b, 0x815c, 0x815d, 0x815e, 0x815f, 0x8161, 0x8162, 0x8163, 0x8164, 0x8166, 0x8168, 0x816a, 0x816b, 0x816c, 0x816f, 0x8172, 0x8173, 0x8175, 0x8176, 0x8177, 0x8178, 0x8181, 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8189, 0x818b, 0x818c, 0x818d, 0x818e, 0x8190, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8199, 0x819a, 0x819e, 0x819f, 0x81a0, 0x81a1, 0x81a2, 0x81a4, 0x81a5, 0x81a7, 0x81a9, 0x81ab, 0x81ac, 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1, 0x81b2, 0x81b4, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0x81bc, 0x81bd, 0x81be, 0x81bf, 0x81c4, 0x81c5, 0x81c7, 0x81c8, 0x81c9, 0x81cb, 0x81cd, 0x81ce, 0x81cf, 0x81d0, 0x81d1, 0x81d2, 0x81d3, /* 0xc5 */ 0x81d4, 0x81d5, 0x81d6, 0x81d7, 0x81d8, 0x81d9, 0x81da, 0x81db, 0x81dc, 0x81dd, 0x81de, 0x81df, 0x81e0, 0x81e1, 0x81e2, 0x81e4, 0x81e5, 0x81e6, 0x81e8, 0x81e9, 0x81eb, 0x81ee, 0x81ef, 0x81f0, 0x81f1, 0x81f2, 0x81f5, 0x81f6, 0x81f7, 0x81f8, 0x81f9, 0x81fa, 0x81fd, 0x81ff, 0x8203, 0x8207, 0x8208, 0x8209, 0x820a, 0x820b, 0x820e, 0x820f, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218, 0x8219, 0x821a, 0x821d, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227, 0x8229, 0x822e, 0x8232, 0x823a, 0x823c, 0x823d, 0x823f, 0x8240, 0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824a, 0x824c, 0x824d, 0x824e, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8259, 0x825b, 0x825c, 0x825d, 0x825e, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8269, /* 0xc6 */ 0x826a, 0x826b, 0x826c, 0x826d, 0x8271, 0x8275, 0x8276, 0x8277, 0x8278, 0x827b, 0x827c, 0x8280, 0x8281, 0x8283, 0x8285, 0x8286, 0x8287, 0x8289, 0x828c, 0x8290, 0x8293, 0x8294, 0x8295, 0x8296, 0x829a, 0x829b, 0x829e, 0x82a0, 0x82a2, 0x82a3, 0x82a7, 0x82b2, 0x82b5, 0x82b6, 0x82ba, 0x82bb, 0x82bc, 0x82bf, 0x82c0, 0x82c2, 0x82c3, 0x82c5, 0x82c6, 0x82c9, 0x82d0, 0x82d6, 0x82d9, 0x82da, 0x82dd, 0x82e2, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82ec, 0x82ed, 0x82ee, 0x82f0, 0x82f2, 0x82f3, 0x82f5, 0x82f6, 0x82f8, 0x82fa, 0x82fc, 0x82fd, 0x82fe, 0x82ff, 0x8300, 0x830a, 0x830b, 0x830d, 0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, 0x831d, 0x831e, 0x831f, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8329, 0x832a, 0x832e, 0x8330, 0x8332, 0x8337, 0x833b, 0x833d, /* 0xc7 */ 0x833e, 0x833f, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834a, 0x834b, 0x834c, 0x834d, 0x834e, 0x8353, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835d, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8379, 0x837a, 0x837e, 0x837f, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838a, 0x838b, 0x838c, 0x838d, 0x838f, 0x8390, 0x8391, 0x8394, 0x8395, 0x8396, 0x8397, 0x8399, 0x839a, 0x839d, 0x839f, 0x83a1, 0x83a2, 0x83a3, 0x83a4, 0x83a5, 0x83a6, 0x83a7, 0x83ac, 0x83ad, 0x83ae, 0x83af, 0x83b5, 0x83bb, 0x83be, 0x83bf, 0x83c2, 0x83c3, 0x83c4, 0x83c6, 0x83c8, 0x83c9, 0x83cb, 0x83cd, 0x83ce, 0x83d0, 0x83d1, 0x83d2, 0x83d3, 0x83d5, 0x83d7, 0x83d9, 0x83da, 0x83db, 0x83de, 0x83e2, 0x83e3, 0x83e4, 0x83e6, 0x83e7, 0x83e8, 0x83eb, 0x83ec, 0x83ed, /* 0xc8 */ 0x83ee, 0x83ef, 0x83f3, 0x83f4, 0x83f5, 0x83f6, 0x83f7, 0x83fa, 0x83fb, 0x83fc, 0x83fe, 0x83ff, 0x8400, 0x8402, 0x8405, 0x8407, 0x8408, 0x8409, 0x840a, 0x8410, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, 0x8417, 0x8419, 0x841a, 0x841b, 0x841e, 0x841f, 0x8420, 0x8421, 0x8422, 0x8423, 0x8429, 0x842a, 0x842b, 0x842c, 0x842d, 0x842e, 0x842f, 0x8430, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436, 0x8437, 0x8439, 0x843a, 0x843b, 0x843e, 0x843f, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x8449, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, 0x8450, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8458, 0x845d, 0x845e, 0x845f, 0x8460, 0x8462, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x846a, 0x846e, 0x846f, 0x8470, 0x8472, 0x8474, 0x8477, 0x8479, 0x847b, 0x847c, /* 0xc9 */ 0x847d, 0x847e, 0x847f, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485, 0x8486, 0x848a, 0x848d, 0x848f, 0x8490, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8498, 0x849a, 0x849b, 0x849d, 0x849e, 0x849f, 0x84a0, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7, 0x84a8, 0x84a9, 0x84aa, 0x84ab, 0x84ac, 0x84ad, 0x84ae, 0x84b0, 0x84b1, 0x84b3, 0x84b5, 0x84b6, 0x84b7, 0x84bb, 0x84bc, 0x84be, 0x84c0, 0x84c2, 0x84c3, 0x84c5, 0x84c6, 0x84c7, 0x84c8, 0x84cb, 0x84cc, 0x84ce, 0x84cf, 0x84d2, 0x84d4, 0x84d5, 0x84d7, 0x84d8, 0x84d9, 0x84da, 0x84db, 0x84dc, 0x84de, 0x84e1, 0x84e2, 0x84e4, 0x84e7, 0x84e8, 0x84e9, 0x84ea, 0x84eb, 0x84ed, 0x84ee, 0x84ef, 0x84f1, 0x84f2, 0x84f3, 0x84f4, 0x84f5, 0x84f6, 0x84f7, 0x84f8, 0x84f9, 0x84fa, 0x84fb, 0x84fd, 0x84fe, 0x8500, 0x8501, 0x8502, /* 0xca */ 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, 0x8508, 0x8509, 0x850a, 0x850b, 0x850d, 0x850e, 0x850f, 0x8510, 0x8512, 0x8514, 0x8515, 0x8516, 0x8518, 0x8519, 0x851b, 0x851c, 0x851d, 0x851e, 0x8520, 0x8522, 0x8523, 0x8524, 0x8525, 0x8526, 0x8527, 0x8528, 0x8529, 0x852a, 0x852d, 0x852e, 0x852f, 0x8530, 0x8531, 0x8532, 0x8533, 0x8534, 0x8535, 0x8536, 0x853e, 0x853f, 0x8540, 0x8541, 0x8542, 0x8544, 0x8545, 0x8546, 0x8547, 0x854b, 0x854c, 0x854d, 0x854e, 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8557, 0x8558, 0x855a, 0x855b, 0x855c, 0x855d, 0x855f, 0x8560, 0x8561, 0x8562, 0x8563, 0x8565, 0x8566, 0x8567, 0x8569, 0x856a, 0x856b, 0x856c, 0x856d, 0x856e, 0x856f, 0x8570, 0x8571, 0x8573, 0x8575, 0x8576, 0x8577, 0x8578, 0x857c, 0x857d, 0x857f, 0x8580, 0x8581, /* 0xcb */ 0x8582, 0x8583, 0x8586, 0x8588, 0x8589, 0x858a, 0x858b, 0x858c, 0x858d, 0x858e, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859a, 0x859d, 0x859e, 0x859f, 0x85a0, 0x85a1, 0x85a2, 0x85a3, 0x85a5, 0x85a6, 0x85a7, 0x85a9, 0x85ab, 0x85ac, 0x85ad, 0x85b1, 0x85b2, 0x85b3, 0x85b4, 0x85b5, 0x85b6, 0x85b8, 0x85ba, 0x85bb, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c0, 0x85c2, 0x85c3, 0x85c4, 0x85c5, 0x85c6, 0x85c7, 0x85c8, 0x85ca, 0x85cb, 0x85cc, 0x85cd, 0x85ce, 0x85d1, 0x85d2, 0x85d4, 0x85d6, 0x85d7, 0x85d8, 0x85d9, 0x85da, 0x85db, 0x85dd, 0x85de, 0x85df, 0x85e0, 0x85e1, 0x85e2, 0x85e3, 0x85e5, 0x85e6, 0x85e7, 0x85e8, 0x85ea, 0x85eb, 0x85ec, 0x85ed, 0x85ee, 0x85ef, 0x85f0, 0x85f1, 0x85f2, 0x85f3, 0x85f4, 0x85f5, 0x85f6, 0x85f7, 0x85f8, /* 0xcc */ 0x85f9, 0x85fa, 0x85fc, 0x85fd, 0x85fe, 0x8600, 0x8601, 0x8602, 0x8603, 0x8604, 0x8606, 0x8607, 0x8608, 0x8609, 0x860a, 0x860b, 0x860c, 0x860d, 0x860e, 0x860f, 0x8610, 0x8612, 0x8613, 0x8614, 0x8615, 0x8617, 0x8618, 0x8619, 0x861a, 0x861b, 0x861c, 0x861d, 0x861e, 0x861f, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, 0x8626, 0x8628, 0x862a, 0x862b, 0x862c, 0x862d, 0x862e, 0x862f, 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8639, 0x863a, 0x863b, 0x863d, 0x863e, 0x863f, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, 0x864a, 0x864b, 0x864c, 0x8652, 0x8653, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865b, 0x865c, 0x865d, 0x865f, 0x8660, 0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866a, /* 0xcd */ 0x866d, 0x866f, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689, 0x868e, 0x868f, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696, 0x8697, 0x8698, 0x8699, 0x869a, 0x869b, 0x869e, 0x869f, 0x86a0, 0x86a1, 0x86a2, 0x86a5, 0x86a6, 0x86ab, 0x86ad, 0x86ae, 0x86b2, 0x86b3, 0x86b7, 0x86b8, 0x86b9, 0x86bb, 0x86bc, 0x86bd, 0x86be, 0x86bf, 0x86c1, 0x86c2, 0x86c3, 0x86c5, 0x86c8, 0x86cc, 0x86cd, 0x86d2, 0x86d3, 0x86d5, 0x86d6, 0x86d7, 0x86da, 0x86dc, 0x86dd, 0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e5, 0x86e6, 0x86e7, 0x86e8, 0x86ea, 0x86eb, 0x86ec, 0x86ef, 0x86f5, 0x86f6, 0x86f7, 0x86fa, 0x86fb, 0x86fc, 0x86fd, 0x86ff, 0x8701, 0x8704, 0x8705, 0x8706, 0x870b, 0x870c, 0x870e, 0x870f, 0x8710, 0x8711, 0x8714, 0x8716, /* 0xce */ 0x8719, 0x871b, 0x871d, 0x871f, 0x8720, 0x8724, 0x8726, 0x8727, 0x8728, 0x872a, 0x872b, 0x872c, 0x872d, 0x872f, 0x8730, 0x8732, 0x8733, 0x8735, 0x8736, 0x8738, 0x8739, 0x873a, 0x873c, 0x873d, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874a, 0x874b, 0x874d, 0x874f, 0x8750, 0x8751, 0x8752, 0x8754, 0x8755, 0x8756, 0x8758, 0x875a, 0x875b, 0x875c, 0x875d, 0x875e, 0x875f, 0x8761, 0x8762, 0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b, 0x876c, 0x876d, 0x876f, 0x8771, 0x8772, 0x8773, 0x8775, 0x8777, 0x8778, 0x8779, 0x877a, 0x877f, 0x8780, 0x8781, 0x8784, 0x8786, 0x8787, 0x8789, 0x878a, 0x878c, 0x878e, 0x878f, 0x8790, 0x8791, 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799, 0x879a, 0x879b, 0x879c, 0x879d, 0x879e, 0x87a0, 0x87a1, 0x87a2, 0x87a3, 0x87a4, /* 0xcf */ 0x87a5, 0x87a6, 0x87a7, 0x87a9, 0x87aa, 0x87ae, 0x87b0, 0x87b1, 0x87b2, 0x87b4, 0x87b6, 0x87b7, 0x87b8, 0x87b9, 0x87bb, 0x87bc, 0x87be, 0x87bf, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c7, 0x87c8, 0x87c9, 0x87cc, 0x87cd, 0x87ce, 0x87cf, 0x87d0, 0x87d4, 0x87d5, 0x87d6, 0x87d7, 0x87d8, 0x87d9, 0x87da, 0x87dc, 0x87dd, 0x87de, 0x87df, 0x87e1, 0x87e2, 0x87e3, 0x87e4, 0x87e6, 0x87e7, 0x87e8, 0x87e9, 0x87eb, 0x87ec, 0x87ed, 0x87ef, 0x87f0, 0x87f1, 0x87f2, 0x87f3, 0x87f4, 0x87f5, 0x87f6, 0x87f7, 0x87f8, 0x87fa, 0x87fb, 0x87fc, 0x87fd, 0x87ff, 0x8800, 0x8801, 0x8802, 0x8804, 0x8805, 0x8806, 0x8807, 0x8808, 0x8809, 0x880b, 0x880c, 0x880d, 0x880e, 0x880f, 0x8810, 0x8811, 0x8812, 0x8814, 0x8817, 0x8818, 0x8819, 0x881a, 0x881c, 0x881d, 0x881e, 0x881f, 0x8820, 0x8823, /* 0xd0 */ 0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882a, 0x882b, 0x882c, 0x882d, 0x882e, 0x882f, 0x8830, 0x8831, 0x8833, 0x8834, 0x8835, 0x8836, 0x8837, 0x8838, 0x883a, 0x883b, 0x883d, 0x883e, 0x883f, 0x8841, 0x8842, 0x8843, 0x8846, 0x8847, 0x8848, 0x8849, 0x884a, 0x884b, 0x884e, 0x884f, 0x8850, 0x8851, 0x8852, 0x8853, 0x8855, 0x8856, 0x8858, 0x885a, 0x885b, 0x885c, 0x885d, 0x885e, 0x885f, 0x8860, 0x8866, 0x8867, 0x886a, 0x886d, 0x886f, 0x8871, 0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x8879, 0x887a, 0x887b, 0x887c, 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888a, 0x888c, 0x888e, 0x888f, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, 0x8897, 0x8898, 0x8899, 0x889a, 0x889b, 0x889d, 0x889e, 0x889f, 0x88a0, 0x88a1, 0x88a3, 0x88a5, 0x88a6, 0x88a7, 0x88a8, 0x88a9, 0x88aa, /* 0xd1 */ 0x88ac, 0x88ae, 0x88af, 0x88b0, 0x88b2, 0x88b3, 0x88b4, 0x88b5, 0x88b6, 0x88b8, 0x88b9, 0x88ba, 0x88bb, 0x88bd, 0x88be, 0x88bf, 0x88c0, 0x88c3, 0x88c4, 0x88c7, 0x88c8, 0x88ca, 0x88cb, 0x88cc, 0x88cd, 0x88cf, 0x88d0, 0x88d1, 0x88d3, 0x88d6, 0x88d7, 0x88da, 0x88db, 0x88dc, 0x88dd, 0x88de, 0x88e0, 0x88e1, 0x88e6, 0x88e7, 0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f2, 0x88f5, 0x88f6, 0x88f7, 0x88fa, 0x88fb, 0x88fd, 0x88ff, 0x8900, 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, 0x8908, 0x8909, 0x890b, 0x890c, 0x890d, 0x890e, 0x890f, 0x8911, 0x8914, 0x8915, 0x8916, 0x8917, 0x8918, 0x891c, 0x891d, 0x891e, 0x891f, 0x8920, 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929, 0x892c, 0x892d, 0x892e, 0x892f, 0x8931, 0x8932, 0x8933, 0x8935, 0x8937, /* 0xd2 */ 0x8938, 0x8939, 0x893a, 0x893b, 0x893c, 0x893d, 0x893e, 0x893f, 0x8940, 0x8942, 0x8943, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, 0x894a, 0x894b, 0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0x895a, 0x895b, 0x895c, 0x895d, 0x8960, 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, 0x8967, 0x8968, 0x8969, 0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897a, 0x897c, 0x897d, 0x897e, 0x8980, 0x8982, 0x8984, 0x8985, 0x8987, 0x8988, 0x8989, 0x898a, 0x898b, 0x898c, 0x898d, 0x898e, 0x898f, 0x8990, 0x8991, 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899a, 0x899b, 0x899c, 0x899d, 0x899e, 0x899f, 0x89a0, 0x89a1, /* 0xd3 */ 0x89a2, 0x89a3, 0x89a4, 0x89a5, 0x89a6, 0x89a7, 0x89a8, 0x89a9, 0x89aa, 0x89ab, 0x89ac, 0x89ad, 0x89ae, 0x89af, 0x89b0, 0x89b1, 0x89b2, 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89b8, 0x89b9, 0x89ba, 0x89bb, 0x89bc, 0x89bd, 0x89be, 0x89bf, 0x89c0, 0x89c3, 0x89cd, 0x89d3, 0x89d4, 0x89d5, 0x89d7, 0x89d8, 0x89d9, 0x89db, 0x89dd, 0x89df, 0x89e0, 0x89e1, 0x89e2, 0x89e4, 0x89e7, 0x89e8, 0x89e9, 0x89ea, 0x89ec, 0x89ed, 0x89ee, 0x89f0, 0x89f1, 0x89f2, 0x89f4, 0x89f5, 0x89f6, 0x89f7, 0x89f8, 0x89f9, 0x89fa, 0x89fb, 0x89fc, 0x89fd, 0x89fe, 0x89ff, 0x8a01, 0x8a02, 0x8a03, 0x8a04, 0x8a05, 0x8a06, 0x8a08, 0x8a09, 0x8a0a, 0x8a0b, 0x8a0c, 0x8a0d, 0x8a0e, 0x8a0f, 0x8a10, 0x8a11, 0x8a12, 0x8a13, 0x8a14, 0x8a15, 0x8a16, 0x8a17, 0x8a18, 0x8a19, 0x8a1a, 0x8a1b, 0x8a1c, 0x8a1d, /* 0xd4 */ 0x8a1e, 0x8a1f, 0x8a20, 0x8a21, 0x8a22, 0x8a23, 0x8a24, 0x8a25, 0x8a26, 0x8a27, 0x8a28, 0x8a29, 0x8a2a, 0x8a2b, 0x8a2c, 0x8a2d, 0x8a2e, 0x8a2f, 0x8a30, 0x8a31, 0x8a32, 0x8a33, 0x8a34, 0x8a35, 0x8a36, 0x8a37, 0x8a38, 0x8a39, 0x8a3a, 0x8a3b, 0x8a3c, 0x8a3d, 0x8a3f, 0x8a40, 0x8a41, 0x8a42, 0x8a43, 0x8a44, 0x8a45, 0x8a46, 0x8a47, 0x8a49, 0x8a4a, 0x8a4b, 0x8a4c, 0x8a4d, 0x8a4e, 0x8a4f, 0x8a50, 0x8a51, 0x8a52, 0x8a53, 0x8a54, 0x8a55, 0x8a56, 0x8a57, 0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d, 0x8a5e, 0x8a5f, 0x8a60, 0x8a61, 0x8a62, 0x8a63, 0x8a64, 0x8a65, 0x8a66, 0x8a67, 0x8a68, 0x8a69, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, 0x8a70, 0x8a71, 0x8a72, 0x8a73, 0x8a74, 0x8a75, 0x8a76, 0x8a77, 0x8a78, 0x8a7a, 0x8a7b, 0x8a7c, 0x8a7d, 0x8a7e, 0x8a7f, 0x8a80, /* 0xd5 */ 0x8a81, 0x8a82, 0x8a83, 0x8a84, 0x8a85, 0x8a86, 0x8a87, 0x8a88, 0x8a8b, 0x8a8c, 0x8a8d, 0x8a8e, 0x8a8f, 0x8a90, 0x8a91, 0x8a92, 0x8a94, 0x8a95, 0x8a96, 0x8a97, 0x8a98, 0x8a99, 0x8a9a, 0x8a9b, 0x8a9c, 0x8a9d, 0x8a9e, 0x8a9f, 0x8aa0, 0x8aa1, 0x8aa2, 0x8aa3, 0x8aa4, 0x8aa5, 0x8aa6, 0x8aa7, 0x8aa8, 0x8aa9, 0x8aaa, 0x8aab, 0x8aac, 0x8aad, 0x8aae, 0x8aaf, 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3, 0x8ab4, 0x8ab5, 0x8ab6, 0x8ab7, 0x8ab8, 0x8ab9, 0x8aba, 0x8abb, 0x8abc, 0x8abd, 0x8abe, 0x8abf, 0x8ac0, 0x8ac1, 0x8ac2, 0x8ac3, 0x8ac4, 0x8ac5, 0x8ac6, 0x8ac7, 0x8ac8, 0x8ac9, 0x8aca, 0x8acb, 0x8acc, 0x8acd, 0x8ace, 0x8acf, 0x8ad0, 0x8ad1, 0x8ad2, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad6, 0x8ad7, 0x8ad8, 0x8ad9, 0x8ada, 0x8adb, 0x8adc, 0x8add, 0x8ade, 0x8adf, 0x8ae0, 0x8ae1, 0x8ae2, 0x8ae3, /* 0xd6 */ 0x8ae4, 0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8, 0x8ae9, 0x8aea, 0x8aeb, 0x8aec, 0x8aed, 0x8aee, 0x8aef, 0x8af0, 0x8af1, 0x8af2, 0x8af3, 0x8af4, 0x8af5, 0x8af6, 0x8af7, 0x8af8, 0x8af9, 0x8afa, 0x8afb, 0x8afc, 0x8afd, 0x8afe, 0x8aff, 0x8b00, 0x8b01, 0x8b02, 0x8b03, 0x8b04, 0x8b05, 0x8b06, 0x8b08, 0x8b09, 0x8b0a, 0x8b0b, 0x8b0c, 0x8b0d, 0x8b0e, 0x8b0f, 0x8b10, 0x8b11, 0x8b12, 0x8b13, 0x8b14, 0x8b15, 0x8b16, 0x8b17, 0x8b18, 0x8b19, 0x8b1a, 0x8b1b, 0x8b1c, 0x8b1d, 0x8b1e, 0x8b1f, 0x8b20, 0x8b21, 0x8b22, 0x8b23, 0x8b24, 0x8b25, 0x8b27, 0x8b28, 0x8b29, 0x8b2a, 0x8b2b, 0x8b2c, 0x8b2d, 0x8b2e, 0x8b2f, 0x8b30, 0x8b31, 0x8b32, 0x8b33, 0x8b34, 0x8b35, 0x8b36, 0x8b37, 0x8b38, 0x8b39, 0x8b3a, 0x8b3b, 0x8b3c, 0x8b3d, 0x8b3e, 0x8b3f, 0x8b40, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0x8b45, /* 0xd7 */ 0x8b46, 0x8b47, 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, 0x8b4c, 0x8b4d, 0x8b4e, 0x8b4f, 0x8b50, 0x8b51, 0x8b52, 0x8b53, 0x8b54, 0x8b55, 0x8b56, 0x8b57, 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d, 0x8b5e, 0x8b5f, 0x8b60, 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65, 0x8b67, 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6d, 0x8b6e, 0x8b6f, 0x8b70, 0x8b71, 0x8b72, 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77, 0x8b78, 0x8b79, 0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d, 0x8b7e, 0x8b7f, 0x8b80, 0x8b81, 0x8b82, 0x8b83, 0x8b84, 0x8b85, 0x8b86, 0x8b87, 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0x8b8d, 0x8b8e, 0x8b8f, 0x8b90, 0x8b91, 0x8b92, 0x8b93, 0x8b94, 0x8b95, 0x8b96, 0x8b97, 0x8b98, 0x8b99, 0x8b9a, 0x8b9b, 0x8b9c, 0x8b9d, 0x8b9e, 0x8b9f, 0x8bac, 0x8bb1, 0x8bbb, 0x8bc7, 0x8bd0, 0x8bea, 0x8c09, 0x8c1e, /* 0xd8 */ 0x8c38, 0x8c39, 0x8c3a, 0x8c3b, 0x8c3c, 0x8c3d, 0x8c3e, 0x8c3f, 0x8c40, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c48, 0x8c4a, 0x8c4b, 0x8c4d, 0x8c4e, 0x8c4f, 0x8c50, 0x8c51, 0x8c52, 0x8c53, 0x8c54, 0x8c56, 0x8c57, 0x8c58, 0x8c59, 0x8c5b, 0x8c5c, 0x8c5d, 0x8c5e, 0x8c5f, 0x8c60, 0x8c63, 0x8c64, 0x8c65, 0x8c66, 0x8c67, 0x8c68, 0x8c69, 0x8c6c, 0x8c6d, 0x8c6e, 0x8c6f, 0x8c70, 0x8c71, 0x8c72, 0x8c74, 0x8c75, 0x8c76, 0x8c77, 0x8c7b, 0x8c7c, 0x8c7d, 0x8c7e, 0x8c7f, 0x8c80, 0x8c81, 0x8c83, 0x8c84, 0x8c86, 0x8c87, 0x8c88, 0x8c8b, 0x8c8d, 0x8c8e, 0x8c8f, 0x8c90, 0x8c91, 0x8c92, 0x8c93, 0x8c95, 0x8c96, 0x8c97, 0x8c99, 0x8c9a, 0x8c9b, 0x8c9c, 0x8c9d, 0x8c9e, 0x8c9f, 0x8ca0, 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4, 0x8ca5, 0x8ca6, 0x8ca7, 0x8ca8, 0x8ca9, 0x8caa, 0x8cab, 0x8cac, 0x8cad, /* 0xd9 */ 0x8cae, 0x8caf, 0x8cb0, 0x8cb1, 0x8cb2, 0x8cb3, 0x8cb4, 0x8cb5, 0x8cb6, 0x8cb7, 0x8cb8, 0x8cb9, 0x8cba, 0x8cbb, 0x8cbc, 0x8cbd, 0x8cbe, 0x8cbf, 0x8cc0, 0x8cc1, 0x8cc2, 0x8cc3, 0x8cc4, 0x8cc5, 0x8cc6, 0x8cc7, 0x8cc8, 0x8cc9, 0x8cca, 0x8ccb, 0x8ccc, 0x8ccd, 0x8cce, 0x8ccf, 0x8cd0, 0x8cd1, 0x8cd2, 0x8cd3, 0x8cd4, 0x8cd5, 0x8cd6, 0x8cd7, 0x8cd8, 0x8cd9, 0x8cda, 0x8cdb, 0x8cdc, 0x8cdd, 0x8cde, 0x8cdf, 0x8ce0, 0x8ce1, 0x8ce2, 0x8ce3, 0x8ce4, 0x8ce5, 0x8ce6, 0x8ce7, 0x8ce8, 0x8ce9, 0x8cea, 0x8ceb, 0x8cec, 0x8ced, 0x8cee, 0x8cef, 0x8cf0, 0x8cf1, 0x8cf2, 0x8cf3, 0x8cf4, 0x8cf5, 0x8cf6, 0x8cf7, 0x8cf8, 0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd, 0x8cfe, 0x8cff, 0x8d00, 0x8d01, 0x8d02, 0x8d03, 0x8d04, 0x8d05, 0x8d06, 0x8d07, 0x8d08, 0x8d09, 0x8d0a, 0x8d0b, 0x8d0c, 0x8d0d, /* 0xda */ 0x8d0e, 0x8d0f, 0x8d10, 0x8d11, 0x8d12, 0x8d13, 0x8d14, 0x8d15, 0x8d16, 0x8d17, 0x8d18, 0x8d19, 0x8d1a, 0x8d1b, 0x8d1c, 0x8d20, 0x8d51, 0x8d52, 0x8d57, 0x8d5f, 0x8d65, 0x8d68, 0x8d69, 0x8d6a, 0x8d6c, 0x8d6e, 0x8d6f, 0x8d71, 0x8d72, 0x8d78, 0x8d79, 0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d, 0x8d7e, 0x8d7f, 0x8d80, 0x8d82, 0x8d83, 0x8d86, 0x8d87, 0x8d88, 0x8d89, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f, 0x8d90, 0x8d92, 0x8d93, 0x8d95, 0x8d96, 0x8d97, 0x8d98, 0x8d99, 0x8d9a, 0x8d9b, 0x8d9c, 0x8d9d, 0x8d9e, 0x8da0, 0x8da1, 0x8da2, 0x8da4, 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9, 0x8daa, 0x8dab, 0x8dac, 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db2, 0x8db6, 0x8db7, 0x8db9, 0x8dbb, 0x8dbd, 0x8dc0, 0x8dc1, 0x8dc2, 0x8dc5, 0x8dc7, 0x8dc8, 0x8dc9, 0x8dca, 0x8dcd, 0x8dd0, 0x8dd2, 0x8dd3, 0x8dd4, /* 0xdb */ 0x8dd5, 0x8dd8, 0x8dd9, 0x8ddc, 0x8de0, 0x8de1, 0x8de2, 0x8de5, 0x8de6, 0x8de7, 0x8de9, 0x8ded, 0x8dee, 0x8df0, 0x8df1, 0x8df2, 0x8df4, 0x8df6, 0x8dfc, 0x8dfe, 0x8dff, 0x8e00, 0x8e01, 0x8e02, 0x8e03, 0x8e04, 0x8e06, 0x8e07, 0x8e08, 0x8e0b, 0x8e0d, 0x8e0e, 0x8e10, 0x8e11, 0x8e12, 0x8e13, 0x8e15, 0x8e16, 0x8e17, 0x8e18, 0x8e19, 0x8e1a, 0x8e1b, 0x8e1c, 0x8e20, 0x8e21, 0x8e24, 0x8e25, 0x8e26, 0x8e27, 0x8e28, 0x8e2b, 0x8e2d, 0x8e30, 0x8e32, 0x8e33, 0x8e34, 0x8e36, 0x8e37, 0x8e38, 0x8e3b, 0x8e3c, 0x8e3e, 0x8e3f, 0x8e43, 0x8e45, 0x8e46, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50, 0x8e53, 0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58, 0x8e5a, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62, 0x8e63, 0x8e64, 0x8e65, 0x8e67, 0x8e68, 0x8e6a, 0x8e6b, 0x8e6e, 0x8e71, /* 0xdc */ 0x8e73, 0x8e75, 0x8e77, 0x8e78, 0x8e79, 0x8e7a, 0x8e7b, 0x8e7d, 0x8e7e, 0x8e80, 0x8e82, 0x8e83, 0x8e84, 0x8e86, 0x8e88, 0x8e89, 0x8e8a, 0x8e8b, 0x8e8c, 0x8e8d, 0x8e8e, 0x8e91, 0x8e92, 0x8e93, 0x8e95, 0x8e96, 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0x8e9d, 0x8e9f, 0x8ea0, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4, 0x8ea5, 0x8ea6, 0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0x8ead, 0x8eae, 0x8eb0, 0x8eb1, 0x8eb3, 0x8eb4, 0x8eb5, 0x8eb6, 0x8eb7, 0x8eb8, 0x8eb9, 0x8ebb, 0x8ebc, 0x8ebd, 0x8ebe, 0x8ebf, 0x8ec0, 0x8ec1, 0x8ec2, 0x8ec3, 0x8ec4, 0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8, 0x8ec9, 0x8eca, 0x8ecb, 0x8ecc, 0x8ecd, 0x8ecf, 0x8ed0, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4, 0x8ed5, 0x8ed6, 0x8ed7, 0x8ed8, 0x8ed9, 0x8eda, 0x8edb, 0x8edc, 0x8edd, 0x8ede, 0x8edf, 0x8ee0, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4, /* 0xdd */ 0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0x8eec, 0x8eed, 0x8eee, 0x8eef, 0x8ef0, 0x8ef1, 0x8ef2, 0x8ef3, 0x8ef4, 0x8ef5, 0x8ef6, 0x8ef7, 0x8ef8, 0x8ef9, 0x8efa, 0x8efb, 0x8efc, 0x8efd, 0x8efe, 0x8eff, 0x8f00, 0x8f01, 0x8f02, 0x8f03, 0x8f04, 0x8f05, 0x8f06, 0x8f07, 0x8f08, 0x8f09, 0x8f0a, 0x8f0b, 0x8f0c, 0x8f0d, 0x8f0e, 0x8f0f, 0x8f10, 0x8f11, 0x8f12, 0x8f13, 0x8f14, 0x8f15, 0x8f16, 0x8f17, 0x8f18, 0x8f19, 0x8f1a, 0x8f1b, 0x8f1c, 0x8f1d, 0x8f1e, 0x8f1f, 0x8f20, 0x8f21, 0x8f22, 0x8f23, 0x8f24, 0x8f25, 0x8f26, 0x8f27, 0x8f28, 0x8f29, 0x8f2a, 0x8f2b, 0x8f2c, 0x8f2d, 0x8f2e, 0x8f2f, 0x8f30, 0x8f31, 0x8f32, 0x8f33, 0x8f34, 0x8f35, 0x8f36, 0x8f37, 0x8f38, 0x8f39, 0x8f3a, 0x8f3b, 0x8f3c, 0x8f3d, 0x8f3e, 0x8f3f, 0x8f40, 0x8f41, 0x8f42, 0x8f43, 0x8f44, /* 0xde */ 0x8f45, 0x8f46, 0x8f47, 0x8f48, 0x8f49, 0x8f4a, 0x8f4b, 0x8f4c, 0x8f4d, 0x8f4e, 0x8f4f, 0x8f50, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55, 0x8f56, 0x8f57, 0x8f58, 0x8f59, 0x8f5a, 0x8f5b, 0x8f5c, 0x8f5d, 0x8f5e, 0x8f5f, 0x8f60, 0x8f61, 0x8f62, 0x8f63, 0x8f64, 0x8f65, 0x8f6a, 0x8f80, 0x8f8c, 0x8f92, 0x8f9d, 0x8fa0, 0x8fa1, 0x8fa2, 0x8fa4, 0x8fa5, 0x8fa6, 0x8fa7, 0x8faa, 0x8fac, 0x8fad, 0x8fae, 0x8faf, 0x8fb2, 0x8fb3, 0x8fb4, 0x8fb5, 0x8fb7, 0x8fb8, 0x8fba, 0x8fbb, 0x8fbc, 0x8fbf, 0x8fc0, 0x8fc3, 0x8fc6, 0x8fc9, 0x8fca, 0x8fcb, 0x8fcc, 0x8fcd, 0x8fcf, 0x8fd2, 0x8fd6, 0x8fd7, 0x8fda, 0x8fe0, 0x8fe1, 0x8fe3, 0x8fe7, 0x8fec, 0x8fef, 0x8ff1, 0x8ff2, 0x8ff4, 0x8ff5, 0x8ff6, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffe, 0x8fff, 0x9007, 0x9008, 0x900c, 0x900e, 0x9013, 0x9015, 0x9018, /* 0xdf */ 0x9019, 0x901c, 0x9023, 0x9024, 0x9025, 0x9027, 0x9028, 0x9029, 0x902a, 0x902b, 0x902c, 0x9030, 0x9031, 0x9032, 0x9033, 0x9034, 0x9037, 0x9039, 0x903a, 0x903d, 0x903f, 0x9040, 0x9043, 0x9045, 0x9046, 0x9048, 0x9049, 0x904a, 0x904b, 0x904c, 0x904e, 0x9054, 0x9055, 0x9056, 0x9059, 0x905a, 0x905c, 0x905d, 0x905e, 0x905f, 0x9060, 0x9061, 0x9064, 0x9066, 0x9067, 0x9069, 0x906a, 0x906b, 0x906c, 0x906f, 0x9070, 0x9071, 0x9072, 0x9073, 0x9076, 0x9077, 0x9078, 0x9079, 0x907a, 0x907b, 0x907c, 0x907e, 0x9081, 0x9084, 0x9085, 0x9086, 0x9087, 0x9089, 0x908a, 0x908c, 0x908d, 0x908e, 0x908f, 0x9090, 0x9092, 0x9094, 0x9096, 0x9098, 0x909a, 0x909c, 0x909e, 0x909f, 0x90a0, 0x90a4, 0x90a5, 0x90a7, 0x90a8, 0x90a9, 0x90ab, 0x90ad, 0x90b2, 0x90b7, 0x90bc, 0x90bd, 0x90bf, 0x90c0, /* 0xe0 */ 0x90c2, 0x90c3, 0x90c6, 0x90c8, 0x90c9, 0x90cb, 0x90cc, 0x90cd, 0x90d2, 0x90d4, 0x90d5, 0x90d6, 0x90d8, 0x90d9, 0x90da, 0x90de, 0x90df, 0x90e0, 0x90e3, 0x90e4, 0x90e5, 0x90e9, 0x90ea, 0x90ec, 0x90ee, 0x90f0, 0x90f1, 0x90f2, 0x90f3, 0x90f5, 0x90f6, 0x90f7, 0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90ff, 0x9100, 0x9101, 0x9103, 0x9105, 0x9106, 0x9107, 0x9108, 0x9109, 0x910a, 0x910b, 0x910c, 0x910d, 0x910e, 0x910f, 0x9110, 0x9111, 0x9112, 0x9113, 0x9114, 0x9115, 0x9116, 0x9117, 0x9118, 0x911a, 0x911b, 0x911c, 0x911d, 0x911f, 0x9120, 0x9121, 0x9124, 0x9125, 0x9126, 0x9127, 0x9128, 0x9129, 0x912a, 0x912b, 0x912c, 0x912d, 0x912e, 0x9130, 0x9132, 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, 0x913a, 0x913b, 0x913c, 0x913d, 0x913e, 0x913f, 0x9140, 0x9141, 0x9142, 0x9144, /* 0xe1 */ 0x9145, 0x9147, 0x9148, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, 0x9158, 0x9159, 0x915b, 0x915c, 0x915f, 0x9160, 0x9166, 0x9167, 0x9168, 0x916b, 0x916d, 0x9173, 0x917a, 0x917b, 0x917c, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918a, 0x918e, 0x918f, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91a1, 0x91a4, 0x91a5, 0x91a6, 0x91a7, 0x91a8, 0x91a9, 0x91ab, 0x91ac, 0x91b0, 0x91b1, 0x91b2, 0x91b3, 0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91bb, 0x91bc, 0x91bd, 0x91be, 0x91bf, 0x91c0, 0x91c1, 0x91c2, 0x91c3, 0x91c4, 0x91c5, 0x91c6, 0x91c8, 0x91cb, 0x91d0, 0x91d2, 0x91d3, 0x91d4, 0x91d5, 0x91d6, 0x91d7, 0x91d8, 0x91d9, 0x91da, 0x91db, 0x91dd, 0x91de, 0x91df, 0x91e0, 0x91e1, 0x91e2, 0x91e3, 0x91e4, 0x91e5, /* 0xe2 */ 0x91e6, 0x91e7, 0x91e8, 0x91e9, 0x91ea, 0x91eb, 0x91ec, 0x91ed, 0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f2, 0x91f3, 0x91f4, 0x91f5, 0x91f6, 0x91f7, 0x91f8, 0x91f9, 0x91fa, 0x91fb, 0x91fc, 0x91fd, 0x91fe, 0x91ff, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205, 0x9206, 0x9207, 0x9208, 0x9209, 0x920a, 0x920b, 0x920c, 0x920d, 0x920e, 0x920f, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215, 0x9216, 0x9217, 0x9218, 0x9219, 0x921a, 0x921b, 0x921c, 0x921d, 0x921e, 0x921f, 0x9220, 0x9221, 0x9222, 0x9223, 0x9224, 0x9225, 0x9226, 0x9227, 0x9228, 0x9229, 0x922a, 0x922b, 0x922c, 0x922d, 0x922e, 0x922f, 0x9230, 0x9231, 0x9232, 0x9233, 0x9234, 0x9235, 0x9236, 0x9237, 0x9238, 0x9239, 0x923a, 0x923b, 0x923c, 0x923d, 0x923e, 0x923f, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, /* 0xe3 */ 0x9246, 0x9247, 0x9248, 0x9249, 0x924a, 0x924b, 0x924c, 0x924d, 0x924e, 0x924f, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257, 0x9258, 0x9259, 0x925a, 0x925b, 0x925c, 0x925d, 0x925e, 0x925f, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, 0x926a, 0x926b, 0x926c, 0x926d, 0x926e, 0x926f, 0x9270, 0x9271, 0x9272, 0x9273, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927a, 0x927b, 0x927c, 0x927d, 0x927e, 0x927f, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c, 0x928d, 0x928f, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929a, 0x929b, 0x929c, 0x929d, 0x929e, 0x929f, 0x92a0, 0x92a1, 0x92a2, 0x92a3, 0x92a4, 0x92a5, 0x92a6, 0x92a7, /* 0xe4 */ 0x92a8, 0x92a9, 0x92aa, 0x92ab, 0x92ac, 0x92ad, 0x92af, 0x92b0, 0x92b1, 0x92b2, 0x92b3, 0x92b4, 0x92b5, 0x92b6, 0x92b7, 0x92b8, 0x92b9, 0x92ba, 0x92bb, 0x92bc, 0x92bd, 0x92be, 0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c4, 0x92c5, 0x92c6, 0x92c7, 0x92c9, 0x92ca, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92cf, 0x92d0, 0x92d1, 0x92d2, 0x92d3, 0x92d4, 0x92d5, 0x92d6, 0x92d7, 0x92d8, 0x92d9, 0x92da, 0x92db, 0x92dc, 0x92dd, 0x92de, 0x92df, 0x92e0, 0x92e1, 0x92e2, 0x92e3, 0x92e4, 0x92e5, 0x92e6, 0x92e7, 0x92e8, 0x92e9, 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0, 0x92f1, 0x92f2, 0x92f3, 0x92f4, 0x92f5, 0x92f6, 0x92f7, 0x92f8, 0x92f9, 0x92fa, 0x92fb, 0x92fc, 0x92fd, 0x92fe, 0x92ff, 0x9300, 0x9301, 0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, 0x9309, /* 0xe5 */ 0x930a, 0x930b, 0x930c, 0x930d, 0x930e, 0x930f, 0x9310, 0x9311, 0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, 0x931a, 0x931b, 0x931c, 0x931d, 0x931e, 0x931f, 0x9320, 0x9321, 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, 0x932a, 0x932b, 0x932c, 0x932d, 0x932e, 0x932f, 0x9330, 0x9331, 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, 0x933a, 0x933b, 0x933c, 0x933d, 0x933f, 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934a, 0x934b, 0x934c, 0x934d, 0x934e, 0x934f, 0x9350, 0x9351, 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935a, 0x935b, 0x935c, 0x935d, 0x935e, 0x935f, 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x936b, /* 0xe6 */ 0x936c, 0x936d, 0x936e, 0x936f, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937a, 0x937b, 0x937c, 0x937d, 0x937e, 0x937f, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938a, 0x938b, 0x938c, 0x938d, 0x938e, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939a, 0x939b, 0x939c, 0x939d, 0x939e, 0x939f, 0x93a0, 0x93a1, 0x93a2, 0x93a3, 0x93a4, 0x93a5, 0x93a6, 0x93a7, 0x93a8, 0x93a9, 0x93aa, 0x93ab, 0x93ac, 0x93ad, 0x93ae, 0x93af, 0x93b0, 0x93b1, 0x93b2, 0x93b3, 0x93b4, 0x93b5, 0x93b6, 0x93b7, 0x93b8, 0x93b9, 0x93ba, 0x93bb, 0x93bc, 0x93bd, 0x93be, 0x93bf, 0x93c0, 0x93c1, 0x93c2, 0x93c3, 0x93c4, 0x93c5, 0x93c6, 0x93c7, 0x93c8, 0x93c9, 0x93cb, 0x93cc, 0x93cd, /* 0xe7 */ 0x93ce, 0x93cf, 0x93d0, 0x93d1, 0x93d2, 0x93d3, 0x93d4, 0x93d5, 0x93d7, 0x93d8, 0x93d9, 0x93da, 0x93db, 0x93dc, 0x93dd, 0x93de, 0x93df, 0x93e0, 0x93e1, 0x93e2, 0x93e3, 0x93e4, 0x93e5, 0x93e6, 0x93e7, 0x93e8, 0x93e9, 0x93ea, 0x93eb, 0x93ec, 0x93ed, 0x93ee, 0x93ef, 0x93f0, 0x93f1, 0x93f2, 0x93f3, 0x93f4, 0x93f5, 0x93f6, 0x93f7, 0x93f8, 0x93f9, 0x93fa, 0x93fb, 0x93fc, 0x93fd, 0x93fe, 0x93ff, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, 0x9407, 0x9408, 0x9409, 0x940a, 0x940b, 0x940c, 0x940d, 0x940e, 0x940f, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, 0x9416, 0x9417, 0x9418, 0x9419, 0x941a, 0x941b, 0x941c, 0x941d, 0x941e, 0x941f, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9426, 0x9427, 0x9428, 0x9429, 0x942a, 0x942b, 0x942c, 0x942d, 0x942e, /* 0xe8 */ 0x942f, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, 0x9437, 0x9438, 0x9439, 0x943a, 0x943b, 0x943c, 0x943d, 0x943f, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944a, 0x944b, 0x944c, 0x944d, 0x944e, 0x944f, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945a, 0x945b, 0x945c, 0x945d, 0x945e, 0x945f, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946a, 0x946c, 0x946d, 0x946e, 0x946f, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947a, 0x947b, 0x947c, 0x947d, 0x947e, 0x947f, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9491, 0x9496, 0x9498, 0x94c7, 0x94cf, 0x94d3, 0x94d4, 0x94da, 0x94e6, 0x94fb, 0x951c, 0x9520, /* 0xe9 */ 0x9527, 0x9533, 0x953d, 0x9543, 0x9548, 0x954b, 0x9555, 0x955a, 0x9560, 0x956e, 0x9574, 0x9575, 0x9577, 0x9578, 0x9579, 0x957a, 0x957b, 0x957c, 0x957d, 0x957e, 0x9580, 0x9581, 0x9582, 0x9583, 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958a, 0x958b, 0x958c, 0x958d, 0x958e, 0x958f, 0x9590, 0x9591, 0x9592, 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959a, 0x959b, 0x959c, 0x959d, 0x959e, 0x959f, 0x95a0, 0x95a1, 0x95a2, 0x95a3, 0x95a4, 0x95a5, 0x95a6, 0x95a7, 0x95a8, 0x95a9, 0x95aa, 0x95ab, 0x95ac, 0x95ad, 0x95ae, 0x95af, 0x95b0, 0x95b1, 0x95b2, 0x95b3, 0x95b4, 0x95b5, 0x95b6, 0x95b7, 0x95b8, 0x95b9, 0x95ba, 0x95bb, 0x95bc, 0x95bd, 0x95be, 0x95bf, 0x95c0, 0x95c1, 0x95c2, 0x95c3, 0x95c4, 0x95c5, 0x95c6, 0x95c7, 0x95c8, 0x95c9, 0x95ca, 0x95cb, /* 0xea */ 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0, 0x95d1, 0x95d2, 0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9, 0x95da, 0x95db, 0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2, 0x95e3, 0x95e4, 0x95e5, 0x95e6, 0x95e7, 0x95ec, 0x95ff, 0x9607, 0x9613, 0x9618, 0x961b, 0x961e, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, 0x9627, 0x9628, 0x9629, 0x962b, 0x962c, 0x962d, 0x962f, 0x9630, 0x9637, 0x9638, 0x9639, 0x963a, 0x963e, 0x9641, 0x9643, 0x964a, 0x964e, 0x964f, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0x9658, 0x9659, 0x965a, 0x965c, 0x965d, 0x965e, 0x9660, 0x9663, 0x9665, 0x9666, 0x966b, 0x966d, 0x966e, 0x966f, 0x9670, 0x9671, 0x9673, 0x9678, 0x9679, 0x967a, 0x967b, 0x967c, 0x967d, 0x967e, 0x967f, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, 0x968a, /* 0xeb */ 0x968c, 0x968e, 0x9691, 0x9692, 0x9693, 0x9695, 0x9696, 0x969a, 0x969b, 0x969d, 0x969e, 0x969f, 0x96a0, 0x96a1, 0x96a2, 0x96a3, 0x96a4, 0x96a5, 0x96a6, 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac, 0x96ad, 0x96ae, 0x96af, 0x96b1, 0x96b2, 0x96b4, 0x96b5, 0x96b7, 0x96b8, 0x96ba, 0x96bb, 0x96bf, 0x96c2, 0x96c3, 0x96c8, 0x96ca, 0x96cb, 0x96d0, 0x96d1, 0x96d3, 0x96d4, 0x96d6, 0x96d7, 0x96d8, 0x96d9, 0x96da, 0x96db, 0x96dc, 0x96dd, 0x96de, 0x96df, 0x96e1, 0x96e2, 0x96e3, 0x96e4, 0x96e5, 0x96e6, 0x96e7, 0x96eb, 0x96ec, 0x96ed, 0x96ee, 0x96f0, 0x96f1, 0x96f2, 0x96f4, 0x96f5, 0x96f8, 0x96fa, 0x96fb, 0x96fc, 0x96fd, 0x96ff, 0x9702, 0x9703, 0x9705, 0x970a, 0x970b, 0x970c, 0x9710, 0x9711, 0x9712, 0x9714, 0x9715, 0x9717, 0x9718, 0x9719, 0x971a, 0x971b, 0x971d, 0x971f, 0x9720, /* 0xec */ 0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, 0x9727, 0x9728, 0x9729, 0x972b, 0x972c, 0x972e, 0x972f, 0x9731, 0x9733, 0x9734, 0x9735, 0x9736, 0x9737, 0x973a, 0x973b, 0x973c, 0x973d, 0x973f, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, 0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d, 0x974e, 0x974f, 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, 0x975a, 0x975c, 0x975d, 0x975f, 0x9763, 0x9764, 0x9766, 0x9767, 0x9768, 0x976a, 0x976b, 0x976c, 0x976d, 0x976e, 0x976f, 0x9770, 0x9771, 0x9772, 0x9775, 0x9777, 0x9778, 0x9779, 0x977a, 0x977b, 0x977d, 0x977e, 0x977f, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, 0x9787, 0x9788, 0x9789, 0x978a, 0x978c, 0x978e, 0x978f, 0x9790, 0x9793, 0x9795, 0x9796, 0x9797, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d, /* 0xed */ 0x979e, 0x979f, 0x97a1, 0x97a2, 0x97a4, 0x97a5, 0x97a6, 0x97a7, 0x97a8, 0x97a9, 0x97aa, 0x97ac, 0x97ae, 0x97b0, 0x97b1, 0x97b3, 0x97b5, 0x97b6, 0x97b7, 0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc, 0x97bd, 0x97be, 0x97bf, 0x97c0, 0x97c1, 0x97c2, 0x97c3, 0x97c4, 0x97c5, 0x97c6, 0x97c7, 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, 0x97cd, 0x97ce, 0x97cf, 0x97d0, 0x97d1, 0x97d2, 0x97d3, 0x97d4, 0x97d5, 0x97d6, 0x97d7, 0x97d8, 0x97d9, 0x97da, 0x97db, 0x97dc, 0x97dd, 0x97de, 0x97df, 0x97e0, 0x97e1, 0x97e2, 0x97e3, 0x97e4, 0x97e5, 0x97e8, 0x97ee, 0x97ef, 0x97f0, 0x97f1, 0x97f2, 0x97f4, 0x97f7, 0x97f8, 0x97f9, 0x97fa, 0x97fb, 0x97fc, 0x97fd, 0x97fe, 0x97ff, 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805, 0x9806, 0x9807, 0x9808, 0x9809, 0x980a, 0x980b, 0x980c, 0x980d, 0x980e, /* 0xee */ 0x980f, 0x9810, 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816, 0x9817, 0x9818, 0x9819, 0x981a, 0x981b, 0x981c, 0x981d, 0x981e, 0x981f, 0x9820, 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826, 0x9827, 0x9828, 0x9829, 0x982a, 0x982b, 0x982c, 0x982d, 0x982e, 0x982f, 0x9830, 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836, 0x9837, 0x9838, 0x9839, 0x983a, 0x983b, 0x983c, 0x983d, 0x983e, 0x983f, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, 0x9848, 0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 0x984e, 0x984f, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, 0x9858, 0x9859, 0x985a, 0x985b, 0x985c, 0x985d, 0x985e, 0x985f, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868, 0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, /* 0xef */ 0x986f, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x988b, 0x988e, 0x9892, 0x9895, 0x9899, 0x98a3, 0x98a8, 0x98a9, 0x98aa, 0x98ab, 0x98ac, 0x98ad, 0x98ae, 0x98af, 0x98b0, 0x98b1, 0x98b2, 0x98b3, 0x98b4, 0x98b5, 0x98b6, 0x98b7, 0x98b8, 0x98b9, 0x98ba, 0x98bb, 0x98bc, 0x98bd, 0x98be, 0x98bf, 0x98c0, 0x98c1, 0x98c2, 0x98c3, 0x98c4, 0x98c5, 0x98c6, 0x98c7, 0x98c8, 0x98c9, 0x98ca, 0x98cb, 0x98cc, 0x98cd, 0x98cf, 0x98d0, 0x98d4, 0x98d6, 0x98d7, 0x98db, 0x98dc, 0x98dd, 0x98e0, 0x98e1, 0x98e2, 0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e9, 0x98ea, 0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef, 0x98f0, 0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7, 0x98f8, 0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0x98fe, 0x98ff, 0x9900, 0x9901, 0x9902, 0x9903, 0x9904, 0x9905, 0x9906, 0x9907, /* 0xf0 */ 0x9908, 0x9909, 0x990a, 0x990b, 0x990c, 0x990e, 0x990f, 0x9911, 0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, 0x9918, 0x9919, 0x991a, 0x991b, 0x991c, 0x991d, 0x991e, 0x991f, 0x9920, 0x9921, 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9928, 0x9929, 0x992a, 0x992b, 0x992c, 0x992d, 0x992f, 0x9930, 0x9931, 0x9932, 0x9933, 0x9934, 0x9935, 0x9936, 0x9937, 0x9938, 0x9939, 0x993a, 0x993b, 0x993c, 0x993d, 0x993e, 0x993f, 0x9940, 0x9941, 0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0x994a, 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951, 0x9952, 0x9953, 0x9956, 0x9957, 0x9958, 0x9959, 0x995a, 0x995b, 0x995c, 0x995d, 0x995e, 0x995f, 0x9960, 0x9961, 0x9962, 0x9964, 0x9966, 0x9973, 0x9978, 0x9979, 0x997b, 0x997e, 0x9982, 0x9983, 0x9989, /* 0xf1 */ 0x998c, 0x998e, 0x999a, 0x999b, 0x999c, 0x999d, 0x999e, 0x999f, 0x99a0, 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a6, 0x99a7, 0x99a9, 0x99aa, 0x99ab, 0x99ac, 0x99ad, 0x99ae, 0x99af, 0x99b0, 0x99b1, 0x99b2, 0x99b3, 0x99b4, 0x99b5, 0x99b6, 0x99b7, 0x99b8, 0x99b9, 0x99ba, 0x99bb, 0x99bc, 0x99bd, 0x99be, 0x99bf, 0x99c0, 0x99c1, 0x99c2, 0x99c3, 0x99c4, 0x99c5, 0x99c6, 0x99c7, 0x99c8, 0x99c9, 0x99ca, 0x99cb, 0x99cc, 0x99cd, 0x99ce, 0x99cf, 0x99d0, 0x99d1, 0x99d2, 0x99d3, 0x99d4, 0x99d5, 0x99d6, 0x99d7, 0x99d8, 0x99d9, 0x99da, 0x99db, 0x99dc, 0x99dd, 0x99de, 0x99df, 0x99e0, 0x99e1, 0x99e2, 0x99e3, 0x99e4, 0x99e5, 0x99e6, 0x99e7, 0x99e8, 0x99e9, 0x99ea, 0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x99ef, 0x99f0, 0x99f1, 0x99f2, 0x99f3, 0x99f4, 0x99f5, 0x99f6, 0x99f7, 0x99f8, 0x99f9, /* 0xf2 */ 0x99fa, 0x99fb, 0x99fc, 0x99fd, 0x99fe, 0x99ff, 0x9a00, 0x9a01, 0x9a02, 0x9a03, 0x9a04, 0x9a05, 0x9a06, 0x9a07, 0x9a08, 0x9a09, 0x9a0a, 0x9a0b, 0x9a0c, 0x9a0d, 0x9a0e, 0x9a0f, 0x9a10, 0x9a11, 0x9a12, 0x9a13, 0x9a14, 0x9a15, 0x9a16, 0x9a17, 0x9a18, 0x9a19, 0x9a1a, 0x9a1b, 0x9a1c, 0x9a1d, 0x9a1e, 0x9a1f, 0x9a20, 0x9a21, 0x9a22, 0x9a23, 0x9a24, 0x9a25, 0x9a26, 0x9a27, 0x9a28, 0x9a29, 0x9a2a, 0x9a2b, 0x9a2c, 0x9a2d, 0x9a2e, 0x9a2f, 0x9a30, 0x9a31, 0x9a32, 0x9a33, 0x9a34, 0x9a35, 0x9a36, 0x9a37, 0x9a38, 0x9a39, 0x9a3a, 0x9a3b, 0x9a3c, 0x9a3d, 0x9a3e, 0x9a3f, 0x9a40, 0x9a41, 0x9a42, 0x9a43, 0x9a44, 0x9a45, 0x9a46, 0x9a47, 0x9a48, 0x9a49, 0x9a4a, 0x9a4b, 0x9a4c, 0x9a4d, 0x9a4e, 0x9a4f, 0x9a50, 0x9a51, 0x9a52, 0x9a53, 0x9a54, 0x9a55, 0x9a56, 0x9a57, 0x9a58, 0x9a59, /* 0xf3 */ 0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d, 0x9a5e, 0x9a5f, 0x9a60, 0x9a61, 0x9a62, 0x9a63, 0x9a64, 0x9a65, 0x9a66, 0x9a67, 0x9a68, 0x9a69, 0x9a6a, 0x9a6b, 0x9a72, 0x9a83, 0x9a89, 0x9a8d, 0x9a8e, 0x9a94, 0x9a95, 0x9a99, 0x9aa6, 0x9aa9, 0x9aaa, 0x9aab, 0x9aac, 0x9aad, 0x9aae, 0x9aaf, 0x9ab2, 0x9ab3, 0x9ab4, 0x9ab5, 0x9ab9, 0x9abb, 0x9abd, 0x9abe, 0x9abf, 0x9ac3, 0x9ac4, 0x9ac6, 0x9ac7, 0x9ac8, 0x9ac9, 0x9aca, 0x9acd, 0x9ace, 0x9acf, 0x9ad0, 0x9ad2, 0x9ad4, 0x9ad5, 0x9ad6, 0x9ad7, 0x9ad9, 0x9ada, 0x9adb, 0x9adc, 0x9add, 0x9ade, 0x9ae0, 0x9ae2, 0x9ae3, 0x9ae4, 0x9ae5, 0x9ae7, 0x9ae8, 0x9ae9, 0x9aea, 0x9aec, 0x9aee, 0x9af0, 0x9af1, 0x9af2, 0x9af3, 0x9af4, 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9afa, 0x9afc, 0x9afd, 0x9afe, 0x9aff, 0x9b00, 0x9b01, 0x9b02, 0x9b04, 0x9b05, 0x9b06, /* 0xf4 */ 0x9b07, 0x9b09, 0x9b0a, 0x9b0b, 0x9b0c, 0x9b0d, 0x9b0e, 0x9b10, 0x9b11, 0x9b12, 0x9b14, 0x9b15, 0x9b16, 0x9b17, 0x9b18, 0x9b19, 0x9b1a, 0x9b1b, 0x9b1c, 0x9b1d, 0x9b1e, 0x9b20, 0x9b21, 0x9b22, 0x9b24, 0x9b25, 0x9b26, 0x9b27, 0x9b28, 0x9b29, 0x9b2a, 0x9b2b, 0x9b2c, 0x9b2d, 0x9b2e, 0x9b30, 0x9b31, 0x9b33, 0x9b34, 0x9b35, 0x9b36, 0x9b37, 0x9b38, 0x9b39, 0x9b3a, 0x9b3d, 0x9b3e, 0x9b3f, 0x9b40, 0x9b46, 0x9b4a, 0x9b4b, 0x9b4c, 0x9b4e, 0x9b50, 0x9b52, 0x9b53, 0x9b55, 0x9b56, 0x9b57, 0x9b58, 0x9b59, 0x9b5a, 0x9b5b, 0x9b5c, 0x9b5d, 0x9b5e, 0x9b5f, 0x9b60, 0x9b61, 0x9b62, 0x9b63, 0x9b64, 0x9b65, 0x9b66, 0x9b67, 0x9b68, 0x9b69, 0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b6f, 0x9b70, 0x9b71, 0x9b72, 0x9b73, 0x9b74, 0x9b75, 0x9b76, 0x9b77, 0x9b78, 0x9b79, 0x9b7a, 0x9b7b, /* 0xf5 */ 0x9b7c, 0x9b7d, 0x9b7e, 0x9b7f, 0x9b80, 0x9b81, 0x9b82, 0x9b83, 0x9b84, 0x9b85, 0x9b86, 0x9b87, 0x9b88, 0x9b89, 0x9b8a, 0x9b8b, 0x9b8c, 0x9b8d, 0x9b8e, 0x9b8f, 0x9b90, 0x9b91, 0x9b92, 0x9b93, 0x9b94, 0x9b95, 0x9b96, 0x9b97, 0x9b98, 0x9b99, 0x9b9a, 0x9b9b, 0x9b9c, 0x9b9d, 0x9b9e, 0x9b9f, 0x9ba0, 0x9ba1, 0x9ba2, 0x9ba3, 0x9ba4, 0x9ba5, 0x9ba6, 0x9ba7, 0x9ba8, 0x9ba9, 0x9baa, 0x9bab, 0x9bac, 0x9bad, 0x9bae, 0x9baf, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3, 0x9bb4, 0x9bb5, 0x9bb6, 0x9bb7, 0x9bb8, 0x9bb9, 0x9bba, 0x9bbb, 0x9bbc, 0x9bbd, 0x9bbe, 0x9bbf, 0x9bc0, 0x9bc1, 0x9bc2, 0x9bc3, 0x9bc4, 0x9bc5, 0x9bc6, 0x9bc7, 0x9bc8, 0x9bc9, 0x9bca, 0x9bcb, 0x9bcc, 0x9bcd, 0x9bce, 0x9bcf, 0x9bd0, 0x9bd1, 0x9bd2, 0x9bd3, 0x9bd4, 0x9bd5, 0x9bd6, 0x9bd7, 0x9bd8, 0x9bd9, 0x9bda, 0x9bdb, /* 0xf6 */ 0x9bdc, 0x9bdd, 0x9bde, 0x9bdf, 0x9be0, 0x9be1, 0x9be2, 0x9be3, 0x9be4, 0x9be5, 0x9be6, 0x9be7, 0x9be8, 0x9be9, 0x9bea, 0x9beb, 0x9bec, 0x9bed, 0x9bee, 0x9bef, 0x9bf0, 0x9bf1, 0x9bf2, 0x9bf3, 0x9bf4, 0x9bf5, 0x9bf6, 0x9bf7, 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfb, 0x9bfc, 0x9bfd, 0x9bfe, 0x9bff, 0x9c00, 0x9c01, 0x9c02, 0x9c03, 0x9c04, 0x9c05, 0x9c06, 0x9c07, 0x9c08, 0x9c09, 0x9c0a, 0x9c0b, 0x9c0c, 0x9c0d, 0x9c0e, 0x9c0f, 0x9c10, 0x9c11, 0x9c12, 0x9c13, 0x9c14, 0x9c15, 0x9c16, 0x9c17, 0x9c18, 0x9c19, 0x9c1a, 0x9c1b, 0x9c1c, 0x9c1d, 0x9c1e, 0x9c1f, 0x9c20, 0x9c21, 0x9c22, 0x9c23, 0x9c24, 0x9c25, 0x9c26, 0x9c27, 0x9c28, 0x9c29, 0x9c2a, 0x9c2b, 0x9c2c, 0x9c2d, 0x9c2e, 0x9c2f, 0x9c30, 0x9c31, 0x9c32, 0x9c33, 0x9c34, 0x9c35, 0x9c36, 0x9c37, 0x9c38, 0x9c39, 0x9c3a, 0x9c3b, /* 0xf7 */ 0x9c3c, 0x9c3d, 0x9c3e, 0x9c3f, 0x9c40, 0x9c41, 0x9c42, 0x9c43, 0x9c44, 0x9c45, 0x9c46, 0x9c47, 0x9c48, 0x9c49, 0x9c4a, 0x9c4b, 0x9c4c, 0x9c4d, 0x9c4e, 0x9c4f, 0x9c50, 0x9c51, 0x9c52, 0x9c53, 0x9c54, 0x9c55, 0x9c56, 0x9c57, 0x9c58, 0x9c59, 0x9c5a, 0x9c5b, 0x9c5c, 0x9c5d, 0x9c5e, 0x9c5f, 0x9c60, 0x9c61, 0x9c62, 0x9c63, 0x9c64, 0x9c65, 0x9c66, 0x9c67, 0x9c68, 0x9c69, 0x9c6a, 0x9c6b, 0x9c6c, 0x9c6d, 0x9c6e, 0x9c6f, 0x9c70, 0x9c71, 0x9c72, 0x9c73, 0x9c74, 0x9c75, 0x9c76, 0x9c77, 0x9c78, 0x9c79, 0x9c7a, 0x9c7b, 0x9c7d, 0x9c7e, 0x9c80, 0x9c83, 0x9c84, 0x9c89, 0x9c8a, 0x9c8c, 0x9c8f, 0x9c93, 0x9c96, 0x9c97, 0x9c98, 0x9c99, 0x9c9d, 0x9caa, 0x9cac, 0x9caf, 0x9cb9, 0x9cbe, 0x9cbf, 0x9cc0, 0x9cc1, 0x9cc2, 0x9cc8, 0x9cc9, 0x9cd1, 0x9cd2, 0x9cda, 0x9cdb, 0x9ce0, 0x9ce1, /* 0xf8 */ 0x9ce3, 0x9ce4, 0x9ce5, 0x9ce6, 0x9ce7, 0x9ce8, 0x9ce9, 0x9cea, 0x9ceb, 0x9cec, 0x9ced, 0x9cee, 0x9cef, 0x9cf0, 0x9cf1, 0x9cf2, 0x9cf3, 0x9cf4, 0x9cf5, 0x9cf6, 0x9cf7, 0x9cf8, 0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, 0x9cff, 0x9d00, 0x9d01, 0x9d02, 0x9d03, 0x9d04, 0x9d05, 0x9d06, 0x9d07, 0x9d08, 0x9d09, 0x9d0a, 0x9d0b, 0x9d0c, 0x9d0d, 0x9d0e, 0x9d0f, 0x9d10, 0x9d11, 0x9d12, 0x9d13, 0x9d14, 0x9d15, 0x9d16, 0x9d17, 0x9d18, 0x9d19, 0x9d1a, 0x9d1b, 0x9d1c, 0x9d1d, 0x9d1e, 0x9d1f, 0x9d20, 0x9d21, 0x9d22, 0x9d23, 0x9d24, 0x9d25, 0x9d26, 0x9d27, 0x9d28, 0x9d29, 0x9d2a, 0x9d2b, 0x9d2c, 0x9d2d, 0x9d2e, 0x9d2f, 0x9d30, 0x9d31, 0x9d32, 0x9d33, 0x9d34, 0x9d35, 0x9d36, 0x9d37, 0x9d38, 0x9d39, 0x9d3a, 0x9d3b, 0x9d3c, 0x9d3d, 0x9d3e, 0x9d3f, 0x9d40, 0x9d41, 0x9d42, /* 0xf9 */ 0x9d43, 0x9d44, 0x9d45, 0x9d46, 0x9d47, 0x9d48, 0x9d49, 0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e, 0x9d4f, 0x9d50, 0x9d51, 0x9d52, 0x9d53, 0x9d54, 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59, 0x9d5a, 0x9d5b, 0x9d5c, 0x9d5d, 0x9d5e, 0x9d5f, 0x9d60, 0x9d61, 0x9d62, 0x9d63, 0x9d64, 0x9d65, 0x9d66, 0x9d67, 0x9d68, 0x9d69, 0x9d6a, 0x9d6b, 0x9d6c, 0x9d6d, 0x9d6e, 0x9d6f, 0x9d70, 0x9d71, 0x9d72, 0x9d73, 0x9d74, 0x9d75, 0x9d76, 0x9d77, 0x9d78, 0x9d79, 0x9d7a, 0x9d7b, 0x9d7c, 0x9d7d, 0x9d7e, 0x9d7f, 0x9d80, 0x9d81, 0x9d82, 0x9d83, 0x9d84, 0x9d85, 0x9d86, 0x9d87, 0x9d88, 0x9d89, 0x9d8a, 0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, 0x9d90, 0x9d91, 0x9d92, 0x9d93, 0x9d94, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9d99, 0x9d9a, 0x9d9b, 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0x9da0, 0x9da1, 0x9da2, /* 0xfa */ 0x9da3, 0x9da4, 0x9da5, 0x9da6, 0x9da7, 0x9da8, 0x9da9, 0x9daa, 0x9dab, 0x9dac, 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0x9db1, 0x9db2, 0x9db3, 0x9db4, 0x9db5, 0x9db6, 0x9db7, 0x9db8, 0x9db9, 0x9dba, 0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe, 0x9dbf, 0x9dc0, 0x9dc1, 0x9dc2, 0x9dc3, 0x9dc4, 0x9dc5, 0x9dc6, 0x9dc7, 0x9dc8, 0x9dc9, 0x9dca, 0x9dcb, 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0, 0x9dd1, 0x9dd2, 0x9dd3, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dd8, 0x9dd9, 0x9dda, 0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, 0x9de0, 0x9de1, 0x9de2, 0x9de3, 0x9de4, 0x9de5, 0x9de6, 0x9de7, 0x9de8, 0x9de9, 0x9dea, 0x9deb, 0x9dec, 0x9ded, 0x9dee, 0x9def, 0x9df0, 0x9df1, 0x9df2, 0x9df3, 0x9df4, 0x9df5, 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0x9dfa, 0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9dff, 0x9e00, 0x9e01, 0x9e02, /* 0xfb */ 0x9e03, 0x9e04, 0x9e05, 0x9e06, 0x9e07, 0x9e08, 0x9e09, 0x9e0a, 0x9e0b, 0x9e0c, 0x9e0d, 0x9e0e, 0x9e0f, 0x9e10, 0x9e11, 0x9e12, 0x9e13, 0x9e14, 0x9e15, 0x9e16, 0x9e17, 0x9e18, 0x9e19, 0x9e1a, 0x9e1b, 0x9e1c, 0x9e1d, 0x9e1e, 0x9e24, 0x9e27, 0x9e2e, 0x9e30, 0x9e34, 0x9e3b, 0x9e3c, 0x9e40, 0x9e4d, 0x9e50, 0x9e52, 0x9e53, 0x9e54, 0x9e56, 0x9e59, 0x9e5d, 0x9e5f, 0x9e60, 0x9e61, 0x9e62, 0x9e65, 0x9e6e, 0x9e6f, 0x9e72, 0x9e74, 0x9e75, 0x9e76, 0x9e77, 0x9e78, 0x9e79, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e7d, 0x9e80, 0x9e81, 0x9e83, 0x9e84, 0x9e85, 0x9e86, 0x9e89, 0x9e8a, 0x9e8c, 0x9e8d, 0x9e8e, 0x9e8f, 0x9e90, 0x9e91, 0x9e94, 0x9e95, 0x9e96, 0x9e97, 0x9e98, 0x9e99, 0x9e9a, 0x9e9b, 0x9e9c, 0x9e9e, 0x9ea0, 0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4, 0x9ea5, 0x9ea7, 0x9ea8, 0x9ea9, 0x9eaa, /* 0xfc */ 0x9eab, 0x9eac, 0x9ead, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb5, 0x9eb6, 0x9eb7, 0x9eb9, 0x9eba, 0x9ebc, 0x9ebf, 0x9ec0, 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8, 0x9eca, 0x9ecb, 0x9ecc, 0x9ed0, 0x9ed2, 0x9ed3, 0x9ed5, 0x9ed6, 0x9ed7, 0x9ed9, 0x9eda, 0x9ede, 0x9ee1, 0x9ee3, 0x9ee4, 0x9ee6, 0x9ee8, 0x9eeb, 0x9eec, 0x9eed, 0x9eee, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef3, 0x9ef4, 0x9ef5, 0x9ef6, 0x9ef7, 0x9ef8, 0x9efa, 0x9efd, 0x9eff, 0x9f00, 0x9f01, 0x9f02, 0x9f03, 0x9f04, 0x9f05, 0x9f06, 0x9f07, 0x9f08, 0x9f09, 0x9f0a, 0x9f0c, 0x9f0f, 0x9f11, 0x9f12, 0x9f14, 0x9f15, 0x9f16, 0x9f18, 0x9f1a, 0x9f1b, 0x9f1c, 0x9f1d, 0x9f1e, 0x9f1f, 0x9f21, 0x9f23, 0x9f24, 0x9f25, 0x9f26, 0x9f27, 0x9f28, 0x9f29, 0x9f2a, 0x9f2b, 0x9f2d, 0x9f2e, 0x9f30, 0x9f31, /* 0xfd */ 0x9f32, 0x9f33, 0x9f34, 0x9f35, 0x9f36, 0x9f38, 0x9f3a, 0x9f3c, 0x9f3f, 0x9f40, 0x9f41, 0x9f42, 0x9f43, 0x9f45, 0x9f46, 0x9f47, 0x9f48, 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, 0x9f4e, 0x9f4f, 0x9f52, 0x9f53, 0x9f54, 0x9f55, 0x9f56, 0x9f57, 0x9f58, 0x9f59, 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d, 0x9f5e, 0x9f5f, 0x9f60, 0x9f61, 0x9f62, 0x9f63, 0x9f64, 0x9f65, 0x9f66, 0x9f67, 0x9f68, 0x9f69, 0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d, 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f72, 0x9f73, 0x9f74, 0x9f75, 0x9f76, 0x9f77, 0x9f78, 0x9f79, 0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d, 0x9f7e, 0x9f81, 0x9f82, 0x9f8d, 0x9f8e, 0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f93, 0x9f94, 0x9f95, 0x9f96, 0x9f97, 0x9f98, 0x9f9c, 0x9f9d, 0x9f9e, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa4, 0x9fa5, 0xf92c, 0xf979, 0xf995, 0xf9e7, 0xf9f1, /* 0xfe */ 0xfa0c, 0xfa0d, 0xfa0e, 0xfa0f, 0xfa11, 0xfa13, 0xfa14, 0xfa18, 0xfa1f, 0xfa20, 0xfa21, 0xfa23, 0xfa24, 0xfa27, 0xfa28, 0xfa29, }; static int gbkext2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0xa8 && c1 <= 0xfe)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xa1)) { unsigned int i = 96 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); unsigned short wc = 0xfffd; { if (i < 12016) wc = gbkext2_2uni_pagea8[i-3744]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } fldigi-3.21.80/src/libtiniconv/encdec/flushwc.h0000664000175000017500000000230512313064025016216 00000000000000/* * Copyright (C) 2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _FLUSHWC_H #define _FLUSHWC_H static int normal_flushwc (conv_t conv, ucs4_t *pwc) { ucs4_t last_wc = conv->istate; if (last_wc) { /* Output the buffered character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 1; } else return 0; } #endif /* _FLUSHWC_H */ fldigi-3.21.80/src/libtiniconv/encdec/ascii.h0000664000175000017500000000242212313064025015633 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ASCII */ static int ascii_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } return RET_ILSEQ; } static int ascii_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0080) { *r = (unsigned char)wc; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/koi8_r.h0000664000175000017500000001523612313064025015745 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * KOI8-R */ /* Specification: RFC 1489 */ static const unsigned short koi8_r_2uni[128] = { /* 0x80 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, /* 0x90 */ 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, /* 0xa0 */ 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, /* 0xb0 */ 0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9, /* 0xc0 */ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0xd0 */ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0xe0 */ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0xf0 */ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, }; static int koi8_r_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) koi8_r_2uni[c-0x80]; return 1; } static const unsigned char koi8_r_page00[88] = { 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ }; static const unsigned char koi8_r_page04[88] = { 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ }; static const unsigned char koi8_r_page22[80] = { 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char koi8_r_page23[8] = { 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char koi8_r_page25[168] = { 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xa0, 0xa1, 0xa2, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, /* 0x50-0x57 */ 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, /* 0x58-0x5f */ 0xb1, 0xb2, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, /* 0x60-0x67 */ 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int koi8_r_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = koi8_r_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0458) c = koi8_r_page04[wc-0x0400]; else if (wc >= 0x2218 && wc < 0x2268) c = koi8_r_page22[wc-0x2218]; else if (wc >= 0x2320 && wc < 0x2328) c = koi8_r_page23[wc-0x2320]; else if (wc >= 0x2500 && wc < 0x25a8) c = koi8_r_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_1.h0000664000175000017500000000234212313064025016114 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-1 */ static int iso8859_1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; *pwc = (ucs4_t) c; return 1; } static int iso8859_1_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0100) { *r = wc; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/gb2312.h0000664000175000017500000046505512313064025015462 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GB2312.1980-0 */ static const unsigned short gb2312_2uni_page21[831] = { /* 0x21 */ 0x3000, 0x3001, 0x3002, 0x30fb, 0x02c9, 0x02c7, 0x00a8, 0x3003, 0x3005, 0x2015, 0xff5e, 0x2016, 0x2026, 0x2018, 0x2019, 0x201c, 0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, 0x300f, 0x3016, 0x3017, 0x3010, 0x3011, 0x00b1, 0x00d7, 0x00f7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220f, 0x222a, 0x2229, 0x2208, 0x2237, 0x221a, 0x22a5, 0x2225, 0x2220, 0x2312, 0x2299, 0x222b, 0x222e, 0x2261, 0x224c, 0x2248, 0x223d, 0x221d, 0x2260, 0x226e, 0x226f, 0x2264, 0x2265, 0x221e, 0x2235, 0x2234, 0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xff04, 0x00a4, 0xffe0, 0xffe1, 0x2030, 0x00a7, 0x2116, 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x203b, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, /* 0x22 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499, 0x249a, 0x249b, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0xfffd, 0xfffd, 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0xfffd, 0xfffd, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216a, 0x216b, 0xfffd, 0xfffd, /* 0x23 */ 0xff01, 0xff02, 0xff03, 0xffe5, 0xff05, 0xff06, 0xff07, 0xff08, 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff3f, 0xff40, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xffe3, /* 0x24 */ 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x25 */ 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x26 */ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x27 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x28 */ 0x0101, 0x00e1, 0x01ce, 0x00e0, 0x0113, 0x00e9, 0x011b, 0x00e8, 0x012b, 0x00ed, 0x01d0, 0x00ec, 0x014d, 0x00f3, 0x01d2, 0x00f2, 0x016b, 0x00fa, 0x01d4, 0x00f9, 0x01d6, 0x01d8, 0x01da, 0x01dc, 0x00fc, 0x00ea, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x29 */ 0xfffd, 0xfffd, 0xfffd, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250a, 0x250b, 0x250c, 0x250d, 0x250e, 0x250f, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251a, 0x251b, 0x251c, 0x251d, 0x251e, 0x251f, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, }; static const unsigned short gb2312_2uni_page30[6768] = { /* 0x30 */ 0x554a, 0x963f, 0x57c3, 0x6328, 0x54ce, 0x5509, 0x54c0, 0x7691, 0x764c, 0x853c, 0x77ee, 0x827e, 0x788d, 0x7231, 0x9698, 0x978d, 0x6c28, 0x5b89, 0x4ffa, 0x6309, 0x6697, 0x5cb8, 0x80fa, 0x6848, 0x80ae, 0x6602, 0x76ce, 0x51f9, 0x6556, 0x71ac, 0x7ff1, 0x8884, 0x50b2, 0x5965, 0x61ca, 0x6fb3, 0x82ad, 0x634c, 0x6252, 0x53ed, 0x5427, 0x7b06, 0x516b, 0x75a4, 0x5df4, 0x62d4, 0x8dcb, 0x9776, 0x628a, 0x8019, 0x575d, 0x9738, 0x7f62, 0x7238, 0x767d, 0x67cf, 0x767e, 0x6446, 0x4f70, 0x8d25, 0x62dc, 0x7a17, 0x6591, 0x73ed, 0x642c, 0x6273, 0x822c, 0x9881, 0x677f, 0x7248, 0x626e, 0x62cc, 0x4f34, 0x74e3, 0x534a, 0x529e, 0x7eca, 0x90a6, 0x5e2e, 0x6886, 0x699c, 0x8180, 0x7ed1, 0x68d2, 0x78c5, 0x868c, 0x9551, 0x508d, 0x8c24, 0x82de, 0x80de, 0x5305, 0x8912, 0x5265, /* 0x31 */ 0x8584, 0x96f9, 0x4fdd, 0x5821, 0x9971, 0x5b9d, 0x62b1, 0x62a5, 0x66b4, 0x8c79, 0x9c8d, 0x7206, 0x676f, 0x7891, 0x60b2, 0x5351, 0x5317, 0x8f88, 0x80cc, 0x8d1d, 0x94a1, 0x500d, 0x72c8, 0x5907, 0x60eb, 0x7119, 0x88ab, 0x5954, 0x82ef, 0x672c, 0x7b28, 0x5d29, 0x7ef7, 0x752d, 0x6cf5, 0x8e66, 0x8ff8, 0x903c, 0x9f3b, 0x6bd4, 0x9119, 0x7b14, 0x5f7c, 0x78a7, 0x84d6, 0x853d, 0x6bd5, 0x6bd9, 0x6bd6, 0x5e01, 0x5e87, 0x75f9, 0x95ed, 0x655d, 0x5f0a, 0x5fc5, 0x8f9f, 0x58c1, 0x81c2, 0x907f, 0x965b, 0x97ad, 0x8fb9, 0x7f16, 0x8d2c, 0x6241, 0x4fbf, 0x53d8, 0x535e, 0x8fa8, 0x8fa9, 0x8fab, 0x904d, 0x6807, 0x5f6a, 0x8198, 0x8868, 0x9cd6, 0x618b, 0x522b, 0x762a, 0x5f6c, 0x658c, 0x6fd2, 0x6ee8, 0x5bbe, 0x6448, 0x5175, 0x51b0, 0x67c4, 0x4e19, 0x79c9, 0x997c, 0x70b3, /* 0x32 */ 0x75c5, 0x5e76, 0x73bb, 0x83e0, 0x64ad, 0x62e8, 0x94b5, 0x6ce2, 0x535a, 0x52c3, 0x640f, 0x94c2, 0x7b94, 0x4f2f, 0x5e1b, 0x8236, 0x8116, 0x818a, 0x6e24, 0x6cca, 0x9a73, 0x6355, 0x535c, 0x54fa, 0x8865, 0x57e0, 0x4e0d, 0x5e03, 0x6b65, 0x7c3f, 0x90e8, 0x6016, 0x64e6, 0x731c, 0x88c1, 0x6750, 0x624d, 0x8d22, 0x776c, 0x8e29, 0x91c7, 0x5f69, 0x83dc, 0x8521, 0x9910, 0x53c2, 0x8695, 0x6b8b, 0x60ed, 0x60e8, 0x707f, 0x82cd, 0x8231, 0x4ed3, 0x6ca7, 0x85cf, 0x64cd, 0x7cd9, 0x69fd, 0x66f9, 0x8349, 0x5395, 0x7b56, 0x4fa7, 0x518c, 0x6d4b, 0x5c42, 0x8e6d, 0x63d2, 0x53c9, 0x832c, 0x8336, 0x67e5, 0x78b4, 0x643d, 0x5bdf, 0x5c94, 0x5dee, 0x8be7, 0x62c6, 0x67f4, 0x8c7a, 0x6400, 0x63ba, 0x8749, 0x998b, 0x8c17, 0x7f20, 0x94f2, 0x4ea7, 0x9610, 0x98a4, 0x660c, 0x7316, /* 0x33 */ 0x573a, 0x5c1d, 0x5e38, 0x957f, 0x507f, 0x80a0, 0x5382, 0x655e, 0x7545, 0x5531, 0x5021, 0x8d85, 0x6284, 0x949e, 0x671d, 0x5632, 0x6f6e, 0x5de2, 0x5435, 0x7092, 0x8f66, 0x626f, 0x64a4, 0x63a3, 0x5f7b, 0x6f88, 0x90f4, 0x81e3, 0x8fb0, 0x5c18, 0x6668, 0x5ff1, 0x6c89, 0x9648, 0x8d81, 0x886c, 0x6491, 0x79f0, 0x57ce, 0x6a59, 0x6210, 0x5448, 0x4e58, 0x7a0b, 0x60e9, 0x6f84, 0x8bda, 0x627f, 0x901e, 0x9a8b, 0x79e4, 0x5403, 0x75f4, 0x6301, 0x5319, 0x6c60, 0x8fdf, 0x5f1b, 0x9a70, 0x803b, 0x9f7f, 0x4f88, 0x5c3a, 0x8d64, 0x7fc5, 0x65a5, 0x70bd, 0x5145, 0x51b2, 0x866b, 0x5d07, 0x5ba0, 0x62bd, 0x916c, 0x7574, 0x8e0c, 0x7a20, 0x6101, 0x7b79, 0x4ec7, 0x7ef8, 0x7785, 0x4e11, 0x81ed, 0x521d, 0x51fa, 0x6a71, 0x53a8, 0x8e87, 0x9504, 0x96cf, 0x6ec1, 0x9664, 0x695a, /* 0x34 */ 0x7840, 0x50a8, 0x77d7, 0x6410, 0x89e6, 0x5904, 0x63e3, 0x5ddd, 0x7a7f, 0x693d, 0x4f20, 0x8239, 0x5598, 0x4e32, 0x75ae, 0x7a97, 0x5e62, 0x5e8a, 0x95ef, 0x521b, 0x5439, 0x708a, 0x6376, 0x9524, 0x5782, 0x6625, 0x693f, 0x9187, 0x5507, 0x6df3, 0x7eaf, 0x8822, 0x6233, 0x7ef0, 0x75b5, 0x8328, 0x78c1, 0x96cc, 0x8f9e, 0x6148, 0x74f7, 0x8bcd, 0x6b64, 0x523a, 0x8d50, 0x6b21, 0x806a, 0x8471, 0x56f1, 0x5306, 0x4ece, 0x4e1b, 0x51d1, 0x7c97, 0x918b, 0x7c07, 0x4fc3, 0x8e7f, 0x7be1, 0x7a9c, 0x6467, 0x5d14, 0x50ac, 0x8106, 0x7601, 0x7cb9, 0x6dec, 0x7fe0, 0x6751, 0x5b58, 0x5bf8, 0x78cb, 0x64ae, 0x6413, 0x63aa, 0x632b, 0x9519, 0x642d, 0x8fbe, 0x7b54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6b79, 0x50a3, 0x6234, 0x5e26, 0x6b86, 0x4ee3, 0x8d37, 0x888b, 0x5f85, 0x902e, /* 0x35 */ 0x6020, 0x803d, 0x62c5, 0x4e39, 0x5355, 0x90f8, 0x63b8, 0x80c6, 0x65e6, 0x6c2e, 0x4f46, 0x60ee, 0x6de1, 0x8bde, 0x5f39, 0x86cb, 0x5f53, 0x6321, 0x515a, 0x8361, 0x6863, 0x5200, 0x6363, 0x8e48, 0x5012, 0x5c9b, 0x7977, 0x5bfc, 0x5230, 0x7a3b, 0x60bc, 0x9053, 0x76d7, 0x5fb7, 0x5f97, 0x7684, 0x8e6c, 0x706f, 0x767b, 0x7b49, 0x77aa, 0x51f3, 0x9093, 0x5824, 0x4f4e, 0x6ef4, 0x8fea, 0x654c, 0x7b1b, 0x72c4, 0x6da4, 0x7fdf, 0x5ae1, 0x62b5, 0x5e95, 0x5730, 0x8482, 0x7b2c, 0x5e1d, 0x5f1f, 0x9012, 0x7f14, 0x98a0, 0x6382, 0x6ec7, 0x7898, 0x70b9, 0x5178, 0x975b, 0x57ab, 0x7535, 0x4f43, 0x7538, 0x5e97, 0x60e6, 0x5960, 0x6dc0, 0x6bbf, 0x7889, 0x53fc, 0x96d5, 0x51cb, 0x5201, 0x6389, 0x540a, 0x9493, 0x8c03, 0x8dcc, 0x7239, 0x789f, 0x8776, 0x8fed, 0x8c0d, 0x53e0, /* 0x36 */ 0x4e01, 0x76ef, 0x53ee, 0x9489, 0x9876, 0x9f0e, 0x952d, 0x5b9a, 0x8ba2, 0x4e22, 0x4e1c, 0x51ac, 0x8463, 0x61c2, 0x52a8, 0x680b, 0x4f97, 0x606b, 0x51bb, 0x6d1e, 0x515c, 0x6296, 0x6597, 0x9661, 0x8c46, 0x9017, 0x75d8, 0x90fd, 0x7763, 0x6bd2, 0x728a, 0x72ec, 0x8bfb, 0x5835, 0x7779, 0x8d4c, 0x675c, 0x9540, 0x809a, 0x5ea6, 0x6e21, 0x5992, 0x7aef, 0x77ed, 0x953b, 0x6bb5, 0x65ad, 0x7f0e, 0x5806, 0x5151, 0x961f, 0x5bf9, 0x58a9, 0x5428, 0x8e72, 0x6566, 0x987f, 0x56e4, 0x949d, 0x76fe, 0x9041, 0x6387, 0x54c6, 0x591a, 0x593a, 0x579b, 0x8eb2, 0x6735, 0x8dfa, 0x8235, 0x5241, 0x60f0, 0x5815, 0x86fe, 0x5ce8, 0x9e45, 0x4fc4, 0x989d, 0x8bb9, 0x5a25, 0x6076, 0x5384, 0x627c, 0x904f, 0x9102, 0x997f, 0x6069, 0x800c, 0x513f, 0x8033, 0x5c14, 0x9975, 0x6d31, 0x4e8c, /* 0x37 */ 0x8d30, 0x53d1, 0x7f5a, 0x7b4f, 0x4f10, 0x4e4f, 0x9600, 0x6cd5, 0x73d0, 0x85e9, 0x5e06, 0x756a, 0x7ffb, 0x6a0a, 0x77fe, 0x9492, 0x7e41, 0x51e1, 0x70e6, 0x53cd, 0x8fd4, 0x8303, 0x8d29, 0x72af, 0x996d, 0x6cdb, 0x574a, 0x82b3, 0x65b9, 0x80aa, 0x623f, 0x9632, 0x59a8, 0x4eff, 0x8bbf, 0x7eba, 0x653e, 0x83f2, 0x975e, 0x5561, 0x98de, 0x80a5, 0x532a, 0x8bfd, 0x5420, 0x80ba, 0x5e9f, 0x6cb8, 0x8d39, 0x82ac, 0x915a, 0x5429, 0x6c1b, 0x5206, 0x7eb7, 0x575f, 0x711a, 0x6c7e, 0x7c89, 0x594b, 0x4efd, 0x5fff, 0x6124, 0x7caa, 0x4e30, 0x5c01, 0x67ab, 0x8702, 0x5cf0, 0x950b, 0x98ce, 0x75af, 0x70fd, 0x9022, 0x51af, 0x7f1d, 0x8bbd, 0x5949, 0x51e4, 0x4f5b, 0x5426, 0x592b, 0x6577, 0x80a4, 0x5b75, 0x6276, 0x62c2, 0x8f90, 0x5e45, 0x6c1f, 0x7b26, 0x4f0f, 0x4fd8, 0x670d, /* 0x38 */ 0x6d6e, 0x6daa, 0x798f, 0x88b1, 0x5f17, 0x752b, 0x629a, 0x8f85, 0x4fef, 0x91dc, 0x65a7, 0x812f, 0x8151, 0x5e9c, 0x8150, 0x8d74, 0x526f, 0x8986, 0x8d4b, 0x590d, 0x5085, 0x4ed8, 0x961c, 0x7236, 0x8179, 0x8d1f, 0x5bcc, 0x8ba3, 0x9644, 0x5987, 0x7f1a, 0x5490, 0x5676, 0x560e, 0x8be5, 0x6539, 0x6982, 0x9499, 0x76d6, 0x6e89, 0x5e72, 0x7518, 0x6746, 0x67d1, 0x7aff, 0x809d, 0x8d76, 0x611f, 0x79c6, 0x6562, 0x8d63, 0x5188, 0x521a, 0x94a2, 0x7f38, 0x809b, 0x7eb2, 0x5c97, 0x6e2f, 0x6760, 0x7bd9, 0x768b, 0x9ad8, 0x818f, 0x7f94, 0x7cd5, 0x641e, 0x9550, 0x7a3f, 0x544a, 0x54e5, 0x6b4c, 0x6401, 0x6208, 0x9e3d, 0x80f3, 0x7599, 0x5272, 0x9769, 0x845b, 0x683c, 0x86e4, 0x9601, 0x9694, 0x94ec, 0x4e2a, 0x5404, 0x7ed9, 0x6839, 0x8ddf, 0x8015, 0x66f4, 0x5e9a, 0x7fb9, /* 0x39 */ 0x57c2, 0x803f, 0x6897, 0x5de5, 0x653b, 0x529f, 0x606d, 0x9f9a, 0x4f9b, 0x8eac, 0x516c, 0x5bab, 0x5f13, 0x5de9, 0x6c5e, 0x62f1, 0x8d21, 0x5171, 0x94a9, 0x52fe, 0x6c9f, 0x82df, 0x72d7, 0x57a2, 0x6784, 0x8d2d, 0x591f, 0x8f9c, 0x83c7, 0x5495, 0x7b8d, 0x4f30, 0x6cbd, 0x5b64, 0x59d1, 0x9f13, 0x53e4, 0x86ca, 0x9aa8, 0x8c37, 0x80a1, 0x6545, 0x987e, 0x56fa, 0x96c7, 0x522e, 0x74dc, 0x5250, 0x5be1, 0x6302, 0x8902, 0x4e56, 0x62d0, 0x602a, 0x68fa, 0x5173, 0x5b98, 0x51a0, 0x89c2, 0x7ba1, 0x9986, 0x7f50, 0x60ef, 0x704c, 0x8d2f, 0x5149, 0x5e7f, 0x901b, 0x7470, 0x89c4, 0x572d, 0x7845, 0x5f52, 0x9f9f, 0x95fa, 0x8f68, 0x9b3c, 0x8be1, 0x7678, 0x6842, 0x67dc, 0x8dea, 0x8d35, 0x523d, 0x8f8a, 0x6eda, 0x68cd, 0x9505, 0x90ed, 0x56fd, 0x679c, 0x88f9, 0x8fc7, 0x54c8, /* 0x3a */ 0x9ab8, 0x5b69, 0x6d77, 0x6c26, 0x4ea5, 0x5bb3, 0x9a87, 0x9163, 0x61a8, 0x90af, 0x97e9, 0x542b, 0x6db5, 0x5bd2, 0x51fd, 0x558a, 0x7f55, 0x7ff0, 0x64bc, 0x634d, 0x65f1, 0x61be, 0x608d, 0x710a, 0x6c57, 0x6c49, 0x592f, 0x676d, 0x822a, 0x58d5, 0x568e, 0x8c6a, 0x6beb, 0x90dd, 0x597d, 0x8017, 0x53f7, 0x6d69, 0x5475, 0x559d, 0x8377, 0x83cf, 0x6838, 0x79be, 0x548c, 0x4f55, 0x5408, 0x76d2, 0x8c89, 0x9602, 0x6cb3, 0x6db8, 0x8d6b, 0x8910, 0x9e64, 0x8d3a, 0x563f, 0x9ed1, 0x75d5, 0x5f88, 0x72e0, 0x6068, 0x54fc, 0x4ea8, 0x6a2a, 0x8861, 0x6052, 0x8f70, 0x54c4, 0x70d8, 0x8679, 0x9e3f, 0x6d2a, 0x5b8f, 0x5f18, 0x7ea2, 0x5589, 0x4faf, 0x7334, 0x543c, 0x539a, 0x5019, 0x540e, 0x547c, 0x4e4e, 0x5ffd, 0x745a, 0x58f6, 0x846b, 0x80e1, 0x8774, 0x72d0, 0x7cca, 0x6e56, /* 0x3b */ 0x5f27, 0x864e, 0x552c, 0x62a4, 0x4e92, 0x6caa, 0x6237, 0x82b1, 0x54d7, 0x534e, 0x733e, 0x6ed1, 0x753b, 0x5212, 0x5316, 0x8bdd, 0x69d0, 0x5f8a, 0x6000, 0x6dee, 0x574f, 0x6b22, 0x73af, 0x6853, 0x8fd8, 0x7f13, 0x6362, 0x60a3, 0x5524, 0x75ea, 0x8c62, 0x7115, 0x6da3, 0x5ba6, 0x5e7b, 0x8352, 0x614c, 0x9ec4, 0x78fa, 0x8757, 0x7c27, 0x7687, 0x51f0, 0x60f6, 0x714c, 0x6643, 0x5e4c, 0x604d, 0x8c0e, 0x7070, 0x6325, 0x8f89, 0x5fbd, 0x6062, 0x86d4, 0x56de, 0x6bc1, 0x6094, 0x6167, 0x5349, 0x60e0, 0x6666, 0x8d3f, 0x79fd, 0x4f1a, 0x70e9, 0x6c47, 0x8bb3, 0x8bf2, 0x7ed8, 0x8364, 0x660f, 0x5a5a, 0x9b42, 0x6d51, 0x6df7, 0x8c41, 0x6d3b, 0x4f19, 0x706b, 0x83b7, 0x6216, 0x60d1, 0x970d, 0x8d27, 0x7978, 0x51fb, 0x573e, 0x57fa, 0x673a, 0x7578, 0x7a3d, 0x79ef, 0x7b95, /* 0x3c */ 0x808c, 0x9965, 0x8ff9, 0x6fc0, 0x8ba5, 0x9e21, 0x59ec, 0x7ee9, 0x7f09, 0x5409, 0x6781, 0x68d8, 0x8f91, 0x7c4d, 0x96c6, 0x53ca, 0x6025, 0x75be, 0x6c72, 0x5373, 0x5ac9, 0x7ea7, 0x6324, 0x51e0, 0x810a, 0x5df1, 0x84df, 0x6280, 0x5180, 0x5b63, 0x4f0e, 0x796d, 0x5242, 0x60b8, 0x6d4e, 0x5bc4, 0x5bc2, 0x8ba1, 0x8bb0, 0x65e2, 0x5fcc, 0x9645, 0x5993, 0x7ee7, 0x7eaa, 0x5609, 0x67b7, 0x5939, 0x4f73, 0x5bb6, 0x52a0, 0x835a, 0x988a, 0x8d3e, 0x7532, 0x94be, 0x5047, 0x7a3c, 0x4ef7, 0x67b6, 0x9a7e, 0x5ac1, 0x6b7c, 0x76d1, 0x575a, 0x5c16, 0x7b3a, 0x95f4, 0x714e, 0x517c, 0x80a9, 0x8270, 0x5978, 0x7f04, 0x8327, 0x68c0, 0x67ec, 0x78b1, 0x7877, 0x62e3, 0x6361, 0x7b80, 0x4fed, 0x526a, 0x51cf, 0x8350, 0x69db, 0x9274, 0x8df5, 0x8d31, 0x89c1, 0x952e, 0x7bad, 0x4ef6, /* 0x3d */ 0x5065, 0x8230, 0x5251, 0x996f, 0x6e10, 0x6e85, 0x6da7, 0x5efa, 0x50f5, 0x59dc, 0x5c06, 0x6d46, 0x6c5f, 0x7586, 0x848b, 0x6868, 0x5956, 0x8bb2, 0x5320, 0x9171, 0x964d, 0x8549, 0x6912, 0x7901, 0x7126, 0x80f6, 0x4ea4, 0x90ca, 0x6d47, 0x9a84, 0x5a07, 0x56bc, 0x6405, 0x94f0, 0x77eb, 0x4fa5, 0x811a, 0x72e1, 0x89d2, 0x997a, 0x7f34, 0x7ede, 0x527f, 0x6559, 0x9175, 0x8f7f, 0x8f83, 0x53eb, 0x7a96, 0x63ed, 0x63a5, 0x7686, 0x79f8, 0x8857, 0x9636, 0x622a, 0x52ab, 0x8282, 0x6854, 0x6770, 0x6377, 0x776b, 0x7aed, 0x6d01, 0x7ed3, 0x89e3, 0x59d0, 0x6212, 0x85c9, 0x82a5, 0x754c, 0x501f, 0x4ecb, 0x75a5, 0x8beb, 0x5c4a, 0x5dfe, 0x7b4b, 0x65a4, 0x91d1, 0x4eca, 0x6d25, 0x895f, 0x7d27, 0x9526, 0x4ec5, 0x8c28, 0x8fdb, 0x9773, 0x664b, 0x7981, 0x8fd1, 0x70ec, 0x6d78, /* 0x3e */ 0x5c3d, 0x52b2, 0x8346, 0x5162, 0x830e, 0x775b, 0x6676, 0x9cb8, 0x4eac, 0x60ca, 0x7cbe, 0x7cb3, 0x7ecf, 0x4e95, 0x8b66, 0x666f, 0x9888, 0x9759, 0x5883, 0x656c, 0x955c, 0x5f84, 0x75c9, 0x9756, 0x7adf, 0x7ade, 0x51c0, 0x70af, 0x7a98, 0x63ea, 0x7a76, 0x7ea0, 0x7396, 0x97ed, 0x4e45, 0x7078, 0x4e5d, 0x9152, 0x53a9, 0x6551, 0x65e7, 0x81fc, 0x8205, 0x548e, 0x5c31, 0x759a, 0x97a0, 0x62d8, 0x72d9, 0x75bd, 0x5c45, 0x9a79, 0x83ca, 0x5c40, 0x5480, 0x77e9, 0x4e3e, 0x6cae, 0x805a, 0x62d2, 0x636e, 0x5de8, 0x5177, 0x8ddd, 0x8e1e, 0x952f, 0x4ff1, 0x53e5, 0x60e7, 0x70ac, 0x5267, 0x6350, 0x9e43, 0x5a1f, 0x5026, 0x7737, 0x5377, 0x7ee2, 0x6485, 0x652b, 0x6289, 0x6398, 0x5014, 0x7235, 0x89c9, 0x51b3, 0x8bc0, 0x7edd, 0x5747, 0x83cc, 0x94a7, 0x519b, 0x541b, 0x5cfb, /* 0x3f */ 0x4fca, 0x7ae3, 0x6d5a, 0x90e1, 0x9a8f, 0x5580, 0x5496, 0x5361, 0x54af, 0x5f00, 0x63e9, 0x6977, 0x51ef, 0x6168, 0x520a, 0x582a, 0x52d8, 0x574e, 0x780d, 0x770b, 0x5eb7, 0x6177, 0x7ce0, 0x625b, 0x6297, 0x4ea2, 0x7095, 0x8003, 0x62f7, 0x70e4, 0x9760, 0x5777, 0x82db, 0x67ef, 0x68f5, 0x78d5, 0x9897, 0x79d1, 0x58f3, 0x54b3, 0x53ef, 0x6e34, 0x514b, 0x523b, 0x5ba2, 0x8bfe, 0x80af, 0x5543, 0x57a6, 0x6073, 0x5751, 0x542d, 0x7a7a, 0x6050, 0x5b54, 0x63a7, 0x62a0, 0x53e3, 0x6263, 0x5bc7, 0x67af, 0x54ed, 0x7a9f, 0x82e6, 0x9177, 0x5e93, 0x88e4, 0x5938, 0x57ae, 0x630e, 0x8de8, 0x80ef, 0x5757, 0x7b77, 0x4fa9, 0x5feb, 0x5bbd, 0x6b3e, 0x5321, 0x7b50, 0x72c2, 0x6846, 0x77ff, 0x7736, 0x65f7, 0x51b5, 0x4e8f, 0x76d4, 0x5cbf, 0x7aa5, 0x8475, 0x594e, 0x9b41, 0x5080, /* 0x40 */ 0x9988, 0x6127, 0x6e83, 0x5764, 0x6606, 0x6346, 0x56f0, 0x62ec, 0x6269, 0x5ed3, 0x9614, 0x5783, 0x62c9, 0x5587, 0x8721, 0x814a, 0x8fa3, 0x5566, 0x83b1, 0x6765, 0x8d56, 0x84dd, 0x5a6a, 0x680f, 0x62e6, 0x7bee, 0x9611, 0x5170, 0x6f9c, 0x8c30, 0x63fd, 0x89c8, 0x61d2, 0x7f06, 0x70c2, 0x6ee5, 0x7405, 0x6994, 0x72fc, 0x5eca, 0x90ce, 0x6717, 0x6d6a, 0x635e, 0x52b3, 0x7262, 0x8001, 0x4f6c, 0x59e5, 0x916a, 0x70d9, 0x6d9d, 0x52d2, 0x4e50, 0x96f7, 0x956d, 0x857e, 0x78ca, 0x7d2f, 0x5121, 0x5792, 0x64c2, 0x808b, 0x7c7b, 0x6cea, 0x68f1, 0x695e, 0x51b7, 0x5398, 0x68a8, 0x7281, 0x9ece, 0x7bf1, 0x72f8, 0x79bb, 0x6f13, 0x7406, 0x674e, 0x91cc, 0x9ca4, 0x793c, 0x8389, 0x8354, 0x540f, 0x6817, 0x4e3d, 0x5389, 0x52b1, 0x783e, 0x5386, 0x5229, 0x5088, 0x4f8b, 0x4fd0, /* 0x41 */ 0x75e2, 0x7acb, 0x7c92, 0x6ca5, 0x96b6, 0x529b, 0x7483, 0x54e9, 0x4fe9, 0x8054, 0x83b2, 0x8fde, 0x9570, 0x5ec9, 0x601c, 0x6d9f, 0x5e18, 0x655b, 0x8138, 0x94fe, 0x604b, 0x70bc, 0x7ec3, 0x7cae, 0x51c9, 0x6881, 0x7cb1, 0x826f, 0x4e24, 0x8f86, 0x91cf, 0x667e, 0x4eae, 0x8c05, 0x64a9, 0x804a, 0x50da, 0x7597, 0x71ce, 0x5be5, 0x8fbd, 0x6f66, 0x4e86, 0x6482, 0x9563, 0x5ed6, 0x6599, 0x5217, 0x88c2, 0x70c8, 0x52a3, 0x730e, 0x7433, 0x6797, 0x78f7, 0x9716, 0x4e34, 0x90bb, 0x9cde, 0x6dcb, 0x51db, 0x8d41, 0x541d, 0x62ce, 0x73b2, 0x83f1, 0x96f6, 0x9f84, 0x94c3, 0x4f36, 0x7f9a, 0x51cc, 0x7075, 0x9675, 0x5cad, 0x9886, 0x53e6, 0x4ee4, 0x6e9c, 0x7409, 0x69b4, 0x786b, 0x998f, 0x7559, 0x5218, 0x7624, 0x6d41, 0x67f3, 0x516d, 0x9f99, 0x804b, 0x5499, 0x7b3c, 0x7abf, /* 0x42 */ 0x9686, 0x5784, 0x62e2, 0x9647, 0x697c, 0x5a04, 0x6402, 0x7bd3, 0x6f0f, 0x964b, 0x82a6, 0x5362, 0x9885, 0x5e90, 0x7089, 0x63b3, 0x5364, 0x864f, 0x9c81, 0x9e93, 0x788c, 0x9732, 0x8def, 0x8d42, 0x9e7f, 0x6f5e, 0x7984, 0x5f55, 0x9646, 0x622e, 0x9a74, 0x5415, 0x94dd, 0x4fa3, 0x65c5, 0x5c65, 0x5c61, 0x7f15, 0x8651, 0x6c2f, 0x5f8b, 0x7387, 0x6ee4, 0x7eff, 0x5ce6, 0x631b, 0x5b6a, 0x6ee6, 0x5375, 0x4e71, 0x63a0, 0x7565, 0x62a1, 0x8f6e, 0x4f26, 0x4ed1, 0x6ca6, 0x7eb6, 0x8bba, 0x841d, 0x87ba, 0x7f57, 0x903b, 0x9523, 0x7ba9, 0x9aa1, 0x88f8, 0x843d, 0x6d1b, 0x9a86, 0x7edc, 0x5988, 0x9ebb, 0x739b, 0x7801, 0x8682, 0x9a6c, 0x9a82, 0x561b, 0x5417, 0x57cb, 0x4e70, 0x9ea6, 0x5356, 0x8fc8, 0x8109, 0x7792, 0x9992, 0x86ee, 0x6ee1, 0x8513, 0x66fc, 0x6162, 0x6f2b, /* 0x43 */ 0x8c29, 0x8292, 0x832b, 0x76f2, 0x6c13, 0x5fd9, 0x83bd, 0x732b, 0x8305, 0x951a, 0x6bdb, 0x77db, 0x94c6, 0x536f, 0x8302, 0x5192, 0x5e3d, 0x8c8c, 0x8d38, 0x4e48, 0x73ab, 0x679a, 0x6885, 0x9176, 0x9709, 0x7164, 0x6ca1, 0x7709, 0x5a92, 0x9541, 0x6bcf, 0x7f8e, 0x6627, 0x5bd0, 0x59b9, 0x5a9a, 0x95e8, 0x95f7, 0x4eec, 0x840c, 0x8499, 0x6aac, 0x76df, 0x9530, 0x731b, 0x68a6, 0x5b5f, 0x772f, 0x919a, 0x9761, 0x7cdc, 0x8ff7, 0x8c1c, 0x5f25, 0x7c73, 0x79d8, 0x89c5, 0x6ccc, 0x871c, 0x5bc6, 0x5e42, 0x68c9, 0x7720, 0x7ef5, 0x5195, 0x514d, 0x52c9, 0x5a29, 0x7f05, 0x9762, 0x82d7, 0x63cf, 0x7784, 0x85d0, 0x79d2, 0x6e3a, 0x5e99, 0x5999, 0x8511, 0x706d, 0x6c11, 0x62bf, 0x76bf, 0x654f, 0x60af, 0x95fd, 0x660e, 0x879f, 0x9e23, 0x94ed, 0x540d, 0x547d, 0x8c2c, 0x6478, /* 0x44 */ 0x6479, 0x8611, 0x6a21, 0x819c, 0x78e8, 0x6469, 0x9b54, 0x62b9, 0x672b, 0x83ab, 0x58a8, 0x9ed8, 0x6cab, 0x6f20, 0x5bde, 0x964c, 0x8c0b, 0x725f, 0x67d0, 0x62c7, 0x7261, 0x4ea9, 0x59c6, 0x6bcd, 0x5893, 0x66ae, 0x5e55, 0x52df, 0x6155, 0x6728, 0x76ee, 0x7766, 0x7267, 0x7a46, 0x62ff, 0x54ea, 0x5450, 0x94a0, 0x90a3, 0x5a1c, 0x7eb3, 0x6c16, 0x4e43, 0x5976, 0x8010, 0x5948, 0x5357, 0x7537, 0x96be, 0x56ca, 0x6320, 0x8111, 0x607c, 0x95f9, 0x6dd6, 0x5462, 0x9981, 0x5185, 0x5ae9, 0x80fd, 0x59ae, 0x9713, 0x502a, 0x6ce5, 0x5c3c, 0x62df, 0x4f60, 0x533f, 0x817b, 0x9006, 0x6eba, 0x852b, 0x62c8, 0x5e74, 0x78be, 0x64b5, 0x637b, 0x5ff5, 0x5a18, 0x917f, 0x9e1f, 0x5c3f, 0x634f, 0x8042, 0x5b7d, 0x556e, 0x954a, 0x954d, 0x6d85, 0x60a8, 0x67e0, 0x72de, 0x51dd, 0x5b81, /* 0x45 */ 0x62e7, 0x6cde, 0x725b, 0x626d, 0x94ae, 0x7ebd, 0x8113, 0x6d53, 0x519c, 0x5f04, 0x5974, 0x52aa, 0x6012, 0x5973, 0x6696, 0x8650, 0x759f, 0x632a, 0x61e6, 0x7cef, 0x8bfa, 0x54e6, 0x6b27, 0x9e25, 0x6bb4, 0x85d5, 0x5455, 0x5076, 0x6ca4, 0x556a, 0x8db4, 0x722c, 0x5e15, 0x6015, 0x7436, 0x62cd, 0x6392, 0x724c, 0x5f98, 0x6e43, 0x6d3e, 0x6500, 0x6f58, 0x76d8, 0x78d0, 0x76fc, 0x7554, 0x5224, 0x53db, 0x4e53, 0x5e9e, 0x65c1, 0x802a, 0x80d6, 0x629b, 0x5486, 0x5228, 0x70ae, 0x888d, 0x8dd1, 0x6ce1, 0x5478, 0x80da, 0x57f9, 0x88f4, 0x8d54, 0x966a, 0x914d, 0x4f69, 0x6c9b, 0x55b7, 0x76c6, 0x7830, 0x62a8, 0x70f9, 0x6f8e, 0x5f6d, 0x84ec, 0x68da, 0x787c, 0x7bf7, 0x81a8, 0x670b, 0x9e4f, 0x6367, 0x78b0, 0x576f, 0x7812, 0x9739, 0x6279, 0x62ab, 0x5288, 0x7435, 0x6bd7, /* 0x46 */ 0x5564, 0x813e, 0x75b2, 0x76ae, 0x5339, 0x75de, 0x50fb, 0x5c41, 0x8b6c, 0x7bc7, 0x504f, 0x7247, 0x9a97, 0x98d8, 0x6f02, 0x74e2, 0x7968, 0x6487, 0x77a5, 0x62fc, 0x9891, 0x8d2b, 0x54c1, 0x8058, 0x4e52, 0x576a, 0x82f9, 0x840d, 0x5e73, 0x51ed, 0x74f6, 0x8bc4, 0x5c4f, 0x5761, 0x6cfc, 0x9887, 0x5a46, 0x7834, 0x9b44, 0x8feb, 0x7c95, 0x5256, 0x6251, 0x94fa, 0x4ec6, 0x8386, 0x8461, 0x83e9, 0x84b2, 0x57d4, 0x6734, 0x5703, 0x666e, 0x6d66, 0x8c31, 0x66dd, 0x7011, 0x671f, 0x6b3a, 0x6816, 0x621a, 0x59bb, 0x4e03, 0x51c4, 0x6f06, 0x67d2, 0x6c8f, 0x5176, 0x68cb, 0x5947, 0x6b67, 0x7566, 0x5d0e, 0x8110, 0x9f50, 0x65d7, 0x7948, 0x7941, 0x9a91, 0x8d77, 0x5c82, 0x4e5e, 0x4f01, 0x542f, 0x5951, 0x780c, 0x5668, 0x6c14, 0x8fc4, 0x5f03, 0x6c7d, 0x6ce3, 0x8bab, 0x6390, /* 0x47 */ 0x6070, 0x6d3d, 0x7275, 0x6266, 0x948e, 0x94c5, 0x5343, 0x8fc1, 0x7b7e, 0x4edf, 0x8c26, 0x4e7e, 0x9ed4, 0x94b1, 0x94b3, 0x524d, 0x6f5c, 0x9063, 0x6d45, 0x8c34, 0x5811, 0x5d4c, 0x6b20, 0x6b49, 0x67aa, 0x545b, 0x8154, 0x7f8c, 0x5899, 0x8537, 0x5f3a, 0x62a2, 0x6a47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77a7, 0x4e54, 0x4fa8, 0x5de7, 0x9798, 0x64ac, 0x7fd8, 0x5ced, 0x4fcf, 0x7a8d, 0x5207, 0x8304, 0x4e14, 0x602f, 0x7a83, 0x94a6, 0x4fb5, 0x4eb2, 0x79e6, 0x7434, 0x52e4, 0x82b9, 0x64d2, 0x79bd, 0x5bdd, 0x6c81, 0x9752, 0x8f7b, 0x6c22, 0x503e, 0x537f, 0x6e05, 0x64ce, 0x6674, 0x6c30, 0x60c5, 0x9877, 0x8bf7, 0x5e86, 0x743c, 0x7a77, 0x79cb, 0x4e18, 0x90b1, 0x7403, 0x6c42, 0x56da, 0x914b, 0x6cc5, 0x8d8b, 0x533a, 0x86c6, 0x66f2, 0x8eaf, 0x5c48, 0x9a71, 0x6e20, /* 0x48 */ 0x53d6, 0x5a36, 0x9f8b, 0x8da3, 0x53bb, 0x5708, 0x98a7, 0x6743, 0x919b, 0x6cc9, 0x5168, 0x75ca, 0x62f3, 0x72ac, 0x5238, 0x529d, 0x7f3a, 0x7094, 0x7638, 0x5374, 0x9e4a, 0x69b7, 0x786e, 0x96c0, 0x88d9, 0x7fa4, 0x7136, 0x71c3, 0x5189, 0x67d3, 0x74e4, 0x58e4, 0x6518, 0x56b7, 0x8ba9, 0x9976, 0x6270, 0x7ed5, 0x60f9, 0x70ed, 0x58ec, 0x4ec1, 0x4eba, 0x5fcd, 0x97e7, 0x4efb, 0x8ba4, 0x5203, 0x598a, 0x7eab, 0x6254, 0x4ecd, 0x65e5, 0x620e, 0x8338, 0x84c9, 0x8363, 0x878d, 0x7194, 0x6eb6, 0x5bb9, 0x7ed2, 0x5197, 0x63c9, 0x67d4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5b7a, 0x5982, 0x8fb1, 0x4e73, 0x6c5d, 0x5165, 0x8925, 0x8f6f, 0x962e, 0x854a, 0x745e, 0x9510, 0x95f0, 0x6da6, 0x82e5, 0x5f31, 0x6492, 0x6d12, 0x8428, 0x816e, 0x9cc3, 0x585e, 0x8d5b, 0x4e09, 0x53c1, /* 0x49 */ 0x4f1e, 0x6563, 0x6851, 0x55d3, 0x4e27, 0x6414, 0x9a9a, 0x626b, 0x5ac2, 0x745f, 0x8272, 0x6da9, 0x68ee, 0x50e7, 0x838e, 0x7802, 0x6740, 0x5239, 0x6c99, 0x7eb1, 0x50bb, 0x5565, 0x715e, 0x7b5b, 0x6652, 0x73ca, 0x82eb, 0x6749, 0x5c71, 0x5220, 0x717d, 0x886b, 0x95ea, 0x9655, 0x64c5, 0x8d61, 0x81b3, 0x5584, 0x6c55, 0x6247, 0x7f2e, 0x5892, 0x4f24, 0x5546, 0x8d4f, 0x664c, 0x4e0a, 0x5c1a, 0x88f3, 0x68a2, 0x634e, 0x7a0d, 0x70e7, 0x828d, 0x52fa, 0x97f6, 0x5c11, 0x54e8, 0x90b5, 0x7ecd, 0x5962, 0x8d4a, 0x86c7, 0x820c, 0x820d, 0x8d66, 0x6444, 0x5c04, 0x6151, 0x6d89, 0x793e, 0x8bbe, 0x7837, 0x7533, 0x547b, 0x4f38, 0x8eab, 0x6df1, 0x5a20, 0x7ec5, 0x795e, 0x6c88, 0x5ba1, 0x5a76, 0x751a, 0x80be, 0x614e, 0x6e17, 0x58f0, 0x751f, 0x7525, 0x7272, 0x5347, 0x7ef3, /* 0x4a */ 0x7701, 0x76db, 0x5269, 0x80dc, 0x5723, 0x5e08, 0x5931, 0x72ee, 0x65bd, 0x6e7f, 0x8bd7, 0x5c38, 0x8671, 0x5341, 0x77f3, 0x62fe, 0x65f6, 0x4ec0, 0x98df, 0x8680, 0x5b9e, 0x8bc6, 0x53f2, 0x77e2, 0x4f7f, 0x5c4e, 0x9a76, 0x59cb, 0x5f0f, 0x793a, 0x58eb, 0x4e16, 0x67ff, 0x4e8b, 0x62ed, 0x8a93, 0x901d, 0x52bf, 0x662f, 0x55dc, 0x566c, 0x9002, 0x4ed5, 0x4f8d, 0x91ca, 0x9970, 0x6c0f, 0x5e02, 0x6043, 0x5ba4, 0x89c6, 0x8bd5, 0x6536, 0x624b, 0x9996, 0x5b88, 0x5bff, 0x6388, 0x552e, 0x53d7, 0x7626, 0x517d, 0x852c, 0x67a2, 0x68b3, 0x6b8a, 0x6292, 0x8f93, 0x53d4, 0x8212, 0x6dd1, 0x758f, 0x4e66, 0x8d4e, 0x5b70, 0x719f, 0x85af, 0x6691, 0x66d9, 0x7f72, 0x8700, 0x9ecd, 0x9f20, 0x5c5e, 0x672f, 0x8ff0, 0x6811, 0x675f, 0x620d, 0x7ad6, 0x5885, 0x5eb6, 0x6570, 0x6f31, /* 0x4b */ 0x6055, 0x5237, 0x800d, 0x6454, 0x8870, 0x7529, 0x5e05, 0x6813, 0x62f4, 0x971c, 0x53cc, 0x723d, 0x8c01, 0x6c34, 0x7761, 0x7a0e, 0x542e, 0x77ac, 0x987a, 0x821c, 0x8bf4, 0x7855, 0x6714, 0x70c1, 0x65af, 0x6495, 0x5636, 0x601d, 0x79c1, 0x53f8, 0x4e1d, 0x6b7b, 0x8086, 0x5bfa, 0x55e3, 0x56db, 0x4f3a, 0x4f3c, 0x9972, 0x5df3, 0x677e, 0x8038, 0x6002, 0x9882, 0x9001, 0x5b8b, 0x8bbc, 0x8bf5, 0x641c, 0x8258, 0x64de, 0x55fd, 0x82cf, 0x9165, 0x4fd7, 0x7d20, 0x901f, 0x7c9f, 0x50f3, 0x5851, 0x6eaf, 0x5bbf, 0x8bc9, 0x8083, 0x9178, 0x849c, 0x7b97, 0x867d, 0x968b, 0x968f, 0x7ee5, 0x9ad3, 0x788e, 0x5c81, 0x7a57, 0x9042, 0x96a7, 0x795f, 0x5b59, 0x635f, 0x7b0b, 0x84d1, 0x68ad, 0x5506, 0x7f29, 0x7410, 0x7d22, 0x9501, 0x6240, 0x584c, 0x4ed6, 0x5b83, 0x5979, 0x5854, /* 0x4c */ 0x736d, 0x631e, 0x8e4b, 0x8e0f, 0x80ce, 0x82d4, 0x62ac, 0x53f0, 0x6cf0, 0x915e, 0x592a, 0x6001, 0x6c70, 0x574d, 0x644a, 0x8d2a, 0x762b, 0x6ee9, 0x575b, 0x6a80, 0x75f0, 0x6f6d, 0x8c2d, 0x8c08, 0x5766, 0x6bef, 0x8892, 0x78b3, 0x63a2, 0x53f9, 0x70ad, 0x6c64, 0x5858, 0x642a, 0x5802, 0x68e0, 0x819b, 0x5510, 0x7cd6, 0x5018, 0x8eba, 0x6dcc, 0x8d9f, 0x70eb, 0x638f, 0x6d9b, 0x6ed4, 0x7ee6, 0x8404, 0x6843, 0x9003, 0x6dd8, 0x9676, 0x8ba8, 0x5957, 0x7279, 0x85e4, 0x817e, 0x75bc, 0x8a8a, 0x68af, 0x5254, 0x8e22, 0x9511, 0x63d0, 0x9898, 0x8e44, 0x557c, 0x4f53, 0x66ff, 0x568f, 0x60d5, 0x6d95, 0x5243, 0x5c49, 0x5929, 0x6dfb, 0x586b, 0x7530, 0x751c, 0x606c, 0x8214, 0x8146, 0x6311, 0x6761, 0x8fe2, 0x773a, 0x8df3, 0x8d34, 0x94c1, 0x5e16, 0x5385, 0x542c, 0x70c3, /* 0x4d */ 0x6c40, 0x5ef7, 0x505c, 0x4ead, 0x5ead, 0x633a, 0x8247, 0x901a, 0x6850, 0x916e, 0x77b3, 0x540c, 0x94dc, 0x5f64, 0x7ae5, 0x6876, 0x6345, 0x7b52, 0x7edf, 0x75db, 0x5077, 0x6295, 0x5934, 0x900f, 0x51f8, 0x79c3, 0x7a81, 0x56fe, 0x5f92, 0x9014, 0x6d82, 0x5c60, 0x571f, 0x5410, 0x5154, 0x6e4d, 0x56e2, 0x63a8, 0x9893, 0x817f, 0x8715, 0x892a, 0x9000, 0x541e, 0x5c6f, 0x81c0, 0x62d6, 0x6258, 0x8131, 0x9e35, 0x9640, 0x9a6e, 0x9a7c, 0x692d, 0x59a5, 0x62d3, 0x553e, 0x6316, 0x54c7, 0x86d9, 0x6d3c, 0x5a03, 0x74e6, 0x889c, 0x6b6a, 0x5916, 0x8c4c, 0x5f2f, 0x6e7e, 0x73a9, 0x987d, 0x4e38, 0x70f7, 0x5b8c, 0x7897, 0x633d, 0x665a, 0x7696, 0x60cb, 0x5b9b, 0x5a49, 0x4e07, 0x8155, 0x6c6a, 0x738b, 0x4ea1, 0x6789, 0x7f51, 0x5f80, 0x65fa, 0x671b, 0x5fd8, 0x5984, 0x5a01, /* 0x4e */ 0x5dcd, 0x5fae, 0x5371, 0x97e6, 0x8fdd, 0x6845, 0x56f4, 0x552f, 0x60df, 0x4e3a, 0x6f4d, 0x7ef4, 0x82c7, 0x840e, 0x59d4, 0x4f1f, 0x4f2a, 0x5c3e, 0x7eac, 0x672a, 0x851a, 0x5473, 0x754f, 0x80c3, 0x5582, 0x9b4f, 0x4f4d, 0x6e2d, 0x8c13, 0x5c09, 0x6170, 0x536b, 0x761f, 0x6e29, 0x868a, 0x6587, 0x95fb, 0x7eb9, 0x543b, 0x7a33, 0x7d0a, 0x95ee, 0x55e1, 0x7fc1, 0x74ee, 0x631d, 0x8717, 0x6da1, 0x7a9d, 0x6211, 0x65a1, 0x5367, 0x63e1, 0x6c83, 0x5deb, 0x545c, 0x94a8, 0x4e4c, 0x6c61, 0x8bec, 0x5c4b, 0x65e0, 0x829c, 0x68a7, 0x543e, 0x5434, 0x6bcb, 0x6b66, 0x4e94, 0x6342, 0x5348, 0x821e, 0x4f0d, 0x4fae, 0x575e, 0x620a, 0x96fe, 0x6664, 0x7269, 0x52ff, 0x52a1, 0x609f, 0x8bef, 0x6614, 0x7199, 0x6790, 0x897f, 0x7852, 0x77fd, 0x6670, 0x563b, 0x5438, 0x9521, 0x727a, /* 0x4f */ 0x7a00, 0x606f, 0x5e0c, 0x6089, 0x819d, 0x5915, 0x60dc, 0x7184, 0x70ef, 0x6eaa, 0x6c50, 0x7280, 0x6a84, 0x88ad, 0x5e2d, 0x4e60, 0x5ab3, 0x559c, 0x94e3, 0x6d17, 0x7cfb, 0x9699, 0x620f, 0x7ec6, 0x778e, 0x867e, 0x5323, 0x971e, 0x8f96, 0x6687, 0x5ce1, 0x4fa0, 0x72ed, 0x4e0b, 0x53a6, 0x590f, 0x5413, 0x6380, 0x9528, 0x5148, 0x4ed9, 0x9c9c, 0x7ea4, 0x54b8, 0x8d24, 0x8854, 0x8237, 0x95f2, 0x6d8e, 0x5f26, 0x5acc, 0x663e, 0x9669, 0x73b0, 0x732e, 0x53bf, 0x817a, 0x9985, 0x7fa1, 0x5baa, 0x9677, 0x9650, 0x7ebf, 0x76f8, 0x53a2, 0x9576, 0x9999, 0x7bb1, 0x8944, 0x6e58, 0x4e61, 0x7fd4, 0x7965, 0x8be6, 0x60f3, 0x54cd, 0x4eab, 0x9879, 0x5df7, 0x6a61, 0x50cf, 0x5411, 0x8c61, 0x8427, 0x785d, 0x9704, 0x524a, 0x54ee, 0x56a3, 0x9500, 0x6d88, 0x5bb5, 0x6dc6, 0x6653, /* 0x50 */ 0x5c0f, 0x5b5d, 0x6821, 0x8096, 0x5578, 0x7b11, 0x6548, 0x6954, 0x4e9b, 0x6b47, 0x874e, 0x978b, 0x534f, 0x631f, 0x643a, 0x90aa, 0x659c, 0x80c1, 0x8c10, 0x5199, 0x68b0, 0x5378, 0x87f9, 0x61c8, 0x6cc4, 0x6cfb, 0x8c22, 0x5c51, 0x85aa, 0x82af, 0x950c, 0x6b23, 0x8f9b, 0x65b0, 0x5ffb, 0x5fc3, 0x4fe1, 0x8845, 0x661f, 0x8165, 0x7329, 0x60fa, 0x5174, 0x5211, 0x578b, 0x5f62, 0x90a2, 0x884c, 0x9192, 0x5e78, 0x674f, 0x6027, 0x59d3, 0x5144, 0x51f6, 0x80f8, 0x5308, 0x6c79, 0x96c4, 0x718a, 0x4f11, 0x4fee, 0x7f9e, 0x673d, 0x55c5, 0x9508, 0x79c0, 0x8896, 0x7ee3, 0x589f, 0x620c, 0x9700, 0x865a, 0x5618, 0x987b, 0x5f90, 0x8bb8, 0x84c4, 0x9157, 0x53d9, 0x65ed, 0x5e8f, 0x755c, 0x6064, 0x7d6e, 0x5a7f, 0x7eea, 0x7eed, 0x8f69, 0x55a7, 0x5ba3, 0x60ac, 0x65cb, 0x7384, /* 0x51 */ 0x9009, 0x7663, 0x7729, 0x7eda, 0x9774, 0x859b, 0x5b66, 0x7a74, 0x96ea, 0x8840, 0x52cb, 0x718f, 0x5faa, 0x65ec, 0x8be2, 0x5bfb, 0x9a6f, 0x5de1, 0x6b89, 0x6c5b, 0x8bad, 0x8baf, 0x900a, 0x8fc5, 0x538b, 0x62bc, 0x9e26, 0x9e2d, 0x5440, 0x4e2b, 0x82bd, 0x7259, 0x869c, 0x5d16, 0x8859, 0x6daf, 0x96c5, 0x54d1, 0x4e9a, 0x8bb6, 0x7109, 0x54bd, 0x9609, 0x70df, 0x6df9, 0x76d0, 0x4e25, 0x7814, 0x8712, 0x5ca9, 0x5ef6, 0x8a00, 0x989c, 0x960e, 0x708e, 0x6cbf, 0x5944, 0x63a9, 0x773c, 0x884d, 0x6f14, 0x8273, 0x5830, 0x71d5, 0x538c, 0x781a, 0x96c1, 0x5501, 0x5f66, 0x7130, 0x5bb4, 0x8c1a, 0x9a8c, 0x6b83, 0x592e, 0x9e2f, 0x79e7, 0x6768, 0x626c, 0x4f6f, 0x75a1, 0x7f8a, 0x6d0b, 0x9633, 0x6c27, 0x4ef0, 0x75d2, 0x517b, 0x6837, 0x6f3e, 0x9080, 0x8170, 0x5996, 0x7476, /* 0x52 */ 0x6447, 0x5c27, 0x9065, 0x7a91, 0x8c23, 0x59da, 0x54ac, 0x8200, 0x836f, 0x8981, 0x8000, 0x6930, 0x564e, 0x8036, 0x7237, 0x91ce, 0x51b6, 0x4e5f, 0x9875, 0x6396, 0x4e1a, 0x53f6, 0x66f3, 0x814b, 0x591c, 0x6db2, 0x4e00, 0x58f9, 0x533b, 0x63d6, 0x94f1, 0x4f9d, 0x4f0a, 0x8863, 0x9890, 0x5937, 0x9057, 0x79fb, 0x4eea, 0x80f0, 0x7591, 0x6c82, 0x5b9c, 0x59e8, 0x5f5d, 0x6905, 0x8681, 0x501a, 0x5df2, 0x4e59, 0x77e3, 0x4ee5, 0x827a, 0x6291, 0x6613, 0x9091, 0x5c79, 0x4ebf, 0x5f79, 0x81c6, 0x9038, 0x8084, 0x75ab, 0x4ea6, 0x88d4, 0x610f, 0x6bc5, 0x5fc6, 0x4e49, 0x76ca, 0x6ea2, 0x8be3, 0x8bae, 0x8c0a, 0x8bd1, 0x5f02, 0x7ffc, 0x7fcc, 0x7ece, 0x8335, 0x836b, 0x56e0, 0x6bb7, 0x97f3, 0x9634, 0x59fb, 0x541f, 0x94f6, 0x6deb, 0x5bc5, 0x996e, 0x5c39, 0x5f15, 0x9690, /* 0x53 */ 0x5370, 0x82f1, 0x6a31, 0x5a74, 0x9e70, 0x5e94, 0x7f28, 0x83b9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8fce, 0x8d62, 0x76c8, 0x5f71, 0x9896, 0x786c, 0x6620, 0x54df, 0x62e5, 0x4f63, 0x81c3, 0x75c8, 0x5eb8, 0x96cd, 0x8e0a, 0x86f9, 0x548f, 0x6cf3, 0x6d8c, 0x6c38, 0x607f, 0x52c7, 0x7528, 0x5e7d, 0x4f18, 0x60a0, 0x5fe7, 0x5c24, 0x7531, 0x90ae, 0x94c0, 0x72b9, 0x6cb9, 0x6e38, 0x9149, 0x6709, 0x53cb, 0x53f3, 0x4f51, 0x91c9, 0x8bf1, 0x53c8, 0x5e7c, 0x8fc2, 0x6de4, 0x4e8e, 0x76c2, 0x6986, 0x865e, 0x611a, 0x8206, 0x4f59, 0x4fde, 0x903e, 0x9c7c, 0x6109, 0x6e1d, 0x6e14, 0x9685, 0x4e88, 0x5a31, 0x96e8, 0x4e0e, 0x5c7f, 0x79b9, 0x5b87, 0x8bed, 0x7fbd, 0x7389, 0x57df, 0x828b, 0x90c1, 0x5401, 0x9047, 0x55bb, 0x5cea, 0x5fa1, 0x6108, 0x6b32, 0x72f1, 0x80b2, 0x8a89, /* 0x54 */ 0x6d74, 0x5bd3, 0x88d5, 0x9884, 0x8c6b, 0x9a6d, 0x9e33, 0x6e0a, 0x51a4, 0x5143, 0x57a3, 0x8881, 0x539f, 0x63f4, 0x8f95, 0x56ed, 0x5458, 0x5706, 0x733f, 0x6e90, 0x7f18, 0x8fdc, 0x82d1, 0x613f, 0x6028, 0x9662, 0x66f0, 0x7ea6, 0x8d8a, 0x8dc3, 0x94a5, 0x5cb3, 0x7ca4, 0x6708, 0x60a6, 0x9605, 0x8018, 0x4e91, 0x90e7, 0x5300, 0x9668, 0x5141, 0x8fd0, 0x8574, 0x915d, 0x6655, 0x97f5, 0x5b55, 0x531d, 0x7838, 0x6742, 0x683d, 0x54c9, 0x707e, 0x5bb0, 0x8f7d, 0x518d, 0x5728, 0x54b1, 0x6512, 0x6682, 0x8d5e, 0x8d43, 0x810f, 0x846c, 0x906d, 0x7cdf, 0x51ff, 0x85fb, 0x67a3, 0x65e9, 0x6fa1, 0x86a4, 0x8e81, 0x566a, 0x9020, 0x7682, 0x7076, 0x71e5, 0x8d23, 0x62e9, 0x5219, 0x6cfd, 0x8d3c, 0x600e, 0x589e, 0x618e, 0x66fe, 0x8d60, 0x624e, 0x55b3, 0x6e23, 0x672d, 0x8f67, /* 0x55 */ 0x94e1, 0x95f8, 0x7728, 0x6805, 0x69a8, 0x548b, 0x4e4d, 0x70b8, 0x8bc8, 0x6458, 0x658b, 0x5b85, 0x7a84, 0x503a, 0x5be8, 0x77bb, 0x6be1, 0x8a79, 0x7c98, 0x6cbe, 0x76cf, 0x65a9, 0x8f97, 0x5d2d, 0x5c55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7ad9, 0x6e5b, 0x7efd, 0x6a1f, 0x7ae0, 0x5f70, 0x6f33, 0x5f20, 0x638c, 0x6da8, 0x6756, 0x4e08, 0x5e10, 0x8d26, 0x4ed7, 0x80c0, 0x7634, 0x969c, 0x62db, 0x662d, 0x627e, 0x6cbc, 0x8d75, 0x7167, 0x7f69, 0x5146, 0x8087, 0x53ec, 0x906e, 0x6298, 0x54f2, 0x86f0, 0x8f99, 0x8005, 0x9517, 0x8517, 0x8fd9, 0x6d59, 0x73cd, 0x659f, 0x771f, 0x7504, 0x7827, 0x81fb, 0x8d1e, 0x9488, 0x4fa6, 0x6795, 0x75b9, 0x8bca, 0x9707, 0x632f, 0x9547, 0x9635, 0x84b8, 0x6323, 0x7741, 0x5f81, 0x72f0, 0x4e89, 0x6014, 0x6574, 0x62ef, 0x6b63, 0x653f, /* 0x56 */ 0x5e27, 0x75c7, 0x90d1, 0x8bc1, 0x829d, 0x679d, 0x652f, 0x5431, 0x8718, 0x77e5, 0x80a2, 0x8102, 0x6c41, 0x4e4b, 0x7ec7, 0x804c, 0x76f4, 0x690d, 0x6b96, 0x6267, 0x503c, 0x4f84, 0x5740, 0x6307, 0x6b62, 0x8dbe, 0x53ea, 0x65e8, 0x7eb8, 0x5fd7, 0x631a, 0x63b7, 0x81f3, 0x81f4, 0x7f6e, 0x5e1c, 0x5cd9, 0x5236, 0x667a, 0x79e9, 0x7a1a, 0x8d28, 0x7099, 0x75d4, 0x6ede, 0x6cbb, 0x7a92, 0x4e2d, 0x76c5, 0x5fe0, 0x949f, 0x8877, 0x7ec8, 0x79cd, 0x80bf, 0x91cd, 0x4ef2, 0x4f17, 0x821f, 0x5468, 0x5dde, 0x6d32, 0x8bcc, 0x7ca5, 0x8f74, 0x8098, 0x5e1a, 0x5492, 0x76b1, 0x5b99, 0x663c, 0x9aa4, 0x73e0, 0x682a, 0x86db, 0x6731, 0x732a, 0x8bf8, 0x8bdb, 0x9010, 0x7af9, 0x70db, 0x716e, 0x62c4, 0x77a9, 0x5631, 0x4e3b, 0x8457, 0x67f1, 0x52a9, 0x86c0, 0x8d2e, 0x94f8, 0x7b51, /* 0x57 */ 0x4f4f, 0x6ce8, 0x795d, 0x9a7b, 0x6293, 0x722a, 0x62fd, 0x4e13, 0x7816, 0x8f6c, 0x64b0, 0x8d5a, 0x7bc6, 0x6869, 0x5e84, 0x88c5, 0x5986, 0x649e, 0x58ee, 0x72b6, 0x690e, 0x9525, 0x8ffd, 0x8d58, 0x5760, 0x7f00, 0x8c06, 0x51c6, 0x6349, 0x62d9, 0x5353, 0x684c, 0x7422, 0x8301, 0x914c, 0x5544, 0x7740, 0x707c, 0x6d4a, 0x5179, 0x54a8, 0x8d44, 0x59ff, 0x6ecb, 0x6dc4, 0x5b5c, 0x7d2b, 0x4ed4, 0x7c7d, 0x6ed3, 0x5b50, 0x81ea, 0x6e0d, 0x5b57, 0x9b03, 0x68d5, 0x8e2a, 0x5b97, 0x7efc, 0x603b, 0x7eb5, 0x90b9, 0x8d70, 0x594f, 0x63cd, 0x79df, 0x8db3, 0x5352, 0x65cf, 0x7956, 0x8bc5, 0x963b, 0x7ec4, 0x94bb, 0x7e82, 0x5634, 0x9189, 0x6700, 0x7f6a, 0x5c0a, 0x9075, 0x6628, 0x5de6, 0x4f50, 0x67de, 0x505a, 0x4f5c, 0x5750, 0x5ea7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x58 */ 0x4e8d, 0x4e0c, 0x5140, 0x4e10, 0x5eff, 0x5345, 0x4e15, 0x4e98, 0x4e1e, 0x9b32, 0x5b6c, 0x5669, 0x4e28, 0x79ba, 0x4e3f, 0x5315, 0x4e47, 0x592d, 0x723b, 0x536e, 0x6c10, 0x56df, 0x80e4, 0x9997, 0x6bd3, 0x777e, 0x9f17, 0x4e36, 0x4e9f, 0x9f10, 0x4e5c, 0x4e69, 0x4e93, 0x8288, 0x5b5b, 0x556c, 0x560f, 0x4ec4, 0x538d, 0x539d, 0x53a3, 0x53a5, 0x53ae, 0x9765, 0x8d5d, 0x531a, 0x53f5, 0x5326, 0x532e, 0x533e, 0x8d5c, 0x5366, 0x5363, 0x5202, 0x5208, 0x520e, 0x522d, 0x5233, 0x523f, 0x5240, 0x524c, 0x525e, 0x5261, 0x525c, 0x84af, 0x527d, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7f54, 0x4ebb, 0x4ec3, 0x4ec9, 0x4ec2, 0x4ee8, 0x4ee1, 0x4eeb, 0x4ede, 0x4f1b, 0x4ef3, 0x4f22, 0x4f64, 0x4ef5, 0x4f25, 0x4f27, 0x4f09, 0x4f2b, 0x4f5e, 0x4f67, 0x6538, 0x4f5a, 0x4f5d, /* 0x59 */ 0x4f5f, 0x4f57, 0x4f32, 0x4f3d, 0x4f76, 0x4f74, 0x4f91, 0x4f89, 0x4f83, 0x4f8f, 0x4f7e, 0x4f7b, 0x4faa, 0x4f7c, 0x4fac, 0x4f94, 0x4fe6, 0x4fe8, 0x4fea, 0x4fc5, 0x4fda, 0x4fe3, 0x4fdc, 0x4fd1, 0x4fdf, 0x4ff8, 0x5029, 0x504c, 0x4ff3, 0x502c, 0x500f, 0x502e, 0x502d, 0x4ffe, 0x501c, 0x500c, 0x5025, 0x5028, 0x507e, 0x5043, 0x5055, 0x5048, 0x504e, 0x506c, 0x507b, 0x50a5, 0x50a7, 0x50a9, 0x50ba, 0x50d6, 0x5106, 0x50ed, 0x50ec, 0x50e6, 0x50ee, 0x5107, 0x510b, 0x4edd, 0x6c3d, 0x4f58, 0x4f65, 0x4fce, 0x9fa0, 0x6c46, 0x7c74, 0x516e, 0x5dfd, 0x9ec9, 0x9998, 0x5181, 0x5914, 0x52f9, 0x530d, 0x8a07, 0x5310, 0x51eb, 0x5919, 0x5155, 0x4ea0, 0x5156, 0x4eb3, 0x886e, 0x88a4, 0x4eb5, 0x8114, 0x88d2, 0x7980, 0x5b34, 0x8803, 0x7fb8, 0x51ab, 0x51b1, 0x51bd, 0x51bc, /* 0x5a */ 0x51c7, 0x5196, 0x51a2, 0x51a5, 0x8ba0, 0x8ba6, 0x8ba7, 0x8baa, 0x8bb4, 0x8bb5, 0x8bb7, 0x8bc2, 0x8bc3, 0x8bcb, 0x8bcf, 0x8bce, 0x8bd2, 0x8bd3, 0x8bd4, 0x8bd6, 0x8bd8, 0x8bd9, 0x8bdc, 0x8bdf, 0x8be0, 0x8be4, 0x8be8, 0x8be9, 0x8bee, 0x8bf0, 0x8bf3, 0x8bf6, 0x8bf9, 0x8bfc, 0x8bff, 0x8c00, 0x8c02, 0x8c04, 0x8c07, 0x8c0c, 0x8c0f, 0x8c11, 0x8c12, 0x8c14, 0x8c15, 0x8c16, 0x8c19, 0x8c1b, 0x8c18, 0x8c1d, 0x8c1f, 0x8c20, 0x8c21, 0x8c25, 0x8c27, 0x8c2a, 0x8c2b, 0x8c2e, 0x8c2f, 0x8c32, 0x8c33, 0x8c35, 0x8c36, 0x5369, 0x537a, 0x961d, 0x9622, 0x9621, 0x9631, 0x962a, 0x963d, 0x963c, 0x9642, 0x9649, 0x9654, 0x965f, 0x9667, 0x966c, 0x9672, 0x9674, 0x9688, 0x968d, 0x9697, 0x96b0, 0x9097, 0x909b, 0x909d, 0x9099, 0x90ac, 0x90a1, 0x90b4, 0x90b3, 0x90b6, 0x90ba, /* 0x5b */ 0x90b8, 0x90b0, 0x90cf, 0x90c5, 0x90be, 0x90d0, 0x90c4, 0x90c7, 0x90d3, 0x90e6, 0x90e2, 0x90dc, 0x90d7, 0x90db, 0x90eb, 0x90ef, 0x90fe, 0x9104, 0x9122, 0x911e, 0x9123, 0x9131, 0x912f, 0x9139, 0x9143, 0x9146, 0x520d, 0x5942, 0x52a2, 0x52ac, 0x52ad, 0x52be, 0x54ff, 0x52d0, 0x52d6, 0x52f0, 0x53df, 0x71ee, 0x77cd, 0x5ef4, 0x51f5, 0x51fc, 0x9b2f, 0x53b6, 0x5f01, 0x755a, 0x5def, 0x574c, 0x57a9, 0x57a1, 0x587e, 0x58bc, 0x58c5, 0x58d1, 0x5729, 0x572c, 0x572a, 0x5733, 0x5739, 0x572e, 0x572f, 0x575c, 0x573b, 0x5742, 0x5769, 0x5785, 0x576b, 0x5786, 0x577c, 0x577b, 0x5768, 0x576d, 0x5776, 0x5773, 0x57ad, 0x57a4, 0x578c, 0x57b2, 0x57cf, 0x57a7, 0x57b4, 0x5793, 0x57a0, 0x57d5, 0x57d8, 0x57da, 0x57d9, 0x57d2, 0x57b8, 0x57f4, 0x57ef, 0x57f8, 0x57e4, 0x57dd, /* 0x5c */ 0x580b, 0x580d, 0x57fd, 0x57ed, 0x5800, 0x581e, 0x5819, 0x5844, 0x5820, 0x5865, 0x586c, 0x5881, 0x5889, 0x589a, 0x5880, 0x99a8, 0x9f19, 0x61ff, 0x8279, 0x827d, 0x827f, 0x828f, 0x828a, 0x82a8, 0x8284, 0x828e, 0x8291, 0x8297, 0x8299, 0x82ab, 0x82b8, 0x82be, 0x82b0, 0x82c8, 0x82ca, 0x82e3, 0x8298, 0x82b7, 0x82ae, 0x82cb, 0x82cc, 0x82c1, 0x82a9, 0x82b4, 0x82a1, 0x82aa, 0x829f, 0x82c4, 0x82ce, 0x82a4, 0x82e1, 0x8309, 0x82f7, 0x82e4, 0x830f, 0x8307, 0x82dc, 0x82f4, 0x82d2, 0x82d8, 0x830c, 0x82fb, 0x82d3, 0x8311, 0x831a, 0x8306, 0x8314, 0x8315, 0x82e0, 0x82d5, 0x831c, 0x8351, 0x835b, 0x835c, 0x8308, 0x8392, 0x833c, 0x8334, 0x8331, 0x839b, 0x835e, 0x832f, 0x834f, 0x8347, 0x8343, 0x835f, 0x8340, 0x8317, 0x8360, 0x832d, 0x833a, 0x8333, 0x8366, 0x8365, /* 0x5d */ 0x8368, 0x831b, 0x8369, 0x836c, 0x836a, 0x836d, 0x836e, 0x83b0, 0x8378, 0x83b3, 0x83b4, 0x83a0, 0x83aa, 0x8393, 0x839c, 0x8385, 0x837c, 0x83b6, 0x83a9, 0x837d, 0x83b8, 0x837b, 0x8398, 0x839e, 0x83a8, 0x83ba, 0x83bc, 0x83c1, 0x8401, 0x83e5, 0x83d8, 0x5807, 0x8418, 0x840b, 0x83dd, 0x83fd, 0x83d6, 0x841c, 0x8438, 0x8411, 0x8406, 0x83d4, 0x83df, 0x840f, 0x8403, 0x83f8, 0x83f9, 0x83ea, 0x83c5, 0x83c0, 0x8426, 0x83f0, 0x83e1, 0x845c, 0x8451, 0x845a, 0x8459, 0x8473, 0x8487, 0x8488, 0x847a, 0x8489, 0x8478, 0x843c, 0x8446, 0x8469, 0x8476, 0x848c, 0x848e, 0x8431, 0x846d, 0x84c1, 0x84cd, 0x84d0, 0x84e6, 0x84bd, 0x84d3, 0x84ca, 0x84bf, 0x84ba, 0x84e0, 0x84a1, 0x84b9, 0x84b4, 0x8497, 0x84e5, 0x84e3, 0x850c, 0x750d, 0x8538, 0x84f0, 0x8539, 0x851f, 0x853a, /* 0x5e */ 0x8556, 0x853b, 0x84ff, 0x84fc, 0x8559, 0x8548, 0x8568, 0x8564, 0x855e, 0x857a, 0x77a2, 0x8543, 0x8572, 0x857b, 0x85a4, 0x85a8, 0x8587, 0x858f, 0x8579, 0x85ae, 0x859c, 0x8585, 0x85b9, 0x85b7, 0x85b0, 0x85d3, 0x85c1, 0x85dc, 0x85ff, 0x8627, 0x8605, 0x8629, 0x8616, 0x863c, 0x5efe, 0x5f08, 0x593c, 0x5941, 0x8037, 0x5955, 0x595a, 0x5958, 0x530f, 0x5c22, 0x5c25, 0x5c2c, 0x5c34, 0x624c, 0x626a, 0x629f, 0x62bb, 0x62ca, 0x62da, 0x62d7, 0x62ee, 0x6322, 0x62f6, 0x6339, 0x634b, 0x6343, 0x63ad, 0x63f6, 0x6371, 0x637a, 0x638e, 0x63b4, 0x636d, 0x63ac, 0x638a, 0x6369, 0x63ae, 0x63bc, 0x63f2, 0x63f8, 0x63e0, 0x63ff, 0x63c4, 0x63de, 0x63ce, 0x6452, 0x63c6, 0x63be, 0x6445, 0x6441, 0x640b, 0x641b, 0x6420, 0x640c, 0x6426, 0x6421, 0x645e, 0x6484, 0x646d, 0x6496, /* 0x5f */ 0x647a, 0x64b7, 0x64b8, 0x6499, 0x64ba, 0x64c0, 0x64d0, 0x64d7, 0x64e4, 0x64e2, 0x6509, 0x6525, 0x652e, 0x5f0b, 0x5fd2, 0x7519, 0x5f11, 0x535f, 0x53f1, 0x53fd, 0x53e9, 0x53e8, 0x53fb, 0x5412, 0x5416, 0x5406, 0x544b, 0x5452, 0x5453, 0x5454, 0x5456, 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, 0x5477, 0x5471, 0x5464, 0x549a, 0x549b, 0x5484, 0x5476, 0x5466, 0x549d, 0x54d0, 0x54ad, 0x54c2, 0x54b4, 0x54d2, 0x54a7, 0x54a6, 0x54d3, 0x54d4, 0x5472, 0x54a3, 0x54d5, 0x54bb, 0x54bf, 0x54cc, 0x54d9, 0x54da, 0x54dc, 0x54a9, 0x54aa, 0x54a4, 0x54dd, 0x54cf, 0x54de, 0x551b, 0x54e7, 0x5520, 0x54fd, 0x5514, 0x54f3, 0x5522, 0x5523, 0x550f, 0x5511, 0x5527, 0x552a, 0x5567, 0x558f, 0x55b5, 0x5549, 0x556d, 0x5541, 0x5555, 0x553f, 0x5550, 0x553c, /* 0x60 */ 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, 0x555c, 0x558b, 0x55d2, 0x5583, 0x55b1, 0x55b9, 0x5588, 0x5581, 0x559f, 0x557e, 0x55d6, 0x5591, 0x557b, 0x55df, 0x55bd, 0x55be, 0x5594, 0x5599, 0x55ea, 0x55f7, 0x55c9, 0x561f, 0x55d1, 0x55eb, 0x55ec, 0x55d4, 0x55e6, 0x55dd, 0x55c4, 0x55ef, 0x55e5, 0x55f2, 0x55f3, 0x55cc, 0x55cd, 0x55e8, 0x55f5, 0x55e4, 0x8f94, 0x561e, 0x5608, 0x560c, 0x5601, 0x5624, 0x5623, 0x55fe, 0x5600, 0x5627, 0x562d, 0x5658, 0x5639, 0x5657, 0x562c, 0x564d, 0x5662, 0x5659, 0x565c, 0x564c, 0x5654, 0x5686, 0x5664, 0x5671, 0x566b, 0x567b, 0x567c, 0x5685, 0x5693, 0x56af, 0x56d4, 0x56d7, 0x56dd, 0x56e1, 0x56f5, 0x56eb, 0x56f9, 0x56ff, 0x5704, 0x570a, 0x5709, 0x571c, 0x5e0f, 0x5e19, 0x5e14, 0x5e11, 0x5e31, 0x5e3b, 0x5e3c, /* 0x61 */ 0x5e37, 0x5e44, 0x5e54, 0x5e5b, 0x5e5e, 0x5e61, 0x5c8c, 0x5c7a, 0x5c8d, 0x5c90, 0x5c96, 0x5c88, 0x5c98, 0x5c99, 0x5c91, 0x5c9a, 0x5c9c, 0x5cb5, 0x5ca2, 0x5cbd, 0x5cac, 0x5cab, 0x5cb1, 0x5ca3, 0x5cc1, 0x5cb7, 0x5cc4, 0x5cd2, 0x5ce4, 0x5ccb, 0x5ce5, 0x5d02, 0x5d03, 0x5d27, 0x5d26, 0x5d2e, 0x5d24, 0x5d1e, 0x5d06, 0x5d1b, 0x5d58, 0x5d3e, 0x5d34, 0x5d3d, 0x5d6c, 0x5d5b, 0x5d6f, 0x5d5d, 0x5d6b, 0x5d4b, 0x5d4a, 0x5d69, 0x5d74, 0x5d82, 0x5d99, 0x5d9d, 0x8c73, 0x5db7, 0x5dc5, 0x5f73, 0x5f77, 0x5f82, 0x5f87, 0x5f89, 0x5f8c, 0x5f95, 0x5f99, 0x5f9c, 0x5fa8, 0x5fad, 0x5fb5, 0x5fbc, 0x8862, 0x5f61, 0x72ad, 0x72b0, 0x72b4, 0x72b7, 0x72b8, 0x72c3, 0x72c1, 0x72ce, 0x72cd, 0x72d2, 0x72e8, 0x72ef, 0x72e9, 0x72f2, 0x72f4, 0x72f7, 0x7301, 0x72f3, 0x7303, 0x72fa, /* 0x62 */ 0x72fb, 0x7317, 0x7313, 0x7321, 0x730a, 0x731e, 0x731d, 0x7315, 0x7322, 0x7339, 0x7325, 0x732c, 0x7338, 0x7331, 0x7350, 0x734d, 0x7357, 0x7360, 0x736c, 0x736f, 0x737e, 0x821b, 0x5925, 0x98e7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996a, 0x996b, 0x996c, 0x9974, 0x9977, 0x997d, 0x9980, 0x9984, 0x9987, 0x998a, 0x998d, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5e80, 0x5e91, 0x5e8b, 0x5e96, 0x5ea5, 0x5ea0, 0x5eb9, 0x5eb5, 0x5ebe, 0x5eb3, 0x8d53, 0x5ed2, 0x5ed1, 0x5edb, 0x5ee8, 0x5eea, 0x81ba, 0x5fc4, 0x5fc9, 0x5fd6, 0x5fcf, 0x6003, 0x5fee, 0x6004, 0x5fe1, 0x5fe4, 0x5ffe, 0x6005, 0x6006, 0x5fea, 0x5fed, 0x5ff8, 0x6019, 0x6035, 0x6026, 0x601b, 0x600f, 0x600d, 0x6029, 0x602b, 0x600a, 0x603f, 0x6021, 0x6078, 0x6079, 0x607b, 0x607a, 0x6042, /* 0x63 */ 0x606a, 0x607d, 0x6096, 0x609a, 0x60ad, 0x609d, 0x6083, 0x6092, 0x608c, 0x609b, 0x60ec, 0x60bb, 0x60b1, 0x60dd, 0x60d8, 0x60c6, 0x60da, 0x60b4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60f4, 0x6100, 0x610e, 0x612b, 0x614a, 0x6175, 0x61ac, 0x6194, 0x61a7, 0x61b7, 0x61d4, 0x61f5, 0x5fdd, 0x96b3, 0x95e9, 0x95eb, 0x95f1, 0x95f3, 0x95f5, 0x95f6, 0x95fc, 0x95fe, 0x9603, 0x9604, 0x9606, 0x9608, 0x960a, 0x960b, 0x960c, 0x960d, 0x960f, 0x9612, 0x9615, 0x9616, 0x9617, 0x9619, 0x961a, 0x4e2c, 0x723f, 0x6215, 0x6c35, 0x6c54, 0x6c5c, 0x6c4a, 0x6ca3, 0x6c85, 0x6c90, 0x6c94, 0x6c8c, 0x6c68, 0x6c69, 0x6c74, 0x6c76, 0x6c86, 0x6ca9, 0x6cd0, 0x6cd4, 0x6cad, 0x6cf7, 0x6cf8, 0x6cf1, 0x6cd7, 0x6cb2, 0x6ce0, 0x6cd6, 0x6cfa, 0x6ceb, 0x6cee, 0x6cb1, 0x6cd3, 0x6cef, 0x6cfe, /* 0x64 */ 0x6d39, 0x6d27, 0x6d0c, 0x6d43, 0x6d48, 0x6d07, 0x6d04, 0x6d19, 0x6d0e, 0x6d2b, 0x6d4d, 0x6d2e, 0x6d35, 0x6d1a, 0x6d4f, 0x6d52, 0x6d54, 0x6d33, 0x6d91, 0x6d6f, 0x6d9e, 0x6da0, 0x6d5e, 0x6d93, 0x6d94, 0x6d5c, 0x6d60, 0x6d7c, 0x6d63, 0x6e1a, 0x6dc7, 0x6dc5, 0x6dde, 0x6e0e, 0x6dbf, 0x6de0, 0x6e11, 0x6de6, 0x6ddd, 0x6dd9, 0x6e16, 0x6dab, 0x6e0c, 0x6dae, 0x6e2b, 0x6e6e, 0x6e4e, 0x6e6b, 0x6eb2, 0x6e5f, 0x6e86, 0x6e53, 0x6e54, 0x6e32, 0x6e25, 0x6e44, 0x6edf, 0x6eb1, 0x6e98, 0x6ee0, 0x6f2d, 0x6ee2, 0x6ea5, 0x6ea7, 0x6ebd, 0x6ebb, 0x6eb7, 0x6ed7, 0x6eb4, 0x6ecf, 0x6e8f, 0x6ec2, 0x6e9f, 0x6f62, 0x6f46, 0x6f47, 0x6f24, 0x6f15, 0x6ef9, 0x6f2f, 0x6f36, 0x6f4b, 0x6f74, 0x6f2a, 0x6f09, 0x6f29, 0x6f89, 0x6f8d, 0x6f8c, 0x6f78, 0x6f72, 0x6f7c, 0x6f7a, 0x6fd1, /* 0x65 */ 0x6fc9, 0x6fa7, 0x6fb9, 0x6fb6, 0x6fc2, 0x6fe1, 0x6fee, 0x6fde, 0x6fe0, 0x6fef, 0x701a, 0x7023, 0x701b, 0x7039, 0x7035, 0x704f, 0x705e, 0x5b80, 0x5b84, 0x5b95, 0x5b93, 0x5ba5, 0x5bb8, 0x752f, 0x9a9e, 0x6434, 0x5be4, 0x5bee, 0x8930, 0x5bf0, 0x8e47, 0x8b07, 0x8fb6, 0x8fd3, 0x8fd5, 0x8fe5, 0x8fee, 0x8fe4, 0x8fe9, 0x8fe6, 0x8ff3, 0x8fe8, 0x9005, 0x9004, 0x900b, 0x9026, 0x9011, 0x900d, 0x9016, 0x9021, 0x9035, 0x9036, 0x902d, 0x902f, 0x9044, 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905b, 0x66b9, 0x9074, 0x907d, 0x9082, 0x9088, 0x9083, 0x908b, 0x5f50, 0x5f57, 0x5f56, 0x5f58, 0x5c3b, 0x54ab, 0x5c50, 0x5c59, 0x5b71, 0x5c63, 0x5c66, 0x7fbc, 0x5f2a, 0x5f29, 0x5f2d, 0x8274, 0x5f3c, 0x9b3b, 0x5c6e, 0x5981, 0x5983, 0x598d, 0x59a9, 0x59aa, 0x59a3, /* 0x66 */ 0x5997, 0x59ca, 0x59ab, 0x599e, 0x59a4, 0x59d2, 0x59b2, 0x59af, 0x59d7, 0x59be, 0x5a05, 0x5a06, 0x59dd, 0x5a08, 0x59e3, 0x59d8, 0x59f9, 0x5a0c, 0x5a09, 0x5a32, 0x5a34, 0x5a11, 0x5a23, 0x5a13, 0x5a40, 0x5a67, 0x5a4a, 0x5a55, 0x5a3c, 0x5a62, 0x5a75, 0x80ec, 0x5aaa, 0x5a9b, 0x5a77, 0x5a7a, 0x5abe, 0x5aeb, 0x5ab2, 0x5ad2, 0x5ad4, 0x5ab8, 0x5ae0, 0x5ae3, 0x5af1, 0x5ad6, 0x5ae6, 0x5ad8, 0x5adc, 0x5b09, 0x5b17, 0x5b16, 0x5b32, 0x5b37, 0x5b40, 0x5c15, 0x5c1c, 0x5b5a, 0x5b65, 0x5b73, 0x5b51, 0x5b53, 0x5b62, 0x9a75, 0x9a77, 0x9a78, 0x9a7a, 0x9a7f, 0x9a7d, 0x9a80, 0x9a81, 0x9a85, 0x9a88, 0x9a8a, 0x9a90, 0x9a92, 0x9a93, 0x9a96, 0x9a98, 0x9a9b, 0x9a9c, 0x9a9d, 0x9a9f, 0x9aa0, 0x9aa2, 0x9aa3, 0x9aa5, 0x9aa7, 0x7e9f, 0x7ea1, 0x7ea3, 0x7ea5, 0x7ea8, 0x7ea9, /* 0x67 */ 0x7ead, 0x7eb0, 0x7ebe, 0x7ec0, 0x7ec1, 0x7ec2, 0x7ec9, 0x7ecb, 0x7ecc, 0x7ed0, 0x7ed4, 0x7ed7, 0x7edb, 0x7ee0, 0x7ee1, 0x7ee8, 0x7eeb, 0x7eee, 0x7eef, 0x7ef1, 0x7ef2, 0x7f0d, 0x7ef6, 0x7efa, 0x7efb, 0x7efe, 0x7f01, 0x7f02, 0x7f03, 0x7f07, 0x7f08, 0x7f0b, 0x7f0c, 0x7f0f, 0x7f11, 0x7f12, 0x7f17, 0x7f19, 0x7f1c, 0x7f1b, 0x7f1f, 0x7f21, 0x7f22, 0x7f23, 0x7f24, 0x7f25, 0x7f26, 0x7f27, 0x7f2a, 0x7f2b, 0x7f2c, 0x7f2d, 0x7f2f, 0x7f30, 0x7f31, 0x7f32, 0x7f33, 0x7f35, 0x5e7a, 0x757f, 0x5ddb, 0x753e, 0x9095, 0x738e, 0x7391, 0x73ae, 0x73a2, 0x739f, 0x73cf, 0x73c2, 0x73d1, 0x73b7, 0x73b3, 0x73c0, 0x73c9, 0x73c8, 0x73e5, 0x73d9, 0x987c, 0x740a, 0x73e9, 0x73e7, 0x73de, 0x73ba, 0x73f2, 0x740f, 0x742a, 0x745b, 0x7426, 0x7425, 0x7428, 0x7430, 0x742e, 0x742c, /* 0x68 */ 0x741b, 0x741a, 0x7441, 0x745c, 0x7457, 0x7455, 0x7459, 0x7477, 0x746d, 0x747e, 0x749c, 0x748e, 0x7480, 0x7481, 0x7487, 0x748b, 0x749e, 0x74a8, 0x74a9, 0x7490, 0x74a7, 0x74d2, 0x74ba, 0x97ea, 0x97eb, 0x97ec, 0x674c, 0x6753, 0x675e, 0x6748, 0x6769, 0x67a5, 0x6787, 0x676a, 0x6773, 0x6798, 0x67a7, 0x6775, 0x67a8, 0x679e, 0x67ad, 0x678b, 0x6777, 0x677c, 0x67f0, 0x6809, 0x67d8, 0x680a, 0x67e9, 0x67b0, 0x680c, 0x67d9, 0x67b5, 0x67da, 0x67b3, 0x67dd, 0x6800, 0x67c3, 0x67b8, 0x67e2, 0x680e, 0x67c1, 0x67fd, 0x6832, 0x6833, 0x6860, 0x6861, 0x684e, 0x6862, 0x6844, 0x6864, 0x6883, 0x681d, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683e, 0x684a, 0x6849, 0x6829, 0x68b5, 0x688f, 0x6874, 0x6877, 0x6893, 0x686b, 0x68c2, 0x696e, 0x68fc, 0x691f, 0x6920, 0x68f9, /* 0x69 */ 0x6924, 0x68f0, 0x690b, 0x6901, 0x6957, 0x68e3, 0x6910, 0x6971, 0x6939, 0x6960, 0x6942, 0x695d, 0x6984, 0x696b, 0x6980, 0x6998, 0x6978, 0x6934, 0x69cc, 0x6987, 0x6988, 0x69ce, 0x6989, 0x6966, 0x6963, 0x6979, 0x699b, 0x69a7, 0x69bb, 0x69ab, 0x69ad, 0x69d4, 0x69b1, 0x69c1, 0x69ca, 0x69df, 0x6995, 0x69e0, 0x698d, 0x69ff, 0x6a2f, 0x69ed, 0x6a17, 0x6a18, 0x6a65, 0x69f2, 0x6a44, 0x6a3e, 0x6aa0, 0x6a50, 0x6a5b, 0x6a35, 0x6a8e, 0x6a79, 0x6a3d, 0x6a28, 0x6a58, 0x6a7c, 0x6a91, 0x6a90, 0x6aa9, 0x6a97, 0x6aab, 0x7337, 0x7352, 0x6b81, 0x6b82, 0x6b87, 0x6b84, 0x6b92, 0x6b93, 0x6b8d, 0x6b9a, 0x6b9b, 0x6ba1, 0x6baa, 0x8f6b, 0x8f6d, 0x8f71, 0x8f72, 0x8f73, 0x8f75, 0x8f76, 0x8f78, 0x8f77, 0x8f79, 0x8f7a, 0x8f7c, 0x8f7e, 0x8f81, 0x8f82, 0x8f84, 0x8f87, 0x8f8b, /* 0x6a */ 0x8f8d, 0x8f8e, 0x8f8f, 0x8f98, 0x8f9a, 0x8ece, 0x620b, 0x6217, 0x621b, 0x621f, 0x6222, 0x6221, 0x6225, 0x6224, 0x622c, 0x81e7, 0x74ef, 0x74f4, 0x74ff, 0x750f, 0x7511, 0x7513, 0x6534, 0x65ee, 0x65ef, 0x65f0, 0x660a, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600, 0x7085, 0x66f7, 0x661d, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006, 0x665f, 0x6654, 0x6641, 0x664f, 0x6656, 0x6661, 0x6657, 0x6677, 0x6684, 0x668c, 0x66a7, 0x669d, 0x66be, 0x66db, 0x66dc, 0x66e6, 0x66e9, 0x8d32, 0x8d33, 0x8d36, 0x8d3b, 0x8d3d, 0x8d40, 0x8d45, 0x8d46, 0x8d48, 0x8d49, 0x8d47, 0x8d4d, 0x8d55, 0x8d59, 0x89c7, 0x89ca, 0x89cb, 0x89cc, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x726e, 0x729f, 0x725d, 0x7266, 0x726f, 0x727e, 0x727f, 0x7284, 0x728b, 0x728d, 0x728f, 0x7292, 0x6308, 0x6332, 0x63b0, /* 0x6b */ 0x643f, 0x64d8, 0x8004, 0x6bea, 0x6bf3, 0x6bfd, 0x6bf5, 0x6bf9, 0x6c05, 0x6c07, 0x6c06, 0x6c0d, 0x6c15, 0x6c18, 0x6c19, 0x6c1a, 0x6c21, 0x6c29, 0x6c24, 0x6c2a, 0x6c32, 0x6535, 0x6555, 0x656b, 0x724d, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809f, 0x809c, 0x8093, 0x80bc, 0x670a, 0x80bd, 0x80b1, 0x80ab, 0x80ad, 0x80b4, 0x80b7, 0x80e7, 0x80e8, 0x80e9, 0x80ea, 0x80db, 0x80c2, 0x80c4, 0x80d9, 0x80cd, 0x80d7, 0x6710, 0x80dd, 0x80eb, 0x80f1, 0x80f4, 0x80ed, 0x810d, 0x810e, 0x80f2, 0x80fc, 0x6715, 0x8112, 0x8c5a, 0x8136, 0x811e, 0x812c, 0x8118, 0x8132, 0x8148, 0x814c, 0x8153, 0x8174, 0x8159, 0x815a, 0x8171, 0x8160, 0x8169, 0x817c, 0x817d, 0x816d, 0x8167, 0x584d, 0x5ab5, 0x8188, 0x8182, 0x8191, 0x6ed5, 0x81a3, 0x81aa, 0x81cc, 0x6726, 0x81ca, 0x81bb, /* 0x6c */ 0x81c1, 0x81a6, 0x6b24, 0x6b37, 0x6b39, 0x6b43, 0x6b46, 0x6b59, 0x98d1, 0x98d2, 0x98d3, 0x98d5, 0x98d9, 0x98da, 0x6bb3, 0x5f40, 0x6bc2, 0x89f3, 0x6590, 0x9f51, 0x6593, 0x65bc, 0x65c6, 0x65c4, 0x65c3, 0x65cc, 0x65ce, 0x65d2, 0x65d6, 0x7080, 0x709c, 0x7096, 0x709d, 0x70bb, 0x70c0, 0x70b7, 0x70ab, 0x70b1, 0x70e8, 0x70ca, 0x7110, 0x7113, 0x7116, 0x712f, 0x7131, 0x7173, 0x715c, 0x7168, 0x7145, 0x7172, 0x714a, 0x7178, 0x717a, 0x7198, 0x71b3, 0x71b5, 0x71a8, 0x71a0, 0x71e0, 0x71d4, 0x71e7, 0x71f9, 0x721d, 0x7228, 0x706c, 0x7118, 0x7166, 0x71b9, 0x623e, 0x623d, 0x6243, 0x6248, 0x6249, 0x793b, 0x7940, 0x7946, 0x7949, 0x795b, 0x795c, 0x7953, 0x795a, 0x7962, 0x7957, 0x7960, 0x796f, 0x7967, 0x797a, 0x7985, 0x798a, 0x799a, 0x79a7, 0x79b3, 0x5fd1, 0x5fd0, /* 0x6d */ 0x603c, 0x605d, 0x605a, 0x6067, 0x6041, 0x6059, 0x6063, 0x60ab, 0x6106, 0x610d, 0x615d, 0x61a9, 0x619d, 0x61cb, 0x61d1, 0x6206, 0x8080, 0x807f, 0x6c93, 0x6cf6, 0x6dfc, 0x77f6, 0x77f8, 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65ab, 0x782d, 0x781c, 0x781d, 0x7839, 0x783a, 0x783b, 0x781f, 0x783c, 0x7825, 0x782c, 0x7823, 0x7829, 0x784e, 0x786d, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847, 0x784c, 0x786a, 0x789b, 0x7893, 0x789a, 0x7887, 0x789c, 0x78a1, 0x78a3, 0x78b2, 0x78b9, 0x78a5, 0x78d4, 0x78d9, 0x78c9, 0x78ec, 0x78f2, 0x7905, 0x78f4, 0x7913, 0x7924, 0x791e, 0x7934, 0x9f9b, 0x9ef9, 0x9efb, 0x9efc, 0x76f1, 0x7704, 0x770d, 0x76f9, 0x7707, 0x7708, 0x771a, 0x7722, 0x7719, 0x772d, 0x7726, 0x7735, 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775a, 0x7768, /* 0x6e */ 0x7762, 0x7765, 0x777f, 0x778d, 0x777d, 0x7780, 0x778c, 0x7791, 0x779f, 0x77a0, 0x77b0, 0x77b5, 0x77bd, 0x753a, 0x7540, 0x754e, 0x754b, 0x7548, 0x755b, 0x7572, 0x7579, 0x7583, 0x7f58, 0x7f61, 0x7f5f, 0x8a48, 0x7f68, 0x7f74, 0x7f71, 0x7f79, 0x7f81, 0x7f7e, 0x76cd, 0x76e5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948b, 0x948a, 0x948c, 0x948d, 0x948f, 0x9490, 0x9494, 0x9497, 0x9495, 0x949a, 0x949b, 0x949c, 0x94a3, 0x94a4, 0x94ab, 0x94aa, 0x94ad, 0x94ac, 0x94af, 0x94b0, 0x94b2, 0x94b4, 0x94b6, 0x94b7, 0x94b8, 0x94b9, 0x94ba, 0x94bc, 0x94bd, 0x94bf, 0x94c4, 0x94c8, 0x94c9, 0x94ca, 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94d0, 0x94d1, 0x94d2, 0x94d5, 0x94d6, 0x94d7, 0x94d9, 0x94d8, 0x94db, 0x94de, 0x94df, 0x94e0, 0x94e2, 0x94e4, 0x94e5, 0x94e7, 0x94e8, 0x94ea, /* 0x6f */ 0x94e9, 0x94eb, 0x94ee, 0x94ef, 0x94f3, 0x94f4, 0x94f5, 0x94f7, 0x94f9, 0x94fc, 0x94fd, 0x94ff, 0x9503, 0x9502, 0x9506, 0x9507, 0x9509, 0x950a, 0x950d, 0x950e, 0x950f, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9518, 0x951b, 0x951d, 0x951e, 0x951f, 0x9522, 0x952a, 0x952b, 0x9529, 0x952c, 0x9531, 0x9532, 0x9534, 0x9536, 0x9537, 0x9538, 0x953c, 0x953e, 0x953f, 0x9542, 0x9535, 0x9544, 0x9545, 0x9546, 0x9549, 0x954c, 0x954e, 0x954f, 0x9552, 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955b, 0x955e, 0x955f, 0x955d, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956a, 0x956b, 0x956c, 0x956f, 0x9571, 0x9572, 0x9573, 0x953a, 0x77e7, 0x77ec, 0x96c9, 0x79d5, 0x79ed, 0x79e3, 0x79eb, 0x7a06, 0x5d47, 0x7a03, 0x7a02, 0x7a1e, 0x7a14, /* 0x70 */ 0x7a39, 0x7a37, 0x7a51, 0x9ecf, 0x99a5, 0x7a70, 0x7688, 0x768e, 0x7693, 0x7699, 0x76a4, 0x74de, 0x74e0, 0x752c, 0x9e20, 0x9e22, 0x9e28, 0x9e29, 0x9e2a, 0x9e2b, 0x9e2c, 0x9e32, 0x9e31, 0x9e36, 0x9e38, 0x9e37, 0x9e39, 0x9e3a, 0x9e3e, 0x9e41, 0x9e42, 0x9e44, 0x9e46, 0x9e47, 0x9e48, 0x9e49, 0x9e4b, 0x9e4c, 0x9e4e, 0x9e51, 0x9e55, 0x9e57, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5e, 0x9e63, 0x9e66, 0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e71, 0x9e6d, 0x9e73, 0x7592, 0x7594, 0x7596, 0x75a0, 0x759d, 0x75ac, 0x75a3, 0x75b3, 0x75b4, 0x75b8, 0x75c4, 0x75b1, 0x75b0, 0x75c3, 0x75c2, 0x75d6, 0x75cd, 0x75e3, 0x75e8, 0x75e6, 0x75e4, 0x75eb, 0x75e7, 0x7603, 0x75f1, 0x75fc, 0x75ff, 0x7610, 0x7600, 0x7605, 0x760c, 0x7617, 0x760a, 0x7625, 0x7618, 0x7615, 0x7619, /* 0x71 */ 0x761b, 0x763c, 0x7622, 0x7620, 0x7640, 0x762d, 0x7630, 0x763f, 0x7635, 0x7643, 0x763e, 0x7633, 0x764d, 0x765e, 0x7654, 0x765c, 0x7656, 0x766b, 0x766f, 0x7fca, 0x7ae6, 0x7a78, 0x7a79, 0x7a80, 0x7a86, 0x7a88, 0x7a95, 0x7aa6, 0x7aa0, 0x7aac, 0x7aa8, 0x7aad, 0x7ab3, 0x8864, 0x8869, 0x8872, 0x887d, 0x887f, 0x8882, 0x88a2, 0x88c6, 0x88b7, 0x88bc, 0x88c9, 0x88e2, 0x88ce, 0x88e3, 0x88e5, 0x88f1, 0x891a, 0x88fc, 0x88e8, 0x88fe, 0x88f0, 0x8921, 0x8919, 0x8913, 0x891b, 0x890a, 0x8934, 0x892b, 0x8936, 0x8941, 0x8966, 0x897b, 0x758b, 0x80e5, 0x76b2, 0x76b4, 0x77dc, 0x8012, 0x8014, 0x8016, 0x801c, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, 0x8028, 0x8031, 0x800b, 0x8035, 0x8043, 0x8046, 0x804d, 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, /* 0x72 */ 0x9889, 0x988c, 0x988d, 0x988f, 0x9894, 0x989a, 0x989b, 0x989e, 0x989f, 0x98a1, 0x98a2, 0x98a5, 0x98a6, 0x864d, 0x8654, 0x866c, 0x866e, 0x867f, 0x867a, 0x867c, 0x867b, 0x86a8, 0x868d, 0x868b, 0x86ac, 0x869d, 0x86a7, 0x86a3, 0x86aa, 0x8693, 0x86a9, 0x86b6, 0x86c4, 0x86b5, 0x86ce, 0x86b0, 0x86ba, 0x86b1, 0x86af, 0x86c9, 0x86cf, 0x86b4, 0x86e9, 0x86f1, 0x86f2, 0x86ed, 0x86f3, 0x86d0, 0x8713, 0x86de, 0x86f4, 0x86df, 0x86d8, 0x86d1, 0x8703, 0x8707, 0x86f8, 0x8708, 0x870a, 0x870d, 0x8709, 0x8723, 0x873b, 0x871e, 0x8725, 0x872e, 0x871a, 0x873e, 0x8748, 0x8734, 0x8731, 0x8729, 0x8737, 0x873f, 0x8782, 0x8722, 0x877d, 0x877e, 0x877b, 0x8760, 0x8770, 0x874c, 0x876e, 0x878b, 0x8753, 0x8763, 0x877c, 0x8764, 0x8759, 0x8765, 0x8793, 0x87af, 0x87a8, 0x87d2, /* 0x73 */ 0x87c6, 0x8788, 0x8785, 0x87ad, 0x8797, 0x8783, 0x87ab, 0x87e5, 0x87ac, 0x87b5, 0x87b3, 0x87cb, 0x87d3, 0x87bd, 0x87d1, 0x87c0, 0x87ca, 0x87db, 0x87ea, 0x87e0, 0x87ee, 0x8816, 0x8813, 0x87fe, 0x880a, 0x881b, 0x8821, 0x8839, 0x883c, 0x7f36, 0x7f42, 0x7f44, 0x7f45, 0x8210, 0x7afa, 0x7afd, 0x7b08, 0x7b03, 0x7b04, 0x7b15, 0x7b0a, 0x7b2b, 0x7b0f, 0x7b47, 0x7b38, 0x7b2a, 0x7b19, 0x7b2e, 0x7b31, 0x7b20, 0x7b25, 0x7b24, 0x7b33, 0x7b3e, 0x7b1e, 0x7b58, 0x7b5a, 0x7b45, 0x7b75, 0x7b4c, 0x7b5d, 0x7b60, 0x7b6e, 0x7b7b, 0x7b62, 0x7b72, 0x7b71, 0x7b90, 0x7ba6, 0x7ba7, 0x7bb8, 0x7bac, 0x7b9d, 0x7ba8, 0x7b85, 0x7baa, 0x7b9c, 0x7ba2, 0x7bab, 0x7bb4, 0x7bd1, 0x7bc1, 0x7bcc, 0x7bdd, 0x7bda, 0x7be5, 0x7be6, 0x7bea, 0x7c0c, 0x7bfe, 0x7bfc, 0x7c0f, 0x7c16, 0x7c0b, /* 0x74 */ 0x7c1f, 0x7c2a, 0x7c26, 0x7c38, 0x7c41, 0x7c40, 0x81fe, 0x8201, 0x8202, 0x8204, 0x81ec, 0x8844, 0x8221, 0x8222, 0x8223, 0x822d, 0x822f, 0x8228, 0x822b, 0x8238, 0x823b, 0x8233, 0x8234, 0x823e, 0x8244, 0x8249, 0x824b, 0x824f, 0x825a, 0x825f, 0x8268, 0x887e, 0x8885, 0x8888, 0x88d8, 0x88df, 0x895e, 0x7f9d, 0x7f9f, 0x7fa7, 0x7faf, 0x7fb0, 0x7fb2, 0x7c7c, 0x6549, 0x7c91, 0x7c9d, 0x7c9c, 0x7c9e, 0x7ca2, 0x7cb2, 0x7cbc, 0x7cbd, 0x7cc1, 0x7cc7, 0x7ccc, 0x7ccd, 0x7cc8, 0x7cc5, 0x7cd7, 0x7ce8, 0x826e, 0x66a8, 0x7fbf, 0x7fce, 0x7fd5, 0x7fe5, 0x7fe1, 0x7fe6, 0x7fe9, 0x7fee, 0x7ff3, 0x7cf8, 0x7d77, 0x7da6, 0x7dae, 0x7e47, 0x7e9b, 0x9eb8, 0x9eb4, 0x8d73, 0x8d84, 0x8d94, 0x8d91, 0x8db1, 0x8d67, 0x8d6d, 0x8c47, 0x8c49, 0x914a, 0x9150, 0x914e, 0x914f, 0x9164, /* 0x75 */ 0x9162, 0x9161, 0x9170, 0x9169, 0x916f, 0x917d, 0x917e, 0x9172, 0x9174, 0x9179, 0x918c, 0x9185, 0x9190, 0x918d, 0x9191, 0x91a2, 0x91a3, 0x91aa, 0x91ad, 0x91ae, 0x91af, 0x91b5, 0x91b4, 0x91ba, 0x8c55, 0x9e7e, 0x8db8, 0x8deb, 0x8e05, 0x8e59, 0x8e69, 0x8db5, 0x8dbf, 0x8dbc, 0x8dba, 0x8dc4, 0x8dd6, 0x8dd7, 0x8dda, 0x8dde, 0x8dce, 0x8dcf, 0x8ddb, 0x8dc6, 0x8dec, 0x8df7, 0x8df8, 0x8de3, 0x8df9, 0x8dfb, 0x8de4, 0x8e09, 0x8dfd, 0x8e14, 0x8e1d, 0x8e1f, 0x8e2c, 0x8e2e, 0x8e23, 0x8e2f, 0x8e3a, 0x8e40, 0x8e39, 0x8e35, 0x8e3d, 0x8e31, 0x8e49, 0x8e41, 0x8e42, 0x8e51, 0x8e52, 0x8e4a, 0x8e70, 0x8e76, 0x8e7c, 0x8e6f, 0x8e74, 0x8e85, 0x8e8f, 0x8e94, 0x8e90, 0x8e9c, 0x8e9e, 0x8c78, 0x8c82, 0x8c8a, 0x8c85, 0x8c98, 0x8c94, 0x659b, 0x89d6, 0x89de, 0x89da, 0x89dc, /* 0x76 */ 0x89e5, 0x89eb, 0x89ef, 0x8a3e, 0x8b26, 0x9753, 0x96e9, 0x96f3, 0x96ef, 0x9706, 0x9701, 0x9708, 0x970f, 0x970e, 0x972a, 0x972d, 0x9730, 0x973e, 0x9f80, 0x9f83, 0x9f85, 0x9f86, 0x9f87, 0x9f88, 0x9f89, 0x9f8a, 0x9f8c, 0x9efe, 0x9f0b, 0x9f0d, 0x96b9, 0x96bc, 0x96bd, 0x96ce, 0x96d2, 0x77bf, 0x96e0, 0x928e, 0x92ae, 0x92c8, 0x933e, 0x936a, 0x93ca, 0x938f, 0x943e, 0x946b, 0x9c7f, 0x9c82, 0x9c85, 0x9c86, 0x9c87, 0x9c88, 0x7a23, 0x9c8b, 0x9c8e, 0x9c90, 0x9c91, 0x9c92, 0x9c94, 0x9c95, 0x9c9a, 0x9c9b, 0x9c9e, 0x9c9f, 0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8, 0x9ca9, 0x9cab, 0x9cad, 0x9cae, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3, 0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cca, 0x9ccb, /* 0x77 */ 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd7, 0x9cd8, 0x9cd9, 0x9cdc, 0x9cdd, 0x9cdf, 0x9ce2, 0x977c, 0x9785, 0x9791, 0x9792, 0x9794, 0x97af, 0x97ab, 0x97a3, 0x97b2, 0x97b4, 0x9ab1, 0x9ab0, 0x9ab7, 0x9e58, 0x9ab6, 0x9aba, 0x9abc, 0x9ac1, 0x9ac0, 0x9ac5, 0x9ac2, 0x9acb, 0x9acc, 0x9ad1, 0x9b45, 0x9b43, 0x9b47, 0x9b49, 0x9b48, 0x9b4d, 0x9b51, 0x98e8, 0x990d, 0x992e, 0x9955, 0x9954, 0x9adf, 0x9ae1, 0x9ae6, 0x9aef, 0x9aeb, 0x9afb, 0x9aed, 0x9af9, 0x9b08, 0x9b0f, 0x9b13, 0x9b1f, 0x9b23, 0x9ebd, 0x9ebe, 0x7e3b, 0x9e82, 0x9e87, 0x9e88, 0x9e8b, 0x9e92, 0x93d6, 0x9e9d, 0x9e9f, 0x9edb, 0x9edc, 0x9edd, 0x9ee0, 0x9edf, 0x9ee2, 0x9ee9, 0x9ee7, 0x9ee5, 0x9eea, 0x9eef, 0x9f22, 0x9f2c, 0x9f2f, 0x9f39, 0x9f37, 0x9f3d, 0x9f3e, 0x9f44, }; static int gb2312_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x29) || (c1 >= 0x30 && c1 <= 0x77)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); unsigned short wc = 0xfffd; if (i < 1410) { if (i < 831) wc = gb2312_2uni_page21[i]; } else { if (i < 8178) wc = gb2312_2uni_page30[i-1410]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short gb2312_2charset[7445] = { 0x2168, 0x216c, 0x2127, 0x2163, 0x2140, 0x2141, 0x2824, 0x2822, 0x2828, 0x2826, 0x283a, 0x282c, 0x282a, 0x2830, 0x282e, 0x2142, 0x2834, 0x2832, 0x2839, 0x2821, 0x2825, 0x2827, 0x2829, 0x282d, 0x2831, 0x2823, 0x282b, 0x282f, 0x2833, 0x2835, 0x2836, 0x2837, 0x2838, 0x2126, 0x2125, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, 0x262e, 0x262f, 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636, 0x2637, 0x2638, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647, 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656, 0x2657, 0x2658, 0x2727, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2728, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, 0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738, 0x2739, 0x273a, 0x273b, 0x273c, 0x273d, 0x273e, 0x273f, 0x2740, 0x2741, 0x2751, 0x2752, 0x2753, 0x2754, 0x2755, 0x2756, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c, 0x275d, 0x275e, 0x275f, 0x2760, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2768, 0x2769, 0x276a, 0x276b, 0x276c, 0x276d, 0x276e, 0x276f, 0x2770, 0x2771, 0x2757, 0x212a, 0x212c, 0x212e, 0x212f, 0x2130, 0x2131, 0x212d, 0x216b, 0x2164, 0x2165, 0x2179, 0x2166, 0x216d, 0x2271, 0x2272, 0x2273, 0x2274, 0x2275, 0x2276, 0x2277, 0x2278, 0x2279, 0x227a, 0x227b, 0x227c, 0x217b, 0x217c, 0x217a, 0x217d, 0x214a, 0x2147, 0x2146, 0x214c, 0x2158, 0x215e, 0x214f, 0x214e, 0x2144, 0x2145, 0x2149, 0x2148, 0x2152, 0x2153, 0x2160, 0x215f, 0x2143, 0x214b, 0x2157, 0x2156, 0x2155, 0x2159, 0x2154, 0x215c, 0x215d, 0x215a, 0x215b, 0x2151, 0x214d, 0x2150, 0x2259, 0x225a, 0x225b, 0x225c, 0x225d, 0x225e, 0x225f, 0x2260, 0x2261, 0x2262, 0x2245, 0x2246, 0x2247, 0x2248, 0x2249, 0x224a, 0x224b, 0x224c, 0x224d, 0x224e, 0x224f, 0x2250, 0x2251, 0x2252, 0x2253, 0x2254, 0x2255, 0x2256, 0x2257, 0x2258, 0x2231, 0x2232, 0x2233, 0x2234, 0x2235, 0x2236, 0x2237, 0x2238, 0x2239, 0x223a, 0x223b, 0x223c, 0x223d, 0x223e, 0x223f, 0x2240, 0x2241, 0x2242, 0x2243, 0x2244, 0x2924, 0x2925, 0x2926, 0x2927, 0x2928, 0x2929, 0x292a, 0x292b, 0x292c, 0x292d, 0x292e, 0x292f, 0x2930, 0x2931, 0x2932, 0x2933, 0x2934, 0x2935, 0x2936, 0x2937, 0x2938, 0x2939, 0x293a, 0x293b, 0x293c, 0x293d, 0x293e, 0x293f, 0x2940, 0x2941, 0x2942, 0x2943, 0x2944, 0x2945, 0x2946, 0x2947, 0x2948, 0x2949, 0x294a, 0x294b, 0x294c, 0x294d, 0x294e, 0x294f, 0x2950, 0x2951, 0x2952, 0x2953, 0x2954, 0x2955, 0x2956, 0x2957, 0x2958, 0x2959, 0x295a, 0x295b, 0x295c, 0x295d, 0x295e, 0x295f, 0x2960, 0x2961, 0x2962, 0x2963, 0x2964, 0x2965, 0x2966, 0x2967, 0x2968, 0x2969, 0x296a, 0x296b, 0x296c, 0x296d, 0x296e, 0x296f, 0x2176, 0x2175, 0x2178, 0x2177, 0x2174, 0x2173, 0x2170, 0x2172, 0x2171, 0x216f, 0x216e, 0x2162, 0x2161, 0x2121, 0x2122, 0x2123, 0x2128, 0x2129, 0x2134, 0x2135, 0x2136, 0x2137, 0x2138, 0x2139, 0x213a, 0x213b, 0x213e, 0x213f, 0x217e, 0x2132, 0x2133, 0x213c, 0x213d, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429, 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, 0x2430, 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, 0x2448, 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, 0x2458, 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471, 0x2472, 0x2473, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e, 0x254f, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2124, 0x2845, 0x2846, 0x2847, 0x2848, 0x2849, 0x284a, 0x284b, 0x284c, 0x284d, 0x284e, 0x284f, 0x2850, 0x2851, 0x2852, 0x2853, 0x2854, 0x2855, 0x2856, 0x2857, 0x2858, 0x2859, 0x285a, 0x285b, 0x285c, 0x285d, 0x285e, 0x285f, 0x2860, 0x2861, 0x2862, 0x2863, 0x2864, 0x2865, 0x2866, 0x2867, 0x2868, 0x2869, 0x2265, 0x2266, 0x2267, 0x2268, 0x2269, 0x226a, 0x226b, 0x226c, 0x226d, 0x226e, 0x523b, 0x3621, 0x465f, 0x4d72, 0x5549, 0x487d, 0x494f, 0x4f42, 0x5822, 0x323b, 0x536b, 0x5824, 0x3373, 0x5728, 0x4752, 0x5827, 0x4a40, 0x4770, 0x317b, 0x5235, 0x3454, 0x362b, 0x4b3f, 0x5829, 0x362a, 0x413d, 0x514f, 0x4925, 0x582d, 0x3876, 0x513e, 0x635c, 0x5650, 0x3761, 0x342e, 0x4159, 0x583c, 0x4d68, 0x3524, 0x4e2a, 0x5677, 0x4076, 0x3e59, 0x582f, 0x444b, 0x3e43, 0x5831, 0x4334, 0x5265, 0x562e, 0x4e5a, 0x5527, 0x3a75, 0x3726, 0x4056, 0x4639, 0x4552, 0x4747, 0x3954, 0x334b, 0x5252, 0x583f, 0x3e45, 0x4672, 0x5232, 0x4f30, 0x4f67, 0x4a69, 0x5840, 0x4272, 0x4252, 0x4869, 0x472c, 0x414b, 0x5368, 0x5579, 0x4a42, 0x367e, 0x5821, 0x535a, 0x3f77, 0x5446, 0x3b25, 0x5841, 0x4e65, 0x3e2e, 0x5828, 0x5147, 0x5029, 0x583d, 0x596f, 0x4d76, 0x3f3a, 0x3d3b, 0x3a25, 0x5260, 0x327a, 0x3a60, 0x4436, 0x4f6d, 0x3e29, 0x4d24, 0x4141, 0x4757, 0x5971, 0x5974, 0x484b, 0x5869, 0x525a, 0x4a32, 0x484a, 0x586c, 0x586a, 0x5846, 0x3d76, 0x464d, 0x3370, 0x586b, 0x3d71, 0x3d69, 0x4854, 0x3453, 0x4258, 0x3256, 0x5750, 0x4a4b, 0x4b7b, 0x554c, 0x3836, 0x4f49, 0x595a, 0x5870, 0x472a, 0x586e, 0x347a, 0x416e, 0x5254, 0x586d, 0x5247, 0x586f, 0x4347, 0x5176, 0x5659, 0x5872, 0x5875, 0x3c7e, 0x3c5b, 0x484e, 0x375d, 0x3742, 0x4673, 0x5878, 0x5241, 0x4e69, 0x3c3f, 0x377c, 0x3725, 0x505d, 0x565a, 0x5345, 0x3b6f, 0x3b61, 0x5871, 0x4921, 0x4e30, 0x342b, 0x5873, 0x494b, 0x5876, 0x4257, 0x5877, 0x4e31, 0x5879, 0x322e, 0x3940, 0x5923, 0x3069, 0x4166, 0x496c, 0x4b45, 0x4b46, 0x5924, 0x3568, 0x352b, 0x4e3b, 0x354d, 0x5721, 0x5774, 0x5353, 0x4c65, 0x3a4e, 0x5922, 0x595c, 0x5360, 0x587d, 0x3770, 0x5777, 0x587e, 0x587a, 0x5921, 0x4463, 0x5336, 0x5874, 0x595d, 0x587b, 0x4565, 0x4050, 0x5170, 0x305b, 0x3c51, 0x5926, 0x5925, 0x592c, 0x592e, 0x592b, 0x4a39, 0x5929, 0x5636, 0x335e, 0x5928, 0x407d, 0x4a4c, 0x592a, 0x5927, 0x5930, 0x3631, 0x3929, 0x5240, 0x4f40, 0x4242, 0x3d44, 0x556c, 0x3260, 0x4748, 0x3f6b, 0x592d, 0x592f, 0x4e6a, 0x3a6e, 0x4756, 0x3163, 0x3459, 0x366d, 0x5934, 0x3f21, 0x595e, 0x474e, 0x407e, 0x5938, 0x4b57, 0x377d, 0x5935, 0x5937, 0x3123, 0x5361, 0x5939, 0x5045, 0x5936, 0x5931, 0x5932, 0x4129, 0x5933, 0x3c73, 0x505e, 0x3829, 0x3e63, 0x593d, 0x593a, 0x3033, 0x5942, 0x5944, 0x3136, 0x593f, 0x3539, 0x3e73, 0x4c48, 0x3a72, 0x5250, 0x5943, 0x3d68, 0x332b, 0x5945, 0x3e6b, 0x5946, 0x593b, 0x445f, 0x593e, 0x5941, 0x5940, 0x552e, 0x5635, 0x4763, 0x5948, 0x3c59, 0x594a, 0x593c, 0x594b, 0x462b, 0x5949, 0x5776, 0x4d23, 0x3d21, 0x594c, 0x453c, 0x4d35, 0x594d, 0x5947, 0x3325, 0x3f7e, 0x3835, 0x407c, 0x3078, 0x3476, 0x594e, 0x594f, 0x3422, 0x5950, 0x345f, 0x3041, 0x5951, 0x4935, 0x4f71, 0x5952, 0x4145, 0x5956, 0x492e, 0x5955, 0x5954, 0x5957, 0x4b5b, 0x3d29, 0x4627, 0x5953, 0x5958, 0x5959, 0x4865, 0x405c, 0x3679, 0x5823, 0x544a, 0x542a, 0x5056, 0x3364, 0x5557, 0x4f48, 0x3962, 0x3f4b, 0x4362, 0x3652, 0x4d43, 0x596e, 0x5970, 0x3533, 0x3635, 0x3e24, 0x486b, 0x482b, 0x304b, 0x392b, 0x4179, 0x5962, 0x403c, 0x3932, 0x3958, 0x504b, 0x3178, 0x4664, 0x3e5f, 0x3564, 0x5748, 0x5178, 0x3c66, 0x4a5e, 0x3c3d, 0x5966, 0x5867, 0x445a, 0x3854, 0x483d, 0x3261, 0x5459, 0x4330, 0x4361, 0x5a22, 0x485f, 0x5034, 0x3e7c, 0x4529, 0x395a, 0x5a23, 0x5429, 0x5a24, 0x597b, 0x362c, 0x376b, 0x3179, 0x597c, 0x3365, 0x3e76, 0x3f76, 0x5231, 0x4064, 0x3633, 0x597e, 0x597d, 0x3e3b, 0x4660, 0x573c, 0x5a21, 0x4139, 0x3572, 0x4168, 0x3c75, 0x3455, 0x415d, 0x447d, 0x3c38, 0x3732, 0x376f, 0x596c, 0x463e, 0x3f2d, 0x3b4b, 0x354a, 0x5b49, 0x5057, 0x4d39, 0x303c, 0x3376, 0x3b77, 0x5b4a, 0x3a2f, 0x5464, 0x3536, 0x3573, 0x5856, 0x4850, 0x3756, 0x4750, 0x5857, 0x3f2f, 0x5b3b, 0x5858, 0x504c, 0x3b2e, 0x6b3e, 0x4150, 0x4175, 0x5472, 0x3855, 0x3434, 0x3375, 0x493e, 0x4550, 0x4559, 0x407b, 0x3170, 0x5859, 0x394e, 0x353d, 0x585a, 0x5646, 0x4b22, 0x482f, 0x4932, 0x344c, 0x3f4c, 0x3974, 0x585b, 0x585c, 0x3667, 0x3c41, 0x4c6a, 0x4f77, 0x585d, 0x4730, 0x3950, 0x3d23, 0x4c5e, 0x464a, 0x5860, 0x585e, 0x585f, 0x307e, 0x3e67, 0x4a23, 0x3c74, 0x3831, 0x386e, 0x5862, 0x3d4b, 0x5864, 0x5863, 0x457c, 0x5865, 0x5866, 0x4126, 0x4830, 0x306c, 0x3926, 0x3c53, 0x4e71, 0x5b3d, 0x4153, 0x362f, 0x567a, 0x452c, 0x3d59, 0x5b3e, 0x5b3f, 0x4078, 0x3e22, 0x404d, 0x5b40, 0x4a46, 0x322a, 0x5342, 0x4363, 0x512b, 0x5b42, 0x4055, 0x5b43, 0x3f31, 0x443c, 0x475a, 0x5b44, 0x5968, 0x4957, 0x3934, 0x4e70, 0x5448, 0x307c, 0x3452, 0x5059, 0x5969, 0x5e4b, 0x596b, 0x5830, 0x3b2f, 0x3131, 0x3357, 0x584e, 0x5451, 0x3d33, 0x3f6f, 0x4f3b, 0x5850, 0x374b, 0x5851, 0x4625, 0x4778, 0x523d, 0x5852, 0x4464, 0x4a2e, 0x4727, 0x5826, 0x497d, 0x4e67, 0x3b5c, 0x306b, 0x3b2a, 0x502d, 0x3130, 0x5764, 0x573f, 0x3525, 0x4274, 0x444f, 0x3229, 0x3237, 0x3165, 0x5f32, 0x553c, 0x3f28, 0x422c, 0x5855, 0x4231, 0x5854, 0x4e54, 0x5a60, 0x4e40, 0x5834, 0x432e, 0x5321, 0x4e23, 0x3c34, 0x4834, 0x4251, 0x3e6d, 0x5036, 0x5a61, 0x4764, 0x3327, 0x3672, 0x4c7c, 0x407a, 0x4077, 0x5139, 0x5161, 0x5847, 0x325e, 0x4065, 0x3a71, 0x5848, 0x542d, 0x4f61, 0x5849, 0x584a, 0x4f43, 0x3378, 0x3e47, 0x584b, 0x5b4c, 0x4825, 0x4f58, 0x487e, 0x324e, 0x5356, 0x3266, 0x3c30, 0x5351, 0x4b2b, 0x3734, 0x3722, 0x4a65, 0x4821, 0x4a5c, 0x3164, 0x5070, 0x4551, 0x5b45, 0x357e, 0x3f5a, 0x3945, 0x3e64, 0x416d, 0x5f36, 0x5f35, 0x563b, 0x3d50, 0x5559, 0x3048, 0x3623, 0x3f49, 0x4c28, 0x5f33, 0x4a37, 0x5352, 0x584f, 0x5236, 0x3a45, 0x4b3e, 0x4c3e, 0x5f37, 0x3570, 0x5f34, 0x5375, 0x3354, 0x3877, 0x5f3a, 0x3a4f, 0x3c2a, 0x3575, 0x4d2c, 0x437b, 0x3a73, 0x4074, 0x4d42, 0x4f72, 0x5f38, 0x4f45, 0x4240, 0x5f39, 0x4270, 0x3e7d, 0x415f, 0x4d4c, 0x5277, 0x374d, 0x5f41, 0x5f44, 0x3771, 0x3049, 0x3656, 0x3754, 0x3a2c, 0x4c7d, 0x3f54, 0x4b31, 0x4674, 0x5628, 0x5f45, 0x4e62, 0x3333, 0x4e7c, 0x3435, 0x4e47, 0x3a70, 0x4e61, 0x513d, 0x5f40, 0x3474, 0x334a, 0x3866, 0x5f3b, 0x4445, 0x5f3c, 0x5f3d, 0x5f3e, 0x453b, 0x5f3f, 0x5f42, 0x5431, 0x5f43, 0x473a, 0x4e58, 0x4458, 0x5f4a, 0x5f4f, 0x565c, 0x5f49, 0x5f5a, 0x4e36, 0x3a47, 0x5f4e, 0x5f48, 0x455e, 0x496b, 0x3a74, 0x437c, 0x3e57, 0x5f46, 0x5f4d, 0x4558, 0x5526, 0x3a4d, 0x3e4c, 0x533d, 0x3840, 0x5664, 0x5f47, 0x393e, 0x3f27, 0x417c, 0x5f4b, 0x5f4c, 0x5f50, 0x5f5b, 0x5f65, 0x5f57, 0x5f56, 0x5749, 0x5f63, 0x5f64, 0x656b, 0x5227, 0x5f52, 0x3f29, 0x545b, 0x3f48, 0x5f54, 0x4f4c, 0x5f5d, 0x514a, 0x5f5e, 0x3027, 0x4637, 0x5f53, 0x3a65, 0x365f, 0x4d5b, 0x397e, 0x5455, 0x5f5f, 0x4f6c, 0x3025, 0x5f67, 0x5f51, 0x5146, 0x5f55, 0x5f58, 0x5f59, 0x5f5c, 0x3b29, 0x5f60, 0x5f61, 0x5f62, 0x5f66, 0x5f68, 0x5334, 0x3867, 0x4536, 0x5f6a, 0x495a, 0x4128, 0x4444, 0x3f5e, 0x4f78, 0x555c, 0x5f6e, 0x3238, 0x3a5f, 0x5f6c, 0x5b41, 0x5164, 0x4b74, 0x343d, 0x3026, 0x5f71, 0x4c46, 0x5f72, 0x5f6d, 0x5f69, 0x5f6b, 0x5f6f, 0x5f70, 0x3b3d, 0x5f73, 0x5f74, 0x3b23, 0x4a5b, 0x4e28, 0x6027, 0x332a, 0x6026, 0x6021, 0x5f7e, 0x4d59, 0x5f7c, 0x5f7a, 0x3f50, 0x5744, 0x494c, 0x5f78, 0x3021, 0x5f7d, 0x5f7b, 0x6022, 0x6028, 0x3748, 0x4621, 0x4936, 0x4032, 0x5f75, 0x453e, 0x5844, 0x5f79, 0x4476, 0x6023, 0x6024, 0x6025, 0x5025, 0x6034, 0x4c64, 0x6031, 0x3f26, 0x602f, 0x4e39, 0x602b, 0x4946, 0x402e, 0x602e, 0x3a6d, 0x3a30, 0x6029, 0x5f76, 0x6033, 0x6038, 0x342d, 0x6039, 0x4f32, 0x3a48, 0x6030, 0x507a, 0x602c, 0x547b, 0x5f77, 0x4567, 0x602d, 0x5377, 0x6036, 0x6037, 0x6044, 0x5061, 0x603c, 0x6049, 0x604a, 0x603e, 0x602a, 0x4924, 0x6041, 0x6032, 0x4a48, 0x6043, 0x6035, 0x4e4b, 0x4b43, 0x604d, 0x6046, 0x6042, 0x604b, 0x603a, 0x603f, 0x6040, 0x6045, 0x6047, 0x6048, 0x604c, 0x603b, 0x4b54, 0x6055, 0x6056, 0x6052, 0x6050, 0x3c4e, 0x6051, 0x3842, 0x5845, 0x506a, 0x426f, 0x604f, 0x603d, 0x6054, 0x6053, 0x6057, 0x605c, 0x6058, 0x5676, 0x3330, 0x576c, 0x4b3b, 0x605a, 0x4e7b, 0x3a59, 0x6061, 0x605d, 0x522d, 0x6062, 0x605b, 0x6059, 0x605f, 0x6060, 0x605e, 0x6064, 0x4677, 0x582c, 0x546b, 0x6066, 0x4a49, 0x6065, 0x3841, 0x6067, 0x6068, 0x6069, 0x6063, 0x3a3f, 0x4c67, 0x606a, 0x4f79, 0x606b, 0x4842, 0x3d40, 0x4452, 0x606c, 0x606d, 0x4774, 0x4b44, 0x606e, 0x3b58, 0x5836, 0x5272, 0x606f, 0x4d45, 0x365a, 0x6071, 0x5430, 0x4027, 0x3451, 0x4e27, 0x6070, 0x6072, 0x394c, 0x397a, 0x4d3c, 0x6073, 0x4654, 0x6074, 0x5432, 0x4826, 0x6076, 0x6075, 0x6077, 0x4d41, 0x4a25, 0x545a, 0x5b57, 0x5b59, 0x5b58, 0x3967, 0x5b5c, 0x5b5d, 0x3558, 0x5b5a, 0x5b5b, 0x3321, 0x5b5f, 0x3b78, 0x5637, 0x5b60, 0x3e79, 0x373b, 0x5b50, 0x4c2e, 0x3f32, 0x3b35, 0x5778, 0x3f53, 0x3f69, 0x3c61, 0x4c33, 0x5b5e, 0x3053, 0x4e6b, 0x3758, 0x5739, 0x4642, 0x4024, 0x4c39, 0x5b67, 0x5b61, 0x463a, 0x5b63, 0x5b68, 0x4577, 0x5b6a, 0x5b69, 0x3f40, 0x5b66, 0x5b65, 0x3439, 0x402c, 0x4222, 0x5b62, 0x5b64, 0x504d, 0x5b6d, 0x405d, 0x5b72, 0x3662, 0x5b73, 0x5b52, 0x3938, 0x542b, 0x5b6c, 0x3f51, 0x5b70, 0x5b51, 0x3566, 0x5b6b, 0x3f65, 0x5b6e, 0x5b71, 0x5b79, 0x3921, 0x3023, 0x4271, 0x3347, 0x5b6f, 0x5b78, 0x4652, 0x5b74, 0x5b75, 0x5b77, 0x5b76, 0x5b7e, 0x5372, 0x323a, 0x5b7d, 0x5c24, 0x5b7b, 0x5b7a, 0x5b7c, 0x4560, 0x3b79, 0x5c23, 0x5c25, 0x4c43, 0x3651, 0x5d40, 0x5c21, 0x5c22, 0x4735, 0x3669, 0x5c27, 0x5c26, 0x5c29, 0x3124, 0x354c, 0x3f30, 0x515f, 0x3642, 0x5c28, 0x4b7a, 0x6b73, 0x4b5c, 0x4b7e, 0x4c41, 0x487b, 0x5c2a, 0x4c6e, 0x5c2b, 0x5b53, 0x5c2f, 0x5c2c, 0x3e33, 0x4a7b, 0x5c2d, 0x494a, 0x4439, 0x473d, 0x5c2e, 0x5476, 0x5066, 0x442b, 0x3655, 0x5b54, 0x315a, 0x5b55, 0x5b56, 0x3a3e, 0x4840, 0x4a3f, 0x4849, 0x5733, 0x4979, 0x3f47, 0x3a78, 0x523c, 0x623a, 0x3426, 0x3138, 0x3834, 0x4f44, 0x5967, 0x4f26, 0x4d62, 0x596d, 0x3660, 0x5239, 0x393b, 0x6239, 0x6237, 0x3473, 0x4c6c, 0x4c2b, 0x3772, 0x5832, 0x516b, 0x3a3b, 0x4a27, 0x4d37, 0x5244, 0x3f64, 0x3c50, 0x3661, 0x5e45, 0x5e46, 0x5b3c, 0x5159, 0x4666, 0x444e, 0x376e, 0x375c, 0x3f7c, 0x5760, 0x4675, 0x313c, 0x5e48, 0x3d31, 0x4c57, 0x5e4a, 0x5e49, 0x356c, 0x495d, 0x3042, 0x452e, 0x452b, 0x444c, 0x3c69, 0x4b7d, 0x3a43, 0x6579, 0x4867, 0x657a, 0x4d7d, 0x5731, 0x383e, 0x4268, 0x4851, 0x657b, 0x364a, 0x3c4b, 0x517d, 0x6621, 0x436e, 0x6624, 0x657e, 0x6625, 0x4d57, 0x3741, 0x657c, 0x657d, 0x6623, 0x445d, 0x6628, 0x6627, 0x4343, 0x465e, 0x662a, 0x4437, 0x6622, 0x4a3c, 0x3d63, 0x3943, 0x6626, 0x5055, 0x4e2f, 0x6629, 0x6630, 0x5226, 0x3d2a, 0x662d, 0x662f, 0x4051, 0x524c, 0x3c27, 0x6631, 0x5276, 0x574b, 0x4d7e, 0x4d5e, 0x4226, 0x662b, 0x662c, 0x3d3f, 0x662e, 0x6633, 0x6632, 0x6636, 0x6638, 0x446f, 0x4448, 0x3e6a, 0x496f, 0x6637, 0x3670, 0x4364, 0x5369, 0x6634, 0x6635, 0x4822, 0x663d, 0x6639, 0x4645, 0x4d71, 0x663b, 0x663c, 0x3b69, 0x663e, 0x663a, 0x4037, 0x5324, 0x663f, 0x4974, 0x6643, 0x6644, 0x5076, 0x433d, 0x4344, 0x6642, 0x6641, 0x6647, 0x4f31, 0x6b74, 0x664a, 0x6645, 0x3c5e, 0x4929, 0x3c35, 0x4f53, 0x6648, 0x6649, 0x664e, 0x6650, 0x6651, 0x664b, 0x3555, 0x664c, 0x664f, 0x445b, 0x6646, 0x664d, 0x6652, 0x6654, 0x6653, 0x6655, 0x5978, 0x6656, 0x6657, 0x5753, 0x665d, 0x665e, 0x3f57, 0x5450, 0x5756, 0x3466, 0x4b6f, 0x665a, 0x5843, 0x574e, 0x5022, 0x434f, 0x665f, 0x3c3e, 0x3942, 0x665b, 0x5127, 0x3a22, 0x424f, 0x582b, 0x4a6b, 0x656e, 0x665c, 0x3775, 0x4866, 0x4475, 0x6532, 0x447e, 0x4b7c, 0x6533, 0x552c, 0x536e, 0x4a58, 0x3032, 0x4b4e, 0x4d6a, 0x3a6a, 0x6535, 0x6534, 0x575a, 0x3959, 0x5666, 0x3628, 0x4d70, 0x524b, 0x3126, 0x4a35, 0x3368, 0x4973, 0x3f4d, 0x507b, 0x4a52, 0x6536, 0x3b42, 0x4f5c, 0x392c, 0x5457, 0x3a26, 0x5167, 0x4f7c, 0x3c52, 0x6537, 0x485d, 0x3f6d, 0x3176, 0x4b5e, 0x3c45, 0x3c44, 0x527a, 0x435c, 0x3f5c, 0x383b, 0x4342, 0x3a2e, 0x5422, 0x475e, 0x442f, 0x326c, 0x3951, 0x653b, 0x4148, 0x552f, 0x653c, 0x653e, 0x3467, 0x3654, 0x4b42, 0x5130, 0x353c, 0x4a59, 0x3762, 0x4964, 0x3d2b, 0x4e3e, 0x5770, 0x5021, 0x4959, 0x367b, 0x6658, 0x3c62, 0x333e, 0x4950, 0x6659, 0x3322, 0x5e4c, 0x5348, 0x5e4d, 0x5222, 0x5e4e, 0x3e4d, 0x5e4f, 0x4a2c, 0x527c, 0x335f, 0x656a, 0x4461, 0x3e21, 0x4e32, 0x4472, 0x3e56, 0x4628, 0x3263, 0x3e53, 0x477c, 0x4c6b, 0x3d6c, 0x4e5d, 0x4a3a, 0x4641, 0x656c, 0x503c, 0x5539, 0x656d, 0x4a74, 0x4d40, 0x4245, 0x656f, 0x4244, 0x6570, 0x6578, 0x4d4d, 0x493d, 0x5259, 0x6128, 0x536c, 0x4b6a, 0x4671, 0x612c, 0x6127, 0x6129, 0x612a, 0x612f, 0x326d, 0x612b, 0x385a, 0x612d, 0x612e, 0x6130, 0x353a, 0x6131, 0x6133, 0x6138, 0x5152, 0x6136, 0x6135, 0x416b, 0x6137, 0x5440, 0x6132, 0x613a, 0x3036, 0x6134, 0x3f79, 0x6139, 0x613b, 0x613e, 0x613c, 0x5645, 0x4f3f, 0x613d, 0x613f, 0x424d, 0x366b, 0x5378, 0x474d, 0x3765, 0x3e7e, 0x6140, 0x6141, 0x6147, 0x3367, 0x4669, 0x345e, 0x5142, 0x6148, 0x6146, 0x6145, 0x6143, 0x6142, 0x3140, 0x5538, 0x6144, 0x614b, 0x614c, 0x614a, 0x6f7a, 0x6153, 0x6152, 0x4736, 0x6149, 0x614e, 0x6150, 0x6154, 0x6151, 0x614d, 0x614f, 0x6155, 0x6156, 0x6157, 0x6158, 0x615a, 0x615b, 0x4e21, 0x675d, 0x3428, 0x565d, 0x5132, 0x3332, 0x3924, 0x5773, 0x4749, 0x3e5e, 0x392e, 0x4e57, 0x326e, 0x5b4f, 0x3c3a, 0x5251, 0x4b48, 0x304d, 0x4f6f, 0x5963, 0x3d6d, 0x3152, 0x4a50, 0x323c, 0x4b27, 0x372b, 0x4a26, 0x4f23, 0x6078, 0x554a, 0x607b, 0x607a, 0x4541, 0x4c7b, 0x4131, 0x6079, 0x5663, 0x322f, 0x5644, 0x355b, 0x3478, 0x5621, 0x4f2f, 0x306f, 0x607c, 0x6121, 0x3323, 0x607d, 0x607e, 0x4331, 0x435d, 0x6122, 0x3779, 0x3b4f, 0x6123, 0x443b, 0x6124, 0x6125, 0x6126, 0x3431, 0x3849, 0x463d, 0x446a, 0x3222, 0x5052, 0x675b, 0x3b43, 0x5357, 0x5344, 0x3963, 0x624f, 0x572f, 0x476c, 0x3153, 0x3432, 0x6251, 0x5072, 0x422e, 0x6250, 0x3f62, 0x5326, 0x3557, 0x6252, 0x356a, 0x436d, 0x387d, 0x382e, 0x4553, 0x374f, 0x6254, 0x6253, 0x3648, 0x5779, 0x4d25, 0x6258, 0x6256, 0x4a7c, 0x3f35, 0x5339, 0x6255, 0x6257, 0x412e, 0x4048, 0x625b, 0x625a, 0x402a, 0x414e, 0x625c, 0x625d, 0x625e, 0x5b48, 0x5153, 0x4d22, 0x3d28, 0x5e43, 0x5825, 0x3f2a, 0x5b4d, 0x526c, 0x467a, 0x452a, 0x5e44, 0x3157, 0x5f2e, 0x4a3d, 0x5f31, 0x392d, 0x527d, 0x3825, 0x3a6b, 0x335a, 0x355c, 0x5545, 0x4356, 0x4f52, 0x3b21, 0x6573, 0x6572, 0x6574, 0x4d64, 0x4875, 0x352f, 0x473f, 0x6576, 0x6c30, 0x6566, 0x3969, 0x3531, 0x423c, 0x6568, 0x6567, 0x6569, 0x524d, 0x616a, 0x504e, 0x4d2e, 0x5165, 0x324a, 0x316b, 0x3172, 0x456d, 0x5543, 0x5330, 0x615c, 0x615d, 0x525b, 0x3339, 0x314b, 0x4d79, 0x5577, 0x615e, 0x3e36, 0x347d, 0x615f, 0x3a5c, 0x6160, 0x3b32, 0x4249, 0x6161, 0x506c, 0x4d3d, 0x6162, 0x3543, 0x4547, 0x6163, 0x6164, 0x5379, 0x6165, 0x512d, 0x6166, 0x4e22, 0x6167, 0x3542, 0x6168, 0x3b55, 0x5044, 0x6260, 0x3158, 0x5264, 0x6261, 0x3c49, 0x484c, 0x6263, 0x6c7e, 0x6c7d, 0x5f2f, 0x6262, 0x563e, 0x4d7c, 0x4326, 0x6343, 0x5652, 0x6267, 0x6268, 0x5347, 0x626c, 0x3f6c, 0x626d, 0x6265, 0x3340, 0x446e, 0x626e, 0x5043, 0x3a76, 0x6269, 0x375e, 0x3b33, 0x4c2c, 0x4b4b, 0x6264, 0x6266, 0x626a, 0x626b, 0x6277, 0x6274, 0x5475, 0x6273, 0x452d, 0x557a, 0x4542, 0x3240, 0x626f, 0x6272, 0x412f, 0x4b3c, 0x3521, 0x6279, 0x3c31, 0x6271, 0x5054, 0x5439, 0x6275, 0x3956, 0x6276, 0x4753, 0x6270, 0x575c, 0x6d21, 0x6278, 0x6d25, 0x627e, 0x4a51, 0x4135, 0x3b50, 0x3f56, 0x3a63, 0x4b21, 0x6d26, 0x6d23, 0x6d22, 0x3b56, 0x6d27, 0x5074, 0x6d24, 0x3a5e, 0x3677, 0x6321, 0x3632, 0x4c71, 0x3927, 0x4f22, 0x4721, 0x3f52, 0x3671, 0x627a, 0x627b, 0x627d, 0x627c, 0x4455, 0x6322, 0x5341, 0x6327, 0x4744, 0x4f24, 0x6329, 0x3a37, 0x6328, 0x3b5a, 0x6323, 0x6324, 0x632a, 0x6326, 0x4e72, 0x5346, 0x3b3c, 0x5443, 0x447a, 0x6d28, 0x507c, 0x6325, 0x4375, 0x632d, 0x312f, 0x6332, 0x3c42, 0x632c, 0x353f, 0x4769, 0x6330, 0x3e2a, 0x4d6f, 0x3b73, 0x4c68, 0x632f, 0x6331, 0x4f27, 0x632e, 0x4e29, 0x3b5d, 0x356b, 0x3e65, 0x3252, 0x334d, 0x3139, 0x632b, 0x3251, 0x352c, 0x395f, 0x3668, 0x4f6b, 0x6337, 0x3b4c, 0x4847, 0x504a, 0x6338, 0x336e, 0x6d29, 0x537a, 0x5364, 0x6d2a, 0x6339, 0x5262, 0x6335, 0x535e, 0x3850, 0x6333, 0x6336, 0x375f, 0x6334, 0x4022, 0x633a, 0x5438, 0x3448, 0x633b, 0x3b45, 0x4977, 0x4965, 0x443d, 0x6d2b, 0x427d, 0x3b5b, 0x3f2e, 0x4e3f, 0x633c, 0x3f36, 0x316f, 0x5477, 0x633e, 0x6d2d, 0x633f, 0x3a29, 0x6d2c, 0x633d, 0x6340, 0x3a36, 0x362e, 0x5038, 0x3043, 0x6d2e, 0x6d2f, 0x4041, 0x6341, 0x4533, 0x6342, 0x5c32, 0x6d30, 0x386a, 0x4e6c, 0x6a27, 0x5067, 0x4a79, 0x4856, 0x4f37, 0x3349, 0x4e52, 0x3d64, 0x635e, 0x3b72, 0x6a28, 0x553d, 0x465d, 0x6a29, 0x6a2a, 0x6a2c, 0x6a2b, 0x6a2e, 0x6a2d, 0x3d58, 0x6a2f, 0x423e, 0x3441, 0x3477, 0x3b27, 0x6c66, 0x6c65, 0x373f, 0x4b79, 0x3162, 0x6c67, 0x4948, 0x6c68, 0x6c69, 0x4a56, 0x5e50, 0x3245, 0x547a, 0x464b, 0x3047, 0x3472, 0x4853, 0x4d50, 0x3f38, 0x3f5b, 0x4724, 0x5634, 0x4029, 0x5e51, 0x4928, 0x516f, 0x4524, 0x3067, 0x3336, 0x4845, 0x3062, 0x3776, 0x457a, 0x3673, 0x5552, 0x3350, 0x3c3c, 0x332d, 0x3e71, 0x3051, 0x5256, 0x4a63, 0x5725, 0x4d36, 0x3636, 0x3f39, 0x555b, 0x3827, 0x4557, 0x5e52, 0x3f59, 0x4255, 0x4740, 0x3b24, 0x3128, 0x456a, 0x457b, 0x4c27, 0x3127, 0x3556, 0x4428, 0x5e53, 0x513a, 0x3369, 0x4372, 0x3777, 0x5674, 0x3523, 0x3270, 0x4434, 0x4469, 0x402d, 0x5e54, 0x3068, 0x4544, 0x4160, 0x3955, 0x3e5c, 0x4d58, 0x304e, 0x4d4f, 0x5e56, 0x3e50, 0x573e, 0x5e55, 0x5550, 0x305d, 0x4462, 0x4223, 0x3c70, 0x5335, 0x4039, 0x4521, 0x3226, 0x5471, 0x4028, 0x4a43, 0x5e57, 0x557c, 0x3930, 0x482d, 0x4b29, 0x5e59, 0x3f3d, 0x4634, 0x5727, 0x4a30, 0x4443, 0x3356, 0x3952, 0x5638, 0x6a7c, 0x3034, 0x3f66, 0x4c74, 0x4d5a, 0x563f, 0x424e, 0x4e4e, 0x4c22, 0x502e, 0x4453, 0x3532, 0x5e58, 0x5575, 0x3c37, 0x3b53, 0x3024, 0x4532, 0x346c, 0x5571, 0x6a7d, 0x5e5a, 0x4d26, 0x4d6c, 0x4e66, 0x5e5c, 0x4d31, 0x4026, 0x573d, 0x5e5b, 0x3046, 0x3a34, 0x4953, 0x4473, 0x3e68, 0x3236, 0x404c, 0x4b70, 0x3c71, 0x3b3b, 0x3537, 0x4575, 0x5e66, 0x5e63, 0x3e5d, 0x5e5f, 0x3437, 0x3d5d, 0x5e60, 0x446d, 0x4f46, 0x3560, 0x365e, 0x4a5a, 0x3574, 0x5e65, 0x5546, 0x5e61, 0x4c4d, 0x467e, 0x4545, 0x5234, 0x3e72, 0x4253, 0x4c3d, 0x3338, 0x3d53, 0x3f58, 0x4d46, 0x515a, 0x346b, 0x5e64, 0x5e5d, 0x5e67, 0x6a7e, 0x4230, 0x5e62, 0x5640, 0x3527, 0x3274, 0x5e68, 0x5e72, 0x5e6d, 0x5e71, 0x4860, 0x5761, 0x5e6f, 0x4368, 0x4c61, 0x3265, 0x523e, 0x5e6e, 0x5e6b, 0x4e55, 0x3427, 0x3f2b, 0x3e3e, 0x3d52, 0x5e69, 0x542e, 0x5e5e, 0x5e6a, 0x403f, 0x5e6c, 0x3273, 0x3869, 0x4227, 0x3d41, 0x5e75, 0x5e78, 0x322b, 0x3424, 0x346a, 0x4926, 0x5e76, 0x4b51, 0x3863, 0x5e77, 0x5e7a, 0x5e79, 0x4c42, 0x3061, 0x346e, 0x653a, 0x502f, 0x326b, 0x6b21, 0x5e74, 0x4963, 0x5e73, 0x305a, 0x5221, 0x3177, 0x4c2f, 0x5e70, 0x4b24, 0x552a, 0x5e7b, 0x345d, 0x4426, 0x5e7d, 0x437e, 0x4421, 0x5f21, 0x414c, 0x5e7c, 0x3e6f, 0x4632, 0x3345, 0x4876, 0x4b3a, 0x5e7e, 0x5f24, 0x5732, 0x3337, 0x4143, 0x474b, 0x3225, 0x3469, 0x572b, 0x446c, 0x5f22, 0x5f23, 0x5f25, 0x3a33, 0x5f26, 0x405e, 0x4943, 0x3259, 0x4766, 0x5f27, 0x475c, 0x5f28, 0x6b22, 0x4b53, 0x5f2a, 0x5f29, 0x3241, 0x454a, 0x5f2b, 0x545c, 0x4841, 0x5f2c, 0x3e70, 0x5f2d, 0x5627, 0x6a37, 0x6b36, 0x4a55, 0x587c, 0x3844, 0x3925, 0x3745, 0x557e, 0x394a, 0x5027, 0x744d, 0x3550, 0x4374, 0x3e48, 0x6b37, 0x303d, 0x3d4c, 0x4132, 0x3156, 0x3328, 0x3852, 0x4922, 0x3658, 0x6b38, 0x3e34, 0x4a7d, 0x4743, 0x557b, 0x3773, 0x4e44, 0x552b, 0x3173, 0x6c33, 0x305f, 0x6c35, 0x3637, 0x414f, 0x757a, 0x5031, 0x5565, 0x4e53, 0x3d6f, 0x3362, 0x382b, 0x5536, 0x6d3d, 0x364f, 0x4b39, 0x5042, 0x373d, 0x6c36, 0x4a29, 0x4554, 0x6c39, 0x6c38, 0x4243, 0x6c37, 0x507d, 0x6c3a, 0x6c3b, 0x5765, 0x6c3c, 0x6c3d, 0x466c, 0x4e5e, 0x3c48, 0x4855, 0x3529, 0x3e49, 0x563c, 0x5467, 0x512e, 0x5071, 0x6a38, 0x6a39, 0x6a3a, 0x3a35, 0x4a31, 0x3f75, 0x4d7a, 0x6a40, 0x303a, 0x6a3e, 0x4025, 0x6a3b, 0x327d, 0x4377, 0x3b68, 0x5257, 0x4e74, 0x6a3f, 0x6a3c, 0x6a43, 0x5047, 0x5333, 0x343a, 0x4341, 0x5772, 0x5551, 0x4a47, 0x6a45, 0x6a44, 0x6a47, 0x6a46, 0x5667, 0x4f54, 0x6a4b, 0x3b4e, 0x3d7a, 0x494e, 0x6a4c, 0x4939, 0x4f7e, 0x6a4a, 0x544e, 0x6a4d, 0x6a4f, 0x4d6d, 0x6a49, 0x6a4e, 0x4e6e, 0x3b5e, 0x333f, 0x4655, 0x3e30, 0x4e7a, 0x4767, 0x3e27, 0x6a50, 0x5647, 0x4140, 0x545d, 0x6a51, 0x4f3e, 0x6a52, 0x4a6e, 0x452f, 0x3035, 0x6a54, 0x6a53, 0x745f, 0x443a, 0x3129, 0x655f, 0x6a55, 0x4a6f, 0x6a56, 0x6a57, 0x4658, 0x6a58, 0x6a59, 0x543b, 0x477a, 0x5237, 0x387c, 0x6a42, 0x325c, 0x427c, 0x5478, 0x4c66, 0x576e, 0x5442, 0x5350, 0x6b43, 0x4573, 0x377e, 0x6b54, 0x4b37, 0x6b5e, 0x404a, 0x4d7b, 0x332f, 0x465a, 0x6b7c, 0x443e, 0x4e34, 0x4429, 0x313e, 0x547d, 0x4a75, 0x566c, 0x4653, 0x3664, 0x3b7a, 0x5060, 0x4931, 0x5453, 0x4828, 0x384b, 0x683e, 0x493c, 0x683b, 0x406e, 0x5053, 0x3244, 0x3465, 0x683c, 0x5548, 0x3645, 0x683d, 0x4a78, 0x385c, 0x4c75, 0x4034, 0x516e, 0x683f, 0x6842, 0x3a3c, 0x312d, 0x3d5c, 0x6a3d, 0x6843, 0x6846, 0x684b, 0x684c, 0x4b49, 0x3065, 0x3c2b, 0x3939, 0x6841, 0x4d77, 0x684a, 0x4e76, 0x556d, 0x4156, 0x6844, 0x4336, 0x397b, 0x5626, 0x6848, 0x4a60, 0x5466, 0x6840, 0x6845, 0x6847, 0x4739, 0x3763, 0x6849, 0x3f5d, 0x6852, 0x6857, 0x6855, 0x3c5c, 0x3c4f, 0x685b, 0x685e, 0x685a, 0x317a, 0x3058, 0x4433, 0x384c, 0x4662, 0x483e, 0x4861, 0x684f, 0x6854, 0x6856, 0x3971, 0x6858, 0x5775, 0x447b, 0x685c, 0x3269, 0x6851, 0x3c6d, 0x3f42, 0x684d, 0x5679, 0x4178, 0x3271, 0x685f, 0x4a41, 0x6859, 0x5524, 0x316a, 0x553b, 0x684e, 0x6850, 0x3630, 0x6853, 0x685d, 0x4038, 0x4a77, 0x4b28, 0x465c, 0x4075, 0x6869, 0x5023, 0x6872, 0x566a, 0x6860, 0x6861, 0x5179, 0x3a4b, 0x3879, 0x3871, 0x5454, 0x686f, 0x686e, 0x686c, 0x3970, 0x4c52, 0x6866, 0x4e26, 0x3f72, 0x3038, 0x6871, 0x6870, 0x5740, 0x6864, 0x4d29, 0x4923, 0x3b38, 0x3d5b, 0x686a, 0x6862, 0x6863, 0x6865, 0x3535, 0x6867, 0x4745, 0x686b, 0x686d, 0x3d30, 0x572e, 0x6878, 0x6875, 0x4d30, 0x6876, 0x413a, 0x6868, 0x4337, 0x3070, 0x6874, 0x6877, 0x3923, 0x4952, 0x434e, 0x4e60, 0x4066, 0x4b73, 0x4c5d, 0x5035, 0x4a61, 0x6873, 0x3c6c, 0x6879, 0x435e, 0x4665, 0x3977, 0x3074, 0x5758, 0x3c2c, 0x456f, 0x4c44, 0x6926, 0x492d, 0x6922, 0x4062, 0x3f43, 0x687e, 0x3957, 0x687b, 0x6924, 0x524e, 0x6923, 0x5632, 0x5735, 0x6927, 0x3d37, 0x687c, 0x687d, 0x6921, 0x4d56, 0x522c, 0x6932, 0x6929, 0x342a, 0x343b, 0x692b, 0x5028, 0x6925, 0x337e, 0x692c, 0x4063, 0x692a, 0x6939, 0x6938, 0x692e, 0x687a, 0x6928, 0x3f2c, 0x6931, 0x693a, 0x4225, 0x692f, 0x3845, 0x692d, 0x535c, 0x6934, 0x6935, 0x6937, 0x6947, 0x4046, 0x6945, 0x6930, 0x693b, 0x3071, 0x693c, 0x5525, 0x693e, 0x693f, 0x6941, 0x4171, 0x4836, 0x693d, 0x6942, 0x6943, 0x6933, 0x6936, 0x3b31, 0x6940, 0x3c77, 0x6944, 0x6946, 0x694a, 0x694e, 0x325b, 0x6948, 0x372e, 0x694b, 0x694c, 0x5541, 0x4423, 0x6958, 0x3a61, 0x6949, 0x5323, 0x6954, 0x6957, 0x6950, 0x694f, 0x4741, 0x6952, 0x6959, 0x3348, 0x6953, 0x4f70, 0x694d, 0x3377, 0x6956, 0x695a, 0x4c34, 0x4f2d, 0x6955, 0x695c, 0x695b, 0x695e, 0x6951, 0x695d, 0x695f, 0x434a, 0x4737, 0x344e, 0x3b36, 0x5040, 0x6c23, 0x4537, 0x537b, 0x6c24, 0x6c25, 0x465b, 0x3f6e, 0x6c26, 0x6c27, 0x502a, 0x4738, 0x3868, 0x6c28, 0x5639, 0x557d, 0x344b, 0x323d, 0x4e64, 0x4667, 0x4d61, 0x3475, 0x4b40, 0x3c5f, 0x6962, 0x6963, 0x516a, 0x6965, 0x3479, 0x6964, 0x5133, 0x4a62, 0x3250, 0x6968, 0x6966, 0x6967, 0x5633, 0x6969, 0x696a, 0x696b, 0x696c, 0x6c2f, 0x4539, 0x364e, 0x5273, 0x356e, 0x3b59, 0x6c31, 0x5263, 0x4e63, 0x4438, 0x433f, 0x363e, 0x5839, 0x3148, 0x314f, 0x3151, 0x457e, 0x3150, 0x432b, 0x5531, 0x6b24, 0x3a41, 0x4c3a, 0x6b25, 0x6b27, 0x6b28, 0x6b26, 0x6b29, 0x6b2b, 0x6b2a, 0x6b2c, 0x4a4f, 0x5835, 0x4371, 0x4325, 0x4678, 0x6b2d, 0x444a, 0x6b2e, 0x6b2f, 0x6b30, 0x3755, 0x377a, 0x6b31, 0x4762, 0x6b33, 0x3a24, 0x5175, 0x3031, 0x6b32, 0x6b34, 0x352a, 0x4248, 0x4768, 0x6b35, 0x4b2e, 0x635f, 0x5340, 0x595b, 0x4d21, 0x562d, 0x4773, 0x5960, 0x3b63, 0x3a3a, 0x6362, 0x4f2b, 0x6360, 0x4947, 0x3a39, 0x5134, 0x6361, 0x486a, 0x392f, 0x3d2d, 0x3358, 0x4e5b, 0x4c40, 0x6368, 0x6369, 0x4d74, 0x4c2d, 0x3c33, 0x636a, 0x636b, 0x505a, 0x467b, 0x375a, 0x475f, 0x524a, 0x4e56, 0x6364, 0x636c, 0x4972, 0x3341, 0x6367, 0x4663, 0x6365, 0x6d33, 0x6366, 0x4933, 0x4566, 0x3935, 0x433b, 0x6363, 0x453d, 0x4124, 0x4259, 0x3257, 0x636d, 0x3b26, 0x442d, 0x6370, 0x3e5a, 0x637b, 0x6375, 0x3a53, 0x3750, 0x534d, 0x564e, 0x5553, 0x3941, 0x5534, 0x5158, 0x5039, 0x4776, 0x482a, 0x3234, 0x435a, 0x636e, 0x637c, 0x636f, 0x3728, 0x6377, 0x6374, 0x373a, 0x4522, 0x6376, 0x455d, 0x3228, 0x467c, 0x4460, 0x5722, 0x4061, 0x6379, 0x637a, 0x637d, 0x4c29, 0x6373, 0x533e, 0x3143, 0x6d34, 0x6371, 0x6372, 0x6378, 0x503a, 0x4643, 0x5473, 0x637e, 0x3d60, 0x6427, 0x6426, 0x5173, 0x6423, 0x6429, 0x4877, 0x4f34, 0x6428, 0x642e, 0x4265, 0x3634, 0x3d72, 0x6422, 0x3a69, 0x642a, 0x642c, 0x367d, 0x565e, 0x6432, 0x642d, 0x6421, 0x3b6e, 0x4d5d, 0x4722, 0x4549, 0x4177, 0x6424, 0x4733, 0x3d2c, 0x3d3d, 0x6425, 0x5747, 0x3262, 0x642b, 0x3c43, 0x642f, 0x3b6b, 0x6430, 0x4528, 0x6431, 0x5563, 0x3f23, 0x643a, 0x6437, 0x643b, 0x643d, 0x4656, 0x3a46, 0x404b, 0x3821, 0x6434, 0x5421, 0x3a23, 0x3d7e, 0x643c, 0x4d3f, 0x4479, 0x4f7b, 0x4966, 0x533f, 0x4f51, 0x6433, 0x6438, 0x6439, 0x4c69, 0x4c4e, 0x4054, 0x6435, 0x4130, 0x6436, 0x4e50, 0x3b41, 0x3553, 0x4873, 0x3d27, 0x5547, 0x492c, 0x3822, 0x644a, 0x644c, 0x5144, 0x523a, 0x3a2d, 0x3a54, 0x6443, 0x356d, 0x574d, 0x6440, 0x4f7d, 0x643f, 0x415c, 0x4c4a, 0x4a67, 0x4457, 0x4c54, 0x6448, 0x6447, 0x6441, 0x6444, 0x352d, 0x5359, 0x6446, 0x5279, 0x3463, 0x3b34, 0x496e, 0x343e, 0x3b6c, 0x514d, 0x4c6d, 0x6d35, 0x4765, 0x5428, 0x644b, 0x5755, 0x6442, 0x3d25, 0x6445, 0x5366, 0x6449, 0x4978, 0x643e, 0x5365, 0x477e, 0x3649, 0x547c, 0x3233, 0x6457, 0x4e42, 0x644d, 0x4e3c, 0x385b, 0x6456, 0x3f4a, 0x534e, 0x436c, 0x4548, 0x6458, 0x4d44, 0x644f, 0x6454, 0x6455, 0x3a7e, 0x4f66, 0x553f, 0x6452, 0x6450, 0x644e, 0x4d65, 0x4a2a, 0x4023, 0x3d26, 0x6453, 0x3848, 0x6467, 0x5434, 0x645b, 0x416f, 0x6469, 0x5267, 0x645f, 0x6460, 0x4f2a, 0x4b5d, 0x645a, 0x6451, 0x6465, 0x485c, 0x6463, 0x4467, 0x6462, 0x6461, 0x337c, 0x6468, 0x3561, 0x574c, 0x6466, 0x3b2c, 0x5752, 0x4c4f, 0x6b78, 0x6464, 0x3976, 0x564d, 0x6459, 0x645c, 0x427a, 0x645e, 0x424b, 0x4044, 0x4250, 0x3175, 0x4c32, 0x354e, 0x646f, 0x462f, 0x4661, 0x6475, 0x4229, 0x406c, 0x515d, 0x646e, 0x442e, 0x646d, 0x6476, 0x6474, 0x427e, 0x645d, 0x6470, 0x4a7e, 0x5544, 0x6471, 0x517a, 0x646b, 0x646c, 0x6472, 0x4e2b, 0x454b, 0x4731, 0x423a, 0x646a, 0x414a, 0x4c36, 0x3331, 0x647b, 0x6473, 0x647a, 0x647d, 0x647c, 0x334e, 0x333a, 0x6477, 0x6479, 0x6478, 0x456c, 0x403d, 0x5468, 0x6522, 0x3044, 0x6524, 0x6523, 0x3c24, 0x6525, 0x6521, 0x647e, 0x3174, 0x6528, 0x6529, 0x6526, 0x6527, 0x652a, 0x4659, 0x652b, 0x652d, 0x652c, 0x652f, 0x652e, 0x3960, 0x6530, 0x6531, 0x3b70, 0x6c61, 0x4370, 0x3546, 0x3b52, 0x4169, 0x546e, 0x3e44, 0x5746, 0x5456, 0x3253, 0x6c3e, 0x6a41, 0x422f, 0x3436, 0x5157, 0x3334, 0x4832, 0x3f3b, 0x6c40, 0x564b, 0x6c3f, 0x6c41, 0x6c45, 0x3e66, 0x4c3f, 0x455a, 0x3e3c, 0x6c46, 0x317e, 0x6c44, 0x5528, 0x3563, 0x6c42, 0x4136, 0x3363, 0x6c43, 0x4b38, 0x4043, 0x4c7e, 0x4152, 0x6c48, 0x3a66, 0x4053, 0x5672, 0x514c, 0x3f3e, 0x3733, 0x4955, 0x6c47, 0x3b62, 0x4c4c, 0x3d7d, 0x4848, 0x4f29, 0x4d69, 0x456b, 0x3769, 0x5149, 0x3a38, 0x6c49, 0x6c4a, 0x3b40, 0x6c4b, 0x6c62, 0x313a, 0x3759, 0x3d39, 0x6c4c, 0x5166, 0x6c4d, 0x483b, 0x6c51, 0x6c53, 0x3b4d, 0x3c65, 0x6c4f, 0x4937, 0x433a, 0x6c63, 0x5555, 0x6c50, 0x5673, 0x6c52, 0x6c4e, 0x6c54, 0x6c55, 0x493f, 0x4f28, 0x505c, 0x512c, 0x485b, 0x6c56, 0x4e75, 0x4a6c, 0x6c5a, 0x6c59, 0x303e, 0x6c57, 0x6c58, 0x6c64, 0x483c, 0x4147, 0x6c5c, 0x5160, 0x6c5b, 0x546f, 0x6c5d, 0x5b46, 0x6c5e, 0x312c, 0x6c5f, 0x6c60, 0x5726, 0x4540, 0x6b3c, 0x302e, 0x3e74, 0x3838, 0x522f, 0x3056, 0x3579, 0x5833, 0x4b2c, 0x635d, 0x462c, 0x3066, 0x4546, 0x6b39, 0x6b3a, 0x6b3b, 0x5140, 0x4523, 0x6a72, 0x4432, 0x4435, 0x404e, 0x6a73, 0x4441, 0x4e6f, 0x6a70, 0x6a74, 0x497c, 0x4723, 0x4c58, 0x4e7e, 0x6a75, 0x6a76, 0x4f2c, 0x4067, 0x6a77, 0x363f, 0x6a78, 0x6a79, 0x6a7a, 0x6a7b, 0x6a71, 0x482e, 0x616b, 0x3738, 0x616c, 0x616d, 0x5734, 0x616e, 0x616f, 0x534c, 0x6171, 0x3f71, 0x6170, 0x3552, 0x3137, 0x6173, 0x6172, 0x3a7c, 0x6174, 0x3937, 0x3e51, 0x447c, 0x3a5d, 0x3d46, 0x6175, 0x6177, 0x3640, 0x4f41, 0x4a28, 0x6176, 0x5578, 0x537c, 0x6178, 0x617c, 0x6179, 0x617a, 0x406a, 0x617e, 0x6221, 0x4047, 0x617b, 0x617d, 0x6225, 0x4154, 0x6223, 0x6228, 0x327e, 0x6222, 0x434d, 0x3242, 0x6227, 0x6226, 0x6224, 0x6229, 0x622b, 0x5049, 0x566d, 0x4328, 0x622c, 0x4f57, 0x622e, 0x3a6f, 0x6960, 0x622d, 0x622a, 0x3b2b, 0x5433, 0x6230, 0x622f, 0x6961, 0x6231, 0x6232, 0x6233, 0x4c21, 0x6234, 0x6235, 0x507e, 0x424a, 0x5371, 0x4d75, 0x6760, 0x6761, 0x3e41, 0x426a, 0x6764, 0x6763, 0x4d66, 0x4335, 0x6762, 0x3b37, 0x4f56, 0x4161, 0x6769, 0x6768, 0x6774, 0x3223, 0x676a, 0x6766, 0x676c, 0x676b, 0x493a, 0x5564, 0x6765, 0x3729, 0x6767, 0x676e, 0x6773, 0x5669, 0x676d, 0x6772, 0x6771, 0x3060, 0x6775, 0x4772, 0x4045, 0x406d, 0x4170, 0x6770, 0x6776, 0x4b76, 0x6822, 0x6821, 0x5741, 0x677a, 0x6779, 0x677b, 0x6777, 0x677e, 0x677d, 0x677c, 0x4155, 0x4759, 0x457d, 0x4543, 0x476d, 0x6823, 0x6826, 0x6825, 0x6827, 0x3a77, 0x6778, 0x6824, 0x4870, 0x492a, 0x6829, 0x3965, 0x517e, 0x6828, 0x682a, 0x682d, 0x682e, 0x4127, 0x682f, 0x6830, 0x682c, 0x6834, 0x682b, 0x6831, 0x6835, 0x6832, 0x6833, 0x6837, 0x6836, 0x394f, 0x702c, 0x702d, 0x4630, 0x306a, 0x483f, 0x4d5f, 0x4e4d, 0x6a31, 0x6a32, 0x463f, 0x3449, 0x6a33, 0x5567, 0x5d79, 0x6a34, 0x6a35, 0x6a36, 0x384a, 0x5f30, 0x4975, 0x4c70, 0x497a, 0x497b, 0x5343, 0x4b26, 0x3826, 0x702e, 0x3142, 0x6538, 0x4c6f, 0x5349, 0x3c57, 0x496a, 0x3567, 0x4450, 0x3569, 0x6e2e, 0x3b2d, 0x675e, 0x6e2f, 0x3329, 0x6e32, 0x6e31, 0x3d67, 0x6e30, 0x4e37, 0x454f, 0x4174, 0x5b4e, 0x6e33, 0x5073, 0x4254, 0x4668, 0x372c, 0x6e34, 0x336b, 0x3b7b, 0x6e35, 0x675c, 0x6e36, 0x3d2e, 0x7162, 0x4a68, 0x5249, 0x705a, 0x705b, 0x705c, 0x4146, 0x386d, 0x3e4e, 0x705e, 0x4531, 0x705d, 0x5171, 0x7060, 0x304c, 0x3d6a, 0x525f, 0x705f, 0x342f, 0x3768, 0x7066, 0x7065, 0x4623, 0x7061, 0x7062, 0x3443, 0x7063, 0x556e, 0x4c5b, 0x3e52, 0x3c32, 0x7068, 0x7067, 0x7064, 0x3221, 0x5622, 0x5338, 0x3e37, 0x482c, 0x706a, 0x5177, 0x564c, 0x3a5b, 0x7069, 0x363b, 0x4d34, 0x4626, 0x4121, 0x706b, 0x706e, 0x706d, 0x7070, 0x706c, 0x3b3e, 0x706f, 0x4c35, 0x7072, 0x3355, 0x3154, 0x7073, 0x7074, 0x7076, 0x3461, 0x7071, 0x7077, 0x707a, 0x7078, 0x7075, 0x707d, 0x7079, 0x707c, 0x707e, 0x7121, 0x4e41, 0x7124, 0x7123, 0x4176, 0x707b, 0x4a5d, 0x3471, 0x3171, 0x4c31, 0x7126, 0x7127, 0x712c, 0x554e, 0x7129, 0x4833, 0x7122, 0x712b, 0x7128, 0x7125, 0x712a, 0x3029, 0x712d, 0x712f, 0x7131, 0x7130, 0x712e, 0x5122, 0x7132, 0x7133, 0x396f, 0x3547, 0x3057, 0x3059, 0x546d, 0x3544, 0x3d54, 0x3b4a, 0x7027, 0x385e, 0x7028, 0x3028, 0x7029, 0x4d6e, 0x702a, 0x702b, 0x4624, 0x5665, 0x7164, 0x7165, 0x4373, 0x535b, 0x5651, 0x4568, 0x532f, 0x5266, 0x6e41, 0x303b, 0x5535, 0x514e, 0x3c60, 0x3a50, 0x3f78, 0x3847, 0x3541, 0x454c, 0x4a22, 0x434b, 0x6e42, 0x443f, 0x3622, 0x6d6c, 0x4324, 0x5631, 0x4f60, 0x6d6f, 0x454e, 0x365c, 0x4a21, 0x6d6d, 0x6d70, 0x6d71, 0x433c, 0x3f34, 0x6d6e, 0x6d74, 0x6d72, 0x5566, 0x435f, 0x6d73, 0x6d76, 0x5523, 0x5123, 0x6d75, 0x4350, 0x6d77, 0x3f74, 0x3e6c, 0x6d78, 0x4c77, 0x515b, 0x5745, 0x5576, 0x6d7c, 0x6d7b, 0x6d79, 0x6d7a, 0x6d7d, 0x3e26, 0x4b2f, 0x6e21, 0x363d, 0x6e22, 0x4440, 0x6d7e, 0x3d5e, 0x3247, 0x3643, 0x6e25, 0x583a, 0x6e23, 0x6e26, 0x4369, 0x3372, 0x6e27, 0x6e24, 0x4f39, 0x6e28, 0x4277, 0x6e29, 0x6e2a, 0x5e2b, 0x4633, 0x4746, 0x5675, 0x3549, 0x4b32, 0x6e2b, 0x4d2b, 0x6e2c, 0x5530, 0x6e2d, 0x7644, 0x5b47, 0x3423, 0x432c, 0x7166, 0x4a38, 0x5253, 0x562a, 0x6f72, 0x3e58, 0x3d43, 0x6f73, 0x364c, 0x302b, 0x4a2f, 0x6d36, 0x6d37, 0x4e79, 0x372f, 0x3f73, 0x6d38, 0x426b, 0x4930, 0x6d39, 0x4676, 0x3f33, 0x6d3c, 0x4578, 0x5150, 0x5729, 0x6d3a, 0x6d3b, 0x5162, 0x6d3f, 0x6d40, 0x6d44, 0x6d48, 0x6d46, 0x6d4e, 0x5568, 0x6d49, 0x6d47, 0x6d3e, 0x4569, 0x4646, 0x4969, 0x5452, 0x6d41, 0x6d42, 0x6d43, 0x6d45, 0x4079, 0x3421, 0x3968, 0x6d50, 0x6d51, 0x6d4a, 0x6d4f, 0x4e78, 0x4b36, 0x6d4c, 0x6d4d, 0x4f75, 0x6d52, 0x4172, 0x5332, 0x6d4b, 0x4837, 0x3c6f, 0x4570, 0x6d56, 0x356f, 0x4235, 0x302d, 0x4b69, 0x312e, 0x6d54, 0x4d6b, 0x3562, 0x6d55, 0x6d53, 0x6d57, 0x357a, 0x6d58, 0x6d59, 0x6d5c, 0x314c, 0x4576, 0x3c6e, 0x6d5a, 0x4c3c, 0x326a, 0x6d5b, 0x446b, 0x3445, 0x3075, 0x6d5f, 0x405a, 0x3468, 0x454d, 0x6d5d, 0x3f44, 0x6d5e, 0x4425, 0x6d60, 0x6d61, 0x6d63, 0x4157, 0x3b47, 0x3d38, 0x6d62, 0x6d64, 0x6d66, 0x6d65, 0x6d67, 0x4a3e, 0x6c6a, 0x4071, 0x4967, 0x6c6b, 0x466e, 0x6c6c, 0x466d, 0x6c6d, 0x6c70, 0x5766, 0x6c73, 0x6c71, 0x6c6e, 0x6c6f, 0x5723, 0x4971, 0x4b6e, 0x6c74, 0x6c72, 0x4f69, 0x6c76, 0x4631, 0x3c40, 0x6c75, 0x353b, 0x3b76, 0x6c77, 0x5977, 0x3d7b, 0x423b, 0x6c78, 0x6c79, 0x3823, 0x6c7a, 0x6c7b, 0x6c7c, 0x536d, 0x582e, 0x406b, 0x475d, 0x3a4c, 0x5063, 0x4b3d, 0x4d3a, 0x3851, 0x317c, 0x476f, 0x5656, 0x3f46, 0x436b, 0x6f75, 0x4358, 0x5762, 0x6f77, 0x3353, 0x4758, 0x516d, 0x5648, 0x6f78, 0x6f76, 0x3b7d, 0x3346, 0x3d55, 0x5246, 0x3b60, 0x4f21, 0x6f7c, 0x6f7b, 0x6f79, 0x334c, 0x4954, 0x4b30, 0x6f7e, 0x305e, 0x5649, 0x6f7d, 0x336d, 0x7655, 0x4e48, 0x7022, 0x7021, 0x353e, 0x3c5a, 0x3b7c, 0x3865, 0x4442, 0x7023, 0x4b6b, 0x7026, 0x5128, 0x3e3f, 0x476e, 0x7136, 0x7137, 0x3f55, 0x3429, 0x7138, 0x4d3b, 0x4754, 0x552d, 0x7139, 0x713a, 0x474f, 0x5224, 0x564f, 0x713b, 0x3d51, 0x3430, 0x3e3d, 0x345c, 0x4e51, 0x3f5f, 0x713d, 0x3f7a, 0x713c, 0x713f, 0x713e, 0x7140, 0x7141, 0x417e, 0x4122, 0x4a7a, 0x553e, 0x3e3a, 0x3e39, 0x5542, 0x3f22, 0x4d2f, 0x7135, 0x3d5f, 0x364b, 0x5671, 0x7343, 0x7344, 0x384d, 0x7346, 0x7347, 0x304a, 0x7345, 0x7349, 0x4b71, 0x734b, 0x5026, 0x314a, 0x7348, 0x734f, 0x3551, 0x7357, 0x7352, 0x7354, 0x7353, 0x377b, 0x313f, 0x734e, 0x734a, 0x355a, 0x7350, 0x7351, 0x7355, 0x734d, 0x3c63, 0x417d, 0x7356, 0x735a, 0x734c, 0x3548, 0x3d6e, 0x735c, 0x3724, 0x3f70, 0x567e, 0x4d32, 0x3470, 0x325f, 0x7358, 0x7359, 0x4938, 0x735d, 0x735e, 0x7361, 0x735f, 0x7363, 0x7362, 0x735b, 0x3f6a, 0x336f, 0x7360, 0x4729, 0x3c72, 0x736b, 0x393f, 0x7364, 0x322d, 0x3b7e, 0x4b63, 0x736d, 0x7369, 0x395c, 0x736e, 0x7365, 0x7366, 0x736a, 0x4261, 0x736c, 0x736f, 0x7368, 0x3c7d, 0x4f64, 0x7370, 0x7367, 0x7372, 0x572d, 0x462a, 0x7373, 0x7371, 0x4228, 0x385d, 0x7375, 0x7374, 0x345b, 0x7376, 0x7377, 0x7378, 0x403a, 0x4069, 0x4571, 0x737b, 0x737a, 0x3458, 0x737e, 0x7379, 0x737c, 0x737d, 0x7421, 0x7423, 0x3b49, 0x7422, 0x7424, 0x323e, 0x7426, 0x7425, 0x3c2e, 0x4357, 0x5961, 0x4060, 0x744c, 0x5751, 0x375b, 0x744e, 0x4123, 0x4649, 0x3456, 0x5533, 0x7450, 0x744f, 0x7451, 0x4b5a, 0x7452, 0x5441, 0x5660, 0x3760, 0x4138, 0x413b, 0x7453, 0x3e2c, 0x3462, 0x7454, 0x7455, 0x3e2b, 0x7456, 0x745b, 0x7457, 0x745a, 0x3a7d, 0x7458, 0x7459, 0x3862, 0x4c47, 0x745c, 0x325a, 0x4353, 0x5463, 0x3f37, 0x745d, 0x4534, 0x7469, 0x4f35, 0x4e49, 0x4b58, 0x4b77, 0x3d74, 0x574f, 0x405b, 0x5075, 0x746a, 0x746b, 0x746c, 0x7763, 0x3731, 0x746d, 0x576b, 0x746e, 0x6679, 0x3e40, 0x667a, 0x3a6c, 0x667b, 0x4f4b, 0x667c, 0x543c, 0x3c36, 0x667d, 0x667e, 0x3c4d, 0x4852, 0x4e33, 0x6721, 0x343f, 0x6722, 0x4934, 0x3859, 0x4449, 0x575d, 0x425a, 0x3757, 0x563d, 0x4e46, 0x3744, 0x4526, 0x6723, 0x4f5f, 0x6724, 0x6725, 0x6726, 0x4137, 0x5769, 0x4970, 0x4f38, 0x562f, 0x5655, 0x6727, 0x306d, 0x6728, 0x6729, 0x495c, 0x526f, 0x3e2d, 0x672a, 0x3073, 0x485e, 0x3d61, 0x672b, 0x4846, 0x672c, 0x3b66, 0x3878, 0x5124, 0x672d, 0x4267, 0x3e78, 0x3d4a, 0x4d33, 0x672e, 0x672f, 0x3e6e, 0x5065, 0x4b67, 0x4c50, 0x3c4c, 0x6730, 0x3c28, 0x5077, 0x6731, 0x5078, 0x6732, 0x6733, 0x3442, 0x6734, 0x6735, 0x497e, 0x4e2c, 0x4360, 0x6737, 0x3141, 0x3371, 0x6738, 0x6739, 0x575b, 0x5540, 0x673a, 0x424c, 0x573a, 0x673b, 0x673c, 0x673d, 0x3c6a, 0x4365, 0x4042, 0x673e, 0x673f, 0x3c29, 0x6740, 0x6741, 0x6736, 0x3650, 0x6742, 0x6743, 0x6744, 0x3b3a, 0x355e, 0x4246, 0x3160, 0x6745, 0x5435, 0x6746, 0x383f, 0x6748, 0x6747, 0x376c, 0x6749, 0x3278, 0x674a, 0x674b, 0x674c, 0x674d, 0x674e, 0x674f, 0x6750, 0x5327, 0x4b75, 0x6751, 0x6752, 0x6753, 0x6754, 0x4949, 0x6755, 0x6756, 0x6757, 0x6758, 0x6759, 0x3d49, 0x675a, 0x733e, 0x3857, 0x4831, 0x733f, 0x7340, 0x7341, 0x395e, 0x4d78, 0x5868, 0x3a31, 0x425e, 0x6e37, 0x3723, 0x6e39, 0x6e38, 0x3055, 0x6e3b, 0x5556, 0x576f, 0x5643, 0x6e3d, 0x4a70, 0x6e3c, 0x6e3e, 0x6e40, 0x6e3f, 0x5172, 0x473c, 0x4340, 0x3861, 0x4167, 0x7446, 0x505f, 0x7447, 0x4f5b, 0x483a, 0x7448, 0x7449, 0x744a, 0x744b, 0x597a, 0x387e, 0x6571, 0x5370, 0x7460, 0x4e4c, 0x3361, 0x7134, 0x526e, 0x7461, 0x4f68, 0x7462, 0x474c, 0x3554, 0x3464, 0x7464, 0x7463, 0x7465, 0x7466, 0x7467, 0x3a32, 0x303f, 0x7468, 0x372d, 0x526d, 0x522b, 0x404f, 0x3f3c, 0x6b23, 0x555f, 0x6a48, 0x7173, 0x3678, 0x4b23, 0x444d, 0x7167, 0x7168, 0x387b, 0x7169, 0x3a44, 0x5445, 0x3052, 0x716a, 0x716b, 0x716c, 0x716d, 0x716e, 0x716f, 0x7171, 0x7170, 0x4555, 0x7172, 0x367a, 0x7174, 0x522e, 0x5e47, 0x4b4a, 0x335c, 0x3522, 0x3922, 0x4474, 0x7175, 0x7176, 0x4144, 0x417b, 0x5630, 0x7177, 0x7178, 0x412a, 0x4638, 0x3e5b, 0x7179, 0x344f, 0x717a, 0x6d32, 0x6d31, 0x4b60, 0x525e, 0x4b41, 0x5558, 0x4862, 0x405f, 0x3c21, 0x6b41, 0x5024, 0x5662, 0x3647, 0x3858, 0x6b40, 0x384e, 0x6b3f, 0x3326, 0x3949, 0x562b, 0x3774, 0x374a, 0x3c67, 0x373e, 0x6b46, 0x6b47, 0x3039, 0x3f4f, 0x6b45, 0x537d, 0x6b48, 0x6b49, 0x374e, 0x6b42, 0x6b44, 0x4976, 0x5657, 0x554d, 0x5032, 0x6b4f, 0x4e38, 0x6b50, 0x3528, 0x3133, 0x6b52, 0x4c25, 0x4556, 0x6b53, 0x6b51, 0x455f, 0x6b4e, 0x4a24, 0x6b55, 0x307b, 0x3a7a, 0x5837, 0x7163, 0x6b4a, 0x6b4b, 0x6b4c, 0x6b4d, 0x6b56, 0x6640, 0x6b59, 0x3f68, 0x5248, 0x6b57, 0x6b5c, 0x386c, 0x6b58, 0x3d3a, 0x5058, 0x3037, 0x6b5d, 0x445c, 0x562c, 0x3460, 0x4276, 0x3c39, 0x6b5a, 0x6b5b, 0x5460, 0x466a, 0x4454, 0x6b5f, 0x4527, 0x5975, 0x3231, 0x6b64, 0x3d45, 0x6b62, 0x6b63, 0x382c, 0x4d51, 0x6b65, 0x6b61, 0x4133, 0x4622, 0x4c73, 0x6b66, 0x4030, 0x5238, 0x6b67, 0x382f, 0x382d, 0x6b68, 0x473b, 0x4d73, 0x6b6a, 0x6b6b, 0x6b6d, 0x5048, 0x6b72, 0x6b6e, 0x6b71, 0x4879, 0x517c, 0x6b6c, 0x6b69, 0x3839, 0x4f59, 0x4465, 0x6b6f, 0x6b70, 0x4c5a, 0x4d48, 0x3072, 0x6b76, 0x6b75, 0x3232, 0x3860, 0x6b77, 0x316c, 0x4c45, 0x4424, 0x4f25, 0x6b79, 0x6c22, 0x4572, 0x6b7a, 0x4945, 0x625f, 0x6b7e, 0x4d4e, 0x6c21, 0x315b, 0x5337, 0x525c, 0x6b7d, 0x6b7b, 0x333c, 0x6a30, 0x5754, 0x742b, 0x3374, 0x5641, 0x5642, 0x5569, 0x3e4a, 0x7427, 0x5228, 0x7428, 0x7429, 0x742a, 0x3e4b, 0x535f, 0x4960, 0x4961, 0x7342, 0x4a66, 0x4c72, 0x6236, 0x4b34, 0x4e68, 0x565b, 0x742d, 0x742e, 0x742f, 0x7432, 0x3a3d, 0x7433, 0x3063, 0x7430, 0x7431, 0x3d22, 0x3255, 0x7436, 0x7437, 0x3666, 0x3230, 0x4f4f, 0x7434, 0x342c, 0x7435, 0x7438, 0x7439, 0x4d27, 0x743a, 0x743b, 0x743c, 0x4b52, 0x743d, 0x743e, 0x743f, 0x745e, 0x413c, 0x3c68, 0x492b, 0x515e, 0x6575, 0x5c33, 0x5255, 0x5c34, 0x302c, 0x5c35, 0x3d5a, 0x5c39, 0x5842, 0x5c37, 0x5373, 0x4956, 0x5c3a, 0x5c36, 0x5c3b, 0x4322, 0x5c3c, 0x5c45, 0x5c3d, 0x4e5f, 0x5625, 0x5c4f, 0x5c4d, 0x5c52, 0x3d66, 0x422b, 0x5c38, 0x5c4b, 0x5c4e, 0x5c3e, 0x3752, 0x3045, 0x5c47, 0x503e, 0x5c41, 0x3b28, 0x373c, 0x5c4c, 0x5c46, 0x5c3f, 0x475b, 0x513f, 0x5c40, 0x5c4a, 0x5c50, 0x4e2d, 0x5c42, 0x5c43, 0x5c48, 0x5c49, 0x3254, 0x5c51, 0x4b55, 0x5437, 0x5c5b, 0x5c5f, 0x4c26, 0x5c66, 0x4367, 0x5c5c, 0x3f41, 0x5c59, 0x307a, 0x3936, 0x5c65, 0x5c53, 0x5c44, 0x5c56, 0x4874, 0x3f60, 0x493b, 0x313d, 0x5322, 0x5c5a, 0x5c55, 0x463b, 0x5c5e, 0x5742, 0x432f, 0x3736, 0x4751, 0x4329, 0x5c62, 0x5c58, 0x5c6b, 0x5c54, 0x5c5d, 0x3e25, 0x5c57, 0x5c60, 0x5c63, 0x5c64, 0x5c78, 0x5c61, 0x5d22, 0x5c67, 0x3c6b, 0x3444, 0x4323, 0x3267, 0x5c7a, 0x5c72, 0x5c6f, 0x5c7c, 0x5c6e, 0x5270, 0x3268, 0x4857, 0x4863, 0x5c7b, 0x5c6d, 0x5c77, 0x5c75, 0x3e23, 0x5c74, 0x325d, 0x5c73, 0x3c76, 0x5c68, 0x3b44, 0x4073, 0x3c54, 0x5c69, 0x5c6a, 0x5c71, 0x5c76, 0x5c79, 0x3534, 0x4859, 0x3b67, 0x5c7e, 0x5c7d, 0x532b, 0x5d21, 0x5d23, 0x5d25, 0x5271, 0x5d24, 0x5d26, 0x5d27, 0x5229, 0x3a49, 0x5d29, 0x5d36, 0x5d31, 0x5d34, 0x5d30, 0x464e, 0x4072, 0x492f, 0x5c6c, 0x5d2e, 0x5d37, 0x5c70, 0x5d2f, 0x5d38, 0x5d2c, 0x5d39, 0x5d33, 0x5d2d, 0x442a, 0x5d28, 0x4033, 0x412b, 0x5d2a, 0x5d2b, 0x5d32, 0x3b71, 0x5d35, 0x5328, 0x5d3a, 0x5d3b, 0x4327, 0x5d52, 0x5d3c, 0x5d51, 0x393d, 0x3e55, 0x3e7a, 0x3a4a, 0x5d4a, 0x5d45, 0x5d3f, 0x324b, 0x5d43, 0x5d4b, 0x3224, 0x5d55, 0x5d3e, 0x4650, 0x5d50, 0x5d54, 0x4162, 0x3746, 0x5d4e, 0x5d4f, 0x5d44, 0x5d3d, 0x5d4d, 0x4c51, 0x5d49, 0x5d42, 0x4348, 0x463c, 0x4e2e, 0x5d4c, 0x5d48, 0x5d41, 0x5d46, 0x425c, 0x5329, 0x532a, 0x5d53, 0x4f74, 0x4878, 0x5d66, 0x5d47, 0x5d60, 0x4264, 0x5d61, 0x5d57, 0x5678, 0x5d59, 0x5d58, 0x3870, 0x5d56, 0x464f, 0x362d, 0x5d62, 0x3a79, 0x5461, 0x5d67, 0x3450, 0x5d5a, 0x3f7b, 0x5d63, 0x5d5f, 0x5d5d, 0x3559, 0x5d5b, 0x5d5c, 0x5d5e, 0x3d2f, 0x5d64, 0x5d65, 0x5d75, 0x4349, 0x4b62, 0x5d72, 0x5861, 0x4651, 0x5d74, 0x5574, 0x5d73, 0x5d70, 0x5d6c, 0x5d6f, 0x5d68, 0x506e, 0x4858, 0x5d6e, 0x5d69, 0x5d6a, 0x4b72, 0x5d6d, 0x314d, 0x4036, 0x3c3b, 0x5d71, 0x5d77, 0x5d76, 0x5d6b, 0x456e, 0x5d7b, 0x5e24, 0x5e23, 0x5d78, 0x436f, 0x427b, 0x5561, 0x4e35, 0x5d7d, 0x324c, 0x4468, 0x4a5f, 0x473e, 0x5d7a, 0x5d7c, 0x5d7e, 0x5e22, 0x302a, 0x314e, 0x5e2c, 0x5e26, 0x3d36, 0x486f, 0x5e21, 0x5e25, 0x5e29, 0x5e28, 0x5e27, 0x5e2d, 0x544c, 0x5e33, 0x5e2a, 0x5e2e, 0x4059, 0x3121, 0x5e36, 0x5e31, 0x5e32, 0x5126, 0x5e35, 0x5e2f, 0x5e30, 0x503d, 0x5e34, 0x4a6d, 0x5e39, 0x5e38, 0x5e37, 0x5e3b, 0x3d65, 0x3258, 0x436a, 0x5e3a, 0x453a, 0x5e3c, 0x4c59, 0x372a, 0x5465, 0x5e3d, 0x5e3f, 0x4422, 0x5e41, 0x5e3e, 0x5e40, 0x553a, 0x5e42, 0x722e, 0x3b22, 0x4232, 0x4530, 0x4247, 0x722f, 0x5069, 0x535d, 0x6b3d, 0x3366, 0x7230, 0x7231, 0x4a2d, 0x3a67, 0x7233, 0x7235, 0x7234, 0x4b64, 0x4f3a, 0x7232, 0x4a34, 0x524f, 0x426c, 0x4e43, 0x7238, 0x3076, 0x7237, 0x723e, 0x324f, 0x5141, 0x723a, 0x723c, 0x5469, 0x723b, 0x7236, 0x723f, 0x723d, 0x7239, 0x7247, 0x7244, 0x7246, 0x724a, 0x7242, 0x7240, 0x7245, 0x567b, 0x7241, 0x4779, 0x495f, 0x7248, 0x3946, 0x3530, 0x7243, 0x7249, 0x7250, 0x7256, 0x3b57, 0x7255, 0x4d5c, 0x566b, 0x7252, 0x7254, 0x3872, 0x724b, 0x724e, 0x4279, 0x555d, 0x724c, 0x724d, 0x724f, 0x7253, 0x7259, 0x533c, 0x366a, 0x4a71, 0x3764, 0x7257, 0x7258, 0x725a, 0x725d, 0x725b, 0x725c, 0x5151, 0x7251, 0x4d49, 0x4e4f, 0x5629, 0x7263, 0x435b, 0x7260, 0x402f, 0x726c, 0x725e, 0x7261, 0x7268, 0x7262, 0x7267, 0x7266, 0x7269, 0x725f, 0x7264, 0x726a, 0x532c, 0x7265, 0x3275, 0x7272, 0x502b, 0x7275, 0x3b48, 0x7279, 0x7270, 0x7276, 0x7278, 0x727a, 0x7273, 0x7271, 0x3a7b, 0x357b, 0x726f, 0x7277, 0x726d, 0x726e, 0x726b, 0x7326, 0x7323, 0x7322, 0x7274, 0x485a, 0x727b, 0x7325, 0x4378, 0x727d, 0x7327, 0x7329, 0x7324, 0x727c, 0x732b, 0x732a, 0x425d, 0x732e, 0x7330, 0x7321, 0x7331, 0x732c, 0x732f, 0x727e, 0x732d, 0x7332, 0x7334, 0x7328, 0x7333, 0x7335, 0x5037, 0x7338, 0x5979, 0x7339, 0x7337, 0x4864, 0x7336, 0x733a, 0x733b, 0x3440, 0x6e43, 0x733c, 0x733d, 0x512a, 0x742c, 0x5046, 0x5050, 0x515c, 0x4f4e, 0x3d56, 0x5143, 0x3a62, 0x6169, 0x5242, 0x7142, 0x3239, 0x316d, 0x7143, 0x4940, 0x3344, 0x5972, 0x4b25, 0x7144, 0x5654, 0x7145, 0x7440, 0x7146, 0x542c, 0x7147, 0x3040, 0x7441, 0x7442, 0x347c, 0x455b, 0x4c3b, 0x5064, 0x4d60, 0x7148, 0x5973, 0x313b, 0x4f2e, 0x3824, 0x714a, 0x714b, 0x3243, 0x4151, 0x5730, 0x7149, 0x714c, 0x714e, 0x5976, 0x5261, 0x5423, 0x7443, 0x4839, 0x7444, 0x714d, 0x714f, 0x3f63, 0x7150, 0x7154, 0x7156, 0x7151, 0x4951, 0x4561, 0x4263, 0x397c, 0x7153, 0x7155, 0x3953, 0x715b, 0x3a56, 0x307d, 0x7159, 0x7158, 0x7152, 0x715a, 0x7157, 0x486c, 0x4d4a, 0x715d, 0x653d, 0x715c, 0x715e, 0x715f, 0x4f65, 0x7445, 0x3d73, 0x7160, 0x7161, 0x4e77, 0x522a, 0x717b, 0x3832, 0x3c7b, 0x395b, 0x3966, 0x4359, 0x4a53, 0x6a68, 0x4040, 0x3e75, 0x6a69, 0x6a6a, 0x6a6b, 0x6a6c, 0x6a6d, 0x6a6e, 0x6a6f, 0x3d47, 0x757b, 0x757d, 0x757e, 0x757c, 0x3d62, 0x7621, 0x3425, 0x7622, 0x7623, 0x6c32, 0x5154, 0x596a, 0x7624, 0x6e3a, 0x5532, 0x537e, 0x4c5c, 0x4a44, 0x6540, 0x7625, 0x3e2f, 0x4629, 0x5a25, 0x3c46, 0x3629, 0x383c, 0x484f, 0x3c25, 0x5a26, 0x5a27, 0x4c56, 0x4843, 0x5a28, 0x467d, 0x5135, 0x5269, 0x5136, 0x3c47, 0x3d32, 0x3b64, 0x5a29, 0x5a2a, 0x5148, 0x5a2b, 0x506d, 0x366f, 0x425b, 0x4b4f, 0x376d, 0x4968, 0x3743, 0x3e77, 0x5624, 0x5a2c, 0x5a2d, 0x4640, 0x5767, 0x4a36, 0x5529, 0x4b5f, 0x556f, 0x5a2e, 0x565f, 0x344a, 0x5a30, 0x5a2f, 0x526b, 0x5a31, 0x5a32, 0x5a33, 0x4a54, 0x5a34, 0x4a2b, 0x5a35, 0x5a36, 0x334f, 0x566f, 0x5a37, 0x3b30, 0x352e, 0x5a38, 0x5a39, 0x396e, 0x512f, 0x5268, 0x5a3a, 0x3843, 0x4f6a, 0x326f, 0x5a3b, 0x5a3c, 0x3d6b, 0x4e5c, 0x536f, 0x5a3d, 0x4e73, 0x5a3e, 0x5355, 0x3b65, 0x5a3f, 0x4b35, 0x4b50, 0x5a40, 0x476b, 0x566e, 0x5a41, 0x4535, 0x3641, 0x5a42, 0x374c, 0x3f4e, 0x5a43, 0x5a44, 0x4b2d, 0x5a45, 0x3577, 0x5a46, 0x4142, 0x573b, 0x5a47, 0x4c38, 0x526a, 0x4431, 0x5a48, 0x357d, 0x3b51, 0x5a49, 0x5033, 0x5a4a, 0x5a4b, 0x4e3d, 0x5a4c, 0x5a4d, 0x5a4e, 0x3277, 0x5a51, 0x5a4f, 0x5168, 0x5a50, 0x4355, 0x5a52, 0x5a53, 0x5a54, 0x5a55, 0x503b, 0x5225, 0x3079, 0x5a56, 0x472b, 0x5a57, 0x3d77, 0x4321, 0x5a58, 0x5a59, 0x437d, 0x4c37, 0x5a5a, 0x5a5b, 0x403e, 0x4657, 0x5a5c, 0x5a5d, 0x4734, 0x5a5e, 0x5a5f, 0x3948, 0x3b6d, 0x3639, 0x7478, 0x7479, 0x4d63, 0x7539, 0x6b60, 0x4f73, 0x3b3f, 0x3a40, 0x5425, 0x6159, 0x7574, 0x312a, 0x3272, 0x7575, 0x7577, 0x3a51, 0x7576, 0x4332, 0x7579, 0x7578, 0x3134, 0x556a, 0x383a, 0x3931, 0x3246, 0x5470, 0x4f4d, 0x305c, 0x554b, 0x3b75, 0x564a, 0x3737, 0x4c30, 0x4636, 0x3161, 0x393a, 0x567c, 0x3961, 0x3721, 0x3c7a, 0x6a5a, 0x6a5b, 0x4c79, 0x3973, 0x6a5c, 0x347b, 0x4333, 0x3751, 0x3a58, 0x6a5d, 0x5474, 0x6a5e, 0x3c56, 0x3b5f, 0x6a5f, 0x415e, 0x4238, 0x545f, 0x574a, 0x6a60, 0x6a61, 0x6a64, 0x6a62, 0x6a63, 0x495e, 0x3833, 0x3644, 0x6a65, 0x4a6a, 0x494d, 0x344d, 0x6259, 0x4562, 0x6a66, 0x4035, 0x5738, 0x6a67, 0x572c, 0x487c, 0x5853, 0x584d, 0x545e, 0x5479, 0x4944, 0x532e, 0x3853, 0x3360, 0x4962, 0x7476, 0x3a55, 0x7477, 0x575f, 0x7471, 0x3830, 0x5554, 0x384f, 0x4670, 0x3343, 0x7472, 0x332c, 0x543d, 0x4777, 0x7474, 0x7473, 0x4c4b, 0x4824, 0x7475, 0x5763, 0x453f, 0x7540, 0x753b, 0x7543, 0x7542, 0x563a, 0x7541, 0x543e, 0x7544, 0x754c, 0x304f, 0x3578, 0x7549, 0x754a, 0x455c, 0x7545, 0x7546, 0x7547, 0x754b, 0x3e60, 0x7548, 0x387a, 0x7550, 0x7553, 0x3f67, 0x3972, 0x753c, 0x754d, 0x4237, 0x4c78, 0x3c79, 0x754e, 0x754f, 0x7551, 0x3665, 0x7552, 0x7555, 0x753d, 0x7554, 0x533b, 0x336c, 0x4c24, 0x7556, 0x7557, 0x3e61, 0x7558, 0x4c5f, 0x755b, 0x3248, 0x5759, 0x7559, 0x755a, 0x755c, 0x7562, 0x7560, 0x755f, 0x755d, 0x7561, 0x755e, 0x7564, 0x7565, 0x4c63, 0x653f, 0x3538, 0x7563, 0x7568, 0x4c23, 0x7566, 0x7567, 0x753e, 0x3144, 0x753f, 0x3545, 0x3264, 0x756c, 0x7569, 0x3657, 0x756d, 0x756a, 0x756b, 0x345a, 0x546a, 0x756e, 0x3379, 0x756f, 0x7571, 0x7570, 0x7572, 0x7573, 0x496d, 0x392a, 0x477b, 0x3663, 0x4c49, 0x6a26, 0x3335, 0x547e, 0x396c, 0x5079, 0x696d, 0x572a, 0x696e, 0x4256, 0x486d, 0x3a64, 0x696f, 0x6970, 0x6971, 0x5661, 0x6972, 0x6973, 0x6975, 0x6974, 0x6976, 0x6977, 0x4761, 0x6978, 0x5458, 0x6979, 0x3d4e, 0x697a, 0x697b, 0x3d4f, 0x697c, 0x3828, 0x413e, 0x697d, 0x3132, 0x3b54, 0x3975, 0x697e, 0x6a21, 0x6a22, 0x6a23, 0x3778, 0x3c2d, 0x4a64, 0x604e, 0x542f, 0x4f3d, 0x5537, 0x6a24, 0x555e, 0x6a25, 0x5041, 0x393c, 0x3447, 0x3159, 0x4031, 0x3166, 0x3167, 0x3168, 0x333d, 0x4868, 0x6541, 0x315f, 0x4149, 0x346f, 0x4728, 0x5358, 0x4679, 0x5138, 0x397d, 0x4275, 0x532d, 0x544b, 0x3d7c, 0x6542, 0x3735, 0x6543, 0x3b39, 0x5562, 0x3d78, 0x5436, 0x4e25, 0x412c, 0x3359, 0x4c76, 0x6546, 0x6544, 0x6548, 0x654a, 0x6547, 0x354f, 0x4648, 0x357c, 0x6545, 0x4a76, 0x6549, 0x4354, 0x3145, 0x3c23, 0x5737, 0x4d4b, 0x4b4d, 0x4a4a, 0x4c53, 0x654c, 0x654b, 0x4466, 0x5121, 0x5137, 0x654d, 0x6550, 0x4d38, 0x5670, 0x654f, 0x355d, 0x4d3e, 0x6551, 0x363a, 0x4d28, 0x3964, 0x4a45, 0x3351, 0x4b59, 0x546c, 0x6552, 0x376a, 0x654e, 0x6555, 0x347e, 0x6556, 0x6553, 0x6554, 0x525d, 0x425f, 0x3146, 0x5362, 0x365d, 0x4b6c, 0x6557, 0x5376, 0x3169, 0x3674, 0x655a, 0x6558, 0x6559, 0x3540, 0x5245, 0x655c, 0x655e, 0x655d, 0x4732, 0x5223, 0x655b, 0x5462, 0x555a, 0x6560, 0x5771, 0x6561, 0x315c, 0x517b, 0x6562, 0x6564, 0x6563, 0x6565, 0x5258, 0x354b, 0x675f, 0x5a75, 0x5a78, 0x5a76, 0x5a77, 0x5a7a, 0x504f, 0x4447, 0x306e, 0x5030, 0x5a79, 0x534a, 0x3a2a, 0x5b22, 0x4771, 0x5a7c, 0x5a7b, 0x495b, 0x5a7d, 0x5b21, 0x575e, 0x5a7e, 0x415a, 0x5b25, 0x5374, 0x5b27, 0x5b24, 0x5b28, 0x3d3c, 0x4049, 0x5b23, 0x5b26, 0x5623, 0x5b29, 0x5b2d, 0x5b2e, 0x5b2c, 0x3a42, 0x3f24, 0x5b2b, 0x5b2a, 0x5447, 0x323f, 0x5b2f, 0x3979, 0x5b30, 0x333b, 0x3526, 0x363c, 0x5b31, 0x3675, 0x5b32, 0x3149, 0x5b34, 0x5b33, 0x5b35, 0x5b37, 0x5b36, 0x5b38, 0x5b39, 0x5b3a, 0x534f, 0x747a, 0x4775, 0x5743, 0x4564, 0x747c, 0x747d, 0x747b, 0x3e46, 0x506f, 0x3753, 0x544d, 0x4c2a, 0x7522, 0x7521, 0x3a28, 0x747e, 0x4b56, 0x7524, 0x4052, 0x336a, 0x4d2a, 0x7525, 0x7523, 0x3d34, 0x7528, 0x7529, 0x3d4d, 0x4338, 0x3f61, 0x4b61, 0x752a, 0x7526, 0x7527, 0x4470, 0x752c, 0x343c, 0x576d, 0x3457, 0x752b, 0x752e, 0x752d, 0x752f, 0x5051, 0x4351, 0x4829, 0x7530, 0x7531, 0x7532, 0x7533, 0x7534, 0x7535, 0x7537, 0x7536, 0x7538, 0x3249, 0x5354, 0x4a4d, 0x406f, 0x5658, 0x5230, 0x413f, 0x3d70, 0x382a, 0x3c78, 0x7646, 0x7647, 0x7648, 0x7649, 0x764a, 0x764c, 0x764b, 0x7769, 0x764d, 0x764e, 0x6e44, 0x6e45, 0x6e46, 0x556b, 0x3624, 0x6e48, 0x6e47, 0x6e49, 0x6e4a, 0x4725, 0x6e4b, 0x6e4c, 0x3730, 0x3576, 0x6e4d, 0x6e4f, 0x6e4e, 0x3846, 0x6e50, 0x6e51, 0x6e52, 0x365b, 0x332e, 0x5653, 0x4446, 0x3135, 0x3856, 0x6e53, 0x6e54, 0x543f, 0x4755, 0x3e7b, 0x4e59, 0x3933, 0x6e56, 0x6e55, 0x6e58, 0x6e57, 0x4525, 0x6e59, 0x6e5a, 0x472e, 0x6e5b, 0x472f, 0x6e5c, 0x3227, 0x6e5d, 0x6e5e, 0x6e5f, 0x6e60, 0x6e61, 0x576a, 0x6e62, 0x6e63, 0x3c58, 0x6e64, 0x534b, 0x4c7a, 0x322c, 0x4165, 0x6e65, 0x4726, 0x432d, 0x6e66, 0x6e67, 0x6e68, 0x6e69, 0x6e6a, 0x6e6b, 0x6e6c, 0x6e6d, 0x6e6e, 0x6e6f, 0x6e70, 0x6e71, 0x6e72, 0x6e74, 0x6e73, 0x6e75, 0x4d2d, 0x4241, 0x6e76, 0x6e77, 0x6e78, 0x5521, 0x6e79, 0x4f33, 0x6e7a, 0x6e7b, 0x6e7c, 0x6e7d, 0x6f21, 0x6e7e, 0x6f22, 0x3875, 0x437a, 0x6f23, 0x6f24, 0x3d42, 0x523f, 0x3279, 0x6f25, 0x6f26, 0x6f27, 0x5278, 0x6f28, 0x567d, 0x6f29, 0x464c, 0x6f2a, 0x6f2b, 0x4134, 0x6f2c, 0x4f7a, 0x4b78, 0x6f2e, 0x6f2d, 0x337a, 0x3978, 0x6f2f, 0x6f30, 0x5062, 0x6f31, 0x6f32, 0x3766, 0x503f, 0x6f33, 0x6f34, 0x6f35, 0x4871, 0x4c60, 0x6f36, 0x6f37, 0x6f38, 0x6f39, 0x6f3a, 0x5560, 0x6f3b, 0x346d, 0x432a, 0x6f3c, 0x6f3d, 0x6f3e, 0x6f3f, 0x4e7d, 0x6f40, 0x4260, 0x3438, 0x5736, 0x3d75, 0x4f47, 0x6f43, 0x6f41, 0x6f42, 0x6f44, 0x3627, 0x3c7c, 0x3e62, 0x434c, 0x6f45, 0x6f46, 0x6f47, 0x6f4f, 0x6f48, 0x6f49, 0x6f4a, 0x4742, 0x6f71, 0x364d, 0x6f4b, 0x6f4c, 0x6f4d, 0x3646, 0x433e, 0x6f4e, 0x6f50, 0x6f51, 0x6f52, 0x5572, 0x6f53, 0x4477, 0x6f54, 0x4478, 0x6f55, 0x6f56, 0x3864, 0x3077, 0x6f57, 0x6f58, 0x6f59, 0x6f5a, 0x6f5b, 0x6f5c, 0x6f5d, 0x6f5e, 0x3e35, 0x6f61, 0x6f5f, 0x6f60, 0x6f62, 0x6f63, 0x414d, 0x6f64, 0x6f65, 0x6f66, 0x6f67, 0x6f68, 0x6f69, 0x6f6a, 0x6f6b, 0x6f6c, 0x4058, 0x6f6d, 0x412d, 0x6f6e, 0x6f6f, 0x6f70, 0x4f62, 0x3324, 0x4345, 0x6345, 0x4941, 0x6346, 0x3155, 0x4e4a, 0x3433, 0x4872, 0x6347, 0x4f50, 0x6348, 0x3c64, 0x6349, 0x634a, 0x4346, 0x5522, 0x4456, 0x396b, 0x4e45, 0x634b, 0x4376, 0x634c, 0x3727, 0x3873, 0x3a52, 0x634d, 0x634e, 0x5444, 0x634f, 0x6350, 0x514b, 0x6351, 0x6352, 0x6353, 0x6354, 0x5156, 0x6355, 0x327b, 0x403b, 0x6356, 0x402b, 0x6357, 0x6358, 0x6359, 0x635a, 0x635b, 0x3837, 0x5a62, 0x3653, 0x5a64, 0x5a63, 0x5a66, 0x486e, 0x5a65, 0x3740, 0x5174, 0x5275, 0x5573, 0x3d57, 0x5768, 0x5a68, 0x5a67, 0x3022, 0x4d53, 0x5a69, 0x383d, 0x3c4a, 0x423d, 0x4224, 0x3342, 0x5a6a, 0x422a, 0x4430, 0x3d35, 0x4f5e, 0x5a6b, 0x4942, 0x315d, 0x5a6c, 0x3638, 0x543a, 0x337d, 0x5a6d, 0x5449, 0x4f55, 0x4563, 0x5a6e, 0x5a6f, 0x5a70, 0x416a, 0x4c55, 0x4f5d, 0x5367, 0x4221, 0x5a71, 0x4b65, 0x5a72, 0x4b66, 0x527e, 0x3874, 0x5a73, 0x302f, 0x4f36, 0x554f, 0x4b6d, 0x5a74, 0x6344, 0x4125, 0x763f, 0x7640, 0x7641, 0x4451, 0x4838, 0x5163, 0x505b, 0x5145, 0x3c2f, 0x394d, 0x6f74, 0x3446, 0x533a, 0x7642, 0x337b, 0x7643, 0x3571, 0x7645, 0x536a, 0x7627, 0x5129, 0x7629, 0x7628, 0x4163, 0x4057, 0x3122, 0x4e6d, 0x5068, 0x762b, 0x4f76, 0x762a, 0x5570, 0x762c, 0x4339, 0x3b74, 0x762e, 0x762d, 0x445e, 0x4158, 0x4b2a, 0x4f3c, 0x762f, 0x7630, 0x7631, 0x4236, 0x3054, 0x4579, 0x7632, 0x4760, 0x7626, 0x3e38, 0x3e32, 0x3565, 0x3747, 0x3f3f, 0x4352, 0x4366, 0x584c, 0x386f, 0x3d79, 0x5125, 0x3050, 0x7730, 0x7731, 0x502c, 0x3030, 0x7732, 0x7733, 0x7734, 0x474a, 0x3e4f, 0x7737, 0x7736, 0x315e, 0x7735, 0x7738, 0x7739, 0x4e24, 0x484d, 0x3a2b, 0x6838, 0x6839, 0x683a, 0x3e42, 0x5274, 0x544f, 0x4958, 0x5233, 0x3625, 0x476a, 0x717c, 0x4f6e, 0x4b33, 0x506b, 0x676f, 0x4d67, 0x394b, 0x3659, 0x717d, 0x3064, 0x4b4c, 0x717e, 0x5424, 0x422d, 0x416c, 0x4644, 0x3e31, 0x7221, 0x3c55, 0x7222, 0x7223, 0x7224, 0x5243, 0x4635, 0x4d47, 0x7225, 0x5331, 0x3f45, 0x4c62, 0x7226, 0x7227, 0x5155, 0x366e, 0x7228, 0x7229, 0x355f, 0x722a, 0x722b, 0x327c, 0x722c, 0x722d, 0x4827, 0x3767, 0x6c29, 0x6c2a, 0x6c2b, 0x6c2c, 0x462e, 0x6c2d, 0x6c2e, 0x3749, 0x4a33, 0x6238, 0x774f, 0x7750, 0x324d, 0x7751, 0x7753, 0x7752, 0x623b, 0x3c22, 0x623c, 0x623d, 0x623e, 0x623f, 0x6240, 0x6241, 0x3739, 0x527b, 0x3d24, 0x4a4e, 0x3125, 0x4b47, 0x6242, 0x367c, 0x4844, 0x6243, 0x3d48, 0x317d, 0x6244, 0x3676, 0x6245, 0x4459, 0x6246, 0x4f5a, 0x395d, 0x6247, 0x4021, 0x6248, 0x3276, 0x6249, 0x4173, 0x624a, 0x624b, 0x4278, 0x624c, 0x624d, 0x624e, 0x4a57, 0x5838, 0x5965, 0x4f63, 0x7025, 0x5c30, 0x426d, 0x5426, 0x4d54, 0x5131, 0x335b, 0x477d, 0x3235, 0x423f, 0x6660, 0x4a3b, 0x6661, 0x6662, 0x3e54, 0x6663, 0x5724, 0x4d55, 0x6665, 0x3c5d, 0x6664, 0x6666, 0x6667, 0x426e, 0x3d3e, 0x6668, 0x4266, 0x3a27, 0x6669, 0x666a, 0x3352, 0x5169, 0x3f25, 0x666b, 0x466f, 0x666c, 0x666d, 0x666e, 0x462d, 0x666f, 0x4927, 0x6670, 0x6671, 0x6672, 0x6539, 0x6673, 0x6674, 0x4262, 0x6675, 0x6676, 0x5668, 0x6677, 0x6678, 0x3947, 0x773b, 0x773a, 0x773e, 0x773c, 0x3a21, 0x773f, 0x7740, 0x7742, 0x7741, 0x7744, 0x7743, 0x7745, 0x7746, 0x7747, 0x4b68, 0x385f, 0x7754, 0x7755, 0x7756, 0x7758, 0x775a, 0x7757, 0x775b, 0x7759, 0x5757, 0x775c, 0x775d, 0x775e, 0x775f, 0x7760, 0x5b4b, 0x582a, 0x6577, 0x396d, 0x3f7d, 0x3b6a, 0x7749, 0x4647, 0x7748, 0x774a, 0x774c, 0x774b, 0x774d, 0x4e3a, 0x774e, 0x4427, 0x5363, 0x764f, 0x4233, 0x7650, 0x7651, 0x7652, 0x7653, 0x7654, 0x7656, 0x312b, 0x7657, 0x7658, 0x7659, 0x765a, 0x765b, 0x765c, 0x765d, 0x765e, 0x4f4a, 0x765f, 0x7660, 0x7661, 0x7662, 0x7663, 0x7664, 0x4070, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766a, 0x766b, 0x766c, 0x766d, 0x766e, 0x766f, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x3e28, 0x7675, 0x7676, 0x7677, 0x7678, 0x487a, 0x7679, 0x767a, 0x767b, 0x767c, 0x767d, 0x767e, 0x7721, 0x7722, 0x7723, 0x7724, 0x7725, 0x7726, 0x7727, 0x7728, 0x316e, 0x7729, 0x772a, 0x772b, 0x772c, 0x772d, 0x415b, 0x772e, 0x772f, 0x4471, 0x702f, 0x3c26, 0x7030, 0x4379, 0x4538, 0x513b, 0x7031, 0x7032, 0x7033, 0x7034, 0x7035, 0x513c, 0x516c, 0x7037, 0x7036, 0x5427, 0x4d52, 0x7038, 0x703a, 0x7039, 0x703b, 0x703c, 0x386b, 0x703d, 0x3a68, 0x703e, 0x703f, 0x3e69, 0x7040, 0x366c, 0x7041, 0x7042, 0x7043, 0x7044, 0x4835, 0x7045, 0x7046, 0x7047, 0x4574, 0x7048, 0x7049, 0x704a, 0x773d, 0x704b, 0x704c, 0x704d, 0x704e, 0x704f, 0x3a57, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7058, 0x5325, 0x7057, 0x7059, 0x753a, 0x4239, 0x7764, 0x7765, 0x7766, 0x7767, 0x7768, 0x4234, 0x776a, 0x776b, 0x4273, 0x7470, 0x746f, 0x4269, 0x7761, 0x7762, 0x3b46, 0x5964, 0x4a72, 0x4068, 0x7024, 0x3a5a, 0x472d, 0x442c, 0x776c, 0x776d, 0x776e, 0x7770, 0x776f, 0x7771, 0x7774, 0x7773, 0x7772, 0x7775, 0x7776, 0x6d69, 0x6d6a, 0x6d6b, 0x763c, 0x763d, 0x763e, 0x3626, 0x583e, 0x3944, 0x583b, 0x5c31, 0x4a73, 0x7777, 0x7778, 0x7779, 0x777b, 0x777a, 0x3147, 0x777c, 0x777d, 0x777e, 0x466b, 0x6c34, 0x335d, 0x7633, 0x7634, 0x4164, 0x7635, 0x7636, 0x7637, 0x7638, 0x7639, 0x763a, 0x4823, 0x763b, 0x417a, 0x3928, 0x6d68, 0x396a, 0x595f, 0x2321, 0x2322, 0x2323, 0x2167, 0x2325, 0x2326, 0x2327, 0x2328, 0x2329, 0x232a, 0x232b, 0x232c, 0x232d, 0x232e, 0x232f, 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, 0x2339, 0x233a, 0x233b, 0x233c, 0x233d, 0x233e, 0x233f, 0x2340, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, 0x2348, 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f, 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, 0x2358, 0x2359, 0x235a, 0x235b, 0x235c, 0x235d, 0x235e, 0x235f, 0x2360, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, 0x2368, 0x2369, 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f, 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, 0x2378, 0x2379, 0x237a, 0x237b, 0x237c, 0x237d, 0x212b, 0x2169, 0x216a, 0x237e, 0x2324, }; static const Summary16 gb2312_uni2indx_page00[70] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0190 }, { 3, 0x0003 }, { 5, 0x0000 }, { 5, 0x0080 }, { 6, 0x3703 }, { 13, 0x168c }, /* 0x0100 */ { 19, 0x0002 }, { 20, 0x0808 }, { 22, 0x0800 }, { 23, 0x0000 }, { 23, 0x2000 }, { 24, 0x0000 }, { 24, 0x0800 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x4000 }, { 26, 0x1555 }, { 33, 0x0000 }, { 33, 0x0000 }, /* 0x0200 */ { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0280 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, /* 0x0300 */ { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0xfffe }, { 50, 0x03fb }, { 59, 0xfffe }, { 74, 0x03fb }, { 83, 0x0000 }, { 83, 0x0000 }, { 83, 0x0000 }, /* 0x0400 */ { 83, 0x0002 }, { 84, 0xffff }, { 100, 0xffff }, { 116, 0xffff }, { 132, 0xffff }, { 148, 0x0002 }, }; static const Summary16 gb2312_uni2indx_page20[101] = { /* 0x2000 */ { 149, 0x0000 }, { 149, 0x3360 }, { 155, 0x0040 }, { 156, 0x080d }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, /* 0x2100 */ { 160, 0x0008 }, { 161, 0x0040 }, { 162, 0x0000 }, { 162, 0x0000 }, { 162, 0x0000 }, { 162, 0x0000 }, { 162, 0x0fff }, { 174, 0x0000 }, { 174, 0x0000 }, { 174, 0x000f }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, /* 0x2200 */ { 178, 0x8100 }, { 180, 0x6402 }, { 184, 0x4fa1 }, { 192, 0x20f0 }, { 197, 0x1100 }, { 199, 0x0000 }, { 199, 0xc033 }, { 205, 0x0000 }, { 205, 0x0000 }, { 205, 0x0200 }, { 206, 0x0020 }, { 207, 0x0000 }, { 207, 0x0000 }, { 207, 0x0000 }, { 207, 0x0000 }, { 207, 0x0000 }, /* 0x2300 */ { 207, 0x0000 }, { 207, 0x0004 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, /* 0x2400 */ { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x03ff }, { 218, 0xfff0 }, { 230, 0xffff }, { 246, 0x0fff }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, /* 0x2500 */ { 258, 0xffff }, { 274, 0xffff }, { 290, 0xffff }, { 306, 0xffff }, { 322, 0x0fff }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0003 }, { 336, 0x000c }, { 338, 0xc8c0 }, { 343, 0x0000 }, { 343, 0x0000 }, { 343, 0x0000 }, /* 0x2600 */ { 343, 0x0060 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0005 }, }; static const Summary16 gb2312_uni2indx_page30[35] = { /* 0x3000 */ { 347, 0xff2f }, { 360, 0x00fb }, { 367, 0x0000 }, { 367, 0x0000 }, { 367, 0xfffe }, { 382, 0xffff }, { 398, 0xffff }, { 414, 0xffff }, { 430, 0xffff }, { 446, 0x000f }, { 450, 0xfffe }, { 465, 0xffff }, { 481, 0xffff }, { 497, 0xffff }, { 513, 0xffff }, { 529, 0x087f }, /* 0x3100 */ { 537, 0xffe0 }, { 548, 0xffff }, { 564, 0x03ff }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, /* 0x3200 */ { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x03ff }, }; static const Summary16 gb2312_uni2indx_page4e[1263] = { /* 0x4e00 */ { 584, 0x7f8b }, { 595, 0x7f7b }, { 608, 0x3db4 }, { 617, 0xef55 }, { 628, 0xfba8 }, { 638, 0xf35d }, { 649, 0x0243 }, { 653, 0x400b }, { 657, 0xfb40 }, { 665, 0x8d3e }, { 674, 0x7bf7 }, { 687, 0x8c2c }, { 693, 0x6eff }, { 706, 0xe3fa }, { 717, 0x1d3a }, { 725, 0xa8ed }, /* 0x4f00 */ { 734, 0xe602 }, { 740, 0xcf83 }, { 749, 0x8cf5 }, { 758, 0x3555 }, { 766, 0xe048 }, { 771, 0xffab }, { 784, 0x92b9 }, { 792, 0xd859 }, { 800, 0xab18 }, { 807, 0x2892 }, { 812, 0xd7e9 }, { 823, 0x8020 }, { 825, 0xc438 }, { 831, 0xf583 }, { 840, 0xe74a }, { 849, 0x450a }, /* 0x5000 */ { 854, 0xb000 }, { 857, 0x9714 }, { 864, 0x7762 }, { 873, 0x5400 }, { 876, 0xd188 }, { 882, 0x1420 }, { 885, 0x1020 }, { 887, 0xc8c0 }, { 892, 0x2121 }, { 896, 0x0000 }, { 896, 0x13a8 }, { 902, 0x0c04 }, { 905, 0x8000 }, { 906, 0x0440 }, { 908, 0x70c0 }, { 913, 0x0828 }, /* 0x5100 */ { 916, 0x08c0 }, { 919, 0x0004 }, { 920, 0x0002 }, { 921, 0x8000 }, { 922, 0x2b7b }, { 932, 0x1472 }, { 938, 0x7924 }, { 945, 0x3bfb }, { 957, 0x3327 }, { 965, 0x1ae4 }, { 972, 0x9835 }, { 979, 0x38ef }, { 989, 0x9ad1 }, { 997, 0x2802 }, { 1000, 0xa813 }, { 1006, 0xbf69 }, /* 0x5200 */ { 1017, 0x65cf }, { 1027, 0x2fc6 }, { 1036, 0x6b11 }, { 1043, 0xafc9 }, { 1053, 0x340f }, { 1060, 0x5053 }, { 1066, 0x86a2 }, { 1072, 0xa004 }, { 1075, 0x0106 }, { 1078, 0xe809 }, { 1084, 0x3f0f }, { 1094, 0xc00e }, { 1099, 0x0a88 }, { 1103, 0x8145 }, { 1108, 0x0010 }, { 1109, 0xc601 }, /* 0x5300 */ { 1114, 0xa161 }, { 1120, 0x26e1 }, { 1127, 0x444b }, { 1133, 0xce00 }, { 1138, 0xc7aa }, { 1147, 0xd4ee }, { 1157, 0xcadf }, { 1168, 0x85bb }, { 1177, 0x3a74 }, { 1185, 0xa520 }, { 1190, 0x436c }, { 1197, 0x8840 }, { 1200, 0x3f06 }, { 1208, 0x8bd2 }, { 1216, 0xff79 }, { 1229, 0x3bef }, /* 0x5400 */ { 1241, 0xf75a }, { 1252, 0xe8ef }, { 1263, 0xfbcb }, { 1275, 0x5b36 }, { 1284, 0x0d49 }, { 1290, 0x1bfd }, { 1301, 0x0154 }, { 1305, 0x39ee }, { 1315, 0xd855 }, { 1323, 0x2e75 }, { 1332, 0xbfd8 }, { 1343, 0xa91a }, { 1350, 0xf3d7 }, { 1362, 0xf6bf }, { 1375, 0x67e0 }, { 1383, 0xb40c }, /* 0x5500 */ { 1389, 0x82c2 }, { 1394, 0x0813 }, { 1398, 0xd49d }, { 1407, 0xd08b }, { 1414, 0x065a }, { 1420, 0x1061 }, { 1424, 0x74f2 }, { 1433, 0x59e0 }, { 1440, 0x8f9f }, { 1451, 0xb312 }, { 1458, 0x0080 }, { 1459, 0x6aaa }, { 1467, 0x3230 }, { 1472, 0xb05e }, { 1480, 0x9d7a }, { 1490, 0x60ac }, /* 0x5600 */ { 1496, 0xd303 }, { 1503, 0xc900 }, { 1507, 0x3098 }, { 1512, 0x8a56 }, { 1519, 0x7000 }, { 1522, 0x1390 }, { 1527, 0x1f14 }, { 1534, 0x1842 }, { 1538, 0xc060 }, { 1542, 0x0008 }, { 1543, 0x8008 }, { 1545, 0x1080 }, { 1547, 0x0400 }, { 1548, 0xec90 }, { 1555, 0x2817 }, { 1561, 0xe633 }, /* 0x5700 */ { 1570, 0x0758 }, { 1576, 0x9000 }, { 1578, 0xf708 }, { 1586, 0x4e09 }, { 1592, 0xf485 }, { 1600, 0xfc83 }, { 1609, 0xaf53 }, { 1619, 0x18c8 }, { 1624, 0x187c }, { 1631, 0x080c }, { 1634, 0x6adf }, { 1645, 0x0114 }, { 1648, 0xc80c }, { 1653, 0xa734 }, { 1661, 0xa011 }, { 1665, 0x2710 }, /* 0x5800 */ { 1670, 0x28c5 }, { 1676, 0x4222 }, { 1680, 0x0413 }, { 1684, 0x0021 }, { 1686, 0x3010 }, { 1689, 0x4112 }, { 1693, 0x1820 }, { 1696, 0x4000 }, { 1697, 0x022b }, { 1702, 0xc60c }, { 1708, 0x0300 }, { 1710, 0x1000 }, { 1711, 0x0022 }, { 1713, 0x0022 }, { 1715, 0x5810 }, { 1719, 0x0249 }, /* 0x5900 */ { 1723, 0xa094 }, { 1728, 0x9670 }, { 1735, 0xeeb0 }, { 1744, 0x1792 }, { 1751, 0xcb96 }, { 1760, 0x05f2 }, { 1767, 0x0025 }, { 1770, 0x2358 }, { 1776, 0x25de }, { 1785, 0x42cc }, { 1791, 0xcf38 }, { 1800, 0x4a04 }, { 1804, 0x0c40 }, { 1807, 0x359f }, { 1817, 0x1128 }, { 1821, 0x8a00 }, /* 0x5a00 */ { 1824, 0x13fa }, { 1833, 0x910a }, { 1838, 0x0229 }, { 1842, 0x1056 }, { 1847, 0x0641 }, { 1851, 0x0420 }, { 1853, 0x0484 }, { 1856, 0x84f0 }, { 1862, 0x0000 }, { 1862, 0x0c04 }, { 1865, 0x0400 }, { 1866, 0x412c }, { 1871, 0x1206 }, { 1875, 0x1154 }, { 1880, 0x0a4b }, { 1886, 0x0002 }, /* 0x5b00 */ { 1887, 0x0200 }, { 1888, 0x00c0 }, { 1890, 0x0000 }, { 1890, 0x0094 }, { 1893, 0x0001 }, { 1894, 0xbfbb }, { 1907, 0x167c }, { 1915, 0x242b }, { 1921, 0x9bbb }, { 1932, 0x7fa8 }, { 1942, 0x0c7f }, { 1951, 0xe379 }, { 1961, 0x10f4 }, { 1967, 0xe00d }, { 1973, 0x4132 }, { 1978, 0x9f01 }, /* 0x5c00 */ { 1985, 0x8652 }, { 1991, 0x3572 }, { 1999, 0x10b4 }, { 2004, 0xff12 }, { 2014, 0xcf27 }, { 2024, 0x4223 }, { 2029, 0xc06b }, { 2036, 0x8602 }, { 2040, 0x3106 }, { 2045, 0x1fd3 }, { 2055, 0x3a0c }, { 2061, 0xa1aa }, { 2068, 0x0812 }, { 2071, 0x0204 }, { 2073, 0x2572 }, { 2080, 0x0801 }, /* 0x5d00 */ { 2082, 0x40cc }, { 2087, 0x4850 }, { 2091, 0x62d0 }, { 2097, 0x6010 }, { 2100, 0x1c80 }, { 2104, 0x2900 }, { 2107, 0x9a00 }, { 2111, 0x0010 }, { 2112, 0x0004 }, { 2113, 0x2200 }, { 2115, 0x0000 }, { 2115, 0x0080 }, { 2116, 0x2020 }, { 2118, 0x6800 }, { 2121, 0xcbe6 }, { 2131, 0x609e }, /* 0x5e00 */ { 2138, 0x916e }, { 2146, 0x3f73 }, { 2157, 0x60c0 }, { 2161, 0x3982 }, { 2167, 0x1034 }, { 2171, 0x4830 }, { 2175, 0x0006 }, { 2177, 0xbd5c }, { 2187, 0x8cd1 }, { 2194, 0xd6fb }, { 2206, 0x20e1 }, { 2211, 0x43e8 }, { 2218, 0x0600 }, { 2220, 0x084e }, { 2225, 0x0500 }, { 2227, 0xc4d0 }, /* 0x5f00 */ { 2233, 0x8d1f }, { 2242, 0x89aa }, { 2249, 0xa6e1 }, { 2257, 0x1602 }, { 2261, 0x0001 }, { 2262, 0x21ed }, { 2270, 0x3656 }, { 2278, 0x1a8b }, { 2285, 0x1fb7 }, { 2296, 0x13a5 }, { 2303, 0x6502 }, { 2308, 0x30a0 }, { 2312, 0xb278 }, { 2320, 0x23c7 }, { 2328, 0x6c93 }, { 2336, 0xe922 }, /* 0x6000 */ { 2343, 0xe47f }, { 2354, 0x3a74 }, { 2362, 0x8fe3 }, { 2372, 0x9820 }, { 2376, 0x280e }, { 2381, 0x2625 }, { 2387, 0xbf9c }, { 2398, 0xbf49 }, { 2408, 0x3218 }, { 2413, 0xac54 }, { 2420, 0xb949 }, { 2428, 0x1916 }, { 2434, 0x0c60 }, { 2438, 0xb522 }, { 2445, 0xfbc1 }, { 2455, 0x0659 }, /* 0x6100 */ { 2461, 0xe343 }, { 2469, 0x8420 }, { 2472, 0x08d9 }, { 2478, 0x8000 }, { 2479, 0x5500 }, { 2483, 0x2022 }, { 2486, 0x0184 }, { 2489, 0x00a1 }, { 2492, 0x4800 }, { 2494, 0x2010 }, { 2496, 0x1380 }, { 2500, 0x4080 }, { 2502, 0x0d04 }, { 2506, 0x0016 }, { 2509, 0x0040 }, { 2510, 0x8020 }, /* 0x6200 */ { 2512, 0xfd40 }, { 2520, 0x8de7 }, { 2530, 0x5436 }, { 2537, 0xe098 }, { 2543, 0x7b8b }, { 2553, 0x091e }, { 2559, 0xfec8 }, { 2569, 0xd249 }, { 2576, 0x0611 }, { 2580, 0x8dee }, { 2590, 0x1937 }, { 2598, 0xba22 }, { 2605, 0x77f4 }, { 2616, 0x9fdd }, { 2628, 0xf3ec }, { 2639, 0xf0da }, /* 0x6300 */ { 2648, 0x4386 }, { 2654, 0xec42 }, { 2661, 0x8d3f }, { 2671, 0x2604 }, { 2675, 0xfa6c }, { 2685, 0xc021 }, { 2689, 0x628e }, { 2696, 0x0cc2 }, { 2701, 0xd785 }, { 2710, 0x0145 }, { 2714, 0x77ad }, { 2725, 0x5599 }, { 2733, 0xe250 }, { 2739, 0x4045 }, { 2743, 0x260b }, { 2749, 0xa154 }, /* 0x6400 */ { 2755, 0x9827 }, { 2762, 0x5819 }, { 2768, 0x3443 }, { 2774, 0xa410 }, { 2778, 0x05f2 }, { 2785, 0x4114 }, { 2789, 0x2280 }, { 2792, 0x0700 }, { 2795, 0x00b4 }, { 2799, 0x4266 }, { 2805, 0x7210 }, { 2810, 0x15a1 }, { 2816, 0x6025 }, { 2821, 0x4185 }, { 2826, 0x0054 }, { 2829, 0x0000 }, /* 0x6500 */ { 2829, 0x0201 }, { 2831, 0x0104 }, { 2833, 0xc820 }, { 2837, 0xcb70 }, { 2845, 0x9320 }, { 2850, 0x6a62 }, { 2857, 0x184c }, { 2862, 0x0095 }, { 2866, 0x1880 }, { 2869, 0x9a8b }, { 2877, 0xaab2 }, { 2885, 0x3201 }, { 2889, 0xd87a }, { 2898, 0x00c4 }, { 2901, 0xf3e5 }, { 2912, 0x04c3 }, /* 0x6600 */ { 2917, 0xd44d }, { 2925, 0xa238 }, { 2931, 0xa1a1 }, { 2937, 0x5072 }, { 2943, 0x980a }, { 2948, 0x84fc }, { 2956, 0xc152 }, { 2962, 0x44d1 }, { 2968, 0x1094 }, { 2972, 0x20c2 }, { 2976, 0x4180 }, { 2979, 0x4210 }, { 2982, 0x0000 }, { 2982, 0x3a00 }, { 2986, 0x0240 }, { 2988, 0xd29d }, /* 0x6700 */ { 2997, 0x2f01 }, { 3003, 0xa8b1 }, { 3010, 0xbd40 }, { 3017, 0x2432 }, { 3022, 0xd34d }, { 3031, 0xd04b }, { 3038, 0xa723 }, { 3046, 0xd0ad }, { 3054, 0x0a92 }, { 3059, 0x75a1 }, { 3067, 0xadac }, { 3076, 0x01e9 }, { 3082, 0x801a }, { 3086, 0x771f }, { 3097, 0x9225 }, { 3103, 0xa01b }, /* 0x6800 */ { 3109, 0xdfa1 }, { 3119, 0x20ca }, { 3124, 0x0602 }, { 3127, 0x738c }, { 3135, 0x577f }, { 3147, 0x003b }, { 3152, 0x0bff }, { 3163, 0x00d0 }, { 3166, 0x806a }, { 3171, 0x0088 }, { 3173, 0xa1c4 }, { 3179, 0x0029 }, { 3182, 0x2a05 }, { 3187, 0x0524 }, { 3191, 0x4009 }, { 3194, 0x1623 }, /* 0x6900 */ { 3200, 0x6822 }, { 3205, 0x8005 }, { 3208, 0x2011 }, { 3211, 0xa211 }, { 3216, 0x0004 }, { 3217, 0x6490 }, { 3222, 0x4849 }, { 3227, 0x1382 }, { 3232, 0x23d5 }, { 3240, 0x1930 }, { 3245, 0x2980 }, { 3249, 0x0892 }, { 3253, 0x5402 }, { 3257, 0x8811 }, { 3261, 0x2001 }, { 3263, 0xa004 }, /* 0x6a00 */ { 3266, 0x0400 }, { 3267, 0x8180 }, { 3270, 0x8502 }, { 3274, 0x6022 }, { 3278, 0x0090 }, { 3280, 0x0b01 }, { 3284, 0x0022 }, { 3286, 0x1202 }, { 3289, 0x4011 }, { 3292, 0x0083 }, { 3295, 0x1a01 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, /* 0x6b00 */ { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x009f }, { 3305, 0x4684 }, { 3310, 0x12c8 }, { 3315, 0x0200 }, { 3316, 0x04fc }, { 3323, 0x1a00 }, { 3326, 0x2ede }, { 3336, 0x0c4c }, { 3341, 0x0402 }, { 3343, 0x80b8 }, { 3348, 0xa826 }, { 3354, 0x0afc }, { 3362, 0x8c02 }, { 3366, 0x2228 }, /* 0x6c00 */ { 3370, 0xa0e0 }, { 3375, 0x8f7b }, { 3386, 0xc7d6 }, { 3396, 0x2135 }, { 3402, 0x06c7 }, { 3409, 0xf8b1 }, { 3418, 0x0713 }, { 3424, 0x6255 }, { 3431, 0x936e }, { 3440, 0x8a19 }, { 3446, 0x6efa }, { 3457, 0xfb0e }, { 3467, 0x1630 }, { 3472, 0x48f9 }, { 3480, 0xcd2f }, { 3490, 0x7deb }, /* 0x6d00 */ { 3502, 0x5892 }, { 3508, 0x4e84 }, { 3514, 0x4ca0 }, { 3519, 0x7a2e }, { 3528, 0xedea }, { 3539, 0x561e }, { 3547, 0xc649 }, { 3554, 0x1190 }, { 3558, 0x5324 }, { 3564, 0xe83a }, { 3572, 0xcfdb }, { 3584, 0x8124 }, { 3588, 0x18f1 }, { 3595, 0x6342 }, { 3601, 0x5853 }, { 3608, 0x1a8a }, /* 0x6e00 */ { 3614, 0x7420 }, { 3619, 0x24d3 }, { 3626, 0xaa3b }, { 3635, 0x0514 }, { 3639, 0x6018 }, { 3643, 0x8958 }, { 3649, 0x4800 }, { 3651, 0xc000 }, { 3653, 0x8268 }, { 3658, 0x9101 }, { 3662, 0x84a4 }, { 3667, 0x2cd6 }, { 3675, 0x8886 }, { 3680, 0xc4ba }, { 3688, 0x0377 }, { 3696, 0x0210 }, /* 0x6f00 */ { 3698, 0x8244 }, { 3702, 0x0038 }, { 3705, 0xae11 }, { 3712, 0x404a }, { 3716, 0x28c0 }, { 3720, 0x5100 }, { 3723, 0x6044 }, { 3727, 0x1514 }, { 3732, 0x7310 }, { 3738, 0x1000 }, { 3739, 0x0082 }, { 3741, 0x0248 }, { 3744, 0x0205 }, { 3747, 0x4006 }, { 3750, 0xc003 }, { 3754, 0x0000 }, /* 0x7000 */ { 3754, 0x0000 }, { 3754, 0x0c02 }, { 3757, 0x0008 }, { 3758, 0x0220 }, { 3760, 0x9000 }, { 3762, 0x4000 }, { 3763, 0xb800 }, { 3767, 0xd161 }, { 3774, 0x4621 }, { 3779, 0x3274 }, { 3786, 0xf800 }, { 3791, 0x3b8a }, { 3799, 0x050f }, { 3805, 0x8b00 }, { 3809, 0xbbd0 }, { 3818, 0x2280 }, /* 0x7100 */ { 3821, 0x0600 }, { 3823, 0x0769 }, { 3830, 0x8040 }, { 3832, 0x0043 }, { 3835, 0x5420 }, { 3839, 0x5000 }, { 3841, 0x41d0 }, { 3846, 0x250c }, { 3851, 0x8410 }, { 3854, 0x8310 }, { 3858, 0x1101 }, { 3861, 0x0228 }, { 3864, 0x4008 }, { 3866, 0x0030 }, { 3868, 0x40a1 }, { 3872, 0x0200 }, /* 0x7200 */ { 3873, 0x0040 }, { 3874, 0x2000 }, { 3875, 0x1500 }, { 3878, 0xabe3 }, { 3888, 0x3180 }, { 3892, 0xaa44 }, { 3898, 0xc2c6 }, { 3905, 0xc624 }, { 3911, 0xac13 }, { 3918, 0x8004 }, { 3920, 0xb000 }, { 3923, 0x03d1 }, { 3929, 0x611e }, { 3936, 0x4285 }, { 3941, 0xf303 }, { 3949, 0x1d9f }, /* 0x7300 */ { 3959, 0x440a }, { 3963, 0x78e8 }, { 3971, 0x5e26 }, { 3979, 0xc392 }, { 3986, 0x2000 }, { 3987, 0x0085 }, { 3990, 0xb001 }, { 3994, 0x4000 }, { 3995, 0x4a90 }, { 4000, 0x8842 }, { 4004, 0xca04 }, { 4009, 0x0c8d }, { 4015, 0xa705 }, { 4022, 0x4203 }, { 4026, 0x22a1 }, { 4031, 0x0004 }, /* 0x7400 */ { 4032, 0x8668 }, { 4038, 0x0c01 }, { 4041, 0x5564 }, { 4048, 0x1079 }, { 4054, 0x0002 }, { 4055, 0xdea0 }, { 4063, 0x2000 }, { 4064, 0x40c1 }, { 4068, 0x488b }, { 4074, 0x5001 }, { 4077, 0x0380 }, { 4080, 0x0400 }, { 4081, 0x0000 }, { 4081, 0x5004 }, { 4084, 0xc05d }, { 4091, 0x80d0 }, /* 0x7500 */ { 4095, 0xa010 }, { 4098, 0x970a }, { 4105, 0xbb20 }, { 4112, 0x4daf }, { 4122, 0xd921 }, { 4129, 0x1e10 }, { 4134, 0x0460 }, { 4137, 0x8314 }, { 4142, 0x8848 }, { 4146, 0xa6d6 }, { 4155, 0xd83b }, { 4164, 0x733f }, { 4175, 0x27bc }, { 4184, 0x4974 }, { 4191, 0x0ddc }, { 4199, 0x9213 }, /* 0x7600 */ { 4205, 0x142b }, { 4211, 0x8ba1 }, { 4218, 0x2e75 }, { 4227, 0xd139 }, { 4235, 0x3009 }, { 4239, 0x5050 }, { 4243, 0x8808 }, { 4246, 0x6900 }, { 4250, 0x49d4 }, { 4257, 0x024a }, { 4261, 0x4010 }, { 4263, 0x8016 }, { 4267, 0xe564 }, { 4275, 0x89d7 }, { 4284, 0xc020 }, { 4287, 0x5316 }, /* 0x7700 */ { 4294, 0x2b92 }, { 4301, 0x8600 }, { 4304, 0xa345 }, { 4311, 0x15e0 }, { 4317, 0x008b }, { 4321, 0x0c03 }, { 4325, 0x196e }, { 4333, 0xe200 }, { 4337, 0x7031 }, { 4343, 0x8006 }, { 4346, 0x16a5 }, { 4353, 0xa829 }, { 4359, 0x2000 }, { 4360, 0x1880 }, { 4363, 0x7aac }, { 4372, 0xe148 }, /* 0x7800 */ { 4378, 0x3207 }, { 4384, 0xb5d6 }, { 4394, 0x32e8 }, { 4401, 0x5f91 }, { 4410, 0x50a1 }, { 4415, 0x20e5 }, { 4421, 0x7c00 }, { 4426, 0x1080 }, { 4428, 0x7280 }, { 4433, 0x9d8a }, { 4441, 0x00aa }, { 4445, 0x421f }, { 4452, 0x0e22 }, { 4457, 0x0231 }, { 4461, 0x1100 }, { 4463, 0x0494 }, /* 0x7900 */ { 4467, 0x0022 }, { 4469, 0x4008 }, { 4471, 0x0010 }, { 4472, 0x5c10 }, { 4477, 0x0343 }, { 4482, 0xfcc8 }, { 4491, 0xa1a5 }, { 4498, 0x0580 }, { 4501, 0x8433 }, { 4507, 0x0400 }, { 4508, 0x0080 }, { 4509, 0x6e08 }, { 4515, 0x2a4b }, { 4522, 0x8126 }, { 4527, 0xaad8 }, { 4535, 0x2901 }, /* 0x7a00 */ { 4539, 0x684d }, { 4546, 0x4490 }, { 4550, 0x0009 }, { 4552, 0xba88 }, { 4559, 0x0040 }, { 4560, 0x0082 }, { 4562, 0x0000 }, { 4562, 0x87d1 }, { 4570, 0x215b }, { 4577, 0xb1e6 }, { 4586, 0x3161 }, { 4592, 0x8008 }, { 4594, 0x0800 }, { 4595, 0xc240 }, { 4599, 0xa069 }, { 4605, 0xa600 }, /* 0x7b00 */ { 4609, 0x8d58 }, { 4616, 0x4a32 }, { 4622, 0x5d71 }, { 4631, 0x550a }, { 4637, 0x9aa0 }, { 4643, 0x2d57 }, { 4652, 0x4005 }, { 4655, 0x4aa6 }, { 4662, 0x2021 }, { 4665, 0x30b1 }, { 4671, 0x3fc6 }, { 4681, 0x0112 }, { 4684, 0x10c2 }, { 4688, 0x260a }, { 4693, 0x4462 }, { 4698, 0x5082 }, /* 0x7c00 */ { 4702, 0x9880 }, { 4706, 0x8040 }, { 4708, 0x04c0 }, { 4711, 0x8100 }, { 4713, 0x2003 }, { 4716, 0x0000 }, { 4716, 0x0000 }, { 4716, 0x3818 }, { 4721, 0x0200 }, { 4722, 0xf1a6 }, { 4731, 0x4434 }, { 4736, 0x720e }, { 4743, 0x35a2 }, { 4750, 0x92e0 }, { 4756, 0x8101 }, { 4759, 0x0900 }, /* 0x7d00 */ { 4761, 0x0400 }, { 4762, 0x0000 }, { 4762, 0x8885 }, { 4767, 0x0000 }, { 4767, 0x0000 }, { 4767, 0x0000 }, { 4767, 0x4000 }, { 4768, 0x0080 }, { 4769, 0x0000 }, { 4769, 0x0000 }, { 4769, 0x4040 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, /* 0x7e00 */ { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0800 }, { 4772, 0x0082 }, { 4774, 0x0000 }, { 4774, 0x0000 }, { 4774, 0x0000 }, { 4774, 0x0004 }, { 4775, 0x8800 }, { 4777, 0xbfff }, { 4792, 0xe7ef }, { 4805, 0xffff }, { 4821, 0xffbf }, { 4836, 0xefef }, { 4850, 0xfdff }, /* 0x7f00 */ { 4865, 0xfbff }, { 4880, 0xbffe }, { 4894, 0xffff }, { 4910, 0x057f }, { 4919, 0x0034 }, { 4922, 0x85b3 }, { 4930, 0x4706 }, { 4936, 0x4216 }, { 4941, 0x5402 }, { 4945, 0xe410 }, { 4950, 0x8092 }, { 4954, 0xb305 }, { 4961, 0x5422 }, { 4966, 0x8130 }, { 4970, 0x4263 }, { 4976, 0x180b }, /* 0x8000 */ { 4981, 0x387b }, { 4990, 0x13f5 }, { 4999, 0x07e5 }, { 5007, 0xa9ea }, { 5016, 0x3c4c }, { 5023, 0x0514 }, { 5027, 0x0600 }, { 5029, 0x8002 }, { 5031, 0x1ad9 }, { 5039, 0xbd48 }, { 5047, 0xee37 }, { 5058, 0xf496 }, { 5067, 0x705f }, { 5076, 0x7ec0 }, { 5084, 0xbfb2 }, { 5095, 0x355f }, /* 0x8100 */ { 5105, 0xe644 }, { 5112, 0x455f }, { 5121, 0x9000 }, { 5123, 0x4146 }, { 5128, 0x1d40 }, { 5133, 0x063b }, { 5140, 0x62a1 }, { 5146, 0xfe13 }, { 5156, 0x8505 }, { 5161, 0x3902 }, { 5166, 0x0548 }, { 5170, 0x0c08 }, { 5173, 0x144f }, { 5180, 0x0000 }, { 5180, 0x3488 }, { 5185, 0x5818 }, /* 0x8200 */ { 5190, 0x3077 }, { 5198, 0xd815 }, { 5205, 0xbd0e }, { 5214, 0x4bfb }, { 5225, 0x8a90 }, { 5230, 0x8500 }, { 5233, 0xc100 }, { 5236, 0xe61d }, { 5245, 0xed14 }, { 5253, 0xb386 }, { 5261, 0xff72 }, { 5273, 0x639b }, { 5282, 0xfd92 }, { 5292, 0xd9be }, { 5303, 0x887b }, { 5311, 0x0a92 }, /* 0x8300 */ { 5316, 0xd3fe }, { 5328, 0x1cb2 }, { 5335, 0xb980 }, { 5341, 0x177a }, { 5350, 0x82c9 }, { 5356, 0xdc17 }, { 5365, 0xfffb }, { 5380, 0x3980 }, { 5385, 0x4260 }, { 5389, 0x590c }, { 5395, 0x0f01 }, { 5400, 0x37df }, { 5412, 0x94a3 }, { 5419, 0xb150 }, { 5425, 0x0623 }, { 5430, 0x2307 }, /* 0x8400 */ { 5436, 0xf85a }, { 5445, 0x3102 }, { 5449, 0x01f0 }, { 5454, 0x3102 }, { 5458, 0x0040 }, { 5459, 0x1e82 }, { 5465, 0x3a0a }, { 5471, 0x056a }, { 5477, 0x5b84 }, { 5484, 0x1280 }, { 5487, 0x8002 }, { 5489, 0xa714 }, { 5496, 0x2612 }, { 5501, 0xa04b }, { 5507, 0x1069 }, { 5512, 0x9001 }, /* 0x8500 */ { 5515, 0x1000 }, { 5516, 0x848a }, { 5521, 0x1802 }, { 5524, 0x3f80 }, { 5531, 0x0708 }, { 5535, 0x4240 }, { 5538, 0x0110 }, { 5540, 0x4e14 }, { 5546, 0x80b0 }, { 5550, 0x1800 }, { 5552, 0xc510 }, { 5557, 0x0281 }, { 5560, 0x8202 }, { 5563, 0x1029 }, { 5567, 0x0210 }, { 5569, 0x8800 }, /* 0x8600 */ { 5571, 0x0020 }, { 5572, 0x0042 }, { 5574, 0x0280 }, { 5576, 0x1100 }, { 5578, 0xe000 }, { 5581, 0x4413 }, { 5586, 0x5804 }, { 5590, 0xfe02 }, { 5598, 0x3c07 }, { 5605, 0x3028 }, { 5609, 0x9798 }, { 5617, 0x0473 }, { 5623, 0xced1 }, { 5632, 0xcb13 }, { 5640, 0x6210 }, { 5644, 0x431f }, /* 0x8700 */ { 5652, 0x278d }, { 5660, 0x55ac }, { 5668, 0x422e }, { 5674, 0xc892 }, { 5680, 0x5380 }, { 5685, 0x0288 }, { 5688, 0x4039 }, { 5693, 0x7851 }, { 5700, 0x292c }, { 5706, 0x8088 }, { 5709, 0xb900 }, { 5714, 0x2428 }, { 5718, 0x0c41 }, { 5722, 0x080e }, { 5726, 0x4421 }, { 5730, 0x4200 }, /* 0x8800 */ { 5732, 0x0408 }, { 5734, 0x0868 }, { 5738, 0x0006 }, { 5740, 0x1204 }, { 5743, 0x3031 }, { 5748, 0x0290 }, { 5751, 0x5b3e }, { 5761, 0xe085 }, { 5767, 0x2936 }, { 5774, 0x1044 }, { 5777, 0x2814 }, { 5781, 0x1082 }, { 5784, 0x4266 }, { 5790, 0x8334 }, { 5796, 0x013c }, { 5801, 0x531b }, /* 0x8900 */ { 5809, 0x0404 }, { 5811, 0x0e0d }, { 5817, 0x0c22 }, { 5821, 0x0051 }, { 5824, 0x0012 }, { 5826, 0xc000 }, { 5828, 0x0040 }, { 5829, 0x8800 }, { 5831, 0x004a }, { 5834, 0x0000 }, { 5834, 0x0000 }, { 5834, 0x0000 }, { 5834, 0xdff6 }, { 5847, 0x5447 }, { 5854, 0x8868 }, { 5859, 0x0008 }, /* 0x8a00 */ { 5860, 0x0081 }, { 5862, 0x0000 }, { 5862, 0x0000 }, { 5862, 0x4000 }, { 5863, 0x0100 }, { 5864, 0x0000 }, { 5864, 0x0000 }, { 5864, 0x0200 }, { 5865, 0x0600 }, { 5867, 0x0008 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, /* 0x8b00 */ { 5868, 0x0080 }, { 5869, 0x0000 }, { 5869, 0x0040 }, { 5870, 0x0000 }, { 5870, 0x0000 }, { 5870, 0x0000 }, { 5870, 0x1040 }, { 5872, 0x0000 }, { 5872, 0x0000 }, { 5872, 0x0000 }, { 5872, 0xefff }, { 5887, 0xf7fd }, { 5901, 0xff7f }, { 5916, 0xfffe }, { 5931, 0xfbff }, { 5946, 0xffff }, /* 0x8c00 */ { 5962, 0xfdff }, { 5977, 0xbfff }, { 5992, 0xffff }, { 6008, 0x00ff }, { 6016, 0x12c2 }, { 6021, 0x0420 }, { 6023, 0x0c06 }, { 6027, 0x0708 }, { 6031, 0x1624 }, { 6036, 0x0110 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, /* 0x8d00 */ { 6038, 0x0000 }, { 6038, 0xe000 }, { 6041, 0xfffe }, { 6056, 0xffff }, { 6072, 0xffff }, { 6088, 0x7f79 }, { 6100, 0x28df }, { 6109, 0x00f9 }, { 6115, 0x0c32 }, { 6120, 0x8012 }, { 6123, 0x0008 }, { 6124, 0xd53a }, { 6133, 0xd858 }, { 6140, 0xecc2 }, { 6148, 0x9d18 }, { 6155, 0x2fa8 }, /* 0x8e00 */ { 6163, 0x9620 }, { 6168, 0xe010 }, { 6172, 0xd60c }, { 6179, 0x2622 }, { 6184, 0x0f97 }, { 6193, 0x0206 }, { 6196, 0xb240 }, { 6201, 0x9055 }, { 6207, 0x80a2 }, { 6211, 0x5011 }, { 6215, 0x9800 }, { 6218, 0x0404 }, { 6220, 0x4000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, /* 0x8f00 */ { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0xfbc0 }, { 6230, 0xffff }, { 6246, 0xeffe }, { 6260, 0xdffb }, { 6274, 0x0b08 }, { 6278, 0x6243 }, { 6284, 0x41b6 }, { 6291, 0xfb3b }, { 6303, 0x6f74 }, { 6313, 0x2389 }, /* 0x9000 */ { 6319, 0xae7f }, { 6331, 0xecd7 }, { 6342, 0xe047 }, { 6349, 0x5960 }, { 6355, 0xa096 }, { 6361, 0x098f }, { 6368, 0x612c }, { 6374, 0xa030 }, { 6378, 0x090d }, { 6383, 0x2aaa }, { 6390, 0xd44e }, { 6398, 0x4f7b }, { 6409, 0xc4b2 }, { 6416, 0x388b }, { 6423, 0xa9c6 }, { 6431, 0x6110 }, /* 0x9100 */ { 6435, 0x0014 }, { 6437, 0x4200 }, { 6439, 0x800c }, { 6442, 0x0202 }, { 6444, 0xfe48 }, { 6453, 0x6485 }, { 6459, 0xd63e }, { 6469, 0xe3f7 }, { 6481, 0x3aa0 }, { 6487, 0x0c07 }, { 6492, 0xe40c }, { 6498, 0x0430 }, { 6501, 0xf680 }, { 6508, 0x1002 }, { 6510, 0x0000 }, { 6510, 0x0000 }, /* 0x9200 */ { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0010 }, { 6511, 0x4000 }, { 6512, 0x0000 }, { 6512, 0x4000 }, { 6513, 0x0000 }, { 6513, 0x0100 }, { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x0000 }, /* 0x9300 */ { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x4000 }, { 6515, 0x0000 }, { 6515, 0x0000 }, { 6515, 0x0400 }, { 6516, 0x0000 }, { 6516, 0x8000 }, { 6517, 0x0000 }, { 6517, 0x0000 }, { 6517, 0x0000 }, { 6517, 0x0400 }, { 6518, 0x0040 }, { 6519, 0x0000 }, { 6519, 0x0000 }, /* 0x9400 */ { 6519, 0x0000 }, { 6519, 0x0000 }, { 6519, 0x0000 }, { 6519, 0x4000 }, { 6520, 0x0000 }, { 6520, 0x0000 }, { 6520, 0x0800 }, { 6521, 0x0000 }, { 6521, 0xffe0 }, { 6532, 0xfebd }, { 6545, 0xffff }, { 6561, 0xffff }, { 6577, 0x7f7f }, { 6591, 0xfbe7 }, { 6604, 0xffbf }, { 6619, 0xf7ff }, /* 0x9500 */ { 6634, 0xffff }, { 6650, 0xefff }, { 6665, 0xff7e }, { 6679, 0xdff7 }, { 6693, 0xf6f7 }, { 6706, 0xfbdf }, { 6720, 0xbffe }, { 6734, 0x804f }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0xef00 }, { 6747, 0x7fff }, /* 0x9600 */ { 6762, 0xff7f }, { 6777, 0xb6f7 }, { 6789, 0x4406 }, { 6793, 0xb87e }, { 6803, 0x3bf5 }, { 6814, 0x8831 }, { 6819, 0x1796 }, { 6827, 0x00f4 }, { 6832, 0xa960 }, { 6838, 0x1391 }, { 6844, 0x0080 }, { 6845, 0x7249 }, { 6852, 0xf2f3 }, { 6863, 0x0024 }, { 6865, 0x8701 }, { 6870, 0x42c8 }, /* 0x9700 */ { 6875, 0xe3d3 }, { 6885, 0x5048 }, { 6889, 0x2400 }, { 6891, 0x4305 }, { 6896, 0x0000 }, { 6896, 0x4a4c }, { 6902, 0x0227 }, { 6907, 0x1058 }, { 6911, 0x2820 }, { 6914, 0x0116 }, { 6918, 0xa809 }, { 6923, 0x0014 }, { 6925, 0x0000 }, { 6925, 0x0000 }, { 6925, 0x3ec0 }, { 6932, 0x0068 }, /* 0x9800 */ { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0xffe0 }, { 6946, 0xb7ff }, { 6960, 0xfddb }, { 6973, 0x00f7 }, { 6980, 0x0000 }, { 6980, 0x4000 }, { 6981, 0xc72e }, { 6990, 0x0180 }, { 6992, 0x0000 }, /* 0x9900 */ { 6992, 0x2000 }, { 6993, 0x0001 }, { 6994, 0x4000 }, { 6995, 0x0000 }, { 6995, 0x0000 }, { 6995, 0x0030 }, { 6997, 0xffa8 }, { 7008, 0xb4f7 }, { 7019, 0xadf3 }, { 7030, 0x03ff }, { 7040, 0x0120 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, /* 0x9a00 */ { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0xf000 }, { 7046, 0xfffb }, { 7061, 0x9df7 }, { 7073, 0xfdcf }, { 7086, 0x01bf }, { 7094, 0x15c3 }, { 7101, 0x1827 }, { 7107, 0x810a }, { 7111, 0xa842 }, { 7116, 0x0a00 }, /* 0x9b00 */ { 7118, 0x8108 }, { 7121, 0x8008 }, { 7123, 0x8008 }, { 7125, 0x1804 }, { 7128, 0xa3be }, { 7138, 0x0012 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, /* 0x9c00 */ { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x9000 }, { 7142, 0x69e6 }, { 7151, 0xdc37 }, { 7161, 0x6bff }, { 7174, 0x3dff }, { 7187, 0xfcf8 }, { 7198, 0xf3f9 }, { 7210, 0x0004 }, }; static const Summary16 gb2312_uni2indx_page9e[27] = { /* 0x9e00 */ { 7211, 0x0000 }, { 7211, 0x8000 }, { 7212, 0xbf6f }, { 7225, 0xe7ee }, { 7237, 0xdffe }, { 7251, 0x5da2 }, { 7259, 0x3fd8 }, { 7269, 0xc00b }, { 7274, 0x0984 }, { 7278, 0xa00c }, { 7282, 0x0040 }, { 7283, 0x6910 }, { 7288, 0xe210 }, { 7293, 0xb912 }, { 7300, 0x86a5 }, { 7307, 0x5a00 }, /* 0x9f00 */ { 7311, 0x6800 }, { 7314, 0x0289 }, { 7318, 0x9005 }, { 7322, 0x6a80 }, { 7327, 0x0010 }, { 7328, 0x0003 }, { 7330, 0x0000 }, { 7330, 0x8000 }, { 7331, 0x1ff9 }, { 7342, 0x8e00 }, { 7346, 0x0001 }, }; static const Summary16 gb2312_uni2indx_pageff[15] = { /* 0xff00 */ { 7347, 0xfffe }, { 7362, 0xffff }, { 7378, 0xffff }, { 7394, 0xffff }, { 7410, 0xffff }, { 7426, 0x7fff }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x002b }, }; static int gb2312_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc > 0x0000 && wc < 0x0460) summary = &gb2312_uni2indx_page00[(wc>>4)]; else if (wc >= 0x2000 && wc < 0x2650) summary = &gb2312_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x3000 && wc < 0x3230) summary = &gb2312_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x4e00 && wc < 0x9cf0) summary = &gb2312_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0x9e00 && wc < 0x9fb0) summary = &gb2312_uni2indx_page9e[(wc>>4)-0x9e0]; else if (wc >= 0xff00 && wc < 0xfff0) summary = &gb2312_uni2indx_pageff[(wc>>4)-0xff0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' and the number of bits set in `used'. */ used = (used & 0x5555) + ((used & 0xaaaa) >> 1); used = (used & 0x3333) + ((used & 0xcccc) >> 2); used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); used = (used & 0x00ff) + (used >> 8); c = gb2312_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-3.21.80/src/libtiniconv/encdec/gbk.h0000664000175000017500000001120612313064025015306 00000000000000/* * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK */ /* * GBK, as described in Ken Lunde's book, is an extension of GB 2312-1980 * (shifted by adding 0x8080 to the range 0xA1A1..0xFEFE, as used in EUC-CN). * It adds the following ranges: * * (part of GBK/1) 0xA2A1-0xA2AA Small Roman numerals * GBK/3 0x{81-A0}{40-7E,80-FE} 6080 new characters, all in Unicode * GBK/4 0x{AA-FE}{40-7E,80-A0} 8160 new characters, 8080 in Unicode * GBK/5 0x{A8-A9}{40-7E,80-A0} 166 new characters, 153 in Unicode * * Furthermore, all four tables I have looked at * - the CP936 table by Microsoft, found on ftp.unicode.org in 1999, * - the GBK table by Sun, investigated on a Solaris 2.7 machine, * - the GBK tables by CWEX, found in the Big5+ package, * - the GB18030 standard (second printing), * agree in the following extensions. (Ken Lunde must have overlooked these * differences between GB2312 and GBK. Also, the CWEX tables have additional * differences.) * * 1. Some characters in the GB2312 range are defined differently: * * code GB2312 GBK * 0xA1A4 0x30FB # KATAKANA MIDDLE DOT 0x00B7 # MIDDLE DOT * 0xA1AA 0x2015 # HORIZONTAL BAR 0x2014 # EM DASH * * 2. 19 characters added in the range 0xA6E0-0xA6F5. * * 3. 4 characters added in the range 0xA8BB-0xA8C0. * * CP936 as of 1999 was identical to GBK. However, since 1999, Microsoft has * added new mappings to CP936... */ #include "gbkext1.h" #include "gbkext2.h" #include "gbkext_inv.h" #include "cp936ext.h" static int gbk_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0x81 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); if (c >= 0xa1 && c <= 0xf7) { unsigned char c2 = s[1]; if (c == 0xa1) { if (c2 == 0xa4) { *pwc = 0x00b7; return 2; } if (c2 == 0xaa) { *pwc = 0x2014; return 2; } } if (c2 >= 0xa1 && c2 < 0xff) { unsigned char buf[2]; int ret; buf[0] = c-0x80; buf[1] = c2-0x80; ret = gb2312_mbtowc(conv,pwc,buf,2); if (ret != RET_ILSEQ) return ret; buf[0] = c; buf[1] = c2; ret = cp936ext_mbtowc(conv,pwc,buf,2); if (ret != RET_ILSEQ) return ret; } } if (c >= 0x81 && c <= 0xa0) return gbkext1_mbtowc(conv,pwc,s,2); if (c >= 0xa8 && c <= 0xfe) return gbkext2_mbtowc(conv,pwc,s,2); if (c == 0xa2) { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 <= 0xaa) { *pwc = 0x2170+(c2-0xa1); return 2; } } } return RET_ILSEQ; } static int gbk_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; if (wc != 0x30fb && wc != 0x2015) { ret = gb2312_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]+0x80; r[1] = buf[1]+0x80; return 2; } } ret = gbkext_inv_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } if (wc >= 0x2170 && wc <= 0x2179) { if (n < 2) return RET_TOOSMALL; r[0] = 0xa2; r[1] = 0xa1 + (wc-0x2170); return 2; } ret = cp936ext_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } if (wc == 0x00b7) { if (n < 2) return RET_TOOSMALL; r[0] = 0xa1; r[1] = 0xa4; return 2; } if (wc == 0x2014) { if (n < 2) return RET_TOOSMALL; r[0] = 0xa1; r[1] = 0xaa; return 2; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/koi8_u.h0000664000175000017500000001625712313064025015754 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * KOI8-U */ /* Specification: RFC 2319 */ static const unsigned short koi8_u_2uni[128] = { /* 0x80 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, /* 0x90 */ 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, /* 0xa0 */ 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x0491, 0x255d, 0x255e, /* 0xb0 */ 0x255f, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x0490, 0x256c, 0x00a9, /* 0xc0 */ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0xd0 */ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0xe0 */ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0xf0 */ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, }; static int koi8_u_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) koi8_u_2uni[c-0x80]; return 1; } static const unsigned char koi8_u_page00[88] = { 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ }; static const unsigned char koi8_u_page04[152] = { 0x00, 0xb3, 0x00, 0x00, 0xb4, 0x00, 0xb6, 0xb7, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ 0x00, 0xa3, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xbd, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char koi8_u_page22[80] = { 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char koi8_u_page23[8] = { 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char koi8_u_page25[168] = { 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xa0, 0xa1, 0xa2, 0x00, 0xa5, 0x00, 0x00, 0xa8, /* 0x50-0x57 */ 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, 0xb0, /* 0x58-0x5f */ 0xb1, 0xb2, 0x00, 0xb5, 0x00, 0x00, 0xb8, 0xb9, /* 0x60-0x67 */ 0xba, 0xbb, 0xbc, 0x00, 0xbe, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int koi8_u_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = koi8_u_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = koi8_u_page04[wc-0x0400]; else if (wc >= 0x2218 && wc < 0x2268) c = koi8_u_page22[wc-0x2218]; else if (wc >= 0x2320 && wc < 0x2328) c = koi8_u_page23[wc-0x2320]; else if (wc >= 0x2500 && wc < 0x25a8) c = koi8_u_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/utf7.h0000664000175000017500000002444612313064025015442 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UTF-7 */ /* Specification: RFC 2152 (and old RFC 1641, RFC 1642) */ /* The original Base64 encoding is defined in RFC 2045. */ /* Set of direct characters: * A-Z a-z 0-9 ' ( ) , - . / : ? space tab lf cr */ static const unsigned char direct_tab[128/8] = { 0x00, 0x26, 0x00, 0x00, 0x81, 0xf3, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, }; #define isdirect(ch) ((ch) < 128 && ((direct_tab[(ch)>>3] >> (ch & 7)) & 1)) /* Set of direct and optional direct characters: * A-Z a-z 0-9 ' ( ) , - . / : ? space tab lf cr * ! " # $ % & * ; < = > @ [ ] ^ _ ` { | } */ static const unsigned char xdirect_tab[128/8] = { 0x00, 0x26, 0x00, 0x00, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x3f, }; #define isxdirect(ch) ((ch) < 128 && ((xdirect_tab[(ch)>>3] >> (ch & 7)) & 1)) /* Set of base64 characters, extended: * A-Z a-z 0-9 + / - */ static const unsigned char xbase64_tab[128/8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x03, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, }; #define isxbase64(ch) ((ch) < 128 && ((xbase64_tab[(ch)>>3] >> (ch & 7)) & 1)) /* * The state is structured as follows: * bit 1..0: shift * bit 7..2: data * Precise meaning: * shift data * 0 0 not inside base64 encoding * 1 0 inside base64, no pending bits * 2 XXXX00 inside base64, 4 bits remain from 2nd byte * 3 XX0000 inside base64, 2 bits remain from 3rd byte */ static int utf7_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { conv_state_t state = conv->istate; int count = 0; /* number of input bytes already read */ if (state & 3) goto active; else goto inactive; inactive: { /* Here (state & 3) == 0 */ if (n < count+1) goto none; { unsigned char c = *s; if (isxdirect(c)) { *pwc = (ucs4_t) c; conv->istate = state; return count+1; } if (c == '+') { if (n < count+2) goto none; if (s[1] == '-') { *pwc = (ucs4_t) '+'; conv->istate = state; return count+2; } s++; count++; state = 1; goto active; } return RET_ILSEQ; } } active: { /* base64 encoding active */ unsigned int wc = 0; conv_state_t base64state = state; unsigned int kmax = 2; /* number of payload bytes to read */ unsigned int k = 0; /* number of payload bytes already read */ unsigned int base64count = 0; /* number of base64 bytes already read */ for (;;) { unsigned char c = *s; unsigned int i; if (c >= 'A' && c <= 'Z') i = c-'A'; else if (c >= 'a' && c <= 'z') i = c-'a'+26; else if (c >= '0' && c <= '9') i = c-'0'+52; else if (c == '+') i = 62; else if (c == '/') i = 63; else { /* c terminates base64 encoding */ if (base64state & -4) return RET_ILSEQ; /* data must be 0, otherwise illegal */ if (base64count) return RET_ILSEQ; /* partial UTF-16 characters are invalid */ if (c == '-') { s++; count++; } state = 0; goto inactive; } s++; base64count++; /* read 6 bits: 0 <= i < 64 */ switch (base64state & 3) { case 1: /* inside base64, no pending bits */ base64state = (i << 2) | 0; break; case 0: /* inside base64, 6 bits remain from 1st byte */ wc = (wc << 8) | (base64state & -4) | (i >> 4); k++; base64state = ((i & 15) << 4) | 2; break; case 2: /* inside base64, 4 bits remain from 2nd byte */ wc = (wc << 8) | (base64state & -4) | (i >> 2); k++; base64state = ((i & 3) << 6) | 3; break; case 3: /* inside base64, 2 bits remain from 3rd byte */ wc = (wc << 8) | (base64state & -4) | i; k++; base64state = 1; break; } if (k == kmax) { /* UTF-16: When we see a High Surrogate, we must also decode the following Low Surrogate. */ if (kmax == 2 && (wc >= 0xd800 && wc < 0xdc00)) kmax = 4; else break; } if (n < count+(int)base64count+1) { if (*(s-base64count-count) == '+') { /* Begin of base64 sequence. * Not changing state and not reporting RET_TOOFEW(>0). * Next time will do the things again. */ return RET_TOOSMALL; } goto none; } } /* Here k = kmax > 0, hence base64count > 0. */ if ((base64state & 3) == 0) abort(); if (kmax == 4) { ucs4_t wc1 = wc >> 16; ucs4_t wc2 = wc & 0xffff; if (!(wc1 >= 0xd800 && wc1 < 0xdc00)) abort(); if (!(wc2 >= 0xdc00 && wc2 < 0xe000)) return RET_ILSEQ; *pwc = 0x10000 + ((wc1 - 0xd800) << 10) + (wc2 - 0xdc00); } else { *pwc = wc; } conv->istate = base64state; return count+base64count; } none: conv->istate = state; return RET_TOOFEW(count); } /* * The state is structured as follows: * bit 1..0: shift * bit 7..2: data * Precise meaning: * shift data * 0 0 not inside base64 encoding * 1 0 inside base64, no pending bits * 2 XX00 inside base64, 2 bits known for 2nd byte * 3 XXXX inside base64, 4 bits known for 3rd byte */ /* Define this to 1 if you want the so-called "optional direct" characters ! " # $ % & * ; < = > @ [ ] ^ _ ` { | } to be encoded. Define to 0 if you want them to be passed straight through, like the so-called "direct" characters. We set this to 1 because it's safer. */ #define UTF7_ENCODE_OPTIONAL_CHARS 1 static int utf7_wctomb (conv_t conv, unsigned char *r, ucs4_t iwc, int n) { conv_state_t state = conv->ostate; unsigned int wc = iwc; int count = 0; if (state & 3) goto active; /*inactive:*/ { if (UTF7_ENCODE_OPTIONAL_CHARS ? isdirect(wc) : isxdirect(wc)) { r[0] = (unsigned char) wc; /*conv->ostate = state;*/ return 1; } else { *r++ = '+'; if (wc == '+') { if (n < 2) return RET_TOOSMALL; *r = '-'; /*conv->ostate = state;*/ return 2; } count = 1; state = 1; goto active; } } active: { /* base64 encoding active */ if (UTF7_ENCODE_OPTIONAL_CHARS ? isdirect(wc) : isxdirect(wc)) { /* deactivate base64 encoding */ count += ((state & 3) >= 2 ? 1 : 0) + (isxbase64(wc) ? 1 : 0) + 1; if (n < count) return RET_TOOSMALL; if ((state & 3) >= 2) { unsigned int i = state & -4; unsigned char c = 0; if (i < 26) c = i+'A'; else if (i < 52) c = i-26+'a'; else if (i < 62) c = i-52+'0'; else if (i == 62) c = '+'; else if (i == 63) c = '/'; else abort(); *r++ = c; } if (isxbase64(wc)) *r++ = '-'; state = 0; *r++ = (unsigned char) wc; conv->ostate = state; return count; } else { unsigned int k; /* number of payload bytes to write */ if (wc < 0x10000) { k = 2; count += ((state & 3) >= 2 ? 3 : 2); } else if (wc < 0x110000) { unsigned int wc1 = 0xd800 + ((wc - 0x10000) >> 10); unsigned int wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff); wc = (wc1 << 16) | wc2; k = 4; count += ((state & 3) >= 3 ? 6 : 5); } else return RET_ILUNI; if (n < count) return RET_TOOSMALL; for (;;) { unsigned int i; unsigned char c = 0; switch (state & 3) { case 0: /* inside base64, 6 bits known for 4th byte */ c = (state & -4) >> 2; state = 1; break; case 1: /* inside base64, no pending bits */ i = (wc >> (8 * --k)) & 0xff; c = i >> 2; state = ((i & 3) << 4) | 2; break; case 2: /* inside base64, 2 bits known for 2nd byte */ i = (wc >> (8 * --k)) & 0xff; c = (state & -4) | (i >> 4); state = ((i & 15) << 2) | 3; break; case 3: /* inside base64, 4 bits known for 3rd byte */ i = (wc >> (8 * --k)) & 0xff; c = (state & -4) | (i >> 6); state = ((i & 63) << 2) | 0; break; default: abort(); /* stupid gcc */ } if (c < 26) c = c+'A'; else if (c < 52) c = c-26+'a'; else if (c < 62) c = c-52+'0'; else if (c == 62) c = '+'; else if (c == 63) c = '/'; else abort(); *r++ = c; if ((state & 3) && (k == 0)) break; } conv->ostate = state; return count; } } } static int utf7_reset (conv_t conv, unsigned char *r, int n) { conv_state_t state = conv->ostate; if (state & 3) { /* deactivate base64 encoding */ int count = ((state & 3) >= 2 ? 1 : 0) + 1; if (n < count) return RET_TOOSMALL; if ((state & 3) >= 2) { unsigned int i = state & -4; unsigned char c = 0; if (i < 26) c = i+'A'; else if (i < 52) c = i-26+'a'; else if (i < 62) c = i-52+'0'; else if (i == 62) c = '+'; else if (i == 63) c = '/'; else abort(); *r++ = c; } *r++ = '-'; /* conv->ostate = 0; will be done by the caller */ return count; } else return 0; } fldigi-3.21.80/src/libtiniconv/encdec/cp1252.h0000664000175000017500000000702312313064025015461 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1252 */ static const unsigned short cp1252_2uni[32] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffd, 0x017d, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffd, 0x017e, 0x0178, }; static int cp1252_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80 || c >= 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1252_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1252_page01[72] = { 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x9f, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x9e, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1252_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1252_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1252_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = wc; else if (wc >= 0x0150 && wc < 0x0198) c = cp1252_page01[wc-0x0150]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1252_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1252_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/cp1250.h0000664000175000017500000001305712313064025015463 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1250 */ static const unsigned short cp1250_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0xfffd, 0x201e, 0x2026, 0x2020, 0x2021, 0xfffd, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a, /* 0xa0 */ 0x00a0, 0x02c7, 0x02d8, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b, /* 0xb0 */ 0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c, /* 0xc0 */ 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, /* 0xd0 */ 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, /* 0xe0 */ 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, /* 0xf0 */ 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, }; static int cp1250_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1250_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1250_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0x00, 0x00, 0xda, 0x00, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0x00, 0x00, 0xfa, 0x00, 0xfc, 0xfd, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0xa5, 0xb9, 0xc6, 0xe6, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0xcf, 0xef, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xca, 0xea, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0xc5, 0xe5, 0x00, 0x00, 0xbc, 0xbe, 0x00, /* 0x38-0x3f */ 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0xd2, /* 0x40-0x47 */ 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xd5, 0xf5, 0x00, 0x00, 0xc0, 0xe0, 0x00, 0x00, /* 0x50-0x57 */ 0xd8, 0xf8, 0x8c, 0x9c, 0x00, 0x00, 0xaa, 0xba, /* 0x58-0x5f */ 0x8a, 0x9a, 0xde, 0xfe, 0x8d, 0x9d, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, /* 0x68-0x6f */ 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x8f, 0x9f, 0xaf, 0xbf, 0x8e, 0x9e, 0x00, /* 0x78-0x7f */ }; static const unsigned char cp1250_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xa2, 0xff, 0x00, 0xb2, 0x00, 0xbd, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1250_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1250_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = cp1250_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1250_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1250_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/koi8_ru.h0000664000175000017500000001623712313064025016134 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * KOI8-RU */ static const unsigned short koi8_ru_2uni[128] = { /* 0x80 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, /* 0x90 */ 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, /* 0xa0 */ 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x0491, 0x045e, 0x255e, /* 0xb0 */ 0x255f, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x0490, 0x040e, 0x00a9, /* 0xc0 */ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0xd0 */ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0xe0 */ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0xf0 */ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, }; static int koi8_ru_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) koi8_ru_2uni[c-0x80]; return 1; } static const unsigned char koi8_ru_page00[88] = { 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ }; static const unsigned char koi8_ru_page04[152] = { 0x00, 0xb3, 0x00, 0x00, 0xb4, 0x00, 0xb6, 0xb7, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, /* 0x08-0x0f */ 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ 0x00, 0xa3, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xbd, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char koi8_ru_page22[80] = { 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char koi8_ru_page23[8] = { 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char koi8_ru_page25[168] = { 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xa0, 0xa1, 0xa2, 0x00, 0xa5, 0x00, 0x00, 0xa8, /* 0x50-0x57 */ 0xa9, 0xaa, 0xab, 0xac, 0x00, 0x00, 0xaf, 0xb0, /* 0x58-0x5f */ 0xb1, 0xb2, 0x00, 0xb5, 0x00, 0x00, 0xb8, 0xb9, /* 0x60-0x67 */ 0xba, 0xbb, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int koi8_ru_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = koi8_ru_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = koi8_ru_page04[wc-0x0400]; else if (wc >= 0x2218 && wc < 0x2268) c = koi8_ru_page22[wc-0x2218]; else if (wc >= 0x2320 && wc < 0x2328) c = koi8_ru_page23[wc-0x2320]; else if (wc >= 0x2500 && wc < 0x25a8) c = koi8_ru_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_8.h0000664000175000017500000000754712313064025016137 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-8 */ static const unsigned short iso8859_8_2uni[96] = { /* 0xa0 */ 0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0xfffd, /* 0xc0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xd0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2017, /* 0xe0 */ 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0xf0 */ 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd, }; static int iso8859_8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xa0) { unsigned short wc = iso8859_8_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } else { *pwc = (ucs4_t) c; return 1; } return RET_ILSEQ; } static const unsigned char iso8859_8_page00[88] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, /* 0xf0-0xf7 */ }; static const unsigned char iso8859_8_page05[32] = { 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xd0-0xd7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xd8-0xdf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xe0-0xe7 */ 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ }; static const unsigned char iso8859_8_page20[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfe, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0x10-0x17 */ }; static int iso8859_8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = iso8859_8_page00[wc-0x00a0]; else if (wc >= 0x05d0 && wc < 0x05f0) c = iso8859_8_page05[wc-0x05d0]; else if (wc >= 0x2008 && wc < 0x2018) c = iso8859_8_page20[wc-0x2008]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/iso8859_14.h0000664000175000017500000001240612313064025016202 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-14 */ static const unsigned short iso8859_14_2uni[96] = { /* 0xa0 */ 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178, /* 0xb0 */ 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff, }; static int iso8859_14_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xa0) *pwc = (ucs4_t) iso8859_14_2uni[c-0xa0]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char iso8859_14_page00[96] = { 0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0x00, 0x00, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x00, 0xff, /* 0xf8-0xff */ }; static const unsigned char iso8859_14_page01_0[32] = { 0x00, 0x00, 0xa4, 0xa5, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0xb2, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char iso8859_14_page01_1[16] = { 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, 0xde, 0xfe, /* 0x70-0x77 */ 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_14_page1e_0[136] = { 0x00, 0x00, 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0xa6, 0xab, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb1, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xb4, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xb9, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xbb, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xa8, 0xb8, 0xaa, 0xba, 0xbd, 0xbe, 0x00, 0x00, /* 0x80-0x87 */ }; static const unsigned char iso8859_14_page1e_1[8] = { 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ }; static int iso8859_14_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = iso8859_14_page00[wc-0x00a0]; else if (wc >= 0x0108 && wc < 0x0128) c = iso8859_14_page01_0[wc-0x0108]; else if (wc >= 0x0170 && wc < 0x0180) c = iso8859_14_page01_1[wc-0x0170]; else if (wc >= 0x1e00 && wc < 0x1e88) c = iso8859_14_page1e_0[wc-0x1e00]; else if (wc >= 0x1ef0 && wc < 0x1ef8) c = iso8859_14_page1e_1[wc-0x1ef0]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/cp1257.h0000664000175000017500000001305712313064025015472 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1257 */ static const unsigned short cp1257_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0xfffd, 0x201e, 0x2026, 0x2020, 0x2021, 0xfffd, 0x2030, 0xfffd, 0x2039, 0xfffd, 0x00a8, 0x02c7, 0x00b8, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0x00af, 0x02db, 0xfffd, /* 0xa0 */ 0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0xfffd, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, /* 0xc0 */ 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, /* 0xd0 */ 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, /* 0xe0 */ 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, /* 0xf0 */ 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x02d9, }; static int cp1257_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1257_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1257_page00[224] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0x8d, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x9d, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x8f, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0xaf, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0x00, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xa8, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe5, 0xbf, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0x00, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xb8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc2, 0xe2, 0x00, 0x00, 0xc0, 0xe0, 0xc3, 0xe3, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0xc7, 0xe7, 0x00, 0x00, 0xcb, 0xeb, /* 0x10-0x17 */ 0xc6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0xce, 0xee, 0x00, 0x00, 0xc1, 0xe1, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xed, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0xcf, 0xef, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0xd9, 0xf9, 0xd1, 0xf1, 0xd2, 0xf2, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0xd4, 0xf4, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xba, /* 0x50-0x57 */ 0x00, 0x00, 0xda, 0xfa, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0xca, 0xea, 0xdd, 0xfd, 0xde, 0xfe, 0x00, /* 0x78-0x7f */ }; static const unsigned char cp1257_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0xff, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1257_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1257_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = cp1257_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1257_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1257_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/vietcomb.h0000664000175000017500000003023212313064025016353 00000000000000/* * Copyright (C) 2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* Combining characters used in Vietnamese encodings CP1258, TCVN. */ #ifndef _VIETCOMB_H #define _VIETCOMB_H /* Relevant combining characters: 0x0300, 0x0301, 0x0303, 0x0309, 0x0323. */ /* Composition tables for each of the relevant combining characters. */ static const struct { unsigned short base; unsigned short composed; } viet_comp_table_data[] = { #define viet_comp_table0300_idx 0 #define viet_comp_table0300_len 31 { 0x0041, 0x00C0 }, { 0x0045, 0x00C8 }, { 0x0049, 0x00CC }, { 0x004E, 0x01F8 }, { 0x004F, 0x00D2 }, { 0x0055, 0x00D9 }, { 0x0057, 0x1E80 }, { 0x0059, 0x1EF2 }, { 0x0061, 0x00E0 }, { 0x0065, 0x00E8 }, { 0x0069, 0x00EC }, { 0x006E, 0x01F9 }, { 0x006F, 0x00F2 }, { 0x0075, 0x00F9 }, { 0x0077, 0x1E81 }, { 0x0079, 0x1EF3 }, { 0x00A8, 0x1FED }, { 0x00C2, 0x1EA6 }, { 0x00CA, 0x1EC0 }, { 0x00D4, 0x1ED2 }, { 0x00DC, 0x01DB }, { 0x00E2, 0x1EA7 }, { 0x00EA, 0x1EC1 }, { 0x00F4, 0x1ED3 }, { 0x00FC, 0x01DC }, { 0x0102, 0x1EB0 }, { 0x0103, 0x1EB1 }, /*{ 0x0112, 0x1E14 },*/ /*{ 0x0113, 0x1E15 },*/ /*{ 0x014C, 0x1E50 },*/ /*{ 0x014D, 0x1E51 },*/ { 0x01A0, 0x1EDC }, { 0x01A1, 0x1EDD }, { 0x01AF, 0x1EEA }, { 0x01B0, 0x1EEB }, #define viet_comp_table0301_idx (viet_comp_table0300_idx+viet_comp_table0300_len) #define viet_comp_table0301_len 64 { 0x0041, 0x00C1 }, { 0x0043, 0x0106 }, { 0x0045, 0x00C9 }, { 0x0047, 0x01F4 }, { 0x0049, 0x00CD }, { 0x004B, 0x1E30 }, { 0x004C, 0x0139 }, { 0x004D, 0x1E3E }, { 0x004E, 0x0143 }, { 0x004F, 0x00D3 }, { 0x0050, 0x1E54 }, { 0x0052, 0x0154 }, { 0x0053, 0x015A }, { 0x0055, 0x00DA }, { 0x0057, 0x1E82 }, { 0x0059, 0x00DD }, { 0x005A, 0x0179 }, { 0x0061, 0x00E1 }, { 0x0063, 0x0107 }, { 0x0065, 0x00E9 }, { 0x0067, 0x01F5 }, { 0x0069, 0x00ED }, { 0x006B, 0x1E31 }, { 0x006C, 0x013A }, { 0x006D, 0x1E3F }, { 0x006E, 0x0144 }, { 0x006F, 0x00F3 }, { 0x0070, 0x1E55 }, { 0x0072, 0x0155 }, { 0x0073, 0x015B }, { 0x0075, 0x00FA }, { 0x0077, 0x1E83 }, { 0x0079, 0x00FD }, { 0x007A, 0x017A }, { 0x00A5, 0x0385 }, { 0x00A8, 0x1FEE }, { 0x00C2, 0x1EA4 }, { 0x00C5, 0x01FA }, { 0x00C6, 0x01FC }, { 0x00C7, 0x1E08 }, { 0x00CA, 0x1EBE }, { 0x00CF, 0x1E2E }, { 0x00D4, 0x1ED0 }, { 0x00D5, 0x1E4C }, { 0x00D8, 0x01FE }, { 0x00DC, 0x01D7 }, { 0x00E2, 0x1EA5 }, { 0x00E5, 0x01FB }, { 0x00E6, 0x01FD }, { 0x00E7, 0x1E09 }, { 0x00EA, 0x1EBF }, { 0x00EF, 0x1E2F }, { 0x00F4, 0x1ED1 }, { 0x00F5, 0x1E4D }, { 0x00F8, 0x01FF }, { 0x00FC, 0x01D8 }, { 0x0102, 0x1EAE }, { 0x0103, 0x1EAF }, /*{ 0x0112, 0x1E16 },*/ /*{ 0x0113, 0x1E17 },*/ /*{ 0x014C, 0x1E52 },*/ /*{ 0x014D, 0x1E53 },*/ { 0x0168, 0x1E78 }, { 0x0169, 0x1E79 }, { 0x01A0, 0x1EDA }, { 0x01A1, 0x1EDB }, { 0x01AF, 0x1EE8 }, { 0x01B0, 0x1EE9 }, #define viet_comp_table0303_idx (viet_comp_table0301_idx+viet_comp_table0301_len) #define viet_comp_table0303_len 34 { 0x0041, 0x00C3 }, { 0x0045, 0x1EBC }, { 0x0049, 0x0128 }, { 0x004E, 0x00D1 }, { 0x004F, 0x00D5 }, { 0x0055, 0x0168 }, { 0x0056, 0x1E7C }, { 0x0059, 0x1EF8 }, { 0x0061, 0x00E3 }, { 0x0065, 0x1EBD }, { 0x0069, 0x0129 }, { 0x006E, 0x00F1 }, { 0x006F, 0x00F5 }, { 0x0075, 0x0169 }, { 0x0076, 0x1E7D }, { 0x0079, 0x1EF9 }, { 0x00C2, 0x1EAA }, { 0x00CA, 0x1EC4 }, { 0x00D3, 0x1E4C }, { 0x00D4, 0x1ED6 }, { 0x00D6, 0x1E4E }, { 0x00DA, 0x1E78 }, { 0x00E2, 0x1EAB }, { 0x00EA, 0x1EC5 }, { 0x00F3, 0x1E4D }, { 0x00F4, 0x1ED7 }, { 0x00F6, 0x1E4F }, { 0x00FA, 0x1E79 }, { 0x0102, 0x1EB4 }, { 0x0103, 0x1EB5 }, { 0x01A0, 0x1EE0 }, { 0x01A1, 0x1EE1 }, { 0x01AF, 0x1EEE }, { 0x01B0, 0x1EEF }, #define viet_comp_table0309_idx (viet_comp_table0303_idx+viet_comp_table0303_len) #define viet_comp_table0309_len 24 { 0x0041, 0x1EA2 }, { 0x0045, 0x1EBA }, { 0x0049, 0x1EC8 }, { 0x004F, 0x1ECE }, { 0x0055, 0x1EE6 }, { 0x0059, 0x1EF6 }, { 0x0061, 0x1EA3 }, { 0x0065, 0x1EBB }, { 0x0069, 0x1EC9 }, { 0x006F, 0x1ECF }, { 0x0075, 0x1EE7 }, { 0x0079, 0x1EF7 }, { 0x00C2, 0x1EA8 }, { 0x00CA, 0x1EC2 }, { 0x00D4, 0x1ED4 }, { 0x00E2, 0x1EA9 }, { 0x00EA, 0x1EC3 }, { 0x00F4, 0x1ED5 }, { 0x0102, 0x1EB2 }, { 0x0103, 0x1EB3 }, { 0x01A0, 0x1EDE }, { 0x01A1, 0x1EDF }, { 0x01AF, 0x1EEC }, { 0x01B0, 0x1EED }, #define viet_comp_table0323_idx (viet_comp_table0309_idx+viet_comp_table0309_len) #define viet_comp_table0323_len 50 { 0x0041, 0x1EA0 }, { 0x0042, 0x1E04 }, { 0x0044, 0x1E0C }, { 0x0045, 0x1EB8 }, { 0x0048, 0x1E24 }, { 0x0049, 0x1ECA }, { 0x004B, 0x1E32 }, { 0x004C, 0x1E36 }, { 0x004D, 0x1E42 }, { 0x004E, 0x1E46 }, { 0x004F, 0x1ECC }, { 0x0052, 0x1E5A }, { 0x0053, 0x1E62 }, { 0x0054, 0x1E6C }, { 0x0055, 0x1EE4 }, { 0x0056, 0x1E7E }, { 0x0057, 0x1E88 }, { 0x0059, 0x1EF4 }, { 0x005A, 0x1E92 }, { 0x0061, 0x1EA1 }, { 0x0062, 0x1E05 }, { 0x0064, 0x1E0D }, { 0x0065, 0x1EB9 }, { 0x0068, 0x1E25 }, { 0x0069, 0x1ECB }, { 0x006B, 0x1E33 }, { 0x006C, 0x1E37 }, { 0x006D, 0x1E43 }, { 0x006E, 0x1E47 }, { 0x006F, 0x1ECD }, { 0x0072, 0x1E5B }, { 0x0073, 0x1E63 }, { 0x0074, 0x1E6D }, { 0x0075, 0x1EE5 }, { 0x0076, 0x1E7F }, { 0x0077, 0x1E89 }, { 0x0079, 0x1EF5 }, { 0x007A, 0x1E93 }, { 0x00C2, 0x1EAC }, { 0x00CA, 0x1EC6 }, { 0x00D4, 0x1ED8 }, { 0x00E2, 0x1EAD }, { 0x00EA, 0x1EC7 }, { 0x00F4, 0x1ED9 }, { 0x0102, 0x1EB6 }, { 0x0103, 0x1EB7 }, { 0x01A0, 0x1EE2 }, { 0x01A1, 0x1EE3 }, { 0x01AF, 0x1EF0 }, { 0x01B0, 0x1EF1 }, }; static const struct { unsigned int len; unsigned int idx; } viet_comp_table[] = { { viet_comp_table0300_len, viet_comp_table0300_idx }, { viet_comp_table0301_len, viet_comp_table0301_idx }, { viet_comp_table0303_len, viet_comp_table0303_idx }, { viet_comp_table0309_len, viet_comp_table0309_idx }, { viet_comp_table0323_len, viet_comp_table0323_idx }, }; /* Decomposition table for the relevant Unicode characters. */ struct viet_decomp { unsigned short composed; unsigned int base : 12; int comb1 : 4; }; static const struct viet_decomp viet_decomp_table[] = { { 0x00B4, 0x0020, 1 }, /* compatibility decomposition - for TCVN only */ { 0x00C0, 0x0041, 0 }, { 0x00C1, 0x0041, 1 }, { 0x00C3, 0x0041, 2 }, { 0x00C8, 0x0045, 0 }, { 0x00C9, 0x0045, 1 }, { 0x00CC, 0x0049, 0 }, { 0x00CD, 0x0049, 1 }, { 0x00D1, 0x004E, 2 }, { 0x00D2, 0x004F, 0 }, { 0x00D3, 0x004F, 1 }, { 0x00D5, 0x004F, 2 }, { 0x00D9, 0x0055, 0 }, { 0x00DA, 0x0055, 1 }, { 0x00DD, 0x0059, 1 }, { 0x00E0, 0x0061, 0 }, { 0x00E1, 0x0061, 1 }, { 0x00E3, 0x0061, 2 }, { 0x00E8, 0x0065, 0 }, { 0x00E9, 0x0065, 1 }, { 0x00EC, 0x0069, 0 }, { 0x00ED, 0x0069, 1 }, { 0x00F1, 0x006E, 2 }, { 0x00F2, 0x006F, 0 }, { 0x00F3, 0x006F, 1 }, { 0x00F5, 0x006F, 2 }, { 0x00F9, 0x0075, 0 }, { 0x00FA, 0x0075, 1 }, { 0x00FD, 0x0079, 1 }, { 0x0106, 0x0043, 1 }, { 0x0107, 0x0063, 1 }, { 0x0128, 0x0049, 2 }, { 0x0129, 0x0069, 2 }, { 0x0139, 0x004C, 1 }, { 0x013A, 0x006C, 1 }, { 0x0143, 0x004E, 1 }, { 0x0144, 0x006E, 1 }, { 0x0154, 0x0052, 1 }, { 0x0155, 0x0072, 1 }, { 0x015A, 0x0053, 1 }, { 0x015B, 0x0073, 1 }, { 0x0168, 0x0055, 2 }, { 0x0169, 0x0075, 2 }, { 0x0179, 0x005A, 1 }, { 0x017A, 0x007A, 1 }, { 0x01D7, 0x00DC, 1 }, { 0x01D8, 0x00FC, 1 }, { 0x01DB, 0x00DC, 0 }, { 0x01DC, 0x00FC, 0 }, { 0x01F4, 0x0047, 1 }, { 0x01F5, 0x0067, 1 }, { 0x01F8, 0x004E, 0 }, { 0x01F9, 0x006E, 0 }, { 0x01FA, 0x00C5, 1 }, { 0x01FB, 0x00E5, 1 }, { 0x01FC, 0x00C6, 1 }, { 0x01FD, 0x00E6, 1 }, { 0x01FE, 0x00D8, 1 }, { 0x01FF, 0x00F8, 1 }, { 0x02DC, 0x0020, 2 }, /* compatibility decomposition - for TCVN only */ { 0x0385, 0x00A5, 1 }, { 0x1E04, 0x0042, 4 }, { 0x1E05, 0x0062, 4 }, { 0x1E08, 0x00C7, 1 }, { 0x1E09, 0x00E7, 1 }, { 0x1E0C, 0x0044, 4 }, { 0x1E0D, 0x0064, 4 }, { 0x1E24, 0x0048, 4 }, { 0x1E25, 0x0068, 4 }, { 0x1E2E, 0x00CF, 1 }, { 0x1E2F, 0x00EF, 1 }, { 0x1E30, 0x004B, 1 }, { 0x1E31, 0x006B, 1 }, { 0x1E32, 0x004B, 4 }, { 0x1E33, 0x006B, 4 }, { 0x1E36, 0x004C, 4 }, { 0x1E37, 0x006C, 4 }, { 0x1E3E, 0x004D, 1 }, { 0x1E3F, 0x006D, 1 }, { 0x1E42, 0x004D, 4 }, { 0x1E43, 0x006D, 4 }, { 0x1E46, 0x004E, 4 }, { 0x1E47, 0x006E, 4 }, { 0x1E4C, 0x00D3, 2 }, /*{ 0x1E4C, 0x00D5, 1 },*/ /*{ 0x1E4C, 0x004F, 1, 2 },*/ { 0x1E4D, 0x00F3, 2 }, /*{ 0x1E4D, 0x00F5, 1 },*/ /*{ 0x1E4D, 0x006F, 1, 2 },*/ { 0x1E4E, 0x00D6, 2 }, { 0x1E4F, 0x00F6, 2 }, { 0x1E54, 0x0050, 1 }, { 0x1E55, 0x0070, 1 }, { 0x1E5A, 0x0052, 4 }, { 0x1E5B, 0x0072, 4 }, { 0x1E62, 0x0053, 4 }, { 0x1E63, 0x0073, 4 }, { 0x1E6C, 0x0054, 4 }, { 0x1E6D, 0x0074, 4 }, { 0x1E78, 0x00DA, 2 }, /*{ 0x1E78, 0x0168, 1 },*/ /*{ 0x1E78, 0x0055, 1, 2 },*/ { 0x1E79, 0x00FA, 2 }, /*{ 0x1E79, 0x0169, 1 },*/ /*{ 0x1E79, 0x0075, 1, 2 },*/ { 0x1E7C, 0x0056, 2 }, { 0x1E7D, 0x0076, 2 }, { 0x1E7E, 0x0056, 4 }, { 0x1E7F, 0x0076, 4 }, { 0x1E80, 0x0057, 0 }, { 0x1E81, 0x0077, 0 }, { 0x1E82, 0x0057, 1 }, { 0x1E83, 0x0077, 1 }, { 0x1E88, 0x0057, 4 }, { 0x1E89, 0x0077, 4 }, { 0x1E92, 0x005A, 4 }, { 0x1E93, 0x007A, 4 }, { 0x1EA0, 0x0041, 4 }, { 0x1EA1, 0x0061, 4 }, { 0x1EA2, 0x0041, 3 }, { 0x1EA3, 0x0061, 3 }, { 0x1EA4, 0x00C2, 1 }, { 0x1EA5, 0x00E2, 1 }, { 0x1EA6, 0x00C2, 0 }, { 0x1EA7, 0x00E2, 0 }, { 0x1EA8, 0x00C2, 3 }, { 0x1EA9, 0x00E2, 3 }, { 0x1EAA, 0x00C2, 2 }, { 0x1EAB, 0x00E2, 2 }, { 0x1EAC, 0x00C2, 4 }, { 0x1EAD, 0x00E2, 4 }, { 0x1EAE, 0x0102, 1 }, { 0x1EAF, 0x0103, 1 }, { 0x1EB0, 0x0102, 0 }, { 0x1EB1, 0x0103, 0 }, { 0x1EB2, 0x0102, 3 }, { 0x1EB3, 0x0103, 3 }, { 0x1EB4, 0x0102, 2 }, { 0x1EB5, 0x0103, 2 }, { 0x1EB6, 0x0102, 4 }, { 0x1EB7, 0x0103, 4 }, { 0x1EB8, 0x0045, 4 }, { 0x1EB9, 0x0065, 4 }, { 0x1EBA, 0x0045, 3 }, { 0x1EBB, 0x0065, 3 }, { 0x1EBC, 0x0045, 2 }, { 0x1EBD, 0x0065, 2 }, { 0x1EBE, 0x00CA, 1 }, { 0x1EBF, 0x00EA, 1 }, { 0x1EC0, 0x00CA, 0 }, { 0x1EC1, 0x00EA, 0 }, { 0x1EC2, 0x00CA, 3 }, { 0x1EC3, 0x00EA, 3 }, { 0x1EC4, 0x00CA, 2 }, { 0x1EC5, 0x00EA, 2 }, { 0x1EC6, 0x00CA, 4 }, { 0x1EC7, 0x00EA, 4 }, { 0x1EC8, 0x0049, 3 }, { 0x1EC9, 0x0069, 3 }, { 0x1ECA, 0x0049, 4 }, { 0x1ECB, 0x0069, 4 }, { 0x1ECC, 0x004F, 4 }, { 0x1ECD, 0x006F, 4 }, { 0x1ECE, 0x004F, 3 }, { 0x1ECF, 0x006F, 3 }, { 0x1ED0, 0x00D4, 1 }, { 0x1ED1, 0x00F4, 1 }, { 0x1ED2, 0x00D4, 0 }, { 0x1ED3, 0x00F4, 0 }, { 0x1ED4, 0x00D4, 3 }, { 0x1ED5, 0x00F4, 3 }, { 0x1ED6, 0x00D4, 2 }, { 0x1ED7, 0x00F4, 2 }, { 0x1ED8, 0x00D4, 4 }, { 0x1ED9, 0x00F4, 4 }, { 0x1EDA, 0x01A0, 1 }, { 0x1EDB, 0x01A1, 1 }, { 0x1EDC, 0x01A0, 0 }, { 0x1EDD, 0x01A1, 0 }, { 0x1EDE, 0x01A0, 3 }, { 0x1EDF, 0x01A1, 3 }, { 0x1EE0, 0x01A0, 2 }, { 0x1EE1, 0x01A1, 2 }, { 0x1EE2, 0x01A0, 4 }, { 0x1EE3, 0x01A1, 4 }, { 0x1EE4, 0x0055, 4 }, { 0x1EE5, 0x0075, 4 }, { 0x1EE6, 0x0055, 3 }, { 0x1EE7, 0x0075, 3 }, { 0x1EE8, 0x01AF, 1 }, { 0x1EE9, 0x01B0, 1 }, { 0x1EEA, 0x01AF, 0 }, { 0x1EEB, 0x01B0, 0 }, { 0x1EEC, 0x01AF, 3 }, { 0x1EED, 0x01B0, 3 }, { 0x1EEE, 0x01AF, 2 }, { 0x1EEF, 0x01B0, 2 }, { 0x1EF0, 0x01AF, 4 }, { 0x1EF1, 0x01B0, 4 }, { 0x1EF2, 0x0059, 0 }, { 0x1EF3, 0x0079, 0 }, { 0x1EF4, 0x0059, 4 }, { 0x1EF5, 0x0079, 4 }, { 0x1EF6, 0x0059, 3 }, { 0x1EF7, 0x0079, 3 }, { 0x1EF8, 0x0059, 2 }, { 0x1EF9, 0x0079, 2 }, { 0x1FED, 0x00A8, 0 }, { 0x1FEE, 0x00A8, 1 }, }; #endif /* _VIETCOMB_H */ fldigi-3.21.80/src/libtiniconv/encdec/cp1255.h0000664000175000017500000003175312313064025015473 00000000000000/* * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1255 */ #include "flushwc.h" /* Combining characters used in Hebrew encoding CP1255. */ /* Relevant combining characters: 0x05b4, 0x05b7, 0x05b8, 0x05b9, 0x05bc, 0x05bf, 0x05c1, 0x05c2. */ /* Composition tables for each of the relevant combining characters. */ static const struct { unsigned short base; unsigned short composed; } cp1255_comp_table_data[] = { #define cp1255_comp_table05b4_idx 0 #define cp1255_comp_table05b4_len 1 { 0x05D9, 0xFB1D }, #define cp1255_comp_table05b7_idx (cp1255_comp_table05b4_idx+cp1255_comp_table05b4_len) #define cp1255_comp_table05b7_len 2 { 0x05D0, 0xFB2E }, { 0x05F2, 0xFB1F }, #define cp1255_comp_table05b8_idx (cp1255_comp_table05b7_idx+cp1255_comp_table05b7_len) #define cp1255_comp_table05b8_len 1 { 0x05D0, 0xFB2F }, #define cp1255_comp_table05b9_idx (cp1255_comp_table05b8_idx+cp1255_comp_table05b8_len) #define cp1255_comp_table05b9_len 1 { 0x05D5, 0xFB4B }, #define cp1255_comp_table05bc_idx (cp1255_comp_table05b9_idx+cp1255_comp_table05b9_len) #define cp1255_comp_table05bc_len 24 { 0x05D0, 0xFB30 }, { 0x05D1, 0xFB31 }, { 0x05D2, 0xFB32 }, { 0x05D3, 0xFB33 }, { 0x05D4, 0xFB34 }, { 0x05D5, 0xFB35 }, { 0x05D6, 0xFB36 }, { 0x05D8, 0xFB38 }, { 0x05D9, 0xFB39 }, { 0x05DA, 0xFB3A }, { 0x05DB, 0xFB3B }, { 0x05DC, 0xFB3C }, { 0x05DE, 0xFB3E }, { 0x05E0, 0xFB40 }, { 0x05E1, 0xFB41 }, { 0x05E3, 0xFB43 }, { 0x05E4, 0xFB44 }, { 0x05E6, 0xFB46 }, { 0x05E7, 0xFB47 }, { 0x05E8, 0xFB48 }, { 0x05E9, 0xFB49 }, { 0x05EA, 0xFB4A }, { 0xFB2A, 0xFB2C }, { 0xFB2B, 0xFB2D }, #define cp1255_comp_table05bf_idx (cp1255_comp_table05bc_idx+cp1255_comp_table05bc_len) #define cp1255_comp_table05bf_len 3 { 0x05D1, 0xFB4C }, { 0x05DB, 0xFB4D }, { 0x05E4, 0xFB4E }, #define cp1255_comp_table05c1_idx (cp1255_comp_table05bf_idx+cp1255_comp_table05bf_len) #define cp1255_comp_table05c1_len 2 { 0x05E9, 0xFB2A }, { 0xFB49, 0xFB2C }, #define cp1255_comp_table05c2_idx (cp1255_comp_table05c1_idx+cp1255_comp_table05c1_len) #define cp1255_comp_table05c2_len 2 { 0x05E9, 0xFB2B }, { 0xFB49, 0xFB2D }, }; static const struct { unsigned int len; unsigned int idx; } cp1255_comp_table[] = { { cp1255_comp_table05b4_len, cp1255_comp_table05b4_idx }, { cp1255_comp_table05b7_len, cp1255_comp_table05b7_idx }, { cp1255_comp_table05b8_len, cp1255_comp_table05b8_idx }, { cp1255_comp_table05b9_len, cp1255_comp_table05b9_idx }, { cp1255_comp_table05bc_len, cp1255_comp_table05bc_idx }, { cp1255_comp_table05bf_len, cp1255_comp_table05bf_idx }, { cp1255_comp_table05c1_len, cp1255_comp_table05c1_idx }, { cp1255_comp_table05c2_len, cp1255_comp_table05c2_idx }, }; /* Decomposition table for the relevant Unicode characters. */ struct cp1255_decomp { unsigned short composed; unsigned short base; int comb1 : 8; signed int comb2 : 8; }; static const struct cp1255_decomp cp1255_decomp_table[] = { { 0xFB1D, 0x05D9, 0, -1 }, { 0xFB1F, 0x05F2, 1, -1 }, { 0xFB2A, 0x05E9, 6, -1 }, { 0xFB2B, 0x05E9, 7, -1 }, { 0xFB2C, 0x05E9, 4, 6 }, { 0xFB2D, 0x05E9, 4, 7 }, { 0xFB2E, 0x05D0, 1, -1 }, { 0xFB2F, 0x05D0, 2, -1 }, { 0xFB30, 0x05D0, 4, -1 }, { 0xFB31, 0x05D1, 4, -1 }, { 0xFB32, 0x05D2, 4, -1 }, { 0xFB33, 0x05D3, 4, -1 }, { 0xFB34, 0x05D4, 4, -1 }, { 0xFB35, 0x05D5, 4, -1 }, { 0xFB36, 0x05D6, 4, -1 }, { 0xFB38, 0x05D8, 4, -1 }, { 0xFB39, 0x05D9, 4, -1 }, { 0xFB3A, 0x05DA, 4, -1 }, { 0xFB3B, 0x05DB, 4, -1 }, { 0xFB3C, 0x05DC, 4, -1 }, { 0xFB3E, 0x05DE, 4, -1 }, { 0xFB40, 0x05E0, 4, -1 }, { 0xFB41, 0x05E1, 4, -1 }, { 0xFB43, 0x05E3, 4, -1 }, { 0xFB44, 0x05E4, 4, -1 }, { 0xFB46, 0x05E6, 4, -1 }, { 0xFB47, 0x05E7, 4, -1 }, { 0xFB48, 0x05E8, 4, -1 }, { 0xFB49, 0x05E9, 4, -1 }, { 0xFB4A, 0x05EA, 4, -1 }, { 0xFB4B, 0x05D5, 3, -1 }, { 0xFB4C, 0x05D1, 5, -1 }, { 0xFB4D, 0x05DB, 5, -1 }, { 0xFB4E, 0x05E4, 5, -1 }, }; static const unsigned char cp1255_comb_table[] = { 0xc4, 0xc7, 0xc8, 0xc9, 0xcc, 0xcf, 0xd1, 0xd2, }; static const unsigned short cp1255_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20aa, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, /* 0xc0 */ 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, 0x05b8, 0x05b9, 0xfffd, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf, /* 0xd0 */ 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05f0, 0x05f1, 0x05f2, 0x05f3, 0x05f4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xe0 */ 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0xf0 */ 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd, }; /* In the CP1255 to Unicode direction, the state contains a buffered character, or 0 if none. */ static int cp1255_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; unsigned short wc; unsigned short last_wc; if (c < 0x80) { wc = c; } else { wc = cp1255_2uni[c-0x80]; if (wc == 0xfffd) return RET_ILSEQ; } last_wc = conv->istate; if (last_wc) { if (wc >= 0x05b0 && wc < 0x05c5) { /* See whether last_wc and wc can be combined. */ unsigned int k; unsigned int i1, i2; switch (wc) { case 0x05b4: k = 0; break; case 0x05b7: k = 1; break; case 0x05b8: k = 2; break; case 0x05b9: k = 3; break; case 0x05bc: k = 4; break; case 0x05bf: k = 5; break; case 0x05c1: k = 6; break; case 0x05c2: k = 7; break; default: goto not_combining; } i1 = cp1255_comp_table[k].idx; i2 = i1 + cp1255_comp_table[k].len-1; if (last_wc >= cp1255_comp_table_data[i1].base && last_wc <= cp1255_comp_table_data[i2].base) { unsigned int i; for (;;) { i = (i1+i2)>>1; if (last_wc == cp1255_comp_table_data[i].base) break; if (last_wc < cp1255_comp_table_data[i].base) { if (i1 == i) goto not_combining; i2 = i; } else { if (i1 != i) i1 = i; else { i = i2; if (last_wc == cp1255_comp_table_data[i].base) break; goto not_combining; } } } last_wc = cp1255_comp_table_data[i].composed; if (last_wc == 0xfb2a || last_wc == 0xfb2b || last_wc == 0xfb49) { /* Buffer the combined character. */ conv->istate = last_wc; return RET_TOOFEW(1); } else { /* Output the combined character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 1; } } } not_combining: /* Output the buffered character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 0; /* Don't advance the input pointer. */ } if ((wc >= 0x05d0 && wc <= 0x05ea && ((0x07db5f7f >> (wc - 0x05d0)) & 1)) || wc == 0x05f2) { /* wc is a possible match in cp1255_comp_table_data. Buffer it. */ conv->istate = wc; return RET_TOOFEW(1); } else { /* Output wc immediately. */ *pwc = (ucs4_t) wc; return 1; } } #define cp1255_flushwc normal_flushwc static const unsigned char cp1255_page00[88] = { 0xa0, 0xa1, 0xa2, 0xa3, 0x00, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, /* 0xf0-0xf7 */ }; static const unsigned char cp1255_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1255_page05[72] = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xb0-0xb7 */ 0xc8, 0xc9, 0x00, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xb8-0xbf */ 0xd0, 0xd1, 0xd2, 0xd3, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xd0-0xd7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xd8-0xdf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xe0-0xe7 */ 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ }; static const unsigned char cp1255_page20[56] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfe, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1255_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = cp1255_page00[wc-0x00a0]; else if (wc == 0x0192) c = 0x83; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1255_page02[wc-0x02c0]; else if (wc >= 0x05b0 && wc < 0x05f8) c = cp1255_page05[wc-0x05b0]; else if (wc >= 0x2008 && wc < 0x2040) c = cp1255_page20[wc-0x2008]; else if (wc == 0x20aa) c = 0xa4; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } /* Try canonical decomposition. */ { /* Binary search through cp1255_decomp_table. */ unsigned int i1 = 0; unsigned int i2 = sizeof(cp1255_decomp_table)/sizeof(cp1255_decomp_table[0])-1; if (wc >= cp1255_decomp_table[i1].composed && wc <= cp1255_decomp_table[i2].composed) { unsigned int i; for (;;) { /* Here i2 - i1 > 0. */ i = (i1+i2)>>1; if (wc == cp1255_decomp_table[i].composed) break; if (wc < cp1255_decomp_table[i].composed) { if (i1 == i) return RET_ILUNI; /* Here i1 < i < i2. */ i2 = i; } else { /* Here i1 <= i < i2. */ if (i1 != i) i1 = i; else { /* Here i2 - i1 = 1. */ i = i2; if (wc == cp1255_decomp_table[i].composed) break; else return RET_ILUNI; } } } /* Found a canonical decomposition. */ wc = cp1255_decomp_table[i].base; /* wc is one of 0x05d0..0x05d6, 0x05d8..0x05dc, 0x05de, 0x05e0..0x05e1, 0x05e3..0x05e4, 0x05e6..0x05ea, 0x05f2. */ c = cp1255_page05[wc-0x05b0]; if (cp1255_decomp_table[i].comb2 < 0) { if (n < 2) return RET_TOOSMALL; r[0] = c; r[1] = cp1255_comb_table[cp1255_decomp_table[i].comb1]; return 2; } else { if (n < 3) return RET_TOOSMALL; r[0] = c; r[1] = cp1255_comb_table[cp1255_decomp_table[i].comb1]; r[2] = cp1255_comb_table[cp1255_decomp_table[i].comb2]; return 3; } } } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/jisx0201.h0000664000175000017500000000330712313064025016026 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * JISX0201.1976-0 */ static int jisx0201_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { if (c == 0x5c) *pwc = (ucs4_t) 0x00a5; else if (c == 0x7e) *pwc = (ucs4_t) 0x203e; else *pwc = (ucs4_t) c; return 1; } else { if (c >= 0xa1 && c < 0xe0) { *pwc = (ucs4_t) c + 0xfec0; return 1; } } return RET_ILSEQ; } static int jisx0201_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0080 && !(wc == 0x005c || wc == 0x007e)) { *r = wc; return 1; } if (wc == 0x00a5) { *r = 0x5c; return 1; } if (wc == 0x203e) { *r = 0x7e; return 1; } if (wc >= 0xff61 && wc < 0xffa0) { *r = wc - 0xfec0; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/cp1258.h0000664000175000017500000002450212313064025015470 00000000000000/* * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1258 */ #include "flushwc.h" #include "vietcomb.h" static const unsigned char cp1258_comb_table[] = { 0xcc, 0xec, 0xde, 0xd2, 0xf2, }; /* The possible bases in viet_comp_table_data: 0x0041..0x0045, 0x0047..0x0049, 0x004B..0x0050, 0x0052..0x0057, 0x0059..0x005A, 0x0061..0x0065, 0x0067..0x0069, 0x006B..0x0070, 0x0072..0x0077, 0x0079..0x007A, 0x00A5, 0x00A8, 0x00C2, 0x00C5..0x00C7, 0x00CA, 0x00CF, 0x00D3..0x00D4, 0x00D6, 0x00D8, 0x00DA, 0x00DC, 0x00E2, 0x00E5..0x00E7, 0x00EA, 0x00EF, 0x00F3..0x00F4, 0x00F6, 0x00F8, 0x00FA, 0x00FC, 0x0102..0x0103, 0x01A0..0x01A1, 0x01AF..0x01B0. */ static const unsigned int cp1258_comp_bases[] = { 0x06fdfbbe, 0x06fdfbbe, 0x00000000, 0x00000120, 0x155884e4, 0x155884e4, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00018003 }; static const unsigned short cp1258_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0xfffd, 0x2039, 0x0152, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0xfffd, 0x203a, 0x0153, 0xfffd, 0xfffd, 0x0178, /* 0xa0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x0300, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x0110, 0x00d1, 0x0309, 0x00d3, 0x00d4, 0x01a0, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x01af, 0x0303, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0301, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x0111, 0x00f1, 0x0323, 0x00f3, 0x00f4, 0x01a1, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x01b0, 0x20ab, 0x00ff, }; /* In the CP1258 to Unicode direction, the state contains a buffered character, or 0 if none. */ static int cp1258_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; unsigned short wc; unsigned short last_wc; if (c < 0x80) { wc = c; } else { wc = cp1258_2uni[c-0x80]; if (wc == 0xfffd) return RET_ILSEQ; } last_wc = conv->istate; if (last_wc) { if (wc >= 0x0300 && wc < 0x0340) { /* See whether last_wc and wc can be combined. */ unsigned int k = 0; unsigned int i1, i2; switch (wc) { case 0x0300: k = 0; break; case 0x0301: k = 1; break; case 0x0303: k = 2; break; case 0x0309: k = 3; break; case 0x0323: k = 4; break; default: abort(); } i1 = viet_comp_table[k].idx; i2 = i1 + viet_comp_table[k].len-1; if (last_wc >= viet_comp_table_data[i1].base && last_wc <= viet_comp_table_data[i2].base) { unsigned int i; for (;;) { i = (i1+i2)>>1; if (last_wc == viet_comp_table_data[i].base) break; if (last_wc < viet_comp_table_data[i].base) { if (i1 == i) goto not_combining; i2 = i; } else { if (i1 != i) i1 = i; else { i = i2; if (last_wc == viet_comp_table_data[i].base) break; goto not_combining; } } } last_wc = viet_comp_table_data[i].composed; /* Output the combined character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 1; } } not_combining: /* Output the buffered character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 0; /* Don't advance the input pointer. */ } if (wc >= 0x0041 && wc <= 0x01b0 && ((cp1258_comp_bases[(wc - 0x0040) >> 5] >> (wc & 0x1f)) & 1)) { /* wc is a possible match in viet_comp_table_data. Buffer it. */ conv->istate = wc; return RET_TOOFEW(1); } else { /* Output wc immediately. */ *pwc = (ucs4_t) wc; return 1; } } #define cp1258_flushwc normal_flushwc static const unsigned char cp1258_page00[88] = { 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0xd1, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ }; static const unsigned char cp1258_page01[104] = { 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xd5, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, /* 0xa8-0xaf */ 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ }; static const unsigned char cp1258_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1258_page03[40] = { 0xcc, 0xec, 0x00, 0xde, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char cp1258_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1258_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = wc; else if (wc >= 0x00c0 && wc < 0x0118) c = cp1258_page00[wc-0x00c0]; else if (wc >= 0x0150 && wc < 0x01b8) c = cp1258_page01[wc-0x0150]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1258_page02[wc-0x02c0]; else if (wc >= 0x0300 && wc < 0x0328) c = cp1258_page03[wc-0x0300]; else if (wc >= 0x0340 && wc < 0x0342) /* deprecated Vietnamese tone marks */ c = cp1258_page03[wc-0x0340]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1258_page20[wc-0x2010]; else if (wc == 0x20ab) c = 0xfe; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } /* Try canonical decomposition. */ { /* Binary search through viet_decomp_table. */ unsigned int i1 = 0; unsigned int i2 = sizeof(viet_decomp_table)/sizeof(viet_decomp_table[0])-1; if (wc >= viet_decomp_table[i1].composed && wc <= viet_decomp_table[i2].composed) { unsigned int i; for (;;) { /* Here i2 - i1 > 0. */ i = (i1+i2)>>1; if (wc == viet_decomp_table[i].composed) break; if (wc < viet_decomp_table[i].composed) { if (i1 == i) return RET_ILUNI; /* Here i1 < i < i2. */ i2 = i; } else { /* Here i1 <= i < i2. */ if (i1 != i) i1 = i; else { /* Here i2 - i1 = 1. */ i = i2; if (wc == viet_decomp_table[i].composed) break; else return RET_ILUNI; } } } /* Found a canonical decomposition. */ wc = viet_decomp_table[i].base; /* wc is one of 0x0020, 0x0041..0x005a, 0x0061..0x007a, 0x00a5, 0x00a8, 0x00c2, 0x00c5..0x00c7, 0x00ca, 0x00cf, 0x00d3, 0x00d4, 0x00d6, 0x00d8, 0x00da, 0x00dc, 0x00e2, 0x00e5..0x00e7, 0x00ea, 0x00ef, 0x00f3, 0x00f4, 0x00f6, 0x00f8, 0x00fc, 0x0102, 0x0103, 0x01a0, 0x01a1, 0x01af, 0x01b0. */ if (wc < 0x0100) c = wc; else if (wc < 0x0118) c = cp1258_page00[wc-0x00c0]; else c = cp1258_page01[wc-0x0150]; if (n < 2) return RET_TOOSMALL; r[0] = c; r[1] = cp1258_comb_table[viet_decomp_table[i].comb1]; return 2; } } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/encdec/big5.h0000664000175000017500000077755512313064025015423 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * BIG5 */ static const unsigned short big5_2uni_pagea1[6121] = { /* 0xa1 */ 0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2022, 0xff1b, 0xff1a, 0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xff64, 0xfe52, 0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2013, 0xfe31, 0x2014, 0xfe33, 0xfffd, 0xfe34, 0xfe4f, 0xff08, 0xff09, 0xfe35, 0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39, 0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d, 0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41, 0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d, 0x301e, 0x2035, 0x2032, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7, 0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, 0x32a3, 0x2105, 0x203e, 0xfffd, 0xff3f, 0xfffd, 0xfe49, 0xfe4a, 0xfe4d, 0xfe4e, 0xfe4b, 0xfe4c, 0xfe5f, 0xfe60, 0xfe61, 0xff0b, 0xff0d, 0x00d7, 0x00f7, 0x00b1, 0x221a, 0xff1c, 0xff1e, 0xff1d, 0x2266, 0x2267, 0x2260, 0x221e, 0x2252, 0x2261, 0xfe62, 0xfe63, 0xfe64, 0xfe65, 0xfe66, 0x223c, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf, 0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642, 0x2641, 0x2609, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xfffd, /* 0xa2 */ 0xfffd, 0xff0f, 0xff3c, 0xff04, 0x00a5, 0x3012, 0x00a2, 0x00a3, 0xff05, 0xff20, 0x2103, 0x2109, 0xfe69, 0xfe6a, 0xfe6b, 0x33d5, 0x339c, 0x339d, 0x339e, 0x33ce, 0x33a1, 0x338e, 0x338f, 0x33c4, 0x00b0, 0x5159, 0x515b, 0x515e, 0x515d, 0x5161, 0x5163, 0x55e7, 0x74e9, 0x7cce, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258f, 0x258e, 0x258d, 0x258c, 0x258b, 0x258a, 0x2589, 0x253c, 0x2534, 0x252c, 0x2524, 0x251c, 0x2594, 0x2500, 0x2502, 0x2595, 0x250c, 0x2510, 0x2514, 0x2518, 0x256d, 0x256e, 0x2570, 0x256f, 0x2550, 0x255e, 0x256a, 0x2561, 0x25e2, 0x25e3, 0x25e5, 0x25e4, 0x2571, 0x2572, 0x2573, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0xfffd, 0x5344, 0xfffd, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, /* 0xa3 */ 0xff57, 0xff58, 0xff59, 0xff5a, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x02d9, 0x02c9, 0x02ca, 0x02c7, 0x02cb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa4 */ 0x4e00, 0x4e59, 0x4e01, 0x4e03, 0x4e43, 0x4e5d, 0x4e86, 0x4e8c, 0x4eba, 0x513f, 0x5165, 0x516b, 0x51e0, 0x5200, 0x5201, 0x529b, 0x5315, 0x5341, 0x535c, 0x53c8, 0x4e09, 0x4e0b, 0x4e08, 0x4e0a, 0x4e2b, 0x4e38, 0x51e1, 0x4e45, 0x4e48, 0x4e5f, 0x4e5e, 0x4e8e, 0x4ea1, 0x5140, 0x5203, 0x52fa, 0x5343, 0x53c9, 0x53e3, 0x571f, 0x58eb, 0x5915, 0x5927, 0x5973, 0x5b50, 0x5b51, 0x5b53, 0x5bf8, 0x5c0f, 0x5c22, 0x5c38, 0x5c71, 0x5ddd, 0x5de5, 0x5df1, 0x5df2, 0x5df3, 0x5dfe, 0x5e72, 0x5efe, 0x5f0b, 0x5f13, 0x624d, 0x4e11, 0x4e10, 0x4e0d, 0x4e2d, 0x4e30, 0x4e39, 0x4e4b, 0x5c39, 0x4e88, 0x4e91, 0x4e95, 0x4e92, 0x4e94, 0x4ea2, 0x4ec1, 0x4ec0, 0x4ec3, 0x4ec6, 0x4ec7, 0x4ecd, 0x4eca, 0x4ecb, 0x4ec4, 0x5143, 0x5141, 0x5167, 0x516d, 0x516e, 0x516c, 0x5197, 0x51f6, 0x5206, 0x5207, 0x5208, 0x52fb, 0x52fe, 0x52ff, 0x5316, 0x5339, 0x5348, 0x5347, 0x5345, 0x535e, 0x5384, 0x53cb, 0x53ca, 0x53cd, 0x58ec, 0x5929, 0x592b, 0x592a, 0x592d, 0x5b54, 0x5c11, 0x5c24, 0x5c3a, 0x5c6f, 0x5df4, 0x5e7b, 0x5eff, 0x5f14, 0x5f15, 0x5fc3, 0x6208, 0x6236, 0x624b, 0x624e, 0x652f, 0x6587, 0x6597, 0x65a4, 0x65b9, 0x65e5, 0x66f0, 0x6708, 0x6728, 0x6b20, 0x6b62, 0x6b79, 0x6bcb, 0x6bd4, 0x6bdb, 0x6c0f, 0x6c34, 0x706b, 0x722a, 0x7236, 0x723b, 0x7247, 0x7259, 0x725b, 0x72ac, 0x738b, 0x4e19, /* 0xa5 */ 0x4e16, 0x4e15, 0x4e14, 0x4e18, 0x4e3b, 0x4e4d, 0x4e4f, 0x4e4e, 0x4ee5, 0x4ed8, 0x4ed4, 0x4ed5, 0x4ed6, 0x4ed7, 0x4ee3, 0x4ee4, 0x4ed9, 0x4ede, 0x5145, 0x5144, 0x5189, 0x518a, 0x51ac, 0x51f9, 0x51fa, 0x51f8, 0x520a, 0x52a0, 0x529f, 0x5305, 0x5306, 0x5317, 0x531d, 0x4edf, 0x534a, 0x5349, 0x5361, 0x5360, 0x536f, 0x536e, 0x53bb, 0x53ef, 0x53e4, 0x53f3, 0x53ec, 0x53ee, 0x53e9, 0x53e8, 0x53fc, 0x53f8, 0x53f5, 0x53eb, 0x53e6, 0x53ea, 0x53f2, 0x53f1, 0x53f0, 0x53e5, 0x53ed, 0x53fb, 0x56db, 0x56da, 0x5916, 0x592e, 0x5931, 0x5974, 0x5976, 0x5b55, 0x5b83, 0x5c3c, 0x5de8, 0x5de7, 0x5de6, 0x5e02, 0x5e03, 0x5e73, 0x5e7c, 0x5f01, 0x5f18, 0x5f17, 0x5fc5, 0x620a, 0x6253, 0x6254, 0x6252, 0x6251, 0x65a5, 0x65e6, 0x672e, 0x672c, 0x672a, 0x672b, 0x672d, 0x6b63, 0x6bcd, 0x6c11, 0x6c10, 0x6c38, 0x6c41, 0x6c40, 0x6c3e, 0x72af, 0x7384, 0x7389, 0x74dc, 0x74e6, 0x7518, 0x751f, 0x7528, 0x7529, 0x7530, 0x7531, 0x7532, 0x7533, 0x758b, 0x767d, 0x76ae, 0x76bf, 0x76ee, 0x77db, 0x77e2, 0x77f3, 0x793a, 0x79be, 0x7a74, 0x7acb, 0x4e1e, 0x4e1f, 0x4e52, 0x4e53, 0x4e69, 0x4e99, 0x4ea4, 0x4ea6, 0x4ea5, 0x4eff, 0x4f09, 0x4f19, 0x4f0a, 0x4f15, 0x4f0d, 0x4f10, 0x4f11, 0x4f0f, 0x4ef2, 0x4ef6, 0x4efb, 0x4ef0, 0x4ef3, 0x4efd, 0x4f01, 0x4f0b, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, /* 0xa6 */ 0x5171, 0x518d, 0x51b0, 0x5217, 0x5211, 0x5212, 0x520e, 0x5216, 0x52a3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540f, 0x540c, 0x540a, 0x5410, 0x5401, 0x540b, 0x5404, 0x5411, 0x540d, 0x5408, 0x5403, 0x540e, 0x5406, 0x5412, 0x56e0, 0x56de, 0x56dd, 0x5733, 0x5730, 0x5728, 0x572d, 0x572c, 0x572f, 0x5729, 0x5919, 0x591a, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597d, 0x5979, 0x5982, 0x5981, 0x5b57, 0x5b58, 0x5b87, 0x5b88, 0x5b85, 0x5b89, 0x5bfa, 0x5c16, 0x5c79, 0x5dde, 0x5e06, 0x5e76, 0x5e74, 0x5f0f, 0x5f1b, 0x5fd9, 0x5fd6, 0x620e, 0x620c, 0x620d, 0x6210, 0x6263, 0x625b, 0x6258, 0x6536, 0x65e9, 0x65e8, 0x65ec, 0x65ed, 0x66f2, 0x66f3, 0x6709, 0x673d, 0x6734, 0x6731, 0x6735, 0x6b21, 0x6b64, 0x6b7b, 0x6c16, 0x6c5d, 0x6c57, 0x6c59, 0x6c5f, 0x6c60, 0x6c50, 0x6c55, 0x6c61, 0x6c5b, 0x6c4d, 0x6c4e, 0x7070, 0x725f, 0x725d, 0x767e, 0x7af9, 0x7c73, 0x7cf8, 0x7f36, 0x7f8a, 0x7fbd, 0x8001, 0x8003, 0x800c, 0x8012, 0x8033, 0x807f, 0x8089, 0x808b, 0x808c, 0x81e3, 0x81ea, 0x81f3, 0x81fc, 0x820c, 0x821b, 0x821f, 0x826e, 0x8272, 0x827e, 0x866b, 0x8840, 0x884c, 0x8863, 0x897f, 0x9621, 0x4e32, 0x4ea8, 0x4f4d, 0x4f4f, 0x4f47, 0x4f57, 0x4f5e, 0x4f34, 0x4f5b, 0x4f55, 0x4f30, 0x4f50, 0x4f51, 0x4f3d, 0x4f3a, 0x4f38, 0x4f43, 0x4f54, 0x4f3c, 0x4f46, 0x4f63, /* 0xa7 */ 0x4f5c, 0x4f60, 0x4f2f, 0x4f4e, 0x4f36, 0x4f59, 0x4f5d, 0x4f48, 0x4f5a, 0x514c, 0x514b, 0x514d, 0x5175, 0x51b6, 0x51b7, 0x5225, 0x5224, 0x5229, 0x522a, 0x5228, 0x52ab, 0x52a9, 0x52aa, 0x52ac, 0x5323, 0x5373, 0x5375, 0x541d, 0x542d, 0x541e, 0x543e, 0x5426, 0x544e, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541b, 0x5429, 0x544a, 0x5439, 0x543b, 0x5438, 0x542e, 0x5435, 0x5436, 0x5420, 0x543c, 0x5440, 0x5431, 0x542b, 0x541f, 0x542c, 0x56ea, 0x56f0, 0x56e4, 0x56eb, 0x574a, 0x5751, 0x5740, 0x574d, 0x5747, 0x574e, 0x573e, 0x5750, 0x574f, 0x573b, 0x58ef, 0x593e, 0x599d, 0x5992, 0x59a8, 0x599e, 0x59a3, 0x5999, 0x5996, 0x598d, 0x59a4, 0x5993, 0x598a, 0x59a5, 0x5b5d, 0x5b5c, 0x5b5a, 0x5b5b, 0x5b8c, 0x5b8b, 0x5b8f, 0x5c2c, 0x5c40, 0x5c41, 0x5c3f, 0x5c3e, 0x5c90, 0x5c91, 0x5c94, 0x5c8c, 0x5deb, 0x5e0c, 0x5e8f, 0x5e87, 0x5e8a, 0x5ef7, 0x5f04, 0x5f1f, 0x5f64, 0x5f62, 0x5f77, 0x5f79, 0x5fd8, 0x5fcc, 0x5fd7, 0x5fcd, 0x5ff1, 0x5feb, 0x5ff8, 0x5fea, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626d, 0x628a, 0x627c, 0x627e, 0x6279, 0x6273, 0x6292, 0x626f, 0x6298, 0x626e, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, 0x653b, 0x6538, 0x65f1, 0x66f4, 0x675f, 0x674e, 0x674f, 0x6750, 0x6751, 0x675c, 0x6756, 0x675e, 0x6749, 0x6746, 0x6760, /* 0xa8 */ 0x6753, 0x6757, 0x6b65, 0x6bcf, 0x6c42, 0x6c5e, 0x6c99, 0x6c81, 0x6c88, 0x6c89, 0x6c85, 0x6c9b, 0x6c6a, 0x6c7a, 0x6c90, 0x6c70, 0x6c8c, 0x6c68, 0x6c96, 0x6c92, 0x6c7d, 0x6c83, 0x6c72, 0x6c7e, 0x6c74, 0x6c86, 0x6c76, 0x6c8d, 0x6c94, 0x6c98, 0x6c82, 0x7076, 0x707c, 0x707d, 0x7078, 0x7262, 0x7261, 0x7260, 0x72c4, 0x72c2, 0x7396, 0x752c, 0x752b, 0x7537, 0x7538, 0x7682, 0x76ef, 0x77e3, 0x79c1, 0x79c0, 0x79bf, 0x7a76, 0x7cfb, 0x7f55, 0x8096, 0x8093, 0x809d, 0x8098, 0x809b, 0x809a, 0x80b2, 0x826f, 0x8292, 0x828b, 0x828d, 0x898b, 0x89d2, 0x8a00, 0x8c37, 0x8c46, 0x8c55, 0x8c9d, 0x8d64, 0x8d70, 0x8db3, 0x8eab, 0x8eca, 0x8f9b, 0x8fb0, 0x8fc2, 0x8fc6, 0x8fc5, 0x8fc4, 0x5de1, 0x9091, 0x90a2, 0x90aa, 0x90a6, 0x90a3, 0x9149, 0x91c6, 0x91cc, 0x9632, 0x962e, 0x9631, 0x962a, 0x962c, 0x4e26, 0x4e56, 0x4e73, 0x4e8b, 0x4e9b, 0x4e9e, 0x4eab, 0x4eac, 0x4f6f, 0x4f9d, 0x4f8d, 0x4f73, 0x4f7f, 0x4f6c, 0x4f9b, 0x4f8b, 0x4f86, 0x4f83, 0x4f70, 0x4f75, 0x4f88, 0x4f69, 0x4f7b, 0x4f96, 0x4f7e, 0x4f8f, 0x4f91, 0x4f7a, 0x5154, 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51bd, 0x51fd, 0x523b, 0x5238, 0x5237, 0x523a, 0x5230, 0x522e, 0x5236, 0x5241, 0x52be, 0x52bb, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379, 0x53d6, 0x53d4, 0x53d7, 0x5473, 0x5475, /* 0xa9 */ 0x5496, 0x5478, 0x5495, 0x5480, 0x547b, 0x5477, 0x5484, 0x5492, 0x5486, 0x547c, 0x5490, 0x5471, 0x5476, 0x548c, 0x549a, 0x5462, 0x5468, 0x548b, 0x547d, 0x548e, 0x56fa, 0x5783, 0x5777, 0x576a, 0x5769, 0x5761, 0x5766, 0x5764, 0x577c, 0x591c, 0x5949, 0x5947, 0x5948, 0x5944, 0x5954, 0x59be, 0x59bb, 0x59d4, 0x59b9, 0x59ae, 0x59d1, 0x59c6, 0x59d0, 0x59cd, 0x59cb, 0x59d3, 0x59ca, 0x59af, 0x59b3, 0x59d2, 0x59c5, 0x5b5f, 0x5b64, 0x5b63, 0x5b97, 0x5b9a, 0x5b98, 0x5b9c, 0x5b99, 0x5b9b, 0x5c1a, 0x5c48, 0x5c45, 0x5c46, 0x5cb7, 0x5ca1, 0x5cb8, 0x5ca9, 0x5cab, 0x5cb1, 0x5cb3, 0x5e18, 0x5e1a, 0x5e16, 0x5e15, 0x5e1b, 0x5e11, 0x5e78, 0x5e9a, 0x5e97, 0x5e9c, 0x5e95, 0x5e96, 0x5ef6, 0x5f26, 0x5f27, 0x5f29, 0x5f80, 0x5f81, 0x5f7f, 0x5f7c, 0x5fdd, 0x5fe0, 0x5ffd, 0x5ff5, 0x5fff, 0x600f, 0x6014, 0x602f, 0x6035, 0x6016, 0x602a, 0x6015, 0x6021, 0x6027, 0x6029, 0x602b, 0x601b, 0x6216, 0x6215, 0x623f, 0x623e, 0x6240, 0x627f, 0x62c9, 0x62cc, 0x62c4, 0x62bf, 0x62c2, 0x62b9, 0x62d2, 0x62db, 0x62ab, 0x62d3, 0x62d4, 0x62cb, 0x62c8, 0x62a8, 0x62bd, 0x62bc, 0x62d0, 0x62d9, 0x62c7, 0x62cd, 0x62b5, 0x62da, 0x62b1, 0x62d8, 0x62d6, 0x62d7, 0x62c6, 0x62ac, 0x62ce, 0x653e, 0x65a7, 0x65bc, 0x65fa, 0x6614, 0x6613, 0x660c, 0x6606, 0x6602, 0x660e, 0x6600, 0x660f, 0x6615, 0x660a, /* 0xaa */ 0x6607, 0x670d, 0x670b, 0x676d, 0x678b, 0x6795, 0x6771, 0x679c, 0x6773, 0x6777, 0x6787, 0x679d, 0x6797, 0x676f, 0x6770, 0x677f, 0x6789, 0x677e, 0x6790, 0x6775, 0x679a, 0x6793, 0x677c, 0x676a, 0x6772, 0x6b23, 0x6b66, 0x6b67, 0x6b7f, 0x6c13, 0x6c1b, 0x6ce3, 0x6ce8, 0x6cf3, 0x6cb1, 0x6ccc, 0x6ce5, 0x6cb3, 0x6cbd, 0x6cbe, 0x6cbc, 0x6ce2, 0x6cab, 0x6cd5, 0x6cd3, 0x6cb8, 0x6cc4, 0x6cb9, 0x6cc1, 0x6cae, 0x6cd7, 0x6cc5, 0x6cf1, 0x6cbf, 0x6cbb, 0x6ce1, 0x6cdb, 0x6cca, 0x6cac, 0x6cef, 0x6cdc, 0x6cd6, 0x6ce0, 0x7095, 0x708e, 0x7092, 0x708a, 0x7099, 0x722c, 0x722d, 0x7238, 0x7248, 0x7267, 0x7269, 0x72c0, 0x72ce, 0x72d9, 0x72d7, 0x72d0, 0x73a9, 0x73a8, 0x739f, 0x73ab, 0x73a5, 0x753d, 0x759d, 0x7599, 0x759a, 0x7684, 0x76c2, 0x76f2, 0x76f4, 0x77e5, 0x77fd, 0x793e, 0x7940, 0x7941, 0x79c9, 0x79c8, 0x7a7a, 0x7a79, 0x7afa, 0x7cfe, 0x7f54, 0x7f8c, 0x7f8b, 0x8005, 0x80ba, 0x80a5, 0x80a2, 0x80b1, 0x80a1, 0x80ab, 0x80a9, 0x80b4, 0x80aa, 0x80af, 0x81e5, 0x81fe, 0x820d, 0x82b3, 0x829d, 0x8299, 0x82ad, 0x82bd, 0x829f, 0x82b9, 0x82b1, 0x82ac, 0x82a5, 0x82af, 0x82b8, 0x82a3, 0x82b0, 0x82be, 0x82b7, 0x864e, 0x8671, 0x521d, 0x8868, 0x8ecb, 0x8fce, 0x8fd4, 0x8fd1, 0x90b5, 0x90b8, 0x90b1, 0x90b6, 0x91c7, 0x91d1, 0x9577, 0x9580, 0x961c, 0x9640, 0x963f, 0x963b, 0x9644, /* 0xab */ 0x9642, 0x96b9, 0x96e8, 0x9752, 0x975e, 0x4e9f, 0x4ead, 0x4eae, 0x4fe1, 0x4fb5, 0x4faf, 0x4fbf, 0x4fe0, 0x4fd1, 0x4fcf, 0x4fdd, 0x4fc3, 0x4fb6, 0x4fd8, 0x4fdf, 0x4fca, 0x4fd7, 0x4fae, 0x4fd0, 0x4fc4, 0x4fc2, 0x4fda, 0x4fce, 0x4fde, 0x4fb7, 0x5157, 0x5192, 0x5191, 0x51a0, 0x524e, 0x5243, 0x524a, 0x524d, 0x524c, 0x524b, 0x5247, 0x52c7, 0x52c9, 0x52c3, 0x52c1, 0x530d, 0x5357, 0x537b, 0x539a, 0x53db, 0x54ac, 0x54c0, 0x54a8, 0x54ce, 0x54c9, 0x54b8, 0x54a6, 0x54b3, 0x54c7, 0x54c2, 0x54bd, 0x54aa, 0x54c1, 0x54c4, 0x54c8, 0x54af, 0x54ab, 0x54b1, 0x54bb, 0x54a9, 0x54a7, 0x54bf, 0x56ff, 0x5782, 0x578b, 0x57a0, 0x57a3, 0x57a2, 0x57ce, 0x57ae, 0x5793, 0x5955, 0x5951, 0x594f, 0x594e, 0x5950, 0x59dc, 0x59d8, 0x59ff, 0x59e3, 0x59e8, 0x5a03, 0x59e5, 0x59ea, 0x59da, 0x59e6, 0x5a01, 0x59fb, 0x5b69, 0x5ba3, 0x5ba6, 0x5ba4, 0x5ba2, 0x5ba5, 0x5c01, 0x5c4e, 0x5c4f, 0x5c4d, 0x5c4b, 0x5cd9, 0x5cd2, 0x5df7, 0x5e1d, 0x5e25, 0x5e1f, 0x5e7d, 0x5ea0, 0x5ea6, 0x5efa, 0x5f08, 0x5f2d, 0x5f65, 0x5f88, 0x5f85, 0x5f8a, 0x5f8b, 0x5f87, 0x5f8c, 0x5f89, 0x6012, 0x601d, 0x6020, 0x6025, 0x600e, 0x6028, 0x604d, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606c, 0x606b, 0x606a, 0x6064, 0x6241, 0x62dc, 0x6316, 0x6309, 0x62fc, 0x62ed, 0x6301, 0x62ee, 0x62fd, 0x6307, 0x62f1, 0x62f7, /* 0xac */ 0x62ef, 0x62ec, 0x62fe, 0x62f4, 0x6311, 0x6302, 0x653f, 0x6545, 0x65ab, 0x65bd, 0x65e2, 0x6625, 0x662d, 0x6620, 0x6627, 0x662f, 0x661f, 0x6628, 0x6631, 0x6624, 0x66f7, 0x67ff, 0x67d3, 0x67f1, 0x67d4, 0x67d0, 0x67ec, 0x67b6, 0x67af, 0x67f5, 0x67e9, 0x67ef, 0x67c4, 0x67d1, 0x67b4, 0x67da, 0x67e5, 0x67b8, 0x67cf, 0x67de, 0x67f3, 0x67b0, 0x67d9, 0x67e2, 0x67dd, 0x67d2, 0x6b6a, 0x6b83, 0x6b86, 0x6bb5, 0x6bd2, 0x6bd7, 0x6c1f, 0x6cc9, 0x6d0b, 0x6d32, 0x6d2a, 0x6d41, 0x6d25, 0x6d0c, 0x6d31, 0x6d1e, 0x6d17, 0x6d3b, 0x6d3d, 0x6d3e, 0x6d36, 0x6d1b, 0x6cf5, 0x6d39, 0x6d27, 0x6d38, 0x6d29, 0x6d2e, 0x6d35, 0x6d0e, 0x6d2b, 0x70ab, 0x70ba, 0x70b3, 0x70ac, 0x70af, 0x70ad, 0x70b8, 0x70ae, 0x70a4, 0x7230, 0x7272, 0x726f, 0x7274, 0x72e9, 0x72e0, 0x72e1, 0x73b7, 0x73ca, 0x73bb, 0x73b2, 0x73cd, 0x73c0, 0x73b3, 0x751a, 0x752d, 0x754f, 0x754c, 0x754e, 0x754b, 0x75ab, 0x75a4, 0x75a5, 0x75a2, 0x75a3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76c8, 0x76c6, 0x76c3, 0x76c5, 0x7701, 0x76f9, 0x76f8, 0x7709, 0x770b, 0x76fe, 0x76fc, 0x7707, 0x77dc, 0x7802, 0x7814, 0x780c, 0x780d, 0x7946, 0x7949, 0x7948, 0x7947, 0x79b9, 0x79ba, 0x79d1, 0x79d2, 0x79cb, 0x7a7f, 0x7a81, 0x7aff, 0x7afd, 0x7c7d, 0x7d02, 0x7d05, 0x7d00, 0x7d09, 0x7d07, 0x7d04, 0x7d06, 0x7f38, 0x7f8e, 0x7fbf, 0x8004, /* 0xad */ 0x8010, 0x800d, 0x8011, 0x8036, 0x80d6, 0x80e5, 0x80da, 0x80c3, 0x80c4, 0x80cc, 0x80e1, 0x80db, 0x80ce, 0x80de, 0x80e4, 0x80dd, 0x81f4, 0x8222, 0x82e7, 0x8303, 0x8305, 0x82e3, 0x82db, 0x82e6, 0x8304, 0x82e5, 0x8302, 0x8309, 0x82d2, 0x82d7, 0x82f1, 0x8301, 0x82dc, 0x82d4, 0x82d1, 0x82de, 0x82d3, 0x82df, 0x82ef, 0x8306, 0x8650, 0x8679, 0x867b, 0x867a, 0x884d, 0x886b, 0x8981, 0x89d4, 0x8a08, 0x8a02, 0x8a03, 0x8c9e, 0x8ca0, 0x8d74, 0x8d73, 0x8db4, 0x8ecd, 0x8ecc, 0x8ff0, 0x8fe6, 0x8fe2, 0x8fea, 0x8fe5, 0x8fed, 0x8feb, 0x8fe4, 0x8fe8, 0x90ca, 0x90ce, 0x90c1, 0x90c3, 0x914b, 0x914a, 0x91cd, 0x9582, 0x9650, 0x964b, 0x964c, 0x964d, 0x9762, 0x9769, 0x97cb, 0x97ed, 0x97f3, 0x9801, 0x98a8, 0x98db, 0x98df, 0x9996, 0x9999, 0x4e58, 0x4eb3, 0x500c, 0x500d, 0x5023, 0x4fef, 0x5026, 0x5025, 0x4ff8, 0x5029, 0x5016, 0x5006, 0x503c, 0x501f, 0x501a, 0x5012, 0x5011, 0x4ffa, 0x5000, 0x5014, 0x5028, 0x4ff1, 0x5021, 0x500b, 0x5019, 0x5018, 0x4ff3, 0x4fee, 0x502d, 0x502a, 0x4ffe, 0x502b, 0x5009, 0x517c, 0x51a4, 0x51a5, 0x51a2, 0x51cd, 0x51cc, 0x51c6, 0x51cb, 0x5256, 0x525c, 0x5254, 0x525b, 0x525d, 0x532a, 0x537f, 0x539f, 0x539d, 0x53df, 0x54e8, 0x5510, 0x5501, 0x5537, 0x54fc, 0x54e5, 0x54f2, 0x5506, 0x54fa, 0x5514, 0x54e9, 0x54ed, 0x54e1, 0x5509, 0x54ee, 0x54ea, /* 0xae */ 0x54e6, 0x5527, 0x5507, 0x54fd, 0x550f, 0x5703, 0x5704, 0x57c2, 0x57d4, 0x57cb, 0x57c3, 0x5809, 0x590f, 0x5957, 0x5958, 0x595a, 0x5a11, 0x5a18, 0x5a1c, 0x5a1f, 0x5a1b, 0x5a13, 0x59ec, 0x5a20, 0x5a23, 0x5a29, 0x5a25, 0x5a0c, 0x5a09, 0x5b6b, 0x5c58, 0x5bb0, 0x5bb3, 0x5bb6, 0x5bb4, 0x5bae, 0x5bb5, 0x5bb9, 0x5bb8, 0x5c04, 0x5c51, 0x5c55, 0x5c50, 0x5ced, 0x5cfd, 0x5cfb, 0x5cea, 0x5ce8, 0x5cf0, 0x5cf6, 0x5d01, 0x5cf4, 0x5dee, 0x5e2d, 0x5e2b, 0x5eab, 0x5ead, 0x5ea7, 0x5f31, 0x5f92, 0x5f91, 0x5f90, 0x6059, 0x6063, 0x6065, 0x6050, 0x6055, 0x606d, 0x6069, 0x606f, 0x6084, 0x609f, 0x609a, 0x608d, 0x6094, 0x608c, 0x6085, 0x6096, 0x6247, 0x62f3, 0x6308, 0x62ff, 0x634e, 0x633e, 0x632f, 0x6355, 0x6342, 0x6346, 0x634f, 0x6349, 0x633a, 0x6350, 0x633d, 0x632a, 0x632b, 0x6328, 0x634d, 0x634c, 0x6548, 0x6549, 0x6599, 0x65c1, 0x65c5, 0x6642, 0x6649, 0x664f, 0x6643, 0x6652, 0x664c, 0x6645, 0x6641, 0x66f8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68b3, 0x6817, 0x684c, 0x6851, 0x683d, 0x67f4, 0x6850, 0x6840, 0x683c, 0x6843, 0x682a, 0x6845, 0x6813, 0x6818, 0x6841, 0x6b8a, 0x6b89, 0x6bb7, 0x6c23, 0x6c27, 0x6c28, 0x6c26, 0x6c24, 0x6cf0, 0x6d6a, 0x6d95, 0x6d88, 0x6d87, 0x6d66, 0x6d78, 0x6d77, 0x6d59, 0x6d93, /* 0xaf */ 0x6d6c, 0x6d89, 0x6d6e, 0x6d5a, 0x6d74, 0x6d69, 0x6d8c, 0x6d8a, 0x6d79, 0x6d85, 0x6d65, 0x6d94, 0x70ca, 0x70d8, 0x70e4, 0x70d9, 0x70c8, 0x70cf, 0x7239, 0x7279, 0x72fc, 0x72f9, 0x72fd, 0x72f8, 0x72f7, 0x7386, 0x73ed, 0x7409, 0x73ee, 0x73e0, 0x73ea, 0x73de, 0x7554, 0x755d, 0x755c, 0x755a, 0x7559, 0x75be, 0x75c5, 0x75c7, 0x75b2, 0x75b3, 0x75bd, 0x75bc, 0x75b9, 0x75c2, 0x75b8, 0x768b, 0x76b0, 0x76ca, 0x76cd, 0x76ce, 0x7729, 0x771f, 0x7720, 0x7728, 0x77e9, 0x7830, 0x7827, 0x7838, 0x781d, 0x7834, 0x7837, 0x7825, 0x782d, 0x7820, 0x781f, 0x7832, 0x7955, 0x7950, 0x7960, 0x795f, 0x7956, 0x795e, 0x795d, 0x7957, 0x795a, 0x79e4, 0x79e3, 0x79e7, 0x79df, 0x79e6, 0x79e9, 0x79d8, 0x7a84, 0x7a88, 0x7ad9, 0x7b06, 0x7b11, 0x7c89, 0x7d21, 0x7d17, 0x7d0b, 0x7d0a, 0x7d20, 0x7d22, 0x7d14, 0x7d10, 0x7d15, 0x7d1a, 0x7d1c, 0x7d0d, 0x7d19, 0x7d1b, 0x7f3a, 0x7f5f, 0x7f94, 0x7fc5, 0x7fc1, 0x8006, 0x8018, 0x8015, 0x8019, 0x8017, 0x803d, 0x803f, 0x80f1, 0x8102, 0x80f0, 0x8105, 0x80ed, 0x80f4, 0x8106, 0x80f8, 0x80f3, 0x8108, 0x80fd, 0x810a, 0x80fc, 0x80ef, 0x81ed, 0x81ec, 0x8200, 0x8210, 0x822a, 0x822b, 0x8228, 0x822c, 0x82bb, 0x832b, 0x8352, 0x8354, 0x834a, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834f, 0x8332, 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, /* 0xb0 */ 0x8654, 0x868a, 0x86aa, 0x8693, 0x86a4, 0x86a9, 0x868c, 0x86a3, 0x869c, 0x8870, 0x8877, 0x8881, 0x8882, 0x887d, 0x8879, 0x8a18, 0x8a10, 0x8a0e, 0x8a0c, 0x8a15, 0x8a0a, 0x8a17, 0x8a13, 0x8a16, 0x8a0f, 0x8a11, 0x8c48, 0x8c7a, 0x8c79, 0x8ca1, 0x8ca2, 0x8d77, 0x8eac, 0x8ed2, 0x8ed4, 0x8ecf, 0x8fb1, 0x9001, 0x9006, 0x8ff7, 0x9000, 0x8ffa, 0x8ff4, 0x9003, 0x8ffd, 0x9005, 0x8ff8, 0x9095, 0x90e1, 0x90dd, 0x90e2, 0x9152, 0x914d, 0x914c, 0x91d8, 0x91dd, 0x91d7, 0x91dc, 0x91d9, 0x9583, 0x9662, 0x9663, 0x9661, 0x965b, 0x965d, 0x9664, 0x9658, 0x965e, 0x96bb, 0x98e2, 0x99ac, 0x9aa8, 0x9ad8, 0x9b25, 0x9b32, 0x9b3c, 0x4e7e, 0x507a, 0x507d, 0x505c, 0x5047, 0x5043, 0x504c, 0x505a, 0x5049, 0x5065, 0x5076, 0x504e, 0x5055, 0x5075, 0x5074, 0x5077, 0x504f, 0x500f, 0x506f, 0x506d, 0x515c, 0x5195, 0x51f0, 0x526a, 0x526f, 0x52d2, 0x52d9, 0x52d8, 0x52d5, 0x5310, 0x530f, 0x5319, 0x533f, 0x5340, 0x533e, 0x53c3, 0x66fc, 0x5546, 0x556a, 0x5566, 0x5544, 0x555e, 0x5561, 0x5543, 0x554a, 0x5531, 0x5556, 0x554f, 0x5555, 0x552f, 0x5564, 0x5538, 0x552e, 0x555c, 0x552c, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, 0x570b, 0x5709, 0x57df, 0x5805, 0x580a, 0x5806, 0x57e0, 0x57e4, 0x57fa, 0x5802, 0x5835, 0x57f7, 0x57f9, 0x5920, 0x5962, 0x5a36, 0x5a41, 0x5a49, 0x5a66, 0x5a6a, 0x5a40, /* 0xb1 */ 0x5a3c, 0x5a62, 0x5a5a, 0x5a46, 0x5a4a, 0x5b70, 0x5bc7, 0x5bc5, 0x5bc4, 0x5bc2, 0x5bbf, 0x5bc6, 0x5c09, 0x5c08, 0x5c07, 0x5c60, 0x5c5c, 0x5c5d, 0x5d07, 0x5d06, 0x5d0e, 0x5d1b, 0x5d16, 0x5d22, 0x5d11, 0x5d29, 0x5d14, 0x5d19, 0x5d24, 0x5d27, 0x5d17, 0x5de2, 0x5e38, 0x5e36, 0x5e33, 0x5e37, 0x5eb7, 0x5eb8, 0x5eb6, 0x5eb5, 0x5ebe, 0x5f35, 0x5f37, 0x5f57, 0x5f6c, 0x5f69, 0x5f6b, 0x5f97, 0x5f99, 0x5f9e, 0x5f98, 0x5fa1, 0x5fa0, 0x5f9c, 0x607f, 0x60a3, 0x6089, 0x60a0, 0x60a8, 0x60cb, 0x60b4, 0x60e6, 0x60bd, 0x60c5, 0x60bb, 0x60b5, 0x60dc, 0x60bc, 0x60d8, 0x60d5, 0x60c6, 0x60df, 0x60b8, 0x60da, 0x60c7, 0x621a, 0x621b, 0x6248, 0x63a0, 0x63a7, 0x6372, 0x6396, 0x63a2, 0x63a5, 0x6377, 0x6367, 0x6398, 0x63aa, 0x6371, 0x63a9, 0x6389, 0x6383, 0x639b, 0x636b, 0x63a8, 0x6384, 0x6388, 0x6399, 0x63a1, 0x63ac, 0x6392, 0x638f, 0x6380, 0x637b, 0x6369, 0x6368, 0x637a, 0x655d, 0x6556, 0x6551, 0x6559, 0x6557, 0x555f, 0x654f, 0x6558, 0x6555, 0x6554, 0x659c, 0x659b, 0x65ac, 0x65cf, 0x65cb, 0x65cc, 0x65ce, 0x665d, 0x665a, 0x6664, 0x6668, 0x6666, 0x665e, 0x66f9, 0x52d7, 0x671b, 0x6881, 0x68af, 0x68a2, 0x6893, 0x68b5, 0x687f, 0x6876, 0x68b1, 0x68a7, 0x6897, 0x68b0, 0x6883, 0x68c4, 0x68ad, 0x6886, 0x6885, 0x6894, 0x689d, 0x68a8, 0x689f, 0x68a1, 0x6882, 0x6b32, 0x6bba, /* 0xb2 */ 0x6beb, 0x6bec, 0x6c2b, 0x6d8e, 0x6dbc, 0x6df3, 0x6dd9, 0x6db2, 0x6de1, 0x6dcc, 0x6de4, 0x6dfb, 0x6dfa, 0x6e05, 0x6dc7, 0x6dcb, 0x6daf, 0x6dd1, 0x6dae, 0x6dde, 0x6df9, 0x6db8, 0x6df7, 0x6df5, 0x6dc5, 0x6dd2, 0x6e1a, 0x6db5, 0x6dda, 0x6deb, 0x6dd8, 0x6dea, 0x6df1, 0x6dee, 0x6de8, 0x6dc6, 0x6dc4, 0x6daa, 0x6dec, 0x6dbf, 0x6de6, 0x70f9, 0x7109, 0x710a, 0x70fd, 0x70ef, 0x723d, 0x727d, 0x7281, 0x731c, 0x731b, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, 0x740a, 0x7403, 0x7406, 0x73fe, 0x740d, 0x74e0, 0x74f6, 0x74f7, 0x751c, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758f, 0x75d4, 0x75d5, 0x75b5, 0x75ca, 0x75cd, 0x768e, 0x76d4, 0x76d2, 0x76db, 0x7737, 0x773e, 0x773c, 0x7736, 0x7738, 0x773a, 0x786b, 0x7843, 0x784e, 0x7965, 0x7968, 0x796d, 0x79fb, 0x7a92, 0x7a95, 0x7b20, 0x7b28, 0x7b1b, 0x7b2c, 0x7b26, 0x7b19, 0x7b1e, 0x7b2e, 0x7c92, 0x7c97, 0x7c95, 0x7d46, 0x7d43, 0x7d71, 0x7d2e, 0x7d39, 0x7d3c, 0x7d40, 0x7d30, 0x7d33, 0x7d44, 0x7d2f, 0x7d42, 0x7d32, 0x7d31, 0x7f3d, 0x7f9e, 0x7f9a, 0x7fcc, 0x7fce, 0x7fd2, 0x801c, 0x804a, 0x8046, 0x812f, 0x8116, 0x8123, 0x812b, 0x8129, 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838e, 0x839e, 0x8398, 0x8378, 0x83a2, 0x8396, 0x83bd, 0x83ab, 0x8392, 0x838a, 0x8393, 0x8389, 0x83a0, 0x8377, 0x837b, 0x837c, /* 0xb3 */ 0x8386, 0x83a7, 0x8655, 0x5f6a, 0x86c7, 0x86c0, 0x86b6, 0x86c4, 0x86b5, 0x86c6, 0x86cb, 0x86b1, 0x86af, 0x86c9, 0x8853, 0x889e, 0x8888, 0x88ab, 0x8892, 0x8896, 0x888d, 0x888b, 0x8993, 0x898f, 0x8a2a, 0x8a1d, 0x8a23, 0x8a25, 0x8a31, 0x8a2d, 0x8a1f, 0x8a1b, 0x8a22, 0x8c49, 0x8c5a, 0x8ca9, 0x8cac, 0x8cab, 0x8ca8, 0x8caa, 0x8ca7, 0x8d67, 0x8d66, 0x8dbe, 0x8dba, 0x8edb, 0x8edf, 0x9019, 0x900d, 0x901a, 0x9017, 0x9023, 0x901f, 0x901d, 0x9010, 0x9015, 0x901e, 0x9020, 0x900f, 0x9022, 0x9016, 0x901b, 0x9014, 0x90e8, 0x90ed, 0x90fd, 0x9157, 0x91ce, 0x91f5, 0x91e6, 0x91e3, 0x91e7, 0x91ed, 0x91e9, 0x9589, 0x966a, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966c, 0x96c0, 0x96ea, 0x96e9, 0x7ae0, 0x7adf, 0x9802, 0x9803, 0x9b5a, 0x9ce5, 0x9e75, 0x9e7f, 0x9ea5, 0x9ebb, 0x50a2, 0x508d, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, 0x509a, 0x6700, 0x51f1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52de, 0x52dd, 0x52db, 0x535a, 0x53a5, 0x557b, 0x5580, 0x55a7, 0x557c, 0x558a, 0x559d, 0x5598, 0x5582, 0x559c, 0x55aa, 0x5594, 0x5587, 0x558b, 0x5583, 0x55b3, 0x55ae, 0x559f, 0x553e, 0x55b2, 0x559a, 0x55bb, 0x55ac, 0x55b1, 0x557e, 0x5589, 0x55ab, 0x5599, 0x570d, 0x582f, 0x582a, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581d, 0x5820, 0x58f9, 0x58fa, 0x5960, /* 0xb4 */ 0x5a77, 0x5a9a, 0x5a7f, 0x5a92, 0x5a9b, 0x5aa7, 0x5b73, 0x5b71, 0x5bd2, 0x5bcc, 0x5bd3, 0x5bd0, 0x5c0a, 0x5c0b, 0x5c31, 0x5d4c, 0x5d50, 0x5d34, 0x5d47, 0x5dfd, 0x5e45, 0x5e3d, 0x5e40, 0x5e43, 0x5e7e, 0x5eca, 0x5ec1, 0x5ec2, 0x5ec4, 0x5f3c, 0x5f6d, 0x5fa9, 0x5faa, 0x5fa8, 0x60d1, 0x60e1, 0x60b2, 0x60b6, 0x60e0, 0x611c, 0x6123, 0x60fa, 0x6115, 0x60f0, 0x60fb, 0x60f4, 0x6168, 0x60f1, 0x610e, 0x60f6, 0x6109, 0x6100, 0x6112, 0x621f, 0x6249, 0x63a3, 0x638c, 0x63cf, 0x63c0, 0x63e9, 0x63c9, 0x63c6, 0x63cd, 0x63d2, 0x63e3, 0x63d0, 0x63e1, 0x63d6, 0x63ed, 0x63ee, 0x6376, 0x63f4, 0x63ea, 0x63db, 0x6452, 0x63da, 0x63f9, 0x655e, 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65af, 0x666e, 0x6670, 0x6674, 0x6676, 0x666f, 0x6691, 0x667a, 0x667e, 0x6677, 0x66fe, 0x66ff, 0x671f, 0x671d, 0x68fa, 0x68d5, 0x68e0, 0x68d8, 0x68d7, 0x6905, 0x68df, 0x68f5, 0x68ee, 0x68e7, 0x68f9, 0x68d2, 0x68f2, 0x68e3, 0x68cb, 0x68cd, 0x690d, 0x6912, 0x690e, 0x68c9, 0x68da, 0x696e, 0x68fb, 0x6b3e, 0x6b3a, 0x6b3d, 0x6b98, 0x6b96, 0x6bbc, 0x6bef, 0x6c2e, 0x6c2f, 0x6c2c, 0x6e2f, 0x6e38, 0x6e54, 0x6e21, 0x6e32, 0x6e67, 0x6e4a, 0x6e20, 0x6e25, 0x6e23, 0x6e1b, 0x6e5b, 0x6e58, 0x6e24, 0x6e56, 0x6e6e, 0x6e2d, 0x6e26, 0x6e6f, 0x6e34, 0x6e4d, 0x6e3a, 0x6e2c, 0x6e43, 0x6e1d, 0x6e3e, 0x6ecb, /* 0xb5 */ 0x6e89, 0x6e19, 0x6e4e, 0x6e63, 0x6e44, 0x6e72, 0x6e69, 0x6e5f, 0x7119, 0x711a, 0x7126, 0x7130, 0x7121, 0x7136, 0x716e, 0x711c, 0x724c, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743a, 0x742a, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742f, 0x741b, 0x7426, 0x7428, 0x7525, 0x7526, 0x756b, 0x756a, 0x75e2, 0x75db, 0x75e3, 0x75d9, 0x75d8, 0x75de, 0x75e0, 0x767b, 0x767c, 0x7696, 0x7693, 0x76b4, 0x76dc, 0x774f, 0x77ed, 0x785d, 0x786c, 0x786f, 0x7a0d, 0x7a08, 0x7a0b, 0x7a05, 0x7a00, 0x7a98, 0x7a97, 0x7a96, 0x7ae5, 0x7ae3, 0x7b49, 0x7b56, 0x7b46, 0x7b50, 0x7b52, 0x7b54, 0x7b4d, 0x7b4b, 0x7b4f, 0x7b51, 0x7c9f, 0x7ca5, 0x7d5e, 0x7d50, 0x7d68, 0x7d55, 0x7d2b, 0x7d6e, 0x7d72, 0x7d61, 0x7d66, 0x7d62, 0x7d70, 0x7d73, 0x5584, 0x7fd4, 0x7fd5, 0x800b, 0x8052, 0x8085, 0x8155, 0x8154, 0x814b, 0x8151, 0x814e, 0x8139, 0x8146, 0x813e, 0x814c, 0x8153, 0x8174, 0x8212, 0x821c, 0x83e9, 0x8403, 0x83f8, 0x840d, 0x83e0, 0x83c5, 0x840b, 0x83c1, 0x83ef, 0x83f1, 0x83f4, 0x8457, 0x840a, 0x83f0, 0x840c, 0x83cc, 0x83fd, 0x83f2, 0x83ca, 0x8438, 0x840e, 0x8404, 0x83dc, 0x8407, 0x83d4, 0x83df, 0x865b, 0x86df, 0x86d9, 0x86ed, 0x86d4, 0x86db, 0x86e4, 0x86d0, 0x86de, 0x8857, 0x88c1, 0x88c2, 0x88b1, 0x8983, 0x8996, 0x8a3b, 0x8a60, 0x8a55, 0x8a5e, 0x8a3c, 0x8a41, /* 0xb6 */ 0x8a54, 0x8a5b, 0x8a50, 0x8a46, 0x8a34, 0x8a3a, 0x8a36, 0x8a56, 0x8c61, 0x8c82, 0x8caf, 0x8cbc, 0x8cb3, 0x8cbd, 0x8cc1, 0x8cbb, 0x8cc0, 0x8cb4, 0x8cb7, 0x8cb6, 0x8cbf, 0x8cb8, 0x8d8a, 0x8d85, 0x8d81, 0x8dce, 0x8ddd, 0x8dcb, 0x8dda, 0x8dd1, 0x8dcc, 0x8ddb, 0x8dc6, 0x8efb, 0x8ef8, 0x8efc, 0x8f9c, 0x902e, 0x9035, 0x9031, 0x9038, 0x9032, 0x9036, 0x9102, 0x90f5, 0x9109, 0x90fe, 0x9163, 0x9165, 0x91cf, 0x9214, 0x9215, 0x9223, 0x9209, 0x921e, 0x920d, 0x9210, 0x9207, 0x9211, 0x9594, 0x958f, 0x958b, 0x9591, 0x9593, 0x9592, 0x958e, 0x968a, 0x968e, 0x968b, 0x967d, 0x9685, 0x9686, 0x968d, 0x9672, 0x9684, 0x96c1, 0x96c5, 0x96c4, 0x96c6, 0x96c7, 0x96ef, 0x96f2, 0x97cc, 0x9805, 0x9806, 0x9808, 0x98e7, 0x98ea, 0x98ef, 0x98e9, 0x98f2, 0x98ed, 0x99ae, 0x99ad, 0x9ec3, 0x9ecd, 0x9ed1, 0x4e82, 0x50ad, 0x50b5, 0x50b2, 0x50b3, 0x50c5, 0x50be, 0x50ac, 0x50b7, 0x50bb, 0x50af, 0x50c7, 0x527f, 0x5277, 0x527d, 0x52df, 0x52e6, 0x52e4, 0x52e2, 0x52e3, 0x532f, 0x55df, 0x55e8, 0x55d3, 0x55e6, 0x55ce, 0x55dc, 0x55c7, 0x55d1, 0x55e3, 0x55e4, 0x55ef, 0x55da, 0x55e1, 0x55c5, 0x55c6, 0x55e5, 0x55c9, 0x5712, 0x5713, 0x585e, 0x5851, 0x5858, 0x5857, 0x585a, 0x5854, 0x586b, 0x584c, 0x586d, 0x584a, 0x5862, 0x5852, 0x584b, 0x5967, 0x5ac1, 0x5ac9, 0x5acc, 0x5abe, 0x5abd, 0x5abc, /* 0xb7 */ 0x5ab3, 0x5ac2, 0x5ab2, 0x5d69, 0x5d6f, 0x5e4c, 0x5e79, 0x5ec9, 0x5ec8, 0x5f12, 0x5f59, 0x5fac, 0x5fae, 0x611a, 0x610f, 0x6148, 0x611f, 0x60f3, 0x611b, 0x60f9, 0x6101, 0x6108, 0x614e, 0x614c, 0x6144, 0x614d, 0x613e, 0x6134, 0x6127, 0x610d, 0x6106, 0x6137, 0x6221, 0x6222, 0x6413, 0x643e, 0x641e, 0x642a, 0x642d, 0x643d, 0x642c, 0x640f, 0x641c, 0x6414, 0x640d, 0x6436, 0x6416, 0x6417, 0x6406, 0x656c, 0x659f, 0x65b0, 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, 0x6684, 0x6698, 0x668d, 0x6703, 0x6994, 0x696d, 0x695a, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, 0x694a, 0x6968, 0x696b, 0x695e, 0x6953, 0x6979, 0x6986, 0x695d, 0x6963, 0x695b, 0x6b47, 0x6b72, 0x6bc0, 0x6bbf, 0x6bd3, 0x6bfd, 0x6ea2, 0x6eaf, 0x6ed3, 0x6eb6, 0x6ec2, 0x6e90, 0x6e9d, 0x6ec7, 0x6ec5, 0x6ea5, 0x6e98, 0x6ebc, 0x6eba, 0x6eab, 0x6ed1, 0x6e96, 0x6e9c, 0x6ec4, 0x6ed4, 0x6eaa, 0x6ea7, 0x6eb4, 0x714e, 0x7159, 0x7169, 0x7164, 0x7149, 0x7167, 0x715c, 0x716c, 0x7166, 0x714c, 0x7165, 0x715e, 0x7146, 0x7168, 0x7156, 0x723a, 0x7252, 0x7337, 0x7345, 0x733f, 0x733e, 0x746f, 0x745a, 0x7455, 0x745f, 0x745e, 0x7441, 0x743f, 0x7459, 0x745b, 0x745c, 0x7576, 0x7578, 0x7600, 0x75f0, 0x7601, 0x75f2, 0x75f1, 0x75fa, 0x75ff, 0x75f4, 0x75f3, 0x76de, 0x76df, 0x775b, 0x776b, 0x7766, 0x775e, 0x7763, /* 0xb8 */ 0x7779, 0x776a, 0x776c, 0x775c, 0x7765, 0x7768, 0x7762, 0x77ee, 0x788e, 0x78b0, 0x7897, 0x7898, 0x788c, 0x7889, 0x787c, 0x7891, 0x7893, 0x787f, 0x797a, 0x797f, 0x7981, 0x842c, 0x79bd, 0x7a1c, 0x7a1a, 0x7a20, 0x7a14, 0x7a1f, 0x7a1e, 0x7a9f, 0x7aa0, 0x7b77, 0x7bc0, 0x7b60, 0x7b6e, 0x7b67, 0x7cb1, 0x7cb3, 0x7cb5, 0x7d93, 0x7d79, 0x7d91, 0x7d81, 0x7d8f, 0x7d5b, 0x7f6e, 0x7f69, 0x7f6a, 0x7f72, 0x7fa9, 0x7fa8, 0x7fa4, 0x8056, 0x8058, 0x8086, 0x8084, 0x8171, 0x8170, 0x8178, 0x8165, 0x816e, 0x8173, 0x816b, 0x8179, 0x817a, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843d, 0x8431, 0x8475, 0x8466, 0x846b, 0x8449, 0x846c, 0x845b, 0x843c, 0x8435, 0x8461, 0x8463, 0x8469, 0x846d, 0x8446, 0x865e, 0x865c, 0x865f, 0x86f9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86fe, 0x86fb, 0x8702, 0x8703, 0x8706, 0x870a, 0x8859, 0x88df, 0x88d4, 0x88d9, 0x88dc, 0x88d8, 0x88dd, 0x88e1, 0x88ca, 0x88d5, 0x88d2, 0x899c, 0x89e3, 0x8a6b, 0x8a72, 0x8a73, 0x8a66, 0x8a69, 0x8a70, 0x8a87, 0x8a7c, 0x8a63, 0x8aa0, 0x8a71, 0x8a85, 0x8a6d, 0x8a62, 0x8a6e, 0x8a6c, 0x8a79, 0x8a7b, 0x8a3e, 0x8a68, 0x8c62, 0x8c8a, 0x8c89, 0x8cca, 0x8cc7, 0x8cc8, 0x8cc4, 0x8cb2, 0x8cc3, 0x8cc2, 0x8cc5, 0x8de1, 0x8ddf, 0x8de8, 0x8def, 0x8df3, 0x8dfa, 0x8dea, 0x8de4, 0x8de6, 0x8eb2, 0x8f03, 0x8f09, 0x8efe, 0x8f0a, /* 0xb9 */ 0x8f9f, 0x8fb2, 0x904b, 0x904a, 0x9053, 0x9042, 0x9054, 0x903c, 0x9055, 0x9050, 0x9047, 0x904f, 0x904e, 0x904d, 0x9051, 0x903e, 0x9041, 0x9112, 0x9117, 0x916c, 0x916a, 0x9169, 0x91c9, 0x9237, 0x9257, 0x9238, 0x923d, 0x9240, 0x923e, 0x925b, 0x924b, 0x9264, 0x9251, 0x9234, 0x9249, 0x924d, 0x9245, 0x9239, 0x923f, 0x925a, 0x9598, 0x9698, 0x9694, 0x9695, 0x96cd, 0x96cb, 0x96c9, 0x96ca, 0x96f7, 0x96fb, 0x96f9, 0x96f6, 0x9756, 0x9774, 0x9776, 0x9810, 0x9811, 0x9813, 0x980a, 0x9812, 0x980c, 0x98fc, 0x98f4, 0x98fd, 0x98fe, 0x99b3, 0x99b1, 0x99b4, 0x9ae1, 0x9ce9, 0x9e82, 0x9f0e, 0x9f13, 0x9f20, 0x50e7, 0x50ee, 0x50e5, 0x50d6, 0x50ed, 0x50da, 0x50d5, 0x50cf, 0x50d1, 0x50f1, 0x50ce, 0x50e9, 0x5162, 0x51f3, 0x5283, 0x5282, 0x5331, 0x53ad, 0x55fe, 0x5600, 0x561b, 0x5617, 0x55fd, 0x5614, 0x5606, 0x5609, 0x560d, 0x560e, 0x55f7, 0x5616, 0x561f, 0x5608, 0x5610, 0x55f6, 0x5718, 0x5716, 0x5875, 0x587e, 0x5883, 0x5893, 0x588a, 0x5879, 0x5885, 0x587d, 0x58fd, 0x5925, 0x5922, 0x5924, 0x596a, 0x5969, 0x5ae1, 0x5ae6, 0x5ae9, 0x5ad7, 0x5ad6, 0x5ad8, 0x5ae3, 0x5b75, 0x5bde, 0x5be7, 0x5be1, 0x5be5, 0x5be6, 0x5be8, 0x5be2, 0x5be4, 0x5bdf, 0x5c0d, 0x5c62, 0x5d84, 0x5d87, 0x5e5b, 0x5e63, 0x5e55, 0x5e57, 0x5e54, 0x5ed3, 0x5ed6, 0x5f0a, 0x5f46, 0x5f70, 0x5fb9, 0x6147, /* 0xba */ 0x613f, 0x614b, 0x6177, 0x6162, 0x6163, 0x615f, 0x615a, 0x6158, 0x6175, 0x622a, 0x6487, 0x6458, 0x6454, 0x64a4, 0x6478, 0x645f, 0x647a, 0x6451, 0x6467, 0x6434, 0x646d, 0x647b, 0x6572, 0x65a1, 0x65d7, 0x65d6, 0x66a2, 0x66a8, 0x669d, 0x699c, 0x69a8, 0x6995, 0x69c1, 0x69ae, 0x69d3, 0x69cb, 0x699b, 0x69b7, 0x69bb, 0x69ab, 0x69b4, 0x69d0, 0x69cd, 0x69ad, 0x69cc, 0x69a6, 0x69c3, 0x69a3, 0x6b49, 0x6b4c, 0x6c33, 0x6f33, 0x6f14, 0x6efe, 0x6f13, 0x6ef4, 0x6f29, 0x6f3e, 0x6f20, 0x6f2c, 0x6f0f, 0x6f02, 0x6f22, 0x6eff, 0x6eef, 0x6f06, 0x6f31, 0x6f38, 0x6f32, 0x6f23, 0x6f15, 0x6f2b, 0x6f2f, 0x6f88, 0x6f2a, 0x6eec, 0x6f01, 0x6ef2, 0x6ecc, 0x6ef7, 0x7194, 0x7199, 0x717d, 0x718a, 0x7184, 0x7192, 0x723e, 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746a, 0x7470, 0x746d, 0x7504, 0x7591, 0x7627, 0x760d, 0x760b, 0x7609, 0x7613, 0x76e1, 0x76e3, 0x7784, 0x777d, 0x777f, 0x7761, 0x78c1, 0x789f, 0x78a7, 0x78b3, 0x78a9, 0x78a3, 0x798e, 0x798f, 0x798d, 0x7a2e, 0x7a31, 0x7aaa, 0x7aa9, 0x7aed, 0x7aef, 0x7ba1, 0x7b95, 0x7b8b, 0x7b75, 0x7b97, 0x7b9d, 0x7b94, 0x7b8f, 0x7bb8, 0x7b87, 0x7b84, 0x7cb9, 0x7cbd, 0x7cbe, 0x7dbb, 0x7db0, 0x7d9c, 0x7dbd, 0x7dbe, 0x7da0, 0x7dca, 0x7db4, 0x7db2, 0x7db1, 0x7dba, 0x7da2, 0x7dbf, 0x7db5, 0x7db8, 0x7dad, 0x7dd2, 0x7dc7, 0x7dac, /* 0xbb */ 0x7f70, 0x7fe0, 0x7fe1, 0x7fdf, 0x805e, 0x805a, 0x8087, 0x8150, 0x8180, 0x818f, 0x8188, 0x818a, 0x817f, 0x8182, 0x81e7, 0x81fa, 0x8207, 0x8214, 0x821e, 0x824b, 0x84c9, 0x84bf, 0x84c6, 0x84c4, 0x8499, 0x849e, 0x84b2, 0x849c, 0x84cb, 0x84b8, 0x84c0, 0x84d3, 0x8490, 0x84bc, 0x84d1, 0x84ca, 0x873f, 0x871c, 0x873b, 0x8722, 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88f3, 0x8902, 0x88f4, 0x88f9, 0x88f8, 0x88fd, 0x88e8, 0x891a, 0x88ef, 0x8aa6, 0x8a8c, 0x8a9e, 0x8aa3, 0x8a8d, 0x8aa1, 0x8a93, 0x8aa4, 0x8aaa, 0x8aa5, 0x8aa8, 0x8a98, 0x8a91, 0x8a9a, 0x8aa7, 0x8c6a, 0x8c8d, 0x8c8c, 0x8cd3, 0x8cd1, 0x8cd2, 0x8d6b, 0x8d99, 0x8d95, 0x8dfc, 0x8f14, 0x8f12, 0x8f15, 0x8f13, 0x8fa3, 0x9060, 0x9058, 0x905c, 0x9063, 0x9059, 0x905e, 0x9062, 0x905d, 0x905b, 0x9119, 0x9118, 0x911e, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, 0x9280, 0x9285, 0x9298, 0x9296, 0x927b, 0x9293, 0x929c, 0x92a8, 0x927c, 0x9291, 0x95a1, 0x95a8, 0x95a9, 0x95a3, 0x95a5, 0x95a4, 0x9699, 0x969c, 0x969b, 0x96cc, 0x96d2, 0x9700, 0x977c, 0x9785, 0x97f6, 0x9817, 0x9818, 0x98af, 0x98b1, 0x9903, 0x9905, 0x990c, 0x9909, 0x99c1, 0x9aaf, 0x9ab0, 0x9ae6, 0x9b41, 0x9b42, 0x9cf4, 0x9cf6, 0x9cf3, 0x9ebc, 0x9f3b, 0x9f4a, 0x5104, 0x5100, 0x50fb, 0x50f5, 0x50f9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51dc, /* 0xbc */ 0x5287, 0x5288, 0x5289, 0x528d, 0x528a, 0x52f0, 0x53b2, 0x562e, 0x563b, 0x5639, 0x5632, 0x563f, 0x5634, 0x5629, 0x5653, 0x564e, 0x5657, 0x5674, 0x5636, 0x562f, 0x5630, 0x5880, 0x589f, 0x589e, 0x58b3, 0x589c, 0x58ae, 0x58a9, 0x58a6, 0x596d, 0x5b09, 0x5afb, 0x5b0b, 0x5af5, 0x5b0c, 0x5b08, 0x5bee, 0x5bec, 0x5be9, 0x5beb, 0x5c64, 0x5c65, 0x5d9d, 0x5d94, 0x5e62, 0x5e5f, 0x5e61, 0x5ee2, 0x5eda, 0x5edf, 0x5edd, 0x5ee3, 0x5ee0, 0x5f48, 0x5f71, 0x5fb7, 0x5fb5, 0x6176, 0x6167, 0x616e, 0x615d, 0x6155, 0x6182, 0x617c, 0x6170, 0x616b, 0x617e, 0x61a7, 0x6190, 0x61ab, 0x618e, 0x61ac, 0x619a, 0x61a4, 0x6194, 0x61ae, 0x622e, 0x6469, 0x646f, 0x6479, 0x649e, 0x64b2, 0x6488, 0x6490, 0x64b0, 0x64a5, 0x6493, 0x6495, 0x64a9, 0x6492, 0x64ae, 0x64ad, 0x64ab, 0x649a, 0x64ac, 0x6499, 0x64a2, 0x64b3, 0x6575, 0x6577, 0x6578, 0x66ae, 0x66ab, 0x66b4, 0x66b1, 0x6a23, 0x6a1f, 0x69e8, 0x6a01, 0x6a1e, 0x6a19, 0x69fd, 0x6a21, 0x6a13, 0x6a0a, 0x69f3, 0x6a02, 0x6a05, 0x69ed, 0x6a11, 0x6b50, 0x6b4e, 0x6ba4, 0x6bc5, 0x6bc6, 0x6f3f, 0x6f7c, 0x6f84, 0x6f51, 0x6f66, 0x6f54, 0x6f86, 0x6f6d, 0x6f5b, 0x6f78, 0x6f6e, 0x6f8e, 0x6f7a, 0x6f70, 0x6f64, 0x6f97, 0x6f58, 0x6ed5, 0x6f6f, 0x6f60, 0x6f5f, 0x719f, 0x71ac, 0x71b1, 0x71a8, 0x7256, 0x729b, 0x734e, 0x7357, 0x7469, 0x748b, 0x7483, /* 0xbd */ 0x747e, 0x7480, 0x757f, 0x7620, 0x7629, 0x761f, 0x7624, 0x7626, 0x7621, 0x7622, 0x769a, 0x76ba, 0x76e4, 0x778e, 0x7787, 0x778c, 0x7791, 0x778b, 0x78cb, 0x78c5, 0x78ba, 0x78ca, 0x78be, 0x78d5, 0x78bc, 0x78d0, 0x7a3f, 0x7a3c, 0x7a40, 0x7a3d, 0x7a37, 0x7a3b, 0x7aaf, 0x7aae, 0x7bad, 0x7bb1, 0x7bc4, 0x7bb4, 0x7bc6, 0x7bc7, 0x7bc1, 0x7ba0, 0x7bcc, 0x7cca, 0x7de0, 0x7df4, 0x7def, 0x7dfb, 0x7dd8, 0x7dec, 0x7ddd, 0x7de8, 0x7de3, 0x7dda, 0x7dde, 0x7de9, 0x7d9e, 0x7dd9, 0x7df2, 0x7df9, 0x7f75, 0x7f77, 0x7faf, 0x7fe9, 0x8026, 0x819b, 0x819c, 0x819d, 0x81a0, 0x819a, 0x8198, 0x8517, 0x853d, 0x851a, 0x84ee, 0x852c, 0x852d, 0x8513, 0x8511, 0x8523, 0x8521, 0x8514, 0x84ec, 0x8525, 0x84ff, 0x8506, 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, 0x874c, 0x8753, 0x885b, 0x885d, 0x8910, 0x8907, 0x8912, 0x8913, 0x8915, 0x890a, 0x8abc, 0x8ad2, 0x8ac7, 0x8ac4, 0x8a95, 0x8acb, 0x8af8, 0x8ab2, 0x8ac9, 0x8ac2, 0x8abf, 0x8ab0, 0x8ad6, 0x8acd, 0x8ab6, 0x8ab9, 0x8adb, 0x8c4c, 0x8c4e, 0x8c6c, 0x8ce0, 0x8cde, 0x8ce6, 0x8ce4, 0x8cec, 0x8ced, 0x8ce2, 0x8ce3, 0x8cdc, 0x8cea, 0x8ce1, 0x8d6d, 0x8d9f, 0x8da3, 0x8e2b, 0x8e10, 0x8e1d, 0x8e22, 0x8e0f, 0x8e29, 0x8e1f, 0x8e21, 0x8e1e, 0x8eba, 0x8f1d, 0x8f1b, 0x8f1f, 0x8f29, 0x8f26, 0x8f2a, 0x8f1c, 0x8f1e, /* 0xbe */ 0x8f25, 0x9069, 0x906e, 0x9068, 0x906d, 0x9077, 0x9130, 0x912d, 0x9127, 0x9131, 0x9187, 0x9189, 0x918b, 0x9183, 0x92c5, 0x92bb, 0x92b7, 0x92ea, 0x92ac, 0x92e4, 0x92c1, 0x92b3, 0x92bc, 0x92d2, 0x92c7, 0x92f0, 0x92b2, 0x95ad, 0x95b1, 0x9704, 0x9706, 0x9707, 0x9709, 0x9760, 0x978d, 0x978b, 0x978f, 0x9821, 0x982b, 0x981c, 0x98b3, 0x990a, 0x9913, 0x9912, 0x9918, 0x99dd, 0x99d0, 0x99df, 0x99db, 0x99d1, 0x99d5, 0x99d2, 0x99d9, 0x9ab7, 0x9aee, 0x9aef, 0x9b27, 0x9b45, 0x9b44, 0x9b77, 0x9b6f, 0x9d06, 0x9d09, 0x9d03, 0x9ea9, 0x9ebe, 0x9ece, 0x58a8, 0x9f52, 0x5112, 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51aa, 0x51dd, 0x5291, 0x5293, 0x52f3, 0x5659, 0x566b, 0x5679, 0x5669, 0x5664, 0x5678, 0x566a, 0x5668, 0x5665, 0x5671, 0x566f, 0x566c, 0x5662, 0x5676, 0x58c1, 0x58be, 0x58c7, 0x58c5, 0x596e, 0x5b1d, 0x5b34, 0x5b78, 0x5bf0, 0x5c0e, 0x5f4a, 0x61b2, 0x6191, 0x61a9, 0x618a, 0x61cd, 0x61b6, 0x61be, 0x61ca, 0x61c8, 0x6230, 0x64c5, 0x64c1, 0x64cb, 0x64bb, 0x64bc, 0x64da, 0x64c4, 0x64c7, 0x64c2, 0x64cd, 0x64bf, 0x64d2, 0x64d4, 0x64be, 0x6574, 0x66c6, 0x66c9, 0x66b9, 0x66c4, 0x66c7, 0x66b8, 0x6a3d, 0x6a38, 0x6a3a, 0x6a59, 0x6a6b, 0x6a58, 0x6a39, 0x6a44, 0x6a62, 0x6a61, 0x6a4b, 0x6a47, 0x6a35, 0x6a5f, 0x6a48, 0x6b59, 0x6b77, 0x6c05, 0x6fc2, 0x6fb1, 0x6fa1, /* 0xbf */ 0x6fc3, 0x6fa4, 0x6fc1, 0x6fa7, 0x6fb3, 0x6fc0, 0x6fb9, 0x6fb6, 0x6fa6, 0x6fa0, 0x6fb4, 0x71be, 0x71c9, 0x71d0, 0x71d2, 0x71c8, 0x71d5, 0x71b9, 0x71ce, 0x71d9, 0x71dc, 0x71c3, 0x71c4, 0x7368, 0x749c, 0x74a3, 0x7498, 0x749f, 0x749e, 0x74e2, 0x750c, 0x750d, 0x7634, 0x7638, 0x763a, 0x76e7, 0x76e5, 0x77a0, 0x779e, 0x779f, 0x77a5, 0x78e8, 0x78da, 0x78ec, 0x78e7, 0x79a6, 0x7a4d, 0x7a4e, 0x7a46, 0x7a4c, 0x7a4b, 0x7aba, 0x7bd9, 0x7c11, 0x7bc9, 0x7be4, 0x7bdb, 0x7be1, 0x7be9, 0x7be6, 0x7cd5, 0x7cd6, 0x7e0a, 0x7e11, 0x7e08, 0x7e1b, 0x7e23, 0x7e1e, 0x7e1d, 0x7e09, 0x7e10, 0x7f79, 0x7fb2, 0x7ff0, 0x7ff1, 0x7fee, 0x8028, 0x81b3, 0x81a9, 0x81a8, 0x81fb, 0x8208, 0x8258, 0x8259, 0x854a, 0x8559, 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856d, 0x856a, 0x855e, 0x8783, 0x879f, 0x879e, 0x87a2, 0x878d, 0x8861, 0x892a, 0x8932, 0x8925, 0x892b, 0x8921, 0x89aa, 0x89a6, 0x8ae6, 0x8afa, 0x8aeb, 0x8af1, 0x8b00, 0x8adc, 0x8ae7, 0x8aee, 0x8afe, 0x8b01, 0x8b02, 0x8af7, 0x8aed, 0x8af3, 0x8af6, 0x8afc, 0x8c6b, 0x8c6d, 0x8c93, 0x8cf4, 0x8e44, 0x8e31, 0x8e34, 0x8e42, 0x8e39, 0x8e35, 0x8f3b, 0x8f2f, 0x8f38, 0x8f33, 0x8fa8, 0x8fa6, 0x9075, 0x9074, 0x9078, 0x9072, 0x907c, 0x907a, 0x9134, 0x9192, 0x9320, 0x9336, 0x92f8, 0x9333, 0x932f, 0x9322, 0x92fc, 0x932b, 0x9304, 0x931a, /* 0xc0 */ 0x9310, 0x9326, 0x9321, 0x9315, 0x932e, 0x9319, 0x95bb, 0x96a7, 0x96a8, 0x96aa, 0x96d5, 0x970e, 0x9711, 0x9716, 0x970d, 0x9713, 0x970f, 0x975b, 0x975c, 0x9766, 0x9798, 0x9830, 0x9838, 0x983b, 0x9837, 0x982d, 0x9839, 0x9824, 0x9910, 0x9928, 0x991e, 0x991b, 0x9921, 0x991a, 0x99ed, 0x99e2, 0x99f1, 0x9ab8, 0x9abc, 0x9afb, 0x9aed, 0x9b28, 0x9b91, 0x9d15, 0x9d23, 0x9d26, 0x9d28, 0x9d12, 0x9d1b, 0x9ed8, 0x9ed4, 0x9f8d, 0x9f9c, 0x512a, 0x511f, 0x5121, 0x5132, 0x52f5, 0x568e, 0x5680, 0x5690, 0x5685, 0x5687, 0x568f, 0x58d5, 0x58d3, 0x58d1, 0x58ce, 0x5b30, 0x5b2a, 0x5b24, 0x5b7a, 0x5c37, 0x5c68, 0x5dbc, 0x5dba, 0x5dbd, 0x5db8, 0x5e6b, 0x5f4c, 0x5fbd, 0x61c9, 0x61c2, 0x61c7, 0x61e6, 0x61cb, 0x6232, 0x6234, 0x64ce, 0x64ca, 0x64d8, 0x64e0, 0x64f0, 0x64e6, 0x64ec, 0x64f1, 0x64e2, 0x64ed, 0x6582, 0x6583, 0x66d9, 0x66d6, 0x6a80, 0x6a94, 0x6a84, 0x6aa2, 0x6a9c, 0x6adb, 0x6aa3, 0x6a7e, 0x6a97, 0x6a90, 0x6aa0, 0x6b5c, 0x6bae, 0x6bda, 0x6c08, 0x6fd8, 0x6ff1, 0x6fdf, 0x6fe0, 0x6fdb, 0x6fe4, 0x6feb, 0x6fef, 0x6f80, 0x6fec, 0x6fe1, 0x6fe9, 0x6fd5, 0x6fee, 0x6ff0, 0x71e7, 0x71df, 0x71ee, 0x71e6, 0x71e5, 0x71ed, 0x71ec, 0x71f4, 0x71e0, 0x7235, 0x7246, 0x7370, 0x7372, 0x74a9, 0x74b0, 0x74a6, 0x74a8, 0x7646, 0x7642, 0x764c, 0x76ea, 0x77b3, 0x77aa, 0x77b0, 0x77ac, /* 0xc1 */ 0x77a7, 0x77ad, 0x77ef, 0x78f7, 0x78fa, 0x78f4, 0x78ef, 0x7901, 0x79a7, 0x79aa, 0x7a57, 0x7abf, 0x7c07, 0x7c0d, 0x7bfe, 0x7bf7, 0x7c0c, 0x7be0, 0x7ce0, 0x7cdc, 0x7cde, 0x7ce2, 0x7cdf, 0x7cd9, 0x7cdd, 0x7e2e, 0x7e3e, 0x7e46, 0x7e37, 0x7e32, 0x7e43, 0x7e2b, 0x7e3d, 0x7e31, 0x7e45, 0x7e41, 0x7e34, 0x7e39, 0x7e48, 0x7e35, 0x7e3f, 0x7e2f, 0x7f44, 0x7ff3, 0x7ffc, 0x8071, 0x8072, 0x8070, 0x806f, 0x8073, 0x81c6, 0x81c3, 0x81ba, 0x81c2, 0x81c0, 0x81bf, 0x81bd, 0x81c9, 0x81be, 0x81e8, 0x8209, 0x8271, 0x85aa, 0x8584, 0x857e, 0x859c, 0x8591, 0x8594, 0x85af, 0x859b, 0x8587, 0x85a8, 0x858a, 0x8667, 0x87c0, 0x87d1, 0x87b3, 0x87d2, 0x87c6, 0x87ab, 0x87bb, 0x87ba, 0x87c8, 0x87cb, 0x893b, 0x8936, 0x8944, 0x8938, 0x893d, 0x89ac, 0x8b0e, 0x8b17, 0x8b19, 0x8b1b, 0x8b0a, 0x8b20, 0x8b1d, 0x8b04, 0x8b10, 0x8c41, 0x8c3f, 0x8c73, 0x8cfa, 0x8cfd, 0x8cfc, 0x8cf8, 0x8cfb, 0x8da8, 0x8e49, 0x8e4b, 0x8e48, 0x8e4a, 0x8f44, 0x8f3e, 0x8f42, 0x8f45, 0x8f3f, 0x907f, 0x907d, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91a3, 0x919e, 0x919c, 0x934d, 0x9382, 0x9328, 0x9375, 0x934a, 0x9365, 0x934b, 0x9318, 0x937e, 0x936c, 0x935b, 0x9370, 0x935a, 0x9354, 0x95ca, 0x95cb, 0x95cc, 0x95c8, 0x95c6, 0x96b1, 0x96b8, 0x96d6, 0x971c, 0x971e, 0x97a0, 0x97d3, 0x9846, 0x98b6, 0x9935, 0x9a01, /* 0xc2 */ 0x99ff, 0x9bae, 0x9bab, 0x9baa, 0x9bad, 0x9d3b, 0x9d3f, 0x9e8b, 0x9ecf, 0x9ede, 0x9edc, 0x9edd, 0x9edb, 0x9f3e, 0x9f4b, 0x53e2, 0x5695, 0x56ae, 0x58d9, 0x58d8, 0x5b38, 0x5f5d, 0x61e3, 0x6233, 0x64f4, 0x64f2, 0x64fe, 0x6506, 0x64fa, 0x64fb, 0x64f7, 0x65b7, 0x66dc, 0x6726, 0x6ab3, 0x6aac, 0x6ac3, 0x6abb, 0x6ab8, 0x6ac2, 0x6aae, 0x6aaf, 0x6b5f, 0x6b78, 0x6baf, 0x7009, 0x700b, 0x6ffe, 0x7006, 0x6ffa, 0x7011, 0x700f, 0x71fb, 0x71fc, 0x71fe, 0x71f8, 0x7377, 0x7375, 0x74a7, 0x74bf, 0x7515, 0x7656, 0x7658, 0x7652, 0x77bd, 0x77bf, 0x77bb, 0x77bc, 0x790e, 0x79ae, 0x7a61, 0x7a62, 0x7a60, 0x7ac4, 0x7ac5, 0x7c2b, 0x7c27, 0x7c2a, 0x7c1e, 0x7c23, 0x7c21, 0x7ce7, 0x7e54, 0x7e55, 0x7e5e, 0x7e5a, 0x7e61, 0x7e52, 0x7e59, 0x7f48, 0x7ff9, 0x7ffb, 0x8077, 0x8076, 0x81cd, 0x81cf, 0x820a, 0x85cf, 0x85a9, 0x85cd, 0x85d0, 0x85c9, 0x85b0, 0x85ba, 0x85b9, 0x85a6, 0x87ef, 0x87ec, 0x87f2, 0x87e0, 0x8986, 0x89b2, 0x89f4, 0x8b28, 0x8b39, 0x8b2c, 0x8b2b, 0x8c50, 0x8d05, 0x8e59, 0x8e63, 0x8e66, 0x8e64, 0x8e5f, 0x8e55, 0x8ec0, 0x8f49, 0x8f4d, 0x9087, 0x9083, 0x9088, 0x91ab, 0x91ac, 0x91d0, 0x9394, 0x938a, 0x9396, 0x93a2, 0x93b3, 0x93ae, 0x93ac, 0x93b0, 0x9398, 0x939a, 0x9397, 0x95d4, 0x95d6, 0x95d0, 0x95d5, 0x96e2, 0x96dc, 0x96d9, 0x96db, 0x96de, 0x9724, 0x97a3, 0x97a6, /* 0xc3 */ 0x97ad, 0x97f9, 0x984d, 0x984f, 0x984c, 0x984e, 0x9853, 0x98ba, 0x993e, 0x993f, 0x993d, 0x992e, 0x99a5, 0x9a0e, 0x9ac1, 0x9b03, 0x9b06, 0x9b4f, 0x9b4e, 0x9b4d, 0x9bca, 0x9bc9, 0x9bfd, 0x9bc8, 0x9bc0, 0x9d51, 0x9d5d, 0x9d60, 0x9ee0, 0x9f15, 0x9f2c, 0x5133, 0x56a5, 0x58de, 0x58df, 0x58e2, 0x5bf5, 0x9f90, 0x5eec, 0x61f2, 0x61f7, 0x61f6, 0x61f5, 0x6500, 0x650f, 0x66e0, 0x66dd, 0x6ae5, 0x6add, 0x6ada, 0x6ad3, 0x701b, 0x701f, 0x7028, 0x701a, 0x701d, 0x7015, 0x7018, 0x7206, 0x720d, 0x7258, 0x72a2, 0x7378, 0x737a, 0x74bd, 0x74ca, 0x74e3, 0x7587, 0x7586, 0x765f, 0x7661, 0x77c7, 0x7919, 0x79b1, 0x7a6b, 0x7a69, 0x7c3e, 0x7c3f, 0x7c38, 0x7c3d, 0x7c37, 0x7c40, 0x7e6b, 0x7e6d, 0x7e79, 0x7e69, 0x7e6a, 0x7f85, 0x7e73, 0x7fb6, 0x7fb9, 0x7fb8, 0x81d8, 0x85e9, 0x85dd, 0x85ea, 0x85d5, 0x85e4, 0x85e5, 0x85f7, 0x87fb, 0x8805, 0x880d, 0x87f9, 0x87fe, 0x8960, 0x895f, 0x8956, 0x895e, 0x8b41, 0x8b5c, 0x8b58, 0x8b49, 0x8b5a, 0x8b4e, 0x8b4f, 0x8b46, 0x8b59, 0x8d08, 0x8d0a, 0x8e7c, 0x8e72, 0x8e87, 0x8e76, 0x8e6c, 0x8e7a, 0x8e74, 0x8f54, 0x8f4e, 0x8fad, 0x908a, 0x908b, 0x91b1, 0x91ae, 0x93e1, 0x93d1, 0x93df, 0x93c3, 0x93c8, 0x93dc, 0x93dd, 0x93d6, 0x93e2, 0x93cd, 0x93d8, 0x93e4, 0x93d7, 0x93e8, 0x95dc, 0x96b4, 0x96e3, 0x972a, 0x9727, 0x9761, 0x97dc, 0x97fb, 0x985e, /* 0xc4 */ 0x9858, 0x985b, 0x98bc, 0x9945, 0x9949, 0x9a16, 0x9a19, 0x9b0d, 0x9be8, 0x9be7, 0x9bd6, 0x9bdb, 0x9d89, 0x9d61, 0x9d72, 0x9d6a, 0x9d6c, 0x9e92, 0x9e97, 0x9e93, 0x9eb4, 0x52f8, 0x56a8, 0x56b7, 0x56b6, 0x56b4, 0x56bc, 0x58e4, 0x5b40, 0x5b43, 0x5b7d, 0x5bf6, 0x5dc9, 0x61f8, 0x61fa, 0x6518, 0x6514, 0x6519, 0x66e6, 0x6727, 0x6aec, 0x703e, 0x7030, 0x7032, 0x7210, 0x737b, 0x74cf, 0x7662, 0x7665, 0x7926, 0x792a, 0x792c, 0x792b, 0x7ac7, 0x7af6, 0x7c4c, 0x7c43, 0x7c4d, 0x7cef, 0x7cf0, 0x8fae, 0x7e7d, 0x7e7c, 0x7e82, 0x7f4c, 0x8000, 0x81da, 0x8266, 0x85fb, 0x85f9, 0x8611, 0x85fa, 0x8606, 0x860b, 0x8607, 0x860a, 0x8814, 0x8815, 0x8964, 0x89ba, 0x89f8, 0x8b70, 0x8b6c, 0x8b66, 0x8b6f, 0x8b5f, 0x8b6b, 0x8d0f, 0x8d0d, 0x8e89, 0x8e81, 0x8e85, 0x8e82, 0x91b4, 0x91cb, 0x9418, 0x9403, 0x93fd, 0x95e1, 0x9730, 0x98c4, 0x9952, 0x9951, 0x99a8, 0x9a2b, 0x9a30, 0x9a37, 0x9a35, 0x9c13, 0x9c0d, 0x9e79, 0x9eb5, 0x9ee8, 0x9f2f, 0x9f5f, 0x9f63, 0x9f61, 0x5137, 0x5138, 0x56c1, 0x56c0, 0x56c2, 0x5914, 0x5c6c, 0x5dcd, 0x61fc, 0x61fe, 0x651d, 0x651c, 0x6595, 0x66e9, 0x6afb, 0x6b04, 0x6afa, 0x6bb2, 0x704c, 0x721b, 0x72a7, 0x74d6, 0x74d4, 0x7669, 0x77d3, 0x7c50, 0x7e8f, 0x7e8c, 0x7fbc, 0x8617, 0x862d, 0x861a, 0x8823, 0x8822, 0x8821, 0x881f, 0x896a, 0x896c, 0x89bd, 0x8b74, /* 0xc5 */ 0x8b77, 0x8b7d, 0x8d13, 0x8e8a, 0x8e8d, 0x8e8b, 0x8f5f, 0x8faf, 0x91ba, 0x942e, 0x9433, 0x9435, 0x943a, 0x9438, 0x9432, 0x942b, 0x95e2, 0x9738, 0x9739, 0x9732, 0x97ff, 0x9867, 0x9865, 0x9957, 0x9a45, 0x9a43, 0x9a40, 0x9a3e, 0x9acf, 0x9b54, 0x9b51, 0x9c2d, 0x9c25, 0x9daf, 0x9db4, 0x9dc2, 0x9db8, 0x9e9d, 0x9eef, 0x9f19, 0x9f5c, 0x9f66, 0x9f67, 0x513c, 0x513b, 0x56c8, 0x56ca, 0x56c9, 0x5b7f, 0x5dd4, 0x5dd2, 0x5f4e, 0x61ff, 0x6524, 0x6b0a, 0x6b61, 0x7051, 0x7058, 0x7380, 0x74e4, 0x758a, 0x766e, 0x766c, 0x79b3, 0x7c60, 0x7c5f, 0x807e, 0x807d, 0x81df, 0x8972, 0x896f, 0x89fc, 0x8b80, 0x8d16, 0x8d17, 0x8e91, 0x8e93, 0x8f61, 0x9148, 0x9444, 0x9451, 0x9452, 0x973d, 0x973e, 0x97c3, 0x97c1, 0x986b, 0x9955, 0x9a55, 0x9a4d, 0x9ad2, 0x9b1a, 0x9c49, 0x9c31, 0x9c3e, 0x9c3b, 0x9dd3, 0x9dd7, 0x9f34, 0x9f6c, 0x9f6a, 0x9f94, 0x56cc, 0x5dd6, 0x6200, 0x6523, 0x652b, 0x652a, 0x66ec, 0x6b10, 0x74da, 0x7aca, 0x7c64, 0x7c63, 0x7c65, 0x7e93, 0x7e96, 0x7e94, 0x81e2, 0x8638, 0x863f, 0x8831, 0x8b8a, 0x9090, 0x908f, 0x9463, 0x9460, 0x9464, 0x9768, 0x986f, 0x995c, 0x9a5a, 0x9a5b, 0x9a57, 0x9ad3, 0x9ad4, 0x9ad1, 0x9c54, 0x9c57, 0x9c56, 0x9de5, 0x9e9f, 0x9ef4, 0x56d1, 0x58e9, 0x652c, 0x705e, 0x7671, 0x7672, 0x77d7, 0x7f50, 0x7f88, 0x8836, 0x8839, 0x8862, 0x8b93, 0x8b92, /* 0xc6 */ 0x8b96, 0x8277, 0x8d1b, 0x91c0, 0x946a, 0x9742, 0x9748, 0x9744, 0x97c6, 0x9870, 0x9a5f, 0x9b22, 0x9b58, 0x9c5f, 0x9df9, 0x9dfa, 0x9e7c, 0x9e7d, 0x9f07, 0x9f77, 0x9f72, 0x5ef3, 0x6b16, 0x7063, 0x7c6c, 0x7c6e, 0x883b, 0x89c0, 0x8ea1, 0x91c1, 0x9472, 0x9470, 0x9871, 0x995e, 0x9ad6, 0x9b23, 0x9ecc, 0x7064, 0x77da, 0x8b9a, 0x9477, 0x97c9, 0x9a62, 0x9a65, 0x7e9c, 0x8b9c, 0x8eaa, 0x91c5, 0x947d, 0x947e, 0x947c, 0x9c77, 0x9c78, 0x9ef7, 0x8c54, 0x947f, 0x9e1a, 0x7228, 0x9a6a, 0x9b31, 0x9e1b, 0x9e1e, 0x7c72, 0x30fe, 0x309d, 0x309e, 0x3005, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, /* 0xc7 */ 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, }; static const unsigned short big5_2uni_pagec9[7652] = { /* 0xc9 */ 0x4e42, 0x4e5c, 0x51f5, 0x531a, 0x5382, 0x4e07, 0x4e0c, 0x4e47, 0x4e8d, 0x56d7, 0xfa0c, 0x5c6e, 0x5f73, 0x4e0f, 0x5187, 0x4e0e, 0x4e2e, 0x4e93, 0x4ec2, 0x4ec9, 0x4ec8, 0x5198, 0x52fc, 0x536c, 0x53b9, 0x5720, 0x5903, 0x592c, 0x5c10, 0x5dff, 0x65e1, 0x6bb3, 0x6bcc, 0x6c14, 0x723f, 0x4e31, 0x4e3c, 0x4ee8, 0x4edc, 0x4ee9, 0x4ee1, 0x4edd, 0x4eda, 0x520c, 0x531c, 0x534c, 0x5722, 0x5723, 0x5917, 0x592f, 0x5b81, 0x5b84, 0x5c12, 0x5c3b, 0x5c74, 0x5c73, 0x5e04, 0x5e80, 0x5e82, 0x5fc9, 0x6209, 0x6250, 0x6c15, 0x6c36, 0x6c43, 0x6c3f, 0x6c3b, 0x72ae, 0x72b0, 0x738a, 0x79b8, 0x808a, 0x961e, 0x4f0e, 0x4f18, 0x4f2c, 0x4ef5, 0x4f14, 0x4ef1, 0x4f00, 0x4ef7, 0x4f08, 0x4f1d, 0x4f02, 0x4f05, 0x4f22, 0x4f13, 0x4f04, 0x4ef4, 0x4f12, 0x51b1, 0x5213, 0x5209, 0x5210, 0x52a6, 0x5322, 0x531f, 0x534d, 0x538a, 0x5407, 0x56e1, 0x56df, 0x572e, 0x572a, 0x5734, 0x593c, 0x5980, 0x597c, 0x5985, 0x597b, 0x597e, 0x5977, 0x597f, 0x5b56, 0x5c15, 0x5c25, 0x5c7c, 0x5c7a, 0x5c7b, 0x5c7e, 0x5ddf, 0x5e75, 0x5e84, 0x5f02, 0x5f1a, 0x5f74, 0x5fd5, 0x5fd4, 0x5fcf, 0x625c, 0x625e, 0x6264, 0x6261, 0x6266, 0x6262, 0x6259, 0x6260, 0x625a, 0x6265, 0x65ef, 0x65ee, 0x673e, 0x6739, 0x6738, 0x673b, 0x673a, 0x673f, 0x673c, 0x6733, 0x6c18, 0x6c46, 0x6c52, 0x6c5c, 0x6c4f, 0x6c4a, 0x6c54, 0x6c4b, /* 0xca */ 0x6c4c, 0x7071, 0x725e, 0x72b4, 0x72b5, 0x738e, 0x752a, 0x767f, 0x7a75, 0x7f51, 0x8278, 0x827c, 0x8280, 0x827d, 0x827f, 0x864d, 0x897e, 0x9099, 0x9097, 0x9098, 0x909b, 0x9094, 0x9622, 0x9624, 0x9620, 0x9623, 0x4f56, 0x4f3b, 0x4f62, 0x4f49, 0x4f53, 0x4f64, 0x4f3e, 0x4f67, 0x4f52, 0x4f5f, 0x4f41, 0x4f58, 0x4f2d, 0x4f33, 0x4f3f, 0x4f61, 0x518f, 0x51b9, 0x521c, 0x521e, 0x5221, 0x52ad, 0x52ae, 0x5309, 0x5363, 0x5372, 0x538e, 0x538f, 0x5430, 0x5437, 0x542a, 0x5454, 0x5445, 0x5419, 0x541c, 0x5425, 0x5418, 0x543d, 0x544f, 0x5441, 0x5428, 0x5424, 0x5447, 0x56ee, 0x56e7, 0x56e5, 0x5741, 0x5745, 0x574c, 0x5749, 0x574b, 0x5752, 0x5906, 0x5940, 0x59a6, 0x5998, 0x59a0, 0x5997, 0x598e, 0x59a2, 0x5990, 0x598f, 0x59a7, 0x59a1, 0x5b8e, 0x5b92, 0x5c28, 0x5c2a, 0x5c8d, 0x5c8f, 0x5c88, 0x5c8b, 0x5c89, 0x5c92, 0x5c8a, 0x5c86, 0x5c93, 0x5c95, 0x5de0, 0x5e0a, 0x5e0e, 0x5e8b, 0x5e89, 0x5e8c, 0x5e88, 0x5e8d, 0x5f05, 0x5f1d, 0x5f78, 0x5f76, 0x5fd2, 0x5fd1, 0x5fd0, 0x5fed, 0x5fe8, 0x5fee, 0x5ff3, 0x5fe1, 0x5fe4, 0x5fe3, 0x5ffa, 0x5fef, 0x5ff7, 0x5ffb, 0x6000, 0x5ff4, 0x623a, 0x6283, 0x628c, 0x628e, 0x628f, 0x6294, 0x6287, 0x6271, 0x627b, 0x627a, 0x6270, 0x6281, 0x6288, 0x6277, 0x627d, 0x6272, 0x6274, 0x6537, 0x65f0, 0x65f4, 0x65f3, 0x65f2, 0x65f5, 0x6745, 0x6747, /* 0xcb */ 0x6759, 0x6755, 0x674c, 0x6748, 0x675d, 0x674d, 0x675a, 0x674b, 0x6bd0, 0x6c19, 0x6c1a, 0x6c78, 0x6c67, 0x6c6b, 0x6c84, 0x6c8b, 0x6c8f, 0x6c71, 0x6c6f, 0x6c69, 0x6c9a, 0x6c6d, 0x6c87, 0x6c95, 0x6c9c, 0x6c66, 0x6c73, 0x6c65, 0x6c7b, 0x6c8e, 0x7074, 0x707a, 0x7263, 0x72bf, 0x72bd, 0x72c3, 0x72c6, 0x72c1, 0x72ba, 0x72c5, 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753a, 0x7539, 0x7594, 0x7595, 0x7681, 0x793d, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, 0x809c, 0x8290, 0x828f, 0x8285, 0x828e, 0x8291, 0x8293, 0x828a, 0x8283, 0x8284, 0x8c78, 0x8fc9, 0x8fbf, 0x909f, 0x90a1, 0x90a5, 0x909e, 0x90a7, 0x90a0, 0x9630, 0x9628, 0x962f, 0x962d, 0x4e33, 0x4f98, 0x4f7c, 0x4f85, 0x4f7d, 0x4f80, 0x4f87, 0x4f76, 0x4f74, 0x4f89, 0x4f84, 0x4f77, 0x4f4c, 0x4f97, 0x4f6a, 0x4f9a, 0x4f79, 0x4f81, 0x4f78, 0x4f90, 0x4f9c, 0x4f94, 0x4f9e, 0x4f92, 0x4f82, 0x4f95, 0x4f6b, 0x4f6e, 0x519e, 0x51bc, 0x51be, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52bc, 0x530a, 0x530b, 0x533c, 0x5392, 0x5394, 0x5487, 0x547f, 0x5481, 0x5491, 0x5482, 0x5488, 0x546b, 0x547a, 0x547e, 0x5465, 0x546c, 0x5474, 0x5466, 0x548d, 0x546f, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, 0x56f7, 0x56f9, 0x576f, 0x5772, 0x576d, 0x576b, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, 0x577b, 0x5773, 0x5774, 0x5762, /* 0xcc */ 0x5768, 0x577d, 0x590c, 0x5945, 0x59b5, 0x59ba, 0x59cf, 0x59ce, 0x59b2, 0x59cc, 0x59c1, 0x59b6, 0x59bc, 0x59c3, 0x59d6, 0x59b1, 0x59bd, 0x59c0, 0x59c8, 0x59b4, 0x59c7, 0x5b62, 0x5b65, 0x5b93, 0x5b95, 0x5c44, 0x5c47, 0x5cae, 0x5ca4, 0x5ca0, 0x5cb5, 0x5caf, 0x5ca8, 0x5cac, 0x5c9f, 0x5ca3, 0x5cad, 0x5ca2, 0x5caa, 0x5ca7, 0x5c9d, 0x5ca5, 0x5cb6, 0x5cb0, 0x5ca6, 0x5e17, 0x5e14, 0x5e19, 0x5f28, 0x5f22, 0x5f23, 0x5f24, 0x5f54, 0x5f82, 0x5f7e, 0x5f7d, 0x5fde, 0x5fe5, 0x602d, 0x6026, 0x6019, 0x6032, 0x600b, 0x6034, 0x600a, 0x6017, 0x6033, 0x601a, 0x601e, 0x602c, 0x6022, 0x600d, 0x6010, 0x602e, 0x6013, 0x6011, 0x600c, 0x6009, 0x601c, 0x6214, 0x623d, 0x62ad, 0x62b4, 0x62d1, 0x62be, 0x62aa, 0x62b6, 0x62ca, 0x62ae, 0x62b3, 0x62af, 0x62bb, 0x62a9, 0x62b0, 0x62b8, 0x653d, 0x65a8, 0x65bb, 0x6609, 0x65fc, 0x6604, 0x6612, 0x6608, 0x65fb, 0x6603, 0x660b, 0x660d, 0x6605, 0x65fd, 0x6611, 0x6610, 0x66f6, 0x670a, 0x6785, 0x676c, 0x678e, 0x6792, 0x6776, 0x677b, 0x6798, 0x6786, 0x6784, 0x6774, 0x678d, 0x678c, 0x677a, 0x679f, 0x6791, 0x6799, 0x6783, 0x677d, 0x6781, 0x6778, 0x6779, 0x6794, 0x6b25, 0x6b80, 0x6b7e, 0x6bde, 0x6c1d, 0x6c93, 0x6cec, 0x6ceb, 0x6cee, 0x6cd9, 0x6cb6, 0x6cd4, 0x6cad, 0x6ce7, 0x6cb7, 0x6cd0, 0x6cc2, 0x6cba, 0x6cc3, 0x6cc6, 0x6ced, 0x6cf2, /* 0xcd */ 0x6cd2, 0x6cdd, 0x6cb4, 0x6c8a, 0x6c9d, 0x6c80, 0x6cde, 0x6cc0, 0x6d30, 0x6ccd, 0x6cc7, 0x6cb0, 0x6cf9, 0x6ccf, 0x6ce9, 0x6cd1, 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, 0x7082, 0x709a, 0x7083, 0x726a, 0x72d6, 0x72cb, 0x72d8, 0x72c9, 0x72dc, 0x72d2, 0x72d4, 0x72da, 0x72cc, 0x72d1, 0x73a4, 0x73a1, 0x73ad, 0x73a6, 0x73a2, 0x73a0, 0x73ac, 0x739d, 0x74dd, 0x74e8, 0x753f, 0x7540, 0x753e, 0x758c, 0x7598, 0x76af, 0x76f3, 0x76f1, 0x76f0, 0x76f5, 0x77f8, 0x77fc, 0x77f9, 0x77fb, 0x77fa, 0x77f7, 0x7942, 0x793f, 0x79c5, 0x7a78, 0x7a7b, 0x7afb, 0x7c75, 0x7cfd, 0x8035, 0x808f, 0x80ae, 0x80a3, 0x80b8, 0x80b5, 0x80ad, 0x8220, 0x82a0, 0x82c0, 0x82ab, 0x829a, 0x8298, 0x829b, 0x82b5, 0x82a7, 0x82ae, 0x82bc, 0x829e, 0x82ba, 0x82b4, 0x82a8, 0x82a1, 0x82a9, 0x82c2, 0x82a4, 0x82c3, 0x82b6, 0x82a2, 0x8670, 0x866f, 0x866d, 0x866e, 0x8c56, 0x8fd2, 0x8fcb, 0x8fd3, 0x8fcd, 0x8fd6, 0x8fd5, 0x8fd7, 0x90b2, 0x90b4, 0x90af, 0x90b3, 0x90b0, 0x9639, 0x963d, 0x963c, 0x963a, 0x9643, 0x4fcd, 0x4fc5, 0x4fd3, 0x4fb2, 0x4fc9, 0x4fcb, 0x4fc1, 0x4fd4, 0x4fdc, 0x4fd9, 0x4fbb, 0x4fb3, 0x4fdb, 0x4fc7, 0x4fd6, 0x4fba, 0x4fc0, 0x4fb9, 0x4fec, 0x5244, 0x5249, 0x52c0, 0x52c2, 0x533d, 0x537c, 0x5397, 0x5396, 0x5399, 0x5398, 0x54ba, 0x54a1, 0x54ad, 0x54a5, 0x54cf, /* 0xce */ 0x54c3, 0x830d, 0x54b7, 0x54ae, 0x54d6, 0x54b6, 0x54c5, 0x54c6, 0x54a0, 0x5470, 0x54bc, 0x54a2, 0x54be, 0x5472, 0x54de, 0x54b0, 0x57b5, 0x579e, 0x579f, 0x57a4, 0x578c, 0x5797, 0x579d, 0x579b, 0x5794, 0x5798, 0x578f, 0x5799, 0x57a5, 0x579a, 0x5795, 0x58f4, 0x590d, 0x5953, 0x59e1, 0x59de, 0x59ee, 0x5a00, 0x59f1, 0x59dd, 0x59fa, 0x59fd, 0x59fc, 0x59f6, 0x59e4, 0x59f2, 0x59f7, 0x59db, 0x59e9, 0x59f3, 0x59f5, 0x59e0, 0x59fe, 0x59f4, 0x59ed, 0x5ba8, 0x5c4c, 0x5cd0, 0x5cd8, 0x5ccc, 0x5cd7, 0x5ccb, 0x5cdb, 0x5cde, 0x5cda, 0x5cc9, 0x5cc7, 0x5cca, 0x5cd6, 0x5cd3, 0x5cd4, 0x5ccf, 0x5cc8, 0x5cc6, 0x5cce, 0x5cdf, 0x5cf8, 0x5df9, 0x5e21, 0x5e22, 0x5e23, 0x5e20, 0x5e24, 0x5eb0, 0x5ea4, 0x5ea2, 0x5e9b, 0x5ea3, 0x5ea5, 0x5f07, 0x5f2e, 0x5f56, 0x5f86, 0x6037, 0x6039, 0x6054, 0x6072, 0x605e, 0x6045, 0x6053, 0x6047, 0x6049, 0x605b, 0x604c, 0x6040, 0x6042, 0x605f, 0x6024, 0x6044, 0x6058, 0x6066, 0x606e, 0x6242, 0x6243, 0x62cf, 0x630d, 0x630b, 0x62f5, 0x630e, 0x6303, 0x62eb, 0x62f9, 0x630f, 0x630c, 0x62f8, 0x62f6, 0x6300, 0x6313, 0x6314, 0x62fa, 0x6315, 0x62fb, 0x62f0, 0x6541, 0x6543, 0x65aa, 0x65bf, 0x6636, 0x6621, 0x6632, 0x6635, 0x661c, 0x6626, 0x6622, 0x6633, 0x662b, 0x663a, 0x661d, 0x6634, 0x6639, 0x662e, 0x670f, 0x6710, 0x67c1, 0x67f2, 0x67c8, 0x67ba, /* 0xcf */ 0x67dc, 0x67bb, 0x67f8, 0x67d8, 0x67c0, 0x67b7, 0x67c5, 0x67eb, 0x67e4, 0x67df, 0x67b5, 0x67cd, 0x67b3, 0x67f7, 0x67f6, 0x67ee, 0x67e3, 0x67c2, 0x67b9, 0x67ce, 0x67e7, 0x67f0, 0x67b2, 0x67fc, 0x67c6, 0x67ed, 0x67cc, 0x67ae, 0x67e6, 0x67db, 0x67fa, 0x67c9, 0x67ca, 0x67c3, 0x67ea, 0x67cb, 0x6b28, 0x6b82, 0x6b84, 0x6bb6, 0x6bd6, 0x6bd8, 0x6be0, 0x6c20, 0x6c21, 0x6d28, 0x6d34, 0x6d2d, 0x6d1f, 0x6d3c, 0x6d3f, 0x6d12, 0x6d0a, 0x6cda, 0x6d33, 0x6d04, 0x6d19, 0x6d3a, 0x6d1a, 0x6d11, 0x6d00, 0x6d1d, 0x6d42, 0x6d01, 0x6d18, 0x6d37, 0x6d03, 0x6d0f, 0x6d40, 0x6d07, 0x6d20, 0x6d2c, 0x6d08, 0x6d22, 0x6d09, 0x6d10, 0x70b7, 0x709f, 0x70be, 0x70b1, 0x70b0, 0x70a1, 0x70b4, 0x70b5, 0x70a9, 0x7241, 0x7249, 0x724a, 0x726c, 0x7270, 0x7273, 0x726e, 0x72ca, 0x72e4, 0x72e8, 0x72eb, 0x72df, 0x72ea, 0x72e6, 0x72e3, 0x7385, 0x73cc, 0x73c2, 0x73c8, 0x73c5, 0x73b9, 0x73b6, 0x73b5, 0x73b4, 0x73eb, 0x73bf, 0x73c7, 0x73be, 0x73c3, 0x73c6, 0x73b8, 0x73cb, 0x74ec, 0x74ee, 0x752e, 0x7547, 0x7548, 0x75a7, 0x75aa, 0x7679, 0x76c4, 0x7708, 0x7703, 0x7704, 0x7705, 0x770a, 0x76f7, 0x76fb, 0x76fa, 0x77e7, 0x77e8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780f, 0x780e, 0x7809, 0x7803, 0x7813, 0x794a, 0x794c, 0x794b, 0x7945, 0x7944, 0x79d5, 0x79cd, 0x79cf, 0x79d6, 0x79ce, 0x7a80, /* 0xd0 */ 0x7a7e, 0x7ad1, 0x7b00, 0x7b01, 0x7c7a, 0x7c78, 0x7c79, 0x7c7f, 0x7c80, 0x7c81, 0x7d03, 0x7d08, 0x7d01, 0x7f58, 0x7f91, 0x7f8d, 0x7fbe, 0x8007, 0x800e, 0x800f, 0x8014, 0x8037, 0x80d8, 0x80c7, 0x80e0, 0x80d1, 0x80c8, 0x80c2, 0x80d0, 0x80c5, 0x80e3, 0x80d9, 0x80dc, 0x80ca, 0x80d5, 0x80c9, 0x80cf, 0x80d7, 0x80e6, 0x80cd, 0x81ff, 0x8221, 0x8294, 0x82d9, 0x82fe, 0x82f9, 0x8307, 0x82e8, 0x8300, 0x82d5, 0x833a, 0x82eb, 0x82d6, 0x82f4, 0x82ec, 0x82e1, 0x82f2, 0x82f5, 0x830c, 0x82fb, 0x82f6, 0x82f0, 0x82ea, 0x82e4, 0x82e0, 0x82fa, 0x82f3, 0x82ed, 0x8677, 0x8674, 0x867c, 0x8673, 0x8841, 0x884e, 0x8867, 0x886a, 0x8869, 0x89d3, 0x8a04, 0x8a07, 0x8d72, 0x8fe3, 0x8fe1, 0x8fee, 0x8fe0, 0x90f1, 0x90bd, 0x90bf, 0x90d5, 0x90c5, 0x90be, 0x90c7, 0x90cb, 0x90c8, 0x91d4, 0x91d3, 0x9654, 0x964f, 0x9651, 0x9653, 0x964a, 0x964e, 0x501e, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501b, 0x4ff5, 0x4ff4, 0x5033, 0x5037, 0x502c, 0x4ff6, 0x4ff7, 0x5017, 0x501c, 0x5020, 0x5027, 0x5035, 0x502f, 0x5031, 0x500e, 0x515a, 0x5194, 0x5193, 0x51ca, 0x51c4, 0x51c5, 0x51c8, 0x51ce, 0x5261, 0x525a, 0x5252, 0x525e, 0x525f, 0x5255, 0x5262, 0x52cd, 0x530e, 0x539e, 0x5526, 0x54e2, 0x5517, 0x5512, 0x54e7, 0x54f3, 0x54e4, 0x551a, 0x54ff, 0x5504, 0x5508, 0x54eb, 0x5511, 0x5505, 0x54f1, /* 0xd1 */ 0x550a, 0x54fb, 0x54f7, 0x54f8, 0x54e0, 0x550e, 0x5503, 0x550b, 0x5701, 0x5702, 0x57cc, 0x5832, 0x57d5, 0x57d2, 0x57ba, 0x57c6, 0x57bd, 0x57bc, 0x57b8, 0x57b6, 0x57bf, 0x57c7, 0x57d0, 0x57b9, 0x57c1, 0x590e, 0x594a, 0x5a19, 0x5a16, 0x5a2d, 0x5a2e, 0x5a15, 0x5a0f, 0x5a17, 0x5a0a, 0x5a1e, 0x5a33, 0x5b6c, 0x5ba7, 0x5bad, 0x5bac, 0x5c03, 0x5c56, 0x5c54, 0x5cec, 0x5cff, 0x5cee, 0x5cf1, 0x5cf7, 0x5d00, 0x5cf9, 0x5e29, 0x5e28, 0x5ea8, 0x5eae, 0x5eaa, 0x5eac, 0x5f33, 0x5f30, 0x5f67, 0x605d, 0x605a, 0x6067, 0x6041, 0x60a2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609d, 0x6083, 0x6095, 0x609b, 0x6097, 0x6087, 0x609c, 0x608e, 0x6219, 0x6246, 0x62f2, 0x6310, 0x6356, 0x632c, 0x6344, 0x6345, 0x6336, 0x6343, 0x63e4, 0x6339, 0x634b, 0x634a, 0x633c, 0x6329, 0x6341, 0x6334, 0x6358, 0x6354, 0x6359, 0x632d, 0x6347, 0x6333, 0x635a, 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654a, 0x6546, 0x65c6, 0x65c3, 0x65c4, 0x65c2, 0x664a, 0x665f, 0x6647, 0x6651, 0x6712, 0x6713, 0x681f, 0x681a, 0x6849, 0x6832, 0x6833, 0x683b, 0x684b, 0x684f, 0x6816, 0x6831, 0x681c, 0x6835, 0x682b, 0x682d, 0x682f, 0x684e, 0x6844, 0x6834, 0x681d, 0x6812, 0x6814, 0x6826, 0x6828, 0x682e, 0x684d, 0x683a, 0x6825, 0x6820, 0x6b2c, 0x6b2f, 0x6b2d, 0x6b31, 0x6b34, 0x6b6d, 0x8082, 0x6b88, 0x6be6, 0x6be4, /* 0xd2 */ 0x6be8, 0x6be3, 0x6be2, 0x6be7, 0x6c25, 0x6d7a, 0x6d63, 0x6d64, 0x6d76, 0x6d0d, 0x6d61, 0x6d92, 0x6d58, 0x6d62, 0x6d6d, 0x6d6f, 0x6d91, 0x6d8d, 0x6def, 0x6d7f, 0x6d86, 0x6d5e, 0x6d67, 0x6d60, 0x6d97, 0x6d70, 0x6d7c, 0x6d5f, 0x6d82, 0x6d98, 0x6d2f, 0x6d68, 0x6d8b, 0x6d7e, 0x6d80, 0x6d84, 0x6d16, 0x6d83, 0x6d7b, 0x6d7d, 0x6d75, 0x6d90, 0x70dc, 0x70d3, 0x70d1, 0x70dd, 0x70cb, 0x7f39, 0x70e2, 0x70d7, 0x70d2, 0x70de, 0x70e0, 0x70d4, 0x70cd, 0x70c5, 0x70c6, 0x70c7, 0x70da, 0x70ce, 0x70e1, 0x7242, 0x7278, 0x7277, 0x7276, 0x7300, 0x72fa, 0x72f4, 0x72fe, 0x72f6, 0x72f3, 0x72fb, 0x7301, 0x73d3, 0x73d9, 0x73e5, 0x73d6, 0x73bc, 0x73e7, 0x73e3, 0x73e9, 0x73dc, 0x73d2, 0x73db, 0x73d4, 0x73dd, 0x73da, 0x73d7, 0x73d8, 0x73e8, 0x74de, 0x74df, 0x74f4, 0x74f5, 0x7521, 0x755b, 0x755f, 0x75b0, 0x75c1, 0x75bb, 0x75c4, 0x75c0, 0x75bf, 0x75b6, 0x75ba, 0x768a, 0x76c9, 0x771d, 0x771b, 0x7710, 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, 0x771a, 0x7722, 0x7727, 0x7823, 0x782c, 0x7822, 0x7835, 0x782f, 0x7828, 0x782e, 0x782b, 0x7821, 0x7829, 0x7833, 0x782a, 0x7831, 0x7954, 0x795b, 0x794f, 0x795c, 0x7953, 0x7952, 0x7951, 0x79eb, 0x79ec, 0x79e0, 0x79ee, 0x79ed, 0x79ea, 0x79dc, 0x79de, 0x79dd, 0x7a86, 0x7a89, 0x7a85, 0x7a8b, 0x7a8c, 0x7a8a, 0x7a87, 0x7ad8, 0x7b10, /* 0xd3 */ 0x7b04, 0x7b13, 0x7b05, 0x7b0f, 0x7b08, 0x7b0a, 0x7b0e, 0x7b09, 0x7b12, 0x7c84, 0x7c91, 0x7c8a, 0x7c8c, 0x7c88, 0x7c8d, 0x7c85, 0x7d1e, 0x7d1d, 0x7d11, 0x7d0e, 0x7d18, 0x7d16, 0x7d13, 0x7d1f, 0x7d12, 0x7d0f, 0x7d0c, 0x7f5c, 0x7f61, 0x7f5e, 0x7f60, 0x7f5d, 0x7f5b, 0x7f96, 0x7f92, 0x7fc3, 0x7fc2, 0x7fc0, 0x8016, 0x803e, 0x8039, 0x80fa, 0x80f2, 0x80f9, 0x80f5, 0x8101, 0x80fb, 0x8100, 0x8201, 0x822f, 0x8225, 0x8333, 0x832d, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833f, 0x8341, 0x8326, 0x831c, 0x8322, 0x8342, 0x834e, 0x831b, 0x832a, 0x8308, 0x833c, 0x834d, 0x8316, 0x8324, 0x8320, 0x8337, 0x832f, 0x8329, 0x8347, 0x8345, 0x834c, 0x8353, 0x831e, 0x832c, 0x834b, 0x8327, 0x8348, 0x8653, 0x8652, 0x86a2, 0x86a8, 0x8696, 0x868d, 0x8691, 0x869e, 0x8687, 0x8697, 0x8686, 0x868b, 0x869a, 0x8685, 0x86a5, 0x8699, 0x86a1, 0x86a7, 0x8695, 0x8698, 0x868e, 0x869d, 0x8690, 0x8694, 0x8843, 0x8844, 0x886d, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887f, 0x886f, 0x8883, 0x887e, 0x8874, 0x887c, 0x8a12, 0x8c47, 0x8c57, 0x8c7b, 0x8ca4, 0x8ca3, 0x8d76, 0x8d78, 0x8db5, 0x8db7, 0x8db6, 0x8ed1, 0x8ed3, 0x8ffe, 0x8ff5, 0x9002, 0x8fff, 0x8ffb, 0x9004, 0x8ffc, 0x8ff6, 0x90d6, 0x90e0, 0x90d9, 0x90da, 0x90e3, 0x90df, 0x90e5, 0x90d8, 0x90db, 0x90d7, 0x90dc, 0x90e4, 0x9150, /* 0xd4 */ 0x914e, 0x914f, 0x91d5, 0x91e2, 0x91da, 0x965c, 0x965f, 0x96bc, 0x98e3, 0x9adf, 0x9b2f, 0x4e7f, 0x5070, 0x506a, 0x5061, 0x505e, 0x5060, 0x5053, 0x504b, 0x505d, 0x5072, 0x5048, 0x504d, 0x5041, 0x505b, 0x504a, 0x5062, 0x5015, 0x5045, 0x505f, 0x5069, 0x506b, 0x5063, 0x5064, 0x5046, 0x5040, 0x506e, 0x5073, 0x5057, 0x5051, 0x51d0, 0x526b, 0x526d, 0x526c, 0x526e, 0x52d6, 0x52d3, 0x532d, 0x539c, 0x5575, 0x5576, 0x553c, 0x554d, 0x5550, 0x5534, 0x552a, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0x550c, 0x5532, 0x5565, 0x554e, 0x5539, 0x5548, 0x552d, 0x553b, 0x5540, 0x554b, 0x570a, 0x5707, 0x57fb, 0x5814, 0x57e2, 0x57f6, 0x57dc, 0x57f4, 0x5800, 0x57ed, 0x57fd, 0x5808, 0x57f8, 0x580b, 0x57f3, 0x57cf, 0x5807, 0x57ee, 0x57e3, 0x57f2, 0x57e5, 0x57ec, 0x57e1, 0x580e, 0x57fc, 0x5810, 0x57e7, 0x5801, 0x580c, 0x57f1, 0x57e9, 0x57f0, 0x580d, 0x5804, 0x595c, 0x5a60, 0x5a58, 0x5a55, 0x5a67, 0x5a5e, 0x5a38, 0x5a35, 0x5a6d, 0x5a50, 0x5a5f, 0x5a65, 0x5a6c, 0x5a53, 0x5a64, 0x5a57, 0x5a43, 0x5a5d, 0x5a52, 0x5a44, 0x5a5b, 0x5a48, 0x5a8e, 0x5a3e, 0x5a4d, 0x5a39, 0x5a4c, 0x5a70, 0x5a69, 0x5a47, 0x5a51, 0x5a56, 0x5a42, 0x5a5c, 0x5b72, 0x5b6e, 0x5bc1, 0x5bc0, 0x5c59, 0x5d1e, 0x5d0b, 0x5d1d, 0x5d1a, 0x5d20, 0x5d0c, 0x5d28, 0x5d0d, 0x5d26, 0x5d25, 0x5d0f, /* 0xd5 */ 0x5d30, 0x5d12, 0x5d23, 0x5d1f, 0x5d2e, 0x5e3e, 0x5e34, 0x5eb1, 0x5eb4, 0x5eb9, 0x5eb2, 0x5eb3, 0x5f36, 0x5f38, 0x5f9b, 0x5f96, 0x5f9f, 0x608a, 0x6090, 0x6086, 0x60be, 0x60b0, 0x60ba, 0x60d3, 0x60d4, 0x60cf, 0x60e4, 0x60d9, 0x60dd, 0x60c8, 0x60b1, 0x60db, 0x60b7, 0x60ca, 0x60bf, 0x60c3, 0x60cd, 0x60c0, 0x6332, 0x6365, 0x638a, 0x6382, 0x637d, 0x63bd, 0x639e, 0x63ad, 0x639d, 0x6397, 0x63ab, 0x638e, 0x636f, 0x6387, 0x6390, 0x636e, 0x63af, 0x6375, 0x639c, 0x636d, 0x63ae, 0x637c, 0x63a4, 0x633b, 0x639f, 0x6378, 0x6385, 0x6381, 0x6391, 0x638d, 0x6370, 0x6553, 0x65cd, 0x6665, 0x6661, 0x665b, 0x6659, 0x665c, 0x6662, 0x6718, 0x6879, 0x6887, 0x6890, 0x689c, 0x686d, 0x686e, 0x68ae, 0x68ab, 0x6956, 0x686f, 0x68a3, 0x68ac, 0x68a9, 0x6875, 0x6874, 0x68b2, 0x688f, 0x6877, 0x6892, 0x687c, 0x686b, 0x6872, 0x68aa, 0x6880, 0x6871, 0x687e, 0x689b, 0x6896, 0x688b, 0x68a0, 0x6889, 0x68a4, 0x6878, 0x687b, 0x6891, 0x688c, 0x688a, 0x687d, 0x6b36, 0x6b33, 0x6b37, 0x6b38, 0x6b91, 0x6b8f, 0x6b8d, 0x6b8e, 0x6b8c, 0x6c2a, 0x6dc0, 0x6dab, 0x6db4, 0x6db3, 0x6e74, 0x6dac, 0x6de9, 0x6de2, 0x6db7, 0x6df6, 0x6dd4, 0x6e00, 0x6dc8, 0x6de0, 0x6ddf, 0x6dd6, 0x6dbe, 0x6de5, 0x6ddc, 0x6ddd, 0x6ddb, 0x6df4, 0x6dca, 0x6dbd, 0x6ded, 0x6df0, 0x6dba, 0x6dd5, 0x6dc2, 0x6dcf, 0x6dc9, /* 0xd6 */ 0x6dd0, 0x6df2, 0x6dd3, 0x6dfd, 0x6dd7, 0x6dcd, 0x6de3, 0x6dbb, 0x70fa, 0x710d, 0x70f7, 0x7117, 0x70f4, 0x710c, 0x70f0, 0x7104, 0x70f3, 0x7110, 0x70fc, 0x70ff, 0x7106, 0x7113, 0x7100, 0x70f8, 0x70f6, 0x710b, 0x7102, 0x710e, 0x727e, 0x727b, 0x727c, 0x727f, 0x731d, 0x7317, 0x7307, 0x7311, 0x7318, 0x730a, 0x7308, 0x72ff, 0x730f, 0x731e, 0x7388, 0x73f6, 0x73f8, 0x73f5, 0x7404, 0x7401, 0x73fd, 0x7407, 0x7400, 0x73fa, 0x73fc, 0x73ff, 0x740c, 0x740b, 0x73f4, 0x7408, 0x7564, 0x7563, 0x75ce, 0x75d2, 0x75cf, 0x75cb, 0x75cc, 0x75d1, 0x75d0, 0x768f, 0x7689, 0x76d3, 0x7739, 0x772f, 0x772d, 0x7731, 0x7732, 0x7734, 0x7733, 0x773d, 0x7725, 0x773b, 0x7735, 0x7848, 0x7852, 0x7849, 0x784d, 0x784a, 0x784c, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796a, 0x7963, 0x796b, 0x7961, 0x79bb, 0x79fa, 0x79f8, 0x79f6, 0x79f7, 0x7a8f, 0x7a94, 0x7a90, 0x7b35, 0x7b47, 0x7b34, 0x7b25, 0x7b30, 0x7b22, 0x7b24, 0x7b33, 0x7b18, 0x7b2a, 0x7b1d, 0x7b31, 0x7b2b, 0x7b2d, 0x7b2f, 0x7b32, 0x7b38, 0x7b1a, 0x7b23, 0x7c94, 0x7c98, 0x7c96, 0x7ca3, 0x7d35, 0x7d3d, 0x7d38, 0x7d36, 0x7d3a, 0x7d45, 0x7d2c, 0x7d29, 0x7d41, 0x7d47, 0x7d3e, 0x7d3f, 0x7d4a, 0x7d3b, 0x7d28, 0x7f63, 0x7f95, 0x7f9c, 0x7f9d, 0x7f9b, 0x7fca, 0x7fcb, 0x7fcd, 0x7fd0, 0x7fd1, 0x7fc7, 0x7fcf, 0x7fc9, 0x801f, /* 0xd7 */ 0x801e, 0x801b, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, 0x811b, 0x812d, 0x811f, 0x812c, 0x811e, 0x8121, 0x8115, 0x8127, 0x811d, 0x8122, 0x8211, 0x8238, 0x8233, 0x823a, 0x8234, 0x8232, 0x8274, 0x8390, 0x83a3, 0x83a8, 0x838d, 0x837a, 0x8373, 0x83a4, 0x8374, 0x838f, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83a9, 0x837d, 0x8383, 0x838c, 0x839d, 0x839b, 0x83aa, 0x838b, 0x837e, 0x83a5, 0x83af, 0x8388, 0x8397, 0x83b0, 0x837f, 0x83a6, 0x8387, 0x83ae, 0x8376, 0x839a, 0x8659, 0x8656, 0x86bf, 0x86b7, 0x86c2, 0x86c1, 0x86c5, 0x86ba, 0x86b0, 0x86c8, 0x86b9, 0x86b3, 0x86b8, 0x86cc, 0x86b4, 0x86bb, 0x86bc, 0x86c3, 0x86bd, 0x86be, 0x8852, 0x8889, 0x8895, 0x88a8, 0x88a2, 0x88aa, 0x889a, 0x8891, 0x88a1, 0x889f, 0x8898, 0x88a7, 0x8899, 0x889b, 0x8897, 0x88a4, 0x88ac, 0x888c, 0x8893, 0x888e, 0x8982, 0x89d6, 0x89d9, 0x89d5, 0x8a30, 0x8a27, 0x8a2c, 0x8a1e, 0x8c39, 0x8c3b, 0x8c5c, 0x8c5d, 0x8c7d, 0x8ca5, 0x8d7d, 0x8d7b, 0x8d79, 0x8dbc, 0x8dc2, 0x8db9, 0x8dbf, 0x8dc1, 0x8ed8, 0x8ede, 0x8edd, 0x8edc, 0x8ed7, 0x8ee0, 0x8ee1, 0x9024, 0x900b, 0x9011, 0x901c, 0x900c, 0x9021, 0x90ef, 0x90ea, 0x90f0, 0x90f4, 0x90f2, 0x90f3, 0x90d4, 0x90eb, 0x90ec, 0x90e9, 0x9156, 0x9158, 0x915a, 0x9153, 0x9155, 0x91ec, 0x91f4, 0x91f1, 0x91f3, 0x91f8, 0x91e4, 0x91f9, 0x91ea, /* 0xd8 */ 0x91eb, 0x91f7, 0x91e8, 0x91ee, 0x957a, 0x9586, 0x9588, 0x967c, 0x966d, 0x966b, 0x9671, 0x966f, 0x96bf, 0x976a, 0x9804, 0x98e5, 0x9997, 0x509b, 0x5095, 0x5094, 0x509e, 0x508b, 0x50a3, 0x5083, 0x508c, 0x508e, 0x509d, 0x5068, 0x509c, 0x5092, 0x5082, 0x5087, 0x515f, 0x51d4, 0x5312, 0x5311, 0x53a4, 0x53a7, 0x5591, 0x55a8, 0x55a5, 0x55ad, 0x5577, 0x5645, 0x55a2, 0x5593, 0x5588, 0x558f, 0x55b5, 0x5581, 0x55a3, 0x5592, 0x55a4, 0x557d, 0x558c, 0x55a6, 0x557f, 0x5595, 0x55a1, 0x558e, 0x570c, 0x5829, 0x5837, 0x5819, 0x581e, 0x5827, 0x5823, 0x5828, 0x57f5, 0x5848, 0x5825, 0x581c, 0x581b, 0x5833, 0x583f, 0x5836, 0x582e, 0x5839, 0x5838, 0x582d, 0x582c, 0x583b, 0x5961, 0x5aaf, 0x5a94, 0x5a9f, 0x5a7a, 0x5aa2, 0x5a9e, 0x5a78, 0x5aa6, 0x5a7c, 0x5aa5, 0x5aac, 0x5a95, 0x5aae, 0x5a37, 0x5a84, 0x5a8a, 0x5a97, 0x5a83, 0x5a8b, 0x5aa9, 0x5a7b, 0x5a7d, 0x5a8c, 0x5a9c, 0x5a8f, 0x5a93, 0x5a9d, 0x5bea, 0x5bcd, 0x5bcb, 0x5bd4, 0x5bd1, 0x5bca, 0x5bce, 0x5c0c, 0x5c30, 0x5d37, 0x5d43, 0x5d6b, 0x5d41, 0x5d4b, 0x5d3f, 0x5d35, 0x5d51, 0x5d4e, 0x5d55, 0x5d33, 0x5d3a, 0x5d52, 0x5d3d, 0x5d31, 0x5d59, 0x5d42, 0x5d39, 0x5d49, 0x5d38, 0x5d3c, 0x5d32, 0x5d36, 0x5d40, 0x5d45, 0x5e44, 0x5e41, 0x5f58, 0x5fa6, 0x5fa5, 0x5fab, 0x60c9, 0x60b9, 0x60cc, 0x60e2, 0x60ce, 0x60c4, 0x6114, /* 0xd9 */ 0x60f2, 0x610a, 0x6116, 0x6105, 0x60f5, 0x6113, 0x60f8, 0x60fc, 0x60fe, 0x60c1, 0x6103, 0x6118, 0x611d, 0x6110, 0x60ff, 0x6104, 0x610b, 0x624a, 0x6394, 0x63b1, 0x63b0, 0x63ce, 0x63e5, 0x63e8, 0x63ef, 0x63c3, 0x649d, 0x63f3, 0x63ca, 0x63e0, 0x63f6, 0x63d5, 0x63f2, 0x63f5, 0x6461, 0x63df, 0x63be, 0x63dd, 0x63dc, 0x63c4, 0x63d8, 0x63d3, 0x63c2, 0x63c7, 0x63cc, 0x63cb, 0x63c8, 0x63f0, 0x63d7, 0x63d9, 0x6532, 0x6567, 0x656a, 0x6564, 0x655c, 0x6568, 0x6565, 0x658c, 0x659d, 0x659e, 0x65ae, 0x65d0, 0x65d2, 0x667c, 0x666c, 0x667b, 0x6680, 0x6671, 0x6679, 0x666a, 0x6672, 0x6701, 0x690c, 0x68d3, 0x6904, 0x68dc, 0x692a, 0x68ec, 0x68ea, 0x68f1, 0x690f, 0x68d6, 0x68f7, 0x68eb, 0x68e4, 0x68f6, 0x6913, 0x6910, 0x68f3, 0x68e1, 0x6907, 0x68cc, 0x6908, 0x6970, 0x68b4, 0x6911, 0x68ef, 0x68c6, 0x6914, 0x68f8, 0x68d0, 0x68fd, 0x68fc, 0x68e8, 0x690b, 0x690a, 0x6917, 0x68ce, 0x68c8, 0x68dd, 0x68de, 0x68e6, 0x68f4, 0x68d1, 0x6906, 0x68d4, 0x68e9, 0x6915, 0x6925, 0x68c7, 0x6b39, 0x6b3b, 0x6b3f, 0x6b3c, 0x6b94, 0x6b97, 0x6b99, 0x6b95, 0x6bbd, 0x6bf0, 0x6bf2, 0x6bf3, 0x6c30, 0x6dfc, 0x6e46, 0x6e47, 0x6e1f, 0x6e49, 0x6e88, 0x6e3c, 0x6e3d, 0x6e45, 0x6e62, 0x6e2b, 0x6e3f, 0x6e41, 0x6e5d, 0x6e73, 0x6e1c, 0x6e33, 0x6e4b, 0x6e40, 0x6e51, 0x6e3b, 0x6e03, 0x6e2e, 0x6e5e, /* 0xda */ 0x6e68, 0x6e5c, 0x6e61, 0x6e31, 0x6e28, 0x6e60, 0x6e71, 0x6e6b, 0x6e39, 0x6e22, 0x6e30, 0x6e53, 0x6e65, 0x6e27, 0x6e78, 0x6e64, 0x6e77, 0x6e55, 0x6e79, 0x6e52, 0x6e66, 0x6e35, 0x6e36, 0x6e5a, 0x7120, 0x711e, 0x712f, 0x70fb, 0x712e, 0x7131, 0x7123, 0x7125, 0x7122, 0x7132, 0x711f, 0x7128, 0x713a, 0x711b, 0x724b, 0x725a, 0x7288, 0x7289, 0x7286, 0x7285, 0x728b, 0x7312, 0x730b, 0x7330, 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732d, 0x7326, 0x7323, 0x7335, 0x730c, 0x742e, 0x742c, 0x7430, 0x742b, 0x7416, 0x741a, 0x7421, 0x742d, 0x7431, 0x7424, 0x7423, 0x741d, 0x7429, 0x7420, 0x7432, 0x74fb, 0x752f, 0x756f, 0x756c, 0x75e7, 0x75da, 0x75e1, 0x75e6, 0x75dd, 0x75df, 0x75e4, 0x75d7, 0x7695, 0x7692, 0x76da, 0x7746, 0x7747, 0x7744, 0x774d, 0x7745, 0x774a, 0x774e, 0x774b, 0x774c, 0x77de, 0x77ec, 0x7860, 0x7864, 0x7865, 0x785c, 0x786d, 0x7871, 0x786a, 0x786e, 0x7870, 0x7869, 0x7868, 0x785e, 0x7862, 0x7974, 0x7973, 0x7972, 0x7970, 0x7a02, 0x7a0a, 0x7a03, 0x7a0c, 0x7a04, 0x7a99, 0x7ae6, 0x7ae4, 0x7b4a, 0x7b3b, 0x7b44, 0x7b48, 0x7b4c, 0x7b4e, 0x7b40, 0x7b58, 0x7b45, 0x7ca2, 0x7c9e, 0x7ca8, 0x7ca1, 0x7d58, 0x7d6f, 0x7d63, 0x7d53, 0x7d56, 0x7d67, 0x7d6a, 0x7d4f, 0x7d6d, 0x7d5c, 0x7d6b, 0x7d52, 0x7d54, 0x7d69, 0x7d51, 0x7d5f, 0x7d4e, 0x7f3e, 0x7f3f, 0x7f65, /* 0xdb */ 0x7f66, 0x7fa2, 0x7fa0, 0x7fa1, 0x7fd7, 0x8051, 0x804f, 0x8050, 0x80fe, 0x80d4, 0x8143, 0x814a, 0x8152, 0x814f, 0x8147, 0x813d, 0x814d, 0x813a, 0x81e6, 0x81ee, 0x81f7, 0x81f8, 0x81f9, 0x8204, 0x823c, 0x823d, 0x823f, 0x8275, 0x833b, 0x83cf, 0x83f9, 0x8423, 0x83c0, 0x83e8, 0x8412, 0x83e7, 0x83e4, 0x83fc, 0x83f6, 0x8410, 0x83c6, 0x83c8, 0x83eb, 0x83e3, 0x83bf, 0x8401, 0x83dd, 0x83e5, 0x83d8, 0x83ff, 0x83e1, 0x83cb, 0x83ce, 0x83d6, 0x83f5, 0x83c9, 0x8409, 0x840f, 0x83de, 0x8411, 0x8406, 0x83c2, 0x83f3, 0x83d5, 0x83fa, 0x83c7, 0x83d1, 0x83ea, 0x8413, 0x83c3, 0x83ec, 0x83ee, 0x83c4, 0x83fb, 0x83d7, 0x83e2, 0x841b, 0x83db, 0x83fe, 0x86d8, 0x86e2, 0x86e6, 0x86d3, 0x86e3, 0x86da, 0x86ea, 0x86dd, 0x86eb, 0x86dc, 0x86ec, 0x86e9, 0x86d7, 0x86e8, 0x86d1, 0x8848, 0x8856, 0x8855, 0x88ba, 0x88d7, 0x88b9, 0x88b8, 0x88c0, 0x88be, 0x88b6, 0x88bc, 0x88b7, 0x88bd, 0x88b2, 0x8901, 0x88c9, 0x8995, 0x8998, 0x8997, 0x89dd, 0x89da, 0x89db, 0x8a4e, 0x8a4d, 0x8a39, 0x8a59, 0x8a40, 0x8a57, 0x8a58, 0x8a44, 0x8a45, 0x8a52, 0x8a48, 0x8a51, 0x8a4a, 0x8a4c, 0x8a4f, 0x8c5f, 0x8c81, 0x8c80, 0x8cba, 0x8cbe, 0x8cb0, 0x8cb9, 0x8cb5, 0x8d84, 0x8d80, 0x8d89, 0x8dd8, 0x8dd3, 0x8dcd, 0x8dc7, 0x8dd6, 0x8ddc, 0x8dcf, 0x8dd5, 0x8dd9, 0x8dc8, 0x8dd7, 0x8dc5, 0x8eef, 0x8ef7, 0x8efa, /* 0xdc */ 0x8ef9, 0x8ee6, 0x8eee, 0x8ee5, 0x8ef5, 0x8ee7, 0x8ee8, 0x8ef6, 0x8eeb, 0x8ef1, 0x8eec, 0x8ef4, 0x8ee9, 0x902d, 0x9034, 0x902f, 0x9106, 0x912c, 0x9104, 0x90ff, 0x90fc, 0x9108, 0x90f9, 0x90fb, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915f, 0x9162, 0x9160, 0x9201, 0x920a, 0x9225, 0x9203, 0x921a, 0x9226, 0x920f, 0x920c, 0x9200, 0x9212, 0x91ff, 0x91fd, 0x9206, 0x9204, 0x9227, 0x9202, 0x921c, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, 0x957b, 0x958d, 0x958c, 0x9590, 0x9687, 0x967e, 0x9688, 0x9689, 0x9683, 0x9680, 0x96c2, 0x96c8, 0x96c3, 0x96f1, 0x96f0, 0x976c, 0x9770, 0x976e, 0x9807, 0x98a9, 0x98eb, 0x9ce6, 0x9ef9, 0x4e83, 0x4e84, 0x4eb6, 0x50bd, 0x50bf, 0x50c6, 0x50ae, 0x50c4, 0x50ca, 0x50b4, 0x50c8, 0x50c2, 0x50b0, 0x50c1, 0x50ba, 0x50b1, 0x50cb, 0x50c9, 0x50b6, 0x50b8, 0x51d7, 0x527a, 0x5278, 0x527b, 0x527c, 0x55c3, 0x55db, 0x55cc, 0x55d0, 0x55cb, 0x55ca, 0x55dd, 0x55c0, 0x55d4, 0x55c4, 0x55e9, 0x55bf, 0x55d2, 0x558d, 0x55cf, 0x55d5, 0x55e2, 0x55d6, 0x55c8, 0x55f2, 0x55cd, 0x55d9, 0x55c2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584f, 0x584d, 0x5849, 0x586f, 0x5855, 0x584e, 0x585d, 0x5859, 0x5865, 0x585b, 0x583d, 0x5863, 0x5871, 0x58fc, 0x5ac7, 0x5ac4, 0x5acb, 0x5aba, 0x5ab8, 0x5ab1, 0x5ab5, 0x5ab0, 0x5abf, 0x5ac8, 0x5abb, 0x5ac6, /* 0xdd */ 0x5ab7, 0x5ac0, 0x5aca, 0x5ab4, 0x5ab6, 0x5acd, 0x5ab9, 0x5a90, 0x5bd6, 0x5bd8, 0x5bd9, 0x5c1f, 0x5c33, 0x5d71, 0x5d63, 0x5d4a, 0x5d65, 0x5d72, 0x5d6c, 0x5d5e, 0x5d68, 0x5d67, 0x5d62, 0x5df0, 0x5e4f, 0x5e4e, 0x5e4a, 0x5e4d, 0x5e4b, 0x5ec5, 0x5ecc, 0x5ec6, 0x5ecb, 0x5ec7, 0x5f40, 0x5faf, 0x5fad, 0x60f7, 0x6149, 0x614a, 0x612b, 0x6145, 0x6136, 0x6132, 0x612e, 0x6146, 0x612f, 0x614f, 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63c5, 0x63f1, 0x63eb, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x6433, 0x6443, 0x641f, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, 0x640c, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642f, 0x640a, 0x641a, 0x6440, 0x6425, 0x6427, 0x640b, 0x63e7, 0x641b, 0x642e, 0x6421, 0x640e, 0x656f, 0x6592, 0x65d3, 0x6686, 0x668c, 0x6695, 0x6690, 0x668b, 0x668a, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, 0x695f, 0x6938, 0x694e, 0x6962, 0x6971, 0x693f, 0x6945, 0x696a, 0x6939, 0x6942, 0x6957, 0x6959, 0x697a, 0x6948, 0x6949, 0x6935, 0x696c, 0x6933, 0x693d, 0x6965, 0x68f0, 0x6978, 0x6934, 0x6969, 0x6940, 0x696f, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694c, 0x693b, 0x694b, 0x6937, 0x695c, 0x694f, 0x6951, 0x6932, 0x6952, 0x692f, 0x697b, 0x693c, 0x6b46, 0x6b45, 0x6b43, 0x6b42, 0x6b48, 0x6b41, 0x6b9b, 0xfa0d, 0x6bfb, 0x6bfc, /* 0xde */ 0x6bf9, 0x6bf7, 0x6bf8, 0x6e9b, 0x6ed6, 0x6ec8, 0x6e8f, 0x6ec0, 0x6e9f, 0x6e93, 0x6e94, 0x6ea0, 0x6eb1, 0x6eb9, 0x6ec6, 0x6ed2, 0x6ebd, 0x6ec1, 0x6e9e, 0x6ec9, 0x6eb7, 0x6eb0, 0x6ecd, 0x6ea6, 0x6ecf, 0x6eb2, 0x6ebe, 0x6ec3, 0x6edc, 0x6ed8, 0x6e99, 0x6e92, 0x6e8e, 0x6e8d, 0x6ea4, 0x6ea1, 0x6ebf, 0x6eb3, 0x6ed0, 0x6eca, 0x6e97, 0x6eae, 0x6ea3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, 0x7141, 0x715d, 0x7162, 0x7172, 0x7178, 0x716a, 0x7161, 0x7142, 0x7158, 0x7143, 0x714b, 0x7170, 0x715f, 0x7150, 0x7153, 0x7144, 0x714d, 0x715a, 0x724f, 0x728d, 0x728c, 0x7291, 0x7290, 0x728e, 0x733c, 0x7342, 0x733b, 0x733a, 0x7340, 0x734a, 0x7349, 0x7444, 0x744a, 0x744b, 0x7452, 0x7451, 0x7457, 0x7440, 0x744f, 0x7450, 0x744e, 0x7442, 0x7446, 0x744d, 0x7454, 0x74e1, 0x74ff, 0x74fe, 0x74fd, 0x751d, 0x7579, 0x7577, 0x6983, 0x75ef, 0x760f, 0x7603, 0x75f7, 0x75fe, 0x75fc, 0x75f9, 0x75f8, 0x7610, 0x75fb, 0x75f6, 0x75ed, 0x75f5, 0x75fd, 0x7699, 0x76b5, 0x76dd, 0x7755, 0x775f, 0x7760, 0x7752, 0x7756, 0x775a, 0x7769, 0x7767, 0x7754, 0x7759, 0x776d, 0x77e0, 0x7887, 0x789a, 0x7894, 0x788f, 0x7884, 0x7895, 0x7885, 0x7886, 0x78a1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896, 0x787b, 0x797c, 0x7982, 0x797d, 0x7979, 0x7a11, 0x7a18, 0x7a19, 0x7a12, 0x7a17, 0x7a15, 0x7a22, 0x7a13, /* 0xdf */ 0x7a1b, 0x7a10, 0x7aa3, 0x7aa2, 0x7a9e, 0x7aeb, 0x7b66, 0x7b64, 0x7b6d, 0x7b74, 0x7b69, 0x7b72, 0x7b65, 0x7b73, 0x7b71, 0x7b70, 0x7b61, 0x7b78, 0x7b76, 0x7b63, 0x7cb2, 0x7cb4, 0x7caf, 0x7d88, 0x7d86, 0x7d80, 0x7d8d, 0x7d7f, 0x7d85, 0x7d7a, 0x7d8e, 0x7d7b, 0x7d83, 0x7d7c, 0x7d8c, 0x7d94, 0x7d84, 0x7d7d, 0x7d92, 0x7f6d, 0x7f6b, 0x7f67, 0x7f68, 0x7f6c, 0x7fa6, 0x7fa5, 0x7fa7, 0x7fdb, 0x7fdc, 0x8021, 0x8164, 0x8160, 0x8177, 0x815c, 0x8169, 0x815b, 0x8162, 0x8172, 0x6721, 0x815e, 0x8176, 0x8167, 0x816f, 0x8144, 0x8161, 0x821d, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84f1, 0x843f, 0x8456, 0x8476, 0x8479, 0x848f, 0x848d, 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, 0x8430, 0x844d, 0x847d, 0x845a, 0x8459, 0x8474, 0x8473, 0x845d, 0x8507, 0x845e, 0x8437, 0x843a, 0x8434, 0x847a, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83d9, 0x844b, 0x842f, 0x8442, 0x842d, 0x845f, 0x8470, 0x8439, 0x844e, 0x844c, 0x8452, 0x846f, 0x84c5, 0x848e, 0x843b, 0x8447, 0x8436, 0x8433, 0x8468, 0x847e, 0x8444, 0x842b, 0x8460, 0x8454, 0x846e, 0x8450, 0x870b, 0x8704, 0x86f7, 0x870c, 0x86fa, 0x86d6, 0x86f5, 0x874d, 0x86f8, 0x870e, 0x8709, 0x8701, 0x86f6, 0x870d, 0x8705, 0x88d6, 0x88cb, 0x88cd, 0x88ce, 0x88de, 0x88db, 0x88da, 0x88cc, 0x88d0, 0x8985, 0x899b, 0x89df, 0x89e5, 0x89e4, /* 0xe0 */ 0x89e1, 0x89e0, 0x89e2, 0x89dc, 0x89e6, 0x8a76, 0x8a86, 0x8a7f, 0x8a61, 0x8a3f, 0x8a77, 0x8a82, 0x8a84, 0x8a75, 0x8a83, 0x8a81, 0x8a74, 0x8a7a, 0x8c3c, 0x8c4b, 0x8c4a, 0x8c65, 0x8c64, 0x8c66, 0x8c86, 0x8c84, 0x8c85, 0x8ccc, 0x8d68, 0x8d69, 0x8d91, 0x8d8c, 0x8d8e, 0x8d8f, 0x8d8d, 0x8d93, 0x8d94, 0x8d90, 0x8d92, 0x8df0, 0x8de0, 0x8dec, 0x8df1, 0x8dee, 0x8dd0, 0x8de9, 0x8de3, 0x8de2, 0x8de7, 0x8df2, 0x8deb, 0x8df4, 0x8f06, 0x8eff, 0x8f01, 0x8f00, 0x8f05, 0x8f07, 0x8f08, 0x8f02, 0x8f0b, 0x9052, 0x903f, 0x9044, 0x9049, 0x903d, 0x9110, 0x910d, 0x910f, 0x9111, 0x9116, 0x9114, 0x910b, 0x910e, 0x916e, 0x916f, 0x9248, 0x9252, 0x9230, 0x923a, 0x9266, 0x9233, 0x9265, 0x925e, 0x9283, 0x922e, 0x924a, 0x9246, 0x926d, 0x926c, 0x924f, 0x9260, 0x9267, 0x926f, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, 0x924e, 0x9253, 0x924c, 0x9256, 0x9232, 0x959f, 0x959c, 0x959e, 0x959b, 0x9692, 0x9693, 0x9691, 0x9697, 0x96ce, 0x96fa, 0x96fd, 0x96f8, 0x96f5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980f, 0x980d, 0x980e, 0x98ac, 0x98f6, 0x98f9, 0x99af, 0x99b2, 0x99b0, 0x99b5, 0x9aad, 0x9aab, 0x9b5b, 0x9cea, 0x9ced, 0x9ce7, 0x9e80, 0x9efd, 0x50e6, 0x50d4, 0x50d7, 0x50e8, 0x50f3, 0x50db, 0x50ea, 0x50dd, 0x50e4, 0x50d3, 0x50ec, 0x50f0, 0x50ef, 0x50e3, 0x50e0, /* 0xe1 */ 0x51d8, 0x5280, 0x5281, 0x52e9, 0x52eb, 0x5330, 0x53ac, 0x5627, 0x5615, 0x560c, 0x5612, 0x55fc, 0x560f, 0x561c, 0x5601, 0x5613, 0x5602, 0x55fa, 0x561d, 0x5604, 0x55ff, 0x55f9, 0x5889, 0x587c, 0x5890, 0x5898, 0x5886, 0x5881, 0x587f, 0x5874, 0x588b, 0x587a, 0x5887, 0x5891, 0x588e, 0x5876, 0x5882, 0x5888, 0x587b, 0x5894, 0x588f, 0x58fe, 0x596b, 0x5adc, 0x5aee, 0x5ae5, 0x5ad5, 0x5aea, 0x5ada, 0x5aed, 0x5aeb, 0x5af3, 0x5ae2, 0x5ae0, 0x5adb, 0x5aec, 0x5ade, 0x5add, 0x5ad9, 0x5ae8, 0x5adf, 0x5b77, 0x5be0, 0x5be3, 0x5c63, 0x5d82, 0x5d80, 0x5d7d, 0x5d86, 0x5d7a, 0x5d81, 0x5d77, 0x5d8a, 0x5d89, 0x5d88, 0x5d7e, 0x5d7c, 0x5d8d, 0x5d79, 0x5d7f, 0x5e58, 0x5e59, 0x5e53, 0x5ed8, 0x5ed1, 0x5ed7, 0x5ece, 0x5edc, 0x5ed5, 0x5ed9, 0x5ed2, 0x5ed4, 0x5f44, 0x5f43, 0x5f6f, 0x5fb6, 0x612c, 0x6128, 0x6141, 0x615e, 0x6171, 0x6173, 0x6152, 0x6153, 0x6172, 0x616c, 0x6180, 0x6174, 0x6154, 0x617a, 0x615b, 0x6165, 0x613b, 0x616a, 0x6161, 0x6156, 0x6229, 0x6227, 0x622b, 0x642b, 0x644d, 0x645b, 0x645d, 0x6474, 0x6476, 0x6472, 0x6473, 0x647d, 0x6475, 0x6466, 0x64a6, 0x644e, 0x6482, 0x645e, 0x645c, 0x644b, 0x6453, 0x6460, 0x6450, 0x647f, 0x643f, 0x646c, 0x646b, 0x6459, 0x6465, 0x6477, 0x6573, 0x65a0, 0x66a1, 0x66a0, 0x669f, 0x6705, 0x6704, 0x6722, 0x69b1, 0x69b6, 0x69c9, /* 0xe2 */ 0x69a0, 0x69ce, 0x6996, 0x69b0, 0x69ac, 0x69bc, 0x6991, 0x6999, 0x698e, 0x69a7, 0x698d, 0x69a9, 0x69be, 0x69af, 0x69bf, 0x69c4, 0x69bd, 0x69a4, 0x69d4, 0x69b9, 0x69ca, 0x699a, 0x69cf, 0x69b3, 0x6993, 0x69aa, 0x69a1, 0x699e, 0x69d9, 0x6997, 0x6990, 0x69c2, 0x69b5, 0x69a5, 0x69c6, 0x6b4a, 0x6b4d, 0x6b4b, 0x6b9e, 0x6b9f, 0x6ba0, 0x6bc3, 0x6bc4, 0x6bfe, 0x6ece, 0x6ef5, 0x6ef1, 0x6f03, 0x6f25, 0x6ef8, 0x6f37, 0x6efb, 0x6f2e, 0x6f09, 0x6f4e, 0x6f19, 0x6f1a, 0x6f27, 0x6f18, 0x6f3b, 0x6f12, 0x6eed, 0x6f0a, 0x6f36, 0x6f73, 0x6ef9, 0x6eee, 0x6f2d, 0x6f40, 0x6f30, 0x6f3c, 0x6f35, 0x6eeb, 0x6f07, 0x6f0e, 0x6f43, 0x6f05, 0x6efd, 0x6ef6, 0x6f39, 0x6f1c, 0x6efc, 0x6f3a, 0x6f1f, 0x6f0d, 0x6f1e, 0x6f08, 0x6f21, 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718f, 0x717b, 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, 0x734d, 0x7351, 0x734c, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, 0x7467, 0x746e, 0x7500, 0x7502, 0x7503, 0x757d, 0x7590, 0x7616, 0x7608, 0x760c, 0x7615, 0x7611, 0x760a, 0x7614, 0x76b8, 0x7781, 0x777c, 0x7785, 0x7782, 0x776e, 0x7780, 0x776f, 0x777e, 0x7783, 0x78b2, 0x78aa, 0x78b4, 0x78ad, 0x78a8, 0x787e, 0x78ab, 0x789e, 0x78a5, 0x78a0, 0x78ac, 0x78a2, 0x78a4, 0x7998, 0x798a, 0x798b, 0x7996, 0x7995, 0x7994, 0x7993, /* 0xe3 */ 0x7997, 0x7988, 0x7992, 0x7990, 0x7a2b, 0x7a4a, 0x7a30, 0x7a2f, 0x7a28, 0x7a26, 0x7aa8, 0x7aab, 0x7aac, 0x7aee, 0x7b88, 0x7b9c, 0x7b8a, 0x7b91, 0x7b90, 0x7b96, 0x7b8d, 0x7b8c, 0x7b9b, 0x7b8e, 0x7b85, 0x7b98, 0x5284, 0x7b99, 0x7ba4, 0x7b82, 0x7cbb, 0x7cbf, 0x7cbc, 0x7cba, 0x7da7, 0x7db7, 0x7dc2, 0x7da3, 0x7daa, 0x7dc1, 0x7dc0, 0x7dc5, 0x7d9d, 0x7dce, 0x7dc4, 0x7dc6, 0x7dcb, 0x7dcc, 0x7daf, 0x7db9, 0x7d96, 0x7dbc, 0x7d9f, 0x7da6, 0x7dae, 0x7da9, 0x7da1, 0x7dc9, 0x7f73, 0x7fe2, 0x7fe3, 0x7fe5, 0x7fde, 0x8024, 0x805d, 0x805c, 0x8189, 0x8186, 0x8183, 0x8187, 0x818d, 0x818c, 0x818b, 0x8215, 0x8497, 0x84a4, 0x84a1, 0x849f, 0x84ba, 0x84ce, 0x84c2, 0x84ac, 0x84ae, 0x84ab, 0x84b9, 0x84b4, 0x84c1, 0x84cd, 0x84aa, 0x849a, 0x84b1, 0x84d0, 0x849d, 0x84a7, 0x84bb, 0x84a2, 0x8494, 0x84c7, 0x84cc, 0x849b, 0x84a9, 0x84af, 0x84a8, 0x84d6, 0x8498, 0x84b6, 0x84cf, 0x84a0, 0x84d7, 0x84d4, 0x84d2, 0x84db, 0x84b0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, 0x876b, 0x8740, 0x872e, 0x871e, 0x8721, 0x8719, 0x871b, 0x8743, 0x872c, 0x8741, 0x873e, 0x8746, 0x8720, 0x8732, 0x872a, 0x872d, 0x873c, 0x8712, 0x873a, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, 0x8738, 0x8724, 0x871a, 0x8730, 0x8711, 0x88f7, 0x88e7, 0x88f1, 0x88f2, 0x88fa, 0x88fe, 0x88ee, 0x88fc, 0x88f6, 0x88fb, /* 0xe4 */ 0x88f0, 0x88ec, 0x88eb, 0x899d, 0x89a1, 0x899f, 0x899e, 0x89e9, 0x89eb, 0x89e8, 0x8aab, 0x8a99, 0x8a8b, 0x8a92, 0x8a8f, 0x8a96, 0x8c3d, 0x8c68, 0x8c69, 0x8cd5, 0x8ccf, 0x8cd7, 0x8d96, 0x8e09, 0x8e02, 0x8dff, 0x8e0d, 0x8dfd, 0x8e0a, 0x8e03, 0x8e07, 0x8e06, 0x8e05, 0x8dfe, 0x8e00, 0x8e04, 0x8f10, 0x8f11, 0x8f0e, 0x8f0d, 0x9123, 0x911c, 0x9120, 0x9122, 0x911f, 0x911d, 0x911a, 0x9124, 0x9121, 0x911b, 0x917a, 0x9172, 0x9179, 0x9173, 0x92a5, 0x92a4, 0x9276, 0x929b, 0x927a, 0x92a0, 0x9294, 0x92aa, 0x928d, 0x92a6, 0x929a, 0x92ab, 0x9279, 0x9297, 0x927f, 0x92a3, 0x92ee, 0x928e, 0x9282, 0x9295, 0x92a2, 0x927d, 0x9288, 0x92a1, 0x928a, 0x9286, 0x928c, 0x9299, 0x92a7, 0x927e, 0x9287, 0x92a9, 0x929d, 0x928b, 0x922d, 0x969e, 0x96a1, 0x96ff, 0x9758, 0x977d, 0x977a, 0x977e, 0x9783, 0x9780, 0x9782, 0x977b, 0x9784, 0x9781, 0x977f, 0x97ce, 0x97cd, 0x9816, 0x98ad, 0x98ae, 0x9902, 0x9900, 0x9907, 0x999d, 0x999c, 0x99c3, 0x99b9, 0x99bb, 0x99ba, 0x99c2, 0x99bd, 0x99c7, 0x9ab1, 0x9ae3, 0x9ae7, 0x9b3e, 0x9b3f, 0x9b60, 0x9b61, 0x9b5f, 0x9cf1, 0x9cf2, 0x9cf5, 0x9ea7, 0x50ff, 0x5103, 0x5130, 0x50f8, 0x5106, 0x5107, 0x50f6, 0x50fe, 0x510b, 0x510c, 0x50fd, 0x510a, 0x528b, 0x528c, 0x52f1, 0x52ef, 0x5648, 0x5642, 0x564c, 0x5635, 0x5641, 0x564a, 0x5649, 0x5646, 0x5658, /* 0xe5 */ 0x565a, 0x5640, 0x5633, 0x563d, 0x562c, 0x563e, 0x5638, 0x562a, 0x563a, 0x571a, 0x58ab, 0x589d, 0x58b1, 0x58a0, 0x58a3, 0x58af, 0x58ac, 0x58a5, 0x58a1, 0x58ff, 0x5aff, 0x5af4, 0x5afd, 0x5af7, 0x5af6, 0x5b03, 0x5af8, 0x5b02, 0x5af9, 0x5b01, 0x5b07, 0x5b05, 0x5b0f, 0x5c67, 0x5d99, 0x5d97, 0x5d9f, 0x5d92, 0x5da2, 0x5d93, 0x5d95, 0x5da0, 0x5d9c, 0x5da1, 0x5d9a, 0x5d9e, 0x5e69, 0x5e5d, 0x5e60, 0x5e5c, 0x7df3, 0x5edb, 0x5ede, 0x5ee1, 0x5f49, 0x5fb2, 0x618b, 0x6183, 0x6179, 0x61b1, 0x61b0, 0x61a2, 0x6189, 0x619b, 0x6193, 0x61af, 0x61ad, 0x619f, 0x6192, 0x61aa, 0x61a1, 0x618d, 0x6166, 0x61b3, 0x622d, 0x646e, 0x6470, 0x6496, 0x64a0, 0x6485, 0x6497, 0x649c, 0x648f, 0x648b, 0x648a, 0x648c, 0x64a3, 0x649f, 0x6468, 0x64b1, 0x6498, 0x6576, 0x657a, 0x6579, 0x657b, 0x65b2, 0x65b3, 0x66b5, 0x66b0, 0x66a9, 0x66b2, 0x66b7, 0x66aa, 0x66af, 0x6a00, 0x6a06, 0x6a17, 0x69e5, 0x69f8, 0x6a15, 0x69f1, 0x69e4, 0x6a20, 0x69ff, 0x69ec, 0x69e2, 0x6a1b, 0x6a1d, 0x69fe, 0x6a27, 0x69f2, 0x69ee, 0x6a14, 0x69f7, 0x69e7, 0x6a40, 0x6a08, 0x69e6, 0x69fb, 0x6a0d, 0x69fc, 0x69eb, 0x6a09, 0x6a04, 0x6a18, 0x6a25, 0x6a0f, 0x69f6, 0x6a26, 0x6a07, 0x69f4, 0x6a16, 0x6b51, 0x6ba5, 0x6ba3, 0x6ba2, 0x6ba6, 0x6c01, 0x6c00, 0x6bff, 0x6c02, 0x6f41, 0x6f26, 0x6f7e, 0x6f87, 0x6fc6, 0x6f92, /* 0xe6 */ 0x6f8d, 0x6f89, 0x6f8c, 0x6f62, 0x6f4f, 0x6f85, 0x6f5a, 0x6f96, 0x6f76, 0x6f6c, 0x6f82, 0x6f55, 0x6f72, 0x6f52, 0x6f50, 0x6f57, 0x6f94, 0x6f93, 0x6f5d, 0x6f00, 0x6f61, 0x6f6b, 0x6f7d, 0x6f67, 0x6f90, 0x6f53, 0x6f8b, 0x6f69, 0x6f7f, 0x6f95, 0x6f63, 0x6f77, 0x6f6a, 0x6f7b, 0x71b2, 0x71af, 0x719b, 0x71b0, 0x71a0, 0x719a, 0x71a9, 0x71b5, 0x719d, 0x71a5, 0x719e, 0x71a4, 0x71a1, 0x71aa, 0x719c, 0x71a7, 0x71b3, 0x7298, 0x729a, 0x7358, 0x7352, 0x735e, 0x735f, 0x7360, 0x735d, 0x735b, 0x7361, 0x735a, 0x7359, 0x7362, 0x7487, 0x7489, 0x748a, 0x7486, 0x7481, 0x747d, 0x7485, 0x7488, 0x747c, 0x7479, 0x7508, 0x7507, 0x757e, 0x7625, 0x761e, 0x7619, 0x761d, 0x761c, 0x7623, 0x761a, 0x7628, 0x761b, 0x769c, 0x769d, 0x769e, 0x769b, 0x778d, 0x778f, 0x7789, 0x7788, 0x78cd, 0x78bb, 0x78cf, 0x78cc, 0x78d1, 0x78ce, 0x78d4, 0x78c8, 0x78c3, 0x78c4, 0x78c9, 0x799a, 0x79a1, 0x79a0, 0x799c, 0x79a2, 0x799b, 0x6b76, 0x7a39, 0x7ab2, 0x7ab4, 0x7ab3, 0x7bb7, 0x7bcb, 0x7bbe, 0x7bac, 0x7bce, 0x7baf, 0x7bb9, 0x7bca, 0x7bb5, 0x7cc5, 0x7cc8, 0x7ccc, 0x7ccb, 0x7df7, 0x7ddb, 0x7dea, 0x7de7, 0x7dd7, 0x7de1, 0x7e03, 0x7dfa, 0x7de6, 0x7df6, 0x7df1, 0x7df0, 0x7dee, 0x7ddf, 0x7f76, 0x7fac, 0x7fb0, 0x7fad, 0x7fed, 0x7feb, 0x7fea, 0x7fec, 0x7fe6, 0x7fe8, 0x8064, 0x8067, 0x81a3, 0x819f, /* 0xe7 */ 0x819e, 0x8195, 0x81a2, 0x8199, 0x8197, 0x8216, 0x824f, 0x8253, 0x8252, 0x8250, 0x824e, 0x8251, 0x8524, 0x853b, 0x850f, 0x8500, 0x8529, 0x850e, 0x8509, 0x850d, 0x851f, 0x850a, 0x8527, 0x851c, 0x84fb, 0x852b, 0x84fa, 0x8508, 0x850c, 0x84f4, 0x852a, 0x84f2, 0x8515, 0x84f7, 0x84eb, 0x84f3, 0x84fc, 0x8512, 0x84ea, 0x84e9, 0x8516, 0x84fe, 0x8528, 0x851d, 0x852e, 0x8502, 0x84fd, 0x851e, 0x84f6, 0x8531, 0x8526, 0x84e7, 0x84e8, 0x84f0, 0x84ef, 0x84f9, 0x8518, 0x8520, 0x8530, 0x850b, 0x8519, 0x852f, 0x8662, 0x8756, 0x8763, 0x8764, 0x8777, 0x87e1, 0x8773, 0x8758, 0x8754, 0x875b, 0x8752, 0x8761, 0x875a, 0x8751, 0x875e, 0x876d, 0x876a, 0x8750, 0x874e, 0x875f, 0x875d, 0x876f, 0x876c, 0x877a, 0x876e, 0x875c, 0x8765, 0x874f, 0x877b, 0x8775, 0x8762, 0x8767, 0x8769, 0x885a, 0x8905, 0x890c, 0x8914, 0x890b, 0x8917, 0x8918, 0x8919, 0x8906, 0x8916, 0x8911, 0x890e, 0x8909, 0x89a2, 0x89a4, 0x89a3, 0x89ed, 0x89f0, 0x89ec, 0x8acf, 0x8ac6, 0x8ab8, 0x8ad3, 0x8ad1, 0x8ad4, 0x8ad5, 0x8abb, 0x8ad7, 0x8abe, 0x8ac0, 0x8ac5, 0x8ad8, 0x8ac3, 0x8aba, 0x8abd, 0x8ad9, 0x8c3e, 0x8c4d, 0x8c8f, 0x8ce5, 0x8cdf, 0x8cd9, 0x8ce8, 0x8cda, 0x8cdd, 0x8ce7, 0x8da0, 0x8d9c, 0x8da1, 0x8d9b, 0x8e20, 0x8e23, 0x8e25, 0x8e24, 0x8e2e, 0x8e15, 0x8e1b, 0x8e16, 0x8e11, 0x8e19, 0x8e26, 0x8e27, /* 0xe8 */ 0x8e14, 0x8e12, 0x8e18, 0x8e13, 0x8e1c, 0x8e17, 0x8e1a, 0x8f2c, 0x8f24, 0x8f18, 0x8f1a, 0x8f20, 0x8f23, 0x8f16, 0x8f17, 0x9073, 0x9070, 0x906f, 0x9067, 0x906b, 0x912f, 0x912b, 0x9129, 0x912a, 0x9132, 0x9126, 0x912e, 0x9185, 0x9186, 0x918a, 0x9181, 0x9182, 0x9184, 0x9180, 0x92d0, 0x92c3, 0x92c4, 0x92c0, 0x92d9, 0x92b6, 0x92cf, 0x92f1, 0x92df, 0x92d8, 0x92e9, 0x92d7, 0x92dd, 0x92cc, 0x92ef, 0x92c2, 0x92e8, 0x92ca, 0x92c8, 0x92ce, 0x92e6, 0x92cd, 0x92d5, 0x92c9, 0x92e0, 0x92de, 0x92e7, 0x92d1, 0x92d3, 0x92b5, 0x92e1, 0x92c6, 0x92b4, 0x957c, 0x95ac, 0x95ab, 0x95ae, 0x95b0, 0x96a4, 0x96a2, 0x96d3, 0x9705, 0x9708, 0x9702, 0x975a, 0x978a, 0x978e, 0x9788, 0x97d0, 0x97cf, 0x981e, 0x981d, 0x9826, 0x9829, 0x9828, 0x9820, 0x981b, 0x9827, 0x98b2, 0x9908, 0x98fa, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99dc, 0x99cd, 0x99cf, 0x99d3, 0x99d4, 0x99ce, 0x99c9, 0x99d6, 0x99d8, 0x99cb, 0x99d7, 0x99cc, 0x9ab3, 0x9aec, 0x9aeb, 0x9af3, 0x9af2, 0x9af1, 0x9b46, 0x9b43, 0x9b67, 0x9b74, 0x9b71, 0x9b66, 0x9b76, 0x9b75, 0x9b70, 0x9b68, 0x9b64, 0x9b6c, 0x9cfc, 0x9cfa, 0x9cfd, 0x9cff, 0x9cf7, 0x9d07, 0x9d00, 0x9cf9, 0x9cfb, 0x9d08, 0x9d05, 0x9d04, 0x9e83, 0x9ed3, 0x9f0f, 0x9f10, 0x511c, 0x5113, 0x5117, 0x511a, 0x5111, 0x51de, 0x5334, 0x53e1, 0x5670, 0x5660, 0x566e, /* 0xe9 */ 0x5673, 0x5666, 0x5663, 0x566d, 0x5672, 0x565e, 0x5677, 0x571c, 0x571b, 0x58c8, 0x58bd, 0x58c9, 0x58bf, 0x58ba, 0x58c2, 0x58bc, 0x58c6, 0x5b17, 0x5b19, 0x5b1b, 0x5b21, 0x5b14, 0x5b13, 0x5b10, 0x5b16, 0x5b28, 0x5b1a, 0x5b20, 0x5b1e, 0x5bef, 0x5dac, 0x5db1, 0x5da9, 0x5da7, 0x5db5, 0x5db0, 0x5dae, 0x5daa, 0x5da8, 0x5db2, 0x5dad, 0x5daf, 0x5db4, 0x5e67, 0x5e68, 0x5e66, 0x5e6f, 0x5ee9, 0x5ee7, 0x5ee6, 0x5ee8, 0x5ee5, 0x5f4b, 0x5fbc, 0x619d, 0x61a8, 0x6196, 0x61c5, 0x61b4, 0x61c6, 0x61c1, 0x61cc, 0x61ba, 0x61bf, 0x61b8, 0x618c, 0x64d7, 0x64d6, 0x64d0, 0x64cf, 0x64c9, 0x64bd, 0x6489, 0x64c3, 0x64db, 0x64f3, 0x64d9, 0x6533, 0x657f, 0x657c, 0x65a2, 0x66c8, 0x66be, 0x66c0, 0x66ca, 0x66cb, 0x66cf, 0x66bd, 0x66bb, 0x66ba, 0x66cc, 0x6723, 0x6a34, 0x6a66, 0x6a49, 0x6a67, 0x6a32, 0x6a68, 0x6a3e, 0x6a5d, 0x6a6d, 0x6a76, 0x6a5b, 0x6a51, 0x6a28, 0x6a5a, 0x6a3b, 0x6a3f, 0x6a41, 0x6a6a, 0x6a64, 0x6a50, 0x6a4f, 0x6a54, 0x6a6f, 0x6a69, 0x6a60, 0x6a3c, 0x6a5e, 0x6a56, 0x6a55, 0x6a4d, 0x6a4e, 0x6a46, 0x6b55, 0x6b54, 0x6b56, 0x6ba7, 0x6baa, 0x6bab, 0x6bc8, 0x6bc7, 0x6c04, 0x6c03, 0x6c06, 0x6fad, 0x6fcb, 0x6fa3, 0x6fc7, 0x6fbc, 0x6fce, 0x6fc8, 0x6f5e, 0x6fc4, 0x6fbd, 0x6f9e, 0x6fca, 0x6fa8, 0x7004, 0x6fa5, 0x6fae, 0x6fba, 0x6fac, 0x6faa, 0x6fcf, 0x6fbf, 0x6fb8, /* 0xea */ 0x6fa2, 0x6fc9, 0x6fab, 0x6fcd, 0x6faf, 0x6fb2, 0x6fb0, 0x71c5, 0x71c2, 0x71bf, 0x71b8, 0x71d6, 0x71c0, 0x71c1, 0x71cb, 0x71d4, 0x71ca, 0x71c7, 0x71cf, 0x71bd, 0x71d8, 0x71bc, 0x71c6, 0x71da, 0x71db, 0x729d, 0x729e, 0x7369, 0x7366, 0x7367, 0x736c, 0x7365, 0x736b, 0x736a, 0x747f, 0x749a, 0x74a0, 0x7494, 0x7492, 0x7495, 0x74a1, 0x750b, 0x7580, 0x762f, 0x762d, 0x7631, 0x763d, 0x7633, 0x763c, 0x7635, 0x7632, 0x7630, 0x76bb, 0x76e6, 0x779a, 0x779d, 0x77a1, 0x779c, 0x779b, 0x77a2, 0x77a3, 0x7795, 0x7799, 0x7797, 0x78dd, 0x78e9, 0x78e5, 0x78ea, 0x78de, 0x78e3, 0x78db, 0x78e1, 0x78e2, 0x78ed, 0x78df, 0x78e0, 0x79a4, 0x7a44, 0x7a48, 0x7a47, 0x7ab6, 0x7ab8, 0x7ab5, 0x7ab1, 0x7ab7, 0x7bde, 0x7be3, 0x7be7, 0x7bdd, 0x7bd5, 0x7be5, 0x7bda, 0x7be8, 0x7bf9, 0x7bd4, 0x7bea, 0x7be2, 0x7bdc, 0x7beb, 0x7bd8, 0x7bdf, 0x7cd2, 0x7cd4, 0x7cd7, 0x7cd0, 0x7cd1, 0x7e12, 0x7e21, 0x7e17, 0x7e0c, 0x7e1f, 0x7e20, 0x7e13, 0x7e0e, 0x7e1c, 0x7e15, 0x7e1a, 0x7e22, 0x7e0b, 0x7e0f, 0x7e16, 0x7e0d, 0x7e14, 0x7e25, 0x7e24, 0x7f43, 0x7f7b, 0x7f7c, 0x7f7a, 0x7fb1, 0x7fef, 0x802a, 0x8029, 0x806c, 0x81b1, 0x81a6, 0x81ae, 0x81b9, 0x81b5, 0x81ab, 0x81b0, 0x81ac, 0x81b4, 0x81b2, 0x81b7, 0x81a7, 0x81f2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856b, 0x854d, 0x8553, 0x8561, 0x8558, /* 0xeb */ 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853e, 0x855b, 0x8571, 0x854e, 0x856e, 0x8575, 0x8555, 0x8567, 0x8560, 0x858c, 0x8566, 0x855d, 0x8554, 0x8565, 0x856c, 0x8663, 0x8665, 0x8664, 0x879b, 0x878f, 0x8797, 0x8793, 0x8792, 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87a3, 0x8785, 0x8790, 0x8791, 0x879d, 0x8784, 0x8794, 0x879c, 0x879a, 0x8789, 0x891e, 0x8926, 0x8930, 0x892d, 0x892e, 0x8927, 0x8931, 0x8922, 0x8929, 0x8923, 0x892f, 0x892c, 0x891f, 0x89f1, 0x8ae0, 0x8ae2, 0x8af2, 0x8af4, 0x8af5, 0x8add, 0x8b14, 0x8ae4, 0x8adf, 0x8af0, 0x8ac8, 0x8ade, 0x8ae1, 0x8ae8, 0x8aff, 0x8aef, 0x8afb, 0x8c91, 0x8c92, 0x8c90, 0x8cf5, 0x8cee, 0x8cf1, 0x8cf0, 0x8cf3, 0x8d6c, 0x8d6e, 0x8da5, 0x8da7, 0x8e33, 0x8e3e, 0x8e38, 0x8e40, 0x8e45, 0x8e36, 0x8e3c, 0x8e3d, 0x8e41, 0x8e30, 0x8e3f, 0x8ebd, 0x8f36, 0x8f2e, 0x8f35, 0x8f32, 0x8f39, 0x8f37, 0x8f34, 0x9076, 0x9079, 0x907b, 0x9086, 0x90fa, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191, 0x918d, 0x918f, 0x9327, 0x931e, 0x9308, 0x931f, 0x9306, 0x930f, 0x937a, 0x9338, 0x933c, 0x931b, 0x9323, 0x9312, 0x9301, 0x9346, 0x932d, 0x930e, 0x930d, 0x92cb, 0x931d, 0x92fa, 0x9325, 0x9313, 0x92f9, 0x92f7, 0x9334, 0x9302, 0x9324, 0x92ff, 0x9329, 0x9339, 0x9335, 0x932a, 0x9314, 0x930c, /* 0xec */ 0x930b, 0x92fe, 0x9309, 0x9300, 0x92fb, 0x9316, 0x95bc, 0x95cd, 0x95be, 0x95b9, 0x95ba, 0x95b6, 0x95bf, 0x95b5, 0x95bd, 0x96a9, 0x96d4, 0x970b, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97f0, 0x97f8, 0x9835, 0x982f, 0x9832, 0x9924, 0x991f, 0x9927, 0x9929, 0x999e, 0x99ee, 0x99ec, 0x99e5, 0x99e4, 0x99f0, 0x99e3, 0x99ea, 0x99e9, 0x99e7, 0x9ab9, 0x9abf, 0x9ab4, 0x9abb, 0x9af6, 0x9afa, 0x9af9, 0x9af7, 0x9b33, 0x9b80, 0x9b85, 0x9b87, 0x9b7c, 0x9b7e, 0x9b7b, 0x9b82, 0x9b93, 0x9b92, 0x9b90, 0x9b7a, 0x9b95, 0x9b7d, 0x9b88, 0x9d25, 0x9d17, 0x9d20, 0x9d1e, 0x9d14, 0x9d29, 0x9d1d, 0x9d18, 0x9d22, 0x9d10, 0x9d19, 0x9d1f, 0x9e88, 0x9e86, 0x9e87, 0x9eae, 0x9ead, 0x9ed5, 0x9ed6, 0x9efa, 0x9f12, 0x9f3d, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52f4, 0x5693, 0x568c, 0x568d, 0x5686, 0x5684, 0x5683, 0x567e, 0x5682, 0x567f, 0x5681, 0x58d6, 0x58d4, 0x58cf, 0x58d2, 0x5b2d, 0x5b25, 0x5b32, 0x5b23, 0x5b2c, 0x5b27, 0x5b26, 0x5b2f, 0x5b2e, 0x5b7b, 0x5bf1, 0x5bf2, 0x5db7, 0x5e6c, 0x5e6a, 0x5fbe, 0x5fbb, 0x61c3, 0x61b5, 0x61bc, 0x61e7, 0x61e0, 0x61e5, 0x61e4, 0x61e8, 0x61de, 0x64ef, 0x64e9, 0x64e3, 0x64eb, 0x64e4, 0x64e8, 0x6581, 0x6580, 0x65b6, 0x65da, 0x66d2, 0x6a8d, 0x6a96, 0x6a81, 0x6aa5, 0x6a89, 0x6a9f, 0x6a9b, 0x6aa1, 0x6a9e, 0x6a87, 0x6a93, 0x6a8e, /* 0xed */ 0x6a95, 0x6a83, 0x6aa8, 0x6aa4, 0x6a91, 0x6a7f, 0x6aa6, 0x6a9a, 0x6a85, 0x6a8c, 0x6a92, 0x6b5b, 0x6bad, 0x6c09, 0x6fcc, 0x6fa9, 0x6ff4, 0x6fd4, 0x6fe3, 0x6fdc, 0x6fed, 0x6fe7, 0x6fe6, 0x6fde, 0x6ff2, 0x6fdd, 0x6fe2, 0x6fe8, 0x71e1, 0x71f1, 0x71e8, 0x71f2, 0x71e4, 0x71f0, 0x71e2, 0x7373, 0x736e, 0x736f, 0x7497, 0x74b2, 0x74ab, 0x7490, 0x74aa, 0x74ad, 0x74b1, 0x74a5, 0x74af, 0x7510, 0x7511, 0x7512, 0x750f, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, 0x76a4, 0x76e9, 0x77b5, 0x77ab, 0x77b2, 0x77b7, 0x77b6, 0x77b4, 0x77b1, 0x77a8, 0x77f0, 0x78f3, 0x78fd, 0x7902, 0x78fb, 0x78fc, 0x78f2, 0x7905, 0x78f9, 0x78fe, 0x7904, 0x79ab, 0x79a8, 0x7a5c, 0x7a5b, 0x7a56, 0x7a58, 0x7a54, 0x7a5a, 0x7abe, 0x7ac0, 0x7ac1, 0x7c05, 0x7c0f, 0x7bf2, 0x7c00, 0x7bff, 0x7bfb, 0x7c0e, 0x7bf4, 0x7c0b, 0x7bf3, 0x7c02, 0x7c09, 0x7c03, 0x7c01, 0x7bf8, 0x7bfd, 0x7c06, 0x7bf0, 0x7bf1, 0x7c10, 0x7c0a, 0x7ce8, 0x7e2d, 0x7e3c, 0x7e42, 0x7e33, 0x9848, 0x7e38, 0x7e2a, 0x7e49, 0x7e40, 0x7e47, 0x7e29, 0x7e4c, 0x7e30, 0x7e3b, 0x7e36, 0x7e44, 0x7e3a, 0x7f45, 0x7f7f, 0x7f7e, 0x7f7d, 0x7ff4, 0x7ff2, 0x802c, 0x81bb, 0x81c4, 0x81cc, 0x81ca, 0x81c5, 0x81c7, 0x81bc, 0x81e9, 0x825b, 0x825a, 0x825c, 0x8583, 0x8580, 0x858f, 0x85a7, 0x8595, 0x85a0, 0x858b, 0x85a3, 0x857b, 0x85a4, 0x859a, 0x859e, /* 0xee */ 0x8577, 0x857c, 0x8589, 0x85a1, 0x857a, 0x8578, 0x8557, 0x858e, 0x8596, 0x8586, 0x858d, 0x8599, 0x859d, 0x8581, 0x85a2, 0x8582, 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859f, 0x8668, 0x87be, 0x87aa, 0x87ad, 0x87c5, 0x87b0, 0x87ac, 0x87b9, 0x87b5, 0x87bc, 0x87ae, 0x87c9, 0x87c3, 0x87c2, 0x87cc, 0x87b7, 0x87af, 0x87c4, 0x87ca, 0x87b4, 0x87b6, 0x87bf, 0x87b8, 0x87bd, 0x87de, 0x87b2, 0x8935, 0x8933, 0x893c, 0x893e, 0x8941, 0x8952, 0x8937, 0x8942, 0x89ad, 0x89af, 0x89ae, 0x89f2, 0x89f3, 0x8b1e, 0x8b18, 0x8b16, 0x8b11, 0x8b05, 0x8b0b, 0x8b22, 0x8b0f, 0x8b12, 0x8b15, 0x8b07, 0x8b0d, 0x8b08, 0x8b06, 0x8b1c, 0x8b13, 0x8b1a, 0x8c4f, 0x8c70, 0x8c72, 0x8c71, 0x8c6f, 0x8c95, 0x8c94, 0x8cf9, 0x8d6f, 0x8e4e, 0x8e4d, 0x8e53, 0x8e50, 0x8e4c, 0x8e47, 0x8f43, 0x8f40, 0x9085, 0x907e, 0x9138, 0x919a, 0x91a2, 0x919b, 0x9199, 0x919f, 0x91a1, 0x919d, 0x91a0, 0x93a1, 0x9383, 0x93af, 0x9364, 0x9356, 0x9347, 0x937c, 0x9358, 0x935c, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, 0x936d, 0x938f, 0x934c, 0x936a, 0x9379, 0x9357, 0x9355, 0x9352, 0x934f, 0x9371, 0x9377, 0x937b, 0x9361, 0x935e, 0x9363, 0x9367, 0x9380, 0x934e, 0x9359, 0x95c7, 0x95c0, 0x95c9, 0x95c3, 0x95c5, 0x95b7, 0x96ae, 0x96b0, 0x96ac, 0x9720, 0x971f, 0x9718, 0x971d, 0x9719, 0x979a, 0x97a1, 0x979c, /* 0xef */ 0x979e, 0x979d, 0x97d5, 0x97d4, 0x97f1, 0x9841, 0x9844, 0x984a, 0x9849, 0x9845, 0x9843, 0x9925, 0x992b, 0x992c, 0x992a, 0x9933, 0x9932, 0x992f, 0x992d, 0x9931, 0x9930, 0x9998, 0x99a3, 0x99a1, 0x9a02, 0x99fa, 0x99f4, 0x99f7, 0x99f9, 0x99f8, 0x99f6, 0x99fb, 0x99fd, 0x99fe, 0x99fc, 0x9a03, 0x9abe, 0x9afe, 0x9afd, 0x9b01, 0x9afc, 0x9b48, 0x9b9a, 0x9ba8, 0x9b9e, 0x9b9b, 0x9ba6, 0x9ba1, 0x9ba5, 0x9ba4, 0x9b86, 0x9ba2, 0x9ba0, 0x9baf, 0x9d33, 0x9d41, 0x9d67, 0x9d36, 0x9d2e, 0x9d2f, 0x9d31, 0x9d38, 0x9d30, 0x9d45, 0x9d42, 0x9d43, 0x9d3e, 0x9d37, 0x9d40, 0x9d3d, 0x7ff5, 0x9d2d, 0x9e8a, 0x9e89, 0x9e8d, 0x9eb0, 0x9ec8, 0x9eda, 0x9efb, 0x9eff, 0x9f24, 0x9f23, 0x9f22, 0x9f54, 0x9fa0, 0x5131, 0x512d, 0x512e, 0x5698, 0x569c, 0x5697, 0x569a, 0x569d, 0x5699, 0x5970, 0x5b3c, 0x5c69, 0x5c6a, 0x5dc0, 0x5e6d, 0x5e6e, 0x61d8, 0x61df, 0x61ed, 0x61ee, 0x61f1, 0x61ea, 0x61f0, 0x61eb, 0x61d6, 0x61e9, 0x64ff, 0x6504, 0x64fd, 0x64f8, 0x6501, 0x6503, 0x64fc, 0x6594, 0x65db, 0x66da, 0x66db, 0x66d8, 0x6ac5, 0x6ab9, 0x6abd, 0x6ae1, 0x6ac6, 0x6aba, 0x6ab6, 0x6ab7, 0x6ac7, 0x6ab4, 0x6aad, 0x6b5e, 0x6bc9, 0x6c0b, 0x7007, 0x700c, 0x700d, 0x7001, 0x7005, 0x7014, 0x700e, 0x6fff, 0x7000, 0x6ffb, 0x7026, 0x6ffc, 0x6ff7, 0x700a, 0x7201, 0x71ff, 0x71f9, 0x7203, 0x71fd, 0x7376, /* 0xf0 */ 0x74b8, 0x74c0, 0x74b5, 0x74c1, 0x74be, 0x74b6, 0x74bb, 0x74c2, 0x7514, 0x7513, 0x765c, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, 0x765a, 0x76a6, 0x76bd, 0x76ec, 0x77c2, 0x77ba, 0x78ff, 0x790c, 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79ad, 0x79ac, 0x7a5f, 0x7c1c, 0x7c29, 0x7c19, 0x7c20, 0x7c1f, 0x7c2d, 0x7c1d, 0x7c26, 0x7c28, 0x7c22, 0x7c25, 0x7c30, 0x7e5c, 0x7e50, 0x7e56, 0x7e63, 0x7e58, 0x7e62, 0x7e5f, 0x7e51, 0x7e60, 0x7e57, 0x7e53, 0x7fb5, 0x7fb3, 0x7ff7, 0x7ff8, 0x8075, 0x81d1, 0x81d2, 0x81d0, 0x825f, 0x825e, 0x85b4, 0x85c6, 0x85c0, 0x85c3, 0x85c2, 0x85b3, 0x85b5, 0x85bd, 0x85c7, 0x85c4, 0x85bf, 0x85cb, 0x85ce, 0x85c8, 0x85c5, 0x85b1, 0x85b6, 0x85d2, 0x8624, 0x85b8, 0x85b7, 0x85be, 0x8669, 0x87e7, 0x87e6, 0x87e2, 0x87db, 0x87eb, 0x87ea, 0x87e5, 0x87df, 0x87f3, 0x87e4, 0x87d4, 0x87dc, 0x87d3, 0x87ed, 0x87d8, 0x87e3, 0x87a4, 0x87d7, 0x87d9, 0x8801, 0x87f4, 0x87e8, 0x87dd, 0x8953, 0x894b, 0x894f, 0x894c, 0x8946, 0x8950, 0x8951, 0x8949, 0x8b2a, 0x8b27, 0x8b23, 0x8b33, 0x8b30, 0x8b35, 0x8b47, 0x8b2f, 0x8b3c, 0x8b3e, 0x8b31, 0x8b25, 0x8b37, 0x8b26, 0x8b36, 0x8b2e, 0x8b24, 0x8b3b, 0x8b3d, 0x8b3a, 0x8c42, 0x8c75, 0x8c99, 0x8c98, 0x8c97, 0x8cfe, 0x8d04, 0x8d02, 0x8d00, 0x8e5c, 0x8e62, 0x8e60, 0x8e57, 0x8e56, 0x8e5e, 0x8e65, 0x8e67, /* 0xf1 */ 0x8e5b, 0x8e5a, 0x8e61, 0x8e5d, 0x8e69, 0x8e54, 0x8f46, 0x8f47, 0x8f48, 0x8f4b, 0x9128, 0x913a, 0x913b, 0x913e, 0x91a8, 0x91a5, 0x91a7, 0x91af, 0x91aa, 0x93b5, 0x938c, 0x9392, 0x93b7, 0x939b, 0x939d, 0x9389, 0x93a7, 0x938e, 0x93aa, 0x939e, 0x93a6, 0x9395, 0x9388, 0x9399, 0x939f, 0x938d, 0x93b1, 0x9391, 0x93b2, 0x93a4, 0x93a8, 0x93b4, 0x93a3, 0x93a5, 0x95d2, 0x95d3, 0x95d1, 0x96b3, 0x96d7, 0x96da, 0x5dc2, 0x96df, 0x96d8, 0x96dd, 0x9723, 0x9722, 0x9725, 0x97ac, 0x97ae, 0x97a8, 0x97ab, 0x97a4, 0x97aa, 0x97a2, 0x97a5, 0x97d7, 0x97d9, 0x97d6, 0x97d8, 0x97fa, 0x9850, 0x9851, 0x9852, 0x98b8, 0x9941, 0x993c, 0x993a, 0x9a0f, 0x9a0b, 0x9a09, 0x9a0d, 0x9a04, 0x9a11, 0x9a0a, 0x9a05, 0x9a07, 0x9a06, 0x9ac0, 0x9adc, 0x9b08, 0x9b04, 0x9b05, 0x9b29, 0x9b35, 0x9b4a, 0x9b4c, 0x9b4b, 0x9bc7, 0x9bc6, 0x9bc3, 0x9bbf, 0x9bc1, 0x9bb5, 0x9bb8, 0x9bd3, 0x9bb6, 0x9bc4, 0x9bb9, 0x9bbd, 0x9d5c, 0x9d53, 0x9d4f, 0x9d4a, 0x9d5b, 0x9d4b, 0x9d59, 0x9d56, 0x9d4c, 0x9d57, 0x9d52, 0x9d54, 0x9d5f, 0x9d58, 0x9d5a, 0x9e8e, 0x9e8c, 0x9edf, 0x9f01, 0x9f00, 0x9f16, 0x9f25, 0x9f2b, 0x9f2a, 0x9f29, 0x9f28, 0x9f4c, 0x9f55, 0x5134, 0x5135, 0x5296, 0x52f7, 0x53b4, 0x56ab, 0x56ad, 0x56a6, 0x56a7, 0x56aa, 0x56ac, 0x58da, 0x58dd, 0x58db, 0x5912, 0x5b3d, 0x5b3e, 0x5b3f, 0x5dc3, 0x5e70, /* 0xf2 */ 0x5fbf, 0x61fb, 0x6507, 0x6510, 0x650d, 0x6509, 0x650c, 0x650e, 0x6584, 0x65de, 0x65dd, 0x66de, 0x6ae7, 0x6ae0, 0x6acc, 0x6ad1, 0x6ad9, 0x6acb, 0x6adf, 0x6adc, 0x6ad0, 0x6aeb, 0x6acf, 0x6acd, 0x6ade, 0x6b60, 0x6bb0, 0x6c0c, 0x7019, 0x7027, 0x7020, 0x7016, 0x702b, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701c, 0x702a, 0x720c, 0x720a, 0x7207, 0x7202, 0x7205, 0x72a5, 0x72a6, 0x72a4, 0x72a3, 0x72a1, 0x74cb, 0x74c5, 0x74b7, 0x74c3, 0x7516, 0x7660, 0x77c9, 0x77ca, 0x77c4, 0x77f1, 0x791d, 0x791b, 0x7921, 0x791c, 0x7917, 0x791e, 0x79b0, 0x7a67, 0x7a68, 0x7c33, 0x7c3c, 0x7c39, 0x7c2c, 0x7c3b, 0x7cec, 0x7cea, 0x7e76, 0x7e75, 0x7e78, 0x7e70, 0x7e77, 0x7e6f, 0x7e7a, 0x7e72, 0x7e74, 0x7e68, 0x7f4b, 0x7f4a, 0x7f83, 0x7f86, 0x7fb7, 0x7ffd, 0x7ffe, 0x8078, 0x81d7, 0x81d5, 0x8264, 0x8261, 0x8263, 0x85eb, 0x85f1, 0x85ed, 0x85d9, 0x85e1, 0x85e8, 0x85da, 0x85d7, 0x85ec, 0x85f2, 0x85f8, 0x85d8, 0x85df, 0x85e3, 0x85dc, 0x85d1, 0x85f0, 0x85e6, 0x85ef, 0x85de, 0x85e2, 0x8800, 0x87fa, 0x8803, 0x87f6, 0x87f7, 0x8809, 0x880c, 0x880b, 0x8806, 0x87fc, 0x8808, 0x87ff, 0x880a, 0x8802, 0x8962, 0x895a, 0x895b, 0x8957, 0x8961, 0x895c, 0x8958, 0x895d, 0x8959, 0x8988, 0x89b7, 0x89b6, 0x89f6, 0x8b50, 0x8b48, 0x8b4a, 0x8b40, 0x8b53, 0x8b56, 0x8b54, 0x8b4b, 0x8b55, /* 0xf3 */ 0x8b51, 0x8b42, 0x8b52, 0x8b57, 0x8c43, 0x8c77, 0x8c76, 0x8c9a, 0x8d06, 0x8d07, 0x8d09, 0x8dac, 0x8daa, 0x8dad, 0x8dab, 0x8e6d, 0x8e78, 0x8e73, 0x8e6a, 0x8e6f, 0x8e7b, 0x8ec2, 0x8f52, 0x8f51, 0x8f4f, 0x8f50, 0x8f53, 0x8fb4, 0x9140, 0x913f, 0x91b0, 0x91ad, 0x93de, 0x93c7, 0x93cf, 0x93c2, 0x93da, 0x93d0, 0x93f9, 0x93ec, 0x93cc, 0x93d9, 0x93a9, 0x93e6, 0x93ca, 0x93d4, 0x93ee, 0x93e3, 0x93d5, 0x93c4, 0x93ce, 0x93c0, 0x93d2, 0x93e7, 0x957d, 0x95da, 0x95db, 0x96e1, 0x9729, 0x972b, 0x972c, 0x9728, 0x9726, 0x97b3, 0x97b7, 0x97b6, 0x97dd, 0x97de, 0x97df, 0x985c, 0x9859, 0x985d, 0x9857, 0x98bf, 0x98bd, 0x98bb, 0x98be, 0x9948, 0x9947, 0x9943, 0x99a6, 0x99a7, 0x9a1a, 0x9a15, 0x9a25, 0x9a1d, 0x9a24, 0x9a1b, 0x9a22, 0x9a20, 0x9a27, 0x9a23, 0x9a1e, 0x9a1c, 0x9a14, 0x9ac2, 0x9b0b, 0x9b0a, 0x9b0e, 0x9b0c, 0x9b37, 0x9bea, 0x9beb, 0x9be0, 0x9bde, 0x9be4, 0x9be6, 0x9be2, 0x9bf0, 0x9bd4, 0x9bd7, 0x9bec, 0x9bdc, 0x9bd9, 0x9be5, 0x9bd5, 0x9be1, 0x9bda, 0x9d77, 0x9d81, 0x9d8a, 0x9d84, 0x9d88, 0x9d71, 0x9d80, 0x9d78, 0x9d86, 0x9d8b, 0x9d8c, 0x9d7d, 0x9d6b, 0x9d74, 0x9d75, 0x9d70, 0x9d69, 0x9d85, 0x9d73, 0x9d7b, 0x9d82, 0x9d6f, 0x9d79, 0x9d7f, 0x9d87, 0x9d68, 0x9e94, 0x9e91, 0x9ec0, 0x9efc, 0x9f2d, 0x9f40, 0x9f41, 0x9f4d, 0x9f56, 0x9f57, 0x9f58, 0x5337, 0x56b2, /* 0xf4 */ 0x56b5, 0x56b3, 0x58e3, 0x5b45, 0x5dc6, 0x5dc7, 0x5eee, 0x5eef, 0x5fc0, 0x5fc1, 0x61f9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65df, 0x66e8, 0x66e3, 0x66e4, 0x6af3, 0x6af0, 0x6aea, 0x6ae8, 0x6af9, 0x6af1, 0x6aee, 0x6aef, 0x703c, 0x7035, 0x702f, 0x7037, 0x7034, 0x7031, 0x7042, 0x7038, 0x703f, 0x703a, 0x7039, 0x7040, 0x703b, 0x7033, 0x7041, 0x7213, 0x7214, 0x72a8, 0x737d, 0x737c, 0x74ba, 0x76ab, 0x76aa, 0x76be, 0x76ed, 0x77cc, 0x77ce, 0x77cf, 0x77cd, 0x77f2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0x79b2, 0x7a6e, 0x7a6c, 0x7a6d, 0x7af7, 0x7c49, 0x7c48, 0x7c4a, 0x7c47, 0x7c45, 0x7cee, 0x7e7b, 0x7e7e, 0x7e81, 0x7e80, 0x7fba, 0x7fff, 0x8079, 0x81db, 0x81d9, 0x820b, 0x8268, 0x8269, 0x8622, 0x85ff, 0x8601, 0x85fe, 0x861b, 0x8600, 0x85f6, 0x8604, 0x8609, 0x8605, 0x860c, 0x85fd, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816, 0x8963, 0x8966, 0x89b9, 0x89f7, 0x8b60, 0x8b6a, 0x8b5d, 0x8b68, 0x8b63, 0x8b65, 0x8b67, 0x8b6d, 0x8dae, 0x8e86, 0x8e88, 0x8e84, 0x8f59, 0x8f56, 0x8f57, 0x8f55, 0x8f58, 0x8f5a, 0x908d, 0x9143, 0x9141, 0x91b7, 0x91b5, 0x91b2, 0x91b3, 0x940b, 0x9413, 0x93fb, 0x9420, 0x940f, 0x9414, 0x93fe, 0x9415, 0x9410, 0x9428, 0x9419, 0x940d, 0x93f5, 0x9400, 0x93f7, 0x9407, 0x940e, 0x9416, 0x9412, 0x93fa, 0x9409, 0x93f8, 0x940a, 0x93ff, /* 0xf5 */ 0x93fc, 0x940c, 0x93f6, 0x9411, 0x9406, 0x95de, 0x95e0, 0x95df, 0x972e, 0x972f, 0x97b9, 0x97bb, 0x97fd, 0x97fe, 0x9860, 0x9862, 0x9863, 0x985f, 0x98c1, 0x98c2, 0x9950, 0x994e, 0x9959, 0x994c, 0x994b, 0x9953, 0x9a32, 0x9a34, 0x9a31, 0x9a2c, 0x9a2a, 0x9a36, 0x9a29, 0x9a2e, 0x9a38, 0x9a2d, 0x9ac7, 0x9aca, 0x9ac6, 0x9b10, 0x9b12, 0x9b11, 0x9c0b, 0x9c08, 0x9bf7, 0x9c05, 0x9c12, 0x9bf8, 0x9c40, 0x9c07, 0x9c0e, 0x9c06, 0x9c17, 0x9c14, 0x9c09, 0x9d9f, 0x9d99, 0x9da4, 0x9d9d, 0x9d92, 0x9d98, 0x9d90, 0x9d9b, 0x9da0, 0x9d94, 0x9d9c, 0x9daa, 0x9d97, 0x9da1, 0x9d9a, 0x9da2, 0x9da8, 0x9d9e, 0x9da3, 0x9dbf, 0x9da9, 0x9d96, 0x9da6, 0x9da7, 0x9e99, 0x9e9b, 0x9e9a, 0x9ee5, 0x9ee4, 0x9ee7, 0x9ee6, 0x9f30, 0x9f2e, 0x9f5b, 0x9f60, 0x9f5e, 0x9f5d, 0x9f59, 0x9f91, 0x513a, 0x5139, 0x5298, 0x5297, 0x56c3, 0x56bd, 0x56be, 0x5b48, 0x5b47, 0x5dcb, 0x5dcf, 0x5ef1, 0x61fd, 0x651b, 0x6b02, 0x6afc, 0x6b03, 0x6af8, 0x6b00, 0x7043, 0x7044, 0x704a, 0x7048, 0x7049, 0x7045, 0x7046, 0x721d, 0x721a, 0x7219, 0x737e, 0x7517, 0x766a, 0x77d0, 0x792d, 0x7931, 0x792f, 0x7c54, 0x7c53, 0x7cf2, 0x7e8a, 0x7e87, 0x7e88, 0x7e8b, 0x7e86, 0x7e8d, 0x7f4d, 0x7fbb, 0x8030, 0x81dd, 0x8618, 0x862a, 0x8626, 0x861f, 0x8623, 0x861c, 0x8619, 0x8627, 0x862e, 0x8621, 0x8620, 0x8629, 0x861e, 0x8625, /* 0xf6 */ 0x8829, 0x881d, 0x881b, 0x8820, 0x8824, 0x881c, 0x882b, 0x884a, 0x896d, 0x8969, 0x896e, 0x896b, 0x89fa, 0x8b79, 0x8b78, 0x8b45, 0x8b7a, 0x8b7b, 0x8d10, 0x8d14, 0x8daf, 0x8e8e, 0x8e8c, 0x8f5e, 0x8f5b, 0x8f5d, 0x9146, 0x9144, 0x9145, 0x91b9, 0x943f, 0x943b, 0x9436, 0x9429, 0x943d, 0x943c, 0x9430, 0x9439, 0x942a, 0x9437, 0x942c, 0x9440, 0x9431, 0x95e5, 0x95e4, 0x95e3, 0x9735, 0x973a, 0x97bf, 0x97e1, 0x9864, 0x98c9, 0x98c6, 0x98c0, 0x9958, 0x9956, 0x9a39, 0x9a3d, 0x9a46, 0x9a44, 0x9a42, 0x9a41, 0x9a3a, 0x9a3f, 0x9acd, 0x9b15, 0x9b17, 0x9b18, 0x9b16, 0x9b3a, 0x9b52, 0x9c2b, 0x9c1d, 0x9c1c, 0x9c2c, 0x9c23, 0x9c28, 0x9c29, 0x9c24, 0x9c21, 0x9db7, 0x9db6, 0x9dbc, 0x9dc1, 0x9dc7, 0x9dca, 0x9dcf, 0x9dbe, 0x9dc5, 0x9dc3, 0x9dbb, 0x9db5, 0x9dce, 0x9db9, 0x9dba, 0x9dac, 0x9dc8, 0x9db1, 0x9dad, 0x9dcc, 0x9db3, 0x9dcd, 0x9db2, 0x9e7a, 0x9e9c, 0x9eeb, 0x9eee, 0x9eed, 0x9f1b, 0x9f18, 0x9f1a, 0x9f31, 0x9f4e, 0x9f65, 0x9f64, 0x9f92, 0x4eb9, 0x56c6, 0x56c5, 0x56cb, 0x5971, 0x5b4b, 0x5b4c, 0x5dd5, 0x5dd1, 0x5ef2, 0x6521, 0x6520, 0x6526, 0x6522, 0x6b0b, 0x6b08, 0x6b09, 0x6c0d, 0x7055, 0x7056, 0x7057, 0x7052, 0x721e, 0x721f, 0x72a9, 0x737f, 0x74d8, 0x74d5, 0x74d9, 0x74d7, 0x766d, 0x76ad, 0x7935, 0x79b4, 0x7a70, 0x7a71, 0x7c57, 0x7c5c, 0x7c59, 0x7c5b, 0x7c5a, /* 0xf7 */ 0x7cf4, 0x7cf1, 0x7e91, 0x7f4f, 0x7f87, 0x81de, 0x826b, 0x8634, 0x8635, 0x8633, 0x862c, 0x8632, 0x8636, 0x882c, 0x8828, 0x8826, 0x882a, 0x8825, 0x8971, 0x89bf, 0x89be, 0x89fb, 0x8b7e, 0x8b84, 0x8b82, 0x8b86, 0x8b85, 0x8b7f, 0x8d15, 0x8e95, 0x8e94, 0x8e9a, 0x8e92, 0x8e90, 0x8e96, 0x8e97, 0x8f60, 0x8f62, 0x9147, 0x944c, 0x9450, 0x944a, 0x944b, 0x944f, 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973f, 0x97e3, 0x986a, 0x9869, 0x98cb, 0x9954, 0x995b, 0x9a4e, 0x9a53, 0x9a54, 0x9a4c, 0x9a4f, 0x9a48, 0x9a4a, 0x9a49, 0x9a52, 0x9a50, 0x9ad0, 0x9b19, 0x9b2b, 0x9b3b, 0x9b56, 0x9b55, 0x9c46, 0x9c48, 0x9c3f, 0x9c44, 0x9c39, 0x9c33, 0x9c41, 0x9c3c, 0x9c37, 0x9c34, 0x9c32, 0x9c3d, 0x9c36, 0x9ddb, 0x9dd2, 0x9dde, 0x9dda, 0x9dcb, 0x9dd0, 0x9ddc, 0x9dd1, 0x9ddf, 0x9de9, 0x9dd9, 0x9dd8, 0x9dd6, 0x9df5, 0x9dd5, 0x9ddd, 0x9eb6, 0x9ef0, 0x9f35, 0x9f33, 0x9f32, 0x9f42, 0x9f6b, 0x9f95, 0x9fa2, 0x513d, 0x5299, 0x58e8, 0x58e7, 0x5972, 0x5b4d, 0x5dd8, 0x882f, 0x5f4f, 0x6201, 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66eb, 0x6b11, 0x6b12, 0x6b0f, 0x6bca, 0x705b, 0x705a, 0x7222, 0x7382, 0x7381, 0x7383, 0x7670, 0x77d4, 0x7c67, 0x7c66, 0x7e95, 0x826c, 0x863a, 0x8640, 0x8639, 0x863c, 0x8631, 0x863b, 0x863e, 0x8830, 0x8832, 0x882e, 0x8833, 0x8976, 0x8974, 0x8973, 0x89fe, /* 0xf8 */ 0x8b8c, 0x8b8e, 0x8b8b, 0x8b88, 0x8c45, 0x8d19, 0x8e98, 0x8f64, 0x8f63, 0x91bc, 0x9462, 0x9455, 0x945d, 0x9457, 0x945e, 0x97c4, 0x97c5, 0x9800, 0x9a56, 0x9a59, 0x9b1e, 0x9b1f, 0x9b20, 0x9c52, 0x9c58, 0x9c50, 0x9c4a, 0x9c4d, 0x9c4b, 0x9c55, 0x9c59, 0x9c4c, 0x9c4e, 0x9dfb, 0x9df7, 0x9def, 0x9de3, 0x9deb, 0x9df8, 0x9de4, 0x9df6, 0x9de1, 0x9dee, 0x9de6, 0x9df2, 0x9df0, 0x9de2, 0x9dec, 0x9df4, 0x9df3, 0x9de8, 0x9ded, 0x9ec2, 0x9ed0, 0x9ef2, 0x9ef3, 0x9f06, 0x9f1c, 0x9f38, 0x9f37, 0x9f36, 0x9f43, 0x9f4f, 0x9f71, 0x9f70, 0x9f6e, 0x9f6f, 0x56d3, 0x56cd, 0x5b4e, 0x5c6d, 0x652d, 0x66ed, 0x66ee, 0x6b13, 0x705f, 0x7061, 0x705d, 0x7060, 0x7223, 0x74db, 0x74e5, 0x77d5, 0x7938, 0x79b7, 0x79b6, 0x7c6a, 0x7e97, 0x7f89, 0x826d, 0x8643, 0x8838, 0x8837, 0x8835, 0x884b, 0x8b94, 0x8b95, 0x8e9e, 0x8e9f, 0x8ea0, 0x8e9d, 0x91be, 0x91bd, 0x91c2, 0x946b, 0x9468, 0x9469, 0x96e5, 0x9746, 0x9743, 0x9747, 0x97c7, 0x97e5, 0x9a5e, 0x9ad5, 0x9b59, 0x9c63, 0x9c67, 0x9c66, 0x9c62, 0x9c5e, 0x9c60, 0x9e02, 0x9dfe, 0x9e07, 0x9e03, 0x9e06, 0x9e05, 0x9e00, 0x9e01, 0x9e09, 0x9dff, 0x9dfd, 0x9e04, 0x9ea0, 0x9f1e, 0x9f46, 0x9f74, 0x9f75, 0x9f76, 0x56d4, 0x652e, 0x65b8, 0x6b18, 0x6b19, 0x6b17, 0x6b1a, 0x7062, 0x7226, 0x72aa, 0x77d8, 0x77d9, 0x7939, 0x7c69, 0x7c6b, 0x7cf6, 0x7e9a, /* 0xf9 */ 0x7e98, 0x7e9b, 0x7e99, 0x81e0, 0x81e1, 0x8646, 0x8647, 0x8648, 0x8979, 0x897a, 0x897c, 0x897b, 0x89ff, 0x8b98, 0x8b99, 0x8ea5, 0x8ea4, 0x8ea3, 0x946e, 0x946d, 0x946f, 0x9471, 0x9473, 0x9749, 0x9872, 0x995f, 0x9c68, 0x9c6e, 0x9c6d, 0x9e0b, 0x9e0d, 0x9e10, 0x9e0f, 0x9e12, 0x9e11, 0x9ea1, 0x9ef5, 0x9f09, 0x9f47, 0x9f78, 0x9f7b, 0x9f7a, 0x9f79, 0x571e, 0x7066, 0x7c6f, 0x883c, 0x8db2, 0x8ea6, 0x91c3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9a60, 0x9c74, 0x9c73, 0x9c71, 0x9c75, 0x9e14, 0x9e13, 0x9ef6, 0x9f0a, 0x9fa4, 0x7068, 0x7065, 0x7cf7, 0x866a, 0x883e, 0x883d, 0x883f, 0x8b9e, 0x8c9c, 0x8ea9, 0x8ec9, 0x974b, 0x9873, 0x9874, 0x98cc, 0x9961, 0x99ab, 0x9a64, 0x9a66, 0x9a67, 0x9b24, 0x9e15, 0x9e17, 0x9f48, 0x6207, 0x6b1e, 0x7227, 0x864c, 0x8ea8, 0x9482, 0x9480, 0x9481, 0x9a69, 0x9a68, 0x9b2e, 0x9e19, 0x7229, 0x864b, 0x8b9f, 0x9483, 0x9c79, 0x9eb7, 0x7675, 0x9a6b, 0x9c7a, 0x9e1d, 0x7069, 0x706a, 0x9ea4, 0x9f7e, 0x9f49, 0x9f98, }; static int big5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0xa1 && c1 <= 0xc7) || (c1 >= 0xc9 && c1 <= 0xf9)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { unsigned int i = 157 * (c1 - 0xa1) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); unsigned short wc = 0xfffd; if (i < 6280) { if (i < 6121) wc = big5_2uni_pagea1[i]; } else { if (i < 13932) wc = big5_2uni_pagec9[i-6280]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short big5_2charset[13703] = { 0xa246, 0xa247, 0xa244, 0xa1b1, 0xa258, 0xa1d3, 0xa150, 0xa1d1, 0xa1d2, 0xa3be, 0xa3bc, 0xa3bd, 0xa3bf, 0xa3bb, 0xa344, 0xa345, 0xa346, 0xa347, 0xa348, 0xa349, 0xa34a, 0xa34b, 0xa34c, 0xa34d, 0xa34e, 0xa34f, 0xa350, 0xa351, 0xa352, 0xa353, 0xa354, 0xa355, 0xa356, 0xa357, 0xa358, 0xa359, 0xa35a, 0xa35b, 0xa35c, 0xa35d, 0xa35e, 0xa35f, 0xa360, 0xa361, 0xa362, 0xa363, 0xa364, 0xa365, 0xa366, 0xa367, 0xa368, 0xa369, 0xa36a, 0xa36b, 0xa36c, 0xa36d, 0xa36e, 0xa36f, 0xa370, 0xa371, 0xa372, 0xa373, 0xc7b3, 0xc7b1, 0xc7b2, 0xc7b4, 0xc7b5, 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, 0xc7bc, 0xc7bd, 0xc7be, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c2, 0xc7c3, 0xc7c4, 0xc7c5, 0xc7c6, 0xc7c7, 0xc7c8, 0xc7c9, 0xc7ca, 0xc7cb, 0xc7cc, 0xc7cd, 0xc7cf, 0xc7d0, 0xc7d1, 0xc7d2, 0xc7d3, 0xc7d4, 0xc7d5, 0xc7d6, 0xc7d7, 0xc7d8, 0xc7d9, 0xc7da, 0xc7db, 0xc7dc, 0xc7dd, 0xc7de, 0xc7df, 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3, 0xc7e4, 0xc7e5, 0xc7e6, 0xc7e7, 0xc7e8, 0xc7ce, 0xa156, 0xa158, 0xa1a5, 0xa1a6, 0xa1a7, 0xa1a8, 0xa145, 0xa14c, 0xa14b, 0xa1ac, 0xa1ab, 0xa1b0, 0xa1c2, 0xa24a, 0xa1c1, 0xa24b, 0xa2b9, 0xa2ba, 0xa2bb, 0xa2bc, 0xa2bd, 0xa2be, 0xa2bf, 0xa2c0, 0xa2c1, 0xa2c2, 0xa1f6, 0xa1f4, 0xa1f7, 0xa1f5, 0xa1f8, 0xa1f9, 0xa1fb, 0xa1fa, 0xa1d4, 0xa1db, 0xa1e8, 0xa1e7, 0xa1fd, 0xa1fc, 0xa1e4, 0xa1e5, 0xa1ec, 0xa1ed, 0xa1ef, 0xa1ee, 0xa1e3, 0xa1dc, 0xa1da, 0xa1dd, 0xa1d8, 0xa1d9, 0xa1e6, 0xa1e9, 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ec, 0xc7ed, 0xc7ee, 0xc7ef, 0xc7f0, 0xc7f1, 0xc7f2, 0xc7f3, 0xc7f4, 0xc7f5, 0xc7f6, 0xc7f7, 0xc7f8, 0xc7f9, 0xc7fa, 0xc7fb, 0xc7fc, 0xa277, 0xa278, 0xa27a, 0xa27b, 0xa27c, 0xa27d, 0xa275, 0xa274, 0xa273, 0xa272, 0xa271, 0xa2a4, 0xa2a5, 0xa2a7, 0xa2a6, 0xa27e, 0xa2a1, 0xa2a3, 0xa2a2, 0xa2ac, 0xa2ad, 0xa2ae, 0xa262, 0xa263, 0xa264, 0xa265, 0xa266, 0xa267, 0xa268, 0xa269, 0xa270, 0xa26f, 0xa26e, 0xa26d, 0xa26c, 0xa26b, 0xa26a, 0xa276, 0xa279, 0xa1bd, 0xa1bc, 0xa1b6, 0xa1b5, 0xa1bf, 0xa1be, 0xa1bb, 0xa1ba, 0xa1b3, 0xa1b7, 0xa1b4, 0xa2a8, 0xa2a9, 0xa2ab, 0xa2aa, 0xa1b9, 0xa1b8, 0xa1f3, 0xa1f0, 0xa1f2, 0xa1f1, 0xa140, 0xa142, 0xa143, 0xa1b2, 0xc6a4, 0xa171, 0xa172, 0xa16d, 0xa16e, 0xa175, 0xa176, 0xa179, 0xa17a, 0xa169, 0xa16a, 0xa245, 0xa165, 0xa166, 0xa1a9, 0xa1aa, 0xa2c3, 0xa2c4, 0xa2c5, 0xa2c6, 0xa2c7, 0xa2c8, 0xa2c9, 0xa2ca, 0xa2cb, 0xc6a5, 0xc6a6, 0xc6a7, 0xc6a8, 0xc6a9, 0xc6aa, 0xc6ab, 0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, 0xc6b0, 0xc6b1, 0xc6b2, 0xc6b3, 0xc6b4, 0xc6b5, 0xc6b6, 0xc6b7, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb, 0xc6bc, 0xc6bd, 0xc6be, 0xc6bf, 0xc6c0, 0xc6c1, 0xc6c2, 0xc6c3, 0xc6c4, 0xc6c5, 0xc6c6, 0xc6c7, 0xc6c8, 0xc6c9, 0xc6ca, 0xc6cb, 0xc6cc, 0xc6cd, 0xc6ce, 0xc6cf, 0xc6d0, 0xc6d1, 0xc6d2, 0xc6d3, 0xc6d4, 0xc6d5, 0xc6d6, 0xc6d7, 0xc6d8, 0xc6d9, 0xc6da, 0xc6db, 0xc6dc, 0xc6dd, 0xc6de, 0xc6df, 0xc6e0, 0xc6e1, 0xc6e2, 0xc6e3, 0xc6e4, 0xc6e5, 0xc6e6, 0xc6e7, 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb, 0xc6ec, 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f0, 0xc6f1, 0xc6f2, 0xc6f3, 0xc6f4, 0xc6f5, 0xc6f6, 0xc6f7, 0xc6a2, 0xc6a3, 0xc6f8, 0xc6f9, 0xc6fa, 0xc6fb, 0xc6fc, 0xc6fd, 0xc6fe, 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc7a1, 0xc7a2, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0xc7ac, 0xc7ad, 0xc7ae, 0xc7af, 0xc7b0, 0xc6a1, 0xa374, 0xa375, 0xa376, 0xa377, 0xa378, 0xa379, 0xa37a, 0xa37b, 0xa37c, 0xa37d, 0xa37e, 0xa3a1, 0xa3a2, 0xa3a3, 0xa3a4, 0xa3a5, 0xa3a6, 0xa3a7, 0xa3a8, 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af, 0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7, 0xa3b8, 0xa3b9, 0xa3ba, 0xa1c0, 0xa255, 0xa256, 0xa250, 0xa251, 0xa252, 0xa254, 0xa257, 0xa253, 0xa1eb, 0xa1ea, 0xa24f, 0xa440, 0xa442, 0xa443, 0xc945, 0xa456, 0xa454, 0xa457, 0xa455, 0xc946, 0xa4a3, 0xc94f, 0xc94d, 0xa4a2, 0xa4a1, 0xa542, 0xa541, 0xa540, 0xa543, 0xa4fe, 0xa5e0, 0xa5e1, 0xa8c3, 0xa458, 0xa4a4, 0xc950, 0xa4a5, 0xc963, 0xa6ea, 0xcbb1, 0xa459, 0xa4a6, 0xa544, 0xc964, 0xc940, 0xa444, 0xa45b, 0xc947, 0xa45c, 0xa4a7, 0xa545, 0xa547, 0xa546, 0xa5e2, 0xa5e3, 0xa8c4, 0xadbc, 0xa441, 0xc941, 0xa445, 0xa45e, 0xa45d, 0xa5e4, 0xa8c5, 0xb0ae, 0xd44b, 0xb6c3, 0xdcb1, 0xdcb2, 0xa446, 0xa4a9, 0xa8c6, 0xa447, 0xc948, 0xa45f, 0xa4aa, 0xa4ac, 0xc951, 0xa4ad, 0xa4ab, 0xa5e5, 0xa8c7, 0xa8c8, 0xab45, 0xa460, 0xa4ae, 0xa5e6, 0xa5e8, 0xa5e7, 0xa6eb, 0xa8c9, 0xa8ca, 0xab46, 0xab47, 0xadbd, 0xdcb3, 0xf6d6, 0xa448, 0xa4b0, 0xa4af, 0xc952, 0xa4b1, 0xa4b7, 0xa4b2, 0xa4b3, 0xc954, 0xc953, 0xa4b5, 0xa4b6, 0xa4b4, 0xa54a, 0xa54b, 0xa54c, 0xa54d, 0xa549, 0xa550, 0xc96a, 0xc966, 0xc969, 0xa551, 0xa561, 0xc968, 0xa54e, 0xa54f, 0xa548, 0xc965, 0xc967, 0xa5f5, 0xc9b0, 0xa5f2, 0xa5f6, 0xc9ba, 0xc9ae, 0xa5f3, 0xc9b2, 0xa5f4, 0xa5f7, 0xa5e9, 0xc9b1, 0xa5f8, 0xc9b5, 0xc9b9, 0xc9b6, 0xc9b3, 0xa5ea, 0xa5ec, 0xa5f9, 0xa5ee, 0xc9ab, 0xa5f1, 0xa5ef, 0xa5f0, 0xc9bb, 0xc9b8, 0xc9af, 0xa5ed, 0xc9ac, 0xa5eb, 0xc9b4, 0xc9b7, 0xc9ad, 0xca66, 0xa742, 0xa6f4, 0xca67, 0xa6f1, 0xa744, 0xa6f9, 0xa6f8, 0xca5b, 0xa6fc, 0xa6f7, 0xca60, 0xca68, 0xca64, 0xa6fa, 0xa6fd, 0xa6ee, 0xa747, 0xca5d, 0xcbbd, 0xa6ec, 0xa743, 0xa6ed, 0xa6f5, 0xa6f6, 0xca62, 0xca5e, 0xa6fb, 0xa6f3, 0xca5a, 0xa6ef, 0xca65, 0xa745, 0xa748, 0xa6f2, 0xa740, 0xa746, 0xa6f0, 0xca63, 0xa741, 0xca69, 0xca5c, 0xa6fe, 0xca5f, 0xca61, 0xa8d8, 0xcbbf, 0xcbcb, 0xa8d0, 0xcbcc, 0xa8cb, 0xa8d5, 0xa8ce, 0xcbb9, 0xa8d6, 0xcbb8, 0xcbbc, 0xcbc3, 0xcbc1, 0xa8de, 0xa8d9, 0xcbb3, 0xcbb5, 0xa8db, 0xa8cf, 0xcbb6, 0xcbc2, 0xcbc9, 0xa8d4, 0xcbbb, 0xcbb4, 0xa8d3, 0xcbb7, 0xa8d7, 0xcbba, 0xa8d2, 0xa8cd, 0xa8dc, 0xcbc4, 0xa8dd, 0xcbc8, 0xcbc6, 0xcbca, 0xa8da, 0xcbbe, 0xcbb2, 0xcbc0, 0xa8d1, 0xcbc5, 0xa8cc, 0xcbc7, 0xab56, 0xab4a, 0xcde0, 0xcde8, 0xab49, 0xab51, 0xab5d, 0xcdee, 0xcdec, 0xcde7, 0xab4b, 0xcded, 0xcde3, 0xab59, 0xab50, 0xab58, 0xcdde, 0xcdea, 0xcde1, 0xab54, 0xcde2, 0xcddd, 0xab5b, 0xab4e, 0xab57, 0xab4d, 0xcddf, 0xcde4, 0xcdeb, 0xab55, 0xab52, 0xcde6, 0xab5a, 0xcde9, 0xcde5, 0xab4f, 0xab5c, 0xab53, 0xab4c, 0xab48, 0xcdef, 0xadd7, 0xadc1, 0xadd1, 0xadd6, 0xd0d0, 0xd0cf, 0xd0d4, 0xd0d5, 0xadc4, 0xadcd, 0xadda, 0xadce, 0xd0c9, 0xadc7, 0xd0ca, 0xaddc, 0xadd3, 0xadbe, 0xadbf, 0xd0dd, 0xb0bf, 0xadcc, 0xadcb, 0xd0cb, 0xadcf, 0xd45b, 0xadc6, 0xd0d6, 0xadd5, 0xadd4, 0xadca, 0xd0ce, 0xd0d7, 0xd0c8, 0xadc9, 0xd0d8, 0xadd2, 0xd0cc, 0xadc0, 0xadc3, 0xadc2, 0xd0d9, 0xadd0, 0xadc5, 0xadd9, 0xaddb, 0xd0d3, 0xadd8, 0xd0db, 0xd0cd, 0xd0dc, 0xd0d1, 0xd0da, 0xd0d2, 0xadc8, 0xd463, 0xd457, 0xb0b3, 0xd45c, 0xd462, 0xb0b2, 0xd455, 0xb0b6, 0xd459, 0xd452, 0xb0b4, 0xd456, 0xb0b9, 0xb0be, 0xd467, 0xd451, 0xb0ba, 0xd466, 0xb0b5, 0xd458, 0xb0b1, 0xd453, 0xd44f, 0xd45d, 0xd450, 0xd44e, 0xd45a, 0xd460, 0xd461, 0xb0b7, 0xd85b, 0xd45e, 0xd44d, 0xd45f, 0xb0c1, 0xd464, 0xb0c0, 0xd44c, 0xd454, 0xd465, 0xb0bc, 0xb0bb, 0xb0b8, 0xb0bd, 0xb0af, 0xb0b0, 0xb3c8, 0xd85e, 0xd857, 0xb3c5, 0xd85f, 0xd855, 0xd858, 0xb3c4, 0xd859, 0xb3c7, 0xd85d, 0xd853, 0xd852, 0xb3c9, 0xb3ca, 0xb3c6, 0xb3cb, 0xd851, 0xd85c, 0xd85a, 0xd854, 0xb3c3, 0xd856, 0xb6ca, 0xb6c4, 0xdcb7, 0xb6cd, 0xdcbd, 0xdcc0, 0xb6c6, 0xb6c7, 0xdcba, 0xb6c5, 0xdcc3, 0xb6cb, 0xdcc4, 0xdcbf, 0xb6cc, 0xdcb4, 0xb6c9, 0xdcb5, 0xdcbe, 0xdcbc, 0xdcb8, 0xb6c8, 0xdcb6, 0xb6ce, 0xdcbb, 0xdcc2, 0xdcb9, 0xdcc1, 0xb9b6, 0xb9b3, 0xb9b4, 0xe0f9, 0xe0f1, 0xb9b2, 0xb9af, 0xe0f2, 0xb9b1, 0xe0f5, 0xe0f7, 0xe0fe, 0xe0fd, 0xe0f8, 0xb9ae, 0xe0f0, 0xb9ac, 0xe0f3, 0xb9b7, 0xe0f6, 0xe0fa, 0xb9b0, 0xb9ad, 0xe0fc, 0xe0fb, 0xb9b5, 0xe0f4, 0xbbf8, 0xe4ec, 0xe4e9, 0xbbf9, 0xbbf7, 0xe4f0, 0xe4ed, 0xe4e6, 0xbbf6, 0xbbfa, 0xe4e7, 0xbbf5, 0xbbfd, 0xe4ea, 0xe4eb, 0xbbfb, 0xbbfc, 0xe4f1, 0xe4ee, 0xe4ef, 0xbeaa, 0xe8f8, 0xbea7, 0xe8f5, 0xbea9, 0xbeab, 0xe8f6, 0xbea8, 0xe8f7, 0xe8f4, 0xc076, 0xecbd, 0xc077, 0xecbb, 0xecbc, 0xecba, 0xecb9, 0xecbe, 0xc075, 0xefb8, 0xefb9, 0xe4e8, 0xefb7, 0xc078, 0xc35f, 0xf1eb, 0xf1ec, 0xc4d7, 0xc4d8, 0xf5c1, 0xf5c0, 0xc56c, 0xc56b, 0xf7d0, 0xa449, 0xa461, 0xa4b9, 0xa4b8, 0xa553, 0xa552, 0xa5fc, 0xa5fb, 0xa5fd, 0xa5fa, 0xa74a, 0xa749, 0xa74b, 0xa8e0, 0xa8df, 0xa8e1, 0xab5e, 0xa259, 0xd0de, 0xa25a, 0xb0c2, 0xa25c, 0xa25b, 0xd860, 0xa25d, 0xb9b8, 0xa25e, 0xa44a, 0xa4ba, 0xa5fe, 0xa8e2, 0xa44b, 0xa4bd, 0xa4bb, 0xa4bc, 0xa640, 0xa74c, 0xa8e4, 0xa8e3, 0xa8e5, 0xaddd, 0xbeac, 0xc94e, 0xa554, 0xa555, 0xa641, 0xca6a, 0xab60, 0xab5f, 0xd0e0, 0xd0df, 0xb0c3, 0xa4be, 0xc955, 0xcbcd, 0xab61, 0xade0, 0xadde, 0xaddf, 0xbead, 0xa556, 0xa642, 0xc9bc, 0xa74d, 0xa74e, 0xca6b, 0xcbce, 0xa8e6, 0xcbcf, 0xd0e2, 0xd0e3, 0xade3, 0xd0e4, 0xd0e1, 0xade4, 0xade2, 0xade1, 0xd0e5, 0xd468, 0xd861, 0xdcc5, 0xe140, 0xbbfe, 0xbeae, 0xe8f9, 0xa44c, 0xa45a, 0xb0c4, 0xb3cd, 0xb9b9, 0xc942, 0xa4bf, 0xa559, 0xa557, 0xa558, 0xa8e7, 0xa44d, 0xa44e, 0xa462, 0xa4c0, 0xa4c1, 0xa4c2, 0xc9be, 0xa55a, 0xc96b, 0xa646, 0xc9bf, 0xa644, 0xa645, 0xc9bd, 0xa647, 0xa643, 0xca6c, 0xaaec, 0xca6d, 0xca6e, 0xa750, 0xa74f, 0xa753, 0xa751, 0xa752, 0xa8ed, 0xa8ec, 0xcbd4, 0xcbd1, 0xcbd2, 0xcbd0, 0xa8ee, 0xa8ea, 0xa8e9, 0xa8eb, 0xa8e8, 0xa8ef, 0xab63, 0xcdf0, 0xcbd3, 0xab68, 0xcdf1, 0xab64, 0xab67, 0xab66, 0xab65, 0xab62, 0xd0e8, 0xade7, 0xd0eb, 0xade5, 0xd0e7, 0xade8, 0xade6, 0xade9, 0xd0e9, 0xd0ea, 0xd0e6, 0xd0ec, 0xb3d1, 0xb0c5, 0xd469, 0xd46b, 0xd46a, 0xd46c, 0xb0c6, 0xb3ce, 0xb3cf, 0xb3d0, 0xb6d0, 0xdcc7, 0xdcc6, 0xdcc8, 0xdcc9, 0xb6d1, 0xb6cf, 0xe141, 0xe142, 0xb9bb, 0xb9ba, 0xe35a, 0xbc40, 0xbc41, 0xbc42, 0xbc44, 0xe4f2, 0xe4f3, 0xbc43, 0xbeaf, 0xbeb0, 0xf1ed, 0xf5c3, 0xf5c2, 0xf7d1, 0xa44f, 0xa55c, 0xa55b, 0xa648, 0xc9c0, 0xa755, 0xa756, 0xa754, 0xa757, 0xca6f, 0xca70, 0xa8f1, 0xcbd5, 0xa8f0, 0xcdf2, 0xab6c, 0xcdf3, 0xab6b, 0xab69, 0xab6a, 0xd0ed, 0xb0c7, 0xd46e, 0xb0ca, 0xd46d, 0xb1e5, 0xb0c9, 0xb0c8, 0xb3d4, 0xb3d3, 0xb3d2, 0xb6d2, 0xb6d5, 0xb6d6, 0xb6d4, 0xb6d3, 0xe143, 0xe144, 0xe4f5, 0xbc45, 0xe4f4, 0xbeb1, 0xecbf, 0xc079, 0xf1ee, 0xc455, 0xa463, 0xa4c3, 0xc956, 0xa4c4, 0xa4c5, 0xa55d, 0xa55e, 0xa649, 0xca71, 0xcbd6, 0xcbd7, 0xab6d, 0xd0ee, 0xb0cc, 0xb0cb, 0xd863, 0xd862, 0xa450, 0xa4c6, 0xa55f, 0xb0cd, 0xc943, 0xc96c, 0xa560, 0xc9c2, 0xa64b, 0xa64a, 0xc9c1, 0xa758, 0xadea, 0xd46f, 0xb6d7, 0xe145, 0xb9bc, 0xe8fa, 0xf3fd, 0xa4c7, 0xcbd8, 0xcdf4, 0xb0d0, 0xb0ce, 0xb0cf, 0xa451, 0xa464, 0xa2cd, 0xa4ca, 0xa4c9, 0xa4c8, 0xa563, 0xa562, 0xc96d, 0xc9c3, 0xa8f5, 0xa8f2, 0xa8f4, 0xa8f3, 0xab6e, 0xb3d5, 0xa452, 0xa4cb, 0xa565, 0xa564, 0xca72, 0xa8f6, 0xc957, 0xa567, 0xa566, 0xa64c, 0xa64d, 0xca73, 0xa759, 0xa75a, 0xa8f7, 0xa8f8, 0xa8f9, 0xab6f, 0xcdf5, 0xadeb, 0xc944, 0xa4cc, 0xc9c4, 0xca74, 0xca75, 0xcbd9, 0xcbda, 0xcdf7, 0xcdf6, 0xcdf9, 0xcdf8, 0xab70, 0xd470, 0xaded, 0xd0ef, 0xadec, 0xd864, 0xb3d6, 0xd865, 0xe146, 0xb9bd, 0xbc46, 0xf1ef, 0xc958, 0xa568, 0xb0d1, 0xa453, 0xa465, 0xa4ce, 0xa4cd, 0xa4cf, 0xa8fb, 0xa8fa, 0xa8fc, 0xab71, 0xadee, 0xe8fb, 0xc24f, 0xa466, 0xa56a, 0xa579, 0xa574, 0xa56f, 0xa56e, 0xa575, 0xa573, 0xa56c, 0xa57a, 0xa56d, 0xa569, 0xa578, 0xa577, 0xa576, 0xa56b, 0xa572, 0xa571, 0xa57b, 0xa570, 0xa653, 0xa659, 0xa655, 0xa65b, 0xc9c5, 0xa658, 0xa64e, 0xa651, 0xa654, 0xa650, 0xa657, 0xa65a, 0xa64f, 0xa652, 0xa656, 0xa65c, 0xca7e, 0xca7b, 0xa767, 0xca7c, 0xa75b, 0xa75d, 0xa775, 0xa770, 0xcaa5, 0xca7d, 0xa75f, 0xa761, 0xcaa4, 0xa768, 0xca78, 0xa774, 0xa776, 0xa75c, 0xa76d, 0xca76, 0xa773, 0xa764, 0xa76e, 0xa76f, 0xca77, 0xa76c, 0xa76a, 0xa76b, 0xa771, 0xcaa1, 0xa75e, 0xa772, 0xcaa3, 0xa766, 0xa763, 0xca7a, 0xa762, 0xcaa6, 0xa765, 0xa769, 0xa760, 0xcaa2, 0xca79, 0xcbeb, 0xcbea, 0xa94f, 0xcbed, 0xcbef, 0xcbe4, 0xcbe7, 0xcbee, 0xa950, 0xcbe1, 0xcbe5, 0xcbe9, 0xce49, 0xa94b, 0xce4d, 0xa8fd, 0xcbe6, 0xa8fe, 0xa94c, 0xa945, 0xa941, 0xcbe2, 0xa944, 0xa949, 0xa952, 0xcbe3, 0xcbdc, 0xa943, 0xcbdd, 0xcbdf, 0xa946, 0xa948, 0xcbdb, 0xcbe0, 0xa951, 0xa94d, 0xcbe8, 0xa953, 0xa94a, 0xcbde, 0xa947, 0xa942, 0xa940, 0xcbec, 0xa94e, 0xce48, 0xcdfb, 0xce4b, 0xcdfd, 0xab78, 0xaba8, 0xab74, 0xaba7, 0xab7d, 0xaba4, 0xab72, 0xcdfc, 0xce43, 0xaba3, 0xce4f, 0xaba5, 0xab79, 0xce45, 0xce42, 0xab77, 0xcdfa, 0xaba6, 0xce4a, 0xab7c, 0xce4c, 0xaba9, 0xab73, 0xab7e, 0xab7b, 0xce40, 0xaba1, 0xce46, 0xce47, 0xab7a, 0xaba2, 0xab76, 0xab75, 0xcdfe, 0xce44, 0xce4e, 0xd144, 0xadfb, 0xd0f1, 0xd0f6, 0xadf4, 0xae40, 0xd0f4, 0xadef, 0xadf9, 0xadfe, 0xd0fb, 0xadfa, 0xadfd, 0xd0fe, 0xadf5, 0xd0f5, 0xd142, 0xd143, 0xadf7, 0xd141, 0xadf3, 0xae43, 0xd0f8, 0xadf1, 0xd146, 0xd0f9, 0xd0fd, 0xadf6, 0xae42, 0xd0fa, 0xadfc, 0xd140, 0xd147, 0xd4a1, 0xd145, 0xae44, 0xadf0, 0xd0fc, 0xd0f3, 0xadf8, 0xd0f2, 0xd0f7, 0xd0f0, 0xae41, 0xd477, 0xb0e4, 0xd4a7, 0xb0e2, 0xb0df, 0xd47c, 0xb0db, 0xd4a2, 0xb0e6, 0xd476, 0xd47b, 0xd47a, 0xadf2, 0xb0e1, 0xd4a5, 0xd4a8, 0xd473, 0xb3e8, 0xd4a9, 0xb0e7, 0xb0d9, 0xb0d6, 0xd47e, 0xb0d3, 0xd4a6, 0xb0da, 0xd4aa, 0xd474, 0xd4a4, 0xb0dd, 0xd475, 0xd478, 0xd47d, 0xb0de, 0xb0dc, 0xb0e8, 0xb0e3, 0xb0d7, 0xb1d2, 0xb0d8, 0xd479, 0xb0e5, 0xb0e0, 0xd4a3, 0xb0d5, 0xb0d4, 0xd471, 0xd472, 0xd86a, 0xb3d7, 0xb3da, 0xd875, 0xb3ee, 0xd878, 0xb3d8, 0xd871, 0xb3de, 0xb3e4, 0xb5bd, 0xb3e2, 0xd86e, 0xb3ef, 0xb3db, 0xb3e3, 0xd876, 0xdcd7, 0xd87b, 0xd86f, 0xd866, 0xd873, 0xd86d, 0xb3e1, 0xd879, 0xb3dd, 0xb3f1, 0xb3ea, 0xb3df, 0xb3dc, 0xb3e7, 0xd87a, 0xd86c, 0xd872, 0xd874, 0xd868, 0xd877, 0xb3d9, 0xd867, 0xb3e0, 0xb3f0, 0xb3ec, 0xd869, 0xb3e6, 0xb3ed, 0xb3e9, 0xb3e5, 0xd870, 0xb3eb, 0xdcd5, 0xdcd1, 0xdce0, 0xdcca, 0xdcd3, 0xb6e5, 0xb6e6, 0xb6de, 0xdcdc, 0xb6e8, 0xdccf, 0xdcce, 0xdccc, 0xdcde, 0xb6dc, 0xdcd8, 0xdccd, 0xb6df, 0xdcd6, 0xb6da, 0xdcd2, 0xdcd9, 0xdcdb, 0xdcdf, 0xb6e3, 0xdccb, 0xb6dd, 0xdcd0, 0xb6d8, 0xb6e4, 0xdcda, 0xb6e0, 0xb6e1, 0xb6e7, 0xb6db, 0xa25f, 0xb6d9, 0xdcd4, 0xb6e2, 0xdcdd, 0xb9cd, 0xb9c8, 0xe155, 0xe151, 0xe14b, 0xb9c2, 0xb9be, 0xe154, 0xb9bf, 0xe14e, 0xe150, 0xe153, 0xb9c4, 0xb9cb, 0xb9c5, 0xe149, 0xb9c6, 0xb9c7, 0xe14c, 0xb9cc, 0xe14a, 0xe14f, 0xb9c3, 0xe148, 0xb9c9, 0xb9c1, 0xb9c0, 0xe14d, 0xe152, 0xb9ca, 0xe147, 0xbc4d, 0xe547, 0xe544, 0xbc47, 0xbc53, 0xbc54, 0xbc4a, 0xe542, 0xbc4c, 0xe4f9, 0xbc52, 0xe546, 0xbc49, 0xe548, 0xbc48, 0xe543, 0xe545, 0xbc4b, 0xe541, 0xe4fa, 0xe4f7, 0xd86b, 0xe4fd, 0xe4f6, 0xe4fc, 0xe4fb, 0xe4f8, 0xbc4f, 0xbc4e, 0xbc50, 0xe4fe, 0xbeb2, 0xe540, 0xe945, 0xe8fd, 0xbebe, 0xe942, 0xbeb6, 0xbeba, 0xe941, 0xbeb9, 0xbeb5, 0xbeb8, 0xbeb3, 0xbebd, 0xe943, 0xe8fe, 0xbebc, 0xe8fc, 0xbebb, 0xe944, 0xe940, 0xbc51, 0xbebf, 0xe946, 0xbeb7, 0xbeb4, 0xecc6, 0xecc8, 0xc07b, 0xecc9, 0xecc7, 0xecc5, 0xecc4, 0xc07d, 0xecc3, 0xc07e, 0xecc1, 0xecc2, 0xc07a, 0xc0a1, 0xc07c, 0xecc0, 0xc250, 0xefbc, 0xefba, 0xefbf, 0xefbd, 0xefbb, 0xefbe, 0xc360, 0xf1f2, 0xf1f3, 0xc456, 0xf1f4, 0xf1f0, 0xf1f5, 0xf1f1, 0xc251, 0xf3fe, 0xf441, 0xc459, 0xf440, 0xc458, 0xc457, 0xc45a, 0xf5c5, 0xf5c6, 0xc4da, 0xc4d9, 0xc4db, 0xf5c4, 0xf6d8, 0xf6d7, 0xc56d, 0xc56f, 0xc56e, 0xf6d9, 0xc5c8, 0xf8a6, 0xc5f1, 0xf8a5, 0xf8ee, 0xc949, 0xa57d, 0xa57c, 0xa65f, 0xa65e, 0xc9c7, 0xa65d, 0xc9c6, 0xa779, 0xcaa9, 0xcaa8, 0xa777, 0xa77a, 0xcaa7, 0xa778, 0xcbf0, 0xcbf1, 0xa954, 0xabaa, 0xd148, 0xd149, 0xae45, 0xae46, 0xd4ac, 0xb0e9, 0xb0eb, 0xd4ab, 0xb0ea, 0xd87c, 0xb3f2, 0xb6e9, 0xb6ea, 0xdce1, 0xb9cf, 0xb9ce, 0xe549, 0xe948, 0xe947, 0xf96b, 0xa467, 0xc959, 0xc96e, 0xc96f, 0xa662, 0xa666, 0xc9c9, 0xa664, 0xa663, 0xc9c8, 0xa665, 0xa661, 0xa660, 0xc9ca, 0xa7a6, 0xa7a3, 0xa77d, 0xcaaa, 0xcaab, 0xa7a1, 0xcaad, 0xa77b, 0xcaae, 0xcaac, 0xa77e, 0xa7a2, 0xa7a5, 0xa7a4, 0xa77c, 0xcaaf, 0xa959, 0xcbfe, 0xa95b, 0xa95a, 0xcc40, 0xa958, 0xa957, 0xcbf5, 0xcbf4, 0xcbf2, 0xcbf7, 0xcbf6, 0xcbf3, 0xcbfc, 0xcbfd, 0xcbfa, 0xcbf8, 0xa956, 0xcbfb, 0xa95c, 0xcc41, 0xcbf9, 0xabab, 0xa955, 0xabac, 0xce54, 0xce5a, 0xabb2, 0xce58, 0xce5e, 0xce55, 0xce59, 0xce5b, 0xce5d, 0xce57, 0xce56, 0xce51, 0xce52, 0xabad, 0xabaf, 0xabae, 0xce53, 0xce5c, 0xabb1, 0xce50, 0xd153, 0xd152, 0xd157, 0xd14e, 0xd151, 0xd150, 0xd154, 0xd158, 0xae47, 0xae4a, 0xd14f, 0xd155, 0xae49, 0xd14a, 0xabb0, 0xd4ba, 0xd156, 0xd14d, 0xae48, 0xd14c, 0xd4b1, 0xb0ec, 0xb0f0, 0xd4c1, 0xd4af, 0xd4bd, 0xb0f1, 0xd4bf, 0xd4c5, 0xd4c9, 0xd4c0, 0xd4b4, 0xd4bc, 0xd4ca, 0xd4c8, 0xd4be, 0xd4b9, 0xd4b2, 0xd8a6, 0xd4b0, 0xb0f5, 0xd4b7, 0xb0f6, 0xb0f2, 0xd4ad, 0xd4c3, 0xd4b5, 0xd4b3, 0xd4c6, 0xb0f3, 0xd4cc, 0xb0ed, 0xb0ef, 0xd4bb, 0xd4b6, 0xae4b, 0xb0ee, 0xd4b8, 0xd4c7, 0xd4cb, 0xd4c2, 0xd4c4, 0xd4ae, 0xd8a1, 0xd8aa, 0xd8a9, 0xb3fa, 0xd8a2, 0xb3fb, 0xb3f9, 0xd8a4, 0xb3f6, 0xd8a8, 0xd8a3, 0xd8a5, 0xd87d, 0xb3f4, 0xd8b2, 0xd8b1, 0xd8ae, 0xb3f3, 0xb3f7, 0xb3f8, 0xd14b, 0xd8ab, 0xb3f5, 0xb0f4, 0xd8ad, 0xd87e, 0xd8b0, 0xd8af, 0xd8b3, 0xdcef, 0xd8ac, 0xd8a7, 0xdce7, 0xb6f4, 0xb6f7, 0xb6f2, 0xdce6, 0xdcea, 0xdce5, 0xb6ec, 0xb6f6, 0xdce2, 0xb6f0, 0xdce9, 0xb6ee, 0xb6ed, 0xdcec, 0xb6ef, 0xdcee, 0xdceb, 0xb6eb, 0xb6f5, 0xdcf0, 0xdce4, 0xdced, 0xdce3, 0xb6f1, 0xb6f3, 0xdce8, 0xdcf1, 0xe15d, 0xb9d0, 0xe163, 0xb9d5, 0xe15f, 0xe166, 0xe157, 0xb9d7, 0xb9d1, 0xe15c, 0xbc55, 0xe15b, 0xe164, 0xb9d2, 0xb9d6, 0xe15a, 0xe160, 0xe165, 0xe156, 0xb9d4, 0xe15e, 0xe162, 0xe168, 0xe158, 0xe161, 0xb9d3, 0xe167, 0xe159, 0xbc59, 0xe54b, 0xbc57, 0xbc56, 0xe54d, 0xe552, 0xe54e, 0xe551, 0xbc5c, 0xbea5, 0xbc5b, 0xe54a, 0xe550, 0xbc5a, 0xe54f, 0xe54c, 0xbc58, 0xe94d, 0xe94f, 0xe94a, 0xbec1, 0xe94c, 0xbec0, 0xe94e, 0xbec3, 0xe950, 0xbec2, 0xe949, 0xe94b, 0xc0a5, 0xeccc, 0xc0a4, 0xeccd, 0xc0a3, 0xeccb, 0xc0a2, 0xecca, 0xc253, 0xc252, 0xf1f6, 0xf1f8, 0xf1f7, 0xc361, 0xc362, 0xc363, 0xf442, 0xc45b, 0xf7d3, 0xf7d2, 0xc5f2, 0xa468, 0xa4d0, 0xa7a7, 0xce5f, 0xb3fc, 0xb3fd, 0xdcf2, 0xb9d8, 0xe169, 0xe553, 0xc95a, 0xcab0, 0xcc42, 0xce60, 0xd159, 0xae4c, 0xf1f9, 0xc4dc, 0xa469, 0xa57e, 0xc970, 0xa667, 0xa668, 0xa95d, 0xb0f7, 0xb9da, 0xb9db, 0xb9d9, 0xa46a, 0xa4d1, 0xa4d3, 0xa4d2, 0xc95b, 0xa4d4, 0xa5a1, 0xc971, 0xa5a2, 0xa669, 0xa66a, 0xc9cb, 0xa7a8, 0xcab1, 0xa961, 0xcc43, 0xa95f, 0xa960, 0xa95e, 0xd15a, 0xabb6, 0xabb5, 0xabb7, 0xabb4, 0xce61, 0xa962, 0xabb3, 0xae4d, 0xae4e, 0xae4f, 0xd4cd, 0xb3fe, 0xd8b4, 0xb0f8, 0xb6f8, 0xb9dd, 0xb9dc, 0xe16a, 0xbc5d, 0xbec4, 0xefc0, 0xf6da, 0xf7d4, 0xa46b, 0xa5a3, 0xa5a4, 0xc9d1, 0xa66c, 0xa66f, 0xc9cf, 0xc9cd, 0xa66e, 0xc9d0, 0xc9d2, 0xc9cc, 0xa671, 0xa670, 0xa66d, 0xa66b, 0xc9ce, 0xa7b3, 0xa7b0, 0xcab6, 0xcab9, 0xcab8, 0xa7aa, 0xa7b2, 0xa7af, 0xcab5, 0xcab3, 0xa7ae, 0xa7a9, 0xa7ac, 0xcab4, 0xcabb, 0xcab7, 0xa7ad, 0xa7b1, 0xa7b4, 0xcab2, 0xcaba, 0xa7ab, 0xa967, 0xa96f, 0xcc4f, 0xcc48, 0xa970, 0xcc53, 0xcc44, 0xcc4b, 0xa966, 0xcc45, 0xa964, 0xcc4c, 0xcc50, 0xa963, 0xcc51, 0xcc4a, 0xcc4d, 0xa972, 0xa969, 0xcc54, 0xcc52, 0xa96e, 0xa96c, 0xcc49, 0xa96b, 0xcc47, 0xcc46, 0xa96a, 0xa968, 0xa971, 0xa96d, 0xa965, 0xcc4e, 0xabb9, 0xabc0, 0xce6f, 0xabb8, 0xce67, 0xce63, 0xce73, 0xce62, 0xabbb, 0xce6c, 0xabbe, 0xabc1, 0xabbc, 0xce70, 0xabbf, 0xae56, 0xce76, 0xce64, 0xce66, 0xce6d, 0xce71, 0xce75, 0xce72, 0xce6b, 0xce6e, 0xce68, 0xabc3, 0xce6a, 0xce69, 0xce74, 0xabba, 0xce65, 0xabc2, 0xabbd, 0xae5c, 0xd162, 0xae5b, 0xd160, 0xae50, 0xae55, 0xd15f, 0xd15c, 0xd161, 0xae51, 0xd15b, 0xae54, 0xae52, 0xd163, 0xae53, 0xae57, 0xae58, 0xae5a, 0xae59, 0xd15d, 0xd15e, 0xd164, 0xd4d4, 0xb0f9, 0xd8c2, 0xd4d3, 0xd4e6, 0xb140, 0xd4e4, 0xb0fe, 0xb0fa, 0xd4ed, 0xd4dd, 0xd4e0, 0xb143, 0xd4ea, 0xd4e2, 0xb0fb, 0xb144, 0xd4e7, 0xd4e5, 0xd4d6, 0xd4eb, 0xd4df, 0xd4da, 0xd4d0, 0xd4ec, 0xd4dc, 0xd4cf, 0xb142, 0xd4e1, 0xd4ee, 0xd4de, 0xd4d2, 0xd4d7, 0xd4ce, 0xb141, 0xd4db, 0xd4d8, 0xb0fc, 0xd4d1, 0xd4e9, 0xb0fd, 0xd4d9, 0xd4d5, 0xd4e8, 0xb440, 0xd8bb, 0xd8b8, 0xd8c9, 0xd8bd, 0xd8ca, 0xb442, 0xd8c6, 0xd8c3, 0xd8c4, 0xd8c7, 0xd8cb, 0xd4e3, 0xd8cd, 0xdd47, 0xb443, 0xd8ce, 0xd8b6, 0xd8c0, 0xd8c5, 0xb441, 0xb444, 0xd8cc, 0xd8cf, 0xd8ba, 0xd8b7, 0xd8b9, 0xd8be, 0xd8bc, 0xb445, 0xd8c8, 0xd8bf, 0xd8c1, 0xd8b5, 0xdcfa, 0xdcf8, 0xb742, 0xb740, 0xdd43, 0xdcf9, 0xdd44, 0xdd40, 0xdcf7, 0xdd46, 0xdcf6, 0xdcfd, 0xb6fe, 0xb6fd, 0xb6fc, 0xdcfb, 0xdd41, 0xb6f9, 0xb741, 0xdcf4, 0xdcfe, 0xdcf3, 0xdcfc, 0xb6fa, 0xdd42, 0xdcf5, 0xb6fb, 0xdd45, 0xe16e, 0xb9e2, 0xb9e1, 0xb9e3, 0xe17a, 0xe170, 0xe176, 0xe16b, 0xe179, 0xe178, 0xe17c, 0xe175, 0xb9de, 0xe174, 0xb9e4, 0xe16d, 0xb9df, 0xe17b, 0xb9e0, 0xe16f, 0xe172, 0xe177, 0xe171, 0xe16c, 0xe173, 0xe555, 0xbc61, 0xe558, 0xe557, 0xe55a, 0xe55c, 0xbc5f, 0xe556, 0xe554, 0xe55d, 0xe55b, 0xe559, 0xe55f, 0xe55e, 0xbc63, 0xbc5e, 0xbc60, 0xbc62, 0xe560, 0xe957, 0xe956, 0xe955, 0xe958, 0xe951, 0xe952, 0xe95a, 0xe953, 0xbec5, 0xe95c, 0xe95b, 0xe954, 0xecd1, 0xc0a8, 0xeccf, 0xecd4, 0xecd3, 0xe959, 0xc0a7, 0xecd2, 0xecce, 0xecd6, 0xecd5, 0xc0a6, 0xecd0, 0xbec6, 0xc254, 0xefc1, 0xf1fa, 0xf1fb, 0xf1fc, 0xc45c, 0xc45d, 0xf443, 0xf5c8, 0xf5c7, 0xf6db, 0xf6dc, 0xf7d5, 0xf8a7, 0xa46c, 0xa46d, 0xa46e, 0xa4d5, 0xa5a5, 0xc9d3, 0xa672, 0xa673, 0xa7b7, 0xa7b8, 0xa7b6, 0xa7b5, 0xa973, 0xcc55, 0xa975, 0xa974, 0xcc56, 0xabc4, 0xae5d, 0xd165, 0xd4f0, 0xb145, 0xb447, 0xd4ef, 0xb446, 0xb9e5, 0xe17d, 0xbec7, 0xc0a9, 0xecd7, 0xc45e, 0xc570, 0xc972, 0xa5a6, 0xc973, 0xa676, 0xa674, 0xa675, 0xa677, 0xa7ba, 0xa7b9, 0xcabc, 0xa7bb, 0xcabd, 0xcc57, 0xcc58, 0xa976, 0xa978, 0xa97a, 0xa977, 0xa97b, 0xa979, 0xabc8, 0xabc5, 0xabc7, 0xabc9, 0xabc6, 0xd166, 0xce77, 0xd168, 0xd167, 0xae63, 0xae5f, 0xae60, 0xae62, 0xae64, 0xae61, 0xae66, 0xae65, 0xb14a, 0xd4f2, 0xd4f1, 0xb149, 0xb148, 0xb147, 0xb14b, 0xb146, 0xd8d5, 0xd8d2, 0xb449, 0xd8d1, 0xd8d6, 0xb44b, 0xd8d4, 0xb448, 0xb44a, 0xd8d3, 0xdd48, 0xdd49, 0xdd4a, 0xb9e6, 0xb9ee, 0xe17e, 0xb9e8, 0xb9ec, 0xe1a1, 0xb9ed, 0xb9e9, 0xb9ea, 0xb9e7, 0xb9eb, 0xbc66, 0xd8d0, 0xbc67, 0xbc65, 0xbc64, 0xe95d, 0xbec8, 0xecd8, 0xecd9, 0xc364, 0xc45f, 0xa46f, 0xa678, 0xabca, 0xd169, 0xae67, 0xb14e, 0xb14d, 0xb14c, 0xb44c, 0xb44d, 0xd8d7, 0xb9ef, 0xbec9, 0xa470, 0xc95c, 0xa4d6, 0xc974, 0xc9d4, 0xa679, 0xa97c, 0xdd4b, 0xa471, 0xa4d7, 0xc9d5, 0xcabe, 0xcabf, 0xa7bc, 0xd8d8, 0xb44e, 0xdd4c, 0xc0aa, 0xa472, 0xa4a8, 0xa4d8, 0xc975, 0xa5a7, 0xa7c0, 0xa7bf, 0xa7bd, 0xa7be, 0xcc59, 0xa97e, 0xa9a1, 0xcc5a, 0xa97d, 0xabce, 0xce78, 0xabcd, 0xabcb, 0xabcc, 0xae6a, 0xae68, 0xd16b, 0xae69, 0xd16a, 0xae5e, 0xd4f3, 0xb150, 0xb151, 0xb14f, 0xb9f0, 0xe1a2, 0xbc68, 0xbc69, 0xe561, 0xc0ab, 0xefc2, 0xefc3, 0xc4dd, 0xf8a8, 0xc94b, 0xa4d9, 0xa473, 0xc977, 0xc976, 0xa67a, 0xc9d7, 0xc9d8, 0xc9d6, 0xc9d9, 0xcac7, 0xcac2, 0xcac4, 0xcac6, 0xcac3, 0xa7c4, 0xcac0, 0xcac1, 0xa7c1, 0xa7c2, 0xcac5, 0xcac8, 0xa7c3, 0xcac9, 0xcc68, 0xcc62, 0xcc5d, 0xa9a3, 0xcc65, 0xcc63, 0xcc5c, 0xcc69, 0xcc6c, 0xcc67, 0xcc60, 0xa9a5, 0xcc66, 0xa9a6, 0xcc61, 0xcc64, 0xcc5b, 0xcc5f, 0xcc6b, 0xa9a7, 0xa9a8, 0xcc5e, 0xcc6a, 0xa9a2, 0xa9a4, 0xceab, 0xcea4, 0xceaa, 0xcea3, 0xcea5, 0xce7d, 0xce7b, 0xceac, 0xcea9, 0xce79, 0xabd0, 0xcea7, 0xcea8, 0xcea6, 0xce7c, 0xce7a, 0xabcf, 0xcea2, 0xce7e, 0xcea1, 0xcead, 0xae6f, 0xae6e, 0xd16c, 0xae6b, 0xd16e, 0xae70, 0xd16f, 0xae73, 0xae71, 0xd170, 0xceae, 0xd172, 0xae6d, 0xae6c, 0xd16d, 0xd171, 0xae72, 0xb153, 0xb152, 0xd4f5, 0xd4f9, 0xd4fb, 0xb154, 0xd4fe, 0xb158, 0xd541, 0xb15a, 0xb156, 0xb15e, 0xb15b, 0xd4f7, 0xb155, 0xd4f6, 0xd4f4, 0xd543, 0xd4f8, 0xb157, 0xd542, 0xb15c, 0xd4fd, 0xd4fc, 0xb15d, 0xd4fa, 0xb159, 0xd544, 0xd540, 0xd8e7, 0xd8ee, 0xd8e3, 0xb451, 0xd8df, 0xd8ef, 0xd8d9, 0xd8ec, 0xd8ea, 0xd8e4, 0xd8ed, 0xd8e6, 0xd8de, 0xd8f0, 0xd8dc, 0xd8e9, 0xd8da, 0xd8f1, 0xb452, 0xd8eb, 0xdd4f, 0xd8dd, 0xb44f, 0xd8e1, 0xb450, 0xd8e0, 0xd8e5, 0xd8e2, 0xd8e8, 0xdd53, 0xdd56, 0xdd4e, 0xdd50, 0xdd55, 0xdd54, 0xb743, 0xd8db, 0xdd52, 0xb744, 0xdd4d, 0xdd51, 0xe1a9, 0xe1b0, 0xe1a7, 0xe1ae, 0xe1a5, 0xe1ad, 0xe1b1, 0xe1a4, 0xe1a8, 0xe1a3, 0xb9f1, 0xe1a6, 0xb9f2, 0xe1ac, 0xe1ab, 0xe1aa, 0xe1af, 0xe565, 0xe567, 0xbc6b, 0xe568, 0xe563, 0xe562, 0xe56c, 0xe56a, 0xbc6a, 0xe56d, 0xe564, 0xe569, 0xe56b, 0xe566, 0xe961, 0xe966, 0xe960, 0xe965, 0xe95e, 0xe968, 0xe964, 0xe969, 0xe963, 0xe95f, 0xe967, 0xe96a, 0xe962, 0xecda, 0xc0af, 0xc0ad, 0xc0ac, 0xc0ae, 0xefc4, 0xf172, 0xf1fd, 0xf444, 0xf445, 0xc460, 0xf5c9, 0xc4de, 0xf5ca, 0xf6de, 0xc572, 0xc571, 0xf6dd, 0xc5c9, 0xf7d6, 0xa474, 0xa67b, 0xc9da, 0xcaca, 0xa8b5, 0xb15f, 0xa475, 0xa5aa, 0xa5a9, 0xa5a8, 0xa7c5, 0xae74, 0xdd57, 0xa476, 0xa477, 0xa478, 0xa4da, 0xabd1, 0xceaf, 0xb453, 0xa479, 0xc95d, 0xa5ab, 0xa5ac, 0xc978, 0xa67c, 0xcacb, 0xa7c6, 0xcacc, 0xa9ae, 0xcc6e, 0xa9ac, 0xa9ab, 0xcc6d, 0xa9a9, 0xcc6f, 0xa9aa, 0xa9ad, 0xabd2, 0xabd4, 0xceb3, 0xceb0, 0xceb1, 0xceb2, 0xceb4, 0xabd3, 0xd174, 0xd173, 0xae76, 0xae75, 0xb162, 0xd546, 0xb161, 0xb163, 0xb160, 0xb455, 0xd545, 0xb456, 0xd8f3, 0xb457, 0xd8f2, 0xb454, 0xdd5a, 0xdd5c, 0xb745, 0xdd5b, 0xdd59, 0xdd58, 0xe1b4, 0xb9f7, 0xb9f5, 0xb9f6, 0xe1b2, 0xe1b3, 0xb9f3, 0xe571, 0xe56f, 0xbc6d, 0xe570, 0xbc6e, 0xbc6c, 0xb9f4, 0xe96d, 0xe96b, 0xe96c, 0xe56e, 0xecdc, 0xc0b0, 0xecdb, 0xefc5, 0xefc6, 0xe96e, 0xf1fe, 0xa47a, 0xa5ad, 0xa67e, 0xc9db, 0xa67d, 0xa9af, 0xb746, 0xa4db, 0xa5ae, 0xabd5, 0xb458, 0xc979, 0xc97a, 0xc9dc, 0xa7c8, 0xcad0, 0xcace, 0xa7c9, 0xcacd, 0xcacf, 0xcad1, 0xa7c7, 0xa9b3, 0xa9b4, 0xa9b1, 0xa9b0, 0xceb8, 0xa9b2, 0xabd6, 0xceb7, 0xceb9, 0xceb6, 0xceba, 0xabd7, 0xae79, 0xd175, 0xd177, 0xae77, 0xd178, 0xae78, 0xd176, 0xceb5, 0xd547, 0xd54a, 0xd54b, 0xd548, 0xb167, 0xb166, 0xb164, 0xb165, 0xd549, 0xb168, 0xb45a, 0xb45b, 0xb45c, 0xdd5d, 0xdd5f, 0xdd61, 0xb748, 0xb747, 0xb459, 0xdd60, 0xdd5e, 0xe1b8, 0xe1b6, 0xe1bc, 0xb9f8, 0xe1bd, 0xe1ba, 0xb9f9, 0xe1b7, 0xe1b5, 0xe1bb, 0xbc70, 0xe573, 0xe1b9, 0xbc72, 0xe574, 0xbc71, 0xbc74, 0xe575, 0xbc6f, 0xbc73, 0xe973, 0xe971, 0xe970, 0xe972, 0xe96f, 0xc366, 0xf446, 0xf447, 0xf5cb, 0xf6df, 0xc655, 0xa9b5, 0xa7ca, 0xabd8, 0xa47b, 0xa4dc, 0xa5af, 0xc9dd, 0xa7cb, 0xcad2, 0xcebb, 0xabd9, 0xb9fa, 0xa47c, 0xa6a1, 0xb749, 0xa47d, 0xa4dd, 0xa4de, 0xa5b1, 0xa5b0, 0xc9de, 0xa6a2, 0xcad3, 0xa7cc, 0xcc71, 0xcc72, 0xcc73, 0xa9b6, 0xa9b7, 0xcc70, 0xa9b8, 0xabda, 0xcebc, 0xd17a, 0xae7a, 0xd179, 0xb169, 0xd54c, 0xb16a, 0xd54d, 0xb45d, 0xdd62, 0xe1bf, 0xe1be, 0xb9fb, 0xbc75, 0xe576, 0xbeca, 0xe974, 0xc0b1, 0xc573, 0xf7d8, 0xcc74, 0xcebd, 0xb16b, 0xd8f4, 0xb74a, 0xc255, 0xa7ce, 0xa7cd, 0xabdb, 0xd17b, 0xb16d, 0xb343, 0xb16e, 0xb16c, 0xb45e, 0xe1c0, 0xb9fc, 0xbc76, 0xc94c, 0xc9df, 0xcad5, 0xa7cf, 0xcad4, 0xa7d0, 0xa9bc, 0xcc77, 0xcc76, 0xa9bb, 0xa9b9, 0xa9ba, 0xcc75, 0xabdd, 0xcebe, 0xabe0, 0xabdc, 0xabe2, 0xabde, 0xabdf, 0xabe1, 0xae7d, 0xae7c, 0xae7b, 0xd54f, 0xb16f, 0xb172, 0xb170, 0xd54e, 0xb175, 0xb171, 0xd550, 0xb174, 0xb173, 0xd8f6, 0xd8f5, 0xb461, 0xb45f, 0xb460, 0xd8f7, 0xb74b, 0xdd64, 0xb74c, 0xdd63, 0xe577, 0xbc78, 0xe1c1, 0xbc77, 0xb9fd, 0xecde, 0xe975, 0xc0b2, 0xecdd, 0xf240, 0xf448, 0xf449, 0xa4df, 0xa5b2, 0xc97b, 0xa7d2, 0xa7d4, 0xc9e2, 0xcad8, 0xcad7, 0xcad6, 0xc9e1, 0xc9e0, 0xa6a4, 0xa7d3, 0xa7d1, 0xa6a3, 0xa9bd, 0xcc78, 0xa9be, 0xcadd, 0xcadf, 0xcade, 0xcc79, 0xcada, 0xa7d8, 0xa7d6, 0xcad9, 0xcadb, 0xcae1, 0xa7d5, 0xcadc, 0xcae5, 0xa9c0, 0xcae2, 0xa7d7, 0xcae0, 0xcae3, 0xa9bf, 0xa9c1, 0xcae4, 0xccaf, 0xcca2, 0xcc7e, 0xccae, 0xcca9, 0xabe7, 0xa9c2, 0xccaa, 0xccad, 0xabe3, 0xccac, 0xa9c3, 0xa9c8, 0xa9c6, 0xcca3, 0xcc7c, 0xcca5, 0xa9cd, 0xccb0, 0xabe4, 0xcca6, 0xabe5, 0xa9c9, 0xcca8, 0xcecd, 0xabe6, 0xcc7b, 0xa9ca, 0xabe8, 0xa9cb, 0xa9c7, 0xa9cc, 0xcca7, 0xcc7a, 0xccab, 0xa9c4, 0xcc7d, 0xcca4, 0xcca1, 0xa9c5, 0xcebf, 0xcec0, 0xceca, 0xd1a1, 0xcecb, 0xabee, 0xcece, 0xcec4, 0xabed, 0xcec6, 0xcec7, 0xcec9, 0xabe9, 0xaea3, 0xcec5, 0xcec1, 0xaea4, 0xcecf, 0xae7e, 0xd17d, 0xcec8, 0xd17c, 0xcec3, 0xcecc, 0xabec, 0xaea1, 0xabf2, 0xaea2, 0xced0, 0xd17e, 0xabeb, 0xaea6, 0xabf1, 0xabf0, 0xabef, 0xaea5, 0xced1, 0xaea7, 0xabea, 0xcec2, 0xb176, 0xd1a4, 0xd1a6, 0xd1a8, 0xaea8, 0xaeae, 0xd553, 0xd1ac, 0xd1a3, 0xb178, 0xd551, 0xaead, 0xaeab, 0xd1ae, 0xd552, 0xd1a5, 0xaeac, 0xd1a9, 0xaeaf, 0xd1ab, 0xaeaa, 0xd1aa, 0xd1ad, 0xd1a7, 0xaea9, 0xb179, 0xd1a2, 0xb177, 0xb17a, 0xd555, 0xd55e, 0xb464, 0xb17c, 0xb1a3, 0xb465, 0xd560, 0xb1aa, 0xd8f9, 0xd556, 0xb1a2, 0xb1a5, 0xb17e, 0xd554, 0xd562, 0xd565, 0xd949, 0xd563, 0xd8fd, 0xb1a1, 0xb1a8, 0xb1ac, 0xd55d, 0xd8f8, 0xd561, 0xb17b, 0xd8fa, 0xd564, 0xd8fc, 0xd559, 0xb462, 0xd557, 0xd558, 0xb1a7, 0xb1a6, 0xd55b, 0xb1ab, 0xd55f, 0xb1a4, 0xd55c, 0xb1a9, 0xb466, 0xb463, 0xd8fb, 0xd55a, 0xb17d, 0xb46b, 0xb46f, 0xd940, 0xb751, 0xb46d, 0xd944, 0xb471, 0xdd65, 0xd946, 0xb753, 0xb469, 0xb46c, 0xd947, 0xd948, 0xd94e, 0xb473, 0xb754, 0xd94a, 0xd94f, 0xd943, 0xb75e, 0xb755, 0xb472, 0xd941, 0xd950, 0xb75d, 0xb470, 0xb74e, 0xd94d, 0xb474, 0xd945, 0xd8fe, 0xb46a, 0xd942, 0xd94b, 0xb74d, 0xb752, 0xb467, 0xd94c, 0xb750, 0xb468, 0xb75c, 0xe1c3, 0xdd70, 0xdd68, 0xe1c2, 0xdd6c, 0xdd6e, 0xdd6b, 0xb75b, 0xdd6a, 0xb75f, 0xe1d2, 0xb75a, 0xba40, 0xdd71, 0xe1c4, 0xb758, 0xdd69, 0xdd6d, 0xb9fe, 0xb74f, 0xdd66, 0xdd67, 0xba41, 0xb757, 0xb759, 0xb756, 0xdd6f, 0xe1c8, 0xe1c9, 0xe1ce, 0xbc7d, 0xe1d5, 0xba47, 0xba46, 0xe1d0, 0xbc7c, 0xe1c5, 0xba45, 0xe1d4, 0xba43, 0xba44, 0xe1d1, 0xe5aa, 0xbc7a, 0xb46e, 0xe1d3, 0xbca3, 0xe1cb, 0xbc7b, 0xbca2, 0xe1c6, 0xe1ca, 0xe1c7, 0xe1cd, 0xba48, 0xbc79, 0xba42, 0xe57a, 0xe1cf, 0xbca1, 0xbca4, 0xe1cc, 0xbc7e, 0xe579, 0xe57e, 0xbece, 0xe578, 0xe9a3, 0xe5a9, 0xbca8, 0xbca6, 0xbecc, 0xe5a6, 0xe5a2, 0xbcac, 0xe978, 0xbcaa, 0xe5a1, 0xe976, 0xe5a5, 0xe5a8, 0xe57d, 0xbcab, 0xbca5, 0xe977, 0xbecd, 0xe5a7, 0xbca7, 0xbca9, 0xe5a4, 0xbcad, 0xe5a3, 0xe57c, 0xe57b, 0xbecb, 0xe5ab, 0xe97a, 0xece0, 0xbed0, 0xe9a2, 0xe97e, 0xece1, 0xbed1, 0xe9a1, 0xe97c, 0xc0b4, 0xecdf, 0xe979, 0xe97b, 0xc0b5, 0xbed3, 0xc0b3, 0xbed2, 0xc0b7, 0xe97d, 0xbecf, 0xefcf, 0xefc7, 0xece7, 0xefc8, 0xece3, 0xc256, 0xece5, 0xece4, 0xc0b6, 0xece2, 0xece6, 0xefd0, 0xefcc, 0xefce, 0xefc9, 0xefca, 0xefcd, 0xefcb, 0xc367, 0xc36a, 0xc369, 0xc368, 0xc461, 0xf44a, 0xc462, 0xf241, 0xc4df, 0xf5cc, 0xc4e0, 0xc574, 0xc5ca, 0xf7d9, 0xf7da, 0xf7db, 0xf9ba, 0xa4e0, 0xc97c, 0xa5b3, 0xa6a6, 0xa6a7, 0xa6a5, 0xa6a8, 0xa7da, 0xa7d9, 0xccb1, 0xa9cf, 0xa9ce, 0xd1af, 0xb1ad, 0xb1ae, 0xb475, 0xdd72, 0xb760, 0xb761, 0xdd74, 0xdd76, 0xdd75, 0xe1d7, 0xe1d6, 0xba49, 0xe1d8, 0xe5ac, 0xbcae, 0xbed4, 0xc0b8, 0xc257, 0xc0b9, 0xa4e1, 0xcae6, 0xccb2, 0xa9d1, 0xa9d0, 0xa9d2, 0xabf3, 0xced2, 0xced3, 0xd1b0, 0xaeb0, 0xb1af, 0xb476, 0xd951, 0xa4e2, 0xa47e, 0xa4e3, 0xc97d, 0xa5b7, 0xa5b6, 0xa5b4, 0xa5b5, 0xa6ab, 0xc9e9, 0xc9eb, 0xa6aa, 0xc9e3, 0xc9e4, 0xc9ea, 0xc9e6, 0xc9e8, 0xa6a9, 0xc9e5, 0xc9ec, 0xc9e7, 0xa7e1, 0xa7ea, 0xa7e8, 0xcaf0, 0xcaed, 0xcaf5, 0xa7e6, 0xcaf6, 0xa7df, 0xcaf3, 0xa7e5, 0xcaef, 0xcaee, 0xa7e3, 0xcaf4, 0xa7e4, 0xa9d3, 0xa7de, 0xcaf1, 0xcae7, 0xa7db, 0xa7ee, 0xcaec, 0xcaf2, 0xa7e0, 0xa7e2, 0xcae8, 0xcae9, 0xcaea, 0xa7ed, 0xa7e7, 0xa7ec, 0xcaeb, 0xa7eb, 0xa7dd, 0xa7dc, 0xa7e9, 0xa9e1, 0xccbe, 0xccb7, 0xa9dc, 0xa9ef, 0xccb3, 0xccba, 0xccbc, 0xccbf, 0xa9ea, 0xccbb, 0xccb4, 0xa9e8, 0xccb8, 0xccc0, 0xa9d9, 0xccbd, 0xa9e3, 0xa9e2, 0xccb6, 0xa9d7, 0xa9d8, 0xa9d6, 0xa9ee, 0xa9e6, 0xa9e0, 0xa9d4, 0xccb9, 0xa9df, 0xa9d5, 0xa9e7, 0xa9f0, 0xced4, 0xa9e4, 0xccb5, 0xa9da, 0xa9dd, 0xa9de, 0xa9ec, 0xa9ed, 0xa9eb, 0xa9e5, 0xa9e9, 0xa9db, 0xabf4, 0xceda, 0xac41, 0xabf8, 0xabfa, 0xac40, 0xcee6, 0xabfd, 0xd1b1, 0xaeb1, 0xac43, 0xced7, 0xcedf, 0xabfe, 0xcede, 0xcedb, 0xcee3, 0xcee5, 0xabf7, 0xabfb, 0xac42, 0xaeb3, 0xcee0, 0xabf9, 0xac45, 0xced9, 0xabfc, 0xaeb2, 0xabf6, 0xced6, 0xcedd, 0xced5, 0xced8, 0xcedc, 0xd1b2, 0xac44, 0xcee1, 0xcee2, 0xcee4, 0xabf5, 0xaec1, 0xd1be, 0xaebf, 0xaec0, 0xd1b4, 0xd1c4, 0xaeb6, 0xd566, 0xd1c6, 0xd1c0, 0xd1b7, 0xd1c9, 0xd1ba, 0xaebc, 0xd57d, 0xd1bd, 0xaebe, 0xaeb5, 0xd1cb, 0xd1bf, 0xaeb8, 0xd1b8, 0xd1b5, 0xd1b6, 0xaeb9, 0xd1c5, 0xd1cc, 0xaebb, 0xd1bc, 0xd1bb, 0xaec3, 0xaec2, 0xaeb4, 0xaeba, 0xaebd, 0xd1c8, 0xd1c2, 0xaeb7, 0xd1b3, 0xd1ca, 0xd1c1, 0xd1c3, 0xd1c7, 0xd567, 0xb1b7, 0xb1cb, 0xb1ca, 0xb1bf, 0xd579, 0xd575, 0xd572, 0xd5a6, 0xb1ba, 0xb1b2, 0xd577, 0xb4a8, 0xb1b6, 0xd5a1, 0xb1cc, 0xb1c9, 0xd57b, 0xd56a, 0xb1c8, 0xd5a3, 0xd569, 0xb1bd, 0xb1c1, 0xd5a2, 0xd573, 0xb1c2, 0xb1bc, 0xd568, 0xb478, 0xd5a5, 0xd571, 0xb1c7, 0xd574, 0xd5a4, 0xb1c6, 0xd952, 0xb1b3, 0xd56f, 0xb1b8, 0xb1c3, 0xb1be, 0xd578, 0xd56e, 0xd56c, 0xd57e, 0xb1b0, 0xb1c4, 0xb1b4, 0xb477, 0xd57c, 0xb1b5, 0xb1b1, 0xb1c0, 0xb1bb, 0xb1b9, 0xd570, 0xb1c5, 0xd56d, 0xd57a, 0xd576, 0xd954, 0xd953, 0xd56b, 0xd964, 0xb47a, 0xd96a, 0xd959, 0xd967, 0xdd77, 0xb47d, 0xd96b, 0xd96e, 0xb47c, 0xd95c, 0xd96d, 0xd96c, 0xb47e, 0xd955, 0xb479, 0xb4a3, 0xb4a1, 0xd969, 0xd95f, 0xb4a5, 0xd970, 0xd968, 0xd971, 0xb4ad, 0xb4ab, 0xd966, 0xd965, 0xd963, 0xd95d, 0xb4a4, 0xb4a2, 0xd1b9, 0xd956, 0xddb7, 0xd957, 0xb47b, 0xb4aa, 0xdd79, 0xb4a6, 0xb4a7, 0xd958, 0xd96f, 0xdd78, 0xd960, 0xd95b, 0xb4a9, 0xd961, 0xd95e, 0xb4ae, 0xb770, 0xdd7c, 0xddb1, 0xddb6, 0xddaa, 0xb76c, 0xddbb, 0xb769, 0xdd7a, 0xdd7b, 0xb762, 0xb76b, 0xdda4, 0xb76e, 0xb76f, 0xdda5, 0xddb2, 0xddb8, 0xb76a, 0xb764, 0xdda3, 0xdd7d, 0xddba, 0xdda8, 0xdda9, 0xdd7e, 0xddb4, 0xddab, 0xddb5, 0xddad, 0xb765, 0xe1d9, 0xb768, 0xb766, 0xddb9, 0xddb0, 0xddac, 0xdda1, 0xba53, 0xddaf, 0xb76d, 0xdda7, 0xdda6, 0xb767, 0xb763, 0xe1ee, 0xddb3, 0xddae, 0xdda2, 0xe1e9, 0xe1da, 0xe1e5, 0xe1ec, 0xba51, 0xb4ac, 0xe1ea, 0xba4c, 0xba4b, 0xe1f1, 0xe1db, 0xe1e8, 0xe1dc, 0xe1e7, 0xba4f, 0xe1eb, 0xd962, 0xe1f2, 0xe1e3, 0xba52, 0xe5ba, 0xbcaf, 0xe1f0, 0xe1ef, 0xba54, 0xe5ad, 0xbcb0, 0xe5ae, 0xe1df, 0xe1e0, 0xe1dd, 0xe1e2, 0xe1de, 0xe1f3, 0xba4e, 0xbcb1, 0xba50, 0xba55, 0xe1e1, 0xe1ed, 0xe1e6, 0xe5b1, 0xba4a, 0xbcb4, 0xe9aa, 0xe5b6, 0xe5b5, 0xe5b7, 0xe5b4, 0xbcb5, 0xbcbb, 0xbcb8, 0xbcb9, 0xe5af, 0xe5b2, 0xe5bc, 0xbcc1, 0xbcbf, 0xe5b3, 0xd95a, 0xbcb2, 0xe5b9, 0xe5b0, 0xbcc2, 0xe5b8, 0xba4d, 0xbcb7, 0xe1e4, 0xbcba, 0xbcbe, 0xbcc0, 0xbcbd, 0xbcbc, 0xbcb6, 0xe5bb, 0xbcb3, 0xbcc3, 0xbed8, 0xbed9, 0xe9a9, 0xbee2, 0xbedf, 0xbed6, 0xbedd, 0xe9ab, 0xbedb, 0xbed5, 0xbedc, 0xe9a8, 0xc0bb, 0xbed7, 0xbede, 0xc0ba, 0xe9a7, 0xe9a6, 0xbee0, 0xbee1, 0xe9a5, 0xe9a4, 0xc0bc, 0xe9ae, 0xbeda, 0xe9ac, 0xc0bd, 0xc0c2, 0xecea, 0xecec, 0xc0bf, 0xeced, 0xece9, 0xeceb, 0xc0c0, 0xc0c3, 0xece8, 0xc0be, 0xc0c1, 0xc259, 0xe9ad, 0xc258, 0xc25e, 0xefd4, 0xc25c, 0xc25d, 0xefd7, 0xefd3, 0xc25a, 0xefd1, 0xc36b, 0xefd5, 0xefd6, 0xefd2, 0xc25b, 0xf242, 0xf245, 0xf246, 0xf244, 0xf247, 0xc36c, 0xf243, 0xf44e, 0xc464, 0xf44d, 0xf44c, 0xf44b, 0xc463, 0xc465, 0xf5cd, 0xc4e2, 0xc4e1, 0xf6e1, 0xf6e0, 0xf6e3, 0xc5cb, 0xc575, 0xf7dd, 0xf6e2, 0xf7dc, 0xc5cd, 0xc5cc, 0xc5f3, 0xf8a9, 0xf8ef, 0xa4e4, 0xd972, 0xe9af, 0xa6ac, 0xcaf7, 0xa7f1, 0xa7ef, 0xa7f0, 0xccc1, 0xa9f1, 0xac46, 0xcee7, 0xcee8, 0xac47, 0xd1ce, 0xaec4, 0xaec5, 0xd1cd, 0xb1d3, 0xb1cf, 0xd5a7, 0xb1d6, 0xb1d5, 0xb1ce, 0xb1d1, 0xb1d4, 0xb1d0, 0xd976, 0xb1cd, 0xb4af, 0xb4b1, 0xb4b2, 0xd975, 0xd978, 0xb4b0, 0xd973, 0xd977, 0xd974, 0xb771, 0xddbc, 0xba56, 0xe1f4, 0xbee3, 0xbcc4, 0xe5bd, 0xbcc5, 0xbcc6, 0xe5bf, 0xe5be, 0xe5c0, 0xe9b1, 0xe9b0, 0xecef, 0xecee, 0xc0c4, 0xc0c5, 0xf248, 0xa4e5, 0xd979, 0xb4b4, 0xb4b3, 0xddbd, 0xefd8, 0xc4e3, 0xf7de, 0xa4e6, 0xaec6, 0xb1d8, 0xb1d7, 0xd97a, 0xd97b, 0xb772, 0xe1f5, 0xba57, 0xe9b2, 0xa4e7, 0xa5b8, 0xa9f2, 0xccc2, 0xcee9, 0xac48, 0xb1d9, 0xd97c, 0xb4b5, 0xb773, 0xe5c1, 0xe5c2, 0xecf0, 0xc25f, 0xf8f0, 0xa4e8, 0xccc3, 0xa9f3, 0xac49, 0xceea, 0xaec7, 0xd1d2, 0xd1d0, 0xd1d1, 0xaec8, 0xd1cf, 0xb1db, 0xb1dc, 0xd5a8, 0xb1dd, 0xb1da, 0xd97d, 0xd97e, 0xddbe, 0xba59, 0xba58, 0xecf1, 0xefd9, 0xf24a, 0xf249, 0xf44f, 0xc95e, 0xac4a, 0xa4e9, 0xa5b9, 0xa6ae, 0xa6ad, 0xa6af, 0xa6b0, 0xc9ee, 0xc9ed, 0xcaf8, 0xa7f2, 0xcafb, 0xcafa, 0xcaf9, 0xcafc, 0xa9f4, 0xccc9, 0xccc5, 0xccce, 0xa9fb, 0xa9f9, 0xccca, 0xccc6, 0xcccd, 0xa9f8, 0xaa40, 0xccc8, 0xccc4, 0xa9fe, 0xcccb, 0xa9f7, 0xcccc, 0xa9fa, 0xa9fc, 0xccd0, 0xcccf, 0xccc7, 0xa9f6, 0xa9f5, 0xa9fd, 0xceef, 0xcef5, 0xac50, 0xac4d, 0xceec, 0xcef1, 0xac53, 0xac4b, 0xcef0, 0xac4e, 0xac51, 0xcef3, 0xac4c, 0xcef8, 0xac4f, 0xac52, 0xceed, 0xcef2, 0xcef6, 0xceee, 0xceeb, 0xcef7, 0xcef4, 0xaed0, 0xaec9, 0xaecc, 0xaecf, 0xd1d5, 0xaeca, 0xd1d3, 0xaece, 0xaecb, 0xd1d6, 0xaecd, 0xd5ac, 0xb1df, 0xd5ab, 0xd5ad, 0xb1de, 0xb1e3, 0xd1d4, 0xd5aa, 0xd5ae, 0xb1e0, 0xd5a9, 0xb1e2, 0xb1e1, 0xd9a7, 0xd9a2, 0xb4b6, 0xb4ba, 0xb4b7, 0xd9a5, 0xd9a8, 0xb4b8, 0xb4b9, 0xb4be, 0xddc7, 0xd9a6, 0xb4bc, 0xd9a3, 0xd9a1, 0xb4bd, 0xd9a4, 0xb779, 0xddbf, 0xb776, 0xb777, 0xb775, 0xddc4, 0xddc3, 0xddc0, 0xb77b, 0xddc2, 0xb4bb, 0xddc6, 0xddc1, 0xb778, 0xb774, 0xb77a, 0xddc5, 0xba5c, 0xe1f8, 0xe1f7, 0xe1f6, 0xba5a, 0xba5b, 0xe5c5, 0xe5c8, 0xbcc8, 0xbcc7, 0xe5c9, 0xe5c4, 0xbcca, 0xe5c6, 0xbcc9, 0xe5c3, 0xe5c7, 0xbee9, 0xbee6, 0xe9bb, 0xe9ba, 0xe9b9, 0xe9b4, 0xe9b5, 0xbee7, 0xbee4, 0xbee8, 0xe9b3, 0xbee5, 0xe9b6, 0xe9b7, 0xe9bc, 0xe9b8, 0xecf2, 0xc0c7, 0xefdc, 0xc0c6, 0xefda, 0xefdb, 0xc260, 0xc36e, 0xf24b, 0xc36d, 0xf451, 0xf452, 0xc466, 0xf450, 0xc4e4, 0xf7df, 0xc5ce, 0xf8aa, 0xf8ab, 0xa4ea, 0xa6b1, 0xa6b2, 0xa7f3, 0xccd1, 0xac54, 0xaed1, 0xb1e4, 0xb0d2, 0xb4bf, 0xb4c0, 0xb3cc, 0xd9a9, 0xb77c, 0xe1fa, 0xe1f9, 0xa4eb, 0xa6b3, 0xccd2, 0xaa42, 0xaa41, 0xcef9, 0xcefa, 0xd1d7, 0xd1d8, 0xaed2, 0xaed3, 0xaed4, 0xd5af, 0xb1e6, 0xb4c2, 0xb4c1, 0xddc8, 0xdf7a, 0xe1fb, 0xe9bd, 0xc261, 0xc467, 0xa4ec, 0xa5bc, 0xa5bd, 0xa5bb, 0xa5be, 0xa5ba, 0xa6b6, 0xc9f6, 0xa6b5, 0xa6b7, 0xc9f1, 0xc9f0, 0xc9f3, 0xc9f2, 0xc9f5, 0xa6b4, 0xc9ef, 0xc9f4, 0xcafd, 0xa7fd, 0xcafe, 0xcb43, 0xa7fc, 0xcb47, 0xcb42, 0xcb45, 0xa7f5, 0xa7f6, 0xa7f7, 0xa7f8, 0xa840, 0xcb41, 0xa7fa, 0xa841, 0xcb40, 0xcb46, 0xa7f9, 0xcb44, 0xa7fb, 0xa7f4, 0xa7fe, 0xaa57, 0xccd4, 0xaa43, 0xaa4d, 0xaa4e, 0xaa46, 0xaa58, 0xaa48, 0xccdc, 0xaa53, 0xccd7, 0xaa49, 0xcce6, 0xcce7, 0xccdf, 0xccd8, 0xaa56, 0xcce4, 0xaa51, 0xaa4f, 0xcce5, 0xcce3, 0xccdb, 0xccd3, 0xccda, 0xaa4a, 0xaa50, 0xaa44, 0xccde, 0xccdd, 0xccd5, 0xaa52, 0xcce1, 0xccd6, 0xaa55, 0xcce8, 0xaa45, 0xaa4c, 0xccd9, 0xcce2, 0xaa54, 0xaa47, 0xaa4b, 0xcce0, 0xcf5b, 0xac5c, 0xac69, 0xcf56, 0xcf4c, 0xac62, 0xcf4a, 0xac5b, 0xcf45, 0xac65, 0xcf52, 0xcefe, 0xcf41, 0xcf44, 0xcefb, 0xcf51, 0xcf61, 0xac60, 0xcf46, 0xcf58, 0xcefd, 0xcf5f, 0xcf60, 0xcf63, 0xcf5a, 0xcf4b, 0xcf53, 0xac66, 0xac59, 0xac61, 0xac6d, 0xac56, 0xac58, 0xcf43, 0xac6a, 0xac63, 0xcf5d, 0xcf40, 0xac6c, 0xac67, 0xcf49, 0xac6b, 0xcf50, 0xcf48, 0xac64, 0xcf5c, 0xcf54, 0xac5e, 0xcf62, 0xcf47, 0xac5a, 0xcf59, 0xcf4f, 0xac5f, 0xcf55, 0xac57, 0xcefc, 0xac68, 0xaee3, 0xac5d, 0xcf4e, 0xcf4d, 0xcf42, 0xcf5e, 0xcf57, 0xac55, 0xd1ec, 0xaeea, 0xd1ed, 0xd1e1, 0xaedf, 0xaeeb, 0xd1da, 0xd1e3, 0xd1eb, 0xd1d9, 0xd1f4, 0xaed5, 0xd1f3, 0xd1ee, 0xd1ef, 0xaedd, 0xaee8, 0xd1e5, 0xd1e6, 0xd1f0, 0xd1e7, 0xd1e2, 0xd1dc, 0xd1dd, 0xd1ea, 0xd1e4, 0xaed6, 0xaeda, 0xd1f2, 0xd1de, 0xaee6, 0xaee2, 0xaee5, 0xaeec, 0xaedb, 0xaee7, 0xd1e9, 0xaee9, 0xaed8, 0xaed7, 0xd1db, 0xd1df, 0xaee0, 0xd1f1, 0xd1e8, 0xd1e0, 0xaee4, 0xaee1, 0xaed9, 0xaedc, 0xd5c4, 0xd5b4, 0xd5b5, 0xd5b9, 0xd5c8, 0xd5c5, 0xd5be, 0xd5bd, 0xb1ed, 0xd5c1, 0xd5d0, 0xd5b0, 0xd5d1, 0xd5c3, 0xd5d5, 0xd5c9, 0xb1ec, 0xd5c7, 0xb1e7, 0xb1fc, 0xb1f2, 0xb1f6, 0xb1f5, 0xd5b1, 0xd5ce, 0xd5d4, 0xd5cc, 0xd5d3, 0xd5c0, 0xd5b2, 0xd5d2, 0xd5c2, 0xb1ea, 0xb1f7, 0xd5cb, 0xb1f0, 0xd5ca, 0xd5b3, 0xb1f8, 0xb1fa, 0xd5cd, 0xb1fb, 0xb1e9, 0xd5ba, 0xd5cf, 0xb1ef, 0xb1f9, 0xd5bc, 0xd5c6, 0xd5b7, 0xd5bb, 0xb1f4, 0xd5b6, 0xb1e8, 0xb1f1, 0xb1ee, 0xd5bf, 0xaede, 0xd9c0, 0xb1eb, 0xb1f3, 0xd9c3, 0xd9d9, 0xd9ce, 0xb4d6, 0xb4d1, 0xd9bd, 0xb4d2, 0xd9cd, 0xd9c6, 0xd9d3, 0xb4ce, 0xd9ab, 0xd9d5, 0xb4c4, 0xd9b3, 0xb4c7, 0xb4c6, 0xb4d7, 0xd9ad, 0xd9cf, 0xd9d0, 0xb4c9, 0xb4c5, 0xd9bb, 0xb4d0, 0xd9b6, 0xd9d1, 0xb4cc, 0xd9c9, 0xd9d6, 0xd9b0, 0xd9b5, 0xd9af, 0xb4cb, 0xd9c2, 0xddde, 0xd9b1, 0xb4cf, 0xd9ba, 0xd9d2, 0xb4ca, 0xd9b7, 0xd9b4, 0xd9c5, 0xb4cd, 0xb4c3, 0xb4d9, 0xd9c8, 0xd9c7, 0xd9ac, 0xb4c8, 0xd9d4, 0xd9bc, 0xd9be, 0xd9cb, 0xd9ca, 0xd9aa, 0xb4d3, 0xb4d5, 0xd9b2, 0xd9b9, 0xd9c1, 0xb4d4, 0xd9b8, 0xd9c4, 0xd9d7, 0xd9cc, 0xd9d8, 0xd9ae, 0xddf2, 0xb7a6, 0xddf0, 0xdddb, 0xdde0, 0xddd9, 0xddec, 0xddcb, 0xddd2, 0xddea, 0xddf4, 0xdddc, 0xddcf, 0xdde2, 0xdde7, 0xddd3, 0xdde4, 0xddd0, 0xddd7, 0xddd8, 0xb7a8, 0xddeb, 0xdde9, 0xddcc, 0xddee, 0xddef, 0xddf1, 0xb7ac, 0xb7a4, 0xd5b8, 0xddd4, 0xdde6, 0xddd5, 0xb7a1, 0xb7b1, 0xdded, 0xb7af, 0xb7ab, 0xddca, 0xb7a3, 0xddcd, 0xb7b0, 0xdddd, 0xddc9, 0xb7a9, 0xdde1, 0xddd1, 0xb7aa, 0xddda, 0xb77e, 0xb4d8, 0xdde3, 0xd9bf, 0xddce, 0xdde8, 0xb7a5, 0xdde5, 0xb7a2, 0xdddf, 0xb7ad, 0xddd6, 0xddf3, 0xb7a7, 0xdec6, 0xb7ae, 0xe24a, 0xe248, 0xe25e, 0xe246, 0xe258, 0xb77d, 0xba5f, 0xe242, 0xe25d, 0xe247, 0xe255, 0xba64, 0xba5d, 0xe25b, 0xe240, 0xe25a, 0xba6f, 0xe251, 0xe261, 0xba6d, 0xe249, 0xba5e, 0xe24b, 0xe259, 0xba67, 0xe244, 0xba6b, 0xba61, 0xe24d, 0xe243, 0xe1fc, 0xe257, 0xba68, 0xe260, 0xe1fd, 0xba65, 0xe253, 0xba66, 0xe245, 0xe250, 0xe24c, 0xe24e, 0xba60, 0xe25f, 0xba6e, 0xe24f, 0xe262, 0xe1fe, 0xe254, 0xba63, 0xba6c, 0xba6a, 0xe241, 0xe256, 0xba69, 0xba62, 0xe252, 0xe25c, 0xe5d5, 0xe5d1, 0xe5cd, 0xe5e1, 0xe5de, 0xbccd, 0xe5e5, 0xe5d4, 0xbcd8, 0xe5db, 0xe5d0, 0xe5da, 0xbcd5, 0xe5ee, 0xe5eb, 0xe5dd, 0xe5ce, 0xe5e2, 0xe5e4, 0xbcd1, 0xe5d8, 0xe5d3, 0xe5ca, 0xbcce, 0xbcd6, 0xe5e7, 0xbcd7, 0xe5cb, 0xe5ed, 0xe5e0, 0xe5e6, 0xbcd4, 0xe5e3, 0xe5ea, 0xbcd9, 0xbcd3, 0xe5dc, 0xe5cf, 0xe5ef, 0xe5cc, 0xe5e8, 0xbcd0, 0xe5d6, 0xe5d7, 0xbccf, 0xbccc, 0xe5d2, 0xbcd2, 0xbccb, 0xe5e9, 0xe5ec, 0xe5d9, 0xe9ca, 0xe9c2, 0xe9be, 0xbef6, 0xbeeb, 0xbef0, 0xbeec, 0xe9cc, 0xe9d7, 0xbeea, 0xe9c4, 0xe9cd, 0xe5df, 0xe9ce, 0xbef1, 0xe9dd, 0xbef5, 0xbef8, 0xe9c0, 0xbef4, 0xe9db, 0xe9dc, 0xe9d2, 0xe9d1, 0xe9c9, 0xe9d3, 0xe9da, 0xe9d9, 0xbeef, 0xbeed, 0xe9cb, 0xe9c8, 0xe9c5, 0xe9d8, 0xbef7, 0xe9d6, 0xbef3, 0xbef2, 0xe9d0, 0xe9bf, 0xe9c1, 0xe9c3, 0xe9d5, 0xe9cf, 0xbeee, 0xe9c6, 0xe9d4, 0xe9c7, 0xc0cf, 0xed45, 0xc0c8, 0xecf5, 0xed41, 0xc0ca, 0xed48, 0xecfc, 0xecf7, 0xed49, 0xecf3, 0xecfe, 0xc0d1, 0xed44, 0xed4a, 0xecfd, 0xc0c9, 0xed40, 0xecf4, 0xc0d0, 0xed47, 0xecf9, 0xc0cc, 0xecfb, 0xecf8, 0xc0d2, 0xecfa, 0xc0cb, 0xc0ce, 0xed43, 0xecf6, 0xed46, 0xed42, 0xc263, 0xefe7, 0xc268, 0xc269, 0xc262, 0xefe6, 0xefe3, 0xefe4, 0xc266, 0xefde, 0xefe2, 0xc265, 0xefdf, 0xc267, 0xc264, 0xefdd, 0xefe1, 0xefe5, 0xf251, 0xf24e, 0xf257, 0xf256, 0xf254, 0xf24f, 0xc372, 0xf250, 0xc371, 0xc0cd, 0xf253, 0xc370, 0xf258, 0xf252, 0xf24d, 0xefe0, 0xc36f, 0xf24c, 0xf456, 0xf455, 0xf255, 0xc468, 0xf459, 0xf45a, 0xf454, 0xf458, 0xf453, 0xf5d1, 0xf457, 0xc4e7, 0xc4e5, 0xf5cf, 0xf5d2, 0xf5ce, 0xf5d0, 0xc4e6, 0xf6e5, 0xf6e6, 0xc576, 0xf6e4, 0xf7e2, 0xc5cf, 0xf7e0, 0xf7e1, 0xf8ac, 0xc656, 0xf8f3, 0xf8f1, 0xf8f2, 0xf8f4, 0xf9bb, 0xa4ed, 0xa6b8, 0xaa59, 0xcce9, 0xcf64, 0xd1f5, 0xd1f7, 0xd1f6, 0xd1f8, 0xb1fd, 0xd5d7, 0xd1f9, 0xd5d6, 0xd5d8, 0xd5d9, 0xd9da, 0xb4db, 0xd9db, 0xd9dd, 0xb4dc, 0xb4da, 0xd9dc, 0xddfa, 0xddf8, 0xddf7, 0xddf6, 0xddf5, 0xb7b2, 0xddf9, 0xba70, 0xe263, 0xe265, 0xba71, 0xe264, 0xbcdb, 0xbcda, 0xe5f0, 0xe9df, 0xe9de, 0xe9e0, 0xbef9, 0xed4b, 0xc0d3, 0xefe8, 0xc26a, 0xf259, 0xc577, 0xa4ee, 0xa5bf, 0xa6b9, 0xa842, 0xaa5a, 0xaa5b, 0xac6e, 0xd1fa, 0xb7b3, 0xe6d1, 0xbefa, 0xc26b, 0xa4ef, 0xa6ba, 0xcceb, 0xaa5c, 0xccea, 0xcf65, 0xac6f, 0xcf66, 0xac70, 0xd1fc, 0xaeee, 0xaeed, 0xd5de, 0xd5dc, 0xd5dd, 0xd5db, 0xd5da, 0xd9de, 0xd9e1, 0xb4de, 0xd9df, 0xb4dd, 0xd9e0, 0xddfb, 0xe266, 0xe267, 0xe268, 0xe5f3, 0xe5f2, 0xbcdc, 0xe5f1, 0xe5f4, 0xe9e1, 0xe9e2, 0xe9e3, 0xed4c, 0xc0d4, 0xc26c, 0xf25a, 0xc4e8, 0xc95f, 0xac71, 0xcf67, 0xaeef, 0xb1fe, 0xb4df, 0xd9e2, 0xb7b5, 0xb7b4, 0xe269, 0xe26a, 0xbcdd, 0xbcde, 0xe9e5, 0xe9e4, 0xefe9, 0xf7e3, 0xa4f0, 0xc960, 0xa5c0, 0xa843, 0xcb48, 0xac72, 0xb7b6, 0xa4f1, 0xcf68, 0xac73, 0xcf69, 0xc0d5, 0xa4f2, 0xccec, 0xcf6a, 0xd242, 0xd241, 0xd1fe, 0xd1fd, 0xd243, 0xd240, 0xb240, 0xb241, 0xb4e0, 0xd9e3, 0xd9e4, 0xd9e5, 0xde41, 0xde42, 0xde40, 0xddfd, 0xddfe, 0xb7b7, 0xe26b, 0xe5f7, 0xe5f6, 0xe5f5, 0xe5f8, 0xe9e7, 0xe9e6, 0xbefb, 0xe9e8, 0xc0d6, 0xed4d, 0xefea, 0xf25b, 0xf6e7, 0xa4f3, 0xa5c2, 0xa5c1, 0xaa5d, 0xc961, 0xc97e, 0xa6bb, 0xc9f7, 0xcb49, 0xcb4a, 0xaa5e, 0xcced, 0xac74, 0xcf6b, 0xcf6c, 0xaef0, 0xaef4, 0xd244, 0xaef3, 0xaef1, 0xaef2, 0xd5df, 0xb242, 0xb4e3, 0xb4e1, 0xb4e2, 0xd9e6, 0xba72, 0xa4f4, 0xc9a1, 0xa5c3, 0xc9a4, 0xa5c6, 0xc9a3, 0xa5c5, 0xa5c4, 0xa844, 0xc9a2, 0xc9f8, 0xc9fc, 0xc9fe, 0xca40, 0xa6c5, 0xa6c6, 0xc9fb, 0xa6c1, 0xc9f9, 0xc9fd, 0xa6c2, 0xa6bd, 0xa6be, 0xa6c4, 0xc9fa, 0xa6bc, 0xa845, 0xa6bf, 0xa6c0, 0xa6c3, 0xcb5b, 0xcb59, 0xcb4c, 0xa851, 0xcb53, 0xa84c, 0xcb4d, 0xcb55, 0xcb52, 0xa84f, 0xcb51, 0xa856, 0xcb5a, 0xa858, 0xa85a, 0xcb4b, 0xa84d, 0xcb5c, 0xa854, 0xa857, 0xcd45, 0xa847, 0xa85e, 0xa855, 0xcb4e, 0xa84a, 0xa859, 0xcb56, 0xa848, 0xa849, 0xcd43, 0xcb4f, 0xa850, 0xa85b, 0xcb5d, 0xcb50, 0xa84e, 0xa853, 0xccee, 0xa85c, 0xcb57, 0xa852, 0xa85d, 0xa846, 0xcb54, 0xa84b, 0xcb58, 0xcd44, 0xaa6a, 0xaa7a, 0xccf5, 0xaa71, 0xcd4b, 0xaa62, 0xaa65, 0xcd42, 0xccf3, 0xccf7, 0xaa6d, 0xaa6f, 0xccfa, 0xaa76, 0xaa68, 0xaa66, 0xaa67, 0xaa75, 0xcd47, 0xaa70, 0xccf9, 0xccfb, 0xaa6e, 0xaa73, 0xccfc, 0xcd4a, 0xac75, 0xaa79, 0xaa63, 0xcd49, 0xcd4d, 0xccf8, 0xcd4f, 0xcd40, 0xaa6c, 0xccf4, 0xaa6b, 0xaa7d, 0xaa72, 0xccf2, 0xcf75, 0xaa78, 0xaa7c, 0xcd41, 0xcd46, 0xaa7e, 0xaa77, 0xaa69, 0xaa5f, 0xaa64, 0xccf6, 0xaa60, 0xcd4e, 0xccf0, 0xccef, 0xccfd, 0xccf1, 0xaa7b, 0xaef5, 0xaa74, 0xccfe, 0xaa61, 0xaca6, 0xcd4c, 0xcf7c, 0xcfa1, 0xcfa4, 0xcf77, 0xcfa7, 0xcfaa, 0xcfac, 0xcf74, 0xac76, 0xac7b, 0xd249, 0xacad, 0xcfa5, 0xcfad, 0xcf7b, 0xcf73, 0xd264, 0xac7e, 0xcfa2, 0xcf78, 0xcf7a, 0xaca5, 0xcf7d, 0xac7d, 0xcf70, 0xcfa8, 0xcfab, 0xac7a, 0xaca8, 0xcf6d, 0xacaa, 0xac78, 0xacae, 0xcfa9, 0xcf6f, 0xacab, 0xd25e, 0xcd48, 0xac7c, 0xac77, 0xcf76, 0xcf6e, 0xacac, 0xaca4, 0xcfa3, 0xaca9, 0xaca7, 0xcf79, 0xaca1, 0xcf71, 0xaca2, 0xaca3, 0xcf72, 0xcfa6, 0xac79, 0xcf7e, 0xd24c, 0xaefd, 0xaf43, 0xd255, 0xd25b, 0xd257, 0xd24a, 0xd24d, 0xd246, 0xd247, 0xaf4a, 0xaefa, 0xd256, 0xd25f, 0xaf45, 0xaef6, 0xaf40, 0xd24e, 0xaf42, 0xd24f, 0xd259, 0xaf44, 0xd268, 0xd248, 0xaefc, 0xaefb, 0xaf48, 0xd245, 0xd266, 0xd25a, 0xd267, 0xd261, 0xd253, 0xd262, 0xd25c, 0xd265, 0xd263, 0xaf49, 0xd254, 0xaef9, 0xaef8, 0xaf41, 0xaf47, 0xd260, 0xaf46, 0xd251, 0xb243, 0xd269, 0xd250, 0xd24b, 0xaefe, 0xaf4b, 0xaef7, 0xd258, 0xd25d, 0xb265, 0xd5e1, 0xd5e5, 0xb252, 0xb250, 0xb247, 0xd5e3, 0xd5e2, 0xb25b, 0xd5e8, 0xb255, 0xd5fa, 0xd647, 0xb244, 0xd5f7, 0xd5f0, 0xb267, 0xd5e0, 0xd5fc, 0xb264, 0xb258, 0xb263, 0xb24e, 0xd5ec, 0xd5fe, 0xd5f6, 0xb24f, 0xb249, 0xd645, 0xd5fd, 0xd640, 0xb251, 0xb259, 0xd642, 0xd5ea, 0xd5fb, 0xd5ef, 0xd644, 0xb25e, 0xb246, 0xb25c, 0xd5f4, 0xd5f2, 0xd5f3, 0xb253, 0xd5ee, 0xd5ed, 0xb248, 0xd5e7, 0xd646, 0xb24a, 0xd5f1, 0xb268, 0xb262, 0xd5e6, 0xb25f, 0xb25d, 0xb266, 0xd5f8, 0xb261, 0xd252, 0xd5f9, 0xb260, 0xd641, 0xb245, 0xd5f5, 0xb257, 0xd5e9, 0xb256, 0xb254, 0xb24c, 0xb24b, 0xd9e7, 0xd643, 0xd5eb, 0xd9fc, 0xb24d, 0xb541, 0xb25a, 0xb4ee, 0xd9f6, 0xb4fc, 0xd9ea, 0xb4eb, 0xb4e7, 0xda49, 0xb4ed, 0xb4f1, 0xb4ec, 0xb4f5, 0xda4d, 0xda44, 0xd9f1, 0xb4fa, 0xb4f4, 0xd9fd, 0xb4e4, 0xda4a, 0xda43, 0xb4e8, 0xd9f7, 0xb4f7, 0xda55, 0xda56, 0xb4e5, 0xda48, 0xb4f9, 0xd9fb, 0xd9ed, 0xd9ee, 0xb4fd, 0xd9f2, 0xd9f9, 0xd9f3, 0xb4fb, 0xb544, 0xd9ef, 0xd9e8, 0xd9e9, 0xd9eb, 0xb4ea, 0xd9f8, 0xb4f8, 0xb542, 0xd9fa, 0xda53, 0xda4b, 0xb4e6, 0xda51, 0xb4f2, 0xb4f0, 0xda57, 0xb4ef, 0xda41, 0xd9f4, 0xd9fe, 0xb547, 0xda45, 0xda42, 0xd9f0, 0xb543, 0xda4f, 0xda4c, 0xda54, 0xb4e9, 0xda40, 0xb546, 0xda47, 0xb4f3, 0xb4f6, 0xda46, 0xb545, 0xd9f5, 0xd5e4, 0xda50, 0xda4e, 0xda52, 0xd9ec, 0xb540, 0xde61, 0xde60, 0xde46, 0xb7bd, 0xde5f, 0xde49, 0xde4a, 0xb7c7, 0xde68, 0xb7c2, 0xde5e, 0xde43, 0xb7c8, 0xb7be, 0xde52, 0xde48, 0xde4b, 0xde63, 0xb7b8, 0xde6a, 0xde62, 0xb7c1, 0xde57, 0xb7cc, 0xb7cb, 0xb7c5, 0xde69, 0xb7b9, 0xde55, 0xde4c, 0xde59, 0xde65, 0xb7cd, 0xb7bb, 0xde54, 0xde4d, 0xb7c4, 0xb7c3, 0xde50, 0xde5a, 0xde64, 0xde47, 0xde51, 0xb7bc, 0xde5b, 0xb7c9, 0xb7c0, 0xde4e, 0xb7bf, 0xde45, 0xde53, 0xde67, 0xb4fe, 0xbab0, 0xde56, 0xe26c, 0xde58, 0xde66, 0xb7c6, 0xde4f, 0xb7ba, 0xb7ca, 0xbcf0, 0xde44, 0xde5d, 0xde5c, 0xe2aa, 0xbaad, 0xe27d, 0xe2a4, 0xbaa2, 0xe26e, 0xbaaf, 0xba77, 0xe26d, 0xe2b0, 0xbab1, 0xe271, 0xe2a3, 0xe273, 0xe2b3, 0xe2af, 0xba75, 0xbaa1, 0xe653, 0xbaae, 0xba7d, 0xe26f, 0xe2ae, 0xbaa3, 0xe2ab, 0xe2b8, 0xe275, 0xe27e, 0xe2b6, 0xe2ac, 0xba7c, 0xe27c, 0xba76, 0xba74, 0xbaa8, 0xe27a, 0xe277, 0xe278, 0xe2b2, 0xe2b7, 0xe2b5, 0xba7a, 0xe2b9, 0xba7e, 0xbaa7, 0xe270, 0xe5fa, 0xe279, 0xba78, 0xbaac, 0xbaa9, 0xba7b, 0xe2a5, 0xe274, 0xbaaa, 0xe2a7, 0xbaa4, 0xbaa6, 0xba73, 0xe2a9, 0xe2a1, 0xe272, 0xbaa5, 0xe2b1, 0xe2b4, 0xe27b, 0xe2a8, 0xba79, 0xbcdf, 0xe2a6, 0xe5f9, 0xe2ad, 0xe276, 0xe644, 0xe64e, 0xbce2, 0xe64d, 0xe659, 0xbce4, 0xe64b, 0xe64f, 0xbcef, 0xe646, 0xbce7, 0xe652, 0xe9f0, 0xbcf3, 0xbcf2, 0xe654, 0xe643, 0xe65e, 0xbced, 0xbce3, 0xe657, 0xe65b, 0xe660, 0xe655, 0xe649, 0xbce6, 0xbce9, 0xbcf1, 0xbcec, 0xe64c, 0xe2a2, 0xe648, 0xe65f, 0xbce8, 0xbceb, 0xe661, 0xbce0, 0xe656, 0xe5fb, 0xe65c, 0xc0df, 0xe64a, 0xbce1, 0xe645, 0xbce5, 0xe5fc, 0xbaab, 0xe641, 0xe65a, 0xe642, 0xe640, 0xbcea, 0xe658, 0xe5fe, 0xe651, 0xe650, 0xe65d, 0xe647, 0xbcee, 0xe9f3, 0xbf49, 0xbefe, 0xea40, 0xe9eb, 0xbf41, 0xe9f7, 0xbf48, 0xbf43, 0xe9f5, 0xed4f, 0xe9fb, 0xea42, 0xe9fa, 0xe9e9, 0xe9f8, 0xea44, 0xea46, 0xbefd, 0xea45, 0xbf44, 0xbf4a, 0xbf47, 0xe9fe, 0xbf46, 0xe9f9, 0xe9ed, 0xe9f2, 0xe9fd, 0xbf45, 0xbf42, 0xbefc, 0xbf40, 0xe9f1, 0xe5fd, 0xe9ec, 0xe9ef, 0xea41, 0xe9f4, 0xe9ea, 0xed4e, 0xea43, 0xe9ee, 0xe9fc, 0xed51, 0xc0e3, 0xc0d7, 0xc0db, 0xed53, 0xed59, 0xed57, 0xc0d9, 0xc0da, 0xc0e1, 0xed5a, 0xed52, 0xc0dc, 0xed56, 0xed55, 0xed5b, 0xc0e2, 0xc0dd, 0xc0e0, 0xed54, 0xc0e4, 0xc0de, 0xc0e5, 0xc0d8, 0xed58, 0xed50, 0xeff7, 0xc271, 0xeff4, 0xeff6, 0xc26f, 0xeff2, 0xeff3, 0xefee, 0xe9f6, 0xefef, 0xc270, 0xefeb, 0xc26d, 0xeff8, 0xc26e, 0xefec, 0xefed, 0xeff1, 0xc273, 0xc272, 0xeff0, 0xc378, 0xf25f, 0xf265, 0xc379, 0xf25c, 0xc376, 0xc373, 0xf267, 0xc377, 0xc374, 0xf25e, 0xf261, 0xf262, 0xf263, 0xf266, 0xeff5, 0xf25d, 0xc375, 0xf264, 0xf268, 0xf260, 0xf45d, 0xc46a, 0xf460, 0xc46b, 0xf468, 0xf45f, 0xf45c, 0xf45e, 0xf462, 0xf465, 0xf464, 0xf467, 0xf45b, 0xc469, 0xf463, 0xf466, 0xf469, 0xf461, 0xf5d3, 0xf5d4, 0xf5d8, 0xf5d9, 0xf5d6, 0xf5d7, 0xf5d5, 0xc4e9, 0xc578, 0xf6eb, 0xf6e8, 0xf6e9, 0xf6ea, 0xc579, 0xf7e5, 0xf7e4, 0xf8af, 0xc5f4, 0xf8ad, 0xf8b0, 0xf8ae, 0xf8f5, 0xc657, 0xc665, 0xf9a3, 0xf96c, 0xf9a2, 0xf9d0, 0xf9d1, 0xa4f5, 0xa6c7, 0xca41, 0xcb5e, 0xa85f, 0xa862, 0xcb5f, 0xa860, 0xa861, 0xcd58, 0xcd5a, 0xcd55, 0xcd52, 0xcd54, 0xaaa4, 0xaaa2, 0xcd56, 0xaaa3, 0xcd53, 0xcd50, 0xaaa1, 0xcd57, 0xcd51, 0xaaa5, 0xcd59, 0xcfaf, 0xcfb3, 0xacb7, 0xcfb6, 0xacaf, 0xacb2, 0xacb4, 0xacb6, 0xacb3, 0xcfb2, 0xcfb1, 0xacb1, 0xcfb4, 0xcfb5, 0xcfae, 0xacb5, 0xacb0, 0xcfb0, 0xd277, 0xd278, 0xd279, 0xaf50, 0xaf4c, 0xd26e, 0xd276, 0xd27b, 0xaf51, 0xd26c, 0xd272, 0xd26b, 0xd275, 0xd271, 0xaf4d, 0xaf4f, 0xd27a, 0xd26a, 0xd26d, 0xd273, 0xd274, 0xd27c, 0xd270, 0xaf4e, 0xb26d, 0xd64e, 0xd650, 0xd64c, 0xd658, 0xd64a, 0xd657, 0xb269, 0xd648, 0xda5b, 0xd652, 0xb26c, 0xd653, 0xd656, 0xd65a, 0xd64f, 0xd654, 0xb26a, 0xb26b, 0xd659, 0xd64d, 0xd649, 0xd65b, 0xd651, 0xd655, 0xd64b, 0xb548, 0xb549, 0xda65, 0xb54f, 0xda59, 0xda62, 0xda58, 0xb54c, 0xda60, 0xda5e, 0xda5f, 0xb54a, 0xda63, 0xda5c, 0xda5a, 0xb54b, 0xda5d, 0xda61, 0xb54d, 0xda64, 0xde70, 0xde77, 0xde79, 0xdea1, 0xb7da, 0xde6b, 0xb7d2, 0xde7a, 0xb7d7, 0xdea2, 0xb7ce, 0xde7d, 0xde6d, 0xde7e, 0xde6c, 0xb7dc, 0xde78, 0xb7cf, 0xdea3, 0xb7d4, 0xde71, 0xb7d9, 0xde7c, 0xde6f, 0xde76, 0xde72, 0xde6e, 0xb7d1, 0xb7d8, 0xb7d6, 0xb7d3, 0xb7db, 0xb7d0, 0xde75, 0xb7d5, 0xb54e, 0xde7b, 0xde73, 0xde74, 0xe2c1, 0xbab4, 0xe2bd, 0xe2c3, 0xe2bf, 0xbab6, 0xe2be, 0xe2c2, 0xe2ba, 0xe2bc, 0xbab5, 0xe2c0, 0xe2bb, 0xbab7, 0xbab2, 0xe2c4, 0xbab3, 0xe667, 0xe664, 0xe670, 0xe66a, 0xe66c, 0xbcf4, 0xe666, 0xe66e, 0xe66d, 0xe66b, 0xe671, 0xbcf7, 0xe668, 0xe66f, 0xbcf5, 0xe663, 0xe665, 0xbcf6, 0xe662, 0xe672, 0xe669, 0xea4a, 0xbf51, 0xea55, 0xea53, 0xbf4b, 0xea49, 0xea4c, 0xea4d, 0xea48, 0xbf55, 0xbf56, 0xea47, 0xea56, 0xea51, 0xbf4f, 0xbf4c, 0xea50, 0xea4e, 0xbf52, 0xea52, 0xbf4d, 0xbf4e, 0xea4f, 0xbf50, 0xea4b, 0xea54, 0xbf53, 0xea57, 0xea58, 0xbf54, 0xc0e7, 0xc0ee, 0xed5c, 0xed62, 0xed60, 0xc0ea, 0xc0e9, 0xc0e6, 0xed5e, 0xc0ec, 0xc0eb, 0xc0e8, 0xed61, 0xed5d, 0xed5f, 0xc0ed, 0xc277, 0xeffb, 0xc274, 0xc275, 0xeffd, 0xc276, 0xeffa, 0xeff9, 0xf26c, 0xeffc, 0xf26d, 0xc37a, 0xf26b, 0xf26a, 0xf269, 0xc37b, 0xc46c, 0xf46a, 0xf46b, 0xf5dc, 0xf5db, 0xc4ea, 0xf5da, 0xf6ec, 0xf6ed, 0xf7e6, 0xf8b1, 0xf8f6, 0xf9bc, 0xc679, 0xf9c6, 0xa4f6, 0xaaa6, 0xaaa7, 0xacb8, 0xc0ef, 0xa4f7, 0xaaa8, 0xaf52, 0xb7dd, 0xa4f8, 0xb26e, 0xbab8, 0xc962, 0xcfb7, 0xd27d, 0xe2c5, 0xc0f0, 0xa4f9, 0xaaa9, 0xcfb8, 0xcfb9, 0xda66, 0xb550, 0xdea4, 0xb7de, 0xe2c6, 0xbcf8, 0xc37c, 0xa4fa, 0xda67, 0xa4fb, 0xa6c9, 0xca42, 0xa6c8, 0xa865, 0xa864, 0xa863, 0xcb60, 0xaaaa, 0xaaab, 0xcd5b, 0xcfba, 0xcfbd, 0xacba, 0xcfbb, 0xacb9, 0xcfbc, 0xacbb, 0xd2a2, 0xd2a1, 0xd27e, 0xaf53, 0xd65d, 0xd65e, 0xb26f, 0xd65c, 0xd65f, 0xb552, 0xb270, 0xb551, 0xda6b, 0xda6a, 0xda68, 0xda69, 0xda6c, 0xdea6, 0xdea5, 0xdea9, 0xdea8, 0xdea7, 0xbab9, 0xe2c9, 0xe2c8, 0xbaba, 0xe2c7, 0xe673, 0xe674, 0xbcf9, 0xea59, 0xea5a, 0xf272, 0xc37d, 0xf271, 0xf270, 0xf26e, 0xf26f, 0xc4eb, 0xf46c, 0xf6ee, 0xf8f7, 0xa4fc, 0xc9a5, 0xa5c7, 0xc9a6, 0xca43, 0xca44, 0xcb66, 0xcb62, 0xcb61, 0xaaac, 0xcb65, 0xa867, 0xcb63, 0xa866, 0xcb67, 0xcb64, 0xcd5f, 0xcfbe, 0xcd5d, 0xcd64, 0xaaad, 0xaab0, 0xcd65, 0xcd61, 0xcd62, 0xcd5c, 0xaaaf, 0xcd5e, 0xaaae, 0xcd63, 0xcd60, 0xcfc2, 0xacbd, 0xacbe, 0xcfc5, 0xcfbf, 0xcfc4, 0xcfc0, 0xacbc, 0xcfc3, 0xcfc1, 0xd2a8, 0xd2a5, 0xd2a7, 0xaf58, 0xaf57, 0xaf55, 0xd2a4, 0xd2a9, 0xaf54, 0xaf56, 0xd2a6, 0xd667, 0xd2a3, 0xd2aa, 0xd662, 0xd666, 0xd665, 0xda6e, 0xda79, 0xd668, 0xd663, 0xda6d, 0xb274, 0xb273, 0xd661, 0xd664, 0xb275, 0xb272, 0xb271, 0xd660, 0xd669, 0xda70, 0xda77, 0xb554, 0xda76, 0xda73, 0xb556, 0xda75, 0xda6f, 0xda71, 0xda74, 0xda72, 0xb555, 0xda78, 0xb553, 0xb7df, 0xdead, 0xdeac, 0xdeaa, 0xb7e2, 0xb7e1, 0xdeae, 0xdeab, 0xe2ca, 0xbabb, 0xb7e0, 0xdeb0, 0xdeaf, 0xe2cd, 0xe2cb, 0xbcfa, 0xbabc, 0xe2cc, 0xe676, 0xbcfb, 0xe675, 0xe67e, 0xe67d, 0xe67b, 0xe67a, 0xe677, 0xe678, 0xe679, 0xe67c, 0xe6a1, 0xea5f, 0xea5c, 0xea5d, 0xbf57, 0xea5b, 0xea61, 0xea60, 0xea5e, 0xed64, 0xed65, 0xc0f1, 0xc0f2, 0xed63, 0xc279, 0xeffe, 0xc278, 0xc37e, 0xc3a1, 0xc46d, 0xf46e, 0xf46d, 0xf5dd, 0xf6ef, 0xc57a, 0xf7e8, 0xf7e7, 0xf7e9, 0xa5c8, 0xcfc6, 0xaf59, 0xb276, 0xd66a, 0xa5c9, 0xc9a7, 0xa4fd, 0xca45, 0xcb6c, 0xcb6a, 0xcb6b, 0xcb68, 0xa868, 0xcb69, 0xcd6d, 0xaab3, 0xcd6b, 0xcd67, 0xcd6a, 0xcd66, 0xaab5, 0xcd69, 0xaab2, 0xaab1, 0xaab4, 0xcd6c, 0xcd68, 0xacc2, 0xacc5, 0xcfce, 0xcfcd, 0xcfcc, 0xacbf, 0xcfd5, 0xcfcb, 0xacc1, 0xd2af, 0xcfd2, 0xcfd0, 0xacc4, 0xcfc8, 0xcfd3, 0xcfca, 0xcfd4, 0xcfd1, 0xcfc9, 0xacc0, 0xcfd6, 0xcfc7, 0xacc3, 0xd2b4, 0xd2ab, 0xd2b6, 0xd2ae, 0xd2b9, 0xd2ba, 0xd2ac, 0xd2b8, 0xd2b5, 0xd2b3, 0xd2b7, 0xaf5f, 0xaf5d, 0xd2b1, 0xd2ad, 0xd2b0, 0xd2bb, 0xd2b2, 0xaf5e, 0xcfcf, 0xaf5a, 0xaf5c, 0xd678, 0xd66d, 0xd66b, 0xd66c, 0xd673, 0xd674, 0xd670, 0xb27b, 0xd675, 0xd672, 0xd66f, 0xb279, 0xd66e, 0xb277, 0xb27a, 0xd671, 0xd679, 0xaf5b, 0xb278, 0xd677, 0xd676, 0xb27c, 0xda7e, 0xdaa1, 0xb560, 0xdaa7, 0xdaa9, 0xdaa2, 0xb55a, 0xdaa6, 0xdaa5, 0xb55b, 0xb561, 0xb562, 0xdaa8, 0xb558, 0xda7d, 0xda7b, 0xdaa3, 0xda7a, 0xb55f, 0xda7c, 0xdaa4, 0xdaaa, 0xb559, 0xb55e, 0xb55c, 0xb55d, 0xb557, 0xb7e9, 0xdeb7, 0xb7e8, 0xdebb, 0xdeb1, 0xdebc, 0xdeb2, 0xdeb3, 0xdebd, 0xdeba, 0xdeb8, 0xdeb9, 0xdeb5, 0xdeb4, 0xdebe, 0xb7e5, 0xdeb6, 0xb7ea, 0xb7e4, 0xb7eb, 0xb7ec, 0xb7e7, 0xb7e6, 0xe2ce, 0xbabe, 0xbabd, 0xe2d3, 0xbcfc, 0xbabf, 0xbac1, 0xe2d4, 0xb7e3, 0xbac0, 0xe2d0, 0xe2d2, 0xe2cf, 0xe2d1, 0xe6ab, 0xe6aa, 0xe6a7, 0xbd40, 0xea62, 0xbd41, 0xe6a6, 0xbcfe, 0xe6a8, 0xe6a5, 0xe6a2, 0xe6a9, 0xe6a3, 0xe6a4, 0xbcfd, 0xed69, 0xea66, 0xea65, 0xea67, 0xed66, 0xbf5a, 0xea63, 0xbf58, 0xbf5c, 0xbf5b, 0xea64, 0xea68, 0xbf59, 0xed6d, 0xc0f5, 0xc27a, 0xc0f6, 0xc0f3, 0xed6a, 0xed68, 0xed6b, 0xed6e, 0xc0f4, 0xed6c, 0xed67, 0xf042, 0xf045, 0xf275, 0xf040, 0xf46f, 0xf046, 0xc3a2, 0xf044, 0xc27b, 0xf041, 0xf043, 0xf047, 0xf276, 0xf274, 0xc3a3, 0xf273, 0xc46e, 0xc4ed, 0xf6f1, 0xc4ec, 0xf6f3, 0xf6f0, 0xf6f2, 0xc5d0, 0xf8b2, 0xa5ca, 0xcd6e, 0xd2bc, 0xd2bd, 0xb27d, 0xdebf, 0xbf5d, 0xc3a4, 0xc57b, 0xf8b3, 0xa5cb, 0xcd6f, 0xa260, 0xcfd7, 0xcfd8, 0xd2be, 0xd2bf, 0xb27e, 0xb2a1, 0xdaab, 0xdec2, 0xdec1, 0xdec0, 0xe2d5, 0xe2d6, 0xe2d7, 0xbac2, 0xe6ad, 0xe6ac, 0xea69, 0xbf5e, 0xbf5f, 0xed72, 0xed6f, 0xed70, 0xed71, 0xf049, 0xf048, 0xc27c, 0xf277, 0xf5de, 0xa5cc, 0xacc6, 0xb2a2, 0xdec3, 0xa5cd, 0xd2c0, 0xb2a3, 0xb563, 0xb564, 0xa5ce, 0xa5cf, 0xca46, 0xa86a, 0xa869, 0xacc7, 0xcfd9, 0xdaac, 0xa5d0, 0xa5d1, 0xa5d2, 0xa5d3, 0xa86b, 0xa86c, 0xcb6e, 0xcb6d, 0xaab6, 0xcd72, 0xcd70, 0xcd71, 0xcfda, 0xcfdb, 0xaccb, 0xacc9, 0xacca, 0xacc8, 0xaf60, 0xaf64, 0xaf63, 0xd2c1, 0xaf62, 0xaf61, 0xd2c2, 0xb2a6, 0xd67b, 0xd67a, 0xb2a4, 0xb2a5, 0xb566, 0xb565, 0xdaae, 0xdaad, 0xb2a7, 0xb7ed, 0xdec5, 0xb7ee, 0xdec4, 0xe2d8, 0xe6ae, 0xbd42, 0xea6a, 0xed73, 0xc3a6, 0xc3a5, 0xc57c, 0xa5d4, 0xcd73, 0xb2a8, 0xe2d9, 0xbac3, 0xcb6f, 0xcb70, 0xcd74, 0xaab8, 0xaab9, 0xaab7, 0xaccf, 0xacd0, 0xaccd, 0xacce, 0xcfdc, 0xcfdd, 0xaccc, 0xd2c3, 0xaf68, 0xaf69, 0xb2ab, 0xd2c9, 0xaf6e, 0xaf6c, 0xd2ca, 0xd2c5, 0xaf6b, 0xaf6a, 0xaf65, 0xd2c8, 0xd2c7, 0xd2c4, 0xaf6d, 0xd2c6, 0xaf66, 0xaf67, 0xb2ac, 0xd6a1, 0xd6a2, 0xb2ad, 0xd67c, 0xd67e, 0xd6a4, 0xd6a3, 0xd67d, 0xb2a9, 0xb2aa, 0xdab6, 0xb56b, 0xb56a, 0xdab0, 0xb568, 0xdab3, 0xb56c, 0xdab4, 0xb56d, 0xdab1, 0xb567, 0xb569, 0xdab5, 0xdab2, 0xdaaf, 0xded2, 0xdec7, 0xb7f0, 0xb7f3, 0xb7f2, 0xb7f7, 0xb7f6, 0xded3, 0xded1, 0xdeca, 0xdece, 0xdecd, 0xb7f4, 0xded0, 0xdecc, 0xded4, 0xdecb, 0xb7f5, 0xb7ef, 0xb7f1, 0xdec9, 0xe2db, 0xbac7, 0xe2df, 0xbac6, 0xe2dc, 0xbac5, 0xdec8, 0xdecf, 0xe2de, 0xbac8, 0xe2e0, 0xe2dd, 0xe2da, 0xe6b1, 0xe6b5, 0xe6b7, 0xe6b3, 0xe6b2, 0xe6b0, 0xbd45, 0xbd43, 0xbd48, 0xbd49, 0xe6b4, 0xbd46, 0xe6af, 0xbd47, 0xbac4, 0xe6b6, 0xbd44, 0xea6c, 0xea6b, 0xea73, 0xea6d, 0xea72, 0xea6f, 0xbf60, 0xea71, 0xbf61, 0xbf62, 0xea70, 0xea6e, 0xc0f8, 0xed74, 0xc0f7, 0xed77, 0xed75, 0xed76, 0xc0f9, 0xf04d, 0xc2a1, 0xf04e, 0xc27d, 0xf04f, 0xc27e, 0xf04c, 0xf050, 0xf04a, 0xc3a7, 0xf278, 0xc3a8, 0xc46f, 0xf04b, 0xc470, 0xc4ee, 0xf5df, 0xc57e, 0xf6f4, 0xc57d, 0xf7ea, 0xc5f5, 0xc5f6, 0xf9cc, 0xacd1, 0xcfde, 0xb56e, 0xb56f, 0xa5d5, 0xa6ca, 0xca47, 0xcb71, 0xa86d, 0xaaba, 0xacd2, 0xacd3, 0xacd4, 0xd6a6, 0xd2cb, 0xaf6f, 0xb2ae, 0xd6a5, 0xdab8, 0xb571, 0xdab7, 0xb570, 0xded5, 0xbd4a, 0xe6bb, 0xe6b8, 0xe6b9, 0xe6ba, 0xed78, 0xf051, 0xf471, 0xf470, 0xf6f5, 0xa5d6, 0xcd75, 0xaf70, 0xb572, 0xded6, 0xe2e1, 0xbd4b, 0xea74, 0xf052, 0xf472, 0xa5d7, 0xaabb, 0xacd7, 0xcfdf, 0xacd8, 0xacd6, 0xacd5, 0xd2cc, 0xaf71, 0xaf72, 0xaf73, 0xb2b0, 0xd6a7, 0xb2af, 0xdab9, 0xb2b1, 0xb573, 0xded7, 0xb7f8, 0xb7f9, 0xbac9, 0xbaca, 0xbd4c, 0xbf64, 0xea75, 0xbf63, 0xed79, 0xc0fa, 0xf053, 0xf473, 0xa5d8, 0xa86e, 0xcd78, 0xcd77, 0xaabc, 0xcd76, 0xaabd, 0xcd79, 0xcfe5, 0xacdb, 0xacda, 0xcfe7, 0xcfe6, 0xacdf, 0xacde, 0xacd9, 0xcfe1, 0xcfe2, 0xcfe3, 0xace0, 0xcfe0, 0xacdc, 0xcfe4, 0xacdd, 0xd2cf, 0xd2d3, 0xd2d1, 0xd2d0, 0xd2d4, 0xd2d5, 0xd2d6, 0xd2ce, 0xd2cd, 0xaf75, 0xaf76, 0xd2d7, 0xd2d2, 0xd6b0, 0xd2d8, 0xaf77, 0xaf74, 0xd6aa, 0xd6a9, 0xd6ab, 0xd6ac, 0xd6ae, 0xd6ad, 0xd6b2, 0xb2b5, 0xb2b2, 0xb2b6, 0xd6a8, 0xb2b7, 0xd6b1, 0xb2b4, 0xd6af, 0xb2b3, 0xdabc, 0xdabe, 0xdaba, 0xdabb, 0xdabf, 0xdac1, 0xdac2, 0xdabd, 0xdac0, 0xb574, 0xdedb, 0xdee0, 0xded8, 0xdedc, 0xdee1, 0xdedd, 0xb7fa, 0xb843, 0xb7fd, 0xded9, 0xdeda, 0xbace, 0xb846, 0xb7fe, 0xb844, 0xb7fc, 0xdedf, 0xb845, 0xdede, 0xb841, 0xb7fb, 0xb842, 0xdee2, 0xe2e6, 0xe2e8, 0xb840, 0xe2e3, 0xbacc, 0xe2e9, 0xbacd, 0xe2e7, 0xe2e2, 0xe2e5, 0xe2ea, 0xbacb, 0xe2e4, 0xbd4e, 0xe6bf, 0xe6be, 0xbd51, 0xbd4f, 0xe6bc, 0xbd4d, 0xe6bd, 0xbd50, 0xea7d, 0xeaa1, 0xea7e, 0xea76, 0xea7a, 0xea79, 0xea77, 0xbf66, 0xbf67, 0xbf65, 0xea78, 0xea7b, 0xea7c, 0xbf68, 0xc140, 0xeda3, 0xc0fc, 0xed7b, 0xc0fe, 0xc141, 0xc0fd, 0xeda2, 0xed7c, 0xc0fb, 0xeda1, 0xed7a, 0xed7e, 0xed7d, 0xf055, 0xc2a4, 0xc2a5, 0xc2a2, 0xc2a3, 0xf054, 0xf27b, 0xc3a9, 0xf279, 0xf27a, 0xf474, 0xf477, 0xf475, 0xf476, 0xf5e0, 0xc4ef, 0xf7eb, 0xf8b4, 0xc5f7, 0xf8f8, 0xf8f9, 0xc666, 0xa5d9, 0xace1, 0xdac3, 0xdee3, 0xa5da, 0xa86f, 0xaabe, 0xcfe8, 0xcfe9, 0xaf78, 0xdac4, 0xb575, 0xb847, 0xc142, 0xeda4, 0xf27c, 0xf478, 0xa5db, 0xcda1, 0xcd7a, 0xcd7c, 0xcd7e, 0xcd7d, 0xcd7b, 0xaabf, 0xace2, 0xcff2, 0xcfed, 0xcfea, 0xcff1, 0xace4, 0xace5, 0xcff0, 0xcfef, 0xcfee, 0xcfeb, 0xcfec, 0xcff3, 0xace3, 0xaf7c, 0xafa4, 0xafa3, 0xd2e1, 0xd2db, 0xd2d9, 0xafa1, 0xd6b9, 0xaf7a, 0xd2de, 0xd2e2, 0xd2e4, 0xd2e0, 0xd2da, 0xafa2, 0xd2df, 0xd2dd, 0xaf79, 0xd2e5, 0xafa5, 0xd2e3, 0xaf7d, 0xd2dc, 0xaf7e, 0xaf7b, 0xb2b9, 0xd6ba, 0xd6b3, 0xd6b5, 0xd6b7, 0xd6b8, 0xd6b6, 0xb2ba, 0xd6bb, 0xd6b4, 0xdac8, 0xb576, 0xdad0, 0xdac5, 0xdad1, 0xdac6, 0xdac7, 0xdacf, 0xdace, 0xdacb, 0xb2b8, 0xb577, 0xdac9, 0xdacc, 0xb578, 0xdacd, 0xdaca, 0xdeee, 0xdef2, 0xb84e, 0xe2f0, 0xb851, 0xdef0, 0xdeed, 0xdee8, 0xdeea, 0xdeeb, 0xdee4, 0xb84d, 0xb84c, 0xb848, 0xdee7, 0xb84f, 0xb850, 0xdee6, 0xdee9, 0xdef1, 0xb84a, 0xb84b, 0xdeef, 0xdee5, 0xe2f2, 0xbad0, 0xe2f4, 0xdeec, 0xe2f6, 0xbad4, 0xe2f7, 0xe2f3, 0xbad1, 0xe2ef, 0xbad3, 0xe2ec, 0xe2f1, 0xe2f5, 0xe2ee, 0xb849, 0xe2eb, 0xbad2, 0xe2ed, 0xbd54, 0xe6c1, 0xbd58, 0xbd56, 0xbacf, 0xe6c8, 0xe6c9, 0xbd53, 0xe6c7, 0xe6ca, 0xbd55, 0xbd52, 0xe6c3, 0xe6c0, 0xe6c5, 0xe6c2, 0xbd59, 0xe6c4, 0xe6c6, 0xbd57, 0xbf6a, 0xeaa8, 0xeaa2, 0xeaa6, 0xeaac, 0xeaad, 0xeaa9, 0xeaaa, 0xeaa7, 0xeaa4, 0xbf6c, 0xbf69, 0xeaa3, 0xeaa5, 0xbf6b, 0xeaab, 0xc146, 0xedaa, 0xeda5, 0xc145, 0xc143, 0xedac, 0xc144, 0xeda8, 0xeda9, 0xeda6, 0xedad, 0xf056, 0xc147, 0xeda7, 0xedae, 0xedab, 0xf05a, 0xf057, 0xc2a6, 0xf05b, 0xf05d, 0xf05c, 0xf058, 0xf059, 0xf2a3, 0xc3aa, 0xf27e, 0xf2a2, 0xf27d, 0xf2a4, 0xf2a1, 0xf47a, 0xf47d, 0xf479, 0xc471, 0xf47b, 0xf47c, 0xf47e, 0xc472, 0xc474, 0xc473, 0xf5e1, 0xf5e3, 0xf5e2, 0xf6f6, 0xf8b5, 0xf8fa, 0xa5dc, 0xcb72, 0xaac0, 0xcda3, 0xaac1, 0xaac2, 0xcda2, 0xcff8, 0xcff7, 0xace6, 0xace9, 0xace8, 0xace7, 0xcff4, 0xcff6, 0xcff5, 0xd2e8, 0xafa7, 0xd2ec, 0xd2eb, 0xd2ea, 0xd2e6, 0xafa6, 0xafaa, 0xafad, 0xafae, 0xd2e7, 0xd2e9, 0xafac, 0xafab, 0xafa9, 0xafa8, 0xd6c2, 0xd6c0, 0xd6bc, 0xb2bb, 0xd6bd, 0xb2bc, 0xd6be, 0xd6bf, 0xd6c1, 0xb2bd, 0xdad5, 0xdad4, 0xdad3, 0xdad2, 0xdef6, 0xb852, 0xdef3, 0xdef5, 0xb853, 0xb854, 0xdef4, 0xe341, 0xe2f9, 0xe2fa, 0xbad7, 0xbad5, 0xbad6, 0xe343, 0xe342, 0xe2fe, 0xe2fd, 0xe2fc, 0xe2fb, 0xe340, 0xe2f8, 0xe6cb, 0xe6d0, 0xe6ce, 0xe6cd, 0xe6cc, 0xe6cf, 0xeaae, 0xbf6d, 0xc148, 0xedb0, 0xc149, 0xedaf, 0xf05f, 0xf05e, 0xc2a7, 0xf2a5, 0xc3ab, 0xf4a1, 0xc5a1, 0xf6f7, 0xf8b7, 0xf8b6, 0xc9a8, 0xacea, 0xaceb, 0xd6c3, 0xb856, 0xa5dd, 0xa872, 0xa871, 0xa870, 0xcda4, 0xaac4, 0xaac3, 0xacee, 0xcffa, 0xcffd, 0xcffb, 0xacec, 0xaced, 0xcff9, 0xcffc, 0xafb5, 0xd2f3, 0xd2f5, 0xd2f4, 0xafb2, 0xd2ef, 0xafb0, 0xafaf, 0xafb3, 0xafb1, 0xafb4, 0xd2f2, 0xd2ed, 0xd2ee, 0xd2f1, 0xd2f0, 0xd6c6, 0xd6c7, 0xd6c5, 0xd6c4, 0xb2be, 0xb57d, 0xdad6, 0xdad8, 0xdada, 0xb57c, 0xb57a, 0xdad7, 0xb57b, 0xdad9, 0xb579, 0xdf41, 0xdef7, 0xdefa, 0xdefe, 0xb85a, 0xdefc, 0xdefb, 0xdef8, 0xdef9, 0xb858, 0xdf40, 0xb857, 0xb85c, 0xb85b, 0xb859, 0xdefd, 0xe349, 0xe348, 0xe344, 0xbad8, 0xe347, 0xe346, 0xbad9, 0xbd5e, 0xe6d2, 0xbd5f, 0xbd5b, 0xbd5d, 0xbd5a, 0xbd5c, 0xeaaf, 0xbf70, 0xeab1, 0xeab0, 0xe345, 0xbf72, 0xbf71, 0xbf6e, 0xbf6f, 0xedb5, 0xedb3, 0xc14a, 0xedb4, 0xedb6, 0xedb2, 0xedb1, 0xf060, 0xc2aa, 0xc2a8, 0xc2a9, 0xf2a6, 0xf2a7, 0xc3ad, 0xc3ac, 0xf4a3, 0xf4a4, 0xf4a2, 0xf6f8, 0xf6f9, 0xa5de, 0xca48, 0xa873, 0xcda5, 0xaac6, 0xaac5, 0xcda6, 0xd040, 0xacef, 0xcffe, 0xacf0, 0xafb6, 0xd2f8, 0xd2f6, 0xd2fc, 0xafb7, 0xd2f7, 0xd2fb, 0xd2f9, 0xd2fa, 0xd6c8, 0xd6ca, 0xb2bf, 0xd6c9, 0xb2c0, 0xb5a2, 0xb5a1, 0xb57e, 0xdadb, 0xdf44, 0xb85d, 0xb85e, 0xdf43, 0xdf42, 0xe34a, 0xbadb, 0xbada, 0xe34b, 0xe34c, 0xbd61, 0xbd60, 0xeab5, 0xe6d3, 0xe6d5, 0xe6d4, 0xeab4, 0xeab2, 0xeab6, 0xeab3, 0xbf73, 0xedb7, 0xc14b, 0xedb8, 0xedb9, 0xc2ab, 0xc2ac, 0xc475, 0xc5d1, 0xa5df, 0xd041, 0xd2fd, 0xafb8, 0xb3ba, 0xb3b9, 0xb5a4, 0xdadd, 0xb5a3, 0xdadc, 0xdf45, 0xbadc, 0xe34d, 0xbadd, 0xc476, 0xf4a5, 0xa6cb, 0xaac7, 0xcda7, 0xacf2, 0xacf1, 0xd042, 0xd043, 0xd340, 0xd342, 0xafb9, 0xd344, 0xd347, 0xd345, 0xd346, 0xd343, 0xd2fe, 0xafba, 0xd348, 0xd341, 0xd6d3, 0xb2c6, 0xd6dc, 0xb2c3, 0xd6d5, 0xb2c7, 0xb2c1, 0xd6d0, 0xd6dd, 0xd6d1, 0xd6ce, 0xb2c5, 0xb2c2, 0xd6d4, 0xd6d7, 0xb2c4, 0xd6d8, 0xb2c8, 0xd6d9, 0xd6cf, 0xd6d6, 0xd6da, 0xd6d2, 0xd6cd, 0xd6cb, 0xd6db, 0xdadf, 0xdae4, 0xdae0, 0xdae6, 0xb5a7, 0xd6cc, 0xdae1, 0xb5a5, 0xdade, 0xb5ac, 0xdae2, 0xb5ab, 0xdae3, 0xb5ad, 0xb5a8, 0xb5ae, 0xb5a9, 0xb5aa, 0xb5a6, 0xdae5, 0xb861, 0xdf50, 0xdf53, 0xdf47, 0xdf4c, 0xdf46, 0xb863, 0xdf4a, 0xdf48, 0xb862, 0xdf4f, 0xdf4e, 0xdf4b, 0xdf4d, 0xdf49, 0xbae1, 0xdf52, 0xb85f, 0xdf51, 0xe35d, 0xbae8, 0xe358, 0xbae7, 0xe34e, 0xe350, 0xbae0, 0xe355, 0xe354, 0xe357, 0xbae5, 0xe352, 0xe351, 0xbae4, 0xbadf, 0xe353, 0xbae2, 0xe359, 0xe35b, 0xe356, 0xe34f, 0xbae3, 0xbd69, 0xbade, 0xe35c, 0xe6d9, 0xbd62, 0xe6db, 0xbd63, 0xbd65, 0xe6de, 0xe6d6, 0xbae6, 0xe6dc, 0xe6d8, 0xb860, 0xbd68, 0xbd64, 0xbd66, 0xbd67, 0xbf76, 0xe6dd, 0xe6d7, 0xbd6a, 0xe6da, 0xeac0, 0xeabb, 0xeac5, 0xbf74, 0xeabd, 0xbf78, 0xeac3, 0xeaba, 0xeab7, 0xeac6, 0xc151, 0xbf79, 0xeac2, 0xeab8, 0xbf77, 0xeabc, 0xbf7b, 0xeab9, 0xeabe, 0xbf7a, 0xeac1, 0xeac4, 0xedcb, 0xedcc, 0xedbc, 0xedc3, 0xedc1, 0xc14f, 0xedc8, 0xeabf, 0xedbf, 0xedc9, 0xc14e, 0xedbe, 0xedbd, 0xedc7, 0xedc4, 0xedc6, 0xedba, 0xedca, 0xc14c, 0xedc5, 0xedce, 0xedc2, 0xc150, 0xc14d, 0xedc0, 0xedbb, 0xedcd, 0xbf75, 0xf063, 0xf061, 0xf067, 0xc2b0, 0xf065, 0xf064, 0xc2b2, 0xf06a, 0xc2b1, 0xf06b, 0xf068, 0xc2ae, 0xf069, 0xf062, 0xc2af, 0xc2ad, 0xf2ab, 0xf066, 0xf06c, 0xf2a8, 0xc3b2, 0xc3b0, 0xf2aa, 0xf2ac, 0xf2a9, 0xc3b1, 0xc3ae, 0xc3af, 0xc3b3, 0xc478, 0xf4aa, 0xf4a9, 0xf4a7, 0xf4a6, 0xf4a8, 0xc477, 0xc479, 0xc4f0, 0xf5e5, 0xf5e4, 0xf6fa, 0xf6fc, 0xf6fe, 0xf6fd, 0xf6fb, 0xc5a3, 0xc5a2, 0xc5d3, 0xc5d2, 0xc5d4, 0xf7ed, 0xf7ec, 0xf8fb, 0xf8b8, 0xf8fc, 0xc658, 0xc659, 0xf96d, 0xc67e, 0xa6cc, 0xcda8, 0xd045, 0xd046, 0xd044, 0xacf3, 0xd047, 0xd048, 0xd049, 0xd349, 0xd34f, 0xd34d, 0xafbb, 0xd34b, 0xd34c, 0xd34e, 0xd34a, 0xb2c9, 0xd6de, 0xb2cb, 0xd6e0, 0xb2ca, 0xd6df, 0xdae8, 0xb5af, 0xdaea, 0xdae7, 0xd6e1, 0xb5b0, 0xdae9, 0xdf56, 0xb864, 0xdf54, 0xb865, 0xdf55, 0xb866, 0xbae9, 0xe361, 0xe35e, 0xe360, 0xbaea, 0xbaeb, 0xe35f, 0xe6df, 0xe6e0, 0xbd6b, 0xe6e2, 0xe6e1, 0xa261, 0xeaca, 0xeacb, 0xeac7, 0xeac8, 0xbf7c, 0xbf7d, 0xeac9, 0xc157, 0xc153, 0xc158, 0xc154, 0xc156, 0xc152, 0xc155, 0xc2b3, 0xedcf, 0xf2ae, 0xf2ad, 0xf4ab, 0xc47a, 0xc47b, 0xf741, 0xf5e6, 0xf740, 0xf8fd, 0xf9a4, 0xa6cd, 0xa874, 0xcda9, 0xaac8, 0xacf6, 0xd04c, 0xacf4, 0xd04a, 0xacf9, 0xacf5, 0xacfa, 0xacf8, 0xd04b, 0xacf7, 0xafbf, 0xafbe, 0xd35a, 0xafc7, 0xd353, 0xd359, 0xafc3, 0xd352, 0xd358, 0xd356, 0xafc2, 0xafc4, 0xd355, 0xafbd, 0xd354, 0xafc8, 0xafc5, 0xafc9, 0xafc6, 0xd351, 0xd350, 0xd357, 0xafc0, 0xafbc, 0xafc1, 0xd6f0, 0xd6e9, 0xb5b5, 0xd6e8, 0xb2cf, 0xb2d6, 0xb2d3, 0xb2d9, 0xb2d8, 0xb2d4, 0xd6e2, 0xd6e5, 0xd6e4, 0xb2d0, 0xd6e6, 0xd6ef, 0xb2d1, 0xd6e3, 0xd6ec, 0xd6ed, 0xb2d2, 0xd6ea, 0xb2d7, 0xb2cd, 0xb2d5, 0xd6e7, 0xb2cc, 0xd6eb, 0xd6ee, 0xdafb, 0xdaf2, 0xb5b2, 0xdaf9, 0xdaf6, 0xdaee, 0xdaf7, 0xb5b4, 0xdaef, 0xdaeb, 0xb86c, 0xdaf4, 0xb5b1, 0xdafa, 0xb5b8, 0xb5ba, 0xdaed, 0xb5b9, 0xdaf0, 0xb5b3, 0xdaf8, 0xdaf1, 0xdaf5, 0xdaf3, 0xb5b6, 0xdaec, 0xb5bb, 0xb2ce, 0xb5b7, 0xb5bc, 0xb868, 0xdf5d, 0xdf5f, 0xdf61, 0xdf65, 0xdf5b, 0xdf59, 0xb86a, 0xdf60, 0xdf64, 0xdf5c, 0xdf58, 0xdf57, 0xdf62, 0xdf5a, 0xdf5e, 0xb86b, 0xb869, 0xdf66, 0xb867, 0xdf63, 0xe372, 0xbaee, 0xe36a, 0xbd78, 0xe374, 0xbaf1, 0xe378, 0xbaf7, 0xe365, 0xe375, 0xe362, 0xe377, 0xe366, 0xbafe, 0xbafb, 0xe376, 0xe370, 0xbaed, 0xbaf5, 0xbaf4, 0xbaf3, 0xbaf9, 0xe363, 0xbafa, 0xe371, 0xbaf6, 0xbaec, 0xe373, 0xbaef, 0xbaf0, 0xbaf8, 0xe368, 0xe367, 0xe364, 0xe36c, 0xe369, 0xe36d, 0xbafd, 0xe379, 0xbaf2, 0xe36e, 0xe36f, 0xe36b, 0xbafc, 0xe6e7, 0xbd70, 0xbd79, 0xbd75, 0xe6e4, 0xbd72, 0xbd76, 0xe6f0, 0xbd6c, 0xe6e8, 0xbd74, 0xe6eb, 0xe6e6, 0xbd73, 0xbd77, 0xe6e5, 0xbd71, 0xe6ef, 0xbd6e, 0xe6ee, 0xe6ed, 0xbd7a, 0xe572, 0xbd6d, 0xe6ec, 0xe6e3, 0xbd7b, 0xe6ea, 0xbd6f, 0xe6e9, 0xbfa2, 0xbfa7, 0xbf7e, 0xead8, 0xeacf, 0xeadb, 0xead3, 0xead9, 0xbfa8, 0xbfa1, 0xeacc, 0xead2, 0xeadc, 0xead5, 0xeada, 0xeace, 0xead6, 0xbfa3, 0xead4, 0xbfa6, 0xbfa5, 0xead0, 0xead1, 0xeacd, 0xead7, 0xbfa4, 0xeade, 0xeadd, 0xedda, 0xedd6, 0xc15f, 0xedd0, 0xc159, 0xc169, 0xeddc, 0xc161, 0xc15d, 0xedd3, 0xc164, 0xc167, 0xedde, 0xc15c, 0xedd5, 0xc165, 0xede0, 0xeddd, 0xedd1, 0xc160, 0xc15a, 0xc168, 0xedd8, 0xc163, 0xedd2, 0xc15e, 0xeddf, 0xc162, 0xc15b, 0xedd9, 0xc166, 0xedd7, 0xeddb, 0xf06e, 0xf074, 0xc2b9, 0xf077, 0xc2b4, 0xc2b5, 0xf06f, 0xf076, 0xf071, 0xc2ba, 0xc2b7, 0xf06d, 0xc2b6, 0xf073, 0xf075, 0xc2b8, 0xf072, 0xf070, 0xf2b8, 0xc3b7, 0xc3b8, 0xc3b4, 0xc3b5, 0xf2b4, 0xf2b2, 0xf2b6, 0xc3ba, 0xf2b7, 0xf2b0, 0xf2af, 0xf2b3, 0xf2b1, 0xc3b6, 0xf2b5, 0xf4ac, 0xc47e, 0xc47d, 0xf4ad, 0xf4af, 0xf4ae, 0xc4a1, 0xf5eb, 0xf5e8, 0xf5e9, 0xf5e7, 0xf5ea, 0xc4f2, 0xf5ec, 0xc4f1, 0xf742, 0xc5d5, 0xc5d7, 0xf7ee, 0xc5d6, 0xf8b9, 0xf940, 0xf942, 0xf8fe, 0xf941, 0xc66c, 0xa6ce, 0xacfb, 0xd26f, 0xafca, 0xb2da, 0xdafc, 0xdafd, 0xeadf, 0xc16a, 0xede1, 0xc2bb, 0xf2ba, 0xf2b9, 0xc4a2, 0xf5ed, 0xf743, 0xc5f8, 0xca49, 0xaac9, 0xa875, 0xd04d, 0xd360, 0xd35b, 0xd35f, 0xd35d, 0xafcb, 0xd35e, 0xd35c, 0xd6f1, 0xdafe, 0xdb40, 0xdf69, 0xdf6a, 0xb86e, 0xb86f, 0xdf68, 0xdf6b, 0xdf67, 0xb86d, 0xbb40, 0xb870, 0xe37a, 0xbd7c, 0xe6f1, 0xbd7d, 0xbfa9, 0xeae2, 0xeae0, 0xeae1, 0xede4, 0xede3, 0xede2, 0xf2bb, 0xc3b9, 0xf2bc, 0xf744, 0xc5f9, 0xf8ba, 0xa6cf, 0xaacb, 0xaaca, 0xd04f, 0xacfc, 0xd04e, 0xd362, 0xafcc, 0xd6f2, 0xd361, 0xb2dc, 0xd6f5, 0xd6f3, 0xd6f4, 0xb2db, 0xdb42, 0xdb43, 0xdb41, 0xb873, 0xdf6d, 0xdf6c, 0xdf6e, 0xb872, 0xb871, 0xe6f2, 0xe6f4, 0xbd7e, 0xe6f3, 0xeae3, 0xbfaa, 0xf079, 0xf078, 0xc3bb, 0xf2bd, 0xc3bd, 0xc3bc, 0xf4b0, 0xf5ee, 0xc4f3, 0xa6d0, 0xd050, 0xacfd, 0xd365, 0xafce, 0xd364, 0xd363, 0xafcd, 0xd6fb, 0xd6fd, 0xd6f6, 0xd6f7, 0xb2dd, 0xd6f8, 0xb2de, 0xd6fc, 0xd6f9, 0xd6fa, 0xb2df, 0xb5be, 0xb5bf, 0xdb44, 0xdf6f, 0xdf70, 0xe37e, 0xbb43, 0xbb41, 0xbb42, 0xe37b, 0xe37c, 0xe37d, 0xe6f9, 0xe6fa, 0xbda1, 0xe6f7, 0xe6f6, 0xe6f8, 0xe6f5, 0xbfad, 0xeae4, 0xbfab, 0xbfac, 0xede6, 0xc16b, 0xede5, 0xefa8, 0xf07a, 0xf07b, 0xc2bc, 0xc2bd, 0xc16c, 0xf2be, 0xf2bf, 0xf4b1, 0xc4a3, 0xa6d1, 0xa6d2, 0xacfe, 0xaacc, 0xafcf, 0xd051, 0xb5c0, 0xa6d3, 0xad41, 0xd052, 0xd053, 0xad40, 0xad42, 0xa6d4, 0xd054, 0xafd1, 0xd366, 0xafd3, 0xafd0, 0xafd2, 0xd741, 0xb2e0, 0xd740, 0xd6fe, 0xdf71, 0xe3a1, 0xbda2, 0xbfae, 0xeae6, 0xeae5, 0xede7, 0xf5ef, 0xa6d5, 0xcb73, 0xcdaa, 0xad43, 0xd055, 0xd368, 0xafd4, 0xd367, 0xafd5, 0xd743, 0xb2e2, 0xd742, 0xd744, 0xb2e1, 0xdb46, 0xdb47, 0xdb45, 0xb5c1, 0xb874, 0xb875, 0xbb45, 0xe3a3, 0xe3a2, 0xbb44, 0xe6fb, 0xe6fc, 0xeae7, 0xc170, 0xc16f, 0xc16d, 0xc16e, 0xc171, 0xf07c, 0xc2bf, 0xc2be, 0xf2c0, 0xf4b2, 0xc5a5, 0xc5a4, 0xa6d6, 0xd1fb, 0xb877, 0xb5c2, 0xb876, 0xbb46, 0xa6d7, 0xc9a9, 0xa6d8, 0xa6d9, 0xcdab, 0xcb76, 0xcb77, 0xa877, 0xcb74, 0xa876, 0xa879, 0xcb75, 0xa87b, 0xa87a, 0xcb78, 0xa878, 0xaad1, 0xaacf, 0xcdad, 0xaace, 0xaad3, 0xaad5, 0xaad2, 0xcdb0, 0xcdac, 0xaad6, 0xaad0, 0xa87c, 0xaad4, 0xcdaf, 0xcdae, 0xaacd, 0xd05b, 0xad47, 0xad48, 0xd05d, 0xd057, 0xd05a, 0xd063, 0xd061, 0xad49, 0xd067, 0xad4c, 0xd064, 0xd05c, 0xd059, 0xdb49, 0xd062, 0xad44, 0xd065, 0xd056, 0xd05f, 0xad46, 0xad4b, 0xd060, 0xad4f, 0xad4d, 0xd058, 0xad4a, 0xd05e, 0xad4e, 0xad45, 0xd066, 0xafda, 0xafe3, 0xafd8, 0xafd6, 0xd36a, 0xafde, 0xafdb, 0xd36c, 0xafdd, 0xd36b, 0xd369, 0xd36e, 0xafe2, 0xafe0, 0xdb48, 0xd36f, 0xd36d, 0xafd7, 0xafd9, 0xafdc, 0xafdf, 0xafe1, 0xd74e, 0xb2e4, 0xd745, 0xd747, 0xd748, 0xd750, 0xd74c, 0xd74a, 0xd74d, 0xd751, 0xb2e5, 0xb2e9, 0xd746, 0xd74f, 0xb2e7, 0xb2e6, 0xd74b, 0xd749, 0xb2e3, 0xb2e8, 0xb5c8, 0xdb51, 0xdb4f, 0xb5ca, 0xdb4a, 0xdfa1, 0xb5c9, 0xdb4e, 0xdb4b, 0xb5c5, 0xb5cb, 0xdb50, 0xb5c7, 0xdb4d, 0xbb47, 0xb5c6, 0xdb4c, 0xb5cc, 0xb5c4, 0xb5c3, 0xdf77, 0xdf75, 0xdf7b, 0xdf73, 0xdfa2, 0xdf78, 0xdf72, 0xb87b, 0xb8a3, 0xdf7d, 0xdf76, 0xb87e, 0xb87c, 0xdf7e, 0xb879, 0xb878, 0xdf79, 0xb87d, 0xb5cd, 0xdf7c, 0xdf74, 0xb87a, 0xb8a1, 0xb8a2, 0xbb4c, 0xbb48, 0xbb4d, 0xe3a6, 0xe3a5, 0xe3a7, 0xbb4a, 0xe3a4, 0xbb4b, 0xe3aa, 0xe3a9, 0xe3a8, 0xbb49, 0xe741, 0xe744, 0xbda8, 0xe743, 0xbda7, 0xbda3, 0xbda4, 0xbda5, 0xe740, 0xe6fe, 0xbda6, 0xe742, 0xe6fd, 0xeae9, 0xeaf3, 0xbfb1, 0xbfb0, 0xeaed, 0xeaef, 0xeaea, 0xeaee, 0xeae8, 0xeaf1, 0xbfaf, 0xeaf0, 0xeaec, 0xeaf2, 0xeaeb, 0xc174, 0xede8, 0xedee, 0xc178, 0xc17a, 0xc177, 0xc176, 0xc175, 0xc173, 0xede9, 0xedec, 0xc172, 0xeded, 0xc179, 0xedeb, 0xedea, 0xc2c0, 0xc2c1, 0xf0a1, 0xf07d, 0xf07e, 0xf2c2, 0xf2c1, 0xc3be, 0xf4b4, 0xc4a4, 0xf4b3, 0xf5f0, 0xf745, 0xc5a6, 0xf943, 0xf944, 0xc5d8, 0xa6da, 0xaad7, 0xdb52, 0xbb4e, 0xc17b, 0xedef, 0xa6db, 0xafe5, 0xafe4, 0xdb53, 0xeaf4, 0xa6dc, 0xad50, 0xdb54, 0xdb55, 0xdb56, 0xbb4f, 0xbfb2, 0xa6dd, 0xaad8, 0xd068, 0xafe6, 0xd370, 0xb2ea, 0xdb57, 0xb8a4, 0xbb50, 0xbfb3, 0xc17c, 0xc2c2, 0xf4b5, 0xa6de, 0xaad9, 0xafe7, 0xd752, 0xb5ce, 0xbb51, 0xe3ab, 0xe745, 0xa6df, 0xb5cf, 0xdfa3, 0xbb52, 0xa6e0, 0xcdb1, 0xd069, 0xad51, 0xd372, 0xafea, 0xafe8, 0xafe9, 0xafeb, 0xd371, 0xd757, 0xd754, 0xd756, 0xb2eb, 0xb2ed, 0xb2ec, 0xd753, 0xb2ee, 0xd755, 0xdb58, 0xdb59, 0xdb5a, 0xdfa6, 0xdfa7, 0xdfa5, 0xdfa8, 0xb8a5, 0xdfa4, 0xbb53, 0xe74a, 0xe746, 0xe749, 0xe74b, 0xe748, 0xe747, 0xeaf5, 0xeaf6, 0xeaf7, 0xbfb4, 0xbfb5, 0xedf1, 0xedf0, 0xedf2, 0xf0a3, 0xf0a2, 0xf2c4, 0xf2c5, 0xf2c3, 0xc4a5, 0xf4b6, 0xf4b7, 0xf746, 0xf7ef, 0xf8bb, 0xa6e1, 0xa87d, 0xc17d, 0xa6e2, 0xd758, 0xdb5b, 0xc641, 0xca4a, 0xca4b, 0xca4d, 0xa6e3, 0xca4e, 0xca4c, 0xcba2, 0xcba3, 0xcb7b, 0xcba1, 0xa8a1, 0xa8a2, 0xcb7c, 0xcb7a, 0xcb79, 0xcb7d, 0xa87e, 0xcb7e, 0xd06a, 0xcdb6, 0xaadc, 0xcdb5, 0xcdb7, 0xaadb, 0xcdbc, 0xaadf, 0xcdb2, 0xcdc0, 0xcdc6, 0xaae6, 0xcdc3, 0xaae3, 0xcdb9, 0xcdbf, 0xcdc1, 0xcdb4, 0xaae2, 0xaadd, 0xcdba, 0xaae4, 0xaae7, 0xaae1, 0xaada, 0xcdbe, 0xcdb8, 0xcdc5, 0xaae9, 0xaae5, 0xaae0, 0xcdbd, 0xafec, 0xcdbb, 0xaade, 0xaae8, 0xcdb3, 0xcdc2, 0xcdc4, 0xad62, 0xad5c, 0xad64, 0xad61, 0xd071, 0xd074, 0xad5d, 0xd06b, 0xad56, 0xad60, 0xad63, 0xad65, 0xd0a2, 0xd077, 0xad55, 0xd0a1, 0xad59, 0xad57, 0xad52, 0xd06f, 0xd07e, 0xd073, 0xd076, 0xd0a5, 0xad66, 0xd07d, 0xad5e, 0xd078, 0xd0a4, 0xd075, 0xd079, 0xd07c, 0xd06d, 0xd0a3, 0xd07b, 0xd06c, 0xd070, 0xad5f, 0xad5a, 0xad53, 0xad58, 0xad54, 0xad67, 0xd06e, 0xd3a5, 0xad5b, 0xd07a, 0xce41, 0xd3a8, 0xaffa, 0xd376, 0xd3a3, 0xd37d, 0xd3b2, 0xd3aa, 0xd37e, 0xd3a9, 0xd378, 0xd37c, 0xd3b5, 0xaffd, 0xd3ad, 0xd3a4, 0xafed, 0xd3b3, 0xd374, 0xd3ac, 0xaffc, 0xaff7, 0xd373, 0xaff5, 0xaff4, 0xaff9, 0xd3ab, 0xaff1, 0xaff8, 0xd072, 0xdb5c, 0xd3a6, 0xd37a, 0xaffb, 0xd37b, 0xd3a1, 0xaffe, 0xd375, 0xd3af, 0xd3ae, 0xd3b6, 0xaff3, 0xaff0, 0xd3b4, 0xd3b0, 0xd3a7, 0xd3a2, 0xaff6, 0xaff2, 0xd377, 0xafee, 0xd3b1, 0xafef, 0xd379, 0xd75e, 0xd760, 0xd765, 0xd779, 0xb2fc, 0xb2f2, 0xd75d, 0xb2fd, 0xb2fe, 0xd768, 0xd76f, 0xd775, 0xd762, 0xd769, 0xb340, 0xd777, 0xd772, 0xb2fa, 0xb2f8, 0xd76e, 0xd76a, 0xd75c, 0xb2ef, 0xd761, 0xd759, 0xb2f7, 0xb2f9, 0xd766, 0xd763, 0xb2f4, 0xd773, 0xb2f1, 0xd764, 0xd77a, 0xd76c, 0xd76b, 0xb2f0, 0xb2fb, 0xb2f3, 0xd75a, 0xd75f, 0xd770, 0xd776, 0xb341, 0xd75b, 0xd767, 0xd76d, 0xb2f6, 0xd778, 0xd771, 0xd774, 0xb2f5, 0xdb6c, 0xdb60, 0xb5d7, 0xdb7d, 0xdba7, 0xdbaa, 0xb5d5, 0xdb68, 0xdba3, 0xdb69, 0xdb77, 0xb5e2, 0xdb73, 0xb5df, 0xdb74, 0xdb5d, 0xdba4, 0xb5e8, 0xdba1, 0xdb75, 0xdbac, 0xdb70, 0xdfc8, 0xdbaf, 0xb5e6, 0xdb6e, 0xdb7a, 0xb5e9, 0xb5d4, 0xdb72, 0xdbad, 0xdb6b, 0xdb64, 0xdb6f, 0xdb63, 0xdb61, 0xb5d0, 0xdba5, 0xdb6a, 0xdba8, 0xdba9, 0xb5d8, 0xb5dd, 0xb5d9, 0xb5e1, 0xdb7e, 0xb5da, 0xdb76, 0xdb66, 0xb5d2, 0xdb5e, 0xdba2, 0xdbab, 0xdb65, 0xb5e0, 0xdbb0, 0xdb71, 0xdb6d, 0xb5d1, 0xb5e5, 0xdb7c, 0xb5e7, 0xdb78, 0xb5dc, 0xb5d6, 0xb5de, 0xb5d3, 0xb5e4, 0xdb79, 0xdb67, 0xdb7b, 0xdb62, 0xdba6, 0xdbae, 0xdb5f, 0xdfc7, 0xdfdd, 0xb855, 0xdfcc, 0xdfca, 0xdfb5, 0xb8a9, 0xdfc5, 0xdfd9, 0xdfc1, 0xb8b1, 0xdfd8, 0xdfbf, 0xb5e3, 0xdfcf, 0xdfc0, 0xdfd6, 0xb8b0, 0xb8a8, 0xdfaa, 0xdfb2, 0xdfcb, 0xdfc3, 0xdfdc, 0xdfc6, 0xb8b6, 0xdfd7, 0xb8ad, 0xdfc9, 0xdfd1, 0xdfb6, 0xdfd0, 0xdfe1, 0xdfb1, 0xdfd2, 0xdfdf, 0xdfab, 0xb5db, 0xdfb9, 0xdfb8, 0xb8af, 0xdfbc, 0xdfbe, 0xdfcd, 0xdfde, 0xb8b2, 0xb8b3, 0xdfb0, 0xb8ab, 0xdfb4, 0xdfda, 0xb8b4, 0xb8ac, 0xb8ae, 0xb8b5, 0xdfe0, 0xdfd3, 0xdfce, 0xdfbb, 0xdfba, 0xb8aa, 0xdfac, 0xb8a7, 0xdfc4, 0xdfad, 0xdfc2, 0xdfb7, 0xdfdb, 0xb8a6, 0xdfb3, 0xdfaf, 0xdfd5, 0xdfae, 0xbb60, 0xe3d3, 0xe3c2, 0xe3ac, 0xe3ca, 0xbb58, 0xe3bb, 0xe3c5, 0xbb5b, 0xe3be, 0xbb59, 0xe3af, 0xe3cd, 0xe3ae, 0xe3c1, 0xe3ad, 0xe3bf, 0xe3c8, 0xe3c6, 0xe3ba, 0xe3b5, 0xe3b3, 0xe3b4, 0xe3c7, 0xe3d2, 0xe3bc, 0xbb5a, 0xe3b7, 0xe3cb, 0xbb5d, 0xe3b6, 0xe3b0, 0xe3c0, 0xbb61, 0xbb55, 0xbb5e, 0xe3b8, 0xe3b2, 0xbb57, 0xdfd4, 0xbb56, 0xe3c3, 0xbb54, 0xbb63, 0xbb5c, 0xe3c4, 0xe3b9, 0xe3b1, 0xe3cc, 0xe3bd, 0xbb62, 0xe3d0, 0xbb5f, 0xe3cf, 0xe3c9, 0xe3ce, 0xe3d1, 0xe773, 0xe774, 0xe767, 0xe766, 0xe762, 0xbdb4, 0xbdac, 0xe776, 0xe775, 0xdfa9, 0xe75f, 0xe763, 0xe75d, 0xe770, 0xe761, 0xe777, 0xe75a, 0xe758, 0xe764, 0xe76e, 0xe769, 0xbdb6, 0xe74f, 0xe76d, 0xbdb7, 0xdfbd, 0xe75b, 0xe752, 0xe755, 0xe77b, 0xe75c, 0xe753, 0xe751, 0xe74e, 0xbdb0, 0xe765, 0xbdaf, 0xbdb3, 0xe760, 0xe768, 0xbda9, 0xe778, 0xe77c, 0xbdab, 0xe757, 0xe76b, 0xe76f, 0xe754, 0xe779, 0xbdb2, 0xbdb1, 0xe74c, 0xbdb5, 0xe772, 0xe756, 0xe76a, 0xe750, 0xe75e, 0xe759, 0xbdad, 0xbdae, 0xe76c, 0xe77d, 0xe77a, 0xe771, 0xe74d, 0xbdaa, 0xeb49, 0xeb40, 0xeb43, 0xbfbb, 0xeb45, 0xeaf9, 0xeb41, 0xeb47, 0xbfb8, 0xbfbc, 0xbfb6, 0xeafb, 0xeb4c, 0xeb46, 0xeafc, 0xeb55, 0xeb4f, 0xeaf8, 0xee46, 0xeafe, 0xbfb7, 0xeb4a, 0xeb54, 0xbfbf, 0xeb51, 0xeafd, 0xeb44, 0xeb48, 0xeb42, 0xeb56, 0xeb53, 0xeb50, 0xbfb9, 0xbfba, 0xbfbe, 0xeafa, 0xeb57, 0xbfbd, 0xeb4d, 0xeb4b, 0xeb4e, 0xee53, 0xee40, 0xee45, 0xee52, 0xee44, 0xedfb, 0xee41, 0xc1a2, 0xedf4, 0xee4d, 0xee4f, 0xedf3, 0xc1a1, 0xee51, 0xee49, 0xc1a8, 0xee50, 0xee42, 0xc1aa, 0xedf9, 0xeb52, 0xee4a, 0xee47, 0xedf5, 0xee55, 0xc1a4, 0xc1a5, 0xedf7, 0xee48, 0xee54, 0xee4b, 0xedfd, 0xc1a7, 0xc1a3, 0xee4c, 0xedfe, 0xee56, 0xedf8, 0xee43, 0xee4e, 0xedfa, 0xedfc, 0xc2cb, 0xedf6, 0xc1a9, 0xc2c4, 0xc17e, 0xc1a6, 0xc2c8, 0xf0b3, 0xf0a9, 0xf0a4, 0xf0aa, 0xf0b4, 0xf0b8, 0xf0b7, 0xc2ca, 0xc2c9, 0xf0ab, 0xf0b9, 0xf0ae, 0xf0a6, 0xf0a8, 0xf0a7, 0xf0ad, 0xf0b2, 0xf0a5, 0xf0ac, 0xf0b1, 0xc2c7, 0xf0af, 0xc2c5, 0xf0b0, 0xc2c3, 0xc2c6, 0xf2d5, 0xf0b5, 0xc3c2, 0xf2cd, 0xf2d1, 0xf2c9, 0xf2cc, 0xf2d4, 0xc3c0, 0xf2d9, 0xf2d2, 0xf2ca, 0xf2da, 0xf2d3, 0xc3c3, 0xc3c4, 0xf2d7, 0xf2cb, 0xc3bf, 0xc3c1, 0xf2c6, 0xf2ce, 0xf2c8, 0xf2d8, 0xf2d6, 0xf2c7, 0xf2cf, 0xf4be, 0xc3c5, 0xf2d0, 0xc4a7, 0xc4a9, 0xc4a6, 0xf4c3, 0xf4bb, 0xf4b9, 0xf4bd, 0xf4ba, 0xf4bf, 0xf4c1, 0xc4aa, 0xc4ac, 0xf4c0, 0xc4ad, 0xc4ab, 0xf4c2, 0xc4a8, 0xc4f4, 0xf5f1, 0xf5f7, 0xc4f6, 0xf4bc, 0xf5f6, 0xf5fd, 0xf5f4, 0xf5fb, 0xf5fa, 0xf4b8, 0xf5f5, 0xf0b6, 0xf5fe, 0xf5f3, 0xf5f8, 0xf5fc, 0xf5f2, 0xf74a, 0xc4f5, 0xf5f9, 0xf7f4, 0xf74b, 0xf749, 0xf747, 0xf748, 0xf74c, 0xc5d9, 0xf7f2, 0xf7f0, 0xf7f5, 0xf7f3, 0xf7f6, 0xc5da, 0xf7f1, 0xf8bc, 0xf945, 0xf946, 0xf947, 0xf9c7, 0xf9bd, 0xca4f, 0xaaea, 0xad68, 0xd3b8, 0xd3b7, 0xb040, 0xb342, 0xd77c, 0xd77b, 0xb5ea, 0xb8b8, 0xb8b7, 0xb8b9, 0xe3d4, 0xe77e, 0xeb58, 0xeb5a, 0xeb59, 0xc1ab, 0xee57, 0xf0ba, 0xf9a5, 0xa6e4, 0xcdc9, 0xcdca, 0xcdc8, 0xcdc7, 0xaaeb, 0xd0a9, 0xd0a7, 0xd0a6, 0xad69, 0xad6b, 0xad6a, 0xd0a8, 0xd3c4, 0xd3c1, 0xd3bf, 0xb041, 0xd3c2, 0xb046, 0xd3bc, 0xd3cb, 0xd3cd, 0xd3bd, 0xb043, 0xd3ce, 0xd3c9, 0xd3bb, 0xd3c0, 0xd3ca, 0xd3c6, 0xd3c3, 0xb048, 0xd3cc, 0xd3be, 0xd3c7, 0xd3b9, 0xb047, 0xb044, 0xd3c5, 0xd3c8, 0xd3ba, 0xb045, 0xb042, 0xb34c, 0xd7a5, 0xb34b, 0xd7a8, 0xd7ab, 0xb348, 0xb346, 0xd77e, 0xd7a9, 0xd7a7, 0xd7a4, 0xd7ac, 0xd7ad, 0xd7af, 0xd7b0, 0xd77d, 0xb345, 0xd7a2, 0xd7a1, 0xd7ae, 0xb347, 0xd7a3, 0xb349, 0xb344, 0xd7a6, 0xb34d, 0xb34a, 0xd7aa, 0xb5f1, 0xdbbf, 0xdbb4, 0xb5ee, 0xdfe7, 0xdbbd, 0xdbb1, 0xb5ec, 0xdbb6, 0xb5ef, 0xdbba, 0xdbb8, 0xb5f2, 0xb5eb, 0xdbb2, 0xdbb5, 0xb5f0, 0xdbb3, 0xdbbe, 0xdbbc, 0xdbb7, 0xdbb9, 0xdbbb, 0xb5ed, 0xdfe8, 0xdfee, 0xdfe4, 0xdfea, 0xb8ba, 0xdfe6, 0xb8c0, 0xb8bf, 0xb8be, 0xdfed, 0xb8c1, 0xb8c2, 0xdfe3, 0xdff0, 0xb8c3, 0xb8bd, 0xb8bc, 0xdfec, 0xb8c4, 0xdfe2, 0xdfe5, 0xdfef, 0xdfeb, 0xe3f4, 0xe3e9, 0xb8bb, 0xbb6a, 0xe3dd, 0xe3f2, 0xe3de, 0xbb65, 0xe3db, 0xe3e4, 0xe3dc, 0xbb67, 0xe3d6, 0xe3f1, 0xbb68, 0xe3ee, 0xe3ef, 0xe3d7, 0xbb6d, 0xe3e6, 0xe3e0, 0xe3e7, 0xe3da, 0xe3f3, 0xe3eb, 0xe3e5, 0xe3d5, 0xbb69, 0xe3ec, 0xbb6c, 0xe3f0, 0xe3ea, 0xbb66, 0xe3e8, 0xe3e2, 0xbb64, 0xe3d9, 0xe3e1, 0xe3ed, 0xe3df, 0xe3e3, 0xbdc1, 0xdfe9, 0xe7b2, 0xe7bb, 0xe7b1, 0xe7ad, 0xe7aa, 0xbdc2, 0xe7a8, 0xbb6b, 0xe7a1, 0xbdc0, 0xe7a7, 0xbdbf, 0xe7ac, 0xe7a9, 0xe7b9, 0xe7b4, 0xe7ae, 0xe7b3, 0xbdbb, 0xe7ab, 0xe7be, 0xe7a2, 0xe7a3, 0xe7ba, 0xbdbc, 0xe7bf, 0xbdbe, 0xe7c0, 0xe7b0, 0xe3d8, 0xe7b6, 0xe7af, 0xe7b8, 0xe7b5, 0xe7a6, 0xbdb9, 0xe7bd, 0xbdba, 0xe7a4, 0xbdbd, 0xeb64, 0xe7b7, 0xe7bc, 0xeb61, 0xbdb8, 0xbfc0, 0xeb6b, 0xeb67, 0xeb65, 0xeb60, 0xeb6f, 0xbfc4, 0xeb5c, 0xeb68, 0xeb69, 0xeb5f, 0xeb5e, 0xeb6c, 0xeb62, 0xeb5d, 0xeb63, 0xeb6e, 0xeb5b, 0xeb6d, 0xeb6a, 0xbfc2, 0xbfc1, 0xbfc3, 0xeb66, 0xf0cb, 0xee59, 0xc1b1, 0xee5d, 0xee5a, 0xee61, 0xee67, 0xee5c, 0xee70, 0xc1ae, 0xee6a, 0xee5f, 0xee6b, 0xee66, 0xee6d, 0xee5e, 0xc1b3, 0xc1b2, 0xee60, 0xee6e, 0xee58, 0xee6c, 0xc1ac, 0xee64, 0xee63, 0xee68, 0xee5b, 0xc1b0, 0xc1b4, 0xee62, 0xee69, 0xc1b5, 0xee65, 0xc1ad, 0xc1af, 0xf0c7, 0xf0c5, 0xf0cc, 0xf0c9, 0xf0cd, 0xf0be, 0xf0c6, 0xf0d1, 0xee6f, 0xf0c2, 0xc2cf, 0xe7a5, 0xf0bd, 0xf0ca, 0xf0c4, 0xf0c1, 0xf0bc, 0xf0bb, 0xf0d0, 0xf0c0, 0xf0bf, 0xc2cd, 0xf0c8, 0xc2cc, 0xc2ce, 0xf0c3, 0xf0cf, 0xf2de, 0xf2df, 0xc3c9, 0xf2dc, 0xc3c6, 0xf2e4, 0xc3ca, 0xf2e6, 0xf2db, 0xf0ce, 0xf2e8, 0xf2dd, 0xc3c7, 0xf2e3, 0xf2e5, 0xf2e0, 0xf2e7, 0xf2e2, 0xf2e1, 0xc3c8, 0xf4c5, 0xf4c6, 0xf4c8, 0xc4ae, 0xc4af, 0xf4c9, 0xf4c7, 0xf4c4, 0xf642, 0xf645, 0xf641, 0xc4fa, 0xf643, 0xc4f9, 0xc4f8, 0xc4f7, 0xf644, 0xf751, 0xf74f, 0xf74e, 0xf640, 0xf750, 0xf646, 0xf74d, 0xf7f9, 0xf7d7, 0xf7f7, 0xc5db, 0xf7f8, 0xf7fa, 0xf8bf, 0xc5fa, 0xf8be, 0xf8bd, 0xc5fb, 0xc65a, 0xf96e, 0xf9a7, 0xf9a6, 0xf9a8, 0xa6e5, 0xd0aa, 0xd3cf, 0xd3d0, 0xdbc0, 0xf647, 0xf8c0, 0xa6e6, 0xad6c, 0xd0ab, 0xd7b1, 0xb34e, 0xdbc2, 0xdbc1, 0xb5f3, 0xb8c5, 0xe7c1, 0xbdc3, 0xbdc4, 0xbfc5, 0xc5fc, 0xa6e7, 0xd0ac, 0xaaed, 0xd0ae, 0xd0ad, 0xad6d, 0xd3d1, 0xd3d8, 0xb049, 0xd3d6, 0xd3d4, 0xd3db, 0xd3d2, 0xd3d3, 0xb04a, 0xb04e, 0xd3dc, 0xb04d, 0xd3da, 0xd3d7, 0xd3d5, 0xb04b, 0xb04c, 0xd3d9, 0xb350, 0xd7b2, 0xb355, 0xd7c2, 0xb354, 0xd7c4, 0xd7b8, 0xb352, 0xd7c3, 0xd7b3, 0xb353, 0xd7bf, 0xd7bb, 0xd7bd, 0xd7b7, 0xd7be, 0xb34f, 0xd7ba, 0xd7b9, 0xd7b5, 0xd7c0, 0xd7bc, 0xd7b4, 0xd7b6, 0xb351, 0xd7c1, 0xb5f6, 0xdbcd, 0xdbc9, 0xdbcb, 0xdbc6, 0xdbc5, 0xdbc3, 0xdbca, 0xdbcc, 0xdbc8, 0xdbc7, 0xb5f4, 0xb5f5, 0xdbcf, 0xb8cd, 0xdff2, 0xdff8, 0xdff3, 0xdff4, 0xdff9, 0xb8cf, 0xb8c7, 0xb8ce, 0xdff1, 0xdbc4, 0xb8ca, 0xb8c8, 0xdff7, 0xdff6, 0xb8c9, 0xb8cb, 0xdff5, 0xb8c6, 0xb8cc, 0xe3f6, 0xbb74, 0xe442, 0xe441, 0xe3fb, 0xbb76, 0xe440, 0xe3f7, 0xe3f8, 0xbb6e, 0xbb70, 0xe3fd, 0xe3f5, 0xbb72, 0xbb71, 0xe3f9, 0xe3fe, 0xe3fc, 0xbb73, 0xe3fa, 0xdbce, 0xbb6f, 0xe7c2, 0xe7c9, 0xbdc6, 0xe7cd, 0xbdca, 0xe7c5, 0xe7c3, 0xe7cc, 0xbdc5, 0xe7cb, 0xbdc7, 0xbdc8, 0xe7c4, 0xbdc9, 0xe7ca, 0xe7c6, 0xe7c7, 0xe7c8, 0xbb75, 0xeb70, 0xeb7c, 0xbfca, 0xeb77, 0xeb79, 0xbfc8, 0xeb71, 0xeb75, 0xeb78, 0xbfc6, 0xbfc9, 0xeb7b, 0xeb73, 0xeb74, 0xeb7a, 0xeb72, 0xeb76, 0xbfc7, 0xee72, 0xee71, 0xc1b7, 0xee77, 0xc1b9, 0xc1b6, 0xee73, 0xc1ba, 0xee74, 0xee75, 0xee78, 0xc1b8, 0xf0d6, 0xf0d9, 0xf0d3, 0xf0d5, 0xf0d4, 0xf0d7, 0xf0d8, 0xee76, 0xf0d2, 0xc3cd, 0xf2ec, 0xf2ef, 0xf2f1, 0xf2ea, 0xf2eb, 0xf2ee, 0xf2f0, 0xc3ce, 0xc3cc, 0xc3cb, 0xf2ed, 0xf2e9, 0xf4ca, 0xc4b0, 0xf4cb, 0xf649, 0xc4fb, 0xf64b, 0xc4fc, 0xf648, 0xf64a, 0xc5a8, 0xf752, 0xc5a7, 0xf7fd, 0xf7fc, 0xf7fb, 0xf948, 0xf949, 0xf94b, 0xf94a, 0xca50, 0xa6e8, 0xad6e, 0xd7c5, 0xb5f7, 0xdffa, 0xc2d0, 0xf2f2, 0xa8a3, 0xb357, 0xb356, 0xdbd0, 0xb5f8, 0xdbd2, 0xdbd1, 0xdffb, 0xb8d0, 0xe443, 0xe446, 0xe445, 0xe444, 0xe7ce, 0xe7d0, 0xe7cf, 0xbfcc, 0xbfcb, 0xc1bb, 0xee79, 0xee7b, 0xee7a, 0xc2d1, 0xf2f4, 0xf2f3, 0xf4cc, 0xc4b1, 0xc4fd, 0xf754, 0xf753, 0xc65b, 0xa8a4, 0xd0af, 0xad6f, 0xd7c8, 0xd7c6, 0xd7c7, 0xdbd4, 0xdbd5, 0xe043, 0xdbd3, 0xdffc, 0xe041, 0xe040, 0xe042, 0xb8d1, 0xdffe, 0xdffd, 0xe044, 0xe449, 0xe447, 0xe448, 0xe7d3, 0xe7d1, 0xe7d2, 0xeb7d, 0xee7c, 0xee7d, 0xc2d2, 0xf2f5, 0xf4cd, 0xc4b2, 0xf64c, 0xf755, 0xc5a9, 0xf7fe, 0xf94c, 0xa8a5, 0xad71, 0xad72, 0xd0b0, 0xd0b1, 0xad70, 0xb054, 0xb052, 0xb051, 0xb058, 0xb050, 0xb059, 0xd3dd, 0xb056, 0xb053, 0xb057, 0xb055, 0xb04f, 0xb35f, 0xb359, 0xd7cc, 0xb35e, 0xb360, 0xb35a, 0xb35b, 0xd7ca, 0xb358, 0xd7cb, 0xb35d, 0xd7c9, 0xb35c, 0xb644, 0xb646, 0xdbd8, 0xb645, 0xb5f9, 0xb5fd, 0xb8e4, 0xe049, 0xdbda, 0xb5fe, 0xdbdd, 0xdbde, 0xb643, 0xdbe0, 0xdbe2, 0xdbe3, 0xdbd7, 0xdbd6, 0xdbe4, 0xb642, 0xdbe1, 0xdbdf, 0xb640, 0xb5fb, 0xb647, 0xdbdb, 0xdbdc, 0xdbd9, 0xb641, 0xb5fc, 0xb5fa, 0xe048, 0xb8df, 0xb8da, 0xb8d5, 0xb8e5, 0xb8d6, 0xb8d2, 0xb8e1, 0xb8de, 0xb8e0, 0xb8d7, 0xb8dc, 0xb8d3, 0xb8d4, 0xe050, 0xe04d, 0xe045, 0xe04a, 0xb8e2, 0xe051, 0xb8e3, 0xb8d9, 0xe047, 0xe04f, 0xe04b, 0xe04e, 0xe04c, 0xb8dd, 0xe046, 0xb8d8, 0xe44c, 0xbb78, 0xbb7b, 0xe44e, 0xbba5, 0xe44d, 0xbb7d, 0xbdcf, 0xe44f, 0xbba4, 0xe44b, 0xbba6, 0xbb79, 0xb8db, 0xbb7c, 0xbb7a, 0xbb7e, 0xbba2, 0xbb77, 0xbba7, 0xbba3, 0xbba1, 0xe44a, 0xbdd6, 0xbdd2, 0xbdd9, 0xe7d6, 0xbdda, 0xe7e2, 0xe7db, 0xbdcb, 0xe7e3, 0xe7dd, 0xbdd5, 0xe7de, 0xbdd4, 0xe7e1, 0xbdce, 0xe7df, 0xe7d5, 0xbdcd, 0xebaa, 0xbdd3, 0xbdd0, 0xbdd8, 0xe7d4, 0xe7d8, 0xbdcc, 0xe7d7, 0xe7d9, 0xe7da, 0xbdd7, 0xe7dc, 0xe7e0, 0xe7e4, 0xbddb, 0xbfd2, 0xeba5, 0xebab, 0xeba8, 0xeb7e, 0xebac, 0xeba1, 0xeba7, 0xbfcd, 0xbfd3, 0xebad, 0xbfcf, 0xbfd9, 0xbfd4, 0xebaf, 0xeba9, 0xbfd0, 0xeba2, 0xbfda, 0xeba3, 0xeba4, 0xbfdb, 0xbfd8, 0xbdd1, 0xbfce, 0xebb0, 0xbfdc, 0xbfd5, 0xebae, 0xbfd1, 0xbfd6, 0xbfd7, 0xc1c3, 0xeea4, 0xeead, 0xeeaa, 0xeeac, 0xc1c0, 0xeea5, 0xeeab, 0xc1bc, 0xeea7, 0xc1c4, 0xeea3, 0xeea8, 0xeeaf, 0xeba6, 0xeea9, 0xeea2, 0xc1bd, 0xeea1, 0xc1be, 0xeeb0, 0xc1bf, 0xeeae, 0xc1c2, 0xee7e, 0xc1c1, 0xeea6, 0xf0dc, 0xf0ea, 0xf0e5, 0xf0e7, 0xf0db, 0xc2d3, 0xf0da, 0xc2d6, 0xc2d5, 0xf0e9, 0xf0e1, 0xf0de, 0xf0e4, 0xf0dd, 0xf0df, 0xf0e8, 0xf0e6, 0xc2d4, 0xf0ed, 0xf0eb, 0xf0e2, 0xf0ec, 0xf0e3, 0xf2f9, 0xc3cf, 0xf341, 0xf64f, 0xc3d6, 0xf0e0, 0xf2f7, 0xc3d2, 0xf2f8, 0xf2fd, 0xc3d4, 0xc3d5, 0xf2f6, 0xf340, 0xf342, 0xf2fa, 0xf2fc, 0xf2fe, 0xf2fb, 0xf343, 0xc3d1, 0xc3d7, 0xc3d3, 0xc3d0, 0xf4d0, 0xc4b7, 0xf4ce, 0xf4d2, 0xf4d3, 0xc4b5, 0xf4d4, 0xf4d1, 0xf4cf, 0xc4b8, 0xc4b4, 0xf4d5, 0xc4b6, 0xc4b3, 0xc4fe, 0xc540, 0xf64e, 0xf64d, 0xf650, 0xf651, 0xc541, 0xf756, 0xf75b, 0xc5aa, 0xf758, 0xf757, 0xf75a, 0xf759, 0xf843, 0xc5dc, 0xf842, 0xf840, 0xf841, 0xc5fe, 0xc5fd, 0xf8c1, 0xf8c2, 0xc640, 0xf94d, 0xf94e, 0xc667, 0xc66d, 0xf9a9, 0xf9c8, 0xa8a6, 0xd7cd, 0xd7ce, 0xe052, 0xe450, 0xe7e5, 0xc1c6, 0xc1c5, 0xf0ee, 0xf344, 0xf844, 0xa8a7, 0xd3de, 0xb05a, 0xb361, 0xe054, 0xe053, 0xbddc, 0xe7e6, 0xbddd, 0xeeb1, 0xc2d7, 0xc676, 0xa8a8, 0xcdcb, 0xd3df, 0xb362, 0xd7cf, 0xd7d0, 0xdbe5, 0xb648, 0xb8e6, 0xe056, 0xe055, 0xe057, 0xe451, 0xe452, 0xbba8, 0xbfdd, 0xbdde, 0xbfde, 0xeeb5, 0xeeb2, 0xeeb4, 0xeeb3, 0xc1c7, 0xf0ef, 0xf346, 0xf345, 0xcba4, 0xb05c, 0xb05b, 0xd3e0, 0xd7d1, 0xdbe7, 0xdbe6, 0xb649, 0xe059, 0xe05a, 0xe058, 0xb8e8, 0xb8e7, 0xbbaa, 0xbba9, 0xe7e7, 0xebb3, 0xebb1, 0xebb2, 0xbfdf, 0xeeb7, 0xeeb6, 0xf0f2, 0xf0f1, 0xf0f0, 0xf347, 0xf9aa, 0xa8a9, 0xad73, 0xad74, 0xb05d, 0xb05e, 0xd3e2, 0xd3e1, 0xd7d2, 0xb368, 0xb366, 0xb363, 0xb367, 0xb365, 0xb364, 0xb64a, 0xdbea, 0xb8ed, 0xb64c, 0xb651, 0xdbec, 0xb653, 0xb652, 0xb655, 0xdbeb, 0xdbe8, 0xb64f, 0xb64b, 0xb64d, 0xdbe9, 0xb654, 0xb650, 0xb64e, 0xb8ef, 0xb8ee, 0xb8ec, 0xb8f0, 0xb8ea, 0xb8eb, 0xb8e9, 0xe05b, 0xe454, 0xbbac, 0xbbad, 0xbbab, 0xe453, 0xe455, 0xe7ea, 0xe7ec, 0xbde7, 0xe7ed, 0xbde0, 0xe7e9, 0xbddf, 0xbde9, 0xbde5, 0xbde6, 0xbde2, 0xe7e8, 0xbde1, 0xe7ee, 0xe7eb, 0xbde8, 0xbde3, 0xbde4, 0xebb5, 0xebb7, 0xebb6, 0xebb8, 0xbfe0, 0xebb4, 0xc1cb, 0xeeb8, 0xc1c8, 0xc1cc, 0xc1ca, 0xc1c9, 0xf0f3, 0xf0f6, 0xf0f5, 0xf0f4, 0xc2d8, 0xf348, 0xf349, 0xc3d8, 0xf34a, 0xc3d9, 0xc4ba, 0xc4b9, 0xf652, 0xc542, 0xf653, 0xf75c, 0xc5ab, 0xc5ac, 0xf845, 0xc642, 0xa8aa, 0xb36a, 0xb369, 0xe05c, 0xe05d, 0xbbae, 0xebb9, 0xbdea, 0xebba, 0xeeb9, 0xa8ab, 0xd0b2, 0xad76, 0xad75, 0xd3e3, 0xb05f, 0xd3e4, 0xd7d5, 0xd7d4, 0xd7d3, 0xdbee, 0xb658, 0xdbed, 0xb657, 0xdbef, 0xb656, 0xe05f, 0xe062, 0xe060, 0xe061, 0xe065, 0xe05e, 0xe066, 0xe063, 0xe064, 0xbbb0, 0xe456, 0xbbaf, 0xe7f2, 0xe7f0, 0xbdeb, 0xe7ef, 0xe7f1, 0xbdec, 0xebbb, 0xebbc, 0xc1cd, 0xf34c, 0xf34e, 0xf34b, 0xf34d, 0xf4d6, 0xf654, 0xf96f, 0xa8ac, 0xad77, 0xd3e5, 0xd3e7, 0xd3e6, 0xd7d8, 0xb36c, 0xd7d6, 0xb36b, 0xd7d9, 0xd7da, 0xd7d7, 0xdbfb, 0xb660, 0xdbf3, 0xdbf9, 0xb65b, 0xb65e, 0xdbf2, 0xb659, 0xdbf6, 0xe06c, 0xb65d, 0xdbf1, 0xdbf7, 0xdbf4, 0xdbfa, 0xdbf0, 0xdbf8, 0xb65c, 0xb65f, 0xdbf5, 0xb65a, 0xb8f2, 0xe068, 0xb8f1, 0xe06f, 0xe06e, 0xb8f8, 0xb8f9, 0xe070, 0xb8f3, 0xe06d, 0xb8f7, 0xe072, 0xe069, 0xe06b, 0xb8f4, 0xe067, 0xe06a, 0xe071, 0xb8f5, 0xe073, 0xb8f6, 0xbbb1, 0xe45b, 0xe461, 0xe459, 0xe462, 0xe458, 0xe45d, 0xe463, 0xe460, 0xe45f, 0xe45e, 0xe457, 0xe45c, 0xe45a, 0xbdf1, 0xbdee, 0xe7fb, 0xe841, 0xe843, 0xe840, 0xe7f8, 0xe7fa, 0xe845, 0xe842, 0xe7fc, 0xe846, 0xe7f9, 0xe844, 0xbdef, 0xbdf5, 0xbdf3, 0xe7f3, 0xbdf4, 0xbdf0, 0xe7f4, 0xe7f6, 0xe7f5, 0xe7fd, 0xe7fe, 0xbdf2, 0xbded, 0xe7f7, 0xebc6, 0xbfe2, 0xebbd, 0xbfe3, 0xbfe6, 0xebc2, 0xebbf, 0xbfe5, 0xebc3, 0xebc4, 0xebbe, 0xebc7, 0xebc0, 0xebc5, 0xbfe4, 0xbfe1, 0xebc1, 0xeebf, 0xc1d0, 0xc1ce, 0xc1d1, 0xc1cf, 0xeebe, 0xeebb, 0xeeba, 0xeebd, 0xeebc, 0xf145, 0xc2de, 0xf0fb, 0xf0fa, 0xc2d9, 0xf141, 0xf140, 0xf0f7, 0xf143, 0xf0fc, 0xc2dd, 0xf0f9, 0xf142, 0xf0f8, 0xc2da, 0xc2dc, 0xf0fd, 0xc2db, 0xf0fe, 0xf144, 0xf352, 0xc3de, 0xf34f, 0xf353, 0xc3db, 0xf351, 0xc3e0, 0xc3dd, 0xf350, 0xc3df, 0xf354, 0xc3da, 0xc4bc, 0xc4be, 0xf4d9, 0xc4bd, 0xf4d7, 0xc3dc, 0xf4d8, 0xc4bb, 0xc543, 0xc545, 0xf656, 0xc544, 0xf655, 0xf761, 0xc5ad, 0xf760, 0xc5ae, 0xf75e, 0xf75d, 0xf762, 0xf763, 0xf846, 0xf75f, 0xf8c6, 0xf8c3, 0xf8c4, 0xf8c5, 0xc65c, 0xf951, 0xf950, 0xf94f, 0xf970, 0xf9be, 0xf9ab, 0xc66e, 0xa8ad, 0xb060, 0xb8fa, 0xbdf6, 0xebc8, 0xc2df, 0xf355, 0xf9ac, 0xa8ae, 0xaaee, 0xad79, 0xad78, 0xb063, 0xd3e8, 0xb061, 0xd3e9, 0xb062, 0xd7df, 0xd7db, 0xb36d, 0xd7de, 0xd7dd, 0xd7dc, 0xb36e, 0xd7e0, 0xd7e1, 0xdc43, 0xdc41, 0xdc45, 0xdc46, 0xdc4c, 0xdc48, 0xdc4a, 0xdc42, 0xdbfc, 0xdc49, 0xdc4b, 0xdc44, 0xdc47, 0xdbfd, 0xb662, 0xdc40, 0xdbfe, 0xb661, 0xb663, 0xb8fd, 0xe075, 0xe077, 0xe076, 0xe07b, 0xb8fb, 0xe078, 0xe074, 0xe079, 0xe07a, 0xb8fc, 0xb8fe, 0xe07c, 0xe467, 0xe466, 0xe464, 0xe465, 0xbbb3, 0xbbb5, 0xbbb2, 0xbbb4, 0xe84d, 0xe84e, 0xe849, 0xe84a, 0xbdf8, 0xbdfd, 0xbdf7, 0xbdfe, 0xbdf9, 0xe84b, 0xe84c, 0xe848, 0xbe40, 0xbdfb, 0xbdfa, 0xbdfc, 0xe847, 0xebca, 0xbfe8, 0xebcc, 0xbfea, 0xebcf, 0xebcb, 0xebc9, 0xebce, 0xbfe9, 0xebcd, 0xbfe7, 0xc1d3, 0xc1d6, 0xeec1, 0xc1d4, 0xeec0, 0xc1d2, 0xc1d5, 0xf146, 0xf147, 0xf148, 0xc2e0, 0xf149, 0xc2e1, 0xc3e2, 0xf358, 0xf359, 0xf357, 0xf356, 0xf35a, 0xc3e1, 0xf4dd, 0xf4db, 0xf4dc, 0xf4de, 0xf4da, 0xf4df, 0xf658, 0xf659, 0xf657, 0xc546, 0xf764, 0xc5af, 0xf765, 0xf848, 0xf847, 0xa8af, 0xb664, 0xb940, 0xbbb6, 0xbfec, 0xbfeb, 0xc3e3, 0xc47c, 0xc547, 0xa8b0, 0xb064, 0xb941, 0xf35b, 0xcba6, 0xa8b1, 0xa8b4, 0xa8b3, 0xa8b2, 0xcba5, 0xcdcd, 0xcdcf, 0xaaef, 0xaaf1, 0xcdcc, 0xcdce, 0xaaf0, 0xcdd1, 0xcdd0, 0xcdd2, 0xd0b6, 0xd0b4, 0xad7c, 0xd0b3, 0xada3, 0xad7e, 0xad7b, 0xada4, 0xad7d, 0xada2, 0xada1, 0xd0b5, 0xad7a, 0xb06a, 0xd3eb, 0xd3f1, 0xb067, 0xb06e, 0xb069, 0xd3ee, 0xd3f0, 0xb06c, 0xd3ea, 0xd3ed, 0xb068, 0xb065, 0xd3ec, 0xb06b, 0xd3ef, 0xb06d, 0xb066, 0xd7e3, 0xd7e6, 0xb370, 0xb37a, 0xb376, 0xd7e4, 0xb37e, 0xb377, 0xb37c, 0xb372, 0xb36f, 0xb371, 0xb37d, 0xd7e5, 0xb375, 0xb378, 0xb374, 0xb379, 0xd7e7, 0xb37b, 0xb373, 0xd7e2, 0xdc4d, 0xb665, 0xdc4f, 0xb667, 0xb669, 0xdc4e, 0xb666, 0xb66a, 0xb668, 0xb947, 0xe0a3, 0xb94f, 0xe07e, 0xb950, 0xb945, 0xe0a1, 0xb94a, 0xe0a2, 0xb943, 0xb942, 0xb94d, 0xb94c, 0xb94b, 0xb949, 0xb94e, 0xe07d, 0xb944, 0xb946, 0xb948, 0xbbb8, 0xbbbb, 0xbbbf, 0xbbb9, 0xbbbe, 0xbbbc, 0xbbb7, 0xbbbd, 0xbbba, 0xe852, 0xbe43, 0xbe41, 0xe853, 0xbe44, 0xbe42, 0xe851, 0xe850, 0xbff0, 0xe84f, 0xbfee, 0xbfed, 0xebd0, 0xbe45, 0xbfef, 0xebd1, 0xbff2, 0xebd2, 0xbff1, 0xc1d8, 0xeec3, 0xc1d7, 0xc1dc, 0xc1da, 0xc1db, 0xc2e3, 0xc1d9, 0xeec2, 0xebd3, 0xc2e2, 0xc2e4, 0xc3e4, 0xc3e5, 0xf4e0, 0xc5de, 0xc5dd, 0xa8b6, 0xca55, 0xb06f, 0xca52, 0xca53, 0xca51, 0xca54, 0xcbaa, 0xcba7, 0xcbac, 0xcba8, 0xa8b7, 0xa8ba, 0xcba9, 0xa8b9, 0xcbab, 0xa8b8, 0xcdd5, 0xcdd7, 0xaaf4, 0xcdd3, 0xcdd6, 0xcdd4, 0xaaf2, 0xaaf5, 0xaaf3, 0xd0b8, 0xd0bc, 0xd0b9, 0xada7, 0xada8, 0xd0bb, 0xd0bd, 0xd0bf, 0xada5, 0xd0be, 0xada6, 0xd7ee, 0xd0ba, 0xd3f2, 0xd3fb, 0xd3f9, 0xd3f4, 0xd3f5, 0xd3fa, 0xd3fc, 0xb071, 0xd3f7, 0xd3f3, 0xb070, 0xb072, 0xd3f6, 0xd3fd, 0xd3f8, 0xb3a1, 0xd7f1, 0xd7e9, 0xd7ef, 0xd7f0, 0xb3a2, 0xd7e8, 0xd7ea, 0xd0b7, 0xd7ec, 0xd7ed, 0xd7eb, 0xb66c, 0xdc56, 0xebd4, 0xdc57, 0xdc54, 0xb3a3, 0xb66e, 0xdc53, 0xdc59, 0xdc58, 0xb66b, 0xdc5c, 0xdc52, 0xdc5b, 0xdc50, 0xdc5a, 0xdc55, 0xb66d, 0xe0aa, 0xe0a5, 0xe0ab, 0xe0a6, 0xe0a4, 0xe0a7, 0xb951, 0xe0a9, 0xe0a8, 0xb952, 0xbbc1, 0xbbc0, 0xe46e, 0xe471, 0xe469, 0xe46d, 0xbbc2, 0xe46c, 0xe46a, 0xe470, 0xe46b, 0xe468, 0xe46f, 0xe859, 0xbe48, 0xf14a, 0xe856, 0xe857, 0xe855, 0xdc51, 0xbe47, 0xe85a, 0xe854, 0xbe46, 0xbe49, 0xe858, 0xebd5, 0xbff3, 0xebd6, 0xebd7, 0xeec4, 0xc1dd, 0xf14b, 0xf14c, 0xf14d, 0xf35d, 0xf35c, 0xf4e2, 0xf4e1, 0xf65b, 0xf65c, 0xf65a, 0xf766, 0xc5b0, 0xa8bb, 0xadaa, 0xada9, 0xb075, 0xb074, 0xd440, 0xd441, 0xd3fe, 0xb073, 0xd7f5, 0xd7f6, 0xd7f2, 0xb3a4, 0xd7f3, 0xd7f4, 0xdc5f, 0xdc61, 0xdc5d, 0xdc60, 0xb66f, 0xdc5e, 0xb670, 0xdd73, 0xb955, 0xb954, 0xb953, 0xe0ac, 0xe0ad, 0xe473, 0xe475, 0xbbc6, 0xbbc3, 0xbbc5, 0xbbc4, 0xe474, 0xe472, 0xe861, 0xe85e, 0xe85f, 0xbe4d, 0xe860, 0xe85b, 0xe85c, 0xbe4a, 0xbe4b, 0xe85d, 0xbe4c, 0xebdb, 0xebdc, 0xebd9, 0xebda, 0xbff4, 0xebd8, 0xeec8, 0xeec5, 0xeec7, 0xc1e0, 0xeecb, 0xc1df, 0xeec9, 0xeecc, 0xeeca, 0xeec6, 0xc1de, 0xf14f, 0xf150, 0xf14e, 0xf152, 0xc2e5, 0xc2e6, 0xf35f, 0xc3e7, 0xf151, 0xf35e, 0xc3e6, 0xf4e5, 0xf4e6, 0xc4bf, 0xf4e4, 0xf4e3, 0xf65d, 0xc548, 0xf849, 0xf8c8, 0xf8c7, 0xc643, 0xc65d, 0xf8c9, 0xf971, 0xc66f, 0xa8bc, 0xaaf6, 0xb956, 0xc4c0, 0xa8bd, 0xadab, 0xb3a5, 0xb671, 0xc2e7, 0xaaf7, 0xd0c1, 0xd0c0, 0xd442, 0xb078, 0xb076, 0xb07a, 0xd444, 0xb079, 0xb077, 0xd443, 0xb3a8, 0xd7fc, 0xb3a7, 0xb3a9, 0xd842, 0xb3ab, 0xd7fe, 0xd840, 0xd7f7, 0xb3aa, 0xd843, 0xd7f9, 0xd7fa, 0xd7f8, 0xb3a6, 0xd841, 0xd7fb, 0xd7fd, 0xdc6d, 0xdc6c, 0xdc6a, 0xdc62, 0xdc71, 0xdc65, 0xdc6f, 0xdc76, 0xdc6e, 0xb679, 0xb675, 0xdc63, 0xdc69, 0xb677, 0xdc68, 0xb678, 0xb67a, 0xdc6b, 0xb672, 0xb673, 0xdc77, 0xdc75, 0xdc74, 0xdc66, 0xdc72, 0xb676, 0xb674, 0xdc73, 0xdc64, 0xdc67, 0xdc70, 0xe4ba, 0xe0b7, 0xe0b0, 0xe0c3, 0xe0cc, 0xe0b3, 0xb961, 0xe0c0, 0xb957, 0xb959, 0xb965, 0xe0b1, 0xb95a, 0xb95c, 0xb966, 0xb95b, 0xb964, 0xe0b9, 0xe0ae, 0xb962, 0xe0b8, 0xb95e, 0xe0ca, 0xb963, 0xe0c8, 0xe0bc, 0xe0c6, 0xb960, 0xe0af, 0xe0c9, 0xe0c4, 0xe0cb, 0xb958, 0xb967, 0xb95d, 0xe0b5, 0xe0bd, 0xe0c1, 0xe0c5, 0xb95f, 0xe0b4, 0xe0b2, 0xe0be, 0xe0bb, 0xe0ba, 0xe0bf, 0xe0c2, 0xe0c7, 0xe478, 0xbbc7, 0xe4a4, 0xe47a, 0xbbcc, 0xbbd0, 0xe4ad, 0xe4b5, 0xe4a6, 0xbbc8, 0xe4aa, 0xe0b6, 0xbbc9, 0xe4b1, 0xe4b6, 0xe4ae, 0xe4b0, 0xe4b9, 0xe4b2, 0xe47e, 0xe4a9, 0xbbd1, 0xbbcd, 0xe47c, 0xe4ab, 0xbbcb, 0xe4a5, 0xbbca, 0xe4b3, 0xe4a2, 0xe479, 0xbbce, 0xe4b8, 0xe47b, 0xe4af, 0xe4ac, 0xe4a7, 0xe477, 0xe476, 0xe4a1, 0xe4b4, 0xbbcf, 0xe4b7, 0xe47d, 0xe4a3, 0xbe52, 0xbe5a, 0xbe55, 0xe8a4, 0xe8a1, 0xe867, 0xbe50, 0xbe4f, 0xbe56, 0xe865, 0xbe54, 0xe871, 0xe863, 0xe864, 0xbe4e, 0xe8a3, 0xbe58, 0xe874, 0xe879, 0xe873, 0xebee, 0xe86f, 0xe877, 0xe875, 0xe868, 0xe862, 0xe87d, 0xbe57, 0xe87e, 0xe878, 0xe86d, 0xe86b, 0xe866, 0xe86e, 0xe87b, 0xe86a, 0xe87a, 0xe8a2, 0xbe53, 0xe876, 0xe87c, 0xe872, 0xe86c, 0xbe51, 0xe4a8, 0xe870, 0xbe59, 0xe869, 0xebf4, 0xbff7, 0xebf3, 0xebf0, 0xec44, 0xbffb, 0xec41, 0xebf8, 0xec43, 0xebe9, 0xebf6, 0xbffd, 0xebe1, 0xebdf, 0xec42, 0xec40, 0xebfe, 0xebed, 0xebec, 0xebe2, 0xc040, 0xebe8, 0xebf2, 0xebfd, 0xc043, 0xec45, 0xc1e8, 0xc045, 0xbffe, 0xebe6, 0xebef, 0xebde, 0xebe0, 0xbff5, 0xc042, 0xbffa, 0xebe7, 0xebf7, 0xebf1, 0xc041, 0xebdd, 0xc1e3, 0xebf9, 0xebfc, 0xbffc, 0xebeb, 0xc044, 0xbff9, 0xbff8, 0xebf5, 0xebfb, 0xbff6, 0xebe4, 0xebfa, 0xebe5, 0xebea, 0xeed2, 0xeed7, 0xc1e5, 0xc1e7, 0xeedd, 0xc1e1, 0xeeec, 0xeee3, 0xeed8, 0xeed9, 0xeee2, 0xc1ee, 0xeee1, 0xeed1, 0xeee0, 0xeed4, 0xeeed, 0xc1ed, 0xc1eb, 0xeed5, 0xeee8, 0xeeda, 0xeee7, 0xeee9, 0xeed0, 0xc1e6, 0xeeea, 0xeede, 0xc1ea, 0xeedb, 0xc1ec, 0xeee4, 0xc1e4, 0xeed6, 0xeee5, 0xeedf, 0xebe3, 0xeee6, 0xeed3, 0xc1e9, 0xeeeb, 0xc1e2, 0xeece, 0xf160, 0xf159, 0xc2e9, 0xf154, 0xf163, 0xf15b, 0xeedc, 0xf165, 0xf155, 0xc2e8, 0xf15f, 0xc2ea, 0xc2f2, 0xc2f0, 0xf161, 0xc2f1, 0xf157, 0xf158, 0xf15d, 0xf162, 0xeecd, 0xc2eb, 0xf16a, 0xf167, 0xf16b, 0xf15e, 0xf15a, 0xf168, 0xf36a, 0xf15c, 0xc2ee, 0xc2ed, 0xeecf, 0xc2ef, 0xf164, 0xf166, 0xc2ec, 0xf169, 0xf153, 0xf156, 0xf373, 0xf363, 0xc3eb, 0xf371, 0xf361, 0xc3ec, 0xf36c, 0xf368, 0xc3f1, 0xf372, 0xf362, 0xf365, 0xc3e9, 0xf374, 0xf36d, 0xf370, 0xc3ef, 0xc3f4, 0xc3f2, 0xf369, 0xf364, 0xc3ed, 0xc3ee, 0xf360, 0xc3ea, 0xc3e8, 0xc3f0, 0xf36f, 0xc3f3, 0xf36b, 0xf375, 0xc3f5, 0xf367, 0xf36e, 0xf4f3, 0xf542, 0xf4f5, 0xf4fc, 0xf366, 0xf4fa, 0xf4e9, 0xf540, 0xc4c3, 0xf4ed, 0xf4fe, 0xf4f4, 0xc4c2, 0xf544, 0xf4f6, 0xf4fb, 0xf4fd, 0xf4e7, 0xf541, 0xf4f2, 0xf4f7, 0xf4eb, 0xf4ef, 0xf543, 0xf4f9, 0xf4e8, 0xf4ec, 0xf4ee, 0xf4f8, 0xc4c1, 0xf4f1, 0xf4ea, 0xf4f0, 0xf661, 0xf666, 0xc54f, 0xf668, 0xc549, 0xf664, 0xf66a, 0xc54e, 0xc54a, 0xc54b, 0xf660, 0xf667, 0xc54d, 0xf665, 0xc54c, 0xf65f, 0xf663, 0xf662, 0xf65e, 0xf669, 0xc5b1, 0xf76d, 0xf770, 0xf76c, 0xf76e, 0xf76f, 0xf769, 0xf76a, 0xf767, 0xf76b, 0xf768, 0xc5b2, 0xc5b3, 0xf84b, 0xf84d, 0xf84c, 0xf84e, 0xc5e0, 0xf84a, 0xc5df, 0xc5e1, 0xf8cb, 0xf8cc, 0xc644, 0xf8ca, 0xf953, 0xf952, 0xf954, 0xc65f, 0xf955, 0xc65e, 0xf956, 0xf972, 0xf975, 0xf974, 0xc668, 0xf973, 0xc672, 0xc670, 0xc671, 0xc677, 0xf9c0, 0xf9c1, 0xf9bf, 0xf9c9, 0xaaf8, 0xd844, 0xdc78, 0xe8a5, 0xf376, 0xaaf9, 0xadac, 0xb07b, 0xd845, 0xd846, 0xb3ac, 0xb67d, 0xdc7a, 0xdc79, 0xb6a3, 0xb67c, 0xdc7b, 0xb67e, 0xb6a2, 0xb6a1, 0xb67b, 0xb968, 0xe0d0, 0xe0ce, 0xe0cf, 0xe0cd, 0xbbd2, 0xbbd5, 0xbbd7, 0xbbd6, 0xbbd3, 0xbbd4, 0xe8a7, 0xe8a6, 0xbe5b, 0xe8a8, 0xe8a9, 0xbe5c, 0xec4d, 0xec4b, 0xeef3, 0xec49, 0xec4a, 0xc046, 0xec46, 0xec4e, 0xec48, 0xec4c, 0xeeef, 0xeef1, 0xeef2, 0xc1f3, 0xeeee, 0xc1f2, 0xeef0, 0xc1ef, 0xc1f0, 0xc1f1, 0xec47, 0xc2f5, 0xf16e, 0xf16c, 0xf16d, 0xc2f3, 0xc2f6, 0xc2f4, 0xf377, 0xf378, 0xc3f6, 0xf545, 0xf547, 0xf546, 0xc4c4, 0xc550, 0xf66d, 0xf66c, 0xf66b, 0xaafa, 0xc9aa, 0xca58, 0xa6e9, 0xca56, 0xca59, 0xca57, 0xcbae, 0xa8c1, 0xa8c2, 0xcbb0, 0xa8bf, 0xcbaf, 0xcbad, 0xa8c0, 0xa8be, 0xcdd8, 0xcddb, 0xaafd, 0xcdda, 0xcdd9, 0xaafc, 0xaafb, 0xab40, 0xcddc, 0xaafe, 0xd0c6, 0xadae, 0xadaf, 0xadb0, 0xd0c7, 0xd0c3, 0xadad, 0xd0c4, 0xd0c5, 0xd0c2, 0xb0a4, 0xb0a1, 0xd445, 0xb0a2, 0xb0a5, 0xd446, 0xb07e, 0xb07c, 0xb07d, 0xb0a3, 0xb3ad, 0xd849, 0xb3b5, 0xd848, 0xd84b, 0xb3b1, 0xd84a, 0xb6ab, 0xb3af, 0xb3b2, 0xb3ae, 0xb3b3, 0xb3b4, 0xb3b0, 0xd847, 0xb6a7, 0xdc7d, 0xdca3, 0xdca2, 0xb6ac, 0xb6a8, 0xb6a9, 0xdc7c, 0xdc7e, 0xdca1, 0xb6a4, 0xb6a6, 0xb6aa, 0xb6a5, 0xe0d3, 0xe0d1, 0xe0d2, 0xb96a, 0xb96b, 0xe0d4, 0xb969, 0xbbd8, 0xbbda, 0xbbd9, 0xe4bb, 0xe4bc, 0xe8ab, 0xe8aa, 0xc047, 0xc048, 0xec4f, 0xc049, 0xeef6, 0xeef4, 0xeef5, 0xc1f4, 0xf16f, 0xc3f7, 0xc1f5, 0xab41, 0xb0a6, 0xd447, 0xd84c, 0xb3b6, 0xb6ad, 0xdca4, 0xdca6, 0xb6af, 0xb6ae, 0xb6b0, 0xb6b1, 0xdca5, 0xb96e, 0xb96f, 0xb96d, 0xbbdb, 0xb96c, 0xe0d5, 0xbbdc, 0xe8ac, 0xec50, 0xc04a, 0xc1f6, 0xf170, 0xf174, 0xc2f9, 0xf171, 0xc2fa, 0xc2f8, 0xf175, 0xc2fb, 0xf173, 0xf379, 0xc2f7, 0xc3f8, 0xf8cd, 0xab42, 0xb3b8, 0xb3b7, 0xb6b2, 0xdca8, 0xdca7, 0xb6b3, 0xe0d9, 0xb973, 0xb970, 0xe0d8, 0xb972, 0xe0d6, 0xb971, 0xe0d7, 0xe4bd, 0xbbdd, 0xe8af, 0xbe5d, 0xe8ad, 0xbe5e, 0xbe5f, 0xe8ae, 0xbe60, 0xec51, 0xc04e, 0xc04b, 0xc050, 0xec53, 0xc04c, 0xec52, 0xc04f, 0xc04d, 0xeef9, 0xeefb, 0xc1f7, 0xeefa, 0xc1f8, 0xeef8, 0xeef7, 0xf177, 0xf176, 0xc2fc, 0xf178, 0xf37e, 0xc3fa, 0xf37d, 0xf37a, 0xc3f9, 0xf37b, 0xf37c, 0xf548, 0xf549, 0xc4c5, 0xc553, 0xf66e, 0xc551, 0xc552, 0xf66f, 0xc5b4, 0xc5b5, 0xf771, 0xc645, 0xf8cf, 0xc647, 0xf8ce, 0xf8d0, 0xc646, 0xf957, 0xf9ad, 0xab43, 0xb974, 0xe4be, 0xe8b0, 0xc051, 0xc052, 0xab44, 0xbe61, 0xc3fb, 0xadb1, 0xc053, 0xc5e2, 0xadb2, 0xd84d, 0xdca9, 0xdcab, 0xdcaa, 0xe0dd, 0xe0da, 0xb975, 0xb976, 0xe0db, 0xe0dc, 0xe4c0, 0xe4c5, 0xbbde, 0xe4bf, 0xe4c1, 0xe4c8, 0xe4c3, 0xe4c7, 0xe4c4, 0xe4c2, 0xe4c6, 0xbbdf, 0xe8b3, 0xe8b1, 0xbe63, 0xbe62, 0xe8b2, 0xbe64, 0xec56, 0xec55, 0xc054, 0xec54, 0xeefc, 0xeefe, 0xef41, 0xef40, 0xc1f9, 0xeefd, 0xf1a1, 0xc2fd, 0xf17d, 0xf1a2, 0xc2fe, 0xf17b, 0xf17e, 0xf17c, 0xf179, 0xc340, 0xf17a, 0xf3a1, 0xf3a3, 0xf3a2, 0xf54a, 0xf54b, 0xf670, 0xc5b7, 0xc5b6, 0xf84f, 0xf850, 0xc648, 0xf8d1, 0xc669, 0xadb3, 0xb6b4, 0xe4ca, 0xe4c9, 0xe8b5, 0xe8b4, 0xc1fa, 0xef43, 0xef42, 0xf1a5, 0xf1a3, 0xf1a6, 0xf1a4, 0xc3fc, 0xf3a4, 0xf3a5, 0xf3a6, 0xf671, 0xf772, 0xf8d2, 0xadb4, 0xec57, 0xef44, 0xadb5, 0xbbe0, 0xec58, 0xc341, 0xf1a7, 0xc3fd, 0xf54c, 0xf54d, 0xc554, 0xf851, 0xadb6, 0xb3bb, 0xb3bc, 0xd84e, 0xb6b5, 0xb6b6, 0xdcac, 0xb6b7, 0xb97a, 0xb97c, 0xe0df, 0xe0e0, 0xe0de, 0xb977, 0xb978, 0xb97b, 0xb979, 0xe4cb, 0xbbe1, 0xbbe2, 0xe8bc, 0xbe67, 0xe8b7, 0xe8b6, 0xe8bb, 0xbe65, 0xc05b, 0xe8b8, 0xe8bd, 0xe8ba, 0xe8b9, 0xbe66, 0xc059, 0xec5a, 0xc055, 0xec5b, 0xec59, 0xc058, 0xc056, 0xc05a, 0xc057, 0xef45, 0xef4a, 0xef46, 0xef49, 0xc1fb, 0xedd4, 0xef48, 0xef47, 0xc344, 0xc342, 0xc345, 0xc343, 0xf1a8, 0xf1a9, 0xf1aa, 0xc346, 0xf3aa, 0xc440, 0xf3a8, 0xc441, 0xf3a7, 0xf3a9, 0xc3fe, 0xf551, 0xf54e, 0xf54f, 0xf550, 0xf672, 0xc556, 0xc555, 0xf774, 0xf773, 0xc5b8, 0xc5e3, 0xc649, 0xc660, 0xf958, 0xf9ae, 0xf9af, 0xadb7, 0xdcad, 0xe0e1, 0xe4cc, 0xe4cd, 0xbbe3, 0xbbe4, 0xe8be, 0xbe68, 0xc1fc, 0xf1ab, 0xc347, 0xf3ad, 0xc442, 0xf3ac, 0xf3ae, 0xf3ab, 0xf675, 0xf552, 0xf553, 0xc4c6, 0xf674, 0xf673, 0xf775, 0xf9b0, 0xadb8, 0xadb9, 0xb0a7, 0xd448, 0xd84f, 0xb6b8, 0xb6bb, 0xb6b9, 0xdcae, 0xb6bd, 0xb6ba, 0xb6bc, 0xb97e, 0xe0e2, 0xe0e3, 0xe8c0, 0xb97d, 0xb9a1, 0xb9a2, 0xe4cf, 0xe4ce, 0xbbe5, 0xbbe6, 0xe4d0, 0xe8bf, 0xbbe8, 0xbe69, 0xbbe7, 0xc05c, 0xe8c1, 0xbe6b, 0xbe6a, 0xe8c2, 0xe8c5, 0xe8c3, 0xe8c4, 0xbe6c, 0xc061, 0xc05f, 0xc05e, 0xec5d, 0xc060, 0xec5c, 0xef4b, 0xec5e, 0xc05d, 0xec5f, 0xef4e, 0xef4c, 0xef4d, 0xef52, 0xc34b, 0xef51, 0xef54, 0xef53, 0xef50, 0xef4f, 0xc1fd, 0xf1ae, 0xf1ad, 0xc34a, 0xc348, 0xc349, 0xf1ac, 0xf3b1, 0xc443, 0xf3b0, 0xf3af, 0xc444, 0xf558, 0xf557, 0xf555, 0xf554, 0xc4c8, 0xc4c7, 0xf559, 0xf776, 0xc5b9, 0xf677, 0xc557, 0xf676, 0xf556, 0xf777, 0xc5e4, 0xc661, 0xf959, 0xf9b1, 0xadba, 0xd850, 0xef55, 0xadbb, 0xe4d2, 0xe4d1, 0xec60, 0xef57, 0xef56, 0xc34c, 0xf3b2, 0xf3b3, 0xc4c9, 0xf9b2, 0xb0a8, 0xb6bf, 0xb6be, 0xe0e4, 0xe0e6, 0xb9a4, 0xe0e5, 0xb9a3, 0xb9a5, 0xe0e7, 0xe4d4, 0xe4d6, 0xe4d5, 0xe4d8, 0xbbe9, 0xe4d7, 0xe4d3, 0xe4d9, 0xe8cc, 0xe8cf, 0xe8d1, 0xe8c7, 0xe8cb, 0xe8c8, 0xbe6e, 0xbe71, 0xbe73, 0xe8c9, 0xe8ca, 0xbe72, 0xe8cd, 0xe8d0, 0xe8ce, 0xbe74, 0xbe70, 0xe8c6, 0xbe6d, 0xbe6f, 0xc063, 0xec66, 0xec64, 0xec63, 0xec69, 0xec68, 0xec67, 0xec62, 0xc062, 0xec61, 0xec65, 0xc064, 0xef5a, 0xef5e, 0xef5b, 0xef5d, 0xef5c, 0xef59, 0xef5f, 0xef62, 0xef60, 0xef61, 0xc240, 0xc1fe, 0xef58, 0xef63, 0xf1b3, 0xf1b6, 0xf1b8, 0xf1b7, 0xf1b1, 0xf1b5, 0xf1b0, 0xf1b2, 0xc34d, 0xf1af, 0xf1b4, 0xf3c0, 0xf3b5, 0xc445, 0xc446, 0xf3b4, 0xf3b9, 0xf3bf, 0xf3b7, 0xf3be, 0xf3bb, 0xf3ba, 0xf3bd, 0xf3b8, 0xf3b6, 0xf3bc, 0xf560, 0xf55e, 0xc4ca, 0xf55d, 0xf563, 0xf561, 0xc4cb, 0xf55c, 0xf55a, 0xf55b, 0xc4cd, 0xf55f, 0xc4cc, 0xf562, 0xf678, 0xf67e, 0xf679, 0xc55b, 0xf6a1, 0xc55a, 0xf67d, 0xf67c, 0xc559, 0xf67b, 0xc558, 0xf67a, 0xf77d, 0xf7a1, 0xf77e, 0xf77b, 0xc5bb, 0xf778, 0xf77c, 0xf7a3, 0xf7a2, 0xf779, 0xf77a, 0xc5ba, 0xf852, 0xc5e7, 0xf853, 0xc5e5, 0xc5e6, 0xf8d3, 0xc64a, 0xf976, 0xc66a, 0xf9b3, 0xc66b, 0xf9b4, 0xf9b5, 0xf9c3, 0xf9c2, 0xc67a, 0xf9cd, 0xb0a9, 0xe0e9, 0xe0e8, 0xbbea, 0xbbeb, 0xe4da, 0xe8d2, 0xec6c, 0xbe75, 0xc065, 0xec6a, 0xec6d, 0xc066, 0xef64, 0xec6b, 0xf1b9, 0xc34e, 0xf3c1, 0xf566, 0xf564, 0xf565, 0xf6a2, 0xc55c, 0xf7a4, 0xc5ea, 0xc5bc, 0xc5e8, 0xc5e9, 0xf8d4, 0xc662, 0xb0aa, 0xf1ba, 0xd449, 0xb9a6, 0xe4db, 0xbbec, 0xe4dc, 0xe8d4, 0xe8d3, 0xc068, 0xbe76, 0xbe77, 0xe8d7, 0xe8d6, 0xe8d5, 0xec6e, 0xec71, 0xec70, 0xec6f, 0xc067, 0xef68, 0xef66, 0xef65, 0xef67, 0xc34f, 0xf1bc, 0xf1bd, 0xc350, 0xf1bb, 0xf3c3, 0xf3c2, 0xf3c5, 0xc447, 0xf3c4, 0xf567, 0xf569, 0xf568, 0xf6a3, 0xf6a6, 0xf6a4, 0xf6a5, 0xf7a5, 0xc5bd, 0xf854, 0xf855, 0xf856, 0xc64b, 0xc663, 0xf9b6, 0xb0ab, 0xbe78, 0xc069, 0xf1be, 0xf7a6, 0xf9c4, 0xd44a, 0xc67b, 0xb0ac, 0xec72, 0xf1bf, 0xf3c6, 0xf6a7, 0xf7a7, 0xb0ad, 0xe4dd, 0xe4de, 0xbbed, 0xbbee, 0xe8d9, 0xbe7a, 0xbe79, 0xe8d8, 0xef69, 0xf1c0, 0xf1c2, 0xf1c1, 0xc353, 0xc352, 0xc351, 0xc55e, 0xf6a8, 0xc55d, 0xf7a9, 0xf7a8, 0xc64c, 0xf8d5, 0xb3bd, 0xe0ea, 0xe4e1, 0xe4df, 0xe4e0, 0xe8e2, 0xe8dd, 0xe8da, 0xe8e1, 0xe8e3, 0xbe7c, 0xe8e0, 0xe8dc, 0xe8db, 0xe8df, 0xe8de, 0xbe7b, 0xec7d, 0xec78, 0xec76, 0xeca1, 0xec77, 0xec73, 0xec79, 0xec74, 0xef72, 0xec75, 0xeca2, 0xec7c, 0xc06a, 0xec7b, 0xec7a, 0xec7e, 0xef6a, 0xef6d, 0xef6c, 0xef74, 0xef6f, 0xef73, 0xef71, 0xef70, 0xef6e, 0xef6b, 0xc243, 0xc242, 0xc244, 0xc241, 0xef75, 0xf1c8, 0xf1cb, 0xf1c9, 0xf1cd, 0xf1ce, 0xf1c6, 0xc358, 0xf1c7, 0xf1c5, 0xf1cc, 0xf1c4, 0xf1c3, 0xc357, 0xc355, 0xc354, 0xf1ca, 0xf3cf, 0xf3d5, 0xc44a, 0xf3d0, 0xf3d3, 0xf3d7, 0xc44b, 0xf3d2, 0xf3ca, 0xf3c9, 0xf3d6, 0xf3cd, 0xf3cb, 0xf3d4, 0xf3cc, 0xc449, 0xc448, 0xf3c7, 0xf3c8, 0xf3d1, 0xf3ce, 0xf56c, 0xf56f, 0xc356, 0xf56d, 0xf573, 0xf571, 0xf56b, 0xf576, 0xf56a, 0xc4cf, 0xf572, 0xf56e, 0xc4ce, 0xf575, 0xf574, 0xf6ab, 0xf6aa, 0xf6b1, 0xf6ad, 0xf6b0, 0xc560, 0xf6ae, 0xf6af, 0xf6a9, 0xf6ac, 0xc55f, 0xc5bf, 0xf7b4, 0xf7af, 0xf7b3, 0xf7b6, 0xf7b2, 0xf7ae, 0xc5c1, 0xf7b1, 0xf7b5, 0xc5c0, 0xf7ac, 0xf570, 0xf7b0, 0xf7ad, 0xf7aa, 0xf7ab, 0xc5be, 0xf85a, 0xf85c, 0xf85f, 0xf85b, 0xf860, 0xf859, 0xf857, 0xc5eb, 0xf85d, 0xc5ed, 0xc5ec, 0xf858, 0xf85e, 0xf8da, 0xc64d, 0xf8db, 0xf8d9, 0xf8d6, 0xf8d8, 0xf8d7, 0xf95a, 0xf95c, 0xf95b, 0xf979, 0xf978, 0xf977, 0xf97a, 0xc673, 0xc674, 0xf9ca, 0xf9ce, 0xb3be, 0xdcaf, 0xe0ed, 0xb9a7, 0xe0eb, 0xe0ec, 0xe4e2, 0xe4e3, 0xbbf1, 0xbbef, 0xe4e4, 0xbbf0, 0xe8e8, 0xe8eb, 0xe8e5, 0xe8ec, 0xe8e4, 0xe8e6, 0xe8e7, 0xe8ea, 0xbea1, 0xe8ef, 0xe8ee, 0xbe7d, 0xe8e9, 0xe8ed, 0xbe7e, 0xecac, 0xc06f, 0xeca7, 0xc06b, 0xeca4, 0xecaa, 0xecad, 0xc070, 0xeca9, 0xeca6, 0xecae, 0xeca5, 0xecab, 0xc06c, 0xeca3, 0xc06d, 0xc06e, 0xeca8, 0xefa9, 0xef7a, 0xef7b, 0xef7e, 0xef7c, 0xef76, 0xef79, 0xefa5, 0xef7d, 0xc245, 0xefa7, 0xefa4, 0xc246, 0xefa6, 0xef77, 0xefa2, 0xefa3, 0xefa1, 0xf1d2, 0xf1d4, 0xf1d7, 0xf1d1, 0xc359, 0xf1d9, 0xf1d0, 0xf1da, 0xf1d6, 0xf1d8, 0xf1dc, 0xf1d5, 0xf1dd, 0xf1d3, 0xf1cf, 0xc35a, 0xf1db, 0xc35b, 0xc44d, 0xef78, 0xf3f1, 0xf3e8, 0xc44f, 0xf3e4, 0xc450, 0xf3ed, 0xf3e7, 0xf3dd, 0xc44e, 0xf3ea, 0xf3e5, 0xf3e6, 0xf3d8, 0xf3df, 0xf3ee, 0xf3eb, 0xf3e3, 0xf3ef, 0xf3de, 0xf3d9, 0xf3ec, 0xf3db, 0xf3e9, 0xf3e0, 0xf3f0, 0xf3dc, 0xc44c, 0xf3da, 0xf3e1, 0xf3e2, 0xf57d, 0xf57b, 0xf5a2, 0xf5ae, 0xf5a5, 0xf57c, 0xf578, 0xf5a7, 0xf57e, 0xf5a3, 0xf57a, 0xf5aa, 0xf577, 0xf5a1, 0xf5a6, 0xf5a8, 0xf5ab, 0xf579, 0xf5af, 0xf5b0, 0xf5a9, 0xf5ad, 0xf5a4, 0xf6c1, 0xf6c4, 0xc561, 0xf6c3, 0xf6c8, 0xf6c6, 0xc562, 0xf6bd, 0xf6b3, 0xf6b2, 0xc564, 0xf6bf, 0xf6c0, 0xf6bc, 0xf6b4, 0xf6b9, 0xf5ac, 0xf6b5, 0xc563, 0xf6bb, 0xf6ba, 0xf6b6, 0xf6c2, 0xf6b7, 0xf7bb, 0xf6c5, 0xf6c7, 0xf6be, 0xf6b8, 0xf7bc, 0xf7be, 0xf7b8, 0xc5c2, 0xf7c5, 0xf7c3, 0xc5c3, 0xf7c2, 0xf7c1, 0xf7ba, 0xf7b7, 0xf7bd, 0xf7c6, 0xf7b9, 0xf7bf, 0xf869, 0xf86e, 0xf864, 0xf867, 0xc5ee, 0xf86b, 0xf872, 0xf7c0, 0xf865, 0xf86f, 0xf873, 0xf86a, 0xf863, 0xf86d, 0xf86c, 0xf871, 0xf870, 0xf7c4, 0xf868, 0xf862, 0xf866, 0xc64e, 0xc64f, 0xf861, 0xf8e6, 0xf8dd, 0xf8e5, 0xf8e2, 0xf8e3, 0xf8dc, 0xf8df, 0xf8e7, 0xf8e1, 0xf8e0, 0xf8de, 0xf8e4, 0xf95d, 0xf95e, 0xf960, 0xf95f, 0xf962, 0xf961, 0xf97c, 0xf97b, 0xf9b7, 0xf9b8, 0xf9c5, 0xc678, 0xc67c, 0xf9cf, 0xc67d, 0xb3bf, 0xc4d0, 0xf6c9, 0xc650, 0xc651, 0xb3c0, 0xe0ee, 0xb9a8, 0xe8f0, 0xecb0, 0xecb1, 0xecaf, 0xefab, 0xefaa, 0xc247, 0xf1df, 0xefac, 0xf1de, 0xf3f3, 0xc451, 0xc453, 0xf3f2, 0xc452, 0xf5b1, 0xf5b3, 0xf5b2, 0xf6ca, 0xc565, 0xc5ef, 0xf8e8, 0xf963, 0xf9d2, 0xb3c1, 0xe4e5, 0xbea2, 0xecb3, 0xecb2, 0xefad, 0xc454, 0xc4d1, 0xf7c7, 0xf9cb, 0xb3c2, 0xbbf2, 0xbea3, 0xf3f4, 0xf874, 0xb6c0, 0xefae, 0xc664, 0xb6c1, 0xbea4, 0xc248, 0xf875, 0xb6c2, 0xe8f1, 0xc072, 0xecb4, 0xecb5, 0xc071, 0xefaf, 0xc24c, 0xc24a, 0xc24b, 0xc249, 0xf1e0, 0xc35c, 0xf5b5, 0xf5b4, 0xf5b7, 0xf5b6, 0xc4d2, 0xf6cb, 0xf6cd, 0xf6cc, 0xc566, 0xf7c8, 0xf876, 0xf877, 0xc5f0, 0xf964, 0xf97d, 0xc675, 0xdcb0, 0xecb6, 0xefb0, 0xf3f5, 0xe0ef, 0xefb1, 0xf1e2, 0xf1e1, 0xf878, 0xc652, 0xf965, 0xf97e, 0xb9a9, 0xe8f2, 0xe8f3, 0xecb7, 0xb9aa, 0xc35d, 0xf1e3, 0xf6cf, 0xc567, 0xf6d0, 0xf6ce, 0xf879, 0xf8e9, 0xb9ab, 0xefb4, 0xefb3, 0xefb2, 0xf1e4, 0xf1e8, 0xf1e7, 0xf1e6, 0xf1e5, 0xc35e, 0xf3f6, 0xf5b9, 0xc4d3, 0xf5b8, 0xf6d1, 0xf7cb, 0xf7ca, 0xc5c4, 0xf7c9, 0xf87c, 0xf87b, 0xf87a, 0xbbf3, 0xecb8, 0xc24d, 0xf3f7, 0xf3f8, 0xf7cc, 0xf87d, 0xf8ea, 0xf966, 0xf9b9, 0xf9d4, 0xbbf4, 0xc24e, 0xf1e9, 0xf3f9, 0xf6d2, 0xf87e, 0xbea6, 0xefb5, 0xf1ea, 0xf3fa, 0xf3fb, 0xf3fc, 0xf5be, 0xf5ba, 0xc568, 0xf5bd, 0xf5bc, 0xc4d4, 0xf5bb, 0xc4d6, 0xc4d5, 0xf6d4, 0xf6d3, 0xc569, 0xc56a, 0xc5c6, 0xf7cd, 0xc5c5, 0xf8a3, 0xf8a4, 0xf8a2, 0xf8a1, 0xc654, 0xf8eb, 0xf8ec, 0xf8ed, 0xc653, 0xf967, 0xf96a, 0xf969, 0xf968, 0xf9d3, 0xc073, 0xc365, 0xf5bf, 0xf6d5, 0xc5c7, 0xf7ce, 0xf9d5, 0xc074, 0xefb6, 0xf7cf, 0xf9a1, 0xc94a, 0xddfc, 0xa14a, 0xa157, 0xa159, 0xa15b, 0xa15f, 0xa160, 0xa163, 0xa164, 0xa167, 0xa168, 0xa16b, 0xa16c, 0xa16f, 0xa170, 0xa173, 0xa174, 0xa177, 0xa178, 0xa17b, 0xa17c, 0xa1c6, 0xa1c7, 0xa1ca, 0xa1cb, 0xa1c8, 0xa1c9, 0xa15c, 0xa14d, 0xa14f, 0xa151, 0xa152, 0xa153, 0xa154, 0xa17d, 0xa17e, 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a4, 0xa1cc, 0xa1cd, 0xa1ce, 0xa1de, 0xa1df, 0xa1e0, 0xa1e1, 0xa1e2, 0xa24c, 0xa24d, 0xa24e, 0xa149, 0xa1ad, 0xa243, 0xa248, 0xa1ae, 0xa15d, 0xa15e, 0xa1af, 0xa1cf, 0xa141, 0xa1d0, 0xa144, 0xa241, 0xa2af, 0xa2b0, 0xa2b1, 0xa2b2, 0xa2b3, 0xa2b4, 0xa2b5, 0xa2b6, 0xa2b7, 0xa2b8, 0xa147, 0xa146, 0xa1d5, 0xa1d7, 0xa1d6, 0xa148, 0xa249, 0xa2cf, 0xa2d0, 0xa2d1, 0xa2d2, 0xa2d3, 0xa2d4, 0xa2d5, 0xa2d6, 0xa2d7, 0xa2d8, 0xa2d9, 0xa2da, 0xa2db, 0xa2dc, 0xa2dd, 0xa2de, 0xa2df, 0xa2e0, 0xa2e1, 0xa2e2, 0xa2e3, 0xa2e4, 0xa2e5, 0xa2e6, 0xa2e7, 0xa2e8, 0xa242, 0xa1c4, 0xa2e9, 0xa2ea, 0xa2eb, 0xa2ec, 0xa2ed, 0xa2ee, 0xa2ef, 0xa2f0, 0xa2f1, 0xa2f2, 0xa2f3, 0xa2f4, 0xa2f5, 0xa2f6, 0xa2f7, 0xa2f8, 0xa2f9, 0xa2fa, 0xa2fb, 0xa2fc, 0xa2fd, 0xa2fe, 0xa340, 0xa341, 0xa342, 0xa343, 0xa161, 0xa155, 0xa162, 0xa14e, }; static const Summary16 big5_uni2indx_page00[16] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x00ac }, { 4, 0x0083 }, { 7, 0x0000 }, { 7, 0x0080 }, { 8, 0x0000 }, { 8, 0x0080 }, }; static const Summary16 big5_uni2indx_page02[38] = { /* 0x0200 */ { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0e80 }, { 13, 0x0200 }, { 14, 0x0000 }, { 14, 0x0000 }, /* 0x0300 */ { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0xfffe }, { 29, 0x03fb }, { 38, 0xfffe }, { 53, 0x03fb }, { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0000 }, /* 0x0400 */ { 62, 0x0002 }, { 63, 0x1ff0 }, { 72, 0xfff8 }, { 85, 0xffff }, { 101, 0xffff }, { 117, 0x0002 }, }; static const Summary16 big5_uni2indx_page20[44] = { /* 0x2000 */ { 118, 0x0000 }, { 118, 0x3318 }, { 124, 0x0064 }, { 127, 0x4824 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, /* 0x2100 */ { 131, 0x0228 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x03ff }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x03cf }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, /* 0x2200 */ { 152, 0x0000 }, { 152, 0xc400 }, { 155, 0x4e29 }, { 162, 0x1030 }, { 165, 0x0000 }, { 165, 0x0004 }, { 166, 0x00c3 }, { 170, 0x0000 }, { 170, 0x0000 }, { 170, 0x0000 }, { 170, 0x0020 }, { 171, 0x8000 }, }; static const Summary16 big5_uni2indx_page24[37] = { /* 0x2400 */ { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x03ff }, { 182, 0x3ff0 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, /* 0x2500 */ { 192, 0x1005 }, { 195, 0x1111 }, { 199, 0x1010 }, { 201, 0x1010 }, { 203, 0x0000 }, { 203, 0x4001 }, { 205, 0xe402 }, { 210, 0x000f }, { 214, 0xfffe }, { 229, 0x0030 }, { 231, 0x0003 }, { 233, 0x300c }, { 237, 0xc8c0 }, { 242, 0x0000 }, { 242, 0x003c }, { 246, 0x0000 }, /* 0x2600 */ { 246, 0x0260 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0007 }, }; static const Summary16 big5_uni2indx_page30[62] = { /* 0x3000 */ { 252, 0xff2f }, { 265, 0x6037 }, { 272, 0x03fe }, { 281, 0x0000 }, { 281, 0xfffe }, { 296, 0xffff }, { 312, 0xffff }, { 328, 0xffff }, { 344, 0xffff }, { 360, 0x600f }, { 366, 0xfffe }, { 381, 0xffff }, { 397, 0xffff }, { 413, 0xffff }, { 429, 0xffff }, { 445, 0x407f }, /* 0x3100 */ { 453, 0xffe0 }, { 464, 0xffff }, { 480, 0x03ff }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, /* 0x3200 */ { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0008 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, /* 0x3300 */ { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0xc000 }, { 493, 0x7000 }, { 496, 0x0002 }, { 497, 0x0000 }, { 497, 0x4010 }, { 499, 0x0026 }, }; static const Summary16 big5_uni2indx_page4e[1307] = { /* 0x4e00 */ { 502, 0xff8b }, { 514, 0xc373 }, { 523, 0x6840 }, { 527, 0x1b0f }, { 535, 0xe9ac }, { 544, 0xf34c }, { 553, 0x0200 }, { 554, 0xc008 }, { 557, 0x795c }, { 566, 0xca3e }, { 575, 0x7976 }, { 585, 0x0648 }, { 589, 0x2fdf }, { 601, 0xf7f0 }, { 612, 0x033a }, { 618, 0xa8ff }, /* 0x4f00 */ { 629, 0xef37 }, { 641, 0x233f }, { 650, 0xb004 }, { 654, 0xfd59 }, { 665, 0xf3ca }, { 675, 0xffff }, { 691, 0xde9f }, { 703, 0xfff9 }, { 717, 0xabff }, { 730, 0x7df7 }, { 743, 0xc000 }, { 745, 0x8eec }, { 754, 0xeebf }, { 767, 0xffdb }, { 781, 0xd003 }, { 786, 0x45fa }, /* 0x5000 */ { 795, 0xfae1 }, { 805, 0xdffe }, { 819, 0xbfef }, { 833, 0x10ab }, { 839, 0xffeb }, { 853, 0xfcaa }, { 863, 0xef3f }, { 876, 0x24fd }, { 885, 0x78ad }, { 894, 0x7f76 }, { 906, 0xf00c }, { 912, 0xedff }, { 926, 0xcff6 }, { 938, 0x2cfa }, { 947, 0xf7f9 }, { 960, 0xeb6b }, /* 0x5100 */ { 971, 0x1ffd }, { 983, 0x95bf }, { 994, 0x6677 }, { 1004, 0xbfbf }, { 1018, 0x3bfb }, { 1030, 0xfeb4 }, { 1041, 0x7bae }, { 1052, 0x11e2 }, { 1058, 0xa681 }, { 1064, 0x41be }, { 1072, 0x1435 }, { 1078, 0x72c3 }, { 1086, 0x7d70 }, { 1095, 0x7191 }, { 1102, 0x0003 }, { 1104, 0x276b }, /* 0x5200 */ { 1113, 0x57cb }, { 1123, 0x70cf }, { 1132, 0x4732 }, { 1139, 0x0def }, { 1149, 0x7eda }, { 1160, 0xfc74 }, { 1170, 0xfe06 }, { 1179, 0xbdb4 }, { 1189, 0x3f9f }, { 1201, 0x8bca }, { 1209, 0x7e49 }, { 1218, 0x5800 }, { 1221, 0x228f }, { 1228, 0xebec }, { 1239, 0x8a5c }, { 1246, 0xddbb }, /* 0x5300 */ { 1258, 0xef60 }, { 1267, 0xb6e7 }, { 1278, 0xa40f }, { 1285, 0xf293 }, { 1294, 0x37bb }, { 1305, 0x549e }, { 1313, 0xd04b }, { 1320, 0x9baf }, { 1331, 0xc414 }, { 1336, 0xf7d4 }, { 1347, 0x30b0 }, { 1352, 0x0a14 }, { 1356, 0x2f08 }, { 1362, 0x88d0 }, { 1367, 0xff7e }, { 1381, 0x192f }, /* 0x5400 */ { 1389, 0xffda }, { 1402, 0xfb07 }, { 1412, 0x7ff1 }, { 1424, 0x7beb }, { 1436, 0xc5ef }, { 1447, 0x0010 }, { 1448, 0x99ff }, { 1460, 0xfdff }, { 1475, 0x79d7 }, { 1486, 0x0567 }, { 1493, 0xffe7 }, { 1507, 0xfdcb }, { 1519, 0xc3ff }, { 1531, 0x4040 }, { 1533, 0x6ff7 }, { 1546, 0xbd8e }, /* 0x5500 */ { 1556, 0xdffa }, { 1569, 0x0497 }, { 1575, 0xf4c0 }, { 1582, 0x5bff }, { 1595, 0xed7b }, { 1607, 0xd0e7 }, { 1616, 0x047e }, { 1623, 0xf8e0 }, { 1631, 0xff9f }, { 1645, 0xb73e }, { 1656, 0x7dfe }, { 1669, 0x882e }, { 1675, 0xfffd }, { 1690, 0xbe7f }, { 1703, 0x83fe }, { 1713, 0xf6c4 }, /* 0x5600 */ { 1722, 0xf357 }, { 1733, 0xb8fd }, { 1744, 0xd680 }, { 1750, 0xef7d }, { 1763, 0x5767 }, { 1773, 0x4788 }, { 1779, 0xff7d }, { 1793, 0xc3df }, { 1804, 0xf0ff }, { 1816, 0x37a9 }, { 1825, 0x7de0 }, { 1834, 0x70fc }, { 1843, 0x3f6f }, { 1855, 0xec9a }, { 1864, 0x4cb3 }, { 1872, 0x8681 }, /* 0x5700 */ { 1877, 0x3f9e }, { 1888, 0xdd5c }, { 1898, 0xf70d }, { 1908, 0x4819 }, { 1913, 0xfea3 }, { 1924, 0x0007 }, { 1927, 0xaf56 }, { 1937, 0x38ff }, { 1948, 0x980d }, { 1954, 0xefb8 }, { 1965, 0x403d }, { 1971, 0xb760 }, { 1979, 0xd8ce }, { 1988, 0x9035 }, { 1994, 0x72bf }, { 2005, 0x3fff }, /* 0x5800 */ { 2019, 0x7ff7 }, { 2033, 0x7a11 }, { 2040, 0xf7bb }, { 2053, 0xabff }, { 2066, 0xff00 }, { 2074, 0x6fbe }, { 2086, 0xa93c }, { 2094, 0xfe72 }, { 2105, 0xcfef }, { 2118, 0xf11b }, { 2127, 0xdb6b }, { 2138, 0xf40a }, { 2145, 0xc3e6 }, { 2154, 0xef7e }, { 2167, 0x9b9c }, { 2176, 0xf610 }, /* 0x5900 */ { 2183, 0xf048 }, { 2189, 0x16f4 }, { 2197, 0xfeb5 }, { 2209, 0x5182 }, { 2214, 0xc7b1 }, { 2223, 0x15bb }, { 2232, 0x6e87 }, { 2241, 0xfbdf }, { 2255, 0xe43f }, { 2265, 0x63cd }, { 2274, 0xc1ff }, { 2285, 0x7e7e }, { 2297, 0xfdeb }, { 2310, 0x7d5f }, { 2322, 0x777b }, { 2334, 0xfcfe }, /* 0x5a00 */ { 2347, 0x960b }, { 2354, 0xdbea }, { 2365, 0x6229 }, { 2371, 0x53e8 }, { 2379, 0x37df }, { 2391, 0xfdef }, { 2405, 0x36f5 }, { 2415, 0xbd81 }, { 2423, 0xdc18 }, { 2430, 0xfcbd }, { 2442, 0xd2e4 }, { 2450, 0xffff }, { 2466, 0x3fd7 }, { 2478, 0xffe0 }, { 2489, 0x7f6f }, { 2502, 0xabf8 }, /* 0x5b00 */ { 2512, 0x9bae }, { 2522, 0x6ed9 }, { 2532, 0xf5fb }, { 2545, 0xf115 }, { 2553, 0x79a9 }, { 2562, 0xbdfb }, { 2575, 0x5a3c }, { 2583, 0xadaf }, { 2594, 0xdbba }, { 2605, 0x1fac }, { 2614, 0x71fc }, { 2624, 0x8379 }, { 2632, 0x7cf7 }, { 2644, 0xc35f }, { 2654, 0xdfff }, { 2669, 0x0567 }, /* 0x5c00 */ { 2676, 0xff9a }, { 2688, 0x8467 }, { 2695, 0x1534 }, { 2701, 0xdf8b }, { 2712, 0xf9f3 }, { 2724, 0x3373 }, { 2733, 0xf7bd }, { 2746, 0x5e1a }, { 2754, 0xbf40 }, { 2762, 0xa03f }, { 2770, 0xffff }, { 2786, 0x01eb }, { 2793, 0xdfc0 }, { 2802, 0xcfdd }, { 2814, 0x7500 }, { 2819, 0xabd3 }, /* 0x5d00 */ { 2829, 0xf8c3 }, { 2838, 0xeed6 }, { 2849, 0x43fd }, { 2859, 0xb7ff }, { 2873, 0x5eaf }, { 2884, 0x4227 }, { 2890, 0x9bac }, { 2899, 0xf686 }, { 2908, 0x27d7 }, { 2918, 0xf6bc }, { 2929, 0xf787 }, { 2940, 0x35b7 }, { 2950, 0xaacd }, { 2959, 0xe176 }, { 2968, 0x49e7 }, { 2977, 0xe29f }, /* 0x5e00 */ { 2987, 0x545c }, { 2994, 0xaff2 }, { 3005, 0x2b3f }, { 3015, 0x61d8 }, { 3022, 0xfc3b }, { 3033, 0xbbb8 }, { 3043, 0xffcf }, { 3057, 0x7b7d }, { 3069, 0xbf95 }, { 3080, 0x1ce0 }, { 3086, 0x7dfd }, { 3099, 0x43ff }, { 3110, 0x5ff6 }, { 3122, 0xfffe }, { 3137, 0xd3ef }, { 3149, 0xc4ce }, /* 0x5f00 */ { 3157, 0x8db6 }, { 3166, 0xadbc }, { 3176, 0x63dc }, { 3185, 0x11eb }, { 3193, 0xdf59 }, { 3204, 0x23d0 }, { 3210, 0xbeb4 }, { 3220, 0xf3db }, { 3232, 0x1fe7 }, { 3243, 0xdbc7 }, { 3254, 0xff63 }, { 3266, 0xfae4 }, { 3276, 0xb22b }, { 3284, 0x63f7 }, { 3295, 0xed3b }, { 3306, 0xadba }, /* 0x6000 */ { 3316, 0xfe01 }, { 3324, 0x7eff }, { 3338, 0xfff7 }, { 3353, 0x02bc }, { 3359, 0x32ff }, { 3370, 0xef39 }, { 3381, 0xfffc }, { 3395, 0x8005 }, { 3398, 0x77fb }, { 3411, 0xbcf5 }, { 3422, 0x010d }, { 3426, 0xfff7 }, { 3441, 0xfffb }, { 3456, 0xbf3a }, { 3467, 0x0057 }, { 3472, 0xdfff }, /* 0x6100 */ { 3487, 0xef7b }, { 3500, 0xbd7d }, { 3512, 0xdb88 }, { 3520, 0xc8d4 }, { 3527, 0xfff3 }, { 3541, 0xed7c }, { 3552, 0x5dee }, { 3563, 0x56ff }, { 3575, 0x7e0d }, { 3584, 0xac5f }, { 3594, 0xff96 }, { 3606, 0xd57f }, { 3618, 0x3fee }, { 3630, 0xc140 }, { 3634, 0x6ff9 }, { 3646, 0xffe7 }, /* 0x6200 */ { 3660, 0x779b }, { 3671, 0x8e77 }, { 3681, 0x6ebf }, { 3693, 0xe45d }, { 3702, 0x6fcf }, { 3714, 0x5f1f }, { 3725, 0xe07f }, { 3735, 0xfedf }, { 3749, 0xd7db }, { 3761, 0x01fe }, { 3769, 0xff00 }, { 3777, 0xfb7b }, { 3790, 0xffd4 }, { 3802, 0x1fdf }, { 3814, 0xf800 }, { 3819, 0xffff }, /* 0x6300 */ { 3835, 0xfb8f }, { 3847, 0x007b }, { 3853, 0xbf00 }, { 3860, 0x7f5c }, { 3871, 0xffff }, { 3887, 0x07f3 }, { 3896, 0xeba0 }, { 3904, 0x3de7 }, { 3915, 0xf7bf }, { 3929, 0xfbd7 }, { 3942, 0xffbf }, { 3957, 0x6003 }, { 3961, 0xfffd }, { 3976, 0xbfed }, { 3989, 0xefbb }, { 4002, 0x027f }, /* 0x6400 */ { 4010, 0xfe40 }, { 4018, 0xddfd }, { 4031, 0xfdff }, { 4046, 0xe2f9 }, { 4056, 0x680b }, { 4062, 0xfb1f }, { 4074, 0xfbe3 }, { 4086, 0xaffd }, { 4099, 0x9fa4 }, { 4108, 0xf7ed }, { 4121, 0x7a7d }, { 4132, 0xf80f }, { 4141, 0xeebe }, { 4153, 0x0fd5 }, { 4162, 0xbb5d }, { 4173, 0xfd9f }, /* 0x6500 */ { 4186, 0xf2db }, { 4197, 0x3bf9 }, { 4208, 0xfe7f }, { 4222, 0xebcc }, { 4232, 0x876a }, { 4240, 0x73fa }, { 4251, 0x95fc }, { 4261, 0x9ffc }, { 4273, 0x109f }, { 4280, 0xfaf7 }, { 4293, 0xddb7 }, { 4305, 0xbbcd }, { 4316, 0xf87e }, { 4327, 0xeccd }, { 4337, 0xf366 }, { 4347, 0x3c3f }, /* 0x6600 */ { 4357, 0xfffd }, { 4372, 0xb03f }, { 4381, 0xe9f7 }, { 4393, 0x067e }, { 4401, 0x96ae }, { 4410, 0xfe06 }, { 4419, 0xd576 }, { 4429, 0x5fd7 }, { 4441, 0x3fd1 }, { 4451, 0xa3f3 }, { 4461, 0xcf07 }, { 4470, 0x6fb7 }, { 4482, 0x9fd1 }, { 4492, 0x7f44 }, { 4501, 0x7b59 }, { 4511, 0xd3dd }, /* 0x6700 */ { 4522, 0xaf3b }, { 4533, 0xa9bd }, { 4543, 0x7dcf }, { 4555, 0xff3a }, { 4567, 0xfbe0 }, { 4577, 0xf6eb }, { 4589, 0xb401 }, { 4594, 0xffff }, { 4610, 0x7afa }, { 4621, 0xb7bf }, { 4634, 0xc000 }, { 4636, 0x0ffd }, { 4647, 0xff7f }, { 4662, 0xff1f }, { 4675, 0xfefc }, { 4688, 0x95ff }, /* 0x6800 */ { 4700, 0x0000 }, { 4700, 0xb5dc }, { 4710, 0xef63 }, { 4721, 0x3f3e }, { 4732, 0xfb7f }, { 4746, 0x001b }, { 4750, 0xe800 }, { 4754, 0xfbf6 }, { 4767, 0x9eef }, { 4779, 0xb8df }, { 4790, 0xff9f }, { 4804, 0x003f }, { 4810, 0x7bd0 }, { 4819, 0xf5ff }, { 4833, 0xdfdb }, { 4846, 0x3fff }, /* 0x6900 */ { 4860, 0xfdf0 }, { 4871, 0x00bf }, { 4878, 0x8420 }, { 4881, 0xbbbd }, { 4893, 0xdf37 }, { 4905, 0xffde }, { 4919, 0xff6d }, { 4932, 0x0ff3 }, { 4942, 0x604c }, { 4947, 0x5efb }, { 4959, 0xfffb }, { 4974, 0xfafb }, { 4987, 0xfe5e }, { 4999, 0x0219 }, { 5003, 0x79f4 }, { 5013, 0xf9de }, /* 0x6a00 */ { 5025, 0xa7f7 }, { 5037, 0xebfa }, { 5049, 0x01eb }, { 5056, 0xff34 }, { 5067, 0xebd3 }, { 5078, 0xef73 }, { 5090, 0xafd7 }, { 5102, 0xc040 }, { 5105, 0x72bb }, { 5115, 0xdcff }, { 5128, 0xf17f }, { 5140, 0x2fd8 }, { 5149, 0xb8ec }, { 5158, 0xfe0b }, { 5168, 0xdda3 }, { 5178, 0x1f0b }, /* 0x6b00 */ { 5186, 0x8f1d }, { 5195, 0x47cf }, { 5205, 0xb12b }, { 5213, 0xffde }, { 5227, 0x7fee }, { 5240, 0xda73 }, { 5250, 0x24ff }, { 5260, 0xcbc4 }, { 5268, 0xf75d }, { 5280, 0xcbf2 }, { 5290, 0xecfd }, { 5302, 0xb4ed }, { 5312, 0xbff9 }, { 5325, 0x4ddd }, { 5335, 0x99dd }, { 5345, 0xfb8d }, /* 0x6c00 */ { 5356, 0xbb7f }, { 5369, 0xaf7b }, { 5381, 0xddfb }, { 5394, 0xc959 }, { 5402, 0xfc4f }, { 5413, 0xfab5 }, { 5424, 0xafe3 }, { 5435, 0x6d5f }, { 5446, 0xffff }, { 5462, 0x3f7d }, { 5474, 0x7800 }, { 5478, 0xffdb }, { 5492, 0xb6ff }, { 5505, 0x7eff }, { 5519, 0xfbaf }, { 5532, 0x022f }, /* 0x6d00 */ { 5538, 0xff9b }, { 5551, 0xefc7 }, { 5563, 0xffa5 }, { 5575, 0xffff }, { 5591, 0x0007 }, { 5594, 0xc700 }, { 5599, 0xf7ff }, { 5614, 0xfff1 }, { 5627, 0x7ffd }, { 5641, 0x01bf }, { 5649, 0xdc00 }, { 5654, 0xfdbc }, { 5666, 0xbff5 }, { 5679, 0xffff }, { 5695, 0xff7f }, { 5710, 0x3eff }, /* 0x6e00 */ { 5723, 0x0029 }, { 5726, 0xbe00 }, { 5732, 0xf9ff }, { 5746, 0xff7f }, { 5761, 0x6efb }, { 5773, 0xfd7e }, { 5786, 0xcbff }, { 5799, 0x039e }, { 5806, 0xe300 }, { 5811, 0xfbdd }, { 5824, 0xccff }, { 5836, 0xf6df }, { 5849, 0xffff }, { 5865, 0x117f }, { 5874, 0xf800 }, { 5879, 0xfbf6 }, /* 0x6f00 */ { 5892, 0xe7ef }, { 5905, 0xd73c }, { 5915, 0xfeef }, { 5929, 0xdfef }, { 5943, 0xc00b }, { 5948, 0xedbf }, { 5961, 0xfedf }, { 5975, 0xfdcd }, { 5987, 0x7bf5 }, { 5999, 0x40fd }, { 6007, 0xffff }, { 6023, 0xb75f }, { 6035, 0xffdf }, { 6050, 0xf930 }, { 6058, 0xfbdf }, { 6072, 0xdc97 }, /* 0x7000 */ { 6082, 0xfef3 }, { 6095, 0xbff2 }, { 6107, 0x8fdf }, { 6119, 0xdfbf }, { 6133, 0x177f }, { 6144, 0xede6 }, { 6155, 0x0f7f }, { 6166, 0x3553 }, { 6174, 0x447c }, { 6181, 0x877e }, { 6191, 0xfa12 }, { 6199, 0x45bb }, { 6208, 0xede0 }, { 6217, 0x779e }, { 6228, 0x8017 }, { 6233, 0xbfd9 }, /* 0x7100 */ { 6245, 0x7e55 }, { 6255, 0xde89 }, { 6264, 0xc16f }, { 6273, 0x0447 }, { 6278, 0x7ade }, { 6289, 0xf75d }, { 6301, 0x57ff }, { 6314, 0x2905 }, { 6319, 0x86f7 }, { 6329, 0xfe95 }, { 6340, 0x97b3 }, { 6350, 0xf32f }, { 6361, 0xcfff }, { 6375, 0x9f75 }, { 6386, 0x71f7 }, { 6397, 0xfb17 }, /* 0x7200 */ { 6408, 0x34ee }, { 6417, 0xee19 }, { 6426, 0x37cc }, { 6435, 0xef61 }, { 6445, 0x9fd6 }, { 6456, 0xef4c }, { 6466, 0xd68f }, { 6476, 0xfbdd }, { 6489, 0x7b73 }, { 6500, 0x6def }, { 6512, 0xd7fe }, { 6525, 0xa431 }, { 6531, 0x5e7f }, { 6543, 0x97d7 }, { 6554, 0x0f5b }, { 6563, 0xffd8 }, /* 0x7300 */ { 6575, 0x9d83 }, { 6583, 0x7bce }, { 6594, 0x22ec }, { 6601, 0xdcff }, { 6614, 0x763d }, { 6624, 0xef87 }, { 6635, 0xdfe7 }, { 6648, 0xfded }, { 6661, 0x4fff }, { 6674, 0xa0fc }, { 6682, 0x3b77 }, { 6693, 0xdbfc }, { 6705, 0x3ded }, { 6716, 0x7fdc }, { 6728, 0x6fa9 }, { 6738, 0xf570 }, /* 0x7400 */ { 6747, 0x3ffb }, { 6760, 0x2c40 }, { 6764, 0xff7f }, { 6779, 0x847f }, { 6788, 0xec57 }, { 6798, 0xdeb7 }, { 6810, 0xe69c }, { 6819, 0xf22f }, { 6829, 0x0feb }, { 6839, 0xd5b5 }, { 6849, 0xafeb }, { 6861, 0xede7 }, { 6873, 0x8c2f }, { 6881, 0xfff0 }, { 6893, 0x537f }, { 6904, 0xe8f0 }, /* 0x7500 */ { 6912, 0xb99d }, { 6922, 0xb5ff }, { 6935, 0xff66 }, { 6947, 0xe78f }, { 6958, 0xd981 }, { 6965, 0xbe10 }, { 6972, 0x9c7c }, { 6981, 0xe3c1 }, { 6989, 0x9cd1 }, { 6997, 0x2733 }, { 7005, 0x0cbc }, { 7012, 0xff6d }, { 7025, 0xfcb7 }, { 7037, 0xefb7 }, { 7050, 0xa0df }, { 7059, 0xffff }, /* 0x7600 */ { 7075, 0xbf0b }, { 7085, 0xfe7b }, { 7098, 0xa3ff }, { 7110, 0x353f }, { 7120, 0x13cc }, { 7127, 0x97cd }, { 7137, 0x7637 }, { 7147, 0xfb27 }, { 7158, 0xcfd6 }, { 7169, 0x7e6c }, { 7179, 0xec50 }, { 7186, 0xed31 }, { 7195, 0x677c }, { 7205, 0xfc1c }, { 7214, 0xf6fa }, { 7226, 0x5fbf }, /* 0x7700 */ { 7239, 0x0fba }, { 7248, 0xae2f }, { 7258, 0xa3ad }, { 7267, 0x7ffe }, { 7281, 0xfcf0 }, { 7291, 0xde74 }, { 7301, 0xffef }, { 7316, 0xf200 }, { 7321, 0xfbbf }, { 7335, 0xfea2 }, { 7345, 0x3daf }, { 7356, 0xbcff }, { 7369, 0xf694 }, { 7378, 0x5fb9 }, { 7389, 0xf3ad }, { 7400, 0x3f8f }, /* 0x7800 */ { 7411, 0xf26c }, { 7420, 0xa01f }, { 7427, 0xffef }, { 7442, 0x01bf }, { 7450, 0x7728 }, { 7458, 0x7005 }, { 7463, 0xff35 }, { 7475, 0xda03 }, { 7482, 0xd2f9 }, { 7492, 0xc7fa }, { 7503, 0x3fbf }, { 7516, 0x5c1d }, { 7524, 0xff3a }, { 7536, 0xec33 }, { 7545, 0xb7af }, { 7557, 0xfe9c }, /* 0x7900 */ { 7568, 0x5236 }, { 7575, 0x7a9f }, { 7586, 0xbffa }, { 7599, 0xe722 }, { 7607, 0x9ff7 }, { 7620, 0xfcff }, { 7634, 0x2fbb }, { 7645, 0xb61d }, { 7654, 0xed06 }, { 7662, 0x1dfd }, { 7673, 0x7dd7 }, { 7685, 0xefdf }, { 7699, 0xeb23 }, { 7708, 0xf166 }, { 7717, 0x7ed9 }, { 7728, 0x0dc0 }, /* 0x7a00 */ { 7733, 0x3d3d }, { 7743, 0xdfbf }, { 7757, 0xc945 }, { 7764, 0xba83 }, { 7772, 0x7dd1 }, { 7782, 0x9dd0 }, { 7790, 0x7b87 }, { 7800, 0xcf73 }, { 7811, 0x9ff3 }, { 7823, 0xc3f5 }, { 7833, 0xdf0d }, { 7843, 0xc5fe }, { 7854, 0x0cb3 }, { 7861, 0x8302 }, { 7865, 0xe879 }, { 7874, 0xaec0 }, /* 0x7b00 */ { 7881, 0xc773 }, { 7891, 0x6f0f }, { 7901, 0xfd7d }, { 7914, 0x093f }, { 7922, 0xfff1 }, { 7935, 0x0157 }, { 7941, 0x62fb }, { 7951, 0x01ff }, { 7960, 0xfdb4 }, { 7971, 0x3bf3 }, { 7982, 0xb013 }, { 7988, 0x43b2 }, { 7995, 0x5ed3 }, { 8005, 0xff30 }, { 8015, 0x0fff }, { 8027, 0xeb9f }, /* 0x7c00 */ { 8039, 0xfeef }, { 8053, 0xf203 }, { 8060, 0x3fef }, { 8073, 0xfb89 }, { 8083, 0x37a9 }, { 8092, 0x9e99 }, { 8101, 0xdef9 }, { 8113, 0xa72c }, { 8121, 0x3733 }, { 8130, 0xc1f6 }, { 8139, 0x812e }, { 8145, 0xfe3e }, { 8157, 0x5d20 }, { 8163, 0xf2f7 }, { 8175, 0xd585 }, { 8183, 0x69d7 }, /* 0x7d00 */ { 8193, 0xffff }, { 8209, 0xffff }, { 8225, 0xdb07 }, { 8234, 0xff6f }, { 8248, 0xc4ff }, { 8259, 0xd97f }, { 8271, 0xefce }, { 8283, 0xbe0f }, { 8293, 0xf17b }, { 8304, 0xf05e }, { 8313, 0xf6cf }, { 8325, 0xffb7 }, { 8339, 0x5ef7 }, { 8351, 0xef84 }, { 8360, 0xd7cb }, { 8371, 0x0edf }, /* 0x7e00 */ { 8381, 0xff08 }, { 8390, 0xfcff }, { 8404, 0xee3f }, { 8416, 0xffff }, { 8432, 0x13ff }, { 8443, 0xd7ff }, { 8457, 0xaf0f }, { 8467, 0x7ffd }, { 8481, 0xbdc7 }, { 8492, 0x1ffa }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, /* 0x7f00 */ { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0xe740 }, { 8510, 0xbd38 }, { 8519, 0xf933 }, { 8529, 0x7feb }, { 8542, 0xfeed }, { 8555, 0x7fe8 }, { 8566, 0x7c76 }, { 8576, 0xb3f7 }, { 8588, 0xffef }, { 8603, 0xfeaf }, { 8616, 0xd8b7 }, { 8626, 0xff6f }, { 8640, 0xfbbf }, /* 0x8000 */ { 8654, 0xf8fb }, { 8666, 0xdbf7 }, { 8679, 0x1752 }, { 8686, 0xe2f9 }, { 8696, 0x85c8 }, { 8702, 0x7547 }, { 8711, 0x9090 }, { 8715, 0xe3ef }, { 8727, 0x9ef4 }, { 8737, 0x3f6d }, { 8748, 0xee2e }, { 8758, 0x0536 }, { 8764, 0xf7bc }, { 8776, 0x7ff3 }, { 8789, 0xa07b }, { 8797, 0x7f3f }, /* 0x8100 */ { 8810, 0x0567 }, { 8817, 0xeb60 }, { 8825, 0xbabe }, { 8836, 0x6601 }, { 8841, 0xfcd8 }, { 8851, 0x583f }, { 8860, 0xcaf7 }, { 8871, 0x87df }, { 8882, 0xbfcd }, { 8894, 0xffa0 }, { 8904, 0x5bcd }, { 8914, 0xfebf }, { 8928, 0xb6fd }, { 8940, 0xefa7 }, { 8952, 0x77ef }, { 8965, 0xdf9c }, /* 0x8200 */ { 8976, 0x3fb7 }, { 8988, 0xf877 }, { 8999, 0x9d27 }, { 9008, 0xb7fc }, { 9020, 0xcab5 }, { 9029, 0xdfef }, { 9043, 0xfb5a }, { 9054, 0xf1b6 }, { 9064, 0xec39 }, { 9073, 0xef1f }, { 9085, 0xfbbf }, { 9099, 0x7ffb }, { 9113, 0x000d }, { 9116, 0xdafe }, { 9128, 0xbdfb }, { 9141, 0x4e7f }, /* 0x8300 */ { 9152, 0x33ff }, { 9164, 0x5ac0 }, { 9170, 0xbff5 }, { 9183, 0x9ffe }, { 9196, 0xffbf }, { 9211, 0x005f }, { 9217, 0x0000 }, { 9217, 0xfdf8 }, { 9229, 0xffca }, { 9241, 0x6ffd }, { 9254, 0xcffd }, { 9267, 0xa001 }, { 9270, 0xdfff }, { 9285, 0xfbf2 }, { 9297, 0xdfbf }, { 9311, 0xff7f }, /* 0x8400 */ { 9326, 0xfeda }, { 9338, 0x080f }, { 9343, 0xba08 }, { 9349, 0xbfff }, { 9364, 0x7afd }, { 9376, 0xeed7 }, { 9388, 0xfbeb }, { 9401, 0x67f9 }, { 9412, 0xe044 }, { 9417, 0xff93 }, { 9429, 0xdf97 }, { 9441, 0x9f57 }, { 9452, 0xfef7 }, { 9466, 0x08df }, { 9474, 0xdf80 }, { 9482, 0xfedf }, /* 0x8500 */ { 9496, 0xffc5 }, { 9508, 0xf7fe }, { 9522, 0xfffb }, { 9537, 0x6803 }, { 9542, 0x67fb }, { 9554, 0x6bfa }, { 9565, 0x7fff }, { 9580, 0x5fe2 }, { 9590, 0xffff }, { 9606, 0xff73 }, { 9619, 0x87df }, { 9630, 0xe7fb }, { 9643, 0xebfd }, { 9656, 0xf7a7 }, { 9668, 0xbf7e }, { 9681, 0xefc7 }, /* 0x8600 */ { 9693, 0x1ef3 }, { 9703, 0xdf82 }, { 9712, 0x76ff }, { 9725, 0xdf7e }, { 9738, 0x79c9 }, { 9747, 0xda7d }, { 9758, 0xefbe }, { 9771, 0x1e9b }, { 9780, 0x7ce0 }, { 9788, 0x77fb }, { 9801, 0x87be }, { 9811, 0xfffb }, { 9826, 0x1bff }, { 9838, 0xffdb }, { 9852, 0x3f5c }, { 9862, 0x4fe0 }, /* 0x8700 */ { 9870, 0x7fff }, { 9885, 0x5f0e }, { 9894, 0x77ff }, { 9908, 0xddbf }, { 9921, 0xf04f }, { 9930, 0xffff }, { 9946, 0xffff }, { 9962, 0x0ff8 }, { 9971, 0xa3be }, { 9981, 0xfddf }, { 9995, 0xfc1c }, { 10004, 0xfffd }, { 10019, 0x1f7d }, { 10030, 0xfb9e }, { 10042, 0xbdff }, { 10056, 0xdedc }, /* 0x8800 */ { 10067, 0x3f6f }, { 10079, 0xbafb }, { 10091, 0xdf7f }, { 10105, 0xfbef }, { 10119, 0x7d1b }, { 10129, 0x2eec }, { 10138, 0xaf8e }, { 10148, 0xf2f7 }, { 10160, 0x7b0f }, { 10170, 0xcfee }, { 10182, 0x1d96 }, { 10190, 0x77c6 }, { 10200, 0x7e07 }, { 10209, 0xfff5 }, { 10223, 0xd982 }, { 10230, 0x7fdf }, /* 0x8900 */ { 10244, 0x5ee6 }, { 10254, 0xc7ff }, { 10267, 0xfeee }, { 10280, 0x79ef }, { 10292, 0x9a56 }, { 10300, 0xffcf }, { 10314, 0xfe5f }, { 10327, 0xde5e }, { 10338, 0x896e }, { 10346, 0xf9e8 }, { 10356, 0xf45e }, { 10366, 0xe6c4 }, { 10374, 0x0001 }, { 10375, 0xbe7c }, { 10386, 0x3b7f }, { 10398, 0xdddf }, /* 0x8a00 */ { 10411, 0xd59d }, { 10421, 0xe9ef }, { 10433, 0x34ac }, { 10440, 0xde53 }, { 10450, 0xf573 }, { 10461, 0x4bf7 }, { 10472, 0x7b4f }, { 10483, 0x9eff }, { 10496, 0xb8fe }, { 10507, 0x476e }, { 10516, 0x0dfb }, { 10526, 0xff45 }, { 10537, 0xabfd }, { 10549, 0xfbfe }, { 10563, 0xe9d7 }, { 10574, 0xddff }, /* 0x8b00 */ { 10588, 0xedf7 }, { 10601, 0x7fff }, { 10616, 0xddfd }, { 10629, 0x7eeb }, { 10641, 0xcfe7 }, { 10653, 0xb7ff }, { 10667, 0xbde9 }, { 10678, 0xef91 }, { 10688, 0x5d75 }, { 10698, 0xd77c }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, /* 0x8c00 */ { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0xfa80 }, { 10716, 0xffee }, { 10730, 0xb4f1 }, { 10739, 0xbf76 }, { 10751, 0x2fef }, { 10763, 0xb677 }, { 10774, 0x77bf }, { 10787, 0x9fbf }, { 10800, 0xfffd }, { 10815, 0x95bf }, { 10826, 0xf6ae }, { 10837, 0x75ff }, { 10850, 0x7f3b }, /* 0x8d00 */ { 10862, 0xa7f5 }, { 10873, 0x0af9 }, { 10881, 0x0000 }, { 10881, 0x0000 }, { 10881, 0x0000 }, { 10881, 0x0000 }, { 10881, 0xfbd0 }, { 10891, 0x2bdd }, { 10901, 0xf633 }, { 10911, 0x9a7f }, { 10922, 0xfdab }, { 10934, 0xd6fc }, { 10945, 0xf9e6 }, { 10956, 0xbfeb }, { 10969, 0xdfdf }, { 10983, 0xf41f }, /* 0x8e00 */ { 10993, 0xa6fd }, { 11004, 0xffff }, { 11020, 0x4aff }, { 11031, 0xf37b }, { 11043, 0x7fb7 }, { 11056, 0xfef9 }, { 11069, 0xb6ff }, { 11082, 0x1d5c }, { 11090, 0x7ff6 }, { 11103, 0xe5ff }, { 11116, 0x1f7b }, { 11127, 0x2404 }, { 11130, 0xbe05 }, { 11138, 0xf99e }, { 11149, 0xdbe3 }, { 11160, 0xdff2 }, /* 0x8f00 */ { 11172, 0x6fef }, { 11185, 0xfdff }, { 11200, 0xd679 }, { 11210, 0xcbfc }, { 11221, 0xebfd }, { 11234, 0xefff }, { 11249, 0x001f }, { 11254, 0x0000 }, { 11254, 0x0000 }, { 11254, 0x9800 }, { 11257, 0xe148 }, { 11263, 0x8017 }, { 11268, 0x6a74 }, { 11276, 0x00fe }, { 11283, 0x6d7f }, { 11295, 0xfdf1 }, /* 0x9000 */ { 11307, 0xb87f }, { 11318, 0xfef3 }, { 11331, 0xe01f }, { 11339, 0xf176 }, { 11349, 0xee96 }, { 11359, 0x7b3f }, { 11371, 0xeb8d }, { 11381, 0xfffd }, { 11396, 0xadff }, { 11409, 0xcbb3 }, { 11419, 0x84ef }, { 11428, 0xe17f }, { 11439, 0x4daa }, { 11447, 0xbff0 }, { 11458, 0xbf3f }, { 11471, 0xfe3f }, /* 0x9100 */ { 11484, 0xebff }, { 11498, 0xffd7 }, { 11512, 0xffdf }, { 11527, 0xcf7f }, { 11540, 0xfffb }, { 11555, 0x85ed }, { 11564, 0xd73f }, { 11576, 0x07bc }, { 11584, 0xaeff }, { 11597, 0xfe0f }, { 11608, 0xfdaf }, { 11621, 0x76bf }, { 11633, 0xfaef }, { 11646, 0x37bb }, { 11657, 0x7fdc }, { 11669, 0xa3ba }, /* 0x9200 */ { 11678, 0xb6ff }, { 11691, 0x56f7 }, { 11702, 0x60f8 }, { 11709, 0xe7df }, { 11722, 0xff61 }, { 11733, 0x4cdf }, { 11743, 0xb0fb }, { 11753, 0xff45 }, { 11764, 0x7ded }, { 11776, 0x3ffa }, { 11788, 0x1fff }, { 11801, 0x18fc }, { 11809, 0xffff }, { 11825, 0xe3af }, { 11836, 0xc7d3 }, { 11846, 0xdf83 }, /* 0x9300 */ { 11856, 0xfb57 }, { 11868, 0xef7d }, { 11881, 0xefff }, { 11896, 0x1378 }, { 11903, 0xfec0 }, { 11912, 0x5ff7 }, { 11925, 0x34bb }, { 11934, 0x5ee3 }, { 11944, 0xf70d }, { 11954, 0xeff6 }, { 11967, 0xd7fe }, { 11980, 0x00bf }, { 11987, 0xf59d }, { 11998, 0xf7f7 }, { 12012, 0x51de }, { 12021, 0xffe0 }, /* 0x9400 */ { 12032, 0xfec9 }, { 12043, 0x037f }, { 12052, 0x5f01 }, { 12059, 0xbfef }, { 12073, 0x9ff1 }, { 12084, 0x60a7 }, { 12091, 0xef1d }, { 12102, 0xf1ff }, { 12115, 0x000f }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, /* 0x9500 */ { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x3c80 }, { 12124, 0xfb4d }, { 12135, 0xd91f }, { 12145, 0x7b3a }, { 12155, 0xfee3 }, { 12167, 0x3fe9 }, { 12178, 0xdc7f }, { 12190, 0x003f }, { 12196, 0x0000 }, /* 0x9600 */ { 12196, 0x0000 }, { 12196, 0x5000 }, { 12198, 0xf51f }, { 12209, 0xbe07 }, { 12218, 0xfc1d }, { 12228, 0xf91b }, { 12238, 0xbc1e }, { 12247, 0x71ff }, { 12259, 0x6ff9 }, { 12271, 0x5bbe }, { 12282, 0x5796 }, { 12291, 0x9b1b }, { 12300, 0x7fff }, { 12315, 0xfffc }, { 12329, 0x872e }, { 12337, 0xafe7 }, /* 0x9700 */ { 12349, 0xebf5 }, { 12361, 0xf34f }, { 12372, 0xdffd }, { 12386, 0xe725 }, { 12395, 0x0bdc }, { 12403, 0x5d44 }, { 12410, 0x5747 }, { 12419, 0xfddd }, { 12432, 0xed3f }, { 12444, 0x7790 }, { 12452, 0x7d7f }, { 12465, 0x8ac8 }, { 12471, 0xfafa }, { 12483, 0xf3f9 }, { 12495, 0x202a }, { 12499, 0xef4b }, /* 0x9800 */ { 12510, 0xf5ff }, { 12524, 0x79cf }, { 12535, 0xabd3 }, { 12545, 0x0ba5 }, { 12552, 0xf77a }, { 12564, 0xfb8f }, { 12576, 0x8ebd }, { 12586, 0x001f }, { 12591, 0x0000 }, { 12591, 0x0000 }, { 12591, 0xf300 }, { 12597, 0xfd4e }, { 12608, 0x1a57 }, { 12616, 0x8800 }, { 12618, 0xaeac }, { 12627, 0x7654 }, /* 0x9900 */ { 12635, 0x17ad }, { 12644, 0xcdff }, { 12657, 0xffb2 }, { 12669, 0xf42f }, { 12679, 0x5baa }, { 12688, 0xdbff }, { 12702, 0x0002 }, { 12703, 0x0000 }, { 12703, 0x0000 }, { 12703, 0x73c0 }, { 12710, 0xf9ea }, { 12721, 0x2e3f }, { 12731, 0xfa8e }, { 12741, 0xbbff }, { 12755, 0x76bc }, { 12765, 0xffd3 }, /* 0x9a00 */ { 12778, 0xeefe }, { 12791, 0x7e72 }, { 12801, 0x7ebd }, { 12813, 0xe7f7 }, { 12826, 0xf77f }, { 12840, 0xcefd }, { 12852, 0x0ff5 }, { 12862, 0x0000 }, { 12862, 0x0000 }, { 12862, 0x0000 }, { 12862, 0xa900 }, { 12866, 0xdb9b }, { 12877, 0xa4c7 }, { 12885, 0x917f }, { 12895, 0xf8ca }, { 12904, 0x7ece }, /* 0x9b00 */ { 12915, 0x7d7a }, { 12926, 0xc7e7 }, { 12937, 0xcbbd }, { 12948, 0xdcae }, { 12958, 0xfd7e }, { 12971, 0x8f76 }, { 12981, 0x91d3 }, { 12989, 0x7cf3 }, { 13000, 0x01e5 }, { 13006, 0x4c2f }, { 13014, 0xed77 }, { 13026, 0xa360 }, { 13032, 0x07db }, { 13041, 0x5ef8 }, { 13051, 0x1df7 }, { 13062, 0x2181 }, /* 0x9c00 */ { 13066, 0x6be0 }, { 13074, 0x309c }, { 13080, 0x3b3a }, { 13089, 0xfade }, { 13101, 0x7f53 }, { 13112, 0xc3f5 }, { 13122, 0x61cd }, { 13130, 0x07ba }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x26e0 }, { 13144, 0xbefe }, /* 0x9d00 */ { 13157, 0x03f9 }, { 13165, 0xebb5 }, { 13176, 0xe36d }, { 13186, 0xe9cb }, { 13196, 0x9c2f }, { 13205, 0xbfde }, { 13218, 0x9f83 }, { 13227, 0xabbf }, { 13239, 0x1ff7 }, { 13251, 0xffd5 }, { 13264, 0xb7df }, { 13277, 0xdffe }, { 13291, 0xfdae }, { 13303, 0xffef }, { 13318, 0xfb7e }, { 13331, 0xeffd }, /* 0x9e00 */ { 13345, 0xaaff }, { 13357, 0x6ebf }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0xb620 }, { 13375, 0x7fcd }, { 13387, 0xbe9e }, { 13398, 0x62b3 }, { 13406, 0x58f1 }, { 13414, 0xf10d }, { 13422, 0xfd7b }, { 13435, 0xe9f1 }, { 13445, 0xbefd }, /* 0x9f00 */ { 13458, 0xc6c3 }, { 13466, 0x5f6d }, { 13477, 0xff3d }, { 13490, 0x69ff }, { 13502, 0xffcf }, { 13516, 0xfbf4 }, { 13528, 0xdcfb }, { 13540, 0x4ff7 }, { 13552, 0x2000 }, { 13553, 0x1137 }, { 13560, 0x0015 }, }; static const Summary16 big5_uni2indx_pagefa[1] = { /* 0xfa00 */ { 13563, 0x3000 }, }; static const Summary16 big5_uni2indx_pagefe[23] = { /* 0xfe00 */ { 13565, 0x0000 }, { 13565, 0x0000 }, { 13565, 0x0000 }, { 13565, 0xfffb }, { 13580, 0xfe1f }, { 13592, 0xfef5 }, { 13605, 0x0e7f }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, /* 0xff00 */ { 13615, 0xff7a }, { 13628, 0xffff }, { 13644, 0xffff }, { 13660, 0x97ff }, { 13673, 0xfffe }, { 13688, 0x3fff }, { 13702, 0x0010 }, }; static int big5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc > 0x0000 && wc < 0x0100) summary = &big5_uni2indx_page00[(wc>>4)]; else if (wc >= 0x0200 && wc < 0x0460) summary = &big5_uni2indx_page02[(wc>>4)-0x020]; else if (wc >= 0x2000 && wc < 0x22c0) summary = &big5_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x2400 && wc < 0x2650) summary = &big5_uni2indx_page24[(wc>>4)-0x240]; else if (wc >= 0x3000 && wc < 0x33e0) summary = &big5_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x4e00 && wc < 0x9fb0) summary = &big5_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xfa00 && wc < 0xfa10) summary = &big5_uni2indx_pagefa[(wc>>4)-0xfa0]; else if (wc >= 0xfe00 && wc < 0xff70) summary = &big5_uni2indx_pagefe[(wc>>4)-0xfe0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' and the number of bits set in `used'. */ used = (used & 0x5555) + ((used & 0xaaaa) >> 1); used = (used & 0x3333) + ((used & 0xcccc) >> 2); used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); used = (used & 0x00ff) + (used >> 8); c = big5_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-3.21.80/src/libtiniconv/encdec/cp866.h0000664000175000017500000001207212313064025015413 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP866 */ static const unsigned short cp866_2uni[80] = { /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, /* 0xd0 */ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, /* 0xe0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, /* 0xf0 */ 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0, }; static int cp866_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else if (c < 0xb0) *pwc = (ucs4_t) c + 0x0390; else *pwc = (ucs4_t) cp866_2uni[c-0xb0]; return 1; } static const unsigned char cp866_page00[24] = { 0xff, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, /* 0xb0-0xb7 */ }; static const unsigned char cp866_page04[96] = { 0x00, 0xf0, 0x00, 0x00, 0xf2, 0x00, 0x00, 0xf4, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x00, /* 0x08-0x0f */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x30-0x37 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0x00, 0xf1, 0x00, 0x00, 0xf3, 0x00, 0x00, 0xf5, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, /* 0x58-0x5f */ }; static const unsigned char cp866_page22[8] = { 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static const unsigned char cp866_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp866_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b8) c = cp866_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0460) c = cp866_page04[wc-0x0400]; else if (wc == 0x2116) c = 0xfc; else if (wc >= 0x2218 && wc < 0x2220) c = cp866_page22[wc-0x2218]; else if (wc >= 0x2500 && wc < 0x25a8) c = cp866_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-3.21.80/src/libtiniconv/README.FLDIGI0000664000175000017500000000032412313064025014765 00000000000000tiniconv is built as a set of built in functions rather than as a stand-alone library. No other changes to the code. Tested and correctly executes on Linux, Windows (NT, 2000, XP, Vista, Win7, Win8) and OS X. fldigi-3.21.80/src/libtiniconv/tiniconv.h0000664000175000017500000001261312313064025015156 00000000000000/* * This file is part of the TINICONV Library. * * The TINICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef TINICONV_H_ #define TINICONV_H_ /* For exporting functions under WIN32 */ #ifdef WIN32 #ifdef DLL #define EXPORT(type) __declspec(dllexport) type #else #define EXPORT(type) /*__declspec(dllimport)*/ type #endif/*DLL*/ #else #define EXPORT(type) type #endif /*WIN32*/ typedef unsigned int ucs4_t; typedef struct tiniconv_ctx_s * conv_t; /* * int xxx_mb2wc (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n) * converts the byte sequence starting at s to a wide character. Up to n bytes * are available at s. n is >= 1. * Result is number of bytes consumed (if a wide character was read), * or -1 if invalid, or -2 if n too small, or -2-(number of bytes consumed) * if only a shift sequence was read. */ typedef int (*xxx_mb2wc_t) (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n); /* * int xxx_flushwc (conv_t conv, ucs4_t *pwc) * returns to the initial state and stores the pending wide character, if any. * Result is 1 (if a wide character was read) or 0 if none was pending. */ typedef int (*xxx_flushwc_t) (conv_t conv, ucs4_t *pwc); /* * int xxx_wc2mb (conv_t conv, unsigned char *r, ucs4_t wc, int n) * converts the wide character wc to the character set xxx, and stores the * result beginning at r. Up to n bytes may be written at r. n is >= 1. * Result is number of bytes written, or -1 if invalid, or -2 if n too small. */ typedef int (*xxx_wc2mb_t) (conv_t conv, unsigned char *r, ucs4_t wc, int n); /* * int xxx_reset (conv_t conv, unsigned char *r, int n) * stores a shift sequences returning to the initial state beginning at r. * Up to n bytes may be written at r. n is >= 0. * Result is number of bytes written, or -2 if n too small. */ typedef int (*xxx_reset_t) (conv_t conv, unsigned char *r, int n); typedef unsigned int conv_state_t; struct tiniconv_ctx_s { conv_state_t istate; conv_state_t ostate; xxx_mb2wc_t mb2wc; xxx_flushwc_t flushwc; xxx_wc2mb_t wc2mb; xxx_reset_t reset; int options; }; /* * tiniconv_init */ #define TINICONV_CHARSET_ASCII 0 #define TINICONV_CHARSET_CP1250 1 #define TINICONV_CHARSET_CP1251 2 #define TINICONV_CHARSET_CP1252 3 #define TINICONV_CHARSET_CP1253 4 #define TINICONV_CHARSET_CP1254 5 #define TINICONV_CHARSET_CP1255 6 #define TINICONV_CHARSET_CP1256 7 #define TINICONV_CHARSET_CP1257 8 #define TINICONV_CHARSET_CP1258 9 #define TINICONV_CHARSET_CP936 10 #define TINICONV_CHARSET_GB2312 11 #define TINICONV_CHARSET_GBK 12 #define TINICONV_CHARSET_ISO_2022_JP 13 #define TINICONV_CHARSET_ISO_8859_1 14 #define TINICONV_CHARSET_ISO_8859_2 15 #define TINICONV_CHARSET_ISO_8859_3 16 #define TINICONV_CHARSET_ISO_8859_4 17 #define TINICONV_CHARSET_ISO_8859_5 18 #define TINICONV_CHARSET_ISO_8859_6 19 #define TINICONV_CHARSET_ISO_8859_7 20 #define TINICONV_CHARSET_ISO_8859_8 21 #define TINICONV_CHARSET_ISO_8859_9 22 #define TINICONV_CHARSET_ISO_8859_10 23 #define TINICONV_CHARSET_ISO_8859_11 24 #define TINICONV_CHARSET_ISO_8859_13 25 #define TINICONV_CHARSET_ISO_8859_14 26 #define TINICONV_CHARSET_ISO_8859_15 27 #define TINICONV_CHARSET_ISO_8859_16 28 #define TINICONV_CHARSET_CP866 29 #define TINICONV_CHARSET_KOI8_R 30 #define TINICONV_CHARSET_KOI8_RU 31 #define TINICONV_CHARSET_KOI8_U 32 #define TINICONV_CHARSET_MACCYRILLIC 33 #define TINICONV_CHARSET_UCS_2 34 #define TINICONV_CHARSET_UTF_7 35 #define TINICONV_CHARSET_UTF_8 36 #define TINICONV_CHARSET_CHINESE 37 #define TINICONV_CHARSET_BIG5 38 #define TINICONV_CHARSETSIZE 39 #define TINICONV_OPTION_IGNORE_IN_ILSEQ 1 /*< ignore incorrect input sequences */ #define TINICONV_OPTION_IGNORE_OUT_ILSEQ 2 /*< replace sequence which can't be converted to OUT charset with OUTIL_CHAR */ /* #define TINICONV_OPTION_TRANSLIT 4 */ #define TINICONV_OPTION_OUT_ILSEQ_CHAR(ch) (ch << 8) #define TINICONV_INIT_OK 0 #define TINICONV_INIT_IN_CHARSET_NA -1 #define TINICONV_INIT_OUT_CHARSET_NA -1 #ifdef __cplusplus extern "C" { #endif EXPORT(int) tiniconv_init(int in_charset_id, int out_charset_id, int options, struct tiniconv_ctx_s *ctx); /* * tiniconv_convert */ #define TINICONV_CONVERT_OK 0 #define TINICONV_CONVERT_IN_TOO_SMALL -1 #define TINICONV_CONVERT_OUT_TOO_SMALL -2 #define TINICONV_CONVERT_IN_ILSEQ -3 #define TINICONV_CONVERT_OUT_ILSEQ -4 EXPORT(int) tiniconv_convert(struct tiniconv_ctx_s *ctx, unsigned char const *in_buf, int in_size, int *p_in_size_consumed, unsigned char *out_buf, int out_size, int *p_out_size_consumed); #ifdef __cplusplus } #endif #endif /*TINICONV_H_*/ fldigi-3.21.80/src/globals/0000775000175000017500000000000012313333725012342 500000000000000fldigi-3.21.80/src/globals/globals.cxx0000664000175000017500000003504612313147652014443 00000000000000// ---------------------------------------------------------------------------- // globals.cxx -- constants, variables, arrays & functions that need to be // outside of any thread // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "gettext.h" #include "globals.h" #include "modem.h" using namespace std; // Elements are in enum trx_mode order. // N.B. it is not valid to use an _("NLS") string in this table!! // ... doing so will break the Fl_menu_item table 'menu_'. -Kamal const struct mode_info_t mode_info[NUM_MODES] = { { MODE_NULL, &null_modem, "NULL", "NULL", "", "NULL", "" }, { MODE_CW, &cw_modem, "CW", "CW", "CW", "CW", "CW" }, { MODE_CONTESTIA, &contestia_modem, "CTSTIA", "Contestia", "", "CONTESTI", "CT" }, { MODE_DOMINOEX4, &dominoex4_modem, "DOMEX4", "DominoEX 4", "DOMINOEX4", "DOMINO", "DM 4" }, { MODE_DOMINOEX5, &dominoex5_modem, "DOMEX5", "DominoEX 5", "DOMINOEX5", "DOMINO", "DM 5" }, { MODE_DOMINOEX8, &dominoex8_modem, "DOMEX8", "DominoEX 8", "DOMINOEX8", "DOMINO", "DM 8" }, { MODE_DOMINOEX11, &dominoex11_modem, "DOMX11", "DominoEX 11", "DOMINOEX11", "DOMINO", "DM11" }, { MODE_DOMINOEX16, &dominoex16_modem, "DOMX16", "DominoEX 16", "DOMINOEX16", "DOMINO", "DM16" }, { MODE_DOMINOEX22, &dominoex22_modem, "DOMX22", "DominoEX 22", "DOMINOEX22", "DOMINO", "DM22" }, { MODE_DOMINOEX44, &dominoex44_modem, "DOMX44", "DominoEX 44", "DOMINOEX44", "DOMINO", "DM44" }, { MODE_DOMINOEX88, &dominoex88_modem, "DOMX88", "DominoEX 88", "DOMINOEX88", "DOMINO", "DM88" }, { MODE_FELDHELL, &feld_modem, "FELDHELL", "Feld Hell", "", "HELL", "HELL" }, { MODE_SLOWHELL, &feld_slowmodem, "SLOWHELL", "Slow Hell", "", "HELL", "SHLL" }, { MODE_HELLX5, &feld_x5modem, "HELLX5", "Feld Hell X5", "", "HELL", "HLX5" }, { MODE_HELLX9, &feld_x9modem, "HELLX9", "Feld Hell X9", "", "HELL", "HLX9"}, { MODE_FSKHELL, &feld_FMmodem, "FSKHELL", "FSK Hell", "", "FMHELL", "FMHL" }, { MODE_FSKH105, &feld_FM105modem, "FSKH105", "FSK Hell-105", "", "FMHELL", "H105" }, { MODE_HELL80, &feld_80modem, "HELL80", "Hell 80", "", "HELL80", "HL80" }, { MODE_MFSK8, &mfsk8_modem, "MFSK8", "MFSK-8", "MFSK8", "MFSK8", "MK 8" }, { MODE_MFSK16, &mfsk16_modem, "MFSK16", "MFSK-16", "MFSK16", "MFSK16", "MK16" }, { MODE_MFSK32, &mfsk32_modem, "MFSK32", "MFSK-32", "MFSK32", "MFSK32", "MK32" }, { MODE_MFSK4, &mfsk4_modem, "MFSK4", "MFSK-4", "MFSK4", "MFSK4", "MK 4" }, { MODE_MFSK11, &mfsk11_modem, "MFSK11", "MFSK-11", "MFSK11", "MFSK11", "MK11" }, { MODE_MFSK22, &mfsk22_modem, "MFSK22", "MFSK-22", "MFSK22", "MFSK22", "MK22" }, { MODE_MFSK31, &mfsk31_modem, "MFSK31", "MFSK-31", "MFSK31", "MFSK31", "MK31" }, { MODE_MFSK64, &mfsk64_modem, "MFSK64", "MFSK-64", "MFSK64", "MFSK64", "MK64" }, { MODE_MFSK128, &mfsk128_modem, "MFSK128", "MFSK-128", "MFSK128", "MFSK128", "MK128" }, { MODE_MFSK64L, &mfsk64l_modem, "MFSK64L", "MFSK-64L", "MFSK64L", "MFSK64L", "MK64L" }, { MODE_MFSK128L, &mfsk128l_modem, "MFSK128L", "MFSK-128L", "MFSK128L", "MFSK128L", "MK128L" }, { MODE_WEFAX_576, &wefax576_modem, "WEFAX576", "WEFAX-IOC576", "WEFAXIOC576", "FAX", "FX576" }, { MODE_WEFAX_288, &wefax288_modem, "WEFAX288", "WEFAX-IOC288", "WEFAXIOC288", "FAX", "FX288" }, { MODE_NAVTEX, &navtex_modem, "NAVTEX", "NAVTEX", "NAVTEX", "TOR", "NAVTEX" }, { MODE_SITORB, &sitorb_modem, "SITORB", "SITORB", "SITORB", "TOR", "SITORB" }, { MODE_MT63_500S, &mt63_500S_modem, "MT63-500S", "MT63-500S", "MT63-500S", "MT63", "MT63-500S" }, { MODE_MT63_500L, &mt63_500L_modem, "MT63-500L", "MT63-500L", "MT63-500L", "MT63", "MT63-500L" }, { MODE_MT63_1000S, &mt63_1000S_modem, "MT63-1KS", "MT63-1000S", "MT63-1XXS", "MT63", "MT63 1KS" }, { MODE_MT63_1000L, &mt63_1000L_modem, "MT63-1KL", "MT63-1000L", "MT63-1XXL", "MT63", "MT63 1KL" }, { MODE_MT63_2000S, &mt63_2000S_modem, "MT63-2KS", "MT63-2000S", "MT63-2XXS", "MT63", "MT63 2KS" }, { MODE_MT63_2000L, &mt63_2000L_modem, "MT63-2KL", "MT63-2000L", "MT63-2XXL", "MT63", "MT63 2KL" }, { MODE_PSK31, &psk31_modem, "BPSK31", "BPSK-31", "PSK31", "PSK31", "P31" }, { MODE_PSK63, &psk63_modem, "BPSK63", "BPSK-63", "PSK63", "PSK63", "P63" }, { MODE_PSK63F, &psk63f_modem, "BPSK63F", "BPSK-63F", "PSK63F", "PSK63F", "P63F" }, { MODE_PSK125, &psk125_modem, "BPSK125", "BPSK-125", "PSK125", "PSK125", "P125" }, { MODE_PSK250, &psk250_modem, "BPSK250", "BPSK-250", "PSK250", "PSK250", "P250" }, { MODE_PSK500, &psk500_modem, "BPSK500", "BPSK-500", "PSK500", "PSK500", "P500" }, { MODE_QPSK31, &qpsk31_modem, "QPSK31", "QPSK-31", "QPSK31", "QPSK31", "Q31" }, { MODE_QPSK63, &qpsk63_modem, "QPSK63", "QPSK-63", "QPSK63", "QPSK63", "Q63" }, { MODE_QPSK125, &qpsk125_modem, "QPSK125", "QPSK-125", "QPSK125", "QPSK125", "Q125" }, { MODE_QPSK250, &qpsk250_modem, "QPSK250", "QPSK-250", "QPSK250", "QPSK250", "Q250" }, { MODE_QPSK500, &qpsk500_modem, "QPSK500", "QPSK-500", "QPSK500", "QPSK500", "Q500" }, { MODE_PSK125R, &psk125r_modem, "PSK125R", "PSK-125R", "PSK125R", "PSK125R", "P125R" }, { MODE_PSK250R, &psk250r_modem, "PSK250R", "PSK-250R", "PSK250R", "PSK250R", "P250R" }, { MODE_PSK500R, &psk500r_modem, "PSK500R", "PSK-500R", "PSK500R", "PSK500R", "P500R" }, { MODE_PSK1000, &psk1000_modem, "BPSK1000", "BPSK-1000", "PSK1000", "PSK1000", "P1000" }, { MODE_PSK1000R, &psk1000r_modem, "PSK1000R", "PSK-1000R", "PSK1000R", "PSK1000R", "PSK1000R" }, { MODE_OLIVIA, &olivia_modem, "OLIVIA", "OLIVIA", "OLIVIA", "OLIVIA", "OL" }, { MODE_OLIVIA_4_250, &olivia_4_250_modem, "Olivia-4-250", "OL 4-250", "OLIV 4/250", "OLIVIA", "OL4/250" }, { MODE_OLIVIA_8_250, &olivia_8_250_modem, "Olivia-8-250", "OL 8-250", "OLIV 8/250", "OLIVIA", "OL8/250" }, { MODE_OLIVIA_4_500, &olivia_4_500_modem, "Olivia-4-500", "OL 4-500", "OLIV 4/500", "OLIVIA", "OL4/500" }, { MODE_OLIVIA_8_500, &olivia_8_500_modem, "Olivia-8-500", "OL 8-500", "OLIV 8/500", "OLIVIA", "OL8/500" }, { MODE_OLIVIA_16_500, &olivia_16_500_modem, "Olivia-16-500", "OL 16-500", "OLIV 16/500", "OLIVIA", "OL16/500" }, { MODE_OLIVIA_8_1000, &olivia_8_1000_modem, "Olivia-8-1K", "OL 8-1K", "OLIV 8/1K", "OLIVIA", "OL8/1K" }, { MODE_OLIVIA_16_1000, &olivia_16_1000_modem, "Olivia-16-1K", "OL 16-1K", "OLIV 16/1K", "OLIVIA", "OL16/1K" }, { MODE_OLIVIA_32_1000, &olivia_32_1000_modem, "Olivia-32-1K", "OL 32-1K", "OLIV 32/1K", "OLIVIA", "OL32/1K" }, { MODE_OLIVIA_64_2000, &olivia_64_2000_modem, "Olivia-64-2K", "OL 64-2K", "OLIV 64/2K", "OLIVIA", "OL64/2K" }, { MODE_RTTY, &rtty_modem, "RTTY", "RTTY", "RTTY", "RTTY", "RY" }, { MODE_THOR4, &thor4_modem, "THOR4", "THOR 4", "THOR4", "THOR", "TH4" }, { MODE_THOR5, &thor5_modem, "THOR5", "THOR 5", "THOR5", "THOR", "TH5" }, { MODE_THOR8, &thor8_modem, "THOR8", "THOR 8", "THOR8", "THOR", "TH8" }, { MODE_THOR11, &thor11_modem, "THOR11", "THOR 11", "THOR11", "THOR", "TH11" }, { MODE_THOR16, &thor16_modem, "THOR16", "THOR 16", "THOR16", "THOR", "TH16" }, { MODE_THOR22, &thor22_modem, "THOR22", "THOR 22", "THOR22", "THOR", "TH22" }, { MODE_THOR25x4, &thor25x4_modem, "THOR25x4", "THOR 25 x4", "THOR25x4", "THOR", "TH25" }, { MODE_THOR50x1, &thor50x1_modem, "THOR50x1", "THOR 50 x1", "THOR50x1", "THOR", "TH51" }, { MODE_THOR50x2, &thor50x2_modem, "THOR50x2", "THOR 50 x2", "THOR50x2", "THOR", "TH52" }, { MODE_THOR100, &thor100_modem, "THOR100", "THOR 100", "THOR100", "THOR", "TH10" }, { MODE_THROB1, &throb1_modem, "THROB1", "Throb 1", "", "THRB", "TB1" }, { MODE_THROB2, &throb2_modem, "THROB2", "Throb 2", "", "THRB", "TB2" }, { MODE_THROB4, &throb4_modem, "THROB4", "Throb 4", "", "THRB", "TB4" }, { MODE_THROBX1, &throbx1_modem, "THRBX1", "ThrobX 1", "", "THRBX", "TX1" }, { MODE_THROBX2, &throbx2_modem, "THRBX2", "ThrobX 2", "", "THRBX", "TX2" }, { MODE_THROBX4, &throbx4_modem, "THRBX4", "ThrobX 4", "", "THRBX", "TX4" }, { MODE_4X_PSK63R, &psk63r_c4_modem, "PSK63RC4", "4xPSK63R", "PSK63RC4", "PSK63RC4", "P63R4" }, { MODE_5X_PSK63R, &psk63r_c5_modem, "PSK63RC5", "5xPSK63R", "PSK63RC5", "PSK63RC5", "P63R5" }, { MODE_10X_PSK63R, &psk63r_c10_modem, "PSK63RC10", "10xPSK63R", "PSK63RC10", "PSK63RC10", "P63R10" }, { MODE_20X_PSK63R, &psk63r_c20_modem, "PSK63RC20", "20xPSK63R", "PSK63RC20", "PSK63RC20", "P63R20" }, { MODE_32X_PSK63R, &psk63r_c32_modem, "PSK63RC32", "32xPSK63R", "PSK63RC32", "PSK63RC32", "P63R32" }, { MODE_4X_PSK125R, &psk125r_c4_modem, "PSK125RC4", "4xPSK125R", "PSK125RC4", "PSK125RC4", "P125R4" }, { MODE_5X_PSK125R, &psk125r_c5_modem, "PSK125RC5", "5xPSK125R", "PSK125RC5", "PSK125RC5", "P125R5" }, { MODE_10X_PSK125R, &psk125r_c10_modem, "PSK125RC10", "10xPSK125R", "PSK125RC10", "PSK125RC10", "P125R10" }, { MODE_12X_PSK125, &psk125_c12_modem, "PSK125C12", "12xPSK125", "PSK125C12", "PSK125C12", "P125C12" }, { MODE_12X_PSK125R, &psk125r_c12_modem, "PSK125RC12", "12xPSK125R", "PSK125RC12", "PSK125RC12", "P125R12" }, { MODE_16X_PSK125R, &psk125r_c16_modem, "PSK125RC16", "16xPSK125R", "PSK125RC16", "PSK125RC16", "P125R16" }, { MODE_6X_PSK250, &psk250_c6_modem, "PSK250C6", "6xPSK250", "PSK250C6", "PSK250C6", "P2506"}, { MODE_2X_PSK250R, &psk250r_c2_modem, "PSK250RC2", "2xPSK250R", "PSK250RC2", "PSK250RC2", "P250R2" }, { MODE_3X_PSK250R, &psk250r_c3_modem, "PSK250RC3", "3xPSK250R", "PSK250RC3", "PSK250RC3", "P250R3" }, { MODE_5X_PSK250R, &psk250r_c5_modem, "PSK250RC5", "5xPSK250R", "PSK250RC5", "PSK250RC5", "P250R5"}, { MODE_6X_PSK250R, &psk250r_c6_modem, "PSK250RC6", "6xPSK250R", "PSK250RC6", "PSK250RC6", "P250R6"}, { MODE_7X_PSK250R, &psk250r_c7_modem, "PSK250RC7", "7xPSK250R", "PSK250RC7", "PSK250RC7", "P250R7"}, { MODE_2X_PSK500, &psk500_c2_modem, "PSK500C2", "2xPSK500", "PSK500C2", "PSK500C2", "2xP500" }, { MODE_4X_PSK500, &psk500_c4_modem, "PSK500C4", "4xPSK500", "PSK500C4", "PSK500C4", "4xP500" }, { MODE_2X_PSK500R, &psk500r_c2_modem, "PSK500RC2", "2xPSK500R", "PSK500RC2", "PSK500RC2", "P500R2" }, { MODE_3X_PSK500R, &psk500r_c3_modem, "PSK500RC3", "3xPSK500R", "PSK500RC3", "PSK500RC3", "P500R3" }, { MODE_4X_PSK500R, &psk500r_c4_modem, "PSK500RC4", "4xPSK500R", "PSK500RC4", "PSK500RC4", "P500R4"}, { MODE_2X_PSK800, &psk800_c2_modem, "PSK800C2", "2xPSK800", "PSK800C2", "PSK800C2", "P800RC2" }, { MODE_2X_PSK800R, &psk800r_c2_modem, "PSK800RC2", "2xPSK800R", "PSK800RC2", "PSK800RC2", "P800RC2" }, { MODE_2X_PSK1000, &psk1000_c2_modem, "PSK1000C2", "2xPSK1000", "PSK1000C2", "PSK1000C2", "P1KC2" }, { MODE_2X_PSK1000R, &psk1000r_c2_modem, "PSK1000RC2", "2xPSK1000R", "PSK1000RC2", "PSK1000RC2", "P1KRC2" }, { MODE_SSB, &ssb_modem, "SSB", "SSB", "", "SSB", "" }, { MODE_WWV, &wwv_modem, "WWV", "WWV", "", "", "" }, { MODE_ANALYSIS, &anal_modem, "ANALYSIS", "Freq Analysis", "", "", "" } }; std::ostream& operator<<(std::ostream& s, const qrg_mode_t& m) { return s << m.rfcarrier << ' ' << m.rmode << ' ' << m.carrier << ' ' << mode_info[m.mode].sname; } std::istream& operator>>(std::istream& s, qrg_mode_t& m) { string sMode; int mnbr; s >> m.rfcarrier >> m.rmode >> m.carrier >> sMode; // handle case for reading older type of specification string if (sscanf(sMode.c_str(), "%d", &mnbr)) { m.mode = mnbr; return s; } m.mode = MODE_PSK31; for (mnbr = MODE_CW; mnbr < NUM_MODES; mnbr++) if (sMode == mode_info[mnbr].sname) { m.mode = mnbr; break; } return s; } std::string qrg_mode_t::str(void) { ostringstream s; s << setiosflags(ios::left | ios::fixed) << setw(12) << setprecision(3) << rfcarrier/1000.0 << setw(8) << rmode << setw(10) << (mode < NUM_MODES ? mode_info[mode].sname : "NONE") << carrier; return s.str(); } band_t band(long long freq_hz) { switch (freq_hz / 1000000LL) { case 0: case 1: return BAND_160M; case 3: return BAND_80M; case 4: return BAND_75M; case 5: return BAND_60M; case 7: return BAND_40M; case 10: return BAND_30M; case 14: return BAND_20M; case 18: return BAND_17M; case 21: return BAND_15M; case 24: return BAND_12M; case 28 ... 29: return BAND_10M; case 50 ... 54: return BAND_6M; case 70 ... 71: return BAND_4M; case 144 ... 148: return BAND_2M; case 222 ... 225: return BAND_125CM; case 420 ... 450: return BAND_70CM; case 902 ... 928: return BAND_33CM; case 1240 ... 1325: return BAND_23CM; case 2300 ... 2450: return BAND_13CM; case 3300 ... 3500: return BAND_9CM; case 5650 ... 5925: return BAND_6CM; case 10000 ... 10500: return BAND_3CM; case 24000 ... 24250: return BAND_125MM; case 47000 ... 47200: return BAND_6MM; case 75500 ... 81000: return BAND_4MM; case 119980 ... 120020: return BAND_2P5MM; case 142000 ... 149000: return BAND_2MM; case 241000 ... 250000: return BAND_1MM; } return BAND_OTHER; } band_t band(const char* freq_mhz) { errno = 0; double d = strtod(freq_mhz, NULL); if (d != 0.0 && errno == 0) return band((long long)(d * 1e6)); else return BAND_OTHER; } struct band_freq_t { const char* band; const char* freq; }; static struct band_freq_t band_names[NUM_BANDS] = { { "160m", "1.8" }, { "80m", "3.5" }, { "75m", "4.0" }, { "60m", "5.3" }, { "40m", "7.0" }, { "30m", "10.0" }, { "20m", "14.0" }, { "17m", "18.0" }, { "15m", "21.0" }, { "12m", "24.0" }, { "10m", "28.0" }, { "6m", "50.0" }, { "4m", "70.0" }, { "2m", "144.0" }, { "1.25m", "222.0" }, { "70cm", "420.0" }, { "33cm", "902.0" }, { "23cm", "1240.0" }, { "13cm", "2300.0" }, { "9cm", "3300.0" }, { "6cm", "5650.0" }, { "3cm", "10000.0" }, { "1.25cm", "24000.0" }, { "6mm", "47000.0" }, { "4mm", "75500.0" }, { "2.5mm", "119980.0" }, { "2mm", "142000.0" }, { "1mm", "241000.0" }, { "other", "" } }; const char* band_name(band_t b) { return band_names[CLAMP(b, 0, NUM_BANDS-1)].band; } const char* band_name(const char* freq_mhz) { return band_name(band(freq_mhz)); } const char* band_freq(band_t b) { return band_names[CLAMP(b, 0, NUM_BANDS-1)].freq; } const char* band_freq(const char* band_name) { for (size_t i = 0; i < BAND_OTHER; i++) if (!strcmp(band_names[i].band, band_name)) return band_names[i].freq; return ""; } fldigi-3.21.80/src/rigcontrol/0000775000175000017500000000000012313333726013102 500000000000000fldigi-3.21.80/src/rigcontrol/rigsupport.cxx0000664000175000017500000002637712313064025015774 00000000000000// ---------------------------------------------------------------------------- // rigsupport.cxx - support functions file // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include "rigsupport.h" #include "rigxml.h" #include "rigio.h" #include "threads.h" #include "main.h" #include "fl_digi.h" #include "trx.h" #include "configuration.h" #include "globals.h" #include "debug.h" #include "gettext.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); using namespace std; string windowTitle; vector freqlist; const unsigned char nfields = 4; int fwidths[nfields]; enum { max_rfcarrier, max_rmode, max_mode }; #if !USE_HAMLIB typedef enum { RIG_MODE_NONE = 0, /*!< '' -- None */ RIG_MODE_AM = (1<<0), /*!< \c AM -- Amplitude Modulation */ RIG_MODE_CW = (1<<1), /*!< \c CW -- CW "normal" sideband */ RIG_MODE_USB = (1<<2), /*!< \c USB -- Upper Side Band */ RIG_MODE_LSB = (1<<3), /*!< \c LSB -- Lower Side Band */ RIG_MODE_RTTY = (1<<4), /*!< \c RTTY -- Radio Teletype */ RIG_MODE_FM = (1<<5), /*!< \c FM -- "narrow" band FM */ RIG_MODE_WFM = (1<<6), /*!< \c WFM -- broadcast wide FM */ RIG_MODE_CWR = (1<<7), /*!< \c CWR -- CW "reverse" sideband */ RIG_MODE_RTTYR = (1<<8), /*!< \c RTTYR -- RTTY "reverse" sideband */ RIG_MODE_AMS = (1<<9), /*!< \c AMS -- Amplitude Modulation Synchronous */ RIG_MODE_PKTLSB = (1<<10),/*!< \c PKTLSB -- Packet/Digital LSB mode (dedicated port) */ RIG_MODE_PKTUSB = (1<<11),/*!< \c PKTUSB -- Packet/Digital USB mode (dedicated port) */ RIG_MODE_PKTFM = (1<<12),/*!< \c PKTFM -- Packet/Digital FM mode (dedicated port) */ RIG_MODE_ECSSUSB = (1<<13),/*!< \c ECSSUSB -- Exalted Carrier Single Sideband USB */ RIG_MODE_ECSSLSB = (1<<14),/*!< \c ECSSLSB -- Exalted Carrier Single Sideband LSB */ RIG_MODE_FAX = (1<<15),/*!< \c FAX -- Facsimile Mode */ RIG_MODE_SAM = (1<<16),/*!< \c SAM -- Synchronous AM double sideband */ RIG_MODE_SAL = (1<<17),/*!< \c SAL -- Synchronous AM lower sideband */ RIG_MODE_SAH = (1<<18),/*!< \c SAH -- Synchronous AM upper (higher) sideband */ RIG_MODE_DSB = (1<<19), /*!< \c DSB -- Double sideband suppressed carrier */ } rmode_t; #endif struct rmode_name_t { rmode_t mode; const char *name; } modes[] = { { RIG_MODE_NONE, "NONE" }, { RIG_MODE_AM, "AM" }, { RIG_MODE_CW, "CW" }, { RIG_MODE_USB, "USB" }, { RIG_MODE_LSB, "LSB" }, { RIG_MODE_RTTY, "RTTY" }, { RIG_MODE_FM, "FM" }, { RIG_MODE_WFM, "WFM" }, { RIG_MODE_CWR, "CWR" }, { RIG_MODE_RTTYR, "RTTYR" }, { RIG_MODE_AMS, "AMS" }, { RIG_MODE_PKTLSB, "PKTLSB" }, { RIG_MODE_PKTUSB, "PKTUSB" }, { RIG_MODE_PKTFM, "PKTFM" } //, // C99 trailing commas in enumerations not yet in the C++ standard // { RIG_MODE_ECSSUSB, "ECSSUSB" }, // { RIG_MODE_ECSSLSB, "ECSSLSB" }, // { RIG_MODE_FAX, "FAX" } // the above are covered by our requirement that hamlib be >= 1.2.4 #if (defined(RIG_MODE_SAM) && defined(RIG_MODE_SAL) && defined(RIG_MODE_SAH)) , // C99 trailing commas in enumerations not yet in the C++ standard { RIG_MODE_SAM, "SAM" }, { RIG_MODE_SAL, "SAL" }, { RIG_MODE_SAH, "SAH" } #endif }; map mode_nums; map mode_names; void qso_selMode(rmode_t m) { qso_opMODE->value(mode_names[m].c_str()); } string modeString(rmode_t m) { return mode_names[m].c_str(); } void initOptionMenus() { qso_opMODE->clear(); list::iterator MD; list *pMD = 0; if (lmodes.empty() == false) pMD = &lmodes; else if (lmodeCMD.empty() == false) pMD = &lmodeCMD; if (pMD) { MD = pMD->begin(); while (MD != pMD->end()) { qso_opMODE->add( (*MD).SYMBOL.c_str()); MD++; } qso_opMODE->activate(); qso_opMODE->index(0); } else { qso_opMODE->deactivate(); } qso_opBW->clear(); list::iterator bw; list *pBW = 0; if (lbws.empty() == false) pBW = &lbws; else if (lbwCMD.empty() == false) pBW = &lbwCMD; if (pBW) { bw = pBW->begin(); while (bw != pBW->end()) { qso_opBW->add( (*bw).SYMBOL.c_str()); bw++; } qso_opBW->activate(); qso_opBW->index(0); } else { qso_opBW->deactivate(); } } void clearList() { freqlist.clear(); qso_opBrowser->clear(); } void updateSelect() { if (freqlist.empty()) return; for (size_t i = 0; i < freqlist.size(); i++) { qso_opBrowser->add(freqlist[i].str().c_str()); } } size_t updateList(long rf, int freq, string rmd, trx_mode md) { qrg_mode_t m; m.rmode = rmd; m.mode = md; m.rfcarrier = rf; m.carrier = freq; freqlist.push_back(m); sort(freqlist.begin(), freqlist.end()); vector::const_iterator pos = find(freqlist.begin(), freqlist.end(), m); if (pos != freqlist.end()) return pos - freqlist.begin(); else return 0; } size_t addtoList(long val) { qrg_mode_t m; m.rfcarrier = val; if (strlen(qso_opMODE->value())) m.rmode = qso_opMODE->value(); if (active_modem) { m.carrier = active_modem->get_freq(); m.mode = active_modem->get_mode(); } return updateList(val, m.carrier, m.rmode, m.mode); } bool readFreqList() { ifstream freqfile((HomeDir + "frequencies2.txt").c_str()); if (!freqfile) return false; string line; qrg_mode_t m; while (!getline(freqfile, line).eof()) { if (line[0] == '#') continue; istringstream is(line); is >> m; freqlist.push_back(m); } sort(freqlist.begin(), freqlist.end()); updateSelect(); freqfile.close(); return freqlist.size(); } void saveFreqList() { ofstream freqfile((HomeDir + "frequencies2.txt").c_str()); if (!freqfile) return; freqfile << "# rfcarrier rig_mode carrier mode\n"; if (freqlist.empty()) { freqfile.close(); return; } copy(freqlist.begin(), freqlist.end(), ostream_iterator(freqfile, "\n")); freqfile.close(); } void buildlist() { // calculate the column widths memset(fwidths, 0, sizeof(fwidths)); // these need to be a little wider than fl_width thinks fwidths[max_rmode] = fwidths[max_mode] = 10; fwidths[max_rfcarrier] += (int)ceil(fl_width("999999.999")); fwidths[max_rmode] += (int)ceil(fl_width("XXXX")); // find mode with longest shortname size_t s, smax = 0, mmax = 0; for (size_t i = 0; i < NUM_MODES; i++) { s = strlen(mode_info[i].sname); if (smax < s) { smax = s; mmax = i; } } fwidths[max_mode] += (int)ceil(fl_width(mode_info[mmax].sname)); if (readFreqList() == true) return; // Fl::lock(); updateList (1807000L, 1000, "USB", MODE_PSK31 ); updateList (3505000L, 800, "USB", MODE_CW); updateList (3580000L, 1000, "USB", MODE_PSK31 ); updateList (1000500L, 800, "USB", MODE_CW); updateList (10135000L, 1000, "USB", MODE_PSK31 ); updateList (7005000L, 800, "USB", MODE_CW); updateList (7030000L, 1000, "USB", MODE_PSK31 ); updateList (7070000L, 1000, "USB", MODE_PSK31 ); updateList (14005000L, 800, "USB", MODE_CW); updateList (14070000L, 1000, "USB", MODE_PSK31 ); updateList (18100000L, 1000, "USB", MODE_PSK31 ); updateList (21005000L, 800, "USB", MODE_CW); updateList (21070000L, 1000, "USB", MODE_PSK31 ); updateList (24920000L, 1000, "USB", MODE_PSK31 ); updateList (28005000L, 800, "USB", MODE_CW); updateList (28120000, 1000, "USB", MODE_PSK31 ); updateSelect(); // Fl::unlock(); } int cb_qso_opMODE() { #if USE_HAMLIB if (progdefaults.chkUSEHAMLIBis) hamlib_setmode(mode_nums[qso_opMODE->value()]); else #endif rigCAT_setmode(qso_opMODE->value()); return 0; } int cb_qso_opBW() { if (progdefaults.chkUSERIGCATis) // if (!progdefaults.chkUSEXMLRPCis) rigCAT_setwidth(qso_opBW->value()); return 0; } void sendFreq(long int f) { #if USE_HAMLIB if (progdefaults.chkUSEHAMLIBis) hamlib_setfreq(f); else #endif rigCAT_setfreq(f); } void qso_movFreq(Fl_Widget* w, void*) { cFreqControl *fc = (cFreqControl *)w; long int f; f = fc->value(); if (fc == qsoFreqDisp1) { qsoFreqDisp2->value(f); qsoFreqDisp3->value(f); } else if (fc == qsoFreqDisp2) { qsoFreqDisp1->value(f); qsoFreqDisp3->value(f); } else { qsoFreqDisp1->value(f); qsoFreqDisp2->value(f); } sendFreq(f); return; } void qso_selectFreq() { int n = qso_opBrowser->value(); if (!n) return; n -= 1; // transceiver frequency if (freqlist[n].rfcarrier > 0) { qsoFreqDisp1->value(freqlist[n].rfcarrier); qsoFreqDisp2->value(freqlist[n].rfcarrier); qsoFreqDisp3->value(freqlist[n].rfcarrier); sendFreq(freqlist[n].rfcarrier); } // transceiver mode if (freqlist[n].rmode != "NONE") { qso_opMODE->value(freqlist[n].rmode.c_str()); cb_qso_opMODE(); } // modem type & audio sub carrier if (freqlist[n].mode != NUM_MODES) { if (freqlist[n].mode != active_modem->get_mode()) init_modem_sync(freqlist[n].mode); if (freqlist[n].carrier > 0) active_modem->set_freq(freqlist[n].carrier); } } void qso_setFreq() { int n = qso_opBrowser->value(); if (!n) return; n -= 1; // transceiver frequency if (freqlist[n].rfcarrier > 0) { qsoFreqDisp->value(freqlist[n].rfcarrier); sendFreq(freqlist[n].rfcarrier); } } void qso_delFreq() { int v = qso_opBrowser->value() - 1; if (v >= 0) { freqlist.erase(freqlist.begin() + v); qso_opBrowser->remove(v + 1); } } void qso_addFreq() { long freq = qsoFreqDisp->value(); if (freq) { size_t pos = addtoList(freq); qso_opBrowser->insert(pos+1, freqlist[pos].str().c_str()); } } void setTitle() { if (windowTitle.length() > 0) { txtRigName->label(windowTitle.c_str()); txtRigName->redraw_label(); } else { txtRigName->label(); txtRigName->redraw_label(); } } bool init_Xml_RigDialog() { LOG_DEBUG("xml rig"); initOptionMenus(); clearList(); buildlist(); windowTitle = xmlrig.rigTitle; setTitle(); return true; } bool init_NoRig_RigDialog() { LOG_DEBUG("no rig"); qso_opBW->deactivate(); qso_opMODE->clear(); for (size_t i = 0; i < sizeof(modes)/sizeof(modes[0]); i++) { qso_opMODE->add(modes[i].name); } LSBmodes.clear(); LSBmodes.push_back("LSB"); LSBmodes.push_back("CWR"); LSBmodes.push_back("RTTY"); LSBmodes.push_back("PKTLSB"); qso_opMODE->index(0); qso_opMODE->activate(); clearList(); buildlist(); windowTitle = _("Enter Xcvr Freq"); setTitle(); return true; } #if USE_HAMLIB bool init_Hamlib_RigDialog() { LOG_DEBUG("hamlib"); qso_opBW->deactivate(); qso_opMODE->clear(); for (size_t i = 0; i < sizeof(modes)/sizeof(modes[0]); i++) { mode_nums[modes[i].name] = modes[i].mode; mode_names[modes[i].mode] = modes[i].name; qso_opMODE->add(modes[i].name); } clearList(); buildlist(); windowTitle = "Hamlib "; windowTitle.append(xcvr->getName()); setTitle(); return true; } #endif fldigi-3.21.80/src/rigcontrol/serial.cxx0000664000175000017500000004312312313064025015021 00000000000000// ---------------------------------------------------------------------------- // serial.cxx - Serial I/O class // // Copyright (C) 2007-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "serial.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); #ifndef __MINGW32__ #include #include #include #include #include #include #include #include using namespace std; Cserial::Cserial() { device = "/dev/ttyS0"; baud = 1200; timeout = 50; //msec retries = 5; rts = dtr = false; rtsptt = dtrptt = false; rtscts = false; status = 0; stopbits = 2; fd = -1; restore_tio = true; } Cserial::~Cserial() { ClosePort(); } /////////////////////////////////////////////////////// // Function name : Cserial::OpenPort // Description : Opens the port specified by strPortName // Return type : BOOL // Argument : c_string strPortName /////////////////////////////////////////////////////// bool Cserial::OpenPort() { #ifdef __CYGWIN__ com_to_tty(device); #endif int oflags = O_RDWR | O_NOCTTY | O_NDELAY; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif if ((fd = open( device.c_str(), oflags)) < 0) return false; // save current port settings tcflush (fd, TCIFLUSH); tcgetattr (fd, &oldtio); newtio = oldtio; // 8 data bits newtio.c_cflag &= ~CSIZE; newtio.c_cflag |= CS8; // enable receiver, set local mode newtio.c_cflag |= (CLOCAL | CREAD); // no parity newtio.c_cflag &= ~PARENB; if (stopbits == 1) // 1 stop bit newtio.c_cflag &= ~CSTOPB; else // 2 stop bit newtio.c_cflag |= CSTOPB; if (rtscts) // h/w handshake newtio.c_cflag |= CRTSCTS; else // no h/w handshake newtio.c_cflag &= ~CRTSCTS; // raw input newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // raw output newtio.c_oflag &= ~OPOST; // software flow control disabled newtio.c_iflag &= ~IXON; // do not translate CR to NL newtio.c_iflag &= ~ICRNL; switch(baud) { case 300: speed = B300; break; case 1200: speed = B1200; break; case 2400: speed = B2400; break; case 4800: speed = B4800; break; case 9600: speed = B9600; break; case 19200: speed = B19200; break; case 38400: speed = B38400; break; case 57600: speed = B57600; break; case 115200: speed = B115200; break; default: speed = B1200; } cfsetispeed(&newtio, speed); cfsetospeed(&newtio, speed); tcsetattr (fd, TCSANOW, &newtio); ioctl(fd, TIOCMGET, &status); origstatus = status; if (dtr) status |= TIOCM_DTR; // set the DTR bit else status &= ~TIOCM_DTR; // clear the DTR bit if (rtscts == false) { // rts OK for ptt if RTSCTS not used if (rts) status |= TIOCM_RTS; // set the RTS bit else status &= ~TIOCM_RTS; // clear the RTS bit } ioctl(fd, TIOCMSET, &status); return true; } /////////////////////////////////////////////////////// // Function name : Cserial::setPTT // Return type : void /////////////////////////////////////////////////////// void Cserial::SetPTT(bool b) { if (fd < 0) { LOG_DEBUG("PTT fd < 0"); return; } if (dtrptt || rtsptt) { ioctl(fd, TIOCMGET, &status); LOG_DEBUG("H/W PTT %d, status %X", b, status); if (b == true) { // ptt enabled if (dtrptt && dtr) status &= ~TIOCM_DTR; // toggle low if (dtrptt && !dtr) status |= TIOCM_DTR; // toggle high if (rtscts == false) { if (rtsptt && rts) status &= ~TIOCM_RTS; // toggle low if (rtsptt && !rts) status |= TIOCM_RTS; // toggle high } } else { // ptt disabled if (dtrptt && dtr) status |= TIOCM_DTR; // toggle high if (dtrptt && !dtr) status &= ~TIOCM_DTR; // toggle low if (rtscts == false) { if (rtsptt && rts) status |= TIOCM_RTS; // toggle high if (rtsptt && !rts) status &= ~TIOCM_RTS; // toggle low } } LOG_DEBUG("Status %02X, %s", status & 0xFF, uint2bin(status, 8)); ioctl(fd, TIOCMSET, &status); } LOG_DEBUG("No PTT specified"); } /////////////////////////////////////////////////////// // Function name : Cserial::ClosePort // Description : Closes the Port // Return type : void /////////////////////////////////////////////////////// void Cserial::ClosePort() { if (fd < 0) return; LOG_DEBUG("Serial port closed, fd = %d", fd); if (restore_tio) { ioctl(fd, TIOCMSET, &origstatus); tcsetattr (fd, TCSANOW, &oldtio); } close(fd); fd = -1; return; } bool Cserial::IOselect () { fd_set rfds; struct timeval tv; int retval; FD_ZERO (&rfds); FD_SET (fd, &rfds); tv.tv_sec = timeout/1000; tv.tv_usec = (timeout % 1000) * 1000; retval = select (FD_SETSIZE, &rfds, (fd_set *)0, (fd_set *)0, &tv); if (retval <= 0) // no response from serial port or error returned return false; return true; } /////////////////////////////////////////////////////// // Function name : Cserial::ReadBuffer // Description : Reads upto nchars from the selected port // Return type : # characters received // Argument : pointer to buffer; # chars to read /////////////////////////////////////////////////////// int Cserial::ReadBuffer (unsigned char *buf, int nchars) { if (fd < 0) return 0; int retnum, nread = 0; while (nchars > 0) { if (!IOselect()) { return nread; } retnum = read (fd, (char *)(buf + nread), nchars); if (retnum < 0) return 0;//nread; if (retnum == 0) return nread; nread += retnum; nchars -= retnum; } return nread; } /////////////////////////////////////////////////////// // Function name : Cserial::WriteBuffer // Description : Writes a string to the selected port // Return type : BOOL // Argument : BYTE by /////////////////////////////////////////////////////// int Cserial::WriteBuffer(unsigned char *buff, int n) { if (fd < 0) return 0; int ret = write (fd, buff, n); return ret; } /////////////////////////////////////////////////////// // Function name : Cserial::FlushBuffer // Description : flushes the pending rx chars // Return type : void /////////////////////////////////////////////////////// void Cserial::FlushBuffer() { if (fd < 0) return; tcflush (fd, TCIFLUSH); } #else // __MINGW32__ using namespace std; /////////////////////////////////////////////////////// // Function name : Cserial::OpenPort // Description : Opens the port specified by strPortName // Return type : BOOL // Argument : CString strPortName /////////////////////////////////////////////////////// BOOL Cserial::OpenPort() { string COMportname = "//./"; tty_to_com(device); COMportname += device; hComm = CreateFile(COMportname.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); if(hComm == INVALID_HANDLE_VALUE) { LOG_ERROR("Invalid handle"); return FALSE; } if (!ConfigurePort( baud, 8, FALSE, NOPARITY, stopbits)) { CloseHandle(hComm); hComm = INVALID_HANDLE_VALUE; LOG_ERROR("Could not configure port"); return FALSE; } FlushBuffer(); return TRUE; } /////////////////////////////////////////////////////// // Function name : Cserial::ClosePort // Description : Closes the Port // Return type : void /////////////////////////////////////////////////////// void Cserial::ClosePort() { if (hComm) { if (restore_tio) bPortReady = SetCommTimeouts (hComm, &CommTimeoutsSaved); CloseHandle(hComm); hComm = INVALID_HANDLE_VALUE; } return; } int Cserial::ReadData (unsigned char *buf, int nchars) { if (!hComm) return FALSE; DWORD dwRead = 0; ReadFile(hComm, buf, nchars, &dwRead, NULL); return (int) dwRead; } BOOL Cserial::ReadByte(unsigned char & by) { static BYTE byResByte[2]; if (ReadData(byResByte, 1) == 1) { by = byResByte[0]; return true; } return false; } void Cserial::FlushBuffer() { unsigned char c; while (ReadByte(c) == true); } /////////////////////////////////////////////////////// // Function name : Cserial::WriteByte // Description : Writes a Byte to teh selected port // Return type : BOOL // Argument : BYTE by /////////////////////////////////////////////////////// BOOL Cserial::WriteByte(UCHAR by) { if (!hComm) return FALSE; nBytesWritten = 0; if (WriteFile(hComm,&by,1,&nBytesWritten,NULL)==0) return FALSE; return TRUE; } /////////////////////////////////////////////////////// // Function name : Cserial::WriteBuffer // Description : Writes a string to the selected port // Return type : BOOL // Argument : BYTE by /////////////////////////////////////////////////////// int Cserial::WriteBuffer(unsigned char *buff, int n) { if (!hComm) return -1; WriteFile (hComm, buff, n, &nBytesWritten, NULL); if (!nBytesWritten) { LOG_DEBUG("Reopening comm port"); ClosePort(); OpenPort(); WriteFile (hComm, buff, n, &nBytesWritten, NULL); } return nBytesWritten; } /////////////////////////////////////////////////////// // Function name : Cserial::SetCommunicationTimeouts // Description : Sets the timeout for the selected port // Return type : BOOL // Argument : DWORD ReadIntervalTimeout // Argument : DWORD ReadTotalTimeoutMultiplier // Argument : DWORD ReadTotalTimeoutConstant // Argument : DWORD WriteTotalTimeoutMultiplier // Argument : DWORD WriteTotalTimeoutConstant /////////////////////////////////////////////////////// BOOL Cserial::SetCommunicationTimeouts( DWORD ReadIntervalTimeout, // msec DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant, DWORD WriteTotalTimeoutMultiplier, DWORD WriteTotalTimeoutConstant ) { CommTimeouts.ReadIntervalTimeout = ReadIntervalTimeout; CommTimeouts.ReadTotalTimeoutMultiplier = ReadTotalTimeoutMultiplier; CommTimeouts.ReadTotalTimeoutConstant = ReadTotalTimeoutConstant; CommTimeouts.WriteTotalTimeoutConstant = WriteTotalTimeoutConstant; CommTimeouts.WriteTotalTimeoutMultiplier = WriteTotalTimeoutMultiplier; LOG_DEBUG("\n\ Read Interval Timeout............... %8ld %8ld\n\ Read Total Timeout Multiplier....... %8ld %8ld\n\ Read Total Timeout Constant Timeout. %8ld %8ld\n\ Write Total Timeout Constant........ %8ld %8ld\n\ Write Total Timeout Multiplier...... %8ld %8ld", CommTimeoutsSaved.ReadIntervalTimeout, CommTimeouts.ReadIntervalTimeout, CommTimeoutsSaved.ReadTotalTimeoutMultiplier, CommTimeouts.ReadTotalTimeoutMultiplier, CommTimeoutsSaved.ReadTotalTimeoutConstant, CommTimeouts.ReadTotalTimeoutConstant, CommTimeoutsSaved.WriteTotalTimeoutConstant, CommTimeouts.WriteTotalTimeoutConstant, CommTimeoutsSaved.WriteTotalTimeoutMultiplier, CommTimeouts.WriteTotalTimeoutMultiplier); bPortReady = SetCommTimeouts (hComm, &CommTimeouts); if(bPortReady ==0) { CloseHandle(hComm); hComm = INVALID_HANDLE_VALUE; return FALSE; } return TRUE; } /* * ReadIntervalTimeout * * The maximum time allowed to elapse between the arrival of two bytes on the * communications line, in milliseconds. During a ReadFile operation, the time * period begins when the first byte is received. If the interval between the * arrival of any two bytes exceeds this amount, the ReadFile operation is * completed and any buffered data is returned. A value of zero indicates that * interval time-outs are not used. * * A value of MAXDWORD, combined with zero values for both the * ReadTotalTimeoutConstant and ReadTotalTimeoutMultiplier members, specifies * that the read operation is to return immediately with the bytes that have * already been received, even if no bytes have been received. * * ReadTotalTimeoutMultiplier * * The multiplier used to calculate the total time-out period for read * operations, in milliseconds. For each read operation, this value is * multiplied by the requested number of bytes to be read. * * ReadTotalTimeoutConstant * * A constant used to calculate the total time-out period for read operations, * in milliseconds. For each read operation, this value is added to the product * of the ReadTotalTimeoutMultiplier member and the requested number of bytes. * * A value of zero for both the ReadTotalTimeoutMultiplier and * ReadTotalTimeoutConstant members indicates that total time-outs are not * used for read operations. * * WriteTotalTimeoutMultiplier * * The multiplier used to calculate the total time-out period for write * operations, in milliseconds. For each write operation, this value is * multiplied by the number of bytes to be written. * * WriteTotalTimeoutConstant * * A constant used to calculate the total time-out period for write operations, * in milliseconds. For each write operation, this value is added to the product * of the WriteTotalTimeoutMultiplier member and the number of bytes to be * written. * * A value of zero for both the WriteTotalTimeoutMultiplier and * WriteTotalTimeoutConstant members indicates that total time-outs are not * used for write operations. * * Remarks * * If an application sets ReadIntervalTimeout and ReadTotalTimeoutMultiplier to * MAXDWORD and sets ReadTotalTimeoutConstant to a value greater than zero and * less than MAXDWORD, one of the following occurs when the ReadFile function * is called: * * If there are any bytes in the input buffer, ReadFile returns immediately * with the bytes in the buffer. * * If there are no bytes in the input buffer, ReadFile waits until a byte * arrives and then returns immediately. * * If no bytes arrive within the time specified by ReadTotalTimeoutConstant, * ReadFile times out. */ BOOL Cserial::SetCommTimeout() { return SetCommunicationTimeouts ( MAXDWORD, // Read Interval Timeout MAXDWORD, // Read Total Timeout Multiplier 10, // Read Total Timeout Constant 50, // Write Total Timeout Constant 5 // Write Total Timeout Multiplier ); } /////////////////////////////////////////////////////// // Function name : ConfigurePort // Description : Configures the Port // Return type : BOOL // Argument : DWORD BaudRate // Argument : BYTE ByteSize // Argument : DWORD fParity // Argument : BYTE Parity // Argument : BYTE StopBits /////////////////////////////////////////////////////// BOOL Cserial::ConfigurePort(DWORD BaudRate, BYTE ByteSize, DWORD dwParity, BYTE Parity, BYTE StopBits) { if((bPortReady = GetCommState(hComm, &dcb))==0) { LOG_ERROR("GetCommState error on %s", device.c_str()); CloseHandle(hComm); hComm = INVALID_HANDLE_VALUE; return FALSE; } dcb.BaudRate = BaudRate; dcb.ByteSize = ByteSize; dcb.Parity = Parity ; dcb.StopBits = (StopBits == 1 ? ONESTOPBIT : TWOSTOPBITS); dcb.fBinary = TRUE; dcb.fDsrSensitivity = FALSE; dcb.fParity = dwParity; dcb.fOutX = FALSE; dcb.fInX = FALSE; dcb.fNull = FALSE; dcb.fAbortOnError = TRUE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; if (dtr) dcb.fDtrControl = DTR_CONTROL_ENABLE; else dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fDsrSensitivity = FALSE; if (rtscts) dcb.fRtsControl = RTS_CONTROL_ENABLE; else { if (rts) dcb.fRtsControl = RTS_CONTROL_ENABLE; else dcb.fRtsControl = RTS_CONTROL_DISABLE; } bPortReady = SetCommState(hComm, &dcb); if(bPortReady == 0) { CloseHandle(hComm); hComm = INVALID_HANDLE_VALUE; LOG_ERROR("Port not available"); return FALSE; } if ( (bPortReady = GetCommTimeouts (hComm, &CommTimeoutsSaved) ) == 0) return FALSE; return SetCommTimeout(); } /////////////////////////////////////////////////////// // Function name : Cserial::setPTT // Return type : void /////////////////////////////////////////////////////// void Cserial::SetPTT(bool b) { if ( !(dtrptt || rtsptt) ) return; if(hComm == INVALID_HANDLE_VALUE) { LOG_ERROR("Invalid handle"); return; } LOG_DEBUG("PTT = %d, DTRptt = %d, DTR = %d, RTSptt = %d, RTS = %d", b, dtrptt, dtr, rtsptt, rts); if (b == true) { // ptt enabled if (dtrptt && dtr) dcb.fDtrControl = DTR_CONTROL_DISABLE; if (dtrptt && !dtr) dcb.fDtrControl = DTR_CONTROL_ENABLE; if (rtscts == false) { if (rtsptt && rts) dcb.fRtsControl = RTS_CONTROL_DISABLE; if (rtsptt && !rts) dcb.fRtsControl = RTS_CONTROL_ENABLE; } } else { // ptt disabled if (dtrptt && dtr) dcb.fDtrControl = DTR_CONTROL_ENABLE; if (dtrptt && !dtr) dcb.fDtrControl = DTR_CONTROL_DISABLE; if (rtscts == false) { if (rtsptt && rts) dcb.fRtsControl = RTS_CONTROL_ENABLE; if (rtsptt && !rts) dcb.fRtsControl = RTS_CONTROL_DISABLE; } } SetCommState(hComm, &dcb); } #endif //__MINGW32__ #ifdef __WOE32__ #include #include "re.h" // convert COMx to /dev/ttySy with y = x - 1 void com_to_tty(string& port) { re_t re("com([0-9]+)", REG_EXTENDED | REG_ICASE); if (!(re.match(port.c_str()) && re.nsub() == 2)) return; stringstream ss; int n; ss << re.submatch(1); ss >> n; if (--n < 0) n = 0; ss.clear(); ss.str(""); ss << "/dev/ttyS" << n; ss.seekp(0); port = ss.str(); } // convert /dev/ttySx to COMy with y = x + 1 void tty_to_com(string& port) { re_t re("/dev/tty.([0-9]+)", REG_EXTENDED | REG_ICASE); if (!(re.match(port.c_str()) && re.nsub() == 2)) return; stringstream ss; int n; ss << re.submatch(1); ss >> n; ss.clear(); ss.str(""); ss << "COM" << n + 1; ss.seekp(0); port = ss.str(); } #endif fldigi-3.21.80/src/rigcontrol/rigio.cxx0000664000175000017500000007444312313064025014664 00000000000000// ---------------------------------------------------------------------------- // rigio.cxx // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #ifdef RIGCATTEST #include "rigCAT.h" #else #include "fl_digi.h" #include "misc.h" #include "configuration.h" #endif #include "rigsupport.h" #include "rigxml.h" #include "trx.h" #include "serial.h" #include "rigio.h" #include "debug.h" #include "threads.h" #include "qrunner.h" #include "confdialog.h" #include "status.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); using namespace std; Cserial rigio; static pthread_mutex_t rigCAT_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_t rigCAT_thread; static bool rigCAT_exit = false; static bool rigCAT_open = false; static bool rigCAT_bypass = false; static string sRigWidth = ""; static string sRigMode = ""; static long long llFreq = 0; static bool nonCATrig = false; static void *rigCAT_loop(void *args); #define RXBUFFSIZE 2000 static unsigned char replybuff[RXBUFFSIZE+1]; static unsigned char retbuf[3]; bool sendCommand (string s, int retnbr, int waitval) { int numwrite = (int)s.length(); int readafter = 0; int numread = 0; int retval = 0; numread = retnbr; if (progdefaults.RigCatECHO) numread += numwrite; readafter = waitval + (int) ceilf ( numread * (9 + progdefaults.RigCatStopbits) * 1000.0 / rigio.Baud() ); LOG_DEBUG("%s", str2hex(s.data(), s.length())); retval = rigio.WriteBuffer((unsigned char *)s.c_str(), numwrite); if (retval <= 0) LOG_VERBOSE("Write error %d", retval); if (retnbr == 0) return true; memset(replybuff, 0, RXBUFFSIZE + 1); numread = 0; while (readafter > 50) { MilliSleep(50); Fl::awake(); readafter -= 50; } if (readafter) { MilliSleep(readafter); Fl::awake(); } while (numread < RXBUFFSIZE) { memset(retbuf, 0, 2); if (rigio.ReadBuffer(retbuf, 1) == 0) break; replybuff[numread] = retbuf[0]; numread++; } LOG_DEBUG("reply %s", str2hex(replybuff, numread)); if (numread > retnbr) { memmove(replybuff, replybuff + numread - retnbr, retnbr); numread = retnbr; } return (numread == retnbr); } string to_bcd_be(long long freq, int len) { string bcd = ""; unsigned char a; int numchars = len / 2; if (len & 1) numchars ++; for (int i = 0; i < numchars; i++) { a = 0; a |= freq%10; freq /= 10; a |= (freq%10)<<4; freq /= 10; bcd += a; } return bcd; } string to_bcd(long long freq, int len) { string bcd = ""; string bcd_be = to_bcd_be(freq, len); int bcdlen = bcd_be.size(); for (int i = bcdlen - 1; i >= 0; i--) bcd += bcd_be[i]; return bcd; } long long fm_bcd (size_t p, int len) { int i; long long f = 0; int numchars = len/2; if (len & 1) numchars ++; for (i = 0; i < numchars; i++) { f *=10; f += (replybuff[p + i] >> 4) & 0x0F; f *= 10; f += replybuff[p + i] & 0x0F; } return f; } long long fm_bcd_be(size_t p, int len) { unsigned char temp; int numchars = len/2; if (len & 1) numchars++; for (int i = 0; i < numchars / 2; i++) { temp = replybuff[p + i]; replybuff[p + i] = replybuff[p + numchars -1 - i]; replybuff[p + numchars -1 - i] = temp; } return fm_bcd(p, len); } string to_binary_be(long long freq, int len) { string bin = ""; for (int i = 0; i < len; i++) { bin += freq & 0xFF; freq >>= 8; } return bin; } string to_binary(long long freq, int len) { string bin = ""; string bin_be = to_binary_be(freq, len); int binlen = bin_be.size(); for (int i = binlen - 1; i >= 0; i--) bin += bin_be[i]; return bin; } long long fm_binary(size_t p, int len) { int i; long long f = 0; for (i = 0; i < len; i++) { f *= 256; f += replybuff[p + i]; } return f; } long long fm_binary_be(size_t p, int len) { unsigned char temp; int numchars = len/2; if (len & 1) numchars++; for (int i = 0; i < numchars / 2; i++) { temp = replybuff[p + i]; replybuff[p + i] = replybuff[p + numchars -1 - i]; replybuff[p + numchars -1 - i] = temp; } return fm_binary(p, len); } string to_decimal_be(long long d, int len) { string sdec_be = ""; for (int i = 0; i < len; i++) { sdec_be += (char)((d % 10) + '0'); d /= 10; } return sdec_be; } string to_decimal(long long d, int len) { string sdec = ""; string sdec_be = to_decimal_be(d, len); int bcdlen = sdec_be.size(); for (int i = bcdlen - 1; i >= 0; i--) sdec += sdec_be[i]; return sdec; } long long fm_decimal(size_t p, int len) { long long d = 0; for (int i = 0; i < len; i++) { d *= 10; d += replybuff[p + i] - '0'; } return d; } long long fm_decimal_be(size_t p, int len) { unsigned char temp; int numchars = len/2; if (len & 1) numchars++; for (int i = 0; i < numchars / 2; i++) { temp = replybuff[p + i]; replybuff[p + i] = replybuff[p + numchars -1 - i]; replybuff[p + numchars -1 - i] = temp; } return fm_decimal(p, len); } string to_freqdata(DATA d, long long f) { int num, den; num = 100; den = (int)(d.resolution * 100); if (d.size == 0) return ""; if (d.dtype == "BCD") { if (d.reverse == true) return to_bcd_be((long long int)(f * num / den), d.size); else return to_bcd((long long int)(f * num / den), d.size); } else if (d.dtype == "BINARY") { if (d.reverse == true) return to_binary_be((long long int)(f * num / den), d.size); else return to_binary((long long int)(f * num / den), d.size); } else if (d.dtype == "DECIMAL") { if (d.reverse == true) return to_decimal_be((long long int)(f * num / den), d.size); else return to_decimal((long long int)(f * num / den), d.size); } return ""; } long long fm_freqdata(DATA d, size_t p) { int num, den; num = (int)(d.resolution * 100); den = 100; long long fret = 0; if (d.dtype == "BCD") { if (d.reverse == true) fret = (long long int)(fm_bcd_be(p, d.size) * num / den); else fret = (long long int)(fm_bcd(p, d.size) * num / den); } else if (d.dtype == "BINARY") { if (d.reverse == true) fret = (long long int)(fm_binary_be(p, d.size) * num / den); else fret = (long long int)(fm_binary(p, d.size) * num / den); } else if (d.dtype == "DECIMAL") { if (d.reverse == true) fret = (long long int)(fm_decimal_be(p, d.size) * num / den); else fret = (long long int)(fm_decimal(p, d.size) * num / den); } return fret; } long long rigCAT_getfreq(int retries, bool &failed, int waitval) { XMLIOS modeCmd; list::iterator itrCmd; string strCmd; size_t p = 0, len1 = 0, len2 = 0, pData = 0; long long f = 0; failed = false; if (nonCATrig) { failed = true; return progStatus.noCATfreq; } itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == "GETFREQ") break; ++itrCmd; } if (itrCmd == commands.end()) { failed = true; return progStatus.noCATfreq; // get_freq command is not defined! } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if ( !modeCmd.info.size() ) { failed = true; return 0; } for (list::iterator preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL != modeCmd.info) continue; XMLIOS rTemp = *preply; len1 = rTemp.str1.size(); len2 = rTemp.str2.size(); // for (int n = 0; n < progdefaults.RigCatRetries; n++) { for (int n = 0; n < retries; n++) { if (n && progdefaults.RigCatTimeout > 0) { int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } } // send the command if ( !sendCommand(strCmd, rTemp.size, waitval) ) { LOG_VERBOSE("sendCommand failed"); goto retry_get_freq; } // check the pre data string p = 0; pData = 0; if (len1) { for (size_t i = 0; i < len1; i++) { if ((char)rTemp.str1[i] != (char)replybuff[i]) { LOG_VERBOSE("failed pre data string test @ %" PRIuSZ, i); goto retry_get_freq; } } p = len1; } if (rTemp.fill1) p += rTemp.fill1; pData = p; if (rTemp.data.dtype == "BCD") { p += rTemp.data.size / 2; if (rTemp.data.size & 1) p++; } else p += rTemp.data.size; // check the post data string if (rTemp.fill2) p += rTemp.fill2; if (len2) { for (size_t i = 0; i < len2; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) { LOG_VERBOSE("failed post data string test @ %d", static_cast(i)); goto retry_get_freq; } } // convert the data field f = fm_freqdata(rTemp.data, pData); if ( f >= rTemp.data.min && f <= rTemp.data.max) return f; LOG_VERBOSE("freq: %d", static_cast(f)); retry_get_freq: ; } } if (progdefaults.RigCatVSP == false) LOG_VERBOSE("Retries failed"); failed = true; return 0; } void rigCAT_setfreq(long long f) { { guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; } XMLIOS modeCmd; list::iterator itrCmd; string strCmd; progStatus.noCATfreq = f; if (nonCATrig) { return; } // LOG_DEBUG("set frequency %lld", f); itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == "SETFREQ") break; ++itrCmd; } if (itrCmd == commands.end()) { LOG_VERBOSE("SET_FREQ not defined"); return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); strCmd.append( to_freqdata(modeCmd.data, f) ); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { MilliSleep(50); guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; if (sendCommand(strCmd, rTemp.size, progdefaults.RigCatWait)) return; } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { MilliSleep(50); guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; if (sendCommand(strCmd, 0, progdefaults.RigCatWait)) return; } } if (progdefaults.RigCatVSP == false) LOG_VERBOSE("Retries failed"); } string rigCAT_getmode() { { guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return ""; } XMLIOS modeCmd; list::iterator itrCmd; list::iterator mode; list *pmode; string strCmd, mData; size_t len; if (nonCATrig) return progStatus.noCATmode; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == "GETMODE") break; ++itrCmd; } if (itrCmd == commands.end()) return progStatus.noCATmode; modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (!modeCmd.info.size()) return ""; for (list::iterator preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL != modeCmd.info) continue; XMLIOS rTemp = *preply; for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (progdefaults.RigCatTimeout > 50) { int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } } size_t p = 0, pData = 0; // send the command if (!sendCommand(strCmd, rTemp.size, progdefaults.RigCatWait)) goto retry_get_mode; // check the pre data string len = rTemp.str1.size(); if (len) { for (size_t i = 0; i < len; i++) if ((char)rTemp.str1[i] != (char)replybuff[i]) { LOG_VERBOSE("failed pre data string test @ %" PRIuSZ, i); goto retry_get_mode; } p = len; } if (rTemp.fill1) p += rTemp.fill1; pData = p; // check the post data string p += rTemp.data.size; len = rTemp.str2.size(); if (rTemp.fill2) p += rTemp.fill2; if (len) { for (size_t i = 0; i < len; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) goto retry_get_mode; } // convert the data field mData = ""; for (int i = 0; i < rTemp.data.size; i++) mData += (char)replybuff[pData + i]; // for FT100 and the ilk that use bit fields if (rTemp.data.size == 1) { unsigned char d = mData[0]; if (rTemp.data.shiftbits) d >>= rTemp.data.shiftbits; d &= rTemp.data.andmask; mData[0] = d; } if (lmodes.empty() == false) pmode = &lmodes; else if (lmodeREPLY.empty() == false) pmode = &lmodeREPLY; else goto retry_get_mode; mode = pmode->begin(); while (mode != pmode->end()) { if ((*mode).BYTES == mData) break; mode++; } if (mode != pmode->end()) return ((*mode).SYMBOL); retry_get_mode: ; } } if (progdefaults.RigCatVSP == false) LOG_VERBOSE("Retries failed"); return ""; } void rigCAT_setmode(const string& md) { { guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; } XMLIOS modeCmd; list::iterator itrCmd; string strCmd; progStatus.noCATmode = md; if (nonCATrig) { return; } itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == "SETMODE") break; ++itrCmd; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if ( modeCmd.data.size > 0 ) { list::iterator mode; list *pmode; if (lmodes.empty() == false) pmode = &lmodes; else if (lmodeCMD.empty() == false) pmode = &lmodeCMD; else return; mode = pmode->begin(); while (mode != pmode->end()) { if ((*mode).SYMBOL == md) break; mode++; } if (mode != pmode->end()) strCmd.append( (*mode).BYTES ); } if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { MilliSleep(50); guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; if (sendCommand(strCmd, rTemp.size, progdefaults.RigCatWait)) return; } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { MilliSleep(50); guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; if (sendCommand(strCmd, 0, progdefaults.RigCatWait)) return; } } if (progdefaults.RigCatVSP == false) LOG_VERBOSE("Retries failed"); } string rigCAT_getwidth() { { guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return ""; } XMLIOS modeCmd; list::iterator itrCmd; list::iterator bw; list *pbw; string strCmd, mData; size_t len = 0, p = 0, pData = 0; if (nonCATrig) return progStatus.noCATwidth; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == "GETBW") break; ++itrCmd; } if (itrCmd == commands.end()) return ""; modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (!modeCmd.info.size()) return ""; for (list::iterator preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL != modeCmd.info) continue; XMLIOS rTemp = *preply; for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (progdefaults.RigCatTimeout > 50) { int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } } p = 0; pData = 0; // send the command if ( !sendCommand(strCmd, rTemp.size, progdefaults.RigCatWait) ) goto retry_get_width; // check the pre data string len = rTemp.str1.size(); if (len) { for (size_t i = 0; i < len; i++) if ((char)rTemp.str1[i] != (char)replybuff[i]) { LOG_VERBOSE("failed pre data string test @ %" PRIuSZ, i); goto retry_get_width; } p = pData = len; } if (rTemp.fill1) p += rTemp.fill1; pData = p; p += rTemp.data.size; // check the post data string if (rTemp.fill2) p += rTemp.fill2; len = rTemp.str2.size(); if (len) { for (size_t i = 0; i < len; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) goto retry_get_width; } // convert the data field mData = ""; for (int i = 0; i < rTemp.data.size; i++) mData += (char)replybuff[pData + i]; // new for FT100 and the ilk that use bit fields if (rTemp.data.size == 1) { unsigned char d = mData[0]; if (rTemp.data.shiftbits) d >>= rTemp.data.shiftbits; d &= rTemp.data.andmask; mData[0] = d; } if (lbws.empty() == false) pbw = &lbws; else if (lbwREPLY.empty() == false) pbw = &lbwREPLY; else goto retry_get_width; bw = pbw->begin(); while (bw != pbw->end()) { if ((*bw).BYTES == mData) break; bw++; } if (bw != pbw->end()) return ((*bw).SYMBOL); retry_get_width: ; } } if (progdefaults.RigCatVSP == false) LOG_VERBOSE("Retries failed"); return ""; } void rigCAT_setwidth(const string& w) { { guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; } XMLIOS modeCmd; list::iterator itrCmd; string strCmd; if (nonCATrig) { progStatus.noCATwidth = w; return; } itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == "SETBW") break; ++itrCmd; } if (itrCmd == commands.end()) { progStatus.noCATwidth = w; return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if ( modeCmd.data.size > 0 ) { list::iterator bw; list *pbw; if (lbws.empty() == false) pbw = &lbws; else if (lbwCMD.empty() == false) pbw = &lbwCMD; else return; bw = pbw->begin(); while (bw != pbw->end()) { if ((*bw).SYMBOL == w) break; bw++; } if (bw != pbw->end()) strCmd.append( (*bw).BYTES ); } if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { MilliSleep(50); guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; if (sendCommand(strCmd, rTemp.size, progdefaults.RigCatWait)) return; } } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { MilliSleep(50); guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; if (sendCommand(strCmd, 0, progdefaults.RigCatWait)) return; } } LOG_VERBOSE("Retries failed"); } void rigCAT_pttON() { { guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; } XMLIOS modeCmd; list::iterator itrCmd; string strCmd; rigio.SetPTT(1); // always execute the h/w ptt if enabled if (nonCATrig) return; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == "PTTON") break; ++itrCmd; } if (itrCmd == commands.end()) return; modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { MilliSleep(50); guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; if (sendCommand(strCmd, rTemp.size, progdefaults.RigCatWait)) return; } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { MilliSleep(50); guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; if (sendCommand(strCmd, 0, progdefaults.RigCatWait)) return; } } LOG_VERBOSE("Retries failed"); } void rigCAT_pttOFF() { { guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; } XMLIOS modeCmd; list::iterator itrCmd; string strCmd; rigio.SetPTT(0); // always execute the h/w ptt if enabled if (nonCATrig) return; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == "PTTOFF") break; ++itrCmd; } if (itrCmd == commands.end()) return; modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { MilliSleep(50); guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; if (sendCommand(strCmd, rTemp.size, progdefaults.RigCatWait)) return; } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { MilliSleep(50); guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; if (sendCommand(strCmd, 0, progdefaults.RigCatWait)) return; } } LOG_VERBOSE("Retries failed"); } void rigCAT_sendINIT(const string& icmd, int multiplier) { { guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; } XMLIOS modeCmd; list::iterator itrCmd; string strCmd; if (nonCATrig) return; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == icmd) break; ++itrCmd; } if (itrCmd == commands.end()) return; modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { MilliSleep(50); guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; if (sendCommand(strCmd, rTemp.size, progdefaults.RigCatInitDelay)) return; } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { MilliSleep(50); guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit) return; if (sendCommand(strCmd, 0, progdefaults.RigCatInitDelay)) return; } } LOG_VERBOSE("Retries failed"); } void rigCAT_defaults() { listbox_xml_rig_baudrate->index(xmlrig.baud); valRigCatStopbits->value(xmlrig.stopbits); btnRigCatRTSplus->value(xmlrig.rts); btnRigCatDTRplus->value(xmlrig.dtr); btnRigCatRTSptt->value(xmlrig.rtsptt); btnRigCatDTRptt->value(xmlrig.dtrptt); chk_restore_tio->value(xmlrig.restore_tio); chkRigCatRTSCTSflow->value(xmlrig.rtscts); cntRigCatRetries->value(xmlrig.retries); cntRigCatTimeout->value(xmlrig.timeout); cntRigCatWait->value(xmlrig.write_delay); cntRigCatInitDelay->value(xmlrig.init_delay); btnRigCatEcho->value(xmlrig.echo); btnRigCatCMDptt->value(xmlrig.cmdptt); chkRigCatVSP->value(xmlrig.vsp); } void rigCAT_restore_defaults() { inpXmlRigDevice->value(progdefaults.XmlRigDevice.c_str()); listbox_xml_rig_baudrate->index(progdefaults.XmlRigBaudrate); valRigCatStopbits->value(progdefaults.RigCatStopbits); btnRigCatRTSplus->value(progdefaults.RigCatRTSplus); btnRigCatDTRplus->value(progdefaults.RigCatDTRplus); btnRigCatRTSptt->value(progdefaults.RigCatRTSptt); btnRigCatDTRptt->value(progdefaults.RigCatDTRptt); chk_restore_tio->value(progdefaults.RigCatRestoreTIO); chkRigCatRTSCTSflow->value(progdefaults.RigCatRTSCTSflow); cntRigCatRetries->value(progdefaults.RigCatRetries); cntRigCatTimeout->value(progdefaults.RigCatTimeout); cntRigCatWait->value(progdefaults.RigCatWait); cntRigCatInitDelay->value(progdefaults.RigCatInitDelay); btnRigCatEcho->value(progdefaults.RigCatECHO); btnRigCatCMDptt->value(progdefaults.RigCatCMDptt); chkRigCatVSP->value(progdefaults.RigCatVSP); btnInitRIGCAT->labelcolor(FL_FOREGROUND_COLOR); btnRevertRIGCAT->deactivate(); dlgConfig->redraw(); } void rigCAT_init_defaults() { progdefaults.XmlRigDevice = inpXmlRigDevice->value(); progdefaults.XmlRigBaudrate = listbox_xml_rig_baudrate->index(); progdefaults.RigCatStopbits = static_cast(valRigCatStopbits->value()); progdefaults.RigCatRTSplus = btnRigCatRTSplus->value(); progdefaults.RigCatDTRplus = btnRigCatDTRplus->value(); progdefaults.RigCatRTSptt = btnRigCatRTSptt->value(); progdefaults.RigCatDTRptt = btnRigCatDTRptt->value(); progdefaults.RigCatRestoreTIO = chk_restore_tio->value(); progdefaults.RigCatRTSCTSflow = chkRigCatRTSCTSflow->value(); progdefaults.RigCatRetries = static_cast(cntRigCatRetries->value()); progdefaults.RigCatTimeout = static_cast(cntRigCatTimeout->value()); progdefaults.RigCatWait = static_cast(cntRigCatWait->value()); progdefaults.RigCatInitDelay = static_cast(cntRigCatInitDelay->value()); progdefaults.RigCatECHO = btnRigCatEcho->value(); progdefaults.RigCatCMDptt = btnRigCatCMDptt->value(); progdefaults.RigCatVSP = chkRigCatVSP->value(); } bool rigCAT_init(bool useXML) { if (rigCAT_open == true) { LOG_ERROR("RigCAT already open"); return false; } sRigMode = ""; sRigWidth = ""; if (useXML == true) { rigCAT_init_defaults(); rigio.Device(progdefaults.XmlRigDevice); rigio.Baud(progdefaults.BaudRate(progdefaults.XmlRigBaudrate)); rigio.RTS(progdefaults.RigCatRTSplus); rigio.DTR(progdefaults.RigCatDTRplus); rigio.RTSptt(progdefaults.RigCatRTSptt); rigio.DTRptt(progdefaults.RigCatDTRptt); rigio.RestoreTIO(progdefaults.RigCatRestoreTIO); rigio.RTSCTS(progdefaults.RigCatRTSCTSflow); rigio.Stopbits(progdefaults.RigCatStopbits); LOG_VERBOSE("\n\ Serial port parameters:\n\ device : %s\n\ baudrate : %d\n\ stopbits : %d\n\ retries : %d\n\ timeout : %d\n\ wait : %d\n\ initial rts: %+d\n\ use rts ptt: %c\n\ initial dtr: %+d\n\ use dtr ptt: %c\n\ restore tio: %c\n\ flowcontrol: %c\n\ echo : %c\n", rigio.Device().c_str(), rigio.Baud(), rigio.Stopbits(), progdefaults.RigCatRetries, progdefaults.RigCatTimeout, progdefaults.RigCatWait, (rigio.RTS() ? +12 : -12), (rigio.RTSptt() ? 'T' : 'F'), (rigio.DTR() ? +12 : -12), (rigio.DTRptt() ? 'T' : 'F'), (rigio.RestoreTIO() ? 'T' : 'F'), (rigio.RTSCTS() ? 'T' : 'F'), progdefaults.RigCatECHO ? 'T' : 'F'); if (rigio.OpenPort() == false) { LOG_VERBOSE("Cannot open serial port %s", rigio.Device().c_str()); nonCATrig = true; init_NoRig_RigDialog(); return false; } sRigMode = ""; sRigWidth = ""; nonCATrig = false; rigCAT_sendINIT("INIT", progdefaults.RigCatInitDelay); // must be able to get frequency 3 times in sequence or serial port might // be shared with another application (flrig) bool failed = false; for (int i = 1; i <= 5; i++) { rigCAT_getfreq(1, failed, progdefaults.RigCatInitDelay); if (failed) break; LOG_INFO("Passed serial port test # %d", i); // MilliSleep(50); } if (failed) { LOG_INFO("Failed serial port test"); rigio.ClosePort(); nonCATrig = true; init_NoRig_RigDialog(); return false; } else { nonCATrig = false; init_Xml_RigDialog(); } } else { // rigcat thread just being used for the human interface nonCATrig = true; init_NoRig_RigDialog(); llFreq = 0; rigCAT_bypass = false; if (pthread_create(&rigCAT_thread, NULL, rigCAT_loop, NULL) < 0) { LOG_ERROR("%s", "pthread_create failed"); rigio.ClosePort(); return false; } rigCAT_open = true; return true; } llFreq = 0; rigCAT_bypass = false; if (pthread_create(&rigCAT_thread, NULL, rigCAT_loop, NULL) < 0) { LOG_ERROR("%s", "pthread_create failed"); rigio.ClosePort(); return false; } rigCAT_open = true; return true; } void rigCAT_close(void) { if ( rigCAT_open == false || rigCAT_exit == true) return; rigCAT_sendINIT("CLOSE"); { guard_lock ser_guard( &rigCAT_mutex ); rigCAT_exit = true; } LOG_INFO("%s", "Waiting for rigCAT_thread"); pthread_join(rigCAT_thread, NULL); rigio.ClosePort(); rigCAT_exit = false; rigCAT_open = false; rigCAT_bypass = false; wf->USB(true); } bool rigCAT_active(void) { return (rigCAT_open); } void rigCAT_set_ptt(int ptt) { if (rigCAT_open == false) return; if (ptt) { rigCAT_pttON(); rigCAT_bypass = true; } else{ rigCAT_pttOFF(); rigCAT_bypass = false; } } #ifndef RIGCATTEST void rigCAT_set_qsy(long long f) { if (rigCAT_open == false) return; // send new freq to rig rigCAT_setfreq(f); wf->rfcarrier(f); wf->movetocenter(); } #endif bool ModeIsLSB(const string& s) { if (nonCATrig) { if (s == "LSB" || s == "PKTLSB" || s == "CW" || s == "RTTY") return true; return false; } list::iterator pM = LSBmodes.begin(); while (pM != LSBmodes.end() ) { if (*pM == s) return true; pM++; } return false; } static void *rigCAT_loop(void *args) { SET_THREAD_ID(RIGCTL_TID); long long freq = 0L; string sWidth, sMode; bool failed; for (;;) { MilliSleep(100); { guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit == true) { LOG_INFO("%s", "Exit rigCAT loop"); return NULL; } if (rigCAT_bypass == true) continue; } freq = rigCAT_getfreq(progdefaults.RigCatRetries, failed); if ((freq > 0) && (freq != llFreq)) { llFreq = freq; show_frequency(freq); wf->rfcarrier(freq); } sWidth = rigCAT_getwidth(); if (sWidth.size() && sWidth != sRigWidth) { sRigWidth = sWidth; show_bw(sWidth); } sMode = rigCAT_getmode(); if (sMode.size() && sMode != sRigMode) { sRigMode = sMode; if (ModeIsLSB(sMode)) wf->USB(false); else wf->USB(true); show_mode(sMode); } } return NULL; } fldigi-3.21.80/src/rigcontrol/rigclass.cxx0000664000175000017500000001173712313064025015357 00000000000000// ---------------------------------------------------------------------------- // rigclass.cxx // // Hamlib C++ interface is a frontend implementing wrapper functions // to the hamlib library // // derived from rigclass.cc distributed with hamlib // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "rigclass.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); #define NUMTRIES 5 using namespace std; Rig::Rig() : rig(0) { } Rig::Rig(rig_model_t rig_model) { rig = rig_init(rig_model); fnull = 3580.0; if (!rig) throw RigException ("Could not initialize rig"); } Rig::~Rig() { close(); } void Rig::init(rig_model_t rig_model) { close(); if ((rig = rig_init(rig_model)) == NULL) throw RigException ("Could not initialize rig"); LOG_VERBOSE("Initialised rig model %d: %s", rig_model, getName()); } const char *Rig::getName() { return rig ? rig->caps->model_name : ""; } const struct rig_caps* Rig::getCaps(void) { return rig ? rig->caps : 0; } void Rig::open(void) { int err = rig_open(rig); if (err != RIG_OK) throw RigException(err); } void Rig::close(void) { if (rig) { rig_close(rig); rig_cleanup(rig); rig = NULL; } } bool Rig::canSetFreq() { if (!rig) return false; return (rig->caps->set_freq != NULL); } bool Rig::canGetFreq() { if (!rig) return false; return (rig->caps->get_freq != NULL); } bool Rig::canSetMode() { if (!rig) return false; return (rig->caps->set_mode != NULL); } bool Rig::canGetMode() { if (!rig) return false; return (rig->caps->get_mode != NULL); } bool Rig::canSetPTT() { if (!rig) return false; return (rig->caps->set_ptt != NULL); } bool Rig::canGetPTT() { if (!rig) return false; return (rig->caps->get_ptt != NULL); } void Rig::setFreq(freq_t freq, vfo_t vfo) { fnull = freq; if (!canSetFreq()) { // rig does not support set_freq return; } int err; for (int i = 0; i < NUMTRIES; i++) { err = rig_set_freq(rig, vfo, freq); if (err == RIG_OK) return; } throw RigException(err); } freq_t Rig::getFreq(vfo_t vfo) { if (!canGetFreq()) { // rig does not support get_freq return fnull; } freq_t freq = fnull; int i; for (i = 0; i < NUMTRIES; i++) if (rig_get_freq(rig, vfo, &freq) == RIG_OK) break; return freq; } void Rig::setMode(rmode_t mode, pbwidth_t width, vfo_t vfo) { if (!canSetMode()) throw RigException(RIG_ENAVAIL); int err; for (int i = 0; i < NUMTRIES; i++) { if ((err = rig_set_mode(rig, vfo, mode, width)) == RIG_OK) return; } throw RigException(err); } rmode_t Rig::getMode(pbwidth_t& width, vfo_t vfo) { if (!canGetMode()) throw RigException(RIG_ENAVAIL); int err; rmode_t mode; for (int i = 0; i < NUMTRIES; i++) { if ((err = rig_get_mode(rig, vfo, &mode, &width)) == RIG_OK) return mode; } throw RigException(err); } void Rig::setPTT(ptt_t ptt, vfo_t vfo) { if (!canSetPTT()) throw RigException(RIG_ENAVAIL); int err; for (int i = 0; i < NUMTRIES; i++) { if ((err = rig_set_ptt(rig, vfo, ptt)) == RIG_OK) return; } throw RigException(err); } ptt_t Rig::getPTT(vfo_t vfo) { if (!canGetPTT()) throw RigException(RIG_ENAVAIL); int err; ptt_t ptt; for (int i = 0; i < NUMTRIES; i++) { if ((err = rig_get_ptt(rig, vfo, &ptt)) == RIG_OK) return ptt; } throw RigException(err); } void Rig::setConf(token_t token, const char *val) { int err = rig_set_conf(rig, token, val); if (err != RIG_OK) throw RigException(err); } void Rig::setConf(const char *name, const char *val) { LOG_VERBOSE("setting \"%s\" to \"%s\"", name, val); int err = rig_set_conf(rig, tokenLookup(name), val); if (err != RIG_OK) throw RigException(name, err); } void Rig::getConf(token_t token, char *val) { int err = rig_get_conf(rig, token, val); if (err != RIG_OK) throw RigException(err); } void Rig::getConf(const char *name, char *val) { int err = rig_get_conf(rig, tokenLookup(name), val); if (err != RIG_OK) throw RigException(name, err); } token_t Rig::tokenLookup(const char *name) { return rig_token_lookup(rig, name); } pbwidth_t Rig::passbandNormal (rmode_t mode) { return rig_passband_normal(rig, mode); } pbwidth_t Rig::passbandNarrow (rmode_t mode) { return rig_passband_narrow(rig, mode); } pbwidth_t Rig::passbandWide (rmode_t mode) { return rig_passband_wide(rig, mode); } fldigi-3.21.80/src/rigcontrol/rigxml.cxx0000664000175000017500000004461612313064025015054 00000000000000// ---------------------------------------------------------------------------- // rigxml.cxx - parse a rig control xml file // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "gettext.h" #include "rigio.h" #include "rigxml.h" #include "rigsupport.h" #ifdef RIGCATTEST #include "rigCAT.h" #else #include "main.h" #endif #include "debug.h" #include "configuration.h" #include "fileselect.h" #include "confdialog.h" #include "icons.h" using namespace std; //#define DEBUGXML 1 void parseRIGDEF(size_t &); void parseRIG(size_t &); void parseCOMMAND(size_t &); void parseREPLY(size_t &); void parseMODES(size_t &); void parseBANDWIDTHS(size_t &); void parseBWCMD(size_t &); void parseBWREPLY(size_t &); void parseMODECMD(size_t &); void parseMODEREPLY(size_t &); void parseTITLE(size_t &); void parseLSBMODES(size_t &); void parseDISCARD(size_t &); void parseWRITE_DELAY(size_t &); void parseINIT_DELAY(size_t &); void parsePOST_WRITE_DELAY(size_t &); void parseRETRIES(size_t &); void parseTIMEOUT(size_t &); void parseBAUDRATE(size_t &); void parseSTOPBITS(size_t &); void parseRTSCTS(size_t &); void parseCMDPTT(size_t &); void parseRTSPLUS(size_t &); void parseDTRPLUS(size_t &); void parseRTSPTT(size_t &); void parseDTRPTT(size_t &); void parseRESTORE_TIO(size_t &); void parseECHO(size_t &); void parseVSP(size_t &); void parseIOSsymbol(size_t &); void parseIOSsize(size_t &); void parseIOSbytes(size_t &); void parseIOSbyte(size_t &); void parseIOSdata(size_t &); void parseIOSinfo(size_t &); void parseIOSok(size_t &); void parseIOSbad(size_t &); void parseIOSstring(size_t &); void parseIOSint(size_t &); void parseIOSfill(size_t &); void parseDTYPE(size_t &); void parseDSIZE(size_t &); void parseDMAX(size_t &); void parseDMIN(size_t &); void parseDRESOL(size_t &); void parseDREV(size_t &); void parseDMAKS(size_t &); void parseDSHIFT(size_t &); void print(size_t &); list commands; list reply; list lmodes; list lbws; list lbwCMD; list lbwREPLY; list lmodeCMD; list lmodeREPLY; list LSBmodes; XMLRIG xmlrig; XMLIOS iosTemp; string strXML; TAGS rigdeftags[] = { {"", p0); LOG_INFO("%s%s", istr.c_str(), strXML.substr(p0, tend - p0 + 1).c_str()); #endif } size_t tagEnd(size_t p0) { size_t p1, p2, p3; p1 = p0; string strtag = "", p0); p3 = strXML.find(" ", p0); if (p2 == string::npos) { return p2; } if (p3 < p2) p2 = p3; strtag.append(strXML.substr(p1 + 1, p2 - p1 - 1)); strtag.append(">"); p3 = strXML.find(strtag, p1); return p3; } size_t nextTag(size_t p0) { p0 = strXML.find("<", p0+1); return p0; } string getElement(size_t p0) { size_t p1 = strXML.find(">",p0), p2 = nextTag(p1+1); if (p1 == string::npos || p2 == string::npos) return ""; p1++; p2--; while (p1 < p2 && strXML[p1] == ' ') p1++; // skip leading spaces while (p1 < p2 && strXML[p2] == ' ') p2--; // skip trailing spaces return strXML.substr(p1, p2 - p1 + 1); } int getInt(size_t p0) { string stemp = getElement(p0); if (stemp.length() == 0) return 0; return atoi(stemp.c_str()); } float getFloat(size_t p0) { string stemp = getElement(p0); if (stemp.length() == 0) return 0; return atof(stemp.c_str()); } bool getBool( size_t p0) { string stemp = getElement(p0); if (stemp.length() == 0) return false; if (strcasecmp(stemp.c_str(), "true") == 0) return true; if (stemp == "1") return true; return false; } char getByte(size_t p0) { unsigned int val; if (sscanf( getElement(p0).c_str(), "%x", &val ) != 1) return 0; return (val & 0xFF); } string getBytes(size_t p0) { unsigned int val; size_t space; string stemp = getElement(p0); string s; while ( stemp.length() ) { if (sscanf( stemp.c_str(), "%x", &val) != 1) { s = ""; return s; } s += (char)(val & 0xFF); space = stemp.find(" "); if (space == string::npos) break; stemp.erase(0, space + 1); } return s; } bool isInt(size_t p0, int &i) { // p0 = nextTag(p0); if (strXML.find(" &lmd) { size_t pend = tagEnd(p0); size_t elend; char ch; int n; string stemp; string strELEMENT; if (pend == string::npos) { p0++; return; } print(p0,0); p0 = nextTag(p0); while (p0 != string::npos && p0 < pend && tagIs(p0, " &lbw) { size_t pend = tagEnd(p0); size_t elend; char ch; int n; string strELEMENT; string stemp; if (pend == string::npos) { LOG_ERROR("Unmatched tag %s", strXML.substr(p0, 10).c_str()); p0++; return; } print(p0,0); size_t p1 = nextTag(p0); while (p1 != string::npos && p1 < pend && tagIs(p1, " pend) { LOG_ERROR("Unmatched tag %s", " 2) val = 2; xmlrig.stopbits = val; size_t pend = tagEnd(p0); p0 = pend; } void parseWRITE_DELAY(size_t &p0){ int val = getInt(p0); xmlrig.write_delay = val; size_t pend = tagEnd(p0); p0 = pend; } void parseINIT_DELAY(size_t &p0){ int val = getInt(p0); xmlrig.init_delay = val; size_t pend = tagEnd(p0); p0 = pend; } void parsePOST_WRITE_DELAY(size_t &p0){ int val = getInt(p0); xmlrig.post_write_delay = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRETRIES(size_t &p0){ int val = getInt(p0); xmlrig.retries = val; size_t pend = tagEnd(p0); p0 = pend; } void parseTIMEOUT(size_t &p0){ int val = getInt(p0); xmlrig.timeout = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRTSCTS(size_t &p0){ bool val = getBool(p0); xmlrig.rtscts = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRTSPLUS(size_t &p0) { bool val = getBool(p0); xmlrig.rts = val; size_t pend = tagEnd(p0); p0 = pend; } void parseDTRPLUS(size_t &p0) { bool val = getBool(p0); xmlrig.dtr = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRTSPTT(size_t &p0) { bool val = getBool(p0); xmlrig.rtsptt = val; size_t pend = tagEnd(p0); p0 = pend; } void parseDTRPTT(size_t &p0) { bool val = getBool(p0); xmlrig.dtrptt = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRESTORE_TIO(size_t &p0) { bool val = getBool(p0); xmlrig.restore_tio = val; size_t pend = tagEnd(p0); p0 = pend; } void parseCMDPTT(size_t &p0) { bool val = getBool(p0); xmlrig.cmdptt = val; size_t pend = tagEnd(p0); p0 = pend; } void parseECHO(size_t &p0) { bool val = getBool(p0); xmlrig.echo = val; size_t pend = tagEnd(p0); p0 = pend; } void parseVSP(size_t &p0) { bool val = getBool(p0); xmlrig.vsp = val; size_t pend = tagEnd(p0); p0 = pend; } //--------------------------------------------------------------------- // Parse IOS (serial stream format) definitions //--------------------------------------------------------------------- void parseIOSsize(size_t &p0) { iosTemp.size = getInt(p0); } void parseIOSbytes(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.str1.append(getBytes(p0)); else iosTemp.str2.append(getBytes(p0)); } void parseIOSbyte(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.str1 += getByte(p0); else iosTemp.str2 += getByte(p0); } void parseIOSstring(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.str1 += getElement(p0); else iosTemp.str2 += getElement(p0); } void parseIOSint(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.str1 += (char)(getInt(p0) & 0xFF); else iosTemp.str2 += (char)(getInt(p0) & 0xFF); } void parseDTYPE(size_t &p1) { print(p1,2); iosTemp.data.dtype = getElement(p1); } void parseDSIZE(size_t &p1) { print(p1,2); iosTemp.data.size = getInt(p1); } void parseDMAX(size_t &p1) { print(p1,2); iosTemp.data.max = getInt(p1); } void parseDMIN(size_t &p1) { print(p1,2); iosTemp.data.min = getInt(p1); } void parseDRESOL(size_t &p1) { print(p1,2); iosTemp.data.resolution = getFloat(p1); } void parseDREV(size_t &p1) { print(p1,2); iosTemp.data.reverse = getBool(p1); } void parseDMAKS(size_t &p1) { print(p1,2); iosTemp.data.andmask = getInt(p1); } void parseDSHIFT(size_t &p1) { print(p1,2); iosTemp.data.shiftbits = getInt(p1); } void parseIOSdata(size_t &p0) { size_t pend = tagEnd(p0); size_t p1; TAGS *pv; p1 = nextTag(p0); while (p1 < pend) { pv = datatags; while (pv->tag) { if (strXML.find(pv->tag, p1) == p1) break; pv++; } if (pv->fp) { print(p1, 1); (pv->fp)(p1); p1 = tagEnd(p1); } else { LOG_ERROR("Invalid tag: %s", strXML.substr(p1, 10).c_str()); parseDISCARD(p1); } p1 = nextTag(p1); } } void parseIOSinfo(size_t &p0) { string strR = getElement(p0); if (strR.empty()) return; iosTemp.info = strR; } void parseIOSok(size_t &p0) { string strR = getElement(p0); if (strR.empty()) return; iosTemp.ok = strR; } void parseIOSbad(size_t &p0) { string strR = getElement(p0); if (strR.empty()) return; iosTemp.bad = strR; } void parseIOSsymbol(size_t &p0) { string strR = getElement(p0); if (strR.empty()) return; iosTemp.SYMBOL = strR; } void parseIOSfill(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.fill1 = getInt(p0); else iosTemp.fill2 = getInt(p0); } //======================================================================= bool parseIOS(size_t &p0, TAGS *valid) { size_t pend = tagEnd(p0); size_t p1; TAGS *pv; print(p0,0); iosTemp.clear(); p1 = nextTag(p0); while (p1 < pend) { pv = valid; while (pv->tag) { if (strXML.find(pv->tag, p1) == p1) break; pv++; } if (pv->fp) { print(p1, 1); (pv->fp)(p1); p1 = tagEnd(p1); } else { LOG_ERROR("Invalid tag: %s", strXML.substr(p1, 10).c_str()); parseDISCARD(p1); } p1 = nextTag(p1); } p0 = pend; return (!iosTemp.SYMBOL.empty()); } void parseCOMMAND(size_t &p0) { if (parseIOS(p0, commandtags)) commands.push_back(iosTemp); } void parseREPLY(size_t &p0) { if (parseIOS(p0, replytags)) reply.push_back(iosTemp); } void parseRIGDEF(size_t &p0) { print(p0,0); size_t p1 = tagEnd(p0); if (p1 != string::npos) strXML.erase(p1); } void parseDISCARD(size_t &p0) { size_t pend = tagEnd(p0); if (pend == string::npos) p0++; else p0 = pend; } void parseXML() { size_t p0 = 0; TAGS *pValid = rigdeftags; p0 = strXML.find("<"); while (p0 != string::npos) { pValid = rigdeftags; while (pValid->tag) { if (strXML.find(pValid->tag, p0) == p0) break; pValid++; } if (pValid->tag) { (pValid->fp)(p0); } else { LOG_ERROR("Invalid tag: %s", strXML.substr(p0, 10).c_str()); parseDISCARD(p0); } p0 = nextTag(p0); } } bool remove_comments() { size_t p0 = 0; size_t p1 = 0; // remove comments from xml text while ((p0 = strXML.find("", p0); if (p1 == string::npos) { fl_alert2("Corrupt rig XML defintion file\nMismatched comment tags!"); return false; } strXML.erase(p0, p1 - p0 + 3); } if (strXML.find("-->") != string::npos) { fl_alert2("Corrupt rig XML defintion file\nMismatched comment tags!"); return false; } return true; } bool testXML() { if (!remove_comments()) return false; return true; } bool readRigXML() { char szLine[256]; int lines = 0; commands.clear(); reply.clear(); lmodes.clear(); lmodeCMD.clear(); lmodeREPLY.clear(); lbws.clear(); lbwCMD.clear(); lbwREPLY.clear(); LSBmodes.clear(); strXML = ""; ifstream xmlfile(progdefaults.XmlRigFilename.c_str(), ios::in); if (xmlfile) { while (!xmlfile.eof()) { lines++; memset(szLine, 0, sizeof(szLine)); xmlfile.getline(szLine,255); strXML.append(szLine); } xmlfile.close(); if (testXML()) { parseXML(); return true; } } return false; } void selectRigXmlFilename() { string deffilename; deffilename = progdefaults.XmlRigFilename; const char *p = FSEL::select(_("Open rig xml file"), _("Fldigi rig xml definition file\t*.xml"), deffilename.c_str()); if (p) { progdefaults.XmlRigFilename = p; txtXmlRigFilename->value(fl_filename_name(p)); rigCAT_close(); readRigXML(); rigCAT_defaults(); } } fldigi-3.21.80/src/rigcontrol/FreqControl.cxx0000664000175000017500000001736312313064025016007 00000000000000// ---------------------------------------------------------------------------- // Frequency Control Widget for the Fast Light Tool Kit (Fltk) // // Copyright 2005-2009, Dave Freese W1HKJ // Copyright 2007-2009, Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "fl_digi.h" #include "qrunner.h" #include "FreqControl.h" #include "gettext.h" const char *cFreqControl::Label[10] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; void cFreqControl::IncFreq (int nbr) { long v = 1; v = val + mult[nbr]; if (v <= maxVal) val = v; updatevalue(); do_callback(); } void cFreqControl::DecFreq (int nbr) { long v = 1; v = val - mult[nbr]; if (v >= minVal) val = v; updatevalue(); do_callback(); } void cbSelectDigit (Fl_Widget *btn, void * nbr) { Fl_Button *b = (Fl_Button *)btn; // bool top = (Fl::event_y() < b->y() + b->h()/2); int Nbr = (int)(reinterpret_cast (nbr)); cFreqControl *fc = (cFreqControl *)b->parent(); /* if (top) fc->IncFreq(Nbr); else fc->DecFreq(Nbr); */ if (Fl::event_button1()) fc->IncFreq(Nbr); else if (Fl::event_button3()) fc->DecFreq(Nbr); fc->damage(); } cFreqControl::cFreqControl(int x, int y, int w, int h, const char *lbl): Fl_Group(x,y,w,h,"") { font_number = FL_COURIER; ONCOLOR = FL_YELLOW; OFFCOLOR = FL_BLACK; SELCOLOR = fl_rgb_color(100, 100, 100); ILLUMCOLOR = FL_GREEN; oldval = val = 0; nD = 9; // nD <= MAXDIGITS int pw = 6; // decimal width int fcWidth = (w - pw - 4)/nD; int fcFirst = x; int fcTop = y; int fcHeight = h; long int max; int xpos; box(FL_DOWN_BOX); max = 1; for (int n = 0; n < nD; n++) { xpos = fcFirst + (nD - 1 - n) * fcWidth + 2; if (n < 3) xpos += pw; Digit[n] = new Fl_Repeat_Button ( xpos, fcTop + 2, fcWidth, fcHeight-4, " "); Digit[n]->box(FL_FLAT_BOX); Digit[n]->labelfont(font_number); Digit[n]->labelcolor(ONCOLOR); Digit[n]->color(OFFCOLOR, SELCOLOR); Digit[n]->labelsize(fcHeight-4); Digit[n]->callback(cbSelectDigit, reinterpret_cast(n) ); mult[n] = max; max *= 10; } decbx = new Fl_Box(fcFirst + (nD - 3) * fcWidth + 2, fcTop + 2, pw, fcHeight-4,"."); decbx->box(FL_FLAT_BOX); decbx->labelfont(font_number); decbx->labelcolor(ONCOLOR); decbx->color(OFFCOLOR); decbx->labelsize(fcHeight-4); cbFunc = NULL; maxVal = max * 10 - 1; minVal = 0; end(); finp = new Fl_Float_Input(0, 0, 1, 1); finp->callback(freq_input_cb, this); finp->when(FL_WHEN_CHANGED); finp->hide(); parent()->remove(finp); tooltip(_("Enter frequency or change with\nLeft/Right/Up/Down/Pg_Up/Pg_Down")); } cFreqControl::~cFreqControl() { for (int i = 0; i < nD; i++) { delete Digit[i]; } delete finp; } void cFreqControl::updatevalue() { long v = val; int i; if (likely(v > 0L)) { for (i = 0; i < nD; i++) { Digit[i]->label(v == 0 ? "" : Label[v % 10]); v /= 10; } } else { for (i = 0; i < 4; i++) Digit[i]->label("0"); for (; i < nD; i++) Digit[i]->label(""); } decbx->label("."); damage(); } void cFreqControl::SetONOFFCOLOR( Fl_Color ONcolor, Fl_Color OFFcolor) { OFFCOLOR = OFFcolor; ONCOLOR = ONcolor; for (int n = 0; n < nD; n++) { Digit[n]->labelcolor(ONCOLOR); Digit[n]->color(OFFCOLOR); } decbx->labelcolor(ONCOLOR); decbx->color(OFFCOLOR); damage(); } void cFreqControl::SetONCOLOR (uchar r, uchar g, uchar b) { ONCOLOR = fl_rgb_color (r, g, b); for (int n = 0; n < nD; n++) { Digit[n]->labelcolor(ONCOLOR); Digit[n]->color(OFFCOLOR); } decbx->labelcolor(ONCOLOR); decbx->color(OFFCOLOR); damage(); } void cFreqControl::SetOFFCOLOR (uchar r, uchar g, uchar b) { OFFCOLOR = fl_rgb_color (r, g, b); for (int n = 0; n < nD; n++) { Digit[n]->labelcolor(ONCOLOR); Digit[n]->color(OFFCOLOR); } decbx->labelcolor(ONCOLOR); decbx->color(OFFCOLOR); damage(); } void cFreqControl::font(Fl_Font fnt) { font_number = fnt; for (int n = 0; n < nD; n++) Digit[n]->labelfont(fnt); decbx->labelfont(fnt); damage(); } static void blink_point(Fl_Widget* w) { w->label(*w->label() ? "" : "."); Fl::add_timeout(0.2, (Fl_Timeout_Handler)blink_point, w); } void cFreqControl::value(long lv) { oldval = val = lv; Fl::remove_timeout((Fl_Timeout_Handler)blink_point, decbx); REQ(&cFreqControl::updatevalue, this); } void cFreqControl::cancel_kb_entry(void) { Fl::remove_timeout((Fl_Timeout_Handler)blink_point, decbx); val = oldval; updatevalue(); } int cFreqControl::handle(int event) { if (!Fl::event_inside(this) && event != FL_LEAVE) return Fl_Group::handle(event); static Fl_Widget* fw = NULL; int d; switch (event) { case FL_ENTER: fw = Fl::focus(); take_focus(); break; case FL_LEAVE: if (fw) fw->take_focus(); if (Fl::has_timeout((Fl_Timeout_Handler)blink_point, decbx)) cancel_kb_entry(); break; case FL_KEYBOARD: switch (d = Fl::event_key()) { case FL_Left: d = -1; break; case FL_Down: d = -10; break; case FL_Right: d = 1; break; case FL_Up: d = 10; break; case FL_Page_Up: d = 100; break; case FL_Page_Down: d = -100; break; default: if (Fl::event_ctrl()) { if (Fl::event_key() == 'v') { finp->handle(event); Fl::remove_timeout((Fl_Timeout_Handler)blink_point, decbx); return 1; } } if (Fl::has_timeout((Fl_Timeout_Handler)blink_point, decbx)) { if (d == FL_Escape) { cancel_kb_entry(); return 1; } else if (d == FL_Enter || d == FL_KP_Enter) { // append finp->position(finp->size()); finp->replace(finp->position(), finp->mark(), "\n", 1); } } else { if (d == FL_Escape && window() != Fl::first_window()) { window()->do_callback(); return 1; } Fl::add_timeout(0.0, (Fl_Timeout_Handler)blink_point, decbx); finp->static_value(""); oldval = val; } return finp->handle(event); } val += d; updatevalue(); do_callback(); break; case FL_MOUSEWHEEL: if ( !((d = Fl::event_dy()) || (d = Fl::event_dx())) ) return 1; for (int i = 0; i < nD; i++) { if (Fl::event_inside(Digit[i])) { d > 0 ? DecFreq(i) : IncFreq(i); break; } } break; case FL_PUSH: if (Fl::event_button() == FL_MIDDLE_MOUSE) Fl::paste(*this, 0); else return Fl_Group::handle(event); break; case FL_PASTE: finp->value(Fl::event_text()); finp->position(finp->size()); finp->insert(" \n", 2); // space before newline for pasted text finp->do_callback(); break; } return 1; } void cFreqControl::freq_input_cb(Fl_Widget*, void* arg) { cFreqControl* fc = reinterpret_cast(arg); double val = strtod(fc->finp->value(), NULL); if (val == 0.0 && fc->finp->index(fc->finp->size() - 2) == ' ') return; // invalid pasted text if (val >= 0.0 && val < pow(10.0, MAX_DIGITS - 3)) { val *= 1e3; val += 0.5; fc->val = (long)val; fc->updatevalue(); if (fc->finp->index(fc->finp->size() - 1) == '\n' && val > 0.0) { Fl::remove_timeout((Fl_Timeout_Handler)blink_point, fc->decbx); fc->do_callback(); } } } fldigi-3.21.80/src/rigcontrol/hamlib.cxx0000664000175000017500000003655212313064025015006 00000000000000// ---------------------------------------------------------------------------- // hamlib.cxx -- Hamlib (rig control) interface for fldigi // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "trx.h" #include "configuration.h" #include "confdialog.h" #include "rigclass.h" #include "threads.h" #include "misc.h" #include "fl_digi.h" #include "main.h" #include "misc.h" #include "rigsupport.h" #include "stacktrace.h" #ifdef __WOE32__ # include "serial.h" #endif #include "debug.h" #include "re.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); using namespace std; static pthread_mutex_t hamlib_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_t *hamlib_thread = 0; static bool hamlib_exit = false; static bool hamlib_ptt = false; static bool hamlib_qsy = false; static bool need_freq = false; static bool need_mode = false; static bool hamlib_bypass = false; static bool hamlib_closed = true;//false; static int hamlib_passes = 20; static long int hamlib_freq; static rmode_t hamlib_rmode = RIG_MODE_USB; static pbwidth_t hamlib_pbwidth = 3000; typedef std::vector rig_list_t; rig_list_t hamlib_rigs; enum { SIDEBAND_RIG, SIDEBAND_LSB, SIDEBAND_USB }; static void *hamlib_loop(void *args); void show_error(const char* msg1, const char* msg2 = 0) { string error = msg1; if (msg2) error.append(": ").append(msg2); put_status(error.c_str(), 10.0); LOG_ERROR("%s", error.c_str()); } void hamlib_get_defaults() { char szParam[40]; int i; Rig testrig; rig_model_t rigmodel; rigmodel = hamlib_get_rig_model(cboHamlibRig->index()); testrig.init(rigmodel); if (testrig.getCaps()->port_type != RIG_PORT_SERIAL) { testrig.close(); return; } testrig.getConf("serial_speed", szParam); listbox_baudrate->value(szParam); testrig.getConf("post_write_delay", szParam); sscanf(szParam, "%d", &i); cntHamlibWait->value(i); testrig.getConf("write_delay", szParam); sscanf(szParam, "%d", &i); cntHamlibWriteDelay->value(i); testrig.getConf("timeout", szParam); sscanf(szParam, "%d", &i); cntHamlibTimeout->value(i); testrig.getConf("retry", szParam); sscanf(szParam, "%d", &i); cntHamlibRetries->value(i); testrig.getConf("rts_state", szParam); chkHamlibRTSplus->value( strcmp(szParam, "ON") == 0 ? true : false); testrig.getConf("dtr_state", szParam); btnHamlibDTRplus->value( strcmp(szParam, "ON") == 0 ? true : false); testrig.getConf("serial_handshake", szParam); chkHamlibRTSCTSflow->value(strcmp(szParam, "Hardware") == 0 ? true : false); chkHamlibXONXOFFflow->value(strcmp(szParam, "XONXOFF") == 0 ? true : false); testrig.getConf("stop_bits", szParam); valHamRigStopbits->value(strcmp(szParam, "1") == 0 ? 1 : 2); if (!testrig.canSetPTT()) { btnHamlibCMDptt->value(0); btnHamlibCMDptt->deactivate(); } else { btnHamlibCMDptt->value(1); btnHamlibCMDptt->activate(); } inpHamlibConfig->value(""); testrig.close(); } void hamlib_restore_defaults() { cboHamlibRig->index(hamlib_get_index(progdefaults.HamRigModel)); inpRIGdev->value(progdefaults.HamRigDevice.c_str()); cntHamlibRetries->value(progdefaults.HamlibRetries); cntHamlibTimeout->value(progdefaults.HamlibTimeout); cntHamlibWriteDelay->value(progdefaults.HamlibWriteDelay); cntHamlibWait->value(progdefaults.HamlibWait); btnHamlibCMDptt->value(progdefaults.HamlibCMDptt); btnHamlibDTRplus->value(progdefaults.HamlibDTRplus); chkHamlibRTSCTSflow->value(progdefaults.HamlibRTSCTSflow); if (chkHamlibRTSCTSflow->value()) chkHamlibRTSplus->deactivate(); chkHamlibRTSplus->value(progdefaults.HamlibRTSplus); chkHamlibXONXOFFflow->value(progdefaults.HamlibXONXOFFflow); listbox_sideband->index(progdefaults.HamlibSideband); valHamRigStopbits->value(progdefaults.HamRigStopbits); listbox_baudrate->index(progdefaults.HamRigBaudrate); if (xcvr && xcvr->canSetPTT()) btnHamlibCMDptt->activate(); else btnHamlibCMDptt->deactivate(); btnHamlibCMDptt->value(progdefaults.HamlibCMDptt); inpHamlibConfig->value(progdefaults.HamConfig.c_str()); btnInitHAMLIB->labelcolor(FL_FOREGROUND_COLOR); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->deactivate(); btnRevertHAMLIB->redraw(); } void hamlib_init_defaults() { progdefaults.HamRigModel = hamlib_get_rig_model(cboHamlibRig->index()); progdefaults.HamRigDevice = inpRIGdev->value(); progdefaults.HamlibRetries = static_cast(cntHamlibRetries->value()); progdefaults.HamlibTimeout = static_cast(cntHamlibTimeout->value()); progdefaults.HamlibWriteDelay = static_cast(cntHamlibWriteDelay->value()); progdefaults.HamlibWait = static_cast(cntHamlibWait->value()); progdefaults.HamlibCMDptt = btnHamlibCMDptt->value(); progdefaults.HamlibDTRplus = btnHamlibDTRplus->value(); progdefaults.HamlibRTSCTSflow = chkHamlibRTSCTSflow->value(); progdefaults.HamlibRTSplus = chkHamlibRTSplus->value(); progdefaults.HamlibXONXOFFflow = chkHamlibXONXOFFflow->value(); progdefaults.HamlibSideband = listbox_sideband->index(); progdefaults.HamRigStopbits = static_cast(valHamRigStopbits->value()); progdefaults.HamRigBaudrate = listbox_baudrate->index(); progdefaults.HamlibCMDptt = btnHamlibCMDptt->value(); progdefaults.HamConfig = inpHamlibConfig->value(); } bool hamlib_init(bool bPtt) { freq_t freq; // rmode_t mode; // pbwidth_t width; hamlib_ptt = bPtt; hamlib_init_defaults(); #ifdef __CYGWIN__ string port = progdefaults.HamRigDevice; com_to_tty(port); #endif if (progdefaults.HamRigModel == 0) { LOG_ERROR("No such hamlib rig model"); return false; } try { char szParam[20]; xcvr->init(progdefaults.HamRigModel); #ifdef __CYGWIN__ xcvr->setConf("rig_pathname", port.c_str()); #else xcvr->setConf("rig_pathname", progdefaults.HamRigDevice.c_str()); #endif snprintf(szParam, sizeof(szParam), "%d", progdefaults.HamlibWait); xcvr->setConf("post_write_delay", szParam); snprintf(szParam, sizeof(szParam), "%d", progdefaults.HamlibWriteDelay); xcvr->setConf("write_delay", szParam); snprintf(szParam, sizeof(szParam), "%d", progdefaults.HamlibTimeout); xcvr->setConf("timeout", szParam); snprintf(szParam, sizeof(szParam), "%d", progdefaults.HamlibRetries); xcvr->setConf("retry", szParam); if (xcvr->getCaps()->port_type == RIG_PORT_SERIAL) { xcvr->setConf("serial_speed", progdefaults.strBaudRate()); if (progdefaults.HamlibDTRplus) xcvr->setConf("dtr_state", "ON"); else xcvr->setConf("dtr_state", "OFF"); if (progdefaults.HamlibRTSCTSflow) xcvr->setConf("serial_handshake", "Hardware"); else if (progdefaults.HamlibXONXOFFflow) xcvr->setConf("serial_handshake", "XONXOFF"); else xcvr->setConf("serial_handshake", "None"); if (!progdefaults.HamlibRTSCTSflow) { if (progdefaults.HamlibRTSplus) xcvr->setConf("rts_state", "ON"); else xcvr->setConf("rts_state", "OFF"); } xcvr->setConf("stop_bits", progdefaults.HamRigStopbits == 1 ? "1" : "2"); } string::size_type c = progdefaults.HamConfig.find('#'); if (c != string::npos) progdefaults.HamConfig.erase(c); if (!progdefaults.HamConfig.empty()) { re_t re("([^, =]+) *= *([^, =]+)", REG_EXTENDED); const char* conf = progdefaults.HamConfig.c_str(); int end; while (re.match(conf)) { xcvr->setConf(re.submatch(1).c_str(), re.submatch(2).c_str()); re.suboff(0, NULL, &end); conf += end; } } xcvr->open(); } catch (const RigException& Ex) { show_error(__func__, Ex.what()); xcvr->close(); return false; } LOG_DEBUG("trying frequency request"); try { if ( !xcvr->canGetFreq() ) need_freq = false; // getFreq will return setFreq value else { need_freq = true; freq = xcvr->getFreq(); if (freq <= 0) { xcvr->close(); show_error(__func__, "Rig not responding"); return false; } } } catch (const RigException& Ex) { show_error("Get Freq", Ex.what()); need_freq = false; } if (!need_freq) { xcvr->close(); LOG_VERBOSE("Failed freq test"); return false; } LOG_DEBUG("trying mode request"); try { if ( !xcvr->canGetMode() ) need_mode = false; else { need_mode = true; // mode = xcvr->getMode(width); } } catch (const RigException& Ex) { show_error("Get Mode", Ex.what()); need_mode = false; } try { if (hamlib_ptt == true) { LOG_VERBOSE("trying PTT"); if (!xcvr->canSetPTT()) hamlib_ptt = false; else xcvr->setPTT(RIG_PTT_OFF); } } catch (const RigException& Ex) { show_error("Set Ptt", Ex.what()); hamlib_ptt = false; } hamlib_freq = 0; hamlib_rmode = RIG_MODE_NONE; hamlib_exit = false; hamlib_bypass = false; hamlib_thread = new pthread_t; if (pthread_create(hamlib_thread, NULL, hamlib_loop, NULL) < 0) { show_error(__func__, "pthread_create failed"); xcvr->close(); hamlib_thread = 0; return false; } init_Hamlib_RigDialog(); hamlib_closed = false; return true; } void hamlib_close(void) { ENSURE_THREAD(FLMAIN_TID); if (hamlib_closed) return; pthread_mutex_lock(&hamlib_mutex); hamlib_exit = true; pthread_mutex_unlock(&hamlib_mutex); pthread_join(*hamlib_thread, NULL); delete hamlib_thread; hamlib_thread = 0; if (xcvr->isOnLine()) xcvr->close(); wf->USB(true); } bool hamlib_active(void) { return (xcvr->isOnLine()); } void hamlib_set_ptt(int ptt) { if (xcvr->isOnLine() == false) return; if (!hamlib_ptt) return; pthread_mutex_lock(&hamlib_mutex); try { xcvr->setPTT(ptt ? RIG_PTT_ON : RIG_PTT_OFF); hamlib_bypass = ptt ? true : false; } catch (const RigException& Ex) { show_error("Rig PTT", Ex.what()); hamlib_ptt = false; } pthread_mutex_unlock(&hamlib_mutex); } void hamlib_set_qsy(long long f) { if (xcvr->isOnLine() == false) return; pthread_mutex_lock(&hamlib_mutex); double fdbl = f; hamlib_qsy = false; try { xcvr->setFreq(fdbl); wf->rfcarrier(f); wf->movetocenter(); } catch (const RigException& Ex) { show_error("QSY", Ex.what()); hamlib_passes = 0; } pthread_mutex_unlock(&hamlib_mutex); } int hamlib_setfreq(long f) { if (xcvr->isOnLine() == false) return -1; pthread_mutex_lock(&hamlib_mutex); try { LOG_DEBUG("%ld", f); xcvr->setFreq(f); } catch (const RigException& Ex) { show_error("SetFreq", Ex.what()); hamlib_passes = 0; } pthread_mutex_unlock(&hamlib_mutex); return 1; } int hamlib_setmode(rmode_t m) { if (need_mode == false) return -1; if (xcvr->isOnLine() == false) return -1; pthread_mutex_lock(&hamlib_mutex); try { hamlib_rmode = xcvr->getMode(hamlib_pbwidth); xcvr->setMode(m, hamlib_pbwidth); hamlib_rmode = m; } catch (const RigException& Ex) { show_error("Set Mode", Ex.what()); hamlib_passes = 0; } pthread_mutex_unlock(&hamlib_mutex); return 1; } int hamlib_setwidth(pbwidth_t w) { if (xcvr->isOnLine() == false) return -1; pthread_mutex_lock(&hamlib_mutex); try { hamlib_rmode = xcvr->getMode(hamlib_pbwidth); xcvr->setMode(hamlib_rmode, w); hamlib_pbwidth = w; } catch (const RigException& Ex) { show_error("Set Width", Ex.what()); hamlib_passes = 0; } pthread_mutex_unlock(&hamlib_mutex); return 1; } rmode_t hamlib_getmode() { return hamlib_rmode; } pbwidth_t hamlib_getwidth() { return hamlib_pbwidth; } static void *hamlib_loop(void *args) { SET_THREAD_ID(RIGCTL_TID); long int freq = 0L; rmode_t numode = RIG_MODE_NONE; bool freqok = false, modeok = false; for (;;) { MilliSleep(100); if (hamlib_exit) break; if (hamlib_bypass) continue; // hamlib locked while accessing hamlib serial i/o pthread_mutex_lock(&hamlib_mutex); if (need_freq) { freq_t f; try { f = xcvr->getFreq(); freq = (long int) f; freqok = true; if (freq == 0) { pthread_mutex_unlock(&hamlib_mutex); continue; } } catch (const RigException& Ex) { show_error(__func__, "Rig not responding: freq"); freqok = false; } } if (hamlib_exit) break; if (need_mode && hamlib_rmode == numode) { try { numode = xcvr->getMode(hamlib_pbwidth); modeok = true; } catch (const RigException& Ex) { show_error(__func__, "Rig not responding: mode"); modeok = false; } } pthread_mutex_unlock(&hamlib_mutex); if (hamlib_exit) break; if (hamlib_bypass) continue; if (freqok && freq && (freq != hamlib_freq)) { hamlib_freq = freq; show_frequency(hamlib_freq); wf->rfcarrier(hamlib_freq); } if (modeok && (hamlib_rmode != numode)) { hamlib_rmode = numode; show_mode(modeString(hamlib_rmode)); if (progdefaults.HamlibSideband != SIDEBAND_RIG) wf->USB(progdefaults.HamlibSideband == SIDEBAND_USB); else wf->USB(!(hamlib_rmode == RIG_MODE_LSB || hamlib_rmode == RIG_MODE_CWR || hamlib_rmode == RIG_MODE_PKTLSB || hamlib_rmode == RIG_MODE_ECSSLSB || hamlib_rmode == RIG_MODE_RTTY)); } if (hamlib_exit) break; } hamlib_closed = true; return NULL; } static int add_to_list(const struct rig_caps* rc, void*) { hamlib_rigs.push_back(rc); return 1; } static bool rig_cmp(const struct rig_caps* rig1, const struct rig_caps* rig2) { int ret; ret = strcasecmp(rig1->mfg_name, rig2->mfg_name); if (ret > 0) return false; if (ret < 0) return true; ret = strcasecmp(rig1->model_name, rig2->model_name); if (ret > 0) return false; if (ret <= 0) return true; if (rig1->rig_model > rig2->rig_model) return false; return true; } void hamlib_get_rigs(void) { if (!hamlib_rigs.empty()) return; enum rig_debug_level_e dblv = RIG_DEBUG_NONE; #ifndef NDEBUG const char* hd = getenv("FLDIGI_HAMLIB_DEBUG"); if (hd) { dblv = static_cast(strtol(hd, NULL, 10)); dblv = CLAMP(dblv, RIG_DEBUG_NONE, RIG_DEBUG_TRACE); } #endif rig_set_debug(dblv); rig_load_all_backends(); rig_list_foreach(add_to_list, 0); sort(hamlib_rigs.begin(), hamlib_rigs.end(), rig_cmp); } rig_model_t hamlib_get_rig_model_compat(const char* name) { for (rig_list_t::const_iterator i = hamlib_rigs.begin(); i != hamlib_rigs.end(); ++i) if (strstr(name, (*i)->mfg_name) && strstr(name, (*i)->model_name)) return (*i)->rig_model; return 0; } size_t hamlib_get_index(rig_model_t model) { for (rig_list_t::const_iterator i = hamlib_rigs.begin(); i != hamlib_rigs.end(); ++i) if ((*i)->rig_model == model) return i - hamlib_rigs.begin(); return hamlib_rigs.size(); } rig_model_t hamlib_get_rig_model(size_t i) { try { return hamlib_rigs.at(i)->rig_model; } catch (...) { return 0; } } void hamlib_get_rig_str(int (*func)(const char*)) { string rigstr; for (rig_list_t::const_iterator i = hamlib_rigs.begin(); i != hamlib_rigs.end(); ++i) { rigstr.clear(); rigstr.append((*i)->mfg_name).append(" ").append((*i)->model_name); rigstr.append(" (").append(rig_strstatus((*i)->status)).append(")"); if (!(*func)(rigstr.c_str())) break; } } fldigi-3.21.80/src/rigcontrol/ptt.cxx0000664000175000017500000003505612313147652014367 00000000000000// ---------------------------------------------------------------------------- // // ptt.cxx -- PTT control // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // Copyright (C) 2009 // Diane Bruce, VA3DB // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #if HAVE_SYS_SELECT_H # include #endif #include #include #if HAVE_SYS_IOCTL_H # include #endif #if HAVE_TERMIOS_H # include #endif #include #include #include #include "trx.h" #include "ptt.h" #include "configuration.h" #include "rigio.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "serial.h" #include "re.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); using namespace std; PTT::PTT(ptt_t dev) : pttdev(PTT_INVALID), oldtio(0) { reset(dev); } PTT::~PTT() { close_all(); } void PTT::reset(ptt_t dev) { close_all(); // LOG_VERBOSE("Setting PTT to %d", dev); switch (pttdev = dev) { #if HAVE_UHROUTER case PTT_UHROUTER: if (progdefaults.PTTdev.find(UHROUTER_FIFO_PREFIX) == 0) { pttdev = PTT_UHROUTER; open_uhrouter(); break; } else { pttdev = PTT_NONE; break; } #endif #if HAVE_PARPORT case PTT_PARPORT: open_parport(); if (pttfd < 0) pttdev = PTT_NONE; break; #endif case PTT_TTY: open_tty(); break; default: break; // nothing to open } set(false); } void PTT::set(bool ptt) { if (active_modem == cw_modem && ((progdefaults.useCWkeylineRTS) || progdefaults.useCWkeylineDTR == true)) return; if (!ptt && progdefaults.PTT_off_delay) MilliSleep(progdefaults.PTT_off_delay); switch (pttdev) { case PTT_NONE: default: break; #if USE_HAMLIB case PTT_HAMLIB: hamlib_set_ptt(ptt); break; #endif case PTT_RIGCAT: rigCAT_set_ptt(ptt); break; case PTT_TTY: set_tty(ptt); break; #if HAVE_PARPORT case PTT_PARPORT: set_parport(ptt); break; #endif #if HAVE_UHROUTER case PTT_UHROUTER: set_uhrouter(ptt); break; #endif } if (ptt && progdefaults.PTT_on_delay) MilliSleep(progdefaults.PTT_on_delay); } void PTT::close_all(void) { set(false); switch (pttdev) { case PTT_TTY: close_tty(); break; #if HAVE_PARPORT case PTT_PARPORT: close_parport(); break; #endif #if HAVE_UHROUTER case PTT_UHROUTER: close_uhrouter(); break; #endif default: break; } pttfd = -1; } //-------------------- serial port PTT --------------------// void PTT::open_tty(void) { #ifdef __MINGW32__ serPort.Device(progdefaults.PTTdev); serPort.RTS(progdefaults.RTSplus); serPort.DTR(progdefaults.DTRplus); serPort.RTSptt(progdefaults.RTSptt); serPort.DTRptt(progdefaults.DTRptt); if (serPort.OpenPort() == false) { LOG_ERROR("Cannot open serial port %s", rigio.Device().c_str()); pttfd = -1; return; } LOG_DEBUG("Serial port %s open", progdefaults.PTTdev.c_str()); pttfd = -1; // just a dummy return for this implementation #else # if HAVE_TTYPORT string pttdevName = progdefaults.PTTdev; # ifdef __CYGWIN__ // convert to Linux serial port naming com_to_tty(pttdevName); # endif int oflags = O_RDWR | O_NOCTTY | O_NDELAY; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif if ((pttfd = open(pttdevName.c_str(), oflags)) < 0) { LOG_ERROR("Could not open \"%s\": %s", pttdevName.c_str(), strerror(errno)); return; } oldtio = new struct termios; tcgetattr(pttfd, oldtio); int status; ioctl(pttfd, TIOCMGET, &status); if (progdefaults.RTSplus) status |= TIOCM_RTS; // set RTS bit else status &= ~TIOCM_RTS; // clear RTS bit if (progdefaults.DTRplus) status |= TIOCM_DTR; // set DTR bit else status &= ~TIOCM_DTR; // clear DTR bit ioctl(pttfd, TIOCMSET, &status); LOG_DEBUG("Serial port %s open; status = %02X, %s", progdefaults.PTTdev.c_str(), status, uint2bin(status, 8)); # endif // HAVE_TTYPORT #endif // __MINGW32__ } void PTT::close_tty(void) { #ifdef __MINGW32__ serPort.ClosePort(); LOG_DEBUG("Serial port %s closed", progdefaults.PTTdev.c_str()); #else # if HAVE_TTYPORT if (pttfd >= 0) { tcsetattr(pttfd, TCSANOW, oldtio); close(pttfd); } delete oldtio; # endif // HAVE_TTYPORT #endif // __MINGW32__ } void PTT::set_tty(bool ptt) { #ifdef __MINGW32__ serPort.SetPTT(ptt); #else # if HAVE_TTYPORT int status; ioctl(pttfd, TIOCMGET, &status); if (ptt) { if (progdefaults.RTSptt == true && progdefaults.RTSplus == false) status |= TIOCM_RTS; if (progdefaults.RTSptt == true && progdefaults.RTSplus == true) status &= ~TIOCM_RTS; if (progdefaults.DTRptt == true && progdefaults.DTRplus == false) status |= TIOCM_DTR; if (progdefaults.DTRptt == true && progdefaults.DTRplus == true) status &= ~TIOCM_DTR; } else { if (progdefaults.RTSptt == true && progdefaults.RTSplus == false) status &= ~TIOCM_RTS; if (progdefaults.RTSptt == true && progdefaults.RTSplus == true) status |= TIOCM_RTS; if (progdefaults.DTRptt == true && progdefaults.DTRplus == false) status &= ~TIOCM_DTR; if (progdefaults.DTRptt == true && progdefaults.DTRplus == true) status |= TIOCM_DTR; } LOG_DEBUG("Status %02X, %s", status & 0xFF, uint2bin(status, 8)); ioctl(pttfd, TIOCMSET, &status); # endif // HAVE_TTYPORT #endif // __MINGW32__ } #if HAVE_PARPORT //-------------------- parallel port PTT --------------------// #if HAVE_LINUX_PPDEV_H # include # include #elif HAVE_DEV_PPBUS_PPI_H # include # include #endif void PTT::open_parport(void) { if (progdefaults.PTTdev.find("tty") != string::npos) return; int oflags = O_RDWR | O_NDELAY; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif if ((pttfd = open(progdefaults.PTTdev.c_str(), oflags)) == -1) { LOG_ERROR("Could not open %s: %s", progdefaults.PTTdev.c_str(), strerror(errno)); return; } bool isparport = false; struct stat st; int status; #if HAVE_LINUX_PPDEV_H // Linux (ppdev) isparport = (fstat(pttfd, &st) == 0 && S_ISCHR(st.st_mode) && ioctl(pttfd, PPGETMODE, &status) != -1); #elif HAVE_DEV_PPBUS_PPI_H // FreeBSD (ppbus/ppi) */ isparport = (fstat(pttfd, &st) == 0 && S_ISCHR(st.st_mode) && ioctl(pttfd, PPISSTATUS, &status) != -1); #else // Fallback (nothing) isparport = false; #endif if (!isparport) { LOG_VERBOSE("%s: not a supported parallel port device", progdefaults.PTTdev.c_str()); close_parport(); pttfd = -1; } } void PTT::close_parport(void) { close(pttfd); } void PTT::set_parport(bool ptt) { #ifdef HAVE_LINUX_PPDEV_H struct ppdev_frob_struct frob; frob.mask = PARPORT_CONTROL_INIT; frob.val = !ptt; ioctl(pttfd, PPFCONTROL, &frob); #elif HAVE_DEV_PPBUS_PPI_H u_int8_t val; ioctl(pttfd, PPIGCTRL, &val); if (ptt) val |= nINIT; else val &= ~nINIT; ioctl(pttfd, PPISCTRL, &val); #endif } #endif // HAVE_PARPORT #if HAVE_UHROUTER //-------------------- uhRouter PTT --------------------// // See interface documentation at: // http://homepage.mac.com/chen/w7ay/Router/Contents/routerInterface.html #define FUNCTIONMASK 0x1f #define ROUTERFUNCTION 0x80 #define OPENMICROKEYER (ROUTERFUNCTION + 0x01) // get a port to the microKEYER router #define OPENCWKEYER (ROUTERFUNCTION + 0x02) // get a port to the CW KEYER router #define OPENDIGIKEYER (ROUTERFUNCTION + 0x03) // get a port to the DIGI KEYER router #define QUITIFNOKEYER (ROUTERFUNCTION + 0x1f) // quit if there are no keyers #define QUITIFNOTINUSE (ROUTERFUNCTION + 0x1e) // quit if not connected #define QUITALWAYS (ROUTERFUNCTION + 0x1d) // quit #define CLOSEKEYER (ROUTERFUNCTION + FUNCTIONMASK) #define KEYERFUNCTION 0x40 #define OPENPTT (KEYERFUNCTION + 0x04) // get a port to the PTT flag bit #ifndef PATH_MAX # define PATH_MAX 1024 #endif static ssize_t tm_read(int fd, void* buf, size_t len, const struct timeval* to) { fd_set s; FD_ZERO(&s); FD_SET(fd, &s); struct timeval t; memcpy(&t, to, sizeof(t)); ssize_t n; if ((n = select(fd + 1, &s, 0, 0, &t)) != 1) return n; return read(fd, buf, len); } static ssize_t tm_write(int fd, const void* buf, size_t len, const struct timeval* to) { fd_set s; FD_ZERO(&s); FD_SET(fd, &s); struct timeval t; memcpy(&t, to, sizeof(t)); ssize_t n; if ((n = select(fd + 1, 0, &s, 0, &t)) != 1) return n; return write(fd, buf, len); } static bool open_fifos(const char* base, int fd[2]) { struct stat st; string fifo = base; size_t len = fifo.length(); fifo += "Read"; if (stat(fifo.c_str(), &st) == -1 || !S_ISFIFO(st.st_mode)) { LOG_ERROR("%s is not a fifo", fifo.c_str()); return false; } int oflags = O_RDONLY | O_NONBLOCK; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif if ((fd[0] = open(fifo.c_str(), oflags)) == -1) { LOG_ERROR("Could not open %s: %s", fifo.c_str(), strerror(errno)); return false; } fifo.erase(len); fifo += "Write"; if (stat(fifo.c_str(), &st) == -1 || !S_ISFIFO(st.st_mode)) { LOG_ERROR("%s is not a fifo", fifo.c_str()); return false; } oflags = O_WRONLY | O_NONBLOCK; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif if ((fd[1] = open(fifo.c_str(), oflags)) == -1) { LOG_ERROR("Could not open %s: %s", fifo.c_str(), strerror(errno)); return false; } return true; } static bool get_fifos(const int fd[2], const unsigned char* msg, size_t msglen, char* base, size_t baselen) { struct timeval to = { 2, 0 }; if (tm_write(fd[1], msg, msglen, &to) < (ssize_t)msglen) { LOG_PERROR("Could not write request"); return false; } ssize_t r; if ((r = tm_read(fd[0], base, baselen-1, &to)) <= 0) { LOG_PERROR("Could not read FIFO name"); return false; } base[r] = '\0'; return true; } #ifdef __APPLE__ # include #endif static bool start_uhrouter(void) { #ifdef __APPLE__ int err; FSRef fsr; if ((err = FSPathMakeRef((const UInt8*)"/Applications/µH Router.app", &fsr, NULL)) != noErr) { LOG_ERROR("FSPathMakeRef failed for /Applications/\265H Router.app: error %d", err); return false; } LSApplicationParameters lsap; memset(&lsap, 0, sizeof(lsap)); lsap.version = 0; lsap.flags = kLSLaunchDontAddToRecents | kLSLaunchDontSwitch | kLSLaunchNoParams | kLSLaunchStartClassic; lsap.application = &fsr; lsap.asyncLaunchRefCon = NULL; lsap.environment = NULL; lsap.argv = NULL; lsap.initialEvent = NULL; if ((err = LSOpenApplication(&lsap, NULL)) != noErr) LOG_ERROR("LSOpenApplication failed for /Applications/\265H Router.app: error %d", err); return err == noErr; #else return false; #endif // __APPLE__ } void PTT::open_uhrouter(void) { struct { unsigned char keyer; const char* name; const char* abbrev; } keyers[] = { { OPENMICROKEYER, "microKeyer", "MK" }, { OPENCWKEYER, "CWKeyer", "CK" }, { OPENDIGIKEYER, "DigiKeyer", "DK" } }; size_t start = 0, end = sizeof(keyers)/sizeof(*keyers); // If the device string is something like /tmp/microHamRouter/microKeyer, // or /tmp/microHamRouter/MK, try that keyer only. re_t keyer_re("^" UHROUTER_FIFO_PREFIX "/(.+)$", REG_EXTENDED); if (keyer_re.match(progdefaults.PTTdev.c_str()) && keyer_re.nsub() == 2) { const char* keyer = keyer_re.submatch(1).c_str(); // do we recognise this keyer name? for (size_t i = 0; i < sizeof(keyers)/sizeof(*keyers); i++) { if (!strcasecmp(keyers[i].name, keyer) || !strcasecmp(keyers[i].abbrev, keyer)) { start = i; end = start + 1; break; } } } LOG_VERBOSE("Will try %s", (start == end ? keyers[start].name : "all keyers")); int uhrfd[2]; uhrfd[0] = uhrfd[1] = uhkfd[0] = uhkfd[1] = uhfd[0] = uhfd[1] = -1; if (!open_fifos(UHROUTER_FIFO_PREFIX, uhrfd)) { // if we just started uhrouter we will retry open_fifos a few times unsigned retries = start_uhrouter() ? 30 : 0; while (retries-- && !open_fifos(UHROUTER_FIFO_PREFIX, uhrfd)) MilliSleep(100); if (uhrfd[0] == -1 || uhrfd[1] == -1) { LOG_ERROR("Could not open router"); return; } } char fifo_name[PATH_MAX]; size_t len = PATH_MAX - 8; memset(fifo_name, 0, sizeof(fifo_name)); for (size_t i = start; i < end; i++) { // open keyer if (!get_fifos(uhrfd, &keyers[i].keyer, 1, fifo_name, len) || *fifo_name == '\0') { LOG_VERBOSE("Keyer \"%s\" not found", keyers[i].name); continue; } // open ptt port if (!open_fifos(fifo_name, uhkfd)) { LOG_ERROR("Could not open keyer %s", keyers[i].name); continue; } LOG_VERBOSE("Opened keyer %s", keyers[i].name); unsigned char port = OPENPTT; if (!get_fifos(uhkfd, &port, 1, fifo_name, len)) { LOG_ERROR("Could not get PTT port"); continue; } if (!open_fifos(fifo_name, uhfd)) { LOG_ERROR("Could not open PTT port %s", fifo_name); continue; } LOG_VERBOSE("Successfully opened PTT port of keyer %s", keyers[i].name); break; } // close router FIFOs close(uhrfd[0]); close(uhrfd[1]); } void PTT::close_uhrouter(void) { close(uhfd[0]); close(uhfd[1]); unsigned char c = QUITIFNOTINUSE; write(uhkfd[1], &c, 1); close(uhkfd[0]); close(uhkfd[1]); } void PTT::set_uhrouter(bool ptt) { if (uhfd[0] == -1 || uhfd[1] == -1) return; unsigned char buf[_POSIX_PIPE_BUF]; // empty the fifo while (read(uhfd[0], buf, sizeof(buf)) > 0); // send command *buf = '0' + ptt; LOG_VERBOSE("Sending PTT=%uc", *buf); struct timeval t = { 2, 0 }; if (tm_write(uhfd[1], buf, 1, &t) != 1) { LOG_ERROR("Could not set PTT: %s", strerror(errno)); return; } // wait for status ssize_t n = tm_read(uhfd[0], buf, sizeof(buf), &t); switch (n) { case -1: LOG_PERROR("tm_read"); break; case 0: LOG_ERROR("No reply to PTT command within %jd seconds", (intmax_t)t.tv_sec); break; default: LOG_VERBOSE("Received \"%s\"", str2hex(buf, n)); // last received char should be '1'(?) break; } } #endif // HAVE_UHROUTER fldigi-3.21.80/src/flarq-src/0000775000175000017500000000000012313333727012613 500000000000000fldigi-3.21.80/src/flarq-src/b64.cxx0000664000175000017500000001253512313064025013650 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- //===================================================================== // // base64 encoding / decoding class // // To create a standalone base64 encode/coder: // g++ -DTEST b64.cxx -o base64 // // To use in a calling program: // // base64 b64; // default no CRLF's in output file // base 64 b64(true); // insert CRLF's in output file // pass c++ string into encoder / decoder // return value is encoded / decoded string // original string is left unchanged // // string instr, outstr; // outstr = b64.encoder(instr); // outstr = b64.decoder(instr); //===================================================================== #ifdef HAVE_CONFIG_H # include #endif #include "b64.h" void base64::init() { iolen = 0; iocp = 0; ateof = false; linelength = 0; // create the etable for encoding for (int i = 0; i < 9; i++) { etable[i] = 'A' + i; etable[i + 9] = 'J' + i; etable[26 + i] = 'a' + i; etable[26 + i + 9] = 'j' + i; } for (int i = 0; i < 8; i++) { etable[i + 18] = 'S' + i; etable[26 + i + 18] = 's' + i; } for (int i = 0; i < 10; i++) etable[52 + i] = '0' + i; etable[62] = '+'; etable[63] = '/'; // create the dtable for decoding for (int i= 0; i < 255; i++) dtable[i] = 0x80; for (int i = 'A'; i <= 'I'; i++) dtable[i] = 0 + (i - 'A'); for (int i = 'J'; i <= 'R'; i++) dtable[i] = 9 + (i - 'J'); for (int i = 'S'; i <= 'Z'; i++) dtable[i] = 18 + (i - 'S'); for (int i = 'a'; i <= 'i'; i++) dtable[i] = 26 + (i - 'a'); for (int i = 'j'; i <= 'r'; i++) dtable[i] = 35 + (i - 'j'); for (int i = 's'; i <= 'z'; i++) dtable[i] = 44 + (i - 's'); for (int i = '0'; i <= '9'; i++) dtable[i] = 52 + (i - '0'); dtable[(int)'+'] = 62; dtable[(int)'/'] = 63; dtable[(int)'='] = 0; } string base64::encode(string in) { int n; byte igroup[3], ogroup[4]; output = ""; iocp = 0; ateof = false; if (crlf) linelength = 0; iolen = in.length(); while (!ateof) { igroup[0] = igroup[1] = igroup[2] = 0; for (n = 0; n < 3; n++) { if (iocp == iolen) { ateof = true; break; } igroup[n] = (byte)in[iocp]; iocp++; } if (n > 0) { ogroup[0] = etable[igroup[0] >> 2]; ogroup[1] = etable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)]; ogroup[2] = etable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)]; ogroup[3] = etable[igroup[2] & 0x3F]; if (n < 2) { ogroup[2] = '='; if (n < 1) { ogroup[2] = '='; } } for (int i = 0; i < 4; i++) { if (crlf) if (linelength >= LINELEN) { // output += '\r'; output += '\n'; linelength = 0; } output += (byte)ogroup[i]; if (crlf) linelength++; } } } if (crlf) { // output += '\r'; output += '\n'; } return output; } string base64::decode(string in) { int i; output = ""; iocp = 0; iolen = in.length(); byte c; while (iocp < iolen) { byte a[4], b[4], o[3]; for (i = 0; i < 4; i++) { if (iocp == iolen) { output = "b64 file length error.\n"; return output; } c = in[iocp++]; while (c <= ' ') { if (iocp == iolen) { return output; } c = in[iocp++]; } if (dtable[c] & 0x80) { output = "Illegal character in b64 file.\n"; return output; } a[i] = c; b[i] = (byte)dtable[c]; } o[0] = (b[0] << 2) | (b[1] >> 4); o[1] = (b[1] << 4) | (b[2] >> 2); o[2] = (b[2] << 6) | b[3]; output += o[0]; if (a[2] != '=') { output += o[1]; if (a[3] != '=') output += o[2]; } } return output; } #ifdef TEST #include #include void usage(void) { printf("b64 -- Encode/decode file as base64. Call:\n"); printf(" b64 e/d < infile > outfile\n"); } int main(int argc,char*argv[]) { char opt; bool decoding = false; char * cp; byte c; string inputstring; string infilename; string outputstring; string outfilename; base64 b64; if (argc < 2) { usage(); return(0); } opt = *(argv[1]); if (opt == 'd' || opt == 'D') { while (!std::cin.eof()) { c = std::cin.get(); if (!std::cin.eof()) inputstring += c; } outputstring = b64.decode( inputstring ); size_t len = outputstring.length(); for (size_t n = 0; n < len; n++) std::cout << (unsigned char)outputstring[n]; } else if (opt == 'e' || opt == 'E') { while (!std::cin.eof()) { c = std::cin.get(); if (!std::cin.eof()) inputstring += c; } outputstring = b64.encode( inputstring ); size_t len = outputstring.length(); for (size_t n = 0; n < len; n++) std::cout << (unsigned char)outputstring[n]; } else usage(); return 0; } #endif fldigi-3.21.80/src/flarq-src/flarqenv.cxx0000664000175000017500000002142012313064025015064 00000000000000// ---------------------------------------------------------------------------- // flarqenv.cxx // // Copyright (C) 2009 // Stelios Bounanos, M0GLD // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #ifdef __MINGW32__ # include "compat.h" #endif #if HAVE_SYS_UTSNAME_H # include #endif #include #include #include #include "stacktrace.h" #include "flarq.h" using namespace std; string option_help, version_text, build_text; extern string arq_address, arq_port; extern bool ioMPSK; extern bool SHOWDEBUG; void generate_option_help(void) { ostringstream help; help << "Usage:\n" << " " << PACKAGE_NAME << " [option...]\n\n"; help << PACKAGE_NAME << " options:\n\n" << " --arq-protocol TYPE\n" << " Set the ARQ protocol\n" << " May be either ``fldigi'' or ``multipsk''\n" << " The default is: " << (ioMPSK ? "multipsk" : "fldigi") << "\n\n" << " --arq-server-address HOSTNAME\n" << " Set the ARQ TCP server address\n" << " The default is: " << arq_address << "\n\n" << " --arq-server-port PORT\n" << " Set the ARQ TCP server port\n" << " The default is: " << arq_port << "\n\n" << " --debug\n" << " Enable debugging messages\n\n" << " --version\n" << " Print version information\n\n" << " --build-info\n" << " Print build information\n\n" << " --help\n" << " Print this option help\n\n"; // Fl::help looks ugly so we'll write our own help << "Standard FLTK options:\n\n" << " -bg COLOR, -background COLOR\n" << " Set the background color\n" << " -bg2 COLOR, -background2 COLOR\n" << " Set the secondary (text) background color\n\n" << " -di DISPLAY, -display DISPLAY\n" << " Set the X display to use DISPLAY,\n" << " format is ``host:n.n''\n\n" << " -dn, -dnd or -nodn, -nodnd\n" << " Enable or disable drag and drop copy and paste in text fields\n\n" << " -fg COLOR, -foreground COLOR\n" << " Set the foreground color\n\n" << " -g GEOMETRY, -geometry GEOMETRY\n" << " Set the initial window size and position\n" << " GEOMETRY format is ``WxH+X+Y''\n" << " ** " << PACKAGE_NAME << " may override this setting **\n\n" << " -i, -iconic\n" << " Start " << PACKAGE_NAME << " in iconified state\n\n" << " -k, -kbd or -nok, -nokbd\n" << " Enable or disable visible keyboard focus in non-text widgets\n\n" << " -na CLASSNAME, -name CLASSNAME\n" << " Set the window class to CLASSNAME\n\n" << " -ti WINDOWTITLE, -title WINDOWTITLE\n" << " Set the window title\n\n"; help << "Additional UI options:\n\n" << " --font FONT[:SIZE]\n" << " Set the widget font and (optionally) size\n" << " The default is: " << Fl::get_font(FL_HELVETICA) << ':' << FL_NORMAL_SIZE << "\n\n"; option_help = help.str(); } int parse_args(int argc, char** argv, int& idx) { // Only handle long options if ( !(strlen(argv[idx]) >= 2 && strncmp(argv[idx], "--", 2) == 0) ) return 0; enum { OPT_ZERO, #ifndef __WOE32__ OPT_RX_IPC_KEY, OPT_TX_IPC_KEY, #endif OPT_ARQ_PROTOCOL, OPT_ARQ_ADDRESS, OPT_ARQ_PORT, OPT_FONT, OPT_DEBUG, OPT_DEPRECATED, OPT_HELP, OPT_VERSION, OPT_BUILD_INFO }; const char shortopts[] = "+"; struct option longopts[] = { #ifndef __WOE32__ { "rx-ipc-key", 1, 0, OPT_RX_IPC_KEY }, { "tx-ipc-key", 1, 0, OPT_TX_IPC_KEY }, #endif { "arq-protocol", 1, 0, OPT_ARQ_PROTOCOL }, { "arq-server-address", 1, 0, OPT_ARQ_ADDRESS }, { "arq-server-port", 1, 0, OPT_ARQ_PORT }, { "font", 1, 0, OPT_FONT }, { "debug", 0, 0, OPT_DEBUG }, { "help", 0, 0, OPT_HELP }, { "version", 0, 0, OPT_VERSION }, { "build-info", 0, 0, OPT_BUILD_INFO }, { 0 } }; int longindex; optind = idx; int c = getopt_long(argc, argv, shortopts, longopts, &longindex); switch (c) { case -1: return 0; case 0: // handle options with non-0 flag here return 0; case OPT_ARQ_PROTOCOL: if (!strcmp(optarg, "fldigi")) ioMPSK = false; else if (!strcmp(optarg, "multipsk")) ioMPSK = true; else { cerr << "E: unknown protocol type\n"; exit(EXIT_FAILURE); } break; case OPT_ARQ_ADDRESS: arq_address = optarg; break; case OPT_ARQ_PORT: arq_port = optarg; break; case OPT_FONT: { char *p; if ((p = strchr(optarg, ':'))) { *p = '\0'; FL_NORMAL_SIZE = strtol(p + 1, 0, 10); } Fl::set_font(FL_HELVETICA, optarg); break; } case OPT_DEBUG: SHOWDEBUG = true; break; case OPT_DEPRECATED: cerr << "W: the --" << longopts[longindex].name << " option has been deprecated and will be removed in a future version\n"; break; case OPT_HELP: cout << option_help; exit(EXIT_SUCCESS); case OPT_VERSION: cout << version_text; exit(EXIT_SUCCESS); case OPT_BUILD_INFO: cout << build_text; exit(EXIT_SUCCESS); case '?': default: cerr << "Try `" << PACKAGE_NAME << " --help' for more information.\n"; exit(EXIT_FAILURE); } // Increment idx by the number of args we used and return that number. // We must check whether the option argument is in the same argv element // as the option name itself, i.e., --opt=arg. c = longopts[longindex].has_arg ? 2 : 1; if (c == 2) { string arg = argv[idx]; string::size_type p; if ((p = arg.rfind(optarg)) != string::npos && arg[p-1] == '=') c = 1; } idx += c; return c; } void set_platform_ui(void) { #if defined(__APPLE__) FL_NORMAL_SIZE = 12; #elif defined(__WOE32__) Fl::set_font(FL_HELVETICA, "Tahoma"); FL_NORMAL_SIZE = 11; #else FL_NORMAL_SIZE = 12; #endif } void generate_version_text(void) { version_text.assign(PACKAGE_STRING "\nCopyright (C) 2008, 2009 " PACKAGE_AUTHORS ".\n"); version_text.append("License GPLv3+: GNU GPL version 3 or later " "\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n"); ostringstream s; s << "Build information:\n"; s << " built : " << BUILD_DATE << " by " << BUILD_USER << '@' << BUILD_HOST << " on " << BUILD_BUILD_PLATFORM << " for " << BUILD_TARGET_PLATFORM << "\n\n" << " configure flags: " << BUILD_CONFIGURE_ARGS << "\n\n" << " compiler : " << BUILD_COMPILER << "\n\n" << " compiler flags : " << FLARQ_BUILD_CXXFLAGS << "\n\n" << " linker flags : " << FLARQ_BUILD_LDFLAGS << "\n\n" << " libraries : " "FLTK " FLTK_BUILD_VERSION "\n"; s << "\nRuntime information:\n"; struct utsname u; if (uname(&u) != -1) { s << " system : " << u.sysname << ' ' << u.nodename << ' ' << u.release << ' ' << u.version << ' ' << u.machine << "\n\n"; } build_text = s.str(); } void setup_signal_handlers(void) { #ifndef __WOE32__ struct sigaction action; memset(&action, 0, sizeof(struct sigaction)); // no child stopped notifications, no zombies action.sa_handler = SIG_DFL; action.sa_flags = SA_NOCLDSTOP; #ifdef SA_NOCLDWAIT action.sa_flags |= SA_NOCLDWAIT; #endif sigaction(SIGCHLD, &action, NULL); action.sa_flags = 0; action.sa_handler = handle_signal; sigaction(SIGSEGV, &action, NULL); sigaction(SIGILL, &action, NULL); sigaction(SIGABRT, &action, NULL); sigaction(SIGUSR2, &action, NULL); action.sa_handler = SIG_IGN; sigaction(SIGPIPE, &action, NULL); sigemptyset(&action.sa_mask); sigaddset(&action.sa_mask, SIGUSR2); pthread_sigmask(SIG_BLOCK, &action.sa_mask, NULL); #else signal(SIGSEGV, handle_signal); signal(SIGILL, handle_signal); signal(SIGABRT, handle_signal); #endif } fldigi-3.21.80/src/flarq-src/arq.cxx0000664000175000017500000007530312313064025014042 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include "arq.h" using namespace std; //============================================================================= // status messages //============================================================================= string TXPOLL = "TX: Send Blocks Report"; string STIMEDOUT = "Timed out"; string ABORTXFR = "ABORT transfer"; string RXIDENT = "RX: Link Still Active"; string RXCONREQ = "RX: Connect Request"; string RXCONACK = "RX: Connect OK"; string RXDISCONN = "RX: Disconnect Request"; string RXDISCONACK = "RX: Disconnect OK"; string RXSTATUS = "RX: Status Report"; string RXPOLL = "RX: Send Blocks Report"; string TXSTATUS = "TX: Blocks Received OK"; string TXDISCONN = "TX: Disconnect Request"; string TXDISACK = "TX: Disconnect OK"; string TXBEACON = "TX: Beacon"; string TXCONNECT = "TX: Connect"; string TXCONNACK = "TX: Connect OK"; string TXIDENT = "TX: Watchdog %d"; //bool bPoll = false; string arq::upcase(string s) { for (size_t i = 0; i < s.length(); i++) s[i] = toupper(s[i]); return s; } arq::arq() { sendfnc = NULL; rcvfnc = NULL; printRX = NULL; abortfnc = NULL; disconnectfnc = NULL; qualityfnc = NULL; printRX_DEBUG = NULL; printTX_DEBUG = NULL; rxUrCall = NULL; Header.erase(); MyStreamID = '0'; UrStreamID = '0'; UrCall.erase(); MyCall.erase(); logfile = "server.log"; // queues // TxTextQueue.clear();//erase(); // Text out to mail engine RxTextQueue.clear();//erase(); // Text in from mail engine TxPlainTextQueue.clear();//erase(); RxFrameQueue.clear();//erase(); lastRxChar = 0; TXflag = false; SessionNumber = 0; exponent = EXPONENT; maxheaders = MAXHEADERS; RetryTime = RETRYTIME; Retries = RETRIES; Timeout = TIMEOUT; TxDelay = TXDELAY; immediate = false; primary = false; setBufferlength(); // status variables // // totalRx = 0; // nbrbadRx = 0; totalTx = 0; nbrbadTx = 0; payloadlength = 32; // Average length of payload received // static status Firstsent = MAXCOUNT - 1; // First Header I sent last turn LastHeader = MAXCOUNT - 1; // Last Header I sent last turn Lastqueued = MAXCOUNT - 1; // Last Header in static send queue EndHeader = MAXCOUNT - 1; // Last I received o.k. GoodHeader = MAXCOUNT - 1; // Last Header received consecutive // Ur status UrGoodHeader = MAXCOUNT - 1; // Other station's Good Header UrLastHeader = MAXCOUNT - 1; // Other station's Header last sent UrEndHeader = MAXCOUNT - 1; // Other station's last received Header blkcount = -1; TXflag = false; // TX on LinkState = DOWN; // ARQ link is initially down Sending = 0; PollOK = false; // bABORT = false; MyMissing.clear(); MissingRxBlocks = ""; TxBlocks.clear(); TxMissing.clear(); TxPending.clear(); RxPending.clear(); arqstop = false; retries = baseRetries = Retries; baseRetryTime = RetryTime; baseTimeout = Timeout; retrytime = RetryTime / ARQLOOPTIME; timeout = Timeout / ARQLOOPTIME; loopcount = 0; tx2txdelay = 0;//TxDelay / ARQLOOPTIME; // srand(time(NULL)); } void arq::setBufferlength() { Bufferlength = 1; for (int i = 0; i < exponent; i++) Bufferlength *= 2; MyBlockLengthChar = '0' + exponent; } void arq::resetTx() { Firstsent = MAXCOUNT - 1; // First Header I sent last turn LastHeader = MAXCOUNT - 1; // Last Header I sent last turn Lastqueued = MAXCOUNT - 1; // Last Header in static send queue TxMissing.clear(); TxBlocks.clear(); TxPending.clear(); TxTextQueue.clear(); // UrMissing.clear(); } void arq::resetRx() { RxTextQueue.clear();//erase(); // Text in from mail engine RxFrameQueue.clear();//erase(); lastRxChar = 0; EndHeader = MAXCOUNT - 1; // Last I received o.k. GoodHeader = MAXCOUNT - 1; // Last Header I received conseq. o.k, 1st in send queue RxPending.clear(); MissingRxBlocks = ""; } void arq::reset() { resetTx(); resetRx(); immediate = false; primary = false; blkcount = -1; // bABORT = false; } // new session number // unknown stream id = 0 // known id's from 1 to 63 void arq::newsession() { if (++SessionNumber == 64) SessionNumber = 1; MyStreamID = SessionNumber + '0'; } // get new blocknumber void arq::newblocknumber() { Lastqueued++; Lastqueued %= MAXCOUNT; } // Checksum of header + Header string arq::checksum(string &s) { framecrc.reset(); return framecrc.scrc16(s); } // Start header when MyStreamID has been assigned void arq::newHeader() { Header.erase(); Header += SOH; Header += '0'; // protocol version; } void arq::IdHeader() { newHeader(); Header += UrStreamID; } void arq::UnkHeader() { newHeader(); Header += '0'; } char crlf[3] = " "; void arq::addToTxQue(string s) { // TxTextQueue += "\r\n"; crlf[0] = 0x0D; crlf[1] = 0x0A; TxTextQueue.append(s); TxTextQueue.append(crlf); totalTx++; } // Connect (client:port, server:port) // c Header = Client:port Server:port // e.g.: '00cW1HKJ:1025 KH6TY:24 4' // void arq::connectFrame() { char szGlobals[24]; reset(); UnkHeader(); Header += CONREQ; Payload.erase(); Payload.append(MyCall); Payload.append(":1025"); Payload += ' '; Payload.append(UrCall); Payload.append(":24"); Payload += ' '; Payload += MyStreamID; Payload += ' '; Payload += MyBlockLengthChar; snprintf(szGlobals, 23, " T%dR%dW%d", Timeout/1000, Retries, RetryTime/1000); Payload.append(szGlobals); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); LinkState = CONNECTING; printSTATUS(TXCONNECT, 5.0); } // Connect acknowledge (server:port, client:port) // k Header = Server:port Client:port // e.g: '00kKH6TY:24 W1HKJ:1024 8 6' // void arq::ackFrame () { reset(); IdHeader(); Header += CONACK; Payload.erase(); Payload.append(MyCall); Payload.append(":24"); Payload += ' '; Payload.append(UrCall); Payload += ' '; Payload += MyStreamID; Payload += ' '; Payload += MyBlockLengthChar; Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXCONNACK, 5.0); } // Connect (caller:port, static:port) // c Header = Caller:port static:port // e.g.: '00cW1HKJ:87 KH6TY:87 4' // void arq::ttyconnectFrame() { UnkHeader(); Header += CONREQ; Payload.erase(); Payload.append(MyCall); Payload.append(":87"); Payload += ' '; Payload.append(UrCall); Payload.append(":87"); Payload += ' '; Payload += MyStreamID; Payload += ' '; Payload += MyBlockLengthChar; Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); } // Connect acknowledge (server:port, client:port) // k Header = Server:port Client:port // e.g: '00kKH6TY:87 W1HKJ 4' // Service id # 87 is keyboard-to-keyboard // void arq::ttyackFrame() { IdHeader(); Header += CONACK; Payload.erase(); Payload.append(MyCall); Payload.append(":87"); Payload += ' '; Payload.append(UrCall); Payload += ' '; Payload += MyBlockLengthChar; Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); } // Identify //i frame = '00iKH6TY de W1HKJ' void arq::identFrame() { IdHeader(); Header += IDENT; Payload.erase(); Payload.append(UrCall); Payload.append(" de "); Payload.append(MyCall); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); char szIDENT[80]; snprintf(szIDENT,sizeof(szIDENT), TXIDENT.c_str(), retries); printSTATUS(szIDENT, 5.0); } // e.g. Ping frame // u Header = From:port // e.g: '00uKH6TY:7 ' void arq::pingFrame() { IdHeader(); Header += _UNPROTO; Payload.erase(); Payload.append(MyCall); Payload.append(":7"); Payload += ' '; Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); } // talk frame // similar to UNPROTO frame // but only sent if CONNECTED void arq::talkFrame(string txt) { IdHeader(); Header += _TALK; Payload.erase(); Payload.append(MyCall); Payload.append(":73"); Payload += ' '; if (txt.length() > (size_t)Bufferlength) Payload.append(txt.substr(0, Bufferlength)); else Payload.append(txt); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); } void arq::ackAbortFrame() { IdHeader(); Header += _ACKABORT; Payload.erase(); Payload += (LastHeader + 0x20); Payload += (GoodHeader + 0x20); Payload += (EndHeader + 0x20); Payload.append(MissingRxBlocks); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXSTATUS, 5.0); } // Status report (End, Good, Lastrx, Missing) //p frame = //e.g.: '00sXHCAB' // void arq::statFrame() { IdHeader(); Header += STATUS; Payload.erase(); Payload += (LastHeader + 0x20); Payload += (GoodHeader + 0x20); Payload += (EndHeader + 0x20); Payload.append(MissingRxBlocks); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXSTATUS, 5.0); } // Disconnect session //d frame = "" //e.g.: '00d' void arq::disconnectFrame() { IdHeader(); Header += DISREQ; Payload.erase(); Payload.append(MyCall); Payload.append(":90"); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXDISCONN, 5.0); } void arq::disackFrame() { IdHeader(); Header += _DISACK; Payload.erase(); Payload.append(MyCall); Payload.append(":91"); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXDISACK, 5.0); } // ABORT session //a frame = "" //e.g.: '00a' void arq::abortFrame() { IdHeader(); Header += _ABORT; Payload.erase(); Payload.append(MyCall); Payload.append(":92"); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); } // Beacon frame // u Header = From:port data // e.g: '00uKH6TY:72 Beacon text ' // void arq::beaconFrame(string txt) { UnkHeader(); Header += _UNPROTO; Payload.erase(); Payload.append(MyCall); Payload.append(":72"); Payload += ' '; if (txt.length() > (size_t)Bufferlength) Payload.append(txt.substr(0, Bufferlength)); else Payload.append(txt); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXBEACON, 5.0); } // poll //p frame = //e.g.: '00pXHCAB' void arq::pollFrame() { IdHeader(); Frame = Header; Frame += POLL; Frame.append(MyCall); Frame += SUB; Frame += (LastHeader + 0x20); Frame += (GoodHeader + 0x20); Frame += (EndHeader + 0x20); Frame.append(MissingRxBlocks); Frame.append(checksum(Frame)); Frame += EOT; addToTxQue(Frame); printSTATUS(TXPOLL, 5.0); } // Text frame void arq::textFrame(cTxtBlk block) { IdHeader(); Frame = Header; Frame += (block.nbr() + 0x20); Frame.append(block.text()); Frame.append(checksum(Frame)); Frame += SOH; addToTxQue(Frame); } //===================================================================== void arq::parseIDENT() { timeout = Timeout / ARQLOOPTIME; statFrame(); immediate = true; printSTATUS(RXIDENT, 5.0); } void arq::parseCONREQ() { size_t p1 = 0, p2 = rcvPayload.find(':'); if (p2 == string::npos) return; // if (LinkState == CONNECTED || LinkState == WAITFORACK) return; // disallow multiple connects // requesting stations callsign UrCall = upcase(rcvPayload.substr(p1, p2 - p1)); p1 = rcvPayload.find(' ', p2+1); if (p1 == string::npos) { UrCall.erase(); return; } p1++; p2 = rcvPayload.find(":", p1); string testcall = upcase(rcvPayload.substr(p1, p2 - p1)); if (testcall != MyCall) { UrCall.erase(); return; } p1 = rcvPayload.find(' ', p2 +1); if (p1 == string::npos) { UrCall.erase(); return; } p1++; // *p1 ==> StreamID for requesting station UrStreamID = rcvPayload[p1]; p1++; // *p1 ==> requested block size UrBlockLengthChar = rcvPayload[p1]; p1 += 3; // *p1 ==>" TnnnRnnnWnnn" if (p1 < rcvPayload.length()) { char num[7]; if (rcvPayload[p1] == 'T') { int n = 0; while (rcvPayload[++p1] != 'R' && n < 6) num[n++] = rcvPayload[p1]; num[n] = 0; sscanf(num, "%d", &Timeout); Timeout *= 1000; if (p1 < rcvPayload.length() && rcvPayload[p1] == 'R') { int n = 0; while (rcvPayload[++p1] != 'W' && n < 6) num[n++] = rcvPayload[p1]; num[n] = 0; sscanf(num, "%d", &Retries); if (p1 < rcvPayload.length() && rcvPayload[p1] == 'W') { int n = 0; while (++p1 < rcvPayload.length() && n < 6) num[n++] = rcvPayload[p1]; num[n] = 0; sscanf(num, "%d", &RetryTime); RetryTime *= 1000; Timeout += Retries * RetryTime; } } /* char line[80]; string NewValues = "Temporary control parameters set to\n"; snprintf(line, 79, " Retries = %d\n", Retries); NewValues.append(line); snprintf(line, 79, " Wait time = %d secs\n", RetryTime / 1000); NewValues.append(line); snprintf(line, 79, " Timeout = %d secs\n", Timeout / 1000); NewValues.append(line); printRX(NewValues); */ } } reset(); LinkState = WAITFORACK; newsession(); if (rxUrCall) rxUrCall(UrCall); TxTextQueue.clear();//erase(); ackFrame(); immediate = true; printSTATUS(RXCONREQ, 5.0); } void arq::parseCONACK() { if (LinkState < CONNECTING ) { //!= CONNECTING) { return; // Connect Acknowledge only valid during a connect } size_t p1 = 0, p2 = rcvPayload.find(':'); // LinkState = DOWN; if (p2 == string::npos) return; // requesting stations callsign UrCall = upcase(rcvPayload.substr(p1, p2 - p1)); p1 = rcvPayload.find(' ', p2+1); if (p1 == string::npos) { UrCall.erase(); return; } p1++; p2 = rcvPayload.find(" ", p1); string testcall = upcase(rcvPayload.substr(p1, p2 - p1)); if (testcall != MyCall) { UrCall.erase(); return; } p1++; // *p1 ==> StreamID for requesting station UrStreamID = rcvPayload[p1]; p1++; // *p1 ==> requested block size UrBlockLengthChar = rcvPayload[p1]; RxTextQueue.clear();//erase(); LinkState = CONNECTED; timeout = Timeout / ARQLOOPTIME; statFrame(); immediate = true; primary = true; printSTATUS(RXCONACK, 5.0); } void arq::parseDISREQ() { if (LinkState == DOWN) return; TxTextQueue.clear();//erase(); TxMissing.clear(); TxBlocks.clear(); TxPlainTextQueue.clear(); disackFrame(); immediate = true; LinkState = DOWN; if (rxUrCall) rxUrCall(""); if (disconnectfnc) disconnectfnc(); printSTATUS(RXDISCONN, 5.0); } void arq::parseDISACK() { if (rxUrCall) rxUrCall(""); LinkState = DOWN; printSTATUS(RXDISCONACK, 5.0); } void arq::parseABORT() { reset(); if (abortfnc) abortfnc(); ackAbortFrame(); immediate = true; LinkState = CONNECTED; } void arq::parseACKABORT() { reset(); if (abortfnc) abortfnc(); LinkState = CONNECTED; } void arq::parseUNPROTO() { size_t p1 = 0, p2 = rcvPayload.find(':'); if (p2 == string::npos) return; // requesting stations callsign UrCall = upcase(rcvPayload.substr(p1, p2 - p1)); if (rxUrCall) rxUrCall(UrCall); if (printRX) printRX(rcvPayload + "\n"); } void arq::parseTALK() { size_t p1 = rcvPayload.find(":73"); if (p1 == string::npos) return; string talktext = rcvPayload.substr(p1 + 4); if (printTALK) printTALK(talktext); } void arq::parseSTATUS() { // create the missing list // all reported missing blocks if (LinkState >= CONNECTED) { UrLastHeader = rcvPayload[0] - 0x20; // Other station's Header last sent UrGoodHeader = rcvPayload[1] - 0x20; // Other station's Good Header UrEndHeader = rcvPayload[2] - 0x20; // Other station's last received Header size_t nummissing = rcvPayload.length() - 3; vector missing; // append those reported missing if (nummissing > 0) for (size_t i = 0; i < nummissing; i++) missing.push_back(rcvPayload[i+3] - 0x20); // append those not reported missing from UrEndHeader to LastHeader if (UrEndHeader != LastHeader) { int m = UrEndHeader + 1; if (m > MAXCOUNT) m -= MAXCOUNT; while (m != LastHeader) { missing.push_back(m); m++; if (m > MAXCOUNT) m -= MAXCOUNT; } missing.push_back(LastHeader); } if (missing.empty()) TxMissing.clear(); if (TxMissing.empty() == false) { list keep; list::iterator p = TxMissing.begin(); while (p != TxMissing.end()) { for (size_t n = 0; n < missing.size(); n++) { if (p->nbr() == missing[n]) { keep.push_back(*p); break; } } p++; } TxMissing = keep; } } // print any txpending blocks up to and including UrGoodHeader list ::iterator p1 = TxPending.begin(); p1 = TxPending.begin(); while (p1 != TxPending.end()) { if(p1->nbr() == UrGoodHeader) { if (printTX) printTX(p1->text()); TxPending.erase(p1); break; } else if (printTX) printTX(p1->text()); TxPending.erase(p1); p1 = TxPending.begin(); } switch (LinkState) { case WAITFORACK : LinkState = CONNECTED; break; case DISCONNECTING : if (rxUrCall) rxUrCall(""); LinkState = DOWN; break; case WAITING : LinkState = CONNECTED; break; // case ABORTING : // reset(); // if (abortfnc) abortfnc(); // LinkState = CONNECTED; // break; // case ABORT : // break; default: break; } printSTATUS(RXSTATUS, 5.0); } void arq::parsePOLL() { if (LinkState == DISCONNECTING || LinkState == DOWN || LinkState == TIMEDOUT || LinkState == ABORT ) return; statFrame(); immediate = true; LinkState = CONNECTED; printSTATUS(RXPOLL, 5.0); } void arq::parseDATA() { vector::iterator p1, p2; int n1, n2; if (LinkState < CONNECTED) return; // do not respond if DOWN or TIMEDOUT for (p1 = RxPending.begin(); p1 < RxPending.end(); p1++) if (blknbr == p1->nbr()) { return; } char szStatus[80]; snprintf(szStatus, sizeof(szStatus),"RX: data block %d", blknbr); printSTATUS(szStatus, 5.0); cTxtBlk tempblk(blknbr, rcvPayload); RxPending.push_back (tempblk); for (p1 = RxPending.begin(); p1 < RxPending.end() - 1; p1++) { n1 = p1->nbr(); if (n1 < GoodHeader) n1 += MAXCOUNT; for (p2 = p1 + 1; p2 < RxPending.end(); p2++) { n2 = p2->nbr(); if (n2 < GoodHeader) n2 += MAXCOUNT; if (n2 < n1) { tempblk = *p1; *p1 = *p2; *p2 = tempblk; } } } // compute new EndHeader EndHeader = GoodHeader; if (!RxPending.empty()) { p1 = RxPending.end() - 1; EndHeader = p1->nbr(); } // add RxPending blocks that are consecutive to GoodHeader p1 = RxPending.begin(); while (!RxPending.empty()) { if ((p1->nbr() != (GoodHeader +1) % MAXCOUNT)) break; RxTextQueue.append(p1->text()); GoodHeader = p1->nbr(); if (printRX) printRX(p1->text()); RxPending.erase(p1); p1 = RxPending.begin(); } MissingRxBlocks = ""; if (RxPending.empty()) return; int start = (GoodHeader + 1)%MAXCOUNT; int end = (EndHeader + 1)%MAXCOUNT; int test; bool ok; if (end < start) end += MAXCOUNT; for (int i = start; i < end; i++) { test = (i % MAXCOUNT); ok = false; for (p1 = RxPending.begin(); p1 < RxPending.end(); p1++) { if (test == p1->nbr()) { ok = true; break; } } if (!ok) MissingRxBlocks += test + 0x20; } } bool arq::isUrcall() { if (UrCall.empty()) return false; if (rcvPayload.find(UrCall) != string::npos) return true; return false; } // expects to receive a full frame // txt[0] == SOH // txt[len - 3] ... txt[len] == CRC // returns // -1 invalid frame // -n failed CRC for text type n // n valid frame // rcvPayload will contain the valid payload // int arq::parseFrame(string txt) { if ( txt.length() < 8 ) { return -1; // not a valid frame } Ccrc16 testcrc; size_t len = txt.length(); rcvPayload = txt.substr(4, len - 8); fID = txt[3]; // treat unproto TALK as a special case // no effort made to confirm the data by the CRC value if (fID == _TALK) { if (LinkState >= CONNECTED) { timeout = Timeout / ARQLOOPTIME; parseTALK(); retries = Retries; } return -1; } string sRcvdCRC = testcrc.scrc16( txt.substr(0, len - 4)); if (sRcvdCRC != txt.substr(len - 4) ) { if (printRX_DEBUG) printRX_DEBUG("CRC failed\n"); return -1; // failed CRC test } retries = Retries; switch (fID) { case IDENT : if (!isUrcall()) break; blknbr = fID - 0x20; parseIDENT(); if (printRX_DEBUG) { printRX_DEBUG("IDENT:"); } break; case CONREQ : if (LinkState > TIMEDOUT) break; // disallow multiple connects blknbr = fID - 0x20; parseCONREQ(); if (printRX_DEBUG) { printRX_DEBUG("CONREQ:"); } break; case CONACK : if (!isUrcall()) break; blknbr = fID - 0x20; parseCONACK(); if (printRX_DEBUG) { printRX_DEBUG("CONACK:"); } break; case DISREQ : if (!isUrcall()) break; blknbr = fID - 0x20; parseDISREQ(); if (printRX_DEBUG) { printRX_DEBUG("DISREQ:"); } break; case _DISACK : if (!isUrcall()) break; blknbr = fID - 0x20; parseDISACK(); if (printRX_DEBUG) { printRX_DEBUG("DISACK: "); } break; case STATUS : if (LinkState == DOWN || LinkState == TIMEOUT) break; blknbr = fID - 0x20; parseSTATUS(); if (printRX_DEBUG) { printRX_DEBUG("STATUS:"); } break; case POLL : if (!isUrcall()) { break; } blknbr = fID - 0x20; parsePOLL(); if (printRX_DEBUG) { printRX_DEBUG("POLL:"); } break; case _ABORT : if (!isUrcall()) break; blknbr = fID - 0x20; parseABORT(); if (printRX_DEBUG) { printRX_DEBUG("RCVD ABORT:"); } break; case _ACKABORT : blknbr = fID - 0x20; parseACKABORT(); if (printRX_DEBUG) { printRX_DEBUG("RCVD ACK_ABORT:"); } break; case _UNPROTO : if (LinkState >TIMEDOUT && !isUrcall()) break; // disallow interruption blknbr = fID - 0x20; parseUNPROTO(); if (printRX_DEBUG) { printRX_DEBUG("UNPROTO:"); } break; default : blknbr = fID - 0x20; parseDATA(); if (printRX_DEBUG) { printRX_DEBUG("DATA:"); } } if (printRX_DEBUG) { printRX_DEBUG(txt); printRX_DEBUG("\n"); } if (LinkState == CONNECTED) timeout = Timeout / ARQLOOPTIME; return fID; } void arq::rcvChar( char c ) { if ( c == 0x06 ) { Sending = 0; retrytime = rtry(); timeout = Timeout / ARQLOOPTIME; tx2txdelay = TxDelay / ARQLOOPTIME; return; } if (lastRxChar == SOH && c == SOH) // consecutive characters return; if (lastRxChar == EOT && c == EOT) // consecutive characters return; if (RxFrameQueue.empty()) { if (c == SOH) RxFrameQueue += c; } else { if (c == SOH || c == EOT) { parseFrame(RxFrameQueue); RxFrameQueue.clear();//erase(); if (c == SOH) RxFrameQueue += c; } else RxFrameQueue += c; } lastRxChar = c; } //===================================================================== void arq::sendText (string txt) { size_t offset = 0; cTxtBlk tempblk; if (LinkState < CONNECTED) return; Blocks2Send = 0; while (offset < txt.length()) { newblocknumber(); tempblk.nbr(Lastqueued); tempblk.text(txt.substr(offset, Bufferlength)); offset += Bufferlength; TxBlocks.push_back(tempblk); Blocks2Send++; } } void arq::sendblocks() { char szStatus[80]; int missedblks = 0, newblks = 0; int framecount = 0; cTxtBlk tempblk; if (TxMissing.empty() == false) { list::iterator p = TxMissing.begin(); while (p != TxMissing.end()) { textFrame(*p); p++; framecount++; } } missedblks = framecount; if (!TxBlocks.empty()) { while (TxBlocks.empty() == false && framecount < maxheaders) { tempblk = TxBlocks.front(); if ((tempblk.nbr() + 2)%MAXCOUNT == UrGoodHeader) break; TxBlocks.pop_front(); TxMissing.push_back(tempblk); TxPending.push_back(tempblk); textFrame(tempblk); LastHeader = tempblk.nbr(); framecount++; } } newblks = framecount - missedblks; snprintf(szStatus, sizeof(szStatus),"TX: repeat %d new %d", missedblks, newblks); printSTATUS(szStatus, 0.0); if (!TxMissing.empty() || !TxBlocks.empty()) pollFrame(); if (LinkState != ABORT && LinkState != ABORTING) LinkState = WAITING; } void arq::connect(string callsign) { UrCall = callsign; for (size_t i = 0; i < UrCall.length(); i++) UrCall[i] = toupper(UrCall[i]); if (rxUrCall) rxUrCall(UrCall); TxTextQueue.clear(); connectFrame(); LinkState = CONNECTING; immediate = true; } void arq::disconnect() { Retries = baseRetries; Timeout = baseTimeout; RetryTime = baseRetryTime; totalTx = 0; nbrbadTx = 0; LinkState = DISCONNECT; } void arq::abort() { // bABORT = true; LinkState = ABORT; } void arq::sendBeacon (string txt) { string deText = "<<< FLARQ Beacon >>> de "; deText.append(MyCall); TxTextQueue.clear();//erase(); addToTxQue(deText); beaconFrame(txt); immediate = true; LinkState = DOWN; } void arq::sendPlainText( string txt ) { size_t p = 0; while (p < txt.length()) { talkFrame(txt.substr(p, Bufferlength)); p += Bufferlength; } } void arq::transmitdata() { if (TxTextQueue.empty() == false) { sendfnc(TxTextQueue); Sending = 0x80; if (printTX_DEBUG) printTX_DEBUG(TxTextQueue); TxTextQueue.clear(); tx2txdelay = TxDelay / ARQLOOPTIME; return; } if (TxPlainTextQueue.empty() == false) { sendfnc(TxPlainTextQueue); Sending = 0x80; if (printTX_DEBUG) printTX_DEBUG(TxPlainTextQueue); TxPlainTextQueue.clear(); tx2txdelay = TxDelay / ARQLOOPTIME; } } int arq::rtry() { return RetryTime / ARQLOOPTIME; // return (RetryTime + rand() * 5000 / RAND_MAX) / ARQLOOPTIME; } //--------------------------------------------------------------------- void arqloop(void *who) { arq *me = (arq *)who; char c; // check for received chars including 0x06 for Sending = 0 if (me->getc1(c) == true) { me->rcvChar(c); while (me->getc1(c) == true) me->rcvChar(c); if (me->tx2txdelay < me->TxDelay / ARQLOOPTIME) me->tx2txdelay = me->TxDelay / ARQLOOPTIME; } if (me->Sending == 0) { // not transmitting // wait period between transmits if (me->tx2txdelay > 0) { me->tx2txdelay--; } else { if (me->immediate == true) { me->transmitdata(); me->retrytime = me->rtry(); me->retries = me->Retries; me->immediate = false; } else { switch (me->LinkState) { case CONNECTING : break; case DISCONNECT : me->LinkState = DISCONNECTING; me->TxTextQueue.clear(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxPlainTextQueue.clear(); me->disconnectFrame(); me->immediate = true; break; case DISCONNECTING : if (me->retrytime-- == 0) { me->retrytime = me->rtry(); if (--me->retries) { me->TxTextQueue.clear(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxPlainTextQueue.clear(); me->disconnectFrame(); me->transmitdata(); me->timeout = me->Timeout / ARQLOOPTIME; } } break; case ABORT : me->LinkState = ABORTING; me->TxTextQueue.clear(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxPlainTextQueue.clear(); me->tx2txdelay = 5000/ ARQLOOPTIME; // 5 sec delay for abort me->abortFrame(); me->immediate = true; break; case ABORTING : if (--me->retrytime == 0) { me->retrytime = me->rtry(); if (me->retries--) { me->TxTextQueue.clear(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxPlainTextQueue.clear(); me->abortFrame(); me->transmitdata(); me->timeout = me->Timeout / ARQLOOPTIME; } } break; case WAITING : if (me->retrytime-- == 0) { me->retrytime = me->rtry(); if (--me->retries) { me->TxTextQueue.clear(); me->pollFrame(); me->transmitdata(); me->nbrbadTx++; me->timeout = me->Timeout / ARQLOOPTIME; } } break; case WAITFORACK : if (me->retrytime-- == 0) { me->retrytime = me->rtry(); if (--me->retries) { me->TxTextQueue.clear(); me->ackFrame(); me->transmitdata(); me->nbrbadTx++; me->timeout = me->Timeout / ARQLOOPTIME; } } break; case CONNECTED : default: if (me->TxTextQueue.empty() == false) { me->transmitdata(); } else if ( (me->TxMissing.empty() == false) || (me->TxBlocks.empty() == false)) { me->nbrbadTx += me->TxMissing.size(); me->sendblocks(); me->transmitdata(); } else if ( me->TxPlainTextQueue.empty() == false ) { me->transmitdata(); } break; } me->timeout--; if (me->timeout == 0 // 10000 / ARQLOOPTIME // 10 seconds remaining && me->LinkState == CONNECTED // link is connected && me->primary == true ) { // this is the connecting station if (--me->retries) { // repeat Retries and then allow timeout me->TxTextQueue.clear(); me->identFrame(); // send an identity frame to try to keep me->transmitdata(); // the link up me->timeout = me->rtry(); //10000 / ARQLOOPTIME + 1; } } if (me->timeout == 0) { if (me->LinkState == CONNECTED) me->LinkState = TIMEDOUT; else me->LinkState = DOWN; me->Retries = me->baseRetries; me->Timeout = me->baseTimeout; me->RetryTime = me->baseRetryTime; me->retries = me->Retries; me->retrytime = me->rtry(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxTextQueue.clear(); me->TxPlainTextQueue.clear(); me->timeout = me->Timeout / ARQLOOPTIME; if (me->rxUrCall) me->rxUrCall(""); } if (me->retries == 0) { me->LinkState = DOWN; me->Retries = me->baseRetries; me->Timeout = me->baseTimeout; me->RetryTime = me->baseRetryTime; me->retries = me->Retries; me->retrytime = me->rtry(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxTextQueue.clear(); me->TxPlainTextQueue.clear(); me->timeout = me->Timeout / ARQLOOPTIME; if (me->rxUrCall) me->rxUrCall(""); me->printSTATUS(STIMEDOUT, 10.0); } } } } if (me->arqstop) return; Fl::repeat_timeout( ARQLOOPTIME/1000.0, arqloop, me); } void arq::start_arq() { Fl::add_timeout(1.0, arqloop, this); } //--------------------------------------------------------------------- fldigi-3.21.80/src/flarq-src/flarqrc.rc0000664000175000017500000000040012313064025014475 00000000000000#define BUILD_FLARQ 1 #include "config.h" #define IDI_ICON 101 IDI_ICON ICON DISCARDABLE "flarq.ico" #define RC_FILE_VERSION_QUAD FLARQ_VERSION_MAJOR,FLARQ_VERSION_MINOR,0,0 #define RC_FILE_DESCRIPTION "Fast Light ARQ Application" #include "common.rc" fldigi-3.21.80/src/flarq-src/arqdialogs.fl0000664000175000017500000002350312313064025015177 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0109 header_name {.h} code_name {.cxx} decl {\#include } {} decl {\#include } {} decl {\#include "flarq.h"} {} decl {\#include "flinput2.h"} {public } decl {\#include "flslider2.h"} {public } decl {\#include "combo.h"} {public } Function {arq_dialog()} {} { Fl_Window {} { label flarq callback {arqCLOSE();} open xywh {415 60 515 415} type Double color 50 resizable visible } { Fl_Menu_Bar mnu {open xywh {0 0 516 22} } { Submenu {} { label {&File} open xywh {0 0 70 21} } { MenuItem mnuExit { label {E&xit} callback {arqCLOSE();} xywh {0 0 36 21} } } Submenu mnuSend { label {&Send} open xywh {0 0 70 21} } { MenuItem mnuSendEmail { label Email callback {sendEmailFile();} xywh {0 0 34 21} } MenuItem mnuSendText { label {Text File} callback {sendAsciiFile();} xywh {0 0 36 21} } MenuItem mnuSendImage { label {Image File} callback {sendImageFile();} xywh {0 0 36 21} } MenuItem mnuSendBinary { label {Binary File} callback {sendBinaryFile();} xywh {0 0 36 21} } } MenuItem mnuCompose { label Compose callback {ComposeMail();} xywh {0 0 30 20} code0 {extern void ComposeMail();} } MenuItem mnuConfig { label {&Config} callback {cbMenuConfig();} xywh {0 0 36 21} code0 {extern void cbMenuConfig();} } Submenu mnuHelp { label {&Help} open xywh {0 0 62 20} } { MenuItem mnuHowTo { label {How To} callback {help_cb();} xywh {0 0 30 20} } MenuItem mnuAbout { label {&About} callback {cbMenuAbout();} xywh {5 5 36 21} code0 {extern void cbMenuAbout();} } } } Fl_Group {} {open xywh {0 25 515 60} } { Fl_Group {} {open xywh {0 25 515 31} box ENGRAVED_FRAME } { Fl_Button btnCONNECT { label Connnect callback {arqCONNECT();} tooltip {Connect to other station} xywh {5 28 90 24} color 50 } Fl_Input txtURCALL { tooltip {Connect-to callsign} xywh {97 28 70 24} align 20 class Fl_Input2 } Fl_Light_Button btnBEACON { label Beacon callback {arqBEACON();} tooltip {Beacon ON / OFF} xywh {168 28 79 24} selection_color 2 } Fl_Output txtBeaconing { label {output:} xywh {249 28 261 24} box FLAT_BOX color 50 align 20 resizable code0 {o->type(FL_NORMAL_OUTPUT);} class Fl_Input2 } } Fl_Group {} {open xywh {0 54 515 31} box ENGRAVED_FRAME } { Fl_Box indCONNECT { tooltip {ARQ state} xywh {5 60 18 18} box DIAMOND_DOWN_BOX color 50 labelfont 13 align 24 } Fl_Output txtState { label Disconnecting xywh {27 57 483 24} box FLAT_BOX color 50 align 20 resizable code0 {o->type(FL_NORMAL_OUTPUT);} class Fl_Input2 } } } Fl_Text_Display txtARQ { xywh {0 87 515 117} box DOWN_BOX textfont 4 resizable } Fl_Group {} {open xywh {0 206 516 26} box DOWN_BOX } { Fl_Output txtStatus { tooltip {Status messages} xywh {5 208 220 22} align 20 resizable code0 {o->type(FL_NORMAL_OUTPUT);} class Fl_Input2 } Fl_Output txtStatus2 { xywh {225 208 170 22} align 20 code0 {o->type(FL_NORMAL_OUTPUT);} class Fl_Input2 } Fl_Progress prgStatus { tooltip {Tx/Rx ARQ file transfer progress} xywh {395 210 70 18} selection_color 70 labelfont 1 code0 {o->minimum(0.0);} code1 {o->maximum(1.0);} } Fl_Button btnClearText { label Clear callback {cbClearText();} xywh {468 210 45 20} } } Fl_Group {} { label {Plain Talk} open xywh {0 235 515 180} box ENGRAVED_FRAME align 21 } { Fl_Text_Display txtRX { xywh {5 255 505 130} box DOWN_BOX textfont 4 resizable } Fl_Group {} {open xywh {0 387 515 28} box ENGRAVED_FRAME } { Fl_Input txtTX { label {input:} callback {cbSendTalk();} tooltip {Plain talk text - ENTER to send} xywh {5 390 450 22} align 0 when 8 resizable code0 {txtTX->value("");} code1 {txtTX->maximum_size(80);} class Fl_Input2 } Fl_Button btnSendTalk { label Clear callback {cbClearTalk();} xywh {460 390 49 22} } } } } } Function {arq_configure()} {open } { Fl_Window {} { label {Configure flarq} open selected xywh {475 671 480 162} type Double resizable visible } { Fl_Input txtMyCall { label {My Call:} callback {changeMyCall(o->value());} xywh {98 13 150 24} code0 {o->value(MyCall.c_str());} class Fl_Input2 } Fl_Input txtBEACONTXT { label {Beacon Text} callback {changeBeaconText(o->value());} tooltip {Text for the beacon 64 chars max} xywh {98 42 370 24} resizable code0 {o->value(beacontext.c_str());} class Fl_Input2 } Fl_Spinner spnRetries { label {Retries:} callback {iretries = (int)o->value(); cbSetConfig();} tooltip {\# retries before connection declared down} xywh {146 71 45 22} value 1 code0 {o->minimum(2);} code1 {o->maximum(20);} code2 {o->step(1);} code3 {o->value(iretries);} class Fl_Spinner2 } Fl_Spinner spnWaitTime { label {Wait time (sec):} callback {iwaittime = (int)(1000 * o->value()); cbSetConfig();} tooltip {Time between retries} xywh {121 98 70 22} value 1 code0 {o->minimum(10);} code1 {o->maximum(30);} code2 {o->step(5);} code3 {o->value(iwaittime/1000);} class Fl_Spinner2 } Fl_Spinner spnTimeout { label {Timeout (sec):} callback {itimeout = (int)(o->value() * 1000.0); cbSetConfig();} tooltip {Time out for dead connection} xywh {121 126 70 22} value 1 code0 {o->minimum(30);} code1 {o->maximum(300);} code2 {o->step(15);} code3 {o->value(itimeout / 1000);} class Fl_Spinner2 } Fl_Spinner spnTxDelay { label {Tx delay (msec):} callback {txdelay = (int)o->value(); cbSetConfig();} tooltip {delay from Rx to Tx} xywh {317 98 70 22} value 1 code0 {o->minimum(200);} code1 {o->maximum(2000);} code2 {o->step(100);} code3 {o->value(txdelay);} class Fl_Spinner2 } Fl_Spinner spnBcnInterval { label {Beacon interval (sec)} callback {bcnInterval = (int)o->value(); cbSetConfig();} tooltip {Time between beacon transmissions} xywh {398 71 70 22} value 120 code0 {o->minimum(60); o->maximum(3600);} code1 {o->step(30);} code2 {o->value(bcnInterval);} class Fl_Spinner2 } Fl_Button btnOK { label Ok callback {closeConfig();} xywh {406 126 62 24} } Fl_Group choiceBlockSize { label {Block Size:} callback {exponent = (int)o->index() + 4; cbSetConfig();} open xywh {314 126 72 24} box DOWN_BOX color 7 align 4 class Fl_ComboBox } {} } } Function {arq_SendSelect()} {open } { Fl_Window {} { label {Select Email} open xywh {427 717 500 170} type Double hide resizable modal } { Fl_Box tblOutgoing { xywh {0 3 500 140} box DOWN_BOX color 7 selection_color 246 align 16 code0 {\#include "table.h"} class Table } Fl_Button send_Cancel { label Cancel callback {sendCancel();} xywh {335 145 70 20} code0 {extern void sendCancel();} } Fl_Return_Button send_OK { label OK callback {sendOK();} xywh {420 145 72 20} code0 {extern void sendOK();} } } } Function {arq_composer()} {open } { Fl_Window {} { label {Flarq Mail Composer} open xywh {575 537 515 275} type Double hide resizable } { Fl_Input inpMailTo { label {To:} xywh {48 4 460 24} class Fl_Input2 } Fl_Input inpMailSubj { label {Subj:} xywh {48 30 460 24} class Fl_Input2 } Fl_Text_Editor txtMailText { xywh {0 56 510 188} resizable } Fl_Pack {} {open xywh {0 247 515 28} type HORIZONTAL } { Fl_Button btnOpenComposedMail { label Open callback {cb_OpenComposeMail();} tooltip {Open existing Composed email} xywh {4 251 70 20} code0 {extern void cb_OpenComposeMail();} } Fl_Box {} { xywh {75 251 5 20} } Fl_Button btnClearComposer { label Clear callback {cb_ClearComposer();} tooltip {Clear all fields} xywh {81 251 70 20} code0 {extern void cb_ClearComposer();} } Fl_Box {} { xywh {152 251 5 20} } Fl_Button btnUseTemplate { label Template callback {cb_UseTemplate();} tooltip {Use template file} xywh {159 251 70 20} code0 {extern void cb_UseTemplate();} } Fl_Box {} { xywh {230 251 127 20} resizable } Fl_Button btnCancelComposedMail { label Cancel callback {cb_CancelComposeMail();} tooltip {Close Dialog} xywh {358 251 70 20} code0 {extern void cb_CancelComposeMail();} } Fl_Box {} { xywh {429 251 5 20} } Fl_Button btnSaveComposedMail { label Save callback {cb_SaveComposeMail();} tooltip {Save this message (shift click Save Template)} xywh {436 251 70 20} code0 {extern void cb_SaveComposeMail();} } } } } fldigi-3.21.80/src/flarq-src/flarq.cxx0000664000175000017500000012525612313064025014367 00000000000000// ---------------------------------------------------------------------------- // flarq.cxx - Fast Light ARQ Application // // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // this tests depends on a modified FL/filename.H in the Fltk-1.3.0 // change //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) // to //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) && !defined(__WOE32__) #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include "fileselect.h" #include "socket.h" #include #include "threads.h" #include "flarq.h" #include "flarqenv.h" #include "flmisc.h" #include "stacktrace.h" #include "icons.h" #include "arq.h" #include "arqdialogs.h" #include "b64.h" #include "gettext.h" #define FLDIGI_port "7322" #define MPSK_port "3122" #define MPSK_TX "TX" #define MPSK_RX "RX" #define MPSK_TX2RX "RX_AFTER_TX" #define MPSK_BYTE 25 #define MPSK_CMD 26 #define MPSK_END 27 #define MPSK_ISTX 28 #define MPSK_ISRX 29 #define MPSK_ISCMD 30 #define MPSK_CMDEND 31 // directory structures for all NBEMS applications static void checkdirectories(void); string NBEMS_dir; string ARQ_dir; string ARQ_files_dir; string ARQ_recv_dir; string ARQ_send_dir; string ARQ_mail_dir; string ARQ_mail_in_dir; string ARQ_mail_out_dir; string ARQ_mail_sent_dir; string WRAP_dir; string WRAP_recv_dir; string WRAP_send_dir; string WRAP_auto_dir; string ICS_dir; string ICS_msg_dir; string ICS_tmp_dir; string MailFileName = ""; string MailSaveFileName = ""; string Logfile; struct dirent *entry; DIR *dp; bool SendingEmail = false; bool SHOWDEBUG = false; extern void STATUSprint(string s); Fl_Text_Buffer *txtbuffARQ; Fl_Text_Buffer *stylebufARQ; Fl_Text_Buffer *txtbuffRX; Fl_Text_Buffer *stylebufRX; Fl_Text_Buffer *txtbuffComposer; //Fl_Text_Buffer *styleComposer; Fl_Text_Display::Style_Table_Entry styletable[] = { // Style table { FL_BLACK, FL_SCREEN, FL_NORMAL_SIZE }, // A - RX { FL_DARK_RED, FL_SCREEN, FL_NORMAL_SIZE }, // B - TX { FL_DARK_GREEN, FL_SCREEN, FL_NORMAL_SIZE }, // C - DEBUG rx text { FL_MAGENTA, FL_SCREEN, FL_NORMAL_SIZE } // D - DEBUG tx text }; Fl_Double_Window *arqwin = 0; Fl_Double_Window *dlgconfig = 0; Fl_Double_Window *outdialog = 0; Fl_Double_Window *composer = 0; using namespace std; arq *digi_arq; bool traffic = false; bool sendingfile = false; int arqstate = 0; bool configured = false; bool ioMPSK = false; string arq_address = "127.0.0.1"; string arq_port = FLDIGI_port; string RX; string TX; string teststring; string statusmsg; string MyCall; string beacontext; #if !defined(__APPLE__) && !defined(__WOE32__) && USE_X Pixmap flarq_icon_pixmap; #endif Socket *tcpip = 0; string txbuffer; string cmdbuffer; string rxbuffer; size_t bufsize = 0; size_t bufptr = 0; bool isRxChar = false; bool isCmdChar = false; bool isTxChar = false; bool inLoop = false; int exponent = 5; int txdelay = 500; int iretries = 5; long iwaittime = 10000; long itimeout = 60000; int bcnInterval = 30; bool autobeacon = false; bool beaconrcvd = false; int blocksSent = 0; int mainX = 0, mainY = 0, mainW = 600, mainH = 500; float vers = 0; float version; const char *ASCII[32] = { "", "", "", "", // 0x00 - 0x03 "", "", "", "", // 0x04 - 0x07 "", "", "", "", // 0x08 - 0x0B "", "", "", "", // 0x0C - 0x0F "", "", "", "", // 0x10 - 0x13 "", "", "", "", // 0x14 - 0x17 "", "", "", "", // 0x18 - 0x1B "", "", "", "" // 0x1C - 0x1F }; string AsciiChars; string incomingText = ""; string txtarqload = ""; string rxfname = ""; string arqstart = "ARQ::STX\n"; string arqend = "ARQ::ETX\n"; string arqfile = "ARQ:FILE::"; string arqemail = "ARQ:EMAIL::\n"; string arqascii = "ARQ:ENCODING::ASCII\n"; string arqbase64 = "ARQ:ENCODING::BASE64\n"; string arqsizespec = "ARQ:SIZE::"; size_t startpos = string::npos; size_t endpos = string::npos; size_t fnamepos = string::npos; size_t indx = string::npos; size_t sizepos = string::npos; size_t lfpos = string::npos; size_t arqPayloadSize = 0; bool haveemail = false; bool rxARQfile = false; bool rxARQhavesize = false; bool rxTextReady = false; time_t StartTime_t; time_t EndTime_t; time_t TransferTime_t; double TransferTime; //============================================================================= // email selector //============================================================================= int datedir = 1; int todir = 1; int subdir = 1; string sendfilename = ""; void cb_SortByDate() { if (datedir == 0) { tblOutgoing->sort(1, false); datedir = 1; } else { tblOutgoing->sort(1, true); datedir = 0; } tblOutgoing->redraw(); } void cb_SortByTo() { if (todir == 0) { tblOutgoing->sort(2, false); todir = 1; } else { tblOutgoing->sort(2, true); todir = 0; } tblOutgoing->redraw(); } void cb_SortBySubj() { if (subdir == 0) { tblOutgoing->sort(3, false); subdir = 1; } else { tblOutgoing->sort(3, true); subdir = 0; } tblOutgoing->redraw(); } void sendOK() { outdialog->hide(); int sel = tblOutgoing->value(); if (sel >= 0) sendfilename = tblOutgoing->valueAt(sel,0); else sendfilename.clear(); } void sendCancel() { outdialog->hide(); sendfilename.clear(); } void selectTrafficOut(bool ComposerOnly) { if (outdialog == 0) { outdialog = arq_SendSelect(); outdialog->xclass(PACKAGE_TARNAME); tblOutgoing->addHiddenColumn ("fnbr"); // column #0 tblOutgoing->addColumn ("Date", 180); // column #1 tblOutgoing->addColumn ("To", 120); // column #2 tblOutgoing->addColumn ("Subj", 196); // column #3 tblOutgoing->colcallback (1, cb_SortByDate); tblOutgoing->columnAlign(1, FL_ALIGN_LEFT); tblOutgoing->colcallback (2, cb_SortByTo); tblOutgoing->columnAlign(2, FL_ALIGN_LEFT); tblOutgoing->colcallback (3, cb_SortBySubj); tblOutgoing->columnAlign(3, FL_ALIGN_LEFT); tblOutgoing->allowSort(true); tblOutgoing->rowSize (14); tblOutgoing->headerSize (14); tblOutgoing->allowResize (true); tblOutgoing->gridEnabled (true); } tblOutgoing->clear(); string fline, fname, fdate, fto, fsubj; char szline[10000]; size_t p; string folder = ARQ_mail_out_dir; dp = 0; dp = opendir(folder.c_str()); if (dp == 0) { string nfound = folder; nfound += " not found"; fl_message("%s", nfound.c_str()); return; } int nummails = 0; while ((entry = readdir(dp)) != 0) { if (entry->d_name[0] == '.') continue; fname = folder; fname.append(entry->d_name); if (fname.find(".eml") == string::npos) continue; int validlines = 0; ifstream emailtxt(fname.c_str()); while (!emailtxt.eof()) { memset(szline, 0, 10000); emailtxt.getline(szline,10000); fline = szline; if ((p = fline.find("Date: ")) != string::npos) { fdate = fline.substr(p + 6); validlines++; continue; } if ((p = fline.find("To: ")) != string::npos) { fto = fline.substr(p + 4); p = fto.find('@'); if (p != string::npos) fto.replace(p,1,"@@"); p = fto.find("<"); if (p != string::npos) fto.erase(p,1); p = fto.find(">"); if (p != string::npos) fto.erase(p,1); validlines++; continue; } if ((p = fline.find("Subject: ")) != string::npos) { fsubj = fline.substr(p + 9); validlines++; continue; } if ((p = fline.find("//FLARQ COMPOSER")) != string::npos) validlines++; } emailtxt.close(); if ((!ComposerOnly && validlines >= 3) || (ComposerOnly && validlines == 4)) { tblOutgoing->addRow (4, fname.c_str(), fdate.c_str(), fto.c_str(), fsubj.c_str()); nummails++; } } if (nummails) { tblOutgoing->FirstRow(); outdialog->show(); while (outdialog->shown()) Fl::wait(); } else fl_message2("No emails for delivery"); } //====================================================================================== // simple email composer //====================================================================================== extern bool fileExists(string fname); void cb_CancelComposeMail() { composer->hide(); } void readComposedFile(string filename) { ifstream textfile; textfile.open(filename.c_str()); if (textfile) { char szline[10000]; string fline, tempstr; size_t p; txtbuffComposer->text(""); while (!textfile.eof()) { memset(szline,0, 10000); textfile.getline(szline,10000); fline = szline; if ((p = fline.find("//FLARQ COMPOSER")) != string::npos) continue; if ((p = fline.find("Date: ")) != string::npos) continue; if ((p = fline.find("From:")) != string::npos) continue; if ((p = fline.find("To: ")) != string::npos) { tempstr = fline.substr(p + 4); p = tempstr.find("<"); if (p != string::npos) tempstr.erase(p,1); p = tempstr.find(">"); if (p != string::npos) tempstr.erase(p,1); inpMailTo->value(tempstr.c_str()); continue; } if ((p = fline.find("Subject: ")) != string::npos) { inpMailSubj->value(fline.substr(p + 9).c_str()); continue; } if (strlen(szline) == 0 && txtbuffComposer->length() == 0) continue; txtbuffComposer->append(szline); txtbuffComposer->append("\n"); } textfile.close(); } } void cb_UseTemplate() { string templatename = ARQ_mail_out_dir; const char *p = FSEL::select("Load Template file", "*.tpl", templatename.c_str()); if (p) readComposedFile(p); } void cb_ClearComposer() { sendfilename.clear(); txtbuffComposer->text(""); inpMailTo->value(""); inpMailSubj->value(""); } string nextEmailFile(string fname) { int nbr = 0; char szNbr[20]; string name; string ext; string nuname; size_t p; p = fname.find_last_of('.'); if (p != string::npos) { ext = fname.substr(p); name = fname.substr(0,p); } else { ext = ""; name = fname; } do { nbr++; nuname = name; #ifdef __WOE32__ snprintf(szNbr, sizeof(szNbr), "-%-d", nbr); #else snprintf(szNbr, sizeof(szNbr), "%-d", nbr); #endif nuname.append(szNbr); nuname.append(ext); } while (fileExists(nuname)); return nuname; } void saveComposedText(string filename) { ofstream textfile; textfile.open(filename.c_str()); textfile << "//FLARQ COMPOSER" << endl; char szmaildt[100]; time_t maildt = time(NULL); struct tm *gmt = gmtime(&maildt); strftime(szmaildt, sizeof(szmaildt), "%x %X", gmt); textfile << "Date: " << szmaildt << endl; textfile << "To: " << inpMailTo->value() << endl; textfile << "From: " << endl; textfile << "Subject: " << inpMailSubj->value() << endl; textfile << endl << txtbuffComposer->text() << endl; textfile.close(); cb_ClearComposer(); } void SaveComposeMail() { if (strlen(inpMailTo->value()) == 0 || strlen(inpMailSubj->value()) == 0) return; if (sendfilename.empty()) { sendfilename = ARQ_mail_out_dir; sendfilename += "flarqmail.eml"; sendfilename = nextEmailFile(sendfilename); } saveComposedText(sendfilename); } void SaveComposeTemplate() { string templatename = ARQ_mail_out_dir; const char *p = FSEL::saveas("Save Template file", "*.tpl", templatename.c_str()); if (p) saveComposedText(p); } void cb_SaveComposeMail() { if (Fl::event_state(FL_SHIFT)) SaveComposeTemplate(); else SaveComposeMail(); } void cb_OpenComposeMail() { sendfilename.clear(); selectTrafficOut(true); if (sendfilename.empty()) return; readComposedFile(sendfilename); } void ComposeMail() { if (composer == 0) { composer = arq_composer(); composer->xclass(PACKAGE_TARNAME); txtbuffComposer = new Fl_Text_Buffer(); txtMailText->buffer(txtbuffComposer); txtMailText->wrap_mode(1,80); } txtbuffComposer->text(""); inpMailTo->value(""); inpMailSubj->value(""); composer->show(); } //====================================================================================== string noCR(string s) { string text = s; size_t p; while ((p = text.find('\r')) != string::npos) text.erase(p,1); return text; } void createAsciiChars() { AsciiChars = ""; AsciiChars += 0x09; // tab AsciiChars += 0x0A; // lf AsciiChars += 0x0D; // cr for (int n = 20; n < 128; n++) AsciiChars += n; } void initVals() { MyCall = "NOCALL"; exponent = digi_arq->getExponent(); iretries = digi_arq->getRetries(); itimeout = digi_arq->getTimeout(); txdelay = digi_arq->getTxDelay(); iwaittime = digi_arq->getWaitTime(); bcnInterval = 30; beacontext = ""; cbMenuConfig(); digi_arq->myCall(MyCall.c_str()); } void testDirectory(string dir) { string tstdir = ARQ_dir; tstdir += '/'; tstdir.append(dir); ifstream test(tstdir.c_str()); if (!test) mkdir(tstdir.c_str(), 0777); else test.close(); } void readConfig() { extern void cbMenuConfig(); string configfname = ARQ_dir; configfname.append("flarq.config"); ifstream configfile(configfname.c_str()); if (configfile) { char tempstr[200]; configfile.getline(tempstr,200); sscanf(tempstr,"%f", &vers); if (int(vers*10) != int(version*10)) initVals(); else { configfile >> MyCall; configfile >> exponent; configfile >> txdelay; configfile >> iretries; configfile >> iwaittime; configfile >> itimeout; configfile >> bcnInterval; configfile >> mainX; configfile >> mainY; configfile >> mainW; configfile >> mainH; configfile.ignore(); configfile.getline(tempstr, 200); beacontext = tempstr; digi_arq->myCall(MyCall.c_str()); digi_arq->setExponent(exponent); digi_arq->setRetries(iretries); digi_arq->setTimeout(itimeout); digi_arq->setTxDelay(txdelay); digi_arq->setWaitTime(iwaittime); } configfile.close(); } else initVals(); } void saveConfig() { string configfname = ARQ_dir; configfname.append("flarq.config"); ofstream configfile(configfname.c_str()); if (configfile) { int mainX = arqwin->x(); int mainY = arqwin->y(); int mainW = arqwin->w(); int mainH = arqwin->h(); configfile << VERSION << endl; configfile << MyCall << endl; configfile << exponent << endl; configfile << txdelay << endl; configfile << iretries << endl; configfile << iwaittime << endl; configfile << itimeout << endl; configfile << bcnInterval << endl; configfile << mainX << endl; configfile << mainY << endl; configfile << mainW << endl; configfile << mainH << endl; configfile << beacontext.c_str() << endl; configfile.close(); } } void cbSetConfig() { digi_arq->setExponent(exponent); digi_arq->setRetries(iretries); digi_arq->setTimeout(itimeout); digi_arq->setTxDelay(txdelay); digi_arq->setWaitTime(iwaittime); } void closeConfig() { if (dlgconfig) dlgconfig->hide(); cbSetConfig(); } void cbMenuConfig() { if (!dlgconfig) { dlgconfig = arq_configure(); dlgconfig->xclass(PACKAGE_TARNAME); choiceBlockSize->add("16"); choiceBlockSize->add("32"); choiceBlockSize->add("64"); choiceBlockSize->add("128"); choiceBlockSize->add("256"); } choiceBlockSize->index(exponent - 4); choiceBlockSize->redraw(); dlgconfig->show(); } void cbMenuAbout() { fl_message2("flarq - ARQ client\nversion: %s\nw1hkj@@w1hkj.com", VERSION); } string txhold = ""; //============================================================================= void mpsk_on() { string s; s.append(1, MPSK_CMD).append(MPSK_TX).append(1, MPSK_END); try { tcpip->send(s); } catch (const SocketException& e) { cerr << e.what() << '\n'; } } void mpsk_off_after_buffer_sent() { string s; s.append(1, MPSK_CMD).append(MPSK_TX2RX).append(1, MPSK_END); try { tcpip->send(s); } catch (const SocketException& e) { cerr << e.what() << '\n'; } } void mpsk_off() { string s; s.append(1, MPSK_CMD).append(MPSK_RX).append(1, MPSK_END); try { tcpip->send(s); } catch (const SocketException& e) { cerr << e.what() << '\n'; } } void MPSK_client_transmit(const string& s) { if (s.empty()) return; string tosend; tosend.reserve(s.length() * 2); for (size_t i = 0; i < s.length(); i++) tosend.append(1, MPSK_BYTE).append(1, s[i]); try { mpsk_on(); tcpip->send(tosend); mpsk_off_after_buffer_sent(); } catch (const SocketException& e) { cerr << e.what() << '\n'; } } void MPSK_Socket_rcv_loop(void *) { if (inLoop) Fl::wait(0.1); inLoop = true; char cs; try { while (tcpip->wait(0)) { tcpip->recv(&cs, 1); if (isRxChar) { rxbuffer += cs; isRxChar = false; continue; } if (isTxChar) { if (cs < 28 || cs > 31) txbuffer += cs; isTxChar = false; continue; } if (isCmdChar) { if (cs == MPSK_CMDEND) { isCmdChar = false; if (cmdbuffer.find("RX_AFTER_TX OK") != string::npos) { rxbuffer += 0x06; cmdbuffer.clear(); txbuffer.clear(); } continue; } cmdbuffer += cs; continue; } if (cs == MPSK_ISRX) { isRxChar = true; continue; } if (cs == MPSK_ISCMD) { isCmdChar = true; continue; } if (cs == MPSK_ISTX) { isTxChar = true; continue; } } } catch (const SocketException& e) { cerr << e.what() << '\n'; } inLoop = false; Fl::add_timeout(0.01, MPSK_Socket_rcv_loop); } //============================================================================= void client_transmit(const string& s ) { try { if (!s.empty()) tcpip->send(s); } catch (const SocketException& e) { cerr << e.what() << '\n'; } } void Socket_rcv_loop(void *) { if (inLoop) Fl::wait(0.1); inLoop = true; try { tcpip->set_nonblocking(true); tcpip->recv(rxbuffer); tcpip->set_nonblocking(false); } catch (const SocketException& e) { cerr << e.what() << '\n'; } inLoop = false; Fl::add_timeout(0.01, Socket_rcv_loop); } bool client_receive(char &c) { if (inLoop) Fl::wait(0.1); inLoop = true; bufsize = rxbuffer.length(); if (bufsize) { if (bufptr < bufsize) { c = rxbuffer[bufptr++]; inLoop = false; return true; } } rxbuffer.clear(); bufsize = 0; bufptr = 0; inLoop = false; return false; } int autobeaconcounter = 0; char bcnMsg[40]; void arqAutoBeacon(void *) { if (autobeacon == true) { int currstate = digi_arq->state(); btnCONNECT->deactivate(); btnCONNECT->redraw(); if (currstate > 0x7F) { txtBeaconing->value("Beaconing"); btnBEACON->deactivate(); btnBEACON->redraw(); Fl::repeat_timeout(1.0, arqAutoBeacon); return; } else if (currstate == DOWN || currstate == TIMEDOUT) { if (autobeaconcounter == 0) { digi_arq->sendBeacon( beacontext ); autobeaconcounter = bcnInterval; Fl::repeat_timeout(1.0 + txdelay / 1000.0, arqAutoBeacon); } else { snprintf(bcnMsg, sizeof(bcnMsg), "Bcn in: %d sec", autobeaconcounter); txtBeaconing->value(bcnMsg); btnBEACON->label("STOP"); btnBEACON->redraw_label(); btnBEACON->activate(); btnBEACON->redraw(); autobeaconcounter--; Fl::repeat_timeout(1.0, arqAutoBeacon); } return; } else { autobeaconcounter = 0; btnBEACON->value(0); btnBEACON->label("Beacon"); btnBEACON->redraw_label(); btnBEACON->activate(); btnBEACON->redraw(); txtBeaconing->value("Beacon Off"); } } else { autobeaconcounter = 0; btnCONNECT->activate(); btnCONNECT->redraw(); btnBEACON->value(0); btnBEACON->label("Beacon"); btnBEACON->redraw_label(); btnBEACON->activate(); btnBEACON->redraw(); txtBeaconing->value("Beacon Off"); } } void arqBEACON() { if (autobeacon == false) { autobeacon = true; Fl::add_timeout(0.01, arqAutoBeacon); } else { autobeacon = false; } } void printstring(string s) { for (size_t n = 0; n < s.length(); n++) if (s[n] < ' ') printf("<%02d>",(int)s[n]); else printf("%c", s[n]); printf("\n"); } void arqCLOSE() { tcpip->close(); saveConfig(); exit(0); } void clearText() { txtarqload = ""; txtbuffARQ->text(""); txtStatus->value(""); txtStatus2->value(""); } void restart() { TX.clear(); rxfname = ""; rxTextReady = false; prgStatus->value(0.0); prgStatus->label(""); prgStatus->redraw(); prgStatus->redraw_label(); rxARQfile = false; sendingfile = false; incomingText.clear(); clearText(); } void arqCONNECT() { if (digi_arq->state() < CONNECTED) { if (strlen(txtURCALL->value()) > 0) digi_arq->connect(txtURCALL->value()); } else { if (rxARQfile || sendingfile) abortTransfer(); else { restart(); digi_arq->disconnect(); txtURCALL->value(""); } } } bool fileExists(string fname) { ifstream test(fname.c_str()); if (test) { test.close(); return true; } return false; } string nextFileName(string fname) { int nbr = 0; char szNbr[20]; string name; string ext; string nuname; size_t p; p = fname.find_last_of('.'); if (p != string::npos) { ext = fname.substr(p); name = fname.substr(0,p); } else { ext = ""; name = fname; } do { nbr++; nuname = name; snprintf(szNbr, sizeof(szNbr), ".dup%-d", nbr); nuname.append(szNbr); nuname.append(ext); } while (fileExists(nuname)); return nuname; } void saveEmailFile() { static char xfrmsg[80]; string tempname; time(&EndTime_t); TransferTime = difftime(EndTime_t, StartTime_t); snprintf(xfrmsg, sizeof(xfrmsg), "Transfer Completed in %4.0f sec's", TransferTime); string savetoname = ARQ_mail_in_dir; if (rxfname.find(".eml") == string::npos) rxfname.append(".eml"); savetoname.append(rxfname); while (fileExists(savetoname)) savetoname = nextFileName(savetoname); ofstream tfile(savetoname.c_str(), ios::binary); if (tfile) { tfile << txtarqload; tfile.close(); } txtStatus->value(xfrmsg); rxfname = ""; txtarqload = ""; rxTextReady = false; } void saveRxFile() { static char xfrmsg[80]; time(&EndTime_t); TransferTime = difftime(EndTime_t, StartTime_t); snprintf(xfrmsg, sizeof(xfrmsg), "Transfer Completed in %4.0f sec's", TransferTime); string savetoname = ARQ_recv_dir; savetoname.append(rxfname); if (fileExists(savetoname)) savetoname = nextFileName(savetoname); ofstream tfile(savetoname.c_str(), ios::binary); if (tfile) { tfile << txtarqload; tfile.close(); } txtStatus->value(xfrmsg); rxfname = ""; txtarqload = ""; rxTextReady = false; } void payloadText(string s) { static char szPercent[10]; string text = noCR(s); string style; style.append(text.length(), 'A'); stylebufARQ->append(style.c_str()); txtARQ->insert(text.c_str()); txtARQ->show_insert_position(); txtARQ->redraw(); incomingText.append (s); if (!rxARQfile) if ((startpos = incomingText.find(arqstart)) != string::npos) { rxARQfile = true; startpos += arqstart.length(); time(&StartTime_t); } if (rxARQfile) { if (!rxARQhavesize) { if ( (sizepos = incomingText.find(arqsizespec)) != string::npos) { sizepos += arqsizespec.length(); if ((lfpos = incomingText.find('\n', sizepos)) != string::npos) { string sizechars = incomingText.substr(sizepos, lfpos - sizepos); sscanf(sizechars.c_str(), "%" PRIuSZ, &arqPayloadSize); rxARQhavesize = true; char statusmsg[40]; snprintf(statusmsg, sizeof(statusmsg), "Rcvg: %d", static_cast(arqPayloadSize)); txtStatus->value(statusmsg); } } } else { if (startpos != string::npos) { float partial = incomingText.length() - startpos; snprintf(szPercent, sizeof(szPercent), "%3.0f %%", 100.0 * partial / arqPayloadSize); prgStatus->value( partial / arqPayloadSize ); prgStatus->label(szPercent); } else { prgStatus->value(0.0); prgStatus->label(""); } prgStatus->redraw(); prgStatus->redraw_label(); } if ((endpos = incomingText.find(arqend)) != string::npos) { haveemail = false; fnamepos = incomingText.find(arqfile); fnamepos += arqfile.length(); indx = incomingText.find('\n', fnamepos); rxfname = incomingText.substr(fnamepos, indx - fnamepos); txtarqload = incomingText.substr(startpos, endpos - startpos); if (incomingText.find(arqbase64) != string::npos) { base64 b64; txtarqload = b64.decode(txtarqload); } if (incomingText.find(arqemail) != string::npos) haveemail = true; incomingText = ""; startpos = string::npos; endpos = string::npos; fnamepos = string::npos; indx = string::npos; sizepos = string::npos; lfpos = string::npos; arqPayloadSize = 0; rxARQfile = false; rxARQhavesize = false; rxTextReady = true; txtStatus->value(""); prgStatus->value(0.0); prgStatus->label(""); prgStatus->redraw(); prgStatus->redraw_label(); } } } void cbClearText() { txtbuffARQ->text(""); } void abortedTransfer() { restart(); txtARQ->insert("transfer aborted\n"); btnCONNECT->activate(); } void abortTransfer() { sendingfile = false; SendingEmail = false; rxARQfile = false; btnCONNECT->label("ABORTING"); btnCONNECT->redraw_label(); btnCONNECT->deactivate(); digi_arq->abort(); } void rxBeaconCallsign(string s) { txtURCALL->value(s.c_str()); beaconrcvd = true; } void moveEmailFile() { if (MailFileName.empty()) return; if (MailSaveFileName.empty()) return; ifstream infile(MailFileName.c_str(), ios::in | ios::binary); if (MailSaveFileName.find(".eml") == string::npos) MailSaveFileName.append(".eml"); while (fileExists(MailSaveFileName)) MailSaveFileName = nextFileName(MailSaveFileName); ofstream outfile(MailSaveFileName.c_str(), ios::out | ios::binary); char c; if (infile && outfile) { while (!infile.eof()) { infile.get(c); outfile.put(c); } infile.close(); outfile.close(); unlink(MailFileName.c_str()); } MailFileName.clear(); MailSaveFileName.clear(); } void sendEmailFile() { if (arqstate < CONNECTED) { fl_alert2("Not connected"); return; } sendfilename.clear(); selectTrafficOut(false); if (sendfilename.empty()) return; char cin; size_t txtsize; string textin = ""; char sizemsg[40]; size_t p; ifstream textfile; textfile.open(sendfilename.c_str(), ios::binary); if (textfile) { for (size_t i = 0; i < sendfilename.length(); i++) if (sendfilename[i] == '\\') sendfilename[i] = '/'; MailFileName = sendfilename; TX.erase(); TX.append(arqfile); MailSaveFileName = ARQ_mail_sent_dir; p = sendfilename.find_last_of('/'); if (p != string::npos) p++; MailSaveFileName.append(sendfilename.substr(p)); TX.append(sendfilename.substr(p)); TX.append("\n"); TX.append(arqemail); while (textfile.get(cin)) // only allow ASCII printable characters if ((cin >= ' ' && cin <= '~') || (cin == 0x09 || (cin == 0x0a) || cin == 0x0d) ) textin += cin; textfile.close(); txtsize = textin.length(); arqPayloadSize = txtsize; blocksSent = 0; snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", static_cast(txtsize)); TX.append(sizemsg); TX.append(arqstart); TX.append(textin); TX.append(arqend); traffic = true; statusmsg = "Sending email: "; statusmsg.append(sendfilename.substr(p)); txtStatus->value(statusmsg.c_str()); SendingEmail = true; sendingfile = true; cbClearText(); return; } traffic = false; sendingfile = false; SendingEmail = false; } void sendAsciiFile() { if (arqstate < CONNECTED) { fl_alert2("Not connected"); return; } string readfromname = ARQ_send_dir; readfromname.append(rxfname); const char *p = FSEL::select("ARQ text file", "*.txt\t*", readfromname.c_str()); char cin; size_t txtsize; string textin = ""; char sizemsg[40]; if (p) { ifstream textfile; textfile.open(p); if (textfile) { TX.erase(); TX.append(arqfile); p = fl_filename_name(p); TX.append(p); TX.append("\n"); TX.append(arqascii); while (textfile.get(cin)) textin += cin; textfile.close(); if ( textin.find_first_not_of(AsciiChars) != string::npos) { fl_alert2("File contains non-ASCII bytes and must be sent as binary."); return; } txtsize = textin.length(); arqPayloadSize = txtsize; blocksSent = 0; snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", static_cast(txtsize)); TX.append(sizemsg); TX.append(arqstart); TX.append(textin); TX.append(arqend); traffic = true; sendingfile = true; statusmsg = "Sending ASCII file: "; statusmsg.append(p); txtStatus->value(statusmsg.c_str()); cbClearText(); return; } } traffic = false; sendingfile = false; } void sendImageFile() { if (arqstate < CONNECTED) { fl_alert2("Not connected"); return; } const char *p = FSEL::select("ARQ image file", "*.{png,jpg,bmp}\t*", ""); char cin; size_t b64size; string textin = ""; string b64text; base64 b64(true); char sizemsg[40]; if (p) { ifstream textfile; textfile.open(p, ios::binary); if (textfile) { TX.erase(); TX.append(arqfile); p = fl_filename_name(p); TX.append(p); TX.append("\n"); TX.append(arqbase64); while (textfile.get(cin)) textin += cin; textfile.close(); b64text = b64.encode(textin); b64size = b64text.length(); snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", static_cast(b64size)); arqPayloadSize = b64size; blocksSent = 0; TX.append(sizemsg); TX.append(arqstart); TX.append(b64text); TX.append(arqend); traffic = true; sendingfile = true; statusmsg = "Sending image: "; statusmsg.append(p); txtStatus->value(statusmsg.c_str()); cbClearText(); return; } } traffic = false; sendingfile = false; } void sendBinaryFile() { if (arqstate < CONNECTED) { fl_alert2("Not connected"); return; } const char *p = FSEL::select("ARQ file", "*", ""); char cin; size_t b64size; string textin = ""; string b64text; base64 b64(true); char sizemsg[40]; if (p) { ifstream textfile; textfile.open(p, ios::binary); if (textfile) { TX.erase(); TX.append(arqfile); p = fl_filename_name(p); TX.append(p); TX.append("\n"); TX.append(arqbase64); while (textfile.get(cin)) textin += cin; textfile.close(); b64text = b64.encode(textin); b64size = b64text.length(); snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", static_cast(b64size)); arqPayloadSize = b64size; blocksSent = 0; TX.append(sizemsg); TX.append(arqstart); TX.append(b64text); TX.append(arqend); traffic = true; sendingfile = true; statusmsg = "Sending binary: "; statusmsg.append(p); txtStatus->value(statusmsg.c_str()); cbClearText(); return; } } traffic = false; sendingfile = false; } char statemsg[80]; void dispState() { int currstate = digi_arq->state(); static char xfrmsg[80]; static char szPercent[10]; arqstate = currstate & 0x7F; if (arqstate == DOWN || arqstate == TIMEDOUT) { if (btnCONNECT->active()) btnCONNECT->label("Connect"); if (!autobeacon) btnBEACON->activate(); // mnuSend->deactivate(); mnu->redraw(); } else if (arqstate == CONNECTED || arqstate == WAITING) { if (btnCONNECT->active()) btnCONNECT->label("Disconnect"); if (!autobeacon) btnBEACON->deactivate(); mnuSend->activate(); mnu->redraw(); } if (rxARQfile || sendingfile) { if (btnCONNECT->active()) btnCONNECT->label("Abort"); } if (btnCONNECT->active()) btnCONNECT->redraw_label(); if (currstate <= 0x7F) // receiving switch (currstate) { case CONNECTING : snprintf(statemsg, sizeof(statemsg), "CONNECTING: %d", digi_arq->getTimeLeft()); txtState->value(statemsg); txtState->redraw(); autobeacon = false; break; case WAITFORACK : snprintf(statemsg, sizeof(statemsg), "WAITING FOR ACK "); txtState->value(statemsg); txtState->redraw(); autobeacon = false; break; case ABORT: case ABORTING : txtState->value("ABORTING XFR"); txtState->redraw(); autobeacon = false; break; case WAITING : case CONNECTED : char szState[80]; snprintf(szState, sizeof(szState),"CONNECTED - Quality = %4.2f", digi_arq->quality()); indCONNECT->color(FL_GREEN); indCONNECT->redraw(); txtState->value(szState); txtURCALL->value( digi_arq->urCall().c_str() ); autobeacon = false; break; case TIMEDOUT : indCONNECT->color(FL_WHITE); indCONNECT->redraw(); txtState->value("TIMED OUT"); txtStatus->value(""); autobeacon = false; beaconrcvd = false; break; case DISCONNECT: case DISCONNECTING: txtState->value("DISCONNECTING"); break; case DOWN : default : indCONNECT->color(FL_WHITE); indCONNECT->redraw(); txtState->value("NOT CONNECTED"); txtStatus->value(""); } if (sendingfile == true) { if (digi_arq->transferComplete()) { time(&EndTime_t); TransferTime = difftime(EndTime_t,StartTime_t); snprintf(xfrmsg, sizeof(xfrmsg), "Transfer Completed in %4.0f sec's", TransferTime); txtStatus->value(xfrmsg); blocksSent = 0; prgStatus->value(0.0); prgStatus->label(""); prgStatus->redraw(); prgStatus->redraw_label(); sendingfile = false; } else { prgStatus->value( digi_arq->percentSent()); snprintf(szPercent, sizeof(szPercent), "%3.0f %%", 100.0 * digi_arq->percentSent()); prgStatus->label(szPercent); prgStatus->redraw(); prgStatus->redraw_label(); } } if (SendingEmail == true) { if (digi_arq->transferComplete()) { time(&EndTime_t); TransferTime = difftime(EndTime_t,StartTime_t); snprintf(xfrmsg, sizeof(xfrmsg), "Transfer Completed in %4.0f sec's", TransferTime); txtStatus->value(xfrmsg); moveEmailFile(); blocksSent = 0; prgStatus->value(0.0); prgStatus->label(""); prgStatus->redraw(); prgStatus->redraw_label(); SendingEmail = false; } else { prgStatus->value( digi_arq->percentSent()); snprintf(szPercent, sizeof(szPercent), "%3.0f %%", 100.0 * digi_arq->percentSent()); prgStatus->label(szPercent); prgStatus->redraw(); prgStatus->redraw_label(); } } } void mainloop(void *) { if (traffic) { digi_arq->sendText(TX); traffic = false; time(&StartTime_t); } dispState(); if (rxTextReady) { if (haveemail) saveEmailFile(); else saveRxFile(); } Fl::repeat_timeout(0.1, mainloop); } void changeMyCall(const char *nucall) { int currstate = digi_arq->state(); if (currstate != DOWN) return; MyCall = nucall; for (size_t i = 0; i < MyCall.length(); i++) MyCall[i] = toupper(MyCall[i]); txtMyCall->value(MyCall.c_str()); digi_arq->myCall(MyCall.c_str()); string title = "flarq "; title.append(VERSION); title.append(" - "); title.append(MyCall); arqwin->label(title.c_str()); } void changeBeaconText(const char *txt) { beacontext = txt; } void TALKprint(string s) { string style; style.append(s.length(), 'A'); stylebufRX->append(style.c_str()); txtRX->insert(s.c_str()); txtRX->show_insert_position(); txtRX->redraw(); } void clear_STATUS(void* arg) { txtStatus2->value(""); } void STATUSprint(string s, double disptime) { txtStatus2->value(s.c_str()); if (disptime > 0.0) { Fl::remove_timeout( clear_STATUS ); Fl::add_timeout( disptime, clear_STATUS ); } } void cbSendTalk() { string tosend; string style; tosend = txtTX->value(); if (tosend.empty()) return; tosend += '\n'; digi_arq->sendPlainText(tosend); txtTX->value(""); style.append(tosend.length(), 'B'); stylebufRX->append(style.c_str()); txtRX->insert(tosend.c_str()); txtRX->show_insert_position(); txtRX->redraw(); } void arqlog(string nom,string s) { static char szGMT[80]; tm *now; time_t tm; string strdebug; time(&tm); now = localtime( &tm ); strftime(szGMT, sizeof(szGMT), "[%X] ", now); for (unsigned int i = 0; i < s.length(); i++) if (s[i] < 32) strdebug += ASCII[(int)s[i]]; else strdebug += s[i]; ofstream logfile(Logfile.c_str(), ios::app); if (logfile) logfile << nom << szGMT << strdebug << endl; } void DEBUGrxprint(string s) { string style; string text = noCR(s); style.append(text.length(), 'C'); stylebufRX->append(style.c_str()); txtRX->insert(text.c_str()); txtRX->show_insert_position(); txtRX->redraw(); arqlog("",s); } void DEBUGtxprint(string s) { string style; string text = noCR(s); style.append(text.length(), 'D'); stylebufRX->append(style.c_str()); txtRX->insert(text.c_str()); txtRX->show_insert_position(); txtRX->redraw(); arqlog("",s); } void TXecho(string s) { string style; blocksSent += s.length(); string text = noCR(s); style.append(text.length(), 'B'); stylebufARQ->append(style.c_str()); txtARQ->insert(text.c_str()); txtARQ->show_insert_position(); txtARQ->redraw(); } void style_unfinished_cb(int, void*) { } void cbClearTalk() { txtbuffRX->text(""); stylebufRX->text(""); } void cb_arqwin(Fl_Widget *, void*) { arqCLOSE(); } int main (int argc, char *argv[] ) { sscanf(VERSION, "%f", &version); set_unexpected(handle_unexpected); set_terminate(diediedie); setup_signal_handlers(); NBEMS_dir.clear(); { string appname = argv[0]; string appdir; char dirbuf[FL_PATH_MAX + 1]; fl_filename_expand(dirbuf, FL_PATH_MAX, appname.c_str()); appdir.assign(dirbuf); #ifdef __WOE32__ size_t p = appdir.rfind("flarq.exe"); if (p != std::string::npos) { appdir.erase(p); string testfile; testfile.assign(appdir).append("NBEMS.DIR"); FILE *testdir = fopen(testfile.c_str(),"r"); if (testdir) { fclose(testdir); NBEMS_dir = appdir; } } if (NBEMS_dir.empty()) { fl_filename_expand(dirbuf, FL_PATH_MAX, "$USERPROFILE/"); NBEMS_dir = dirbuf; } NBEMS_dir.append("NBEMS.files\\"); #else size_t p = appdir.rfind("flarq"); if (p != std::string::npos) { if (appdir.find("./flarq") != std::string::npos) { if (getcwd(dirbuf, FL_PATH_MAX)) appdir.assign(dirbuf).append("/"); } else appdir.erase(p); string testfile; testfile.assign(appdir).append("NBEMS.DIR"); FILE *testdir = fopen(testfile.c_str(),"r"); if (testdir) { fclose(testdir); NBEMS_dir = appdir; } } if (NBEMS_dir.empty()) { fl_filename_expand(dirbuf, FL_PATH_MAX, "$HOME/"); NBEMS_dir = dirbuf; } NBEMS_dir.append(".nbems/"); #endif } checkdirectories(); Logfile = ARQ_dir; Logfile.append("/").append("arqlog.txt"); set_platform_ui(); generate_option_help(); generate_version_text(); int arg_idx; if (Fl::args(argc, argv, arg_idx, parse_args) != argc) { cerr << PACKAGE_NAME << ": bad option `" << argv[arg_idx] << "'\nTry `" << PACKAGE_NAME << " --help' for more information.\n"; exit(EXIT_FAILURE); } createAsciiChars(); // allowable ASCII text chars for ".txt" type of files FSEL::create(); arqwin = arq_dialog(); arqwin->callback(cb_arqwin); arqwin->xclass(PACKAGE_TARNAME); // FL_NORMAL_SIZE may have changed; update the menu items for (int i = 0; i < menu_mnu->size() - 1; i++) if (menu_mnu[i].text) menu_mnu[i].labelsize(FL_NORMAL_SIZE); txtbuffRX = new Fl_Text_Buffer(); txtRX->buffer(txtbuffRX); txtRX->wrap_mode(1,80); stylebufRX = new Fl_Text_Buffer(); txtRX->highlight_data(stylebufRX, styletable, sizeof(styletable) / sizeof(styletable[0]), 'A', style_unfinished_cb, 0); txtbuffARQ = new Fl_Text_Buffer(); txtARQ->buffer(txtbuffARQ); txtARQ->wrap_mode(1,80); stylebufARQ = new Fl_Text_Buffer(); txtARQ->highlight_data(stylebufARQ, styletable, sizeof(styletable) / sizeof(styletable[0]), 'A', style_unfinished_cb, 0); digi_arq = new arq(); try { tcpip = new Socket(Address(arq_address.c_str(), arq_port.c_str())); tcpip->set_timeout(0.01); tcpip->connect(); } catch (const SocketException& e) { string errmsg; errmsg.append("Could not connect to modem program.\nPlease start "); if (ioMPSK) errmsg.append("MultiPSK"); else errmsg.append("fldigi"); errmsg.append(" before flarq."); fl_alert2("%s", errmsg.c_str()); exit(EXIT_FAILURE); } if (ioMPSK) Fl::add_timeout(0.1, MPSK_Socket_rcv_loop); else Fl::add_timeout(0.1, Socket_rcv_loop); // the following sequence of assigning callback functions is mandatory // for the arq class to function if (ioMPSK) digi_arq->setSendFunc (MPSK_client_transmit); else digi_arq->setSendFunc (client_transmit); digi_arq->setGetCFunc (client_receive); digi_arq->setAbortedTransfer(abortedTransfer); digi_arq->setDisconnected(restart); digi_arq->setrxUrCall (rxBeaconCallsign); digi_arq->setPrintRX (payloadText); digi_arq->setPrintTX (TXecho); digi_arq->setPrintTALK (TALKprint); digi_arq->setPrintSTATUS (STATUSprint); if (SHOWDEBUG) { digi_arq->setPrintRX_DEBUG (DEBUGrxprint); digi_arq->setPrintTX_DEBUG (DEBUGtxprint); } digi_arq->start_arq(); readConfig(); string title = "flarq "; title.append(VERSION); title.append(" - "); title.append(MyCall); arqwin->label(title.c_str()); arqwin->resize(mainX, mainY, mainW, mainH); txtBeaconing->value("Beacon Off"); Fl::add_timeout(0.1, mainloop); #ifdef __WOE32__ # ifndef IDI_ICON # define IDI_ICON 101 # endif arqwin->icon((char*)LoadIcon(fl_display, MAKEINTRESOURCE(IDI_ICON))); #elif !defined(__APPLE__) && USE_X make_pixmap(&flarq_icon_pixmap, flarq_icon, argc, argv); arqwin->icon((char *)flarq_icon_pixmap); #endif arqwin->show(argc, argv); return Fl::run(); } static void checkdirectories(void) { struct DIRS { string& dir; const char* suffix; void (*new_dir_func)(void); }; DIRS NBEMS_dirs[] = { { NBEMS_dir, 0, 0 }, { ARQ_dir, "ARQ", 0 }, { ARQ_files_dir, "ARQ/files", 0 }, { ARQ_recv_dir, "ARQ/recv", 0 }, { ARQ_send_dir, "ARQ/send", 0 }, { ARQ_mail_dir, "ARQ/mail", 0 }, { ARQ_mail_in_dir, "ARQ/mail/in", 0 }, { ARQ_mail_out_dir, "ARQ/mail/out", 0 }, { ARQ_mail_sent_dir, "ARQ/mail/sent", 0 }, { WRAP_dir, "WRAP", 0 }, { WRAP_recv_dir, "WRAP/recv", 0 }, { WRAP_send_dir, "WRAP/send", 0 }, { WRAP_auto_dir, "WRAP/auto", 0 }, { ICS_dir, "ICS", 0 }, { ICS_msg_dir, "ICS/messages", 0 }, { ICS_tmp_dir, "ICS/templates", 0 }, }; int r; for (size_t i = 0; i < sizeof(NBEMS_dirs)/sizeof(*NBEMS_dirs); i++) { if (NBEMS_dirs[i].suffix) NBEMS_dirs[i].dir.assign(NBEMS_dir).append(NBEMS_dirs[i].suffix).append("/"); if ((r = mkdir(NBEMS_dirs[i].dir.c_str(), 0777)) == -1 && errno != EEXIST) { cerr << _("Could not make directory") << ' ' << NBEMS_dirs[i].dir << ": " << strerror(errno) << '\n'; exit(EXIT_FAILURE); } else if (r == 0 && NBEMS_dirs[i].new_dir_func) NBEMS_dirs[i].new_dir_func(); } } fldigi-3.21.80/src/flarq-src/include/0000775000175000017500000000000012313333725014234 500000000000000fldigi-3.21.80/src/flarq-src/include/b64.h0000664000175000017500000000116212313064025014712 00000000000000//===================================================================== // // base64 encoding / decoding class // //===================================================================== #include #include #include #include using namespace std; typedef unsigned char byte; class base64 { #define LINELEN 72 private: string output; size_t iolen; size_t iocp; bool ateof; byte dtable[256]; byte etable[256]; int linelength; bool crlf; void init(); public: base64(bool t = false) {crlf = t; init(); }; ~base64(){}; string encode(string in); string decode(string in); }; fldigi-3.21.80/src/flarq-src/include/flarqenv.h0000664000175000017500000000050012313064025016130 00000000000000#ifndef flarqenv_h_ #define flarqenv_h_ #include extern std::string option_help, version_text, build_text; void generate_option_help(void); void generate_version_text(void); int parse_args(int argc, char** argv, int& idx); void set_platform_ui(void); void setup_signal_handlers(void); #endif // flarqenv_h_ fldigi-3.21.80/src/flarq-src/include/arqdialogs.h0000664000175000017500000000464412313150713016455 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0302 #ifndef arqdialogs_h #define arqdialogs_h #include #include "flinput2.h" #include "flslider2.h" #include "combo.h" #include #include extern Fl_Menu_Bar *mnu; extern void ComposeMail(); extern void cbMenuConfig(); extern void cbMenuAbout(); #include #include extern Fl_Button *btnCONNECT; extern Fl_Input2 *txtURCALL; #include extern Fl_Light_Button *btnBEACON; extern Fl_Input2 *txtBeaconing; #include extern Fl_Box *indCONNECT; extern Fl_Input2 *txtState; #include extern Fl_Text_Display *txtARQ; extern Fl_Input2 *txtStatus; extern Fl_Input2 *txtStatus2; #include extern Fl_Progress *prgStatus; extern Fl_Button *btnClearText; extern Fl_Text_Display *txtRX; extern Fl_Input2 *txtTX; extern Fl_Button *btnSendTalk; Fl_Double_Window* arq_dialog(); extern Fl_Menu_Item menu_mnu[]; #define mnuExit (menu_mnu+1) #define mnuSend (menu_mnu+3) #define mnuSendEmail (menu_mnu+4) #define mnuSendText (menu_mnu+5) #define mnuSendImage (menu_mnu+6) #define mnuSendBinary (menu_mnu+7) #define mnuCompose (menu_mnu+9) #define mnuConfig (menu_mnu+10) #define mnuHelp (menu_mnu+11) #define mnuHowTo (menu_mnu+12) #define mnuAbout (menu_mnu+13) extern Fl_Input2 *txtMyCall; extern Fl_Input2 *txtBEACONTXT; extern Fl_Spinner2 *spnRetries; extern Fl_Spinner2 *spnWaitTime; extern Fl_Spinner2 *spnTimeout; extern Fl_Spinner2 *spnTxDelay; extern Fl_Spinner2 *spnBcnInterval; extern Fl_Button *btnOK; extern Fl_ComboBox *choiceBlockSize; Fl_Double_Window* arq_configure(); #include "table.h" extern Table *tblOutgoing; extern void sendCancel(); extern Fl_Button *send_Cancel; #include extern void sendOK(); extern Fl_Return_Button *send_OK; Fl_Double_Window* arq_SendSelect(); extern Fl_Input2 *inpMailTo; extern Fl_Input2 *inpMailSubj; #include extern Fl_Text_Editor *txtMailText; #include extern void cb_OpenComposeMail(); extern Fl_Button *btnOpenComposedMail; extern void cb_ClearComposer(); extern Fl_Button *btnClearComposer; extern void cb_UseTemplate(); extern Fl_Button *btnUseTemplate; extern void cb_CancelComposeMail(); extern Fl_Button *btnCancelComposedMail; extern void cb_SaveComposeMail(); extern Fl_Button *btnSaveComposedMail; Fl_Double_Window* arq_composer(); #endif fldigi-3.21.80/src/flarq-src/include/flarq.h0000664000175000017500000000247612313064025015435 00000000000000#ifndef FLARQ_H #define FLARQ_H #include #define SOHCOUNT 10 extern void arqBEACON(); extern void arqCLOSE(); extern void arqCONNECT(); extern void cbMenuAbout(); extern void cbMenuConfig(); extern void cbSetConfig(); extern void closeConfig(); extern void sendCancel(); extern void sendOK(); extern void cb_SortByDate(); extern void cb_SortByTo(); extern void cb_SortBySubj(); extern void abortTransfer(); extern void cbAbort(); extern void cbClearText(); extern void testDirectory(std::string); extern void cbSendTalk(); extern void cbClearTalk(); extern void help_cb(); extern void sendEmailFile(); extern void sendAsciiFile(); extern void sendImageFile(); extern void sendBinaryFile(); extern void changeMyCall(const char *); extern void changeBeaconText(const char *); extern std::string MyCall; extern std::string InFolder; extern std::string OutFolder; extern std::string MailInFolder; extern std::string MailOutFolder; extern std::string MailSentFolder; extern std::string Logfile; extern std::string beacontext; extern int exponent; extern int txdelay; extern int iretries; extern long iwaittime; extern long itimeout; extern int bcnInterval; extern void cb_SaveComposeMail(); extern void cb_CancelComposeMail(); extern void cb_UseTemplate(); extern void cb_OpenComposeMail(); extern void ComposeMail(); #endif fldigi-3.21.80/src/flarq-src/include/arq.h0000664000175000017500000002611712313064025015111 00000000000000#ifndef arq_H #define arq_H // ---------------------------------------------------------------------------- // arq module arq.h // Copyright (c) 2007-2009, Dave Freese, W1HKJ // // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- // link layer spec for fldigi_arq // // generic Frame format: // dcl[info])12EF // | ||| | | | // | ||| | | +--ASCII or (0x04) character // | ||| | +-------checksum (4xAlphaNum) // | ||| +-------------Payload (1 ... 2^N chars, N 4, 5, 6, 7 8) // | ||+---------------Block type // | |+----------------Stream id // | +-----------------Protocol version number // +---------------------ASCII (0x01) character // BLOCKSIZE = 2^n // #include #include #include #include #include #include #include #include using namespace std; #define DEBUG #define arq_Version "arq 0.1" //===================================================================== // following Block Types are defined in K9PS ARQ Protocol specification #define IDENT 'i' #define CONREQ 'c' #define CONACK 'k' #define REFUSED 'r' #define DISREQ 'd' #define STATUS 's' #define POLL 'p' #define FMTFAIL 'f' // following Block Types are extensions to the K9PS specification #define _ABORT 'a' #define _ACKABORT 'o' #define _DISACK 'b' #define _UNPROTO 'u' #define _TALK 't' //===================================================================== #define SOH 0X01 #define STX 0X02 #define ACK 0X06 #define SUB 0X1A #define EOT 0X04 //===================================================================== //ARQ defaults #define MAXHEADERS 8 // Max. number of missing blocks #define MAXCOUNT 64 // DO NOT CHANGE THIS CONSTANT #define EXPONENT 7 // Bufferlength = 2 ^ EXPONENT = 128 //===================================================================== //link timing defaults #define RETRIES 5 #define RETRYTIME 10000 // # milliseconds between retries #define TXDELAY 500 // # milliseconds from xmt to rcv #define TIMEOUT 60000 // # milliseconds before TIMED OUT #define ARQLOOPTIME 100 // # msec for loop timing //===================================================================== //link states #define DOWN 0 #define TIMEDOUT 1 #define ABORT 3 #define CONNECTING 4 #define CONNECTED 5 #define WAITING 6 #define WAITFORACK 7 #define DISCONNECT 8 #define DISCONNECTING 9 #define ABORTING 10 #define SENDING 0x80; //===================================================================== extern char *ARQASCII[]; // crc 16 cycle redundancy check sum for data block integrity class Ccrc16 { private: unsigned int crcval; char ss[5]; public: Ccrc16() { crcval = 0xFFFF; } ~Ccrc16() {}; void reset() { crcval = 0xFFFF;} unsigned int val() {return crcval;} string sval() { snprintf(ss, sizeof(ss), "%04X", crcval); return ss; } void update(char c) { crcval ^= c & 255; for (int i = 0; i < 8; ++i) { if (crcval & 1) crcval = (crcval >> 1) ^ 0xA001; else crcval = (crcval >> 1); } } unsigned int crc16(char c) { update(c); return crcval; } unsigned int crc16(string s) { reset(); for (size_t i = 0; i < s.length(); i++) update(s[i]); return crcval; } string scrc16(string s) { crc16(s); return sval(); } }; // text block; block # and string of text class cTxtBlk { private: int number; string txt; public: cTxtBlk() {number = -1; txt = "";} cTxtBlk(int n, string text) { number = n; txt = text; } ~cTxtBlk() {} void nbr(int n) { number = n;} int nbr() { return number; } string text() { return txt; } void text(string t) { txt = t;} bool operator <(const cTxtBlk &b)const { return number < b.number; } bool operator ==(const cTxtBlk b)const { return number == b.number; } }; class arq { private: bool arqstop; string MyCall; string UrCall; string Header; string Frame; string Payload; string rcvPayload; string logfile; char MyStreamID; char UrStreamID; char MyBlockLengthChar; char UrBlockLengthChar; char BlockNumberChar; char fID; int blknbr; // queues // string TxTextQueue; // Text out to mail engine string TxPlainTextQueue; // plain text transmit queu string RxTextQueue; // Text in from mail engine string RxFrameQueue; char lastRxChar; bool TXflag; int Bufferlength; int maxheaders; int exponent; // status variables int payloadlength; // Average length of payload received int totalRx; // total number of frames received int totalTx; // total number of frames transmitted int nbrbadRx; // number with crc errors int nbrbadTx; // total number of repeats required // int max_idle; // Dynamic timing slot initial value int SessionNumber; bool PollOK; // used for status handshake bool wrappedFlag; // set true if missing blocks bit count // has wrapped around int retrytime; int RetryTime; int retries; int Retries; int timeout; int Timeout; int tx2txdelay; int TxDelay; int loopcount; int baseRetryTime; int baseTimeout; int baseRetries; bool immediate; bool primary; Ccrc16 framecrc; // My status int Firstsent; // First Header I sent last turn int LastHeader; // Last Header I sent last turn int Lastqueued; // Last Header in static send queue int EndHeader; // Last I received o.k. int GoodHeader; // Last Header received consecutively int blkcount; int Blocks2Send; // number of blocks at beginning of Tx vector MyMissing; // missing Rx blocks string MissingRxBlocks; vector RxPending; // RxPending Rx blocks (not consecutive) list TxBlocks; // fifo of transmit buffers list TxMissing; // fifo of sent; RxPending Status report list TxPending; // fifo of transmitted buffers pending print // Ur status int UrGoodHeader; // Other station's Good Header int UrLastHeader; // Other station's Header last sent int UrEndHeader; // Other station's last received Header vector UrMissing; // Other station's missing Headers int LinkState; // status of ARQ link int Sending; bool bABORT; // Link quality for sending *** used for testing only !! *** // double sendquality; void reset(); void resetTx(); void resetRx(); int rtry(); void setBufferlength(); void checkblocks(); string upcase(string s); void newblocknumber(); void newHeader(); void IdHeader(); void UnkHeader(); void connectFrame(); void disackFrame(); void ackFrame(); void ttyconnectFrame(); void ttyackFrame(); void pollFrame(); void identFrame(); void pingFrame(); void statFrame(); void disconnectFrame(); void abortFrame(); void ackAbortFrame(); void beaconFrame(string txt); void textFrame(cTxtBlk block); void talkFrame(string txt); void addToTxQue(string s); void sendblocks(); void transmitdata(); string frame() {return Frame;} bool isUrcall(); void parseIDENT(); void parseCONREQ(); void parseCONACK(); void parseREFUSED(); void parseDISREQ(); void parseDISACK(); void parseABORT(); void parseACKABORT(); void parseUNPROTO(); void parseSTATUS(); void parsePOLL(); void parseDATA(); void parseTALK(); int parseFrame(string txt); // external functions called by arq class void (*sendfnc)(const string& s); bool (*getc1)(char &); void (*rcvfnc)(); void (*printRX)(string s); void (*printTX)(string s); void (*printRX_DEBUG)(string s); void (*printTX_DEBUG)(string s); void (*printTALK)(string s); void (*abortfnc)(); void (*disconnectfnc)(); void (*rxUrCall)(string s); void (*qualityfnc)(string s); void (*printSTATUS)(string s, double disptime); public: arq(); ~arq() {}; friend void arqloop(void *me); void start_arq(); string checksum(string &s); void myCall(string s) { MyCall = upcase(s);} string myCall() { return MyCall;} void urCall(string s) { UrCall = s;} string urCall() { return UrCall;} void newsession(); void setSendFunc( void (*f)(const string& s)) { sendfnc = f;} void setGetCFunc( bool (*f)(char &)) { getc1 = f;} void setRcvFunc( void (*f)()) { rcvfnc = f;} void setPrintRX( void (*f)(string s)) { printRX = f;} void setPrintTX( void (*f)(string s)) { printTX = f;} void setPrintTALK (void (*f)(string s)) {printTALK = f;} void setPrintRX_DEBUG (void (*f)(string s)){printRX_DEBUG = f;} void setPrintTX_DEBUG (void (*f)(string s)) {printTX_DEBUG = f;} void setPrintSTATUS (void (*f)(string s, double disptime)) { printSTATUS = f;} void setMaxHeaders( int mh ) { maxheaders = mh; } void setExponent( int exp ) { exponent = exp; setBufferlength(); } int getExponent() { return (int) exponent;} void setWaitTime( int rtime ) { RetryTime = rtime; baseRetryTime = rtime; } int getWaitTime() { return (int) RetryTime; } void setRetries ( int rtries ) { retries = Retries = baseRetries = rtries; } int getRetries() { return (int) Retries; } void setTimeout ( int tout ) { Timeout = tout; baseTimeout = tout; } int getTimeout() { return (int) Timeout; } int getTimeLeft() { return (int) timeout * ARQLOOPTIME / 1000; } void setTxDelay ( int r2t ) { TxDelay = r2t; } int getTxDelay() { return (int) TxDelay; } int getRetryCount() { return (int)(Retries - retries + 1); } void setrxUrCall( void (*f)(string s)) { rxUrCall = f;} void setQualityValue( void (*f)(string s)) { qualityfnc = f;} void setAbortedTransfer( void (*f)()) { abortfnc = f;}; void setDisconnected( void (*f)()) { disconnectfnc = f;}; void rcvChar( char c ); void connect(string callsign);//, int blocksize = 6, int retries = 4); void sendblocks( string txt ); void sendBeacon (string txt); void sendPlainText( string txt ); string getText() { return RxTextQueue;} void sendText(string txt); bool connected() { return (LinkState == CONNECTED); } void disconnect(); void abort(); int state() { return (LinkState + Sending);} int TXblocks() { return totalTx;} int TXbad() { return nbrbadTx;} int RXblocks() { return totalRx;} int RXbad() { return nbrbadRx;} double quality() { if (totalTx == 0) return 1.0; return ( 1.0 * (totalTx - nbrbadTx) / totalTx ); } float percentSent() { if (Blocks2Send == 0) return 0.0; if ((TxBlocks.empty() && TxMissing.empty())) return 1.0; return (1.0 * (Blocks2Send - TxBlocks.size() - TxMissing.size()) / Blocks2Send); } bool transferComplete() { if (TxMissing.empty() == false) return false; if (TxBlocks.empty() == false) return false; return true; } }; #endif fldigi-3.21.80/src/flarq-src/arqdialogs.cxx0000664000175000017500000005241112313150713015400 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0302 #include "arqdialogs.h" #include #include #include "flarq.h" static void cb_flarq(Fl_Double_Window*, void*) { arqCLOSE(); } Fl_Menu_Bar *mnu=(Fl_Menu_Bar *)0; static void cb_mnuExit(Fl_Menu_*, void*) { arqCLOSE(); } static void cb_mnuSendEmail(Fl_Menu_*, void*) { sendEmailFile(); } static void cb_mnuSendText(Fl_Menu_*, void*) { sendAsciiFile(); } static void cb_mnuSendImage(Fl_Menu_*, void*) { sendImageFile(); } static void cb_mnuSendBinary(Fl_Menu_*, void*) { sendBinaryFile(); } static void cb_mnuCompose(Fl_Menu_*, void*) { ComposeMail(); } static void cb_mnuConfig(Fl_Menu_*, void*) { cbMenuConfig(); } static void cb_mnuHowTo(Fl_Menu_*, void*) { help_cb(); } static void cb_mnuAbout(Fl_Menu_*, void*) { cbMenuAbout(); } Fl_Menu_Item menu_mnu[] = { {"&File", 0, 0, 0, 64, FL_NORMAL_LABEL, 0, 14, 0}, {"E&xit", 0, (Fl_Callback*)cb_mnuExit, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"&Send", 0, 0, 0, 64, FL_NORMAL_LABEL, 0, 14, 0}, {"Email", 0, (Fl_Callback*)cb_mnuSendEmail, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"Text File", 0, (Fl_Callback*)cb_mnuSendText, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"Image File", 0, (Fl_Callback*)cb_mnuSendImage, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"Binary File", 0, (Fl_Callback*)cb_mnuSendBinary, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Compose", 0, (Fl_Callback*)cb_mnuCompose, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"&Config", 0, (Fl_Callback*)cb_mnuConfig, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"&Help", 0, 0, 0, 64, FL_NORMAL_LABEL, 0, 14, 0}, {"How To", 0, (Fl_Callback*)cb_mnuHowTo, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"&About", 0, (Fl_Callback*)cb_mnuAbout, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0} }; Fl_Button *btnCONNECT=(Fl_Button *)0; static void cb_btnCONNECT(Fl_Button*, void*) { arqCONNECT(); } Fl_Input2 *txtURCALL=(Fl_Input2 *)0; Fl_Light_Button *btnBEACON=(Fl_Light_Button *)0; static void cb_btnBEACON(Fl_Light_Button*, void*) { arqBEACON(); } Fl_Input2 *txtBeaconing=(Fl_Input2 *)0; Fl_Box *indCONNECT=(Fl_Box *)0; Fl_Input2 *txtState=(Fl_Input2 *)0; Fl_Text_Display *txtARQ=(Fl_Text_Display *)0; Fl_Input2 *txtStatus=(Fl_Input2 *)0; Fl_Input2 *txtStatus2=(Fl_Input2 *)0; Fl_Progress *prgStatus=(Fl_Progress *)0; Fl_Button *btnClearText=(Fl_Button *)0; static void cb_btnClearText(Fl_Button*, void*) { cbClearText(); } Fl_Text_Display *txtRX=(Fl_Text_Display *)0; Fl_Input2 *txtTX=(Fl_Input2 *)0; static void cb_txtTX(Fl_Input2*, void*) { cbSendTalk(); } Fl_Button *btnSendTalk=(Fl_Button *)0; static void cb_btnSendTalk(Fl_Button*, void*) { cbClearTalk(); } Fl_Double_Window* arq_dialog() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(515, 415, "flarq"); w = o; o->color(FL_LIGHT1); o->callback((Fl_Callback*)cb_flarq); { mnu = new Fl_Menu_Bar(0, 0, 516, 22); mnu->menu(menu_mnu); } // Fl_Menu_Bar* mnu { Fl_Group* o = new Fl_Group(0, 25, 515, 60); { Fl_Group* o = new Fl_Group(0, 25, 515, 31); o->box(FL_ENGRAVED_FRAME); { btnCONNECT = new Fl_Button(5, 28, 90, 24, "Connnect"); btnCONNECT->tooltip("Connect to other station"); btnCONNECT->color(FL_LIGHT1); btnCONNECT->callback((Fl_Callback*)cb_btnCONNECT); } // Fl_Button* btnCONNECT { txtURCALL = new Fl_Input2(97, 28, 70, 24); txtURCALL->tooltip("Connect-to callsign"); txtURCALL->box(FL_DOWN_BOX); txtURCALL->color(FL_BACKGROUND2_COLOR); txtURCALL->selection_color(FL_SELECTION_COLOR); txtURCALL->labeltype(FL_NORMAL_LABEL); txtURCALL->labelfont(0); txtURCALL->labelsize(14); txtURCALL->labelcolor(FL_FOREGROUND_COLOR); txtURCALL->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtURCALL->when(FL_WHEN_RELEASE); } // Fl_Input2* txtURCALL { btnBEACON = new Fl_Light_Button(168, 28, 79, 24, "Beacon"); btnBEACON->tooltip("Beacon ON / OFF"); btnBEACON->selection_color((Fl_Color)2); btnBEACON->callback((Fl_Callback*)cb_btnBEACON); } // Fl_Light_Button* btnBEACON { Fl_Input2* o = txtBeaconing = new Fl_Input2(249, 28, 261, 24, "output:"); txtBeaconing->box(FL_FLAT_BOX); txtBeaconing->color(FL_LIGHT1); txtBeaconing->selection_color(FL_SELECTION_COLOR); txtBeaconing->labeltype(FL_NORMAL_LABEL); txtBeaconing->labelfont(0); txtBeaconing->labelsize(14); txtBeaconing->labelcolor(FL_FOREGROUND_COLOR); txtBeaconing->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtBeaconing->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtBeaconing); o->type(FL_NORMAL_OUTPUT); } // Fl_Input2* txtBeaconing o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 54, 515, 31); o->box(FL_ENGRAVED_FRAME); { indCONNECT = new Fl_Box(5, 60, 18, 18); indCONNECT->tooltip("ARQ state"); indCONNECT->box(FL_DIAMOND_DOWN_BOX); indCONNECT->color(FL_LIGHT1); indCONNECT->labelfont(13); indCONNECT->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE)); } // Fl_Box* indCONNECT { Fl_Input2* o = txtState = new Fl_Input2(27, 57, 483, 24, "Disconnecting"); txtState->box(FL_FLAT_BOX); txtState->color(FL_LIGHT1); txtState->selection_color(FL_SELECTION_COLOR); txtState->labeltype(FL_NORMAL_LABEL); txtState->labelfont(0); txtState->labelsize(14); txtState->labelcolor(FL_FOREGROUND_COLOR); txtState->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtState->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtState); o->type(FL_NORMAL_OUTPUT); } // Fl_Input2* txtState o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { txtARQ = new Fl_Text_Display(0, 87, 515, 117); txtARQ->box(FL_DOWN_BOX); txtARQ->textfont(4); Fl_Group::current()->resizable(txtARQ); } // Fl_Text_Display* txtARQ { Fl_Group* o = new Fl_Group(0, 206, 516, 26); o->box(FL_DOWN_BOX); { Fl_Input2* o = txtStatus = new Fl_Input2(5, 208, 220, 22); txtStatus->tooltip("Status messages"); txtStatus->box(FL_DOWN_BOX); txtStatus->color(FL_BACKGROUND2_COLOR); txtStatus->selection_color(FL_SELECTION_COLOR); txtStatus->labeltype(FL_NORMAL_LABEL); txtStatus->labelfont(0); txtStatus->labelsize(14); txtStatus->labelcolor(FL_FOREGROUND_COLOR); txtStatus->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtStatus->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtStatus); o->type(FL_NORMAL_OUTPUT); } // Fl_Input2* txtStatus { Fl_Input2* o = txtStatus2 = new Fl_Input2(225, 208, 170, 22); txtStatus2->box(FL_DOWN_BOX); txtStatus2->color(FL_BACKGROUND2_COLOR); txtStatus2->selection_color(FL_SELECTION_COLOR); txtStatus2->labeltype(FL_NORMAL_LABEL); txtStatus2->labelfont(0); txtStatus2->labelsize(14); txtStatus2->labelcolor(FL_FOREGROUND_COLOR); txtStatus2->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtStatus2->when(FL_WHEN_RELEASE); o->type(FL_NORMAL_OUTPUT); } // Fl_Input2* txtStatus2 { Fl_Progress* o = prgStatus = new Fl_Progress(395, 210, 70, 18); prgStatus->tooltip("Tx/Rx ARQ file transfer progress"); prgStatus->selection_color((Fl_Color)70); prgStatus->labelfont(1); o->minimum(0.0); o->maximum(1.0); } // Fl_Progress* prgStatus { btnClearText = new Fl_Button(468, 210, 45, 20, "Clear"); btnClearText->callback((Fl_Callback*)cb_btnClearText); } // Fl_Button* btnClearText o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 235, 515, 180, "Plain Talk"); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { txtRX = new Fl_Text_Display(5, 255, 505, 130); txtRX->box(FL_DOWN_BOX); txtRX->textfont(4); Fl_Group::current()->resizable(txtRX); } // Fl_Text_Display* txtRX { Fl_Group* o = new Fl_Group(0, 387, 515, 28); o->box(FL_ENGRAVED_FRAME); { txtTX = new Fl_Input2(5, 390, 450, 22, "input:"); txtTX->tooltip("Plain talk text - ENTER to send"); txtTX->box(FL_DOWN_BOX); txtTX->color(FL_BACKGROUND2_COLOR); txtTX->selection_color(FL_SELECTION_COLOR); txtTX->labeltype(FL_NORMAL_LABEL); txtTX->labelfont(0); txtTX->labelsize(14); txtTX->labelcolor(FL_FOREGROUND_COLOR); txtTX->callback((Fl_Callback*)cb_txtTX); txtTX->align(Fl_Align(FL_ALIGN_CENTER)); txtTX->when(FL_WHEN_ENTER_KEY); Fl_Group::current()->resizable(txtTX); txtTX->value(""); txtTX->maximum_size(80); } // Fl_Input2* txtTX { btnSendTalk = new Fl_Button(460, 390, 49, 22, "Clear"); btnSendTalk->callback((Fl_Callback*)cb_btnSendTalk); } // Fl_Button* btnSendTalk o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o o->end(); } // Fl_Double_Window* o return w; } Fl_Input2 *txtMyCall=(Fl_Input2 *)0; static void cb_txtMyCall(Fl_Input2* o, void*) { changeMyCall(o->value()); } Fl_Input2 *txtBEACONTXT=(Fl_Input2 *)0; static void cb_txtBEACONTXT(Fl_Input2* o, void*) { changeBeaconText(o->value()); } Fl_Spinner2 *spnRetries=(Fl_Spinner2 *)0; static void cb_spnRetries(Fl_Spinner2* o, void*) { iretries = (int)o->value(); cbSetConfig(); } Fl_Spinner2 *spnWaitTime=(Fl_Spinner2 *)0; static void cb_spnWaitTime(Fl_Spinner2* o, void*) { iwaittime = (int)(1000 * o->value()); cbSetConfig(); } Fl_Spinner2 *spnTimeout=(Fl_Spinner2 *)0; static void cb_spnTimeout(Fl_Spinner2* o, void*) { itimeout = (int)(o->value() * 1000.0); cbSetConfig(); } Fl_Spinner2 *spnTxDelay=(Fl_Spinner2 *)0; static void cb_spnTxDelay(Fl_Spinner2* o, void*) { txdelay = (int)o->value(); cbSetConfig(); } Fl_Spinner2 *spnBcnInterval=(Fl_Spinner2 *)0; static void cb_spnBcnInterval(Fl_Spinner2* o, void*) { bcnInterval = (int)o->value(); cbSetConfig(); } Fl_Button *btnOK=(Fl_Button *)0; static void cb_btnOK(Fl_Button*, void*) { closeConfig(); } Fl_ComboBox *choiceBlockSize=(Fl_ComboBox *)0; static void cb_choiceBlockSize(Fl_ComboBox* o, void*) { exponent = (int)o->index() + 4; cbSetConfig(); } Fl_Double_Window* arq_configure() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(480, 162, "Configure flarq"); w = o; { Fl_Input2* o = txtMyCall = new Fl_Input2(98, 13, 150, 24, "My Call:"); txtMyCall->box(FL_DOWN_BOX); txtMyCall->color(FL_BACKGROUND2_COLOR); txtMyCall->selection_color(FL_SELECTION_COLOR); txtMyCall->labeltype(FL_NORMAL_LABEL); txtMyCall->labelfont(0); txtMyCall->labelsize(14); txtMyCall->labelcolor(FL_FOREGROUND_COLOR); txtMyCall->callback((Fl_Callback*)cb_txtMyCall); txtMyCall->align(Fl_Align(FL_ALIGN_LEFT)); txtMyCall->when(FL_WHEN_RELEASE); o->value(MyCall.c_str()); } // Fl_Input2* txtMyCall { Fl_Input2* o = txtBEACONTXT = new Fl_Input2(98, 42, 370, 24, "Beacon Text"); txtBEACONTXT->tooltip("Text for the beacon 64 chars max"); txtBEACONTXT->box(FL_DOWN_BOX); txtBEACONTXT->color(FL_BACKGROUND2_COLOR); txtBEACONTXT->selection_color(FL_SELECTION_COLOR); txtBEACONTXT->labeltype(FL_NORMAL_LABEL); txtBEACONTXT->labelfont(0); txtBEACONTXT->labelsize(14); txtBEACONTXT->labelcolor(FL_FOREGROUND_COLOR); txtBEACONTXT->callback((Fl_Callback*)cb_txtBEACONTXT); txtBEACONTXT->align(Fl_Align(FL_ALIGN_LEFT)); txtBEACONTXT->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtBEACONTXT); o->value(beacontext.c_str()); } // Fl_Input2* txtBEACONTXT { Fl_Spinner2* o = spnRetries = new Fl_Spinner2(146, 71, 45, 22, "Retries:"); spnRetries->tooltip("# retries before connection declared down"); spnRetries->box(FL_NO_BOX); spnRetries->color(FL_BACKGROUND_COLOR); spnRetries->selection_color(FL_BACKGROUND_COLOR); spnRetries->labeltype(FL_NORMAL_LABEL); spnRetries->labelfont(0); spnRetries->labelsize(14); spnRetries->labelcolor(FL_FOREGROUND_COLOR); spnRetries->callback((Fl_Callback*)cb_spnRetries); spnRetries->align(Fl_Align(FL_ALIGN_LEFT)); spnRetries->when(FL_WHEN_RELEASE); o->minimum(2); o->maximum(20); o->step(1); o->value(iretries); } // Fl_Spinner2* spnRetries { Fl_Spinner2* o = spnWaitTime = new Fl_Spinner2(121, 98, 70, 22, "Wait time (sec):"); spnWaitTime->tooltip("Time between retries"); spnWaitTime->box(FL_NO_BOX); spnWaitTime->color(FL_BACKGROUND_COLOR); spnWaitTime->selection_color(FL_BACKGROUND_COLOR); spnWaitTime->labeltype(FL_NORMAL_LABEL); spnWaitTime->labelfont(0); spnWaitTime->labelsize(14); spnWaitTime->labelcolor(FL_FOREGROUND_COLOR); spnWaitTime->callback((Fl_Callback*)cb_spnWaitTime); spnWaitTime->align(Fl_Align(FL_ALIGN_LEFT)); spnWaitTime->when(FL_WHEN_RELEASE); o->minimum(10); o->maximum(30); o->step(5); o->value(iwaittime/1000); } // Fl_Spinner2* spnWaitTime { Fl_Spinner2* o = spnTimeout = new Fl_Spinner2(121, 126, 70, 22, "Timeout (sec):"); spnTimeout->tooltip("Time out for dead connection"); spnTimeout->box(FL_NO_BOX); spnTimeout->color(FL_BACKGROUND_COLOR); spnTimeout->selection_color(FL_BACKGROUND_COLOR); spnTimeout->labeltype(FL_NORMAL_LABEL); spnTimeout->labelfont(0); spnTimeout->labelsize(14); spnTimeout->labelcolor(FL_FOREGROUND_COLOR); spnTimeout->callback((Fl_Callback*)cb_spnTimeout); spnTimeout->align(Fl_Align(FL_ALIGN_LEFT)); spnTimeout->when(FL_WHEN_RELEASE); o->minimum(30); o->maximum(300); o->step(15); o->value(itimeout / 1000); } // Fl_Spinner2* spnTimeout { Fl_Spinner2* o = spnTxDelay = new Fl_Spinner2(317, 98, 70, 22, "Tx delay (msec):"); spnTxDelay->tooltip("delay from Rx to Tx"); spnTxDelay->box(FL_NO_BOX); spnTxDelay->color(FL_BACKGROUND_COLOR); spnTxDelay->selection_color(FL_BACKGROUND_COLOR); spnTxDelay->labeltype(FL_NORMAL_LABEL); spnTxDelay->labelfont(0); spnTxDelay->labelsize(14); spnTxDelay->labelcolor(FL_FOREGROUND_COLOR); spnTxDelay->callback((Fl_Callback*)cb_spnTxDelay); spnTxDelay->align(Fl_Align(FL_ALIGN_LEFT)); spnTxDelay->when(FL_WHEN_RELEASE); o->minimum(200); o->maximum(2000); o->step(100); o->value(txdelay); } // Fl_Spinner2* spnTxDelay { Fl_Spinner2* o = spnBcnInterval = new Fl_Spinner2(398, 71, 70, 22, "Beacon interval (sec)"); spnBcnInterval->tooltip("Time between beacon transmissions"); spnBcnInterval->box(FL_NO_BOX); spnBcnInterval->color(FL_BACKGROUND_COLOR); spnBcnInterval->selection_color(FL_BACKGROUND_COLOR); spnBcnInterval->labeltype(FL_NORMAL_LABEL); spnBcnInterval->labelfont(0); spnBcnInterval->labelsize(14); spnBcnInterval->labelcolor(FL_FOREGROUND_COLOR); spnBcnInterval->value(120); spnBcnInterval->callback((Fl_Callback*)cb_spnBcnInterval); spnBcnInterval->align(Fl_Align(FL_ALIGN_LEFT)); spnBcnInterval->when(FL_WHEN_RELEASE); o->minimum(60); o->maximum(3600); o->step(30); o->value(bcnInterval); } // Fl_Spinner2* spnBcnInterval { btnOK = new Fl_Button(406, 126, 62, 24, "Ok"); btnOK->callback((Fl_Callback*)cb_btnOK); } // Fl_Button* btnOK { choiceBlockSize = new Fl_ComboBox(314, 126, 72, 24, "Block Size:"); choiceBlockSize->box(FL_DOWN_BOX); choiceBlockSize->color(FL_BACKGROUND2_COLOR); choiceBlockSize->selection_color(FL_BACKGROUND_COLOR); choiceBlockSize->labeltype(FL_NORMAL_LABEL); choiceBlockSize->labelfont(0); choiceBlockSize->labelsize(14); choiceBlockSize->labelcolor(FL_FOREGROUND_COLOR); choiceBlockSize->callback((Fl_Callback*)cb_choiceBlockSize); choiceBlockSize->align(Fl_Align(FL_ALIGN_LEFT)); choiceBlockSize->when(FL_WHEN_RELEASE); choiceBlockSize->end(); } // Fl_ComboBox* choiceBlockSize o->end(); } // Fl_Double_Window* o return w; } Table *tblOutgoing=(Table *)0; Fl_Button *send_Cancel=(Fl_Button *)0; static void cb_send_Cancel(Fl_Button*, void*) { sendCancel(); } Fl_Return_Button *send_OK=(Fl_Return_Button *)0; static void cb_send_OK(Fl_Return_Button*, void*) { sendOK(); } Fl_Double_Window* arq_SendSelect() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(500, 170, "Select Email"); w = o; { tblOutgoing = new Table(0, 3, 500, 140); tblOutgoing->box(FL_DOWN_BOX); tblOutgoing->color(FL_BACKGROUND2_COLOR); tblOutgoing->selection_color((Fl_Color)246); tblOutgoing->labeltype(FL_NORMAL_LABEL); tblOutgoing->labelfont(0); tblOutgoing->labelsize(14); tblOutgoing->labelcolor(FL_FOREGROUND_COLOR); tblOutgoing->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); tblOutgoing->when(FL_WHEN_RELEASE); } // Table* tblOutgoing { send_Cancel = new Fl_Button(335, 145, 70, 20, "Cancel"); send_Cancel->callback((Fl_Callback*)cb_send_Cancel); } // Fl_Button* send_Cancel { send_OK = new Fl_Return_Button(420, 145, 72, 20, "OK"); send_OK->callback((Fl_Callback*)cb_send_OK); } // Fl_Return_Button* send_OK o->set_modal(); o->end(); o->resizable(o); } // Fl_Double_Window* o return w; } Fl_Input2 *inpMailTo=(Fl_Input2 *)0; Fl_Input2 *inpMailSubj=(Fl_Input2 *)0; Fl_Text_Editor *txtMailText=(Fl_Text_Editor *)0; Fl_Button *btnOpenComposedMail=(Fl_Button *)0; static void cb_btnOpenComposedMail(Fl_Button*, void*) { cb_OpenComposeMail(); } Fl_Button *btnClearComposer=(Fl_Button *)0; static void cb_btnClearComposer(Fl_Button*, void*) { cb_ClearComposer(); } Fl_Button *btnUseTemplate=(Fl_Button *)0; static void cb_btnUseTemplate(Fl_Button*, void*) { cb_UseTemplate(); } Fl_Button *btnCancelComposedMail=(Fl_Button *)0; static void cb_btnCancelComposedMail(Fl_Button*, void*) { cb_CancelComposeMail(); } Fl_Button *btnSaveComposedMail=(Fl_Button *)0; static void cb_btnSaveComposedMail(Fl_Button*, void*) { cb_SaveComposeMail(); } Fl_Double_Window* arq_composer() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(515, 275, "Flarq Mail Composer"); w = o; { inpMailTo = new Fl_Input2(48, 4, 460, 24, "To:"); inpMailTo->box(FL_DOWN_BOX); inpMailTo->color(FL_BACKGROUND2_COLOR); inpMailTo->selection_color(FL_SELECTION_COLOR); inpMailTo->labeltype(FL_NORMAL_LABEL); inpMailTo->labelfont(0); inpMailTo->labelsize(14); inpMailTo->labelcolor(FL_FOREGROUND_COLOR); inpMailTo->align(Fl_Align(FL_ALIGN_LEFT)); inpMailTo->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMailTo { inpMailSubj = new Fl_Input2(48, 30, 460, 24, "Subj:"); inpMailSubj->box(FL_DOWN_BOX); inpMailSubj->color(FL_BACKGROUND2_COLOR); inpMailSubj->selection_color(FL_SELECTION_COLOR); inpMailSubj->labeltype(FL_NORMAL_LABEL); inpMailSubj->labelfont(0); inpMailSubj->labelsize(14); inpMailSubj->labelcolor(FL_FOREGROUND_COLOR); inpMailSubj->align(Fl_Align(FL_ALIGN_LEFT)); inpMailSubj->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMailSubj { txtMailText = new Fl_Text_Editor(0, 56, 510, 188); Fl_Group::current()->resizable(txtMailText); } // Fl_Text_Editor* txtMailText { Fl_Pack* o = new Fl_Pack(0, 247, 515, 28); o->type(1); { btnOpenComposedMail = new Fl_Button(4, 251, 70, 20, "Open"); btnOpenComposedMail->tooltip("Open existing Composed email"); btnOpenComposedMail->callback((Fl_Callback*)cb_btnOpenComposedMail); } // Fl_Button* btnOpenComposedMail { new Fl_Box(75, 251, 5, 20); } // Fl_Box* o { btnClearComposer = new Fl_Button(81, 251, 70, 20, "Clear"); btnClearComposer->tooltip("Clear all fields"); btnClearComposer->callback((Fl_Callback*)cb_btnClearComposer); } // Fl_Button* btnClearComposer { new Fl_Box(152, 251, 5, 20); } // Fl_Box* o { btnUseTemplate = new Fl_Button(159, 251, 70, 20, "Template"); btnUseTemplate->tooltip("Use template file"); btnUseTemplate->callback((Fl_Callback*)cb_btnUseTemplate); } // Fl_Button* btnUseTemplate { Fl_Box* o = new Fl_Box(230, 251, 127, 20); Fl_Group::current()->resizable(o); } // Fl_Box* o { btnCancelComposedMail = new Fl_Button(358, 251, 70, 20, "Cancel"); btnCancelComposedMail->tooltip("Close Dialog"); btnCancelComposedMail->callback((Fl_Callback*)cb_btnCancelComposedMail); } // Fl_Button* btnCancelComposedMail { new Fl_Box(429, 251, 5, 20); } // Fl_Box* o { btnSaveComposedMail = new Fl_Button(436, 251, 70, 20, "Save"); btnSaveComposedMail->tooltip("Save this message (shift click Save Template)"); btnSaveComposedMail->callback((Fl_Callback*)cb_btnSaveComposedMail); } // Fl_Button* btnSaveComposedMail o->end(); } // Fl_Pack* o o->end(); } // Fl_Double_Window* o return w; } fldigi-3.21.80/src/flarq-src/arqhelp.cxx0000664000175000017500000002133112313064025014703 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef __WOE32__ #include #include #include #endif // this tests depends on a modified FL/filename.H in the Fltk-1.3.0 // change //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) // to //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) && !defined(__WOE32__) #include #include "flarq.h" #include "arq.h" #include "arqdialogs.h" #include "b64.h" Fl_Help_Dialog *help_dialog = (Fl_Help_Dialog *)0; void help_cb() { if (!help_dialog) { help_dialog = new Fl_Help_Dialog(); help_dialog->value( "\n" "\n" "Flarq Help\n" "\n" "\n" "

Initiating an ARQ connect session

\n" "

Start by sending a 'CQ NBEMS' or some similar unique way of indicating\n" "that you are seeking to send ARQ traffic. Do this from the digital modem\n" "program and not from flarq. The potential station for receiving your ARQ\n" "traffic will answer in the clear. Negotiate what digital mode you will use\n" "for the ARQ connection; ie: PSK-63, PSK-125, PSK-250, MFKS-16 etc. Then\n" "try that mode without ARQ to be sure that QRN and QSB will not seriously\n" "disrupt the connection. Ask the responding station to send an ARQ beacon\n" "using flarq. You will then see his ARQ callsign appear in the callsign\n" "window.

" "

Click the CONNECT button to connect with that station. The text next to\n" "the diamond will change to CONNECTING and remain that way during the connect\n" "time out period. During the connection process the CONNECT button will be\n" "disabled (greyed out).

\n" "

After a connection has been established the button label changes to\n" "'Disconnect' and the text next to the diamond indicator will read CONNECTED.\n" "Pressing this button will then execute an orderly disconnect from the other\n" "station and return the program to the CONNECTED state.

\n" "

During a file transfer the button's label changes to Abort. When the\n" "button says Abort, pressing it will abort the file transfer and the program\n" "will return to the CONNECTED state. During the abort text next to the\n" "diamond indicator will read ABORTING XFR and return to CONNECTED after the\n" "abort has been fully recognized by both ends of the connection.

\n" "

Beaconing

\n" "

Click the Beacon button to transmit a beacon signal requesting\n" "assistance with ARQ message forwarding. The small rectangle on the Beacon\n" "button will turn green when a beacon signal is being sent. The beacon will\n" "repeat at the repeat interval (default is 60 seconds). You should not reduce\n" "the repeat interval so short as to make it impossible to receive an ARQ\n" "connection. This is particularly true on PSK-31.

\n" "

Diamond Indicator

\n" "

The diamond-shaped indicator will be green when ready to transfer messages.\n" "The ""Not Connected"" label next to the diamond indicator will change to Sending\n" "when sending, or Connected when connected.

\n" "

Send Menu

\n" "

The Send menu will not be enabled unless a CONNECTION has been established\n" "with another flarq station.

\n" "

This menu accesses four types of files. When selecting any type, the Show: field\n" "allows you to use the dropdown arrow to choose which type of file to display.

\n" "

The area with the question mark is where file content is displayed, if the Preview\n" "box is checked.

\n" "

The Filename field has a row of buttons above it which can be used to quickly\n" "navigate through the hierarchy of folders shown. Just click the button over the\n" "folder you want to access.

\n" "

When Email is selected, a list of emails waiting to be transferred will be\n" "displayed. Select an email and click the Send button to start transferring the\n" "email.

\n" "

When Image File is selected, Flarq can send a color, passport photo sized\n" "picture, in about 10 minutes using PSK250.

\n" "

Config Menu

\n" "

This menu provides a place where you should enter your callsign that Flarq\n" "will use for transmitting. Various folders are shown and can be changed, but\n" "it is recommended that the default folders be used except in special\n" "circumstances.

\n" "

If you are using the Sylpheed mail client you need to check that box.\n" "Sylpheed uses a different naming convention for storing messages inside of\n" "it's mail folders.

\n" "

The beacon interval is probably the most often changed setting. Use it to\n" "control how often Flarq sends the beacon text.

\n" "

You can enter additional beacon text which will be sent with the each time\n" "the ARQ beacon is transmited.

\n" "

At the bottom left of the Flarq window there is a space on the left side that\n" "displays messages showing the Flarq status at any given time.

\n" "

At the bottom right, there is a space for a progress indicator, which will show\n" "a moving green bar as a message is transferred. When a transfer is completed, the\n" "green color will disappear after filling the space, indicating that transfer has\n" "been completed.

\n" "

Status Bar

\n" "

A notification area in the bar just above the Plain Talk label will show the name\n" "and size of the file being transferred and how long it took to transfer when the\n" "transfer is completed. The left and right arrows are for adjusting the number of\n" "SOH characters preceding each block. Leave it at the default of 10 unless you\n" "have trouble connecting at high speed, or have too many repeat blocks. Then try\n" "higher values to reduce the number of repeated blocks.

\n" "

Next to the right hand arrow is an area where the quality level of the transfer\n" "is shown. A transfer without any retries will be shown as 1.00.

\n" "

The area next to the Clear button will display a progress indicator, which will\n" "show the progress of the transfer. When you are sending a message, it will show\n" "the amount of the message confirmed as being received correctly. When you are on\n" "the receiving end, it will advance as each message frame is received.

\n" "

The Clear button can be used to clear the flarq screen.

\n" "

Plain Talk

\n" "

You can also communicate during, before, or after a file transfer, as long as\n" "the Connected diamond is green (showing that you are connected to the other\n" "station), by typing in the box next to the Clear button at the very bottom of\n" "the flarq window, and pressing Enter. The text you are sending will be shown\n" "in red in the Plain Talk window and incoming text from the other station will\n" "be shown in black. Text you type will be sent out at the first opportunity,\n" "but only after a block completes being sent, so there will be a delay until\n" "your text appears on the other station's Plain Talk window, and the other\n" "station responds. As with most edit controls it is necessary to first put\n" "the keyboard focus in that box by clicking in it with the mouse.

\n" "

The maximum number of characters you can type on the Plain Talk line before\n" "pressing Enter can be no more than 80 characters. In order to make the speed\n" "of Plain Talk text exchanges as rapid as possible, Plain Talk uses the current\n" "mode without any ARQ error checking, so there may be some errors at the\n" "receiving end that would not occur if ARQ were used.

\n" "

The Clear button next to the Plain Talk line can be used to clear the Plain\n" "Talk display area." "\n" ); } help_dialog->show(); } fldigi-3.21.80/src/filters/0000775000175000017500000000000012313333725012367 500000000000000fldigi-3.21.80/src/filters/viterbi.cxx0000664000175000017500000001237312313064025014477 00000000000000// ---------------------------------------------------------------------------- // viterbi.cxx -- Viterbi decoder // // Copyright (C) 2006 // Dave Freese, W1HKJ // // Adapted from code contained in gmfsk source code distribution. // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "viterbi.h" #include "misc.h" /* ---------------------------------------------------------------------- */ viterbi::viterbi(int k, int poly1, int poly2) { int outsize = 1 << k; _traceback = PATHMEM - 1; _chunksize = 8; nstates = 1 << (k - 1); output = new int[outsize]; for (int i = 0; i < outsize; i++) { output[i] = parity(poly1 & i) | (parity(poly2 & i) << 1); } for (int i = 0; i < PATHMEM; i++) { metrics[i] = new int[nstates]; history[i] = new int[nstates]; sequence[i] = 0; for (int j = 0; j < nstates; j++) metrics[i][j] = history[i][j] = 0; } for (int i = 0; i < 256; i++) { mettab[0][i] = 128 - i; mettab[1][i] = i - 128; } reset(); } viterbi::~viterbi() { if (output) delete [] output; for (int i = 0; i < PATHMEM; i++) { if (metrics[i]) delete [] metrics[i]; if (history[i]) delete [] history[i]; } } void viterbi::reset() { for (int i = 0; i < PATHMEM; i++) { memset(metrics[i], 0, nstates * sizeof(int)); memset(history[i], 0, nstates * sizeof(int)); } ptr = 0; } int viterbi::settraceback(int trace) { if (trace < 0 || trace > PATHMEM - 1) return -1; _traceback = trace; return 0; } int viterbi::setchunksize(int chunk) { if (chunk < 1 || chunk > _traceback) return -1; _chunksize = chunk; return 0; } int viterbi::traceback(int *metric) { int bestmetric, beststate; unsigned int p, c = 0; p = (ptr - 1) % PATHMEM; // Find the state with the best metric bestmetric = INT_MIN; beststate = 0; for (int i = 0; i < nstates; i++) { if (metrics[p][i] > bestmetric) { bestmetric = metrics[p][i]; beststate = i; } } // Trace back 'traceback' steps, starting from the best state sequence[p] = beststate; for (int i = 0; i < _traceback; i++) { unsigned int prev = (p - 1) % PATHMEM; sequence[prev] = history[p][sequence[p]]; p = prev; } if (metric) *metric = metrics[p][sequence[p]]; // Decode 'chunksize' bits for (int i = 0; i < _chunksize; i++) { // low bit of state is the previous input bit c = (c << 1) | (sequence[p] & 1); p = (p + 1) % PATHMEM; } if (metric) *metric = metrics[p][sequence[p]] - *metric; return c; } int viterbi::decode(unsigned char *sym, int *metric) { unsigned int currptr, prevptr; int met[4]; currptr = ptr; prevptr = (currptr - 1) % PATHMEM; // if (prevptr < 0) prevptr = PATHMEM - 1; met[0] = mettab[0][sym[1]] + mettab[0][sym[0]]; met[1] = mettab[0][sym[1]] + mettab[1][sym[0]]; met[2] = mettab[1][sym[1]] + mettab[0][sym[0]]; met[3] = mettab[1][sym[1]] + mettab[1][sym[0]]; // met[0] = 256 - sym[1] - sym[0]; // met[1] = sym[0] - sym[1]; // met[2] = sym[1] - sym[0]; // met[3] = sym[0] + sym[1] - 256; for (int n = 0; n < nstates; n++) { int p0, p1, s0, s1, m0, m1; m0 = 0; m1 = 0; s0 = n; s1 = n + nstates; p0 = s0 >> 1; p1 = s1 >> 1; m0 = metrics[prevptr][p0] + met[output[s0]]; m1 = metrics[prevptr][p1] + met[output[s1]]; if (m0 > m1) { metrics[currptr][n] = m0; history[currptr][n] = p0; } else { metrics[currptr][n] = m1; history[currptr][n] = p1; } } ptr = (ptr + 1) % PATHMEM; if ((ptr % _chunksize) == 0) return traceback(metric); if (metrics[currptr][0] > INT_MAX / 2) { for (int i = 0; i < PATHMEM; i++) for (int j = 0; j < nstates; j++) metrics[i][j] -= INT_MAX / 2; } if (metrics[currptr][0] < INT_MIN / 2) { for (int i = 0; i < PATHMEM; i++) for (int j = 0; j < nstates; j++) metrics[i][j] += INT_MIN / 2; } return -1; } /* ---------------------------------------------------------------------- */ #include encoder::encoder(int k, int poly1, int poly2) { int size = 1 << k; /* size of the output table */ output = new int[size]; // output contains 2 bits in positions 0 and 1 describing the state machine // for each bit delay, ie: for k = 7 there are 128 possible state pairs. // the modulo-2 addition for polynomial 1 is in bit 0 // the modulo-2 addition for polynomial 2 is in bit 1 // the allowable state outputs are 0, 1, 2 and 3 for (int i = 0; i < size; i++) { output[i] = parity(poly1 & i) | (parity(poly2 & i) << 1); } shreg = 0; shregmask = size - 1; } encoder::~encoder() { delete [] output; } int encoder::encode(int bit) { shreg = (shreg << 1) | !!bit; return output[shreg & shregmask]; } fldigi-3.21.80/src/filters/fftfilt.cxx0000664000175000017500000001761012313064025014470 00000000000000// ---------------------------------------------------------------------------- // fftfilt.cxx -- Fast convolution Overlap-Add filter // // Filter implemented using overlap-add FFT convolution method // h(t) characterized by Windowed-Sinc impulse response // // Reference: // "The Scientist and Engineer's Guide to Digital Signal Processing" // by Dr. Steven W. Smith, http://www.dspguide.com // Chapters 16, 18 and 21 // // Copyright (C) 2006-2008 Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include "misc.h" #include "fftfilt.h" //------------------------------------------------------------------------------ // initialize the filter // create forward and reverse FFTs //------------------------------------------------------------------------------ // probably only need a single instance of g_fft !! // use for both forward and reverse void fftfilt::init_filter() { flen2 = flen >> 1; fft = new g_fft(flen); filter = new cmplx[flen]; timedata = new cmplx[flen]; freqdata = new cmplx[flen]; output = new cmplx[flen]; ovlbuf = new cmplx[flen2]; ht = new cmplx[flen]; memset(filter, 0, flen * sizeof(cmplx)); memset(timedata, 0, flen * sizeof(cmplx)); memset(freqdata, 0, flen * sizeof(cmplx)); memset(output, 0, flen * sizeof(cmplx)); memset(ovlbuf, 0, flen2 * sizeof(cmplx)); memset(ht, 0, flen * sizeof(cmplx)); inptr = 0; } //------------------------------------------------------------------------------ // fft filter // f1 < f2 ==> band pass filter // f1 > f2 ==> band reject filter // f1 == 0 ==> low pass filter // f2 == 0 ==> high pass filter //------------------------------------------------------------------------------ fftfilt::fftfilt(double f1, double f2, int len) { flen = len; init_filter(); create_filter(f1, f2); } //------------------------------------------------------------------------------ // low pass filter //------------------------------------------------------------------------------ fftfilt::fftfilt(double f, int len) { flen = len; init_filter(); create_lpf(f); } fftfilt::~fftfilt() { if (fft) delete fft; if (filter) delete [] filter; if (timedata) delete [] timedata; if (freqdata) delete [] freqdata; if (output) delete [] output; if (ovlbuf) delete [] ovlbuf; if (ht) delete [] ht; } void fftfilt::create_filter(double f1, double f2) { // initialize the filter to zero memset(ht, 0, flen * sizeof(cmplx)); // create the filter shape coefficients by fft // filter values initialized to the ht response h(t) bool b_lowpass, b_highpass;//, window; b_lowpass = (f2 != 0); b_highpass = (f1 != 0); for (int i = 0; i < flen2; i++) { ht[i] = 0; //combine lowpass / highpass // lowpass @ f2 if (b_lowpass) ht[i] += fsinc(f2, i, flen2); // highighpass @ f1 if (b_highpass) ht[i] -= fsinc(f1, i, flen2); } // highpass is delta[flen2/2] - h(t) if (b_highpass && f2 < f1) ht[flen2 / 2] += 1; for (int i = 0; i < flen2; i++) ht[i] *= _blackman(i, flen2); // this may change since green fft is in place fft memcpy(filter, ht, flen * sizeof(cmplx)); // ht is flen complex points with imaginary all zero // first half describes h(t), second half all zeros // perform the cmplx forward fft to obtain H(w) // filter is flen/2 complex values fft->ComplexFFT(filter); // fft->transform(ht, filter); // normalize the output filter for unity gain double scale = 0, mag; for (int i = 0; i < flen2; i++) { mag = abs(filter[i]); if (mag > scale) scale = mag; } if (scale != 0) { for (int i = 0; i < flen; i++) filter[i] /= scale; } // perform the reverse fft to obtain h(t) // for testing // uncomment to obtain filter characteristics /* cmplx *revht = new cmplx[flen]; memcpy(revht, filter, flen * sizeof(cmplx)); fft->InverseComplexFFT(revht); std::fstream fspec; fspec.open("fspec.csv", std::ios::out); fspec << "i,imp.re,imp.im,filt.re,filt.im,filt.abs,revimp.re,revimp.im\n"; for (int i = 0; i < flen2; i++) fspec << i << "," << ht[i].real() << "," << ht[i].imag() << "," << filter[i].real() << "," << filter[i].imag() << "," << abs(filter[i]) << "," << revht[i].real() << "," << revht[i].imag() << "," << std::endl; fspec.close(); delete [] revht; */ pass = 2; } /* * Filter with fast convolution (overlap-add algorithm). */ int fftfilt::run(const cmplx & in, cmplx **out) { // collect flen/2 input samples timedata[inptr++] = in; if (inptr < flen2) return 0; if (pass) --pass; // filter output is not stable until 2 passes // FFT transpose to the frequency domain memcpy(freqdata, timedata, flen * sizeof(cmplx)); fft->ComplexFFT(freqdata); // multiply with the filter shape for (int i = 0; i < flen; i++) freqdata[i] *= filter[i]; // transform back to time domain fft->InverseComplexFFT(freqdata); // overlap and add // save the second half for overlapping next inverse FFT for (int i = 0; i < flen2; i++) { output[i] = ovlbuf[i] + freqdata[i]; ovlbuf[i] = freqdata[i+flen2]; } // clear inbuf pointer inptr = 0; // signal the caller there is flen/2 samples ready if (pass) return 0; *out = output; return flen2; } //------------------------------------------------------------------------------ // rtty filter //------------------------------------------------------------------------------ //bool print_filter = true; // flag to inhibit printing multiple copies void fftfilt::rtty_filter(double f) { // Raised cosine filter designed iaw Section 1.2.6 of // Telecommunications Measurements, Analysis, and Instrumentation // by Dr. Kamilo Feher / Engineers of Hewlett-Packard // // Frequency scaling factor determined hueristically by testing various values // and measuring resulting decoder CER with input s/n = - 9 dB // // K CER // 1.0 .0244 // 1.1 .0117 // 1.2 .0081 // 1.3 .0062 // 1.4 .0054 // 1.5 .0062 // 1.6 .0076 f *= 1.4; double dht; for( int i = 0; i < flen2; ++i ) { double x = (double)i/(double)(flen2); // raised cosine response (changed for -1.0...+1.0 times Nyquist-f // instead of books versions ranging from -1..+1 times samplerate) dht = x <= 0 ? 1.0 : x > 2.0 * f ? 0.0 : cos((M_PI * x) / (f * 4.0)); dht *= dht; // cos^2 // amplitude equalized nyquist-channel response dht /= sinc(2.0 * i * f); filter[i] = cmplx( dht*cos((double)i* - 0.5*M_PI), dht*sin((double)i* - 0.5*M_PI) ); filter[(flen-i)%flen] = cmplx( dht*cos((double)i*+0.5*M_PI), dht*sin((double)i*+0.5*M_PI) ); } // perform the reverse fft to obtain h(t) // for testing // uncomment to obtain filter characteristics /* cmplx *revht = new cmplx[flen]; memcpy(revht, filter, flen * sizeof(cmplx)); fft->InverseComplexFFT(revht); std::fstream fspec; fspec.open("rtty_filter.csv", std::ios::out); fspec << "i,filt.re,filt.im,filt.abs,,revimp.re,revimp.im\n"; for (int i = 0; i < flen; i++) fspec << i << "," << filter[i].real() << "," << filter[i].imag() << "," << abs(filter[i]) << ",," << revht[i].real() << "," << revht[i].imag() << std::endl; fspec.close(); delete [] revht; */ // start outputs after 2 full passes are complete pass = 2; } fldigi-3.21.80/src/filters/filters.cxx0000664000175000017500000003637312313064025014511 00000000000000// ---------------------------------------------------------------------------- // // filters.cxx -- Several Digital Filter classes used in fldigi // // Copyright (C) 2006-2008 Dave Freese, W1HKJ // // These filters are based on the gmfsk design and the design notes given in // "Digital Signal Processing, A Practical Guid for Engineers and Scientists" // by Steven W. Smith. // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "filters.h" #include //===================================================================== // C_FIR_filter // // a class of Finite Impulse Response (FIR) filters with // decimate in time capability // //===================================================================== C_FIR_filter::C_FIR_filter () { pointer = counter = length = 0; decimateratio = 0; ifilter = qfilter = (double *)0; ffreq = 0.0; } C_FIR_filter::~C_FIR_filter() { if (ifilter) delete [] ifilter; if (qfilter) delete [] qfilter; } void C_FIR_filter::init(int len, int dec, double *itaps, double *qtaps) { length = len; decimateratio = dec; if (ifilter) { delete [] ifilter; ifilter = (double *)0; } if (qfilter) { delete [] qfilter; qfilter = (double *)0; } for (int i = 0; i < FIRBufferLen; i++) ibuffer[i] = qbuffer[i] = 0.0; if (itaps) { ifilter = new double[len]; for (int i = 0; i < len; i++) ifilter[i] = itaps[i]; } if (qtaps) { qfilter = new double[len]; for (int i = 0; i < len; i++) qfilter[i] = qtaps[i]; } pointer = len; counter = 0; } //===================================================================== // Create a band pass FIR filter with 6 dB corner frequencies // of 'f1' and 'f2'. (0 <= f1 < f2 <= 0.5) //===================================================================== double * C_FIR_filter::bp_FIR(int len, int hilbert, double f1, double f2) { double *fir; double t, h, x; fir = new double[len]; for (int i = 0; i < len; i++) { t = i - (len - 1.0) / 2.0; h = i * (1.0 / (len - 1.0)); if (!hilbert) { x = (2 * f2 * sinc(2 * f2 * t) - 2 * f1 * sinc(2 * f1 * t)) * hamming(h); } else { x = (2 * f2 * cosc(2 * f2 * t) - 2 * f1 * cosc(2 * f1 * t)) * hamming(h); // The actual filter code assumes the impulse response // is in time reversed order. This will be anti- // symmetric so the minus sign handles that for us. x = -x; } fir[i] = x; } return fir; } //===================================================================== // Filter will be a lowpass with // length = len // decimation = dec // 0.5 frequency point = freq //===================================================================== void C_FIR_filter::init_lowpass (int len, int dec, double freq) { double *fi = bp_FIR(len, 0, 0.0, freq); ffreq = freq; init (len, dec, fi, fi); delete [] fi; } //===================================================================== // Filter will be a bandpass with // length = len // decimation = dec // 0.5 frequency points of f1 (low) and f2 (high) //===================================================================== void C_FIR_filter::init_bandpass (int len, int dec, double f1, double f2) { double *fi = bp_FIR (len, 0, f1, f2); init (len, dec, fi, fi); delete [] fi; } //===================================================================== // Filter will the Hilbert form //===================================================================== void C_FIR_filter::init_hilbert (int len, int dec) { double *fi = bp_FIR(len, 0, 0.05, 0.45); double *fq = bp_FIR(len, 1, 0.05, 0.45); init (len, dec, fi, fq); delete [] fi; delete [] fq; } //===================================================================== // Run // passes a cmplx value (in) and receives the cmplx value (out) // function returns 0 if the filter is not yet stable // returns 1 when stable and decimated cmplx output value is valid //===================================================================== int C_FIR_filter::run (const cmplx &in, cmplx &out) { ibuffer[pointer] = in.real(); qbuffer[pointer] = in.imag(); counter++; if (counter == decimateratio) out = cmplx ( mac(&ibuffer[pointer - length], ifilter, length), mac(&qbuffer[pointer - length], qfilter, length) ); pointer++; if (pointer == FIRBufferLen) { /// memmove is necessary if length >= FIRBufferLen/2 , theoretically possible. memmove (ibuffer, ibuffer + FIRBufferLen - length, length * sizeof (double) ); memmove (qbuffer, qbuffer + FIRBufferLen - length, length * sizeof (double) ); pointer = length; } if (counter == decimateratio) { counter = 0; return 1; } return 0; } //===================================================================== // Run the filter for the Real part of the cmplx variable //===================================================================== int C_FIR_filter::Irun (const double &in, double &out) { double *iptr = ibuffer + pointer; pointer++; counter++; *iptr = in; if (counter == decimateratio) { out = mac(iptr - length, ifilter, length); } if (pointer == FIRBufferLen) { iptr = ibuffer + FIRBufferLen - length; memcpy(ibuffer, iptr, length * sizeof(double)); pointer = length; } if (counter == decimateratio) { counter = 0; return 1; } return 0; } //===================================================================== // Run the filter for the Imaginary part of the cmplx variable //===================================================================== int C_FIR_filter::Qrun (const double &in, double &out) { double *qptr = ibuffer + pointer; pointer++; counter++; *qptr = in; if (counter == decimateratio) { out = mac(qptr - length, qfilter, length); } if (pointer == FIRBufferLen) { qptr = qbuffer + FIRBufferLen - length; memcpy(qbuffer, qptr, length * sizeof(double)); pointer = length; } if (counter == decimateratio) { counter = 0; return 1; } return 0; } //===================================================================== // Moving average filter // // Simple in concept, sublime in implementation ... the fastest filter // in the west. Also optimal for the processing of time domain signals // characterized by a transition edge. The is the perfect signal filter // for CW, RTTY and other signals of that type. For a given filter size // it provides the greatest s/n improvement while retaining the sharpest // leading edge on the filtered signal. //===================================================================== Cmovavg::Cmovavg (int filtlen) { len = filtlen; in = new double[len]; empty = true; } Cmovavg::~Cmovavg() { if (in) delete [] in; } double Cmovavg::run(double a) { if (!in) { return a; } if (empty) { empty = false; for (int i = 0; i < len; i++) { in[i] = a; } out = a * len; pint = 0; return a; } out = out - in[pint] + a; in[pint] = a; if (++pint >= len) pint = 0; return out / len; } void Cmovavg::setLength(int filtlen) { if (filtlen > len) { if (in) delete [] in; in = new double[filtlen]; } len = filtlen; empty = true; } void Cmovavg::reset() { empty = true; } //===================================================================== // Sliding FFT filter // Sliding Fast Fourier Transform // // The sliding FFT ingeniously exploits the properties of a time-delayed // input and the property of linearity for its derivation. // // First of all, the N-point transform of a sequence x(n) is equal to the // summation of the transforms of N separate transforms where each transform // has just one of the original samples at it's original sample time. // //i.e. // transform of [x0, x1, x2, x3, x4, x5,...xN-1] // is equal to // transform of [x0, 0, 0, 0, 0, 0,...0] // + transform of [0, x1, 0, 0, 0, 0,...0] // + transform of [0, 0, x2, 0, 0, 0,...0] // + transform of [0, 0, 0, x3, 0, 0,...0] // . // . // . // + transform of [0, 0, 0, 0, 0, 0,...xN-1] // // Secondly, the transform of a time-delayed sequence is a phase-rotated // version of the transform of the original sequence. i.e. // // If x(n) transforms to X(k), // Then x(n-m) transforms to X(k)(Wn)^(-mk) // // where N is the FFT size, m is the delay in sample periods, and WN is the // familiar phase-rotating coefficient or twiddle factor e^(-j2p/N) // // Therefore, if the N-point transform X(k) of an individual sample is considered, // and then the sample is moved back in time by one sample period, all frequency // bins of X(k) are phase-rotated by 2pk/N radians. // // The important thing here is that the transform is not performed again because // the previous frequency results can be used by simply application of the correct // coefficients. // // This is the technique that is applied when the rectangular sampling window // slides along by one sample. The contributions of all samples that are // included in both the original and the new windows are simply phase rotated. // The end effects are that the transform of the new sample must be added, and // the transform of the oldest sample that disappeared off the end must be // subtracted. These end-effects are easy to perform if we treat the new sample // as occurring at time t = 0, because the transform of a single sample at t = 0, // say (a + bj), simply has all frequency bins equal to (a + bj). Similarly, the // oldest sample that has just disappeared off the end of the window is exactly N // samples old. I.e. it occurred at t = -N. The transform of this sample, // say (c + dj), is also straightforward since every frequency bin has now been // phase-rotated an integer number of times from when the sample was at t = 0. // (The kth frequency bin has been rotated by 2pk radians). The transform of the // sample at t = -N is therefore the same as if it was still at t = 0. I.e. it // has all frequency bins equal to (c + dj). // // All that is needed therefore is to // phase rotate each frequency bin in F(k) by WN^(k) and then // add [(a + bj) + (c + dj)] to each frequency bin. // // One cmplx multiplication and two cmplx additions per frequency bin are // therefore required, per sample period, regardless of the size of the transform. // // For example, a traditional 1024-point FFT needs 5120 cmplx multiplies // and 10240 cmplx additions to calculate all 1024 frequency bins. A 1024-point // Sliding FFT however needs 1024 cmplx multiplies and 2048 cmplx additions // for all 1024 frequency bins, and as each frequency bin is calculated separately, // it is only necessary to calculate the ones that are of interest. // // One drawback of the Sliding FFT is that in using feedback from previous // frequency bins, there is potential for instability if the coefficients are not // infinitely precise. Without infinite precision, stability can be guaranteed by // making each phase-rotation coefficient have a magnitude of slightly less than // unity. E.g. 0.9999. // // This then has to taken into account when the Nth sample is subtracted, because // the factor 0.9999 has been applied N times to the transform of this sample. // The sample cannot therefore be directly subtracted, it must first be multiplied // by the factor of 0.9999^N. This unfortunately means there is another multipli- // cation to perform per frequency bin. Another drawback is that a circular buffer // is needed in which to keep N samples, so that the oldest sample, (from t= -N), // can be subtracted each time. // // This filter is ideal for extracting a finite number of frequency bins // with a very long kernel length. The filter only needs to calculate the // values for the bins of interest and not the entire spectrum. It does // require the store of the history associated with those bins over the // kernel length. // // Use in the MFSK / DOMINO modem for extraction of the frequency spectra // //===================================================================== struct sfft::vrot_bins_pair { cmplx vrot; cmplx bins; } ; sfft::sfft(int len, int _first, int _last) { vrot_bins = new vrot_bins_pair[len]; delay = new cmplx[len]; fftlen = len; first = _first; last = _last; ptr = 0; double phi = 0.0, tau = 2.0 * M_PI/ len; k2 = 1.0; for (int i = 0; i < len; i++) { vrot_bins[i].vrot = cmplx( K1 * cos (phi), K1 * sin (phi) ); phi += tau; delay[i] = vrot_bins[i].bins = 0.0; k2 *= K1; } } sfft::~sfft() { delete [] vrot_bins; delete [] delay; } // Sliding FFT, cmplx input, cmplx output // FFT is computed for each value from first to last // Values are not stable until more than "len" samples have been processed. // Copies the frequencies to a pointer with a given stride. void sfft::run(const cmplx& input, cmplx * __restrict__ result, int stride ) { cmplx & de = delay[ptr]; const cmplx z( input.real() - k2 * de.real(), input.imag() - k2 * de.imag()); de = input; ++ptr ; if( ptr >= fftlen ) ptr = 0 ; // It is more efficient to have vrot and bins very close to each other. for( vrot_bins_pair * __restrict__ itr = vrot_bins + first, * __restrict__ end = vrot_bins + last ; itr != end ; ++itr, result += stride ) { *result = itr->bins = itr->bins * itr->vrot + z * itr->vrot; } } // ============================================================================ // Goertzel filter // Optimized implementation of a DFT for a single frequency of interest // SR = sample rate // N = Block size (does not need to be a factor of 2!) // bin size = SR / N // K = frequency bin of interest = (N * freq / SR) // N should be selected to make K an integer if possible // // Q0 = current sample // Q1 = previous sample (1 delay) // Q2 = previous sample (2 delay) // w = (2 * pi * K / N) // k1 = cos(w) // k2 = sin(w) // k3 = 2.0 * k1 // Q0, Q1, Q2 are initialized to zero // Iterate N times: // Q0 = k3*Q1 - Q2 + sample // Q2 = Q1 // Q1 = Q0 // // After N interations: // real = (Q1 - Q2 * k1) // imag = Q2 * k2 // or // mag = Q1*Q1 + Q2*Q2 - Q1*Q2*k1 // ============================================================================ goertzel::goertzel(int n, double freq, double sr) { double w; w = 2 * M_PI * freq / sr; k1 = cos(w); k2 = sin(w); k3 = 2.0 * k1; Q0 = Q1 = Q2 = 0.0; count = N = n; } goertzel::~goertzel() { } void goertzel::reset() { Q0 = Q1 = Q2 = 0.0; count = N; isvalid = false; } void goertzel::reset(int n, double freq, double sr) { double w; w = 2 * M_PI * freq / sr; k1 = cos(w); k2 = sin(w); k3 = 2.0 * k1; Q0 = Q1 = Q2 = 0.0; count = N = n; isvalid = false; } bool goertzel::run(double sample) { Q0 = sample + k3*Q1 - Q2; Q2 = Q1; Q1 = Q0; if (--count == 0) { count = N; return true; } return false; } double goertzel::real() { return ((0.5*k3*Q1 - Q2)/N); } double goertzel::imag() { return ((k2*Q1)/N); } double goertzel::mag() { return (Q2*Q2 + Q1*Q1 - k3*Q2*Q1); } fldigi-3.21.80/src/fileselector/0000775000175000017500000000000012313333727013401 500000000000000fldigi-3.21.80/src/fileselector/fileselect.cxx0000664000175000017500000001561512313064025016164 00000000000000// ---------------------------------------------------------------------------- // // fileselect.cxx -- file selector front end // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "config.h" #include "fileselect.h" #include "debug.h" #include #include /** \class Fl_Native_File_Chooser This class lets an FLTK application easily and consistently access the operating system's native file chooser. Some operating systems have very complex and specific file choosers that many users want access to specifically, instead of FLTK's default file chooser(s). In cases where there is no native file browser, FLTK's own file browser is used instead. To use this widget correctly, use the following include in your code: \code #include \endcode Do not include the other Fl_Native_File_Choser_XXX.H files in your code; those are platform specific files that will be included automatically depending on your build platform. The following example shows how to pick a single file: \code // Create and post the local native file chooser #include [..] Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("Text\t*.txt\n" "C Files\t*.{cxx,h,c}"); fnfc.directory("/var/tmp"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: printf("ERROR: %s\n", fnfc.errmsg()); break; // ERROR case 1: printf("CANCEL\n"); break; // CANCEL default: printf("PICKED: %s\n", fnfc.filename()); break; // FILE CHOSEN } \endcode Platform Specific Caveats - Under X windows, it's best if you call Fl_File_Icon::load_system_icons() at the start of main(), to enable the nicer looking file browser widgets. Use the static public attributes of class Fl_File_Chooser to localize the browser. - Some operating systems support certain OS specific options; see Fl_Native_File_Chooser::options() for a list. \image html Fl_Native_File_Chooser.png "The Fl_Native_File_Chooser on different platforms." \image latex Fl_Native_File_Chooser.png "The Fl_Native_File_Chooser on different platforms" width=14cm enum Type { BROWSE_FILE = 0, ///< browse files (lets user choose one file) BROWSE_DIRECTORY, ///< browse directories (lets user choose one directory) BROWSE_MULTI_FILE, ///< browse files (lets user choose multiple files) BROWSE_MULTI_DIRECTORY, ///< browse directories (lets user choose multiple directories) BROWSE_SAVE_FILE, ///< browse to save a file BROWSE_SAVE_DIRECTORY ///< browse to save a directory }; enum Option { NO_OPTIONS = 0x0000, ///< no options enabled SAVEAS_CONFIRM = 0x0001, ///< Show native 'Save As' overwrite confirm dialog (if supported) NEW_FOLDER = 0x0002, ///< Show 'New Folder' icon (if supported) PREVIEW = 0x0004 ///< enable preview mode }; IMPORTANT NOTICE: The filter type must be terminated with a '\n' on OS X or the application crashes with a Bus timeout */ using namespace std; namespace FSEL { string filename; void create(void) {}; void destroy(void) {}; string stitle, sfilter, sdef; const char* select(const char* title, const char* filter, const char* def, int* fsel) { Fl_Native_File_Chooser native; stitle.clear(); sfilter.clear(); sdef.clear(); if (title) stitle.assign(title); if (filter) sfilter.assign(filter); if (def) sdef.assign(def); if (!sfilter.empty() && sfilter[sfilter.length()-1] != '\n') sfilter += '\n'; if (!stitle.empty()) native.title(stitle.c_str()); native.type(Fl_Native_File_Chooser::BROWSE_FILE); if (!sfilter.empty()) native.filter(sfilter.c_str()); native.options(Fl_Native_File_Chooser::PREVIEW); if (!sdef.empty()) native.preset_file(sdef.c_str()); filename.clear(); switch ( native.show() ) { case -1: LOG_INFO("ERROR: %s\n", native.errmsg()); // Error fall through case 1: return 0; break; default: if ( native.filename() ) { filename = native.filename(); } else { filename = ""; } break; } if (fsel) *fsel = native.filter_value(); return filename.c_str(); } const char* saveas(const char* title, const char* filter, const char* def, int* fsel) { Fl_Native_File_Chooser native; stitle.clear(); sfilter.clear(); sdef.clear(); if (title) stitle.assign(title); if (filter) sfilter.assign(filter); if (def) sdef.assign(def); if (!sfilter.empty() && sfilter[sfilter.length()-1] != '\n') sfilter += '\n'; if (!stitle.empty()) native.title(stitle.c_str()); native.type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE); if (!sfilter.empty()) native.filter(sfilter.c_str()); native.options(Fl_Native_File_Chooser::NEW_FOLDER || Fl_Native_File_Chooser::SAVEAS_CONFIRM); if (!sdef.empty()) native.preset_file(sdef.c_str()); filename.clear(); switch ( native.show() ) { case -1: LOG_INFO("ERROR: %s\n", native.errmsg()); break; // ERROR case 1: break; // CANCEL default: if ( native.filename() ) { filename = native.filename(); } else { filename = ""; } break; } if (fsel) *fsel = native.filter_value(); return filename.c_str(); } const char* dir_select(const char* title, const char* filter, const char* def) { Fl_Native_File_Chooser native; stitle.clear(); sfilter.clear(); sdef.clear(); if (title) stitle.assign(title); if (filter) sfilter.assign(filter); if (def) sdef.assign(def); if (!sfilter.empty() && sfilter[sfilter.length()-1] != '\n') sfilter += '\n'; if (!stitle.empty()) native.title(stitle.c_str()); native.type(Fl_Native_File_Chooser::BROWSE_DIRECTORY); if (!sfilter.empty()) native.filter(sfilter.c_str()); native.options(Fl_Native_File_Chooser::NO_OPTIONS); if (!sdef.empty()) native.directory(sdef.c_str()); filename.clear(); switch ( native.show() ) { case -1: LOG_INFO("ERROR: %s\n", native.errmsg()); break; // ERROR case 1: break; // CANCEL default: if ( native.filename() ) { filename = native.filename(); } else { filename = ""; } break; } return filename.c_str(); } } // FSEL fldigi-3.21.80/src/fileselector/FL/0000775000175000017500000000000012313333725013700 500000000000000fldigi-3.21.80/src/fileselector/FL/Native_File_Chooser.H0000664000175000017500000000251112313064025017571 00000000000000// // Fl_Native_File_Chooser.H -- FLTK native OS file chooser widget // // Copyright 2004 by Greg Ercolano. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA. // #ifndef FL_NATIVE_FILE_CHOOSER_H #define FL_NATIVE_FILE_CHOOSER_H // Use Windows' chooser #if defined(_WIN32) || defined(__CYGWIN__) #include #endif // Use Apple's chooser designed by Stelios #ifdef __APPLE__ #include "FL/Native_File_Chooser_MAC_chooser.h" #endif // All else falls back to FLTK's own chooser #if ! defined(__APPLE__) && !defined(_WIN32) && !defined(__CYGWIN__) #include #endif #endif /*FL_NATIVE_FILE_CHOOSER_H*/ fldigi-3.21.80/src/fileselector/Native_File_Chooser.cxx0000664000175000017500000000143512313064025017707 00000000000000// // Fl_Native_File_Chooser.cxx -- FLTK native OS file chooser widget // // Copyright 2004 by Greg Ercolano. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include fldigi-3.21.80/src/fileselector/flnfc_common.cxx0000664000175000017500000000407612313064025016504 00000000000000// // flnfc_common.cxx -- common string subs for Fl_Native_File_Chooser // // Copyright 2004 by Greg Ercolano. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include // COPY A STRING WITH 'new' // Value can be NULL // static char *strnew(const char *val) { if ( val == NULL ) return(NULL); char *s = new char[strlen(val)+1]; strcpy(s, val); return(s); } // FREE STRING CREATED WITH strnew(), NULLS OUT STRING // Value can be NULL // static char *strfree(char *val) { if ( val ) delete [] val; return(NULL); } #ifndef __WOE32__ // 'DYNAMICALLY' APPEND ONE STRING TO ANOTHER // Returns newly allocated string, or NULL // if s && val == NULL. // 's' can be NULL; returns a strnew(val). // 'val' can be NULL; s is returned unmodified. // // Usage: // char *s = strnew("foo"); // s = "foo" // s = strapp(s, "bar"); // s = "foobar" // static char *strapp(char *s, const char *val) { if ( ! val ) { return(s); // Nothing to append? return s } if ( ! s ) { return(strnew(val)); // New string? return copy of val } char *news = new char[strlen(s)+strlen(val)+1]; strcpy(news, s); strcat(news, val); delete [] s; // delete old string return(news); // return new copy } #endif // APPEND A CHARACTER TO A STRING // This does NOT allocate space for the new character. // static void chrcat(char *s, char c) { char tmp[2] = { c, '\0' }; strcat(s, tmp); } fldigi-3.21.80/src/synop-src/0000775000175000017500000000000012313333727012656 500000000000000fldigi-3.21.80/src/synop-src/README0000664000175000017500000000051612313064025013450 00000000000000The "makefile" in this directory can be used to create a linux only command line tool 'synop_tool.' The make file is not named "Makefile" to avoid it being excluded by the automake distribution scripts. DO NOT rename this file. You can simply invoke "make" from within this directory and "make" will act upon the makefile script. fldigi-3.21.80/src/synop-src/Makefile0000664000175000017500000000343312313064025014231 00000000000000#---------------------------------------------------------------------------------- # Make File for synop_tools #---------------------------------------------------------------------------------- GCC = gcc CXX = g++ INCLUDE = -I../ -I../include -I../libtiniconv -I../irrxml OPTIM = -O2 -Wunused -fexceptions -Wno-deprecated CXXFLAGS = $(OPTIM) $(INCLUDE) \ -DLOCALEDIR=\"/usr/local/share/locale\" \ -DPKGDATADIR=\"/usr/local/share/data\" CFLAGS = $(CXXFLAGS) # libraries to link with: LIBS = -lpthread -ldl -lm -lrt # ---------------------------------------------------------------------------------- .SUFFIXES: .cxx .o all: synop_tool synop_tool.o: synop_tool.cxx $(CXX) $(CXXFLAGS) -c $< synop.o: synop.cxx $(CXX) $(CXXFLAGS) -c $< coordinate.o: ../misc/coordinate.cxx $(CXX) $(CXXFLAGS) -c $< kmlserver.o: ../misc/kmlserver.cxx $(CXX) $(CXXFLAGS) -c $< irrXML.o: ../irrxml/irrXML.cpp $(CXX) $(CXXFLAGS) -c $< re.o: ../misc/re.cxx $(CXX) $(CXXFLAGS) -c $< strutil.o: ../misc/strutil.cxx $(CXX) $(CXXFLAGS) -c $< timeops.o: ../misc/timeops.cxx $(CXX) $(CXXFLAGS) -c $< util.o: ../misc/util.cxx $(CXX) $(CXXFLAGS) -c $< threads.o: ../misc/threads.cxx $(CXX) $(CXXFLAGS) -c $< cmd_debug.o: cmd_debug.cxx $(CXX) $(CXXFLAGS) -c $< nls.o: ../misc/nls.cxx $(CXX) $(CXXFLAGS) -c $< locator.o: ../misc/locator.c $(GCC) $(CFLAGS) -c $< synop_tool: \ synop_tool.o synop.o coordinate.o kmlserver.o irrXML.o re.o strutil.o \ nls.o util.o cmd_debug.o threads.o timeops.o locator.o $(CXX) \ synop_tool.o synop.o coordinate.o kmlserver.o irrXML.o re.o strutil.o \ nls.o util.o cmd_debug.o threads.o timeops.o locator.o \ -o synop_tool $(LIBS) clean: $(RM) *.bak *~ *.o synop_tool #---------------------------------------------------------------------------------- fldigi-3.21.80/src/synop-src/synop_tool.cxx0000664000175000017500000015212612313064025015526 00000000000000// ---------------------------------------------------------------------------- // synop.cxx -- SYNOP decoding // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include "synop.h" #include "kmlserver.h" #include "field_def.h" #define G_N_ELEMENTS(arr) sizeof(arr)/sizeof(*arr) // ---------------------------------------------------------------------------- static std::ostream * dbg_strm = &std::cout ; struct tst_callback : public synop_callback { // Callback for writing decoded synop messages. void print(const char * str, size_t nb, bool bold ) const { dbg_strm->write( str, nb ); } bool log_adif(void) const { return true ;} bool log_kml(void) const { return true ;} }; // ---------------------------------------------------------------------------- static void test_coordinates() { CoordinateT::Pair jn45op( "JN45op" ); if( (int)( jn45op.longitude().angle() * 100 ) != 920 ) { std::cout << "Bad longitude\n" ; exit(EXIT_FAILURE); } if( (int)( jn45op.latitude().angle() * 100 ) != 4564 ) { std::cout << "Bad latitude\n" ; exit(EXIT_FAILURE); } std::cout << "Coordinates OK\n"; } // ---------------------------------------------------------------------------- static const struct { int m_wmo_indicator ; const char * m_name ; } wmo_tests[] = { { 62722, "Aroma" }, { 95613, "Pemberton" }, { 41939, "Madaripur" }, { 71121, "Edmonton Namao Alta." } }; static const size_t wmo_tests_nb = G_N_ELEMENTS(wmo_tests); static void test_wmo(void) try { for( size_t i = 0; i < wmo_tests_nb; ++i ) { const std::string & wmo_name = SynopDB::IndicatorToName( wmo_tests[i].m_wmo_indicator ); std::cout << "wmo_name=" << wmo_name << "\n"; std::cout << SynopDB::IndicatorToCoordinates( wmo_tests[i].m_wmo_indicator ) << "\n"; if( wmo_name != wmo_tests[i].m_name ) { std::cout << wmo_name << '\n'; std::cout << wmo_tests[i].m_name << '\n'; std::cout << "ERROR\n"; exit(1) ; } } std::cout << "Tested " << wmo_tests_nb << " records\n"; } catch(...) { std::cout << "Error when testing wmo loading\n"; return ; } // ---------------------------------------------------------------------------- static const struct { const char * m_buoy_id ; const char * m_name ; } buoy_tests[] = { { "44022", "Execution Rocks" }, { "kcmb", "East Cameron 47JP (Apache Corp)" } }; static const size_t buoy_tests_nb = G_N_ELEMENTS(buoy_tests); static void test_buoy(void) try { for( size_t i = 0; i < buoy_tests_nb; ++i ) { const std::string & buoy_name = SynopDB::BuoyToName( buoy_tests[i].m_buoy_id ); std::cout << "buoy_name=" << buoy_name << "\n"; if( buoy_name != buoy_tests[i].m_name ) { std::cout << buoy_name << '\n'; std::cout << buoy_tests[i].m_name << '\n'; std::cout << "ERROR\n"; exit(1) ; } } std::cout << "Tested " << buoy_tests_nb << " records\n"; } catch(...) { std::cout << "Error when testing buoy loading\n"; return ; } // ---------------------------------------------------------------------------- static const struct { const char * m_ship_callsign ; const char * m_name ; } ship_tests[] = { { "3EPD8", "Trinity Arrow" }, { "WYP8657", "James R. Barker" } }; static const size_t ship_tests_nb = G_N_ELEMENTS(ship_tests); static void test_ship(void) try { for( size_t i = 0; i < ship_tests_nb; ++i ) { const std::string & ship_name = SynopDB::ShipToName( ship_tests[i].m_ship_callsign ); std::cout << "ship_name=" << ship_name << "\n"; if( ship_name != ship_tests[i].m_name ) { std::cout << ship_tests[i].m_ship_callsign << ".\n"; std::cout << ship_name << ".\n"; std::cout << ship_tests[i].m_name << ".\n"; std::cout << "ERROR\n"; exit(1) ; } } std::cout << "Tested " << ship_tests_nb << " records\n"; } catch(...) { std::cout << "Error when testing ship loading\n"; return ; } // ---------------------------------------------------------------------------- static const struct { const char * m_jcomm_callsign ; const char * m_name ; } jcomm_tests[] = { { "13002", "TAO21N23W" }, { "13590", "ARGOS:71125" } }; static const size_t jcomm_tests_nb = G_N_ELEMENTS(jcomm_tests); static void test_jcomm(void) try { for( size_t i = 0; i < jcomm_tests_nb; ++i ) { const std::string & jcomm_name = SynopDB::JCommToName( jcomm_tests[i].m_jcomm_callsign ); std::cout << "jcomm_name=" << jcomm_name << "\n"; if( jcomm_name != jcomm_tests[i].m_name ) { std::cout << jcomm_tests[i].m_jcomm_callsign << ".\n"; std::cout << jcomm_name << ".\n"; std::cout << jcomm_tests[i].m_name << ".\n"; std::cout << "ERROR\n"; exit(1) ; } } std::cout << "Tested " << jcomm_tests_nb << " records\n"; } catch(...) { std::cout << "Error when testing jcomm loading\n"; return ; } // ---------------------------------------------------------------------------- // Used in a special mode where the synop decoder just prints output the name of the tokens. struct synop_test { int m_expected_nb_msgs ; const char * m_input ; const char * m_output ; }; static const synop_test tests_arr_full[] = { { 1, "08495 12575 72512 10171 20128 30242 40250 57005 60002 83502 91750\n" " 333 10182 81622 83633 87072=\n", "Day of the month: 11 Observation time: 18 hr\n" "Weather station: 08495 LXGB GIBRALTAR (CIV/MIL) GI\n" "Latitude: 3609N Longitude: 00521W Elevation: 5 m\n" "Cloud base: 600 - 999 m (2000 - 3333 ft).\n" "Horizontal visibility: 25 km.\n" "Total cloud cover: 7/8ths or more, but not 8/8ths.\n" "Wind direction: 250°.\n" "Wind speed: 12 knots, from anemometer.\n" "Air temperature: 17.1 °C.\n" "Dewpoint temperature: 12.8 °C.\n" "Sea level pressure: 1025.0 hPa.\n" "Pressure change over last 3 hours: -0.5 hPa, decreasing steadily.\n" "Present weather: not significant.\n" "Past weather: not significant.\n" "Low cloud type: stratocumulus other than stratocumulus cumulogenitus.\n" "Middle cloud type: no altocumulus, altostratus or nimbostratus.\n" "High cloud type: cirrus spissatus, or cirrus castellanus or cirrus floccus.\n" "Maximum temperature: 18.2 °C.\n" }, { 1, "16597 32562 33113 10139 20097 30053 40140 53022 81130 333 10170 81826\n" " 83357 91132 91531 =\n", "Day of the month: 11 Observation time: 18 hr\n" "Weather station: 16597 LMML LUQA/MALTA ML\n" "Latitude: 3551N Longitude: 01429E Elevation: 91 m\n" "Cloud base: 600 - 999 m (2000 - 3333 ft).\n" "Horizontal visibility: 12 km.\n" "Total cloud cover: 3/8ths.\n" "Wind direction: 310°.\n" "Wind speed: 13 knots, from anemometer.\n" "Air temperature: 13.9 °C.\n" "Dewpoint temperature: 9.7 °C.\n" "Sea level pressure: 1014.0 hPa.\n" "Pressure change over last 3 hours: 2.2 hPa, decreasing or steady, then increasing.\n" "Precipitation amount: 0.0 mm.\n" "Present weather: not significant.\n" "Past weather: not significant.\n" "Low cloud type: cumulus humulis or fractus (no vertical development).\n" "Middle cloud type: altocumulus translucidous at one level.\n" "High cloud type: no cirrus, cirrocumulus or cirrostratus.\n" "Maximum temperature: 17.0 °C.\n" } }; static const size_t nb_tests_full = G_N_ELEMENTS(tests_arr_full); /* * TODO: Put apart the tests with errors. Ideally we should generate them starting from good patterns. */ static const synop_test tests_arr[] = { { 0, "a b c d\n\ne f\n", "a b c d\n\ne f\n" }, { 0, "a b 20123 99536 e f\n20123 99536\ng h\n", "a b YYGGi+99LLL+ e f\nYYGGi+99LLL+\ng h\n" }, { 0, "20123\txyz 20123 30101\nx", "20123\txyz IIiii+YYGGi+\nx" }, { 1, "a b 20123 99536 70307 d e f\n", "a b YYGGi+99LLL+QLLLL+ d e f\n" }, { 0, "0393) 32375 71902 10140 20081 30101 40125 57007 878//\n", "0393) iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" }, { 1, "AMOUK36 20184 99556 70051 46/// ///// 10114 20068 40134 54001;\n", "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" }, { 0, "81/1/ 222// 00156 2//// 3//// 4//// 5//// 6//// 80220 ICE /////;\n", "81/1/ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+6IEER+8aTTT+ICE+cSbDz+\n" }, { 1, "03075 15981 /1212 10086 20041 30090 40134 56007 60002 91750\n" "333 10099 82/68;\n\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+9GGgg+\n" "333+1sTTT_max+8NChh+\n\n" }, { 0, "333 69937 81/14 87/60;\n", "333+6RRRt+8NChh+8NChh+\n" }, { 0, "22273 ICE 52//2;\n", "222Dv+ICE+cSbDz+\n" }, { 1, "03204 12580 12505 10117 20064 30103 40123 57006 60002 81100 91750\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+9GGgg+\n" }, { 0, "333 21153 42021 70000 91105;\n", "333+2sTTT_min+4Esss+7RRRR+9SSss+\n" }, { 0, "333 21061 43094 70000 91102;\n", "333+2sTTT_min+4Esss+7RRRR+9SSss+\n" }, { 0, "10015 21014 30134 40152 52009 333 21006 91114;\n", "1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+2sTTT_min+9SSss+\n" }, { 1, "01102 46/// /1410 10058 20006 30069 40089 52006 333 20051 91116;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+2sTTT_min+9SSss+\n" }, { 0, "333 20085 91710;\n", "333+2sTTT_min+9SSss+\n" }, { 1, "SNCN19 CWAO 280023\n" "OOXX\n" "MRP43 27221 99181 70159 ///// 00101\n" "26/// /2504 10242 29081 30139 92200 333 60000=\n", "TTAAii+CCCC+YYGGgg+\n" "OOXX+IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" }, { 0, // Cannot find WMO station:72358 "ZCZC\n" "SM 190600\n" "AAXX 19064\n" "72358 14/// /1019 10244 29095 60071 7////\n" "333 10297 20236 3/025 55300 2//// 70082 91129 91219\n" "555 00245 1011/ 20255 91129 91219\n" "666 10245 20242 7////=\n" "NNNN\n", "ZCZC+\n" "SM 190600\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+6RRRt+7wwWW+\n" "333+1sTTT_max+2sTTT_min+3Ejjj+553SS+2FFFF+7RRRR+9SSss+9SSss+\n" "555+0sTTT_land+1RRRr+2sTTT_avg+911ff+912ff+\n" "666+1snTxTxTx+2snTxTxTx+7VVVV+\n" "NNNN+\n" }, { 1, "04202 NIL;\n" "04203 46/// /1510 11048 21067 30142 40160 52006;\n", "IIiii+NIL+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" }, { 1, "01482 46/// /0510 10059 20014 30021 40030 57005 333 20059 91115;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+2sTTT_min+9SSss+\n" }, { 1, "03091 15981 /1208 10090 20044 30053 40133 57007 60002 91750\n" "333 10107 55310 21294 8//99;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+9GGgg+\n" "333+1sTTT_max+553SS+2FFFF+8NChh+\n" }, { 1, "AAXX 15064\n\n" "06011 05584 50805 10064 20008 30136 40205 57012 6///2\n", "AAXX+YYGGi+\n\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+\n" }, { 1, "AAXX 27064\n\n" "04018 42584 62909 10061 20035 40224 52020 86500 555 3//11 8662.04048 4211 QWOQU QPPYU WPPYE\n", "AAXX+YYGGi+\n\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+8NCCC+ 555+3Ejjj+ 8662.04048 4211 QWOQU QPPYU WPPYE\n" }, { 1, "AAXX 26184\n\n" "04018 21245 82021 10080 20076 40173 58016 72052 886// 333 10107 20079 69918 555 3//22 88703;\n", "AAXX+YYGGi+\n\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 333+1sTTT_max+2sTTT_min+6RRRt+ 555+3Ejjj+8NChh+\n" }, { 1, "06060 01675 60809 10191 20126 30053 40115895000 69902 72162 82172\n\n" " 333 10228 20130 69907 82840 85358;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+ 40115895000 6RRRt+7wwWW+8NCCC+\n\n" " 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+ 85358;\n" }, { 1, "06070 05970 50506 10163 20104 30096 40126 57003 6///2\n\n" " 333 10201 20122 6///7 85/67;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+\n\n" " 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+\n" }, { 2, "BSH03 20001 99540 10081 46/// ///// 22200 00067 20501 70003;\n\n" "BSH05 20001 99549 10082 46/// ///// 22200 20601 70003;\n", "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+ 222Dv+0sTTT+2PPHH+70HHH+\n\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+ 222Dv+2PPHH+70HHH+\n" }, { 1, "13600 20123 99328 70293 46/// ///// 40331 52003\n" "222// 00200;\n", "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+4PPPP+5appp+\n" "222Dv+0sTTT+\n" }, { 1, "SMMJ01 LWOH 190000\n" "AAXX 1900\n" "13579 32998 03606 11106 21153 39397 40298 52004=\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX 1900\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" }, { 1, "SMML01 LMMM 190000\n" "AAXX 19004\n" "16597 32670 10403 10069 21015 30177 40268 52009 81500 333 81640 =\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+8NChh+ =\n" }, { 5, "SMOS01 LOWM 190000\n" "AAXX 19001\n" "11036 32565 73208 10000 21038 30065 40306 57008 8353/ 333 83629\n" "86360 91013 91113 91209=\n" "11010 35561 /2504 11031 21043 39946 40345 57009=\n" "11120 36/17 /9901 11111 21112 39620 40386 57005=\n" "11150 36429 /1802 11050 21055 39790 40363 57005=\n" "11240 36966 /1703 11031 21060 39870 40310 57004=\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+8NChh+8NChh+9SSss+9SSss+9SSss+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" }, { 1, "SNVD01 KWBC 190700\n" "BBXX\n" "S6IG 19071 99278 70923 41/9/ /2603 10193 20100 40160 50001 7////\n" "22234 04239=\n", "TTAAii+CCCC+YYGGgg+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+\n" "222Dv+0sTTT+\n" }, { 1, "AAXX 23004 47411 15/84 /3603 10144 20114 30043 40074 50000 60012 333 20126=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+ 333+2sTTT_min+\n" }, { 1, "AAXX 22184 47409 11/50 80501 10090 20086 30023 40076 57002 69951 78085 887//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" }, { 1, "SMDL40 EDZW 201800\n" "AAXX 20181\n" "10004 46/60 /0408 10124 20107 30077 40077 57015\n" "222// 00103\n" "333 10141 20106 55304;\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "222Dv+0sTTT+\n" "333+1sTTT_max+2sTTT_min+553SS+\n" }, { 1, "10147 12882 50605 10213 20111 30048 40065 58008 69902 81031\n" "333 10265 20152 30017 55304 20454 30310 41284 81358 84076;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+\n" "333+1sTTT_max+2sTTT_min+3Ejjj+553SS+2FFFF+3FFFF+4FFFF+8NChh+8NChh+\n" }, { 1, "10200 07961 20503 10204 20155 30065 40063 55009 69932 70060\n" "333 10215 20130 3/012 553// 2//// 3//// 69907 82/60;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+\n" "333+1sTTT_max+2sTTT_min+3Ejjj+553SS+2FFFF+3FFFF+6RRRt+8NChh+\n" }, { 1, "03302 15973 /0106 10133 20069 30105 40117 57002 60002 91750\n" "333 10143 55310 21364 8//99;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+9GGgg+\n" "333+1sTTT_max+553SS+2FFFF+8NChh+\n" // "333+1sTTT_max+55jjj+jjjjj+8NChh+\n" }, { 0, "333 10188 91107;\n", "333+1sTTT_max+9SSss+\n" }, { 1, "AAXX 23061 15108 02298 62702 10135 20135 38165 48563 53002 60022 86500 333 10151 20131 30/// 60007 70022 95080 444 86154=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+2sTTT_min+3Ejjj+6RRRt+7RRRR+9SSss+ 444+NCHHC+\n" }, { 1, "AAXX 23051 15346 22997 03601 10237 20171 39879 40154 52011 333 60005 91002 91102 95090=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+6RRRt+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 23034 47090 32665 61407 10231 20206 30062 40083 57008 82501=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" }, { 1, "AAXX 23004 47155 32962 60903 10241 20175 30051 40093 57004 80001 333 20194 30034=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+2sTTT_min+3Ejjj+\n" }, { 1, "AAXX 22124 47090 12668 60000 10200 20189 30080 40101 51003 69912 86500 333 10227 31020 92020=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+3Ejjj+9SSss+\n" }, { 1, "AAXX 22124 47104 11650 62902 10193 20174 30008 40099 53003 69952 71022 85500 333 10247 30020=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+1sTTT_max+3Ejjj+\n" }, { 1, "AAXX 23004 47127 329// /0001 10248 20175 39959 40090 57009 333 20189 3/028=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+2sTTT_min+3Ejjj+\n" }, { 1, "AAXX 22181 26029 27/70 /0704 10155 20073 30150 40178 57008 70000 333 10167 20133 60007 91109 555 20133 50142= \n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+ 333+1sTTT_max+2sTTT_min+6RRRt+9SSss+ 555+2sTTT_avg+5jjjj+ \n" }, { 1, "AAXX 22151 26045 27/81 00505 10187 20068 30193 40195 56008 70000 80/// 333 10190 20104 60007 80/// 555 1/036 20104 3/010 50134=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+ 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+ 555+1VVff+2sTTT_avg+3Ejjj+5jjjj+\n" }, { 1, "AAXX 22181 26058 27/84 00505 10176 20076 30175 40182 58007 70000 80/// 333 10199 20158 60007 80/// 91109 555 1/018 20158 3/018 50162 52018=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+ 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+9SSss+ 555+1VVff+2sTTT_avg+3Ejjj+5jjjj+5jjjj+\n" }, { 1, "AAXX 22124 47407 11/60 82904 10150 20130 39900 40065 53006 69902 72582 886// 333 10188=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+1sTTT_max+\n" }, { 1, "AAXX 23034 08055 NIL=\n", "AAXX+YYGGi+ IIiii+NIL+\n" }, { 1, "AAXX 23074 08045 46/// /2102 10139 20110 39933 40241 53003 555 60005=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 555+6GGmm+\n" }, { 1, "AAXX 22184 08042 02680 23609 10161 20084 39815 40246 53003 60002 81508 333 10183 60007=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+6RRRt+\n" }, { 1, "AAXX 22184 08140 12970 33006 10260 21017 39231 48564 55001 60002 80001 333 10269=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+\n" }, { 1, "AAXX 22124 08085 02580 23210 10221 20100 39696 40213 57005 60001 81101 333 60007=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+6RRRt+\n" }, { 1, "AAXX 22124 08130 12970 00406 10220 20070 39462 40213 58005 60001 333 50620=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+ 333+5jjjj+\n" }, { 1, "AAXX 23064 08141 12960 23504 10106 20077 39383 40240 52007 60002 80008 333 20103 30009 55141 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+3Ejjj+55jjj+jjjjj+\n" }, { 1, "AAXX 23064 08160 12970 52812 10163 20102 39928 40232 53004 60002 80008 333 20157 55138 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+55jjj+jjjjj+\n" }, { 1, "AAXX 23064 08184 02980 20000 10204 20125 30068 40219 5//// 60002 80001 333 20152 3/015 55087 60007 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+3Ejjj+55jjj+jjjjj+7RRRR+\n" }, { 1, "AAXX 22124 08202 02970 11104 10243 20044 39301 42842 58006 60001 80001 333 50880 60007=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+5jjjj+6RRRt+\n" }, { 1, "AAXX 22154 07330 22680 32612 10198 20110 30165 40237 52003 83100 333 60007 83840 90710 91121 93100 555 60005=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+6RRRt+8NChh+9SSss+9SSss+9SSss+ 555+6GGmm+\n" }, { 1, "AAXX 23064 70174 32766 60000 10206 20044 39892 40131 56007 90553 333 10217 20067 555 92306=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+9GGgg+ 333+1sTTT_max+2sTTT_min+ 555+9SSss+\n" }, { 0, // Cannot find WMO station:91320 "AAXX 22124 91320 32474 80808 10283 20261 30122 40127 83101 333 562/9 58007 83815 85073 555 92212=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+5jjjj+5jjjj+8NChh+8NChh+ 555+9SSss+\n" }, { 1, "AAXX 22214 47409 41/50 80102 10094 20091 30030 40083 51007 72588 887//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+\n" }, { 1, "AAXX 22184 08015 12560 80204 10146 20100 39854 40255 54000 60002 8277/ 333 10178=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+\n" }, { 1, "AAXX 22181 26124 01/84 10504 10188 20047 30140 40169 57002 60002 70200 80008 333 10227 20178 60007 80/// 91110 555 1/023 20178 3/022 50160 52020=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+9SSss+ 555+1VVff+2sTTT_avg+3Ejjj+5jjjj+5jjjj+\n" }, { 1, "AAXX 22091 26231 21/81 00605 10206 20078 30173 40187 57007 70200 333 10211 20060 60007 80/// 91008 91108 555 1/049 20060 3/005 50160= \n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+ 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+9SSss+9SSss+ 555+1VVff+2sTTT_avg+3Ejjj+5jjjj+ \n" }, { 1, "AAXX 22154 64500 42460 42006 10275 20211 30108 40120 84500 333 58008 83611 84630=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+5jjjj+8NChh+8NChh+\n" }, { 1, "AAXX 22184 64550 32458 8//// 10248 20231 30//0 40//0 885// 333 10274 5//// 84610 88623=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+1sTTT_max+5jjjj+8NChh+8NChh+\n" }, { 1, "AAXX 22094 64550 42460 8//// 10250 20234 30//0 40//0 888// 333 5//// 84813 88626 94939 95839=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+5jjjj+8NChh+8NChh+9SSss+9SSss+\n" }, { 1, "AAXX 22134 61901 41580 71116 10189 20127 39699 40205 72582 878// 91250 333 58003 81822 87635 91026 90710 91133=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+7wwWW+8NCCC+9GGgg+ 333+5jjjj+8NChh+8NChh+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 27064 65222 11458 70000 10237 20234 3//// 4//// 60092 76066 86538 333 20233 5//// 86610=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+6RRRt+7wwWW+8NCCC+ 333+2sTTT_min+5jjjj+8NChh+\n" }, { 0, // Cannot find WMO station:65213 "AAXX 27094 65213 42460 72004 10265 20236 3//// 4//// 875// 333 5//// 87612=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+5jjjj+8NChh+\n" }, { 1, "AAXX 27094 91582 24570 /0810 10227 20178 30135 40170 50009 700// 333 69907 90710 91120 555 60005=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+ 333+6RRRt+9SSss+9SSss+ 555+6GGmm+\n" }, { 1, "AAXX 27094 62318 32560 43110 10300 20231 40104 54000 84800=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+8NCCC+\n" }, { 1, "AAXX 22154 08015 41558 80306 10148 20094 39854 40255 52003 70522 8271/=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+\n" }, { 1, "AAXX 23064 08015 11550 52802 10122 20113 39848 40252 54000 60002 71022 82806 333 20118 30010 50144 55016 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+2sTTT_min+3Ejjj+5jjjj+55jjj+jjjjj+\n" }, { 1, "AAXX 22154 08001 42475 13207 10183 20109 30168 40248 55000 81541=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" }, { 1, "AAXX 22124 72654 15966 60000 10167 20150 39718 40175 53006 69931 91155 333 10278 20139 70003 555 92212=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+9GGgg+ 333+1sTTT_max+2sTTT_min+7RRRR+ 555+9SSss+\n" }, { 1, "AAXX 22181 15015 02598 53502 10239 20169 39573 42804 52009 60002 84301 333 10269 20226 30042 60007 91003 91105=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+2sTTT_min+3Ejjj+6RRRt+9SSss+9SSss+\n" }, { 1, "AAXX 22184 08213 12770 23108 10273 21007 39056 48560 53001 60002 81041 333 10293=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+\n" }, { 1, "AAXX 22184 08215 12870 12210 10201 21023 38179 48556 53002 60002 80005 333 10230 95000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+9SSss+\n" }, { 1, "AAXX 23064 08231 12967 12401 10161 20130 39150 48569 53005 60002 80001 333 20161 30016 50904 55109 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+3Ejjj+5jjjj+55jjj+jjjjj+\n" }, { 1, "AAXX 23064 08284 02470 12802 10216 20159 30154 40227 53013 60002 81600 333 20195 30019 50484 55082 60007 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+3Ejjj+5jjjj+55jjj+jjjjj+7RRRR+\n" }, { 1, "AAXX 23061 10004 46/29 /2313 10143 20114 30153 40153 53011 222// 00140 333 10153 20137 55069 55308 91117 91214=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+1sTTT_max+2sTTT_min+55jjj+jjjjj+9SSss+9SSss+\n" }, { 1, "AAXX 23021 10004 46/60 /2213 10147 20124 30139 40139 53002 222// 00140 333 55300 91116 91213=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+553SS+9SSss+9SSss+\n" }, { 1, "AAXX 22091 10004 46/58 /2011 10145 20113 30110 40110 51013 222// 00137 333 20133 55306 91117 91213=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+2sTTT_min+553SS+9SSss+9SSss+\n" }, { 1, "AAXX 23061 10007 46/59 /2110 10138 20116 30158 40158 51008 222// 00130 333 10151 20133 55068 55300 91114 91211=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+1sTTT_max+2sTTT_min+55jjj+jjjjj+9SSss+9SSss+\n" }, { 1, "AAXX 22181 10007 46/57 /1903 10142 20113 30145 40145 51002 222// 00136 333 10147 20125 55301 91116 91212=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+1sTTT_max+2sTTT_min+553SS+9SSss+9SSss+\n" }, { 1, "AAXX 23081 10015 42560 72111 10145 20120 30162 40172 53010 81275 333 55307 21589 30922 81828 84366 85071 91113 91211=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+553SS+2FFFF+3FFFF+8NChh+8NChh+8NChh+9SSss+9SSss+\n" }, { 1, "AAXX 22151 10015 21580 52303 10156 20110 30138 40148 51008 72598 82972 333 55304 21373 30784 60017 82930 83075 91114 91211 96481=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+ 333+553SS+2FFFF+3FFFF+6RRRt+8NChh+8NChh+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 23081 10022 47466 82109 10149 20125 30161 40170 53009 72365 333 55301 20826 30718 85/16 87/21 88/30 91113=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+ 333+553SS+2FFFF+3FFFF+8NChh+8NChh+8NChh+9SSss+\n" }, { 1, "AAXX 22171 10022 45977 02105 10169 20109 30142 40151 50002 333 55307 21236 30490=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+553SS+2FFFF+3FFFF+\n" }, { 1, "AAXX 22081 10022 45571 52207 10161 20123 30116 40125 53018 333 55303 21177 30689 83/23 84/29 85/35=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+553SS+2FFFF+3FFFF+8NChh+8NChh+8NChh+\n" }, { 1, "AAXX 23064 07005 02475 22307 10128 20105 30143 40233 53013 60002 82201 333 10163 20107 31010 55053 60007 70012 82816 90710 91113 555 60005=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+2sTTT_min+3Ejjj+55jjj+jjjjj+7RRRR+8NChh+9SSss+9SSss+ 555+6GGmm+\n" }, { 1, "AAXX 27094 96315 41459 72207 10273 20236 40089 72582 83968 333 82816 81917 85277=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+7wwWW+8NCCC+ 333+8NChh+8NChh+8NChh+\n" }, { 1, "SNVD17 CWTO 261300 \n" "BBXX \n" "45142 26131 99427 70793 46/// /0006 10171 39936 40142 52008 \n" "22200 00202 10301 70003 333 91207 =\n", "TTAAii+CCCC+YYGGgg+ \n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+3PPPP+4PPPP+5appp+ \n" "222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+ =\n" }, { 2, "SNVD22 KWNB 261300 RRR\n" "BBXX\n" "46232 26131 99325 71174 46/// ///// 1//// 91330 22200 00190 10703\n" "20703 320// 41201 70015=\n" "46247 26131 99378 71228 46/// ///// 1//// 91321 22200 00139 10802\n" "20802 322// 41301 70012=\n", "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+9GGgg+ 222Dv+0sTTT+1PPHH+2PPHH+3dddd+4PPHH+70HHH+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+9GGgg+ 222Dv+0sTTT+1PPHH+2PPHH+3dddd+4PPHH+70HHH+\n" }, { 1, "641 \n" "SMVE01 KWBC 141800 RRA\n" "BBXX\n" "A8OK5 14183 99132 51250 41598 50816 10280 20229 40152 51014 70222\n" "83145 22214 04273 20302 316// 40504 5//// 80245=\n", "641 \n" "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+8aTTT+\n" }, { 1, "765 \n" "SMCA02 KWBC 141800\n" "AAXX 14184\n" "78255 42559 51603 10269 20148 39972 40136 52200 84502 333 10270\n" "20195 84620=\n" "78317 NIL=\n" "78318 NIL=\n", "765 \n" "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+1sTTT_max+2sTTT_min+8NChh+\n" "IIiii+NIL+\n" "IIiii+NIL+\n" }, { 2, "965 \n" "SMVD20 KWNB 141800\n" "BBXX\n" "44097 14181 99410 70711 46/// ///// 1//// 91731 22200 00040 11308\n" "21005 317// 41306 70042=\n" "572 \n" "SMJD50 OJAM 141800\n" "AAXX 14184\n" "40255 32960 00000 10252 20115 39382 40065 54002 333 10310=\n", "965 \n" "TTAAii+CCCC+YYGGgg+\n" "BBXX\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+9GGgg+ 222Dv+0sTTT+1PPHH+2PPHH+3dddd+4PPHH+70HHH+\n" "572 \n" "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+1sTTT_max+\n" }, { 6, "SNVD01 KWBC 261300 RRK\n" "BBXX\n" "46036 26131 99484 71339 46/// /2103 10107 40103 57005 22200 00095\n" "11403 70013 333 91203=\n" "41024 26131 99338 70785 46/// /0510 10225 40094 53030 91300=\n" "44022 26131 99409 70737 46/// /3107 10178 20113 40067 91330 22200\n" "00199 333 91209 555 11072 22072=\n" "44140 26131 99429 70515 46/// ///// 1//// 4//// 5//// 22200 0////\n" "1//// 70/// 333 912//=\n" "PCHM 26134 99525 71298 41298 81617 10110 20100 40132 53001 7//22\n" "8/7// 22234 00120 20402 80105=\n" "PDAN 26134 99552 71314 41298 51909 10090 20045 40120 58020 7//11\n" "8/7// 22273 00080 2//// 30000 80070=\n", "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+ 222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+9GGgg+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+9GGgg+ 222Dv+0sTTT+ 333+9SSss+ 555+110ff+220ff+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+ 222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+8aTTT+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+8aTTT+\n" }, { 1, "AAXX 28091 11464 42470 53204 10168 20133 39196 42792 50005 83272\n" "333 83813 555 380//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+8NChh+ 555+3Ejjj+\n" }, { 1, "AAXX 28091 06490 45981 01408 10225 20146 39561 40097 58015\n" "333 91112 91209=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "333+9SSss+9SSss+\n" }, { 1, "AAXX 28091 06479 42970 41202 10257 20173 30028 40102 58016 83031\n" "333 83364 83072 91105 91203=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+8NChh+8NChh+9SSss+9SSss+\n" }, { 1, "AAXX 28064 71048 16/// /2511 10119 20091 60001\n" "333 10209 20088 70347\n" "555 32948 40133=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+6RRRt+\n" "333+1sTTT_max+2sTTT_min+7RRRR+\n" "555+3Ejjj+4Esss+\n" }, { 1, "AAXX 28094 71050 36/// /3003 10062 20031 39083 40136 58005\n" "333 60001=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "333+6RRRt+\n" }, { 1, "AAXX 28064 71079 11574 61403 10153 20131 39624 49887 58011 69981 78082 86100\n" "333 10278 20150 70104 90932\n" "555 10000 20000 31628 40231=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" "333+1sTTT_max+2sTTT_min+7RRRR+9SSss+\n" "555+1VVff+2sTTT_avg+3Ejjj+4Esss+\n" }, { 0, // Cannot find WMO station:27020 "AAXX 28061 27020 32698 72202 10158 20127 39885 40026 52009 69950 87500\n" "333 20099 876//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+\n" "333+2sTTT_min+8NChh+\n" }, { 1, "AAXX 28064 71133 17/// /2613 10151 20104 39343 40026 51025 69921 7//4/\n" "333 10170 20115 70012\n" "555 32833 40212=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+\n" "333+1sTTT_max+2sTTT_min+7RRRR+\n" "555+3Ejjj+4Esss+\n" }, { 0, // Cannot find WMO station:71547 "AAXX 28064 71547 16/// /2513 10129 20046 60001\n" "333 10184 20098 70000\n" "555 32428 40022=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+6RRRt+\n" "333+1sTTT_max+2sTTT_min+7RRRR+\n" "555+3Ejjj+4Esss+\n" }, { 3, "599 \n" "SNCN19 CWAO 141806\n" "OOXX\n" "ARP01 14161 99345 50585 ///// 00681\n" "26/// /0000 10114 29029 30044 91610 333 60000=\n" "ARP01 14161 99345 50585 ///// 00681\n" "26/// /0000 10114 29028 30044 91620 333 60000=\n" "ARP01 14161 99345 50585 ///// 00681\n" "26/// /0000 10115 29028 30043 91630 333 60000=\n", "599 \n" "TTAAii+CCCC+YYGGgg+\n" "OOXX+IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" "IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" "IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" }, { 1, "SMVA13 LFPW 280000\n" "BBXX\n" "BAREU65 28004 99202 70180 46/// ///// 40137 52005\n" "22283=\n", "TTAAii+CCCC+YYGGgg+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+4PPPP+5appp+\n" "222Dv+\n" }, { 2, "SNCN19 CWAO 280016\n" "OOXX\n" "ARP01 27221 99345 50585 ///// 00311\n" "26/// /0000 10070 29040 30084 92220 333 60000=\n" "ARP01 27221 99345 50585 ///// 00311\n" "26/// /0000 10070 29041 30087 92230 333 60000=\n", "TTAAii+CCCC+YYGGgg+\n" "OOXX+IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" "IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" }, { 1, "AAXX 28091 11146 42/86 33201 10071 20018 37029 47148 53009 81202\n" "333 55310 818//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+553SS+8NChh+\n" }, { 1, "AAXX 28061 11406 01465 39901 10182 20150 39593 40153 52003 60002 703// 83101\n" "333 20135 30009 50254 60005 70000 83813\n" "555 382// 50176 60175 70179 80170 90150=\n", "\n" }, { 1, "AAXX 23001 15090 02997 23001 10250 20177 30067 40154 52013 60001 81041 333 55300 10173 20000 3//// 55131 01487 22929 30369 60007 91005 91106=\n", "\n" }, { 1, "391\n" "SNVF01 KWBC 190700\n" "BBXX\n" "9VBL 19071 99514 10028 41/9/ /3009 10076 20023 40319 57012 7////\n" "22263 04074=\n", "391\n" "TTAAii+CCCC+YYGGgg+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+\n" "222Dv+0sTTT+\n" }, { 2, "439\n" "SNVD15 KWBC 190700\n" "BBXX\n" "41009 19071 99285 70802 46/// /2601 10205 40140 54000 90650 22200\n" "00251 10802 70011 333 91201 555 11007 22007=\n" "42002 19071 99259 70936 46/// /1602 10215 20136 40156 50000 90650\n" "22200 00244 10801 70007 333 91203 555 11021 22021 30602 41304\n" "60649 159018 136007 135016 139014 136023 132012=\n", "439\n" "TTAAii+CCCC+YYGGgg+\n" "BBXX\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+9GGgg+ 222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+ 555+110ff+220ff+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+9GGgg+\n" "222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+ 555+110ff+220ff+3GGmm+4ddff+6GGmm+dddfff+dddfff+dddfff+dddfff+dddfff+dddfff+\n" }, { 1, "AAXX 22191 15420 22997 03401 10225 20204 30015 40121 52010 333 55300 0//// 20030 3//// 60005 91001 91101 99706=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+55jjj+jjjjj+2sTTT_min+3Ejjj+6RRRt+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 23001 15420 02997 03201 10189 20176 30028 40135 52007 60001 333 55300 0//// 20000 3//// 55129 0//// 22868 3//// 60007 91002 91102=\n", "\n" }, { 0, // Cannot find WMO station:11244 "AAXX 28091 11244 36/// /1402 10268 20170 39835 40140 57007\n" "333 55310=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "333+553SS+\n" }, { 1, "AAXX 23001 10015 01465 72110 10144 20119 30144 40154 54000 60021 72586 878// 333 31/// 55/// 21817 30776 55300 20000 30000 69927 83816 86631 91115 91213 96481=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+3Ejjj+55jjj+jjjjj+3FFFF+553SS+2FFFF+3FFFF+6RRRt+8NChh+8NChh+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 22181 10022 07780 82204 10158 20112 30148 40157 53008 60022 76160 333 10187 20133 3/012 55302 20414 30270 69907 85/50 87/58 88/62=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+ 333+1sTTT_max+2sTTT_min+3Ejjj+553SS+2FFFF+3FFFF+6RRRt+8NChh+8NChh+8NChh+\n" }, { 5, "SMSQ10 LZIB 190000\n" "AAXX 19001\n" "11816 32565 63603 10006 21030 30124 40294 57006 83830\n" "333 55002 82820 86360=\n" "11826 35/64 /3304 10002 21020 30086 40294 57006\n" "333 55000=\n" "11903 32970 71501 11019 21044 39874 40271 58006 87070\n" "333 55047 87360=\n" "11934 11658 82710 11023 21050 39412 42834 56004 69911 77077 8452/\n" "333 55031 84646 88458=\n" "11968 11335 80000 11063 21070 39978 40276 58003 69901 77172 8652/\n" "333 55000 83708 85638 88461=\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+55jjj+jjjjj+8NChh+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "333+55jjj+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+55jjj+jjjjj+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" "333+55jjj+jjjjj+8NChh+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" "333+55jjj+jjjjj+8NChh+8NChh+\n" }, { 7, "SMVF01 EGRR 261200 RRE\n" "BBXX\n" "62107 26124 99501 70061 46/// /2515 10139 20139 40207 52008 22200\n" "00137 10702 70008=\n" "AMOUK12 26124 99533 70062 46/// ///// 10183 20144 40164 57017=\n" "AMOUK06 26124 99534 10017 46/// ///// 10143 20113 40214 54003=\n" "AMOUK03 26124 99513 10032 46/// ///// 10198 20129 40227 52007=\n" "AMOUK34 26124 99513 10032 46/// ///// 10203 20108 4//// 52005=\n" "63106 26124 99610 10017 46/// /3309 10106 40167 51009 22200=\n" "63105 26124 99610 10017 47/98 /3310 10132 20048 40167 51008 700// 22200=\n", "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+ 222Dv+0sTTT+1PPHH+70HHH+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+ 222Dv+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+ 222Dv+\n" }, { 1, "AAXX 23044 61901 461// /1319 10151 20148 39710 40224 58010 90350 333 87/02 91028 90710 91128 555 7/097=\n", "\n" }, { 3, "628 \n" "SMVC01 KWBC 141800 RRA\n" "BBXX\n" "MZBN2 14183 99530 50772 41497 82328 10075 20040 40110 54000 70288\n" "887// 22233 00090 20201 323// 40808 5//// 80060=\n" "NWS0020 14184 99008 50903 43/// /1103 10270 20250 40103 5////\n" "7//// 8//// 222// 04276 2//// 3//// 4//// 5//// 6//// 8//// ICE ////=\n" "NWS0029 14184 99039 50376 43/// /0711 10254 20227 40116 5////\n" "7//// 8//// 222// 04295 2//// 3//// 4//// 5//// 6//// 8//// ICE\n" "////=\n", "628 \n" "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+8aTTT+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+6IEER+8aTTT+ICE+cSbDz+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+6IEER+8aTTT+ICE+cSbDz+\n" }, { 1, "04018 42588 60507 10006 21025 40109 51002 81258 555 3//07 81830 83357 85363\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+8NCCC+ 555+3Ejjj+8NChh+8NChh+8NChh+\n" }, { 1, "ZCZC 412\n" "SIGL26 EKMI 252100\n" "AAXX 25214\n" "04418 46/// /1914 11150 21169 57011\n" " 333 553// 21328 ;\n" "04425 NIL ;\n" // "02 NIL ;\n" "04436 46/// /0107 11158 21202 ;\n" "04464 46/// /1610 11137 21171\n" " 333 553// 21530 ;\n" "04485 46/// /2503 11152 21175 37398 52006\n" " 333 553// 21624 ;\n" "04488 46/// /2810 11067 21094 37452 52013\n" " 333 553// 21310 ;\n" "NNNN\n", "ZCZC+ZCZC_id+\n" "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+5appp+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+NIL+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+5appp+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+5appp+\n" " 333+553SS+2FFFF+ ;\n" "NNNN+\n" }, { 1, "ZCZC 440\n" "SIGL26 EKMI 260300\n" "AAXX 26034\n" "04418 46/// /2615 11258 21285 57007\n" " 333 553// 20104 ;\n" "04425 NIL ;\n" "04432 NIL ;\n" "04436 NIL ;\n" "04464 46/// /1711 11236 21257 57128\n" " 333 553// 20011 ;\n" "04485 NIL ;\n" "NNNN\n", "ZCZC+ZCZC_id+\n" "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+5appp+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+NIL+ ;\n" "IIiii+NIL+ ;\n" "IIiii+NIL+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+5appp+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+NIL+ ;\n" "NNNN+\n" }, { 1, "ZCZC 506\n" "SMEN43 EDZW 261200 CCB\n" "AAXX 26121\n" "01001 11275 32514 10065 21022 30096 40108 57005 69911 70161 81641\n" " 222// 00004 333 91123;\n" "NNNN\n", "ZCZC+ZCZC_id+\n" "TTAAii+CCCC+YYGGgg+CCx+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" " 222Dv+0sTTT+ 333+9SSss+\n" "NNNN+\n" }, { 1,// Must check that one message only is created. "ZCZC 616\n" "SMVX41 EDZW 151800 RRC\n" "BBXX\n" "62119 05184\n", "ZCZC+ZCZC_id+\n" "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX\n" "IIiii+YYGGi+\n" }, { 1,// Must check that one message only is created. "ZCZC 619\n" "SMEN43 EDZW 15180 CCB\n" "AAXX 1518\n" "00271 17/82 0040 10870 20040 0116 4 16 57017 60002 700// 333\n" " 10180 91108;\n" "NNNN\n", "\n" }, { 1, "AAXX 22231 15420 22997 03200 10194 20178 30027 40134 52009 333 55300 0//// 20000 3//// 60005 91001 91102=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+55jjj+jjjjj+2sTTT_min+3Ejjj+6RRRt+9SSss+9SSss+\n" }, { 1, "62144 20184 99534 10017 47297 /3612 10086 20080 40104#580\n", "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+ 40104#580\n" }, { 1, "63057 20004 99592 100-#110)6 10084 20028 49967 51002 700// 22200 10605 70024;\n\n" "63110 20004 99595 10015 47697 /1122 10080 20031 49979 50000 700// 22200 10504 70021;\n", "IIiii+YYGGi+99LLL+ 100-#110)6 1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+ 222Dv+1PPHH+70HHH+\n\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+ 222Dv+1PPHH+70HHH+\n" }, { 1, "DGEN 20004 99547 10078 41/96 22215 10085 20013 49950 54000 74100\n", "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+\n" } }; static const size_t nb_tests = G_N_ELEMENTS(tests_arr); // TODO: Test this command to detect unpublished messages: // egrep "No publish2" flsynop.log | more // ---------------------------------------------------------------------------- static void tstone( synop * ptr_synop, const synop_test * tst_arr, int tstnb ) { std::stringstream strm_tst ; dbg_strm = &strm_tst ; int nb_errors_parse = 0 ; int nb_errors_msg = 0 ; for(int i = 0; i < tstnb; ++i ) { strm_tst.str(std::string()); ptr_synop->cleanup(); KmlServer::GetInstance()->Reset(); for( const char * pc = tst_arr[i].m_input; *pc != '\0'; ++pc ) ptr_synop->add( *pc ); ptr_synop->flush(true); bool diff_parse = ( strm_tst.str() != tst_arr[i].m_output ); if(diff_parse) ++nb_errors_parse; bool diff_msg = ( KmlServer::GetInstance()->NbBroadcasts() != tst_arr[i].m_expected_nb_msgs ); if( diff_msg ) ++nb_errors_msg; if( diff_parse || diff_msg ) { std::cout << "Input [" << tst_arr[i].m_input << "]\n" ; } if( diff_parse ) { std::cout << "Expect [" << tst_arr[i].m_output << "]\n" ; std::cout << "Actual [" << strm_tst.str() << "]\n" ; } if( diff_msg ) { std::cout << "Expected messages :" << tst_arr[i].m_expected_nb_msgs << "\n" ; std::cout << "Actual :" << KmlServer::GetInstance()->NbBroadcasts() << "\n" ; } std::cout << "=============================================================\n"; } std::cout << "Nb tests=" << tstnb << " nb errors_parse=" << nb_errors_parse << " nb errors_msg=" << nb_errors_msg << '\n' ; } // ---------------------------------------------------------------------------- /* TODO: For testing detection on strings with errors, we will corrupt the existing strings, * and try to decode them with one or two insertions/deletions/changes. */ static void process_file( synop * ptr_synop, const char * namin ) { std::cout << "Processing:" << namin << "\n"; ptr_synop->cleanup(); std::ifstream filin( namin ); std::string namout = namin + std::string(".out"); std::ofstream filout( namout.c_str() ); dbg_strm = &filout ; char c; int nb = 0 ; while( filin.get(c) ) { ptr_synop->add( c ); ++nb ; } ptr_synop->flush(true); filin.close(); filout.close(); std::cout << "====== " << nb << " chars =======================================================\n"; } // ---------------------------------------------------------------------------- // // These stub definitions so we do not link with too much fldigi code. // static std::ofstream g_adif_file; QsoHelper::QsoHelper(int the_mode) : qso_rec( NULL ) { } QsoHelper::~QsoHelper() { g_adif_file << "========================================\n"; } void QsoHelper::Push( ADIF_FIELD_POS pos, const std::string & value ) { #define QSO_TITLE(n) case n : g_adif_file << #n ; break ; switch(pos) { QSO_TITLE(FREQ) QSO_TITLE(CALL) QSO_TITLE(MODE) QSO_TITLE(NAME) QSO_TITLE(QSO_DATE) QSO_TITLE(QSO_DATE_OFF) QSO_TITLE(TIME_OFF) QSO_TITLE(TIME_ON) QSO_TITLE(QTH) QSO_TITLE(RST_RCVD) QSO_TITLE(RST_SENT) QSO_TITLE(STATE) QSO_TITLE(VE_PROV) QSO_TITLE(NOTES) QSO_TITLE(QSLRDATE) QSO_TITLE(QSLSDATE) QSO_TITLE(GRIDSQUARE) QSO_TITLE(BAND) QSO_TITLE(CNTY) QSO_TITLE(COUNTRY) QSO_TITLE(CQZ) QSO_TITLE(DXCC) QSO_TITLE(IOTA) QSO_TITLE(ITUZ) QSO_TITLE(CONT) QSO_TITLE(MYXCHG) QSO_TITLE(XCHG1) QSO_TITLE(SRX) QSO_TITLE(STX) QSO_TITLE(TX_PWR) QSO_TITLE(EXPORT) default: g_adif_file << pos ; } g_adif_file << ":" << value << "\n"; #undef QSO_TITLE } // ---------------------------------------------------------------------------- // Test program: Text files containing synop samples are given on the command line. // Do we run a couple of internal self-test functions ? static bool internal_test = false ; static bool kml_balloon_as_matrix = false ; // If set, the output document, instead of having Synop messages, will get only // the regular expressions names. This helps for debugging and the output // is locale-independent. static bool regex_output_only = false ; // If set, at the end of the execution, prints all the regular expression // and the number of times each of them was used. static bool display_synop_usage = false ; // Where the CSV files for Synop decoding are loaded from. static std::string data_dir = "data/"; // Where the KML files are periodically written to. static std::string kml_dir = "kml/"; // Where the KML files are loaded from at startup. static std::string load_dir ; // Contains the output of all logged nformation. static std::string dbg_file = "FlSynop.log"; // This command must be executed each time KML files are saved to disk. static std::string exec_cmd = "echo Subprocess called; date"; static const char * g_adif_name = "adif.txt"; int main(int argC, char * argV[] ) try { int option_index = 0 ; opterr = 0; for(;;) { static const char shortopts[] = "b:k:l:d:utmrvwh"; static const struct option longopts[] = { { "data_dir", required_argument, 0, 'b' }, { "kml_dir", required_argument, 0, 'k' }, { "load_dir", required_argument, 0, 'l' }, { "dbg", required_argument, 0, 'd' }, { "usage", no_argument, 0, 'u' }, { "test", no_argument, 0, 't' }, { "matrix", no_argument, 0, 'm' }, { "regex", no_argument, 0, 'r' }, { "version", no_argument, 0, 'v' }, { "help", no_argument, 0, 'h' }, { NULL, 0, 0, 0 } }; int c = getopt_long(argC, (char * const *)argV, shortopts, longopts, &option_index); switch (c) { case -1: break; case 0: // handle options with non-0 flag here if (longopts[option_index].flag != 0) continue; printf ("option %s", longopts[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); continue; case 'b': data_dir = optarg; continue; case 'k': kml_dir = optarg; continue; case 'l': load_dir = optarg; continue; case 'd': dbg_file = optarg; continue; case 't': internal_test = true ; continue ; case 'm': kml_balloon_as_matrix = true; continue; case 'r': regex_output_only = true ; continue ; case 'u': display_synop_usage = true ; continue ; case 'v': std::cout << "version 1.0\n"; exit(EXIT_SUCCESS); case ':': default: std::cerr << "Unrecognized option\n"; exit(EXIT_FAILURE); case 'h': case '?': std::cout << "Valid options are:\n" ; for( size_t i = 0; longopts[i].name != NULL; ++i ) { std::cout << " " << longopts[i].name << "\n" ; } exit(EXIT_SUCCESS); } break; } g_adif_file.open( g_adif_name, std::ios_base::out ); /// Where the warning, informational and error messages are written. // debug::start(dbg_file.c_str()); /// Just for testing the loading. We load from one dir and save in another. if( ! load_dir.empty() ) { std::cout << "Loading from " << load_dir << "\n"; KmlServer::GetInstance()->InitParams( exec_cmd, load_dir ); } KmlServer::GetInstance()->InitParams( exec_cmd, kml_dir, 10000, 0, 120, kml_balloon_as_matrix ); if( ! load_dir.empty() ) { std::cout << "Loading tested: Destination=" << kml_dir << "\n"; exit(0); } // Must be done before any use of WMO stations data. // http://weather.noaa.gov/data/nsd_bbsss.txt std::cout << "Opening:" << data_dir << "\n"; if( ! SynopDB::Init(data_dir) ) { std::cerr << "Error opening:" << data_dir << ":" << strerror(errno) << "\n"; exit(EXIT_FAILURE); } // Serializer::SetSrl( & fldigiSerial ); if( internal_test ) { test_coordinates(); test_wmo(); test_buoy(); test_ship(); test_jcomm(); } synop::setup(); synop * ptr_synop = synop::instance(); if( internal_test ) { KmlServer::GetInstance()->Reset(); synop::SetTestMode(false); tstone( ptr_synop, tests_arr_full, nb_tests_full ); synop::SetTestMode(true); tstone( ptr_synop, tests_arr, nb_tests ); KmlServer::GetInstance()->Reset(); } synop::SetTestMode(regex_output_only); while (optind < argC) process_file( ptr_synop, argV[optind++] ); if( display_synop_usage ) { synop::regex_usage(); } KmlServer::Exit(); g_adif_file.close(); // std::cin.get(); return 0 ; } catch( const std::exception & exc ) { std::cout << "Exception:" << exc.what() << '\n'; exit(EXIT_FAILURE); } // ---------------------------------------------------------------------------- fldigi-3.21.80/src/synop-src/synop.cxx0000664000175000017500000063034012313064025014470 00000000000000// ---------------------------------------------------------------------------- // synop.cxx -- SYNOP decoding // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "re.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "synop.h" #include "kmlserver.h" #include "configuration.h" #include "fl_digi.h" #include "gettext.h" #include "debug.h" #include "field_def.h" #include "record_loader.h" #include "coordinate.h" #include "strutil.h" #include "FL/fl_ask.H" // ---------------------------------------------------------------------------- // RTTY is 850 Hz shift, 75 baud, ITA2 Baudot code. // 3231.0 KAWN RTTY (Tune in LSB) // 7784.0 KAWN RTTY // 11120.0 KAWN RTTY (Tune in LSB) // 13530.0 KAWN RTTY // 19324.5 KAWN RTTY // 19530.0 KAWN RTTY (Usually "fox" marker) // ---------------------------------------------------------------------------- /// Writes a string range to the current print callback. static void disp_range( std::string::const_iterator b, std::string::const_iterator e, bool bold = false) { const char * first = &( *b ); const char * last = &( *e ); assert( first <= last ); size_t nb = last - first ; synop::ptr_callback->print( first, nb, bold ); }; // ---------------------------------------------------------------------------- /// Builds a time with Synop messages which just have event's day/hour/min. static time_t DayHourMin2Tm( int day, int hour, int min ) { // TODO: Check that time() is UTC too. time_t tmpTime = time(NULL); tm aTm = *gmtime(&tmpTime); // Maybe observation from previous month. if( day > aTm.tm_mday ) { aTm.tm_mon-- ; if( aTm.tm_mon < 0 ) { aTm.tm_mon = 11 ; aTm.tm_year-- ; } } aTm.tm_mday = day ; aTm.tm_hour = hour ; aTm.tm_min = min ; time_t my_time = mktime( & aTm ); if( my_time <= 0 ) throw std::runtime_error("Invalid time"); return my_time ; } /// Absolute time difference in number of days. static int diffTm( time_t tim1, time_t tim2 ) { if( (tim1 <= 0 ) || (tim2 <= 0 ) ) throw std::runtime_error("Invalid times"); double nbSecs = difftime( tim1, tim2 ); return abs( 0.5 + nbSecs * ( 1.0 / ( 24 * 3600 ) ) ); } /// We could use any other time as long as it is clear. static std::string Tm2SynopTime( time_t tim ) { return KmlServer::Tm2Time( tim ); } // ---------------------------------------------------------------------------- /// Base class for displaying the key-value pairs read from Synop broadcast. class Serializer { /// It returns the previous value which can therefore be restored. Serializer * m_prevSerial ; /// This happens when switching temporarily to this serializer. static Serializer * m_srl ; public: /// It registers itself as a serializer. Serializer() { m_prevSerial = m_srl ; m_srl = this ; } /// It restores the previous serializer. virtual ~Serializer() { m_srl = m_prevSerial ; } virtual void StartSection( const std::string & section_name ) = 0 ; virtual void AddItem( const char * key, const char * value, const char * unit ) = 0; static Serializer * Instance(void) { if( m_srl == NULL ) throw std::runtime_error("Null m_srl"); return m_srl; } }; // Current serializer, that is, the object which prints Synop attributes. Serializer * Serializer::m_srl = NULL; // ---------------------------------------------------------------------------- static const char * Unit_hPa = "hPa"; static const char * Unit_degrees = "degrees"; static const char * Unit_hours = "hours"; static const char * Unit_minutes = "mn"; static const char * Unit_seconds = "seconds"; static const char * Unit_Celsius = "°C"; static const char * Unit_knots = "knots"; static const char * Unit_feet = "feet"; static const char * Unit_km = "km"; static const char * Unit_meters = "meters"; static const char * Unit_centimeters = "cm"; static const char * Unit_mm = "mm"; static const char * Unit_meters_second = "m/s"; // ---------------------------------------------------------------------------- /// Compile-time number of elements of a static array. #ifndef G_N_ELEMENTS #define G_N_ELEMENTS(arr) ((sizeof(arr))/(sizeof(arr[0]))) #endif /// For documentation only. Tells the WMO code table of an information. #define FM12CodeTable( arr, num, txt ) // ---------------------------------------------------------------------------- /// Used to select from lookup tables. template< class Key > struct choice { const Key m_key; const char * m_val; }; // Simple lookup. template< class Key, class Dflt > const char * choice_map( const choice< Key > * choices, size_t nb_choices, const Key & key, const Dflt & dflt ) { for( ; nb_choices; --nb_choices, ++choices ) { if( key == choices->m_key ) return choices->m_val ; } return dflt ; } // ---------------------------------------------------------------------------- // There are about 11000 records, so memory usage is an issue. class RecordWmoStation { /// Block Number :2 digits representing the WMO-assigned block. int m_block ; /// Station Number :3 digits representing the WMO-assigned station. int m_station ; /// ICAO Location Indicator :4 alphanumeric characters, /// not all stations in this file have an assigned location indicator. /// The value "----" is used for stations that do not have an assigned location indicator. char m_icao_indicator[5]; // TODO: Not used at the moment. /// Place Name :Common name of station location. std::string m_name ; // State :2 character abbreviation (included for stations located in the United States only). // Country Name :Country name is ISO short English form. // TODO: Consider replacing it with an ISO integer key. std::string m_country; // WMO Region :digits 1 through 6 representing the corresponding WMO region, 7 stands for the WMO Antarctic region. // Station Latitude or Latitude :DD-MM-SSH where DD is degrees, MM is minutes, SS is seconds // and H is N for northern hemisphere or S for southern hemisphere or // E for eastern hemisphere or W for western hemisphere. // The seconds value is omitted for those stations where the seconds value is unknown. CoordinateT::Pair m_station_coordinates ; /// Upper Air Latitude :DD-MM-SSH. /// Station Elevation (Ha) :The station elevation in meters. Value is omitted if unknown. int m_station_elevation ; /// Upper Air Elevation (Hp) :The upper air elevation in meters. Value is omitted if unknown. /// RBSN indicator :P if station is defined by the WMO as belonging to the Regional Basic Synoptic Network, omitted otherwise. /// Delimiter between values in a record. static const char m_delim = ';'; public: /// More information here: http://weather.noaa.gov/tg/site.shtml RecordWmoStation() : m_block(0) , m_station(0) {} int wmo_indicator() const { return m_block * 1000 + m_station; } const CoordinateT::Pair & station_coordinates() const { return m_station_coordinates; } int station_elevation(void) const { return m_station_elevation; } const std::string & country() const { return m_country; } /// This garantees an unique name. const std::string & station_name() const { return m_name; } void rename_station( const std::string & nam ) { // LOG_INFO("Renaming %s to %s", m_name.c_str(), nam.c_str() ); m_name = nam; } // http://weather.noaa.gov/data/nsd_bbsss.txt // 01;023;ENDU;Bardufoss;;Norway;6;69-04N;018-32E;;;7;79;P // Wrong record: // 71;113;CWZA;Agassiz Automated Reporting Station ;;Canada;;49-15N;121-46W;;;15;; friend std::istream & operator>>( std::istream & istrm, RecordWmoStation & rec ) { if( read_until_delim( m_delim, istrm, rec.m_block ) && read_until_delim( m_delim, istrm, rec.m_station ) && read_until_delim( m_delim, istrm, rec.m_icao_indicator ) && read_until_delim( m_delim, istrm, rec.m_name ) && read_until_delim( m_delim, istrm /* State */ ) && read_until_delim( m_delim, istrm, rec.m_country ) && read_until_delim( m_delim, istrm /* WMO region */ ) && read_until_delim( m_delim, istrm, rec.m_station_coordinates.latitude() ) && read_until_delim( m_delim, istrm, rec.m_station_coordinates.longitude() ) && read_until_delim( m_delim, istrm /* Upper air latitude */ ) && read_until_delim( m_delim, istrm /* Upper air longitude */ ) && read_until_delim( m_delim, istrm, rec.m_station_elevation, 0 ) && read_until_delim( m_delim, istrm /* Upper air elevation */ ) && read_until_delim( m_delim, istrm /* Rsbn indicator */ ) && ( rec.m_station_coordinates.latitude().is_lon() == false ) && ( rec.m_station_coordinates.longitude().is_lon() == true ) ) { strtrim( rec.m_name ); return istrm ; } istrm.setstate(std::ios::badbit); return istrm ; } friend std::ostream & operator<< ( std::ostream & ostrm, const RecordWmoStation & rec ) { ostrm << rec.m_name ; return ostrm; } }; // RecordWmoStation // ---------------------------------------------------------------------------- // srst2;29.683 N;94.033 W;0.7;Sabine Pass, TX;NDBC;NDBC Meteorological/Ocean;fixed // ssbn7;33.842 N;78.476 W;;Sunset Beach Nearshore Waves;CORMP;IOOS Partners;other // Adapted from http://www.ndbc.noaa.gov/ndbcmapstations.json // ftp://tgftp.nws.noaa.gov/data/observations/marine/stations/station_table.txt // # STATION_ID | OWNER | TTYPE | HULL | NAME | PAYLOAD | LOCATION | TIMEZONE | FORECAST | NOTE // # // 0y2w3|CG|Weather Station||Sturgeon Bay CG Station, WS||44.794 N 87.313 W (44°47'40" N 87°18'47" W)|C| | // 13001|PR|Atlas Buoy|PM-595|NE Extension||12.000 N 23.000 W (12°0'0" N 23°0'0" W)|| | /// This allows to find a buoy characteristics. class RecordBuoy { std::string m_id ; std::string m_owner ; /// "UW" : University of Washington etc... std::string m_type ; /// "Offshore Buoy", "6-meter NOMAD buoy" etc... std::string m_hull; /// "PM-599", "3D37" std::string m_name ; /// "Ecuador INOCAR", "150 NM East of Cape HATTERAS" std::string m_payload; /// "AMPS payload" CoordinateT::Pair m_location ; /// "32.501 N 79.099 W (32°30'2" N 79°5'58" W)" std::string m_timezone ; /// "E" std::string m_forecast; /// "FZUS52.KCHS FZNT22.KWBC" std::string m_note; /// "This buoy was removed ..." /// From the CVS file. static const char m_delim = '|'; public: /// Unique identifier in a catalog. const std::string & id() const { return m_id; } const CoordinateT::Pair & station_coordinates() const { return m_location; } /// The name coming from the file might not be unique. const std::string & buoy_name(void) const { return m_name;} /// Needed because buoy names are not unique void rename_buoy( const std::string & new_buoy_name ) { m_name = new_buoy_name ; } const std::string & owner(void) const { return m_owner;} const std::string & payload(void) const { return m_payload;} const std::string & note(void) const { return m_note;} /// TODO: Speedup by doing that once only. std::string title(void) const { std::string title = m_type ; if( ! m_name.empty() ) title += ":" + m_name ; if( ! m_payload.empty() ) title += ":" + m_payload ; if( ! m_owner.empty() ) title += ":" + m_owner ; return title ; } /// fixed, other, dart, buoy, oilrig, tao const std::string & type(void) const { return m_type;} friend std::istream & operator>>( std::istream & istrm, RecordBuoy & rec ) { if( read_until_delim( m_delim, istrm, rec.m_id ) && read_until_delim( m_delim, istrm, rec.m_owner ) && read_until_delim( m_delim, istrm, rec.m_type ) && read_until_delim( m_delim, istrm, rec.m_hull ) && read_until_delim( m_delim, istrm, rec.m_name ) && read_until_delim( m_delim, istrm, rec.m_payload ) && read_until_delim( m_delim, istrm, rec.m_location ) && read_until_delim( m_delim, istrm, rec.m_timezone ) && read_until_delim( m_delim, istrm, rec.m_forecast ) && read_until_delim( m_delim, istrm, rec.m_note ) ) { // std::cout << "id=" << rec.m_id << " name=" << rec.m_name << "\n"; return istrm ; } istrm.setstate(std::ios::badbit); return istrm ; } }; // RecordBuoy // ---------------------------------------------------------------------------- // http://www.metoffice.gov.uk/media/csv/e/7/ToR-Stats-SHIP.csv // June 2012,,,,,,,, // CTRY,CALLSIGN,NAME,Observations,N<30,N<60,N<120,N>360,Average (R-O) (mins) // , B2M1297, ,1,1,1,1,0,30 // , B2M1303, ,17,16,17,17,0,17.9 // , BATEU00, ,366,366,366,366,0,5 class RecordShip { std::string m_callsign; std::string m_country; std::string m_name ; static const char m_delim = ','; public: const std::string & callsign(void) const { return m_callsign; } const std::string & country(void) const { return m_country; } const std::string & name(void) const { return m_name; } friend std::istream & operator>>( std::istream & istrm, RecordShip & rec ) { if( read_until_delim( m_delim, istrm, rec.m_country ) && read_until_delim( m_delim, istrm, rec.m_callsign ) && read_until_delim( m_delim, istrm, rec.m_name ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) ) { strtrim( rec.m_country ); strtrim( rec.m_callsign ); strtrim( rec.m_name ); // std::cout << "id=" << rec.m_callsign << " name=" << rec.m_name << "\n"; strcapitalize( rec.m_name ); // std::cout << "id=" << rec.m_callsign << " name=" << rec.m_name << "\n"; return istrm ; } istrm.setstate(std::ios::badbit); return istrm ; } }; // RecordShip // ---------------------------------------------------------------------------- /** Huge file, but contains many information. There are many duplicates for each WMO indicator, it does not matter for us. ftp://ftp.jcommops.org/JCOMMOPS/GTS/wmo/wmo_list.txt GTS stands for Global Telecommunications System JCOMMOPS WMO-PLATFORM cross reference list as of 2012-09-08 for WMO number still allocated in the last 6 months (with WMO Ids that are numerical) WMO;TELECOM ID;TELECOM SYSTEM;PTFM NAME;PTFM FAMILY;PTFM TYPE;CONTACT NAME;EMAIL;PROGRAM;ROLE;AGENCY;COUNTRY;ALLOC_DATE;DEALLOC_DATE;ARGOS_PROG 10044;BSH:10044;METEOSAT;MB:10044;FIXED;METSTATION;;;GERMANY MB;Program Manager;KIEL UNIVERSITY;DEU;2001-01-01;3000-01-01; 10044;BSH:10044;METEOSAT;MB:10044;FIXED;METSTATION;;;GERMANY MB;Programme GTS Coordinator;KIEL UNIVERSITY;DEU;2001-01-01;3000-01-01; 11908;88671;ARGOS;ARGOS:88671;DB;SVPBD2;;;AOML-GDP;Programme GTS Coordinator;NOAA/AOML;USA;2011-07-19;3000-01-01; Apparently, special codes here: http://www.meds-sdmm.dfo-mpo.gc.ca/isdm-gdsi/international-internationale/j-comm/CODES/wmotable_e.htm */ /// JComm stands for Joint Commission on Oceanography and Marine Meteorology (J-COMM) class RecordJComm { std::string m_wmo ; // TODO: This could be an integer. std::string m_telecom_system ; std::string m_ptfm_name ; std::string m_ptfm_family ; std::string m_ptfm_type ; std::string m_program ; std::string m_agency ; std::string m_country ; static const char m_delim = ';'; public: /// TODO: This could be an integer. const std::string & wmo() const { return m_wmo; } const std::string & telecom_system() const { return m_telecom_system; } const std::string & ptfm_name() const { return m_ptfm_name; } const std::string & ptfm_family() const { return m_ptfm_family; } const std::string & ptfm_type() const { return m_ptfm_type; } const std::string & program() const { return m_program; } const std::string & agency() const { return m_agency; } const std::string & country() const { return m_country; } friend std::istream & operator>>( std::istream & istrm, RecordJComm & rec ) { if( read_until_delim( m_delim, istrm, rec.m_wmo ) && read_until_delim( m_delim, istrm /* Telecom Id */ ) && read_until_delim( m_delim, istrm, rec.m_telecom_system ) && read_until_delim( m_delim, istrm, rec.m_ptfm_name ) && read_until_delim( m_delim, istrm, rec.m_ptfm_family ) && read_until_delim( m_delim, istrm, rec.m_ptfm_type ) && read_until_delim( m_delim, istrm /* Contact Name */ ) && read_until_delim( m_delim, istrm /* Email */ ) && read_until_delim( m_delim, istrm, rec.m_program ) && read_until_delim( m_delim, istrm /* Role */ ) && read_until_delim( m_delim, istrm, rec.m_agency ) && read_until_delim( m_delim, istrm, rec.m_country ) && read_until_delim( m_delim, istrm /* Alloc Date */ ) && read_until_delim( m_delim, istrm /* Dealloc Date */ ) && read_until_delim( m_delim, istrm /* Argos Prog */ ) ) { return istrm ; } istrm.setstate(std::ios::badbit); return istrm ; } // Unfortunately the physical type of the station is embedded in the ptfm_name. // So we rearrange data, to have a decent icon name. Handles cases such as: // 42365;Ursa809;IRIDIUM;PLATFORM:42365;FIXED;FIXED // 62130;IRID:62130;IRIDIUM;OILPLAT:62130;MB;MB; // Very rough solution, quite OK for the moment. void SetJCommFields( std::string & kmlNam, std::string & iconNam ) const { if( ( strstr( m_ptfm_name.c_str(), "PLATFORM" ) ) || ( strstr( m_ptfm_name.c_str(), "OILPLAT" ) ) ) { kmlNam = agency() + ":(" + m_wmo + ")"; iconNam = "Oil Platform"; } else if( ( strstr( m_ptfm_name.c_str(), "BUOY" ) ) ) { kmlNam = agency() + ":(" + m_wmo + ")"; iconNam = "Buoy"; } else { kmlNam = ptfm_name() + "," + agency(); iconNam = telecom_system(); } strcapitalize(kmlNam); } }; // RecordJComm // ---------------------------------------------------------------------------- /// This wraps a record type and allows to load a cvs file and access it using a key. template< class Key, class Record, Key (Record::*Method)(void) const, class Terminal > class Catalog : public RecordLoader< Terminal > { /// The keying method might return a reference instead of a value. template< class Type > struct deref { typedef Type type ; }; template< class Type > struct deref< Type & > { typedef Type type ; }; /// If the return value of the indexing function is for example a reference /// to a const string, then KeyType is a string. template< class Type > struct deref< const Type & > { typedef Type type ; }; protected: typedef typename deref< Key >::type KeyType ; typedef std::map< KeyType, Record > CatalogType ; typedef typename CatalogType::iterator IteratorType ; CatalogType m_catalog ; bool FillAndTest() { int nbRec = this->LoadAndRegister(); if( nbRec < 0 ) { return false ; } else { LOG_INFO("record=%s nb_recs=%d", typeid(Record).name(), nbRec ); return true ; } } public: void Clear() { m_catalog.clear(); } bool ReadRecord( std::istream & istrm ) { Record tmp ; istrm >> tmp ; if( istrm || istrm.eof() ) { m_catalog[ (tmp.*Method)() ] = tmp ; return true ; } return false; } /// Returns a station with wmo_indicator to zero if cannot find the right one. static const Record * FindFromKey( Key key ) { CatalogType & refCat = RecordLoader< Terminal >::InstCatalog().m_catalog; typename CatalogType::const_iterator it = refCat.find( key ); return ( it == refCat.end() ) ? NULL : &it->second ; } bool Fill() { return FillAndTest(); } }; // Catalog // ---------------------------------------------------------------------------- /// This contains all WMO stations records read from the file. class CatalogWmoStations : public Catalog< int, RecordWmoStation, &RecordWmoStation::wmo_indicator, CatalogWmoStations > { public: // After data loading, there is an extra step to ensure that names are unique. // 85;196;SLCP;Concepcion;;Bolivia;3;16-09S;062-01W;;;497;; // 85;682;SCIE;Concepcion;;Chile;3;36-46S;073-03W;;;12;;P // 86;134;SGCO;Concepcion;;Paraguay;3;23-25S;057-18W;;;74;74; bool Fill() { if( ! FillAndTest() ) return false ; typedef std::multimap< std::string, IteratorType > HashT ; HashT allNames ; // First take the names // LOG_INFO("Eliminating duplicates out of %d elements",m_catalog.size()); for( IteratorType it = m_catalog.begin(), en = m_catalog.end(); it != en; ++it ) { RecordWmoStation & refWmo = it->second ; allNames.insert( allNames.end(), HashT::value_type( refWmo.station_name(), it ) ); } size_t nbDupl = 0 ; // Iterates on all names, take only the duplicates. for( HashT::iterator itH = allNames.begin(), itNextH = itH, enH = allNames.end(); itH != enH; itH = itNextH ) { // LOG_INFO("Name=%s", itH->first.c_str() ); size_t nbKeys = 1 ; for(;;) { ++itNextH; if( itNextH == enH ) break ; if( itNextH->first != itH->first ) break ; ++nbKeys; } // LOG_INFO("Name=%s nb=%d", itH->first.c_str(), nbKeys ); // If no duplicates, then try next one. if( nbKeys == 1 ) continue ; ++nbDupl ; // LOG_INFO("%d: Name %s %d occurrences", nbDupl, itH->first.c_str(), nbKeys ); // There should not be many elements, two or three duplicates, maximum five apparently. typedef std::set< std::string > DiffNamesT ; DiffNamesT differentNames ; // Check that all countries are different. for( HashT::iterator itSubH = itH; itSubH != itNextH; ++itSubH ) { RecordWmoStation & refWmo = itSubH->second->second ; // LOG_INFO("Trying %s", refWmo.station_name().c_str() ); // Appends the country. refWmo.rename_station( refWmo.station_name() + "," + refWmo.country() ); std::pair< DiffNamesT::iterator, bool > tmpPair = differentNames.insert( refWmo.station_name() ); if( tmpPair.second ) continue ; // Appends the WMO refWmo.rename_station( strformat( "%s,%05d", refWmo.station_name().c_str(), refWmo.wmo_indicator() ) ); tmpPair = differentNames.insert( refWmo.station_name() ); if( tmpPair.second ) continue ; LOG_ERROR("This should never happen because WMO indicator is unique"); return false ; } } if(nbDupl) { LOG_INFO("Eliminated %d duplicates out of %d elements", (int)nbDupl, (int)m_catalog.size()); } return true ; } /// A static file with the same name is also installed in directory data. const char * Url(void) const { return "http://weather.noaa.gov/data/nsd_bbsss.txt"; } const char * Description() const { return _("WMO stations"); } }; // CatalogWmoStations // ---------------------------------------------------------------------------- /// This contains all WMO stations records read from the file. /// Derived class necessary because names are not unique and must be revised. class CatalogBuoy : public Catalog< const std::string &, RecordBuoy, &RecordBuoy::id, CatalogBuoy > { public: /// After data loading, there is an extra step to ensure that names are unique. bool Fill() { if( ! FillAndTest() ) return false ; typedef std::multimap< std::string, IteratorType > HashT ; HashT allNames ; // LOG_INFO("Eliminating duplicates out of %d elements",m_catalog.size()); /// First take the names for( IteratorType it = m_catalog.begin(), en = m_catalog.end(); it != en; ++it ) { RecordBuoy & refWmo = it->second ; allNames.insert( allNames.end(), HashT::value_type( refWmo.buoy_name(), it ) ); } size_t nbDupl = 0 ; /// Iterates on all names, take only the duplicates. for( HashT::iterator itH = allNames.begin(), itNextH = itH, enH = allNames.end(); itH != enH; itH = itNextH ) { // LOG_INFO("Name=%s", itH->first.c_str() ); size_t nbKeys = 1 ; for(;;) { ++itNextH; if( itNextH == enH ) break ; if( itNextH->first != itH->first ) break ; ++nbKeys; } // LOG_INFO("Name=%s nb=%d", itH->first.c_str(), nbKeys ); // If no duplicates, then try next one. if( nbKeys == 1 ) continue ; ++nbDupl ; // LOG_INFO("%d: Buoy name %s %d occurrences", nbDupl, itH->first.c_str(), nbKeys ); // There should not be many elements, two or three duplicates, maximum five apparently. typedef std::set< std::string > DiffNamesT ; DiffNamesT differentNames ; // Check that all countries are different. for( HashT::iterator itSubH = itH; itSubH != itNextH; ++itSubH ) { RecordBuoy & refBuoy = itSubH->second->second ; // Appends the id if( refBuoy.buoy_name().empty() ) refBuoy.rename_buoy( refBuoy.id().c_str() ); else refBuoy.rename_buoy( strformat( "%s-%s", refBuoy.buoy_name().c_str(), refBuoy.id().c_str() ) ); std::pair< DiffNamesT::iterator, bool > tmpPair = differentNames.insert( refBuoy.buoy_name() ); // LOG_INFO("Buoy set to %s", refBuoy.buoy_name().c_str() ); if( tmpPair.second ) continue ; LOG_ERROR("This should never happen because buoy id is unique"); return false ; } } if(nbDupl) { LOG_INFO("Eliminated %d duplicates out of %d elements", (int)nbDupl, (int)m_catalog.size()); } return true ; } /// A static file with the same name is also installed in directory data. const char * Url(void) const { return "ftp://tgftp.nws.noaa.gov/data/observations/marine/stations/station_table.txt"; } const char * Description() const { return _("Weather buoys"); } }; // CatalogBuoy // ---------------------------------------------------------------------------- /// Known list of VOS weather ships, Volunteer Observing Ships. struct CatalogShip : public Catalog< const std::string &, RecordShip, &RecordShip::callsign, CatalogShip > { /// A static file with the same name is also installed in directory data. const char * Url(void) const { return "http://www.metoffice.gov.uk/media/csv/e/7/ToR-Stats-SHIP.csv"; } const char * Description() const { return _("Weather ships"); } }; /// Another public-domain file, returns information given a WMO-like key. struct CatalogJComm : public Catalog< const std::string &, RecordJComm, &RecordJComm::wmo, CatalogJComm > { /// A static file with the same name is also installed in directory data. const char * Url(void) const { return "ftp://ftp.jcommops.org/JCOMMOPS/GTS/wmo/wmo_list.txt"; } const char * Description() const { return _("Argos & Iridium"); } }; // ---------------------------------------------------------------------------- // Returns true if properly initialised. // TODO: Have all the derived class link to the base class so the initialisation // can be done without having to enumerate the sub-classes. bool SynopDB::Init( const std::string & data_dir ) { try { return CatalogWmoStations::InstCatalog().Fill() && CatalogBuoy::InstCatalog().Fill () && CatalogShip::InstCatalog().Fill () && CatalogJComm::InstCatalog().Fill (); } catch( const std::exception & exc ) { fl_alert("Could not load SYNOP data files: Exception=%s", exc.what() ); return false ; } return true; } /// For testing purpose only in stand-alone program flsynop. const std::string & SynopDB::IndicatorToName( int wmo_indicator ) { const RecordWmoStation * ptrWmo = CatalogWmoStations::FindFromKey( wmo_indicator ); static const std::string empty_str ; return ( ptrWmo == NULL ) ? empty_str : ptrWmo->station_name(); } /// For testing purpose only in stand-alone program flsynop. const std::string SynopDB::IndicatorToCoordinates( int wmo_indicator ) { const RecordWmoStation * ptrWmo = CatalogWmoStations::FindFromKey( wmo_indicator ); if ( ptrWmo == NULL ) return "No coordinates"; std::stringstream strm ; strm << ptrWmo->station_coordinates() << " " ; strm << ptrWmo->station_coordinates().longitude().angle() << " " ; strm << ptrWmo->station_coordinates().latitude().angle() << " " ; return strm.str(); } /// For testing purpose only in stand-alone program flsynop. const std::string & SynopDB::BuoyToName( const char * buoy_id ) { const RecordBuoy * ptrBuoy = CatalogBuoy::FindFromKey( buoy_id ); static const std::string empty_str ; return ( ptrBuoy == NULL ) ? empty_str : ptrBuoy->buoy_name(); } /// For testing purpose only in stand-alone program flsynop. const std::string & SynopDB::ShipToName( const char * ship_id ) { const RecordShip * ptrShip = CatalogShip::FindFromKey( ship_id ); static const std::string empty_str ; return ( ptrShip == NULL ) ? empty_str : ptrShip->name(); } /// For testing purpose only in stand-alone program flsynop. const std::string & SynopDB::JCommToName( const char * wmo ) { const RecordJComm * ptrJComm = CatalogJComm::FindFromKey( wmo ); static const std::string empty_str ; return ( ptrJComm == NULL ) ? empty_str : ptrJComm->ptfm_name(); } // ---------------------------------------------------------------------------- /// Intrusive reference counter associated with RefCntPtr. template class WithRefCnt { size_t m_ref_cnt ; public: WithRefCnt() : m_ref_cnt(0) {}; template friend class RefCntPtr; }; /// Intrusive smart pointer with reference counting. template< class Obj > class RefCntPtr { /// This must derive from the class WithRefCnt. Obj * m_ptr ; public: RefCntPtr() : m_ptr(NULL) {} /// The reference counter is incremented. RefCntPtr( Obj * ptr ) : m_ptr(ptr) { if( ptr ) ++ptr->m_ref_cnt ; } /// Deletes the pointed object if reference count reaches zero. ~RefCntPtr() { if( m_ptr ) { --m_ptr->m_ref_cnt ; if( m_ptr->m_ref_cnt == 0 ) delete m_ptr ; } } /// The reference counter is incremented. RefCntPtr( const RefCntPtr & ptr ) : m_ptr( ptr.m_ptr ) { if( m_ptr ) ++m_ptr->m_ref_cnt ; } /// The reference counter is incremented. RefCntPtr & operator=( const RefCntPtr & ptr ) { if( this != &ptr ) { m_ptr = ptr.m_ptr ; if( m_ptr ) ++m_ptr->m_ref_cnt ; } return *this; } const Obj * operator->() const { return m_ptr;} Obj * operator->() { return m_ptr;} operator bool() const { return m_ptr; } }; // ---------------------------------------------------------------------------- /// Synop section number. enum section_t { SECTION_ZCZC_DLM=0, SECTION_HEAD_GRP, SECTION_IDENTLOC, // 000 SECTION_LAND_OBS, // 111 SECTION_SEA_SURF, // 222 SECTION_CLIM_DAT, // 333 SECTION_NATCLOUD, // 444 SECTION_NAT_CODE, // 555 SECTION_AUTO_DAT, SECTION_NNNN_DLM, SECTION_SECT_NBR }; static const char * SectionToString( section_t group_number ) { switch(group_number) { case SECTION_ZCZC_DLM : return _("Bulletin start"); case SECTION_HEAD_GRP : return _("Header"); case SECTION_IDENTLOC : return _("Identification and location"); case SECTION_LAND_OBS : return _("Land observations"); case SECTION_SEA_SURF : return _("Sea surface observations"); case SECTION_CLIM_DAT : return _("Climatological data"); case SECTION_NATCLOUD : return _("National data, clouds"); case SECTION_NAT_CODE : return _("National data"); case SECTION_AUTO_DAT : return _("Automatisch erzeugte Daten"); case SECTION_NNNN_DLM : return _("Bulletin end"); default : return _("Unknown Synop group"); } } /// [nextSec][predSec] : Indicates that section Next can be preceded by section Pred. static const char sectionTransitions[SECTION_SECT_NBR][SECTION_SECT_NBR] = { // ZCZC_DLM HEAD_GRP IDENTLOC LAND_OBS SEA_SURF CLIM_DAT NATCLOUD NAT_CODE AUTO_DAT NNNN_DLM { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // ZCZC_DLM { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // HEAD_GRP { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, // IDENTLOC { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, // LAND_OBS { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // SEA_SURF { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // CLIM_DAT { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0 }, // NATCLOUD { 0, 0, 0, 1, 1, 1, 1, 0, 0, 0 }, // NAT_CODE { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0 }, // AUTO_DAT { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } // NNNN_DLM }; // ---------------------------------------------------------------------------- /// Priority helps to classify regular expressions matching the same work. typedef double priority_t ; /// Minimum priorities sum to be accepted as a valid chain of tokens. static const priority_t MIN_PRIO = 2.0 ; /// This models a Synop token, that is, a group of (Most of time) five digits. class TokenProxy : public std::string, public WithRefCnt< TokenProxy > { public: typedef RefCntPtr< TokenProxy > Ptr ; /// List of pointers to TokenProxy, each of them associated to a token and its regex. class TokVec : public std::vector< Ptr > , public WithRefCnt< TokVec > { TokVec( const TokVec & ); TokVec & operator=(const TokVec &); /// For debugging, writes the regular expression. void DumpTotal(section_t group_number, bool kml_mode) const { // This information is not needed at the moment, // but it is not possible to discard it if the section is empty, because // we do not know that yet. Serializer * ptrSerial = Serializer::Instance(); if(kml_mode) { ptrSerial->StartSection( SectionToString(group_number) ); } for( size_t i = 0; i < size(); ++ i ) { TokenProxy & prox = *const_cast< TokenProxy *>( at(i).operator->() ); /// If set, this adds in the output which regular expression was detected. static const bool addRegexToOutput = false ; if( addRegexToOutput && ! kml_mode ) { ptrSerial->AddItem( "Regex", prox.RegexName(), prox.c_str() ); } if(kml_mode) { prox.DrawKml(); } else { prox.Print(); } } } public: typedef RefCntPtr< TokVec > Ptr ; private: /// Chains (sections) are linked so that any section can search the previous ones. TokVec::Ptr m_previous_container ; public: TokVec() {}; /// Used to find a preceding token containing a specific information in a previous tokens chain. TokVec::Ptr previous() const { return m_previous_container; } void previous(TokVec::Ptr prev) { m_previous_container = prev; } /// Debugging purpose: It outputs the concatenation of all regular expressions names. std::string MiniDump(section_t group_number,bool disp_all = false) const { std::stringstream strm ; for( size_t i = 0; i < size(); ++ i ) { TokenProxy & prox = *const_cast< TokenProxy *>( at(i).operator->() ); strm << prox.RegexName() ; if( disp_all ) { strm << "#" << static_cast(prox); } strm << '+'; } return strm.str(); } void DumpTokVec(bool test_mode, section_t group_number, bool kml_mode) const { if( test_mode ) { // Just displays the regular expression name, for debugging. std::string str( MiniDump(group_number) ); disp_range( str.begin(), str.end() ); } else { DumpTotal(group_number, kml_mode); } } }; private: /// The index of the regular expression that this token uses. int m_regex_idx; /// Pointer to the chain of TokenProxy. TokVec::Ptr m_container ; /// Offset in the input buffer which indicates the end of what is parsed. size_t m_offset_end ; virtual bool Parse( const char * str ) = 0 ; /* TODO: Output style. 10035 [Germany, 54ø32'N 009ø33'E SCHLESWIG] 11575 [manned] [cloud height:600-1000m] [visibility:25km] 42905 [cloud cover:4/8] [wind dir:290 deg, speed:5] 10066 [air temp:+6.6] 21022 [dew-point temp:-2.2] 30131 [pressure at station level:1013.1hPa] 40190 [pressure at sea level:1019.0hPa] 53014 [pressure:increasing rapidly] [change in 3h:1.4hPa] 69922 [precipitation:0.2mm during last 12 hours] 70181 [past wx: shower(s), cloud cover 1/2 of sky] [wx now: Clouds generally dissolving or becoming less developed] 84801 [cloud info] 333 [section 3] 10094 [maximum temp:+9.4] 20029 [minimum temp:+2.9] 55307 81823 [clouds:1/8 or less, cumulus, 690m] 83633 [clouds:3/8, stratocumulus, 990m] The method Append() will print the five-digits group. Later on, duplicate and consecutive groups will be suppressed. */ void ItemAdd( const char * key, const char * value, const char * unit ) const { Serializer::Instance()->AddItem( key, value, unit ); } virtual void Print() const = 0 ; virtual void DrawKml() const { Print() ; } TokenProxy & operator=(const TokenProxy & ); protected: void disp_arr(const char ** array,size_t arrsz,int idx,int offset,const char * title) const { /// It is a Synop convention that slashes mean no information. if( idx == '/' ) return ; size_t idx_array = idx - offset; char buffer[64]; const char * val; if( idx_array < arrsz ) val = array[idx_array]; else { sprintf( buffer, _("Unknown index %d/%d/%d"), (int)idx, (int)idx_array, (int)arrsz ); val = buffer ; } Append( title, val ); } TokenProxy() : m_regex_idx(-1), m_offset_end(0) {} public: virtual ~TokenProxy() {} /// The boolean flag allows to search only in the current chain but also /// in the previous ones backward. This could be faster by restricting /// only to given section numbers. template< class TokenDerived > const TokenDerived * get_ptr(bool previous_chains) const ; template< class TokenDerived > static Ptr Generator( int rgx_idx, const std::string & wrd, size_t off ) { TokenProxy * ptr = new TokenDerived ; ptr->m_regex_idx = rgx_idx ; static_cast< std::string & >(*ptr) = wrd ; ptr->m_offset_end = off ; return Ptr(ptr); }; void Section( const char * key ) const { Serializer::Instance()->StartSection( key ); } static const bool tstDisp = false ; template< class Val > void Append( const char * key, const Val & val, const char * unit = NULL ) const { std::stringstream strm ; strm << val ; ItemAdd( key, strm.str().c_str(), unit ); } void Append( const char * key, const std::string & val, const char * unit = NULL ) const { ItemAdd( key, val.c_str(), unit ); } void Append( const char * key, const char * val, const char * unit = NULL ) const { ItemAdd( key, val, unit ); } void Append( const char * key, double val, const char * unit = NULL ) const { char buf[20]; sprintf( buf, "%.1lf", val ); ItemAdd( key, buf, unit ); } void Append( const char * key, int val, const char * unit = NULL ) const { char buf[12]; sprintf( buf, "%d", val ); ItemAdd( key, buf, unit ); } /// This ensures that each token points to the chain containing it. friend void PushItself( Ptr mySelf, TokVec::Ptr ptr ) { mySelf->m_container = ptr ; ptr->push_back( mySelf ); }; size_t offset_begin(void) const { assert( m_offset_end >= size() ); return m_offset_end - size(); } size_t offset_end(void) const { return m_offset_end; } const char * RegexName(void) const ; bool ParseItself(void) { return Parse( c_str() ); } /// It is dependent on the previous token. // TODO: This should be explicitely dependent on a preceding regex. virtual bool CanComeFirst(void) const { return true; } }; // TokenProxy typedef TokenProxy::Ptr (*ProxyGen)( int reg_idx, const std::string & wrd, size_t txt_offset); /// Stores the regular expression associated to a Synop code, /// plus a factory to create an object modelizing this code. class RegexT : public WithRefCnt< RegexT > { const char * m_str ; const char * m_name ; regex_t m_regex ; ProxyGen m_generator ; priority_t m_priority ; void treat_error(int stat) const { char errbuf[512]; size_t lenbuf = sprintf( errbuf, "%s:", m_str ); regerror(stat, &m_regex, errbuf + lenbuf, sizeof(errbuf) - lenbuf ); throw std::runtime_error(errbuf); } RegexT(); RegexT(const RegexT &); /// Token now just need an integer to point to their regular expression. /// It is therefore very fast to create/copy a token. typedef std::vector< const RegexT * > StorageT ; /// Where we store all created and compiled regexes, indexed with an integer. static StorageT & storage(void) { static StorageT s_storage ; return s_storage ; } public: RegexT( const char * reg, const char * name, ProxyGen gener, priority_t priority ) : m_str(reg) , m_name(name) , m_generator(gener) , m_priority(priority) { char tmpbuf[ 3 + strlen(m_str) ]; sprintf( tmpbuf, "^%s$", m_str ); int stat = regcomp( &m_regex, tmpbuf, REG_EXTENDED|REG_NOSUB); if(stat) treat_error(stat); } ~RegexT() { regfree( &m_regex ); } /// Returns the regular expression given its index. static const RegexT * Find(size_t idx ) { assert( idx < Nb() ); return storage()[ idx ]; } static size_t Nb(void) { return RegexT::storage().size(); } /// Given a regular expression patterns, creates and compile the regular expression and stores it with an integer. static int CreateRgx( const char * reg, const char * name, ProxyGen gener, priority_t priority ) { typedef std::map< const char *, int > Name2idxT ; static Name2idxT name2idx ; Name2idxT::iterator it = name2idx.find(name); if( it != name2idx.end() ) return it->second ; int new_idx = storage().size(); storage().push_back( new RegexT( reg, name, gener, priority ) ); // The name is later used for easier retrieval from a Synop token. name2idx[ name ] = new_idx ; return new_idx ; }; static TokenProxy::Ptr CreateTokenProxy( int reg_idx, const std::string & wrd, size_t txt_offset ) { return Find(reg_idx)->m_generator( reg_idx, wrd, txt_offset ); } const char * Name(void) const { return m_name; } static const char * Name(size_t idx) { return Find(idx)->m_name; } // If two different tokens, with different regular expressions, match for the // same word, the priority tells which one to take. Default value is one. static priority_t Priority( size_t idx ) { assert( idx < Nb() ); return storage()[ idx ]->m_priority; } bool Match( const std::string & str ) const { int stat = regexec( &m_regex, str.c_str(), 0, 0, 0 ); switch(stat) { case 0: //std::cout << "DEBUG: Matched [" << str << "] with [" << m_str << "] (" << m_name << ")\n"; return true ; case REG_NOMATCH: // std::cout << "DEBUG: NoMatch [" << str << "] with [" << m_str << "]\n"; return false ; default: break ; } treat_error(stat); return 0 ; // Will never be reached. } /// Stores the match result for each regular expression. class Context { // First bit to store whether we tried to match. Next bit for the result. std::vector m_flags ; /// TODO: Consider a compile-time size because we know the number of regular expressions. static size_t NbElts() { return RegexT::Nb(); }; public: Context() : m_flags( NbElts() * 2, false ) {} virtual ~Context() {} // This helps performance because the same regex appears in several chains. virtual bool Mtch( size_t reg_idx, const std::string & str ) { assert( m_flags.size() == NbElts() * 2 ); assert( m_flags.size() > 2 * reg_idx + 1 ); if( m_flags.at( 2 * reg_idx ) ) return m_flags[ 2 * reg_idx + 1 ]; m_flags[ 2 * reg_idx ] = true ; bool res = RegexT::Find(reg_idx)->Match( str ); m_flags[ 2 * reg_idx + 1 ] = res; return res; } }; }; // RegexT /// Loops in the tokens held by the container, for a precise type. template< class TokenDerived > const TokenDerived * TokenProxy::get_ptr(bool previous_chains) const { for( TokVec::Ptr curr_container = m_container ; curr_container ; curr_container = curr_container->previous() ) { for( TokVec::const_iterator it = curr_container->begin(), en = curr_container->end(); it != en ; ++it ) { const TokenDerived * ptr = dynamic_cast< const TokenDerived * >( it->operator->() ); if( ptr != NULL ) return ptr ; } if( ! previous_chains ) break ; } return NULL ; } const char * TokenProxy::RegexName(void) const { return RegexT::Name(m_regex_idx); }; /// Transforms a token nickname into a classname, intentionaly small to reduce symbol table size. #define CLASSTK(a) Tk_##a /// Each Synop group (aka Token° is associated to a regular expression, and a priority. #define GENTK_PRIORITY( TokDrv, Rgx, prio ) \ static int MakeRegex() { return RegexT::CreateRgx( Rgx, #TokDrv, TokenProxy::Generator< CLASSTK(TokDrv) >, prio ); } /// TODO: It is not necessary to add "=" or ";" at the end of the regular expressions. #define GENTK( TokDrv, Rgx ) GENTK_PRIORITY( TokDrv, Rgx, 1.0 ) /// Definition of a derived class associated to a five-digits group (Most of times) and a regular expression. /// Virtual inheritance because it might derive from another TokenProxy derived class. #define HEADTK(a) class CLASSTK(a) : virtual public TokenProxy /// For defining chains of tokens. Some tokens might be repeated, hence TKn. #define TKx(a) CLASSTK(a)::MakeRegex() /// If this token appears once and once only. #define TK1(a) {TKx(a),false} /// If this token can be repeated. #define TKn(a) {TKx(a),true} /// One element in a chain of token which forms a Synop line. struct TOKGEN { int m_rgx_idx; // Index to a regular expression. bool m_many; // If this token can be repeated or appears once only. }; // ---------------------------------------------------------------------------- /// Matches the usual message begin. HEADTK(ZCZC) { public: GENTK_PRIORITY( ZCZC, "ZCZC", MIN_PRIO ) bool Parse( const char * str ) { return 0 == strcmp( str, "ZCZC" ); } void Print() const { Section( "Bulletin preamble" ); } }; /// The id which might come after ZCZC. HEADTK(ZCZC_id) { int m_id ; public: GENTK( ZCZC_id, "[0-9]{2,4}" ) bool Parse( const char * str ) { return 1 == sscanf( str, "%d", &m_id ); } void Print() const { Append( _("Report number"), m_id ); } /// Can come only after ZCZC bool CanComeFirst(void) const { return false ; } }; /// Usual end of weather message. HEADTK(NNNN) { public: GENTK_PRIORITY( NNNN, "NNNN", MIN_PRIO ) bool Parse( const char * str ) { return 0 == strcmp( str, "NNNN" ); } void Print() const { Section( "Bulletin end" ); } }; /// Any coding will work if we store two chars in an integer. #define CHR2(x1,x2) (unsigned char)x1 * 256 + (unsigned char)x2 static const char * wx_code_to_txt( const char * strwx ) { int two_chars = CHR2(strwx[0],strwx[1]); switch( two_chars ) { case CHR2('S','H'): return _("Synoptic ship reports"); case CHR2('S','I'): return _("Intermediate synoptic reports"); case CHR2('S','M'): return _("Synoptic observations"); case CHR2('S','N'): return _("Non-standard synoptic hour"); default : return NULL; } } #undef CHR2 HEADTK(TTAAii) { char m_datatype[3]; char m_geographical[3] ; int m_number ; public: /** SH:Synoptic ship reports SI:Intermediate synoptic reports SM:Synoptic observations */ GENTK( TTAAii, "S[HIMN][A-Z0-9]{2}[0-9]{2}" ) bool Parse( const char * str ) { return 3 == sscanf( str, "%2s%2s%2d", m_datatype, m_geographical, &m_number ); } void Print() const { const char * dt_type = wx_code_to_txt(m_datatype); if(dt_type) { Append(_("Data type"), dt_type ); } else { std::stringstream strm ; strm << _("Unknown") << ':' << m_datatype << '.'; Append(_("WX data type"), strm.str() ); } Append(_("Geographical"), m_geographical ); const char * num = NULL ; switch( m_number ) { case 1 ... 19 : num = _("Inclusive for global distribution"); break; case 20 ... 39 : num = _("Inclusive for regional and interregional distribution"); break; case 40 ... 89 : num = _("Inclusive for national and bilaterally agreed distribution"); break; default : num = _("Reserved"); break; } Append(_("Number"), num ); } }; /// ICAO location. Found in document 7910. /// Or here: http://www.wmo.int/pages/prog/www/ois/Operational_Information/VolumeC1/CCCC_en.html /// http://weather.rap.ucar.edu/surface/stations.txt /// ftp://www.wmo.ch/wmo-ddbs/OperationalInfo/VolumeC1/To_WMO/ HEADTK(CCCC) { char m_icao[5]; public: GENTK( CCCC, "[A-Z]{4}" ) /// All these comparisons, because there might be confusion with other four-letters groups. bool Parse( const char * str ) { return 1 == sscanf( str, "%4s", m_icao ) && strcmp( m_icao, "AAXX" ) && strcmp( m_icao, "BBXX" ) && strcmp( m_icao, "OOXX" ) && strcmp( m_icao, "ZCZC" ) && strcmp( m_icao, "NNNN" ); } /// TODO: Lookup in wmo file. void Print() const { Append( _("ICAO indicator"), m_icao ); } }; static std::string hour_min( int hour, int min ) { char buf[10]; sprintf( buf, "%02d:%02d", hour, min ); return buf ; } HEADTK(YYGGgg) { /// Default date is today. time_t m_time; public: GENTK( YYGGgg, "[0-3][0-9][0-2][0-9][0-5][0-9]" ) bool Parse( const char * str ) { int day_of_month ; int UTC_observation_hour ; int UTC_observation_minute ; bool time_ok = ( 3 == sscanf( str, "%02d%02d%02d", &day_of_month, &UTC_observation_hour, &UTC_observation_minute ) ); time_ok = time_ok && ( day_of_month <= 31 ) && ( UTC_observation_hour <= 24 ) && ( UTC_observation_minute <= 59 ); if( ! time_ok ) return false ; m_time = DayHourMin2Tm( day_of_month, UTC_observation_hour, UTC_observation_minute ); return true ; } void Print() const { Append( _("UTC observation time"), Tm2SynopTime( m_time ) ); } /// Does not display anything because all the information is in the UTC time stamp. void DrawKml() const {} time_t ObservationTimeUTC() const { return m_time ; } }; /** BBB Forms The four forms of the BBB indicator group are: * RRx - Delayed (Retard) * CCx - Correction * AAx - Amendment * Pxx - Segment number * */ HEADTK(Numbered) { const char * m_format ; char m_number[3]; public: CLASSTK(Numbered)( const char * fmt ) : m_format(fmt) {}; void Print() const { Append( _("Segment number"), m_number ); } bool Parse( const char * str ) { return 1 == sscanf( str, m_format, m_number ); } const char * Number() const { return m_number ; } }; HEADTK(RRx), virtual CLASSTK(Numbered) { public: /** http://www.wmo.int/pages/prog/www/ois/Operational_Information/Publications/WMO_386/AHLsymbols/bbb_en.html "x=A for the first bulletin after the issuance of the initial bulletin; B, if another bulletin needs to be issued; and so on up to and including x = X; " This seems to be wrong, actually messages up to Y and Z are seen. GENTK( RRx, "RR[A-X]" ) */ GENTK( RRx, "RR[A-Z]" ) CLASSTK(RRx)() : CLASSTK(Numbered)( "RR%1s" ) {} }; HEADTK(CCx), virtual CLASSTK(Numbered) { public: GENTK( CCx, "CC[A-X]" ) CLASSTK(CCx)() : CLASSTK(Numbered)( "CC%1s" ) {} }; HEADTK(AAx), virtual CLASSTK(Numbered) { public: GENTK( AAx, "AA[A-X]" ) CLASSTK(AAx)() : CLASSTK(Numbered)( "AA%1s" ) {} }; /// Pxx is the segmentation BBB group as defined in the WMO document Guidelines For The Use Of The Indicator BBB HEADTK(Pxx), virtual CLASSTK(Numbered) { public: /// Details here: http://www.nws.noaa.gov/tg/bbb.php GENTK( Pxx, "P[A-Z]{2}" ) CLASSTK(Pxx)() : CLASSTK(Numbered)( "P%2s" ) {} }; /// ISMCS WMO STATION NUMBER LIST /// http://www.ncdc.noaa.gov/oa/climate/rcsg/cdrom/ismcs/alphanum.html /// http://www.weather.unisys.com/wxp/Appendices /// http://weather.unisys.com/wxp/Appendices/Formats/SYNOP.html /// 000 Group - Identification and Location /// /// IIiii The WMO number of the station. HEADTK(IIiii) { int m_wmo_indicator ; int m_region_number ; const char * m_region_name ; public: GENTK( IIiii, "[0-9]{5}" ) // GENTK( IIiii, "[0-9]{5}", MIN_PRIO ) /** The IIiii Structure The II or block number is allocated to the services within each Region by regional agreement. Station numbers iii corresponding to a common block number (II) except 89 are usually distributed so that the zone covered by a block number is divided into horizontal strips; e.g. one of several degrees of latitude. Where possible, station numbers within each strip increase from west to east and the first figure of the 3-figure station number increases from north to south. Station index numbers for station in the Antarctic are allocated by the Secretary-General in accordance with the following scheme: Each station has an international number 89xxy, where xx indicated the nearest 10 degree meridian which is numerically lower than the station longitude. For east longitudes, 50 is added; e.g. 89124 indicated a station between 120 degrees and 130 degrees west and 89654 indicates a station between longitudes 150 degrees and 160 degrees east. The figure "y" is allocated roughly according to the latitude of the station with "y" increasing towards the south. For station for which an international numbers are no longer available within the above scheme, the algorithm will be expanded by adding 20 to xx for west longitudes (range of index numbers 200-380) and 70 for east longitudes (range of index numbers 700-880) to provide new index numbers. Antarctic station which held numbers before the introduction of this scheme in 1957 retain their previously allocated index numbers. */ bool Parse( const char * str ) { // std::cout << "wmo=" << str << "\n"; /* Station index numbers consisting of one figure repeated five times, e.g. 55555, 77777, etc., or ending with 0000 or 9999, or duplicating special code indicators, e.g. 10001, 77744, 19191, 89998, etc., are not assigned to meteorological stations. We might check if the code exists or not. */ if( 1 != sscanf( str, "%d", &m_wmo_indicator ) ) return false ; m_region_name = ""; m_region_number = 0 ; // http://weather.noaa.gov/tg/site.shtml switch(m_wmo_indicator) { case 00000: case 11111: case 22222: case 33333: case 44444: case 55555: case 66666: case 77777: case 88888: case 99999: m_region_name = _("Unassigned"); return false ; default : break ; } /// More special codes. switch(m_wmo_indicator%10000) { case 0000: case 9999: return false ; default : break ; } switch(m_wmo_indicator) { case 60000 ... 69999: m_region_name = _("Africa"); m_region_number = 1 ; break; case 20000 ... 20099: case 20200 ... 21999: case 23000 ... 25999: case 28000 ... 32999: case 35000 ... 36999: case 38000 ... 39999: case 40350 ... 48599: case 48800 ... 49999: case 50000 ... 59999: m_region_name = _("Asia"); m_region_number = 2 ; break; case 80000 ... 88999: m_region_name = _("South America"); m_region_number = 3 ; break; case 70000 ... 79999: m_region_name = _("North and Central America"); m_region_number = 4 ; break; case 48600 ... 48799: case 90000 ... 98999: m_region_name = _("South-West Pacific"); m_region_number = 5 ; break; case 00000 ... 19999: case 20100 ... 20199: case 22000 ... 22999: case 26000 ... 27999: case 33000 ... 34999: case 37000 ... 37999: case 40000 ... 40349: m_region_name = _("Europe"); m_region_number = 6 ; break; case 89000 ... 89999: m_region_name = _("Antarctic"); m_region_number = 9 ; break; } /* NOT SURE THIS IS REALLY USEFUL <<<<<<<<<<<================== */ // std::cout << "region=" << m_region_name << "\n"; return true ; } /// Huge list: http://www.ncdc.noaa.gov/oa/climate/rcsg/cdrom/ismcs/alphanum.html int WmoIndicator(void) const { return m_wmo_indicator; } /// Official file: http://weather.noaa.gov/data/nsd_bbsss.txt void Print() const { std::stringstream strm ; strm << std::setfill('0') << std::setw(5) << m_wmo_indicator ; std::string wmo_str = strm.str(); Append( _("WMO Station"), wmo_str ); const RecordWmoStation * ptrWmo = CatalogWmoStations::FindFromKey( m_wmo_indicator ); if( ptrWmo ) Append( _("WMO station"), *ptrWmo ); else { Append( _("WMO station"), "WMO_" + wmo_str ); } } void DrawKml() const {} }; HEADTK(AAXX) { public: GENTK( AAXX, "AAXX" ) bool Parse( const char * str ) { return 0 == strcmp( str, "AAXX" ); } void Print() const { Section( _("Land station observation") ); } }; /// SHIP report. HEADTK(BBXX) { public: GENTK( BBXX, "BBXX" ) bool Parse( const char * str ) { return 0 == strcmp( str, "BBXX" ); } void Print() const { Section( _("Ship observation") ); } }; /// SYNOP MOBILE. HEADTK(OOXX) { public: GENTK( OOXX, "OOXX" ) bool Parse( const char * str ) { return 0 == strcmp( str, "OOXX" ); } void Print() const { Section( _("Mobile observation") ); } }; /// http://metaf2xml.sourceforge.net/parser.pm.html#trends HEADTK(MMMULaULo) { /// See decoding here: http://icoads.noaa.gov/Release_1/suppG.html int m_Marsden_square ; double m_latitude; double m_longitude; public: /// Lower priority because it should not be selected against any other chain beginning. GENTK_PRIORITY( MMMULaULo, "[0-9/]{5}", 0.5 ) /// TODO: Marsden square was not tested enough. bool Parse( const char * str ) { m_Marsden_square = -1; m_latitude = 0.0 ; m_longitude = 0.0 ; if( 0 == strncmp( str, "/////", 5 ) ) return true ; // Only slashes or no slash at all. if ( NULL != strchr( str, '/' ) ) return false ; char char_lat ; char char_lon ; if ( 3 != sscanf( str, "%3d%c%c", &m_Marsden_square, &char_lat, &char_lon ) ) return false; m_latitude = 90.0 - ( m_Marsden_square / 36.0 ) ; m_longitude = ( m_Marsden_square % 36 ) - 30.0 ; m_latitude += char_lat - '0' ; m_longitude += char_lon - '0' ; /// East longitude is positive, West is negative. return true; } void Print() const { /// Very approximate. if( m_Marsden_square > 0 ) { Append( _("Marsden latitude"), m_latitude ); Append( _("Marsden longitude"), m_longitude ); } else { Append( _("Coordinates"), _("Marsden square not defined") ); } } bool MarsdenValid(void) const { return m_Marsden_square >= 0; } double Latitude(void) const { assert( MarsdenValid() ); return m_latitude; } double Longitude(void) const { assert( MarsdenValid() ); return m_longitude; } bool CanComeFirst(void) const { return false ; } }; /// Position of the station (Marsden square, height) /// http://metaf2xml.sourceforge.net/parser.pm.html#trends /// h0h0h0h0im elevation of mobile land station, units of elevation, and elevation accuracy /// h0hoh0h0 elevation if meters or feet as indicated by im /// im indicator for units of elevation and confidence factor of accuracy HEADTK(h0h0h0h0im) { /// See decoding here: http://icoads.noaa.gov/Release_1/suppG.html int m_height ; char m_indicator ; public: GENTK( h0h0h0h0im, "[0-9/]{4}[1-8]" ) bool Parse( const char * str ) { m_height = 0; m_indicator = '0'; return ( 2 == sscanf( str, "%4d%c", &m_height, &m_indicator ) ); } void Print() const { const char * unit = ""; switch(m_indicator) { case '1' ... '4' : unit = Unit_meters; break; case '5' ... '8' : unit = Unit_feet; break; default: ; } Append( _("Height"), m_height, unit ); const char * indicators[] = { _("Not Used"), _("Excellent (within 3 meters)"), _("Good (within 10 meters)"), _("Fair (within 20 meters)"), _("Poor (more than 20 meters)"), _("Excellent (within 10 feet)"), _("Good (within 30 feet)"), _("Fair (within 60 feet)"), _("Poor (more than 60 feet)") }; disp_arr(indicators,G_N_ELEMENTS(indicators),m_indicator,'0',_("Precision")); } /// It is dependent on the previous token, MMMUL. bool CanComeFirst(void) const { return false ; } }; /// NIL HEADTK(NIL) { public: GENTK( NIL, "NIL[;=]?" ) bool Parse( const char * str ) { return 0 == strncmp( str, "NIL", 3 ); } void Print() const { Append( _("Token"), _("End of section") ); } void DrawKml() const {} }; /// Ship or Buoy Observations: IIIII The ship or buoy identifier HEADTK(IIIII) { static const size_t maxsz = 10 ; char m_ship_buoy_identifier[maxsz] ; public: GENTK( IIIII, "[A-Z0-9]{3,9}" ) /// We filter some identifiers. bool Parse( const char * str ) { // If this is a five-digits string, it cannot reasonably be an identifier. if( ( 5 == strlen( str ) ) && ( 5 == strspn( str, "0123456789" ) ) ) { return false ; } /// Due to parsing error, we might take the next group header (333 or 555) as a ship name. bool resu = ( 1 == sscanf( str, "%9s", m_ship_buoy_identifier ) ) && ( strcmp( m_ship_buoy_identifier, "333" ) ) && ( strcmp( m_ship_buoy_identifier, "555" ) ); if( resu ) { // Some ships are apparently anonymous, we give them an unique name. if( 0 == strcmp( "SHIP", m_ship_buoy_identifier ) ) { static int ship_counter = 0 ; ++ship_counter ; sprintf( m_ship_buoy_identifier, "SHIP_%d", ship_counter ); } } else { m_ship_buoy_identifier[0] = '\0'; } return resu; } void Print() const { Append( _("Ship/Buoy identifier"), m_ship_buoy_identifier ); } void DrawKml() const {} /// Information about buoys: /// http://www.ndbc.noaa.gov/marine_notice.shtml /// http://www.ndbc.noaa.gov/stndesc.shtml /// http://www.hpc.ncep.noaa.gov/html/stationplot_buoy.shtml const char * ShipIdentifier(void) const { return m_ship_buoy_identifier; } }; /// ff -- wind speed in units determined by wind type indicator (see above) static const choice< char > wind_speed_units[] = { { '0',_("m/s (Estimated)") }, { '1',_("m/s (Anemometer)") }, { '3',_("knots (Estimated)") }, { '4',_("knots (Anemometer)") } }; FM12CodeTable( wind_speed_units, 1855, _("Indicator for source and units of wind speed") ); /// Apparently one can also find YYGGggi: /// YY -- Monatstag (UTC) /// GG -- Beobachtungszeit (UTC) in vollen Stunden /// gg -- Beobachtungszeit in Minuten (wird nur bei Halbstundenterminen benutzt: gg = 30) /// iw -- Indikator für Windangaben: /// YYGGi /// YY -- The day of the month /// GG -- The hour of the observation (UTC) /// iw -- Wind type indicator /// For more safety, we could search today's date only, but testing is more difficult. HEADTK(YYGGi) { time_t m_time; char m_wind_type_indicator ; public: GENTK( YYGGi, "[0-3][0-9][0-2][0-9][0134]" ) bool Parse( const char * str ) { int day_of_month; int UTC_observation_hour; if ( 3 != sscanf( str, "%02d%02d%c", &day_of_month, &UTC_observation_hour, &m_wind_type_indicator ) ) return false ; if ( ( day_of_month > 31 ) || ( day_of_month < 1 ) || ( UTC_observation_hour > 24 ) || ( NULL == strchr( "0134", m_wind_type_indicator ) ) ) return false; // std::cout << __FUNCTION__ << ":" << UTC_observation_hour << " " << day_of_month << "\n"; m_time = DayHourMin2Tm( day_of_month, UTC_observation_hour, 0 ); return true; } void Print() const { Append( _("UTC observation time"), Tm2SynopTime( m_time ) ); // No need to display it twice because it will appear after the speed value. if( tstDisp ) { Append( _("Wind type indicator"), choice_map( wind_speed_units, G_N_ELEMENTS( wind_speed_units ), m_wind_type_indicator, _("Unknown speed unit type") ) ); } } /// Does not display anything because all the information is displayed later. void DrawKml() const {} time_t ObservationTimeUTC() const { return m_time ; } friend class CLASSTK(Nddff); }; /// 99LLL QLLLL /// LLL -- Latitude of observation to .1 degrees /// Q -- Quadrant of observation HEADTK(99LLL) { int m_latit_10deg ; public: GENTK( 99LLL, "99[0-9]{3}" ) bool Parse( const char * str ) { // The latitude starts at the third char, after "99". if ( 1 != sscanf( str + 2, "%d", &m_latit_10deg ) ) return false; // Latitudes are between 0 and 90 degrees. return ( m_latit_10deg <= 900 ); } void Print() const { Append( _("QLLLL token"), _("Present") ); } /// Does not display anything because all the information is displayed later as coordinates. void DrawKml() const {} /// It is dependent on the previous token. bool CanComeFirst(void) const { return false ; } friend class CLASSTK(QLLLL); }; /// LLLL -- Longitude of observation to .1 degrees HEADTK(QLLLL) { char m_quadrant ; int m_longit_10deg ; mutable bool m_calc_done ; mutable bool m_coordinates_ok ; mutable double m_Longitude ; mutable double m_Latitude ; /// Can be called only once this token is inserted in a group. void Calc(void) const { if( m_calc_done ) return ; m_calc_done = true ; const CLASSTK(99LLL) * ptr_99LLL = TokenProxy::get_ptr< CLASSTK(99LLL) >(false); if( ptr_99LLL ) { m_Longitude = 0.0; m_Latitude = 0.0; m_coordinates_ok = false ; } double lat = ptr_99LLL ? (double)ptr_99LLL->m_latit_10deg * 0.1 : 0.0 ; double lon = (double)m_longit_10deg * 0.1 ; m_coordinates_ok = true ; // East longitude and north latitude are positive. switch( m_quadrant ) { case '1': break ; // North-East case '3': lat = -lat; break ; // South-East case '5': lon = -lon; lat = -lat; break ; // South-West case '7': lon = -lon; break ; // North-West default : m_coordinates_ok = false; break; } m_Longitude = lon; m_Latitude = lat; } public: CLASSTK(QLLLL) () : m_calc_done(false), m_coordinates_ok(false) {} GENTK( QLLLL, "[1357][0-9]{4}" ) bool Parse( const char * str ) { // Check that longitude is smaller than 180 in tenth of degrees. return ( 2 == sscanf( str, "%c%d", &m_quadrant, &m_longit_10deg ) ) && ( m_longit_10deg <= 1800 ); } void Print() const { Calc(); if(m_coordinates_ok) { Append( _("Longitude"), m_Longitude ); Append( _("Latitude"), m_Latitude ); } else { Append( _("Coordinates"), _("Wrong coordinates format") ); } } /// Does not display anything because all the information is displayed as coordinates. void DrawKml() const {} bool CanComeFirst(void) const { return false ; } const bool CoordinatesOK() const { return m_coordinates_ok; } double Longitude() const { Calc(); assert( m_coordinates_ok ); return m_Longitude; } double Latitude () const { Calc(); assert( m_coordinates_ok ); return m_Latitude ; } }; static const char * cloud_bases[]= { _("0 to 50 m"), _("50 to 100 m"), _("100 to 200 m"), _("200 to 300 m"), _("300 to 600 m"), _("600 to 1000 m"), _("1000 to 1500 m"), _("1500 to 2000 m"), _("2000 to 2500 m"), _("above 2500 m"), _("unknown") }; FM12CodeTable( cloud_bases, 1600, _("Height above surface of the base of the lowest cloud seen") ); /// 111 Group - Land Observations /// Apparently there are differences between FM12 and FM13X which is more recent. /// iihVV HEADTK(iihVV) { char m_precipitation ; char m_station_type ; char m_cloud_base ; int m_visibility ; public: GENTK( iihVV, "[0-4][1-7][0-9/][0-9/]{2}" ) bool Parse( const char * str ) { // TODO; Frequently mismatched with "222//" . Should add a special case. int nbMtch = sscanf( str, "%c%c%c%d", &m_precipitation, &m_station_type, &m_cloud_base, &m_visibility ); // "46///" is a valid string. // std::cout << __FUNCTION__ << ":" << str << " " << nbMtch << "\n"; switch(nbMtch) { case 4 : return true ; case 3 : m_visibility = -1; // i.e. "missing" return 0 == strcmp( str + 3, "//" ); default: return false ; } } bool isAutomated(void) const { switch( m_station_type ) { default : return false ; case '4': case '5': case '6': case '7': return true; } } void Print() const { /// iR -- Precipitation indicator static const char * precipitations[] = { _("In groups 1 and 3"), _("In group 1 only"), _("In group 3 only"), _("Omitted, no precipitation"), _("Omitted, no observation") }; FM12CodeTable( precipitations, 1819, _("Indicator for inclusion or mossion of precipitation data") ); disp_arr(precipitations,G_N_ELEMENTS(precipitations),m_precipitation,'0',_("Precipitations")); /// ix -- Station type and present and past weather indicator. Tells if the group 7WW is included. static const char * station_types[] = { _("Manned station (With 7WW)"), _("Manned station. Not significant (No 7WW)"), _("Manned station. No observation (No 7WW)"), _("Automated station (With 7WW)"), _("Automated station. Not significant (No 7WW)"), _("Automated station. No observation (No 7WW)"), _("Automated station (With 7WW)") }; FM12CodeTable( stations_types, 1860, _("Indicator for type of station operation and for present and past weather data") ); disp_arr(station_types,G_N_ELEMENTS(station_types),m_station_type,'1',_("Station type")); /// h -- Cloud base of lowest cloud seen (meters above ground) disp_arr(cloud_bases,G_N_ELEMENTS(cloud_bases),m_cloud_base,'0',_("Cloud base")); /// VV -- Visibility const char *vis = _("Visibility"); switch( m_visibility ) { case 0 : Append( vis, _("Less than 0.1"), Unit_km ); break ; case 1 ...50 : Append( vis, m_visibility / 10, Unit_km ); break ; case 51 ...79 : Append( vis, m_visibility - 50, Unit_km ); break ; case 80 ...88 : Append( vis, 30 + 5 * ( m_visibility - 80 ), Unit_km ); break ; case 89 : Append( vis, _("Greater than 70"), Unit_km ); break; case 90 : Append( vis, _("Less than 0.05"), Unit_km ); break; case 91 : Append( vis, 0.05, Unit_km ); break; case 92 : Append( vis, 0.2, Unit_km ); break; case 93 : Append( vis, 0.5, Unit_km ); break; case 94 : Append( vis, 1, Unit_km ); break; case 95 : Append( vis, 2, Unit_km ); break; case 96 : Append( vis, 4, Unit_km ); break; case 97 : Append( vis, 10, Unit_km ); break; case 98 : Append( vis, 20, Unit_km ); break; case 99 : Append( vis, _("Greater than 50"), Unit_km ); break; default : Append( vis, _("Missing") ); break; } } }; /// TODO: Use these graphic symbols: http://www.hpc.ncep.noaa.gov/html/stationplot_buoy.shtml static const char * cloud_covers[]= { _("0 eighths (clear)"), _("1/8"), _("2/8"), _("3/8"), _("4/8"), _("5/8"), _("6/8"), _("7/8"), _("8/8 (overcast)"), _("Sky obscured"), _("No observation") }; FM12CodeTable( cloud_covers, 2700, _("Amount of cloud cover") ); /// Nddff HEADTK(Nddff) { char m_cloud_cover ; /// In ten of degrees. int m_wind_direction ; int m_wind_speed ; public: GENTK( Nddff, "[0-9/][0-9/]{2}[0-9/]{2}" ) bool Parse( const char * str ) { m_cloud_cover = '/'; m_wind_direction = 0; m_wind_speed = 0 ; // Can be "/////" or "8////" plus trailing characters. if ( 0 == strncmp( str + 1, "////", 4) ) return true ; return ( 3 == sscanf( str, "%c%2d%2d", &m_cloud_cover, &m_wind_direction, &m_wind_speed ) ) && ( ( m_wind_direction <= 36 ) || ( m_wind_direction == 99 ) ); } void Print() const { // N -- Total cloud cover disp_arr(cloud_covers,G_N_ELEMENTS(cloud_covers),m_cloud_cover,'0',_("Cloud cover")); // dd -- wind direction in 10s of degrees if( m_wind_direction == 99 ) Append( _("Wind direction"), _("Variable, all directions, confused, indeterminate direction") ); else if( m_wind_direction == 0 ) Append( _("Wind direction"), _("No motion or no waves") ); else Append( _("Wind direction"), m_wind_direction * 10 - 5 , Unit_degrees ); FM12CodeTable( xxx, 0877, _("True direction in tenth of degrees") ); // We search for this token not only in this section but in the previous ones. const CLASSTK(YYGGi) * ptr_YYGGi = TokenProxy::get_ptr< CLASSTK(YYGGi) >(true); const char * wind_speed_title = _("Wind speed"); if( ptr_YYGGi ) { Append( wind_speed_title, m_wind_speed, choice_map( wind_speed_units, G_N_ELEMENTS( wind_speed_units ), ptr_YYGGi->m_wind_type_indicator, _("Unknown speed unit type") ) ); } else { Append( wind_speed_title, m_wind_speed, _("No unit (YYGGi missing)") ); } } bool CanComeFirst(void) const { return false ; } }; /// 00fff (optional) HEADTK(00fff) { int m_wind_speed ; public: /// Lower priority than Nddff GENTK_PRIORITY( 00fff, "00[0-9]{3}", 0.5 ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "00%3d", &m_wind_speed ) ); } void Print() const { // fff -- wind speed if value greater than 100 Append( _("Wind speed"), m_wind_speed ); } }; /// Returns true if this temperature makes sense. static bool CheckCelsius( char sign, int temperature_tenth ) { switch( sign ) { case '1' : return temperature_tenth < 700 ; case '0' : return temperature_tenth < 600 ; case '/' : return true ; default : return false ; } } /// Prints the temperature or relative humidity. static void AppCelsius( const TokenProxy * ptrTok, const char * title, char sign, int temperature_tenth ) { if( title == NULL ) title = "No title"; switch( sign ) { case '1' : temperature_tenth = -temperature_tenth ; case '0' : ptrTok->Append( title, temperature_tenth * 0.10, Unit_Celsius ); break; case '9' : ptrTok->Append( _("Relative humidity"), (double)temperature_tenth * 0.10 , "%" ); break; case '/' : ptrTok->Append( title, _("Undefined") ); break; default : ptrTok->Append( title, _("Unexpected case") ); break; } } /// 1sTTT_air -- Temperature HEADTK(1sTTT_air) { char m_temperature_sign ; int m_temperature ; public: GENTK( 1sTTT_air, "1[01/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_temperature_sign = '/'; m_temperature = 0; if( 0 == strncmp( str, "1////", 5 ) ) return true ; return ( 2 == sscanf( str, "1%c%3d", &m_temperature_sign, &m_temperature) ) && ( strchr( "01", m_temperature_sign ) != NULL ) && CheckCelsius( m_temperature_sign, m_temperature ); } /// s: sign of temperature (0=positive, 1=negative). TTT: Temperature in .1 C void Print() const { AppCelsius( this, _("Temperature"), m_temperature_sign, m_temperature ); } }; /// 2sTTT_dew -- Dewpoint HEADTK(2sTTT_dew) { char m_temperature_sign ; int m_temperature ; public: GENTK( 2sTTT_dew, "2[019/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_temperature = 0; int nbMtch = sscanf( str, "2%c%3d", &m_temperature_sign, &m_temperature); switch( nbMtch) { case 0 : return false; case 1 : return 0 == strcmp( str + 1, "////" ); // Temperature check does not apply if humidity. case 2 : return ( m_temperature_sign == '9' ) || CheckCelsius( m_temperature_sign, m_temperature ); default: return false; } } /// TTT -- Dewpoint temperature in .1 C (if sign is 9, TTT is relative humidity) void Print() const { // s -- sign of temperature (0=positive, 1=negative, 9 = Relative humidity) AppCelsius( this, _("Dewpoint temperature"), m_temperature_sign, m_temperature ); } }; /// Station pressure in 0.1 mb (thousandths digit omitted, last digit can be slash, then pressure in full mb) static void thousands_omitted( const TokenProxy * ptrTok, const char * pressure, const char * title ) { char buf[7]; int idx = 0 ; if( pressure[0] == '0' ) buf[idx++] = '1' ; strcpy( buf + idx, pressure ); char *slashpos = strchr( buf, '/' ); if( slashpos != NULL ) *slashpos = '0' ; double tmpPres ; // Checks reasonable values for a pressure. if( ( 1 != sscanf( buf, "%lf", &tmpPres ) ) || ( tmpPres > 12000 ) || ( tmpPres < 7000 ) ) { ptrTok->Append( title, _("Inconsistent:") + std::string(pressure) ); } else { ptrTok->Append( title, (int)( tmpPres / 10.0 ), Unit_hPa ); } }; /// 3PPPP -- Station pressure in 0.1 mb (thousandths digit omitted, last digit can be slash, then pressure in full mb) HEADTK(3PPPP) { char m_station_pressure[5]; public: GENTK( 3PPPP, "3[0789/][0-9/]{3}" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "3%s", m_station_pressure ) ); } void Print() const { thousands_omitted( this, m_station_pressure, _("Station pressure") ); } }; /** 4PPPP -- Sea level pressure in 0.1 mb (thousandths digit omitted, last digit can be slash, then pressure in full mb) Can be as well 4ahhh http://metaf2xml.sourceforge.net/parser.pm.html : a3 Isobaric surface (CT 0264), hhh Geopotential of isobaric surface */ HEADTK(4PPPP) { bool m_4PPPP ; char m_sea_level_pressure[5]; char m_isobaric_surface ; int m_geopotential ; public: GENTK( 4PPPP, "4[0912378/][0-9/]{3}" ) bool Parse( const char * str ) { m_4PPPP = false; m_sea_level_pressure[0] = '\0'; m_isobaric_surface = '/'; m_geopotential = -1; switch( str[1] ) { case '0': case '9': m_4PPPP = true ; return ( 1 == sscanf( str, "4%s", m_sea_level_pressure ) ); case '1': case '2': case '3': case '7': case '8': m_4PPPP = false ; return ( 2 == sscanf( str, "4%c%3d", &m_isobaric_surface, &m_geopotential ) ); case '/': m_4PPPP = true ; return ( 0 == strcmp( str, "4////" ) ); default : return false ; } } void Print() const { if(m_4PPPP) { thousands_omitted( this, m_sea_level_pressure, _("Sea level pressure") ); } else { int iso_surf = 0 ; switch( m_isobaric_surface ) { case '1': iso_surf = 1000; break; // 100 meters. case '2': iso_surf = 925; break; // 800 meters. case '3': iso_surf = 500; break; // 5000 meters case '7': iso_surf = 700; break; // 3000 meters case '8': iso_surf = 850; break; // 1500 meters. default : break ; } FM12CodeTable( xxx, 0264, _("Standard Isobaric surface for which the geopotential is reported") ); Append( _("Isobaric surface"), iso_surf, Unit_hPa ); } } }; /// 4ahhh -- Geopotential of nearest mandatory pressure level HEADTK(4ahhh) { char m_mandatory_pressure_level ; char m_geopotential_height[4] ; public: GENTK( 4ahhh, "4[12579][0-9]{3}" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "4%c%s", &m_mandatory_pressure_level, m_geopotential_height ) ); } void Print() const { /// a3 -- mandatory pressure level static const choice< char > mandatory_pressure_levels[] = { { '1', "1000" }, { '2', "925" }, { '5', "500" }, { '7', "700" }, { '8', "850" } }; Append( _("Mandatory pressure level"), choice_map( mandatory_pressure_levels, G_N_ELEMENTS( mandatory_pressure_levels ), m_mandatory_pressure_level, _("Unknown mandatory pressure level") ), _("millibar") ); /// hhh -- geopotential height omitting thousandths digit thousands_omitted( this, m_geopotential_height, _("Geopotential height") ); } }; /// 5appp -- Pressure tendency over 3 hours HEADTK(5appp) { char m_pressure_tendency ; int m_pressure_change ; public: GENTK( 5appp, "5[0-8/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { // std::cout << "str=" << str << "\n"; int nbMtch = sscanf( str, "5%c%d", &m_pressure_tendency, &m_pressure_change ); switch( nbMtch ) { case 0 : return false; case 1 : return 0 == strcmp( str, "5////"); case 2 : return true; default: return false; } } /// Symbols associated to each value: http://www.hpc.ncep.noaa.gov/html/stationplot_buoy.shtml void Print() const { /// a -- characteristics of pressure tendency static const char * pressure_tendencies[] = { _("Increasing, then decreasing. Same or higher"), _("Increasing, then steady. Raises"), _("Increasing steadily. Raises"), _("Decreasing or steady, then increasing. Raises"), _("Steady. Resultant same"), _("Decreasing, then increasing. Lowers"), _("Decreasing, then steady. Lowers"), _("Decreasing steadily. Lowers"), _("Increasing or steady, then decreasing. Lowers") }; FM12CodeTable( pressure_tendencies, 0200, _("Characteristics of pressure tendency during three last hours") ); disp_arr(pressure_tendencies,G_N_ELEMENTS(pressure_tendencies),m_pressure_tendency,'0',_("Pressure tendency")); /// ppp -- 3 hour pressure change in 0.1 mb if( m_pressure_tendency == '/' ) { Append( _("Pressure change"), _("Not specified") ); } else { Append( _("Pressure change"), m_pressure_change / 10.0, Unit_hPa ); } } }; static void display_precipitation( const TokenProxy * ptrTok, char precipitation_duration ) { int nb_hours ; /// This could be replaced by a table like the other codes tables. switch( precipitation_duration ) { case '1': nb_hours = 6; break; case '2': nb_hours = 12; break; case '3': nb_hours = 18; break; case '4': nb_hours = 24; break; case '5': nb_hours = 1; break; case '6': nb_hours = 2; break; case '7': nb_hours = 3; break; case '8': nb_hours = 9; break; case '9': nb_hours = 15; break; case '/': nb_hours = 24; break; default : nb_hours = -1; break; } FM12CodeTable( xxx, 4019, _("Duration of period of precipitation") ); if( nb_hours < 0 ) ptrTok->Append( _("Precipitation duration"), _("Undetermined") ); else ptrTok->Append( _("Precipitation duration"), nb_hours, Unit_hours ); } /// 6RRRt -- Liquid precipitation HEADTK(6RRRt) { int m_precipitation_amount ; char m_precipitation_duration ; public: GENTK( 6RRRt, "6[0-9/]{3}[0-9/][;=]?" ) bool Parse( const char * str ) { m_precipitation_amount = -1 ; m_precipitation_duration = '0' ; return ( 2 == sscanf( str, "6%3d%c", &m_precipitation_amount, &m_precipitation_duration ) ) || ( 1 == sscanf( str, "6///%c", &m_precipitation_duration ) ) || ( 0 == strncmp( str, "60000", 5 ) ); } void Print() const { /// RRR -- Precipitation amount in mm const char * precip = _("Precipitation amount"); switch( m_precipitation_amount ) { case 0 ... 988 : Append( precip, m_precipitation_amount, Unit_mm );break; case 989 : Append( precip, _("989 mm or more") );break; case 990 : Append( precip, _("Traces") );break; case 991 ... 999 : Append( precip, ( m_precipitation_amount - 990 ) / 10.0, Unit_mm );break; default : Append( precip, m_precipitation_amount, _("Inconsistent") ); break; } FM12CodeTable( xxx, 3590, _("Amount of precipitation") ); /// t -- Duration over which precipitation amount measured display_precipitation( this, m_precipitation_duration ); } }; /// 7wwWW -- Present and past weather HEADTK(7wwWW) { int m_present_weather ; char m_past_weather_1 ; char m_past_weather_2 ; mutable bool m_calc_done ; mutable bool m_automated ; /// Can be called only once this token is inserted in a group. void Calc(void) const { if( m_calc_done ) return ; m_calc_done = true ; const CLASSTK(iihVV) * ptr_iihVV = TokenProxy::get_ptr< CLASSTK(iihVV) >(false); if( ptr_iihVV ) { m_automated = ptr_iihVV->isAutomated(); } else m_automated = false ; } void PrintPastWeather( char weather, const char * title ) const { static const char * past_weathers_manned[] = { _("Cloud covering less than half of sky"), _("Cloud covering more than half of sky during part of period and more than half during part of period"), _("Cloud covering more than half of sky"), _("Sandstorm, duststorm or blowing snow"), _("Fog, or thick haze"), _("Drizzle"), _("Rain"), _("Snow or mixed rain and snow"), _("Showers"), _("Thunderstorms") }; FM12CodeTable( past_weathers_manned, 4561, _("Past weather reported from a manned weather station") ); static const char * past_weathers_automated[] = { _("No significant weather"), _("Visibility reduced"), _("Blowing phenomena, visibility reduced"), _("Fog"), _("Precipitation"), _("Drizzle"), _("Rain"), _("Snow, or Ice pellets"), _("Showers or intermittent precipitation"), _("Thunderstorm") }; FM12CodeTable( past_weathers_automated, 4532, _("Past weather reported from an automated weather station") ); // http://fr.scribd.com/doc/86346935/Land-Synoptic-Code // http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf "Land Synoptic Code" if( m_automated ) { disp_arr(past_weathers_automated,G_N_ELEMENTS(past_weathers_automated),weather,'0',title); } else { disp_arr(past_weathers_manned,G_N_ELEMENTS(past_weathers_manned),weather,'0',title); } } public: CLASSTK(7wwWW) () : m_calc_done(false), m_automated(false) {} GENTK( 7wwWW, "7[0-9/]{2}[0-9/][0-9/]" ) bool Parse( const char * str ) { m_present_weather = '/' ; m_past_weather_1 = m_past_weather_2 = '/'; return ( 0 == strcmp( "7////", str ) ) || ( 2 == sscanf( str, "7//%c%c", &m_past_weather_1, &m_past_weather_2 ) ) || ( 3 == sscanf( str, "7%2d%c%c", &m_present_weather, &m_past_weather_1, &m_past_weather_2 ) ); } void Print() const { Calc(); /// ww -- Present weather static const char * present_weathers_manned[] = { _("Clear skies"), _("Clouds dissolving"), _("State of sky unchanged"), _("Clouds developing"), // Haze, smoke, dust or sand _("Visibility reduced by smoke"), _("Haze"), _("Widespread dust in suspension not raised by wind"), _("Dust or sand raised by wind"), _("Well developed dust or sand whirls"), _("Dust or sand storm within sight but not at station"), // Non-precipitation events _("Mist"), _("Patches of shallow fog"), _("Continuous shallow fog"), _("Lightning visible, no thunder heard"), _("Precipitation within sight but not hitting ground"), _("Distant precipitation but not falling at station"), _("Nearby precipitation but not falling at station"), _("Thunderstorm but no precipitation falling at station"), _("Squalls within sight but no precipitation falling at station"), _("Funnel clouds within sight"), // Precipitation within past hour but not at observation time _("Drizzle"), _("Rain"), _("Snow"), _("Rain and snow"), _("Freezing rain"), _("Rain showers"), _("Snow showers"), _("Hail showers"), _("Fog"), _("Thunderstorms"), // Duststorm, sandstorm, drifting or blowing snow _("Slight to moderate duststorm, decreasing in intensity"), _("Slight to moderate duststorm, no change"), _("Slight to moderate duststorm, increasing in intensity"), _("Severe duststorm, decreasing in intensity"), _("Severe duststorm, no change"), _("Severe duststorm, increasing in intensity"), _("Slight to moderate drifting snow, below eye level"), _("Heavy drifting snow, below eye level"), _("Slight to moderate drifting snow, above eye level"), _("Heavy drifting snow, above eye level"), // Fog or ice fog _("Fog at a distance"), _("Patches of fog"), _("Fog, sky visible, thinning"), _("Fog, sky not visible, thinning"), _("Fog, sky visible, no change"), _("Fog, sky not visible, no change"), _("Fog, sky visible, becoming thicker"), _("Fog, sky not visible, becoming thicker"), _("Fog, depositing rime, sky visible"), _("Fog, depositing rime, sky not visible"), // Drizzle _("Intermittent light drizzle"), _("Continuous light drizzle"), _("Intermittent moderate drizzle"), _("Continuous moderate drizzle"), _("Intermittent heavy drizzle"), _("Continuous heavy drizzle"), _("Light freezing drizzle"), _("Moderate to heavy freezing drizzle"), _("Light drizzle and rain"), _("Moderate to heavy drizzle and rain"), // Rain _("Intermittent light rain"), _("Continuous light rain"), _("Intermittent moderate rain"), _("Continuous moderate rain"), _("Intermittent heavy rain"), _("Continuous heavy rain"), _("Light freezing rain"), _("Moderate to heavy freezing rain"), _("Light rain and snow"), _("Moderate to heavy rain and snow"), // Snow _("Intermittent light snow"), _("Continuous light snow"), _("Intermittent moderate snow"), _("Continuous moderate snow"), _("Intermittent heavy snow"), _("Continuous heavy snow"), _("Diamond dust"), _("Snow grains"), _("Snow crystals"), _("Ice pellets"), // Showers _("Light rain showers"), _("Moderate to heavy rain showers"), _("Violent rain showers"), _("Light rain and snow showers"), _("Moderate to heavy rain and snow showers"), _("Light snow showers"), _("Moderate to heavy snow showers"), _("Light snow/ice pellet showers"), _("Moderate to heavy snow/ice pellet showers"), _("Light hail showers"), _("Moderate to heavy hail showers"), // Thunderstorms _("Thunderstorm in past hour, currently only light rain"), _("Thunderstorm in past hour, currently only moderate to heavy rain"), _("Thunderstorm in past hour, currently only light snow or rain/snow mix"), _("Thunderstorm in past hour, currently only moderate to heavy snow or rain/snow mix"), _("Light to moderate thunderstorm"), _("Light to moderate thunderstorm with hail"), _("Heavy thunderstorm"), _("Heavy thunderstorm with duststorm"), _("Heavy thunderstorm with hail") }; FM12CodeTable( present_weathers_manned, 4677, _("Present weather reported from a manned weather station") ); /// http://near-goos1.jodc.go.jp/rdmdb/format/JMA/wawa.html static const char * present_weathers_automated[] = { _("No significant weather observed"), _("Clouds generally dissolving or becoming less developed during the past hour"), _("State of sky on the whole unchanged during the past hour"), _("Clouds generally forming or developing during the past hour"), _("Haze or smoke, or dust in suspension in the air, visibility equal to, or greater than, 1 km"), _("Haze or smoke, or dust in suspension in the air, visibility less than 1 km"), _("Reserved"), _("Reserved"), _("Reserved"), _("Reserved"), _("Mist"), _("Diamond dust"), _("Distant lightning"), _("Reserved"), _("Reserved"), _("Reserved"), _("Reserved"), _("Squalls"), _("Reserved"), // Code figures 20–26 are used to report precipitation, fog (or ice fog) // or thunderstorm at the station during the preceding hour but not at the time of observation. _("Fog"), _("PRECIPITATION"), _("Drizzle (not freezing) or snow grains"), _("Rain (not freezing)"), _("Snow"), _("Freezing drizzle or freezing rain"), _("Thunderstorm (with or without precipitation)"), _("BLOWING OR DRIFTING SNOW OR SAND"), _("Blowing or drifting snow or sand, visibility equal to, or greater than, 1 km"), _("Blowing or drifting snow or sand, visibility less than 1 km"), _("FOG"), _("Fog or ice fog in patches"), _("Fog or ice fog, has become thinner during the past hour"), _("Fog or ice fog, no appreciable change during the past hour"), _("Fog or ice fog, has begun or become thicker during the past hour"), _("Fog, depositing rime"), _("Reserved"), _("Reserved"), _("Reserved"), _("Reserved"), _("PRECIPITATION"), _("Precipitation, slight or moderate"), _("Precipitation, heavy"), _("Liquid precipitation, slight or moderate"), _("Liquid precipitation, heavy"), _("Solid precipitation, slight or moderate"), _("Solid precipitation, heavy"), _("Freezing precipitation, slight or moderate"), _("Freezing precipitation, heavy"), _("Reserved"), _("DRIZZLE"), _("Drizzle, not freezing, slight"), _("Drizzle, not freezing, moderate"), _("Drizzle, not freezing, heavy"), _("Drizzle, freezing, slight"), _("Drizzle, freezing, moderate"), _("Drizzle, freezing, heavy"), _("Drizzle and rain, slight"), _("Drizzle and rain, moderate or heavy"), _("Reserved"), _("RAIN"), _("Rain, not freezing, slight"), _("Rain, not freezing, moderate"), _("Rain, not freezing, heavy"), _("Rain, freezing, slight"), _("Rain, freezing, moderate"), _("Rain, freezing, heavy"), _("Rain (or drizzle) and snow, slight"), _("Rain (or drizzle) and snow, moderate or heavy"), _("Reserved"), _("SNOW"), _("Snow, slight"), _("Snow, moderate"), _("Snow, heavy"), _("Ice pellets, slight"), _("Ice pellets, moderate"), _("Ice pellets, heavy"), _("Snow grains"), _("Ice crystals"), _("Reserved"), _("SHOWER(S) or INTERMITTENT PRECIPITATION"), _("Rain shower(s) or intermittent rain, slight"), _("Rain shower(s) or intermittent rain, moderate"), _("Rain shower(s) or intermittent rain, heavy"), _("Rain shower(s) or intermittent rain, violent"), _("Snow shower(s) or intermittent snow, slight"), _("Snow shower(s) or intermittent snow, moderate"), _("Snow shower(s) or intermittent snow, heavy"), _("Reserved"), _("Hail"), _("THUNDERSTORM"), _("Thunderstorm, slight or moderate, with no precipitation"), _("Thunderstorm, slight or moderate, with rain showers and/or snow showers"), _("Thunderstorm, slight or moderate, with hail"), _("Thunderstorm, heavy, with no precipitation"), _("Thunderstorm, heavy, with rain showers and/or snow showers"), _("Thunderstorm, heavy, with hail"), _("Reserved"), _("Reserved"), _("Tornado") }; FM12CodeTable( present_weathers_automated, 4680, _("Present weather reported from an automated weather station") ); // http://fr.scribd.com/doc/86346935/Land-Synoptic-Code if( m_automated ) { disp_arr(present_weathers_manned, G_N_ELEMENTS(present_weathers_manned), m_present_weather,0,_("Present weather - Manned")); PrintPastWeather( m_past_weather_1, _("Past weather type 1 - Manned")); PrintPastWeather( m_past_weather_2, _("Past weather type 2 - Automated")); } else { disp_arr(present_weathers_automated, G_N_ELEMENTS(present_weathers_automated), m_present_weather,0,_("Present weather - Automated")); PrintPastWeather( m_past_weather_1, _("Past weather type 1 - Automated")); PrintPastWeather( m_past_weather_2, _("Past weather type 2 - Automated")); } } }; /// 8NCCC -- Cloud type information HEADTK(8NCCC) { char m_low_clouds_amount ; char m_low_cloud_type ; char m_mid_cloud_type ; char m_high_cloud_type ; public: GENTK( 8NCCC, "8[0-9/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { return ( 4 == sscanf( str, "8%c%c%c%c", &m_low_clouds_amount, &m_low_cloud_type, &m_mid_cloud_type, &m_high_cloud_type ) ); } void Print() const { /// N -- Amount of low clouds covering sky, if no low clouds, the amount of the middle clouds const char * low_cloud_title = m_low_cloud_type != '0' ? _("Amount of low clouds") : _("Amount of middle clouds"); if( m_low_clouds_amount == '/' ) Append( low_cloud_title, _("Unspecified") ); else Append( low_cloud_title, m_low_clouds_amount - '0' ); /// CL -- Low cloud type static const choice< char > arr_low_clouds[] = { { '0', _("No low clouds") }, { '1', _("Cumulus humulis or fractus (no vertical development)") }, { '2', _("Cumulus mediocris or congestus (moderate vertical development)") }, { '3', _("Cumulonimbus calvus (no outlines nor anvil)") }, { '4', _("Stratocumulus cumulogenitus (formed by spreading of cumulus)") }, { '5', _("Stratocumulus") }, { '6', _("Stratus nebulosus (continuous sheet)") }, { '7', _("Stratus or cumulus fractus (bad weather)") }, { '8', _("Cumulus and stratocumulus (multilevel)") }, { '9', _("Cumulonimbus with anvil") }, { '/', _("Low clouds unobserved due to darkness or obscuration") } }; Append( _("Low clouds type"), choice_map( arr_low_clouds, G_N_ELEMENTS( arr_low_clouds ), m_low_cloud_type, _("unknown low clouds type") ) ); FM12CodeTable( arr_low_clouds, 0513, _("Clouds of the genera stratocumulus, stratus,cumulus, and cumulonimbus") ); /// CM -- Middle cloud type static const choice< char > arr_mid_clouds[] = { { '0', _("No middle clouds") }, { '1', _("Altostratus translucidous (mostly transparent)") }, { '2', _("Altostratus opacus or nimbostratus") }, { '3', _("Altocumulus translucidous (mostly transparent)") }, { '4', _("Patches of altocumulus (irregular, lenticular)") }, { '5', _("Bands of altocumulus") }, { '6', _("Altocumulus cumulogenitus (formed by spreading of cumulus)") }, { '7', _("Altocumulus (multilayers)") }, { '8', _("Altocumulus castellanus (having cumuliform tufts)") }, { '9', _("Altocumulus of a chaotic sky") }, { '/', _("Middle clouds unobserved due to darkness or obscuration ") }, }; Append( _("Middle clouds type"), choice_map( arr_mid_clouds, G_N_ELEMENTS( arr_mid_clouds ), m_mid_cloud_type, _("unknown middle clouds type") ) ); FM12CodeTable( arr_mid_clouds, 0515, _("Clouds of the genera altocumulus,altostratus, and nimbostratus") ); /// CH -- High cloud type static const choice< char > arr_high_clouds[] = { { '0', _("No high clouds") }, { '1', _("Cirrus fibratus (wispy)") }, { '2', _("Cirrus spissatus (dense in patches)") }, { '3', _("Cirrus spissatus cumulogenitus (formed out of anvil)") }, { '4', _("Cirrus unicus or fibratus (progressively invading sky)") }, { '5', _("Bands of cirrus or cirrostratus invading sky (less than 45 degree above horizon)") }, { '6', _("Bands of cirrus or cirrostratus invading sky (more than 45 degree above horizon)") }, { '7', _("Cirrostratus covering whole sky") }, { '8', _("Cirrostratus not covering sky but not invading") }, { '9', _("Cirrocumulus") }, { '/', _("High clouds unobserved due to darkness or obscuration") } }; Append( _("High clouds type"), choice_map( arr_high_clouds, G_N_ELEMENTS( arr_high_clouds ), m_high_cloud_type, _("unknown high clouds type") ) ); FM12CodeTable( arr_mid_clouds, 0509, _("Clouds of the genera cirrus,cirrocumulus, and cirrostratus") ); } }; /// 9GGgg -- Time of observation in hours and minutes HEADTK(9GGgg) { int m_hours; int m_minutes; public: GENTK( 9GGgg, "9[0-2][0-9][0-5][0-9][;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "9%2d%2d", &m_hours, &m_minutes ) ); } void Print() const { Append( _("Observation time"), hour_min( m_hours, m_minutes ) ); } }; /// 222 Group - Sea Surface Observations /// /// 222Dv HEADTK(222Dv) { char m_ship_direction; char m_ship_average_speed; public: /// Not only it is selected before similar tokens, but also it can be kept at the end like two tokens together. GENTK_PRIORITY( 222Dv, "222[0-9/][0-9/][;=]?", MIN_PRIO ) // GENTK( 222Dv, "222[0-9/][0-9/][;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "222%c%c", &m_ship_direction, &m_ship_average_speed ) ); } void Print() const { /// D -- direction of ship movement const char * ship_directions[] = { _("Calm"), _("North-East"), _("East"), _("South-East"), _("South"), _("South-West"), _("West"), _("North-West"), _("North"), _("Unknown") }; disp_arr(ship_directions,G_N_ELEMENTS(ship_directions),m_ship_direction,'0',_("Ship direction") ); /// * v -- ship's average speed const char * ship_average_speeds[] = { _("0 knots"), _("1 to 5 knots"), _("6 to 10 knots"), _("11 to 15 knots"), _("16 to 20 knots"), _("21 to 25 knots"), _("26 to 30 knots"), _("31 to 35 knots"), _("36 to 40 knots"), _("over 40 knots ") }; disp_arr(ship_average_speeds,G_N_ELEMENTS(ship_average_speeds),m_ship_average_speed,'0',_("Ship average speed") ); } }; /// 0sTTT -- Sea surface temperature HEADTK(0sTTT) { /// s -- sign of temperature (0=positive, 1=negative) char m_temperature_sign ; /// TTT -- Temperature in .1 C int m_temperature ; const char * m_temperature_type ; bool CheckParams() { switch(m_temperature_sign) { case '0': case '1': m_temperature_type = _("Intake measurement"); break; case '2': case '3': m_temperature_type = _("Bucket measurement"); break; case '4': case '5': m_temperature_type = _("Hull contact sensor"); break; case '6': case '7': m_temperature_type = _("Other"); break; default : m_temperature_type = _("Inconsistent"); break ; } switch(m_temperature_sign) { case '1': case '3': case '5': case '7': m_temperature_sign = '1' ; break ; case '0': case '2': case '4': case '6': m_temperature_sign = '0' ; break ; default : return false ; } return true ; } public: /// TODO: Group terminator (=;) is detected before and could be removed from regular expressions. GENTK( 0sTTT, "0[01234567/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_temperature_sign = '/'; m_temperature = 999; m_temperature_type = NULL; if( 0 == strncmp( str, "0////", 5 ) ) return true ; return ( 2 == sscanf( str, "0%c%3d", &m_temperature_sign, &m_temperature ) ) && CheckParams() && CheckCelsius( m_temperature_sign, m_temperature ); } /// TTT -- Temperature in .1 C. s -- sign of temperature (0=positive, 1=negative) void Print() const { if( m_temperature_sign != '/' ) AppCelsius( this, _("Sea surface temperature"), m_temperature_sign, m_temperature ); else Append( _("Sea surface temperature"), _("Unspecified") ); if( m_temperature_type == NULL ) Append( _("Temperature type"), _("Unspecified") ); else Append( _("Temperature type"), m_temperature_type ); } }; /// 1PPHH -- Wave heights in 0.5 m increments HEADTK(1PPHH) { /// PP -- Period of waves in seconds int m_waves_period; /// HH -- Height of waves in 0.5 m increments int m_waves_height; public: GENTK( 1PPHH, "1[0-9/]{2}[0-9/]{2}" ) bool Parse( const char * str ) { m_waves_period = 0; m_waves_height = 0; return ( 0 == strncmp( str, "1////", 5 ) ) || ( 2 == sscanf( str, "1%2d%2d", &m_waves_period, &m_waves_height ) ); } void Print() const { Append( _("Waves period"), m_waves_period, Unit_seconds ); Append( _("Waves height"), 0.5 * m_waves_height, Unit_meters ); } }; /// http://www.top-wetter.de/themen/synopschluessel.htm says that 1PPHH is instrumented, /// that 2PPHH is not and 70HHH is not instrumented either. Figures should be close however. HEADTK(2PPHH) { int m_waves_period; int m_waves_height; public: /// 2PPHH -- Wave period and heights (instrumented) GENTK( 2PPHH, "2[0-9/]{2}[0-9/]{2}" ) bool Parse( const char * str ) { m_waves_period = -1; m_waves_height = -1; if( 0 == strcmp( str, "2////") ) return true; int nbMtch = sscanf( str, "2%2d%2d", &m_waves_period, &m_waves_height ); if(nbMtch != 2) return false ; /// Wave heights must be realistic, forty meters is too high.. if( m_waves_height > 80 ) return false ; return true; } void Print() const { if( m_waves_period >= 0 ) Append( _("Instrumented waves period"), m_waves_period, Unit_seconds ); if( m_waves_height >= 0 ) Append( _("Instrumented waves height"), 0.5 * m_waves_height, Unit_meters ); } }; /** Generally speaking: Any element not reported are normally reported with a slash. If an entire group of elements is not reported, skip the group completely (Do not report a group as ///// ) */ /// 3dddd -- Direction of swells (up to 2 swells) HEADTK(3dddd) { int m_wind_direction1 ; int m_wind_direction2 ; /// TODO: The direction should be smaller than 36. void wind_dir( const char * title, int dir ) const { if( dir >= 0 ) Append( title, dir * 10, Unit_degrees ); } public: GENTK( 3dddd, "3[0-9/]{4}" ) bool Parse( const char * str ) { m_wind_direction1 = -1; m_wind_direction2 = -1; if( 0 == strcmp( str, "3////") ) return true; return ( 2 == sscanf( str, "3%2d%2d", &m_wind_direction1, &m_wind_direction2 ) ) || ( 1 == sscanf( str, "3//%2d", &m_wind_direction2 ) ) || ( 1 == sscanf( str, "3%2d//", &m_wind_direction1 ) ); } void Print() const { wind_dir( _("Direction of primary swell waves"), m_wind_direction1 ); wind_dir( _("Direction of secondary swell waves"), m_wind_direction2 ); } }; /// 4PPHH -- Period and direction of first set of swells HEADTK(4PPHH) { int m_swell_waves_period ; int m_swell_waves_height ; public: GENTK( 4PPHH, "4[0-9/]{4}" ) bool Parse( const char * str ) { m_swell_waves_period = -1; m_swell_waves_height = -1; if( 0 == strcmp( str, "4////") ) return true; return ( 2 == sscanf( str, "4%2d%2d", &m_swell_waves_period, &m_swell_waves_height ) ) || ( 1 == sscanf( str, "4%2d//", &m_swell_waves_period ) ); } void Print() const { if( m_swell_waves_period >= 0 ) Append( _("Primary swell waves period"), m_swell_waves_period, Unit_seconds ); if( m_swell_waves_height >= 0 ) Append( _("Primary swell waves height"), 0.5 * m_swell_waves_height, Unit_meters ); } }; /// 5PPHH -- Period and direction of second set of swells HEADTK(5PPHH) { int m_swell_waves_period ; int m_swell_waves_height ; public: GENTK( 5PPHH, "5[0-9/]{4}" ) bool Parse( const char * str ) { m_swell_waves_period = -1; m_swell_waves_height = -1; if( 0 == strcmp( str, "5////") ) return true; int nbMtch = sscanf( str, "5%2d%2d", &m_swell_waves_period, &m_swell_waves_height ); if( nbMtch != 2 ) return false ; /// Realistic values only. Waves are not 40 meters high. if( m_swell_waves_height > 80 ) return false ; return true ; } void Print() const { if( m_swell_waves_period >= 0 ) Append( _("Secondary swell waves period"), m_swell_waves_period, Unit_seconds ); if( m_swell_waves_height >= 0 ) Append( _("Secondary swell waves height"), 0.5 * m_swell_waves_height, Unit_meters ); } }; /// 6IEER -- Ice accretion on ships HEADTK(6IEER) { char m_ice_accretion_code; int m_ice_accretion_thickness; char m_ice_accretion_rate; public: GENTK( 6IEER, "6[0-5/][0-9/]{2}[0-4/]" ) bool Parse( const char * str ) { m_ice_accretion_code = '_'; m_ice_accretion_thickness = -1; m_ice_accretion_rate = '_'; if( 0 == strcmp( str, "6////" ) ) return true; return ( 3 == sscanf( str, "6%c%2d%c", &m_ice_accretion_code, &m_ice_accretion_thickness, &m_ice_accretion_rate ) ); } void Print() const { static const char * ice_accretion_codes[] = { _("Not relevant"), // Should not happen, but it does. _("Icing from ocean spray"), _("Icing from fog"), _("Icing from spray and fog"), _("Icing from rain"), _("Icing from spray and rain") }; disp_arr(ice_accretion_codes,G_N_ELEMENTS(ice_accretion_codes),m_ice_accretion_code,'0',_("Ice accretion code") ); if( m_ice_accretion_thickness >= 0 ) Append( _("Ice accretion thickness"), m_ice_accretion_thickness, Unit_centimeters ); else Append( _("Ice accretion thickness"), _("Not relevant") ); static const char * ice_accretion_rates[] = { _("Ice not building up"), _("Ice building up slowly"), _("Ice building up rapidly"), _("Ice melting or breaking up slowly"), _("Ice melting or breaking up rapidly") }; disp_arr(ice_accretion_rates,G_N_ELEMENTS(ice_accretion_rates),m_ice_accretion_rate,'0',_("Ice accretion rate") ); } }; /// 70HHH -- Wave heights to 0.1 m (instrumented) HEADTK(70HHH) { int m_wave_height ; public: /// This group does not appear in NWSOH document. GENTK( 70HHH, "70[0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_wave_height = -1; return ( 0 == strncmp( str, "70///", 5 ) ) || ( 1 == sscanf( str, "70%3d", &m_wave_height ) ); } void Print() const { const char * txt = _("Wave height"); if( m_wave_height >= 0 ) Append( txt, m_wave_height * 0.1, Unit_meters ); else Append( txt, _("Undetermined"), Unit_meters ); } }; /// 8aTTT -- Wet bulb temperature HEADTK(8aTTT) { char m_wet_bulb_sign_type ; char m_temperature_sign ; int m_wet_bulb_temperature ; const char * m_title ; /// Called once we managed to extract the arguments. bool CheckParams() { switch( m_wet_bulb_sign_type ) { case '0': m_temperature_sign = '0'; m_title = _("Positive or zero measured"); break; case '1': m_temperature_sign = '1'; m_title = _("Negative measured"); break; case '2': m_temperature_sign = '1'; m_title = _("Iced bulb measured"); break; case '5': m_temperature_sign = '0'; m_title = _("Positive or zero computed"); break; case '6': m_temperature_sign = '1'; m_title = _("Negative computed"); break; case '7': m_temperature_sign = '1'; m_title = _("Iced bulb computed"); break; default : m_temperature_sign = '/'; m_title = _("Inconsistent"); return false; }; return true; } public: GENTK( 8aTTT, "8[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { m_wet_bulb_sign_type = '/'; m_temperature_sign = '/'; m_wet_bulb_temperature = 0 ; m_title = "Not specified"; if( 0 == strncmp( str, "8////", 5 ) ) return true; return ( 2 == sscanf( str, "8%c%3d", &m_wet_bulb_sign_type, &m_wet_bulb_temperature ) ) && CheckParams(); } void Print() const { static const std::string sep(":"); std::string title = _("Web bulb temperature") + sep + m_title ; AppCelsius( this, title.c_str(), m_temperature_sign, m_wet_bulb_temperature ); } }; /// Separator for ice detection. HEADTK(ICE) { public: // TODO: It is possible to have free text after the string ICE. GENTK( ICE, "ICE" ) bool Parse( const char * str ) { return 0 == strcmp( str, "ICE" ); } void Print() const { Append( _("Type"), "{ICE}" ); } bool CanComeFirst(void) const { return false ; } }; /// Appears only in NWSOH document. /// http://www.ndbc.noaa.gov/ice/sea_ice.shtml /// Data reported in Ships Synoptic Code, Group 2 ICE section (ciSibiDizi). HEADTK(cSbDz) { char m_sea_ice_arrangement; char m_sea_ice_development_stage; char m_ice_of_land_origin; char m_bearing_of_principle_ice_edge; char m_sea_ice_situation ; public: /// There might be four chars only ?? GENTK( cSbDz, "[0-9/]{4}[0-9/]?[;=]?" ) bool Parse( const char * str ) { return ( 5 == sscanf( str, "%c%c%c%c%c", &m_sea_ice_arrangement, &m_sea_ice_development_stage, &m_ice_of_land_origin, &m_bearing_of_principle_ice_edge, &m_sea_ice_situation ) ); } void Print() const { /// ci = Concentration or Arrangement of Sea Ice static const char * sea_ice_arrangements[] = { _("No sea ice in sight"), _("Ship in open lead more than 1 nautical mile wide, or ship in fast ice with no boundary beyond limit of visibility"), _("Sea ice present in concentrations less than 3/10 (3/8); open water or very open pack ice"), _("4/10 to 6/10 (3/8 to less than 6/8); open pack ice"), _("7/10 to 8/10 (6/8 to less than 7/8); close pack ice"), _("9/10 or more, but not 10/10 (7/8 to less than 8/8); very close pack ice"), _("Strips and patches of pack ice with open water between"), _("Strips and patches of close or very close pack ice with areas of lesser concentration between"), _("Fast ice with open water, very open or open pack ice to seaward of the ice boundary"), _("Fast ice with close or very close pack ice to seaward of the ice boundary") }; disp_arr(sea_ice_arrangements,G_N_ELEMENTS(sea_ice_arrangements),m_sea_ice_arrangement,'0', _("Concentration or arrangement of Sea Ice") ); /// Si = Sea Ice Stage of Development static const char * sea_ice_development_stages[] = { _("New ice only (frail ice, grease ice, slush ice, shuga)"), _("Nilas or ice rind, less than 10 cm thick"), _("Young ice (grey ice, grey-white ice), 10-30 cm thick"), _("Predominantly new and/or young ice with some first year ice"), _("Predominantly thin first-year ice with some new and/or young ice"), _("All thin first-year ice (30-70 cm thick)"), _("Predominantly medium first-year ice (70-120 cm thick) and thick first-year ice (more than 120 cm thick) with some thinner (younger) first-year ice"), _("All medium and first-year ice"), _("Predominantly medium and thick first-year ice with some old ice (usually more than 2 meters thick)"), _("Predominantly old ice") }; disp_arr(sea_ice_development_stages,G_N_ELEMENTS(sea_ice_development_stages),m_sea_ice_development_stage,'0', _("Sea Ice Stage of Development") ); /// bi = Ice of Land Origin static const char * ice_of_land_origins[] = { _("No ice of land origin"), _("1-5 icebergs, no growlers or bergy bits"), _("6-10 icebergs, no growlers or bergy bits"), _("11-20 icebergs, no growlers or bergy bits"), _("Up to and including 10 growlers and bergy bits - no icebergs"), _("More than 10 growlers and bergy bits - no icebergs"), _("1-5 icebergs with growlers and bergy bits"), _("6-10 icebergs with growlers and bergy bits"), _("11-20 icebergs with growlers and bergy bits"), _("More than 20 icebergs with growlers and bergy bits - a major hazard to navigation") }; disp_arr(ice_of_land_origins,G_N_ELEMENTS(ice_of_land_origins),m_ice_of_land_origin,'0', _("Ice of Land Origin") ); /// Di = Bearing of Principle Ice Edge static const char * bearing_of_principle_ice_edges[] = { _("Ship in shore or flaw lead"), _("Principle ice edge towards NE"), _("Principle ice edge towards E"), _("Principle ice edge towards SE"), _("Principle ice edge towards S"), _("Principle ice edge towards SW"), _("Principle ice edge towards W"), _("Principle ice edge towards NW"), _("Principle ice edge towards N"), _("Not determined (ship in ice)") }; disp_arr(bearing_of_principle_ice_edges,G_N_ELEMENTS(bearing_of_principle_ice_edges),m_bearing_of_principle_ice_edge,'0', _("Bearing of Principle Ice Edge") ); /// zi = Present Sea Ice Situation and Three Hour Trend static const char * sea_ice_situations[] = { _("Ship in open water with floating ice in sight"), _("Ship in easily penetrable ice; conditions improving"), _("Ship in easily penetrable ice; conditions not changing"), _("Ship in easily penetrable ice; conditions worsening"), _("Ship in ice difficult to penetrate; conditions improving"), _("Ship in ice difficult to penetrate; conditions not changing"), _("Ice forming and floes freezing together"), _("Ice under slight pressure"), _("Ice under moderate or severe pressure"), _("Ship beset") }; disp_arr(sea_ice_situations,G_N_ELEMENTS(sea_ice_situations),m_sea_ice_situation,'0', _("Present Sea Ice Situation and Three Hour Trend") ); } /// In fact, completely dependent on the previous token. THIS SHOULD BE ENFORCED. bool CanComeFirst(void) const { return false ; } }; /// 333 Group - Special / Climatological Data HEADTK(333) { public: GENTK( 333, "333" ) bool Parse( const char * str ) { return 0 == strcmp( str, "333" ); } void Print() const { Section( _("Special or climatological data") ); } }; /// 0.... -- Regionally developed data HEADTK(0____) { char m_not_decoded_yet[5] ; public: GENTK( 0____, "0[0-9A-Z/]{2}[0-9A-Z]{2}" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "0%4s", m_not_decoded_yet ) ); } void Print() const { Append( _("Regionally developed data"), m_not_decoded_yet ); } }; /// 1sTTT_max -- Maximum temperature over previous 24 hours HEADTK(1sTTT_max) { /// s -- sign of temperature (0=positive, 1=negative) char m_temperature_sign ; /// TTT -- Temperature in .1 C int m_temperature ; public: GENTK( 1sTTT_max, "1[01/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_temperature_sign = '/'; m_temperature = 0; if( 0 == strncmp( str, "1////", 5 ) ) return true ; return ( 2 == sscanf( str, "1%c%3d", &m_temperature_sign, &m_temperature) ) && ( strchr( "01", m_temperature_sign ) != NULL ) && CheckCelsius( m_temperature_sign, m_temperature ); } /// s -- sign of temperature (0=positive, 1=negative). TTT -- Temperature in .1 C void Print() const { AppCelsius( this, _("Maximum 24 hours temperature"), m_temperature_sign, m_temperature ); } }; /// 2sTTT_min -- Minimum temperature over previous 24 hours HEADTK(2sTTT_min) { /// s -- sign of temperature (0=positive, 1=negative) char m_temperature_sign ; /// TTT -- Temperature in .1 C int m_temperature ; public: /// 12- bzw. 15-stündige Minimumtemperatur (wird nur um 06, 09 und 18 UTC gemeldet) GENTK( 2sTTT_min, "2[01/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { int nbMtch = sscanf( str, "2%c%3d", &m_temperature_sign, &m_temperature); switch( nbMtch) { case 0 : return false; case 1 : return 0 == strcmp( str + 1, "////" ); case 2 : return CheckCelsius( m_temperature_sign, m_temperature ); default: return false; } } /// s -- sign of temperature (0=positive, 1=negative) /// TTT -- Minimum temperature over previous 24 hours in .1 C (if sign is 9, TTT is relative humidity) void Print() const { AppCelsius( this, _("Minimum temperature over previous 24 hours"), m_temperature_sign, m_temperature ); } }; /// Not sure of how it should be decoded. #ifdef DECODED_3Ejjj /// Can be 3EssTgTg : http://www.ogimet.com/docs/WMO306vol-II.pdf /// TgTg Ground (grass) minimum temperature of the preceding night, in whole degrees Celsius, its sign being given by sn. /// (3-group in Section 3 of FM 12) HEADTK(3Ejjj) { char m_ground_state ; int m_temperature ; bool m_valid_temperature ; public: GENTK( 3Ejjj, "3[0-9/][/01][/0-9]{2}[;=]?" ) // No regional decision has been made for the use of these letters so they will be encoded as solidi (///). bool Parse( const char * str ) { char char_sign, d1, d2 ; int r = sscanf( str, "3%c%c%c%c", &m_ground_state, &char_sign, &d1, &d2 ); if( r != 4 ) return false ; if( ( d1 == '/' ) ^ ( d2 == '/' ) ) return false ; if( ( d1 == '/' ) == ( d2 == '/' ) ) { m_valid_temperature = false ; return true ; } m_valid_temperature = true ; m_temperature = 10 * ( d1 - '0' ) + ( d2 - '0' ); if( char_sign == '1' ) m_temperature = -m_temperature ; return true ; } void Print() const { /// Code table 0901 E: State of the ground without snow or measurable ice cover static const char * ground_without_snow[] = { _("Surface of ground dry (without cracks and no appreciable amount of dust or loose sand)"), _("Surface of ground moist"), _("Surface of ground wet (standing water in small or large pools on surface)"), _("Flooded"), _("Surface of ground frozen"), _("Glaze on ground"), _("Loose dry dust or sand not covering ground completely"), _("Thin cover of loose dry dust or sand covering ground completely"), _("Moderate or thick cover of loose dry dust or sand covering ground completely"), _("Extremely dry with cracks") }; FM12CodeTable( ground_without_snow, 0901, _("State of the ground without snow or measurable ice cover") ); disp_arr(ground_without_snow,G_N_ELEMENTS(ground_without_snow),m_ground_state,'0',_("State of the ground without snow or measurable ice cover") ); if( m_valid_temperature ) { Append( _("Ground grass minimum temperature of preceding night"), m_temperature, Unit_Celsius ); } } }; #else /// 3Ejjj -- Regionally developed data HEADTK(3Ejjj) { char m_not_decoded_yet[5] ; public: /// TODO: See here: http://www.met.fu-berlin.de/~stefan/fm12.html#32 GENTK( 3Ejjj, "3[0-9A-Z/]{4}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "3%4s", m_not_decoded_yet ) ); } void Print() const { Append( _("Regionally developed data"), m_not_decoded_yet ); } }; #endif /// 4Esss -- Snow depth HEADTK(4Esss) { char m_snow_cover ; int m_snow_depth ; public: GENTK( 4Esss, "4[0-9/][0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "4%c%3d", &m_snow_cover, &m_snow_depth ) ); } // http://fr.scribd.com/doc/86346935/Land-Synoptic-Code void Print() const { /// E-prime -- State of ground with snow cover static const char *snow_covers[] = { _("Predominantly covered with ice"), _("Compact or wet snow covering less than half of ground"), _("Compact or wet snow covering more than half of ground but not completely covered"), _("Even layer of compact or wet snow covering entire ground"), _("Uneven layer of compact or wet snow covering entire ground"), _("Loose dry snow covering less than half of ground"), _("Loose dry snow covering more than half of ground but not completely covered"), _("Even layer of loose dry snow covering entire ground"), _("Uneven layer of loose dry snow covering entire ground"), _("Snow covering ground completely with deep drifts ") }; disp_arr(snow_covers,G_N_ELEMENTS(snow_covers),m_snow_cover,'0',_("State of ground with snow cover") ); FM12CodeTable( snow_covers, 0975, _("State of the ground with snow cover or measurable ice cover") ); /// sss -- snow depth in cm: Code table 3889 sss : Total depth of snow switch( m_snow_depth ) { case 0 : Append( _("Snow depth"), _("Not used") ); break; default : Append( _("Snow depth"), m_snow_depth, Unit_centimeters ); break; case 997 : Append( _("Snow depth"), _("Less than 0.5 cm") ); break; case 998 : Append( _("Snow depth"), _("Snow cover, not continuous") ); break; case 999 : Append( _("Snow depth"), _("Measurement impossible or inaccurate") ); break; } FM12CodeTable( , 3889, _("Total depth of snow") ); } }; /// 5jjjj -- Additional information HEADTK(5jjjj) { char m_not_decoded_yet[5] ; public: GENTK( 5jjjj, "5[012346789/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "5%4s", m_not_decoded_yet ) ) || ( 0 == strncmp( str, "5////", 5 ) ); } void Print() const { Append( _("Additional information"), m_not_decoded_yet ); } }; /// 553SS -- Sonnenscheindauer der letzten ganzen bzw. halben* Stunde in 1/10 Stunden HEADTK(553SS) { int m_Sonnenscheindauer; public: GENTK( 553SS, "553[0-9/]{2}[;=]?" ) bool Parse( const char * str ) { m_Sonnenscheindauer = -1; return ( 0 == strncmp( str, "553//", 5 ) ) || ( 1 == sscanf( str, "553%2d", &m_Sonnenscheindauer ) ); } void Print() const { const char * txt = _("Sonnenscheindauer der letzten ganzen"); if( m_Sonnenscheindauer < 0 ) Append( txt, _("Undetermined"), Unit_hours ); else Append( txt, m_Sonnenscheindauer / 10.0, Unit_hours ); } }; /* Not sure: http://www.met.fu-berlin.de/~stefan/fm12.html#32 * 55SSS -- Sonnenscheindauer des Vortags in 1/10 Stunden (wird nur um 06 UTC gemeldet) * 553SS -- Sonnenscheindauer der letzten ganzen bzw. halben* Stunde in 1/10 Stunden */ /// 55jjj jjjjj -- Additional information (can be multiple groups) HEADTK(55jjj) { char m_not_decoded_yet[5] ; public: // Not sure it can really have four chars. GENTK( 55jjj, "55[012456789/][0-9/]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "55%3s", m_not_decoded_yet ) ); } void Print() const { Append( _("Undecoded extra information"), m_not_decoded_yet ); } }; /// Can be added several times after 55jjj HEADTK(jjjjj) { char m_not_decoded_yet[5] ; public: GENTK( jjjjj, "[0-9/]{5}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "%5s", m_not_decoded_yet ) ); } void Print() const { Append( _("Undecoded extra information"), m_not_decoded_yet ); } /// It is dependent on the previous token. bool CanComeFirst(void) const { return false ; } }; /// 2FFFF -- Summe der Globalstrahlung des Vortags in J/cm2 HEADTK(2FFFF) { int m_global_strahlung; public: GENTK( 2FFFF, "2[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { m_global_strahlung = -1; return ( 0 == strncmp( str, "2////", 5 ) ) || ( 1 == sscanf( str, "2%4d", &m_global_strahlung ) ); } void Print() const { /// Global Strahlung const char * txt = _("Global radiation"); if( m_global_strahlung >= 0 ) Append( txt, m_global_strahlung, "J/cm2" ); else Append( txt, _("Undetermined") ); } }; /// 3FFFF -- Diffuse Himmelsstrahlung der letzten ganzen bzw. halben* Stunde in kJ/m2 = 1/10 J/cm2 HEADTK(3FFFF) { int m_himmel_strahlung; public: GENTK( 3FFFF, "3[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { m_himmel_strahlung = -1; return ( 0 == strncmp( str, "3////", 5 ) ) || ( 1 == sscanf( str, "3%4d", &m_himmel_strahlung ) ); } /// Diffuse Himmelsstrahlung der letzten ganzen bzw. halben* Stunde void Print() const { Append( _("Diffuse sky radiation of last half hour"), m_himmel_strahlung, "kJ/m2" ); } }; /// 4FFFF -- Atmosphärische Wärmestrahlung der letzten ganzen bzw. halben* Stunde HEADTK(4FFFF) { int m_waerme_strahlung; public: GENTK( 4FFFF, "4[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "4%4d", &m_waerme_strahlung ) ); } /// Atmosphärische Wärmestrahlung der letzten ganzen bzw. halben* Stunde void Print() const { Append( _("Atmospheric thermal radiation of last half hour"), m_waerme_strahlung, "kJ/m2" ); } }; /// 6RRRtb -- Liquid precipitation typedef CLASSTK(6RRRt) CLASSTK(6RRRtb); /// 7RRRR -- 24 hour precipitation in mm HEADTK(7RRRR) { int m_24h_precipitations_mm ; public: GENTK( 7RRRR, "7[0-9]{4}=?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "7%4d", &m_24h_precipitations_mm ) ); } void Print() const { const char * precip = _("24 hours precipitations"); if( m_24h_precipitations_mm == 9999 ) Append( precip, _("None") ); else Append( precip, m_24h_precipitations_mm, Unit_mm ); } }; static const char * cloud_genuses[] = { _("Cirrus (Ci)"), _("Cirrocumulus (Cc)"), _("Cirrostratus (Cs)"), _("Altocumulus (Ac)"), _("Altostratus (As)"), _("Nimbostratus (Ns)"), _("Stratocumulus (Sc)"), _("Stratus (St)"), _("Cumulus (Cu)"), _("Cumulonimbus (Cb)") }; /// 8NChh -- Cloud layer data HEADTK(8NChh) { char m_cloud_cover ; char m_cloud_genus ; int m_cloud_base_height ; public: GENTK( 8NChh, "8[0-9/][0-9/][0-9/]{2}[;=]?" ) bool Parse( const char * str ) { m_cloud_cover = '0'; m_cloud_genus = '/'; m_cloud_base_height = 0 ; return ( 3 == sscanf( str, "8%c%c%2d", &m_cloud_cover, &m_cloud_genus, &m_cloud_base_height ) ) || ( 2 == sscanf( str, "8%c%c//", &m_cloud_cover, &m_cloud_genus ) ) || ( 0 == strncmp( str, "80///", 5 ) ); } void Print() const { // N -- cloud cover disp_arr(cloud_covers,G_N_ELEMENTS(cloud_covers),m_cloud_cover,'0',_("Cloud cover")); // C -- genus of cloud disp_arr(cloud_genuses,G_N_ELEMENTS(cloud_genuses),m_cloud_genus,'0',_("Cloud genus") ); // * hh -- height of cloud base const char * title = _("Cloud base height"); switch( m_cloud_base_height ) { case 0 : Append( title, _("Less than 30 meters") ); break; case 1 ... 50 : Append( title, m_cloud_base_height * 30, Unit_meters ); break; case 51 ... 56 : Append( title, 1500 + ( m_cloud_base_height - 50 ) * 50, Unit_meters ); break; case 57 ... 80 : Append( title, 1800 + ( m_cloud_base_height - 56 ) * 300, Unit_meters ); break; case 81 ... 88 : Append( title, 9000 + ( m_cloud_base_height - 80 ) * 1500, Unit_meters ); break; case 89 : Append( title, _("Greater than 21000 m") ); break; case 90 ... 99 : disp_arr(cloud_bases,G_N_ELEMENTS(cloud_bases),m_cloud_base_height,90,title ); break; default : break; } } }; /// 9SSss -- Supplementary information /// http://www.met.fu-berlin.de/~stefan/fm12.html#32 /// 9SPSPspsp -- Besondere Wettererscheinungen und zusätzliche Informationen (Gruppe kann mehrmals verschlüsselt werden) HEADTK(9SSss) { int m_figure ; int m_value ; public: GENTK( 9SSss, "9[0-9]{2}[0-9/]{2}[;=]?" ) bool Parse( const char * str ) { m_value = -1 ; return ( 2 == sscanf( str, "9%2d%2d", &m_figure, &m_value ) ) || ( 1 == sscanf( str, "9%2d//", &m_figure ) ); } // TODO: Description of decoding alone takes about 100 lines. // http://www.met.fu-berlin.de/~stefan/fm12.html#32 void Print() const { Append( _("Figure"), m_figure ); Append( _("Value"), m_value ); } }; /// 444 Group - National data, clouds. HEADTK(444) { public: GENTK( 444, "444" ) bool Parse( const char * str ) { return 0 == strcmp( str, "444" ); } void Print() const { Section( "National data, clouds" ); } }; /// NCHHC /// The coding can be more complicated, with several groups. /// http://www.top-wetter.de/themen/synopschluessel.htm#444 HEADTK(NCHHC) { char m_cloud_cover ; char m_cloud_genus ; int m_cloud_top_height ; char m_cloud_characteristics ; public: GENTK( NCHHC, "[0-9][0-9][0-9]{2}[0-9][;=]?" ) bool Parse( const char * str ) { m_cloud_cover = '0'; m_cloud_genus = '/'; m_cloud_top_height = 0 ; m_cloud_characteristics = '/'; return ( 4 == sscanf( str, "%c%c%2d%c", &m_cloud_cover, &m_cloud_genus, &m_cloud_top_height, &m_cloud_characteristics ) ); } void Print() const { // N -- cloud cover disp_arr(cloud_covers,G_N_ELEMENTS(cloud_covers),m_cloud_cover,'0',_("Cloud cover")); // C -- genus of cloud disp_arr(cloud_genuses,G_N_ELEMENTS(cloud_genuses),m_cloud_genus,'0',_("Cloud genus") ); // * hh -- height of cloud top Append( _("Cloud top height"), m_cloud_top_height * 100, Unit_meters ); static const char * cloud_characteristics[] = { _("Scattered clouds"), // Vereinzelte Wolken _("Flat, closed cloud cover"), // Flache, geschlossene Wolkendecke _("Shallow clouds with small apertures"), // Flache Wolkendecke mit kleinen Durchbrüchen _("Shallow clouds with large openings"), // Flache Wolkendecke mit großen Durchbrüchen _("Corrugated, solid cloud cover"), // Gewellte, geschlossene Wolkendecke _("Undulating clouds with small apertures"), // Gewellte Wolkendecke mit kleinen Durchbrüchen _("Undulating clouds with large openings"), // Gewellte Wolkendecke mit großen Durchbrüchen _("Closed billows clouds"), // Geschlossene Wogenwolkendecke _("Groups of waves of clouds"), // Gruppen von Wogenwolken _("Several layers of clouds at different altitudes") // Mehrere Wolkenschichten in verschiedenen Höhen }; disp_arr(cloud_characteristics,G_N_ELEMENTS(cloud_characteristics),m_cloud_characteristics,'0',_("Cloud characteristics") ); } }; /// 555 Group - National code group HEADTK(555) { public: GENTK( 555, "555" ) bool Parse( const char * str ) { return 0 == strcmp( str, "555" ); } void Print() const { Section( _("National code group") ); } }; /// 0sTTT_land -- Land surface temperature /// s -- sign of temperature (0=positive, 1=negative) /// TTT -- Temperature in .1 C HEADTK(0sTTT_land) { char m_temperature_sign ; int m_temperature ; public: // TODO: Do not know why, string finished by a semicolon. GENTK( 0sTTT_land, "0[01][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "0%c%3d", &m_temperature_sign, &m_temperature ) ) && ( strchr( "01", m_temperature_sign ) != NULL ) && CheckCelsius( m_temperature_sign, m_temperature ); } void Print() const { // s -- sign of temperature (0=positive, 1=negative) // TTT -- Temperature in .1 C AppCelsius( this, _("Land temperature 5 cm over surface"), m_temperature_sign, m_temperature ); } }; /// 1RRRr -- Niederschlagsmenge in der letzten ganzen bzw. halben* Stunde HEADTK(1RRRr) { int m_precipitation_amount ; char m_precipitation_duration ; public: GENTK( 1RRRr, "1[0-9/]{3}[0-9/][;=]?" ) bool Parse( const char * str ) { m_precipitation_amount = -1 ; m_precipitation_duration = '0' ; return ( 2 == sscanf( str, "1%3d%c", &m_precipitation_amount, &m_precipitation_duration ) ); } void Print() const { // RRR -- Precipitation amount in mm : Niederschlagsmenge const char * precip_amount = _("Precipitation amount"); switch( m_precipitation_amount ) { default : Append( precip_amount, m_precipitation_amount / 10.0, Unit_mm );break; case 999 : Append( precip_amount, _("Not measurable") );break; } const char * precip_dur = _("Precipitation duration"); // t -- Duration over which precipitation amount measured switch( m_precipitation_duration ) { case '0' ... '9' : Append( precip_dur, 6 * ( m_precipitation_duration - '0' ), Unit_minutes ); break; default : Append( precip_dur, _("Undetermined") ); break; } } }; /// 2sTTT_avg -- Tagesmittel der Lufttemperatur des Vortages HEADTK(2sTTT_avg) { char m_temperature_sign ; int m_temperature ; public: GENTK( 2sTTT_avg, "2[01][0-9]{3}[;=]?" ) bool Parse( const char * str ) { int nbMtch = sscanf( str, "2%c%3d", &m_temperature_sign, &m_temperature); switch( nbMtch) { case 0 : return false; case 1 : return 0 == strcmp( str + 1, "////" ); case 2 : return CheckCelsius( m_temperature_sign, m_temperature ); default: return false; } } /// s: sign of temperature (0=positive, 1=negative, 9 = RH). TTT: Temperature in .1 C (if sign is 9, TTT is relative humidity) void Print() const { AppCelsius( this, _("Daily mean air temperature of the previous day"), m_temperature_sign, m_temperature ); } }; HEADTK(22fff) { int m_wind_speed_meter_second; public: GENTK( 22fff, "22[0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "22%3d", &m_wind_speed_meter_second ) ); } void Print() const { Append( _("Wind speed 10 minutes average"), m_wind_speed_meter_second / 10.0, Unit_meters_second ); } }; HEADTK(23SS) { int m_sun_shine_duration; public: GENTK( 23SS, "23[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "23%2d", &m_sun_shine_duration ) ); } void Print() const { Append( _("Total hours of sunshine duration"), m_sun_shine_duration, Unit_minutes ); } }; HEADTK(24Wt) { char m_precipitation_indicator; char m_precipitation_duration; public: GENTK( 24Wt, "24[01236789]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "24%c%c", &m_precipitation_indicator, &m_precipitation_duration ) ); } void Print() const { // WR -- Indikator zur Niederschlagsgruppe und Kennzeichnung der Niederschlagsform static const char * Niederschlagsgruppen[] = { _("Kein Niederschlag"), _("Nur abgesetzte Niederschläge"), _("Nur flüssige abgesetzte Niederschläge"), _("Nur feste abgesetzte Niederschläge"), _("Undefined"), _("Undefined"), _("Niederschlag in flüssiger Form"), _("Niederschlag in fester Form"), _("Niederschlag in flüssiger und fester Form"), _("Niederschlagsmessung ausgefallen") }; // TODO: TRANSLATION disp_arr(Niederschlagsgruppen,G_N_ELEMENTS(Niederschlagsgruppen),m_precipitation_indicator,'0',_("Precipitations group") ); // t -- Duration over which precipitation amount measured display_precipitation( this, m_precipitation_duration ); } }; /// 25wzwz -- zusätzliche Wettererscheinung (Gruppe kann bis zu 4-mal verschlüsselt werden): HEADTK(25ww) { int m_wetter_erscheinung; public: GENTK( 25ww, "25[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "25%2d", &m_wetter_erscheinung ) ); } void Print() const { static const choice< int > wettererscheinungen[] = { // Kondensstreifen { 1, _("Sich schnell auflösende Kondensstreifen (Lebensdauer < 1 Minute)") }, { 2, _("Sich langsam auflösende Kondensstreifen (Lebensdauer 1 bis 14 Minuten)") }, { 3, _("Beständige Kondensstreifen (Lebensdauer > 15 Minuten)") }, { 4, _("Aufgelöste, vollständig in Cirrusbewölkung übergegangene Kondensstreifen") }, // Reif { 5, _("Strahlungsreif") }, { 6, _("Advektionsreif") }, { 7, _("Rauhreif") }, { 8, _("Rauheis") }, { 9, _("Klareis") }, // Decken aus festen Niederschlägen (> 50 % des Erdbodens bedeckend) {15, _("Grieseldecke") }, {16, _("Eiskörnerdecke") }, {17, _("Graupeldecke") }, {18, _("Hageldecke") }, // Wettererscheinungen {23, _("Eiskörner in der letzten Stunde") }, {24, _("Glatteisbildung in der letzten Stunde") }, {31, _("Sandfegen (unter Augenhöhe)") }, {32, _("Sandtreiben (über Augenhöhe)") }, {33, _("Sandverwehungen > 5 cm") }, {36, _("Schneeverwehungen > 20 cm") }, {45, _("nässender Nebel") }, // Glätteerscheinungen {71, _("Reifglätte") }, {75, _("Schneeglätte") }, {76, _("Eisglätte (überfrierende Nässe)") }, {77, _("Glatteis (gefrierender Regen/Sprühregen)") }, {81, _("Gefrierender Schauerniederschlag") }, // sonstige Erscheinungen {99, _("Böenwalze") } }; Append( _("Zusätzliche Wettererscheinung"), choice_map( wettererscheinungen, G_N_ELEMENTS(wettererscheinungen), m_wetter_erscheinung, _("Undefined") ) ); // TODO: TRANSLATION } }; /// 26fff -- mittlere Windgeschwindigkeit der letzten Stunde in 1/10 m/s HEADTK(26fff) { int m_wind_speed_meter_second; public: GENTK( 26fff, "22[0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "26%3d", &m_wind_speed_meter_second ) ); } void Print() const { Append( _("Last hour average wind speed"), m_wind_speed_meter_second / 10.0, Unit_meters_second ); } }; /// 3LGLGLsLs -- Anzahl der registrierten Blitze in den letzten 30 Minuten /// LG LG -- Gesamtzahl der Blitze /// Ls Ls -- Anzahl der Blitze starker Intensität HEADTK(3LLLL) { int m_Gesamtzahl_der_Blitze; int m_Anzahl_der_Blitze_starker_Intensitaet; public: GENTK( 3LLLL, "3[0-9]{4}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "2%2d%2d", &m_Gesamtzahl_der_Blitze, &m_Anzahl_der_Blitze_starker_Intensitaet ) ); } void Print() const { Append( _("Number of flashes"), m_Gesamtzahl_der_Blitze ); Append( _("Number of high-intensity flashes"), m_Anzahl_der_Blitze_starker_Intensitaet ); } }; /* * 4RwRwwzwz -- Wasseräquivalent der Schneedecke und zusätzliche Wettererscheinungen Rw Rw -- Spezifisches Wasseräquivalent der Schneedecke in 1/10 mm/cm wz wz -- zusätzliche Wettererscheinung: Kondensstreifen 01 -- sich schnell auflösende Kondensstreifen 02 -- sich langsam auflösende Kondensstreifen 03 -- beständige Kondensstreifen 04 -- aufgelöste, in Cirrusbewölkung übergegangene Kondensstreifen Reif 05 -- Strahlungsreif 06 -- Advektionsreif 07 -- Rauhreif 08 -- Rauheis 09 -- Klareis Decken aus festen Niederschlägen (> 50 % des Erdbodens bedeckend) 15 -- Grieseldecke 16 -- Eiskörnerdecke 17 -- Graupeldecke 18 -- Hageldecke Wettererscheinungen 23 -- Eiskörner in der letzten Stunde 24 -- Glatteisbildung in der letzten Stunde 31 -- Sandfegen, unter Augenhöhe 32 -- Sandtreiben, über Augenhöhe 33 -- Sandverwehungen > 5 cm 36 -- Schneeverwehungen > 20 cm Glätteerscheinungen 71 -- Reifglätte 75 -- Schneeglätte 76 -- Eisglätte (überfrierende Nässe) 77 -- Glatteis (gefrierender Regen/Sprühregen) 81 -- gefrierender Schauerniederschlag sonstige Erscheinungen 99 -- Böenwalze * 5s's's'tR -- Neuschneehöhe Hinweis: Mit dieser Gruppe wird in der Regel um 06 UTC die 24-stündige und um 18 UTC die 12-stündige Neuschneehöhe gemeldet. s's's' -- Neuschneehöhe in cm (997 = < 0.5 cm, 998 = Flecken oder Reste, 999 = Angabe nicht möglich) tR -- Bezugszeitraum, über welche die Neuschneehöhe gemessen wurde: 0 -- nicht aufgeführter oder vor dem Termin endender Zeitraum 1 -- 6 Stunden 2 -- 12 Stunden 3 -- 18 Stunden 4 -- 24 Stunden 5 -- 1 Stunde bzw. 30 Minuten (bei Halbstundenterminen) 6 -- 2 Stunden 7 -- 3 Stunden 8 -- 9 Stunden 9 -- 15 Stunden / -- Sondermessung wegen Überschreitung des Schwellenwerts (> 5 cm bzw. 10 cm in < 12 Stunden) * 7h'h'ZD' -- Dunst, Talnebel und Wolken unterhalb des Stationsniveaus h'h' -- Höhe der Obergrenze der Erscheinung über NN Z -- Entwicklung von Dunst, Talnebel und Wolken unterhalb des Stationsniveaus D' -- Sektor des Hauptanteils der Bedeckung mit der Erscheinung * 8Ns/hshs -- automatisch ermittelte Höhe von Wolkenschichten (Gruppe kann mehrmals verschlüsselt werden) Ns -- Bedeckungsgrad der Wolkenschicht in Achteln hs hs -- Höhe der Wolkenuntergrenze: 00 -- < 30 m (< 100 ft) 01 -- 30 m (100 ft) 02 -- 60 m (200 ft) 03 -- 90 m (300 ft) ... 50 -- 1500 m (5000 ft) ====================== 56 -- 1800 m (6000 ft) 57 -- 2100 m (7000 ft) ... 80 -- 9000 m (30000 ft) ======================= 81 -- 10500 m (35000 ft) 82 -- 12000 m (40000 ft) ... 88 -- 21000 m (70000 ft) 89 -- höher als 21000 m (> 70000 ft) ==================================== 90 -- 0 bis 49 m (0 - 166 ft) 91 -- 50 bis 99 m (167 - 333 ft) 92 -- 100 bis 199 m (334 - 666 ft) 93 -- 200 bis 299 m (667 - 999 ft) 94 -- 300 bis 599 m (1000 - 1999 ft) 95 -- 600 bis 999 m (2000 - 3333 ft) 96 -- 1000 bis 1499 m (3334 - 4999 ft) 97 -- 1500 bis 1999 m (5000 - 6666 ft) 98 -- 2000 bis 2499 m (6667 - 8333 ft) 99 -- 2500 m oder höher (> 8334 ft) * 910ff -- Höchste Windspitze in den letzten 10 Minuten (wird immer gemeldet!) */ /// 911ff -- Höchste Windspitze in der letzten Stunde (wird immer gemeldet!) HEADTK(911ff) { int m_hoechste_windspitze_letzten_stunde; public: GENTK( 911ff, "911[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "911%2d", &m_hoechste_windspitze_letzten_stunde ) ); } void Print() const { Append( _("Last hour maximum wind speed"), m_hoechste_windspitze_letzten_stunde, Unit_meters_second ); } }; /// 912ff -- Höchstes 10-Minuten-Mittel der Windgeschwindigkeit in der letzten Stunde (wird immer gemeldet!) HEADTK(912ff) { int m_hoechste_10mn_wind_geschwindigkeit_letzten_stunde; public: GENTK( 912ff, "912[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "912%2d", &m_hoechste_10mn_wind_geschwindigkeit_letzten_stunde ) ); } void Print() const { Append( _("Last hour ten minutes average wind speed"), m_hoechste_10mn_wind_geschwindigkeit_letzten_stunde, Unit_meters_second ); } }; /* * PIC INp -- Wolkenbedeckung von Bergen (Gruppe kann bis zu 2-mal verschlüsselt werden) I -- Kennziffer und Richtung des Berges Np -- Bedeckungsgrad des Berges mit Wolken in Achteln * BOT hesnTTT -- Temperaturen im Erdboden (werden immer gemeldet!) he -- Meßtiefe: 0 -- 0 cm 1 -- 5 cm 2 -- 10 cm 3 -- 20 cm 4 -- 50 cm 5 -- 100 cm 6 -- 200 cm sn -- Vorzeichen der Erdbodentemperatur (0 = positiv, 1 = negativ) TTT -- Erdbodentemperatur der angegebenen Meßtiefe in 1/10 Grad Celsius * 80000 -- Kenngruppe für ergänzende klimatologische Meß- und Beobachtungsdaten für die Klimaroutinen * 1RRRRWR -- 6-stündiger Niederschlag Hinweis: Diese Gruppe wird zu den Hauptterminen (00, 06, 12, 18 UTC) gemeldet. RRRR -- Niederschlagsmenge in 1/10 mm (0000 = trocken, 9999 = < 0.05 mm) WR -- Indikator zur Niederschlagsgruppe und Kennzeichnung der Niederschlagsform: 0 -- kein Niederschlag 1 -- nur abgesetzte Niederschläge (flüssig und fest) 2 -- nur flüssige abgesetzte Niederschläge 3 -- nur feste abgesetzte Niederschläge 6 -- gefallener Niederschlag in flüssiger Form 7 -- gefallener Niederschlag in fester Form 8 -- gefallener Niederschlag in flüssiger und fester Form 9 -- Niederschlagsmessung ausgefallen * 2SSSS -- Tagessumme der Sonnenscheindauer des Vortags in Minuten (wird um 06 UTC gemeldet) * 3fkfkfk< -- Höchste Windspitze des Vortags (00 - 24 UTC) in 1/10 m/s (wird um 06 UTC gemeldet) * 4fxkfxkfxk -- Höchstes 10-Minuten-Mittel der Windgeschwindigkeit des Vortags (00 - 24 UTC) in 1/10 m/s (wird um 06 UTC gemeldet) * 5RwRw -- Spezifisches Wasseräquivalent der Schneedecke in 1/10 mm/cm (wird nur montags, mittwochs und freitags um 06 UTC gemeldet, wenn die Schneehöhe mindestens 5 cm beträgt) * 6VAVAVBVBV CVC -- Niederschläge und Wettererscheinungen des Vortags (werden um 06 UTC gemeldet) VAVA -- Gefallener Niederschlag des Vortags (00 - 24 UTC): 000 -- kein gefallener Niederschlag 001 -- Regen (Sprüh-/Nieselregen, Regen, Regentropfen) 002 -- gefrierender Regen (gefrierender Sprüh-/Nieselregen, gefrierender Regen) 004 -- Schnee (Schnee, Schneekristalle, Schneeflocken) 008 -- Graupel (Schneegriesel, Reifgraupel, Frostgraupel, Eiskörner) 016 -- Hagel Hinweis: Bei gleichzeitigem Auftreten mehrerer Niederschlagsarten werden die jeweiligen Schlüsselzahlen addiert, z. B.: Regen und Schnee und Graupel = 001 + 004 + 008 = 013 VBVB -- Abgesetzter oder abgelagerter Niederschlag des Vortags (00 - 24 UTC): 000 -- kein abgesetzter oder abgelagerter Niederschlag 001 -- Tau (Strahlungstau, Advektionstau, weißer Tau) 002 -- Reif (Strahlungsreif, Advektionsreif) 004 -- Rauhreif/Rauhfrost 008 -- Rauheis/Klareis 016 -- Glatteis/Eisglätte 032 -- Decke aus festen Niederschlägen (mindestens 50 % des Bodens bedeckend) Hinweis: Bei gleichzeitigem Auftreten mehrerer abgesetzter Niederschläge werden die jeweiligen Schlüsselzahlen addiert, z. B.: Tau und Reif sowie Schneedecke = 001 + 002 + 032 = 035 VCVC -- Sonstige Wettererscheinungen des Vortags (00 - 24 UTC): 000 -- keine sonstigen Wettererscheinungen 001 -- Nebel (Nebel, Nebeltreiben) 002 -- Gewitter (Nahgewitter, Ferngewitter) 004 -- starker Wind (Windstärke 6 und 7 im 10-Min.-Mittel) 008 -- stürmischer Wind (Windstärke > 8 im 10-Min.-Mittel) Hinweis: Bei gleichzeitigem Auftreten mehrerer Wettererscheinungen werden die jeweiligen Schlüsselzahlen addiert, z. B.: Gewitter und stürmischer Wind = 002 + 008 = 010 * 7snTxkTxkTxk -- Maximumtemperatur des Vortags (00 - 24 UTC) (wird um 06 UTC gemeldet) sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) Txk Txk Txk -- Maximumtemperatur in 1/10 Grad Celsius * 8snTnkTnkTnk -- Minimumtemperatur des Vortags (00 - 24 UTC) (wird um 06 UTC gemeldet) sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) Tnk Tnk Tnk -- Minimumtemperatur in 1/10 Grad Celsius * 9snTgTgTgsTg -- Minimumtemperatur des Vortags (00 - 24 UTC) 5 cm über dem Erdboden bzw. der Schneedecke (wird um 06 UTC gemeldet) sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) Tg Tg Tg -- Erdbodenminimumtemperatur in 1/10 Grad Celsius sTg -- Bedeckung des Temperaturmeßfühlers 5 cm über dem Erdboden mit Schnee oder Eis am Vortag (0 = nein, 1 = ja, / = Angabe nicht möglich) */ /// Abschnitt 6 - Automatisch erzeugte Daten HEADTK(666) { public: GENTK( 666, "666" ) bool Parse( const char * str ) { return 0 == strcmp( str, "666" ); } void Print() const { Section( _("Automatisch erzeugte Daten") ); } }; /// 1snTxTxTx -- Maximumtemperatur der letzten Stunde /// sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) /// Tx Tx Tx -- Maximumtemperatur in 1/10 Grad Celsius HEADTK(1snTxTxTx) { char m_temperature_sign ; int m_temperature; public: GENTK( 1snTxTxTx, "1[01][0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "1%c%3d", &m_temperature_sign, &m_temperature) ) && CheckCelsius( m_temperature_sign, m_temperature ); } void Print() const { AppCelsius( this, _("Last hour maximum temperature"), m_temperature_sign, m_temperature ); } }; /// 2snTnTnTn -- Minimumtemperatur der letzten Stunde /// sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) /// Tn Tn Tn -- Minimumtemperatur in 1/10 Grad Celsius HEADTK(2snTxTxTx) { char m_temperature_sign ; int m_temperature; public: GENTK( 2snTxTxTx, "2[01][0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "2%c%3d", &m_temperature_sign, &m_temperature) ) && CheckCelsius( m_temperature_sign, m_temperature ); } void Print() const { AppCelsius( this, _("Last hour minimum temperature"), m_temperature_sign, m_temperature ); } }; /// 3snTnTnTn -- Minimumtemperatur 5 cm über dem Erdboden bzw. der Schneedecke in der letzten Stunde /// sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) /// Tn Tn Tn -- Erdbodenminimumtemperatur in 1/10 Grad Celsius /// 6VMxVMxVMxVMx/ VMnVMnVMnVMn> -- automatisch gemessene maximale/minimale meteorologische Sichtweite (MOR) der letzten ganzen bzw. halben Stunde (nur bei Halbstundenterminen) in m /// 7VMVMVMVM -- automatisch gemessene meteorologische Sichtweite (MOR) in m HEADTK(7VVVV) { int m_MOR; public: GENTK( 7VVVV, "7[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { m_MOR = -1; return ( 1 == sscanf( str, "7%4d", &m_MOR ) ) || ( 0 == strncmp( str, "7////", 5 ) ); } void Print() const { if(m_MOR >= 0) Append( _("MOR"), m_MOR, Unit_meters ); else Append( _("MOR"), _("Undetermined") ); } }; /* * 80000 -- Kenngruppe für automatisch erzeugte Niederschlagsdaten * 0RRRrx 1RRRrx 2RRRrx 3RRRrx 4RRRrx 5RRRrx 0, 1, 2, 3, 4, 5 (Gruppenkennziffer) -- Kennung der Zeitabschnitte der letzten Stunde: 0 -- 0. bis 9. Minute 1 -- 10. bis 19. Minute 2 -- 20. bis 29. Minute 3 -- 30. bis 39. Minute 4 -- 40. bis 49. Minute 5 -- 50. bis 59. Minute RRR -- 10-minütige Niederschlagshöhe in 1/10 mm rx -- Niederschlagsdauer im jeweiligen Zeitabschnitt in Minuten (0 = 10 Minuten bzw. kein Niederschlag gemessen) */ HEADTK(1VVff) { int m_visibility_metres; int m_gust_speed_knots; public: GENTK( 1VVff, "1[0-9/][0-9/]{3}" ) bool Parse( const char * str ) { m_visibility_metres = 0; m_gust_speed_knots = 0; if( 0 == strcmp( str, "1////" ) ) return true ; if( str[1] == '/' ) { return ( 1 == sscanf( str, "1/%3d", &m_gust_speed_knots ) ); } else { return ( 2 == sscanf( str, "1%2d%2d", &m_visibility_metres, &m_gust_speed_knots ) ); } } void Print() const { Append( _("Visibility"), m_visibility_metres, Unit_meters ); Append( _("Maximum gust speed in past 24 hours"), m_gust_speed_knots, Unit_knots ); } }; HEADTK(110ff) { int m_wind_speed_knots; public: GENTK( 110ff, "110[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "110%2d", &m_wind_speed_knots ) ); } void Print() const { Append( _("Wind speed at 10 meters"), m_wind_speed_knots, Unit_knots ); } }; HEADTK(220ff) { int m_wind_speed_knots; public: GENTK( 220ff, "220[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "220%2d", &m_wind_speed_knots ) ); } void Print() const { Append( _("Wind speed at 20 meters"), m_wind_speed_knots, Unit_knots ); } }; HEADTK(3GGmm) { int m_end_measure_hour; int m_end_measure_minute; public: GENTK( 3GGmm, "3[0-2][0-9][0-5][0-9][;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "3%2d%2d", &m_end_measure_hour, &m_end_measure_minute ) ) && ( m_end_measure_hour < 25 ); } void Print() const { Append( _("Time of peak wind since last observation"), hour_min( m_end_measure_hour, m_end_measure_minute ) ); } }; HEADTK(4ddff) { int m_peak_direction_degrees; int m_peak_speed_knots; public: GENTK( 4ddff, "4[0-9]{4}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "4%3d%3d", &m_peak_direction_degrees, &m_peak_speed_knots ) ); } void Print() const { Append( _("Direction"), 10.0 * m_peak_direction_degrees, Unit_degrees ); Append( _("Speed"), m_peak_speed_knots, Unit_knots ); } }; /// End time in hours and minutes of the latest 10-minute continuous wind measurements. HEADTK(6GGmm) { int m_end_measure_hour; int m_end_measure_minute; public: /// More details: http://atmo.tamu.edu/class/atmo251/BuoyCode.pdf GENTK( 6GGmm, "6[0-2][0-9][0-5][0-9][;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "6%2d%2d", &m_end_measure_hour, &m_end_measure_minute ) ) && ( m_end_measure_hour < 25 ); } void Print() const { Append( _("End time of latest 10-minute continuous wind measurement"), hour_min( m_end_measure_hour, m_end_measure_minute ) ); } }; /// 6 10-minute continuous wind measurements HEADTK(dddfff) { int m_direction_degrees; int m_speed_knots; public: GENTK( dddfff, "[0-9]{6}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "%3d%3d", &m_direction_degrees, &m_speed_knots ) ); } void Print() const { Append( _("Direction"), m_direction_degrees, _("degrees") ); Append( _("Speed"), m_speed_knots, _("knots") ); } }; // ---------------------------------------------------------------------------- /// Contains a Synop group and its length. struct synop_group { size_t m_usage_counter; // How many times did it match an input section. For debugging. section_t m_section ; size_t m_nb_toks ; const TOKGEN * m_tks ; synop_group( section_t g, size_t n, const TOKGEN * t ) : m_usage_counter(0), m_section(g), m_nb_toks(n), m_tks(t) {} friend std::ostream & operator<<( std::ostream & ostrm, const synop_group & syn ) { for( size_t i =0 ; i < syn.m_nb_toks; ++i ) { ostrm << RegexT::Name( syn.m_tks[i].m_rgx_idx ) << "-"; } return ostrm; } }; /// Contains all patterns of Synop sections. We hold a buffer of the last words and try to match /// it against all known patterns. static std::vector< synop_group > arrSynopGroups ; /// This defines a pattern which might mpatch a list of Synop tokens, i.e. a Synop section. #define TKLST(g, ... ) \ { \ static const TOKGEN hiddenTokGen[] = { __VA_ARGS__ }; \ arrSynopGroups.push_back( synop_group( g, G_N_ELEMENTS(hiddenTokGen), hiddenTokGen ) ); \ } static const void init_patterns(void) { static bool init = false ; if( init ) return ; init = true ; TKLST( SECTION_ZCZC_DLM,TK1(ZCZC),TK1(ZCZC_id) ); TKLST( SECTION_NNNN_DLM,TK1(NNNN) ); // http://www.nws.noaa.gov/tg/segment.html TKLST( SECTION_HEAD_GRP,TK1(TTAAii),TK1(CCCC),TK1(YYGGgg),TK1(RRx) ); TKLST( SECTION_HEAD_GRP,TK1(TTAAii),TK1(CCCC),TK1(YYGGgg),TK1(CCx) ); TKLST( SECTION_HEAD_GRP,TK1(TTAAii),TK1(CCCC),TK1(YYGGgg),TK1(AAx) ); TKLST( SECTION_HEAD_GRP,TK1(TTAAii),TK1(CCCC),TK1(YYGGgg),TK1(Pxx) ); TKLST( SECTION_IDENTLOC,TK1(IIiii),TK1(YYGGi),TK1(99LLL),TK1(QLLLL) ); // http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf // TODO: NOT SURE IIiii should be added at the end. TKLST( SECTION_IDENTLOC,TK1(AAXX),TK1(YYGGi) ); // http://www.ominous-valve.com/wx_codes.txt // Can be followed by the callsign or the station id. TKLST( SECTION_IDENTLOC,TK1(BBXX),TK1(IIIII),TK1(YYGGi),TK1(99LLL),TK1(QLLLL) ); // IIIII is the callsign. // OOXX D....D YYGGiw 99LaLaLa QcLoLoLoLo MMMULaULo h0h0h0h0im TKLST( SECTION_IDENTLOC,TK1(OOXX),TK1(IIIII),TK1(YYGGi),TK1(99LLL),TK1(QLLLL),TK1(MMMULaULo),TK1(h0h0h0h0im) ); // According to http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf // - 00fff is optional. // - 2sTTT_dew can be replaced by 29UUU // - 4PPPP can be replaced by 4a3hhh // - 7WWWW can be replaced by 7wwWW // - 9GGgg is optional TKLST( SECTION_LAND_OBS,TK1(iihVV),TK1(Nddff),TK1(00fff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(NIL) ); // 10 TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(8NCCC),TKn(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(7wwWW),TK1(9GGgg) ); // 61 TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(5appp) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(9GGgg) ); // http://allaboutweather.tripod.com/synopcode.htm TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); // 01078 11470 30310 11045 21077 5//// 69941 70182 82360 333 91114= // A: Publish: Error, no coordinates. kmlNam= descrTxt= m_nb_tokens=5:Land observations=6RRRt#69941+7wwWW#70182+8NCCC#82360+;Climatological data=333#333+9SSss#91114+; TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(7wwWW),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(5appp),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC) ); // 21 TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(6RRRt),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); // According to http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf // - 0sTTT is optional. TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(1PPHH),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(6IEER),TK1(70HHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(1PPHH),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(6IEER),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(1PPHH),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(70HHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(1PPHH),TK1(70HHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(6IEER),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(3dddd),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(70HHH) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(3dddd),TK1(4PPHH) ); // 66 TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(1PPHH),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(6IEER),TK1(70HHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(1PPHH),TK1(70HHH) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(2PPHH),TK1(70HHH) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(ICE),TK1(cSbDz) ); // http://allaboutweather.tripod.com/synopcode.htm // 333 1snTxTxTx (at 1800 UTC) 2snTnTnTn (at 0600 UTC) 3EsnTgTg (at 0600 UTC) 4E'sss (at 0600 UTC) 8NsChshs 9SpSpspsp // - SECTION 5 // 555 1V'f'/V'f''f'' 2snTwTwTw iiirrr /// BEWARE: jjjjj COULD BE REPEATED ! Or only with 55jjj ?? // According to http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf // - 0____ is optional. // - jjjjj is optional. TKLST( SECTION_CLIM_DAT,TK1(333),TK1(0____),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(0____),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(4Esss),TK1(55jjj),TK1(jjjjj),TK1(6RRRtb),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(0____),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(4Esss),TK1(5jjjj),TK1(6RRRtb),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(0____),TK1(55jjj),TK1(jjjjj),TK1(8NChh),TK1(9SSss) ); // http://www.top-wetter.de/themen/synopschluessel.htm // 333 0.... 1sTTT 2sTTT 3EsTT 4E'sss 55SSS 2FFFF 3FFFF 4FFFF 553SS 2FFFF 3FFFF 4FFFF 6RRRt 7RRRR 8NChh 9SSss TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(4FFFF),TKn(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt),TKn(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(553SS),TK1(2FFFF),TK1(7RRRR),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(6RRRtb),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(7RRRR),TK1(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(6RRRtb),TK1(7RRRR),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(6RRRtb),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(4Esss),TK1(7RRRR) ); // 51 TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt),TK1(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(553SS),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(6RRRtb),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(55jjj),TK1(jjjjj),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(6RRRtb),TK1(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(7RRRR),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(3Ejjj),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(553SS),TK1(2FFFF),TK1(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(55jjj),TK1(jjjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TKn(5jjjj),TKn(8NChh),TK1(9SSss) ); // 61 TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TKn(5jjjj),TK1(6RRRtb),TKn(8NChh),TK1(9SSss) ); // 63 TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(6RRRtb) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TKn(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(3Ejjj),TK1(4Esss),TK1(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(7RRRR) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(3Ejjj),TK1(5jjjj),TK1(55jjj),TK1(jjjjj),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(3Ejjj),TK1(5jjjj),TK1(6RRRtb),TK1(7RRRR),TK1(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(4Esss),TK1(7RRRR),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(55jjj),TK1(jjjjj),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(553SS),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(4Esss),TK1(55jjj),TK1(jjjjj),TK1(3FFFF),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(4Esss),TK1(553SS),TK1(6RRRt),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(553SS),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(553SS),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(3FFFF),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(553SS),TK1(2FFFF),TK1(6RRRt),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(553SS),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(4Esss),TK1(553SS),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(4Esss),TK1(55jjj),TK1(jjjjj),TK1(553SS),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(4Esss),TK1(6RRRtb),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TK1(2FFFF),TK1(6RRRt),TKn(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TK1(2FFFF),TKn(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(5jjjj),TK1(6RRRtb) ); TKLST( SECTION_CLIM_DAT,TK1(333),TKn(5jjjj),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(55jjj),TK1(jjjjj),TK1(2sTTT_min),TK1(3Ejjj),TK1(6RRRtb),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(55jjj),TK1(jjjjj),TK1(3Ejjj),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(55jjj),TK1(jjjjj),TK1(3Ejjj),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(55jjj),TK1(jjjjj),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(6RRRtb),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TKn(9SSss) ); // http://www.top-wetter.de/themen/synopschluessel.htm#444 TKLST( SECTION_NATCLOUD,TK1(444),TK1(NCHHC) ); // NOT SURE AT ALL. // http://allaboutweather.tripod.com/synopcode.htm TKLST( SECTION_NAT_CODE,TK1(555),TK1(1VVff),TK1(2sTTT_avg),TK1(3Ejjj),TK1(4Esss),TKn(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(1VVff),TK1(2sTTT_avg),TK1(3Ejjj),TKn(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(1VVff),TKn(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(2sTTT_avg),TK1(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(3Ejjj),TK1(4Esss),TK1(55jjj),TK1(jjjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(3Ejjj),TKn(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(9SSss) ); // http://metaf2xml.sourceforge.net/parser.pm.html // AT: 1snTxTxTx 6RRR/ // 1snTxTxTx : maximum temperature on the previous day from 06:00 to 18:00 UTC // 6RRR/ : amount of precipitation on the previous day from 06:00 to 18:00 UTC // BE: 1snTxTxTx 2snTnTnTn // 1snTxTxTx : maximum temperature on the next day from 00:00 to 24:00 UTC // 2snTnTnTn : minimum temperature on the next day from 00:00 to 24:00 UTC // CA: 1ssss 2swswswsw 3dmdmfmfm 4fhftftfi // 1ssss : amount of snowfall, in tenths of a centimeter, for the 24-hour period ending at 06:00 UTC // 2swswswsw : amount of water equivalent, in tenths of a millimeter, for the 24-hour snowfall ending at 06:00 UTC // 3dmdmfmfm : maximum (mean or gust) wind speed, in knots, for the 24-hour period ending at 06:00 UTC and its direction // 4fhftftfi : together with the previous group, the hundreds digit of the maximum wind speed (in knots), // the time of occurrence of the maximum wind speed, and the speed range // of the maximum two-minute mean wind speed, for the 24-hour period ending at 06:00 UTC and its direction // US land: RECORD* 0ittDtDtD 1snTT snTxTxsnTnTn RECORD* 2R24R24R24R24 44snTwTw 9YYGG // RECORD : indicator for temperature record(s) // 0ittDtDtD : tide data // 1snTT snTxTxsnTnTn RECORD* 2R24R24R24R24 : city data: temperature, maximum and minimum temperature, // indicator for temperature record(s), precipitation last 24 hours // 44snTwTw : water temperature // 9YYGG : additional day and hour of observation (repeated from Section 0) // US sea: 11fff 22fff 3GGgg 4ddfmfm 6GGgg dddfff dddfff dddfff dddfff dddfff dddfff 8ddfmfm 9GGgg // 11fff 22fff : equivalent wind speeds at 10 and 20 meters // 3GGgg 4ddfmfm : maximum wind speed since the last observation and the time when it occurred // 6GGgg : end time of the latest 10-minute continuous wind measurements // 6 x dddfff : 6 10-minute continuous wind measurements // 8ddfmfm 9GGgg : highest 1-minute wind speed and the time when it occurred // CZ: 1dsdsfsfs 2fsmfsmfsxfsx 3UU// 5snT5T5T5 6snT10T10T10 7snT20T20T20 8snT50T50T50 9snT100T100T100 // 1dsdsfsfs : wind direction and speed from tower measurement // 2fsmfsmfsxfsx : maximum wind gust speed over 10 minute period and the period W1W2 // 3UU// : relative humidity // 5snT5T5T5 6snT10T10T10 7snT20T20T20 8snT50T50T50 9snT100T100T100 : soil temperature at the depths of 5, 10, 20, 50, and 100 cm // RU: 1EsnT'gT'g 2snTnTnTn 3EsnTgTg 4E'sss 52snT2T2 6RRRtR 7R24R24R24/ 88R24R24R24 // 1EsnT'gT'g : state of the ground without snow or measurable ice cover, temperature of the ground surface // 2snTnTnTn : minimum temperature last night // 3EsnTgTg : state of the ground without snow or measurable ice cover, minimum temperature of the ground surface last night // 4E'sss : state of the ground if covered with snow or ice, snow depth // 6RRRtR : amount of precipitation for given period // 7R24R24R24/ : amount of daily precipitation // 88R24R24R24 : amount of daily precipitation if 30 mm or more // http://atmo.tamu.edu/class/atmo251/BuoyCode.pdf // 6GGgg is also called 6GGmm TKLST( SECTION_NAT_CODE,TK1(555),TK1(6GGmm) ); // Or 6snT10T10T10 /// Applies to CMAN messages but apparently to others too. // 3GGgg 4ddfmfm: maximum wind speed since the last observation and the time when it occurred TKLST( SECTION_NAT_CODE,TK1(555),TK1(110ff),TK1(220ff),TK1(3GGmm),TK1(4ddff),TK1(6GGmm),TKn(dddfff) ); // http://www.top-wetter.de/themen/synopschluessel.htm #ifdef FULL_SYNOP_555 TKLST( SECTION_NAT_CODE,TK1(555),TK1(0sTTT_land),TK1(1RRRr),TK1(2sTTT_avg),TK1(22fff),TK1(23SS),TK1(24Wt),TKn(25ww),TK1(26fff),TK1(3LLLL),TK1(5ssst),TK1(7hhZD),TK1(8N_hh),TK1(910ff),TK1(911ff),TK1(912ff),TK1(PIC),TK1(IN),TK1(BOT),TK1(hsTTT) ); #else TKLST( SECTION_NAT_CODE,TK1(555),TK1(0sTTT_land),TK1(1RRRr),TK1(2sTTT_avg),TK1(911ff),TK1(912ff) ); #endif // TODO: Consider optional tokens. // manfred@met.fu-berlin.de Joerg Wichmann // http://www.top-wetter.de/themen/synopschluessel.htm // 666 1sTTT 2sTTT 3sTTT 6VVVV/VVVV 7VVVV TKLST( SECTION_AUTO_DAT,TK1(666),TK1(1snTxTxTx),TK1(2snTxTxTx),TK1(7VVVV) ); // http://www.top-wetter.de/themen/synopschluessel.htm // 80000 0RRRr 1RRRr 2RRRr 3RRRr 4RRRr 5RRRr }; #undef TK /// Actual implementation of the synop objet. Details are hidden. class synop_impl : public synop { /// All characters which are not flushed yet. std::string m_buf ; /// Words being read (Between spaces, tabs etc...) std::string m_current_word ; /// When disabled, chars pass through the object without change. bool m_enabled ; /// A chain of Synop tokens, which tries to match a group. class Chain { size_t m_idxGroup ; // Index of the Synop group. size_t m_idxTok ; // Index of the first Synop token in the group. size_t m_nxtTok ; // Index of the next Synop token in the group. priority_t m_sum_prios ; TokenProxy::TokVec::Ptr m_tokens ; Chain(); void PushElement(TokenProxy::Ptr tp) { if( ! m_tokens ) m_tokens = TokenProxy::TokVec::Ptr( new TokenProxy::TokVec ); PushItself( tp, m_tokens ); } public: /// TODO: Allocates m_tokens only if appending a first token is possible. Chain( int i, int j) : m_idxGroup(i), m_idxTok(j), m_nxtTok(j), m_sum_prios(0.0) {} const TokenProxy::TokVec::Ptr & Tokens() const { assert( m_tokens ); return m_tokens; } section_t section(void) const { return arrSynopGroups[m_idxGroup].m_section; } /// Beware that some elements might have been repeated. bool IsFinished(void) const { // TODO: Our synop_group element should be copied here. const synop_group * ptrSynopGroup = &arrSynopGroups[m_idxGroup]; if( m_nxtTok == m_idxTok ) return false ; size_t nbToks = ptrSynopGroup->m_nb_toks ; if( m_nxtTok > nbToks ) return true ; if( m_nxtTok < nbToks ) return false ; return ! ptrSynopGroup->m_tks[ m_nxtTok - 1 ].m_many; } /// Tries to add a new word at the end of a chain of tokens. TokenProxy::Ptr TryPush( RegexT::Context & rgxCtxt, const std::string & str, size_t txt_offset ) { if( IsFinished() ) return TokenProxy::Ptr(); const synop_group * ptrSynopGroup = &arrSynopGroups[m_idxGroup]; assert( m_nxtTok <= ptrSynopGroup->m_nb_toks ); if( m_nxtTok < ptrSynopGroup->m_nb_toks ) { const int reg_idx = ptrSynopGroup->m_tks[ m_nxtTok ].m_rgx_idx; if( rgxCtxt.Mtch( reg_idx, str ) ) { TokenProxy::Ptr tp = RegexT::CreateTokenProxy( reg_idx, str, txt_offset ); /// Maybe a token which must not be at the beginning of a sequence. if( ( m_nxtTok == m_idxTok ) && ( false == tp->CanComeFirst() ) ) { return TokenProxy::Ptr() ; } /// It must parse the current word and the priority must be high enough. if( tp->ParseItself() ) { PushElement( tp ); m_sum_prios += RegexT::Priority( reg_idx ); ++m_nxtTok ; /* std::cout << "DEBUG:" << __FUNCTION__ << " m_idxGroup=" << m_idxGroup << " m_idxTok=" << m_idxTok << " reg=" << reg.Name() << " str=" << str << " m_nxtTok=" << m_nxtTok << " priority=" << m_sum_prios << "\n" ; */ return tp ; } } } /// Maybe the previous pattern can be repeated if "m_many" flag ? if( m_nxtTok > m_idxTok ) { const TOKGEN & tokgen = ptrSynopGroup->m_tks[ m_nxtTok - 1 ]; int reg_idx = tokgen.m_rgx_idx; if( tokgen.m_many && rgxCtxt.Mtch( reg_idx, str ) ) { TokenProxy::Ptr tp = RegexT::CreateTokenProxy( reg_idx, str, txt_offset ); /// It must parse the current word and the priority must be high enough. if( tp->ParseItself() ) { PushElement( tp ); m_sum_prios += RegexT::Priority( reg_idx ); /* std::cout << "DEBUG:" << __FUNCTION__ << " REPET m_idxGroup=" << m_idxGroup << " m_idxTok=" << m_idxTok << " reg=" << reg.Name() << " str=" << str << " m_nxtTok=" << m_nxtTok << " m_idxTok=" << m_idxTok << " maxTks=" << ptrSynopGroup->m_nb_toks << " priority=" << m_sum_prios << "\n" ; */ return tp ; } } } /* * MAYBE THE TOKEN IS OPTIONAL. IF YES, RETRY WITH NEXT TOKEN. */ // Now if the match is not empty, we might tolerate one dummy string. if( m_nxtTok > m_idxTok + 2 ) { } // If the previous match is a dummy string, maybe this is because two tokens coalesced, // therefore we try the next token. return TokenProxy::Ptr(); } // Chain::TryPush // TODO: This is now simply the chain length, but we could refine the concept. priority_t sum_priorities(void) const { return m_sum_prios;} size_t text_begin() const { assert( ! m_tokens->empty() ); return m_tokens->front()->offset_begin(); } size_t text_end() const { assert( ! m_tokens->empty() ); return m_tokens->back()->offset_end(); } std::string test_display() const { return m_tokens->MiniDump(section(),true); } void display_chain( bool test_mode, bool kml_mode ) const { m_tokens->DumpTokVec( test_mode, section(), kml_mode ); } // This helps to check if a pattern was used or not. void increment_usage_counter(void) const { arrSynopGroups[m_idxGroup].m_usage_counter++; } typedef std::list< Chain > List ; // Adds our current object at the end of a list. Fast copy thanks to smart pointers. void ConcatToList( List & refList ) const { refList.push_back( *this ); List::iterator lastChain = refList.end(); --lastChain ; if( lastChain != refList.begin() ) { List::iterator prevChain = lastChain ; --prevChain ; lastChain->m_tokens->previous( prevChain->m_tokens ); } } }; // synop_impl::Chain Chain::List m_chains ; /// This represents the last successful chains which can be aggregated into a message. class Message : public Chain::List { // Debug purpose. std::string TstToStr(void) const { std::string res ; for( const_iterator it = begin(), en = end(); it != en; ++ it ) { res += SectionToString(it->section()); res +="=" + it->test_display() + ";"; } return res ; } /// Looks for a specific token in the tokens chain passed as an iterator. template< class TokClass > void SetIfNull( const TokClass * & refIter, const_iterator itChain ) const { const TokClass * tmpPtr = itChain->Tokens()->front()->template get_ptr< TokClass >(false); if( tmpPtr == NULL ) return ; if( refIter == NULL ) { refIter = tmpPtr ; return ; } /// In some circumstances, we might duplicate the header to split the message. LOG_WARN("Duplicate token=%s:%s, was:%s: m_nbTokens=%d:%s", typeid(TokClass).name(), tmpPtr->c_str(), refIter->c_str(), (int)m_nbTokens, TstToStr().c_str() ); refIter = tmpPtr ; // Take the closest (and last). } // Total number of tokens in the list of token chains. size_t m_nbTokens; /// Called when the end of a message is detected. void Publish(void) { const_iterator it0 = begin(); if(it0 == end() ) { LOG_DEBUG("No publish0 empty message"); return; } // Quick check if the message is very short. Beware, it it the total // number of tokens, not the number of sections. if(m_nbTokens <= 2 ) { LOG_DEBUG("No publish1 m_nbTokens=%d:%s", static_cast(m_nbTokens), TstToStr().c_str() ); return ; } // We eliminate this kind of message which is not SYNOP although the beginning is similar. // Other simple combinations might be eliminated but they are rarer. // ZCZC 603 // WWXX60 EDZW 201700 const_iterator it1 = it0; ++it1 ; if( ( it0->section() == SECTION_HEAD_GRP ) && ( it1 != end() ) && ( it1->section() == SECTION_IDENTLOC ) ) { if( m_nbTokens <= 3 ) { LOG_INFO("No publish3 %s", TstToStr().c_str() ); return ; } // TODO: Store these for next run if their are missing. } if( it1 == end() ) { // For example, receiving only the following line makes no sense: // Climatological data=6RRRt#69907+8NChh#81822+9SSss#91113+9SSss#96480;+; if( it0->section() != SECTION_LAND_OBS ) { LOG_INFO("No publish2 %s", TstToStr().c_str() ); return ; } // TODO: We should use the header SECTION_IDENTLOC of the previous message: // SMOS01 LOWM 190000 // AAXX 19001 // 11036 32565 73208 10000 21038 30065 40306 57008 8353/ 333 83629 // 86360 91013 91113 91209= // 11010 35561 /2504 11031 21043 39946 40345 57009= // 11120 36/17 /9901 11111 21112 39620 40386 57005= } /// This gets some crucial information from the tokens. const CLASSTK(QLLLL) * ptr_QLLLL = NULL; const CLASSTK(IIIII) * ptr_IIIII = NULL; const CLASSTK(IIiii) * ptr_IIiii = NULL; const CLASSTK(iihVV) * ptr_iihVV = NULL; const CLASSTK(MMMULaULo) * ptr_MMMULaULo = NULL; const CLASSTK(YYGGi) * ptr_YYGGi = NULL; const CLASSTK(YYGGgg) * ptr_YYGGgg = NULL; const CLASSTK(Numbered) * ptr_Numbered = NULL; // In all the chains of tokens , we try to grap some specific tokens. for ( const_iterator itChain = begin(), enChain = end(); itChain != enChain; ++itChain ) { assert( itChain->Tokens() ); SetIfNull< CLASSTK(QLLLL) >( ptr_QLLLL , itChain ); SetIfNull< CLASSTK(IIIII) >( ptr_IIIII , itChain ); SetIfNull< CLASSTK(IIiii) >( ptr_IIiii , itChain ); SetIfNull< CLASSTK(iihVV) >( ptr_iihVV , itChain ); SetIfNull< CLASSTK(MMMULaULo) >( ptr_MMMULaULo, itChain ); SetIfNull< CLASSTK(YYGGi) >( ptr_YYGGi , itChain ); SetIfNull< CLASSTK(YYGGgg) >( ptr_YYGGgg , itChain ); SetIfNull< CLASSTK(Numbered) >( ptr_Numbered , itChain ); } bool foundCoo = false ; CoordinateT::Pair newCoo ; double altitudeStation = 0.0; if( ptr_QLLLL ) { if(ptr_QLLLL->CoordinatesOK() ) { newCoo = CoordinateT::Pair( ptr_QLLLL->Longitude(), ptr_QLLLL->Latitude() ); foundCoo = true ; } } std::string kmlNam ; std::string iconNam ; std::string descrTxt ; std::string stationCountry ; bool foundIdentifier = false; /// It also indicates whether we could find the station name given the WMO indicator. if( ptr_IIiii ) { int wmoIndicInt = ptr_IIiii->WmoIndicator(); std::stringstream strmWmo ; strmWmo << std::setfill('0') << std::setw(5) << wmoIndicInt; std::string wmoIndicStr = strmWmo.str(); descrTxt = "WMO " + wmoIndicStr ; const RecordBuoy * ptrBuoy_Tok = CatalogBuoy::FindFromKey( wmoIndicStr ); const RecordWmoStation * ptrWmo_Tok = CatalogWmoStations::FindFromKey( wmoIndicInt ); /// We cannot rely on "isAutomated" to guess if it is a buoy or not. if( ptrWmo_Tok == NULL ) { if( ptrBuoy_Tok ) { foundIdentifier = true; CoordinateT::Pair tmpCoo = ptrBuoy_Tok->station_coordinates(); if(foundCoo) { double dist = tmpCoo.distance( newCoo ); if( dist > 100 ) { std::stringstream strm ; strm << "Coordinates accuracy issue with buoy: " << ptrBuoy_Tok->buoy_name() << " IIiii:" << newCoo << " Against:" << tmpCoo << " Dist:" << dist ; LOG_INFO("%s", strm.str().c_str() ); } } else { foundCoo = true ; } // In both cases, we take the coordinates given by the WMO file. newCoo = tmpCoo ; altitudeStation = 0; kmlNam = ptrBuoy_Tok->title(); iconNam = ptrBuoy_Tok->type(); } else { const RecordJComm * ptrJComm_Tok = CatalogJComm::FindFromKey( wmoIndicStr ); if( ptrJComm_Tok ) { ptrJComm_Tok->SetJCommFields( kmlNam, iconNam ); if( stationCountry.empty() ) stationCountry = ptrJComm_Tok->country(); } else { kmlNam = "Automated station:" + wmoIndicStr ; iconNam = "automated"; } } } if( ptrBuoy_Tok == NULL ) { iconNam = "wmo"; if( ptrWmo_Tok ) { foundIdentifier = true; CoordinateT::Pair tmpCoo = ptrWmo_Tok->station_coordinates(); if( stationCountry.empty() ) stationCountry = ptrWmo_Tok->country(); if(foundCoo) { double dist = tmpCoo.distance( newCoo ); if( dist > 100 ) { std::stringstream strm ; strm << "Coordinates accuracy issue with WMO station: " << ptrWmo_Tok->station_name() << " IIiii:" << newCoo << " Against:" << tmpCoo << " Dist:" << dist ; LOG_INFO("%s", strm.str().c_str() ); } } else { foundCoo = true ; } // In both cases, we take the coordinates given by the WMO file. newCoo = tmpCoo ; altitudeStation = ptrWmo_Tok->station_elevation(); kmlNam = ptrWmo_Tok->station_name(); } else { const RecordJComm * ptrJComm_Tok = CatalogJComm::FindFromKey( wmoIndicStr ); if( ptrJComm_Tok ) { ptrJComm_Tok->SetJCommFields( kmlNam, iconNam ); if( stationCountry.empty() ) stationCountry = ptrJComm_Tok->country(); } else { LOG_INFO("Cannot find WMO station:%s", wmoIndicStr.c_str() ); kmlNam = "WMO:" + wmoIndicStr ; } } } if( ( ptrWmo_Tok != NULL ) && ( ptrBuoy_Tok != NULL ) ) { LOG_WARN("Conflit buoy/WMO"); } } std::string stationCallsign ; if( ptr_IIIII ) { std::string buoyNam ; const char * shipIdIIIII = ptr_IIIII->ShipIdentifier(); if( ! descrTxt.empty() ) descrTxt += ","; descrTxt += _("Ship "); descrTxt += shipIdIIIII; const RecordShip * ptrShip_Tok = CatalogShip::FindFromKey( shipIdIIIII ); if( ptrShip_Tok ) { stationCallsign = buoyNam = ptrShip_Tok->callsign(); if( ! ptrShip_Tok->name().empty() ) buoyNam += "," + ptrShip_Tok->name(); if( iconNam.empty() ) iconNam = "ship"; else iconNam += " ship"; if( stationCountry.empty() ) stationCountry = ptrShip_Tok->country(); } else { const RecordBuoy * ptrBuoy_Tok = CatalogBuoy::FindFromKey( shipIdIIIII ); if( ptrBuoy_Tok ) { buoyNam = ptrBuoy_Tok->title(); if( iconNam.empty() ) iconNam = "other buoy"; else iconNam += " buoy"; } } if( buoyNam.empty() ) { if( kmlNam.empty() ) { kmlNam = std::string("Ship:") + shipIdIIIII; if( iconNam.empty() ) iconNam = "ship"; else iconNam += " ship"; } else { LOG_WARN("Conflict between station %s and ship/buoy identifier %s", kmlNam.c_str(), shipIdIIIII ); } } else { if( kmlNam.empty() ) { kmlNam = buoyNam; } else { // Maybe the WMO station was there. if( foundIdentifier ) { LOG_WARN("Conflict between station %s and ship/buoy callsign %s identifier %s", kmlNam.c_str(), buoyNam.c_str(), shipIdIIIII ); } else { // We concatenate the information. Maybe this is not a conflict after all. if( foundIdentifier ) kmlNam += ",Ship:" + buoyNam ; else kmlNam = buoyNam ; } } } } if( ptr_MMMULaULo && ptr_MMMULaULo->MarsdenValid() ) { CoordinateT::Pair tmpCoo( ptr_MMMULaULo->Longitude(), ptr_MMMULaULo->Latitude() ); if(foundCoo) { double dist = tmpCoo.distance( newCoo ); if( dist > 100 ) { std::stringstream strm ; strm << "Coordinates accuracy issue with Marsden square. " << " Coordinates:"<< newCoo << " against:" << tmpCoo << " Dist:" << dist; LOG_WARN("%s", strm.str().c_str() ); } } else { foundCoo = true ; } newCoo = tmpCoo ; } // TODO: Adding time as fourth dimension: // http://earth.google.com/outreach/tutorial_time.html // TODO: Shame that we are losing this message because no coordinates. if( false == foundCoo ) { std::stringstream strm ; strm << "Error, no coordinates."; strm << " kmlNam=" << kmlNam ; strm << " descrTxt=" << descrTxt , strm << " m_nb_tokens=" << m_nbTokens << ":"; strm << TstToStr(); LOG_WARN("%s", strm.str().c_str() ); return ; } // If no time is defined, set current time. time_t tmObservation = 0 ; if( ptr_YYGGi ) { tmObservation = ptr_YYGGi->ObservationTimeUTC(); if( ptr_YYGGgg ) { time_t obsTmGGgg = ptr_YYGGgg->ObservationTimeUTC(); int days = diffTm( tmObservation, obsTmGGgg ); if(days > 1) { LOG_WARN( _("Unreliable observation time: %s and %s"), Tm2SynopTime( tmObservation ).c_str(), Tm2SynopTime( obsTmGGgg ).c_str() ); } } } else if( ptr_YYGGgg ) { tmObservation = ptr_YYGGgg->ObservationTimeUTC(); } // The name must be unique. if( kmlNam.empty() ) { std::stringstream strm ; strm << _("Station") << " " << newCoo; kmlNam = strm.str(); } if( iconNam.empty() ) iconNam = "Weather Station"; if( descrTxt.empty() ) descrTxt = _("Undetermined station"); if( synop::ptr_callback->log_adif() ) { // This builds an ADIF message. struct AdifSerializer : public Serializer, public std::string { void StartSection( const std::string & section_name ) { static_cast(*this) += section_name + ADIF_EOL; } // Will add a new line to a text message in the ADIF record. void AddItem( const char * key, const char * value, const char * unit ) { std::string & refStr = *this ; refStr += key ; refStr += "="; refStr += value ; if(unit) { refStr += " " ; refStr += unit ; } refStr += ADIF_EOL; } }; // synop_impl::Message::KmlSerializer AdifSerializer adifSerial ; /// Concatenate information from each chain. This is where the serializer kmlSerial is called. for ( const_iterator itChain = begin(), enChain = end(); itChain != enChain; ++itChain ) { itChain->display_chain(false, true); } /// For updating the logbook with received messages. QsoHelper qso(MODE_RTTY) ; if( ! stationCallsign.empty() ) qso.Push(CALL, stationCallsign ); if( ! stationCountry.empty() ) qso.Push(COUNTRY, stationCountry ); { std::stringstream strm ; strm << newCoo ; qso.Push(QTH, strm.str() ); } qso.Push(GRIDSQUARE, newCoo.locator() ); qso.Push(NAME, kmlNam ); /// If the header is clean, the message type is removed from the string. // In this context, this field cannot be used. qso.Push(XCHG1, iconNam ); // AAx, RRx, CCx, Pxx if( ptr_Numbered ) { qso.Push(SRX, ptr_Numbered->Number() ); } // Sequence of Chars and line-breaks, ASCII CR (code 13) + ASCII LF (code 10) qso.Push(NOTES, adifSerial ); } if( synop::ptr_callback->log_kml() ) { /// Writes messages to a list of key-value pairs, later displayed in KML. struct KmlSerializer : public Serializer, public KmlServer::CustomDataT { // TODO: Doubles the line width of the HTML table. void StartSection( const std::string & section_name ) { // m_freeText << section_name << "\n"; } // Will add a new line to a HTML table. void AddItem( const char * key, const char * value, const char * unit ) { std::string val = unit ? value + std::string(" ") + unit : std::string(value); Push( key, val ); } }; // synop_impl::Message::KmlSerializer KmlSerializer kmlSerial ; /// Concatenate information from each chain. This is where the serializer kmlSerial is called. for ( const_iterator itChain = begin(), enChain = end(); itChain != enChain; ++itChain ) { itChain->display_chain(false, true); } // Beware: Some WMO stations have the same name but are not mobile. KmlServer::GetInstance()->Broadcast( "Synop", tmObservation, newCoo, altitudeStation, kmlNam, iconNam, descrTxt, kmlSerial ); } } // synop_impl::Message::Publish public: ~Message() { Publish(); } /// Inconditionnaly cleans the content because too many chars could not be read. void MsgFlush() { // Should be called also after a given timeout. Publish(); Chain::List::clear(); m_nbTokens = 0; } /// When getting rid of the current message. // We might keep it or flush everything etc... void MsgFlushAndMove( const Chain & refChain ) { // Depending on the section of the last chain of the message, // and the section from this brand new chain, this decides to aggregate // the new section at the end of the message, otherwise create a new one, // and broadcast the current message. if( ! empty() ) { section_t new_sec = refChain.section(); section_t last_sec = Chain::List::back().section(); // To build messages, checks if a section can follow another one. if( 0 == sectionTransitions[new_sec][last_sec] ) { MsgFlush(); } } refChain.ConcatToList( *this ); m_nbTokens += refChain.Tokens()->size(); } }; // synop_impl::Message /// We add new chains of tokens, that is, sections, at the end of the message. Message m_current_message ; public: /// If margin is positive, this is the number of chars to be kept in the buffer for further decoding, /// because we are not sure at the moment of what they will be used for. /// If this is negative, this is the number of characters immediately after the decoded chain, /// which should be discarded: This is an end of section, '=' character. void decode_then_flush(int margin = 0 ) { // The margin is here only for display purpose. If the chars are immediately // displayed, there should not be anything in the buffer. size_t len_to_keep = margin > 0 ? margin : 0 ; Chain::List::const_iterator beg = m_chains.begin(), en = m_chains.end(); // Maybe we did not manage to decode anything. if( beg == en ) { // it might also be empty because we are in interleaved mode. if( m_buf.size() >= len_to_keep ) { disp_range( m_buf.begin(), m_buf.end() - len_to_keep ); m_buf.erase(m_buf.begin(), m_buf.end() - len_to_keep); } return ; } Chain::List::const_iterator best = beg ; priority_t best_priority = best->sum_priorities() ; // TODO: We should count the solutions of the same priority (More or less the length), // with a different beginning as ours. for( Chain::List::const_iterator it = beg; ++it != en ; ) { assert( it->Tokens() ); if( it->sum_priorities() > best_priority ) { best_priority = it->sum_priorities() ; best = it ; } }; assert( best != en ); m_current_message.MsgFlushAndMove(*best); // Maybe no chain is worth of interest. bool decoded_ok = best_priority >= MIN_PRIO ; // Counts the number of times this chain is selected. if( decoded_ok ) { best->increment_usage_counter(); } // If interleaved mode, chars are immediately printed. if( m_buf.empty() ) { if( decoded_ok ) { // This just displays the single chain in the output buffer. best->display_chain( GetTestMode(), false ); } } else { assert( len_to_keep <= m_buf.size() ); if( decoded_ok ) { // Not sure why we remove the last char. size_t txt_beg = best->text_begin(); size_t txt_end = best->text_end(); // There might have been a synchronization problem when changing params. if( (txt_beg > 0) && ( txt_beg - 1 <= m_buf.size() ) ) { disp_range( m_buf.begin(), m_buf.begin() + txt_beg - 1 ); } else { LOG_WARN("Bugcheck1: txt_beg=%d txt_end=%d margin=%d m_buf=%s", (int)txt_beg, (int)txt_end, (int)margin, m_buf.c_str() ); } // This just displays the single chain in the output buffer. best->display_chain( GetTestMode(), false ); if( (txt_beg > 0) && ( txt_beg - 1 + len_to_keep <= m_buf.size() ) ) { int to_discard = (margin < 0 ) ? - margin : 0 ; disp_range( m_buf.begin() + txt_end - 1 + to_discard , m_buf.end() - len_to_keep ); } else { LOG_WARN("Bugcheck2: txt_beg=%d txt_end=%d margin=%d m_buf=%s", (int)txt_beg, (int)txt_end, (int)margin, m_buf.c_str() ); } } else { disp_range( m_buf.begin(), m_buf.end() - len_to_keep ); } m_buf.erase(m_buf.begin(), m_buf.end() - len_to_keep); } m_chains.clear(); } // synop_impl::decode_then_flush private: // TODO: When starting a section, we should take first tokens of the same priority, in order to finish. /// Adds a new current word. tries all possible chains to which this word matches one token, even in the middle. size_t AddTokInit() { RegexT::Context rgxCtxt; // std::cout << __FUNCTION__ << "\n"; size_t nbInserts = 0 ; assert( m_chains.empty() ); const size_t buf_sz = m_buf.size(); // The same list can appear in several chains, this is intended. for( int i = 0, nbSynGrp = arrSynopGroups.size(); i < nbSynGrp; ++i ) { for( size_t j = 0, nbToks = arrSynopGroups[i].m_nb_toks; j < nbToks; ++j ) { Chain tmpChain( i, j ); if( tmpChain.TryPush( rgxCtxt, m_current_word, buf_sz ) ) { m_chains.push_back( tmpChain ); ++nbInserts; } } } // std::cout << "DEBUG:" << __FUNCTION__ << ":" << m_current_word << ":at:" << m_buf.size() << " m_buf=" << m_buf << " nbIns=" << nbInserts << " nbChains=" << m_chains.size() << "\n"; return nbInserts; } // synop_impl::AddTokInit /// Tries to add the last word to all possible token chains. size_t AddOtherTok() { class CtxtDerived : public RegexT::Context { struct BestStartTokenT { priority_t m_minPrio ; // Must be negative at startup. size_t m_newReg ; public: BestStartTokenT() : m_minPrio(-1.0), m_newReg(~0) {} void TstSwapPrio( priority_t newPrio, size_t newReg ) { if( m_minPrio < newPrio ) { m_minPrio = newPrio; m_newReg = newReg; } } }; /// This contains for each section the regex which matches the best // the current work, and starting a chain whose section immediately follow ours. BestStartTokenT m_bstStartToken[ SECTION_SECT_NBR ]; section_t m_currSection ; public: CtxtDerived() : m_currSection( static_cast(-1) ) {} void CmpSwapPriority( size_t newReg, section_t newSection ) { priority_t newPrio = RegexT::Priority( newReg ); /// This iterates on all sections which might immediately precede this one. for( size_t precedSec = 0; precedSec < SECTION_SECT_NBR; ++precedSec ) { // Does it make sense to have one section type following another ? if( 0 == sectionTransitions[newSection][precedSec] ) continue ; m_bstStartToken[ precedSec ].TstSwapPrio( newPrio, newReg ); } } /// Does the section comes just before ours ? void SetDistance( section_t predSection ) { m_currSection = predSection ; } // Called in two contexts: // When looking for a better beginning regex. // Or as a virtual in TryPush. virtual bool Mtch( size_t reg_idx, const std::string & str ) { if( m_bstStartToken[ m_currSection ].m_minPrio > RegexT::Priority( reg_idx ) ) { /* * We could add a condition on the length because of this: Expect [IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+ Actual [IIIII+YYGGi+99LLL+QLLLL+ 41/96 222Dv+1PPHH+2PPHH+ 4PPPP+5appp+7wwWW+ */ /* std::cout << " prio=" << m_bstStartToken[ m_currSection ].m_minPrio << " str=" << str << " m_newReg:" << m_bstStartToken[ m_currSection ].m_newReg << " prioRgx=" << RegexT::Name(m_bstStartToken[ m_currSection ].m_newReg) << " currSec=" << SectionToString(m_currSection) << " against:" << RegexT::Name(reg_idx) << " reg_idx:" << reg_idx << " oldPrio:" << RegexT::Priority( reg_idx ) << "\n"; */ return false ; } return RegexT::Context::Mtch( reg_idx, str ); }; }; // CtxtDerived CtxtDerived rgxCtxtDerived; const size_t buf_sz = m_buf.size(); /// What happens if it matches the beginning if a chain // NOTE: We suppose that the beginning is never multiple ("Many"). for( int idxGrp = 0, nbSynGrp = arrSynopGroups.size(); idxGrp < nbSynGrp; ++idxGrp ) { const synop_group * ptrSynopGroup = &arrSynopGroups[idxGrp]; assert( ptrSynopGroup->m_nb_toks > 0 ); assert( ptrSynopGroup->m_tks[ 0 ].m_many == false ); const int reg_idx = ptrSynopGroup->m_tks[ 0 ].m_rgx_idx; if( rgxCtxtDerived.Mtch(reg_idx, m_current_word ) ) { TokenProxy::Ptr tp = RegexT::CreateTokenProxy( reg_idx, m_current_word, buf_sz ); if( tp->ParseItself() ) { rgxCtxtDerived.CmpSwapPriority( reg_idx, ptrSynopGroup->m_section ); } } } /// Contains the list of chains to which we could not add the current (and last) word. typedef std::list< Chain::List::iterator > ChainsNoInsrtsT ; ChainsNoInsrtsT chainsNoInsrts ; /// We try to add the new word to all potential solutions. size_t nbInserts = 0 ; for( Chain::List::iterator it = m_chains.begin(), en = m_chains.end(); it!= en; ++it ) { /* Beware: Maybe the current word matches an intermediate token which is also the beginning of another chain. In this case, it does not count. It should not be a problem because the priorities are identical. */ rgxCtxtDerived.SetDistance( it->section() ); if( it->TryPush( rgxCtxtDerived, m_current_word, buf_sz ) ) { ++nbInserts; } else { chainsNoInsrts.push_back( it ); } } if( nbInserts != 0 ) { /// Removes the chains which cannot possibly match the current suite of tokens. for( ChainsNoInsrtsT::iterator it = chainsNoInsrts.begin(), en = chainsNoInsrts.end(); it != en; ++it ) { m_chains.erase( *it ); } } return nbInserts; } // synop_impl::AddOtherTok public: synop_impl() { /// Display each decoded key/value/unit item, to a stream, for debug logging. struct SynopSerializer : public Serializer { void StartSection( const std::string & section_name ) { std::string str = section_name + "\n"; disp_range( str.begin(), str.end(), true ); } /// Print in bold chars or special color. void AddItem( const char * key, const char * value, const char * unit ) { std::stringstream strm ; strm << '\t' << key << '=' << value << ' ' << ( unit ? unit : "" ) << '\n'; std::string str = strm.str(); disp_range( str.begin(), str.end(), true ); } }; // synop_impl::SynopSerializer /// It registers automatically as the lowest level serializer. static SynopSerializer fldigiSerial ; init_patterns(); m_enabled = true ; } virtual ~synop_impl() {}; /// Called as a virtual. void init() { cleanup(); } void cleanup() { m_buf.clear(); m_current_word.clear(); m_chains.clear(); m_enabled = false ; } /// Adds a received character to the Synop decoding buffer. void add( char c) { if( ! m_enabled ) { cleanup(); m_enabled = true ; } static bool was_interleaved_before = false ; bool is_interleaved_now = synop::ptr_callback->interleaved(); // I if( is_interleaved_now ) { // Maybe has to display and flush the internal buffer. if( ! was_interleaved_before ) { // Of course it does not clears the current message. disp_range( m_buf.begin(), m_buf.begin() ); m_buf.clear(); } } was_interleaved_before = is_interleaved_now; bool noChains = m_chains.empty(); // No chance to terminate the current message, too many chars not parsed. if( noChains && ( m_buf.size() > 20 ) ) { m_current_message.MsgFlush(); } /// All delimiters are stored in the buffer, but the split loses them. if( ! is_interleaved_now ) { m_buf += c ; } else { std::string one_char( 1, c ); disp_range( one_char.begin(), one_char.end(), false ); } // Note that some chars are not part of Baudot (ITA2) charset and will never appear. switch(c) { case ';' : // Our RTTY decoder uses this for '='. c = '=' ; // TODO: Might as well remove '=' from all regular expressions. case '=' : case ' ' : case '\t' : // TODO: Frequently (But not always, this marks a section end). case '\n' : case '\r' : if( ! m_current_word.empty() ) { size_t nbInserts = 0 ; // The same list can appear in several chains, this is intended. if( noChains ) { nbInserts = AddTokInit(); } else { nbInserts = AddOtherTok(); } if( c == '=' ) { // -1, no display of '=', whose length is one. decode_then_flush(-1); } else if( nbInserts == 0 ) { if( noChains ) { /// There was no chains before. decode_then_flush(); } else { // If there was no insertion, because // the new word did not match any existing chain. // Then we will retry with this word // and update the buffer too. decode_then_flush( m_current_word.size() + 1 ); // If cannot match anything at first stage, // then no need to keep the buffer. if( 0 == AddTokInit() ) { decode_then_flush(); } // Otherwise we have started a new chain. } } m_current_word.clear(); } break ; default : if( m_current_word.size() > 10 ) { decode_then_flush(); m_current_word.clear(); } else { m_current_word += c ; } break ; } } /// When Synop decoding is not needed. void flush(bool finish_decoding) { if( finish_decoding ) { decode_then_flush(); flush(false); } else { disp_range(m_buf.begin(), m_buf.end() ); m_current_message.MsgFlush(); cleanup(); } } bool enabled(void) const { return m_enabled; } }; synop * synop::instance() { /// The destructor should not do any harm because we have no control on when it is called. static synop_impl g_synop ; return &g_synop ; }; /// Prints the number of times each regular expression is used, so the unused ones can be removed. void synop::regex_usage(void) { for( size_t idxGrp = 0; idxGrp < arrSynopGroups.size(); ++idxGrp ) { const synop_group * ptrSynopGroup = &arrSynopGroups[idxGrp]; if( ptrSynopGroup-> m_usage_counter > 0 ) continue ; std::cout << "DEBUG:" << "Unused:" << " idxGrp=" << idxGrp << ' ' << *ptrSynopGroup << '\n' ; } } /// This helps in debug mode: Only the regex name is displayed. bool synop::m_test_mode = false ; const synop_callback * synop::ptr_callback ; /* Useful links about decoding: http://www.kmlvalidator.com/home.htm http://www.ndbc.noaa.gov/station_page.php?station=MBLA1 http://www.ncdc.noaa.gov/homr/ http://www.ncdc.noaa.gov/oa/climate/surfaceinventories.html http://www.nodc.noaa.gov/BUOY/ http://www.nodc.noaa.gov/BUOY/all_buoy_info_latlon.txt http://www.sailwx.info/shiptrack/researchships.phtml http://www.meteo2.shom.fr/qctools/last-report-list_surfmar.htm http://weather.noaa.gov/pub/logs/shipstats/shipstat.out.201206301330.csv http://www.wmo.int/pages/prog/amp/mmop/buoy-ids.html http://www.aoml.noaa.gov/hrd/format/tempdrop_format.html http://www.ominous-valve.com/wx_codes.txt http://www.vos.noaa.gov/ObsHB-508/ObservingHandbook1_2010_508_compliant.pdf http://www.nws.noaa.gov/tg/head.html http://weather.unisys.com/noaaport/text_summary.php http://www.wmo.int/pages/prog/www/ois/Operational_Information/VolumeC1/CCCC_en.html // http://www.wmo.int/pages/prog%2Fwww/WMOCodes/Manual/Volume-I-selection/Sel2.pdf Other information: See Klingenfuss Thunder (corresponding in the SYNOP weather code to group 7, WW=17). */ fldigi-3.21.80/src/common.rc0000664000175000017500000000210712313064025012447 00000000000000/* * This file is included by fldigirc.rc and flarqrc.rc, which must both define * RC_FILE_VERSION_QUAD and RC_FILE_DESCRIPTION and include config.h. */ #include VS_VERSION_INFO VERSIONINFO FILEVERSION RC_FILE_VERSION_QUAD PRODUCTVERSION RC_FILE_VERSION_QUAD FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "FileDescription", RC_FILE_DESCRIPTION "\0" VALUE "ProductVersion", PACKAGE_VERSION "\0" VALUE "FileVersion", PACKAGE_VERSION "." RC_BUILD_TIME "\0" VALUE "InternalName", PACKAGE_TARNAME "\0" VALUE "OriginalFilename", PACKAGE_TARNAME ".exe\0" VALUE "CompanyName", "\0" VALUE "LegalCopyright", PACKAGE_AUTHORS "\0" VALUE "Licence", "GPLv3+\0" VALUE "Info", "http://www.w1hkj.com/\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END fldigi-3.21.80/src/blank/0000775000175000017500000000000012313333727012010 500000000000000fldigi-3.21.80/src/blank/blank.cxx0000664000175000017500000001125512313064025013537 00000000000000// ---------------------------------------------------------------------------- // blank.cxx -- BLANK modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gMFSK source code // distribution. // gMFSK Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "BLANK.h" #include "ascii.h" char BLANKmsg[80]; void BLANK::tx_init(SoundBase *sc) { scard = sc; } void BLANK::rx_init() { put_MODEstatus(mode); } void BLANK::init() { modem::init(); rx_init(); digiscope->mode(Digiscope::SCOPE); } BLANK::~BLANK() { delete bandpass; delete hilbert; delete lowpass; delete sliding; delete [] scope_data; delete [] out_buf; delete [] in_buf; } BLANK::BLANK(trx_mode BLANK_mode) : modem() { double cf, flo, fhi; mode = BLANK_mode; symlen = SYMLEN; bandwidth = BLANK_BW; samplerate = BLANKSampleRate; flo = LP_F1 / corrRxSampleRate(); lowpass = new C_FIR_filter(); lowpass->init_lowpass (LP_FIRLEN, LP_DEC, flo ); flo = BP_F1 / corrRxSampleRate(); fhi = BP_F2 / corrRxSampleRate(); bandpass = new C_FIR_filter(); bandpass->init_bandpass (BP_FIRLEN, BP_DEC, flo, fhi ); hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); sliding = new sfft (SL_LEN, SL_F1, SL_F2); // all integer values scope_data = new double [SCOPE_DATA_LEN]; out_buf = new double [SYMLEN]; in_buf = new double [BUFLEN]; // init(); } //===================================================================== // receive processing //===================================================================== void BLANK::recvchar(int c) { if (c == -1) return; put_rx_char(c); } void BLANK::decodesymbol(unsigned char symbol) { } complex BLANK::mixer(complex in, double f) { complex z; // f may have to be modified z = in * complex( cos(phaseacc), sin(phaseacc) ); phaseacc -= TWOPI * f / corrRxSampleRate(); if (phaseacc > TWOPI) phaseacc -= TWOPI; if (phaseacc < -TWOPI) phaseacc += TWOPI; return z; } void BLANK::update_syncscope() { int j; memset(scopedata, 0, 2 * SCOPE_DATA_LEN); if (!squelchon || metric >= squelch) for (int i = 0; i < 2 * symlen; i++) { // j = (i + pipeptr) % (2 * symlen); // scopedata[i] = (pipe[j].vector[prev1symbol]).mag(); } set_scope(scope_data, SCOPE_DATA_LEN); } void BLANK::afc() { complex z; double x; if (metric < squelch) return; // adjust "frequency" iaw with afc processing } int BLANK::rx_process(const double *buf, int len) { complex z; int i; while (len-- > 0) { // create analytic signal... z.re = z.im = *buf++; hbfilt->run ( z, z ); // shift in frequency to the base freq of 1000 hz z = mixer(z, frequency); // bandpass filter around the shifted center frequency // with required bandwidth bandpass->run ( z, z ); // binsfft->run(z) copies frequencies of interest complex dummy ; sliding->run (z, &dummy, 0 ); // etc decodesymbol(); update_syncscope(); afc(); } return 0; } //===================================================================== // transmit processing //===================================================================== void BLANK::sendchar(unsigned char c) { // need to generate the outbuf ModulateXmtr(outbuf, symlen); put_echo_char(c); } void sendidle() { } int BLANK::tx_process() { int xmtbyte; switch (txstate) { case TX_STATE_PREAMBLE: for (int i = 0; i < 32; i++) sendbit(0); txstate = TX_STATE_START; break; case TX_STATE_START: sendchar('\r'); sendchar(2); // STX sendchar('\r'); txstate = TX_STATE_DATA; break; case TX_STATE_DATA: xmtbyte = get_tx_char(); if (xmtbyte == GET_TX_CHAR_NODATA) sendidle(); else if ( xmtbyte == GET_TX_CHAR_ETX || stopflag) txstate = TX_STATE_FLUSH; else sendchar(xmtbyte); break; case TX_STATE_FLUSH: sendchar('\r'); sendchar(4); // EOT sendchar('\r'); flushtx(); stopflag = false; // tell trx process that xmt is done return -1; default: break; } return 0; } fldigi-3.21.80/src/blank/blank.h0000664000175000017500000000357012313064025013165 00000000000000// ---------------------------------------------------------------------------- // BLANK.h -- BASIS FOR ALL MODEMS // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _BLANK_H #define _BLANK_H #include "trx.h" #include "modem.h" #include "fft.h" #include "filters.h" #include "complex.h" #define BLANKSampleRate 8000 #define SYMLEN 512 #define BLANK_BW 100 #define BUFFLEN 4096 #define SCOPE_DATA_LEN 1024 // lp filter //#define DEC_1 8 //#define FIRLEN_1 256 //#define BW_1 10 // NASA coefficients for viterbi encode/decode algorithms //#define K 7 //#define POLY1 0x6d //#define POLY2 0x4f class BLANK : public modem { protected: double phaseacc; double phaseincr; C_FIR_filter *bandpass; C_FIR_filter *lowpass; C_FIR_filter *hilbert; Cmovavg *moving_avg; sfft *slidingfft; int symlen; // receive double *scope_data; double *inbuf; // transmit int txstate; double *outbuf; unsigned int buffptr; public: BLANK(); ~BLANK(); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart(); int rx_process(const double *buf, int len); int tx_process(); void update_syncscope(); }; #endif fldigi-3.21.80/src/compat/0000775000175000017500000000000012313333725012202 500000000000000fldigi-3.21.80/src/compat/regex.c0000664000175000017500000042731212313064025013403 00000000000000/* Extended regular expression matching and search library, version 0.12. (Implements POSIX draft P10003.2/D11.2, except for internationalization features.) Copyright (C) 1993 Free Software Foundation, Inc. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- /* AIX requires this to be the first thing in the file. */ #if defined (_AIX) && !defined (REGEX_MALLOC) #pragma alloca #endif #define _GNU_SOURCE /* We need this for `regex.h', and perhaps for the Emacs include files. */ #include /* We used to test for `BSTRING' here, but only GCC and Emacs define `BSTRING', as far as I know, and neither of them use this code. */ #include #ifndef bcmp #define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) #endif #ifndef bcopy #define bcopy(s, d, n) memcpy ((d), (s), (n)) #endif #ifndef bzero #define bzero(s, n) memset ((s), 0, (n)) #endif #include /* Define the syntax stuff for \<, \>, etc. */ /* This must be nonzero for the wordchar and notwordchar pattern commands in re_match_2. */ #ifndef Sword #define Sword 1 #endif #ifdef SYNTAX_TABLE extern char *re_syntax_table; #else /* not SYNTAX_TABLE */ /* How many characters in the character set. */ #define CHAR_SET_SIZE 256 static char re_syntax_table[CHAR_SET_SIZE]; static void init_syntax_once () { register int c; static int done = 0; if (done) return; bzero (re_syntax_table, sizeof re_syntax_table); for (c = 'a'; c <= 'z'; c++) re_syntax_table[c] = Sword; for (c = 'A'; c <= 'Z'; c++) re_syntax_table[c] = Sword; for (c = '0'; c <= '9'; c++) re_syntax_table[c] = Sword; re_syntax_table['_'] = Sword; done = 1; } #endif /* not SYNTAX_TABLE */ #define SYNTAX(c) re_syntax_table[c] /* Get the interface, including the syntax bits. */ #include "regex.h" /* isalpha etc. are used for the character classes. */ #include #ifndef isascii #define isascii(c) 1 #endif #ifdef isblank #define ISBLANK(c) (isascii (c) && isblank (c)) #else #define ISBLANK(c) ((c) == ' ' || (c) == '\t') #endif #ifdef isgraph #define ISGRAPH(c) (isascii (c) && isgraph (c)) #else #define ISGRAPH(c) (isascii (c) && isprint (c) && !isspace (c)) #endif #define ISPRINT(c) (isascii (c) && isprint (c)) #define ISDIGIT(c) (isascii (c) && isdigit (c)) #define ISALNUM(c) (isascii (c) && isalnum (c)) #define ISALPHA(c) (isascii (c) && isalpha (c)) #define ISCNTRL(c) (isascii (c) && iscntrl (c)) #define ISLOWER(c) (isascii (c) && islower (c)) #define ISPUNCT(c) (isascii (c) && ispunct (c)) #define ISSPACE(c) (isascii (c) && isspace (c)) #define ISUPPER(c) (isascii (c) && isupper (c)) #define ISXDIGIT(c) (isascii (c) && isxdigit (c)) #ifndef NULL #define NULL 0 #endif /* We remove any previous definition of `SIGN_EXTEND_CHAR', since ours (we hope) works properly with all combinations of machines, compilers, `char' and `unsigned char' argument types. (Per Bothner suggested the basic approach.) */ #undef SIGN_EXTEND_CHAR #if __STDC__ #define SIGN_EXTEND_CHAR(c) ((signed char) (c)) #else /* not __STDC__ */ /* As in Harbison and Steele. */ #define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128) #endif /* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we use `alloca' instead of `malloc'. This is because using malloc in re_search* or re_match* could cause memory leaks when C-g is used in Emacs; also, malloc is slower and causes storage fragmentation. On the other hand, malloc is more portable, and easier to debug. Because we sometimes use alloca, some routines have to be macros, not functions -- `alloca'-allocated space disappears at the end of the function it is called in. */ #ifdef REGEX_MALLOC #define REGEX_ALLOCATE malloc #define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize) #else /* not REGEX_MALLOC */ /* Emacs already defines alloca, sometimes. */ #ifndef alloca /* Make alloca work the best possible way. */ #ifdef __GNUC__ #define alloca __builtin_alloca #else /* not __GNUC__ */ #if HAVE_ALLOCA_H #include #else /* not __GNUC__ or HAVE_ALLOCA_H */ #ifndef _AIX /* Already did AIX, up at the top. */ char *alloca (); #endif /* not _AIX */ #endif /* not HAVE_ALLOCA_H */ #endif /* not __GNUC__ */ #endif /* not alloca */ #define REGEX_ALLOCATE alloca /* Assumes a `char *destination' variable. */ #define REGEX_REALLOCATE(source, osize, nsize) \ (destination = (char *) alloca (nsize), \ bcopy (source, destination, osize), \ destination) #endif /* not REGEX_MALLOC */ /* True if `size1' is non-NULL and PTR is pointing anywhere inside `string1' or just past its end. This works if PTR is NULL, which is a good thing. */ #define FIRST_STRING_P(ptr) \ (size1 && string1 <= (ptr) && (ptr) <= string1 + size1) /* (Re)Allocate N items of type T using malloc, or fail. */ #define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t))) #define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t))) #define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t))) #define BYTEWIDTH 8 /* In bits. */ #define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) typedef char boolean; #define false 0 #define true 1 /* These are the command codes that appear in compiled regular expressions. Some opcodes are followed by argument bytes. A command code can specify any interpretation whatsoever for its arguments. Zero bytes may appear in the compiled regular expression. The value of `exactn' is needed in search.c (search_buffer) in Emacs. So regex.h defines a symbol `RE_EXACTN_VALUE' to be 1; the value of `exactn' we use here must also be 1. */ typedef enum { no_op = 0, /* Followed by one byte giving n, then by n literal bytes. */ exactn = 1, /* Matches any (more or less) character. */ anychar, /* Matches any one char belonging to specified set. First following byte is number of bitmap bytes. Then come bytes for a bitmap saying which chars are in. Bits in each byte are ordered low-bit-first. A character is in the set if its bit is 1. A character too large to have a bit in the map is automatically not in the set. */ charset, /* Same parameters as charset, but match any character that is not one of those specified. */ charset_not, /* Start remembering the text that is matched, for storing in a register. Followed by one byte with the register number, in the range 0 to one less than the pattern buffer's re_nsub field. Then followed by one byte with the number of groups inner to this one. (This last has to be part of the start_memory only because we need it in the on_failure_jump of re_match_2.) */ start_memory, /* Stop remembering the text that is matched and store it in a memory register. Followed by one byte with the register number, in the range 0 to one less than `re_nsub' in the pattern buffer, and one byte with the number of inner groups, just like `start_memory'. (We need the number of inner groups here because we don't have any easy way of finding the corresponding start_memory when we're at a stop_memory.) */ stop_memory, /* Match a duplicate of something remembered. Followed by one byte containing the register number. */ duplicate, /* Fail unless at beginning of line. */ begline, /* Fail unless at end of line. */ endline, /* Succeeds if at beginning of buffer (if emacs) or at beginning of string to be matched (if not). */ begbuf, /* Analogously, for end of buffer/string. */ endbuf, /* Followed by two byte relative address to which to jump. */ jump, /* Same as jump, but marks the end of an alternative. */ jump_past_alt, /* Followed by two-byte relative address of place to resume at in case of failure. */ on_failure_jump, /* Like on_failure_jump, but pushes a placeholder instead of the current string position when executed. */ on_failure_keep_string_jump, /* Throw away latest failure point and then jump to following two-byte relative address. */ pop_failure_jump, /* Change to pop_failure_jump if know won't have to backtrack to match; otherwise change to jump. This is used to jump back to the beginning of a repeat. If what follows this jump clearly won't match what the repeat does, such that we can be sure that there is no use backtracking out of repetitions already matched, then we change it to a pop_failure_jump. Followed by two-byte address. */ maybe_pop_jump, /* Jump to following two-byte address, and push a dummy failure point. This failure point will be thrown away if an attempt is made to use it for a failure. A `+' construct makes this before the first repeat. Also used as an intermediary kind of jump when compiling an alternative. */ dummy_failure_jump, /* Push a dummy failure point and continue. Used at the end of alternatives. */ push_dummy_failure, /* Followed by two-byte relative address and two-byte number n. After matching N times, jump to the address upon failure. */ succeed_n, /* Followed by two-byte relative address, and two-byte number n. Jump to the address N times, then fail. */ jump_n, /* Set the following two-byte relative address to the subsequent two-byte number. The address *includes* the two bytes of number. */ set_number_at, wordchar, /* Matches any word-constituent character. */ notwordchar, /* Matches any char that is not a word-constituent. */ wordbeg, /* Succeeds if at word beginning. */ wordend, /* Succeeds if at word end. */ wordbound, /* Succeeds if at a word boundary. */ notwordbound /* Succeeds if not at a word boundary. */ #ifdef emacs ,before_dot, /* Succeeds if before point. */ at_dot, /* Succeeds if at point. */ after_dot, /* Succeeds if after point. */ /* Matches any character whose syntax is specified. Followed by a byte which contains a syntax code, e.g., Sword. */ syntaxspec, /* Matches any character whose syntax is not that specified. */ notsyntaxspec #endif /* emacs */ } re_opcode_t; /* Common operations on the compiled pattern. */ /* Store NUMBER in two contiguous bytes starting at DESTINATION. */ #define STORE_NUMBER(destination, number) \ do { \ (destination)[0] = (number) & 0377; \ (destination)[1] = (number) >> 8; \ } while (0) /* Same as STORE_NUMBER, except increment DESTINATION to the byte after where the number is stored. Therefore, DESTINATION must be an lvalue. */ #define STORE_NUMBER_AND_INCR(destination, number) \ do { \ STORE_NUMBER (destination, number); \ (destination) += 2; \ } while (0) /* Put into DESTINATION a number stored in two contiguous bytes starting at SOURCE. */ #define EXTRACT_NUMBER(destination, source) \ do { \ (destination) = *(source) & 0377; \ (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \ } while (0) #ifdef DEBUG static void extract_number (dest, source) int *dest; unsigned char *source; { int temp = SIGN_EXTEND_CHAR (*(source + 1)); *dest = *source & 0377; *dest += temp << 8; } #ifndef EXTRACT_MACROS /* To debug the macros. */ #undef EXTRACT_NUMBER #define EXTRACT_NUMBER(dest, src) extract_number (&dest, src) #endif /* not EXTRACT_MACROS */ #endif /* DEBUG */ /* Same as EXTRACT_NUMBER, except increment SOURCE to after the number. SOURCE must be an lvalue. */ #define EXTRACT_NUMBER_AND_INCR(destination, source) \ do { \ EXTRACT_NUMBER (destination, source); \ (source) += 2; \ } while (0) #ifdef DEBUG static void extract_number_and_incr (destination, source) int *destination; unsigned char **source; { extract_number (destination, *source); *source += 2; } #ifndef EXTRACT_MACROS #undef EXTRACT_NUMBER_AND_INCR #define EXTRACT_NUMBER_AND_INCR(dest, src) \ extract_number_and_incr (&dest, &src) #endif /* not EXTRACT_MACROS */ #endif /* DEBUG */ /* If DEBUG is defined, Regex prints many voluminous messages about what it is doing (if the variable `debug' is nonzero). If linked with the main program in `iregex.c', you can enter patterns and strings interactively. And if linked with the main program in `main.c' and the other test files, you can run the already-written tests. */ #ifdef DEBUG /* We use standard I/O for debugging. */ #include /* It is useful to test things that ``must'' be true when debugging. */ #include static int debug = 0; #define DEBUG_STATEMENT(e) e #define DEBUG_PRINT1(x) if (debug) printf (x) #define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2) #define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3) #define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4) #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \ if (debug) print_partial_compiled_pattern (s, e) #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \ if (debug) print_double_string (w, s1, sz1, s2, sz2) extern void printchar (); /* Print the fastmap in human-readable form. */ void print_fastmap (fastmap) char *fastmap; { unsigned was_a_range = 0; unsigned i = 0; while (i < (1 << BYTEWIDTH)) { if (fastmap[i++]) { was_a_range = 0; printchar (i - 1); while (i < (1 << BYTEWIDTH) && fastmap[i]) { was_a_range = 1; i++; } if (was_a_range) { printf ("-"); printchar (i - 1); } } } putchar ('\n'); } /* Print a compiled pattern string in human-readable form, starting at the START pointer into it and ending just before the pointer END. */ void print_partial_compiled_pattern (start, end) unsigned char *start; unsigned char *end; { int mcnt, mcnt2; unsigned char *p = start; unsigned char *pend = end; if (start == NULL) { printf ("(null)\n"); return; } /* Loop over pattern commands. */ while (p < pend) { switch ((re_opcode_t) *p++) { case no_op: printf ("/no_op"); break; case exactn: mcnt = *p++; printf ("/exactn/%d", mcnt); do { putchar ('/'); printchar (*p++); } while (--mcnt); break; case start_memory: mcnt = *p++; printf ("/start_memory/%d/%d", mcnt, *p++); break; case stop_memory: mcnt = *p++; printf ("/stop_memory/%d/%d", mcnt, *p++); break; case duplicate: printf ("/duplicate/%d", *p++); break; case anychar: printf ("/anychar"); break; case charset: case charset_not: { register int c; printf ("/charset%s", (re_opcode_t) *(p - 1) == charset_not ? "_not" : ""); assert (p + *p < pend); for (c = 0; c < *p; c++) { unsigned bit; unsigned char map_byte = p[1 + c]; putchar ('/'); for (bit = 0; bit < BYTEWIDTH; bit++) if (map_byte & (1 << bit)) printchar (c * BYTEWIDTH + bit); } p += 1 + *p; break; } case begline: printf ("/begline"); break; case endline: printf ("/endline"); break; case on_failure_jump: extract_number_and_incr (&mcnt, &p); printf ("/on_failure_jump/0/%d", mcnt); break; case on_failure_keep_string_jump: extract_number_and_incr (&mcnt, &p); printf ("/on_failure_keep_string_jump/0/%d", mcnt); break; case dummy_failure_jump: extract_number_and_incr (&mcnt, &p); printf ("/dummy_failure_jump/0/%d", mcnt); break; case push_dummy_failure: printf ("/push_dummy_failure"); break; case maybe_pop_jump: extract_number_and_incr (&mcnt, &p); printf ("/maybe_pop_jump/0/%d", mcnt); break; case pop_failure_jump: extract_number_and_incr (&mcnt, &p); printf ("/pop_failure_jump/0/%d", mcnt); break; case jump_past_alt: extract_number_and_incr (&mcnt, &p); printf ("/jump_past_alt/0/%d", mcnt); break; case jump: extract_number_and_incr (&mcnt, &p); printf ("/jump/0/%d", mcnt); break; case succeed_n: extract_number_and_incr (&mcnt, &p); extract_number_and_incr (&mcnt2, &p); printf ("/succeed_n/0/%d/0/%d", mcnt, mcnt2); break; case jump_n: extract_number_and_incr (&mcnt, &p); extract_number_and_incr (&mcnt2, &p); printf ("/jump_n/0/%d/0/%d", mcnt, mcnt2); break; case set_number_at: extract_number_and_incr (&mcnt, &p); extract_number_and_incr (&mcnt2, &p); printf ("/set_number_at/0/%d/0/%d", mcnt, mcnt2); break; case wordbound: printf ("/wordbound"); break; case notwordbound: printf ("/notwordbound"); break; case wordbeg: printf ("/wordbeg"); break; case wordend: printf ("/wordend"); #ifdef emacs case before_dot: printf ("/before_dot"); break; case at_dot: printf ("/at_dot"); break; case after_dot: printf ("/after_dot"); break; case syntaxspec: printf ("/syntaxspec"); mcnt = *p++; printf ("/%d", mcnt); break; case notsyntaxspec: printf ("/notsyntaxspec"); mcnt = *p++; printf ("/%d", mcnt); break; #endif /* emacs */ case wordchar: printf ("/wordchar"); break; case notwordchar: printf ("/notwordchar"); break; case begbuf: printf ("/begbuf"); break; case endbuf: printf ("/endbuf"); break; default: printf ("?%d", *(p-1)); } } printf ("/\n"); } void print_compiled_pattern (bufp) struct re_pattern_buffer *bufp; { unsigned char *buffer = bufp->buffer; print_partial_compiled_pattern (buffer, buffer + bufp->used); printf ("%d bytes used/%d bytes allocated.\n", bufp->used, bufp->allocated); if (bufp->fastmap_accurate && bufp->fastmap) { printf ("fastmap: "); print_fastmap (bufp->fastmap); } printf ("re_nsub: %d\t", bufp->re_nsub); printf ("regs_alloc: %d\t", bufp->regs_allocated); printf ("can_be_null: %d\t", bufp->can_be_null); printf ("newline_anchor: %d\n", bufp->newline_anchor); printf ("no_sub: %d\t", bufp->no_sub); printf ("not_bol: %d\t", bufp->not_bol); printf ("not_eol: %d\t", bufp->not_eol); printf ("syntax: %d\n", bufp->syntax); /* Perhaps we should print the translate table? */ } void print_double_string (where, string1, size1, string2, size2) const char *where; const char *string1; const char *string2; int size1; int size2; { unsigned this_char; if (where == NULL) printf ("(null)"); else { if (FIRST_STRING_P (where)) { for (this_char = where - string1; this_char < size1; this_char++) printchar (string1[this_char]); where = string2; } for (this_char = where - string2; this_char < size2; this_char++) printchar (string2[this_char]); } } #else /* not DEBUG */ #undef assert #define assert(e) #define DEBUG_STATEMENT(e) #define DEBUG_PRINT1(x) #define DEBUG_PRINT2(x1, x2) #define DEBUG_PRINT3(x1, x2, x3) #define DEBUG_PRINT4(x1, x2, x3, x4) #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) #endif /* not DEBUG */ /* Set by `re_set_syntax' to the current regexp syntax to recognize. Can also be assigned to arbitrarily: each pattern buffer stores its own syntax, so it can be changed between regex compilations. */ reg_syntax_t re_syntax_options = RE_SYNTAX_EMACS; /* Specify the precise syntax of regexps for compilation. This provides for compatibility for various utilities which historically have different, incompatible syntaxes. The argument SYNTAX is a bit mask comprised of the various bits defined in regex.h. We return the old syntax. */ reg_syntax_t re_set_syntax (syntax) reg_syntax_t syntax; { reg_syntax_t ret = re_syntax_options; re_syntax_options = syntax; return ret; } /* This table gives an error message for each of the error codes listed in regex.h. Obviously the order here has to be same as there. */ static const char *re_error_msg[] = { NULL, /* REG_NOERROR */ "No match", /* REG_NOMATCH */ "Invalid regular expression", /* REG_BADPAT */ "Invalid collation character", /* REG_ECOLLATE */ "Invalid character class name", /* REG_ECTYPE */ "Trailing backslash", /* REG_EESCAPE */ "Invalid back reference", /* REG_ESUBREG */ "Unmatched [ or [^", /* REG_EBRACK */ "Unmatched ( or \\(", /* REG_EPAREN */ "Unmatched \\{", /* REG_EBRACE */ "Invalid content of \\{\\}", /* REG_BADBR */ "Invalid range end", /* REG_ERANGE */ "Memory exhausted", /* REG_ESPACE */ "Invalid preceding regular expression", /* REG_BADRPT */ "Premature end of regular expression", /* REG_EEND */ "Regular expression too big", /* REG_ESIZE */ "Unmatched ) or \\)", /* REG_ERPAREN */ }; /* Subroutine declarations and macros for regex_compile. */ static void store_op1 (), store_op2 (); static void insert_op1 (), insert_op2 (); static boolean at_begline_loc_p (), at_endline_loc_p (); static boolean group_in_compile_stack (); static reg_errcode_t compile_range (); /* Fetch the next character in the uncompiled pattern---translating it if necessary. Also cast from a signed character in the constant string passed to us by the user to an unsigned char that we can use as an array index (in, e.g., `translate'). */ #define PATFETCH(c) \ do {if (p == pend) return REG_EEND; \ c = (unsigned char) *p++; \ if (translate) c = translate[c]; \ } while (0) /* Fetch the next character in the uncompiled pattern, with no translation. */ #define PATFETCH_RAW(c) \ do {if (p == pend) return REG_EEND; \ c = (unsigned char) *p++; \ } while (0) /* Go backwards one character in the pattern. */ #define PATUNFETCH p-- /* If `translate' is non-null, return translate[D], else just D. We cast the subscript to translate because some data is declared as `char *', to avoid warnings when a string constant is passed. But when we use a character as a subscript we must make it unsigned. */ #define TRANSLATE(d) (translate ? translate[(unsigned char) (d)] : (d)) /* Macros for outputting the compiled pattern into `buffer'. */ /* If the buffer isn't allocated when it comes in, use this. */ #define INIT_BUF_SIZE 32 /* Make sure we have at least N more bytes of space in buffer. */ #define GET_BUFFER_SPACE(n) \ while (b - bufp->buffer + (n) > bufp->allocated) \ EXTEND_BUFFER () /* Make sure we have one more byte of buffer space and then add C to it. */ #define BUF_PUSH(c) \ do { \ GET_BUFFER_SPACE (1); \ *b++ = (unsigned char) (c); \ } while (0) /* Ensure we have two more bytes of buffer space and then append C1 and C2. */ #define BUF_PUSH_2(c1, c2) \ do { \ GET_BUFFER_SPACE (2); \ *b++ = (unsigned char) (c1); \ *b++ = (unsigned char) (c2); \ } while (0) /* As with BUF_PUSH_2, except for three bytes. */ #define BUF_PUSH_3(c1, c2, c3) \ do { \ GET_BUFFER_SPACE (3); \ *b++ = (unsigned char) (c1); \ *b++ = (unsigned char) (c2); \ *b++ = (unsigned char) (c3); \ } while (0) /* Store a jump with opcode OP at LOC to location TO. We store a relative address offset by the three bytes the jump itself occupies. */ #define STORE_JUMP(op, loc, to) \ store_op1 (op, loc, (to) - (loc) - 3) /* Likewise, for a two-argument jump. */ #define STORE_JUMP2(op, loc, to, arg) \ store_op2 (op, loc, (to) - (loc) - 3, arg) /* Like `STORE_JUMP', but for inserting. Assume `b' is the buffer end. */ #define INSERT_JUMP(op, loc, to) \ insert_op1 (op, loc, (to) - (loc) - 3, b) /* Like `STORE_JUMP2', but for inserting. Assume `b' is the buffer end. */ #define INSERT_JUMP2(op, loc, to, arg) \ insert_op2 (op, loc, (to) - (loc) - 3, arg, b) /* This is not an arbitrary limit: the arguments which represent offsets into the pattern are two bytes long. So if 2^16 bytes turns out to be too small, many things would have to change. */ #define MAX_BUF_SIZE (1L << 16) /* Extend the buffer by twice its current size via realloc and reset the pointers that pointed into the old block to point to the correct places in the new one. If extending the buffer results in it being larger than MAX_BUF_SIZE, then flag memory exhausted. */ #define EXTEND_BUFFER() \ do { \ unsigned char *old_buffer = bufp->buffer; \ if (bufp->allocated == MAX_BUF_SIZE) \ return REG_ESIZE; \ bufp->allocated <<= 1; \ if (bufp->allocated > MAX_BUF_SIZE) \ bufp->allocated = MAX_BUF_SIZE; \ bufp->buffer = (unsigned char *) realloc (bufp->buffer, bufp->allocated);\ if (bufp->buffer == NULL) \ return REG_ESPACE; \ /* If the buffer moved, move all the pointers into it. */ \ if (old_buffer != bufp->buffer) \ { \ b = (b - old_buffer) + bufp->buffer; \ begalt = (begalt - old_buffer) + bufp->buffer; \ if (fixup_alt_jump) \ fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\ if (laststart) \ laststart = (laststart - old_buffer) + bufp->buffer; \ if (pending_exact) \ pending_exact = (pending_exact - old_buffer) + bufp->buffer; \ } \ } while (0) /* Since we have one byte reserved for the register number argument to {start,stop}_memory, the maximum number of groups we can report things about is what fits in that byte. */ #define MAX_REGNUM 255 /* But patterns can have more than `MAX_REGNUM' registers. We just ignore the excess. */ typedef unsigned regnum_t; /* Macros for the compile stack. */ /* Since offsets can go either forwards or backwards, this type needs to be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */ typedef int pattern_offset_t; typedef struct { pattern_offset_t begalt_offset; pattern_offset_t fixup_alt_jump; pattern_offset_t inner_group_offset; pattern_offset_t laststart_offset; regnum_t regnum; } compile_stack_elt_t; typedef struct { compile_stack_elt_t *stack; unsigned size; unsigned avail; /* Offset of next open position. */ } compile_stack_type; #define INIT_COMPILE_STACK_SIZE 32 #define COMPILE_STACK_EMPTY (compile_stack.avail == 0) #define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size) /* The next available element. */ #define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail]) /* Set the bit for character C in a list. */ #define SET_LIST_BIT(c) \ (b[((unsigned char) (c)) / BYTEWIDTH] \ |= 1 << (((unsigned char) c) % BYTEWIDTH)) /* Get the next unsigned number in the uncompiled pattern. */ #define GET_UNSIGNED_NUMBER(num) \ { if (p != pend) \ { \ PATFETCH (c); \ while (ISDIGIT (c)) \ { \ if (num < 0) \ num = 0; \ num = num * 10 + c - '0'; \ if (p == pend) \ break; \ PATFETCH (c); \ } \ } \ } #define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ #define IS_CHAR_CLASS(string) \ (STREQ (string, "alpha") || STREQ (string, "upper") \ || STREQ (string, "lower") || STREQ (string, "digit") \ || STREQ (string, "alnum") || STREQ (string, "xdigit") \ || STREQ (string, "space") || STREQ (string, "print") \ || STREQ (string, "punct") || STREQ (string, "graph") \ || STREQ (string, "cntrl") || STREQ (string, "blank")) /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX. Returns one of error codes defined in `regex.h', or zero for success. Assumes the `allocated' (and perhaps `buffer') and `translate' fields are set in BUFP on entry. If it succeeds, results are put in BUFP (if it returns an error, the contents of BUFP are undefined): `buffer' is the compiled pattern; `syntax' is set to SYNTAX; `used' is set to the length of the compiled pattern; `fastmap_accurate' is zero; `re_nsub' is the number of subexpressions in PATTERN; `not_bol' and `not_eol' are zero; The `fastmap' and `newline_anchor' fields are neither examined nor set. */ static reg_errcode_t regex_compile (pattern, size, syntax, bufp) const char *pattern; int size; reg_syntax_t syntax; struct re_pattern_buffer *bufp; { /* We fetch characters from PATTERN here. Even though PATTERN is `char *' (i.e., signed), we declare these variables as unsigned, so they can be reliably used as array indices. */ register unsigned char c, c1; /* A random tempory spot in PATTERN. */ const char *p1; /* Points to the end of the buffer, where we should append. */ register unsigned char *b; /* Keeps track of unclosed groups. */ compile_stack_type compile_stack; /* Points to the current (ending) position in the pattern. */ const char *p = pattern; const char *pend = pattern + size; /* How to translate the characters in the pattern. */ char *translate = bufp->translate; /* Address of the count-byte of the most recently inserted `exactn' command. This makes it possible to tell if a new exact-match character can be added to that command or if the character requires a new `exactn' command. */ unsigned char *pending_exact = 0; /* Address of start of the most recently finished expression. This tells, e.g., postfix * where to find the start of its operand. Reset at the beginning of groups and alternatives. */ unsigned char *laststart = 0; /* Address of beginning of regexp, or inside of last group. */ unsigned char *begalt; /* Place in the uncompiled pattern (i.e., the {) to which to go back if the interval is invalid. */ const char *beg_interval; /* Address of the place where a forward jump should go to the end of the containing expression. Each alternative of an `or' -- except the last -- ends with a forward jump of this sort. */ unsigned char *fixup_alt_jump = 0; /* Counts open-groups as they are encountered. Remembered for the matching close-group on the compile stack, so the same register number is put in the stop_memory as the start_memory. */ regnum_t regnum = 0; #ifdef DEBUG DEBUG_PRINT1 ("\nCompiling pattern: "); if (debug) { unsigned debug_count; for (debug_count = 0; debug_count < size; debug_count++) printchar (pattern[debug_count]); putchar ('\n'); } #endif /* DEBUG */ /* Initialize the compile stack. */ compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t); if (compile_stack.stack == NULL) return REG_ESPACE; compile_stack.size = INIT_COMPILE_STACK_SIZE; compile_stack.avail = 0; /* Initialize the pattern buffer. */ bufp->syntax = syntax; bufp->fastmap_accurate = 0; bufp->not_bol = bufp->not_eol = 0; /* Set `used' to zero, so that if we return an error, the pattern printer (for debugging) will think there's no pattern. We reset it at the end. */ bufp->used = 0; /* Always count groups, whether or not bufp->no_sub is set. */ bufp->re_nsub = 0; #if !defined (emacs) && !defined (SYNTAX_TABLE) /* Initialize the syntax table. */ init_syntax_once (); #endif if (bufp->allocated == 0) { if (bufp->buffer) { /* If zero allocated, but buffer is non-null, try to realloc enough space. This loses if buffer's address is bogus, but that is the user's responsibility. */ RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char); } else { /* Caller did not allocate a buffer. Do it for them. */ bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char); } if (!bufp->buffer) { free(compile_stack.stack); return REG_ESPACE; } bufp->allocated = INIT_BUF_SIZE; } begalt = b = bufp->buffer; /* Loop through the uncompiled pattern until we're at the end. */ while (p != pend) { PATFETCH (c); switch (c) { case '^': { if ( /* If at start of pattern, it's an operator. */ p == pattern + 1 /* If context independent, it's an operator. */ || syntax & RE_CONTEXT_INDEP_ANCHORS /* Otherwise, depends on what's come before. */ || at_begline_loc_p (pattern, p, syntax)) BUF_PUSH (begline); else goto normal_char; } break; case '$': { if ( /* If at end of pattern, it's an operator. */ p == pend /* If context independent, it's an operator. */ || syntax & RE_CONTEXT_INDEP_ANCHORS /* Otherwise, depends on what's next. */ || at_endline_loc_p (p, pend, syntax)) BUF_PUSH (endline); else goto normal_char; } break; case '+': case '?': if ((syntax & RE_BK_PLUS_QM) || (syntax & RE_LIMITED_OPS)) goto normal_char; handle_plus: case '*': /* If there is no previous pattern... */ if (!laststart) { if (syntax & RE_CONTEXT_INVALID_OPS) return REG_BADRPT; else if (!(syntax & RE_CONTEXT_INDEP_OPS)) goto normal_char; } { /* Are we optimizing this jump? */ boolean keep_string_p = false; /* 1 means zero (many) matches is allowed. */ char zero_times_ok = 0, many_times_ok = 0; /* If there is a sequence of repetition chars, collapse it down to just one (the right one). We can't combine interval operators with these because of, e.g., `a{2}*', which should only match an even number of `a's. */ for (;;) { zero_times_ok |= c != '+'; many_times_ok |= c != '?'; if (p == pend) break; PATFETCH (c); if (c == '*' || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?'))) ; else if (syntax & RE_BK_PLUS_QM && c == '\\') { if (p == pend) return REG_EESCAPE; PATFETCH (c1); if (!(c1 == '+' || c1 == '?')) { PATUNFETCH; PATUNFETCH; break; } c = c1; } else { PATUNFETCH; break; } /* If we get here, we found another repeat character. */ } /* Star, etc. applied to an empty pattern is equivalent to an empty pattern. */ if (!laststart) break; /* Now we know whether or not zero matches is allowed and also whether or not two or more matches is allowed. */ if (many_times_ok) { /* More than one repetition is allowed, so put in at the end a backward relative jump from `b' to before the next jump we're going to put in below (which jumps from laststart to after this jump). But if we are at the `*' in the exact sequence `.*\n', insert an unconditional jump backwards to the ., instead of the beginning of the loop. This way we only push a failure point once, instead of every time through the loop. */ assert (p - 1 > pattern); /* Allocate the space for the jump. */ GET_BUFFER_SPACE (3); /* We know we are not at the first character of the pattern, because laststart was nonzero. And we've already incremented `p', by the way, to be the character after the `*'. Do we have to do something analogous here for null bytes, because of RE_DOT_NOT_NULL? */ if (TRANSLATE (*(p - 2)) == TRANSLATE ('.') && zero_times_ok && p < pend && TRANSLATE (*p) == TRANSLATE ('\n') && !(syntax & RE_DOT_NEWLINE)) { /* We have .*\n. */ STORE_JUMP (jump, b, laststart); keep_string_p = true; } else /* Anything else. */ STORE_JUMP (maybe_pop_jump, b, laststart - 3); /* We've added more stuff to the buffer. */ b += 3; } /* On failure, jump from laststart to b + 3, which will be the end of the buffer after this jump is inserted. */ GET_BUFFER_SPACE (3); INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump : on_failure_jump, laststart, b + 3); pending_exact = 0; b += 3; if (!zero_times_ok) { /* At least one repetition is required, so insert a `dummy_failure_jump' before the initial `on_failure_jump' instruction of the loop. This effects a skip over that instruction the first time we hit that loop. */ GET_BUFFER_SPACE (3); INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6); b += 3; } } break; case '.': laststart = b; BUF_PUSH (anychar); break; case '[': { boolean had_char_class = false; if (p == pend) return REG_EBRACK; /* Ensure that we have enough space to push a charset: the opcode, the length count, and the bitset; 34 bytes in all. */ GET_BUFFER_SPACE (34); laststart = b; /* We test `*p == '^' twice, instead of using an if statement, so we only need one BUF_PUSH. */ BUF_PUSH (*p == '^' ? charset_not : charset); if (*p == '^') p++; /* Remember the first position in the bracket expression. */ p1 = p; /* Push the number of bytes in the bitmap. */ BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH); /* Clear the whole map. */ bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH); /* charset_not matches newline according to a syntax bit. */ if ((re_opcode_t) b[-2] == charset_not && (syntax & RE_HAT_LISTS_NOT_NEWLINE)) SET_LIST_BIT ('\n'); /* Read in characters and ranges, setting map bits. */ for (;;) { if (p == pend) return REG_EBRACK; PATFETCH (c); /* \ might escape characters inside [...] and [^...]. */ if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') { if (p == pend) return REG_EESCAPE; PATFETCH (c1); SET_LIST_BIT (c1); continue; } /* Could be the end of the bracket expression. If it's not (i.e., when the bracket expression is `[]' so far), the ']' character bit gets set way below. */ if (c == ']' && p != p1 + 1) break; /* Look ahead to see if it's a range when the last thing was a character class. */ if (had_char_class && c == '-' && *p != ']') return REG_ERANGE; /* Look ahead to see if it's a range when the last thing was a character: if this is a hyphen not at the beginning or the end of a list, then it's the range operator. */ if (c == '-' && !(p - 2 >= pattern && p[-2] == '[') && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') && *p != ']') { reg_errcode_t ret = compile_range (&p, pend, translate, syntax, b); if (ret != REG_NOERROR) return ret; } else if (p[0] == '-' && p[1] != ']') { /* This handles ranges made up of characters only. */ reg_errcode_t ret; /* Move past the `-'. */ PATFETCH (c1); ret = compile_range (&p, pend, translate, syntax, b); if (ret != REG_NOERROR) return ret; } /* See if we're at the beginning of a possible character class. */ else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') { /* Leave room for the null. */ char str[CHAR_CLASS_MAX_LENGTH + 1]; PATFETCH (c); c1 = 0; /* If pattern is `[[:'. */ if (p == pend) return REG_EBRACK; for (;;) { PATFETCH (c); if (c == ':' || c == ']' || p == pend || c1 == CHAR_CLASS_MAX_LENGTH) break; str[c1++] = c; } str[c1] = '\0'; /* If isn't a word bracketed by `[:' and:`]': undo the ending character, the letters, and leave the leading `:' and `[' (but set bits for them). */ if (c == ':' && *p == ']') { int ch; boolean is_alnum = STREQ (str, "alnum"); boolean is_alpha = STREQ (str, "alpha"); boolean is_blank = STREQ (str, "blank"); boolean is_cntrl = STREQ (str, "cntrl"); boolean is_digit = STREQ (str, "digit"); boolean is_graph = STREQ (str, "graph"); boolean is_lower = STREQ (str, "lower"); boolean is_print = STREQ (str, "print"); boolean is_punct = STREQ (str, "punct"); boolean is_space = STREQ (str, "space"); boolean is_upper = STREQ (str, "upper"); boolean is_xdigit = STREQ (str, "xdigit"); if (!IS_CHAR_CLASS (str)) return REG_ECTYPE; /* Throw away the ] at the end of the character class. */ PATFETCH (c); if (p == pend) return REG_EBRACK; for (ch = 0; ch < 1 << BYTEWIDTH; ch++) { if ( (is_alnum && ISALNUM (ch)) || (is_alpha && ISALPHA (ch)) || (is_blank && ISBLANK (ch)) || (is_cntrl && ISCNTRL (ch)) || (is_digit && ISDIGIT (ch)) || (is_graph && ISGRAPH (ch)) || (is_lower && ISLOWER (ch)) || (is_print && ISPRINT (ch)) || (is_punct && ISPUNCT (ch)) || (is_space && ISSPACE (ch)) || (is_upper && ISUPPER (ch)) || (is_xdigit && ISXDIGIT (ch))) SET_LIST_BIT (ch); } had_char_class = true; } else { c1++; while (c1--) PATUNFETCH; SET_LIST_BIT ('['); SET_LIST_BIT (':'); had_char_class = false; } } else { had_char_class = false; SET_LIST_BIT (c); } } /* Discard any (non)matching list bytes that are all 0 at the end of the map. Decrease the map-length byte too. */ while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) b[-1]--; b += b[-1]; } break; case '(': if (syntax & RE_NO_BK_PARENS) goto handle_open; else goto normal_char; case ')': if (syntax & RE_NO_BK_PARENS) goto handle_close; else goto normal_char; case '\n': if (syntax & RE_NEWLINE_ALT) goto handle_alt; else goto normal_char; case '|': if (syntax & RE_NO_BK_VBAR) goto handle_alt; else goto normal_char; case '{': if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES) goto handle_interval; else goto normal_char; case '\\': if (p == pend) return REG_EESCAPE; /* Do not translate the character after the \, so that we can distinguish, e.g., \B from \b, even if we normally would translate, e.g., B to b. */ PATFETCH_RAW (c); switch (c) { case '(': if (syntax & RE_NO_BK_PARENS) goto normal_backslash; handle_open: bufp->re_nsub++; regnum++; if (COMPILE_STACK_FULL) { RETALLOC (compile_stack.stack, compile_stack.size << 1, compile_stack_elt_t); if (compile_stack.stack == NULL) return REG_ESPACE; compile_stack.size <<= 1; } /* These are the values to restore when we hit end of this group. They are all relative offsets, so that if the whole pattern moves because of realloc, they will still be valid. */ COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer; COMPILE_STACK_TOP.fixup_alt_jump = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0; COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer; COMPILE_STACK_TOP.regnum = regnum; /* We will eventually replace the 0 with the number of groups inner to this one. But do not push a start_memory for groups beyond the last one we can represent in the compiled pattern. */ if (regnum <= MAX_REGNUM) { COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2; BUF_PUSH_3 (start_memory, regnum, 0); } compile_stack.avail++; fixup_alt_jump = 0; laststart = 0; begalt = b; /* If we've reached MAX_REGNUM groups, then this open won't actually generate any code, so we'll have to clear pending_exact explicitly. */ pending_exact = 0; break; case ')': if (syntax & RE_NO_BK_PARENS) goto normal_backslash; if (COMPILE_STACK_EMPTY) { if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) goto normal_backslash; else return REG_ERPAREN; } handle_close: if (fixup_alt_jump) { /* Push a dummy failure point at the end of the alternative for a possible future `pop_failure_jump' to pop. See comments at `push_dummy_failure' in `re_match_2'. */ BUF_PUSH (push_dummy_failure); /* We allocated space for this jump when we assigned to `fixup_alt_jump', in the `handle_alt' case below. */ STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1); } /* See similar code for backslashed left paren above. */ if (COMPILE_STACK_EMPTY) { if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) goto normal_char; else return REG_ERPAREN; } /* Since we just checked for an empty stack above, this ``can't happen''. */ assert (compile_stack.avail != 0); { /* We don't just want to restore into `regnum', because later groups should continue to be numbered higher, as in `(ab)c(de)' -- the second group is #2. */ regnum_t this_group_regnum; compile_stack.avail--; begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset; fixup_alt_jump = COMPILE_STACK_TOP.fixup_alt_jump ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1 : 0; laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset; this_group_regnum = COMPILE_STACK_TOP.regnum; /* If we've reached MAX_REGNUM groups, then this open won't actually generate any code, so we'll have to clear pending_exact explicitly. */ pending_exact = 0; /* We're at the end of the group, so now we know how many groups were inside this one. */ if (this_group_regnum <= MAX_REGNUM) { unsigned char *inner_group_loc = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset; *inner_group_loc = regnum - this_group_regnum; BUF_PUSH_3 (stop_memory, this_group_regnum, regnum - this_group_regnum); } } break; case '|': /* `\|'. */ if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR) goto normal_backslash; handle_alt: if (syntax & RE_LIMITED_OPS) goto normal_char; /* Insert before the previous alternative a jump which jumps to this alternative if the former fails. */ GET_BUFFER_SPACE (3); INSERT_JUMP (on_failure_jump, begalt, b + 6); pending_exact = 0; b += 3; /* The alternative before this one has a jump after it which gets executed if it gets matched. Adjust that jump so it will jump to this alternative's analogous jump (put in below, which in turn will jump to the next (if any) alternative's such jump, etc.). The last such jump jumps to the correct final destination. A picture: _____ _____ | | | | | v | v a | b | c If we are at `b', then fixup_alt_jump right now points to a three-byte space after `a'. We'll put in the jump, set fixup_alt_jump to right after `b', and leave behind three bytes which we'll fill in when we get to after `c'. */ if (fixup_alt_jump) STORE_JUMP (jump_past_alt, fixup_alt_jump, b); /* Mark and leave space for a jump after this alternative, to be filled in later either by next alternative or when know we're at the end of a series of alternatives. */ fixup_alt_jump = b; GET_BUFFER_SPACE (3); b += 3; laststart = 0; begalt = b; break; case '{': /* If \{ is a literal. */ if (!(syntax & RE_INTERVALS) /* If we're at `\{' and it's not the open-interval operator. */ || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) || (p - 2 == pattern && p == pend)) goto normal_backslash; handle_interval: { /* If got here, then the syntax allows intervals. */ /* At least (most) this many matches must be made. */ int lower_bound = -1, upper_bound = -1; beg_interval = p - 1; if (p == pend) { if (syntax & RE_NO_BK_BRACES) goto unfetch_interval; else return REG_EBRACE; } GET_UNSIGNED_NUMBER (lower_bound); if (c == ',') { GET_UNSIGNED_NUMBER (upper_bound); if (upper_bound < 0) upper_bound = RE_DUP_MAX; } else /* Interval such as `{1}' => match exactly once. */ upper_bound = lower_bound; if (lower_bound < 0 || upper_bound > RE_DUP_MAX || lower_bound > upper_bound) { if (syntax & RE_NO_BK_BRACES) goto unfetch_interval; else return REG_BADBR; } if (!(syntax & RE_NO_BK_BRACES)) { if (c != '\\') return REG_EBRACE; PATFETCH (c); } if (c != '}') { if (syntax & RE_NO_BK_BRACES) goto unfetch_interval; else return REG_BADBR; } /* We just parsed a valid interval. */ /* If it's invalid to have no preceding re. */ if (!laststart) { if (syntax & RE_CONTEXT_INVALID_OPS) return REG_BADRPT; else if (syntax & RE_CONTEXT_INDEP_OPS) laststart = b; else goto unfetch_interval; } /* If the upper bound is zero, don't want to succeed at all; jump from `laststart' to `b + 3', which will be the end of the buffer after we insert the jump. */ if (upper_bound == 0) { GET_BUFFER_SPACE (3); INSERT_JUMP (jump, laststart, b + 3); b += 3; } /* Otherwise, we have a nontrivial interval. When we're all done, the pattern will look like: set_number_at set_number_at succeed_n jump_n (The upper bound and `jump_n' are omitted if `upper_bound' is 1, though.) */ else { /* If the upper bound is > 1, we need to insert more at the end of the loop. */ unsigned nbytes = 10 + (upper_bound > 1) * 10; GET_BUFFER_SPACE (nbytes); /* Initialize lower bound of the `succeed_n', even though it will be set during matching by its attendant `set_number_at' (inserted next), because `re_compile_fastmap' needs to know. Jump to the `jump_n' we might insert below. */ INSERT_JUMP2 (succeed_n, laststart, b + 5 + (upper_bound > 1) * 5, lower_bound); b += 5; /* Code to initialize the lower bound. Insert before the `succeed_n'. The `5' is the last two bytes of this `set_number_at', plus 3 bytes of the following `succeed_n'. */ insert_op2 (set_number_at, laststart, 5, lower_bound, b); b += 5; if (upper_bound > 1) { /* More than one repetition is allowed, so append a backward jump to the `succeed_n' that starts this interval. When we've reached this during matching, we'll have matched the interval once, so jump back only `upper_bound - 1' times. */ STORE_JUMP2 (jump_n, b, laststart + 5, upper_bound - 1); b += 5; /* The location we want to set is the second parameter of the `jump_n'; that is `b-2' as an absolute address. `laststart' will be the `set_number_at' we're about to insert; `laststart+3' the number to set, the source for the relative address. But we are inserting into the middle of the pattern -- so everything is getting moved up by 5. Conclusion: (b - 2) - (laststart + 3) + 5, i.e., b - laststart. We insert this at the beginning of the loop so that if we fail during matching, we'll reinitialize the bounds. */ insert_op2 (set_number_at, laststart, b - laststart, upper_bound - 1, b); b += 5; } } pending_exact = 0; beg_interval = NULL; } break; unfetch_interval: /* If an invalid interval, match the characters as literals. */ assert (beg_interval); p = beg_interval; beg_interval = NULL; /* normal_char and normal_backslash need `c'. */ PATFETCH (c); if (!(syntax & RE_NO_BK_BRACES)) { if (p > pattern && p[-1] == '\\') goto normal_backslash; } goto normal_char; #ifdef emacs /* There is no way to specify the before_dot and after_dot operators. rms says this is ok. --karl */ case '=': BUF_PUSH (at_dot); break; case 's': laststart = b; PATFETCH (c); BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]); break; case 'S': laststart = b; PATFETCH (c); BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]); break; #endif /* emacs */ case 'w': laststart = b; BUF_PUSH (wordchar); break; case 'W': laststart = b; BUF_PUSH (notwordchar); break; case '<': BUF_PUSH (wordbeg); break; case '>': BUF_PUSH (wordend); break; case 'b': BUF_PUSH (wordbound); break; case 'B': BUF_PUSH (notwordbound); break; case '`': BUF_PUSH (begbuf); break; case '\'': BUF_PUSH (endbuf); break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (syntax & RE_NO_BK_REFS) goto normal_char; c1 = c - '0'; if (c1 > regnum) return REG_ESUBREG; /* Can't back reference to a subexpression if inside of it. */ if (group_in_compile_stack (compile_stack, c1)) goto normal_char; laststart = b; BUF_PUSH_2 (duplicate, c1); break; case '+': case '?': if (syntax & RE_BK_PLUS_QM) goto handle_plus; else goto normal_backslash; default: normal_backslash: /* You might think it would be useful for \ to mean not to translate; but if we don't translate it it will never match anything. */ c = TRANSLATE (c); goto normal_char; } break; default: /* Expects the character in `c'. */ normal_char: /* If no exactn currently being built. */ if (!pending_exact /* If last exactn not at current position. */ || pending_exact + *pending_exact + 1 != b /* We have only one byte following the exactn for the count. */ || *pending_exact == (1 << BYTEWIDTH) - 1 /* If followed by a repetition operator. */ || *p == '*' || *p == '^' || ((syntax & RE_BK_PLUS_QM) ? *p == '\\' && (p[1] == '+' || p[1] == '?') : (*p == '+' || *p == '?')) || ((syntax & RE_INTERVALS) && ((syntax & RE_NO_BK_BRACES) ? *p == '{' : (p[0] == '\\' && p[1] == '{')))) { /* Start building a new exactn. */ laststart = b; BUF_PUSH_2 (exactn, 0); pending_exact = b - 1; } BUF_PUSH (c); (*pending_exact)++; break; } /* switch (c) */ } /* while p != pend */ /* Through the pattern now. */ if (fixup_alt_jump) STORE_JUMP (jump_past_alt, fixup_alt_jump, b); if (!COMPILE_STACK_EMPTY) return REG_EPAREN; free (compile_stack.stack); /* We have succeeded; set the length of the buffer. */ bufp->used = b - bufp->buffer; #ifdef DEBUG if (debug) { DEBUG_PRINT1 ("\nCompiled pattern: "); print_compiled_pattern (bufp); } #endif /* DEBUG */ return REG_NOERROR; } /* regex_compile */ /* Subroutines for `regex_compile'. */ /* Store OP at LOC followed by two-byte integer parameter ARG. */ static void store_op1 (op, loc, arg) re_opcode_t op; unsigned char *loc; int arg; { *loc = (unsigned char) op; STORE_NUMBER (loc + 1, arg); } /* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */ static void store_op2 (op, loc, arg1, arg2) re_opcode_t op; unsigned char *loc; int arg1, arg2; { *loc = (unsigned char) op; STORE_NUMBER (loc + 1, arg1); STORE_NUMBER (loc + 3, arg2); } /* Copy the bytes from LOC to END to open up three bytes of space at LOC for OP followed by two-byte integer parameter ARG. */ static void insert_op1 (op, loc, arg, end) re_opcode_t op; unsigned char *loc; int arg; unsigned char *end; { register unsigned char *pfrom = end; register unsigned char *pto = end + 3; while (pfrom != loc) *--pto = *--pfrom; store_op1 (op, loc, arg); } /* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */ static void insert_op2 (op, loc, arg1, arg2, end) re_opcode_t op; unsigned char *loc; int arg1, arg2; unsigned char *end; { register unsigned char *pfrom = end; register unsigned char *pto = end + 5; while (pfrom != loc) *--pto = *--pfrom; store_op2 (op, loc, arg1, arg2); } /* P points to just after a ^ in PATTERN. Return true if that ^ comes after an alternative or a begin-subexpression. We assume there is at least one character before the ^. */ static boolean at_begline_loc_p (pattern, p, syntax) const char *pattern, *p; reg_syntax_t syntax; { const char *prev = p - 2; boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\'; return /* After a subexpression? */ (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash)) /* After an alternative? */ || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash)); } /* The dual of at_begline_loc_p. This one is for $. We assume there is at least one character after the $, i.e., `P < PEND'. */ static boolean at_endline_loc_p (p, pend, syntax) const char *p, *pend; int syntax; { const char *next = p; boolean next_backslash = *next == '\\'; const char *next_next = p + 1 < pend ? p + 1 : NULL; return /* Before a subexpression? */ (syntax & RE_NO_BK_PARENS ? *next == ')' : next_backslash && next_next && *next_next == ')') /* Before an alternative? */ || (syntax & RE_NO_BK_VBAR ? *next == '|' : next_backslash && next_next && *next_next == '|'); } /* Returns true if REGNUM is in one of COMPILE_STACK's elements and false if it's not. */ static boolean group_in_compile_stack (compile_stack, regnum) compile_stack_type compile_stack; regnum_t regnum; { int this_element; for (this_element = compile_stack.avail - 1; this_element >= 0; this_element--) if (compile_stack.stack[this_element].regnum == regnum) return true; return false; } /* Read the ending character of a range (in a bracket expression) from the uncompiled pattern *P_PTR (which ends at PEND). We assume the starting character is in `P[-2]'. (`P[-1]' is the character `-'.) Then we set the translation of all bits between the starting and ending characters (inclusive) in the compiled pattern B. Return an error code. We use these short variable names so we can use the same macros as `regex_compile' itself. */ static reg_errcode_t compile_range (p_ptr, pend, translate, syntax, b) const char **p_ptr, *pend; char *translate; reg_syntax_t syntax; unsigned char *b; { unsigned this_char; const char *p = *p_ptr; int range_start, range_end; if (p == pend) return REG_ERANGE; /* Even though the pattern is a signed `char *', we need to fetch with unsigned char *'s; if the high bit of the pattern character is set, the range endpoints will be negative if we fetch using a signed char *. We also want to fetch the endpoints without translating them; the appropriate translation is done in the bit-setting loop below. */ range_start = ((unsigned char *) p)[-2]; range_end = ((unsigned char *) p)[0]; /* Have to increment the pointer into the pattern string, so the caller isn't still at the ending character. */ (*p_ptr)++; /* If the start is after the end, the range is empty. */ if (range_start > range_end) return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR; /* Here we see why `this_char' has to be larger than an `unsigned char' -- the range is inclusive, so if `range_end' == 0xff (assuming 8-bit characters), we would otherwise go into an infinite loop, since all characters <= 0xff. */ for (this_char = range_start; this_char <= range_end; this_char++) { SET_LIST_BIT (TRANSLATE (this_char)); } return REG_NOERROR; } /* Failure stack declarations and macros; both re_compile_fastmap and re_match_2 use a failure stack. These have to be macros because of REGEX_ALLOCATE. */ /* Number of failure points for which to initially allocate space when matching. If this number is exceeded, we allocate more space, so it is not a hard limit. */ #ifndef INIT_FAILURE_ALLOC #define INIT_FAILURE_ALLOC 5 #endif /* Roughly the maximum number of failure points on the stack. Would be exactly that if always used MAX_FAILURE_SPACE each time we failed. This is a variable only so users of regex can assign to it; we never change it ourselves. */ int re_max_failures = 2000; typedef const unsigned char *fail_stack_elt_t; typedef struct { fail_stack_elt_t *stack; unsigned size; unsigned avail; /* Offset of next open position. */ } fail_stack_type; #define FAIL_STACK_EMPTY() (fail_stack.avail == 0) #define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0) #define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size) #define FAIL_STACK_TOP() (fail_stack.stack[fail_stack.avail]) /* Initialize `fail_stack'. Do `return -2' if the alloc fails. */ #define INIT_FAIL_STACK() \ do { \ fail_stack.stack = (fail_stack_elt_t *) \ REGEX_ALLOCATE (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t)); \ \ if (fail_stack.stack == NULL) \ return -2; \ \ fail_stack.size = INIT_FAILURE_ALLOC; \ fail_stack.avail = 0; \ } while (0) /* Double the size of FAIL_STACK, up to approximately `re_max_failures' items. Return 1 if succeeds, and 0 if either ran out of memory allocating space for it or it was already too large. REGEX_REALLOCATE requires `destination' be declared. */ #define DOUBLE_FAIL_STACK(fail_stack) \ ((fail_stack).size > re_max_failures * MAX_FAILURE_ITEMS \ ? 0 \ : ((fail_stack).stack = (fail_stack_elt_t *) \ REGEX_REALLOCATE ((fail_stack).stack, \ (fail_stack).size * sizeof (fail_stack_elt_t), \ ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)), \ \ (fail_stack).stack == NULL \ ? 0 \ : ((fail_stack).size <<= 1, \ 1))) /* Push PATTERN_OP on FAIL_STACK. Return 1 if was able to do so and 0 if ran out of memory allocating space to do so. */ #define PUSH_PATTERN_OP(pattern_op, fail_stack) \ ((FAIL_STACK_FULL () \ && !DOUBLE_FAIL_STACK (fail_stack)) \ ? 0 \ : ((fail_stack).stack[(fail_stack).avail++] = pattern_op, \ 1)) /* This pushes an item onto the failure stack. Must be a four-byte value. Assumes the variable `fail_stack'. Probably should only be called from within `PUSH_FAILURE_POINT'. */ #define PUSH_FAILURE_ITEM(item) \ fail_stack.stack[fail_stack.avail++] = (fail_stack_elt_t) item /* The complement operation. Assumes `fail_stack' is nonempty. */ #define POP_FAILURE_ITEM() fail_stack.stack[--fail_stack.avail] /* Used to omit pushing failure point id's when we're not debugging. */ #ifdef DEBUG #define DEBUG_PUSH PUSH_FAILURE_ITEM #define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_ITEM () #else #define DEBUG_PUSH(item) #define DEBUG_POP(item_addr) #endif /* Push the information about the state we will need if we ever fail back to it. Requires variables fail_stack, regstart, regend, reg_info, and num_regs be declared. DOUBLE_FAIL_STACK requires `destination' be declared. Does `return FAILURE_CODE' if runs out of memory. */ #define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \ do { \ char *destination; \ /* Must be int, so when we don't save any registers, the arithmetic \ of 0 + -1 isn't done as unsigned. */ \ int this_reg; \ \ DEBUG_STATEMENT (failure_id++); \ DEBUG_STATEMENT (nfailure_points_pushed++); \ DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \ DEBUG_PRINT2 (" Before push, next avail: %d\n", (fail_stack).avail);\ DEBUG_PRINT2 (" size: %d\n", (fail_stack).size);\ \ DEBUG_PRINT2 (" slots needed: %d\n", NUM_FAILURE_ITEMS); \ DEBUG_PRINT2 (" available: %d\n", REMAINING_AVAIL_SLOTS); \ \ /* Ensure we have enough space allocated for what we will push. */ \ while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS) \ { \ if (!DOUBLE_FAIL_STACK (fail_stack)) \ return failure_code; \ \ DEBUG_PRINT2 ("\n Doubled stack; size now: %d\n", \ (fail_stack).size); \ DEBUG_PRINT2 (" slots available: %d\n", REMAINING_AVAIL_SLOTS);\ } \ \ /* Push the info, starting with the registers. */ \ DEBUG_PRINT1 ("\n"); \ \ for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \ this_reg++) \ { \ DEBUG_PRINT2 (" Pushing reg: %d\n", this_reg); \ DEBUG_STATEMENT (num_regs_pushed++); \ \ DEBUG_PRINT2 (" start: 0x%x\n", regstart[this_reg]); \ PUSH_FAILURE_ITEM (regstart[this_reg]); \ \ DEBUG_PRINT2 (" end: 0x%x\n", regend[this_reg]); \ PUSH_FAILURE_ITEM (regend[this_reg]); \ \ DEBUG_PRINT2 (" info: 0x%x\n ", reg_info[this_reg]); \ DEBUG_PRINT2 (" match_null=%d", \ REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \ DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \ DEBUG_PRINT2 (" matched_something=%d", \ MATCHED_SOMETHING (reg_info[this_reg])); \ DEBUG_PRINT2 (" ever_matched=%d", \ EVER_MATCHED_SOMETHING (reg_info[this_reg])); \ DEBUG_PRINT1 ("\n"); \ PUSH_FAILURE_ITEM (reg_info[this_reg].word); \ } \ \ DEBUG_PRINT2 (" Pushing low active reg: %d\n", lowest_active_reg);\ PUSH_FAILURE_ITEM (lowest_active_reg); \ \ DEBUG_PRINT2 (" Pushing high active reg: %d\n", highest_active_reg);\ PUSH_FAILURE_ITEM (highest_active_reg); \ \ DEBUG_PRINT2 (" Pushing pattern 0x%x: ", pattern_place); \ DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \ PUSH_FAILURE_ITEM (pattern_place); \ \ DEBUG_PRINT2 (" Pushing string 0x%x: `", string_place); \ DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \ size2); \ DEBUG_PRINT1 ("'\n"); \ PUSH_FAILURE_ITEM (string_place); \ \ DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \ DEBUG_PUSH (failure_id); \ } while (0) /* This is the number of items that are pushed and popped on the stack for each register. */ #define NUM_REG_ITEMS 3 /* Individual items aside from the registers. */ #ifdef DEBUG #define NUM_NONREG_ITEMS 5 /* Includes failure point id. */ #else #define NUM_NONREG_ITEMS 4 #endif /* We push at most this many items on the stack. */ #define MAX_FAILURE_ITEMS ((num_regs - 1) * NUM_REG_ITEMS + NUM_NONREG_ITEMS) /* We actually push this many items. */ #define NUM_FAILURE_ITEMS \ ((highest_active_reg - lowest_active_reg + 1) * NUM_REG_ITEMS \ + NUM_NONREG_ITEMS) /* How many items can still be added to the stack without overflowing it. */ #define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail) /* Pops what PUSH_FAIL_STACK pushes. We restore into the parameters, all of which should be lvalues: STR -- the saved data position. PAT -- the saved pattern position. LOW_REG, HIGH_REG -- the highest and lowest active registers. REGSTART, REGEND -- arrays of string positions. REG_INFO -- array of information about each subexpression. Also assumes the variables `fail_stack' and (if debugging), `bufp', `pend', `string1', `size1', `string2', and `size2'. */ #define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\ { \ DEBUG_STATEMENT (fail_stack_elt_t failure_id;) \ int this_reg; \ const unsigned char *string_temp; \ \ assert (!FAIL_STACK_EMPTY ()); \ \ /* Remove failure points and point to how many regs pushed. */ \ DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \ DEBUG_PRINT2 (" Before pop, next avail: %d\n", fail_stack.avail); \ DEBUG_PRINT2 (" size: %d\n", fail_stack.size); \ \ assert (fail_stack.avail >= NUM_NONREG_ITEMS); \ \ DEBUG_POP (&failure_id); \ DEBUG_PRINT2 (" Popping failure id: %u\n", failure_id); \ \ /* If the saved string location is NULL, it came from an \ on_failure_keep_string_jump opcode, and we want to throw away the \ saved NULL, thus retaining our current position in the string. */ \ string_temp = POP_FAILURE_ITEM (); \ if (string_temp != NULL) \ str = (const char *) string_temp; \ \ DEBUG_PRINT2 (" Popping string 0x%x: `", str); \ DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \ DEBUG_PRINT1 ("'\n"); \ \ pat = (unsigned char *) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" Popping pattern 0x%x: ", pat); \ DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \ \ /* Restore register info. */ \ high_reg = (unsigned) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" Popping high active reg: %d\n", high_reg); \ \ low_reg = (unsigned) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" Popping low active reg: %d\n", low_reg); \ \ for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \ { \ DEBUG_PRINT2 (" Popping reg: %d\n", this_reg); \ \ reg_info[this_reg].word = POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" info: 0x%x\n", reg_info[this_reg]); \ \ regend[this_reg] = (const char *) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" end: 0x%x\n", regend[this_reg]); \ \ regstart[this_reg] = (const char *) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" start: 0x%x\n", regstart[this_reg]); \ } \ \ DEBUG_STATEMENT (nfailure_points_popped++); \ } /* POP_FAILURE_POINT */ /* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible characters can start a string that matches the pattern. This fastmap is used by re_search to skip quickly over impossible starting points. The caller must supply the address of a (1 << BYTEWIDTH)-byte data area as BUFP->fastmap. We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in the pattern buffer. Returns 0 if we succeed, -2 if an internal error. */ int re_compile_fastmap (bufp) struct re_pattern_buffer *bufp; { int j, k; fail_stack_type fail_stack; #ifndef REGEX_MALLOC char *destination; #endif /* We don't push any register information onto the failure stack. */ unsigned num_regs = 0; register char *fastmap = bufp->fastmap; unsigned char *pattern = bufp->buffer; unsigned long size = bufp->used; const unsigned char *p = pattern; register unsigned char *pend = pattern + size; /* Assume that each path through the pattern can be null until proven otherwise. We set this false at the bottom of switch statement, to which we get only if a particular path doesn't match the empty string. */ boolean path_can_be_null = true; /* We aren't doing a `succeed_n' to begin with. */ boolean succeed_n_p = false; assert (fastmap != NULL && p != NULL); INIT_FAIL_STACK (); bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */ bufp->fastmap_accurate = 1; /* It will be when we're done. */ bufp->can_be_null = 0; while (p != pend || !FAIL_STACK_EMPTY ()) { if (p == pend) { bufp->can_be_null |= path_can_be_null; /* Reset for next path. */ path_can_be_null = true; p = fail_stack.stack[--fail_stack.avail]; } /* We should never be about to go beyond the end of the pattern. */ assert (p < pend); #ifdef SWITCH_ENUM_BUG switch ((int) ((re_opcode_t) *p++)) #else switch ((re_opcode_t) *p++) #endif { /* I guess the idea here is to simply not bother with a fastmap if a backreference is used, since it's too hard to figure out the fastmap for the corresponding group. Setting `can_be_null' stops `re_search_2' from using the fastmap, so that is all we do. */ case duplicate: bufp->can_be_null = 1; return 0; /* Following are the cases which match a character. These end with `break'. */ case exactn: fastmap[p[1]] = 1; break; case charset: for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) fastmap[j] = 1; break; case charset_not: /* Chars beyond end of map must be allowed. */ for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) fastmap[j] = 1; for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))) fastmap[j] = 1; break; case wordchar: for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) == Sword) fastmap[j] = 1; break; case notwordchar: for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) != Sword) fastmap[j] = 1; break; case anychar: /* `.' matches anything ... */ for (j = 0; j < (1 << BYTEWIDTH); j++) fastmap[j] = 1; /* ... except perhaps newline. */ if (!(bufp->syntax & RE_DOT_NEWLINE)) fastmap['\n'] = 0; /* Return if we have already set `can_be_null'; if we have, then the fastmap is irrelevant. Something's wrong here. */ else if (bufp->can_be_null) return 0; /* Otherwise, have to check alternative paths. */ break; #ifdef emacs case syntaxspec: k = *p++; for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) == (enum syntaxcode) k) fastmap[j] = 1; break; case notsyntaxspec: k = *p++; for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) != (enum syntaxcode) k) fastmap[j] = 1; break; /* All cases after this match the empty string. These end with `continue'. */ case before_dot: case at_dot: case after_dot: continue; #endif /* not emacs */ case no_op: case begline: case endline: case begbuf: case endbuf: case wordbound: case notwordbound: case wordbeg: case wordend: case push_dummy_failure: continue; case jump_n: case pop_failure_jump: case maybe_pop_jump: case jump: case jump_past_alt: case dummy_failure_jump: EXTRACT_NUMBER_AND_INCR (j, p); p += j; if (j > 0) continue; /* Jump backward implies we just went through the body of a loop and matched nothing. Opcode jumped to should be `on_failure_jump' or `succeed_n'. Just treat it like an ordinary jump. For a * loop, it has pushed its failure point already; if so, discard that as redundant. */ if ((re_opcode_t) *p != on_failure_jump && (re_opcode_t) *p != succeed_n) continue; p++; EXTRACT_NUMBER_AND_INCR (j, p); p += j; /* If what's on the stack is where we are now, pop it. */ if (!FAIL_STACK_EMPTY () && fail_stack.stack[fail_stack.avail - 1] == p) fail_stack.avail--; continue; case on_failure_jump: case on_failure_keep_string_jump: handle_on_failure_jump: EXTRACT_NUMBER_AND_INCR (j, p); /* For some patterns, e.g., `(a?)?', `p+j' here points to the end of the pattern. We don't want to push such a point, since when we restore it above, entering the switch will increment `p' past the end of the pattern. We don't need to push such a point since we obviously won't find any more fastmap entries beyond `pend'. Such a pattern can match the null string, though. */ if (p + j < pend) { if (!PUSH_PATTERN_OP (p + j, fail_stack)) return -2; } else bufp->can_be_null = 1; if (succeed_n_p) { EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */ succeed_n_p = false; } continue; case succeed_n: /* Get to the number of times to succeed. */ p += 2; /* Increment p past the n for when k != 0. */ EXTRACT_NUMBER_AND_INCR (k, p); if (k == 0) { p -= 4; succeed_n_p = true; /* Spaghetti code alert. */ goto handle_on_failure_jump; } continue; case set_number_at: p += 4; continue; case start_memory: case stop_memory: p += 2; continue; default: abort (); /* We have listed all the cases. */ } /* switch *p++ */ /* Getting here means we have found the possible starting characters for one path of the pattern -- and that the empty string does not match. We need not follow this path further. Instead, look at the next alternative (remembered on the stack), or quit if no more. The test at the top of the loop does these things. */ path_can_be_null = false; p = pend; } /* while p */ /* Set `can_be_null' for the last path (also the first path, if the pattern is empty). */ bufp->can_be_null |= path_can_be_null; return 0; } /* re_compile_fastmap */ /* Set REGS to hold NUM_REGS registers, storing them in STARTS and ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use this memory for recording register information. STARTS and ENDS must be allocated using the malloc library routine, and must each be at least NUM_REGS * sizeof (regoff_t) bytes long. If NUM_REGS == 0, then subsequent matches should allocate their own register data. Unless this function is called, the first search or match using PATTERN_BUFFER will allocate its own register data, without freeing the old data. */ void re_set_registers (bufp, regs, num_regs, starts, ends) struct re_pattern_buffer *bufp; struct re_registers *regs; unsigned num_regs; regoff_t *starts, *ends; { if (num_regs) { bufp->regs_allocated = REGS_REALLOCATE; regs->num_regs = num_regs; regs->start = starts; regs->end = ends; } else { bufp->regs_allocated = REGS_UNALLOCATED; regs->num_regs = 0; regs->start = regs->end = (regoff_t) 0; } } /* Searching routines. */ /* Like re_search_2, below, but only one string is specified, and doesn't let you say where to stop matching. */ int re_search (bufp, string, size, startpos, range, regs) struct re_pattern_buffer *bufp; const char *string; int size, startpos, range; struct re_registers *regs; { return re_search_2 (bufp, NULL, 0, string, size, startpos, range, regs, size); } /* Using the compiled pattern in BUFP->buffer, first tries to match the virtual concatenation of STRING1 and STRING2, starting first at index STARTPOS, then at STARTPOS + 1, and so on. STRING1 and STRING2 have length SIZE1 and SIZE2, respectively. RANGE is how far to scan while trying to match. RANGE = 0 means try only at STARTPOS; in general, the last start tried is STARTPOS + RANGE. In REGS, return the indices of the virtual concatenation of STRING1 and STRING2 that matched the entire BUFP->buffer and its contained subexpressions. Do not consider matching one past the index STOP in the virtual concatenation of STRING1 and STRING2. We return either the position in the strings at which the match was found, -1 if no match, or -2 if error (such as failure stack overflow). */ int re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop) struct re_pattern_buffer *bufp; const char *string1, *string2; int size1, size2; int startpos; int range; struct re_registers *regs; int stop; { int val; register char *fastmap = bufp->fastmap; register char *translate = bufp->translate; int total_size = size1 + size2; int endpos = startpos + range; /* Check for out-of-range STARTPOS. */ if (startpos < 0 || startpos > total_size) return -1; /* Fix up RANGE if it might eventually take us outside the virtual concatenation of STRING1 and STRING2. */ if (endpos < -1) range = -1 - startpos; else if (endpos > total_size) range = total_size - startpos; /* If the search isn't to be a backwards one, don't waste time in a search for a pattern that must be anchored. */ if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0) { if (startpos > 0) return -1; else range = 1; } /* Update the fastmap now if not correct already. */ if (fastmap && !bufp->fastmap_accurate) if (re_compile_fastmap (bufp) == -2) return -2; /* Loop through the string, looking for a place to start matching. */ for (;;) { /* If a fastmap is supplied, skip quickly over characters that cannot be the start of a match. If the pattern can match the null string, however, we don't need to skip characters; we want the first null string. */ if (fastmap && startpos < total_size && !bufp->can_be_null) { if (range > 0) /* Searching forwards. */ { register const char *d; register int lim = 0; int irange = range; if (startpos < size1 && startpos + range >= size1) lim = range - (size1 - startpos); d = (startpos >= size1 ? string2 - size1 : string1) + startpos; /* Written out as an if-else to avoid testing `translate' inside the loop. */ if (translate) while (range > lim && !fastmap[(unsigned char) translate[(unsigned char) *d++]]) range--; else while (range > lim && !fastmap[(unsigned char) *d++]) range--; startpos += irange - range; } else /* Searching backwards. */ { register char c = (size1 == 0 || startpos >= size1 ? string2[startpos - size1] : string1[startpos]); if (!fastmap[(unsigned char) TRANSLATE (c)]) goto advance; } } /* If can't match the null string, and that's all we have left, fail. */ if (range >= 0 && startpos == total_size && fastmap && !bufp->can_be_null) return -1; val = re_match_2 (bufp, string1, size1, string2, size2, startpos, regs, stop); if (val >= 0) return startpos; if (val == -2) return -2; advance: if (!range) break; else if (range > 0) { range--; startpos++; } else { range++; startpos--; } } return -1; } /* re_search_2 */ /* Declarations and macros for re_match_2. */ static int bcmp_translate (); static boolean alt_match_null_string_p (), common_op_match_null_string_p (), group_match_null_string_p (); /* Structure for per-register (a.k.a. per-group) information. This must not be longer than one word, because we push this value onto the failure stack. Other register information, such as the starting and ending positions (which are addresses), and the list of inner groups (which is a bits list) are maintained in separate variables. We are making a (strictly speaking) nonportable assumption here: that the compiler will pack our bit fields into something that fits into the type of `word', i.e., is something that fits into one item on the failure stack. */ typedef union { fail_stack_elt_t word; struct { /* This field is one if this group can match the empty string, zero if not. If not yet determined, `MATCH_NULL_UNSET_VALUE'. */ #define MATCH_NULL_UNSET_VALUE 3 unsigned match_null_string_p : 2; unsigned is_active : 1; unsigned matched_something : 1; unsigned ever_matched_something : 1; } bits; } register_info_type; #define REG_MATCH_NULL_STRING_P(R) ((R).bits.match_null_string_p) #define IS_ACTIVE(R) ((R).bits.is_active) #define MATCHED_SOMETHING(R) ((R).bits.matched_something) #define EVER_MATCHED_SOMETHING(R) ((R).bits.ever_matched_something) /* Call this when have matched a real character; it sets `matched' flags for the subexpressions which we are currently inside. Also records that those subexprs have matched. */ #define SET_REGS_MATCHED() \ do \ { \ unsigned r; \ for (r = lowest_active_reg; r <= highest_active_reg; r++) \ { \ MATCHED_SOMETHING (reg_info[r]) \ = EVER_MATCHED_SOMETHING (reg_info[r]) \ = 1; \ } \ } \ while (0) /* This converts PTR, a pointer into one of the search strings `string1' and `string2' into an offset from the beginning of that string. */ #define POINTER_TO_OFFSET(ptr) \ (FIRST_STRING_P (ptr) ? (ptr) - string1 : (ptr) - string2 + size1) /* Registers are set to a sentinel when they haven't yet matched. */ #define REG_UNSET_VALUE ((char *) -1) #define REG_UNSET(e) ((e) == REG_UNSET_VALUE) /* Macros for dealing with the split strings in re_match_2. */ #define MATCHING_IN_FIRST_STRING (dend == end_match_1) /* Call before fetching a character with *d. This switches over to string2 if necessary. */ #define PREFETCH() \ while (d == dend) \ { \ /* End of string2 => fail. */ \ if (dend == end_match_2) \ goto fail; \ /* End of string1 => advance to string2. */ \ d = string2; \ dend = end_match_2; \ } /* Test if at very beginning or at very end of the virtual concatenation of `string1' and `string2'. If only one string, it's `string2'. */ #define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2) #define AT_STRINGS_END(d) ((d) == end2) /* Test if D points to a character which is word-constituent. We have two special cases to check for: if past the end of string1, look at the first character in string2; and if before the beginning of string2, look at the last character in string1. */ #define WORDCHAR_P(d) \ (SYNTAX ((d) == end1 ? *string2 \ : (d) == string2 - 1 ? *(end1 - 1) : *(d)) \ == Sword) /* Test if the character before D and the one at D differ with respect to being word-constituent. */ #define AT_WORD_BOUNDARY(d) \ (AT_STRINGS_BEG (d) || AT_STRINGS_END (d) \ || WORDCHAR_P (d - 1) != WORDCHAR_P (d)) /* Free everything we malloc. */ #ifdef REGEX_MALLOC #define FREE_VAR(var) if (var) free (var); var = NULL #define FREE_VARIABLES() \ do { \ FREE_VAR (fail_stack.stack); \ FREE_VAR (regstart); \ FREE_VAR (regend); \ FREE_VAR (old_regstart); \ FREE_VAR (old_regend); \ FREE_VAR (best_regstart); \ FREE_VAR (best_regend); \ FREE_VAR (reg_info); \ FREE_VAR (reg_dummy); \ FREE_VAR (reg_info_dummy); \ } while (0) #else /* not REGEX_MALLOC */ /* Some MIPS systems (at least) want this to free alloca'd storage. */ #define FREE_VARIABLES() alloca (0) #endif /* not REGEX_MALLOC */ /* These values must meet several constraints. They must not be valid register values; since we have a limit of 255 registers (because we use only one byte in the pattern for the register number), we can use numbers larger than 255. They must differ by 1, because of NUM_FAILURE_ITEMS above. And the value for the lowest register must be larger than the value for the highest register, so we do not try to actually save any registers when none are active. */ #define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH) #define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1) /* Matching routines. */ #ifndef emacs /* Emacs never uses this. */ /* re_match is like re_match_2 except it takes only a single string. */ int re_match (bufp, string, size, pos, regs) struct re_pattern_buffer *bufp; const char *string; int size, pos; struct re_registers *regs; { return re_match_2 (bufp, NULL, 0, string, size, pos, regs, size); } #endif /* not emacs */ /* re_match_2 matches the compiled pattern in BUFP against the the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1 and SIZE2, respectively). We start matching at POS, and stop matching at STOP. If REGS is non-null and the `no_sub' field of BUFP is nonzero, we store offsets for the substring each group matched in REGS. See the documentation for exactly how many groups we fill. We return -1 if no match, -2 if an internal error (such as the failure stack overflowing). Otherwise, we return the length of the matched substring. */ int re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) struct re_pattern_buffer *bufp; const char *string1, *string2; int size1, size2; int pos; struct re_registers *regs; int stop; { /* General temporaries. */ int mcnt; unsigned char *p1; /* Just past the end of the corresponding string. */ const char *end1, *end2; /* Pointers into string1 and string2, just past the last characters in each to consider matching. */ const char *end_match_1, *end_match_2; /* Where we are in the data, and the end of the current string. */ const char *d, *dend; /* Where we are in the pattern, and the end of the pattern. */ unsigned char *p = bufp->buffer; register unsigned char *pend = p + bufp->used; /* We use this to map every character in the string. */ char *translate = bufp->translate; /* Failure point stack. Each place that can handle a failure further down the line pushes a failure point on this stack. It consists of restart, regend, and reg_info for all registers corresponding to the subexpressions we're currently inside, plus the number of such registers, and, finally, two char *'s. The first char * is where to resume scanning the pattern; the second one is where to resume scanning the strings. If the latter is zero, the failure point is a ``dummy''; if a failure happens and the failure point is a dummy, it gets discarded and the next next one is tried. */ fail_stack_type fail_stack; #ifdef DEBUG static unsigned failure_id = 0; unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0; #endif /* We fill all the registers internally, independent of what we return, for use in backreferences. The number here includes an element for register zero. */ unsigned num_regs = bufp->re_nsub + 1; /* The currently active registers. */ unsigned lowest_active_reg = NO_LOWEST_ACTIVE_REG; unsigned highest_active_reg = NO_HIGHEST_ACTIVE_REG; /* Information on the contents of registers. These are pointers into the input strings; they record just what was matched (on this attempt) by a subexpression part of the pattern, that is, the regnum-th regstart pointer points to where in the pattern we began matching and the regnum-th regend points to right after where we stopped matching the regnum-th subexpression. (The zeroth register keeps track of what the whole pattern matches.) */ const char **regstart = NULL, **regend = NULL; /* If a group that's operated upon by a repetition operator fails to match anything, then the register for its start will need to be restored because it will have been set to wherever in the string we are when we last see its open-group operator. Similarly for a register's end. */ const char **old_regstart = NULL, **old_regend = NULL; /* The is_active field of reg_info helps us keep track of which (possibly nested) subexpressions we are currently in. The matched_something field of reg_info[reg_num] helps us tell whether or not we have matched any of the pattern so far this time through the reg_num-th subexpression. These two fields get reset each time through any loop their register is in. */ register_info_type *reg_info = NULL; /* The following record the register info as found in the above variables when we find a match better than any we've seen before. This happens as we backtrack through the failure points, which in turn happens only if we have not yet matched the entire string. */ unsigned best_regs_set = false; const char **best_regstart = NULL, **best_regend = NULL; /* Logically, this is `best_regend[0]'. But we don't want to have to allocate space for that if we're not allocating space for anything else (see below). Also, we never need info about register 0 for any of the other register vectors, and it seems rather a kludge to treat `best_regend' differently than the rest. So we keep track of the end of the best match so far in a separate variable. We initialize this to NULL so that when we backtrack the first time and need to test it, it's not garbage. */ const char *match_end = NULL; /* Used when we pop values we don't care about. */ const char **reg_dummy = NULL; register_info_type *reg_info_dummy = NULL; #ifdef DEBUG /* Counts the total number of registers pushed. */ unsigned num_regs_pushed = 0; #endif DEBUG_PRINT1 ("\n\nEntering re_match_2.\n"); INIT_FAIL_STACK (); /* Do not bother to initialize all the register variables if there are no groups in the pattern, as it takes a fair amount of time. If there are groups, we include space for register 0 (the whole pattern), even though we never use it, since it simplifies the array indexing. We should fix this. */ if (bufp->re_nsub) { regstart = REGEX_TALLOC (num_regs, const char *); regend = REGEX_TALLOC (num_regs, const char *); old_regstart = REGEX_TALLOC (num_regs, const char *); old_regend = REGEX_TALLOC (num_regs, const char *); best_regstart = REGEX_TALLOC (num_regs, const char *); best_regend = REGEX_TALLOC (num_regs, const char *); reg_info = REGEX_TALLOC (num_regs, register_info_type); reg_dummy = REGEX_TALLOC (num_regs, const char *); reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type); if (!(regstart && regend && old_regstart && old_regend && reg_info && best_regstart && best_regend && reg_dummy && reg_info_dummy)) { FREE_VARIABLES (); return -2; } } #ifdef REGEX_MALLOC else { /* We must initialize all our variables to NULL, so that `FREE_VARIABLES' doesn't try to free them. */ regstart = regend = old_regstart = old_regend = best_regstart = best_regend = reg_dummy = NULL; reg_info = reg_info_dummy = (register_info_type *) NULL; } #endif /* REGEX_MALLOC */ /* The starting position is bogus. */ if (pos < 0 || pos > size1 + size2) { FREE_VARIABLES (); return -1; } /* Initialize subexpression text positions to -1 to mark ones that no start_memory/stop_memory has been seen for. Also initialize the register information struct. */ for (mcnt = 1; mcnt < num_regs; mcnt++) { regstart[mcnt] = regend[mcnt] = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE; REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE; IS_ACTIVE (reg_info[mcnt]) = 0; MATCHED_SOMETHING (reg_info[mcnt]) = 0; EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0; } /* We move `string1' into `string2' if the latter's empty -- but not if `string1' is null. */ if (size2 == 0 && string1 != NULL) { string2 = string1; size2 = size1; string1 = 0; size1 = 0; } end1 = string1 + size1; end2 = string2 + size2; /* Compute where to stop matching, within the two strings. */ if (stop <= size1) { end_match_1 = string1 + stop; end_match_2 = string2; } else { end_match_1 = end1; end_match_2 = string2 + stop - size1; } /* `p' scans through the pattern as `d' scans through the data. `dend' is the end of the input string that `d' points within. `d' is advanced into the following input string whenever necessary, but this happens before fetching; therefore, at the beginning of the loop, `d' can be pointing at the end of a string, but it cannot equal `string2'. */ if (size1 > 0 && pos <= size1) { d = string1 + pos; dend = end_match_1; } else { d = string2 + pos - size1; dend = end_match_2; } DEBUG_PRINT1 ("The compiled pattern is: "); DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend); DEBUG_PRINT1 ("The string to match is: `"); DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2); DEBUG_PRINT1 ("'\n"); /* This loops over pattern commands. It exits by returning from the function if the match is complete, or it drops through if the match fails at this starting point in the input data. */ for (;;) { DEBUG_PRINT2 ("\n0x%x: ", p); if (p == pend) { /* End of pattern means we might have succeeded. */ DEBUG_PRINT1 ("end of pattern ... "); /* If we haven't matched the entire string, and we want the longest match, try backtracking. */ if (d != end_match_2) { DEBUG_PRINT1 ("backtracking.\n"); if (!FAIL_STACK_EMPTY ()) { /* More failure points to try. */ boolean same_str_p = (FIRST_STRING_P (match_end) == MATCHING_IN_FIRST_STRING); /* If exceeds best match so far, save it. */ if (!best_regs_set || (same_str_p && d > match_end) || (!same_str_p && !MATCHING_IN_FIRST_STRING)) { best_regs_set = true; match_end = d; DEBUG_PRINT1 ("\nSAVING match as best so far.\n"); for (mcnt = 1; mcnt < num_regs; mcnt++) { best_regstart[mcnt] = regstart[mcnt]; best_regend[mcnt] = regend[mcnt]; } } goto fail; } /* If no failure points, don't restore garbage. */ else if (best_regs_set) { restore_best_regs: /* Restore best match. It may happen that `dend == end_match_1' while the restored d is in string2. For example, the pattern `x.*y.*z' against the strings `x-' and `y-z-', if the two strings are not consecutive in memory. */ DEBUG_PRINT1 ("Restoring best registers.\n"); d = match_end; dend = ((d >= string1 && d <= end1) ? end_match_1 : end_match_2); for (mcnt = 1; mcnt < num_regs; mcnt++) { regstart[mcnt] = best_regstart[mcnt]; regend[mcnt] = best_regend[mcnt]; } } } /* d != end_match_2 */ DEBUG_PRINT1 ("Accepting match.\n"); /* If caller wants register contents data back, do it. */ if (regs && !bufp->no_sub) { /* Have the register data arrays been allocated? */ if (bufp->regs_allocated == REGS_UNALLOCATED) { /* No. So allocate them with malloc. We need one extra element beyond `num_regs' for the `-1' marker GNU code uses. */ regs->num_regs = MAX (RE_NREGS, num_regs + 1); regs->start = TALLOC (regs->num_regs, regoff_t); regs->end = TALLOC (regs->num_regs, regoff_t); if (regs->start == NULL || regs->end == NULL) return -2; bufp->regs_allocated = REGS_REALLOCATE; } else if (bufp->regs_allocated == REGS_REALLOCATE) { /* Yes. If we need more elements than were already allocated, reallocate them. If we need fewer, just leave it alone. */ if (regs->num_regs < num_regs + 1) { regs->num_regs = num_regs + 1; RETALLOC (regs->start, regs->num_regs, regoff_t); RETALLOC (regs->end, regs->num_regs, regoff_t); if (regs->start == NULL || regs->end == NULL) return -2; } } else assert (bufp->regs_allocated == REGS_FIXED); /* Convert the pointer data in `regstart' and `regend' to indices. Register zero has to be set differently, since we haven't kept track of any info for it. */ if (regs->num_regs > 0) { regs->start[0] = pos; regs->end[0] = (MATCHING_IN_FIRST_STRING ? d - string1 : d - string2 + size1); } /* Go through the first `min (num_regs, regs->num_regs)' registers, since that is all we initialized. */ for (mcnt = 1; mcnt < MIN (num_regs, regs->num_regs); mcnt++) { if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt])) regs->start[mcnt] = regs->end[mcnt] = -1; else { regs->start[mcnt] = POINTER_TO_OFFSET (regstart[mcnt]); regs->end[mcnt] = POINTER_TO_OFFSET (regend[mcnt]); } } /* If the regs structure we return has more elements than were in the pattern, set the extra elements to -1. If we (re)allocated the registers, this is the case, because we always allocate enough to have at least one -1 at the end. */ for (mcnt = num_regs; mcnt < regs->num_regs; mcnt++) regs->start[mcnt] = regs->end[mcnt] = -1; } /* regs && !bufp->no_sub */ FREE_VARIABLES (); DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n", nfailure_points_pushed, nfailure_points_popped, nfailure_points_pushed - nfailure_points_popped); DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed); mcnt = d - pos - (MATCHING_IN_FIRST_STRING ? string1 : string2 - size1); DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt); return mcnt; } /* Otherwise match next pattern command. */ #ifdef SWITCH_ENUM_BUG switch ((int) ((re_opcode_t) *p++)) #else switch ((re_opcode_t) *p++) #endif { /* Ignore these. Used to ignore the n of succeed_n's which currently have n == 0. */ case no_op: DEBUG_PRINT1 ("EXECUTING no_op.\n"); break; /* Match the next n pattern characters exactly. The following byte in the pattern defines n, and the n bytes after that are the characters to match. */ case exactn: mcnt = *p++; DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt); /* This is written out as an if-else so we don't waste time testing `translate' inside the loop. */ if (translate) { do { PREFETCH (); if (translate[(unsigned char) *d++] != (char) *p++) goto fail; } while (--mcnt); } else { do { PREFETCH (); if (*d++ != (char) *p++) goto fail; } while (--mcnt); } SET_REGS_MATCHED (); break; /* Match any character except possibly a newline or a null. */ case anychar: DEBUG_PRINT1 ("EXECUTING anychar.\n"); PREFETCH (); if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n') || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000')) goto fail; SET_REGS_MATCHED (); DEBUG_PRINT2 (" Matched `%d'.\n", *d); d++; break; case charset: case charset_not: { register unsigned char c; boolean not = (re_opcode_t) *(p - 1) == charset_not; DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : ""); PREFETCH (); c = TRANSLATE (*d); /* The character to match. */ /* Cast to `unsigned' instead of `unsigned char' in case the bit list is a full 32 bytes long. */ if (c < (unsigned) (*p * BYTEWIDTH) && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) not = !not; p += 1 + *p; if (!not) goto fail; SET_REGS_MATCHED (); d++; break; } /* The beginning of a group is represented by start_memory. The arguments are the register number in the next byte, and the number of groups inner to this one in the next. The text matched within the group is recorded (in the internal registers data structure) under the register number. */ case start_memory: DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]); /* Find out if this group can match the empty string. */ p1 = p; /* To send to group_match_null_string_p. */ if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE) REG_MATCH_NULL_STRING_P (reg_info[*p]) = group_match_null_string_p (&p1, pend, reg_info); /* Save the position in the string where we were the last time we were at this open-group operator in case the group is operated upon by a repetition operator, e.g., with `(a*)*b' against `ab'; then we want to ignore where we are now in the string in case this attempt to match fails. */ old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) ? REG_UNSET (regstart[*p]) ? d : regstart[*p] : regstart[*p]; DEBUG_PRINT2 (" old_regstart: %d\n", POINTER_TO_OFFSET (old_regstart[*p])); regstart[*p] = d; DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p])); IS_ACTIVE (reg_info[*p]) = 1; MATCHED_SOMETHING (reg_info[*p]) = 0; /* This is the new highest active register. */ highest_active_reg = *p; /* If nothing was active before, this is the new lowest active register. */ if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) lowest_active_reg = *p; /* Move past the register number and inner group count. */ p += 2; break; /* The stop_memory opcode represents the end of a group. Its arguments are the same as start_memory's: the register number, and the number of inner groups. */ case stop_memory: DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]); /* We need to save the string position the last time we were at this close-group operator in case the group is operated upon by a repetition operator, e.g., with `((a*)*(b*)*)*' against `aba'; then we want to ignore where we are now in the string in case this attempt to match fails. */ old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) ? REG_UNSET (regend[*p]) ? d : regend[*p] : regend[*p]; DEBUG_PRINT2 (" old_regend: %d\n", POINTER_TO_OFFSET (old_regend[*p])); regend[*p] = d; DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p])); /* This register isn't active anymore. */ IS_ACTIVE (reg_info[*p]) = 0; /* If this was the only register active, nothing is active anymore. */ if (lowest_active_reg == highest_active_reg) { lowest_active_reg = NO_LOWEST_ACTIVE_REG; highest_active_reg = NO_HIGHEST_ACTIVE_REG; } else { /* We must scan for the new highest active register, since it isn't necessarily one less than now: consider (a(b)c(d(e)f)g). When group 3 ends, after the f), the new highest active register is 1. */ unsigned char r = *p - 1; while (r > 0 && !IS_ACTIVE (reg_info[r])) r--; /* If we end up at register zero, that means that we saved the registers as the result of an `on_failure_jump', not a `start_memory', and we jumped to past the innermost `stop_memory'. For example, in ((.)*) we save registers 1 and 2 as a result of the *, but when we pop back to the second ), we are at the stop_memory 1. Thus, nothing is active. */ if (r == 0) { lowest_active_reg = NO_LOWEST_ACTIVE_REG; highest_active_reg = NO_HIGHEST_ACTIVE_REG; } else highest_active_reg = r; } /* If just failed to match something this time around with a group that's operated on by a repetition operator, try to force exit from the ``loop'', and restore the register information for this group that we had before trying this last match. */ if ((!MATCHED_SOMETHING (reg_info[*p]) || (re_opcode_t) p[-3] == start_memory) && (p + 2) < pend) { boolean is_a_jump_n = false; p1 = p + 2; mcnt = 0; switch ((re_opcode_t) *p1++) { case jump_n: is_a_jump_n = true; case pop_failure_jump: case maybe_pop_jump: case jump: case dummy_failure_jump: EXTRACT_NUMBER_AND_INCR (mcnt, p1); if (is_a_jump_n) p1 += 2; break; default: /* do nothing */ ; } p1 += mcnt; /* If the next operation is a jump backwards in the pattern to an on_failure_jump right before the start_memory corresponding to this stop_memory, exit from the loop by forcing a failure after pushing on the stack the on_failure_jump's jump in the pattern, and d. */ if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump && (re_opcode_t) p1[3] == start_memory && p1[4] == *p) { /* If this group ever matched anything, then restore what its registers were before trying this last failed match, e.g., with `(a*)*b' against `ab' for regstart[1], and, e.g., with `((a*)*(b*)*)*' against `aba' for regend[3]. Also restore the registers for inner groups for, e.g., `((a*)(b*))*' against `aba' (register 3 would otherwise get trashed). */ if (EVER_MATCHED_SOMETHING (reg_info[*p])) { unsigned r; EVER_MATCHED_SOMETHING (reg_info[*p]) = 0; /* Restore this and inner groups' (if any) registers. */ for (r = *p; r < *p + *(p + 1); r++) { regstart[r] = old_regstart[r]; /* xx why this test? */ if ((int) old_regend[r] >= (int) regstart[r]) regend[r] = old_regend[r]; } } p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); PUSH_FAILURE_POINT (p1 + mcnt, d, -2); goto fail; } } /* Move past the register number and the inner group count. */ p += 2; break; /* \ has been turned into a `duplicate' command which is followed by the numeric value of as the register number. */ case duplicate: { register const char *d2, *dend2; int regno = *p++; /* Get which register to match against. */ DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno); /* Can't back reference a group which we've never matched. */ if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno])) goto fail; /* Where in input to try to start matching. */ d2 = regstart[regno]; /* Where to stop matching; if both the place to start and the place to stop matching are in the same string, then set to the place to stop, otherwise, for now have to use the end of the first string. */ dend2 = ((FIRST_STRING_P (regstart[regno]) == FIRST_STRING_P (regend[regno])) ? regend[regno] : end_match_1); for (;;) { /* If necessary, advance to next segment in register contents. */ while (d2 == dend2) { if (dend2 == end_match_2) break; if (dend2 == regend[regno]) break; /* End of string1 => advance to string2. */ d2 = string2; dend2 = regend[regno]; } /* At end of register contents => success */ if (d2 == dend2) break; /* If necessary, advance to next segment in data. */ PREFETCH (); /* How many characters left in this segment to match. */ mcnt = dend - d; /* Want how many consecutive characters we can match in one shot, so, if necessary, adjust the count. */ if (mcnt > dend2 - d2) mcnt = dend2 - d2; /* Compare that many; failure if mismatch, else move past them. */ if (translate ? bcmp_translate (d, d2, mcnt, translate) : bcmp (d, d2, mcnt)) goto fail; d += mcnt, d2 += mcnt; } } break; /* begline matches the empty string at the beginning of the string (unless `not_bol' is set in `bufp'), and, if `newline_anchor' is set, after newlines. */ case begline: DEBUG_PRINT1 ("EXECUTING begline.\n"); if (AT_STRINGS_BEG (d)) { if (!bufp->not_bol) break; } else if (d[-1] == '\n' && bufp->newline_anchor) { break; } /* In all other cases, we fail. */ goto fail; /* endline is the dual of begline. */ case endline: DEBUG_PRINT1 ("EXECUTING endline.\n"); if (AT_STRINGS_END (d)) { if (!bufp->not_eol) break; } /* We have to ``prefetch'' the next character. */ else if ((d == end1 ? *string2 : *d) == '\n' && bufp->newline_anchor) { break; } goto fail; /* Match at the very beginning of the data. */ case begbuf: DEBUG_PRINT1 ("EXECUTING begbuf.\n"); if (AT_STRINGS_BEG (d)) break; goto fail; /* Match at the very end of the data. */ case endbuf: DEBUG_PRINT1 ("EXECUTING endbuf.\n"); if (AT_STRINGS_END (d)) break; goto fail; /* on_failure_keep_string_jump is used to optimize `.*\n'. It pushes NULL as the value for the string on the stack. Then `pop_failure_point' will keep the current value for the string, instead of restoring it. To see why, consider matching `foo\nbar' against `.*\n'. The .* matches the foo; then the . fails against the \n. But the next thing we want to do is match the \n against the \n; if we restored the string value, we would be back at the foo. Because this is used only in specific cases, we don't need to check all the things that `on_failure_jump' does, to make sure the right things get saved on the stack. Hence we don't share its code. The only reason to push anything on the stack at all is that otherwise we would have to change `anychar's code to do something besides goto fail in this case; that seems worse than this. */ case on_failure_keep_string_jump: DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump"); EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt); PUSH_FAILURE_POINT (p + mcnt, NULL, -2); break; /* Uses of on_failure_jump: Each alternative starts with an on_failure_jump that points to the beginning of the next alternative. Each alternative except the last ends with a jump that in effect jumps past the rest of the alternatives. (They really jump to the ending jump of the following alternative, because tensioning these jumps is a hassle.) Repeats start with an on_failure_jump that points past both the repetition text and either the following jump or pop_failure_jump back to this on_failure_jump. */ case on_failure_jump: on_failure: DEBUG_PRINT1 ("EXECUTING on_failure_jump"); EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt); /* If this on_failure_jump comes right before a group (i.e., the original * applied to a group), save the information for that group and all inner ones, so that if we fail back to this point, the group's information will be correct. For example, in \(a*\)*\1, we need the preceding group, and in \(\(a*\)b*\)\2, we need the inner group. */ /* We can't use `p' to check ahead because we push a failure point to `p + mcnt' after we do this. */ p1 = p; /* We need to skip no_op's before we look for the start_memory in case this on_failure_jump is happening as the result of a completed succeed_n, as in \(a\)\{1,3\}b\1 against aba. */ while (p1 < pend && (re_opcode_t) *p1 == no_op) p1++; if (p1 < pend && (re_opcode_t) *p1 == start_memory) { /* We have a new highest active register now. This will get reset at the start_memory we are about to get to, but we will have saved all the registers relevant to this repetition op, as described above. */ highest_active_reg = *(p1 + 1) + *(p1 + 2); if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) lowest_active_reg = *(p1 + 1); } DEBUG_PRINT1 (":\n"); PUSH_FAILURE_POINT (p + mcnt, d, -2); break; /* A smart repeat ends with `maybe_pop_jump'. We change it to either `pop_failure_jump' or `jump'. */ case maybe_pop_jump: EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt); { register unsigned char *p2 = p; /* Compare the beginning of the repeat with what in the pattern follows its end. If we can establish that there is nothing that they would both match, i.e., that we would have to backtrack because of (as in, e.g., `a*a') then we can change to pop_failure_jump, because we'll never have to backtrack. This is not true in the case of alternatives: in `(a|ab)*' we do need to backtrack to the `ab' alternative (e.g., if the string was `ab'). But instead of trying to detect that here, the alternative has put on a dummy failure point which is what we will end up popping. */ /* Skip over open/close-group commands. */ while (p2 + 2 < pend && ((re_opcode_t) *p2 == stop_memory || (re_opcode_t) *p2 == start_memory)) p2 += 3; /* Skip over args, too. */ /* If we're at the end of the pattern, we can change. */ if (p2 == pend) { /* Consider what happens when matching ":\(.*\)" against ":/". I don't really understand this code yet. */ p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT1 (" End of pattern: change to `pop_failure_jump'.\n"); } else if ((re_opcode_t) *p2 == exactn || (bufp->newline_anchor && (re_opcode_t) *p2 == endline)) { register unsigned char c = *p2 == (unsigned char) endline ? '\n' : p2[2]; p1 = p + mcnt; /* p1[0] ... p1[2] are the `on_failure_jump' corresponding to the `maybe_finalize_jump' of this case. Examine what follows. */ if ((re_opcode_t) p1[3] == exactn && p1[5] != c) { p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n", c, p1[5]); } else if ((re_opcode_t) p1[3] == charset || (re_opcode_t) p1[3] == charset_not) { int not = (re_opcode_t) p1[3] == charset_not; if (c < (unsigned char) (p1[4] * BYTEWIDTH) && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) not = !not; /* `not' is equal to 1 if c would match, which means that we can't change to pop_failure_jump. */ if (!not) { p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); } } } } p -= 2; /* Point at relative address again. */ if ((re_opcode_t) p[-1] != pop_failure_jump) { p[-1] = (unsigned char) jump; DEBUG_PRINT1 (" Match => jump.\n"); goto unconditional_jump; } /* Note fall through. */ /* The end of a simple repeat has a pop_failure_jump back to its matching on_failure_jump, where the latter will push a failure point. The pop_failure_jump takes off failure points put on by this pop_failure_jump's matching on_failure_jump; we got through the pattern to here from the matching on_failure_jump, so didn't fail. */ case pop_failure_jump: { /* We need to pass separate storage for the lowest and highest registers, even though we don't care about the actual values. Otherwise, we will restore only one register from the stack, since lowest will == highest in `pop_failure_point'. */ unsigned dummy_low_reg, dummy_high_reg; unsigned char *pdummy; const char *sdummy; DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n"); POP_FAILURE_POINT (sdummy, pdummy, dummy_low_reg, dummy_high_reg, reg_dummy, reg_dummy, reg_info_dummy); } /* Note fall through. */ /* Unconditionally jump (without popping any failure points). */ case jump: unconditional_jump: EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */ DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt); p += mcnt; /* Do the jump. */ DEBUG_PRINT2 ("(to 0x%x).\n", p); break; /* We need this opcode so we can detect where alternatives end in `group_match_null_string_p' et al. */ case jump_past_alt: DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n"); goto unconditional_jump; /* Normally, the on_failure_jump pushes a failure point, which then gets popped at pop_failure_jump. We will end up at pop_failure_jump, also, and with a pattern of, say, `a+', we are skipping over the on_failure_jump, so we have to push something meaningless for pop_failure_jump to pop. */ case dummy_failure_jump: DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n"); /* It doesn't matter what we push for the string here. What the code at `fail' tests is the value for the pattern. */ PUSH_FAILURE_POINT (0, 0, -2); goto unconditional_jump; /* At the end of an alternative, we need to push a dummy failure point in case we are followed by a `pop_failure_jump', because we don't want the failure point for the alternative to be popped. For example, matching `(a|ab)*' against `aab' requires that we match the `ab' alternative. */ case push_dummy_failure: DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n"); /* See comments just above at `dummy_failure_jump' about the two zeroes. */ PUSH_FAILURE_POINT (0, 0, -2); break; /* Have to succeed matching what follows at least n times. After that, handle like `on_failure_jump'. */ case succeed_n: EXTRACT_NUMBER (mcnt, p + 2); DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt); assert (mcnt >= 0); /* Originally, this is how many times we HAVE to succeed. */ if (mcnt > 0) { mcnt--; p += 2; STORE_NUMBER_AND_INCR (p, mcnt); DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p, mcnt); } else if (mcnt == 0) { DEBUG_PRINT2 (" Setting two bytes from 0x%x to no_op.\n", p+2); p[2] = (unsigned char) no_op; p[3] = (unsigned char) no_op; goto on_failure; } break; case jump_n: EXTRACT_NUMBER (mcnt, p + 2); DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt); /* Originally, this is how many times we CAN jump. */ if (mcnt) { mcnt--; STORE_NUMBER (p + 2, mcnt); goto unconditional_jump; } /* If don't have to jump any more, skip over the rest of command. */ else p += 4; break; case set_number_at: { DEBUG_PRINT1 ("EXECUTING set_number_at.\n"); EXTRACT_NUMBER_AND_INCR (mcnt, p); p1 = p + mcnt; EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p1, mcnt); STORE_NUMBER (p1, mcnt); break; } case wordbound: DEBUG_PRINT1 ("EXECUTING wordbound.\n"); if (AT_WORD_BOUNDARY (d)) break; goto fail; case notwordbound: DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); if (AT_WORD_BOUNDARY (d)) goto fail; break; case wordbeg: DEBUG_PRINT1 ("EXECUTING wordbeg.\n"); if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1))) break; goto fail; case wordend: DEBUG_PRINT1 ("EXECUTING wordend.\n"); if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1) && (!WORDCHAR_P (d) || AT_STRINGS_END (d))) break; goto fail; #ifdef emacs #ifdef emacs19 case before_dot: DEBUG_PRINT1 ("EXECUTING before_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) >= point) goto fail; break; case at_dot: DEBUG_PRINT1 ("EXECUTING at_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) != point) goto fail; break; case after_dot: DEBUG_PRINT1 ("EXECUTING after_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) <= point) goto fail; break; #else /* not emacs19 */ case at_dot: DEBUG_PRINT1 ("EXECUTING at_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) + 1 != point) goto fail; break; #endif /* not emacs19 */ case syntaxspec: DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt); mcnt = *p++; goto matchsyntax; case wordchar: DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n"); mcnt = (int) Sword; matchsyntax: PREFETCH (); if (SYNTAX (*d++) != (enum syntaxcode) mcnt) goto fail; SET_REGS_MATCHED (); break; case notsyntaxspec: DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt); mcnt = *p++; goto matchnotsyntax; case notwordchar: DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n"); mcnt = (int) Sword; matchnotsyntax: PREFETCH (); if (SYNTAX (*d++) == (enum syntaxcode) mcnt) goto fail; SET_REGS_MATCHED (); break; #else /* not emacs */ case wordchar: DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n"); PREFETCH (); if (!WORDCHAR_P (d)) goto fail; SET_REGS_MATCHED (); d++; break; case notwordchar: DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n"); PREFETCH (); if (WORDCHAR_P (d)) goto fail; SET_REGS_MATCHED (); d++; break; #endif /* not emacs */ default: abort (); } continue; /* Successfully executed one pattern command; keep going. */ /* We goto here if a matching operation fails. */ fail: if (!FAIL_STACK_EMPTY ()) { /* A restart point is known. Restore to that state. */ DEBUG_PRINT1 ("\nFAIL:\n"); POP_FAILURE_POINT (d, p, lowest_active_reg, highest_active_reg, regstart, regend, reg_info); /* If this failure point is a dummy, try the next one. */ if (!p) goto fail; /* If we failed to the end of the pattern, don't examine *p. */ assert (p <= pend); if (p < pend) { boolean is_a_jump_n = false; /* If failed to a backwards jump that's part of a repetition loop, need to pop this failure point and use the next one. */ switch ((re_opcode_t) *p) { case jump_n: is_a_jump_n = true; case maybe_pop_jump: case pop_failure_jump: case jump: p1 = p + 1; EXTRACT_NUMBER_AND_INCR (mcnt, p1); p1 += mcnt; if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n) || (!is_a_jump_n && (re_opcode_t) *p1 == on_failure_jump)) goto fail; break; default: /* do nothing */ ; } } if (d >= string1 && d <= end1) dend = end_match_1; } else break; /* Matching at this starting point really fails. */ } /* for (;;) */ if (best_regs_set) goto restore_best_regs; FREE_VARIABLES (); return -1; /* Failure to match. */ } /* re_match_2 */ /* Subroutine definitions for re_match_2. */ /* We are passed P pointing to a register number after a start_memory. Return true if the pattern up to the corresponding stop_memory can match the empty string, and false otherwise. If we find the matching stop_memory, sets P to point to one past its number. Otherwise, sets P to an undefined byte less than or equal to END. We don't handle duplicates properly (yet). */ static boolean group_match_null_string_p (p, end, reg_info) unsigned char **p, *end; register_info_type *reg_info; { int mcnt; /* Point to after the args to the start_memory. */ unsigned char *p1 = *p + 2; while (p1 < end) { /* Skip over opcodes that can match nothing, and return true or false, as appropriate, when we get to one that can't, or to the matching stop_memory. */ switch ((re_opcode_t) *p1) { /* Could be either a loop or a series of alternatives. */ case on_failure_jump: p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); /* If the next operation is not a jump backwards in the pattern. */ if (mcnt >= 0) { /* Go through the on_failure_jumps of the alternatives, seeing if any of the alternatives cannot match nothing. The last alternative starts with only a jump, whereas the rest start with on_failure_jump and end with a jump, e.g., here is the pattern for `a|b|c': /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6 /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3 /exactn/1/c So, we have to first go through the first (n-1) alternatives and then deal with the last one separately. */ /* Deal with the first (n-1) alternatives, which start with an on_failure_jump (see above) that jumps to right past a jump_past_alt. */ while ((re_opcode_t) p1[mcnt-3] == jump_past_alt) { /* `mcnt' holds how many bytes long the alternative is, including the ending `jump_past_alt' and its number. */ if (!alt_match_null_string_p (p1, p1 + mcnt - 3, reg_info)) return false; /* Move to right after this alternative, including the jump_past_alt. */ p1 += mcnt; /* Break if it's the beginning of an n-th alternative that doesn't begin with an on_failure_jump. */ if ((re_opcode_t) *p1 != on_failure_jump) break; /* Still have to check that it's not an n-th alternative that starts with an on_failure_jump. */ p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); if ((re_opcode_t) p1[mcnt-3] != jump_past_alt) { /* Get to the beginning of the n-th alternative. */ p1 -= 3; break; } } /* Deal with the last alternative: go back and get number of the `jump_past_alt' just before it. `mcnt' contains the length of the alternative. */ EXTRACT_NUMBER (mcnt, p1 - 2); if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info)) return false; p1 += mcnt; /* Get past the n-th alternative. */ } /* if mcnt > 0 */ break; case stop_memory: assert (p1[1] == **p); *p = p1 + 2; return true; default: if (!common_op_match_null_string_p (&p1, end, reg_info)) return false; } } /* while p1 < end */ return false; } /* group_match_null_string_p */ /* Similar to group_match_null_string_p, but doesn't deal with alternatives: It expects P to be the first byte of a single alternative and END one byte past the last. The alternative can contain groups. */ static boolean alt_match_null_string_p (p, end, reg_info) unsigned char *p, *end; register_info_type *reg_info; { int mcnt; unsigned char *p1 = p; while (p1 < end) { /* Skip over opcodes that can match nothing, and break when we get to one that can't. */ switch ((re_opcode_t) *p1) { /* It's a loop. */ case on_failure_jump: p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); p1 += mcnt; break; default: if (!common_op_match_null_string_p (&p1, end, reg_info)) return false; } } /* while p1 < end */ return true; } /* alt_match_null_string_p */ /* Deals with the ops common to group_match_null_string_p and alt_match_null_string_p. Sets P to one after the op and its arguments, if any. */ static boolean common_op_match_null_string_p (p, end, reg_info) unsigned char **p, *end; register_info_type *reg_info; { int mcnt; boolean ret; int reg_no; unsigned char *p1 = *p; switch ((re_opcode_t) *p1++) { case no_op: case begline: case endline: case begbuf: case endbuf: case wordbeg: case wordend: case wordbound: case notwordbound: #ifdef emacs case before_dot: case at_dot: case after_dot: #endif break; case start_memory: reg_no = *p1; assert (reg_no > 0 && reg_no <= MAX_REGNUM); ret = group_match_null_string_p (&p1, end, reg_info); /* Have to set this here in case we're checking a group which contains a group and a back reference to it. */ if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE) REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret; if (!ret) return false; break; /* If this is an optimized succeed_n for zero times, make the jump. */ case jump: EXTRACT_NUMBER_AND_INCR (mcnt, p1); if (mcnt >= 0) p1 += mcnt; else return false; break; case succeed_n: /* Get to the number of times to succeed. */ p1 += 2; EXTRACT_NUMBER_AND_INCR (mcnt, p1); if (mcnt == 0) { p1 -= 4; EXTRACT_NUMBER_AND_INCR (mcnt, p1); p1 += mcnt; } else return false; break; case duplicate: if (!REG_MATCH_NULL_STRING_P (reg_info[*p1])) return false; break; case set_number_at: p1 += 4; default: /* All other opcodes mean we cannot match the empty string. */ return false; } *p = p1; return true; } /* common_op_match_null_string_p */ /* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN bytes; nonzero otherwise. */ static int bcmp_translate( unsigned char *s1, unsigned char *s2, int len, char *translate ) { register unsigned char *p1 = s1, *p2 = s2; while (len) { if (translate[*p1++] != translate[*p2++]) return 1; len--; } return 0; } /* Entry points for GNU code. */ /* re_compile_pattern is the GNU regular expression compiler: it compiles PATTERN (of length SIZE) and puts the result in BUFP. Returns 0 if the pattern was valid, otherwise an error string. Assumes the `allocated' (and perhaps `buffer') and `translate' fields are set in BUFP on entry. We call regex_compile to do the actual compilation. */ const char * re_compile_pattern (pattern, length, bufp) const char *pattern; int length; struct re_pattern_buffer *bufp; { reg_errcode_t ret; /* GNU code is written to assume at least RE_NREGS registers will be set (and at least one extra will be -1). */ bufp->regs_allocated = REGS_UNALLOCATED; /* And GNU code determines whether or not to get register information by passing null for the REGS argument to re_match, etc., not by setting no_sub. */ bufp->no_sub = 0; /* Match anchors at newline. */ bufp->newline_anchor = 1; ret = regex_compile (pattern, length, re_syntax_options, bufp); return re_error_msg[(int) ret]; } /* Entry points compatible with 4.2 BSD regex library. We don't define them if this is an Emacs or POSIX compilation. */ #if !defined (emacs) && !defined (_POSIX_SOURCE) /* BSD has one and only one pattern buffer. */ static struct re_pattern_buffer re_comp_buf; char * re_comp (s) const char *s; { reg_errcode_t ret; if (!s) { if (!re_comp_buf.buffer) return "No previous regular expression"; return 0; } if (!re_comp_buf.buffer) { re_comp_buf.buffer = (unsigned char *) malloc (200); if (re_comp_buf.buffer == NULL) return "Memory exhausted"; re_comp_buf.allocated = 200; re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH); if (re_comp_buf.fastmap == NULL) return "Memory exhausted"; } /* Since `re_exec' always passes NULL for the `regs' argument, we don't need to initialize the pattern buffer fields which affect it. */ /* Match anchors at newlines. */ re_comp_buf.newline_anchor = 1; ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); /* Yes, we're discarding `const' here. */ return (char *) re_error_msg[(int) ret]; } int re_exec (s) const char *s; { const int len = strlen (s); return 0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0); } #endif /* not emacs and not _POSIX_SOURCE */ /* POSIX.2 functions. Don't define these for Emacs. */ #ifndef emacs /* regcomp takes a regular expression as a string and compiles it. PREG is a regex_t *. We do not expect any fields to be initialized, since POSIX says we shouldn't. Thus, we set `buffer' to the compiled pattern; `used' to the length of the compiled pattern; `syntax' to RE_SYNTAX_POSIX_EXTENDED if the REG_EXTENDED bit in CFLAGS is set; otherwise, to RE_SYNTAX_POSIX_BASIC; `newline_anchor' to REG_NEWLINE being set in CFLAGS; `fastmap' and `fastmap_accurate' to zero; `re_nsub' to the number of subexpressions in PATTERN. PATTERN is the address of the pattern string. CFLAGS is a series of bits which affect compilation. If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we use POSIX basic syntax. If REG_NEWLINE is set, then . and [^...] don't match newline. Also, regexec will try a match beginning after every newline. If REG_ICASE is set, then we considers upper- and lowercase versions of letters to be equivalent when matching. If REG_NOSUB is set, then when PREG is passed to regexec, that routine will report only success or failure, and nothing about the registers. It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for the return codes and their meanings.) */ int regcomp (preg, pattern, cflags) regex_t *preg; const char *pattern; int cflags; { reg_errcode_t ret; unsigned syntax = (cflags & REG_EXTENDED) ? RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC; /* regex_compile will allocate the space for the compiled pattern. */ preg->buffer = 0; preg->allocated = 0; /* Don't bother to use a fastmap when searching. This simplifies the REG_NEWLINE case: if we used a fastmap, we'd have to put all the characters after newlines into the fastmap. This way, we just try every character. */ preg->fastmap = 0; if (cflags & REG_ICASE) { unsigned i; preg->translate = (char *) malloc (CHAR_SET_SIZE); if (preg->translate == NULL) return (int) REG_ESPACE; /* Map uppercase characters to corresponding lowercase ones. */ for (i = 0; i < CHAR_SET_SIZE; i++) preg->translate[i] = ISUPPER (i) ? tolower (i) : i; } else preg->translate = NULL; /* If REG_NEWLINE is set, newlines are treated differently. */ if (cflags & REG_NEWLINE) { /* REG_NEWLINE implies neither . nor [^...] match newline. */ syntax &= ~RE_DOT_NEWLINE; syntax |= RE_HAT_LISTS_NOT_NEWLINE; /* It also changes the matching behavior. */ preg->newline_anchor = 1; } else preg->newline_anchor = 0; preg->no_sub = !!(cflags & REG_NOSUB); /* POSIX says a null character in the pattern terminates it, so we can use strlen here in compiling the pattern. */ ret = regex_compile (pattern, strlen (pattern), syntax, preg); /* POSIX doesn't distinguish between an unmatched open-group and an unmatched close-group: both are REG_EPAREN. */ if (ret == REG_ERPAREN) ret = REG_EPAREN; return (int) ret; } /* regexec searches for a given pattern, specified by PREG, in the string STRING. If NMATCH is zero or REG_NOSUB was set in the cflags argument to `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at least NMATCH elements, and we set them to the offsets of the corresponding matched substrings. EFLAGS specifies `execution flags' which affect matching: if REG_NOTBOL is set, then ^ does not match at the beginning of the string; if REG_NOTEOL is set, then $ does not match at the end. We return 0 if we find a match and REG_NOMATCH if not. */ int regexec (preg, string, nmatch, pmatch, eflags) const regex_t *preg; const char *string; size_t nmatch; regmatch_t pmatch[]; int eflags; { int ret; struct re_registers regs; regex_t private_preg; int len = strlen (string); boolean want_reg_info = !preg->no_sub && nmatch > 0; private_preg = *preg; private_preg.not_bol = !!(eflags & REG_NOTBOL); private_preg.not_eol = !!(eflags & REG_NOTEOL); /* The user has told us exactly how many registers to return information about, via `nmatch'. We have to pass that on to the matching routines. */ private_preg.regs_allocated = REGS_FIXED; if (want_reg_info) { regs.num_regs = nmatch; regs.start = TALLOC (nmatch, regoff_t); regs.end = TALLOC (nmatch, regoff_t); if (regs.start == NULL || regs.end == NULL) { free (regs.start); free (regs.end); return (int) REG_NOMATCH; } } /* Perform the searching operation. */ ret = re_search (&private_preg, string, len, /* start: */ 0, /* range: */ len, want_reg_info ? ®s : (struct re_registers *) 0); /* Copy the register information to the POSIX structure. */ if (want_reg_info) { if (ret >= 0) { unsigned r; for (r = 0; r < nmatch; r++) { pmatch[r].rm_so = regs.start[r]; pmatch[r].rm_eo = regs.end[r]; } } /* If we needed the temporary register info, free the space now. */ free (regs.start); free (regs.end); } /* We want zero return to mean success, unlike `re_search'. */ return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH; } /* Returns a message corresponding to an error code, ERRCODE, returned from either regcomp or regexec. We don't use PREG here. */ size_t regerror (errcode, preg, errbuf, errbuf_size) int errcode; const regex_t *preg; char *errbuf; size_t errbuf_size; { const char *msg; size_t msg_size; if (errcode < 0 || errcode >= (sizeof (re_error_msg) / sizeof (re_error_msg[0]))) /* Only error codes returned by the rest of the code should be passed to this routine. If we are given anything else, or if other regex code generates an invalid error code, then the program has a bug. Dump core so we can fix it. */ abort (); msg = re_error_msg[errcode]; /* POSIX doesn't require that we do anything in this case, but why not be nice. */ if (! msg) msg = "Success"; msg_size = strlen (msg) + 1; /* Includes the null. */ if (errbuf_size != 0) { if (msg_size > errbuf_size) { strncpy (errbuf, msg, errbuf_size - 1); errbuf[errbuf_size - 1] = 0; } else strcpy (errbuf, msg); } return msg_size; } /* Free dynamically allocated space used by PREG. */ void regfree (preg) regex_t *preg; { if (preg->buffer != NULL) free (preg->buffer); preg->buffer = NULL; preg->allocated = 0; preg->used = 0; if (preg->fastmap != NULL) free (preg->fastmap); preg->fastmap = NULL; preg->fastmap_accurate = 0; if (preg->translate != NULL) free (preg->translate); preg->translate = NULL; } #endif /* not emacs */ /* Local variables: make-backup-files: t version-control: t trim-versions-without-asking: nil End: */ fldigi-3.21.80/src/compat/getsysinfo.c0000664000175000017500000002630312313064025014456 00000000000000/* Adapted from libgw32c-0.4 */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #define BUFSIZE 80 #define VIDSIZE 13 static const char * vid_cyrix = "CyrixInstead"; static const char * vid_centaur = "CentaurHauls"; static const char * vid_rise = "RiseRiseRise"; static const char * vid_intel = "GenuineIntel"; static const char * vid_amd = "AuthenticAMD"; static const char * vid_tmx86 = "GenuineTMx86"; static const char * vid_geode = "Geode by NSC"; static const char * vid_umc = "UMC UMC UMC "; static const char * vid_amd2 = "AMD ISBETTER"; static const char * vid_amd3 = "DEI "; static const char * vid_amd4 = "NexGenerationAMD"; static const char * vid_nexgen = "NexGenDriven"; #define cpuid(op,a,b,c,d)\ __asm__("cpuid": "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "a" (op)); static void GetVendorID (char *vid) { unsigned long MaxEax, ebx, ecx, edx, zerobyte; cpuid (0, MaxEax, ebx, ecx, edx); memcpy (vid, &ebx, 4); memcpy (vid+4, &edx, 4); memcpy (vid+8, &ecx, 4); zerobyte = 0; memcpy (vid+12, &zerobyte, 1); } BOOL GetMachInfo(LPSTR MachineName, LPSTR ProcessorName) { SYSTEM_INFO sysinf; int family; char VendorId [VIDSIZE+2]; ZeroMemory(&sysinf, sizeof(SYSTEM_INFO)); GetSystemInfo(&sysinf); family = sysinf.wProcessorLevel; switch (sysinf.wProcessorArchitecture) { case PROCESSOR_ARCHITECTURE_UNKNOWN: strcpy(MachineName, "unknown"); break; case PROCESSOR_ARCHITECTURE_INTEL: strcpy(MachineName, "ix86"); break; case PROCESSOR_ARCHITECTURE_MIPS: strcpy(MachineName, "mips"); break; case PROCESSOR_ARCHITECTURE_ALPHA: strcpy(MachineName, "alpha"); break; case PROCESSOR_ARCHITECTURE_PPC: strcpy(MachineName, "ppc"); break; case PROCESSOR_ARCHITECTURE_IA64: strcpy(MachineName, "IA64"); break; case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64: strcpy(MachineName, "IA32 on Win64"); break; case PROCESSOR_ARCHITECTURE_AMD64: strcpy(MachineName, "amd64"); break; case PROCESSOR_ARCHITECTURE_SHX: strcpy(MachineName, "sh"); break; case PROCESSOR_ARCHITECTURE_ARM: strcpy(MachineName, "arm"); break; case PROCESSOR_ARCHITECTURE_ALPHA64: strcpy(MachineName, "alpha64"); break; case PROCESSOR_ARCHITECTURE_MSIL: strcpy(MachineName, "msil"); break; default: strcpy(MachineName, "unknown"); break; } if (sysinf.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) switch(family) { case 3: strcpy(MachineName, "i386"); break; case 4: strcpy(MachineName, "i486"); break; case 5: strcpy(MachineName, "i586"); break; case 6: strcpy(MachineName, "i686"); break; case 7: strcpy(MachineName, "i786"); break; case 15: strcpy(MachineName, "i786"); break; default: strcpy(MachineName, "ix86"); } GetVendorID(VendorId); if (!strcmp(VendorId, vid_cyrix)) strcpy(ProcessorName, "Cyrix"); else if (!strcmp(VendorId, vid_centaur)) strcpy(ProcessorName, "Centaur"); else if (!strcmp(VendorId, vid_rise)) strcpy(ProcessorName, "Rise"); else if (!strcmp(VendorId, vid_intel)) strcpy(ProcessorName, "Intel"); else if (!strcmp(VendorId, vid_amd)) strcpy(ProcessorName, "AMD"); else if (!strcmp(VendorId, vid_tmx86)) strcpy(ProcessorName, "Transmeta"); else if (!strcmp(VendorId, vid_geode)) strcpy(ProcessorName, "Geode"); else if (!strcmp(VendorId, vid_umc)) strcpy(ProcessorName, "UMC"); else if (!strcmp(VendorId, vid_amd2)) strcpy(ProcessorName, "AMD"); else if (!strcmp(VendorId, vid_amd3)) strcpy(ProcessorName, "AMD"); else if (!strcmp(VendorId, vid_amd4)) strcpy(ProcessorName, "AMD"); else if (!strcmp(VendorId, vid_nexgen)) strcpy(ProcessorName, "NexGen"); else strcpy(ProcessorName, "Unknown"); return TRUE; } /* Platform SDK: Windows System Information Adapted from: http://msdn.microsoft.com/library/en-us/sysinfo/base/getting_the_system_version.asp http://www.codeproject.com/system/winvertable.asp Getting the System Version The following example uses the GetVersionEx function to display the version of the currently running operating system. Relying on version information is not the best way to test for a feature. Instead, refer to the documentation for the feature of interest. For more information on common techniques for feature detection, see Operating System Version. If you must require a particular operating system, be sure to use it as a minimum supported version, rather than design the test for the one operating system. This way, your detection code will continue to work on future versions of Windows. */ #undef BUFSIZE #define BUFSIZE 255 BOOL GetOsInfo(LPSTR OsName, LPSTR Release, LPSTR Version) { OSVERSIONINFOEX osvi; BOOL bOsVersionInfoEx; DWORD BuildNumber; // Try calling GetVersionEx using the OSVERSIONINFOEX structure. // If that fails, try using the OSVERSIONINFO structure. ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if( !(bOsVersionInfoEx = GetVersionEx ((LPOSVERSIONINFO) &osvi)) ) { // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO. osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); if (! GetVersionEx ( (LPOSVERSIONINFO) &osvi) ) return FALSE; } BuildNumber = osvi.dwBuildNumber & 0xFFFF; switch (osvi.dwPlatformId) { // Tests for Windows NT product family. case VER_PLATFORM_WIN32_NT: // Test for the product. if ( osvi.dwMajorVersion == 3 && osvi.dwMinorVersion == 51 ) strcpy(OsName, "Microsoft Windows NT 3.51"); else if ( osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0 ) strcpy(OsName, "Microsoft Windows NT 4.0"); else if ( osvi.dwMajorVersion <= 4 && osvi.dwMinorVersion == 0 ) strcpy(OsName, "Microsoft Windows NT"); else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 ) strcpy(OsName, "Microsoft Windows Server 2003 family, "); else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) strcpy(OsName, "Microsoft Windows XP"); else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) strcpy(OsName, "Microsoft Windows 2000"); if( bOsVersionInfoEx ) { // Use information from GetVersionEx. // Test for the workstation type. if ( osvi.wProductType == VER_NT_WORKSTATION ) { if( osvi.wSuiteMask & VER_SUITE_PERSONAL ) strcat(OsName, " Home Edition" ); else strcat(OsName, " Professional" ); } // Test for the server type. else if ( osvi.wProductType == VER_NT_SERVER) { if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) { if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) strcat(OsName, " Datacenter Edition" ); else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) if( osvi.dwMajorVersion == 4 ) strcat(OsName, " Advanced Server" ); else strcat(OsName, " Enterprise Edition" ); else if ( osvi.wSuiteMask == VER_SUITE_BLADE ) strcat(OsName, " Web Edition" ); else strcat(OsName, " Standard Edition" ); } else if( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) { if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) strcat(OsName, " Datacenter Server" ); else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) strcat(OsName, " Advanced Server" ); else strcat(OsName, " Server" ); } else // Windows NT 4.0 { if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) strcat(OsName, "Server 4.0, Enterprise Edition "); else strcat(OsName, "Server 4.0 " ); } } else { // Use the registry on early versions of Windows NT. HKEY hKey; char szProductType[BUFSIZE]; DWORD dwBufLen=BUFSIZE; LONG lRet; lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\ProductOptions", 0, KEY_QUERY_VALUE, &hKey ); if( lRet != ERROR_SUCCESS ) return FALSE; lRet = RegQueryValueEx( hKey, "ProductType", NULL, NULL, (LPBYTE) szProductType, &dwBufLen); if( (lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE) ) return FALSE; RegCloseKey( hKey ); if ( lstrcmpi( "WINNT", szProductType) == 0 ) strcat(OsName, " Professional" ); if ( lstrcmpi( "LANMANNT", szProductType) == 0 ) strcat(OsName, " Server" ); if ( lstrcmpi( "SERVERNT", szProductType) == 0 ) strcat(OsName, " Advanced Server" ); } // Display version, service pack (if any), and build number. strcat (OsName, " "); strcat (OsName, osvi.szCSDVersion); break; // Test for the Windows 95 product family. case VER_PLATFORM_WIN32_WINDOWS: if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) { strcpy(OsName, "Microsoft Windows 95"); if (BuildNumber > 950 && BuildNumber <= 1080) strcat(OsName, " SP1"); else if (BuildNumber > 1080) strcat(OsName, " OSR2"); /* if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' ) strcat(OsName, "OSR2 " ); */ } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) { strcpy(OsName, "Microsoft Windows 98"); if (BuildNumber > 1998 && BuildNumber < 2183) strcat(OsName, " SP1"); else if (BuildNumber >= 2183) strcat(OsName, " SE"); /* if ( osvi.szCSDVersion[1] == 'A' ) strcat(OsName, "SE " ); */ } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) { strcpy(OsName, "Microsoft Windows Millennium Edition "); } break; } sprintf(Release, "%lu.%lu.%lu", osvi.dwPlatformId, osvi.dwMajorVersion, osvi.dwMinorVersion); sprintf(Version, "%lu", osvi.dwBuildNumber & 0xFFFF); return TRUE; } fldigi-3.21.80/src/compat/regex.h0000664000175000017500000004437312313064025013412 00000000000000/* Definitions for data structures and routines for the regular expression library, version 0.12. Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef __REGEXP_LIBRARY_H__ #define __REGEXP_LIBRARY_H__ #ifdef __cplusplus extern "C" { #endif /* POSIX says that must be included (by the caller) before . */ #ifdef VMS /* VMS doesn't have `size_t' in , even though POSIX says it should be there. */ #include #endif /* The following bits are used to determine the regexp syntax we recognize. The set/not-set meanings are chosen so that Emacs syntax remains the value 0. The bits are given in alphabetical order, and the definitions shifted by one from the previous bit; thus, when we add or remove a bit, only one other definition need change. */ typedef unsigned reg_syntax_t; /* If this bit is not set, then \ inside a bracket expression is literal. If set, then such a \ quotes the following character. */ #define RE_BACKSLASH_ESCAPE_IN_LISTS (1) /* If this bit is not set, then + and ? are operators, and \+ and \? are literals. If set, then \+ and \? are operators and + and ? are literals. */ #define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) /* If this bit is set, then character classes are supported. They are: [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. If not set, then character classes are not supported. */ #define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) /* If this bit is set, then ^ and $ are always anchors (outside bracket expressions, of course). If this bit is not set, then it depends: ^ is an anchor if it is at the beginning of a regular expression or after an open-group or an alternation operator; $ is an anchor if it is at the end of a regular expression, or before a close-group or an alternation operator. This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because POSIX draft 11.2 says that * etc. in leading positions is undefined. We already implemented a previous draft which made those constructs invalid, though, so we haven't changed the code back. */ #define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) /* If this bit is set, then special characters are always special regardless of where they are in the pattern. If this bit is not set, then special characters are special only in some contexts; otherwise they are ordinary. Specifically, * + ? and intervals are only special when not after the beginning, open-group, or alternation operator. */ #define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) /* If this bit is set, then *, +, ?, and { cannot be first in an re or immediately after an alternation or begin-group operator. */ #define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) /* If this bit is set, then . matches newline. If not set, then it doesn't. */ #define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) /* If this bit is set, then . doesn't match NUL. If not set, then it does. */ #define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) /* If this bit is set, nonmatching lists [^...] do not match newline. If not set, they do. */ #define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) /* If this bit is set, either \{...\} or {...} defines an interval, depending on RE_NO_BK_BRACES. If not set, \{, \}, {, and } are literals. */ #define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) /* If this bit is set, +, ? and | aren't recognized as operators. If not set, they are. */ #define RE_LIMITED_OPS (RE_INTERVALS << 1) /* If this bit is set, newline is an alternation operator. If not set, newline is literal. */ #define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) /* If this bit is set, then `{...}' defines an interval, and \{ and \} are literals. If not set, then `\{...\}' defines an interval. */ #define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) /* If this bit is set, (...) defines a group, and \( and \) are literals. If not set, \(...\) defines a group, and ( and ) are literals. */ #define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) /* If this bit is set, then \ matches . If not set, then \ is a back-reference. */ #define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) /* If this bit is set, then | is an alternation operator, and \| is literal. If not set, then \| is an alternation operator, and | is literal. */ #define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) /* If this bit is set, then an ending range point collating higher than the starting range point, as in [z-a], is invalid. If not set, then when ending range point collates higher than the starting range point, the range is ignored. */ #define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) /* If this bit is set, then an unmatched ) is ordinary. If not set, then an unmatched ) is invalid. */ #define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) /* This global variable defines the particular regexp syntax to use (for some interfaces). When a regexp is compiled, the syntax used is stored in the pattern buffer, so changing this does not affect already-compiled regexps. */ extern reg_syntax_t re_syntax_options; /* Define combinations of the above bits for the standard possibilities. (The [[[ comments delimit what gets put into the Texinfo file, so don't delete them!) */ /* [[[begin syntaxes]]] */ #define RE_SYNTAX_EMACS 0 #define RE_SYNTAX_AWK \ (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ | RE_NO_BK_PARENS | RE_NO_BK_REFS \ | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ | RE_UNMATCHED_RIGHT_PAREN_ORD) #define RE_SYNTAX_POSIX_AWK \ (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS) #define RE_SYNTAX_GREP \ (RE_BK_PLUS_QM | RE_CHAR_CLASSES \ | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ | RE_NEWLINE_ALT) #define RE_SYNTAX_EGREP \ (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ | RE_NEWLINE_ALT | RE_NO_BK_PARENS \ | RE_NO_BK_VBAR) #define RE_SYNTAX_POSIX_EGREP \ (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES) /* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */ #define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC #define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC /* Syntax bits common to both basic and extended POSIX regex syntax. */ #define _RE_SYNTAX_POSIX_COMMON \ (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ | RE_INTERVALS | RE_NO_EMPTY_RANGES) #define RE_SYNTAX_POSIX_BASIC \ (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) /* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this isn't minimal, since other operators, such as \`, aren't disabled. */ #define RE_SYNTAX_POSIX_MINIMAL_BASIC \ (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) #define RE_SYNTAX_POSIX_EXTENDED \ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ | RE_NO_BK_PARENS | RE_NO_BK_VBAR \ | RE_UNMATCHED_RIGHT_PAREN_ORD) /* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */ #define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ | RE_NO_BK_PARENS | RE_NO_BK_REFS \ | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) /* [[[end syntaxes]]] */ /* Maximum number of duplicates an interval can allow. Some systems (erroneously) define this in other header files, but we want our value, so remove any previous define. */ #ifdef RE_DUP_MAX #undef RE_DUP_MAX #endif #define RE_DUP_MAX ((1 << 15) - 1) /* POSIX `cflags' bits (i.e., information for `regcomp'). */ /* If this bit is set, then use extended regular expression syntax. If not set, then use basic regular expression syntax. */ #define REG_EXTENDED 1 /* If this bit is set, then ignore case when matching. If not set, then case is significant. */ #define REG_ICASE (REG_EXTENDED << 1) /* If this bit is set, then anchors do not match at newline characters in the string. If not set, then anchors do match at newlines. */ #define REG_NEWLINE (REG_ICASE << 1) /* If this bit is set, then report only success or fail in regexec. If not set, then returns differ between not matching and errors. */ #define REG_NOSUB (REG_NEWLINE << 1) /* POSIX `eflags' bits (i.e., information for regexec). */ /* If this bit is set, then the beginning-of-line operator doesn't match the beginning of the string (presumably because it's not the beginning of a line). If not set, then the beginning-of-line operator does match the beginning of the string. */ #define REG_NOTBOL 1 /* Like REG_NOTBOL, except for the end-of-line. */ #define REG_NOTEOL (1 << 1) /* If any error codes are removed, changed, or added, update the `re_error_msg' table in regex.c. */ typedef enum { REG_NOERROR = 0, /* Success. */ REG_NOMATCH, /* Didn't find a match (for regexec). */ /* POSIX regcomp return error codes. (In the order listed in the standard.) */ REG_BADPAT, /* Invalid pattern. */ REG_ECOLLATE, /* Not implemented. */ REG_ECTYPE, /* Invalid character class name. */ REG_EESCAPE, /* Trailing backslash. */ REG_ESUBREG, /* Invalid back reference. */ REG_EBRACK, /* Unmatched left bracket. */ REG_EPAREN, /* Parenthesis imbalance. */ REG_EBRACE, /* Unmatched \{. */ REG_BADBR, /* Invalid contents of \{\}. */ REG_ERANGE, /* Invalid range end. */ REG_ESPACE, /* Ran out of memory. */ REG_BADRPT, /* No preceding re for repetition op. */ /* Error codes we've added. */ REG_EEND, /* Premature end. */ REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */ REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */ } reg_errcode_t; /* This data structure represents a compiled pattern. Before calling the pattern compiler, the fields `buffer', `allocated', `fastmap', `translate', and `no_sub' can be set. After the pattern has been compiled, the `re_nsub' field is available. All other fields are private to the regex routines. */ struct re_pattern_buffer { /* [[[begin pattern_buffer]]] */ /* Space that holds the compiled pattern. It is declared as `unsigned char *' because its elements are sometimes used as array indexes. */ unsigned char *buffer; /* Number of bytes to which `buffer' points. */ unsigned long allocated; /* Number of bytes actually used in `buffer'. */ unsigned long used; /* Syntax setting with which the pattern was compiled. */ reg_syntax_t syntax; /* Pointer to a fastmap, if any, otherwise zero. re_search uses the fastmap, if there is one, to skip over impossible starting points for matches. */ char *fastmap; /* Either a translate table to apply to all characters before comparing them, or zero for no translation. The translation is applied to a pattern when it is compiled and to a string when it is matched. */ char *translate; /* Number of subexpressions found by the compiler. */ size_t re_nsub; /* Zero if this pattern cannot match the empty string, one else. Well, in truth it's used only in `re_search_2', to see whether or not we should use the fastmap, so we don't set this absolutely perfectly; see `re_compile_fastmap' (the `duplicate' case). */ unsigned can_be_null : 1; /* If REGS_UNALLOCATED, allocate space in the `regs' structure for `max (RE_NREGS, re_nsub + 1)' groups. If REGS_REALLOCATE, reallocate space if necessary. If REGS_FIXED, use what's there. */ #define REGS_UNALLOCATED 0 #define REGS_REALLOCATE 1 #define REGS_FIXED 2 unsigned regs_allocated : 2; /* Set to zero when `regex_compile' compiles a pattern; set to one by `re_compile_fastmap' if it updates the fastmap. */ unsigned fastmap_accurate : 1; /* If set, `re_match_2' does not return information about subexpressions. */ unsigned no_sub : 1; /* If set, a beginning-of-line anchor doesn't match at the beginning of the string. */ unsigned not_bol : 1; /* Similarly for an end-of-line anchor. */ unsigned not_eol : 1; /* If true, an anchor at a newline matches. */ unsigned newline_anchor : 1; /* [[[end pattern_buffer]]] */ }; typedef struct re_pattern_buffer regex_t; /* search.c (search_buffer) in Emacs needs this one opcode value. It is defined both in `regex.c' and here. */ #define RE_EXACTN_VALUE 1 /* Type for byte offsets within the string. POSIX mandates this. */ typedef int regoff_t; /* This is the structure we store register match data in. See regex.texinfo for a full description of what registers match. */ struct re_registers { unsigned num_regs; regoff_t *start; regoff_t *end; }; /* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, `re_match_2' returns information about at least this many registers the first time a `regs' structure is passed. */ #ifndef RE_NREGS #define RE_NREGS 30 #endif /* POSIX specification for registers. Aside from the different names than `re_registers', POSIX uses an array of structures, instead of a structure of arrays. */ typedef struct { regoff_t rm_so; /* Byte offset from string's start to substring's start. */ regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ } regmatch_t; /* Declarations for routines. */ /* To avoid duplicating every routine declaration -- once with a prototype (if we are ANSI), and once without (if we aren't) -- we use the following macro to declare argument types. This unfortunately clutters up the declarations a bit, but I think it's worth it. */ #if __STDC__ #define _RE_ARGS(args) args #else /* not __STDC__ */ #define _RE_ARGS(args) () #endif /* not __STDC__ */ /* Sets the current default syntax to SYNTAX, and return the old syntax. You can also simply assign to the `re_syntax_options' variable. */ extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax)); /* Compile the regular expression PATTERN, with length LENGTH and syntax given by the global `re_syntax_options', into the buffer BUFFER. Return NULL if successful, and an error string if not. */ extern const char *re_compile_pattern _RE_ARGS ((const char *pattern, int length, struct re_pattern_buffer *buffer)); /* Compile a fastmap for the compiled pattern in BUFFER; used to accelerate searches. Return 0 if successful and -2 if was an internal error. */ extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer)); /* Search in the string STRING (with length LENGTH) for the pattern compiled into BUFFER. Start searching at position START, for RANGE characters. Return the starting position of the match, -1 for no match, or -2 for an internal error. Also return register information in REGS (if REGS and BUFFER->no_sub are nonzero). */ extern int re_search _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string_, int length, int start, int range, struct re_registers *regs)); /* Like `re_search', but search in the concatenation of STRING1 and STRING2. Also, stop searching at index START + STOP. */ extern int re_search_2 _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, int length1, const char *string2, int length2, int start, int range, struct re_registers *regs, int stop)); /* Like `re_search', but return how many characters in STRING the regexp in BUFFER matched, starting at position START. */ extern int re_match _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string_, int length, int start, struct re_registers *regs)); /* Relates to `re_match' as `re_search_2' relates to `re_search'. */ extern int re_match_2 _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, int length1, const char *string2, int length2, int start, struct re_registers *regs, int stop)); /* Set REGS to hold NUM_REGS registers, storing them in STARTS and ENDS. Subsequent matches using BUFFER and REGS will use this memory for recording register information. STARTS and ENDS must be allocated with malloc, and must each be at least `NUM_REGS * sizeof (regoff_t)' bytes long. If NUM_REGS == 0, then subsequent matches should allocate their own register data. Unless this function is called, the first search or match using PATTERN_BUFFER will allocate its own register data, without freeing the old data. */ extern void re_set_registers _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs, unsigned num_regs, regoff_t *starts, regoff_t *ends)); /* 4.2 bsd compatibility. */ extern char *re_comp _RE_ARGS ((const char *)); extern int re_exec _RE_ARGS ((const char *)); /* POSIX compatibility. */ extern int regcomp _RE_ARGS ((regex_t *preg, const char *pattern, int cflags)); extern int regexec _RE_ARGS ((const regex_t *preg, const char *string_, size_t nmatch, regmatch_t pmatch[], int eflags)); extern size_t regerror _RE_ARGS ((int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)); extern void regfree _RE_ARGS ((regex_t *preg)); #ifdef __cplusplus } #endif #endif /* not __REGEXP_LIBRARY_H__ */ /* Local variables: make-backup-files: t version-control: t trim-versions-without-asking: nil End: */ fldigi-3.21.80/src/compat/mingw.c0000664000175000017500000001462612313064025013412 00000000000000// ---------------------------------------------------------------------------- // mingw.c // // The following routines were copied from git-1.6.1.2/compat/mingw.c: // sleep mingw_getcwd mingw_getenv mingw_rename // // The uname routine was adapted from libgw32c 0.4. // // The rest: // Copyright (C) 2009 // Stelios Bounanos, M0GLD // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include "compat.h" /* default mode for stdin, stdout and stderr */ unsigned int _CRT_fmode = _O_BINARY; unsigned sleep(unsigned seconds) { Sleep(seconds*1000); return 0; } #undef getcwd char *mingw_getcwd(char *pointer, int len) { int i; char *ret = getcwd(pointer, len); if (!ret) return ret; for (i = 0; pointer[i]; i++) if (pointer[i] == '\\') pointer[i] = '/'; return ret; } #undef getenv char *mingw_getenv(const char *name) { char *result = getenv(name); if (!result && !strcmp(name, "TMPDIR")) { /* on Windows it is TMP and TEMP */ result = getenv("TMP"); if (!result) result = getenv("TEMP"); } return result; } #undef rename int mingw_rename(const char *pold, const char *pnew) { DWORD attrs; /* * Try native rename() first to get errno right. * It is based on MoveFile(), which cannot overwrite existing files. */ if (!rename(pold, pnew)) return 0; if (errno != EEXIST) return -1; if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING)) return 0; /* TODO: translate more errors */ if (GetLastError() == ERROR_ACCESS_DENIED && (attrs = GetFileAttributes(pnew)) != INVALID_FILE_ATTRIBUTES) { if (attrs & FILE_ATTRIBUTE_DIRECTORY) { errno = EISDIR; return -1; } if ((attrs & FILE_ATTRIBUTE_READONLY) && SetFileAttributes(pnew, attrs & ~FILE_ATTRIBUTE_READONLY)) { if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING)) return 0; /* revert file attributes on failure */ SetFileAttributes(pnew, attrs); } } errno = EACCES; return -1; } /******************************************************************************/ __attribute__((constructor)) static void wsa_init(void) { WSADATA wsa; static int wsa_init_ = 0; if (wsa_init_) return; if (WSAStartup(MAKEWORD(2, 2), &wsa)) { fprintf(stderr, "unable to initialize winsock: error %d", WSAGetLastError()); exit(EXIT_FAILURE); } atexit((void(*)(void)) WSACleanup); wsa_init_ = 1; } int socketpair(int family, int type, int protocol, int *sv) { struct sockaddr_in addr; SOCKET sfd; int err, len = sizeof(addr); if (sv == NULL || family != AF_INET || type != SOCK_STREAM || protocol) { WSASetLastError(WSAEINVAL); return SOCKET_ERROR; } sv[0] = sv[1] = INVALID_SOCKET; if ((sfd = socket(family, type, 0)) == INVALID_SOCKET) return SOCKET_ERROR; memset(&addr, 0, sizeof(addr)); addr.sin_family = family; addr.sin_addr.s_addr = inet_addr("127.0.0.1"); addr.sin_port = 0; /* any port */ if ((err = bind(sfd, (const struct sockaddr*)&addr, sizeof(addr))) == SOCKET_ERROR) { err = WSAGetLastError(); closesocket(sfd); WSASetLastError(err); return SOCKET_ERROR; } if ((err = getsockname(sfd, (struct sockaddr*)&addr, &len)) == SOCKET_ERROR) { err = WSAGetLastError(); closesocket(sfd); WSASetLastError(err); return SOCKET_ERROR; } do { if (listen(sfd, 1) == SOCKET_ERROR) break; if ((sv[0] = WSASocket(family, type, 0, NULL, 0, 0)) == INVALID_SOCKET) break; if (connect(sv[0], (const struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) break; if ((sv[1] = accept(sfd, NULL, NULL)) == INVALID_SOCKET) break; closesocket(sfd); return 0; } while (0); /* error */ err = WSAGetLastError(); closesocket(sfd); closesocket(sv[0]); closesocket(sv[1]); WSASetLastError(err); return SOCKET_ERROR; } /******************************************************************************/ int nanosleep(const struct timespec *req, struct timespec *rem) { if (unlikely(req->tv_nsec < 0 || req->tv_nsec < 0L || req->tv_nsec > 999999999L)) { errno = EINVAL; return -1; } Sleep(req->tv_sec * 1000 + req->tv_nsec / 1000000L); if (unlikely(rem)) { rem->tv_sec = 0; rem->tv_nsec = 0L; } return 0; } BOOL GetOsInfo(LPSTR OsName, LPSTR Release, LPSTR Version); BOOL GetMachInfo(LPSTR MachineName, LPSTR ProcessorName); int uname(struct utsname *name) { char processor[1024]; if (name == NULL) { errno = EINVAL; return -1; } if (gethostname(name->nodename, sizeof(name->nodename)) < 0) { name->nodename[0] = '\0'; errno = ENOSYS; return -1; } if (!GetOsInfo(name->sysname, name->release, name->version)) { strncpy (name->sysname, "win32", sizeof (name->sysname)); strncpy (name->release, "unknown", sizeof (name->release)); strncpy (name->version, "unknown", sizeof (name->version)); } /* "windows32" is as yet the only universal windows description allowed by config.guess and config.sub */ strncpy(name->sysname, "windows32", sizeof (name->sysname)); if (!GetMachInfo(name->machine, processor)) strncpy(name->machine, "i386", sizeof (name->machine)); return 0; } int getrusage(int who, struct rusage *usage) { FILETIME ct, et, kt, ut; ULARGE_INTEGER uli; if (who != RUSAGE_SELF) { errno = EINVAL; return -1; } if (!usage) { errno = EFAULT; return -1; } if (!GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut)) { errno = ENOENT; return -1; } // FILETIMEs use 100-ns units memcpy(&uli, &kt, sizeof(FILETIME)); usage->ru_stime.tv_sec = uli.QuadPart / 10000000L; usage->ru_stime.tv_usec = uli.QuadPart % 10000000L; memcpy(&uli, &ut, sizeof(FILETIME)); usage->ru_utime.tv_sec = uli.QuadPart / 10000000L; usage->ru_utime.tv_usec = uli.QuadPart % 10000000L; return 0; } fldigi-3.21.80/src/compat/mingw.h0000664000175000017500000000514312313064025013411 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef MINGW_H_ #define MINGW_H_ #include #include #include #ifdef __cplusplus extern "C" { #endif typedef int pid_t; typedef long suseconds_t; #define hstrerror strerror #ifndef SIGUSR2 # define SIGUSR2 100 #endif /* * simple adaptors */ static inline int mingw_mkdir(const char *path, int mode) { return mkdir(path); } #define mkdir mingw_mkdir static inline int mingw_unlink(const char *pathname) { /* read-only files cannot be removed */ chmod(pathname, 0666); return unlink(pathname); } #define unlink mingw_unlink /* * implementations of missing functions */ unsigned int sleep (unsigned int seconds); char *mingw_getcwd(char *pointer, int len); #define getcwd mingw_getcwd char *mingw_getenv(const char *name); #define getenv mingw_getenv int mingw_rename(const char*, const char*); #define rename mingw_rename #ifndef SHUT_WR # define SHUT_WR SD_SEND #endif #ifndef SHUT_RD # define SHUT_RD SD_RECEIVE #endif #ifndef SHUT_RDWR # define SHUT_RDWR SD_BOTH #endif #ifndef EADDRINUSE # define EADDRINUSE WSAEADDRINUSE #endif int nanosleep (const struct timespec *req, struct timespec *rem); int socketpair(int family, int type, int protocol, int *sv); /* uname */ #define UTSNAME_MAX_ 257 struct utsname { char sysname[UTSNAME_MAX_]; char nodename[UTSNAME_MAX_]; char release[UTSNAME_MAX_]; char version[UTSNAME_MAX_]; char machine[UTSNAME_MAX_]; }; int uname(struct utsname *name); /* getrusage */ #define RUSAGE_SELF 0 #define RUSAGE_CHILDREN (-1) struct rusage { struct timeval ru_utime; struct timeval ru_stime; }; int getrusage(int who, struct rusage *usage); /* fsync, fdatasync */ #include #define fsync _commit #define fdatasync fsync #ifdef __cplusplus } #endif #endif fldigi-3.21.80/src/wwv/0000775000175000017500000000000012313333726011543 500000000000000fldigi-3.21.80/src/wwv/wwv.cxx0000664000175000017500000001147512313064025013033 00000000000000// ---------------------------------------------------------------------------- // wwv.cxx -- wwv monitoring modem // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- // // This modem is only used for reception of WWV "tick" signals to determine // the correction factor to be applied to the sound card oscillator. #include #include #include #include #include #include "wwv.h" #include "fl_digi.h" using namespace std; void wwv::tx_init(SoundBase *sc) { scard = sc; phaseacc = 0; } void wwv::rx_init() { phaseacc = 0.0; smpl_ctr = 0; // sample counter for timing wwv rx agc = 0.0; // threshold for tick detection ticks = 0; calc = false; zoom = false; set_scope_mode(Digiscope::WWV); put_MODEstatus(mode); } void wwv::init() { modem::init(); rx_init(); } wwv::~wwv() { if (hilbert) delete hilbert; if (lpfilter) delete lpfilter; if (vidfilter) delete vidfilter; } wwv::wwv() : modem() { double lp; mode = MODE_WWV; frequency = 1000; bandwidth = 200; samplerate = 8000; // phase increment expected at the tick freq phaseincr = 2.0 * M_PI * frequency / samplerate; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); lp = 0.5 * bandwidth / samplerate; lpfilter = new C_FIR_filter(); lpfilter->init_lowpass (FIRLEN_1, DEC_1, lp); vidfilter = new Cmovavg(16); makeaudio(); } //======================================================================= //update_syncscope() //Routine called to update the display on the sync scope display. //For wwv this is video signal much like a FAX display //======================================================================= // void wwv::update_syncscope() { double max = 0, min = 1e6, range; for (int i = 0; i < 1000; i++ ) { if (max < buffer[i]) max = buffer[i]; if (min > buffer[i]) min = buffer[i]; } range = max - min; for (int i = 0; i < 1000; i++ ) { buffer[i] = 255*(buffer[i] - min) / range; } if (zoom) set_video(&buffer[400], 200); else set_video(buffer, 1000); buffer.next(); // change buffers } //===================================================================== // wwv_rxprocess() // Called with a block (512 samples) of audio. // Nominal sound card sampling rate is set to 8000 Hz //======================================================================= int wwv::rx_process(const double *buf, int len) { cmplx z, znco; while (len-- > 0) { z = cmplx ( *buf, *buf ); buf++; hilbert->run(z, z); znco = cmplx ( cos(phaseacc), sin(phaseacc) ); z = znco * z; phaseacc += phaseincr; if (phaseacc > M_PI) phaseacc -= 2.0 * M_PI; if (lpfilter->run ( z, z )) { buffer[smpl_ctr % 1000] = vidfilter->run( abs(z) ); if (++smpl_ctr >= 1000) { update_syncscope(); smpl_ctr = 0; } } } return 0; } void wwv::set1(int x, int y) { int zfactor = 500; if (zoom) zfactor = 100; smpl_ctr -= ((2*x - y) * zfactor) / y; if (smpl_ctr < 0) smpl_ctr += 1000; if (smpl_ctr > 1000) smpl_ctr -= 1000; } char strPPM[20]; void wwv::set2(int x, int y) { zoom = !zoom; } //====================================================================== // transmit time tick //====================================================================== void wwv::makeshape() { for (int i = 0; i < 32; i++) keyshape[i] = 0.5 * (1.0 - cos (M_PI * i / 32)); } double wwv::nco(double freq) { phaseacc += 2.0 * M_PI * freq / samplerate; if (phaseacc > M_PI) phaseacc -= 2.0 * M_PI; return sin(phaseacc); } void wwv::makeaudio() { phaseacc = 0.0; makeshape(); for (int i = 0; i < 400; i++) { audio[i] = (i < 200 ? nco(1000) : 0); quiet[i] = 0; } for (int i = 0; i < 32; i++) { audio[i] *= keyshape[i]; audio[199 - i] *= keyshape[i]; } } int wwv::tx_process() { static int cycle = 4; int c = get_tx_char(); if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; return -1; } if (--cycle == 0) { memcpy(play, audio, 400 * sizeof(double)); ModulateXmtr(play, 400); cycle = 4; } else ModulateXmtr(quiet, 400); ModulateXmtr(quiet, 400); ModulateXmtr(quiet, 400); ModulateXmtr(quiet, 400); ModulateXmtr(quiet, 400); return 0; } fldigi-3.21.80/src/wwv/analysis.cxx0000664000175000017500000001345012313064025014026 00000000000000// ---------------------------------------------------------------------------- // anal.cxx -- anal modem // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "analysis.h" #include "modem.h" #include "misc.h" #include "filters.h" #include "fftfilt.h" #include "digiscope.h" #include "waterfall.h" #include "main.h" #include "fl_digi.h" #include "timeops.h" #include "debug.h" using namespace std; #define anal_BW 4 static char msg1[80]; void anal::tx_init(SoundBase *sc) { } void anal::rx_init() { phaseacc = 0; put_MODEstatus(mode); } void anal::init() { modem::init(); rx_init(); set_scope_mode(Digiscope::RTTY); } anal::~anal() { delete hilbert; delete bpfilt; delete ffilt; delete favg; } void anal::restart() { double fhi = anal_BW * 1.1 / samplerate; double flo = 0.0; if (bpfilt) bpfilt->create_filter(flo, fhi); else bpfilt = new fftfilt(flo, fhi, 2048); symbollen = analMaxSymLen; set_bandwidth(anal_BW); ffilt->setLength(4000); // average over last 1/2 second of samples favg->setLength(120); // average over last minute of samples sum = 0.0; fout_1 = fout_2 = 0.0; restart_count = 64; wf_freq = frequency; if (clock_gettime(CLOCK_REALTIME, &start_time) == -1) { LOG_PERROR("clock_gettime"); abort(); } struct tm tm; gmtime_r(&start_time.tv_sec, &tm); FILE* out = fopen(analysisFilename.c_str(), "a"); if (unlikely(!out)) { LOG_PERROR("fopen"); goto ret; } fprintf(out, "Time,Clock,Track,Freq\n" ",,,,rf track frequency: %" PRIdMAX " %s\n" ",,,,audio track frequency: %.0f\n" ",,,,%02d-%02d-%02d\n", (intmax_t)wf->rfcarrier(), (wf->USB() ? "USB" : "LSB"), frequency, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); fclose(out); ret: if (clock_gettime(CLOCK_MONOTONIC, &start_time) == -1) { LOG_PERROR("clock_gettime"); abort(); } } anal::anal() { mode = MODE_ANALYSIS; samplerate = anal_SampleRate; bpfilt = (fftfilt *)0; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); ffilt = new Cmovavg(512); favg = new Cmovavg(64); analysisFilename = HomeDir; analysisFilename.append("freqanalysis.csv"); pipeptr = 0; cap &= ~CAP_TX; restart(); } void anal::clear_syncscope() { set_scope(0, 0, false); } cmplx anal::mixer(cmplx in) { cmplx z = cmplx( cos(phaseacc), sin(phaseacc)) * in; phaseacc -= TWOPI * frequency / samplerate; if (phaseacc > M_PI) phaseacc -= TWOPI; else if (phaseacc < M_PI) phaseacc += TWOPI; return z; } void anal::writeFile() { struct timespec elapsed, now; // calculate elapsed time using the monotonic clock if (clock_gettime(CLOCK_MONOTONIC, &now) == -1) { LOG_PERROR("clock_gettime"); abort(); } elapsed = now - start_time; // calculate wall clock time using the realtime clock if (clock_gettime(CLOCK_REALTIME, &now) == -1) { LOG_PERROR("clock_gettime"); abort(); } struct tm tm; gmtime_r(&now.tv_sec, &tm); FILE* out = fopen(analysisFilename.c_str(), "a"); if (unlikely(!out)) { LOG_PERROR("fopen"); return; } fprintf(out, "%02d:%02d:%02d, %" PRIdMAX ".%03" PRIdMAX ", %f, %12.4f\n", tm.tm_hour, tm.tm_min, tm.tm_sec, (intmax_t)elapsed.tv_sec, (intmax_t)(elapsed.tv_nsec / 1000000), fout_2, (wf->rfcarrier() + (wf->USB() ? 1.0 : -1.0) * (frequency + fout_2))); fclose(out); } int anal::rx_process(const double *buf, int len) { cmplx z, *zp; double fin; int n; static int dspcnt = symbollen; if (wf_freq != frequency) restart(); while (len-- > 0) { // create analytic signal from sound card input samples z = cmplx( *buf, *buf ); buf++; hilbert->run(z, z); // mix it with the audio carrier frequency to create a baseband signal z = mixer(z); // low pass filter using Windowed Sinc - Overlap-Add convolution filter n = bpfilt->run(z, &zp); if (n) for (int i = 0; i < n; i++) { // measure phase difference between successive samples to determine // the frequency of the baseband signal (+anal_baud or -anal_baud) // see class cmplx definiton for operator % fin = arg( conj(prevsmpl) * zp[i] ) * samplerate / TWOPI; prevsmpl = zp[i]; if (restart_count) restart_count--; else { // filter using moving average filter fout_1 = ffilt->run(fin); // the values in the pipe are +/- 2 Hz ==> +/- 1.0 pipe[pipeptr] = fout_1 / 4; pipeptr = (pipeptr + 1) % symbollen; dspcnt--; if (dspcnt == 0) { set_scope(pipe, symbollen, false); pipe.next(); // change buffers // filter using second moving average filter & display the result fout_2 = favg->run(fout_1); if (wf->USB()) snprintf(msg1, sizeof(msg1), "Freq: %12.2f", wf->rfcarrier() + frequency + fout_2 ); else snprintf(msg1, sizeof(msg1), "Freq: %12.2f", wf->rfcarrier() - frequency - fout_2 ); put_status(msg1, 2.0); writeFile(); // reset the display counter & the pipe pointer dspcnt = symbollen; pipeptr = 0; } } } } return 0; } //===================================================================== // anal transmit //===================================================================== int anal::tx_process() { return -1; } fldigi-3.21.80/src/widgets/0000775000175000017500000000000012313333726012366 500000000000000fldigi-3.21.80/src/widgets/flinput2.cxx0000664000175000017500000001146612313064025014576 00000000000000// ---------------------------------------------------------------------------- // flinput2.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "icons.h" #include "flinput2.h" #include "gettext.h" enum { OP_UNDO, OP_CUT, OP_COPY, OP_PASTE, OP_DELETE, OP_CLEAR, OP_SELECT_ALL }; static Fl_Menu_Item cmenu[] = { { make_icon_label(_("Undo"), edit_undo_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { make_icon_label(_("Cut"), edit_cut_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Copy"), edit_copy_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Paste"), edit_paste_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Delete"), trash_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Clear"), edit_clear_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { make_icon_label(_("Select All"), edit_select_all_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { 0 } }; static bool cmenu_init = false; Fl_Input2::Fl_Input2(int x, int y, int w, int h, const char* l) : Fl_Input(x, y, w, h, l) { if (!cmenu_init) { for (size_t i = 0; i < sizeof(cmenu)/sizeof(*cmenu) - 1; i++) if (cmenu[i].labeltype() == _FL_MULTI_LABEL) set_icon_label(&cmenu[i]); cmenu_init = true; } } int Fl_Input2::handle(int event) { switch (event) { case FL_KEYBOARD: { int b = Fl::event_key(); int p = position(); // stop the move-to-next-field madness, we have Tab for that! if (unlikely((b == FL_Left && p == 0) || (b == FL_Right && p == size()) || (b == FL_Up && line_start(p) == 0) || (b == FL_Down && line_end(p) == size()))) return 1; else if (unlikely(Fl::event_state() & (FL_ALT | FL_META))) { switch (b) { case 'c': { // capitalise if (readonly() || p == size()) return 1; while (p < size() && isspace(*(value() + p))) p++; if (p == size()) return 1; char c = toupper(*(value() + p)); replace(p, p + 1, &c, 1); position(word_end(p)); } return 1; case 'u': case 'l': { // upper/lower case if (readonly() || p == size()) return 1; while (p < size() && isspace(*(value() + p))) p++; int n = word_end(p) - p; if (n == 0) return 1; char* s = new char[n]; memcpy(s, value() + p, n); if (b == 'u') for (int i = 0; i < n; i++) s[i] = toupper(s[i]); else for (int i = 0; i < n; i++) s[i] = tolower(s[i]); replace(p, p + n, s, n); position(p + n); delete [] s; return 1; } default: break; } } } return Fl_Input::handle(event); case FL_MOUSEWHEEL: { if (!((type() & (FL_MULTILINE_INPUT | FL_MULTILINE_OUTPUT)) && Fl::event_inside(this))) return Fl_Input::handle(event); int d; if (!((d = Fl::event_dy()) || (d = Fl::event_dx()))) return Fl_Input::handle(event); if (Fl::focus() != this) take_focus(); up_down_position(d + (d > 0 ? line_end(position()) : line_start(position()))); return 1; } case FL_PUSH: if (Fl::event_button() == FL_RIGHT_MOUSE) break; // fall through default: return Fl_Input::handle(event); } bool sel = position() != mark(), ro = readonly(); set_active(&cmenu[OP_UNDO], !ro); set_active(&cmenu[OP_CUT], !ro && sel); set_active(&cmenu[OP_COPY], sel); set_active(&cmenu[OP_PASTE], !ro); set_active(&cmenu[OP_DELETE], !ro && sel); set_active(&cmenu[OP_CLEAR], !ro && size()); set_active(&cmenu[OP_SELECT_ALL], size()); take_focus(); window()->cursor(FL_CURSOR_DEFAULT); int t = Fl_Tooltip::enabled(); Fl_Tooltip::disable(); const Fl_Menu_Item* m = cmenu->popup(Fl::event_x(), Fl::event_y()); Fl_Tooltip::enable(t); if (!m) return 1; switch (m - cmenu) { case OP_UNDO: undo(); break; case OP_CUT: cut(); copy_cuts(); break; case OP_COPY: copy(1); break; case OP_PASTE: Fl::paste(*this, 1); break; case OP_DELETE: cut(); break; case OP_CLEAR: cut(0, size()); break; case OP_SELECT_ALL: position(0, size()); break; } return 1; } fldigi-3.21.80/src/widgets/FTextRXTX.cxx0000664000175000017500000010677312313064025014621 00000000000000// ---------------------------------------------------------------------------- // FTextRXTX.cxx // // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // Copyright (C) 2008-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include "FTextView.h" #include "main.h" #include "trx.h" #include "macros.h" #include "main.h" #include "fl_digi.h" #include "cw.h" #include "fileselect.h" #include "font_browser.h" #include "ascii.h" #include "configuration.h" #include "qrunner.h" #include "mfsk.h" #include "icons.h" #include "globals.h" #include "re.h" #include "strutil.h" #include "dxcc.h" #include "locator.h" #include "logsupport.h" #include "status.h" #include "gettext.h" #include "arq_io.h" #include "debug.h" using namespace std; // Fl_Scrollbar wrapper to draw marks on the slider background. // Currently only implemented for a vertical scrollbar. class MVScrollbar : public Fl_Scrollbar { struct mark_t { double pos; Fl_Color color; mark_t(double pos_, Fl_Color color_) : pos(pos_), color(color_) { } }; public: MVScrollbar(int X, int Y, int W, int H, const char* l = 0) : Fl_Scrollbar(X, Y, W, H, l), draw_marks(false) { } void draw(void); void mark(Fl_Color c) { marks.push_back(mark_t(maximum() - 1.0, c)); redraw(); } bool has_marks(void) { return !marks.empty(); } void show_marks(bool b) { draw_marks = b; redraw(); } void clear(void) { marks.clear(); redraw(); } private: vector marks; bool draw_marks; }; static void show_font_warning(FTextBase* w); Fl_Menu_Item FTextRX::menu[] = { { make_icon_label(_("Look up call"), net_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { make_icon_label(_("Call"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Name"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("QTH"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("State"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Province"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Country"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Locator"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("RST(r)"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { make_icon_label(_("Exchange In"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Serial number"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { make_icon_label(_("Insert marker"), insert_link_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { 0 }, // VIEW_MENU_COPY { 0 }, // VIEW_MENU_CLEAR { 0 }, // VIEW_MENU_SELECT_ALL { 0 }, // VIEW_MENU_SAVE { 0 }, // VIEW_MENU_WRAP { _("Quick entry"), 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL }, { _("Scroll hints"), 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL }, { 0 } }; /// FTextRX constructor. /// We remove \c Fl_Text_Display_mod::buffer_modified_cb from the list of callbacks /// because we want to scroll depending on the visibility of the last line; @see /// changed_cb. /// @param x /// @param y /// @param w /// @param h /// @param l FTextRX::FTextRX(int x, int y, int w, int h, const char *l) : FTextView(x, y, w, h, l) { memcpy(menu + RX_MENU_COPY, FTextView::menu, (FTextView::menu->size() - 1) * sizeof(*FTextView::menu)); context_menu = menu; init_context_menu(); menu[RX_MENU_QUICK_ENTRY].clear(); menu[RX_MENU_SCROLL_HINTS].clear(); menu[RX_MENU_WRAP].hide(); // Replace the scrollbar widget MVScrollbar* mvsb = new MVScrollbar(mVScrollBar->x(), mVScrollBar->y(), mVScrollBar->w(), mVScrollBar->h(), NULL); mvsb->show_marks(false); mvsb->callback(mVScrollBar->callback(), mVScrollBar->user_data()); remove(mVScrollBar); delete mVScrollBar; Fl_Group::add(mVScrollBar = mvsb); mFastDisplay = 1; } FTextRX::~FTextRX() { } /// Handles fltk events for this widget. /// We only care about mouse presses (to display the popup menu and prevent /// pasting) and keyboard events (to make sure no text can be inserted). /// Everything else is passed to the base class handle(). /// /// @param event /// /// @return /// int FTextRX::handle(int event) { static Fl_Cursor cursor; switch (event) { case FL_PUSH: if (!Fl::event_inside(this)) break; switch (Fl::event_button()) { case FL_LEFT_MOUSE: if (Fl::event_shift() || (unlikely(Fl::event_clicks()) && progdefaults.rxtext_clicks_qso_data)) { handle_qso_data(Fl::event_x() - x(), Fl::event_y() - y()); return 1; } goto out; case FL_MIDDLE_MOUSE: if (cursor != FL_CURSOR_HAND) handle_qso_data(Fl::event_x() - x(), Fl::event_y() - y()); return 1; case FL_RIGHT_MOUSE: handle_context_menu(); return 1; default: goto out; } break; case FL_DRAG: if (Fl::event_button() != FL_LEFT_MOUSE) return 1; break; case FL_RELEASE: { int eb = Fl::event_button(); if (cursor == FL_CURSOR_HAND && eb == FL_LEFT_MOUSE && Fl::event_is_click() && !Fl::event_clicks()) { handle_clickable(Fl::event_x() - x(), Fl::event_y() - y()); return 1; } break; } case FL_MOVE: { int p = xy_to_position(Fl::event_x(), Fl::event_y(), Fl_Text_Display_mod::CURSOR_POS); if ((unsigned char)sbuf->byte_at(p) >= CLICK_START + FTEXT_DEF) { if (cursor != FL_CURSOR_HAND) window()->cursor(cursor = FL_CURSOR_HAND); return 1; } else cursor = FL_CURSOR_INSERT; break; } // catch some text-modifying events that are not handled by kf_* functions case FL_KEYBOARD: break; case FL_ENTER: if (!progdefaults.rxtext_tooltips || Fl_Tooltip::delay() == 0.0f) break; tooltips.enabled = Fl_Tooltip::enabled(); tooltips.delay = Fl_Tooltip::delay(); Fl_Tooltip::enable(1); Fl_Tooltip::delay(0.0f); Fl::add_timeout(tooltips.delay / 2.0, dxcc_tooltip, this); break; case FL_LEAVE: if (!progdefaults.rxtext_tooltips || Fl_Tooltip::delay() != 0.0f) break; Fl_Tooltip::enable(tooltips.enabled); Fl_Tooltip::delay(tooltips.delay); Fl::remove_timeout(dxcc_tooltip, this); break; } out: return FTextView::handle(event); } /// Adds a char to the buffer /// /// @param c The character /// @param attr The attribute (@see enum text_attr_e); RECV if omitted. /// void FTextRX::add(unsigned int c, int attr) { if (c == '\r') return; char s[] = { '\0', '\0', char( FTEXT_DEF + attr ), '\0' }; const char *cp = &s[0]; // The user may have moved the cursor by selecting text or // scrolling. Place it at the end of the buffer. if (mCursorPos != tbuf->length()) insert_position(tbuf->length()); switch (c) { case '\b': // we don't call kf_backspace because it kills selected text if (s_text.length()) { int character_start = tbuf->utf8_align(tbuf->length() - 1); int character_length = fl_utf8len1(tbuf->byte_at(character_start)); tbuf->remove(character_start, tbuf->length()); sbuf->remove(character_start, sbuf->length()); s_text.resize(s_text.length() - character_length); s_style.resize(s_style.length() - character_length); } break; case '\n': // maintain the scrollback limit, if we have one if (max_lines > 0 && tbuf->count_lines(0, tbuf->length()) >= max_lines) { int le = tbuf->line_end(0) + 1; // plus 1 for the newline tbuf->remove(0, le); sbuf->remove(0, le); } s_text.clear(); s_style.clear(); insert("\n"); sbuf->append(s + 2); break; default: if ((c < ' ' || c == 127) && attr != CTRL) // look it up cp = ascii[(unsigned char)c]; else // insert verbatim s[0] = c; for (int i = 0; cp[i]; ++i) { s_text += cp[i]; s_style += s[2]; } fl_font( textfont(), textsize() ); int lwidth = (int)fl_width( s_text.c_str(), s_text.length()); bool wrapped = false; if ( lwidth >= (text_area.w - mVScrollBar->w() - LEFT_MARGIN - RIGHT_MARGIN)) { if (c != ' ') { size_t p = s_text.rfind(' '); if (p != string::npos) { s_text.erase(0, p+1); s_style.erase(0, p+1); if (s_text.length() < 10) { // wrap and delete trailing space tbuf->remove(tbuf->length() - s_text.length(), tbuf->length()); sbuf->remove(sbuf->length() - s_style.length(), sbuf->length()); insert("\n"); // always insert new line sbuf->append(s + 2); insert(s_text.c_str()); sbuf->append(s_style.c_str()); wrapped = true; } } } if (!wrapped) { // add a new line if not wrapped insert("\n"); sbuf->append(s + 2); s_text.clear(); s_style.clear(); if (c != ' ') { // add character if not a space (no leading spaces) for (int i = 0; cp[i]; ++i) { sbuf->append(s + 2); s_style.append(s + 2); } s_text.append(cp); insert(cp); } } } else { for (int i = 0; cp[i]; ++i) sbuf->append(s + 2); insert(cp); } break; } // test for bottom of text visibility if (// !mFastDisplay && (mVScrollBar->value() >= mNBufferLines - mNVisibleLines + mVScrollBar->linesize() - 1)) show_insert_position(); } void FTextRX::set_quick_entry(bool b) { if (b) menu[RX_MENU_QUICK_ENTRY].set(); else menu[RX_MENU_QUICK_ENTRY].clear(); } void FTextRX::set_scroll_hints(bool b) { if (b) menu[RX_MENU_SCROLL_HINTS].set(); else menu[RX_MENU_SCROLL_HINTS].clear(); static_cast(mVScrollBar)->show_marks(b); } void FTextRX::mark(FTextBase::TEXT_ATTR attr) { if (attr == NATTR) attr = CLICK_START; static_cast(mVScrollBar)->mark(styles[attr].color); } void FTextRX::clear(void) { FTextBase::clear(); s_text.clear(); s_style.clear(); static_cast(mVScrollBar)->clear(); } void FTextRX::setFont(Fl_Font f, int attr) { FTextBase::setFont(f, attr); show_font_warning(this); } void FTextRX::handle_clickable(int x, int y) { int pos; unsigned int style; pos = xy_to_position(x + this->x(), y + this->y(), CURSOR_POS); // return unless clickable style if ((style = (unsigned char)sbuf->byte_at(pos)) < CLICK_START + FTEXT_DEF) return; int start, end; for (start = pos-1; start >= 0; start--) if ((unsigned char)sbuf->byte_at(start) != style) break; start++; int len = sbuf->length(); for (end = pos+1; end < len; end++) if ((unsigned char)sbuf->byte_at(end) != style) break; switch (style - FTEXT_DEF) { case QSY: handle_qsy(start, end); break; // ... default: break; } } void FTextRX::handle_qsy(int start, int end) { char* text = tbuf->text_range(start, end); extern map qrg_marks; map::const_iterator i; if ((i = qrg_marks.find(text)) != qrg_marks.end()) { const qrg_mode_t& m = i->second; if (active_modem->get_mode() != m.mode) init_modem_sync(m.mode); qsy(m.rfcarrier, m.carrier); } free(text); } static fre_t rst("^[1-5][1-9]{2}$", REG_EXTENDED | REG_NOSUB); static fre_t loc("[a-r]{2}[[:digit:]]{2}([a-x]{2})?", REG_EXTENDED | REG_ICASE); static fre_t call("([[:alnum:]]?[[:alpha:]/]+[[:digit:]]+[[:alnum:]/]+)", REG_EXTENDED); void FTextRX::handle_qso_data(int start, int end) { char* s = get_word(start, end, progdefaults.nonwordchars.c_str()); if (!s) return; char* p = s; Fl_Input* target = 0; if (QsoInfoFrame1B->visible()) { if (call.match(s)) { // point p to substring const regmatch_t& offsets = call.suboff()[1]; p = s + offsets.rm_so; *(s + offsets.rm_eo) = '\0'; inpCall->value(p); inpCall->do_callback(); } else { inpXchgIn->position(inpXchgIn->size()); if (inpXchgIn->size()) inpXchgIn->insert(" ", 1); inpXchgIn->insert(s); } } else { if (rst.match(s)) target = inpRstIn; else if (loc.match(s)) target = inpLoc; else if (call.match(s)) { // point p to substring const regmatch_t& offsets = call.suboff()[1]; p = s + offsets.rm_so; *(s + offsets.rm_eo) = '\0'; target = inpCall; } else if (count_if(s, s + strlen(s), static_cast(isdigit))) target = inpQth; else target = *inpName->value() ? inpQth : inpName; target->value(p); target->do_callback(); } free(s); restoreFocus(NULL); } void FTextRX::handle_context_menu(void) { bool contest_ui = progStatus.Rig_Contest_UI || (progStatus.contest && !progStatus.NO_RIGLOG && !progStatus.Rig_Log_UI); unsigned shown = 0; #define show_item(x_) (shown |= (1 << x_)) #define hide_item(x_) (shown &= ~(1 << x_)) #define test_item(x_) (shown & (1 << x_)) show_item(RX_MENU_CALL); if (contest_ui || (progStatus.contest && !progStatus.NO_RIGLOG && !progStatus.Rig_Log_UI)) { show_item(RX_MENU_SERIAL); show_item(RX_MENU_XCHG); } // "Look up call" shown only in non-contest mode else if (progdefaults.QRZWEB != QRZWEBNONE || progdefaults.QRZXML != QRZXMLNONE) show_item(RX_MENU_QRZ_THIS); if (menu[RX_MENU_QUICK_ENTRY].value()) { for (size_t i = RX_MENU_NAME; i <= RX_MENU_RST_IN; i++) show_item(i); menu[RX_MENU_CALL].flags &= ~FL_MENU_DIVIDER; } else { if (!contest_ui && !progStatus.contest) { show_item(RX_MENU_NAME); show_item(RX_MENU_QTH); show_item(RX_MENU_RST_IN); } menu[RX_MENU_CALL].flags |= FL_MENU_DIVIDER; } if (static_cast(mVScrollBar)->has_marks()) menu[RX_MENU_SCROLL_HINTS].show(); else menu[RX_MENU_SCROLL_HINTS].hide(); for (size_t i = RX_MENU_QRZ_THIS; i <= RX_MENU_XCHG; i++) { if (test_item(i)) menu[i].show(); else menu[i].hide(); } #undef show_item #undef hide_item #undef test_item // availability of editing items depend on buffer state set_active(&menu[RX_MENU_COPY], tbuf->selected()); set_active(&menu[RX_MENU_CLEAR], tbuf->length()); set_active(&menu[RX_MENU_SELECT_ALL], tbuf->length()); set_active(&menu[RX_MENU_SAVE], tbuf->length()); if (wrap) menu[RX_MENU_WRAP].set(); else menu[RX_MENU_WRAP].clear(); show_context_menu(); } /// The context menu handler /// /// @param val /// void FTextRX::menu_cb(size_t item) { Fl_Input* input = 0; switch (item) { case RX_MENU_QRZ_THIS: menu_cb(RX_MENU_CALL); extern void CALLSIGNquery(); CALLSIGNquery(); break; case RX_MENU_CALL: input = inpCall; break; case RX_MENU_NAME: input = inpName; break; case RX_MENU_QTH: input = inpQth; break; case RX_MENU_STATE: input = inpState; break; case RX_MENU_PROVINCE: input = inpVEprov; break; case RX_MENU_COUNTRY: input = inpCountry; break; case RX_MENU_LOC: input = inpLoc; break; case RX_MENU_RST_IN: input = inpRstIn; break; case RX_MENU_SERIAL: input = inpSerNo; break; case RX_MENU_XCHG: input = inpXchgIn; break; case RX_MENU_DIV: note_qrg(false, "\n", "\n"); break; case RX_MENU_COPY: kf_copy(Fl::event_key(), this); break; case RX_MENU_CLEAR: clear(); break; case RX_MENU_SELECT_ALL: tbuf->select(0, tbuf->length()); break; case RX_MENU_SAVE: saveFile(); break; case RX_MENU_QUICK_ENTRY: menu[item].flags ^= FL_MENU_VALUE; if (menu[item].value()) handle_context_menu(); break; case RX_MENU_WRAP: set_word_wrap(!wrap, true); break; case RX_MENU_SCROLL_HINTS: menu[item].flags ^= FL_MENU_VALUE; static_cast(mVScrollBar)->show_marks(menu[item].value()); break; } restoreFocus(NULL); if (!input) return; char* s = get_word(popx, popy, progdefaults.nonwordchars.c_str()); if (!s) return; if (item == RX_MENU_XCHG) { // append input->position(input->size()); if (input->size()) input->insert(" ", 1); input->insert(s); } else input->value(s); input->do_callback(); free(s); } const char* FTextRX::dxcc_lookup_call(int x, int y) { char* s = get_word(x - this->x(), y - this->y(), progdefaults.nonwordchars.c_str()); char* mem = s; if (!(s && *s && call.match(s))) { free(s); return 0; } double lon1, lat1, lon2 = 360.0, lat2 = 360.0, distance, azimuth; static string tip; ostringstream stip; const dxcc* e = 0; cQsoRec* qso = 0; unsigned char qsl; // prevent locator-only lookup if Ctrl is held if (!(Fl::event_state() & FL_CTRL) && loc.match(s)) { const vector& v = loc.suboff(); s += v[0].rm_so; *(s + v[0].rm_eo) = '\0'; if (locator2longlat(&lon2, &lat2, s) != RIG_OK) goto ret; e = 0; qsl = 0; qso = 0; } else { e = dxcc_lookup(s); qsl = qsl_lookup(s); qso = SearchLog(s); } if (qso && locator2longlat(&lon2, &lat2, qso->getField(GRIDSQUARE)) != RIG_OK) lon2 = lat2 = 360.0; if (e) { // use dxcc data if we didn't have a good locator string in the log file if (lon2 == 360.0) lon2 = -e->longitude; if (lat2 == 360.0) lat2 = e->latitude; stip << e->country << " (" << e->continent << " GMT" << fixed << showpos << setprecision(1) << -e->gmt_offset << noshowpos << ") CQ-" << e->cq_zone << " ITU-" << e->itu_zone << '\n'; } if (locator2longlat(&lon1, &lat1, progdefaults.myLocator.c_str()) == RIG_OK && qrb(lon1, lat1, lon2, lat2, &distance, &azimuth) == RIG_OK) { stip << "QTE " << fixed << setprecision(0) << azimuth << '\260' << " (" << azimuth_long_path(azimuth) << '\260' << ") QRB " << distance << "km (" << distance_long_path(distance) << "km)\n"; } if (qso) { const char* info[] = { qso->getField(NAME), qso->getField(QTH), qso->getField(QSO_DATE), qso->getField(BAND), qso->getField(MODE) }; // name & qth if (*info[0]) join(stip << "* ", info, 2, _(" in "), true) << '\n'; // other info join(stip << "* " << _("Last QSO") << ": ", info+2, 3, ", ", true) << '\n'; } if (qsl) { stip << "* QSL: "; for (unsigned char i = 0; i < QSL_END; i++) if (qsl & (1 << i)) stip << qsl_names[i] << ' '; stip << '\n'; } ret: free(mem); tip = stip.str(); return tip.empty() ? 0 : tip.c_str(); } void FTextRX::dxcc_tooltip(void* obj) { struct point { int x, y; bool operator==(const point& p) { return x == p.x && y == p.y; } bool operator!=(const point& p) { return !(*this == p); } }; static point p[3] = { {0, 0}, {0, 0}, {0, 0} }; memmove(p, p+1, 2 * sizeof(point)); p[2].x = Fl::event_x(); p[2].y = Fl::event_y(); static const char* tip = 0; FTextRX* v = reinterpret_cast(obj); // look up word under cursor if we have been called twice with the cursor // at the same position, and if the cursor was previously somewhere else if (p[2] == p[1] && p[2] != p[0] && ((tip = v->dxcc_lookup_call(p[2].x, p[2].y)))) Fl_Tooltip::enter_area(v, p[2].x, p[2].y, 100, 100, tip); else if (p[2] != p[1]) Fl_Tooltip::exit(v); Fl::repeat_timeout(tip ? Fl_Tooltip::hoverdelay() : v->tooltips.delay / 2.0, dxcc_tooltip, obj); } // ---------------------------------------------------------------------------- Fl_Menu_Item FTextTX::menu[] = { { make_icon_label(_("Transmit"), tx_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Receive"), rx_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Abort"), process_stop_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Send image..."), image_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { 0 }, // EDIT_MENU_CUT { 0 }, // EDIT_MENU_COPY { 0 }, // EDIT_MENU_PASTE { 0 }, // EDIT_MENU_CLEAR { 0 }, // EDIT_MENU_READ { 0 }, // EDIT_MENU_WRAP { 0 } }; // needed by our static kf functions, which may restrict editing depending on // the transmit cursor position int *FTextTX::ptxpos; FTextTX::FTextTX(int x, int y, int w, int h, const char *l) : FTextEdit(x, y, w, h, l), PauseBreak(false), txpos(0), bkspaces(0) { ptxpos = &txpos; change_keybindings(); memcpy(menu + TX_MENU_CUT, FTextEdit::menu, (FTextEdit::menu->size() - 1) * sizeof(*FTextEdit::menu)); context_menu = menu; init_context_menu(); utf8_txpos = txpos = 0; } /// Handles fltk events for this widget. /// We pass keyboard events to handle_key() and handle mouse3 presses to show /// the popup menu. We also disallow mouse2 events in the transmitted text area. /// Everything else is passed to the base class handle(). /// /// @param event /// /// @return /// int FTextTX::handle(int event) { if ( !(Fl::event_inside(this) || (event == FL_KEYBOARD && Fl::focus() == this)) ) return FTextEdit::handle(event); switch (event) { case FL_KEYBOARD: return handle_key(Fl::event_key()) ? 1 : FTextEdit::handle(event); case FL_PUSH: if (Fl::event_button() == FL_MIDDLE_MOUSE && xy_to_position(Fl::event_x(), Fl::event_y(), CHARACTER_POS) < txpos) return 1; // ignore mouse2 text pastes inside the transmitted text } return FTextEdit::handle(event); } /// Clears the buffer. /// Also resets the transmit position, stored backspaces and tx pause flag. /// void FTextTX::clear(void) { FTextEdit::clear(); txpos = 0; utf8_txpos = 0; bkspaces = 0; PauseBreak = false; } /// Clears the sent text. /// Also resets the transmit position, stored backspaces and tx pause flag. /// void FTextTX::clear_sent(void) { tbuf->remove(0, utf8_txpos); sbuf->remove(0, utf8_txpos); txpos = 0; utf8_txpos = 0; bkspaces = 0; PauseBreak = false; set_word_wrap(restore_wrap); } /// Returns boolean end of text /// /// true if empty buffer /// false if characters remain /// bool FTextTX::eot(void) { return (insert_position() == txpos); } /// Returns the next character to be transmitted. /// /// @return The next character, or ETX if the transmission has been paused, or /// NUL if no text should be transmitted. /// int FTextTX::nextChar(void) { int c; if (bkspaces) { --bkspaces; c = '\b'; } else if (PauseBreak) { PauseBreak = false; c = GET_TX_CHAR_ETX;//0x03; } else if (insert_position() <= utf8_txpos) { // empty buffer or cursor inside transmitted text c = -1; } else { if ((c = tbuf->char_at(utf8_txpos)) > 0) { int n = fl_utf8bytes(c); REQ(FTextTX::changed_cb, utf8_txpos, 0, 0, -1, static_cast(0), this); REQ(FTextTX::changed_cb, utf8_txpos+1, 0, 0, -1, static_cast(0), this); ++txpos; utf8_txpos += n; } else c = -1; } return c; } // called by xmlrpc thread // called by macro execution void FTextTX::add_text(string s) { for (size_t n = 0; n < s.length(); n++) { if (s[n] == '\b') { int ipos = insert_position(); if (tbuf->length()) { if (ipos > 0 && txpos == ipos) { bkspaces++; txpos--; int nn; tbuf->get_char_at(utf8_txpos, nn); utf8_txpos -= nn; } tbuf->remove(tbuf->length() - 1, tbuf->length()); sbuf->remove(sbuf->length() - 1, sbuf->length()); redraw(); } } else { //LOG_DEBUG("%04x ", s[n] & 0x00FF); add(s[n] & 0xFF, RECV); } } } void FTextTX::setFont(Fl_Font f, int attr) { FTextBase::setFont(f, attr); show_font_warning(this); } /// Handles keyboard shorcuts /// /// @param key // pressed key /// /// @return // 1 if shortcut is handled, otherwise 0. /// int FTextTX::handle_key_shortcuts(int key) { std::string etag = ""; switch (key) { case 'c': // add for SC-c case 'm': // add for SC-m case 'n': // add for SC-n case 'r': // add for SC-r case 'l': // add for SC-l case 'h': // add for SC-h case 'a': // add for SC-a if ((Fl::event_state() & FL_CTRL) && (Fl::event_state() & FL_SHIFT)) // if ((Fl::event_state() & (FL_CTRL | FL_SHIFT))) // investigate why this doesn't work... { switch (key) { case 'c': etag = inpCall->value(); break; case 'm': etag = progdefaults.myCall; break; case 'n': etag = inpName->value(); break; case 'r': { std::string s; etag = (s = inpRstIn->value()).length() ? s : std::string("599"); } break; case 'l': etag = progdefaults.myLocator; break; case 'h': etag = progdefaults.myQth; break; case 'a': etag = progdefaults.myAntenna; default: break; } // Add text + space if length is > 0 if (etag.length()) add_text(etag + std::string(" ")); return 1; } break; default: break; } return 0; } /// Handles keyboard events to override Fl_Text_Editor_mod's handling of some /// keystrokes. /// /// @param key /// /// @return /// int FTextTX::handle_key(int key) { if (handle_key_shortcuts(key)) return 1; switch (key) { case FL_Escape: // set stop flag and clear { static time_t t[2] = { 0, 0 }; static unsigned char i = 0; if (t[i] == time(&t[!i])) { // two presses in a second: abort transmission if (trx_state == STATE_TX) menu_cb(TX_MENU_ABORT); t[i = !i] = 0; return 1; } i = !i; } if (trx_state == STATE_TX && active_modem->get_stopflag() == false) { kf_select_all(0, this); kf_copy(0, this); clear(); if (arq_text_available) AbortARQ(); active_modem->set_stopflag(true); } if (trx_state == STATE_TUNE) abort_tx(); stopMacroTimer(); return 1; case 't': // transmit for C-t if (trx_state == STATE_RX && Fl::event_state() & FL_CTRL) { menu_cb(TX_MENU_TX); return 1; } break; case 'r':// receive for C-r if (Fl::event_state() & FL_CTRL) { menu_cb(TX_MENU_RX); return 1; } else if (!(Fl::event_state() & (FL_META | FL_ALT))) break; // fall through to (un)pause for M-r or A-r case FL_Pause: if (trx_state != STATE_TX) { start_tx(); } else PauseBreak = true; return 1; case (FL_KP + '+'): if (active_modem == cw_modem) active_modem->incWPM(); return 1; case (FL_KP + '-'): if (active_modem == cw_modem) active_modem->decWPM(); return 1; case (FL_KP + '*'): if (active_modem == cw_modem) active_modem->toggleWPM(); return 1; case FL_Tab: // In non-CW modes: Tab and Ctrl-tab both pause until user moves the // cursor to let some more text through. Another (ctrl-)tab goes back to // the end of the buffer and resumes sending. // In CW mode: Tab pauses, skips rest of buffer, applies the // SKIP style, then resumes sending when new text is entered. // Ctrl-tab does the same thing as for all other modes. if (utf8_txpos != insert_position()) insert_position(utf8_txpos); else insert_position(tbuf->length()); if (!(Fl::event_state() & FL_CTRL) && active_modem == cw_modem) { int n = tbuf->length() - utf8_txpos; char s[n + 1]; memset(s, FTEXT_DEF + SKIP, n); s[n] = 0; sbuf->replace(utf8_txpos, sbuf->length(), s); insert_position(tbuf->length()); redisplay_range(utf8_txpos, insert_position()); utf8_txpos = insert_position(); } return 1; // Move cursor, or search up/down with the Meta/Alt modifiers case FL_Left: if (Fl::event_state() & (FL_META | FL_ALT)) { active_modem->searchDown(); return 1; } return 0; case FL_Right: if (Fl::event_state() & (FL_META | FL_ALT)) { active_modem->searchUp(); return 1; } return 0; // queue a BS and decr. the txpos, unless the cursor is in the tx text case FL_BackSpace: { int ipos = insert_position(); if (utf8_txpos > 0 && utf8_txpos == ipos) { bkspaces++; utf8_txpos = tbuf->prev_char(ipos); txpos--; } return 0; } // alt - 1 / 2 changes macro sets case '1': case '2': case '3': case '4': if (Fl::event_state() & FL_ALT) { static char lbl[2] = "1"; altMacros = key - '1'; if (progdefaults.mbar2_pos) { if (!altMacros) altMacros = 1; for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[NUMMACKEYS + i]->label( macros.name[(altMacros * NUMMACKEYS) + i].c_str()); btnMacro[NUMMACKEYS + i]->redraw_label(); } lbl[0] = key; btnAltMacros2->label(lbl); btnAltMacros2->redraw_label(); } else { for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[i]->label( macros.name[(altMacros * NUMMACKEYS) + i].c_str()); btnMacro[i]->redraw_label(); } lbl[0] = key; btnAltMacros1->label(lbl); btnAltMacros1->redraw_label(); } return 1; } break; default: break; } if (insert_position() < txpos) return 1; // insert a macro if (key >= FL_F && key <= FL_F_Last) return handle_key_macro(key); // read ctl-ddd, where d is a digit, as ascii characters (in base 10) // and insert verbatim; e.g. ctl-001 inserts a if (Fl::event_state() & FL_CTRL && (key >= FL_KP) && (key <= FL_KP + '9')) return handle_key_ascii(key); // restart the numeric keypad entries. ascii_cnt = 0; ascii_chr = 0; return 0; } /// Inserts the macro for function key \c key. /// /// @param key An integer in the range [FL_F, FL_F_Last] /// /// @return 1 /// int FTextTX::handle_key_macro(int key) { key -= FL_F + 1; if (key > 11) return 0; if (progdefaults.mbar2_pos) { if (Fl::event_state(FL_SHIFT)) key += altMacros * NUMMACKEYS; } else { key += altMacros * NUMMACKEYS; } if (!(macros.text[key]).empty()) macros.execute(key); return 1; } int FTextTX::handle_dnd_drag(int pos) { if (pos >= txpos) { return FTextEdit::handle_dnd_drag(pos); } else // refuse drop inside transmitted text return 0; } /// Handles mouse-3 clicks by displaying the context menu /// /// @param val /// void FTextTX::handle_context_menu(void) { // adjust Abort/Transmit/Receive menu items switch (trx_state) { case STATE_TX: menu[TX_MENU_TX].hide(); menu[TX_MENU_RX].show(); menu[TX_MENU_ABORT].show(); break; case STATE_TUNE: menu[TX_MENU_TX].hide(); menu[TX_MENU_RX].show(); menu[TX_MENU_ABORT].hide(); break; default: menu[TX_MENU_TX].show(); menu[TX_MENU_RX].hide(); menu[TX_MENU_ABORT].hide(); break; } bool modify_text_ok = insert_position() >= txpos; bool selected = tbuf->selected(); set_active(&menu[TX_MENU_MFSK16_IMG], active_modem->get_cap() & modem::CAP_IMG); set_active(&menu[TX_MENU_CLEAR], tbuf->length()); set_active(&menu[TX_MENU_CUT], selected && modify_text_ok); set_active(&menu[TX_MENU_COPY], selected); set_active(&menu[TX_MENU_PASTE], modify_text_ok); set_active(&menu[TX_MENU_READ], modify_text_ok); if (wrap) menu[TX_MENU_WRAP].set(); else menu[TX_MENU_WRAP].clear(); show_context_menu(); } /// The context menu handler /// /// @param val /// void FTextTX::menu_cb(size_t item) { switch (item) { case TX_MENU_TX: active_modem->set_stopflag(false); start_tx(); break; case TX_MENU_ABORT: char panic[200]; snprintf(panic, sizeof(panic), "*** Don't panic *** %s", progdefaults.myName.c_str()); put_status(panic, 5.0); abort_tx(); break; case TX_MENU_RX: if (trx_state == STATE_TX) { insert_position(tbuf->length()); add("^r", CTRL); } else abort_tx(); break; case TX_MENU_MFSK16_IMG: showTxViewer(0, 0); break; case TX_MENU_CLEAR: clear(); break; case TX_MENU_CUT: kf_cut(0, this); break; case TX_MENU_COPY: kf_copy(0, this); break; case TX_MENU_PASTE: kf_paste(0, this); break; case TX_MENU_READ: { restore_wrap = wrap; set_word_wrap(false); readFile(); break; } case TX_MENU_WRAP: set_word_wrap(!wrap, true); break; } } /// Overrides some useful Fl_Text_Edit keybindings that we want to keep working, /// provided that they don't try to change chunks of transmitted text. /// void FTextTX::change_keybindings(void) { struct { Fl_Text_Editor_mod::Key_Func function, override; } fbind[] = { { Fl_Text_Editor_mod::kf_default, FTextTX::kf_default }, { Fl_Text_Editor_mod::kf_enter, FTextTX::kf_enter }, { Fl_Text_Editor_mod::kf_delete, FTextTX::kf_delete }, { Fl_Text_Editor_mod::kf_cut, FTextTX::kf_cut }, { Fl_Text_Editor_mod::kf_paste, FTextTX::kf_paste } }; int n = sizeof(fbind) / sizeof(fbind[0]); // walk the keybindings linked list and replace items containing // functions for which we have an override in fbind for (Fl_Text_Editor_mod::Key_Binding *k = key_bindings; k; k = k->next) { for (int i = 0; i < n; i++) if (fbind[i].function == k->function) k->function = fbind[i].override; } } // The kf_* functions below call the corresponding Fl_Text_Editor_mod routines, but // may make adjustments so that no transmitted text is modified. int FTextTX::kf_default(int c, Fl_Text_Editor_mod* e) { return e->insert_position() < *ptxpos ? 1 : Fl_Text_Editor_mod::kf_default(c, e); } int FTextTX::kf_enter(int c, Fl_Text_Editor_mod* e) { return e->insert_position() < *ptxpos ? 1 : Fl_Text_Editor_mod::kf_enter(c, e); } int FTextTX::kf_delete(int c, Fl_Text_Editor_mod* e) { // single character if (!e->buffer()->selected()) { if (e->insert_position() >= *ptxpos && e->insert_position() != e->buffer()->length()) return Fl_Text_Editor_mod::kf_delete(c, e); else return 1; } // region: delete as much as we can int start, end; e->buffer()->selection_position(&start, &end); if (*ptxpos >= end) return 1; if (*ptxpos > start) e->buffer()->select(*ptxpos, end); return Fl_Text_Editor_mod::kf_delete(c, e); } int FTextTX::kf_cut(int c, Fl_Text_Editor_mod* e) { if (e->buffer()->selected()) { int start, end; e->buffer()->selection_position(&start, &end); if (*ptxpos >= end) return 1; if (*ptxpos > start) e->buffer()->select(*ptxpos, end); } return Fl_Text_Editor_mod::kf_cut(c, e); } int FTextTX::kf_paste(int c, Fl_Text_Editor_mod* e) { return e->insert_position() < *ptxpos ? 1 : Fl_Text_Editor_mod::kf_paste(c, e); } static void show_font_warning(FTextBase* w) { Fl_Font f = w->textfont(); if (Font_Browser::fixed_width(f)) return; // Check if we should generate a warning message bool* warn = 0; const char* fn = Fl::get_font_name(f); if (w == ReceiveText) { warn = &progdefaults.RxFontWarn; if (progdefaults.RxFontName != fn) *warn = true; } else if (w == TransmitText) { warn = &progdefaults.TxFontWarn; if (progdefaults.TxFontName != fn) *warn = true; } if (warn && *warn) { w->add(Fl::get_font_name(f), FTextBase::XMIT); w->add(" is a variable width font.\n", FTextBase::XMIT); w->add("Line wrapping with a variable width font may be\n" "too slow. Consider using a fixed width font.\n\n", FTextBase::XMIT); *warn = false; } } // ---------------------------------------------------------------------------- void MVScrollbar::draw(void) { Fl_Scrollbar::draw(); if (marks.empty() || !draw_marks) return; assert((type() & FL_HOR_SLIDER) == 0); // Calculate the slider knob position and height. For a vertical scrollbar, // the scroll buttons' height is the scrollbar width and the minimum knob // height is half that. int H = h() - Fl::box_dh(box()) - 2 * w(); // internal height (minus buttons) int slider_h = (int)(slider_size() * H + 0.5); int min_h = (w() - Fl::box_dw(box())) / 2 + 1; if (slider_h < min_h) slider_h = min_h; double val = (Fl_Slider::value() - minimum()) / (maximum() - minimum()); int slider_y = (int)(val * (H - slider_h) + 0.5) + w(); // relative to y() // This would draw a green rectangle around the slider knob: // fl_color(FL_GREEN); // fl_rect(x(), y() + slider_y, w() - Fl::box_dw(box()), slider_h); int x1 = x() + Fl::box_dx(box()), x2 = x1 + w() - Fl::box_dw(box()) - 1, ypos; // Convert stored scrollbar values to vertical positions and draw // lines inside the widget if they don't overlap with the knob area. for (vector::const_iterator i = marks.begin(); i != marks.end(); ++i) { ypos = static_cast(w() + H * i->pos / maximum()); // Don't draw over slider knob if ((ypos > slider_y && ypos < slider_y + slider_h) || (ypos < slider_y + slider_h && ypos > slider_y)) continue; ypos += y(); fl_color(i->color); fl_line(x1, ypos, x2, ypos); } } fldigi-3.21.80/src/widgets/flslider2.cxx0000664000175000017500000001633612313064025014722 00000000000000// ---------------------------------------------------------------------------- // flslider2.cxx // // Copyright (C) 2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #include #include #include "flslider2.h" inline static int handle_scroll(Fl_Valuator* w, int event) { if (!(event == FL_MOUSEWHEEL && Fl::event_inside(w))) return 0; double d; if ((d = Fl::event_dy()) || (d = Fl::event_dx())) { if (Fl::event_state() & FL_SHIFT) d *= 10.0; if (!dynamic_cast(w) && !dynamic_cast(w) && !(w->type() & FL_HOR_SLIDER)) d = -d; w->value(w->clamp(w->increment(w->value(), static_cast(-d)))); w->do_callback(); } return 1; } int Fl_Slider2::handle(int event) { return handle_scroll(this, event) ? 1 : Fl_Slider::handle(event); } int Fl_Value_Slider2::handle(int event) { return handle_scroll(this, event) ? 1 : Fl_Value_Slider::handle(event); } int Fl_Value_Input2::handle(int event) { return handle_scroll(this, event) ? 1 : Fl_Value_Input::handle(event); } inline static int handle_scroll(Fl_Spinner* w, int event) { if (!(event == FL_MOUSEWHEEL && Fl::event_inside(w))) return 0; double d; if ((d = Fl::event_dy()) || (d = Fl::event_dx())) { if (Fl::event_state() & FL_SHIFT) d *= 10.0; d = w->value() - d * w->step(); w->value(WCLAMP(d, w->minimum(), w->maximum())); w->do_callback(); } return 1; } int Fl_Spinner2::handle(int event) { return handle_scroll(this, event) ? 1 : Fl_Spinner::handle(event); } // // Counter widget for FLDIGI modified from FLTK // // Counter widget for the Fast Light Tool Kit (FLTK). // #include void My_Counter::draw() { int i; Fl_Boxtype boxtype[5]; Fl_Color selcolor; boxtype[0] = box(); if (boxtype[0] == FL_UP_BOX) boxtype[0] = FL_DOWN_BOX; if (boxtype[0] == FL_THIN_UP_BOX) boxtype[0] = FL_THIN_DOWN_BOX; for (i=1; i<5; i++) if (mouseobj == i) boxtype[i] = fl_down(box()); else boxtype[i] = box(); int xx[5], ww[5]; if (type() == FL_NORMAL_COUNTER) { int W = w()*15/100; xx[1] = x(); ww[1] = W; xx[2] = x()+1*W; ww[2] = W; xx[0] = x()+2*W; ww[0] = w()-4*W; xx[3] = x()+w()-2*W; ww[3] = W; xx[4] = x()+w()-1*W; ww[4] = W; } else { int W = w()*20/100; xx[1] = 0; ww[1] = 0; xx[2] = x(); ww[2] = W; xx[0] = x()+W; ww[0] = w()-2*W; xx[3] = x()+w()-1*W; ww[3] = W; xx[4] = 0; ww[4] = 0; } draw_box(boxtype[0], xx[0], y(), ww[0], h(), bkcolor_); fl_font(textfont(), textsize()); fl_color(active_r() ? textcolor() : fl_inactive(textcolor())); char str[128]; format(str); fl_draw(str, xx[0], y(), ww[0], h(), FL_ALIGN_CENTER); if (Fl::focus() == this) draw_focus(boxtype[0], xx[0], y(), ww[0], h()); if (!(damage()&FL_DAMAGE_ALL)) return; // only need to redraw text if (active_r()) selcolor = labelcolor(); else selcolor = fl_inactive(labelcolor()); if (type() == FL_NORMAL_COUNTER) { draw_box(boxtype[1], xx[1], y(), ww[1], h(), color()); fl_draw_symbol("@-4<<", xx[1], y(), ww[1], h(), selcolor); } draw_box(boxtype[2], xx[2], y(), ww[2], h(), color()); fl_draw_symbol("@-4<", xx[2], y(), ww[2], h(), selcolor); draw_box(boxtype[3], xx[3], y(), ww[3], h(), color()); fl_draw_symbol("@-4>", xx[3], y(), ww[3], h(), selcolor); if (type() == FL_NORMAL_COUNTER) { draw_box(boxtype[4], xx[4], y(), ww[4], h(), color()); fl_draw_symbol("@-4>>", xx[4], y(), ww[4], h(), selcolor); } } void My_Counter::increment_cb() { if (!mouseobj) return; double v = value(); switch (mouseobj) { case 1: v -= lstep_; break; case 2: v = increment(v, -1); break; case 3: v = increment(v, 1); break; case 4: v += lstep_; break; } handle_drag(clamp(round(v))); } #define INITIALREPEAT .5 #define REPEAT .1 void My_Counter::repeat_callback(void* v) { My_Counter* b = (My_Counter*)v; if (b->mouseobj) { Fl::add_timeout(REPEAT, repeat_callback, b); b->increment_cb(); } } int My_Counter::calc_mouseobj() { if (type() == FL_NORMAL_COUNTER) { int W = w()*15/100; if (Fl::event_inside(x(), y(), W, h())) return 1; if (Fl::event_inside(x()+W, y(), W, h())) return 2; if (Fl::event_inside(x()+w()-2*W, y(), W, h())) return 3; if (Fl::event_inside(x()+w()-W, y(), W, h())) return 4; } else { int W = w()*20/100; if (Fl::event_inside(x(), y(), W, h())) return 2; if (Fl::event_inside(x()+w()-W, y(), W, h())) return 3; } return -1; } int My_Counter::handle(int event) { int i; switch (event) { case FL_RELEASE: if (mouseobj) { Fl::remove_timeout(repeat_callback, this); mouseobj = 0; redraw(); } handle_release(); return 1; case FL_PUSH: if (Fl::visible_focus()) Fl::focus(this); { Fl_Widget_Tracker wp(this); handle_push(); if (wp.deleted()) return 1; } case FL_DRAG: i = calc_mouseobj(); if (i != mouseobj) { Fl::remove_timeout(repeat_callback, this); mouseobj = (uchar)i; if (i) Fl::add_timeout(INITIALREPEAT, repeat_callback, this); Fl_Widget_Tracker wp(this); increment_cb(); if (wp.deleted()) return 1; redraw(); } return 1; case FL_KEYBOARD : switch (Fl::event_key()) { case FL_Left: handle_drag(clamp(increment(value(),-1))); return 1; case FL_Right: handle_drag(clamp(increment(value(),1))); return 1; default: return 0; } // break not required because of switch... case FL_FOCUS : /* FALLTHROUGH */ case FL_UNFOCUS : if (Fl::visible_focus()) { redraw(); return 1; } else return 0; case FL_ENTER : /* FALLTHROUGH */ case FL_LEAVE : return 1; default: return 0; } } /** Destroys the valuator. */ My_Counter::~My_Counter() { Fl::remove_timeout(repeat_callback, this); } /** Creates a new My_Counter widget using the given position, size, and label string. The default type is FL_NORMAL_COUNTER. \param[in] X, Y, W, H position and size of the widget \param[in] L widget label, default is no label */ My_Counter::My_Counter(int X, int Y, int W, int H, const char* L) : Fl_Valuator(X, Y, W, H, L) { box(FL_UP_BOX); selection_color(FL_INACTIVE_COLOR); // was FL_BLUE align(FL_ALIGN_BOTTOM); bounds(-1000000.0, 1000000.0); Fl_Valuator::step(1, 10); lstep_ = 1.0; mouseobj = 0; textfont_ = FL_HELVETICA; textsize_ = FL_NORMAL_SIZE; textcolor_ = FL_FOREGROUND_COLOR; bkcolor_ = FL_BACKGROUND2_COLOR; } int Fl_Counter2::handle(int event) { return handle_scroll(this, event) ? 1 : My_Counter::handle(event); } fldigi-3.21.80/src/widgets/picture.cxx0000664000175000017500000005460012313064025014503 00000000000000// ---------------------------------------------------------------------------- // picture.cxx rgb picture viewer // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // Copyright (C) 2010 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // fldigi 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 4 of the License, or // (at your option) any later version. // // Fldigi 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 . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fl_digi.h" #include "trx.h" #include "fl_lock.h" #include "picture.h" #include "debug.h" #include "timeops.h" using namespace std; picture::picture (int X, int Y, int W, int H, int bg_col) : Fl_Widget (X, Y, W, H) { width = W; height = H; bufsize = W * H * depth; numcol = 0; slantdir = 0; vidbuf = new unsigned char[bufsize]; background = bg_col ; memset( vidbuf, background, bufsize ); zoom = 0 ; binary = false ; binary_threshold = 128 ; } picture::~picture() { if (vidbuf) delete [] vidbuf; } void picture::video(unsigned char const *data, int len ) { if (len > bufsize) return; FL_LOCK_D(); memcpy( vidbuf, data, len ); redraw(); FL_UNLOCK_D(); } unsigned char picture::pixel(int pos) { if (pos < 0 || pos >= bufsize) return 0; return vidbuf[pos]; } void picture::clear() { FL_LOCK_D(); memset(vidbuf, background, bufsize); redraw(); FL_UNLOCK_D(); } void picture::resize_zoom(int x, int y, int w, int h) { if( zoom < 0 ) { int stride = -zoom + 1 ; Fl_Widget::resize(x,y,w/stride,h/stride); } else if( zoom > 0 ) { int stride = zoom + 1 ; Fl_Widget::resize(x,y,w*stride,h*stride); } else { Fl_Widget::resize(x,y,w,h); } } void picture::resize(int x, int y, int w, int h) { FL_LOCK_D(); width = w; height = h; delete [] vidbuf; bufsize = depth * w * h; vidbuf = new unsigned char[bufsize]; memset( vidbuf, background, bufsize ); resize_zoom(x,y,w,h); FL_UNLOCK_D(); } /// No data destruction. Used when the received image grows more than expected. /// Beware that this is not protected by a mutex. void picture::resize_height(int new_height, bool clear_img) { int new_bufsize = width * new_height * depth; /// If the allocation fails, std::bad_alloc is thrown. unsigned char * new_vidbuf = new unsigned char[new_bufsize]; if( clear_img ) { /// Sets to zero the complete image. memset( new_vidbuf, background, new_bufsize ); } else { if( new_height <= height ) { memcpy( new_vidbuf, vidbuf, new_bufsize ); } else { memcpy( new_vidbuf, vidbuf, bufsize ); memset( new_vidbuf + bufsize, background, new_bufsize - bufsize ); } } delete [] vidbuf ; vidbuf = new_vidbuf ; bufsize = new_bufsize ; height = new_height; resize_zoom( x(), y(), width, height ); redraw(); } void picture::stretch(double the_ratio) { /// We do not change the width but the height int new_height = height * the_ratio + 0.5 ; int new_bufsize = width * new_height * depth; /// If the allocation fails, std::bad_alloc is thrown. unsigned char * new_vidbuf = new unsigned char[new_bufsize]; /// No interpolation, it takes the nearest pixel. for( int ix_out = 0 ; ix_out < new_bufsize ; ix_out += depth ) { int ix_in = 0.5 + ( double )ix_out * the_ratio ; switch( ix_in % depth ) { case 1 : --ix_in ; break ; case 2 : ++ix_in ; break ; default: ; } if( ix_in >= bufsize ) { /// Grey value as a filler to indicate the end. For debugging. memset( new_vidbuf + ix_out, 128, new_bufsize - ix_out ); break ; } for( int i = 0; i < depth ; ++i ) { new_vidbuf[ ix_out + i ] = vidbuf[ ix_in + i ]; } }; delete [] vidbuf ; vidbuf = new_vidbuf ; bufsize = new_bufsize ; height = new_height; resize_zoom( x(), y(), width, height ); redraw(); } /// Change the horizontal center of the image by shifting the pixels. /// Beware that it is not protected by FL_LOCK_D/FL_UNLOCK_D void picture::shift_horizontal_center(int horizontal_shift) { /// This is a number of pixels. horizontal_shift *= depth ; if( horizontal_shift < -bufsize ) { horizontal_shift = -bufsize ; } if( horizontal_shift > 0 ) { /// Here we lose a couple of pixels at the end of the buffer /// if there is not a line enough. It should not be a lot. memmove( vidbuf + horizontal_shift, vidbuf, bufsize - horizontal_shift ); memset( vidbuf, background, horizontal_shift ); } else { /// Here, it is not necessary to reduce the buffer'size. memmove( vidbuf, vidbuf - horizontal_shift, bufsize + horizontal_shift ); memset( vidbuf + bufsize + horizontal_shift, background, -horizontal_shift ); } redraw(); } void picture::set_zoom( int the_zoom ) { zoom = the_zoom ; /// The size of the displayed bitmap is changed. resize_zoom( x(), y(), width, height ); } // in data user data passed to function // in x_screen,y_screen,wid_screen position and width of scan line in image // out buf buffer for generated image data. // Must copy wid_screen pixels from scanline y_screen, starting at pixel x_screen to this buffer. void picture::draw_cb( void *data, int x_screen, int y_screen, int wid_screen, uchar * __restrict__ buf) { const picture * __restrict__ ptr_pic = ( const picture * ) data ; const int img_width = ptr_pic->width ; const unsigned char * __restrict__ in_ptr = ptr_pic->vidbuf ; /// One pixel out of (zoom+1) if( ptr_pic->zoom < 0 ) { const int stride = -ptr_pic->zoom + 1 ; const int in_offset = ( img_width * y_screen + x_screen ) * stride ; int dpth_in_offset = depth * in_offset ; if(ptr_pic->binary) { for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); buf[ ix_w + 1 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); buf[ ix_w + 2 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); dpth_in_offset += depth * stride ; } } else { for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = in_ptr[ dpth_in_offset ]; buf[ ix_w + 1 ] = in_ptr[ dpth_in_offset + 1 ]; buf[ ix_w + 2 ] = in_ptr[ dpth_in_offset + 2 ]; dpth_in_offset += depth * stride ; } } return ; } /// Reads each input pixel (-zoom+1) times. if( ptr_pic->zoom > 0 ) { const int stride = ptr_pic->zoom + 1 ; const int in_offset = img_width * ( y_screen / stride ) + x_screen / stride ; #ifndef NDEBUG if( y_screen / stride >= ptr_pic->h() ) { LOG_ERROR( "Overflow2 y_screen=%d h=%d y_screen*stride=%d height=%d stride=%d\n", y_screen, ptr_pic->h(), (y_screen/stride), ptr_pic->height, stride ); return ; } #endif if(ptr_pic->binary) { for( int ix_w = 0, max_w = wid_screen * depth, dpth_in_offset = depth * in_offset ; ix_w < max_w ; ) { unsigned char in_dpth_in_offset_0 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); unsigned char in_dpth_in_offset_1 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); unsigned char in_dpth_in_offset_2 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); // Stride is less than 4 or 5. for( int j= 0; j < stride; j++, ix_w += depth ) { buf[ ix_w ] = in_dpth_in_offset_0; buf[ ix_w + 1 ] = in_dpth_in_offset_1; buf[ ix_w + 2 ] = in_dpth_in_offset_2; } dpth_in_offset += depth ; } } else { for( int ix_w = 0, max_w = wid_screen * depth, dpth_in_offset = depth * in_offset ; ix_w < max_w ; ) { unsigned char in_dpth_in_offset_0 = in_ptr[ dpth_in_offset ]; unsigned char in_dpth_in_offset_1 = in_ptr[ dpth_in_offset + 1 ]; unsigned char in_dpth_in_offset_2 = in_ptr[ dpth_in_offset + 2 ]; // Stride is less than 4 or 5. for( int j= 0; j < stride; j++, ix_w += depth ) { buf[ ix_w ] = in_dpth_in_offset_0; buf[ ix_w + 1 ] = in_dpth_in_offset_1; buf[ ix_w + 2 ] = in_dpth_in_offset_2; } dpth_in_offset += depth ; } } return ; } // zoom == 0, stride=1 const int in_offset = img_width * y_screen + x_screen ; if(ptr_pic->binary) { int dpth_in_offset = depth * in_offset ; for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); buf[ ix_w + 1 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); buf[ ix_w + 2 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); dpth_in_offset += depth ; } } else { abort(); // This should never be called, see optimization in picture::draw(). } } // picture::draw_cb void picture::draw() { if( ( zoom == 0 ) && ( binary == false ) ) { /// No scaling, this is faster. fl_draw_image( vidbuf, x(), y(), w(), h() ); } else { fl_draw_image( draw_cb, this, x(), y(), w(), h() ); // redraw(); } } void picture::slant_undo() { int row, col; unsigned char temp[width * depth]; if (height == 0 || width == 0 || slantdir == 0) return; if (slantdir == -1) { // undo from left for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[(row * width + width - col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + col)*depth], &vidbuf[row * width *depth], (width - col) * depth ); memmove( &vidbuf[row * width * depth], temp, col * depth ); } } } else if (slantdir == 1) { // undo from right for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[row * width * depth], col * depth ); memmove( &vidbuf[row * width * depth], &vidbuf[(row * width + col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + width - col) * depth], temp, col *depth ); } } } slantdir = 0; redraw(); } void picture::slant_corr(int x, int y) { int row, col; unsigned char temp[width * depth]; if (height == 0 || width == 0) return; if (x > width / 2) { // unwrap from right numcol = (width - x) * height / y; if (numcol > width / 2) numcol = width / 2; for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[(row * width + width - col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + col)*depth], &vidbuf[row * width *depth], (width - col) * depth ); memmove( &vidbuf[row * width * depth], temp, col * depth ); } } slantdir = 1; } else { // unwrap from left numcol = x * height / y; if (numcol > width / 2) numcol = width / 2; for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[row * width * depth], col * depth ); memmove( &vidbuf[row * width * depth], &vidbuf[(row * width + col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + width - col) * depth], temp, col *depth ); } } slantdir = -1; } redraw(); } int picture::handle(int event) { if (Fl::event_inside( this )) { if (event == FL_RELEASE) { int xpos = Fl::event_x() - x(); int ypos = Fl::event_y() - y(); int evb = Fl::event_button(); if (evb == 1) slant_corr(xpos, ypos); else if (evb == 3) slant_undo(); LOG_DEBUG("#2 %d, %d", xpos, ypos); return 1; } return 1; } return 0; } static FILE* open_file(const char* name, const char* suffix) { FILE* fp; size_t flen = strlen(name); if (name[flen - 1] == '/') { // if the name ends in a slash we will generate // a timestamped name in the following format: const char t[] = "pic_YYYY-MM-DD_HHMMSSz"; size_t newlen = flen + sizeof(t); if (suffix) newlen += 5; char* newfn = new char[newlen]; memcpy(newfn, name, flen); time_t time_sec = time(0); struct tm ztime; (void)gmtime_r(&time_sec, &ztime); size_t sz; if ((sz = strftime(newfn + flen, newlen - flen, "pic_%Y-%m-%d_%H%M%Sz", &ztime)) > 0) { strncpy(newfn + flen + sz, suffix, newlen - flen - sz); newfn[newlen - 1] = '\0'; mkdir(name, 0777); fp = fopen(newfn, "wb"); } else fp = NULL; delete [] newfn; } else fp = fopen(name, "wb"); return fp; } static inline unsigned char avg_pix( const unsigned char * vidbuf ) { return ( vidbuf[ 0 ] + vidbuf[ 1 ] + vidbuf[ 2 ] ) / picture::depth ; } int picture::save_png(const char* filename, bool monochrome, const char *extra_comments) { FILE* fp; if ((fp = open_file(filename, ".png")) == NULL) return -1; // set up the png structures png_structp png; png_infop info; if ((png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)) == NULL) { fclose(fp); return -1; } /* png_set_compression_level() shall set the compression level to "level". * The valid values for "level" range from [0,9], corresponding directly * to compression levels for zlib. The value 0 implies no compression * and 9 implies maximal compression. Note: Tests have shown that zlib * compression levels 3-6 usually perform as well as level 9 for PNG images, * and do considerably fewer calculations. */ png_set_compression_level(png, Z_BEST_COMPRESSION); if ((info = png_create_info_struct(png)) == NULL) { png_destroy_write_struct(&png, NULL); fclose(fp); return -1; } if (setjmp(png_jmpbuf(png))) { png_destroy_write_struct(&png, &info); fclose(fp); return -1; } // use an stdio stream png_init_io(png, fp); // set png header int color_type = monochrome ? PNG_COLOR_TYPE_GRAY : PNG_COLOR_TYPE_RGB ; /// Color images must take eight bits per pixel. const int bit_depth = ( monochrome && binary ) ? 1 : 8 ; png_set_IHDR(png, info, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); // write text comments struct tm tm; time_t t = time(NULL); gmtime_r(&t, &tm); char z[20 + 1]; strftime(z, sizeof(z), "%Y-%m-%dT%H:%M:%SZ", &tm); z[sizeof(z) - 1] = '\0'; ostringstream comment; comment << "Program: " PACKAGE_STRING << '\n' << "Received: " << z << '\n' << "Modem: " << mode_info[active_modem->get_mode()].name << '\n' << "Frequency: " << inpFreq->value() << '\n'; if( extra_comments ) { comment << extra_comments ; } if (inpCall->size()) comment << "Log call: " << inpCall->value() << '\n'; // set text png_text text; text.key = strdup("Comment"); text.text = strdup(comment.str().c_str()); text.compression = PNG_TEXT_COMPRESSION_NONE; png_set_text(png, info, &text, 1); // write header png_write_info(png, info); // Extra check for debugging. if( height * width * depth != bufsize ) { LOG_ERROR("Buffer inconsistency h=%d w=%d b=%d", height, width, bufsize ); } // write image if(monochrome) { unsigned char tmp_row[width]; png_bytep row; for (int i = 0; i < height; i++) { int row_offset = i * width * depth ; if( binary ) { unsigned char accumPix = 0 ; int j_offset = 0 ; for(int j = 0 ; j < width; ++j ) { int col_offset = row_offset + j * depth ; unsigned char tmpChr = avg_pix( vidbuf + col_offset ); tmpChr = pix2bin(tmpChr) ? 1 : 0 ; j_offset = j & 0x07 ; tmpChr = tmpChr << ( 7 - j_offset ); accumPix |= tmpChr ; if( j_offset == 7 ) { tmp_row[ j >> 3 ] = accumPix ; accumPix = 0 ; } } if( j_offset != 7 ) { tmp_row[ width >> 3 ] = accumPix ; } } else { for(int j = 0 ; j < width; ++j ) { int col_offset = row_offset + j * depth ; tmp_row[j] = avg_pix( vidbuf + col_offset ); } } row = tmp_row; png_write_rows(png, &row, 1); } } else { png_bytep row; for (int i = 0; i < height; i++) { row = &vidbuf[i * width * depth]; png_write_rows(png, &row, 1); } } png_write_end(png, info); // clean up free(text.key); free(text.text); png_destroy_write_struct(&png, &info); fclose(fp); return 0; } bool picture::restore( int row, int margin ) { if( ( row <= noise_height_margin ) || ( row >= height ) ) return true; unsigned char * line_ante = vidbuf + (row - noise_height_margin) * width * depth; // Copy the new calculated value (at previous call) to all channels. // TODO: Do that when switching off noise removal, otherwise a couple of colored pixels are left. for( int col = margin ; col < width - margin; ++col ) { int offset = col * depth ; line_ante[ offset ] = line_ante[ offset + 2 ] = line_ante[ offset + 1 ]; } return false ; } void picture::erosion( int row ) { static const size_t margin_one = 1 ; if( restore( row, margin_one ) ) return ; const unsigned char * line_prev = vidbuf + (row - noise_height_margin + 1) * width * depth; unsigned char * line_curr = vidbuf + (row - noise_height_margin + 2) * width * depth; const unsigned char * line_next = vidbuf + (row - noise_height_margin + 3) * width * depth; for( size_t col = margin_one ; col < width - margin_one; ++col ) { unsigned char new_pix = 255 ; new_pix = std::min( new_pix, line_prev[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_prev[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_prev[ depth * ( col + 1 ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col + 1 ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col + 1 ) ] ); /// Use this channel as a buffer. Beware that if we change the slant, // this component might not be restored // because the line position changed. Not a big problem. // We might forbid slanting when de-noising. line_curr[ col * depth + 1 ] = new_pix; } } void picture::dilatation( int row ) { static const size_t margin_one = 1 ; if( restore( row, margin_one ) ) return ; const unsigned char * line_prev = vidbuf + (row - noise_height_margin + 1) * width * depth; unsigned char * line_curr = vidbuf + (row - noise_height_margin + 2) * width * depth; const unsigned char * line_next = vidbuf + (row - noise_height_margin + 3) * width * depth; for( size_t col = margin_one ; col < width - margin_one; ++col ) { unsigned char new_pix = 0 ; new_pix = std::max( new_pix, line_prev[ depth * ( col - 1 ) ] ); new_pix = std::max( new_pix, line_prev[ depth * ( col ) ] ); new_pix = std::max( new_pix, line_prev[ depth * ( col + 1 ) ] ); new_pix = std::max( new_pix, line_curr[ depth * ( col - 1 ) ] ); new_pix = std::max( new_pix, line_curr[ depth * ( col ) ] ); new_pix = std::max( new_pix, line_curr[ depth * ( col + 1 ) ] ); new_pix = std::max( new_pix, line_next[ depth * ( col - 1 ) ] ); new_pix = std::max( new_pix, line_next[ depth * ( col ) ] ); new_pix = std::max( new_pix, line_next[ depth * ( col + 1 ) ] ); /// Use this channel as a buffer. Beware that if we change the slant, // this component might not be restored // because the line position changed. Not a big problem. // We might forbid slanting when de-noising. line_curr[ col * depth + 1 ] = new_pix; } } void picture::remove_noise( int row, int half_len, int noise_margin ) { if( restore( row, half_len ) ) return ; const unsigned char * line_prev = vidbuf + (row - noise_height_margin + 1) * width * depth; unsigned char * line_curr = vidbuf + (row - noise_height_margin + 2) * width * depth; const unsigned char * line_next = vidbuf + (row - noise_height_margin + 3) * width * depth; const int nb_neighbours = ( 2 * ( 2 * half_len + 1 ) ); int medians[nb_neighbours]; /// Takes into account the first component only. for( int col = half_len ; col < width - half_len; ++col ) { int curr_pix = line_curr[ col * depth ]; assert( ( curr_pix >= 0 ) && ( curr_pix <= 255 ) ); int pix_min = 255, pix_max = 0; for( int subcol = col - half_len, tmp, nghb_i = 0 ; subcol <= col + half_len ; ++subcol ) { int offset = subcol * depth ; tmp = line_prev[ offset ]; if( tmp < pix_min ) pix_min = tmp ; else if( tmp > pix_max ) pix_max = tmp ; medians[nghb_i++] = tmp; tmp = line_next[ offset ]; if( tmp < pix_min ) pix_min = tmp ; else if( tmp > pix_max ) pix_max = tmp ; medians[nghb_i++] = tmp; } // Maybe the pixel is between min and max. int thres_min = pix_min - noise_margin; if(thres_min < 0) thres_min = 0; assert(thres_min <= pix_min); int thres_max = pix_max + noise_margin; if(thres_max > 255 ) thres_max = 255; if(thres_max < pix_max) abort(); if( ( curr_pix >= thres_min ) && ( curr_pix <= thres_max ) ) continue ; assert( ( pix_max >= 0 ) && ( pix_max <= 255 ) ); std::sort( medians, medians + nb_neighbours ); int new_pix = medians[ nb_neighbours / 2 ]; assert( new_pix >= 0 ); /// Use this channel as a buffer. Beware that if we change the slant, // this component might not be restored // because the line position changed. Not a big problem. // We might forbid slanting when de-noising. line_curr[ col * depth + 1 ] = new_pix; } } int picbox::handle(int event) { if (!Fl::event_inside(this)) return 0; switch (event) { case FL_DND_ENTER: case FL_DND_LEAVE: case FL_DND_DRAG: case FL_DND_RELEASE: return 1; case FL_PASTE: break; default: return Fl_Box::handle(event); } // handle FL_PASTE string text = Fl::event_text(); // from dnd event "file:///home/dave/Photos/dave.jpeg" string::size_type p; if ((p = text.find("file://")) != string::npos) text.erase(0, p + strlen("file://")); if ((p = text.find('\r')) != string::npos) text.erase(p); if ((p = text.find('\n')) != string::npos) text.erase(p); struct stat st; if (stat(text.c_str(), &st) == -1 || !S_ISREG(st.st_mode)) return 0; extern void load_image(const char*); load_image(text.c_str()); return 1; } fldigi-3.21.80/src/widgets/Fl_Text_Display_mod.cxx0000664000175000017500000037604712313064025016735 00000000000000// // "$Id: Fl_Text_Display_mod.cxx 8808 2011-06-16 13:31:25Z manolo $" // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #include #include #include #include #include #include #include #include #include "Fl_Text_Buffer_mod.H" #include "Fl_Text_Display_mod.H" #undef min #undef max // Text area margins. Left & right margins should be at least 3 so that // there is some room for the overhanging parts of the cursor! const int Fl_Text_Display_mod::DEFAULT_TOP_MARGIN = 1; const int Fl_Text_Display_mod::DEFAULT_BOTTOM_MARGIN = 1; const int Fl_Text_Display_mod::DEFAULT_LEFT_MARGIN = 3; const int Fl_Text_Display_mod::DEFAULT_RIGHT_MARGIN = 3; //#define TOP_MARGIN 1 //#define BOTTOM_MARGIN 1 //#define LEFT_MARGIN 3 //#define RIGHT_MARGIN 3 #define NO_HINT -1 /* Masks for text drawing methods. These are or'd together to form an integer which describes what drawing calls to use to draw a string */ #define FILL_MASK 0x0100 #define SECONDARY_MASK 0x0200 #define PRIMARY_MASK 0x0400 #define HIGHLIGHT_MASK 0x0800 #define BG_ONLY_MASK 0x1000 #define TEXT_ONLY_MASK 0x2000 #define STYLE_LOOKUP_MASK 0xff /* Maximum displayable line length (how many characters will fit across the widest window). This amount of memory is temporarily allocated from the stack in the draw_vline() method for drawing strings */ #define MAX_DISP_LINE_LEN 1000 static int max( int i1, int i2 ); static int min( int i1, int i2 ); static int countlines( const char *string ); /* The variables below are used in a timer event to allow smooth scrolling of the text area when the pointer has left the area. */ static int scroll_direction = 0; static int scroll_amount = 0; static int scroll_y = 0; static int scroll_x = 0; // CET - FIXME #define TMPFONTWIDTH 6 /** \brief Creates a new text display widget. \param X, Y, W, H position and size of widget \param l label text, defaults to none */ Fl_Text_Display_mod::Fl_Text_Display_mod(int X, int Y, int W, int H, const char* l) : Fl_Group(X, Y, W, H, l) { int i; TOP_MARGIN = DEFAULT_TOP_MARGIN; BOTTOM_MARGIN = DEFAULT_BOTTOM_MARGIN; LEFT_MARGIN = DEFAULT_LEFT_MARGIN; RIGHT_MARGIN = DEFAULT_RIGHT_MARGIN; mMaxsize = 0; damage_range1_start = damage_range1_end = -1; damage_range2_start = damage_range2_end = -1; dragPos = dragging = 0; dragType = DRAG_CHAR; display_insert_position_hint = 0; shortcut_ = 0; color(FL_BACKGROUND2_COLOR, FL_SELECTION_COLOR); box(FL_DOWN_FRAME); textsize(FL_NORMAL_SIZE); textcolor(FL_FOREGROUND_COLOR); textfont(FL_HELVETICA); set_flag(SHORTCUT_LABEL); text_area.x = 0; text_area.y = 0; text_area.w = 0; text_area.h = 0; mVScrollBar = new Fl_Scrollbar(0,0,1,1); mVScrollBar->callback((Fl_Callback*)v_scrollbar_cb, this); mHScrollBar = new Fl_Scrollbar(0,0,1,1); mHScrollBar->callback((Fl_Callback*)h_scrollbar_cb, this); mHScrollBar->type(FL_HORIZONTAL); end(); scrollbar_width(Fl::scrollbar_size()); scrollbar_align(FL_ALIGN_BOTTOM_RIGHT); mCursorOn = 0; mCursorPos = 0; mCursorOldY = -100; mCursorToHint = NO_HINT; mCursorStyle = NORMAL_CURSOR; mCursorPreferredXPos = -1; mBuffer = 0; mFirstChar = 0; mLastChar = 0; mNBufferLines = 0; mTopLineNum = mTopLineNumHint = 1; mAbsTopLineNum = 1; mNeedAbsTopLineNum = 0; mHorizOffset = mHorizOffsetHint = 0; mCursor_color = FL_FOREGROUND_COLOR; mStyleBuffer = 0; mStyleTable = 0; mNStyles = 0; mNVisibleLines = 1; mLineStarts = new int[mNVisibleLines]; mLineStarts[0] = 0; for (i=1; iremove_modify_callback(buffer_modified_cb, this); // mBuffer->remove_predelete_callback(buffer_predelete_cb, this); // } if (mLineStarts) delete[] mLineStarts; } /** Attach a text buffer to display, replacing the current buffer (if any) \param buf attach this text buffer */ void Fl_Text_Display_mod::buffer( Fl_Text_Buffer_mod *buf ) { /* If the text display is already displaying a buffer, clear it off of the display and remove our callback from it */ if ( buf == mBuffer) return; if ( mBuffer != 0 ) { // we must provide a copy of the buffer that we are deleting! char *deletedText = mBuffer->text(); buffer_modified_cb( 0, 0, mBuffer->length(), 0, deletedText, this ); free(deletedText); mNBufferLines = 0; mBuffer->remove_modify_callback( buffer_modified_cb, this ); mBuffer->remove_predelete_callback( buffer_predelete_cb, this ); } /* Add the buffer to the display, and attach a callback to the buffer for receiving modification information when the buffer contents change */ mBuffer = buf; if (mBuffer) { mBuffer->add_modify_callback( buffer_modified_cb, this ); mBuffer->add_predelete_callback( buffer_predelete_cb, this ); /* Update the display */ buffer_modified_cb( 0, buf->length(), 0, 0, 0, this ); } /* Resize the widget to update the screen... */ resize(x(), y(), w(), h()); } /** \brief Attach (or remove) highlight information in text display and redisplay. Highlighting information consists of a style buffer which parallels the normal text buffer, but codes font and color information for the display; a style table which translates style buffer codes (indexed by buffer character - 'A') into fonts and colors; and a callback mechanism for as-needed highlighting, triggered by a style buffer entry of "unfinishedStyle". Style buffer can trigger additional redisplay during a normal buffer modification if the buffer contains a primary Fl_Text_Selection (see extendRangeForStyleMods for more information on this protocol). Style buffers, tables and their associated memory are managed by the caller. Styles are ranged from 65 ('A') to 126. \param styleBuffer this buffer works in parallel to the text buffer. For every character in the text buffer, the stye buffer has a byte at the same offset that contains an index into an array of possible styles. \param styleTable a list of styles indexed by the style buffer \param nStyles number of styles in the style table \param unfinishedStyle if this style is found, the callback below is called \param unfinishedHighlightCB if a character with an unfinished style is found, this callback will be called \param cbArg and optional argument for the callback above, usually a pointer to the Text Display. */ void Fl_Text_Display_mod::highlight_data(Fl_Text_Buffer_mod *styleBuffer, const Style_Table_Entry *styleTable, int nStyles, char unfinishedStyle, Unfinished_Style_Cb unfinishedHighlightCB, void *cbArg ) { mStyleBuffer = styleBuffer; mStyleTable = styleTable; mNStyles = nStyles; mUnfinishedStyle = unfinishedStyle; mUnfinishedHighlightCB = unfinishedHighlightCB; mHighlightCBArg = cbArg; mColumnScale = 0; mStyleBuffer->canUndo(0); damage(FL_DAMAGE_EXPOSE); } /** \brief Find the longest line of all visible lines. \return the width of the longest visible line in pixels */ int Fl_Text_Display_mod::longest_vline() const { int longest = 0; for (int i = 0; i < mNVisibleLines; i++) longest = max(longest, measure_vline(i)); return longest; } /** \brief Change the size of the displayed text area. Calling this function will trigger a recalculation of all lines visible and of all scrollbar sizes. \param X, Y, W, H new position and size of this widget */ void Fl_Text_Display_mod::resize(int X, int Y, int W, int H) { #ifdef DEBUG printf("Fl_Text_Display_mod::resize(X=%d, Y=%d, W=%d, H=%d)\n", X, Y, W, H); #endif // DEBUG const int oldWidth = w(); #ifdef DEBUG printf(" oldWidth=%d, mContinuousWrap=%d, mWrapMargin=%d\n", oldWidth, mContinuousWrap, mWrapMargin); #endif // DEBUG Fl_Widget::resize(X,Y,W,H); if (!buffer()) return; X += Fl::box_dx(box()); Y += Fl::box_dy(box()); W -= Fl::box_dw(box()); H -= Fl::box_dh(box()); text_area.x = X+LEFT_MARGIN; text_area.y = Y+TOP_MARGIN; text_area.w = W-LEFT_MARGIN-RIGHT_MARGIN; text_area.h = H-TOP_MARGIN-BOTTOM_MARGIN; int i; /* Find the new maximum font height for this text display */ for (i = 0, mMaxsize = fl_height(textfont(), textsize()); i < mNStyles; i++) mMaxsize = max(mMaxsize, fl_height(mStyleTable[i].font, mStyleTable[i].size)); // did we have scrollbars initially? unsigned int hscrollbarvisible = mHScrollBar->visible(); unsigned int vscrollbarvisible = mVScrollBar->visible(); // try without scrollbars first mVScrollBar->clear_visible(); mHScrollBar->clear_visible(); for (int again = 1; again;) { again = 0; /* In continuous wrap mode, a change in width affects the total number of lines in the buffer, and can leave the top line number incorrect, and the top character no longer pointing at a valid line start */ if (!mFastDisplay && mContinuousWrap && !mWrapMarginPix && W!=oldWidth) { int oldFirstChar = mFirstChar; mNBufferLines = count_lines(0, buffer()->length(), true); mFirstChar = line_start(mFirstChar); mTopLineNum = count_lines(0, mFirstChar, true)+1; absolute_top_line_number(oldFirstChar); #ifdef DEBUG printf(" mNBufferLines=%d\n", mNBufferLines); #endif // DEBUG } /* reallocate and update the line starts array, which may have changed size and / or contents. */ int nvlines = (text_area.h + mMaxsize - 1) / mMaxsize; if (nvlines < 1) nvlines = 1; if (mNVisibleLines != nvlines) { mNVisibleLines = nvlines; if (mLineStarts) delete[] mLineStarts; mLineStarts = new int [mNVisibleLines]; } calc_line_starts(0, mNVisibleLines); calc_last_char(); // figure the scrollbars if (scrollbar_width()) { /* Decide if the vertical scrollbar needs to be visible */ // always display vertical scroll bar // if (scrollbar_align() & (FL_ALIGN_LEFT|FL_ALIGN_RIGHT) && // mNBufferLines >= mNVisibleLines - 1) { mVScrollBar->set_visible(); if (scrollbar_align() & FL_ALIGN_LEFT) { text_area.x = X+scrollbar_width()+LEFT_MARGIN; text_area.w = W-scrollbar_width()-LEFT_MARGIN-RIGHT_MARGIN; mVScrollBar->resize(X, text_area.y-TOP_MARGIN, scrollbar_width(), text_area.h+TOP_MARGIN+BOTTOM_MARGIN); } else { text_area.x = X+LEFT_MARGIN; text_area.w = W-scrollbar_width()-LEFT_MARGIN-RIGHT_MARGIN; mVScrollBar->resize(X+W-scrollbar_width(), text_area.y-TOP_MARGIN, scrollbar_width(), text_area.h+TOP_MARGIN+BOTTOM_MARGIN); } } /* Decide if the horizontal scrollbar needs to be visible. If there is a vertical scrollbar, a horizontal is always created too. This is because the alternatives are unattractive: * Dynamically creating a horizontal scrollbar based on the currently visible lines is what the original nedit does, but it always wastes space for the scrollbar even when it's not used. Since the FLTK widget dynamically allocates the space for the scrollbar and rearranges the widget to make room for it, this would create a very visually displeasing "bounce" effect when the vertical scrollbar is dragged. Trust me, I tried it and it looks really bad. * The other alternative would be to keep track of what the longest line in the entire buffer is and base the scrollbar on that. I didn't do this because I didn't see any easy way to do that using the nedit code and this could involve a lengthy calculation for large buffers. If an efficient and non-costly way of doing this can be found, this might be a way to go. */ /* WAS: Suggestion: Try turning the horizontal scrollbar on when you first see a line that is too wide in the window, but then don't turn it off (ie mix both of your solutions). */ if (!mFastDisplay && !mContinuousWrap && scrollbar_align() & (FL_ALIGN_TOP|FL_ALIGN_BOTTOM) && (mVScrollBar->visible() || longest_vline() > text_area.w)) { if (!mHScrollBar->visible()) { mHScrollBar->set_visible(); again = 1; // loop again to see if we now need vert. & recalc sizes } if (scrollbar_align() & FL_ALIGN_TOP) { text_area.y = Y + scrollbar_width()+TOP_MARGIN; text_area.h = H - scrollbar_width()-TOP_MARGIN-BOTTOM_MARGIN; mHScrollBar->resize(text_area.x-LEFT_MARGIN, Y, text_area.w+LEFT_MARGIN+RIGHT_MARGIN, scrollbar_width()); } else { text_area.y = Y+TOP_MARGIN; text_area.h = H - scrollbar_width()-TOP_MARGIN-BOTTOM_MARGIN; mHScrollBar->resize(text_area.x-LEFT_MARGIN, Y+H-scrollbar_width(), text_area.w+LEFT_MARGIN+RIGHT_MARGIN, scrollbar_width()); } } } } // user request to change viewport if (mTopLineNumHint != mTopLineNum || mHorizOffsetHint != mHorizOffset) scroll_(mTopLineNumHint, mHorizOffsetHint); // everything will fit in the viewport if (mNBufferLines < mNVisibleLines || mBuffer == NULL || mBuffer->length() == 0) { scroll_(1, mHorizOffset); /* if empty lines become visible, there may be an opportunity to display more text by scrolling down */ } else { while ( mNVisibleLines>=2 && (mLineStarts[mNVisibleLines-2]==-1) && scroll_(mTopLineNum-1, mHorizOffset)) { } } // user request to display insert position if (display_insert_position_hint) display_insert(); // in case horizontal offset is now greater than longest line int maxhoffset = max(0, longest_vline()-text_area.w); if (mHorizOffset > maxhoffset) scroll_(mTopLineNumHint, maxhoffset); mTopLineNumHint = mTopLineNum; mHorizOffsetHint = mHorizOffset; display_insert_position_hint = 0; if ((!mFastDisplay && mContinuousWrap) || hscrollbarvisible != mHScrollBar->visible() || vscrollbarvisible != mVScrollBar->visible()) redraw(); update_v_scrollbar(); update_h_scrollbar(); } /** \brief Refresh a rectangle of the text display. \param left, top are in coordinates of the text drawing window. \param width, height size in pixels */ void Fl_Text_Display_mod::draw_text( int left, int top, int width, int height ) { int fontHeight, firstLine, lastLine, line; /* find the line number range of the display */ fontHeight = mMaxsize ? mMaxsize : textsize_; firstLine = ( top - text_area.y - fontHeight + 1 ) / fontHeight; lastLine = ( top + height - text_area.y ) / fontHeight + 1; fl_push_clip( left, top, width, height ); /* draw the lines */ for ( line = firstLine; line <= lastLine; line++ ) draw_vline( line, left, left + width, 0, INT_MAX ); /* draw the line numbers if exposed area includes them */ if (mLineNumWidth != 0 && left <= mLineNumLeft + mLineNumWidth) draw_line_numbers(false); fl_pop_clip(); } /** \brief Marks text from start to end as needing a redraw. This function will trigger a damage event and later a redraw of parts of the widget. \param startpos index of first character needing redraw \param endpos index after last character needing redraw */ void Fl_Text_Display_mod::redisplay_range(int startpos, int endpos) { IS_UTF8_ALIGNED2(buffer(), startpos) IS_UTF8_ALIGNED2(buffer(), endpos) if (damage_range1_start == -1 && damage_range1_end == -1) { damage_range1_start = startpos; damage_range1_end = endpos; } else if ((startpos >= damage_range1_start && startpos <= damage_range1_end) || (endpos >= damage_range1_start && endpos <= damage_range1_end)) { damage_range1_start = min(damage_range1_start, startpos); damage_range1_end = max(damage_range1_end, endpos); } else if (damage_range2_start == -1 && damage_range2_end == -1) { damage_range2_start = startpos; damage_range2_end = endpos; } else { damage_range2_start = min(damage_range2_start, startpos); damage_range2_end = max(damage_range2_end, endpos); } damage(FL_DAMAGE_SCROLL); } /** \brief Draw a range of text. Refresh all of the text between buffer positions \p startpos and \p endpos not including the character at the position \p endpos. If \p endpos points beyond the end of the buffer, refresh the whole display after \p startpos, including blank lines which are not technically part of any range of characters. \param startpos index of first character to draw \param endpos index after last character to draw */ void Fl_Text_Display_mod::draw_range(int startpos, int endpos) { startpos = buffer()->utf8_align(startpos); endpos = buffer()->utf8_align(endpos); int i, startLine, lastLine, startIndex, endIndex; /* If the range is outside of the displayed text, just return */ if ( endpos < mFirstChar || ( startpos > mLastChar && !empty_vlines() ) ) return; /* Clean up the starting and ending values */ if ( startpos < 0 ) startpos = 0; if ( startpos > mBuffer->length() ) startpos = mBuffer->length(); if ( endpos < 0 ) endpos = 0; if ( endpos > mBuffer->length() ) endpos = mBuffer->length(); /* Get the starting and ending lines */ if ( startpos < mFirstChar ) startpos = mFirstChar; if ( !position_to_line( startpos, &startLine ) ) startLine = mNVisibleLines - 1; if ( endpos >= mLastChar ) { lastLine = mNVisibleLines - 1; } else { if ( !position_to_line( endpos, &lastLine ) ) { /* shouldn't happen */ lastLine = mNVisibleLines - 1; } } /* Get the starting and ending positions within the lines */ startIndex = mLineStarts[ startLine ] == -1 ? 0 : startpos - mLineStarts[ startLine ]; if ( endpos >= mLastChar ) endIndex = INT_MAX; else if ( mLineStarts[ lastLine ] == -1 ) endIndex = 0; else endIndex = endpos - mLineStarts[ lastLine ]; /* If the starting and ending lines are the same, redisplay the single line between "start" and "end" */ if ( startLine == lastLine ) { draw_vline( startLine, 0, INT_MAX, startIndex, endIndex ); return; } /* Redisplay the first line from "start" */ draw_vline( startLine, 0, INT_MAX, startIndex, INT_MAX ); /* Redisplay the lines in between at their full width */ for ( i = startLine + 1; i < lastLine; i++ ) draw_vline( i, 0, INT_MAX, 0, INT_MAX ); /* Redisplay the last line to "end" */ draw_vline( lastLine, 0, INT_MAX, 0, endIndex ); } /** \brief Sets the position of the text insertion cursor for text display. Move the insertion cursor in front of the character at \p newPos. This function may trigger a redraw. \param newPos new caret position */ void Fl_Text_Display_mod::insert_position( int newPos ) { IS_UTF8_ALIGNED2(buffer(), newPos) /* make sure new position is ok, do nothing if it hasn't changed */ if ( newPos == mCursorPos ) return; if ( newPos < 0 ) newPos = 0; if ( newPos > mBuffer->length() ) newPos = mBuffer->length(); /* cursor movement cancels vertical cursor motion column */ mCursorPreferredXPos = -1; /* erase the cursor at its previous position */ redisplay_range(buffer()->prev_char_clipped(mCursorPos), buffer()->next_char(mCursorPos)); mCursorPos = newPos; /* draw cursor at its new position */ redisplay_range(buffer()->prev_char_clipped(mCursorPos), buffer()->next_char(mCursorPos)); } /** \brief Shows the text cursor. This function may trigger a redraw. \param b show(1) or hide(0) the text cursor (caret). */ void Fl_Text_Display_mod::show_cursor(int b) { mCursorOn = b; redisplay_range(buffer()->prev_char_clipped(mCursorPos), buffer()->next_char(mCursorPos)); } /** \brief Sets the text cursor style. Sets the text cursor style to one of the following: \li Fl_Text_Display_mod::NORMAL_CURSOR - Shows an I beam. \li Fl_Text_Display_mod::CARET_CURSOR - Shows a caret under the text. \li Fl_Text_Display_mod::DIM_CURSOR - Shows a dimmed I beam. \li Fl_Text_Display_mod::BLOCK_CURSOR - Shows an unfilled box around the current character. \li Fl_Text_Display_mod::HEAVY_CURSOR - Shows a thick I beam. This call also switches the cursor on and may trigger a redraw. \param style new cursor style */ void Fl_Text_Display_mod::cursor_style(int style) { mCursorStyle = style; if (mCursorOn) show_cursor(); } /** \brief Set the new text wrap mode. If \p wrap mode is not zero, this call enables automatic word wrapping at column \p wrapMargin. Word-wrapping does not change the text buffer itself, only the way the text is displayed. Different Text Displays can have different wrap modes, even if they share the same Text Buffer. \param wrap new wrap mode is WRAP_NONE (don't wrap text at all), WRAP_AT_COLUMN (wrap text at the given text column), WRAP_AT_PIXEL (wrap text at a pixel position), or WRAP_AT_BOUNDS (wrap text so that it fits into the widget width) \param wrapMargin in WRAP_AT_COLUMN mode, text will wrap at the n'th character. For variable width fonts, an average character width is calculated. The column width is calculated using the current textfont or the first style when this function is called. If the font size changes, this function must be called again. In WRAP_AT_PIXEL mode, this is the pixel position. \todo we need new wrap modes to wrap at the window edge and based on pixel width or average character width. */ void Fl_Text_Display_mod::wrap_mode(int wrap, int wrapMargin) { switch (wrap) { case WRAP_NONE: mWrapMarginPix = 0; mContinuousWrap = 0; break; case WRAP_AT_COLUMN: default: mWrapMarginPix = int(col_to_x(wrapMargin)); mContinuousWrap = 1; break; case WRAP_AT_PIXEL: mWrapMarginPix = wrapMargin; mContinuousWrap = 1; break; case WRAP_AT_BOUNDS: mWrapMarginPix = 0; mContinuousWrap = 1; break; } if (buffer()) { /* wrapping can change the total number of lines, re-count */ mNBufferLines = count_lines(0, buffer()->length(), true); /* changing wrap margins or changing from wrapped mode to non-wrapped can leave the character at the top no longer at a line start, and/or change the line number */ mFirstChar = line_start(mFirstChar); mTopLineNum = count_lines(0, mFirstChar, true) + 1; reset_absolute_top_line_number(); /* update the line starts array */ calc_line_starts(0, mNVisibleLines); calc_last_char(); } else { // No buffer, so just clear the state info for later... mNBufferLines = 0; mFirstChar = 0; mTopLineNum = 1; mAbsTopLineNum = 0; } resize(x(), y(), w(), h()); } /** \brief Inserts "text" at the current cursor location. This has the same effect as inserting the text into the buffer using BufInsert and then moving the insert position after the newly inserted text, except that it's optimized to do less redrawing. \param text new text in UTF-8 encoding. */ void Fl_Text_Display_mod::insert(const char* text) { IS_UTF8_ALIGNED2(buffer(), mCursorPos) IS_UTF8_ALIGNED(text) int pos = mCursorPos; mCursorToHint = pos + strlen( text ); mBuffer->insert( pos, text ); mCursorToHint = NO_HINT; } /** \brief Replaces text at the current insert position. \param text new text in UTF-8 encoding \todo Unicode? Find out exactly what we do here and simplify. */ void Fl_Text_Display_mod::overstrike(const char* text) { IS_UTF8_ALIGNED2(buffer(), mCursorPos) IS_UTF8_ALIGNED(text) int startPos = mCursorPos; Fl_Text_Buffer_mod *buf = mBuffer; int lineStart = buf->line_start( startPos ); int textLen = strlen( text ); int i, p, endPos, indent, startIndent, endIndent; const char *c; unsigned int ch; char *paddedText = NULL; /* determine how many displayed character positions are covered */ startIndent = mBuffer->count_displayed_characters( lineStart, startPos ); indent = startIndent; for ( c = text; *c != '\0'; c += fl_utf8len1(*c) ) indent++; endIndent = indent; /* find which characters to remove, and if necessary generate additional padding to make up for removed control characters at the end */ indent = startIndent; for ( p = startPos; ; p=buffer()->next_char(p) ) { if ( p == buf->length() ) break; ch = buf->char_at( p ); if ( ch == '\n' ) break; indent++; if ( indent == endIndent ) { p++; break; } else if ( indent > endIndent ) { if ( ch != '\t' ) { p++; paddedText = new char [ textLen + FL_TEXT_MAX_EXP_CHAR_LEN + 1 ]; strcpy( paddedText, text ); for ( i = 0; i < indent - endIndent; i++ ) paddedText[ textLen + i ] = ' '; paddedText[ textLen + i ] = '\0'; } break; } } endPos = p; mCursorToHint = startPos + textLen; buf->replace( startPos, endPos, paddedText == NULL ? text : paddedText ); mCursorToHint = NO_HINT; if ( paddedText != NULL ) delete [] paddedText; } /** \brief Convert a character index into a pixel position. Translate a buffer text position to the XY location where the top left of the cursor would be positioned to point to that character. Returns 0 if the position is not displayed because it is \e \b vertically out of view. If the position is horizontally out of view, returns the X coordinate where the position would be if it were visible. \param pos character index \param[out] X, Y pixel position of character on screen \return 0 if character vertically out of view, X position otherwise */ int Fl_Text_Display_mod::position_to_xy( int pos, int* X, int* Y ) const { IS_UTF8_ALIGNED2(buffer(), pos) int lineStartPos, fontHeight;//, lineLen; int visLineNum; /* If position is not displayed, return false */ if (pos < mFirstChar || (pos > mLastChar && !empty_vlines())) { return 0; } /* Calculate Y coordinate */ if (!position_to_line(pos, &visLineNum)) { return 0; } if (visLineNum < 0 || visLineNum > mNBufferLines) { return 0; } fontHeight = mMaxsize; *Y = text_area.y + visLineNum * fontHeight; /* Get the text, length, and buffer position of the line. If the position is beyond the end of the buffer and should be at the first position on the first empty line, don't try to get or scan the text */ lineStartPos = mLineStarts[visLineNum]; if ( lineStartPos == -1 ) { *X = text_area.x - mHorizOffset; return 1; } // lineLen = vline_length( visLineNum ); *X = text_area.x + handle_vline(GET_WIDTH, lineStartPos, pos-lineStartPos, 0, 0, 0, 0, 0, 0) - mHorizOffset; return 1; } /** \brief Find the line and column number of position \p pos. This only works for displayed lines. If the line is not displayed, the function returns 0 (without the mLineStarts array it could turn in to very long calculation involving scanning large amounts of text in the buffer). If continuous wrap mode is on, returns the absolute line number (as opposed to the wrapped line number which is used for scrolling). \param pos character index \param[out] lineNum absolute (unwrapped) line number \param[out] column character offset to the beginning of the line \return 0 if \p pos is off screen, line number otherwise \todo a column number makes little sense in the UTF-8/variable font width environment. We will have to further define what exactly we want to return. Please check the functions that call this particular function. */ int Fl_Text_Display_mod::position_to_linecol( int pos, int* lineNum, int* column ) const { IS_UTF8_ALIGNED2(buffer(), pos) int retVal; /* In continuous wrap mode, the absolute (non-wrapped) line count is maintained separately, as needed. Only return it if we're actually keeping track of it and pos is in the displayed text */ if (!mFastDisplay && mContinuousWrap) { if (!maintaining_absolute_top_line_number() || pos < mFirstChar || pos > mLastChar) return 0; *lineNum = mAbsTopLineNum + buffer()->count_lines(mFirstChar, pos); *column = buffer()->count_displayed_characters(buffer()->line_start(pos), pos); return 1; } retVal = position_to_line( pos, lineNum ); if ( retVal ) { *column = mBuffer->count_displayed_characters( mLineStarts[ *lineNum ], pos ); *lineNum += mTopLineNum; } return retVal; } /** \brief Check if a pixel position is within the primary selection. \param X, Y pixel position to test \return 1 if position (X, Y) is inside of the primary Fl_Text_Selection */ int Fl_Text_Display_mod::in_selection( int X, int Y ) const { int pos = xy_to_position( X, Y, CHARACTER_POS ); IS_UTF8_ALIGNED2(buffer(), pos) Fl_Text_Buffer_mod *buf = mBuffer; return buf->primary_selection()->includes(pos); } /** \brief Nobody knows what this function does. Correct a column number based on an unconstrained position (as returned by TextDXYToUnconstrainedPosition) to be relative to the last actual newline in the buffer before the row and column position given, rather than the last line start created by line wrapping. This is an adapter for rectangular selections and code written before continuous wrap mode, which thinks that the unconstrained column is the number of characters from the last newline. Obviously this is time consuming, because it invloves character re-counting. \param row \param column \return something unknown \todo What does this do and how is it useful? Column numbers mean little in this context. Which functions depend on this one? \todo Unicode? */ int Fl_Text_Display_mod::wrapped_column(int row, int column) const { int lineStart, dispLineStart; if (mFastDisplay || !mContinuousWrap || row < 0 || row > mNVisibleLines) return column; dispLineStart = mLineStarts[row]; if (dispLineStart == -1) return column; lineStart = buffer()->line_start(dispLineStart); return column + buffer()->count_displayed_characters(lineStart, dispLineStart); } /** \brief Nobody knows what this function does. Correct a row number from an unconstrained position (as returned by TextDXYToUnconstrainedPosition) to a straight number of newlines from the top line of the display. Because rectangular selections are based on newlines, rather than display wrapping, and anywhere a rectangular selection needs a row, it needs it in terms of un-wrapped lines. \param row \return something unknown \todo What does this do and how is it useful? Column numbers mean little in this context. Which functions depend on this one? */ int Fl_Text_Display_mod::wrapped_row(int row) const { if (mFastDisplay || !mContinuousWrap || row < 0 || row > mNVisibleLines) return row; return buffer()->count_lines(mFirstChar, mLineStarts[row]); } /** \brief Scroll the display to bring insertion cursor into view. Note: it would be nice to be able to do this without counting lines twice (scroll_() counts them too) and/or to count from the most efficient starting point, but the efficiency of this routine is not as important to the overall performance of the text display. \todo Unicode? */ void Fl_Text_Display_mod::display_insert() { int hOffset, topLine, X, Y; hOffset = mHorizOffset; topLine = mTopLineNum; if (insert_position() < mFirstChar) { topLine -= count_lines(insert_position(), mFirstChar, false); } else if (mNVisibleLines>=2 && mLineStarts[mNVisibleLines-2] != -1) { int lastChar = line_end(mLineStarts[mNVisibleLines-2],true); if (insert_position() >= lastChar) topLine += count_lines(lastChar - (wrap_uses_character(mLastChar) ? 0 : 1), insert_position(), false); } /* Find the new setting for horizontal offset (this is a bit ungraceful). If the line is visible, just use PositionToXY to get the position to scroll to, otherwise, do the vertical scrolling first, then the horizontal */ if (!position_to_xy( mCursorPos, &X, &Y )) { scroll_(topLine, hOffset); if (!position_to_xy( mCursorPos, &X, &Y )) { #ifdef DEBUG printf ("*** display_insert/position_to_xy # GIVE UP !\n"); fflush(stdout); #endif // DEBUG return; /* Give up, it's not worth it (but why does it fail?) */ } } if (X > text_area.x + text_area.w) hOffset += X-(text_area.x + text_area.w); else if (X < text_area.x) hOffset += X-text_area.x; /* Do the scroll */ if (topLine != mTopLineNum || hOffset != mHorizOffset) scroll_(topLine, hOffset); } /** \brief Scrolls the text buffer to show the current insert position. This function triggers a complete recalculation, ending in a call to Fl_Text_Display_mod::display_insert() */ void Fl_Text_Display_mod::show_insert_position() { display_insert_position_hint = 1; resize(x(), y(), w(), h()); } /* Cursor movement functions */ /** \brief Moves the current insert position right one character. \return 1 if the cursor moved, 0 if the end of the text was reached */ int Fl_Text_Display_mod::move_right() { if ( mCursorPos >= mBuffer->length() ) return 0; int p = insert_position(); int q = buffer()->next_char(p); insert_position(q); return 1; } /** \brief Moves the current insert position left one character. \return 1 if the cursor moved, 0 if the beginning of the text was reached */ int Fl_Text_Display_mod::move_left() { if ( mCursorPos <= 0 ) return 0; int p = insert_position(); int q = buffer()->prev_char_clipped(p); insert_position(q); return 1; } /** \brief Moves the current insert position up one line. \return 1 if the cursor moved, 0 if the beginning of the text was reached */ int Fl_Text_Display_mod::move_up() { int lineStartPos, xPos, prevLineStartPos, newPos, visLineNum; /* Find the position of the start of the line. Use the line starts array if possible */ if ( position_to_line( mCursorPos, &visLineNum ) ) lineStartPos = mLineStarts[ visLineNum ]; else { lineStartPos = line_start( mCursorPos ); visLineNum = -1; } if ( lineStartPos == 0 ) return 0; /* Decide what column to move to, if there's a preferred column use that */ if (mCursorPreferredXPos >= 0) xPos = mCursorPreferredXPos; else xPos = handle_vline(GET_WIDTH, lineStartPos, mCursorPos-lineStartPos, 0, 0, 0, 0, 0, INT_MAX); /* count forward from the start of the previous line to reach the column */ if ( visLineNum != -1 && visLineNum != 0 ) prevLineStartPos = mLineStarts[ visLineNum - 1 ]; else prevLineStartPos = rewind_lines( lineStartPos, 1 ); int lineEnd = line_end(prevLineStartPos, true); newPos = handle_vline(FIND_INDEX_FROM_ZERO, prevLineStartPos, lineEnd-prevLineStartPos, 0, 0, 0, 0, 0, xPos); /* move the cursor */ insert_position( newPos ); /* if a preferred column wasn't aleady established, establish it */ mCursorPreferredXPos = xPos; return 1; } /** \brief Moves the current insert position down one line. \return 1 if the cursor moved, 0 if the beginning of the text was reached */ int Fl_Text_Display_mod::move_down() { int lineStartPos, xPos, newPos, visLineNum; if ( mCursorPos == mBuffer->length() ) return 0; if ( position_to_line( mCursorPos, &visLineNum ) ) lineStartPos = mLineStarts[ visLineNum ]; else { lineStartPos = line_start( mCursorPos ); visLineNum = -1; } if (mCursorPreferredXPos >= 0) { xPos = mCursorPreferredXPos; } else { xPos = handle_vline(GET_WIDTH, lineStartPos, mCursorPos-lineStartPos, 0, 0, 0, 0, 0, INT_MAX); } int nextLineStartPos = skip_lines( lineStartPos, 1, true ); int lineEnd = line_end(nextLineStartPos, true); newPos = handle_vline(FIND_INDEX_FROM_ZERO, nextLineStartPos, lineEnd-nextLineStartPos, 0, 0, 0, 0, 0, xPos); insert_position( newPos ); mCursorPreferredXPos = xPos; return 1; } /** \brief Count the number of lines between two positions. Same as BufCountLines, but takes into account wrapping if wrapping is turned on. If the caller knows that \p startPos is at a line start, it can pass \p startPosIsLineStart as True to make the call more efficient by avoiding the additional step of scanning back to the last newline. \param startPos index to first character \param endPos index after last character \param startPosIsLineStart avoid scanning back to the line start \return number of lines */ int Fl_Text_Display_mod::count_lines(int startPos, int endPos, bool startPosIsLineStart) const { IS_UTF8_ALIGNED2(buffer(), startPos) IS_UTF8_ALIGNED2(buffer(), endPos) int retLines, retPos, retLineStart, retLineEnd; #ifdef DEBUG printf("Fl_Text_Display_mod::count_lines(startPos=%d, endPos=%d, startPosIsLineStart=%d\n", startPos, endPos, startPosIsLineStart); #endif // DEBUG /* If we're not wrapping use simple (and more efficient) BufCountLines */ if (mFastDisplay || !mContinuousWrap) return buffer()->count_lines(startPos, endPos); wrapped_line_counter(buffer(), startPos, endPos, INT_MAX, startPosIsLineStart, 0, &retPos, &retLines, &retLineStart, &retLineEnd); #ifdef DEBUG printf(" # after WLC: retPos=%d, retLines=%d, retLineStart=%d, retLineEnd=%d\n", retPos, retLines, retLineStart, retLineEnd); #endif // DEBUG return retLines; } /** \brief Skip a number of lines forward. Same as BufCountForwardNLines, but takes into account line breaks when wrapping is turned on. If the caller knows that startPos is at a line start, it can pass "startPosIsLineStart" as True to make the call more efficient by avoiding the additional step of scanning back to the last newline. \param startPos index to starting character \param nLines number of lines to skip ahead \param startPosIsLineStart avoid scanning back to the line start \return new position as index */ int Fl_Text_Display_mod::skip_lines(int startPos, int nLines, bool startPosIsLineStart) { IS_UTF8_ALIGNED2(buffer(), startPos) int retLines, retPos, retLineStart, retLineEnd; /* if we're not wrapping use more efficient BufCountForwardNLines */ if (mFastDisplay || !mContinuousWrap) return buffer()->skip_lines(startPos, nLines); /* wrappedLineCounter can't handle the 0 lines case */ if (nLines == 0) return startPos; /* use the common line counting routine to count forward */ wrapped_line_counter(buffer(), startPos, buffer()->length(), nLines, startPosIsLineStart, 0, &retPos, &retLines, &retLineStart, &retLineEnd); IS_UTF8_ALIGNED2(buffer(), retPos) return retPos; } /** \brief Returns the end of a line. Same as BufEndOfLine, but takes into account line breaks when wrapping is turned on. If the caller knows that \p startPos is at a line start, it can pass "startPosIsLineStart" as True to make the call more efficient by avoiding the additional step of scanning back to the last newline. Note that the definition of the end of a line is less clear when continuous wrap is on. With continuous wrap off, it's just a pointer to the newline that ends the line. When it's on, it's the character beyond the last \b displayable character on the line, where a whitespace character which has been "converted" to a newline for wrapping is not considered displayable. Also note that a line can be wrapped at a non-whitespace character if the line had no whitespace. In this case, this routine returns a pointer to the start of the next line. This is also consistent with the model used by visLineLength. \param startPos index to starting character \param startPosIsLineStart avoid scanning back to the line start \return new position as index */ int Fl_Text_Display_mod::line_end(int startPos, bool startPosIsLineStart) const { IS_UTF8_ALIGNED2(buffer(), startPos) int retLines, retPos, retLineStart, retLineEnd; /* If we're not wrapping use more efficient BufEndOfLine */ if (mFastDisplay || !mContinuousWrap) return buffer()->line_end(startPos); if (startPos == buffer()->length()) return startPos; wrapped_line_counter(buffer(), startPos, buffer()->length(), 1, startPosIsLineStart, 0, &retPos, &retLines, &retLineStart, &retLineEnd); IS_UTF8_ALIGNED2(buffer(), retLineEnd) return retLineEnd; } /** \brief Return the beginning of a line. Same as BufStartOfLine, but returns the character after last wrap point rather than the last newline. \param pos index to starting character \return new position as index */ int Fl_Text_Display_mod::line_start(int pos) const { IS_UTF8_ALIGNED2(buffer(), pos) int retLines, retPos, retLineStart, retLineEnd; /* If we're not wrapping, use the more efficient BufStartOfLine */ if (mFastDisplay || !mContinuousWrap) return buffer()->line_start(pos); wrapped_line_counter(buffer(), buffer()->line_start(pos), pos, INT_MAX, true, 0, &retPos, &retLines, &retLineStart, &retLineEnd); IS_UTF8_ALIGNED2(buffer(), retLineStart) return retLineStart; } /** \brief Skip a number of lines back. Same as BufCountBackwardNLines, but takes into account line breaks when wrapping is turned on. \param startPos index to starting character \param nLines number of lines to skip back \return new position as index */ int Fl_Text_Display_mod::rewind_lines(int startPos, int nLines) { IS_UTF8_ALIGNED2(buffer(), startPos) Fl_Text_Buffer_mod *buf = buffer(); int pos, lineStart, retLines, retPos, retLineStart, retLineEnd; /* If we're not wrapping, use the more efficient BufCountBackwardNLines */ if (mFastDisplay || !mContinuousWrap) return buf->rewind_lines(startPos, nLines); pos = startPos; for (;;) { lineStart = buf->line_start(pos); wrapped_line_counter(buf, lineStart, pos, INT_MAX, true, 0, &retPos, &retLines, &retLineStart, &retLineEnd, false); if (retLines > nLines) return skip_lines(lineStart, retLines-nLines, true); nLines -= retLines; pos = lineStart - 1; if (pos < 0) return 0; nLines -= 1; } } static inline int fl_isseparator(unsigned int c) { // FIXME: this does not take UCS-4 encoding into account return c != '$' && c != '_' && (isspace(c) || ispunct(c)); } /** \brief Moves the current insert position right one word. */ void Fl_Text_Display_mod::next_word() { int pos = insert_position(); while (pos < buffer()->length() && !fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->next_char(pos); } while (pos < buffer()->length() && fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->next_char(pos); } insert_position( pos ); } /** \brief Moves the current insert position left one word. */ void Fl_Text_Display_mod::previous_word() { int pos = insert_position(); if (pos==0) return; pos = buffer()->prev_char(pos); while (pos && fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->prev_char(pos); } while (pos && !fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->prev_char(pos); } if (fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->next_char(pos); } insert_position( pos ); } /** \brief This is called before any characters are deleted. Callback attached to the text buffer to receive delete information before the modifications are actually made. \param pos starting index of deletion \param nDeleted number of bytes we will delete (must be UTF-8 aligned!) \param cbArg "this" pointer for static callback function */ void Fl_Text_Display_mod::buffer_predelete_cb(int pos, int nDeleted, void *cbArg) { Fl_Text_Display_mod *textD = (Fl_Text_Display_mod *)cbArg; if (textD->mContinuousWrap && !textD->mFastDisplay) { /* Note: we must perform this measurement, even if there is not a single character deleted; the number of "deleted" lines is the number of visual lines spanned by the real line in which the modification takes place. Also, a modification of the tab distance requires the same kind of calculations in advance, even if the font width is "fixed", because when the width of the tab characters changes, the layout of the text may be completely different. */ IS_UTF8_ALIGNED2(textD->buffer(), pos) textD->measure_deleted_lines(pos, nDeleted); } else { textD->mSuppressResync = 0; /* Probably not needed, but just in case */ } } /** \brief This is called whenever the buffer is modified. Callback attached to the text buffer to receive modification information \param pos starting index of modification \param nInserted number of bytes we inserted (must be UTF-8 aligned!) \param nDeleted number of bytes deleted (must be UTF-8 aligned!) \param nRestyled ?? \param deletedText this is what was removed, must not be NULL if nDeleted is set \param cbArg "this" pointer for static callback function */ void Fl_Text_Display_mod::buffer_modified_cb( int pos, int nInserted, int nDeleted, int nRestyled, const char *deletedText, void *cbArg ) { int linesInserted, linesDeleted, startDispPos, endDispPos; Fl_Text_Display_mod *textD = ( Fl_Text_Display_mod * ) cbArg; Fl_Text_Buffer_mod *buf = textD->mBuffer; int oldFirstChar = textD->mFirstChar; int scrolled, origCursorPos = textD->mCursorPos; int wrapModStart = 0, wrapModEnd = 0; IS_UTF8_ALIGNED2(buf, pos) IS_UTF8_ALIGNED2(buf, oldFirstChar) /* buffer modification cancels vertical cursor motion column */ if ( nInserted != 0 || nDeleted != 0 ) textD->mCursorPreferredXPos = -1; /* Count the number of lines inserted and deleted, and in the case of continuous wrap mode, how much has changed */ if (textD->mContinuousWrap && !textD->mFastDisplay) { textD->find_wrap_range(deletedText, pos, nInserted, nDeleted, &wrapModStart, &wrapModEnd, &linesInserted, &linesDeleted); } else { linesInserted = nInserted == 0 ? 0 : buf->count_lines( pos, pos + nInserted ); linesDeleted = nDeleted == 0 ? 0 : countlines( deletedText ); } /* Update the line starts and mTopLineNum */ if ( nInserted != 0 || nDeleted != 0 ) { if (textD->mContinuousWrap && !textD->mFastDisplay) { textD->update_line_starts( wrapModStart, wrapModEnd-wrapModStart, nDeleted + pos-wrapModStart + (wrapModEnd-(pos+nInserted)), linesInserted, linesDeleted, &scrolled ); } else { textD->update_line_starts( pos, nInserted, nDeleted, linesInserted, linesDeleted, &scrolled ); } } else scrolled = 0; /* If we're counting non-wrapped lines as well, maintain the absolute (non-wrapped) line number of the text displayed */ if (textD->maintaining_absolute_top_line_number() && (nInserted != 0 || nDeleted != 0)) { if (deletedText && (pos + nDeleted < oldFirstChar)) textD->mAbsTopLineNum += buf->count_lines(pos, pos + nInserted) - countlines(deletedText); else if (pos < oldFirstChar) textD->reset_absolute_top_line_number(); } /* Update the line count for the whole buffer */ textD->mNBufferLines += linesInserted - linesDeleted; /* Update the cursor position */ if ( textD->mCursorToHint != NO_HINT ) { textD->mCursorPos = textD->mCursorToHint; textD->mCursorToHint = NO_HINT; } else if ( textD->mCursorPos > pos ) { if ( textD->mCursorPos < pos + nDeleted ) textD->mCursorPos = pos; else textD->mCursorPos += nInserted - nDeleted; } // refigure scrollbars & stuff textD->resize(textD->x(), textD->y(), textD->w(), textD->h()); // don't need to do anything else if not visible? if (!textD->visible_r()) return; /* If the changes caused scrolling, re-paint everything and we're done. */ if ( scrolled ) { textD->damage(FL_DAMAGE_EXPOSE); if ( textD->mStyleBuffer ) /* See comments in extendRangeForStyleMods */ textD->mStyleBuffer->primary_selection()->selected(0); return; } /* If the changes didn't cause scrolling, decide the range of characters that need to be re-painted. Also if the cursor position moved, be sure that the redisplay range covers the old cursor position so the old cursor gets erased, and erase the bits of the cursor which extend beyond the left and right edges of the text. */ startDispPos = (textD->mContinuousWrap && !textD->mFastDisplay) ? wrapModStart : pos; IS_UTF8_ALIGNED2(buf, startDispPos) if ( origCursorPos == startDispPos && textD->mCursorPos != startDispPos ) startDispPos = min( startDispPos, buf->prev_char_clipped(origCursorPos) ); IS_UTF8_ALIGNED2(buf, startDispPos) if ( linesInserted == linesDeleted ) { if ( nInserted == 0 && nDeleted == 0 ) endDispPos = pos + nRestyled; else { endDispPos = textD->mContinuousWrap ? wrapModEnd : buf->line_end( pos + nInserted ) + 1; if (textD->mContinuousWrap && !textD->mFastDisplay) endDispPos = wrapModEnd; else endDispPos = buf->next_char(buf->line_end( pos + nInserted )); // CET - FIXME if ( origCursorPos >= startDispPos && // ( origCursorPos <= endDispPos || endDispPos == buf->length() ) ) } if (linesInserted > 1) textD->draw_line_numbers(false); } else { endDispPos = buf->next_char(textD->mLastChar); // CET - FIXME if ( origCursorPos >= pos ) /* If more than one line is inserted/deleted, a line break may have been inserted or removed in between, and the line numbers may have changed. If only one line is altered, line numbers cannot be affected (the insertion or removal of a line break always results in at least two lines being redrawn). */ textD->draw_line_numbers(false); } IS_UTF8_ALIGNED2(buf, startDispPos) IS_UTF8_ALIGNED2(buf, endDispPos) /* If there is a style buffer, check if the modification caused additional changes that need to be redisplayed. (Redisplaying separately would cause double-redraw on almost every modification involving styled text). Extend the redraw range to incorporate style changes */ if ( textD->mStyleBuffer ) textD->extend_range_for_styles( &startDispPos, &endDispPos ); IS_UTF8_ALIGNED2(buf, startDispPos) IS_UTF8_ALIGNED2(buf, endDispPos) /* Redisplay computed range */ textD->redisplay_range( startDispPos, endDispPos ); } /** \brief Line numbering stuff, currently unused. In continuous wrap mode, internal line numbers are calculated after wrapping. A separate non-wrapped line count is maintained when line numbering is turned on. There is some performance cost to maintaining this line count, so normally absolute line numbers are not tracked if line numbering is off. This routine allows callers to specify that they still want this line count maintained (for use via TextDPosToLineAndCol). More specifically, this allows the line number reported in the statistics line to be calibrated in absolute lines, rather than post-wrapped lines. */ void Fl_Text_Display_mod::maintain_absolute_top_line_number(int state) { mNeedAbsTopLineNum = state; reset_absolute_top_line_number(); } /** \brief Line numbering stuff, currently unused. Returns the absolute (non-wrapped) line number of the first line displayed. Returns 0 if the absolute top line number is not being maintained. */ int Fl_Text_Display_mod::get_absolute_top_line_number() const { if (mFastDisplay || !mContinuousWrap) return mTopLineNum; if (maintaining_absolute_top_line_number()) return mAbsTopLineNum; return 0; } /** \brief Line numbering stuff, currently unused. Re-calculate absolute top line number for a change in scroll position. */ void Fl_Text_Display_mod::absolute_top_line_number(int oldFirstChar) { if (maintaining_absolute_top_line_number()) { if (mFirstChar < oldFirstChar) mAbsTopLineNum -= buffer()->count_lines(mFirstChar, oldFirstChar); else mAbsTopLineNum += buffer()->count_lines(oldFirstChar, mFirstChar); } } /** \brief Line numbering stuff, currently unused. Return true if a separate absolute top line number is being maintained (for displaying line numbers or showing in the statistics line). */ int Fl_Text_Display_mod::maintaining_absolute_top_line_number() const { return (!mFastDisplay && mContinuousWrap && (mLineNumWidth != 0 || mNeedAbsTopLineNum)); } /** \brief Line numbering stuff, probably unused. Count lines from the beginning of the buffer to reestablish the absolute (non-wrapped) top line number. If mode is not continuous wrap, or the number is not being maintained, does nothing. */ void Fl_Text_Display_mod::reset_absolute_top_line_number() { mAbsTopLineNum = 1; absolute_top_line_number(0); } /** \brief Convert a position index into a line number offset. Find the line number of position \p pos relative to the first line of displayed text. Returns 0 if the line is not displayed. \param pos ?? \param[out] lineNum ?? \return ?? \todo What does this do? */ int Fl_Text_Display_mod::position_to_line( int pos, int *lineNum ) const { IS_UTF8_ALIGNED2(buffer(), pos) int i; *lineNum = 0; if ( pos < mFirstChar ) return 0; if ( pos > mLastChar ) { if ( empty_vlines() ) { if ( mLastChar < mBuffer->length() ) { if ( !position_to_line( mLastChar, lineNum ) ) { Fl::error("Fl_Text_Display_mod::position_to_line(): Consistency check ptvl failed"); return 0; } return ++( *lineNum ) <= mNVisibleLines - 1; } else { position_to_line( buffer()->prev_char_clipped(mLastChar), lineNum ); return 1; } } return 0; } for ( i = mNVisibleLines - 1; i >= 0; i-- ) { if ( mLineStarts[ i ] != -1 && pos >= mLineStarts[ i ] ) { *lineNum = i; return 1; } } return 0; /* probably never be reached */ } /** Universal pixel machine. We use a single function that handles all line layout, measuring, and drawing \li draw a text range \li return the width of a text range in pixels \li return the index of a character that is at a pixel position \param[in] mode DRAW_LINE, GET_WIDTH, FIND_INDEX \param[in] lineStartPos index of first character \param[in] lineLen size of string in bytes \param[in] leftChar, rightChar \param[in] Y drawing position \param[in] bottomClip, leftClip, rightClip stop work when we reach the clipped area. rightClip is the X position that we search in FIND_INDEX. \retval DRAW_LINE index of last drawn character \retval GET_WIDTH width in pixels of text segment if we would draw it \retval FIND_INDEX index of character at given x position in window coordinates \retval FIND_INDEX_FROM_ZERO index of character at given x position without scrolling and widget offsets \todo we need to handle hidden hyphens and tabs here! \todo we handle all styles and selections \todo we must provide code to get pixel positions of the middle of a character as well */ int Fl_Text_Display_mod::handle_vline( int mode, int lineStartPos, int lineLen, int leftChar, int rightChar, int Y, int bottomClip, int leftClip, int rightClip) const { IS_UTF8_ALIGNED2(buffer(), lineStartPos) // FIXME: we need to allow two modes for FIND_INDEX: one on the edge of the // FIXME: character for selection, and one on the character center for cursors. int i, X, startX, startIndex, style, charStyle; char *lineStr; if ( lineStartPos == -1 ) { lineStr = NULL; } else { lineStr = mBuffer->text_range( lineStartPos, lineStartPos + lineLen ); } if (mode==GET_WIDTH) { X = 0; } else if (mode==FIND_INDEX_FROM_ZERO) { X = 0; mode = FIND_INDEX; } else { X = text_area.x - mHorizOffset; } startX = X; startIndex = 0; if (!lineStr) { // just clear the background if (mode==DRAW_LINE) { style = position_style(lineStartPos, lineLen, -1); draw_string( style|BG_ONLY_MASK, text_area.x, Y, text_area.x+text_area.w, lineStr, lineLen ); } if (mode==FIND_INDEX) { IS_UTF8_ALIGNED2(buffer(), lineStartPos) return lineStartPos; } return 0; } char currChar = 0, prevChar = 0; // draw the line style = position_style(lineStartPos, lineLen, 0); for (i=0; itab_distance()); int xAbs = (mode==GET_WIDTH) ? startX : startX+mHorizOffset-text_area.x; w = (((xAbs/tab)+1)*tab) - xAbs; if (mode==DRAW_LINE) draw_string( style|BG_ONLY_MASK, startX, Y, startX+w, 0, 0 ); if (mode==FIND_INDEX && startX+w>rightClip) { // find x pos inside block free(lineStr); return lineStartPos + startIndex; } } else { // draw a text segment w = int( string_width( lineStr+startIndex, i-startIndex, style ) ); if (mode==DRAW_LINE) draw_string( style, startX, Y, startX+w, lineStr+startIndex, i-startIndex ); if (mode==FIND_INDEX && startX+w>rightClip) { // find x pos inside block int di = find_x(lineStr+startIndex, i-startIndex, style, rightClip-startX); free(lineStr); IS_UTF8_ALIGNED2(buffer(), (lineStartPos+startIndex+di)) return lineStartPos + startIndex + di; } } style = charStyle; startX += w; startIndex = i; } i += len; prevChar = currChar; } int w = 0; if (currChar=='\t') { // draw a single Tab space int tab = (int)col_to_x(mBuffer->tab_distance()); int xAbs = (mode==GET_WIDTH) ? startX : startX+mHorizOffset-text_area.x; w = (((xAbs/tab)+1)*tab) - xAbs; if (mode==DRAW_LINE) draw_string( style|BG_ONLY_MASK, startX, Y, startX+w, 0, 0 ); if (mode==FIND_INDEX) { // find x pos inside block free(lineStr); return lineStartPos + startIndex + ( rightClip-startX>w ? 1 : 0 ); } } else { w = int( string_width( lineStr+startIndex, i-startIndex, style ) ); if (mode==DRAW_LINE) draw_string( style, startX, Y, startX+w, lineStr+startIndex, i-startIndex ); if (mode==FIND_INDEX) { // find x pos inside block int di = find_x(lineStr+startIndex, i-startIndex, style, rightClip-startX); free(lineStr); IS_UTF8_ALIGNED2(buffer(), (lineStartPos+startIndex+di)) return lineStartPos + startIndex + di; } } if (mode==GET_WIDTH) { free(lineStr); return startX+w; } // clear the rest of the line startX += w; style = position_style(lineStartPos, lineLen, i); if (mode==DRAW_LINE) draw_string( style|BG_ONLY_MASK, startX, Y, text_area.x+text_area.w, lineStr, lineLen ); free(lineStr); IS_UTF8_ALIGNED2(buffer(), (lineStartPos+lineLen)) return lineStartPos + lineLen; } /** \brief Find the index of the character that lies at the given x position. \param s UTF-8 text string \param len length of string \param style index into style lookup table \param x position in pixels \return index into buffer */ int Fl_Text_Display_mod::find_x(const char *s, int len, int style, int x) const { IS_UTF8_ALIGNED(s) // TODO: use binary search which may be quicker. int i = 0; while (ix) return i; i += cl; } return len; } /** \brief Draw a single line of text. Draw the text on a single line represented by \p visLineNum (the number of lines down from the top of the display), limited by \p leftClip and \p rightClip window coordinates and \p leftCharIndex and \p rightCharIndex character positions (not including the character at position \p rightCharIndex). \param visLineNum index of line in the visible line number lookup \param leftClip, rightClip pixel position of clipped area \param leftCharIndex, rightCharIndex index into line of segment that we want to draw */ void Fl_Text_Display_mod::draw_vline(int visLineNum, int leftClip, int rightClip, int leftCharIndex, int rightCharIndex) { int Y, lineStartPos, lineLen, fontHeight; // printf("draw_vline(visLineNum=%d, leftClip=%d, rightClip=%d, leftCharIndex=%d, rightCharIndex=%d)\n", // visLineNum, leftClip, rightClip, leftCharIndex, rightCharIndex); // printf("nNVisibleLines=%d\n", mNVisibleLines); /* If line is not displayed, skip it */ if ( visLineNum < 0 || visLineNum >= mNVisibleLines ) return; /* Calculate Y coordinate of the string to draw */ fontHeight = mMaxsize; Y = text_area.y + visLineNum * fontHeight; /* Get the text, length, and buffer position of the line to display */ lineStartPos = mLineStarts[ visLineNum ]; if ( lineStartPos == -1 ) { lineLen = 0; } else { lineLen = vline_length( visLineNum ); } /* Shrink the clipping range to the active display area */ leftClip = max( text_area.x, leftClip ); rightClip = min( rightClip, text_area.x + text_area.w ); handle_vline(DRAW_LINE, lineStartPos, lineLen, leftCharIndex, rightCharIndex, Y, Y+fontHeight, leftClip, rightClip); return; } /** \brief Draw a text segment in a single style. Draw a string or blank area according to parameter \p style, using the appropriate colors and drawing method for that style, with top left corner at \p X, \p Y. If style says to draw text, use \p string as source of characters, and draw \p nChars, if style is FILL, erase rectangle where text would have drawn from \p X to \p toX and from \p Y to the maximum y extent of the current font(s). \param style index into style lookup table \param X, Y drawing origin \param toX rightmost position if this is a fill operation \param string text if this is a drawing operation \param nChars number of characters to draw */ void Fl_Text_Display_mod::draw_string(int style, int X, int Y, int toX, const char *string, int nChars) const { IS_UTF8_ALIGNED(string) const Style_Table_Entry * styleRec; /* Draw blank area rather than text, if that was the request */ if ( style & FILL_MASK ) { if (style & TEXT_ONLY_MASK) return; clear_rect( style, X, Y, toX - X, mMaxsize ); return; } /* Set font, color, and gc depending on style. For normal text, GCs for normal drawing, or drawing within a Fl_Text_Selection or highlight are pre-allocated and pre-configured. For syntax highlighting, GCs are configured here, on the fly. */ Fl_Font font = textfont(); int fsize = textsize(); Fl_Color foreground; Fl_Color background; if ( style & STYLE_LOOKUP_MASK ) { int si = (style & STYLE_LOOKUP_MASK) - 'A'; if (si < 0) si = 0; else if (si >= mNStyles) si = mNStyles - 1; styleRec = mStyleTable + si; font = styleRec->font; fsize = styleRec->size; if (style & PRIMARY_MASK) { if (Fl::focus() == (Fl_Widget*)this) background = selection_color(); else background = fl_color_average(color(), selection_color(), 0.4f); } else if (style & HIGHLIGHT_MASK) { if (Fl::focus() == (Fl_Widget*)this) background = fl_color_average(color(), selection_color(), 0.5f); else background = fl_color_average(color(), selection_color(), 0.6f); } else background = color(); foreground = fl_contrast(styleRec->color, background); } else if (style & PRIMARY_MASK) { if (Fl::focus() == (Fl_Widget*)this) background = selection_color(); else background = fl_color_average(color(), selection_color(), 0.4f); foreground = fl_contrast(textcolor(), background); } else if (style & HIGHLIGHT_MASK) { if (Fl::focus() == (Fl_Widget*)this) background = fl_color_average(color(), selection_color(), 0.5f); else background = fl_color_average(color(), selection_color(), 0.6f); foreground = fl_contrast(textcolor(), background); } else { foreground = textcolor(); background = color(); } if (!(style & TEXT_ONLY_MASK)) { fl_color( background ); fl_rectf( X, Y, toX - X, mMaxsize ); } if (!(style & BG_ONLY_MASK)) { fl_color( foreground ); fl_font( font, fsize ); #if !(defined(__APPLE__) || defined(WIN32)) && USE_XFT // makes sure antialiased ÄÖÜ do not leak on line above fl_push_clip(X, Y, toX - X, mMaxsize); #endif fl_draw( string, nChars, X, Y + mMaxsize - fl_descent()); #if !(defined(__APPLE__) || defined(WIN32)) && USE_XFT fl_pop_clip(); #endif } // CET - FIXME /* If any space around the character remains unfilled (due to use of different sized fonts for highlighting), fill in above or below to erase previously drawn characters */ /* if (fs->ascent < mAscent) clear_rect( style, X, Y, toX - X, mAscent - fs->ascent); if (fs->descent < mDescent) clear_rect( style, X, Y + mAscent + fs->descent, toX - x, mDescent - fs->descent); */ /* Underline if style is secondary Fl_Text_Selection */ /* if (style & SECONDARY_MASK) XDrawLine(XtDisplay(mW), XtWindow(mW), gc, x, y + mAscent, toX - 1, Y + fs->ascent); */ } /** \brief Clear a rectangle with the appropriate background color for \p style. \param style index into style table \param X, Y, width, height size and position of background area */ void Fl_Text_Display_mod::clear_rect(int style, int X, int Y, int width, int height) const { /* A width of zero means "clear to end of window" to XClearArea */ if ( width == 0 ) return; if (style & PRIMARY_MASK) { if (Fl::focus()==(Fl_Widget*)this) { fl_color(selection_color()); } else { fl_color(fl_color_average(color(), selection_color(), 0.4f)); } } else if (style & HIGHLIGHT_MASK) { if (Fl::focus()==(Fl_Widget*)this) { fl_color(fl_color_average(color(), selection_color(), 0.5f)); } else { fl_color(fl_color_average(color(), selection_color(), 0.6f)); } } else { fl_color( color() ); } fl_rectf( X, Y, width, height ); } /** \brief Draw a cursor with top center at \p X, \p Y. \param X, Y cursor position in pixels */ void Fl_Text_Display_mod::draw_cursor( int X, int Y ) { typedef struct { int x1, y1, x2, y2; } Segment; Segment segs[ 5 ]; int left, right, cursorWidth, midY; // int fontWidth = mFontStruct->min_bounds.width, nSegs = 0; int fontWidth = TMPFONTWIDTH; // CET - FIXME int nSegs = 0; int fontHeight = mMaxsize; int bot = Y + fontHeight - 1; if ( X < text_area.x - 1 || X > text_area.x + text_area.w ) return; /* For cursors other than the block, make them around 2/3 of a character width, rounded to an even number of pixels so that X will draw an odd number centered on the stem at x. */ cursorWidth = 4; //(fontWidth/3) * 2; left = X - cursorWidth / 2; right = left + cursorWidth; /* Create segments and draw cursor */ if ( mCursorStyle == CARET_CURSOR ) { midY = bot - fontHeight / 5; segs[ 0 ].x1 = left; segs[ 0 ].y1 = bot; segs[ 0 ].x2 = X; segs[ 0 ].y2 = midY; segs[ 1 ].x1 = X; segs[ 1 ].y1 = midY; segs[ 1 ].x2 = right; segs[ 1 ].y2 = bot; segs[ 2 ].x1 = left; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = X; segs[ 2 ].y2 = midY - 1; segs[ 3 ].x1 = X; segs[ 3 ].y1 = midY - 1; segs[ 3 ].x2 = right; segs[ 3 ].y2 = bot; nSegs = 4; } else if ( mCursorStyle == NORMAL_CURSOR ) { segs[ 0 ].x1 = left; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = right; segs[ 0 ].y2 = Y; segs[ 1 ].x1 = X; segs[ 1 ].y1 = Y; segs[ 1 ].x2 = X; segs[ 1 ].y2 = bot; segs[ 2 ].x1 = left; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = right; segs[ 2 ].y2 = bot; nSegs = 3; } else if ( mCursorStyle == HEAVY_CURSOR ) { segs[ 0 ].x1 = X - 1; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = X - 1; segs[ 0 ].y2 = bot; segs[ 1 ].x1 = X; segs[ 1 ].y1 = Y; segs[ 1 ].x2 = X; segs[ 1 ].y2 = bot; segs[ 2 ].x1 = X + 1; segs[ 2 ].y1 = Y; segs[ 2 ].x2 = X + 1; segs[ 2 ].y2 = bot; segs[ 3 ].x1 = left; segs[ 3 ].y1 = Y; segs[ 3 ].x2 = right; segs[ 3 ].y2 = Y; segs[ 4 ].x1 = left; segs[ 4 ].y1 = bot; segs[ 4 ].x2 = right; segs[ 4 ].y2 = bot; nSegs = 5; } else if ( mCursorStyle == DIM_CURSOR ) { midY = Y + fontHeight / 2; segs[ 0 ].x1 = X; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = X; segs[ 0 ].y2 = Y; segs[ 1 ].x1 = X; segs[ 1 ].y1 = midY; segs[ 1 ].x2 = X; segs[ 1 ].y2 = midY; segs[ 2 ].x1 = X; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = X; segs[ 2 ].y2 = bot; nSegs = 3; } else if ( mCursorStyle == BLOCK_CURSOR ) { right = X + fontWidth; segs[ 0 ].x1 = X; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = right; segs[ 0 ].y2 = Y; segs[ 1 ].x1 = right; segs[ 1 ].y1 = Y; segs[ 1 ].x2 = right; segs[ 1 ].y2 = bot; segs[ 2 ].x1 = right; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = X; segs[ 2 ].y2 = bot; segs[ 3 ].x1 = X; segs[ 3 ].y1 = bot; segs[ 3 ].x2 = X; segs[ 3 ].y2 = Y; nSegs = 4; } fl_color( mCursor_color ); for ( int k = 0; k < nSegs; k++ ) { fl_line( segs[ k ].x1, segs[ k ].y1, segs[ k ].x2, segs[ k ].y2 ); } } /** \brief Find the correct style for a character. Determine the drawing method to use to draw a specific character from "buf". \p lineStartPos gives the character index where the line begins, \p lineIndex, the number of characters past the beginning of the line, and \p lineIndex the number of displayed characters past the beginning of the line. Passing \p lineStartPos of -1 returns the drawing style for "no text". Why not just: position_style(pos)? Because style applies to blank areas of the window beyond the text boundaries, and because this routine must also decide whether a position is inside of a rectangular Fl_Text_Selection, and do so efficiently, without re-counting character positions from the start of the line. Note that style is a somewhat incorrect name, drawing method would be more appropriate. \param lineStartPos beginning of this line \param lineLen number of bytes in line \param lineIndex position of character within line \return style for the given character */ int Fl_Text_Display_mod::position_style( int lineStartPos, int lineLen, int lineIndex) const { IS_UTF8_ALIGNED2(buffer(), lineStartPos) Fl_Text_Buffer_mod * buf = mBuffer; Fl_Text_Buffer_mod *styleBuf = mStyleBuffer; int pos, style = 0; if ( lineStartPos == -1 || buf == NULL ) return FILL_MASK; pos = lineStartPos + min( lineIndex, lineLen ); if ( lineIndex >= lineLen ) style = FILL_MASK; else if ( styleBuf != NULL ) { style = ( unsigned char ) styleBuf->byte_at( pos ); if (style == mUnfinishedStyle && mUnfinishedHighlightCB) { /* encountered "unfinished" style, trigger parsing */ (mUnfinishedHighlightCB)( pos, mHighlightCBArg); style = (unsigned char) styleBuf->byte_at( pos); } } if (buf->primary_selection()->includes(pos)) style |= PRIMARY_MASK; if (buf->highlight_selection()->includes(pos)) style |= HIGHLIGHT_MASK; if (buf->secondary_selection()->includes(pos)) style |= SECONDARY_MASK; return style; } /** \brief Find the width of a string in the font of a particular style. \param string the text \param length number of bytes in string \param style index into style table \return width of text segment in pixels */ double Fl_Text_Display_mod::string_width( const char *string, int length, int style ) const { IS_UTF8_ALIGNED(string) Fl_Font font; Fl_Fontsize fsize; if ( mNStyles && (style & STYLE_LOOKUP_MASK) ) { int si = (style & STYLE_LOOKUP_MASK) - 'A'; if (si < 0) si = 0; else if (si >= mNStyles) si = mNStyles - 1; font = mStyleTable[si].font; fsize = mStyleTable[si].size; } else { font = textfont(); fsize = textsize(); } fl_font( font, fsize ); return fl_width( string, length ); } /** \brief Translate a pixel position into a character index. Translate window coordinates to the nearest (insert cursor or character cell) text position. The parameter \p posType specifies how to interpret the position: CURSOR_POS means translate the coordinates to the nearest cursor position, and CHARACTER_POS means return the position of the character closest to (\p X, \p Y). \param X, Y pixel position \param posType CURSOR_POS or CHARACTER_POS \return index into text buffer */ int Fl_Text_Display_mod::xy_to_position( int X, int Y, int posType ) const { int lineStart, lineLen, fontHeight; int visLineNum; /* Find the visible line number corresponding to the Y coordinate */ fontHeight = mMaxsize; visLineNum = ( Y - text_area.y ) / fontHeight; if ( visLineNum < 0 ) return mFirstChar; if ( visLineNum >= mNVisibleLines ) visLineNum = mNVisibleLines - 1; /* Find the position at the start of the line */ lineStart = mLineStarts[ visLineNum ]; /* If the line start was empty, return the last position in the buffer */ if ( lineStart == -1 ) return mBuffer->length(); /* Get the line text and its length */ lineLen = vline_length( visLineNum ); return handle_vline(FIND_INDEX, lineStart, lineLen, 0, 0, 0, 0, text_area.x, X); } /** \brief Translate pixel coordinates into row and column. Translate window coordinates to the nearest row and column number for positioning the cursor. This, of course, makes no sense when the font is proportional, since there are no absolute columns. The parameter posType specifies how to interpret the position: CURSOR_POS means translate the coordinates to the nearest position between characters, and CHARACTER_POS means translate the position to the nearest character cell. \param X, Y pixel coordinates \param[out] row, column neares row and column \param posType CURSOR_POS or CHARACTER_POS */ void Fl_Text_Display_mod::xy_to_rowcol( int X, int Y, int *row, int *column, int posType ) const { int fontHeight = mMaxsize; int fontWidth = TMPFONTWIDTH; //mFontStruct->max_bounds.width; /* Find the visible line number corresponding to the Y coordinate */ *row = ( Y - text_area.y ) / fontHeight; if ( *row < 0 ) *row = 0; if ( *row >= mNVisibleLines ) *row = mNVisibleLines - 1; *column = ( ( X - text_area.x ) + mHorizOffset + ( posType == CURSOR_POS ? fontWidth / 2 : 0 ) ) / fontWidth; if ( *column < 0 ) * column = 0; } /** \brief Offset line start counters for a new vertical scroll position. Offset the line starts array, mTopLineNum, mFirstChar and lastChar, for a new vertical scroll position given by newTopLineNum. If any currently displayed lines will still be visible, salvage the line starts values, otherwise, count lines from the nearest known line start (start or end of buffer, or the closest value in the mLineStarts array) \param newTopLineNum index into buffer */ void Fl_Text_Display_mod::offset_line_starts( int newTopLineNum ) { int oldTopLineNum = mTopLineNum; int oldFirstChar = mFirstChar; int lineDelta = newTopLineNum - oldTopLineNum; int nVisLines = mNVisibleLines; int *lineStarts = mLineStarts; int i, lastLineNum; Fl_Text_Buffer_mod *buf = mBuffer; /* If there was no offset, nothing needs to be changed */ if ( lineDelta == 0 ) return; /* Find the new value for mFirstChar by counting lines from the nearest known line start (start or end of buffer, or the closest value in the lineStarts array) */ lastLineNum = oldTopLineNum + nVisLines - 1; if ( newTopLineNum < oldTopLineNum && newTopLineNum < -lineDelta ) { mFirstChar = skip_lines( 0, newTopLineNum - 1, true ); } else if ( newTopLineNum < oldTopLineNum ) { mFirstChar = rewind_lines( mFirstChar, -lineDelta ); } else if ( newTopLineNum < lastLineNum ) { mFirstChar = lineStarts[ newTopLineNum - oldTopLineNum ]; } else if ( newTopLineNum - lastLineNum < mNBufferLines - newTopLineNum ) { mFirstChar = skip_lines( lineStarts[ nVisLines - 1 ], newTopLineNum - lastLineNum, true ); } else { mFirstChar = rewind_lines( buf->length(), mNBufferLines - newTopLineNum + 1 ); } /* Fill in the line starts array */ if ( lineDelta < 0 && -lineDelta < nVisLines ) { for ( i = nVisLines - 1; i >= -lineDelta; i-- ) lineStarts[ i ] = lineStarts[ i + lineDelta ]; calc_line_starts( 0, -lineDelta ); } else if ( lineDelta > 0 && lineDelta < nVisLines ) { for ( i = 0; i < nVisLines - lineDelta; i++ ) lineStarts[ i ] = lineStarts[ i + lineDelta ]; calc_line_starts( nVisLines - lineDelta, nVisLines - 1 ); } else calc_line_starts( 0, nVisLines ); /* Set lastChar and mTopLineNum */ calc_last_char(); mTopLineNum = newTopLineNum; /* If we're numbering lines or being asked to maintain an absolute line number, re-calculate the absolute line number */ absolute_top_line_number(oldFirstChar); } /** \brief Update line start arrays and variables. Update the line starts array, mTopLineNum, mFirstChar and lastChar for this text display after a modification to the text buffer, given by the position \p pos where the change began, and the numbers of characters and lines inserted and deleted. \param pos index into buffer of recent changes \param charsInserted number of bytes(!) inserted \param charsDeleted number of bytes(!) deleted \param linesInserted number of lines \param linesDeleted number of lines \param[out] scrolled set to 1 if the text display needs to be scrolled */ void Fl_Text_Display_mod::update_line_starts(int pos, int charsInserted, int charsDeleted, int linesInserted, int linesDeleted, int *scrolled ) { IS_UTF8_ALIGNED2(buffer(), pos) int *lineStarts = mLineStarts; int i, lineOfPos, lineOfEnd, nVisLines = mNVisibleLines; int charDelta = charsInserted - charsDeleted; int lineDelta = linesInserted - linesDeleted; /* If all of the changes were before the displayed text, the display doesn't change, just update the top line num and offset the line start entries and first and last characters */ if ( pos + charsDeleted < mFirstChar ) { mTopLineNum += lineDelta; for ( i = 0; i < nVisLines && lineStarts[i] != -1; i++ ) lineStarts[ i ] += charDelta; mFirstChar += charDelta; mLastChar += charDelta; *scrolled = 0; return; } /* The change began before the beginning of the displayed text, but part or all of the displayed text was deleted */ if ( pos < mFirstChar ) { /* If some text remains in the window, anchor on that */ if ( position_to_line( pos + charsDeleted, &lineOfEnd ) && ++lineOfEnd < nVisLines && lineStarts[ lineOfEnd ] != -1 ) { mTopLineNum = max( 1, mTopLineNum + lineDelta ); mFirstChar = rewind_lines(lineStarts[ lineOfEnd ] + charDelta, lineOfEnd ); /* Otherwise anchor on original line number and recount everything */ } else { if ( mTopLineNum > mNBufferLines + lineDelta ) { mTopLineNum = 1; mFirstChar = 0; } else mFirstChar = skip_lines( 0, mTopLineNum - 1, true ); } calc_line_starts( 0, nVisLines - 1 ); /* calculate lastChar by finding the end of the last displayed line */ calc_last_char(); *scrolled = 1; return; } /* If the change was in the middle of the displayed text (it usually is), salvage as much of the line starts array as possible by moving and offsetting the entries after the changed area, and re-counting the added lines or the lines beyond the salvaged part of the line starts array */ if ( pos <= mLastChar ) { /* find line on which the change began */ position_to_line( pos, &lineOfPos ); /* salvage line starts after the changed area */ if ( lineDelta == 0 ) { for ( i = lineOfPos + 1; i < nVisLines && lineStarts[ i ] != -1; i++ ) lineStarts[ i ] += charDelta; } else if ( lineDelta > 0 ) { for ( i = nVisLines - 1; i >= lineOfPos + lineDelta + 1; i-- ) lineStarts[ i ] = lineStarts[ i - lineDelta ] + ( lineStarts[ i - lineDelta ] == -1 ? 0 : charDelta ); } else /* (lineDelta < 0) */ { for ( i = max( 0, lineOfPos + 1 ); i < nVisLines + lineDelta; i++ ) lineStarts[ i ] = lineStarts[ i - lineDelta ] + ( lineStarts[ i - lineDelta ] == -1 ? 0 : charDelta ); } /* fill in the missing line starts */ if ( linesInserted >= 0 ) calc_line_starts( lineOfPos + 1, lineOfPos + linesInserted ); if ( lineDelta < 0 ) calc_line_starts( nVisLines + lineDelta, nVisLines ); /* calculate lastChar by finding the end of the last displayed line */ calc_last_char(); *scrolled = 0; return; } /* Change was past the end of the displayed text, but displayable by virtue of being an insert at the end of the buffer into visible blank lines */ if ( empty_vlines() ) { position_to_line( pos, &lineOfPos ); calc_line_starts( lineOfPos, lineOfPos + linesInserted ); calc_last_char(); *scrolled = 0; return; } /* Change was beyond the end of the buffer and not visible, do nothing */ *scrolled = 0; } /** \brief Update the line start arrays. Scan through the text in the "textD"'s buffer and recalculate the line starts array values beginning at index "startLine" and continuing through (including) "endLine". It assumes that the line starts entry preceding "startLine" (or mFirstChar if startLine is 0) is good, and re-counts newlines to fill in the requested entries. Out of range values for "startLine" and "endLine" are acceptable. \param startLine, endLine range of lines to scan as line numbers */ void Fl_Text_Display_mod::calc_line_starts( int startLine, int endLine ) { int startPos, bufLen = mBuffer->length(); int line, lineEnd, nextLineStart, nVis = mNVisibleLines; int *lineStarts = mLineStarts; /* Clean up (possibly) messy input parameters */ if ( endLine < 0 ) endLine = 0; if ( endLine >= nVis ) endLine = nVis - 1; if ( startLine < 0 ) startLine = 0; if ( startLine >= nVis ) startLine = nVis - 1; if ( startLine > endLine ) return; /* Find the last known good line number -> position mapping */ if ( startLine == 0 ) { lineStarts[ 0 ] = mFirstChar; startLine = 1; } startPos = lineStarts[ startLine - 1 ]; /* If the starting position is already past the end of the text, fill in -1's (means no text on line) and return */ if ( startPos == -1 ) { for ( line = startLine; line <= endLine; line++ ) lineStarts[ line ] = -1; return; } /* Loop searching for ends of lines and storing the positions of the start of the next line in lineStarts */ for ( line = startLine; line <= endLine; line++ ) { find_line_end(startPos, true, &lineEnd, &nextLineStart); startPos = nextLineStart; if ( startPos >= bufLen ) { /* If the buffer ends with a newline or line break, put buf->length() in the next line start position (instead of a -1 which is the normal marker for an empty line) to indicate that the cursor may safely be displayed there */ if ( line == 0 || ( lineStarts[ line - 1 ] != bufLen && lineEnd != nextLineStart ) ) { lineStarts[ line ] = bufLen; line++; } break; } lineStarts[ line ] = startPos; } /* Set any entries beyond the end of the text to -1 */ for ( ; line <= endLine; line++ ) lineStarts[ line ] = -1; } /** \brief Update last display character index. Given a Fl_Text_Display_mod with a complete, up-to-date lineStarts array, update the lastChar entry to point to the last buffer position displayed. */ void Fl_Text_Display_mod::calc_last_char() { int i; for (i = mNVisibleLines - 1; i >= 0 && mLineStarts[i] == -1; i--) ; mLastChar = i < 0 ? 0 : line_end(mLineStarts[i], true); } /** \brief Scrolls the current buffer to start at the specified line and column. \param topLineNum top line number \param horizOffset column number \todo Column numbers make little sense here. */ void Fl_Text_Display_mod::scroll(int topLineNum, int horizOffset) { mTopLineNumHint = topLineNum; mHorizOffsetHint = horizOffset; resize(x(), y(), w(), h()); } /** \brief Scrolls the current buffer to start at the specified line and column. \param topLineNum top line number \param horizOffset in pixels \return 0 if nothing changed, 1 if we scrolled */ int Fl_Text_Display_mod::scroll_(int topLineNum, int horizOffset) { /* Limit the requested scroll position to allowable values */ if (topLineNum > mNBufferLines + 3 - mNVisibleLines) topLineNum = mNBufferLines + 3 - mNVisibleLines; if (topLineNum < 1) topLineNum = 1; if (horizOffset > longest_vline() - text_area.w) horizOffset = longest_vline() - text_area.w; if (horizOffset < 0) horizOffset = 0; /* Do nothing if scroll position hasn't actually changed or there's no window to draw in yet */ if (mHorizOffset == horizOffset && mTopLineNum == topLineNum) return 0; /* If the vertical scroll position has changed, update the line starts array and related counters in the text display */ offset_line_starts(topLineNum); /* Just setting mHorizOffset is enough information for redisplay */ mHorizOffset = horizOffset; // redraw all text damage(FL_DAMAGE_EXPOSE); return 1; } /** \brief Update vertical scrollbar. Update the minimum, maximum, slider size, page increment, and value for vertical scrollbar. */ void Fl_Text_Display_mod::update_v_scrollbar() { /* The vertical scrollbar value and slider size directly represent the top line number, and the number of visible lines respectively. The scroll bar maximum value is chosen to generally represent the size of the whole buffer, with minor adjustments to keep the scrollbar widget happy */ #ifdef DEBUG printf("Fl_Text_Display_mod::update_v_scrollbar():\n" " mTopLineNum=%d, mNVisibleLines=%d, mNBufferLines=%d\n", mTopLineNum, mNVisibleLines, mNBufferLines); #endif // DEBUG mVScrollBar->value(mTopLineNum, mNVisibleLines, 1, mNBufferLines + 2); mVScrollBar->linesize(3); } /** \brief Update vertical scrollbar. Update the minimum, maximum, slider size, page increment, and value for the horizontal scrollbar. */ void Fl_Text_Display_mod::update_h_scrollbar() { int sliderMax = max(longest_vline(), text_area.w + mHorizOffset); mHScrollBar->value( mHorizOffset, text_area.w, 0, sliderMax ); } /** \brief Callbacks for drag or valueChanged on scrollbars. */ void Fl_Text_Display_mod::v_scrollbar_cb(Fl_Scrollbar* b, Fl_Text_Display_mod* textD) { if (b->value() == textD->mTopLineNum) return; textD->scroll(b->value(), textD->mHorizOffset); } /** \brief Callbacks for drag or valueChanged on scrollbars. */ void Fl_Text_Display_mod::h_scrollbar_cb(Fl_Scrollbar* b, Fl_Text_Display_mod* textD) { if (b->value() == textD->mHorizOffset) return; textD->scroll(textD->mTopLineNum, b->value()); } /** \brief Refresh the line number area. If clearAll is False, writes only over the character cell areas. Setting clearAll to True will clear out any stray marks outside of the character cell area, which might have been left from before a resize or font change. This function is not used. */ void Fl_Text_Display_mod::draw_line_numbers(bool /*clearAll*/) { #if 0 int y, line, visLine, nCols, lineStart; char lineNumString[12]; int lineHeight = mMaxsize ? mMaxsize : textsize_; int charWidth = TMPFONTWIDTH; //mFontStruct->max_bounds.width; /* Don't draw if mLineNumWidth == 0 (line numbers are hidden), or widget is not yet realized */ if (mLineNumWidth == 0 || visible_r()) return; /* GC is allocated on demand, since not everyone will use line numbering */ if (textD->lineNumGC == NULL) { XGCValues values; values.foreground = textD->lineNumFGPixel; values.background = textD->bgPixel; values.font = textD->fontStruct->fid; textD->lineNumGC = XtGetGC(textD->w, GCFont| GCForeground | GCBackground, &values); } /* Erase the previous contents of the line number area, if requested */ if (clearAll) XClearArea(XtDisplay(textD->w), XtWindow(textD->w), textD->lineNumLeft, textD->top, textD->lineNumWidth, textD->height, False); /* Draw the line numbers, aligned to the text */ nCols = min(11, textD->lineNumWidth / charWidth); y = textD->top; line = getAbsTopLineNum(textD); for (visLine=0; visLine < textD->nVisibleLines; visLine++) { lineStart = textD->lineStarts[visLine]; if (lineStart != -1 && (lineStart==0 || BufGetCharacter(textD->buffer, lineStart-1)=='\n')) { sprintf(lineNumString, "%*d", nCols, line); XDrawImageString(XtDisplay(textD->w), XtWindow(textD->w), textD->lineNumGC, textD->lineNumLeft, y + textD->ascent, lineNumString, strlen(lineNumString)); line++; } else { XClearArea(XtDisplay(textD->w), XtWindow(textD->w), textD->lineNumLeft, y, textD->lineNumWidth, textD->ascent + textD->descent, False); if (visLine == 0) line++; } y += lineHeight; } #endif } static int max( int i1, int i2 ) { return i1 >= i2 ? i1 : i2; } static int min( int i1, int i2 ) { return i1 <= i2 ? i1 : i2; } /** Count the number of newlines in a null-terminated text string; */ static int countlines( const char *string ) { IS_UTF8_ALIGNED(string) const char * c; int lineCount = 0; if (!string) return 0; for ( c = string; *c != '\0'; c++ ) if ( *c == '\n' ) lineCount++; return lineCount; } /** \brief Returns the width in pixels of the displayed line pointed to by "visLineNum". \param visLineNum index into visible lines array \return width of line in pixels */ int Fl_Text_Display_mod::measure_vline( int visLineNum ) const { int lineLen = vline_length( visLineNum ); int lineStartPos = mLineStarts[ visLineNum ]; if (lineStartPos < 0 || lineLen == 0) return 0; return handle_vline(GET_WIDTH, lineStartPos, lineLen, 0, 0, 0, 0, 0, 0); } /** \brief Return true if there are lines visible with no corresponding buffer text. \return 1 if there are empty lines */ int Fl_Text_Display_mod::empty_vlines() const { return (mNVisibleLines > 0) && (mLineStarts[ mNVisibleLines - 1 ] == -1); } /** \brief Count number of bytes in a visible line. Return the length of a line (number of bytes) by examining entries in the line starts array rather than by scanning for newlines. \param visLineNum index of line in visible line array \return number of bytes in this line */ int Fl_Text_Display_mod::vline_length( int visLineNum ) const { int nextLineStart, lineStartPos; if (visLineNum < 0 || visLineNum >= mNVisibleLines) return (0); lineStartPos = mLineStarts[ visLineNum ]; if ( lineStartPos == -1 ) return 0; if ( visLineNum + 1 >= mNVisibleLines ) return mLastChar - lineStartPos; nextLineStart = mLineStarts[ visLineNum + 1 ]; if ( nextLineStart == -1 ) return mLastChar - lineStartPos; int nextLineStartMinus1 = buffer()->prev_char(nextLineStart); if (wrap_uses_character(nextLineStartMinus1)) return nextLineStartMinus1 - lineStartPos; return nextLineStart - lineStartPos; } /** \brief Wrapping calculations. When continuous wrap is on, and the user inserts or deletes characters, wrapping can happen before and beyond the changed position. This routine finds the extent of the changes, and counts the deleted and inserted lines over that range. It also attempts to minimize the size of the range to what has to be counted and re-displayed, so the results can be useful both for delimiting where the line starts need to be recalculated, and for deciding what part of the text to redisplay. \param deletedText \param pos \param nInserted \param nDeleted \param modRangeStart \param modRangeEnd \param linesInserted \param linesDeleted */ void Fl_Text_Display_mod::find_wrap_range(const char *deletedText, int pos, int nInserted, int nDeleted, int *modRangeStart, int *modRangeEnd, int *linesInserted, int *linesDeleted) { IS_UTF8_ALIGNED(deletedText) IS_UTF8_ALIGNED2(buffer(), pos) int length, retPos, retLines, retLineStart, retLineEnd; Fl_Text_Buffer_mod *deletedTextBuf, *buf = buffer(); int nVisLines = mNVisibleLines; int *lineStarts = mLineStarts; int countFrom, countTo, lineStart, adjLineStart, i; int visLineNum = 0, nLines = 0; /* ** Determine where to begin searching: either the previous newline, or ** if possible, limit to the start of the (original) previous displayed ** line, using information from the existing line starts array */ if (pos >= mFirstChar && pos <= mLastChar) { for (i=nVisLines-1; i>0; i--) { if (lineStarts[i] != -1 && pos >= lineStarts[i]) { break; } } if (i > 0) { countFrom = lineStarts[i-1]; visLineNum = i-1; } else { countFrom = buf->line_start(pos); } } else { countFrom = buf->line_start(pos); } IS_UTF8_ALIGNED2(buf, countFrom) /* ** Move forward through the (new) text one line at a time, counting ** displayed lines, and looking for either a real newline, or for the ** line starts to re-sync with the original line starts array */ lineStart = countFrom; *modRangeStart = countFrom; for (;;) { /* advance to the next line. If the line ended in a real newline or the end of the buffer, that's far enough */ wrapped_line_counter(buf, lineStart, buf->length(), 1, true, 0, &retPos, &retLines, &retLineStart, &retLineEnd); if (retPos >= buf->length()) { countTo = buf->length(); *modRangeEnd = countTo; if (retPos != retLineEnd) nLines++; break; } else { lineStart = retPos; } nLines++; if (lineStart > pos + nInserted && buf->char_at(buf->prev_char(lineStart)) == '\n') { countTo = lineStart; *modRangeEnd = lineStart; break; } /* Don't try to resync in continuous wrap mode with non-fixed font sizes; it would result in a chicken-and-egg dependency between the calculations for the inserted and the deleted lines. If we're in that mode, the number of deleted lines is calculated in advance, without resynchronization, so we shouldn't resynchronize for the inserted lines either. */ if (mSuppressResync) continue; /* check for synchronization with the original line starts array before pos, if so, the modified range can begin later */ if (lineStart <= pos) { while (visLineNumprev_char(lineStarts[visLineNum+1])); else *modRangeStart = countFrom; } else *modRangeStart = min(*modRangeStart, buf->prev_char(lineStart)); } /* check for synchronization with the original line starts array after pos, if so, the modified range can end early */ else if (lineStart > pos + nInserted) { adjLineStart = lineStart - nInserted + nDeleted; while (visLineNumcopy(buffer(), countFrom, pos, 0); if (nDeleted != 0) deletedTextBuf->insert(pos-countFrom, deletedText); deletedTextBuf->copy(buffer(), pos+nInserted, countTo, pos-countFrom+nDeleted); /* Note that we need to take into account an offset for the style buffer: the deletedTextBuf can be out of sync with the style buffer. */ wrapped_line_counter(deletedTextBuf, 0, length, INT_MAX, true, countFrom, &retPos, &retLines, &retLineStart, &retLineEnd, false); delete deletedTextBuf; *linesDeleted = retLines; mSuppressResync = 0; } /** \brief Wrapping calculations. This is a stripped-down version of the findWrapRange() function above, intended to be used to calculate the number of "deleted" lines during a buffer modification. It is called _before_ the modification takes place. This function should only be called in continuous wrap mode with a non-fixed font width. In that case, it is impossible to calculate the number of deleted lines, because the necessary style information is no longer available _after_ the modification. In other cases, we can still perform the calculation afterwards (possibly even more efficiently). \param pos \param nDeleted */ void Fl_Text_Display_mod::measure_deleted_lines(int pos, int nDeleted) { IS_UTF8_ALIGNED2(buffer(), pos) int retPos, retLines, retLineStart, retLineEnd; Fl_Text_Buffer_mod *buf = buffer(); int nVisLines = mNVisibleLines; int *lineStarts = mLineStarts; int countFrom, lineStart; // int visLineNum = 0; int nLines = 0, i; /* ** Determine where to begin searching: either the previous newline, or ** if possible, limit to the start of the (original) previous displayed ** line, using information from the existing line starts array */ if (pos >= mFirstChar && pos <= mLastChar) { for (i=nVisLines-1; i>0; i--) if (lineStarts[i] != -1 && pos >= lineStarts[i]) break; if (i > 0) { countFrom = lineStarts[i-1]; // visLineNum = i-1; } else countFrom = buf->line_start(pos); } else countFrom = buf->line_start(pos); /* ** Move forward through the (new) text one line at a time, counting ** displayed lines, and looking for either a real newline, or for the ** line starts to re-sync with the original line starts array */ lineStart = countFrom; for (;;) { /* advance to the next line. If the line ended in a real newline or the end of the buffer, that's far enough */ wrapped_line_counter(buf, lineStart, buf->length(), 1, true, 0, &retPos, &retLines, &retLineStart, &retLineEnd); if (retPos >= buf->length()) { if (retPos != retLineEnd) nLines++; break; } else lineStart = retPos; nLines++; if (lineStart > pos + nDeleted && buf->char_at(lineStart-1) == '\n') { break; } /* Unlike in the findWrapRange() function above, we don't try to resync with the line starts, because we don't know the length of the inserted text yet, nor the updated style information. Because of that, we also shouldn't resync with the line starts after the modification either, because we must perform the calculations for the deleted and inserted lines in the same way. This can result in some unnecessary recalculation and redrawing overhead, and therefore we should only use this two-phase mode of calculation when it's really needed (continuous wrap + variable font width). */ } mNLinesDeleted = nLines; mSuppressResync = 1; } /** \brief Wrapping calculations. Count forward from startPos to either maxPos or maxLines (whichever is reached first), and return all relevant positions and line count. The provided textBuffer may differ from the actual text buffer of the widget. In that case it must be a (partial) copy of the actual text buffer and the styleBufOffset argument must indicate the starting position of the copy, to take into account the correct style information. \param buf \param startPos \param maxPos \param maxLines \param startPosIsLineStart \param styleBufOffset \param[out] retPos Position where counting ended. When counting lines, the position returned is the start of the line "maxLines" lines beyond "startPos". \param[out] retLines Number of line breaks counted \param[out] retLineStart Start of the line where counting ended \param[out] retLineEnd End position of the last line traversed \param[out] countLastLineMissingNewLine */ void Fl_Text_Display_mod::wrapped_line_counter(Fl_Text_Buffer_mod *buf, int startPos, int maxPos, int maxLines, bool startPosIsLineStart, int styleBufOffset, int *retPos, int *retLines, int *retLineStart, int *retLineEnd, bool countLastLineMissingNewLine) const { IS_UTF8_ALIGNED2(buf, startPos) IS_UTF8_ALIGNED2(buf, maxPos) int lineStart, newLineStart = 0, b, p, colNum, wrapMarginPix; int i, foundBreak; double width; int nLines = 0; unsigned int c; /* Set the wrap margin to the wrap column or the view width */ if (mWrapMarginPix != 0) { wrapMarginPix = mWrapMarginPix; } else { wrapMarginPix = text_area.w; } /* Find the start of the line if the start pos is not marked as a line start. */ if (startPosIsLineStart) lineStart = startPos; else lineStart = line_start(startPos); /* ** Loop until position exceeds maxPos or line count exceeds maxLines. ** (actually, continues beyond maxPos to end of line containing maxPos, ** in case later characters cause a word wrap back before maxPos) */ colNum = 0; width = 0; for (p=lineStart; plength(); p=buf->next_char(p)) { c = buf->char_at(p); // UCS-4 /* If the character was a newline, count the line and start over, otherwise, add it to the width and column counts */ if (c == '\n') { if (p >= maxPos) { *retPos = maxPos; *retLines = nLines; *retLineStart = lineStart; *retLineEnd = maxPos; return; } nLines++; int p1 = buf->next_char(p); if (nLines >= maxLines) { *retPos = p1; *retLines = nLines; *retLineStart = p1; *retLineEnd = p; return; } lineStart = p1; colNum = 0; width = 0; } else { const char *s = buf->address(p); colNum++; // FIXME: it is not a good idea to simply add character widths because on // some platforms, the width is a floating point value and depends on the // previous character as well. width += measure_proportional_character(s, (int)width, p+styleBufOffset); } /* If character exceeded wrap margin, find the break point and wrap there */ if (width > wrapMarginPix) { foundBreak = false; for (b=p; b>=lineStart; b=buf->prev_char(b)) { c = buf->char_at(b); if (c == '\t' || c == ' ') { newLineStart = buf->next_char(b); colNum = 0; width = 0; int iMax = buf->next_char(p); for (i=buf->next_char(b); inext_char(i)) { width += measure_proportional_character(buf->address(i), (int)width, i+styleBufOffset); colNum++; } foundBreak = true; break; } } if (!foundBreak) { /* no whitespace, just break at margin */ newLineStart = max(p, buf->next_char(lineStart)); const char *s = buf->address(b); colNum++; width = measure_proportional_character(s, 0, p+styleBufOffset); } if (p >= maxPos) { *retPos = maxPos; *retLines = maxPos < newLineStart ? nLines : nLines + 1; *retLineStart = maxPos < newLineStart ? lineStart : newLineStart; *retLineEnd = maxPos; return; } nLines++; if (nLines >= maxLines) { *retPos = foundBreak ? buf->next_char(b) : max(p, buf->next_char(lineStart)); *retLines = nLines; *retLineStart = lineStart; *retLineEnd = foundBreak ? b : p; return; } lineStart = newLineStart; } } /* reached end of buffer before reaching pos or line target */ *retPos = buf->length(); *retLines = nLines; if (countLastLineMissingNewLine && colNum > 0) *retLines = buf->next_char(*retLines); *retLineStart = lineStart; *retLineEnd = buf->length(); } /** \brief Wrapping calculations. Measure the width in pixels of the first character of string "s" at a particular column "colNum" and buffer position "pos". This is for measuring characters in proportional or mixed-width highlighting fonts. A note about proportional and mixed-width fonts: the mixed width and proportional font code in nedit does not get much use in general editing, because nedit doesn't allow per-language-mode fonts, and editing programs in a proportional font is usually a bad idea, so very few users would choose a proportional font as a default. There are still probably mixed- width syntax highlighting cases where things don't redraw properly for insertion/deletion, though static display and wrapping and resizing should now be solid because they are now used for online help display. \param s text string \param xPix x pixel position needed for calculating tab widths \param pos offset within string \return width of character in pixels */ double Fl_Text_Display_mod::measure_proportional_character(const char *s, int xPix, int pos) const { IS_UTF8_ALIGNED(s) if (*s=='\t') { int tab = (int)col_to_x(mBuffer->tab_distance()); return (((xPix/tab)+1)*tab) - xPix; } int charLen = fl_utf8len1(*s), style = 0; if (mStyleBuffer) { style = mStyleBuffer->byte_at(pos); } return string_width(s, charLen, style); } /** \brief Finds both the end of the current line and the start of the next line. Why? In continuous wrap mode, if you need to know both, figuring out one from the other can be expensive or error prone. The problem comes when there's a trailing space or tab just before the end of the buffer. To translate an end of line value to or from the next lines start value, you need to know whether the trailing space or tab is being used as a line break or just a normal character, and to find that out would otherwise require counting all the way back to the beginning of the line. \param startPos \param startPosIsLineStart \param[out] lineEnd \param[out] nextLineStart */ void Fl_Text_Display_mod::find_line_end(int startPos, bool startPosIsLineStart, int *lineEnd, int *nextLineStart) const { IS_UTF8_ALIGNED2(buffer(), startPos) int retLines, retLineStart; /* if we're not wrapping use more efficient BufEndOfLine */ if (mFastDisplay || !mContinuousWrap) { int le = buffer()->line_end(startPos); int ls = buffer()->next_char(le); *lineEnd = le; *nextLineStart = min(buffer()->length(), ls); return; } /* use the wrapped line counter routine to count forward one line */ wrapped_line_counter(buffer(), startPos, buffer()->length(), 1, startPosIsLineStart, 0, nextLineStart, &retLines, &retLineStart, lineEnd); } /** \brief Check if the line break is caused by a \\n or by line wrapping. Line breaks in continuous wrap mode usually happen at newlines or whitespace. This line-terminating character is not included in line width measurements and has a special status as a non-visible character. However, lines with no whitespace are wrapped without the benefit of a line terminating character, and this distinction causes endless trouble with all of the text display code which was originally written without continuous wrap mode and always expects to wrap at a newline character. Given the position of the end of the line, as returned by TextDEndOfLine or BufEndOfLine, this returns true if there is a line terminating character, and false if there's not. On the last character in the buffer, this function can't tell for certain whether a trailing space was used as a wrap point, and just guesses that it wasn't. So if an exact accounting is necessary, don't use this function. \param lineEndPos index of character where the line wraps \return 1 if a \\n character causes the line wrap */ int Fl_Text_Display_mod::wrap_uses_character(int lineEndPos) const { IS_UTF8_ALIGNED2(buffer(), lineEndPos) unsigned int c; if (mFastDisplay || !mContinuousWrap || lineEndPos == buffer()->length()) return 1; c = buffer()->char_at(lineEndPos); return c == '\n' || ((c == '\t' || c == ' ') && lineEndPos + 1 < buffer()->length()); } /** \brief I don't know what this does! Extend the range of a redraw request (from *start to *end) with additional redraw requests resulting from changes to the attached style buffer (which contains auxiliary information for coloring or styling text). \param startpos ?? \param endpos ?? \todo Unicode? */ void Fl_Text_Display_mod::extend_range_for_styles( int *startpos, int *endpos ) { IS_UTF8_ALIGNED2(buffer(), (*startpos)) IS_UTF8_ALIGNED2(buffer(), (*endpos)) Fl_Text_Selection_mod * sel = mStyleBuffer->primary_selection(); int extended = 0; /* The peculiar protocol used here is that modifications to the style buffer are marked by selecting them with the buffer's primary Fl_Text_Selection. The style buffer is usually modified in response to a modify callback on the text buffer BEFORE Fl_Text_Display_mod.c's modify callback, so that it can keep the style buffer in step with the text buffer. The style-update callback can't just call for a redraw, because Fl_Text_Display_mod hasn't processed the original text changes yet. Anyhow, to minimize redrawing and to avoid the complexity of scheduling redraws later, this simple protocol tells the text display's buffer modify callback to extend its redraw range to show the text color/and font changes as well. */ if ( sel->selected() ) { if ( sel->start() < *startpos ) { *startpos = sel->start(); // somewhere while deleting, alignment is lost. We do this just to be sure. *startpos = buffer()->utf8_align(*startpos); IS_UTF8_ALIGNED2(buffer(), (*startpos)) extended = 1; } if ( sel->end() > *endpos ) { *endpos = sel->end(); *endpos = buffer()->utf8_align(*endpos); IS_UTF8_ALIGNED2(buffer(), (*endpos)) extended = 1; } } /* If the Fl_Text_Selection was extended due to a style change, and some of the fonts don't match in spacing, extend redraw area to end of line to redraw characters exposed by possible font size changes */ if ( extended ) *endpos = mBuffer->line_end( *endpos ) + 1; IS_UTF8_ALIGNED2(buffer(), (*endpos)) } /** \brief Draw the widget. This function tries to limit drawing to smaller areas if possible. */ void Fl_Text_Display_mod::draw(void) { // don't even try if there is no associated text buffer! if (!buffer()) { draw_box(); return; } fl_push_clip(x(),y(),w(),h()); // prevent drawing outside widget area // draw the non-text, non-scrollbar areas. if (damage() & FL_DAMAGE_ALL) { // printf("drawing all (box = %d)\n", box()); if (Fl_Surface_Device::surface()->class_name() == Fl_Printer::class_id) { // if to printer, draw the background fl_rectf(text_area.x, text_area.y, text_area.w, text_area.h, color() ); } // draw the box() int W = w(), H = h(); draw_box(box(), x(), y(), W, H, color()); if (mHScrollBar->visible()) W -= scrollbar_width(); if (mVScrollBar->visible()) H -= scrollbar_width(); // left margin fl_rectf(text_area.x-LEFT_MARGIN, text_area.y-TOP_MARGIN, LEFT_MARGIN, text_area.h+TOP_MARGIN+BOTTOM_MARGIN, color()); // right margin fl_rectf(text_area.x+text_area.w, text_area.y-TOP_MARGIN, RIGHT_MARGIN, text_area.h+TOP_MARGIN+BOTTOM_MARGIN, color()); // top margin fl_rectf(text_area.x, text_area.y-TOP_MARGIN, text_area.w, TOP_MARGIN, color()); // bottom margin fl_rectf(text_area.x, text_area.y+text_area.h, text_area.w, BOTTOM_MARGIN, color()); // draw that little box in the corner of the scrollbars if (mVScrollBar->visible() && mHScrollBar->visible()) fl_rectf(mVScrollBar->x(), mHScrollBar->y(), mVScrollBar->w(), mHScrollBar->h(), FL_GRAY); // blank the previous cursor protrusions } else if (damage() & (FL_DAMAGE_SCROLL | FL_DAMAGE_EXPOSE)) { // printf("blanking previous cursor extrusions at Y: %d\n", mCursorOldY); // CET - FIXME - save old cursor position instead and just draw side needed? fl_push_clip(text_area.x-LEFT_MARGIN, text_area.y, text_area.w+LEFT_MARGIN+RIGHT_MARGIN, text_area.h); fl_rectf(text_area.x-LEFT_MARGIN, mCursorOldY, LEFT_MARGIN, mMaxsize, color()); fl_rectf(text_area.x+text_area.w, mCursorOldY, RIGHT_MARGIN, mMaxsize, color()); fl_pop_clip(); } // draw the scrollbars if (damage() & (FL_DAMAGE_ALL | FL_DAMAGE_CHILD)) { mVScrollBar->damage(FL_DAMAGE_ALL); mHScrollBar->damage(FL_DAMAGE_ALL); } update_child(*mVScrollBar); update_child(*mHScrollBar); // draw all of the text if (damage() & (FL_DAMAGE_ALL | FL_DAMAGE_EXPOSE)) { //printf("drawing all text\n"); int X, Y, W, H; if (fl_clip_box(text_area.x, text_area.y, text_area.w, text_area.h, X, Y, W, H)) { // Draw text using the intersected clipping box... // (this sets the clipping internally) draw_text(X, Y, W, H); } else { // Draw the whole area... draw_text(text_area.x, text_area.y, text_area.w, text_area.h); } } else if (damage() & FL_DAMAGE_SCROLL) { // draw some lines of text fl_push_clip(text_area.x, text_area.y, text_area.w, text_area.h); //printf("drawing text from %d to %d\n", damage_range1_start, damage_range1_end); draw_range(damage_range1_start, damage_range1_end); if (damage_range2_end != -1) { //printf("drawing text from %d to %d\n", damage_range2_start, damage_range2_end); draw_range(damage_range2_start, damage_range2_end); } damage_range1_start = damage_range1_end = -1; damage_range2_start = damage_range2_end = -1; fl_pop_clip(); } // draw the text cursor if (damage() & (FL_DAMAGE_ALL | FL_DAMAGE_SCROLL | FL_DAMAGE_EXPOSE) && !buffer()->primary_selection()->selected() && mCursorOn && Fl::focus() == (Fl_Widget*)this ) { fl_push_clip(text_area.x-LEFT_MARGIN, text_area.y, text_area.w+LEFT_MARGIN+RIGHT_MARGIN, text_area.h); int X, Y = 0; if (position_to_xy(mCursorPos, &X, &Y)) draw_cursor(X, Y); // else puts("position_to_xy() failed - unable to draw cursor!"); //printf("drew cursor at pos: %d (%d,%d)\n", mCursorPos, X, Y); mCursorOldY = Y; fl_pop_clip(); } fl_pop_clip(); } // this processes drag events due to mouse for Fl_Text_Display_mod and // also drags due to cursor movement with shift held down for // Fl_Text_Editor_mod void fl_text_drag_me(int pos, Fl_Text_Display_mod* d) { if (d->dragType == Fl_Text_Display_mod::DRAG_CHAR) { if (pos >= d->dragPos) { d->buffer()->select(d->dragPos, pos); } else { d->buffer()->select(pos, d->dragPos); } d->insert_position(pos); } else if (d->dragType == Fl_Text_Display_mod::DRAG_WORD) { if (pos >= d->dragPos) { d->insert_position(d->word_end(pos)); d->buffer()->select(d->word_start(d->dragPos), d->word_end(pos)); } else { d->insert_position(d->word_start(pos)); d->buffer()->select(d->word_start(pos), d->word_end(d->dragPos)); } } else if (d->dragType == Fl_Text_Display_mod::DRAG_LINE) { if (pos >= d->dragPos) { d->insert_position(d->buffer()->line_end(pos)+1); d->buffer()->select(d->buffer()->line_start(d->dragPos), d->buffer()->line_end(pos)+1); } else { d->insert_position(d->buffer()->line_start(pos)); d->buffer()->select(d->buffer()->line_start(pos), d->buffer()->line_end(d->dragPos)+1); } } } /** \brief Timer callback for scroll events. This timer event scrolls the text view proportionally to how far the mouse pointer has left the text area. This allows for smooth scrolling without "wiggeling" the mouse. */ void Fl_Text_Display_mod::scroll_timer_cb(void *user_data) { Fl_Text_Display_mod *w = (Fl_Text_Display_mod*)user_data; int pos; switch (scroll_direction) { case 1: // mouse is to the right, scroll left w->scroll(w->mTopLineNum, w->mHorizOffset + scroll_amount); pos = w->xy_to_position(w->text_area.x + w->text_area.w, scroll_y, CURSOR_POS); break; case 2: // mouse is to the left, scroll right w->scroll(w->mTopLineNum, w->mHorizOffset + scroll_amount); pos = w->xy_to_position(w->text_area.x, scroll_y, CURSOR_POS); break; case 3: // mouse is above, scroll down w->scroll(w->mTopLineNum + scroll_amount, w->mHorizOffset); pos = w->xy_to_position(scroll_x, w->text_area.y, CURSOR_POS); break; case 4: // mouse is below, scroll up w->scroll(w->mTopLineNum + scroll_amount, w->mHorizOffset); pos = w->xy_to_position(scroll_x, w->text_area.y + w->text_area.h, CURSOR_POS); break; default: return; } fl_text_drag_me(pos, w); Fl::repeat_timeout(.1, scroll_timer_cb, user_data); } /** \brief Event handling. */ int Fl_Text_Display_mod::handle(int event) { if (!buffer()) return 0; // This isn't very elegant! if (!Fl::event_inside(text_area.x, text_area.y, text_area.w, text_area.h) && !dragging && event != FL_LEAVE && event != FL_ENTER && event != FL_MOVE && event != FL_FOCUS && event != FL_UNFOCUS && event != FL_KEYBOARD && event != FL_KEYUP) { return Fl_Group::handle(event); } switch (event) { case FL_ENTER: case FL_MOVE: if (active_r()) { if (Fl::event_inside(text_area.x, text_area.y, text_area.w, text_area.h)) window()->cursor(FL_CURSOR_INSERT); else window()->cursor(FL_CURSOR_DEFAULT); return 1; } else { return 0; } case FL_LEAVE: case FL_HIDE: if (active_r() && window()) { window()->cursor(FL_CURSOR_DEFAULT); return 1; } else { return 0; } case FL_PUSH: { if (active_r() && window()) { if (Fl::event_inside(text_area.x, text_area.y, text_area.w, text_area.h)) window()->cursor(FL_CURSOR_INSERT); else window()->cursor(FL_CURSOR_DEFAULT); } if (Fl::focus() != this) { Fl::focus(this); handle(FL_FOCUS); } if (Fl_Group::handle(event)) return 1; if (Fl::event_state()&FL_SHIFT) return handle(FL_DRAG); dragging = 1; int pos = xy_to_position(Fl::event_x(), Fl::event_y(), CURSOR_POS); dragPos = pos; if (buffer()->primary_selection()->includes(pos)) { dragType = DRAG_START_DND; return 1; } dragType = Fl::event_clicks(); if (dragType == DRAG_CHAR) { buffer()->unselect(); // Fl::copy("", 0, 0); /* removed for STR 2668 */ } else if (dragType == DRAG_WORD) { buffer()->select(word_start(pos), word_end(pos)); dragPos = word_start(pos); } if (buffer()->primary_selection()->selected()) insert_position(buffer()->primary_selection()->end()); else insert_position(pos); show_insert_position(); return 1; } case FL_DRAG: { if (dragType==DRAG_NONE) return 1; if (dragType==DRAG_START_DND) { if (!Fl::event_is_click() && Fl::dnd_text_ops()) { const char* copy = buffer()->selection_text(); Fl::dnd(); free((void*)copy); } return 1; } int X = Fl::event_x(), Y = Fl::event_y(), pos = insert_position(); // if we leave the text_area, we start a timer event // that will take care of scrolling and selecting if (Y < text_area.y) { scroll_x = X; scroll_amount = (Y - text_area.y) / 5 - 1; if (!scroll_direction) { Fl::add_timeout(.01, scroll_timer_cb, this); } scroll_direction = 3; } else if (Y >= text_area.y+text_area.h) { scroll_x = X; scroll_amount = (Y - text_area.y - text_area.h) / 5 + 1; if (!scroll_direction) { Fl::add_timeout(.01, scroll_timer_cb, this); } scroll_direction = 4; } else if (X < text_area.x) { scroll_y = Y; scroll_amount = (X - text_area.x) / 2 - 1; if (!scroll_direction) { Fl::add_timeout(.01, scroll_timer_cb, this); } scroll_direction = 2; } else if (X >= text_area.x+text_area.w) { scroll_y = Y; scroll_amount = (X - text_area.x - text_area.w) / 2 + 1; if (!scroll_direction) { Fl::add_timeout(.01, scroll_timer_cb, this); } scroll_direction = 1; } else { if (scroll_direction) { Fl::remove_timeout(scroll_timer_cb, this); scroll_direction = 0; } pos = xy_to_position(X, Y, CURSOR_POS); pos = buffer()->next_char(pos); } fl_text_drag_me(pos, this); return 1; } case FL_RELEASE: { if (Fl::event_is_click() && (! Fl::event_clicks()) && buffer()->primary_selection()->includes(dragPos) && !(Fl::event_state()&FL_SHIFT) ) { buffer()->unselect(); // clicking in the selection: unselect and move cursor insert_position(dragPos); return 1; } else if (Fl::event_clicks() == DRAG_LINE && Fl::event_button() == FL_LEFT_MOUSE) { buffer()->select(buffer()->line_start(dragPos), buffer()->next_char(buffer()->line_end(dragPos))); dragPos = line_start(dragPos); dragType = DRAG_CHAR; } else { dragging = 0; if (scroll_direction) { Fl::remove_timeout(scroll_timer_cb, this); scroll_direction = 0; } // convert from WORD or LINE selection to CHAR /*if (insert_position() >= dragPos) dragPos = buffer()->primary_selection()->start(); else dragPos = buffer()->primary_selection()->end();*/ dragType = DRAG_CHAR; } const char* copy = buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 0); free((void*)copy); return 1; } case FL_MOUSEWHEEL: if (Fl::event_dy()) return mVScrollBar->handle(event); else return mHScrollBar->handle(event); case FL_UNFOCUS: if (active_r() && window()) window()->cursor(FL_CURSOR_DEFAULT); case FL_FOCUS: if (buffer()->selected()) { int start, end; if (buffer()->selection_position(&start, &end)) redisplay_range(start, end); } if (buffer()->secondary_selected()) { int start, end; if (buffer()->secondary_selection_position(&start, &end)) redisplay_range(start, end); } if (buffer()->highlight()) { int start, end; if (buffer()->highlight_position(&start, &end)) redisplay_range(start, end); } return 1; case FL_KEYBOARD: // Copy? if ((Fl::event_state()&(FL_CTRL|FL_COMMAND)) && Fl::event_key()=='c') { if (!buffer()->selected()) return 1; const char *copy = buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 1); free((void*)copy); return 1; } // Select all ? if ((Fl::event_state()&(FL_CTRL|FL_COMMAND)) && Fl::event_key()=='a') { buffer()->select(0,buffer()->length()); const char *copy = buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 0); free((void*)copy); return 1; } if (mVScrollBar->handle(event)) return 1; if (mHScrollBar->handle(event)) return 1; break; case FL_SHORTCUT: if (!(shortcut() ? Fl::test_shortcut(shortcut()) : test_shortcut())) return 0; if (Fl::visible_focus() && handle(FL_FOCUS)) { Fl::focus(this); return 1; } break; } return 0; } /* Convert an x pixel position into a column number. */ double Fl_Text_Display_mod::x_to_col(double y) const { if (!mColumnScale) { mColumnScale = string_width("Mitg", 4, 'A') / 4.0; } return (y/mColumnScale)+0.5; } /** Convert a column number into an x pixel position. */ double Fl_Text_Display_mod::col_to_x(double col) const { if (!mColumnScale) { // recalculate column scale value x_to_col(0); } return col*mColumnScale; } // // End of "$Id: Fl_Text_Display_mod.cxx 8808 2011-06-16 13:31:25Z manolo $". // fldigi-3.21.80/src/widgets/progress.cxx0000664000175000017500000000632712313064025014677 00000000000000// // progress.cxx // // Progress bar widget routines. // // Based on Fl_Progress widget, Copyright 2000-2005 by Michael Sweet. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "progress.h" // // progress is a progress bar widget based off Fl_Widget that shows a // standard progress bar in either horizontal or vertical format // // if direction == VERTICAL the indicator goes from lower to upper // if direction == HORIZONTAL the indicator goes from left to right void Progress::draw() { int progress; // Size of progress bar... int bx, by, bw, bh; // Box areas... int tx, tw; // Temporary X + width // int ty, th; // Temporary Y + height int th; // Get the box borders... bx = Fl::box_dx(box()); by = Fl::box_dy(box()); bw = Fl::box_dw(box()); bh = Fl::box_dh(box()); tx = x() + bx; tw = w() - bw; // ty = y() + by; th = h() - bh; // Draw the progress bar... if (maximum_ > minimum_) progress = (int)((direction == HORIZONTAL ? tw : th) * (value_ - minimum_) / (maximum_ - minimum_) + 0.5f); else progress = 0; // Draw the box and label... if (progress > 0) { Fl_Color c = labelcolor(); labelcolor(fl_contrast(labelcolor(), color2())); if (direction == HORIZONTAL) { fl_clip(x(), y(), progress, h()); draw_box(box(), x(), y(), w(), h(), active_r() ? color2() : fl_inactive(color2())); draw_label(tx, y() + by, tw, h() - bh); fl_pop_clip(); labelcolor(c); fl_clip(x() + progress, y(), tw - progress, h()); draw_box(box(), x(), y(), w(), h(), active_r() ? color() : fl_inactive(color())); draw_label(tx, y() + by, tw, h() - bh); fl_pop_clip(); } else { fl_clip(x(), y(), w(), h() - progress); draw_box(box(), x(), y(), w(), h(), active_r() ? color() : fl_inactive(color())); // draw_label(tx, y() + by, tw, h() - bh); fl_pop_clip(); labelcolor(c); fl_clip(x(), y() + h() - progress, w(), progress ); draw_box(box(), x(), y(), w(), h(), active_r() ? color2() : fl_inactive(color2())); // draw_label(tx, y() + by, tw, h() - bh); fl_pop_clip(); } } else { draw_box(box(), x(), y(), w(), h(), color()); if (direction == HORIZONTAL) draw_label(tx, y() + by, tw, h() - bh); } } Progress::Progress(int X, int Y, int W, int H, const char* l) : Fl_Widget(X, Y, W, H, l) { align(FL_ALIGN_INSIDE); box(FL_DOWN_BOX); color(FL_BACKGROUND2_COLOR, FL_YELLOW); minimum(0.0f); maximum(100.0f); value(0.0f); direction = HORIZONTAL; } // // End of "$Id: Progress.cxx 4288 2005-04-16 00:13:17Z mike $". // fldigi-3.21.80/src/widgets/Fl_Text_Buffer_mod.cxx0000664000175000017500000013235212313064025016526 00000000000000// // "$Id: Fl_Text_Buffer_mod.cxx 8040 2010-12-15 17:38:39Z manolo $" // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #include #include #include #include #include #include #include "Fl_Text_Buffer_mod.H" /* This file is based on a port of NEdit to FLTK many years ago. NEdit at that point was already stretched beyond the task it was designed for which explains why the source code is sometimes pretty convoluted. It still is a very useful widget for FLTK, and we are thankful that the nedit team allowed us to integrate their code. With the introduction of Unicode and UTF-8, Fl_Text_... has to go into a whole new generation of code. Originally designed for monospaced fonts only, many features make less sense in the multibyte and multiwidth world of UTF-8. Columns are a good example. There is simply no such thing. The new Fl_Text_... widget converts columns to pixels by multiplying them with the average character width for a given font. Rectangular selections were rarely used (if at all) and make little sense when using variable width fonts. They have been removed. Using multiple spaces to emulate tab stops has been replaced by pixel counting routines. They are slower, but give the expected result for proportional fonts. And constantly recalculating character widths is just much too expensive. Lines of text are now subdivided into blocks of text which are measured at once instead of individual characters. */ #ifndef min static int max(int i1, int i2) { return i1 >= i2 ? i1 : i2; } static int min(int i1, int i2) { return i1 <= i2 ? i1 : i2; } #endif static char *undobuffer; static int undobufferlength; static Fl_Text_Buffer_mod *undowidget; static int undoat; // points after insertion static int undocut; // number of characters deleted there static int undoinsert; // number of characters inserted static int undoyankcut; // length of valid contents of buffer, even if undocut=0 /* Resize the undo buffer to match at least the requested size. */ static void undobuffersize(int n) { if (n > undobufferlength) { if (undobuffer) { do { undobufferlength *= 2; } while (undobufferlength < n); undobuffer = (char *) realloc(undobuffer, undobufferlength); } else { undobufferlength = n + 9; undobuffer = (char *) malloc(undobufferlength); } } } static void def_transcoding_warning_action(Fl_Text_Buffer_mod *text) { fl_alert("%s", text->file_encoding_warning_message); } /* Initialize all variables. */ Fl_Text_Buffer_mod::Fl_Text_Buffer_mod(int requestedSize, int preferredGapSize) { mLength = 0; mPreferredGapSize = preferredGapSize; mBuf = (char *) malloc(requestedSize + mPreferredGapSize); mGapStart = 0; mGapEnd = mPreferredGapSize; mTabDist = 8; mPrimary.mSelected = 0; mPrimary.mStart = mPrimary.mEnd = 0; mSecondary.mSelected = 0; mSecondary.mStart = mSecondary.mEnd = 0; mHighlight.mSelected = 0; mHighlight.mStart = mHighlight.mEnd = 0; mModifyProcs = NULL; mCbArgs = NULL; mNModifyProcs = 0; mNPredeleteProcs = 0; mPredeleteProcs = NULL; mPredeleteCbArgs = NULL; mCursorPosHint = 0; mCanUndo = 1; input_file_was_transcoded = 0; transcoding_warning_action = def_transcoding_warning_action; } /* Free all resources. */ Fl_Text_Buffer_mod::~Fl_Text_Buffer_mod() { free(mBuf); if (mNModifyProcs != 0) { delete[]mModifyProcs; delete[]mCbArgs; } if (mNPredeleteProcs != 0) { delete[]mPredeleteProcs; delete[]mPredeleteCbArgs; } } /* This function copies verbose whatever is in front and after the gap into a single buffer. */ char *Fl_Text_Buffer_mod::text() const { char *t = (char *) malloc(mLength + 1); memcpy(t, mBuf, mGapStart); memcpy(t+mGapStart, mBuf+mGapEnd, mLength - mGapStart); t[mLength] = '\0'; return t; } /* Set the text buffer to a new string. */ void Fl_Text_Buffer_mod::text(const char *t) { IS_UTF8_ALIGNED(t) call_predelete_callbacks(0, length()); /* Save information for redisplay, and get rid of the old buffer */ const char *deletedText = text(); int deletedLength = mLength; free((void *) mBuf); /* Start a new buffer with a gap of mPreferredGapSize at the end */ int insertedLength = strlen(t); mBuf = (char *) malloc(insertedLength + mPreferredGapSize); mLength = insertedLength; mGapStart = insertedLength; mGapEnd = mGapStart + mPreferredGapSize; memcpy(mBuf, t, insertedLength); /* Zero all of the existing selections */ update_selections(0, deletedLength, 0); /* Call the saved display routine(s) to update the screen */ call_modify_callbacks(0, deletedLength, insertedLength, 0, deletedText); free((void *) deletedText); } /* Creates a range of text to a new buffer and copies verbose from around the gap. */ char *Fl_Text_Buffer_mod::text_range(int start, int end) const { IS_UTF8_ALIGNED2(this, (start)) IS_UTF8_ALIGNED2(this, (end)) char *s = NULL; /* Make sure start and end are ok, and allocate memory for returned string. If start is bad, return "", if end is bad, adjust it. */ if (start < 0 || start > mLength) { s = (char *) malloc(1); s[0] = '\0'; return s; } if (end < start) { int temp = start; start = end; end = temp; } if (end > mLength) end = mLength; int copiedLength = end - start; s = (char *) malloc(copiedLength + 1); /* Copy the text from the buffer to the returned string */ if (end <= mGapStart) { memcpy(s, mBuf + start, copiedLength); } else if (start >= mGapStart) { memcpy(s, mBuf + start + (mGapEnd - mGapStart), copiedLength); } else { int part1Length = mGapStart - start; memcpy(s, mBuf + start, part1Length); memcpy(s + part1Length, mBuf + mGapEnd, copiedLength - part1Length); } s[copiedLength] = '\0'; return s; } /* Return a UCS-4 character at the given index. Pos must be at a character boundary. */ unsigned int Fl_Text_Buffer_mod::char_at(int pos) const { if (pos < 0 || pos >= mLength) return '\0'; IS_UTF8_ALIGNED2(this, (pos)) const char *src = address(pos); return fl_utf8decode(src, 0, 0); } /* Return a UTF-8 character at the given index. Pos must be at a character boundary. */ unsigned int Fl_Text_Buffer_mod::get_char_at(int pos, int &len) const { if (pos < 0 || pos >= mLength) return '\0'; IS_UTF8_ALIGNED2(this, (pos)) const char *src = address(pos); unsigned int code = 0; if (*src & 0x80) { fl_utf8decode(src, 0, &len); for (int i = 0; i < len && i < 4; i++) { code <<= 8; code |= (unsigned char)*(src + i) & 0xFF; } } else { code = *src; len = 1; } return code; } /* Return the raw byte at the given index. This function ignores all unicode encoding. */ char Fl_Text_Buffer_mod::byte_at(int pos) const { if (pos < 0 || pos >= mLength) return '\0'; const char *src = address(pos); return *src; } /* Insert some text at the given index. Pos must be at a character boundary. */ void Fl_Text_Buffer_mod::insert(int pos, const char *text) { IS_UTF8_ALIGNED2(this, (pos)) IS_UTF8_ALIGNED(text) /* check if there is actually any text */ if (!text || !*text) return; /* if pos is not contiguous to existing text, make it */ if (pos > mLength) pos = mLength; if (pos < 0) pos = 0; /* Even if nothing is deleted, we must call these callbacks */ call_predelete_callbacks(pos, 0); /* insert and redisplay */ int nInserted = insert_(pos, text); mCursorPosHint = pos + nInserted; IS_UTF8_ALIGNED2(this, (mCursorPosHint)) call_modify_callbacks(pos, 0, nInserted, 0, NULL); } /* Replace a range of text with new text. Start and end must be at a character boundary. */ void Fl_Text_Buffer_mod::replace(int start, int end, const char *text) { // Range check... if (!text) return; if (start < 0) start = 0; if (end > mLength) end = mLength; if (end < start) end = start; IS_UTF8_ALIGNED2(this, (start)) IS_UTF8_ALIGNED2(this, (end)) IS_UTF8_ALIGNED(text) call_predelete_callbacks(start, end - start); const char *deletedText = text_range(start, end); remove_(start, end); int nInserted = insert_(start, text); mCursorPosHint = start + nInserted; call_modify_callbacks(start, end - start, nInserted, 0, deletedText); free((void *) deletedText); } /* Remove a range of text. Start and End must be at a character boundary. */ void Fl_Text_Buffer_mod::remove(int start, int end) { /* Make sure the arguments make sense */ if (start > end) { int temp = start; start = end; end = temp; } if (start > mLength) start = mLength; if (start < 0) start = 0; if (end > mLength) end = mLength; if (end < 0) end = 0; IS_UTF8_ALIGNED2(this, (start)) IS_UTF8_ALIGNED2(this, (end)) if (start == end) return; call_predelete_callbacks(start, end - start); /* Remove and redisplay */ const char *deletedText = text_range(start, end); remove_(start, end); mCursorPosHint = start; call_modify_callbacks(start, end - start, 0, 0, deletedText); free((void *) deletedText); } /* Copy a range of text from another text buffer. fromStart, fromEnd, and toPos must be at a character boundary. */ void Fl_Text_Buffer_mod::copy(Fl_Text_Buffer_mod * fromBuf, int fromStart, int fromEnd, int toPos) { IS_UTF8_ALIGNED2(fromBuf, fromStart) IS_UTF8_ALIGNED2(fromBuf, fromEnd) IS_UTF8_ALIGNED2(this, (toPos)) int copiedLength = fromEnd - fromStart; /* Prepare the buffer to receive the new text. If the new text fits in the current buffer, just move the gap (if necessary) to where the text should be inserted. If the new text is too large, reallocate the buffer with a gap large enough to accomodate the new text and a gap of mPreferredGapSize */ if (copiedLength > mGapEnd - mGapStart) reallocate_with_gap(toPos, copiedLength + mPreferredGapSize); else if (toPos != mGapStart) move_gap(toPos); /* Insert the new text (toPos now corresponds to the start of the gap) */ if (fromEnd <= fromBuf->mGapStart) { memcpy(&mBuf[toPos], &fromBuf->mBuf[fromStart], copiedLength); } else if (fromStart >= fromBuf->mGapStart) { memcpy(&mBuf[toPos], &fromBuf->mBuf[fromStart + (fromBuf->mGapEnd - fromBuf->mGapStart)], copiedLength); } else { int part1Length = fromBuf->mGapStart - fromStart; memcpy(&mBuf[toPos], &fromBuf->mBuf[fromStart], part1Length); memcpy(&mBuf[toPos + part1Length], &fromBuf->mBuf[fromBuf->mGapEnd], copiedLength - part1Length); } mGapStart += copiedLength; mLength += copiedLength; update_selections(toPos, 0, copiedLength); } /* Take the previous changes and undo them. Return the previous cursor position in cursorPos. Returns 1 if the undo was applied. CursorPos will be at a character boundary. */ int Fl_Text_Buffer_mod::undo(int *cursorPos) { if (undowidget != this || (!undocut && !undoinsert && !mCanUndo)) return 0; int ilen = undocut; int xlen = undoinsert; int b = undoat - xlen; if (xlen && undoyankcut && !ilen) { ilen = undoyankcut; } if (xlen && ilen) { undobuffersize(ilen + 1); undobuffer[ilen] = 0; char *tmp = strdup(undobuffer); replace(b, undoat, tmp); if (cursorPos) *cursorPos = mCursorPosHint; free(tmp); } else if (xlen) { remove(b, undoat); if (cursorPos) *cursorPos = mCursorPosHint; } else if (ilen) { undobuffersize(ilen + 1); undobuffer[ilen] = 0; insert(undoat, undobuffer); if (cursorPos) *cursorPos = mCursorPosHint; undoyankcut = 0; } return 1; } /* Set a flag if undo function will work. */ void Fl_Text_Buffer_mod::canUndo(char flag) { mCanUndo = flag; // disabling undo also clears the last undo operation! if (!mCanUndo && undowidget==this) undowidget = 0; } /* Change the tab width. This will cause a couple of callbacks and a complete redisplay. Matt: I am not entirely sure why we need to trigger callbacks because tabs are only a graphical hint, not changing any text at all, but I leave this in here for back compatibility. */ void Fl_Text_Buffer_mod::tab_distance(int tabDist) { /* First call the pre-delete callbacks with the previous tab setting still active. */ call_predelete_callbacks(0, mLength); /* Change the tab setting */ mTabDist = tabDist; /* Force any display routines to redisplay everything (unfortunately, this means copying the whole buffer contents to provide "deletedText" */ const char *deletedText = text(); call_modify_callbacks(0, mLength, mLength, 0, deletedText); free((void *) deletedText); } /* Select a range of text. Start and End must be at a character boundary. */ void Fl_Text_Buffer_mod::select(int start, int end) { IS_UTF8_ALIGNED2(this, (start)) IS_UTF8_ALIGNED2(this, (end)) Fl_Text_Selection_mod oldSelection = mPrimary; mPrimary.set(start, end); redisplay_selection(&oldSelection, &mPrimary); } /* Clear the primary selection. */ void Fl_Text_Buffer_mod::unselect() { Fl_Text_Selection_mod oldSelection = mPrimary; mPrimary.mSelected = 0; redisplay_selection(&oldSelection, &mPrimary); } /* Return the primary selection range. */ int Fl_Text_Buffer_mod::selection_position(int *start, int *end) { return mPrimary.position(start, end); } /* Return a copy of the selected text. */ char *Fl_Text_Buffer_mod::selection_text() { return selection_text_(&mPrimary); } /* Remove the selected text. */ void Fl_Text_Buffer_mod::remove_selection() { remove_selection_(&mPrimary); } /* Replace the selected text. */ void Fl_Text_Buffer_mod::replace_selection(const char *text) { replace_selection_(&mPrimary, text); } /* Select text. Start and End must be at a character boundary. */ void Fl_Text_Buffer_mod::secondary_select(int start, int end) { Fl_Text_Selection_mod oldSelection = mSecondary; mSecondary.set(start, end); redisplay_selection(&oldSelection, &mSecondary); } /* Deselect text. */ void Fl_Text_Buffer_mod::secondary_unselect() { Fl_Text_Selection_mod oldSelection = mSecondary; mSecondary.mSelected = 0; redisplay_selection(&oldSelection, &mSecondary); } /* Return the selected range. */ int Fl_Text_Buffer_mod::secondary_selection_position(int *start, int *end) { return mSecondary.position(start, end); } /* Return a copy of the text in this selection. */ char *Fl_Text_Buffer_mod::secondary_selection_text() { return selection_text_(&mSecondary); } /* Remove the selected text. */ void Fl_Text_Buffer_mod::remove_secondary_selection() { remove_selection_(&mSecondary); } /* Replace selected text. */ void Fl_Text_Buffer_mod::replace_secondary_selection(const char *text) { replace_selection_(&mSecondary, text); } /* Highlight a range of text. Start and End must be at a character boundary. */ void Fl_Text_Buffer_mod::highlight(int start, int end) { Fl_Text_Selection_mod oldSelection = mHighlight; mHighlight.set(start, end); redisplay_selection(&oldSelection, &mHighlight); } /* Remove text highlighting. */ void Fl_Text_Buffer_mod::unhighlight() { Fl_Text_Selection_mod oldSelection = mHighlight; mHighlight.mSelected = 0; redisplay_selection(&oldSelection, &mHighlight); } /* Return position of highlight. */ int Fl_Text_Buffer_mod::highlight_position(int *start, int *end) { return mHighlight.position(start, end); } /* Return a copy of highlighted text. */ char *Fl_Text_Buffer_mod::highlight_text() { return selection_text_(&mHighlight); } /* Add a callback that is called whenever text is modified. */ void Fl_Text_Buffer_mod::add_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void *cbArg) { Fl_Text_Modify_Cb *newModifyProcs = new Fl_Text_Modify_Cb[mNModifyProcs + 1]; void **newCBArgs = new void *[mNModifyProcs + 1]; for (int i = 0; i < mNModifyProcs; i++) { newModifyProcs[i + 1] = mModifyProcs[i]; newCBArgs[i + 1] = mCbArgs[i]; } if (mNModifyProcs != 0) { delete[]mModifyProcs; delete[]mCbArgs; } newModifyProcs[0] = bufModifiedCB; newCBArgs[0] = cbArg; mNModifyProcs++; mModifyProcs = newModifyProcs; mCbArgs = newCBArgs; } /* Remove a callback. */ void Fl_Text_Buffer_mod::remove_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void *cbArg) { int i, toRemove = -1; /* find the matching callback to remove */ for (i = 0; i < mNModifyProcs; i++) { if (mModifyProcs[i] == bufModifiedCB && mCbArgs[i] == cbArg) { toRemove = i; break; } } if (toRemove == -1) { Fl::error ("Fl_Text_Buffer_mod::remove_modify_callback(): Can't find modify CB to remove"); return; } /* Allocate new lists for remaining callback procs and args (if any are left) */ mNModifyProcs--; if (mNModifyProcs == 0) { mNModifyProcs = 0; delete[]mModifyProcs; mModifyProcs = NULL; delete[]mCbArgs; mCbArgs = NULL; return; } Fl_Text_Modify_Cb *newModifyProcs = new Fl_Text_Modify_Cb[mNModifyProcs]; void **newCBArgs = new void *[mNModifyProcs]; /* copy out the remaining members and free the old lists */ for (i = 0; i < toRemove; i++) { newModifyProcs[i] = mModifyProcs[i]; newCBArgs[i] = mCbArgs[i]; } for (; i < mNModifyProcs; i++) { newModifyProcs[i] = mModifyProcs[i + 1]; newCBArgs[i] = mCbArgs[i + 1]; } delete[]mModifyProcs; delete[]mCbArgs; mModifyProcs = newModifyProcs; mCbArgs = newCBArgs; } /* Add a callback that is called before deleting text. */ void Fl_Text_Buffer_mod::add_predelete_callback(Fl_Text_Predelete_Cb bufPreDeleteCB, void *cbArg) { Fl_Text_Predelete_Cb *newPreDeleteProcs = new Fl_Text_Predelete_Cb[mNPredeleteProcs + 1]; void **newCBArgs = new void *[mNPredeleteProcs + 1]; for (int i = 0; i < mNPredeleteProcs; i++) { newPreDeleteProcs[i + 1] = mPredeleteProcs[i]; newCBArgs[i + 1] = mPredeleteCbArgs[i]; } if (!mNPredeleteProcs != 0) { delete[]mPredeleteProcs; delete[]mPredeleteCbArgs; } newPreDeleteProcs[0] = bufPreDeleteCB; newCBArgs[0] = cbArg; mNPredeleteProcs++; mPredeleteProcs = newPreDeleteProcs; mPredeleteCbArgs = newCBArgs; } /* Remove a callback. */ void Fl_Text_Buffer_mod::remove_predelete_callback(Fl_Text_Predelete_Cb bufPreDeleteCB, void *cbArg) { int i, toRemove = -1; /* find the matching callback to remove */ for (i = 0; i < mNPredeleteProcs; i++) { if (mPredeleteProcs[i] == bufPreDeleteCB && mPredeleteCbArgs[i] == cbArg) { toRemove = i; break; } } if (toRemove == -1) { Fl::error ("Fl_Text_Buffer_mod::remove_predelete_callback(): Can't find pre-delete CB to remove"); return; } /* Allocate new lists for remaining callback procs and args (if any are left) */ mNPredeleteProcs--; if (mNPredeleteProcs == 0) { mNPredeleteProcs = 0; delete[]mPredeleteProcs; mPredeleteProcs = NULL; delete[]mPredeleteCbArgs; mPredeleteCbArgs = NULL; return; } Fl_Text_Predelete_Cb *newPreDeleteProcs = new Fl_Text_Predelete_Cb[mNPredeleteProcs]; void **newCBArgs = new void *[mNPredeleteProcs]; /* copy out the remaining members and free the old lists */ for (i = 0; i < toRemove; i++) { newPreDeleteProcs[i] = mPredeleteProcs[i]; newCBArgs[i] = mPredeleteCbArgs[i]; } for (; i < mNPredeleteProcs; i++) { newPreDeleteProcs[i] = mPredeleteProcs[i + 1]; newCBArgs[i] = mPredeleteCbArgs[i + 1]; } delete[]mPredeleteProcs; delete[]mPredeleteCbArgs; mPredeleteProcs = newPreDeleteProcs; mPredeleteCbArgs = newCBArgs; } /* Return a copy of the line that contains a given index. Pos must be at a character boundary. */ char *Fl_Text_Buffer_mod::line_text(int pos) const { return text_range(line_start(pos), line_end(pos)); } /* Find the beginning of the line. */ int Fl_Text_Buffer_mod::line_start(int pos) const { if (!findchar_backward(pos, '\n', &pos)) return 0; return pos + 1; } /* Find the end of the line. */ int Fl_Text_Buffer_mod::line_end(int pos) const { if (!findchar_forward(pos, '\n', &pos)) pos = mLength; return pos; } /* Find the beginning of a word. NOT UNICODE SAFE. */ int Fl_Text_Buffer_mod::word_start(int pos) const { // FIXME: character is ucs-4 while (pos>0 && (isalnum(char_at(pos)) || char_at(pos) == '_')) { pos = prev_char(pos); } // FIXME: character is ucs-4 if (!(isalnum(char_at(pos)) || char_at(pos) == '_')) pos = next_char(pos); return pos; } /* ** Search backwards in buffer for characters in "searchChars", starting ** with the character BEFORE "startPos", returning the result in "foundPos" ** returns 1 if found, 0 if not. */ int Fl_Text_Buffer_mod::findchars_backward( int startPos, const char *searchChars, int *foundPos ) { int pos = startPos; const char *c; char ch = 0; if ( startPos == 0 ) { *foundPos = 0; return 0; } while ( pos > 0 ) { ch = byte_at(pos); for ( c = searchChars; *c != '\0'; c++ ) { if ( ch == *c ) { *foundPos = pos; return 1; } } pos = prev_char(pos); } *foundPos = 0; return 0; } /* Find the end of a word. NOT UNICODE SAFE. */ int Fl_Text_Buffer_mod::word_end(int pos) const { // FIXME: character is ucs-4 while (pos < length() && (isalnum(char_at(pos)) || char_at(pos) == '_')) { pos = next_char(pos); } return pos; } /* ** Search forwards in buffer for characters in "searchChars", starting ** with the character "startPos", and returning the result in "foundPos" ** returns 1 if found, 0 if not. */ int Fl_Text_Buffer_mod::findchars_forward( int startPos, const char *searchChars, int *foundPos ) { int pos = startPos; const char *c; char ch = 0; while ( pos < length() ) { ch = byte_at(pos); for ( c = searchChars; *c != '\0'; c++ ) { if ( ch == *c ) { *foundPos = pos; return 1; } } pos = next_char(pos); } *foundPos = length(); return 0; } /* Count the number of characters between two positions. */ int Fl_Text_Buffer_mod::count_displayed_characters(int lineStartPos, int targetPos) const { IS_UTF8_ALIGNED2(this, (lineStartPos)) IS_UTF8_ALIGNED2(this, (targetPos)) int charCount = 0; int pos = lineStartPos; while (pos < targetPos) { pos = next_char(pos); charCount++; } return charCount; } /* Skip ahead a number of characters from a given index. This function breaks early if it encounters a newline character. */ int Fl_Text_Buffer_mod::skip_displayed_characters(int lineStartPos, int nChars) { IS_UTF8_ALIGNED2(this, (lineStartPos)) int pos = lineStartPos; for (int charCount = 0; charCount < nChars && pos < mLength; charCount++) { unsigned int c = char_at(pos); if (c == '\n') return pos; pos = next_char(pos); } return pos; } /* Count the number of newline characters between start and end. startPos and endPos must be at a character boundary. This function is optimized for speed by not using UTF-8 calls. */ int Fl_Text_Buffer_mod::count_lines(int startPos, int endPos) const { IS_UTF8_ALIGNED2(this, (startPos)) IS_UTF8_ALIGNED2(this, (endPos)) int gapLen = mGapEnd - mGapStart; int lineCount = 0; int pos = startPos; while (pos < mGapStart) { if (pos == endPos) return lineCount; if (mBuf[pos++] == '\n') lineCount++; } while (pos < mLength) { if (pos == endPos) return lineCount; if (mBuf[pos++ + gapLen] == '\n') lineCount++; } return lineCount; } /* Skip to the first character, n lines ahead. StartPos must be at a character boundary. This function is optimized for speed by not using UTF-8 calls. */ int Fl_Text_Buffer_mod::skip_lines(int startPos, int nLines) { IS_UTF8_ALIGNED2(this, (startPos)) if (nLines == 0) return startPos; int gapLen = mGapEnd - mGapStart; int pos = startPos; int lineCount = 0; while (pos < mGapStart) { if (mBuf[pos++] == '\n') { lineCount++; if (lineCount == nLines) { IS_UTF8_ALIGNED2(this, (pos)) return pos; } } } while (pos < mLength) { if (mBuf[pos++ + gapLen] == '\n') { lineCount++; if (lineCount >= nLines) { IS_UTF8_ALIGNED2(this, (pos)) return pos; } } } IS_UTF8_ALIGNED2(this, (pos)) return pos; } /* Skip to the first character, n lines back. StartPos must be at a character boundary. This function is optimized for speed by not using UTF-8 calls. */ int Fl_Text_Buffer_mod::rewind_lines(int startPos, int nLines) { IS_UTF8_ALIGNED2(this, (startPos)) int pos = startPos - 1; if (pos <= 0) return 0; int gapLen = mGapEnd - mGapStart; int lineCount = -1; while (pos >= mGapStart) { if (mBuf[pos + gapLen] == '\n') { if (++lineCount >= nLines) { IS_UTF8_ALIGNED2(this, (pos+1)) return pos + 1; } } pos--; } while (pos >= 0) { if (mBuf[pos] == '\n') { if (++lineCount >= nLines) { IS_UTF8_ALIGNED2(this, (pos+1)) return pos + 1; } } pos--; } return 0; } /* Find a matching string in the buffer. */ int Fl_Text_Buffer_mod::search_forward(int startPos, const char *searchString, int *foundPos, int matchCase) const { IS_UTF8_ALIGNED2(this, (startPos)) IS_UTF8_ALIGNED(searchString) if (!searchString) return 0; int bp; const char *sp; if (matchCase) { while (startPos < length()) { bp = startPos; sp = searchString; for (;;) { char c = *sp; // we reached the end of the "needle", so we found the string! if (!c) { *foundPos = startPos; return 1; } int l = fl_utf8len1(c); if (memcmp(sp, address(bp), l)) break; sp += l; bp += l; } startPos = next_char(startPos); } } else { while (startPos < length()) { bp = startPos; sp = searchString; for (;;) { // we reached the end of the "needle", so we found the string! if (!*sp) { *foundPos = startPos; return 1; } int l; unsigned int b = char_at(bp); unsigned int s = fl_utf8decode(sp, 0, &l); if (fl_tolower(b)!=fl_tolower(s)) break; sp += l; bp = next_char(bp); } startPos = next_char(startPos); } } return 0; } int Fl_Text_Buffer_mod::search_backward(int startPos, const char *searchString, int *foundPos, int matchCase) const { IS_UTF8_ALIGNED2(this, (startPos)) IS_UTF8_ALIGNED(searchString) if (!searchString) return 0; int bp; const char *sp; if (matchCase) { while (startPos >= 0) { bp = startPos; sp = searchString; for (;;) { char c = *sp; // we reached the end of the "needle", so we found the string! if (!c) { *foundPos = startPos; return 1; } int l = fl_utf8len1(c); if (memcmp(sp, address(bp), l)) break; sp += l; bp += l; } startPos = prev_char(startPos); } } else { while (startPos >= 0) { bp = startPos; sp = searchString; for (;;) { // we reached the end of the "needle", so we found the string! if (!*sp) { *foundPos = startPos; return 1; } int l; unsigned int b = char_at(bp); unsigned int s = fl_utf8decode(sp, 0, &l); if (fl_tolower(b)!=fl_tolower(s)) break; sp += l; bp = next_char(bp); } startPos = prev_char(startPos); } } return 0; } /* Insert a string into the buffer. Pos must be at a character boundary. Text must be a correct UTF-8 string. */ int Fl_Text_Buffer_mod::insert_(int pos, const char *text) { if (!text || !*text) return 0; int insertedLength = strlen(text); /* Prepare the buffer to receive the new text. If the new text fits in the current buffer, just move the gap (if necessary) to where the text should be inserted. If the new text is too large, reallocate the buffer with a gap large enough to accomodate the new text and a gap of mPreferredGapSize */ if (insertedLength > mGapEnd - mGapStart) reallocate_with_gap(pos, insertedLength + mPreferredGapSize); else if (pos != mGapStart) move_gap(pos); /* Insert the new text (pos now corresponds to the start of the gap) */ memcpy(&mBuf[pos], text, insertedLength); mGapStart += insertedLength; mLength += insertedLength; update_selections(pos, 0, insertedLength); if (mCanUndo) { if (undowidget == this && undoat == pos && undoinsert) { undoinsert += insertedLength; } else { undoinsert = insertedLength; undoyankcut = (undoat == pos) ? undocut : 0; } undoat = pos + insertedLength; undocut = 0; undowidget = this; } return insertedLength; } /* Remove a string from the buffer. Unicode safe. Start and end must be at a character boundary. */ void Fl_Text_Buffer_mod::remove_(int start, int end) { /* if the gap is not contiguous to the area to remove, move it there */ if (mCanUndo) { if (undowidget == this && undoat == end && undocut) { undobuffersize(undocut + end - start + 1); memmove(undobuffer + end - start, undobuffer, undocut); undocut += end - start; } else { undocut = end - start; undobuffersize(undocut); } undoat = start; undoinsert = 0; undoyankcut = 0; undowidget = this; } if (start > mGapStart) { if (mCanUndo) memcpy(undobuffer, mBuf + (mGapEnd - mGapStart) + start, end - start); move_gap(start); } else if (end < mGapStart) { if (mCanUndo) memcpy(undobuffer, mBuf + start, end - start); move_gap(end); } else { int prelen = mGapStart - start; if (mCanUndo) { memcpy(undobuffer, mBuf + start, prelen); memcpy(undobuffer + prelen, mBuf + mGapEnd, end - start - prelen); } } /* expand the gap to encompass the deleted characters */ mGapEnd += end - mGapStart; mGapStart -= mGapStart - start; /* update the length */ mLength -= end - start; /* fix up any selections which might be affected by the change */ update_selections(start, end - start, 0); } /* simple setter. Unicode safe. Start and end must be at a character boundary. */ void Fl_Text_Selection_mod::set(int startpos, int endpos) { mSelected = startpos != endpos; mStart = min(startpos, endpos); mEnd = max(startpos, endpos); } /* simple getter. Unicode safe. Start and end will be at a character boundary. */ int Fl_Text_Selection_mod::position(int *startpos, int *endpos) const { if (!mSelected) return 0; *startpos = mStart; *endpos = mEnd; return 1; } /* Return if a position is inside the selected area. Unicode safe. Pos must be at a character boundary. */ int Fl_Text_Selection_mod::includes(int pos) const { return (selected() && pos >= start() && pos < end() ); } /* Return a duplicate of the selected text, or an empty string. Unicode safe. */ char *Fl_Text_Buffer_mod::selection_text_(Fl_Text_Selection_mod * sel) const { int start, end; /* If there's no selection, return an allocated empty string */ if (!sel->position(&start, &end)) { char *s = (char *) malloc(1); *s = '\0'; return s; } /* Return the selected range */ return text_range(start, end); } /* Remove the selected text. Unicode safe. */ void Fl_Text_Buffer_mod::remove_selection_(Fl_Text_Selection_mod * sel) { int start, end; if (!sel->position(&start, &end)) return; remove(start, end); //undoyankcut = undocut; } /* Replace selection with text. Unicode safe. */ void Fl_Text_Buffer_mod::replace_selection_(Fl_Text_Selection_mod * sel, const char *text) { Fl_Text_Selection_mod oldSelection = *sel; /* If there's no selection, return */ int start, end; if (!sel->position(&start, &end)) return; /* Do the appropriate type of replace */ replace(start, end, text); /* Unselect (happens automatically in BufReplace, but BufReplaceRect can't detect when the contents of a selection goes away) */ sel->mSelected = 0; redisplay_selection(&oldSelection, sel); } /* Call all callbacks. Unicode safe. */ void Fl_Text_Buffer_mod::call_modify_callbacks(int pos, int nDeleted, int nInserted, int nRestyled, const char *deletedText) const { IS_UTF8_ALIGNED2(this, pos) for (int i = 0; i < mNModifyProcs; i++) (*mModifyProcs[i]) (pos, nInserted, nDeleted, nRestyled, deletedText, mCbArgs[i]); } /* Call all callbacks. Unicode safe. */ void Fl_Text_Buffer_mod::call_predelete_callbacks(int pos, int nDeleted) const { for (int i = 0; i < mNPredeleteProcs; i++) (*mPredeleteProcs[i]) (pos, nDeleted, mPredeleteCbArgs[i]); } /* Redisplay a new selected area. Unicode safe. */ void Fl_Text_Buffer_mod::redisplay_selection(Fl_Text_Selection_mod * oldSelection, Fl_Text_Selection_mod * newSelection) const { int oldStart, oldEnd, newStart, newEnd, ch1Start, ch1End, ch2Start, ch2End; /* If either selection is rectangular, add an additional character to the end of the selection to request the redraw routines to wipe out the parts of the selection beyond the end of the line */ oldStart = oldSelection->mStart; newStart = newSelection->mStart; oldEnd = oldSelection->mEnd; newEnd = newSelection->mEnd; /* If the old or new selection is unselected, just redisplay the single area that is (was) selected and return */ if (!oldSelection->mSelected && !newSelection->mSelected) return; if (!oldSelection->mSelected) { call_modify_callbacks(newStart, 0, 0, newEnd - newStart, NULL); return; } if (!newSelection->mSelected) { call_modify_callbacks(oldStart, 0, 0, oldEnd - oldStart, NULL); return; } /* If the selections are non-contiguous, do two separate updates and return */ if (oldEnd < newStart || newEnd < oldStart) { call_modify_callbacks(oldStart, 0, 0, oldEnd - oldStart, NULL); call_modify_callbacks(newStart, 0, 0, newEnd - newStart, NULL); return; } /* Otherwise, separate into 3 separate regions: ch1, and ch2 (the two changed areas), and the unchanged area of their intersection, and update only the changed area(s) */ ch1Start = min(oldStart, newStart); ch2End = max(oldEnd, newEnd); ch1End = max(oldStart, newStart); ch2Start = min(oldEnd, newEnd); if (ch1Start != ch1End) call_modify_callbacks(ch1Start, 0, 0, ch1End - ch1Start, NULL); if (ch2Start != ch2End) call_modify_callbacks(ch2Start, 0, 0, ch2End - ch2Start, NULL); } /* Move the gap around without changing buffer content. Unicode safe. Pos must be at a character boundary. */ void Fl_Text_Buffer_mod::move_gap(int pos) { int gapLen = mGapEnd - mGapStart; if (pos > mGapStart) memmove(&mBuf[mGapStart], &mBuf[mGapEnd], pos - mGapStart); else memmove(&mBuf[pos + gapLen], &mBuf[pos], mGapStart - pos); mGapEnd += pos - mGapStart; mGapStart += pos - mGapStart; } /* Create a larger gap. Unicode safe. Start must be at a character boundary. */ void Fl_Text_Buffer_mod::reallocate_with_gap(int newGapStart, int newGapLen) { char *newBuf = (char *) malloc(mLength + newGapLen); int newGapEnd = newGapStart + newGapLen; if (newGapStart <= mGapStart) { memcpy(newBuf, mBuf, newGapStart); memcpy(&newBuf[newGapEnd], &mBuf[newGapStart], mGapStart - newGapStart); memcpy(&newBuf[newGapEnd + mGapStart - newGapStart], &mBuf[mGapEnd], mLength - mGapStart); } else { /* newGapStart > mGapStart */ memcpy(newBuf, mBuf, mGapStart); memcpy(&newBuf[mGapStart], &mBuf[mGapEnd], newGapStart - mGapStart); memcpy(&newBuf[newGapEnd], &mBuf[mGapEnd + newGapStart - mGapStart], mLength - newGapStart); } free((void *) mBuf); mBuf = newBuf; mGapStart = newGapStart; mGapEnd = newGapEnd; } /* Update selection range if characters were inserted. Unicode safe. Pos must be at a character boundary. */ void Fl_Text_Buffer_mod::update_selections(int pos, int nDeleted, int nInserted) { mPrimary.update(pos, nDeleted, nInserted); mSecondary.update(pos, nDeleted, nInserted); mHighlight.update(pos, nDeleted, nInserted); } // unicode safe, assuming the arguments are on character boundaries void Fl_Text_Selection_mod::update(int pos, int nDeleted, int nInserted) { if (!mSelected || pos > mEnd) return; if (pos + nDeleted <= mStart) { mStart += nInserted - nDeleted; mEnd += nInserted - nDeleted; } else if (pos <= mStart && pos + nDeleted >= mEnd) { mStart = pos; mEnd = pos; mSelected = 0; } else if (pos <= mStart && pos + nDeleted < mEnd) { mStart = pos; mEnd = nInserted + mEnd - nDeleted; } else if (pos < mEnd) { mEnd += nInserted - nDeleted; if (mEnd <= mStart) mSelected = 0; } } /* Find a UCS-4 character. StartPos must be at a character boundary, searchChar is UCS-4 encoded. */ int Fl_Text_Buffer_mod::findchar_forward(int startPos, unsigned searchChar, int *foundPos) const { if (startPos >= mLength) { *foundPos = mLength; return 0; } if (startPos<0) startPos = 0; for ( ; startPos mLength) startPos = mLength; for (startPos = prev_char(startPos); startPos>=0; startPos = prev_char(startPos)) { if (searchChar == char_at(startPos)) { *foundPos = startPos; return 1; } } *foundPos = 0; return 0; } //#define EXAMPLE_ENCODING // shows how to process any encoding for which a decoding function exists #ifdef EXAMPLE_ENCODING // returns the UCS equivalent of *p in CP1252 and advances p by 1 unsigned cp1252toucs(char* &p) { // Codes 0x80..0x9f from the Microsoft CP1252 character set, translated // to Unicode static unsigned cp1252[32] = { 0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x017d, 0x008f, 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x017e, 0x0178 }; unsigned char uc = *(unsigned char*)p; p++; return (uc < 0x80 || uc >= 0xa0 ? uc : cp1252[uc - 0x80]); } // returns the UCS equivalent of *p in UTF-16 and advances p by 2 (or more for surrogates) unsigned utf16toucs(char* &p) { union { #if WORDS_BIGENDIAN struct { unsigned char a, b;} chars; #else struct { unsigned char b, a;} chars; #endif U16 short_val; } u; u.chars.a = *(unsigned char*)p++; u.chars.b = *(unsigned char*)p++; return u.short_val; } // filter that produces, from an input stream fed by reading from fp, // a UTF-8-encoded output stream written in buffer. // Input can be any (e.g., 8-bit, UTF-16) encoding. // Output is true UTF-8. // p_trf points to a function that transforms encoded byte(s) into one UCS // and that increases the pointer by the adequate quantity static int general_input_filter(char *buffer, int buflen, char *line, int sline, char* &endline, unsigned (*p_trf)(char* &), FILE *fp) { char *p, *q, multibyte[5]; int lq, r, offset; p = endline = line; q = buffer; while (q < buffer + buflen) { if (p >= endline) { r = fread(line, 1, sline, fp); endline = line + r; if (r == 0) return q - buffer; p = line; } if (q + 4 /*max width of utf-8 char*/ > buffer + buflen) { memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } lq = fl_utf8encode( p_trf(p), multibyte ); memcpy(q, multibyte, lq); q += lq; } memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } #endif // EXAMPLE_ENCODING /* filter that produces, from an input stream fed by reading from fp, a UTF-8-encoded output stream written in buffer. Input can be UTF-8. If it is not, it is decoded with CP1252. Output is UTF-8. *input_was_changed is set to true if the input was not strict UTF-8 so output differs from input. */ static int utf8_input_filter(char *buffer, int buflen, char *line, int sline, char* &endline, FILE *fp, int *input_was_changed) { char *p, *q, multibyte[5]; int l, lp, lq, r; unsigned u; p = endline = line; q = buffer; while (q < buffer + buflen) { if (p >= endline) { r = fread(line, 1, sline, fp); endline = line + r; if (r == 0) return q - buffer; p = line; } l = fl_utf8len1(*p); if (p + l > endline) { memmove(line, p, endline - p); endline -= (p - line); r = fread(endline, 1, sline - (endline - line), fp); endline += r; p = line; if (endline - line < l) break; } while ( l > 0) { u = fl_utf8decode(p, p+l, &lp); lq = fl_utf8encode(u, multibyte); if (lp != l || lq != l) *input_was_changed = true; if (q + lq > buffer + buflen) { memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } memcpy(q, multibyte, lq); q += lq; p += lp; l -= lp; } } memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } const char *Fl_Text_Buffer_mod::file_encoding_warning_message = "Displayed text contains the UTF-8 transcoding\n" "of the input file which was not UTF-8 encoded.\n" "Some changes may have occurred."; /* Insert text from a file. Input file can be of various encodings according to what input fiter is used. utf8_input_filter accepts UTF-8 or CP1252 as input encoding. Output is always UTF-8. */ int Fl_Text_Buffer_mod::insertfile(const char *file, int pos, int buflen) { FILE *fp; if (!(fp = fl_fopen(file, "r"))) return 1; char *buffer = new char[buflen + 1]; char *endline, line[100]; int l; input_file_was_transcoded = false; endline = line; while (true) { #ifdef EXAMPLE_ENCODING // example of 16-bit encoding: UTF-16 l = general_input_filter(buffer, buflen, line, sizeof(line), endline, utf16toucs, // use cp1252toucs to read CP1252-encoded files fp); input_file_was_transcoded = true; #else l = utf8_input_filter(buffer, buflen, line, sizeof(line), endline, fp, &input_file_was_transcoded); #endif if (l == 0) break; buffer[l] = 0; insert(pos, buffer); pos += l; } int e = ferror(fp) ? 2 : 0; fclose(fp); delete[]buffer; if ( (!e) && input_file_was_transcoded && transcoding_warning_action) { transcoding_warning_action(this); } return e; } /* Write text to file. Unicode safe. */ int Fl_Text_Buffer_mod::outputfile(const char *file, int start, int end, int buflen) { FILE *fp; if (!(fp = fl_fopen(file, "w"))) return 1; for (int n; (n = min(end - start, buflen)); start += n) { const char *p = text_range(start, start + n); int r = fwrite(p, 1, n, fp); free((void *) p); if (r != n) break; } int e = ferror(fp) ? 2 : 0; fclose(fp); return e; } /* Return the previous character position. Unicode safe. */ int Fl_Text_Buffer_mod::prev_char_clipped(int pos) const { if (pos<=0) return 0; IS_UTF8_ALIGNED2(this, (pos)) char c; do { pos--; if (pos==0) return 0; c = byte_at(pos); } while ( (c&0xc0) == 0x80); IS_UTF8_ALIGNED2(this, (pos)) return pos; } /* Return the previous character position. Returns -1 if the beginning of the buffer is reached. */ int Fl_Text_Buffer_mod::prev_char(int pos) const { if (pos==0) return -1; return prev_char_clipped(pos); } /* Return the next character position. Returns length() if the end of the buffer is reached. */ int Fl_Text_Buffer_mod::next_char(int pos) const { IS_UTF8_ALIGNED2(this, (pos)) int n = fl_utf8len1(byte_at(pos)); pos += n; if (pos>=mLength) return mLength; IS_UTF8_ALIGNED2(this, (pos)) return pos; } /* Return the next character position. If the end of the buffer is reached, it returns the current position. */ int Fl_Text_Buffer_mod::next_char_clipped(int pos) const { return next_char(pos); } /* Align an index to the current UTF-8 boundary. */ int Fl_Text_Buffer_mod::utf8_align(int pos) const { char c = byte_at(pos); while ( (c&0xc0) == 0x80) { pos--; c = byte_at(pos); } return pos; } // // End of "$Id: Fl_Text_Buffer_mod.cxx 8040 2010-12-15 17:38:39Z manolo $". // fldigi-3.21.80/src/widgets/FTextView.cxx0000664000175000017500000005666212313064025014727 00000000000000// ---------------------------------------------------------------------------- // FTextView.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // Copyright (C) 2008-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include "flmisc.h" #include "fileselect.h" #include "font_browser.h" #include "ascii.h" #include "icons.h" #include "gettext.h" #include "FTextView.h" #include "debug.h" using namespace std; /// FTextBase constructor. /// Word wrapping is enabled by default at column 80, but see \c reset_wrap_col. /// @param x /// @param y /// @param w /// @param h /// @param l FTextBase::FTextBase(int x, int y, int w, int h, const char *l) : Fl_Text_Editor_mod(x, y, w, h, l), wrap(true), wrap_col(80), max_lines(0), scroll_hint(false) { oldw = oldh = olds = -1; oldf = (Fl_Font)-1; textfont(FL_COURIER); textsize(FL_NORMAL_SIZE); textcolor(FL_FOREGROUND_COLOR); tbuf = new Fl_Text_Buffer_mod; sbuf = new Fl_Text_Buffer_mod; buffer(tbuf); highlight_data(sbuf, styles, NATTR, FTEXT_DEF, 0, 0); cursor_style(Fl_Text_Editor_mod::NORMAL_CURSOR); wrap_mode(wrap, wrap_col); restore_wrap = wrap; // wrap_restore = true; // Do we want narrower scrollbars? The default width is 16. // scrollbar_width((int)floor(scrollbar_width() * 3.0/4.0)); reset_styles(SET_FONT | SET_SIZE | SET_COLOR); } void FTextBase::clear() { tbuf->text(""); sbuf->text(""); set_word_wrap(restore_wrap); } int FTextBase::handle(int event) { if (event == FL_MOUSEWHEEL && !Fl::event_inside(this)) return 1; // Fl_Text_Editor::handle() calls window()->cursor(FL_CURSOR_DONE) when // it receives an FL_KEYBOARD event, which crashes some buggy X drivers // (e.g. Intel on the Asus Eee PC). Call handle_key directly to work // around this problem. if (event == FL_KEYBOARD) return Fl_Text_Editor_mod::handle_key(); else return Fl_Text_Editor_mod::handle(event); } /// @see FTextRX::add /// /// @param s /// @param attr /// void FTextBase::add(const char *s, int attr) { // handle the text attribute first int n = strlen(s); char a[n + 1]; memset(a, FTEXT_DEF + attr, n); a[n] = '\0'; sbuf->replace(insert_position(), insert_position() + n, a); insert(s); } /// @see FTextBase::add /// /// @param s /// @param attr /// void FTextBase::add(unsigned char c, int attr) { char s[] = { (char)(FTEXT_DEF + attr), '\0' }; sbuf->replace(insert_position(), insert_position() + 1, s); s[0] = c; insert(s); } void FTextBase::set_word_wrap(bool b, bool b2) { wrap_mode((wrap = b), wrap_col); if (b2) restore_wrap = wrap; show_insert_position(); } void FTextBase::setFont(Fl_Font f, int attr) { set_style(attr, f, textsize(), textcolor(), SET_FONT); } void FTextBase::setFontSize(int s, int attr) { set_style(attr, textfont(), s, textcolor(), SET_SIZE); } void FTextBase::setFontColor(Fl_Color c, int attr) { set_style(attr, textfont(), textsize(), c, SET_COLOR); } /// Resizes the text widget. /// The real work is done by \c Fl_Text_Editor_mod::resize or, if \c HSCROLLBAR_KLUDGE /// is defined, a version of that code modified so that no horizontal /// scrollbars are displayed when word wrapping. /// /// @param X /// @param Y /// @param W /// @param H /// void FTextBase::resize(int X, int Y, int W, int H) { bool need_wrap_reset = false; bool need_margin_reset = false; if (unlikely(text_area.w != oldw)) { oldw = text_area.w; need_wrap_reset = true; } if (unlikely(text_area.h != oldh)) { oldh = text_area.h; need_margin_reset = true; } if (unlikely(textfont() != oldf || textsize() != olds)) { oldf = textfont(); olds = textsize(); need_wrap_reset = need_margin_reset = true; } if (need_wrap_reset) reset_wrap_col(); TOP_MARGIN = DEFAULT_TOP_MARGIN; int r = H - Fl::box_dh(box()) - TOP_MARGIN - BOTTOM_MARGIN; if (mHScrollBar->visible()) r -= scrollbar_width(); int msize = mMaxsize ? mMaxsize : textsize(); if (!msize) msize = 1; //printf("H %d, textsize %d, lines %d, extra %d\n", r, msize, r / msize, r % msize); if (r %= msize) TOP_MARGIN += r; if (scroll_hint) { mTopLineNumHint = mNBufferLines; mHorizOffsetHint = 0; // display_insert_position_hint = 1; scroll_hint = false; } bool hscroll_visible = mHScrollBar->visible(); Fl_Text_Editor_mod::resize(X, Y, W, H); if (hscroll_visible != mHScrollBar->visible()) oldh = 0; // reset margins next time } /// Checks the new widget height. /// This is registered with Fl_Tile_check and then called with horizontal /// and vertical size increments every time the Fl_Tile boundary is moved. /// /// @param arg The callback argument; should be a pointer to a FTextBase object /// @param xd The horizontal increment (ignored) /// @param yd The vertical increment /// /// @return True if the widget is visible, and the new text area height would be /// a multiple of the font height. /// bool FTextBase::wheight_mult_tsize(void *arg, int, int yd) { FTextBase *v = reinterpret_cast(arg); if (!v->visible()) return true; return v->mMaxsize > 0 && (v->text_area.h + yd) % v->mMaxsize == 0; } /// Changes text style attributes /// /// @param attr The attribute name to change, or \c NATTR to change all styles. /// @param f The new font /// @param s The new font size /// @param c The new font color /// @param set One or more (OR'd together) SET operations; @see set_style_op_e /// void FTextBase::set_style(int attr, Fl_Font f, int s, Fl_Color c, int set) { int start, end; if (attr == NATTR) { // update all styles start = 0; end = NATTR; if (set & SET_FONT) Fl_Text_Display_mod::textfont(f); if (set & SET_SIZE) textsize(s); if (set & SET_COLOR) textcolor(c); } else { start = attr; end = start + 1; } for (int i = start; i < end; i++) { styles[i].attr = 0; if (set & SET_FONT) styles[i].font = f; if (set & SET_SIZE) styles[i].size = s; if (set & SET_COLOR) styles[i].color = c; if (i == SKIP) // clickable styles always same as SKIP for now for (int j = CLICK_START; j < NATTR; j++) memcpy(&styles[j], &styles[i], sizeof(styles[j])); } if (set & SET_COLOR) mCursor_color = styles[0].color; resize(x(), y(), w(), h()); // to redraw and recalculate the wrap column } /// Reads a file and inserts its contents. /// change all occurrences of ^ to ^^ to prevent get_tx_char from /// treating the carat as a control sequence, ie: ^r ^R ^t ^T ^L ^C /// get_tx_char passes ^^ as a single ^ /// /// @return 0 on success, -1 on error int FTextBase::readFile(const char* fn) { set_word_wrap(restore_wrap); if ( !(fn || (fn = FSEL::select(_("Insert text"), "Text\t*.txt"))) ) return -1; int ret = 0, pos = insert_position(); #ifdef __WOE32__ FILE* tfile = fopen(fn, "rt"); #else FILE* tfile = fopen(fn, "r"); #endif if (!tfile) return -1; char buf[BUFSIZ+1]; std::string newbuf; size_t p; memset(buf, 0, BUFSIZ+1); if (pos == tbuf->length()) { // optimise for append while (fgets(buf, sizeof(buf), tfile)) { newbuf = buf; p = 0; while ((p = newbuf.find('^',p)) != string::npos) { newbuf.insert(p, "^"); p += 2; } tbuf->append(newbuf.c_str()); memset(buf, 0, BUFSIZ+1); } if (ferror(tfile)) ret = -1; pos = tbuf->length(); } else { while (fgets(buf, sizeof(buf), tfile)) { newbuf = buf; p = 0; while ((p = newbuf.find('^',p)) != string::npos) { newbuf.insert(p, "^"); p += 2; } tbuf->insert(pos, newbuf.c_str()); pos += strlen(buf); memset(buf, 0, BUFSIZ+1); } if (ferror(tfile)) ret = -1; } fclose(tfile); insert_position(pos); show_insert_position(); return ret; } /// Writes all buffer text out to a file. /// /// void FTextBase::saveFile(void) { const char *fn = FSEL::saveas(_("Save text as"), "Text\t*.txt"); if (fn) { #ifdef __WOE32__ ofstream tfile(fn); if (!tfile) return; char *p1, *p2, *text = tbuf->text(); for (p1 = p2 = text; *p1; p1 = p2) { while (*p2 != '\0' && *p2 != '\n') p2++; if (*p2 == '\n') { *p2 = '\0'; tfile << p1 << "\r\n"; p2++; } else tfile << p1; } free(text); #else tbuf->outputfile(fn, 0, tbuf->length()); #endif } } /// Returns a character string containing the selected word, if any, /// or the word at (\a x, \a y) relative to the widget's \c x() and \c y(). /// If \a ontext is true, this function will return text only if the /// mouse cursor position is inside the text range. /// /// @param x /// @param y /// /// @return The selection, or the word text at (x,y). Must be freed by the caller. /// char* FTextBase::get_word(int x, int y, const char* nwchars, bool ontext) { int p = xy_to_position(x + this->x(), y + this->y(), Fl_Text_Display_mod::CURSOR_POS); int start, end; if (tbuf->selected()) { if (ontext && tbuf->selection_position(&start, &end) && (p < start || p >= end)) return 0; else return tbuf->selection_text(); } string nonword = nwchars; nonword.append(" \t\n"); if (!tbuf->findchars_backward(p, nonword.c_str(), &start)) start = 0; else start++; if (!tbuf->findchars_forward(p, nonword.c_str(), &end)) end = tbuf->length(); if (ontext && (p < start || p >= end)) return 0; else return tbuf->text_range(start, end); } /// Initialised the menu pointed to by \c context_menu. The menu items' user_data /// field is used to store the initialisation flag. void FTextBase::init_context_menu(void) { for (int i = 0; i < context_menu->size() - 1; i++) { if (context_menu[i].user_data() == 0 && context_menu[i].labeltype() == _FL_MULTI_LABEL) { set_icon_label(&context_menu[i]); context_menu[i].user_data(this); } } } /// Displays the menu pointed to by \c context_menu and calls the menu function; /// @see call_cb. /// void FTextBase::show_context_menu(void) { const Fl_Menu_Item *m; int xpos = Fl::event_x(); int ypos = Fl::event_y(); popx = xpos - x(); popy = ypos - y(); window()->cursor(FL_CURSOR_DEFAULT); m = context_menu->popup(xpos, ypos, 0, 0, 0); if (m) menu_cb(m - context_menu); } /// Recalculates the wrap margin when the font is changed or the widget resized. /// Line wrapping works with proportional fonts but may be very slow. /// int FTextBase::reset_wrap_col(void) { if (!wrap || text_area.w == 0) return wrap_col; int old_wrap_col = wrap_col; if (Font_Browser::fixed_width(textfont())) { fl_font(textfont(), textsize()); wrap_col = (int)floorf(text_area.w / fl_width('X')); } else // use slower (but accurate) wrapping for variable width fonts wrap_col = 0; // wrap_mode triggers a resize; don't call it if wrap_col hasn't changed if (old_wrap_col != wrap_col) wrap_mode(wrap, wrap_col); return old_wrap_col; } void FTextBase::reset_styles(int set) { set_style(NATTR, FL_COURIER, FL_NORMAL_SIZE, FL_FOREGROUND_COLOR, set); set_style(XMIT, FL_COURIER, FL_NORMAL_SIZE, FL_RED, set); set_style(CTRL, FL_COURIER, FL_NORMAL_SIZE, FL_DARK_GREEN, set); set_style(SKIP, FL_COURIER, FL_NORMAL_SIZE, FL_BLUE, set); set_style(ALTR, FL_COURIER, FL_NORMAL_SIZE, FL_DARK_MAGENTA, set); } // ---------------------------------------------------------------------------- Fl_Menu_Item FTextView::menu[] = { { make_icon_label(_("Copy"), edit_copy_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Clear"), edit_clear_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Select All"), edit_select_all_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { make_icon_label(_("Save as..."), save_as_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { _("Word wrap"), 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL }, { 0 } }; /// FTextView constructor. /// We remove \c Fl_Text_Display_mod::buffer_modified_cb from the list of callbacks /// because we want to scroll depending on the visibility of the last line; @see /// changed_cb. /// @param x /// @param y /// @param w /// @param h /// @param l FTextView::FTextView(int x, int y, int w, int h, const char *l) : FTextBase(x, y, w, h, l), quick_entry(false) { tbuf->remove_modify_callback(buffer_modified_cb, this); tbuf->add_modify_callback(changed_cb, this); tbuf->canUndo(0); // disable some keybindings that are not allowed in FTextView buffers change_keybindings(); context_menu = menu; init_context_menu(); } /// Handles fltk events for this widget. /// We only care about mouse presses (to display the popup menu and prevent /// pasting) and keyboard events (to make sure no text can be inserted). /// Everything else is passed to the base class handle(). /// /// @param event /// /// @return /// int FTextView::handle(int event) { switch (event) { case FL_PUSH: if (!Fl::event_inside(this)) break; if (Fl::event_button() == FL_RIGHT_MOUSE) { handle_context_menu(); return 1; } break; case FL_DRAG: if (Fl::event_button() != FL_LEFT_MOUSE) return 1; break; // catch some text-modifying events that are not handled by kf_* functions case FL_KEYBOARD: int k; if (Fl::compose(k)) return 1; k = Fl::event_key(); if (k == FL_BackSpace) return 1; else if (k == FL_Tab) return Fl_Widget::handle(event); } return FTextBase::handle(event); } void FTextView::handle_context_menu(void) { set_active(&menu[VIEW_MENU_COPY], tbuf->selected()); set_active(&menu[VIEW_MENU_CLEAR], tbuf->length()); set_active(&menu[VIEW_MENU_SELECT_ALL], tbuf->length()); set_active(&menu[VIEW_MENU_SAVE], tbuf->length()); if (wrap) menu[VIEW_MENU_WRAP].set(); else menu[VIEW_MENU_WRAP].clear(); show_context_menu(); } /// The context menu handler /// /// @param val /// void FTextView::menu_cb(size_t item) { switch (item) { case VIEW_MENU_COPY: kf_copy(Fl::event_key(), this); break; case VIEW_MENU_CLEAR: clear(); break; case VIEW_MENU_SELECT_ALL: tbuf->select(0, tbuf->length()); break; case VIEW_MENU_SAVE: saveFile(); break; case VIEW_MENU_WRAP: set_word_wrap(!wrap, true); break; } } /// Scrolls down if the buffer has been modified and the last line is /// visible. See Fl_Text_Buffer::add_modify_callback() for parameter details. /// /// @param pos /// @param nins /// @param ndel /// @param nsty /// @param dtext /// @param arg /// inline void FTextView::changed_cb(int pos, int nins, int ndel, int nsty, const char *dtext, void *arg) { FTextView *v = reinterpret_cast(arg); if (v->mTopLineNum + v->mNVisibleLines - 1 == v->mNBufferLines) v->scroll_hint = true; v->buffer_modified_cb(pos, nins, ndel, nsty, dtext, v); } /// Removes Fl_Text_Edit keybindings that would modify text and put it out of /// sync with the style buffer. At some point we may decide that we want /// FTextView to be editable (e.g., to insert comments about a QSO), in which /// case we'll keep the keybindings and add some code to changed_cb to update /// the style buffer. /// void FTextView::change_keybindings(void) { Fl_Text_Editor_mod::Key_Func fdelete[] = { Fl_Text_Editor_mod::kf_default, Fl_Text_Editor_mod::kf_enter, Fl_Text_Editor_mod::kf_delete, Fl_Text_Editor_mod::kf_cut, Fl_Text_Editor_mod::kf_paste }; int n = sizeof(fdelete) / sizeof(fdelete[0]); // walk the keybindings linked list and delete items containing elements // of fdelete loop: for (Fl_Text_Editor_mod::Key_Binding *k = key_bindings; k; k = k->next) { for (int i = 0; i < n; i++) { if (k->function == fdelete[i]) { remove_key_binding(k->key, k->state); goto loop; } } } } // ---------------------------------------------------------------------------- Fl_Menu_Item FTextEdit::menu[] = { { make_icon_label(_("Cut"), edit_cut_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Copy"), edit_copy_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Paste"), edit_paste_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { make_icon_label(_("Clear"), edit_clear_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { make_icon_label(_("Insert file..."), file_open_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { _("Word wrap"), 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL } , { 0 } }; FTextEdit::FTextEdit(int x, int y, int w, int h, const char *l) : FTextBase(x, y, w, h, l) { tbuf->remove_modify_callback(buffer_modified_cb, this); tbuf->add_modify_callback(changed_cb, this); ascii_cnt = 0; ascii_chr = 0; context_menu = menu; init_context_menu(); dnd_paste = false; } /// Handles fltk events for this widget. /// We pass keyboard events to handle_key() and handle mouse3 presses to show /// the popup menu. We also disallow mouse2 events in the transmitted text area. /// Everything else is passed to the base class handle(). /// /// @param event /// /// @return /// int FTextEdit::handle(int event) { if ( !(Fl::event_inside(this) || (event == FL_KEYBOARD && Fl::focus() == this)) ) return FTextBase::handle(event); switch (event) { case FL_KEYBOARD: return handle_key(Fl::event_key()) ? 1 : FTextBase::handle(event); case FL_DND_RELEASE: dnd_paste = true; // fall through case FL_DND_ENTER: case FL_DND_LEAVE: return 1; case FL_DND_DRAG: return handle_dnd_drag(xy_to_position(Fl::event_x(), Fl::event_y(), CHARACTER_POS)); case FL_PASTE: { int r = dnd_paste ? handle_dnd_drop() : FTextBase::handle(event); dnd_paste = false; return r; } case FL_PUSH: { int eb = Fl::event_button(); if (eb == FL_RIGHT_MOUSE) { handle_context_menu(); return 1; } } default: break; } return FTextBase::handle(event); } /// Handles keyboard events to override Fl_Text_Editor_mod's handling of some /// keystrokes. /// /// @param key /// /// @return /// int FTextEdit::handle_key(int key) { // read ctl-ddd, where d is a digit, as ascii characters (in base 10) // and insert verbatim; e.g. ctl-001 inserts a if (key == FL_Control_L || key == FL_Control_R) return 0; bool t1 = isdigit(key); bool t2 = false; if (key >= FL_KP) t2 = isdigit(key - FL_KP + '0'); bool t3 = (Fl::event_state() & FL_CTRL) == FL_CTRL; if (t3 && (t1 || t2)) return handle_key_ascii(key); ascii_cnt = 0; // restart the numeric keypad entries. ascii_chr = 0; return 0; } /// Composes ascii characters and adds them to the FTextEdit buffer. /// Control characters are inserted with the CTRL style. Values larger than 127 /// (0x7f) are ignored. We cannot really add NULs for the time being. /// /// @param key A digit character /// /// @return 1 /// int FTextEdit::handle_key_ascii(int key) { if (key >= FL_KP) key -= FL_KP; key -= '0'; ascii_cnt++; for (int i = 0; i < 3 - ascii_cnt; i++) key *= 10; ascii_chr += key; if (ascii_cnt == 3) { if (ascii_chr < 0x100) //0x7F) add(ascii_chr, (iscntrl(ascii_chr) ? CTRL : RECV)); ascii_cnt = ascii_chr = 0; } return 1; } /// Handles FL_DND_DRAG events by scrolling and moving the cursor /// /// @return 1 int FTextEdit::handle_dnd_drag(int pos) { // Scroll if the pointer is being dragged inside the scrollbars, // otherwise obtain keyboard focus and set the insert position. if (mVScrollBar->visible() && Fl::event_inside(mVScrollBar)) mVScrollBar->handle(FL_DRAG); else if (mHScrollBar->visible() && Fl::event_inside(mHScrollBar)) mHScrollBar->handle(FL_DRAG); else { if (Fl::focus() != this) take_focus(); insert_position(pos); } return 1; } /// Handles FL_PASTE events by inserting text /// /// @return 1 or FTextBase::handle(FL_PASTE) int FTextEdit::handle_dnd_drop(void) { // paste verbatim if the shift key was held down during dnd if (Fl::event_shift()) return FTextBase::handle(FL_PASTE); string text; string::size_type p, len; text = Fl::event_text(); const char sep[] = "\n"; #if defined(__APPLE__) || defined(__WOE32__) text += sep; #endif len = text.length(); while ((p = text.find(sep)) != string::npos) { text[p] = '\0'; #if !defined(__APPLE__) && !defined(__WOE32__) if (text.find("file://") == 0) { text.erase(0, 7); p -= 7; len -= 7; } #endif // paste everything verbatim if we cannot read the first file LOG_INFO("DnD file %s", text.c_str()); if (readFile(text.c_str()) == -1 && len == text.length()) return FTextBase::handle(FL_PASTE); text.erase(0, p + sizeof(sep) - 1); } return 1; } /// Handles mouse-3 clicks by displaying the context menu /// /// @param val /// void FTextEdit::handle_context_menu(void) { bool selected = tbuf->selected(); set_active(&menu[EDIT_MENU_CUT], selected); set_active(&menu[EDIT_MENU_COPY], selected); set_active(&menu[EDIT_MENU_CLEAR], tbuf->length()); if (wrap) menu[EDIT_MENU_WRAP].set(); else menu[EDIT_MENU_WRAP].clear(); show_context_menu(); } /// The context menu handler /// /// @param val /// void FTextEdit::menu_cb(size_t item) { switch (item) { case EDIT_MENU_CLEAR: clear(); break; case EDIT_MENU_CUT: kf_cut(0, this); break; case EDIT_MENU_COPY: kf_copy(0, this); break; case EDIT_MENU_PASTE: kf_paste(0, this); break; case EDIT_MENU_READ: readFile(); break; case EDIT_MENU_WRAP: set_word_wrap(!wrap, true); break; } } /// This function is called by Fl_Text_Buffer when the buffer is modified, and /// also by nextChar when a character has been passed up the transmit path. In /// the first case either nins or ndel will be nonzero, and we change a /// corresponding amount of text in the style buffer. /// /// In the latter case, nins, ndel, pos and nsty are all zero and we update the /// style buffer to mark the last character in the buffer with the XMIT /// attribute. /// /// @param pos /// @param nins /// @param ndel /// @param nsty /// @param dtext /// @param arg /// void FTextEdit::changed_cb(int pos, int nins, int ndel, int nsty, const char *dtext, void *arg) { FTextEdit *e = reinterpret_cast(arg); if (nins == 0 && ndel == 0) { if (nsty == -1) { // called by nextChar to update transmitted text style char s[] = { FTEXT_DEF + XMIT, '\0' }; e->sbuf->replace(pos - 1, pos, s); e->redisplay_range(pos - 1, pos); } else if (nsty > 0) // restyled, e.g. selected, text return e->buffer_modified_cb(pos, nins, ndel, nsty, dtext, e); // No changes, e.g., a paste with an empty clipboard. return; } else if (nins > 0 && e->sbuf->length() < e->tbuf->length()) { // New text not inserted by our add() methods, i.e., via a file // read, mouse-2 paste or, most likely, direct keyboard entry. int n = e->tbuf->length() - e->sbuf->length(); if (n == 1) { char s[] = { FTEXT_DEF, '\0' }; e->sbuf->append(s); } else { char *s = new char [n + 1]; memset(s, FTEXT_DEF, n); s[n] = '\0'; e->sbuf->append(s); delete [] s; } } else if (ndel > 0) e->sbuf->remove(pos, pos + ndel); e->sbuf->select(pos, pos + nins - ndel); e->buffer_modified_cb(pos, nins, ndel, nsty, dtext, e); // We may need to scroll if the text was inserted by the // add() methods, e.g. by a macro if (e->mTopLineNum + e->mNVisibleLines - 1 <= e->mNBufferLines) e->show_insert_position(); } fldigi-3.21.80/src/widgets/Fl_Text_Editor_mod.cxx0000664000175000017500000005570612313064025016552 00000000000000// // "$Id: Fl_Text_Editor_mod.cxx 8034 2010-12-15 12:21:55Z AlbrechtS $" // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #include #include #include #include #include #include #include "Fl_Text_Editor_mod.H" /* Keyboard Control Matrix key\modifier plain Ctrl Alt Meta left 1/1 13/9 0/13 0/9 right 2/2 14/10 0/14 0/10 up 3/19 21/7 0/15 0/17 down 4/20 22/8 0/16 0/18 home 9/5 17/0 0/0 0/0 end 10/6 18/0 0/0 0/0 page up 11/7 23/0 0/11 0/0 page down 12/8 24/0 0/12 0/0 (FLTK action / OS X action) (adding the shift key extends the selection, all other combinations are no-op) 0: no-op 1: move cursor to the left, at line beginning wrap to end of prev line, at doc start no-op 2: move cursor to the right, at line end move to beginning of the next line, at doc end no-op 3: move cursor up, at doc top no-op 4: move cursor down, at doc bottom no-op 5: scroll display to top of text (cursor unchanged) 6: scroll display to end of text (cursor unchanged) 7: scroll text down one page (cursor unchanged) 8: scroll text up one page (cursor unchanged) 9: move cursor to beginning of line 10: move cursor to end of line 11: move cursor up one page and scroll down 12: move cursor down one page and scroll up 13: move to the beginning of the word or the previous word 14: move to the end of the word or the next word 15: if start of line: start of prev line, else start of this line 16: if end of line: end of next line, else end of this line 17: move cursor to the beginning of the document 18: move cursor to the end of the document 19: move cursor up, at doc top: home, at doc start: no-op) 20: move cursor down, at doc bot: end, at doc end: no-op) 21: scroll text down one line (cursor unchanged) 22: scroll text up one line (cursor unchanged) 23: move cursor to the beginning of the top of the screen 24: move cursor to the beginning of the bottom of the window */ /** The constructor creates a new text editor widget.*/ Fl_Text_Editor_mod::Fl_Text_Editor_mod(int X, int Y, int W, int H, const char* l) : Fl_Text_Display_mod(X, Y, W, H, l) { mCursorOn = 1; insert_mode_ = 1; key_bindings = 0; // handle the default key bindings add_default_key_bindings(&key_bindings); // handle everything else default_key_function(kf_default); } #ifndef FL_DOXYGEN Fl_Text_Editor_mod::Key_Binding* Fl_Text_Editor_mod::global_key_bindings = 0; #endif // These are the default key bindings every widget should start with static struct { int key; int state; Fl_Text_Editor_mod::Key_Func func; } default_key_bindings[] = { { FL_Escape, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_ignore }, { FL_Enter, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_enter }, { FL_KP_Enter, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_enter }, { FL_BackSpace, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_backspace }, { FL_Insert, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_insert }, { FL_Delete, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_delete }, { FL_Home, 0, Fl_Text_Editor_mod::kf_move }, { FL_End, 0, Fl_Text_Editor_mod::kf_move }, { FL_Left, 0, Fl_Text_Editor_mod::kf_move }, { FL_Up, 0, Fl_Text_Editor_mod::kf_move }, { FL_Right, 0, Fl_Text_Editor_mod::kf_move }, { FL_Down, 0, Fl_Text_Editor_mod::kf_move }, { FL_Page_Up, 0, Fl_Text_Editor_mod::kf_move }, { FL_Page_Down, 0, Fl_Text_Editor_mod::kf_move }, { FL_Home, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_End, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Left, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Up, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Right, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Down, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Page_Up, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Page_Down, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Home, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_End, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Left, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Up, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Right, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Down, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Page_Up, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Page_Down, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Home, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_End, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Left, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Up, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Right, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Down, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Page_Up, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Page_Down, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, //{ FL_Clear, 0, Fl_Text_Editor_mod::delete_to_eol }, { 'z', FL_CTRL, Fl_Text_Editor_mod::kf_undo }, { '/', FL_CTRL, Fl_Text_Editor_mod::kf_undo }, { 'x', FL_CTRL, Fl_Text_Editor_mod::kf_cut }, { FL_Delete, FL_SHIFT, Fl_Text_Editor_mod::kf_cut }, { 'c', FL_CTRL, Fl_Text_Editor_mod::kf_copy }, { FL_Insert, FL_CTRL, Fl_Text_Editor_mod::kf_copy }, { 'v', FL_CTRL, Fl_Text_Editor_mod::kf_paste }, { FL_Insert, FL_SHIFT, Fl_Text_Editor_mod::kf_paste }, { 'a', FL_CTRL, Fl_Text_Editor_mod::kf_select_all }, #ifdef __APPLE__ // Define CMD+key accelerators... { 'z', FL_COMMAND, Fl_Text_Editor_mod::kf_undo }, { 'x', FL_COMMAND, Fl_Text_Editor_mod::kf_cut }, { 'c', FL_COMMAND, Fl_Text_Editor_mod::kf_copy }, { 'v', FL_COMMAND, Fl_Text_Editor_mod::kf_paste }, { 'a', FL_COMMAND, Fl_Text_Editor_mod::kf_select_all }, { FL_Left, FL_COMMAND, Fl_Text_Editor_mod::kf_meta_move }, { FL_Right, FL_COMMAND, Fl_Text_Editor_mod::kf_meta_move }, { FL_Up, FL_COMMAND, Fl_Text_Editor_mod::kf_meta_move }, { FL_Down, FL_COMMAND, Fl_Text_Editor_mod::kf_meta_move }, { FL_Left, FL_COMMAND|FL_SHIFT, Fl_Text_Editor_mod::kf_m_s_move }, { FL_Right, FL_COMMAND|FL_SHIFT, Fl_Text_Editor_mod::kf_m_s_move }, { FL_Up, FL_COMMAND|FL_SHIFT, Fl_Text_Editor_mod::kf_m_s_move }, { FL_Down, FL_COMMAND|FL_SHIFT, Fl_Text_Editor_mod::kf_m_s_move }, #endif // __APPLE__ { 0, 0, 0 } }; /** Adds all of the default editor key bindings to the specified key binding list.*/ void Fl_Text_Editor_mod::add_default_key_bindings(Key_Binding** list) { for (int i = 0; default_key_bindings[i].key; i++) { add_key_binding(default_key_bindings[i].key, default_key_bindings[i].state, default_key_bindings[i].func, list); } } /** Returns the function associated with a key binding.*/ Fl_Text_Editor_mod::Key_Func Fl_Text_Editor_mod::bound_key_function(int key, int state, Key_Binding* list) { Key_Binding* cur; for (cur = list; cur; cur = cur->next) if (cur->key == key) if (cur->state == Fl_Text_Editor_mod_ANY_STATE || cur->state == state) break; if (!cur) return 0; return cur->function; } /** Removes all of the key bindings associated with the text editor or list.*/ void Fl_Text_Editor_mod::remove_all_key_bindings(Key_Binding** list) { Key_Binding *cur, *next; for (cur = *list; cur; cur = next) { next = cur->next; delete cur; } *list = 0; } /** Removes the key binding associated with the key "key" of state "state" */ void Fl_Text_Editor_mod::remove_key_binding(int key, int state, Key_Binding** list) { Key_Binding *cur, *last = 0; for (cur = *list; cur; last = cur, cur = cur->next) if (cur->key == key && cur->state == state) break; if (!cur) return; if (last) last->next = cur->next; else *list = cur->next; delete cur; } /** Adds a key of state "state" with the function "function" */ void Fl_Text_Editor_mod::add_key_binding(int key, int state, Key_Func function, Key_Binding** list) { Key_Binding* kb = new Key_Binding; kb->key = key; kb->state = state; kb->function = function; kb->next = *list; *list = kb; } //////////////////////////////////////////////////////////////// static void kill_selection(Fl_Text_Editor_mod* e) { if (e->buffer()->selected()) { e->insert_position(e->buffer()->primary_selection()->start()); e->buffer()->remove_selection(); } } /** Inserts the text associated with the key */ int Fl_Text_Editor_mod::kf_default(int c, Fl_Text_Editor_mod* e) { // FIXME: this function is a mess! Fix this! if (!c || (!isprint(c) && c != '\t')) return 0; char s[2] = "\0"; s[0] = (char)c; kill_selection(e); if (e->insert_mode()) e->insert(s); else e->overstrike(s); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Ignores the keypress */ int Fl_Text_Editor_mod::kf_ignore(int, Fl_Text_Editor_mod*) { return 0; // don't handle } /** Does a backspace in the current buffer.*/ int Fl_Text_Editor_mod::kf_backspace(int, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected() && e->move_left()) { int p1 = e->insert_position(); int p2 = e->buffer()->next_char(p1); e->buffer()->select(p1, p2); } kill_selection(e); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Inserts a newline at the current cursor position */ int Fl_Text_Editor_mod::kf_enter(int, Fl_Text_Editor_mod* e) { kill_selection(e); e->insert("\n"); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } extern void fl_text_drag_me(int pos, Fl_Text_Display_mod* d); /** Moves the text cursor in the direction indicated by key c.*/ int Fl_Text_Editor_mod::kf_move(int c, Fl_Text_Editor_mod* e) { int i; int selected = e->buffer()->selected(); if (!selected) e->dragPos = e->insert_position(); e->buffer()->unselect(); Fl::copy("", 0, 0); switch (c) { case FL_Home: e->insert_position(e->buffer()->line_start(e->insert_position())); break; case FL_End: e->insert_position(e->buffer()->line_end(e->insert_position())); break; case FL_Left: e->move_left(); break; case FL_Right: e->move_right(); break; case FL_Up: e->move_up(); break; case FL_Down: e->move_down(); break; case FL_Page_Up: for (i = 0; i < e->mNVisibleLines - 1; i++) e->move_up(); break; case FL_Page_Down: for (i = 0; i < e->mNVisibleLines - 1; i++) e->move_down(); break; } e->show_insert_position(); return 1; } /** Extends the current selection in the direction of key c.*/ int Fl_Text_Editor_mod::kf_shift_move(int c, Fl_Text_Editor_mod* e) { kf_move(c, e); fl_text_drag_me(e->insert_position(), e); char *copy = e->buffer()->selection_text(); if (copy) { Fl::copy(copy, strlen(copy), 0); free(copy); } return 1; } /** Moves the current text cursor in the direction indicated by control key */ int Fl_Text_Editor_mod::kf_ctrl_move(int c, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected()) e->dragPos = e->insert_position(); if (c != FL_Up && c != FL_Down) { e->buffer()->unselect(); Fl::copy("", 0, 0); e->show_insert_position(); } switch (c) { case FL_Home: e->insert_position(0); e->scroll(0, 0); break; case FL_End: e->insert_position(e->buffer()->length()); e->scroll(e->count_lines(0, e->buffer()->length(), 1), 0); break; case FL_Left: e->previous_word(); break; case FL_Right: e->next_word(); break; case FL_Up: e->scroll(e->mTopLineNum-1, e->mHorizOffset); break; case FL_Down: e->scroll(e->mTopLineNum+1, e->mHorizOffset); break; case FL_Page_Up: e->insert_position(e->mLineStarts[0]); break; case FL_Page_Down: e->insert_position(e->mLineStarts[e->mNVisibleLines-2]); break; } return 1; } /** Moves the current text cursor in the direction indicated by meta key */ int Fl_Text_Editor_mod::kf_meta_move(int c, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected()) e->dragPos = e->insert_position(); if (c != FL_Up && c != FL_Down) { e->buffer()->unselect(); Fl::copy("", 0, 0); e->show_insert_position(); } switch (c) { case FL_Up: // top of buffer e->insert_position(0); e->scroll(0, 0); break; case FL_Down: // end of buffer e->insert_position(e->buffer()->length()); e->scroll(e->count_lines(0, e->buffer()->length(), 1), 0); break; case FL_Left: // beginning of line kf_move(FL_Home, e); break; case FL_Right: // end of line kf_move(FL_End, e); break; } return 1; } /** Extends the current selection in the direction indicated by meta key c. */ int Fl_Text_Editor_mod::kf_m_s_move(int c, Fl_Text_Editor_mod* e) { kf_meta_move(c, e); fl_text_drag_me(e->insert_position(), e); return 1; } /** Extends the current selection in the direction indicated by control key c. */ int Fl_Text_Editor_mod::kf_c_s_move(int c, Fl_Text_Editor_mod* e) { kf_ctrl_move(c, e); fl_text_drag_me(e->insert_position(), e); return 1; } /** Moves the text cursor to the beginning of the current line.*/ int Fl_Text_Editor_mod::kf_home(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Home, e); } /** Moves the text cursor to the end of the current line.*/ int Fl_Text_Editor_mod::kf_end(int, Fl_Text_Editor_mod* e) { return kf_move(FL_End, e); } /** Moves the text cursor one character to the left.*/ int Fl_Text_Editor_mod::kf_left(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Left, e); } /** Moves the text cursor one line up.*/ int Fl_Text_Editor_mod::kf_up(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Up, e); } /** Moves the text cursor one character to the right.*/ int Fl_Text_Editor_mod::kf_right(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Right, e); } /** Moves the text cursor one line down.*/ int Fl_Text_Editor_mod::kf_down(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Down, e); } /** Moves the text cursor up one page.*/ int Fl_Text_Editor_mod::kf_page_up(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Page_Up, e); } /** Moves the text cursor down one page.*/ int Fl_Text_Editor_mod::kf_page_down(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Page_Down, e); } /** Toggles the insert mode in the text editor.*/ int Fl_Text_Editor_mod::kf_insert(int, Fl_Text_Editor_mod* e) { e->insert_mode(e->insert_mode() ? 0 : 1); return 1; } /** Does a delete of selected text or the current character in the current buffer.*/ int Fl_Text_Editor_mod::kf_delete(int, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected()) { int p1 = e->insert_position(); int p2 = e->buffer()->next_char(p1); e->buffer()->select(p1, p2); } kill_selection(e); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Does a copy of selected text or the current character in the current buffer.*/ int Fl_Text_Editor_mod::kf_copy(int, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected()) return 1; const char *copy = e->buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 1); free((void*)copy); e->show_insert_position(); return 1; } /** Does a cut of selected text in the current buffer.*/ int Fl_Text_Editor_mod::kf_cut(int c, Fl_Text_Editor_mod* e) { kf_copy(c, e); kill_selection(e); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Does a paste of selected text in the current buffer.*/ int Fl_Text_Editor_mod::kf_paste(int, Fl_Text_Editor_mod* e) { kill_selection(e); Fl::paste(*e, 1); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Selects all text in the current buffer.*/ int Fl_Text_Editor_mod::kf_select_all(int, Fl_Text_Editor_mod* e) { e->buffer()->select(0, e->buffer()->length()); const char *copy = e->buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 0); free((void*)copy); return 1; } /** Undo last edit in the current buffer. Also deselect previous selection. */ int Fl_Text_Editor_mod::kf_undo(int , Fl_Text_Editor_mod* e) { e->buffer()->unselect(); Fl::copy("", 0, 0); int crsr; int ret = e->buffer()->undo(&crsr); e->insert_position(crsr); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return ret; } /** Handles a key press in the editor */ int Fl_Text_Editor_mod::handle_key() { // Call FLTK's rules to try to turn this into a printing character. // This uses the right-hand ctrl key as a "compose prefix" and returns // the changes that should be made to the text, as a number of // bytes to delete and a string to insert: int del = 0; if (Fl::compose(del)) { if (del) { int dp = insert_position(), di = del; while (di--) dp = buffer()->prev_char_clipped(dp); buffer()->select(dp, insert_position()); } kill_selection(this); if (Fl::event_length()) { if (insert_mode()) insert(Fl::event_text()); else overstrike(Fl::event_text()); } show_insert_position(); set_changed(); if (when()&FL_WHEN_CHANGED) do_callback(); return 1; } int key = Fl::event_key(), state = Fl::event_state(), c = Fl::event_text()[0]; state &= FL_SHIFT|FL_CTRL|FL_ALT|FL_META; // only care about these states Key_Func f; f = bound_key_function(key, state, global_key_bindings); if (!f) f = bound_key_function(key, state, key_bindings); if (f) return f(key, this); if (default_key_function_ && !state) return default_key_function_(c, this); return 0; } /** does or does not a callback according to changed() and when() settings */ void Fl_Text_Editor_mod::maybe_do_callback() { // printf("Fl_Text_Editor_mod::maybe_do_callback()\n"); // printf("changed()=%d, when()=%x\n", changed(), when()); if (changed() || (when()&FL_WHEN_NOT_CHANGED)) do_callback(); } int Fl_Text_Editor_mod::handle(int event) { static int dndCursorPos; if (!buffer()) return 0; switch (event) { case FL_FOCUS: show_cursor(mCursorOn); // redraws the cursor if (buffer()->selected()) redraw(); // Redraw selections... Fl::focus(this); return 1; case FL_UNFOCUS: show_cursor(mCursorOn); // redraws the cursor if (buffer()->selected()) redraw(); // Redraw selections... case FL_HIDE: if (when() & FL_WHEN_RELEASE) maybe_do_callback(); return 1; case FL_KEYBOARD: if (active_r() && window() && this == Fl::belowmouse()) window()->cursor(FL_CURSOR_NONE); return handle_key(); case FL_PASTE: if (!Fl::event_text()) { fl_beep(); return 1; } buffer()->remove_selection(); if (insert_mode()) insert(Fl::event_text()); else overstrike(Fl::event_text()); show_insert_position(); set_changed(); if (when()&FL_WHEN_CHANGED) do_callback(); return 1; case FL_ENTER: // MRS: WIN32 only? Need to test! // case FL_MOVE: show_cursor(mCursorOn); return 1; case FL_PUSH: if (Fl::event_button() == 2) { // don't let the text_display see this event if (Fl_Group::handle(event)) return 1; dragType = DRAG_NONE; if(buffer()->selected()) { buffer()->unselect(); } int pos = xy_to_position(Fl::event_x(), Fl::event_y(), CURSOR_POS); insert_position(pos); Fl::paste(*this, 0); Fl::focus(this); set_changed(); if (when()&FL_WHEN_CHANGED) do_callback(); return 1; } break; case FL_SHORTCUT: if (!(shortcut() ? Fl::test_shortcut(shortcut()) : test_shortcut())) return 0; if (Fl::visible_focus() && handle(FL_FOCUS)) { Fl::focus(this); return 1; } break; // Handle drag'n'drop attempt by the user. This is a simplified // implementation which allows dnd operations onto the scroll bars. case FL_DND_ENTER: // save the current cursor position if (Fl::visible_focus() && handle(FL_FOCUS)) Fl::focus(this); show_cursor(mCursorOn); dndCursorPos = insert_position(); /* fall through */ case FL_DND_DRAG: // show a temporary insertion cursor insert_position(xy_to_position(Fl::event_x(), Fl::event_y(), CURSOR_POS)); return 1; case FL_DND_LEAVE: // restore original cursor insert_position(dndCursorPos); return 1; case FL_DND_RELEASE: // keep insertion cursor and wait for the FL_PASTE event buffer()->unselect(); // FL_PASTE must not destroy current selection! return 1; } return Fl_Text_Display_mod::handle(event); } // // End of "$Id: Fl_Text_Editor_mod.cxx 8034 2010-12-15 12:21:55Z AlbrechtS $". // fldigi-3.21.80/src/widgets/flmisc.cxx0000664000175000017500000002036412313064025014305 00000000000000// ---------------------------------------------------------------------------- // flmisc.cxx // // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "flmisc.h" #include "pixmaps.h" using namespace std; unsigned quick_choice_menu(const char* title, unsigned sel, const Fl_Menu_Item* menu) { unsigned n = menu->size(); sel = CLAMP(sel - 1, 0, n - 1); int t = Fl_Tooltip::enabled(); Fl_Tooltip::disable(); const Fl_Menu_Item* p = menu->popup(Fl::event_x(), Fl::event_y(), title, menu + sel); Fl_Tooltip::enable(t); return p ? p - menu + 1 : 0; } unsigned quick_choice(const char* title, unsigned sel, ...) { const char* item; const Fl_Menu_Item* menu = NULL; Fl_Menu_Item* p = NULL; va_list ap; va_start(ap, sel); for (size_t n = 0; (item = va_arg(ap, const char*)); n++) { if ((p = (Fl_Menu_Item*)realloc(p, (n+2) * sizeof(Fl_Menu_Item))) == NULL) { free((Fl_Menu_Item*)menu); va_end(ap); return 0; } memset(p + n, 0, 2 * sizeof(Fl_Menu_Item)); p[n].label(item); p[n+1].label(NULL); menu = p; } va_end(ap); sel = quick_choice_menu(title, sel, menu); free(p); return sel; } // Adjust and return fg color to ensure good contrast with bg Fl_Color adjust_color(Fl_Color fg, Fl_Color bg) { Fl_Color adj; unsigned max = 24; while ((adj = fl_contrast(fg, bg)) != fg && max--) fg = (adj == FL_WHITE) ? fl_color_average(fg, FL_WHITE, .9) : fl_color_average(fg, FL_BLACK, .9); return fg; } // invert colour (bg1r, bg1g, bg1b); return def if new colour does not make // good contrast with bg2 void adjust_color_inv(unsigned char& bg1r, unsigned char& bg1g, unsigned char& bg1b, Fl_Color bg2, Fl_Color def) { bg1r = 255 - bg1r; bg1g = 255 - bg1g; bg1b = 255 - bg1b; Fl_Color adj = fl_rgb_color(bg1r, bg1g, bg1b); if (fl_contrast(adj, bg2) != adj) Fl::get_color((def >= 0 ? def : adj), bg1r, bg1g, bg1b); } #if !defined(__APPLE__) && !defined(__WOE32__) && USE_X # include # include # include void make_pixmap(Pixmap *xpm, const char **data, int argc, char** argv) { // We need a displayed window to provide a GC for X_CreatePixmap Fl_Window w(0, 0, PACKAGE_NAME); w.xclass(PACKAGE_NAME); w.border(0); w.show(argc, argv); Fl_Pixmap icon(data); int maxd = MAX(icon.w(), icon.h()); w.make_current(); *xpm = fl_create_offscreen(maxd, maxd); w.hide(); fl_begin_offscreen(*xpm); // Fl_Color(FL_BACKGROUND_COLOR); // fl_rectf(0, 0, maxd, maxd); icon.draw(maxd - icon.w(), maxd - icon.h()); fl_end_offscreen(); } #endif notify_dialog::notify_dialog(int X, int Y, const char* l) : Fl_Window(X, Y, l), icon(10, 10, 50, 50), message(70, 25, 330, 35), dial(277, 70, 23, 23), button(309, 70, 90, 23, "Close"), resize_box(399, 26, 1, 1) { end(); icon.image(new Fl_Pixmap(dialog_information_48_icon)); message.type(FL_MULTILINE_OUTPUT); message.box(FL_FLAT_BOX); message.color(FL_BACKGROUND_COLOR); button.callback(button_cb); newx = button.x(); dial.box(FL_FLAT_BOX); dial.type(FL_FILL_DIAL); dial.selection_color(adjust_color(fl_lighter(FL_BACKGROUND_COLOR), FL_BACKGROUND_COLOR)); dial.angle1(180); dial.angle2(-180); dial.minimum(0.0); xclass(PACKAGE_TARNAME); resizable(resize_box); } notify_dialog::~notify_dialog() { delete icon.image(); Fl::remove_timeout(dial_timer, &dial); } int notify_dialog::handle(int event) { if (event == FL_HIDE && delete_on_hide) { Fl::delete_widget(this); return 1; } else if (event == FL_PUSH) { dial.hide(); return Fl_Window::handle(event); } return Fl_Window::handle(event); } void notify_dialog::button_cb(Fl_Widget* w, void*) { w->window()->hide(); } void notify_dialog::dial_timer(void* arg) { Fl_Dial* dial = reinterpret_cast(arg); double v = dial->value(); if (!dial->visible()) return; if (v == dial->minimum()) return dial->window()->hide(); dial->value(dial->clamp(v - 0.05)); return Fl::repeat_timeout(0.05, dial_timer, arg); } Fl_Button* notify_dialog::make_button(int W, int H) { Fl_Group* cur = Fl_Group::current(); Fl_Group::current(this); Fl_Button* b = 0; int pad = 10; int X = newx - pad - W; if (X - pad - dial.w() > 0) { b = new Fl_Button(newx = X, button.y(), W, H); dial.position(b->x() - dial.w() - pad, dial.y()); } Fl_Group::current(cur); return b; } void notify_dialog::notify(const char* msg, double timeout, bool delete_on_hide_) { delete_on_hide = delete_on_hide_; message.value(msg); const char* p; if ((p = strchr(msg, '\n'))) { // use first line as label string l(msg, p - msg); copy_label(l.c_str()); } else label("Notification"); fl_font(message.textfont(), message.textsize()); int H = 0; for (const char* p = msg; (p = strchr(p, '\n')); p++) H++; size(w(), h() + max(H - 1, 0) * fl_height()); if (timeout > 0.0) { dial.maximum(timeout); dial.value(timeout); dial.show(); Fl::add_timeout(0.0, dial_timer, &dial); } else dial.hide(); button.take_focus(); show(); } // ============================================================================= #ifdef BUILD_FLDIGI #include "icons.h" #include "gettext.h" Mode_Browser::Mode_Browser(void) : Fl_Double_Window(170, 460), changed_cb(NULL), changed_args(NULL) { int bw = 80, bh = 20, pad = 2; modes = new Fl_Check_Browser(pad, pad, w() - pad, h() - 2 * (bh + 2 * pad)); for (int i = 0; i < NUM_RXTX_MODES; i++) modes->add(mode_info[i].name); modes->callback(modes_cb, this); modes->when(FL_WHEN_CHANGED); all_button = new Fl_Button(modes->x(), modes->y() + modes->h() + pad, bw, bh, _("Select All")); all_button->callback(button_cb, this); none_button = new Fl_Button(all_button->x(), all_button->y() + all_button->h() + pad, all_button->w(), all_button->h(), _("Clear All")); none_button->callback(button_cb, this); close_button = new Fl_Button(w() - none_button->w() - pad, none_button->y(), none_button->w(), none_button->h(), make_icon_label(_("Close"), close_icon)); set_icon_label(close_button); close_button->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); close_button->callback(button_cb, this); end(); resizable(modes); xclass(PACKAGE_TARNAME); } Mode_Browser::~Mode_Browser(void) { free_icon_label(close_button); delete close_button; delete all_button; delete none_button; delete modes; } void Mode_Browser::show(mode_set_t* b) { store = b; modes->check_none(); for (size_t i = 0; i < b->size(); i++) modes->checked(i + 1, store->test(i)); modes->position(0); Fl_Double_Window::show(); } void Mode_Browser::callback(Fl_Callback* cb, void* args) { changed_cb = cb; changed_args = args; } void Mode_Browser::modes_cb(Fl_Widget* w, void* arg) { Mode_Browser* m = static_cast(arg); int sel = m->modes->value(); m->store->set(sel - 1, m->modes->checked(sel)); if (m->changed_cb) m->changed_cb(m, m->changed_args); } void Mode_Browser::button_cb(Fl_Widget* w, void* arg) { Mode_Browser* m = static_cast(arg); if (w == m->close_button) m->hide(); else { if (w == m->all_button) { m->store->set(); m->modes->check_all(); } else { m->store->reset(); m->modes->check_none(); } if (m->changed_cb) m->changed_cb(m, m->changed_args); } } #endif // BUILD_FLDIGI fldigi-3.21.80/src/widgets/psk_browser.cxx0000664000175000017500000002023112313064025015361 00000000000000// ---------------------------------------------------------------------------- // // PSK browser widget // // Copyright (C) 2008-2010 // David Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "config.h" #include "psk_browser.h" #include "configuration.h" #include "confdialog.h" #include "status.h" #include "waterfall.h" #include "fl_digi.h" #include "gettext.h" #include "flmisc.h" #include "flinput2.h" #include "flslider2.h" #include "spot.h" #include "icons.h" #include "Viewer.h" #include using namespace std; string pskBrowser::hilite_color_1; string pskBrowser::hilite_color_2; string pskBrowser::white; string pskBrowser::bkgnd[2]; int pskBrowser::cwidth = 5; int pskBrowser::cheight = 12; int pskBrowser::sbarwidth = 16; pskBrowser::pskBrowser(int x, int y, int w, int h, const char *l) :Fl_Hold_Browser(x,y,w,h,l) { fnt = FL_COURIER; siz = 12; rfc = 0LL; usb = true; seek_re = NULL; cols[0] = 80; cols[1] = 0; evalcwidth(); HiLite_1 = FL_RED; HiLite_2 = FL_GREEN; BkSelect = FL_BLUE; Backgnd1 = (Fl_Color)55; Backgnd2 = (Fl_Color)53; makecolors(); cdistiller = reinterpret_cast(operator new(MAXCHANNELS*sizeof(CharsetDistiller))); string bline; for (int i = 0; i < MAXCHANNELS; i++) { bwsrline[i] = " "; bwsrfreq[i] = NULLFREQ; bline = freqformat(i); if ( i < progdefaults.VIEWERchannels) add(bline.c_str()); linechars[i] = 0; new(&cdistiller[i]) CharsetDistiller; } nchars = (w - cols[0] - (sbarwidth + 2*BWSR_BORDER)) / cwidth; nchars = nchars < 1 ? 1 : nchars; } pskBrowser::~pskBrowser() { for (int i = MAXCHANNELS-1; i >= 0; i--) cdistiller[i].~CharsetDistiller(); operator delete(cdistiller); } void pskBrowser::evalcwidth() { fl_font(fnt, siz); textfont(fnt); textsize(siz); const char *szAF = " 9999"; const char *szRF = " 999999.99"; const char *szCH = " 99"; cwidth = (int)fl_width("W"); if (cwidth <= 0) cwidth = 5; cheight = fl_height(); labelwidth[VIEWER_LABEL_OFF] = 1;//cwidth; labelwidth[VIEWER_LABEL_AF] = (int)fl_width(szAF); labelwidth[VIEWER_LABEL_RF] = (int)fl_width(szRF); labelwidth[VIEWER_LABEL_CH] = (int)fl_width(szCH); columns(labelwidth[progdefaults.VIEWERlabeltype]); } string pskBrowser::freqformat(int i) // 0 < i < channels { szLine[0] = 0; int freq = bwsrfreq[i]; switch (progdefaults.VIEWERlabeltype) { case VIEWER_LABEL_AF: if (freq != NULLFREQ) snprintf(szLine, sizeof(szLine), "%4d", freq); else sprintf(szLine, " "); break; case VIEWER_LABEL_RF: if (freq != NULLFREQ) snprintf(szLine, sizeof(szLine), "%8.2f", (rfc + (usb ? freq : -freq)) / 1000.0f); else sprintf(szLine, " "); break; case VIEWER_LABEL_CH: snprintf(szLine, sizeof(szLine), "%2d", i + 1); break; default: sprintf(szLine, " "); break; } fline = white; fline.append("@r").append(szLine).append("\t").append(bkgnd[i%2]); return fline; } void pskBrowser::swap(int i, int j) { string tempstr = bwsrline[j]; bwsrline[j] = bwsrline[i]; bwsrline[i] = tempstr; int f = bwsrfreq[j]; bwsrfreq[j] = bwsrfreq[i]; bwsrfreq[i] = f; tempstr = freqformat(i); tempstr.append(bwsrline[i]); text(i+1, tempstr.c_str()); tempstr = freqformat(j); tempstr.append(bwsrline[j]); text(j+1, tempstr.c_str()); redraw(); } static size_t case_find(string &haystack, string &needle) { string Uhaystack = haystack; string Uneedle = needle; for (size_t i = 0; i < Uhaystack.length(); i++ ) Uhaystack[i] = toupper(Uhaystack[i]); for (size_t i = 0; i < Uneedle.length(); i++ ) Uneedle[i] = toupper(Uneedle[i]); return Uhaystack.find(Uneedle); } void pskBrowser::resize(int x, int y, int w, int h) { if (w) { Fl_Hold_Browser::resize(x,y,w,h); evalcwidth(); nchars = (w - cols[0] - (sbarwidth + 2*BWSR_BORDER)) / cwidth; nchars = nchars < 1 ? 1 : nchars; string bline; Fl_Hold_Browser::clear(); for (int i = 0, j = 0; i < progdefaults.VIEWERchannels; i++) { if (progdefaults.VIEWERascend) j = progdefaults.VIEWERchannels - 1 - i; else j = i; bwsrline[j].clear(); linechars[j] = 0; bline = freqformat(j); if (seek_re && seek_re->match(bwsrline[j].c_str(), REG_NOTBOL | REG_NOTEOL)) bline.append(hilite_color_1); else if ( !progdefaults.myCall.empty() && case_find (bwsrline[j], progdefaults.myCall ) != string::npos) bline.append(hilite_color_2); Fl_Hold_Browser::add(bline.c_str()); } } } void pskBrowser::makecolors() { char tempstr[20]; snprintf(tempstr, sizeof(tempstr), "@C%u", HiLite_1); hilite_color_1 = tempstr; snprintf(tempstr, sizeof(tempstr), "@C%u", HiLite_2); hilite_color_2 = tempstr; snprintf(tempstr, sizeof(tempstr), "@C%u", FL_FOREGROUND_COLOR); // foreground white = tempstr; selection_color(BkSelect); snprintf(tempstr, sizeof(tempstr), "@B%u", Backgnd1); // background for odd rows bkgnd[0] = tempstr; snprintf(tempstr, sizeof(tempstr), "@B%u", Backgnd2); // background for even rows bkgnd[1] = tempstr; } void pskBrowser::addchr(int ch, int freq, unsigned char c, int md) // 0 < ch < channels { if (ch < 0 || ch >= MAXCHANNELS) return; if (c == '\n') c = ' '; if (c < ' ') return; nchars = (w() - cols[0] - (sbarwidth + 2*BWSR_BORDER)) / cwidth; nchars = nchars < 1 ? 1 : nchars; bwsrfreq[ch] = freq; if (bwsrline[ch].length() == 1 && bwsrline[ch][0] == ' ') { bwsrline[ch].clear(); linechars[ch] = 0; } cdistiller[ch].rx(c); if (cdistiller[ch].data_length() > 0) { bwsrline[ch] += cdistiller[ch].data(); linechars[ch] += cdistiller[ch].num_chars(); cdistiller[ch].clear(); } if (linechars[ch] > nchars) { if (progdefaults.VIEWERmarquee) { while (linechars[ch] > nchars) { bwsrline[ch].erase(0, fl_utf8len1(bwsrline[ch][0])); linechars[ch]--; } } else { bwsrline[ch].clear(); linechars[ch] = 0; } } nuline = freqformat(ch); if (seek_re && seek_re->match(bwsrline[ch].c_str(), REG_NOTBOL | REG_NOTEOL)) nuline.append(hilite_color_1); else if ( !progdefaults.myCall.empty() && case_find (bwsrline[ch], progdefaults.myCall ) != string::npos) nuline.append(hilite_color_2); nuline.append("@.").append(bwsrline[ch]); if (progdefaults.VIEWERascend) text(progdefaults.VIEWERchannels - ch, nuline.c_str()); else text(ch + 1, nuline.c_str()); redraw(); } void pskBrowser::set_freq(int i, int freq) // 0 < i < channels { string new_line = ""; bwsrfreq[i] = freq; new_line.append(freqformat(i)).append(bwsrline[i]); if (progdefaults.VIEWERascend) replace(progdefaults.VIEWERchannels - i, new_line.c_str()); else replace(i + 1, new_line.c_str()); } void pskBrowser::clear() { long freq; Fl_Hold_Browser::clear(); for (int i = 0, j = 0; i < progdefaults.VIEWERchannels; i++) { if (progdefaults.VIEWERascend) j = progdefaults.VIEWERchannels - 1 - i; else j = i; freq = NULLFREQ; bwsrline[j] = " "; bwsrfreq[j] = freq; fline = freqformat(j); add((fline.append(bwsrline[j])).c_str()); } deselect(); redraw(); } void pskBrowser::clearch(int n, int freq) // 0 < n < channels { bwsrline[n] = " "; set_freq(n, freq); redraw(); } int pskBrowser::freq(int i) { // 1 < i < progdefaults.VIEWERchannels if (progdefaults.VIEWERascend) return ( i < 1 ? 0 : i > progdefaults.VIEWERchannels ? 0 : bwsrfreq[progdefaults.VIEWERchannels - i]); else return (i < 1 ? 0 : i > MAXCHANNELS ? 0 : bwsrfreq[i - 1]); } void pskBrowser::set_input_encoding(int encoding_id) { for (int i = 0; i < MAXCHANNELS; i++) cdistiller[i].set_input_encoding(encoding_id); } fldigi-3.21.80/src/widgets/Panel.cxx0000664000175000017500000001444212313064025014067 00000000000000// ---------------------------------------------------------------------------- // Panel.cxx // // Copyright (C) 2007-2011 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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) aRY later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ARY 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 fldigi. If not, see . // ---------------------------------------------------------------------------- //#include #include #include #include #include #include #include "Panel.h" #include // Drag the edges that were initially at oldx,oldy to newx,newy: // pass -1 as oldx or oldy to disable drag in that direction: int Panel::orgx() { int oldx = w(); int *p = sizes() + 8; for (int i=children(); i--; p += 4) if (p[1] < oldx) oldx = p[1]; return oldx; } int Panel::orgy() { int oldy = h(); int *p = sizes() + 8; for (int i=children(); i--; p += 4) if (p[3] < oldy) oldy = p[3]; return oldy; } void Panel::position(int oix, int oiy, int newx, int newy) { //printf("oix %3d, oiy %3d, nux %3d, nuy %3d\n", oix, oiy, newx, newy); Fl_Widget* const* a = array(); int *p = sizes(); //printf("p0 %3d, p1 %3d, p2 %3d, p3 %3d\n", p[0], p[1], p[2], p[3]); //printf("p4 %3d, p5 %3d, p6 %3d, p7 %3d\n", p[0], p[1], p[2], p[3]); p += 8; // skip group & resizable's saved size for (int i=children(); i--; p += 4) { Fl_Widget* o = *a++; if (o == resizable()) continue; int X = o->x(); int Y = o->y(); int W = o->w(); int H = o->h(); int R = X + W; int B = Y + H; if (o == resizable()) continue; if (oix > -1) { int t = p[0]; if ((t == oix) || (t>oix && Xnewx)) X = newx; t = p[1]; if ((t == oix) || (t>oix && Rnewx)) R = newx; } if (oiy > -1) { int t = p[2]; if ((t == oiy) || (t>oiy && Ynewy)) Y = newy; t = p[3]; if ((t == oiy) || (t>oiy && Bnewy)) B = newy; } o->damage_resize(X, Y, R-X, B-Y); } } // move the lower-right corner (sort of): void Panel::resize(int X,int Y,int W,int H) { // remember how much to move the child widgets: int *p = sizes(); int OX = x(); int OY = y(); int OW = w(); int OH = h(); int OR = OX + OW; int OB = OY + OH; float dw = 1.0 * W / OW; float dh = 1.0 * H / OH; // resize this (skip the Fl_Group resize): Fl_Widget::resize(X,Y,W,H); // find x, y, w, h of resizable: int RX = X + (p[4] - p[0]); int RY = Y + (p[6] - p[2]); int RR = X + W - (p[1] - p[5]); int RB = Y + H - (p[3] - p[7]); int NW = RR - RX; int NH = RB - RY; int R; int B; int xx; int yy; // move everything to be on correct side of new resizable: Fl_Widget * const *a = array(); Fl_Widget * o = 0; p += 8; for (int i=children(); i--;) { o = *a++; if (o == resizable()) { o->resize(RX, RY, NW, NH); } else { xx = X; if (o->x() != OX) xx = (o->x() - OX) * dw + X + 0.5; if (xx > RR) xx = RR; if (o->x() + o->w() == OR) { R = X + W; if (xx != X && xx < RX) xx = RX; } else { R = xx + o->w() * dw + 0.5; if (R < xx) R = xx; if (xx <= RX && R < RX) R = RX; if (xx <= RX && R > RR ) R = RR; } yy = Y; if (o->y() != OY) yy = (o->y() - OY) * dh + Y + 0.5; if (yy > RB) yy = RB; if (o->y() + o->h() == OB) { B = Y + H; if (yy != Y && yy < RY) yy = RY; } else { B = yy + o->h() * dh + 0.5; if (B < yy) B = yy; if (yy <= RY && B < RY) B = RY; if (yy <= RY && B > RB) B = RB; } o->resize(xx,yy,R-xx,B-yy); } p += 4; // next child sizes array // do *not* call o->redraw() here! If you do, and the tile is inside a // scroll, it'll set the damage areas wrong for all children! } } static void set_cursor(Panel *t, Fl_Cursor c) { static Fl_Cursor cursor; if (cursor == c || !t->window()) return; cursor = c; t->window()->cursor(c); } static Fl_Cursor cursors[4] = { FL_CURSOR_DEFAULT, FL_CURSOR_WE, FL_CURSOR_NS, FL_CURSOR_MOVE}; int Panel::handle(int event) { static int sdrag; static int sdx, sdy; static int sx, sy; #define DRAGH 1 #define DRAGV 2 #define GRABAREA 4 int mx = Fl::event_x(); int my = Fl::event_y(); switch (event) { case FL_MOVE: case FL_ENTER: case FL_PUSH: { int mindx = 100; int mindy = 100; int oldx = 0; int oldy = 0; Fl_Widget*const* a = array(); int *q = sizes(); int *p = q + 8; for (int i=children(); i--; p += 4) { Fl_Widget* o = *a++; if (o == resizable()) continue; if (p[1]y()<=my+GRABAREA && o->y()+o->h()>=my-GRABAREA) { int t = mx - (o->x()+o->w()); if (abs(t) < mindx) { sdx = t; mindx = abs(t); oldx = p[1]; } } if (p[3]x()<=mx+GRABAREA && o->x()+o->w()>=mx-GRABAREA) { int t = my - (o->y()+o->h()); if (abs(t) < mindy) { sdy = t; mindy = abs(t); oldy = p[3]; } } } sdrag = 0; sx = sy = -1; if (mindx <= GRABAREA) {sdrag = DRAGH; sx = oldx;} if (mindy <= GRABAREA) {sdrag |= DRAGV; sy = oldy;} set_cursor(this, cursors[sdrag]); if (sdrag) return 1; return Fl_Group::handle(event); } case FL_LEAVE: set_cursor(this, FL_CURSOR_DEFAULT); break; case FL_DRAG: // This is necessary if CONSOLIDATE_MOTION in Fl_x.cxx is turned off: if (damage()) return 1; // don't fall behind case FL_RELEASE: { if (!sdrag) return 0; // should not happen Fl_Widget* r = resizable(); if (!r) r = this; int newx; if (sdrag&DRAGH) { newx = Fl::event_x()-sdx; if (newx < r->x()) newx = r->x(); else if (newx >= r->x()+r->w()) newx = r->x()+r->w(); } else newx = sx; int newy; if (sdrag&DRAGV) { newy = Fl::event_y()-sdy; if (newy < r->y()) newy = r->y(); else if (newy >= r->y()+r->h()) newy = r->y()+r->h(); } else newy = sy; position(sx,sy,newx,newy); if (event == FL_DRAG) set_changed(); do_callback(); return 1;} } return Fl_Group::handle(event); } fldigi-3.21.80/src/cw_rtty/0000775000175000017500000000000012313333725012412 500000000000000fldigi-3.21.80/src/cw_rtty/rtty.cxx0000664000175000017500000010070312313064025014053 00000000000000// ---------------------------------------------------------------------------- // rtty.cxx -- RTTY modem // // Copyright (C) 2012 // Dave Freese, W1HKJ // Stefan Fendt, DL1SMF // // This file is part of fldigi. // // This code bears some resemblance to code contained in gmfsk from which // it originated. Much has been changed, but credit should still be // given to Tomi Manninen (oh2bns@sral.fi), who so graciously distributed // his gmfsk modem under the GPL. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include using namespace std; #include "view_rtty.h" #include "fl_digi.h" #include "digiscope.h" #include "misc.h" #include "waterfall.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "digiscope.h" #include "trx.h" #include "debug.h" #include "synop.h" #include "main.h" #include "modem.h" #define FILTER_DEBUG 0 view_rtty *rttyviewer = (view_rtty *)0; //===================================================================== // Baudot support //===================================================================== static char letters[32] = { '\0', 'E', '\n', 'A', ' ', 'S', 'I', 'U', '\r', 'D', 'R', 'J', 'N', 'F', 'C', 'K', 'T', 'Z', 'L', 'W', 'H', 'Y', 'P', 'Q', 'O', 'B', 'G', ' ', 'M', 'X', 'V', ' ' }; /* * U.S. version of the figures case. */ static char figures[32] = { '\0', '3', '\n', '-', ' ', '\a', '8', '7', '\r', '$', '4', '\'', ',', '!', ':', '(', '5', '"', ')', '2', '#', '6', '0', '1', '9', '?', '&', ' ', '.', '/', ';', ' ' }; int dspcnt = 0; static char msg1[20]; const double rtty::SHIFT[] = {23, 85, 160, 170, 182, 200, 240, 350, 425, 850}; const double rtty::BAUD[] = {45, 45.45, 50, 56, 75, 100, 110, 150, 200, 300}; const int rtty::BITS[] = {5, 7, 8}; void rtty::tx_init(SoundBase *sc) { scard = sc; phaseacc = 0; preamble = true; videoText(); symbols = 0; acc_symbols = 0; ovhd_symbols = 0; } // Customizes output of Synop decoded data. struct rtty_callback : public synop_callback { // Callback for writing decoded synop messages. void print(const char * str, size_t nb, bool bold ) const { // Could choose: FTextBase::CTRL,XMIT,RECV int style = bold ? FTextBase::XMIT : FTextBase::RECV; for( size_t i = 0; i < nb; ++i ) { unsigned char c = str[i]; put_rx_char(progdefaults.rx_lowercase ? tolower(c) : c, style ); } } // Should we log new Synop messages to the current Adif log file ? bool log_adif(void) const { return progdefaults.SynopAdifDecoding ;} // Should we log new Synop messages to KML file ? bool log_kml(void) const { return progdefaults.SynopKmlDecoding ;} bool interleaved(void) const { return progdefaults.SynopInterleaved ;} }; void rtty::rx_init() { rxstate = RTTY_RX_STATE_IDLE; rxmode = LETTERS; phaseacc = 0; FSKphaseacc = 0; for (int i = 0; i < MAXBITS; i++ ) bit_buf[i] = 0.0; mark_phase = 0; space_phase = 0; xy_phase = 0.0; mark_mag = 0; space_mag = 0; mark_env = 0; space_env = 0; inp_ptr = 0; lastchar = 0; // Synop file is reloaded each time we enter this modem. Ideally do that when the file is changed. static bool wmo_loaded = false ; if( wmo_loaded == false ) { wmo_loaded = true ; SynopDB::Init(PKGDATADIR); } /// Used by weather reports decoding. synop::setup(); synop::instance()->init(); } void rtty::init() { bool wfrev = wf->Reverse(); bool wfsb = wf->USB(); // Probably not necessary because similar to modem::set_reverse reverse = wfrev ^ !wfsb; stopflag = false; if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.RTTYsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); rx_init(); put_MODEstatus(mode); if ((rtty_baud - (int)rtty_baud) == 0) snprintf(msg1, sizeof(msg1), "%-3.0f/%-4.0f", rtty_baud, rtty_shift); else snprintf(msg1, sizeof(msg1), "%-4.2f/%-4.0f", rtty_baud, rtty_shift); put_Status1(msg1); if (progdefaults.PreferXhairScope) set_scope_mode(Digiscope::XHAIRS); else set_scope_mode(Digiscope::RTTY); for (int i = 0; i < MAXPIPE; i++) mark_history[i] = space_history[i] = cmplx(0,0); lastchar = 0; } rtty::~rtty() { if (mark_filt) delete mark_filt; if (space_filt) delete space_filt; if (pipe) delete [] pipe; if (dsppipe) delete [] dsppipe; delete m_Osc1; delete m_Osc2; delete m_SymShaper1; delete m_SymShaper2; } void rtty::reset_filters() { int filter_length = 1024; if (mark_filt) { mark_filt->rtty_filter(rtty_baud/samplerate); } else { mark_filt = new fftfilt(rtty_baud/samplerate, filter_length); mark_filt->rtty_filter(rtty_baud/samplerate); } if (space_filt) { space_filt->rtty_filter(rtty_baud/samplerate); } else { space_filt = new fftfilt(rtty_baud/samplerate, filter_length); space_filt->rtty_filter(rtty_baud/samplerate); } } void rtty::restart() { double stl; rtty_shift = shift = (progdefaults.rtty_shift >= 0 ? SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift); rtty_baud = BAUD[progdefaults.rtty_baud]; nbits = rtty_bits = BITS[progdefaults.rtty_bits]; if (rtty_bits == 5) rtty_parity = RTTY_PARITY_NONE; else switch (progdefaults.rtty_parity) { case 0 : rtty_parity = RTTY_PARITY_NONE; break; case 1 : rtty_parity = RTTY_PARITY_EVEN; break; case 2 : rtty_parity = RTTY_PARITY_ODD; break; case 3 : rtty_parity = RTTY_PARITY_ZERO; break; case 4 : rtty_parity = RTTY_PARITY_ONE; break; default : rtty_parity = RTTY_PARITY_NONE; break; } rtty_stop = progdefaults.rtty_stop; txmode = LETTERS; rxmode = LETTERS; symbollen = (int) (samplerate / rtty_baud + 0.5); set_bandwidth(shift); rtty_BW = progdefaults.RTTY_BW = rtty_baud * 2; wf->redraw_marker(); reset_filters(); if (bits) bits->setLength(symbollen / 8);//2); else bits = new Cmovavg(symbollen / 8);//2); mark_noise = space_noise = 0; bit = nubit = true; // stop length = 1, 1.5 or 2 bits rtty_stop = progdefaults.rtty_stop; if (rtty_stop == 0) stl = 1.0; else if (rtty_stop == 1) stl = 1.5; else stl = 2.0; stoplen = (int) (stl * samplerate / rtty_baud + 0.5); freqerr = 0.0; pipeptr = 0; for (int i = 0; i < MAXBITS; i++ ) bit_buf[i] = 0.0; metric = 0.0; if ((rtty_baud - (int)rtty_baud) == 0) snprintf(msg1, sizeof(msg1), "%-3.0f/%-4.0f", rtty_baud, rtty_shift); else snprintf(msg1, sizeof(msg1), "%-4.2f/%-4.0f", rtty_baud, rtty_shift); put_Status1(msg1); put_MODEstatus(mode); for (int i = 0; i < MAXPIPE; i++) QI[i] = cmplx(0.0, 0.0); sigpwr = 0.0; noisepwr = 0.0; sigsearch = 0; dspcnt = 2*(nbits + 2); clear_zdata = true; // restart symbol-rtty_shaper m_SymShaper1->Preset(rtty_baud, samplerate); m_SymShaper2->Preset(rtty_baud, samplerate); mark_phase = 0; space_phase = 0; xy_phase = 0.0; mark_mag = 0; space_mag = 0; mark_env = 0; space_env = 0; inp_ptr = 0; for (int i = 0; i < MAXPIPE; i++) mark_history[i] = space_history[i] = cmplx(0,0); rttyviewer->restart(); progStatus.rtty_filter_changed = false; } rtty::rtty(trx_mode tty_mode) { cap |= CAP_AFC | CAP_REV; mode = tty_mode; samplerate = RTTY_SampleRate; mark_filt = (fftfilt *)0; space_filt = (fftfilt *)0; bits = (Cmovavg *)0; pipe = new double[MAXPIPE]; dsppipe = new double [MAXPIPE]; ::rttyviewer = new view_rtty(mode); m_Osc1 = new Oscillator( samplerate ); m_Osc2 = new Oscillator( samplerate ); m_SymShaper1 = new SymbolShaper( 45, samplerate ); m_SymShaper2 = new SymbolShaper( 45, samplerate ); restart(); } void rtty::Update_syncscope() { int j; for (int i = 0; i < symbollen; i++) { j = pipeptr - i; if (j < 0) j += symbollen; dsppipe[i] = pipe[j]; } set_scope(dsppipe, symbollen, false); } void rtty::Clear_syncscope() { set_scope(0, 0, false); } cmplx rtty::mixer(double &phase, double f, cmplx in) { cmplx z = cmplx( cos(phase), sin(phase)) * in; phase -= TWOPI * f / samplerate; if (phase < -TWOPI) phase += TWOPI; return z; } unsigned char rtty::Bit_reverse(unsigned char in, int n) { unsigned char out = 0; for (int i = 0; i < n; i++) out = (out << 1) | ((in >> i) & 1); return out; } static int rparity(int c) { int w = c; int p = 0; while (w) { p += (w & 1); w >>= 1; } return p & 1; } int rtty::rttyparity(unsigned int c) { c &= (1 << nbits) - 1; switch (rtty_parity) { default: case RTTY_PARITY_NONE: return 0; case RTTY_PARITY_ODD: return rparity(c); case RTTY_PARITY_EVEN: return !rparity(c); case RTTY_PARITY_ZERO: return 0; case RTTY_PARITY_ONE: return 1; } } int rtty::decode_char() { unsigned int parbit, par, data; parbit = (rxdata >> nbits) & 1; par = rttyparity(rxdata); if (rtty_parity != RTTY_PARITY_NONE && parbit != par) return 0; data = rxdata & ((1 << nbits) - 1); if (nbits == 5) return baudot_dec(data); return data; } bool rtty::is_mark_space( int &correction) { correction = 0; // test for rough bit position if (bit_buf[0] && !bit_buf[symbollen-1]) { // test for mark/space straddle point for (int i = 0; i < symbollen; i++) correction += bit_buf[i]; if (abs(symbollen/2 - correction) < 6) // too small & bad signals are not decoded return true; } return false; } bool rtty::is_mark() { return bit_buf[symbollen / 2]; } bool rtty::rx(bool bit) // original modified for probability test { bool flag = false; unsigned char c = 0; int correction; for (int i = 1; i < symbollen; i++) bit_buf[i-1] = bit_buf[i]; bit_buf[symbollen - 1] = bit; switch (rxstate) { case RTTY_RX_STATE_IDLE: if ( is_mark_space(correction)) { rxstate = RTTY_RX_STATE_START; counter = correction; } break; case RTTY_RX_STATE_START: if (--counter == 0) { if (!is_mark()) { rxstate = RTTY_RX_STATE_DATA; counter = symbollen; bitcntr = 0; rxdata = 0; } else { rxstate = RTTY_RX_STATE_IDLE; } } break; case RTTY_RX_STATE_DATA: if (--counter == 0) { rxdata |= is_mark() << bitcntr++; counter = symbollen; } if (bitcntr == nbits + (rtty_parity != RTTY_PARITY_NONE ? 1 : 0)) rxstate = RTTY_RX_STATE_STOP; break; case RTTY_RX_STATE_STOP: if (--counter == 0) { if (is_mark()) { if ((metric >= progStatus.sldrSquelchValue && progStatus.sqlonoff) || !progStatus.sqlonoff) { c = decode_char(); if( progdefaults.SynopAdifDecoding || progdefaults.SynopKmlDecoding ) { if (c != 0 && c != '\r') { synop::instance()->add(c); } else { if( synop::instance()->enabled() ) synop::instance()->flush(false); put_rx_char(c); } } else if ( c != 0 ) { // supress and sequences // these were observed during the RTTY contest 2/9/2013 if (c == '\r' && lastchar == '\r'); else if (c == '\n' && lastchar == '\n'); else put_rx_char(progdefaults.rx_lowercase ? tolower(c) : c); lastchar = c; } flag = true; } } rxstate = RTTY_RX_STATE_IDLE; } break; default : break; } return flag; } char snrmsg[80]; void rtty::Metric() { double delta = rtty_baud/8.0; double np = wf->powerDensity(frequency, delta) * 3000 / delta; double sp = wf->powerDensity(frequency - shift/2, delta) + wf->powerDensity(frequency + shift/2, delta) + 1e-10; double snr = 0; sigpwr = decayavg( sigpwr, sp, sp > sigpwr ? 2 : 8); noisepwr = decayavg( noisepwr, np, 16 ); snr = 10*log10(sigpwr / noisepwr); snprintf(snrmsg, sizeof(snrmsg), "s/n %-3.0f dB", snr); put_Status2(snrmsg); metric = CLAMP((3000 / delta) * (sigpwr/noisepwr), 0.0, 100.0); display_metric(metric); } void rtty::searchDown() { double srchfreq = frequency - shift -100; double minfreq = shift * 2 + 100; double spwrlo, spwrhi, npwr; while (srchfreq > minfreq) { spwrlo = wf->powerDensity(srchfreq - shift/2, 2*rtty_baud); spwrhi = wf->powerDensity(srchfreq + shift/2, 2*rtty_baud); npwr = wf->powerDensity(srchfreq + shift, 2*rtty_baud) + 1e-10; if ((spwrlo / npwr > 10.0) && (spwrhi / npwr > 10.0)) { frequency = srchfreq; set_freq(frequency); sigsearch = SIGSEARCH; break; } srchfreq -= 5.0; } } void rtty::searchUp() { double srchfreq = frequency + shift +100; double maxfreq = IMAGE_WIDTH - shift * 2 - 100; double spwrhi, spwrlo, npwr; while (srchfreq < maxfreq) { spwrlo = wf->powerDensity(srchfreq - shift/2, 2*rtty_baud); spwrhi = wf->powerDensity(srchfreq + shift/2, 2*rtty_baud); npwr = wf->powerDensity(srchfreq - shift, 2*rtty_baud) + 1e-10; if ((spwrlo / npwr > 10.0) && (spwrhi / npwr > 10.0)) { frequency = srchfreq; set_freq(frequency); sigsearch = SIGSEARCH; break; } srchfreq += 5.0; } } #if FILTER_DEBUG == 1 int snum = 0; int mnum = 0; #define ook(sp) \ { \ value = sin(2.0*M_PI*( \ (((sp / symbollen) % 2 == 0) ? (frequency + shift/2.0) : (frequency - shift/2.0))\ /samplerate)*sp); \ } std::fstream ook_signal("ook_signal.csv", std::ios::out ); #endif int rtty::rx_process(const double *buf, int len) { const double *buffer = buf; int length = len; static int showxy = symbollen; cmplx z, zmark, zspace, *zp_mark, *zp_space; int n_out = 0; static int bitcount = 5 * nbits * symbollen; if ( !progdefaults.report_when_visible || dlgViewer->visible() || progStatus.show_channels ) if (!bHistory && rttyviewer) rttyviewer->rx_process(buf, len); if (progStatus.rtty_filter_changed) { progStatus.rtty_filter_changed = false; reset_filters(); } Metric(); #if FILTER_DEBUG == 1 double value; #endif while (length-- > 0) { // Create analytic signal from sound card input samples #if FILTER_DEBUG == 1 if (snum < 2 * filter_length) { frequency = 1000.0; ook(snum); z = complex(value, value); ook_signal << snum << "," << z.real() << ","; // snum++; } else { z = cmplx(*buffer, *buffer); } #else z = cmplx(*buffer, *buffer); #endif buffer++; // Mix it with the audio carrier frequency to create two baseband signals // mark and space are separated and processed independently // lowpass Windowed Sinc - Overlap-Add convolution filters. // The two fftfilt's are the same size and processed in sync // therefore the mark and space filters will concurrently have the // same size outputs available for further processing zmark = mixer(mark_phase, frequency + shift/2.0, z); mark_filt->run(zmark, &zp_mark); zspace = mixer(space_phase, frequency - shift/2.0, z); n_out = space_filt->run(zspace, &zp_space); #if FILTER_DEBUG == 1 if (snum < 2 * filter_length) { ook_signal << abs(zmark) <<"\n"; snum++; } #endif for (int i = 0; i < n_out; i++) { mark_mag = abs(zp_mark[i]); mark_env = decayavg (mark_env, mark_mag, (mark_mag > mark_env) ? symbollen / 4 : symbollen * 16); mark_noise = decayavg (mark_noise, mark_mag, (mark_mag < mark_noise) ? symbollen / 4 : symbollen * 48); space_mag = abs(zp_space[i]); space_env = decayavg (space_env, space_mag, (space_mag > space_env) ? symbollen / 4 : symbollen * 16); space_noise = decayavg (space_noise, space_mag, (space_mag < space_noise) ? symbollen / 4 : symbollen * 48); #if FILTER_DEBUG == 1 if (mnum < 2 * filter_length) ook_signal << ",,," << mnum++ + filter_length / 2 << "," << mark_mag << "," << space_mag << "\n"; #endif noise_floor = min(space_noise, mark_noise); // clipped if clipped decoder selected double mclipped = 0, sclipped = 0; mclipped = mark_mag > mark_env ? mark_env : mark_mag; sclipped = space_mag > space_env ? space_env : space_mag; if (mclipped < noise_floor) mclipped = noise_floor; if (sclipped < noise_floor) sclipped = noise_floor; switch (progdefaults.rtty_cwi) { case 1 : // mark only decode space_env = sclipped = noise_floor; break; case 2: // space only decode mark_env = mclipped = noise_floor; default : ; } // double v0, v1, v2, v3, v4, v5; double v3; // no ATC // v0 = mark_mag - space_mag; // Linear ATC // v1 = mark_mag - space_mag - 0.5 * (mark_env - space_env); // Clipped ATC // v2 = (mclipped - noise_floor) - (sclipped - noise_floor) - 0.5 * ( // (mark_env - noise_floor) - (space_env - noise_floor)); // Optimal ATC v3 = (mclipped - noise_floor) * (mark_env - noise_floor) - (sclipped - noise_floor) * (space_env - noise_floor) - 0.25 * ( (mark_env - noise_floor) * (mark_env - noise_floor) - (space_env - noise_floor) * (space_env - noise_floor)); // Kahn Squarer with Linear ATC // v4 = (mark_mag - noise_floor) * (mark_mag - noise_floor) - // (space_mag - noise_floor) * (space_mag - noise_floor) - 0.25 * ( // (mark_env - noise_floor) * (mark_env - noise_floor) - // (space_env - noise_floor) * (space_env - noise_floor)); // Kahn Squarer with Clipped ATC // v5 = (mclipped - noise_floor) * (mclipped - noise_floor) - // (sclipped - noise_floor) * (sclipped - noise_floor) - 0.25 * ( // (mark_env - noise_floor) * (mark_env - noise_floor) - // (space_env - noise_floor) * (space_env - noise_floor)); // switch (progdefaults.rtty_demodulator) { // switch (2) { // Optimal ATC // case 0: // linear ATC // bit = v1 > 0; // break; // case 1: // clipped ATC // bit = v2 > 0; // break; // case 2: // optimal ATC bit = v3 > 0; // break; // case 3: // Kahn linear ATC // bit = v4 > 0; // break; // case 4: // Kahn clipped // bit = v5 > 0; // break; // case 5: // No ATC // default : // bit = v0 > 0; // } // XY scope signal generation if (progdefaults.true_scope) { //---------------------------------------------------------------------- // "true" scope implementation------------------------------------------ //---------------------------------------------------------------------- // get the baseband-signal and... xy = cmplx( zp_mark[i].real() * cos(xy_phase) + zp_mark[i].imag() * sin(xy_phase), zp_space[i].real() * cos(xy_phase) + zp_space[i].imag() * sin(xy_phase) ); // if mark-tone has a higher magnitude than the space-tone, // further reduce the scope's space-amplitude and vice versa // this makes the scope looking a little bit nicer, too... // aka: less noisy... if( abs(zp_mark[i]) > abs(zp_space[i]) ) { // note ox x complex lib does not support xy.real(double) or xy.imag(double) xy = cmplx( xy.real(), xy.imag() * abs(zp_space[i])/abs(zp_mark[i]) ); // xy.imag() *= abs(zp_space[i])/abs(zp_mark[i]); } else { xy = cmplx( xy.real() / ( abs(zp_space[i])/abs(zp_mark[i]) ), xy.imag() ); // xy.real() /= abs(zp_space[i])/abs(zp_mark[i]); } // now normalize the scope double const norm = 1.3*(abs(zp_mark [i]) + abs(zp_space[i])); xy /= norm; } else { //---------------------------------------------------------------------- // "ortho" scope implementation----------------------------------------- //---------------------------------------------------------------------- // get magnitude of the baseband-signal if (bit) xy = cmplx( mark_mag * cos(xy_phase), space_noise * sin(xy_phase) / 2.0); else xy = cmplx( mark_noise * cos(xy_phase) / 2.0, space_mag * sin(xy_phase)); // now normalize the scope double const norm = (mark_env + space_env); xy /= norm; } // Rotate the scope x-y iaw frequency error. Old scopes were not capable // of this, but it should be very handy, so... who cares of realism anyways? double const rotate = 8 * TWOPI * freqerr / rtty_shift; xy = xy * cmplx(cos(rotate), sin(rotate)); QI[inp_ptr] = xy; // shift it to 128Hz(!) and not to it's original position. // this makes it more pretty and does not remove it's other // qualities. Reason is that this is a fraction of the used // block-size. xy_phase += (TWOPI * (128.0 / samplerate)); // end XY signal generation mark_history[inp_ptr] = zp_mark[i]; space_history[inp_ptr] = zp_space[i]; inp_ptr = (inp_ptr + 1) % MAXPIPE; if (dspcnt && (--dspcnt % (nbits + 2) == 0)) { pipe[pipeptr] = bit - 0.5; //testbit - 0.5; pipeptr = (pipeptr + 1) % symbollen; } // detect TTY signal transitions // rx(...) returns true if valid TTY bit stream detected // either character or idle signal if ( rx( reverse ? !bit : bit ) ) { dspcnt = symbollen * (nbits + 2); if (!bHighSpeed) Update_syncscope(); clear_zdata = true; bitcount = 5 * nbits * symbollen; if (sigsearch) sigsearch--; int mp0 = inp_ptr - 2; int mp1 = mp0 + 1; if (mp0 < 0) mp0 += MAXPIPE; if (mp1 < 0) mp1 += MAXPIPE; double ferr = (TWOPI * samplerate / rtty_baud) * (!reverse ? arg(conj(mark_history[mp1]) * mark_history[mp0]) : arg(conj(space_history[mp1]) * space_history[mp0])); if (fabs(ferr) > rtty_baud / 2) ferr = 0; freqerr = decayavg ( freqerr, ferr / 8, progdefaults.rtty_afcspeed == 0 ? 8 : progdefaults.rtty_afcspeed == 1 ? 4 : 1 ); if (progStatus.afconoff && (metric > progStatus.sldrSquelchValue || !progStatus.sqlonoff)) set_freq(frequency - freqerr); } else if (bitcount) --bitcount; } if (!bHighSpeed) { if (!bitcount) { if (clear_zdata) { clear_zdata = false; Clear_syncscope(); for (int i = 0; i < MAXPIPE; i++) QI[i] = cmplx(0.0, 0.0); } } if (!--showxy) { set_zdata(QI, MAXPIPE); showxy = symbollen; } } } return 0; } //===================================================================== // RTTY transmit //===================================================================== //double freq1; double maxamp = 0; double rtty::nco(double freq) { phaseacc += TWOPI * freq / samplerate; if (phaseacc > M_PI) phaseacc -= TWOPI; return cos(phaseacc); } double rtty::FSKnco() { FSKphaseacc += TWOPI * 1000 / samplerate; if (FSKphaseacc > M_PI) FSKphaseacc -= TWOPI; return sin(FSKphaseacc); } void rtty::send_symbol(int symbol, int len) { acc_symbols += len; #if 0 double freq; if (reverse) symbol = !symbol; if (symbol) freq = get_txfreq_woffset() + shift / 2.0; else freq = get_txfreq_woffset() - shift / 2.0; for (int i = 0; i < len; i++) { outbuf[i] = nco(freq); if (symbol) FSKbuf[i] = FSKnco(); else FSKbuf[i] = 0.0 * FSKnco(); } #else double const freq1 = get_txfreq_woffset() + shift / 2.0; double const freq2 = get_txfreq_woffset() - shift / 2.0; double mark = 0, space = 0; double signal = 0; if (reverse) symbol = !symbol; if (maxamp == 0) { int sym = 0; for (int j = 0; j < 100; j++) { if (sym) sym = 0; else sym = 1; for( int i = 0; i < 3*len; ++i ) { mark = m_SymShaper1->Update( sym) * m_Osc1->Update( freq1 ); space = m_SymShaper2->Update(!sym) * m_Osc2->Update( freq2 ); signal = mark + space; if (maxamp < fabs(signal)) maxamp = fabs(signal); } } } for( int i = 0; i < len; ++i ) { mark = m_SymShaper1->Update( symbol) * m_Osc1->Update( freq1 ); space = m_SymShaper2->Update(!symbol) * m_Osc2->Update( freq2 ); signal = mark + space; if (maxamp < fabs(signal)) { maxamp = fabs(signal); } outbuf[i] = maxamp ? (0.99 * signal / maxamp) : 0.0; if (symbol) FSKbuf[i] = FSKnco(); else FSKbuf[i] = 0.0 * FSKnco(); } #endif if (progdefaults.PseudoFSK) ModulateStereo(outbuf, FSKbuf, symbollen); else ModulateXmtr(outbuf, symbollen); } void rtty::send_stop() { #if 0 double freq; bool invert = reverse; if (invert) freq = get_txfreq_woffset() - shift / 2.0; else freq = get_txfreq_woffset() + shift / 2.0; for (int i = 0; i < stoplen; i++) { outbuf[i] = nco(freq); if (invert) FSKbuf[i] = 0.0 * FSKnco(); else FSKbuf[i] = FSKnco(); } #else double const freq1 = get_txfreq_woffset() + shift / 2.0; double const freq2 = get_txfreq_woffset() - shift / 2.0; double mark = 0, space = 0, signal = 0; bool symbol = true; if (reverse) symbol = !symbol; for( int i = 0; i < stoplen; ++i ) { mark = m_SymShaper1->Update( symbol)*m_Osc1->Update( freq1 ); space = m_SymShaper2->Update(!symbol)*m_Osc2->Update( freq2 ); signal = mark + space; if (maxamp < fabs(signal)) maxamp = fabs(signal); outbuf[i] = maxamp ? (0.99 * signal / maxamp) : 0.0; if (reverse) FSKbuf[i] = 0.0 * FSKnco(); else FSKbuf[i] = FSKnco(); } #endif if (progdefaults.PseudoFSK) ModulateStereo(outbuf, FSKbuf, stoplen); else ModulateXmtr(outbuf, stoplen); } void rtty::flush_stream() { double const freq1 = get_txfreq_woffset() + shift / 2.0; double const freq2 = get_txfreq_woffset() - shift / 2.0; double mark = 0, space = 0, signal = 0; for( int i = 0; i < symbollen * 6; ++i ) { mark = m_SymShaper1->Update(0)*m_Osc1->Update( freq1 ); space = m_SymShaper2->Update(0)*m_Osc2->Update( freq2 ); signal = mark + space; if (maxamp < fabs(signal)) maxamp = fabs(signal); outbuf[i] = maxamp ? (0.99 * signal / maxamp) : 0.0; FSKbuf[i] = 0.0; } if (progdefaults.PseudoFSK) ModulateStereo(outbuf, FSKbuf, symbollen * 6); else ModulateXmtr(outbuf, symbollen * 6); } void rtty::send_char(int c) { int i; if (nbits == 5) { if (c == LETTERS) c = 0x1F; if (c == FIGURES) c = 0x1B; } // start bit send_symbol(0, symbollen); // data bits for (i = 0; i < nbits; i++) { send_symbol((c >> i) & 1, symbollen); } // parity bit if (rtty_parity != RTTY_PARITY_NONE) send_symbol(rttyparity(c), symbollen); // stop bit(s) send_stop(); if (nbits == 5) { if (c == 0x1F || c == 0x1B) return; if (txmode == LETTERS) c = letters[c]; else c = figures[c]; if (c) put_echo_char(progdefaults.rx_lowercase ? tolower(c) : c); } else if (c) put_echo_char(c); } void rtty::send_idle() { if (nbits == 5) { send_char(LETTERS); txmode = LETTERS; } else send_char(0); } static int line_char_count = 0; int rtty::tx_process() { int c; if (preamble) { m_SymShaper1->reset(); m_SymShaper2->reset(); for (int i = 0; i < nbits + 1; i++) send_symbol(0, symbollen); send_stop(); for (int i = 0; i < nbits + 1; i++) send_symbol(1, symbollen); send_stop(); send_idle(); preamble = false; // freq1 = get_txfreq_woffset() + shift / 2.0; } c = get_tx_char(); // TX buffer empty if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; line_char_count = 0; if (nbits != 5) { if (progdefaults.rtty_crcrlf) send_char('\r'); send_char('\r'); send_char('\n'); } else { if (progdefaults.rtty_crcrlf) send_char(0x08); send_char(0x08); send_char(0x02); } #if 1 // if (progdefaults.rtty_shaper) flush_stream(); #endif cwid(); return -1; } // send idle character if c == -1 if (c == GET_TX_CHAR_NODATA) { send_idle(); return 0; } // if NOT Baudot if (nbits != 5) { /// acc_symbols = 0; send_char(c); xmt_samples = char_samples = acc_symbols; // printf("%5s %d samples, overhead %d, %f sec's\n", // ascii3[c & 0xff], // char_samples, // ovhd_samples, // 1.0 * char_samples / samplerate); return 0; } if (isalpha(c) || isdigit(c) || isblank(c) || ispunct(c)) { ++line_char_count; } if (progdefaults.rtty_autocrlf && (c != '\n' && c != '\r') && (line_char_count == progdefaults.rtty_autocount || (line_char_count > progdefaults.rtty_autocount - 5 && c == ' '))) { line_char_count = 0; if (progdefaults.rtty_crcrlf) send_char(0x08); // CR-CR-LF triplet send_char(0x08); send_char(0x02); if (c == ' ') return 0; } if (c == '\r') { line_char_count = 0; send_char(0x08); return 0; } if (c == '\n') { line_char_count = 0; if (progdefaults.rtty_crcrlf) send_char(0x08); // CR-CR-LF triplet send_char(0x02); return 0; } /* unshift-on-space */ if (c == ' ') { if (progdefaults.UOStx) { send_char(LETTERS); send_char(0x04); // coded value for a space txmode = LETTERS; } else send_char(0x04); return 0; } if ((c = baudot_enc(c)) < 0) return 0; // switch case if necessary if ((c & 0x300) != txmode) { if (txmode == FIGURES) { send_char(LETTERS); txmode = LETTERS; } else { send_char(FIGURES); txmode = FIGURES; } } /// acc_symbols = 0; send_char(c & 0x1F); xmt_samples = char_samples = acc_symbols; // printf("%5s %d samples, overhead %d, %f sec's\n", // ascii3[c & 0xff], // char_samples, // ovhd_samples, // 1.0 * char_samples / samplerate); return 0; } int rtty::baudot_enc(unsigned char data) { int i, c, mode; mode = 0; c = -1; if (islower(data)) data = toupper(data); for (i = 0; i < 32; i++) { if (data == letters[i]) { mode |= LETTERS; c = i; } if (data == figures[i]) { mode |= FIGURES; c = i; } if (c != -1) return (mode | c); } return -1; } char rtty::baudot_dec(unsigned char data) { int out = 0; switch (data) { case 0x1F: /* letters */ rxmode = LETTERS; break; case 0x1B: /* figures */ rxmode = FIGURES; break; case 0x04: /* unshift-on-space */ if (progdefaults.UOSrx) rxmode = LETTERS; return ' '; break; default: if (rxmode == LETTERS) out = letters[data]; else out = figures[data]; break; } return out; } //====================================================================== // methods for class Oscillator and class SymbolShaper //====================================================================== Oscillator::Oscillator( double samplerate ) { m_phase = 0; m_samplerate = samplerate; std::cerr << "samplerate for Oscillator:"< M_PI ) m_phase -= TWOPI; return ( sin( m_phase ) ); } SymbolShaper::SymbolShaper(double baud, double sr) { m_sinc_table = 0; Preset( baud, sr ); } void SymbolShaper::reset() { m_State = false; m_Accumulator = 0.0; m_Counter0 = 1024; m_Counter1 = 1024; m_Counter2 = 1024; m_Counter3 = 1024; m_Counter4 = 1024; m_Counter5 = 1024; m_Factor0 = 0.0; m_Factor1 = 0.0; m_Factor2 = 0.0; m_Factor3 = 0.0; m_Factor4 = 0.0; m_Factor5 = 0.0; } void SymbolShaper::Preset(double baud, double sr) { double baud_rate = baud; double sample_rate = sr; LOG_INFO("Shaper::reset( %f, %f )", baud_rate, sample_rate); // calculate new table-size for six integrators ---------------------- m_table_size = sample_rate / baud_rate * 5.49; LOG_INFO("Shaper::m_table_size = %d", m_table_size); // kill old sinc-table and get memory for the new one ----------------- delete [] m_sinc_table; m_sinc_table = new double[m_table_size]; // set up the new sinc-table based on the new parameters -------------- long double sum = 0.0; for( int x=0; x= m_table_size ) { m_Counter0 = 0; m_Factor0 = (state)? +1.0 : -1.0; } else if( m_Counter1 >= m_table_size ) { m_Counter1 = 0; m_Factor1 = (state)? +1.0 : -1.0; } else if( m_Counter2 >= m_table_size ) { m_Counter2 = 0; m_Factor2 = (state)? +1.0 : -1.0; } else if( m_Counter3 >= m_table_size ) { m_Counter3 = 0; m_Factor3 = (state)? +1.0 : -1.0; } else if( m_Counter4 >= m_table_size ) { m_Counter4 = 0; m_Factor4 = (state)? +1.0 : -1.0; } else if( m_Counter5 >= m_table_size ) { m_Counter5 = 0; m_Factor5 = (state)? +1.0 : -1.0; } } if( m_Counter0 < m_table_size ) m_Accumulator += m_Factor0 * m_sinc_table[m_Counter0++]; if( m_Counter1 < m_table_size ) m_Accumulator += m_Factor1 * m_sinc_table[m_Counter1++]; if( m_Counter2 < m_table_size ) m_Accumulator += m_Factor2 * m_sinc_table[m_Counter2++]; if( m_Counter3 < m_table_size ) m_Accumulator += m_Factor3 * m_sinc_table[m_Counter3++]; if( m_Counter4 < m_table_size ) m_Accumulator += m_Factor4 * m_sinc_table[m_Counter4++]; if( m_Counter5 < m_table_size ) m_Accumulator += m_Factor5 * m_sinc_table[m_Counter5++]; return ( m_Accumulator / sqrt(2) ); } void SymbolShaper::print_sinc_table() { for (int i = 0; i < 1024; i++) printf("%f\n", m_SincTable[i]); } fldigi-3.21.80/src/cw_rtty/view_rtty.cxx0000664000175000017500000004036612313064025015115 00000000000000// ---------------------------------------------------------------------------- // rtty.cxx -- RTTY modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include using namespace std; #include "rtty.h" #include "view_rtty.h" #include "fl_digi.h" #include "digiscope.h" #include "misc.h" #include "waterfall.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "digiscope.h" #include "Viewer.h" #include "qrunner.h" //===================================================================== // Baudot support //===================================================================== static char letters[32] = { '\0', 'E', '\n', 'A', ' ', 'S', 'I', 'U', '\r', 'D', 'R', 'J', 'N', 'F', 'C', 'K', 'T', 'Z', 'L', 'W', 'H', 'Y', 'P', 'Q', 'O', 'B', 'G', ' ', 'M', 'X', 'V', ' ' }; // U.S. version of the figures case. static char figures[32] = { '\0', '3', '\n', '-', ' ', '\a', '8', '7', '\r', '$', '4', '\'', ',', '!', ':', '(', '5', '"', ')', '2', '#', '6', '0', '1', '9', '?', '&', ' ', '.', '/', ';', ' ' }; const double view_rtty::SHIFT[] = {23, 85, 160, 170, 182, 200, 240, 350, 425, 850}; const double view_rtty::BAUD[] = {45, 45.45, 50, 56, 75, 100, 110, 150, 200, 300}; const int view_rtty::BITS[] = {5, 7, 8}; void view_rtty::rx_init() { for (int ch = 0; ch < progdefaults.VIEWERchannels; ch++) { channel[ch].state = IDLE; channel[ch].rxstate = RTTY_RX_STATE_IDLE; channel[ch].rxmode = LETTERS; channel[ch].phaseacc = 0; channel[ch].timeout = 0; channel[ch].frequency = NULLFREQ; channel[ch].poserr = channel[ch].negerr = 0.0; channel[ch].mark_phase = 0; channel[ch].space_phase = 0; channel[ch].mark_mag = 0; channel[ch].space_mag = 0; channel[ch].mark_env = 0; channel[ch].space_env = 0; channel[ch].inp_ptr = 0; for (int i = 0; i < MAXPIPE; i++) channel[ch].mark_history[i] = channel[ch].space_history[i] = cmplx(0,0); } } void view_rtty::init() { bool wfrev = wf->Reverse(); bool wfsb = wf->USB(); reverse = wfrev ^ !wfsb; rx_init(); } view_rtty::~view_rtty() { for (int ch = 0; ch < MAX_CHANNELS; ch ++) { if (channel[ch].mark_filt) delete channel[ch].mark_filt; if (channel[ch].space_filt) delete channel[ch].space_filt; } } void view_rtty::reset_filters(int ch) { int filter_length = 1024; if (channel[ch].mark_filt) { channel[ch].mark_filt->rtty_filter(rtty_baud/samplerate); } else { channel[ch].mark_filt = new fftfilt(rtty_baud/samplerate, filter_length); channel[ch].mark_filt->rtty_filter(rtty_baud/samplerate); } if (channel[ch].space_filt) { channel[ch].space_filt->rtty_filter(rtty_baud/samplerate); } else { channel[ch].space_filt = new fftfilt(rtty_baud/samplerate, filter_length); channel[ch].space_filt->rtty_filter(rtty_baud/samplerate); } } void view_rtty::restart() { double stl; rtty_shift = shift = (progdefaults.rtty_shift >= 0 ? SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift); rtty_baud = BAUD[progdefaults.rtty_baud]; nbits = rtty_bits = BITS[progdefaults.rtty_bits]; if (rtty_bits == 5) rtty_parity = RTTY_PARITY_NONE; else switch (progdefaults.rtty_parity) { case 0 : rtty_parity = RTTY_PARITY_NONE; break; case 1 : rtty_parity = RTTY_PARITY_EVEN; break; case 2 : rtty_parity = RTTY_PARITY_ODD; break; case 3 : rtty_parity = RTTY_PARITY_ZERO; break; case 4 : rtty_parity = RTTY_PARITY_ONE; break; default : rtty_parity = RTTY_PARITY_NONE; break; } rtty_stop = progdefaults.rtty_stop; symbollen = (int) (samplerate / rtty_baud + 0.5); bflen = symbollen/3; set_bandwidth(shift); rtty_BW = progdefaults.RTTY_BW; bp_filt_lo = (shift/2.0 - rtty_BW/2.0) / samplerate; if (bp_filt_lo < 0) bp_filt_lo = 0; bp_filt_hi = (shift/2.0 + rtty_BW/2.0) / samplerate; for (int ch = 0; ch < MAX_CHANNELS; ch ++) { reset_filters(ch); channel[ch].state = IDLE; channel[ch].timeout = 0; channel[ch].freqerr = 0.0; channel[ch].metric = 0.0; channel[ch].sigpwr = 0.0; channel[ch].noisepwr = 0.0; channel[ch].sigsearch = 0; channel[ch].frequency = NULLFREQ; channel[ch].counter = symbollen / 2; channel[ch].mark_phase = 0; channel[ch].space_phase = 0; channel[ch].mark_mag = 0; channel[ch].space_mag = 0; channel[ch].mark_env = 0; channel[ch].space_env = 0; channel[ch].inp_ptr = 0; if (channel[ch].bits) channel[ch].bits->setLength(symbollen / 8); else channel[ch].bits = new Cmovavg(symbollen / 8); channel[ch].mark_noise = channel[ch].space_noise = 0; channel[ch].bit = channel[ch].nubit = true; for (int i = 0; i < VIEW_RTTY_MAXBITS; i++) channel[ch].bit_buf[i] = 0.0; for (int i = 0; i < MAXPIPE; i++) channel[ch].mark_history[i] = channel[ch].space_history[i] = cmplx(0,0); } // stop length = 1, 1.5 or 2 bits rtty_stop = progdefaults.rtty_stop; if (rtty_stop == 0) stl = 1.0; else if (rtty_stop == 1) stl = 1.5; else stl = 2.0; stoplen = (int) (stl * samplerate / rtty_baud + 0.5); rx_init(); } view_rtty::view_rtty(trx_mode tty_mode) { cap |= CAP_AFC | CAP_REV; mode = tty_mode; samplerate = RTTY_SampleRate; for (int ch = 0; ch < MAX_CHANNELS; ch ++) { channel[ch].mark_filt = (fftfilt *)0; channel[ch].space_filt = (fftfilt *)0; channel[ch].bits = (Cmovavg *)0; } restart(); } cmplx view_rtty::mixer(double &phase, double f, cmplx in) { cmplx z = cmplx( cos(phase), sin(phase)) * in;; phase -= TWOPI * f / samplerate; if (phase < - TWOPI) phase += TWOPI; return z; } unsigned char view_rtty::bitreverse(unsigned char in, int n) { unsigned char out = 0; for (int i = 0; i < n; i++) out = (out << 1) | ((in >> i) & 1); return out; } static int rparity(int c) { int w = c; int p = 0; while (w) { p += (w & 1); w >>= 1; } return p & 1; } int view_rtty::rttyparity(unsigned int c) { c &= (1 << nbits) - 1; switch (rtty_parity) { default: case RTTY_PARITY_NONE: return 0; case RTTY_PARITY_ODD: return rparity(c); case RTTY_PARITY_EVEN: return !rparity(c); case RTTY_PARITY_ZERO: return 0; case RTTY_PARITY_ONE: return 1; } } int view_rtty::decode_char(int ch) { unsigned int parbit, par, data; parbit = (channel[ch].rxdata >> nbits) & 1; par = rttyparity(channel[ch].rxdata); if (rtty_parity != RTTY_PARITY_NONE && parbit != par) return 0; data = channel[ch].rxdata & ((1 << nbits) - 1); if (nbits == 5) return baudot_dec(ch & 0x7F, data); return data; } bool view_rtty::is_mark_space( int ch, int &correction) { correction = 0; // test for rough bit position if (channel[ch].bit_buf[0] && !channel[ch].bit_buf[symbollen-1]) { // test for mark/space straddle point for (int i = 0; i < symbollen; i++) correction += channel[ch].bit_buf[i]; if (abs(symbollen/2 - correction) < 6) // too small & bad signals are not decoded return true; } return false; } bool view_rtty::is_mark(int ch) { return channel[ch].bit_buf[symbollen / 2]; } bool view_rtty::rx(int ch, bool bit) { bool flag = false; unsigned char c = 0; int correction = 0; for (int i = 1; i < symbollen; i++) channel[ch].bit_buf[i-1] = channel[ch].bit_buf[i]; channel[ch].bit_buf[symbollen - 1] = bit; switch (channel[ch].rxstate) { case RTTY_RX_STATE_IDLE: if ( is_mark_space(ch, correction)) { channel[ch].rxstate = RTTY_RX_STATE_START; channel[ch].counter = correction; } break; case RTTY_RX_STATE_START: if (--channel[ch].counter == 0) { if (!is_mark(ch)) { channel[ch].rxstate = RTTY_RX_STATE_DATA; channel[ch].counter = symbollen; channel[ch].bitcntr = 0; channel[ch].rxdata = 0; } else { channel[ch].rxstate = RTTY_RX_STATE_IDLE; } } break; case RTTY_RX_STATE_DATA: if (--channel[ch].counter == 0) { channel[ch].rxdata |= is_mark(ch) << channel[ch].bitcntr++; channel[ch].counter = symbollen; } if (channel[ch].bitcntr == nbits + (rtty_parity != RTTY_PARITY_NONE ? 1 : 0)) channel[ch].rxstate = RTTY_RX_STATE_STOP; break; case RTTY_RX_STATE_STOP: if (--channel[ch].counter == 0) { if (is_mark(ch)) { if (channel[ch].metric > rtty_squelch) { c = decode_char(ch); // print this RTTY_CHANNEL if ( c != 0 ) REQ(&viewaddchr, ch, (int)channel[ch].frequency, c, mode); } flag = true; } channel[ch].rxstate = RTTY_RX_STATE_IDLE; } break; default : break; } return flag; } void view_rtty::Metric(int ch) { double delta = rtty_baud/2.0; double np = wf->powerDensity(channel[ch].frequency, delta) * 3000 / delta; double sp = wf->powerDensity(channel[ch].frequency - shift/2, delta) + wf->powerDensity(channel[ch].frequency + shift/2, delta) + 1e-10; channel[ch].sigpwr = decayavg( channel[ch].sigpwr, sp, sp - channel[ch].sigpwr > 0 ? 2 : 16); channel[ch].noisepwr = decayavg( channel[ch].noisepwr, np, 16 ); channel[ch].metric = CLAMP(channel[ch].sigpwr/channel[ch].noisepwr, 0.0, 100.0); if (channel[ch].state == RCVNG) if (channel[ch].metric < rtty_squelch) { channel[ch].timeout = progdefaults.VIEWERtimeout * samplerate / WFBLOCKSIZE; channel[ch].state = WAITING; } if (channel[ch].timeout) { channel[ch].timeout--; if (!channel[ch].timeout) { channel[ch].frequency = NULLFREQ; channel[ch].metric = 0; channel[ch].freqerr = 0; channel[ch].state = IDLE; REQ(&viewclearchannel, ch); } } } void view_rtty::find_signals() { double spwrhi = 0.0, spwrlo = 0.0, npwr = 0.0; double rtty_squelch = pow(10, progStatus.VIEWER_rttysquelch / 10.0); for (int i = 0; i < progdefaults.VIEWERchannels; i++) { if (channel[i].state != IDLE) continue; int cf = progdefaults.LowFreqCutoff + 100 * i; if (cf < shift) cf = shift; double delta = rtty_baud / 8; for (int chf = cf; chf < cf + 100 - rtty_baud / 4; chf += 5) { spwrlo = wf->powerDensity(chf - shift/2, delta); spwrhi = wf->powerDensity(chf + shift/2, delta); npwr = (wf->powerDensity(chf, delta) * 3000 / rtty_baud) + 1e-10; if ((spwrlo / npwr > rtty_squelch) && (spwrhi / npwr > rtty_squelch)) { if (!i && (channel[i+1].state == SRCHG || channel[i+1].state == RCVNG)) break; if ((i == (progdefaults.VIEWERchannels -2)) && (channel[i+1].state == SRCHG || channel[i+1].state == RCVNG)) break; if (i && (channel[i-1].state == SRCHG || channel[i-1].state == RCVNG)) break; if (i > 3 && (channel[i-2].state == SRCHG || channel[i-2].state == RCVNG)) break; channel[i].frequency = chf; channel[i].sigsearch = SIGSEARCH; channel[i].state = SRCHG; REQ(&viewaddchr, i, (int)channel[i].frequency, 0, mode); break; } } } for (int i = 1; i < progdefaults.VIEWERchannels; i++ ) if (fabs(channel[i].frequency - channel[i-1].frequency) < rtty_baud/2) clearch(i); } void view_rtty::clearch(int ch) { channel[ch].state = IDLE; channel[ch].rxstate = RTTY_RX_STATE_IDLE; channel[ch].rxmode = LETTERS; channel[ch].phaseacc = 0; channel[ch].frequency = NULLFREQ; channel[ch].poserr = channel[ch].negerr = 0.0; REQ( &viewclearchannel, ch); } void view_rtty::clear() { for (int ch = 0; ch < progdefaults.VIEWERchannels; ch++) { channel[ch].state = IDLE; channel[ch].rxstate = RTTY_RX_STATE_IDLE; channel[ch].rxmode = LETTERS; channel[ch].phaseacc = 0; channel[ch].frequency = NULLFREQ; channel[ch].poserr = channel[ch].negerr = 0.0; } } int view_rtty::rx_process(const double *buf, int buflen) { cmplx z, zmark, zspace, *zp_mark, *zp_space; static bool bit = true; int n = 0; rtty_squelch = pow(10, progStatus.VIEWER_rttysquelch / 10.0); for (int ch = 0; ch < progdefaults.VIEWERchannels; ch++) { if (channel[ch].state == IDLE) continue; if (channel[ch].sigsearch) { channel[ch].sigsearch--; if (!channel[ch].sigsearch) channel[ch].state = RCVNG; } for (int len = 0; len < buflen; len++) { z = cmplx(buf[len], buf[len]); zmark = mixer(channel[ch].mark_phase, channel[ch].frequency + shift/2.0, z); channel[ch].mark_filt->run(zmark, &zp_mark); zspace = mixer(channel[ch].space_phase, channel[ch].frequency - shift/2.0, z); n = channel[ch].space_filt->run(zspace, &zp_space); // n loop if (n) Metric(ch); for (int i = 0; i < n; i++) { channel[ch].mark_mag = abs(zp_mark[i]); channel[ch].mark_env = decayavg (channel[ch].mark_env, channel[ch].mark_mag, (channel[ch].mark_mag > channel[ch].mark_env) ? symbollen / 4 : symbollen * 16); channel[ch].mark_noise = decayavg (channel[ch].mark_noise, channel[ch].mark_mag, (channel[ch].mark_mag < channel[ch].mark_noise) ? symbollen / 4 : symbollen * 48); channel[ch].space_mag = abs(zp_space[i]); channel[ch].space_env = decayavg (channel[ch].space_env, channel[ch].space_mag, (channel[ch].space_mag > channel[ch].space_env) ? symbollen / 4 : symbollen * 16); channel[ch].space_noise = decayavg (channel[ch].space_noise, channel[ch].space_mag, (channel[ch].space_mag < channel[ch].space_noise) ? symbollen / 4 : symbollen * 48); channel[ch].noise_floor = min(channel[ch].space_noise, channel[ch].mark_noise); // clipped if clipped decoder selected double mclipped = 0, sclipped = 0; mclipped = channel[ch].mark_mag > channel[ch].mark_env ? channel[ch].mark_env : channel[ch].mark_mag; sclipped = channel[ch].space_mag > channel[ch].space_env ? channel[ch].space_env : channel[ch].space_mag; if (mclipped < channel[ch].noise_floor) mclipped = channel[ch].noise_floor; if (sclipped < channel[ch].noise_floor) sclipped = channel[ch].noise_floor; // Optimal ATC // int v = (((mclipped - channel[ch].noise_floor) * (channel[ch].mark_env - channel[ch].noise_floor) - // (sclipped - channel[ch].noise_floor) * (channel[ch].space_env - channel[ch].noise_floor)) - // 0.25 * ((channel[ch].mark_env - channel[ch].noise_floor) * // (channel[ch].mark_env - channel[ch].noise_floor) - // (channel[ch].space_env - channel[ch].noise_floor) * // (channel[ch].space_env - channel[ch].noise_floor))); // bit = (v > 0); // Kahn Square Law demodulator bit = norm(zp_mark[i]) >= norm(zp_space[i]); channel[ch].mark_history[channel[ch].inp_ptr] = zp_mark[i]; channel[ch].space_history[channel[ch].inp_ptr] = zp_space[i]; channel[ch].inp_ptr = (channel[ch].inp_ptr + 1) % MAXPIPE; if (channel[ch].state == RCVNG && rx( ch, reverse ? !bit : bit ) ) { if (channel[ch].sigsearch) channel[ch].sigsearch--; int mp0 = channel[ch].inp_ptr - 2; int mp1 = mp0 + 1; if (mp0 < 0) mp0 += MAXPIPE; if (mp1 < 0) mp1 += MAXPIPE; double ferr = (TWOPI * samplerate / rtty_baud) * (!reverse ? arg(conj(channel[ch].mark_history[mp1]) * channel[ch].mark_history[mp0]) : arg(conj(channel[ch].space_history[mp1]) * channel[ch].space_history[mp0])); if (fabs(ferr) > rtty_baud / 2) ferr = 0; channel[ch].freqerr = decayavg ( channel[ch].freqerr, ferr / 4, progdefaults.rtty_afcspeed == 0 ? 8 : progdefaults.rtty_afcspeed == 1 ? 4 : 1 ); if (channel[ch].metric > pow(10, progStatus.VIEWER_rttysquelch / 10.0)) channel[ch].frequency -= ferr; } } } } find_signals(); return 0; } char view_rtty::baudot_dec(int ch, unsigned char data) { int out = 0; switch (data) { case 0x1F: /* letters */ channel[ch].rxmode = LETTERS; break; case 0x1B: /* figures */ channel[ch].rxmode = FIGURES; break; case 0x04: /* unshift-on-space */ if (progdefaults.UOSrx) channel[ch].rxmode = LETTERS; return ' '; break; default: if (channel[ch].rxmode == LETTERS) out = letters[data]; else out = figures[data]; break; } return out; } //===================================================================== // RTTY transmit //===================================================================== int view_rtty::tx_process() { return 0; } fldigi-3.21.80/src/cw_rtty/morse.cxx0000664000175000017500000001660712313064025014207 00000000000000/* * morse.c -- morse code tables * * Copyright (C) 2004 * Lawrence Glaister (ve7it@shaw.ca) * This modem borrowed heavily from other gmfsk modems and * also from the unix-cw project. I would like to thank those * authors for enriching my coding experience by providing * and supporting open source. * * This file is part of fldigi. Copied from the gMFSK source code * distribution. * * Fldigi 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. * * Fldigi 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 fldigi. If not, see . * */ #include #include #include "morse.h" #include "configuration.h" /* ---------------------------------------------------------------------- */ /* * Morse code characters table. This table allows lookup of the Morse * shape of a given alphanumeric character. Shapes are held as a string, * with '-' representing dash, and '.' representing dot. The table ends * with a NULL entry. * * This is the main table from which the other tables are computed. * * The Prosigns are also defined in the configuration.h file * The user can specify the character which substitutes for the prosign */ static CW_TABLE cw_table[] = { /* Prosigns */ {'=', "", "-...-" }, // 0 {'~', "", ".-.-" }, // 1 {'<', "", ".-..." }, // 2 {'>', "", ".-.-." }, // 3 {'%', "", "...-.-" }, // 4 {'+', "", "-.--." }, // 5 {'&', "", "..-.-" }, // 6 {'{', "", "....--" }, // 7 {'}', "", "...-." }, // 8 /* ASCII 7bit letters */ {'A', "A", ".-" }, {'B', "B", "-..." }, {'C', "C", "-.-." }, {'D', "D", "-.." }, {'E', "E", "." }, {'F', "F", "..-." }, {'G', "G", "--." }, {'H', "H", "...." }, {'I', "I", ".." }, {'J', "J", ".---" }, {'K', "K", "-.-" }, {'L', "L", ".-.." }, {'M', "M", "--" }, {'N', "N", "-." }, {'O', "O", "---" }, {'P', "P", ".--." }, {'Q', "Q", "--.-" }, {'R', "R", ".-." }, {'S', "S", "..." }, {'T', "T", "-" }, {'U', "U", "..-" }, {'V', "V", "...-" }, {'W', "W", ".--" }, {'X', "X", "-..-" }, {'Y', "Y", "-.--" }, {'Z', "Z", "--.." }, /* Numerals */ {'0', "0", "-----" }, {'1', "1", ".----" }, {'2', "2", "..---" }, {'3', "3", "...--" }, {'4', "4", "....-" }, {'5', "5", "....." }, {'6', "6", "-...." }, {'7', "7", "--..." }, {'8', "8", "---.." }, {'9', "9", "----." }, /* Punctuation */ {'\\', "\\", ".-..-." }, {'\'', "'", ".----." }, {'$', "$", "...-..-" }, {'(', "(", "-.--." }, {')', ")", "-.--.-" }, {',', ",", "--..--" }, {'-', "-", "-....-" }, {'.', ".", ".-.-.-" }, {'/', "/", "-..-." }, {':', ":", "---..." }, {';', ";", "-.-.-." }, {'?', "?", "..--.." }, {'_', "_", "..--.-" }, {'@', "@", ".--.-." }, {'!', "!", "-.-.--" }, {0, NULL, NULL} }; // ISO 8859-1 accented characters // {"\334\374", "\334\374", "..--"}, // U diaeresis // {"\304\344", "\304\344", ".-.-"}, // A diaeresis // {"\307\347", "\307\347", "-.-.."}, // C cedilla // {"\326\366", "\325\366", "---."}, // O diaeresis // {"\311\351", "\311\351", "..-.."}, // E acute // {"\310\350", "\310\350",".-..-"}, // E grave // {"\305\345", "\305\345", ".--.-"}, // A ring // {"\321\361", "\321\361", "--.--"}, // N tilde // ISO 8859-2 accented characters // {"\252", "\252", "----" }, // S cedilla // {"\256", "\256", "--..-"}, // Z dot above /** * cw_tokenize_representation() * * Return a token value, in the range 2-255, for a lookup table representation. * The routine returns 0 if no valid token could be made from the string. To * avoid casting the value a lot in the caller (we want to use it as an array * index), we actually return an unsigned int. * * This token algorithm is designed ONLY for valid CW representations; that is, * strings composed of only '.' and '-', and in this case, strings shorter than * eight characters. The algorithm simply turns the representation into a * 'bitmask', based on occurrences of '.' and '-'. The first bit set in the * mask indicates the start of data (hence the 7-character limit). This mask * is viewable as an integer in the range 2 (".") to 255 ("-------"), and can * be used as an index into a fast lookup array. */ unsigned int cMorse::tokenize_representation(const char *representation) { unsigned int token; /* Return token value */ const char *sptr; /* Pointer through string */ /* * Our algorithm can handle only 6 characters of representation. * And we insist on there being at least one character, too. */ if (strlen(representation) > 6 || strlen(representation) < 1) return 0; /* * Build up the token value based on the dots and dashes. Start the * token at 1 - the sentinel (start) bit. */ for (sptr = representation, token = 1; *sptr != 0; sptr++) { /* * Left-shift the sentinel (start) bit. */ token <<= 1; /* * If the next element is a dash, OR in another bit. If it is * not a dash or a dot, then there is an error in the repres- * entation string. */ if (*sptr == CW_DASH_REPRESENTATION) token |= 1; else if (*sptr != CW_DOT_REPRESENTATION) return 0; } /* Return the value resulting from our tokenization of the string. */ return token; } /* ---------------------------------------------------------------------- */ void cMorse::init() { CW_TABLE *cw; /* Pointer to table entry */ unsigned int i; long code; int len; // Update the char / prosign relationship if (progdefaults.CW_prosigns.length() == 9) { for (int i = 0; i < 9; i++) { cw_table[i].chr = progdefaults.CW_prosigns[i]; } } // Clear the RX & TX tables for (i = 0; i < MorseTableSize; i++) { cw_tx_lookup[i].code = 0x04; cw_tx_lookup[i].prt = 0; cw_rx_lookup[i] = 0; } // For each main table entry, create a token entry. for (cw = cw_table; cw->chr != 0; cw++) { if ((cw->chr == '(') && !progdefaults.CW_use_paren) continue; if ((cw->chr == '<') && progdefaults.CW_use_paren) continue; i = tokenize_representation(cw->rpr); if (i != 0) cw_rx_lookup[i] = cw; } // Build TX table for (cw = cw_table; cw->chr != 0; cw++) { if ((cw->chr == '(') && !progdefaults.CW_use_paren) continue; if ((cw->chr == '<') && progdefaults.CW_use_paren) continue; len = strlen(cw->rpr); code = 0x04; while (len-- > 0) { if (cw->rpr[len] == CW_DASH_REPRESENTATION) { code = (code << 1) | 1; code = (code << 1) | 1; code = (code << 1) | 1; } else code = (code << 1) | 1; code <<= 1; } cw_tx_lookup[(int)cw->chr].code = code; cw_tx_lookup[(int)cw->chr].prt = cw->prt; } } const char *cMorse::rx_lookup(char *r) { int token; CW_TABLE *cw; if ((token = tokenize_representation(r)) == 0) return NULL; if ((cw = cw_rx_lookup[token]) == NULL) return NULL; return cw->prt; } const char *cMorse::tx_print(int c) { if (cw_tx_lookup[toupper(c)].prt) return cw_tx_lookup[toupper(c)].prt; else return ""; } unsigned long cMorse::tx_lookup(int c) { return cw_tx_lookup[toupper(c)].code; } /* ---------------------------------------------------------------------- */ fldigi-3.21.80/src/cw_rtty/cw.cxx0000664000175000017500000010565312313064025013473 00000000000000// ---------------------------------------------------------------------------- // cw.cxx -- morse code modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // (C) Mauri Niininen, AG1LE // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "digiscope.h" #include "waterfall.h" #include "fl_digi.h" #include "fftfilt.h" #include "cw.h" #include "misc.h" #include "configuration.h" #include "confdialog.h" #include "status.h" #include "debug.h" #include "FTextRXTX.h" #include "modem.h" #include "qrunner.h" using namespace std; const cw::SOM_TABLE cw::som_table[] = { /* Prosigns */ {'=', "", {1.0, 0.33, 0.33, 0.33, 1.0, 0, 0} }, // 0 {'~', "", { 0.33, 1.0, 0.33, 1.0, 0, 0, 0} }, // 1 {'%', "", { 0.33, 1.0, 0.33, 0.33, 0.33, 0, 0} }, // 2 {'+', "", { 0.33, 1.0, 0.33, 1.0, 0.33, 0, 0} }, // 3 {'>', "", { 0.33, 0.33, 0.33, 1.0, 0.33, 1.0, 0} }, // 4 {'<', "", {1.0, 0.33, 1.0, 1.0, 0.33, 0, 0} }, // 5 {'&', "", { 0.33, 0.33, 1.0, 0.33, 1.0, 0, 0} }, // 6 {'}', "", { 0.33, 0.33, 0.33, 0.33, 1.0, 1.0, 0} }, // 7 {'{', "", { 0.33, 0.33, 0.33, 1.0, 0.33, 0, 0} }, // 8 /* ASCII 7bit letters */ {'A', "A", { 0.33, 1.0, 0, 0, 0, 0, 0} }, {'B', "B", {1.0, 0.33, 0.33, 0.33, 0, 0, 0} }, {'C', "C", {1.0, 0.33, 1.0, 0.33, 0, 0, 0} }, {'D', "D", {1.0, 0.33, 0.33, 0, 0, 0, 0} }, {'E', "E", { 0.33, 0, 0, 0, 0, 0, 0} }, {'F', "F", { 0.33, 0.33, 1.0, 0.33, 0, 0, 0} }, {'G', "G", {1.0, 1.0, 0.33, 0, 0, 0, 0} }, {'H', "H", { 0.33, 0.33, 0.33, 0.33, 0, 0, 0} }, {'I', "I", { 0.33, 0.33, 0, 0, 0, 0, 0} }, {'J', "J", { 0.33, 1.0, 1.0, 1.0, 0, 0, 0} }, {'K', "K", {1.0, 0.33, 1.0, 0, 0, 0, 0} }, {'L', "L", { 0.33, 1.0, 0.33, 0.33, 0, 0, 0} }, {'M', "M", {1.0, 1.0, 0, 0, 0, 0, 0} }, {'N', "N", {1.0, 0.33, 0, 0, 0, 0, 0} }, {'O', "O", {1.0, 1.0, 1.0, 0, 0, 0, 0} }, {'P', "P", { 0.33, 1.0, 1.0, 0.33, 0, 0, 0} }, {'Q', "Q", {1.0, 1.0, 0.33, 1.0, 0, 0, 0} }, {'R', "R", { 0.33, 1.0, 0.33, 0, 0, 0, 0} }, {'S', "S", { 0.33, 0.33, 0.33, 0, 0, 0, 0} }, {'T', "T", {1.0, 0, 0, 0, 0, 0, 0} }, {'U', "U", { 0.33, 0.33, 1.0, 0, 0, 0, 0} }, {'V', "V", { 0.33, 0.33, 0.33, 1.0, 0, 0, 0} }, {'W', "W", { 0.33, 1.0, 1.0, 0, 0, 0, 0} }, {'X', "X", {1.0, 0.33, 0.33, 1.0, 0, 0, 0} }, {'Y', "Y", {1.0, 0.33, 1.0, 1.0, 0, 0, 0} }, {'Z', "Z", {1.0, 1.0, 0.33, 0.33, 0, 0, 0} }, /* Numerals */ {'0', "0", {1.0, 1.0, 1.0, 1.0, 1.0, 0, 0} }, {'1', "1", { 0.33, 1.0, 1.0, 1.0, 1.0, 0, 0} }, {'2', "2", { 0.33, 0.33, 1.0, 1.0, 1.0, 0, 0} }, {'3', "3", { 0.33, 0.33, 0.33, 1.0, 1.0, 0, 0} }, {'4', "4", { 0.33, 0.33, 0.33, 0.33, 1.0, 0, 0} }, {'5', "5", { 0.33, 0.33, 0.33, 0.33, 0.33, 0, 0} }, {'6', "6", {1.0, 0.33, 0.33, 0.33, 0.33, 0, 0} }, {'7', "7", {1.0, 1.0, 0.33, 0.33, 0.33, 0, 0} }, {'8', "8", {1.0, 1.0, 1.0, 0.33, 0.33, 0, 0} }, {'9', "9", {1.0, 1.0, 1.0, 1.0, 0.33, 0, 0} }, /* Punctuation */ {'\\', "\\", { 0.33, 1.0, 0.33, 0.33, 1.0, 0.33, 0} }, {'\'', "'", { 0.33, 1.0, 1.0, 1.0, 1.0, 0.33, 0} }, {'$', "$", { 0.33, 0.33, 0.33, 1.0, 0.33, 0.33,1.0} }, {'(', "(", {1.0, 0.33, 1.0, 1.0, 0.33, 0, 0} }, {')', ")", {1.0, 0.33, 1.0, 1.0, 0.33, 1.0, 0} }, {',', ",", {1.0, 1.0, 0.33, 0.33, 1.0, 1.0, 0} }, {'-', "-", {1.0, 0.33, 0.33, 0.33, 0.33, 1.0, 0} }, {'.', ".", { 0.33, 1.0, 0.33, 1.0, 0.33, 1.0, 0} }, {'/', "/", {1.0, 0.33, 0.33, 1.0, 0.33, 0, 0} }, {':', ":", {1.0, 1.0, 1.0, 0.33, 0.33, 0.33, 0} }, {';', ";", {1.0, 0.33, 1.0, 0.33, 1.0, 0.33, 0} }, {'?', "?", { 0.33, 0.33, 1.0, 1.0, 0.33, 0.33, 0} }, {'_', "_", { 0.33, 0.33, 1.0, 1.0, 0.33, 1.0, 0} }, {'@', "@", { 0.33, 1.0, 1.0, 0.33, 1.0, 0.33, 0} }, {'!', "!", {1.0, 0.33, 1.0, 0.33, 1.0, 1.0, 0} }, {0, NULL, {0.0}} }; int cw::normalize(float *v, int n, int twodots) { if( n == 0 ) return 0 ; float max = v[0]; float min = v[0]; int j; /* find max and min values */ for (j=1; j max) max = vj; else if (vj < min) min = vj; } /* all values 0 - no need to normalize or decode */ if (max == 0.0) return 0; /* scale values between [0,1] -- if Max longer than 2 dots it was "dah" and should be 1.0, otherwise it was "dit" and should be 0.33 */ float ratio = (max > twodots) ? 1.0 : 0.33 ; ratio /= max ; for (j=0; jchr != 0; som++) { /* Compute the distance between codebook and input entry */ float difference = 0.0; for (int i = 0; i < WGT_SIZE; i++) { float diff = (inbuf[i] - som->wgt[i]); difference += diff * diff; if (difference > diffsf) break; } /* If distance is smaller than previous distances */ if (difference < diffsf) { winner = som; diffsf = difference; } } if (winner != NULL) return winner->prt; else return NULL; } void cw::tx_init(SoundBase *sc) { scard = sc; phaseacc = 0; lastsym = 0; qskphase = 0; symbols = 0; acc_symbols = 0; ovhd_symbols = 0; } void cw::rx_init() { cw_receive_state = RS_IDLE; smpl_ctr = 0; cw_rr_current = 0; cw_ptr = 0; agc_peak = 0; set_scope_mode(Digiscope::SCOPE); update_Status(); usedefaultWPM = false; scope_clear = true; } void cw::init() { bool wfrev = wf->Reverse(); bool wfsb = wf->USB(); reverse = wfrev ^ !wfsb; if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.CWsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); trackingfilter->reset(); cw_adaptive_receive_threshold = (long int)trackingfilter->run(2 * cw_send_dot_length); put_cwRcvWPM(cw_send_speed); for (int i = 0; i < OUTBUFSIZE; i++) outbuf[i] = qskbuf[i] = 0.0; rx_init(); use_paren = progdefaults.CW_use_paren; prosigns = progdefaults.CW_prosigns; stopflag = false; } cw::~cw() { if (hilbert) delete hilbert; if (cw_FIR_filter) delete cw_FIR_filter; if (cw_FFT_filter) delete cw_FFT_filter; if (bitfilter) delete bitfilter; if (trackingfilter) delete trackingfilter; } cw::cw() : modem() { cap |= CAP_BW; mode = MODE_CW; freqlock = false; usedefaultWPM = false; frequency = progdefaults.CWsweetspot; tx_frequency = get_txfreq_woffset(); risetime = progdefaults.CWrisetime; QSKshape = progdefaults.QSKshape; cw_ptr = 0; clrcount = CLRCOUNT; samplerate = CWSampleRate; fragmentsize = CWMaxSymLen; cw_speed = progdefaults.CWspeed; bandwidth = progdefaults.CWbandwidth; cw_send_speed = cw_speed; cw_receive_speed = cw_speed; cw_adaptive_receive_threshold = 2 * DOT_MAGIC / cw_speed; cw_noise_spike_threshold = cw_adaptive_receive_threshold / 4; cw_send_dot_length = DOT_MAGIC / cw_send_speed; cw_send_dash_length = 3 * cw_send_dot_length; symbollen = (int)round(samplerate * 1.2 / progdefaults.CWspeed); fsymlen = (int)round(samplerate * 1.2 / progdefaults.CWfarnsworth); memset(rx_rep_buf, 0, sizeof(rx_rep_buf)); // block of variables that get updated each time speed changes pipesize = (22 * samplerate * 12) / (progdefaults.CWspeed * 160); if (pipesize < 0) pipesize = 512; if (pipesize > MAX_PIPE_SIZE) pipesize = MAX_PIPE_SIZE; cwTrack = true; phaseacc = 0.0; FFTphase = 0.0; FIRphase = 0.0; FFTvalue = 0.0; FIRvalue = 0.0; pipeptr = 0; clrcount = 0; upper_threshold = progdefaults.CWupper; lower_threshold = progdefaults.CWlower; for (int i = 0; i < MAX_PIPE_SIZE; clearpipe[i++] = 0.0); agc_peak = 1.0; in_replay = 0; use_fft_filter = progdefaults.CWuse_fft_filter; use_matched_filter = progdefaults.CWmfilt; bandwidth = progdefaults.CWbandwidth; if (use_matched_filter) progdefaults.CWbandwidth = bandwidth = 2.0 * progdefaults.CWspeed / 1.2; hilbert = new C_FIR_filter(); // hilbert transform used by FFT filter hilbert->init_hilbert(37, 1); cw_FIR_filter = new C_FIR_filter(); cw_FIR_filter->init_lowpass (CW_FIRLEN, DEC_RATIO, progdefaults.CWspeed/(1.2 * samplerate)); //overlap and add filter length should be a factor of 2 // low pass implementation FilterFFTLen = 4096; cw_FFT_filter = new fftfilt(progdefaults.CWspeed/(1.2 * samplerate), FilterFFTLen); // bit filter based on 10 msec rise time of CW waveform int bfv = (int)(samplerate * .010 / DEC_RATIO); bitfilter = new Cmovavg(bfv); trackingfilter = new Cmovavg(TRACKING_FILTER_SIZE); makeshape(); sync_parameters(); REQ(static_cast(&waterfall::Bandwidth), wf, (int)bandwidth); REQ(static_cast(&Fl_Value_Slider2::value), sldrCWbandwidth, (int)bandwidth); update_Status(); } // SHOULD ONLY BE CALLED FROM THE rx_processing loop void cw::reset_rx_filter() { if (use_fft_filter != progdefaults.CWuse_fft_filter || use_matched_filter != progdefaults.CWmfilt || cw_speed != progdefaults.CWspeed || (bandwidth != progdefaults.CWbandwidth && !use_matched_filter)) { use_fft_filter = progdefaults.CWuse_fft_filter; use_matched_filter = progdefaults.CWmfilt; cw_send_speed = cw_speed = progdefaults.CWspeed; if (use_matched_filter) progdefaults.CWbandwidth = bandwidth = 2.0 * progdefaults.CWspeed / 1.2; else bandwidth = progdefaults.CWbandwidth; if (use_fft_filter) { // FFT filter cw_FFT_filter->create_lpf(progdefaults.CWspeed/(1.2 * samplerate)); FFTphase = 0; } else { // FIR filter cw_FIR_filter->init_lowpass (CW_FIRLEN, DEC_RATIO, progdefaults.CWspeed/(1.2 * samplerate)); FIRphase = 0; } REQ(static_cast(&waterfall::Bandwidth), wf, (int)bandwidth); REQ(static_cast(&Fl_Value_Slider2::value), sldrCWbandwidth, (int)bandwidth); pipesize = (22 * samplerate * 12) / (progdefaults.CWspeed * 160); if (pipesize < 0) pipesize = 512; if (pipesize > MAX_PIPE_SIZE) pipesize = MAX_PIPE_SIZE; cw_adaptive_receive_threshold = 2 * DOT_MAGIC / cw_speed; cw_noise_spike_threshold = cw_adaptive_receive_threshold / 4; cw_send_dot_length = DOT_MAGIC / cw_send_speed; cw_send_dash_length = 3 * cw_send_dot_length; symbollen = (int)round(samplerate * 1.2 / progdefaults.CWspeed); fsymlen = (int)round(samplerate * 1.2 / progdefaults.CWfarnsworth); phaseacc = 0.0; FFTphase = 0.0; FIRphase = 0.0; FFTvalue = 0.0; FIRvalue = 0.0; pipeptr = 0; clrcount = 0; smpl_ctr = 0; memset(rx_rep_buf, 0, sizeof(rx_rep_buf)); agc_peak = 0; clear_syncscope(); } if (lower_threshold != progdefaults.CWlower || upper_threshold != progdefaults.CWupper) { lower_threshold = progdefaults.CWlower; upper_threshold = progdefaults.CWupper; clear_syncscope(); } } // sync_parameters() // Synchronize the dot, dash, end of element, end of character, and end // of word timings and ranges to new values of Morse speed, or receive tolerance. void cw::sync_parameters() { int lowerwpm, upperwpm, nusymbollen, nufsymlen; int wpm = usedefaultWPM ? progdefaults.defCWspeed : progdefaults.CWspeed; int fwpm = progdefaults.CWfarnsworth; cw_send_dot_length = DOT_MAGIC / progdefaults.CWspeed; cw_send_dash_length = 3 * cw_send_dot_length; nusymbollen = (int)round(samplerate * 1.2 / wpm); nufsymlen = (int)round(samplerate * 1.2 / fwpm); if (symbollen != nusymbollen || nufsymlen != fsymlen || risetime != progdefaults.CWrisetime || QSKshape != progdefaults.QSKshape ) { risetime = progdefaults.CWrisetime; QSKshape = progdefaults.QSKshape; symbollen = nusymbollen; fsymlen = nufsymlen; makeshape(); } // check if user changed the tracking or the cw default speed if ((cwTrack != progdefaults.CWtrack) || (cw_send_speed != progdefaults.CWspeed)) { trackingfilter->reset(); cw_adaptive_receive_threshold = 2 * cw_send_dot_length; put_cwRcvWPM(cw_send_speed); } cwTrack = progdefaults.CWtrack; cw_send_speed = progdefaults.CWspeed; // Receive parameters: lowerwpm = cw_send_speed - progdefaults.CWrange; upperwpm = cw_send_speed + progdefaults.CWrange; if (lowerwpm < progdefaults.CWlowerlimit) lowerwpm = progdefaults.CWlowerlimit; if (upperwpm > progdefaults.CWupperlimit) upperwpm = progdefaults.CWupperlimit; cw_lower_limit = 2 * DOT_MAGIC / upperwpm; cw_upper_limit = 2 * DOT_MAGIC / lowerwpm; if (cwTrack) cw_receive_speed = DOT_MAGIC / (cw_adaptive_receive_threshold / 2); else { cw_receive_speed = cw_send_speed; cw_adaptive_receive_threshold = 2 * cw_send_dot_length; } if (cw_receive_speed > 0) cw_receive_dot_length = DOT_MAGIC / cw_receive_speed; else cw_receive_dot_length = DOT_MAGIC / 5; cw_receive_dash_length = 3 * cw_receive_dot_length; cw_noise_spike_threshold = cw_receive_dot_length / 2; } //======================================================================= // cw_update_tracking() // This gets called everytime we have a dot dash sequence or a dash dot // sequence. Since we have semi validated tone durations, we can try and // track the cw speed by adjusting the cw_adaptive_receive_threshold variable. // This is done with moving average filters for both dot & dash. //======================================================================= void cw::update_tracking(int idot, int idash) { int dot, dash; if (idot > cw_lower_limit && idot < cw_upper_limit) dot = idot; else dot = cw_send_dot_length; if (idash > cw_lower_limit && idash < cw_upper_limit) dash = idash; else dash = cw_send_dash_length; cw_adaptive_receive_threshold = (long int)trackingfilter->run((dash + dot) / 2); // if (!use_matched_filter) sync_parameters(); } //======================================================================= //update_syncscope() //Routine called to update the display on the sync scope display. //For CW this is an o scope pattern that shows the cw data stream. //======================================================================= void cw::update_Status() { put_MODEstatus("CW %s Rx %d", usedefaultWPM ? "*" : " ", cw_receive_speed); } //======================================================================= //update_syncscope() //Routine called to update the display on the sync scope display. //For CW this is an o scope pattern that shows the cw data stream. //======================================================================= // void cw::update_syncscope() { if (pipesize < 0 || pipesize > MAX_PIPE_SIZE) return; for (int i = 0; i < pipesize; i++) scopedata[i] = 0.96*pipe[i]+0.02; set_scope_xaxis_1(progdefaults.CWupper); set_scope_xaxis_2(progdefaults.CWlower); set_scope(scopedata, pipesize, true); scopedata.next(); // change buffers clrcount = CLRCOUNT; put_cwRcvWPM(cw_receive_speed); update_Status(); } void cw::clear_syncscope() { set_scope_xaxis_1(upper_threshold); set_scope_xaxis_2(lower_threshold); set_scope(clearpipe, pipesize, false); clrcount = CLRCOUNT; } cmplx cw::mixer(cmplx in) { cmplx z (cos(phaseacc), sin(phaseacc)); z = z * in; phaseacc += TWOPI * frequency / samplerate; if (phaseacc > M_PI) phaseacc -= TWOPI; else if (phaseacc < M_PI) phaseacc += TWOPI; return z; } //===================================================================== // cw_rxprocess() // Called with a block (size SCBLOCKSIZE samples) of audio. // //====================================================================== void cw::decode_stream(double value) { const char *c, *somc; char *cptr; // Compute a variable threshold value for tone detection // Fast attack and slow decay. if (value > agc_peak) agc_peak = decayavg(agc_peak, value, 20); else agc_peak = decayavg(agc_peak, value, 800); metric = clamp(agc_peak * 2e3 , 0.0, 100.0); // save correlation amplitude value for the sync scope // normalize if possible if (agc_peak) value /= agc_peak; else value = 0; pipe[pipeptr] = value; if (++pipeptr == pipesize) pipeptr = 0; if (!progStatus.sqlonoff || metric > progStatus.sldrSquelchValue ) { // Power detection using hysterisis detector // upward trend means tone starting if ((value > progdefaults.CWupper) && (cw_receive_state != RS_IN_TONE)) { handle_event(CW_KEYDOWN_EVENT, NULL); } // downward trend means tone stopping if ((value < progdefaults.CWlower) && (cw_receive_state == RS_IN_TONE)) { handle_event(CW_KEYUP_EVENT, NULL); } } if (handle_event(CW_QUERY_EVENT, &c) == CW_SUCCESS) { update_syncscope(); if (progdefaults.CWuseSOMdecoding) { somc = find_winner(cw_buffer, cw_adaptive_receive_threshold); cptr = (char*)somc; if (somc != NULL) { while (*cptr != '\0') put_rx_char(progdefaults.rx_lowercase ? tolower(*cptr++) : *cptr++,FTextBase::CTRL); } if (strlen(c) == 1 && *c == ' ') put_rx_char(progdefaults.rx_lowercase ? tolower(*c) : *c); cw_ptr = 0; memset(cw_buffer, 0, sizeof(cw_buffer)); } else { if (strlen(c) == 1) put_rx_char(progdefaults.rx_lowercase ? tolower(*c) : *c); else while (*c) put_rx_char(progdefaults.rx_lowercase ? tolower(*c++) : *c++, FTextBase::CTRL); } } } void cw::rx_FFTprocess(const double *buf, int len) { cmplx z, *zp; int n; while (len-- > 0) { z = cmplx ( *buf * cos(FFTphase), *buf * sin(FFTphase) ); FFTphase += TWOPI * frequency / samplerate; if (FFTphase > M_PI) FFTphase -= TWOPI; else if (FFTphase < M_PI) FFTphase += TWOPI; buf++; n = cw_FFT_filter->run(z, &zp); // n = 0 or filterlen/2 if (!n) continue; for (int i = 0; i < n; i++) { // update the basic sample counter used for morse timing ++smpl_ctr; if (smpl_ctr % DEC_RATIO) continue; // decimate by DEC_RATIO // demodulate FFTvalue = abs(zp[i]); FFTvalue = bitfilter->run(FFTvalue); decode_stream(FFTvalue); } // for (i =0; i < n ... } //while (len-- > 0) } void cw::rx_FIRprocess(const double *buf, int len) { cmplx z; while (len-- > 0) { z = cmplx ( *buf * cos(FIRphase), *buf * sin(FIRphase) ); buf++; FIRphase += TWOPI * frequency / samplerate; if (FIRphase > M_PI) FIRphase -= TWOPI; else if (FIRphase < M_PI) FIRphase += TWOPI; if (cw_FIR_filter->run ( z, z )) { // update the basic sample counter used for morse timing smpl_ctr += DEC_RATIO; // demodulate FIRvalue = abs(z); FIRvalue = bitfilter->run(FIRvalue); decode_stream(FIRvalue); } } } static bool cwprocessing = false; int cw::rx_process(const double *buf, int len) { if (cwprocessing) return 0; cwprocessing = true; reset_rx_filter(); if (use_fft_filter) rx_FFTprocess(buf, len); else rx_FIRprocess(buf, len); if (!clrcount--) clear_syncscope(); display_metric(metric); cwprocessing = false; return 0; } // ---------------------------------------------------------------------- // Compare two timestamps, and return the difference between them in usecs. int cw::usec_diff(unsigned int earlier, unsigned int later) { // Compare the timestamps. // At 4 WPM, the dash length is 3*(1200000/4)=900,000 usecs, and // the word gap is 2,100,000 usecs. if (earlier >= later) { return 0; } else return (int) (((double) (later - earlier) * USECS_PER_SEC) / samplerate); } //======================================================================= // handle_event() // high level cw decoder... gets called with keyup, keydown, reset and // query commands. // Keyup/down influences decoding logic. // Reset starts everything out fresh. // The query command returns CW_SUCCESS and the character that has // been decoded (may be '*',' ' or [a-z,0-9] or a few others) // If there is no data ready, CW_ERROR is returned. //======================================================================= int cw::handle_event(int cw_event, const char **c) { static int space_sent = true; // for word space logic static int last_element = 0; // length of last dot/dash int element_usec; // Time difference in usecs switch (cw_event) { case CW_RESET_EVENT: sync_parameters(); cw_receive_state = RS_IDLE; cw_rr_current = 0; // reset decoding pointer cw_ptr = 0; memset(cw_buffer, 0, sizeof(cw_buffer)); smpl_ctr = 0; // reset audio sample counter memset(rx_rep_buf, 0, sizeof(rx_rep_buf)); break; case CW_KEYDOWN_EVENT: // A receive tone start can only happen while we // are idle, or in the middle of a character. if (cw_receive_state == RS_IN_TONE) return CW_ERROR; // first tone in idle state reset audio sample counter if (cw_receive_state == RS_IDLE) { smpl_ctr = 0; memset(rx_rep_buf, 0, sizeof(rx_rep_buf)); cw_rr_current = 0; cw_ptr = 0; } // save the timestamp cw_rr_start_timestamp = smpl_ctr; // Set state to indicate we are inside a tone. old_cw_receive_state = cw_receive_state; cw_receive_state = RS_IN_TONE; return CW_ERROR; break; case CW_KEYUP_EVENT: // The receive state is expected to be inside a tone. if (cw_receive_state != RS_IN_TONE) return CW_ERROR; // Save the current timestamp cw_rr_end_timestamp = smpl_ctr; element_usec = usec_diff(cw_rr_start_timestamp, cw_rr_end_timestamp); // make sure our timing values are up to date sync_parameters(); // If the tone length is shorter than any noise cancelling // threshold that has been set, then ignore this tone. if (cw_noise_spike_threshold > 0 && element_usec < cw_noise_spike_threshold) { cw_receive_state = RS_IDLE; return CW_ERROR; } // Set up to track speed on dot-dash or dash-dot pairs for this test to work, we need a dot dash pair or a // dash dot pair to validate timing from and force the speed tracking in the right direction. This method // is fundamentally different than the method in the unix cw project. Great ideas come from staring at the // screen long enough!. Its kind of simple really ... when you have no idea how fast or slow the cw is... // the only way to get a threshold is by having both code elements and setting the threshold between them // knowing that one is supposed to be 3 times longer than the other. with straight key code... this gets // quite variable, but with most faster cw sent with electronic keyers, this is one relationship that is // quite reliable. Lawrence Glaister (ve7it@shaw.ca) if (last_element > 0) { // check for dot dash sequence (current should be 3 x last) if ((element_usec > 2 * last_element) && (element_usec < 4 * last_element)) { update_tracking(last_element, element_usec); } // check for dash dot sequence (last should be 3 x current) if ((last_element > 2 * element_usec) && (last_element < 4 * element_usec)) { update_tracking(element_usec, last_element); } } last_element = element_usec; // ok... do we have a dit or a dah? // a dot is anything shorter than 2 dot times if (element_usec <= cw_adaptive_receive_threshold) { rx_rep_buf[cw_rr_current++] = CW_DOT_REPRESENTATION; // printf("%d dit ", last_element/1000); // print dot length cw_buffer[cw_ptr++] = (float)last_element; } else { // a dash is anything longer than 2 dot times rx_rep_buf[cw_rr_current++] = CW_DASH_REPRESENTATION; cw_buffer[cw_ptr++] = (float)last_element; } // We just added a representation to the receive buffer. // If it's full, then reset everything as it probably noise if (cw_rr_current == RECEIVE_CAPACITY - 1) { cw_receive_state = RS_IDLE; cw_rr_current = 0; // reset decoding pointer cw_ptr = 0; smpl_ctr = 0; // reset audio sample counter return CW_ERROR; } else { // zero terminate representation rx_rep_buf[cw_rr_current] = 0; cw_buffer[cw_ptr] = 0.0; } // All is well. Move to the more normal after-tone state. cw_receive_state = RS_AFTER_TONE; return CW_ERROR; break; case CW_QUERY_EVENT: // this should be called quite often (faster than inter-character gap) It looks after timing // key up intervals and determining when a character, a word space, or an error char '*' should be returned. // CW_SUCCESS is returned when there is a printable character. Nothing to do if we are in a tone if (cw_receive_state == RS_IN_TONE) return CW_ERROR; // in this call we expect a pointer to a char to be valid if (c == NULL) { // else we had no place to put character... cw_receive_state = RS_IDLE; cw_rr_current = 0; cw_ptr = 0; // reset decoding pointer return CW_ERROR; } // compute length of silence so far sync_parameters(); element_usec = usec_diff(cw_rr_end_timestamp, smpl_ctr); // SHORT time since keyup... nothing to do yet if (element_usec < (2 * cw_receive_dot_length)) return CW_ERROR; // MEDIUM time since keyup... check for character space // one shot through this code via receive state logic // FARNSWOTH MOD HERE --> if (element_usec >= (2 * cw_receive_dot_length) && element_usec <= (4 * cw_receive_dot_length) && cw_receive_state == RS_AFTER_TONE) { // Look up the representation //cout << "CW_QUERY medium time after keyup: " << rx_rep_buf; *c = morse.rx_lookup(rx_rep_buf); //cout <<": " << *c < if ((element_usec > (4 * cw_receive_dot_length)) && !space_sent) { *c = " "; space_sent = true; return CW_SUCCESS; } // should never get here... catch all return CW_ERROR; break; } // should never get here... catch all return CW_ERROR; } //=========================================================================== // cw transmit routines // Define the amplitude envelop for key down events (32 samples long) // this is 1/2 cycle of a raised cosine //=========================================================================== double keyshape[KNUM]; void cw::makeshape() { for (int i = 0; i < KNUM; i++) keyshape[i] = 1.0; knum = (int)(8 * risetime); if (knum >= symbollen) knum = symbollen - 1; if (knum > KNUM) knum = KNUM; switch (QSKshape) { case 1: // blackman for (int i = 0; i < knum; i++) keyshape[i] = (0.42 - 0.50 * cos(M_PI * i/ knum) + 0.08 * cos(2 * M_PI * i / knum)); break; case 0: // raised cosine (hanning) default: for (int i = 0; i < knum; i++) keyshape[i] = 0.5 * (1.0 - cos (M_PI * i / knum)); } } inline double cw::nco(double freq) { phaseacc += 2.0 * M_PI * freq / samplerate; if (phaseacc > M_PI) phaseacc -= 2.0 * M_PI; return sin(phaseacc); } inline double cw::qsknco() { qskphase += 2.0 * M_PI * 1000 / samplerate; if (qskphase > M_PI) qskphase -= 2.0 * M_PI; return sin(qskphase); } //===================================================================== // send_symbol() // Sends a part of a morse character (one dot duration) of either // sound at the correct freq or silence. Rise and fall time is controlled // with a raised cosine shape. // // Left channel contains the shaped A2 CW waveform // Right channel contains a square wave burst of 1600 Hz that is used // to trigger a qsk switch. Right channel has pre and post timings for // proper switching of the qsk switch before and after the A2 element. // If the Pre + Post timing exceeds the interelement spacing then the // Pre and / or Post is only applied at the beginning and end of the // character. //======================================================================= int q_carryover = 0, carryover = 0; void cw::send_symbol(int bits, int len) { double freq; int sample, qsample, i; int delta = 0; int keydown; int keyup; int kpre; int kpost; int duration = 0; int symlen = 0; float dsymlen = 0.0; int currsym = bits & 1; acc_symbols += len; freq = get_txfreq_woffset(); delta = (int) (len * (progdefaults.CWweight - 50) / 100.0); symlen = len; if (currsym == 1) { dsymlen = len * (progdefaults.CWdash2dot - 3.0) / (progdefaults.CWdash2dot + 1.0); if (lastsym == 1 && currsym == 1) symlen += (int)(3 * dsymlen); else symlen -= (int)dsymlen; } if (delta < -(symlen - knum)) delta = -(symlen - knum); if (delta > (symlen - knum)) delta = symlen - knum; keydown = symlen + delta ; keyup = symlen - delta; kpre = (int)(progdefaults.CWpre * 8); if (kpre > symlen) kpre = symlen; if (progdefaults.QSK) { kpre = (int)(progdefaults.CWpre * 8); if (kpre > symlen) kpre = symlen; if (progdefaults.CWnarrow) { if (keydown - 2*knum < 0) kpost = knum + (int)(progdefaults.CWpost * 8); else kpost = keydown - knum + (int)(progdefaults.CWpost * 8); } else kpost = keydown + (int)(progdefaults.CWpost * 8); if (kpost < 0) kpost = 0; } else { kpre = 0; kpost = 0; } if (firstelement) { firstelement = false; return; } if (currsym == 1) { // keydown sample = 0; if (lastsym == 1) { for (i = 0; i < keydown; i++, sample++) { outbuf[sample] = nco(freq); qskbuf[sample] = qsknco(); } duration = keydown; } else { if (carryover) { for (int i = carryover; i < knum; i++, sample++) outbuf[sample] = nco(freq) * keyshape[knum - i]; while (sample < kpre) outbuf[sample++] = 0 * nco(freq); } else for (int i = 0; i < kpre; i++, sample++) outbuf[sample] = 0 * nco(freq); sample = 0; for (int i = 0; i < kpre; i++, sample++) { qskbuf[sample] = qsknco(); } for (int i = 0; i < knum; i++, sample++) { outbuf[sample] = nco(freq) * keyshape[i]; qskbuf[sample] = qsknco(); } duration = kpre + knum; } carryover = 0; } else { // keyup if (lastsym == 0) { duration = keyup; sample = 0; if (carryover) { for (int i = carryover; i < knum; i++, sample++) outbuf[sample] = nco(freq) * keyshape[knum - i]; while (sample < duration) outbuf[sample++] = 0 * nco(freq); } else while (sample < duration) outbuf[sample++] = 0 * nco(freq); carryover = 0; qsample = 0; if (q_carryover) { for (int i = 0; i < q_carryover; i++, qsample++) { qskbuf[qsample] = qsknco(); } while (qsample < duration) qskbuf[qsample++] = 0 * qsknco(); } else while (qsample < duration) qskbuf[qsample++] = 0 * qsknco(); if (q_carryover > duration) q_carryover = duration - q_carryover; else q_carryover = 0; } else { // last symbol = 1 duration = 2 * len - kpre - knum; carryover = 0; sample = 0; int next = keydown - knum; if (progdefaults.CWnarrow) next = keydown - 2*knum; for (int i = 0; i < next; i++, sample++) outbuf[sample] = nco(freq); for (int i = 0; i < knum; i++, sample++) { if (sample == duration) { carryover = i; break; } outbuf[sample] = nco(freq) * keyshape[knum - i]; } while (sample < duration) outbuf[sample++] = 0 * nco(freq); q_carryover = 0; qsample = 0; for (int i = 0; i < kpost; i++, qsample++) { if (qsample == duration) { q_carryover = kpost - duration; break; } qskbuf[qsample] = qsknco(); } while (qsample < duration) qskbuf[qsample++] = 0 * qsknco(); } } if (duration > 0) { if (progdefaults.QSK) ModulateStereo(outbuf, qskbuf, duration); else ModulateXmtr(outbuf, duration); } lastsym = currsym; firstelement = false; } //===================================================================== // send_ch() // sends a morse character and the space afterwards //======================================================================= void cw::send_ch(int ch) { int code; int chout = ch; int flen; sync_parameters(); // handle word space separately (7 dots spacing) // last char already had 3 elements of inter-character spacing if ((chout == ' ') || (chout == '\n')) { firstelement = false; flen = 4 * symbollen; while (flen - symbollen > 0) { send_symbol(0, symbollen); flen -= symbollen; } if (flen) send_symbol(0, flen); put_echo_char(progdefaults.rx_lowercase ? tolower(ch) : ch); return; } // convert character code to a morse representation if ((chout < 256) && (chout >= 0)) { code = morse.tx_lookup(chout); //cw_tx_lookup(ch); firstelement = true; } else { code = 0x04; // two extra dot spaces firstelement = false; } // loop sending out binary bits of cw character // at WPM or Farnsworth rate if (progdefaults.CWusefarnsworth && (progdefaults.CWspeed <= progdefaults.CWfarnsworth)) flen = fsymlen; else flen = symbollen; int charlen = 0; while (code > 1) { send_symbol(code, flen); charlen++; code = code >> 1; } // inter character space at WPM/FWPM rate flen = symbollen; if (progdefaults.CWusefarnsworth && (progdefaults.CWspeed <= progdefaults.CWfarnsworth)) flen += (symbollen - fsymlen)*charlen; while(flen - symbollen > 0) { send_symbol(0, symbollen); flen -= symbollen; } if (flen) send_symbol(0, flen); FL_AWAKE(); if (ch != -1) { string prtstr = morse.tx_print(ch); if (prtstr.length() == 1) put_echo_char(progdefaults.rx_lowercase ? tolower(prtstr[0]) : prtstr[0]); else for (size_t n = 0; n < prtstr.length(); n++) put_echo_char(progdefaults.rx_lowercase ? tolower(prtstr[n]) : prtstr[n], FTextBase::CTRL); } } //===================================================================== // cw_txprocess() // Read characters from screen and send them out the sound card. // This is called repeatedly from a thread during tx. //======================================================================= int cw::tx_process() { int c; if (use_paren != progdefaults.CW_use_paren || prosigns != progdefaults.CW_prosigns) { use_paren = progdefaults.CW_use_paren; prosigns = progdefaults.CW_prosigns; morse.init(); } c = get_tx_char(); if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; return -1; } acc_symbols = 0; send_ch(c); xmt_samples = char_samples = acc_symbols; printf("%5s %d samples, overhead %d, %f sec's\n", ascii3[c & 0xff], char_samples, ovhd_samples, 1.0 * char_samples / samplerate); return 0; } void cw::incWPM() { if (usedefaultWPM) return; if (progdefaults.CWspeed < progdefaults.CWupperlimit) { progdefaults.CWspeed++; sync_parameters(); set_CWwpm(); update_Status(); } } void cw::decWPM() { if (usedefaultWPM) return; if (progdefaults.CWspeed > progdefaults.CWlowerlimit) { progdefaults.CWspeed--; set_CWwpm(); sync_parameters(); update_Status(); } } void cw::toggleWPM() { usedefaultWPM = !usedefaultWPM; sync_parameters(); update_Status(); } fldigi-3.21.80/src/main.cxx0000664000175000017500000012321012313147652012310 00000000000000// ---------------------------------------------------------------------------- // Digital Modem Program for the Fast Light Toolkit // // Copyright 2006-2010, Dave Freese, W1HKJ // Copyright 2007-2010, Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // // Please report all bugs and problems to fldigi-devel@lists.berlios.de. // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #if !defined(__WOE32__) && !defined(__APPLE__) # include # include #endif #ifdef __MINGW32__ # include "compat.h" #endif #include #if HAVE_SYS_UTSNAME_H # include #endif #include #include #include #include #include #include #include #include #include #ifdef __MINGW32__ # define dirent fl_dirent_no_thanks #endif #include #ifdef __WOE32__ # if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR < 3 # undef dirent # include # endif #else # include #endif #include "gettext.h" #include "main.h" #include "waterfall.h" #include "trx.h" #include "soundconf.h" #include "fl_digi.h" #include "rigio.h" #include "globals.h" #include "confdialog.h" #include "configuration.h" #include "macros.h" #include "status.h" #include "fileselect.h" #include "timeops.h" #include "debug.h" #include "pskrep.h" #include "notify.h" #include "logbook.h" #include "dxcc.h" #include "newinstall.h" #include "Viewer.h" #include "kmlserver.h" #if USE_HAMLIB #include "rigclass.h" #endif #include "rigsupport.h" #include "log.h" #include "qrunner.h" #include "stacktrace.h" #include "xmlrpc.h" #if BENCHMARK_MODE #include "benchmark.h" #endif #include "icons.h" #include "nullmodem.h" using namespace std; string appname; string scDevice[2]; bool NBEMSapps_dir = false; string BaseDir = ""; string HomeDir = ""; string RigsDir = ""; string ScriptsDir = ""; string PalettesDir = ""; string LogsDir = ""; string PicsDir = ""; string HelpDir = ""; string MacrosDir = ""; string WrapDir = ""; string TalkDir = ""; string TempDir = ""; string KmlDir = ""; string PskMailDir = ""; string NBEMS_dir = ""; string DATA_dir = ""; string ARQ_dir = ""; string ARQ_files_dir = ""; string ARQ_recv_dir = ""; string ARQ_send = ""; string WRAP_dir = ""; string WRAP_recv_dir = ""; string WRAP_send_dir = ""; string WRAP_auto_dir = ""; string ICS_dir = ""; string ICS_msg_dir = ""; string ICS_tmp_dir = ""; string FLMSG_dir = ""; string FLMSG_dir_default = ""; string FLMSG_WRAP_dir = ""; string FLMSG_WRAP_recv_dir = ""; string FLMSG_WRAP_send_dir = ""; string FLMSG_WRAP_auto_dir = ""; string FLMSG_ICS_dir = ""; string FLMSG_ICS_msg_dir = ""; string FLMSG_ICS_tmp_dir = ""; string PskMailFile; string ArqFilename; string xmlfname; PTT *push2talk = (PTT *)0; #if USE_HAMLIB Rig *xcvr = (Rig *)0; #endif bool tlfio = false; cLogfile *logfile = 0; cLogfile *Maillogfile = (cLogfile *)0; FILE *server; FILE *client; bool mailserver = false, mailclient = false, arqmode = false; static bool show_cpucheck = false; static bool iconified = false; string option_help, version_text, build_text; qrunner *cbq[NUM_QRUNNER_THREADS]; void arqchecks(void); void generate_option_help(void); int parse_args(int argc, char **argv, int& idx); void generate_version_text(void); void debug_exec(char** argv); void set_platform_ui(void); double speed_test(int converter, unsigned repeat); static void setup_signal_handlers(void); static void checkdirectories(void); static void arg_error(const char* name, const char* arg, bool missing); static void fatal_error(string); // TODO: find out why fldigi crashes on OS X if the wizard window is // shown before fldigi_main. #ifndef __APPLE__ # define SHOW_WIZARD_BEFORE_MAIN_WINDOW 1 #else # define SHOW_WIZARD_BEFORE_MAIN_WINDOW 0 #endif void start_process(string executable) { if (!executable.empty()) { #ifndef __MINGW32__ switch (fork()) { case -1: LOG_PERROR("fork"); // fall through default: break; case 0: #endif #ifdef __MINGW32__ char* cmd = strdup(executable.c_str()); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free(cmd); #else execl("/bin/sh", "sh", "-c", executable.c_str(), (char *)NULL); perror("execl"); exit(EXIT_FAILURE); } #endif } } static void auto_start() { if (!progdefaults.auto_flrig_pathname.empty() && progdefaults.flrig_auto_enable) start_process(progdefaults.auto_flrig_pathname); if (!progdefaults.auto_flamp_pathname.empty() && progdefaults.flamp_auto_enable) start_process(progdefaults.auto_flamp_pathname); if (!progdefaults.auto_fllog_pathname.empty() && progdefaults.fllog_auto_enable) start_process(progdefaults.auto_fllog_pathname); if (!progdefaults.auto_flnet_pathname.empty() && progdefaults.flnet_auto_enable) start_process(progdefaults.auto_flnet_pathname); if (!progdefaults.auto_prog1_pathname.empty() && progdefaults.prog1_auto_enable) start_process(progdefaults.auto_prog1_pathname); if (!progdefaults.auto_prog2_pathname.empty() && progdefaults.prog2_auto_enable) start_process(progdefaults.auto_prog2_pathname); if (!progdefaults.auto_prog3_pathname.empty() && progdefaults.prog3_auto_enable) start_process(progdefaults.auto_prog3_pathname); } // these functions are all started after Fl::run() is executing void delayed_startup(void *) { connect_to_log_server(); arq_init(); #ifdef __WIN32__ if (progdefaults.auto_talk) open_talker(); #else grpTalker->hide(); #endif XML_RPC_Server::start(progdefaults.xmlrpc_address.c_str(), progdefaults.xmlrpc_port.c_str()); notify_start(); if (progdefaults.usepskrep) if (!pskrep_start()) LOG_ERROR("Could not start PSK reporter: %s", pskrep_error()); auto_start(); if (progdefaults.check_for_updates) cb_mnuCheckUpdate((Fl_Widget *)0, NULL); } int main(int argc, char ** argv) { // null_modem = new NULLMODEM; // active_modem = null_modem; active_modem = new NULLMODEM; appname = argv[0]; string appdir; string test_file_name; FILE *test_file = NULL; { char apptemp[FL_PATH_MAX]; fl_filename_expand(apptemp, sizeof(apptemp), appname.c_str()); appdir.assign(apptemp); #ifdef __WOE32__ size_t p = appdir.rfind("fldigi.exe"); appdir.erase(p); #else size_t p = appdir.rfind("fldigi"); if (appdir.find("./fldigi") != std::string::npos) { if (getcwd(apptemp, sizeof(apptemp))) appdir.assign(apptemp).append("/"); } else appdir.erase(p); #endif if (p != std::string::npos) { test_file_name.assign(appdir).append("NBEMS.DIR"); #ifdef __WOE32__ while ((p = test_file_name.find("\\")) != std::string::npos) test_file_name[p] = '/'; #endif test_file = fopen(test_file_name.c_str(),"r"); if (test_file != NULL) { fclose(test_file); BaseDir = appdir; NBEMSapps_dir = true; } } } debug_exec(argv); CREATE_THREAD_ID(); // only call this once SET_THREAD_ID(FLMAIN_TID); for (int i = 0; i < NUM_QRUNNER_THREADS; i++) { cbq[i] = new qrunner; cbq[i]->attach(); } set_unexpected(handle_unexpected); set_terminate(diediedie); setup_signal_handlers(); #ifndef ENABLE_NLS setlocale(LC_TIME, ""); #endif set_platform_ui(); generate_version_text(); { char dirbuf[FL_PATH_MAX + 1]; #ifdef __WOE32__ if (BaseDir.empty()) { fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$USERPROFILE/"); BaseDir = dirbuf; } #else if (BaseDir.empty()) { fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$HOME/"); BaseDir = dirbuf; } #endif } { #ifdef __WOE32__ if (HomeDir.empty()) HomeDir.assign(BaseDir).append("fldigi.files/"); if (PskMailDir.empty()) PskMailDir = BaseDir; // if (DATA_dir.empty()) DATA_dir.assign(BaseDir).append("DATA.files/"); if (NBEMS_dir.empty()) NBEMS_dir.assign(BaseDir).append("NBEMS.files/"); if (FLMSG_dir.empty()) FLMSG_dir_default = NBEMS_dir; #else if (HomeDir.empty()) HomeDir.assign(BaseDir).append(".fldigi/"); if (PskMailDir.empty()) PskMailDir = BaseDir; // if (DATA_dir.empty()) DATA_dir.assign(BaseDir).append("data/"); if (NBEMS_dir.empty()) NBEMS_dir.assign(BaseDir).append(".nbems/"); if (FLMSG_dir.empty()) FLMSG_dir_default = NBEMS_dir; #endif } generate_option_help(); int arg_idx; if (Fl::args(argc, argv, arg_idx, parse_args) != argc) arg_error(argv[0], NULL, false); if (main_window_title.empty()) main_window_title = PACKAGE_TARNAME; { char dirbuf[FL_PATH_MAX + 1]; if (FLMSG_dir_default[FLMSG_dir_default.length()-1] != '/') FLMSG_dir_default += '/'; fl_filename_expand(dirbuf, sizeof(dirbuf) - 1, FLMSG_dir_default.c_str()); FLMSG_dir = dirbuf; } checkdirectories(); check_nbems_dirs(); check_data_dir(); try { debug::start(string(HomeDir).append("status_log.txt").c_str()); time_t t = time(NULL); LOG(debug::QUIET_LEVEL, debug::LOG_OTHER, _("%s log started on %s"), PACKAGE_STRING, ctime(&t)); LOG_THREAD_ID(); } catch (const char* error) { cerr << error << '\n'; debug::stop(); } LOG_INFO("appname: %s", appname.c_str()); if (NBEMSapps_dir) LOG_INFO("%s present", test_file_name.c_str()); else LOG_INFO("%s not present", test_file_name.c_str()); LOG_INFO("HomeDir: %s", HomeDir.c_str()); LOG_INFO("RigsDir: %s", RigsDir.c_str()); LOG_INFO("ScriptsDir: %s", ScriptsDir.c_str()); LOG_INFO("PalettesDir: %s", PalettesDir.c_str()); LOG_INFO("LogsDir: %s", LogsDir.c_str()); LOG_INFO("PicsDir: %s", PicsDir.c_str()); LOG_INFO("HelpDir: %s", HelpDir.c_str()); LOG_INFO("MacrosDir: %s", MacrosDir.c_str()); LOG_INFO("WrapDir: %s", WrapDir.c_str()); LOG_INFO("TalkDir: %s", TalkDir.c_str()); LOG_INFO("TempDir: %s", TempDir.c_str()); LOG_INFO("KmlDir: %s", KmlDir.c_str()); LOG_INFO("PskMailDir: %s", PskMailDir.c_str()); LOG_INFO("DATA_dir: %s", DATA_dir.c_str()); LOG_INFO("NBEMS_dir: %s", NBEMS_dir.c_str()); LOG_INFO("ARQ_dir: %s", ARQ_dir.c_str()); LOG_INFO("ARQ_files_dir: %s", ARQ_files_dir.c_str()); LOG_INFO("ARQ_recv_dir: %s", ARQ_recv_dir.c_str()); LOG_INFO("ARQ_send: %s", ARQ_send.c_str()); LOG_INFO("WRAP_dir: %s", WRAP_dir.c_str()); LOG_INFO("WRAP_recv_dir: %s", WRAP_recv_dir.c_str()); LOG_INFO("WRAP_send_dir: %s", WRAP_send_dir.c_str()); LOG_INFO("WRAP_auto_dir: %s", WRAP_auto_dir.c_str()); LOG_INFO("ICS_dir: %s", ICS_dir.c_str()); LOG_INFO("ICS_msg_dir: %s", ICS_msg_dir.c_str()); LOG_INFO("ICS_tmp_dir: %s", ICS_tmp_dir.c_str()); LOG_INFO("FLMSG_dir: %s", FLMSG_dir.c_str()); LOG_INFO("FLMSG_dir_default: %s", FLMSG_dir_default.c_str()); LOG_INFO("FLMSG_WRAP_dir: %s", FLMSG_WRAP_dir.c_str()); LOG_INFO("FLMSG_WRAP_recv_dir: %s", FLMSG_WRAP_recv_dir.c_str()); LOG_INFO("FLMSG_WRAP_send_dir: %s", FLMSG_WRAP_send_dir.c_str()); LOG_INFO("FLMSG_WRAP_auto_dir: %s", FLMSG_WRAP_auto_dir.c_str()); LOG_INFO("FLMSG_ICS_dir: %s", FLMSG_ICS_dir.c_str()); LOG_INFO("FLMSG_ICS_msg_dir: %s", FLMSG_ICS_msg_dir.c_str()); LOG_INFO("FLMSG_ICS_tmp_dir: %s", FLMSG_ICS_tmp_dir.c_str()); bool have_config = progdefaults.readDefaultsXML(); xmlfname = HomeDir; xmlfname.append("rig.xml"); checkTLF(); Fl::lock(); // start the gui thread!! Fl::visual(FL_RGB); // insure 24 bit color operation fl_register_images(); Fl::set_fonts(0); Fl::scheme(progdefaults.ui_scheme.c_str()); progdefaults.initFonts(); if (progdefaults.cty_dat_pathname.empty()) progdefaults.cty_dat_pathname = HomeDir; dxcc_open(string(progdefaults.cty_dat_pathname).append("cty.dat").c_str()); qsl_open(string(progdefaults.cty_dat_pathname).append("lotw1.txt").c_str(), QSL_LOTW); if (!qsl_open(string(progdefaults.cty_dat_pathname).append("eqsl.txt").c_str(), QSL_EQSL)) qsl_open(string(progdefaults.cty_dat_pathname).append("AGMemberList.txt").c_str(), QSL_EQSL); progStatus.loadLastState(); create_fl_digi_main(argc, argv); if (!have_config || show_cpucheck) { double speed = speed_test(SRC_SINC_FASTEST, 8); if (speed > 150.0) { // fast progdefaults.slowcpu = false; progdefaults.sample_converter = SRC_SINC_BEST_QUALITY; } else if (speed > 60.0) { // ok progdefaults.slowcpu = false; progdefaults.sample_converter = SRC_SINC_MEDIUM_QUALITY; } else if (speed > 15.0) { // slow progdefaults.slowcpu = true; progdefaults.sample_converter = SRC_SINC_FASTEST; } else { // recycle me progdefaults.slowcpu = true; progdefaults.sample_converter = SRC_LINEAR; } LOG_INFO("CPU speed factor=%f: setting slowcpu=%s, sample_converter=\"%s\"", speed, progdefaults.slowcpu ? "true" : "false", src_get_name(progdefaults.sample_converter)); } if (progdefaults.XmlRigFilename.empty()) progdefaults.XmlRigFilename = xmlfname; #if BENCHMARK_MODE return setup_benchmark(); #endif FSEL::create(); #if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR < 3 listbox_charset_status->hide(); #else listbox_charset_status->show(); #endif populate_charset_listbox(); set_default_charset(); setTabColors(); progdefaults.testCommPorts(); macros.loadDefault(); #if USE_HAMLIB xcvr = new Rig(); #endif push2talk = new PTT(); progdefaults.setDefaults(); atexit(sound_close); sound_init(); progdefaults.initInterface(); trx_start(); #if SHOW_WIZARD_BEFORE_MAIN_WINDOW if (!have_config) { show_wizard(argc, argv); Fl_Window* w; while ((w = Fl::first_window()) && w->visible()) Fl::wait(); } #endif dlgViewer = createViewer(); create_logbook_dialogs(); LOGBOOK_colors_font(); if( progdefaults.kml_save_dir.empty() ) { progdefaults.kml_save_dir = KmlDir ; } kml_init(true); // OS X will prevent the main window from being resized if we change its // size *after* it has been shown. With some X11 window managers, OTOH, // the main window will not be restored at its exact saved position if // we move it *after* it has been shown. #ifndef __APPLE__ fl_digi_main->show(argc, argv); progStatus.initLastState(); #else progStatus.initLastState(); fl_digi_main->show(argc, argv); #endif if (iconified) for (Fl_Window* w = Fl::first_window(); w; w = Fl::next_window(w)) w->iconize(); update_main_title(); mode_browser = new Mode_Browser; #if !SHOW_WIZARD_BEFORE_MAIN_WINDOW if (!have_config) show_wizard(); #endif Fl::add_timeout(.05, delayed_startup); int ret = Fl::run(); return ret; } void exit_process() { KmlServer::Exit(); arq_close(); XML_RPC_Server::stop(); if (progdefaults.usepskrep) pskrep_stop(); for (int i = 0; i < NUM_QRUNNER_THREADS; i++) { cbq[i]->detach(); delete cbq[i]; } FSEL::destroy(); } void generate_option_help(void) { ostringstream help; string disp_base_dir = BaseDir; #ifdef __WOE32__ size_t p = 0; while ((p = disp_base_dir.find("/")) != string::npos) disp_base_dir[p] = '\\'; #endif help << "Usage:\n" << " " << PACKAGE_NAME << " [option...]\n\n"; help << PACKAGE_NAME << " options:\n\n" #if !defined(__WOE32__) << " --home-dir DIRECTORY\n" << " Set the home directory to full pathname of DIRECTORY\n" << " fldigi will put the file stores\n" << " .fldigi.files, and .nbems.files\n" << " in this directory\n" << " The default is: " << disp_base_dir << "\n\n" << " --config-dir DIRECTORY\n" << " Look for configuration files in DIRECTORY\n" << " The default is: " << disp_base_dir << ".fldigi/\n\n" #else << " --home-dir FOLDER\n" << " Set the home folder to full pathname of FOLDER\n" << " fldigi will put the file stores\n" << " fldigi.files, and nbems.files\n" << " in this folder\n" << " The default is: " << disp_base_dir << "\n\n" << " --config-dir FOLDER\n" << " Look for configuration files in FOLDER\n" << " The default is: " << disp_base_dir << "fldigi.files\\\n\n" #endif #if !defined(__WOE32__) && !defined(__APPLE__) << " --rx-ipc-key KEY\n" << " Set the receive message queue key\n" << " May be given in hex if prefixed with \"0x\"\n" << " The default is: " << progdefaults.rx_msgid << " or 0x" << hex << progdefaults.rx_msgid << dec << "\n\n" << " --tx-ipc-key KEY\n" << " Set the transmit message queue key\n" << " May be given in hex if prefixed with \"0x\"\n" << " The default is: " << progdefaults.tx_msgid << " or 0x" << hex << progdefaults.tx_msgid << dec << "\n\n" #endif << " --arq-server-address HOSTNAME\n" << " Set the ARQ TCP server address\n" << " The default is: " << progdefaults.arq_address << "\n\n" << " --arq-server-port PORT\n" << " Set the ARQ TCP server port\n" << " The default is: " << progdefaults.arq_port << "\n\n" << " --flmsg-dir DIRECTORY\n" << " Look for flmsg files in DIRECTORY\n" << " The default is " << FLMSG_dir_default << "\n\n" << " --auto-dir DIRECTORY\n" << " Look for wrap_auto_file files in DIRECTORY\n" << " The default is " << FLMSG_dir_default << "WRAP/auto/" << "\n\n" << " --xmlrpc-server-address HOSTNAME\n" << " Set the XML-RPC server address\n" << " The default is: " << progdefaults.xmlrpc_address << "\n\n" << " --xmlrpc-server-port PORT\n" << " Set the XML-RPC server port\n" << " The default is: " << progdefaults.xmlrpc_port << "\n\n" << " --xmlrpc-allow REGEX\n" << " Allow only the methods whose names match REGEX\n\n" << " --xmlrpc-deny REGEX\n" << " Allow only the methods whose names don't match REGEX\n\n" << " --xmlrpc-list\n" << " List all available methods\n\n" #if BENCHMARK_MODE << " --benchmark-modem ID\n" << " Specify the modem\n" << " Default: " << mode_info[benchmark.modem].sname << "\n\n" << " --benchmark-frequency FREQ\n" << " Specify the modem frequency\n" << " Default: " << benchmark.freq << "\n\n" << " --benchmark-afc BOOLEAN\n" << " Set modem AFC\n" << " Default: " << benchmark.afc << " (" << boolalpha << benchmark.afc << noboolalpha << ")\n\n" << " --benchmark-squelch BOOLEAN\n" << " Set modem squelch\n" << " Default: " << benchmark.sql << " (" << boolalpha << benchmark.sql << noboolalpha << ")\n\n" << " --benchmark-squelch-level LEVEL\n" << " Set modem squelch level\n" << " Default: " << benchmark.sqlevel << " (%)\n\n" << " --benchmark-input INPUT\n" << " Specify the input\n" << " Must be a positive integer indicating the number of samples\n" " of silence to generate as the input" # if USE_SNDFILE ", or a filename containing\n" " non-digit characters" #endif "\n\n" << " --benchmark-output FILE\n" << " Specify the output data file\n" << " Default: decoder output is discarded\n\n" << " --benchmark-src-ratio RATIO\n" << " Specify the sample rate conversion ratio\n" << " Default: 1.0 (input is not resampled)\n\n" << " --benchmark-src-type TYPE\n" << " Specify the sample rate conversion type\n" << " Default: " << benchmark.src_type << " (" << src_get_name(benchmark.src_type) << ")\n\n" #endif << " --cpu-speed-test\n" << " Perform the CPU speed test, show results in the event log\n" << " and possibly change options.\n\n" << " --noise\n" << " Unhide controls for noise tests\n\n" << " --wfall-only\n" << " Hide all controls but the waterfall\n\n" << " --debug-level LEVEL\n" << " Set the event log verbosity\n\n" << " --debug-pskmail\n" << " Enable logging for pskmail / arq events\n\n" << " --debug-audio\n" << " Enable logging for sound-card events\n\n" << " --version\n" << " Print version information\n\n" << " --build-info\n" << " Print build information\n\n" << " --help\n" << " Print this option help\n\n"; // Fl::help looks ugly so we'll write our own help << "Standard FLTK options:\n\n" << " -bg COLOR, -background COLOR\n" << " Set the background color\n" << " -bg2 COLOR, -background2 COLOR\n" << " Set the secondary (text) background color\n\n" << " -di DISPLAY, -display DISPLAY\n" << " Set the X display to use DISPLAY,\n" << " format is ``host:n.n''\n\n" << " -dn, -dnd or -nodn, -nodnd\n" << " Enable or disable drag and drop copy and paste in text fields\n\n" << " -fg COLOR, -foreground COLOR\n" << " Set the foreground color\n\n" << " -g GEOMETRY, -geometry GEOMETRY\n" << " Set the initial window size and position\n" << " GEOMETRY format is ``WxH+X+Y''\n" << " ** " << PACKAGE_NAME << " may override this setting **\n\n" << " -i, -iconic\n" << " Start " << PACKAGE_NAME << " in iconified state\n\n" << " -k, -kbd or -nok, -nokbd\n" << " Enable or disable visible keyboard focus in non-text widgets\n\n" << " -na CLASSNAME, -name CLASSNAME\n" << " Set the window class to CLASSNAME\n\n" << " -ti WINDOWTITLE, -title WINDOWTITLE\n" << " Set the window title\n\n"; help << "Additional UI options:\n\n" << " --font FONT[:SIZE]\n" << " Set the widget font and (optionally) size\n" << " The default is: " << Fl::get_font(FL_HELVETICA) << ':' << FL_NORMAL_SIZE << "\n\n" ; option_help = help.str(); } void exit_cb(void*) { fl_digi_main->do_callback(); } int parse_args(int argc, char **argv, int& idx) { // Only handle long options if (!(strlen(argv[idx]) >= 2 && strncmp(argv[idx], "--", 2) == 0)) { // Store the window title. We may need this early in the initialisation // process, before FLTK uses it to set the main window title. if (main_window_title.empty() && argc > idx && (!strcmp(argv[idx], "-ti") || !strcmp(argv[idx], "-title"))) main_window_title = argv[idx + 1]; else if (!strcmp(argv[idx], "-i") || !strcmp(argv[idx], "-iconic")) iconified = true; return 0; } enum { OPT_ZERO, #ifndef __WOE32__ OPT_RX_IPC_KEY, OPT_TX_IPC_KEY, #endif OPT_HOME_DIR, OPT_CONFIG_DIR, OPT_ARQ_ADDRESS, OPT_ARQ_PORT, OPT_SHOW_CPU_CHECK, OPT_FLMSG_DIR, OPT_AUTOSEND_DIR, OPT_CONFIG_XMLRPC_ADDRESS, OPT_CONFIG_XMLRPC_PORT, OPT_CONFIG_XMLRPC_ALLOW, OPT_CONFIG_XMLRPC_DENY, OPT_CONFIG_XMLRPC_LIST, #if BENCHMARK_MODE OPT_BENCHMARK_MODEM, OPT_BENCHMARK_AFC, OPT_BENCHMARK_SQL, OPT_BENCHMARK_SQLEVEL, OPT_BENCHMARK_FREQ, OPT_BENCHMARK_INPUT, OPT_BENCHMARK_OUTPUT, OPT_BENCHMARK_SRC_RATIO, OPT_BENCHMARK_SRC_TYPE, #endif OPT_FONT, OPT_WFALL_HEIGHT, OPT_WINDOW_WIDTH, OPT_WINDOW_HEIGHT, OPT_WFALL_ONLY, #if USE_PORTAUDIO OPT_FRAMES_PER_BUFFER, #endif OPT_NOISE, OPT_DEBUG_LEVEL, OPT_DEBUG_PSKMAIL, OPT_DEBUG_AUDIO, OPT_EXIT_AFTER, OPT_DEPRECATED, OPT_HELP, OPT_VERSION, OPT_BUILD_INFO }; static const char shortopts[] = ":"; static const struct option longopts[] = { #ifndef __WOE32__ { "rx-ipc-key", 1, 0, OPT_RX_IPC_KEY }, { "tx-ipc-key", 1, 0, OPT_TX_IPC_KEY }, #endif { "home-dir", 1, 0, OPT_HOME_DIR }, { "config-dir", 1, 0, OPT_CONFIG_DIR }, { "arq-server-address", 1, 0, OPT_ARQ_ADDRESS }, { "arq-server-port", 1, 0, OPT_ARQ_PORT }, { "flmsg-dir", 1, 0, OPT_FLMSG_DIR }, { "auto-dir", 1, 0, OPT_AUTOSEND_DIR }, { "cpu-speed-test", 0, 0, OPT_SHOW_CPU_CHECK }, { "xmlrpc-server-address", 1, 0, OPT_CONFIG_XMLRPC_ADDRESS }, { "xmlrpc-server-port", 1, 0, OPT_CONFIG_XMLRPC_PORT }, { "xmlrpc-allow", 1, 0, OPT_CONFIG_XMLRPC_ALLOW }, { "xmlrpc-deny", 1, 0, OPT_CONFIG_XMLRPC_DENY }, { "xmlrpc-list", 0, 0, OPT_CONFIG_XMLRPC_LIST }, #if BENCHMARK_MODE { "benchmark-modem", 1, 0, OPT_BENCHMARK_MODEM }, { "benchmark-frequency", 1, 0, OPT_BENCHMARK_FREQ }, { "benchmark-afc", 1, 0, OPT_BENCHMARK_AFC }, { "benchmark-squelch", 1, 0, OPT_BENCHMARK_SQL }, { "benchmark-squelch-level", 1, 0, OPT_BENCHMARK_SQLEVEL }, { "benchmark-input", 1, 0, OPT_BENCHMARK_INPUT }, { "benchmark-output", 1, 0, OPT_BENCHMARK_OUTPUT }, { "benchmark-src-ratio", 1, 0, OPT_BENCHMARK_SRC_RATIO }, { "benchmark-src-type", 1, 0, OPT_BENCHMARK_SRC_TYPE }, #endif { "font", 1, 0, OPT_FONT }, { "wfall-height", 1, 0, OPT_WFALL_HEIGHT }, { "window-width", 1, 0, OPT_WINDOW_WIDTH }, { "window-height", 1, 0, OPT_WINDOW_HEIGHT }, { "wfall-only", 0, 0, OPT_WFALL_ONLY }, { "wo", 0, 0, OPT_WFALL_ONLY }, #if USE_PORTAUDIO { "frames-per-buffer",1, 0, OPT_FRAMES_PER_BUFFER }, #endif { "exit-after", 1, 0, OPT_EXIT_AFTER }, { "noise", 0, 0, OPT_NOISE }, { "debug-level", 1, 0, OPT_DEBUG_LEVEL }, { "debug-pskmail", 0, 0, OPT_DEBUG_PSKMAIL }, { "debug-audio", 0, 0, OPT_DEBUG_AUDIO }, { "help", 0, 0, OPT_HELP }, { "version", 0, 0, OPT_VERSION }, { "build-info", 0, 0, OPT_BUILD_INFO }, { 0 } }; int longindex; optind = idx; opterr = 0; int c = getopt_long(argc, argv, shortopts, longopts, &longindex); switch (c) { case -1: return 0; case 0: // handle options with non-0 flag here return 0; #if !defined(__WOE32__) && !defined(__APPLE__) case OPT_RX_IPC_KEY: case OPT_TX_IPC_KEY: { errno = 0; int key = strtol(optarg, NULL, (strncasecmp(optarg, "0x", 2) ? 10 : 16)); if (errno || key <= 0) cerr << "Hmm, " << key << " doesn't look like a valid IPC key\n"; if (c == OPT_RX_IPC_KEY) progdefaults.rx_msgid = key; else progdefaults.tx_msgid = key; } break; #endif case OPT_HOME_DIR: { char buf[FL_PATH_MAX + 1]; fl_filename_absolute(buf, sizeof(buf) - 1, optarg); BaseDir = buf; } if (*BaseDir.rbegin() != '/') BaseDir += '/'; break; case OPT_CONFIG_DIR: { char buf[FL_PATH_MAX + 1]; fl_filename_absolute(buf, sizeof(buf) - 1, optarg); HomeDir = buf; } if (*HomeDir.rbegin() != '/') HomeDir += '/'; break; case OPT_ARQ_ADDRESS: progdefaults.arq_address = optarg; break; case OPT_ARQ_PORT: progdefaults.arq_port = optarg; break; case OPT_FLMSG_DIR: { char buf[FL_PATH_MAX + 1]; fl_filename_absolute(buf, sizeof(buf) - 1, optarg); FLMSG_dir_default = buf; if (*FLMSG_dir_default.rbegin() != '/') FLMSG_dir_default += '/'; } break; case OPT_AUTOSEND_DIR: { char buf[FL_PATH_MAX + 1]; fl_filename_absolute(buf, sizeof(buf) - 1, optarg); FLMSG_WRAP_auto_dir = buf; if (*FLMSG_WRAP_auto_dir.rbegin() != '/') FLMSG_WRAP_auto_dir += '/'; } break; case OPT_CONFIG_XMLRPC_ADDRESS: progdefaults.xmlrpc_address = optarg; break; case OPT_CONFIG_XMLRPC_PORT: progdefaults.xmlrpc_port = optarg; break; case OPT_CONFIG_XMLRPC_ALLOW: progdefaults.xmlrpc_allow = optarg; break; case OPT_CONFIG_XMLRPC_DENY: if (!progdefaults.xmlrpc_allow.empty()) cerr << "W: --" << longopts[longindex].name << " cannot be used together with --" << longopts[OPT_CONFIG_XMLRPC_ALLOW-1].name << " and will be ignored\n"; else progdefaults.xmlrpc_deny = optarg; break; case OPT_CONFIG_XMLRPC_LIST: XML_RPC_Server::list_methods(cout); exit(EXIT_SUCCESS); #if BENCHMARK_MODE case OPT_BENCHMARK_MODEM: benchmark.modem = strtol(optarg, NULL, 10); if (!(benchmark.modem >= 0 && benchmark.modem < NUM_MODES)) { fatal_error(_("Bad modem id")); } break; case OPT_BENCHMARK_FREQ: benchmark.freq = strtol(optarg, NULL, 10); if (benchmark.freq < 0) { fatal_error(_("Bad frequency")); } break; case OPT_BENCHMARK_AFC: benchmark.afc = strtol(optarg, NULL, 10); break; case OPT_BENCHMARK_SQL: benchmark.sql = strtol(optarg, NULL, 10); break; case OPT_BENCHMARK_SQLEVEL: benchmark.sqlevel = strtod(optarg, NULL); break; case OPT_BENCHMARK_INPUT: benchmark.input = optarg; break; case OPT_BENCHMARK_OUTPUT: benchmark.output = optarg; break; case OPT_BENCHMARK_SRC_RATIO: benchmark.src_ratio = strtod(optarg, NULL); break; case OPT_BENCHMARK_SRC_TYPE: benchmark.src_type = strtol(optarg, NULL, 10); break; #endif case OPT_FONT: { char *p; if ((p = strchr(optarg, ':'))) { *p = '\0'; FL_NORMAL_SIZE = strtol(p + 1, 0, 10); } } Fl::set_font(FL_HELVETICA, optarg); break; case OPT_WFALL_HEIGHT: progdefaults.wfheight = strtol(optarg, NULL, 10); break; case OPT_WINDOW_WIDTH: WNOM = strtol(optarg, NULL, 10); break; case OPT_WINDOW_HEIGHT: HNOM = strtol(optarg, NULL, 10); break; #if USE_PORTAUDIO case OPT_FRAMES_PER_BUFFER: progdefaults.PortFramesPerBuffer = strtol(optarg, 0, 10); break; #endif // USE_PORTAUDIO case OPT_EXIT_AFTER: Fl::add_timeout(strtod(optarg, 0), exit_cb); break; case OPT_WFALL_ONLY: bWF_only = true; break; case OPT_NOISE: withnoise = true; break; case OPT_SHOW_CPU_CHECK: show_cpucheck = true; break; case OPT_DEBUG_LEVEL: { int v = strtol(optarg, 0, 10); debug::level = (debug::level_e)CLAMP(v, 0, debug::LOG_NLEVELS-1); } break; case OPT_DEBUG_PSKMAIL: debug_pskmail = true; break; case OPT_DEBUG_AUDIO: debug_audio = true; break; case OPT_DEPRECATED: cerr << "W: the --" << longopts[longindex].name << " option has been deprecated and will be removed in a future version\n"; break; case OPT_HELP: cout << option_help; exit(EXIT_SUCCESS); case OPT_VERSION: cout << version_text; exit(EXIT_SUCCESS); case OPT_BUILD_INFO: cout << build_text; exit(EXIT_SUCCESS); case '?': case ':': default: arg_error(argv[0], argv[idx], (c == ':')); } // Increment idx by the number of args we used and return that number. // We must check whether the option argument is in the same argv element // as the option name itself, i.e., --opt=arg. c = longopts[longindex].has_arg ? 2 : 1; if (c == 2) { string arg = argv[idx]; string::size_type p; if ((p = arg.rfind(optarg)) != string::npos && arg[p-1] == '=') c = 1; } idx += c; return c; } void generate_version_text(void) { version_text.assign(PACKAGE_STRING "\nCopyright (C) 2007-2010 " PACKAGE_AUTHORS ".\n"); version_text.append(_("License GPLv3+: GNU GPL version 3 or later " "\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n")); ostringstream s; s << "Build information:\n"; s << " built : " << BUILD_DATE << " by " << BUILD_USER << '@' << BUILD_HOST << " on " << BUILD_BUILD_PLATFORM << " for " << BUILD_TARGET_PLATFORM << "\n\n" << " configure flags: " << BUILD_CONFIGURE_ARGS << "\n\n" << " compiler : " << BUILD_COMPILER << "\n\n" << " compiler flags : " << FLDIGI_BUILD_CXXFLAGS << "\n\n" << " linker flags : " << FLDIGI_BUILD_LDFLAGS << "\n\n" << " libraries : " "FLTK " FLTK_BUILD_VERSION "\n" << " " "libsamplerate " << SAMPLERATE_BUILD_VERSION "\n"; #if USE_SNDFILE s << " " "libsndfile " << SNDFILE_BUILD_VERSION "\n"; #endif #if USE_PORTAUDIO s << " " "PortAudio " << PORTAUDIO_BUILD_VERSION "\n"; #endif #if USE_PULSEAUDIO s << " " "PulseAudio " << PULSEAUDIO_BUILD_VERSION "\n"; #endif #if USE_HAMLIB s << " " "Hamlib " << HAMLIB_BUILD_VERSION "\n"; #endif s << "\nRuntime information:\n"; struct utsname u; if (uname(&u) != -1) { s << " system : " << u.sysname << ' ' << u.nodename << ' ' << u.release << ' ' << u.version << ' ' << u.machine << "\n\n"; } s << " libraries : " << src_get_version() << '\n'; #if USE_SNDFILE char sndfile_version[32]; sf_command(NULL, SFC_GET_LIB_VERSION, sndfile_version, sizeof(sndfile_version)); s << " " << sndfile_version << '\n'; #endif #if USE_PORTAUDIO s << " " << Pa_GetVersionText() << ' ' << Pa_GetVersion() << '\n'; #endif #if USE_PULSEAUDIO s << " " << "Pulseaudio " << pa_get_library_version() << '\n'; #endif #if USE_HAMLIB s << " " << hamlib_version << '\n'; #endif build_text = s.str(); } // When debugging is enabled, reexec with malloc debugging hooks enabled, unless // the env var FLDIGI_NO_EXEC is set, or our parent process is gdb. void debug_exec(char** argv) { #if !defined(NDEBUG) && defined(__GLIBC__) if (getenv("FLDIGI_NO_EXEC")) return; char ppath[32], lname[32]; ssize_t n; snprintf(ppath, sizeof(ppath), "/proc/%u/exe", getppid()); if ((n = readlink(ppath, lname, sizeof(lname))) > 0) { lname[n] = '\0'; if (strstr(lname, "gdb")) { cerr << "Not using malloc debugging hooks\n"; return; } } setenv("FLDIGI_NO_EXEC", "1", 0); setenv("MALLOC_CHECK_", "3", 0); setenv("MALLOC_PERTURB_", "42", 0); if (execvp(*argv, argv) == -1) perror("execvp"); #endif } void set_platform_ui(void) { #if defined(__APPLE__) FL_NORMAL_SIZE = 12; progdefaults.WaterfallFontsize = 12; progdefaults.RxFontsize = 12; progdefaults.TxFontsize = 12; #elif defined(__WOE32__) Fl::set_font(FL_HELVETICA, "Tahoma"); FL_NORMAL_SIZE = 11; progdefaults.WaterfallFontnbr = FL_HELVETICA; progdefaults.WaterfallFontsize = 12; progdefaults.RxFontsize = 12; progdefaults.TxFontsize = 12; #else FL_NORMAL_SIZE = 12; #endif } // Convert 1 second of 1-channel silence from IN_RATE Hz to OUT_RATE Hz, // Repeat test "repeat" times. Return (repeat / elapsed_time), // the faster-than-realtime factor averaged over "repeat" runs. // Some figures for SRC_SINC_FASTEST: // Pentium 4 2.8GHz: 70 // Pentium 3 550MHz: 13 // UltraSparc II 270MHz: 3.5 // Atom N280 1.66GHz: 17.7 #define IN_RATE 48000 #define OUT_RATE 8000 double speed_test(int converter, unsigned repeat) { SRC_DATA src; src.src_ratio = (double)OUT_RATE / IN_RATE; src.input_frames = IN_RATE; src.output_frames = OUT_RATE; src.data_in = new float[src.input_frames]; src.data_out = new float[src.output_frames]; memset(src.data_in, 0, src.input_frames * sizeof(float)); // warm up src_simple(&src, converter, 1); struct timespec t0, t1; #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t0); #else clock_gettime(CLOCK_REALTIME, &t0); #endif for (unsigned i = 0; i < repeat; i++) src_simple(&src, converter, 1); #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t1); #else clock_gettime(CLOCK_REALTIME, &t1); #endif delete [] src.data_in; delete [] src.data_out; t0 = t1 - t0; return repeat / (t0.tv_sec + t0.tv_nsec/1e9); } static void setup_signal_handlers(void) { #ifndef __WOE32__ struct sigaction action; memset(&action, 0, sizeof(struct sigaction)); // no child stopped notifications, no zombies action.sa_handler = SIG_DFL; action.sa_flags = SA_NOCLDSTOP; #ifdef SA_NOCLDWAIT action.sa_flags |= SA_NOCLDWAIT; #endif sigaction(SIGCHLD, &action, NULL); action.sa_flags = 0; action.sa_handler = handle_signal; sigaction(SIGSEGV, &action, NULL); sigaction(SIGILL, &action, NULL); sigaction(SIGABRT, &action, NULL); sigaction(SIGUSR2, &action, NULL); action.sa_handler = SIG_IGN; sigaction(SIGPIPE, &action, NULL); sigemptyset(&action.sa_mask); sigaddset(&action.sa_mask, SIGUSR2); pthread_sigmask(SIG_BLOCK, &action.sa_mask, NULL); #else signal(SIGSEGV, handle_signal); signal(SIGILL, handle_signal); signal(SIGABRT, handle_signal); #endif } // Show an error dialog and print to cerr if available. // On win32 Fl::fatal displays its own error window. static void fatal_error(string sz_error) { string s = "Fatal error!\n"; s.append(sz_error).append("\n").append(strerror(errno)); // Win32 will display a MessageBox error message #if !defined(__WOE32__) fl_message_font(FL_HELVETICA, FL_NORMAL_SIZE); fl_alert2("%s", s.c_str()); #endif Fl::fatal(s.c_str()); } static void checkdirectories(void) { struct DIRS { string& dir; const char* suffix; void (*new_dir_func)(void); }; DIRS fldigi_dirs[] = { { HomeDir, 0, 0 }, { RigsDir, "rigs", 0 }, { ScriptsDir, "scripts", 0 }, { PalettesDir, "palettes", create_new_palettes }, { LogsDir, "logs", 0 }, { PicsDir, "images", 0 }, { HelpDir, "help", 0 }, { MacrosDir, "macros", create_new_macros }, { WrapDir, "wrap", 0 }, { TalkDir, "talk", 0 }, { TempDir, "temp", 0 }, { KmlDir, "kml", 0 }, { DATA_dir, "data", 0 }, }; int r; for (size_t i = 0; i < sizeof(fldigi_dirs)/sizeof(*fldigi_dirs); i++) { if (fldigi_dirs[i].suffix) fldigi_dirs[i].dir.assign(HomeDir).append(fldigi_dirs[i].suffix).append(PATH_SEP); if ((r = mkdir(fldigi_dirs[i].dir.c_str(), 0777)) == -1 && errno != EEXIST) { string s = _("Could not make directory "); s.append(fldigi_dirs[i].dir); fatal_error(s); } else if (r == 0 && fldigi_dirs[i].new_dir_func) fldigi_dirs[i].new_dir_func(); } } bool nbems_dirs_checked = false; void check_nbems_dirs(void) { if (nbems_dirs_checked) return; struct DIRS { string& dir; const char* suffix; void (*new_dir_func)(void); }; DIRS NBEMS_dirs[] = { { NBEMS_dir, 0, 0 }, { ARQ_dir, "ARQ", 0 }, { ARQ_files_dir, "ARQ/files", 0 }, { ARQ_recv_dir, "ARQ/recv", 0 }, { ARQ_send, "ARQ/send", 0 }, { WRAP_dir, "WRAP", 0 }, { WRAP_recv_dir, "WRAP/recv", 0 }, { WRAP_send_dir, "WRAP/send", 0 }, { WRAP_auto_dir, "WRAP/auto", 0 }, { ICS_dir, "ICS", 0 }, { ICS_msg_dir, "ICS/messages", 0 }, { ICS_tmp_dir, "ICS/templates", 0 }, }; int r; for (size_t i = 0; i < sizeof(NBEMS_dirs)/sizeof(*NBEMS_dirs); i++) { if (NBEMS_dirs[i].suffix) NBEMS_dirs[i].dir.assign(NBEMS_dir).append(NBEMS_dirs[i].suffix).append(PATH_SEP); if ((r = mkdir(NBEMS_dirs[i].dir.c_str(), 0777)) == -1 && errno != EEXIST) { string s = _("Could not make directory "); s.append(NBEMS_dirs[i].dir); fatal_error(s); } else if (r == 0 && NBEMS_dirs[i].new_dir_func) NBEMS_dirs[i].new_dir_func(); } DIRS FLMSG_dirs[] = { { FLMSG_dir, 0, 0 }, { FLMSG_WRAP_dir, "WRAP", 0 }, { FLMSG_WRAP_recv_dir, "WRAP/recv", 0 }, { FLMSG_WRAP_send_dir, "WRAP/send", 0 }, { FLMSG_WRAP_auto_dir, "WRAP/auto", 0 }, { FLMSG_ICS_dir, "ICS", 0 }, { FLMSG_ICS_msg_dir, "ICS/messages", 0 }, { FLMSG_ICS_tmp_dir, "ICS/templates", 0 }, }; for (size_t i = 0; i < sizeof(FLMSG_dirs)/sizeof(*FLMSG_dirs); i++) { if (FLMSG_dirs[i].dir.empty() && FLMSG_dirs[i].suffix) FLMSG_dirs[i].dir.assign(FLMSG_dir).append(FLMSG_dirs[i].suffix).append(PATH_SEP); if ((r = mkdir(FLMSG_dirs[i].dir.c_str(), 0777)) == -1 && errno != EEXIST) { string s = _("Could not make directory "); s.append(FLMSG_dirs[i].dir); fatal_error(s); } else if (r == 0 && FLMSG_dirs[i].new_dir_func) FLMSG_dirs[i].new_dir_func(); } nbems_dirs_checked = true; } void check_data_dir(void) { if (mkdir(DATA_dir.c_str(), 0777) == -1 && errno != EEXIST) { string s = _("Could not make directory "); s.append(DATA_dir); fatal_error(s); } } // Print an error message and exit. static void arg_error(const char* name, const char* arg, bool missing) { ostringstream msg; msg << name << ": "; if (arg && *arg) { if (missing) msg << "option '" << arg << "' requires an argument\n"; else msg << "unrecognized option '" << arg << "'\n"; } else msg << "error while parsing command line\n"; msg << "See command line help for more information."; fatal_error(msg.str()); } /// Sets or resets the KML parameters, and loads existing files. void kml_init(bool load_files) { KmlServer::GetInstance()->InitParams( progdefaults.kml_command, progdefaults.kml_save_dir, (double)progdefaults.kml_merge_distance, progdefaults.kml_retention_time, progdefaults.kml_refresh_interval, progdefaults.kml_balloon_style); if(load_files) { KmlServer::GetInstance()->ReloadKmlFiles(); } /// TODO: Should do this only when the locator has changed. try { /// One special KML object for the user. CoordinateT::Pair myCoo( progdefaults.myLocator ); /// TODO: Fix this: It does not seem to create a polyline when changing the locator. KmlServer::CustomDataT custData ; custData.Push( "QTH", progdefaults.myQth ); custData.Push( "Locator", progdefaults.myLocator ); custData.Push( "Antenna", progdefaults.myAntenna ); custData.Push( "Name", progdefaults.myName ); KmlServer::GetInstance()->Broadcast( "User", KmlServer::UniqueEvent, myCoo, 0.0, // Altitude. progdefaults.myCall, progdefaults.myLocator, progdefaults.myQth, custData ); } catch( const std::exception & exc ) { LOG_WARN("Cannot publish user position:%s", exc.what() ); } } /// Tests if a directory exists. int directory_is_created( const char * strdir ) { DIR *dir = opendir(strdir); if (dir) { closedir(dir); return true; } return false; } fldigi-3.21.80/src/logger/0000775000175000017500000000000012313333726012177 500000000000000fldigi-3.21.80/src/logger/logger.cxx0000664000175000017500000001467512313064025014130 00000000000000// ---------------------------------------------------------------------------- // logger.cxx Remote Log Interface for fldigi // // Copyright 2006-2009 W1HKJ, Dave Freese // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #if !defined(__WOE32__) && !defined(__APPLE__) # include # include #endif #include #include #include "logger.h" #include "lgbook.h" #include "main.h" #include "modem.h" #include "waterfall.h" #include "fl_digi.h" #include "trx.h" #include "debug.h" #include "macros.h" #include "status.h" #include "spot.h" #include "adif_io.h" #include "date.h" #include "configuration.h" #include "logsupport.h" #include "lookupcall.h" #include using namespace std; //--------------------------------------------------------------------- const char *logmode; static string log_msg; static string errmsg; static string notes; //============================================================================= #if defined(__WOE32__) || defined(__APPLE__) static string adif; void writeADIF () { // open the adif file FILE *adiFile; string sfname; sfname = TempDir; sfname.append("log.adif"); adiFile = fopen (sfname.c_str(), "a"); if (adiFile) { // write the current record to the file fprintf(adiFile,"%s\n", adif.c_str()); fclose (adiFile); } } void putadif(int num, const char *s) { char tempstr[100]; int slen = strlen(s); int n = snprintf(tempstr, sizeof(tempstr), "<%s:%d>", fields[num].name, slen); if (n == -1) { LOG_PERROR("snprintf"); return; } adif.append(tempstr).append(s); } void submit_ADIF(cQsoRec &rec) { adif.erase(); putadif(QSO_DATE, rec.getField(QSO_DATE)); putadif(TIME_ON, rec.getField(TIME_ON)); putadif(QSO_DATE_OFF, rec.getField(QSO_DATE_OFF)); putadif(TIME_OFF, rec.getField(TIME_OFF)); putadif(CALL, rec.getField(CALL)); putadif(FREQ, rec.getField(FREQ)); putadif(MODE, rec.getField(MODE)); putadif(RST_SENT, rec.getField(RST_SENT)); putadif(RST_RCVD, rec.getField(RST_RCVD)); putadif(TX_PWR, rec.getField(TX_PWR)); putadif(NAME, rec.getField(NAME)); putadif(QTH, rec.getField(QTH)); putadif(STATE, rec.getField(STATE)); putadif(VE_PROV, rec.getField(VE_PROV)); putadif(COUNTRY, rec.getField(COUNTRY)); putadif(GRIDSQUARE, rec.getField(GRIDSQUARE)); putadif(STX, rec.getField(STX)); putadif(SRX, rec.getField(SRX)); putadif(XCHG1, rec.getField(XCHG1)); putadif(MYXCHG, rec.getField(MYXCHG)); notes = rec.getField(NOTES); for (size_t i = 0; i < notes.length(); i++) if (notes[i] == '\n') notes[i] = ';'; putadif(NOTES, notes.c_str()); // these fields will always be blank unless they are added to the main // QSO log area. putadif(IOTA, rec.getField(IOTA)); putadif(DXCC, rec.getField(DXCC)); putadif(QSL_VIA, rec.getField(QSL_VIA)); putadif(QSLRDATE, rec.getField(QSLRDATE)); putadif(QSLSDATE, rec.getField(QSLSDATE)); writeADIF(); } #endif //--------------------------------------------------------------------- // the following IPC message is compatible with xlog remote data spec. //--------------------------------------------------------------------- #if !defined(__WOE32__) && !defined(__APPLE__) #define addtomsg(x, y) log_msg = log_msg + (x) + (y) + LOG_MSEPARATOR static void send_IPC_log(cQsoRec &rec) { msgtype msgbuf; const char LOG_MSEPARATOR[2] = {1,0}; int msqid, len; int mm, dd, yyyy; char szdate[9]; char sztime[5]; strncpy(szdate, rec.getField(QSO_DATE_OFF), 8); szdate[8] = 0; sscanf(&szdate[6], "%d", &dd); szdate[6] = 0; sscanf(&szdate[4], "%d", &mm); szdate[4] = 0; sscanf(szdate, "%d", &yyyy); Date logdate(mm, dd, yyyy); log_msg.clear(); log_msg = string("program:") + PACKAGE_NAME + string(" v ") + PACKAGE_VERSION + LOG_MSEPARATOR; addtomsg("version:", LOG_MVERSION); addtomsg("date:", logdate.szDate(5)); memset(sztime, 0, sizeof(sztime) / sizeof(char)); strncpy(sztime, rec.getField(TIME_ON), (sizeof(sztime) / sizeof(char)) - 1); addtomsg("TIME:", sztime); memset(sztime, 0, 5); strncpy(sztime, rec.getField(TIME_OFF), 4); addtomsg("endtime:", sztime); addtomsg("call:", rec.getField(CALL)); addtomsg("mhz:", rec.getField(FREQ)); addtomsg("mode:", rec.getField(MODE)); addtomsg("tx:", rec.getField(RST_SENT)); addtomsg("rx:", rec.getField(RST_RCVD)); addtomsg("name:", rec.getField(NAME)); addtomsg("qth:", rec.getField(QTH)); addtomsg("state:", rec.getField(STATE)); addtomsg("province:", rec.getField(VE_PROV)); addtomsg("country:", rec.getField(COUNTRY)); addtomsg("locator:", rec.getField(GRIDSQUARE)); addtomsg("serialout:", rec.getField(STX)); addtomsg("serialin:", rec.getField(SRX)); addtomsg("free1:", rec.getField(XCHG1)); notes = rec.getField(NOTES); for (size_t i = 0; i < notes.length(); i++) if (notes[i] == '\n') notes[i] = ';'; addtomsg("notes:", notes.c_str()); addtomsg("power:", rec.getField(TX_PWR)); strncpy(msgbuf.mtext, log_msg.c_str(), sizeof(msgbuf.mtext)); msgbuf.mtext[sizeof(msgbuf.mtext) - 1] = '\0'; if ((msqid = msgget(LOG_MKEY, 0666 | IPC_CREAT)) == -1) { LOG_PERROR("msgget"); return; } msgbuf.mtype = LOG_MTYPE; len = strlen(msgbuf.mtext) + 1; if (msgsnd(msqid, &msgbuf, len, IPC_NOWAIT) < 0) LOG_PERROR("msgsnd"); } #endif void submit_record(cQsoRec &rec) { #if !defined(__WOE32__) && !defined(__APPLE__) send_IPC_log(rec); #else submit_ADIF(rec); #endif } //--------------------------------------------------------------------- extern void xml_add_record(); void submit_log(void) { if (progStatus.spot_log) spot_log(inpCall->value(), inpLoc->value()); logmode = mode_info[active_modem->get_mode()].adif_name; if (progdefaults.eqsl_when_logged) makeEQSL(""); if (progdefaults.xml_logbook) xml_add_record(); else AddRecord(); } fldigi-3.21.80/src/logger/speak.cxx0000664000175000017500000000724512313064025013747 00000000000000// ---------------------------------------------------------------------------- // speak.cxx rx text data stream to file // rx text data stream to client socket on MS // // Copyright 2009 W1HKJ, Dave Freese // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "gettext.h" #include "speak.h" #include "main.h" #include "status.h" #include "fl_digi.h" #include "configuration.h" #include "debug.h" #include "socket.h" #include "icons.h" using namespace std; const char *txtTalkInfo = _("\ Save all received text, one character at a time to the following file:\n\n\ fldigi.files\\talk\\textout.txt (Windows)\n\ ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)"); string speakfname = ""; ofstream speakout; string speakbuffer = ""; #ifndef __WIN32__ void open_talker() {} void close_talker() {} void toggle_talker() {} #endif #ifdef __WIN32__ #include "confdialog.h" string talkbuffer = ""; Socket *talker_tcpip = 0; string talker_address = "127.0.0.1"; string talker_port = "1111"; bool can_talk = true; void open_talker() { try { talker_tcpip = new Socket(Address(talker_address.c_str(), talker_port.c_str())); talker_tcpip->set_timeout(0.01); talker_tcpip->connect(); btnConnectTalker->value(1); btnConnectTalker->redraw(); can_talk = true; } catch (const SocketException& e) { LOG_INFO("Talker Server not available"); btnConnectTalker->value(0); btnConnectTalker->redraw(); can_talk = false; } } void close_talker() { talker_tcpip->close(); btnConnectTalker->value(0); btnConnectTalker->redraw(); can_talk = false; } void toggle_talker() { if (can_talk) close_talker(); else open_talker(); } void speak(int c) { if (progdefaults.speak) { if (speakfname.empty()) { speakfname = TalkDir; speakfname.append("textout.txt"); } speakbuffer += (char)c; // Windows is not able to handle continuously open/close of the append file // the file might or might not be written to. if (!speakout) speakout.open(speakfname.c_str(), ios::app); if (speakout) { for (size_t i = 0; i < speakbuffer.length(); i++) speakout.put(speakbuffer[i]); speakbuffer.clear(); } } if (can_talk && !talker_tcpip) open_talker(); if (!talker_tcpip) return; if (c < ' ' || c > 'z') c = ','; talkbuffer += c; try { talker_tcpip->send(talkbuffer); } catch (const SocketException& e) { LOG_INFO("Talker server not available"); delete talker_tcpip; talker_tcpip = 0; btnConnectTalker->labelcolor(FL_RED); btnConnectTalker->redraw_label(); can_talk = false; } talkbuffer.clear(); } #else void speak(int c) { if (!progdefaults.speak) return; if (speakfname.empty()) { speakfname = TalkDir; speakfname.append("textout.txt"); } speakbuffer += c; speakout.open(speakfname.c_str(), ios::app); if (!speakout) return; for (size_t i = 0; i < speakbuffer.length(); i++) speakout.put(speakbuffer[i]); speakbuffer.clear(); speakout.flush(); speakout.close(); } #endif fldigi-3.21.80/src/logger/rx_extract.cxx0000664000175000017500000002707512313064025015032 00000000000000// ---------------------------------------------------------------------------- // rx_extract.cxx extract delineated data stream to file // // Copyright 2013 W1HKJ, Dave Freese // 2013 KL4YFD, John Phelps // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "fileselect.h" #include "gettext.h" #include "rx_extract.h" #include "main.h" #include "status.h" #include "fl_digi.h" #include "configuration.h" #include "confdialog.h" #include "debug.h" #include "icons.h" #include "qrunner.h" #include "timeops.h" using namespace std; static const char *wrap_beg = "[WRAP:beg]"; static const char *wrap_end = "[WRAP:end]"; static const char *flmsg = ""; static const char flamp_beg[] = ">FLAMP"; static const char flamp_end[] = ":EOT}"; #ifdef __WIN32__ const char *txtWrapInfo = _("\ Detect the occurance of [WRAP:beg] and [WRAP:end]\n\ Save tags and all enclosed text to date-time stamped file, ie:\n\ NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap"); #else const char *txtWrapInfo = _("\ Detect the occurance of [WRAP:beg] and [WRAP:end]\n\ Save tags and all enclosed text to date-time stamped file, ie:\n\ ~/.nbems/WRAP/recv/extract-20090127-092515.wrap"); #endif #define bufsize 16 char rx_extract_buff[bufsize + 1]; string rx_buff; string rx_extract_msg; bool extract_wrap = false; bool extract_flamp = false; bool bInit = false; char dttm[64]; void rx_extract_reset() { rx_buff.clear(); memset(rx_extract_buff, ' ', bufsize); rx_extract_buff[bufsize] = 0; extract_wrap = false; extract_flamp = false; put_status(""); } void rx_extract_timer(void *) { rx_extract_msg = "Extract timed out"; put_status(rx_extract_msg.c_str(), 20, STATUS_CLEAR); rx_extract_reset(); } void rx_add_timer() { Fl::add_timeout(progdefaults.extract_timeout, rx_extract_timer, NULL); } void rx_remove_timer() { Fl::remove_timeout(rx_extract_timer); } void invoke_flmsg() { string cmd = progdefaults.flmsg_pathname; REQ(rx_remove_timer); struct tm tim; time_t t; time(&t); gmtime_r(&t, &tim); strftime(dttm, sizeof(dttm), "%Y%m%d-%H%M%S", &tim); string outfilename = FLMSG_WRAP_recv_dir; outfilename.append("extract-"); outfilename.append(dttm); outfilename.append(".wrap"); ofstream extractstream(outfilename.c_str(), ios::binary); if (extractstream) { extractstream << rx_buff; extractstream.close(); } rx_extract_msg = "File saved in "; rx_extract_msg.append(FLMSG_WRAP_recv_dir); put_status(rx_extract_msg.c_str(), 20, STATUS_CLEAR); if (progdefaults.open_nbems_folder) open_recv_folder(FLMSG_WRAP_recv_dir.c_str()); if ((progdefaults.open_flmsg || progdefaults.open_flmsg_print) && (rx_buff.find(flmsg) != string::npos) && !progdefaults.flmsg_pathname.empty()) { #ifdef __MINGW32__ cmd.append(" -title ").append(dttm); cmd.append(" --flmsg-dir ").append("\"").append(FLMSG_dir).append("\""); if (progdefaults.open_flmsg_print && progdefaults.open_flmsg) cmd.append(" --b"); else if (progdefaults.open_flmsg_print) cmd.append(" --p"); cmd.append(" \"").append(outfilename).append("\""); char *cmdstr = strdup(cmd.c_str()); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); if (!CreateProcess( NULL, cmdstr, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free (cmdstr); #else string params = ""; static string ap[10];// = cmd;//""; string param = ""; size_t p = cmd.find(" -"); if (p != string::npos) { param.assign(cmd.substr(p)); cmd = cmd.substr(0,p); } for (int i = 0; i < 10; i++) ap[i].clear(); int n = 0; ap[n++] = "-title"; ap[n++] = dttm; ap[n++] = "--flmsg-dir"; ap[n++] = FLMSG_dir; if (progdefaults.open_flmsg_print && progdefaults.open_flmsg) ap[n++] = " --b";//params = " --b"; else if (progdefaults.open_flmsg_print) ap[n++] = " --p";//params = " --p"; ap[n++] = outfilename; switch (fork()) { case 0: # ifndef NDEBUG unsetenv("MALLOC_CHECK_"); unsetenv("MALLOC_PERTURB_"); # endif switch (n) { case 1: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)0); break; case 2: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)0); break; case 3: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)0); break; case 4: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)0); break; case 5: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)0); break; case 6: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)0); break; case 7: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)ap[6].c_str(), (char*)0); break; case 8: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)ap[6].c_str(), (char*)ap[7].c_str(), (char*)0); break; case 9: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)ap[6].c_str(), (char*)ap[7].c_str(), (char*)ap[8].c_str(), (char*)0); break; case 10: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)ap[6].c_str(), (char*)ap[7].c_str(), (char*)ap[8].c_str(), (char*)ap[9].c_str(), (char*)0); break; default : ; } exit(EXIT_FAILURE); case -1: fl_alert2(_("Could not start flmsg")); } #endif } } void rx_extract_add(int c) { if (!c) return; check_nbems_dirs(); if (!bInit) { rx_extract_reset(); bInit = true; } char ch = (char)c; memmove(rx_extract_buff, &rx_extract_buff[1], bufsize - 1); rx_extract_buff[bufsize - 1] = ch; if ( strstr(rx_extract_buff, wrap_beg) && !extract_flamp) { rx_buff.assign(wrap_beg); rx_extract_msg = "Extracting WRAP/FLMSG"; put_status(rx_extract_msg.c_str()); memset(rx_extract_buff, ' ', bufsize); extract_wrap = true; REQ(rx_remove_timer); REQ(rx_add_timer); } else if (extract_wrap) { rx_buff += ch; REQ(rx_remove_timer); REQ(rx_add_timer); if (strstr(rx_extract_buff, wrap_end) != NULL) { invoke_flmsg(); rx_extract_reset(); } } else if (strstr(rx_extract_buff, flamp_beg) && ! extract_wrap) { extract_flamp = true; rx_extract_msg = "Extracting FLAMP"; put_status(rx_extract_msg.c_str()); } else if (extract_flamp == true) { REQ(rx_remove_timer); REQ(rx_add_timer); if (strstr(rx_extract_buff, flamp_end) != NULL) { rx_extract_reset(); } } } void select_flmsg_pathname() { if (NBEMSapps_dir) { progdefaults.flmsg_pathname.assign(BaseDir).append("flmsg.exe"); progdefaults.changed = true; txt_flmsg_pathname->value(progdefaults.flmsg_pathname.c_str()); return; } #ifdef __APPLE__ open_recv_folder("/Applications/"); return; #else string deffilename = progdefaults.flmsg_pathname; if (deffilename.empty()) # ifdef __MINGW32__ deffilename = "C:\\Program Files\\"; const char *p = FSEL::select(_("Locate flmsg executable"), _("flmsg.exe\t*.exe"), deffilename.c_str()); # else deffilename = "/usr/local/bin/"; const char *p = FSEL::select(_("Locate flmsg executable"), _("flmsg\t*"), deffilename.c_str()); # endif if (p) { progdefaults.flmsg_pathname = p; progdefaults.changed = true; txt_flmsg_pathname->value(p); } #endif } // this only works on Linux and Unix // not Windoze or // OS X to find binaries in the /Applications/ directory structure bool find_pathto_exectable(string &binpath, string executable) { size_t endindex = 0; binpath.clear(); // Get the PATH environment variable as pointer to string // The strings in the environment list are of the form name=value. // As typically implemented, getenv() returns a pointer to a string within // the environment list. The caller must take care not to modify this string, // since that would change the environment of the process. // // The implementation of getenv() is not required to be reentrant. The string // pointed to by the return value of getenv() may be statically allocated, and // can be modified by a subsequent call to getenv(), putenv(3), setenv(3), or // unsetenv(3). char *environment = getenv("PATH"); if (environment == NULL) return false; string env = environment; string testpath = ""; char endchar = ':'; // Parse single PATH string into directories while (!env.empty()) { endindex = env.find(endchar); testpath = env.substr(0, endindex); testpath.append("/"); // insert linux, unix, osx OS-correct delimiter testpath.append(executable); // append executable name // Most portable way to check if a file exists: Try to open it. FILE *checkexists = NULL; checkexists = fopen( testpath.c_str(), "r" ); // try to open file readonly if (checkexists) { // if the file successfully opened, it exists. fclose(checkexists); binpath = testpath; return true; } if (endindex == string::npos) env.clear(); else env.erase(0, endindex + 1); } return false; } string select_binary_pathname(string deffilename) { #ifdef __APPLE__ open_recv_folder("/Applications/"); return ""; #endif string executable; #ifdef __MINGW32__ deffilename = "C:\\Program Files\\"; const char *psz = FSEL::select(_("Locate executable"), _("*.exe"), deffilename.c_str()); #else size_t p = deffilename.rfind('/'); if (p != string::npos) executable = deffilename.substr(p+1); else executable = deffilename; if (!executable.empty() && find_pathto_exectable(deffilename, executable)) return deffilename; deffilename = "/usr/bin/"; const char *psz = FSEL::select(_("Locate binary"), _("*"), deffilename.c_str()); #endif if (psz) executable = psz; // do not allow recursion !! if (executable.find("fldigi") != string::npos) return ""; return executable; } fldigi-3.21.80/src/qrunner/0000775000175000017500000000000012313333726012412 500000000000000fldigi-3.21.80/src/qrunner/fqueue.h0000664000175000017500000000620512313064025013771 00000000000000// ---------------------------------------------------------------------------- // fqueue.h // // Copyright (C) 2007-2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef FQUEUE_H_ #define FQUEUE_H_ #include #include #include "ringbuffer.h" #include "util.h" // #include // #include // #include class func_base { public: virtual void destroy(bool run) = 0; virtual ~func_base() { } }; template class func_wrap : public func_base { public: explicit func_wrap(const F &f_) : f(f_) { } virtual void destroy(bool run) { if (run) f(); this->~func_wrap(); } private: F f; }; class fqueue { typedef ringbuffer fqueue_ringbuffer_t; public: fqueue(size_t count = 2048, size_t blocksize_ = 128) : blocksize(blocksize_) { rb = new fqueue_ringbuffer_t(blocksize * count); } ~fqueue() { drop(); delete rb; } bool empty(void) { return rb->read_space() == 0; } bool full(void) { return rb->write_space() == 0; } size_t size(void) { return rb->read_space() / blocksize; } template bool push(const T& t) { // If we have any space left at all, it will be at least // a blocksize. It will not wrap around the end of the rb. if (unlikely(rb->get_wv(wvec, blocksize) < blocksize)) return false; assert(blocksize >= sizeof(func_wrap)); // we assume a no-throw ctor! new (wvec[0].buf) func_wrap(t); rb->write_advance(blocksize); return true; } bool pop(bool exec = false) { if (rb->get_rv(rvec, blocksize) < blocksize) return false; reinterpret_cast(rvec[0].buf)->destroy(exec); rb->read_advance(blocksize); return true; } bool execute(void) { return pop(true); } size_t drop(void) { size_t n = 0; while (pop(false)) ++n; return n; } protected: fqueue_ringbuffer_t* rb; fqueue_ringbuffer_t::vector_type rvec[2], wvec[2]; size_t blocksize; }; #endif // FQUEUE_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-3.21.80/src/qrunner/qrunner.cxx0000664000175000017500000000515312313064025014545 00000000000000// ---------------------------------------------------------------------------- // qrunner.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #if defined(__CYGWIN__) # include # include #elif defined(__MINGW32__) # include "compat.h" #endif #include #include #include "fqueue.h" #include "qrunner.h" //Remi's advice for FIFO full issue #define FIFO_SIZE 2048 #define FIFO_SIZE 8192 #ifndef __MINGW32__ # define QRUNNER_EAGAIN() (errno == EAGAIN) #else # define QRUNNER_EAGAIN() ((errno = WSAGetLastError()) == WSAEWOULDBLOCK) #endif qrunner::qrunner() : attached(false), inprog(false), drop_flag(false) { fifo = new fqueue(FIFO_SIZE); #ifndef __WOE32__ if (pipe(pfd) == -1) #else if (socketpair(PF_INET, SOCK_STREAM, 0, pfd) == -1) #endif throw qexception(errno); set_cloexec(pfd[0], 1); set_cloexec(pfd[1], 1); if (set_nonblock(pfd[0], 1) == -1) throw qexception(errno); #ifdef __WOE32__ set_nodelay(pfd[1], 1); #endif } qrunner::~qrunner() { detach(); close(pfd[0]); close(pfd[1]); delete fifo; } void qrunner::attach(void) { Fl::add_fd(pfd[0], FL_READ, qrunner::execute, this); attached = true; } void qrunner::detach(void) { attached = false; Fl::remove_fd(pfd[0], FL_READ); } static unsigned char rbuf[FIFO_SIZE]; void qrunner::execute(int fd, void *arg) { qrunner *qr = reinterpret_cast(arg); if (qr->inprog) return; qr->inprog = true; size_t n = QRUNNER_READ(fd, rbuf, FIFO_SIZE); switch (n) { case -1: if (!QRUNNER_EAGAIN()) throw qexception(errno); // else fall through case 0: break; default: while (n--) qr->fifo->execute(); } qr->inprog = false; } void qrunner::flush(void) { execute(pfd[0], this); } fldigi-3.21.80/src/thor/0000775000175000017500000000000012313333725011673 500000000000000fldigi-3.21.80/src/thor/thorvaricode.cxx0000664000175000017500000001337312313064025015031 00000000000000// ---------------------------------------------------------------------------- // // thorvaricode.cxx -- THOR Varicode // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "mfskvaricode.h" #include "thorvaricode.h" // THOR varicode is an extended set of the IZ8BLY MFSK varicode that uses the // unallocated remaining 12 bit codes for a secondary character set. // Primary character set (same as MFSK) // extended 12 bit codes for secondary characters // 90 used, leaving 10 for possible special use // encoding table static const char *thor_varicode[] = { "101110000000", /* 032 - */ "101110100000", /* 033 - ! */ "101110101000", /* 034 - '"' */ "101110101100", /* 035 - # */ "101110110000", /* 036 - $ */ "101110110100", /* 037 - % */ "101110111000", /* 038 - & */ "101110111100", /* 039 - ' */ "101111000000", /* 040 - ( */ "101111010000", /* 041 - ) */ "101111010100", /* 042 - * */ "101111011000", /* 043 - + */ "101111011100", /* 044 - , */ "101111100000", /* 045 - - */ "101111101000", /* 046 - . */ "101111101100", /* 047 - / */ "101111110000", /* 048 - 0 */ "101111110100", /* 049 - 1 */ "101111111000", /* 050 - 2 */ "101111111100", /* 051 - 3 */ "110000000000", /* 052 - 4 */ "110100000000", /* 053 - 5 */ "110101000000", /* 054 - 6 */ "110101010100", /* 055 - 7 */ "110101011000", /* 056 - 8 */ "110101011100", /* 057 - 9 */ "110101100000", /* 058 - : */ "110101101000", /* 059 - ; */ "110101101100", /* 060 - < */ "110101110000", /* 061 - = */ "110101110100", /* 062 - > */ "110101111000", /* 063 - ? */ "110101111100", /* 064 - @ */ "110110000000", /* 065 - A */ "110110100000", /* 066 - B */ "110110101000", /* 067 - C */ "110110101100", /* 068 - D */ "110110110000", /* 069 - E */ "110110110100", /* 070 - F */ "110110111000", /* 071 - G */ "110110111100", /* 072 - H */ "110111000000", /* 073 - I */ "110111010000", /* 074 - J */ "110111010100", /* 075 - K */ "110111011000", /* 076 - L */ "110111011100", /* 077 - M */ "110111100000", /* 078 - N */ "110111101000", /* 079 - O */ "110111101100", /* 080 - P */ "110111110000", /* 081 - Q */ "110111110100", /* 082 - R */ "110111111000", /* 083 - S */ "110111111100", /* 084 - T */ "111000000000", /* 085 - U */ "111010000000", /* 086 - V */ "111010100000", /* 087 - W */ "111010101100", /* 088 - X */ "111010110000", /* 089 - Y */ "111010110100", /* 090 - Z */ "111010111000", /* 091 - [ */ "111010111100", /* 092 - \ */ "111011000000", /* 093 - ] */ "111011010000", /* 094 - ^ */ "111011010100", /* 095 - _ */ "111011011000", /* 096 - ` */ "111011011100", /* 097 - a */ "111011100000", /* 098 - b */ "111011101000", /* 099 - c */ "111011101100", /* 100 - d */ "111011110000", /* 101 - e */ "111011110100", /* 102 - f */ "111011111000", /* 103 - g */ "111011111100", /* 104 - h */ "111100000000", /* 105 - i */ "111101000000", /* 106 - j */ "111101010000", /* 107 - k */ "111101010100", /* 108 - l */ "111101011000", /* 109 - m */ "111101011100", /* 110 - n */ "111101100000", /* 111 - o */ "111101101000", /* 112 - p */ "111101101100", /* 113 - q */ "111101110000", /* 114 - r */ "111101110100", /* 115 - s */ "111101111000", /* 116 - t */ "111101111100", /* 117 - u */ "111110000000", /* 118 - v */ "111110100000", /* 119 - w */ "111110101000", /* 120 - x */ "111110101100", /* 121 - y */ "111110110000" /* 122 - z */ }; // unused 12 bit varicodes /* static char *unused[] = { "111110110100", "111110111000", "111110111100", "111111000000", "111111010100", "111111011000", "111111011100", "111111100000", "111111101000", "111111101100", "111111110000", "111111110100", "111111111100" }; */ // decoding table static const unsigned int thor_varidecode[] = { 0xB80, 0xBA0, 0xBA8, 0xBAC, 0xBB0, 0xBB4, 0xBB8, 0xBBC, 0xBC0, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE8, 0xBEC, 0xBF0, 0xBF4, 0xBF8, 0xBFC, 0xC00, 0xD00, 0xD40, 0xD54, 0xD58, 0xD5C, 0xD60, 0xD68, 0xD6C, 0xD70, 0xD74, 0xD78, 0xD7C, 0xD80, 0xDA0, 0xDA8, 0xDAC, 0xDB0, 0xDB4, 0xDB8, 0xDBC, 0xDC0, 0xDD0, 0xDD4, 0xDD8, 0xDDC, 0xDE0, 0xDE8, 0xDEC, 0xDF0, 0xDF4, 0xDF8, 0xDFC, 0xE00, 0xE80, 0xEA0, 0xEAC, 0xEB0, 0xEB4, 0xEB8, 0xEBC, 0xEC0, 0xED0, 0xED4, 0xED8, 0xEDC, 0xEE0, 0xEE8, 0xEEC, 0xEF0, 0xEF4, 0xEF8, 0xEFC, 0xF00, 0xF40, 0xF50, 0xF54, 0xF58, 0xF5C, 0xF60, 0xF68, 0xF6C, 0xF70, 0xF74, 0xF78, 0xF7C, 0xF80, 0xFA0, 0xFA8, 0xFAC, 0xFB0 }; static int limit = sizeof(thor_varidecode)/sizeof(unsigned int); const char *thorvarienc(int c, int sec) { if (sec == 0) return varienc(c); // mfsk varicode else if (c >= ' ' && c <= 'z') return thor_varicode[c - ' ']; return varienc(0); // return code for NULL if not in tables } int thorvaridec(unsigned int symbol) { int i; if (symbol < 0xB80) return varidec(symbol); // find in the MFSK decode table for (i = 0; i < limit; i++) if (symbol == thor_varidecode[i]) return (' ' + i + 0x100); // found in the extended decode table return -1; // not found } fldigi-3.21.80/src/thor/thor.cxx0000664000175000017500000006251112313064025013312 00000000000000// ---------------------------------------------------------------------------- // thor.cxx -- thor modem // // Copyright (C) 2008-2012 // David Freese // John Douyere // John Phelps // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "confdialog.h" #include "status.h" #include "thor.h" #include "trx.h" #include "fl_digi.h" #include "filters.h" #include "misc.h" #include "sound.h" #include "thorvaricode.h" #include "ascii.h" #include "main.h" #include "debug.h" // Enable to enable profiling output for the soft-decision decoder #define SOFTPROFILE false //#define SOFTPROFILE true using namespace std; char thormsg[80]; char confidence[80]; void thor::tx_init(SoundBase *sc) { scard = sc; txstate = TX_STATE_PREAMBLE; txprevtone = 0; bitstate = 0; counter = 0; txphase = 0; videoText(); strSecXmtText = progdefaults.THORsecText; if (strSecXmtText.length() == 0) strSecXmtText = "fldigi "PACKAGE_VERSION" "; cptr = 0; } void thor::rx_init() { synccounter = 0; symcounter = 0; met1 = 0.0; met2 = 0.0; counter = 0; phase[0] = 0.0; currmag = prev1mag = prev2mag = 0.0; // avgsig = 1e-20; for (int i = 0; i < THORMAXFFTS; i++) phase[i+1] = 0.0; put_MODEstatus(mode); put_sec_char(0); syncfilter->reset(); datashreg = 1; sig = noise = 6; fec_confidence = 0; s2n_valid = false; } void thor::reset_filters() { //LOG_INFO("%s", "Reset filters"); // fft filter at first IF frequency if (fft) fft->create_filter( (THORFIRSTIF - 0.5 * progdefaults.THOR_BW * bandwidth) / samplerate, (THORFIRSTIF + 0.5 * progdefaults.THOR_BW * bandwidth)/ samplerate ); for (int i = 0; i < THORMAXFFTS; i++) if (binsfft[i]) { delete binsfft[i]; binsfft[i] = 0; } if (slowcpu) { extones = 4; paths = THORSLOWPATHS; } else { extones = THORNUMTONES / 2; paths = THORFASTPATHS; } lotone = basetone - extones * doublespaced; hitone = basetone + THORNUMTONES * doublespaced + extones * doublespaced; numbins = hitone - lotone; //LOG_INFO("MAX ARRAY SIZE %d, paths %d, numbins %d, array_size %d", MAXPATHS, paths, numbins, numbins * paths); for (int i = 0; i < paths; i++) { if (binsfft[i]) delete binsfft[i]; binsfft[i] = new sfft (symlen, lotone, hitone); } //LOG_INFO("binsfft(%d) initialized", paths); for (int i = 0; i < THORSCOPESIZE; i++) { if (vidfilter[i]) delete vidfilter[i]; vidfilter[i] = new Cmovavg(16); } //LOG_INFO("vidfilter(%d) initialized", THORSCOPESIZE); if (syncfilter) delete syncfilter; syncfilter = new Cmovavg(8); //LOG_INFO("%s", "syncfilter initialized"); filter_reset = false; } void thor::restart() { filter_reset = true; } void thor::init() { //LOG_INFO("%s", "thor::init"); modem::init(); // reset_filters(); rx_init(); set_scope_mode(Digiscope::DOMDATA); } thor::~thor() { if (hilbert) delete hilbert; for (int i = 0; i < THORMAXFFTS; i++) { if (binsfft[i]) delete binsfft[i]; } for (int i = 0; i < THORSCOPESIZE; i++) { if (vidfilter[i]) delete vidfilter[i]; } if (syncfilter) delete syncfilter; if (pipe) delete [] pipe; if (fft) delete fft; if (Rxinlv) delete Rxinlv; if (Txinlv) delete Txinlv; if (Dec) delete Dec; if (Enc) delete Enc; } thor::thor(trx_mode md) : hilbert(0), fft(0), filter_reset(false) { cap |= CAP_REV; mode = md; int isize = 4; int idepth = 10; flushlength = 4; switch (mode) { // 11.025 kHz modes case MODE_THOR5: symlen = 2048; doublespaced = 2; samplerate = 11025; break; case MODE_THOR11: symlen = 1024; doublespaced = 1; samplerate = 11025; break; case MODE_THOR22: symlen = 512; doublespaced = 1; samplerate = 11025; break; // 8kHz modes case MODE_THOR4: symlen = 2048; doublespaced = 2; samplerate = 8000; break; case MODE_THOR8: symlen = 1024; doublespaced = 2; samplerate = 8000; break; case MODE_THOR25x4: symlen = 320; doublespaced = 4; samplerate = 8000; idepth = 50; // 2 sec interleave flushlength = 40; break; case MODE_THOR50x1: symlen = 160; doublespaced = 1; samplerate = 8000; idepth = 50; // 1 sec interleave flushlength = 40; break; case MODE_THOR50x2: symlen = 160; doublespaced = 2; samplerate = 8000; idepth = 50; // 1 sec interleave flushlength = 40; break; case MODE_THOR100: symlen = 80; doublespaced = 1; samplerate = 8000; idepth = 50; // 0.5 sec interleave flushlength = 40; break; case MODE_THOR16: default: symlen = 512; doublespaced = 1; samplerate = 8000; } tonespacing = 1.0 * samplerate * doublespaced / symlen; bandwidth = THORNUMTONES * tonespacing; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); // fft filter at first if frequency fft = new fftfilt( (THORFIRSTIF - 0.5 * progdefaults.THOR_BW * bandwidth) / samplerate, (THORFIRSTIF + 0.5 * progdefaults.THOR_BW * bandwidth)/ samplerate, 1024 ); basetone = (int)floor(THORBASEFREQ * symlen / samplerate + 0.5); slowcpu = progdefaults.slowcpu; for (int i = 0; i < THORMAXFFTS; i++) binsfft[i] = 0; for (int i = 0; i < THORSCOPESIZE; i++) vidfilter[i] = 0; syncfilter = 0; reset_filters(); twosym = 2 * symlen; pipe = new THORrxpipe[twosym]; scopedata.alloc(THORSCOPESIZE); videodata.alloc(THORMAXFFTS * numbins ); pipeptr = 0; symcounter = 0; metric = 0.0; fragmentsize = symlen; s2n = 0.0; prev1symbol = prev2symbol = 0; prev1symbol = prev2symbol = 0; if ( mode == MODE_THOR100 || mode == MODE_THOR50x1 || mode == MODE_THOR50x2 || mode == MODE_THOR25x4 ) { Enc = new encoder (THOR_K15, K15_POLY1, K15_POLY2); Dec = new viterbi (THOR_K15, K15_POLY1, K15_POLY2); Dec->settraceback (PATHMEM-1); // Long constraint length codes require longer traceback } else { Enc = new encoder (THOR_K, THOR_POLY1, THOR_POLY2); Dec = new viterbi (THOR_K, THOR_POLY1, THOR_POLY2); Dec->settraceback (45); } Txinlv = new interleave (isize, idepth, INTERLEAVE_FWD); Rxinlv = new interleave (isize, idepth, INTERLEAVE_REV); Dec->setchunksize (1); bitstate = 0; symbolpair[0] = symbolpair[1] = 0; datashreg = 1; init(); } //===================================================================== // rx modules cmplx thor::mixer(int n, const cmplx& in) { double f; // first IF mixer (n == 0) plus // THORMAXFFTS mixers are supported each separated by 1/THORMAXFFTS bin size // n == 1, 2, 3, 4 ... THORMAXFFTS if (n == 0) f = frequency - THORFIRSTIF; else f = THORFIRSTIF - THORBASEFREQ - bandwidth*0.5 + (samplerate / symlen) * ( (double)n / paths); double phase_n = phase[n]; cmplx z( cos(phase_n), sin(phase_n) ); z *= in; phase_n -= TWOPI * f / samplerate; if (phase_n > M_PI) phase_n -= TWOPI; else if (phase_n < M_PI) phase_n += TWOPI; phase[n] = phase_n; return z; } void thor::s2nreport(void) { modem::s2nreport(); s2n_valid = false; } void thor::recvchar(int c) { if (c == -1) return; if (c & 0x100) put_sec_char(c & 0xFF); else { put_rx_char(c & 0xFF); if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { if (((c & 0xFF) == SOH) && !s2n_valid) { // starts collecting s2n from first SOH in stream (since start of RX) s2n_valid = true; s2n_sum = s2n_sum2 = s2n_ncount = 0.0; } if (s2n_valid) { s2n_sum += s2n_metric; s2n_sum2 += (s2n_metric * s2n_metric); s2n_ncount++; if ((c & 0xFF) == EOT) s2nreport(); } } } } //============================================================================= // Receive //============================================================================= void thor::decodePairs(unsigned char symbol) { int c, ch, met; symbolpair[0] = symbolpair[1]; symbolpair[1] = symbol; symcounter = symcounter ? 0 : 1; if (symcounter) return; c = Dec->decode (symbolpair, &met); if (c == -1) return; if(met < 255 / 2) fec_confidence -= 2 + fec_confidence / 2; else fec_confidence += 2; if (fec_confidence < 0) fec_confidence = 0; if (fec_confidence > 100) fec_confidence = 100; if (progStatus.sqlonoff && metric < progStatus.sldrSquelchValue) return; datashreg = (datashreg << 1) | !!c; if ((datashreg & 7) == 1) { ch = thorvaridec(datashreg >> 1); recvchar(ch); //LOG_INFO("thorvaridec %X = %d", datashreg >> 1, ch); datashreg = 1; } } void thor::decodesymbol() { int c; double fdiff;//, softmag; unsigned char symbols[4]; bool outofrange = false; // Decode the IFK+ sequence, which results in a single nibble fdiff = currsymbol - prev1symbol; if (reverse) fdiff = -fdiff; fdiff /= paths; fdiff /= doublespaced; if (fabs(fdiff) > 17) outofrange = true; c = (int)floor(fdiff + .5); { if (progdefaults.THOR_PREAMBLE) { if ( preambledetect(c) ) { softflushrx(); // Flush the soft rx pipeline with punctures (interleaver & viterbi decoder) return; } } } c -= 2; if (c < 0) c += THORNUMTONES; if (staticburst == true || outofrange == true) // puncture the code symbols[3] = symbols[2] = symbols[1] = symbols[0] = 128; else { symbols[3] = (c & 1) == 1 ? 255 : 0; c /= 2; symbols[2] = (c & 1) == 1 ? 255 : 0; c /= 2; symbols[1] = (c & 1) == 1 ? 255 : 0; c /= 2; symbols[0] = (c & 1) == 1 ? 255 : 0; c /= 2; } Rxinlv->symbols(symbols); for (int i = 0; i < 4; i++) decodePairs(symbols[i]); } void thor::softdecodesymbol() { unsigned char one, zero; int c, nextmag=127, rawdoppler=0; static int lastc=0, lastmag=0, nowmag=0, prev1rawdoppler=0; static double lastdoppler=0, nowdoppler=0; unsigned char lastsymbols[4]; bool outofrange=false; double fdiff = currsymbol - prev1symbol; if (reverse) fdiff = -fdiff; fdiff /= paths; fdiff /= doublespaced; c = (int)floor(fdiff + .5); { if (c < -16 || 0 == c || 1 == c || c > 17) outofrange = true; // Out of the range of the function thor::sendsymbol() if (progdefaults.THOR_PREAMBLE) { if ( preambledetect(c) ) { softflushrx(); // Flush the soft rx pipeline with punctures (interleaver & viterbi decoder) lastmag = 0; return; } } #if SOFTPROFILE LOG_INFO("Symbol: %3d; DELTAf: +%3d",currsymbol, c); #endif } c -= 2; if (c < 0) c += THORNUMTONES; // Calculate soft-doppler / frequency-error of the symbol // For a perfect & undistorted symbol, rawdoppler will == 0 (be a perfect multiple of paths*doublespaced) rawdoppler = (currsymbol - prev1symbol) % (paths * doublespaced) ; #if SOFTPROFILE LOG_INFO("Raw Doppler: %3d", rawdoppler); #endif if ( 0 == rawdoppler) nowdoppler = 1.0f; // Perfect symbol: assign probability = 100% else { // Detect modem "de-sync + immediate re-sync" events and reverse the incurred soft-penalty // Probability of these events increases as baudrate increases if ( -1 * prev1rawdoppler == rawdoppler) { rawdoppler = 0; lastdoppler = 1.0f; } // calculate the nowdoppler soft-value as a probability >= 50% // centering the "50% confidence point" directly between two symbols. if ( abs(rawdoppler) <= paths * doublespaced / 2 ) nowdoppler = 1.0 - ((1.0 / (paths * doublespaced)) * abs(rawdoppler)) ; else nowdoppler = 0.0 + ((1.0 / (paths * doublespaced)) * abs(rawdoppler)) ; } prev1rawdoppler = rawdoppler; // save raw-value for comparison on next run #if SOFTPROFILE LOG_INFO("Doppler Confidence: %3.1f", nowdoppler); #endif // Since the THOR modem is differential, when an outofrange error occurs // there are 2 possibilities: // . either previous (reference) symbol or current with a 50% // probability of each being the culprit. // Either way, the current symbol is lost, puncture it. There is also a // 50% probability the next symbol will have an error if (outofrange){ lastmag /= 2; nowmag = 0; nextmag /= 2; } // O is puncture/null-symbol from softdecode if (0 == currsymbol) { nowmag = 0; nextmag = 0; } // puncture while squelched if (progStatus.sqlonoff && metric < progStatus.sldrSquelchValue) nowmag = 0; // One in 16 chance the correct reference tone chosen in staticburst if (staticburst){ nowmag /= 16; nextmag /= 16; } // Apply the soft-doppler probability to the previous symbol's soft-magnitude lastmag *= lastdoppler; if (lastmag <= 0) { // puncture one = 128; zero = 128; } else if (lastmag > 127) { // limit one = 255; zero = 0; } else { // Calculate soft bits one = static_cast( lastmag+128 ); // never > 255 zero = static_cast( 127-lastmag ); // never < 0 } #if SOFTPROFILE if (outofrange) LOG_INFO("%s","outofrange"); if (staticburst) LOG_INFO("%s","staticburst"); LOG_INFO("next mag %.3d | now mag %.3d | last mag %.3d \n",nextmag, nowmag, lastmag); #endif lastsymbols[3] = (lastc & 1) == 1 ? one : zero ; lastc /= 2; lastsymbols[2] = (lastc & 1) == 1 ? one : zero ; lastc /= 2; lastsymbols[1] = (lastc & 1) == 1 ? one : zero ; lastc /= 2; lastsymbols[0] = (lastc & 1) == 1 ? one : zero ; lastc /= 2; Rxinlv->symbols(lastsymbols); for (int i = 0; i < 4; i++) decodePairs(lastsymbols[i]); // Since modem is differential, wait until next symbol (to detect errors) // then decode. lastc = c; lastmag = nowmag; nowmag = nextmag; lastdoppler = nowdoppler; } int thor::harddecode() { double x, max = 0.0; int symbol = 0; double avg = 0.0; static bool cwi[MAXPATHS]; //[paths * numbins]; double cwmag; for (int i = 0; i < MAXPATHS; i++) cwi[i] = false; for (int i = 0; i < paths * numbins; i++) avg += abs(pipe[pipeptr].vector[i]); avg /= (paths * numbins); if (avg < 1e-10) avg = 1e-10; int numtests = 10; int count = 0; for (int i = 0; i < paths * numbins; i++) { cwmag = 0.0; count = 0; for (int j = 1; j <= numtests; j++) { int p = pipeptr - j; if (p < 0) p += twosym; cwmag = abs(pipe[j].vector[i])/numtests; if (cwmag >= 50.0 * (1.0 - progdefaults.ThorCWI) * avg) count++; } cwi[i] = (count == numtests); } for (int i = 0; i < paths * numbins ; i++) { if (cwi[i] == false) { x = abs(pipe[pipeptr].vector[i]); if (x > max) { max = x; symbol = i; } } else LOG_DEBUG("cwi detected in bin %d", i); } staticburst = (max / avg < 1.2); return symbol; } int thor::softdecode() { static bool lastCWI[MAXPATHS] = {false}; static bool nextCWI[MAXPATHS] = {false}; static const int SoftBailout=6; // Max number of attempts to get a valid symbol double x, max = 0.0, avg = 0.0; int symbol = 0; int avgcount = 0; int soft_symbol_trycount=0; int lowest_tone = 0; int highest_tone = paths * numbins; // Clear nextCWI bool array for this run for (int i = 0; i < MAXPATHS; i++) nextCWI[i] = false; // for (int i = lowest_tone; i < highest_tone; i++) nextCWI[i] = false; // Allow for case where symbol == prev2symbol (before calculating signal average...) if (prev2symbol && (prev2symbol < MAXPATHS - 1)) // array bounds checking lastCWI[prev2symbol-1] = lastCWI[prev2symbol] = lastCWI[prev2symbol+1] = false; // Constrict the tone set further so CWI detect & set does not go out of intended range lowest_tone += 1; highest_tone -= 1; // Calculate signal average, ignoring CWI signals for (int i = lowest_tone; i < highest_tone; i++) { if ( !lastCWI[i] ) { avg += abs(pipe[pipeptr].vector[i]); avgcount++; } } avg /= avgcount; if (avg < 1e-10) avg = 1e-10; // Run symbol-decoder until a non-CWI && non-Repeated symbol is selected do { soft_symbol_trycount++; max = 0.0; for (int i = lowest_tone; i < highest_tone; i++) { x = abs(pipe[pipeptr].vector[i]); if ( x > max && !nextCWI[i-1] && !nextCWI[i] && !nextCWI[i+1] ) { max = x; symbol = i; } } if (symbol && (symbol < MAXPATHS - 1)) { // array bounds checking // detect repeated symbols (an invalid pattern for IFK+ modems) if ( abs(prev1symbol - symbol) < paths ) { nextCWI[symbol-1] = nextCWI[symbol] = nextCWI[symbol+1] = true; } // Update the next CWI mask if the tone from last-run persists else if ( lastCWI[symbol-1] || lastCWI[symbol] || lastCWI[symbol+1] ) { nextCWI[symbol-1] = nextCWI[symbol] = nextCWI[symbol+1] = true; } } } while ( nextCWI[symbol] && soft_symbol_trycount < SoftBailout ); // Run while the detected symbol has been identified as CWI (alt: bailout after 6 trys) // Copy the newly-detected CWI mask to the static lastCWI array for use on next function call for (int i = lowest_tone-1; i < highest_tone+1; i++) lastCWI[i] = nextCWI[i]; staticburst = (max / avg < 1.2); // Return a NULL / Puncture symbol if a bailout occured if (soft_symbol_trycount >= SoftBailout) return 0; else return symbol; } bool thor::preambledetect(int c) { static int preamblecheck=0, twocount=0; static bool neg16seen=false; if (twocount > 14 ) twocount = 0; if (-16 == c && twocount > 2 ) neg16seen = true; // 2 does not reset the neg16seen bool else if (2 != c) neg16seen = false; else if (2 == c) twocount ++; // -16 does not reset the twos counter if (-16 != c && 2 != c) if (twocount > 1) twocount -= 2; #if SOFTPROFILE LOG_INFO("[2count:pcheck] [%d:%d]",twocount, preamblecheck); #endif if ( twocount > 4 && neg16seen ){ if ( ++preamblecheck > 4 ) return true; } else preamblecheck = 0; return false; } // Flush the interleaver and convolutional decoder with punctures void thor::softflushrx() { #if SOFTPROFILE LOG_INFO("%s", "softflushrx()"); #endif unsigned char puncture[2], flushsymbols[4]; puncture[0]=128; puncture[1]=128; for (int i = 0; i < 4; i++) flushsymbols[i] = 128; // flush interleaver with punctured symbols for(int i = 0; i < 90; i++) Rxinlv->symbols(flushsymbols); // flush viterbi with puncture soft-bits for (int j = 0; j < 128; j++) Dec->decode (puncture, NULL); } void thor::update_syncscope() { double max = 0, min = 1e6, range, mag; memset(videodata, 0, paths * numbins * sizeof(double)); //LOG_INFO("%s", "cleared videodata"); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) { for (int i = 0; i < paths * numbins; i++ ) { mag = abs(pipe[pipeptr].vector[i]); if (max < mag) max = mag; if (min > mag) min = mag; } range = max - min; for (int i = 0; i < paths * numbins; i++ ) { if (range > 2) { mag = (abs(pipe[pipeptr].vector[i]) - min) / range + 0.0001; mag = 1 + 2 * log10(mag); if (mag < 0) mag = 0; } else mag = 0; videodata[(i + paths * numbins / 2)/2] = 255*mag; } } set_video(videodata, paths * numbins, false); videodata.next(); memset(scopedata, 0, THORSCOPESIZE * sizeof(double)); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) { for (unsigned int i = 0, j = 0; i < THORSCOPESIZE; i++) { j = (pipeptr + i * twosym / THORSCOPESIZE + 1) % (twosym); scopedata[i] = vidfilter[i]->run(abs(pipe[j].vector[prev1symbol])); } } set_scope(scopedata, THORSCOPESIZE); scopedata.next(); } void thor::synchronize() { double syn = -1; double val, max = 0.0; if (staticburst == true) return; if (currsymbol == prev1symbol) return; if (prev1symbol == prev2symbol) return; for (unsigned int i = 0, j = pipeptr; i < twosym; i++) { val = abs(pipe[j].vector[prev1symbol]); if (val > max) { max = val; syn = i; } j = (j + 1) % twosym; } syn = syncfilter->run(syn); synccounter += (int) floor(1.0 * (syn - symlen) / THORNUMTONES + 0.5); update_syncscope(); } void thor::eval_s2n() { double s = abs(pipe[pipeptr].vector[currsymbol]); double n = (THORNUMTONES - 1) * abs( pipe[(pipeptr + symlen) % twosym].vector[currsymbol]); sig = decayavg( sig, s, s - sig > 0 ? 4 : 20); noise = decayavg( noise, n, 64); if (noise) s2n = 20*log10(sig / noise); else s2n = 0; // To partially offset the increase of noise by (THORNUMTONES -1) // in the noise calculation above, // add 15*log10(THORNUMTONES -1) = 18.4, and multiply by 6 metric = 6 * (s2n + 18.4); if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { // s2n reporting: re-calibrate s2n_metric = metric * 2.5 - 70; s2n_metric = CLAMP(s2n_metric, 0.0, 100.0); } metric = metric < 0 ? 0 : metric > 100 ? 100 : metric; display_metric(metric); snprintf(thormsg, sizeof(thormsg), "s/n %3.0f dB", s2n ); put_Status1(thormsg); // Scale FEC indicatior to reduce erratic / jumpy / unreadable display in GUI int scalefec; if (fec_confidence++ > 90) scalefec = 100; else if (fec_confidence++ > 60) scalefec = 75; else if (fec_confidence++ > 40) scalefec = 50; else if (fec_confidence++ >= 20) scalefec = 25; else if ( fec_confidence > 9) scalefec = 10; else scalefec = 0; // Else just round to 0. snprintf(confidence, sizeof(confidence), "FEC: %3.1d%%", scalefec); put_Status2(confidence); } int thor::rx_process(const double *buf, int len) { cmplx zref, *zp; cmplx zarray[1]; int n; if (slowcpu != progdefaults.slowcpu) { slowcpu = progdefaults.slowcpu; filter_reset = true; } if (filter_reset) reset_filters(); while (len) { // create analytic signal at first IF zref = cmplx( *buf, *buf ); buf++; hilbert->run(zref, zref); zref = mixer(0, zref); if (progdefaults.THOR_FILTER && fft) { // filter using fft convolution n = fft->run(zref, &zp); } else { zarray[0] = zref; zp = zarray; n = 1; } if (n) { for (int i = 0; i < n; i++) { cmplx * pipe_pipeptr_vector = pipe[pipeptr].vector ; const cmplx zp_i = zp[i]; // process THORMAXFFTS sets of sliding FFTs spaced at 1/THORMAXFFTS bin intervals each of which // is a matched filter for the current symbol length for (int k = 0; k < paths; k++) { // shift in frequency to base band for the sliding DFTs const cmplx z = mixer(k + 1, zp_i ); // copy current vector to the pipe interleaving the FFT vectors binsfft[k]->run(z, pipe_pipeptr_vector + k, paths ); } if (--synccounter <= 0) { synccounter = symlen; if (progdefaults.THOR_SOFTSYMBOLS) currsymbol = softdecode(); else currsymbol = harddecode(); currmag = abs(pipe_pipeptr_vector[currsymbol]); eval_s2n(); if (progdefaults.THOR_SOFTBITS) softdecodesymbol(); else decodesymbol(); synchronize(); prev2symbol = prev1symbol; prev1symbol = currsymbol; prev2mag = prev1mag; prev1mag = currmag; } pipeptr++; if (pipeptr >= twosym) pipeptr = 0; } } --len; } return 0; } //============================================================================= // Transmit methods //============================================================================= int thor::get_secondary_char() { char chr; if (cptr >= strSecXmtText.length()) cptr = 0; chr = strSecXmtText[cptr++]; put_sec_char( chr ); return chr; } void thor::sendtone(int tone, int duration) { double f, phaseincr; f = (tone + 0.5) * tonespacing + get_txfreq_woffset() - bandwidth / 2; phaseincr = TWOPI * f / samplerate; for (int j = 0; j < duration; j++) { for (int i = 0; i < symlen; i++) { outbuf[i] = cos(txphase); txphase -= phaseincr; if (txphase > M_PI) txphase -= TWOPI; else if (txphase < M_PI) txphase += TWOPI; } ModulateXmtr(outbuf, symlen); } } void thor::sendsymbol(int sym) { cmplx z; int tone; tone = (txprevtone + 2 + sym) % THORNUMTONES; txprevtone = tone; if (reverse) tone = (THORNUMTONES - 1) - tone; sendtone(tone, 1); } // Send THOR FEC varicode void thor::sendchar(unsigned char c, int secondary) { const char *code; code = thorvarienc(c, secondary); while (*code) { int data = Enc->encode(*code++ - '0'); for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); bitstate++; if (bitstate == 4) { Txinlv->bits(&bitshreg); sendsymbol(bitshreg); bitstate = 0; bitshreg = 0; } } } if (!secondary) put_echo_char(c); } void thor::sendidle() { sendchar(0, 0); // } void thor::sendsecondary() { int c = get_secondary_char(); sendchar(c & 0xFF, 1); } void thor::Clearbits() { int data = Enc->encode(0); for (int k = 0; k < 1400; k++) { for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); bitstate++; if (bitstate == 4) { Txinlv->bits(&bitshreg); bitstate = 0; bitshreg = 0; } } } } void thor::flushtx() { // flush the varicode decoder at the other end // flush the convolutional encoder and interleaver for (int i = 0; i < flushlength; i++) sendidle(); bitstate = 0; } int thor::tx_process() { int i = 0; switch (txstate) { case TX_STATE_PREAMBLE: Clearbits(); for (int j = 0; j < 16; j++) sendsymbol(0); sendidle(); txstate = TX_STATE_START; break; case TX_STATE_START: sendchar('\r', 0); sendchar(2, 0); // STX sendchar('\r', 0); txstate = TX_STATE_DATA; break; case TX_STATE_DATA: i = get_tx_char(); if (i == GET_TX_CHAR_NODATA) sendsecondary(); else if (i == GET_TX_CHAR_ETX) txstate = TX_STATE_END; else sendchar(i, 0); if (stopflag) txstate = TX_STATE_END; break; case TX_STATE_END: sendchar('\r', 0); sendchar(4, 0); // EOT sendchar('\r', 0); txstate = TX_STATE_FLUSH; break; case TX_STATE_FLUSH: flushtx(); cwid(); return -1; } return 0; } fldigi-3.21.80/src/dominoex/0000775000175000017500000000000012313333725012541 500000000000000fldigi-3.21.80/src/dominoex/dominoex.cxx0000664000175000017500000005067412313064025015035 00000000000000// ---------------------------------------------------------------------------- // // dominoex.cxx -- DominoEX modem // // Copyright (C) 2008-20012 // David Freese // Hamish Moffatt // John Phelps // // based on code in gmfsk // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "confdialog.h" #include "status.h" #include "dominoex.h" #include "trx.h" #include "fl_digi.h" #include "filters.h" #include "misc.h" #include "sound.h" #include "mfskvaricode.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_MODEM); using namespace std; char dommsg[80]; static map mupsksec2pri; bool usingFEC = false; void dominoex::tx_init(SoundBase *sc) { scard = sc; txstate = TX_STATE_PREAMBLE; txprevtone = 0; Mu_bitstate = 0; counter = 0; txphase = 0; strSecXmtText = progdefaults.secText; if (strSecXmtText.length() == 0) strSecXmtText = "fldigi "PACKAGE_VERSION" "; videoText(); } void dominoex::rx_init() { synccounter = 0; symcounter = 0; Mu_symcounter = 0; met1 = 0.0; met2 = 0.0; counter = 0; phase[0] = 0.0; for (int i = 0; i < MAXFFTS; i++) phase[i+1] = 0.0; put_MODEstatus(mode); put_sec_char(0); syncfilter->reset(); Mu_datashreg = 1; staticburst = false; sig = noise = 6; } void dominoex::reset_filters() { // fft filter at first IF frequency fft->create_filter( (FIRSTIF - 0.5 * progdefaults.DOMINOEX_BW * bandwidth) / samplerate, (FIRSTIF + 0.5 * progdefaults.DOMINOEX_BW * bandwidth)/ samplerate ); for (int i = 0; i < MAXFFTS; i++) { if (binsfft[i]) delete binsfft[i]; binsfft[i] = 0; } if (slowcpu) { extones = 4; paths = 3; } else { extones = NUMTONES / 2; paths = 5; } lotone = basetone - extones * doublespaced; hitone = basetone + NUMTONES * doublespaced + extones * doublespaced; numbins = hitone - lotone; for (int i = 0; i < paths; i++)//MAXFFTS; i++) binsfft[i] = new sfft (symlen, lotone, hitone); filter_reset = false; } void dominoex::restart() { filter_reset = true; } void dominoex::init() { if (mupsksec2pri.empty()) MuPsk_sec2pri_init(); modem::init(); // reset_filters(); rx_init(); set_scope_mode(Digiscope::DOMDATA); } void dominoex::MuPsk_sec2pri_init(void) { int chars[] = { 'A', 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, // À, Ã, Â, Ã, Ä, Ã… 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, -1, // à, á, â, ã, ä, Ã¥ 'B', 0xdf, -1, // ß 'C', 0xc7, 0xe7, 0xa9, -1, // Ç, ç, ©, 'D', 0xd0, 0xb0, -1, // Ã, ° 'E', 0xc6, 0xe6, 0xc8, 0xc9, 0xca, 0xcb, // Æ, æ, È, É, Ê, Ë 0xe8, 0xe9, 0xea, 0xeb, -1, // è, é, ê, ë 'F', 0x192, -1, // Æ’ 'I', 0xcc, 0xcd, 0xce, 0xcf, 0xec, 0xed, // ÃŒ, Ã, ÃŽ, Ã, ì, í 0xee, 0xef, 0xa1, -1, // î, ï, ¡ 'L', 0xa3, -1, // £ 'N', 0xd1, 0xf1, -1, // Ñ, ñ 'O', 0xf4, 0xf6, 0xf2, 0xd6, 0xf3, 0xd3, // ô, ö, ò, Ö, ó, Ó 0xd4, 0xd2, 0xf5, 0xd5, -1, // Ô, Ã’, õ, Õ 'R', 0xae, -1, // ® 'U', 0xd9, 0xda, 0xdb, 0xdc, 0xf9, 0xfa, // Ù, Ú, Û, Ü, ù, ú 0xfb, 0xfc, -1, // û, ü 'X', 0xd7, -1, // × 'Y', 0xff, 0xfd, 0xdd, -1, // ÿ, ý, à '0', 0xd8, -1, // Ø '1', 0xb9, -1, // ¹ '2', 0xb2, -1, // ² '3', 0xb3, -1, // ³ '?', 0xbf, -1, // ¿ '!', 0xa1, -1, // ¡ '<', 0xab, -1, // « '>', 0xbb, -1, // » '{', '(', -1, '}', ')', -1, '|', '\\' }; int c = chars[0]; for (size_t i = 1; i < sizeof(chars)/sizeof(*chars); i++) { if (chars[i] != -1) mupsksec2pri[chars[i]] = c; else c = chars[++i]; } } dominoex::~dominoex() { if (hilbert) delete hilbert; for (int i = 0; i < MAXFFTS; i++) { if (binsfft[i]) delete binsfft[i]; binsfft[i] = 0; } for (int i = 0; i < SCOPESIZE; i++) { if (vidfilter[i]) delete vidfilter[i]; } if (syncfilter) delete syncfilter; if (pipe) delete [] pipe; if (fft) delete fft; if (MuPskRxinlv) delete MuPskRxinlv; if (MuPskTxinlv) delete MuPskTxinlv; if (MuPskDec) delete MuPskDec; if (MuPskEnc) delete MuPskEnc; } dominoex::dominoex(trx_mode md) { cap |= CAP_REV; mode = md; switch (mode) { // 11.025 kHz modes case MODE_DOMINOEX5: symlen = 2048; doublespaced = 2; samplerate = 11025; break; case MODE_DOMINOEX11: symlen = 1024; doublespaced = 1; samplerate = 11025; break; case MODE_DOMINOEX22: symlen = 512; doublespaced = 1; samplerate = 11025; break; // 8kHz modes case MODE_DOMINOEX4: symlen = 2048; doublespaced = 2; samplerate = 8000; break; case MODE_DOMINOEX8: symlen = 1024; doublespaced = 2; samplerate = 8000; break; case MODE_DOMINOEX16: symlen = 512; doublespaced = 1; samplerate = 8000; break; // experimental case MODE_DOMINOEX44: symlen = 256; doublespaced = 2; samplerate = 11025; break; case MODE_DOMINOEX88: symlen = 128; doublespaced = 1; samplerate = 11025; break; default: // EX8 symlen = 1024; doublespaced = 2; samplerate = 8000; } tonespacing = 1.0 * samplerate * doublespaced / symlen; bandwidth = NUMTONES * tonespacing; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); // fft filter at first if frequency fft = new fftfilt( (FIRSTIF - 0.5 * progdefaults.DOMINOEX_BW * bandwidth) / samplerate, (FIRSTIF + 0.5 * progdefaults.DOMINOEX_BW * bandwidth)/ samplerate, 1024 ); basetone = (int)floor(BASEFREQ * symlen / samplerate + 0.5); slowcpu = progdefaults.slowcpu; for (int i = 0; i < MAXFFTS; i++) binsfft[i] = 0; reset_filters(); for (int i = 0; i < SCOPESIZE; i++) vidfilter[i] = new Cmovavg(16); syncfilter = new Cmovavg(16); twosym = 2 * symlen; pipe = new domrxpipe[twosym]; scopedata.alloc(SCOPESIZE); videodata.alloc(MAXFFTS * numbins); pipeptr = 0; symcounter = 0; Mu_symcounter = 0; metric = 0.0; fragmentsize = symlen; s2n = 0.0; prev1symbol = prev2symbol = 0; MuPskEnc = new encoder (K, POLY1, POLY2); MuPskDec = new viterbi (K, POLY1, POLY2); MuPskDec->settraceback (45); MuPskDec->setchunksize (1); MuPskTxinlv = new interleave (4, 4, INTERLEAVE_FWD); MuPskRxinlv = new interleave (4, 4, INTERLEAVE_REV); Mu_bitstate = 0; Mu_symbolpair[0] = Mu_symbolpair[1] = 0; Mu_datashreg = 1; // init(); } //===================================================================== // rx modules cmplx dominoex::mixer(int n, cmplx in) { cmplx z; double f; // first IF mixer (n == 0) plus // MAXFFTS mixers are supported each separated by tonespacing/paths // n == 1, 2, 3, 4 ... MAXFFTS if (n == 0) f = frequency - FIRSTIF; else f = FIRSTIF - BASEFREQ - bandwidth / 2.0 + tonespacing * (1.0 * (n - 1) / paths ); z = cmplx( cos(phase[n]), sin(phase[n])); z = z * in; phase[n] -= TWOPI * f / samplerate; if (phase[n] > M_PI) phase[n] -= TWOPI; else if (phase[n] < M_PI) phase[n] += TWOPI; return z; } void dominoex::recvchar(int c) { if (!progStatus.sqlonoff || metric > progStatus.sldrSquelchValue) { if (c == -1) return; if (c & 0x100) put_sec_char(c & 0xFF); else put_rx_char(c & 0xFF); } } void dominoex::decodeDomino(int c) { int sym, ch; // If the new symbol is the start of a new character (MSB is low), complete the previous character if (!(c & 0x8)) { if (symcounter <= MAX_VARICODE_LEN) { sym = 0; for (int i = 0; i < symcounter; i++) sym |= symbolbuf[i] << (4 * i); ch = dominoex_varidec(sym); if (!progdefaults.DOMINOEX_FEC) if (!staticburst && !outofrange) recvchar(ch); } symcounter = 0; } // Add to the symbol buffer. Position 0 is the newest symbol. for (int i = MAX_VARICODE_LEN-1; i > 0; i--) symbolbuf[i] = symbolbuf[i-1]; symbolbuf[0] = c; // Increment the counter, but clamp at max+1 to avoid overflow symcounter++; if (symcounter > MAX_VARICODE_LEN + 1) symcounter = MAX_VARICODE_LEN + 1; } void dominoex::decodesymbol() { int c; double fdiff; // Decode the IFK+ sequence, which results in a single nibble fdiff = currsymbol - prev1symbol; if (reverse) fdiff = -fdiff; fdiff /= doublespaced; fdiff /= paths; // if (fabs(fdiff) > 17) // outofrange = true; // else outofrange = false; c = (int)floor(fdiff + .5) - 2; if (c < 0) c += NUMTONES; decodeDomino(c); decodeMuPskEX(c); } int dominoex::harddecode() { double x, max = 0.0; int symbol = 0; double avg = 0.0; bool cwi[paths * numbins]; double cwmag; for (int i = 0; i < paths * numbins; i++) avg += abs(pipe[pipeptr].vector[i]); avg /= (paths * numbins); if (avg < 1e-10) avg = 1e-10; int numtests = 10; int count = 0; for (int i = 0; i < paths * numbins; i++) { cwmag = 0.0; count = 0; for (int j = 1; j <= numtests; j++) { int p = pipeptr - j; if (p < 0) p += twosym; cwmag = abs(pipe[j].vector[i])/numtests; if (cwmag >= 50.0 * (1.0 - progdefaults.ThorCWI) * avg) count++; } cwi[i] = (count == numtests); } for (int i = 0; i < (paths * numbins); i++) { if (cwi[i] == false) { x = abs(pipe[pipeptr].vector[i]); avg += x; if (x > max) { max = x; symbol = i; } } } avg /= (paths * numbins); staticburst = (max / avg < 1.2); return symbol; } void dominoex::update_syncscope() { double max = 0, min = 1e6, range, mag; // dom waterfall memset(videodata, 0, (paths * numbins) * sizeof(double)); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) { for (int i = 0; i < (paths * numbins); i++ ) { mag = abs(pipe[pipeptr].vector[i]); if (max < mag) max = mag; if (min > mag) min = mag; } range = max - min; for (int i = 0; i < (paths * numbins); i++ ) { if (range > 2) { mag = (abs(pipe[pipeptr].vector[i]) - min) / range + 0.0001; mag = 1 + 2 * log10(mag); if (mag < 0) mag = 0; } else mag = 0; videodata[(i + paths * numbins / 2)/2] = 255*mag; } } set_video(videodata, (paths * numbins), false); videodata.next(); // set_scope(scopedata, twosym); // 64 data points is sufficient to show the signal progression through the // convolution filter. memset(scopedata, 0, SCOPESIZE * sizeof(double)); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) { for (unsigned int i = 0, j = 0; i < SCOPESIZE; i++) { j = (pipeptr + i * twosym / SCOPESIZE + 1) % (twosym); scopedata[i] = vidfilter[i]->run(abs(pipe[j].vector[prev1symbol])); } } set_scope(scopedata, SCOPESIZE); scopedata.next(); } void dominoex::synchronize() { // int syn = -1; double syn = -1; double val, max = 0.0; if (staticburst == true) return; if (currsymbol == prev1symbol) return; if (prev1symbol == prev2symbol) return; for (unsigned int i = 0, j = pipeptr; i < twosym; i++) { val = abs(pipe[j].vector[prev1symbol]); if (val > max) { max = val; syn = i; } j = (j + 1) % twosym; } syn = syncfilter->run(syn); synccounter += (int) floor(1.0 * (syn - symlen) / NUMTONES + 0.5); update_syncscope(); } void dominoex::eval_s2n() { double s = abs(pipe[pipeptr].vector[currsymbol]); double n = (NUMTONES - 1 ) * abs(pipe[(pipeptr + symlen) % twosym].vector[currsymbol]); sig = decayavg( sig, s, abs( s - sig) > 4 ? 4 : 32); noise = decayavg( noise, n, 64); if (noise) s2n = 20*log10(sig / noise) - 6; else s2n = 0; // metric = 4 * s2n; // To partially offset the increase of noise by (THORNUMTONES -1) // in the noise calculation above, // add 15*log10(THORNUMTONES -1) = 18.4, and multiply by 6 metric = 6 * (s2n + 18.4); metric = metric < 0 ? 0 : metric > 100 ? 100 : metric; display_metric(metric); snprintf(dommsg, sizeof(dommsg), "s/n %3.0f dB", s2n ); put_Status1(dommsg); } int dominoex::rx_process(const double *buf, int len) { cmplx zref, z, *zp; cmplx zarray[1]; int n; if (filter_reset) reset_filters(); if (slowcpu != progdefaults.slowcpu) { slowcpu = progdefaults.slowcpu; reset_filters(); } while (len) { // create analytic signal at first IF zref = cmplx( *buf, *buf ); buf++; hilbert->run(zref, zref); zref = mixer(0, zref); if (progdefaults.DOMINOEX_FILTER) { // filter using fft convolution n = fft->run(zref, &zp); } else { zarray[0] = zref; zp = zarray; n = 1; } if (n) { for (int i = 0; i < n; i++) { // process MAXFFTS sets of sliding FFTs spaced at 1/MAXFFTS bin intervals each of which // is a matched filter for the current symbol length for (int j = 0; j < paths; j++) { // shift in frequency to base band for the sliding DFTs z = mixer(j + 1, zp[i]); // copy current vector to the pipe interleaving the FFT vectors binsfft[j]->run(z, pipe[pipeptr].vector + j, paths ); } if (--synccounter <= 0) { synccounter = symlen; currsymbol = harddecode(); decodesymbol(); synchronize(); // update_syncscope(); eval_s2n(); prev2symbol = prev1symbol; prev1symbol = currsymbol; } pipeptr++; if (pipeptr >= twosym) pipeptr = 0; } } --len; } return 0; } //===================================================================== // dominoex tx modules int dominoex::get_secondary_char() { static unsigned int cptr = 0; char chr; if (cptr >= strSecXmtText.length()) cptr = 0; chr = strSecXmtText[cptr++]; put_sec_char( chr ); return chr; } void dominoex::sendtone(int tone, int duration) { double f, phaseincr; f = (tone + 0.5) * tonespacing + get_txfreq_woffset() - bandwidth / 2.0; phaseincr = TWOPI * f / samplerate; for (int j = 0; j < duration; j++) { for (int i = 0; i < symlen; i++) { outbuf[i] = cos(txphase); txphase -= phaseincr; if (txphase > M_PI) txphase -= TWOPI; else if (txphase < M_PI) txphase += TWOPI; } ModulateXmtr(outbuf, symlen); } } void dominoex::sendsymbol(int sym) { //static int first = 0; cmplx z; int tone; tone = (txprevtone + 2 + sym) % NUMTONES; txprevtone = tone; if (reverse) tone = (NUMTONES - 1) - tone; sendtone(tone, 1); } void dominoex::sendchar(unsigned char c, int secondary) { if (progdefaults.DOMINOEX_FEC) sendMuPskEX(c, secondary); else { unsigned char *code = dominoex_varienc(c, secondary); sendsymbol(code[0]); // Continuation nibbles all have the MSB set for (int sym = 1; sym < 3; sym++) { if (code[sym] & 0x8) sendsymbol(code[sym]); else break; } } if (!secondary) put_echo_char(c); } void dominoex::sendidle() { sendchar(0, 1); // } void dominoex::sendsecondary() { int c = get_secondary_char(); sendchar(c & 0xFF, 1); } void dominoex::flushtx() { // if (progdefaults.DOMINOEX_FEC) // MuPskFlushTx(); // else { // flush the varicode decoder at the receiver end for (int i = 0; i < 4; i++) sendidle(); // } } int dominoex::tx_process() { int i; switch (txstate) { case TX_STATE_PREAMBLE: if (progdefaults.DOMINOEX_FEC) MuPskClearbits(); sendidle(); txstate = TX_STATE_START; break; case TX_STATE_START: sendchar('\r', 0); sendchar(2, 0); // STX sendchar('\r', 0); txstate = TX_STATE_DATA; break; case TX_STATE_DATA: i = get_tx_char(); if (i == GET_TX_CHAR_NODATA) sendsecondary(); else if (i == GET_TX_CHAR_ETX) txstate = TX_STATE_END; else sendchar(i, 0); if (stopflag) txstate = TX_STATE_END; break; case TX_STATE_END: sendchar('\r', 0); sendchar(4, 0); // EOT sendchar('\r', 0); txstate = TX_STATE_FLUSH; break; case TX_STATE_FLUSH: flushtx(); cwid(); return -1; } return 0; } //============================================================================= // MultiPsk compatible FEC methods //============================================================================= //============================================================================= // Varicode support methods // MultiPsk varicode is based on a modified MFSK varicode table in which // Character substition is used for secondary text. The resulting table does // NOT contain the full ASCII character set as the primary. Many of the // control codes and characters above 0x80 are lost. //============================================================================= // Convert from Secondary to Primary character unsigned char dominoex::MuPskSec2Pri(int c) { if (c >= 'a' && c <= 'z') c -= 32; c = mupsksec2pri.find(c) != mupsksec2pri.end() ? mupsksec2pri[c] : c; if (c >= 'A' && c <= 'Z') c = c - 'A' + 127; else if (c >= '0' && c <= '9') c = c - '0' + 14; else if (c >= ' ' && c <= '"') c = c - ' ' + 1; else if (c == '_') c = 4; else if (c >= '$' && c <= '&') c = c - '$' + 5; else if (c >= '\'' && c <= '*') c = c - '\'' + 9; else if (c >= '+' && c <= '/') c = c - '+' + 24; else if (c >= ':' && c <= '<') c = c - ':' + 29; else if (c >= '=' && c <= '@') c = c - '=' + 153; else if (c >= '[' && c <= ']') c = c - '[' + 157; else c = '_'; return c; } // Convert Primary to Split Primary / Secondary character unsigned int dominoex::MuPskPriSecChar(unsigned int c) { if (c >= 127 && c < 153) c += ('A' - 127) + 0x100; else if (c >=14 && c < 24) c += ('0' - 14) + 0x100; else if (c >= 1 && c < 4) c += (' ' - 1) + 0x100; else if (c == 4) c = '_' + 0x100; else if (c >= 5 && c < 8) c += ('$' - 5) + 0x100; else if (c >= 9 && c < 13) c += ('\'' - 9) + 0x100; else if (c >= 24 && c < 29) c += ('+' - 24) + 0x100; else if (c >= 29 && c < 32) c += (':' - 29) + 0x100; else if (c >= 153 && c < 157) c += ('=' - 153) + 0x100; else if (c >= 157 && c < 160) c += ('[' - 157) + 0x100; return c; } //============================================================================= // Receive //============================================================================= void dominoex::decodeMuPskSymbol(unsigned char symbol) { int c, ch, met; Mu_symbolpair[0] = Mu_symbolpair[1]; Mu_symbolpair[1] = symbol; Mu_symcounter = Mu_symcounter ? 0 : 1; if (Mu_symcounter) return; c = MuPskDec->decode (Mu_symbolpair, &met); if (c == -1) return; if (progStatus.sqlonoff && metric < progStatus.sldrSquelchValue) return; Mu_datashreg = (Mu_datashreg << 1) | !!c; if ((Mu_datashreg & 7) == 1) { ch = varidec(Mu_datashreg >> 1); if (progdefaults.DOMINOEX_FEC) recvchar(MuPskPriSecChar(ch)); Mu_datashreg = 1; } } void dominoex::decodeMuPskEX(int ch) { unsigned char symbols[4]; int c = ch; for (int i = 0; i < 4; i++) { if ((c & 1) == 1) symbols[3-i] = 255; else symbols[3-i] = 1;//-255; c = c / 2; } if (staticburst == true || outofrange == true) symbols[3] = symbols[2] = symbols[1] = symbols[0] = 0; MuPskRxinlv->symbols(symbols); for (int i = 0; i < 4; i++) decodeMuPskSymbol(symbols[i]); } //============================================================================= // Transmit //============================================================================= void dominoex::MuPskFlushTx() { // flush the varicode decoder at the other end // flush the convolutional encoder and interleaver sendsymbol(1); for (int i = 0; i < 107; i++) sendsymbol(0); Mu_bitstate = 0; } void dominoex::MuPskClearbits() { int data = MuPskEnc->encode(0); for (int k = 0; k < 100; k++) { for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); Mu_bitstate++; if (Mu_bitstate == 4) { MuPskTxinlv->bits(&bitshreg); Mu_bitstate = 0; bitshreg = 0; } } } } // Send MultiPsk FEC varicode with minimalist interleaver void dominoex::sendMuPskEX(unsigned char c, int secondary) { const char *code; if (secondary == 1) c = MuPskSec2Pri(c); else { if (c == 10) return; if ( (c >= 1 && c <= 7) || (c >= 9 && c <= 12) || (c >= 14 && c <= 31) || (c >= 127 && c <= 159)) c = '_'; } code = varienc(c); // if (secondary == 0) // LOG_DEBUG("char=%hhu, code=\"%s\"", c, code); while (*code) { int data = MuPskEnc->encode(*code++ - '0'); // LOG_DEBUG("data=%d", data; for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); Mu_bitstate++; if (Mu_bitstate == 4) { MuPskTxinlv->bits(&bitshreg); // LOG_DEBUG("bitshreg=%d", bitshreg); sendsymbol(bitshreg); // decodeMuPskEX(bitshreg); Mu_bitstate = 0; bitshreg = 0; } } } } fldigi-3.21.80/src/dominoex/dominovar.cxx0000664000175000017500000006133312313064025015203 00000000000000/* * dominovar.cxx -- DominoEX Varicode * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of fldigi. * * Fldigi 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. * * Fldigi 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 fldigi. If not, see . */ #include #include "dominovar.h" static unsigned char varicode[][3] = { /* Primary alphabet */ { 1,15, 9}, { 1,15,10}, { 1,15,11}, { 1,15,12}, { 1,15,13}, { 1,15,14}, { 1,15,15}, { 2, 8, 8}, { 2,12, 0}, { 2, 8, 9}, { 2, 8,10}, { 2, 8,11}, { 2, 8,12}, { 2,13, 0}, { 2, 8,13}, { 2, 8,14}, { 2, 8,15}, { 2, 9, 8}, { 2, 9, 9}, { 2, 9,10}, { 2, 9,11}, { 2, 9,12}, { 2, 9,13}, { 2, 9,14}, { 2, 9,15}, { 2,10, 8}, { 2,10, 9}, { 2,10,10}, { 2,10,11}, { 2,10,12}, { 2,10,13}, { 2,10,14}, { 0, 0, 0}, { 7,11, 0}, { 0, 8,14}, { 0,10,11}, { 0, 9,10}, { 0, 9, 9}, { 0, 8,15}, { 7,10, 0}, { 0, 8,12}, { 0, 8,11}, { 0, 9,13}, { 0, 8, 8}, { 2,11, 0}, { 7,14, 0}, { 7,13, 0}, { 0, 8, 9}, { 3,15, 0}, { 4,10, 0}, { 4,15, 0}, { 5, 9, 0}, { 6, 8, 0}, { 5,12, 0}, { 5,14, 0}, { 6,12, 0}, { 6,11, 0}, { 6,14, 0}, { 0, 8,10}, { 0, 8,13}, { 0,10, 8}, { 7,15, 0}, { 0, 9,15}, { 7,12, 0}, { 0, 9, 8}, { 3, 9, 0}, { 4,14, 0}, { 3,12, 0}, { 3,14, 0}, { 3, 8, 0}, { 4,12, 0}, { 5, 8, 0}, { 5,10, 0}, { 3,10, 0}, { 7, 8, 0}, { 6,10, 0}, { 4,11, 0}, { 4, 8, 0}, { 4,13, 0}, { 3,11, 0}, { 4, 9, 0}, { 6,15, 0}, { 3,13, 0}, { 2,15, 0}, { 2,14, 0}, { 5,11, 0}, { 6,13, 0}, { 5,13, 0}, { 5,15, 0}, { 6, 9, 0}, { 7, 9, 0}, { 0,10,14}, { 0,10, 9}, { 0,10,15}, { 0,10,10}, { 0, 9,12}, { 0, 9,11}, { 4, 0, 0}, { 1,11, 0}, { 0,12, 0}, { 0,11, 0}, { 1, 0, 0}, { 0,15, 0}, { 1, 9, 0}, { 0,10, 0}, { 5, 0, 0}, { 2,10, 0}, { 1,14, 0}, { 0, 9, 0}, { 0,14, 0}, { 6, 0, 0}, { 3, 0, 0}, { 1, 8, 0}, { 2, 8, 0}, { 7, 0, 0}, { 0, 8, 0}, { 2, 0, 0}, { 0,13, 0}, { 1,13, 0}, { 1,12, 0}, { 1,15, 0}, { 1,10, 0}, { 2, 9, 0}, { 0,10,12}, { 0, 9,14}, { 0,10,13}, { 0,11, 8}, { 2,10,15}, { 2,11, 8}, { 2,11, 9}, { 2,11,10}, { 2,11,11}, { 2,11,12}, { 2,11,13}, { 2,11,14}, { 2,11,15}, { 2,12, 8}, { 2,12, 9}, { 2,12,10}, { 2,12,11}, { 2,12,12}, { 2,12,13}, { 2,12,14}, { 2,12,15}, { 2,13, 8}, { 2,13, 9}, { 2,13,10}, { 2,13,11}, { 2,13,12}, { 2,13,13}, { 2,13,14}, { 2,13,15}, { 2,14, 8}, { 2,14, 9}, { 2,14,10}, { 2,14,11}, { 2,14,12}, { 2,14,13}, { 2,14,14}, { 2,14,15}, { 0,11, 9}, { 0,11,10}, { 0,11,11}, { 0,11,12}, { 0,11,13}, { 0,11,14}, { 0,11,15}, { 0,12, 8}, { 0,12, 9}, { 0,12,10}, { 0,12,11}, { 0,12,12}, { 0,12,13}, { 0,12,14}, { 0,12,15}, { 0,13, 8}, { 0,13, 9}, { 0,13,10}, { 0,13,11}, { 0,13,12}, { 0,13,13}, { 0,13,14}, { 0,13,15}, { 0,14, 8}, { 0,14, 9}, { 0,14,10}, { 0,14,11}, { 0,14,12}, { 0,14,13}, { 0,14,14}, { 0,14,15}, { 0,15, 8}, { 0,15, 9}, { 0,15,10}, { 0,15,11}, { 0,15,12}, { 0,15,13}, { 0,15,14}, { 0,15,15}, { 1, 8, 8}, { 1, 8, 9}, { 1, 8,10}, { 1, 8,11}, { 1, 8,12}, { 1, 8,13}, { 1, 8,14}, { 1, 8,15}, { 1, 9, 8}, { 1, 9, 9}, { 1, 9,10}, { 1, 9,11}, { 1, 9,12}, { 1, 9,13}, { 1, 9,14}, { 1, 9,15}, { 1,10, 8}, { 1,10, 9}, { 1,10,10}, { 1,10,11}, { 1,10,12}, { 1,10,13}, { 1,10,14}, { 1,10,15}, { 1,11, 8}, { 1,11, 9}, { 1,11,10}, { 1,11,11}, { 1,11,12}, { 1,11,13}, { 1,11,14}, { 1,11,15}, { 1,12, 8}, { 1,12, 9}, { 1,12,10}, { 1,12,11}, { 1,12,12}, { 1,12,13}, { 1,12,14}, { 1,12,15}, { 1,13, 8}, { 1,13, 9}, { 1,13,10}, { 1,13,11}, { 1,13,12}, { 1,13,13}, { 1,13,14}, { 1,13,15}, { 1,14, 8}, { 1,14, 9}, { 1,14,10}, { 1,14,11}, { 1,14,12}, { 1,14,13}, { 1,14,14}, { 1,14,15}, { 1,15, 8}, /* Secondary alphabet */ { 6,15, 9}, { 6,15,10}, { 6,15,11}, { 6,15,12}, { 6,15,13}, { 6,15,14}, { 6,15,15}, { 7, 8, 8}, { 4,10,12}, { 7, 8, 9}, { 7, 8,10}, { 7, 8,11}, { 7, 8,12}, { 4,10,13}, { 7, 8,13}, { 7, 8,14}, { 7, 8,15}, { 7, 9, 8}, { 7, 9, 9}, { 7, 9,10}, { 7, 9,11}, { 7, 9,12}, { 7, 9,13}, { 7, 9,14}, { 7, 9,15}, { 7,10, 8}, { 7,10, 9}, { 7,10,10}, { 7,10,11}, { 7,10,12}, { 7,10,13}, { 7,10,14}, { 3, 8, 8}, { 4,15,11}, { 5, 8,14}, { 5,10,11}, { 5, 9,10}, { 5, 9, 9}, { 5, 8,15}, { 4,15,10}, { 5, 8,12}, { 5, 8,11}, { 5, 9,13}, { 5, 8, 8}, { 4,10,11}, { 4,15,14}, { 4,15,13}, { 5, 8, 9}, { 4,11,15}, { 4,12,10}, { 4,12,15}, { 4,13, 9}, { 4,14, 8}, { 4,13,12}, { 4,13,14}, { 4,14,12}, { 4,14,11}, { 4,14,14}, { 5, 8,10}, { 5, 8,13}, { 5,10, 8}, { 4,15,15}, { 5, 9,15}, { 4,15,12}, { 5, 9, 8}, { 4,11, 9}, { 4,12,14}, { 4,11,12}, { 4,11,14}, { 4,11, 8}, { 4,12,12}, { 4,13, 8}, { 4,13,10}, { 4,11,10}, { 4,15, 8}, { 4,14,10}, { 4,12,11}, { 4,12, 8}, { 4,12,13}, { 4,11,11}, { 4,12, 9}, { 4,14,15}, { 4,11,13}, { 4,10,15}, { 4,10,14}, { 4,13,11}, { 4,14,13}, { 4,13,13}, { 4,13,15}, { 4,14, 9}, { 4,15, 9}, { 5,10,14}, { 5,10, 9}, { 5,10,15}, { 5,10,10}, { 5, 9,12}, { 5, 9,11}, { 3, 8,12}, { 4, 9,11}, { 4, 8,12}, { 4, 8,11}, { 3, 8, 9}, { 4, 8,15}, { 4, 9, 9}, { 4, 8,10}, { 3, 8,13}, { 4,10,10}, { 4, 9,14}, { 4, 8, 9}, { 4, 8,14}, { 3, 8,14}, { 3, 8,11}, { 4, 9, 8}, { 4,10, 8}, { 3, 8,15}, { 4, 8, 8}, { 3, 8,10}, { 4, 8,13}, { 4, 9,13}, { 4, 9,12}, { 4, 9,15}, { 4, 9,10}, { 4,10, 9}, { 5,10,12}, { 5, 9,14}, { 5,10,12}, { 5,11, 8}, { 7,10,15}, { 7,11, 8}, { 7,11, 9}, { 7,11,10}, { 7,11,11}, { 7,11,12}, { 7,11,13}, { 7,11,14}, { 7,11,15}, { 7,12, 8}, { 7,12, 9}, { 7,12,10}, { 7,12,11}, { 7,12,12}, { 7,12,13}, { 7,12,14}, { 7,12,15}, { 7,13, 8}, { 7,13, 9}, { 7,13,10}, { 7,13,11}, { 7,13,12}, { 7,13,13}, { 7,13,14}, { 7,13,15}, { 7,14, 8}, { 7,14, 9}, { 7,14,10}, { 7,14,11}, { 7,14,12}, { 7,14,13}, { 7,14,14}, { 7,14,15}, { 5,11, 9}, { 5,11,10}, { 5,11,11}, { 5,11,12}, { 5,11,13}, { 5,11,14}, { 5,11,15}, { 5,12, 8}, { 5,12, 9}, { 5,12,10}, { 5,12,11}, { 5,12,12}, { 5,12,13}, { 5,12,14}, { 5,12,15}, { 5,13, 8}, { 5,13, 9}, { 5,13,10}, { 5,13,11}, { 5,13,12}, { 5,13,13}, { 5,13,14}, { 5,13,15}, { 5,14, 8}, { 5,14, 9}, { 5,14,10}, { 5,14,11}, { 5,14,12}, { 5,14,13}, { 5,14,14}, { 5,14,15}, { 5,15, 8}, { 5,15, 9}, { 5,15,10}, { 5,15,11}, { 5,15,12}, { 5,15,13}, { 5,15,14}, { 5,15,15}, { 6, 8, 8}, { 6, 8, 9}, { 6, 8,10}, { 6, 8,11}, { 6, 8,12}, { 6, 8,13}, { 6, 8,14}, { 6, 8,15}, { 6, 9, 8}, { 6, 9, 9}, { 6, 9,10}, { 6, 9,11}, { 6, 9,12}, { 6, 9,13}, { 6, 9,14}, { 6, 9,15}, { 6,10, 8}, { 6,10, 9}, { 6,10,10}, { 6,10,11}, { 6,10,12}, { 6,10,13}, { 6,10,14}, { 6,10,15}, { 6,11, 8}, { 6,11, 9}, { 6,11,10}, { 6,11,11}, { 6,11,12}, { 6,11,13}, { 6,11,14}, { 6,11,15}, { 6,12, 8}, { 6,12, 9}, { 6,12,10}, { 6,12,11}, { 6,12,12}, { 6,12,13}, { 6,12,14}, { 6,12,15}, { 6,13, 8}, { 6,13, 9}, { 6,13,10}, { 6,13,11}, { 6,13,12}, { 6,13,13}, { 6,13,14}, { 6,13,15}, { 6,14, 8}, { 6,14, 9}, { 6,14,10}, { 6,14,11}, { 6,14,12}, { 6,14,13}, { 6,14,14}, { 6,14,15}, { 6,15, 8}, }; /* * The same in a format more suitable for decoding. * The index is the varicode symbol, being 1-3 nibbles, with no padding * (ie a single-symbol character uses bits 3:0 only). The value is the * ASCII character. Since continuation nibbles are required to have the * MSB set, significant portions of the table are unused and should not * be reached. */ static signed int varidecode[] = { 32,101,116,111, 97,105,110,114,115,108,104,100, 99,117,109,102, -1, -1, -1, -1, -1, -1, -1, -1,112,103,121, 98,119,118,107,120, -1, -1, -1, -1, -1, -1, -1, -1,113,122,106, 44, 8, 13, 84, 83, -1, -1, -1, -1, -1, -1, -1, -1, 69, 65, 73, 79, 67, 82, 68, 48, -1, -1, -1, -1, -1, -1, -1, -1, 77, 80, 49, 76, 70, 78, 66, 50, -1, -1, -1, -1, -1, -1, -1, -1, 71, 51, 72, 85, 53, 87, 54, 88, -1, -1, -1, -1, -1, -1, -1, -1, 52, 89, 75, 56, 55, 86, 57, 81, -1, -1, -1, -1, -1, -1, -1, -1, 74, 90, 39, 33, 63, 46, 45, 61, -1, -1, -1, -1, -1, -1, -1, -1, 43, 47, 58, 41, 40, 59, 34, 38, -1, -1, -1, -1, -1, -1, -1, -1, 64, 37, 36, 96, 95, 42,124, 62, -1, -1, -1, -1, -1, -1, -1, -1, 60, 92, 94, 35,123,125, 91, 93, -1, -1, -1, -1, -1, -1, -1, -1,126,160,161,162,163,164,165,166, -1, -1, -1, -1, -1, -1, -1, -1,167,168,169,170,171,172,173,174, -1, -1, -1, -1, -1, -1, -1, -1,175,176,177,178,179,180,181,182, -1, -1, -1, -1, -1, -1, -1, -1,183,184,185,186,187,188,189,190, -1, -1, -1, -1, -1, -1, -1, -1,191,192,193,194,195,196,197,198, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,199,200,201,202,203,204,205,206, -1, -1, -1, -1, -1, -1, -1, -1,207,208,209,210,211,212,213,214, -1, -1, -1, -1, -1, -1, -1, -1,215,216,217,218,219,220,221,222, -1, -1, -1, -1, -1, -1, -1, -1,223,224,225,226,227,228,229,230, -1, -1, -1, -1, -1, -1, -1, -1,231,232,233,234,235,236,237,238, -1, -1, -1, -1, -1, -1, -1, -1,239,240,241,242,243,244,245,246, -1, -1, -1, -1, -1, -1, -1, -1,247,248,249,250,251,252,253,254, -1, -1, -1, -1, -1, -1, -1, -1,255, 0, 1, 2, 3, 4, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 9, 10, 11, 12, 14, 15, 16, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, -1, -1, -1, -1, 25, 26, 27, 28, 29, 30, 31,127, -1, -1, -1, -1, -1, -1, -1, -1,128,129,130,131,132,133,134,135, -1, -1, -1, -1, -1, -1, -1, -1,136,137,138,139,140,141,142,143, -1, -1, -1, -1, -1, -1, -1, -1,144,145,146,147,148,149,150,151, -1, -1, -1, -1, -1, -1, -1, -1,152,153,154,155,156,157,158,159, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,288,357,372,367,353,361,366,370, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,371,364,360,356,355,373,365,358, -1, -1, -1, -1, -1, -1, -1, -1,368,359,377,354,375,374,363,376, -1, -1, -1, -1, -1, -1, -1, -1,369,378,362,300,264,269,340,339, -1, -1, -1, -1, -1, -1, -1, -1,325,321,329,335,323,338,324,304, -1, -1, -1, -1, -1, -1, -1, -1,333,336,305,332,326,334,322,306, -1, -1, -1, -1, -1, -1, -1, -1,327,307,328,341,309,343,310,344, -1, -1, -1, -1, -1, -1, -1, -1,308,345,331,312,311,342,313,337, -1, -1, -1, -1, -1, -1, -1, -1,330,346,295,289,319,302,301,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, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,299,303,314,297,296,315,290,294, -1, -1, -1, -1, -1, -1, -1, -1,320,293,292,352,351,298,380,318, -1, -1, -1, -1, -1, -1, -1, -1,316,348,350,291,381, -1,347,349, -1, -1, -1, -1, -1, -1, -1, -1,382,416,417,418,419,420,421,422, -1, -1, -1, -1, -1, -1, -1, -1,423,424,425,426,427,428,429,430, -1, -1, -1, -1, -1, -1, -1, -1,431,432,433,434,435,436,437,438, -1, -1, -1, -1, -1, -1, -1, -1,439,440,441,442,443,444,445,446, -1, -1, -1, -1, -1, -1, -1, -1,447,448,449,450,451,452,453,454, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,455,456,457,458,459,460,461,462, -1, -1, -1, -1, -1, -1, -1, -1,463,464,465,466,467,468,469,470, -1, -1, -1, -1, -1, -1, -1, -1,471,472,473,474,475,476,477,478, -1, -1, -1, -1, -1, -1, -1, -1,479,480,481,482,483,484,485,486, -1, -1, -1, -1, -1, -1, -1, -1,487,488,489,490,491,492,493,494, -1, -1, -1, -1, -1, -1, -1, -1,495,496,497,498,499,500,501,502, -1, -1, -1, -1, -1, -1, -1, -1,503,504,505,506,507,508,509,510, -1, -1, -1, -1, -1, -1, -1, -1,511,256,257,258,259,260,261,262, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,263,265,266,267,268,270,271,272, -1, -1, -1, -1, -1, -1, -1, -1,273,274,275,276,277,278,279,280, -1, -1, -1, -1, -1, -1, -1, -1,281,282,283,284,285,286,287,383, -1, -1, -1, -1, -1, -1, -1, -1,384,385,386,387,388,389,390,391, -1, -1, -1, -1, -1, -1, -1, -1,392,393,394,395,396,397,398,399, -1, -1, -1, -1, -1, -1, -1, -1,400,401,402,403,404,405,406,407, -1, -1, -1, -1, -1, -1, -1, -1,408,409,410,411,412,413,414,415, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }; #include unsigned char *dominoex_varienc(unsigned char c, int secondary) { return varicode[c + ((secondary) ? 256 : 0)]; } int dominoex_varidec(unsigned int symbol) { /* The caller is responsible for ensuring symbols are properly delineated. */ return varidecode[symbol & 0xFFF]; } fldigi-3.21.80/src/feld/0000775000175000017500000000000012313333727011633 500000000000000fldigi-3.21.80/src/feld/FeldLow-14.cxx0000664000175000017500000003101512313064025014045 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feld low-14 font fntchr feldlow_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000 }, }, {'$', { 0x2000, 0x7800, 0xF800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF800, 0xF000, 0x2000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xD800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x4000, 0xE000, 0xE000, 0xA000, 0x4000, 0x4000, 0xE000, 0xA000, 0xB000, 0xB000, 0xF800, 0x7800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x6000, 0xE000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0xE000, 0x6000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0xC000, 0xE000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xE000, 0xC000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x2000, 0xE000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'0', { 0x0000, 0x7000, 0xF800, 0xF800, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'2', { 0x0000, 0xF000, 0xF800, 0xF800, 0x0800, 0x0800, 0x7800, 0xF000, 0x8000, 0x8000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'3', { 0x0000, 0xF000, 0xF800, 0xF800, 0x0800, 0x0800, 0x3800, 0x3800, 0x0800, 0x0800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0xF800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x0800, 0x0800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'6', { 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x7000, 0x7000, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x7800, 0x7800, 0x7000, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'<', { 0x0000, 0x0800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x0800, 0x0000 }, }, {'=', { 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0x8000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x0800, 0x0800, 0x3800, 0x3000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'B', { 0x0000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0xF000, 0xF000, 0x8800, 0x8800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'C', { 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x7800, 0x0000 }, }, {'D', { 0x0000, 0xF000, 0xF800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'E', { 0x0000, 0xF800, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'F', { 0x0000, 0xF800, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'G', { 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'H', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'I', { 0x0000, 0xE000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'J', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'K', { 0x0000, 0x8800, 0x8800, 0x9800, 0xB800, 0xF000, 0xE000, 0xE000, 0xF000, 0xB800, 0x9800, 0x8800, 0x8800, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'M', { 0x0000, 0x8800, 0xD800, 0xF800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'N', { 0x0000, 0x8800, 0x8800, 0xC800, 0xC800, 0xE800, 0xE800, 0xB800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000 }, }, {'O', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'P', { 0x0000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0xF000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'Q', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0xFC00, 0x7C00, 0x0C00 }, }, {'R', { 0x0000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0xF000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'S', { 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'T', { 0x0000, 0xF800, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'U', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'V', { 0x0000, 0x8800, 0x8800, 0x8800, 0x9800, 0x9800, 0xB000, 0xB000, 0xE000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'W', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0xF800, 0x5000, 0x0000 }, }, {'X', { 0x0000, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x2000, 0x2000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0x0000 }, }, {'Y', { 0x0000, 0x8800, 0x8800, 0x8800, 0xD800, 0xD800, 0x7000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'Z', { 0x0000, 0xF800, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4000, 0xC000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x6000, 0x3000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xE000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x7000, 0x7800, 0x7800, 0x0800, 0x7800, 0xF800, 0x8800, 0xF800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'b', { 0x8000, 0x8000, 0x8000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x7000, 0xF000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0800, 0x0800, 0x0800, 0x7800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0xF800, 0xF800, 0x8000, 0xF800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x3000, 0x7000, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x7800, 0xF800, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'h', { 0x8000, 0x8000, 0x8000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0xC000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x3000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x9000, 0xF000, 0xF000, 0x6000, 0x0000 }, }, {'k', { 0x0000, 0x8000, 0x8000, 0x9000, 0x9000, 0xB000, 0xE000, 0xE000, 0xE000, 0xB000, 0xB000, 0x9000, 0x9000, 0x0000 }, }, {'l', { 0x0000, 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0xD000, 0xF800, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0xB000, 0xF800, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0xF000, 0xF800, 0xF800, 0x4800, 0x4800, 0x7800, 0x7800, 0x7000, 0x4000, 0x4000, 0x4000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0xF800, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x7000, 0x1000, 0x1000 }, }, {'r', { 0x0000, 0x0000, 0xD800, 0xF800, 0xF800, 0x6000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0xF000, 0x7800, 0x0800, 0xF800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x7000, 0x3000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0xF800, 0x6800, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x2000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0x7000, 0x2000, 0x2000, 0x7000, 0xF800, 0xD800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xC800, 0xE800, 0x7800, 0x3800, 0x3000, 0x6000, 0xC000, 0xC000 }, }, {'z', { 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x1800, 0x3000, 0x6000, 0xC000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0xC000, 0x4000, 0x6000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x6000, 0x3000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x6000, 0x4000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0xD800, 0xF800, 0x6C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/feld/FeldLo8-14.cxx0000664000175000017500000003101512313064025013746 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feld Lo8-14 font fntchr feldlo8_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0x0000, 0xA000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000 }, }, {'$', { 0x2000, 0x7800, 0xF800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF800, 0xF000, 0x2000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xD800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x4000, 0xE000, 0xE000, 0xA000, 0x4000, 0x4000, 0xE000, 0xA000, 0xB000, 0xB000, 0xF800, 0x7800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x6000, 0xE000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0xE000, 0x6000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0xC000, 0xE000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xE000, 0xC000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x2000, 0xE000, 0xE000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'0', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8C00, 0x8C00, 0xB400, 0xB400, 0xC400, 0xC400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x7000, 0x7000, 0x7000, 0x0000 }, }, {'2', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x0400, 0x0400, 0x7C00, 0xF800, 0x8000, 0x8000, 0xFC00, 0xFC00, 0xFC00, 0x0000 }, }, {'3', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x0400, 0x0400, 0x3C00, 0x3C00, 0x0400, 0x0400, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x8800, 0x8800, 0x8800, 0x8800, 0xFC00, 0xFC00, 0xFC00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {'5', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF800, 0xFC00, 0x0400, 0x0400, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'6', { 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'7', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x7800, 0x7800, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'9', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0400, 0x0400, 0x7C00, 0x7C00, 0x7800, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'<', { 0x0000, 0x0800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x0800, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0x8000 }, }, {'?', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x0400, 0x0C00, 0x1800, 0x3000, 0x0000, 0x0000, 0x3000, 0x3000, 0x3000 }, }, {'@', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0xBC00, 0xBC00, 0x8000, 0xC000, 0xFC00, 0x7C00, 0x3C00, 0x0000 }, }, {'A', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x0000 }, }, {'B', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0xF800, 0xF800, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'C', { 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0x7C00, 0x0000 }, }, {'D', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x8C00, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'E', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF000, 0xF000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0xFC00, 0x0000 }, }, {'F', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0xF000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'G', { 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0x9C00, 0x9C00, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'H', { 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000 }, }, {'I', { 0x0000, 0xF800, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'J', { 0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'K', { 0x0000, 0x8400, 0x8400, 0x8C00, 0x9C00, 0xB800, 0xF000, 0xF000, 0xB800, 0x9C00, 0x8C00, 0x8400, 0x8400, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0xFC00, 0x0000 }, }, {'M', { 0x0000, 0x8200, 0xC600, 0xEE00, 0xFE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000 }, }, {'N', { 0x0000, 0x8400, 0xC400, 0xC400, 0xE400, 0xA400, 0xB400, 0x9400, 0x9C00, 0x8C00, 0x8C00, 0x8400, 0x8400, 0x0000 }, }, {'O', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'P', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xF800, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'Q', { 0x0000, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x9400, 0x9400, 0xFC00, 0xFE00, 0x7E00, 0x0600, 0x0000 }, }, {'R', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xF800, 0xF800, 0x8C00, 0x8C00, 0x8C00, 0x0000 }, }, {'S', { 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF800, 0x7C00, 0x0400, 0x0400, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'T', { 0x0000, 0xFE00, 0xFE00, 0xFE00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'U', { 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'V', { 0x0000, 0x8400, 0x8400, 0x8C00, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'W', { 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0x9200, 0xFE00, 0xFE00, 0x6C00, 0x0000 }, }, {'X', { 0x0000, 0x8200, 0x8200, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3800, 0x7C00, 0xEE00, 0xC600, 0x8200, 0x8200, 0x0000 }, }, {'Y', { 0x0000, 0x8200, 0x8200, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'Z', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x0C00, 0x0C00, 0x3800, 0x7000, 0xC000, 0xC000, 0xFC00, 0xFC00, 0xFC00, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x6000, 0x3000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xE000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x7800, 0x7C00, 0x7C00, 0x0400, 0x7C00, 0xFC00, 0x8400, 0xFC00, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'b', { 0x8000, 0x8000, 0x8000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'d', { 0x0400, 0x0400, 0x0400, 0x7C00, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0xFC00, 0xFC00, 0x8000, 0xFC00, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x3800, 0x7800, 0x7800, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0xF000, 0xF000, 0xF000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0400, 0xFC00, 0xFC00, 0x7800 }, }, {'h', { 0x8000, 0x8000, 0x8000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'i', { 0x2000, 0x2000, 0x0000, 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0xF000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'j', { 0x0800, 0x0800, 0x0000, 0x1800, 0x1800, 0x1800, 0x0800, 0x0800, 0x0800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'k', { 0x8000, 0x8000, 0x8800, 0x9800, 0xB800, 0xF000, 0xE000, 0xE000, 0xB000, 0xB800, 0x9800, 0x8800, 0x0000, 0x0000 }, }, {'l', { 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0xEC00, 0xFE00, 0xFE00, 0x9200, 0x9200, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0xB800, 0xFC00, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0xF800, 0xFC00, 0xFC00, 0x4400, 0x4400, 0x7C00, 0x7C00, 0x7800, 0x4000, 0x4000, 0x4000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0xDC00, 0xFC00, 0xFC00, 0x6000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0xF800, 0x7C00, 0x0400, 0xFC00, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'t', { 0x4000, 0x4000, 0xF000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7800, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0xFC00, 0x7400, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x1000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0xFE00, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x8200, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3800, 0x7C00, 0xEE00, 0xC600, 0x8200, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0xC400, 0xE400, 0x7C00, 0x3C00, 0x0400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'z', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x1800, 0x3000, 0x6000, 0xC000, 0xFC00, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0xC000, 0x4000, 0x6000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x6000, 0x3000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x6000, 0x4000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0xD800, 0xF800, 0x6C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/feld/FeldStyl-14.cxx0000664000175000017500000003101712313064025014241 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feld styl-14 font fntchr feldstyl_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x2000, 0x2000, 0x7800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF000, 0x2000, 0x2000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xD800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0xE000, 0x6000, 0x6800, 0xD800, 0x9000, 0x9000, 0xF800, 0x6800, 0x0000 }, }, { 39, { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x6000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0xC000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x2000, 0xE000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'0', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x9800, 0xB800, 0xE800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000 }, }, {'2', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'3', { 0x0000, 0xF000, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x3000, 0x1800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3000, 0x7000, 0x5000, 0xD000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x0800, 0x0800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'6', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x0800, 0x7800, 0x7000, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x1000, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1000, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x0800, 0x1800, 0x3000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xB800, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000 }, }, {'A', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'B', { 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000 }, }, {'C', { 0x0000, 0x3800, 0x7800, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000 }, }, {'D', { 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF000, 0xE000, 0x0000 }, }, {'E', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'F', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'G', { 0x0000, 0x3800, 0x7800, 0xC000, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xC800, 0x7800, 0x3000, 0x0000 }, }, {'H', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'I', { 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'J', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'K', { 0x0000, 0x8800, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'M', { 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'N', { 0x0000, 0x8800, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'O', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000 }, }, {'P', { 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x9800, 0xF000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'Q', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xB800, 0xF800, 0x7C00, 0x0C00 }, }, {'R', { 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x9800, 0xF000, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000 }, }, {'S', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'T', { 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'U', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x0000 }, }, {'W', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0xF800, 0x5000, 0x0000 }, }, {'X', { 0x0000, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'Y', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'Z', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x7000, 0x7800, 0x0800, 0x0800, 0x7800, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000 }, }, {'b', { 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000 }, }, {'d', { 0x0000, 0x0800, 0x0800, 0x6800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF800, 0x7800, 0x0000 }, }, {'f', { 0x0000, 0x3800, 0x7800, 0x4000, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000 }, }, {'h', { 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0xF000, 0xE000, 0x0000 }, }, {'k', { 0x0000, 0x8000, 0x8000, 0x9000, 0x9000, 0xB000, 0xE000, 0xC000, 0xC000, 0xE000, 0xB000, 0x9000, 0x9000, 0x0000 }, }, {'l', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0xC800, 0xF800, 0xB000, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'t', { 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x3000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x9000, 0xF800, 0x6800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/feld/FeldModern8-14.cxx0000664000175000017500000003102712313064025014623 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feld modern -8-14 font fntchr feldmodern8_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0xD800, 0xD800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x2000, 0x7800, 0xF800, 0xA000, 0xF000, 0x7800, 0x2800, 0xF800, 0xF000, 0x2000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0x4000, 0xE400, 0xE400, 0x4C00, 0x1800, 0x3000, 0x6000, 0xC800, 0x9C00, 0x9C00, 0x8800, 0x0000, 0x0000 }, }, {'&', { 0x0000, 0x3000, 0x7800, 0x4800, 0x4800, 0x7000, 0xF400, 0x8C00, 0x8800, 0xFC00, 0x7400, 0x0000, 0x0000, 0x0000 }, }, { 39, { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x4000, 0xC000, 0x8000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8C00, 0x9C00, 0xB400, 0xE400, 0xC400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0400, 0x0C00, 0x1800, 0x1C00, 0x0400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3800, 0x7800, 0x4800, 0xC800, 0x8800, 0xFC00, 0xFC00, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF800, 0xFC00, 0x0400, 0x0400, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0400, 0x0400, 0x0C00, 0x1800, 0x3000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x7800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0400, 0x0400, 0x7C00, 0x7800, 0x0000, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x0000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'@', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0xB200, 0xBE00, 0xBC00, 0x8000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x3000, 0x7800, 0xCC00, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xF800, 0xF800, 0x8400, 0x8400, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x3800, 0x7C00, 0xC400, 0x8000, 0x8000, 0x8000, 0x8000, 0xC400, 0x7C00, 0x3800, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8C00, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF000, 0xF000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0xC000, 0x8000, 0x8C00, 0x8C00, 0x8400, 0xC400, 0x7C00, 0x3800, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8C00, 0x9800, 0xF000, 0xF000, 0x9800, 0x8C00, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8400, 0xC400, 0xE400, 0xB400, 0x9C00, 0x8C00, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x3000, 0x7800, 0xCC00, 0x8400, 0x8400, 0x8400, 0x8400, 0xCC00, 0x7800, 0x3000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x9400, 0x9400, 0xFC00, 0x7800, 0x0800, 0x0800 }, }, {'R', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0xF800, 0x8800, 0x8C00, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8000, 0xF800, 0x7C00, 0x0400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0xC600, 0x4400, 0x6C00, 0x2800, 0x3800, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x7C00, 0x0400, 0x7C00, 0xFC00, 0x8400, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0400, 0x0400, 0x7400, 0xFC00, 0x8C00, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0xFC00, 0xFC00, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0x4000, 0x4000, 0xF800, 0xF800, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x7C00, 0x7800, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x2000, 0x2000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0800, 0x0800, 0x0000, 0x3800, 0x3800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0xF800, 0x7000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xEC00, 0xFE00, 0x9200, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xC400, 0xFC00, 0xB800, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x0400, 0x0400 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB800, 0xFC00, 0xC400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8000, 0xF800, 0x7C00, 0x0400, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x7C00, 0x7800 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xFC00, 0xFC00, 0x1800, 0x3000, 0x6000, 0xC000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x9800, 0xFC00, 0x6400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/feld/FeldReal-14.cxx0000664000175000017500000003101712313064025014171 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feld real-14 font fntchr feldreal_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0x9000, 0x9000, 0xD800, 0x4800, 0x4800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC400, 0xC400, 0xC400, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x8C00, 0x8C00, 0x8C00, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA800, 0xA800, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x7000, 0x7000, 0x1000, 0x1000, 0x3000, 0x3800, 0x0800, 0x0800, 0x1800, 0x3000, 0xE000, 0xC000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x3800, 0x3800, 0x2000, 0x2000, 0x3000, 0x3800, 0x0800, 0x0800, 0x1800, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0xE800, 0x6800, 0x0800, 0x1800, 0x3000, 0x6000, 0x4000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xB000, 0xF800, 0xF800, 0x0800, 0x0800 }, }, {'R', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'k', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'q', { 0x0000, 0x0000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xB000, 0xF800, 0xF800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/feld/Feld7x7-14.cxx0000664000175000017500000003101612313064025013732 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feld 7x7-14 font fntchr feld7x7_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0x0000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7800, 0x7800, 0xA000, 0xA000, 0x7000, 0x7000, 0x2800, 0x2800, 0xF000, 0xF000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0x0000, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x0000, 0x0000 }, }, {'&', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x6800, 0x6800, 0x9000, 0x9000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x6000, 0x6000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0xC000, 0xC000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0xA800, 0xA800, 0x7000, 0x7000, 0xF800, 0xF800, 0x7000, 0x7000, 0xA800, 0xA800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0000, 0x0800, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0x7000, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x6000, 0x6000, 0xA000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xF000, 0xF000, 0x0800, 0x0800, 0x3000, 0x3000, 0x0800, 0x0800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF000, 0x0800, 0x0800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0xF000, 0xF000, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x7000, 0x7000, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x7800, 0x7800, 0x0800, 0x0800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x0800, 0x3000, 0x3000, 0xC000, 0xC000, 0x3000, 0x3000, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0x8000, 0x6000, 0x6000, 0x1800, 0x1800, 0x6000, 0x6000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'@', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0xB000, 0xB000, 0x8000, 0x8000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF000, 0xF000, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x7800, 0x7800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF000, 0xF000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7800, 0x7800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9000, 0x9000, 0xE000, 0xE000, 0x9000, 0x9000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0xD800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8800, 0x8800, 0xC800, 0xC800, 0xA800, 0xA800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8800, 0x8800, 0xF000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0x7000, 0x7000, 0x1000, 0x1000 }, }, {'R', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8800, 0x8800, 0xF000, 0xF000, 0x9000, 0x9000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7800, 0x7800, 0x8000, 0x8000, 0x7000, 0x7000, 0x0800, 0x0800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x5000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x5000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0x4000, 0x4000, 0x2000, 0x2000, 0x1000, 0x1000, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0x8000, 0x8000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0xF000, 0xF000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0x8800, 0x8800, 0x8800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0800, 0x0800, 0x7800, 0x7800, 0x8800, 0x8800, 0x8800, 0x8800, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0xF800, 0xF800, 0x8000, 0x8000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3800, 0x3800, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7800, 0x7800, 0x8800, 0x8800, 0x7800, 0x7800, 0x0800, 0x0800, 0x7000, 0x7000, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xF000, 0xF000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0x9000, 0x6000, 0x6000 }, }, {'k', { 0x0000, 0x0000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0xA000, 0xA000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xD000, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xB000, 0xC800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF000, 0x8800, 0x8800, 0xC800, 0xC800, 0xB000, 0xB000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x7800, 0x8800, 0x8800, 0x9800, 0x9800, 0x6800, 0x6800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD800, 0xD800, 0x6000, 0x6000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x7800, 0xC000, 0xC000, 0x3800, 0x3800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x3000, 0x3000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x5000, 0x5000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x7000, 0x7000, 0x7000, 0x7000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x4800, 0x4800, 0x3000, 0x3000, 0x2000, 0x2000, 0x4000, 0x4000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x1000, 0x1000, 0x6000, 0x6000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x0000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'|', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/feld/FeldWide-14.cxx0000664000175000017500000003101712313064025014176 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feld wide-14 font fntchr feldwide_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x4800, 0x4800, 0xFE00, 0xFE00, 0x4800, 0x4800, 0xFE00, 0xFE00, 0x4800, 0x4800, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x1000, 0x7C00, 0xFE00, 0x9200, 0x9000, 0xFC00, 0x7E00, 0x1200, 0x9200, 0xFE00, 0x7C00, 0x1000, 0x0000 }, }, {'%', { 0x0000, 0xC200, 0xC200, 0xC200, 0x0600, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0x8600, 0x8600, 0x8600, 0x0000 }, }, {'&', { 0x0000, 0x1800, 0x3C00, 0x6400, 0x6000, 0x3000, 0x7A00, 0x5E00, 0xCC00, 0x8400, 0x8600, 0xFE00, 0x7C00, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xE000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x1800, 0x3800, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x3800, 0x1800, 0x0000 }, }, {')', { 0x0000, 0xC000, 0xE000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0xE000, 0xC000, 0x0000 }, }, {'*', { 0x0000, 0x1000, 0x1000, 0x1000, 0xFE00, 0xFE00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, 0xFE00, 0xFE00, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7E00, 0xFF00, 0x8D00, 0x8D00, 0x9900, 0x9900, 0xB100, 0xB100, 0xFF00, 0x7E00, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x3000, 0x7000, 0xD000, 0x9000, 0x1000, 0x1000, 0x1000, 0x1000, 0x7C00, 0x7C00, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x0200, 0x3E00, 0x7C00, 0xC000, 0xC000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8600, 0x0600, 0x1C00, 0x1C00, 0x0600, 0x8600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xFE00, 0xFE00, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x7E00, 0x7E00, 0x4000, 0x4000, 0x7C00, 0x7E00, 0x0200, 0x0200, 0x0600, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'6', { 0x3C00, 0x7C00, 0xC000, 0x8000, 0x8000, 0xBC00, 0xFE00, 0xC200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x0C00, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'8', { 0x7C00, 0xFE00, 0x8200, 0x8200, 0xC600, 0x7C00, 0x7C00, 0xC600, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0xFE00, 0x7E00, 0x0200, 0x0200, 0x0600, 0x7C00, 0x7800, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7C00, 0xFE00, 0x8200, 0x0200, 0x0E00, 0x1C00, 0x3000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0xBA00, 0xBE00, 0xBC00, 0x8000, 0xC000, 0x7C00, 0x3C00, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x3800, 0x7C00, 0xC600, 0x8200, 0x8200, 0xFE00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0x4200, 0x4200, 0x7C00, 0x7C00, 0x4200, 0x4200, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x4600, 0x4200, 0x4200, 0x4200, 0x4200, 0x4600, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x8000, 0x8000, 0xF800, 0xF800, 0x8000, 0x8000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x8000, 0x8000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8000, 0x8000, 0x8E00, 0x8E00, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0xFE00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0E00, 0x0E00, 0x0200, 0x0200, 0x0200, 0x0200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8600, 0x8600, 0x8C00, 0x9800, 0xF000, 0xF000, 0x9800, 0x8C00, 0x8600, 0x8600, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8200, 0xC200, 0xE200, 0xB200, 0x9A00, 0x8E00, 0x8600, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0x4200, 0x4200, 0x7E00, 0x7C00, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x8200, 0x8A00, 0x8A00, 0xFE00, 0x7C00, 0x0400, 0x0400 }, }, {'R', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0x8200, 0x8200, 0xFE00, 0xFC00, 0x8400, 0x8600, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8000, 0x8000, 0xFC00, 0x7E00, 0x0200, 0x0200, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8600, 0x8C00, 0x9800, 0xB000, 0xE000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x0C00, 0x1800, 0x3000, 0x6000, 0x6000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0x7E00, 0x0200, 0x7E00, 0xFE00, 0x8200, 0xFE00, 0x7E00, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0xC000, 0xC000, 0x5C00, 0x7E00, 0x6200, 0x4200, 0x4200, 0x4200, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8000, 0x8000, 0x8000, 0x8000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0600, 0x0600, 0x7400, 0xFC00, 0x8C00, 0x8400, 0x8400, 0x8400, 0xFE00, 0x7E00, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0xFE00, 0xFE00, 0x8000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8200, 0x8200, 0x8600, 0xFE00, 0x7A00, 0x0200, 0x7E00, 0x7C00, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0xC000, 0xC000, 0x5C00, 0x7E00, 0x6200, 0x4200, 0x4200, 0x4200, 0xC200, 0xC200, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x2000, 0x2000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0800, 0x0800, 0x0000, 0x3800, 0x3800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0xF800, 0x7000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x9800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8C00, 0x8C00, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xEC00, 0xFE00, 0x9200, 0x9200, 0x9200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xBC00, 0xFE00, 0xC200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0xFC00, 0xFE00, 0x4200, 0x4200, 0x6200, 0x7E00, 0x5C00, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x1E00, 0x1E00, 0x0000 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xDC00, 0xFE00, 0x6200, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8000, 0xFC00, 0x7E00, 0x0200, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8600, 0xFE00, 0x7A00, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3000, 0x6000, 0xC000, 0xC000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x1800, 0x3000, 0x6000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/feld/FeldNarr-14.cxx0000664000175000017500000003102112313064025014203 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feld narrow-14 font fntchr feldnarr_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7000, 0xF800, 0xA800, 0xA000, 0xF000, 0x7800, 0x2800, 0xA800, 0xF800, 0x7000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA000, 0xA000, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x6000, 0x2000, 0x2000, 0x6000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x7000, 0xF800, 0xF800, 0x7000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0xF800, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xF000, 0xF800, 0x0800, 0x0800, 0x3800, 0x3800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0x7800, 0x7800, 0x4000, 0x4000, 0x7000, 0x7800, 0x0800, 0x0800, 0x1800, 0xF000, 0xE000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x1800, 0x7000, 0x6000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'<', { 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xF000, 0x7000, 0x1800, 0x0800 }, }, {'R', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7800, 0x0800, 0x7800, 0xF800, 0x8800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0800, 0x0800, 0x6800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0xF800, 0xF800, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3800, 0x7800, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x7800, 0x7000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x4000, 0x4000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x1000, 0x1000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0xF000, 0x6000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x8000, 0x9000, 0xB000, 0xE000, 0xE000, 0xA000, 0xB000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xC800, 0xF800, 0xB000, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD800, 0xF800, 0x6000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0xF000, 0x7800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x3000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xC800, 0x7800, 0x3000, 0x2000, 0x6000, 0xC000, 0xC000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x3000, 0x6000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x6800, 0xF800, 0xB000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/feld/FeldVert-14.cxx0000664000175000017500000003101712313064025014226 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feld vert-14 font fntchr feldvert_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x2000, 0x2000, 0x7800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF000, 0x2000, 0x2000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xD800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0xE000, 0x6000, 0x6800, 0xD800, 0x9000, 0x9000, 0xF800, 0x6800, 0x0000 }, }, { 39, { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x6000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0xC000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x2000, 0xE000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'0', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x9800, 0xB800, 0xE800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x7000, 0x7000, 0x0000 }, }, {'2', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x0800, 0x3800, 0x7000, 0xC000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'3', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x3000, 0x1800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x0800, 0x0800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'6', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x0800, 0x7800, 0x7000, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000, 0x0000 }, }, {'<', { 0x0000, 0x1000, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1000, 0x0000, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x0800, 0x1800, 0x3000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xB800, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000 }, }, {'A', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'B', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x9800, 0xF000, 0xF000, 0x9800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000 }, }, {'C', { 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0xF800, 0x7000, 0x0000 }, }, {'D', { 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF000, 0xE000, 0x0000 }, }, {'E', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'F', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'G', { 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'H', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'I', { 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'J', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'K', { 0x0000, 0x8800, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'M', { 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'N', { 0x0000, 0x8800, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'O', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'P', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'Q', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xB800, 0xF800, 0x7C00, 0x0C00 }, }, {'R', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000 }, }, {'S', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'T', { 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'U', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'V', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'W', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0xF800, 0x5000, 0x0000 }, }, {'X', { 0x0000, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'Y', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'Z', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x7000, 0x7800, 0x0800, 0x0800, 0x7800, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000 }, }, {'b', { 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000 }, }, {'d', { 0x0000, 0x0800, 0x0800, 0x6800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000 }, }, {'f', { 0x0000, 0x3000, 0x7800, 0x4800, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'h', { 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0xF000, 0x6000 }, }, {'k', { 0x0000, 0x8000, 0x8000, 0x9000, 0x9000, 0xB000, 0xE000, 0xC000, 0xC000, 0xE000, 0xB000, 0x9000, 0x9000, 0x0000 }, }, {'l', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0xC800, 0xF800, 0xB000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'q', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x0800, 0x0000 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0xD800, 0xF800, 0x6000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'t', { 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x3000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xC800, 0x6800, 0x3800, 0x3000, 0x6000, 0xC000, 0x8000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x9000, 0xF800, 0x6800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/feld/FeldFat-14.cxx0000664000175000017500000003101212313064025014013 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feld-fat font fntchr feldfat_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000 }, }, {'"', { 0x0000, 0x0000, 0xD800, 0xD800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x6C00, 0x6C00, 0xFE00, 0xFE00, 0x6C00, 0x6C00, 0xFE00, 0xFE00, 0x6C00, 0x6C00, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x1000, 0x7E00, 0xFE00, 0xD000, 0xD000, 0xFC00, 0x7E00, 0x1600, 0x1600, 0xFE00, 0xFC00, 0x1000, 0x0000 }, }, {'%', { 0x0000, 0xE600, 0xE600, 0xE600, 0x0600, 0x0E00, 0x1C00, 0x3800, 0x7000, 0xE000, 0xCE00, 0xCE00, 0xCE00, 0x0000 }, }, {'&', { 0x0000, 0x1800, 0x3E00, 0x6600, 0x6000, 0x3000, 0x7B00, 0x7F00, 0xCE00, 0xC600, 0xC700, 0xFF00, 0x7C00, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0xC000, 0xC000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x0000 }, }, {')', { 0x0000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x1800, 0x1800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, 0xFE00, 0xFE00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x1800, 0x1800, 0xFF00, 0xFF00, 0x1800, 0x1800, 0x1800, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x6000, 0x6000, 0xE000, 0xC000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0C00, 0x0C00, 0x1C00, 0x1800, 0x3800, 0x3000, 0x7000, 0x6000, 0xE000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xCE00, 0xCE00, 0xD600, 0xD600, 0xE600, 0xE600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x3000, 0x7000, 0xF000, 0xF000, 0x3000, 0x3000, 0x3000, 0x3000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0x0600, 0x3E00, 0x7C00, 0xC000, 0xC000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0x0600, 0x1C00, 0x1C00, 0x0600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0xEC00, 0xCC00, 0xCC00, 0xFE00, 0xFE00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0xC000, 0xC000, 0xFC00, 0xFE00, 0x0600, 0x0600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7C00, 0xFC00, 0xC000, 0xC000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x0C00, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0x7C00, 0x7C00, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0xFE00, 0x7E00, 0x0600, 0x0600, 0x7E00, 0x7C00, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0C00, 0x1C00, 0x3800, 0x7000, 0xE000, 0xE000, 0x7000, 0x3800, 0x1C00, 0x0C00, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1C00, 0x1C00, 0x3800, 0x7000, 0xE000, 0xC000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0x7800, 0xFC00, 0xCC00, 0x0C00, 0x3800, 0x7000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x0000 }, }, {'@', { 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0xDE00, 0xDE00, 0xDC00, 0xC000, 0xC000, 0x7C00, 0x3C00, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x3800, 0x7C00, 0xEE00, 0xC600, 0xC600, 0xFE00, 0xFE00, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xFC00, 0xFC00, 0xC600, 0xC600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x3C00, 0x7E00, 0xE600, 0xC000, 0xC000, 0xC000, 0xC000, 0xE600, 0x7E00, 0x3C00, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF800, 0xFC00, 0xCE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xCE00, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0xC000, 0xC000, 0xF800, 0xF800, 0xC000, 0xC000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0xC000, 0xC000, 0xF800, 0xF800, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x3E00, 0x7E00, 0xE000, 0xC000, 0xCE00, 0xCE00, 0xC600, 0xE600, 0x7E00, 0x3C00, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xFE00, 0xFE00, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xF000, 0xF000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0E00, 0x0E00, 0x0600, 0x0600, 0x0600, 0x0600, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0xC600, 0xC600, 0xCE00, 0xDC00, 0xF800, 0xF800, 0xDC00, 0xCE00, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0xC600, 0xEE00, 0xFE00, 0xFE00, 0xD600, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0xC600, 0xE600, 0xF600, 0xFE00, 0xDE00, 0xCE00, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x3800, 0x7C00, 0xEE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xFE00, 0xFC00, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xDE00, 0xDE00, 0xFE00, 0x7C00, 0x0C00, 0x0C00 }, }, {'R', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xFE00, 0xFC00, 0xCC00, 0xCE00, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7E00, 0xFE00, 0xC000, 0xC000, 0xFC00, 0x7E00, 0x0600, 0x0600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0x6C00, 0x6C00, 0x3800, 0x3800, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xD600, 0xD600, 0xD600, 0xFE00, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0xC600, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3800, 0x7C00, 0xEE00, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0xCC00, 0xCC00, 0xCC00, 0xFC00, 0x7800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0E00, 0x0C00, 0x1800, 0x3000, 0x6000, 0xE000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xF000, 0xF000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0xC000, 0xC000, 0xE000, 0x6000, 0x7000, 0x3000, 0x3800, 0x1800, 0x1C00, 0x0C00, 0x0C00, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xF000, 0xF000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x7000, 0xF800, 0xD800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0x7E00, 0x0600, 0x7E00, 0xFE00, 0xC600, 0xFE00, 0x7E00, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0xC000, 0xC000, 0xDC00, 0xFE00, 0xE600, 0xC600, 0xC600, 0xC600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0xC000, 0xC000, 0xC000, 0xC000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0600, 0x0600, 0x7600, 0xFE00, 0xCE00, 0xC600, 0xC600, 0xC600, 0xFE00, 0x7E00, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xFE00, 0xFE00, 0xC000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0x6000, 0x6000, 0xF800, 0xF800, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0xC600, 0xC600, 0xC600, 0xFE00, 0x7E00, 0x0600, 0x7E00, 0x7C00 }, }, {'h', { 0x0000, 0x0000, 0xC000, 0xC000, 0xDC00, 0xFE00, 0xEE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x6000, 0x6000, 0x0000, 0xE000, 0xE000, 0x6000, 0x6000, 0x6000, 0x6000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'j', { 0x1800, 0x1800, 0x0000, 0x3800, 0x3800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'k', { 0x0000, 0x0000, 0xC000, 0xCC00, 0xDC00, 0xF800, 0xF000, 0xF000, 0xF800, 0xDC00, 0xCC00, 0xCC00, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xEC00, 0xFE00, 0xFE00, 0xD600, 0xD600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xDC00, 0xFE00, 0xEE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xE600, 0xFE00, 0xDC00, 0xC000, 0xC000, 0xC000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0xC600, 0xC600, 0xCE00, 0xFE00, 0x7600, 0x0600, 0x0600, 0x0600 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xDC00, 0xFE00, 0xE600, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0xC000, 0xFC00, 0x7E00, 0x0600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x6000, 0x6000, 0xF000, 0xF000, 0x6000, 0x6000, 0x6000, 0x6000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xCE00, 0xFE00, 0x7600, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x1000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xC600, 0xD600, 0xD600, 0xD600, 0xFE00, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3800, 0x7C00, 0xEE00, 0xC600, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3000, 0x7000, 0xE000, 0xC000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x1800, 0x3000, 0x6000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x3000, 0x7000, 0x6000, 0x6000, 0x6000, 0xE000, 0xE000, 0x6000, 0x6000, 0x7000, 0x7000, 0x3000, 0x0000 }, }, {'|', { 0x0000, 0xC000, 0xC000, 0xE000, 0x6000, 0x7000, 0x3000, 0x3800, 0x1800, 0x1C00, 0x0C00, 0x0C00, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0xC000, 0xE000, 0x6000, 0x6000, 0x6000, 0x7000, 0x7000, 0x6000, 0x6000, 0x6000, 0xE000, 0xC000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x2000, 0x7000, 0xF800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/feld/feld.cxx0000664000175000017500000003265712313064025013216 00000000000000// // feld.cxx -- FELDHELL modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This modem code owes much to the efforts of Joe Veldhuis, N8FQ // // Adapted from code contained in gmfsk source code distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include using namespace std; #include "feld.h" #include "fl_digi.h" #include "fontdef.h" #include "confdialog.h" #include "qrunner.h" #include "status.h" #include "debug.h" #include #include LOG_FILE_SOURCE(debug::LOG_MODEM); char feldmsg[80]; void feld::tx_init(SoundBase *sc) { scard = sc; txcounter = 0.0; tx_state = PREAMBLE; preamble = 3; prevsymb = false; videoText(); return; } void feld::rx_init() { rxcounter = 0.0; peakhold = 0.0; for (int i = 0; i < 2*RxColumnLen; i++ ) col_data[i] = 0; col_pointer = 0; peakhold = 0.0; minhold = 1.0; agc = 0.0; return; } void feld::init() { modem::init(); initKeyWaveform(); set_scope_mode(Digiscope::BLANK); put_MODEstatus(mode); } void feld::restart() { set_bandwidth(hell_bandwidth); } feld::~feld() { if (hilbert) delete hilbert; if (bpfilt) delete bpfilt; if (bbfilt) delete bbfilt; if (minmaxfilt) delete minmaxfilt; } feld::feld(trx_mode m) { double lp; mode = m; samplerate = FeldSampleRate; cap |= CAP_BW; switch (mode) { // Amplitude modulation modes case MODE_FELDHELL: feldcolumnrate = 17.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; filter_bandwidth = progdefaults.HELL_BW_FH; break; case MODE_SLOWHELL: feldcolumnrate = 2.1875; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; filter_bandwidth = progdefaults.HELL_BW_SH; break; case MODE_HELLX5: feldcolumnrate = 87.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; filter_bandwidth = progdefaults.HELL_BW_X5; break; case MODE_HELLX9: feldcolumnrate = 157.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; filter_bandwidth = progdefaults.HELL_BW_X9; break; // Frequency modulation modes case MODE_FSKHELL: feldcolumnrate = 17.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = 122.5; phi2freq = samplerate / M_PI / (hell_bandwidth / 2.0); filter_bandwidth = progdefaults.HELL_BW_FSK; cap |= CAP_REV; break; case MODE_FSKH105: feldcolumnrate = 17.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = 55; phi2freq = samplerate / M_PI / (hell_bandwidth / 2.0); filter_bandwidth = progdefaults.HELL_BW_FSK105; cap |= CAP_REV; break; case MODE_HELL80: feldcolumnrate = 35; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = 300; phi2freq = samplerate / M_PI / (hell_bandwidth / 2.0); filter_bandwidth = progdefaults.HELL_BW_HELL80; cap |= CAP_REV; break; default : feldcolumnrate = 17.5; break; } progdefaults.HELL_BW = filter_bandwidth; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); set_bandwidth(hell_bandwidth); wf->redraw_marker(); lp = filter_bandwidth / samplerate; bpfilt = new fftfilt(0, lp, 1024); bbfilt = new Cmovavg(8); average = new Cmovavg( static_cast(500 / downsampleinc)); minmaxfilt = new Cmovavg(120); blackboard = false; hardkeying = false; rxphacc = 0.0; txphacc = 0.0; } // rx section cmplx feld::mixer(cmplx in) { cmplx z; z = cmplx( cos(rxphacc), sin(rxphacc) ); z = z * in; rxphacc -= 2.0 * M_PI * frequency / samplerate; if (rxphacc > M_PI) rxphacc -= 2.0 * M_PI; else if (rxphacc < M_PI) rxphacc += 2.0 * M_PI; return z; } void feld::FSKHELL_rx(cmplx z) { double f; double vid; double avg; f = arg(conj(prev) * z) * phi2freq; prev = z; f = bbfilt->run(f); avg = average->run(abs(z)); rxcounter += downsampleinc; if (rxcounter < 1.0) return; rxcounter -= 1.0; if (avg > agc) agc = avg; else agc *= (1.0 - 0.01 / RxColumnLen); metric = CLAMP(1000*agc, 0.0, 100.0); display_metric(metric); vid = f + 0.5; vid = CLAMP(vid, 0.0, 1.0); if (mode == MODE_HELL80) vid = 1.0 - vid; if (reverse) vid = 1.0 - vid; if (blackboard) vid = 1.0 - vid; col_data[col_pointer + RxColumnLen] = (int)(vid * 255.0); col_pointer++; if (col_pointer == RxColumnLen) { if (metric > progStatus.sldrSquelchValue || progStatus.sqlonoff == false) { REQ(put_rx_data, col_data, col_data.size()); if (!halfwidth) REQ(put_rx_data, col_data, col_data.size()); } col_pointer = 0; for (int i = 0; i < RxColumnLen; i++) col_data[i] = col_data[i + RxColumnLen]; } } void feld::rx(cmplx z) { double x, avg; x = abs(z); if (x > peakval) peakval = x; avg = average->run(x); rxcounter += downsampleinc; if (rxcounter < 1.0) return; rxcounter -= 1.0; x = peakval; peakval = 0; if (x > peakhold) peakhold = x; else peakhold *= (1.0 - 0.02 / RxColumnLen); x = x / peakhold; x = CLAMP (x, 0.0, 1.0); if (avg > agc) agc = avg; else agc *= (1.0 - 0.01 / RxColumnLen); metric = CLAMP(1000*agc, 0.0, 100.0); display_metric(metric); if (blackboard) x = 255 * x; else x = 255 * (1.0 - x); col_data[col_pointer + RxColumnLen] = (int)x; col_pointer++; if (col_pointer == RxColumnLen) { if (metric > progStatus.sldrSquelchValue || progStatus.sqlonoff == false) { REQ(put_rx_data, col_data, col_data.size()); if (!halfwidth) REQ(put_rx_data, col_data, col_data.size()); } col_pointer = 0; for (int i = 0; i < RxColumnLen; i++) col_data[i] = col_data[i + RxColumnLen]; } } int feld::rx_process(const double *buf, int len) { cmplx z, *zp; int i, n; halfwidth = progdefaults.HellRcvWidth; blackboard = progdefaults.HellBlackboard; if (progdefaults.HELL_BW != filter_bandwidth) { double lp; filter_bandwidth = progdefaults.HELL_BW; switch (mode) { case MODE_FELDHELL: progdefaults.HELL_BW_FH = filter_bandwidth; break; case MODE_SLOWHELL: progdefaults.HELL_BW_SH = filter_bandwidth; break; case MODE_HELLX5: progdefaults.HELL_BW_X5 = filter_bandwidth; break; case MODE_HELLX9: progdefaults.HELL_BW_X9 = filter_bandwidth; break; case MODE_FSKHELL: progdefaults.HELL_BW_FSK = filter_bandwidth; break; case MODE_FSKH105: progdefaults.HELL_BW_FSK105 = filter_bandwidth; break; case MODE_HELL80: progdefaults.HELL_BW_HELL80 = filter_bandwidth; } lp = filter_bandwidth / samplerate; bpfilt->create_filter(0, lp); wf->redraw_marker(); } while (len-- > 0) { /* create analytic signal... */ z = cmplx( *buf, *buf ); buf++; hilbert->run(z, z); /* ...so it can be shifted in frequency */ z = mixer(z); n = bpfilt->run(z, &zp); switch (mode) { case MODE_FSKHELL: case MODE_FSKH105: case MODE_HELL80: for (i = 0; i < n; i++) { FSKHELL_rx(zp[i]); } break; default: for (i = 0; i < n; i++) rx(zp[i]); break; } } return 0; } //===================================================================== // tx section // returns value = column bits with b0 ... b13 the transmit rows respecfully // 1 = on, 0 = off // if all bits are 0 // and no lesser bits are set then character is complete // then return -1; int feld::get_font_data(unsigned char c, int col) { int bits = 0; int mask; int bin; int ordbits = 0; fntchr *font = 0; if (col > 15 || c < ' ' || c > '~') return -1; mask = 1 << (15 - col); switch (fntnbr) { case 0: font = feld7x7_14; break; case 1: font = feld7x7n_14; break; case 2: font = feldDx_14; break; case 3: font = feldfat_14; break; case 4: font = feldhell_12; break; case 5: font = feldlittle_12; break; case 6: font = feldlo8_14; break; case 7: font = feldlow_14; break; case 8: font = feldmodern_14; break; case 9: font = feldmodern8_14; break; case 10: font = feldnarr_14; break; case 11: font = feldreal_14; break; case 12: font = feldstyl_14; break; case 13: font = feldvert_14; break; case 14: font = feldwide_14; break; default: font = feld7x7_14; } for (int i = 0; i < 14; i++) ordbits |= font[c-' '].byte[i]; for (int row = 0; row < 14; row ++) { bin = font[c - ' '].byte[13 - row] & mask; if ( bin != 0) bits |= 1 << row; } int testval = (1 << (15 - col)) - 1; if ( (bits == 0) && ((ordbits & testval) == 0) ) return -1; return bits; } double feld::nco(double freq) { double x = sin(txphacc); txphacc += 2.0 * M_PI * freq / samplerate; if (txphacc > M_PI) txphacc -= 2.0 * M_PI; return x; } void feld::send_symbol(int currsymb, int nextsymb) { double tone = get_txfreq_woffset(); double tone2 = 0; double Amp = 1.0; double ncoval = 0; int outlen = 0; if (mode >= MODE_FSKHELL && mode <= MODE_HELL80) { tone += (reverse ? -1 : 1) * (prevsymb ? -1 : 1) * bandwidth / 2.0; tone2 += (reverse ? -1 : 1) * (currsymb ? -1 : 1) * bandwidth / 2.0; } for (;;) { switch (mode) { ncoval = nco(tone); case MODE_FSKHELL : case MODE_FSKH105 : case MODE_HELL80 : if ((tone2 != tone) && ((1.0 - fabs(ncoval)) < .001)) tone = tone2; break; case MODE_HELLX5 : case MODE_HELLX9 : Amp = currsymb; break; case MODE_FELDHELL : case MODE_SLOWHELL : default : if (prevsymb == 0 && currsymb == 1) { Amp = OnShape[outlen]; } else if (currsymb == 1 && nextsymb == 0) { Amp = OffShape[outlen]; } else Amp = currsymb; break; } outbuf[outlen++] = Amp * nco(tone); if (outlen >= OUTBUFSIZE) { LOG_DEBUG("feld reset"); break; } txcounter += upsampleinc; if (txcounter < 1.0) continue; txcounter -= 1.0; break; } prevsymb = currsymb; // write to soundcard & display ModulateXmtr(outbuf, outlen); rx_process(outbuf, outlen); } void feld::send_null_column() { for (int i = 0; i < 14; i++) send_symbol(0, 0); } void feld::tx_char(char c) { int column = 0; int bits, colbits; int currbit, nextbit; send_null_column(); if (c == ' ') { send_null_column(); send_null_column(); send_null_column(); } else { while ((bits = get_font_data(c, column)) != -1) { for (int col = 0; col < dxmode; col++) { colbits = bits; for (int i = 0; i < 14; i++) { currbit = colbits & 1; colbits = colbits >> 1; nextbit = colbits & 1; send_symbol(currbit, nextbit); } } column++; } } send_null_column(); return; } int feld::tx_process() { int c; bool hdkey; dxmode = progdefaults.HellXmtWidth; hdkey = progdefaults.HellPulseFast; fntnbr = progdefaults.feldfontnbr; if (hardkeying != hdkey) { hardkeying = hdkey; initKeyWaveform(); } if (tx_state == PREAMBLE) { if (preamble-- > 0) { tx_char('.'); return 0; } tx_state = DATA; } if (tx_state == POSTAMBLE) { if (postamble-- > 0) { tx_char('.'); return 0; } tx_char(' '); tx_state = PREAMBLE; cwid(); return -1; } c = get_tx_char(); if (c == GET_TX_CHAR_ETX || stopflag) { tx_state = POSTAMBLE; postamble = 3; return 0; } // if TX buffer empty // send idle character if (c == GET_TX_CHAR_NODATA) { if (progdefaults.HellXmtIdle == true) c = '.'; else { send_null_column(); send_null_column(); return 0; } } if (c == '\r' || c == '\n') c = ' '; tx_char(c); return 0; } void feld::initKeyWaveform() { for (int i = 0; i < MAXLEN; i++) { OnShape[i] = 1.0; OffShape[i] = 0.0; } for (int i = 0; i < 32; i++) { if (hardkeying == false) OnShape[i] = 0.5*(1.0 - cos(M_PI * i / 33)); // raised cosine with 4 msec rise else if (i < 16) OnShape[i] = 0.5*(1.0 - cos(M_PI * i / 16)); // raised cosine with 2 msec rise OffShape[31 - i] = OnShape[i]; } } fldigi-3.21.80/src/feld/FeldHell-12.cxx0000664000175000017500000003101612313064025014167 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feldhell-12 font fntchr feldhell_12[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7000, 0xF800, 0xA800, 0xA000, 0xF000, 0x7800, 0x2800, 0xA800, 0xF800, 0x7000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA000, 0xA000, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x6000, 0x2000, 0x2000, 0x6000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x7000, 0xF800, 0xF800, 0x7000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x7000, 0xF800, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0xF000, 0xF800, 0x0800, 0x0800, 0x3800, 0x3800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x7800, 0x7800, 0x4000, 0x4000, 0x7000, 0x7800, 0x0800, 0x0800, 0x1800, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x1800, 0x7000, 0x6000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0xC000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x7800, 0xF800, 0xC000, 0x8000, 0x9800, 0x9800, 0x8800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xF000, 0x7000, 0x1800, 0x0800, 0x0000 }, }, {'R', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0xBA00, 0xEE00, 0x4400, 0x0000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4800, 0xC800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0xFE00, 0xFE00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x7800, 0xF800, 0xC000, 0x8000, 0x9800, 0x9800, 0x8800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'h', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'k', { 0x0000, 0x8800, 0x9800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x9800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'q', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xF000, 0x7000, 0x1800, 0x0800, 0x0000 }, }, {'r', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0xBA00, 0xEE00, 0x4400, 0x0000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'z', { 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4800, 0xC800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/feld/FeldDx-14.cxx0000664000175000017500000003101212313064025013654 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feldDx-14 font fntchr feldDx_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000 }, }, {'"', { 0x0000, 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7000, 0xF800, 0xA800, 0xA000, 0xF000, 0x7800, 0x2800, 0xA800, 0xF800, 0x7000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA000, 0xA000, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x6000, 0x2000, 0x2000, 0x6000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x7000, 0xF800, 0xF800, 0x7000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0xF800, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xF000, 0xF800, 0x0800, 0x0800, 0x3800, 0x3800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0x7800, 0x7800, 0x4000, 0x4000, 0x7000, 0x7800, 0x0800, 0x0800, 0x1800, 0xF000, 0xE000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x1800, 0x7000, 0x6000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x0C00, 0x3F00, 0xF3C0, 0xC0C0, 0xC0C0, 0xFFC0, 0xFFC0, 0xC0C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xFF80, 0xFFE0, 0x3060, 0x3060, 0x3F80, 0x3F80, 0x3060, 0x3060, 0xFFE0, 0xFF80, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x3F00, 0xFFC0, 0xF0C0, 0xC000, 0xC000, 0xC000, 0xC000, 0xF0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xFF00, 0xFFC0, 0x30C0, 0x30C0, 0x30C0, 0x30C0, 0x30C0, 0x30C0, 0xFFC0, 0xFF00, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xFFC0, 0xFFC0, 0xC000, 0xC000, 0xFFC0, 0xFFC0, 0xC000, 0xC000, 0xFFC0, 0xFFC0, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xFFC0, 0xFFC0, 0xC000, 0xC000, 0xFC00, 0xFC00, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x3FC0, 0xFFC0, 0xF000, 0xC000, 0xC3C0, 0xC3C0, 0xC0C0, 0xF0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xFFC0, 0xFFC0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0xC0C0, 0xC0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xC3C0, 0xCF00, 0xFC00, 0xFC00, 0xCF00, 0xC3C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xFFC0, 0xFFC0, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0xC00C, 0xF03C, 0xFCFC, 0xCFCC, 0xC30C, 0xC00C, 0xC00C, 0xC00C, 0xC00C, 0xC00C, 0x000C, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0xC0C0, 0xF0C0, 0xF0C0, 0xFCC0, 0xCCC0, 0xCFC0, 0xC3C0, 0xC3C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x3F00, 0xFFC0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xFF00, 0xFFC0, 0x30C0, 0x30C0, 0x3FC0, 0x3F00, 0x3000, 0x3000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x3F00, 0xFFC0, 0xF3C0, 0xC0C0, 0xC0C0, 0xCCC0, 0xCCC0, 0xCFC0, 0xFF00, 0x3F00, 0x03C0, 0x00C0 }, }, {'R', { 0x0000, 0x0000, 0xFF80, 0xFFE0, 0xC060, 0xC060, 0xFFE0, 0xFF80, 0xC180, 0xC1E0, 0xC060, 0xC060, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x3FC0, 0xFFC0, 0xC000, 0xC000, 0xFF00, 0x3FC0, 0x00C0, 0x00C0, 0xFFC0, 0xFF00, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xFFC0, 0xFFC0, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xC3C0, 0xC300, 0xCF00, 0xCC00, 0xFC00, 0xF000, 0xF000, 0xC000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0xC30C, 0xC30C, 0xC30C, 0xC30C, 0xC30C, 0xC30C, 0xC30C, 0xCFCC, 0xFCFC, 0x3030, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xF3C0, 0x3F00, 0x0C00, 0x0C00, 0x3F00, 0xF3C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xF3C0, 0x3300, 0x3F00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xFFC0, 0xFFC0, 0x03C0, 0x0300, 0x0F00, 0x3C00, 0x30C0, 0xF0C0, 0xFFC0, 0xFFC0, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x7800, 0xF800, 0xC000, 0x8000, 0x9800, 0x9800, 0x8800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'k', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'q', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xF000, 0x7000, 0x1800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0xBA00, 0xEE00, 0x4400, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4800, 0xC800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000 }, }, {'|', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000 }, }, {'~', { 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/feld/FeldLittle-12.cxx0000664000175000017500000003102512313064025014540 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feld little - 12 font fntchr feldlittle_12[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7000, 0xF800, 0xA800, 0xA000, 0xF000, 0x7800, 0x2800, 0xA800, 0xF800, 0x7000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA000, 0xA000, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x6000, 0x2000, 0x2000, 0x6000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x7000, 0xF800, 0xF800, 0x7000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xE000, 0xF000, 0x1000, 0x1000, 0x7000, 0x7000, 0x1000, 0x1000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xF000, 0x1000, 0x1000, 0x3000, 0xE000, 0xC000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xA000, 0xF000, 0xD000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000 }, }, {'7', { 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'8', { 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0xF000, 0x6000, 0x6000, 0xF000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0xF000, 0x7000, 0x1000, 0x1000, 0x3000, 0x6000, 0x4000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x1000, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0xE000, 0xE000, 0x9000, 0x9000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x8000, 0x8000, 0x8000, 0x8000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0xB000, 0xB000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0x9000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0xB000, 0xE000, 0xE000, 0xB000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x9000, 0xD000, 0xF000, 0xB000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0xF000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0xD000, 0xF000, 0xB000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'R', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0xF000, 0xE000, 0xA000, 0xB000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0xE000, 0x7000, 0x1000, 0x1000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0xA000, 0xA000, 0xA000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x3000, 0x6000, 0xC000, 0xC000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x7000, 0x1000, 0x7000, 0xF000, 0x9000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0x6000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x1000, 0x1000, 0x7000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0xF000, 0xF000, 0x8000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x9000, 0x9000, 0xB000, 0xF000, 0x5000, 0x1000, 0x7000, 0x6000, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x2000, 0x2000, 0x0000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xA000, 0xE000, 0x4000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x8000, 0xA000, 0xA000, 0xE000, 0xC000, 0xC000, 0xE000, 0xA000, 0xA000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xA000, 0xF000, 0xD000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0xF000, 0xE000, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x9000, 0x9000, 0x9000, 0xF000, 0x7000, 0x1000, 0x1000, 0x1000 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xF000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0xE000, 0x7000, 0x1000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xE000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0xA000, 0xA000, 0xE000, 0x4000, 0x4000, 0xE000, 0xA000, 0xA000, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0xD000, 0x7000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF000, 0x3000, 0x2000, 0x6000, 0xC000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/feld/FeldModern-14.cxx0000664000175000017500000003102312313064025014527 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feld modern-14 font fntchr feldmodern_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0xD800, 0xD800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x2000, 0x7800, 0xF800, 0xA000, 0xF000, 0x7800, 0x2800, 0xF800, 0xF000, 0x2000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0x4000, 0xE400, 0xE400, 0x4C00, 0x1800, 0x3000, 0x6000, 0xC800, 0x9C00, 0x9C00, 0x8800, 0x0000, 0x0000 }, }, {'&', { 0x0000, 0x3000, 0x7800, 0x4800, 0x4800, 0x7000, 0xF400, 0x8C00, 0x8800, 0xFC00, 0x7400, 0x0000, 0x0000, 0x0000 }, }, { 39, { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0xC000, 0xC000, 0xC000, 0x4000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x9800, 0xB800, 0xE800, 0xC800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x1800, 0x3000, 0x3800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3000, 0x7000, 0x5000, 0xD000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0xD800, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x7800, 0x7000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'<', { 0x0000, 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x0000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'@', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0xB400, 0xBC00, 0xB800, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF000, 0xF000, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x3000, 0x7800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0x7800, 0x3000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x3800, 0x7800, 0xC000, 0x8000, 0x9800, 0x9800, 0x8800, 0xC800, 0x7800, 0x3000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xF800, 0x7000, 0x1000, 0x1000 }, }, {'R', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8000, 0xF000, 0x7800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7800, 0x0800, 0x7800, 0xF800, 0x8800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0800, 0x0800, 0x6800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0xF800, 0xF800, 0x8000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3800, 0x7800, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x7800, 0x7000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x4000, 0x4000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x1000, 0x1000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0xF000, 0x6000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x8000, 0x9000, 0xB000, 0xE000, 0xC000, 0xE000, 0xB000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xC800, 0xF800, 0xB000, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0xF000, 0x7800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x3000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x7800, 0x7000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x3000, 0x6000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x9800, 0xFC00, 0x6400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/feld/feldfonts.cxx0000664000175000017500000000303012313064025014247 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "fontdef.h" #include "Feld7x7-14.cxx" #include "Feld7x7n-14.cxx" #include "FeldDx-14.cxx" #include "FeldFat-14.cxx" #include "FeldHell-12.cxx" #include "FeldLittle-12.cxx" #include "FeldLo8-14.cxx" #include "FeldLow-14.cxx" #include "FeldModern-14.cxx" #include "FeldModern8-14.cxx" #include "FeldNarr-14.cxx" #include "FeldReal-14.cxx" #include "FeldStyl-14.cxx" #include "FeldVert-14.cxx" #include "FeldWide-14.cxx" char szFeldFonts[] = "\ 7x7 14|\ 7x7n 14|\ Dx 14|\ fat 14|\ hell 12|\ little 12|\ lo8 14|\ low 14|\ modern 14|\ modern8 14|\ narr 14|\ real 14|\ style 14|\ vert 14|\ wide 14"; fldigi-3.21.80/src/feld/Feld7x7n-14.cxx0000664000175000017500000003101712313064025014111 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // feld 7x7n-14 font fntchr feld7x7n_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0x0000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7800, 0x7800, 0xA000, 0xA000, 0x7000, 0x7000, 0x2800, 0x2800, 0xF000, 0xF000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0x0000, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x0000, 0x0000 }, }, {'&', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x6800, 0x6800, 0x9000, 0x9000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x6000, 0x6000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0xC000, 0xC000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0xA800, 0xA800, 0x7000, 0x7000, 0xF800, 0xF800, 0x7000, 0x7000, 0xA800, 0xA800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0000, 0x0800, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x6000, 0x6000, 0xA000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x1000, 0x1000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3000, 0x3000, 0x5000, 0x5000, 0x9000, 0x9000, 0xF000, 0xF000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x1000, 0x1000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0xE000, 0xE000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x6000, 0x6000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x7000, 0x7000, 0x1000, 0x1000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x0800, 0x3000, 0x3000, 0xC000, 0xC000, 0x3000, 0x3000, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0x8000, 0x6000, 0x6000, 0x1800, 0x1800, 0x6000, 0x6000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'@', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0xB000, 0xB000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0xE000, 0xE000, 0x9000, 0x9000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0xB000, 0xB000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0xA000, 0xA000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0xD800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x9000, 0x9000, 0xD000, 0xD000, 0xB000, 0xB000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xB000, 0x7000, 0x7000, 0x1000, 0x1000 }, }, {'R', { 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0xE000, 0xE000, 0xA000, 0xA000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0x6000, 0x6000, 0x1000, 0x1000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x2000, 0x2000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0x4000, 0x4000, 0x2000, 0x2000, 0x1000, 0x1000, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0x8000, 0x8000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x1000, 0x1000, 0xF000, 0xF000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x1000, 0x1000, 0x7000, 0x7000, 0x9000, 0x9000, 0x9000, 0x9000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0xF000, 0xF000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3000, 0x3000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x9000, 0x9000, 0x7000, 0x7000, 0x1000, 0x1000, 0x6000, 0x6000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0x9000, 0x6000, 0x6000 }, }, {'k', { 0x0000, 0x0000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0xA000, 0xA000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xD000, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0x9000, 0xE000, 0xE000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x9000, 0x9000, 0x9000, 0x9000, 0x7000, 0x7000, 0x1000, 0x1000 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xB000, 0xC000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0xC000, 0xC000, 0x3000, 0x3000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x3000, 0x3000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x6000, 0x6000, 0x6000, 0x6000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x5000, 0x5000, 0x2000, 0x2000, 0x2000, 0x2000, 0x4000, 0x4000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x0000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'|', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-3.21.80/src/dialogs/0000775000175000017500000000000012313333727012343 500000000000000fldigi-3.21.80/src/dialogs/guide.cxx0000664000175000017500000030537012313333725014112 00000000000000const char* szBeginner = "\n\ \n\ \n\ \n\ \n\ Beginners' Guide to Fldigi\n\ \n\ \n\ \n\ \n\

\n\

Beginners' Guide to Fldigi

\n\
\n\
Table of Contents
\n\ \n\
\n\
\n\
\n\
\n\
\n\
\n\
\n\

Of necessity, this Beginners' Guide contains only as much as you need to know to\n\ get started. You should learn how to make best use of the program by reading the\n\ Online Documentation. You can also access it from within the Fldigi program from the Help\n\ menu item.

\n\
\n\
\n\
\n\
\n\

1. Beginners' Questions Answered

\n\
\n\
\n\

1.1. What is Fldigi?

\n\

Fldigi is a computer program intended for Amateur Radio Digital Modes\n\ operation using a PC (Personal Computer). Fldigi operates (as does most similar\n\ software) in conjunction with a conventional HF SSB radio transceiver, and uses\n\ the PC sound card as the main means of input from the radio, and output to the\n\ radio. These are audio-frequency signals. The software also controls the radio\n\ by means of another connection, typically a serial port.

\n\

Fldigi is multi-mode, which means that it is able to operate many popular\n\ digital modes without switching programs, so you only have one program to\n\ learn. Fldigi includes all the popular modes, such as DominoEX, MFSK16, PSK31,\n\ and RTTY.

\n\

Unusually, Fldigi is available for multiple computer operating systems;\n\ FreeBSD™; Linux™, OS X™ and Windows™.

\n\
\n\
\n\

1.2. What is a Digital Mode?

\n\

Digital Modes are a means of operating Amateur radio from the computer\n\ keyboard. The computer acts as modem (modulator - demodulator), as well as\n\ allowing you to type, and see what the other person types. It also controls the\n\ transmitter, changes modes as required, and provides various convenient features\n\ such as easy tuning of signals and prearranged messages.

\n\

In this context, we are talking about modes used on the HF (high frequency)\n\ bands, specifically chat modes, those used to have a regular conversation in a\n\ similar way to voice or Morse, where one operator talks for a minute or two,\n\ then another does the same. These chat modes allow multiple operators to take\n\ part in a net.

\n\

Because of sophisticated digital signal processing which takes place inside the\n\ computer, digital modes can offer performance that cannot be achieved using\n\ voice (and in some cases even Morse), through reduced bandwidth, improved\n\ signal-to-noise performance and reduced transmitter power requirement. Some\n\ modes also offer built-in automatic error correction.

\n\

Digital Mode operating procedure is not unlike Morse operation, and many of the\n\ same abbreviations are used. Software such as Fldigi makes this very simple as\n\ most of the procedural business is set up for you using the Function Keys at the\n\ top of the keyboard. These are easy to learn.

\n\
\n\
\n\

1.3. Why all the different modes?

\n\

HF propagation is very dependent on the ionosphere, which reflects the signals\n\ back to earth. There are strong interactions between different signals arriving\n\ from different paths. Experience has shown that particular modulation systems,\n\ speeds and bandwidths suit different operating conditions.

\n\

Other factors such as available band space, operating speed and convenience,\n\ noise level, signal level and available power also affect the choice of\n\ mode. While in many cases several different modes might be suitable, having a\n\ choice adds to the operating pleasure. It is difficult to advise which mode is\n\ best for each particular occasion, and experience plays an important role.\n\
[To gain a good insight into each mode and its capabilities, you might\n\ consider purchasing Digital Modes for All Occasions (ISBN 1-872309-82-8) by\n\ Murray Greenman ZL1BPU, published by the RSGB and also available from\n\ FUNKAMATEUR and CQ Communications; or the ARRL’s HF Digital Handbook (ISBN\n\ 0-87259-103-4) by Steve Ford, WB8IMY.]

\n\
\n\
\n\

1.4. How do I recognise and tune in the signals?

\n\

Recognising the different modes comes with experience. It is a matter of\n\ listening to the signal, and observing the appearance of the signal on the\n\ tuning display. You can also practise transmitting with the transceiver\n\ disconnected, listening to the sound of the signals coming from the\n\ computer. There is also (see later paragraph) an automatic tuning option which\n\ can recognise and tune in most modes for you.

\n\

The software provides a tuning display which shows the radio signals that are\n\ receivable within the transceiver passband. Using a point and click technique\n\ with the mouse, you can click on the centre of a signal to select it, and the\n\ software will tune it in for you. Some modes require more care than others, and\n\ of course you need to have the software set for the correct mode first — not\n\ always so easy!

\n\

The RSID (automatic mode detection and tuning) feature uses a\n\ special sequence of tones transmitted at the beginning of each transmission to\n\ identify and tune in the signals received. For this feature to work, not only do\n\ you need to enable the feature in the receiver, but in addition the stations you\n\ are wishing to tune in need to have this feature enabled on transmission. Other\n\ programs also offer this RSID feature as an option.

\n\
\n\
\n\
\n\
\n\

2. Setting Up

\n\
\n\
\n\

2.1. Fldigi settings

\n\
Essentials
    \n\
  • \n\

    \n\ Use the menu Configure→Operator item to set the operator name, callsign,\n\ locator and so on.\n\

    \n\
  • \n\
  • \n\

    \n\ If you have more than one sound card, use the menu Configure→Sound Card,\n\ Audio Devices tab, to select the sound card you wish to use. You can ignore\n\ the other tabs for now.\n\

    \n\
  • \n\
\n\
Rig Control
    \n\
  • \n\

    \n\ Use the menu Configure→Rig Control item to set how you will control the\n\ rig. If you will key the rig via a serial port, in the Hardware PTT tab\n\ select Use serial port PTT, the device name you will use, and which line\n\ controls PTT. If in doubt, check both RTS and DTR. You must then press\n\ the Initialize button.\n\

    \n\
  • \n\
  • \n\

    \n\ If you plan to use CAT control of the rig via the COM port, check Use Hamlib\n\ in the Hamlib tab. Select your rig model from the drop-down menu and set the\n\ serial port device name, baud rate, and RTS/CTS options as needed. If in\n\ addition you wish to use PTT control via CAT, also check PTT via Hamlib\n\ command. You must then press the Initialize button.\n\

    \n\
  • \n\
\n\
\n\ \n\ \n\ \n\
\n\ \"Note\"\n\ \n\

If your rig is CAT-capable but not yet supported by\n\ Hamlib, it may still be possible to control it via\n\ Fldigi’s RigCAT system. Refer to the Online Documentation for details.

\n\
\n\
\n\
CPU Speed
    \n\
  • \n\

    \n\ When you start Fldigi for the very first time, it makes a series of\n\ measurements to determine your computer’s processing speed. Although these\n\ measurements are usually accurate, if you have a very slow processor (under\n\ 700MHz), you should verify that Slow CPU under Configure→Misc→CPU has\n\ been enabled. The receiver decoding strategy of certain modems uses fewer\n\ processor cycles in this mode.\n\

    \n\
  • \n\
\n\
Modems
    \n\
  • \n\

    \n\ Each of the modems can be individually set up from the Configure→Modems\n\ multi-tabbed dialog. You need not change anything here to start with, although\n\ it might be a good idea to set the secondary text for DominoEX and THOR to\n\ something useful, such as your call and locator.
    [Secondary text is\n\ transmitted when the text you type does not keep up with the typing speed of\n\ the mode — this handy text appears in a small window at the very bottom of the\n\ screen.]
    Note that this set of tabs is also where you set the RTTY modem speed\n\ and shift, although the default values should be fine for normal operation.\n\

    \n\
  • \n\
\n\
Other settings
    \n\
  • \n\

    \n\ Use the menu Configure→UI, Restart tab, to set the aspect ratio of the\n\ waterfall display and whether or not you want to dock a second digiscope to\n\ the main window.\n\

    \n\
  • \n\
  • \n\

    \n\ Use the menu Configure→IDs item to set whether you wish to transmit RSID\n\ data at the start of each over (this is for the benefit of others and does not\n\ affect RSID reception). If you plan to regularly use the RSID feature on\n\ receive, you should deselect the option that starts new modems at the “sweet\n\ spot” frequencies in Misc→Sweet Spot.\n\

    \n\
  • \n\
\n\

Finally, use the menu item Configure→Save Config to save the new\n\ configuration.

\n\
\n\
\n\

2.2. Sound Card Mixer

\n\
    \n\
  • \n\

    \n\ Use your sound card Master Volume applet to select the sound card, the Wave\n\ output and set the transmit audio level. You can check the level using the\n\ Tune button, top right, beyond the Menu.\n\

    \n\
  • \n\
  • \n\

    \n\ On Windows, the Volume applet can usually be opened by clicking\n\ Start→Run… and entering sndvol32, or from the Control Panel.\n\

    \n\
  • \n\
  • \n\

    \n\ Use your sound card Recording Control applet to select the sound card, the\n\ Line or Mic input and set the receiver audio level. Watch the waterfall\n\ display for receiver noise when setting the level. If you see any dark blue\n\ noise, you have the right input and about the right level. The actual setting\n\ is not very important, provided you see blue noise. If the audio level is too\n\ high, the little diamond shaped indicator (bottom right) will show red. The\n\ waterfall may also show red bands. Performance will be degraded if the level\n\ is too high.\n\

    \n\
  • \n\
  • \n\

    \n\ On Windows, the Record applet can usually be opened by clicking\n\ Start→Run… and entering sndvol32, or from the Control Panel. If opened\n\ from the Control Panel, you’ll end up with the Master Volume applet, and need\n\ to switch using Options→Properties, and selecting the Recording radio\n\ button.\n\

    \n\
  • \n\
\n\
\n\
\n\
\n\
\n\

3. Guided Tour

\n\
\n\

The main window consists of three main panes. Study it carefully as you read\n\ these notes. From top to bottom, these are the Receive pane (navajo white), the\n\ Transmit pane (light cyan), and the Waterfall pane (black). At the top is the\n\ collection of entry items which form the Log Data, and at the very top, a\n\ conventional drop-down Menu system, with entries for File, Op Mode, Configure,\n\ View and Help.

\n\

Between the Transmit and the Waterfall panes is a line of boxes (buttons) which\n\ represent the Function Keys F1 - F12. This is the Macro group. Below the\n\ Waterfall pane is another line of boxes (buttons), which provide various control\n\ features. This is the Controls group. The program and various buttons can mostly\n\ be operated using the mouse or the keyboard, and users generally find it\n\ convenient to use the mouse while tuning around, and the keyboard and function\n\ keys during a QSO.

\n\
\n\

3.1. Receive Pane

\n\

This is where the text from decoded incoming signals is displayed, in black\n\ text. When you transmit, the transmitted text is also displayed here, but in red,\n\ so the Receive pane becomes a complete record of the QSO. The information in\n\ this pane can also be logged to a file.

\n\

The line at the bottom of this pane can be dragged up and down with the\n\ mouse. You might prefer to drag it down a bit to enlarge the Receive pane and\n\ reduce the size of the Transmit pane.

\n\
\n\
\n\

3.2. Transmit Pane

\n\

This is where you type what you want to transmit. The mouse must click in here\n\ before you type (to obtain focus) otherwise your text will go nowhere. You can\n\ type in here while you are receiving, and when you start transmitting, the text\n\ already typed will be sent first. This trick is a cool way to impress others\n\ with your typing speed! As the text is transmitted, the text colour changes from\n\ black to red. At the end of the over, all the transmitted text (and any as yet\n\ not transmitted) will be deleted.

\n\
\n\
\n\

3.3. Waterfall Pane

\n\

This is the main tuning facility. There are three modes, Waterfall, FFT and\n\ Signal, selected by a button in the Control group. For now, leave it in\n\ Waterfall mode, as this is the easiest to tune with, and gives the best\n\ identification of the signal.

\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
\n\ WF (Waterfall)\n\
\n\
\n\

\n\ A spectrogram display of signal strength versus frequency over passing\n\ time. The receiver passband is analysed and displayed with lower frequencies\n\ to the left, higher to the right. Weak signals and background noise are dark\n\ while stronger signals show as brighter colours. As time passes (over a few\n\ seconds), the historic signals move downwards like a waterfall.\n\

\n\
\n\ FFT (Fast Fourier Transform)\n\
\n\
\n\

\n\ A spectrum display of the mean signal strength versus frequency. Again\n\ frequency is displayed from left to right, but now the vertical direction\n\ shows signal strength and there is no brightness or historic information.\n\

\n\
\n\ SIG (Signal)\n\
\n\
\n\

\n\ An oscilloscope type of display showing the raw audio being captured by the\n\ sound card.\n\

\n\
\n\

At the top of the pane is a scale of frequency in Hz, which corresponds to the\n\ frequency displayed immediately below it. This scale can be moved around and\n\ zoomed using buttons in the Control group.

\n\

As you move the mouse around in this pane you will see a yellow group of tuning\n\ marks following the mouse pointer. Tuning is achieved by left-clicking on a\n\ signal displayed by the waterfall in this pane. Use these yellow marks to\n\ exactly straddle the signal and then left-click on the centre of the signal. The\n\ tuning marks change to red. The red vertical lines will show the approximate\n\ width of the active signal area (the expected signal bandwidth), while a red\n\ horizontal bar above will indicate the receiver software’s active decoding\n\ range. When you left-click, the red marks move to where you clicked, and will\n\ attempt to auto-track the signal from there.

\n\
\n\ \n\ \n\ \n\
\n\ \"Tip\"\n\ \n\
Audio history and “casual tuning”
\n\

You can temporarily “monitor” a different signal by right-clicking on it. As\n\ long as you hold the mouse button down, the signal under it will be decoded; as\n\ soon as you release the mouse, decoding will revert to the previously tuned spot\n\ (where the red marks are). If you also hold the Control key down before\n\ right-clicking, Fldigi will first decode all of its buffered audio at that\n\ frequency.

\n\
\n\
\n\
\n\
\n\

3.4. Log Data

\n\

Fldigi provides two QSO entry views, one for casual QSO logging and the second\n\ for contesting. The View→Contest fields menu item switches between the two\n\ modes.

\n\

The Frequency, Time Off, and (when in contest mode) #Out fields are filled\n\ by the program. All the others can be populated by manual keyboard entry or by\n\ selection from the Receive pane. The Time Off field is\n\ continuously updated with the current GMT time. The Time On field will be\n\ filled in when the Call is updated, but can be modified later by the operator.

\n\

A right click on the Receive pane brings up a context sensitive menu that will\n\ reflect which of the two QSO capture views you have open. If you highlight text\n\ in the Receive pane then the menu selection will operate on that text. If you\n\ simply point to a word of text and right click then the menu selection will\n\ operate on the single word.

\n\
\n\ \n\ \n\ \n\
\n\ \"Tip\"\n\ \n\
Quick log entry
\n\

Certain fields (Call, Name, RST In, QTH and Locator) may also be\n\ populated semi-automatically. Point to a word in the Receive pane and either\n\ double-left-click or hold a Shift key down and left-click. The program will\n\ then use some simple heuristics to decide which log field will receive the text.

\n\
\n\
\n\

It is generally not possible to distinguish between Operator and QTH names. For\n\ this reason, Fldigi will use the first non-Call and non-Locator word to fill the\n\ Name field, and subsequent clicks will send text to the QTH field.\n\ Likewise, a text string may be both a valid callsign and a valid\n\ IARU (Maidenhead) locator.\n\ For best results, you should attempt to fill the log fields in the order in\n\ which they appear on the main window, and clear the log fields after logging the\n\ QSO. Of course, text can always be manually typed or pasted into any of the log\n\ fields!

\n\

You can query online and local (e.g. CD) database systems for data regarding a\n\ callsign. You make the query by either clicking on the globe button, or\n\ selecting Look up call from the popup menu. The latter will also move the\n\ call to the Call field.

\n\

When the Call field is filled in, the logbook will be searched for the most\n\ recent QSO with that station and, if an entry is found, the Name, QTH and\n\ other fields will be pre-filled. If the logbook dialog is open, that last QSO\n\ will also be selected for viewing in the logbook.

\n\

You open the logbook by selecting from the View menu; View→Logbook. The\n\ logbook title bar will show you which logbook you currently have open. Fldigi\n\ can maintain an unlimited (except for disk space) number of logbooks.

\n\
\n\
\n\

3.5. Menu

\n\

At the very top of the program window is a conventional drop-down menu. If you\n\ click on any of the items, a list of optional functions will appear. Keyboard\n\ menu selection is also provided. Where underscored characters are shown in the\n\ menu, you can select these menu items from the keyboard using the marked\n\ character and Alt at the same time, then moving around with the\n\ up/down/left/right keys. Press Esc to quit from the menu with no\n\ change.

\n\
\n\

3.5.1. Menu functions

\n\
File

Allows you to open or save Macros (we won’t get into that here), turn on/off\n\ logging to file, record/play audio samples, and exit the program. You can also\n\ exit the program by clicking on the X in the top right corner of the window,\n\ in the usual manner.

\n\
Op Mode

This is where you select the operating modem used for transmission and\n\ reception. Some modes only have one option. Where more are offered, drag the\n\ mouse down the list and sideways following the arrow to a secondary list, before\n\ releasing it. When you start the program next time, it will remember the last\n\ mode you used.

\n\

Not all the modes are widely used, so choose a mode which (a) maximises your\n\ chance of a QSO, and (b) is appropriate for the band, conditions, bandwidth\n\ requirements and permissions relevant to your operating licence.

\n\

At the bottom of the list are two “modes” which aren’t modes at all, and do not\n\ transmit (see Online Documentation for details). WWV mode allows you to receive a\n\ standard time signal so the beeps it transmits can be used for sound card\n\ calibration. Freq Analysis provides just a waterfall display with a very\n\ narrow cursor, and a frequency meter which indicates the received frequency in\n\ Hz to two decimal places. This is useful for on-air frequency measurement.

\n\
Configure

This is where you set up the program to suit your computer, yourself and your\n\ operating preferences. The operating settings of the program are grouped into\n\ several categories and there are menu items in which you enter your personal\n\ information, or define your computer sound card, for example. Modems can be\n\ individually changed, each having different adjustments. The Modems dialog has\n\ multiple tabs, so you can edit any one of them. Don’t fool with the settings\n\ until you know what you are doing! The final item, Save Config allows you to\n\ save the altered configuration for next time you start the program (otherwise\n\ changes are temporary).

\n\
View

This menu item allows you to open extra windows. Most will be greyed out, but\n\ two that are available are the Digiscope, and the PSK Browser. The Digiscope\n\ provides a mode-specific graphical analysis of the received signal, and can have\n\ more than one view (left click in the new window to change the view), or maybe\n\ none at all. The PSK Browser is a rather cool tool that allows you to monitor\n\ several PSK31 signals all at the same time! These windows can be resized to\n\ suit.

\n\
Help

Brings up the Online Documentation, the Fldigi Home Page, and various\n\ information about the program.

\n\
\n\
\n\

3.5.2. Other controls

\n\
RSID

The RxID button turns on the receive RSID (automatic mode detection and tuning)\n\ feature. When in use, the button turns yellow and no text reception is possible\n\ until a signal is identified, or the feature is turned off again. If you plan to\n\ use the RSID feature on receive, you must leave the Start New Modem at Sweet\n\ Spot item in the menu Configure→Defaults→Misc tab unchecked.

\n\
TUNE

This button transmits a continuous tone at the current audio frequency. The tone\n\ level will be at the maximum signal level for any modem, which makes this\n\ function useful for adjusting your transceiver’s output power.

\n\
\n\
\n\
\n\

3.6. Macro buttons

\n\

This line of buttons provides user-editable QSO features. For example, the first\n\ button on the left sends CQ for you. Both the function of these buttons (we call\n\ them Macros) and the label on each button, can be changed.

\n\

Select each button to use it by pressing the corresponding Function Key (F1 -\n\ F12, you’ll notice the buttons are grouped in patterns four to a group, just as\n\ the Function Keys are). You can also select them with a left-click of the\n\ mouse. If you right-click on the button, you are able to edit the button’s label\n\ and its function. A handy dialog pops up to allow this to be done. There are\n\ many standard shortcuts, such as <MYCALL>, which you can use within the\n\ Macros. Notice that the buttons also turn the transmitter on and off as\n\ necessary.

\n\

You can just about hold a complete QSO using these buttons from left to right\n\ (but please don’t!). Notice that at the right are two spare buttons you can set\n\ as you wish, and then a button labelled 1. Yes, this is the first set of\n\ four sets of Macros, and you can access the others using this button, which\n\ changes to read 2, 3, 4 then 1 again (right-click to go backwards), or\n\ by pressing Alt and the corresponding number (1-4, not F1-F4) at the same\n\ time.

\n\
\n\ \n\ \n\ \n\
\n\ \"Note\"\n\ \n\

If you really mess up the Macros and can’t see how to fix them, just close the\n\ program without saving them, and reopen it.

\n\
\n\
\n\
\n\
\n\

3.7. Controls

\n\

The line of buttons under the waterfall is used to control the program (as\n\ opposed to the QSO). If you hover the mouse over these buttons, you’ll see a\n\ little yellow hint box appear which tells you what each button does.

\n\

The first button switches between Waterfall, FFT and Scope modes. The next two\n\ buttons adjust the signal level over which the waterfall works. The default\n\ range is from 0dB downwards 70dB (i.e. to -70dB). Both of these values can be\n\ adjusted to suit your sound card and receiver audio level.

\n\

The next button sets the scale zoom factor (visible display width, ×1, ×2 or\n\ ×4), and the next three buttons move the visible waterfall area in relation to\n\ the bandwidth cursor.

\n\

The next button selects the waterfall speed. NORM or SLOW setting is best unless\n\ you have a very fast computer.

\n\

The next four buttons (two on either side of a number, the audio frequency in\n\ Hz) control the receiving frequency (they move the red cursor lines).

\n\

The QSY button moves the signal under the bandwidth cursor to a preset audio\n\ frequency (typically, the centre of the transceiver’s passband). The Store\n\ button allows you to store or recall the current frequency and mode. See the\n\ Online Documentation for details on these functions.

\n\

The Lk button locks the transmit frequency (and illuminates a green marker), and the\n\ Rv button turns the signal decoding upside down (some modes are sideband\n\ sensitive, and if they are the wrong way up, can’t be received\n\ correctly). Remember to turn this one off when you’re done, or you won’t receive\n\ anything! If every signal you hear is upside down, check your transceiver\n\ sideband setting.

\n\

The T/R button forces the transmitter on or off.

\n\
\n\ \n\ \n\ \n\
\n\ \"Caution\"\n\ \n\

Use the T/R button with care, as it will stop transmission immediately, losing\n\ whatever is in the buffer (what you have typed in the Transmit pane), or start\n\ it immediately, even if nothing is ready to transmit.

\n\
\n\
\n\

There are two further controls in the bottom right corner of the program, to the\n\ right of the Status line:

\n\
\n\
\n\ AFC (AFC) control\n\
\n\
\n\

\n\ When this button is pressed, an indicator on the button turns yellow, and the\n\ program will automatically retune to drifting signals. When the button is\n\ again pressed, AFC is off, and the tuning will stay where you leave it.\n\

\n\
\n\
\n\ SQL (Squelch) control\n\
\n\
\n\

\n\ When off (no coloured indicator on the button), the receiver displays all\n\ “text” received, even if there is no signal present, and the receiver is\n\ simply attempting to decode noise. When activated by pressing the button, the\n\ indicator turns yellow. If the incoming signal strength exceeds that set by\n\ the adjacent slider control (above the SQL button), the indicator turns\n\ green and the incoming signal is decoded and printed. The signal strength is\n\ indicated on the green bar beside the Squelch level slider. If nothing seems\n\ to be printing, the first thing to do is check the Squelch!\n\

\n\
\n\
\n\
\n\
\n\

3.8. Status Line

\n\

At the very bottom line of the Fldigi window is a row of useful information. At\n\ the left is the current operating mode. Next (some modes) is the measured\n\ signal-to-noise ratio at the receiver, and (in some modes) the measured signal\n\ intermodulation level (IMD).

\n\

The larger central box shows (in DominoEX and THOR modes) the received\n\ Secondary Text. This is information (such as station identification) which is\n\ transmitted automatically whenever the transmitter has completed all user text\n\ that is available to send. It is transmitted using special characters, and is\n\ automatically directed to this special window. Secondary text you transmit is\n\ also shown here. This box changes size when you enlarge the program window.

\n\
\n\
\n\
\n\
\n\

4. Operating

\n\
\n\
\n\

4.1. Procedure

\n\

Operating procedure for digital modes is similar to that for Morse. Some of the\n\ same abbreviations are used. For example, at the beginning of an over, you might\n\ send VK3XYZ de WB8ABC or just RR Jack and so on. At the end of an over, it\n\ is usual to send ZL1ABC de AA3AR K, and at the end of a QSO 73 F3XYZ de 3D2ZZ\n\ SK. When operating in a group or net it is usual to sign AA3AE es gp de ZK8WW\n\ K.

\n\

It is also considered a courtesy to send a blank line or two (press Enter)\n\ before any text at the start of an over, and following the last text at the end\n\ of an over. You can also place these in the macros. The purpose is to separate\n\ your text from the previous text, and especially from any rubbish that was\n\ printed between overs.

\n\

Fldigi does all of this for you. The Function Keys are set up to provide these\n\ start and end of over facilities, and can be edited to suit your preferences. In\n\ order that the other station’s callsign can appear when these keys are used, you\n\ need to set the other station’s callsign in the log data — it does not matter if\n\ you use the log facility or not.

\n\
\n\ \n\ \n\ \n\
\n\ \"Note\"\n\ \n\
Macro symbols
\n\

Some Function Key Macro buttons have graphic symbols on them which imply\n\ the following:

\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
\n\ >>\n\
\n\
\n\

\n\ The transmitter comes on and stays on when you use this button/macro.\n\

\n\
\n\ ||\n\
\n\
\n\

\n\ The transmitter goes off when the text from this button/macro has been\n\ sent.\n\

\n\
\n\ >|\n\
\n\
\n\

\n\ The transmitter comes on, sends the text from this button/macro, and\n\ goes off when the text from this button/macro has been sent.\n\

\n\
\n\
\n\
\n\

The Macros are set up to control the transmitter as necessary, but you can also\n\ switch the transmitter on at the start of an over with Ctrl and T or the TX\n\ macro button, and off again with Ctrl and R or the RX macro button. If you\n\ have Macros copied into or text already typed in the Transmit pane when you\n\ start the transmitter, this is sent first.

\n\

Calling another station you have tuned in is as simple as pushing a button. Put\n\ his callsign into the log data (right click, select Call) and press the ANS\n\ Macro button (or F2) when you are ready. If he replies, you are in business!\n\ Then press QSO (F3) to start each over, and BTU (F4) to end it, and SK\n\ (F5) to sign off.

\n\
\n\ \n\ \n\ \n\
\n\ \"Note\"\n\ \n\

When typing text, the correct use of upper and lower case is important:

\n\
    \n\
  • \n\

    \n\ Modes such as RTTY and THROB have no lower case capability.\n\

    \n\
  • \n\
  • \n\

    \n\ In most other modes, excessive use of upper case is considered impolite, like\n\ SHOUTING!\n\

    \n\
  • \n\
  • \n\

    \n\ Modes such as PSK31, MFSK16, DominoEX and THOR use character sets which are\n\ optimised for lower case. You should use lower case as much as possible in\n\ these modes to achieve maximum text speed. In these modes upper case\n\ characters are noticeably slower to send and also slightly more prone to\n\ errors.\n\

    \n\
  • \n\
\n\
\n\
\n\
\n\
\n\

4.2. Adjustment

\n\

Most digital modes do not require much transmitter power, as the receiver\n\ software is very sensitive. Many modes (PSK31, THROB, MT63) also require very\n\ high transmitter linearity, which is another reason to keep transmitter power\n\ below 30% of maximum. Some modes (Hellschreiber, Morse) have high peak power\n\ output, which may not indicate well on the conventional power meter, another\n\ reason to keep the average transmitted power low to prevent a very broad signal\n\ being transmitted.

\n\

Adjust the transmitter output power using the TUNE button, top right, beyond the\n\ Menu. The output will be the same as the peak power in other modes. Adjust the\n\ master Volume applet Wave Out and Master Volume controls to achieve the\n\ appropriate power. Use of excessive drive will result in distortion (signal\n\ difficult to tune in, and often poorer reception) and a very broad signal.

\n\

Some multi-carrier modes (MT63 for example) may require individual adjustment as\n\ the average power may be rather low.

\n\
\n\ \n\ \n\ \n\
\n\ \"Tip\"\n\ \n\

Where possible, use the area above 1200Hz on the waterfall.

\n\
    \n\
  • \n\

    \n\ Below 1200Hz the second harmonic of the transmitted audio will pass through\n\ the transmitter filters.\n\

    \n\
  • \n\
  • \n\

    \n\ When using lower frequency tones, adjust the transmitter and audio level with\n\ great care, as the second (and even third) harmonic will appear in the\n\ transmitter passband, causing excessive signal width.\n\

    \n\
  • \n\
  • \n\

    \n\ A narrow (CW) filter in the rig is no help in this regard, as it is only used\n\ on receive. When you do use a narrow filter, this will restrict the area over\n\ which the receiver and transmitter will operate (without retuning of\n\ course). Try adjusting the passband tuning (if available).\n\

    \n\
  • \n\
  • \n\

    \n\ Keep the sound card audio level to a minimum and set the transmitter gain to a\n\ similar level used for SSB.\n\

    \n\
  • \n\
\n\
\n\
\n\
\n\
\n\

4.3. Waterfall Tuning

\n\

When using this program, as with most other digital modes programs, tuning is\n\ generally accomplished by leaving the transceiver VFO at a popular spot (for\n\ example 14.070MHz, USB), and performing all the tuning by moving around within\n\ the software.

\n\

The Fldigi software has a second “VFO” which is tuned by clicking on the\n\ waterfall. On a busy band, you may see many signals at the same time (especially\n\ with PSK31 or Morse), and so you can click with the mouse on any one of these\n\ signals to tune it in, receive it, and if the opportunity allows, reply to the\n\ station.

\n\

The software “VFO” operates in a transceive mode, so the transmitter signal is\n\ automatically and exactly tuned to the received frequency. If you click\n\ correctly on the signal, your reply will always be in tune with the other\n\ station.

\n\
\n\ \n\ \n\ \n\
\n\ \"Important\"\n\ \n\

You must not use RIT (Clarifier) when using digital modes.

\n\
    \n\
  • \n\

    \n\ With RIT on, you will probably have to retune after every over.\n\

    \n\
  • \n\
  • \n\

    \n\ Use of the RIT will also cause the other station to change frequency, and you\n\ will chase each other across the band.\n\

    \n\
  • \n\
  • \n\

    \n\ Older transceivers without digital synthesis may have an unwanted offset\n\ (frequency difference) between transmit and receive frequencies. Such rigs\n\ should not be used for digital modes.\n\

    \n\
  • \n\
\n\
\n\
\n\

Wider digital modes (MT63, Olivia) can be tuned using the rig if necessary, as\n\ tuning is not at all critical. The software tuning still operates, but because\n\ the signal is so wide, there is limited ability to move around in the waterfall\n\ tuning.

\n\
\n\
\n\
\n\
\n\

5. Special Keys

\n\
\n\

Several special keyboard controls are provided to make operating easier.

\n\
Start Transmission

Press Ctrl and T to start transmission if there is text ready in the transmit\n\ buffer.

\n\
Pause Transmission

Press Pause or Break while in receive, and the program will switch to\n\ transmit mode. It will continue with the text in the transmit buffer (the\n\ Transmit pane text) from the current point, i.e. where the red (previously sent)\n\ text ends and the black (yet to be sent) text begins. If the buffer only\n\ contains unsent text, then it will begin at the first character in the\n\ buffer. If the buffer is empty, the program will switch to transmit mode, and\n\ depending on the mode of operation, will send idle characters or nothing at all\n\ until characters are entered into the buffer.

\n\

If you press Pause or Break while in transmit mode, the program will return\n\ to receive mode. There may be a slight delay for some modes like MFSK, PSK and\n\ others, that requires the transmitter to send a postamble at the end of a\n\ transmission. The transmit text buffer stays intact, ready for the\n\ Pause/Break key to return you to the transmit mode .

\n\

Pressing Alt or Meta and R has the same effect as Pause/Break. You\n\ could think of the Pause/Break key as a software break-in capability.

\n\
Escape

Pressing Esc while transmitting will abort the transmission. Transmission\n\ stops as soon as possible, (any necessary postamble is sent), and the program\n\ returns to receive. Any unsent text in the transmit buffer will be lost.

\n\
\n\ \n\ \n\ \n\
\n\ \"Tip\"\n\ \n\

If you press Esc Esc (i.e. twice in quick succession), transmission stops\n\ immediately, without sending any postamble, and the program returns to\n\ receive. Any unsent text in the transmit buffer will be lost. Use this feature\n\ as an emergency stop.

\n\
\n\
\n\
Return to Receive

Press Ctrl and R to insert the ^r command in the transmit buffer at the\n\ current typing point. When transmission reaches this point, transmission will\n\ stop.

\n\
Move Typing Cursor

Press Tab to move the cursor (typing insertion point) to the end of the\n\ transmit buffer. This will also pause transmission. A Tab press at that\n\ position moves the cursor back to the character following the last one\n\ transmitted. Morse operation is slightly different. See the Online Documentation for CW.

\n\
Send Any ASCII Character

Press Ctrl and (at the same time) any three-digit number (on the numeric\n\ keypad or the normal numeric keys) to insert the ASCII character designated by\n\ that entry value into the transmit buffer. For example, Ctrl 177 is “±”\n\ (plus/minus) and Ctrl 176 is “°” (degree). If you press a key other than the\n\ numeric keypad’s 0-9 the sequence will be discarded.

\n\

Credits

\n\

Copyright © 2008 Murray Greenman, ZL1BPU.

\n\

Copyright © 2008-2009 David Freese, W1HKJ.

\n\

Copyright © 2009 Stelios Bounanos, M0GLD.

\n\ \n\
\n\
\n\
\n\

\n\
\n\
\n\ Last updated 2014-03-21 11:25:57 CDT\n\
\n\
\n\ \n\ \"Valid\n\ \n\ \n\ \"Valid\n\ \n\
\n\
\n\ \n\ \n\n"; fldigi-3.21.80/src/dialogs/confdialog.fl0000664000175000017500000076777312313150637014743 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0302 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include "main.h"} {private local } decl {\#include "fl_digi.h"} {private local } decl {\#include "Viewer.h"} {private global } decl {\#include "font_browser.h"} {public global } decl {\#include "soundconf.h"} {private local } decl {\#include "globals.h"} {public local } decl {\#include "modem.h"} {public local } decl {\#include "configuration.h"} {public local } decl {\#include "combo.h"} {public local } decl {\#include "waterfall.h"} {private local } decl {\#include "rigxml.h"} {private local } decl {\#include "lookupcall.h"} {private local } decl {\#include "icons.h"} {private local } decl {\#include "Viewer.h"} {private local } decl {\#include "pskrep.h"} {private global } decl {\#include "flinput2.h"} {public local } decl {\#include "flslider2.h"} {public local } decl {\#include "flmisc.h"} {public local } decl {\#include "logsupport.h"} {private local } decl {\#include "notify.h"} {private local } decl {\#include "debug.h"} {private local } decl {\#include "status.h"} {private local } decl {\#include "rx_extract.h"} {private local } decl {\#include "kmlserver.h"} {private local } decl {extern void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata);} {private local } decl {\#if USE_HAMLIB \#include "hamlib.h" \#endif} {private local } decl {Fl_Double_Window *dlgConfig;} {public local } decl {Mode_Browser* mode_browser;} {public local } Function {choose_color(Fl_Color & c)} {open private return_type void } { code {unsigned char r, g, b; Fl::get_color(c, r, g, b); if (fl_color_chooser("Font color", r, g, b)) c = fl_rgb_color(r, g, b);} {} } Function {adjust_label(Fl_Widget* w)} {open private return_type void } { code {w->labelcolor(fl_contrast(w->labelcolor(), w->color()));} {} } Function {cbRxFontBrowser(Fl_Widget*, void*)} {open private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); RxText->textfont(font); RxText->textsize(size); RxText->textcolor(color); RxText->redraw(); progdefaults.RxFontnbr = font; progdefaults.RxFontsize = size; progdefaults.RxFontcolor = color; ReceiveText->setFont(font); ReceiveText->setFontSize(size); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); font_browser->hide(); progdefaults.changed = true;} {} } Function {cbTxFontBrowser(Fl_Widget*, void*)} {open private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); TxText->textfont(font); TxText->textsize(size); TxText->textcolor(color); TxText->redraw(); progdefaults.TxFontnbr = font; progdefaults.TxFontsize = size; progdefaults.TxFontcolor = color; TransmitText->setFont(font); TransmitText->setFontSize(size); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); font_browser->hide(); progdefaults.changed = true;} {} } Function {cbWaterfallFontBrowser(Fl_Widget*, void*)} {open return_type void } { code {Fl_Font fnt = font_browser->fontNumber(); int size = font_browser->fontSize(); progdefaults.WaterfallFontnbr = fnt; progdefaults.WaterfallFontsize = size; progdefaults.changed = true; font_browser->hide();} {} } Function {cbViewerFontBrowser(Fl_Widget*, void*)} {open return_type void } { code {progdefaults.ViewerFontnbr = font_browser->fontNumber(); progdefaults.ViewerFontsize = font_browser->fontSize(); initViewer(); progdefaults.changed = true; font_browser->hide();} {} } Function {cbFreqControlFontBrowser(Fl_Widget*, void*)} {open return_type void } { code {Fl_Font fnt = font_browser->fontNumber(); progdefaults.FreqControlFontnbr = fnt; progdefaults.changed = true; FDdisplay->labelfont(progdefaults.FreqControlFontnbr); FDdisplay->redraw(); qsoFreqDisp1->font(progdefaults.FreqControlFontnbr); qsoFreqDisp2->font(progdefaults.FreqControlFontnbr); qsoFreqDisp3->font(progdefaults.FreqControlFontnbr); qsoFreqDisp1->redraw(); qsoFreqDisp2->redraw(); qsoFreqDisp3->redraw(); font_browser->hide();} {} } Function {cbLOGGINGFontBrowser(Fl_Widget*, void*)} {open private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.LOGGINGtextfont = font; progdefaults.LOGGINGtextsize = size; progdefaults.LOGGINGtextcolor = color; LOGGINGdisplay->textsize(size); LOGGINGdisplay->textcolor(color); LOGGINGdisplay->textfont(font); LOGGINGdisplay->redraw(); LOGGING_colors_font(); font_browser->hide(); progdefaults.changed = true;} {} } Function {cbLOGBOOKFontBrowser(Fl_Widget*, void*)} {open private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.LOGBOOKtextfont = font; progdefaults.LOGBOOKtextsize = size; progdefaults.LOGBOOKtextcolor = color; LOGBOOKdisplay->textsize(size); LOGBOOKdisplay->textcolor(color); LOGBOOKdisplay->textfont(font); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); font_browser->hide(); progdefaults.changed = true;} {} } Function {set_qrzxml_buttons(Fl_Button* b)} {return_type void } { code {Fl_Button* qrzbxml[] = { btnQRZXMLnotavailable, btnQRZcdrom, btnQRZsub, btnHamcall, btnCALLOOK, btnHamQTH}; for (size_t i = 0; i < sizeof(qrzbxml)/sizeof(*qrzbxml); i++) qrzbxml[i]->value(b == qrzbxml[i]);} {} } Function {set_qrzweb_buttons(Fl_Button* b)} {return_type void } { code {Fl_Button* qrzbweb[] = { btnQRZWEBnotavailable, btnQRZonline, btnHAMCALLonline, btnHamQTHonline }; for (size_t i = 0; i < sizeof(qrzbweb)/sizeof(*qrzbweb); i++) qrzbweb[i]->value(b == qrzbweb[i]);} {} } Function {ConfigureDialog()} {open } { code {font_browser = new Font_Browser;} {} code {static const char szShifts[] = "23|85|160|170|182|200|240|350|425|850|Custom"; static const char szBauds[] = "45|45.45|50|56|75|100|110|150|200|300"; static const char szSelBits[] = "5 (baudot)|7 (ascii)|8 (ascii)"; static const char szParity[] = "none|even|odd|zero|one"; static const char szStopBits[] = "1|1.5|2"; static const char szOliviaTones[] = "2|4|8|16|32|64|128|256"; static const char szOliviaBandwidth[] = "125|250|500|1000|2000"; static const char szContestiaTones[] = "2|4|8|16|32|64|128|256"; static const char szContestiaBandwidth[] = "125|250|500|1000|2000"; static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600|115200|230400|460800"; static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {} Fl_Window {} { label {Fldigi configuration} open xywh {921 110 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible } { Fl_Tabs tabsConfigure {open xywh {0 0 600 380} color 50 selection_color 50 } { Fl_Group tabOperator { label Operator callback {progdefaults.changed = true;} open selected tooltip {Operator information} xywh {0 25 600 355} when 1 } { Fl_Group {} { label Station open xywh {55 35 490 170} box ENGRAVED_FRAME align 21 } { Fl_Input inpMyCallsign { label {Callsign:} callback {if (progdefaults.THORsecText.empty()) { progdefaults.THORsecText = o->value(); progdefaults.THORsecText.append(" "); txtTHORSecondary->value(progdefaults.THORsecText.c_str()); } if (progdefaults.secText.empty()) { progdefaults.secText = o->value(); progdefaults.secText.append(" "); txtSecondary->value(progdefaults.secText.c_str()); } progdefaults.myCall = o->value(); update_main_title(); notify_change_callsign(); progdefaults.changed = true;} tooltip {Operators callsign} xywh {160 64 110 24} code0 {inpMyCallsign->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpMyName { label {Name:} callback {progdefaults.myName = o->value(); progdefaults.changed = true;} tooltip {Operators name} xywh {340 64 140 24} code0 {inpMyName->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpMyQth { label {QTH:} callback {progdefaults.myQth = o->value(); progdefaults.changed = true;} tooltip {Operators QTH} xywh {160 98 320 24} code0 {inpMyQth->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpMyLocator { label {Locator:} callback {progdefaults.myLocator = o->value(); progdefaults.changed = true;} tooltip {Maidenhead locator as in EM64qv} xywh {160 133 85 24} code0 {inpMyLocator->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } } Fl_Input inpMyAntenna { label {Antenna:} callback {progdefaults.myAntenna = o->value(); progdefaults.changed = true;} tooltip {Short description of antenna} xywh {160 167 320 24} code0 {inpMyAntenna->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Group grpNoise { label {Test Signal - Do NOT use with transmitter} open xywh {55 231 490 114} box ENGRAVED_FRAME align 21 hide } { Fl_Check_Button btnNoiseOn { label {Noise on} callback {progdefaults.noise = o->value();} xywh {93 269 70 15} down_box DOWN_BOX deactivate code0 {o->value(progdefaults.noise);} } Fl_Counter noiseDB { label dB callback {progdefaults.s2n = o->value();} xywh {90 307 89 21} type Simple align 4 minimum -18 maximum 60 step 1 value 20 deactivate code0 {o->value(progdefaults.s2n);} class Fl_Counter2 } } } Fl_Group tabUI { label UI open xywh {0 25 600 355} hide } { Fl_Tabs tabsUI {open xywh {0 25 600 355} selection_color 50 } { Fl_Group tabBrowser { label Browser open xywh {0 50 600 330} } { Fl_Group {} {open xywh {30 65 540 300} box ENGRAVED_FRAME } { Fl_Spinner cntChannels { label {Channels, first channel starts at waterfall lower limit} callback {progdefaults.VIEWERchannels = (int)(o->value()); initViewer();} tooltip {Change \# of psk viewer channels} xywh {46 75 50 24} align 8 maximum 30 value 30 code0 {o->minimum(5); o->maximum(30); o->step(1);} code1 {o->value(progdefaults.VIEWERchannels);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Spinner cntTimeout { label {Inactivity timeout} callback {progdefaults.VIEWERtimeout = (int)(o->value()); progdefaults.changed = true;} tooltip {Clear channel text after \# seconds of inactivity} xywh {46 111 50 24} align 8 value 10 code0 {o->minimum(1); o->maximum(180); o->step(1);} code1 {o->value(progdefaults.VIEWERtimeout);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Group listboxViewerLabel { label {Channel label} callback {progdefaults.VIEWERlabeltype = o->index(); initViewer(); progdefaults.changed = true;} open tooltip {Appearance of label on each channel} xywh {46 151 150 24} box DOWN_BOX color 7 align 8 code0 {listboxViewerLabel->add(_("None")); listboxViewerLabel->add(_("Audio frequency"));} code1 {listboxViewerLabel->add(_("Radio frequency")); listboxViewerLabel->add(_("Channel number"));} code3 {listboxViewerLabel->index(progdefaults.VIEWERlabeltype); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Button btnViewerFont { label {Font...} callback {font_browser->fontNumber(progdefaults.ViewerFontnbr); font_browser->fontSize(progdefaults.ViewerFontsize); font_browser->fontColor(FL_FOREGROUND_COLOR); font_browser->fontFilter(Font_Browser::FIXED_WIDTH); font_browser->callback(cbViewerFontBrowser); font_browser->show();} tooltip {select browser font} xywh {331 151 70 24} } Fl_Check_Button btnFixedIntervals { label {Fixed Intervals} callback {progdefaults.VIEWERfixed = o->value(); progdefaults.changed = true; initViewer();} tooltip {Force channel spacing to even 100 Hz increments} xywh {236 137 165 20} down_box DOWN_BOX value 1 hide code0 {o->value(progdefaults.VIEWERfixed);} } Fl_Check_Button btnMarquee { label {Continuous scrolling} callback {progdefaults.VIEWERmarquee = o->value(); progdefaults.changed = true; initViewer();} tooltip {ON - Marquee style OFF - Clear & restart} xywh {46 189 165 20} down_box DOWN_BOX code0 {o->value(progdefaults.VIEWERmarquee);} } Fl_Check_Button btnAscend { label {Lowest freq on bottom of viewer} callback {progdefaults.VIEWERascend = o->value(); progdefaults.changed = true; initViewer();} tooltip {Change positions of low to high channels} xywh {46 213 253 20} down_box DOWN_BOX code0 {o->value(progdefaults.VIEWERascend);} } Fl_Check_Button btnBrowserHistory { label {Play back history when active channel selected} callback {progdefaults.VIEWERhistory = o->value(); progdefaults.changed = true;} tooltip {Audio stream history decoded on selected signal} xywh {46 238 356 20} down_box DOWN_BOX code0 {o->value(progdefaults.VIEWERhistory);} } Fl_Group {} { label {Detection Level} open xywh {40 287 144 60} box ENGRAVED_FRAME } { Fl_Button bwsrSliderColor { label Backgnd callback {uchar r, g, b; r = progdefaults.bwsrSliderColor.R; g = progdefaults.bwsrSliderColor.G; b = progdefaults.bwsrSliderColor.B; if (fl_color_chooser("Slider Color", r, g, b) == 0) return; progdefaults.bwsrSliderColor.R = r; progdefaults.bwsrSliderColor.G = g; progdefaults.bwsrSliderColor.B = b; o->color(fl_rgb_color(r,g,b)); o->redraw(); sldrViewerSquelch->color(fl_rgb_color(r,g,b)); sldrViewerSquelch->redraw(); mvsquelch->color(fl_rgb_color(r,g,b)); mvsquelch->redraw(); progdefaults.changed = true;} tooltip {Background color of signal viewer squelch control} xywh {47 310 60 24} align 1 code0 {bwsrSliderColor->color(fl_rgb_color(progdefaults.bwsrSliderColor.R, progdefaults.bwsrSliderColor.G,progdefaults.bwsrSliderColor.B));} } Fl_Button bwsrSldrSelColor { label Button callback {uchar r, g, b; r = progdefaults.bwsrSldrSelColor.R; g = progdefaults.bwsrSldrSelColor.G; b = progdefaults.bwsrSldrSelColor.B; if (fl_color_chooser("Button Color", r, g, b) == 0) return; progdefaults.bwsrSldrSelColor.R = r; progdefaults.bwsrSldrSelColor.G = g; progdefaults.bwsrSldrSelColor.B = b; o->color(fl_rgb_color(r,g,b)); o->redraw(); sldrViewerSquelch->selection_color(fl_rgb_color(r,g,b)); sldrViewerSquelch->redraw(); mvsquelch->selection_color(fl_rgb_color(r,g,b)); mvsquelch->redraw(); progdefaults.changed = true;} tooltip {Slider hilite color of signal viewer squelch control} xywh {115 310 60 24} align 1 code0 {bwsrSldrSelColor->color(fl_rgb_color(progdefaults.bwsrSldrSelColor.R, progdefaults.bwsrSldrSelColor.G,progdefaults.bwsrSliderColor.B));} } } Fl_Group {} { label {Browser Line Colors} open xywh {192 287 326 60} box ENGRAVED_FRAME } { Fl_Button bwsrHiLite_1_color { label {HiLite 1} callback {progdefaults.bwsrHiLight1 = fl_show_colormap((Fl_Color)progdefaults.bwsrHiLight1); bwsrHiLite_1_color->color((Fl_Color)progdefaults.bwsrHiLight1); viewer_redraw(); progdefaults.changed = true;} tooltip {PSK/RTTY Viewer HiLite Color 1} xywh {198 309 60 24} align 1 code0 {bwsrHiLite_1_color->color((Fl_Color)progdefaults.bwsrHiLight1);} code1 {\#include "Viewer.h"} } Fl_Button bwsrHiLite_2_color { label {HiLite 2} callback {progdefaults.bwsrHiLight2 = fl_show_colormap((Fl_Color)progdefaults.bwsrHiLight2); bwsrHiLite_2_color->color((Fl_Color)progdefaults.bwsrHiLight2); viewer_redraw(); progdefaults.changed = true;} tooltip {PSK/RTTY Viewer HiLite Color 2} xywh {261 309 60 24} align 1 code0 {bwsrHiLite_2_color->color((Fl_Color)progdefaults.bwsrHiLight2);} } Fl_Button bwsrHiLite_even_lines { label Even callback {progdefaults.bwsrBackgnd2 = fl_show_colormap((Fl_Color)progdefaults.bwsrBackgnd2); bwsrHiLite_even_lines->color((Fl_Color)progdefaults.bwsrBackgnd2); viewer_redraw(); progdefaults.changed = true;;} tooltip {Even lines} xywh {324 309 60 24} align 1 code0 {bwsrHiLite_even_lines->color((Fl_Color)progdefaults.bwsrBackgnd2);} } Fl_Button bwsrHiLite_odd_lines { label Odd callback {progdefaults.bwsrBackgnd1 = fl_show_colormap((Fl_Color)progdefaults.bwsrBackgnd1); bwsrHiLite_odd_lines->color((Fl_Color)progdefaults.bwsrBackgnd1); viewer_redraw(); progdefaults.changed = true;} tooltip {Odd lines} xywh {387 309 60 24} align 1 code0 {bwsrHiLite_odd_lines->color((Fl_Color)progdefaults.bwsrBackgnd1);} } Fl_Button bwsrHiLite_select { label Select callback {progdefaults.bwsrSelect = fl_show_colormap((Fl_Color)progdefaults.bwsrSelect); bwsrHiLite_select->color((Fl_Color)progdefaults.bwsrSelect); viewer_redraw(); progdefaults.changed = true;} tooltip {Select line} xywh {451 309 60 24} align 1 code0 {bwsrHiLite_select->color((Fl_Color)progdefaults.bwsrSelect);} } } } } Fl_Group tabContest { label Contest open xywh {0 50 600 330} hide } { Fl_Group {} { label Exchanges open xywh {55 70 490 80} box ENGRAVED_FRAME align 21 } { Fl_Box lblSend { label {Send:} xywh {87 105 55 20} } Fl_Input inpSend1 { label {Exchange Out} callback {progdefaults.myXchg=o->value(); progdefaults.changed = true;} tooltip {free form exchange} xywh {145 105 140 20} align 1 code0 {o->value(progdefaults.myXchg.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button btn599 { label {RST always 599} callback {progdefaults.fixed599 = o->value(); progdefaults.changed = true;} tooltip {Force RST in/out to 599} xywh {360 90 130 20} down_box DOWN_BOX code0 {o->value(progdefaults.fixed599);} } Fl_Check_Button btnCutNbrs { label {Send CW cut numbers} callback {progdefaults.cutnbrs=o->value(); progdefaults.changed = true;} tooltip {0 = T; 9 = N} xywh {360 120 180 20} down_box DOWN_BOX code0 {o->value(progdefaults.cutnbrs);} } } Fl_Group {} { label {Serial number} open xywh {55 160 490 65} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnUseLeadingZeros { label {Use leading zeros} callback {progdefaults.UseLeadingZeros = o->value(); progdefaults.changed = true;} tooltip {Insert leading zeros into Xmtd serial number} xywh {76 186 154 20} down_box DOWN_BOX value 1 } Fl_Value_Input nbrContestStart { label Start callback {progdefaults.ContestStart = (int)o->value(); progdefaults.changed = true;} tooltip {Starting number} xywh {271 186 45 20} align 1 maximum 10000 step 1 code0 {o->value(progdefaults.ContestStart);} class Fl_Value_Input2 } Fl_Value_Input nbrContestDigits { label Digits callback {progdefaults.ContestDigits = (int)o->value(); progdefaults.changed = true;} tooltip {Number of digits in serial number} xywh {353 185 45 20} align 1 minimum 1 maximum 5 step 1 value 3 class Fl_Value_Input2 } Fl_Button btnResetSerNbr { label Reset callback {cb_ResetSerNbr();} tooltip {Initialize the QSO logging fields} xywh {445 186 70 20} } } Fl_Group {} { label {Duplicate check, CALL plus} open xywh {55 235 490 130} box ENGRAVED_FRAME align 21 } { Fl_Light_Button btnDupCheckOn { label {On/Off} callback {progdefaults.EnableDupCheck = o->value(); progdefaults.changed = true;} tooltip {Check for duplicates} xywh {65 265 74 20} selection_color 2 code0 {o->value(progdefaults.EnableDupCheck);} } Fl_Check_Button btnDupBand { label Band callback {progdefaults.dupband = o->value(); progdefaults.changed = true;} tooltip {Bands must match} xywh {206 265 70 20} down_box DOWN_BOX code0 {o->value(progdefaults.dupband);} } Fl_Check_Button btnDupMode { label Mode callback {progdefaults.dupmode = o->value(); progdefaults.changed = true;} tooltip {Mode must match} xywh {326 265 70 20} down_box DOWN_BOX code0 {o->value(progdefaults.dupmode);} } Fl_Check_Button btnDupState { label State callback {progdefaults.dupstate = o->value(); progdefaults.changed = true;} tooltip {State must match} xywh {445 265 70 20} down_box DOWN_BOX code0 {o->value(progdefaults.dupstate);} } Fl_Check_Button btnDupXchg1 { label {Exchange In} callback {progdefaults.dupxchg1 = o->value(); progdefaults.changed = true;} tooltip {free form 1 must match} xywh {206 293 105 20} down_box DOWN_BOX code0 {o->value(progdefaults.dupxchg1);} } Fl_Check_Button btnDupTimeSpan { label {Time span over} callback {progdefaults.duptimespan=(int)o->value(); progdefaults.changed = true;} tooltip {QSO must not occur within a time period of} xywh {206 323 129 20} down_box DOWN_BOX code0 {o->value(progdefaults.duptimespan);} } Fl_Value_Input nbrTimeSpan { label minutes callback {progdefaults.timespan = (int)o->value(); progdefaults.changed = true;} tooltip {Enter time span in minutes} xywh {335 323 53 20} align 8 maximum 1440 step 1 value 120 code0 {o->value(progdefaults.timespan);} class Fl_Value_Input2 } Fl_Button btnDupColor { label {Dup Color} callback {fl_color_chooser("Dup Check", progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B); o->color( fl_rgb_color( progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B)); o->redraw(); progdefaults.changed = true;} tooltip {Left click to select dup color} xywh {65 292 90 22} box DOWN_BOX down_box DOWN_BOX color 7 selection_color 7 code0 {o->color(fl_rgb_color(progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B));} code1 {\#include } } } } Fl_Group tabUserInterface { label General open xywh {0 50 600 330} hide } { Fl_Group {} {open xywh {52 62 496 76} box ENGRAVED_FRAME } { Fl_Check_Button btnShowTooltips { label {Show tooltips} callback {progdefaults.tooltips = o->value(); Fl_Tooltip::enable(progdefaults.tooltips); progdefaults.changed = true;} tooltip {Enable / disable tooltips} xywh {87 75 120 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.tooltips);} } Fl_Check_Button chkMenuIcons { label {Show menu icons} callback {progdefaults.menuicons = o->value(); toggle_icon_labels(); progdefaults.changed = true;} tooltip {Enable / disable icons on menus} xywh {231 75 150 20} down_box DOWN_BOX code0 {o->value(progdefaults.menuicons);} } Fl_Group listboxScheme { label {UI scheme} callback {progdefaults.ui_scheme = o->value(); Fl::scheme(progdefaults.ui_scheme.c_str()); progdefaults.changed = true;} open tooltip {Change application look and feel} xywh {205 104 80 20} box DOWN_BOX color 7 align 8 code0 {listboxScheme->add("base");} code1 {listboxScheme->add("gtk+");} code2 {listboxScheme->add("plastic");} code3 {listboxScheme->value(progdefaults.ui_scheme.c_str()); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Button bVisibleModes { label {Visible modes} callback {mode_browser->label(o->label()); mode_browser->callback(toggle_visible_modes); mode_browser->show(&progdefaults.visible_modes); progdefaults.changed = true;} tooltip {Select modes for menu access} xywh {70 104 110 20} } Fl_Group listbox_language { label {UI language} callback {progdefaults.ui_language = o->index(); progdefaults.changed = true;} open tooltip {Changes take effect on next program startup} xywh {415 104 110 20} box DOWN_BOX color 7 labelsize 12 align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } Fl_Group {} {open xywh {52 139 496 34} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_rx_lowercase { label {Print CW / RTTY / THROB / CONTESTIA in lowercase} callback {progdefaults.rx_lowercase = o->value(); progdefaults.changed = true;} xywh {87 146 389 20} down_box DOWN_BOX code0 {o->value(progdefaults.rx_lowercase);} } } Fl_Group {} {open xywh {52 174 496 34} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_tx_lowercase { label {Transmit all text in lower case} callback {progdefaults.tx_lowercase = o->value(); progdefaults.changed = true;} xywh {87 182 389 20} down_box DOWN_BOX code0 {o->value(progdefaults.tx_lowercase);} } } Fl_Group {} { label {Exit prompts} open xywh {52 209 496 110} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_save_config_on_exit { label {Prompt to save Configuration} callback {progdefaults.SaveConfig = o->value(); progdefaults.changed = true;} xywh {87 272 233 20} down_box DOWN_BOX code0 {o->value(progdefaults.SaveConfig);} } Fl_Check_Button btn2_save_macros_on_exit { label {Prompt to save macro file} callback {btn_save_macros_on_exit->value(o->value()); progdefaults.SaveMacros = o->value(); progdefaults.changed = true;} tooltip {Write current macro set on program exit} xywh {87 294 233 20} down_box DOWN_BOX code0 {o->value(progdefaults.SaveMacros);} } Fl_Check_Button btn2NagMe { label {Prompt to save log} callback {btnNagMe->value(o->value()); progdefaults.NagMe=o->value(); progdefaults.changed = true;} tooltip {Bug me about saving log entries} xywh {331 272 166 20} down_box DOWN_BOX code0 {o->value(progdefaults.NagMe);} } Fl_Box {} { label {Exit prompts active only when File/Exit menu item selected. Not active if window decoration close button pressed.} xywh {92 226 436 40} box BORDER_BOX align 20 } Fl_Check_Button btn2_confirm_exit { label {Confirm exit} callback {btn2_confirm_exit->value(o->value()); progdefaults.confirmExit=o->value(); progdefaults.changed = true;} xywh {331 294 200 20} down_box DOWN_BOX code0 {o->value(progdefaults.confirmExit);} } } Fl_Group {} { label {Check for updates} open xywh {52 321 496 54} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_check_for_updates { label {Check for updates when starting program} callback {progdefaults.check_for_updates = o->value(); progdefaults.changed = true;} xywh {87 344 324 20} down_box DOWN_BOX code0 {o->value(progdefaults.check_for_updates);} } } } Fl_Group tabLogServer { label Logging open xywh {0 50 600 330} hide } { Fl_Group {} { label {Client/Server Logbook} open xywh {52 315 496 55} box ENGRAVED_FRAME align 21 } { Fl_Input xmllogServerAddress { label {Address:} callback {progdefaults.xmllog_address = o->value();} tooltip {Enter URL address of server} xywh {149 336 100 24} code0 {o->value(progdefaults.xmllog_address.c_str());} } Fl_Input xmllogServerPort { label {Port:} callback {progdefaults.xmllog_port = o->value();} tooltip {Enter Port \# assigned to server} xywh {307 336 70 24} code0 {o->value(progdefaults.xmllog_port.c_str());} } Fl_Button btn_reconnect_log_server { label Reconnect callback {progdefaults.xml_logbook = true; connect_to_log_server();} xywh {410 336 115 24} } } Fl_Group {} { label {QSO logging} open xywh {52 59 496 180} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnNagMe { label {Prompt to save log on exit} callback {btn2NagMe->value(o->value()); progdefaults.NagMe=o->value(); progdefaults.changed = true;} tooltip {Bug me about saving log entries} xywh {69 81 236 20} down_box DOWN_BOX code0 {o->value(progdefaults.NagMe);} } Fl_Check_Button btnClearOnSave { label {Clear on save} callback {progdefaults.ClearOnSave=o->value(); progdefaults.changed = true;} tooltip {Clear log entries after saving or using macro } xywh {69 106 236 20} down_box DOWN_BOX code0 {o->value(progdefaults.ClearOnSave);} } Fl_Check_Button btnCallUpperCase { label {Convert callsign to upper case} callback {progdefaults.calluppercase = o->value(); progdefaults.changed = true;} tooltip {Force callsign field to UPPERCASE} xywh {69 132 236 20} down_box DOWN_BOX code0 {o->value(progdefaults.calluppercase);} } Fl_Check_Button btnAutoFillQSO { label {Auto-fill Country and Azimuth} callback {progdefaults.autofill_qso_fields = o->value(); progdefaults.changed = true;} tooltip {Fill in Country / Azimuth using cty.dat information} xywh {69 157 236 20} down_box DOWN_BOX code0 {o->value(progdefaults.autofill_qso_fields);} } Fl_Check_Button btnDateTimeSort { label {Sort by Date/Time OFF} callback {progdefaults.sort_date_time_off = o->value(); progdefaults.changed = true; reload_browser();} tooltip {Sort by date/time OFF - effects all ADIF/Cabrillo reports} xywh {322 81 190 20} down_box DOWN_BOX code0 {o->value(progdefaults.sort_date_time_off);} } Fl_Check_Button btndate_time_force { label {Date time ON == OFF} callback {progdefaults.force_date_time = o->value(); progdefaults.changed = true;} tooltip {Force date/time ON == date/time OFF} xywh {322 106 190 20} down_box DOWN_BOX code0 {o->value(progdefaults.force_date_time);} } Fl_Check_Button btnRSTindefault { label {Default RST in to 599} callback {progdefaults.RSTin_default = o->value(); progdefaults.changed = true;} tooltip {Clear log controls sets RST in to 599} xywh {322 131 186 20} down_box DOWN_BOX code0 {o->value(progdefaults.RSTin_default);} } Fl_Check_Button btnRSTdefault { label {Default RST out to 599} callback {progdefaults.RSTdefault = o->value(); progdefaults.changed = true;} tooltip {Clear log controls sets RST out to 599} xywh {322 157 184 20} down_box DOWN_BOX code0 {o->value(progdefaults.RSTdefault);} } Fl_Input txt_cty_dat_pathname { label {cty.dat pathname} callback {progdefaults.cty_dat_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for cty.dat} xywh {189 180 346 24} when 1 code0 {o->value(progdefaults.cty_dat_pathname.c_str());} code1 {\#include "dxcc.h"} class Fl_Input2 } Fl_Button btn_select_cty_dat { label Browse callback {select_cty_dat_pathname();} tooltip {Locate cty.dat file} xywh {70 209 75 24} } Fl_Button btn_default_cty_dat { label Default callback {default_cty_dat_pathname();} tooltip {Restore cty.dat default folder} xywh {165 209 75 24} } Fl_Button btn_reload_cty_dat { label Reload callback {reload_cty_dat();} tooltip {Reload cty.dat} xywh {260 209 75 24} } Fl_Input inpMyPower { label {Transmit Power} callback {progdefaults.mytxpower = o->value(); progdefaults.changed = true;} tooltip {Tx power used for logbook entries} xywh {485 209 50 24} code0 {o->value(progdefaults.mytxpower.c_str());} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } } Fl_Group {} { label {Rx Text Capture} open xywh {52 240 496 74} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnRXClicks { label {Double-click to capture} callback {progdefaults.rxtext_clicks_qso_data = o->value(); progdefaults.changed = true;} tooltip {Enable if you cannot use the middle mouse button} xywh {75 287 191 20} down_box DOWN_BOX code0 {o->value(progdefaults.rxtext_clicks_qso_data);} } Fl_Check_Button btnRXTooltips { label {callsign tooltips in received text} callback {progdefaults.rxtext_tooltips = o->value(); progdefaults.changed = true;} tooltip {Popup info after a 2 second hover on a callsign} xywh {277 287 254 20} down_box DOWN_BOX code0 {o->value(progdefaults.rxtext_tooltips);} } Fl_Input inpNonword { label {Word delimiters} callback {progdefaults.nonwordchars = o->value(); progdefaults.changed = true;} tooltip {RX text QSO data entry is bounded by the non-word characters defined here. Tab and newline are automatically included.} xywh {194 260 279 24} textfont 4 code0 {o->value(progdefaults.nonwordchars.c_str());} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } } } Fl_Group tabMBars { label Macros open xywh {0 50 600 330} hide } { Fl_Group {} {open xywh {52 257 496 40} box ENGRAVED_FRAME } { Fl_Check_Button btnMacroMouseWheel { label {Mouse wheel active on macro buttons} callback {progdefaults.macro_wheel = o->value(); progdefaults.changed = true;} tooltip {enable mouse wheel control of macro bar} xywh {62 266 296 20} down_box DOWN_BOX code0 {o->value(progdefaults.macro_wheel);} } } Fl_Group {} { label {Number and position of macro bars} open xywh {52 61 496 195} box ENGRAVED_FRAME align 21 } { Fl_Round_Button btn_oneA { label {One bar (above waterfall)} callback {progdefaults.mbar2_pos = 0; progdefaults.mbar1_pos = true; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {62 91 220 20} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_oneB { label {One bar (below waterfall)} callback {progdefaults.mbar2_pos = 0; progdefaults.mbar1_pos = false; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {62 121 220 20} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_twoA { label {Two bars (scheme 1)} callback {progdefaults.mbar2_pos = 1; progdefaults.mbar1_pos = true; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {62 151 220 20} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_twoB { label {Two bars (scheme 2)} callback {progdefaults.mbar2_pos = 2; progdefaults.mbar1_pos = true; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {292 151 219 20} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_twoC { label {Two bars (scheme 3)} callback {progdefaults.mbar2_pos = 3; progdefaults.mbar1_pos = true; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {62 181 220 20} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_twoD { label {Two bars (scheme 4)} callback {progdefaults.mbar2_pos = 1; progdefaults.mbar1_pos = false; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {292 181 220 20} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_twoE { label {Two bars (scheme 5)} callback {progdefaults.mbar2_pos = 2; progdefaults.mbar1_pos = false; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {62 211 220 20} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_twoF { label {Two bars (scheme 6)} callback {progdefaults.mbar2_pos = 3; progdefaults.mbar1_pos = false; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {292 211 220 20} type Radio down_box ROUND_DOWN_BOX } } Fl_Group {} {open xywh {52 299 496 76} box ENGRAVED_FRAME } { Fl_Check_Button btnUseLastMacro { label {Load last used macro file on startup} callback {progdefaults.UseLastMacro = o->value(); update_main_title(); progdefaults.changed = true;} tooltip {ON - use last set of macros OFF - use default set} xywh {62 305 277 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseLastMacro);} } Fl_Check_Button btnDisplayMacroFilename { label {Display macro filename on startup} callback {progdefaults.DisplayMacroFilename = o->value(); progdefaults.changed = true;} tooltip {The filename is written to the RX text area} xywh {62 327 277 20} down_box DOWN_BOX code0 {o->value(progdefaults.DisplayMacroFilename);} } Fl_Check_Button btn_save_macros_on_exit { label {Prompt to save macro file when closing} callback {btn2_save_macros_on_exit->value(o->value()); progdefaults.SaveMacros = o->value(); progdefaults.changed = true;} tooltip {Write current macro set on program exit} xywh {62 349 305 20} down_box DOWN_BOX code0 {o->value(progdefaults.SaveMacros);} } } } Fl_Group tabWF_UI { label {WF Ctrls} xywh {0 50 600 330} hide } { Fl_Group {} {open xywh {52 83 496 253} box ENGRAVED_BOX } { Fl_Box {} { label {Enable check box to show each respective operator control} xywh {81 90 446 25} box FLAT_BOX align 16 } Fl_Check_Button btnWF_UIrev { label Reverse callback {progdefaults.WF_UIrev = o->value(); progdefaults.changed = true; WF_UI();} xywh {108 123 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIrev);} } Fl_Check_Button btnWF_UIx1 { label {WF Magnification} callback {progdefaults.WF_UIx1 = o->value(); progdefaults.changed = true; WF_UI();} xywh {327 123 162 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIx1);} } Fl_Check_Button btnWF_UIwfcarrier { label {WF carrier} callback {progdefaults.WF_UIwfcarrier = o->value(); progdefaults.changed = true; WF_UI();} xywh {108 154 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfcarrier);} } Fl_Check_Button btnWF_UIwfshift { label {WF Shift Controls} callback {progdefaults.WF_UIwfshift = o->value(); progdefaults.changed = true; WF_UI();} xywh {327 154 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfshift);} } Fl_Check_Button btnWF_UIwfreflevel { label {WF ref level} callback {progdefaults.WF_UIwfreflevel = o->value(); progdefaults.changed = true; WF_UI();} xywh {108 186 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfreflevel);} } Fl_Check_Button btnWF_UIwfdrop { label {WF drop rate} callback {progdefaults.WF_UIwfdrop = o->value(); progdefaults.changed = true; WF_UI();} xywh {327 186 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfdrop);} } Fl_Check_Button btnWF_UIwfampspan { label {WF amp span} callback {progdefaults.WF_UIwfampspan = o->value(); progdefaults.changed = true; WF_UI();} xywh {108 218 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfampspan);} } Fl_Check_Button btnWF_UIwfstore { label {WF Store} callback {progdefaults.WF_UIwfstore = o->value(); progdefaults.changed = true; WF_UI();} xywh {327 218 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfstore);} } Fl_Check_Button btnWF_UIwfmode { label {WF mode} callback {progdefaults.WF_UIwfmode = o->value(); progdefaults.changed = true; WF_UI();} xywh {108 250 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfmode);} } Fl_Check_Button btnWF_UIqsy { label QSY callback {progdefaults.WF_UIqsy = o->value(); progdefaults.changed = true; WF_UI();} xywh {327 250 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIqsy);} } Fl_Check_Button btnWF_UIxmtlock { label {XMT lock} callback {progdefaults.WF_UIxmtlock = o->value(); progdefaults.changed = true; WF_UI();} xywh {327 282 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIxmtlock);} } Fl_Button btn_wf_enable_all { label {Enable all} callback {btnWF_UIrev->value(progdefaults.WF_UIrev = 1); btnWF_UIwfcarrier->value(progdefaults.WF_UIwfcarrier = 1); btnWF_UIwfreflevel->value(progdefaults.WF_UIwfreflevel = 1); btnWF_UIwfampspan->value(progdefaults.WF_UIwfampspan = 1); btnWF_UIwfmode->value(progdefaults.WF_UIwfmode = 1); btnWF_UIx1->value(progdefaults.WF_UIx1 = 1); btnWF_UIwfshift->value(progdefaults.WF_UIwfshift = 1); btnWF_UIwfdrop->value(progdefaults.WF_UIwfdrop = 1); btnWF_UIwfstore->value(progdefaults.WF_UIwfstore = 1); btnWF_UIqsy->value(progdefaults.WF_UIqsy = 1); btnWF_UIxmtlock->value(progdefaults.WF_UIxmtlock = 1); progdefaults.changed = true; WF_UI();} xywh {152 305 88 20} } Fl_Button btn_wf_disable_all { label {Disable all} callback {btnWF_UIrev->value(progdefaults.WF_UIrev = 0); btnWF_UIwfcarrier->value(progdefaults.WF_UIwfcarrier = 0); btnWF_UIwfreflevel->value(progdefaults.WF_UIwfreflevel = 0); btnWF_UIwfampspan->value(progdefaults.WF_UIwfampspan = 0); btnWF_UIwfmode->value(progdefaults.WF_UIwfmode = 0); btnWF_UIx1->value(progdefaults.WF_UIx1 = 0); btnWF_UIwfshift->value(progdefaults.WF_UIwfshift = 0); btnWF_UIwfdrop->value(progdefaults.WF_UIwfdrop = 0); btnWF_UIwfstore->value(progdefaults.WF_UIwfstore = 0); btnWF_UIqsy->value(progdefaults.WF_UIqsy = 0); btnWF_UIxmtlock->value(progdefaults.WF_UIxmtlock = 0); progdefaults.changed = true; WF_UI();} xywh {351 305 88 20} } } } Fl_Group tabColorsFonts { label {Colors/Fonts} open xywh {0 50 600 330} hide } { Fl_Tabs tabsColors {open xywh {0 55 600 325} } { Fl_Group {} { label {Rx/Tx} open xywh {0 75 600 305} } { Fl_Group listbox_charset_status { label {Rx/Tx Character set} open tooltip {Select Rx/Tx Character Set} xywh {99 109 165 24} box BORDER_BOX color 55 align 8 code0 {\#include "fl_digi.h"} code1 {o->labelsize(FL_NORMAL_SIZE); listbox_charset_status->callback(cb_listbox_charset, 0);} class Fl_ListBox } {} Fl_Input RxText { xywh {99 143 165 36} code0 {RxText->value("Receive Text");} code1 {RxText->color(fl_rgb_color(progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B));} code2 {RxText->textfont(progdefaults.RxFontnbr); RxText->textsize(progdefaults.RxFontsize); RxText->textcolor(progdefaults.RxFontcolor);} code3 {RxText->type(FL_MULTILINE_INPUT_WRAP);} } Fl_Button btnRxColor { label {Rx bkgnd} callback {uchar r, g, b; r = progdefaults.RxColor.R; g = progdefaults.RxColor.G; b = progdefaults.RxColor.B; if (!fl_color_chooser("Rx Color", r, g, b)) return; progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; RxText->color(fl_rgb_color(r,g,b)); ReceiveText->color(RxText->color()); RxText->redraw(); ReceiveText->redraw(); progdefaults.changed = true;} xywh {273 150 75 21} } Fl_Button btnTxColor { label {Tx bkgnd} callback {uchar r, g, b; r = progdefaults.TxColor.R; g = progdefaults.TxColor.G; b = progdefaults.TxColor.B; if (!fl_color_chooser("Tx Color", r, g, b)) return; progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; TxText->color(fl_rgb_color(r,g,b)); TransmitText->color(TxText->color()); TxText->redraw(); TransmitText->redraw(); progdefaults.changed = true;} xywh {273 191 75 21} } Fl_Input TxText { xywh {99 186 165 37} code0 {TxText->value("Transmit Text");} code1 {TxText->color(fl_rgb_color(progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B));} code2 {TxText->textfont(progdefaults.TxFontnbr); TxText->textsize(progdefaults.TxFontsize); TxText->textcolor(progdefaults.TxFontcolor);} code3 {TxText->type(FL_MULTILINE_INPUT_WRAP);} } Fl_Button btnRxFont { label {Rx font} callback {font_browser->fontNumber(progdefaults.RxFontnbr); font_browser->fontSize(progdefaults.RxFontsize); font_browser->fontColor(progdefaults.RxFontcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbRxFontBrowser); font_browser->show();} xywh {358 150 75 21} } Fl_Button btnTxFont { label {Tx font} callback {font_browser->fontNumber(progdefaults.TxFontnbr); font_browser->fontSize(progdefaults.TxFontsize); font_browser->fontColor(progdefaults.TxFontcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbTxFontBrowser); font_browser->show();} xywh {358 191 75 21} } Fl_Group {} { label {Text Highlighting} open xywh {71 235 404 81} box ENGRAVED_FRAME align 17 } { Fl_Button btnXMIT { label XMIT callback {choose_color(progdefaults.XMITcolor); btnXMIT->color( progdefaults.XMITcolor ); btnXMIT->redraw(); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); progdefaults.changed = true;} tooltip {Sent chars in Rx/Tx pane} xywh {89 263 40 21} align 2 code0 {btnXMIT->color(progdefaults.XMITcolor);} } Fl_Button btnCTRL { label CTRL callback {choose_color(progdefaults.CTRLcolor); btnCTRL->color( progdefaults.CTRLcolor ); btnCTRL->redraw(); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); progdefaults.changed = true;} tooltip {Control chars in Rx/Tx pane} xywh {132 263 40 21} align 2 code0 {btnCTRL->color(progdefaults.CTRLcolor);} } Fl_Button btnSKIP { label SKIP callback {choose_color(progdefaults.SKIPcolor); btnSKIP->color( progdefaults.SKIPcolor ); btnSKIP->redraw(); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); progdefaults.changed = true;} tooltip {Skipped chars in Tx pane (Tx on/off in CW)} xywh {176 263 40 21} align 2 code0 {btnSKIP->color(progdefaults.SKIPcolor);} } Fl_Button btnALTR { label ALTR callback {choose_color(progdefaults.ALTRcolor); btnALTR->color( progdefaults.ALTRcolor ); btnALTR->redraw(); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); progdefaults.changed = true;} tooltip {Alternate character color in Rx panelr} xywh {219 263 40 21} align 2 code0 {btnALTR->color(progdefaults.ALTRcolor);} } Fl_Button btnSEL { label SEL callback {choose_color(progdefaults.RxTxSelectcolor); btnSEL->color( progdefaults.RxTxSelectcolor ); btnSEL->redraw(); ReceiveText->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); TransmitText->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); progdefaults.changed = true;} tooltip {Selection background color in Rx Tx panels} xywh {263 263 39 21} align 2 code0 {btnSEL->color(progdefaults.RxTxSelectcolor);} } Fl_Button btnNoTextColor { label System callback {uchar r, g, b; Fl_Color clr = FL_BACKGROUND2_COLOR; Fl::get_color(clr, r, g, b); progdefaults.TxFontcolor = FL_BLACK; progdefaults.RxFontcolor = FL_BLACK; progdefaults.XMITcolor = FL_RED; progdefaults.CTRLcolor = FL_DARK_GREEN; progdefaults.SKIPcolor = FL_BLUE; progdefaults.ALTRcolor = FL_DARK_MAGENTA; btnXMIT->color(progdefaults.XMITcolor); btnCTRL->color(progdefaults.CTRLcolor); btnSKIP->color(progdefaults.SKIPcolor); btnALTR->color(progdefaults.ALTRcolor); btnXMIT->redraw(); btnCTRL->redraw(); btnSKIP->redraw(); btnALTR->redraw(); progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; clr = fl_rgb_color(r,g,b); RxText->color(clr); RxText->textcolor(progdefaults.RxFontcolor); RxText->redraw(); ReceiveText->color(clr); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->redraw(); progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; TxText->color(clr); TxText->textcolor(progdefaults.TxFontcolor); TxText->redraw(); TransmitText->color(clr); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->redraw(); progdefaults.changed = true;} xywh {310 263 70 21} } Fl_Button btnTextDefaults { label Defaults callback {uchar r, g, b; Fl_Color clr; progdefaults.TxFontcolor = FL_BLACK; progdefaults.RxFontcolor = FL_BLACK; progdefaults.XMITcolor = FL_RED; progdefaults.CTRLcolor = FL_DARK_GREEN; progdefaults.SKIPcolor = FL_BLUE; progdefaults.ALTRcolor = FL_DARK_MAGENTA; btnXMIT->color(progdefaults.XMITcolor); btnCTRL->color(progdefaults.CTRLcolor); btnSKIP->color(progdefaults.SKIPcolor); btnALTR->color(progdefaults.ALTRcolor); btnXMIT->redraw(); btnCTRL->redraw(); btnSKIP->redraw(); btnALTR->redraw(); r = 255; g = 242; b = 190; progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; clr = fl_rgb_color(r,g,b); RxText->color(clr); RxText->textcolor(progdefaults.RxFontcolor); RxText->redraw(); ReceiveText->color(clr); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->redraw(); r = 200; g = 235; b = 255; progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; clr = fl_rgb_color(r,g,b); TxText->color(clr); TxText->textcolor(progdefaults.TxFontcolor); TxText->redraw(); TransmitText->color(clr); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->redraw(); progdefaults.changed = true;} xywh {384 263 70 21} } } } Fl_Group {} { label {Frq Disp} open xywh {0 75 600 305} hide } { Fl_Group {} {open xywh {115 108 370 87} box ENGRAVED_FRAME } { Fl_Box FDdisplay { label {14070.150} xywh {182 112 235 45} box DOWN_BOX color 55 labelfont 4 labelsize 40 code0 {o->color(fl_rgb_color(progdefaults.FDbackground.R,progdefaults.FDbackground.G,progdefaults.FDbackground.B));} code1 {o->labelcolor(fl_rgb_color(progdefaults.FDforeground.R,progdefaults.FDforeground.G,progdefaults.FDforeground.B));} code2 {o->labelfont(progdefaults.FreqControlFontnbr);} } Fl_Button btn_freq_control_font { label Font callback {font_browser->fontNumber(progdefaults.FreqControlFontnbr); font_browser->fontSize(14); font_browser->fontColor(FL_FOREGROUND_COLOR); font_browser->fontFilter(Font_Browser::FIXED_WIDTH); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbFreqControlFontBrowser); font_browser->show();} xywh {125 163 80 24} } Fl_Button btnBackgroundColor { label {Bg Color} callback {uchar r, g, b; r = progdefaults.FDbackground.R; g = progdefaults.FDbackground.G; b = progdefaults.FDbackground.B; if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.FDbackground.R = r; progdefaults.FDbackground.G = g; progdefaults.FDbackground.B = b; FDdisplay->color(fl_rgb_color(r,g,b)); FDdisplay->redraw(); if (qsoFreqDisp) { qsoFreqDisp->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true;} xywh {215 163 80 24} } Fl_Button btnForegroundColor { label {Digit Color} callback {uchar r, g, b; r = progdefaults.FDforeground.R; g = progdefaults.FDforeground.G; b = progdefaults.FDforeground.B; if (!fl_color_chooser("Foreground", r, g, b)) return; progdefaults.FDforeground.R = r; progdefaults.FDforeground.G = g; progdefaults.FDforeground.B = b; FDdisplay->labelcolor(fl_rgb_color(r,g,b)); FDdisplay->redraw(); if (qsoFreqDisp) { qsoFreqDisp->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true;} xywh {305 163 80 24} } Fl_Button btnFD_SystemColor { label {Sys Colors} callback {uchar r, g, b; Fl_Color clr = FL_BACKGROUND2_COLOR; Fl::get_color(clr, r, g, b); progdefaults.FDbackground.R = r; progdefaults.FDbackground.G = g; progdefaults.FDbackground.B = b; FDdisplay->color(clr); clr = FL_FOREGROUND_COLOR; Fl::get_color(clr, r, g, b); FDdisplay->labelcolor(clr); FDdisplay->redraw(); progdefaults.FDforeground.R = r; progdefaults.FDforeground.G = g; progdefaults.FDforeground.B = b; if (qsoFreqDisp) { qsoFreqDisp->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true;} xywh {396 163 80 24} } } } Fl_Group {} { label Log open xywh {0 75 600 305} hide } { Fl_Group {} { label {Logging Panel Controls} open xywh {114 101 372 65} box ENGRAVED_FRAME align 21 } { Fl_Output LOGGINGdisplay { xywh {132 125 98 25} code0 {o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize);o->textcolor(progdefaults.LOGGINGtextcolor);} code1 {o->color(progdefaults.LOGGINGcolor);} code2 {o->value("W1HKJ");} code3 {o->redraw();} } Fl_Button btnLOGGING_color { label {Bg Color} callback {uchar r, g, b; Fl::get_color(progdefaults.LOGGINGcolor, r, g, b); if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.LOGGINGcolor = fl_rgb_color(r, g, b); LOGGINGdisplay->color(progdefaults.LOGGINGcolor); LOGGINGdisplay->redraw(); LOGGING_colors_font(); progdefaults.changed = true;} xywh {240 125 80 25} } Fl_Button btn_LOGGING_font { label Font callback {font_browser->fontNumber(progdefaults.LOGGINGtextfont); font_browser->fontSize(progdefaults.LOGGINGtextsize); font_browser->fontColor(progdefaults.LOGGINGtextcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbLOGGINGFontBrowser); font_browser->show();} xywh {330 125 55 25} } Fl_Button btnLOGGINGdefault_colors_font { label Default callback {progdefaults.LOGGINGcolor = FL_BACKGROUND2_COLOR; progdefaults.LOGGINGtextfont = (Fl_Font)0; progdefaults.LOGGINGtextsize = 12; progdefaults.LOGGINGtextcolor = FL_BLACK; LOGGINGdisplay->color(progdefaults.LOGGINGcolor); LOGGINGdisplay->textsize(progdefaults.LOGGINGtextsize); LOGGINGdisplay->textcolor(progdefaults.LOGGINGtextcolor); LOGGINGdisplay->textfont(progdefaults.LOGGINGtextfont); LOGGINGdisplay->redraw(); LOGGING_colors_font(); progdefaults.changed = true;} xywh {396 125 80 25} } } Fl_Group {} { label {Logbook Dialog} open xywh {115 176 370 65} box ENGRAVED_FRAME align 21 } { Fl_Output LOGBOOKdisplay { xywh {131 200 98 25} code0 {o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize);o->textcolor(progdefaults.LOGBOOKtextcolor);} code1 {o->color(progdefaults.LOGBOOKcolor);} code2 {o->value("14.070000");} code3 {o->redraw();} } Fl_Button btnLOGBOOK_color { label {Bg Color} callback {uchar r, g, b; Fl::get_color(progdefaults.LOGBOOKcolor, r, g, b); if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.LOGBOOKcolor = fl_rgb_color(r, g, b); LOGBOOKdisplay->color(progdefaults.LOGBOOKcolor); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); progdefaults.changed = true;} xywh {239 200 80 25} } Fl_Button btn_LOGBOOK_font { label Font callback {font_browser->fontNumber(progdefaults.LOGBOOKtextfont); font_browser->fontSize(progdefaults.LOGBOOKtextsize); font_browser->fontColor(progdefaults.LOGBOOKtextcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbLOGBOOKFontBrowser); font_browser->show();} xywh {329 200 55 25} } Fl_Button btnLOGBOOKdefault_colors_font { label Default callback {progdefaults.LOGBOOKcolor = FL_BACKGROUND2_COLOR; progdefaults.LOGBOOKtextfont = (Fl_Font)0; progdefaults.LOGBOOKtextsize = 12; progdefaults.LOGBOOKtextcolor = FL_BLACK; LOGBOOKdisplay->color(progdefaults.LOGBOOKcolor); LOGBOOKdisplay->textsize(progdefaults.LOGBOOKtextsize); LOGBOOKdisplay->textcolor(progdefaults.LOGBOOKtextcolor); LOGBOOKdisplay->textfont(progdefaults.LOGBOOKtextfont); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); progdefaults.changed = true;} xywh {395 200 80 25} } } } Fl_Group {} { label F_keys open xywh {0 75 600 305} hide } { Fl_Check_Button btnUseGroupColors { label {Use colored buttons} callback {progdefaults.useGroupColors = o->value(); colorize_macros(); progdefaults.changed = true;} xywh {135 107 165 21} down_box DOWN_BOX code0 {btnUseGroupColors->value(progdefaults.useGroupColors);} } Fl_Button btnGroup1 { label {Group 1} callback {uchar r, g, b; r = progdefaults.btnGroup1.R; g = progdefaults.btnGroup1.G; b = progdefaults.btnGroup1.B; if (fl_color_chooser("Group 1", r, g, b) == 0) return; progdefaults.btnGroup1.R = r; progdefaults.btnGroup1.G = g; progdefaults.btnGroup1.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true;} tooltip {Background color for Function key group 1} xywh {135 139 75 20} code0 {btnGroup1->color(fl_rgb_color(progdefaults.btnGroup1.R, progdefaults.btnGroup1.G,progdefaults.btnGroup1.B));} code1 {btnGroup1->labelcolor(fl_rgb_color(progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.R));} } Fl_Button btnGroup2 { label {Group 2} callback {uchar r, g, b; r = progdefaults.btnGroup2.R; g = progdefaults.btnGroup2.G; b = progdefaults.btnGroup2.B; if (fl_color_chooser("Group 2", r, g, b) == 0) return; progdefaults.btnGroup2.R = r; progdefaults.btnGroup2.G = g; progdefaults.btnGroup2.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true;} tooltip {Background color for Function key group 2} xywh {226 139 75 20} code0 {btnGroup2->color(fl_rgb_color(progdefaults.btnGroup2.R, progdefaults.btnGroup2.G,progdefaults.btnGroup2.B));} code1 {btnGroup2->labelcolor(fl_rgb_color(progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.R));} } Fl_Button btnGroup3 { label {Group 3} callback {uchar r, g, b; r = progdefaults.btnGroup3.R; g = progdefaults.btnGroup3.G; b = progdefaults.btnGroup3.B; if (fl_color_chooser("Group 3", r, g, b) == 0) return; progdefaults.btnGroup3.R = r; progdefaults.btnGroup3.G = g; progdefaults.btnGroup3.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true;} tooltip {Background color for Function key group 3} xywh {318 139 75 20} code0 {btnGroup3->color(fl_rgb_color(progdefaults.btnGroup3.R, progdefaults.btnGroup3.G,progdefaults.btnGroup3.B));} code1 {btnGroup3->labelcolor(fl_rgb_color(progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.R));} } Fl_Button btnFkeyTextColor { label {Label text} callback {uchar r, g, b; r = progdefaults.btnFkeyTextColor.R; g = progdefaults.btnFkeyTextColor.G; b = progdefaults.btnFkeyTextColor.B; if (fl_color_chooser("Fkey Text", r, g, b) == 0) return; progdefaults.btnFkeyTextColor.R = r; progdefaults.btnFkeyTextColor.G = g; progdefaults.btnFkeyTextColor.B = b; o->color(fl_rgb_color(r,g,b)); adjust_label(o); btnGroup1->labelcolor(fl_rgb_color(r,g,b)); btnGroup2->labelcolor(fl_rgb_color(r,g,b)); btnGroup3->labelcolor(fl_rgb_color(r,g,b)); btnGroup1->redraw_label(); btnGroup2->redraw_label(); btnGroup3->redraw_label(); progdefaults.changed = true; colorize_macros();} xywh {318 107 75 21} code0 {btnFkeyTextColor->color(fl_rgb_color(progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.G, progdefaults.btnFkeyTextColor.B));} code1 {adjust_label(btnFkeyTextColor);} } Fl_Button btnFkeyDEfaults { label Defaults callback {uchar r, g, b; Fl_Color clr; r = 80; g = 144; b = 144; clr = fl_rgb_color(r,g,b); btnGroup1->color(clr); progdefaults.btnGroup1.R = r; progdefaults.btnGroup1.G = g; progdefaults.btnGroup1.B = b; r = 144; g = 80; b = 80; clr = fl_rgb_color(r,g,b); btnGroup2->color(clr); progdefaults.btnGroup2.R = r; progdefaults.btnGroup2.G = g; progdefaults.btnGroup2.B = b; r = 80; g = 80; b = 144; clr = fl_rgb_color(r,g,b); btnGroup3->color(clr); progdefaults.btnGroup3.R = r; progdefaults.btnGroup3.G = g; progdefaults.btnGroup3.B = b; r = 255; g = 255; b = 255; clr = fl_rgb_color(r,g,b); btnFkeyTextColor->color(clr); btnFkeyTextColor->redraw_label(); progdefaults.btnFkeyTextColor.R = r; progdefaults.btnFkeyTextColor.G = g; progdefaults.btnFkeyTextColor.B = b; btnGroup1->labelcolor(clr); btnGroup1->redraw_label(); btnGroup2->labelcolor(clr); btnGroup2->redraw_label(); btnGroup3->labelcolor(clr); btnGroup3->redraw_label(); colorize_macros(); progdefaults.changed = true;} xywh {410 139 75 20} } } Fl_Group {} { label Tabs open xywh {0 75 600 305} hide } { Fl_Button btnTabColor { label {Tab Color} callback {progdefaults.TabsColor = fl_show_colormap(progdefaults.TabsColor); setTabColors(); progdefaults.changed = true;} xywh {200 113 75 21} } Fl_Button btnTabDefaultColor { label System callback {progdefaults.TabsColor = FL_BACKGROUND2_COLOR; setTabColors(); progdefaults.changed = true;} xywh {330 113 75 21} } } Fl_Group {} { label Buttons open xywh {0 75 600 305} hide } { Fl_Button btnSpotColor { label Spot callback {progdefaults.SpotColor = fl_show_colormap(progdefaults.SpotColor); spotcolor->color(progdefaults.SpotColor); spotcolor->redraw(); spot_selection_color(); progdefaults.changed = true;} xywh {159 121 70 21} } Fl_Button btnRxIDColor { label RxID callback {progdefaults.RxIDColor = fl_show_colormap(progdefaults.RxIDColor); rxidcolor->color(progdefaults.RxIDColor); rxidcolor->redraw(); rxid_selection_color(); progdefaults.changed = true;} xywh {159 157 70 21} } Fl_Button btnTxIDColor { label TxID callback {progdefaults.TxIDColor = fl_show_colormap(progdefaults.TxIDColor); txidcolor->color(progdefaults.TxIDColor); txidcolor->redraw(); txid_selection_color(); progdefaults.changed = true;} xywh {159 193 70 20} } Fl_Button btnTuneColor { label Tune callback {progdefaults.TuneColor = fl_show_colormap(progdefaults.TuneColor); tunecolor->color(progdefaults.TuneColor); tunecolor->redraw(); tune_selection_color(); progdefaults.changed = true;} xywh {159 229 70 21} } Fl_Button btnLkColor { label Lk callback {progdefaults.LkColor = fl_show_colormap(progdefaults.LkColor); lockcolor->color(progdefaults.LkColor); lockcolor->redraw(); xmtlock_selection_color(); progdefaults.changed = true;} xywh {274 121 70 21} } Fl_Button btnRevColor { label Rev callback {progdefaults.RevColor = fl_show_colormap(progdefaults.RevColor); revcolor->color(progdefaults.RevColor); revcolor->redraw(); rev_selection_color(); progdefaults.changed = true;} xywh {274 157 70 21} } Fl_Button btnXmtColor { label {T/R} callback {progdefaults.XmtColor = fl_show_colormap(progdefaults.XmtColor); xmtcolor->color(progdefaults.XmtColor); xmtcolor->redraw(); xmtrcv_selection_color(); progdefaults.changed = true;} xywh {274 193 70 20} } Fl_Button btnAfcColor { label AFC callback {progdefaults.AfcColor = fl_show_colormap(progdefaults.AfcColor); afccolor->color(progdefaults.AfcColor); afccolor->redraw(); afc_selection_color(); progdefaults.changed = true;} xywh {390 121 70 21} } Fl_Button btnSql1Color { label {SQL-1} callback {progdefaults.Sql1Color = fl_show_colormap(progdefaults.Sql1Color); sql1color->color(progdefaults.Sql1Color); sql1color->redraw(); sql_selection_color(); progdefaults.changed = true;} xywh {390 157 70 21} } Fl_Button btnSql2Color { label {SQL-2} callback {progdefaults.Sql2Color = fl_show_colormap(progdefaults.Sql2Color); sql2color->color(progdefaults.Sql2Color); sql2color->redraw(); sql_selection_color(); progdefaults.changed = true;} xywh {390 193 70 20} } Fl_Box spotcolor { xywh {135 122 18 19} box THIN_DOWN_BOX color 3 code0 {o->color(progdefaults.SpotColor);} } Fl_Box rxidcolor { xywh {135 158 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.RxIDColor);} } Fl_Box txidcolor { xywh {135 194 18 18} box THIN_DOWN_BOX code0 {o->color(progdefaults.TxIDColor);} } Fl_Box tunecolor { xywh {135 230 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.TuneColor);} } Fl_Box lockcolor { xywh {250 122 18 19} box THIN_DOWN_BOX color 3 code0 {o->color(progdefaults.LkColor);} } Fl_Box revcolor { xywh {250 158 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.RevColor);} } Fl_Box xmtcolor { xywh {250 194 18 18} box THIN_DOWN_BOX code0 {o->color(progdefaults.XmtColor);} } Fl_Box afccolor { xywh {365 122 18 19} box THIN_DOWN_BOX color 3 code0 {o->color(progdefaults.AfcColor);} } Fl_Box sql1color { xywh {365 158 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.Sql1Color);} } Fl_Box sql2color { xywh {365 194 18 18} box THIN_DOWN_BOX code0 {o->color(progdefaults.Sql2Color);} } Fl_Box {} { label {Lighted button enabled colors} xywh {248 229 220 20} align 21 } } Fl_Group {} { label SigLvl open xywh {0 75 600 305} hide } { Fl_Button btnLowSignal { label Low callback {progdefaults.LowSignal = fl_show_colormap(progdefaults.LowSignal); lowcolor->color(progdefaults.LowSignal); lowcolor->redraw(); progdefaults.changed = true;} xywh {210 142 70 21} } Fl_Box lowcolor { xywh {189 142 21 21} box DIAMOND_DOWN_BOX color 0 code0 {o->color(progdefaults.LowSignal);} } Fl_Button btnHighSignal { label High callback {progdefaults.HighSignal = fl_show_colormap(progdefaults.HighSignal); highcolor->color(progdefaults.HighSignal); highcolor->redraw(); progdefaults.changed = true;} xywh {210 180 70 21} } Fl_Box highcolor { xywh {189 180 21 21} box DIAMOND_DOWN_BOX color 3 code0 {o->color(progdefaults.HighSignal);} } Fl_Button btnNormalSignal { label Normal callback {progdefaults.NormSignal = fl_show_colormap(progdefaults.NormSignal); normalcolor->color(progdefaults.NormSignal); normalcolor->redraw(); progdefaults.changed = true;} xywh {333 142 70 21} } Fl_Box normalcolor { xywh {312 141 21 21} box DIAMOND_DOWN_BOX color 2 code0 {o->color(progdefaults.NormSignal);} } Fl_Button btnOverSignal { label Over callback {progdefaults.OverSignal = fl_show_colormap(progdefaults.OverSignal); overcolor->color(progdefaults.OverSignal); overcolor->redraw(); progdefaults.changed = true;} xywh {333 180 70 21} } Fl_Box overcolor { xywh {312 180 21 21} box DIAMOND_DOWN_BOX color 1 code0 {o->color(progdefaults.OverSignal);} } Fl_Box {} { label {Signal Level Colors} xywh {135 110 316 21} } } } } } } Fl_Group tabWaterfall { label Waterfall open xywh {0 25 600 355} hide } { Fl_Tabs tabsWaterfall {open xywh {0 25 600 355} color 50 selection_color 50 } { Fl_Group {} { label Display open xywh {0 50 600 330} } { Fl_Group {} { label {Colors and cursors} open xywh {50 63 496 190} box ENGRAVED_FRAME align 21 } { Fl_Button WF_Palette { label aa callback {progdefaults.changed = true;} xywh {60 99 380 24} box DOWN_BOX color 0 labelsize 12 align 5 code0 {\#include "colorbox.h"} code1 {o->label(progdefaults.PaletteName.c_str());} code2 {o->labelsize(FL_NORMAL_SIZE);} class colorbox } Fl_Button {btnColor[0]} { callback {selectColor(0); progdefaults.changed = true;} tooltip {Change color} xywh {60 125 20 24} } Fl_Button {btnColor[1]} { callback {selectColor(1); progdefaults.changed = true;} tooltip {Change color} xywh {105 125 20 24} } Fl_Button {btnColor[2]} { callback {selectColor(2); progdefaults.changed = true;} tooltip {Change color} xywh {150 125 20 24} } Fl_Button {btnColor[3]} { callback {selectColor(3); progdefaults.changed = true;} tooltip {Change color} xywh {195 125 20 24} } Fl_Button {btnColor[4]} { callback {selectColor(4); progdefaults.changed = true;} tooltip {Change color} xywh {240 125 20 24} } Fl_Button {btnColor[5]} { callback {selectColor(5); progdefaults.changed = true;} tooltip {Change color} xywh {285 125 20 24} } Fl_Button {btnColor[6]} { callback {selectColor(6); progdefaults.changed = true;} tooltip {Change color} xywh {330 125 20 24} } Fl_Button {btnColor[7]} { callback {selectColor(7); progdefaults.changed = true;} tooltip {Change color} xywh {375 125 20 24} } Fl_Button {btnColor[8]} { callback {selectColor(8); progdefaults.changed = true;} tooltip {Change color} xywh {420 125 20 24} } Fl_Button btnLoadPalette { label {Load...} callback {loadPalette(); progdefaults.changed = true;} tooltip {Load a new palette} xywh {450 99 70 24} code0 {\#include "colorbox.h"} } Fl_Button btnSavePalette { label {Save...} callback {savePalette();} tooltip {Save this palette} xywh {450 125 70 24} code0 {\#include "colorbox.h"} } Fl_Group {} { label Bandwidth open xywh {59 153 113 96} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnUseCursorLines { label ON callback {progdefaults.UseCursorLines = o->value(); if (o->value()) btnCursorBWcolor->activate(); else btnCursorBWcolor->deactivate(); progdefaults.changed = true;} tooltip {Show cursor with bandwidth lines} xywh {61 173 56 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseCursorLines);} } Fl_Button btnCursorBWcolor { label Color callback {if (fl_color_chooser("Cursor BW Lines", progdefaults.cursorLineRGBI.R, progdefaults.cursorLineRGBI.G, progdefaults.cursorLineRGBI.B) ) { o->color(fl_rgb_color(progdefaults.cursorLineRGBI.R,progdefaults.cursorLineRGBI.G,progdefaults.cursorLineRGBI.B)); o->redraw(); progdefaults.changed = true; }} tooltip {Change color} xywh {61 196 20 20} color 3 align 8 code0 {\#include } code1 {o->color(fl_rgb_color(progdefaults.cursorLineRGBI.R,progdefaults.cursorLineRGBI.G,progdefaults.cursorLineRGBI.B));} } Fl_Check_Button btnUseWideCursor { label Wide callback {progdefaults.UseWideCursor = o->value(); progdefaults.changed = true;} tooltip {Show bandwidth tracks on waterfall} xywh {61 219 62 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseWideCursor);} } } Fl_Group {} { label {Center line} open xywh {183 153 113 96} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnUseCursorCenterLine { label ON callback {progdefaults.UseCursorCenterLine = o->value(); progdefaults.changed = true;} tooltip {Show cursor with center line} xywh {189 173 48 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseCursorCenterLine);} } Fl_Button btnCursorCenterLineColor { label Color callback {if (fl_color_chooser("Cursor Center Line", progdefaults.cursorCenterRGBI.R, progdefaults.cursorCenterRGBI.G, progdefaults.cursorCenterRGBI.B) ) { o->color(fl_rgb_color(progdefaults.cursorCenterRGBI.R,progdefaults.cursorCenterRGBI.G,progdefaults.cursorCenterRGBI.B)); o->redraw(); progdefaults.changed = true; }} tooltip {Change color} xywh {189 196 20 20} color 7 align 8 code0 {o->color(fl_rgb_color(progdefaults.cursorCenterRGBI.R,progdefaults.cursorCenterRGBI.G,progdefaults.cursorCenterRGBI.B));} } Fl_Check_Button btnUseWideCenter { label Wide callback {progdefaults.UseWideCenter = o->value(); progdefaults.changed = true;} tooltip {Show bandwidth tracks on waterfall} xywh {189 221 69 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseWideCenter);} } } Fl_Group {} { label {Signal tracks} open xywh {306 153 113 96} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnUseBWTracks { label ON callback {progdefaults.UseBWTracks = o->value(); progdefaults.changed = true;} tooltip {Show bandwidth tracks on waterfall} xywh {308 172 56 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseBWTracks);} } Fl_Button btnBwTracksColor { label Color callback {if (fl_color_chooser("Track Lines", progdefaults.bwTrackRGBI.R, progdefaults.bwTrackRGBI.G, progdefaults.bwTrackRGBI.B) ) { o->color(fl_rgb_color(progdefaults.bwTrackRGBI.R,progdefaults.bwTrackRGBI.G,progdefaults.bwTrackRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }} tooltip {Change color} xywh {308 195 20 20} color 1 align 8 code0 {o->color(fl_rgb_color(progdefaults.bwTrackRGBI.R,progdefaults.bwTrackRGBI.G,progdefaults.bwTrackRGBI.B));} } Fl_Check_Button btnUseWideTracks { label Wide callback {progdefaults.UseWideTracks = o->value(); progdefaults.changed = true;} tooltip {Show bandwidth tracks on waterfall} xywh {308 219 74 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseWideTracks);} } } Fl_Group {} { label Notch open xywh {426 153 113 96} box ENGRAVED_FRAME align 21 } { Fl_Button btnNotchColor { label Color callback {if (fl_color_chooser("Notch Indicator", progdefaults.notchRGBI.R, progdefaults.notchRGBI.G, progdefaults.notchRGBI.B) ) { o->color(fl_rgb_color(progdefaults.notchRGBI.R,progdefaults.notchRGBI.G,progdefaults.notchRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }} tooltip {Change color} xywh {428 195 20 20} color 1 align 8 code0 {o->color(fl_rgb_color(progdefaults.notchRGBI.R,progdefaults.notchRGBI.G,progdefaults.notchRGBI.B));} } } } Fl_Group {} { label {Frequency scale} open xywh {50 254 496 55} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkShowAudioScale { label {Always show audio frequencies} callback {progdefaults.wf_audioscale = o->value(); progdefaults.changed = true;} tooltip {Audio or RF frequencies on waterfall scale} xywh {60 277 241 20} down_box DOWN_BOX code0 {o->value(progdefaults.wf_audioscale);} } Fl_Button btnWaterfallFont { label {Font...} callback {font_browser->fontNumber(progdefaults.WaterfallFontnbr); font_browser->fontSize(progdefaults.WaterfallFontsize); font_browser->fontColor(FL_FOREGROUND_COLOR); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback((Fl_Callback*)cbWaterfallFontBrowser); font_browser->show();} tooltip {Select waterfall scale font} xywh {360 277 71 24} } } Fl_Group {} { label {Transmit signal} open xywh {50 310 496 65} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnViewXmtSignal { label {Monitor transmitted signal} callback {progdefaults.viewXmtSignal=o->value(); progdefaults.changed = true;} tooltip {Show transmit signal on waterfall} xywh {60 336 208 20} down_box DOWN_BOX code0 {o->value(progdefaults.viewXmtSignal);} } Fl_Value_Slider valTxMonitorLevel { label {Signal level} callback {progdefaults.TxMonitorLevel = o->value(); progdefaults.changed = true;} tooltip {Set level for good viewing} xywh {318 336 203 20} type Horizontal align 1 step 0.05 value 0.5 textsize 14 code0 {o->value(progdefaults.TxMonitorLevel);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } } } Fl_Group {} { label {FFT Processing} open xywh {0 50 600 330} hide } { Fl_Group {} {open xywh {55 71 490 135} box ENGRAVED_FRAME } { Fl_Counter cntLowFreqCutoff { label {Lower limit} callback {progdefaults.LowFreqCutoff=(int)(o->value()); progdefaults.changed = true; setwfrange();} tooltip {Low frequency limit in Hz} xywh {100 89 70 22} type Simple align 8 minimum 0 maximum 500 step 50 value 300 code0 {o->value(progdefaults.LowFreqCutoff);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnWFaveraging { label {FFT averaging} callback {progdefaults.WFaveraging = o->value(); progdefaults.changed = true;} tooltip {Use averaging to decrease waterfall noise} xywh {100 125 120 20} down_box DOWN_BOX code0 {o->value(progdefaults.WFaveraging);} } Fl_Group listboxFFTPrefilter { label {FFT prefilter window function} callback {progdefaults.wfPreFilter = o->index(); progdefaults.changed = true;} open tooltip {Select the type of FFT prefilter} xywh {100 155 120 24} box DOWN_BOX color 7 align 8 code0 {listboxFFTPrefilter->add(_("Rectangular")); listboxFFTPrefilter->add("Blackman");} code1 {listboxFFTPrefilter->add("Hamming"); listboxFFTPrefilter->add("Hanning");} code2 {listboxFFTPrefilter->add(_("Triangular"));} code3 {listboxFFTPrefilter->index(progdefaults.wfPreFilter); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter cntrWfwidth { label {Upper limit} callback {progdefaults.HighFreqCutoff = (int)o->value(); progdefaults.changed = true; setwfrange();} tooltip {High frequency limit in Hz} xywh {323 89 95 22} type Simple align 8 minimum 2000 maximum 4000 step 100 value 3000 code0 {o->value(progdefaults.HighFreqCutoff);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter wf_latency { label Latency callback {progdefaults.wf_latency = (int)o->value(); progdefaults.changed = true;} tooltip {Signal averaging over time 0 - least 4 - greatest} xywh {323 124 95 22} type Simple align 8 minimum 1 maximum 16 step 1 value 8 code0 {o->value(progdefaults.wf_latency);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } } Fl_Group {} { label {Changes take effect on next program startup} open tooltip {Show me more or less waterfall} xywh {55 221 490 80} box ENGRAVED_FRAME align 17 } { Fl_Counter cntrWfheight { label {Waterfall height in pixels} callback {progdefaults.wfheight = (int)o->value(); progdefaults.changed = true;} tooltip {CPU usage increases with waterfall height} xywh {100 251 95 22} type Simple align 8 minimum 100 maximum 250 step 5 value 120 code0 {o->value(progdefaults.wfheight);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } } } Fl_Group {} { label Mouse open xywh {0 50 600 330} hide } { Fl_Group {} {open xywh {55 73 490 170} box ENGRAVED_FRAME } { Fl_Check_Button btnWaterfallHistoryDefault { label {Left or right click always replays audio history} callback {progdefaults.WaterfallHistoryDefault = o->value(); progdefaults.changed = true;} tooltip {Replay trackline audio} xywh {65 87 340 20} down_box DOWN_BOX code0 {o->value(progdefaults.WaterfallHistoryDefault);} } Fl_Check_Button btnWaterfallQSY { label {Dragging on the waterfall scale changes frequency} callback {progdefaults.WaterfallQSY = o->value(); progdefaults.changed = true;} tooltip {Enable drag cursor on waterfall scale} xywh {65 117 380 20} down_box DOWN_BOX code0 {o->value(progdefaults.WaterfallQSY);} } Fl_Check_Button btnWaterfallClickInsert { label {Insert text on single left click} callback {progdefaults.WaterfallClickInsert = o->value(); if (progdefaults.WaterfallClickInsert) inpWaterfallClickText->activate(); else inpWaterfallClickText->deactivate(); progdefaults.changed = true;} tooltip {Insert special text in Rx panel when waterfall clicked} xywh {65 159 225 20} down_box DOWN_BOX code0 {o->value(progdefaults.WaterfallClickInsert);} } Fl_Input inpWaterfallClickText { callback {progdefaults.WaterfallClickText = o->value(); progdefaults.changed = true;} tooltip {The string is replaced with the current modem and frequency} xywh {351 147 180 50} align 8 class Fl_Input2 } } Fl_Group listboxWaterfallWheelAction { label {Wheel action} callback {progdefaults.WaterfallWheelAction = o->index(); progdefaults.changed = true;} open tooltip {Select how the mouse wheel behaves inside the waterfall} xywh {65 207 150 22} box DOWN_BOX color 7 align 8 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } } } Fl_Group tabModems { label Modems open xywh {0 25 600 355} hide } { Fl_Tabs tabsModems {open xywh {0 25 600 355} selection_color 50 align 9 } { Fl_Group tabCW { label CW open xywh {0 50 600 330} } { Fl_Tabs tabsCW {open xywh {0 50 600 330} selection_color 50 } { Fl_Group {} { label General open xywh {0 75 600 305} align 5 } { Fl_Group {} { label Receive open xywh {35 85 530 130} box ENGRAVED_FRAME align 21 } { Fl_Value_Slider sldrCWbandwidth { label {Filter bandwidth} callback {progdefaults.CWbandwidth = (int)o->value(); progdefaults.changed = true;} tooltip {CW dsp filter bandwidth} xywh {50 149 335 20} type Horizontal align 5 minimum 10 maximum 400 step 1 value 66 textsize 14 code0 {o->value(progdefaults.CWbandwidth);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Value_Output valCWrcvWPM { label {Rx WPM} callback {progdefaults.changed = true;} xywh {50 188 35 20} color 7 align 5 } Fl_Progress prgsCWrcvWPM { tooltip {Tracked CW speed in WPM} xywh {86 188 300 20} color 49 selection_color 15 align 0 } Fl_Check_Button btnCWuseSOMdecoding { label {SOM decoding} callback {progdefaults.CWuseSOMdecoding = o->value(); progdefaults.changed = true;} tooltip {Self Organizing Mapping} xywh {63 108 125 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.CWuseSOMdecoding);} } Fl_Counter cntLower { label Lower callback {progdefaults.CWlower = o->value(); progdefaults.changed = true;} tooltip {Detector low threshold} xywh {209 108 65 20} type Simple align 1 minimum 0.01 maximum 0.99 step 0.01 value 0.45 code0 {o->value(progdefaults.CWlower);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntUpper { label Upper callback {progdefaults.CWupper = o->value(); progdefaults.changed = true;} tooltip {Detector high threshold} xywh {302 108 65 20} type Simple align 1 minimum 0.01 maximum 0.99 step 0.01 value 0.55 code0 {o->value(progdefaults.CWupper);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnCWmfilt { label {Matched Filter} callback {progdefaults.CWmfilt = o->value(); progdefaults.changed = true;} tooltip {Matched Filter bandwidth} xywh {397 108 80 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.CWmfilt);} } Fl_Check_Button btnCWuseFFTfilter { label {FFT filter} callback {progdefaults.CWuse_fft_filter = o->value(); progdefaults.changed = true;} tooltip {FFT / FIR filter} xywh {397 134 125 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.CWuse_fft_filter);} } Fl_Check_Button btnCWrcvTrack { label Tracking callback {progdefaults.CWtrack = o->value(); progdefaults.changed = true;} tooltip {Automatic Rx speed tracking} xywh {397 160 80 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.CWtrack);} } Fl_Counter cntCWrange { label {Range, WPM} callback {progdefaults.CWrange = (int)o->value(); progdefaults.changed = true;} tooltip {Range +/- wpm} xywh {397 187 65 20} type Simple align 8 minimum 5 maximum 25 step 1 value 10 code0 {o->value(progdefaults.CWrange);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } } Fl_Group {} { label Transmit open xywh {35 215 530 150} box ENGRAVED_FRAME align 21 } { Fl_Value_Slider sldrCWxmtWPM { label {TX WPM} callback {progdefaults.CWspeed = (int)o->value(); cntCW_WPM->value(progdefaults.CWspeed); progdefaults.changed = true; sync_cw_parameters();} tooltip {My transmit CW WPM} xywh {50 240 440 20} type Horizontal align 8 minimum 5 maximum 100 step 1 value 20 textsize 14 code0 {o->value(progdefaults.CWspeed);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Counter cntCWdefWPM { label Default callback {progdefaults.defCWspeed = (int)o->value(); progdefaults.changed = true;} tooltip {The default CW speed} xywh {91 281 64 20} type Simple align 1 minimum 5 maximum 200 step 1 value 18 code0 {o->value(progdefaults.defCWspeed);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntCWlowerlimit { label {Lower limit} callback {progdefaults.CWlowerlimit = (int)o->value(); progdefaults.changed = true; sldrCWxmtWPM->minimum(progdefaults.CWlowerlimit); sldrCWxmtWPM->value(progdefaults.CWspeed); sldrCWxmtWPM->redraw(); cntCWupperlimit->minimum(progdefaults.CWlowerlimit+20); cntCW_WPM->minimum(progdefaults.CWlowerlimit);} tooltip {No slower than this} xywh {245 281 65 20} type Simple align 1 minimum 5 maximum 20 step 5 value 10 code0 {o->value(progdefaults.CWlowerlimit);} code1 {o->labelsize(FL_NORMAL_SIZE);} } Fl_Counter cntCWupperlimit { label {Upper limit} callback {progdefaults.CWupperlimit = (int)o->value(); progdefaults.changed = true; sldrCWxmtWPM->maximum(progdefaults.CWupperlimit); sldrCWxmtWPM->value(progdefaults.CWspeed); sldrCWxmtWPM->redraw(); cntCWlowerlimit->maximum(progdefaults.CWupperlimit-20); cntCW_WPM->maximum(progdefaults.CWupperlimit);} tooltip {No faster than this} xywh {401 281 65 20} type Simple align 1 minimum 25 maximum 200 step 5 value 100 code0 {o->value(progdefaults.CWupperlimit);} code1 {o->labelsize(FL_NORMAL_SIZE);} } Fl_Value_Slider sldrCWfarnsworth { label {F-WPM} callback {progdefaults.CWfarnsworth = (int)o->value(); progdefaults.changed = true;} tooltip {My transmit CW WPM} xywh {50 335 440 20} type Horizontal align 8 minimum 5 maximum 100 step 1 value 20 textsize 14 code0 {o->value(progdefaults.CWfarnsworth);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button btnCWusefarnsworth { label {Use Farnsworth timing} callback {progdefaults.CWusefarnsworth=o->value(); progdefaults.changed = true;} xywh {70 312 180 15} down_box DOWN_BOX code0 {o->value(progdefaults.CWusefarnsworth);} } } } Fl_Group {} { label {Timing and QSK} open xywh {0 75 600 305} align 5 hide } { Fl_Group {} { label Timing open xywh {35 85 530 120} box ENGRAVED_FRAME align 21 } { Fl_Counter cntCWweight { label {Weight (%)} callback {progdefaults.CWweight=(int)o->value(); progdefaults.changed = true;} tooltip {Dot to dot-space ratio} xywh {45 114 65 20} type Simple align 8 minimum 20 maximum 80 step 1 value 50 code0 {o->value(progdefaults.CWweight);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntCWdash2dot { label {Dash to dot ratio} callback {progdefaults.CWdash2dot=o->value(); progdefaults.changed = true;} tooltip {Dash to dot ratio} xywh {270 114 64 20} type Simple align 8 minimum 2.5 maximum 4 value 3 code0 {o->value(progdefaults.CWdash2dot);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntCWrisetime { label {Edge timing} callback {progdefaults.CWrisetime=o->value(); progdefaults.changed = true;} tooltip {Leading and Trailing edge risetimes (msec)} xywh {270 145 65 20} type Simple align 8 minimum 0 maximum 15 value 4 code0 {o->value(progdefaults.CWrisetime);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Group i_listboxQSKshape { label {Edge shape} callback {progdefaults.QSKshape = o->index()-1; progdefaults.changed = true;} open tooltip {Raised cosine = Hanning} xywh {45 144 112 20} box DOWN_BOX color 7 align 8 code0 {o->add("Hanning|Blackman");} code1 {o->index(progdefaults.QSKshape+1);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button btnCWnarrow { label {Edge decreases pulse width} callback {progdefaults.CWnarrow = o->value(); progdefaults.changed = true;} tooltip {Weight decreases with increasing edge timing} xywh {45 175 225 15} down_box DOWN_BOX code0 {o->value(progdefaults.CWnarrow);} } } Fl_Group {} { label QSK open xywh {35 217 530 118} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnQSK { label {QSK on right audio channel} callback {progdefaults.QSK = o->value(); btnQSK2->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); } }} tooltip {Generate square wave signal on right channel} xywh {45 245 211 20} down_box DOWN_BOX code0 {o->value(progdefaults.QSK);} } Fl_Counter cntPreTiming { label {Pre-keydown timing (ms)} callback {progdefaults.CWpre=o->value(); progdefaults.changed = true;} tooltip {Msec pre-keydown (+ is earlier in time)} xywh {45 275 64 20} type Simple align 8 minimum 0 maximum 20 step 0.5 code0 {o->value(progdefaults.CWpre);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntPostTiming { label {Post-keydown timing (ms)} callback {progdefaults.CWpost=o->value(); progdefaults.changed = true;} tooltip {Msec post-keydown (+ is earlier in time)} xywh {45 305 64 20} type Simple align 8 minimum -20 maximum 20 step 0.5 code0 {o->value(progdefaults.CWpre);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnQSKadjust { label {Send continuously} callback {progdefaults.QSKadjust = o->value();} tooltip {Send a continuous stream of test characters} xywh {320 275 160 20} down_box DOWN_BOX code0 {o->value(progdefaults.QSKadjust);} } Fl_Group i_listbox_test_char { label {Test char} callback {progdefaults.TestChar = o->index()-1;} open tooltip {Test character for QSK adjustment} xywh {320 245 41 20} box DOWN_BOX color 7 align 8 code0 {extern char szTestChar[];} code1 {o->add(szTestChar);} code2 {o->index(progdefaults.TestChar+1); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } } Fl_Group {} { label Prosigns open xywh {0 75 600 305} align 5 hide } { Fl_Group {} {open xywh {35 85 530 283} box ENGRAVED_FRAME } { Fl_Check_Button btnCW_use_paren { label {Use '(' paren not KN} callback {progdefaults.CW_use_paren=o->value(); progdefaults.changed = true;} xywh {266 244 68 15} down_box DOWN_BOX code0 {o->value(progdefaults.CW_use_paren);} } } Fl_Group {listbox_prosign[0]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[0] = ps[c]; progdefaults.changed = true;} open xywh {167 102 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[0];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[1]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[1] = ps[c]; progdefaults.changed = true;} open xywh {167 129 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[1];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[2]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[2] = ps[c]; progdefaults.changed = true;} open xywh {167 157 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[2];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[3]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[3] = ps[c]; progdefaults.changed = true;} open xywh {167 184 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[3];} code2 {o->value(s);} class Fl_ListBox } {} Fl_Group {listbox_prosign[4]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[4] = ps[c]; progdefaults.changed = true;} open xywh {167 212 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[4];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[5]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[5] = ps[c]; progdefaults.changed = true;} open xywh {167 240 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[5];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[6]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[6] = ps[c]; progdefaults.changed = true;} open xywh {167 267 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[6];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[7]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[7] = ps[c]; progdefaults.changed = true;;} open xywh {167 295 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[7];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[8]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[8] = ps[c]; progdefaults.changed = true;} open xywh {167 323 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[8];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } } } Fl_Group tabDomEX { label Dom xywh {0 50 600 330} hide } { Fl_Group {} {open xywh {55 60 490 180} box ENGRAVED_FRAME } { Fl_Input txtSecondary { label {Secondary Text} callback {progdefaults.secText = o->value(); progdefaults.changed = true;} tooltip {Text to send during keyboard idle times} xywh {65 87 360 40} type Multiline align 5 when 1 code0 {txtSecondary->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button valDominoEX_FILTER { label Filtering callback {progdefaults.DOMINOEX_FILTER = o->value(); resetDOMEX(); progdefaults.changed = true;} tooltip {Use DSP filter before decoder} xywh {65 141 80 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.DOMINOEX_FILTER);} } Fl_Counter valDominoEX_BW { label {Filter bandwidth factor} callback {progdefaults.DOMINOEX_BW = o->value(); resetDOMEX(); progdefaults.changed = true;} tooltip {Filter bandwidth relative to signal width} xywh {206 141 63 20} type Simple align 8 minimum 1 maximum 2 value 1.5 code0 {o->value(progdefaults.DOMINOEX_BW);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button chkDominoEX_FEC { label FEC callback {progdefaults.DOMINOEX_FEC = o->value(); progdefaults.changed = true;} tooltip {Enable MultiPSK-compatible FEC} xywh {65 171 51 20} down_box DOWN_BOX code0 {o->value(progdefaults.DOMINOEX_FEC);} } Fl_Value_Slider valDomCWI { label {CWI threshold} callback {progdefaults.DomCWI = o->value(); progdefaults.changed = true;} tooltip {CWI detection and suppression} xywh {65 207 260 20} type Horizontal align 1 textsize 14 code0 {o->value(progdefaults.DomCWI);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Counter valDominoEX_PATHS { label {Paths (hidden)} callback {progdefaults.DOMINOEX_PATHS = (int)o->value(); progdefaults.changed = true;} xywh {389 194 63 20} type Simple minimum 4 maximum 8 step 1 value 5 code0 {o->value(progdefaults.DOMINOEX_PATHS);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->hide();} class Fl_Counter2 } } } Fl_Group tabFeld { label Feld open xywh {0 50 600 330} hide } { Fl_Group {} {open xywh {55 72 490 145} box ENGRAVED_FRAME } { Fl_Group listboxHellFont { label {Transmit font} callback {progdefaults.feldfontnbr=o->index(); progdefaults.changed = true;} open tooltip {Select TX raster font} xywh {65 82 150 20} box DOWN_BOX color 7 align 8 code0 {\#include "fontdef.h"} code1 {o->add(szFeldFonts);} code2 {o->index(progdefaults.feldfontnbr); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button btnBlackboard { label {Reverse video} callback {progdefaults.HellBlackboard=o->value(); progdefaults.changed = true;} tooltip {Display RX in reverse video} xywh {350 82 125 20} down_box DOWN_BOX code0 {o->value(progdefaults.HellBlackboard);} } Fl_Spinner valHellXmtWidth { label {Transmit width} callback {progdefaults.HellXmtWidth=(int)o->value(); progdefaults.changed = true;} tooltip {\# of multiple scans / character line} xywh {65 112 40 20} align 8 maximum 3 code0 {o->value(progdefaults.HellXmtWidth);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Check_Button btnHellRcvWidth { label {Halve receive width} callback {progdefaults.HellRcvWidth=o->value(); progdefaults.changed = true;} tooltip {Compress Rx in time} xywh {350 112 155 20} down_box DOWN_BOX code0 {o->value(progdefaults.HellRcvWidth);} } Fl_Group listboxHellPulse { label {Pulse shape} callback {progdefaults.HellPulseFast = o->index(); progdefaults.changed = true;} open tooltip {Raised cosine pulse shape factor} xywh {65 159 150 20} box DOWN_BOX color 7 align 5 code0 {o->add(_("Slow (4 msec)"));} code1 {o->add(_("Fast (2 msec)"));} code2 {o->index(progdefaults.HellPulseFast); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Value_Slider sldrHellBW { label {Receive filter bandwidth} callback {progdefaults.HELL_BW = sldrHellBW->value();} tooltip {Adjust the DSP bandwidth} xywh {256 159 246 20} type Horizontal align 5 minimum 10 maximum 2400 step 5 value 400 textsize 14 code0 {o->value(progdefaults.HELL_BW);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button btnFeldHellIdle { label {Transmit periods (.) when idle} callback {progdefaults.HellXmtIdle=o->value(); progdefaults.changed = true;} tooltip {Transmits a diddle dot when no keyboard activity} xywh {65 189 230 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.HellXmtIdle);} } Fl_Check_Button btnHellXmtWidth { label {2x Xmt Width (hidden)} callback {progdefaults.HellXmtWidth=o->value(); progdefaults.changed = true;} xywh {355 187 113 20} down_box DOWN_BOX code0 {o->value(progdefaults.HellXmtWidth);} code1 {o->hide();} } } } Fl_Group tabMT63 { label {MT-63} open xywh {0 50 600 330} hide } { Fl_Group {} {open xywh {55 73 490 84} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnMT63_8bit { label {8-bit extended characters (UTF-8)} callback {progdefaults.mt63_8bit = o->value(); progdefaults.changed = true;} tooltip {Enable this for UTF-8 characters} xywh {200 87 205 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.mt63_8bit);} } Fl_Check_Button btnMT63_rx_integration { label {Long receive integration} callback {progdefaults.mt63_rx_integration = o->value(); progdefaults.changed = true;} tooltip {Enable for very weak signals} xywh {200 117 190 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.mt63_rx_integration);} } } Fl_Group {} {open xywh {55 169 490 131} box ENGRAVED_FRAME } { Fl_Check_Button btnMT63_usetones { label {Transmit lower start tone} callback {progdefaults.mt63_usetones = o->value(); if (!o->value()) { btnMT63_upper_lower->value(0); btnMT63_upper_lower->do_callback(); btnMT63_upper_lower->deactivate(); } else btnMT63_upper_lower->activate(); progdefaults.changed = true;} xywh {199 177 200 20} down_box DOWN_BOX code0 {o->value(progdefaults.mt63_usetones);} } Fl_Check_Button btnMT63_upper_lower { label {Transmit upper start tone} callback {progdefaults.mt63_twotones = o->value(); progdefaults.changed = true;} xywh {199 207 200 20} down_box DOWN_BOX code0 {o->value(progdefaults.mt63_twotones);} code1 {if (!btnMT63_usetones->value()) o->deactivate();} } Fl_Spinner MT63_tone_duration { label {Tone Duration (secs)} callback {progdefaults.mt63_tone_duration=(int)o->value(); progdefaults.changed = true;} xywh {199 233 40 20} align 8 maximum 10 value 4 code0 {o->value(progdefaults.mt63_tone_duration);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Check_Button btnMT63_at500 { label {Allow manual tuning} callback {progdefaults.mt63_at500 = !o->value(); progdefaults.changed = true;} xywh {199 262 200 20} down_box DOWN_BOX code0 {o->value(!progdefaults.mt63_at500);} } } } Fl_Group tabOlivia { label Olivia open xywh {0 50 600 330} hide } { Fl_Group {} {open xywh {55 76 490 280} box ENGRAVED_FRAME } { Fl_Group i_listbox_olivia_bandwidth { label Bandwidth callback {progdefaults.oliviabw = o->index(); set_olivia_default_integ(); resetOLIVIA(); progdefaults.changed = true;} open tooltip {Select bandwidth} xywh {110 96 85 22} box DOWN_BOX color 7 align 8 code0 {o->add(szOliviaBandwidth);} code1 {o->index(progdefaults.oliviabw+1); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group i_listbox_olivia_tones { label Tones callback {progdefaults.oliviatones = o->index(); set_olivia_default_integ(); resetOLIVIA(); progdefaults.changed = true;} open tooltip {Select number of tones} xywh {371 96 70 22} box DOWN_BOX color 7 align 8 code0 {o->add(szOliviaTones);} code1 {o->index(progdefaults.oliviatones+1); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {} { label {Receive synchronizer} open xywh {110 135 379 133} box ENGRAVED_FRAME align 21 } { Fl_Counter cntOlivia_smargin { label {Tune margin (tone frequency spacing)} callback {progdefaults.oliviasmargin = (int)(o->value()); resetOLIVIA(); progdefaults.changed = true;} tooltip {Change ONLY to experiment} xywh {125 166 70 22} type Simple align 8 minimum 2 maximum 128 step 1 value 8 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntOlivia_sinteg { label {Integration period (FEC blocks)} callback {progdefaults.oliviasinteg = (int)(o->value()); resetOLIVIA(); progdefaults.changed = true;} tooltip {Change ONLY to experiment} xywh {125 198 70 22} type Simple align 8 minimum 2 maximum 128 step 1 value 4 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btn_olivia_reset_fec { label {Reset FEC blocks when changing BW or Tones} callback {progdefaults.olivia_reset_fec = o->value(); progdefaults.changed = true;} tooltip {Enable this for UTF-8 character transmission} xywh {126 230 349 20} down_box DOWN_BOX code0 {o->value(progdefaults.olivia_reset_fec);} } } Fl_Check_Button btnOlivia_8bit { label {8-bit extended characters (UTF-8)} callback {progdefaults.olivia8bit = o->value(); progdefaults.changed = true;} tooltip {Enable this for UTF-8 character transmission} xywh {131 291 265 20} down_box DOWN_BOX } } } Fl_Group tabContestia { label {Cont'} open xywh {0 50 600 330} hide } { Fl_Group {} {open xywh {55 80 490 200} box ENGRAVED_FRAME } { Fl_Group i_listbox_contestia_bandwidth { label Bandwidth callback {progdefaults.contestiabw = o->index(); set_contestia_default_integ(); resetCONTESTIA(); progdefaults.changed = true;} open tooltip {Select bandwidth} xywh {110 100 85 22} box DOWN_BOX color 7 align 8 code0 {o->add(szContestiaBandwidth);} code1 {o->index(progdefaults.contestiabw +1); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group i_listbox_contestia_tones { label Tones callback {progdefaults.contestiatones = o->index(); set_contestia_default_integ(); resetCONTESTIA(); progdefaults.changed = true;} open tooltip {Select number of tones} xywh {371 100 70 22} box DOWN_BOX color 7 align 8 code0 {o->add(szContestiaTones);} code1 {o->index(progdefaults.contestiatones +1); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {} { label {Receive synchronizer} open xywh {93 139 414 131} box ENGRAVED_FRAME align 21 } { Fl_Counter cntContestia_smargin { label {Tune margin (tone frequency spacing)} callback {progdefaults.contestiasmargin = (int)(o->value()); resetCONTESTIA(); progdefaults.changed = true;} tooltip {Change ONLY to experiment} xywh {112 170 70 22} type Simple align 8 minimum 2 maximum 128 step 1 value 8 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntContestia_sinteg { label {Integration period (FEC blocks)} callback {progdefaults.contestiasinteg = (int)(o->value()); resetCONTESTIA(); progdefaults.changed = true;} tooltip {Change ONLY to experiment} xywh {112 202 70 22} type Simple align 8 minimum 2 maximum 128 step 1 value 4 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btn_contestia_reset_fec { label {Reset FEC blocks when changing BW or Tones} callback {progdefaults.contestia_reset_fec = o->value(); progdefaults.changed = true;} tooltip {Enable this for UTF-8 character transmission} xywh {108 235 349 20} down_box DOWN_BOX code0 {o->value(progdefaults.contestia_reset_fec);} } } Fl_Check_Button btnContestia_8bit { label {8-bit extended characters} callback {progdefaults.contestia8bit = o->value(); progdefaults.changed = true;} tooltip {Enable this for Latin-1 accented characters} xywh {110 249 200 20} down_box DOWN_BOX hide } } } Fl_Group tabPSK { label PSK open xywh {0 50 600 330} hide } { Fl_Tabs tabsPSK {open xywh {0 50 600 330} selection_color 50 } { Fl_Group {} { label General open xywh {0 75 600 305} align 5 } { Fl_Group {} { label {AFC behavior} open xywh {55 93 490 98} box ENGRAVED_FRAME align 21 } { Fl_Counter cntSearchRange { label {Acquisition search range (Hz)} callback {progdefaults.SearchRange = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true;} tooltip {Capture signals within this frequency range} xywh {65 125 75 20} type Simple align 8 minimum 10 maximum 500 step 10 value 200 code0 {o->value(progdefaults.SearchRange);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntACQsn { label {Acquisition S/N (dB)} callback {progdefaults.ACQsn = o->value(); progdefaults.changed = true;} tooltip {Capture signals over this threshold} xywh {65 154 75 20} type Simple align 8 minimum 3 maximum 20 step 1 value 6 code0 {o->value(progdefaults.ACQsn);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } } Fl_Group {} { label {S/N and IMD behavior} open xywh {55 191 490 65} box ENGRAVED_FRAME align 21 } { Fl_Group listbox_psk_status_timeout { label after callback {progdefaults.StatusDim = o->index(); progdefaults.changed = true;} open tooltip {Behavior of s/n imd} xywh {65 222 80 20} box DOWN_BOX color 7 align 8 code0 {o->add(_("Clear")); o->add(_("Dim"));} code1 {o->index(progdefaults.StatusDim); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter {} { label seconds callback {progdefaults.StatusTimeout = (int)(o->value()); progdefaults.changed = true;} tooltip {Will occur after this time in seconds} xywh {206 222 75 20} type Simple align 8 minimum 0 maximum 30 step 1 code0 {o->value(progdefaults.StatusTimeout);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } } Fl_Group {} { label {Multi-Channel Signal Processing} open xywh {55 258 490 98} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnEnablePSKbrowsing { label {Multi-channel detector} callback {progdefaults.pskbrowser_on = o->value(); progdefaults.changed = true;} xywh {65 315 180 20} down_box DOWN_BOX code0 {o->value(progdefaults.pskbrowser_on);} } Fl_Box {} { label {Disable on very slow CPUs of if signal browser is not used} xywh {65 285 440 20} align 20 } } } } } Fl_Group tabRTTY { label RTTY open xywh {0 50 600 330} hide } { Fl_Tabs tabsRTTY {open xywh {0 50 600 330} selection_color 50 } { Fl_Group {} { label Rx open xywh {0 75 600 305} align 5 } { Fl_Group {} { label Receive open xywh {32 101 535 69} box ENGRAVED_FRAME align 21 } { Fl_Group i_listbox_rtty_afc_speed { label {AFC speed} callback {progdefaults.rtty_afcspeed = o->index()-1; progdefaults.changed = true;} open tooltip {AFC tracking speed} xywh {107 128 90 22} box DOWN_BOX color 7 code0 {o->add("Slow"); o->add("Normal"); o->add("Fast");} code1 {o->index(progdefaults.rtty_afcspeed+1); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button chkUOSrx { label {RX - unshift on space} callback {progdefaults.UOSrx=o->value(); progdefaults.changed = true;} tooltip {Revert to unshifted char's on a space} xywh {211 128 63 22} down_box DOWN_BOX code0 {o->value(progdefaults.UOSrx);} } Fl_Value_Input rtty_rx_shape { label {Filter Shape Factor} callback {progdefaults.rtty_filter = o->value(); progStatus.rtty_filter_changed = true; progdefaults.changed = true;} tooltip {rcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500} xywh {445 126 48 25} align 1 minimum 1 maximum 2 step 0.001 value 1.25 hide code0 {o->value(progdefaults.rtty_filter);} } } Fl_Group {} { label {Decode (CWI suppression)} open xywh {32 171 535 55} box ENGRAVED_FRAME align 21 } { Fl_Check_Button {btnRxTones[0]} { label {Mark-Space} callback {if (o->value()) { btnRxTones[1]->value(0); btnRxTones[2]->value(0); progdefaults.rtty_cwi = 0; }} xywh {120 198 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.rtty_cwi == 0);} } Fl_Check_Button {btnRxTones[1]} { label {Mark only} callback {if (o->value()) { btnRxTones[0]->value(0); btnRxTones[2]->value(0); progdefaults.rtty_cwi = 1; }} xywh {253 198 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.rtty_cwi == 1);} } Fl_Check_Button {btnRxTones[2]} { label {Space only} callback {if (o->value()) { btnRxTones[1]->value(0); btnRxTones[0]->value(0); progdefaults.rtty_cwi = 2; }} xywh {387 198 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.rtty_cwi == 2);} } } Fl_Group {} { label {RTTY Scope Display} open xywh {32 228 535 55} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnPreferXhairScope { label {Use cross hair scope} callback {progdefaults.PreferXhairScope=o->value(); progdefaults.changed = true;} tooltip {Default to cross hair digiscope} xywh {120 250 165 22} down_box DOWN_BOX code0 {o->value(progdefaults.PreferXhairScope);} } Fl_Check_Button chk_true_scope { label {XY - classic scope} callback {progdefaults.true_scope=o->value(); progdefaults.changed = true;} tooltip {Enabled - use Mark/Space filter outputs Disabled - use pseudo signals} xywh {340 250 70 22} down_box DOWN_BOX code0 {o->value(progdefaults.true_scope);} } } Fl_Group {} { label {Log RTTY frequency} open xywh {32 285 535 65} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chk_useMARKfreq { label {Use MARK freq'} callback {progdefaults.useMARKfreq=o->value(); progdefaults.changed = true;} tooltip {Enabled - log QSO using Mark frequency Disabled - log QSO using center frequency} xywh {120 311 146 22} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.useMARKfreq);} } Fl_Button btnRTTY_mark_color { label {track color} callback {if (fl_color_chooser("MARK freq track", progdefaults.rttymarkRGBI.R, progdefaults.rttymarkRGBI.G, progdefaults.rttymarkRGBI.B) ) { o->color(fl_rgb_color(progdefaults.rttymarkRGBI.R,progdefaults.rttymarkRGBI.G,progdefaults.rttymarkRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }} tooltip {Color of Mark Track} xywh {340 311 41 18} color 2 align 8 code0 {o->color(fl_rgb_color(progdefaults.rttymarkRGBI.R,progdefaults.rttymarkRGBI.G,progdefaults.rttymarkRGBI.B));} } } } Fl_Group {} { label Tx open xywh {0 75 600 305} align 5 hide } { Fl_Group selShift { label {Carrier shift} callback {progdefaults.rtty_shift = o->index(); if (progdefaults.rtty_shift == o->lsize() - 1) selCustomShift->activate(); else selCustomShift->deactivate(); selCustomShift->redraw(); resetRTTY(); progdefaults.changed = true;} open tooltip {Select carrier shift} xywh {65 104 100 20} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szShifts);o->index(progdefaults.rtty_shift); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter selCustomShift { label {Custom shift} callback {progdefaults.rtty_custom_shift = o->value(); resetRTTY(); progdefaults.changed = true;} tooltip {Input carrier shift} xywh {65 137 100 20} align 8 minimum 10 maximum 1000 step 1 value 450 code0 {o->lstep(10.0);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Group selBaud { label {Baud rate} callback {progdefaults.rtty_baud = o->index(); resetRTTY(); progdefaults.changed = true;} open tooltip {Select carrier baudrate} xywh {65 170 100 20} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szBauds);o->index(progdefaults.rtty_baud); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group selBits { label {Bits per character} callback {progdefaults.rtty_bits = o->index(); selParity->do_callback();} open tooltip {Select \# bits / char} xywh {65 203 100 20} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szSelBits);o->index(progdefaults.rtty_bits); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group selParity { label Parity callback {if (progdefaults.rtty_bits == 0) { progdefaults.rtty_parity = RTTY_PARITY_NONE; o->index(progdefaults.rtty_parity); } else progdefaults.rtty_parity = o->index(); resetRTTY(); progdefaults.changed = true;} open tooltip {Select parity} xywh {65 236 100 20} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szParity);o->index(progdefaults.rtty_parity); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group selStopBits { label {Stop bits} callback {progdefaults.rtty_stop = o->index(); resetRTTY(); progdefaults.changed = true;} open tooltip {Select \# stop bits} xywh {65 270 100 20} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szStopBits);o->index(progdefaults.rtty_stop); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button btnAUTOCRLF { label AutoCRLF callback {progdefaults.rtty_autocrlf = o->value(); progdefaults.changed = true;} tooltip {Add CRLF after page width characters} xywh {316 103 90 22} down_box DOWN_BOX code0 {o->value(progdefaults.rtty_autocrlf);} } Fl_Counter cntrAUTOCRLF { label chars callback {progdefaults.rtty_autocount = (int)o->value(); progdefaults.changed = true;} tooltip {Auto CRLF line length} xywh {427 104 65 20} type Simple align 8 minimum 68 maximum 80 step 1 value 72 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnCRCRLF { label {CR-CR-LF} callback {progdefaults.rtty_crcrlf = o->value(); progdefaults.changed = true;} tooltip {Use "cr cr lf" for "cr lf"} xywh {316 136 90 22} down_box DOWN_BOX when 6 code0 {o->value(progdefaults.rtty_crcrlf);} } Fl_Check_Button chkUOStx { label {TX - unshift on space} callback {progdefaults.UOStx=o->value(); progdefaults.changed = true;} tooltip {Revert to Unsifted char's on a space} xywh {316 169 63 22} down_box DOWN_BOX code0 {o->value(progdefaults.UOStx);} } Fl_Check_Button chkPseudoFSK { label {Pseudo-FSK - right channel} callback {progdefaults.PseudoFSK = o->value(); chkPseudoFSK2->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); } }} tooltip {Create keyed square wave on right audio channel} xywh {316 202 212 22} down_box DOWN_BOX code0 {o->value(progdefaults.PseudoFSK);} } } Fl_Group {} { label Synop open xywh {0 75 600 305} align 5 hide } { Fl_Check_Button btnSynopAdifDecoding { label {SYNOP to ADIF} callback {progdefaults.SynopAdifDecoding=o->value(); progdefaults.changed = true;} tooltip {Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file} xywh {190 91 126 22} down_box DOWN_BOX align 148 code0 {o->value(progdefaults.SynopAdifDecoding);} } Fl_Check_Button btnSynopKmlDecoding { label {SYNOP to KML} callback {progdefaults.SynopKmlDecoding=o->value(); progdefaults.changed = true;} tooltip {Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Google Earth)} xywh {190 129 119 22} down_box DOWN_BOX align 148 code0 {o->value(progdefaults.SynopKmlDecoding);} } Fl_Check_Button btnSynopInterleaved { label {Interleave SYNOP and text} callback {progdefaults.SynopInterleaved=o->value(); progdefaults.changed = true;} tooltip {Interleave text with decoded SYNOP messages, or replacement.} xywh {190 168 210 22} down_box DOWN_BOX align 148 code0 {o->value(progdefaults.SynopInterleaved);} } } } } Fl_Group tabTHOR { label Thor xywh {0 50 600 330} hide } { Fl_Group {} {open xywh {55 78 490 270} box ENGRAVED_FRAME } { Fl_Input txtTHORSecondary { label {Secondary Text} callback {progdefaults.THORsecText = o->value(); progdefaults.changed = true;} tooltip {Text to send during keyboard idle times} xywh {84 105 430 40} type Multiline align 5 when 1 code0 {txtTHORSecondary->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button valTHOR_FILTER { label Filtering callback {progdefaults.THOR_FILTER = o->value(); resetTHOR(); progdefaults.changed = true;} tooltip {Enable DSP prior to decoder} xywh {84 159 80 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.THOR_FILTER);} } Fl_Counter valTHOR_BW { label {Filter bandwidth factor} callback {progdefaults.THOR_BW = o->value(); resetTHOR(); progdefaults.changed = true;} tooltip {Filter bandwidth relative to signal width} xywh {229 159 63 20} type Simple align 8 minimum 1 maximum 2 value 1.5 code0 {o->value(progdefaults.THOR_BW);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Value_Slider valThorCWI { label {CWI threshold} callback {progdefaults.ThorCWI = o->value(); progdefaults.changed = true;} tooltip {CWI detection and suppression} xywh {84 212 260 20} type Horizontal align 1 textsize 14 code0 {o->value(progdefaults.ThorCWI);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button valTHOR_PREAMBLE { label {Preamble Detection} callback {progdefaults.THOR_PREAMBLE = o->value(); progdefaults.changed = true;} tooltip {Detect the THOR preamble Clear the Rx pipeline} xywh {84 254 200 20} down_box DOWN_BOX code0 {o->value(progdefaults.THOR_PREAMBLE);} } Fl_Check_Button valTHOR_SOFTSYMBOLS { label {Soft-symbol decoding} callback {progdefaults.THOR_SOFTSYMBOLS = o->value(); progdefaults.changed = true;} tooltip {Use soft-decision decoding for symbol detection Assists soft-bit decoding} xywh {84 284 190 20} down_box DOWN_BOX code0 {o->value(progdefaults.THOR_SOFTSYMBOLS);} } Fl_Check_Button valTHOR_SOFTBITS { label {Soft-bit decoding} callback {progdefaults.THOR_SOFTBITS = o->value(); progdefaults.changed = true;} tooltip {Use soft-bit viterbi decoding for better Forward Error Correction Works best with soft-symbol decoding enabled} xywh {84 314 170 20} down_box DOWN_BOX code0 {o->value(progdefaults.THOR_SOFTBITS);} } Fl_Counter valTHOR_PATHS { label {Paths (hidden)} callback {progdefaults.THOR_PATHS = (int)o->value(); progdefaults.changed = true;} xywh {431 303 75 21} type Simple align 1 minimum 4 maximum 8 step 1 value 5 code0 {o->value(progdefaults.THOR_PATHS);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->hide();} class Fl_Counter2 } } } Fl_Group tabNavtex { label Navtex xywh {0 50 600 330} hide } { Fl_Check_Button btnNvtxAdifLog { label {Log Navtex messages to Adif file} callback {progdefaults.NVTX_AdifLog=o->value(); progdefaults.changed = true;} xywh {171 79 235 30} down_box DOWN_BOX code0 {o->value(progdefaults.NVTX_AdifLog);} } Fl_Check_Button btnNvtxKmlLog { label {Log Navtex messages to KML} callback {progdefaults.NVTX_KmlLog=o->value(); progdefaults.changed = true;} tooltip {Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)} xywh {170 125 270 30} down_box DOWN_BOX code0 {o->value(progdefaults.NVTX_KmlLog);} } } Fl_Group tabWefax { label Wefax open xywh {0 50 600 330} hide } { Fl_Group {} {open xywh {2 63 598 300} } { Fl_Check_Button btnWefaxEmbeddedGui { label {Embedded Wefax Gui} callback {progdefaults.WEFAX_EmbeddedGui=o->value(); progdefaults.changed = true;} tooltip {Display tx and rx in main fldigi window. Change requires restart of fldigi} xywh {94 74 235 30} down_box DOWN_BOX code0 {o->value(progdefaults.WEFAX_EmbeddedGui);} } Fl_Check_Button btnWefaxHideTx { label {Hide Transmission window} callback {progdefaults.WEFAX_HideTx=o->value(); progdefaults.changed = true;} tooltip {Hide transmission window by default.} xywh {94 119 235 30} down_box DOWN_BOX code0 {o->value(progdefaults.WEFAX_HideTx);} } Fl_Check_Button btnWefaxAdifLog { label {Log Wefax messages to Adif file} callback {progdefaults.WEFAX_AdifLog=o->value(); progdefaults.changed = true;} tooltip {Sent and received faxes are logged to Adif file.} xywh {94 165 235 30} down_box DOWN_BOX code0 {o->value(progdefaults.WEFAX_AdifLog);} } Fl_Counter cntr_wefax_shift { label {Frequency shift (800 Hz)} callback {progdefaults.WEFAX_Shift=o->value(); progdefaults.changed = true;} tooltip {Default 800 Hz. Deutsche Wetterdienst 850Hz} xywh {95 211 90 22} type Simple align 8 minimum 750 maximum 900 step 10 value 800 code0 {o->value(progdefaults.WEFAX_Shift);} } Fl_Counter ctr_wefax_max_rows { label {Rx fax max rows} callback {progdefaults.WEFAX_MaxRows=o->value(); progdefaults.changed = true;} tooltip {Default 800 Hz. Deutsche Wetterdienst 850Hz} xywh {95 247 90 22} type Simple align 8 minimum 1000 maximum 10000 step 50 value 5000 code0 {o->value(progdefaults.WEFAX_MaxRows);} } Fl_Input btnWefaxSaveDir { label {Fax images destination directory} callback {progdefaults.wefax_save_dir=o->value(); progdefaults.changed = true;} xywh {94 290 310 24} align 5 code0 {o->value(progdefaults.wefax_save_dir.c_str());} } Fl_Button btnSelectFaxDestDir { label {Directory...} callback {Fl_File_Chooser *fc = new Fl_File_Chooser(".",NULL,Fl_File_Chooser::DIRECTORY,"Input File"); fc->callback(WefaxDestDirSet); fc->show();} xywh {424 290 80 24} } Fl_Check_Button btnWefaxSaveMonochrome { label {Save image as monochrome file} callback {progdefaults.WEFAX_SaveMonochrome=o->value(); progdefaults.changed = true;} tooltip {Save the fax image as a gray-level PNG file.} xywh {94 320 235 30} down_box DOWN_BOX code0 {o->value(progdefaults.WEFAX_SaveMonochrome);} } } } } } Fl_Group tabRig { label Rig open tooltip {Transceiver control} xywh {0 23 600 357} hide } { Fl_Tabs tabsRig {open xywh {0 23 600 357} selection_color 50 } { Fl_Group {} { label {Hardware PTT} open xywh {0 50 600 330} } { Fl_Group {} { xywh {55 57 490 38} box ENGRAVED_FRAME } { Fl_Check_Button btnPTTrightchannel { label {PTT tone on right audio channel } callback {progdefaults.PTTrightchannel = o->value(); btnPTTrightchannel2->value(o->value()); if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); } } progdefaults.changed = true;} tooltip {Can be used in lieu of or in addition to other PTT types} xywh {74 66 250 20} down_box DOWN_BOX code0 {o->value(progdefaults.PTTrightchannel);} } } Fl_Group grpHWPTT { label {h/w ptt device-pin} open xywh {55 97 490 171} box ENGRAVED_FRAME align 21 } { Fl_Round_Button btnTTYptt { label {Use separate serial port PTT} callback {btnUsePPortPTT->value(false); btnUseUHrouterPTT->value(false); progdefaults.TTYptt = o->value(); progdefaults.UsePPortPTT = false; progdefaults.UseUHrouterPTT = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} xywh {74 121 220 20} down_box DOWN_BOX selection_color 1 } Fl_Group inpTTYdev { label {Device:} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} open xywh {128 151 160 22} box DOWN_BOX color 7 align 4 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ComboBox } {} Fl_Round_Button btnRTSptt { label {Use RTS} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} tooltip {RTS is PTT signal line} xywh {310 120 85 20} down_box DOWN_BOX } Fl_Round_Button btnRTSplusV { label {RTS = +V} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} tooltip {Initial voltage on RTS} xywh {407 120 100 20} down_box DOWN_BOX } Fl_Round_Button btnDTRptt { label {Use DTR} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} tooltip {DTR is PTT signal line} xywh {310 150 85 20} down_box DOWN_BOX } Fl_Round_Button btnDTRplusV { label {DTR = +V} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} tooltip {Initial voltage on DTR} xywh {407 150 100 20} down_box DOWN_BOX } Fl_Button btnInitHWPTT { label Initialize callback {progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true;} tooltip {Initialize the H/W PTT interface} xywh {411 217 113 24} } Fl_Round_Button btnUsePPortPTT { label {Use parallel port PTT} callback {btnTTYptt->value(false); btnUseUHrouterPTT->value(false); progdefaults.TTYptt = false; progdefaults.UsePPortPTT = o->value(); progdefaults.UseUHrouterPTT = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} xywh {74 197 170 20} down_box DOWN_BOX selection_color 1 } Fl_Round_Button btnUseUHrouterPTT { label {Use uHRouter PTT} callback {btnTTYptt->value(false); btnUsePPortPTT->value(false); progdefaults.TTYptt = false; progdefaults.UsePPortPTT = false; progdefaults.UseUHrouterPTT = o->value(); btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} xywh {74 227 170 20} down_box DOWN_BOX selection_color 1 } } Fl_Group grpPTTdelays { label {PTT delays valid for all CAT/PTT types} xywh {55 270 490 91} box ENGRAVED_FRAME align 21 } { Fl_Counter cntPTT_on_delay { label {Start of transmit PTT delay} callback {progdefaults.PTT_on_delay = o->value(); progdefaults.changed = true;} tooltip {Delay NN msec before starting audio} xywh {74 297 100 21} align 8 minimum 0 maximum 500 step 1 code0 {o->value(progdefaults.PTT_on_delay);} code1 {o->lstep(10);} } Fl_Counter cntPTT_off_delay { label {PTT end of transmit delay} callback {progdefaults.PTT_off_delay = o->value(); progdefaults.changed = true;} tooltip {Delay NN msec before releasing PTT} xywh {74 327 100 21} align 8 minimum 0 maximum 500 step 1 code0 {o->value(progdefaults.PTT_off_delay);} code1 {o->lstep(10);} } } } Fl_Group {} { label RigCAT open tooltip {Rig Control using xml spec file} xywh {0 50 600 330} hide } { Fl_Check_Button chkUSERIGCAT { label {Use RigCAT} callback {if (o->value() == 1) { chkUSEHAMLIB->value(0); chkUSEXMLRPC->value(0); progdefaults.chkUSEHAMLIBis = false; progdefaults.chkUSERIGCATis = true; progdefaults.chkUSEXMLRPCis = false; } else { progdefaults.chkUSERIGCATis = false; } btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw();} tooltip {RigCAT used for rig control} xywh {245 60 110 20} down_box DOWN_BOX } Fl_Group grpRigCAT {open xywh {55 83 490 279} box ENGRAVED_FRAME } { Fl_Output txtXmlRigFilename { label {Rig description file:} tooltip {Use Open to select descriptor file} xywh {65 107 130 22} color 52 align 5 code0 {o->value(fl_filename_name(progdefaults.XmlRigFilename.c_str()));} } Fl_Button btnSelectRigXmlFile { label {Open...} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); selectRigXmlFilename();} tooltip {Select rig descriptor file} xywh {198 107 60 22} } Fl_Group inpXmlRigDevice { label {Device:} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate();} open xywh {391 107 144 22} box DOWN_BOX color 7 align 4 code0 {o->value(progdefaults.XmlRigDevice.c_str()); o->labelsize(FL_NORMAL_SIZE);} class Fl_ComboBox } {} Fl_Value_Input cntRigCatRetries { label Retries callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate();} tooltip {\# retries before giving up} xywh {80 150 60 22} align 5 maximum 1000 step 1 code0 {o->value(progdefaults.RigCatRetries);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntRigCatTimeout { label {Retry interval (ms)} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate();} tooltip {Time between retires in msec} xywh {210 150 60 22} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.RigCatTimeout);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntRigCatWait { label {Write delay (ms)} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate();} tooltip {Wait for response to subsequent command} xywh {80 190 60 22} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.RigCatWait);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Group listbox_xml_rig_baudrate { label {Baud rate:} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate();} open xywh {436 150 99 22} box DOWN_BOX color 7 align 4 code0 {o->add(szBaudRates);} code1 {o->index(progdefaults.XmlRigBaudrate); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter valRigCatStopbits { label Stopbits callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw(); btnRevertRIGCAT->activate();} xywh {438 184 95 21} type Simple align 4 minimum 1 maximum 2 step 1 value 1 code0 {o->value(progdefaults.RigCatStopbits);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Button btnInitRIGCAT { label Initialize callback {progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true;} tooltip {Initialize RigCAT interface} xywh {415 321 113 24} } Fl_Check_Button btnRigCatEcho { label {Commands are echoed} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); progdefaults.changed = true; btnRevertRIGCAT->activate();} tooltip {Rig or interface echos serial data} xywh {100 216 192 22} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatECHO);} } Fl_Round_Button btnRigCatCMDptt { label {CAT command for PTT} callback {if (o->value()== 1) { btnRigCatRTSptt->value(0); btnRigCatDTRptt->value(0); } btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw(); btnRevertRIGCAT->activate();} tooltip {PTT is a CAT command (not hardware)} xywh {306 217 207 20} down_box DOWN_BOX selection_color 1 code0 {o->value(progdefaults.RigCatCMDptt);} } Fl_Round_Button btnRigCatRTSptt { label {Toggle RTS for PTT} callback {if (o->value() == 1) { // btnRigCatDTRptt->value(0); btnRigCatCMDptt->value(0); } btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate();} tooltip {RTS is ptt line} xywh {100 246 160 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatRTSptt);} } Fl_Round_Button btnRigCatDTRptt { label {Toggle DTR for PTT} callback {if (o->value() == 1) { // btnRigCatRTSptt->value(0); btnRigCatCMDptt->value(0); } btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate();} tooltip {DTR is ptt line} xywh {306 244 160 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatDTRptt);} } Fl_Check_Button btnRigCatRTSplus { label {RTS +12 v} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate();} tooltip {Initial state of RTS} xywh {100 275 100 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatRTSplus);} } Fl_Check_Button btnRigCatDTRplus { label {DTR +12 v} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate();} tooltip {Initial state of DTR} xywh {306 272 100 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatDTRplus);} } Fl_Check_Button chkRigCatRTSCTSflow { label {RTS/CTS flow control} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate();} tooltip {Rig uses RTS/CTS handshake} xywh {100 303 170 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatRTSCTSflow);} } Fl_Check_Button chk_restore_tio { label {Restore Settings on Close} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate();} tooltip {Restore the serial (COM) port settings} xywh {100 332 205 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatRestoreTIO);} } Fl_Button btnRevertRIGCAT { label Revert callback {btnInitRIGCAT->labelcolor(FL_FOREGROUND_COLOR); btnInitRIGCAT->redraw_label(); rigCAT_restore_defaults();} tooltip {Reset rigCAT interface} xywh {415 289 113 24} hide deactivate code0 {\#include "rigio.h"} } Fl_Check_Button chkRigCatVSP { label {VSP Enable} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate();} tooltip {Virtual Serial Port Emulator - suppress WARNINGS} xywh {306 300 100 25} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatVSP);} } Fl_Value_Input cntRigCatInitDelay { label {Init delay (ms)} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate();} tooltip {Wait for response to first CAT command} xywh {210 190 75 22} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.RigCatInitDelay);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } } } Fl_Group tabHamlib { label Hamlib open xywh {0 50 600 330} hide } { Fl_Check_Button chkUSEHAMLIB { label {Use Hamlib} callback {progdefaults.chkUSEHAMLIBis = o->value(); if (o->value() == 1) { chkUSERIGCAT->value(0); chkUSEXMLRPC->value(0); progdefaults.chkUSERIGCATis = false; progdefaults.chkUSEXMLRPCis = false; } btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw(); progdefaults.changed = true;} tooltip {Hamlib used for rig control} xywh {250 55 100 20} down_box DOWN_BOX } Fl_Group grpHamlib {open xywh {55 78 490 277} box ENGRAVED_FRAME } { Fl_Group cboHamlibRig { label {Rig:} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); \#if USE_HAMLIB hamlib_get_defaults(); \#endif} open xywh {115 88 160 22} box DOWN_BOX color 7 align 4 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ComboBox } {} Fl_Group inpRIGdev { label {Device:} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} open xywh {390 88 144 22} box DOWN_BOX color 7 align 4 code0 {o->value(progdefaults.HamRigDevice.c_str()); o->labelsize(FL_NORMAL_SIZE);} class Fl_ComboBox } {} Fl_Value_Input cntHamlibRetries { label Retries callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} tooltip {\# times to resend command before giving up} xywh {80 128 70 24} align 5 maximum 1000 step 1 code0 {o->value(progdefaults.HamlibRetries);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntHamlibTimeout { label {Retry Interval (ms)} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} tooltip {Msec's between retries} xywh {205 128 70 24} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.HamlibTimeout);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntHamlibWriteDelay { label {Write delay (ms)} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} tooltip {Msec's between sequential commands} xywh {80 171 70 24} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.HamlibWriteDelay);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntHamlibWait { label {Post write delay (ms)} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} tooltip {Wait interval (msecs) before reading response} xywh {206 171 70 24} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.HamlibWait);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Group listbox_baudrate { label {Baud rate:} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} open xywh {435 122 99 22} box DOWN_BOX color 7 align 4 code0 {o->add(szBaudRates);} code1 {o->index(progdefaults.HamRigBaudrate); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter valHamRigStopbits { label Stopbits callback {progdefaults.HamRigStopbits = (int)o->value(); btnRevertHAMLIB->activate(); progdefaults.changed = true;} xywh {439 158 95 21} type Simple align 4 minimum 1 maximum 2 step 1 value 1 code0 {o->value(progdefaults.HamRigStopbits);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntHamlibTimeout0 { label {Retry interval (ms)} callback {progdefaults.HamlibTimeout = (int)o->value(); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Msec's between retries} xywh {200 135 100 20} type Simple align 5 minimum 2 maximum 20000 step 1 value 10 hide code0 {o->value(progdefaults.HamlibTimeout);} class Fl_Counter2 } Fl_Input inpHamlibConfig { label {Advanced configuration:} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} tooltip {Optional configuration in format: param=val ...} xywh {70 321 320 22} align 5 code0 {inpHamlibConfig->value(progdefaults.HamConfig.c_str());} code1 {inpHamlibConfig->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnInitHAMLIB { label Initialize callback {progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); //btnRevertHAMLIB->activate(); progdefaults.changed = true;} tooltip {Initialize hamlib interface} xywh {421 320 113 24} } Fl_Group listbox_sideband { label {Sideband:} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} open xywh {390 212 144 22} box DOWN_BOX color 7 align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Round_Button btnHamlibCMDptt { label {PTT via Hamlib command} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} tooltip {PTT is a hamlib command} xywh {95 213 200 20} down_box DOWN_BOX selection_color 1 code0 {o->value(progdefaults.HamlibCMDptt);} } Fl_Check_Button btnHamlibDTRplus { label {DTR +12} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} tooltip {Initial state of DTR} xywh {95 238 90 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibDTRplus);} } Fl_Check_Button chkHamlibRTSplus { label {RTS +12} callback {if (o->value() == 1) chkHamlibRTSCTSflow->value(0); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} tooltip {Initial state of RTS} xywh {319 238 85 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibRTSplus);} } Fl_Check_Button chkHamlibRTSCTSflow { label {RTS/CTS flow control} callback {if (o->value() == 1) { chkHamlibXONXOFFflow->value(0); chkHamlibRTSplus->deactivate(); } else chkHamlibRTSplus->activate(); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} tooltip {Rig requires RTS/CTS flow control} xywh {95 266 170 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibRTSCTSflow);} code1 {if (o->value()) chkHamlibRTSplus->deactivate();} } Fl_Check_Button chkHamlibXONXOFFflow { label {XON/XOFF flow control} callback {if (o->value() == 1) chkHamlibRTSCTSflow->value(0); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} tooltip {Rig requires Xon/Xoff flow control} xywh {319 266 185 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibXONXOFFflow);} } Fl_Button btnRevertHAMLIB { label Revert callback {btnInitHAMLIB->labelcolor(FL_FOREGROUND_COLOR); btnInitHAMLIB->redraw_label(); \#if USE_HAMLIB hamlib_restore_defaults(); \#endif} tooltip {Reset hamlib interface} xywh {421 289 113 24} hide deactivate } } } Fl_Group tabXMLRPC { label {XML-RPC} open xywh {0 50 600 330} hide } { Fl_Group grpXMLRPC {open xywh {55 61 490 160} box ENGRAVED_FRAME } { Fl_Output {} { xywh {210 80 190 58} type Multiline box BORDER_BOX color 50 code0 {o->value(_("Rig control via external\\nprogram using xmlrpc\\nremote calls."));} } Fl_Check_Button chkUSEXMLRPC { label {Use XML-RPC program} callback {progdefaults.chkUSEXMLRPCis = o->value(); if(o->value() == 1){ chkUSEHAMLIB->value(0); chkUSERIGCAT->value(0); progdefaults.chkUSEHAMLIBis = false; progdefaults.chkUSERIGCATis = false; } btnInitXMLRPC->labelcolor(FL_RED); btnInitXMLRPC->redraw_label(); progdefaults.changed = true;} tooltip Experimental xywh {210 148 183 20} down_box DOWN_BOX } Fl_Button btnInitXMLRPC { label Initialize callback {progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true;} tooltip {Initialize XML-RPC rig control} xywh {251 184 113 24} } } } } } Fl_Group tabSoundCard { label Audio open tooltip {Audio devices} xywh {0 25 600 355} hide } { Fl_Tabs tabsSoundCard {open xywh {0 25 600 355} selection_color 50 } { Fl_Group tabAudio { label Devices open xywh {0 50 600 330} } { Fl_Group AudioOSS {open xywh {55 65 490 45} box ENGRAVED_FRAME } { Fl_Round_Button {btnAudioIO[0]} { label OSS callback {sound_update(SND_IDX_OSS); progdefaults.changed = true; resetSoundCard();} tooltip {Use OSS audio server} xywh {65 75 53 25} down_box DOWN_BOX selection_color 1 } Fl_Input_Choice menuOSSDev { label {Device:} callback {scDevice[0] = scDevice[1] = progdefaults.OSSdevice = o->value(); resetSoundCard(); progdefaults.changed = true;} open tooltip {Select device} xywh {424 75 110 25} code0 {o->value(progdefaults.OSSdevice.c_str());} } {} } Fl_Group AudioPort {open xywh {55 110 490 80} box ENGRAVED_FRAME } { Fl_Round_Button {btnAudioIO[1]} { label PortAudio callback {sound_update(SND_IDX_PORT); progdefaults.changed = true; resetSoundCard();} tooltip {Use Port Audio server} xywh {65 138 95 25} down_box DOWN_BOX selection_color 1 } Fl_Choice menuPortInDev { label {Capture:} callback {scDevice[0] = progdefaults.PortInDevice = o->text(); progdefaults.PortInIndex = reinterpret_cast(o->mvalue()->user_data()); resetSoundCard(); progdefaults.changed = true;} open tooltip {Audio input device} xywh {244 121 290 25} down_box BORDER_BOX } {} Fl_Choice menuPortOutDev { label {Playback:} callback {scDevice[1] = progdefaults.PortOutDevice = o->text(); progdefaults.PortOutIndex = reinterpret_cast(o->mvalue()->user_data()); resetSoundCard(); progdefaults.changed = true;} open tooltip {Audio output device} xywh {244 156 290 25} down_box BORDER_BOX } {} } Fl_Group AudioPulse {open xywh {55 190 490 45} box ENGRAVED_FRAME } { Fl_Round_Button {btnAudioIO[2]} { label PulseAudio callback {sound_update(SND_IDX_PULSE); progdefaults.changed = true; resetSoundCard();} tooltip {Use Pulse Audio server} xywh {65 201 100 25} down_box DOWN_BOX selection_color 1 } Fl_Input inpPulseServer { label {Server string:} callback {scDevice[0] = scDevice[1] = progdefaults.PulseServer = o->value(); resetSoundCard(); progdefaults.changed = true;} tooltip {Leave this blank or refer to http://www.pulseaudio.org/wiki/ServerStrings} xywh {310 201 225 24} code0 {o->value(progdefaults.PulseServer.c_str());} code1 {inpPulseServer->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } } Fl_Group AudioNull {open xywh {55 235 490 45} box ENGRAVED_FRAME } { Fl_Round_Button {btnAudioIO[3]} { label {File I/O only} callback {sound_update(SND_IDX_NULL); progdefaults.changed = true; resetSoundCard();} tooltip {NO AUDIO DEVICE AVAILABLE (or testing)} xywh {66 245 100 25} down_box DOWN_BOX selection_color 1 } } } Fl_Group tabAudioOpt { label Settings open xywh {0 50 600 330} hide } { Fl_Group grpAudioSampleRate { label {Sample rate} open xywh {55 65 490 90} box ENGRAVED_FRAME align 21 } { Fl_Group menuInSampleRate { label Capture callback {progdefaults.in_sample_rate = o->index() > 2 ? strtol(o->value(), 0, 10) : o->index()-1; resetSoundCard(); progdefaults.changed = true;} open tooltip {Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.} xywh {65 94 100 20} box DOWN_BOX color 7 align 8 code2 {o->clear_changed(); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group menuOutSampleRate { label Playback callback {progdefaults.out_sample_rate = o->index() > 2 ? strtol(o->value(), 0, 10) : o->index()-1; resetSoundCard(); progdefaults.changed = true;} open xywh {65 124 100 20} box DOWN_BOX color 7 align 8 code2 {o->clear_changed();} code3 {o->tooltip(menuInSampleRate->tooltip()); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group menuSampleConverter { label Converter callback {if ((o->index()-1) == FLDIGI_SRC_BEST) fl_alert2("The best quality SINC interpolator has very high CPU overhead"); progdefaults.sample_converter = sample_rate_converters[o->index()-1]; resetSoundCard(); progdefaults.changed = true; o->tooltip(src_get_description(progdefaults.sample_converter));} open tooltip {Set the type of resampler used of offset correction} xywh {319 94 216 20} box DOWN_BOX color 7 align 5 code0 {\#include } code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } Fl_Group {} { label Corrections open xywh {55 155 490 62} box ENGRAVED_FRAME align 21 } { Fl_Spinner cntRxRateCorr { label {RX ppm} callback {progdefaults.RX_corr = (int)o->value(); progdefaults.changed = true;} tooltip {RX sound card correction} xywh {65 185 85 20} align 8 code0 {o->step(1);} code1 {o->minimum(-50000);} code2 {o->maximum(50000);} code3 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Spinner cntTxRateCorr { label {TX ppm} callback {progdefaults.TX_corr = (int)o->value(); progdefaults.changed = true;} tooltip {TX sound card correction} xywh {226 185 85 20} align 8 code0 {o->step(1);} code1 {o->minimum(-50000);} code2 {o->maximum(50000);} code3 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Spinner cntTxOffset { label {TX offset} callback {progdefaults.TxOffset = (int)o->value(); progdefaults.changed = true;} tooltip {Difference between Rx & Tx freq (rig offset)} xywh {388 185 85 20} align 8 code0 {o->value(progdefaults.TxOffset);} code1 {o->step(1);} code2 {o->minimum(-50); o->maximum(50);} code3 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } } } Fl_Group tabMixer { label Mixer open xywh {0 50 600 330} hide } { Fl_Group {} { label {OSS Mixer} open xywh {55 69 490 145} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnMixer { label {Manage mixer} callback {enableMixer(o->value()); progdefaults.changed = true;} tooltip {Add mixer controls to main dialog} xywh {65 98 125 25} down_box DOWN_BOX code0 {extern void resetMixerControls();} code1 {o->value(progdefaults.EnableMixer);} } Fl_Group menuMix { label {Device:} callback {progdefaults.MXdevice = o->value(); enableMixer(false); enableMixer(true); progdefaults.changed = true;} open tooltip {Select Mixer device} xywh {152 141 170 24} box DOWN_BOX color 7 code0 {o->value(progdefaults.MXdevice.c_str());} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Light_Button btnMicIn { label {Mic In} callback {if (o->value() == 1) { btnLineIn->value(0); progdefaults.LineIn = false; progdefaults.MicIn = true; setMixerInput(2); } else { setMixerInput(0); progdefaults.MicIn = false; } progdefaults.changed = true;} tooltip {Use microphone input} xywh {331 102 74 25} } Fl_Light_Button btnLineIn { label {Line In} callback {if (o->value() == 1) { btnMicIn->value(0); progdefaults.LineIn = true; progdefaults.MicIn = false; setMixerInput(1); } else { setMixerInput(0); progdefaults.LineIn = false; } progdefaults.changed = true;} tooltip {Use Line-In device} xywh {331 141 74 25} selection_color 3 code0 {extern void setMixerInput(int);} } Fl_Value_Slider valPCMvolume { label PCM callback {setPCMvolume(o->value()); progdefaults.changed = true;} tooltip {Set the sound card PCM level} xywh {65 176 340 20} type Horizontal selection_color 15 align 8 value 0.8 textsize 14 code0 {extern void setPCMvolume(double);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } } } Fl_Group tabAudioRightChannel { label {Right channel} open xywh {0 50 600 330} hide } { Fl_Check_Button chkForceMono { label {Mono audio output} callback {progdefaults.mono_audio = o->value(); progdefaults.changed = true; if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); btnQSK2->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); chkPseudoFSK2->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.ReverseAudio = false; chkReverseAudio->value(0); } resetSoundCard();} tooltip {Force output audio to single channel} xywh {160 63 280 20} down_box DOWN_BOX code0 {chkForceMono->value(progdefaults.mono_audio);} } Fl_Check_Button chkAudioStereoOut { label {Modem signal on left and right channels} callback {progdefaults.sig_on_right_channel = o->value(); progdefaults.changed = true; if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); btnQSK2->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); chkPseudoFSK2->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); } }} tooltip {Left and right channels both contain modem audio} xywh {160 95 280 20} down_box DOWN_BOX code0 {chkAudioStereoOut->value(progdefaults.sig_on_right_channel);} } Fl_Check_Button chkReverseAudio { label {Reverse Left/Right channels} callback {progdefaults.ReverseAudio = o->value(); progdefaults.changed = true; if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); }} tooltip {Software reversal of left-right audio channels} xywh {160 127 270 20} down_box DOWN_BOX code0 {o->value(progdefaults.ReverseAudio);} } Fl_Group {} { label {... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ...} open xywh {73 165 454 187} box ENGRAVED_FRAME align 18 } { Fl_Check_Button btnPTTrightchannel2 { label {PTT tone on right audio channel } callback {progdefaults.PTTrightchannel = o->value(); btnPTTrightchannel->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); btnQSK2->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); chkPseudoFSK2->value(0); progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); } }} tooltip {1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types} xywh {146 175 250 20} down_box DOWN_BOX code0 {o->value(progdefaults.PTTrightchannel);} } Fl_Check_Button btnQSK2 { label {CW QSK signal on right channel} callback {progdefaults.QSK = o->value(); btnQSK->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); } }} tooltip {Generate 1000 Hz square wave signal on right channel} xywh {146 213 211 20} down_box DOWN_BOX code0 {o->value(progdefaults.QSK);} } Fl_Check_Button chkPseudoFSK2 { label {Pseudo-FSK on right audio channel} callback {progdefaults.PseudoFSK = o->value(); chkPseudoFSK->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); } }} tooltip {Create 1000 Hz square wave on right channel} xywh {146 251 270 20} down_box DOWN_BOX code0 {o->value(progdefaults.PseudoFSK);} } } } Fl_Group tabWavFile { label Wav open xywh {0 50 600 330} hide } { Fl_Group listbox_wav_samplerate { label {Wav write sample rate} callback {progdefaults.wavSampleRate = o->index(); progdefaults.changed = true;} open tooltip {Pick baud rate from list} xywh {225 96 150 24} box DOWN_BOX color 7 align 5 code0 {o->add("8000|11025|16000|22050|24000|44100|48000");} code1 {o->index(progdefaults.wavSampleRate);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } } } Fl_Group tabID { label ID open xywh {0 23 600 357} hide } { Fl_Tabs tabsID {open xywh {0 23 600 357} } { Fl_Group tabRsID { label RsID open xywh {0 50 600 330} } { Fl_Group {} { label {Reed-Solomon ID (Rx)} open xywh {32 55 535 210} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkRSidNotifyOnly { label {Notify only} callback {progdefaults.rsid_notify_only = o->value(); notify_create_rsid_event(progdefaults.rsid_notify_only); if (progdefaults.rsid_notify_only) { chkRetainFreqLock->deactivate(); chkDisableFreqChange->deactivate(); } else { chkRetainFreqLock->activate(); chkDisableFreqChange->activate(); } progdefaults.changed = true;} tooltip {Check this to be notified when an RSID is received without changing modem and frequency} xywh {40 112 168 20} down_box DOWN_BOX code0 {chkRSidNotifyOnly->value(progdefaults.rsid_notify_only);} } Fl_Button bRSIDRxModes { label {Receive modes} callback {mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show(&progdefaults.rsid_rx_modes); progdefaults.changed = true;} xywh {40 81 130 24} } Fl_Check_Button chkRSidWideSearch { label {Searches passband} callback {progdefaults.rsidWideSearch=o->value(); progdefaults.changed = true;} tooltip {ON - search over entire waterfall OFF - limit search to +/- 200 Hz} xywh {40 143 203 20} down_box DOWN_BOX code0 {o->value(progdefaults.rsidWideSearch);} } Fl_Check_Button chkRSidMark { label {Mark prev freq/mode} callback {progdefaults.rsid_mark = o->value(); progdefaults.changed = true;} tooltip {Insert RX text marker before changing frequency and modem} xywh {40 175 203 20} down_box DOWN_BOX code0 {chkRSidMark->value(progdefaults.rsid_mark);} } Fl_Check_Button chkRSidAutoDisable { label {Disables detector} callback {progdefaults.rsid_auto_disable = o->value(); progdefaults.changed = true;} tooltip {Disable further detection when RSID is received} xywh {40 207 203 20} down_box DOWN_BOX code0 {if (progdefaults.rsid_notify_only) progdefaults.rsid_auto_disable = false;} code1 {chkRSidAutoDisable->value(progdefaults.rsid_auto_disable);} code2 {if (progdefaults.rsid_notify_only) chkRSidAutoDisable->deactivate();} } Fl_Group listbox_rsid_errors { label {Allow errors} callback {progdefaults.RsID_label_type = o->index(); progdefaults.changed = true;} open tooltip {Low = zero errors Medium = 1 error High = 2 errors} xywh {40 233 100 22} box DOWN_BOX color 7 align 8 code0 {listbox_rsid_errors->add(_("Low")); listbox_rsid_errors->add(_("Medium")); listbox_rsid_errors->add(_("High"));} code1 {listbox_rsid_errors->index(progdefaults.RsID_label_type);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Value_Slider sldrRSIDsquelch { label {Squelch open (sec)} callback {progdefaults.rsid_squelch = (int)o->value(); progdefaults.changed = true;} tooltip {Open squelch for nn sec if RSID detected} xywh {276 233 145 22} type Horizontal align 8 maximum 20 step 1 textsize 14 code0 {o->value(progdefaults.rsid_squelch);} code2 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button chkRSidShowAlert { label {Disable alert dialog} callback {progdefaults.disable_rsid_warning_dialog_box = o->value(); progdefaults.changed = true;} tooltip {Do not show RsID alert dialog box} xywh {276 143 203 20} down_box DOWN_BOX code0 {o->value(progdefaults.disable_rsid_warning_dialog_box);} } Fl_Check_Button chkRetainFreqLock { label {Retain tx freq lock} callback {progdefaults.retain_freq_lock = o->value(); progdefaults.changed = true;} tooltip {Retain TX lock frequency (Lk) when changing to RX RsID frequency} xywh {276 175 203 20} down_box DOWN_BOX code0 {o->value(progdefaults.retain_freq_lock);} } Fl_Check_Button chkDisableFreqChange { label {Disable freq change} callback {progdefaults.disable_rsid_freq_change = o->value(); progdefaults.changed = true;} tooltip {Do not automatically change to RX RsID frequency} xywh {276 207 203 20} down_box DOWN_BOX code0 {o->value(progdefaults.disable_rsid_freq_change);} } Fl_Group {} { label {The RsID notification message contents and display characteristics are configured on the "Notifications" configure dialog.} open xywh {216 74 330 60} box BORDER_BOX align 21 } {} } Fl_Group {} { label {Pre-Signal Tone} open xywh {32 267 265 97} box ENGRAVED_FRAME align 21 } { Fl_Counter val_pretone { label Seconds callback {progdefaults.pretone = o->value(); progdefaults.changed = true;} tooltip {Use for triggering amplifier carrier detect} xywh {88 305 140 21} minimum 0 maximum 10 code0 {o->value(progdefaults.pretone);} } } Fl_Group {} { label {Reed-Solomon ID (Tx)} open xywh {300 267 265 97} box ENGRAVED_FRAME align 21 } { Fl_Button bRSIDTxModes { label {Transmit modes} callback {mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show(&progdefaults.rsid_tx_modes); progdefaults.changed = true;} xywh {377 294 130 24} } Fl_Check_Button btn_post_rsid { label {End of xmt ID} callback {progdefaults.rsid_post=o->value(); progdefaults.changed = true;} tooltip {Add RsID signal to end of transmission} xywh {377 329 97 17} down_box DOWN_BOX code0 {o->value(progdefaults.rsid_post);} } } } Fl_Group tabVideoID { label Video open xywh {0 50 600 330} hide } { Fl_Group {} { label {Video Preamble ID} open xywh {32 115 536 189} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnsendid { label {Transmit mode ID} callback {progdefaults.sendid=o->value(); progdefaults.changed = true;} tooltip {Waterfall video ID} xywh {50 149 150 20} down_box DOWN_BOX } Fl_Check_Button btnsendvideotext { label {Transmit video text} callback {progdefaults.sendtextid=o->value(); progdefaults.changed = true;} tooltip {Waterfall video text} xywh {50 181 155 20} down_box DOWN_BOX code0 {o->value(progdefaults.sendtextid);} } Fl_Input valVideotext { label {:} callback {progdefaults.strTextid = o->value(); progdefaults.changed = true;} tooltip {Limit to a few characters, as in CQEM or IOTA etc.} xywh {217 179 323 24} code0 {o->value(progdefaults.strTextid.c_str());} code1 {valVideotext->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button chkID_SMALL { label {Use small font} callback {progdefaults.ID_SMALL=o->value(); progdefaults.changed = true;} tooltip {ON - small font OFF - large font} xywh {50 213 120 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.ID_SMALL);} } Fl_Value_Slider sldrVideowidth { label {Chars/Row:} callback {progdefaults.videowidth = (int)o->value(); progdefaults.changed = true;} tooltip {Set the number of characters per row} xywh {290 211 125 24} type Horizontal align 4 minimum 1 maximum 8 step 1 value 4 textsize 14 code0 {o->value(progdefaults.videowidth);} code2 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button btn_vidlimit { label {500 Hz limit} callback {progdefaults.vidlimit=o->value(); progdefaults.changed = true;} xywh {50 245 110 15} down_box DOWN_BOX code0 {o->value(progdefaults.vidlimit);} } Fl_Check_Button btn_vidmodelimit { label {Mode width limit} callback {progdefaults.vidmodelimit=o->value(); progdefaults.changed=true;} xywh {50 273 110 15} down_box DOWN_BOX code0 {o->value(progdefaults.vidmodelimit);} } Fl_Button bVideoIDModes { label {Video ID modes} callback {mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show(&progdefaults.videoid_modes); progdefaults.changed = true;} xywh {420 146 120 24} } } } Fl_Group tabCwID { label CW xywh {0 50 600 330} hide } { Fl_Group sld { label {CW Postamble ID} open xywh {32 146 536 127} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnCWID { label {Transmit callsign} callback {progdefaults.CWid = o->value(); progdefaults.changed = true;} tooltip {Send Callsign in CW at end of every transmission} xywh {139 184 140 24} down_box DOWN_BOX code0 {o->value(progdefaults.CWid);} } Fl_Value_Slider sldrCWIDwpm { label {Speed (WPM):} callback {progdefaults.CWIDwpm = (int)o->value(); progdefaults.changed = true;} tooltip {Send at this WPM} xywh {139 227 180 20} type Horizontal align 1 minimum 15 maximum 40 step 1 value 18 textsize 14 code0 {o->value(progdefaults.CWIDwpm);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Button bCWIDModes { label {CW ID modes} callback {mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show(&progdefaults.cwid_modes); progdefaults.changed = true;} xywh {412 184 120 24} } } } } } Fl_Group tabMisc { label Misc open xywh {0 25 600 355} hide } { Fl_Tabs tabsMisc {open xywh {0 25 600 355} selection_color 50 } { Fl_Group tabCPUspeed { label CPU open xywh {0 50 600 330} } { Fl_Group {} {open xywh {55 75 490 51} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkSlowCpu { label {Slow CPU (less than 700MHz)} callback {progdefaults.slowcpu = o->value(); progdefaults.changed = true;} tooltip {Enable if you're computer does not decode properly} xywh {201 90 225 20} down_box DOWN_BOX code0 {o->value(progdefaults.slowcpu);} } } } Fl_Group tabNBEMS { label NBEMS open xywh {0 50 600 330} hide } { Fl_Group {} { label {NBEMS data file interface} open xywh {50 65 500 75} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkAutoExtract { label Enable callback {progdefaults.autoextract = o->value(); progdefaults.changed = true;} tooltip {Extract files for use with external "wrap / flmsg" program} xywh {104 96 75 20} down_box DOWN_BOX code0 {o->value(progdefaults.autoextract);} } Fl_Check_Button chk_open_wrap_folder { label {Open message folder} callback {progdefaults.open_nbems_folder = o->value(); progdefaults.changed = true;} tooltip {Opens NBEMS file folder upon successful capture} xywh {310 96 146 20} down_box DOWN_BOX code0 {o->value(progdefaults.open_nbems_folder);} } } Fl_Group {} { label {Reception of flmsg files} open xywh {50 141 500 130} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chk_open_flmsg { label {Open with flmsg} callback {progdefaults.open_flmsg = o->value(); progdefaults.changed = true;} tooltip {Open message with flmsg} xywh {104 168 136 20} down_box DOWN_BOX code0 {o->value(progdefaults.open_flmsg);} } Fl_Check_Button chk_open_flmsg_print { label {Open in browser} callback {progdefaults.open_flmsg_print = o->value(); progdefaults.changed = true;} tooltip {Open file with default browser} xywh {310 168 136 20} down_box DOWN_BOX code0 {o->value(progdefaults.open_flmsg_print);} } Fl_Input txt_flmsg_pathname { label {flmsg:} callback {progdefaults.flmsg_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for flmsg} xywh {104 199 330 24} when 1 code0 {o->value(progdefaults.flmsg_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_flmsg { label {Locate flmsg} callback {select_flmsg_pathname();} tooltip {Locate flmsg executable} xywh {441 199 100 24} } Fl_Value_Slider sldr_extract_timeout { label {Timeout (secs)} callback {progdefaults.extract_timeout=o->value(); progdefaults.changed=true;} tooltip {Extract times out after NN seconds of inactivity.} xywh {70 237 364 21} type {Horz Knob} color 54 selection_color 0 align 8 minimum 1 maximum 10 step 0.5 value 4 textsize 14 code0 {o->value(progdefaults.extract_timeout);} } } } Fl_Group tabPskmail { label Pskmail open xywh {0 50 600 330} align 5 hide } { Fl_Group {} { label {Mail Server Attributes} open xywh {55 58 490 174} box ENGRAVED_FRAME align 21 } { Fl_Counter cntServerCarrier { label {Carrier frequency (Hz)} callback {progdefaults.ServerCarrier = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true;} tooltip {Default listen / transmit frequency} xywh {106 86 80 20} type Simple align 8 minimum 500 maximum 2500 step 25 value 1500 code0 {o->value(progdefaults.ServerCarrier);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntServerOffset { label {Search range (Hz)} callback {progdefaults.ServerOffset = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true;} tooltip {Listen for signals within this range} xywh {106 123 80 20} type Simple align 8 minimum 10 maximum 500 step 10 value 100 code0 {o->value(progdefaults.SearchRange);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntServerACQsn { label {Acquisition S/N (dB)} callback {progdefaults.ServerACQsn = o->value(); progdefaults.changed = true;} tooltip {Capture signals over this threshold} xywh {106 160 80 20} type Simple align 8 minimum 3 maximum 20 step 1 value 6 code0 {o->value(progdefaults.ServerACQsn);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntServerAFCrange { label {AFC range (Hz)} callback {progdefaults.ServerAFCrange = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true;} tooltip {Limit AFC movement to this range} xywh {106 197 80 20} type Simple align 8 minimum 10 maximum 500 step 10 value 25 code0 {o->value(progdefaults.SearchRange);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnPSKmailSweetSpot { label {Reset to Carrier} callback {progdefaults.PSKmailSweetSpot = o->value(); progdefaults.changed = true;} tooltip {When no signal present} xywh {361 86 142 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.PSKmailSweetSpot);} } } Fl_Group {} { label General open xywh {55 234 490 131} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_arq_s2n_report { label {Report ARQ frames average S/N} callback {progdefaults.Pskmails2nreport=o->value();} xywh {80 259 250 20} down_box DOWN_BOX code0 {o->value(progdefaults.Pskmails2nreport);} } } } Fl_Group tabSpot { label Spotting open xywh {0 50 600 330} hide } { Fl_Group {} { label {PSK Reporter} open xywh {55 72 490 254} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnPSKRepAuto { label {Automatically spot callsigns in decoded text} callback {progdefaults.pskrep_auto = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true;} tooltip {Parse all incoming text} xywh {65 103 324 20} down_box DOWN_BOX code0 {btnPSKRepAuto->value(progdefaults.pskrep_auto);} } Fl_Check_Button btnPSKRepLog { label {Send reception report when logging a QSO} callback {progdefaults.pskrep_log = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true;} tooltip {Send report only when QSO is logged} xywh {65 133 327 20} down_box DOWN_BOX code0 {btnPSKRepLog->value(progdefaults.pskrep_log);} } Fl_Check_Button btnPSKRepQRG { label {Report rig frequency (enable only if you have rig control!)} callback {progdefaults.pskrep_qrg = o->value(); progdefaults.changed = true;} tooltip {Include the transmit frequency} xywh {65 164 416 20} down_box DOWN_BOX code0 {btnPSKRepQRG->value(progdefaults.pskrep_qrg);} } Fl_Check_Button btn_report_when_visible { label {Disable spotting when signal browser(s) are not visible.} callback {progdefaults.report_when_visible = o->value(); progdefaults.changed = true;} tooltip {Check to reduce CPU load in PSK and RTTY modes.} xywh {65 195 416 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.report_when_visible);} } Fl_Input inpPSKRepHost { label {Host:} callback {progdefaults.pskrep_host = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true;} tooltip {To whom the connection is made} xywh {108 228 220 24} when 1 code0 {inpPSKRepHost->value(progdefaults.pskrep_host.c_str());} code1 {inpPSKRepHost->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpPSKRepPort { label {Port:} callback {progdefaults.pskrep_port = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true;} tooltip {Using UDP port \#} xywh {477 228 60 24} when 1 code0 {inpPSKRepPort->value(progdefaults.pskrep_port.c_str());} code1 {inpPSKRepPort->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnPSKRepInit { label Initialize callback {pskrep_stop(); if (!pskrep_start()) { boxPSKRepMsg->copy_label(pskrep_error()); progdefaults.usepskrep = false; } else { boxPSKRepMsg->label(0); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.usepskrep = true; } progdefaults.changed = true;} tooltip {Initialize the socket client} xywh {457 273 80 24} } Fl_Box boxPSKRepMsg { label {} xywh {67 257 300 48} labelfont 2 code0 {boxPSKRepMsg->label(0);} } } } Fl_Group tabSweetSpot { label {Sweet Spot} open xywh {0 50 600 330} hide } { Fl_Group {} {open xywh {55 71 490 75} box ENGRAVED_FRAME align 21 } { Fl_Value_Input valCWsweetspot { label CW callback {progdefaults.CWsweetspot=o->value(); progdefaults.changed = true;} tooltip {Default CW tracking point} xywh {92 82 65 20} minimum 200 maximum 4000 step 1 value 1000 code0 {o->value(progdefaults.CWsweetspot);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input valRTTYsweetspot { label RTTY callback {progdefaults.RTTYsweetspot=o->value(); progdefaults.changed = true;} tooltip {Default RTTY tracking point} xywh {270 82 65 20} minimum 200 maximum 4000 step 1 value 1000 code0 {o->value(progdefaults.RTTYsweetspot);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input valPSKsweetspot { label {PSK et al.} callback {progdefaults.PSKsweetspot=o->value(); progdefaults.changed = true;} tooltip {Default for all other modems} xywh {470 82 65 20} minimum 200 maximum 4000 step 1 value 1000 code0 {o->value(progdefaults.PSKsweetspot);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Check_Button btnStartAtSweetSpot { label {Always start new modems at these frequencies} callback {progdefaults.StartAtSweetSpot = o->value(); progdefaults.changed = true;} tooltip {ON - start at default OFF - keep current wf cursor position} xywh {65 112 348 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.StartAtSweetSpot);} } } Fl_Group {} { label {K3 A1A configuation} open xywh {55 151 490 60} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnCWIsLSB { label {CW is LSB} callback {progdefaults.CWIsLSB=o->value(); progdefaults.changed=true;} tooltip {Select this for Elecraft K3 Other radios should not need it.} xywh {270 172 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.CWIsLSB);} } } } Fl_Group tabText_IO { label {Text i/o} open xywh {0 50 600 330} hide } { Fl_Group grpTalker { label {Talker Socket (MS only)} open xywh {55 132 490 73} box ENGRAVED_FRAME align 21 } { Fl_Light_Button btnConnectTalker { label Talker callback {if (o->value()) open_talker(); else close_talker();} xywh {81 152 74 20} selection_color 60 code0 {extern void open_talker();} code1 {extern void close_talker();} } Fl_Box {} { label {Connect/disconnect to Talker socket server} xywh {160 152 345 20} align 20 } Fl_Check_Button btn_auto_talk { label {Auto connect when fldigi opens (server must be up)} callback {progdefaults.auto_talk = o->value();} xywh {81 180 391 15} down_box DOWN_BOX code0 {o->value(progdefaults.auto_talk);} } } Fl_Group {} { label {Capture rx text to external file} open xywh {55 72 490 56} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkRxStream { label {Enable rx text stream} callback {progdefaults.speak = o->value(); progdefaults.changed = true;} tooltip {Send rx text to file: textout.txt} xywh {81 99 175 20} down_box DOWN_BOX code0 {o->value(progdefaults.speak);} } } } Fl_Group tabDTMF { label DTMF open xywh {0 50 600 330} hide } { Fl_Check_Button chkDTMFdecode { label {Decode DTMF tones} callback {progdefaults.DTMFdecode = o->value();} tooltip {Decode received DTMF tones} xywh {212 103 175 20} down_box DOWN_BOX code0 {o->value(progdefaults.DTMFdecode);} } } Fl_Group tabWX { label WX open xywh {0 50 600 330} hide } { Fl_Group {} { label {Weather query specification} open xywh {55 60 490 300} box ENGRAVED_FRAME align 21 } { Fl_Input inpWXsta { label {METAR station ID code} callback {progdefaults.wx_sta = o->value(); progdefaults.changed = true;} tooltip {for example KMDQ for Huntsville-Madison Executive Airport, AL} xywh {94 92 43 24} align 8 code0 {o->value(progdefaults.wx_sta.c_str());} } Fl_Check_Button btn_wx_full { label {Full report} callback {progdefaults.wx_full=o->value(); progdefaults.changed = true;} tooltip {Insert full METAR report} xywh {258 130 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_full);} } Fl_Input {} { label {End of header string:} callback {progdefaults.wx_eoh = o->value(); progdefaults.changed = true;} tooltip {Text defining end of METAR header Typically 'Connection: close' Used to search for station name} xywh {258 156 266 25} when 1 code0 {o->value(progdefaults.wx_eoh.c_str());} } Fl_Check_Button btn_wx_station_name { label {METAR station location} callback {progdefaults.wx_station_name = o->value(); progdefaults.changed = true;} tooltip {Add geopolitical name of METAR station} xywh {258 192 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_station_name);} } Fl_Check_Button btn_wx_condx { label Conditions callback {progdefaults.wx_condx=o->value(); progdefaults.changed = true;} tooltip {current wx conditions} xywh {258 218 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_condx);} } Fl_Check_Button btn_wx_fahrenheit { label Fahrenheit callback {progdefaults.wx_fahrenheit=o->value(); progdefaults.changed = true;} tooltip {report Fahrenheit} xywh {258 245 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_fahrenheit);} } Fl_Check_Button btn_wx_celsius { label Celsius callback {progdefaults.wx_celsius=o->value(); progdefaults.changed = true;} tooltip {report Celsius} xywh {386 245 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_celsius);} } Fl_Check_Button btn_wx_mph { label {Miles / Hour} callback {progdefaults.wx_mph=o->value(); progdefaults.changed = true;} tooltip {report miles per hour} xywh {258 271 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_mph);} } Fl_Check_Button btn_wx_kph { label {kilometers / hour} callback {progdefaults.wx_kph=o->value(); progdefaults.changed = true;} tooltip {report kilometers per hour} xywh {386 271 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_kph);} } Fl_Check_Button btn_wx_inches { label {Inches Mg.} callback {progdefaults.wx_inches=o->value(); progdefaults.changed = true;} tooltip {report inches mercury} xywh {258 298 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_inches);} } Fl_Check_Button btn_wx_mbars { label mbars callback {progdefaults.wx_mbars=o->value(); progdefaults.changed = true;} tooltip {report millibars} xywh {386 298 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_mbars);} } Fl_Box {} { label Temperature xywh {93 245 156 19} align 20 } Fl_Box {} { label {Wind speed/dir} xywh {93 271 156 19} align 20 } Fl_Box {} { label {Barometric pressure} xywh {93 298 156 19} align 20 } Fl_Button btn_metar_search { label {Search on web} callback {get_METAR_station();} xywh {336 92 130 24} code0 {\#include "weather.h"} } } } Fl_Group tabKML { label KML open xywh {0 50 600 330} hide } { Fl_Input btnKmlSaveDir { label {KML files directory} callback {progdefaults.kml_save_dir=o->value(); progdefaults.changed = true; kml_init();} tooltip {Where generated KML documents are stored.} xywh {26 75 390 24} align 69 code0 {o->value(progdefaults.kml_save_dir.c_str());} } Fl_Input inputKmlRootFile { label {KML root file} xywh {25 119 300 24} align 5 code0 {o->value("fldigi.kml");} } Fl_Counter cntKmlMergeDistance { label {Minimum distance for splitting aliases (Meters)} callback {progdefaults.kml_merge_distance = o->value(); progdefaults.changed = true; kml_init();} tooltip {Minimum distance for splitting alias nodes (Meters)} xywh {26 155 100 24} align 8 minimum 0 maximum 100000 step 10 value 1000 code0 {o->value(progdefaults.kml_merge_distance);} code1 {o->lstep(1000);} } Fl_Counter cntKmlRetentionTime { label {Data retention time, in hours (0 for no limit)} callback {progdefaults.kml_retention_time = o->value(); progdefaults.changed = true; kml_init();} tooltip {Number of hours data is kept for each node. Zero means keeping everything.} xywh {25 191 100 24} align 8 minimum 0 maximum 500 step 1 code0 {o->value(progdefaults.kml_retention_time);} code1 {o->lstep(24);} } Fl_Spinner cntKmlRefreshInterval { label {KML refresh interval (seconds)} callback {progdefaults.kml_refresh_interval = (int)(o->value()); progdefaults.changed = true; kml_init();} tooltip {Refresh time interval written in KML file (Seconds)} xywh {24 227 50 24} align 8 value 10 code0 {o->minimum(1); o->maximum(3600); o->step(1);} code1 {o->value(progdefaults.kml_refresh_interval);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Group listbox_kml_balloon_style { label {KML balloon display style} callback {progdefaults.kml_balloon_style = o->index(); progdefaults.changed = true; kml_init();} tooltip {KML balloon in plain text, or HTML, in plain tables or matrices.} xywh {24 263 201 24} box DOWN_BOX color 7 align 8 when 1 code0 {o->add("Plain text|HTML tables|Single HTML matrix");o->index(progdefaults.kml_balloon_style);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Input btnKmlCommand { label {Command run on KML creation} callback {progdefaults.kml_command=o->value(); progdefaults.changed = true; kml_init();} tooltip {Command started when KML files are generated. Subprocesses are started once, and restarted if needed.} xywh {24 299 246 24} align 72 code0 {o->value(progdefaults.kml_command.c_str());} } Fl_Button btlTestKmlCommand { label {Test command} callback {KmlServer::SpawnProcess();} tooltip {Execute command on KML files.} xywh {24 335 191 24} } Fl_Button btnSelectKmlDestDir { label {Change dir...} callback {Fl_File_Chooser *fc = new Fl_File_Chooser(".",NULL,Fl_File_Chooser::DIRECTORY,"Input File"); fc->callback(KmlDestDirSet); fc->show();} tooltip {Choose directory to store KML documents} xywh {425 75 101 24} } Fl_Button btlPurge { label {Cleanup KML data now !} callback {KmlServer::GetInstance()->Reset();} tooltip {Cleanups KML documents, empties Google Earth display.} xywh {336 119 190 24} } Fl_Check_Button btnKmlPurgeOnStartup { label {Cleanup on startup} callback {progdefaults.kml_purge_on_startup = o->value(); progdefaults.changed = true;} tooltip {Empties KML documents when starting program.} xywh {322 231 172 15} down_box DOWN_BOX code0 {o->value(progdefaults.kml_purge_on_startup);} } } } } Fl_Group tabQRZ { label Web open tooltip {Callsign database} xywh {0 25 600 355} hide } { Fl_Tabs tabsQRZ {open xywh {0 25 600 355} } { Fl_Group {} { label {Call Lookup} open xywh {0 50 600 330} } { Fl_Group {} { label {Web Browser lookup} open xywh {55 56 490 122} box ENGRAVED_FRAME align 21 } { Fl_Round_Button btnQRZWEBnotavailable { label None callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = QRZWEBNONE; progdefaults.changed = true;} tooltip {Do not use callsign lookup via web browser} xywh {77 82 337 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.QRZWEB == QRZWEBNONE);} } Fl_Round_Button btnQRZonline { label {QRZ online via default Internet Browser} callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = QRZHTML; progdefaults.changed = true;} tooltip {Visit QRZ web site} xywh {77 106 337 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZWEB == QRZHTML);} } Fl_Round_Button btnHAMCALLonline { label {HamCall online via default Internet Browser} callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = HAMCALLHTML; progdefaults.changed = true;} tooltip {Visit Hamcall web site} xywh {77 130 337 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZWEB == HAMCALLHTML);} } Fl_Round_Button btnHamQTHonline { label {HamQTH via default Internet Browser} callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = HAMQTHHTML; progdefaults.changed = true;} tooltip {Visit hamQTH web site} xywh {77 154 337 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZWEB == HAMQTHHTML);} } } Fl_Group {} { label {Data base lookup} open xywh {55 180 490 190} box ENGRAVED_FRAME align 21 } { Fl_Round_Button btnQRZXMLnotavailable { label None callback {set_qrzxml_buttons(o); progdefaults.QRZXML = QRZXMLNONE; progdefaults.changed = true;} tooltip {Do not use callsign database} xywh {77 203 64 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.QRZXML == QRZXMLNONE);} } Fl_Round_Button btnQRZcdrom { label {QRZ cdrom} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = QRZCD; progdefaults.changed = true;} tooltip {Use CD or hard drive CD image} xywh {77 231 70 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == QRZCD);} } Fl_Round_Button btnQRZsub { label {QRZ.com} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = QRZNET; progdefaults.changed = true;} tooltip {You need a paid QRZ online subscription to access} xywh {77 259 125 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == QRZNET);} } Fl_Round_Button btnHamcall { label {Hamcall.net} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = HAMCALLNET; progdefaults.changed = true;} tooltip {You need a paid Hamcall online subscription to access} xywh {77 285 125 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == HAMCALLNET);} } Fl_Round_Button btnHamQTH { label {HamQTH.com (free service http://www.hamqth.com)} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = HAMQTH; progdefaults.changed = true;} tooltip {Free service courtesy of OK} xywh {77 311 125 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == HAMQTH);} } Fl_Round_Button btnCALLOOK { label {Callook.info lookup (free service US callsigns only)} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = CALLOOK; progdefaults.changed = true;} tooltip {Visit Hamcall web site} xywh {77 338 125 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == CALLOOK);} } Fl_Input txtQRZpathname { label {at:} callback {progdefaults.QRZpathname = o->value(); progdefaults.QRZchanged = true; progdefaults.changed = true;} tooltip {ie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for database} xywh {202 230 300 22} code0 {o->value(progdefaults.QRZpathname.c_str());} code1 {txtQRZpathname->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpQRZusername { label {User name} callback {progdefaults.QRZusername = o->value(); progdefaults.changed = true;} tooltip {Your login name} xywh {285 258 150 22} code0 {o->value(progdefaults.QRZusername.c_str());} code1 {inpQRZusername->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpQRZuserpassword { label Password callback {progdefaults.QRZuserpassword = o->value(); progdefaults.changed = true;} tooltip {Your login password} xywh {285 284 150 22} code0 {o->value(progdefaults.QRZuserpassword.c_str());} code1 {o->type(FL_SECRET_INPUT);} code2 {inpQRZuserpassword->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnQRZpasswordShow { label Show callback {inpQRZuserpassword->type(inpQRZuserpassword->type() ^ FL_SECRET_INPUT); inpQRZuserpassword->redraw(); o->label((inpQRZuserpassword->type() & FL_SECRET_INPUT) ? "Show" : "Hide");} tooltip {Show password in plain text} xywh {445 285 70 20} } Fl_Check_Button btn_notes_address { label {Add address to notes field} callback {progdefaults.notes_address = o->value(); progdefaults.changed = true;} xywh {202 205 207 15} down_box DOWN_BOX code0 {o->value(progdefaults.notes_address);} } } } Fl_Group {} { label eQSL open xywh {0 50 600 330} hide } { Fl_Input inpEQSL_id { label {User ID} callback {progdefaults.eqsl_id = o->value(); progdefaults.changed = true;} tooltip {Your login name} xywh {225 58 150 20} code0 {o->value(progdefaults.eqsl_id.c_str());} code1 {inpEQSL_id->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpEQSL_pwd { label Password callback {progdefaults.eqsl_pwd = o->value(); progdefaults.changed = true;} tooltip {Your login password} xywh {225 85 150 20} code0 {o->value(progdefaults.eqsl_pwd.c_str());} code1 {o->type(FL_SECRET_INPUT);} code2 {inpEQSL_pwd->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnEQSL_pwd_show { label Show callback {inpEQSL_pwd->type(inpEQSL_pwd->type() ^ FL_SECRET_INPUT); inpEQSL_pwd->redraw(); o->label((inpEQSL_pwd->type() & FL_SECRET_INPUT) ? "Show" : "Hide");} tooltip {Show password in plain text} xywh {395 85 70 20} } Fl_Input inpEQSL_nick { label {QTH Nickname} callback {progdefaults.eqsl_nick = o->value(); progdefaults.changed = true;} tooltip {Your login name} xywh {225 114 150 20} code0 {o->value(progdefaults.eqsl_nick.c_str());} code1 {inpEQSL_nick->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Group {} { label Options open xywh {30 141 516 223} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_send_when_logged { label {send when logged (log button, , )} callback {progdefaults.eqsl_when_logged = o->value(); progdefaults.changed = true;} tooltip {automatic data upload} xywh {79 166 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.eqsl_when_logged);} } Fl_Input txt_eqsl_default_message { label {Default message} callback {progdefaults.eqsl_default_message = o->value(); progdefaults.changed = true;} tooltip {default text to send with etc} xywh {83 226 451 40} type Multiline align 5 when 1 code0 {o->value(progdefaults.eqsl_default_message.c_str());} class Fl_Input2 } Fl_Group {} { label {Text Tags (tags use {} delimiters)} open xywh {33 270 510 90} box FLAT_BOX align 21 } { Fl_Box eqsl_txt1 { label { {CALL} other ops call sign} xywh {32 317 220 17} align 20 } Fl_Box eqsl_txt2 { label { {MODE} full mode / submode} xywh {30 336 220 17} align 20 } Fl_Box eqsl_txt3 { label {{NAME} other ops name} xywh {278 317 220 17} align 20 } Fl_Box {} { label {These tags can also be used in } xywh {68 293 440 17} } } Fl_Check_Button btn_send_datetime_off { label {Use date/time off for log entry} callback {progdefaults.eqsl_datetime_off = o->value(); progdefaults.changed = true;} tooltip {default uses date/time on} xywh {80 188 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.eqsl_datetime_off);} } } } } } Fl_Group tabAutoStart { label Autostart callback {progdefaults.changed = true;} open tooltip {Operator information} xywh {0 25 600 355} when 1 hide } { Fl_Group {} { label {Auto start programs with fldigi} open xywh {2 32 596 330} box ENGRAVED_BOX align 17 } { Fl_Input txt_auto_flrig_pathname { label {flrig:} callback {progdefaults.auto_flrig_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for external program Or simple name of program} xywh {63 71 310 24} when 1 code0 {o->value(progdefaults.auto_flrig_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_flrig { label Locate callback {std::string str = select_binary_pathname("flrig"); txt_auto_flrig_pathname->value(str.c_str()); progdefaults.auto_flrig_pathname = str; progdefaults.changed = true;} tooltip {Locate flrig executable} xywh {395 71 70 24} } Fl_Input txt_auto_flamp_pathname { label {flamp:} callback {progdefaults.auto_flamp_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for external program Or simple name of program} xywh {63 109 310 24} when 1 code0 {o->value(progdefaults.auto_flamp_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_auto_flamp { label Locate callback {std::string str = select_binary_pathname("flamp"); txt_auto_flamp_pathname->value(str.c_str()); progdefaults.auto_flamp_pathname = str; progdefaults.changed = true;} tooltip {Locate flamp executable} xywh {395 109 70 24} } Fl_Input txt_auto_flnet_pathname { label {flnet:} callback {progdefaults.flnet_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for external program Or simple name of program} xywh {63 147 310 24} when 1 code0 {o->value(progdefaults.auto_flnet_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_auto_flnet { label Locate callback {std::string str = select_binary_pathname("flnet"); txt_auto_flnet_pathname->value(str.c_str()); progdefaults.auto_flnet_pathname = str; progdefaults.changed = true;} tooltip {Locate flnet executable} xywh {395 147 70 24} } Fl_Input txt_auto_fllog_pathname { label {fllog:} callback {progdefaults.auto_fllog_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for external program Or simple name of program} xywh {63 186 310 24} when 1 code0 {o->value(progdefaults.auto_fllog_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_fllog { label Locate callback {std::string str = select_binary_pathname("fllog"); txt_auto_fllog_pathname->value(str.c_str()); progdefaults.auto_fllog_pathname = str; progdefaults.changed = true;} tooltip {Locate fllog executable} xywh {395 186 70 24} } Fl_Input txt_auto_prog1_pathname { label {Prog 1:} callback {progdefaults.auto_prog1_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for external program Or simple name of program} xywh {63 224 310 24} when 1 code0 {o->value(progdefaults.auto_prog1_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_prog1 { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_prog1_pathname); txt_auto_prog1_pathname->value(str.c_str()); progdefaults.auto_prog1_pathname = str; progdefaults.changed = true;} tooltip {Locate program \#1 executable} xywh {395 224 70 24} } Fl_Input txt_auto_prog2_pathname { label {Prog 2:} callback {progdefaults.auto_prog2_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for external program Or simple name of program} xywh {63 262 310 24} when 1 code0 {o->value(progdefaults.auto_prog2_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_prog2 { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_prog2_pathname); txt_auto_prog2_pathname->value(str.c_str()); progdefaults.auto_prog2_pathname = str; progdefaults.changed = true;} tooltip {Locate program \#2 executable} xywh {395 262 70 24} } Fl_Input txt_auto_prog3_pathname { label {Prog 3:} callback {progdefaults.auto_prog3_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for external program Or simple name of program} xywh {63 301 310 24} when 1 code0 {o->value(progdefaults.auto_prog3_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_prog3 { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_prog3_pathname); txt_auto_prog3_pathname->value(str.c_str()); progdefaults.auto_prog3_pathname = str; progdefaults.changed = true;} tooltip {Locate program \#3 executable} xywh {395 301 70 24} } Fl_Check_Button btn_flrig_auto_enable { label {Enable -} callback {progdefaults.flrig_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {475 75 19 15} down_box DOWN_BOX align 1 code0 {o->value(progdefaults.flrig_auto_enable);} } Fl_Check_Button btn_flamp_auto_enable { callback {progdefaults.flamp_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {475 113 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.flamp_auto_enable);} } Fl_Check_Button btn_flnet_auto_enable { callback {progdefaults.flnet_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {475 151 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.flnet_auto_enable);} } Fl_Check_Button btn_fllog_auto_enable { callback {progdefaults.fllog_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {475 190 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.fllog_auto_enable);} } Fl_Check_Button btn_prog1_auto_enable { callback {progdefaults.prog1_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {475 228 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.prog1_auto_enable);} } Fl_Check_Button btn_prog2_auto_enable { callback {progdefaults.prog2_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {475 266 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.prog2_auto_enable);} } Fl_Check_Button btn_prog3_auto_enable { callback {progdefaults.prog3_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {475 305 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.prog3_auto_enable);} } Fl_Button btn_test_flrig { label Test callback {start_process(progdefaults.auto_flrig_pathname);} tooltip {Start flrig} xywh {505 71 70 24} } Fl_Button btn_test_flamp { label Test callback {start_process(progdefaults.auto_flamp_pathname);} tooltip {Start flamp} xywh {505 109 70 24} } Fl_Button btn_test_flnet { label Test callback {start_process(progdefaults.auto_flnet_pathname);} tooltip {Start flnet} xywh {505 147 70 24} } Fl_Button btn_test_fllog { label Test callback {start_process(progdefaults.auto_fllog_pathname);} tooltip {Start fllog} xywh {505 186 70 24} } Fl_Button btn_test_prog1 { label Test callback {start_process(progdefaults.auto_prog1_pathname);} tooltip {Start prog1} xywh {505 224 70 24} } Fl_Button btn_test_prog2 { label Test callback {start_process(progdefaults.auto_prog2_pathname);} tooltip {Start prog2} xywh {505 262 70 24} } Fl_Button btn_test_prog3 { label Test callback {start_process(progdefaults.auto_prog3_pathname);} tooltip {Start prog3} xywh {505 301 70 24} } } } } Fl_Button btnSaveConfig { label Save callback {progdefaults.saveDefaults();} xywh {330 388 130 22} } Fl_Return_Button btnCloseConfig { label Close callback {closeDialog();} xywh {462 388 130 22} } Fl_Button btnResetConfig { label {Restore defaults} callback {progdefaults.resetDefaults(); progdefaults.changed = false;} xywh {20 388 130 22} } } } Function {openConfig()} {return_type void } { code {if (!dlgConfig) createConfig(); progdefaults.loadDefaults();} {} } Function {closeDialog()} {return_type void } { code {if (dlgConfig) dlgConfig->hide();} {} } Function {createConfig()} {return_type void } { code {if (!dlgConfig) { dlgConfig = ConfigureDialog(); dlgConfig->xclass(PACKAGE_NAME); }} {} } decl {class Fl_File_Chooser ;} {public global } Function {WefaxDestDirSet(Fl_File_Chooser *w, void *userdata)} {return_type void } { code {/* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnWefaxSaveDir->value( w->value() ); btnWefaxSaveDir->redraw(); cb_btnWefaxSaveDir( btnWefaxSaveDir, NULL ); }} {} } Function {KmlDestDirSet(Fl_File_Chooser *w, void *userdata)} {open return_type void } { code {/* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnKmlSaveDir->value( w->value() ); btnKmlSaveDir->redraw(); cb_btnKmlSaveDir( btnKmlSaveDir, NULL ); }} {} } Function {make_window()} {} {} fldigi-3.21.80/src/dialogs/font_browser.cxx0000664000175000017500000002120712313064025015512 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include "font_browser.h" #include "flslider2.h" #include "gettext.h" using namespace std; Font_Browser* font_browser; // Font Color selected void Font_Browser::ColorSelect() { unsigned char r, g, b; Fl::get_color(fontcolor, r, g, b); if (fl_color_chooser(_("Font color"), r, g, b) == 0) return; fontcolor = fl_rgb_color(r, g, b); btn_Color->color(fontcolor); btn_Color->labelcolor( fl_contrast(FL_BLACK, fontcolor)); } void Font_Browser::fb_callback(Fl_Widget* w, void* arg) { Font_Browser* fb = reinterpret_cast(arg); if (w == fb->btn_Cancel) fb->hide(); else if (w == fb->btn_OK) { if (fb->callback_) (*fb->callback_)(fb, fb->data_); } else if (w == fb->btn_Color) fb->ColorSelect(); else if (w == fb->lst_Font) fb->FontNameSelect(); else { if (w == fb->lst_Size) fb->txt_Size->value(strtol(fb->lst_Size->text(fb->lst_Size->value()), NULL, 10)); fb->fontsize = static_cast(fb->txt_Size->value()); } fb->box_Example->SetFont(fb->fontnbr, fb->fontsize, fb->fontcolor); } // Sort the font list void Font_Browser::FontSort() { int size = lst_Font->size(); for ( int t = 1; t <= size - 1; t++ ) for ( int r = t+1; r <= size; r++ ) if ( strcasecmp(lst_Font->text(t), lst_Font->text(r)) > 0 ) lst_Font->swap(t,r); } // Font Name changed callback void Font_Browser::FontNameSelect() { int fn = lst_Font->value(); if (!fn) return; fontnbr = (Fl_Font)reinterpret_cast(lst_Font->data(fn)); // get sizes and fill browser; skip first element if it is zero lst_Size->clear(); int nsizes, *sizes; char buf[4]; nsizes = Fl::get_font_sizes(fontnbr, sizes); // for (int i = !*sizes; i < nsizes; i++) if ((size_t)snprintf(buf, sizeof(buf), "%d", sizes[i]) < sizeof(buf)) lst_Size->add(buf, reinterpret_cast(sizes[i])); // scalable font with no suggested sizes if (!lst_Size->size()) { for (int i = 1; i <= 48; i++) { snprintf(buf, sizeof(buf), "%d", i); lst_Size->add(buf, reinterpret_cast(i)); } } fontSize(fontsize); } Font_Browser::Font_Browser(int x, int y, int w, int h, const char *lbl ) : Fl_Window(x, y, w, h, lbl) { lst_Font = new Fl_Browser(5, 15, 280, 125, _("Font:")); lst_Font->align(FL_ALIGN_TOP_LEFT); lst_Font->type(FL_HOLD_BROWSER); lst_Font->callback(fb_callback, this); txt_Size = new Fl_Value_Input2(290, 15, 50, 22, _("Size:")); txt_Size->align(FL_ALIGN_TOP_LEFT); txt_Size->range(1.0, 48.0); txt_Size->step(1.0); txt_Size->callback(fb_callback, this); lst_Size = new Fl_Browser(290, 40, 50, 100); lst_Size->type(FL_HOLD_BROWSER); lst_Size->callback(fb_callback, this); btn_OK = new Fl_Return_Button(345, 40, 80, 25, _("&OK")); btn_OK->shortcut(0x8006f); btn_OK->callback(fb_callback, this); btn_Cancel = new Fl_Button(345, 70, 80, 25, _("Cancel")); btn_Cancel->labelsize(12); btn_Cancel->callback(fb_callback, this); btn_Color = new Fl_Button(345, 100, 80, 25, _("Color")); btn_Color->down_box(FL_BORDER_BOX); btn_Color->color(FL_FOREGROUND_COLOR); btn_Color->labelcolor( fl_contrast(FL_BLACK, FL_FOREGROUND_COLOR)); btn_Color->callback(fb_callback, this); box_Example = new Preview_Box(5, 145, 420, 75, _("That crazy fox jumped over the dog again!\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~")); box_Example->box(FL_DOWN_BOX); box_Example->align(FL_ALIGN_WRAP|FL_ALIGN_CLIP|FL_ALIGN_CENTER|FL_ALIGN_INSIDE); resizable(box_Example); set_modal(); end(); // Initializations this->callback_ = 0; // Initialize Widgets callback this->data_ = 0; // And the data numfonts = Fl::set_fonts(0); // Nr of fonts available on the server const char* name; for(int i = 0; i < numfonts; i++) { name = Fl::get_font_name((Fl_Font)i); if (isalpha(*name)) lst_Font->add(name, reinterpret_cast(i)); } FontSort(); fontnbr = FL_HELVETICA;; fontsize = FL_NORMAL_SIZE; // Font Size to be used fontcolor = FL_FOREGROUND_COLOR; filter = ALL_TYPES; lst_Font->value(1); FontNameSelect(); //! Fl::focus(lst_Font); xclass(PACKAGE_NAME); } void Font_Browser::fontNumber(Fl_Font n) { fontnbr = n; lst_Font->value(1); int s = lst_Font->size(); for (int i = 1; i < s; i++ ) { if ((Fl_Font)reinterpret_cast(lst_Font->data(i)) == n) { lst_Font->value(i); FontNameSelect(); break; } } } void Font_Browser::fontSize(int s) { fontsize = s; int n = lst_Size->size(); for (int i = 1; i < n; i++) { if ((intptr_t)lst_Size->data(i) == fontsize) { lst_Size->value(i); break; } } txt_Size->value(s); } void Font_Browser::fontColor(Fl_Color c) { btn_Color->color(fontcolor = c); box_Example->SetFont(fontnbr, fontsize, fontcolor); box_Example->redraw(); } void Font_Browser::fontName(const char* n) { int s = lst_Font->size(); for (int i = 1; i < s; i++) { if (!strcmp(lst_Font->text(i), n)) { lst_Font->value(i); FontNameSelect(); } } } bool Font_Browser::fixed_width(Fl_Font f) { fl_font(f, FL_NORMAL_SIZE); return fl_width('X') == fl_width('i'); } #include #include #include class Progress_Window : public Fl_Double_Window { public: Progress_Window(float min = 0.0f, float max = 100.0f, const char* l = 0) : Fl_Double_Window(200, 34), ps(5, 5, 190, 24, l) { end(); range(min, max); ps.align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); ps.selection_color(FL_SELECTION_COLOR); set_modal(); callback(nop); if (l && *l) { fl_font(FL_HELVETICA, FL_NORMAL_SIZE); int s = (int)(fl_width(l) + fl_width('W')); if (s > ps.w()) { ps.size(s, ps.h()); size(ps.w() + 10, h()); } } position(Fl::event_x_root() - w() / 2, Fl::event_y_root() - h()); xclass(PACKAGE_TARNAME); show(); } void range(float min, float max) { ps.minimum(min); ps.maximum(max); } void value(float val) { ps.value(val); } static void nop(Fl_Widget*, void*) { } private: Fl_Progress ps; }; void Font_Browser::fontFilter(filter_t filter) { if (this->filter == filter) return; int s = lst_Font->size(); static vector fixed; if (fixed.empty()) { Progress_Window pw(1, s, _("Reading fonts...")); fixed.resize(s); for (int i = 1; i < s; i++) { fixed[i] = fixed_width((Fl_Font)(intptr_t)(lst_Font->data(i))); pw.value(i); Fl::check(); } } switch (this->filter = filter) { case FIXED_WIDTH: for (int i = 1; i < s; i++) { if (fixed[i]) lst_Font->show(i); else lst_Font->hide(i); } break; case VARIABLE_WIDTH: for (int i = 1; i < s; i++) { if (!fixed[i]) lst_Font->show(i); else lst_Font->hide(i); } break; case ALL_TYPES: for (int i = 1; i < s; i++) lst_Font->show(i); break; } lst_Font->topline(lst_Font->value()); } ////////////////////////////////////////////////////////////////////// Preview_Box::Preview_Box(int x, int y, int w, int h, const char* l) : Fl_Widget(x, y, w, h, l) { fontName = 1; fontSize = FL_NORMAL_SIZE; box(FL_DOWN_BOX); color(FL_BACKGROUND2_COLOR); fontColor = FL_FOREGROUND_COLOR; } void Preview_Box::draw() { draw_box(); fl_font((Fl_Font)fontName, fontSize); fl_color(fontColor); fl_draw(label(), x()+3, y()+3, w()-6, h()-6, align()); } void Preview_Box::SetFont(int fontname, int fontsize, Fl_Color c) { fontName = fontname; fontSize = fontsize; fontColor = c; redraw(); } fldigi-3.21.80/src/dialogs/htmlstrings.cxx0000664000175000017500000000461212313064025015360 00000000000000// ---------------------------------------------------------------------------- // // htmlstrings.cxx // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "dialogs/guide.cxx" const char* szAbout = "\n\ \n\ \n\ About\n\ \n\ \n\ \n\
\n\

Fldigi " PACKAGE_VERSION "

\n\
\n\ Fast and Light Digital modem program\n\
\n\

\n\ Copyright \251 2008-2012 " FLDIGI_AUTHORS ".\n\

\n\ Distributed under the GNU General Public License version 3 or later.
\n\ This is free software: you are free to change and redistribute it.
\n\ There is NO WARRANTY, to the extent permitted by law.\n\

Programmers:

\n\      Dave Freese, W1HKJ
\n\      Stelios Bounanos, M0GLD
\n\      Rem\355 Chateauneu, F4ECW
\n\      John Douyere, VK2ETA
\n\      Stefan Fendt, DL1SMF
\n\      Leigh Klotz, WA5ZNU
\n\      John Phelps, KL4YFD
\n\      Andrej Lajovic, S57LN\n\

Localization:

\n\      German: Marc Richter, DF2MR
\n\      French: St\351phane Fillod, F8CFE
\n\      Italian: Pierfrancesco Caci, IK5PVX
\n\      Polish: Roman BagiÅ„ski, SP4JEU
\n\      Spanish: Pavel Milanes Costa, CO7WT
\n\

Beginners' Guide:

\n\      Murray Greenman, ZL1BPU
\n\ \n\ \n\ "; fldigi-3.21.80/src/dialogs/notifydialog.cxx0000664000175000017500000004200012313150713015463 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0302 #include "gettext.h" #include "notifydialog.h" #include #include "notify.h" Fl_Group *grpNotifyEvent=(Fl_Group *)0; Fl_Choice *mnuNotifyEvent=(Fl_Choice *)0; Fl_Input2 *inpNotifyRE=(Fl_Input2 *)0; Fl_Light_Button *btnNotifyEnabled=(Fl_Light_Button *)0; Fl_Group *grpNotifyFilter=(Fl_Group *)0; Fl_Round_Button *chkNotifyFilterCall=(Fl_Round_Button *)0; static void cb_chkNotifyFilterCall(Fl_Round_Button* o, void*) { if (!o->value()) { o->value(1); return; } inpNotifyFilterCall->show(); btnNotifyFilterDXCC->hide(); chkNotifyFilterDXCC->value(0); } Fl_Input2 *inpNotifyFilterCall=(Fl_Input2 *)0; Fl_Round_Button *chkNotifyFilterDXCC=(Fl_Round_Button *)0; static void cb_chkNotifyFilterDXCC(Fl_Round_Button* o, void*) { if (!o->value()) { o->value(1); return; } inpNotifyFilterCall->hide(); btnNotifyFilterDXCC->show(); chkNotifyFilterCall->value(0); } Fl_Button *btnNotifyFilterDXCC=(Fl_Button *)0; Fl_Check_Button *chkNotifyFilterNWB=(Fl_Check_Button *)0; Fl_Check_Button *chkNotifyFilterLOTW=(Fl_Check_Button *)0; Fl_Check_Button *chkNotifyFilterEQSL=(Fl_Check_Button *)0; Fl_Group *grpNotifyDup=(Fl_Group *)0; Fl_Check_Button *chkNotifyDupIgnore=(Fl_Check_Button *)0; Fl_Choice *mnuNotifyDupWhich=(Fl_Choice *)0; Fl_Spinner2 *cntNotifyDupTime=(Fl_Spinner2 *)0; Fl_Check_Button *chkNotifyDupBand=(Fl_Check_Button *)0; Fl_Check_Button *chkNotifyDupMode=(Fl_Check_Button *)0; Fl_Group *grpNotifyAction=(Fl_Group *)0; Fl_Spinner2 *cntNotifyActionLimit=(Fl_Spinner2 *)0; Fl_Input2 *inpNotifyActionDialog=(Fl_Input2 *)0; Fl_Button *btnNotifyActionDialogDefault=(Fl_Button *)0; Fl_Spinner2 *cntNotifyActionDialogTimeout=(Fl_Spinner2 *)0; Fl_Input2 *inpNotifyActionRXMarker=(Fl_Input2 *)0; Fl_Button *btnNotifyActionMarkerDefault=(Fl_Button *)0; Fl_Input2 *inpNotifyActionMacro=(Fl_Input2 *)0; Fl_Button *btnNotifyActionMacro=(Fl_Button *)0; Fl_Input2 *inpNotifyActionProgram=(Fl_Input2 *)0; Fl_Button *btnNotifyActionProgram=(Fl_Button *)0; Fl_Button *btnNotifyAdd=(Fl_Button *)0; Fl_Button *btnNotifyRemove=(Fl_Button *)0; Fl_Button *btnNotifyUpdate=(Fl_Button *)0; Fl_Button *btnNotifyTest=(Fl_Button *)0; Fl_Button *btnNotifyClose=(Fl_Button *)0; static void cb_btnNotifyClose(Fl_Button* o, void*) { o->window()->hide(); } Table *tblNotifyList=(Table *)0; Fl_Double_Window* make_notify_window() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(500, 550, _("Notifications")); w = o; { grpNotifyEvent = new Fl_Group(2, 2, 219, 126, _("Event")); grpNotifyEvent->box(FL_ENGRAVED_FRAME); grpNotifyEvent->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { mnuNotifyEvent = new Fl_Choice(10, 29, 205, 22); mnuNotifyEvent->down_box(FL_BORDER_BOX); } // Fl_Choice* mnuNotifyEvent { Fl_Input2* o = inpNotifyRE = new Fl_Input2(36, 61, 175, 23, _("RE:")); inpNotifyRE->box(FL_DOWN_BOX); inpNotifyRE->color(FL_BACKGROUND2_COLOR); inpNotifyRE->selection_color(FL_SELECTION_COLOR); inpNotifyRE->labeltype(FL_NORMAL_LABEL); inpNotifyRE->labelfont(0); inpNotifyRE->labelsize(14); inpNotifyRE->labelcolor(FL_FOREGROUND_COLOR); inpNotifyRE->align(Fl_Align(FL_ALIGN_LEFT)); inpNotifyRE->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyRE { btnNotifyEnabled = new Fl_Light_Button(131, 94, 80, 23, _("Enabled")); } // Fl_Light_Button* btnNotifyEnabled grpNotifyEvent->end(); } // Fl_Group* grpNotifyEvent { grpNotifyFilter = new Fl_Group(2, 130, 219, 176, _("Filter")); grpNotifyFilter->box(FL_ENGRAVED_FRAME); grpNotifyFilter->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkNotifyFilterCall = new Fl_Round_Button(12, 157, 80, 20, _("Callsign")); chkNotifyFilterCall->down_box(FL_ROUND_DOWN_BOX); chkNotifyFilterCall->callback((Fl_Callback*)cb_chkNotifyFilterCall); } // Fl_Round_Button* chkNotifyFilterCall { inpNotifyFilterCall = new Fl_Input2(131, 157, 80, 20); inpNotifyFilterCall->box(FL_DOWN_BOX); inpNotifyFilterCall->color(FL_BACKGROUND2_COLOR); inpNotifyFilterCall->selection_color(FL_SELECTION_COLOR); inpNotifyFilterCall->labeltype(FL_NORMAL_LABEL); inpNotifyFilterCall->labelfont(0); inpNotifyFilterCall->labelsize(14); inpNotifyFilterCall->labelcolor(FL_FOREGROUND_COLOR); inpNotifyFilterCall->align(Fl_Align(FL_ALIGN_CENTER)); inpNotifyFilterCall->when(FL_WHEN_RELEASE); } // Fl_Input2* inpNotifyFilterCall { chkNotifyFilterDXCC = new Fl_Round_Button(12, 186, 110, 20, _("DXCC entity")); chkNotifyFilterDXCC->down_box(FL_ROUND_DOWN_BOX); chkNotifyFilterDXCC->callback((Fl_Callback*)cb_chkNotifyFilterDXCC); } // Fl_Round_Button* chkNotifyFilterDXCC { btnNotifyFilterDXCC = new Fl_Button(183, 183, 28, 23); btnNotifyFilterDXCC->tooltip(_("Show DXCC entities")); } // Fl_Button* btnNotifyFilterDXCC { chkNotifyFilterNWB = new Fl_Check_Button(12, 216, 155, 20, _("Not worked before")); chkNotifyFilterNWB->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyFilterNWB { chkNotifyFilterLOTW = new Fl_Check_Button(12, 246, 100, 20, _("LotW user")); chkNotifyFilterLOTW->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyFilterLOTW { chkNotifyFilterEQSL = new Fl_Check_Button(12, 276, 100, 20, _("eQSL user")); chkNotifyFilterEQSL->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyFilterEQSL grpNotifyFilter->end(); } // Fl_Group* grpNotifyFilter { grpNotifyDup = new Fl_Group(2, 308, 219, 149, _("Duplicates")); grpNotifyDup->box(FL_ENGRAVED_FRAME); grpNotifyDup->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkNotifyDupIgnore = new Fl_Check_Button(12, 337, 145, 20, _("Ignore duplicates")); chkNotifyDupIgnore->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyDupIgnore { mnuNotifyDupWhich = new Fl_Choice(33, 367, 120, 20, _("in:")); mnuNotifyDupWhich->down_box(FL_BORDER_BOX); } // Fl_Choice* mnuNotifyDupWhich { Fl_Spinner2* o = cntNotifyDupTime = new Fl_Spinner2(93, 397, 60, 20, _("Time (s):")); cntNotifyDupTime->box(FL_NO_BOX); cntNotifyDupTime->color(FL_BACKGROUND_COLOR); cntNotifyDupTime->selection_color(FL_BACKGROUND_COLOR); cntNotifyDupTime->labeltype(FL_NORMAL_LABEL); cntNotifyDupTime->labelfont(0); cntNotifyDupTime->labelsize(14); cntNotifyDupTime->labelcolor(FL_FOREGROUND_COLOR); cntNotifyDupTime->minimum(0); cntNotifyDupTime->maximum(97200); cntNotifyDupTime->value(600); cntNotifyDupTime->align(Fl_Align(FL_ALIGN_LEFT)); cntNotifyDupTime->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntNotifyDupTime { chkNotifyDupBand = new Fl_Check_Button(12, 427, 65, 20, _("Band")); chkNotifyDupBand->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyDupBand { chkNotifyDupMode = new Fl_Check_Button(94, 427, 60, 20, _("Mode")); chkNotifyDupMode->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyDupMode grpNotifyDup->end(); } // Fl_Group* grpNotifyDup { grpNotifyAction = new Fl_Group(222, 2, 276, 394, _("Action")); grpNotifyAction->box(FL_ENGRAVED_FRAME); grpNotifyAction->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Spinner2* o = cntNotifyActionLimit = new Fl_Spinner2(232, 40, 52, 20, _("Trigger limit (s):")); cntNotifyActionLimit->tooltip(_("Minimum time between events")); cntNotifyActionLimit->box(FL_NO_BOX); cntNotifyActionLimit->color(FL_BACKGROUND_COLOR); cntNotifyActionLimit->selection_color(FL_BACKGROUND_COLOR); cntNotifyActionLimit->labeltype(FL_NORMAL_LABEL); cntNotifyActionLimit->labelfont(0); cntNotifyActionLimit->labelsize(14); cntNotifyActionLimit->labelcolor(FL_FOREGROUND_COLOR); cntNotifyActionLimit->minimum(0); cntNotifyActionLimit->maximum(3600); cntNotifyActionLimit->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntNotifyActionLimit->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntNotifyActionLimit { Fl_Input2* o = inpNotifyActionDialog = new Fl_Input2(232, 82, 218, 60, _("Show alert window:")); inpNotifyActionDialog->type(4); inpNotifyActionDialog->box(FL_DOWN_BOX); inpNotifyActionDialog->color(FL_BACKGROUND2_COLOR); inpNotifyActionDialog->selection_color(FL_SELECTION_COLOR); inpNotifyActionDialog->labeltype(FL_NORMAL_LABEL); inpNotifyActionDialog->labelfont(0); inpNotifyActionDialog->labelsize(14); inpNotifyActionDialog->labelcolor(FL_FOREGROUND_COLOR); inpNotifyActionDialog->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpNotifyActionDialog->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyActionDialog { btnNotifyActionDialogDefault = new Fl_Button(460, 100, 28, 23); btnNotifyActionDialogDefault->tooltip(_("Insert default text")); } // Fl_Button* btnNotifyActionDialogDefault { Fl_Spinner2* o = cntNotifyActionDialogTimeout = new Fl_Spinner2(232, 164, 52, 20, _("Hide window after (s):")); cntNotifyActionDialogTimeout->box(FL_NO_BOX); cntNotifyActionDialogTimeout->color(FL_BACKGROUND_COLOR); cntNotifyActionDialogTimeout->selection_color(FL_BACKGROUND_COLOR); cntNotifyActionDialogTimeout->labeltype(FL_NORMAL_LABEL); cntNotifyActionDialogTimeout->labelfont(0); cntNotifyActionDialogTimeout->labelsize(14); cntNotifyActionDialogTimeout->labelcolor(FL_FOREGROUND_COLOR); cntNotifyActionDialogTimeout->minimum(0); cntNotifyActionDialogTimeout->maximum(3600); cntNotifyActionDialogTimeout->value(5); cntNotifyActionDialogTimeout->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntNotifyActionDialogTimeout->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntNotifyActionDialogTimeout { Fl_Input2* o = inpNotifyActionRXMarker = new Fl_Input2(232, 205, 218, 60, _("Append to RX text:")); inpNotifyActionRXMarker->type(4); inpNotifyActionRXMarker->box(FL_DOWN_BOX); inpNotifyActionRXMarker->color(FL_BACKGROUND2_COLOR); inpNotifyActionRXMarker->selection_color(FL_SELECTION_COLOR); inpNotifyActionRXMarker->labeltype(FL_NORMAL_LABEL); inpNotifyActionRXMarker->labelfont(0); inpNotifyActionRXMarker->labelsize(14); inpNotifyActionRXMarker->labelcolor(FL_FOREGROUND_COLOR); inpNotifyActionRXMarker->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpNotifyActionRXMarker->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyActionRXMarker { btnNotifyActionMarkerDefault = new Fl_Button(460, 223, 28, 23); btnNotifyActionMarkerDefault->tooltip(_("Insert default text")); } // Fl_Button* btnNotifyActionMarkerDefault { Fl_Input2* o = inpNotifyActionMacro = new Fl_Input2(232, 287, 218, 60, _("Append to TX text:")); inpNotifyActionMacro->type(4); inpNotifyActionMacro->box(FL_DOWN_BOX); inpNotifyActionMacro->color(FL_BACKGROUND2_COLOR); inpNotifyActionMacro->selection_color(FL_SELECTION_COLOR); inpNotifyActionMacro->labeltype(FL_NORMAL_LABEL); inpNotifyActionMacro->labelfont(0); inpNotifyActionMacro->labelsize(14); inpNotifyActionMacro->labelcolor(FL_FOREGROUND_COLOR); inpNotifyActionMacro->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpNotifyActionMacro->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyActionMacro { btnNotifyActionMacro = new Fl_Button(460, 305, 28, 23); btnNotifyActionMacro->tooltip(_("Show macro editor")); } // Fl_Button* btnNotifyActionMacro { Fl_Input2* o = inpNotifyActionProgram = new Fl_Input2(232, 368, 218, 23, _("Run program:")); inpNotifyActionProgram->box(FL_DOWN_BOX); inpNotifyActionProgram->color(FL_BACKGROUND2_COLOR); inpNotifyActionProgram->selection_color(FL_SELECTION_COLOR); inpNotifyActionProgram->labeltype(FL_NORMAL_LABEL); inpNotifyActionProgram->labelfont(0); inpNotifyActionProgram->labelsize(14); inpNotifyActionProgram->labelcolor(FL_FOREGROUND_COLOR); inpNotifyActionProgram->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpNotifyActionProgram->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyActionProgram { btnNotifyActionProgram = new Fl_Button(460, 368, 28, 23); } // Fl_Button* btnNotifyActionProgram grpNotifyAction->end(); } // Fl_Group* grpNotifyAction { btnNotifyAdd = new Fl_Button(223, 402, 90, 23); } // Fl_Button* btnNotifyAdd { btnNotifyRemove = new Fl_Button(316, 402, 90, 23); } // Fl_Button* btnNotifyRemove { btnNotifyUpdate = new Fl_Button(223, 431, 90, 23); } // Fl_Button* btnNotifyUpdate { btnNotifyTest = new Fl_Button(316, 431, 90, 23); } // Fl_Button* btnNotifyTest { btnNotifyClose = new Fl_Button(408, 431, 90, 23); btnNotifyClose->callback((Fl_Callback*)cb_btnNotifyClose); } // Fl_Button* btnNotifyClose { tblNotifyList = new Table(2, 460, 496, 88); tblNotifyList->box(FL_UP_FRAME); tblNotifyList->color(FL_BACKGROUND_COLOR); tblNotifyList->selection_color(FL_SELECTION_COLOR); tblNotifyList->labeltype(FL_NORMAL_LABEL); tblNotifyList->labelfont(0); tblNotifyList->labelsize(14); tblNotifyList->labelcolor(FL_FOREGROUND_COLOR); tblNotifyList->align(Fl_Align(FL_ALIGN_CENTER)); tblNotifyList->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(tblNotifyList); } // Table* tblNotifyList o->size_range(500, 550); o->end(); } // Fl_Double_Window* o return w; } Table *tblNotifyFilterDXCC=(Table *)0; Fl_Input2 *inpNotifyDXCCSearchCountry=(Fl_Input2 *)0; Fl_Input2 *inpNotifyDXCCSearchCallsign=(Fl_Input2 *)0; Fl_Button *btnNotifyDXCCSelect=(Fl_Button *)0; Fl_Button *btnNotifyDXCCDeselect=(Fl_Button *)0; Fl_Button *btnNotifyDXCCClose=(Fl_Button *)0; static void cb_btnNotifyDXCCClose(Fl_Button* o, void*) { o->window()->hide(); } Fl_Double_Window* make_dxcc_window() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(435, 450, _("DXCC entities")); w = o; { tblNotifyFilterDXCC = new Table(2, 2, 432, 370); tblNotifyFilterDXCC->box(FL_UP_FRAME); tblNotifyFilterDXCC->color(FL_BACKGROUND2_COLOR); tblNotifyFilterDXCC->selection_color(FL_SELECTION_COLOR); tblNotifyFilterDXCC->labeltype(FL_NORMAL_LABEL); tblNotifyFilterDXCC->labelfont(0); tblNotifyFilterDXCC->labelsize(14); tblNotifyFilterDXCC->labelcolor(FL_FOREGROUND_COLOR); tblNotifyFilterDXCC->align(Fl_Align(FL_ALIGN_CENTER)); tblNotifyFilterDXCC->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(tblNotifyFilterDXCC); } // Table* tblNotifyFilterDXCC { Fl_Input2* o = inpNotifyDXCCSearchCountry = new Fl_Input2(104, 382, 120, 23, _("Find country:")); inpNotifyDXCCSearchCountry->tooltip(_("Press return to continue the search")); inpNotifyDXCCSearchCountry->box(FL_DOWN_BOX); inpNotifyDXCCSearchCountry->color(FL_BACKGROUND2_COLOR); inpNotifyDXCCSearchCountry->selection_color(FL_SELECTION_COLOR); inpNotifyDXCCSearchCountry->labeltype(FL_NORMAL_LABEL); inpNotifyDXCCSearchCountry->labelfont(0); inpNotifyDXCCSearchCountry->labelsize(14); inpNotifyDXCCSearchCountry->labelcolor(FL_FOREGROUND_COLOR); inpNotifyDXCCSearchCountry->align(Fl_Align(FL_ALIGN_LEFT)); inpNotifyDXCCSearchCountry->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyDXCCSearchCountry { Fl_Input2* o = inpNotifyDXCCSearchCallsign = new Fl_Input2(104, 415, 120, 23, _("Find prefix:")); inpNotifyDXCCSearchCallsign->box(FL_DOWN_BOX); inpNotifyDXCCSearchCallsign->color(FL_BACKGROUND2_COLOR); inpNotifyDXCCSearchCallsign->selection_color(FL_SELECTION_COLOR); inpNotifyDXCCSearchCallsign->labeltype(FL_NORMAL_LABEL); inpNotifyDXCCSearchCallsign->labelfont(0); inpNotifyDXCCSearchCallsign->labelsize(14); inpNotifyDXCCSearchCallsign->labelcolor(FL_FOREGROUND_COLOR); inpNotifyDXCCSearchCallsign->align(Fl_Align(FL_ALIGN_LEFT)); inpNotifyDXCCSearchCallsign->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyDXCCSearchCallsign { btnNotifyDXCCSelect = new Fl_Button(234, 382, 90, 23); } // Fl_Button* btnNotifyDXCCSelect { btnNotifyDXCCDeselect = new Fl_Button(234, 415, 90, 23); } // Fl_Button* btnNotifyDXCCDeselect { btnNotifyDXCCClose = new Fl_Button(334, 415, 90, 23); btnNotifyDXCCClose->callback((Fl_Callback*)cb_btnNotifyDXCCClose); } // Fl_Button* btnNotifyDXCCClose o->size_range(300, 400); o->end(); } // Fl_Double_Window* o return w; } fldigi-3.21.80/src/dialogs/record_browse.cxx0000664000175000017500000000446012313150713015642 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0302 #include "gettext.h" #include "record_browse.h" #include Fl_Group *tabDataFiles=(Fl_Group *)0; Fl_Input_Choice *inpDataSources=(Fl_Input_Choice *)0; Fl_Light_Button *btnDataSourceUpdate=(Fl_Light_Button *)0; static void cb_btnDataSourceUpdate(Fl_Light_Button*, void*) { DerivedRecordLst::cbGuiUpdate(); } Fl_Button *btnDataSourceReset=(Fl_Button *)0; static void cb_btnDataSourceReset(Fl_Button*, void*) { DerivedRecordLst::cbGuiReset(); } Fl_Double_Window* make_record_loader_window() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(540, 280, _("Data files sources")); w = o; o->tooltip(_("Data files update")); { tabDataFiles = new Fl_Group(5, 25, 570, 275); tabDataFiles->tooltip(_("Tabular data sources")); { DerivedRecordLst* o = new DerivedRecordLst(6, 25, 529, 217, _("Data files sources")); o->box(FL_THIN_DOWN_FRAME); o->color(FL_BACKGROUND_COLOR); o->selection_color(FL_BACKGROUND_COLOR); o->labeltype(FL_NO_LABEL); o->labelfont(0); o->labelsize(14); o->labelcolor(FL_FOREGROUND_COLOR); o->align(Fl_Align(FL_ALIGN_TOP)); o->when(FL_WHEN_RELEASE); o->end(); Fl_Group::current()->resizable(o); } // DerivedRecordLst* o { inpDataSources = new Fl_Input_Choice(6, 254, 284, 21, _("Data source")); inpDataSources->tooltip(_("Data files repository")); inpDataSources->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Input_Choice* inpDataSources { btnDataSourceUpdate = new Fl_Light_Button(387, 254, 74, 20, _("Update")); btnDataSourceUpdate->tooltip(_("Update selected local data files with repository content")); btnDataSourceUpdate->callback((Fl_Callback*)cb_btnDataSourceUpdate); } // Fl_Light_Button* btnDataSourceUpdate { btnDataSourceReset = new Fl_Button(465, 254, 70, 20, _("Reset")); btnDataSourceReset->tooltip(_("Delete local data files if selected.")); btnDataSourceReset->callback((Fl_Callback*)cb_btnDataSourceReset); } // Fl_Button* btnDataSourceReset tabDataFiles->end(); Fl_Group::current()->resizable(tabDataFiles); } // Fl_Group* tabDataFiles o->end(); } // Fl_Double_Window* o return w; } fldigi-3.21.80/src/dialogs/notifydialog.fl0000664000175000017500000001435012313064025015271 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0110 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include } {} decl {\#include "table.h"} {public global } decl {\#include "flinput2.h"} {public global } decl {\#include "flslider2.h"} {public global } decl {\#include "notify.h"} {} Function {make_notify_window()} {open } { Fl_Window {} { label Notifications open xywh {671 315 500 550} type Double resizable size_range {500 550 0 0} visible } { Fl_Group grpNotifyEvent { label Event open xywh {2 2 219 126} box ENGRAVED_FRAME align 21 } { Fl_Choice mnuNotifyEvent {open xywh {10 29 205 22} down_box BORDER_BOX } {} Fl_Input inpNotifyRE { label {RE:} selected xywh {36 61 175 23} code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Light_Button btnNotifyEnabled { label Enabled xywh {131 94 80 23} } } Fl_Group grpNotifyFilter { label Filter open xywh {2 130 219 176} box ENGRAVED_FRAME align 21 } { Fl_Round_Button chkNotifyFilterCall { label Callsign callback {if (!o->value()) { o->value(1); return; } inpNotifyFilterCall->show(); btnNotifyFilterDXCC->hide(); chkNotifyFilterDXCC->value(0);} xywh {12 157 80 20} down_box ROUND_DOWN_BOX } Fl_Input inpNotifyFilterCall { xywh {131 157 80 20} align 0 class Fl_Input2 } Fl_Round_Button chkNotifyFilterDXCC { label {DXCC entity} callback {if (!o->value()) { o->value(1); return; } inpNotifyFilterCall->hide(); btnNotifyFilterDXCC->show(); chkNotifyFilterCall->value(0);} xywh {12 186 110 20} down_box ROUND_DOWN_BOX } Fl_Button btnNotifyFilterDXCC { tooltip {Show DXCC entities} xywh {183 183 28 23} } Fl_Check_Button chkNotifyFilterNWB { label {Not worked before} xywh {12 216 155 20} down_box DOWN_BOX } Fl_Check_Button chkNotifyFilterLOTW { label {LotW user} xywh {12 246 100 20} down_box DOWN_BOX } Fl_Check_Button chkNotifyFilterEQSL { label {eQSL user} xywh {12 276 100 20} down_box DOWN_BOX } } Fl_Group grpNotifyDup { label Duplicates xywh {2 308 219 149} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkNotifyDupIgnore { label {Ignore duplicates} xywh {12 337 145 20} down_box DOWN_BOX } Fl_Choice mnuNotifyDupWhich { label {in:} open xywh {33 367 120 20} down_box BORDER_BOX } {} Fl_Spinner cntNotifyDupTime { label {Time (s):} xywh {93 397 60 20} minimum 0 maximum 97200 value 600 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Check_Button chkNotifyDupBand { label Band xywh {12 427 65 20} down_box DOWN_BOX } Fl_Check_Button chkNotifyDupMode { label Mode xywh {94 427 60 20} down_box DOWN_BOX } } Fl_Group grpNotifyAction { label Action open xywh {222 2 276 394} box ENGRAVED_FRAME align 21 } { Fl_Spinner cntNotifyActionLimit { label {Trigger limit (s):} tooltip {Minimum time between events} xywh {232 40 52 20} align 5 minimum 0 maximum 3600 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Input inpNotifyActionDialog { label {Show alert window:} xywh {232 82 218 60} type Multiline align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyActionDialogDefault { tooltip {Insert default text} xywh {460 100 28 23} } Fl_Spinner cntNotifyActionDialogTimeout { label {Hide window after (s):} xywh {232 164 52 20} align 5 minimum 0 maximum 3600 value 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Input inpNotifyActionRXMarker { label {Append to RX text:} xywh {232 205 218 60} type Multiline align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyActionMarkerDefault { tooltip {Insert default text} xywh {460 223 28 23} } Fl_Input inpNotifyActionMacro { label {Append to TX text:} xywh {232 287 218 60} type Multiline align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyActionMacro { tooltip {Show macro editor} xywh {460 305 28 23} } Fl_Input inpNotifyActionProgram { label {Run program:} xywh {232 368 218 23} align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyActionProgram { xywh {460 368 28 23} } } Fl_Button btnNotifyAdd { xywh {223 402 90 23} } Fl_Button btnNotifyRemove { xywh {316 402 90 23} } Fl_Button btnNotifyUpdate { xywh {223 431 90 23} } Fl_Button btnNotifyTest { xywh {316 431 90 23} } Fl_Button btnNotifyClose { callback {o->window()->hide();} xywh {408 431 90 23} } Fl_Box tblNotifyList { xywh {2 460 496 88} box UP_FRAME selection_color 15 resizable class Table } } } Function {make_dxcc_window()} {open } { Fl_Window {} { label {DXCC entities} open xywh {618 147 435 450} type Double hide resizable size_range {300 400 0 0} } { Fl_Box tblNotifyFilterDXCC { xywh {2 2 432 370} box UP_FRAME color 7 selection_color 15 resizable class Table } Fl_Input inpNotifyDXCCSearchCountry { label {Find country:} tooltip {Press return to continue the search} xywh {104 382 120 23} code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpNotifyDXCCSearchCallsign { label {Find prefix:} xywh {104 415 120 23} code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyDXCCSelect { xywh {234 382 90 23} } Fl_Button btnNotifyDXCCDeselect { xywh {234 415 90 23} } Fl_Button btnNotifyDXCCClose { callback {o->window()->hide();} xywh {334 415 90 23} } } } fldigi-3.21.80/src/dialogs/confdialog.cxx0000664000175000017500000160266512313150713015124 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0302 #include "gettext.h" #include "confdialog.h" #include #include #include #include #include #include #include "main.h" #include "fl_digi.h" #include "Viewer.h" #include "soundconf.h" #include "waterfall.h" #include "rigxml.h" #include "lookupcall.h" #include "icons.h" #include "Viewer.h" #include "pskrep.h" #include "logsupport.h" #include "notify.h" #include "debug.h" #include "status.h" #include "rx_extract.h" #include "kmlserver.h" extern void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata); #if USE_HAMLIB #include "hamlib.h" #endif Fl_Double_Window *dlgConfig; Mode_Browser* mode_browser; static void choose_color(Fl_Color & c) { unsigned char r, g, b; Fl::get_color(c, r, g, b); if (fl_color_chooser("Font color", r, g, b)) c = fl_rgb_color(r, g, b); } static void adjust_label(Fl_Widget* w) { w->labelcolor(fl_contrast(w->labelcolor(), w->color())); } static void cbRxFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); RxText->textfont(font); RxText->textsize(size); RxText->textcolor(color); RxText->redraw(); progdefaults.RxFontnbr = font; progdefaults.RxFontsize = size; progdefaults.RxFontcolor = color; ReceiveText->setFont(font); ReceiveText->setFontSize(size); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); font_browser->hide(); progdefaults.changed = true; } static void cbTxFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); TxText->textfont(font); TxText->textsize(size); TxText->textcolor(color); TxText->redraw(); progdefaults.TxFontnbr = font; progdefaults.TxFontsize = size; progdefaults.TxFontcolor = color; TransmitText->setFont(font); TransmitText->setFontSize(size); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); font_browser->hide(); progdefaults.changed = true; } void cbWaterfallFontBrowser(Fl_Widget*, void*) { Fl_Font fnt = font_browser->fontNumber(); int size = font_browser->fontSize(); progdefaults.WaterfallFontnbr = fnt; progdefaults.WaterfallFontsize = size; progdefaults.changed = true; font_browser->hide(); } void cbViewerFontBrowser(Fl_Widget*, void*) { progdefaults.ViewerFontnbr = font_browser->fontNumber(); progdefaults.ViewerFontsize = font_browser->fontSize(); initViewer(); progdefaults.changed = true; font_browser->hide(); } void cbFreqControlFontBrowser(Fl_Widget*, void*) { Fl_Font fnt = font_browser->fontNumber(); progdefaults.FreqControlFontnbr = fnt; progdefaults.changed = true; FDdisplay->labelfont(progdefaults.FreqControlFontnbr); FDdisplay->redraw(); qsoFreqDisp1->font(progdefaults.FreqControlFontnbr); qsoFreqDisp2->font(progdefaults.FreqControlFontnbr); qsoFreqDisp3->font(progdefaults.FreqControlFontnbr); qsoFreqDisp1->redraw(); qsoFreqDisp2->redraw(); qsoFreqDisp3->redraw(); font_browser->hide(); } static void cbLOGGINGFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.LOGGINGtextfont = font; progdefaults.LOGGINGtextsize = size; progdefaults.LOGGINGtextcolor = color; LOGGINGdisplay->textsize(size); LOGGINGdisplay->textcolor(color); LOGGINGdisplay->textfont(font); LOGGINGdisplay->redraw(); LOGGING_colors_font(); font_browser->hide(); progdefaults.changed = true; } static void cbLOGBOOKFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.LOGBOOKtextfont = font; progdefaults.LOGBOOKtextsize = size; progdefaults.LOGBOOKtextcolor = color; LOGBOOKdisplay->textsize(size); LOGBOOKdisplay->textcolor(color); LOGBOOKdisplay->textfont(font); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); font_browser->hide(); progdefaults.changed = true; } void set_qrzxml_buttons(Fl_Button* b) { Fl_Button* qrzbxml[] = { btnQRZXMLnotavailable, btnQRZcdrom, btnQRZsub, btnHamcall, btnCALLOOK, btnHamQTH}; for (size_t i = 0; i < sizeof(qrzbxml)/sizeof(*qrzbxml); i++) qrzbxml[i]->value(b == qrzbxml[i]); } void set_qrzweb_buttons(Fl_Button* b) { Fl_Button* qrzbweb[] = { btnQRZWEBnotavailable, btnQRZonline, btnHAMCALLonline, btnHamQTHonline }; for (size_t i = 0; i < sizeof(qrzbweb)/sizeof(*qrzbweb); i++) qrzbweb[i]->value(b == qrzbweb[i]); } Fl_Tabs *tabsConfigure=(Fl_Tabs *)0; Fl_Group *tabOperator=(Fl_Group *)0; static void cb_tabOperator(Fl_Group*, void*) { progdefaults.changed = true; } Fl_Input2 *inpMyCallsign=(Fl_Input2 *)0; static void cb_inpMyCallsign(Fl_Input2* o, void*) { if (progdefaults.THORsecText.empty()) { progdefaults.THORsecText = o->value(); progdefaults.THORsecText.append(" "); txtTHORSecondary->value(progdefaults.THORsecText.c_str()); } if (progdefaults.secText.empty()) { progdefaults.secText = o->value(); progdefaults.secText.append(" "); txtSecondary->value(progdefaults.secText.c_str()); } progdefaults.myCall = o->value(); update_main_title(); notify_change_callsign(); progdefaults.changed = true; } Fl_Input2 *inpMyName=(Fl_Input2 *)0; static void cb_inpMyName(Fl_Input2* o, void*) { progdefaults.myName = o->value(); progdefaults.changed = true; } Fl_Input2 *inpMyQth=(Fl_Input2 *)0; static void cb_inpMyQth(Fl_Input2* o, void*) { progdefaults.myQth = o->value(); progdefaults.changed = true; } Fl_Input2 *inpMyLocator=(Fl_Input2 *)0; static void cb_inpMyLocator(Fl_Input2* o, void*) { progdefaults.myLocator = o->value(); progdefaults.changed = true; } Fl_Input2 *inpMyAntenna=(Fl_Input2 *)0; static void cb_inpMyAntenna(Fl_Input2* o, void*) { progdefaults.myAntenna = o->value(); progdefaults.changed = true; } Fl_Group *grpNoise=(Fl_Group *)0; Fl_Check_Button *btnNoiseOn=(Fl_Check_Button *)0; static void cb_btnNoiseOn(Fl_Check_Button* o, void*) { progdefaults.noise = o->value(); } Fl_Counter2 *noiseDB=(Fl_Counter2 *)0; static void cb_noiseDB(Fl_Counter2* o, void*) { progdefaults.s2n = o->value(); } Fl_Group *tabUI=(Fl_Group *)0; Fl_Tabs *tabsUI=(Fl_Tabs *)0; Fl_Group *tabBrowser=(Fl_Group *)0; Fl_Spinner2 *cntChannels=(Fl_Spinner2 *)0; static void cb_cntChannels(Fl_Spinner2* o, void*) { progdefaults.VIEWERchannels = (int)(o->value()); initViewer(); } Fl_Spinner2 *cntTimeout=(Fl_Spinner2 *)0; static void cb_cntTimeout(Fl_Spinner2* o, void*) { progdefaults.VIEWERtimeout = (int)(o->value()); progdefaults.changed = true; } Fl_ListBox *listboxViewerLabel=(Fl_ListBox *)0; static void cb_listboxViewerLabel(Fl_ListBox* o, void*) { progdefaults.VIEWERlabeltype = o->index(); initViewer(); progdefaults.changed = true; } Fl_Button *btnViewerFont=(Fl_Button *)0; static void cb_btnViewerFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.ViewerFontnbr); font_browser->fontSize(progdefaults.ViewerFontsize); font_browser->fontColor(FL_FOREGROUND_COLOR); font_browser->fontFilter(Font_Browser::FIXED_WIDTH); font_browser->callback(cbViewerFontBrowser); font_browser->show(); } Fl_Check_Button *btnFixedIntervals=(Fl_Check_Button *)0; static void cb_btnFixedIntervals(Fl_Check_Button* o, void*) { progdefaults.VIEWERfixed = o->value(); progdefaults.changed = true; initViewer(); } Fl_Check_Button *btnMarquee=(Fl_Check_Button *)0; static void cb_btnMarquee(Fl_Check_Button* o, void*) { progdefaults.VIEWERmarquee = o->value(); progdefaults.changed = true; initViewer(); } Fl_Check_Button *btnAscend=(Fl_Check_Button *)0; static void cb_btnAscend(Fl_Check_Button* o, void*) { progdefaults.VIEWERascend = o->value(); progdefaults.changed = true; initViewer(); } Fl_Check_Button *btnBrowserHistory=(Fl_Check_Button *)0; static void cb_btnBrowserHistory(Fl_Check_Button* o, void*) { progdefaults.VIEWERhistory = o->value(); progdefaults.changed = true; } Fl_Button *bwsrSliderColor=(Fl_Button *)0; static void cb_bwsrSliderColor(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.bwsrSliderColor.R; g = progdefaults.bwsrSliderColor.G; b = progdefaults.bwsrSliderColor.B; if (fl_color_chooser("Slider Color", r, g, b) == 0) return; progdefaults.bwsrSliderColor.R = r; progdefaults.bwsrSliderColor.G = g; progdefaults.bwsrSliderColor.B = b; o->color(fl_rgb_color(r,g,b)); o->redraw(); sldrViewerSquelch->color(fl_rgb_color(r,g,b)); sldrViewerSquelch->redraw(); mvsquelch->color(fl_rgb_color(r,g,b)); mvsquelch->redraw(); progdefaults.changed = true; } Fl_Button *bwsrSldrSelColor=(Fl_Button *)0; static void cb_bwsrSldrSelColor(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.bwsrSldrSelColor.R; g = progdefaults.bwsrSldrSelColor.G; b = progdefaults.bwsrSldrSelColor.B; if (fl_color_chooser("Button Color", r, g, b) == 0) return; progdefaults.bwsrSldrSelColor.R = r; progdefaults.bwsrSldrSelColor.G = g; progdefaults.bwsrSldrSelColor.B = b; o->color(fl_rgb_color(r,g,b)); o->redraw(); sldrViewerSquelch->selection_color(fl_rgb_color(r,g,b)); sldrViewerSquelch->redraw(); mvsquelch->selection_color(fl_rgb_color(r,g,b)); mvsquelch->redraw(); progdefaults.changed = true; } Fl_Button *bwsrHiLite_1_color=(Fl_Button *)0; static void cb_bwsrHiLite_1_color(Fl_Button*, void*) { progdefaults.bwsrHiLight1 = fl_show_colormap((Fl_Color)progdefaults.bwsrHiLight1); bwsrHiLite_1_color->color((Fl_Color)progdefaults.bwsrHiLight1); viewer_redraw(); progdefaults.changed = true; } Fl_Button *bwsrHiLite_2_color=(Fl_Button *)0; static void cb_bwsrHiLite_2_color(Fl_Button*, void*) { progdefaults.bwsrHiLight2 = fl_show_colormap((Fl_Color)progdefaults.bwsrHiLight2); bwsrHiLite_2_color->color((Fl_Color)progdefaults.bwsrHiLight2); viewer_redraw(); progdefaults.changed = true; } Fl_Button *bwsrHiLite_even_lines=(Fl_Button *)0; static void cb_bwsrHiLite_even_lines(Fl_Button*, void*) { progdefaults.bwsrBackgnd2 = fl_show_colormap((Fl_Color)progdefaults.bwsrBackgnd2); bwsrHiLite_even_lines->color((Fl_Color)progdefaults.bwsrBackgnd2); viewer_redraw(); progdefaults.changed = true;; } Fl_Button *bwsrHiLite_odd_lines=(Fl_Button *)0; static void cb_bwsrHiLite_odd_lines(Fl_Button*, void*) { progdefaults.bwsrBackgnd1 = fl_show_colormap((Fl_Color)progdefaults.bwsrBackgnd1); bwsrHiLite_odd_lines->color((Fl_Color)progdefaults.bwsrBackgnd1); viewer_redraw(); progdefaults.changed = true; } Fl_Button *bwsrHiLite_select=(Fl_Button *)0; static void cb_bwsrHiLite_select(Fl_Button*, void*) { progdefaults.bwsrSelect = fl_show_colormap((Fl_Color)progdefaults.bwsrSelect); bwsrHiLite_select->color((Fl_Color)progdefaults.bwsrSelect); viewer_redraw(); progdefaults.changed = true; } Fl_Group *tabContest=(Fl_Group *)0; Fl_Box *lblSend=(Fl_Box *)0; Fl_Input2 *inpSend1=(Fl_Input2 *)0; static void cb_inpSend1(Fl_Input2* o, void*) { progdefaults.myXchg=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn599=(Fl_Check_Button *)0; static void cb_btn599(Fl_Check_Button* o, void*) { progdefaults.fixed599 = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCutNbrs=(Fl_Check_Button *)0; static void cb_btnCutNbrs(Fl_Check_Button* o, void*) { progdefaults.cutnbrs=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnUseLeadingZeros=(Fl_Check_Button *)0; static void cb_btnUseLeadingZeros(Fl_Check_Button* o, void*) { progdefaults.UseLeadingZeros = o->value(); progdefaults.changed = true; } Fl_Value_Input2 *nbrContestStart=(Fl_Value_Input2 *)0; static void cb_nbrContestStart(Fl_Value_Input2* o, void*) { progdefaults.ContestStart = (int)o->value(); progdefaults.changed = true; } Fl_Value_Input2 *nbrContestDigits=(Fl_Value_Input2 *)0; static void cb_nbrContestDigits(Fl_Value_Input2* o, void*) { progdefaults.ContestDigits = (int)o->value(); progdefaults.changed = true; } Fl_Button *btnResetSerNbr=(Fl_Button *)0; static void cb_btnResetSerNbr(Fl_Button*, void*) { cb_ResetSerNbr(); } Fl_Light_Button *btnDupCheckOn=(Fl_Light_Button *)0; static void cb_btnDupCheckOn(Fl_Light_Button* o, void*) { progdefaults.EnableDupCheck = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDupBand=(Fl_Check_Button *)0; static void cb_btnDupBand(Fl_Check_Button* o, void*) { progdefaults.dupband = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDupMode=(Fl_Check_Button *)0; static void cb_btnDupMode(Fl_Check_Button* o, void*) { progdefaults.dupmode = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDupState=(Fl_Check_Button *)0; static void cb_btnDupState(Fl_Check_Button* o, void*) { progdefaults.dupstate = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDupXchg1=(Fl_Check_Button *)0; static void cb_btnDupXchg1(Fl_Check_Button* o, void*) { progdefaults.dupxchg1 = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDupTimeSpan=(Fl_Check_Button *)0; static void cb_btnDupTimeSpan(Fl_Check_Button* o, void*) { progdefaults.duptimespan=(int)o->value(); progdefaults.changed = true; } Fl_Value_Input2 *nbrTimeSpan=(Fl_Value_Input2 *)0; static void cb_nbrTimeSpan(Fl_Value_Input2* o, void*) { progdefaults.timespan = (int)o->value(); progdefaults.changed = true; } Fl_Button *btnDupColor=(Fl_Button *)0; static void cb_btnDupColor(Fl_Button* o, void*) { fl_color_chooser("Dup Check", progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B); o->color( fl_rgb_color( progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B)); o->redraw(); progdefaults.changed = true; } Fl_Group *tabUserInterface=(Fl_Group *)0; Fl_Check_Button *btnShowTooltips=(Fl_Check_Button *)0; static void cb_btnShowTooltips(Fl_Check_Button* o, void*) { progdefaults.tooltips = o->value(); Fl_Tooltip::enable(progdefaults.tooltips); progdefaults.changed = true; } Fl_Check_Button *chkMenuIcons=(Fl_Check_Button *)0; static void cb_chkMenuIcons(Fl_Check_Button* o, void*) { progdefaults.menuicons = o->value(); toggle_icon_labels(); progdefaults.changed = true; } Fl_ListBox *listboxScheme=(Fl_ListBox *)0; static void cb_listboxScheme(Fl_ListBox* o, void*) { progdefaults.ui_scheme = o->value(); Fl::scheme(progdefaults.ui_scheme.c_str()); progdefaults.changed = true; } Fl_Button *bVisibleModes=(Fl_Button *)0; static void cb_bVisibleModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(toggle_visible_modes); mode_browser->show(&progdefaults.visible_modes); progdefaults.changed = true; } Fl_ListBox *listbox_language=(Fl_ListBox *)0; static void cb_listbox_language(Fl_ListBox* o, void*) { progdefaults.ui_language = o->index(); progdefaults.changed = true; } Fl_Check_Button *btn_rx_lowercase=(Fl_Check_Button *)0; static void cb_btn_rx_lowercase(Fl_Check_Button* o, void*) { progdefaults.rx_lowercase = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_tx_lowercase=(Fl_Check_Button *)0; static void cb_btn_tx_lowercase(Fl_Check_Button* o, void*) { progdefaults.tx_lowercase = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_save_config_on_exit=(Fl_Check_Button *)0; static void cb_btn_save_config_on_exit(Fl_Check_Button* o, void*) { progdefaults.SaveConfig = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn2_save_macros_on_exit=(Fl_Check_Button *)0; static void cb_btn2_save_macros_on_exit(Fl_Check_Button* o, void*) { btn_save_macros_on_exit->value(o->value()); progdefaults.SaveMacros = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn2NagMe=(Fl_Check_Button *)0; static void cb_btn2NagMe(Fl_Check_Button* o, void*) { btnNagMe->value(o->value()); progdefaults.NagMe=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn2_confirm_exit=(Fl_Check_Button *)0; static void cb_btn2_confirm_exit(Fl_Check_Button* o, void*) { btn2_confirm_exit->value(o->value()); progdefaults.confirmExit=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_check_for_updates=(Fl_Check_Button *)0; static void cb_btn_check_for_updates(Fl_Check_Button* o, void*) { progdefaults.check_for_updates = o->value(); progdefaults.changed = true; } Fl_Group *tabLogServer=(Fl_Group *)0; Fl_Input *xmllogServerAddress=(Fl_Input *)0; static void cb_xmllogServerAddress(Fl_Input* o, void*) { progdefaults.xmllog_address = o->value(); } Fl_Input *xmllogServerPort=(Fl_Input *)0; static void cb_xmllogServerPort(Fl_Input* o, void*) { progdefaults.xmllog_port = o->value(); } Fl_Button *btn_reconnect_log_server=(Fl_Button *)0; static void cb_btn_reconnect_log_server(Fl_Button*, void*) { progdefaults.xml_logbook = true; connect_to_log_server(); } Fl_Check_Button *btnNagMe=(Fl_Check_Button *)0; static void cb_btnNagMe(Fl_Check_Button* o, void*) { btn2NagMe->value(o->value()); progdefaults.NagMe=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnClearOnSave=(Fl_Check_Button *)0; static void cb_btnClearOnSave(Fl_Check_Button* o, void*) { progdefaults.ClearOnSave=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCallUpperCase=(Fl_Check_Button *)0; static void cb_btnCallUpperCase(Fl_Check_Button* o, void*) { progdefaults.calluppercase = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnAutoFillQSO=(Fl_Check_Button *)0; static void cb_btnAutoFillQSO(Fl_Check_Button* o, void*) { progdefaults.autofill_qso_fields = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDateTimeSort=(Fl_Check_Button *)0; static void cb_btnDateTimeSort(Fl_Check_Button* o, void*) { progdefaults.sort_date_time_off = o->value(); progdefaults.changed = true; reload_browser(); } Fl_Check_Button *btndate_time_force=(Fl_Check_Button *)0; static void cb_btndate_time_force(Fl_Check_Button* o, void*) { progdefaults.force_date_time = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnRSTindefault=(Fl_Check_Button *)0; static void cb_btnRSTindefault(Fl_Check_Button* o, void*) { progdefaults.RSTin_default = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnRSTdefault=(Fl_Check_Button *)0; static void cb_btnRSTdefault(Fl_Check_Button* o, void*) { progdefaults.RSTdefault = o->value(); progdefaults.changed = true; } Fl_Input2 *txt_cty_dat_pathname=(Fl_Input2 *)0; static void cb_txt_cty_dat_pathname(Fl_Input2* o, void*) { progdefaults.cty_dat_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_cty_dat=(Fl_Button *)0; static void cb_btn_select_cty_dat(Fl_Button*, void*) { select_cty_dat_pathname(); } Fl_Button *btn_default_cty_dat=(Fl_Button *)0; static void cb_btn_default_cty_dat(Fl_Button*, void*) { default_cty_dat_pathname(); } Fl_Button *btn_reload_cty_dat=(Fl_Button *)0; static void cb_btn_reload_cty_dat(Fl_Button*, void*) { reload_cty_dat(); } Fl_Input2 *inpMyPower=(Fl_Input2 *)0; static void cb_inpMyPower(Fl_Input2* o, void*) { progdefaults.mytxpower = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnRXClicks=(Fl_Check_Button *)0; static void cb_btnRXClicks(Fl_Check_Button* o, void*) { progdefaults.rxtext_clicks_qso_data = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnRXTooltips=(Fl_Check_Button *)0; static void cb_btnRXTooltips(Fl_Check_Button* o, void*) { progdefaults.rxtext_tooltips = o->value(); progdefaults.changed = true; } Fl_Input2 *inpNonword=(Fl_Input2 *)0; static void cb_inpNonword(Fl_Input2* o, void*) { progdefaults.nonwordchars = o->value(); progdefaults.changed = true; } Fl_Group *tabMBars=(Fl_Group *)0; Fl_Check_Button *btnMacroMouseWheel=(Fl_Check_Button *)0; static void cb_btnMacroMouseWheel(Fl_Check_Button* o, void*) { progdefaults.macro_wheel = o->value(); progdefaults.changed = true; } Fl_Round_Button *btn_oneA=(Fl_Round_Button *)0; static void cb_btn_oneA(Fl_Round_Button*, void*) { progdefaults.mbar2_pos = 0; progdefaults.mbar1_pos = true; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_oneB=(Fl_Round_Button *)0; static void cb_btn_oneB(Fl_Round_Button*, void*) { progdefaults.mbar2_pos = 0; progdefaults.mbar1_pos = false; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_twoA=(Fl_Round_Button *)0; static void cb_btn_twoA(Fl_Round_Button*, void*) { progdefaults.mbar2_pos = 1; progdefaults.mbar1_pos = true; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_twoB=(Fl_Round_Button *)0; static void cb_btn_twoB(Fl_Round_Button*, void*) { progdefaults.mbar2_pos = 2; progdefaults.mbar1_pos = true; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_twoC=(Fl_Round_Button *)0; static void cb_btn_twoC(Fl_Round_Button*, void*) { progdefaults.mbar2_pos = 3; progdefaults.mbar1_pos = true; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_twoD=(Fl_Round_Button *)0; static void cb_btn_twoD(Fl_Round_Button*, void*) { progdefaults.mbar2_pos = 1; progdefaults.mbar1_pos = false; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_twoE=(Fl_Round_Button *)0; static void cb_btn_twoE(Fl_Round_Button*, void*) { progdefaults.mbar2_pos = 2; progdefaults.mbar1_pos = false; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_twoF=(Fl_Round_Button *)0; static void cb_btn_twoF(Fl_Round_Button*, void*) { progdefaults.mbar2_pos = 3; progdefaults.mbar1_pos = false; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Check_Button *btnUseLastMacro=(Fl_Check_Button *)0; static void cb_btnUseLastMacro(Fl_Check_Button* o, void*) { progdefaults.UseLastMacro = o->value(); update_main_title(); progdefaults.changed = true; } Fl_Check_Button *btnDisplayMacroFilename=(Fl_Check_Button *)0; static void cb_btnDisplayMacroFilename(Fl_Check_Button* o, void*) { progdefaults.DisplayMacroFilename = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_save_macros_on_exit=(Fl_Check_Button *)0; static void cb_btn_save_macros_on_exit(Fl_Check_Button* o, void*) { btn2_save_macros_on_exit->value(o->value()); progdefaults.SaveMacros = o->value(); progdefaults.changed = true; } Fl_Group *tabWF_UI=(Fl_Group *)0; Fl_Check_Button *btnWF_UIrev=(Fl_Check_Button *)0; static void cb_btnWF_UIrev(Fl_Check_Button* o, void*) { progdefaults.WF_UIrev = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIx1=(Fl_Check_Button *)0; static void cb_btnWF_UIx1(Fl_Check_Button* o, void*) { progdefaults.WF_UIx1 = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfcarrier=(Fl_Check_Button *)0; static void cb_btnWF_UIwfcarrier(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfcarrier = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfshift=(Fl_Check_Button *)0; static void cb_btnWF_UIwfshift(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfshift = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfreflevel=(Fl_Check_Button *)0; static void cb_btnWF_UIwfreflevel(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfreflevel = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfdrop=(Fl_Check_Button *)0; static void cb_btnWF_UIwfdrop(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfdrop = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfampspan=(Fl_Check_Button *)0; static void cb_btnWF_UIwfampspan(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfampspan = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfstore=(Fl_Check_Button *)0; static void cb_btnWF_UIwfstore(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfstore = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfmode=(Fl_Check_Button *)0; static void cb_btnWF_UIwfmode(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfmode = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIqsy=(Fl_Check_Button *)0; static void cb_btnWF_UIqsy(Fl_Check_Button* o, void*) { progdefaults.WF_UIqsy = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIxmtlock=(Fl_Check_Button *)0; static void cb_btnWF_UIxmtlock(Fl_Check_Button* o, void*) { progdefaults.WF_UIxmtlock = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Button *btn_wf_enable_all=(Fl_Button *)0; static void cb_btn_wf_enable_all(Fl_Button*, void*) { btnWF_UIrev->value(progdefaults.WF_UIrev = 1); btnWF_UIwfcarrier->value(progdefaults.WF_UIwfcarrier = 1); btnWF_UIwfreflevel->value(progdefaults.WF_UIwfreflevel = 1); btnWF_UIwfampspan->value(progdefaults.WF_UIwfampspan = 1); btnWF_UIwfmode->value(progdefaults.WF_UIwfmode = 1); btnWF_UIx1->value(progdefaults.WF_UIx1 = 1); btnWF_UIwfshift->value(progdefaults.WF_UIwfshift = 1); btnWF_UIwfdrop->value(progdefaults.WF_UIwfdrop = 1); btnWF_UIwfstore->value(progdefaults.WF_UIwfstore = 1); btnWF_UIqsy->value(progdefaults.WF_UIqsy = 1); btnWF_UIxmtlock->value(progdefaults.WF_UIxmtlock = 1); progdefaults.changed = true; WF_UI(); } Fl_Button *btn_wf_disable_all=(Fl_Button *)0; static void cb_btn_wf_disable_all(Fl_Button*, void*) { btnWF_UIrev->value(progdefaults.WF_UIrev = 0); btnWF_UIwfcarrier->value(progdefaults.WF_UIwfcarrier = 0); btnWF_UIwfreflevel->value(progdefaults.WF_UIwfreflevel = 0); btnWF_UIwfampspan->value(progdefaults.WF_UIwfampspan = 0); btnWF_UIwfmode->value(progdefaults.WF_UIwfmode = 0); btnWF_UIx1->value(progdefaults.WF_UIx1 = 0); btnWF_UIwfshift->value(progdefaults.WF_UIwfshift = 0); btnWF_UIwfdrop->value(progdefaults.WF_UIwfdrop = 0); btnWF_UIwfstore->value(progdefaults.WF_UIwfstore = 0); btnWF_UIqsy->value(progdefaults.WF_UIqsy = 0); btnWF_UIxmtlock->value(progdefaults.WF_UIxmtlock = 0); progdefaults.changed = true; WF_UI(); } Fl_Group *tabColorsFonts=(Fl_Group *)0; Fl_Tabs *tabsColors=(Fl_Tabs *)0; Fl_ListBox *listbox_charset_status=(Fl_ListBox *)0; Fl_Input *RxText=(Fl_Input *)0; Fl_Button *btnRxColor=(Fl_Button *)0; static void cb_btnRxColor(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.RxColor.R; g = progdefaults.RxColor.G; b = progdefaults.RxColor.B; if (!fl_color_chooser("Rx Color", r, g, b)) return; progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; RxText->color(fl_rgb_color(r,g,b)); ReceiveText->color(RxText->color()); RxText->redraw(); ReceiveText->redraw(); progdefaults.changed = true; } Fl_Button *btnTxColor=(Fl_Button *)0; static void cb_btnTxColor(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.TxColor.R; g = progdefaults.TxColor.G; b = progdefaults.TxColor.B; if (!fl_color_chooser("Tx Color", r, g, b)) return; progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; TxText->color(fl_rgb_color(r,g,b)); TransmitText->color(TxText->color()); TxText->redraw(); TransmitText->redraw(); progdefaults.changed = true; } Fl_Input *TxText=(Fl_Input *)0; Fl_Button *btnRxFont=(Fl_Button *)0; static void cb_btnRxFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.RxFontnbr); font_browser->fontSize(progdefaults.RxFontsize); font_browser->fontColor(progdefaults.RxFontcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbRxFontBrowser); font_browser->show(); } Fl_Button *btnTxFont=(Fl_Button *)0; static void cb_btnTxFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.TxFontnbr); font_browser->fontSize(progdefaults.TxFontsize); font_browser->fontColor(progdefaults.TxFontcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbTxFontBrowser); font_browser->show(); } Fl_Button *btnXMIT=(Fl_Button *)0; static void cb_btnXMIT(Fl_Button*, void*) { choose_color(progdefaults.XMITcolor); btnXMIT->color( progdefaults.XMITcolor ); btnXMIT->redraw(); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); progdefaults.changed = true; } Fl_Button *btnCTRL=(Fl_Button *)0; static void cb_btnCTRL(Fl_Button*, void*) { choose_color(progdefaults.CTRLcolor); btnCTRL->color( progdefaults.CTRLcolor ); btnCTRL->redraw(); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); progdefaults.changed = true; } Fl_Button *btnSKIP=(Fl_Button *)0; static void cb_btnSKIP(Fl_Button*, void*) { choose_color(progdefaults.SKIPcolor); btnSKIP->color( progdefaults.SKIPcolor ); btnSKIP->redraw(); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); progdefaults.changed = true; } Fl_Button *btnALTR=(Fl_Button *)0; static void cb_btnALTR(Fl_Button*, void*) { choose_color(progdefaults.ALTRcolor); btnALTR->color( progdefaults.ALTRcolor ); btnALTR->redraw(); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); progdefaults.changed = true; } Fl_Button *btnSEL=(Fl_Button *)0; static void cb_btnSEL(Fl_Button*, void*) { choose_color(progdefaults.RxTxSelectcolor); btnSEL->color( progdefaults.RxTxSelectcolor ); btnSEL->redraw(); ReceiveText->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); TransmitText->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); progdefaults.changed = true; } Fl_Button *btnNoTextColor=(Fl_Button *)0; static void cb_btnNoTextColor(Fl_Button*, void*) { uchar r, g, b; Fl_Color clr = FL_BACKGROUND2_COLOR; Fl::get_color(clr, r, g, b); progdefaults.TxFontcolor = FL_BLACK; progdefaults.RxFontcolor = FL_BLACK; progdefaults.XMITcolor = FL_RED; progdefaults.CTRLcolor = FL_DARK_GREEN; progdefaults.SKIPcolor = FL_BLUE; progdefaults.ALTRcolor = FL_DARK_MAGENTA; btnXMIT->color(progdefaults.XMITcolor); btnCTRL->color(progdefaults.CTRLcolor); btnSKIP->color(progdefaults.SKIPcolor); btnALTR->color(progdefaults.ALTRcolor); btnXMIT->redraw(); btnCTRL->redraw(); btnSKIP->redraw(); btnALTR->redraw(); progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; clr = fl_rgb_color(r,g,b); RxText->color(clr); RxText->textcolor(progdefaults.RxFontcolor); RxText->redraw(); ReceiveText->color(clr); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->redraw(); progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; TxText->color(clr); TxText->textcolor(progdefaults.TxFontcolor); TxText->redraw(); TransmitText->color(clr); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->redraw(); progdefaults.changed = true; } Fl_Button *btnTextDefaults=(Fl_Button *)0; static void cb_btnTextDefaults(Fl_Button*, void*) { uchar r, g, b; Fl_Color clr; progdefaults.TxFontcolor = FL_BLACK; progdefaults.RxFontcolor = FL_BLACK; progdefaults.XMITcolor = FL_RED; progdefaults.CTRLcolor = FL_DARK_GREEN; progdefaults.SKIPcolor = FL_BLUE; progdefaults.ALTRcolor = FL_DARK_MAGENTA; btnXMIT->color(progdefaults.XMITcolor); btnCTRL->color(progdefaults.CTRLcolor); btnSKIP->color(progdefaults.SKIPcolor); btnALTR->color(progdefaults.ALTRcolor); btnXMIT->redraw(); btnCTRL->redraw(); btnSKIP->redraw(); btnALTR->redraw(); r = 255; g = 242; b = 190; progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; clr = fl_rgb_color(r,g,b); RxText->color(clr); RxText->textcolor(progdefaults.RxFontcolor); RxText->redraw(); ReceiveText->color(clr); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->redraw(); r = 200; g = 235; b = 255; progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; clr = fl_rgb_color(r,g,b); TxText->color(clr); TxText->textcolor(progdefaults.TxFontcolor); TxText->redraw(); TransmitText->color(clr); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->redraw(); progdefaults.changed = true; } Fl_Box *FDdisplay=(Fl_Box *)0; Fl_Button *btn_freq_control_font=(Fl_Button *)0; static void cb_btn_freq_control_font(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.FreqControlFontnbr); font_browser->fontSize(14); font_browser->fontColor(FL_FOREGROUND_COLOR); font_browser->fontFilter(Font_Browser::FIXED_WIDTH); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbFreqControlFontBrowser); font_browser->show(); } Fl_Button *btnBackgroundColor=(Fl_Button *)0; static void cb_btnBackgroundColor(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.FDbackground.R; g = progdefaults.FDbackground.G; b = progdefaults.FDbackground.B; if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.FDbackground.R = r; progdefaults.FDbackground.G = g; progdefaults.FDbackground.B = b; FDdisplay->color(fl_rgb_color(r,g,b)); FDdisplay->redraw(); if (qsoFreqDisp) { qsoFreqDisp->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true; } Fl_Button *btnForegroundColor=(Fl_Button *)0; static void cb_btnForegroundColor(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.FDforeground.R; g = progdefaults.FDforeground.G; b = progdefaults.FDforeground.B; if (!fl_color_chooser("Foreground", r, g, b)) return; progdefaults.FDforeground.R = r; progdefaults.FDforeground.G = g; progdefaults.FDforeground.B = b; FDdisplay->labelcolor(fl_rgb_color(r,g,b)); FDdisplay->redraw(); if (qsoFreqDisp) { qsoFreqDisp->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true; } Fl_Button *btnFD_SystemColor=(Fl_Button *)0; static void cb_btnFD_SystemColor(Fl_Button*, void*) { uchar r, g, b; Fl_Color clr = FL_BACKGROUND2_COLOR; Fl::get_color(clr, r, g, b); progdefaults.FDbackground.R = r; progdefaults.FDbackground.G = g; progdefaults.FDbackground.B = b; FDdisplay->color(clr); clr = FL_FOREGROUND_COLOR; Fl::get_color(clr, r, g, b); FDdisplay->labelcolor(clr); FDdisplay->redraw(); progdefaults.FDforeground.R = r; progdefaults.FDforeground.G = g; progdefaults.FDforeground.B = b; if (qsoFreqDisp) { qsoFreqDisp->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true; } Fl_Output *LOGGINGdisplay=(Fl_Output *)0; Fl_Button *btnLOGGING_color=(Fl_Button *)0; static void cb_btnLOGGING_color(Fl_Button*, void*) { uchar r, g, b; Fl::get_color(progdefaults.LOGGINGcolor, r, g, b); if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.LOGGINGcolor = fl_rgb_color(r, g, b); LOGGINGdisplay->color(progdefaults.LOGGINGcolor); LOGGINGdisplay->redraw(); LOGGING_colors_font(); progdefaults.changed = true; } Fl_Button *btn_LOGGING_font=(Fl_Button *)0; static void cb_btn_LOGGING_font(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.LOGGINGtextfont); font_browser->fontSize(progdefaults.LOGGINGtextsize); font_browser->fontColor(progdefaults.LOGGINGtextcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbLOGGINGFontBrowser); font_browser->show(); } Fl_Button *btnLOGGINGdefault_colors_font=(Fl_Button *)0; static void cb_btnLOGGINGdefault_colors_font(Fl_Button*, void*) { progdefaults.LOGGINGcolor = FL_BACKGROUND2_COLOR; progdefaults.LOGGINGtextfont = (Fl_Font)0; progdefaults.LOGGINGtextsize = 12; progdefaults.LOGGINGtextcolor = FL_BLACK; LOGGINGdisplay->color(progdefaults.LOGGINGcolor); LOGGINGdisplay->textsize(progdefaults.LOGGINGtextsize); LOGGINGdisplay->textcolor(progdefaults.LOGGINGtextcolor); LOGGINGdisplay->textfont(progdefaults.LOGGINGtextfont); LOGGINGdisplay->redraw(); LOGGING_colors_font(); progdefaults.changed = true; } Fl_Output *LOGBOOKdisplay=(Fl_Output *)0; Fl_Button *btnLOGBOOK_color=(Fl_Button *)0; static void cb_btnLOGBOOK_color(Fl_Button*, void*) { uchar r, g, b; Fl::get_color(progdefaults.LOGBOOKcolor, r, g, b); if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.LOGBOOKcolor = fl_rgb_color(r, g, b); LOGBOOKdisplay->color(progdefaults.LOGBOOKcolor); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); progdefaults.changed = true; } Fl_Button *btn_LOGBOOK_font=(Fl_Button *)0; static void cb_btn_LOGBOOK_font(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.LOGBOOKtextfont); font_browser->fontSize(progdefaults.LOGBOOKtextsize); font_browser->fontColor(progdefaults.LOGBOOKtextcolor); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbLOGBOOKFontBrowser); font_browser->show(); } Fl_Button *btnLOGBOOKdefault_colors_font=(Fl_Button *)0; static void cb_btnLOGBOOKdefault_colors_font(Fl_Button*, void*) { progdefaults.LOGBOOKcolor = FL_BACKGROUND2_COLOR; progdefaults.LOGBOOKtextfont = (Fl_Font)0; progdefaults.LOGBOOKtextsize = 12; progdefaults.LOGBOOKtextcolor = FL_BLACK; LOGBOOKdisplay->color(progdefaults.LOGBOOKcolor); LOGBOOKdisplay->textsize(progdefaults.LOGBOOKtextsize); LOGBOOKdisplay->textcolor(progdefaults.LOGBOOKtextcolor); LOGBOOKdisplay->textfont(progdefaults.LOGBOOKtextfont); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); progdefaults.changed = true; } Fl_Check_Button *btnUseGroupColors=(Fl_Check_Button *)0; static void cb_btnUseGroupColors(Fl_Check_Button* o, void*) { progdefaults.useGroupColors = o->value(); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnGroup1=(Fl_Button *)0; static void cb_btnGroup1(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.btnGroup1.R; g = progdefaults.btnGroup1.G; b = progdefaults.btnGroup1.B; if (fl_color_chooser("Group 1", r, g, b) == 0) return; progdefaults.btnGroup1.R = r; progdefaults.btnGroup1.G = g; progdefaults.btnGroup1.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnGroup2=(Fl_Button *)0; static void cb_btnGroup2(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.btnGroup2.R; g = progdefaults.btnGroup2.G; b = progdefaults.btnGroup2.B; if (fl_color_chooser("Group 2", r, g, b) == 0) return; progdefaults.btnGroup2.R = r; progdefaults.btnGroup2.G = g; progdefaults.btnGroup2.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnGroup3=(Fl_Button *)0; static void cb_btnGroup3(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.btnGroup3.R; g = progdefaults.btnGroup3.G; b = progdefaults.btnGroup3.B; if (fl_color_chooser("Group 3", r, g, b) == 0) return; progdefaults.btnGroup3.R = r; progdefaults.btnGroup3.G = g; progdefaults.btnGroup3.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnFkeyTextColor=(Fl_Button *)0; static void cb_btnFkeyTextColor(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.btnFkeyTextColor.R; g = progdefaults.btnFkeyTextColor.G; b = progdefaults.btnFkeyTextColor.B; if (fl_color_chooser("Fkey Text", r, g, b) == 0) return; progdefaults.btnFkeyTextColor.R = r; progdefaults.btnFkeyTextColor.G = g; progdefaults.btnFkeyTextColor.B = b; o->color(fl_rgb_color(r,g,b)); adjust_label(o); btnGroup1->labelcolor(fl_rgb_color(r,g,b)); btnGroup2->labelcolor(fl_rgb_color(r,g,b)); btnGroup3->labelcolor(fl_rgb_color(r,g,b)); btnGroup1->redraw_label(); btnGroup2->redraw_label(); btnGroup3->redraw_label(); progdefaults.changed = true; colorize_macros(); } Fl_Button *btnFkeyDEfaults=(Fl_Button *)0; static void cb_btnFkeyDEfaults(Fl_Button*, void*) { uchar r, g, b; Fl_Color clr; r = 80; g = 144; b = 144; clr = fl_rgb_color(r,g,b); btnGroup1->color(clr); progdefaults.btnGroup1.R = r; progdefaults.btnGroup1.G = g; progdefaults.btnGroup1.B = b; r = 144; g = 80; b = 80; clr = fl_rgb_color(r,g,b); btnGroup2->color(clr); progdefaults.btnGroup2.R = r; progdefaults.btnGroup2.G = g; progdefaults.btnGroup2.B = b; r = 80; g = 80; b = 144; clr = fl_rgb_color(r,g,b); btnGroup3->color(clr); progdefaults.btnGroup3.R = r; progdefaults.btnGroup3.G = g; progdefaults.btnGroup3.B = b; r = 255; g = 255; b = 255; clr = fl_rgb_color(r,g,b); btnFkeyTextColor->color(clr); btnFkeyTextColor->redraw_label(); progdefaults.btnFkeyTextColor.R = r; progdefaults.btnFkeyTextColor.G = g; progdefaults.btnFkeyTextColor.B = b; btnGroup1->labelcolor(clr); btnGroup1->redraw_label(); btnGroup2->labelcolor(clr); btnGroup2->redraw_label(); btnGroup3->labelcolor(clr); btnGroup3->redraw_label(); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnTabColor=(Fl_Button *)0; static void cb_btnTabColor(Fl_Button*, void*) { progdefaults.TabsColor = fl_show_colormap(progdefaults.TabsColor); setTabColors(); progdefaults.changed = true; } Fl_Button *btnTabDefaultColor=(Fl_Button *)0; static void cb_btnTabDefaultColor(Fl_Button*, void*) { progdefaults.TabsColor = FL_BACKGROUND2_COLOR; setTabColors(); progdefaults.changed = true; } Fl_Button *btnSpotColor=(Fl_Button *)0; static void cb_btnSpotColor(Fl_Button*, void*) { progdefaults.SpotColor = fl_show_colormap(progdefaults.SpotColor); spotcolor->color(progdefaults.SpotColor); spotcolor->redraw(); spot_selection_color(); progdefaults.changed = true; } Fl_Button *btnRxIDColor=(Fl_Button *)0; static void cb_btnRxIDColor(Fl_Button*, void*) { progdefaults.RxIDColor = fl_show_colormap(progdefaults.RxIDColor); rxidcolor->color(progdefaults.RxIDColor); rxidcolor->redraw(); rxid_selection_color(); progdefaults.changed = true; } Fl_Button *btnTxIDColor=(Fl_Button *)0; static void cb_btnTxIDColor(Fl_Button*, void*) { progdefaults.TxIDColor = fl_show_colormap(progdefaults.TxIDColor); txidcolor->color(progdefaults.TxIDColor); txidcolor->redraw(); txid_selection_color(); progdefaults.changed = true; } Fl_Button *btnTuneColor=(Fl_Button *)0; static void cb_btnTuneColor(Fl_Button*, void*) { progdefaults.TuneColor = fl_show_colormap(progdefaults.TuneColor); tunecolor->color(progdefaults.TuneColor); tunecolor->redraw(); tune_selection_color(); progdefaults.changed = true; } Fl_Button *btnLkColor=(Fl_Button *)0; static void cb_btnLkColor(Fl_Button*, void*) { progdefaults.LkColor = fl_show_colormap(progdefaults.LkColor); lockcolor->color(progdefaults.LkColor); lockcolor->redraw(); xmtlock_selection_color(); progdefaults.changed = true; } Fl_Button *btnRevColor=(Fl_Button *)0; static void cb_btnRevColor(Fl_Button*, void*) { progdefaults.RevColor = fl_show_colormap(progdefaults.RevColor); revcolor->color(progdefaults.RevColor); revcolor->redraw(); rev_selection_color(); progdefaults.changed = true; } Fl_Button *btnXmtColor=(Fl_Button *)0; static void cb_btnXmtColor(Fl_Button*, void*) { progdefaults.XmtColor = fl_show_colormap(progdefaults.XmtColor); xmtcolor->color(progdefaults.XmtColor); xmtcolor->redraw(); xmtrcv_selection_color(); progdefaults.changed = true; } Fl_Button *btnAfcColor=(Fl_Button *)0; static void cb_btnAfcColor(Fl_Button*, void*) { progdefaults.AfcColor = fl_show_colormap(progdefaults.AfcColor); afccolor->color(progdefaults.AfcColor); afccolor->redraw(); afc_selection_color(); progdefaults.changed = true; } Fl_Button *btnSql1Color=(Fl_Button *)0; static void cb_btnSql1Color(Fl_Button*, void*) { progdefaults.Sql1Color = fl_show_colormap(progdefaults.Sql1Color); sql1color->color(progdefaults.Sql1Color); sql1color->redraw(); sql_selection_color(); progdefaults.changed = true; } Fl_Button *btnSql2Color=(Fl_Button *)0; static void cb_btnSql2Color(Fl_Button*, void*) { progdefaults.Sql2Color = fl_show_colormap(progdefaults.Sql2Color); sql2color->color(progdefaults.Sql2Color); sql2color->redraw(); sql_selection_color(); progdefaults.changed = true; } Fl_Box *spotcolor=(Fl_Box *)0; Fl_Box *rxidcolor=(Fl_Box *)0; Fl_Box *txidcolor=(Fl_Box *)0; Fl_Box *tunecolor=(Fl_Box *)0; Fl_Box *lockcolor=(Fl_Box *)0; Fl_Box *revcolor=(Fl_Box *)0; Fl_Box *xmtcolor=(Fl_Box *)0; Fl_Box *afccolor=(Fl_Box *)0; Fl_Box *sql1color=(Fl_Box *)0; Fl_Box *sql2color=(Fl_Box *)0; Fl_Button *btnLowSignal=(Fl_Button *)0; static void cb_btnLowSignal(Fl_Button*, void*) { progdefaults.LowSignal = fl_show_colormap(progdefaults.LowSignal); lowcolor->color(progdefaults.LowSignal); lowcolor->redraw(); progdefaults.changed = true; } Fl_Box *lowcolor=(Fl_Box *)0; Fl_Button *btnHighSignal=(Fl_Button *)0; static void cb_btnHighSignal(Fl_Button*, void*) { progdefaults.HighSignal = fl_show_colormap(progdefaults.HighSignal); highcolor->color(progdefaults.HighSignal); highcolor->redraw(); progdefaults.changed = true; } Fl_Box *highcolor=(Fl_Box *)0; Fl_Button *btnNormalSignal=(Fl_Button *)0; static void cb_btnNormalSignal(Fl_Button*, void*) { progdefaults.NormSignal = fl_show_colormap(progdefaults.NormSignal); normalcolor->color(progdefaults.NormSignal); normalcolor->redraw(); progdefaults.changed = true; } Fl_Box *normalcolor=(Fl_Box *)0; Fl_Button *btnOverSignal=(Fl_Button *)0; static void cb_btnOverSignal(Fl_Button*, void*) { progdefaults.OverSignal = fl_show_colormap(progdefaults.OverSignal); overcolor->color(progdefaults.OverSignal); overcolor->redraw(); progdefaults.changed = true; } Fl_Box *overcolor=(Fl_Box *)0; Fl_Group *tabWaterfall=(Fl_Group *)0; Fl_Tabs *tabsWaterfall=(Fl_Tabs *)0; colorbox *WF_Palette=(colorbox *)0; static void cb_WF_Palette(colorbox*, void*) { progdefaults.changed = true; } static void cb_btnColor(Fl_Button*, void*) { selectColor(0); progdefaults.changed = true; } static void cb_btnColor1(Fl_Button*, void*) { selectColor(1); progdefaults.changed = true; } static void cb_btnColor2(Fl_Button*, void*) { selectColor(2); progdefaults.changed = true; } static void cb_btnColor3(Fl_Button*, void*) { selectColor(3); progdefaults.changed = true; } static void cb_btnColor4(Fl_Button*, void*) { selectColor(4); progdefaults.changed = true; } static void cb_btnColor5(Fl_Button*, void*) { selectColor(5); progdefaults.changed = true; } static void cb_btnColor6(Fl_Button*, void*) { selectColor(6); progdefaults.changed = true; } static void cb_btnColor7(Fl_Button*, void*) { selectColor(7); progdefaults.changed = true; } Fl_Button *btnColor[9]={(Fl_Button *)0}; static void cb_btnColor8(Fl_Button*, void*) { selectColor(8); progdefaults.changed = true; } Fl_Button *btnLoadPalette=(Fl_Button *)0; static void cb_btnLoadPalette(Fl_Button*, void*) { loadPalette(); progdefaults.changed = true; } Fl_Button *btnSavePalette=(Fl_Button *)0; static void cb_btnSavePalette(Fl_Button*, void*) { savePalette(); } Fl_Check_Button *btnUseCursorLines=(Fl_Check_Button *)0; static void cb_btnUseCursorLines(Fl_Check_Button* o, void*) { progdefaults.UseCursorLines = o->value(); if (o->value()) btnCursorBWcolor->activate(); else btnCursorBWcolor->deactivate(); progdefaults.changed = true; } Fl_Button *btnCursorBWcolor=(Fl_Button *)0; static void cb_btnCursorBWcolor(Fl_Button* o, void*) { if (fl_color_chooser("Cursor BW Lines", progdefaults.cursorLineRGBI.R, progdefaults.cursorLineRGBI.G, progdefaults.cursorLineRGBI.B) ) { o->color(fl_rgb_color(progdefaults.cursorLineRGBI.R,progdefaults.cursorLineRGBI.G,progdefaults.cursorLineRGBI.B)); o->redraw(); progdefaults.changed = true; }; } Fl_Check_Button *btnUseWideCursor=(Fl_Check_Button *)0; static void cb_btnUseWideCursor(Fl_Check_Button* o, void*) { progdefaults.UseWideCursor = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnUseCursorCenterLine=(Fl_Check_Button *)0; static void cb_btnUseCursorCenterLine(Fl_Check_Button* o, void*) { progdefaults.UseCursorCenterLine = o->value(); progdefaults.changed = true; } Fl_Button *btnCursorCenterLineColor=(Fl_Button *)0; static void cb_btnCursorCenterLineColor(Fl_Button* o, void*) { if (fl_color_chooser("Cursor Center Line", progdefaults.cursorCenterRGBI.R, progdefaults.cursorCenterRGBI.G, progdefaults.cursorCenterRGBI.B) ) { o->color(fl_rgb_color(progdefaults.cursorCenterRGBI.R,progdefaults.cursorCenterRGBI.G,progdefaults.cursorCenterRGBI.B)); o->redraw(); progdefaults.changed = true; }; } Fl_Check_Button *btnUseWideCenter=(Fl_Check_Button *)0; static void cb_btnUseWideCenter(Fl_Check_Button* o, void*) { progdefaults.UseWideCenter = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnUseBWTracks=(Fl_Check_Button *)0; static void cb_btnUseBWTracks(Fl_Check_Button* o, void*) { progdefaults.UseBWTracks = o->value(); progdefaults.changed = true; } Fl_Button *btnBwTracksColor=(Fl_Button *)0; static void cb_btnBwTracksColor(Fl_Button* o, void*) { if (fl_color_chooser("Track Lines", progdefaults.bwTrackRGBI.R, progdefaults.bwTrackRGBI.G, progdefaults.bwTrackRGBI.B) ) { o->color(fl_rgb_color(progdefaults.bwTrackRGBI.R,progdefaults.bwTrackRGBI.G,progdefaults.bwTrackRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }; } Fl_Check_Button *btnUseWideTracks=(Fl_Check_Button *)0; static void cb_btnUseWideTracks(Fl_Check_Button* o, void*) { progdefaults.UseWideTracks = o->value(); progdefaults.changed = true; } Fl_Button *btnNotchColor=(Fl_Button *)0; static void cb_btnNotchColor(Fl_Button* o, void*) { if (fl_color_chooser("Notch Indicator", progdefaults.notchRGBI.R, progdefaults.notchRGBI.G, progdefaults.notchRGBI.B) ) { o->color(fl_rgb_color(progdefaults.notchRGBI.R,progdefaults.notchRGBI.G,progdefaults.notchRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }; } Fl_Check_Button *chkShowAudioScale=(Fl_Check_Button *)0; static void cb_chkShowAudioScale(Fl_Check_Button* o, void*) { progdefaults.wf_audioscale = o->value(); progdefaults.changed = true; } Fl_Button *btnWaterfallFont=(Fl_Button *)0; static void cb_btnWaterfallFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.WaterfallFontnbr); font_browser->fontSize(progdefaults.WaterfallFontsize); font_browser->fontColor(FL_FOREGROUND_COLOR); font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback((Fl_Callback*)cbWaterfallFontBrowser); font_browser->show(); } Fl_Check_Button *btnViewXmtSignal=(Fl_Check_Button *)0; static void cb_btnViewXmtSignal(Fl_Check_Button* o, void*) { progdefaults.viewXmtSignal=o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *valTxMonitorLevel=(Fl_Value_Slider2 *)0; static void cb_valTxMonitorLevel(Fl_Value_Slider2* o, void*) { progdefaults.TxMonitorLevel = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntLowFreqCutoff=(Fl_Counter2 *)0; static void cb_cntLowFreqCutoff(Fl_Counter2* o, void*) { progdefaults.LowFreqCutoff=(int)(o->value()); progdefaults.changed = true; setwfrange(); } Fl_Check_Button *btnWFaveraging=(Fl_Check_Button *)0; static void cb_btnWFaveraging(Fl_Check_Button* o, void*) { progdefaults.WFaveraging = o->value(); progdefaults.changed = true; } Fl_ListBox *listboxFFTPrefilter=(Fl_ListBox *)0; static void cb_listboxFFTPrefilter(Fl_ListBox* o, void*) { progdefaults.wfPreFilter = o->index(); progdefaults.changed = true; } Fl_Counter2 *cntrWfwidth=(Fl_Counter2 *)0; static void cb_cntrWfwidth(Fl_Counter2* o, void*) { progdefaults.HighFreqCutoff = (int)o->value(); progdefaults.changed = true; setwfrange(); } Fl_Counter2 *wf_latency=(Fl_Counter2 *)0; static void cb_wf_latency(Fl_Counter2* o, void*) { progdefaults.wf_latency = (int)o->value(); progdefaults.changed = true; } Fl_Counter2 *cntrWfheight=(Fl_Counter2 *)0; static void cb_cntrWfheight(Fl_Counter2* o, void*) { progdefaults.wfheight = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWaterfallHistoryDefault=(Fl_Check_Button *)0; static void cb_btnWaterfallHistoryDefault(Fl_Check_Button* o, void*) { progdefaults.WaterfallHistoryDefault = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWaterfallQSY=(Fl_Check_Button *)0; static void cb_btnWaterfallQSY(Fl_Check_Button* o, void*) { progdefaults.WaterfallQSY = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWaterfallClickInsert=(Fl_Check_Button *)0; static void cb_btnWaterfallClickInsert(Fl_Check_Button* o, void*) { progdefaults.WaterfallClickInsert = o->value(); if (progdefaults.WaterfallClickInsert) inpWaterfallClickText->activate(); else inpWaterfallClickText->deactivate(); progdefaults.changed = true; } Fl_Input2 *inpWaterfallClickText=(Fl_Input2 *)0; static void cb_inpWaterfallClickText(Fl_Input2* o, void*) { progdefaults.WaterfallClickText = o->value(); progdefaults.changed = true; } Fl_ListBox *listboxWaterfallWheelAction=(Fl_ListBox *)0; static void cb_listboxWaterfallWheelAction(Fl_ListBox* o, void*) { progdefaults.WaterfallWheelAction = o->index(); progdefaults.changed = true; } Fl_Group *tabModems=(Fl_Group *)0; Fl_Tabs *tabsModems=(Fl_Tabs *)0; Fl_Group *tabCW=(Fl_Group *)0; Fl_Tabs *tabsCW=(Fl_Tabs *)0; Fl_Value_Slider2 *sldrCWbandwidth=(Fl_Value_Slider2 *)0; static void cb_sldrCWbandwidth(Fl_Value_Slider2* o, void*) { progdefaults.CWbandwidth = (int)o->value(); progdefaults.changed = true; } Fl_Value_Output *valCWrcvWPM=(Fl_Value_Output *)0; static void cb_valCWrcvWPM(Fl_Value_Output*, void*) { progdefaults.changed = true; } Fl_Progress *prgsCWrcvWPM=(Fl_Progress *)0; Fl_Check_Button *btnCWuseSOMdecoding=(Fl_Check_Button *)0; static void cb_btnCWuseSOMdecoding(Fl_Check_Button* o, void*) { progdefaults.CWuseSOMdecoding = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntLower=(Fl_Counter2 *)0; static void cb_cntLower(Fl_Counter2* o, void*) { progdefaults.CWlower = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntUpper=(Fl_Counter2 *)0; static void cb_cntUpper(Fl_Counter2* o, void*) { progdefaults.CWupper = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWmfilt=(Fl_Check_Button *)0; static void cb_btnCWmfilt(Fl_Check_Button* o, void*) { progdefaults.CWmfilt = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWuseFFTfilter=(Fl_Check_Button *)0; static void cb_btnCWuseFFTfilter(Fl_Check_Button* o, void*) { progdefaults.CWuse_fft_filter = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWrcvTrack=(Fl_Check_Button *)0; static void cb_btnCWrcvTrack(Fl_Check_Button* o, void*) { progdefaults.CWtrack = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntCWrange=(Fl_Counter2 *)0; static void cb_cntCWrange(Fl_Counter2* o, void*) { progdefaults.CWrange = (int)o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *sldrCWxmtWPM=(Fl_Value_Slider2 *)0; static void cb_sldrCWxmtWPM(Fl_Value_Slider2* o, void*) { progdefaults.CWspeed = (int)o->value(); cntCW_WPM->value(progdefaults.CWspeed); progdefaults.changed = true; sync_cw_parameters(); } Fl_Counter2 *cntCWdefWPM=(Fl_Counter2 *)0; static void cb_cntCWdefWPM(Fl_Counter2* o, void*) { progdefaults.defCWspeed = (int)o->value(); progdefaults.changed = true; } Fl_Counter *cntCWlowerlimit=(Fl_Counter *)0; static void cb_cntCWlowerlimit(Fl_Counter* o, void*) { progdefaults.CWlowerlimit = (int)o->value(); progdefaults.changed = true; sldrCWxmtWPM->minimum(progdefaults.CWlowerlimit); sldrCWxmtWPM->value(progdefaults.CWspeed); sldrCWxmtWPM->redraw(); cntCWupperlimit->minimum(progdefaults.CWlowerlimit+20); cntCW_WPM->minimum(progdefaults.CWlowerlimit); } Fl_Counter *cntCWupperlimit=(Fl_Counter *)0; static void cb_cntCWupperlimit(Fl_Counter* o, void*) { progdefaults.CWupperlimit = (int)o->value(); progdefaults.changed = true; sldrCWxmtWPM->maximum(progdefaults.CWupperlimit); sldrCWxmtWPM->value(progdefaults.CWspeed); sldrCWxmtWPM->redraw(); cntCWlowerlimit->maximum(progdefaults.CWupperlimit-20); cntCW_WPM->maximum(progdefaults.CWupperlimit); } Fl_Value_Slider2 *sldrCWfarnsworth=(Fl_Value_Slider2 *)0; static void cb_sldrCWfarnsworth(Fl_Value_Slider2* o, void*) { progdefaults.CWfarnsworth = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWusefarnsworth=(Fl_Check_Button *)0; static void cb_btnCWusefarnsworth(Fl_Check_Button* o, void*) { progdefaults.CWusefarnsworth=o->value(); progdefaults.changed = true; } Fl_Counter2 *cntCWweight=(Fl_Counter2 *)0; static void cb_cntCWweight(Fl_Counter2* o, void*) { progdefaults.CWweight=(int)o->value(); progdefaults.changed = true; } Fl_Counter2 *cntCWdash2dot=(Fl_Counter2 *)0; static void cb_cntCWdash2dot(Fl_Counter2* o, void*) { progdefaults.CWdash2dot=o->value(); progdefaults.changed = true; } Fl_Counter2 *cntCWrisetime=(Fl_Counter2 *)0; static void cb_cntCWrisetime(Fl_Counter2* o, void*) { progdefaults.CWrisetime=o->value(); progdefaults.changed = true; } Fl_ListBox *i_listboxQSKshape=(Fl_ListBox *)0; static void cb_i_listboxQSKshape(Fl_ListBox* o, void*) { progdefaults.QSKshape = o->index()-1; progdefaults.changed = true; } Fl_Check_Button *btnCWnarrow=(Fl_Check_Button *)0; static void cb_btnCWnarrow(Fl_Check_Button* o, void*) { progdefaults.CWnarrow = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnQSK=(Fl_Check_Button *)0; static void cb_btnQSK(Fl_Check_Button* o, void*) { progdefaults.QSK = o->value(); btnQSK2->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); } }; } Fl_Counter2 *cntPreTiming=(Fl_Counter2 *)0; static void cb_cntPreTiming(Fl_Counter2* o, void*) { progdefaults.CWpre=o->value(); progdefaults.changed = true; } Fl_Counter2 *cntPostTiming=(Fl_Counter2 *)0; static void cb_cntPostTiming(Fl_Counter2* o, void*) { progdefaults.CWpost=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnQSKadjust=(Fl_Check_Button *)0; static void cb_btnQSKadjust(Fl_Check_Button* o, void*) { progdefaults.QSKadjust = o->value(); } Fl_ListBox *i_listbox_test_char=(Fl_ListBox *)0; static void cb_i_listbox_test_char(Fl_ListBox* o, void*) { progdefaults.TestChar = o->index()-1; } Fl_Check_Button *btnCW_use_paren=(Fl_Check_Button *)0; static void cb_btnCW_use_paren(Fl_Check_Button* o, void*) { progdefaults.CW_use_paren=o->value(); progdefaults.changed = true; } static void cb_listbox_prosign(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[0] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign1(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[1] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign2(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[2] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign3(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[3] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign4(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[4] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign5(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[5] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign6(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[6] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign7(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[7] = ps[c]; progdefaults.changed = true;; } Fl_ListBox *listbox_prosign[9]={(Fl_ListBox *)0}; static void cb_listbox_prosign8(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[8] = ps[c]; progdefaults.changed = true; } Fl_Group *tabDomEX=(Fl_Group *)0; Fl_Input2 *txtSecondary=(Fl_Input2 *)0; static void cb_txtSecondary(Fl_Input2* o, void*) { progdefaults.secText = o->value(); progdefaults.changed = true; } Fl_Check_Button *valDominoEX_FILTER=(Fl_Check_Button *)0; static void cb_valDominoEX_FILTER(Fl_Check_Button* o, void*) { progdefaults.DOMINOEX_FILTER = o->value(); resetDOMEX(); progdefaults.changed = true; } Fl_Counter2 *valDominoEX_BW=(Fl_Counter2 *)0; static void cb_valDominoEX_BW(Fl_Counter2* o, void*) { progdefaults.DOMINOEX_BW = o->value(); resetDOMEX(); progdefaults.changed = true; } Fl_Check_Button *chkDominoEX_FEC=(Fl_Check_Button *)0; static void cb_chkDominoEX_FEC(Fl_Check_Button* o, void*) { progdefaults.DOMINOEX_FEC = o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *valDomCWI=(Fl_Value_Slider2 *)0; static void cb_valDomCWI(Fl_Value_Slider2* o, void*) { progdefaults.DomCWI = o->value(); progdefaults.changed = true; } Fl_Counter2 *valDominoEX_PATHS=(Fl_Counter2 *)0; static void cb_valDominoEX_PATHS(Fl_Counter2* o, void*) { progdefaults.DOMINOEX_PATHS = (int)o->value(); progdefaults.changed = true; } Fl_Group *tabFeld=(Fl_Group *)0; Fl_ListBox *listboxHellFont=(Fl_ListBox *)0; static void cb_listboxHellFont(Fl_ListBox* o, void*) { progdefaults.feldfontnbr=o->index(); progdefaults.changed = true; } Fl_Check_Button *btnBlackboard=(Fl_Check_Button *)0; static void cb_btnBlackboard(Fl_Check_Button* o, void*) { progdefaults.HellBlackboard=o->value(); progdefaults.changed = true; } Fl_Spinner2 *valHellXmtWidth=(Fl_Spinner2 *)0; static void cb_valHellXmtWidth(Fl_Spinner2* o, void*) { progdefaults.HellXmtWidth=(int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnHellRcvWidth=(Fl_Check_Button *)0; static void cb_btnHellRcvWidth(Fl_Check_Button* o, void*) { progdefaults.HellRcvWidth=o->value(); progdefaults.changed = true; } Fl_ListBox *listboxHellPulse=(Fl_ListBox *)0; static void cb_listboxHellPulse(Fl_ListBox* o, void*) { progdefaults.HellPulseFast = o->index(); progdefaults.changed = true; } Fl_Value_Slider2 *sldrHellBW=(Fl_Value_Slider2 *)0; static void cb_sldrHellBW(Fl_Value_Slider2*, void*) { progdefaults.HELL_BW = sldrHellBW->value(); } Fl_Check_Button *btnFeldHellIdle=(Fl_Check_Button *)0; static void cb_btnFeldHellIdle(Fl_Check_Button* o, void*) { progdefaults.HellXmtIdle=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnHellXmtWidth=(Fl_Check_Button *)0; static void cb_btnHellXmtWidth(Fl_Check_Button* o, void*) { progdefaults.HellXmtWidth=o->value(); progdefaults.changed = true; } Fl_Group *tabMT63=(Fl_Group *)0; Fl_Check_Button *btnMT63_8bit=(Fl_Check_Button *)0; static void cb_btnMT63_8bit(Fl_Check_Button* o, void*) { progdefaults.mt63_8bit = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnMT63_rx_integration=(Fl_Check_Button *)0; static void cb_btnMT63_rx_integration(Fl_Check_Button* o, void*) { progdefaults.mt63_rx_integration = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnMT63_usetones=(Fl_Check_Button *)0; static void cb_btnMT63_usetones(Fl_Check_Button* o, void*) { progdefaults.mt63_usetones = o->value(); if (!o->value()) { btnMT63_upper_lower->value(0); btnMT63_upper_lower->do_callback(); btnMT63_upper_lower->deactivate(); } else btnMT63_upper_lower->activate(); progdefaults.changed = true; } Fl_Check_Button *btnMT63_upper_lower=(Fl_Check_Button *)0; static void cb_btnMT63_upper_lower(Fl_Check_Button* o, void*) { progdefaults.mt63_twotones = o->value(); progdefaults.changed = true; } Fl_Spinner2 *MT63_tone_duration=(Fl_Spinner2 *)0; static void cb_MT63_tone_duration(Fl_Spinner2* o, void*) { progdefaults.mt63_tone_duration=(int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnMT63_at500=(Fl_Check_Button *)0; static void cb_btnMT63_at500(Fl_Check_Button* o, void*) { progdefaults.mt63_at500 = !o->value(); progdefaults.changed = true; } Fl_Group *tabOlivia=(Fl_Group *)0; Fl_ListBox *i_listbox_olivia_bandwidth=(Fl_ListBox *)0; static void cb_i_listbox_olivia_bandwidth(Fl_ListBox* o, void*) { progdefaults.oliviabw = o->index(); set_olivia_default_integ(); resetOLIVIA(); progdefaults.changed = true; } Fl_ListBox *i_listbox_olivia_tones=(Fl_ListBox *)0; static void cb_i_listbox_olivia_tones(Fl_ListBox* o, void*) { progdefaults.oliviatones = o->index(); set_olivia_default_integ(); resetOLIVIA(); progdefaults.changed = true; } Fl_Counter2 *cntOlivia_smargin=(Fl_Counter2 *)0; static void cb_cntOlivia_smargin(Fl_Counter2* o, void*) { progdefaults.oliviasmargin = (int)(o->value()); resetOLIVIA(); progdefaults.changed = true; } Fl_Counter2 *cntOlivia_sinteg=(Fl_Counter2 *)0; static void cb_cntOlivia_sinteg(Fl_Counter2* o, void*) { progdefaults.oliviasinteg = (int)(o->value()); resetOLIVIA(); progdefaults.changed = true; } Fl_Check_Button *btn_olivia_reset_fec=(Fl_Check_Button *)0; static void cb_btn_olivia_reset_fec(Fl_Check_Button* o, void*) { progdefaults.olivia_reset_fec = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnOlivia_8bit=(Fl_Check_Button *)0; static void cb_btnOlivia_8bit(Fl_Check_Button* o, void*) { progdefaults.olivia8bit = o->value(); progdefaults.changed = true; } Fl_Group *tabContestia=(Fl_Group *)0; Fl_ListBox *i_listbox_contestia_bandwidth=(Fl_ListBox *)0; static void cb_i_listbox_contestia_bandwidth(Fl_ListBox* o, void*) { progdefaults.contestiabw = o->index(); set_contestia_default_integ(); resetCONTESTIA(); progdefaults.changed = true; } Fl_ListBox *i_listbox_contestia_tones=(Fl_ListBox *)0; static void cb_i_listbox_contestia_tones(Fl_ListBox* o, void*) { progdefaults.contestiatones = o->index(); set_contestia_default_integ(); resetCONTESTIA(); progdefaults.changed = true; } Fl_Counter2 *cntContestia_smargin=(Fl_Counter2 *)0; static void cb_cntContestia_smargin(Fl_Counter2* o, void*) { progdefaults.contestiasmargin = (int)(o->value()); resetCONTESTIA(); progdefaults.changed = true; } Fl_Counter2 *cntContestia_sinteg=(Fl_Counter2 *)0; static void cb_cntContestia_sinteg(Fl_Counter2* o, void*) { progdefaults.contestiasinteg = (int)(o->value()); resetCONTESTIA(); progdefaults.changed = true; } Fl_Check_Button *btn_contestia_reset_fec=(Fl_Check_Button *)0; static void cb_btn_contestia_reset_fec(Fl_Check_Button* o, void*) { progdefaults.contestia_reset_fec = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnContestia_8bit=(Fl_Check_Button *)0; static void cb_btnContestia_8bit(Fl_Check_Button* o, void*) { progdefaults.contestia8bit = o->value(); progdefaults.changed = true; } Fl_Group *tabPSK=(Fl_Group *)0; Fl_Tabs *tabsPSK=(Fl_Tabs *)0; Fl_Counter2 *cntSearchRange=(Fl_Counter2 *)0; static void cb_cntSearchRange(Fl_Counter2* o, void*) { progdefaults.SearchRange = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true; } Fl_Counter2 *cntACQsn=(Fl_Counter2 *)0; static void cb_cntACQsn(Fl_Counter2* o, void*) { progdefaults.ACQsn = o->value(); progdefaults.changed = true; } Fl_ListBox *listbox_psk_status_timeout=(Fl_ListBox *)0; static void cb_listbox_psk_status_timeout(Fl_ListBox* o, void*) { progdefaults.StatusDim = o->index(); progdefaults.changed = true; } static void cb_seconds(Fl_Counter2* o, void*) { progdefaults.StatusTimeout = (int)(o->value()); progdefaults.changed = true; } Fl_Check_Button *btnEnablePSKbrowsing=(Fl_Check_Button *)0; static void cb_btnEnablePSKbrowsing(Fl_Check_Button* o, void*) { progdefaults.pskbrowser_on = o->value(); progdefaults.changed = true; } Fl_Group *tabRTTY=(Fl_Group *)0; Fl_Tabs *tabsRTTY=(Fl_Tabs *)0; Fl_ListBox *i_listbox_rtty_afc_speed=(Fl_ListBox *)0; static void cb_i_listbox_rtty_afc_speed(Fl_ListBox* o, void*) { progdefaults.rtty_afcspeed = o->index()-1; progdefaults.changed = true; } Fl_Check_Button *chkUOSrx=(Fl_Check_Button *)0; static void cb_chkUOSrx(Fl_Check_Button* o, void*) { progdefaults.UOSrx=o->value(); progdefaults.changed = true; } Fl_Value_Input *rtty_rx_shape=(Fl_Value_Input *)0; static void cb_rtty_rx_shape(Fl_Value_Input* o, void*) { progdefaults.rtty_filter = o->value(); progStatus.rtty_filter_changed = true; progdefaults.changed = true; } static void cb_btnRxTones(Fl_Check_Button* o, void*) { if (o->value()) { btnRxTones[1]->value(0); btnRxTones[2]->value(0); progdefaults.rtty_cwi = 0; }; } static void cb_btnRxTones1(Fl_Check_Button* o, void*) { if (o->value()) { btnRxTones[0]->value(0); btnRxTones[2]->value(0); progdefaults.rtty_cwi = 1; }; } Fl_Check_Button *btnRxTones[3]={(Fl_Check_Button *)0}; static void cb_btnRxTones2(Fl_Check_Button* o, void*) { if (o->value()) { btnRxTones[1]->value(0); btnRxTones[0]->value(0); progdefaults.rtty_cwi = 2; }; } Fl_Check_Button *btnPreferXhairScope=(Fl_Check_Button *)0; static void cb_btnPreferXhairScope(Fl_Check_Button* o, void*) { progdefaults.PreferXhairScope=o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_true_scope=(Fl_Check_Button *)0; static void cb_chk_true_scope(Fl_Check_Button* o, void*) { progdefaults.true_scope=o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_useMARKfreq=(Fl_Check_Button *)0; static void cb_chk_useMARKfreq(Fl_Check_Button* o, void*) { progdefaults.useMARKfreq=o->value(); progdefaults.changed = true; } Fl_Button *btnRTTY_mark_color=(Fl_Button *)0; static void cb_btnRTTY_mark_color(Fl_Button* o, void*) { if (fl_color_chooser("MARK freq track", progdefaults.rttymarkRGBI.R, progdefaults.rttymarkRGBI.G, progdefaults.rttymarkRGBI.B) ) { o->color(fl_rgb_color(progdefaults.rttymarkRGBI.R,progdefaults.rttymarkRGBI.G,progdefaults.rttymarkRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }; } Fl_ListBox *selShift=(Fl_ListBox *)0; static void cb_selShift(Fl_ListBox* o, void*) { progdefaults.rtty_shift = o->index(); if (progdefaults.rtty_shift == o->lsize() - 1) selCustomShift->activate(); else selCustomShift->deactivate(); selCustomShift->redraw(); resetRTTY(); progdefaults.changed = true; } Fl_Counter2 *selCustomShift=(Fl_Counter2 *)0; static void cb_selCustomShift(Fl_Counter2* o, void*) { progdefaults.rtty_custom_shift = o->value(); resetRTTY(); progdefaults.changed = true; } Fl_ListBox *selBaud=(Fl_ListBox *)0; static void cb_selBaud(Fl_ListBox* o, void*) { progdefaults.rtty_baud = o->index(); resetRTTY(); progdefaults.changed = true; } Fl_ListBox *selBits=(Fl_ListBox *)0; static void cb_selBits(Fl_ListBox* o, void*) { progdefaults.rtty_bits = o->index(); selParity->do_callback(); } Fl_ListBox *selParity=(Fl_ListBox *)0; static void cb_selParity(Fl_ListBox* o, void*) { if (progdefaults.rtty_bits == 0) { progdefaults.rtty_parity = RTTY_PARITY_NONE; o->index(progdefaults.rtty_parity); } else progdefaults.rtty_parity = o->index(); resetRTTY(); progdefaults.changed = true; } Fl_ListBox *selStopBits=(Fl_ListBox *)0; static void cb_selStopBits(Fl_ListBox* o, void*) { progdefaults.rtty_stop = o->index(); resetRTTY(); progdefaults.changed = true; } Fl_Check_Button *btnAUTOCRLF=(Fl_Check_Button *)0; static void cb_btnAUTOCRLF(Fl_Check_Button* o, void*) { progdefaults.rtty_autocrlf = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntrAUTOCRLF=(Fl_Counter2 *)0; static void cb_cntrAUTOCRLF(Fl_Counter2* o, void*) { progdefaults.rtty_autocount = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCRCRLF=(Fl_Check_Button *)0; static void cb_btnCRCRLF(Fl_Check_Button* o, void*) { progdefaults.rtty_crcrlf = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkUOStx=(Fl_Check_Button *)0; static void cb_chkUOStx(Fl_Check_Button* o, void*) { progdefaults.UOStx=o->value(); progdefaults.changed = true; } Fl_Check_Button *chkPseudoFSK=(Fl_Check_Button *)0; static void cb_chkPseudoFSK(Fl_Check_Button* o, void*) { progdefaults.PseudoFSK = o->value(); chkPseudoFSK2->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); } }; } Fl_Check_Button *btnSynopAdifDecoding=(Fl_Check_Button *)0; static void cb_btnSynopAdifDecoding(Fl_Check_Button* o, void*) { progdefaults.SynopAdifDecoding=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnSynopKmlDecoding=(Fl_Check_Button *)0; static void cb_btnSynopKmlDecoding(Fl_Check_Button* o, void*) { progdefaults.SynopKmlDecoding=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnSynopInterleaved=(Fl_Check_Button *)0; static void cb_btnSynopInterleaved(Fl_Check_Button* o, void*) { progdefaults.SynopInterleaved=o->value(); progdefaults.changed = true; } Fl_Group *tabTHOR=(Fl_Group *)0; Fl_Input2 *txtTHORSecondary=(Fl_Input2 *)0; static void cb_txtTHORSecondary(Fl_Input2* o, void*) { progdefaults.THORsecText = o->value(); progdefaults.changed = true; } Fl_Check_Button *valTHOR_FILTER=(Fl_Check_Button *)0; static void cb_valTHOR_FILTER(Fl_Check_Button* o, void*) { progdefaults.THOR_FILTER = o->value(); resetTHOR(); progdefaults.changed = true; } Fl_Counter2 *valTHOR_BW=(Fl_Counter2 *)0; static void cb_valTHOR_BW(Fl_Counter2* o, void*) { progdefaults.THOR_BW = o->value(); resetTHOR(); progdefaults.changed = true; } Fl_Value_Slider2 *valThorCWI=(Fl_Value_Slider2 *)0; static void cb_valThorCWI(Fl_Value_Slider2* o, void*) { progdefaults.ThorCWI = o->value(); progdefaults.changed = true; } Fl_Check_Button *valTHOR_PREAMBLE=(Fl_Check_Button *)0; static void cb_valTHOR_PREAMBLE(Fl_Check_Button* o, void*) { progdefaults.THOR_PREAMBLE = o->value(); progdefaults.changed = true; } Fl_Check_Button *valTHOR_SOFTSYMBOLS=(Fl_Check_Button *)0; static void cb_valTHOR_SOFTSYMBOLS(Fl_Check_Button* o, void*) { progdefaults.THOR_SOFTSYMBOLS = o->value(); progdefaults.changed = true; } Fl_Check_Button *valTHOR_SOFTBITS=(Fl_Check_Button *)0; static void cb_valTHOR_SOFTBITS(Fl_Check_Button* o, void*) { progdefaults.THOR_SOFTBITS = o->value(); progdefaults.changed = true; } Fl_Counter2 *valTHOR_PATHS=(Fl_Counter2 *)0; static void cb_valTHOR_PATHS(Fl_Counter2* o, void*) { progdefaults.THOR_PATHS = (int)o->value(); progdefaults.changed = true; } Fl_Group *tabNavtex=(Fl_Group *)0; Fl_Check_Button *btnNvtxAdifLog=(Fl_Check_Button *)0; static void cb_btnNvtxAdifLog(Fl_Check_Button* o, void*) { progdefaults.NVTX_AdifLog=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnNvtxKmlLog=(Fl_Check_Button *)0; static void cb_btnNvtxKmlLog(Fl_Check_Button* o, void*) { progdefaults.NVTX_KmlLog=o->value(); progdefaults.changed = true; } Fl_Group *tabWefax=(Fl_Group *)0; Fl_Check_Button *btnWefaxEmbeddedGui=(Fl_Check_Button *)0; static void cb_btnWefaxEmbeddedGui(Fl_Check_Button* o, void*) { progdefaults.WEFAX_EmbeddedGui=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWefaxHideTx=(Fl_Check_Button *)0; static void cb_btnWefaxHideTx(Fl_Check_Button* o, void*) { progdefaults.WEFAX_HideTx=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWefaxAdifLog=(Fl_Check_Button *)0; static void cb_btnWefaxAdifLog(Fl_Check_Button* o, void*) { progdefaults.WEFAX_AdifLog=o->value(); progdefaults.changed = true; } Fl_Counter *cntr_wefax_shift=(Fl_Counter *)0; static void cb_cntr_wefax_shift(Fl_Counter* o, void*) { progdefaults.WEFAX_Shift=o->value(); progdefaults.changed = true; } Fl_Counter *ctr_wefax_max_rows=(Fl_Counter *)0; static void cb_ctr_wefax_max_rows(Fl_Counter* o, void*) { progdefaults.WEFAX_MaxRows=o->value(); progdefaults.changed = true; } Fl_Input *btnWefaxSaveDir=(Fl_Input *)0; static void cb_btnWefaxSaveDir(Fl_Input* o, void*) { progdefaults.wefax_save_dir=o->value(); progdefaults.changed = true; } Fl_Button *btnSelectFaxDestDir=(Fl_Button *)0; static void cb_btnSelectFaxDestDir(Fl_Button*, void*) { Fl_File_Chooser *fc = new Fl_File_Chooser(".",NULL,Fl_File_Chooser::DIRECTORY,"Input File"); fc->callback(WefaxDestDirSet); fc->show(); } Fl_Check_Button *btnWefaxSaveMonochrome=(Fl_Check_Button *)0; static void cb_btnWefaxSaveMonochrome(Fl_Check_Button* o, void*) { progdefaults.WEFAX_SaveMonochrome=o->value(); progdefaults.changed = true; } Fl_Group *tabRig=(Fl_Group *)0; Fl_Tabs *tabsRig=(Fl_Tabs *)0; Fl_Check_Button *btnPTTrightchannel=(Fl_Check_Button *)0; static void cb_btnPTTrightchannel(Fl_Check_Button* o, void*) { progdefaults.PTTrightchannel = o->value(); btnPTTrightchannel2->value(o->value()); if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); } } progdefaults.changed = true; } Fl_Group *grpHWPTT=(Fl_Group *)0; Fl_Round_Button *btnTTYptt=(Fl_Round_Button *)0; static void cb_btnTTYptt(Fl_Round_Button* o, void*) { btnUsePPortPTT->value(false); btnUseUHrouterPTT->value(false); progdefaults.TTYptt = o->value(); progdefaults.UsePPortPTT = false; progdefaults.UseUHrouterPTT = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_ComboBox *inpTTYdev=(Fl_ComboBox *)0; static void cb_inpTTYdev(Fl_ComboBox*, void*) { btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnRTSptt=(Fl_Round_Button *)0; static void cb_btnRTSptt(Fl_Round_Button*, void*) { btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnRTSplusV=(Fl_Round_Button *)0; static void cb_btnRTSplusV(Fl_Round_Button*, void*) { btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnDTRptt=(Fl_Round_Button *)0; static void cb_btnDTRptt(Fl_Round_Button*, void*) { btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnDTRplusV=(Fl_Round_Button *)0; static void cb_btnDTRplusV(Fl_Round_Button*, void*) { btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Button *btnInitHWPTT=(Fl_Button *)0; static void cb_btnInitHWPTT(Fl_Button* o, void*) { progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true; } Fl_Round_Button *btnUsePPortPTT=(Fl_Round_Button *)0; static void cb_btnUsePPortPTT(Fl_Round_Button* o, void*) { btnTTYptt->value(false); btnUseUHrouterPTT->value(false); progdefaults.TTYptt = false; progdefaults.UsePPortPTT = o->value(); progdefaults.UseUHrouterPTT = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnUseUHrouterPTT=(Fl_Round_Button *)0; static void cb_btnUseUHrouterPTT(Fl_Round_Button* o, void*) { btnTTYptt->value(false); btnUsePPortPTT->value(false); progdefaults.TTYptt = false; progdefaults.UsePPortPTT = false; progdefaults.UseUHrouterPTT = o->value(); btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Group *grpPTTdelays=(Fl_Group *)0; Fl_Counter *cntPTT_on_delay=(Fl_Counter *)0; static void cb_cntPTT_on_delay(Fl_Counter* o, void*) { progdefaults.PTT_on_delay = o->value(); progdefaults.changed = true; } Fl_Counter *cntPTT_off_delay=(Fl_Counter *)0; static void cb_cntPTT_off_delay(Fl_Counter* o, void*) { progdefaults.PTT_off_delay = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkUSERIGCAT=(Fl_Check_Button *)0; static void cb_chkUSERIGCAT(Fl_Check_Button* o, void*) { if (o->value() == 1) { chkUSEHAMLIB->value(0); chkUSEXMLRPC->value(0); progdefaults.chkUSEHAMLIBis = false; progdefaults.chkUSERIGCATis = true; progdefaults.chkUSEXMLRPCis = false; } else { progdefaults.chkUSERIGCATis = false; } btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw(); } Fl_Group *grpRigCAT=(Fl_Group *)0; Fl_Output *txtXmlRigFilename=(Fl_Output *)0; Fl_Button *btnSelectRigXmlFile=(Fl_Button *)0; static void cb_btnSelectRigXmlFile(Fl_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); selectRigXmlFilename(); } Fl_ComboBox *inpXmlRigDevice=(Fl_ComboBox *)0; static void cb_inpXmlRigDevice(Fl_ComboBox*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate(); } Fl_Value_Input2 *cntRigCatRetries=(Fl_Value_Input2 *)0; static void cb_cntRigCatRetries(Fl_Value_Input2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate(); } Fl_Value_Input2 *cntRigCatTimeout=(Fl_Value_Input2 *)0; static void cb_cntRigCatTimeout(Fl_Value_Input2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate(); } Fl_Value_Input2 *cntRigCatWait=(Fl_Value_Input2 *)0; static void cb_cntRigCatWait(Fl_Value_Input2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate(); } Fl_ListBox *listbox_xml_rig_baudrate=(Fl_ListBox *)0; static void cb_listbox_xml_rig_baudrate(Fl_ListBox*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate(); } Fl_Counter2 *valRigCatStopbits=(Fl_Counter2 *)0; static void cb_valRigCatStopbits(Fl_Counter2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw(); btnRevertRIGCAT->activate(); } Fl_Button *btnInitRIGCAT=(Fl_Button *)0; static void cb_btnInitRIGCAT(Fl_Button* o, void*) { progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true; } Fl_Check_Button *btnRigCatEcho=(Fl_Check_Button *)0; static void cb_btnRigCatEcho(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); progdefaults.changed = true; btnRevertRIGCAT->activate(); } Fl_Round_Button *btnRigCatCMDptt=(Fl_Round_Button *)0; static void cb_btnRigCatCMDptt(Fl_Round_Button* o, void*) { if (o->value()== 1) { btnRigCatRTSptt->value(0); btnRigCatDTRptt->value(0); } btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw(); btnRevertRIGCAT->activate(); } Fl_Round_Button *btnRigCatRTSptt=(Fl_Round_Button *)0; static void cb_btnRigCatRTSptt(Fl_Round_Button* o, void*) { if (o->value() == 1) { // btnRigCatDTRptt->value(0); btnRigCatCMDptt->value(0); } btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate(); } Fl_Round_Button *btnRigCatDTRptt=(Fl_Round_Button *)0; static void cb_btnRigCatDTRptt(Fl_Round_Button* o, void*) { if (o->value() == 1) { // btnRigCatRTSptt->value(0); btnRigCatCMDptt->value(0); } btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate(); } Fl_Check_Button *btnRigCatRTSplus=(Fl_Check_Button *)0; static void cb_btnRigCatRTSplus(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate(); } Fl_Check_Button *btnRigCatDTRplus=(Fl_Check_Button *)0; static void cb_btnRigCatDTRplus(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate(); } Fl_Check_Button *chkRigCatRTSCTSflow=(Fl_Check_Button *)0; static void cb_chkRigCatRTSCTSflow(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate(); } Fl_Check_Button *chk_restore_tio=(Fl_Check_Button *)0; static void cb_chk_restore_tio(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate(); } Fl_Button *btnRevertRIGCAT=(Fl_Button *)0; static void cb_btnRevertRIGCAT(Fl_Button*, void*) { btnInitRIGCAT->labelcolor(FL_FOREGROUND_COLOR); btnInitRIGCAT->redraw_label(); rigCAT_restore_defaults(); } Fl_Check_Button *chkRigCatVSP=(Fl_Check_Button *)0; static void cb_chkRigCatVSP(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate(); } Fl_Value_Input2 *cntRigCatInitDelay=(Fl_Value_Input2 *)0; static void cb_cntRigCatInitDelay(Fl_Value_Input2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); btnRevertRIGCAT->activate(); } Fl_Group *tabHamlib=(Fl_Group *)0; Fl_Check_Button *chkUSEHAMLIB=(Fl_Check_Button *)0; static void cb_chkUSEHAMLIB(Fl_Check_Button* o, void*) { progdefaults.chkUSEHAMLIBis = o->value(); if (o->value() == 1) { chkUSERIGCAT->value(0); chkUSEXMLRPC->value(0); progdefaults.chkUSERIGCATis = false; progdefaults.chkUSEXMLRPCis = false; } btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw(); progdefaults.changed = true; } Fl_Group *grpHamlib=(Fl_Group *)0; Fl_ComboBox *cboHamlibRig=(Fl_ComboBox *)0; static void cb_cboHamlibRig(Fl_ComboBox*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); #if USE_HAMLIB hamlib_get_defaults(); #endif } Fl_ComboBox *inpRIGdev=(Fl_ComboBox *)0; static void cb_inpRIGdev(Fl_ComboBox*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); } Fl_Value_Input2 *cntHamlibRetries=(Fl_Value_Input2 *)0; static void cb_cntHamlibRetries(Fl_Value_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); } Fl_Value_Input2 *cntHamlibTimeout=(Fl_Value_Input2 *)0; static void cb_cntHamlibTimeout(Fl_Value_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); } Fl_Value_Input2 *cntHamlibWriteDelay=(Fl_Value_Input2 *)0; static void cb_cntHamlibWriteDelay(Fl_Value_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); } Fl_Value_Input2 *cntHamlibWait=(Fl_Value_Input2 *)0; static void cb_cntHamlibWait(Fl_Value_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); } Fl_ListBox *listbox_baudrate=(Fl_ListBox *)0; static void cb_listbox_baudrate(Fl_ListBox*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); } Fl_Counter2 *valHamRigStopbits=(Fl_Counter2 *)0; static void cb_valHamRigStopbits(Fl_Counter2* o, void*) { progdefaults.HamRigStopbits = (int)o->value(); btnRevertHAMLIB->activate(); progdefaults.changed = true; } Fl_Counter2 *cntHamlibTimeout0=(Fl_Counter2 *)0; static void cb_cntHamlibTimeout0(Fl_Counter2* o, void*) { progdefaults.HamlibTimeout = (int)o->value(); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Input2 *inpHamlibConfig=(Fl_Input2 *)0; static void cb_inpHamlibConfig(Fl_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); } Fl_Button *btnInitHAMLIB=(Fl_Button *)0; static void cb_btnInitHAMLIB(Fl_Button* o, void*) { progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); //btnRevertHAMLIB->activate(); progdefaults.changed = true; } Fl_ListBox *listbox_sideband=(Fl_ListBox *)0; static void cb_listbox_sideband(Fl_ListBox*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); } Fl_Round_Button *btnHamlibCMDptt=(Fl_Round_Button *)0; static void cb_btnHamlibCMDptt(Fl_Round_Button*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); } Fl_Check_Button *btnHamlibDTRplus=(Fl_Check_Button *)0; static void cb_btnHamlibDTRplus(Fl_Check_Button*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); } Fl_Check_Button *chkHamlibRTSplus=(Fl_Check_Button *)0; static void cb_chkHamlibRTSplus(Fl_Check_Button* o, void*) { if (o->value() == 1) chkHamlibRTSCTSflow->value(0); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); } Fl_Check_Button *chkHamlibRTSCTSflow=(Fl_Check_Button *)0; static void cb_chkHamlibRTSCTSflow(Fl_Check_Button* o, void*) { if (o->value() == 1) { chkHamlibXONXOFFflow->value(0); chkHamlibRTSplus->deactivate(); } else chkHamlibRTSplus->activate(); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); } Fl_Check_Button *chkHamlibXONXOFFflow=(Fl_Check_Button *)0; static void cb_chkHamlibXONXOFFflow(Fl_Check_Button* o, void*) { if (o->value() == 1) chkHamlibRTSCTSflow->value(0); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); } Fl_Button *btnRevertHAMLIB=(Fl_Button *)0; static void cb_btnRevertHAMLIB(Fl_Button*, void*) { btnInitHAMLIB->labelcolor(FL_FOREGROUND_COLOR); btnInitHAMLIB->redraw_label(); #if USE_HAMLIB hamlib_restore_defaults(); #endif } Fl_Group *tabXMLRPC=(Fl_Group *)0; Fl_Group *grpXMLRPC=(Fl_Group *)0; Fl_Check_Button *chkUSEXMLRPC=(Fl_Check_Button *)0; static void cb_chkUSEXMLRPC(Fl_Check_Button* o, void*) { progdefaults.chkUSEXMLRPCis = o->value(); if(o->value() == 1){ chkUSEHAMLIB->value(0); chkUSERIGCAT->value(0); progdefaults.chkUSEHAMLIBis = false; progdefaults.chkUSERIGCATis = false; } btnInitXMLRPC->labelcolor(FL_RED); btnInitXMLRPC->redraw_label(); progdefaults.changed = true; } Fl_Button *btnInitXMLRPC=(Fl_Button *)0; static void cb_btnInitXMLRPC(Fl_Button* o, void*) { progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true; } Fl_Group *tabSoundCard=(Fl_Group *)0; Fl_Tabs *tabsSoundCard=(Fl_Tabs *)0; Fl_Group *tabAudio=(Fl_Group *)0; Fl_Group *AudioOSS=(Fl_Group *)0; static void cb_btnAudioIO(Fl_Round_Button*, void*) { sound_update(SND_IDX_OSS); progdefaults.changed = true; resetSoundCard(); } Fl_Input_Choice *menuOSSDev=(Fl_Input_Choice *)0; static void cb_menuOSSDev(Fl_Input_Choice* o, void*) { scDevice[0] = scDevice[1] = progdefaults.OSSdevice = o->value(); resetSoundCard(); progdefaults.changed = true; } Fl_Group *AudioPort=(Fl_Group *)0; static void cb_btnAudioIO1(Fl_Round_Button*, void*) { sound_update(SND_IDX_PORT); progdefaults.changed = true; resetSoundCard(); } Fl_Choice *menuPortInDev=(Fl_Choice *)0; static void cb_menuPortInDev(Fl_Choice* o, void*) { scDevice[0] = progdefaults.PortInDevice = o->text(); progdefaults.PortInIndex = reinterpret_cast(o->mvalue()->user_data()); resetSoundCard(); progdefaults.changed = true; } Fl_Choice *menuPortOutDev=(Fl_Choice *)0; static void cb_menuPortOutDev(Fl_Choice* o, void*) { scDevice[1] = progdefaults.PortOutDevice = o->text(); progdefaults.PortOutIndex = reinterpret_cast(o->mvalue()->user_data()); resetSoundCard(); progdefaults.changed = true; } Fl_Group *AudioPulse=(Fl_Group *)0; static void cb_btnAudioIO2(Fl_Round_Button*, void*) { sound_update(SND_IDX_PULSE); progdefaults.changed = true; resetSoundCard(); } Fl_Input2 *inpPulseServer=(Fl_Input2 *)0; static void cb_inpPulseServer(Fl_Input2* o, void*) { scDevice[0] = scDevice[1] = progdefaults.PulseServer = o->value(); resetSoundCard(); progdefaults.changed = true; } Fl_Group *AudioNull=(Fl_Group *)0; Fl_Round_Button *btnAudioIO[4]={(Fl_Round_Button *)0}; static void cb_btnAudioIO3(Fl_Round_Button*, void*) { sound_update(SND_IDX_NULL); progdefaults.changed = true; resetSoundCard(); } Fl_Group *tabAudioOpt=(Fl_Group *)0; Fl_Group *grpAudioSampleRate=(Fl_Group *)0; Fl_ListBox *menuInSampleRate=(Fl_ListBox *)0; static void cb_menuInSampleRate(Fl_ListBox* o, void*) { progdefaults.in_sample_rate = o->index() > 2 ? strtol(o->value(), 0, 10) : o->index()-1; resetSoundCard(); progdefaults.changed = true; } Fl_ListBox *menuOutSampleRate=(Fl_ListBox *)0; static void cb_menuOutSampleRate(Fl_ListBox* o, void*) { progdefaults.out_sample_rate = o->index() > 2 ? strtol(o->value(), 0, 10) : o->index()-1; resetSoundCard(); progdefaults.changed = true; } Fl_ListBox *menuSampleConverter=(Fl_ListBox *)0; static void cb_menuSampleConverter(Fl_ListBox* o, void*) { if ((o->index()-1) == FLDIGI_SRC_BEST) fl_alert2("The best quality SINC interpolator has very high CPU overhead"); progdefaults.sample_converter = sample_rate_converters[o->index()-1]; resetSoundCard(); progdefaults.changed = true; o->tooltip(src_get_description(progdefaults.sample_converter)); } Fl_Spinner2 *cntRxRateCorr=(Fl_Spinner2 *)0; static void cb_cntRxRateCorr(Fl_Spinner2* o, void*) { progdefaults.RX_corr = (int)o->value(); progdefaults.changed = true; } Fl_Spinner2 *cntTxRateCorr=(Fl_Spinner2 *)0; static void cb_cntTxRateCorr(Fl_Spinner2* o, void*) { progdefaults.TX_corr = (int)o->value(); progdefaults.changed = true; } Fl_Spinner2 *cntTxOffset=(Fl_Spinner2 *)0; static void cb_cntTxOffset(Fl_Spinner2* o, void*) { progdefaults.TxOffset = (int)o->value(); progdefaults.changed = true; } Fl_Group *tabMixer=(Fl_Group *)0; Fl_Check_Button *btnMixer=(Fl_Check_Button *)0; static void cb_btnMixer(Fl_Check_Button* o, void*) { enableMixer(o->value()); progdefaults.changed = true; } Fl_ListBox *menuMix=(Fl_ListBox *)0; static void cb_menuMix(Fl_ListBox* o, void*) { progdefaults.MXdevice = o->value(); enableMixer(false); enableMixer(true); progdefaults.changed = true; } Fl_Light_Button *btnMicIn=(Fl_Light_Button *)0; static void cb_btnMicIn(Fl_Light_Button* o, void*) { if (o->value() == 1) { btnLineIn->value(0); progdefaults.LineIn = false; progdefaults.MicIn = true; setMixerInput(2); } else { setMixerInput(0); progdefaults.MicIn = false; } progdefaults.changed = true; } Fl_Light_Button *btnLineIn=(Fl_Light_Button *)0; static void cb_btnLineIn(Fl_Light_Button* o, void*) { if (o->value() == 1) { btnMicIn->value(0); progdefaults.LineIn = true; progdefaults.MicIn = false; setMixerInput(1); } else { setMixerInput(0); progdefaults.LineIn = false; } progdefaults.changed = true; } Fl_Value_Slider2 *valPCMvolume=(Fl_Value_Slider2 *)0; static void cb_valPCMvolume(Fl_Value_Slider2* o, void*) { setPCMvolume(o->value()); progdefaults.changed = true; } Fl_Group *tabAudioRightChannel=(Fl_Group *)0; Fl_Check_Button *chkForceMono=(Fl_Check_Button *)0; static void cb_chkForceMono(Fl_Check_Button* o, void*) { progdefaults.mono_audio = o->value(); progdefaults.changed = true; if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); btnQSK2->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); chkPseudoFSK2->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.ReverseAudio = false; chkReverseAudio->value(0); } resetSoundCard(); } Fl_Check_Button *chkAudioStereoOut=(Fl_Check_Button *)0; static void cb_chkAudioStereoOut(Fl_Check_Button* o, void*) { progdefaults.sig_on_right_channel = o->value(); progdefaults.changed = true; if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); btnQSK2->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); chkPseudoFSK2->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); } }; } Fl_Check_Button *chkReverseAudio=(Fl_Check_Button *)0; static void cb_chkReverseAudio(Fl_Check_Button* o, void*) { progdefaults.ReverseAudio = o->value(); progdefaults.changed = true; if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); }; } Fl_Check_Button *btnPTTrightchannel2=(Fl_Check_Button *)0; static void cb_btnPTTrightchannel2(Fl_Check_Button* o, void*) { progdefaults.PTTrightchannel = o->value(); btnPTTrightchannel->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); btnQSK2->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); chkPseudoFSK2->value(0); progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); } }; } Fl_Check_Button *btnQSK2=(Fl_Check_Button *)0; static void cb_btnQSK2(Fl_Check_Button* o, void*) { progdefaults.QSK = o->value(); btnQSK->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); } }; } Fl_Check_Button *chkPseudoFSK2=(Fl_Check_Button *)0; static void cb_chkPseudoFSK2(Fl_Check_Button* o, void*) { progdefaults.PseudoFSK = o->value(); chkPseudoFSK->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); if (progdefaults.mono_audio) { progdefaults.mono_audio = false; chkForceMono->value(0); resetSoundCard(); } }; } Fl_Group *tabWavFile=(Fl_Group *)0; Fl_ListBox *listbox_wav_samplerate=(Fl_ListBox *)0; static void cb_listbox_wav_samplerate(Fl_ListBox* o, void*) { progdefaults.wavSampleRate = o->index(); progdefaults.changed = true; } Fl_Group *tabID=(Fl_Group *)0; Fl_Tabs *tabsID=(Fl_Tabs *)0; Fl_Group *tabRsID=(Fl_Group *)0; Fl_Check_Button *chkRSidNotifyOnly=(Fl_Check_Button *)0; static void cb_chkRSidNotifyOnly(Fl_Check_Button* o, void*) { progdefaults.rsid_notify_only = o->value(); notify_create_rsid_event(progdefaults.rsid_notify_only); if (progdefaults.rsid_notify_only) { chkRetainFreqLock->deactivate(); chkDisableFreqChange->deactivate(); } else { chkRetainFreqLock->activate(); chkDisableFreqChange->activate(); } progdefaults.changed = true; } Fl_Button *bRSIDRxModes=(Fl_Button *)0; static void cb_bRSIDRxModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show(&progdefaults.rsid_rx_modes); progdefaults.changed = true; } Fl_Check_Button *chkRSidWideSearch=(Fl_Check_Button *)0; static void cb_chkRSidWideSearch(Fl_Check_Button* o, void*) { progdefaults.rsidWideSearch=o->value(); progdefaults.changed = true; } Fl_Check_Button *chkRSidMark=(Fl_Check_Button *)0; static void cb_chkRSidMark(Fl_Check_Button* o, void*) { progdefaults.rsid_mark = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkRSidAutoDisable=(Fl_Check_Button *)0; static void cb_chkRSidAutoDisable(Fl_Check_Button* o, void*) { progdefaults.rsid_auto_disable = o->value(); progdefaults.changed = true; } Fl_ListBox *listbox_rsid_errors=(Fl_ListBox *)0; static void cb_listbox_rsid_errors(Fl_ListBox* o, void*) { progdefaults.RsID_label_type = o->index(); progdefaults.changed = true; } Fl_Value_Slider2 *sldrRSIDsquelch=(Fl_Value_Slider2 *)0; static void cb_sldrRSIDsquelch(Fl_Value_Slider2* o, void*) { progdefaults.rsid_squelch = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *chkRSidShowAlert=(Fl_Check_Button *)0; static void cb_chkRSidShowAlert(Fl_Check_Button* o, void*) { progdefaults.disable_rsid_warning_dialog_box = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkRetainFreqLock=(Fl_Check_Button *)0; static void cb_chkRetainFreqLock(Fl_Check_Button* o, void*) { progdefaults.retain_freq_lock = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkDisableFreqChange=(Fl_Check_Button *)0; static void cb_chkDisableFreqChange(Fl_Check_Button* o, void*) { progdefaults.disable_rsid_freq_change = o->value(); progdefaults.changed = true; } Fl_Counter *val_pretone=(Fl_Counter *)0; static void cb_val_pretone(Fl_Counter* o, void*) { progdefaults.pretone = o->value(); progdefaults.changed = true; } Fl_Button *bRSIDTxModes=(Fl_Button *)0; static void cb_bRSIDTxModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show(&progdefaults.rsid_tx_modes); progdefaults.changed = true; } Fl_Check_Button *btn_post_rsid=(Fl_Check_Button *)0; static void cb_btn_post_rsid(Fl_Check_Button* o, void*) { progdefaults.rsid_post=o->value(); progdefaults.changed = true; } Fl_Group *tabVideoID=(Fl_Group *)0; Fl_Check_Button *btnsendid=(Fl_Check_Button *)0; static void cb_btnsendid(Fl_Check_Button* o, void*) { progdefaults.sendid=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnsendvideotext=(Fl_Check_Button *)0; static void cb_btnsendvideotext(Fl_Check_Button* o, void*) { progdefaults.sendtextid=o->value(); progdefaults.changed = true; } Fl_Input2 *valVideotext=(Fl_Input2 *)0; static void cb_valVideotext(Fl_Input2* o, void*) { progdefaults.strTextid = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkID_SMALL=(Fl_Check_Button *)0; static void cb_chkID_SMALL(Fl_Check_Button* o, void*) { progdefaults.ID_SMALL=o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *sldrVideowidth=(Fl_Value_Slider2 *)0; static void cb_sldrVideowidth(Fl_Value_Slider2* o, void*) { progdefaults.videowidth = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_vidlimit=(Fl_Check_Button *)0; static void cb_btn_vidlimit(Fl_Check_Button* o, void*) { progdefaults.vidlimit=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_vidmodelimit=(Fl_Check_Button *)0; static void cb_btn_vidmodelimit(Fl_Check_Button* o, void*) { progdefaults.vidmodelimit=o->value(); progdefaults.changed=true; } Fl_Button *bVideoIDModes=(Fl_Button *)0; static void cb_bVideoIDModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show(&progdefaults.videoid_modes); progdefaults.changed = true; } Fl_Group *tabCwID=(Fl_Group *)0; Fl_Group *sld=(Fl_Group *)0; Fl_Check_Button *btnCWID=(Fl_Check_Button *)0; static void cb_btnCWID(Fl_Check_Button* o, void*) { progdefaults.CWid = o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *sldrCWIDwpm=(Fl_Value_Slider2 *)0; static void cb_sldrCWIDwpm(Fl_Value_Slider2* o, void*) { progdefaults.CWIDwpm = (int)o->value(); progdefaults.changed = true; } Fl_Button *bCWIDModes=(Fl_Button *)0; static void cb_bCWIDModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show(&progdefaults.cwid_modes); progdefaults.changed = true; } Fl_Group *tabMisc=(Fl_Group *)0; Fl_Tabs *tabsMisc=(Fl_Tabs *)0; Fl_Group *tabCPUspeed=(Fl_Group *)0; Fl_Check_Button *chkSlowCpu=(Fl_Check_Button *)0; static void cb_chkSlowCpu(Fl_Check_Button* o, void*) { progdefaults.slowcpu = o->value(); progdefaults.changed = true; } Fl_Group *tabNBEMS=(Fl_Group *)0; Fl_Check_Button *chkAutoExtract=(Fl_Check_Button *)0; static void cb_chkAutoExtract(Fl_Check_Button* o, void*) { progdefaults.autoextract = o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_open_wrap_folder=(Fl_Check_Button *)0; static void cb_chk_open_wrap_folder(Fl_Check_Button* o, void*) { progdefaults.open_nbems_folder = o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_open_flmsg=(Fl_Check_Button *)0; static void cb_chk_open_flmsg(Fl_Check_Button* o, void*) { progdefaults.open_flmsg = o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_open_flmsg_print=(Fl_Check_Button *)0; static void cb_chk_open_flmsg_print(Fl_Check_Button* o, void*) { progdefaults.open_flmsg_print = o->value(); progdefaults.changed = true; } Fl_Input2 *txt_flmsg_pathname=(Fl_Input2 *)0; static void cb_txt_flmsg_pathname(Fl_Input2* o, void*) { progdefaults.flmsg_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_flmsg=(Fl_Button *)0; static void cb_btn_select_flmsg(Fl_Button*, void*) { select_flmsg_pathname(); } Fl_Value_Slider *sldr_extract_timeout=(Fl_Value_Slider *)0; static void cb_sldr_extract_timeout(Fl_Value_Slider* o, void*) { progdefaults.extract_timeout=o->value(); progdefaults.changed=true; } Fl_Group *tabPskmail=(Fl_Group *)0; Fl_Counter2 *cntServerCarrier=(Fl_Counter2 *)0; static void cb_cntServerCarrier(Fl_Counter2* o, void*) { progdefaults.ServerCarrier = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true; } Fl_Counter2 *cntServerOffset=(Fl_Counter2 *)0; static void cb_cntServerOffset(Fl_Counter2* o, void*) { progdefaults.ServerOffset = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true; } Fl_Counter2 *cntServerACQsn=(Fl_Counter2 *)0; static void cb_cntServerACQsn(Fl_Counter2* o, void*) { progdefaults.ServerACQsn = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntServerAFCrange=(Fl_Counter2 *)0; static void cb_cntServerAFCrange(Fl_Counter2* o, void*) { progdefaults.ServerAFCrange = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true; } Fl_Check_Button *btnPSKmailSweetSpot=(Fl_Check_Button *)0; static void cb_btnPSKmailSweetSpot(Fl_Check_Button* o, void*) { progdefaults.PSKmailSweetSpot = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_arq_s2n_report=(Fl_Check_Button *)0; static void cb_btn_arq_s2n_report(Fl_Check_Button* o, void*) { progdefaults.Pskmails2nreport=o->value(); } Fl_Group *tabSpot=(Fl_Group *)0; Fl_Check_Button *btnPSKRepAuto=(Fl_Check_Button *)0; static void cb_btnPSKRepAuto(Fl_Check_Button* o, void*) { progdefaults.pskrep_auto = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true; } Fl_Check_Button *btnPSKRepLog=(Fl_Check_Button *)0; static void cb_btnPSKRepLog(Fl_Check_Button* o, void*) { progdefaults.pskrep_log = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true; } Fl_Check_Button *btnPSKRepQRG=(Fl_Check_Button *)0; static void cb_btnPSKRepQRG(Fl_Check_Button* o, void*) { progdefaults.pskrep_qrg = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_report_when_visible=(Fl_Check_Button *)0; static void cb_btn_report_when_visible(Fl_Check_Button* o, void*) { progdefaults.report_when_visible = o->value(); progdefaults.changed = true; } Fl_Input2 *inpPSKRepHost=(Fl_Input2 *)0; static void cb_inpPSKRepHost(Fl_Input2* o, void*) { progdefaults.pskrep_host = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true; } Fl_Input2 *inpPSKRepPort=(Fl_Input2 *)0; static void cb_inpPSKRepPort(Fl_Input2* o, void*) { progdefaults.pskrep_port = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true; } Fl_Button *btnPSKRepInit=(Fl_Button *)0; static void cb_btnPSKRepInit(Fl_Button* o, void*) { pskrep_stop(); if (!pskrep_start()) { boxPSKRepMsg->copy_label(pskrep_error()); progdefaults.usepskrep = false; } else { boxPSKRepMsg->label(0); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.usepskrep = true; } progdefaults.changed = true; } Fl_Box *boxPSKRepMsg=(Fl_Box *)0; Fl_Group *tabSweetSpot=(Fl_Group *)0; Fl_Value_Input2 *valCWsweetspot=(Fl_Value_Input2 *)0; static void cb_valCWsweetspot(Fl_Value_Input2* o, void*) { progdefaults.CWsweetspot=o->value(); progdefaults.changed = true; } Fl_Value_Input2 *valRTTYsweetspot=(Fl_Value_Input2 *)0; static void cb_valRTTYsweetspot(Fl_Value_Input2* o, void*) { progdefaults.RTTYsweetspot=o->value(); progdefaults.changed = true; } Fl_Value_Input2 *valPSKsweetspot=(Fl_Value_Input2 *)0; static void cb_valPSKsweetspot(Fl_Value_Input2* o, void*) { progdefaults.PSKsweetspot=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnStartAtSweetSpot=(Fl_Check_Button *)0; static void cb_btnStartAtSweetSpot(Fl_Check_Button* o, void*) { progdefaults.StartAtSweetSpot = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWIsLSB=(Fl_Check_Button *)0; static void cb_btnCWIsLSB(Fl_Check_Button* o, void*) { progdefaults.CWIsLSB=o->value(); progdefaults.changed=true; } Fl_Group *tabText_IO=(Fl_Group *)0; Fl_Group *grpTalker=(Fl_Group *)0; Fl_Light_Button *btnConnectTalker=(Fl_Light_Button *)0; static void cb_btnConnectTalker(Fl_Light_Button* o, void*) { if (o->value()) open_talker(); else close_talker(); } Fl_Check_Button *btn_auto_talk=(Fl_Check_Button *)0; static void cb_btn_auto_talk(Fl_Check_Button* o, void*) { progdefaults.auto_talk = o->value(); } Fl_Check_Button *chkRxStream=(Fl_Check_Button *)0; static void cb_chkRxStream(Fl_Check_Button* o, void*) { progdefaults.speak = o->value(); progdefaults.changed = true; } Fl_Group *tabDTMF=(Fl_Group *)0; Fl_Check_Button *chkDTMFdecode=(Fl_Check_Button *)0; static void cb_chkDTMFdecode(Fl_Check_Button* o, void*) { progdefaults.DTMFdecode = o->value(); } Fl_Group *tabWX=(Fl_Group *)0; Fl_Input *inpWXsta=(Fl_Input *)0; static void cb_inpWXsta(Fl_Input* o, void*) { progdefaults.wx_sta = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_full=(Fl_Check_Button *)0; static void cb_btn_wx_full(Fl_Check_Button* o, void*) { progdefaults.wx_full=o->value(); progdefaults.changed = true; } static void cb_End(Fl_Input* o, void*) { progdefaults.wx_eoh = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_station_name=(Fl_Check_Button *)0; static void cb_btn_wx_station_name(Fl_Check_Button* o, void*) { progdefaults.wx_station_name = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_condx=(Fl_Check_Button *)0; static void cb_btn_wx_condx(Fl_Check_Button* o, void*) { progdefaults.wx_condx=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_fahrenheit=(Fl_Check_Button *)0; static void cb_btn_wx_fahrenheit(Fl_Check_Button* o, void*) { progdefaults.wx_fahrenheit=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_celsius=(Fl_Check_Button *)0; static void cb_btn_wx_celsius(Fl_Check_Button* o, void*) { progdefaults.wx_celsius=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_mph=(Fl_Check_Button *)0; static void cb_btn_wx_mph(Fl_Check_Button* o, void*) { progdefaults.wx_mph=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_kph=(Fl_Check_Button *)0; static void cb_btn_wx_kph(Fl_Check_Button* o, void*) { progdefaults.wx_kph=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_inches=(Fl_Check_Button *)0; static void cb_btn_wx_inches(Fl_Check_Button* o, void*) { progdefaults.wx_inches=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_mbars=(Fl_Check_Button *)0; static void cb_btn_wx_mbars(Fl_Check_Button* o, void*) { progdefaults.wx_mbars=o->value(); progdefaults.changed = true; } Fl_Button *btn_metar_search=(Fl_Button *)0; static void cb_btn_metar_search(Fl_Button*, void*) { get_METAR_station(); } Fl_Group *tabKML=(Fl_Group *)0; Fl_Input *btnKmlSaveDir=(Fl_Input *)0; static void cb_btnKmlSaveDir(Fl_Input* o, void*) { progdefaults.kml_save_dir=o->value(); progdefaults.changed = true; kml_init(); } Fl_Input *inputKmlRootFile=(Fl_Input *)0; Fl_Counter *cntKmlMergeDistance=(Fl_Counter *)0; static void cb_cntKmlMergeDistance(Fl_Counter* o, void*) { progdefaults.kml_merge_distance = o->value(); progdefaults.changed = true; kml_init(); } Fl_Counter *cntKmlRetentionTime=(Fl_Counter *)0; static void cb_cntKmlRetentionTime(Fl_Counter* o, void*) { progdefaults.kml_retention_time = o->value(); progdefaults.changed = true; kml_init(); } Fl_Spinner2 *cntKmlRefreshInterval=(Fl_Spinner2 *)0; static void cb_cntKmlRefreshInterval(Fl_Spinner2* o, void*) { progdefaults.kml_refresh_interval = (int)(o->value()); progdefaults.changed = true; kml_init(); } Fl_ListBox *listbox_kml_balloon_style=(Fl_ListBox *)0; static void cb_listbox_kml_balloon_style(Fl_ListBox* o, void*) { progdefaults.kml_balloon_style = o->index(); progdefaults.changed = true; kml_init(); } Fl_Input *btnKmlCommand=(Fl_Input *)0; static void cb_btnKmlCommand(Fl_Input* o, void*) { progdefaults.kml_command=o->value(); progdefaults.changed = true; kml_init(); } Fl_Button *btlTestKmlCommand=(Fl_Button *)0; static void cb_btlTestKmlCommand(Fl_Button*, void*) { KmlServer::SpawnProcess(); } Fl_Button *btnSelectKmlDestDir=(Fl_Button *)0; static void cb_btnSelectKmlDestDir(Fl_Button*, void*) { Fl_File_Chooser *fc = new Fl_File_Chooser(".",NULL,Fl_File_Chooser::DIRECTORY,"Input File"); fc->callback(KmlDestDirSet); fc->show(); } Fl_Button *btlPurge=(Fl_Button *)0; static void cb_btlPurge(Fl_Button*, void*) { KmlServer::GetInstance()->Reset(); } Fl_Check_Button *btnKmlPurgeOnStartup=(Fl_Check_Button *)0; static void cb_btnKmlPurgeOnStartup(Fl_Check_Button* o, void*) { progdefaults.kml_purge_on_startup = o->value(); progdefaults.changed = true; } Fl_Group *tabQRZ=(Fl_Group *)0; Fl_Tabs *tabsQRZ=(Fl_Tabs *)0; Fl_Round_Button *btnQRZWEBnotavailable=(Fl_Round_Button *)0; static void cb_btnQRZWEBnotavailable(Fl_Round_Button* o, void*) { set_qrzweb_buttons(o); progdefaults.QRZWEB = QRZWEBNONE; progdefaults.changed = true; } Fl_Round_Button *btnQRZonline=(Fl_Round_Button *)0; static void cb_btnQRZonline(Fl_Round_Button* o, void*) { set_qrzweb_buttons(o); progdefaults.QRZWEB = QRZHTML; progdefaults.changed = true; } Fl_Round_Button *btnHAMCALLonline=(Fl_Round_Button *)0; static void cb_btnHAMCALLonline(Fl_Round_Button* o, void*) { set_qrzweb_buttons(o); progdefaults.QRZWEB = HAMCALLHTML; progdefaults.changed = true; } Fl_Round_Button *btnHamQTHonline=(Fl_Round_Button *)0; static void cb_btnHamQTHonline(Fl_Round_Button* o, void*) { set_qrzweb_buttons(o); progdefaults.QRZWEB = HAMQTHHTML; progdefaults.changed = true; } Fl_Round_Button *btnQRZXMLnotavailable=(Fl_Round_Button *)0; static void cb_btnQRZXMLnotavailable(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = QRZXMLNONE; progdefaults.changed = true; } Fl_Round_Button *btnQRZcdrom=(Fl_Round_Button *)0; static void cb_btnQRZcdrom(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = QRZCD; progdefaults.changed = true; } Fl_Round_Button *btnQRZsub=(Fl_Round_Button *)0; static void cb_btnQRZsub(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = QRZNET; progdefaults.changed = true; } Fl_Round_Button *btnHamcall=(Fl_Round_Button *)0; static void cb_btnHamcall(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = HAMCALLNET; progdefaults.changed = true; } Fl_Round_Button *btnHamQTH=(Fl_Round_Button *)0; static void cb_btnHamQTH(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = HAMQTH; progdefaults.changed = true; } Fl_Round_Button *btnCALLOOK=(Fl_Round_Button *)0; static void cb_btnCALLOOK(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = CALLOOK; progdefaults.changed = true; } Fl_Input2 *txtQRZpathname=(Fl_Input2 *)0; static void cb_txtQRZpathname(Fl_Input2* o, void*) { progdefaults.QRZpathname = o->value(); progdefaults.QRZchanged = true; progdefaults.changed = true; } Fl_Input2 *inpQRZusername=(Fl_Input2 *)0; static void cb_inpQRZusername(Fl_Input2* o, void*) { progdefaults.QRZusername = o->value(); progdefaults.changed = true; } Fl_Input2 *inpQRZuserpassword=(Fl_Input2 *)0; static void cb_inpQRZuserpassword(Fl_Input2* o, void*) { progdefaults.QRZuserpassword = o->value(); progdefaults.changed = true; } Fl_Button *btnQRZpasswordShow=(Fl_Button *)0; static void cb_btnQRZpasswordShow(Fl_Button* o, void*) { inpQRZuserpassword->type(inpQRZuserpassword->type() ^ FL_SECRET_INPUT); inpQRZuserpassword->redraw(); o->label((inpQRZuserpassword->type() & FL_SECRET_INPUT) ? "Show" : "Hide"); } Fl_Check_Button *btn_notes_address=(Fl_Check_Button *)0; static void cb_btn_notes_address(Fl_Check_Button* o, void*) { progdefaults.notes_address = o->value(); progdefaults.changed = true; } Fl_Input2 *inpEQSL_id=(Fl_Input2 *)0; static void cb_inpEQSL_id(Fl_Input2* o, void*) { progdefaults.eqsl_id = o->value(); progdefaults.changed = true; } Fl_Input2 *inpEQSL_pwd=(Fl_Input2 *)0; static void cb_inpEQSL_pwd(Fl_Input2* o, void*) { progdefaults.eqsl_pwd = o->value(); progdefaults.changed = true; } Fl_Button *btnEQSL_pwd_show=(Fl_Button *)0; static void cb_btnEQSL_pwd_show(Fl_Button* o, void*) { inpEQSL_pwd->type(inpEQSL_pwd->type() ^ FL_SECRET_INPUT); inpEQSL_pwd->redraw(); o->label((inpEQSL_pwd->type() & FL_SECRET_INPUT) ? "Show" : "Hide"); } Fl_Input2 *inpEQSL_nick=(Fl_Input2 *)0; static void cb_inpEQSL_nick(Fl_Input2* o, void*) { progdefaults.eqsl_nick = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_send_when_logged=(Fl_Check_Button *)0; static void cb_btn_send_when_logged(Fl_Check_Button* o, void*) { progdefaults.eqsl_when_logged = o->value(); progdefaults.changed = true; } Fl_Input2 *txt_eqsl_default_message=(Fl_Input2 *)0; static void cb_txt_eqsl_default_message(Fl_Input2* o, void*) { progdefaults.eqsl_default_message = o->value(); progdefaults.changed = true; } Fl_Box *eqsl_txt1=(Fl_Box *)0; Fl_Box *eqsl_txt2=(Fl_Box *)0; Fl_Box *eqsl_txt3=(Fl_Box *)0; Fl_Check_Button *btn_send_datetime_off=(Fl_Check_Button *)0; static void cb_btn_send_datetime_off(Fl_Check_Button* o, void*) { progdefaults.eqsl_datetime_off = o->value(); progdefaults.changed = true; } Fl_Group *tabAutoStart=(Fl_Group *)0; static void cb_tabAutoStart(Fl_Group*, void*) { progdefaults.changed = true; } Fl_Input2 *txt_auto_flrig_pathname=(Fl_Input2 *)0; static void cb_txt_auto_flrig_pathname(Fl_Input2* o, void*) { progdefaults.auto_flrig_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_flrig=(Fl_Button *)0; static void cb_btn_select_flrig(Fl_Button*, void*) { std::string str = select_binary_pathname("flrig"); txt_auto_flrig_pathname->value(str.c_str()); progdefaults.auto_flrig_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_flamp_pathname=(Fl_Input2 *)0; static void cb_txt_auto_flamp_pathname(Fl_Input2* o, void*) { progdefaults.auto_flamp_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_auto_flamp=(Fl_Button *)0; static void cb_btn_select_auto_flamp(Fl_Button*, void*) { std::string str = select_binary_pathname("flamp"); txt_auto_flamp_pathname->value(str.c_str()); progdefaults.auto_flamp_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_flnet_pathname=(Fl_Input2 *)0; static void cb_txt_auto_flnet_pathname(Fl_Input2* o, void*) { progdefaults.flnet_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_auto_flnet=(Fl_Button *)0; static void cb_btn_select_auto_flnet(Fl_Button*, void*) { std::string str = select_binary_pathname("flnet"); txt_auto_flnet_pathname->value(str.c_str()); progdefaults.auto_flnet_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_fllog_pathname=(Fl_Input2 *)0; static void cb_txt_auto_fllog_pathname(Fl_Input2* o, void*) { progdefaults.auto_fllog_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_fllog=(Fl_Button *)0; static void cb_btn_select_fllog(Fl_Button*, void*) { std::string str = select_binary_pathname("fllog"); txt_auto_fllog_pathname->value(str.c_str()); progdefaults.auto_fllog_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_prog1_pathname=(Fl_Input2 *)0; static void cb_txt_auto_prog1_pathname(Fl_Input2* o, void*) { progdefaults.auto_prog1_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_prog1=(Fl_Button *)0; static void cb_btn_select_prog1(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_prog1_pathname); txt_auto_prog1_pathname->value(str.c_str()); progdefaults.auto_prog1_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_prog2_pathname=(Fl_Input2 *)0; static void cb_txt_auto_prog2_pathname(Fl_Input2* o, void*) { progdefaults.auto_prog2_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_prog2=(Fl_Button *)0; static void cb_btn_select_prog2(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_prog2_pathname); txt_auto_prog2_pathname->value(str.c_str()); progdefaults.auto_prog2_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_prog3_pathname=(Fl_Input2 *)0; static void cb_txt_auto_prog3_pathname(Fl_Input2* o, void*) { progdefaults.auto_prog3_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_prog3=(Fl_Button *)0; static void cb_btn_select_prog3(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_prog3_pathname); txt_auto_prog3_pathname->value(str.c_str()); progdefaults.auto_prog3_pathname = str; progdefaults.changed = true; } Fl_Check_Button *btn_flrig_auto_enable=(Fl_Check_Button *)0; static void cb_btn_flrig_auto_enable(Fl_Check_Button* o, void*) { progdefaults.flrig_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_flamp_auto_enable=(Fl_Check_Button *)0; static void cb_btn_flamp_auto_enable(Fl_Check_Button* o, void*) { progdefaults.flamp_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_flnet_auto_enable=(Fl_Check_Button *)0; static void cb_btn_flnet_auto_enable(Fl_Check_Button* o, void*) { progdefaults.flnet_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_fllog_auto_enable=(Fl_Check_Button *)0; static void cb_btn_fllog_auto_enable(Fl_Check_Button* o, void*) { progdefaults.fllog_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_prog1_auto_enable=(Fl_Check_Button *)0; static void cb_btn_prog1_auto_enable(Fl_Check_Button* o, void*) { progdefaults.prog1_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_prog2_auto_enable=(Fl_Check_Button *)0; static void cb_btn_prog2_auto_enable(Fl_Check_Button* o, void*) { progdefaults.prog2_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_prog3_auto_enable=(Fl_Check_Button *)0; static void cb_btn_prog3_auto_enable(Fl_Check_Button* o, void*) { progdefaults.prog3_auto_enable = o->value(); progdefaults.changed = true; } Fl_Button *btn_test_flrig=(Fl_Button *)0; static void cb_btn_test_flrig(Fl_Button*, void*) { start_process(progdefaults.auto_flrig_pathname); } Fl_Button *btn_test_flamp=(Fl_Button *)0; static void cb_btn_test_flamp(Fl_Button*, void*) { start_process(progdefaults.auto_flamp_pathname); } Fl_Button *btn_test_flnet=(Fl_Button *)0; static void cb_btn_test_flnet(Fl_Button*, void*) { start_process(progdefaults.auto_flnet_pathname); } Fl_Button *btn_test_fllog=(Fl_Button *)0; static void cb_btn_test_fllog(Fl_Button*, void*) { start_process(progdefaults.auto_fllog_pathname); } Fl_Button *btn_test_prog1=(Fl_Button *)0; static void cb_btn_test_prog1(Fl_Button*, void*) { start_process(progdefaults.auto_prog1_pathname); } Fl_Button *btn_test_prog2=(Fl_Button *)0; static void cb_btn_test_prog2(Fl_Button*, void*) { start_process(progdefaults.auto_prog2_pathname); } Fl_Button *btn_test_prog3=(Fl_Button *)0; static void cb_btn_test_prog3(Fl_Button*, void*) { start_process(progdefaults.auto_prog3_pathname); } Fl_Button *btnSaveConfig=(Fl_Button *)0; static void cb_btnSaveConfig(Fl_Button*, void*) { progdefaults.saveDefaults(); } Fl_Return_Button *btnCloseConfig=(Fl_Return_Button *)0; static void cb_btnCloseConfig(Fl_Return_Button*, void*) { closeDialog(); } Fl_Button *btnResetConfig=(Fl_Button *)0; static void cb_btnResetConfig(Fl_Button*, void*) { progdefaults.resetDefaults(); progdefaults.changed = false; } Fl_Double_Window* ConfigureDialog() { Fl_Double_Window* w; font_browser = new Font_Browser; static const char szShifts[] = "23|85|160|170|182|200|240|350|425|850|Custom"; static const char szBauds[] = "45|45.45|50|56|75|100|110|150|200|300"; static const char szSelBits[] = "5 (baudot)|7 (ascii)|8 (ascii)"; static const char szParity[] = "none|even|odd|zero|one"; static const char szStopBits[] = "1|1.5|2"; static const char szOliviaTones[] = "2|4|8|16|32|64|128|256"; static const char szOliviaBandwidth[] = "125|250|500|1000|2000"; static const char szContestiaTones[] = "2|4|8|16|32|64|128|256"; static const char szContestiaBandwidth[] = "125|250|500|1000|2000"; static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600|115200|230400|460800"; static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| "; { Fl_Double_Window* o = new Fl_Double_Window(600, 415, _("Fldigi configuration")); w = o; o->color(FL_DARK2); o->selection_color((Fl_Color)51); o->labelsize(18); o->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE)); { tabsConfigure = new Fl_Tabs(0, 0, 600, 380); tabsConfigure->color(FL_LIGHT1); tabsConfigure->selection_color(FL_LIGHT1); { tabOperator = new Fl_Group(0, 25, 600, 355, _("Operator")); tabOperator->tooltip(_("Operator information")); tabOperator->callback((Fl_Callback*)cb_tabOperator); tabOperator->when(FL_WHEN_CHANGED); { Fl_Group* o = new Fl_Group(55, 35, 490, 170, _("Station")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { inpMyCallsign = new Fl_Input2(160, 64, 110, 24, _("Callsign:")); inpMyCallsign->tooltip(_("Operators callsign")); inpMyCallsign->box(FL_DOWN_BOX); inpMyCallsign->color(FL_BACKGROUND2_COLOR); inpMyCallsign->selection_color(FL_SELECTION_COLOR); inpMyCallsign->labeltype(FL_NORMAL_LABEL); inpMyCallsign->labelfont(0); inpMyCallsign->labelsize(14); inpMyCallsign->labelcolor(FL_FOREGROUND_COLOR); inpMyCallsign->callback((Fl_Callback*)cb_inpMyCallsign); inpMyCallsign->align(Fl_Align(FL_ALIGN_LEFT)); inpMyCallsign->when(FL_WHEN_RELEASE); inpMyCallsign->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyCallsign { inpMyName = new Fl_Input2(340, 64, 140, 24, _("Name:")); inpMyName->tooltip(_("Operators name")); inpMyName->box(FL_DOWN_BOX); inpMyName->color(FL_BACKGROUND2_COLOR); inpMyName->selection_color(FL_SELECTION_COLOR); inpMyName->labeltype(FL_NORMAL_LABEL); inpMyName->labelfont(0); inpMyName->labelsize(14); inpMyName->labelcolor(FL_FOREGROUND_COLOR); inpMyName->callback((Fl_Callback*)cb_inpMyName); inpMyName->align(Fl_Align(FL_ALIGN_LEFT)); inpMyName->when(FL_WHEN_RELEASE); inpMyName->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyName { inpMyQth = new Fl_Input2(160, 98, 320, 24, _("QTH:")); inpMyQth->tooltip(_("Operators QTH")); inpMyQth->box(FL_DOWN_BOX); inpMyQth->color(FL_BACKGROUND2_COLOR); inpMyQth->selection_color(FL_SELECTION_COLOR); inpMyQth->labeltype(FL_NORMAL_LABEL); inpMyQth->labelfont(0); inpMyQth->labelsize(14); inpMyQth->labelcolor(FL_FOREGROUND_COLOR); inpMyQth->callback((Fl_Callback*)cb_inpMyQth); inpMyQth->align(Fl_Align(FL_ALIGN_LEFT)); inpMyQth->when(FL_WHEN_RELEASE); inpMyQth->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyQth { inpMyLocator = new Fl_Input2(160, 133, 85, 24, _("Locator:")); inpMyLocator->tooltip(_("Maidenhead locator as in EM64qv")); inpMyLocator->box(FL_DOWN_BOX); inpMyLocator->color(FL_BACKGROUND2_COLOR); inpMyLocator->selection_color(FL_SELECTION_COLOR); inpMyLocator->labeltype(FL_NORMAL_LABEL); inpMyLocator->labelfont(0); inpMyLocator->labelsize(14); inpMyLocator->labelcolor(FL_FOREGROUND_COLOR); inpMyLocator->callback((Fl_Callback*)cb_inpMyLocator); inpMyLocator->align(Fl_Align(FL_ALIGN_LEFT)); inpMyLocator->when(FL_WHEN_RELEASE); inpMyLocator->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyLocator o->end(); } // Fl_Group* o { inpMyAntenna = new Fl_Input2(160, 167, 320, 24, _("Antenna:")); inpMyAntenna->tooltip(_("Short description of antenna")); inpMyAntenna->box(FL_DOWN_BOX); inpMyAntenna->color(FL_BACKGROUND2_COLOR); inpMyAntenna->selection_color(FL_SELECTION_COLOR); inpMyAntenna->labeltype(FL_NORMAL_LABEL); inpMyAntenna->labelfont(0); inpMyAntenna->labelsize(14); inpMyAntenna->labelcolor(FL_FOREGROUND_COLOR); inpMyAntenna->callback((Fl_Callback*)cb_inpMyAntenna); inpMyAntenna->align(Fl_Align(FL_ALIGN_LEFT)); inpMyAntenna->when(FL_WHEN_RELEASE); inpMyAntenna->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyAntenna { grpNoise = new Fl_Group(55, 231, 490, 114, _("Test Signal - Do NOT use with transmitter")); grpNoise->box(FL_ENGRAVED_FRAME); grpNoise->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); grpNoise->hide(); { Fl_Check_Button* o = btnNoiseOn = new Fl_Check_Button(93, 269, 70, 15, _("Noise on")); btnNoiseOn->down_box(FL_DOWN_BOX); btnNoiseOn->callback((Fl_Callback*)cb_btnNoiseOn); btnNoiseOn->deactivate(); o->value(progdefaults.noise); } // Fl_Check_Button* btnNoiseOn { Fl_Counter2* o = noiseDB = new Fl_Counter2(90, 307, 89, 21, _("dB")); noiseDB->type(1); noiseDB->box(FL_UP_BOX); noiseDB->color(FL_BACKGROUND_COLOR); noiseDB->selection_color(FL_INACTIVE_COLOR); noiseDB->labeltype(FL_NORMAL_LABEL); noiseDB->labelfont(0); noiseDB->labelsize(14); noiseDB->labelcolor(FL_FOREGROUND_COLOR); noiseDB->minimum(-18); noiseDB->maximum(60); noiseDB->step(1); noiseDB->value(20); noiseDB->callback((Fl_Callback*)cb_noiseDB); noiseDB->align(Fl_Align(FL_ALIGN_LEFT)); noiseDB->when(FL_WHEN_CHANGED); noiseDB->deactivate(); o->value(progdefaults.s2n); } // Fl_Counter2* noiseDB grpNoise->end(); } // Fl_Group* grpNoise tabOperator->end(); } // Fl_Group* tabOperator { tabUI = new Fl_Group(0, 25, 600, 355, _("UI")); tabUI->hide(); { tabsUI = new Fl_Tabs(0, 25, 600, 355); tabsUI->selection_color(FL_LIGHT1); { tabBrowser = new Fl_Group(0, 50, 600, 330, _("Browser")); { Fl_Group* o = new Fl_Group(30, 65, 540, 300); o->box(FL_ENGRAVED_FRAME); { Fl_Spinner2* o = cntChannels = new Fl_Spinner2(46, 75, 50, 24, _("Channels, first channel starts at waterfall lower limit")); cntChannels->tooltip(_("Change # of psk viewer channels")); cntChannels->box(FL_NO_BOX); cntChannels->color(FL_BACKGROUND_COLOR); cntChannels->selection_color(FL_BACKGROUND_COLOR); cntChannels->labeltype(FL_NORMAL_LABEL); cntChannels->labelfont(0); cntChannels->labelsize(14); cntChannels->labelcolor(FL_FOREGROUND_COLOR); cntChannels->maximum(30); cntChannels->value(30); cntChannels->callback((Fl_Callback*)cb_cntChannels); cntChannels->align(Fl_Align(FL_ALIGN_RIGHT)); cntChannels->when(FL_WHEN_RELEASE); o->minimum(5); o->maximum(30); o->step(1); o->value(progdefaults.VIEWERchannels); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntChannels { Fl_Spinner2* o = cntTimeout = new Fl_Spinner2(46, 111, 50, 24, _("Inactivity timeout")); cntTimeout->tooltip(_("Clear channel text after\n# seconds of inactivity")); cntTimeout->box(FL_NO_BOX); cntTimeout->color(FL_BACKGROUND_COLOR); cntTimeout->selection_color(FL_BACKGROUND_COLOR); cntTimeout->labeltype(FL_NORMAL_LABEL); cntTimeout->labelfont(0); cntTimeout->labelsize(14); cntTimeout->labelcolor(FL_FOREGROUND_COLOR); cntTimeout->value(10); cntTimeout->callback((Fl_Callback*)cb_cntTimeout); cntTimeout->align(Fl_Align(FL_ALIGN_RIGHT)); cntTimeout->when(FL_WHEN_RELEASE); o->minimum(1); o->maximum(180); o->step(1); o->value(progdefaults.VIEWERtimeout); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntTimeout { Fl_ListBox* o = listboxViewerLabel = new Fl_ListBox(46, 151, 150, 24, _("Channel label")); listboxViewerLabel->tooltip(_("Appearance of label on each channel")); listboxViewerLabel->box(FL_DOWN_BOX); listboxViewerLabel->color(FL_BACKGROUND2_COLOR); listboxViewerLabel->selection_color(FL_BACKGROUND_COLOR); listboxViewerLabel->labeltype(FL_NORMAL_LABEL); listboxViewerLabel->labelfont(0); listboxViewerLabel->labelsize(14); listboxViewerLabel->labelcolor(FL_FOREGROUND_COLOR); listboxViewerLabel->callback((Fl_Callback*)cb_listboxViewerLabel); listboxViewerLabel->align(Fl_Align(FL_ALIGN_RIGHT)); listboxViewerLabel->when(FL_WHEN_RELEASE); listboxViewerLabel->add(_("None")); listboxViewerLabel->add(_("Audio frequency")); listboxViewerLabel->add(_("Radio frequency")); listboxViewerLabel->add(_("Channel number")); listboxViewerLabel->index(progdefaults.VIEWERlabeltype); o->labelsize(FL_NORMAL_SIZE); listboxViewerLabel->end(); } // Fl_ListBox* listboxViewerLabel { btnViewerFont = new Fl_Button(331, 151, 70, 24, _("Font...")); btnViewerFont->tooltip(_("select browser font")); btnViewerFont->callback((Fl_Callback*)cb_btnViewerFont); } // Fl_Button* btnViewerFont { Fl_Check_Button* o = btnFixedIntervals = new Fl_Check_Button(236, 137, 165, 20, _("Fixed Intervals")); btnFixedIntervals->tooltip(_("Force channel spacing to even 100 Hz increments")); btnFixedIntervals->down_box(FL_DOWN_BOX); btnFixedIntervals->value(1); btnFixedIntervals->callback((Fl_Callback*)cb_btnFixedIntervals); btnFixedIntervals->hide(); o->value(progdefaults.VIEWERfixed); } // Fl_Check_Button* btnFixedIntervals { Fl_Check_Button* o = btnMarquee = new Fl_Check_Button(46, 189, 165, 20, _("Continuous scrolling")); btnMarquee->tooltip(_("ON - Marquee style\nOFF - Clear & restart")); btnMarquee->down_box(FL_DOWN_BOX); btnMarquee->callback((Fl_Callback*)cb_btnMarquee); o->value(progdefaults.VIEWERmarquee); } // Fl_Check_Button* btnMarquee { Fl_Check_Button* o = btnAscend = new Fl_Check_Button(46, 213, 253, 20, _("Lowest freq on bottom of viewer")); btnAscend->tooltip(_("Change positions of low to high channels")); btnAscend->down_box(FL_DOWN_BOX); btnAscend->callback((Fl_Callback*)cb_btnAscend); o->value(progdefaults.VIEWERascend); } // Fl_Check_Button* btnAscend { Fl_Check_Button* o = btnBrowserHistory = new Fl_Check_Button(46, 238, 356, 20, _("Play back history when active channel selected")); btnBrowserHistory->tooltip(_("Audio stream history decoded on selected signal")); btnBrowserHistory->down_box(FL_DOWN_BOX); btnBrowserHistory->callback((Fl_Callback*)cb_btnBrowserHistory); o->value(progdefaults.VIEWERhistory); } // Fl_Check_Button* btnBrowserHistory { Fl_Group* o = new Fl_Group(40, 287, 144, 60, _("Detection Level")); o->box(FL_ENGRAVED_FRAME); { bwsrSliderColor = new Fl_Button(47, 310, 60, 24, _("Backgnd")); bwsrSliderColor->tooltip(_("Background color of signal viewer squelch control")); bwsrSliderColor->callback((Fl_Callback*)cb_bwsrSliderColor); bwsrSliderColor->align(Fl_Align(FL_ALIGN_TOP)); bwsrSliderColor->color(fl_rgb_color(progdefaults.bwsrSliderColor.R, progdefaults.bwsrSliderColor.G,progdefaults.bwsrSliderColor.B)); } // Fl_Button* bwsrSliderColor { bwsrSldrSelColor = new Fl_Button(115, 310, 60, 24, _("Button")); bwsrSldrSelColor->tooltip(_("Slider hilite color of signal viewer squelch control")); bwsrSldrSelColor->callback((Fl_Callback*)cb_bwsrSldrSelColor); bwsrSldrSelColor->align(Fl_Align(FL_ALIGN_TOP)); bwsrSldrSelColor->color(fl_rgb_color(progdefaults.bwsrSldrSelColor.R, progdefaults.bwsrSldrSelColor.G,progdefaults.bwsrSliderColor.B)); } // Fl_Button* bwsrSldrSelColor o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(192, 287, 326, 60, _("Browser Line Colors")); o->box(FL_ENGRAVED_FRAME); { bwsrHiLite_1_color = new Fl_Button(198, 309, 60, 24, _("HiLite 1")); bwsrHiLite_1_color->tooltip(_("PSK/RTTY Viewer HiLite Color 1")); bwsrHiLite_1_color->callback((Fl_Callback*)cb_bwsrHiLite_1_color); bwsrHiLite_1_color->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_1_color->color((Fl_Color)progdefaults.bwsrHiLight1); } // Fl_Button* bwsrHiLite_1_color { bwsrHiLite_2_color = new Fl_Button(261, 309, 60, 24, _("HiLite 2")); bwsrHiLite_2_color->tooltip(_("PSK/RTTY Viewer HiLite Color 2")); bwsrHiLite_2_color->callback((Fl_Callback*)cb_bwsrHiLite_2_color); bwsrHiLite_2_color->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_2_color->color((Fl_Color)progdefaults.bwsrHiLight2); } // Fl_Button* bwsrHiLite_2_color { bwsrHiLite_even_lines = new Fl_Button(324, 309, 60, 24, _("Even")); bwsrHiLite_even_lines->tooltip(_("Even lines")); bwsrHiLite_even_lines->callback((Fl_Callback*)cb_bwsrHiLite_even_lines); bwsrHiLite_even_lines->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_even_lines->color((Fl_Color)progdefaults.bwsrBackgnd2); } // Fl_Button* bwsrHiLite_even_lines { bwsrHiLite_odd_lines = new Fl_Button(387, 309, 60, 24, _("Odd")); bwsrHiLite_odd_lines->tooltip(_("Odd lines")); bwsrHiLite_odd_lines->callback((Fl_Callback*)cb_bwsrHiLite_odd_lines); bwsrHiLite_odd_lines->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_odd_lines->color((Fl_Color)progdefaults.bwsrBackgnd1); } // Fl_Button* bwsrHiLite_odd_lines { bwsrHiLite_select = new Fl_Button(451, 309, 60, 24, _("Select")); bwsrHiLite_select->tooltip(_("Select line")); bwsrHiLite_select->callback((Fl_Callback*)cb_bwsrHiLite_select); bwsrHiLite_select->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_select->color((Fl_Color)progdefaults.bwsrSelect); } // Fl_Button* bwsrHiLite_select o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o tabBrowser->end(); } // Fl_Group* tabBrowser { tabContest = new Fl_Group(0, 50, 600, 330, _("Contest")); tabContest->hide(); { Fl_Group* o = new Fl_Group(55, 70, 490, 80, _("Exchanges")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { lblSend = new Fl_Box(87, 105, 55, 20, _("Send:")); } // Fl_Box* lblSend { Fl_Input2* o = inpSend1 = new Fl_Input2(145, 105, 140, 20, _("Exchange Out")); inpSend1->tooltip(_("free form exchange")); inpSend1->box(FL_DOWN_BOX); inpSend1->color(FL_BACKGROUND2_COLOR); inpSend1->selection_color(FL_SELECTION_COLOR); inpSend1->labeltype(FL_NORMAL_LABEL); inpSend1->labelfont(0); inpSend1->labelsize(14); inpSend1->labelcolor(FL_FOREGROUND_COLOR); inpSend1->callback((Fl_Callback*)cb_inpSend1); inpSend1->align(Fl_Align(FL_ALIGN_TOP)); inpSend1->when(FL_WHEN_RELEASE); o->value(progdefaults.myXchg.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpSend1 { Fl_Check_Button* o = btn599 = new Fl_Check_Button(360, 90, 130, 20, _("RST always 599")); btn599->tooltip(_("Force RST in/out to 599")); btn599->down_box(FL_DOWN_BOX); btn599->callback((Fl_Callback*)cb_btn599); o->value(progdefaults.fixed599); } // Fl_Check_Button* btn599 { Fl_Check_Button* o = btnCutNbrs = new Fl_Check_Button(360, 120, 180, 20, _("Send CW cut numbers")); btnCutNbrs->tooltip(_("0 = T; 9 = N")); btnCutNbrs->down_box(FL_DOWN_BOX); btnCutNbrs->callback((Fl_Callback*)cb_btnCutNbrs); o->value(progdefaults.cutnbrs); } // Fl_Check_Button* btnCutNbrs o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 160, 490, 65, _("Serial number")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnUseLeadingZeros = new Fl_Check_Button(76, 186, 154, 20, _("Use leading zeros")); btnUseLeadingZeros->tooltip(_("Insert leading zeros into Xmtd serial number")); btnUseLeadingZeros->down_box(FL_DOWN_BOX); btnUseLeadingZeros->value(1); btnUseLeadingZeros->callback((Fl_Callback*)cb_btnUseLeadingZeros); } // Fl_Check_Button* btnUseLeadingZeros { Fl_Value_Input2* o = nbrContestStart = new Fl_Value_Input2(271, 186, 45, 20, _("Start")); nbrContestStart->tooltip(_("Starting number")); nbrContestStart->box(FL_DOWN_BOX); nbrContestStart->color(FL_BACKGROUND2_COLOR); nbrContestStart->selection_color(FL_SELECTION_COLOR); nbrContestStart->labeltype(FL_NORMAL_LABEL); nbrContestStart->labelfont(0); nbrContestStart->labelsize(14); nbrContestStart->labelcolor(FL_FOREGROUND_COLOR); nbrContestStart->maximum(10000); nbrContestStart->step(1); nbrContestStart->callback((Fl_Callback*)cb_nbrContestStart); nbrContestStart->align(Fl_Align(FL_ALIGN_TOP)); nbrContestStart->when(FL_WHEN_CHANGED); o->value(progdefaults.ContestStart); } // Fl_Value_Input2* nbrContestStart { nbrContestDigits = new Fl_Value_Input2(353, 185, 45, 20, _("Digits")); nbrContestDigits->tooltip(_("Number of digits in serial number")); nbrContestDigits->box(FL_DOWN_BOX); nbrContestDigits->color(FL_BACKGROUND2_COLOR); nbrContestDigits->selection_color(FL_SELECTION_COLOR); nbrContestDigits->labeltype(FL_NORMAL_LABEL); nbrContestDigits->labelfont(0); nbrContestDigits->labelsize(14); nbrContestDigits->labelcolor(FL_FOREGROUND_COLOR); nbrContestDigits->minimum(1); nbrContestDigits->maximum(5); nbrContestDigits->step(1); nbrContestDigits->value(3); nbrContestDigits->callback((Fl_Callback*)cb_nbrContestDigits); nbrContestDigits->align(Fl_Align(FL_ALIGN_TOP)); nbrContestDigits->when(FL_WHEN_CHANGED); } // Fl_Value_Input2* nbrContestDigits { btnResetSerNbr = new Fl_Button(445, 186, 70, 20, _("Reset")); btnResetSerNbr->tooltip(_("Initialize the QSO logging fields")); btnResetSerNbr->callback((Fl_Callback*)cb_btnResetSerNbr); } // Fl_Button* btnResetSerNbr o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 235, 490, 130, _("Duplicate check, CALL plus")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Light_Button* o = btnDupCheckOn = new Fl_Light_Button(65, 265, 74, 20, _("On/Off")); btnDupCheckOn->tooltip(_("Check for duplicates")); btnDupCheckOn->selection_color((Fl_Color)2); btnDupCheckOn->callback((Fl_Callback*)cb_btnDupCheckOn); o->value(progdefaults.EnableDupCheck); } // Fl_Light_Button* btnDupCheckOn { Fl_Check_Button* o = btnDupBand = new Fl_Check_Button(206, 265, 70, 20, _("Band")); btnDupBand->tooltip(_("Bands must match")); btnDupBand->down_box(FL_DOWN_BOX); btnDupBand->callback((Fl_Callback*)cb_btnDupBand); o->value(progdefaults.dupband); } // Fl_Check_Button* btnDupBand { Fl_Check_Button* o = btnDupMode = new Fl_Check_Button(326, 265, 70, 20, _("Mode")); btnDupMode->tooltip(_("Mode must match")); btnDupMode->down_box(FL_DOWN_BOX); btnDupMode->callback((Fl_Callback*)cb_btnDupMode); o->value(progdefaults.dupmode); } // Fl_Check_Button* btnDupMode { Fl_Check_Button* o = btnDupState = new Fl_Check_Button(445, 265, 70, 20, _("State")); btnDupState->tooltip(_("State must match")); btnDupState->down_box(FL_DOWN_BOX); btnDupState->callback((Fl_Callback*)cb_btnDupState); o->value(progdefaults.dupstate); } // Fl_Check_Button* btnDupState { Fl_Check_Button* o = btnDupXchg1 = new Fl_Check_Button(206, 293, 105, 20, _("Exchange In")); btnDupXchg1->tooltip(_("free form 1 must match")); btnDupXchg1->down_box(FL_DOWN_BOX); btnDupXchg1->callback((Fl_Callback*)cb_btnDupXchg1); o->value(progdefaults.dupxchg1); } // Fl_Check_Button* btnDupXchg1 { Fl_Check_Button* o = btnDupTimeSpan = new Fl_Check_Button(206, 323, 129, 20, _("Time span over")); btnDupTimeSpan->tooltip(_("QSO must not occur within a time period of")); btnDupTimeSpan->down_box(FL_DOWN_BOX); btnDupTimeSpan->callback((Fl_Callback*)cb_btnDupTimeSpan); o->value(progdefaults.duptimespan); } // Fl_Check_Button* btnDupTimeSpan { Fl_Value_Input2* o = nbrTimeSpan = new Fl_Value_Input2(335, 323, 53, 20, _("minutes")); nbrTimeSpan->tooltip(_("Enter time span in minutes")); nbrTimeSpan->box(FL_DOWN_BOX); nbrTimeSpan->color(FL_BACKGROUND2_COLOR); nbrTimeSpan->selection_color(FL_SELECTION_COLOR); nbrTimeSpan->labeltype(FL_NORMAL_LABEL); nbrTimeSpan->labelfont(0); nbrTimeSpan->labelsize(14); nbrTimeSpan->labelcolor(FL_FOREGROUND_COLOR); nbrTimeSpan->maximum(1440); nbrTimeSpan->step(1); nbrTimeSpan->value(120); nbrTimeSpan->callback((Fl_Callback*)cb_nbrTimeSpan); nbrTimeSpan->align(Fl_Align(FL_ALIGN_RIGHT)); nbrTimeSpan->when(FL_WHEN_CHANGED); o->value(progdefaults.timespan); } // Fl_Value_Input2* nbrTimeSpan { Fl_Button* o = btnDupColor = new Fl_Button(65, 292, 90, 22, _("Dup Color")); btnDupColor->tooltip(_("Left click to select dup color")); btnDupColor->box(FL_DOWN_BOX); btnDupColor->down_box(FL_DOWN_BOX); btnDupColor->color(FL_BACKGROUND2_COLOR); btnDupColor->selection_color(FL_BACKGROUND2_COLOR); btnDupColor->callback((Fl_Callback*)cb_btnDupColor); o->color(fl_rgb_color(progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B)); } // Fl_Button* btnDupColor o->end(); } // Fl_Group* o tabContest->end(); } // Fl_Group* tabContest { tabUserInterface = new Fl_Group(0, 50, 600, 330, _("General")); tabUserInterface->hide(); { Fl_Group* o = new Fl_Group(52, 62, 496, 76); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnShowTooltips = new Fl_Check_Button(87, 75, 120, 20, _("Show tooltips")); btnShowTooltips->tooltip(_("Enable / disable tooltips")); btnShowTooltips->down_box(FL_DOWN_BOX); btnShowTooltips->value(1); btnShowTooltips->callback((Fl_Callback*)cb_btnShowTooltips); o->value(progdefaults.tooltips); } // Fl_Check_Button* btnShowTooltips { Fl_Check_Button* o = chkMenuIcons = new Fl_Check_Button(231, 75, 150, 20, _("Show menu icons")); chkMenuIcons->tooltip(_("Enable / disable icons on menus")); chkMenuIcons->down_box(FL_DOWN_BOX); chkMenuIcons->callback((Fl_Callback*)cb_chkMenuIcons); o->value(progdefaults.menuicons); } // Fl_Check_Button* chkMenuIcons { Fl_ListBox* o = listboxScheme = new Fl_ListBox(205, 104, 80, 20, _("UI scheme")); listboxScheme->tooltip(_("Change application look and feel")); listboxScheme->box(FL_DOWN_BOX); listboxScheme->color(FL_BACKGROUND2_COLOR); listboxScheme->selection_color(FL_BACKGROUND_COLOR); listboxScheme->labeltype(FL_NORMAL_LABEL); listboxScheme->labelfont(0); listboxScheme->labelsize(14); listboxScheme->labelcolor(FL_FOREGROUND_COLOR); listboxScheme->callback((Fl_Callback*)cb_listboxScheme); listboxScheme->align(Fl_Align(FL_ALIGN_RIGHT)); listboxScheme->when(FL_WHEN_RELEASE); listboxScheme->add("base"); listboxScheme->add("gtk+"); listboxScheme->add("plastic"); listboxScheme->value(progdefaults.ui_scheme.c_str()); o->labelsize(FL_NORMAL_SIZE); listboxScheme->end(); } // Fl_ListBox* listboxScheme { bVisibleModes = new Fl_Button(70, 104, 110, 20, _("Visible modes")); bVisibleModes->tooltip(_("Select modes for menu access")); bVisibleModes->callback((Fl_Callback*)cb_bVisibleModes); } // Fl_Button* bVisibleModes { Fl_ListBox* o = listbox_language = new Fl_ListBox(415, 104, 110, 20, _("UI language")); listbox_language->tooltip(_("Changes take effect on next program startup")); listbox_language->box(FL_DOWN_BOX); listbox_language->color(FL_BACKGROUND2_COLOR); listbox_language->selection_color(FL_BACKGROUND_COLOR); listbox_language->labeltype(FL_NORMAL_LABEL); listbox_language->labelfont(0); listbox_language->labelsize(12); listbox_language->labelcolor(FL_FOREGROUND_COLOR); listbox_language->callback((Fl_Callback*)cb_listbox_language); listbox_language->align(Fl_Align(FL_ALIGN_TOP_LEFT)); listbox_language->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); listbox_language->end(); } // Fl_ListBox* listbox_language o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(52, 139, 496, 34); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_rx_lowercase = new Fl_Check_Button(87, 146, 389, 20, _("Print CW / RTTY / THROB / CONTESTIA in lowercase")); btn_rx_lowercase->down_box(FL_DOWN_BOX); btn_rx_lowercase->callback((Fl_Callback*)cb_btn_rx_lowercase); o->value(progdefaults.rx_lowercase); } // Fl_Check_Button* btn_rx_lowercase o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(52, 174, 496, 34); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_tx_lowercase = new Fl_Check_Button(87, 182, 389, 20, _("Transmit all text in lower case")); btn_tx_lowercase->down_box(FL_DOWN_BOX); btn_tx_lowercase->callback((Fl_Callback*)cb_btn_tx_lowercase); o->value(progdefaults.tx_lowercase); } // Fl_Check_Button* btn_tx_lowercase o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(52, 209, 496, 110, _("Exit prompts")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_save_config_on_exit = new Fl_Check_Button(87, 272, 233, 20, _("Prompt to save Configuration")); btn_save_config_on_exit->down_box(FL_DOWN_BOX); btn_save_config_on_exit->callback((Fl_Callback*)cb_btn_save_config_on_exit); o->value(progdefaults.SaveConfig); } // Fl_Check_Button* btn_save_config_on_exit { Fl_Check_Button* o = btn2_save_macros_on_exit = new Fl_Check_Button(87, 294, 233, 20, _("Prompt to save macro file")); btn2_save_macros_on_exit->tooltip(_("Write current macro set on program exit")); btn2_save_macros_on_exit->down_box(FL_DOWN_BOX); btn2_save_macros_on_exit->callback((Fl_Callback*)cb_btn2_save_macros_on_exit); o->value(progdefaults.SaveMacros); } // Fl_Check_Button* btn2_save_macros_on_exit { Fl_Check_Button* o = btn2NagMe = new Fl_Check_Button(331, 272, 166, 20, _("Prompt to save log")); btn2NagMe->tooltip(_("Bug me about saving log entries")); btn2NagMe->down_box(FL_DOWN_BOX); btn2NagMe->callback((Fl_Callback*)cb_btn2NagMe); o->value(progdefaults.NagMe); } // Fl_Check_Button* btn2NagMe { Fl_Box* o = new Fl_Box(92, 226, 436, 40, _("Exit prompts active only when File/Exit menu item selected.\nNot active if wi\ ndow decoration close button pressed.")); o->box(FL_BORDER_BOX); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Check_Button* o = btn2_confirm_exit = new Fl_Check_Button(331, 294, 200, 20, _("Confirm exit")); btn2_confirm_exit->down_box(FL_DOWN_BOX); btn2_confirm_exit->callback((Fl_Callback*)cb_btn2_confirm_exit); o->value(progdefaults.confirmExit); } // Fl_Check_Button* btn2_confirm_exit o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(52, 321, 496, 54, _("Check for updates")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_check_for_updates = new Fl_Check_Button(87, 344, 324, 20, _("Check for updates when starting program")); btn_check_for_updates->down_box(FL_DOWN_BOX); btn_check_for_updates->callback((Fl_Callback*)cb_btn_check_for_updates); o->value(progdefaults.check_for_updates); } // Fl_Check_Button* btn_check_for_updates o->end(); } // Fl_Group* o tabUserInterface->end(); } // Fl_Group* tabUserInterface { tabLogServer = new Fl_Group(0, 50, 600, 330, _("Logging")); tabLogServer->hide(); { Fl_Group* o = new Fl_Group(52, 315, 496, 55, _("Client/Server Logbook")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input* o = xmllogServerAddress = new Fl_Input(149, 336, 100, 24, _("Address:")); xmllogServerAddress->tooltip(_("Enter URL address of server")); xmllogServerAddress->callback((Fl_Callback*)cb_xmllogServerAddress); o->value(progdefaults.xmllog_address.c_str()); } // Fl_Input* xmllogServerAddress { Fl_Input* o = xmllogServerPort = new Fl_Input(307, 336, 70, 24, _("Port:")); xmllogServerPort->tooltip(_("Enter Port # assigned to server")); xmllogServerPort->callback((Fl_Callback*)cb_xmllogServerPort); o->value(progdefaults.xmllog_port.c_str()); } // Fl_Input* xmllogServerPort { btn_reconnect_log_server = new Fl_Button(410, 336, 115, 24, _("Reconnect")); btn_reconnect_log_server->callback((Fl_Callback*)cb_btn_reconnect_log_server); } // Fl_Button* btn_reconnect_log_server o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(52, 59, 496, 180, _("QSO logging")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnNagMe = new Fl_Check_Button(69, 81, 236, 20, _("Prompt to save log on exit")); btnNagMe->tooltip(_("Bug me about saving log entries")); btnNagMe->down_box(FL_DOWN_BOX); btnNagMe->callback((Fl_Callback*)cb_btnNagMe); o->value(progdefaults.NagMe); } // Fl_Check_Button* btnNagMe { Fl_Check_Button* o = btnClearOnSave = new Fl_Check_Button(69, 106, 236, 20, _("Clear on save")); btnClearOnSave->tooltip(_("Clear log entries after saving or using macro ")); btnClearOnSave->down_box(FL_DOWN_BOX); btnClearOnSave->callback((Fl_Callback*)cb_btnClearOnSave); o->value(progdefaults.ClearOnSave); } // Fl_Check_Button* btnClearOnSave { Fl_Check_Button* o = btnCallUpperCase = new Fl_Check_Button(69, 132, 236, 20, _("Convert callsign to upper case")); btnCallUpperCase->tooltip(_("Force callsign field to UPPERCASE")); btnCallUpperCase->down_box(FL_DOWN_BOX); btnCallUpperCase->callback((Fl_Callback*)cb_btnCallUpperCase); o->value(progdefaults.calluppercase); } // Fl_Check_Button* btnCallUpperCase { Fl_Check_Button* o = btnAutoFillQSO = new Fl_Check_Button(69, 157, 236, 20, _("Auto-fill Country and Azimuth")); btnAutoFillQSO->tooltip(_("Fill in Country / Azimuth using cty.dat information")); btnAutoFillQSO->down_box(FL_DOWN_BOX); btnAutoFillQSO->callback((Fl_Callback*)cb_btnAutoFillQSO); o->value(progdefaults.autofill_qso_fields); } // Fl_Check_Button* btnAutoFillQSO { Fl_Check_Button* o = btnDateTimeSort = new Fl_Check_Button(322, 81, 190, 20, _("Sort by Date/Time OFF")); btnDateTimeSort->tooltip(_("Sort by date/time OFF - effects all ADIF/Cabrillo reports")); btnDateTimeSort->down_box(FL_DOWN_BOX); btnDateTimeSort->callback((Fl_Callback*)cb_btnDateTimeSort); o->value(progdefaults.sort_date_time_off); } // Fl_Check_Button* btnDateTimeSort { Fl_Check_Button* o = btndate_time_force = new Fl_Check_Button(322, 106, 190, 20, _("Date time ON == OFF")); btndate_time_force->tooltip(_("Force date/time ON == date/time OFF")); btndate_time_force->down_box(FL_DOWN_BOX); btndate_time_force->callback((Fl_Callback*)cb_btndate_time_force); o->value(progdefaults.force_date_time); } // Fl_Check_Button* btndate_time_force { Fl_Check_Button* o = btnRSTindefault = new Fl_Check_Button(322, 131, 186, 20, _("Default RST in to 599")); btnRSTindefault->tooltip(_("Clear log controls sets RST in to 599")); btnRSTindefault->down_box(FL_DOWN_BOX); btnRSTindefault->callback((Fl_Callback*)cb_btnRSTindefault); o->value(progdefaults.RSTin_default); } // Fl_Check_Button* btnRSTindefault { Fl_Check_Button* o = btnRSTdefault = new Fl_Check_Button(322, 157, 184, 20, _("Default RST out to 599")); btnRSTdefault->tooltip(_("Clear log controls sets RST out to 599")); btnRSTdefault->down_box(FL_DOWN_BOX); btnRSTdefault->callback((Fl_Callback*)cb_btnRSTdefault); o->value(progdefaults.RSTdefault); } // Fl_Check_Button* btnRSTdefault { Fl_Input2* o = txt_cty_dat_pathname = new Fl_Input2(189, 180, 346, 24, _("cty.dat pathname")); txt_cty_dat_pathname->tooltip(_("Enter full path-filename for cty.dat")); txt_cty_dat_pathname->box(FL_DOWN_BOX); txt_cty_dat_pathname->color(FL_BACKGROUND2_COLOR); txt_cty_dat_pathname->selection_color(FL_SELECTION_COLOR); txt_cty_dat_pathname->labeltype(FL_NORMAL_LABEL); txt_cty_dat_pathname->labelfont(0); txt_cty_dat_pathname->labelsize(14); txt_cty_dat_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_cty_dat_pathname->callback((Fl_Callback*)cb_txt_cty_dat_pathname); txt_cty_dat_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_cty_dat_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.cty_dat_pathname.c_str()); } // Fl_Input2* txt_cty_dat_pathname { btn_select_cty_dat = new Fl_Button(70, 209, 75, 24, _("Browse")); btn_select_cty_dat->tooltip(_("Locate cty.dat file")); btn_select_cty_dat->callback((Fl_Callback*)cb_btn_select_cty_dat); } // Fl_Button* btn_select_cty_dat { btn_default_cty_dat = new Fl_Button(165, 209, 75, 24, _("Default")); btn_default_cty_dat->tooltip(_("Restore cty.dat default folder")); btn_default_cty_dat->callback((Fl_Callback*)cb_btn_default_cty_dat); } // Fl_Button* btn_default_cty_dat { btn_reload_cty_dat = new Fl_Button(260, 209, 75, 24, _("Reload")); btn_reload_cty_dat->tooltip(_("Reload cty.dat")); btn_reload_cty_dat->callback((Fl_Callback*)cb_btn_reload_cty_dat); } // Fl_Button* btn_reload_cty_dat { Fl_Input2* o = inpMyPower = new Fl_Input2(485, 209, 50, 24, _("Transmit Power")); inpMyPower->tooltip(_("Tx power used for logbook entries")); inpMyPower->box(FL_DOWN_BOX); inpMyPower->color(FL_BACKGROUND2_COLOR); inpMyPower->selection_color(FL_SELECTION_COLOR); inpMyPower->labeltype(FL_NORMAL_LABEL); inpMyPower->labelfont(0); inpMyPower->labelsize(14); inpMyPower->labelcolor(FL_FOREGROUND_COLOR); inpMyPower->callback((Fl_Callback*)cb_inpMyPower); inpMyPower->align(Fl_Align(FL_ALIGN_LEFT)); inpMyPower->when(FL_WHEN_RELEASE); o->value(progdefaults.mytxpower.c_str()); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyPower o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(52, 240, 496, 74, _("Rx Text Capture")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnRXClicks = new Fl_Check_Button(75, 287, 191, 20, _("Double-click to capture")); btnRXClicks->tooltip(_("Enable if you cannot use the middle mouse button")); btnRXClicks->down_box(FL_DOWN_BOX); btnRXClicks->callback((Fl_Callback*)cb_btnRXClicks); o->value(progdefaults.rxtext_clicks_qso_data); } // Fl_Check_Button* btnRXClicks { Fl_Check_Button* o = btnRXTooltips = new Fl_Check_Button(277, 287, 254, 20, _("callsign tooltips in received text")); btnRXTooltips->tooltip(_("Popup info after a 2 second hover on a callsign")); btnRXTooltips->down_box(FL_DOWN_BOX); btnRXTooltips->callback((Fl_Callback*)cb_btnRXTooltips); o->value(progdefaults.rxtext_tooltips); } // Fl_Check_Button* btnRXTooltips { Fl_Input2* o = inpNonword = new Fl_Input2(194, 260, 279, 24, _("Word delimiters")); inpNonword->tooltip(_("RX text QSO data entry is bounded by the non-word characters\ndefined here. T\ ab and newline are automatically included.")); inpNonword->box(FL_DOWN_BOX); inpNonword->color(FL_BACKGROUND2_COLOR); inpNonword->selection_color(FL_SELECTION_COLOR); inpNonword->labeltype(FL_NORMAL_LABEL); inpNonword->labelfont(0); inpNonword->labelsize(14); inpNonword->labelcolor(FL_FOREGROUND_COLOR); inpNonword->textfont(4); inpNonword->callback((Fl_Callback*)cb_inpNonword); inpNonword->align(Fl_Align(FL_ALIGN_LEFT)); inpNonword->when(FL_WHEN_RELEASE); o->value(progdefaults.nonwordchars.c_str()); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNonword o->end(); } // Fl_Group* o tabLogServer->end(); } // Fl_Group* tabLogServer { tabMBars = new Fl_Group(0, 50, 600, 330, _("Macros")); tabMBars->hide(); { Fl_Group* o = new Fl_Group(52, 257, 496, 40); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnMacroMouseWheel = new Fl_Check_Button(62, 266, 296, 20, _("Mouse wheel active on macro buttons")); btnMacroMouseWheel->tooltip(_("enable mouse wheel control of macro bar")); btnMacroMouseWheel->down_box(FL_DOWN_BOX); btnMacroMouseWheel->callback((Fl_Callback*)cb_btnMacroMouseWheel); o->value(progdefaults.macro_wheel); } // Fl_Check_Button* btnMacroMouseWheel o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(52, 61, 496, 195, _("Number and position of macro bars")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btn_oneA = new Fl_Round_Button(62, 91, 220, 20, _("One bar (above waterfall)")); btn_oneA->type(102); btn_oneA->down_box(FL_ROUND_DOWN_BOX); btn_oneA->callback((Fl_Callback*)cb_btn_oneA); } // Fl_Round_Button* btn_oneA { btn_oneB = new Fl_Round_Button(62, 121, 220, 20, _("One bar (below waterfall)")); btn_oneB->type(102); btn_oneB->down_box(FL_ROUND_DOWN_BOX); btn_oneB->callback((Fl_Callback*)cb_btn_oneB); } // Fl_Round_Button* btn_oneB { btn_twoA = new Fl_Round_Button(62, 151, 220, 20, _("Two bars (scheme 1)")); btn_twoA->type(102); btn_twoA->down_box(FL_ROUND_DOWN_BOX); btn_twoA->callback((Fl_Callback*)cb_btn_twoA); } // Fl_Round_Button* btn_twoA { btn_twoB = new Fl_Round_Button(292, 151, 219, 20, _("Two bars (scheme 2)")); btn_twoB->type(102); btn_twoB->down_box(FL_ROUND_DOWN_BOX); btn_twoB->callback((Fl_Callback*)cb_btn_twoB); } // Fl_Round_Button* btn_twoB { btn_twoC = new Fl_Round_Button(62, 181, 220, 20, _("Two bars (scheme 3)")); btn_twoC->type(102); btn_twoC->down_box(FL_ROUND_DOWN_BOX); btn_twoC->callback((Fl_Callback*)cb_btn_twoC); } // Fl_Round_Button* btn_twoC { btn_twoD = new Fl_Round_Button(292, 181, 220, 20, _("Two bars (scheme 4)")); btn_twoD->type(102); btn_twoD->down_box(FL_ROUND_DOWN_BOX); btn_twoD->callback((Fl_Callback*)cb_btn_twoD); } // Fl_Round_Button* btn_twoD { btn_twoE = new Fl_Round_Button(62, 211, 220, 20, _("Two bars (scheme 5)")); btn_twoE->type(102); btn_twoE->down_box(FL_ROUND_DOWN_BOX); btn_twoE->callback((Fl_Callback*)cb_btn_twoE); } // Fl_Round_Button* btn_twoE { btn_twoF = new Fl_Round_Button(292, 211, 220, 20, _("Two bars (scheme 6)")); btn_twoF->type(102); btn_twoF->down_box(FL_ROUND_DOWN_BOX); btn_twoF->callback((Fl_Callback*)cb_btn_twoF); } // Fl_Round_Button* btn_twoF o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(52, 299, 496, 76); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnUseLastMacro = new Fl_Check_Button(62, 305, 277, 20, _("Load last used macro file on startup")); btnUseLastMacro->tooltip(_("ON - use last set of macros\nOFF - use default set")); btnUseLastMacro->down_box(FL_DOWN_BOX); btnUseLastMacro->callback((Fl_Callback*)cb_btnUseLastMacro); o->value(progdefaults.UseLastMacro); } // Fl_Check_Button* btnUseLastMacro { Fl_Check_Button* o = btnDisplayMacroFilename = new Fl_Check_Button(62, 327, 277, 20, _("Display macro filename on startup")); btnDisplayMacroFilename->tooltip(_("The filename is written to the RX text area")); btnDisplayMacroFilename->down_box(FL_DOWN_BOX); btnDisplayMacroFilename->callback((Fl_Callback*)cb_btnDisplayMacroFilename); o->value(progdefaults.DisplayMacroFilename); } // Fl_Check_Button* btnDisplayMacroFilename { Fl_Check_Button* o = btn_save_macros_on_exit = new Fl_Check_Button(62, 349, 305, 20, _("Prompt to save macro file when closing")); btn_save_macros_on_exit->tooltip(_("Write current macro set on program exit")); btn_save_macros_on_exit->down_box(FL_DOWN_BOX); btn_save_macros_on_exit->callback((Fl_Callback*)cb_btn_save_macros_on_exit); o->value(progdefaults.SaveMacros); } // Fl_Check_Button* btn_save_macros_on_exit o->end(); } // Fl_Group* o tabMBars->end(); } // Fl_Group* tabMBars { tabWF_UI = new Fl_Group(0, 50, 600, 330, _("WF Ctrls")); tabWF_UI->hide(); { Fl_Group* o = new Fl_Group(52, 83, 496, 253); o->box(FL_ENGRAVED_BOX); { Fl_Box* o = new Fl_Box(81, 90, 446, 25, _("Enable check box to show each respective operator control")); o->box(FL_FLAT_BOX); o->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Check_Button* o = btnWF_UIrev = new Fl_Check_Button(108, 123, 150, 20, _("Reverse")); btnWF_UIrev->down_box(FL_DOWN_BOX); btnWF_UIrev->value(1); btnWF_UIrev->callback((Fl_Callback*)cb_btnWF_UIrev); o->value(progdefaults.WF_UIrev); } // Fl_Check_Button* btnWF_UIrev { Fl_Check_Button* o = btnWF_UIx1 = new Fl_Check_Button(327, 123, 162, 20, _("WF Magnification")); btnWF_UIx1->down_box(FL_DOWN_BOX); btnWF_UIx1->value(1); btnWF_UIx1->callback((Fl_Callback*)cb_btnWF_UIx1); o->value(progdefaults.WF_UIx1); } // Fl_Check_Button* btnWF_UIx1 { Fl_Check_Button* o = btnWF_UIwfcarrier = new Fl_Check_Button(108, 154, 150, 20, _("WF carrier")); btnWF_UIwfcarrier->down_box(FL_DOWN_BOX); btnWF_UIwfcarrier->value(1); btnWF_UIwfcarrier->callback((Fl_Callback*)cb_btnWF_UIwfcarrier); o->value(progdefaults.WF_UIwfcarrier); } // Fl_Check_Button* btnWF_UIwfcarrier { Fl_Check_Button* o = btnWF_UIwfshift = new Fl_Check_Button(327, 154, 150, 20, _("WF Shift Controls")); btnWF_UIwfshift->down_box(FL_DOWN_BOX); btnWF_UIwfshift->value(1); btnWF_UIwfshift->callback((Fl_Callback*)cb_btnWF_UIwfshift); o->value(progdefaults.WF_UIwfshift); } // Fl_Check_Button* btnWF_UIwfshift { Fl_Check_Button* o = btnWF_UIwfreflevel = new Fl_Check_Button(108, 186, 150, 20, _("WF ref level")); btnWF_UIwfreflevel->down_box(FL_DOWN_BOX); btnWF_UIwfreflevel->value(1); btnWF_UIwfreflevel->callback((Fl_Callback*)cb_btnWF_UIwfreflevel); o->value(progdefaults.WF_UIwfreflevel); } // Fl_Check_Button* btnWF_UIwfreflevel { Fl_Check_Button* o = btnWF_UIwfdrop = new Fl_Check_Button(327, 186, 150, 20, _("WF drop rate")); btnWF_UIwfdrop->down_box(FL_DOWN_BOX); btnWF_UIwfdrop->value(1); btnWF_UIwfdrop->callback((Fl_Callback*)cb_btnWF_UIwfdrop); o->value(progdefaults.WF_UIwfdrop); } // Fl_Check_Button* btnWF_UIwfdrop { Fl_Check_Button* o = btnWF_UIwfampspan = new Fl_Check_Button(108, 218, 150, 20, _("WF amp span")); btnWF_UIwfampspan->down_box(FL_DOWN_BOX); btnWF_UIwfampspan->value(1); btnWF_UIwfampspan->callback((Fl_Callback*)cb_btnWF_UIwfampspan); o->value(progdefaults.WF_UIwfampspan); } // Fl_Check_Button* btnWF_UIwfampspan { Fl_Check_Button* o = btnWF_UIwfstore = new Fl_Check_Button(327, 218, 150, 20, _("WF Store")); btnWF_UIwfstore->down_box(FL_DOWN_BOX); btnWF_UIwfstore->value(1); btnWF_UIwfstore->callback((Fl_Callback*)cb_btnWF_UIwfstore); o->value(progdefaults.WF_UIwfstore); } // Fl_Check_Button* btnWF_UIwfstore { Fl_Check_Button* o = btnWF_UIwfmode = new Fl_Check_Button(108, 250, 150, 20, _("WF mode")); btnWF_UIwfmode->down_box(FL_DOWN_BOX); btnWF_UIwfmode->value(1); btnWF_UIwfmode->callback((Fl_Callback*)cb_btnWF_UIwfmode); o->value(progdefaults.WF_UIwfmode); } // Fl_Check_Button* btnWF_UIwfmode { Fl_Check_Button* o = btnWF_UIqsy = new Fl_Check_Button(327, 250, 150, 20, _("QSY")); btnWF_UIqsy->down_box(FL_DOWN_BOX); btnWF_UIqsy->value(1); btnWF_UIqsy->callback((Fl_Callback*)cb_btnWF_UIqsy); o->value(progdefaults.WF_UIqsy); } // Fl_Check_Button* btnWF_UIqsy { Fl_Check_Button* o = btnWF_UIxmtlock = new Fl_Check_Button(327, 282, 150, 20, _("XMT lock")); btnWF_UIxmtlock->down_box(FL_DOWN_BOX); btnWF_UIxmtlock->value(1); btnWF_UIxmtlock->callback((Fl_Callback*)cb_btnWF_UIxmtlock); o->value(progdefaults.WF_UIxmtlock); } // Fl_Check_Button* btnWF_UIxmtlock { btn_wf_enable_all = new Fl_Button(152, 305, 88, 20, _("Enable all")); btn_wf_enable_all->callback((Fl_Callback*)cb_btn_wf_enable_all); } // Fl_Button* btn_wf_enable_all { btn_wf_disable_all = new Fl_Button(351, 305, 88, 20, _("Disable all")); btn_wf_disable_all->callback((Fl_Callback*)cb_btn_wf_disable_all); } // Fl_Button* btn_wf_disable_all o->end(); } // Fl_Group* o tabWF_UI->end(); } // Fl_Group* tabWF_UI { tabColorsFonts = new Fl_Group(0, 50, 600, 330, _("Colors/Fonts")); tabColorsFonts->hide(); { tabsColors = new Fl_Tabs(0, 55, 600, 325); { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Rx/Tx")); { Fl_ListBox* o = listbox_charset_status = new Fl_ListBox(99, 109, 165, 24, _("Rx/Tx Character set")); listbox_charset_status->tooltip(_("Select Rx/Tx Character Set")); listbox_charset_status->box(FL_BORDER_BOX); listbox_charset_status->color((Fl_Color)55); listbox_charset_status->selection_color(FL_BACKGROUND_COLOR); listbox_charset_status->labeltype(FL_NORMAL_LABEL); listbox_charset_status->labelfont(0); listbox_charset_status->labelsize(14); listbox_charset_status->labelcolor(FL_FOREGROUND_COLOR); listbox_charset_status->align(Fl_Align(FL_ALIGN_RIGHT)); listbox_charset_status->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); listbox_charset_status->callback(cb_listbox_charset, 0); listbox_charset_status->end(); } // Fl_ListBox* listbox_charset_status { RxText = new Fl_Input(99, 143, 165, 36); RxText->value("Receive Text"); RxText->color(fl_rgb_color(progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B)); RxText->textfont(progdefaults.RxFontnbr); RxText->textsize(progdefaults.RxFontsize); RxText->textcolor(progdefaults.RxFontcolor); RxText->type(FL_MULTILINE_INPUT_WRAP); } // Fl_Input* RxText { btnRxColor = new Fl_Button(273, 150, 75, 21, _("Rx bkgnd")); btnRxColor->callback((Fl_Callback*)cb_btnRxColor); } // Fl_Button* btnRxColor { btnTxColor = new Fl_Button(273, 191, 75, 21, _("Tx bkgnd")); btnTxColor->callback((Fl_Callback*)cb_btnTxColor); } // Fl_Button* btnTxColor { TxText = new Fl_Input(99, 186, 165, 37); TxText->value("Transmit Text"); TxText->color(fl_rgb_color(progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B)); TxText->textfont(progdefaults.TxFontnbr); TxText->textsize(progdefaults.TxFontsize); TxText->textcolor(progdefaults.TxFontcolor); TxText->type(FL_MULTILINE_INPUT_WRAP); } // Fl_Input* TxText { btnRxFont = new Fl_Button(358, 150, 75, 21, _("Rx font")); btnRxFont->callback((Fl_Callback*)cb_btnRxFont); } // Fl_Button* btnRxFont { btnTxFont = new Fl_Button(358, 191, 75, 21, _("Tx font")); btnTxFont->callback((Fl_Callback*)cb_btnTxFont); } // Fl_Button* btnTxFont { Fl_Group* o = new Fl_Group(71, 235, 404, 81, _("Text Highlighting")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { btnXMIT = new Fl_Button(89, 263, 40, 21, _("XMIT")); btnXMIT->tooltip(_("Sent chars in Rx/Tx pane")); btnXMIT->callback((Fl_Callback*)cb_btnXMIT); btnXMIT->align(Fl_Align(FL_ALIGN_BOTTOM)); btnXMIT->color(progdefaults.XMITcolor); } // Fl_Button* btnXMIT { btnCTRL = new Fl_Button(132, 263, 40, 21, _("CTRL")); btnCTRL->tooltip(_("Control chars in Rx/Tx pane")); btnCTRL->callback((Fl_Callback*)cb_btnCTRL); btnCTRL->align(Fl_Align(FL_ALIGN_BOTTOM)); btnCTRL->color(progdefaults.CTRLcolor); } // Fl_Button* btnCTRL { btnSKIP = new Fl_Button(176, 263, 40, 21, _("SKIP")); btnSKIP->tooltip(_("Skipped chars in Tx pane\n(Tx on/off in CW)")); btnSKIP->callback((Fl_Callback*)cb_btnSKIP); btnSKIP->align(Fl_Align(FL_ALIGN_BOTTOM)); btnSKIP->color(progdefaults.SKIPcolor); } // Fl_Button* btnSKIP { btnALTR = new Fl_Button(219, 263, 40, 21, _("ALTR")); btnALTR->tooltip(_("Alternate character color in Rx panelr")); btnALTR->callback((Fl_Callback*)cb_btnALTR); btnALTR->align(Fl_Align(FL_ALIGN_BOTTOM)); btnALTR->color(progdefaults.ALTRcolor); } // Fl_Button* btnALTR { btnSEL = new Fl_Button(263, 263, 39, 21, _("SEL")); btnSEL->tooltip(_("Selection background color in Rx Tx panels")); btnSEL->callback((Fl_Callback*)cb_btnSEL); btnSEL->align(Fl_Align(FL_ALIGN_BOTTOM)); btnSEL->color(progdefaults.RxTxSelectcolor); } // Fl_Button* btnSEL { btnNoTextColor = new Fl_Button(310, 263, 70, 21, _("System")); btnNoTextColor->callback((Fl_Callback*)cb_btnNoTextColor); } // Fl_Button* btnNoTextColor { btnTextDefaults = new Fl_Button(384, 263, 70, 21, _("Defaults")); btnTextDefaults->callback((Fl_Callback*)cb_btnTextDefaults); } // Fl_Button* btnTextDefaults o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Frq Disp")); o->hide(); { Fl_Group* o = new Fl_Group(115, 108, 370, 87); o->box(FL_ENGRAVED_FRAME); { Fl_Box* o = FDdisplay = new Fl_Box(182, 112, 235, 45, _("14070.150")); FDdisplay->box(FL_DOWN_BOX); FDdisplay->color((Fl_Color)55); FDdisplay->labelfont(4); FDdisplay->labelsize(40); o->color(fl_rgb_color(progdefaults.FDbackground.R,progdefaults.FDbackground.G,progdefaults.FDbackground.B)); o->labelcolor(fl_rgb_color(progdefaults.FDforeground.R,progdefaults.FDforeground.G,progdefaults.FDforeground.B)); o->labelfont(progdefaults.FreqControlFontnbr); } // Fl_Box* FDdisplay { btn_freq_control_font = new Fl_Button(125, 163, 80, 24, _("Font")); btn_freq_control_font->callback((Fl_Callback*)cb_btn_freq_control_font); } // Fl_Button* btn_freq_control_font { btnBackgroundColor = new Fl_Button(215, 163, 80, 24, _("Bg Color")); btnBackgroundColor->callback((Fl_Callback*)cb_btnBackgroundColor); } // Fl_Button* btnBackgroundColor { btnForegroundColor = new Fl_Button(305, 163, 80, 24, _("Digit Color")); btnForegroundColor->callback((Fl_Callback*)cb_btnForegroundColor); } // Fl_Button* btnForegroundColor { btnFD_SystemColor = new Fl_Button(396, 163, 80, 24, _("Sys Colors")); btnFD_SystemColor->callback((Fl_Callback*)cb_btnFD_SystemColor); } // Fl_Button* btnFD_SystemColor o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Log")); o->hide(); { Fl_Group* o = new Fl_Group(114, 101, 372, 65, _("Logging Panel Controls")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Output* o = LOGGINGdisplay = new Fl_Output(132, 125, 98, 25); o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize);o->textcolor(progdefaults.LOGGINGtextcolor); o->color(progdefaults.LOGGINGcolor); o->value("W1HKJ"); o->redraw(); } // Fl_Output* LOGGINGdisplay { btnLOGGING_color = new Fl_Button(240, 125, 80, 25, _("Bg Color")); btnLOGGING_color->callback((Fl_Callback*)cb_btnLOGGING_color); } // Fl_Button* btnLOGGING_color { btn_LOGGING_font = new Fl_Button(330, 125, 55, 25, _("Font")); btn_LOGGING_font->callback((Fl_Callback*)cb_btn_LOGGING_font); } // Fl_Button* btn_LOGGING_font { btnLOGGINGdefault_colors_font = new Fl_Button(396, 125, 80, 25, _("Default")); btnLOGGINGdefault_colors_font->callback((Fl_Callback*)cb_btnLOGGINGdefault_colors_font); } // Fl_Button* btnLOGGINGdefault_colors_font o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(115, 176, 370, 65, _("Logbook Dialog")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Output* o = LOGBOOKdisplay = new Fl_Output(131, 200, 98, 25); o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize);o->textcolor(progdefaults.LOGBOOKtextcolor); o->color(progdefaults.LOGBOOKcolor); o->value("14.070000"); o->redraw(); } // Fl_Output* LOGBOOKdisplay { btnLOGBOOK_color = new Fl_Button(239, 200, 80, 25, _("Bg Color")); btnLOGBOOK_color->callback((Fl_Callback*)cb_btnLOGBOOK_color); } // Fl_Button* btnLOGBOOK_color { btn_LOGBOOK_font = new Fl_Button(329, 200, 55, 25, _("Font")); btn_LOGBOOK_font->callback((Fl_Callback*)cb_btn_LOGBOOK_font); } // Fl_Button* btn_LOGBOOK_font { btnLOGBOOKdefault_colors_font = new Fl_Button(395, 200, 80, 25, _("Default")); btnLOGBOOKdefault_colors_font->callback((Fl_Callback*)cb_btnLOGBOOKdefault_colors_font); } // Fl_Button* btnLOGBOOKdefault_colors_font o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("F_keys")); o->hide(); { btnUseGroupColors = new Fl_Check_Button(135, 107, 165, 21, _("Use colored buttons")); btnUseGroupColors->down_box(FL_DOWN_BOX); btnUseGroupColors->callback((Fl_Callback*)cb_btnUseGroupColors); btnUseGroupColors->value(progdefaults.useGroupColors); } // Fl_Check_Button* btnUseGroupColors { btnGroup1 = new Fl_Button(135, 139, 75, 20, _("Group 1")); btnGroup1->tooltip(_("Background color for Function key group 1")); btnGroup1->callback((Fl_Callback*)cb_btnGroup1); btnGroup1->color(fl_rgb_color(progdefaults.btnGroup1.R, progdefaults.btnGroup1.G,progdefaults.btnGroup1.B)); btnGroup1->labelcolor(fl_rgb_color(progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.R)); } // Fl_Button* btnGroup1 { btnGroup2 = new Fl_Button(226, 139, 75, 20, _("Group 2")); btnGroup2->tooltip(_("Background color for Function key group 2")); btnGroup2->callback((Fl_Callback*)cb_btnGroup2); btnGroup2->color(fl_rgb_color(progdefaults.btnGroup2.R, progdefaults.btnGroup2.G,progdefaults.btnGroup2.B)); btnGroup2->labelcolor(fl_rgb_color(progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.R)); } // Fl_Button* btnGroup2 { btnGroup3 = new Fl_Button(318, 139, 75, 20, _("Group 3")); btnGroup3->tooltip(_("Background color for Function key group 3")); btnGroup3->callback((Fl_Callback*)cb_btnGroup3); btnGroup3->color(fl_rgb_color(progdefaults.btnGroup3.R, progdefaults.btnGroup3.G,progdefaults.btnGroup3.B)); btnGroup3->labelcolor(fl_rgb_color(progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.R)); } // Fl_Button* btnGroup3 { btnFkeyTextColor = new Fl_Button(318, 107, 75, 21, _("Label text")); btnFkeyTextColor->callback((Fl_Callback*)cb_btnFkeyTextColor); btnFkeyTextColor->color(fl_rgb_color(progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.G, progdefaults.btnFkeyTextColor.B)); adjust_label(btnFkeyTextColor); } // Fl_Button* btnFkeyTextColor { btnFkeyDEfaults = new Fl_Button(410, 139, 75, 20, _("Defaults")); btnFkeyDEfaults->callback((Fl_Callback*)cb_btnFkeyDEfaults); } // Fl_Button* btnFkeyDEfaults o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Tabs")); o->hide(); { btnTabColor = new Fl_Button(200, 113, 75, 21, _("Tab Color")); btnTabColor->callback((Fl_Callback*)cb_btnTabColor); } // Fl_Button* btnTabColor { btnTabDefaultColor = new Fl_Button(330, 113, 75, 21, _("System")); btnTabDefaultColor->callback((Fl_Callback*)cb_btnTabDefaultColor); } // Fl_Button* btnTabDefaultColor o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Buttons")); o->hide(); { btnSpotColor = new Fl_Button(159, 121, 70, 21, _("Spot")); btnSpotColor->callback((Fl_Callback*)cb_btnSpotColor); } // Fl_Button* btnSpotColor { btnRxIDColor = new Fl_Button(159, 157, 70, 21, _("RxID")); btnRxIDColor->callback((Fl_Callback*)cb_btnRxIDColor); } // Fl_Button* btnRxIDColor { btnTxIDColor = new Fl_Button(159, 193, 70, 20, _("TxID")); btnTxIDColor->callback((Fl_Callback*)cb_btnTxIDColor); } // Fl_Button* btnTxIDColor { btnTuneColor = new Fl_Button(159, 229, 70, 21, _("Tune")); btnTuneColor->callback((Fl_Callback*)cb_btnTuneColor); } // Fl_Button* btnTuneColor { btnLkColor = new Fl_Button(274, 121, 70, 21, _("Lk")); btnLkColor->callback((Fl_Callback*)cb_btnLkColor); } // Fl_Button* btnLkColor { btnRevColor = new Fl_Button(274, 157, 70, 21, _("Rev")); btnRevColor->callback((Fl_Callback*)cb_btnRevColor); } // Fl_Button* btnRevColor { btnXmtColor = new Fl_Button(274, 193, 70, 20, _("T/R")); btnXmtColor->callback((Fl_Callback*)cb_btnXmtColor); } // Fl_Button* btnXmtColor { btnAfcColor = new Fl_Button(390, 121, 70, 21, _("AFC")); btnAfcColor->callback((Fl_Callback*)cb_btnAfcColor); } // Fl_Button* btnAfcColor { btnSql1Color = new Fl_Button(390, 157, 70, 21, _("SQL-1")); btnSql1Color->callback((Fl_Callback*)cb_btnSql1Color); } // Fl_Button* btnSql1Color { btnSql2Color = new Fl_Button(390, 193, 70, 20, _("SQL-2")); btnSql2Color->callback((Fl_Callback*)cb_btnSql2Color); } // Fl_Button* btnSql2Color { Fl_Box* o = spotcolor = new Fl_Box(135, 122, 18, 19); spotcolor->box(FL_THIN_DOWN_BOX); spotcolor->color((Fl_Color)3); o->color(progdefaults.SpotColor); } // Fl_Box* spotcolor { Fl_Box* o = rxidcolor = new Fl_Box(135, 158, 18, 19); rxidcolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.RxIDColor); } // Fl_Box* rxidcolor { Fl_Box* o = txidcolor = new Fl_Box(135, 194, 18, 18); txidcolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.TxIDColor); } // Fl_Box* txidcolor { Fl_Box* o = tunecolor = new Fl_Box(135, 230, 18, 19); tunecolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.TuneColor); } // Fl_Box* tunecolor { Fl_Box* o = lockcolor = new Fl_Box(250, 122, 18, 19); lockcolor->box(FL_THIN_DOWN_BOX); lockcolor->color((Fl_Color)3); o->color(progdefaults.LkColor); } // Fl_Box* lockcolor { Fl_Box* o = revcolor = new Fl_Box(250, 158, 18, 19); revcolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.RevColor); } // Fl_Box* revcolor { Fl_Box* o = xmtcolor = new Fl_Box(250, 194, 18, 18); xmtcolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.XmtColor); } // Fl_Box* xmtcolor { Fl_Box* o = afccolor = new Fl_Box(365, 122, 18, 19); afccolor->box(FL_THIN_DOWN_BOX); afccolor->color((Fl_Color)3); o->color(progdefaults.AfcColor); } // Fl_Box* afccolor { Fl_Box* o = sql1color = new Fl_Box(365, 158, 18, 19); sql1color->box(FL_THIN_DOWN_BOX); o->color(progdefaults.Sql1Color); } // Fl_Box* sql1color { Fl_Box* o = sql2color = new Fl_Box(365, 194, 18, 18); sql2color->box(FL_THIN_DOWN_BOX); o->color(progdefaults.Sql2Color); } // Fl_Box* sql2color { Fl_Box* o = new Fl_Box(248, 229, 220, 20, _("Lighted button enabled colors")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("SigLvl")); o->hide(); { btnLowSignal = new Fl_Button(210, 142, 70, 21, _("Low")); btnLowSignal->callback((Fl_Callback*)cb_btnLowSignal); } // Fl_Button* btnLowSignal { Fl_Box* o = lowcolor = new Fl_Box(189, 142, 21, 21); lowcolor->box(FL_DIAMOND_DOWN_BOX); lowcolor->color(FL_FOREGROUND_COLOR); o->color(progdefaults.LowSignal); } // Fl_Box* lowcolor { btnHighSignal = new Fl_Button(210, 180, 70, 21, _("High")); btnHighSignal->callback((Fl_Callback*)cb_btnHighSignal); } // Fl_Button* btnHighSignal { Fl_Box* o = highcolor = new Fl_Box(189, 180, 21, 21); highcolor->box(FL_DIAMOND_DOWN_BOX); highcolor->color((Fl_Color)3); o->color(progdefaults.HighSignal); } // Fl_Box* highcolor { btnNormalSignal = new Fl_Button(333, 142, 70, 21, _("Normal")); btnNormalSignal->callback((Fl_Callback*)cb_btnNormalSignal); } // Fl_Button* btnNormalSignal { Fl_Box* o = normalcolor = new Fl_Box(312, 141, 21, 21); normalcolor->box(FL_DIAMOND_DOWN_BOX); normalcolor->color((Fl_Color)2); o->color(progdefaults.NormSignal); } // Fl_Box* normalcolor { btnOverSignal = new Fl_Button(333, 180, 70, 21, _("Over")); btnOverSignal->callback((Fl_Callback*)cb_btnOverSignal); } // Fl_Button* btnOverSignal { Fl_Box* o = overcolor = new Fl_Box(312, 180, 21, 21); overcolor->box(FL_DIAMOND_DOWN_BOX); overcolor->color((Fl_Color)1); o->color(progdefaults.OverSignal); } // Fl_Box* overcolor { new Fl_Box(135, 110, 316, 21, _("Signal Level Colors")); } // Fl_Box* o o->end(); } // Fl_Group* o tabsColors->end(); } // Fl_Tabs* tabsColors tabColorsFonts->end(); } // Fl_Group* tabColorsFonts tabsUI->end(); } // Fl_Tabs* tabsUI tabUI->end(); } // Fl_Group* tabUI { tabWaterfall = new Fl_Group(0, 25, 600, 355, _("Waterfall")); tabWaterfall->hide(); { tabsWaterfall = new Fl_Tabs(0, 25, 600, 355); tabsWaterfall->color(FL_LIGHT1); tabsWaterfall->selection_color(FL_LIGHT1); { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("Display")); { Fl_Group* o = new Fl_Group(50, 63, 496, 190, _("Colors and cursors")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { colorbox* o = WF_Palette = new colorbox(60, 99, 380, 24, _("aa")); WF_Palette->box(FL_DOWN_BOX); WF_Palette->color(FL_FOREGROUND_COLOR); WF_Palette->selection_color(FL_BACKGROUND_COLOR); WF_Palette->labeltype(FL_NORMAL_LABEL); WF_Palette->labelfont(0); WF_Palette->labelsize(12); WF_Palette->labelcolor(FL_FOREGROUND_COLOR); WF_Palette->callback((Fl_Callback*)cb_WF_Palette); WF_Palette->align(Fl_Align(FL_ALIGN_TOP_LEFT)); WF_Palette->when(FL_WHEN_RELEASE); o->label(progdefaults.PaletteName.c_str()); o->labelsize(FL_NORMAL_SIZE); } // colorbox* WF_Palette { btnColor[0] = new Fl_Button(60, 125, 20, 24); btnColor[0]->tooltip(_("Change color")); btnColor[0]->callback((Fl_Callback*)cb_btnColor); } // Fl_Button* btnColor[0] { btnColor[1] = new Fl_Button(105, 125, 20, 24); btnColor[1]->tooltip(_("Change color")); btnColor[1]->callback((Fl_Callback*)cb_btnColor1); } // Fl_Button* btnColor[1] { btnColor[2] = new Fl_Button(150, 125, 20, 24); btnColor[2]->tooltip(_("Change color")); btnColor[2]->callback((Fl_Callback*)cb_btnColor2); } // Fl_Button* btnColor[2] { btnColor[3] = new Fl_Button(195, 125, 20, 24); btnColor[3]->tooltip(_("Change color")); btnColor[3]->callback((Fl_Callback*)cb_btnColor3); } // Fl_Button* btnColor[3] { btnColor[4] = new Fl_Button(240, 125, 20, 24); btnColor[4]->tooltip(_("Change color")); btnColor[4]->callback((Fl_Callback*)cb_btnColor4); } // Fl_Button* btnColor[4] { btnColor[5] = new Fl_Button(285, 125, 20, 24); btnColor[5]->tooltip(_("Change color")); btnColor[5]->callback((Fl_Callback*)cb_btnColor5); } // Fl_Button* btnColor[5] { btnColor[6] = new Fl_Button(330, 125, 20, 24); btnColor[6]->tooltip(_("Change color")); btnColor[6]->callback((Fl_Callback*)cb_btnColor6); } // Fl_Button* btnColor[6] { btnColor[7] = new Fl_Button(375, 125, 20, 24); btnColor[7]->tooltip(_("Change color")); btnColor[7]->callback((Fl_Callback*)cb_btnColor7); } // Fl_Button* btnColor[7] { btnColor[8] = new Fl_Button(420, 125, 20, 24); btnColor[8]->tooltip(_("Change color")); btnColor[8]->callback((Fl_Callback*)cb_btnColor8); } // Fl_Button* btnColor[8] { btnLoadPalette = new Fl_Button(450, 99, 70, 24, _("Load...")); btnLoadPalette->tooltip(_("Load a new palette")); btnLoadPalette->callback((Fl_Callback*)cb_btnLoadPalette); } // Fl_Button* btnLoadPalette { btnSavePalette = new Fl_Button(450, 125, 70, 24, _("Save...")); btnSavePalette->tooltip(_("Save this palette")); btnSavePalette->callback((Fl_Callback*)cb_btnSavePalette); } // Fl_Button* btnSavePalette { Fl_Group* o = new Fl_Group(59, 153, 113, 96, _("Bandwidth")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnUseCursorLines = new Fl_Check_Button(61, 173, 56, 20, _("ON")); btnUseCursorLines->tooltip(_("Show cursor with bandwidth lines")); btnUseCursorLines->down_box(FL_DOWN_BOX); btnUseCursorLines->callback((Fl_Callback*)cb_btnUseCursorLines); o->value(progdefaults.UseCursorLines); } // Fl_Check_Button* btnUseCursorLines { Fl_Button* o = btnCursorBWcolor = new Fl_Button(61, 196, 20, 20, _("Color")); btnCursorBWcolor->tooltip(_("Change color")); btnCursorBWcolor->color((Fl_Color)3); btnCursorBWcolor->callback((Fl_Callback*)cb_btnCursorBWcolor); btnCursorBWcolor->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.cursorLineRGBI.R,progdefaults.cursorLineRGBI.G,progdefaults.cursorLineRGBI.B)); } // Fl_Button* btnCursorBWcolor { Fl_Check_Button* o = btnUseWideCursor = new Fl_Check_Button(61, 219, 62, 20, _("Wide")); btnUseWideCursor->tooltip(_("Show bandwidth tracks on waterfall")); btnUseWideCursor->down_box(FL_DOWN_BOX); btnUseWideCursor->callback((Fl_Callback*)cb_btnUseWideCursor); o->value(progdefaults.UseWideCursor); } // Fl_Check_Button* btnUseWideCursor o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(183, 153, 113, 96, _("Center line")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnUseCursorCenterLine = new Fl_Check_Button(189, 173, 48, 20, _("ON")); btnUseCursorCenterLine->tooltip(_("Show cursor with center line")); btnUseCursorCenterLine->down_box(FL_DOWN_BOX); btnUseCursorCenterLine->callback((Fl_Callback*)cb_btnUseCursorCenterLine); o->value(progdefaults.UseCursorCenterLine); } // Fl_Check_Button* btnUseCursorCenterLine { Fl_Button* o = btnCursorCenterLineColor = new Fl_Button(189, 196, 20, 20, _("Color")); btnCursorCenterLineColor->tooltip(_("Change color")); btnCursorCenterLineColor->color(FL_BACKGROUND2_COLOR); btnCursorCenterLineColor->callback((Fl_Callback*)cb_btnCursorCenterLineColor); btnCursorCenterLineColor->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.cursorCenterRGBI.R,progdefaults.cursorCenterRGBI.G,progdefaults.cursorCenterRGBI.B)); } // Fl_Button* btnCursorCenterLineColor { Fl_Check_Button* o = btnUseWideCenter = new Fl_Check_Button(189, 221, 69, 20, _("Wide")); btnUseWideCenter->tooltip(_("Show bandwidth tracks on waterfall")); btnUseWideCenter->down_box(FL_DOWN_BOX); btnUseWideCenter->callback((Fl_Callback*)cb_btnUseWideCenter); o->value(progdefaults.UseWideCenter); } // Fl_Check_Button* btnUseWideCenter o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(306, 153, 113, 96, _("Signal tracks")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnUseBWTracks = new Fl_Check_Button(308, 172, 56, 20, _("ON")); btnUseBWTracks->tooltip(_("Show bandwidth tracks on waterfall")); btnUseBWTracks->down_box(FL_DOWN_BOX); btnUseBWTracks->callback((Fl_Callback*)cb_btnUseBWTracks); o->value(progdefaults.UseBWTracks); } // Fl_Check_Button* btnUseBWTracks { Fl_Button* o = btnBwTracksColor = new Fl_Button(308, 195, 20, 20, _("Color")); btnBwTracksColor->tooltip(_("Change color")); btnBwTracksColor->color((Fl_Color)1); btnBwTracksColor->callback((Fl_Callback*)cb_btnBwTracksColor); btnBwTracksColor->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.bwTrackRGBI.R,progdefaults.bwTrackRGBI.G,progdefaults.bwTrackRGBI.B)); } // Fl_Button* btnBwTracksColor { Fl_Check_Button* o = btnUseWideTracks = new Fl_Check_Button(308, 219, 74, 20, _("Wide")); btnUseWideTracks->tooltip(_("Show bandwidth tracks on waterfall")); btnUseWideTracks->down_box(FL_DOWN_BOX); btnUseWideTracks->callback((Fl_Callback*)cb_btnUseWideTracks); o->value(progdefaults.UseWideTracks); } // Fl_Check_Button* btnUseWideTracks o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(426, 153, 113, 96, _("Notch")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Button* o = btnNotchColor = new Fl_Button(428, 195, 20, 20, _("Color")); btnNotchColor->tooltip(_("Change color")); btnNotchColor->color((Fl_Color)1); btnNotchColor->callback((Fl_Callback*)cb_btnNotchColor); btnNotchColor->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.notchRGBI.R,progdefaults.notchRGBI.G,progdefaults.notchRGBI.B)); } // Fl_Button* btnNotchColor o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(50, 254, 496, 55, _("Frequency scale")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chkShowAudioScale = new Fl_Check_Button(60, 277, 241, 20, _("Always show audio frequencies")); chkShowAudioScale->tooltip(_("Audio or RF frequencies on waterfall scale")); chkShowAudioScale->down_box(FL_DOWN_BOX); chkShowAudioScale->callback((Fl_Callback*)cb_chkShowAudioScale); o->value(progdefaults.wf_audioscale); } // Fl_Check_Button* chkShowAudioScale { btnWaterfallFont = new Fl_Button(360, 277, 71, 24, _("Font...")); btnWaterfallFont->tooltip(_("Select waterfall scale font")); btnWaterfallFont->callback((Fl_Callback*)cb_btnWaterfallFont); } // Fl_Button* btnWaterfallFont o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(50, 310, 496, 65, _("Transmit signal")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnViewXmtSignal = new Fl_Check_Button(60, 336, 208, 20, _("Monitor transmitted signal")); btnViewXmtSignal->tooltip(_("Show transmit signal on waterfall")); btnViewXmtSignal->down_box(FL_DOWN_BOX); btnViewXmtSignal->callback((Fl_Callback*)cb_btnViewXmtSignal); o->value(progdefaults.viewXmtSignal); } // Fl_Check_Button* btnViewXmtSignal { Fl_Value_Slider2* o = valTxMonitorLevel = new Fl_Value_Slider2(318, 336, 203, 20, _("Signal level")); valTxMonitorLevel->tooltip(_("Set level for good viewing")); valTxMonitorLevel->type(1); valTxMonitorLevel->box(FL_DOWN_BOX); valTxMonitorLevel->color(FL_BACKGROUND_COLOR); valTxMonitorLevel->selection_color(FL_BACKGROUND_COLOR); valTxMonitorLevel->labeltype(FL_NORMAL_LABEL); valTxMonitorLevel->labelfont(0); valTxMonitorLevel->labelsize(14); valTxMonitorLevel->labelcolor(FL_FOREGROUND_COLOR); valTxMonitorLevel->step(0.05); valTxMonitorLevel->value(0.5); valTxMonitorLevel->textsize(14); valTxMonitorLevel->callback((Fl_Callback*)cb_valTxMonitorLevel); valTxMonitorLevel->align(Fl_Align(FL_ALIGN_TOP)); valTxMonitorLevel->when(FL_WHEN_CHANGED); o->value(progdefaults.TxMonitorLevel); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* valTxMonitorLevel o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("FFT Processing")); o->hide(); { Fl_Group* o = new Fl_Group(55, 71, 490, 135); o->box(FL_ENGRAVED_FRAME); { Fl_Counter2* o = cntLowFreqCutoff = new Fl_Counter2(100, 89, 70, 22, _("Lower limit")); cntLowFreqCutoff->tooltip(_("Low frequency limit in Hz")); cntLowFreqCutoff->type(1); cntLowFreqCutoff->box(FL_UP_BOX); cntLowFreqCutoff->color(FL_BACKGROUND_COLOR); cntLowFreqCutoff->selection_color(FL_INACTIVE_COLOR); cntLowFreqCutoff->labeltype(FL_NORMAL_LABEL); cntLowFreqCutoff->labelfont(0); cntLowFreqCutoff->labelsize(14); cntLowFreqCutoff->labelcolor(FL_FOREGROUND_COLOR); cntLowFreqCutoff->minimum(0); cntLowFreqCutoff->maximum(500); cntLowFreqCutoff->step(50); cntLowFreqCutoff->value(300); cntLowFreqCutoff->callback((Fl_Callback*)cb_cntLowFreqCutoff); cntLowFreqCutoff->align(Fl_Align(FL_ALIGN_RIGHT)); cntLowFreqCutoff->when(FL_WHEN_CHANGED); o->value(progdefaults.LowFreqCutoff); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntLowFreqCutoff { Fl_Check_Button* o = btnWFaveraging = new Fl_Check_Button(100, 125, 120, 20, _("FFT averaging")); btnWFaveraging->tooltip(_("Use averaging to decrease waterfall noise")); btnWFaveraging->down_box(FL_DOWN_BOX); btnWFaveraging->callback((Fl_Callback*)cb_btnWFaveraging); o->value(progdefaults.WFaveraging); } // Fl_Check_Button* btnWFaveraging { Fl_ListBox* o = listboxFFTPrefilter = new Fl_ListBox(100, 155, 120, 24, _("FFT prefilter window function")); listboxFFTPrefilter->tooltip(_("Select the type of FFT prefilter")); listboxFFTPrefilter->box(FL_DOWN_BOX); listboxFFTPrefilter->color(FL_BACKGROUND2_COLOR); listboxFFTPrefilter->selection_color(FL_BACKGROUND_COLOR); listboxFFTPrefilter->labeltype(FL_NORMAL_LABEL); listboxFFTPrefilter->labelfont(0); listboxFFTPrefilter->labelsize(14); listboxFFTPrefilter->labelcolor(FL_FOREGROUND_COLOR); listboxFFTPrefilter->callback((Fl_Callback*)cb_listboxFFTPrefilter); listboxFFTPrefilter->align(Fl_Align(FL_ALIGN_RIGHT)); listboxFFTPrefilter->when(FL_WHEN_RELEASE); listboxFFTPrefilter->add(_("Rectangular")); listboxFFTPrefilter->add("Blackman"); listboxFFTPrefilter->add("Hamming"); listboxFFTPrefilter->add("Hanning"); listboxFFTPrefilter->add(_("Triangular")); listboxFFTPrefilter->index(progdefaults.wfPreFilter); o->labelsize(FL_NORMAL_SIZE); listboxFFTPrefilter->end(); } // Fl_ListBox* listboxFFTPrefilter { Fl_Counter2* o = cntrWfwidth = new Fl_Counter2(323, 89, 95, 22, _("Upper limit")); cntrWfwidth->tooltip(_("High frequency limit in Hz")); cntrWfwidth->type(1); cntrWfwidth->box(FL_UP_BOX); cntrWfwidth->color(FL_BACKGROUND_COLOR); cntrWfwidth->selection_color(FL_INACTIVE_COLOR); cntrWfwidth->labeltype(FL_NORMAL_LABEL); cntrWfwidth->labelfont(0); cntrWfwidth->labelsize(14); cntrWfwidth->labelcolor(FL_FOREGROUND_COLOR); cntrWfwidth->minimum(2000); cntrWfwidth->maximum(4000); cntrWfwidth->step(100); cntrWfwidth->value(3000); cntrWfwidth->callback((Fl_Callback*)cb_cntrWfwidth); cntrWfwidth->align(Fl_Align(FL_ALIGN_RIGHT)); cntrWfwidth->when(FL_WHEN_CHANGED); o->value(progdefaults.HighFreqCutoff); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntrWfwidth { Fl_Counter2* o = wf_latency = new Fl_Counter2(323, 124, 95, 22, _("Latency")); wf_latency->tooltip(_("Signal averaging over time\n0 - least\n4 - greatest")); wf_latency->type(1); wf_latency->box(FL_UP_BOX); wf_latency->color(FL_BACKGROUND_COLOR); wf_latency->selection_color(FL_INACTIVE_COLOR); wf_latency->labeltype(FL_NORMAL_LABEL); wf_latency->labelfont(0); wf_latency->labelsize(14); wf_latency->labelcolor(FL_FOREGROUND_COLOR); wf_latency->minimum(1); wf_latency->maximum(16); wf_latency->step(1); wf_latency->value(8); wf_latency->callback((Fl_Callback*)cb_wf_latency); wf_latency->align(Fl_Align(FL_ALIGN_RIGHT)); wf_latency->when(FL_WHEN_CHANGED); o->value(progdefaults.wf_latency); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* wf_latency o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 221, 490, 80, _("Changes take effect on next program startup")); o->tooltip(_("Show me more or less waterfall")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntrWfheight = new Fl_Counter2(100, 251, 95, 22, _("Waterfall height in pixels")); cntrWfheight->tooltip(_("CPU usage increases with waterfall height")); cntrWfheight->type(1); cntrWfheight->box(FL_UP_BOX); cntrWfheight->color(FL_BACKGROUND_COLOR); cntrWfheight->selection_color(FL_INACTIVE_COLOR); cntrWfheight->labeltype(FL_NORMAL_LABEL); cntrWfheight->labelfont(0); cntrWfheight->labelsize(14); cntrWfheight->labelcolor(FL_FOREGROUND_COLOR); cntrWfheight->minimum(100); cntrWfheight->maximum(250); cntrWfheight->step(5); cntrWfheight->value(120); cntrWfheight->callback((Fl_Callback*)cb_cntrWfheight); cntrWfheight->align(Fl_Align(FL_ALIGN_RIGHT)); cntrWfheight->when(FL_WHEN_CHANGED); o->value(progdefaults.wfheight); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntrWfheight o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("Mouse")); o->hide(); { Fl_Group* o = new Fl_Group(55, 73, 490, 170); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnWaterfallHistoryDefault = new Fl_Check_Button(65, 87, 340, 20, _("Left or right click always replays audio history")); btnWaterfallHistoryDefault->tooltip(_("Replay trackline audio")); btnWaterfallHistoryDefault->down_box(FL_DOWN_BOX); btnWaterfallHistoryDefault->callback((Fl_Callback*)cb_btnWaterfallHistoryDefault); o->value(progdefaults.WaterfallHistoryDefault); } // Fl_Check_Button* btnWaterfallHistoryDefault { Fl_Check_Button* o = btnWaterfallQSY = new Fl_Check_Button(65, 117, 380, 20, _("Dragging on the waterfall scale changes frequency")); btnWaterfallQSY->tooltip(_("Enable drag cursor on waterfall scale")); btnWaterfallQSY->down_box(FL_DOWN_BOX); btnWaterfallQSY->callback((Fl_Callback*)cb_btnWaterfallQSY); o->value(progdefaults.WaterfallQSY); } // Fl_Check_Button* btnWaterfallQSY { Fl_Check_Button* o = btnWaterfallClickInsert = new Fl_Check_Button(65, 159, 225, 20, _("Insert text on single left click")); btnWaterfallClickInsert->tooltip(_("Insert special text in Rx panel\nwhen waterfall clicked")); btnWaterfallClickInsert->down_box(FL_DOWN_BOX); btnWaterfallClickInsert->callback((Fl_Callback*)cb_btnWaterfallClickInsert); o->value(progdefaults.WaterfallClickInsert); } // Fl_Check_Button* btnWaterfallClickInsert { inpWaterfallClickText = new Fl_Input2(351, 147, 180, 50); inpWaterfallClickText->tooltip(_("The string is replaced with\nthe current modem and frequency")); inpWaterfallClickText->box(FL_DOWN_BOX); inpWaterfallClickText->color(FL_BACKGROUND2_COLOR); inpWaterfallClickText->selection_color(FL_SELECTION_COLOR); inpWaterfallClickText->labeltype(FL_NORMAL_LABEL); inpWaterfallClickText->labelfont(0); inpWaterfallClickText->labelsize(14); inpWaterfallClickText->labelcolor(FL_FOREGROUND_COLOR); inpWaterfallClickText->callback((Fl_Callback*)cb_inpWaterfallClickText); inpWaterfallClickText->align(Fl_Align(FL_ALIGN_RIGHT)); inpWaterfallClickText->when(FL_WHEN_RELEASE); } // Fl_Input2* inpWaterfallClickText o->end(); } // Fl_Group* o { Fl_ListBox* o = listboxWaterfallWheelAction = new Fl_ListBox(65, 207, 150, 22, _("Wheel action")); listboxWaterfallWheelAction->tooltip(_("Select how the mouse wheel\nbehaves inside the waterfall")); listboxWaterfallWheelAction->box(FL_DOWN_BOX); listboxWaterfallWheelAction->color(FL_BACKGROUND2_COLOR); listboxWaterfallWheelAction->selection_color(FL_BACKGROUND_COLOR); listboxWaterfallWheelAction->labeltype(FL_NORMAL_LABEL); listboxWaterfallWheelAction->labelfont(0); listboxWaterfallWheelAction->labelsize(14); listboxWaterfallWheelAction->labelcolor(FL_FOREGROUND_COLOR); listboxWaterfallWheelAction->callback((Fl_Callback*)cb_listboxWaterfallWheelAction); listboxWaterfallWheelAction->align(Fl_Align(FL_ALIGN_RIGHT)); listboxWaterfallWheelAction->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); listboxWaterfallWheelAction->end(); } // Fl_ListBox* listboxWaterfallWheelAction o->end(); } // Fl_Group* o tabsWaterfall->end(); } // Fl_Tabs* tabsWaterfall tabWaterfall->end(); } // Fl_Group* tabWaterfall { tabModems = new Fl_Group(0, 25, 600, 355, _("Modems")); tabModems->hide(); { tabsModems = new Fl_Tabs(0, 25, 600, 355); tabsModems->selection_color(FL_LIGHT1); tabsModems->align(Fl_Align(FL_ALIGN_TOP_RIGHT)); { tabCW = new Fl_Group(0, 50, 600, 330, _("CW")); { tabsCW = new Fl_Tabs(0, 50, 600, 330); tabsCW->selection_color(FL_LIGHT1); { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("General")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); { Fl_Group* o = new Fl_Group(35, 85, 530, 130, _("Receive")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Value_Slider2* o = sldrCWbandwidth = new Fl_Value_Slider2(50, 149, 335, 20, _("Filter bandwidth")); sldrCWbandwidth->tooltip(_("CW dsp filter bandwidth")); sldrCWbandwidth->type(1); sldrCWbandwidth->box(FL_DOWN_BOX); sldrCWbandwidth->color(FL_BACKGROUND_COLOR); sldrCWbandwidth->selection_color(FL_BACKGROUND_COLOR); sldrCWbandwidth->labeltype(FL_NORMAL_LABEL); sldrCWbandwidth->labelfont(0); sldrCWbandwidth->labelsize(14); sldrCWbandwidth->labelcolor(FL_FOREGROUND_COLOR); sldrCWbandwidth->minimum(10); sldrCWbandwidth->maximum(400); sldrCWbandwidth->step(1); sldrCWbandwidth->value(66); sldrCWbandwidth->textsize(14); sldrCWbandwidth->callback((Fl_Callback*)cb_sldrCWbandwidth); sldrCWbandwidth->align(Fl_Align(FL_ALIGN_TOP_LEFT)); sldrCWbandwidth->when(FL_WHEN_CHANGED); o->value(progdefaults.CWbandwidth); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrCWbandwidth { valCWrcvWPM = new Fl_Value_Output(50, 188, 35, 20, _("Rx WPM")); valCWrcvWPM->color(FL_BACKGROUND2_COLOR); valCWrcvWPM->callback((Fl_Callback*)cb_valCWrcvWPM); valCWrcvWPM->align(Fl_Align(FL_ALIGN_TOP_LEFT)); } // Fl_Value_Output* valCWrcvWPM { prgsCWrcvWPM = new Fl_Progress(86, 188, 300, 20); prgsCWrcvWPM->tooltip(_("Tracked CW speed in WPM")); prgsCWrcvWPM->color(FL_BACKGROUND_COLOR); prgsCWrcvWPM->selection_color(FL_SELECTION_COLOR); prgsCWrcvWPM->align(Fl_Align(FL_ALIGN_CENTER)); } // Fl_Progress* prgsCWrcvWPM { Fl_Check_Button* o = btnCWuseSOMdecoding = new Fl_Check_Button(63, 108, 125, 20, _("SOM decoding")); btnCWuseSOMdecoding->tooltip(_("Self Organizing Mapping")); btnCWuseSOMdecoding->down_box(FL_DOWN_BOX); btnCWuseSOMdecoding->value(1); btnCWuseSOMdecoding->callback((Fl_Callback*)cb_btnCWuseSOMdecoding); o->value(progdefaults.CWuseSOMdecoding); } // Fl_Check_Button* btnCWuseSOMdecoding { Fl_Counter2* o = cntLower = new Fl_Counter2(209, 108, 65, 20, _("Lower")); cntLower->tooltip(_("Detector low threshold")); cntLower->type(1); cntLower->box(FL_UP_BOX); cntLower->color(FL_BACKGROUND_COLOR); cntLower->selection_color(FL_INACTIVE_COLOR); cntLower->labeltype(FL_NORMAL_LABEL); cntLower->labelfont(0); cntLower->labelsize(14); cntLower->labelcolor(FL_FOREGROUND_COLOR); cntLower->minimum(0.01); cntLower->maximum(0.99); cntLower->step(0.01); cntLower->value(0.45); cntLower->callback((Fl_Callback*)cb_cntLower); cntLower->align(Fl_Align(FL_ALIGN_TOP)); cntLower->when(FL_WHEN_CHANGED); o->value(progdefaults.CWlower); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntLower { Fl_Counter2* o = cntUpper = new Fl_Counter2(302, 108, 65, 20, _("Upper")); cntUpper->tooltip(_("Detector high threshold")); cntUpper->type(1); cntUpper->box(FL_UP_BOX); cntUpper->color(FL_BACKGROUND_COLOR); cntUpper->selection_color(FL_INACTIVE_COLOR); cntUpper->labeltype(FL_NORMAL_LABEL); cntUpper->labelfont(0); cntUpper->labelsize(14); cntUpper->labelcolor(FL_FOREGROUND_COLOR); cntUpper->minimum(0.01); cntUpper->maximum(0.99); cntUpper->step(0.01); cntUpper->value(0.55); cntUpper->callback((Fl_Callback*)cb_cntUpper); cntUpper->align(Fl_Align(FL_ALIGN_TOP)); cntUpper->when(FL_WHEN_CHANGED); o->value(progdefaults.CWupper); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntUpper { Fl_Check_Button* o = btnCWmfilt = new Fl_Check_Button(397, 108, 80, 20, _("Matched Filter")); btnCWmfilt->tooltip(_("Matched Filter bandwidth")); btnCWmfilt->down_box(FL_DOWN_BOX); btnCWmfilt->value(1); btnCWmfilt->callback((Fl_Callback*)cb_btnCWmfilt); o->value(progdefaults.CWmfilt); } // Fl_Check_Button* btnCWmfilt { Fl_Check_Button* o = btnCWuseFFTfilter = new Fl_Check_Button(397, 134, 125, 20, _("FFT filter")); btnCWuseFFTfilter->tooltip(_("FFT / FIR filter")); btnCWuseFFTfilter->down_box(FL_DOWN_BOX); btnCWuseFFTfilter->value(1); btnCWuseFFTfilter->callback((Fl_Callback*)cb_btnCWuseFFTfilter); o->value(progdefaults.CWuse_fft_filter); } // Fl_Check_Button* btnCWuseFFTfilter { Fl_Check_Button* o = btnCWrcvTrack = new Fl_Check_Button(397, 160, 80, 20, _("Tracking")); btnCWrcvTrack->tooltip(_("Automatic Rx speed tracking")); btnCWrcvTrack->down_box(FL_DOWN_BOX); btnCWrcvTrack->value(1); btnCWrcvTrack->callback((Fl_Callback*)cb_btnCWrcvTrack); o->value(progdefaults.CWtrack); } // Fl_Check_Button* btnCWrcvTrack { Fl_Counter2* o = cntCWrange = new Fl_Counter2(397, 187, 65, 20, _("Range, WPM")); cntCWrange->tooltip(_("Range +/- wpm")); cntCWrange->type(1); cntCWrange->box(FL_UP_BOX); cntCWrange->color(FL_BACKGROUND_COLOR); cntCWrange->selection_color(FL_INACTIVE_COLOR); cntCWrange->labeltype(FL_NORMAL_LABEL); cntCWrange->labelfont(0); cntCWrange->labelsize(14); cntCWrange->labelcolor(FL_FOREGROUND_COLOR); cntCWrange->minimum(5); cntCWrange->maximum(25); cntCWrange->step(1); cntCWrange->value(10); cntCWrange->callback((Fl_Callback*)cb_cntCWrange); cntCWrange->align(Fl_Align(FL_ALIGN_RIGHT)); cntCWrange->when(FL_WHEN_CHANGED); o->value(progdefaults.CWrange); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntCWrange o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(35, 215, 530, 150, _("Transmit")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Value_Slider2* o = sldrCWxmtWPM = new Fl_Value_Slider2(50, 240, 440, 20, _("TX WPM")); sldrCWxmtWPM->tooltip(_("My transmit CW WPM")); sldrCWxmtWPM->type(1); sldrCWxmtWPM->box(FL_DOWN_BOX); sldrCWxmtWPM->color(FL_BACKGROUND_COLOR); sldrCWxmtWPM->selection_color(FL_BACKGROUND_COLOR); sldrCWxmtWPM->labeltype(FL_NORMAL_LABEL); sldrCWxmtWPM->labelfont(0); sldrCWxmtWPM->labelsize(14); sldrCWxmtWPM->labelcolor(FL_FOREGROUND_COLOR); sldrCWxmtWPM->minimum(5); sldrCWxmtWPM->maximum(100); sldrCWxmtWPM->step(1); sldrCWxmtWPM->value(20); sldrCWxmtWPM->textsize(14); sldrCWxmtWPM->callback((Fl_Callback*)cb_sldrCWxmtWPM); sldrCWxmtWPM->align(Fl_Align(FL_ALIGN_RIGHT)); sldrCWxmtWPM->when(FL_WHEN_CHANGED); o->value(progdefaults.CWspeed); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrCWxmtWPM { Fl_Counter2* o = cntCWdefWPM = new Fl_Counter2(91, 281, 64, 20, _("Default")); cntCWdefWPM->tooltip(_("The default CW speed")); cntCWdefWPM->type(1); cntCWdefWPM->box(FL_UP_BOX); cntCWdefWPM->color(FL_BACKGROUND_COLOR); cntCWdefWPM->selection_color(FL_INACTIVE_COLOR); cntCWdefWPM->labeltype(FL_NORMAL_LABEL); cntCWdefWPM->labelfont(0); cntCWdefWPM->labelsize(14); cntCWdefWPM->labelcolor(FL_FOREGROUND_COLOR); cntCWdefWPM->minimum(5); cntCWdefWPM->maximum(200); cntCWdefWPM->step(1); cntCWdefWPM->value(18); cntCWdefWPM->callback((Fl_Callback*)cb_cntCWdefWPM); cntCWdefWPM->align(Fl_Align(FL_ALIGN_TOP)); cntCWdefWPM->when(FL_WHEN_CHANGED); o->value(progdefaults.defCWspeed); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntCWdefWPM { Fl_Counter* o = cntCWlowerlimit = new Fl_Counter(245, 281, 65, 20, _("Lower limit")); cntCWlowerlimit->tooltip(_("No slower than this")); cntCWlowerlimit->type(1); cntCWlowerlimit->minimum(5); cntCWlowerlimit->maximum(20); cntCWlowerlimit->step(5); cntCWlowerlimit->value(10); cntCWlowerlimit->callback((Fl_Callback*)cb_cntCWlowerlimit); cntCWlowerlimit->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.CWlowerlimit); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter* cntCWlowerlimit { Fl_Counter* o = cntCWupperlimit = new Fl_Counter(401, 281, 65, 20, _("Upper limit")); cntCWupperlimit->tooltip(_("No faster than this")); cntCWupperlimit->type(1); cntCWupperlimit->minimum(25); cntCWupperlimit->maximum(200); cntCWupperlimit->step(5); cntCWupperlimit->value(100); cntCWupperlimit->callback((Fl_Callback*)cb_cntCWupperlimit); cntCWupperlimit->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.CWupperlimit); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter* cntCWupperlimit { Fl_Value_Slider2* o = sldrCWfarnsworth = new Fl_Value_Slider2(50, 335, 440, 20, _("F-WPM")); sldrCWfarnsworth->tooltip(_("My transmit CW WPM")); sldrCWfarnsworth->type(1); sldrCWfarnsworth->box(FL_DOWN_BOX); sldrCWfarnsworth->color(FL_BACKGROUND_COLOR); sldrCWfarnsworth->selection_color(FL_BACKGROUND_COLOR); sldrCWfarnsworth->labeltype(FL_NORMAL_LABEL); sldrCWfarnsworth->labelfont(0); sldrCWfarnsworth->labelsize(14); sldrCWfarnsworth->labelcolor(FL_FOREGROUND_COLOR); sldrCWfarnsworth->minimum(5); sldrCWfarnsworth->maximum(100); sldrCWfarnsworth->step(1); sldrCWfarnsworth->value(20); sldrCWfarnsworth->textsize(14); sldrCWfarnsworth->callback((Fl_Callback*)cb_sldrCWfarnsworth); sldrCWfarnsworth->align(Fl_Align(FL_ALIGN_RIGHT)); sldrCWfarnsworth->when(FL_WHEN_CHANGED); o->value(progdefaults.CWfarnsworth); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrCWfarnsworth { Fl_Check_Button* o = btnCWusefarnsworth = new Fl_Check_Button(70, 312, 180, 15, _("Use Farnsworth timing")); btnCWusefarnsworth->down_box(FL_DOWN_BOX); btnCWusefarnsworth->callback((Fl_Callback*)cb_btnCWusefarnsworth); o->value(progdefaults.CWusefarnsworth); } // Fl_Check_Button* btnCWusefarnsworth o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Timing and QSK")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->hide(); { Fl_Group* o = new Fl_Group(35, 85, 530, 120, _("Timing")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntCWweight = new Fl_Counter2(45, 114, 65, 20, _("Weight (%)")); cntCWweight->tooltip(_("Dot to dot-space ratio")); cntCWweight->type(1); cntCWweight->box(FL_UP_BOX); cntCWweight->color(FL_BACKGROUND_COLOR); cntCWweight->selection_color(FL_INACTIVE_COLOR); cntCWweight->labeltype(FL_NORMAL_LABEL); cntCWweight->labelfont(0); cntCWweight->labelsize(14); cntCWweight->labelcolor(FL_FOREGROUND_COLOR); cntCWweight->minimum(20); cntCWweight->maximum(80); cntCWweight->step(1); cntCWweight->value(50); cntCWweight->callback((Fl_Callback*)cb_cntCWweight); cntCWweight->align(Fl_Align(FL_ALIGN_RIGHT)); cntCWweight->when(FL_WHEN_CHANGED); o->value(progdefaults.CWweight); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntCWweight { Fl_Counter2* o = cntCWdash2dot = new Fl_Counter2(270, 114, 64, 20, _("Dash to dot ratio")); cntCWdash2dot->tooltip(_("Dash to dot ratio")); cntCWdash2dot->type(1); cntCWdash2dot->box(FL_UP_BOX); cntCWdash2dot->color(FL_BACKGROUND_COLOR); cntCWdash2dot->selection_color(FL_INACTIVE_COLOR); cntCWdash2dot->labeltype(FL_NORMAL_LABEL); cntCWdash2dot->labelfont(0); cntCWdash2dot->labelsize(14); cntCWdash2dot->labelcolor(FL_FOREGROUND_COLOR); cntCWdash2dot->minimum(2.5); cntCWdash2dot->maximum(4); cntCWdash2dot->value(3); cntCWdash2dot->callback((Fl_Callback*)cb_cntCWdash2dot); cntCWdash2dot->align(Fl_Align(FL_ALIGN_RIGHT)); cntCWdash2dot->when(FL_WHEN_CHANGED); o->value(progdefaults.CWdash2dot); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntCWdash2dot { Fl_Counter2* o = cntCWrisetime = new Fl_Counter2(270, 145, 65, 20, _("Edge timing")); cntCWrisetime->tooltip(_("Leading and Trailing edge risetimes (msec)")); cntCWrisetime->type(1); cntCWrisetime->box(FL_UP_BOX); cntCWrisetime->color(FL_BACKGROUND_COLOR); cntCWrisetime->selection_color(FL_INACTIVE_COLOR); cntCWrisetime->labeltype(FL_NORMAL_LABEL); cntCWrisetime->labelfont(0); cntCWrisetime->labelsize(14); cntCWrisetime->labelcolor(FL_FOREGROUND_COLOR); cntCWrisetime->minimum(0); cntCWrisetime->maximum(15); cntCWrisetime->value(4); cntCWrisetime->callback((Fl_Callback*)cb_cntCWrisetime); cntCWrisetime->align(Fl_Align(FL_ALIGN_RIGHT)); cntCWrisetime->when(FL_WHEN_CHANGED); o->value(progdefaults.CWrisetime); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntCWrisetime { Fl_ListBox* o = i_listboxQSKshape = new Fl_ListBox(45, 144, 112, 20, _("Edge shape")); i_listboxQSKshape->tooltip(_("Raised cosine = Hanning")); i_listboxQSKshape->box(FL_DOWN_BOX); i_listboxQSKshape->color(FL_BACKGROUND2_COLOR); i_listboxQSKshape->selection_color(FL_BACKGROUND_COLOR); i_listboxQSKshape->labeltype(FL_NORMAL_LABEL); i_listboxQSKshape->labelfont(0); i_listboxQSKshape->labelsize(14); i_listboxQSKshape->labelcolor(FL_FOREGROUND_COLOR); i_listboxQSKshape->callback((Fl_Callback*)cb_i_listboxQSKshape); i_listboxQSKshape->align(Fl_Align(FL_ALIGN_RIGHT)); i_listboxQSKshape->when(FL_WHEN_RELEASE); o->add("Hanning|Blackman"); o->index(progdefaults.QSKshape+1); o->labelsize(FL_NORMAL_SIZE); i_listboxQSKshape->end(); } // Fl_ListBox* i_listboxQSKshape { Fl_Check_Button* o = btnCWnarrow = new Fl_Check_Button(45, 175, 225, 15, _("Edge decreases pulse width")); btnCWnarrow->tooltip(_("Weight decreases with increasing edge timing")); btnCWnarrow->down_box(FL_DOWN_BOX); btnCWnarrow->callback((Fl_Callback*)cb_btnCWnarrow); o->value(progdefaults.CWnarrow); } // Fl_Check_Button* btnCWnarrow o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(35, 217, 530, 118, _("QSK")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnQSK = new Fl_Check_Button(45, 245, 211, 20, _("QSK on right audio channel")); btnQSK->tooltip(_("Generate square wave signal on right channel")); btnQSK->down_box(FL_DOWN_BOX); btnQSK->callback((Fl_Callback*)cb_btnQSK); o->value(progdefaults.QSK); } // Fl_Check_Button* btnQSK { Fl_Counter2* o = cntPreTiming = new Fl_Counter2(45, 275, 64, 20, _("Pre-keydown timing (ms)")); cntPreTiming->tooltip(_("Msec pre-keydown (+ is earlier in time)")); cntPreTiming->type(1); cntPreTiming->box(FL_UP_BOX); cntPreTiming->color(FL_BACKGROUND_COLOR); cntPreTiming->selection_color(FL_INACTIVE_COLOR); cntPreTiming->labeltype(FL_NORMAL_LABEL); cntPreTiming->labelfont(0); cntPreTiming->labelsize(14); cntPreTiming->labelcolor(FL_FOREGROUND_COLOR); cntPreTiming->minimum(0); cntPreTiming->maximum(20); cntPreTiming->step(0.5); cntPreTiming->callback((Fl_Callback*)cb_cntPreTiming); cntPreTiming->align(Fl_Align(FL_ALIGN_RIGHT)); cntPreTiming->when(FL_WHEN_CHANGED); o->value(progdefaults.CWpre); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntPreTiming { Fl_Counter2* o = cntPostTiming = new Fl_Counter2(45, 305, 64, 20, _("Post-keydown timing (ms)")); cntPostTiming->tooltip(_("Msec post-keydown (+ is earlier in time)")); cntPostTiming->type(1); cntPostTiming->box(FL_UP_BOX); cntPostTiming->color(FL_BACKGROUND_COLOR); cntPostTiming->selection_color(FL_INACTIVE_COLOR); cntPostTiming->labeltype(FL_NORMAL_LABEL); cntPostTiming->labelfont(0); cntPostTiming->labelsize(14); cntPostTiming->labelcolor(FL_FOREGROUND_COLOR); cntPostTiming->minimum(-20); cntPostTiming->maximum(20); cntPostTiming->step(0.5); cntPostTiming->callback((Fl_Callback*)cb_cntPostTiming); cntPostTiming->align(Fl_Align(FL_ALIGN_RIGHT)); cntPostTiming->when(FL_WHEN_CHANGED); o->value(progdefaults.CWpre); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntPostTiming { Fl_Check_Button* o = btnQSKadjust = new Fl_Check_Button(320, 275, 160, 20, _("Send continuously")); btnQSKadjust->tooltip(_("Send a continuous stream of test characters")); btnQSKadjust->down_box(FL_DOWN_BOX); btnQSKadjust->callback((Fl_Callback*)cb_btnQSKadjust); o->value(progdefaults.QSKadjust); } // Fl_Check_Button* btnQSKadjust { Fl_ListBox* o = i_listbox_test_char = new Fl_ListBox(320, 245, 41, 20, _("Test char")); i_listbox_test_char->tooltip(_("Test character for QSK adjustment")); i_listbox_test_char->box(FL_DOWN_BOX); i_listbox_test_char->color(FL_BACKGROUND2_COLOR); i_listbox_test_char->selection_color(FL_BACKGROUND_COLOR); i_listbox_test_char->labeltype(FL_NORMAL_LABEL); i_listbox_test_char->labelfont(0); i_listbox_test_char->labelsize(14); i_listbox_test_char->labelcolor(FL_FOREGROUND_COLOR); i_listbox_test_char->callback((Fl_Callback*)cb_i_listbox_test_char); i_listbox_test_char->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_test_char->when(FL_WHEN_RELEASE); o->add(szTestChar); o->index(progdefaults.TestChar+1); o->labelsize(FL_NORMAL_SIZE); i_listbox_test_char->end(); } // Fl_ListBox* i_listbox_test_char o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Prosigns")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->hide(); { Fl_Group* o = new Fl_Group(35, 85, 530, 283); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnCW_use_paren = new Fl_Check_Button(266, 244, 68, 15, _("Use \'(\' paren not KN")); btnCW_use_paren->down_box(FL_DOWN_BOX); btnCW_use_paren->callback((Fl_Callback*)cb_btnCW_use_paren); o->value(progdefaults.CW_use_paren); } // Fl_Check_Button* btnCW_use_paren o->end(); } // Fl_Group* o { Fl_ListBox* o = listbox_prosign[0] = new Fl_ListBox(167, 102, 47, 22, _("")); listbox_prosign[0]->box(FL_DOWN_BOX); listbox_prosign[0]->color(FL_BACKGROUND2_COLOR); listbox_prosign[0]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[0]->labeltype(FL_NORMAL_LABEL); listbox_prosign[0]->labelfont(0); listbox_prosign[0]->labelsize(14); listbox_prosign[0]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[0]->callback((Fl_Callback*)cb_listbox_prosign); listbox_prosign[0]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[0]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[0]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[0]->end(); } // Fl_ListBox* listbox_prosign[0] { Fl_ListBox* o = listbox_prosign[1] = new Fl_ListBox(167, 129, 47, 22, _("")); listbox_prosign[1]->box(FL_DOWN_BOX); listbox_prosign[1]->color(FL_BACKGROUND2_COLOR); listbox_prosign[1]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[1]->labeltype(FL_NORMAL_LABEL); listbox_prosign[1]->labelfont(0); listbox_prosign[1]->labelsize(14); listbox_prosign[1]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[1]->callback((Fl_Callback*)cb_listbox_prosign1); listbox_prosign[1]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[1]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[1]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[1]->end(); } // Fl_ListBox* listbox_prosign[1] { Fl_ListBox* o = listbox_prosign[2] = new Fl_ListBox(167, 157, 47, 22, _("")); listbox_prosign[2]->box(FL_DOWN_BOX); listbox_prosign[2]->color(FL_BACKGROUND2_COLOR); listbox_prosign[2]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[2]->labeltype(FL_NORMAL_LABEL); listbox_prosign[2]->labelfont(0); listbox_prosign[2]->labelsize(14); listbox_prosign[2]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[2]->callback((Fl_Callback*)cb_listbox_prosign2); listbox_prosign[2]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[2]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[2]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[2]->end(); } // Fl_ListBox* listbox_prosign[2] { Fl_ListBox* o = listbox_prosign[3] = new Fl_ListBox(167, 184, 47, 22, _("")); listbox_prosign[3]->box(FL_DOWN_BOX); listbox_prosign[3]->color(FL_BACKGROUND2_COLOR); listbox_prosign[3]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[3]->labeltype(FL_NORMAL_LABEL); listbox_prosign[3]->labelfont(0); listbox_prosign[3]->labelsize(14); listbox_prosign[3]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[3]->callback((Fl_Callback*)cb_listbox_prosign3); listbox_prosign[3]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[3]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[3]; o->value(s); listbox_prosign[3]->end(); } // Fl_ListBox* listbox_prosign[3] { Fl_ListBox* o = listbox_prosign[4] = new Fl_ListBox(167, 212, 47, 22, _("")); listbox_prosign[4]->box(FL_DOWN_BOX); listbox_prosign[4]->color(FL_BACKGROUND2_COLOR); listbox_prosign[4]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[4]->labeltype(FL_NORMAL_LABEL); listbox_prosign[4]->labelfont(0); listbox_prosign[4]->labelsize(14); listbox_prosign[4]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[4]->callback((Fl_Callback*)cb_listbox_prosign4); listbox_prosign[4]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[4]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[4]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[4]->end(); } // Fl_ListBox* listbox_prosign[4] { Fl_ListBox* o = listbox_prosign[5] = new Fl_ListBox(167, 240, 47, 22, _("")); listbox_prosign[5]->box(FL_DOWN_BOX); listbox_prosign[5]->color(FL_BACKGROUND2_COLOR); listbox_prosign[5]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[5]->labeltype(FL_NORMAL_LABEL); listbox_prosign[5]->labelfont(0); listbox_prosign[5]->labelsize(14); listbox_prosign[5]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[5]->callback((Fl_Callback*)cb_listbox_prosign5); listbox_prosign[5]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[5]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[5]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[5]->end(); } // Fl_ListBox* listbox_prosign[5] { Fl_ListBox* o = listbox_prosign[6] = new Fl_ListBox(167, 267, 47, 22, _("")); listbox_prosign[6]->box(FL_DOWN_BOX); listbox_prosign[6]->color(FL_BACKGROUND2_COLOR); listbox_prosign[6]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[6]->labeltype(FL_NORMAL_LABEL); listbox_prosign[6]->labelfont(0); listbox_prosign[6]->labelsize(14); listbox_prosign[6]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[6]->callback((Fl_Callback*)cb_listbox_prosign6); listbox_prosign[6]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[6]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[6]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[6]->end(); } // Fl_ListBox* listbox_prosign[6] { Fl_ListBox* o = listbox_prosign[7] = new Fl_ListBox(167, 295, 47, 22, _("")); listbox_prosign[7]->box(FL_DOWN_BOX); listbox_prosign[7]->color(FL_BACKGROUND2_COLOR); listbox_prosign[7]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[7]->labeltype(FL_NORMAL_LABEL); listbox_prosign[7]->labelfont(0); listbox_prosign[7]->labelsize(14); listbox_prosign[7]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[7]->callback((Fl_Callback*)cb_listbox_prosign7); listbox_prosign[7]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[7]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[7]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[7]->end(); } // Fl_ListBox* listbox_prosign[7] { Fl_ListBox* o = listbox_prosign[8] = new Fl_ListBox(167, 323, 47, 22, _("")); listbox_prosign[8]->box(FL_DOWN_BOX); listbox_prosign[8]->color(FL_BACKGROUND2_COLOR); listbox_prosign[8]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[8]->labeltype(FL_NORMAL_LABEL); listbox_prosign[8]->labelfont(0); listbox_prosign[8]->labelsize(14); listbox_prosign[8]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[8]->callback((Fl_Callback*)cb_listbox_prosign8); listbox_prosign[8]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[8]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[8]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[8]->end(); } // Fl_ListBox* listbox_prosign[8] o->end(); } // Fl_Group* o tabsCW->end(); } // Fl_Tabs* tabsCW tabCW->end(); } // Fl_Group* tabCW { tabDomEX = new Fl_Group(0, 50, 600, 330, _("Dom")); tabDomEX->hide(); { Fl_Group* o = new Fl_Group(55, 60, 490, 180); o->box(FL_ENGRAVED_FRAME); { txtSecondary = new Fl_Input2(65, 87, 360, 40, _("Secondary Text")); txtSecondary->tooltip(_("Text to send during keyboard idle times")); txtSecondary->type(4); txtSecondary->box(FL_DOWN_BOX); txtSecondary->color(FL_BACKGROUND2_COLOR); txtSecondary->selection_color(FL_SELECTION_COLOR); txtSecondary->labeltype(FL_NORMAL_LABEL); txtSecondary->labelfont(0); txtSecondary->labelsize(14); txtSecondary->labelcolor(FL_FOREGROUND_COLOR); txtSecondary->callback((Fl_Callback*)cb_txtSecondary); txtSecondary->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txtSecondary->when(FL_WHEN_CHANGED); txtSecondary->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* txtSecondary { Fl_Check_Button* o = valDominoEX_FILTER = new Fl_Check_Button(65, 141, 80, 20, _("Filtering")); valDominoEX_FILTER->tooltip(_("Use DSP filter before decoder")); valDominoEX_FILTER->down_box(FL_DOWN_BOX); valDominoEX_FILTER->value(1); valDominoEX_FILTER->callback((Fl_Callback*)cb_valDominoEX_FILTER); o->value(progdefaults.DOMINOEX_FILTER); } // Fl_Check_Button* valDominoEX_FILTER { Fl_Counter2* o = valDominoEX_BW = new Fl_Counter2(206, 141, 63, 20, _("Filter bandwidth factor")); valDominoEX_BW->tooltip(_("Filter bandwidth relative to signal width")); valDominoEX_BW->type(1); valDominoEX_BW->box(FL_UP_BOX); valDominoEX_BW->color(FL_BACKGROUND_COLOR); valDominoEX_BW->selection_color(FL_INACTIVE_COLOR); valDominoEX_BW->labeltype(FL_NORMAL_LABEL); valDominoEX_BW->labelfont(0); valDominoEX_BW->labelsize(14); valDominoEX_BW->labelcolor(FL_FOREGROUND_COLOR); valDominoEX_BW->minimum(1); valDominoEX_BW->maximum(2); valDominoEX_BW->value(1.5); valDominoEX_BW->callback((Fl_Callback*)cb_valDominoEX_BW); valDominoEX_BW->align(Fl_Align(FL_ALIGN_RIGHT)); valDominoEX_BW->when(FL_WHEN_CHANGED); o->value(progdefaults.DOMINOEX_BW); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* valDominoEX_BW { Fl_Check_Button* o = chkDominoEX_FEC = new Fl_Check_Button(65, 171, 51, 20, _("FEC")); chkDominoEX_FEC->tooltip(_("Enable MultiPSK-compatible FEC")); chkDominoEX_FEC->down_box(FL_DOWN_BOX); chkDominoEX_FEC->callback((Fl_Callback*)cb_chkDominoEX_FEC); o->value(progdefaults.DOMINOEX_FEC); } // Fl_Check_Button* chkDominoEX_FEC { Fl_Value_Slider2* o = valDomCWI = new Fl_Value_Slider2(65, 207, 260, 20, _("CWI threshold")); valDomCWI->tooltip(_("CWI detection and suppression")); valDomCWI->type(1); valDomCWI->box(FL_DOWN_BOX); valDomCWI->color(FL_BACKGROUND_COLOR); valDomCWI->selection_color(FL_BACKGROUND_COLOR); valDomCWI->labeltype(FL_NORMAL_LABEL); valDomCWI->labelfont(0); valDomCWI->labelsize(14); valDomCWI->labelcolor(FL_FOREGROUND_COLOR); valDomCWI->textsize(14); valDomCWI->callback((Fl_Callback*)cb_valDomCWI); valDomCWI->align(Fl_Align(FL_ALIGN_TOP)); valDomCWI->when(FL_WHEN_CHANGED); o->value(progdefaults.DomCWI); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* valDomCWI { Fl_Counter2* o = valDominoEX_PATHS = new Fl_Counter2(389, 194, 63, 20, _("Paths (hidden)")); valDominoEX_PATHS->type(1); valDominoEX_PATHS->box(FL_UP_BOX); valDominoEX_PATHS->color(FL_BACKGROUND_COLOR); valDominoEX_PATHS->selection_color(FL_INACTIVE_COLOR); valDominoEX_PATHS->labeltype(FL_NORMAL_LABEL); valDominoEX_PATHS->labelfont(0); valDominoEX_PATHS->labelsize(14); valDominoEX_PATHS->labelcolor(FL_FOREGROUND_COLOR); valDominoEX_PATHS->minimum(4); valDominoEX_PATHS->maximum(8); valDominoEX_PATHS->step(1); valDominoEX_PATHS->value(5); valDominoEX_PATHS->callback((Fl_Callback*)cb_valDominoEX_PATHS); valDominoEX_PATHS->align(Fl_Align(FL_ALIGN_BOTTOM)); valDominoEX_PATHS->when(FL_WHEN_CHANGED); o->value(progdefaults.DOMINOEX_PATHS); o->labelsize(FL_NORMAL_SIZE); o->hide(); } // Fl_Counter2* valDominoEX_PATHS o->end(); } // Fl_Group* o tabDomEX->end(); } // Fl_Group* tabDomEX { tabFeld = new Fl_Group(0, 50, 600, 330, _("Feld")); tabFeld->hide(); { Fl_Group* o = new Fl_Group(55, 72, 490, 145); o->box(FL_ENGRAVED_FRAME); { Fl_ListBox* o = listboxHellFont = new Fl_ListBox(65, 82, 150, 20, _("Transmit font")); listboxHellFont->tooltip(_("Select TX raster font")); listboxHellFont->box(FL_DOWN_BOX); listboxHellFont->color(FL_BACKGROUND2_COLOR); listboxHellFont->selection_color(FL_BACKGROUND_COLOR); listboxHellFont->labeltype(FL_NORMAL_LABEL); listboxHellFont->labelfont(0); listboxHellFont->labelsize(14); listboxHellFont->labelcolor(FL_FOREGROUND_COLOR); listboxHellFont->callback((Fl_Callback*)cb_listboxHellFont); listboxHellFont->align(Fl_Align(FL_ALIGN_RIGHT)); listboxHellFont->when(FL_WHEN_RELEASE); o->add(szFeldFonts); o->index(progdefaults.feldfontnbr); o->labelsize(FL_NORMAL_SIZE); listboxHellFont->end(); } // Fl_ListBox* listboxHellFont { Fl_Check_Button* o = btnBlackboard = new Fl_Check_Button(350, 82, 125, 20, _("Reverse video")); btnBlackboard->tooltip(_("Display RX in reverse video")); btnBlackboard->down_box(FL_DOWN_BOX); btnBlackboard->callback((Fl_Callback*)cb_btnBlackboard); o->value(progdefaults.HellBlackboard); } // Fl_Check_Button* btnBlackboard { Fl_Spinner2* o = valHellXmtWidth = new Fl_Spinner2(65, 112, 40, 20, _("Transmit width")); valHellXmtWidth->tooltip(_("# of multiple scans / character line")); valHellXmtWidth->box(FL_NO_BOX); valHellXmtWidth->color(FL_BACKGROUND_COLOR); valHellXmtWidth->selection_color(FL_BACKGROUND_COLOR); valHellXmtWidth->labeltype(FL_NORMAL_LABEL); valHellXmtWidth->labelfont(0); valHellXmtWidth->labelsize(14); valHellXmtWidth->labelcolor(FL_FOREGROUND_COLOR); valHellXmtWidth->maximum(3); valHellXmtWidth->callback((Fl_Callback*)cb_valHellXmtWidth); valHellXmtWidth->align(Fl_Align(FL_ALIGN_RIGHT)); valHellXmtWidth->when(FL_WHEN_RELEASE); o->value(progdefaults.HellXmtWidth); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* valHellXmtWidth { Fl_Check_Button* o = btnHellRcvWidth = new Fl_Check_Button(350, 112, 155, 20, _("Halve receive width")); btnHellRcvWidth->tooltip(_("Compress Rx in time")); btnHellRcvWidth->down_box(FL_DOWN_BOX); btnHellRcvWidth->callback((Fl_Callback*)cb_btnHellRcvWidth); o->value(progdefaults.HellRcvWidth); } // Fl_Check_Button* btnHellRcvWidth { Fl_ListBox* o = listboxHellPulse = new Fl_ListBox(65, 159, 150, 20, _("Pulse shape")); listboxHellPulse->tooltip(_("Raised cosine pulse shape factor")); listboxHellPulse->box(FL_DOWN_BOX); listboxHellPulse->color(FL_BACKGROUND2_COLOR); listboxHellPulse->selection_color(FL_BACKGROUND_COLOR); listboxHellPulse->labeltype(FL_NORMAL_LABEL); listboxHellPulse->labelfont(0); listboxHellPulse->labelsize(14); listboxHellPulse->labelcolor(FL_FOREGROUND_COLOR); listboxHellPulse->callback((Fl_Callback*)cb_listboxHellPulse); listboxHellPulse->align(Fl_Align(FL_ALIGN_TOP_LEFT)); listboxHellPulse->when(FL_WHEN_RELEASE); o->add(_("Slow (4 msec)")); o->add(_("Fast (2 msec)")); o->index(progdefaults.HellPulseFast); o->labelsize(FL_NORMAL_SIZE); listboxHellPulse->end(); } // Fl_ListBox* listboxHellPulse { Fl_Value_Slider2* o = sldrHellBW = new Fl_Value_Slider2(256, 159, 246, 20, _("Receive filter bandwidth")); sldrHellBW->tooltip(_("Adjust the DSP bandwidth")); sldrHellBW->type(1); sldrHellBW->box(FL_DOWN_BOX); sldrHellBW->color(FL_BACKGROUND_COLOR); sldrHellBW->selection_color(FL_BACKGROUND_COLOR); sldrHellBW->labeltype(FL_NORMAL_LABEL); sldrHellBW->labelfont(0); sldrHellBW->labelsize(14); sldrHellBW->labelcolor(FL_FOREGROUND_COLOR); sldrHellBW->minimum(10); sldrHellBW->maximum(2400); sldrHellBW->step(5); sldrHellBW->value(400); sldrHellBW->textsize(14); sldrHellBW->callback((Fl_Callback*)cb_sldrHellBW); sldrHellBW->align(Fl_Align(FL_ALIGN_TOP_LEFT)); sldrHellBW->when(FL_WHEN_CHANGED); o->value(progdefaults.HELL_BW); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrHellBW { Fl_Check_Button* o = btnFeldHellIdle = new Fl_Check_Button(65, 189, 230, 20, _("Transmit periods (.) when idle")); btnFeldHellIdle->tooltip(_("Transmits a diddle dot when no keyboard activity")); btnFeldHellIdle->down_box(FL_DOWN_BOX); btnFeldHellIdle->value(1); btnFeldHellIdle->callback((Fl_Callback*)cb_btnFeldHellIdle); o->value(progdefaults.HellXmtIdle); } // Fl_Check_Button* btnFeldHellIdle { Fl_Check_Button* o = btnHellXmtWidth = new Fl_Check_Button(355, 187, 113, 20, _("2x Xmt Width (hidden)")); btnHellXmtWidth->down_box(FL_DOWN_BOX); btnHellXmtWidth->callback((Fl_Callback*)cb_btnHellXmtWidth); o->value(progdefaults.HellXmtWidth); o->hide(); } // Fl_Check_Button* btnHellXmtWidth o->end(); } // Fl_Group* o tabFeld->end(); } // Fl_Group* tabFeld { tabMT63 = new Fl_Group(0, 50, 600, 330, _("MT-63")); tabMT63->hide(); { Fl_Group* o = new Fl_Group(55, 73, 490, 84); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnMT63_8bit = new Fl_Check_Button(200, 87, 205, 20, _("8-bit extended characters (UTF-8)")); btnMT63_8bit->tooltip(_("Enable this for UTF-8 characters")); btnMT63_8bit->down_box(FL_DOWN_BOX); btnMT63_8bit->value(1); btnMT63_8bit->callback((Fl_Callback*)cb_btnMT63_8bit); o->value(progdefaults.mt63_8bit); } // Fl_Check_Button* btnMT63_8bit { Fl_Check_Button* o = btnMT63_rx_integration = new Fl_Check_Button(200, 117, 190, 20, _("Long receive integration")); btnMT63_rx_integration->tooltip(_("Enable for very weak signals")); btnMT63_rx_integration->down_box(FL_DOWN_BOX); btnMT63_rx_integration->value(1); btnMT63_rx_integration->callback((Fl_Callback*)cb_btnMT63_rx_integration); o->value(progdefaults.mt63_rx_integration); } // Fl_Check_Button* btnMT63_rx_integration o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 169, 490, 131); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnMT63_usetones = new Fl_Check_Button(199, 177, 200, 20, _("Transmit lower start tone")); btnMT63_usetones->down_box(FL_DOWN_BOX); btnMT63_usetones->callback((Fl_Callback*)cb_btnMT63_usetones); o->value(progdefaults.mt63_usetones); } // Fl_Check_Button* btnMT63_usetones { Fl_Check_Button* o = btnMT63_upper_lower = new Fl_Check_Button(199, 207, 200, 20, _("Transmit upper start tone")); btnMT63_upper_lower->down_box(FL_DOWN_BOX); btnMT63_upper_lower->callback((Fl_Callback*)cb_btnMT63_upper_lower); o->value(progdefaults.mt63_twotones); if (!btnMT63_usetones->value()) o->deactivate(); } // Fl_Check_Button* btnMT63_upper_lower { Fl_Spinner2* o = MT63_tone_duration = new Fl_Spinner2(199, 233, 40, 20, _("Tone Duration (secs)")); MT63_tone_duration->box(FL_NO_BOX); MT63_tone_duration->color(FL_BACKGROUND_COLOR); MT63_tone_duration->selection_color(FL_BACKGROUND_COLOR); MT63_tone_duration->labeltype(FL_NORMAL_LABEL); MT63_tone_duration->labelfont(0); MT63_tone_duration->labelsize(14); MT63_tone_duration->labelcolor(FL_FOREGROUND_COLOR); MT63_tone_duration->maximum(10); MT63_tone_duration->value(4); MT63_tone_duration->callback((Fl_Callback*)cb_MT63_tone_duration); MT63_tone_duration->align(Fl_Align(FL_ALIGN_RIGHT)); MT63_tone_duration->when(FL_WHEN_RELEASE); o->value(progdefaults.mt63_tone_duration); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* MT63_tone_duration { Fl_Check_Button* o = btnMT63_at500 = new Fl_Check_Button(199, 262, 200, 20, _("Allow manual tuning")); btnMT63_at500->down_box(FL_DOWN_BOX); btnMT63_at500->callback((Fl_Callback*)cb_btnMT63_at500); o->value(!progdefaults.mt63_at500); } // Fl_Check_Button* btnMT63_at500 o->end(); } // Fl_Group* o tabMT63->end(); } // Fl_Group* tabMT63 { tabOlivia = new Fl_Group(0, 50, 600, 330, _("Olivia")); tabOlivia->hide(); { Fl_Group* o = new Fl_Group(55, 76, 490, 280); o->box(FL_ENGRAVED_FRAME); { Fl_ListBox* o = i_listbox_olivia_bandwidth = new Fl_ListBox(110, 96, 85, 22, _("Bandwidth")); i_listbox_olivia_bandwidth->tooltip(_("Select bandwidth")); i_listbox_olivia_bandwidth->box(FL_DOWN_BOX); i_listbox_olivia_bandwidth->color(FL_BACKGROUND2_COLOR); i_listbox_olivia_bandwidth->selection_color(FL_BACKGROUND_COLOR); i_listbox_olivia_bandwidth->labeltype(FL_NORMAL_LABEL); i_listbox_olivia_bandwidth->labelfont(0); i_listbox_olivia_bandwidth->labelsize(14); i_listbox_olivia_bandwidth->labelcolor(FL_FOREGROUND_COLOR); i_listbox_olivia_bandwidth->callback((Fl_Callback*)cb_i_listbox_olivia_bandwidth); i_listbox_olivia_bandwidth->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_olivia_bandwidth->when(FL_WHEN_RELEASE); o->add(szOliviaBandwidth); o->index(progdefaults.oliviabw+1); o->labelsize(FL_NORMAL_SIZE); i_listbox_olivia_bandwidth->end(); } // Fl_ListBox* i_listbox_olivia_bandwidth { Fl_ListBox* o = i_listbox_olivia_tones = new Fl_ListBox(371, 96, 70, 22, _("Tones")); i_listbox_olivia_tones->tooltip(_("Select number of tones")); i_listbox_olivia_tones->box(FL_DOWN_BOX); i_listbox_olivia_tones->color(FL_BACKGROUND2_COLOR); i_listbox_olivia_tones->selection_color(FL_BACKGROUND_COLOR); i_listbox_olivia_tones->labeltype(FL_NORMAL_LABEL); i_listbox_olivia_tones->labelfont(0); i_listbox_olivia_tones->labelsize(14); i_listbox_olivia_tones->labelcolor(FL_FOREGROUND_COLOR); i_listbox_olivia_tones->callback((Fl_Callback*)cb_i_listbox_olivia_tones); i_listbox_olivia_tones->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_olivia_tones->when(FL_WHEN_RELEASE); o->add(szOliviaTones); o->index(progdefaults.oliviatones+1); o->labelsize(FL_NORMAL_SIZE); i_listbox_olivia_tones->end(); } // Fl_ListBox* i_listbox_olivia_tones { Fl_Group* o = new Fl_Group(110, 135, 379, 133, _("Receive synchronizer")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntOlivia_smargin = new Fl_Counter2(125, 166, 70, 22, _("Tune margin (tone frequency spacing)")); cntOlivia_smargin->tooltip(_("Change ONLY to experiment")); cntOlivia_smargin->type(1); cntOlivia_smargin->box(FL_UP_BOX); cntOlivia_smargin->color(FL_BACKGROUND_COLOR); cntOlivia_smargin->selection_color(FL_INACTIVE_COLOR); cntOlivia_smargin->labeltype(FL_NORMAL_LABEL); cntOlivia_smargin->labelfont(0); cntOlivia_smargin->labelsize(14); cntOlivia_smargin->labelcolor(FL_FOREGROUND_COLOR); cntOlivia_smargin->minimum(2); cntOlivia_smargin->maximum(128); cntOlivia_smargin->step(1); cntOlivia_smargin->value(8); cntOlivia_smargin->callback((Fl_Callback*)cb_cntOlivia_smargin); cntOlivia_smargin->align(Fl_Align(FL_ALIGN_RIGHT)); cntOlivia_smargin->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntOlivia_smargin { Fl_Counter2* o = cntOlivia_sinteg = new Fl_Counter2(125, 198, 70, 22, _("Integration period (FEC blocks)")); cntOlivia_sinteg->tooltip(_("Change ONLY to experiment")); cntOlivia_sinteg->type(1); cntOlivia_sinteg->box(FL_UP_BOX); cntOlivia_sinteg->color(FL_BACKGROUND_COLOR); cntOlivia_sinteg->selection_color(FL_INACTIVE_COLOR); cntOlivia_sinteg->labeltype(FL_NORMAL_LABEL); cntOlivia_sinteg->labelfont(0); cntOlivia_sinteg->labelsize(14); cntOlivia_sinteg->labelcolor(FL_FOREGROUND_COLOR); cntOlivia_sinteg->minimum(2); cntOlivia_sinteg->maximum(128); cntOlivia_sinteg->step(1); cntOlivia_sinteg->value(4); cntOlivia_sinteg->callback((Fl_Callback*)cb_cntOlivia_sinteg); cntOlivia_sinteg->align(Fl_Align(FL_ALIGN_RIGHT)); cntOlivia_sinteg->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntOlivia_sinteg { Fl_Check_Button* o = btn_olivia_reset_fec = new Fl_Check_Button(126, 230, 349, 20, _("Reset FEC blocks when changing BW or Tones")); btn_olivia_reset_fec->tooltip(_("Enable this for UTF-8 character transmission")); btn_olivia_reset_fec->down_box(FL_DOWN_BOX); btn_olivia_reset_fec->callback((Fl_Callback*)cb_btn_olivia_reset_fec); o->value(progdefaults.olivia_reset_fec); } // Fl_Check_Button* btn_olivia_reset_fec o->end(); } // Fl_Group* o { btnOlivia_8bit = new Fl_Check_Button(131, 291, 265, 20, _("8-bit extended characters (UTF-8)")); btnOlivia_8bit->tooltip(_("Enable this for UTF-8 character transmission")); btnOlivia_8bit->down_box(FL_DOWN_BOX); btnOlivia_8bit->callback((Fl_Callback*)cb_btnOlivia_8bit); } // Fl_Check_Button* btnOlivia_8bit o->end(); } // Fl_Group* o tabOlivia->end(); } // Fl_Group* tabOlivia { tabContestia = new Fl_Group(0, 50, 600, 330, _("Cont\'")); tabContestia->hide(); { Fl_Group* o = new Fl_Group(55, 80, 490, 200); o->box(FL_ENGRAVED_FRAME); { Fl_ListBox* o = i_listbox_contestia_bandwidth = new Fl_ListBox(110, 100, 85, 22, _("Bandwidth")); i_listbox_contestia_bandwidth->tooltip(_("Select bandwidth")); i_listbox_contestia_bandwidth->box(FL_DOWN_BOX); i_listbox_contestia_bandwidth->color(FL_BACKGROUND2_COLOR); i_listbox_contestia_bandwidth->selection_color(FL_BACKGROUND_COLOR); i_listbox_contestia_bandwidth->labeltype(FL_NORMAL_LABEL); i_listbox_contestia_bandwidth->labelfont(0); i_listbox_contestia_bandwidth->labelsize(14); i_listbox_contestia_bandwidth->labelcolor(FL_FOREGROUND_COLOR); i_listbox_contestia_bandwidth->callback((Fl_Callback*)cb_i_listbox_contestia_bandwidth); i_listbox_contestia_bandwidth->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_contestia_bandwidth->when(FL_WHEN_RELEASE); o->add(szContestiaBandwidth); o->index(progdefaults.contestiabw +1); o->labelsize(FL_NORMAL_SIZE); i_listbox_contestia_bandwidth->end(); } // Fl_ListBox* i_listbox_contestia_bandwidth { Fl_ListBox* o = i_listbox_contestia_tones = new Fl_ListBox(371, 100, 70, 22, _("Tones")); i_listbox_contestia_tones->tooltip(_("Select number of tones")); i_listbox_contestia_tones->box(FL_DOWN_BOX); i_listbox_contestia_tones->color(FL_BACKGROUND2_COLOR); i_listbox_contestia_tones->selection_color(FL_BACKGROUND_COLOR); i_listbox_contestia_tones->labeltype(FL_NORMAL_LABEL); i_listbox_contestia_tones->labelfont(0); i_listbox_contestia_tones->labelsize(14); i_listbox_contestia_tones->labelcolor(FL_FOREGROUND_COLOR); i_listbox_contestia_tones->callback((Fl_Callback*)cb_i_listbox_contestia_tones); i_listbox_contestia_tones->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_contestia_tones->when(FL_WHEN_RELEASE); o->add(szContestiaTones); o->index(progdefaults.contestiatones +1); o->labelsize(FL_NORMAL_SIZE); i_listbox_contestia_tones->end(); } // Fl_ListBox* i_listbox_contestia_tones { Fl_Group* o = new Fl_Group(93, 139, 414, 131, _("Receive synchronizer")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntContestia_smargin = new Fl_Counter2(112, 170, 70, 22, _("Tune margin (tone frequency spacing)")); cntContestia_smargin->tooltip(_("Change ONLY to experiment")); cntContestia_smargin->type(1); cntContestia_smargin->box(FL_UP_BOX); cntContestia_smargin->color(FL_BACKGROUND_COLOR); cntContestia_smargin->selection_color(FL_INACTIVE_COLOR); cntContestia_smargin->labeltype(FL_NORMAL_LABEL); cntContestia_smargin->labelfont(0); cntContestia_smargin->labelsize(14); cntContestia_smargin->labelcolor(FL_FOREGROUND_COLOR); cntContestia_smargin->minimum(2); cntContestia_smargin->maximum(128); cntContestia_smargin->step(1); cntContestia_smargin->value(8); cntContestia_smargin->callback((Fl_Callback*)cb_cntContestia_smargin); cntContestia_smargin->align(Fl_Align(FL_ALIGN_RIGHT)); cntContestia_smargin->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntContestia_smargin { Fl_Counter2* o = cntContestia_sinteg = new Fl_Counter2(112, 202, 70, 22, _("Integration period (FEC blocks)")); cntContestia_sinteg->tooltip(_("Change ONLY to experiment")); cntContestia_sinteg->type(1); cntContestia_sinteg->box(FL_UP_BOX); cntContestia_sinteg->color(FL_BACKGROUND_COLOR); cntContestia_sinteg->selection_color(FL_INACTIVE_COLOR); cntContestia_sinteg->labeltype(FL_NORMAL_LABEL); cntContestia_sinteg->labelfont(0); cntContestia_sinteg->labelsize(14); cntContestia_sinteg->labelcolor(FL_FOREGROUND_COLOR); cntContestia_sinteg->minimum(2); cntContestia_sinteg->maximum(128); cntContestia_sinteg->step(1); cntContestia_sinteg->value(4); cntContestia_sinteg->callback((Fl_Callback*)cb_cntContestia_sinteg); cntContestia_sinteg->align(Fl_Align(FL_ALIGN_RIGHT)); cntContestia_sinteg->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntContestia_sinteg { Fl_Check_Button* o = btn_contestia_reset_fec = new Fl_Check_Button(108, 235, 349, 20, _("Reset FEC blocks when changing BW or Tones")); btn_contestia_reset_fec->tooltip(_("Enable this for UTF-8 character transmission")); btn_contestia_reset_fec->down_box(FL_DOWN_BOX); btn_contestia_reset_fec->callback((Fl_Callback*)cb_btn_contestia_reset_fec); o->value(progdefaults.contestia_reset_fec); } // Fl_Check_Button* btn_contestia_reset_fec o->end(); } // Fl_Group* o { btnContestia_8bit = new Fl_Check_Button(110, 249, 200, 20, _("8-bit extended characters")); btnContestia_8bit->tooltip(_("Enable this for Latin-1 accented characters")); btnContestia_8bit->down_box(FL_DOWN_BOX); btnContestia_8bit->callback((Fl_Callback*)cb_btnContestia_8bit); btnContestia_8bit->hide(); } // Fl_Check_Button* btnContestia_8bit o->end(); } // Fl_Group* o tabContestia->end(); } // Fl_Group* tabContestia { tabPSK = new Fl_Group(0, 50, 600, 330, _("PSK")); tabPSK->hide(); { tabsPSK = new Fl_Tabs(0, 50, 600, 330); tabsPSK->selection_color(FL_LIGHT1); { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("General")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); { Fl_Group* o = new Fl_Group(55, 93, 490, 98, _("AFC behavior")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntSearchRange = new Fl_Counter2(65, 125, 75, 20, _("Acquisition search range (Hz)")); cntSearchRange->tooltip(_("Capture signals within this frequency range")); cntSearchRange->type(1); cntSearchRange->box(FL_UP_BOX); cntSearchRange->color(FL_BACKGROUND_COLOR); cntSearchRange->selection_color(FL_INACTIVE_COLOR); cntSearchRange->labeltype(FL_NORMAL_LABEL); cntSearchRange->labelfont(0); cntSearchRange->labelsize(14); cntSearchRange->labelcolor(FL_FOREGROUND_COLOR); cntSearchRange->minimum(10); cntSearchRange->maximum(500); cntSearchRange->step(10); cntSearchRange->value(200); cntSearchRange->callback((Fl_Callback*)cb_cntSearchRange); cntSearchRange->align(Fl_Align(FL_ALIGN_RIGHT)); cntSearchRange->when(FL_WHEN_CHANGED); o->value(progdefaults.SearchRange); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntSearchRange { Fl_Counter2* o = cntACQsn = new Fl_Counter2(65, 154, 75, 20, _("Acquisition S/N (dB)")); cntACQsn->tooltip(_("Capture signals over this threshold")); cntACQsn->type(1); cntACQsn->box(FL_UP_BOX); cntACQsn->color(FL_BACKGROUND_COLOR); cntACQsn->selection_color(FL_INACTIVE_COLOR); cntACQsn->labeltype(FL_NORMAL_LABEL); cntACQsn->labelfont(0); cntACQsn->labelsize(14); cntACQsn->labelcolor(FL_FOREGROUND_COLOR); cntACQsn->minimum(3); cntACQsn->maximum(20); cntACQsn->step(1); cntACQsn->value(6); cntACQsn->callback((Fl_Callback*)cb_cntACQsn); cntACQsn->align(Fl_Align(FL_ALIGN_RIGHT)); cntACQsn->when(FL_WHEN_CHANGED); o->value(progdefaults.ACQsn); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntACQsn o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 191, 490, 65, _("S/N and IMD behavior")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = listbox_psk_status_timeout = new Fl_ListBox(65, 222, 80, 20, _("after")); listbox_psk_status_timeout->tooltip(_("Behavior of s/n imd")); listbox_psk_status_timeout->box(FL_DOWN_BOX); listbox_psk_status_timeout->color(FL_BACKGROUND2_COLOR); listbox_psk_status_timeout->selection_color(FL_BACKGROUND_COLOR); listbox_psk_status_timeout->labeltype(FL_NORMAL_LABEL); listbox_psk_status_timeout->labelfont(0); listbox_psk_status_timeout->labelsize(14); listbox_psk_status_timeout->labelcolor(FL_FOREGROUND_COLOR); listbox_psk_status_timeout->callback((Fl_Callback*)cb_listbox_psk_status_timeout); listbox_psk_status_timeout->align(Fl_Align(FL_ALIGN_RIGHT)); listbox_psk_status_timeout->when(FL_WHEN_RELEASE); o->add(_("Clear")); o->add(_("Dim")); o->index(progdefaults.StatusDim); o->labelsize(FL_NORMAL_SIZE); listbox_psk_status_timeout->end(); } // Fl_ListBox* listbox_psk_status_timeout { Fl_Counter2* o = new Fl_Counter2(206, 222, 75, 20, _("seconds")); o->tooltip(_("Will occur after this time in seconds")); o->type(1); o->box(FL_UP_BOX); o->color(FL_BACKGROUND_COLOR); o->selection_color(FL_INACTIVE_COLOR); o->labeltype(FL_NORMAL_LABEL); o->labelfont(0); o->labelsize(14); o->labelcolor(FL_FOREGROUND_COLOR); o->minimum(0); o->maximum(30); o->step(1); o->callback((Fl_Callback*)cb_seconds); o->align(Fl_Align(FL_ALIGN_RIGHT)); o->when(FL_WHEN_CHANGED); o->value(progdefaults.StatusTimeout); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 258, 490, 98, _("Multi-Channel Signal Processing")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnEnablePSKbrowsing = new Fl_Check_Button(65, 315, 180, 20, _("Multi-channel detector")); btnEnablePSKbrowsing->down_box(FL_DOWN_BOX); btnEnablePSKbrowsing->callback((Fl_Callback*)cb_btnEnablePSKbrowsing); o->value(progdefaults.pskbrowser_on); } // Fl_Check_Button* btnEnablePSKbrowsing { Fl_Box* o = new Fl_Box(65, 285, 440, 20, _("Disable on very slow CPUs of if signal browser is not used")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o tabsPSK->end(); } // Fl_Tabs* tabsPSK tabPSK->end(); } // Fl_Group* tabPSK { tabRTTY = new Fl_Group(0, 50, 600, 330, _("RTTY")); tabRTTY->hide(); { tabsRTTY = new Fl_Tabs(0, 50, 600, 330); tabsRTTY->selection_color(FL_LIGHT1); { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Rx")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); { Fl_Group* o = new Fl_Group(32, 101, 535, 69, _("Receive")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = i_listbox_rtty_afc_speed = new Fl_ListBox(107, 128, 90, 22, _("AFC speed")); i_listbox_rtty_afc_speed->tooltip(_("AFC tracking speed")); i_listbox_rtty_afc_speed->box(FL_DOWN_BOX); i_listbox_rtty_afc_speed->color(FL_BACKGROUND2_COLOR); i_listbox_rtty_afc_speed->selection_color(FL_BACKGROUND_COLOR); i_listbox_rtty_afc_speed->labeltype(FL_NORMAL_LABEL); i_listbox_rtty_afc_speed->labelfont(0); i_listbox_rtty_afc_speed->labelsize(14); i_listbox_rtty_afc_speed->labelcolor(FL_FOREGROUND_COLOR); i_listbox_rtty_afc_speed->callback((Fl_Callback*)cb_i_listbox_rtty_afc_speed); i_listbox_rtty_afc_speed->align(Fl_Align(FL_ALIGN_TOP)); i_listbox_rtty_afc_speed->when(FL_WHEN_RELEASE); o->add("Slow"); o->add("Normal"); o->add("Fast"); o->index(progdefaults.rtty_afcspeed+1); o->labelsize(FL_NORMAL_SIZE); i_listbox_rtty_afc_speed->end(); } // Fl_ListBox* i_listbox_rtty_afc_speed { Fl_Check_Button* o = chkUOSrx = new Fl_Check_Button(211, 128, 63, 22, _("RX - unshift on space")); chkUOSrx->tooltip(_("Revert to unshifted char\'s on a space")); chkUOSrx->down_box(FL_DOWN_BOX); chkUOSrx->callback((Fl_Callback*)cb_chkUOSrx); o->value(progdefaults.UOSrx); } // Fl_Check_Button* chkUOSrx { Fl_Value_Input* o = rtty_rx_shape = new Fl_Value_Input(445, 126, 48, 25, _("Filter Shape Factor")); rtty_rx_shape->tooltip(_("rcos timing coefficient:\n1.0 ... 2.0\nW1HKJ best 1.275\nDO2SMF best 1.500")); rtty_rx_shape->minimum(1); rtty_rx_shape->maximum(2); rtty_rx_shape->step(0.001); rtty_rx_shape->value(1.25); rtty_rx_shape->callback((Fl_Callback*)cb_rtty_rx_shape); rtty_rx_shape->align(Fl_Align(FL_ALIGN_TOP)); rtty_rx_shape->hide(); o->value(progdefaults.rtty_filter); } // Fl_Value_Input* rtty_rx_shape o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(32, 171, 535, 55, _("Decode (CWI suppression)")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnRxTones[0] = new Fl_Check_Button(120, 198, 70, 15, _("Mark-Space")); btnRxTones[0]->down_box(FL_DOWN_BOX); btnRxTones[0]->callback((Fl_Callback*)cb_btnRxTones); o->value(progdefaults.rtty_cwi == 0); } // Fl_Check_Button* btnRxTones[0] { Fl_Check_Button* o = btnRxTones[1] = new Fl_Check_Button(253, 198, 70, 15, _("Mark only")); btnRxTones[1]->down_box(FL_DOWN_BOX); btnRxTones[1]->callback((Fl_Callback*)cb_btnRxTones1); o->value(progdefaults.rtty_cwi == 1); } // Fl_Check_Button* btnRxTones[1] { Fl_Check_Button* o = btnRxTones[2] = new Fl_Check_Button(387, 198, 70, 15, _("Space only")); btnRxTones[2]->down_box(FL_DOWN_BOX); btnRxTones[2]->callback((Fl_Callback*)cb_btnRxTones2); o->value(progdefaults.rtty_cwi == 2); } // Fl_Check_Button* btnRxTones[2] o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(32, 228, 535, 55, _("RTTY Scope Display")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnPreferXhairScope = new Fl_Check_Button(120, 250, 165, 22, _("Use cross hair scope")); btnPreferXhairScope->tooltip(_("Default to cross hair digiscope")); btnPreferXhairScope->down_box(FL_DOWN_BOX); btnPreferXhairScope->callback((Fl_Callback*)cb_btnPreferXhairScope); o->value(progdefaults.PreferXhairScope); } // Fl_Check_Button* btnPreferXhairScope { Fl_Check_Button* o = chk_true_scope = new Fl_Check_Button(340, 250, 70, 22, _("XY - classic scope")); chk_true_scope->tooltip(_("Enabled - use Mark/Space filter outputs\nDisabled - use pseudo signals")); chk_true_scope->down_box(FL_DOWN_BOX); chk_true_scope->callback((Fl_Callback*)cb_chk_true_scope); o->value(progdefaults.true_scope); } // Fl_Check_Button* chk_true_scope o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(32, 285, 535, 65, _("Log RTTY frequency")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chk_useMARKfreq = new Fl_Check_Button(120, 311, 146, 22, _("Use MARK freq\'")); chk_useMARKfreq->tooltip(_("Enabled - log QSO using Mark frequency\nDisabled - log QSO using center frequ\ ency")); chk_useMARKfreq->down_box(FL_DOWN_BOX); chk_useMARKfreq->value(1); chk_useMARKfreq->callback((Fl_Callback*)cb_chk_useMARKfreq); o->value(progdefaults.useMARKfreq); } // Fl_Check_Button* chk_useMARKfreq { Fl_Button* o = btnRTTY_mark_color = new Fl_Button(340, 311, 41, 18, _("track color")); btnRTTY_mark_color->tooltip(_("Color of Mark Track")); btnRTTY_mark_color->color((Fl_Color)2); btnRTTY_mark_color->callback((Fl_Callback*)cb_btnRTTY_mark_color); btnRTTY_mark_color->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.rttymarkRGBI.R,progdefaults.rttymarkRGBI.G,progdefaults.rttymarkRGBI.B)); } // Fl_Button* btnRTTY_mark_color o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Tx")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->hide(); { Fl_ListBox* o = selShift = new Fl_ListBox(65, 104, 100, 20, _("Carrier shift")); selShift->tooltip(_("Select carrier shift")); selShift->box(FL_DOWN_BOX); selShift->color(FL_BACKGROUND2_COLOR); selShift->selection_color(FL_BACKGROUND_COLOR); selShift->labeltype(FL_NORMAL_LABEL); selShift->labelfont(0); selShift->labelsize(14); selShift->labelcolor(FL_FOREGROUND_COLOR); selShift->callback((Fl_Callback*)cb_selShift); selShift->align(Fl_Align(FL_ALIGN_RIGHT)); selShift->when(FL_WHEN_CHANGED); o->add(szShifts);o->index(progdefaults.rtty_shift); o->labelsize(FL_NORMAL_SIZE); selShift->end(); } // Fl_ListBox* selShift { Fl_Counter2* o = selCustomShift = new Fl_Counter2(65, 137, 100, 20, _("Custom shift")); selCustomShift->tooltip(_("Input carrier shift")); selCustomShift->box(FL_UP_BOX); selCustomShift->color(FL_BACKGROUND_COLOR); selCustomShift->selection_color(FL_INACTIVE_COLOR); selCustomShift->labeltype(FL_NORMAL_LABEL); selCustomShift->labelfont(0); selCustomShift->labelsize(14); selCustomShift->labelcolor(FL_FOREGROUND_COLOR); selCustomShift->minimum(10); selCustomShift->maximum(1000); selCustomShift->step(1); selCustomShift->value(450); selCustomShift->callback((Fl_Callback*)cb_selCustomShift); selCustomShift->align(Fl_Align(FL_ALIGN_RIGHT)); selCustomShift->when(FL_WHEN_CHANGED); o->lstep(10.0); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* selCustomShift { Fl_ListBox* o = selBaud = new Fl_ListBox(65, 170, 100, 20, _("Baud rate")); selBaud->tooltip(_("Select carrier baudrate")); selBaud->box(FL_DOWN_BOX); selBaud->color(FL_BACKGROUND2_COLOR); selBaud->selection_color(FL_BACKGROUND_COLOR); selBaud->labeltype(FL_NORMAL_LABEL); selBaud->labelfont(0); selBaud->labelsize(14); selBaud->labelcolor(FL_FOREGROUND_COLOR); selBaud->callback((Fl_Callback*)cb_selBaud); selBaud->align(Fl_Align(FL_ALIGN_RIGHT)); selBaud->when(FL_WHEN_CHANGED); o->add(szBauds);o->index(progdefaults.rtty_baud); o->labelsize(FL_NORMAL_SIZE); selBaud->end(); } // Fl_ListBox* selBaud { Fl_ListBox* o = selBits = new Fl_ListBox(65, 203, 100, 20, _("Bits per character")); selBits->tooltip(_("Select # bits / char")); selBits->box(FL_DOWN_BOX); selBits->color(FL_BACKGROUND2_COLOR); selBits->selection_color(FL_BACKGROUND_COLOR); selBits->labeltype(FL_NORMAL_LABEL); selBits->labelfont(0); selBits->labelsize(14); selBits->labelcolor(FL_FOREGROUND_COLOR); selBits->callback((Fl_Callback*)cb_selBits); selBits->align(Fl_Align(FL_ALIGN_RIGHT)); selBits->when(FL_WHEN_CHANGED); o->add(szSelBits);o->index(progdefaults.rtty_bits); o->labelsize(FL_NORMAL_SIZE); selBits->end(); } // Fl_ListBox* selBits { Fl_ListBox* o = selParity = new Fl_ListBox(65, 236, 100, 20, _("Parity")); selParity->tooltip(_("Select parity")); selParity->box(FL_DOWN_BOX); selParity->color(FL_BACKGROUND2_COLOR); selParity->selection_color(FL_BACKGROUND_COLOR); selParity->labeltype(FL_NORMAL_LABEL); selParity->labelfont(0); selParity->labelsize(14); selParity->labelcolor(FL_FOREGROUND_COLOR); selParity->callback((Fl_Callback*)cb_selParity); selParity->align(Fl_Align(FL_ALIGN_RIGHT)); selParity->when(FL_WHEN_CHANGED); o->add(szParity);o->index(progdefaults.rtty_parity); o->labelsize(FL_NORMAL_SIZE); selParity->end(); } // Fl_ListBox* selParity { Fl_ListBox* o = selStopBits = new Fl_ListBox(65, 270, 100, 20, _("Stop bits")); selStopBits->tooltip(_("Select # stop bits")); selStopBits->box(FL_DOWN_BOX); selStopBits->color(FL_BACKGROUND2_COLOR); selStopBits->selection_color(FL_BACKGROUND_COLOR); selStopBits->labeltype(FL_NORMAL_LABEL); selStopBits->labelfont(0); selStopBits->labelsize(14); selStopBits->labelcolor(FL_FOREGROUND_COLOR); selStopBits->callback((Fl_Callback*)cb_selStopBits); selStopBits->align(Fl_Align(FL_ALIGN_RIGHT)); selStopBits->when(FL_WHEN_CHANGED); o->add(szStopBits);o->index(progdefaults.rtty_stop); o->labelsize(FL_NORMAL_SIZE); selStopBits->end(); } // Fl_ListBox* selStopBits { Fl_Check_Button* o = btnAUTOCRLF = new Fl_Check_Button(316, 103, 90, 22, _("AutoCRLF")); btnAUTOCRLF->tooltip(_("Add CRLF after page width characters")); btnAUTOCRLF->down_box(FL_DOWN_BOX); btnAUTOCRLF->callback((Fl_Callback*)cb_btnAUTOCRLF); o->value(progdefaults.rtty_autocrlf); } // Fl_Check_Button* btnAUTOCRLF { Fl_Counter2* o = cntrAUTOCRLF = new Fl_Counter2(427, 104, 65, 20, _("chars")); cntrAUTOCRLF->tooltip(_("Auto CRLF line length")); cntrAUTOCRLF->type(1); cntrAUTOCRLF->box(FL_UP_BOX); cntrAUTOCRLF->color(FL_BACKGROUND_COLOR); cntrAUTOCRLF->selection_color(FL_INACTIVE_COLOR); cntrAUTOCRLF->labeltype(FL_NORMAL_LABEL); cntrAUTOCRLF->labelfont(0); cntrAUTOCRLF->labelsize(14); cntrAUTOCRLF->labelcolor(FL_FOREGROUND_COLOR); cntrAUTOCRLF->minimum(68); cntrAUTOCRLF->maximum(80); cntrAUTOCRLF->step(1); cntrAUTOCRLF->value(72); cntrAUTOCRLF->callback((Fl_Callback*)cb_cntrAUTOCRLF); cntrAUTOCRLF->align(Fl_Align(FL_ALIGN_RIGHT)); cntrAUTOCRLF->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntrAUTOCRLF { Fl_Check_Button* o = btnCRCRLF = new Fl_Check_Button(316, 136, 90, 22, _("CR-CR-LF")); btnCRCRLF->tooltip(_("Use \"cr cr lf\" for \"cr lf\"")); btnCRCRLF->down_box(FL_DOWN_BOX); btnCRCRLF->callback((Fl_Callback*)cb_btnCRCRLF); btnCRCRLF->when(FL_WHEN_RELEASE_ALWAYS); o->value(progdefaults.rtty_crcrlf); } // Fl_Check_Button* btnCRCRLF { Fl_Check_Button* o = chkUOStx = new Fl_Check_Button(316, 169, 63, 22, _("TX - unshift on space")); chkUOStx->tooltip(_("Revert to Unsifted char\'s on a space")); chkUOStx->down_box(FL_DOWN_BOX); chkUOStx->callback((Fl_Callback*)cb_chkUOStx); o->value(progdefaults.UOStx); } // Fl_Check_Button* chkUOStx { Fl_Check_Button* o = chkPseudoFSK = new Fl_Check_Button(316, 202, 212, 22, _("Pseudo-FSK - right channel")); chkPseudoFSK->tooltip(_("Create keyed square wave on right audio channel")); chkPseudoFSK->down_box(FL_DOWN_BOX); chkPseudoFSK->callback((Fl_Callback*)cb_chkPseudoFSK); o->value(progdefaults.PseudoFSK); } // Fl_Check_Button* chkPseudoFSK o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Synop")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->hide(); { Fl_Check_Button* o = btnSynopAdifDecoding = new Fl_Check_Button(190, 91, 126, 22, _("SYNOP to ADIF")); btnSynopAdifDecoding->tooltip(_("Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file")); btnSynopAdifDecoding->down_box(FL_DOWN_BOX); btnSynopAdifDecoding->callback((Fl_Callback*)cb_btnSynopAdifDecoding); btnSynopAdifDecoding->align(Fl_Align(132|FL_ALIGN_INSIDE)); o->value(progdefaults.SynopAdifDecoding); } // Fl_Check_Button* btnSynopAdifDecoding { Fl_Check_Button* o = btnSynopKmlDecoding = new Fl_Check_Button(190, 129, 119, 22, _("SYNOP to KML")); btnSynopKmlDecoding->tooltip(_("Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Goog\ le Earth)")); btnSynopKmlDecoding->down_box(FL_DOWN_BOX); btnSynopKmlDecoding->callback((Fl_Callback*)cb_btnSynopKmlDecoding); btnSynopKmlDecoding->align(Fl_Align(132|FL_ALIGN_INSIDE)); o->value(progdefaults.SynopKmlDecoding); } // Fl_Check_Button* btnSynopKmlDecoding { Fl_Check_Button* o = btnSynopInterleaved = new Fl_Check_Button(190, 168, 210, 22, _("Interleave SYNOP and text")); btnSynopInterleaved->tooltip(_("Interleave text with decoded SYNOP messages, or replacement.")); btnSynopInterleaved->down_box(FL_DOWN_BOX); btnSynopInterleaved->callback((Fl_Callback*)cb_btnSynopInterleaved); btnSynopInterleaved->align(Fl_Align(132|FL_ALIGN_INSIDE)); o->value(progdefaults.SynopInterleaved); } // Fl_Check_Button* btnSynopInterleaved o->end(); } // Fl_Group* o tabsRTTY->end(); } // Fl_Tabs* tabsRTTY tabRTTY->end(); } // Fl_Group* tabRTTY { tabTHOR = new Fl_Group(0, 50, 600, 330, _("Thor")); tabTHOR->hide(); { Fl_Group* o = new Fl_Group(55, 78, 490, 270); o->box(FL_ENGRAVED_FRAME); { txtTHORSecondary = new Fl_Input2(84, 105, 430, 40, _("Secondary Text")); txtTHORSecondary->tooltip(_("Text to send during keyboard idle times")); txtTHORSecondary->type(4); txtTHORSecondary->box(FL_DOWN_BOX); txtTHORSecondary->color(FL_BACKGROUND2_COLOR); txtTHORSecondary->selection_color(FL_SELECTION_COLOR); txtTHORSecondary->labeltype(FL_NORMAL_LABEL); txtTHORSecondary->labelfont(0); txtTHORSecondary->labelsize(14); txtTHORSecondary->labelcolor(FL_FOREGROUND_COLOR); txtTHORSecondary->callback((Fl_Callback*)cb_txtTHORSecondary); txtTHORSecondary->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txtTHORSecondary->when(FL_WHEN_CHANGED); txtTHORSecondary->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* txtTHORSecondary { Fl_Check_Button* o = valTHOR_FILTER = new Fl_Check_Button(84, 159, 80, 20, _("Filtering")); valTHOR_FILTER->tooltip(_("Enable DSP prior to decoder")); valTHOR_FILTER->down_box(FL_DOWN_BOX); valTHOR_FILTER->value(1); valTHOR_FILTER->callback((Fl_Callback*)cb_valTHOR_FILTER); o->value(progdefaults.THOR_FILTER); } // Fl_Check_Button* valTHOR_FILTER { Fl_Counter2* o = valTHOR_BW = new Fl_Counter2(229, 159, 63, 20, _("Filter bandwidth factor")); valTHOR_BW->tooltip(_("Filter bandwidth relative to signal width")); valTHOR_BW->type(1); valTHOR_BW->box(FL_UP_BOX); valTHOR_BW->color(FL_BACKGROUND_COLOR); valTHOR_BW->selection_color(FL_INACTIVE_COLOR); valTHOR_BW->labeltype(FL_NORMAL_LABEL); valTHOR_BW->labelfont(0); valTHOR_BW->labelsize(14); valTHOR_BW->labelcolor(FL_FOREGROUND_COLOR); valTHOR_BW->minimum(1); valTHOR_BW->maximum(2); valTHOR_BW->value(1.5); valTHOR_BW->callback((Fl_Callback*)cb_valTHOR_BW); valTHOR_BW->align(Fl_Align(FL_ALIGN_RIGHT)); valTHOR_BW->when(FL_WHEN_CHANGED); o->value(progdefaults.THOR_BW); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* valTHOR_BW { Fl_Value_Slider2* o = valThorCWI = new Fl_Value_Slider2(84, 212, 260, 20, _("CWI threshold")); valThorCWI->tooltip(_("CWI detection and suppression")); valThorCWI->type(1); valThorCWI->box(FL_DOWN_BOX); valThorCWI->color(FL_BACKGROUND_COLOR); valThorCWI->selection_color(FL_BACKGROUND_COLOR); valThorCWI->labeltype(FL_NORMAL_LABEL); valThorCWI->labelfont(0); valThorCWI->labelsize(14); valThorCWI->labelcolor(FL_FOREGROUND_COLOR); valThorCWI->textsize(14); valThorCWI->callback((Fl_Callback*)cb_valThorCWI); valThorCWI->align(Fl_Align(FL_ALIGN_TOP)); valThorCWI->when(FL_WHEN_CHANGED); o->value(progdefaults.ThorCWI); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* valThorCWI { Fl_Check_Button* o = valTHOR_PREAMBLE = new Fl_Check_Button(84, 254, 200, 20, _("Preamble Detection")); valTHOR_PREAMBLE->tooltip(_("Detect the THOR preamble\nClear the Rx pipeline")); valTHOR_PREAMBLE->down_box(FL_DOWN_BOX); valTHOR_PREAMBLE->callback((Fl_Callback*)cb_valTHOR_PREAMBLE); o->value(progdefaults.THOR_PREAMBLE); } // Fl_Check_Button* valTHOR_PREAMBLE { Fl_Check_Button* o = valTHOR_SOFTSYMBOLS = new Fl_Check_Button(84, 284, 190, 20, _("Soft-symbol decoding")); valTHOR_SOFTSYMBOLS->tooltip(_("Use soft-decision decoding for symbol detection\nAssists soft-bit decoding")); valTHOR_SOFTSYMBOLS->down_box(FL_DOWN_BOX); valTHOR_SOFTSYMBOLS->callback((Fl_Callback*)cb_valTHOR_SOFTSYMBOLS); o->value(progdefaults.THOR_SOFTSYMBOLS); } // Fl_Check_Button* valTHOR_SOFTSYMBOLS { Fl_Check_Button* o = valTHOR_SOFTBITS = new Fl_Check_Button(84, 314, 170, 20, _("Soft-bit decoding")); valTHOR_SOFTBITS->tooltip(_("Use soft-bit viterbi decoding for better Forward Error Correction\nWorks best\ with soft-symbol decoding enabled")); valTHOR_SOFTBITS->down_box(FL_DOWN_BOX); valTHOR_SOFTBITS->callback((Fl_Callback*)cb_valTHOR_SOFTBITS); o->value(progdefaults.THOR_SOFTBITS); } // Fl_Check_Button* valTHOR_SOFTBITS { Fl_Counter2* o = valTHOR_PATHS = new Fl_Counter2(431, 303, 75, 21, _("Paths (hidden)")); valTHOR_PATHS->type(1); valTHOR_PATHS->box(FL_UP_BOX); valTHOR_PATHS->color(FL_BACKGROUND_COLOR); valTHOR_PATHS->selection_color(FL_INACTIVE_COLOR); valTHOR_PATHS->labeltype(FL_NORMAL_LABEL); valTHOR_PATHS->labelfont(0); valTHOR_PATHS->labelsize(14); valTHOR_PATHS->labelcolor(FL_FOREGROUND_COLOR); valTHOR_PATHS->minimum(4); valTHOR_PATHS->maximum(8); valTHOR_PATHS->step(1); valTHOR_PATHS->value(5); valTHOR_PATHS->callback((Fl_Callback*)cb_valTHOR_PATHS); valTHOR_PATHS->align(Fl_Align(FL_ALIGN_TOP)); valTHOR_PATHS->when(FL_WHEN_CHANGED); o->value(progdefaults.THOR_PATHS); o->labelsize(FL_NORMAL_SIZE); o->hide(); } // Fl_Counter2* valTHOR_PATHS o->end(); } // Fl_Group* o tabTHOR->end(); } // Fl_Group* tabTHOR { tabNavtex = new Fl_Group(0, 50, 600, 330, _("Navtex")); tabNavtex->hide(); { Fl_Check_Button* o = btnNvtxAdifLog = new Fl_Check_Button(171, 79, 235, 30, _("Log Navtex messages to Adif file")); btnNvtxAdifLog->down_box(FL_DOWN_BOX); btnNvtxAdifLog->callback((Fl_Callback*)cb_btnNvtxAdifLog); o->value(progdefaults.NVTX_AdifLog); } // Fl_Check_Button* btnNvtxAdifLog { Fl_Check_Button* o = btnNvtxKmlLog = new Fl_Check_Button(170, 125, 270, 30, _("Log Navtex messages to KML")); btnNvtxKmlLog->tooltip(_("Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)")); btnNvtxKmlLog->down_box(FL_DOWN_BOX); btnNvtxKmlLog->callback((Fl_Callback*)cb_btnNvtxKmlLog); o->value(progdefaults.NVTX_KmlLog); } // Fl_Check_Button* btnNvtxKmlLog tabNavtex->end(); } // Fl_Group* tabNavtex { tabWefax = new Fl_Group(0, 50, 600, 330, _("Wefax")); tabWefax->hide(); { Fl_Group* o = new Fl_Group(2, 63, 598, 300); { Fl_Check_Button* o = btnWefaxEmbeddedGui = new Fl_Check_Button(94, 74, 235, 30, _("Embedded Wefax Gui")); btnWefaxEmbeddedGui->tooltip(_("Display tx and rx in main fldigi window.\nChange requires restart of fldigi")); btnWefaxEmbeddedGui->down_box(FL_DOWN_BOX); btnWefaxEmbeddedGui->callback((Fl_Callback*)cb_btnWefaxEmbeddedGui); o->value(progdefaults.WEFAX_EmbeddedGui); } // Fl_Check_Button* btnWefaxEmbeddedGui { Fl_Check_Button* o = btnWefaxHideTx = new Fl_Check_Button(94, 119, 235, 30, _("Hide Transmission window")); btnWefaxHideTx->tooltip(_("Hide transmission window by default.")); btnWefaxHideTx->down_box(FL_DOWN_BOX); btnWefaxHideTx->callback((Fl_Callback*)cb_btnWefaxHideTx); o->value(progdefaults.WEFAX_HideTx); } // Fl_Check_Button* btnWefaxHideTx { Fl_Check_Button* o = btnWefaxAdifLog = new Fl_Check_Button(94, 165, 235, 30, _("Log Wefax messages to Adif file")); btnWefaxAdifLog->tooltip(_("Sent and received faxes are logged to Adif file.")); btnWefaxAdifLog->down_box(FL_DOWN_BOX); btnWefaxAdifLog->callback((Fl_Callback*)cb_btnWefaxAdifLog); o->value(progdefaults.WEFAX_AdifLog); } // Fl_Check_Button* btnWefaxAdifLog { Fl_Counter* o = cntr_wefax_shift = new Fl_Counter(95, 211, 90, 22, _("Frequency shift (800 Hz)")); cntr_wefax_shift->tooltip(_("Default 800 Hz. Deutsche Wetterdienst 850Hz")); cntr_wefax_shift->type(1); cntr_wefax_shift->minimum(750); cntr_wefax_shift->maximum(900); cntr_wefax_shift->step(10); cntr_wefax_shift->value(800); cntr_wefax_shift->callback((Fl_Callback*)cb_cntr_wefax_shift); cntr_wefax_shift->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.WEFAX_Shift); } // Fl_Counter* cntr_wefax_shift { Fl_Counter* o = ctr_wefax_max_rows = new Fl_Counter(95, 247, 90, 22, _("Rx fax max rows")); ctr_wefax_max_rows->tooltip(_("Default 800 Hz. Deutsche Wetterdienst 850Hz")); ctr_wefax_max_rows->type(1); ctr_wefax_max_rows->minimum(1000); ctr_wefax_max_rows->maximum(10000); ctr_wefax_max_rows->step(50); ctr_wefax_max_rows->value(5000); ctr_wefax_max_rows->callback((Fl_Callback*)cb_ctr_wefax_max_rows); ctr_wefax_max_rows->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.WEFAX_MaxRows); } // Fl_Counter* ctr_wefax_max_rows { Fl_Input* o = btnWefaxSaveDir = new Fl_Input(94, 290, 310, 24, _("Fax images destination directory")); btnWefaxSaveDir->callback((Fl_Callback*)cb_btnWefaxSaveDir); btnWefaxSaveDir->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.wefax_save_dir.c_str()); } // Fl_Input* btnWefaxSaveDir { btnSelectFaxDestDir = new Fl_Button(424, 290, 80, 24, _("Directory...")); btnSelectFaxDestDir->callback((Fl_Callback*)cb_btnSelectFaxDestDir); } // Fl_Button* btnSelectFaxDestDir { Fl_Check_Button* o = btnWefaxSaveMonochrome = new Fl_Check_Button(94, 320, 235, 30, _("Save image as monochrome file")); btnWefaxSaveMonochrome->tooltip(_("Save the fax image as a gray-level PNG file.")); btnWefaxSaveMonochrome->down_box(FL_DOWN_BOX); btnWefaxSaveMonochrome->callback((Fl_Callback*)cb_btnWefaxSaveMonochrome); o->value(progdefaults.WEFAX_SaveMonochrome); } // Fl_Check_Button* btnWefaxSaveMonochrome o->end(); } // Fl_Group* o tabWefax->end(); } // Fl_Group* tabWefax tabsModems->end(); } // Fl_Tabs* tabsModems tabModems->end(); } // Fl_Group* tabModems { tabRig = new Fl_Group(0, 23, 600, 357, _("Rig")); tabRig->tooltip(_("Transceiver control")); tabRig->hide(); { tabsRig = new Fl_Tabs(0, 23, 600, 357); tabsRig->selection_color(FL_LIGHT1); { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("Hardware PTT")); { Fl_Group* o = new Fl_Group(55, 57, 490, 38); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnPTTrightchannel = new Fl_Check_Button(74, 66, 250, 20, _("PTT tone on right audio channel ")); btnPTTrightchannel->tooltip(_("Can be used in lieu of or in addition to other PTT types")); btnPTTrightchannel->down_box(FL_DOWN_BOX); btnPTTrightchannel->callback((Fl_Callback*)cb_btnPTTrightchannel); o->value(progdefaults.PTTrightchannel); } // Fl_Check_Button* btnPTTrightchannel o->end(); } // Fl_Group* o { grpHWPTT = new Fl_Group(55, 97, 490, 171, _("h/w ptt device-pin")); grpHWPTT->box(FL_ENGRAVED_FRAME); grpHWPTT->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnTTYptt = new Fl_Round_Button(74, 121, 220, 20, _("Use separate serial port PTT")); btnTTYptt->down_box(FL_DOWN_BOX); btnTTYptt->selection_color((Fl_Color)1); btnTTYptt->callback((Fl_Callback*)cb_btnTTYptt); } // Fl_Round_Button* btnTTYptt { Fl_ComboBox* o = inpTTYdev = new Fl_ComboBox(128, 151, 160, 22, _("Device:")); inpTTYdev->box(FL_DOWN_BOX); inpTTYdev->color(FL_BACKGROUND2_COLOR); inpTTYdev->selection_color(FL_BACKGROUND_COLOR); inpTTYdev->labeltype(FL_NORMAL_LABEL); inpTTYdev->labelfont(0); inpTTYdev->labelsize(14); inpTTYdev->labelcolor(FL_FOREGROUND_COLOR); inpTTYdev->callback((Fl_Callback*)cb_inpTTYdev); inpTTYdev->align(Fl_Align(FL_ALIGN_LEFT)); inpTTYdev->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); inpTTYdev->end(); } // Fl_ComboBox* inpTTYdev { btnRTSptt = new Fl_Round_Button(310, 120, 85, 20, _("Use RTS")); btnRTSptt->tooltip(_("RTS is PTT signal line")); btnRTSptt->down_box(FL_DOWN_BOX); btnRTSptt->callback((Fl_Callback*)cb_btnRTSptt); } // Fl_Round_Button* btnRTSptt { btnRTSplusV = new Fl_Round_Button(407, 120, 100, 20, _("RTS = +V")); btnRTSplusV->tooltip(_("Initial voltage on RTS")); btnRTSplusV->down_box(FL_DOWN_BOX); btnRTSplusV->callback((Fl_Callback*)cb_btnRTSplusV); } // Fl_Round_Button* btnRTSplusV { btnDTRptt = new Fl_Round_Button(310, 150, 85, 20, _("Use DTR")); btnDTRptt->tooltip(_("DTR is PTT signal line")); btnDTRptt->down_box(FL_DOWN_BOX); btnDTRptt->callback((Fl_Callback*)cb_btnDTRptt); } // Fl_Round_Button* btnDTRptt { btnDTRplusV = new Fl_Round_Button(407, 150, 100, 20, _("DTR = +V")); btnDTRplusV->tooltip(_("Initial voltage on DTR")); btnDTRplusV->down_box(FL_DOWN_BOX); btnDTRplusV->callback((Fl_Callback*)cb_btnDTRplusV); } // Fl_Round_Button* btnDTRplusV { btnInitHWPTT = new Fl_Button(411, 217, 113, 24, _("Initialize")); btnInitHWPTT->tooltip(_("Initialize the H/W PTT interface")); btnInitHWPTT->callback((Fl_Callback*)cb_btnInitHWPTT); } // Fl_Button* btnInitHWPTT { btnUsePPortPTT = new Fl_Round_Button(74, 197, 170, 20, _("Use parallel port PTT")); btnUsePPortPTT->down_box(FL_DOWN_BOX); btnUsePPortPTT->selection_color((Fl_Color)1); btnUsePPortPTT->callback((Fl_Callback*)cb_btnUsePPortPTT); } // Fl_Round_Button* btnUsePPortPTT { btnUseUHrouterPTT = new Fl_Round_Button(74, 227, 170, 20, _("Use uHRouter PTT")); btnUseUHrouterPTT->down_box(FL_DOWN_BOX); btnUseUHrouterPTT->selection_color((Fl_Color)1); btnUseUHrouterPTT->callback((Fl_Callback*)cb_btnUseUHrouterPTT); } // Fl_Round_Button* btnUseUHrouterPTT grpHWPTT->end(); } // Fl_Group* grpHWPTT { grpPTTdelays = new Fl_Group(55, 270, 490, 91, _("PTT delays valid for all CAT/PTT types")); grpPTTdelays->box(FL_ENGRAVED_FRAME); grpPTTdelays->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = cntPTT_on_delay = new Fl_Counter(74, 297, 100, 21, _("Start of transmit PTT delay")); cntPTT_on_delay->tooltip(_("Delay NN msec before starting audio")); cntPTT_on_delay->minimum(0); cntPTT_on_delay->maximum(500); cntPTT_on_delay->step(1); cntPTT_on_delay->callback((Fl_Callback*)cb_cntPTT_on_delay); cntPTT_on_delay->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.PTT_on_delay); o->lstep(10); } // Fl_Counter* cntPTT_on_delay { Fl_Counter* o = cntPTT_off_delay = new Fl_Counter(74, 327, 100, 21, _("PTT end of transmit delay")); cntPTT_off_delay->tooltip(_("Delay NN msec before releasing PTT")); cntPTT_off_delay->minimum(0); cntPTT_off_delay->maximum(500); cntPTT_off_delay->step(1); cntPTT_off_delay->callback((Fl_Callback*)cb_cntPTT_off_delay); cntPTT_off_delay->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.PTT_off_delay); o->lstep(10); } // Fl_Counter* cntPTT_off_delay grpPTTdelays->end(); } // Fl_Group* grpPTTdelays o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("RigCAT")); o->tooltip(_("Rig Control using xml spec file")); o->hide(); { chkUSERIGCAT = new Fl_Check_Button(245, 60, 110, 20, _("Use RigCAT")); chkUSERIGCAT->tooltip(_("RigCAT used for rig control")); chkUSERIGCAT->down_box(FL_DOWN_BOX); chkUSERIGCAT->callback((Fl_Callback*)cb_chkUSERIGCAT); } // Fl_Check_Button* chkUSERIGCAT { grpRigCAT = new Fl_Group(55, 83, 490, 279); grpRigCAT->box(FL_ENGRAVED_FRAME); { Fl_Output* o = txtXmlRigFilename = new Fl_Output(65, 107, 130, 22, _("Rig description file:")); txtXmlRigFilename->tooltip(_("Use Open to select descriptor file")); txtXmlRigFilename->color(FL_LIGHT2); txtXmlRigFilename->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(fl_filename_name(progdefaults.XmlRigFilename.c_str())); } // Fl_Output* txtXmlRigFilename { btnSelectRigXmlFile = new Fl_Button(198, 107, 60, 22, _("Open...")); btnSelectRigXmlFile->tooltip(_("Select rig descriptor file")); btnSelectRigXmlFile->callback((Fl_Callback*)cb_btnSelectRigXmlFile); } // Fl_Button* btnSelectRigXmlFile { Fl_ComboBox* o = inpXmlRigDevice = new Fl_ComboBox(391, 107, 144, 22, _("Device:")); inpXmlRigDevice->box(FL_DOWN_BOX); inpXmlRigDevice->color(FL_BACKGROUND2_COLOR); inpXmlRigDevice->selection_color(FL_BACKGROUND_COLOR); inpXmlRigDevice->labeltype(FL_NORMAL_LABEL); inpXmlRigDevice->labelfont(0); inpXmlRigDevice->labelsize(14); inpXmlRigDevice->labelcolor(FL_FOREGROUND_COLOR); inpXmlRigDevice->callback((Fl_Callback*)cb_inpXmlRigDevice); inpXmlRigDevice->align(Fl_Align(FL_ALIGN_LEFT)); inpXmlRigDevice->when(FL_WHEN_RELEASE); o->value(progdefaults.XmlRigDevice.c_str()); o->labelsize(FL_NORMAL_SIZE); inpXmlRigDevice->end(); } // Fl_ComboBox* inpXmlRigDevice { Fl_Value_Input2* o = cntRigCatRetries = new Fl_Value_Input2(80, 150, 60, 22, _("Retries")); cntRigCatRetries->tooltip(_("# retries before giving up")); cntRigCatRetries->box(FL_DOWN_BOX); cntRigCatRetries->color(FL_BACKGROUND2_COLOR); cntRigCatRetries->selection_color(FL_SELECTION_COLOR); cntRigCatRetries->labeltype(FL_NORMAL_LABEL); cntRigCatRetries->labelfont(0); cntRigCatRetries->labelsize(14); cntRigCatRetries->labelcolor(FL_FOREGROUND_COLOR); cntRigCatRetries->maximum(1000); cntRigCatRetries->step(1); cntRigCatRetries->callback((Fl_Callback*)cb_cntRigCatRetries); cntRigCatRetries->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntRigCatRetries->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatRetries); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntRigCatRetries { Fl_Value_Input2* o = cntRigCatTimeout = new Fl_Value_Input2(210, 150, 60, 22, _("Retry interval (ms)")); cntRigCatTimeout->tooltip(_("Time between retires in msec")); cntRigCatTimeout->box(FL_DOWN_BOX); cntRigCatTimeout->color(FL_BACKGROUND2_COLOR); cntRigCatTimeout->selection_color(FL_SELECTION_COLOR); cntRigCatTimeout->labeltype(FL_NORMAL_LABEL); cntRigCatTimeout->labelfont(0); cntRigCatTimeout->labelsize(14); cntRigCatTimeout->labelcolor(FL_FOREGROUND_COLOR); cntRigCatTimeout->maximum(10000); cntRigCatTimeout->step(1); cntRigCatTimeout->callback((Fl_Callback*)cb_cntRigCatTimeout); cntRigCatTimeout->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntRigCatTimeout->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatTimeout); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntRigCatTimeout { Fl_Value_Input2* o = cntRigCatWait = new Fl_Value_Input2(80, 190, 60, 22, _("Write delay (ms)")); cntRigCatWait->tooltip(_("Wait for response to subsequent command")); cntRigCatWait->box(FL_DOWN_BOX); cntRigCatWait->color(FL_BACKGROUND2_COLOR); cntRigCatWait->selection_color(FL_SELECTION_COLOR); cntRigCatWait->labeltype(FL_NORMAL_LABEL); cntRigCatWait->labelfont(0); cntRigCatWait->labelsize(14); cntRigCatWait->labelcolor(FL_FOREGROUND_COLOR); cntRigCatWait->maximum(10000); cntRigCatWait->step(1); cntRigCatWait->callback((Fl_Callback*)cb_cntRigCatWait); cntRigCatWait->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntRigCatWait->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatWait); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntRigCatWait { Fl_ListBox* o = listbox_xml_rig_baudrate = new Fl_ListBox(436, 150, 99, 22, _("Baud rate:")); listbox_xml_rig_baudrate->box(FL_DOWN_BOX); listbox_xml_rig_baudrate->color(FL_BACKGROUND2_COLOR); listbox_xml_rig_baudrate->selection_color(FL_BACKGROUND_COLOR); listbox_xml_rig_baudrate->labeltype(FL_NORMAL_LABEL); listbox_xml_rig_baudrate->labelfont(0); listbox_xml_rig_baudrate->labelsize(14); listbox_xml_rig_baudrate->labelcolor(FL_FOREGROUND_COLOR); listbox_xml_rig_baudrate->callback((Fl_Callback*)cb_listbox_xml_rig_baudrate); listbox_xml_rig_baudrate->align(Fl_Align(FL_ALIGN_LEFT)); listbox_xml_rig_baudrate->when(FL_WHEN_RELEASE); o->add(szBaudRates); o->index(progdefaults.XmlRigBaudrate); o->labelsize(FL_NORMAL_SIZE); listbox_xml_rig_baudrate->end(); } // Fl_ListBox* listbox_xml_rig_baudrate { Fl_Counter2* o = valRigCatStopbits = new Fl_Counter2(438, 184, 95, 21, _("Stopbits")); valRigCatStopbits->type(1); valRigCatStopbits->box(FL_UP_BOX); valRigCatStopbits->color(FL_BACKGROUND_COLOR); valRigCatStopbits->selection_color(FL_INACTIVE_COLOR); valRigCatStopbits->labeltype(FL_NORMAL_LABEL); valRigCatStopbits->labelfont(0); valRigCatStopbits->labelsize(14); valRigCatStopbits->labelcolor(FL_FOREGROUND_COLOR); valRigCatStopbits->minimum(1); valRigCatStopbits->maximum(2); valRigCatStopbits->step(1); valRigCatStopbits->value(1); valRigCatStopbits->callback((Fl_Callback*)cb_valRigCatStopbits); valRigCatStopbits->align(Fl_Align(FL_ALIGN_LEFT)); valRigCatStopbits->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatStopbits); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* valRigCatStopbits { btnInitRIGCAT = new Fl_Button(415, 321, 113, 24, _("Initialize")); btnInitRIGCAT->tooltip(_("Initialize RigCAT interface")); btnInitRIGCAT->callback((Fl_Callback*)cb_btnInitRIGCAT); } // Fl_Button* btnInitRIGCAT { Fl_Check_Button* o = btnRigCatEcho = new Fl_Check_Button(100, 216, 192, 22, _("Commands are echoed")); btnRigCatEcho->tooltip(_("Rig or interface echos serial data")); btnRigCatEcho->down_box(FL_DOWN_BOX); btnRigCatEcho->callback((Fl_Callback*)cb_btnRigCatEcho); o->value(progdefaults.RigCatECHO); } // Fl_Check_Button* btnRigCatEcho { Fl_Round_Button* o = btnRigCatCMDptt = new Fl_Round_Button(306, 217, 207, 20, _("CAT command for PTT")); btnRigCatCMDptt->tooltip(_("PTT is a CAT command (not hardware)")); btnRigCatCMDptt->down_box(FL_DOWN_BOX); btnRigCatCMDptt->selection_color((Fl_Color)1); btnRigCatCMDptt->callback((Fl_Callback*)cb_btnRigCatCMDptt); o->value(progdefaults.RigCatCMDptt); } // Fl_Round_Button* btnRigCatCMDptt { Fl_Round_Button* o = btnRigCatRTSptt = new Fl_Round_Button(100, 246, 160, 20, _("Toggle RTS for PTT")); btnRigCatRTSptt->tooltip(_("RTS is ptt line")); btnRigCatRTSptt->down_box(FL_DOWN_BOX); btnRigCatRTSptt->callback((Fl_Callback*)cb_btnRigCatRTSptt); o->value(progdefaults.RigCatRTSptt); } // Fl_Round_Button* btnRigCatRTSptt { Fl_Round_Button* o = btnRigCatDTRptt = new Fl_Round_Button(306, 244, 160, 20, _("Toggle DTR for PTT")); btnRigCatDTRptt->tooltip(_("DTR is ptt line")); btnRigCatDTRptt->down_box(FL_DOWN_BOX); btnRigCatDTRptt->callback((Fl_Callback*)cb_btnRigCatDTRptt); o->value(progdefaults.RigCatDTRptt); } // Fl_Round_Button* btnRigCatDTRptt { Fl_Check_Button* o = btnRigCatRTSplus = new Fl_Check_Button(100, 275, 100, 20, _("RTS +12 v")); btnRigCatRTSplus->tooltip(_("Initial state of RTS")); btnRigCatRTSplus->down_box(FL_DOWN_BOX); btnRigCatRTSplus->callback((Fl_Callback*)cb_btnRigCatRTSplus); o->value(progdefaults.RigCatRTSplus); } // Fl_Check_Button* btnRigCatRTSplus { Fl_Check_Button* o = btnRigCatDTRplus = new Fl_Check_Button(306, 272, 100, 20, _("DTR +12 v")); btnRigCatDTRplus->tooltip(_("Initial state of DTR")); btnRigCatDTRplus->down_box(FL_DOWN_BOX); btnRigCatDTRplus->callback((Fl_Callback*)cb_btnRigCatDTRplus); o->value(progdefaults.RigCatDTRplus); } // Fl_Check_Button* btnRigCatDTRplus { Fl_Check_Button* o = chkRigCatRTSCTSflow = new Fl_Check_Button(100, 303, 170, 20, _("RTS/CTS flow control")); chkRigCatRTSCTSflow->tooltip(_("Rig uses RTS/CTS handshake")); chkRigCatRTSCTSflow->down_box(FL_DOWN_BOX); chkRigCatRTSCTSflow->callback((Fl_Callback*)cb_chkRigCatRTSCTSflow); o->value(progdefaults.RigCatRTSCTSflow); } // Fl_Check_Button* chkRigCatRTSCTSflow { Fl_Check_Button* o = chk_restore_tio = new Fl_Check_Button(100, 332, 205, 20, _("Restore Settings on Close")); chk_restore_tio->tooltip(_("Restore the serial (COM) port settings")); chk_restore_tio->down_box(FL_DOWN_BOX); chk_restore_tio->callback((Fl_Callback*)cb_chk_restore_tio); o->value(progdefaults.RigCatRestoreTIO); } // Fl_Check_Button* chk_restore_tio { btnRevertRIGCAT = new Fl_Button(415, 289, 113, 24, _("Revert")); btnRevertRIGCAT->tooltip(_("Reset rigCAT interface")); btnRevertRIGCAT->callback((Fl_Callback*)cb_btnRevertRIGCAT); btnRevertRIGCAT->hide(); btnRevertRIGCAT->deactivate(); } // Fl_Button* btnRevertRIGCAT { Fl_Check_Button* o = chkRigCatVSP = new Fl_Check_Button(306, 300, 100, 25, _("VSP Enable")); chkRigCatVSP->tooltip(_("Virtual Serial Port Emulator - suppress WARNINGS")); chkRigCatVSP->down_box(FL_DOWN_BOX); chkRigCatVSP->callback((Fl_Callback*)cb_chkRigCatVSP); o->value(progdefaults.RigCatVSP); } // Fl_Check_Button* chkRigCatVSP { Fl_Value_Input2* o = cntRigCatInitDelay = new Fl_Value_Input2(210, 190, 75, 22, _("Init delay (ms)")); cntRigCatInitDelay->tooltip(_("Wait for response to first CAT command")); cntRigCatInitDelay->box(FL_DOWN_BOX); cntRigCatInitDelay->color(FL_BACKGROUND2_COLOR); cntRigCatInitDelay->selection_color(FL_SELECTION_COLOR); cntRigCatInitDelay->labeltype(FL_NORMAL_LABEL); cntRigCatInitDelay->labelfont(0); cntRigCatInitDelay->labelsize(14); cntRigCatInitDelay->labelcolor(FL_FOREGROUND_COLOR); cntRigCatInitDelay->maximum(10000); cntRigCatInitDelay->step(1); cntRigCatInitDelay->callback((Fl_Callback*)cb_cntRigCatInitDelay); cntRigCatInitDelay->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntRigCatInitDelay->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatInitDelay); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntRigCatInitDelay grpRigCAT->end(); } // Fl_Group* grpRigCAT o->end(); } // Fl_Group* o { tabHamlib = new Fl_Group(0, 50, 600, 330, _("Hamlib")); tabHamlib->hide(); { chkUSEHAMLIB = new Fl_Check_Button(250, 55, 100, 20, _("Use Hamlib")); chkUSEHAMLIB->tooltip(_("Hamlib used for rig control")); chkUSEHAMLIB->down_box(FL_DOWN_BOX); chkUSEHAMLIB->callback((Fl_Callback*)cb_chkUSEHAMLIB); } // Fl_Check_Button* chkUSEHAMLIB { grpHamlib = new Fl_Group(55, 78, 490, 277); grpHamlib->box(FL_ENGRAVED_FRAME); { Fl_ComboBox* o = cboHamlibRig = new Fl_ComboBox(115, 88, 160, 22, _("Rig:")); cboHamlibRig->box(FL_DOWN_BOX); cboHamlibRig->color(FL_BACKGROUND2_COLOR); cboHamlibRig->selection_color(FL_BACKGROUND_COLOR); cboHamlibRig->labeltype(FL_NORMAL_LABEL); cboHamlibRig->labelfont(0); cboHamlibRig->labelsize(14); cboHamlibRig->labelcolor(FL_FOREGROUND_COLOR); cboHamlibRig->callback((Fl_Callback*)cb_cboHamlibRig); cboHamlibRig->align(Fl_Align(FL_ALIGN_LEFT)); cboHamlibRig->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); cboHamlibRig->end(); } // Fl_ComboBox* cboHamlibRig { Fl_ComboBox* o = inpRIGdev = new Fl_ComboBox(390, 88, 144, 22, _("Device:")); inpRIGdev->box(FL_DOWN_BOX); inpRIGdev->color(FL_BACKGROUND2_COLOR); inpRIGdev->selection_color(FL_BACKGROUND_COLOR); inpRIGdev->labeltype(FL_NORMAL_LABEL); inpRIGdev->labelfont(0); inpRIGdev->labelsize(14); inpRIGdev->labelcolor(FL_FOREGROUND_COLOR); inpRIGdev->callback((Fl_Callback*)cb_inpRIGdev); inpRIGdev->align(Fl_Align(FL_ALIGN_LEFT)); inpRIGdev->when(FL_WHEN_RELEASE); o->value(progdefaults.HamRigDevice.c_str()); o->labelsize(FL_NORMAL_SIZE); inpRIGdev->end(); } // Fl_ComboBox* inpRIGdev { Fl_Value_Input2* o = cntHamlibRetries = new Fl_Value_Input2(80, 128, 70, 24, _("Retries")); cntHamlibRetries->tooltip(_("# times to resend command before giving up")); cntHamlibRetries->box(FL_DOWN_BOX); cntHamlibRetries->color(FL_BACKGROUND2_COLOR); cntHamlibRetries->selection_color(FL_SELECTION_COLOR); cntHamlibRetries->labeltype(FL_NORMAL_LABEL); cntHamlibRetries->labelfont(0); cntHamlibRetries->labelsize(14); cntHamlibRetries->labelcolor(FL_FOREGROUND_COLOR); cntHamlibRetries->maximum(1000); cntHamlibRetries->step(1); cntHamlibRetries->callback((Fl_Callback*)cb_cntHamlibRetries); cntHamlibRetries->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntHamlibRetries->when(FL_WHEN_CHANGED); o->value(progdefaults.HamlibRetries); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntHamlibRetries { Fl_Value_Input2* o = cntHamlibTimeout = new Fl_Value_Input2(205, 128, 70, 24, _("Retry Interval (ms)")); cntHamlibTimeout->tooltip(_("Msec\'s between retries")); cntHamlibTimeout->box(FL_DOWN_BOX); cntHamlibTimeout->color(FL_BACKGROUND2_COLOR); cntHamlibTimeout->selection_color(FL_SELECTION_COLOR); cntHamlibTimeout->labeltype(FL_NORMAL_LABEL); cntHamlibTimeout->labelfont(0); cntHamlibTimeout->labelsize(14); cntHamlibTimeout->labelcolor(FL_FOREGROUND_COLOR); cntHamlibTimeout->maximum(10000); cntHamlibTimeout->step(1); cntHamlibTimeout->callback((Fl_Callback*)cb_cntHamlibTimeout); cntHamlibTimeout->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntHamlibTimeout->when(FL_WHEN_CHANGED); o->value(progdefaults.HamlibTimeout); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntHamlibTimeout { Fl_Value_Input2* o = cntHamlibWriteDelay = new Fl_Value_Input2(80, 171, 70, 24, _("Write delay (ms)")); cntHamlibWriteDelay->tooltip(_("Msec\'s between sequential commands")); cntHamlibWriteDelay->box(FL_DOWN_BOX); cntHamlibWriteDelay->color(FL_BACKGROUND2_COLOR); cntHamlibWriteDelay->selection_color(FL_SELECTION_COLOR); cntHamlibWriteDelay->labeltype(FL_NORMAL_LABEL); cntHamlibWriteDelay->labelfont(0); cntHamlibWriteDelay->labelsize(14); cntHamlibWriteDelay->labelcolor(FL_FOREGROUND_COLOR); cntHamlibWriteDelay->maximum(10000); cntHamlibWriteDelay->step(1); cntHamlibWriteDelay->callback((Fl_Callback*)cb_cntHamlibWriteDelay); cntHamlibWriteDelay->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntHamlibWriteDelay->when(FL_WHEN_CHANGED); o->value(progdefaults.HamlibWriteDelay); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntHamlibWriteDelay { Fl_Value_Input2* o = cntHamlibWait = new Fl_Value_Input2(206, 171, 70, 24, _("Post write delay (ms)")); cntHamlibWait->tooltip(_("Wait interval (msecs) before reading response")); cntHamlibWait->box(FL_DOWN_BOX); cntHamlibWait->color(FL_BACKGROUND2_COLOR); cntHamlibWait->selection_color(FL_SELECTION_COLOR); cntHamlibWait->labeltype(FL_NORMAL_LABEL); cntHamlibWait->labelfont(0); cntHamlibWait->labelsize(14); cntHamlibWait->labelcolor(FL_FOREGROUND_COLOR); cntHamlibWait->maximum(10000); cntHamlibWait->step(1); cntHamlibWait->callback((Fl_Callback*)cb_cntHamlibWait); cntHamlibWait->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntHamlibWait->when(FL_WHEN_CHANGED); o->value(progdefaults.HamlibWait); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntHamlibWait { Fl_ListBox* o = listbox_baudrate = new Fl_ListBox(435, 122, 99, 22, _("Baud rate:")); listbox_baudrate->box(FL_DOWN_BOX); listbox_baudrate->color(FL_BACKGROUND2_COLOR); listbox_baudrate->selection_color(FL_BACKGROUND_COLOR); listbox_baudrate->labeltype(FL_NORMAL_LABEL); listbox_baudrate->labelfont(0); listbox_baudrate->labelsize(14); listbox_baudrate->labelcolor(FL_FOREGROUND_COLOR); listbox_baudrate->callback((Fl_Callback*)cb_listbox_baudrate); listbox_baudrate->align(Fl_Align(FL_ALIGN_LEFT)); listbox_baudrate->when(FL_WHEN_RELEASE); o->add(szBaudRates); o->index(progdefaults.HamRigBaudrate); o->labelsize(FL_NORMAL_SIZE); listbox_baudrate->end(); } // Fl_ListBox* listbox_baudrate { Fl_Counter2* o = valHamRigStopbits = new Fl_Counter2(439, 158, 95, 21, _("Stopbits")); valHamRigStopbits->type(1); valHamRigStopbits->box(FL_UP_BOX); valHamRigStopbits->color(FL_BACKGROUND_COLOR); valHamRigStopbits->selection_color(FL_INACTIVE_COLOR); valHamRigStopbits->labeltype(FL_NORMAL_LABEL); valHamRigStopbits->labelfont(0); valHamRigStopbits->labelsize(14); valHamRigStopbits->labelcolor(FL_FOREGROUND_COLOR); valHamRigStopbits->minimum(1); valHamRigStopbits->maximum(2); valHamRigStopbits->step(1); valHamRigStopbits->value(1); valHamRigStopbits->callback((Fl_Callback*)cb_valHamRigStopbits); valHamRigStopbits->align(Fl_Align(FL_ALIGN_LEFT)); valHamRigStopbits->when(FL_WHEN_CHANGED); o->value(progdefaults.HamRigStopbits); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* valHamRigStopbits { Fl_Counter2* o = cntHamlibTimeout0 = new Fl_Counter2(200, 135, 100, 20, _("Retry interval (ms)")); cntHamlibTimeout0->tooltip(_("Msec\'s between retries")); cntHamlibTimeout0->type(1); cntHamlibTimeout0->box(FL_UP_BOX); cntHamlibTimeout0->color(FL_BACKGROUND_COLOR); cntHamlibTimeout0->selection_color(FL_INACTIVE_COLOR); cntHamlibTimeout0->labeltype(FL_NORMAL_LABEL); cntHamlibTimeout0->labelfont(0); cntHamlibTimeout0->labelsize(14); cntHamlibTimeout0->labelcolor(FL_FOREGROUND_COLOR); cntHamlibTimeout0->minimum(2); cntHamlibTimeout0->maximum(20000); cntHamlibTimeout0->step(1); cntHamlibTimeout0->value(10); cntHamlibTimeout0->callback((Fl_Callback*)cb_cntHamlibTimeout0); cntHamlibTimeout0->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntHamlibTimeout0->when(FL_WHEN_CHANGED); cntHamlibTimeout0->hide(); o->value(progdefaults.HamlibTimeout); } // Fl_Counter2* cntHamlibTimeout0 { inpHamlibConfig = new Fl_Input2(70, 321, 320, 22, _("Advanced configuration:")); inpHamlibConfig->tooltip(_("Optional configuration\nin format: param=val ...")); inpHamlibConfig->box(FL_DOWN_BOX); inpHamlibConfig->color(FL_BACKGROUND2_COLOR); inpHamlibConfig->selection_color(FL_SELECTION_COLOR); inpHamlibConfig->labeltype(FL_NORMAL_LABEL); inpHamlibConfig->labelfont(0); inpHamlibConfig->labelsize(14); inpHamlibConfig->labelcolor(FL_FOREGROUND_COLOR); inpHamlibConfig->callback((Fl_Callback*)cb_inpHamlibConfig); inpHamlibConfig->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpHamlibConfig->when(FL_WHEN_RELEASE); inpHamlibConfig->value(progdefaults.HamConfig.c_str()); inpHamlibConfig->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpHamlibConfig { btnInitHAMLIB = new Fl_Button(421, 320, 113, 24, _("Initialize")); btnInitHAMLIB->tooltip(_("Initialize hamlib interface")); btnInitHAMLIB->callback((Fl_Callback*)cb_btnInitHAMLIB); } // Fl_Button* btnInitHAMLIB { Fl_ListBox* o = listbox_sideband = new Fl_ListBox(390, 212, 144, 22, _("Sideband:")); listbox_sideband->box(FL_DOWN_BOX); listbox_sideband->color(FL_BACKGROUND2_COLOR); listbox_sideband->selection_color(FL_BACKGROUND_COLOR); listbox_sideband->labeltype(FL_NORMAL_LABEL); listbox_sideband->labelfont(0); listbox_sideband->labelsize(14); listbox_sideband->labelcolor(FL_FOREGROUND_COLOR); listbox_sideband->callback((Fl_Callback*)cb_listbox_sideband); listbox_sideband->align(Fl_Align(FL_ALIGN_TOP_LEFT)); listbox_sideband->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); listbox_sideband->end(); } // Fl_ListBox* listbox_sideband { Fl_Round_Button* o = btnHamlibCMDptt = new Fl_Round_Button(95, 213, 200, 20, _("PTT via Hamlib command")); btnHamlibCMDptt->tooltip(_("PTT is a hamlib command")); btnHamlibCMDptt->down_box(FL_DOWN_BOX); btnHamlibCMDptt->selection_color((Fl_Color)1); btnHamlibCMDptt->callback((Fl_Callback*)cb_btnHamlibCMDptt); o->value(progdefaults.HamlibCMDptt); } // Fl_Round_Button* btnHamlibCMDptt { Fl_Check_Button* o = btnHamlibDTRplus = new Fl_Check_Button(95, 238, 90, 20, _("DTR +12")); btnHamlibDTRplus->tooltip(_("Initial state of DTR")); btnHamlibDTRplus->down_box(FL_DOWN_BOX); btnHamlibDTRplus->callback((Fl_Callback*)cb_btnHamlibDTRplus); o->value(progdefaults.HamlibDTRplus); } // Fl_Check_Button* btnHamlibDTRplus { Fl_Check_Button* o = chkHamlibRTSplus = new Fl_Check_Button(319, 238, 85, 20, _("RTS +12")); chkHamlibRTSplus->tooltip(_("Initial state of RTS")); chkHamlibRTSplus->down_box(FL_DOWN_BOX); chkHamlibRTSplus->callback((Fl_Callback*)cb_chkHamlibRTSplus); o->value(progdefaults.HamlibRTSplus); } // Fl_Check_Button* chkHamlibRTSplus { Fl_Check_Button* o = chkHamlibRTSCTSflow = new Fl_Check_Button(95, 266, 170, 20, _("RTS/CTS flow control")); chkHamlibRTSCTSflow->tooltip(_("Rig requires RTS/CTS flow control")); chkHamlibRTSCTSflow->down_box(FL_DOWN_BOX); chkHamlibRTSCTSflow->callback((Fl_Callback*)cb_chkHamlibRTSCTSflow); o->value(progdefaults.HamlibRTSCTSflow); if (o->value()) chkHamlibRTSplus->deactivate(); } // Fl_Check_Button* chkHamlibRTSCTSflow { Fl_Check_Button* o = chkHamlibXONXOFFflow = new Fl_Check_Button(319, 266, 185, 20, _("XON/XOFF flow control")); chkHamlibXONXOFFflow->tooltip(_("Rig requires Xon/Xoff flow control")); chkHamlibXONXOFFflow->down_box(FL_DOWN_BOX); chkHamlibXONXOFFflow->callback((Fl_Callback*)cb_chkHamlibXONXOFFflow); o->value(progdefaults.HamlibXONXOFFflow); } // Fl_Check_Button* chkHamlibXONXOFFflow { btnRevertHAMLIB = new Fl_Button(421, 289, 113, 24, _("Revert")); btnRevertHAMLIB->tooltip(_("Reset hamlib interface")); btnRevertHAMLIB->callback((Fl_Callback*)cb_btnRevertHAMLIB); btnRevertHAMLIB->hide(); btnRevertHAMLIB->deactivate(); } // Fl_Button* btnRevertHAMLIB grpHamlib->end(); } // Fl_Group* grpHamlib tabHamlib->end(); } // Fl_Group* tabHamlib { tabXMLRPC = new Fl_Group(0, 50, 600, 330, _("XML-RPC")); tabXMLRPC->hide(); { grpXMLRPC = new Fl_Group(55, 61, 490, 160); grpXMLRPC->box(FL_ENGRAVED_FRAME); { Fl_Output* o = new Fl_Output(210, 80, 190, 58); o->type(12); o->box(FL_BORDER_BOX); o->color(FL_LIGHT1); o->value(_("Rig control via external\nprogram using xmlrpc\nremote calls.")); } // Fl_Output* o { chkUSEXMLRPC = new Fl_Check_Button(210, 148, 183, 20, _("Use XML-RPC program")); chkUSEXMLRPC->tooltip(_("Experimental")); chkUSEXMLRPC->down_box(FL_DOWN_BOX); chkUSEXMLRPC->callback((Fl_Callback*)cb_chkUSEXMLRPC); } // Fl_Check_Button* chkUSEXMLRPC { btnInitXMLRPC = new Fl_Button(251, 184, 113, 24, _("Initialize")); btnInitXMLRPC->tooltip(_("Initialize XML-RPC rig control")); btnInitXMLRPC->callback((Fl_Callback*)cb_btnInitXMLRPC); } // Fl_Button* btnInitXMLRPC grpXMLRPC->end(); } // Fl_Group* grpXMLRPC tabXMLRPC->end(); } // Fl_Group* tabXMLRPC tabsRig->end(); } // Fl_Tabs* tabsRig tabRig->end(); } // Fl_Group* tabRig { tabSoundCard = new Fl_Group(0, 25, 600, 355, _("Audio")); tabSoundCard->tooltip(_("Audio devices")); tabSoundCard->hide(); { tabsSoundCard = new Fl_Tabs(0, 25, 600, 355); tabsSoundCard->selection_color(FL_LIGHT1); { tabAudio = new Fl_Group(0, 50, 600, 330, _("Devices")); { AudioOSS = new Fl_Group(55, 65, 490, 45); AudioOSS->box(FL_ENGRAVED_FRAME); { btnAudioIO[0] = new Fl_Round_Button(65, 75, 53, 25, _("OSS")); btnAudioIO[0]->tooltip(_("Use OSS audio server")); btnAudioIO[0]->down_box(FL_DOWN_BOX); btnAudioIO[0]->selection_color((Fl_Color)1); btnAudioIO[0]->callback((Fl_Callback*)cb_btnAudioIO); } // Fl_Round_Button* btnAudioIO[0] { Fl_Input_Choice* o = menuOSSDev = new Fl_Input_Choice(424, 75, 110, 25, _("Device:")); menuOSSDev->tooltip(_("Select device")); menuOSSDev->callback((Fl_Callback*)cb_menuOSSDev); o->value(progdefaults.OSSdevice.c_str()); } // Fl_Input_Choice* menuOSSDev AudioOSS->end(); } // Fl_Group* AudioOSS { AudioPort = new Fl_Group(55, 110, 490, 80); AudioPort->box(FL_ENGRAVED_FRAME); { btnAudioIO[1] = new Fl_Round_Button(65, 138, 95, 25, _("PortAudio")); btnAudioIO[1]->tooltip(_("Use Port Audio server")); btnAudioIO[1]->down_box(FL_DOWN_BOX); btnAudioIO[1]->selection_color((Fl_Color)1); btnAudioIO[1]->callback((Fl_Callback*)cb_btnAudioIO1); } // Fl_Round_Button* btnAudioIO[1] { menuPortInDev = new Fl_Choice(244, 121, 290, 25, _("Capture:")); menuPortInDev->tooltip(_("Audio input device")); menuPortInDev->down_box(FL_BORDER_BOX); menuPortInDev->callback((Fl_Callback*)cb_menuPortInDev); } // Fl_Choice* menuPortInDev { menuPortOutDev = new Fl_Choice(244, 156, 290, 25, _("Playback:")); menuPortOutDev->tooltip(_("Audio output device")); menuPortOutDev->down_box(FL_BORDER_BOX); menuPortOutDev->callback((Fl_Callback*)cb_menuPortOutDev); } // Fl_Choice* menuPortOutDev AudioPort->end(); } // Fl_Group* AudioPort { AudioPulse = new Fl_Group(55, 190, 490, 45); AudioPulse->box(FL_ENGRAVED_FRAME); { btnAudioIO[2] = new Fl_Round_Button(65, 201, 100, 25, _("PulseAudio")); btnAudioIO[2]->tooltip(_("Use Pulse Audio server")); btnAudioIO[2]->down_box(FL_DOWN_BOX); btnAudioIO[2]->selection_color((Fl_Color)1); btnAudioIO[2]->callback((Fl_Callback*)cb_btnAudioIO2); } // Fl_Round_Button* btnAudioIO[2] { Fl_Input2* o = inpPulseServer = new Fl_Input2(310, 201, 225, 24, _("Server string:")); inpPulseServer->tooltip(_("Leave this blank or refer to\nhttp://www.pulseaudio.org/wiki/ServerStrings")); inpPulseServer->box(FL_DOWN_BOX); inpPulseServer->color(FL_BACKGROUND2_COLOR); inpPulseServer->selection_color(FL_SELECTION_COLOR); inpPulseServer->labeltype(FL_NORMAL_LABEL); inpPulseServer->labelfont(0); inpPulseServer->labelsize(14); inpPulseServer->labelcolor(FL_FOREGROUND_COLOR); inpPulseServer->callback((Fl_Callback*)cb_inpPulseServer); inpPulseServer->align(Fl_Align(FL_ALIGN_LEFT)); inpPulseServer->when(FL_WHEN_RELEASE); o->value(progdefaults.PulseServer.c_str()); inpPulseServer->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpPulseServer AudioPulse->end(); } // Fl_Group* AudioPulse { AudioNull = new Fl_Group(55, 235, 490, 45); AudioNull->box(FL_ENGRAVED_FRAME); { btnAudioIO[3] = new Fl_Round_Button(66, 245, 100, 25, _("File I/O only")); btnAudioIO[3]->tooltip(_("NO AUDIO DEVICE AVAILABLE (or testing)")); btnAudioIO[3]->down_box(FL_DOWN_BOX); btnAudioIO[3]->selection_color((Fl_Color)1); btnAudioIO[3]->callback((Fl_Callback*)cb_btnAudioIO3); } // Fl_Round_Button* btnAudioIO[3] AudioNull->end(); } // Fl_Group* AudioNull tabAudio->end(); } // Fl_Group* tabAudio { tabAudioOpt = new Fl_Group(0, 50, 600, 330, _("Settings")); tabAudioOpt->hide(); { grpAudioSampleRate = new Fl_Group(55, 65, 490, 90, _("Sample rate")); grpAudioSampleRate->box(FL_ENGRAVED_FRAME); grpAudioSampleRate->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = menuInSampleRate = new Fl_ListBox(65, 94, 100, 20, _("Capture")); menuInSampleRate->tooltip(_("Force a specific sample rate. Select \"Native\" if \"Auto\"\ndoes not work we\ ll with your audio device.")); menuInSampleRate->box(FL_DOWN_BOX); menuInSampleRate->color(FL_BACKGROUND2_COLOR); menuInSampleRate->selection_color(FL_BACKGROUND_COLOR); menuInSampleRate->labeltype(FL_NORMAL_LABEL); menuInSampleRate->labelfont(0); menuInSampleRate->labelsize(14); menuInSampleRate->labelcolor(FL_FOREGROUND_COLOR); menuInSampleRate->callback((Fl_Callback*)cb_menuInSampleRate); menuInSampleRate->align(Fl_Align(FL_ALIGN_RIGHT)); menuInSampleRate->when(FL_WHEN_RELEASE); o->clear_changed(); o->labelsize(FL_NORMAL_SIZE); menuInSampleRate->end(); } // Fl_ListBox* menuInSampleRate { Fl_ListBox* o = menuOutSampleRate = new Fl_ListBox(65, 124, 100, 20, _("Playback")); menuOutSampleRate->box(FL_DOWN_BOX); menuOutSampleRate->color(FL_BACKGROUND2_COLOR); menuOutSampleRate->selection_color(FL_BACKGROUND_COLOR); menuOutSampleRate->labeltype(FL_NORMAL_LABEL); menuOutSampleRate->labelfont(0); menuOutSampleRate->labelsize(14); menuOutSampleRate->labelcolor(FL_FOREGROUND_COLOR); menuOutSampleRate->callback((Fl_Callback*)cb_menuOutSampleRate); menuOutSampleRate->align(Fl_Align(FL_ALIGN_RIGHT)); menuOutSampleRate->when(FL_WHEN_RELEASE); o->clear_changed(); o->tooltip(menuInSampleRate->tooltip()); o->labelsize(FL_NORMAL_SIZE); menuOutSampleRate->end(); } // Fl_ListBox* menuOutSampleRate { Fl_ListBox* o = menuSampleConverter = new Fl_ListBox(319, 94, 216, 20, _("Converter")); menuSampleConverter->tooltip(_("Set the type of resampler used of offset correction")); menuSampleConverter->box(FL_DOWN_BOX); menuSampleConverter->color(FL_BACKGROUND2_COLOR); menuSampleConverter->selection_color(FL_BACKGROUND_COLOR); menuSampleConverter->labeltype(FL_NORMAL_LABEL); menuSampleConverter->labelfont(0); menuSampleConverter->labelsize(14); menuSampleConverter->labelcolor(FL_FOREGROUND_COLOR); menuSampleConverter->callback((Fl_Callback*)cb_menuSampleConverter); menuSampleConverter->align(Fl_Align(FL_ALIGN_TOP_LEFT)); menuSampleConverter->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); menuSampleConverter->end(); } // Fl_ListBox* menuSampleConverter grpAudioSampleRate->end(); } // Fl_Group* grpAudioSampleRate { Fl_Group* o = new Fl_Group(55, 155, 490, 62, _("Corrections")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Spinner2* o = cntRxRateCorr = new Fl_Spinner2(65, 185, 85, 20, _("RX ppm")); cntRxRateCorr->tooltip(_("RX sound card correction")); cntRxRateCorr->box(FL_NO_BOX); cntRxRateCorr->color(FL_BACKGROUND_COLOR); cntRxRateCorr->selection_color(FL_BACKGROUND_COLOR); cntRxRateCorr->labeltype(FL_NORMAL_LABEL); cntRxRateCorr->labelfont(0); cntRxRateCorr->labelsize(14); cntRxRateCorr->labelcolor(FL_FOREGROUND_COLOR); cntRxRateCorr->callback((Fl_Callback*)cb_cntRxRateCorr); cntRxRateCorr->align(Fl_Align(FL_ALIGN_RIGHT)); cntRxRateCorr->when(FL_WHEN_RELEASE); o->step(1); o->minimum(-50000); o->maximum(50000); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntRxRateCorr { Fl_Spinner2* o = cntTxRateCorr = new Fl_Spinner2(226, 185, 85, 20, _("TX ppm")); cntTxRateCorr->tooltip(_("TX sound card correction")); cntTxRateCorr->box(FL_NO_BOX); cntTxRateCorr->color(FL_BACKGROUND_COLOR); cntTxRateCorr->selection_color(FL_BACKGROUND_COLOR); cntTxRateCorr->labeltype(FL_NORMAL_LABEL); cntTxRateCorr->labelfont(0); cntTxRateCorr->labelsize(14); cntTxRateCorr->labelcolor(FL_FOREGROUND_COLOR); cntTxRateCorr->callback((Fl_Callback*)cb_cntTxRateCorr); cntTxRateCorr->align(Fl_Align(FL_ALIGN_RIGHT)); cntTxRateCorr->when(FL_WHEN_RELEASE); o->step(1); o->minimum(-50000); o->maximum(50000); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntTxRateCorr { Fl_Spinner2* o = cntTxOffset = new Fl_Spinner2(388, 185, 85, 20, _("TX offset")); cntTxOffset->tooltip(_("Difference between Rx & Tx freq (rig offset)")); cntTxOffset->box(FL_NO_BOX); cntTxOffset->color(FL_BACKGROUND_COLOR); cntTxOffset->selection_color(FL_BACKGROUND_COLOR); cntTxOffset->labeltype(FL_NORMAL_LABEL); cntTxOffset->labelfont(0); cntTxOffset->labelsize(14); cntTxOffset->labelcolor(FL_FOREGROUND_COLOR); cntTxOffset->callback((Fl_Callback*)cb_cntTxOffset); cntTxOffset->align(Fl_Align(FL_ALIGN_RIGHT)); cntTxOffset->when(FL_WHEN_RELEASE); o->value(progdefaults.TxOffset); o->step(1); o->minimum(-50); o->maximum(50); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntTxOffset o->end(); } // Fl_Group* o tabAudioOpt->end(); } // Fl_Group* tabAudioOpt { tabMixer = new Fl_Group(0, 50, 600, 330, _("Mixer")); tabMixer->hide(); { Fl_Group* o = new Fl_Group(55, 69, 490, 145, _("OSS Mixer")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnMixer = new Fl_Check_Button(65, 98, 125, 25, _("Manage mixer")); btnMixer->tooltip(_("Add mixer controls to main dialog")); btnMixer->down_box(FL_DOWN_BOX); btnMixer->callback((Fl_Callback*)cb_btnMixer); o->value(progdefaults.EnableMixer); } // Fl_Check_Button* btnMixer { Fl_ListBox* o = menuMix = new Fl_ListBox(152, 141, 170, 24, _("Device:")); menuMix->tooltip(_("Select Mixer device")); menuMix->box(FL_DOWN_BOX); menuMix->color(FL_BACKGROUND2_COLOR); menuMix->selection_color(FL_BACKGROUND_COLOR); menuMix->labeltype(FL_NORMAL_LABEL); menuMix->labelfont(0); menuMix->labelsize(14); menuMix->labelcolor(FL_FOREGROUND_COLOR); menuMix->callback((Fl_Callback*)cb_menuMix); menuMix->align(Fl_Align(FL_ALIGN_TOP)); menuMix->when(FL_WHEN_RELEASE); o->value(progdefaults.MXdevice.c_str()); o->labelsize(FL_NORMAL_SIZE); menuMix->end(); } // Fl_ListBox* menuMix { btnMicIn = new Fl_Light_Button(331, 102, 74, 25, _("Mic In")); btnMicIn->tooltip(_("Use microphone input")); btnMicIn->callback((Fl_Callback*)cb_btnMicIn); } // Fl_Light_Button* btnMicIn { btnLineIn = new Fl_Light_Button(331, 141, 74, 25, _("Line In")); btnLineIn->tooltip(_("Use Line-In device")); btnLineIn->selection_color((Fl_Color)3); btnLineIn->callback((Fl_Callback*)cb_btnLineIn); } // Fl_Light_Button* btnLineIn { Fl_Value_Slider2* o = valPCMvolume = new Fl_Value_Slider2(65, 176, 340, 20, _("PCM")); valPCMvolume->tooltip(_("Set the sound card PCM level")); valPCMvolume->type(1); valPCMvolume->box(FL_DOWN_BOX); valPCMvolume->color(FL_BACKGROUND_COLOR); valPCMvolume->selection_color(FL_SELECTION_COLOR); valPCMvolume->labeltype(FL_NORMAL_LABEL); valPCMvolume->labelfont(0); valPCMvolume->labelsize(14); valPCMvolume->labelcolor(FL_FOREGROUND_COLOR); valPCMvolume->value(0.8); valPCMvolume->textsize(14); valPCMvolume->callback((Fl_Callback*)cb_valPCMvolume); valPCMvolume->align(Fl_Align(FL_ALIGN_RIGHT)); valPCMvolume->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* valPCMvolume o->end(); } // Fl_Group* o tabMixer->end(); } // Fl_Group* tabMixer { tabAudioRightChannel = new Fl_Group(0, 50, 600, 330, _("Right channel")); tabAudioRightChannel->hide(); { chkForceMono = new Fl_Check_Button(160, 63, 280, 20, _("Mono audio output")); chkForceMono->tooltip(_("Force output audio to single channel")); chkForceMono->down_box(FL_DOWN_BOX); chkForceMono->callback((Fl_Callback*)cb_chkForceMono); chkForceMono->value(progdefaults.mono_audio); } // Fl_Check_Button* chkForceMono { chkAudioStereoOut = new Fl_Check_Button(160, 95, 280, 20, _("Modem signal on left and right channels")); chkAudioStereoOut->tooltip(_("Left and right channels both contain modem audio")); chkAudioStereoOut->down_box(FL_DOWN_BOX); chkAudioStereoOut->callback((Fl_Callback*)cb_chkAudioStereoOut); chkAudioStereoOut->value(progdefaults.sig_on_right_channel); } // Fl_Check_Button* chkAudioStereoOut { Fl_Check_Button* o = chkReverseAudio = new Fl_Check_Button(160, 127, 270, 20, _("Reverse Left/Right channels")); chkReverseAudio->tooltip(_("Software reversal of left-right audio channels")); chkReverseAudio->down_box(FL_DOWN_BOX); chkReverseAudio->callback((Fl_Callback*)cb_chkReverseAudio); o->value(progdefaults.ReverseAudio); } // Fl_Check_Button* chkReverseAudio { Fl_Group* o = new Fl_Group(73, 165, 454, 187, _("...\nThese controls are on other tabs.\nThey are replicated here for convenie\ nce.\nYou may change the state from either location.\n...")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_BOTTOM|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnPTTrightchannel2 = new Fl_Check_Button(146, 175, 250, 20, _("PTT tone on right audio channel ")); btnPTTrightchannel2->tooltip(_("1000 Hz tone when PTT enabled\nCan be used in lieu of or in addition to other\ PTT types")); btnPTTrightchannel2->down_box(FL_DOWN_BOX); btnPTTrightchannel2->callback((Fl_Callback*)cb_btnPTTrightchannel2); o->value(progdefaults.PTTrightchannel); } // Fl_Check_Button* btnPTTrightchannel2 { Fl_Check_Button* o = btnQSK2 = new Fl_Check_Button(146, 213, 211, 20, _("CW QSK signal on right channel")); btnQSK2->tooltip(_("Generate 1000 Hz square wave signal on right channel")); btnQSK2->down_box(FL_DOWN_BOX); btnQSK2->callback((Fl_Callback*)cb_btnQSK2); o->value(progdefaults.QSK); } // Fl_Check_Button* btnQSK2 { Fl_Check_Button* o = chkPseudoFSK2 = new Fl_Check_Button(146, 251, 270, 20, _("Pseudo-FSK on right audio channel")); chkPseudoFSK2->tooltip(_("Create 1000 Hz square wave on right channel")); chkPseudoFSK2->down_box(FL_DOWN_BOX); chkPseudoFSK2->callback((Fl_Callback*)cb_chkPseudoFSK2); o->value(progdefaults.PseudoFSK); } // Fl_Check_Button* chkPseudoFSK2 o->end(); } // Fl_Group* o tabAudioRightChannel->end(); } // Fl_Group* tabAudioRightChannel { tabWavFile = new Fl_Group(0, 50, 600, 330, _("Wav")); tabWavFile->hide(); { Fl_ListBox* o = listbox_wav_samplerate = new Fl_ListBox(225, 96, 150, 24, _("Wav write sample rate")); listbox_wav_samplerate->tooltip(_("Pick baud rate from list")); listbox_wav_samplerate->box(FL_DOWN_BOX); listbox_wav_samplerate->color(FL_BACKGROUND2_COLOR); listbox_wav_samplerate->selection_color(FL_BACKGROUND_COLOR); listbox_wav_samplerate->labeltype(FL_NORMAL_LABEL); listbox_wav_samplerate->labelfont(0); listbox_wav_samplerate->labelsize(14); listbox_wav_samplerate->labelcolor(FL_FOREGROUND_COLOR); listbox_wav_samplerate->callback((Fl_Callback*)cb_listbox_wav_samplerate); listbox_wav_samplerate->align(Fl_Align(FL_ALIGN_TOP_LEFT)); listbox_wav_samplerate->when(FL_WHEN_RELEASE); o->add("8000|11025|16000|22050|24000|44100|48000"); o->index(progdefaults.wavSampleRate); o->labelsize(FL_NORMAL_SIZE); listbox_wav_samplerate->end(); } // Fl_ListBox* listbox_wav_samplerate tabWavFile->end(); } // Fl_Group* tabWavFile tabsSoundCard->end(); } // Fl_Tabs* tabsSoundCard tabSoundCard->end(); } // Fl_Group* tabSoundCard { tabID = new Fl_Group(0, 23, 600, 357, _("ID")); tabID->hide(); { tabsID = new Fl_Tabs(0, 23, 600, 357); { tabRsID = new Fl_Group(0, 50, 600, 330, _("RsID")); { Fl_Group* o = new Fl_Group(32, 55, 535, 210, _("Reed-Solomon ID (Rx)")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkRSidNotifyOnly = new Fl_Check_Button(40, 112, 168, 20, _("Notify only")); chkRSidNotifyOnly->tooltip(_("Check this to be notified when an RSID is received\nwithout changing modem an\ d frequency")); chkRSidNotifyOnly->down_box(FL_DOWN_BOX); chkRSidNotifyOnly->callback((Fl_Callback*)cb_chkRSidNotifyOnly); chkRSidNotifyOnly->value(progdefaults.rsid_notify_only); } // Fl_Check_Button* chkRSidNotifyOnly { bRSIDRxModes = new Fl_Button(40, 81, 130, 24, _("Receive modes")); bRSIDRxModes->callback((Fl_Callback*)cb_bRSIDRxModes); } // Fl_Button* bRSIDRxModes { Fl_Check_Button* o = chkRSidWideSearch = new Fl_Check_Button(40, 143, 203, 20, _("Searches passband")); chkRSidWideSearch->tooltip(_("ON - search over entire waterfall\nOFF - limit search to +/- 200 Hz")); chkRSidWideSearch->down_box(FL_DOWN_BOX); chkRSidWideSearch->callback((Fl_Callback*)cb_chkRSidWideSearch); o->value(progdefaults.rsidWideSearch); } // Fl_Check_Button* chkRSidWideSearch { chkRSidMark = new Fl_Check_Button(40, 175, 203, 20, _("Mark prev freq/mode")); chkRSidMark->tooltip(_("Insert RX text marker before\nchanging frequency and modem")); chkRSidMark->down_box(FL_DOWN_BOX); chkRSidMark->callback((Fl_Callback*)cb_chkRSidMark); chkRSidMark->value(progdefaults.rsid_mark); } // Fl_Check_Button* chkRSidMark { chkRSidAutoDisable = new Fl_Check_Button(40, 207, 203, 20, _("Disables detector")); chkRSidAutoDisable->tooltip(_("Disable further detection when RSID is received")); chkRSidAutoDisable->down_box(FL_DOWN_BOX); chkRSidAutoDisable->callback((Fl_Callback*)cb_chkRSidAutoDisable); if (progdefaults.rsid_notify_only) progdefaults.rsid_auto_disable = false; chkRSidAutoDisable->value(progdefaults.rsid_auto_disable); if (progdefaults.rsid_notify_only) chkRSidAutoDisable->deactivate(); } // Fl_Check_Button* chkRSidAutoDisable { Fl_ListBox* o = listbox_rsid_errors = new Fl_ListBox(40, 233, 100, 22, _("Allow errors")); listbox_rsid_errors->tooltip(_("Low = zero errors\nMedium = 1 error\nHigh = 2 errors")); listbox_rsid_errors->box(FL_DOWN_BOX); listbox_rsid_errors->color(FL_BACKGROUND2_COLOR); listbox_rsid_errors->selection_color(FL_BACKGROUND_COLOR); listbox_rsid_errors->labeltype(FL_NORMAL_LABEL); listbox_rsid_errors->labelfont(0); listbox_rsid_errors->labelsize(14); listbox_rsid_errors->labelcolor(FL_FOREGROUND_COLOR); listbox_rsid_errors->callback((Fl_Callback*)cb_listbox_rsid_errors); listbox_rsid_errors->align(Fl_Align(FL_ALIGN_RIGHT)); listbox_rsid_errors->when(FL_WHEN_RELEASE); listbox_rsid_errors->add(_("Low")); listbox_rsid_errors->add(_("Medium")); listbox_rsid_errors->add(_("High")); listbox_rsid_errors->index(progdefaults.RsID_label_type); o->labelsize(FL_NORMAL_SIZE); listbox_rsid_errors->end(); } // Fl_ListBox* listbox_rsid_errors { Fl_Value_Slider2* o = sldrRSIDsquelch = new Fl_Value_Slider2(276, 233, 145, 22, _("Squelch open (sec)")); sldrRSIDsquelch->tooltip(_("Open squelch for nn sec if RSID detected")); sldrRSIDsquelch->type(1); sldrRSIDsquelch->box(FL_DOWN_BOX); sldrRSIDsquelch->color(FL_BACKGROUND_COLOR); sldrRSIDsquelch->selection_color(FL_BACKGROUND_COLOR); sldrRSIDsquelch->labeltype(FL_NORMAL_LABEL); sldrRSIDsquelch->labelfont(0); sldrRSIDsquelch->labelsize(14); sldrRSIDsquelch->labelcolor(FL_FOREGROUND_COLOR); sldrRSIDsquelch->maximum(20); sldrRSIDsquelch->step(1); sldrRSIDsquelch->textsize(14); sldrRSIDsquelch->callback((Fl_Callback*)cb_sldrRSIDsquelch); sldrRSIDsquelch->align(Fl_Align(FL_ALIGN_RIGHT)); sldrRSIDsquelch->when(FL_WHEN_CHANGED); o->value(progdefaults.rsid_squelch); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrRSIDsquelch { Fl_Check_Button* o = chkRSidShowAlert = new Fl_Check_Button(276, 143, 203, 20, _("Disable alert dialog")); chkRSidShowAlert->tooltip(_("Do not show RsID alert dialog box")); chkRSidShowAlert->down_box(FL_DOWN_BOX); chkRSidShowAlert->callback((Fl_Callback*)cb_chkRSidShowAlert); o->value(progdefaults.disable_rsid_warning_dialog_box); } // Fl_Check_Button* chkRSidShowAlert { Fl_Check_Button* o = chkRetainFreqLock = new Fl_Check_Button(276, 175, 203, 20, _("Retain tx freq lock")); chkRetainFreqLock->tooltip(_("Retain TX lock frequency (Lk) when changing to RX RsID frequency")); chkRetainFreqLock->down_box(FL_DOWN_BOX); chkRetainFreqLock->callback((Fl_Callback*)cb_chkRetainFreqLock); o->value(progdefaults.retain_freq_lock); } // Fl_Check_Button* chkRetainFreqLock { Fl_Check_Button* o = chkDisableFreqChange = new Fl_Check_Button(276, 207, 203, 20, _("Disable freq change")); chkDisableFreqChange->tooltip(_("Do not automatically change to RX RsID frequency")); chkDisableFreqChange->down_box(FL_DOWN_BOX); chkDisableFreqChange->callback((Fl_Callback*)cb_chkDisableFreqChange); o->value(progdefaults.disable_rsid_freq_change); } // Fl_Check_Button* chkDisableFreqChange { Fl_Group* o = new Fl_Group(216, 74, 330, 60, _("The RsID notification message contents and \ndisplay characteristics are conf\ igured on the\n\"Notifications\" configure dialog.")); o->box(FL_BORDER_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(32, 267, 265, 97, _("Pre-Signal Tone")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = val_pretone = new Fl_Counter(88, 305, 140, 21, _("Seconds")); val_pretone->tooltip(_("Use for triggering amplifier carrier detect")); val_pretone->minimum(0); val_pretone->maximum(10); val_pretone->callback((Fl_Callback*)cb_val_pretone); o->value(progdefaults.pretone); } // Fl_Counter* val_pretone o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(300, 267, 265, 97, _("Reed-Solomon ID (Tx)")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { bRSIDTxModes = new Fl_Button(377, 294, 130, 24, _("Transmit modes")); bRSIDTxModes->callback((Fl_Callback*)cb_bRSIDTxModes); } // Fl_Button* bRSIDTxModes { Fl_Check_Button* o = btn_post_rsid = new Fl_Check_Button(377, 329, 97, 17, _("End of xmt ID")); btn_post_rsid->tooltip(_("Add RsID signal to end of transmission")); btn_post_rsid->down_box(FL_DOWN_BOX); btn_post_rsid->callback((Fl_Callback*)cb_btn_post_rsid); o->value(progdefaults.rsid_post); } // Fl_Check_Button* btn_post_rsid o->end(); } // Fl_Group* o tabRsID->end(); } // Fl_Group* tabRsID { tabVideoID = new Fl_Group(0, 50, 600, 330, _("Video")); tabVideoID->hide(); { Fl_Group* o = new Fl_Group(32, 115, 536, 189, _("Video Preamble ID")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnsendid = new Fl_Check_Button(50, 149, 150, 20, _("Transmit mode ID")); btnsendid->tooltip(_("Waterfall video ID")); btnsendid->down_box(FL_DOWN_BOX); btnsendid->callback((Fl_Callback*)cb_btnsendid); } // Fl_Check_Button* btnsendid { Fl_Check_Button* o = btnsendvideotext = new Fl_Check_Button(50, 181, 155, 20, _("Transmit video text")); btnsendvideotext->tooltip(_("Waterfall video text")); btnsendvideotext->down_box(FL_DOWN_BOX); btnsendvideotext->callback((Fl_Callback*)cb_btnsendvideotext); o->value(progdefaults.sendtextid); } // Fl_Check_Button* btnsendvideotext { Fl_Input2* o = valVideotext = new Fl_Input2(217, 179, 323, 24, _(":")); valVideotext->tooltip(_("Limit to a few characters,\nas in CQEM or IOTA etc.")); valVideotext->box(FL_DOWN_BOX); valVideotext->color(FL_BACKGROUND2_COLOR); valVideotext->selection_color(FL_SELECTION_COLOR); valVideotext->labeltype(FL_NORMAL_LABEL); valVideotext->labelfont(0); valVideotext->labelsize(14); valVideotext->labelcolor(FL_FOREGROUND_COLOR); valVideotext->callback((Fl_Callback*)cb_valVideotext); valVideotext->align(Fl_Align(FL_ALIGN_LEFT)); valVideotext->when(FL_WHEN_RELEASE); o->value(progdefaults.strTextid.c_str()); valVideotext->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* valVideotext { Fl_Check_Button* o = chkID_SMALL = new Fl_Check_Button(50, 213, 120, 20, _("Use small font")); chkID_SMALL->tooltip(_("ON - small font\nOFF - large font")); chkID_SMALL->down_box(FL_DOWN_BOX); chkID_SMALL->value(1); chkID_SMALL->callback((Fl_Callback*)cb_chkID_SMALL); o->value(progdefaults.ID_SMALL); } // Fl_Check_Button* chkID_SMALL { Fl_Value_Slider2* o = sldrVideowidth = new Fl_Value_Slider2(290, 211, 125, 24, _("Chars/Row:")); sldrVideowidth->tooltip(_("Set the number of characters per row")); sldrVideowidth->type(1); sldrVideowidth->box(FL_DOWN_BOX); sldrVideowidth->color(FL_BACKGROUND_COLOR); sldrVideowidth->selection_color(FL_BACKGROUND_COLOR); sldrVideowidth->labeltype(FL_NORMAL_LABEL); sldrVideowidth->labelfont(0); sldrVideowidth->labelsize(14); sldrVideowidth->labelcolor(FL_FOREGROUND_COLOR); sldrVideowidth->minimum(1); sldrVideowidth->maximum(8); sldrVideowidth->step(1); sldrVideowidth->value(4); sldrVideowidth->textsize(14); sldrVideowidth->callback((Fl_Callback*)cb_sldrVideowidth); sldrVideowidth->align(Fl_Align(FL_ALIGN_LEFT)); sldrVideowidth->when(FL_WHEN_CHANGED); o->value(progdefaults.videowidth); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrVideowidth { Fl_Check_Button* o = btn_vidlimit = new Fl_Check_Button(50, 245, 110, 15, _("500 Hz limit")); btn_vidlimit->down_box(FL_DOWN_BOX); btn_vidlimit->callback((Fl_Callback*)cb_btn_vidlimit); o->value(progdefaults.vidlimit); } // Fl_Check_Button* btn_vidlimit { Fl_Check_Button* o = btn_vidmodelimit = new Fl_Check_Button(50, 273, 110, 15, _("Mode width limit")); btn_vidmodelimit->down_box(FL_DOWN_BOX); btn_vidmodelimit->callback((Fl_Callback*)cb_btn_vidmodelimit); o->value(progdefaults.vidmodelimit); } // Fl_Check_Button* btn_vidmodelimit { bVideoIDModes = new Fl_Button(420, 146, 120, 24, _("Video ID modes")); bVideoIDModes->callback((Fl_Callback*)cb_bVideoIDModes); } // Fl_Button* bVideoIDModes o->end(); } // Fl_Group* o tabVideoID->end(); } // Fl_Group* tabVideoID { tabCwID = new Fl_Group(0, 50, 600, 330, _("CW")); tabCwID->hide(); { sld = new Fl_Group(32, 146, 536, 127, _("CW Postamble ID")); sld->box(FL_ENGRAVED_FRAME); sld->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnCWID = new Fl_Check_Button(139, 184, 140, 24, _("Transmit callsign")); btnCWID->tooltip(_("Send Callsign in CW at end of every transmission")); btnCWID->down_box(FL_DOWN_BOX); btnCWID->callback((Fl_Callback*)cb_btnCWID); o->value(progdefaults.CWid); } // Fl_Check_Button* btnCWID { Fl_Value_Slider2* o = sldrCWIDwpm = new Fl_Value_Slider2(139, 227, 180, 20, _("Speed (WPM):")); sldrCWIDwpm->tooltip(_("Send at this WPM")); sldrCWIDwpm->type(1); sldrCWIDwpm->box(FL_DOWN_BOX); sldrCWIDwpm->color(FL_BACKGROUND_COLOR); sldrCWIDwpm->selection_color(FL_BACKGROUND_COLOR); sldrCWIDwpm->labeltype(FL_NORMAL_LABEL); sldrCWIDwpm->labelfont(0); sldrCWIDwpm->labelsize(14); sldrCWIDwpm->labelcolor(FL_FOREGROUND_COLOR); sldrCWIDwpm->minimum(15); sldrCWIDwpm->maximum(40); sldrCWIDwpm->step(1); sldrCWIDwpm->value(18); sldrCWIDwpm->textsize(14); sldrCWIDwpm->callback((Fl_Callback*)cb_sldrCWIDwpm); sldrCWIDwpm->align(Fl_Align(FL_ALIGN_TOP)); sldrCWIDwpm->when(FL_WHEN_CHANGED); o->value(progdefaults.CWIDwpm); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrCWIDwpm { bCWIDModes = new Fl_Button(412, 184, 120, 24, _("CW ID modes")); bCWIDModes->callback((Fl_Callback*)cb_bCWIDModes); } // Fl_Button* bCWIDModes sld->end(); } // Fl_Group* sld tabCwID->end(); } // Fl_Group* tabCwID tabsID->end(); } // Fl_Tabs* tabsID tabID->end(); } // Fl_Group* tabID { tabMisc = new Fl_Group(0, 25, 600, 355, _("Misc")); tabMisc->hide(); { tabsMisc = new Fl_Tabs(0, 25, 600, 355); tabsMisc->selection_color(FL_LIGHT1); { tabCPUspeed = new Fl_Group(0, 50, 600, 330, _("CPU")); { Fl_Group* o = new Fl_Group(55, 75, 490, 51); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chkSlowCpu = new Fl_Check_Button(201, 90, 225, 20, _("Slow CPU (less than 700MHz)")); chkSlowCpu->tooltip(_("Enable if you\'re computer does not decode properly")); chkSlowCpu->down_box(FL_DOWN_BOX); chkSlowCpu->callback((Fl_Callback*)cb_chkSlowCpu); o->value(progdefaults.slowcpu); } // Fl_Check_Button* chkSlowCpu o->end(); } // Fl_Group* o tabCPUspeed->end(); } // Fl_Group* tabCPUspeed { tabNBEMS = new Fl_Group(0, 50, 600, 330, _("NBEMS")); tabNBEMS->hide(); { Fl_Group* o = new Fl_Group(50, 65, 500, 75, _("NBEMS data file interface")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chkAutoExtract = new Fl_Check_Button(104, 96, 75, 20, _("Enable")); chkAutoExtract->tooltip(_("Extract files for use with external \"wrap / flmsg\" program")); chkAutoExtract->down_box(FL_DOWN_BOX); chkAutoExtract->callback((Fl_Callback*)cb_chkAutoExtract); o->value(progdefaults.autoextract); } // Fl_Check_Button* chkAutoExtract { Fl_Check_Button* o = chk_open_wrap_folder = new Fl_Check_Button(310, 96, 146, 20, _("Open message folder")); chk_open_wrap_folder->tooltip(_("Opens NBEMS file folder upon successful capture")); chk_open_wrap_folder->down_box(FL_DOWN_BOX); chk_open_wrap_folder->callback((Fl_Callback*)cb_chk_open_wrap_folder); o->value(progdefaults.open_nbems_folder); } // Fl_Check_Button* chk_open_wrap_folder o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(50, 141, 500, 130, _("Reception of flmsg files")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chk_open_flmsg = new Fl_Check_Button(104, 168, 136, 20, _("Open with flmsg")); chk_open_flmsg->tooltip(_("Open message with flmsg")); chk_open_flmsg->down_box(FL_DOWN_BOX); chk_open_flmsg->callback((Fl_Callback*)cb_chk_open_flmsg); o->value(progdefaults.open_flmsg); } // Fl_Check_Button* chk_open_flmsg { Fl_Check_Button* o = chk_open_flmsg_print = new Fl_Check_Button(310, 168, 136, 20, _("Open in browser")); chk_open_flmsg_print->tooltip(_("Open file with default browser")); chk_open_flmsg_print->down_box(FL_DOWN_BOX); chk_open_flmsg_print->callback((Fl_Callback*)cb_chk_open_flmsg_print); o->value(progdefaults.open_flmsg_print); } // Fl_Check_Button* chk_open_flmsg_print { Fl_Input2* o = txt_flmsg_pathname = new Fl_Input2(104, 199, 330, 24, _("flmsg:")); txt_flmsg_pathname->tooltip(_("Enter full path-filename for flmsg")); txt_flmsg_pathname->box(FL_DOWN_BOX); txt_flmsg_pathname->color(FL_BACKGROUND2_COLOR); txt_flmsg_pathname->selection_color(FL_SELECTION_COLOR); txt_flmsg_pathname->labeltype(FL_NORMAL_LABEL); txt_flmsg_pathname->labelfont(0); txt_flmsg_pathname->labelsize(14); txt_flmsg_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_flmsg_pathname->callback((Fl_Callback*)cb_txt_flmsg_pathname); txt_flmsg_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_flmsg_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.flmsg_pathname.c_str()); } // Fl_Input2* txt_flmsg_pathname { btn_select_flmsg = new Fl_Button(441, 199, 100, 24, _("Locate flmsg")); btn_select_flmsg->tooltip(_("Locate flmsg executable")); btn_select_flmsg->callback((Fl_Callback*)cb_btn_select_flmsg); } // Fl_Button* btn_select_flmsg { Fl_Value_Slider* o = sldr_extract_timeout = new Fl_Value_Slider(70, 237, 364, 21, _("Timeout (secs)")); sldr_extract_timeout->tooltip(_("Extract times out after NN seconds of inactivity.")); sldr_extract_timeout->type(5); sldr_extract_timeout->color(FL_LIGHT3); sldr_extract_timeout->selection_color(FL_FOREGROUND_COLOR); sldr_extract_timeout->minimum(1); sldr_extract_timeout->maximum(10); sldr_extract_timeout->step(0.5); sldr_extract_timeout->value(4); sldr_extract_timeout->textsize(14); sldr_extract_timeout->callback((Fl_Callback*)cb_sldr_extract_timeout); sldr_extract_timeout->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.extract_timeout); } // Fl_Value_Slider* sldr_extract_timeout o->end(); } // Fl_Group* o tabNBEMS->end(); } // Fl_Group* tabNBEMS { tabPskmail = new Fl_Group(0, 50, 600, 330, _("Pskmail")); tabPskmail->align(Fl_Align(FL_ALIGN_TOP_LEFT)); tabPskmail->hide(); { Fl_Group* o = new Fl_Group(55, 58, 490, 174, _("Mail Server Attributes")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntServerCarrier = new Fl_Counter2(106, 86, 80, 20, _("Carrier frequency (Hz)")); cntServerCarrier->tooltip(_("Default listen / transmit frequency")); cntServerCarrier->type(1); cntServerCarrier->box(FL_UP_BOX); cntServerCarrier->color(FL_BACKGROUND_COLOR); cntServerCarrier->selection_color(FL_INACTIVE_COLOR); cntServerCarrier->labeltype(FL_NORMAL_LABEL); cntServerCarrier->labelfont(0); cntServerCarrier->labelsize(14); cntServerCarrier->labelcolor(FL_FOREGROUND_COLOR); cntServerCarrier->minimum(500); cntServerCarrier->maximum(2500); cntServerCarrier->step(25); cntServerCarrier->value(1500); cntServerCarrier->callback((Fl_Callback*)cb_cntServerCarrier); cntServerCarrier->align(Fl_Align(FL_ALIGN_RIGHT)); cntServerCarrier->when(FL_WHEN_CHANGED); o->value(progdefaults.ServerCarrier); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntServerCarrier { Fl_Counter2* o = cntServerOffset = new Fl_Counter2(106, 123, 80, 20, _("Search range (Hz)")); cntServerOffset->tooltip(_("Listen for signals within this range")); cntServerOffset->type(1); cntServerOffset->box(FL_UP_BOX); cntServerOffset->color(FL_BACKGROUND_COLOR); cntServerOffset->selection_color(FL_INACTIVE_COLOR); cntServerOffset->labeltype(FL_NORMAL_LABEL); cntServerOffset->labelfont(0); cntServerOffset->labelsize(14); cntServerOffset->labelcolor(FL_FOREGROUND_COLOR); cntServerOffset->minimum(10); cntServerOffset->maximum(500); cntServerOffset->step(10); cntServerOffset->value(100); cntServerOffset->callback((Fl_Callback*)cb_cntServerOffset); cntServerOffset->align(Fl_Align(FL_ALIGN_RIGHT)); cntServerOffset->when(FL_WHEN_CHANGED); o->value(progdefaults.SearchRange); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntServerOffset { Fl_Counter2* o = cntServerACQsn = new Fl_Counter2(106, 160, 80, 20, _("Acquisition S/N (dB)")); cntServerACQsn->tooltip(_("Capture signals over this threshold")); cntServerACQsn->type(1); cntServerACQsn->box(FL_UP_BOX); cntServerACQsn->color(FL_BACKGROUND_COLOR); cntServerACQsn->selection_color(FL_INACTIVE_COLOR); cntServerACQsn->labeltype(FL_NORMAL_LABEL); cntServerACQsn->labelfont(0); cntServerACQsn->labelsize(14); cntServerACQsn->labelcolor(FL_FOREGROUND_COLOR); cntServerACQsn->minimum(3); cntServerACQsn->maximum(20); cntServerACQsn->step(1); cntServerACQsn->value(6); cntServerACQsn->callback((Fl_Callback*)cb_cntServerACQsn); cntServerACQsn->align(Fl_Align(FL_ALIGN_RIGHT)); cntServerACQsn->when(FL_WHEN_CHANGED); o->value(progdefaults.ServerACQsn); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntServerACQsn { Fl_Counter2* o = cntServerAFCrange = new Fl_Counter2(106, 197, 80, 20, _("AFC range (Hz)")); cntServerAFCrange->tooltip(_("Limit AFC movement to this range")); cntServerAFCrange->type(1); cntServerAFCrange->box(FL_UP_BOX); cntServerAFCrange->color(FL_BACKGROUND_COLOR); cntServerAFCrange->selection_color(FL_INACTIVE_COLOR); cntServerAFCrange->labeltype(FL_NORMAL_LABEL); cntServerAFCrange->labelfont(0); cntServerAFCrange->labelsize(14); cntServerAFCrange->labelcolor(FL_FOREGROUND_COLOR); cntServerAFCrange->minimum(10); cntServerAFCrange->maximum(500); cntServerAFCrange->step(10); cntServerAFCrange->value(25); cntServerAFCrange->callback((Fl_Callback*)cb_cntServerAFCrange); cntServerAFCrange->align(Fl_Align(FL_ALIGN_RIGHT)); cntServerAFCrange->when(FL_WHEN_CHANGED); o->value(progdefaults.SearchRange); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntServerAFCrange { Fl_Check_Button* o = btnPSKmailSweetSpot = new Fl_Check_Button(361, 86, 142, 20, _("Reset to Carrier")); btnPSKmailSweetSpot->tooltip(_("When no signal present")); btnPSKmailSweetSpot->down_box(FL_DOWN_BOX); btnPSKmailSweetSpot->value(1); btnPSKmailSweetSpot->callback((Fl_Callback*)cb_btnPSKmailSweetSpot); o->value(progdefaults.PSKmailSweetSpot); } // Fl_Check_Button* btnPSKmailSweetSpot o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 234, 490, 131, _("General")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_arq_s2n_report = new Fl_Check_Button(80, 259, 250, 20, _("Report ARQ frames average S/N")); btn_arq_s2n_report->down_box(FL_DOWN_BOX); btn_arq_s2n_report->callback((Fl_Callback*)cb_btn_arq_s2n_report); o->value(progdefaults.Pskmails2nreport); } // Fl_Check_Button* btn_arq_s2n_report o->end(); } // Fl_Group* o tabPskmail->end(); } // Fl_Group* tabPskmail { tabSpot = new Fl_Group(0, 50, 600, 330, _("Spotting")); tabSpot->hide(); { Fl_Group* o = new Fl_Group(55, 72, 490, 254, _("PSK Reporter")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnPSKRepAuto = new Fl_Check_Button(65, 103, 324, 20, _("Automatically spot callsigns in decoded text")); btnPSKRepAuto->tooltip(_("Parse all incoming text")); btnPSKRepAuto->down_box(FL_DOWN_BOX); btnPSKRepAuto->callback((Fl_Callback*)cb_btnPSKRepAuto); btnPSKRepAuto->value(progdefaults.pskrep_auto); } // Fl_Check_Button* btnPSKRepAuto { btnPSKRepLog = new Fl_Check_Button(65, 133, 327, 20, _("Send reception report when logging a QSO")); btnPSKRepLog->tooltip(_("Send report only when QSO is logged")); btnPSKRepLog->down_box(FL_DOWN_BOX); btnPSKRepLog->callback((Fl_Callback*)cb_btnPSKRepLog); btnPSKRepLog->value(progdefaults.pskrep_log); } // Fl_Check_Button* btnPSKRepLog { btnPSKRepQRG = new Fl_Check_Button(65, 164, 416, 20, _("Report rig frequency (enable only if you have rig control!)")); btnPSKRepQRG->tooltip(_("Include the transmit frequency")); btnPSKRepQRG->down_box(FL_DOWN_BOX); btnPSKRepQRG->callback((Fl_Callback*)cb_btnPSKRepQRG); btnPSKRepQRG->value(progdefaults.pskrep_qrg); } // Fl_Check_Button* btnPSKRepQRG { Fl_Check_Button* o = btn_report_when_visible = new Fl_Check_Button(65, 195, 416, 20, _("Disable spotting when signal browser(s) are not visible.")); btn_report_when_visible->tooltip(_("Check to reduce CPU load in PSK and RTTY modes.")); btn_report_when_visible->down_box(FL_DOWN_BOX); btn_report_when_visible->value(1); btn_report_when_visible->callback((Fl_Callback*)cb_btn_report_when_visible); o->value(progdefaults.report_when_visible); } // Fl_Check_Button* btn_report_when_visible { inpPSKRepHost = new Fl_Input2(108, 228, 220, 24, _("Host:")); inpPSKRepHost->tooltip(_("To whom the connection is made")); inpPSKRepHost->box(FL_DOWN_BOX); inpPSKRepHost->color(FL_BACKGROUND2_COLOR); inpPSKRepHost->selection_color(FL_SELECTION_COLOR); inpPSKRepHost->labeltype(FL_NORMAL_LABEL); inpPSKRepHost->labelfont(0); inpPSKRepHost->labelsize(14); inpPSKRepHost->labelcolor(FL_FOREGROUND_COLOR); inpPSKRepHost->callback((Fl_Callback*)cb_inpPSKRepHost); inpPSKRepHost->align(Fl_Align(FL_ALIGN_LEFT)); inpPSKRepHost->when(FL_WHEN_CHANGED); inpPSKRepHost->value(progdefaults.pskrep_host.c_str()); inpPSKRepHost->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpPSKRepHost { inpPSKRepPort = new Fl_Input2(477, 228, 60, 24, _("Port:")); inpPSKRepPort->tooltip(_("Using UDP port #")); inpPSKRepPort->box(FL_DOWN_BOX); inpPSKRepPort->color(FL_BACKGROUND2_COLOR); inpPSKRepPort->selection_color(FL_SELECTION_COLOR); inpPSKRepPort->labeltype(FL_NORMAL_LABEL); inpPSKRepPort->labelfont(0); inpPSKRepPort->labelsize(14); inpPSKRepPort->labelcolor(FL_FOREGROUND_COLOR); inpPSKRepPort->callback((Fl_Callback*)cb_inpPSKRepPort); inpPSKRepPort->align(Fl_Align(FL_ALIGN_LEFT)); inpPSKRepPort->when(FL_WHEN_CHANGED); inpPSKRepPort->value(progdefaults.pskrep_port.c_str()); inpPSKRepPort->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpPSKRepPort { btnPSKRepInit = new Fl_Button(457, 273, 80, 24, _("Initialize")); btnPSKRepInit->tooltip(_("Initialize the socket client")); btnPSKRepInit->callback((Fl_Callback*)cb_btnPSKRepInit); } // Fl_Button* btnPSKRepInit { boxPSKRepMsg = new Fl_Box(67, 257, 300, 48, _("")); boxPSKRepMsg->labelfont(2); boxPSKRepMsg->label(0); } // Fl_Box* boxPSKRepMsg o->end(); } // Fl_Group* o tabSpot->end(); } // Fl_Group* tabSpot { tabSweetSpot = new Fl_Group(0, 50, 600, 330, _("Sweet Spot")); tabSweetSpot->hide(); { Fl_Group* o = new Fl_Group(55, 71, 490, 75); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Value_Input2* o = valCWsweetspot = new Fl_Value_Input2(92, 82, 65, 20, _("CW")); valCWsweetspot->tooltip(_("Default CW tracking point")); valCWsweetspot->box(FL_DOWN_BOX); valCWsweetspot->color(FL_BACKGROUND2_COLOR); valCWsweetspot->selection_color(FL_SELECTION_COLOR); valCWsweetspot->labeltype(FL_NORMAL_LABEL); valCWsweetspot->labelfont(0); valCWsweetspot->labelsize(14); valCWsweetspot->labelcolor(FL_FOREGROUND_COLOR); valCWsweetspot->minimum(200); valCWsweetspot->maximum(4000); valCWsweetspot->step(1); valCWsweetspot->value(1000); valCWsweetspot->callback((Fl_Callback*)cb_valCWsweetspot); valCWsweetspot->align(Fl_Align(FL_ALIGN_LEFT)); valCWsweetspot->when(FL_WHEN_CHANGED); o->value(progdefaults.CWsweetspot); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* valCWsweetspot { Fl_Value_Input2* o = valRTTYsweetspot = new Fl_Value_Input2(270, 82, 65, 20, _("RTTY")); valRTTYsweetspot->tooltip(_("Default RTTY tracking point")); valRTTYsweetspot->box(FL_DOWN_BOX); valRTTYsweetspot->color(FL_BACKGROUND2_COLOR); valRTTYsweetspot->selection_color(FL_SELECTION_COLOR); valRTTYsweetspot->labeltype(FL_NORMAL_LABEL); valRTTYsweetspot->labelfont(0); valRTTYsweetspot->labelsize(14); valRTTYsweetspot->labelcolor(FL_FOREGROUND_COLOR); valRTTYsweetspot->minimum(200); valRTTYsweetspot->maximum(4000); valRTTYsweetspot->step(1); valRTTYsweetspot->value(1000); valRTTYsweetspot->callback((Fl_Callback*)cb_valRTTYsweetspot); valRTTYsweetspot->align(Fl_Align(FL_ALIGN_LEFT)); valRTTYsweetspot->when(FL_WHEN_CHANGED); o->value(progdefaults.RTTYsweetspot); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* valRTTYsweetspot { Fl_Value_Input2* o = valPSKsweetspot = new Fl_Value_Input2(470, 82, 65, 20, _("PSK et al.")); valPSKsweetspot->tooltip(_("Default for all other modems")); valPSKsweetspot->box(FL_DOWN_BOX); valPSKsweetspot->color(FL_BACKGROUND2_COLOR); valPSKsweetspot->selection_color(FL_SELECTION_COLOR); valPSKsweetspot->labeltype(FL_NORMAL_LABEL); valPSKsweetspot->labelfont(0); valPSKsweetspot->labelsize(14); valPSKsweetspot->labelcolor(FL_FOREGROUND_COLOR); valPSKsweetspot->minimum(200); valPSKsweetspot->maximum(4000); valPSKsweetspot->step(1); valPSKsweetspot->value(1000); valPSKsweetspot->callback((Fl_Callback*)cb_valPSKsweetspot); valPSKsweetspot->align(Fl_Align(FL_ALIGN_LEFT)); valPSKsweetspot->when(FL_WHEN_CHANGED); o->value(progdefaults.PSKsweetspot); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* valPSKsweetspot { Fl_Check_Button* o = btnStartAtSweetSpot = new Fl_Check_Button(65, 112, 348, 20, _("Always start new modems at these frequencies")); btnStartAtSweetSpot->tooltip(_("ON - start at default\nOFF - keep current wf cursor position")); btnStartAtSweetSpot->down_box(FL_DOWN_BOX); btnStartAtSweetSpot->value(1); btnStartAtSweetSpot->callback((Fl_Callback*)cb_btnStartAtSweetSpot); o->value(progdefaults.StartAtSweetSpot); } // Fl_Check_Button* btnStartAtSweetSpot o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 151, 490, 60, _("K3 A1A configuation")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnCWIsLSB = new Fl_Check_Button(270, 172, 70, 15, _("CW is LSB")); btnCWIsLSB->tooltip(_("Select this for Elecraft K3\nOther radios should not need it.")); btnCWIsLSB->down_box(FL_DOWN_BOX); btnCWIsLSB->callback((Fl_Callback*)cb_btnCWIsLSB); o->value(progdefaults.CWIsLSB); } // Fl_Check_Button* btnCWIsLSB o->end(); } // Fl_Group* o tabSweetSpot->end(); } // Fl_Group* tabSweetSpot { tabText_IO = new Fl_Group(0, 50, 600, 330, _("Text i/o")); tabText_IO->hide(); { grpTalker = new Fl_Group(55, 132, 490, 73, _("Talker Socket (MS only)")); grpTalker->box(FL_ENGRAVED_FRAME); grpTalker->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnConnectTalker = new Fl_Light_Button(81, 152, 74, 20, _("Talker")); btnConnectTalker->selection_color(FL_DARK_GREEN); btnConnectTalker->callback((Fl_Callback*)cb_btnConnectTalker); } // Fl_Light_Button* btnConnectTalker { Fl_Box* o = new Fl_Box(160, 152, 345, 20, _("Connect/disconnect to Talker socket server")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Check_Button* o = btn_auto_talk = new Fl_Check_Button(81, 180, 391, 15, _("Auto connect when fldigi opens (server must be up)")); btn_auto_talk->down_box(FL_DOWN_BOX); btn_auto_talk->callback((Fl_Callback*)cb_btn_auto_talk); o->value(progdefaults.auto_talk); } // Fl_Check_Button* btn_auto_talk grpTalker->end(); } // Fl_Group* grpTalker { Fl_Group* o = new Fl_Group(55, 72, 490, 56, _("Capture rx text to external file")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chkRxStream = new Fl_Check_Button(81, 99, 175, 20, _("Enable rx text stream")); chkRxStream->tooltip(_("Send rx text to file: textout.txt")); chkRxStream->down_box(FL_DOWN_BOX); chkRxStream->callback((Fl_Callback*)cb_chkRxStream); o->value(progdefaults.speak); } // Fl_Check_Button* chkRxStream o->end(); } // Fl_Group* o tabText_IO->end(); } // Fl_Group* tabText_IO { tabDTMF = new Fl_Group(0, 50, 600, 330, _("DTMF")); tabDTMF->hide(); { Fl_Check_Button* o = chkDTMFdecode = new Fl_Check_Button(212, 103, 175, 20, _("Decode DTMF tones")); chkDTMFdecode->tooltip(_("Decode received DTMF tones")); chkDTMFdecode->down_box(FL_DOWN_BOX); chkDTMFdecode->callback((Fl_Callback*)cb_chkDTMFdecode); o->value(progdefaults.DTMFdecode); } // Fl_Check_Button* chkDTMFdecode tabDTMF->end(); } // Fl_Group* tabDTMF { tabWX = new Fl_Group(0, 50, 600, 330, _("WX")); tabWX->hide(); { Fl_Group* o = new Fl_Group(55, 60, 490, 300, _("Weather query specification")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input* o = inpWXsta = new Fl_Input(94, 92, 43, 24, _("METAR station ID code")); inpWXsta->tooltip(_("for example KMDQ for \nHuntsville-Madison Executive Airport, AL")); inpWXsta->callback((Fl_Callback*)cb_inpWXsta); inpWXsta->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.wx_sta.c_str()); } // Fl_Input* inpWXsta { Fl_Check_Button* o = btn_wx_full = new Fl_Check_Button(258, 130, 70, 15, _("Full report")); btn_wx_full->tooltip(_("Insert full METAR report")); btn_wx_full->down_box(FL_DOWN_BOX); btn_wx_full->callback((Fl_Callback*)cb_btn_wx_full); o->value(progdefaults.wx_full); } // Fl_Check_Button* btn_wx_full { Fl_Input* o = new Fl_Input(258, 156, 266, 25, _("End of header string:")); o->tooltip(_("Text defining end of METAR header\nTypically \'Connection: close\'\nUsed to s\ earch for station name")); o->callback((Fl_Callback*)cb_End); o->when(FL_WHEN_CHANGED); o->value(progdefaults.wx_eoh.c_str()); } // Fl_Input* o { Fl_Check_Button* o = btn_wx_station_name = new Fl_Check_Button(258, 192, 70, 15, _("METAR station location")); btn_wx_station_name->tooltip(_("Add geopolitical name of METAR station")); btn_wx_station_name->down_box(FL_DOWN_BOX); btn_wx_station_name->callback((Fl_Callback*)cb_btn_wx_station_name); o->value(progdefaults.wx_station_name); } // Fl_Check_Button* btn_wx_station_name { Fl_Check_Button* o = btn_wx_condx = new Fl_Check_Button(258, 218, 70, 15, _("Conditions")); btn_wx_condx->tooltip(_("current wx conditions")); btn_wx_condx->down_box(FL_DOWN_BOX); btn_wx_condx->callback((Fl_Callback*)cb_btn_wx_condx); o->value(progdefaults.wx_condx); } // Fl_Check_Button* btn_wx_condx { Fl_Check_Button* o = btn_wx_fahrenheit = new Fl_Check_Button(258, 245, 70, 15, _("Fahrenheit")); btn_wx_fahrenheit->tooltip(_("report Fahrenheit")); btn_wx_fahrenheit->down_box(FL_DOWN_BOX); btn_wx_fahrenheit->callback((Fl_Callback*)cb_btn_wx_fahrenheit); o->value(progdefaults.wx_fahrenheit); } // Fl_Check_Button* btn_wx_fahrenheit { Fl_Check_Button* o = btn_wx_celsius = new Fl_Check_Button(386, 245, 70, 15, _("Celsius")); btn_wx_celsius->tooltip(_("report Celsius")); btn_wx_celsius->down_box(FL_DOWN_BOX); btn_wx_celsius->callback((Fl_Callback*)cb_btn_wx_celsius); o->value(progdefaults.wx_celsius); } // Fl_Check_Button* btn_wx_celsius { Fl_Check_Button* o = btn_wx_mph = new Fl_Check_Button(258, 271, 70, 15, _("Miles / Hour")); btn_wx_mph->tooltip(_("report miles per hour")); btn_wx_mph->down_box(FL_DOWN_BOX); btn_wx_mph->callback((Fl_Callback*)cb_btn_wx_mph); o->value(progdefaults.wx_mph); } // Fl_Check_Button* btn_wx_mph { Fl_Check_Button* o = btn_wx_kph = new Fl_Check_Button(386, 271, 70, 15, _("kilometers / hour")); btn_wx_kph->tooltip(_("report kilometers per hour")); btn_wx_kph->down_box(FL_DOWN_BOX); btn_wx_kph->callback((Fl_Callback*)cb_btn_wx_kph); o->value(progdefaults.wx_kph); } // Fl_Check_Button* btn_wx_kph { Fl_Check_Button* o = btn_wx_inches = new Fl_Check_Button(258, 298, 70, 15, _("Inches Mg.")); btn_wx_inches->tooltip(_("report inches mercury")); btn_wx_inches->down_box(FL_DOWN_BOX); btn_wx_inches->callback((Fl_Callback*)cb_btn_wx_inches); o->value(progdefaults.wx_inches); } // Fl_Check_Button* btn_wx_inches { Fl_Check_Button* o = btn_wx_mbars = new Fl_Check_Button(386, 298, 70, 15, _("mbars")); btn_wx_mbars->tooltip(_("report millibars")); btn_wx_mbars->down_box(FL_DOWN_BOX); btn_wx_mbars->callback((Fl_Callback*)cb_btn_wx_mbars); o->value(progdefaults.wx_mbars); } // Fl_Check_Button* btn_wx_mbars { Fl_Box* o = new Fl_Box(93, 245, 156, 19, _("Temperature")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Box* o = new Fl_Box(93, 271, 156, 19, _("Wind speed/dir")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Box* o = new Fl_Box(93, 298, 156, 19, _("Barometric pressure")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { btn_metar_search = new Fl_Button(336, 92, 130, 24, _("Search on web")); btn_metar_search->callback((Fl_Callback*)cb_btn_metar_search); } // Fl_Button* btn_metar_search o->end(); } // Fl_Group* o tabWX->end(); } // Fl_Group* tabWX { tabKML = new Fl_Group(0, 50, 600, 330, _("KML")); tabKML->hide(); { Fl_Input* o = btnKmlSaveDir = new Fl_Input(26, 75, 390, 24, _("KML files directory")); btnKmlSaveDir->tooltip(_("Where generated KML documents are stored.")); btnKmlSaveDir->callback((Fl_Callback*)cb_btnKmlSaveDir); btnKmlSaveDir->align(Fl_Align(69)); o->value(progdefaults.kml_save_dir.c_str()); } // Fl_Input* btnKmlSaveDir { Fl_Input* o = inputKmlRootFile = new Fl_Input(25, 119, 300, 24, _("KML root file")); inputKmlRootFile->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value("fldigi.kml"); } // Fl_Input* inputKmlRootFile { Fl_Counter* o = cntKmlMergeDistance = new Fl_Counter(26, 155, 100, 24, _("Minimum distance for splitting aliases (Meters)")); cntKmlMergeDistance->tooltip(_("Minimum distance for splitting alias nodes (Meters)")); cntKmlMergeDistance->minimum(0); cntKmlMergeDistance->maximum(100000); cntKmlMergeDistance->step(10); cntKmlMergeDistance->value(1000); cntKmlMergeDistance->callback((Fl_Callback*)cb_cntKmlMergeDistance); cntKmlMergeDistance->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.kml_merge_distance); o->lstep(1000); } // Fl_Counter* cntKmlMergeDistance { Fl_Counter* o = cntKmlRetentionTime = new Fl_Counter(25, 191, 100, 24, _("Data retention time, in hours (0 for no limit)")); cntKmlRetentionTime->tooltip(_("Number of hours data is kept for each node. Zero means keeping everything.")); cntKmlRetentionTime->minimum(0); cntKmlRetentionTime->maximum(500); cntKmlRetentionTime->step(1); cntKmlRetentionTime->callback((Fl_Callback*)cb_cntKmlRetentionTime); cntKmlRetentionTime->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.kml_retention_time); o->lstep(24); } // Fl_Counter* cntKmlRetentionTime { Fl_Spinner2* o = cntKmlRefreshInterval = new Fl_Spinner2(24, 227, 50, 24, _("KML refresh interval (seconds)")); cntKmlRefreshInterval->tooltip(_("Refresh time interval written in KML file (Seconds)")); cntKmlRefreshInterval->box(FL_NO_BOX); cntKmlRefreshInterval->color(FL_BACKGROUND_COLOR); cntKmlRefreshInterval->selection_color(FL_BACKGROUND_COLOR); cntKmlRefreshInterval->labeltype(FL_NORMAL_LABEL); cntKmlRefreshInterval->labelfont(0); cntKmlRefreshInterval->labelsize(14); cntKmlRefreshInterval->labelcolor(FL_FOREGROUND_COLOR); cntKmlRefreshInterval->value(10); cntKmlRefreshInterval->callback((Fl_Callback*)cb_cntKmlRefreshInterval); cntKmlRefreshInterval->align(Fl_Align(FL_ALIGN_RIGHT)); cntKmlRefreshInterval->when(FL_WHEN_RELEASE); o->minimum(1); o->maximum(3600); o->step(1); o->value(progdefaults.kml_refresh_interval); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntKmlRefreshInterval { Fl_ListBox* o = listbox_kml_balloon_style = new Fl_ListBox(24, 263, 201, 24, _("KML balloon display style")); listbox_kml_balloon_style->tooltip(_("KML balloon in plain text, or HTML, in plain tables or matrices.")); listbox_kml_balloon_style->box(FL_DOWN_BOX); listbox_kml_balloon_style->color(FL_BACKGROUND2_COLOR); listbox_kml_balloon_style->selection_color(FL_BACKGROUND_COLOR); listbox_kml_balloon_style->labeltype(FL_NORMAL_LABEL); listbox_kml_balloon_style->labelfont(0); listbox_kml_balloon_style->labelsize(14); listbox_kml_balloon_style->labelcolor(FL_FOREGROUND_COLOR); listbox_kml_balloon_style->callback((Fl_Callback*)cb_listbox_kml_balloon_style); listbox_kml_balloon_style->align(Fl_Align(FL_ALIGN_RIGHT)); listbox_kml_balloon_style->when(FL_WHEN_CHANGED); o->add("Plain text|HTML tables|Single HTML matrix");o->index(progdefaults.kml_balloon_style); o->labelsize(FL_NORMAL_SIZE); listbox_kml_balloon_style->end(); } // Fl_ListBox* listbox_kml_balloon_style { Fl_Input* o = btnKmlCommand = new Fl_Input(24, 299, 246, 24, _("Command run on KML creation")); btnKmlCommand->tooltip(_("Command started when KML files are generated. Subprocesses are started once, \ and restarted if needed.")); btnKmlCommand->callback((Fl_Callback*)cb_btnKmlCommand); btnKmlCommand->align(Fl_Align(72)); o->value(progdefaults.kml_command.c_str()); } // Fl_Input* btnKmlCommand { btlTestKmlCommand = new Fl_Button(24, 335, 191, 24, _("Test command")); btlTestKmlCommand->tooltip(_("Execute command on KML files.")); btlTestKmlCommand->callback((Fl_Callback*)cb_btlTestKmlCommand); } // Fl_Button* btlTestKmlCommand { btnSelectKmlDestDir = new Fl_Button(425, 75, 101, 24, _("Change dir...")); btnSelectKmlDestDir->tooltip(_("Choose directory to store KML documents")); btnSelectKmlDestDir->callback((Fl_Callback*)cb_btnSelectKmlDestDir); } // Fl_Button* btnSelectKmlDestDir { btlPurge = new Fl_Button(336, 119, 190, 24, _("Cleanup KML data now !")); btlPurge->tooltip(_("Cleanups KML documents, empties Google Earth display.")); btlPurge->callback((Fl_Callback*)cb_btlPurge); } // Fl_Button* btlPurge { Fl_Check_Button* o = btnKmlPurgeOnStartup = new Fl_Check_Button(322, 231, 172, 15, _("Cleanup on startup")); btnKmlPurgeOnStartup->tooltip(_("Empties KML documents when starting program.")); btnKmlPurgeOnStartup->down_box(FL_DOWN_BOX); btnKmlPurgeOnStartup->callback((Fl_Callback*)cb_btnKmlPurgeOnStartup); o->value(progdefaults.kml_purge_on_startup); } // Fl_Check_Button* btnKmlPurgeOnStartup tabKML->end(); } // Fl_Group* tabKML tabsMisc->end(); } // Fl_Tabs* tabsMisc tabMisc->end(); } // Fl_Group* tabMisc { tabQRZ = new Fl_Group(0, 25, 600, 355, _("Web")); tabQRZ->tooltip(_("Callsign database")); tabQRZ->hide(); { tabsQRZ = new Fl_Tabs(0, 25, 600, 355); { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("Call Lookup")); { Fl_Group* o = new Fl_Group(55, 56, 490, 122, _("Web Browser lookup")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Round_Button* o = btnQRZWEBnotavailable = new Fl_Round_Button(77, 82, 337, 20, _("None")); btnQRZWEBnotavailable->tooltip(_("Do not use callsign lookup via web browser")); btnQRZWEBnotavailable->down_box(FL_DOWN_BOX); btnQRZWEBnotavailable->value(1); btnQRZWEBnotavailable->callback((Fl_Callback*)cb_btnQRZWEBnotavailable); o->value(progdefaults.QRZWEB == QRZWEBNONE); } // Fl_Round_Button* btnQRZWEBnotavailable { Fl_Round_Button* o = btnQRZonline = new Fl_Round_Button(77, 106, 337, 20, _("QRZ online via default Internet Browser")); btnQRZonline->tooltip(_("Visit QRZ web site")); btnQRZonline->down_box(FL_DOWN_BOX); btnQRZonline->callback((Fl_Callback*)cb_btnQRZonline); o->value(progdefaults.QRZWEB == QRZHTML); } // Fl_Round_Button* btnQRZonline { Fl_Round_Button* o = btnHAMCALLonline = new Fl_Round_Button(77, 130, 337, 20, _("HamCall online via default Internet Browser")); btnHAMCALLonline->tooltip(_("Visit Hamcall web site")); btnHAMCALLonline->down_box(FL_DOWN_BOX); btnHAMCALLonline->callback((Fl_Callback*)cb_btnHAMCALLonline); o->value(progdefaults.QRZWEB == HAMCALLHTML); } // Fl_Round_Button* btnHAMCALLonline { Fl_Round_Button* o = btnHamQTHonline = new Fl_Round_Button(77, 154, 337, 20, _("HamQTH via default Internet Browser")); btnHamQTHonline->tooltip(_("Visit hamQTH web site")); btnHamQTHonline->down_box(FL_DOWN_BOX); btnHamQTHonline->callback((Fl_Callback*)cb_btnHamQTHonline); o->value(progdefaults.QRZWEB == HAMQTHHTML); } // Fl_Round_Button* btnHamQTHonline o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(55, 180, 490, 190, _("Data base lookup")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Round_Button* o = btnQRZXMLnotavailable = new Fl_Round_Button(77, 203, 64, 20, _("None")); btnQRZXMLnotavailable->tooltip(_("Do not use callsign database")); btnQRZXMLnotavailable->down_box(FL_DOWN_BOX); btnQRZXMLnotavailable->value(1); btnQRZXMLnotavailable->callback((Fl_Callback*)cb_btnQRZXMLnotavailable); o->value(progdefaults.QRZXML == QRZXMLNONE); } // Fl_Round_Button* btnQRZXMLnotavailable { Fl_Round_Button* o = btnQRZcdrom = new Fl_Round_Button(77, 231, 70, 20, _("QRZ cdrom")); btnQRZcdrom->tooltip(_("Use CD or hard drive CD image")); btnQRZcdrom->down_box(FL_DOWN_BOX); btnQRZcdrom->callback((Fl_Callback*)cb_btnQRZcdrom); o->value(progdefaults.QRZXML == QRZCD); } // Fl_Round_Button* btnQRZcdrom { Fl_Round_Button* o = btnQRZsub = new Fl_Round_Button(77, 259, 125, 20, _("QRZ.com")); btnQRZsub->tooltip(_("You need a paid QRZ online\nsubscription to access")); btnQRZsub->down_box(FL_DOWN_BOX); btnQRZsub->callback((Fl_Callback*)cb_btnQRZsub); o->value(progdefaults.QRZXML == QRZNET); } // Fl_Round_Button* btnQRZsub { Fl_Round_Button* o = btnHamcall = new Fl_Round_Button(77, 285, 125, 20, _("Hamcall.net")); btnHamcall->tooltip(_("You need a paid Hamcall online\nsubscription to access")); btnHamcall->down_box(FL_DOWN_BOX); btnHamcall->callback((Fl_Callback*)cb_btnHamcall); o->value(progdefaults.QRZXML == HAMCALLNET); } // Fl_Round_Button* btnHamcall { Fl_Round_Button* o = btnHamQTH = new Fl_Round_Button(77, 311, 125, 20, _("HamQTH.com (free service http://www.hamqth.com)")); btnHamQTH->tooltip(_("Free service courtesy of OK")); btnHamQTH->down_box(FL_DOWN_BOX); btnHamQTH->callback((Fl_Callback*)cb_btnHamQTH); o->value(progdefaults.QRZXML == HAMQTH); } // Fl_Round_Button* btnHamQTH { Fl_Round_Button* o = btnCALLOOK = new Fl_Round_Button(77, 338, 125, 20, _("Callook.info lookup (free service US callsigns only)")); btnCALLOOK->tooltip(_("Visit Hamcall web site")); btnCALLOOK->down_box(FL_DOWN_BOX); btnCALLOOK->callback((Fl_Callback*)cb_btnCALLOOK); o->value(progdefaults.QRZXML == CALLOOK); } // Fl_Round_Button* btnCALLOOK { Fl_Input2* o = txtQRZpathname = new Fl_Input2(202, 230, 300, 22, _("at:")); txtQRZpathname->tooltip(_("ie: /home/dave/CALLBK/ or C:/CALLBK/\nLeave blank to search for database")); txtQRZpathname->box(FL_DOWN_BOX); txtQRZpathname->color(FL_BACKGROUND2_COLOR); txtQRZpathname->selection_color(FL_SELECTION_COLOR); txtQRZpathname->labeltype(FL_NORMAL_LABEL); txtQRZpathname->labelfont(0); txtQRZpathname->labelsize(14); txtQRZpathname->labelcolor(FL_FOREGROUND_COLOR); txtQRZpathname->callback((Fl_Callback*)cb_txtQRZpathname); txtQRZpathname->align(Fl_Align(FL_ALIGN_LEFT)); txtQRZpathname->when(FL_WHEN_RELEASE); o->value(progdefaults.QRZpathname.c_str()); txtQRZpathname->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* txtQRZpathname { Fl_Input2* o = inpQRZusername = new Fl_Input2(285, 258, 150, 22, _("User name")); inpQRZusername->tooltip(_("Your login name")); inpQRZusername->box(FL_DOWN_BOX); inpQRZusername->color(FL_BACKGROUND2_COLOR); inpQRZusername->selection_color(FL_SELECTION_COLOR); inpQRZusername->labeltype(FL_NORMAL_LABEL); inpQRZusername->labelfont(0); inpQRZusername->labelsize(14); inpQRZusername->labelcolor(FL_FOREGROUND_COLOR); inpQRZusername->callback((Fl_Callback*)cb_inpQRZusername); inpQRZusername->align(Fl_Align(FL_ALIGN_LEFT)); inpQRZusername->when(FL_WHEN_RELEASE); o->value(progdefaults.QRZusername.c_str()); inpQRZusername->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpQRZusername { Fl_Input2* o = inpQRZuserpassword = new Fl_Input2(285, 284, 150, 22, _("Password")); inpQRZuserpassword->tooltip(_("Your login password")); inpQRZuserpassword->box(FL_DOWN_BOX); inpQRZuserpassword->color(FL_BACKGROUND2_COLOR); inpQRZuserpassword->selection_color(FL_SELECTION_COLOR); inpQRZuserpassword->labeltype(FL_NORMAL_LABEL); inpQRZuserpassword->labelfont(0); inpQRZuserpassword->labelsize(14); inpQRZuserpassword->labelcolor(FL_FOREGROUND_COLOR); inpQRZuserpassword->callback((Fl_Callback*)cb_inpQRZuserpassword); inpQRZuserpassword->align(Fl_Align(FL_ALIGN_LEFT)); inpQRZuserpassword->when(FL_WHEN_RELEASE); o->value(progdefaults.QRZuserpassword.c_str()); o->type(FL_SECRET_INPUT); inpQRZuserpassword->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpQRZuserpassword { btnQRZpasswordShow = new Fl_Button(445, 285, 70, 20, _("Show")); btnQRZpasswordShow->tooltip(_("Show password in plain text")); btnQRZpasswordShow->callback((Fl_Callback*)cb_btnQRZpasswordShow); } // Fl_Button* btnQRZpasswordShow { Fl_Check_Button* o = btn_notes_address = new Fl_Check_Button(202, 205, 207, 15, _("Add address to notes field")); btn_notes_address->down_box(FL_DOWN_BOX); btn_notes_address->callback((Fl_Callback*)cb_btn_notes_address); o->value(progdefaults.notes_address); } // Fl_Check_Button* btn_notes_address o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("eQSL")); o->hide(); { Fl_Input2* o = inpEQSL_id = new Fl_Input2(225, 58, 150, 20, _("User ID")); inpEQSL_id->tooltip(_("Your login name")); inpEQSL_id->box(FL_DOWN_BOX); inpEQSL_id->color(FL_BACKGROUND2_COLOR); inpEQSL_id->selection_color(FL_SELECTION_COLOR); inpEQSL_id->labeltype(FL_NORMAL_LABEL); inpEQSL_id->labelfont(0); inpEQSL_id->labelsize(14); inpEQSL_id->labelcolor(FL_FOREGROUND_COLOR); inpEQSL_id->callback((Fl_Callback*)cb_inpEQSL_id); inpEQSL_id->align(Fl_Align(FL_ALIGN_LEFT)); inpEQSL_id->when(FL_WHEN_RELEASE); o->value(progdefaults.eqsl_id.c_str()); inpEQSL_id->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpEQSL_id { Fl_Input2* o = inpEQSL_pwd = new Fl_Input2(225, 85, 150, 20, _("Password")); inpEQSL_pwd->tooltip(_("Your login password")); inpEQSL_pwd->box(FL_DOWN_BOX); inpEQSL_pwd->color(FL_BACKGROUND2_COLOR); inpEQSL_pwd->selection_color(FL_SELECTION_COLOR); inpEQSL_pwd->labeltype(FL_NORMAL_LABEL); inpEQSL_pwd->labelfont(0); inpEQSL_pwd->labelsize(14); inpEQSL_pwd->labelcolor(FL_FOREGROUND_COLOR); inpEQSL_pwd->callback((Fl_Callback*)cb_inpEQSL_pwd); inpEQSL_pwd->align(Fl_Align(FL_ALIGN_LEFT)); inpEQSL_pwd->when(FL_WHEN_RELEASE); o->value(progdefaults.eqsl_pwd.c_str()); o->type(FL_SECRET_INPUT); inpEQSL_pwd->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpEQSL_pwd { btnEQSL_pwd_show = new Fl_Button(395, 85, 70, 20, _("Show")); btnEQSL_pwd_show->tooltip(_("Show password in plain text")); btnEQSL_pwd_show->callback((Fl_Callback*)cb_btnEQSL_pwd_show); } // Fl_Button* btnEQSL_pwd_show { Fl_Input2* o = inpEQSL_nick = new Fl_Input2(225, 114, 150, 20, _("QTH Nickname")); inpEQSL_nick->tooltip(_("Your login name")); inpEQSL_nick->box(FL_DOWN_BOX); inpEQSL_nick->color(FL_BACKGROUND2_COLOR); inpEQSL_nick->selection_color(FL_SELECTION_COLOR); inpEQSL_nick->labeltype(FL_NORMAL_LABEL); inpEQSL_nick->labelfont(0); inpEQSL_nick->labelsize(14); inpEQSL_nick->labelcolor(FL_FOREGROUND_COLOR); inpEQSL_nick->callback((Fl_Callback*)cb_inpEQSL_nick); inpEQSL_nick->align(Fl_Align(FL_ALIGN_LEFT)); inpEQSL_nick->when(FL_WHEN_RELEASE); o->value(progdefaults.eqsl_nick.c_str()); inpEQSL_nick->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpEQSL_nick { Fl_Group* o = new Fl_Group(30, 141, 516, 223, _("Options")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_send_when_logged = new Fl_Check_Button(79, 166, 70, 15, _("send when logged (log button, , )")); btn_send_when_logged->tooltip(_("automatic data upload")); btn_send_when_logged->down_box(FL_DOWN_BOX); btn_send_when_logged->callback((Fl_Callback*)cb_btn_send_when_logged); o->value(progdefaults.eqsl_when_logged); } // Fl_Check_Button* btn_send_when_logged { Fl_Input2* o = txt_eqsl_default_message = new Fl_Input2(83, 226, 451, 40, _("Default message")); txt_eqsl_default_message->tooltip(_("default text to send with etc")); txt_eqsl_default_message->type(4); txt_eqsl_default_message->box(FL_DOWN_BOX); txt_eqsl_default_message->color(FL_BACKGROUND2_COLOR); txt_eqsl_default_message->selection_color(FL_SELECTION_COLOR); txt_eqsl_default_message->labeltype(FL_NORMAL_LABEL); txt_eqsl_default_message->labelfont(0); txt_eqsl_default_message->labelsize(14); txt_eqsl_default_message->labelcolor(FL_FOREGROUND_COLOR); txt_eqsl_default_message->callback((Fl_Callback*)cb_txt_eqsl_default_message); txt_eqsl_default_message->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txt_eqsl_default_message->when(FL_WHEN_CHANGED); o->value(progdefaults.eqsl_default_message.c_str()); } // Fl_Input2* txt_eqsl_default_message { Fl_Group* o = new Fl_Group(33, 270, 510, 90, _("Text Tags (tags use {} delimiters)")); o->box(FL_FLAT_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { eqsl_txt1 = new Fl_Box(32, 317, 220, 17, _(" {CALL} other ops call sign")); eqsl_txt1->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* eqsl_txt1 { eqsl_txt2 = new Fl_Box(30, 336, 220, 17, _(" {MODE} full mode / submode")); eqsl_txt2->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* eqsl_txt2 { eqsl_txt3 = new Fl_Box(278, 317, 220, 17, _("{NAME} other ops name")); eqsl_txt3->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* eqsl_txt3 { new Fl_Box(68, 293, 440, 17, _("These tags can also be used in ")); } // Fl_Box* o o->end(); } // Fl_Group* o { Fl_Check_Button* o = btn_send_datetime_off = new Fl_Check_Button(80, 188, 70, 15, _("Use date/time off for log entry")); btn_send_datetime_off->tooltip(_("default uses date/time on")); btn_send_datetime_off->down_box(FL_DOWN_BOX); btn_send_datetime_off->callback((Fl_Callback*)cb_btn_send_datetime_off); o->value(progdefaults.eqsl_datetime_off); } // Fl_Check_Button* btn_send_datetime_off o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o tabsQRZ->end(); } // Fl_Tabs* tabsQRZ tabQRZ->end(); } // Fl_Group* tabQRZ { tabAutoStart = new Fl_Group(0, 25, 600, 355, _("Autostart")); tabAutoStart->tooltip(_("Operator information")); tabAutoStart->callback((Fl_Callback*)cb_tabAutoStart); tabAutoStart->when(FL_WHEN_CHANGED); tabAutoStart->hide(); { Fl_Group* o = new Fl_Group(2, 32, 596, 330, _("Auto start programs with fldigi")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Input2* o = txt_auto_flrig_pathname = new Fl_Input2(63, 71, 310, 24, _("flrig:")); txt_auto_flrig_pathname->tooltip(_("Enter full path-filename for external program\nOr simple name of program")); txt_auto_flrig_pathname->box(FL_DOWN_BOX); txt_auto_flrig_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_flrig_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_flrig_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_flrig_pathname->labelfont(0); txt_auto_flrig_pathname->labelsize(14); txt_auto_flrig_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_flrig_pathname->callback((Fl_Callback*)cb_txt_auto_flrig_pathname); txt_auto_flrig_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_flrig_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_flrig_pathname.c_str()); } // Fl_Input2* txt_auto_flrig_pathname { btn_select_flrig = new Fl_Button(395, 71, 70, 24, _("Locate")); btn_select_flrig->tooltip(_("Locate flrig executable")); btn_select_flrig->callback((Fl_Callback*)cb_btn_select_flrig); } // Fl_Button* btn_select_flrig { Fl_Input2* o = txt_auto_flamp_pathname = new Fl_Input2(63, 109, 310, 24, _("flamp:")); txt_auto_flamp_pathname->tooltip(_("Enter full path-filename for external program\nOr simple name of program")); txt_auto_flamp_pathname->box(FL_DOWN_BOX); txt_auto_flamp_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_flamp_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_flamp_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_flamp_pathname->labelfont(0); txt_auto_flamp_pathname->labelsize(14); txt_auto_flamp_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_flamp_pathname->callback((Fl_Callback*)cb_txt_auto_flamp_pathname); txt_auto_flamp_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_flamp_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_flamp_pathname.c_str()); } // Fl_Input2* txt_auto_flamp_pathname { btn_select_auto_flamp = new Fl_Button(395, 109, 70, 24, _("Locate")); btn_select_auto_flamp->tooltip(_("Locate flamp executable")); btn_select_auto_flamp->callback((Fl_Callback*)cb_btn_select_auto_flamp); } // Fl_Button* btn_select_auto_flamp { Fl_Input2* o = txt_auto_flnet_pathname = new Fl_Input2(63, 147, 310, 24, _("flnet:")); txt_auto_flnet_pathname->tooltip(_("Enter full path-filename for external program\nOr simple name of program")); txt_auto_flnet_pathname->box(FL_DOWN_BOX); txt_auto_flnet_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_flnet_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_flnet_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_flnet_pathname->labelfont(0); txt_auto_flnet_pathname->labelsize(14); txt_auto_flnet_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_flnet_pathname->callback((Fl_Callback*)cb_txt_auto_flnet_pathname); txt_auto_flnet_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_flnet_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_flnet_pathname.c_str()); } // Fl_Input2* txt_auto_flnet_pathname { btn_select_auto_flnet = new Fl_Button(395, 147, 70, 24, _("Locate")); btn_select_auto_flnet->tooltip(_("Locate flnet executable")); btn_select_auto_flnet->callback((Fl_Callback*)cb_btn_select_auto_flnet); } // Fl_Button* btn_select_auto_flnet { Fl_Input2* o = txt_auto_fllog_pathname = new Fl_Input2(63, 186, 310, 24, _("fllog:")); txt_auto_fllog_pathname->tooltip(_("Enter full path-filename for external program\nOr simple name of program")); txt_auto_fllog_pathname->box(FL_DOWN_BOX); txt_auto_fllog_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_fllog_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_fllog_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_fllog_pathname->labelfont(0); txt_auto_fllog_pathname->labelsize(14); txt_auto_fllog_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_fllog_pathname->callback((Fl_Callback*)cb_txt_auto_fllog_pathname); txt_auto_fllog_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_fllog_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_fllog_pathname.c_str()); } // Fl_Input2* txt_auto_fllog_pathname { btn_select_fllog = new Fl_Button(395, 186, 70, 24, _("Locate")); btn_select_fllog->tooltip(_("Locate fllog executable")); btn_select_fllog->callback((Fl_Callback*)cb_btn_select_fllog); } // Fl_Button* btn_select_fllog { Fl_Input2* o = txt_auto_prog1_pathname = new Fl_Input2(63, 224, 310, 24, _("Prog 1:")); txt_auto_prog1_pathname->tooltip(_("Enter full path-filename for external program\nOr simple name of program")); txt_auto_prog1_pathname->box(FL_DOWN_BOX); txt_auto_prog1_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_prog1_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_prog1_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_prog1_pathname->labelfont(0); txt_auto_prog1_pathname->labelsize(14); txt_auto_prog1_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_prog1_pathname->callback((Fl_Callback*)cb_txt_auto_prog1_pathname); txt_auto_prog1_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_prog1_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_prog1_pathname.c_str()); } // Fl_Input2* txt_auto_prog1_pathname { btn_select_prog1 = new Fl_Button(395, 224, 70, 24, _("Locate")); btn_select_prog1->tooltip(_("Locate program #1 executable")); btn_select_prog1->callback((Fl_Callback*)cb_btn_select_prog1); } // Fl_Button* btn_select_prog1 { Fl_Input2* o = txt_auto_prog2_pathname = new Fl_Input2(63, 262, 310, 24, _("Prog 2:")); txt_auto_prog2_pathname->tooltip(_("Enter full path-filename for external program\nOr simple name of program")); txt_auto_prog2_pathname->box(FL_DOWN_BOX); txt_auto_prog2_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_prog2_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_prog2_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_prog2_pathname->labelfont(0); txt_auto_prog2_pathname->labelsize(14); txt_auto_prog2_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_prog2_pathname->callback((Fl_Callback*)cb_txt_auto_prog2_pathname); txt_auto_prog2_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_prog2_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_prog2_pathname.c_str()); } // Fl_Input2* txt_auto_prog2_pathname { btn_select_prog2 = new Fl_Button(395, 262, 70, 24, _("Locate")); btn_select_prog2->tooltip(_("Locate program #2 executable")); btn_select_prog2->callback((Fl_Callback*)cb_btn_select_prog2); } // Fl_Button* btn_select_prog2 { Fl_Input2* o = txt_auto_prog3_pathname = new Fl_Input2(63, 301, 310, 24, _("Prog 3:")); txt_auto_prog3_pathname->tooltip(_("Enter full path-filename for external program\nOr simple name of program")); txt_auto_prog3_pathname->box(FL_DOWN_BOX); txt_auto_prog3_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_prog3_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_prog3_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_prog3_pathname->labelfont(0); txt_auto_prog3_pathname->labelsize(14); txt_auto_prog3_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_prog3_pathname->callback((Fl_Callback*)cb_txt_auto_prog3_pathname); txt_auto_prog3_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_prog3_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_prog3_pathname.c_str()); } // Fl_Input2* txt_auto_prog3_pathname { btn_select_prog3 = new Fl_Button(395, 301, 70, 24, _("Locate")); btn_select_prog3->tooltip(_("Locate program #3 executable")); btn_select_prog3->callback((Fl_Callback*)cb_btn_select_prog3); } // Fl_Button* btn_select_prog3 { Fl_Check_Button* o = btn_flrig_auto_enable = new Fl_Check_Button(475, 75, 19, 15, _("Enable\n-")); btn_flrig_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_flrig_auto_enable->down_box(FL_DOWN_BOX); btn_flrig_auto_enable->callback((Fl_Callback*)cb_btn_flrig_auto_enable); btn_flrig_auto_enable->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.flrig_auto_enable); } // Fl_Check_Button* btn_flrig_auto_enable { Fl_Check_Button* o = btn_flamp_auto_enable = new Fl_Check_Button(475, 113, 23, 15); btn_flamp_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_flamp_auto_enable->down_box(FL_DOWN_BOX); btn_flamp_auto_enable->callback((Fl_Callback*)cb_btn_flamp_auto_enable); o->value(progdefaults.flamp_auto_enable); } // Fl_Check_Button* btn_flamp_auto_enable { Fl_Check_Button* o = btn_flnet_auto_enable = new Fl_Check_Button(475, 151, 23, 15); btn_flnet_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_flnet_auto_enable->down_box(FL_DOWN_BOX); btn_flnet_auto_enable->callback((Fl_Callback*)cb_btn_flnet_auto_enable); o->value(progdefaults.flnet_auto_enable); } // Fl_Check_Button* btn_flnet_auto_enable { Fl_Check_Button* o = btn_fllog_auto_enable = new Fl_Check_Button(475, 190, 23, 15); btn_fllog_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_fllog_auto_enable->down_box(FL_DOWN_BOX); btn_fllog_auto_enable->callback((Fl_Callback*)cb_btn_fllog_auto_enable); o->value(progdefaults.fllog_auto_enable); } // Fl_Check_Button* btn_fllog_auto_enable { Fl_Check_Button* o = btn_prog1_auto_enable = new Fl_Check_Button(475, 228, 23, 15); btn_prog1_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_prog1_auto_enable->down_box(FL_DOWN_BOX); btn_prog1_auto_enable->callback((Fl_Callback*)cb_btn_prog1_auto_enable); o->value(progdefaults.prog1_auto_enable); } // Fl_Check_Button* btn_prog1_auto_enable { Fl_Check_Button* o = btn_prog2_auto_enable = new Fl_Check_Button(475, 266, 23, 15); btn_prog2_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_prog2_auto_enable->down_box(FL_DOWN_BOX); btn_prog2_auto_enable->callback((Fl_Callback*)cb_btn_prog2_auto_enable); o->value(progdefaults.prog2_auto_enable); } // Fl_Check_Button* btn_prog2_auto_enable { Fl_Check_Button* o = btn_prog3_auto_enable = new Fl_Check_Button(475, 305, 23, 15); btn_prog3_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_prog3_auto_enable->down_box(FL_DOWN_BOX); btn_prog3_auto_enable->callback((Fl_Callback*)cb_btn_prog3_auto_enable); o->value(progdefaults.prog3_auto_enable); } // Fl_Check_Button* btn_prog3_auto_enable { btn_test_flrig = new Fl_Button(505, 71, 70, 24, _("Test")); btn_test_flrig->tooltip(_("Start flrig")); btn_test_flrig->callback((Fl_Callback*)cb_btn_test_flrig); } // Fl_Button* btn_test_flrig { btn_test_flamp = new Fl_Button(505, 109, 70, 24, _("Test")); btn_test_flamp->tooltip(_("Start flamp")); btn_test_flamp->callback((Fl_Callback*)cb_btn_test_flamp); } // Fl_Button* btn_test_flamp { btn_test_flnet = new Fl_Button(505, 147, 70, 24, _("Test")); btn_test_flnet->tooltip(_("Start flnet")); btn_test_flnet->callback((Fl_Callback*)cb_btn_test_flnet); } // Fl_Button* btn_test_flnet { btn_test_fllog = new Fl_Button(505, 186, 70, 24, _("Test")); btn_test_fllog->tooltip(_("Start fllog")); btn_test_fllog->callback((Fl_Callback*)cb_btn_test_fllog); } // Fl_Button* btn_test_fllog { btn_test_prog1 = new Fl_Button(505, 224, 70, 24, _("Test")); btn_test_prog1->tooltip(_("Start prog1")); btn_test_prog1->callback((Fl_Callback*)cb_btn_test_prog1); } // Fl_Button* btn_test_prog1 { btn_test_prog2 = new Fl_Button(505, 262, 70, 24, _("Test")); btn_test_prog2->tooltip(_("Start prog2")); btn_test_prog2->callback((Fl_Callback*)cb_btn_test_prog2); } // Fl_Button* btn_test_prog2 { btn_test_prog3 = new Fl_Button(505, 301, 70, 24, _("Test")); btn_test_prog3->tooltip(_("Start prog3")); btn_test_prog3->callback((Fl_Callback*)cb_btn_test_prog3); } // Fl_Button* btn_test_prog3 o->end(); } // Fl_Group* o tabAutoStart->end(); } // Fl_Group* tabAutoStart tabsConfigure->end(); } // Fl_Tabs* tabsConfigure { btnSaveConfig = new Fl_Button(330, 388, 130, 22, _("Save")); btnSaveConfig->callback((Fl_Callback*)cb_btnSaveConfig); } // Fl_Button* btnSaveConfig { btnCloseConfig = new Fl_Return_Button(462, 388, 130, 22, _("Close")); btnCloseConfig->callback((Fl_Callback*)cb_btnCloseConfig); } // Fl_Return_Button* btnCloseConfig { btnResetConfig = new Fl_Button(20, 388, 130, 22, _("Restore defaults")); btnResetConfig->callback((Fl_Callback*)cb_btnResetConfig); } // Fl_Button* btnResetConfig o->set_non_modal(); o->end(); } // Fl_Double_Window* o return w; } void openConfig() { if (!dlgConfig) createConfig(); progdefaults.loadDefaults(); } void closeDialog() { if (dlgConfig) dlgConfig->hide(); } void createConfig() { if (!dlgConfig) { dlgConfig = ConfigureDialog(); dlgConfig->xclass(PACKAGE_NAME); } } void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata) { /* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnWefaxSaveDir->value( w->value() ); btnWefaxSaveDir->redraw(); cb_btnWefaxSaveDir( btnWefaxSaveDir, NULL ); } } void KmlDestDirSet(Fl_File_Chooser *w, void *userdata) { /* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnKmlSaveDir->value( w->value() ); btnKmlSaveDir->redraw(); cb_btnKmlSaveDir( btnKmlSaveDir, NULL ); } } fldigi-3.21.80/src/dialogs/fl_digi.cxx0000664000175000017500000064274312313147652014424 00000000000000// ---------------------------------------------------------------------------- // // fl_digi.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #ifdef __WOE32__ # ifdef __CYGWIN__ # include # else # include # endif #endif #include #include #include #include #include #include #ifndef __WOE32__ #include #endif #include "gettext.h" #include "fl_digi.h" #include #include #include #include //#include #include #include #include #include #include #include #include #include #include "waterfall.h" #include "raster.h" #include "progress.h" #include "Panel.h" #include "main.h" #include "threads.h" #include "trx.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "timeops.h" #include "rigio.h" #include "nullmodem.h" #include "psk.h" #include "cw.h" #include "mfsk.h" #include "wefax.h" #include "wefax-pic.h" #include "navtex.h" #include "mt63.h" #include "view_rtty.h" #include "olivia.h" #include "contestia.h" #include "thor.h" #include "dominoex.h" #include "feld.h" #include "throb.h" #include "wwv.h" #include "analysis.h" #include "ssb.h" #include "ascii.h" #include "globals.h" #include "misc.h" #include "FTextRXTX.h" //#include "Fl_Tile_Check.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "macros.h" #include "macroedit.h" #include "logger.h" #include "lookupcall.h" #include "font_browser.h" #include "icons.h" #include "rigsupport.h" #include "qrunner.h" #include "Viewer.h" #include "soundconf.h" #include "htmlstrings.h" # include "xmlrpc.h" #if BENCHMARK_MODE # include "benchmark.h" #endif #include "debug.h" #include "re.h" #include "network.h" #include "spot.h" #include "dxcc.h" #include "locator.h" #include "notify.h" #include "logbook.h" #include "rx_extract.h" #include "speak.h" #include "flmisc.h" #include "arq_io.h" #include "kmlserver.h" #include "notifydialog.h" #include "macroedit.h" #include "rx_extract.h" #include "wefax-pic.h" #include "charsetdistiller.h" #include "charsetlist.h" #include "outputencoder.h" #include "record_loader.h" #include "record_browse.h" #define LOG_TO_FILE_MLABEL _("Log all RX/TX text") #define RIGCONTROL_MLABEL _("Rig control") #define OPMODES_MLABEL _("Op &Mode") #define OPMODES_FEWER _("Show fewer modes") #define OPMODES_ALL _("Show all modes") #define OLIVIA_MLABEL "Olivia" #define CONTESTIA_MLABEL "Contestia" #define RTTY_MLABEL "RTTY" #define VIEW_MLABEL _("&View") #define MFSK_IMAGE_MLABEL _("&MFSK Image") #define WEFAX_RX_IMAGE_MLABEL _("&Weather Fax Image RX") #define WEFAX_TX_IMAGE_MLABEL _("&Weather Fax Image TX") #define CONTEST_MLABEL _("Contest") #define CONTEST_FIELDS_MLABEL _("&Contest fields") #define COUNTRIES_MLABEL _("C&ountries") #define UI_MLABEL _("&UI") #define RIGLOG_FULL_MLABEL _("Full") #define RIGLOG_NONE_MLABEL _("None") #define RIGLOG_MLABEL _("Rig control and logging") #define RIGCONTEST_MLABEL _("Rig control and contest") #define DOCKEDSCOPE_MLABEL _("Docked scope") #define WF_MLABEL _("Minimal controls") #define SHOW_CHANNELS _("Show channels") #define LOG_CONNECT_SERVER _("Connect to server") using namespace std; //regular expression parser using by mainViewer (pskbrowser) fre_t seek_re("CQ", REG_EXTENDED | REG_ICASE | REG_NOSUB); bool bWF_only = false; bool withnoise = false; Fl_Double_Window *fl_digi_main = (Fl_Double_Window *)0; Fl_Help_Dialog *help_dialog = (Fl_Help_Dialog *)0; Fl_Double_Window *scopeview = (Fl_Double_Window *)0; MixerBase* mixer = 0; static Fl_Group *mnuFrame; Fl_Menu_Bar *mnu; Fl_Light_Button *btnAutoSpot = (Fl_Light_Button *)0; Fl_Light_Button *btnTune = (Fl_Light_Button *)0; Fl_Light_Button *btnRSID = (Fl_Light_Button *)0; Fl_Light_Button *btnTxRSID = (Fl_Light_Button *)0; static Fl_Button *btnMacroTimer = (Fl_Button *)0; Panel *text_panel = 0; Fl_Group *mvgroup = 0; Fl_Group *macroFrame1 = 0; Fl_Group *macroFrame2 = 0; FTextRX *ReceiveText = 0; FTextTX *TransmitText = 0; static Raster *FHdisp; Fl_Box *minbox; int oix; pskBrowser *mainViewer = (pskBrowser *)0; Fl_Input2 *txtInpSeek = (Fl_Input2 *)0; static Fl_Box *StatusBar = (Fl_Box *)0; Fl_Box *Status2 = (Fl_Box *)0; Fl_Box *Status1 = (Fl_Box *)0; Fl_Counter2 *cntTxLevel = (Fl_Counter2 *)0; Fl_Counter2 *cntCW_WPM=(Fl_Counter2 *)0; static Fl_Button *btnCW_Default=(Fl_Button *)0; static Fl_Box *WARNstatus = (Fl_Box *)0; Fl_Button *MODEstatus = (Fl_Button *)0; Fl_Button *btnMacro[NUMMACKEYS * NUMKEYROWS]; Fl_Button *btnAltMacros1 = (Fl_Button *)0; Fl_Button *btnAltMacros2 = (Fl_Button *)0; Fl_Button *btnAFC; Fl_Button *btnSQL; Fl_Input2 *inpQth; Fl_Input2 *inpLoc; Fl_Input2 *inpState; Fl_Input2 *inpCountry; Fl_Input2 *inpSerNo; Fl_Input2 *outSerNo; Fl_Input2 *inpXchgIn; Fl_Input2 *inpVEprov; Fl_Input2 *inpNotes; Fl_Input2 *inpAZ; // WA5ZNU Fl_Button *qsoTime; Fl_Button *btnQRZ; static Fl_Button *qsoClear; Fl_Button *qsoSave; Fl_Box *txtRigName = (Fl_Box *)0; cFreqControl *qsoFreqDisp = (cFreqControl *)0; Fl_ComboBox *qso_opMODE = (Fl_ComboBox *)0; Fl_ComboBox *qso_opBW = (Fl_ComboBox *)0; Fl_Button *qso_opPICK = (Fl_Button *)0; Fl_Input2 *inpFreq; Fl_Input2 *inpTimeOff; Fl_Input2 *inpTimeOn; Fl_Button *btnTimeOn; Fl_Input2 *inpCall; Fl_Input2 *inpName; Fl_Input2 *inpRstIn; Fl_Input2 *inpRstOut; static Fl_Group *TopFrame1 = (Fl_Group *)0; static Fl_Input2 *inpFreq1; static Fl_Input2 *inpTimeOff1; static Fl_Input2 *inpTimeOn1; static Fl_Button *btnTimeOn1; Fl_Input2 *inpCall1; Fl_Input2 *inpName1; static Fl_Input2 *inpRstIn1; static Fl_Input2 *inpRstOut1; static Fl_Input2 *inpXchgIn1; static Fl_Input2 *outSerNo1; static Fl_Input2 *inpSerNo1; cFreqControl *qsoFreqDisp1 = (cFreqControl *)0; Fl_Group *RigControlFrame = (Fl_Group *)0; Fl_Group *RigViewerFrame = (Fl_Group *)0; Fl_Group *QsoInfoFrame = (Fl_Group *)0; static Fl_Group *QsoInfoFrame1 = (Fl_Group *)0; static Fl_Group *QsoInfoFrame1A = (Fl_Group *)0; Fl_Group *QsoInfoFrame1B = (Fl_Group *)0; static Fl_Group *QsoInfoFrame2 = (Fl_Group *)0; static Fl_Group *QsoButtonFrame = (Fl_Group *)0; Fl_Group *TopFrame2 = (Fl_Group *)0; cFreqControl *qsoFreqDisp2 = (cFreqControl *)0; static Fl_Input2 *inpTimeOff2; static Fl_Input2 *inpTimeOn2; static Fl_Button *btnTimeOn2; Fl_Input2 *inpCall2; static Fl_Input2 *inpName2; static Fl_Input2 *inpRstIn2; static Fl_Input2 *inpRstOut2; Fl_Button *qso_opPICK2; static Fl_Button *qsoClear2; static Fl_Button *qsoSave2; Fl_Button *btnQRZ2; static Fl_Group *TopFrame3 = (Fl_Group *)0; cFreqControl *qsoFreqDisp3 = (cFreqControl *)0; static Fl_Input2 *inpTimeOff3; static Fl_Input2 *inpTimeOn3; static Fl_Button *btnTimeOn3; Fl_Input2 *inpCall3; static Fl_Input2 *outSerNo2; static Fl_Input2 *inpSerNo2; static Fl_Input2 *inpXchgIn2; static Fl_Button *qso_opPICK3; static Fl_Button *qsoClear3; static Fl_Button *qsoSave3; Fl_Input2 *inpCall4; Fl_Browser *qso_opBrowser = (Fl_Browser *)0; static Fl_Button *qso_btnAddFreq = (Fl_Button *)0; static Fl_Button *qso_btnSelFreq = (Fl_Button *)0; static Fl_Button *qso_btnDelFreq = (Fl_Button *)0; static Fl_Button *qso_btnClearList = (Fl_Button *)0; static Fl_Button *qso_btnAct = 0; static Fl_Input2 *qso_inpAct = 0; static Fl_Group *MixerFrame; Fl_Value_Slider2 *valRcvMixer = (Fl_Value_Slider2 *)0; Fl_Value_Slider2 *valXmtMixer = (Fl_Value_Slider2 *)0; static Fl_Pack *wfpack = (Fl_Pack *)0; static Fl_Pack *hpack = (Fl_Pack *)0; Fl_Value_Slider2 *mvsquelch = (Fl_Value_Slider2 *)0; static Fl_Button *btnClearMViewer = 0; static const int pad = 1; static const int Hentry = 24; static const int Wbtn = Hentry; static int x_qsoframe = Wbtn; int Hmenu = 22; static const int Hqsoframe = pad + 3 * (Hentry + pad); int Hstatus = 22; int Hmacros = 22; static const int w_inpFreq = 80; static const int w_inpTime = 40; static const int w_inpCall = 120; static const int w_inpName = 90; static const int w_inpRstIn = 30; static const int w_inpRstOut = 30; static const int w_SerNo = 40; static const int sw = 22; static const int wlabel = 30; static const int wf1 = 436; static const int w_inpTime2 = 40; static const int w_inpCall2 = 100; static const int w_inpName2 = 80; static const int w_inpRstIn2 = 30; static const int w_inpRstOut2 = 30; static const int w_fm1 = 25; static const int w_fm2 = 15; static const int w_fm3 = 15; static const int w_fm4 = 25; static const int w_fm5 = 25; static const int w_fm6 = 30; static const int w_fm7 = 35; static const int w_inpState = 25; static const int w_inpProv = 25; static const int w_inpCountry = 60; static const int w_inpLOC = 55; static const int w_inpAZ = 30; static const int qh = Hqsoframe / 2; int IMAGE_WIDTH; int Hwfall; int HNOM = DEFAULT_HNOM; // WNOM must be large enough to contain ALL of the horizontal widgets // when the main dialog is initially created. int WNOM = 650;//progStatus.mainW ? progStatus.mainW : WMIN; int Wwfall; int altMacros = 0; waterfall *wf = (waterfall *)0; Digiscope *digiscope = (Digiscope *)0; Fl_Slider2 *sldrSquelch = (Fl_Slider2 *)0; Progress *pgrsSquelch = (Progress *)0; static Fl_Pixmap *addrbookpixmap = 0; #if !defined(__APPLE__) && !defined(__WOE32__) && USE_X Pixmap fldigi_icon_pixmap; #endif // for character set conversion int rxtx_charset; static CharsetDistiller rx_chd; static CharsetDistiller echo_chd; static OutputEncoder tx_encoder; Fl_Menu_Item *getMenuItem(const char *caption, Fl_Menu_Item* submenu = 0); void UI_select(); bool clean_exit(bool ask); void cb_init_mode(Fl_Widget *, void *arg); void cb_oliviaCustom(Fl_Widget *w, void *arg); void cb_contestiaA(Fl_Widget *w, void *arg); void cb_contestiaB(Fl_Widget *w, void *arg); void cb_contestiaC(Fl_Widget *w, void *arg); void cb_contestiaD(Fl_Widget *w, void *arg); void cb_contestiaE(Fl_Widget *w, void *arg); void cb_contestiaF(Fl_Widget *w, void *arg); void cb_contestiaG(Fl_Widget *w, void *arg); void cb_contestiaH(Fl_Widget *w, void *arg); void cb_contestiaI(Fl_Widget *w, void *arg); void cb_contestiaJ(Fl_Widget *w, void *arg); void cb_contestiaCustom(Fl_Widget *w, void *arg); void cb_rtty45(Fl_Widget *w, void *arg); void cb_rtty50(Fl_Widget *w, void *arg); void cb_rtty75N(Fl_Widget *w, void *arg); void cb_rtty75W(Fl_Widget *w, void *arg); void cb_rttyCustom(Fl_Widget *w, void *arg); static Fl_Widget *modem_config_tab; static const Fl_Menu_Item *quick_change; static const Fl_Menu_Item quick_change_psk[] = { { mode_info[MODE_PSK31].name, 0, cb_init_mode, (void *)MODE_PSK31 }, { mode_info[MODE_PSK63].name, 0, cb_init_mode, (void *)MODE_PSK63 }, { mode_info[MODE_PSK63F].name, 0, cb_init_mode, (void *)MODE_PSK63F }, { mode_info[MODE_PSK125].name, 0, cb_init_mode, (void *)MODE_PSK125 }, { mode_info[MODE_PSK250].name, 0, cb_init_mode, (void *)MODE_PSK250 }, { mode_info[MODE_PSK500].name, 0, cb_init_mode, (void *)MODE_PSK500 }, { mode_info[MODE_PSK1000].name, 0, cb_init_mode, (void *)MODE_PSK1000 }, { 0 } }; static const Fl_Menu_Item quick_change_qpsk[] = { { mode_info[MODE_QPSK31].name, 0, cb_init_mode, (void *)MODE_QPSK31 }, { mode_info[MODE_QPSK63].name, 0, cb_init_mode, (void *)MODE_QPSK63 }, { mode_info[MODE_QPSK125].name, 0, cb_init_mode, (void *)MODE_QPSK125 }, { mode_info[MODE_QPSK250].name, 0, cb_init_mode, (void *)MODE_QPSK250 }, { mode_info[MODE_QPSK500].name, 0, cb_init_mode, (void *)MODE_QPSK500 }, { 0 } }; static const Fl_Menu_Item quick_change_pskr[] = { { mode_info[MODE_PSK125R].name, 0, cb_init_mode, (void *)MODE_PSK125R }, { mode_info[MODE_PSK250R].name, 0, cb_init_mode, (void *)MODE_PSK250R }, { mode_info[MODE_PSK500R].name, 0, cb_init_mode, (void *)MODE_PSK500R }, { mode_info[MODE_PSK1000R].name, 0, cb_init_mode, (void *)MODE_PSK1000R }, { 0 } }; static const Fl_Menu_Item quick_change_psk_multiR[] = { { mode_info[MODE_4X_PSK63R].name, 0, cb_init_mode, (void *)MODE_4X_PSK63R }, { mode_info[MODE_5X_PSK63R].name, 0, cb_init_mode, (void *)MODE_5X_PSK63R }, { mode_info[MODE_10X_PSK63R].name, 0, cb_init_mode, (void *)MODE_10X_PSK63R }, { mode_info[MODE_20X_PSK63R].name, 0, cb_init_mode, (void *)MODE_20X_PSK63R }, { mode_info[MODE_32X_PSK63R].name, 0, cb_init_mode, (void *)MODE_32X_PSK63R }, { mode_info[MODE_4X_PSK125R].name, 0, cb_init_mode, (void *)MODE_4X_PSK125R }, { mode_info[MODE_5X_PSK125R].name, 0, cb_init_mode, (void *)MODE_5X_PSK125R }, { mode_info[MODE_10X_PSK125R].name, 0, cb_init_mode, (void *)MODE_10X_PSK125R }, { mode_info[MODE_12X_PSK125R].name, 0, cb_init_mode, (void *)MODE_12X_PSK125R }, { mode_info[MODE_16X_PSK125R].name, 0, cb_init_mode, (void *)MODE_16X_PSK125R }, { mode_info[MODE_2X_PSK250R].name, 0, cb_init_mode, (void *)MODE_2X_PSK250R }, { mode_info[MODE_3X_PSK250R].name, 0, cb_init_mode, (void *)MODE_3X_PSK250R }, { mode_info[MODE_5X_PSK250R].name, 0, cb_init_mode, (void *)MODE_5X_PSK250R }, { mode_info[MODE_6X_PSK250R].name, 0, cb_init_mode, (void *)MODE_6X_PSK250R }, { mode_info[MODE_7X_PSK250R].name, 0, cb_init_mode, (void *)MODE_7X_PSK250R }, { mode_info[MODE_2X_PSK500R].name, 0, cb_init_mode, (void *)MODE_2X_PSK500R }, { mode_info[MODE_3X_PSK500R].name, 0, cb_init_mode, (void *)MODE_3X_PSK500R }, { mode_info[MODE_4X_PSK500R].name, 0, cb_init_mode, (void *)MODE_4X_PSK500R }, { mode_info[MODE_2X_PSK800R].name, 0, cb_init_mode, (void *)MODE_2X_PSK800R }, { mode_info[MODE_2X_PSK1000R].name, 0, cb_init_mode, (void *)MODE_2X_PSK1000R }, { 0 } }; static const Fl_Menu_Item quick_change_psk_multi[] = { { mode_info[MODE_12X_PSK125].name, 0, cb_init_mode, (void *)MODE_12X_PSK125 }, { mode_info[MODE_6X_PSK250].name, 0, cb_init_mode, (void *)MODE_6X_PSK250 }, { mode_info[MODE_2X_PSK500].name, 0, cb_init_mode, (void *)MODE_2X_PSK500 }, { mode_info[MODE_4X_PSK500].name, 0, cb_init_mode, (void *)MODE_4X_PSK500 }, { mode_info[MODE_2X_PSK800].name, 0, cb_init_mode, (void *)MODE_2X_PSK800 }, { mode_info[MODE_2X_PSK1000].name, 0, cb_init_mode, (void *)MODE_2X_PSK1000 }, { 0 } }; static const Fl_Menu_Item quick_change_mfsk[] = { { mode_info[MODE_MFSK4].name, 0, cb_init_mode, (void *)MODE_MFSK4 }, { mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8 }, { mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16 }, { mode_info[MODE_MFSK11].name, 0, cb_init_mode, (void *)MODE_MFSK11 }, { mode_info[MODE_MFSK22].name, 0, cb_init_mode, (void *)MODE_MFSK22 }, { mode_info[MODE_MFSK31].name, 0, cb_init_mode, (void *)MODE_MFSK31 }, { mode_info[MODE_MFSK32].name, 0, cb_init_mode, (void *)MODE_MFSK32 }, { mode_info[MODE_MFSK64].name, 0, cb_init_mode, (void *)MODE_MFSK64 }, { mode_info[MODE_MFSK128].name, 0, cb_init_mode, (void *)MODE_MFSK128 }, { mode_info[MODE_MFSK64L].name, 0, cb_init_mode, (void *)MODE_MFSK64L }, { mode_info[MODE_MFSK128L].name, 0, cb_init_mode, (void *)MODE_MFSK128L }, { 0 } }; static const Fl_Menu_Item quick_change_wefax[] = { { mode_info[MODE_WEFAX_576].name, 0, cb_init_mode, (void *)MODE_WEFAX_576 }, { mode_info[MODE_WEFAX_288].name, 0, cb_init_mode, (void *)MODE_WEFAX_288 }, { 0 } }; static const Fl_Menu_Item quick_change_navtex[] = { { mode_info[MODE_NAVTEX].name, 0, cb_init_mode, (void *)MODE_NAVTEX }, { mode_info[MODE_SITORB].name, 0, cb_init_mode, (void *)MODE_SITORB }, { 0 } }; static const Fl_Menu_Item quick_change_mt63[] = { { mode_info[MODE_MT63_500S].name, 0, cb_init_mode, (void *)MODE_MT63_500S }, { mode_info[MODE_MT63_500L].name, 0, cb_init_mode, (void *)MODE_MT63_500L }, { mode_info[MODE_MT63_1000S].name, 0, cb_init_mode, (void *)MODE_MT63_1000S }, { mode_info[MODE_MT63_1000L].name, 0, cb_init_mode, (void *)MODE_MT63_1000L }, { mode_info[MODE_MT63_2000S].name, 0, cb_init_mode, (void *)MODE_MT63_2000S }, { mode_info[MODE_MT63_2000L].name, 0, cb_init_mode, (void *)MODE_MT63_2000L }, { 0 } }; static const Fl_Menu_Item quick_change_thor[] = { { mode_info[MODE_THOR4].name, 0, cb_init_mode, (void *)MODE_THOR4 }, { mode_info[MODE_THOR5].name, 0, cb_init_mode, (void *)MODE_THOR5 }, { mode_info[MODE_THOR8].name, 0, cb_init_mode, (void *)MODE_THOR8 }, { mode_info[MODE_THOR11].name, 0, cb_init_mode, (void *)MODE_THOR11 }, { mode_info[MODE_THOR16].name, 0, cb_init_mode, (void *)MODE_THOR16 }, { mode_info[MODE_THOR22].name, 0, cb_init_mode, (void *)MODE_THOR22 }, { mode_info[MODE_THOR25x4].name, 0, cb_init_mode, (void *)MODE_THOR25x4 }, { mode_info[MODE_THOR50x1].name, 0, cb_init_mode, (void *)MODE_THOR50x1 }, { mode_info[MODE_THOR50x2].name, 0, cb_init_mode, (void *)MODE_THOR50x2 }, { mode_info[MODE_THOR100].name, 0, cb_init_mode, (void *)MODE_THOR100 }, { 0 } }; static const Fl_Menu_Item quick_change_domino[] = { { mode_info[MODE_DOMINOEX4].name, 0, cb_init_mode, (void *)MODE_DOMINOEX4 }, { mode_info[MODE_DOMINOEX5].name, 0, cb_init_mode, (void *)MODE_DOMINOEX5 }, { mode_info[MODE_DOMINOEX8].name, 0, cb_init_mode, (void *)MODE_DOMINOEX8 }, { mode_info[MODE_DOMINOEX11].name, 0, cb_init_mode, (void *)MODE_DOMINOEX11 }, { mode_info[MODE_DOMINOEX16].name, 0, cb_init_mode, (void *)MODE_DOMINOEX16 }, { mode_info[MODE_DOMINOEX22].name, 0, cb_init_mode, (void *)MODE_DOMINOEX22 }, { mode_info[MODE_DOMINOEX44].name, 0, cb_init_mode, (void *)MODE_DOMINOEX44 }, { mode_info[MODE_DOMINOEX88].name, 0, cb_init_mode, (void *)MODE_DOMINOEX88 }, { 0 } }; static const Fl_Menu_Item quick_change_feld[] = { { mode_info[MODE_FELDHELL].name, 0, cb_init_mode, (void *)MODE_FELDHELL }, { mode_info[MODE_SLOWHELL].name, 0, cb_init_mode, (void *)MODE_SLOWHELL }, { mode_info[MODE_HELLX5].name, 0, cb_init_mode, (void *)MODE_HELLX5 }, { mode_info[MODE_HELLX9].name, 0, cb_init_mode, (void *)MODE_HELLX9 }, { mode_info[MODE_FSKHELL].name, 0, cb_init_mode, (void *)MODE_FSKHELL }, { mode_info[MODE_FSKH105].name, 0, cb_init_mode, (void *)MODE_FSKH105 }, { mode_info[MODE_HELL80].name, 0, cb_init_mode, (void *)MODE_HELL80 }, { 0 } }; static const Fl_Menu_Item quick_change_throb[] = { { mode_info[MODE_THROB1].name, 0, cb_init_mode, (void *)MODE_THROB1 }, { mode_info[MODE_THROB2].name, 0, cb_init_mode, (void *)MODE_THROB2 }, { mode_info[MODE_THROB4].name, 0, cb_init_mode, (void *)MODE_THROB4 }, { mode_info[MODE_THROBX1].name, 0, cb_init_mode, (void *)MODE_THROBX1 }, { mode_info[MODE_THROBX2].name, 0, cb_init_mode, (void *)MODE_THROBX2 }, { mode_info[MODE_THROBX4].name, 0, cb_init_mode, (void *)MODE_THROBX4 }, { 0 } }; static const Fl_Menu_Item quick_change_olivia[] = { { mode_info[MODE_OLIVIA_4_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_250 }, { mode_info[MODE_OLIVIA_8_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_250 }, { mode_info[MODE_OLIVIA_4_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_500 }, { mode_info[MODE_OLIVIA_8_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_500 }, { mode_info[MODE_OLIVIA_16_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_500 }, { mode_info[MODE_OLIVIA_8_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_1000 }, { mode_info[MODE_OLIVIA_16_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_1000 }, { mode_info[MODE_OLIVIA_32_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_1000 }, { mode_info[MODE_OLIVIA_64_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_2000 }, { _("Custom..."), 0, cb_oliviaCustom, (void *)MODE_OLIVIA }, { 0 } }; static const Fl_Menu_Item quick_change_contestia[] = { { "4/125", 0, cb_contestiaI, (void *)MODE_CONTESTIA }, { "4/250", 0, cb_contestiaA, (void *)MODE_CONTESTIA }, { "8/250", 0, cb_contestiaB, (void *)MODE_CONTESTIA }, { "4/500", 0, cb_contestiaC, (void *)MODE_CONTESTIA }, { "8/500", 0, cb_contestiaD, (void *)MODE_CONTESTIA }, { "16/500", 0, cb_contestiaE, (void *)MODE_CONTESTIA }, { "8/1000", 0, cb_contestiaF, (void *)MODE_CONTESTIA }, { "16/1000", 0, cb_contestiaG, (void *)MODE_CONTESTIA }, { "32/1000", 0, cb_contestiaH, (void *)MODE_CONTESTIA }, { "64/1000", 0, cb_contestiaJ, (void *)MODE_CONTESTIA }, { _("Custom..."), 0, cb_contestiaCustom, (void *)MODE_CONTESTIA }, { 0 } }; static const Fl_Menu_Item quick_change_rtty[] = { { "RTTY-45", 0, cb_rtty45, (void *)MODE_RTTY }, { "RTTY-50", 0, cb_rtty50, (void *)MODE_RTTY }, { "RTTY-75N", 0, cb_rtty75N, (void *)MODE_RTTY }, { "RTTY-75W", 0, cb_rtty75W, (void *)MODE_RTTY }, { _("Custom..."), 0, cb_rttyCustom, (void *)MODE_RTTY }, { 0 } }; inline int minmax(int val, int min, int max) { val = val < max ? val : max; return val > min ? val : min; } // Olivia void set_olivia_default_integ() { if (!progdefaults.olivia_reset_fec) return; int tones = progdefaults.oliviatones; int bw = progdefaults.oliviabw; if (tones < 1) tones = 1; int depth = minmax( (8 * (1 << bw)) / (1 << tones), 4, 4 * (1 << bw)); progdefaults.oliviasinteg = depth; cntOlivia_sinteg->value(depth); } void set_olivia_tab_widgets() { i_listbox_olivia_bandwidth->index(progdefaults.oliviabw); i_listbox_olivia_tones->index(progdefaults.oliviatones); set_olivia_default_integ(); } void cb_oliviaCustom(Fl_Widget *w, void *arg) { modem_config_tab = tabOlivia; tabsConfigure->value(tabModems); tabsModems->value(modem_config_tab); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults();; dlgConfig->show(); cb_init_mode(w, arg); } // Contestia void set_contestia_default_integ() { if (!progdefaults.contestia_reset_fec) return; int tones = progdefaults.contestiatones; int bw = progdefaults.contestiabw; if (tones < 1) tones = 1; int depth = minmax( (8 * (1 << bw)) / (1 << tones), 4, 4 * (1 << bw)); progdefaults.contestiasinteg = depth; cntContestia_sinteg->value(depth); } void set_contestia_tab_widgets() { i_listbox_contestia_bandwidth->index(progdefaults.contestiabw); i_listbox_contestia_tones->index(progdefaults.contestiatones); set_contestia_default_integ(); } void cb_contestiaA(Fl_Widget *w, void *arg) { progdefaults.contestiatones = 1; progdefaults.contestiabw = 1; set_contestia_tab_widgets(); cb_init_mode(w, arg); } void cb_contestiaB(Fl_Widget *w, void *arg) { progdefaults.contestiatones = 2; progdefaults.contestiabw = 1; set_contestia_tab_widgets(); cb_init_mode(w, arg); } void cb_contestiaC(Fl_Widget *w, void *arg) { progdefaults.contestiatones = 1; progdefaults.contestiabw = 2; set_contestia_tab_widgets(); cb_init_mode(w, arg); } void cb_contestiaD(Fl_Widget *w, void *arg) { progdefaults.contestiatones = 2; progdefaults.contestiabw = 2; set_contestia_tab_widgets(); cb_init_mode(w, arg); } void cb_contestiaE(Fl_Widget *w, void *arg) { progdefaults.contestiatones = 3; progdefaults.contestiabw = 2; set_contestia_tab_widgets(); cb_init_mode(w, arg); } void cb_contestiaF(Fl_Widget *w, void *arg) { progdefaults.contestiatones = 2; progdefaults.contestiabw = 3; set_contestia_tab_widgets(); cb_init_mode(w, arg); } void cb_contestiaG(Fl_Widget *w, void *arg) { progdefaults.contestiatones = 3; progdefaults.contestiabw = 3; set_contestia_tab_widgets(); cb_init_mode(w, arg); } void cb_contestiaH(Fl_Widget *w, void *arg) { progdefaults.contestiatones = 4; progdefaults.contestiabw = 3; set_contestia_tab_widgets(); cb_init_mode(w, arg); } void cb_contestiaI(Fl_Widget *w, void *arg) { progdefaults.contestiatones = 1; progdefaults.contestiabw = 0; set_contestia_tab_widgets(); cb_init_mode(w, arg); } void cb_contestiaJ(Fl_Widget *w, void *arg) { progdefaults.contestiatones = 5; progdefaults.contestiabw = 3; set_contestia_tab_widgets(); cb_init_mode(w, arg); } void cb_contestiaCustom(Fl_Widget *w, void *arg) { modem_config_tab = tabContestia; tabsConfigure->value(tabModems); tabsModems->value(modem_config_tab); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults();; dlgConfig->show(); cb_init_mode(w, arg); } void set_rtty_tab_widgets() { selShift->index(progdefaults.rtty_shift+1); selCustomShift->deactivate(); selBits->index(progdefaults.rtty_bits+1); selBaud->index(progdefaults.rtty_baud+1); selParity->index(progdefaults.rtty_parity+1); selStopBits->index(progdefaults.rtty_stop+1); } void cb_rtty45(Fl_Widget *w, void *arg) { progdefaults.rtty_baud = 1; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; set_rtty_tab_widgets(); cb_init_mode(w, arg); } void cb_rtty50(Fl_Widget *w, void *arg) { progdefaults.rtty_baud = 2; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; set_rtty_tab_widgets(); cb_init_mode(w, arg); } void cb_rtty75N(Fl_Widget *w, void *arg) { progdefaults.rtty_baud = 4; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; set_rtty_tab_widgets(); cb_init_mode(w, arg); } void cb_rtty75W(Fl_Widget *w, void *arg) { progdefaults.rtty_baud = 4; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 9; set_rtty_tab_widgets(); cb_init_mode(w, arg); } void cb_rttyCustom(Fl_Widget *w, void *arg) { modem_config_tab = tabRTTY; tabsConfigure->value(tabModems); tabsModems->value(modem_config_tab); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults(); dlgConfig->show(); cb_init_mode(w, arg); } void set_dominoex_tab_widgets() { chkDominoEX_FEC->value(progdefaults.DOMINOEX_FEC); } void startup_modem(modem* m, int f) { trx_start_modem(m, f); #if BENCHMARK_MODE return; #endif restoreFocus(); trx_mode id = m->get_mode(); if (id == MODE_CW) { cntCW_WPM->show(); btnCW_Default->show(); Status1->hide(); } else { cntCW_WPM->hide(); btnCW_Default->hide(); Status1->show(); } if (id >= MODE_HELL_FIRST && id <= MODE_HELL_LAST) { ReceiveText->hide(); TransmitText->show(); FHdisp->show(); wefax_pic::hide_both(); sldrHellBW->value(progdefaults.HELL_BW); } else if (id >= MODE_WEFAX_FIRST && id <= MODE_WEFAX_LAST) { ReceiveText->hide(); TransmitText->hide(); FHdisp->hide(); wefax_pic::show_both(); } else if (!bWF_only) { ReceiveText->show(); TransmitText->show(); FHdisp->hide(); wefax_pic::hide_both(); } if (id == MODE_RTTY) { if (mvsquelch) { mvsquelch->value(progStatus.VIEWER_rttysquelch); mvsquelch->range(-12.0, 6.0); } if (sldrViewerSquelch) { sldrViewerSquelch->value(progStatus.VIEWER_rttysquelch); sldrViewerSquelch->range(-12.0, 6.0); } } else if (id >= MODE_PSK_FIRST && id <= MODE_PSK_LAST) { m->set_sigsearch(SIGSEARCH); if (mvsquelch) { mvsquelch->value(progStatus.VIEWER_psksquelch); mvsquelch->range(-3.0, 6.0); } if (sldrViewerSquelch) { sldrViewerSquelch->value(progStatus.VIEWER_psksquelch); sldrViewerSquelch->range(-3.0, 6.0); } } if (m->get_cap() & modem::CAP_AFC) { btnAFC->value(progStatus.afconoff); btnAFC->activate(); } else { btnAFC->value(0); btnAFC->deactivate(); } if (m->get_cap() & modem::CAP_REV) { wf->btnRev->value(wf->Reverse()); wf->btnRev->activate(); } else { wf->btnRev->value(0); wf->btnRev->deactivate(); } } void cb_mnuOpenMacro(Fl_Menu_*, void*) { if (macros.changed) { switch (fl_choice2(_("Save changed macros?"), _("Cancel"), _("Save"), _("Don't save"))) { case 0: return; case 1: macros.saveMacroFile(); // fall through case 2: break; } } macros.openMacroFile(); macros.changed = false; restoreFocus(); } void cb_mnuSaveMacro(Fl_Menu_*, void*) { macros.saveMacroFile(); restoreFocus(); } void remove_windows() { if (scopeview) { scopeview->hide(); delete scopeview; } if (dlgViewer) { dlgViewer->hide(); delete dlgViewer; } if (dlgLogbook) { dlgLogbook->hide(); delete dlgLogbook; } if (dlgConfig) { dlgConfig->hide(); delete cboHamlibRig; delete dlgConfig; } if (font_browser) { font_browser->hide(); delete font_browser; } if (notify_window) { notify_window->hide(); delete notify_window; } if (dxcc_window) { dxcc_window->hide(); delete dxcc_window; } if (picRxWin) { picRxWin->hide(); delete picRxWin; } if (picTxWin) { picTxWin->hide(); delete picTxWin; } if (wefax_pic_rx_win) { wefax_pic_rx_win->hide(); delete wefax_pic_rx_win; } if (wefax_pic_tx_win) { wefax_pic_tx_win->hide(); delete wefax_pic_tx_win; } if (wExport) { wExport->hide(); delete wExport; } if (wCabrillo) { wCabrillo->hide(); delete wCabrillo; } if (MacroEditDialog) { MacroEditDialog->hide(); delete MacroEditDialog; } debug::stop(); } // callback executed from Escape / Window decoration 'X' or OS X cmd-Q // capture cmd-Q to allow a normal shutdown. // Red-X on OS X window decoration will crash with Signal 11 if a dialog // is opened post pressing the Red-X // Lion also does not allow any dialog other than the main dialog to // remain open after a Red-X exit void cb_wMain(Fl_Widget*, void*) { // to prevent anything other than a File / Exit in waterfall only // if wf only and in transmit the escape will abort the transmit // if (bWF_only) return; #ifdef __APPLE__ bool ret = false; if (((Fl::event_state() & FL_COMMAND) == FL_COMMAND) && (Fl::event_key() == 'q')) ret = clean_exit(true); else ret = clean_exit(false); if (!ret) return; #else if (!clean_exit(true)) return; #endif remove_windows(); // more Apple Lion madness // this will make Fl::run return fl_digi_main->hide(); } // callback executed from menu item File/Exit void cb_E(Fl_Menu_*, void*) { if (!clean_exit(true)) return; remove_windows(); // this will make Fl::run return fl_digi_main->hide(); } static int squelch_val; void rsid_squelch_timer(void*) { progStatus.sqlonoff = squelch_val; if (progStatus.sqlonoff) btnSQL->value(1); } void init_modem_squelch(trx_mode mode, int freq) { squelch_val = progStatus.sqlonoff; progStatus.sqlonoff = 0; btnSQL->value(0); Fl::add_timeout(progdefaults.rsid_squelch, rsid_squelch_timer); init_modem(mode, freq); } void init_modem(trx_mode mode, int freq) { ENSURE_THREAD(FLMAIN_TID); LOG_INFO("mode: %d, freq: %d", (int)mode, freq); #if !BENCHMARK_MODE quick_change = 0; modem_config_tab = tabsModems->child(0); #endif switch (mode) { case MODE_NEXT: if ((mode = active_modem->get_mode() + 1) == NUM_MODES) mode = 0; return init_modem(mode, freq); case MODE_PREV: if ((mode = active_modem->get_mode() - 1) < 0) mode = NUM_MODES - 1; return init_modem(mode, freq); case MODE_NULL: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new NULLMODEM, freq); break; case MODE_CW: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new cw, freq); modem_config_tab = tabCW; break; case MODE_THOR4: case MODE_THOR5: case MODE_THOR8: case MODE_THOR11:case MODE_THOR16: case MODE_THOR22: case MODE_THOR25x4: case MODE_THOR50x1: case MODE_THOR50x2: case MODE_THOR100: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new thor(mode), freq); quick_change = quick_change_thor; modem_config_tab = tabTHOR; break; case MODE_DOMINOEX4: case MODE_DOMINOEX5: case MODE_DOMINOEX8: case MODE_DOMINOEX11: case MODE_DOMINOEX16: case MODE_DOMINOEX22: case MODE_DOMINOEX44: case MODE_DOMINOEX88: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new dominoex(mode), freq); quick_change = quick_change_domino; modem_config_tab = tabDomEX; break; case MODE_FELDHELL: case MODE_SLOWHELL: case MODE_HELLX5: case MODE_HELLX9: case MODE_FSKHELL: case MODE_FSKH105: case MODE_HELL80: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new feld(mode), freq); quick_change = quick_change_feld; modem_config_tab = tabFeld; break; case MODE_MFSK4: case MODE_MFSK11: case MODE_MFSK22: case MODE_MFSK31: case MODE_MFSK64: case MODE_MFSK8: case MODE_MFSK16: case MODE_MFSK32: case MODE_MFSK128: case MODE_MFSK64L: case MODE_MFSK128L: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new mfsk(mode), freq); quick_change = quick_change_mfsk; break; case MODE_WEFAX_576: case MODE_WEFAX_288: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new wefax(mode), freq); quick_change = quick_change_wefax; modem_config_tab = tabWefax; break; case MODE_NAVTEX: case MODE_SITORB: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new navtex(mode), freq); quick_change = quick_change_navtex; modem_config_tab = tabNavtex; break; case MODE_MT63_500S: case MODE_MT63_1000S: case MODE_MT63_2000S : case MODE_MT63_500L: case MODE_MT63_1000L: case MODE_MT63_2000L : startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new mt63(mode), freq); quick_change = quick_change_mt63; modem_config_tab = tabMT63; break; case MODE_PSK31: case MODE_PSK63: case MODE_PSK63F: case MODE_PSK125: case MODE_PSK250: case MODE_PSK500: case MODE_PSK1000: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_psk; modem_config_tab = tabPSK; break; case MODE_QPSK31: case MODE_QPSK63: case MODE_QPSK125: case MODE_QPSK250: case MODE_QPSK500: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_qpsk; modem_config_tab = tabPSK; break; case MODE_PSK125R: case MODE_PSK250R: case MODE_PSK500R: case MODE_PSK1000R: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_pskr; modem_config_tab = tabPSK; break; case MODE_12X_PSK125 : case MODE_6X_PSK250 : case MODE_2X_PSK500 : case MODE_4X_PSK500 : case MODE_2X_PSK800 : case MODE_2X_PSK1000 : startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_psk_multi; modem_config_tab = tabPSK; break; case MODE_4X_PSK63R : case MODE_5X_PSK63R : case MODE_10X_PSK63R : case MODE_20X_PSK63R : case MODE_32X_PSK63R : case MODE_4X_PSK125R : case MODE_5X_PSK125R : case MODE_10X_PSK125R : case MODE_12X_PSK125R : case MODE_16X_PSK125R : case MODE_2X_PSK250R : case MODE_3X_PSK250R : case MODE_5X_PSK250R : case MODE_6X_PSK250R : case MODE_7X_PSK250R : case MODE_2X_PSK500R : case MODE_3X_PSK500R : case MODE_4X_PSK500R : case MODE_2X_PSK800R : case MODE_2X_PSK1000R : startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_psk_multiR; modem_config_tab = tabPSK; break; case MODE_OLIVIA: case MODE_OLIVIA_4_250: case MODE_OLIVIA_8_250: case MODE_OLIVIA_4_500: case MODE_OLIVIA_8_500: case MODE_OLIVIA_16_500: case MODE_OLIVIA_8_1000: case MODE_OLIVIA_16_1000: case MODE_OLIVIA_32_1000: case MODE_OLIVIA_64_2000: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new olivia(mode), freq); modem_config_tab = tabOlivia; quick_change = quick_change_olivia; break; case MODE_CONTESTIA: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new contestia, freq); modem_config_tab = tabContestia; quick_change = quick_change_contestia; break; case MODE_RTTY: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new rtty(mode), freq); modem_config_tab = tabRTTY; quick_change = quick_change_rtty; break; case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: case MODE_THROBX1: case MODE_THROBX2: case MODE_THROBX4: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new throb(mode), freq); quick_change = quick_change_throb; break; case MODE_WWV: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new wwv, freq); break; case MODE_ANALYSIS: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new anal, freq); break; case MODE_SSB: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new ssb, freq); break; default: LOG_ERROR("Unknown mode: %" PRIdPTR, mode); mode = MODE_PSK31; startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_psk; modem_config_tab = tabPSK; break; } #if BENCHMARK_MODE return; #endif clear_StatusMessages(); progStatus.lastmode = mode; if (wf->xmtlock->value() == 1 && !mailserver) { if(!progdefaults.retain_freq_lock) { wf->xmtlock->value(0); wf->xmtlock->damage(); active_modem->set_freqlock(false); } } } void init_modem_sync(trx_mode m, int f) { ENSURE_THREAD(FLMAIN_TID); int count = 2000; if (trx_state != STATE_RX) { LOG_INFO("Waiting for %s", mode_info[active_modem->get_mode()].name); abort_tx(); while (trx_state != STATE_RX && count) { LOG_DEBUG("%0.2f secs remaining", count / 100.0); Fl::awake(); MilliSleep(10); count--; } if (count == 0) { LOG_ERROR("%s", "TIMED OUT!!"); return; // abort modem selection } } init_modem(m, f); count = 500; if (trx_state != STATE_RX) { while (trx_state != STATE_RX && count) { Fl::awake(); MilliSleep(10); count--; } if (count == 0) LOG_ERROR("%s", "Wait for STATE_RX timed out"); } REQ_FLUSH(TRX_TID); } void cb_init_mode(Fl_Widget *, void *mode) { init_modem(reinterpret_cast(mode)); } // character set selection menu void set_charset_listbox(int rxtx_charset) { int tiniconv_id = charset_list[rxtx_charset].tiniconv_id; // order all converters to switch to the new encoding rx_chd.set_input_encoding(tiniconv_id); echo_chd.set_input_encoding(tiniconv_id); tx_encoder.set_output_encoding(tiniconv_id); if (mainViewer) mainViewer->set_input_encoding(tiniconv_id); if (brwsViewer) brwsViewer->set_input_encoding(tiniconv_id); // update the button progdefaults.charset_name = charset_list[rxtx_charset].name; listbox_charset_status->value(progdefaults.charset_name.c_str()); restoreFocus(); } void cb_listbox_charset(Fl_Widget *w, void *) { Fl_ListBox * lbox = (Fl_ListBox *)w; set_charset_listbox(lbox->index()); } void populate_charset_listbox(void) { for (unsigned int i = 0; i < number_of_charsets; i++) listbox_charset_status->add( charset_list[i].name ); listbox_charset_status->value(progdefaults.charset_name.c_str()); } // find the position of the default charset in charset_list[] and trigger the callback void set_default_charset(void) { for (unsigned int i = 0; i < number_of_charsets; i++) { if (strcmp(charset_list[i].name, progdefaults.charset_name.c_str()) == 0) { set_charset_listbox(i); return; } } } // if w is not NULL, give focus to TransmitText only if the last event was an Enter keypress void restoreFocus(Fl_Widget* w) { if (!w) TransmitText->take_focus(); else if (Fl::event() == FL_KEYBOARD) { int k = Fl::event_key(); if (k == FL_Enter || k == FL_KP_Enter) TransmitText->take_focus(); } } void macro_cb(Fl_Widget *w, void *v) { int b = (int)(reinterpret_cast (v)); if (progdefaults.mbar2_pos && b >= NUMMACKEYS) b += (altMacros - 1) * NUMMACKEYS; if (!progdefaults.mbar2_pos) b += altMacros * NUMMACKEYS; int mouse = Fl::event_button(); if (mouse == FL_LEFT_MOUSE && !macros.text[b].empty()) { stopMacroTimer(); macros.execute(b); } else if (mouse == FL_RIGHT_MOUSE) editMacro(b); restoreFocus(); } void colorize_macro(int i) { int j = i % NUMMACKEYS; if (progdefaults.useGroupColors == true) { if (j < 4) { btnMacro[i]->color(fl_rgb_color( progdefaults.btnGroup1.R, progdefaults.btnGroup1.G, progdefaults.btnGroup1.B)); } else if (j < 8) { btnMacro[i]->color(fl_rgb_color( progdefaults.btnGroup2.R, progdefaults.btnGroup2.G, progdefaults.btnGroup2.B)); } else { btnMacro[i]->color(fl_rgb_color( progdefaults.btnGroup3.R, progdefaults.btnGroup3.G, progdefaults.btnGroup3.B)); } btnMacro[i]->labelcolor( fl_rgb_color( progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.G, progdefaults.btnFkeyTextColor.B )); } else { btnMacro[i]->color(FL_BACKGROUND_COLOR); btnMacro[i]->labelcolor(FL_FOREGROUND_COLOR); } } void colorize_macros() { FL_LOCK_D(); for (int i = 0; i < NUMMACKEYS * NUMKEYROWS; i++) { colorize_macro(i); btnMacro[i]->redraw_label(); } FL_UNLOCK_D(); } void altmacro_cb(Fl_Widget *w, void *v) { static char alt_text[2] = "1"; intptr_t arg = reinterpret_cast(v); if (arg) altMacros += arg; else altMacros = altMacros + (Fl::event_button() == FL_RIGHT_MOUSE ? -1 : 1); if (progdefaults.mbar2_pos) { // alternate set altMacros = WCLAMP(altMacros, 1, 3); alt_text[0] = '1' + altMacros; for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[i + NUMMACKEYS]->label(macros.name[i + (altMacros * NUMMACKEYS)].c_str()); btnMacro[i + NUMMACKEYS]->redraw_label(); } btnAltMacros2->label(alt_text); btnAltMacros2->redraw_label(); } else { // primary set altMacros = WCLAMP(altMacros, 0, 3); alt_text[0] = '1' + altMacros; for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[i]->label(macros.name[i + (altMacros * NUMMACKEYS)].c_str()); btnMacro[i]->redraw_label(); } btnAltMacros1->label(alt_text); btnAltMacros1->redraw_label(); } restoreFocus(); } void cb_mnuConfigOperator(Fl_Menu_*, void*) { progdefaults.loadDefaults(); tabsConfigure->value(tabOperator); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults(); dlgConfig->show(); } void cb_mnuConfigWaterfall(Fl_Menu_*, void*) { progdefaults.loadDefaults(); tabsConfigure->value(tabWaterfall); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults(); dlgConfig->show(); } void cb_mnuConfigID(Fl_Menu_*, void*) { progdefaults.loadDefaults(); tabsConfigure->value(tabID); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults(); dlgConfig->show(); } void cb_mnuConfigQRZ(Fl_Menu_*, void*) { progdefaults.loadDefaults(); tabsConfigure->value(tabQRZ); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults(); dlgConfig->show(); } void cb_mnuConfigMisc(Fl_Menu_*, void*) { progdefaults.loadDefaults(); tabsConfigure->value(tabMisc); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults(); dlgConfig->show(); } void cb_mnuConfigAutostart(Fl_Menu_*, void*) { progdefaults.loadDefaults(); tabsConfigure->value(tabAutoStart); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults(); dlgConfig->show(); } void cb_mnuConfigNotify(Fl_Menu_*, void*) { notify_show(); } void cb_mnuUI(Fl_Menu_*, void *) { progdefaults.loadDefaults(); tabsConfigure->value(tabUI); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults(); dlgConfig->show(); } void cb_mnuConfigContest(Fl_Menu_*, void*) { progdefaults.loadDefaults(); tabsConfigure->value(tabUI); tabsUI->value(tabContest); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults(); dlgConfig->show(); } void cb_mnuConfigRigCtrl(Fl_Menu_*, void*) { progdefaults.loadDefaults(); tabsConfigure->value(tabRig); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults(); dlgConfig->show(); } void cb_mnuConfigSoundCard(Fl_Menu_*, void*) { progdefaults.loadDefaults(); tabsConfigure->value(tabSoundCard); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults(); dlgConfig->show(); } void cb_mnuConfigModems(Fl_Menu_*, void*) { progdefaults.loadDefaults(); tabsConfigure->value(tabModems); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults(); dlgConfig->show(); } void cb_mnuConfigWFcontrols(Fl_Menu_ *, void*) { progdefaults.loadDefaults(); tabsConfigure->value(tabUI); tabsUI->value(tabWF_UI); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults(); dlgConfig->show(); } void cb_logfile(Fl_Widget* w, void*) { progStatus.LOGenabled = reinterpret_cast(w)->mvalue()->value(); if (progStatus.LOGenabled == true) { Date tdy; string lfname = HomeDir; lfname.append("fldigi"); lfname.append(tdy.szDate(2)); lfname.append(".log"); logfile = new cLogfile(lfname); if (logfile) logfile->log_to_file_start(); } else { if (logfile) { logfile->log_to_file_stop(); delete logfile; } logfile = 0; } } // LOGBOOK server connect void cb_log_server(Fl_Widget* w, void*) { progdefaults.xml_logbook = reinterpret_cast(w)->mvalue()->value(); connect_to_log_server(); } void set_server_label(bool val) { Fl_Menu_Item *m = getMenuItem(LOG_CONNECT_SERVER); if (val) m->set(); else m->clear(); } void cb_view_hide_channels(Fl_Menu_ *w, void *d) { if (text_panel->w() != ReceiveText->w()) { progStatus.tile_x = mvgroup->w(); progStatus.tile_w = text_panel->w(); progStatus.tile_y = ReceiveText->h(); progStatus.tile_h = text_panel->h(); if (!progStatus.show_channels) progStatus.show_channels = true; } else if (progStatus.show_channels) progStatus.show_channels = false; progStatus.show_channels = !progStatus.show_channels; UI_select(); return; } #if USE_SNDFILE static bool capval = false; static bool genval = false; static bool playval = false; void cb_mnuCapture(Fl_Widget *w, void *d) { if (!scard) return; Fl_Menu_Item *m = getMenuItem(((Fl_Menu_*)w)->mvalue()->label()); //eek if (playval || genval) { m->clear(); return; } capval = m->value(); if(!scard->Capture(capval)) { m->clear(); capval = false; } } void cb_mnuGenerate(Fl_Widget *w, void *d) { Fl_Menu_Item *m = getMenuItem(((Fl_Menu_*)w)->mvalue()->label()); if (capval || playval) { m->clear(); return; } if (!scard) return; genval = m->value(); if (!scard->Generate(genval)) { m->clear(); genval = false; } } Fl_Menu_Item *Playback_menu_item = (Fl_Menu_Item *)0; void reset_mnuPlayback() { if (Playback_menu_item == 0) return; Playback_menu_item->clear(); playval = false; } void cb_mnuPlayback(Fl_Widget *w, void *d) { if (!scard) return; Fl_Menu_Item *m = getMenuItem(((Fl_Menu_*)w)->mvalue()->label()); Playback_menu_item = m; if (capval || genval) { m->clear(); bHighSpeed = false; return; } playval = m->value(); if (!playval) bHighSpeed = false; int err = scard->Playback(playval); if(err < 0) { switch (err) { case -1: fl_alert2(_("No file name given")); break; case -2: fl_alert2(_("Unsupported format")); break; case -3: fl_alert2(_("channels != 1")); break; default: fl_alert2(_("unknown wave file error")); } m->clear(); playval = false; bHighSpeed = false; } else if (btnAutoSpot->value()) { put_status(_("Spotting disabled"), 3.0); btnAutoSpot->value(0); btnAutoSpot->do_callback(); } } #endif // USE_SNDFILE void cb_mnuConfigFonts(Fl_Menu_*, void *) { progdefaults.loadDefaults(); tabsConfigure->value(tabUI); tabsUI->value(tabColorsFonts); dlgConfig->show(); } void cb_mnuSaveConfig(Fl_Menu_ *, void *) { progdefaults.saveDefaults(); restoreFocus(); } // This function may be called by the QRZ thread void cb_mnuVisitURL(Fl_Widget*, void* arg) { const char* url = reinterpret_cast(arg); #ifndef __WOE32__ const char* browsers[] = { # ifdef __APPLE__ getenv("FLDIGI_BROWSER"), // valid for any OS - set by user "open" // OS X # else "fl-xdg-open", // Puppy Linux "xdg-open", // other Unix-Linux distros getenv("FLDIGI_BROWSER"), // force use of spec'd browser getenv("BROWSER"), // most Linux distributions "sensible-browser", "firefox", "mozilla" // must be something out there! # endif }; switch (fork()) { case 0: # ifndef NDEBUG unsetenv("MALLOC_CHECK_"); unsetenv("MALLOC_PERTURB_"); # endif for (size_t i = 0; i < sizeof(browsers)/sizeof(browsers[0]); i++) if (browsers[i]) execlp(browsers[i], browsers[i], url, (char*)0); exit(EXIT_FAILURE); case -1: fl_alert2(_("Could not run a web browser:\n%s\n\n" "Open this URL manually:\n%s"), strerror(errno), url); } #else // gurgle... gurgle... HOWL // "The return value is cast as an HINSTANCE for backward // compatibility with 16-bit Windows applications. It is // not a true HINSTANCE, however. The only thing that can // be done with the returned HINSTANCE is to cast it to an // int and compare it with the value 32 or one of the error // codes below." (Error codes omitted to preserve sanity). if ((int)ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL) <= 32) fl_alert2(_("Could not open url:\n%s\n"), url); #endif } void open_recv_folder(const char *folder) { cb_mnuVisitURL(0, (void*)folder); } void cb_mnuVisitPSKRep(Fl_Widget*, void*) { cb_mnuVisitURL(0, (void*)string("http://pskreporter.info/pskmap?").append(progdefaults.myCall).c_str()); } void html_help( const string &Html) { if (!help_dialog) help_dialog = new Fl_Help_Dialog; help_dialog->value(Html.c_str()); help_dialog->show(); } void cb_mnuBeginnersURL(Fl_Widget*, void*) { string deffname = HelpDir; deffname.append("beginners.html"); ofstream f(deffname.c_str()); if (!f) return; f << szBeginner; f.close(); #ifndef __WOE32__ cb_mnuVisitURL(NULL, (void *)deffname.insert(0, "file://").c_str()); #else cb_mnuVisitURL(NULL, (void *)deffname.c_str()); #endif } void cb_mnuCheckUpdate(Fl_Widget*, void*) { struct { const char* url; const char* re; string version_str; unsigned long version; } sites[] = { { PACKAGE_DL, "downloads/fldigi/fldigi-([0-9.]+).tar.gz", "", 0 }, { PACKAGE_PROJ, "fldigi/fldigi-([0-9.]+).tar.gz", "", 0 } }, *latest; string reply; put_status(_("Checking for updates...")); for (size_t i = 0; i < sizeof(sites)/sizeof(*sites); i++) { // fetch .url, grep for .re reply.clear(); if (!fetch_http_gui(sites[i].url, reply, 20.0)) continue; re_t re(sites[i].re, REG_EXTENDED | REG_ICASE | REG_NEWLINE); if (!re.match(reply.c_str()) || re.nsub() != 2) continue; sites[i].version = ver2int((sites[i].version_str = re.submatch(1)).c_str()); } put_status(""); latest = sites[1].version > sites[0].version ? &sites[1] : &sites[0]; if (sites[0].version == 0 && sites[1].version == 0) { fl_alert2(_("Could not check for updates:\n%s"), reply.c_str()); return; } if (latest->version > ver2int(PACKAGE_VERSION)) { switch (fl_choice2(_("Version %s is available at\n\n%s\n\nWhat would you like to do?"), _("Close"), _("Visit URL"), _("Copy URL"), latest->version_str.c_str(), latest->url)) { case 1: cb_mnuVisitURL(NULL, (void*)latest->url); break; case 2: size_t n = strlen(latest->url); Fl::copy(latest->url, n, 0); Fl::copy(latest->url, n, 1); } } else fl_message2(_("You are running the latest version")); } void cb_mnuAboutURL(Fl_Widget*, void*) { if (!help_dialog) help_dialog = new Fl_Help_Dialog; help_dialog->value(szAbout); help_dialog->resize(help_dialog->x(), help_dialog->y(), help_dialog->w(), 440); help_dialog->show(); } void fldigi_help(const string& theHelp) { string htmlHelp = "" "" "" PACKAGE " Help" "" "" "" "

"; for (size_t i = 0; i < theHelp.length(); i++) { if (theHelp[i] == '\n') { if (theHelp[i+1] == '\n') { htmlHelp += "

"; i++; } else htmlHelp += "
"; } else if (theHelp[i] == ' ' && theHelp[i+1] == ' ') { htmlHelp += "  "; i++; } else htmlHelp += theHelp[i]; } htmlHelp += "

" "" ""; html_help(htmlHelp); } void cb_mnuCmdLineHelp(Fl_Widget*, void*) { extern string option_help; fldigi_help(option_help); restoreFocus(); } void cb_mnuBuildInfo(Fl_Widget*, void*) { extern string build_text; fldigi_help(build_text); restoreFocus(); } void cb_mnuDebug(Fl_Widget*, void*) { debug::show(); } #ifndef NDEBUG void cb_mnuFun(Fl_Widget*, void*) { fl_message2(_("Sunspot creation underway!")); } #endif void cb_mnuAudioInfo(Fl_Widget*, void*) { if (progdefaults.btnAudioIOis != SND_IDX_PORT) { fl_alert2(_("Audio device information is only available for the PortAudio backend")); return; } #if USE_PORTAUDIO size_t ndev; string devtext[2], headers[2]; SoundPort::devices_info(devtext[0], devtext[1]); if (devtext[0] != devtext[1]) { headers[0] = _("Capture device"); headers[1] = _("Playback device"); ndev = 2; } else { headers[0] = _("Capture and playback devices"); ndev = 1; } string audio_info; for (size_t i = 0; i < ndev; i++) { audio_info.append("

").append(headers[i]).append("

\n\n"); string::size_type j, n = 0; while ((j = devtext[i].find(": ", n)) != string::npos) { audio_info.append("") .append(""); if ((n = devtext[i].find('\n', j)) == string::npos) { devtext[i] += '\n'; n = devtext[i].length() - 1; } audio_info.append("") .append("\n"); } audio_info.append("
") .append(devtext[i].substr(n, j-n)) .append("") .append(devtext[i].substr(j+2, n-j-2)) .append("

\n"); } fldigi_help(audio_info); #endif } void cb_ShowConfig(Fl_Widget*, void*) { cb_mnuVisitURL(0, (void*)HomeDir.c_str()); } static void cb_ShowDATA(Fl_Widget*, void*) { /// Must be already created by createRecordLoader() dlgRecordLoader->show(); } bool ask_dir_creation( const std::string & dir ) { if ( 0 == directory_is_created(dir.c_str())) { int ans = fl_choice2(_("%s: Do not exist, create?"), _("No"), _("Yes"), 0, dir.c_str() ); if (!ans) return false ; return true ; } return false ; } void cb_ShowNBEMS(Fl_Widget*, void*) { if ( ask_dir_creation(NBEMS_dir)) { check_nbems_dirs(); } cb_mnuVisitURL(0, (void*)NBEMS_dir.c_str()); } void cb_ShowFLMSG(Fl_Widget*, void*) { if ( ask_dir_creation(FLMSG_dir)) { check_nbems_dirs(); } cb_mnuVisitURL(0, (void*)FLMSG_dir.c_str()); } void cbTune(Fl_Widget *w, void *) { Fl_Button *b = (Fl_Button *)w; if (!(active_modem->get_cap() & modem::CAP_TX)) { b->value(0); return; } if (b->value() == 1) { b->labelcolor(FL_RED); trx_tune(); } else { b->labelcolor(FL_FOREGROUND_COLOR); trx_receive(); } restoreFocus(); } void cbRSID(Fl_Widget *w, void *) { progdefaults.rsid = btnRSID->value(); progdefaults.changed = true; restoreFocus(); } void cbTxRSID(Fl_Widget *w, void*) { progdefaults.TransmitRSid = btnTxRSID->value(); progdefaults.changed = true; restoreFocus(); } void cbAutoSpot(Fl_Widget* w, void*) { progStatus.spot_recv = static_cast(w)->value(); } void toggleRSID() { btnRSID->value(0); cbRSID(NULL, NULL); } void cb_mnuDigiscope(Fl_Menu_ *w, void *d) { if (scopeview) scopeview->show(); } void cb_mnuViewer(Fl_Menu_ *, void *) { openViewer(); } void cb_mnuShowCountries(Fl_Menu_ *, void *) { notify_dxcc_show(); } void cb_mnuContest(Fl_Menu_ *m, void *) { if (QsoInfoFrame1A->visible()) { QsoInfoFrame1A->hide(); QsoInfoFrame1B->show(); } else { QsoInfoFrame1B->hide(); QsoInfoFrame1A->show(); } progStatus.contest = m->mvalue()->value(); } void set_macroLabels() { if (progdefaults.mbar2_pos) { altMacros = 1; for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[NUMMACKEYS + i]->label( macros.name[(altMacros * NUMMACKEYS) + i].c_str()); btnMacro[NUMMACKEYS + i]->redraw_label(); } btnAltMacros1->label("1"); btnAltMacros1->redraw_label(); btnAltMacros2->label("2"); btnAltMacros2->redraw_label(); } else { altMacros = 0; btnAltMacros1->label("1"); btnAltMacros1->redraw_label(); } for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[i]->label(macros.name[i].c_str()); btnMacro[i]->redraw_label(); } } void cb_mnuPicViewer(Fl_Menu_ *, void *) { if (picRxWin) { picRx->redraw(); picRxWin->show(); } } void cb_sldrSquelch(Fl_Slider* o, void*) { progStatus.sldrSquelchValue = o->value(); restoreFocus(); } static char ztbuf[20] = "20120602 123000"; const char* zdate(void) { return ztbuf; } const char* ztime(void) { return ztbuf + 9; } const char* zshowtime(void) { static char s[5]; strncpy(s, &ztbuf[9], 4); s[4] = 0; return (const char *)s; } void ztimer(void* first_call) { struct timeval tv; gettimeofday(&tv, NULL); if (first_call) { double st = 1.0 - tv.tv_usec / 1e6; Fl::repeat_timeout(st, ztimer); } else Fl::repeat_timeout(1.0, ztimer); struct tm tm; time_t t_temp; t_temp=(time_t)tv.tv_sec; gmtime_r(&t_temp, &tm); if (!strftime(ztbuf, sizeof(ztbuf), "%Y%m%d %H%M%S", &tm)) memset(ztbuf, 0, sizeof(ztbuf)); else ztbuf[8] = '\0'; inpTimeOff1->value(zshowtime()); inpTimeOff2->value(zshowtime()); inpTimeOff3->value(zshowtime()); } bool oktoclear = true; void updateOutSerNo() { if (contest_count.count) { char szcnt[10] = ""; contest_count.Format(progdefaults.ContestDigits, progdefaults.UseLeadingZeros); snprintf(szcnt, sizeof(szcnt), contest_count.fmt.c_str(), contest_count.count); outSerNo1->value(szcnt); outSerNo2->value(szcnt); } else { outSerNo1->value(""); outSerNo2->value(""); } } static string old_call; static string new_call; void clearQSO() { if (bWF_only) return; Fl_Input* in[] = { inpCall1, inpCall2, inpCall3, inpCall4, inpName1, inpName2, inpTimeOn1, inpTimeOn2, inpTimeOn3, inpRstIn1, inpRstIn2, inpRstOut1, inpRstOut2, inpQth, inpLoc, inpAZ, inpState, inpVEprov, inpCountry, inpSerNo1, inpSerNo2, outSerNo1, outSerNo2, inpXchgIn1, inpXchgIn2, inpNotes }; for (size_t i = 0; i < sizeof(in)/sizeof(*in); i++) in[i]->value(""); if (progdefaults.fixed599 && progStatus.contest) { inpRstIn1->value("599"); inpRstIn2->value("599"); inpRstOut1->value("599"); inpRstOut2->value("599"); } else { if (progdefaults.RSTdefault) inpRstOut1->value("599"); if (progdefaults.RSTin_default) inpRstIn1->value("599"); } updateOutSerNo(); if (inpSearchString) inpSearchString->value (""); old_call.clear(); new_call.clear(); qso_time.clear(); qso_exchange.clear(); oktoclear = true; LOGGING_colors_font(); } void cb_ResetSerNbr() { contest_count.count = progdefaults.ContestStart; updateOutSerNo(); } void cb_btnTimeOn(Fl_Widget* w, void*) { inpTimeOn->value(inpTimeOff->value(), inpTimeOff->size()); sTime_on = sTime_off = ztime(); sDate_on = sDate_off = zdate(); restoreFocus(); } void cb_loc(Fl_Widget* w, void*) { if ((oktoclear = !inpLoc->size()) || !progdefaults.autofill_qso_fields) return restoreFocus(w); double lon[2], lat[2], distance, azimuth; if (locator2longlat(&lon[0], &lat[0], progdefaults.myLocator.c_str()) == RIG_OK && locator2longlat(&lon[1], &lat[1], inpLoc->value()) == RIG_OK && qrb(lon[0], lat[0], lon[1], lat[1], &distance, &azimuth) == RIG_OK) { char az[4]; snprintf(az, sizeof(az), "%3.0f", azimuth); inpAZ->value(az); } restoreFocus(w); } void cb_call(Fl_Widget* w, void*) { if (bWF_only) return; if (progdefaults.calluppercase) { int pos = inpCall->position(); char* uc = new char[inpCall->size()]; transform(inpCall->value(), inpCall->value() + inpCall->size(), uc, static_cast(std::toupper)); inpCall->value(uc, inpCall->size()); inpCall->position(pos); delete [] uc; } new_call = inpCall->value(); if (inpCall == inpCall1) { inpCall2->value(new_call.c_str()); inpCall3->value(new_call.c_str()); inpCall4->value(new_call.c_str()); } else if (inpCall == inpCall2) { inpCall1->value(new_call.c_str()); inpCall3->value(new_call.c_str()); inpCall4->value(new_call.c_str()); } else if (inpCall == inpCall3) { inpCall1->value(new_call.c_str()); inpCall2->value(new_call.c_str()); inpCall4->value(new_call.c_str()); } else { inpCall1->value(new_call.c_str()); inpCall2->value(new_call.c_str()); inpCall3->value(new_call.c_str()); } if (progStatus.timer && (Fl::event() != FL_HIDE)) stopMacroTimer(); if (old_call == new_call || new_call.empty()) return restoreFocus(w); old_call = new_call; oktoclear = false; sDate_on = sDate_off = zdate(); sTime_on = sTime_off = ztime(); inpTimeOn->value(inpTimeOff->value()); if (inpTimeOn == inpTimeOn1) inpTimeOn2->value(inpTimeOn->value()); else inpTimeOn1->value(inpTimeOn->value()); SearchLastQSO(inpCall->value()); if (!inpAZ->value()[0] && progdefaults.autofill_qso_fields) { const struct dxcc* e = dxcc_lookup(inpCall->value()); if (e) { double lon, lat, distance, azimuth; if (locator2longlat(&lon, &lat, progdefaults.myLocator.c_str()) == RIG_OK && qrb(lon, lat, -e->longitude, e->latitude, &distance, &azimuth) == RIG_OK) { char az[4]; snprintf(az, sizeof(az), "%3.0f", azimuth); inpAZ->value(az, sizeof(az) - 1); } inpCountry->value(e->country); inpCountry->position(0); } } if (progdefaults.EnableDupCheck) DupCheck(); restoreFocus(w); } void cb_log(Fl_Widget* w, void*) { Fl_Input2 *inp = (Fl_Input2 *) w; if (inp == inpName1) inpName2->value(inpName1->value()); if (inp == inpName2) inpName1->value(inpName2->value()); if (inp == inpRstIn1) inpRstIn2->value(inpRstIn1->value()); if (inp == inpRstIn2) inpRstIn1->value(inpRstIn2->value()); if (inp == inpRstOut1) inpRstOut2->value(inpRstOut1->value()); if (inp == inpRstOut2) inpRstOut1->value(inpRstOut2->value()); if (inp == inpTimeOn1) { inpTimeOn2->value(inpTimeOn->value()); inpTimeOn3->value(inpTimeOn->value()); } if (inp == inpTimeOn2) { inpTimeOn1->value(inpTimeOn->value()); inpTimeOn3->value(inpTimeOn->value()); } if (inp == inpTimeOn3) { inpTimeOn1->value(inpTimeOn->value()); inpTimeOn2->value(inpTimeOn->value()); } if (inp == inpTimeOff1) { inpTimeOff2->value(inpTimeOff->value()); inpTimeOff3->value(inpTimeOff->value()); } if (inp == inpTimeOff2) { inpTimeOff1->value(inpTimeOff->value()); inpTimeOff3->value(inpTimeOff->value()); } if (inp == inpTimeOff3) { inpTimeOff1->value(inpTimeOff->value()); inpTimeOff2->value(inpTimeOff->value()); } if (inp == inpXchgIn1) inpXchgIn2->value(inpXchgIn1->value()); if (inp == inpXchgIn2) inpXchgIn1->value(inpXchgIn2->value()); if (inp->value()[0]) oktoclear = false; if (progdefaults.EnableDupCheck) { DupCheck(); } restoreFocus(w); } void cbClearCall(Fl_Widget *b, void *) { clearQSO(); restoreFocus(); } void qsoClear_cb(Fl_Widget *b, void *) { bool CLEARLOG = true; if (progdefaults.NagMe && !oktoclear) CLEARLOG = (fl_choice2(_("Clear log fields?"), _("Cancel"), _("OK"), NULL) == 1); if (CLEARLOG) { clearQSO(); } clear_Lookup(); restoreFocus(); } void qsoSave_cb(Fl_Widget *b, void *) { string havecall = inpCall->value(); string timeon = inpTimeOn->value(); while (!havecall.empty() && havecall[0] == ' ') havecall.erase(0,1); if (havecall.empty()) { fl_message2(_("Enter a CALL !")); restoreFocus(); return; } sDate_off = zdate(); sTime_off = ztime(); if (!timeon.empty()) sTime_on = timeon.c_str(); else sTime_on = sTime_off; submit_log(); if (progdefaults.ClearOnSave) clearQSO(); ReceiveText->mark(FTextBase::XMIT); restoreFocus(); } void qso_save_now() { string havecall = inpCall->value(); while (!havecall.empty() && havecall[0] == ' ') havecall.erase(0,1); if (havecall.empty()) return; sDate_off = zdate(); sTime_off = ztime(); submit_log(); if (progdefaults.ClearOnSave) clearQSO(); // ReceiveText->mark(FTextBase::XMIT); } void cb_QRZ(Fl_Widget *b, void *) { if (!*inpCall->value()) return restoreFocus(); switch (Fl::event_button()) { case FL_LEFT_MOUSE: CALLSIGNquery(); oktoclear = false; break; case FL_RIGHT_MOUSE: if (quick_choice(string("Spot \"").append(inpCall->value()).append("\"?").c_str(), 2, _("Confirm"), _("Cancel"), NULL) == 1) spot_manual(inpCall->value(), inpLoc->value()); break; default: break; } restoreFocus(); } void status_cb(Fl_Widget *b, void *arg) { if (Fl::event_button() == FL_RIGHT_MOUSE) { trx_mode md = active_modem->get_mode(); if (md >= MODE_OLIVIA && md <= MODE_OLIVIA_64_2000) { cb_oliviaCustom((Fl_Widget *)0, (void *)MODE_OLIVIA); } else { progdefaults.loadDefaults(); tabsConfigure->value(tabModems); tabsModems->value(modem_config_tab); #if USE_HAMLIB hamlib_restore_defaults(); #endif rigCAT_restore_defaults(); dlgConfig->show(); } } else { if (!quick_change) return; const Fl_Menu_Item *m = quick_change->popup(Fl::event_x(), Fl::event_y()); if (m && m->callback()) m->do_callback(0); } static_cast(b)->clear(); restoreFocus(); } void cbAFC(Fl_Widget *w, void *vi) { FL_LOCK_D(); Fl_Button *b = (Fl_Button *)w; int v = b->value(); FL_UNLOCK_D(); progStatus.afconoff = v; } void cbSQL(Fl_Widget *w, void *vi) { FL_LOCK_D(); Fl_Button *b = (Fl_Button *)w; int v = b->value(); FL_UNLOCK_D(); progStatus.sqlonoff = v ? true : false; } void startMacroTimer() { ENSURE_THREAD(FLMAIN_TID); btnMacroTimer->color(fl_rgb_color(240, 240, 0)); btnMacroTimer->clear_output(); Fl::add_timeout(0.0, macro_timer); } void stopMacroTimer() { ENSURE_THREAD(FLMAIN_TID); progStatus.timer = 0; progStatus.repeatMacro = -1; Fl::remove_timeout(macro_timer); Fl::remove_timeout(macro_timed_execute); btnMacroTimer->label(0); btnMacroTimer->color(FL_BACKGROUND_COLOR); btnMacroTimer->set_output(); } void macro_timer(void*) { char buf[8]; snprintf(buf, sizeof(buf), "%d", progStatus.timer); btnMacroTimer->copy_label(buf); if (progStatus.timer-- == 0) { stopMacroTimer(); macros.execute(progStatus.timerMacro); } else Fl::repeat_timeout(1.0, macro_timer); } void macro_timed_execute(void *) { if (exec_date == zdate() && exec_time == ztime()) { macros.timed_execute(); btnMacroTimer->label(0); btnMacroTimer->color(FL_BACKGROUND_COLOR); btnMacroTimer->set_output(); } else { Fl::repeat_timeout(1.0, macro_timed_execute); } } void startTimedExecute(std::string &title) { ENSURE_THREAD(FLMAIN_TID); Fl::add_timeout(0.0, macro_timed_execute); string txt = "Macro '"; txt.append(title).append("' scheduled at "); txt.append(exec_time).append(", on ").append(exec_date).append("\n"); btnMacroTimer->label("SKED"); btnMacroTimer->color(fl_rgb_color(240, 240, 0)); btnMacroTimer->redraw_label(); ReceiveText->clear(); ReceiveText->addstr(txt, FTextBase::CTRL); } void cbMacroTimerButton(Fl_Widget*, void*) { stopMacroTimer(); restoreFocus(); } void cb_RcvMixer(Fl_Widget *w, void *d) { progStatus.RcvMixer = valRcvMixer->value() / 100.0; mixer->setRcvGain(progStatus.RcvMixer); } void cb_XmtMixer(Fl_Widget *w, void *d) { progStatus.XmtMixer = valXmtMixer->value() / 100.0; mixer->setXmtLevel(progStatus.XmtMixer); } void cb_mvsquelch(Fl_Widget *w, void *d) { if (active_modem->get_mode() == MODE_RTTY) progStatus.VIEWER_rttysquelch = mvsquelch->value(); else progStatus.VIEWER_psksquelch = mvsquelch->value(); if (sldrViewerSquelch) sldrViewerSquelch->value(mvsquelch->value()); } void cb_btnClearMViewer(Fl_Widget *w, void *d) { if (brwsViewer) brwsViewer->clear(); mainViewer->clear(); if (pskviewer) pskviewer->clear(); if (rttyviewer) rttyviewer->clear(); } int default_handler(int event) { if (bWF_only) { if (Fl::event_key() == FL_Escape) return 1; return 0; } if (event != FL_SHORTCUT) return 0; if (RigViewerFrame && Fl::event_key() == FL_Escape && RigViewerFrame->visible() && Fl::event_inside(RigViewerFrame)) { CloseQsoView(); return 1; } Fl_Widget* w = Fl::focus(); int key = Fl::event_key(); if ((key == FL_F + 4) && Fl::event_alt()) clean_exit(true); if (fl_digi_main->contains(w)) { if (key == FL_Escape || (key >= FL_F && key <= FL_F_Last) || ((key == '1' || key == '2' || key == '3' || key == '4') && Fl::event_alt())) { TransmitText->take_focus(); TransmitText->handle(FL_KEYBOARD); return 1; } #ifdef __APPLE__ if ((key == '=') && (Fl::event_state() == FL_COMMAND)) #else if (key == '=' && Fl::event_alt()) #endif { progdefaults.txlevel += 0.1; if (progdefaults.txlevel > 0) progdefaults.txlevel = 0; cntTxLevel->value(progdefaults.txlevel); return 1; } #ifdef __APPLE__ if ((key == '-') && (Fl::event_state() == FL_COMMAND)) #else if (key == '-' && Fl::event_alt()) #endif { progdefaults.txlevel -= 0.1; if (progdefaults.txlevel < -30) progdefaults.txlevel = -30; cntTxLevel->value(progdefaults.txlevel); return 1; } } else if (dlgLogbook->contains(w)) return log_search_handler(event); else if ((Fl::event_key() == FL_Escape) || (Fl::event_ctrl() && ((key == 'z' || key == 'Z')) && TransmitText->visible_focus())) return 1; else if ( (fl_digi_main->contains(w) || dlgLogbook->contains(w)) && Fl::event_ctrl() ) return w->handle(FL_KEYBOARD); return 0; } int wo_default_handler(int event) { if (event != FL_SHORTCUT) return 0; if (RigViewerFrame && Fl::event_key() == FL_Escape && RigViewerFrame->visible() && Fl::event_inside(RigViewerFrame)) { CloseQsoView(); return 1; } Fl_Widget* w = Fl::focus(); int key = Fl::event_key(); if ((key == FL_F + 4) && Fl::event_alt()) clean_exit(true); if (fl_digi_main->contains(w)) { if (key == FL_Escape || (key >= FL_F && key <= FL_F_Last) || ((key == '1' || key == '2' || key == '3' || key == '4') && Fl::event_alt())) { return 1; } #ifdef __APPLE__ if ((key == '=') && (Fl::event_state() == FL_COMMAND)) #else if (key == '=' && Fl::event_alt()) #endif { progdefaults.txlevel += 0.1; if (progdefaults.txlevel > 0) progdefaults.txlevel = 0; cntTxLevel->value(progdefaults.txlevel); return 1; } #ifdef __APPLE__ if ((key == '-') && (Fl::event_state() == FL_COMMAND)) { #else if (key == '-' && Fl::event_alt()) { #endif progdefaults.txlevel -= 0.1; if (progdefaults.txlevel < -30) progdefaults.txlevel = -30; cntTxLevel->value(progdefaults.txlevel); return 1; } } else if (Fl::event_ctrl()) return w->handle(FL_KEYBOARD); return 0; } bool save_on_exit() { if (progdefaults.changed && progdefaults.SaveConfig) { switch (fl_choice2(_("Save changed configuration?"), _("Cancel"), _("Save"), _("Don't save"))) { case 0: return false; case 1: progdefaults.saveDefaults(); // fall through case 2: break; } } if (macros.changed && progdefaults.SaveMacros) { switch (fl_choice2(_("Save changed macros?"), _("Cancel"), _("Save"), _("Don't save"))) { case 0: return false; case 1: macros.writeMacroFile(); // fall through case 2: break; } } if (!oktoclear && progdefaults.NagMe) { switch (fl_choice2(_("Save current log entry?"), _("Cancel"), _("Save"), _("Don't save"))) { case 0: return false; case 1: qsoSave_cb(0, 0); // fall through case 2: break; } } return true; } bool clean_exit(bool ask) { if (progdefaults.confirmExit && (!(progdefaults.changed && progdefaults.SaveConfig) || !(macros.changed && progdefaults.SaveMacros) || !(!oktoclear && progdefaults.NagMe))) { switch (fl_choice2(_("Really want to quit?"), NULL, _("No"), _("Yes"))) { case 0: case 1: return false; case 2: break; } } if (ask) if (!save_on_exit()) return false; if (Maillogfile) Maillogfile->log_to_file_stop(); if (logfile) logfile->log_to_file_stop(); saveFreqList(); progStatus.saveLastState(); if (scopeview) scopeview->hide(); if (dlgViewer) dlgViewer->hide(); if (dlgLogbook) dlgLogbook->hide(); delete push2talk; #if USE_HAMLIB hamlib_close(); #endif rigCAT_close(); ADIF_RW_close(); if (mixer) mixer->closeMixer(); if (trx_state == STATE_RX || trx_state == STATE_TX || trx_state == STATE_TUNE) trx_state = STATE_ABORT; else { LOG_ERROR("trx in unexpected state %d", trx_state); exit(1); } while (trx_state != STATE_ENDED) { REQ_FLUSH(GET_THREAD_ID()); MilliSleep(10); } #if USE_HAMLIB if (xcvr) delete xcvr; #endif close_logbook(); MilliSleep(50); exit_process(); return true; } static bool restore_minimize = false; void UI_select() { if (bWF_only) return; Fl_Menu_Item* cf = getMenuItem(CONTEST_FIELDS_MLABEL); if (progStatus.NO_RIGLOG || progStatus.Rig_Contest_UI || progStatus.Rig_Log_UI) { cf->clear(); cf->deactivate(); } else { cf->activate(); if (progStatus.contest) cf->set(); getMenuItem(RIGLOG_FULL_MLABEL)->setonly(); } int x = macroFrame1->x(); int y1 = TopFrame1->y(); int w = TopFrame1->w(); int HTh = fl_digi_main->h() - wfpack->h() - hpack->h() - Hmacros - Hstatus; if (progStatus.NO_RIGLOG && !restore_minimize) { switch (progdefaults.mbar2_pos) { case 1: HTh -= Hmacros; macroFrame2->size(w, Hmacros); macroFrame2->position(x, y1); macroFrame2->show(); btnAltMacros1->deactivate(); y1 += Hmacros; if (progdefaults.EnableMixer) MixerFrame->resize(0, y1, sw, HTh); else MixerFrame->resize(0, y1, 0, HTh); text_panel->resize(MixerFrame->x() + MixerFrame->w(), y1, w - MixerFrame->w(), HTh); y1 += HTh; if (progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } wfpack->position(x, y1); y1 += wfpack->h(); if (!progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } hpack->position(x, y1); break; case 2: HTh -= Hmacros; if (progdefaults.EnableMixer) MixerFrame->resize(0, y1, sw, HTh); else MixerFrame->resize(0, y1, 0, HTh); text_panel->resize(MixerFrame->x() + MixerFrame->w(), y1, w - MixerFrame->w(), HTh); y1 += HTh; macroFrame2->size(w, Hmacros); macroFrame2->position(x, y1); macroFrame2->show(); btnAltMacros1->deactivate(); y1 += Hmacros; if (progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } wfpack->position(x, y1); y1 += wfpack->h(); if (!progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } hpack->position(x, y1); break; case 3: HTh -= Hmacros; if (progdefaults.EnableMixer) MixerFrame->resize(0, y1, sw, HTh); else MixerFrame->resize(0, y1, 0, HTh); text_panel->resize(MixerFrame->x() + MixerFrame->w(), y1, w - MixerFrame->w(), HTh); y1 += HTh; if (progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } wfpack->position(x, y1); y1 += wfpack->h(); macroFrame2->size(w, Hmacros); macroFrame2->position(x, y1); macroFrame2->show(); y1 += Hmacros; if (!progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } hpack->position(x, y1); y1 += hpack->h(); break; case 0: default: macroFrame2->size(macroFrame2->w(), 0); macroFrame2->hide(); btnAltMacros1->activate(); if (progdefaults.EnableMixer) MixerFrame->resize(0, y1, sw, HTh); else MixerFrame->resize(0, y1, 0, HTh); text_panel->resize(MixerFrame->x() + MixerFrame->w(), y1, w - MixerFrame->w(), HTh); y1 += HTh; if (progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } wfpack->position(x, y1); y1 += wfpack->h(); if (!progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } hpack->position(x, y1); break; } TopFrame1->hide(); TopFrame2->hide(); TopFrame3->hide(); Status2->hide(); inpCall4->show(); inpCall = inpCall4; goto UI_return; } if ((!progStatus.Rig_Log_UI && ! progStatus.Rig_Contest_UI) || restore_minimize) { y1 += (TopFrame1->h()); HTh -= (TopFrame1->h()); switch (progdefaults.mbar2_pos) { case 1: HTh -= Hmacros; macroFrame2->size(w, Hmacros); macroFrame2->position(x, y1); macroFrame2->show(); btnAltMacros1->deactivate(); y1 += Hmacros; if (progdefaults.EnableMixer) MixerFrame->resize(0, y1, sw, HTh); else MixerFrame->resize(0, y1, 0, HTh); text_panel->resize(MixerFrame->x() + MixerFrame->w(), y1, w - MixerFrame->w(), HTh); y1 += HTh; if (progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } wfpack->position(x, y1); y1 += wfpack->h(); if (!progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } hpack->position(x, y1); break; case 2: HTh -= Hmacros; if (progdefaults.EnableMixer) MixerFrame->resize(0, y1, sw, HTh); else MixerFrame->resize(0, y1, 0, HTh); text_panel->resize(MixerFrame->x() + MixerFrame->w(), y1, w - MixerFrame->w(), HTh); y1 += HTh; macroFrame2->size(w, Hmacros); macroFrame2->position(x, y1); macroFrame2->show(); btnAltMacros1->deactivate(); y1 += Hmacros; if (progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } wfpack->position(x, y1); y1 += wfpack->h(); if (!progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } hpack->position(x, y1); break; case 3: HTh -= Hmacros; if (progdefaults.EnableMixer) MixerFrame->resize(0, y1, sw, HTh); else MixerFrame->resize(0, y1, 0, HTh); text_panel->resize(MixerFrame->x() + MixerFrame->w(), y1, w - MixerFrame->w(), HTh); y1 += HTh; if (progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } wfpack->position(x, y1); y1 += wfpack->h(); macroFrame2->size(w, Hmacros); macroFrame2->position(x, y1); macroFrame2->show(); y1 += Hmacros; if (!progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } hpack->position(x, y1); btnAltMacros1->deactivate(); break; case 0: default: macroFrame2->size(macroFrame2->w(), 0); macroFrame2->hide(); btnAltMacros1->activate(); if (progdefaults.EnableMixer) MixerFrame->resize(0, y1, sw, HTh); else MixerFrame->resize(0, y1, 0, HTh); text_panel->resize(MixerFrame->x() + MixerFrame->w(), y1, w - MixerFrame->w(), HTh); y1 += HTh; if (progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } wfpack->position(x, y1); y1 += wfpack->h(); if (!progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } hpack->position(x, y1); break; } TopFrame2->hide(); TopFrame3->hide(); TopFrame1->show(); inpFreq = inpFreq1; inpCall = inpCall1; inpTimeOn = inpTimeOn1; inpTimeOff = inpTimeOff1; inpName = inpName1; inpRstIn = inpRstIn1; inpRstOut = inpRstOut1; inpSerNo = inpSerNo1; outSerNo = outSerNo1; inpXchgIn = inpXchgIn1; qsoFreqDisp = qsoFreqDisp1; goto UI_return; } else if (progStatus.Rig_Log_UI || progStatus.Rig_Contest_UI) { y1 += TopFrame2->h(); HTh -= TopFrame2->h(); switch (progdefaults.mbar2_pos) { case 1: HTh -= Hmacros; macroFrame2->size(w, Hmacros); macroFrame2->position(x, y1); macroFrame2->show(); btnAltMacros1->deactivate(); y1 += Hmacros; if (progdefaults.EnableMixer) MixerFrame->resize(0, y1, sw, HTh); else MixerFrame->resize(0, y1, 0, HTh); text_panel->resize(MixerFrame->x() + MixerFrame->w(), y1, w - MixerFrame->w(), HTh); y1 += HTh; if (progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } wfpack->position(x, y1); y1 += wfpack->h(); if (!progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += macroFrame1->h(); } hpack->position(x, y1); break; case 2: HTh -= Hmacros; if (progdefaults.EnableMixer) MixerFrame->resize(0, y1, sw, HTh); else MixerFrame->resize(0, y1, 0, HTh); text_panel->resize(MixerFrame->x() + MixerFrame->w(), y1, w - MixerFrame->w(), HTh); y1 += HTh; macroFrame2->size(w, Hmacros); macroFrame2->position(x, y1); macroFrame2->show(); btnAltMacros1->deactivate(); y1 += Hmacros; if (progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } wfpack->position(x, y1); y1 += wfpack->h(); if (!progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } hpack->position(x, y1); break; case 3: HTh -= Hmacros; if (progdefaults.EnableMixer) MixerFrame->resize(0, y1, sw, HTh); else MixerFrame->resize(0, y1, 0, HTh); text_panel->resize(MixerFrame->x() + MixerFrame->w(), y1, w - MixerFrame->w(), HTh); y1 += HTh; if (progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } wfpack->position(x, y1); y1 += wfpack->h(); macroFrame2->size(w, Hmacros); macroFrame2->position(x, y1); macroFrame2->show(); y1 += Hmacros; if (!progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } hpack->position(x, y1); btnAltMacros1->deactivate(); break; case 0: default: macroFrame2->size(macroFrame2->w(), 0); macroFrame2->hide(); btnAltMacros1->activate(); if (progdefaults.EnableMixer) MixerFrame->resize(0, y1, sw, HTh); else MixerFrame->resize(0, y1, 0, HTh); text_panel->resize(MixerFrame->x() + MixerFrame->w(), y1, w - MixerFrame->w(), HTh); y1 += HTh; if (progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } wfpack->position(x, y1); y1 += wfpack->h(); if (!progdefaults.mbar1_pos) { macroFrame1->position(x, y1); y1 += Hmacros; } hpack->position(x, y1); break; } if (progStatus.Rig_Log_UI) { TopFrame1->hide(); TopFrame3->hide(); TopFrame2->show(); inpCall = inpCall2; inpTimeOn = inpTimeOn2; inpTimeOff = inpTimeOff2; inpName = inpName2; inpSerNo = inpSerNo1; outSerNo = outSerNo1; inpRstIn = inpRstIn2; inpRstOut = inpRstOut2; qsoFreqDisp = qsoFreqDisp2; } else if (progStatus.Rig_Contest_UI) { TopFrame1->hide(); TopFrame2->hide(); TopFrame3->show(); inpCall = inpCall3; inpTimeOn = inpTimeOn3; inpTimeOff = inpTimeOff3; inpSerNo = inpSerNo2; outSerNo = outSerNo2; inpXchgIn = inpXchgIn2; qsoFreqDisp = qsoFreqDisp3; } } inpCall4->hide(); Status2->show(); UI_return: if (progStatus.show_channels) text_panel->position( text_panel->orgx(), text_panel->orgy(), text_panel->x() + (int)(1.0*text_panel->w()*progStatus.tile_x/progStatus.tile_w + 0.5), text_panel->y() + (int)(1.0*text_panel->h()*progStatus.tile_y/progStatus.tile_h + 0.5)); else text_panel->position( text_panel->orgx(), text_panel->orgy(), text_panel->x(), text_panel->y() + (int)(1.0*text_panel->h()*progStatus.tile_y/progStatus.tile_h + 0.5)); viewer_redraw(); fl_digi_main->init_sizes(); fl_digi_main->redraw(); } void cb_mnu_wf_all(Fl_Menu_* w, void *d) { wf->UI_select(progStatus.WF_UI = w->mvalue()->value()); } void cb_mnu_riglog(Fl_Menu_* w, void *d) { getMenuItem(w->mvalue()->label())->setonly(); progStatus.Rig_Log_UI = true; progStatus.Rig_Contest_UI = false; progStatus.NO_RIGLOG = false; UI_select(); } void cb_mnu_rigcontest(Fl_Menu_* w, void *d) { getMenuItem(w->mvalue()->label())->setonly(); progStatus.Rig_Contest_UI = true; progStatus.Rig_Log_UI = false; progStatus.NO_RIGLOG = false; UI_select(); } void cb_mnu_riglog_all(Fl_Menu_* w, void *d) { getMenuItem(w->mvalue()->label())->setonly(); progStatus.NO_RIGLOG = progStatus.Rig_Log_UI = progStatus.Rig_Contest_UI = false; UI_select(); } void cb_mnu_riglog_none(Fl_Menu_* w, void *d) { getMenuItem(w->mvalue()->label())->setonly(); progStatus.NO_RIGLOG = true; progStatus.Rig_Log_UI = false; progStatus.Rig_Contest_UI = false; UI_select(); } void cb_mnuDockedscope(Fl_Menu_ *w, void *d) { wf->show_scope(progStatus.DOCKEDSCOPE = w->mvalue()->value()); } void WF_UI() { wf->UI_select(progStatus.WF_UI); } static void cb_opmode_show(Fl_Widget* w, void*); static Fl_Menu_Item menu_[] = { {_("&File"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { make_icon_label(_("Folders")), 0, 0, 0, FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Fldigi config..."), folder_open_icon), 0, cb_ShowConfig, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("FLMSG files..."), folder_open_icon), 0, cb_ShowFLMSG, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("NBEMS files..."), folder_open_icon), 0, cb_ShowNBEMS, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Data files..."), folder_open_icon), 0, cb_ShowDATA, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { make_icon_label(_("Macros")), 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Open ..."), file_open_icon), 0, (Fl_Callback*)cb_mnuOpenMacro, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Save ..."), save_as_icon), 0, (Fl_Callback*)cb_mnuSaveMacro, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { make_icon_label(_("Text Capture")), 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { LOG_TO_FILE_MLABEL, 0, cb_logfile, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, #if USE_SNDFILE { make_icon_label(_("Audio")), 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, {_("RX capture"), 0, (Fl_Callback*)cb_mnuCapture, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {_("TX generate"), 0, (Fl_Callback*)cb_mnuGenerate, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {_("Playback"), 0, (Fl_Callback*)cb_mnuPlayback, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, #endif { make_icon_label(_("Exit"), log_out_icon), 'x', (Fl_Callback*)cb_E, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { OPMODES_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CW].name, 0, cb_init_mode, (void *)MODE_CW, 0, FL_NORMAL_LABEL, 0, 14, 0}, { CONTESTIA_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { "4/125", 0, cb_contestiaI, (void *)MODE_CONTESTIA, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { "4/250", 0, cb_contestiaA, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "8/250", 0, cb_contestiaB, (void *)MODE_CONTESTIA, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { "4/500", 0, cb_contestiaC, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "8/500", 0, cb_contestiaD, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "16/500", 0, cb_contestiaE, (void *)MODE_CONTESTIA, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { "8/1000", 0, cb_contestiaF, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "16/1000", 0, cb_contestiaG, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "32/1000", 0, cb_contestiaH, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "64/1000", 0, cb_contestiaJ, (void *)MODE_CONTESTIA, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_contestiaCustom, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"DominoEX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX4].name, 0, cb_init_mode, (void *)MODE_DOMINOEX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX5].name, 0, cb_init_mode, (void *)MODE_DOMINOEX5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX8].name, 0, cb_init_mode, (void *)MODE_DOMINOEX8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX11].name, 0, cb_init_mode, (void *)MODE_DOMINOEX11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX16].name, 0, cb_init_mode, (void *)MODE_DOMINOEX16, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX22].name, 0, cb_init_mode, (void *)MODE_DOMINOEX22, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX44].name, 0, cb_init_mode, (void *)MODE_DOMINOEX44, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX88].name, 0, cb_init_mode, (void *)MODE_DOMINOEX88, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Hell", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_FELDHELL].name, 0, cb_init_mode, (void *)MODE_FELDHELL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_SLOWHELL].name, 0, cb_init_mode, (void *)MODE_SLOWHELL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_HELLX5].name, 0, cb_init_mode, (void *)MODE_HELLX5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_HELLX9].name, 0, cb_init_mode, (void *)MODE_HELLX9, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_FSKHELL].name, 0, cb_init_mode, (void *)MODE_FSKHELL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_FSKH105].name, 0, cb_init_mode, (void *)MODE_FSKH105, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_HELL80].name, 0, cb_init_mode, (void *)MODE_HELL80, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"MFSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK4].name, 0, cb_init_mode, (void *)MODE_MFSK4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK11].name, 0, cb_init_mode, (void *)MODE_MFSK11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK22].name, 0, cb_init_mode, (void *)MODE_MFSK22, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK31].name, 0, cb_init_mode, (void *)MODE_MFSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK32].name, 0, cb_init_mode, (void *)MODE_MFSK32, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK64].name, 0, cb_init_mode, (void *)MODE_MFSK64, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK128].name, 0, cb_init_mode, (void *)MODE_MFSK128, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK64L].name, 0, cb_init_mode, (void *)MODE_MFSK64L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK128L].name, 0, cb_init_mode, (void *)MODE_MFSK128L, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"MT63", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_500S].name, 0, cb_init_mode, (void *)MODE_MT63_500S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_500L].name, 0, cb_init_mode, (void *)MODE_MT63_500L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_1000S].name, 0, cb_init_mode, (void *)MODE_MT63_1000S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_1000L].name, 0, cb_init_mode, (void *)MODE_MT63_1000L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_2000S].name, 0, cb_init_mode, (void *)MODE_MT63_2000S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_2000L].name, 0, cb_init_mode, (void *)MODE_MT63_2000L, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { OLIVIA_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_32_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_64_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_oliviaCustom, (void *)MODE_OLIVIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"PSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK31].name, 0, cb_init_mode, (void *)MODE_PSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK63].name, 0, cb_init_mode, (void *)MODE_PSK63, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK63F].name, 0, cb_init_mode, (void *)MODE_PSK63F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK125].name, 0, cb_init_mode, (void *)MODE_PSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK250].name, 0, cb_init_mode, (void *)MODE_PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK500].name, 0, cb_init_mode, (void *)MODE_PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK1000].name, 0, cb_init_mode, (void *)MODE_PSK1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"MultiCarrier", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_12X_PSK125].name, 0, cb_init_mode, (void *)MODE_12X_PSK125, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_6X_PSK250].name, 0, cb_init_mode, (void *)MODE_6X_PSK250, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK500].name, 0, cb_init_mode, (void *)MODE_2X_PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK500].name, 0, cb_init_mode, (void *)MODE_4X_PSK500, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK800].name, 0, cb_init_mode, (void *)MODE_2X_PSK800, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK1000].name, 0, cb_init_mode, (void *)MODE_2X_PSK1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {"QPSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK31].name, 0, cb_init_mode, (void *)MODE_QPSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK63].name, 0, cb_init_mode, (void *)MODE_QPSK63, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK125].name, 0, cb_init_mode, (void *)MODE_QPSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK250].name, 0, cb_init_mode, (void *)MODE_QPSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK500].name, 0, cb_init_mode, (void *)MODE_QPSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"PSKR", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK125R].name, 0, cb_init_mode, (void *)MODE_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK250R].name, 0, cb_init_mode, (void *)MODE_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK500R].name, 0, cb_init_mode, (void *)MODE_PSK500R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK1000R].name, 0, cb_init_mode, (void *)MODE_PSK1000R, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"MultiCarrier", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK63R].name, 0, cb_init_mode, (void *)MODE_4X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_5X_PSK63R].name, 0, cb_init_mode, (void *)MODE_5X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_10X_PSK63R].name, 0, cb_init_mode, (void *)MODE_10X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_20X_PSK63R].name, 0, cb_init_mode, (void *)MODE_20X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_32X_PSK63R].name, 0, cb_init_mode, (void *)MODE_32X_PSK63R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK125R].name, 0, cb_init_mode, (void *)MODE_4X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_5X_PSK125R].name, 0, cb_init_mode, (void *)MODE_5X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_10X_PSK125R].name, 0, cb_init_mode, (void *)MODE_10X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_12X_PSK125R].name, 0, cb_init_mode, (void *)MODE_12X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_16X_PSK125R].name, 0, cb_init_mode, (void *)MODE_16X_PSK125R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK250R].name, 0, cb_init_mode, (void *)MODE_2X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_3X_PSK250R].name, 0, cb_init_mode, (void *)MODE_3X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_5X_PSK250R].name, 0, cb_init_mode, (void *)MODE_5X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_6X_PSK250R].name, 0, cb_init_mode, (void *)MODE_6X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_7X_PSK250R].name, 0, cb_init_mode, (void *)MODE_7X_PSK250R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK500R].name, 0, cb_init_mode, (void *)MODE_2X_PSK500R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_3X_PSK500R].name, 0, cb_init_mode, (void *)MODE_3X_PSK500R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK500R].name, 0, cb_init_mode, (void *)MODE_4X_PSK500R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK800R].name, 0, cb_init_mode, (void *)MODE_2X_PSK800R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK1000R].name, 0, cb_init_mode, (void *)MODE_2X_PSK1000R, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, { RTTY_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-45", 0, cb_rtty45, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-50", 0, cb_rtty50, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-75N", 0, cb_rtty75N, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-75W", 0, cb_rtty75W, (void *)MODE_RTTY, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_rttyCustom, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"THOR", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR4].name, 0, cb_init_mode, (void *)MODE_THOR4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR5].name, 0, cb_init_mode, (void *)MODE_THOR5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR8].name, 0, cb_init_mode, (void *)MODE_THOR8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR11].name, 0, cb_init_mode, (void *)MODE_THOR11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR16].name, 0, cb_init_mode, (void *)MODE_THOR16, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR22].name, 0, cb_init_mode, (void *)MODE_THOR22, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR25x4].name, 0, cb_init_mode, (void *)MODE_THOR25x4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR50x1].name, 0, cb_init_mode, (void *)MODE_THOR50x1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR50x2].name, 0, cb_init_mode, (void *)MODE_THOR50x2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR100].name, 0, cb_init_mode, (void *)MODE_THOR100, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Throb", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB1].name, 0, cb_init_mode, (void *)MODE_THROB1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB2].name, 0, cb_init_mode, (void *)MODE_THROB2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB4].name, 0, cb_init_mode, (void *)MODE_THROB4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX1].name, 0, cb_init_mode, (void *)MODE_THROBX1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX2].name, 0, cb_init_mode, (void *)MODE_THROBX2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX4].name, 0, cb_init_mode, (void *)MODE_THROBX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"WEFAX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_WEFAX_576].name, 0, cb_init_mode, (void *)MODE_WEFAX_576, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_WEFAX_288].name, 0, cb_init_mode, (void *)MODE_WEFAX_288, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Navtex/SitorB", 0, 0, 0, FL_SUBMENU | FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_NAVTEX].name, 0, cb_init_mode, (void *)MODE_NAVTEX, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_SITORB].name, 0, cb_init_mode, (void *)MODE_SITORB, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { mode_info[MODE_WWV].name, 0, cb_init_mode, (void *)MODE_WWV, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_ANALYSIS].name, 0, cb_init_mode, (void *)MODE_ANALYSIS, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_NULL].name, 0, cb_init_mode, (void *)MODE_NULL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_SSB].name, 0, cb_init_mode, (void *)MODE_SSB, 0, FL_NORMAL_LABEL, 0, 14, 0}, { OPMODES_FEWER, 0, cb_opmode_show, 0, FL_MENU_INVISIBLE, FL_NORMAL_LABEL, FL_HELVETICA_ITALIC, 14, 0 }, {0,0,0,0,0,0,0,0,0}, {_("&Configure"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { make_icon_label(_("Operator"), system_users_icon), 0, (Fl_Callback*)cb_mnuConfigOperator, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Colors && Fonts")), 0, (Fl_Callback*)cb_mnuConfigFonts, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("User Interface")), 0, (Fl_Callback*)cb_mnuUI, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Waterfall"), waterfall_icon), 0, (Fl_Callback*)cb_mnuConfigWaterfall, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Waterfall controls")), 0, (Fl_Callback*)cb_mnuConfigWFcontrols, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Modems"), emblems_system_icon), 0, (Fl_Callback*)cb_mnuConfigModems, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(RIGCONTROL_MLABEL, multimedia_player_icon), 0, (Fl_Callback*)cb_mnuConfigRigCtrl, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Sound Card"), audio_card_icon), 0, (Fl_Callback*)cb_mnuConfigSoundCard, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("IDs")), 0, (Fl_Callback*)cb_mnuConfigID, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Misc")), 0, (Fl_Callback*)cb_mnuConfigMisc, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Autostart")), 0, (Fl_Callback*)cb_mnuConfigAutostart, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Notifications")), 0, (Fl_Callback*)cb_mnuConfigNotify, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(CONTEST_MLABEL), 0, (Fl_Callback*)cb_mnuConfigContest, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("QRZ/eQSL"), net_icon), 0, (Fl_Callback*)cb_mnuConfigQRZ, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Save Config"), save_icon), 0, (Fl_Callback*)cb_mnuSaveConfig, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { VIEW_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { make_icon_label(_("View/Hide Channels")), 'v', (Fl_Callback*)cb_view_hide_channels, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Floating scope"), utilities_system_monitor_icon), 'd', (Fl_Callback*)cb_mnuDigiscope, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(MFSK_IMAGE_MLABEL, image_icon), 'm', (Fl_Callback*)cb_mnuPicViewer, 0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(WEFAX_RX_IMAGE_MLABEL, image_icon), 'w', (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_rx,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(WEFAX_TX_IMAGE_MLABEL, image_icon), 't', (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_tx,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Signal browser")), 's', (Fl_Callback*)cb_mnuViewer, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(COUNTRIES_MLABEL), 'o', (Fl_Callback*)cb_mnuShowCountries, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Controls")), 0, 0, 0, FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { RIGLOG_FULL_MLABEL, 0, (Fl_Callback*)cb_mnu_riglog_all, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, { RIGLOG_MLABEL, 0, (Fl_Callback*)cb_mnu_riglog, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, { RIGCONTEST_MLABEL, 0, (Fl_Callback*)cb_mnu_rigcontest, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, { RIGLOG_NONE_MLABEL, 0, (Fl_Callback*)cb_mnu_riglog_none, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, { CONTEST_FIELDS_MLABEL, 'c', (Fl_Callback*)cb_mnuContest, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { make_icon_label(_("Waterfall")), 0, 0, 0, FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { DOCKEDSCOPE_MLABEL, 0, (Fl_Callback*)cb_mnuDockedscope, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, { WF_MLABEL, 0, (Fl_Callback*)cb_mnu_wf_all, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, { _("&Logbook"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { make_icon_label(_("View")), 'l', (Fl_Callback*)cb_mnuShowLogbook, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("ADIF")), 0, 0, 0, FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Merge...")), 0, (Fl_Callback*)cb_mnuMergeADIF_log, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Export...")), 0, (Fl_Callback*)cb_mnuExportADIF_log, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { make_icon_label(_("Reports")), 0, 0, 0, FL_SUBMENU | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Text...")), 0, (Fl_Callback*)cb_mnuExportTEXT_log, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("CSV...")), 0, (Fl_Callback*)cb_mnuExportCSV_log, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Cabrillo...")), 0, (Fl_Callback*)cb_Export_Cabrillo, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { make_icon_label(_("New")), 0, (Fl_Callback*)cb_mnuNewLogbook, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Open...")), 0, (Fl_Callback*)cb_mnuOpenLogbook, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Save")), 0, (Fl_Callback*)cb_mnuSaveLogbook, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { LOG_CONNECT_SERVER, 0, cb_log_server, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {" ", 0, 0, 0, FL_MENU_INACTIVE, FL_NORMAL_LABEL, 0, 14, 0}, {_("&Help"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, #ifndef NDEBUG // settle the gmfsk vs fldigi argument once and for all { make_icon_label(_("Create sunspots"), weather_clear_icon), 0, cb_mnuFun, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, #endif { make_icon_label(_("Beginners' Guide"), start_here_icon), 0, cb_mnuBeginnersURL, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Online documentation..."), help_browser_icon), 0, cb_mnuVisitURL, (void *)PACKAGE_DOCS, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Fldigi web site..."), net_icon), 0, cb_mnuVisitURL, (void *)PACKAGE_HOME, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Reception reports..."), pskr_icon), 0, cb_mnuVisitPSKRep, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Command line options"), utilities_terminal_icon), 0, cb_mnuCmdLineHelp, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Audio device info"), audio_card_icon), 0, cb_mnuAudioInfo, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Build info"), executable_icon), 0, cb_mnuBuildInfo, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Event log"), dialog_information_icon), 0, cb_mnuDebug, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Check for updates..."), system_software_update_icon), 0, cb_mnuCheckUpdate, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("&About"), help_about_icon), 'a', cb_mnuAboutURL, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {" ", 0, 0, 0, FL_MENU_INACTIVE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, }; static int count_visible_items(Fl_Menu_Item* menu) { int n = 0; if (menu->flags & FL_SUBMENU) menu++; while (menu->label()) { if (menu->visible()) n++; menu++; } return n; } static bool modes_hidden; static void cb_opmode_show(Fl_Widget* w, void*) { Fl_Menu_* m = (Fl_Menu_*)w; const char* label = m->mvalue()->label(); Fl_Menu_Item *item = 0, *first = 0, *last = 0; item = first = getMenuItem(OPMODES_MLABEL) + 1; if (!strcmp(label, OPMODES_ALL)) { last = getMenuItem(OPMODES_ALL); while (item != last) { if (item->label()) item->show(); item++; } menu_[m->value()].label(OPMODES_FEWER); modes_hidden = false; } else { last = getMenuItem(OPMODES_FEWER); while (item != last) { if (item->label() && item->callback() == cb_init_mode) { intptr_t mode = (intptr_t)item->user_data(); if (mode < NUM_RXTX_MODES) { if (progdefaults.visible_modes.test(mode)) item->show(); else item->hide(); } } item++; } item = first; while (item != last) { if (item->flags & FL_SUBMENU) { if (count_visible_items(item)) item->show(); else item->hide(); } item++; } if (progdefaults.visible_modes.test(MODE_OLIVIA)) getMenuItem("Olivia")->show(); else getMenuItem("Olivia")->hide(); if (progdefaults.visible_modes.test(MODE_CONTESTIA)) getMenuItem("Contestia")->show(); else getMenuItem("Contestia")->hide(); if (progdefaults.visible_modes.test(MODE_RTTY)) getMenuItem("RTTY")->show(); else getMenuItem("RTTY")->hide(); menu_[m->value()].label(OPMODES_ALL); modes_hidden = true; } m->redraw(); } void toggle_visible_modes(Fl_Widget*, void*) { Fl_Menu_Item* show_modes = modes_hidden ? getMenuItem(OPMODES_ALL) : getMenuItem(OPMODES_FEWER); if (!(~progdefaults.visible_modes).none()) { // some modes disabled show_modes->label(OPMODES_FEWER); show_modes->show(); (show_modes - 1)->flags |= FL_MENU_DIVIDER; mnu->value(show_modes); show_modes->do_callback(mnu, (void*)0); } else { mnu->value(show_modes); show_modes->do_callback(mnu, (void*)0); show_modes->hide(); (show_modes - 1)->flags &= ~FL_MENU_DIVIDER; } } Fl_Menu_Item *getMenuItem(const char *caption, Fl_Menu_Item* submenu) { if (submenu == 0 || !(submenu->flags & FL_SUBMENU)) { if ( menu_->size() != sizeof(menu_)/sizeof(*menu_) ) { LOG_ERROR("FIXME: the menu_ table is corrupt!"); abort(); } submenu = menu_; } int size = submenu->size() - 1; Fl_Menu_Item *item = 0; const char* label; for (int i = 0; i < size; i++) { label = (submenu[i].labeltype() == _FL_MULTI_LABEL) ? get_icon_label_text(&submenu[i]) : submenu[i].text; if (label && !strcmp(label, caption)) { item = submenu + i; break; } } if (!item) { LOG_ERROR("FIXME: could not find menu item \"%s\"", caption); abort(); } return item; } void activate_wefax_image_item(bool b) { /// Maybe do not do anything if the new modem has activated this menu item. /// This is necessary because of trx_start_modem_loop which deletes /// the current modem after the new one is created.. if( ( b == false ) && ( active_modem->get_cap() & modem::CAP_IMG ) && ( active_modem->get_mode() >= MODE_WEFAX_FIRST ) && ( active_modem->get_mode() <= MODE_WEFAX_LAST ) ) { return ; } Fl_Menu_Item *wefax_rx_item = getMenuItem(WEFAX_RX_IMAGE_MLABEL); if (wefax_rx_item) set_active(wefax_rx_item, b); Fl_Menu_Item *wefax_tx_item = getMenuItem(WEFAX_TX_IMAGE_MLABEL); if (wefax_tx_item) set_active(wefax_tx_item, b); } void activate_menu_item(const char *caption, bool val) { Fl_Menu_Item *m = getMenuItem(caption); set_active(m, val); } void activate_mfsk_image_item(bool b) { Fl_Menu_Item *mfsk_item = getMenuItem(MFSK_IMAGE_MLABEL); if (mfsk_item) set_active(mfsk_item, b); } int rightof(Fl_Widget* w) { int a = w->align(); fl_font(FL_HELVETICA, FL_NORMAL_SIZE); int lw = static_cast(ceil(fl_width(w->label()))); if (a & FL_ALIGN_INSIDE) return w->x() + w->w(); if (a & (FL_ALIGN_TOP | FL_ALIGN_BOTTOM)) { if (a & FL_ALIGN_LEFT) return w->x() + MAX(w->w(), lw); else if (a & FL_ALIGN_RIGHT) return w->x() + w->w(); else return w->x() + ((lw > w->w()) ? (lw - w->w())/2 : w->w()); } else return w->x() + w->w() + lw; } int leftof(Fl_Widget* w) { unsigned int a = w->align(); if (a == FL_ALIGN_CENTER || a & FL_ALIGN_INSIDE) return w->x(); fl_font(FL_HELVETICA, FL_NORMAL_SIZE); int lw = static_cast(ceil(fl_width(w->label()))); if (a & (FL_ALIGN_TOP | FL_ALIGN_BOTTOM)) { if (a & FL_ALIGN_LEFT) return w->x(); else if (a & FL_ALIGN_RIGHT) return w->x() - (lw > w->w() ? lw - w->w() : 0); else return w->x() - (lw > w->w() ? (lw - w->w())/2 : 0); } else { if (a & FL_ALIGN_LEFT) return w->x() - lw; else return w->x(); } } int above(Fl_Widget* w) { unsigned int a = w->align(); if (a == FL_ALIGN_CENTER || a & FL_ALIGN_INSIDE) return w->y(); return (a & FL_ALIGN_TOP) ? w->y() + FL_NORMAL_SIZE : w->y(); } int below(Fl_Widget* w) { unsigned int a = w->align(); if (a == FL_ALIGN_CENTER || a & FL_ALIGN_INSIDE) return w->y() + w->h(); return (a & FL_ALIGN_BOTTOM) ? w->y() + w->h() + FL_NORMAL_SIZE : w->y() + w->h(); } string main_window_title; void update_main_title() { string buf = main_window_title; buf.append(" - "); if (bWF_only) buf.append(_("waterfall-only mode")); else buf.append(progdefaults.myCall.empty() ? _("NO CALLSIGN SET") : progdefaults.myCall.c_str()); if (fl_digi_main) fl_digi_main->copy_label(buf.c_str()); } void showOpBrowserView(Fl_Widget *, void *) { if (RigViewerFrame->visible()) return CloseQsoView(); QsoInfoFrame1->hide(); QsoInfoFrame2->hide(); QsoButtonFrame->hide(); RigViewerFrame->show(); qso_opPICK->box(FL_DOWN_BOX); qso_opBrowser->take_focus(); qso_opPICK->tooltip(_("Close List")); } void CloseQsoView() { RigViewerFrame->hide(); QsoInfoFrame1->show(); QsoInfoFrame2->show(); QsoButtonFrame->show(); qso_opPICK->box(FL_UP_BOX); qso_opPICK->tooltip(_("Open List")); if (restore_minimize) { restore_minimize = false; UI_select(); } } void showOpBrowserView2(Fl_Widget *w, void *) { restore_minimize = true; UI_select(); showOpBrowserView(w, NULL); } void cb_qso_btnSelFreq(Fl_Widget *, void *) { qso_selectFreq(); } void cb_qso_btnDelFreq(Fl_Widget *, void *) { qso_delFreq(); } void cb_qso_btnAddFreq(Fl_Widget *, void *) { qso_addFreq(); } void cb_qso_btnClearList(Fl_Widget *, void *) { if (quick_choice(_("Clear list?"), 2, _("Confirm"), _("Cancel"), NULL) == 1) clearList(); } void cb_qso_inpAct(Fl_Widget*, void*) { string data, url; data.reserve(128); url = "http://pskreporter.info/cgi-bin/psk-freq.pl"; if (qso_inpAct->size()) url.append("?grid=").append(qso_inpAct->value()); else if (progdefaults.myLocator.length() > 2) url.append("?grid=").append(progdefaults.myLocator, 0, 2); string::size_type i; if (!fetch_http_gui(url, data, 10.0) || (i = data.find("\r\n\r\n")) == string::npos) { LOG_ERROR("Error while fetching \"%s\": %s", url.c_str(), data.c_str()); return; } i += strlen("\r\n\r\n"); re_t re("([[:digit:]]{6,}) [[:digit:]]+ ([[:digit:]]+)[[:space:]]+", REG_EXTENDED); const size_t menu_max = 8; Fl_Menu_Item menu[menu_max + 1]; string str[menu_max]; size_t j = 0; memset(menu, 0, sizeof(menu)); while (re.match(data.c_str() + i) && j < menu_max) { i += re.submatch(0).length(); str[j].assign(re.submatch(1)).append(" (").append(re.submatch(2)). append(" ").append(atoi(re.submatch(2).c_str()) == 1 ? _("report") : _("reports")).append(")"); menu[j].label(str[j].c_str()); menu[++j].label(NULL); } if ((i = data.find(" grid ", i)) != string::npos) data.assign(data, i + strlen(" grid"), 3); else data = " (?)"; if (j) data.insert(0, _("Recent activity for grid")); else data = "No recent activity"; if ((j = quick_choice_menu(data.c_str(), 1, menu))) qsy(strtoll(str[j - 1].erase(str[j - 1].find(' ')).c_str(), NULL, 10)); } void cb_qso_opBrowser(Fl_Browser*, void*) { int i = qso_opBrowser->value(); if (!i) return; // This makes the multi browser behave more like a hold browser, // but with the ability to invoke the callback via space/return. qso_opBrowser->deselect(); qso_opBrowser->select(i); switch (i = Fl::event_key()) { case FL_Enter: case FL_KP_Enter: case FL_Button + FL_LEFT_MOUSE: if (i == FL_Button + FL_LEFT_MOUSE && !Fl::event_clicks()) break; qso_selectFreq(); CloseQsoView(); break; case ' ': case FL_Button + FL_RIGHT_MOUSE: qso_setFreq(); break; case FL_Button + FL_MIDDLE_MOUSE: i = qso_opBrowser->value(); qso_delFreq(); qso_addFreq(); qso_opBrowser->select(i); break; } } void _show_frequency(long long freq) { qsoFreqDisp1->value(freq); qsoFreqDisp2->value(freq); qsoFreqDisp3->value(freq); } void show_frequency(long long freq) { REQ(_show_frequency, freq); } void show_mode(const string& sMode) { REQ(&Fl_ComboBox::put_value, qso_opMODE, sMode.c_str()); } void show_bw(const string& sWidth) { REQ(&Fl_ComboBox::put_value, qso_opBW, sWidth.c_str()); } void show_spot(bool v) { //if (bWF_only) return; static bool oldval = false; if (v) { mnu->size(btnAutoSpot->x(), mnu->h()); if (oldval) progStatus.spot_recv = true; btnAutoSpot->value(progStatus.spot_recv); btnAutoSpot->activate(); } else { btnAutoSpot->deactivate(); oldval = btnAutoSpot->value(); btnAutoSpot->value(v); btnAutoSpot->do_callback(); mnu->size(btnRSID->x(), mnu->h()); } mnu->redraw(); } void setTabColors() { tabsColors->selection_color(progdefaults.TabsColor); tabsConfigure->selection_color(progdefaults.TabsColor); tabsUI->selection_color(progdefaults.TabsColor); tabsWaterfall->selection_color(progdefaults.TabsColor); tabsModems->selection_color(progdefaults.TabsColor); tabsCW->selection_color(progdefaults.TabsColor); tabsRig->selection_color(progdefaults.TabsColor); tabsSoundCard->selection_color(progdefaults.TabsColor); tabsMisc->selection_color(progdefaults.TabsColor); tabsID->selection_color(progdefaults.TabsColor); tabsQRZ->selection_color(progdefaults.TabsColor); if (dlgConfig->visible()) dlgConfig->redraw(); } void showMacroSet() { set_macroLabels(); } void showDTMF(const string s) { string dtmfstr = "\n "; dtmfstr.append(s); ReceiveText->addstr(dtmfstr); } void setwfrange() { wf->opmode(); } void sync_cw_parameters() { active_modem->sync_parameters(); active_modem->update_Status(); } void cb_cntCW_WPM(Fl_Widget * w, void *v) { Fl_Counter2 *cnt = (Fl_Counter2 *) w; progdefaults.CWspeed = (int)cnt->value(); sldrCWxmtWPM->value(progdefaults.CWspeed); progdefaults.changed = true; sync_cw_parameters(); restoreFocus(); } void cb_btnCW_Default(Fl_Widget *w, void *v) { active_modem->toggleWPM(); restoreFocus(); } static void cb_mainViewer_Seek(Fl_Input *, void *) { static const Fl_Color seek_color[2] = { FL_FOREGROUND_COLOR, adjust_color(FL_RED, FL_BACKGROUND2_COLOR) }; // invalid RE seek_re.recompile(*txtInpSeek->value() ? txtInpSeek->value() : "[invalid"); if (txtInpSeek->textcolor() != seek_color[!seek_re]) { txtInpSeek->textcolor(seek_color[!seek_re]); txtInpSeek->redraw(); } progStatus.browser_search = txtInpSeek->value(); if (viewer_inp_seek) viewer_inp_seek->value(progStatus.browser_search.c_str()); } static void cb_cntTxLevel(Fl_Counter2* o, void*) { progdefaults.txlevel = o->value(); } static void cb_mainViewer(Fl_Hold_Browser*, void*) { if (!pskviewer && !rttyviewer) return; int sel = mainViewer->value(); if (sel == 0 || sel > progdefaults.VIEWERchannels) return; switch (Fl::event_button()) { case FL_LEFT_MOUSE: if (mainViewer->freq(sel) != NULLFREQ) { if (progdefaults.VIEWERhistory){ ReceiveText->addchr('\n', FTextBase::RECV); bHistory = true; } else { ReceiveText->addchr('\n', FTextBase::ALTR); ReceiveText->addstr(mainViewer->line(sel), FTextBase::ALTR); } active_modem->set_freq(mainViewer->freq(sel)); active_modem->set_sigsearch(SIGSEARCH); if (brwsViewer) brwsViewer->select(sel); } else mainViewer->deselect(); break; case FL_MIDDLE_MOUSE: // copy from modem // set_freq(sel, active_modem->get_freq()); break; case FL_RIGHT_MOUSE: // reset { int ch = progdefaults.VIEWERascend ? progdefaults.VIEWERchannels - sel : sel - 1; if (pskviewer) pskviewer->clearch(ch); if (rttyviewer) rttyviewer->clearch(ch); mainViewer->deselect(); if (brwsViewer) brwsViewer->deselect(); break; } default: break; } } void widget_color_font(Fl_Widget *widget) { widget->labelsize(progdefaults.LOGGINGtextsize); widget->labelfont(progdefaults.LOGGINGtextfont); widget->labelcolor(progdefaults.LOGGINGtextcolor); widget->color(progdefaults.LOGGINGcolor); widget->redraw_label(); widget->redraw(); } void input_color_font(Fl_Input *input) { input->textsize(progdefaults.LOGGINGtextsize); input->textfont(progdefaults.LOGGINGtextfont); input->textcolor(progdefaults.LOGGINGtextcolor); input->color(progdefaults.LOGGINGcolor); input->redraw(); } void counter_color_font(Fl_Counter2 * cntr) { cntr->textsize(progdefaults.LOGGINGtextsize); cntr->textfont(progdefaults.LOGGINGtextfont); cntr->textcolor(progdefaults.LOGGINGtextcolor); // cntr->labelcolor(progdefaults.LOGGINGcolor); cntr->textbkcolor(progdefaults.LOGGINGcolor); cntr->redraw(); } void combo_color_font(Fl_ComboBox *cbo) { cbo->color(progdefaults.LOGGINGcolor); cbo->selection_color(progdefaults.LOGGINGcolor); cbo->textfont(progdefaults.LOGGINGtextfont); cbo->textsize(progdefaults.LOGGINGtextsize); cbo->textcolor(progdefaults.LOGGINGtextcolor); cbo->redraw(); cbo->redraw_label(); } void LOGGING_colors_font() { // int wh = fl_height(progdefaults.LOGGINGtextfont, progdefaults.LOGGINGtextsize) + 4; // input / output fields Fl_Input* in[] = { inpFreq1, inpCall1, inpCall2, inpCall3, inpCall4, inpName1, inpName2, inpTimeOn1, inpTimeOn2, inpTimeOn3, inpTimeOff1, inpTimeOff2, inpTimeOff3, inpRstIn1, inpRstIn2, inpRstOut1, inpRstOut2, inpQth, inpLoc, inpAZ, inpState, inpVEprov, inpCountry, inpSerNo1, inpSerNo2, outSerNo1, outSerNo2, inpXchgIn1, inpXchgIn2 }; for (size_t i = 0; i < sizeof(in)/sizeof(*in); i++) { input_color_font(in[i]); // in[i]->size(in[i]->w(), wh); } input_color_font(inpNotes); // inpNotes->size(inpNotes->w(), wh*2); // buttons, boxes Fl_Widget *wid[] = { MODEstatus, Status1, Status2, StatusBar, WARNstatus }; for (size_t i = 0; i < sizeof(wid)/sizeof(*wid); i++) widget_color_font(wid[i]); // counters counter_color_font(cntCW_WPM); counter_color_font(cntTxLevel); counter_color_font(wf->wfRefLevel); counter_color_font(wf->wfAmpSpan); counter_color_font(wf->wfcarrier); // combo boxes combo_color_font(qso_opMODE); combo_color_font(qso_opBW); fl_digi_main->redraw(); } inline void inp_font_pos(Fl_Input2* inp, int x, int y, int w, int h) { inp->textsize(progdefaults.LOGBOOKtextsize); inp->textfont(progdefaults.LOGBOOKtextfont); inp->textcolor(progdefaults.LOGBOOKtextcolor); inp->color(progdefaults.LOGBOOKcolor); int ls = progdefaults.LOGBOOKtextsize; inp->labelsize(ls < 14 ? ls : 14); inp->redraw_label(); inp->resize(x, y, w, h); } inline void date_font_pos(Fl_DateInput* inp, int x, int y, int w, int h) { inp->textsize(progdefaults.LOGBOOKtextsize); inp->textfont(progdefaults.LOGBOOKtextfont); inp->textcolor(progdefaults.LOGBOOKtextcolor); inp->color(progdefaults.LOGBOOKcolor); int ls = progdefaults.LOGBOOKtextsize; inp->labelsize(ls < 14 ? ls : 14); inp->redraw_label(); inp->resize(x, y, w, h); } void LOGBOOK_colors_font() { if (!dlgLogbook) return; // input / output / date / text fields fl_font(progdefaults.LOGBOOKtextfont, progdefaults.LOGBOOKtextsize); int wh = fl_height() + 4;// + 8; int width_date = fl_width("888888888") + wh; int width_time = fl_width("23:59:599"); // int width_call = fl_width("WW/WW8WWW/WW."); int width_freq = fl_width("WW/WW8WWW/WW.");//fl_width("99.9999999"); int width_rst = fl_width("5999"); int width_pwr = fl_width("0000"); int width_loc = fl_width("XX88XXX"); int width_mode = fl_width("CONTESTIA"); int dlg_width = inpDate_log->x() + width_date + 2 + width_time + 2 + width_freq + 2 + width_mode + 2 + width_pwr + 2 + width_rst + 2 + width_date + 2; int newheight = 24 + 4*(wh + 20) + 3*wh + 4 + bNewSave->h() + 4 + wBrowser->h() + 2; if (dlg_width > progStatus.logbook_w) progStatus.logbook_w = dlg_width; else dlg_width = progStatus.logbook_w; if (newheight > progStatus.logbook_h) progStatus.logbook_h = newheight; else newheight = progStatus.logbook_h; dlgLogbook->resize( progStatus.logbook_x, progStatus.logbook_y, progStatus.logbook_w, progStatus.logbook_h); // row1 int ypos = 24; int xpos = inpDate_log->x(); date_font_pos(inpDate_log, xpos, ypos, width_date, wh); xpos += width_date + 2; inp_font_pos(inpTimeOn_log, xpos, ypos, width_time, wh); xpos += width_time + 2; inp_font_pos(inpCall_log, xpos, ypos, width_freq, wh); date_font_pos(inpQSLrcvddate_log, dlg_width - 2 - width_date, ypos, width_date, wh); inp_font_pos(inpRstR_log, inpQSLrcvddate_log->x() - 2 - width_rst, ypos, width_rst, wh); inp_font_pos(inpName_log, inpCall_log->x() + width_freq + 2, ypos, inpRstR_log->x() - 2 - (inpCall_log->x() + width_freq + 2), wh); // row2 ypos += wh + 20; xpos = inpDateOff_log->x(); date_font_pos(inpDateOff_log, xpos, ypos, width_date, wh); xpos += width_date + 2; inp_font_pos(inpTimeOff_log, xpos, ypos, width_time, wh); xpos += width_time + 2; inp_font_pos(inpFreq_log, xpos, ypos, width_freq, wh); date_font_pos(inpQSLsentdate_log, dlg_width - 2 - width_date, ypos, width_date, wh); inp_font_pos(inpRstS_log, inpQSLsentdate_log->x() - 2 - width_rst, ypos, width_rst, wh); inp_font_pos(inpTX_pwr_log, inpRstS_log->x() - 2 - width_pwr, ypos, width_pwr, wh); inp_font_pos(inpMode_log, inpFreq_log->x() + width_freq + 2, ypos, inpTX_pwr_log->x() - 2 - (inpFreq_log->x() + width_freq + 2), wh); // row 3 ypos += (20 + wh); inp_font_pos(inpLoc_log, dlg_width - 2 - width_loc, ypos, width_loc, wh); inp_font_pos(inpCountry_log, inpLoc_log->x() - 2 - inpCountry_log->w(), ypos, inpCountry_log->w(), wh); inp_font_pos(inpVE_Prov_log, inpCountry_log->x() - 2 - inpVE_Prov_log->w(), ypos, inpVE_Prov_log->w(), wh); inp_font_pos(inpState_log, inpVE_Prov_log->x() - 2 - inpState_log->w(), ypos, inpState_log->w(), wh); inp_font_pos(inpQth_log, inpQth_log->x(), ypos, inpState_log->x() - 2 - inpQth_log->x(), wh); ypos += (20 + wh); Fl_Input2* row4[] = { inpCNTY_log, inpIOTA_log, inpCQZ_log }; for (size_t i = 0; i < sizeof(row4)/sizeof(*row4); i++) { inp_font_pos(row4[i], row4[i]->x(), ypos, row4[i]->w(), wh); } inp_font_pos(inpNotes_log, inpNotes_log->x(), ypos, inpNotes_log->w(), 3 * wh); ypos = inpNotes_log->y() + inpNotes_log->h() - wh; Fl_Input2* row5[] = { inpITUZ_log, inpCONT_log, inpDXCC_log, inpQSL_VIA_log }; for (size_t i = 0; i < sizeof(row5)/sizeof(*row5); i++) { inp_font_pos(row5[i], row5[i]->x(), ypos, row5[i]->w(), wh); } ypos += 20 + wh; Fl_Input2* row6[] = { inpSerNoOut_log, inpMyXchg_log, inpSerNoIn_log, inpXchgIn_log, inpSearchString }; for (size_t i = 0; i < sizeof(row6)/sizeof(*row6); i++) { inp_font_pos(row6[i], row6[i]->x(), ypos, row6[i]->w(), wh); } ypos += wh + 4; txtNbrRecs_log->textcolor(progdefaults.LOGBOOKtextcolor); txtNbrRecs_log->color(progdefaults.LOGBOOKcolor); txtNbrRecs_log->resize(txtNbrRecs_log->x(), ypos, txtNbrRecs_log->w(), txtNbrRecs_log->h()); int ls = progdefaults.LOGBOOKtextsize; txtNbrRecs_log->labelsize(ls < 14 ? ls : 14); txtNbrRecs_log->redraw_label(); Fl_Button* btns[] = { bNewSave, bUpdateCancel, bDelete, bDialFreq, bSearchPrev, bSearchNext }; for (size_t i = 0; i < sizeof(btns)/sizeof(*btns); i++) { btns[i]->resize(btns[i]->x(), ypos, btns[i]->w(), btns[i]->h()); btns[i]->redraw(); } // browser (table) ypos += btns[0]->h() + 4; wBrowser->font(progdefaults.LOGBOOKtextfont); wBrowser->fontsize(progdefaults.LOGBOOKtextsize); wBrowser->color(progdefaults.LOGBOOKcolor); wBrowser->selection_color(FL_SELECTION_COLOR); wBrowser->resize(wBrowser->x(), ypos, dlgLogbook->w() - 2*wBrowser->x(), dlgLogbook->h() - 2 - ypos); int twidth = wBrowser->w() - wBrowser->scrollbSize() - 4; int datewidth = fl_width( "8", 9 ) + 4; int timewidth = fl_width( "8", 6 ) + 4; int callwidth = fl_width( "W", 12) + 4; int freqwidth = fl_width( "8", 10) + 4; int modewidth = fl_width( "W", 20) + 4; int namewidth = twidth - datewidth - timewidth - callwidth - freqwidth - modewidth; wBrowser->columnWidth (0, datewidth); // Date column wBrowser->columnWidth (1, timewidth); // Time column wBrowser->columnWidth (2, callwidth); // Callsign column wBrowser->columnWidth (3, namewidth); // Name column wBrowser->columnWidth (4, freqwidth); // Frequency column wBrowser->columnWidth (5, modewidth); // Mode column dlgLogbook->init_sizes(); dlgLogbook->damage(); dlgLogbook->redraw(); } void create_fl_digi_main_primary() { // bx used as a temporary spacer Fl_Box *bx; int Wmacrobtn; int Hmacrobtn; int xpos; int ypos; int wBLANK; int fnt = progdefaults.FreqControlFontnbr; int freqheight = Hentry; fl_font(fnt, freqheight); int freqwidth = (int)fl_width("999999.999"); fl_font(progdefaults.LOGGINGtextfont, progdefaults.LOGGINGtextsize); int rig_control_width = freqwidth + 2 * pad; int Y = 0; #ifdef __APPLE__ fl_mac_set_about(cb_mnuAboutURL, 0); #endif x_qsoframe += rig_control_width; IMAGE_WIDTH = 4000; Hwfall = progdefaults.wfheight; Wwfall = progStatus.mainW - 2 * DEFAULT_SW; fl_digi_main = new Fl_Double_Window(progStatus.mainW, progStatus.mainH); mnuFrame = new Fl_Group(0,0,progStatus.mainW, Hmenu); mnu = new Fl_Menu_Bar(0, 0, progStatus.mainW - 250 - pad, Hmenu); // do some more work on the menu for (size_t i = 0; i < sizeof(menu_)/sizeof(menu_[0]); i++) { // FL_NORMAL_SIZE may have changed; update the menu items if (menu_[i].text) { menu_[i].labelsize_ = FL_NORMAL_SIZE; } // set the icon label for items with the multi label type if (menu_[i].labeltype() == _FL_MULTI_LABEL) set_icon_label(&menu_[i]); } mnu->menu(menu_); toggle_visible_modes(NULL, NULL); btnAutoSpot = new Fl_Light_Button(progStatus.mainW - 250 - pad, 0, 50, Hmenu, "Spot"); btnAutoSpot->selection_color(progdefaults.SpotColor); btnAutoSpot->callback(cbAutoSpot, 0); btnAutoSpot->deactivate(); btnRSID = new Fl_Light_Button(progStatus.mainW - 200 - pad, 0, 50, Hmenu, "RxID"); btnRSID->selection_color(progdefaults.RxIDColor); btnRSID->tooltip("Receive RSID"); btnRSID->callback(cbRSID, 0); btnTxRSID = new Fl_Light_Button(progStatus.mainW - 150 - pad, 0, 50, Hmenu, "TxID"); btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->tooltip("Transmit RSID"); btnTxRSID->callback(cbTxRSID, 0); btnTune = new Fl_Light_Button(progStatus.mainW - 100 - pad, 0, 50, Hmenu, "TUNE"); btnTune->selection_color(progdefaults.TuneColor); btnTune->callback(cbTune, 0); btnMacroTimer = new Fl_Button(progStatus.mainW - 50 - pad, 0, 50, Hmenu); btnMacroTimer->labelcolor(FL_DARK_RED); btnMacroTimer->callback(cbMacroTimerButton); btnMacroTimer->set_output(); mnuFrame->resizable(mnu); mnuFrame->end(); // reset the message dialog font fl_message_font(FL_HELVETICA, FL_NORMAL_SIZE); // reset the tooltip font Fl_Tooltip::font(FL_HELVETICA); Fl_Tooltip::size(FL_NORMAL_SIZE); Fl_Tooltip::enable(progdefaults.tooltips); TopFrame1 = new Fl_Group(0, Hmenu, progStatus.mainW, Hqsoframe); RigControlFrame = new Fl_Group( 0, Hmenu, rig_control_width, Hqsoframe); txtRigName = new Fl_Box(pad, Hmenu + pad, freqwidth - Wbtn - 2 * pad, Hentry); txtRigName->box(FL_FLAT_BOX); txtRigName->align(FL_ALIGN_CENTER); txtRigName->color(FL_BACKGROUND_COLOR); txtRigName->label(_("No rig specified")); qso_opPICK = new Fl_Button(pad + freqwidth - Wbtn, Hmenu + pad, Wbtn, Hentry); addrbookpixmap = new Fl_Pixmap(address_book_icon); qso_opPICK->image(addrbookpixmap); qso_opPICK->callback(showOpBrowserView, 0); qso_opPICK->tooltip(_("Open List")); qsoFreqDisp1 = new cFreqControl( pad, Hmenu + Hentry + 2 * pad, freqwidth, Hentry, ""); qsoFreqDisp1->box(FL_DOWN_BOX); qsoFreqDisp1->color(FL_BACKGROUND_COLOR); qsoFreqDisp1->selection_color(FL_BACKGROUND_COLOR); qsoFreqDisp1->labeltype(FL_NORMAL_LABEL); qsoFreqDisp1->font(progdefaults.FreqControlFontnbr); qsoFreqDisp1->labelsize(12); qsoFreqDisp1->labelcolor(FL_FOREGROUND_COLOR); qsoFreqDisp1->align(FL_ALIGN_CENTER); qsoFreqDisp1->when(FL_WHEN_RELEASE); qsoFreqDisp1->callback(qso_movFreq); qsoFreqDisp1->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp1->value(0); Y = Hmenu + 2 * (Hentry + pad) + pad; int w_pmb = 4 * (freqwidth - 2 * pad) / 7; qso_opMODE = new Fl_ComboBox( pad, Y, w_pmb, Hentry); qso_opMODE->box(FL_DOWN_BOX); qso_opMODE->color(FL_BACKGROUND2_COLOR); qso_opMODE->selection_color(FL_BACKGROUND_COLOR); qso_opMODE->labeltype(FL_NORMAL_LABEL); qso_opMODE->labelfont(0); qso_opMODE->labelsize(14); qso_opMODE->labelcolor(FL_FOREGROUND_COLOR); qso_opMODE->callback((Fl_Callback*)cb_qso_opMODE); qso_opMODE->align(FL_ALIGN_TOP); qso_opMODE->when(FL_WHEN_RELEASE); qso_opMODE->end(); qso_opBW = new Fl_ComboBox( rightof(qso_opMODE), Y, rig_control_width - rightof(qso_opMODE) - pad, Hentry); qso_opBW->box(FL_DOWN_BOX); qso_opBW->color(FL_BACKGROUND2_COLOR); qso_opBW->selection_color(FL_BACKGROUND_COLOR); qso_opBW->labeltype(FL_NORMAL_LABEL); qso_opBW->labelfont(0); qso_opBW->labelsize(14); qso_opBW->labelcolor(FL_FOREGROUND_COLOR); qso_opBW->callback((Fl_Callback*)cb_qso_opBW); qso_opBW->align(FL_ALIGN_TOP); qso_opBW->when(FL_WHEN_RELEASE); qso_opBW->end(); RigControlFrame->resizable(NULL); RigControlFrame->end(); int opB_w = 380; int qFV_w = opB_w + 2 * (Wbtn + pad) + pad; RigViewerFrame = new Fl_Group(rightof(RigControlFrame), Hmenu, qFV_w, Hqsoframe); qso_btnSelFreq = new Fl_Button( rightof(RigControlFrame), Hmenu + pad, Wbtn, Hentry); qso_btnSelFreq->image(new Fl_Pixmap(left_arrow_icon)); qso_btnSelFreq->tooltip(_("Select")); qso_btnSelFreq->callback((Fl_Callback*)cb_qso_btnSelFreq); qso_btnAddFreq = new Fl_Button( rightof(qso_btnSelFreq) + pad, Hmenu + pad, Wbtn, Hentry); qso_btnAddFreq->image(new Fl_Pixmap(plus_icon)); qso_btnAddFreq->tooltip(_("Add current frequency")); qso_btnAddFreq->callback((Fl_Callback*)cb_qso_btnAddFreq); qso_btnClearList = new Fl_Button( rightof(RigControlFrame), Hmenu + Hentry + 2 * pad, Wbtn, Hentry); qso_btnClearList->image(new Fl_Pixmap(trash_icon)); qso_btnClearList->tooltip(_("Clear list")); qso_btnClearList->callback((Fl_Callback*)cb_qso_btnClearList); qso_btnDelFreq = new Fl_Button( rightof(qso_btnClearList) + pad, Hmenu + Hentry + 2 * pad, Wbtn, Hentry); qso_btnDelFreq->image(new Fl_Pixmap(minus_icon)); qso_btnDelFreq->tooltip(_("Delete from list")); qso_btnDelFreq->callback((Fl_Callback*)cb_qso_btnDelFreq); qso_btnAct = new Fl_Button( rightof(RigControlFrame), Hmenu + 2*(Hentry + pad) + pad, Wbtn, Hentry); qso_btnAct->image(new Fl_Pixmap(chat_icon)); qso_btnAct->callback(cb_qso_inpAct); qso_btnAct->tooltip("Show active frequencies"); qso_inpAct = new Fl_Input2( rightof(qso_btnAct) + pad, Hmenu + 2*(Hentry + pad) + pad, Wbtn, Hentry); qso_inpAct->when(FL_WHEN_ENTER_KEY | FL_WHEN_NOT_CHANGED); qso_inpAct->callback(cb_qso_inpAct); qso_inpAct->tooltip("Grid prefix for activity list"); qso_opBrowser = new Fl_Browser( rightof(qso_btnDelFreq) + pad, Hmenu + pad, opB_w, Hqsoframe - 2 * pad ); qso_opBrowser->tooltip(_("Select operating parameters")); qso_opBrowser->callback((Fl_Callback*)cb_qso_opBrowser); qso_opBrowser->type(FL_MULTI_BROWSER); qso_opBrowser->box(FL_DOWN_BOX); qso_opBrowser->labelfont(4); qso_opBrowser->labelsize(12); #ifdef __APPLE__ qso_opBrowser->textfont(FL_COURIER_BOLD); qso_opBrowser->textsize(16); #else qso_opBrowser->textfont(FL_COURIER); qso_opBrowser->textsize(14); #endif RigViewerFrame->resizable(NULL); RigViewerFrame->end(); RigViewerFrame->hide(); QsoButtonFrame = new Fl_Group(rightof( RigControlFrame), Hmenu, Wbtn, Hqsoframe); btnQRZ = new Fl_Button( rightof(RigControlFrame), Hmenu + pad, Wbtn, Hentry); btnQRZ->image(new Fl_Pixmap(net_icon)); btnQRZ->callback(cb_QRZ, 0); btnQRZ->tooltip(_("QRZ")); qsoClear = new Fl_Button( rightof(RigControlFrame), Hmenu + 2 * pad + Hentry, Wbtn, Hentry); qsoClear->image(new Fl_Pixmap(edit_clear_icon)); qsoClear->callback(qsoClear_cb, 0); qsoClear->tooltip(_("Clear")); qsoSave = new Fl_Button( rightof(RigControlFrame), Hmenu + 2*(pad + Hentry) + pad, Wbtn, Hentry); qsoSave->image(new Fl_Pixmap(save_icon)); qsoSave->callback(qsoSave_cb, 0); qsoSave->tooltip(_("Save")); QsoButtonFrame->end(); QsoButtonFrame->resizable(NULL); int y2 = Hmenu + Hentry + 2 * pad; int y3 = Hmenu + 2 * (Hentry + pad) + pad; QsoInfoFrame = new Fl_Group(x_qsoframe, Hmenu, progStatus.mainW - rightof(QsoButtonFrame) - pad, Hqsoframe); QsoInfoFrame1 = new Fl_Group(x_qsoframe, Hmenu, wf1, Hqsoframe); inpFreq1 = new Fl_Input2(x_qsoframe + 38, Hmenu + pad, 120, Hentry, _("Freq")); inpFreq1->type(FL_NORMAL_OUTPUT); inpFreq1->tooltip(_("frequency kHz")); inpFreq1->align(FL_ALIGN_LEFT); btnTimeOn = new Fl_Button(x_qsoframe + 162, Hmenu + pad, Hentry, Hentry, _("On")); btnTimeOn->tooltip(_("Press to update QSO start time")); btnTimeOn->callback(cb_btnTimeOn); inpTimeOn1 = new Fl_Input2(x_qsoframe + 188, Hmenu + pad, 40, Hentry, ""); inpTimeOn1->tooltip(_("QSO start time")); inpTimeOn1->align(FL_ALIGN_LEFT); inpTimeOn1->type(FL_INT_INPUT); inpTimeOff1 = new Fl_Input2(x_qsoframe + 257, Hmenu + pad, 40, Hentry, _("Off")); inpTimeOff1->tooltip(_("QSO end time")); inpTimeOff1->align(FL_ALIGN_LEFT); inpTimeOff1->type(FL_NORMAL_OUTPUT); inpRstIn1 = new Fl_Input2(x_qsoframe + 324, Hmenu + pad, 40, Hentry, _("In")); inpRstIn1->tooltip("RST in"); inpRstIn1->align(FL_ALIGN_LEFT); inpRstOut1 = new Fl_Input2(x_qsoframe + 395, Hmenu + pad, 40, Hentry, _("Out")); inpRstOut1->tooltip("RST out"); inpRstOut1->align(FL_ALIGN_LEFT); inpCall1 = new Fl_Input2(x_qsoframe + 38, y2, 120, Hentry, _("Call")); inpCall1->tooltip(_("call sign")); inpCall1->align(FL_ALIGN_LEFT); inpName1 = new Fl_Input2(x_qsoframe + 188, y2, 176, Hentry, _("Op")); inpName1->tooltip(_("Operator name")); inpName1->align(FL_ALIGN_LEFT); inpAZ = new Fl_Input2(x_qsoframe + 395, y2, 40, Hentry, "Az"); inpAZ->tooltip(_("Azimuth")); inpAZ->align(FL_ALIGN_LEFT); QsoInfoFrame1A = new Fl_Group (x_qsoframe, y3, wf1, Hentry + pad); inpQth = new Fl_Input2(x_qsoframe + 38, y3, 205, Hentry, "Qth"); inpQth->tooltip(_("City")); inpQth->align(FL_ALIGN_LEFT); inpState = new Fl_Input2(x_qsoframe + 262, y3, 30, Hentry, "St"); inpState->tooltip(_("US State")); inpState->align(FL_ALIGN_LEFT); inpVEprov = new Fl_Input2(x_qsoframe + 315, y3, 30, Hentry, "Pr"); inpVEprov->tooltip(_("Can. Province")); inpVEprov->align(FL_ALIGN_LEFT); inpLoc = new Fl_Input2(x_qsoframe + 375, y3, 60, Hentry, "Loc"); inpLoc->tooltip(_("Maidenhead Locator")); inpLoc->align(FL_ALIGN_LEFT); QsoInfoFrame1A->end(); QsoInfoFrame1B = new Fl_Group ( x_qsoframe, y3, wf1, Hentry + pad); outSerNo1 = new Fl_Input2(x_qsoframe + 38, y3, 40, Hentry, "#out"); outSerNo1->align(FL_ALIGN_LEFT); outSerNo1->tooltip(_("Sent serial number (read only)")); outSerNo1->type(FL_NORMAL_OUTPUT); inpSerNo1 = new Fl_Input2(x_qsoframe + 118, y3, 40, Hentry, "#in"); inpSerNo1->align(FL_ALIGN_LEFT); inpSerNo1->tooltip(_("Received serial number")); inpXchgIn1 = new Fl_Input2(x_qsoframe + 188, y3, 247, Hentry, "Xch"); inpXchgIn1->align(FL_ALIGN_LEFT); inpXchgIn1->tooltip(_("Contest exchange in")); QsoInfoFrame1B->end(); QsoInfoFrame1B->hide(); QsoInfoFrame1->resizable(NULL); QsoInfoFrame1->end(); QsoInfoFrame2 = new Fl_Group( x_qsoframe + wf1 + pad, Hmenu, progStatus.mainW - rightof(QsoInfoFrame1) - 2*pad, Hqsoframe); inpCountry = new Fl_Input2( rightof(QsoInfoFrame1) + pad, Hmenu + pad, progStatus.mainW - rightof(QsoInfoFrame1) - 2*pad, Hentry, ""); inpCountry->tooltip(_("Country")); inpNotes = new Fl_Input2( rightof(QsoInfoFrame1) + pad, y2, progStatus.mainW - rightof(QsoInfoFrame1) - 2*pad, 2*Hentry + pad, ""); inpNotes->type(FL_MULTILINE_INPUT); inpNotes->tooltip(_("Notes")); QsoInfoFrame2->end(); Fl_Group::current()->resizable(QsoInfoFrame2); QsoInfoFrame->end(); Fl_Group::current()->resizable(QsoInfoFrame); TopFrame1->end(); TopFrame2 = new Fl_Group(0, Hmenu, progStatus.mainW, Hentry + 2 * pad); { int y = Hmenu + pad; int h = Hentry; qsoFreqDisp2 = new cFreqControl( pad, y, freqwidth, freqheight, ""); qsoFreqDisp2->box(FL_DOWN_BOX); qsoFreqDisp2->color(FL_BACKGROUND_COLOR); qsoFreqDisp2->selection_color(FL_BACKGROUND_COLOR); qsoFreqDisp2->labeltype(FL_NORMAL_LABEL); qsoFreqDisp2->align(FL_ALIGN_CENTER); qsoFreqDisp2->when(FL_WHEN_RELEASE); qsoFreqDisp2->callback(qso_movFreq); qsoFreqDisp2->font(progdefaults.FreqControlFontnbr); qsoFreqDisp2->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp2->value(0); qso_opPICK2 = new Fl_Button( rightof(qsoFreqDisp2), y, Wbtn, Hentry); qso_opPICK2->image(addrbookpixmap); qso_opPICK2->callback(showOpBrowserView2, 0); qso_opPICK2->tooltip(_("Open List")); btnQRZ2 = new Fl_Button( pad + rightof(qso_opPICK2), y, Wbtn, Hentry); btnQRZ2->image(new Fl_Pixmap(net_icon)); btnQRZ2->callback(cb_QRZ, 0); btnQRZ2->tooltip(_("QRZ")); qsoClear2 = new Fl_Button( pad + rightof(btnQRZ2), y, Wbtn, Hentry); qsoClear2->image(new Fl_Pixmap(edit_clear_icon)); qsoClear2->callback(qsoClear_cb, 0); qsoClear2->tooltip(_("Clear")); qsoSave2 = new Fl_Button( pad + rightof(qsoClear2), y, Wbtn, Hentry); qsoSave2->image(new Fl_Pixmap(save_icon)); qsoSave2->callback(qsoSave_cb, 0); qsoSave2->tooltip(_("Save")); const char *label2 = _("On"); btnTimeOn2 = new Fl_Button( pad + rightof(qsoSave2), y, static_cast(fl_width(label2)), h, label2); btnTimeOn2->tooltip(_("Press to update")); btnTimeOn2->box(FL_NO_BOX); btnTimeOn2->callback(cb_btnTimeOn); inpTimeOn2 = new Fl_Input2( pad + btnTimeOn2->x() + btnTimeOn2->w(), y, w_inpTime2, h, ""); inpTimeOn2->tooltip(_("Time On")); inpTimeOn2->type(FL_INT_INPUT); const char *label3 = _("Off"); Fl_Box *bx3 = new Fl_Box(pad + rightof(inpTimeOn2), y, static_cast(fl_width(label3)), h, label3); inpTimeOff2 = new Fl_Input2( pad + bx3->x() + bx3->w(), y, w_inpTime2, h, ""); inpTimeOff2->tooltip(_("Time Off")); inpTimeOff2->type(FL_NORMAL_OUTPUT); const char *label4 = _("Call"); Fl_Box *bx4 = new Fl_Box(pad + rightof(inpTimeOff2), y, static_cast(fl_width(label4)), h, label4); inpCall2 = new Fl_Input2( pad + bx4->x() + bx4->w(), y, w_inpCall2, h, ""); inpCall2->tooltip(_("Other call")); const char *label6 = _("In"); Fl_Box *bx6 = new Fl_Box(pad + rightof(inpCall2), y, static_cast(fl_width(label6)), h, label6); inpRstIn2 = new Fl_Input2( pad + bx6->x() + bx6->w(), y, w_inpRstIn2, h, ""); inpRstIn2->tooltip(_("Received RST")); const char *label7 = _("Out"); Fl_Box *bx7 = new Fl_Box(pad + rightof(inpRstIn2), y, static_cast(fl_width(label7)), h, label7); inpRstOut2 = new Fl_Input2( pad + bx7->x() + bx7->w(), y, w_inpRstOut2, h, ""); inpRstOut2->tooltip(_("Sent RST")); const char *label5 = _("Nm"); Fl_Box *bx5 = new Fl_Box(pad + rightof(inpRstOut2), y, static_cast(fl_width(label5)), h, label5); int xn = pad + bx5->x() + bx5->w(); inpName2 = new Fl_Input2( xn, y, progStatus.mainW - xn - pad, h, ""); inpName2->tooltip(_("Other name")); } TopFrame2->resizable(inpName2); TopFrame2->end(); TopFrame2->hide(); TopFrame3 = new Fl_Group(0, Hmenu, progStatus.mainW, Hentry + 2 * pad); { int y = Hmenu + pad; int h = Hentry; qsoFreqDisp3 = new cFreqControl( pad, y, freqwidth, freqheight, ""); qsoFreqDisp3->box(FL_DOWN_BOX); qsoFreqDisp3->color(FL_BACKGROUND_COLOR); qsoFreqDisp3->selection_color(FL_BACKGROUND_COLOR); qsoFreqDisp3->labeltype(FL_NORMAL_LABEL); qsoFreqDisp3->align(FL_ALIGN_CENTER); qsoFreqDisp3->when(FL_WHEN_RELEASE); qsoFreqDisp3->callback(qso_movFreq); qsoFreqDisp3->font(progdefaults.FreqControlFontnbr); qsoFreqDisp3->SetONOFFCOLOR( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp3->value(0); qso_opPICK3 = new Fl_Button( rightof(qsoFreqDisp3), y, Wbtn, Hentry); qso_opPICK3->image(addrbookpixmap); qso_opPICK3->callback(showOpBrowserView2, 0); qso_opPICK3->tooltip(_("Open List")); qsoClear3 = new Fl_Button( pad + rightof(qso_opPICK3), y, Wbtn, Hentry); qsoClear3->image(new Fl_Pixmap(edit_clear_icon)); qsoClear3->callback(qsoClear_cb, 0); qsoClear3->tooltip(_("Clear")); qsoSave3 = new Fl_Button( pad + rightof(qsoClear3), y, Wbtn, Hentry); qsoSave3->image(new Fl_Pixmap(save_icon)); qsoSave3->callback(qsoSave_cb, 0); qsoSave3->tooltip(_("Save")); fl_font(FL_HELVETICA, 14);//FL_NORMAL_SIZE); const char *label2a = _("On"); const char *label3a = _("Off"); const char *label4a = _("Call"); const char *label5a = _("# S"); const char *label6a = _("# R"); const char *label7a = _("Ex"); const char *xData = "00000"; const char *xCall = "WW8WWW/WW";//"WW8WWW/WWWW"; int wData = static_cast(fl_width(xData)); int wCall = static_cast(fl_width(xCall)); Fl_Box *bx4a = new Fl_Box( pad + rightof(qsoSave3), y, static_cast(fl_width(label4a)), h, label4a); inpCall3 = new Fl_Input2( pad + bx4a->x() + bx4a->w(), y, wCall, h, ""); inpCall3->align(FL_ALIGN_INSIDE); inpCall3->tooltip(_("Other call")); Fl_Box *bx7a = new Fl_Box( rightof(inpCall3), y, static_cast(fl_width(label7a)), h, label7a); bx7a->align(FL_ALIGN_INSIDE); inpXchgIn2 = new Fl_Input2( rightof(bx7a), y, static_cast(progStatus.mainW - rightof(bx7a) - pad - fl_width(label6a) - wData - pad - fl_width(label5a) - wData - pad - fl_width(label2a) - wData - pad - fl_width(label3a) - wData - pad), h, ""); inpXchgIn2->tooltip(_("Contest exchange in")); Fl_Box *bx6a = new Fl_Box( rightof(inpXchgIn2), y, static_cast(fl_width(label6a)), h, label6a); bx6a->align(FL_ALIGN_INSIDE); inpSerNo2 = new Fl_Input2( rightof(bx6a) + pad, y, wData, h, ""); inpSerNo2->tooltip(_("Received serial number")); Fl_Box *bx5a = new Fl_Box( rightof(inpSerNo2), y, static_cast(fl_width(label5a)), h, label5a); bx5a->align(FL_ALIGN_INSIDE); outSerNo2 = new Fl_Input2( rightof(bx5a) + pad, y, wData, h, ""); outSerNo2->tooltip(_("Sent serial number (read only)")); outSerNo2->type(FL_NORMAL_OUTPUT); btnTimeOn3 = new Fl_Button( rightof(outSerNo2), y, static_cast(fl_width(label2a)), h, label2a); btnTimeOn3->tooltip(_("Press to update")); btnTimeOn3->box(FL_NO_BOX); btnTimeOn3->callback(cb_btnTimeOn); inpTimeOn3 = new Fl_Input2( btnTimeOn3->x() + btnTimeOn3->w() + pad, y, wData - 2, h, ""); inpTimeOn3->tooltip(_("Time On")); inpTimeOn3->type(FL_INT_INPUT); Fl_Box *bx3a = new Fl_Box(pad + rightof(inpTimeOn3), y, static_cast(fl_width(label3a)), h, label3a); inpTimeOff3 = new Fl_Input2( bx3a->x() + bx3a->w() + pad, y, wData, h, ""); inpTimeOff3->tooltip(_("Time Off")); inpTimeOff3->type(FL_NORMAL_OUTPUT); TopFrame3->end(); } TopFrame3->resizable(inpXchgIn2); TopFrame3->hide(); inpFreq = inpFreq1; inpCall = inpCall1; inpTimeOn = inpTimeOn1; inpTimeOff = inpTimeOff1; inpName = inpName1; inpRstIn = inpRstIn1; inpRstOut = inpRstOut1; qsoFreqDisp = qsoFreqDisp1; inpSerNo = inpSerNo1; outSerNo = outSerNo1; inpXchgIn = inpXchgIn1; Y = Hmenu + Hqsoframe + pad; macroFrame2 = new Fl_Group(0, Y, progStatus.mainW, Hmacros); macroFrame2->box(FL_FLAT_BOX); Fl_Group *btngroup2 = new Fl_Group(0, Y + 1, progStatus.mainW - Hmacros, Hmacros - 1); Wmacrobtn = (btngroup2->w()) / NUMMACKEYS; Hmacrobtn = btngroup2->h() - 1; wBLANK = (btngroup2->w() - NUMMACKEYS * Wmacrobtn) / 2; xpos = 0; ypos = btngroup2->y(); for (int i = 0; i < NUMMACKEYS; i++) { if (i == 4 || i == 8) { bx = new Fl_Box(xpos, ypos, wBLANK, Hmacrobtn); bx->box(FL_FLAT_BOX); xpos += wBLANK; } btnMacro[NUMMACKEYS + i] = new Fl_Button(xpos, ypos, Wmacrobtn, Hmacrobtn, macros.name[NUMMACKEYS + i].c_str()); btnMacro[NUMMACKEYS + i]->callback(macro_cb, reinterpret_cast(NUMMACKEYS + i)); btnMacro[NUMMACKEYS + i]->tooltip( _("Left Click - execute\nShift-Fkey - execute\nRight Click - edit")); colorize_macro(NUMMACKEYS + i); xpos += Wmacrobtn; } btngroup2->end(); btnAltMacros2 = new Fl_Button(progStatus.mainW - Hmacrobtn, ypos, Hmacrobtn, Hmacrobtn, "2"); btnAltMacros2->callback(altmacro_cb, 0); btnAltMacros2->tooltip(_("Shift-key macro set")); macroFrame2->resizable(btngroup2); macroFrame2->end(); Y += Hmacros; int Htext = progStatus.mainH - Hwfall - Hmenu - Hstatus - Hmacros*NUMKEYROWS - Hqsoframe - 4; int Hrcvtxt = Htext / 2; int Hxmttxt = Htext - Hrcvtxt; MixerFrame = new Fl_Group(0, Y, sw, Htext); { int Hrcvmixer = Htext / 2; int Hxmtmixer = Htext - Hrcvmixer; valRcvMixer = new Fl_Value_Slider2(MixerFrame->x(), Y, sw, Hrcvmixer, ""); valRcvMixer->type(FL_VERT_NICE_SLIDER); valRcvMixer->color(fl_rgb_color(0,110,30)); valRcvMixer->selection_color(fl_rgb_color(255,255,0)); valRcvMixer->textcolor(FL_WHITE); valRcvMixer->range(100.0,0.0); valRcvMixer->value(100.0); valRcvMixer->step(1.0); valRcvMixer->callback( (Fl_Callback *)cb_RcvMixer); valXmtMixer = new Fl_Value_Slider2(MixerFrame->x(), Y + Hrcvmixer, sw, Hxmtmixer, ""); valXmtMixer->type(FL_VERT_NICE_SLIDER); valXmtMixer->color(fl_rgb_color(110,0,30)); valXmtMixer->selection_color(fl_rgb_color(255,255,0)); valXmtMixer->textcolor(FL_WHITE); valXmtMixer->range(100.0,0.0); valXmtMixer->value(100.0); valXmtMixer->step(1.0); valXmtMixer->callback( (Fl_Callback *)cb_XmtMixer); } MixerFrame->end(); int HTwidth = progStatus.mainW - sw; text_panel = new Panel(sw, Y, HTwidth, Htext); mvgroup = new Fl_Group( text_panel->x(), text_panel->y(), text_panel->w()/2, Htext, ""); mainViewer = new pskBrowser(mvgroup->x(), mvgroup->y(), mvgroup->w(), Htext-42, ""); mainViewer->box(FL_DOWN_BOX); mainViewer->has_scrollbar(Fl_Browser_::VERTICAL); mainViewer->callback((Fl_Callback*)cb_mainViewer); mainViewer->setfont(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); mainViewer->tooltip(_("Left click - select\nRight click - clear line")); // mainViewer uses same regular expression evaluator as Viewer mainViewer->seek_re = &seek_re; Fl_Group* gseek = new Fl_Group(mvgroup->x(), mvgroup->y() + Htext - 42, mvgroup->w(), 20); // search field int seek_x = mvgroup->x() + 2; int seek_y = mvgroup->y() + Htext - 42; int seek_w = mvgroup->w() - 4; txtInpSeek = new Fl_Input2( seek_x, seek_y, seek_w, gseek->h(), ""); txtInpSeek->callback((Fl_Callback*)cb_mainViewer_Seek); txtInpSeek->when(FL_WHEN_CHANGED); txtInpSeek->textfont(FL_COURIER); txtInpSeek->value(progStatus.browser_search.c_str()); txtInpSeek->do_callback(); txtInpSeek->tooltip(_("seek - regular expression")); gseek->resizable(txtInpSeek); gseek->end(); Fl_Group *g = new Fl_Group(mvgroup->x(), mvgroup->y() + Htext - 22, mvgroup->w(), 22); g->box(FL_DOWN_BOX); // squelch mvsquelch = new Fl_Value_Slider2(g->x()+2, g->y()+1, g->w() - 75 - 2, g->h()-2); mvsquelch->type(FL_HOR_NICE_SLIDER); mvsquelch->range(-3.0, 6.0); mvsquelch->value(progStatus.VIEWER_psksquelch); mvsquelch->step(0.1); mvsquelch->color( fl_rgb_color( progdefaults.bwsrSliderColor.R, progdefaults.bwsrSliderColor.G, progdefaults.bwsrSliderColor.B)); mvsquelch->selection_color( fl_rgb_color( progdefaults.bwsrSldrSelColor.R, progdefaults.bwsrSldrSelColor.G, progdefaults.bwsrSldrSelColor.B)); mvsquelch->callback( (Fl_Callback *)cb_mvsquelch); mvsquelch->tooltip(_("Set Viewer Squelch")); // clear button btnClearMViewer = new Fl_Button(mvsquelch->x() + mvsquelch->w(), g->y()+1, 75, g->h()-2, make_icon_label(_("Clear"), edit_clear_icon)); btnClearMViewer->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); set_icon_label(btnClearMViewer); btnClearMViewer->callback((Fl_Callback*)cb_btnClearMViewer); g->resizable(mvsquelch); g->end(); mvgroup->resizable(mainViewer); mvgroup->end(); ReceiveText = new FTextRX( text_panel->x() + mvgroup->w(), text_panel->y(), text_panel->w() - mvgroup->w(), text_panel->h()/2, ""); ReceiveText->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); ReceiveText->setFont(progdefaults.RxFontnbr); ReceiveText->setFontSize(progdefaults.RxFontsize); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); FHdisp = new Raster( text_panel->x() + mvgroup->w(), text_panel->y(), text_panel->w() - mvgroup->w(), text_panel->h()/2); FHdisp->align(FL_ALIGN_CLIP); FHdisp->hide(); wefax_pic::create_both( true ); TransmitText = new FTextTX( text_panel->x() + mvgroup->w(), text_panel->y() + ReceiveText->h(), text_panel->w() - mvgroup->w(), text_panel->h() - ReceiveText->h()); TransmitText->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); TransmitText->setFont(progdefaults.TxFontnbr); TransmitText->setFontSize(progdefaults.TxFontsize); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->align(FL_ALIGN_CLIP); Fl_Box *minbox = new Fl_Box( text_panel->x(), text_panel->y() + 66, // fixed by Raster min height text_panel->w() - 100, text_panel->h() - 66 - 60); // fixed by HMIN & Hwfall max minbox->hide(); text_panel->resizable(minbox); text_panel->end(); Y += Htext; Fl::add_handler(default_handler); macroFrame1 = new Fl_Group(0, Y, progStatus.mainW, Hmacros); macroFrame1->box(FL_FLAT_BOX); Fl_Group *btngroup1 = new Fl_Group(0, Y+1, progStatus.mainW - Hmacros, Hmacros-1); Wmacrobtn = (btngroup1->w()) / NUMMACKEYS; Hmacrobtn = btngroup1->h() - 1; wBLANK = (btngroup1->w() - NUMMACKEYS * Wmacrobtn) / 2; xpos = 0; ypos = btngroup1->y(); for (int i = 0; i < NUMMACKEYS; i++) { if (i == 4 || i == 8) { bx = new Fl_Box(xpos, ypos, wBLANK, Hmacrobtn); bx->box(FL_FLAT_BOX); xpos += wBLANK; } btnMacro[i] = new Fl_Button(xpos, ypos, Wmacrobtn, Hmacrobtn, macros.name[i].c_str()); btnMacro[i]->callback(macro_cb, reinterpret_cast(i)); btnMacro[i]->tooltip(_("Left Click - execute\nFkey - execute\nRight Click - edit")); colorize_macro(i); xpos += Wmacrobtn; } btngroup1->end(); btnAltMacros1 = new Fl_Button(progStatus.mainW - Hmacrobtn, ypos, Hmacrobtn, Hmacrobtn, "1"); btnAltMacros1->callback(altmacro_cb, 0); btnAltMacros1->tooltip(_("Primary macro set")); macroFrame1->resizable(btngroup1); macroFrame1->end(); Y += Hmacros; wfpack = new Fl_Pack(0, Y, progStatus.mainW, Hwfall); wfpack->type(1); wf = new waterfall(0, Y, Wwfall, Hwfall); wf->end(); pgrsSquelch = new Progress( rightof(wf), Y + 4, DEFAULT_SW, Hwfall - 8, ""); pgrsSquelch->color(FL_BACKGROUND2_COLOR, FL_DARK_GREEN); pgrsSquelch->type(Progress::VERTICAL); pgrsSquelch->tooltip(_("Detected signal level")); sldrSquelch = new Fl_Slider2( rightof(pgrsSquelch), Y + 4, DEFAULT_SW, Hwfall - 8, ""); sldrSquelch->minimum(100); sldrSquelch->maximum(0); sldrSquelch->step(1); sldrSquelch->value(progStatus.sldrSquelchValue); sldrSquelch->callback((Fl_Callback*)cb_sldrSquelch); sldrSquelch->color(FL_INACTIVE_COLOR); sldrSquelch->tooltip(_("Squelch level")); Fl_Group::current()->resizable(wf); wfpack->end(); Y += (Hwfall + 2); hpack = new Fl_Pack(0, Y, progStatus.mainW, Hstatus); hpack->type(1); MODEstatus = new Fl_Button(0,Hmenu+Hrcvtxt+Hxmttxt+Hwfall, Wmode+30, Hstatus, ""); MODEstatus->box(FL_DOWN_BOX); MODEstatus->color(FL_BACKGROUND2_COLOR); MODEstatus->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); MODEstatus->callback(status_cb, (void *)0); MODEstatus->when(FL_WHEN_CHANGED); MODEstatus->tooltip(_("Left click: change mode\nRight click: configure")); cntCW_WPM = new Fl_Counter2(rightof(MODEstatus), Hmenu+Hrcvtxt+Hxmttxt+Hwfall, Ws2n - Hstatus, Hstatus, ""); cntCW_WPM->callback(cb_cntCW_WPM); cntCW_WPM->minimum(progdefaults.CWlowerlimit); cntCW_WPM->maximum(progdefaults.CWupperlimit); cntCW_WPM->value(progdefaults.CWspeed); cntCW_WPM->type(1); cntCW_WPM->step(1); cntCW_WPM->tooltip(_("CW transmit WPM")); cntCW_WPM->hide(); btnCW_Default = new Fl_Button(rightof(cntCW_WPM), Hmenu+Hrcvtxt+Hxmttxt+Hwfall, Hstatus, Hstatus, "*"); btnCW_Default->callback(cb_btnCW_Default); btnCW_Default->tooltip(_("Default WPM")); btnCW_Default->hide(); Status1 = new Fl_Box(rightof(MODEstatus), Hmenu+Hrcvtxt+Hxmttxt+Hwfall, Ws2n, Hstatus, ""); Status1->box(FL_DOWN_BOX); Status1->color(FL_BACKGROUND2_COLOR); Status1->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); Status2 = new Fl_Box(rightof(Status1), Hmenu+Hrcvtxt+Hxmttxt+Hwfall, Wimd, Hstatus, ""); Status2->box(FL_DOWN_BOX); Status2->color(FL_BACKGROUND2_COLOR); Status2->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); inpCall4 = new Fl_Input2( rightof(Status1), Hmenu+Hrcvtxt+Hxmttxt+Hwfall, Wimd, Hstatus, ""); inpCall4->align(FL_ALIGN_LEFT); inpCall4->tooltip(_("Other call")); inpCall4->hide(); StatusBar = new Fl_Box( rightof(Status2), Hmenu+Hrcvtxt+Hxmttxt+Hwfall, progStatus.mainW - bwSqlOnOff - bwAfcOnOff - Wwarn - bwTxLevel - 2 * DEFAULT_SW - rightof(Status2), Hstatus, ""); StatusBar->box(FL_DOWN_BOX); StatusBar->color(FL_BACKGROUND2_COLOR); StatusBar->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); cntTxLevel = new Fl_Counter2( rightof(StatusBar) + 2 * pad, Hmenu+Hrcvtxt+Hxmttxt+Hwfall, bwTxLevel - 4 * pad, Hstatus, ""); cntTxLevel->minimum(-30); cntTxLevel->maximum(0); cntTxLevel->value(-6); cntTxLevel->callback((Fl_Callback*)cb_cntTxLevel); cntTxLevel->value(progdefaults.txlevel); cntTxLevel->lstep(1.0); cntTxLevel->tooltip(_("Tx level attenuator (dB)")); WARNstatus = new Fl_Box( rightof(StatusBar) + pad, Hmenu+Hrcvtxt+Hxmttxt+Hwfall, Wwarn, Hstatus, ""); WARNstatus->box(FL_DIAMOND_DOWN_BOX); WARNstatus->color(FL_BACKGROUND_COLOR); WARNstatus->labelcolor(FL_RED); WARNstatus->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); int sql_width = bwSqlOnOff; btnAFC = new Fl_Light_Button( progStatus.mainW - bwSqlOnOff - bwAfcOnOff, Hmenu+Hrcvtxt+Hxmttxt+Hwfall, bwAfcOnOff, Hstatus, "AFC"); btnAFC->selection_color(progdefaults.AfcColor); btnSQL = new Fl_Light_Button( progStatus.mainW - bwSqlOnOff, Hmenu+Hrcvtxt+Hxmttxt+Hwfall, sql_width, Hstatus, "SQL"); btnSQL->selection_color(progdefaults.Sql1Color); btnAFC->callback(cbAFC, 0); btnAFC->value(1); btnAFC->tooltip(_("Automatic Frequency Control")); btnSQL->callback(cbSQL, 0); btnSQL->value(1); btnSQL->tooltip(_("Squelch")); Fl_Group::current()->resizable(StatusBar); hpack->end(); Y += hpack->h(); showMacroSet(); #define CB_WHEN FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED | FL_WHEN_ENTER_KEY | FL_WHEN_RELEASE Fl_Widget* logfields[] = { inpName1, inpName1, inpTimeOn1, inpTimeOn2, inpTimeOn3, inpTimeOff1, inpTimeOff2, inpTimeOff3, inpRstIn1, inpRstIn2, inpRstOut1, inpRstOut2, inpQth, inpState, inpVEprov, inpCountry, inpAZ, inpNotes, inpSerNo1, inpSerNo2, outSerNo1, outSerNo2, inpXchgIn1, inpXchgIn2 }; for (size_t i = 0; i < sizeof(logfields)/sizeof(*logfields); i++) { logfields[i]->callback(cb_log); logfields[i]->when(CB_WHEN); } // exceptions inpCall1->callback(cb_call); inpCall1->when(CB_WHEN); inpCall2->callback(cb_call); inpCall2->when(CB_WHEN); inpCall3->callback(cb_call); inpCall3->when(CB_WHEN); inpCall4->callback(cb_call); inpCall4->when(CB_WHEN); inpLoc->callback(cb_loc); inpLoc->when(CB_WHEN); inpNotes->when(FL_WHEN_RELEASE); fl_digi_main->end(); fl_digi_main->resizable(text_panel); fl_digi_main->callback(cb_wMain); scopeview = new Fl_Double_Window(0,0,140,140, _("Scope")); scopeview->xclass(PACKAGE_NAME); digiscope = new Digiscope (0, 0, 140, 140); scopeview->resizable(digiscope); scopeview->size_range(SCOPEWIN_MIN_WIDTH, SCOPEWIN_MIN_HEIGHT); scopeview->end(); scopeview->hide(); if (!progdefaults.menuicons) toggle_icon_labels(); // ztimer must be run by FLTK's timeout handler Fl::add_timeout(0.0, ztimer, (void*)true); // Set the state of checked toggle menu items. Never changes. const struct { bool var; const char* label; } toggles[] = { { progStatus.LOGenabled, LOG_TO_FILE_MLABEL }, { progStatus.contest, CONTEST_FIELDS_MLABEL }, { progStatus.WF_UI, WF_MLABEL }, { progStatus.Rig_Log_UI, RIGLOG_MLABEL }, { progStatus.Rig_Contest_UI, RIGCONTEST_MLABEL }, { progStatus.NO_RIGLOG, RIGLOG_NONE_MLABEL }, { progStatus.DOCKEDSCOPE, DOCKEDSCOPE_MLABEL } }; Fl_Menu_Item* toggle; for (size_t i = 0; i < sizeof(toggles)/sizeof(*toggles); i++) { if (toggles[i].var && (toggle = getMenuItem(toggles[i].label))) { toggle->set(); if (toggle->callback()) { mnu->value(toggle); toggle->do_callback(reinterpret_cast(mnu)); } } } if (!dxcc_is_open()) getMenuItem(COUNTRIES_MLABEL)->hide(); UI_select(); wf->UI_select(progStatus.WF_UI); clearQSO(); createConfig(); createRecordLoader(); if (withnoise) grpNoise->show(); if (!progdefaults.mbar2_pos) { if (progdefaults.mbar1_pos) btn_oneA->setonly(); else btn_oneB->setonly(); } else if (progdefaults.mbar1_pos) { Fl_Button* b[] = { btn_twoA, btn_twoB, btn_twoC, btn_twoD, btn_twoE, btn_twoF }; b[progdefaults.mbar2_pos - 1]->setonly(); } else { Fl_Button* b[] = { btn_twoD, btn_twoE, btn_twoF }; b[progdefaults.mbar2_pos - 1]->setonly(); } LOGGING_colors_font(); } void cb_mnuAltDockedscope(Fl_Menu_ *w, void *d); static Fl_Menu_Item alt_menu_[] = { {_("&File"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { make_icon_label(_("Exit"), log_out_icon), 'x', (Fl_Callback*)cb_E, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {_("Op &Mode"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CW].name, 0, cb_init_mode, (void *)MODE_CW, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"Contestia", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { "4/125", 0, cb_contestiaI, (void *)MODE_CONTESTIA, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { "4/250", 0, cb_contestiaA, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "8/250", 0, cb_contestiaB, (void *)MODE_CONTESTIA, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { "4/500", 0, cb_contestiaC, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "8/500", 0, cb_contestiaD, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "16/500", 0, cb_contestiaE, (void *)MODE_CONTESTIA, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { "8/1000", 0, cb_contestiaF, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "16/1000", 0, cb_contestiaG, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "32/1000", 0, cb_contestiaH, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "64/1000", 0, cb_contestiaJ, (void *)MODE_CONTESTIA, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_contestiaCustom, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"DominoEX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX4].name, 0, cb_init_mode, (void *)MODE_DOMINOEX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX5].name, 0, cb_init_mode, (void *)MODE_DOMINOEX5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX8].name, 0, cb_init_mode, (void *)MODE_DOMINOEX8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX11].name, 0, cb_init_mode, (void *)MODE_DOMINOEX11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX16].name, 0, cb_init_mode, (void *)MODE_DOMINOEX16, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX22].name, 0, cb_init_mode, (void *)MODE_DOMINOEX22, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"MFSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK4].name, 0, cb_init_mode, (void *)MODE_MFSK4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK11].name, 0, cb_init_mode, (void *)MODE_MFSK11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK22].name, 0, cb_init_mode, (void *)MODE_MFSK22, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK31].name, 0, cb_init_mode, (void *)MODE_MFSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK32].name, 0, cb_init_mode, (void *)MODE_MFSK32, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK64].name, 0, cb_init_mode, (void *)MODE_MFSK64, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK64L].name, 0, cb_init_mode, (void *)MODE_MFSK64L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK128L].name, 0, cb_init_mode, (void *)MODE_MFSK128L, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"MT63", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_500S].name, 0, cb_init_mode, (void *)MODE_MT63_500S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_500L].name, 0, cb_init_mode, (void *)MODE_MT63_500L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_1000S].name, 0, cb_init_mode, (void *)MODE_MT63_1000S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_1000L].name, 0, cb_init_mode, (void *)MODE_MT63_1000L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_2000S].name, 0, cb_init_mode, (void *)MODE_MT63_2000S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_2000L].name, 0, cb_init_mode, (void *)MODE_MT63_2000L, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Olivia", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_32_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_64_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_oliviaCustom, (void *)MODE_OLIVIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"PSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK31].name, 0, cb_init_mode, (void *)MODE_PSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK63].name, 0, cb_init_mode, (void *)MODE_PSK63, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK63F].name, 0, cb_init_mode, (void *)MODE_PSK63F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK125].name, 0, cb_init_mode, (void *)MODE_PSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK250].name, 0, cb_init_mode, (void *)MODE_PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK500].name, 0, cb_init_mode, (void *)MODE_PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"QPSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK31].name, 0, cb_init_mode, (void *)MODE_QPSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK63].name, 0, cb_init_mode, (void *)MODE_QPSK63, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK125].name, 0, cb_init_mode, (void *)MODE_QPSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK250].name, 0, cb_init_mode, (void *)MODE_QPSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK500].name, 0, cb_init_mode, (void *)MODE_QPSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"PSKR", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK125R].name, 0, cb_init_mode, (void *)MODE_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK250R].name, 0, cb_init_mode, (void *)MODE_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK500R].name, 0, cb_init_mode, (void *)MODE_PSK500R, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"RTTY", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-45", 0, cb_rtty45, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-50", 0, cb_rtty50, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-75N", 0, cb_rtty75N, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-75W", 0, cb_rtty75W, (void *)MODE_RTTY, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_rttyCustom, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"THOR", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR4].name, 0, cb_init_mode, (void *)MODE_THOR4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR5].name, 0, cb_init_mode, (void *)MODE_THOR5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR8].name, 0, cb_init_mode, (void *)MODE_THOR8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR11].name, 0, cb_init_mode, (void *)MODE_THOR11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR16].name, 0, cb_init_mode, (void *)MODE_THOR16, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR22].name, 0, cb_init_mode, (void *)MODE_THOR22, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Throb", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB1].name, 0, cb_init_mode, (void *)MODE_THROB1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB2].name, 0, cb_init_mode, (void *)MODE_THROB2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB4].name, 0, cb_init_mode, (void *)MODE_THROB4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX1].name, 0, cb_init_mode, (void *)MODE_THROBX1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX2].name, 0, cb_init_mode, (void *)MODE_THROBX2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX4].name, 0, cb_init_mode, (void *)MODE_THROBX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"WEFAX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_WEFAX_576].name, 0, cb_init_mode, (void *)MODE_WEFAX_576, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_WEFAX_288].name, 0, cb_init_mode, (void *)MODE_WEFAX_288, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Navtex/SitorB", 0, 0, 0, FL_SUBMENU | FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_NAVTEX].name, 0, cb_init_mode, (void *)MODE_NAVTEX, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_SITORB].name, 0, cb_init_mode, (void *)MODE_SITORB, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { mode_info[MODE_WWV].name, 0, cb_init_mode, (void *)MODE_WWV, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_ANALYSIS].name, 0, cb_init_mode, (void *)MODE_ANALYSIS, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_NULL].name, 0, cb_init_mode, (void *)MODE_NULL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_SSB].name, 0, cb_init_mode, (void *)MODE_SSB, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {_("&Configure"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { make_icon_label(_("Waterfall"), waterfall_icon), 0, (Fl_Callback*)cb_mnuConfigWaterfall, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(RIGCONTROL_MLABEL, multimedia_player_icon), 0, (Fl_Callback*)cb_mnuConfigRigCtrl, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Sound Card"), audio_card_icon), 0, (Fl_Callback*)cb_mnuConfigSoundCard, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Modems"), emblems_system_icon), 0, (Fl_Callback*)cb_mnuConfigModems, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("IDs")), 0, (Fl_Callback*)cb_mnuConfigID, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Notifications")), 0, (Fl_Callback*)cb_mnuConfigNotify, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Save Config"), save_icon), 0, (Fl_Callback*)cb_mnuSaveConfig, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { VIEW_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, //{ make_icon_label(_("Extern Scope"), utilities_system_monitor_icon), 'd', (Fl_Callback*)cb_mnuDigiscope, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(MFSK_IMAGE_MLABEL, image_icon), 'm', (Fl_Callback*)cb_mnuPicViewer, 0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(WEFAX_RX_IMAGE_MLABEL, image_icon), 'm', (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_rx,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(WEFAX_TX_IMAGE_MLABEL, image_icon), 'm', (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_tx,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { make_icon_label(_("Signal Browser")), 's', (Fl_Callback*)cb_mnuViewer, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { DOCKEDSCOPE_MLABEL, 0, (Fl_Callback*)cb_mnuAltDockedscope, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, }; void cb_mnuAltDockedscope(Fl_Menu_ *w, void *d) { Fl_Menu_Item *m = getMenuItem(((Fl_Menu_*)w)->mvalue()->label(), alt_menu_); progStatus.DOCKEDSCOPE = m->value(); wf->show_scope(progStatus.DOCKEDSCOPE); } #define defwidget 0, 0, 10, 10, "" void noop_controls() // create and then hide all controls not being used { Fl_Double_Window *dummywindow = new Fl_Double_Window(0,0,100,100,""); btnMacroTimer = new Fl_Button(defwidget); btnMacroTimer->hide(); ReceiveText = new FTextRX(0,0,100,100); ReceiveText->hide(); TransmitText = new FTextTX(0,0,100,100); TransmitText->hide(); FHdisp = new Raster(0,0,10,100); FHdisp->hide(); for (int i = 0; i < NUMMACKEYS * NUMKEYROWS; i++) { btnMacro[i] = new Fl_Button(defwidget); btnMacro[i]->hide(); } inpQth = new Fl_Input2(defwidget); inpQth->hide(); inpLoc = new Fl_Input2(defwidget); inpLoc->hide(); inpState = new Fl_Input2(defwidget); inpState->hide(); inpCountry = new Fl_Input2(defwidget); inpCountry->hide(); inpSerNo = new Fl_Input2(defwidget); inpSerNo->hide(); outSerNo = new Fl_Input2(defwidget); outSerNo->hide(); inpXchgIn = new Fl_Input2(defwidget); inpXchgIn->hide(); inpVEprov = new Fl_Input2(defwidget); inpVEprov->hide(); inpNotes = new Fl_Input2(defwidget); inpNotes->hide(); inpAZ = new Fl_Input2(defwidget); inpAZ->hide(); qsoTime = new Fl_Button(defwidget); qsoTime->hide(); btnQRZ = new Fl_Button(defwidget); btnQRZ->hide(); qsoClear = new Fl_Button(defwidget); qsoClear->hide(); qsoSave = new Fl_Button(defwidget); qsoSave->hide(); txtRigName = new Fl_Box(defwidget); txtRigName->hide(); qsoFreqDisp = new cFreqControl(0,0,100,10,""); qsoFreqDisp->hide(); qso_opMODE = new Fl_ComboBox(defwidget); qso_opMODE->hide(); qso_opBW = new Fl_ComboBox(defwidget); qso_opBW->hide(); qso_opPICK = new Fl_Button(defwidget); qso_opPICK->hide(); inpFreq = new Fl_Input2(defwidget); inpFreq->hide(); inpTimeOff = new Fl_Input2(defwidget); inpTimeOff->hide(); inpTimeOn = new Fl_Input2(defwidget); inpTimeOn->hide(); btnTimeOn = new Fl_Button(defwidget); btnTimeOn->hide(); inpCall = new Fl_Input2(defwidget); inpCall->hide(); inpName = new Fl_Input2(defwidget); inpName->hide(); inpRstIn = new Fl_Input2(defwidget); inpRstIn->hide(); inpRstOut = new Fl_Input2(defwidget); inpRstOut->hide(); inpFreq1 = new Fl_Input2(defwidget); inpFreq1->hide(); inpTimeOff1 = new Fl_Input2(defwidget); inpTimeOff1->hide(); inpTimeOn1 = new Fl_Input2(defwidget); inpTimeOn1->hide(); btnTimeOn1 = new Fl_Button(defwidget); btnTimeOn1->hide(); inpCall1 = new Fl_Input2(defwidget); inpCall1->hide(); inpName1 = new Fl_Input2(defwidget); inpName1->hide(); inpRstIn1 = new Fl_Input2(defwidget); inpRstIn1->hide(); inpRstOut1 = new Fl_Input2(defwidget); inpRstOut1->hide(); inpXchgIn1 = new Fl_Input2(defwidget); inpXchgIn1->hide(); outSerNo1 = new Fl_Input2(defwidget); outSerNo1->hide(); inpSerNo1 = new Fl_Input2(defwidget); inpSerNo1->hide(); qsoFreqDisp1 = new cFreqControl(defwidget); qsoFreqDisp1->hide(); inpTimeOff2 = new Fl_Input2(defwidget); inpTimeOff2->hide(); inpTimeOn2 = new Fl_Input2(defwidget); inpTimeOn2->hide(); btnTimeOn2 = new Fl_Button(defwidget); btnTimeOn2->hide(); inpCall2 = new Fl_Input2(defwidget); inpCall2->hide(); inpName2 = new Fl_Input2(defwidget); inpName2->hide(); inpRstIn2 = new Fl_Input2(defwidget); inpRstIn2->hide(); inpRstOut2 = new Fl_Input2(defwidget); inpRstOut2->hide(); qsoFreqDisp2 = new cFreqControl(defwidget); qsoFreqDisp2->hide(); qso_opPICK2 = new Fl_Button(defwidget); qso_opPICK2->hide(); qsoClear2 = new Fl_Button(defwidget); qsoClear2->hide(); qsoSave2 = new Fl_Button(defwidget); qsoSave2->hide(); btnQRZ2 = new Fl_Button(defwidget); btnQRZ2->hide(); inpTimeOff3 = new Fl_Input2(defwidget); inpTimeOff3->hide(); inpTimeOn3 = new Fl_Input2(defwidget); inpTimeOn3->hide(); btnTimeOn3 = new Fl_Button(defwidget); btnTimeOn3->hide(); inpCall3 = new Fl_Input2(defwidget); inpCall3->hide(); outSerNo2 = new Fl_Input2(defwidget); outSerNo2->hide(); inpSerNo2 = new Fl_Input2(defwidget); inpSerNo2->hide(); inpXchgIn2 = new Fl_Input2(defwidget); inpXchgIn2->hide(); qsoFreqDisp3 = new cFreqControl(defwidget); qsoFreqDisp3->hide(); qso_opPICK3 = new Fl_Button(defwidget); qso_opPICK3->hide(); qsoClear3 = new Fl_Button(defwidget); qsoClear3->hide(); qsoSave3 = new Fl_Button(defwidget); qsoSave3->hide(); inpCall4 = new Fl_Input2(defwidget); inpCall4->hide(); qso_opBrowser = new Fl_Browser(defwidget); qso_opBrowser->hide(); qso_btnAddFreq = new Fl_Button(defwidget); qso_btnAddFreq->hide(); qso_btnSelFreq = new Fl_Button(defwidget); qso_btnSelFreq->hide(); qso_btnDelFreq = new Fl_Button(defwidget); qso_btnDelFreq->hide(); qso_btnClearList = new Fl_Button(defwidget); qso_btnClearList->hide(); qso_btnAct = new Fl_Button(defwidget); qso_btnAct->hide(); qso_inpAct = new Fl_Input2(defwidget); qso_inpAct->hide(); valRcvMixer = new Fl_Value_Slider2(defwidget); valRcvMixer->hide(); valXmtMixer = new Fl_Value_Slider2(defwidget); valXmtMixer->hide(); dummywindow->end(); dummywindow->hide(); } void make_scopeviewer() { scopeview = new Fl_Double_Window(0,0,140,140, _("Scope")); scopeview->xclass(PACKAGE_NAME); digiscope = new Digiscope (0, 0, 140, 140); scopeview->resizable(digiscope); scopeview->size_range(SCOPEWIN_MIN_WIDTH, SCOPEWIN_MIN_HEIGHT); scopeview->end(); scopeview->hide(); } void altTabs() { tabsConfigure->remove(tabMisc); tabsConfigure->remove(tabQRZ); tabsUI->remove(tabUserInterface); tabsUI->remove(tabContest); tabsUI->remove(tabWF_UI); tabsUI->remove(tabMBars); tabsModems->remove(tabFeld); } static int WF_only_height = 0; void create_fl_digi_main_WF_only() { int fnt = fl_font(); int fsize = fl_size(); int freqheight = Hentry + 2 * pad; int Y = 0; fl_font(fnt, freqheight); fl_font(fnt, fsize); IMAGE_WIDTH = 4000;//progdefaults.HighFreqCutoff; Hwfall = progdefaults.wfheight; Wwfall = progStatus.mainW - 2 * DEFAULT_SW - 2 * pad; WF_only_height = Hmenu + Hwfall + Hstatus + 4 * pad; fl_digi_main = new Fl_Double_Window(progStatus.mainW, WF_only_height); mnuFrame = new Fl_Group(0,0,progStatus.mainW, Hmenu); mnu = new Fl_Menu_Bar(0, 0, progStatus.mainW - 200 - pad, Hmenu); // do some more work on the menu for (size_t i = 0; i < sizeof(alt_menu_)/sizeof(alt_menu_[0]); i++) { // FL_NORMAL_SIZE may have changed; update the menu items if (alt_menu_[i].text) { alt_menu_[i].labelsize_ = FL_NORMAL_SIZE; } // set the icon label for items with the multi label type if (alt_menu_[i].labeltype() == _FL_MULTI_LABEL) set_icon_label(&alt_menu_[i]); } mnu->menu(alt_menu_); btnAutoSpot = new Fl_Light_Button(progStatus.mainW - 200 - pad, 0, 50, Hmenu, "Spot"); btnAutoSpot->selection_color(progdefaults.SpotColor); btnAutoSpot->callback(cbAutoSpot, 0); btnAutoSpot->deactivate(); btnRSID = new Fl_Light_Button(progStatus.mainW - 150 - pad, 0, 50, Hmenu, "RxID"); btnRSID->selection_color(progdefaults.RxIDColor); btnRSID->tooltip("Receive RSID"); btnRSID->callback(cbRSID, 0); btnTxRSID = new Fl_Light_Button(progStatus.mainW - 100 - pad, 0, 50, Hmenu, "TxID"); btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->tooltip("Transmit RSID"); btnTxRSID->callback(cbTxRSID, 0); btnTune = new Fl_Light_Button(progStatus.mainW - 50 - pad, 0, 50, Hmenu, "TUNE"); btnTune->selection_color(progdefaults.TuneColor); btnTune->callback(cbTune, 0); mnuFrame->resizable(mnu); mnuFrame->end(); Y = Hmenu + pad; Fl_Pack *wfpack = new Fl_Pack(0, Y, progStatus.mainW, Hwfall); wfpack->type(1); wf = new waterfall(0, Y, Wwfall, Hwfall); wf->end(); pgrsSquelch = new Progress( rightof(wf), Y + pad, DEFAULT_SW, Hwfall - 2 * pad, ""); pgrsSquelch->color(FL_BACKGROUND2_COLOR, FL_DARK_GREEN); pgrsSquelch->type(Progress::VERTICAL); pgrsSquelch->tooltip(_("Detected signal level")); sldrSquelch = new Fl_Slider2( rightof(pgrsSquelch), Y + pad, DEFAULT_SW, Hwfall - 2 * pad, ""); sldrSquelch->minimum(100); sldrSquelch->maximum(0); sldrSquelch->step(1); sldrSquelch->value(progStatus.sldrSquelchValue); sldrSquelch->callback((Fl_Callback*)cb_sldrSquelch); sldrSquelch->color(FL_INACTIVE_COLOR); sldrSquelch->tooltip(_("Squelch level")); Fl_Group::current()->resizable(wf); wfpack->end(); Y += (Hwfall + pad); hpack = new Fl_Pack(0, Y, progStatus.mainW, Hstatus); hpack->type(1); MODEstatus = new Fl_Button(0, Y, Wmode+30, Hstatus, ""); MODEstatus->box(FL_DOWN_BOX); MODEstatus->color(FL_BACKGROUND2_COLOR); MODEstatus->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); MODEstatus->callback(status_cb, (void *)0); MODEstatus->when(FL_WHEN_CHANGED); MODEstatus->tooltip(_("Left click: change mode\nRight click: configure")); cntCW_WPM = new Fl_Counter2(rightof(MODEstatus), Y, Ws2n - Hstatus, Hstatus, ""); cntCW_WPM->callback(cb_cntCW_WPM); cntCW_WPM->minimum(progdefaults.CWlowerlimit); cntCW_WPM->maximum(progdefaults.CWupperlimit); cntCW_WPM->value(progdefaults.CWspeed); cntCW_WPM->tooltip(_("CW transmit WPM")); cntCW_WPM->type(1); cntCW_WPM->step(1); cntCW_WPM->hide(); btnCW_Default = new Fl_Button(rightof(cntCW_WPM), Y, Hstatus, Hstatus, "*"); btnCW_Default->callback(cb_btnCW_Default); btnCW_Default->tooltip(_("Default WPM")); btnCW_Default->hide(); Status1 = new Fl_Box(rightof(MODEstatus), Y, Ws2n, Hstatus, ""); Status1->box(FL_DOWN_BOX); Status1->color(FL_BACKGROUND2_COLOR); Status1->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); Status2 = new Fl_Box(rightof(Status1), Y, Wimd, Hstatus, ""); Status2->box(FL_DOWN_BOX); Status2->color(FL_BACKGROUND2_COLOR); Status2->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); StatusBar = new Fl_Box( rightof(Status2), Y, progStatus.mainW - bwSqlOnOff - bwAfcOnOff - Wwarn - bwTxLevel - 2 * DEFAULT_SW - rightof(Status2), Hstatus, ""); StatusBar->box(FL_DOWN_BOX); StatusBar->color(FL_BACKGROUND2_COLOR); StatusBar->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); cntTxLevel = new Fl_Counter2( rightof(StatusBar) + 2 * pad, Y, bwTxLevel - 4 * pad, Hstatus, ""); cntTxLevel->minimum(-30); cntTxLevel->maximum(0); cntTxLevel->value(-6); cntTxLevel->callback((Fl_Callback*)cb_cntTxLevel); cntTxLevel->value(progdefaults.txlevel); cntTxLevel->lstep(1.0); cntTxLevel->tooltip(_("Tx level attenuator (dB)")); WARNstatus = new Fl_Box( rightof(StatusBar) + pad, Y, Wwarn, Hstatus, ""); WARNstatus->box(FL_DIAMOND_DOWN_BOX); WARNstatus->color(FL_BACKGROUND_COLOR); WARNstatus->labelcolor(FL_RED); WARNstatus->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); int sql_width = bwSqlOnOff; btnAFC = new Fl_Light_Button( progStatus.mainW - bwSqlOnOff - bwAfcOnOff, Y, bwAfcOnOff, Hstatus, "AFC"); btnAFC->selection_color(progdefaults.AfcColor); btnSQL = new Fl_Light_Button( progStatus.mainW - bwSqlOnOff, Y, sql_width, Hstatus, "SQL"); btnSQL->selection_color(progdefaults.Sql1Color); btnAFC->callback(cbAFC, 0); btnAFC->value(1); btnAFC->tooltip(_("Automatic Frequency Control")); btnSQL->callback(cbSQL, 0); btnSQL->value(1); btnSQL->tooltip(_("Squelch")); Fl_Group::current()->resizable(StatusBar); hpack->end(); Fl::add_handler(wo_default_handler); fl_digi_main->end(); fl_digi_main->callback(cb_wMain); fl_digi_main->resizable(wf); const struct { bool var; const char* label; } toggles[] = { { progStatus.DOCKEDSCOPE, DOCKEDSCOPE_MLABEL } }; Fl_Menu_Item* toggle; for (size_t i = 0; i < sizeof(toggles)/sizeof(*toggles); i++) { if (toggles[i].var && (toggle = getMenuItem(toggles[i].label, alt_menu_))) { toggle->set(); if (toggle->callback()) { mnu->value(toggle); toggle->do_callback(reinterpret_cast(mnu)); } } } make_scopeviewer(); noop_controls(); progdefaults.WF_UIwfcarrier = progdefaults.WF_UIwfreflevel = progdefaults.WF_UIwfampspan = progdefaults.WF_UIwfmode = progdefaults.WF_UIx1 = progdefaults.WF_UIwfshift = progdefaults.WF_UIwfdrop = true; progdefaults.WF_UIrev = progdefaults.WF_UIwfstore = progdefaults.WF_UIxmtlock = progdefaults.WF_UIqsy = false; wf->UI_select(true); createConfig(); createRecordLoader(); if (withnoise) grpNoise->show(); altTabs(); } void create_fl_digi_main(int argc, char** argv) { if (bWF_only) create_fl_digi_main_WF_only(); else create_fl_digi_main_primary(); #if defined(__WOE32__) # ifndef IDI_ICON # define IDI_ICON 101 # endif fl_digi_main->icon((char*)LoadIcon(fl_display, MAKEINTRESOURCE(IDI_ICON))); #elif !defined(__APPLE__) && USE_X make_pixmap(&fldigi_icon_pixmap, fldigi_icon, argc, argv); fl_digi_main->icon((char *)fldigi_icon_pixmap); #endif fl_digi_main->xclass(PACKAGE_NAME); fl_digi_main->size_range( WMIN, bWF_only ? WF_only_height : HMIN, 0, bWF_only ? WF_only_height : 0); } void put_freq(double frequency) { wf->carrier((int)floor(frequency + 0.5)); } void put_Bandwidth(int bandwidth) { wf->Bandwidth ((int)bandwidth); } static void callback_set_metric(double metric) { pgrsSquelch->value(metric); if (!progStatus.sqlonoff) return; if (metric < progStatus.sldrSquelchValue) btnSQL->selection_color(progdefaults.Sql1Color); else btnSQL->selection_color(progdefaults.Sql2Color); btnSQL->redraw_label(); } void global_display_metric(double metric) { FL_LOCK_D(); REQ_DROP(callback_set_metric, metric); FL_UNLOCK_D(); FL_AWAKE_D(); } void put_cwRcvWPM(double wpm) { int U = progdefaults.CWupperlimit; int L = progdefaults.CWlowerlimit; double dWPM = 100.0*(wpm - L)/(U - L); FL_LOCK_D(); REQ_DROP(static_cast(&Fl_Progress::value), prgsCWrcvWPM, dWPM); REQ_DROP(static_cast(&Fl_Value_Output::value), valCWrcvWPM, (int)wpm); FL_UNLOCK_D(); FL_AWAKE_D(); } void set_scope_mode(Digiscope::scope_mode md) { if (digiscope) { digiscope->mode(md); REQ(&Fl_Window::size_range, scopeview, SCOPEWIN_MIN_WIDTH, SCOPEWIN_MIN_HEIGHT, 0, 0, 0, 0, (md == Digiscope::PHASE || md == Digiscope::XHAIRS)); } wf->wfscope->mode(md); if (md == Digiscope::SCOPE) set_scope_clear_axis(); } void set_scope(double *data, int len, bool autoscale) { if (digiscope) digiscope->data(data, len, autoscale); wf->wfscope->data(data, len, autoscale); } void set_phase(double phase, double quality, bool highlight) { if (digiscope) digiscope->phase(phase, quality, highlight); wf->wfscope->phase(phase, quality, highlight); } void set_rtty(double flo, double fhi, double amp) { if (digiscope) digiscope->rtty(flo, fhi, amp); wf->wfscope->rtty(flo, fhi, amp); } void set_video(double *data, int len, bool dir) { if (digiscope) digiscope->video(data, len, dir); wf->wfscope->video(data, len, dir); } void set_zdata(cmplx *zarray, int len) { if (digiscope) digiscope->zdata(zarray, len); wf->wfscope->zdata(zarray, len); } void set_scope_xaxis_1(double y1) { if (digiscope) digiscope->xaxis_1(y1); wf->wfscope->xaxis_1(y1); } void set_scope_xaxis_2(double y2) { if (digiscope) digiscope->xaxis_2(y2); wf->wfscope->xaxis_2(y2); } void set_scope_yaxis_1(double x1) { if (digiscope) digiscope->yaxis_1(x1); wf->wfscope->yaxis_1(x1); } void set_scope_yaxis_2(double x2) { if (digiscope) digiscope->yaxis_2(x2); wf->wfscope->yaxis_2(x2); } void set_scope_clear_axis() { if (digiscope) { digiscope->xaxis_1(0); digiscope->xaxis_2(0); digiscope->yaxis_1(0); digiscope->yaxis_2(0); } wf->wfscope->xaxis_1(0); wf->wfscope->xaxis_2(0); wf->wfscope->yaxis_1(0); wf->wfscope->yaxis_2(0); } // raw buffer functions can ONLY be called by FLMAIN_TID //====================================================================== #define RAW_BUFF_LEN 4096 static char rxtx_raw_chars[RAW_BUFF_LEN+1] = ""; static char rxtx_raw_buff[RAW_BUFF_LEN+1] = ""; static int rxtx_raw_len = 0; char *get_rxtx_data() { ENSURE_THREAD(FLMAIN_TID); memset(rxtx_raw_chars, 0, RAW_BUFF_LEN+1); strncpy(rxtx_raw_chars, rxtx_raw_buff, RAW_BUFF_LEN); memset(rxtx_raw_buff, 0, RAW_BUFF_LEN+1); rxtx_raw_len = 0; return rxtx_raw_chars; } void add_rxtx_char(int data) { ENSURE_THREAD(FLMAIN_TID); if (rxtx_raw_len == RAW_BUFF_LEN) { memset(rxtx_raw_buff, 0, RAW_BUFF_LEN+1); rxtx_raw_len = 0; } rxtx_raw_buff[rxtx_raw_len++] = (unsigned char)data; } //====================================================================== static char rx_raw_chars[RAW_BUFF_LEN+1] = ""; static char rx_raw_buff[RAW_BUFF_LEN+1] = ""; static int rx_raw_len = 0; char *get_rx_data() { ENSURE_THREAD(FLMAIN_TID); memset(rx_raw_chars, 0, RAW_BUFF_LEN+1); strncpy(rx_raw_chars, rx_raw_buff, RAW_BUFF_LEN); memset(rx_raw_buff, 0, RAW_BUFF_LEN+1); rx_raw_len = 0; return rx_raw_chars; } void add_rx_char(int data) { ENSURE_THREAD(FLMAIN_TID); add_rxtx_char(data); if (rx_raw_len == RAW_BUFF_LEN) { memset(rx_raw_buff, 0, RAW_BUFF_LEN+1); rx_raw_len = 0; } rx_raw_buff[rx_raw_len++] = (unsigned char)data; } //====================================================================== static char tx_raw_chars[RAW_BUFF_LEN+1] = ""; static char tx_raw_buff[RAW_BUFF_LEN+1] = ""; static int tx_raw_len = 0; char *get_tx_data() { ENSURE_THREAD(FLMAIN_TID); memset(tx_raw_chars, 0, RAW_BUFF_LEN+1); strncpy(tx_raw_chars, tx_raw_buff, RAW_BUFF_LEN); memset(tx_raw_buff, 0, RAW_BUFF_LEN+1); tx_raw_len = 0; return tx_raw_chars; } void add_tx_char(int data) { ENSURE_THREAD(FLMAIN_TID); add_rxtx_char(data); if (tx_raw_len == RAW_BUFF_LEN) { memset(tx_raw_buff, 0, RAW_BUFF_LEN+1); tx_raw_len = 0; } tx_raw_buff[tx_raw_len++] = (unsigned char)data; } //====================================================================== static void display_rx_data(const unsigned char data, int style) { ReceiveText->add(data, style); if (bWF_only) return; speak(data); if (Maillogfile) Maillogfile->log_to_file(cLogfile::LOG_RX, string(1, (const char)data)); if (progStatus.LOGenabled) logfile->log_to_file(cLogfile::LOG_RX, string(1, (const char)data)); } static void rx_parser(const unsigned char data, int style) { // assign a style to the incoming data if (extract_wrap || extract_flamp) style = FTextBase::RECV; if ((data < ' ') && iscntrl(data)) style = FTextBase::CTRL; if (wf->tmp_carrier()) style = FTextBase::ALTR; // Collapse the "\r\n" sequence into "\n". // // The 'data' variable possibly contains only a part of a multi-byte // UTF-8 character. This is not a problem. All data has passed // through a distiller before we got here, so we can be sure that // the input is valid UTF-8. All bytes of a multi-byte character // will therefore have the eight bit set and can not match either // '\r' or '\n'. static unsigned int lastdata = 0; if (data == '\n' && lastdata == '\r'); else if (data == '\r') { add_rx_char('\n'); display_rx_data('\n', style); } else { add_rx_char(data); display_rx_data(data, style); } lastdata = data; if (!(data < ' ' && iscntrl(data)) && progStatus.spot_recv) spot_recv(data); } static void put_rx_char_flmain(unsigned int data, int style) { ENSURE_THREAD(FLMAIN_TID); // possible destinations for the data enum dest_type { DEST_RECV, // ordinary received text DEST_ALTR // alternate received text }; static enum dest_type destination = DEST_RECV; static enum dest_type prev_destination = DEST_RECV; // Determine the destination of the incoming data. If the destination had // changed, clear the contents of the distiller. destination = (wf->tmp_carrier() ? DEST_ALTR : DEST_RECV); if (destination != prev_destination) { rx_chd.reset(); rx_chd.clear(); } // select a byte translation table trx_mode mode = active_modem->get_mode(); if (mode == MODE_RTTY || mode == MODE_CW) rx_chd.rx((unsigned char *)ascii[data & 0xFF]); else if (mailclient || mailserver || (data > 0 && data < 0x20)) rx_chd.rx((unsigned char *)ascii2[data & 0xFF]); else rx_chd.rx(data); // feed the decoded data into the RX parser if (rx_chd.data_length() > 0) { const char *ptr = rx_chd.data().data(); const char *end = ptr + rx_chd.data_length(); while (ptr < end) rx_parser((const unsigned char)*ptr++, style); rx_chd.clear(); } } void put_rx_char(unsigned int data, int style) { #if BENCHMARK_MODE if (!benchmark.output.empty()) { if (unlikely(benchmark.buffer.length() + 16 > benchmark.buffer.capacity())) benchmark.buffer.reserve(benchmark.buffer.capacity() + BUFSIZ); benchmark.buffer += (char)data; } #else if (progdefaults.autoextract == true) rx_extract_add(data); WriteARQ(data); REQ(put_rx_char_flmain, data, style); #endif } static string strSecText = ""; static void put_sec_char_flmain(char chr) { ENSURE_THREAD(FLMAIN_TID); fl_font(FL_HELVETICA, FL_NORMAL_SIZE); char s[2] = "W"; int lc = (int)ceil(fl_width(s)); int w = StatusBar->w(); int lw = (int)ceil(fl_width(StatusBar->label())); int over = 2 * lc + lw - w; if (chr >= ' ' && chr <= 'z') { if ( over > 0 ) strSecText.erase(0, (int)(1.0 * over / lc + 0.5)); strSecText.append(1, chr); StatusBar->label(strSecText.c_str()); WARNstatus->damage(); } } void put_sec_char(char chr) { REQ(put_sec_char_flmain, chr); } static void clear_status_cb(void* arg) { reinterpret_cast(arg)->label(""); } static void dim_status_cb(void* arg) { reinterpret_cast(arg)->deactivate(); } static void (*const timeout_action[STATUS_NUM])(void*) = { clear_status_cb, dim_status_cb }; static void put_status_msg(Fl_Box* status, const char* msg, double timeout, status_timeout action) { status->activate(); status->label(msg); if (timeout > 0.0) { Fl::remove_timeout(timeout_action[action], status); Fl::add_timeout(timeout, timeout_action[action], status); } } void put_status(const char *msg, double timeout, status_timeout action) { static char m[50]; strncpy(m, msg, sizeof(m)); m[sizeof(m) - 1] = '\0'; REQ(put_status_msg, StatusBar, m, timeout, action); } void put_Status2(const char *msg, double timeout, status_timeout action) { static char m[60]; strncpy(m, msg, sizeof(m)); m[sizeof(m) - 1] = '\0'; info2msg = msg; REQ(put_status_msg, Status2, m, timeout, action); } void put_Status1(const char *msg, double timeout, status_timeout action) { static char m[60]; strncpy(m, msg, sizeof(m)); m[sizeof(m) - 1] = '\0'; info1msg = msg; if (progStatus.NO_RIGLOG) return; REQ(put_status_msg, Status1, m, timeout, action); } void put_WARNstatus(double val) { FL_LOCK_D(); if (val < 0.05) WARNstatus->color(progdefaults.LowSignal); if (val >= 0.05) WARNstatus->color(progdefaults.NormSignal); if (val >= 0.9) WARNstatus->color(progdefaults.HighSignal); if (val >= 0.98) WARNstatus->color(progdefaults.OverSignal); WARNstatus->redraw(); FL_UNLOCK_D(); } void set_CWwpm() { FL_LOCK_D(); sldrCWxmtWPM->value(progdefaults.CWspeed); cntCW_WPM->value(progdefaults.CWspeed); FL_UNLOCK_D(); } void clear_StatusMessages() { FL_LOCK_D(); StatusBar->label(""); Status1->label(""); Status2->label(""); info1msg = ""; info2msg = ""; FL_UNLOCK_D(); FL_AWAKE_D(); } void put_MODEstatus(const char* fmt, ...) { static char s[32]; va_list args; va_start(args, fmt); vsnprintf(s, sizeof(s), fmt, args); va_end(args); REQ(static_cast(&Fl_Button::label), MODEstatus, s); } void put_MODEstatus(trx_mode mode) { put_MODEstatus("%s", mode_info[mode].sname); } void put_rx_data(int *data, int len) { FHdisp->data(data, len); } bool idling = false; void get_tx_char_idle(void *) { idling = false; progStatus.repeatIdleTime = 0; } int Qwait_time = 0; int Qidle_time = 0; static int que_timeout = 0; bool que_ok = true; bool que_waiting = true; void post_queue_execute(void*) { if (!que_timeout) { LOG_ERROR("%s", "timed out"); return; } while (!que_ok && trx_state != STATE_RX) { que_timeout--; Fl::repeat_timeout(0.05, post_queue_execute); } trx_transmit(); } void queue_execute_after_rx(void*) { que_waiting = false; if (!que_timeout) { LOG_ERROR("%s", "timed out"); return; } while (trx_state == STATE_TX) { que_timeout--; Fl::repeat_timeout(0.05, queue_execute_after_rx); return; } que_ok = false; que_timeout = 100; // 5 seconds Fl::add_timeout(0.05, post_queue_execute); queue_execute(); } void do_que_execute(void *) { que_waiting = false; queue_execute(); } char szTestChar[] = "E|I|S|T|M|O|A|V"; int get_tx_char(void) { enum { STATE_CHAR, STATE_CTRL }; static int state = STATE_CHAR; if (!que_ok) { return GET_TX_CHAR_NODATA; } if (Qwait_time) { return GET_TX_CHAR_NODATA; } if (Qidle_time) { return GET_TX_CHAR_NODATA; } if (macro_idle_on) { return GET_TX_CHAR_NODATA; } if (idling) { return GET_TX_CHAR_NODATA; } if (xmltest_char_available) { num_cps_chars++; return xmltest_char(); } if (arq_text_available) { return arq_get_char(); } if (active_modem == cw_modem && progdefaults.QSKadjust) return szTestChar[2 * progdefaults.TestChar]; if ( (progStatus.repeatMacro > -1) && (progStatus.repeatIdleTime > 0) && !idling ) { Fl::add_timeout(progStatus.repeatIdleTime, get_tx_char_idle); idling = true; return GET_TX_CHAR_NODATA; } int c; if ((c = tx_encoder.pop()) != -1) return(c); if ((progStatus.repeatMacro > -1) && text2repeat.length()) { string repeat_content; int utf8size = fl_utf8len1(text2repeat[repeatchar]); for (int i = 0; i < utf8size; i++) repeat_content += text2repeat[repeatchar + i]; repeatchar += utf8size; tx_encoder.push(repeat_content); if (repeatchar >= text2repeat.length()) { text2repeat.clear(); macros.repeat(progStatus.repeatMacro); } goto transmit; } c = TransmitText->nextChar(); if (c == GET_TX_CHAR_ETX) { return c; } if (c == '^' && state == STATE_CHAR) { state = STATE_CTRL; c = TransmitText->nextChar(); } if (c == -1) { queue_reset(); return(GET_TX_CHAR_NODATA); } if (state == STATE_CTRL) { state = STATE_CHAR; switch (c) { case 'p': case 'P': TransmitText->pause(); break; case 'r': REQ_SYNC(&FTextTX::clear_sent, TransmitText); return(GET_TX_CHAR_ETX); break; case 'R': if (TransmitText->eot()) { REQ_SYNC(&FTextTX::clear_sent, TransmitText); return(GET_TX_CHAR_ETX); } else return(GET_TX_CHAR_NODATA); break; case 'L': REQ(qso_save_now); return(GET_TX_CHAR_NODATA); break; case 'C': REQ(clearQSO); return(GET_TX_CHAR_NODATA); break; case '!': if (queue_must_rx()) { que_timeout = 400; // 20 seconds REQ(queue_execute_after_rx, (void *)0); while(que_waiting) MilliSleep(1); return(GET_TX_CHAR_ETX); } else { REQ(do_que_execute, (void*)0); while(que_waiting) MilliSleep(1); return(GET_TX_CHAR_NODATA); } break; default: char utf8_char[6]; int utf8_len = fl_utf8encode(c, utf8_char); tx_encoder.push("^" + string(utf8_char, utf8_len)); } } else if (c == '\n') { tx_encoder.push("\r\n"); } else { char utf8_char[6]; int utf8_len = fl_utf8encode(c, utf8_char); tx_encoder.push(string(utf8_char, utf8_len)); } transmit: c = tx_encoder.pop(); if (c == -1) { LOG_ERROR("TX encoding conversion error: pushed content, but got nothing back"); return(GET_TX_CHAR_NODATA); } if (progdefaults.tx_lowercase) c = fl_tolower(c); return(c); } void put_echo_char(unsigned int data, int style) { // suppress print to rx widget when making timing tests if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) return; trx_mode mode = active_modem->get_mode(); if (mode == MODE_CW && progdefaults.QSKadjust) return; REQ(&add_tx_char, data); // select a byte translation table const char **asc = NULL; if (mailclient || mailserver) asc = ascii2; else if (arq_text_available) asc = ascii2; else if (mode == MODE_RTTY || mode == MODE_CW) asc = ascii; else if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) asc = ascii3; // assign a style to the data if (asc == ascii2 && iscntrl(data)) style = FTextBase::CTRL; // receive and convert the data static unsigned int lastdata = 0; if (data == '\r' && lastdata == '\r') // reject multiple CRs return; if (asc != NULL) // MAIL / ARQ / RTTY / CW echo_chd.rx((unsigned char *)asc[data & 0xFF]); else echo_chd.rx(data & 0xFF); lastdata = data; if (Maillogfile) { string s = iscntrl(data & 0x7F) ? ascii2[data & 0x7F] : string(1, data); Maillogfile->log_to_file(cLogfile::LOG_TX, s); } if (echo_chd.data_length() > 0) { REQ(&FTextRX::addstr, ReceiveText, echo_chd.data(), style); if (progStatus.LOGenabled) logfile->log_to_file(cLogfile::LOG_TX, echo_chd.data()); echo_chd.clear(); } } void resetRTTY() { if (active_modem->get_mode() == MODE_RTTY) trx_start_modem(active_modem); } void resetOLIVIA() { trx_mode md = active_modem->get_mode(); if (md >= MODE_OLIVIA && md <= MODE_OLIVIA_64_2000) trx_start_modem(active_modem); } void resetCONTESTIA() { if (active_modem->get_mode() == MODE_CONTESTIA) trx_start_modem(active_modem); } void resetTHOR() { trx_mode md = active_modem->get_mode(); if (md == MODE_THOR4 || md == MODE_THOR5 || md == MODE_THOR8 || md == MODE_THOR11 || md == MODE_THOR16 || md == MODE_THOR22 || md == MODE_THOR25x4 || md == MODE_THOR50x1 || md == MODE_THOR50x2 || md == MODE_THOR100 ) trx_start_modem(active_modem); } void resetDOMEX() { trx_mode md = active_modem->get_mode(); if (md == MODE_DOMINOEX4 || md == MODE_DOMINOEX5 || md == MODE_DOMINOEX8 || md == MODE_DOMINOEX11 || md == MODE_DOMINOEX16 || md == MODE_DOMINOEX22 ) trx_start_modem(active_modem); } void enableMixer(bool on) { #if !USE_OSS on = false; #endif FL_LOCK_D(); if (on) { progdefaults.EnableMixer = true; #if USE_OSS mixer = new MixerOSS; #else mixer = new MixerBase; #endif try { mixer->openMixer(progdefaults.MXdevice.c_str()); } catch (const MixerException& e) { put_status(e.what(), 5); goto ret; } mixer->PCMVolume(progdefaults.PCMvolume); mixer->setXmtLevel(progStatus.XmtMixer); //valXmtMixer->value()); mixer->setRcvGain(progStatus.RcvMixer); //valRcvMixer->value()); if (progdefaults.LineIn == true) setMixerInput(1); else if (progdefaults.MicIn == true) setMixerInput(2); else setMixerInput(0); }else{ progdefaults.EnableMixer = false; if (mixer) mixer->closeMixer(); delete mixer; mixer = 0; } ret: resetMixerControls(); FL_UNLOCK_D(); } void resetMixerControls() { if (bWF_only) return; if (progdefaults.EnableMixer) { menuMix->activate(); btnLineIn->activate(); btnMicIn->activate(); btnMixer->value(1); valPCMvolume->activate(); } else { menuMix->deactivate(); btnLineIn->deactivate(); btnMicIn->deactivate(); btnMixer->value(0); valPCMvolume->deactivate(); } UI_select(); } void setPCMvolume(double vol) { mixer->PCMVolume(vol); progdefaults.PCMvolume = vol; } void setMixerInput(int dev) { int n= -1; switch (dev) { case 0: n = mixer->InputSourceNbr("Vol"); break; case 1: n = mixer->InputSourceNbr("Line"); break; case 2: n = mixer->InputSourceNbr("Mic"); break; default: n = mixer->InputSourceNbr("Vol"); } if (n != -1) mixer->SetCurrentInputSource(n); } void resetSoundCard() { bool mixer_enabled = progdefaults.EnableMixer; enableMixer(false); trx_reset(); if (mixer_enabled) enableMixer(true); } void setReverse(int rev) { active_modem->set_reverse(rev); } void start_tx() { if (!(active_modem->get_cap() & modem::CAP_TX)) return; trx_transmit(); } void abort_tx() { if (trx_state == STATE_TUNE) { btnTune->value(0); btnTune->do_callback(); return; } if (trx_state == STATE_TX) { queue_reset(); trx_start_modem(active_modem); } } void qsy(long long rfc, int fmid) { if (rfc <= 0LL) rfc = wf->rfcarrier(); if (fmid > 0) { if (active_modem->freqlocked()) active_modem->set_freqlock(false); else active_modem->set_freq(fmid); // required for modems that will not change their freq (e.g. mt63) int adj = active_modem->get_freq() - fmid; if (adj) rfc += (wf->USB() ? adj : -adj); } if (rfc == wf->rfcarrier()) return; if (progdefaults.chkUSERIGCATis) REQ(rigCAT_set_qsy, rfc); #if USE_HAMLIB else if (progdefaults.chkUSEHAMLIBis) REQ(hamlib_set_qsy, rfc); #endif else if (progdefaults.chkUSEXMLRPCis) REQ(xmlrpc_set_qsy, rfc); else LOG_VERBOSE("Ignoring rfcarrier change request (no rig control)"); } map qrg_marks; qrg_mode_t last_marked_qrg; void note_qrg(bool no_dup, const char* prefix, const char* suffix, trx_mode mode, long long rfc, int afreq) { qrg_mode_t m; m.rfcarrier = (rfc ? rfc : wf->rfcarrier()); m.carrier = (afreq ? afreq : active_modem->get_freq()); m.mode = (mode < NUM_MODES ? mode : active_modem->get_mode()); if (no_dup && last_marked_qrg == m) return; last_marked_qrg = m; char buf[64]; time_t t = time(NULL); struct tm tm; gmtime_r(&t, &tm); size_t r1; if ((r1 = strftime(buf, sizeof(buf), "<<%Y-%m-%dT%H:%MZ ", &tm)) == 0) return; size_t r2; if (m.rfcarrier) r2 = snprintf(buf+r1, sizeof(buf)-r1, "%s @ %lld%c%04d>>", mode_info[m.mode].name, m.rfcarrier, (wf->USB() ? '+' : '-'), m.carrier); else r2 = snprintf(buf+r1, sizeof(buf)-r1, "%s @ %04d>>", mode_info[m.mode].name, m.carrier); if (r2 >= sizeof(buf)-r1) return; qrg_marks[buf] = m; if (prefix && *prefix) ReceiveText->addstr(prefix); ReceiveText->addstr(buf, FTextBase::QSY); ReceiveText->mark(); if (suffix && *suffix) ReceiveText->addstr(suffix); } void xmtrcv_selection_color() { wf->xmtrcv_selection_color(progdefaults.XmtColor); wf->redraw(); } void rev_selection_color() { wf->reverse_selection_color(progdefaults.RevColor); wf->redraw(); } void xmtlock_selection_color() { wf->xmtlock_selection_color(progdefaults.LkColor); wf->redraw(); } void sql_selection_color() { btnSQL->selection_color(progdefaults.Sql1Color); btnSQL->redraw(); } void afc_selection_color() { btnAFC->selection_color(progdefaults.AfcColor); btnAFC->redraw(); } void rxid_selection_color() { btnRSID->selection_color(progdefaults.RxIDColor); btnRSID->redraw(); } void txid_selection_color() { btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->redraw(); } void tune_selection_color() { btnTune->selection_color(progdefaults.TuneColor); btnTune->redraw(); } void spot_selection_color() { btnAutoSpot->selection_color(progdefaults.SpotColor); btnAutoSpot->redraw(); } // Olivia void set_olivia_bw(int bw) { int i; if (bw == 125) i = 0; else if (bw == 250) i = 1; else if (bw == 500) i = 2; else if (bw == 1000) i = 3; else i = 4; bool changed = progdefaults.changed; i_listbox_olivia_bandwidth->index(i+1); i_listbox_olivia_bandwidth->do_callback(); progdefaults.changed = changed; } void set_olivia_tones(int tones) { unsigned i = 0; while (tones >>= 1) i++; bool changed = progdefaults.changed; i_listbox_olivia_tones->index(i+1); i_listbox_olivia_tones->do_callback(); progdefaults.changed = changed; } //Contestia void set_contestia_bw(int bw) { int i; if (bw == 125) i = 0; else if (bw == 250) i = 1; else if (bw == 500) i = 2; else if (bw == 1000) i = 3; else i = 4; bool changed = progdefaults.changed; i_listbox_contestia_bandwidth->index(i+1); i_listbox_contestia_bandwidth->do_callback(); progdefaults.changed = changed; } void set_contestia_tones(int tones) { unsigned i = 0; while (tones >>= 1) i++; bool changed = progdefaults.changed; i_listbox_contestia_tones->index(i+1); i_listbox_contestia_tones->do_callback(); progdefaults.changed = changed; } void set_rtty_shift(int shift) { if (shift < selCustomShift->minimum() || shift > selCustomShift->maximum()) return; // Static const array otherwise will be built at each call. static const int shifts[] = { 23, 85, 160, 170, 182, 200, 240, 350, 425, 850 }; size_t i; for (i = 0; i < sizeof(shifts)/sizeof(*shifts); i++) if (shifts[i] == shift) break; selShift->index(i+1); selShift->do_callback(); if (i == sizeof(shifts)/sizeof(*shifts)) { selCustomShift->value(shift); selCustomShift->do_callback(); } } void set_rtty_baud(float baud) { // Static const array otherwise will be rebuilt at each call. static const float bauds[] = { 45.0f, 45.45f, 50.0f, 56.0f, 75.0f, 100.0f, 110.0f, 150.0f, 200.0f, 300.0f }; for (size_t i = 0; i < sizeof(bauds)/sizeof(*bauds); i++) { if (bauds[i] == baud) { selBaud->index(i+1); selBaud->do_callback(); break; } } } void set_rtty_bits(int bits) { // Static const array otherwise will be built at each call. static const int bits_[] = { 5, 7, 8 }; for (size_t i = 0; i < sizeof(bits_)/sizeof(*bits_); i++) { if (bits_[i] == bits) { selBits->index(i+1); selBits->do_callback(); break; } } } void set_rtty_bw(float bw) { } int notch_frequency = 0; void notch_on(int freq) { notch_frequency = freq; } void notch_off() { notch_frequency = 0; } fldigi-3.21.80/src/dialogs/Viewer.cxx0000664000175000017500000003002312313064025014236 00000000000000// ---------------------------------------------------------------------------- // // Viewer.cxx -- PSK browser // // Copyright (C) 2008-2009 // David Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "config.h" #include "Viewer.h" #include "trx.h" #include "main.h" #include "configuration.h" #include "confdialog.h" #include "status.h" #include "waterfall.h" #include "fl_digi.h" #include "re.h" #include "gettext.h" #include "flmisc.h" #include "spot.h" #include "icons.h" #include "psk_browser.h" #include "view_rtty.h" extern pskBrowser *mainViewer; using namespace std; // // External viewer dialog // Fl_Double_Window *dlgViewer = 0; static Fl_Button *btnCloseViewer; static Fl_Button *btnClearViewer; Fl_Input2 *viewer_inp_seek; Fl_Value_Slider2 *sldrViewerSquelch; pskBrowser *brwsViewer; static long long rfc; static bool usb; void initViewer() { usb = wf->USB(); rfc = wf->rfcarrier(); if (mainViewer) { mainViewer->usb = usb; mainViewer->rfc = rfc; mainViewer->setfont(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); mainViewer->HighLight_1((Fl_Color)progdefaults.bwsrHiLight1); mainViewer->HighLight_2((Fl_Color)progdefaults.bwsrHiLight2); mainViewer->SelectColor((Fl_Color)progdefaults.bwsrSelect); mainViewer->Background1((Fl_Color)progdefaults.bwsrBackgnd1); mainViewer->Background2((Fl_Color)progdefaults.bwsrBackgnd2); mainViewer->makecolors(); mainViewer->clear(); if (active_modem->get_mode() == MODE_RTTY) { mvsquelch->range(-12.0, 6.0); mvsquelch->value(progStatus.VIEWER_rttysquelch); } else { mvsquelch->range(-3.0, 6.0); mvsquelch->value(progStatus.VIEWER_psksquelch); } } if (brwsViewer) { brwsViewer->usb = usb; brwsViewer->rfc = rfc; brwsViewer->setfont(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); brwsViewer->HighLight_1((Fl_Color)progdefaults.bwsrHiLight1); brwsViewer->HighLight_2((Fl_Color)progdefaults.bwsrHiLight2); brwsViewer->SelectColor((Fl_Color)progdefaults.bwsrSelect); brwsViewer->Background1((Fl_Color)progdefaults.bwsrBackgnd1); brwsViewer->Background2((Fl_Color)progdefaults.bwsrBackgnd2); brwsViewer->makecolors(); brwsViewer->clear(); dlgViewer->size(dlgViewer->w(), dlgViewer->h() - brwsViewer->h() + pskBrowser::cheight * progdefaults.VIEWERchannels + 4); if (active_modem->get_mode() == MODE_RTTY) { sldrViewerSquelch->range(-12.0, 6.0); sldrViewerSquelch->value(progStatus.VIEWER_rttysquelch); } else { sldrViewerSquelch->range(-3.0, 6.0); sldrViewerSquelch->value(progStatus.VIEWER_psksquelch); } } if (pskviewer) pskviewer->clear(); if (rttyviewer) rttyviewer->clear(); } void viewaddchr(int ch, int freq, char c, int md) { if (mainViewer) { if (mainViewer->rfc != wf->rfcarrier() || mainViewer->usb != wf->USB()) { mainViewer->rfc = wf->rfcarrier(); mainViewer->usb = wf->USB(); mainViewer->redraw(); } mainViewer->addchr(ch, freq, c, md); } if (dlgViewer) { if (brwsViewer->rfc != wf->rfcarrier() || brwsViewer->usb != wf->USB()) { brwsViewer->rfc = wf->rfcarrier(); brwsViewer->usb = wf->USB(); brwsViewer->redraw(); } brwsViewer->addchr(ch, freq, c, md); } if (progStatus.spot_recv && freq != NULLFREQ) spot_recv(c, ch, freq, md); } void viewclearchannel(int ch) // 0 < ch < channels - 1 { if (mainViewer) mainViewer->clearch(ch, NULLFREQ); if (dlgViewer) brwsViewer->clearch(ch, NULLFREQ); } void viewerswap(int i, int j) { if (mainViewer) mainViewer->swap(i,j); if (dlgViewer) brwsViewer->swap(i,j); } void viewer_redraw() { usb = wf->USB(); rfc = wf->rfcarrier(); if (mainViewer) { mainViewer->usb = usb; mainViewer->rfc = rfc; mainViewer->HighLight_1((Fl_Color)progdefaults.bwsrHiLight1); mainViewer->HighLight_2((Fl_Color)progdefaults.bwsrHiLight2); mainViewer->SelectColor((Fl_Color)progdefaults.bwsrSelect); mainViewer->Background1((Fl_Color)progdefaults.bwsrBackgnd1); mainViewer->Background2((Fl_Color)progdefaults.bwsrBackgnd2); mainViewer->makecolors(); mainViewer->resize(mainViewer->x(), mainViewer->y(), mainViewer->w(), mainViewer->h()); } if (dlgViewer) { brwsViewer->usb = usb; brwsViewer->rfc = rfc; brwsViewer->resize( brwsViewer->x(), brwsViewer->y(), brwsViewer->w(), brwsViewer->h()); brwsViewer->HighLight_1((Fl_Color)progdefaults.bwsrHiLight1); brwsViewer->HighLight_2((Fl_Color)progdefaults.bwsrHiLight2); brwsViewer->SelectColor((Fl_Color)progdefaults.bwsrSelect); brwsViewer->Background1((Fl_Color)progdefaults.bwsrBackgnd1); brwsViewer->Background2((Fl_Color)progdefaults.bwsrBackgnd2); brwsViewer->makecolors(); dlgViewer->redraw(); } } static void cb_btnCloseViewer(Fl_Button*, void*) { progStatus.VIEWERxpos = dlgViewer->x(); progStatus.VIEWERypos = dlgViewer->y(); progStatus.VIEWERwidth = dlgViewer->w(); progStatus.VIEWERheight = dlgViewer->h(); dlgViewer->hide(); } static void cb_btnClearViewer(Fl_Button*, void*) { brwsViewer->clear(); if (mainViewer) mainViewer->clear(); if (pskviewer) pskviewer->clear(); if (rttyviewer) rttyviewer->clear(); } static void cb_brwsViewer(Fl_Hold_Browser*, void*) { if (!pskviewer && !rttyviewer) return; int sel = brwsViewer->value(); if (sel == 0 || sel > progdefaults.VIEWERchannels) return; switch (Fl::event_button()) { case FL_LEFT_MOUSE: if (brwsViewer->freq(sel) != NULLFREQ) { if (progdefaults.VIEWERhistory) { ReceiveText->addchr('\n', FTextBase::RECV); bHistory = true; } else { ReceiveText->addchr('\n', FTextBase::ALTR); ReceiveText->addstr(brwsViewer->line(sel).c_str(), FTextBase::ALTR); } active_modem->set_freq(brwsViewer->freq(sel)); active_modem->set_sigsearch(SIGSEARCH); if (mainViewer) mainViewer->select(sel); } else brwsViewer->deselect(); break; case FL_MIDDLE_MOUSE: // copy from modem // set_freq(sel, active_modem->get_freq()); break; case FL_RIGHT_MOUSE: // reset { int ch = progdefaults.VIEWERascend ? progdefaults.VIEWERchannels - sel : sel - 1; if (pskviewer) pskviewer->clearch(ch); if (rttyviewer) rttyviewer->clearch(ch); brwsViewer->deselect(); if (mainViewer) mainViewer->deselect(); } default: break; } } static void cb_Squelch(Fl_Slider *, void *) { if (active_modem->get_mode() == MODE_RTTY) progStatus.VIEWER_rttysquelch = sldrViewerSquelch->value(); else progStatus.VIEWER_psksquelch = sldrViewerSquelch->value(); if (mainViewer) mvsquelch->value(sldrViewerSquelch->value()); } static void cb_Seek(Fl_Input *, void *) { static Fl_Color seek_color[2] = { FL_FOREGROUND_COLOR, adjust_color(FL_RED, FL_BACKGROUND2_COLOR) }; // invalid RE seek_re.recompile(*viewer_inp_seek->value() ? viewer_inp_seek->value() : "[invalid"); if (viewer_inp_seek->textcolor() != seek_color[!seek_re]) { viewer_inp_seek->textcolor(seek_color[!seek_re]); viewer_inp_seek->redraw(); } progStatus.browser_search = viewer_inp_seek->value(); if (mainViewer) txtInpSeek->value(progStatus.browser_search.c_str()); } Fl_Double_Window* createViewer(void) { fl_font(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); pskBrowser::cwidth = (int)fl_width("W"); pskBrowser::cheight = fl_height(); progStatus.VIEWERnchars = progStatus.VIEWERnchars > 30 ? progStatus.VIEWERnchars : 30; int pad = BWSR_BORDER / 2; int viewerwidth = progStatus.VIEWERwidth - 2*BWSR_BORDER; int viewerheight = progStatus.VIEWERheight - 2 * BWSR_BORDER - pad - 20; Fl_Double_Window* w = new Fl_Double_Window(progStatus.VIEWERxpos, progStatus.VIEWERypos, viewerwidth + 2 * BWSR_BORDER, viewerheight + 2 * BWSR_BORDER + pad + 20 + 20, _("Signal Browser")); Fl_Group* gseek = new Fl_Group(BWSR_BORDER, BWSR_BORDER, viewerwidth, 20); // search field const char* label = _("Find: "); fl_font(FL_HELVETICA, FL_NORMAL_SIZE); viewer_inp_seek = new Fl_Input2(static_cast(BWSR_BORDER + fl_width(label) + fl_width("X")), BWSR_BORDER, 200, gseek->h(), label); viewer_inp_seek->labelfont(FL_HELVETICA); viewer_inp_seek->callback((Fl_Callback*)cb_Seek); viewer_inp_seek->when(FL_WHEN_CHANGED); viewer_inp_seek->textfont(FL_COURIER); viewer_inp_seek->value(progStatus.browser_search.c_str()); viewer_inp_seek->do_callback(); gseek->resizable(0); gseek->end(); brwsViewer = new pskBrowser(BWSR_BORDER, viewer_inp_seek->y() + viewer_inp_seek->h(), viewerwidth, viewerheight); brwsViewer->callback((Fl_Callback*)cb_brwsViewer); brwsViewer->setfont(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); brwsViewer->seek_re = &seek_re; Fl_Group *g = new Fl_Group(BWSR_BORDER, brwsViewer->y() + brwsViewer->h() + pad, viewerwidth, 20); // close button btnCloseViewer = new Fl_Button(g->w() + BWSR_BORDER - 75, g->y(), 75, g->h(), make_icon_label(_("Close"), close_icon)); btnCloseViewer->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); set_icon_label(btnCloseViewer); btnCloseViewer->callback((Fl_Callback*)cb_btnCloseViewer); // clear button btnClearViewer = new Fl_Button(btnCloseViewer->x() - btnCloseViewer->w() - pad, btnCloseViewer->y(), btnCloseViewer->w(), btnCloseViewer->h(), make_icon_label(_("Clear"), edit_clear_icon)); btnClearViewer->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); set_icon_label(btnClearViewer); btnClearViewer->callback((Fl_Callback*)cb_btnClearViewer); btnClearViewer->tooltip(_("Left click to clear text\nRight click to reset frequencies")); // squelch sldrViewerSquelch = new Fl_Value_Slider2(BWSR_BORDER, g->y(), btnClearViewer->x() - BWSR_BORDER - pad, g->h()); sldrViewerSquelch->align(FL_ALIGN_RIGHT); sldrViewerSquelch->tooltip(_("Set Viewer Squelch")); sldrViewerSquelch->type(FL_HOR_NICE_SLIDER); sldrViewerSquelch->range(-12.0, 6.0); sldrViewerSquelch->step(0.1); sldrViewerSquelch->value(progStatus.VIEWER_psksquelch); sldrViewerSquelch->callback((Fl_Callback*)cb_Squelch); sldrViewerSquelch->color( fl_rgb_color( progdefaults.bwsrSliderColor.R, progdefaults.bwsrSliderColor.G, progdefaults.bwsrSliderColor.B)); sldrViewerSquelch->selection_color( fl_rgb_color( progdefaults.bwsrSldrSelColor.R, progdefaults.bwsrSldrSelColor.G, progdefaults.bwsrSldrSelColor.B)); g->resizable(sldrViewerSquelch); g->end(); w->end(); w->callback((Fl_Callback*)cb_btnCloseViewer); w->resizable(brwsViewer); w->size_range( (30 * pskBrowser::cwidth) + pskBrowser::sbarwidth + 2 * BWSR_BORDER, 5 * pskBrowser::cheight + 20 + 2 * BWSR_BORDER + pad); w->xclass(PACKAGE_NAME); w->hide(); return w; } void openViewer() { if (!dlgViewer) { dlgViewer = createViewer(); initViewer(); } initViewer(); dlgViewer->show(); dlgViewer->redraw(); } void viewer_paste_freq(int freq) { if (pskviewer) { for (int i = 0; i < progdefaults.VIEWERchannels; i++) { int ftest = pskviewer->get_freq(i); if (ftest == NULLFREQ) continue; if (fabs(ftest - freq) <= 50) { if (progdefaults.VIEWERascend) i = (progdefaults.VIEWERchannels - i); else i++; if (mainViewer) mainViewer->select(i); if (brwsViewer) brwsViewer->select(i); return; } } } if (rttyviewer) { for (int i = 0; i < progdefaults.VIEWERchannels; i++) { int ftest = rttyviewer->get_freq(i); if (ftest == NULLFREQ) continue; if (fabs(ftest - freq) <= 50) { if (progdefaults.VIEWERascend) i = (progdefaults.VIEWERchannels - i); else i++; if (mainViewer) mainViewer->select(i); if (brwsViewer) brwsViewer->select(i); return; } } } } fldigi-3.21.80/src/dialogs/record_browse.fl0000664000175000017500000000252412313064025015440 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0302 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include } {private local } decl {\#include "record_loader_gui.h"} {public global } decl {\#include } {public local } Function {make_record_loader_window()} {open } { Fl_Window {} { label {Data files sources} open tooltip {Data files update} xywh {614 112 540 280} type Double resizable visible } { Fl_Group tabDataFiles {open tooltip {Tabular data sources} xywh {5 25 570 275} resizable } { Fl_Table {} { label {Data files sources} open xywh {6 25 529 217} labeltype NO_LABEL resizable class DerivedRecordLst } {} Fl_Input_Choice inpDataSources { label {Data source} open tooltip {Data files repository} xywh {6 254 284 21} align 8 } {} Fl_Light_Button btnDataSourceUpdate { label Update callback {DerivedRecordLst::cbGuiUpdate();} tooltip {Update selected local data files with repository content} xywh {387 254 74 20} } Fl_Button btnDataSourceReset { label Reset callback {DerivedRecordLst::cbGuiReset();} tooltip {Delete local data files if selected.} xywh {465 254 70 20} } } } } fldigi-3.21.80/src/wefax/0000775000175000017500000000000012313333726012032 500000000000000fldigi-3.21.80/src/wefax/wefax-pic.cxx0000664000175000017500000016667512313064025014377 00000000000000// ---------------------------------------------------------------------------- // mfsk-pic.cxx -- mfsk support functions // // Copyright (C) 2010 // Remi Chateauneu, F4ECW // // This file is part of fldigi. Adapted from code contained in HAMFAX source code // distribution. // Hamfax Copyright (C) Christof Schmitt // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "wefax-pic.h" #include "debug.h" #include "configuration.h" #include "wefax.h" #include "trx.h" #include "fl_digi.h" #include "main.h" #include "fileselect.h" #include "picture.h" #include "gettext.h" Fl_Double_Window *wefax_pic_rx_win = (Fl_Double_Window *)0; static Fl_Scroll *wefax_pic_rx_scroll = (Fl_Scroll *)0 ; static picture *wefax_pic_rx_picture = (picture *)0; static Fl_Button *wefax_btn_rx_save = (Fl_Button *)0; static Fl_Button *wefax_btn_rx_abort = (Fl_Button *)0; static Fl_Button *wefax_btn_rx_pause = (Fl_Button *)0; static Fl_Button *wefax_btn_rx_resume = (Fl_Button *)0; static Fl_Choice *wefax_choice_rx_zoom = (Fl_Choice *)0; static Fl_Browser *wefax_browse_rx_events = (Fl_Browser *)0; static Fl_Button *wefax_btn_rx_skip_apt = (Fl_Button *)0; static Fl_Button *wefax_btn_rx_skip_phasing = (Fl_Button *)0; static Fl_Light_Button *wefax_round_rx_noise_removal = (Fl_Light_Button *)0; static Fl_Light_Button *wefax_round_rx_binary = (Fl_Light_Button *)0; static Fl_Spinner *wefax_spinner_rx_binary = (Fl_Spinner *)0; static Fl_Light_Button *wefax_round_rx_non_stop = (Fl_Light_Button *)0; static Fl_Output *wefax_out_rx_row_num = (Fl_Output *)0; static Fl_Output *wefax_out_rx_width = (Fl_Output *)0; static Fl_Choice *wefax_choice_rx_lpm = (Fl_Choice *)0; static Fl_Counter *wefax_cnt_rx_ratio = (Fl_Counter *)0; static Fl_Slider *wefax_slider_rx_center = (Fl_Slider *)0; static Fl_Light_Button *wefax_round_rx_auto_center = (Fl_Light_Button *)0; static Fl_Chart *wefax_chart_rx_power = (Fl_Chart *)0; static Fl_Choice *wefax_choice_rx_filter = (Fl_Choice *)0; Fl_Double_Window *wefax_pic_tx_win = (Fl_Double_Window *)0; static Fl_Scroll *wefax_pic_tx_scroll = (Fl_Scroll *)0 ; static picture *wefax_pic_tx_picture = (picture *)0; static picbox *wefax_pic_tx_box = (picbox *)0; static Fl_Choice *wefax_choice_tx_zoom = (Fl_Choice *)0; static Fl_Choice *wefax_choice_tx_lpm = (Fl_Choice *)0; static Fl_Button *wefax_btn_tx_send_color = (Fl_Button *)0; static Fl_Button *wefax_btn_tx_send_grey = (Fl_Button *)0; static Fl_Output *wefax_out_tx_row_num = (Fl_Output *)0; static Fl_Output *wefax_out_tx_col_num = (Fl_Output *)0; static Fl_Button *wefax_btn_tx_send_abort = (Fl_Button *)0; static Fl_Button *wefax_btn_tx_load = (Fl_Button *)0; static Fl_Button *wefax_btn_tx_clear = (Fl_Button *)0; static Fl_Button *wefax_btn_tx_close = (Fl_Button *)0; /// The image to send. static Fl_Shared_Image *wefax_shared_tx_img = (Fl_Shared_Image *)0; /// This contains the original content of the image to send, /// converted into three bytes per pixel. static unsigned char *wefax_xmtimg = (unsigned char *)0; /// This indicates whether an image to send is loaded in the GUI. /// It allows to acquire twice when re-loading an image without sending. static bool wefax_image_loaded_in_gui = false ; /// Used for shifting the received image left and right. static volatile int center_val_prev = 0 ; static volatile bool global_auto_center = false ; void wefax_pic::update_auto_center(bool is_auto_center) { wefax_round_rx_auto_center->value(is_auto_center ? 1 : 0); global_auto_center = is_auto_center; } /// Global pointer to the current wefax modem. static wefax *wefax_serviceme = 0; /// TODO: This should be hidden in the class picture. It is in wefax too. static const int bytes_per_pix = 3 ; /// Initial size of the reception image. A typical fax has about 1300 lines. static const int curr_pix_h_default = 300 ; /// Always reset before loading a new image. static volatile int curr_pix_height = curr_pix_h_default ; /// The antepenultimate line of the rx image is filtered to remove noise. static int rx_last_filtered_row = 0 ; static bool noise_removal = false ; /// Alters the slanting of the image based on LPM adjustments. static volatile double rx_slant_ratio = 0.0 ; /// This transforms the user slant ratio (Small number around 0.0) /// into a ratio used to stretch the image (Very very small mantissa added to 1.0). static double slant_factor_default(void) { return 100.0 / ( rx_slant_ratio + 100.0 ); } static double slant_factor_with_ratio( double ratio_percent ) { return ( ratio_percent + 100.0 ) / ( rx_slant_ratio + 100.0 ); } /// Minimum fax number of rows should be at least this size. static const int mini_max_fax_lines = 1000 ; /// When set by the user, no new pixel is added or printed. /// However, when the printing resumes, the position is not altered. static volatile bool reception_paused = false ; /// Sets the label of the received or sent image. static void set_win_label( Fl_Window * wefax_pic, const std::string & lab) { /// If the wefax window (rx or tx) is embedded in the main window. // then we would set wefax_pic = fl_digi_main; if( progdefaults.WEFAX_EmbeddedGui ) return ; char* label = strdup(lab.c_str()); wefax_pic->copy_label(label); free(label); wefax_pic->redraw(); } /// Called when clearing the image to send. static void clear_image(void) { ENSURE_THREAD(FLMAIN_TID); if (wefax_xmtimg) { delete [] wefax_xmtimg; wefax_xmtimg = NULL ; } if (wefax_shared_tx_img) { wefax_shared_tx_img->release(); wefax_shared_tx_img = 0; } set_win_label(wefax_pic_tx_win,""); } /// Clears the loaded image. It allows XML-RPC clients to send an image. static void wefax_cb_pic_tx_clear( Fl_Widget *, void *) { ENSURE_THREAD(FLMAIN_TID); FL_LOCK_D(); wefax_image_loaded_in_gui = false ; clear_image(); wefax_pic_tx_picture->clear(); wefax_pic_tx_picture->resize(0,0,0,0); wefax_pic::restart_tx_viewer(); /// Now the lock can be acquired by XML-RPC. wefax_serviceme->transmit_lock_release( "Cleared" ); FL_UNLOCK_D(); } /// According to config flags, shows or hides the transmission window, and resizes both windows if needed. static void wefax_pic_show_tx() { ENSURE_THREAD(FLMAIN_TID); if( progdefaults.WEFAX_HideTx ) { wefax_pic_tx_win->hide(); if( progdefaults.WEFAX_EmbeddedGui ) { wefax_pic_rx_win->resize( text_panel->x() + mvgroup->w(), text_panel->y(), text_panel->w() - mvgroup->w(), text_panel->h() ); } } else { if( progdefaults.WEFAX_EmbeddedGui ) { wefax_pic_rx_win->resize( text_panel->x() + mvgroup->w(), text_panel->y(), text_panel->w() - mvgroup->w(), text_panel->h()/2); wefax_pic_tx_win->resize( text_panel->x() + mvgroup->w(), wefax_pic_rx_win->y() + wefax_pic_rx_win->h(), text_panel->w() - mvgroup->w(), text_panel->h() - wefax_pic_rx_win->h()); } wefax_pic_tx_win->show(); } } static void wefax_cb_pic_tx_close( Fl_Widget *, void *) { ENSURE_THREAD(FLMAIN_TID); FL_LOCK_D(); /// TODO: Small inconvenience: When coming back in wefax mode, the tx window is always closed. progdefaults.WEFAX_HideTx = true ; wefax_pic_show_tx(); FL_UNLOCK_D(); } /// Usual LPM values. static const struct { int m_value ; const char * m_label ; } all_lpm_values[] = { { 240, "240" }, { 120, "120" }, { 90, "90" }, { 60, "60" } }; static const int nb_lpm_values = sizeof(all_lpm_values) / sizeof(all_lpm_values[0]); /// Returns the LPM value choosed on the TX or RX window. static int get_choice_lpm_value( Fl_Choice * the_choice_lpm ) { int idx_lpm = the_choice_lpm->value(); if( ( idx_lpm < 0 ) || ( idx_lpm >= nb_lpm_values ) ) { LOG_WARN( "Invalid LPM index=%d", idx_lpm ); idx_lpm = 0 ; } return all_lpm_values[ idx_lpm ].m_value ; } /// Lpm=120 is by far the most common value, therefore used by default if nothing else works. // wefax.cxx will anyway try 120 for wefax576 or 60 for wefax288. static const int lpm_default_idx = 1 ; static const char * title_choice_lpm = "LPM" ; /// Fills a FLTK widget with LPM vpossible values. Used for transmission and reception. static Fl_Choice * make_lpm_choice( int width_offset, int y_btn, int width_btn, int hei_tx_btn ) { Fl_Choice * choice_lpm = new Fl_Choice(width_offset, y_btn, width_btn, hei_tx_btn, title_choice_lpm ); for( int ix_lpm = 0 ; ix_lpm < nb_lpm_values ; ++ix_lpm ) { choice_lpm->add( all_lpm_values[ ix_lpm ].m_label ); }; choice_lpm->value(lpm_default_idx); choice_lpm->tooltip(_("Set the LPM value")); return choice_lpm ; } /// Sometimes the LPM can be calculated to 122.0 when it should be 120.0. int wefax_pic::normalize_lpm( double the_lpm ) { for( int ix_lpm = 0 ; ix_lpm < nb_lpm_values ; ++ix_lpm ) { int curr_lpm = all_lpm_values[ ix_lpm ].m_value ; if( std::fabs( the_lpm - curr_lpm ) < 3.0 ) { return curr_lpm ; } }; int dflt_lpm = all_lpm_values[ lpm_default_idx ].m_value ; LOG_INFO("Out of bounds LPM=%f. Setting to default:%d", the_lpm, dflt_lpm ); return dflt_lpm ; } /// At this place, the LPM should have been normalized. static void set_nearest_lpm( int the_lpm ) { for( int ix_lpm = 0 ; ix_lpm < nb_lpm_values ; ++ix_lpm ) { if( the_lpm == all_lpm_values[ ix_lpm ].m_value ) { wefax_choice_rx_lpm->value( ix_lpm ); return ; } }; LOG_INFO("Unknown LPM=%d. Reset to default:%d", the_lpm, all_lpm_values[ lpm_default_idx ].m_value ); wefax_choice_rx_lpm->value( lpm_default_idx ); } /// Called just before starting to receive the image. The LPM should be normalized. void wefax_pic::update_rx_lpm( int the_lpm ) { ENSURE_THREAD(FLMAIN_TID); set_nearest_lpm( the_lpm ); /// We keep the previous value of the slant ratio. wefax_cnt_rx_ratio->value( rx_slant_ratio ); /// The increment must be very small otherwise the image is too slanted. wefax_cnt_rx_ratio->step( 0.001 ); wefax_cnt_rx_ratio->precision( 3 ); /// TODO: Not sure about the difference between range() and bounds(). wefax_cnt_rx_ratio->range( -1.0, 1.0 ); wefax_cnt_rx_ratio->bounds( -1.0, 1.0 ); wefax_cnt_rx_ratio->redraw(); } /// Called for each new color component. int wefax_pic::update_rx_pic_col(unsigned char data, int pix_pos ) { /// Each time the received image becomes too high, we increase its height. static const int curr_pix_incr_height = 100 ; /// Three ints per pixel. It is safer to recalculate the /// row index to avoid any buffer overflow, because the given /// row is invalid if the image was horizontally moved. int row_number = 1 + ( pix_pos / ( wefax_pic_rx_picture->pix_width() * bytes_per_pix ) ); /// Maybe we must increase the image height. if( curr_pix_height <= row_number ) { FL_LOCK_D(); curr_pix_height = row_number + curr_pix_incr_height ; wefax_pic_rx_picture->resize_height( curr_pix_height, false ); int y_pos = wefax_pic_rx_picture->h() - wefax_pic_rx_scroll->h() ; if( y_pos < 0 ) { y_pos = 0 ; } else { // Small margin at the bottom, so we can immediately see new lines. y_pos += 20 ; } wefax_pic_rx_picture->position( wefax_pic_rx_picture->x(), -y_pos ); wefax_pic_rx_scroll->redraw(); FL_UNLOCK_D(); } wefax_pic_rx_picture->pixel(data, pix_pos); return row_number ; } /// This estimates the colum of where the horizontal center of the image is, /// or rather, the beginning of the left margin. The estimation is done on /// a range of rows. It looks for a vertical band of X pixels, where the image /// derivative is the lowest. It works well with faxes because they always have /// a wide blank margin. static int estimate_rx_image_center( int row_end ) { /// This works as well with color images. int img_wid = wefax_pic_rx_picture->pix_width() * bytes_per_pix ; /// Much bigger that a char, so we can add values without overflow. int img_buf[ img_wid ]; for( int col_ix = 0; col_ix < img_wid ; ++col_ix ) { img_buf[ col_ix ] = 0 ; } unsigned const char * img_start = wefax_pic_rx_picture->buffer(); /// This computes the absolute value of the horizontal derivative. for( int row_ix = 1; row_ix < row_end ; ++row_ix ) { int col_offset = row_ix * img_wid ; /// Pixels of the current row. const unsigned char * row_start = img_start + col_offset ; /// This is the previous colum of the next row, does not matter. int pix_prev = row_start[img_wid - 1]; /// This is an estimation of how the image has information or is just uniform. for( int col_ix = 0; col_ix < img_wid ; ++col_ix ) { int pix_next = row_start[ col_ix ]; /// Absolute value of the horizontal derivative. int deriv = pix_next - pix_prev; if( deriv < 0 ) { deriv = -deriv ; } img_buf[ col_ix ] += deriv ; /// Used at next iteration so that the memory is read once only. pix_prev = pix_next ; } } /// Much bigger that a char, so we can add values without overflow. int img_avg[ img_wid ]; /// The width of the image band on which we compute the average /// of the absolute value of the horizontal derivate. static const int avg_wid = 150 ; int curr_avg = 0 ; /// Average of the first column. for( int col_ix = 0; col_ix < avg_wid ; ++col_ix ) { curr_avg += img_buf[ col_ix ] ; } img_avg[ 0 ] = curr_avg ; /// Rest of the average in a single pass. for( int col_ix = 1; col_ix < img_wid - avg_wid ; ++col_ix ) { curr_avg += img_buf[ col_ix + avg_wid ] - img_buf[ col_ix - 1 ]; img_avg[ col_ix ] = curr_avg ; } /// Finishes the last bit which wraps at the beginning of the row. for( int col_ix = img_wid - avg_wid; col_ix < img_wid ; ++col_ix ) { curr_avg += img_buf[ col_ix + avg_wid - img_wid ] - img_buf[ col_ix - 1 ]; img_avg[ col_ix ] = curr_avg ; } /// Find the minimum of the derivative on an averaged segment. Last col is zero. int min_idx = -1 ; int min_val = INT_MAX ; for( int col_ix = 0; col_ix < img_wid - 1 ; ++col_ix ) { int avg_val = img_avg[ col_ix ] ; if( avg_val < min_val ) { min_idx = col_ix ; min_val = avg_val ; } } if( (min_idx < 0) || (min_idx >= img_wid) ) { LOG_ERROR("ERROR MINIMUM:%d",min_idx); return 0 ; } /// Better shift left than shift right too much. if( min_idx > img_wid / 2 ) { min_idx = min_idx - img_wid ; } /// Three chars per pixel. min_idx /= bytes_per_pix ; return min_idx ; } /// Called for each bw pixel. void wefax_pic::update_rx_pic_bw(unsigned char data, int pix_pos ) { /// No pixel is added nor printed until this flag is reset to false. if( reception_paused ) { return ; }; /// The image must be horizontally shifted. pix_pos += center_val_prev * bytes_per_pix ; if( pix_pos < 0 ) { pix_pos = 0 ; } /// Maybe there is a slant. pix_pos = ( double )pix_pos * slant_factor_default() + 0.5 ; /// Must be a multiple of the number of bytes per pixel. pix_pos = ( pix_pos / bytes_per_pix ) * bytes_per_pix ; static int last_row_number = 0 ; update_rx_pic_col(data, pix_pos); update_rx_pic_col(data, pix_pos + 1); int row_number = update_rx_pic_col(data, pix_pos + 2); /// Prints the row number sometimes only, to save CPU. if( ( pix_pos % 5000 ) == 0 ) { char row_num_buffer[20]; snprintf( row_num_buffer, sizeof(row_num_buffer), "%d", row_number ); wefax_out_rx_row_num->value( row_num_buffer ); } /// Maybe we restarted an image or maybe went back because of recentering. if( last_row_number > row_number ) { last_row_number = row_number ; } /// Eliminate the noise from the ante-antepenultimate line if( noise_removal ) { if( ( row_number > picture::noise_height_margin - 2 ) && ( row_number != rx_last_filtered_row ) ) { static bool math_morph_enhancement = false ; /* Not used yet because this depends on the image features. * Lines are properly enhancement, but not letters. * Maybe row_number > 2 * picture::noise_height_margin * Also decrease picture::noise_height_margin and ensure image is repaired * when switching on/off noise removal. */ if( math_morph_enhancement ) { wefax_pic_rx_picture->dilatation( row_number - 2 * picture::noise_height_margin ); wefax_pic_rx_picture->erosion( row_number - 1 * picture::noise_height_margin ); } wefax_pic_rx_picture->remove_noise( row_number, progdefaults.WEFAX_NoiseMargin, progdefaults.WEFAX_NoiseThreshold ); rx_last_filtered_row = row_number ; } } /// We start to recenter only if the row number is bigger than that. static const int row_margin = 100 ; /// We try to recenter every X rows. static const int row_recenter_period = 10 ; /// Every new X-th row, maybe automatic recenter. if( ( global_auto_center ) && ( (row_number % row_recenter_period) == 0 ) && ( row_number > row_margin ) && ( row_number >= last_row_number + row_recenter_period ) ) { int delta_center = estimate_rx_image_center( row_number ); static const int neglect_center = 3 ; if( (delta_center > -neglect_center) && (delta_center < neglect_center) ) { /// We may stop the centering algorithm but it is not stable at the beginning. // update_auto_center(false); } else { center_val_prev -= delta_center ; wefax_pic_rx_picture->shift_horizontal_center( -delta_center ); } /// Beware that the line number may go backward if the image is left-shifted, /// that is, shortened. Is this assignment REALLY necessary ? last_row_number = row_number ; } } static void wefax_cb_pic_rx_pause( Fl_Widget *, void *) { wefax_btn_rx_pause->hide(); wefax_btn_rx_resume->show(); reception_paused = true ; wefax_serviceme->update_rx_label(); } static void wefax_cb_pic_rx_resume( Fl_Widget *, void *) { wefax_btn_rx_pause->show(); wefax_btn_rx_resume->hide(); reception_paused = false ; wefax_serviceme->update_rx_label(); } static void LocalSleep( int seconds ) { #ifdef __MINGW32__ MilliSleep(seconds); #else usleep(100000*seconds); #endif } /// Displays the latest image file saved. static void add_to_files_list( const std::string & the_fil_nam ) { ENSURE_THREAD(FLMAIN_TID); /// If the beginning of the file is the default output directory, do not print it. std::string dst_file( the_fil_nam ); int pos_dflt = dst_file.find( progdefaults.wefax_save_dir ); if( pos_dflt == 0 ) { dst_file.erase( 0, progdefaults.wefax_save_dir.size() ); } int curr_siz = wefax_browse_rx_events->size(); std::stringstream tmp_strm ; /// 999 images seem a reasonable sizing (3 digits). tmp_strm << std::setw(3) << ( curr_siz + 1 ) << " " << dst_file; /// The complete file name is stored. It needs a private copy. wefax_browse_rx_events->add( tmp_strm.str().c_str(), strdup( the_fil_nam.c_str() ) ); wefax_browse_rx_events->bottomline( curr_siz + 1 ); /// This window is hidden/shown to signal that a file was added. static const int nb_blink = 5 ; for( int ix_blink = 0 ; ix_blink < nb_blink ; ++ix_blink ) { wefax_browse_rx_events->hide(); wefax_browse_rx_events->redraw(); LocalSleep(1); wefax_browse_rx_events->show(); wefax_browse_rx_events->redraw(); LocalSleep(1); } /// If there is not directory specification, adds the default dir. if( the_fil_nam.empty() ) LOG_WARN("Empty file name"); else if( the_fil_nam[0] != '/' ) wefax_serviceme->put_received_file( progdefaults.wefax_save_dir + '/' + the_fil_nam ); else wefax_serviceme->put_received_file( the_fil_nam ); }; static void wefax_cb_pic_rx_abort( Fl_Widget *, void *) { ENSURE_THREAD(FLMAIN_TID); if (wefax_serviceme != active_modem) return; /// This will call wefax_pic::abort_rx_viewer wefax_serviceme->end_reception(); wefax_round_rx_non_stop->value(false); wefax_serviceme->set_rx_manual_mode(false); wefax_round_rx_non_stop->redraw(); wefax_btn_rx_pause->show(); wefax_btn_rx_resume->hide(); } void wefax_pic::set_manual( bool manual ) { wefax_round_rx_non_stop->value(manual); } static void wefax_cb_pic_rx_manual( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; if( wefax_round_rx_non_stop->value() ) { wefax_serviceme->set_rx_manual_mode(true); wefax_serviceme->skip_apt(); wefax_serviceme->skip_phasing(true); } else { wefax_serviceme->set_rx_manual_mode(false); } } static void wefax_cb_pic_rx_center( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); int center_new_val = wefax_slider_rx_center->value(); int center_delta = center_new_val - center_val_prev ; center_val_prev = center_new_val ; /// Not sure whether lock/unlock is necessary. FL_LOCK_D(); wefax_pic_rx_picture->shift_horizontal_center( center_delta ); FL_UNLOCK_D(); } static void wefax_cb_pic_rx_auto_center( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); char rndVal = wefax_round_rx_auto_center->value(); wefax_pic::update_auto_center(rndVal ? true : false); } /// This gets the directory where images are accessed by default. static std::string default_dir_get( const std::string & config_dir ) { std::string tmp_dir = config_dir.empty() ? PicsDir : config_dir ; /// Valid dir names must end with a slash. if( ! tmp_dir.empty() ) { char termin = tmp_dir[ tmp_dir.size() - 1 ]; if( ( termin != '/' ) && ( termin != '\\' ) ) tmp_dir += '/'; } return tmp_dir ; } /// This sets the directory where images are accessed by default. /// Receives a file name, not a directory name. static void default_dir_set( std::string & config_dir, const std::string & fil_name ) { char * fil_nam_copy = strdup( fil_name.c_str() ); /// dirname() is a POSIX function. const char * dir_nam = dirname( fil_nam_copy ); config_dir = dir_nam + std::string("/"); LOG_INFO("Setting default dir to %s", dir_nam ); free( fil_nam_copy ); } /// Adds the file name to log to the adif file. static void qso_notes( const char * direction, const std::string & file_name ) { if( progdefaults.WEFAX_AdifLog == false ) { return ; } const std::string tmp_notes = direction + file_name ; wefax_serviceme->qso_rec().putField( NOTES, tmp_notes.c_str() ); } static void wefax_cb_pic_rx_save( Fl_Widget *, void *) { ENSURE_THREAD(FLMAIN_TID); const char ffilter[] = "Portable Network Graphics\t*.png\n"; std::string dfname = default_dir_get( progdefaults.wefax_save_dir ); dfname.append( wefax_serviceme->suggested_filename() ); const char *file_name = FSEL::saveas(_("Save image as:"), ffilter, dfname.c_str(), NULL); /// Beware that no extra comments are saved here. if (file_name) { wefax_pic_rx_picture->save_png(file_name,progdefaults.WEFAX_SaveMonochrome); qso_notes( "RX:", file_name ); wefax_serviceme->qso_rec_save(); /// Next time, image will be saved at the same place. default_dir_set( progdefaults.wefax_save_dir, file_name ); add_to_files_list( file_name ); } } /// Beware, might be called by another thread. Called by the GUI /// or when APT start is detected. void wefax_pic::skip_rx_apt(void) { ENSURE_THREAD(FLMAIN_TID); FL_LOCK_D(); wefax_btn_rx_abort->hide(); wefax_btn_rx_skip_apt->hide(); wefax_btn_rx_skip_phasing->show(); wefax_round_rx_noise_removal->hide(); wefax_round_rx_binary->hide(); wefax_spinner_rx_binary->hide(); FL_UNLOCK_D(); } /// Called when the user clicks "Skip APT" static void wefax_cb_pic_rx_skip_apt( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); wefax_serviceme->skip_apt(); } /// Called when clicking "Skip phasing" or by wefax.cxx /// when end of phasing is detected. Beware, might be called by another thread. void wefax_pic::skip_rx_phasing(bool auto_center) { ENSURE_THREAD(FLMAIN_TID); FL_LOCK_D(); /// Theoretically, this widget should already be hidden, but sometimes /// it seems that a call to skip_apt is lost... ? wefax_btn_rx_abort->show(); wefax_btn_rx_skip_apt->hide(); wefax_btn_rx_skip_phasing->hide(); wefax_round_rx_noise_removal->show(); if( progdefaults.WEFAX_SaveMonochrome ) { wefax_round_rx_binary->show(); wefax_spinner_rx_binary->show(); } wefax_out_rx_row_num->show(); wefax_out_rx_width->show(); wefax_cnt_rx_ratio->show(); wefax_slider_rx_center->show(); wefax_round_rx_auto_center->show(); update_auto_center(auto_center); FL_UNLOCK_D(); } /// Called when clicking "Skip phasing". static void wefax_cb_pic_rx_skip_phasing( Fl_Widget *w, void *) { if (wefax_serviceme != active_modem) return; wefax_serviceme->skip_phasing(true); } static void wefax_cb_pic_rx_noise_removal( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); char rndVal = wefax_round_rx_noise_removal->value(); noise_removal = rndVal ? true : false; } static void wefax_cb_pic_rx_binary( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); char rndVal = wefax_round_rx_binary->value(); if( rndVal ) { wefax_pic_rx_picture->set_binary( true ); wefax_spinner_rx_binary->activate(); } else { wefax_pic_rx_picture->set_binary( false ); wefax_spinner_rx_binary->deactivate(); } } static void wefax_cb_pic_rx_bin_threshold( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); int rndVal = wefax_spinner_rx_binary->value(); wefax_pic_rx_picture->set_binary_threshold( rndVal ); } /// Sets the reception filter: The change should be visible. static void wefax_cb_rx_set_filter( Fl_Widget *, void * ) { if (wefax_serviceme != active_modem) return; int ix_filter = wefax_choice_rx_filter->value(); /// Saved in the configuration. progdefaults.wefax_filter = ix_filter ; wefax_serviceme->set_rx_filter(ix_filter); } static void wefax_cb_choice_rx_lpm( Fl_Widget *, void * ) { if (wefax_serviceme != active_modem) return; int the_new_lpm = get_choice_lpm_value( wefax_choice_rx_lpm ); wefax_serviceme->set_lpm( the_new_lpm ); } static void wefax_cb_pic_ratio( Fl_Widget *, void * ) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); double ratio_percent = wefax_cnt_rx_ratio->value(); double current_ratio = slant_factor_with_ratio( ratio_percent ); wefax_pic_rx_picture->stretch( current_ratio ); rx_slant_ratio = ratio_percent ; /// And we update the configuration structure. progdefaults.wefax_slant = rx_slant_ratio ; /// Will prompt for saving configuration when exiting. progdefaults.changed = true; } /// Possible zooms. The value is processed by class picture. static const struct { int m_value ; const char * m_label ; } all_zooms[] = { { -3, "25%" }, { -2, "33%" }, { -1, "50%" }, { 0, "100%" }, { 1, "200%" }, { 2, "300%" }, { 3, "400%" }, }; // Index in all_zooms. static const int idx_default_zoom = 2 ; static int zoom_nb = sizeof(all_zooms) / sizeof(all_zooms[0]); static void wefax_cb_pic_zoom( Fl_Widget * wefax_choice_zoom, void * ) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); int idx_zoom = dynamic_cast(wefax_choice_zoom)->value(); if( ( idx_zoom < 0 ) || ( idx_zoom >= zoom_nb ) ) { LOG_WARN( "Invalid zoom index=%d", idx_zoom ); idx_zoom = idx_default_zoom ; } /// Not very elegant but OK if two possibilities only. if( wefax_choice_zoom == wefax_choice_rx_zoom ) { wefax_pic_rx_picture->set_zoom( all_zooms[ idx_zoom ].m_value ); wefax_pic_rx_win->redraw(); } else if( wefax_choice_zoom == wefax_choice_tx_zoom ) { wefax_pic_tx_picture->set_zoom( all_zooms[ idx_zoom ].m_value ); wefax_pic_tx_win->redraw(); } else { LOG_ERROR("Inconsistent possibility"); } } static Fl_Choice * wefax_create_zoom(int wid_off_up, int hei_off_up, int wid_btn_curr, int height_btn) { ENSURE_THREAD(FLMAIN_TID); static const char * title_zoom = "Zoom" ; Fl_Choice * wefax_choice_zoom = new Fl_Choice(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _(title_zoom)); wefax_choice_zoom->callback(wefax_cb_pic_zoom, 0); for( int ix_zoom = 0; ix_zoom < zoom_nb ; ++ix_zoom ) { wefax_choice_zoom->add( all_zooms[ ix_zoom ].m_label ); }; wefax_choice_zoom->value(idx_default_zoom); wefax_choice_zoom->tooltip(_("Window zoom")); wefax_choice_zoom->align(FL_ALIGN_LEFT); return wefax_choice_zoom ; } void wefax_pic::abort_rx_viewer(void) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); put_status(""); FL_LOCK_D(); /// Maybe the image is too high, we make it shorter. wefax_pic_rx_picture->resize_height( curr_pix_h_default, true ); /// Now returns to the top of the image, and refresh the scrolling. wefax_pic_rx_picture->position( wefax_pic_rx_picture->x(), 0 ); wefax_pic_rx_scroll->redraw(); curr_pix_height = curr_pix_h_default ; rx_last_filtered_row = 0; center_val_prev = 0 ; update_auto_center(false); wefax_slider_rx_center->value(0.0); wefax_btn_rx_abort->hide(); wefax_btn_rx_skip_apt->show(); wefax_btn_rx_skip_phasing->hide(); wefax_round_rx_noise_removal->hide(); wefax_round_rx_binary->hide(); wefax_spinner_rx_binary->hide(); wefax_out_rx_row_num->hide(); wefax_out_rx_row_num->value(""); wefax_out_rx_width->hide(); wefax_cnt_rx_ratio->hide(); wefax_cnt_rx_ratio->value(); wefax_slider_rx_center->hide(); wefax_round_rx_auto_center->hide(); /// Back to the first line before reading next image. wefax_pic_rx_scroll->position( 0, 0 ); FL_UNLOCK_D(); } /// This must be called within REQ or REQ_SYNC to avoid a segfault. void wefax_pic::power( double start, double phase, double image, double black, double stop ) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); static bool init_done = false ; /// This reduces memory reallocation. if( init_done ) { /// TODO: Keep the latest value and update only if they really changed. /// This should save CPU. wefax_chart_rx_power->replace(1,start, "start", FL_BLUE); wefax_chart_rx_power->replace(2,phase, "phase", FL_RED); wefax_chart_rx_power->replace(3,image, "image", FL_GREEN); wefax_chart_rx_power->replace(4,black, "black", FL_YELLOW); wefax_chart_rx_power->replace(5,stop, "stop", FL_MAGENTA); } else { // First time only. init_done = true ; wefax_chart_rx_power->autosize(1); wefax_chart_rx_power->add(start, "start", FL_BLUE); wefax_chart_rx_power->add(phase, "phase", FL_RED); wefax_chart_rx_power->add(image, "image", FL_GREEN); wefax_chart_rx_power->add(black, "black", FL_YELLOW); wefax_chart_rx_power->add(stop, "stop", FL_MAGENTA); } } /// The resizing is different from the base class. class picture_scroll : public picture { public: /// Background color is gray. picture_scroll(int X, int Y, int W, int H) : picture (X, Y, W, H, 255) {}; virtual ~picture_scroll() {}; /// picture::resize destroys the image, we do not want that when displaying. virtual void resize(int x, int y, int w, int h) { FL_LOCK_D(); LOG_DEBUG("resize: %d %d %d %d", x, y, w, h ); Fl_Widget::resize( x, y, w, h ); FL_UNLOCK_D(); } /// This must not process slant this way, so inhibits picture::handle. virtual int handle(int event) { return 0 ; } }; static void wefax_load_image(const char * fil_name); static void wefax_cb_browse_rx_events( Fl_Widget *, void * ) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); int idx_file = wefax_browse_rx_events->value(); if( idx_file != 0 ) { /// The file name with its directory is stored as data. const char * filnam = (const char *)wefax_browse_rx_events->data( idx_file ); if(filnam == NULL) { LOG_INFO("Cannot find index=%d nb=%d", idx_file, wefax_browse_rx_events->size() ); return ; } /// The tx window might be hidden. progdefaults.WEFAX_HideTx = false ; wefax_pic_show_tx(); wefax_load_image(filnam); } } static const int extra_win_wid = 800 ; void wefax_pic::create_rx_viewer(int pos_x, int pos_y,int win_wid, int hei_win) { rx_slant_ratio = progdefaults.wefax_slant ; FL_LOCK_D(); int wid_btn_margin = 1 ; if( progdefaults.WEFAX_EmbeddedGui ) { wefax_pic_rx_win = new Fl_Double_Window(pos_x, pos_y, win_wid, hei_win); } else { Fl_Double_Window * tmpWin = new Fl_Double_Window(win_wid, hei_win, "Fax reception" ); wefax_pic_rx_win = tmpWin ; } wefax_pic_rx_win->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); wefax_pic_rx_win->align(FL_ALIGN_CLIP); int wid_img = win_wid - 15 ; /// A bit wider so that it does not scroll at the beginning. int height_btn = 20 ; int height_margin = 6 ; int margin_top_bottom = 2 ; int hei_scroll = hei_win - height_margin - 2 * height_btn - 2 * margin_top_bottom -1 ; wefax_pic_rx_win->begin(); wefax_pic_rx_scroll = new Fl_Scroll( 1, 2, win_wid-2, hei_scroll ); wefax_pic_rx_scroll->type(Fl_Scroll::HORIZONTAL | Fl_Scroll::VERTICAL); wefax_pic_rx_scroll->color( fl_rgb_color( 255, 255, 255), progdefaults.RxTxSelectcolor); wefax_pic_rx_scroll->box(FL_ENGRAVED_FRAME); wefax_pic_rx_scroll->begin(); /// It will be resized immediately. wefax_pic_rx_picture = new picture_scroll( 0, 0, wid_img, curr_pix_height); wefax_pic_rx_picture->align(FL_ALIGN_TOP); wefax_pic_rx_picture->set_zoom( all_zooms[ idx_default_zoom ].m_value ); wefax_pic_rx_scroll->end(); wefax_pic_rx_win->resizable( wefax_pic_rx_scroll ); int hei_off_up = hei_win - height_margin - 2 * height_btn - margin_top_bottom ; int wid_margin = 2; int wid_off_up = wid_margin ; int wid_btn_curr = 0 ; /// Sets the group at a big size, we will resize the width at the end. Fl_Group * tmpGroup = new Fl_Group( 0, hei_off_up, extra_win_wid, height_margin + 2 * height_btn + margin_top_bottom ); tmpGroup->begin(); wid_btn_curr = 90 ; wefax_btn_rx_save = new Fl_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn,_("Save...")); wefax_btn_rx_save->callback(wefax_cb_pic_rx_save, 0); wefax_btn_rx_save->tooltip(_("Save current image in a file.")); /// Clear, Skipt APT and Skip phasing are at the same place wid_off_up += wid_btn_margin + wid_btn_curr ; wid_btn_curr = 75 ; wefax_btn_rx_abort = new Fl_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _("Clear")); wefax_btn_rx_abort->callback(wefax_cb_pic_rx_abort, 0); wefax_btn_rx_abort->tooltip(_("End and clear current image reception.")); wefax_btn_rx_skip_apt = new Fl_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _("Skip APT")); wefax_btn_rx_skip_apt->callback(wefax_cb_pic_rx_skip_apt, 0); wefax_btn_rx_skip_apt->tooltip(_("Skip Automatic Picture Transmission step")); wefax_btn_rx_skip_phasing = new Fl_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _("Skip Phase")); wefax_btn_rx_skip_phasing->callback(wefax_cb_pic_rx_skip_phasing, 0); wefax_btn_rx_skip_phasing->tooltip(_("Skip phasing step")); wid_off_up += wid_btn_margin + wid_btn_curr ; wid_btn_curr = 45 ; wefax_btn_rx_pause = new Fl_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _("Pause")); wefax_btn_rx_pause->callback(wefax_cb_pic_rx_pause, 0); wefax_btn_rx_pause->tooltip(_("Pause reception.")); wefax_btn_rx_resume = new Fl_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _("Resume")); wefax_btn_rx_resume->callback(wefax_cb_pic_rx_resume, 0); wefax_btn_rx_resume->tooltip(_("Resume reception.")); wefax_btn_rx_resume->hide(); wid_off_up += wid_btn_margin + wid_btn_curr ; wid_btn_curr = 75 ; wefax_round_rx_non_stop = new Fl_Light_Button(wid_off_up, hei_off_up, wid_btn_curr, height_btn, _("Non stop")); wefax_round_rx_non_stop->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); wefax_round_rx_non_stop->selection_color(FL_RED); wefax_round_rx_non_stop->callback(wefax_cb_pic_rx_manual, 0); wefax_round_rx_non_stop->tooltip(_("Continuous reception mode")); wid_off_up += wid_btn_margin + wid_btn_curr + 40; wid_btn_curr = 58 ; wefax_choice_rx_zoom = wefax_create_zoom( wid_off_up, hei_off_up, wid_btn_curr, height_btn ); static const char * title_filter = "FIR" ; wid_off_up += wid_btn_margin + wid_btn_curr + 25; wid_btn_curr = 88 ; wefax_choice_rx_filter = new Fl_Choice(wid_off_up, hei_off_up, wid_btn_curr, height_btn, title_filter ); wefax_choice_rx_filter->callback( wefax_cb_rx_set_filter, 0 ); wefax_choice_rx_filter->align(FL_ALIGN_LEFT); int nb_filters = 0 ; for( const char ** filter_names = wefax::rx_filters(); *filter_names; ++filter_names, ++nb_filters ) { wefax_choice_rx_filter->add( *filter_names ); }; /// Sets the default filter based on the configuration. int init_filter_idx = progdefaults.wefax_filter ; if( ( init_filter_idx < 0 ) || ( init_filter_idx >= nb_filters ) ) { LOG_WARN("Invalid config filter index:%d", init_filter_idx ); /// It is impossible to have no filters at all. init_filter_idx = 0 ; } wefax_choice_rx_filter->value(init_filter_idx); wefax_choice_rx_filter->tooltip(_("Set the reception filter.")); wid_off_up += wid_btn_margin + wid_btn_curr ; int hei_off_low = hei_off_up + height_btn + height_margin ; int wid_off_low = wid_margin ; /// fl_width does not take into account the different size of letters. wid_off_low += 28 ; wid_btn_curr = 53 ; wefax_choice_rx_lpm = make_lpm_choice( wid_off_low, hei_off_low, wid_btn_curr, height_btn ); wefax_choice_rx_lpm->callback(wefax_cb_choice_rx_lpm); /// SkipApt and SkipPhasing are never displayed at the same time then the following widgets. /// Therefore we go back to the previous offset. wid_off_low += 4 * wid_btn_margin + wid_btn_curr ; wid_btn_curr = 35 ; wefax_out_rx_row_num = new Fl_Output(wid_off_low, hei_off_low, wid_btn_curr, height_btn); wefax_out_rx_row_num->align(FL_ALIGN_LEFT); wefax_out_rx_row_num->tooltip(_("Fax line number being read. Image is saved when reaching max lines.")); wid_off_low += wid_btn_margin + wid_btn_curr + 10; wid_btn_curr = 37 ; wefax_out_rx_width = new Fl_Output(wid_off_low, hei_off_low, wid_btn_curr, height_btn, "x"); wefax_out_rx_width->align(FL_ALIGN_LEFT); wefax_out_rx_width->value("n/a"); wefax_out_rx_width->tooltip(_("Image width, in pixels.")); static const char * title_lpm = _("Slant"); wid_off_low += wid_btn_margin + wid_btn_curr + 37; wid_btn_curr = 62 ; wefax_cnt_rx_ratio = new Fl_Counter(wid_off_low, hei_off_low, wid_btn_curr, height_btn, title_lpm); wefax_cnt_rx_ratio->align(FL_ALIGN_LEFT); wefax_cnt_rx_ratio->type(FL_SIMPLE_COUNTER); wefax_cnt_rx_ratio->callback(wefax_cb_pic_ratio, 0); wefax_cnt_rx_ratio->tooltip(_("Adjust image slant to correct soundcard clock error.")); static const char * title_center = _("Align"); wid_off_low += wid_btn_curr + 37; wid_btn_curr = 45 ; wefax_slider_rx_center = new Fl_Slider(wid_off_low, hei_off_low, wid_btn_curr, height_btn, title_center); wefax_slider_rx_center->type(FL_HORIZONTAL); wefax_slider_rx_center->align(FL_ALIGN_LEFT); /// The range is set when the image size in pixels is known. wefax_slider_rx_center->step(1.0); wefax_slider_rx_center->callback(wefax_cb_pic_rx_center, 0); wefax_slider_rx_center->tooltip(_("Align image horizontally.")); center_val_prev = 0 ; wid_off_low += wid_btn_curr ; wid_btn_curr = 16 ; wefax_round_rx_auto_center = new Fl_Light_Button(wid_off_low, hei_off_low, wid_btn_curr, height_btn ); wefax_round_rx_auto_center->selection_color(FL_GREEN); wefax_round_rx_auto_center->callback(wefax_cb_pic_rx_auto_center, 0); wefax_round_rx_auto_center->tooltip(_("Enable automatic image centering")); update_auto_center(false); wid_off_low += 2 * wid_btn_margin + wid_btn_curr ; wid_btn_curr = 53 ; wefax_round_rx_noise_removal = new Fl_Light_Button(wid_off_low, hei_off_low, wid_btn_curr, height_btn, _("Noise")); wefax_round_rx_noise_removal->callback(wefax_cb_pic_rx_noise_removal, 0); wefax_round_rx_noise_removal->tooltip(_("Removes noise when ticked")); wefax_round_rx_noise_removal->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); wefax_round_rx_noise_removal->selection_color(FL_RED); wid_off_low += 2 * wid_btn_margin + wid_btn_curr ; wid_btn_curr = 38 ; wefax_round_rx_binary = new Fl_Light_Button(wid_off_low, hei_off_low, wid_btn_curr, height_btn, _("Bin")); wefax_round_rx_binary->callback(wefax_cb_pic_rx_binary, 0); wefax_round_rx_binary->tooltip(_("Binary image when ticked")); wefax_round_rx_binary->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); wefax_round_rx_binary->selection_color(FL_RED); wefax_round_rx_binary->value(0); if( false == progdefaults.WEFAX_SaveMonochrome ) { wefax_round_rx_binary->hide(); } wid_off_low += wid_btn_curr ; wid_btn_curr = 40 ; wefax_spinner_rx_binary = new Fl_Spinner( wid_off_low, hei_off_low, wid_btn_curr, height_btn ); wefax_spinner_rx_binary->callback(wefax_cb_pic_rx_bin_threshold, 0); wefax_spinner_rx_binary->tooltip(_("Set binarization level")); wefax_spinner_rx_binary->format("%d"); wefax_spinner_rx_binary->type(FL_INT_INPUT); wefax_spinner_rx_binary->range(0.0,255.0); wefax_spinner_rx_binary->step(1.0); wefax_spinner_rx_binary->value(wefax_pic_rx_picture->get_binary_threshold()); if( false == progdefaults.WEFAX_SaveMonochrome ) { wefax_spinner_rx_binary->hide(); } wefax_spinner_rx_binary->deactivate(); wid_off_low += wid_btn_curr ; int wid_hei_two = height_margin + 2 * height_btn ; /// Starts from the longest of the two lines. int wid_off_two = std::max( wid_off_low, wid_off_up ); wid_btn_curr = 78 ; wefax_chart_rx_power = new Fl_Chart( wid_off_two, hei_off_up, wid_btn_curr, wid_hei_two ); wefax_chart_rx_power->tooltip(_("Power/noise for significant frequencies")); wefax_chart_rx_power->type(FL_HORBAR_CHART); wid_off_two += wid_btn_margin + wid_btn_curr ; wid_btn_curr = std::max( extra_win_wid - wid_off_two - wid_margin, 200 ) ; wefax_browse_rx_events = new Fl_Select_Browser(wid_off_two, hei_off_up, wid_btn_curr+2, wid_hei_two ); wefax_browse_rx_events->callback(wefax_cb_browse_rx_events, 0); // static std::string tooltip_rx_events ; std::string tooltip_rx_events = _("Files saved in ") + default_dir_get( progdefaults.wefax_save_dir ); wefax_browse_rx_events->tooltip( tooltip_rx_events.c_str() ); /// TODO: The horizontal slider should not be always displayed. wefax_browse_rx_events->has_scrollbar(Fl_Browser::VERTICAL_ALWAYS | Fl_Browser::HORIZONTAL); tmpGroup->resizable(wefax_browse_rx_events); tmpGroup->end(); tmpGroup->resize( 0, hei_off_up, win_wid-2, height_margin + 2 * height_btn + margin_top_bottom ); wefax_pic_rx_win->end(); wefax_pic_rx_win->init_sizes(); wefax_pic_rx_win->redraw(); FL_UNLOCK_D(); } void wefax_pic::resize_rx_viewer(int wid_img) { ENSURE_THREAD(FLMAIN_TID); FL_LOCK_D(); abort_rx_viewer(); /// We want to update the picture data structure. wefax_pic_rx_picture->picture::resize( 0, 0, wid_img, curr_pix_h_default ); char buffer_width[20]; snprintf( buffer_width, sizeof(buffer_width), "%d", wid_img ); wefax_out_rx_width->value(buffer_width); /// This is a number of pixels. double range_rx_center = wid_img / 2.0 ; wefax_slider_rx_center->range(-range_rx_center, range_rx_center); wefax_pic_rx_win->redraw(); FL_UNLOCK_D(); } void wefax_pic::set_rx_label(const std::string & win_label) { FL_LOCK_D(); std::string tmp_label( win_label ); if( reception_paused ) { tmp_label += " paused" ; } /// This copy seems strange, but otherwise the label is not updated. set_win_label(wefax_pic_rx_win, tmp_label); FL_UNLOCK_D(); } void wefax_pic::save_image(const std::string & fil_name, const std::string & extra_comments ) { std::string dfname = default_dir_get( progdefaults.wefax_save_dir ) + fil_name ; std::stringstream local_comments; local_comments << extra_comments ; local_comments << "Slant:" << rx_slant_ratio << "\n" ; local_comments << "Auto-Center:" << ( global_auto_center ? "On" : "Off" ) << "\n" ; wefax_pic_rx_picture->save_png(dfname.c_str(),progdefaults.WEFAX_SaveMonochrome, local_comments.str().c_str()); add_to_files_list( dfname ); qso_notes( "RX:", fil_name ); wefax_serviceme->qso_rec_save(); } /// Protected by an exclusive mutex. static std::string wefax_load_image_after_acquire(const char * fil_name) { if (wefax_serviceme != active_modem) return "Not in WEFAX mode"; ENSURE_THREAD(FLMAIN_TID); wefax_serviceme->qso_rec_init(); qso_notes( "TX:", fil_name ); clear_image(); wefax_shared_tx_img = Fl_Shared_Image::get(fil_name); if (!wefax_shared_tx_img) { std::string err_msg("Cannot call Fl_Shared_Image::get on file:" + std::string(fil_name) ); LOG_ERROR("%s",err_msg.c_str()); return err_msg; } if (wefax_shared_tx_img->count() > 1) { // we only handle rgb images std::string err_msg("Handle only RGB images: " + std::string(fil_name) ); LOG_ERROR("%s",err_msg.c_str()); clear_image(); return err_msg; } unsigned char * img_data = (unsigned char *)wefax_shared_tx_img->data()[0]; int img_wid = wefax_shared_tx_img->w(); int img_hei = wefax_shared_tx_img->h(); int img_depth = wefax_shared_tx_img->d(); wefax_xmtimg = new unsigned char [img_wid * img_hei * bytes_per_pix]; if (img_depth == bytes_per_pix) memcpy(wefax_xmtimg, img_data, img_wid*img_hei*bytes_per_pix); else if (img_depth == 4) { int i, j, k; for (i = 0; i < img_wid*img_hei; i++) { j = i*bytes_per_pix; k = i*4; wefax_xmtimg[j] = img_data[k]; wefax_xmtimg[j+1] = img_data[k+1]; wefax_xmtimg[j+2] = img_data[k+2]; } } else if (img_depth == 1) { int i, j; for (i = 0; i < img_wid*img_hei; i++) { j = i * bytes_per_pix; wefax_xmtimg[j] = wefax_xmtimg[j+1] = wefax_xmtimg[j+2] = img_data[i]; } } else { std::stringstream err_strm ; err_strm << "Inconsistent img_depth=" << img_depth << " for " << fil_name ; std::string err_msg = err_strm.str(); LOG_ERROR("%s",err_msg.c_str()); return err_msg ; }; wefax_pic::tx_viewer_resize(img_wid, img_hei); set_win_label(wefax_pic_tx_win, fil_name); wefax_pic_tx_box->label(0); // load the picture widget with the rgb image FL_LOCK_D(); wefax_pic_tx_picture->show(); wefax_pic_tx_picture->clear(); wefax_pic_tx_picture->video(wefax_xmtimg, img_wid * img_hei * bytes_per_pix); int tim_color = wefax_serviceme->tx_time( img_wid * img_hei * bytes_per_pix ); static char wefax_txclr_tooltip[24]; snprintf( wefax_txclr_tooltip, sizeof(wefax_txclr_tooltip), _("Time needed: %dm %ds (Color)"), tim_color/60, tim_color % 60 ); wefax_btn_tx_send_color->tooltip(wefax_txclr_tooltip); if( false ) { // No color transmission now because no information this format. wefax_btn_tx_send_color->activate(); } int tim_grey = wefax_serviceme->tx_time( img_wid * img_hei ); static char wefax_txgry_tooltip[24]; snprintf( wefax_txgry_tooltip, sizeof(wefax_txgry_tooltip), _("Time needed: %dm %ds (B/W)"), tim_grey/60, tim_grey % 60 ); wefax_btn_tx_send_grey->tooltip(wefax_txgry_tooltip); wefax_btn_tx_send_grey->activate(); wefax_choice_tx_zoom->activate(); wefax_btn_tx_clear->activate(); FL_UNLOCK_D(); return std::string(); } static void wefax_load_image(const char * fil_name) { if (wefax_serviceme != active_modem) return; if( false == wefax_image_loaded_in_gui ) { /// So we do not re-acquire the exclusive access to wefax transmission. wefax_serviceme->transmit_lock_acquire(fil_name); wefax_image_loaded_in_gui = true ; } wefax_load_image_after_acquire(fil_name); } void wefax_pic::set_tx_pic(unsigned char data, int col, int row, bool is_color ) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); if( ( col >= wefax_shared_tx_img->w() ) || ( row >= wefax_shared_tx_img->h() ) ) { LOG_ERROR("invalid col=%d row=%d w=%d h=%d", col, row, wefax_shared_tx_img->w(), wefax_shared_tx_img->h() ); exit(EXIT_FAILURE); } int offset = row * wefax_shared_tx_img->w() + col ; if (is_color) { wefax_pic_tx_picture->pixel( data, offset ); } else { int tripleOffset = bytes_per_pix * offset ; wefax_pic_tx_picture->pixel( data, tripleOffset ); wefax_pic_tx_picture->pixel( data, tripleOffset + 1 ); wefax_pic_tx_picture->pixel( data, tripleOffset + 2 ); } static int previous_row = -1 ; if( row != previous_row ) { previous_row = row ; char num_buffer[20]; snprintf( num_buffer, sizeof(num_buffer), "%d", row ); wefax_out_tx_row_num->value( num_buffer ); snprintf( num_buffer, sizeof(num_buffer), "%d", wefax_shared_tx_img->w() ); wefax_out_tx_col_num->value( num_buffer ); } } static void wefax_cb_pic_tx_load(Fl_Widget *, void *) { const char *fil_name = FSEL::select(_("Load image file"), "Portable Network Graphics\t*.png\n" "Independent JPEG Group\t*.{jpg,jif,jpeg,jpe}\n" "Graphics Interchange Format\t*.gif", default_dir_get( progdefaults.wefax_load_dir ).c_str() ); if (!fil_name) { LOG_WARN( " Cannot FSEL::select" ); return ; }; /// Next time, image will be saved at the same place. default_dir_set( progdefaults.wefax_load_dir, fil_name ); wefax_load_image(fil_name); } /// Called whether color or b/w image. static void wefax_pic_tx_send_common( bool is_color ) { ENSURE_THREAD(FLMAIN_TID); FL_LOCK_D(); if (wefax_serviceme != active_modem) return; int img_w = wefax_shared_tx_img->w(); int img_h = wefax_shared_tx_img->h(); wefax_choice_tx_lpm->hide(); wefax_btn_tx_send_color->hide(); wefax_btn_tx_send_grey->hide(); wefax_btn_tx_load->hide(); wefax_choice_tx_zoom->hide(); wefax_btn_tx_clear->hide(); wefax_btn_tx_close->hide(); wefax_out_tx_row_num->show(); wefax_out_tx_col_num->show(); wefax_btn_tx_send_abort->show(); wefax_pic_tx_picture->clear(); wefax_out_tx_row_num->value( "Init" ); wefax_out_tx_col_num->value( "" ); wefax_serviceme->set_tx_parameters( get_choice_lpm_value( wefax_choice_tx_lpm ), wefax_xmtimg, is_color, img_w, img_h ); FL_UNLOCK_D(); start_tx(); } static void wefax_cb_pic_tx_send_color( Fl_Widget * , void *) { wefax_pic_tx_send_common(true); } static void wefax_cb_pic_tx_send_grey( Fl_Widget *, void *) { wefax_pic_tx_send_common(false); } static void wefax_cb_pic_tx_send_abort( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; /// Maybe we are not sending an image. if( wefax_shared_tx_img ) { wefax_serviceme->set_tx_abort_flag(); // reload the picture widget with the rgb image FL_LOCK_D(); wefax_pic_tx_picture->video(wefax_xmtimg, wefax_shared_tx_img->w() * wefax_shared_tx_img->h() * bytes_per_pix); FL_UNLOCK_D(); } } void wefax_pic::restart_tx_viewer(void) { ENSURE_THREAD(FLMAIN_TID); wefax_out_tx_row_num->hide(); wefax_out_tx_col_num->hide(); wefax_btn_tx_send_abort->hide(); wefax_btn_tx_load->show(); wefax_btn_tx_close->show(); if( wefax_image_loaded_in_gui ) { // If the image was loaded from the GUI. wefax_choice_tx_lpm->show(); wefax_btn_tx_send_color->show(); wefax_btn_tx_send_grey->show(); wefax_choice_tx_zoom->show(); wefax_btn_tx_clear->show(); } else { /// If the image was loaded and sent from XML-RPC, or no image present. wefax_choice_tx_lpm->deactivate(); wefax_btn_tx_send_color->deactivate(); wefax_btn_tx_send_grey->deactivate(); wefax_choice_tx_zoom->deactivate(); wefax_btn_tx_clear->deactivate(); } } void wefax_pic::create_tx_viewer(int pos_x, int pos_y,int win_wid, int hei_win) { ENSURE_THREAD(FLMAIN_TID); FL_LOCK_D(); int wid_btn_margin = 5 ; if( progdefaults.WEFAX_EmbeddedGui ) { wefax_pic_tx_win = new Fl_Double_Window(pos_x, pos_y, win_wid, hei_win ); } else { Fl_Double_Window * tmpWin = new Fl_Double_Window(win_wid, hei_win, _("Send image")); wefax_pic_tx_win = tmpWin; } wefax_pic_tx_win->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); wefax_pic_tx_win->begin(); wefax_pic_tx_scroll = new Fl_Scroll( 1, 1, win_wid-2, hei_win - 23 ); wefax_pic_tx_scroll->type(Fl_Scroll::HORIZONTAL | Fl_Scroll::VERTICAL); wefax_pic_tx_scroll->color( fl_rgb_color( 255, 255, 255), progdefaults.RxTxSelectcolor); wefax_pic_tx_scroll->box(FL_ENGRAVED_FRAME); wefax_pic_tx_scroll->begin(); /// It will be resized immediately when an image is loaded. wefax_pic_tx_picture = new picture_scroll( 0,0,0,0); wefax_pic_tx_picture->align(FL_ALIGN_TOP); wefax_pic_tx_picture->set_zoom( all_zooms[ idx_default_zoom ].m_value ); wefax_pic_tx_scroll->end(); wefax_pic_tx_win->resizable( wefax_pic_tx_scroll ); wefax_pic_tx_box = new picbox( wefax_pic_tx_scroll->x(), wefax_pic_tx_scroll->y(), wefax_pic_tx_scroll->w(), wefax_pic_tx_scroll->h(), _("Loads an image file\nSupported types: PNG, JPEG, BMP")); wefax_pic_tx_box->labelfont(FL_HELVETICA_ITALIC); static const int last_margin = 21 ; static const int y_btn = hei_win - last_margin ; static const int hei_tx_btn = 20 ; Fl_Group * tmpGroup = new Fl_Group( 0, y_btn, extra_win_wid, last_margin ); tmpGroup->begin(); int width_btn = 30; int width_offset = 30; width_btn = 50 ; wefax_choice_tx_lpm = make_lpm_choice( width_offset, y_btn, width_btn, hei_tx_btn ); width_offset += width_btn + wid_btn_margin ; width_btn = 55 ; wefax_btn_tx_send_color = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, "Tx Color"); wefax_btn_tx_send_color->callback(wefax_cb_pic_tx_send_color, 0); wefax_btn_tx_send_color->tooltip(_("Starts transmit in color mode")); width_offset += width_btn + wid_btn_margin ; width_btn = 45 ; wefax_btn_tx_send_grey = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, "Tx B/W"); wefax_btn_tx_send_grey->callback( wefax_cb_pic_tx_send_grey, 0); wefax_btn_tx_send_grey->tooltip(_("Starts transmit in gray level mode")); width_offset += width_btn + wid_btn_margin ; width_btn = 55 ; wefax_btn_tx_load = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, _("Load...")); wefax_btn_tx_load->callback(wefax_cb_pic_tx_load, 0); wefax_btn_tx_load->tooltip(_("Load image to send")); width_offset += width_btn + wid_btn_margin + 40 ; width_btn = 58 ; wefax_choice_tx_zoom = wefax_create_zoom( width_offset, y_btn, width_btn, hei_tx_btn ); width_offset += width_btn + wid_btn_margin ; width_btn = 45 ; wefax_btn_tx_clear = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, _("Clear")); wefax_btn_tx_clear->callback(wefax_cb_pic_tx_clear, 0); wefax_btn_tx_clear->tooltip(_("Clear image to transmit")); width_offset += width_btn + wid_btn_margin ; width_btn = 45 ; wefax_btn_tx_close = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, _("Close")); wefax_btn_tx_close->callback(wefax_cb_pic_tx_close, 0); wefax_btn_tx_close->tooltip(_("Close transmit window")); wefax_out_tx_row_num = new Fl_Output(20, y_btn, 50, hei_tx_btn ); wefax_out_tx_row_num->align(FL_ALIGN_LEFT); wefax_out_tx_row_num->tooltip(_("Fax line number being sent.")); wefax_out_tx_col_num = new Fl_Output(80, y_btn, 50, hei_tx_btn, "x" ); wefax_out_tx_col_num->align(FL_ALIGN_LEFT); wefax_out_tx_col_num->tooltip(_("Fax column number.")); wefax_btn_tx_send_abort = new Fl_Button(180, y_btn, 100, hei_tx_btn, _("Abort Transmit") ); wefax_btn_tx_send_abort->callback(wefax_cb_pic_tx_send_abort, 0); wefax_btn_tx_send_abort->tooltip(_("Abort transmission")); wefax_out_tx_row_num->hide(); wefax_out_tx_col_num->hide(); wefax_btn_tx_send_abort->hide(); wefax_btn_tx_send_color->deactivate(); wefax_btn_tx_send_grey->deactivate(); wefax_choice_tx_zoom->deactivate(); wefax_btn_tx_clear->deactivate(); tmpGroup->end(); wefax_pic_tx_win->end(); wefax_pic_rx_win->init_sizes(); wefax_pic_rx_win->redraw(); FL_UNLOCK_D(); } void wefax_pic::abort_tx_viewer(void) { wefax_cb_pic_tx_send_abort(NULL,NULL); wefax_cb_pic_tx_close(NULL,NULL); } void wefax_pic::tx_viewer_resize(int the_width, int the_height) { ENSURE_THREAD(FLMAIN_TID); LOG_DEBUG("the_width=%d the_height=%d", the_width, the_height ); int win_width = the_width < 288 ? 290 : the_width + 4; int win_height = the_height < 180 ? 180 : the_height + 30; int pic_x = (win_width - the_width) / 2; int pic_y = (win_height - 30 - the_height)/2; FL_LOCK_D(); /// This because it is a picture_scroll object. wefax_pic_tx_picture->picture::resize(pic_x, pic_y, the_width, the_height); wefax_pic_tx_picture->clear(); wefax_pic_tx_box->size(win_width, win_height); FL_UNLOCK_D(); } /// TODO: This crashes but should be called. void wefax_pic::delete_tx_viewer() { ENSURE_THREAD(FLMAIN_TID); FL_LOCK_D(); wefax_pic_tx_win->hide(); wefax_serviceme = 0; /// First delete the Fl_Widget. delete wefax_pic_tx_win; wefax_pic_tx_win = 0; delete [] wefax_xmtimg; wefax_xmtimg = 0; FL_UNLOCK_D(); } /// TODO: This crashes. void wefax_pic::delete_rx_viewer() { ENSURE_THREAD(FLMAIN_TID); FL_LOCK_D(); wefax_pic_rx_win->hide(); wefax_serviceme = 0; /// These objects are deleted with the main window. wefax_pic_tx_win = 0; wefax_pic_rx_win = 0; FL_UNLOCK_D(); } void wefax_pic::setpicture_link(wefax *me) { wefax_serviceme = me; } /// Called by the main menu bar to open explicitely a wefax reception window. void wefax_pic::cb_mnu_pic_viewer_rx(Fl_Menu_ *, void * ) { ENSURE_THREAD(FLMAIN_TID); if ( ! wefax_pic_rx_win) { LOG_ERROR("wefax_rx_win should be created"); return ; } wefax_pic_rx_win->show(); } /// Called by the main menu bar to open explicitely a wefax transmission window. void wefax_pic::cb_mnu_pic_viewer_tx(Fl_Menu_ *, void * ) { if ( ! wefax_pic_tx_win) { LOG_ERROR("wefax_tx_win should be created"); return ; } progdefaults.WEFAX_HideTx = ! progdefaults.WEFAX_HideTx ; wefax_pic_show_tx(); } /// Called from XML-RPC thread. void wefax_pic::send_image( const std::string & fil_nam ) { LOG_INFO("Sending %s", fil_nam.c_str() ); /// Here, transmit_lock_acquire is called by the XML-RPC client. std::string err_msg = wefax_load_image_after_acquire( fil_nam.c_str() ); if( ! err_msg.empty() ) { if (wefax_serviceme == active_modem) { /// Allows another XML-RPC client or the GUI to send an image. wefax_serviceme->transmit_lock_release( err_msg ); } return ; } wefax_cb_pic_tx_send_grey( NULL, NULL ); LOG_INFO("Sent %s", fil_nam.c_str() ); } /// This function is called at two places: // - When creating the main window. // - When initializing the fax modem. void wefax_pic::create_both(bool called_from_fl_digi) { if( wefax_pic_rx_win ) return ; ENSURE_THREAD(FLMAIN_TID); /// This function can be called from fl_digi.cxx or wefax.cxx. if( called_from_fl_digi && progdefaults.WEFAX_EmbeddedGui ) { int rxWinHeight = progdefaults.WEFAX_HideTx ? text_panel->h() : text_panel->h()/2 ; wefax_pic::create_rx_viewer( text_panel->x() + mvgroup->w(), text_panel->y(), text_panel->w() - mvgroup->w(), rxWinHeight ); wefax_pic::create_tx_viewer( text_panel->x() + mvgroup->w(), text_panel->y() + ReceiveText->h(), text_panel->w() - mvgroup->w(), text_panel->h() - ReceiveText->h()); } else if( ! called_from_fl_digi && ! progdefaults.WEFAX_EmbeddedGui ) { wefax_pic::create_rx_viewer( 0, 0, extra_win_wid, 400 ); wefax_pic::create_tx_viewer( 0, 0, extra_win_wid, 400 ); } /// Explicitely does nothing here if conditions are not met. } void wefax_pic::show_both() { ENSURE_THREAD(FLMAIN_TID); if( ( NULL == wefax_pic_rx_win ) || ( NULL == wefax_pic_tx_win ) ) { return; } wefax_pic_show_tx(); wefax_pic_rx_win->show(); } void wefax_pic::hide_both() { ENSURE_THREAD(FLMAIN_TID); if( ( NULL == wefax_pic_rx_win ) || ( NULL == wefax_pic_tx_win ) ) { return; } wefax_pic_rx_win->hide(); wefax_pic_tx_win->hide(); } fldigi-3.21.80/src/wefax/wefax.cxx0000664000175000017500000026001612313064025013606 00000000000000// ---------------------------------------------------------------------------- // wefax.cxx -- Weather Fax modem // // Copyright (C) 2010 // Remi Chateauneu, F4ECW // // This file is part of fldigi. Adapted from code contained in HAMFAX source code // distribution. // Hamfax Copyright (C) Christof Schmitt // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include "debug.h" #include "gettext.h" #include "wefax.h" #include "modem.h" #include "main.h" #include "misc.h" #include "timeops.h" #include "fl_digi.h" #include "configuration.h" #include "status.h" #include "filters.h" #include "strutil.h" #include "wefax-pic.h" #include "ascii.h" #include "qrunner.h" using namespace std; //============================================================================= // //============================================================================= #define PUT_STATUS( A ) \ { \ std::stringstream strm_status ; \ strm_status << A ; \ put_status( strm_status.str().c_str() ); \ LOG_DEBUG("%s", strm_status.str().c_str() ); \ } //============================================================================= // Core of the code taken from Hamfax. //============================================================================= /// No reasonable FIR filter should have more coefficients than that. #define MAX_FILT_SIZE 256 struct fir_coeffs { const char * _name ; int _size ; const double _coefs[MAX_FILT_SIZE]; }; // Narrow, middle and wide fir low pass filter from ACfax static const fir_coeffs input_filters[] = { { _("Narrow"), 17, { -7,-18,-15, 11, 56,116,177,223,240,223,177,116, 56, 11,-15,-18, -7} }, { _("Middle"), 17, { 0,-18,-38,-39, 0, 83,191,284,320,284,191, 83, 0,-39,-38,-18, 0} }, { _("Wide"), 17, { 6, 20, 7,-42,-74,-12,159,353,440,353,159,-12,-74,-42, 7, 20, 6} }, { "Blackman", 17, { -2.7756e-15, 2.9258e+00, 1.3289e+01, 3.4418e+01, 6.8000e+01, 1.1095e+02, 1.5471e+02, 1.8770e+02, 2.0000e+02, 1.8770e+02, 1.5471e+02, 1.1095e+02, 6.8000e+01, 3.4418e+01, 1.3289e+01, 2.9258e+00, -2.7756e-15 } }, { "Hanning", 17, { 0.00000, 7.61205, 29.28932, 61.73166, 100.00000, 138.26834, 170.71068, 192.38795, 200.00000, 192.38795, 170.71068, 138.26834, 100.00000, 61.73166, 29.28932, 7.61205, 0.00000 } }, { "Hamming", 17, { 16.000, 23.003, 42.946, 72.793, 108.000, 143.207, 173.054, 192.997, 200.000, 192.997, 173.054, 143.207, 108.000, 72.793, 42.946, 23.003, 16.000 } } }; static const size_t nb_filters = sizeof(input_filters)/sizeof(input_filters[0]); ; /// This contains all possible reception filters. class fir_filter_pair_set : public std::vector< C_FIR_filter > { /// This, because C_FIR_filter cannot be copied. fir_filter_pair_set(const fir_filter_pair_set &); fir_filter_pair_set & operator=(const fir_filter_pair_set &); public: static const char ** filters_list(void) { /// There will be a small memory leak when leaving. No problem at all. static const char ** stt_filters = NULL ; if( stt_filters == NULL ) { stt_filters = new const char * [nb_filters + 1]; for( size_t ix_filt = 0 ; ix_filt < nb_filters ; ++ix_filt ) { stt_filters[ix_filt] = input_filters[ix_filt]._name ; } stt_filters[nb_filters] = NULL ; } return stt_filters ; } fir_filter_pair_set() { /// Beware that C_FIR_filter cannot be copied with its content. resize( nb_filters ); for( size_t ix_filt = 0 ; ix_filt < nb_filters ; ++ix_filt ) { // Same filter for real and imaginary. const fir_coeffs * ptr_filt = input_filters + ix_filt ; // init() should take const double pointers. operator[]( ix_filt ).init( ptr_filt->_size, 1, const_cast< double * >( ptr_filt->_coefs ), const_cast< double * >( ptr_filt->_coefs ) ); } } }; // fir_filter_pair_set /// Speed-up of trigonometric calculations. template class lookup_table { T * m_table; size_t m_table_size; size_t m_next; size_t m_increment; /// No default constructor because it would invalidate the buffer pointer. lookup_table(); lookup_table(const lookup_table &); lookup_table & operator=(const lookup_table &); public: lookup_table(const size_t N) : m_table_size(N), m_next(0), m_increment(0) { assert( N != 0 ); /// If no more memory, an exception will be thrown. m_table=new T[m_table_size]; } ~lookup_table(void) { delete[] m_table; } T& operator[](size_t i) { return m_table[i]; } void set_increment(size_t i) { m_increment=i; } T next_value(void) { m_next+=m_increment; if(m_next>=m_table_size) { m_next%=m_table_size; } return m_table[m_next]; } size_t size(void) const { return m_table_size; } void reset(void) { m_next=0; } }; // lookup_table typedef enum { RXAPTSTART, RXAPTSTOP, RXPHASING, RXIMAGE, TXAPTSTART, TXPHASING, ENDPHASING, TXIMAGE, TXAPTSTOP, IDLE } fax_state; static const char * state_to_str(fax_state a_state) { switch( a_state ) { case RXAPTSTART : return _("APT reception start") ; case RXAPTSTOP : return _("APT reception stop") ; case RXPHASING : return _("Phasing reception") ; case RXIMAGE : return _("Receiving") ; case TXAPTSTART : return _("APT transmission start") ; case TXAPTSTOP : return _("APT stop") ; case TXPHASING : return _("Phasing transmission") ; case ENDPHASING : return _("End phasing") ; case TXIMAGE : return _("Sending image") ; case IDLE : return _("Idle") ; } return "UNKNOWN" ; }; /// TODO: This should be hidden to this class. static const int bytes_per_pixel = 3; #define IOC_576 576 #define IOC_288 288 /// Index of correlation to image width. static int ioc_to_width( int ioc ) { return ioc * M_PI ; }; /// Used by bandwidth. Standard shift is 800 Hz, so deviation is 400 Hz. /// Deutsche Wetterdienst (DWD) shift is 850 Hz. static int fm_deviation = -1 ; #define GARBAGE_STR "garbage" class fax_implementation { wefax * m_ptr_wefax ; // Points to the modem of which this is the implementation. fax_state m_rx_state ; // RXPHASING, RXIMAGE etc... int m_sample_rate; // Set at startup: 8000, 11025 etc... int m_current_value; // Latest received pixel value. bool m_apt_high; int m_apt_trans; // APT low-high transitions int m_apt_count; // samples counted for m_apt_trans int m_apt_start_freq; // Standard APT frequency. Set at startup. int m_apt_stop_freq; // Standard APT frequency. bool m_phase_high; // When state=RXPHASING int m_curr_phase_len; // Counts the len of the image band used for phasing int m_curr_phase_high; // Counts the len of the white part of the phasing image band. int m_phase_lines; int m_num_phase_lines; int m_phasing_calls_nb;// Number of calls to decode_phasing for the current image. double m_lpm_img; // Lines per minute. double m_lpm_sum_rx; // Sum of the latest LPM values, when RXPHASING. int m_default_lpm; // 120 for WEFAX_576, 60 for WEFAX_288. int m_img_width; // Calculated with IOC=576 or 288. int m_img_sample; // Current received samples number when in RXIMAGE. int m_last_col; // Current col based on samples number, decides to set a pixel when changes. int m_pixel_val; // Accumulates received samples, then averaged to set a pixel. int m_pix_samples_nb; // Number of samples read for the next pixel, and current column. About 4 if 11025 Hz. bool m_img_color; // Whether this is a color image or not. fax_state m_tx_state; // Modem state when transmitting. int m_tx_phasing_lin; // Nb of phasing lines sent when transmitting an image. int m_start_duration; // Number of seconds for sending ATP start. int m_stop_duration; // Number of seconds for sending APT stop. int m_img_tx_cols; // Number of columns when transmitting. int m_img_tx_rows; // Number of rows when transmitting. int m_carrier; // Normalised fax carrier frequency. Should be identical to modem::get_freq(). int m_fax_pix_num; // Index of current pixel in received image. const unsigned char * m_xmt_pic_buf ; // Bytes to send. Number of pixels by three. bool m_freq_mod ; // Frequency modulation or AM. bool m_manual_mode ; // Tells whether everything is read, or apt+phasing detection. /// The number of samples sent for one line. The LPM is given by the GUI. Typically 5512. double m_smpl_per_lin ;// Recalculated each time m_lpm_img is updated. int m_ix_filt ; // Index of the current reception filter. static const int range_sample = 255 ; // At the moment, never found an example where it should be negated. static const bool m_phase_inverted = false; /// This is always the same filter for all objects. static fir_filter_pair_set m_rx_filters ; /// These are used for transmission. lookup_table m_dbl_sine; lookup_table m_dbl_cosine; lookup_table m_dbl_arc_sine; /// Stores a result based on the previous received sample. double m_i_fir_old; double m_q_fir_old; void decode(const int* buf, int nb_samples); /// Used for transmission. lookup_table m_short_sine; /// This evaluates the average and standard deviation of the current image, // using the histogram. class statistics { static const size_t m_sz = 256 ; int m_hist[m_sz]; mutable double m_avg ; mutable double m_dev ; public: void add_bw( int pix_val ) { pix_val = pix_val < 0 ? 0 : pix_val > 255 ? 255 : pix_val ; m_hist[ pix_val ]++; } void calc() const { m_avg = 0.0; int sum = 0 ; int sum_vals = 0 ; for( size_t i = 0; i < m_sz; ++ i ) { int weight = m_hist[i]; sum_vals += i * weight ; sum += weight ; } if( sum == 0 ) { m_avg = 0.0 ; m_dev = 0.0 ; return ; } m_avg = sum_vals / sum ; double sum_dlt_pwr2 = 0.0 ; for( size_t i = 0; i < m_sz; ++ i ) { int weight = m_hist[i]; double val = i - m_avg ; sum_dlt_pwr2 += val * val * weight ; } m_dev = sqrt( sum_dlt_pwr2 / sum ); } double average() const { return m_avg; } double stddev() const { return m_dev; }; void reset() { std::fill( m_hist, m_hist + m_sz, 0 ); } }; statistics m_statistics ; fax_implementation(); /// Needed when starting image reception, after phasing. void reset_counters(void) { m_last_col = 0 ; m_fax_pix_num = 0 ; m_img_sample = 0; m_pix_samples_nb = 0; } // These counters used for phasing. void reset_phasing_counters() { m_lpm_sum_rx = 0; m_phasing_calls_nb = 0 ; m_phase_high = m_current_value>=128 ? true : false; m_curr_phase_len=m_curr_phase_high=0; m_phase_lines=m_num_phase_lines=0; } /// Called at init time or when the carrier changes. void reset_increments(void) { /// This might happen at startup. Not a problem. if(m_sample_rate == 0) { return; } m_dbl_sine.set_increment(m_dbl_sine.size()*m_carrier/m_sample_rate); m_dbl_cosine.set_increment(m_dbl_cosine.size()*m_carrier/m_sample_rate); m_dbl_sine.reset(); m_dbl_cosine.reset(); m_short_sine.reset(); if(!m_freq_mod ) { m_short_sine.set_increment(m_short_sine.size()*m_carrier/m_sample_rate); } } public: fax_implementation(int fax_mode, wefax * ptr_wefax ); void init_rx(int the_smpl_rate); void skip_apt_rx(void); void skip_phasing_to_image_save(const std::string & comment); void skip_phasing_to_image(bool auto_center); void skip_phasing_rx(bool auto_center); void end_rx(void); void rx_new_samples(const double* audio_ptr, int audio_sz); void init_tx(int the_smpl_rate); void modulate(const double* buffer, int n); void tx_params_set( int the_lpm, const unsigned char * xmtpic_buffer, bool is_color, int img_w, int img_h ); bool trx_do_next(void); void tx_apt_stop(void); double carrier(void) const { return m_carrier ; } /// The trigo tables have an increment which depends on the carrier frequency. void set_carrier(double freq) { m_carrier = freq ; reset_increments(); } int fax_width(void) const { return m_img_width ; } void set_filter_rx( int idx_filter ) { m_ix_filt = idx_filter ; } /// When set, starts receiving faxes without interruption other than manual. void manual_mode_set( bool manual_flag ) { m_manual_mode = manual_flag ; } /// Called by the GUI. bool manual_mode_get(void) const { return m_manual_mode ; } int lpm_to_samples( int the_lpm ) const { return m_sample_rate * 60.0 / the_lpm ; } /// Called by the GUI. void lpm_set( int the_lpm ) { m_lpm_img = the_lpm ; m_smpl_per_lin = lpm_to_samples( m_lpm_img ); } /// This generates a filename based on the frequency, current time, internal state etc... std::string generate_filename( const char *extra_msg ) const ; const char * state_rx_str(void) const { return state_to_str(m_rx_state); } /// Returns a string telling the state. Informational purpose. std::string state_string(void) const { std::stringstream result ; result << "tx:" << state_to_str(m_tx_state) << " " << "rx:" << state_to_str(m_rx_state); return result.str(); }; private: /// Centered around the frequency. double power_usb_noise(void) const { static double avg_pwr = 0.0 ; double pwr = wf->powerDensity(m_carrier, 2 * fm_deviation) + 1e-10; return decayavg( avg_pwr, pwr, 10 ); } /// This evaluates the power signal when APT start frequency. This frequency pattern /// can be observed on the waterfall. double power_usb_apt_start(void) const { static double avg_pwr = 0.0 ; /// Value approximated by watching the waterfall. static const int bandwidth_apt_start = 10 ; double pwr = wf->powerDensity(m_carrier - 2 * m_apt_start_freq, bandwidth_apt_start) + wf->powerDensity(m_carrier - m_apt_start_freq, bandwidth_apt_start) + wf->powerDensity(m_carrier , bandwidth_apt_start) + wf->powerDensity(m_carrier + m_apt_start_freq, bandwidth_apt_start); + wf->powerDensity(m_carrier + 2 * m_apt_start_freq, bandwidth_apt_start); return decayavg( avg_pwr, pwr, 10 ); } /// Estimates the signal power when the phasing signal is received. double power_usb_phasing(void) const { static double avg_pwr = 0.0 ; /// Rough estimate based on waterfall observation. static const int bandwidth_phasing = 1 ; double pwr = wf->powerDensity(m_carrier - fm_deviation, bandwidth_phasing); return decayavg( avg_pwr, pwr, 10 ); } /// There is some power at m_carrier + fm_deviation but this is neglictible. double power_usb_image(void) const { static double avg_pwr = 0.0 ; /// This value is obtained by watching the waterfall. static const int bandwidth_image = 100 ; double pwr = wf->powerDensity(m_carrier + fm_deviation, bandwidth_image); return decayavg( avg_pwr, pwr, 10 ); } /// Hambourg Radio sends a constant freq which looks like an image. /// We eliminate it by comparing with a black signal. /// If this is a real image, bith powers will be close. /// If not, the image is very important, but not the black. /// TODO: Consider removing this, because it is not used. double power_usb_black(void) const { static double avg_pwr = 0.0 ; /// This value is obtained by watching the waterfall. static const int bandwidth_black = 20 ; double pwr = wf->powerDensity(m_carrier - fm_deviation, bandwidth_black); return decayavg( avg_pwr, pwr, 10 ); } /// Evaluates the signal power for APT stop frequency. double power_usb_apt_stop(void) const { static double avg_pwr = 0.0 ; /// This value is obtained by watching the waterfall. static const int bandwidth_apt_stop = 50 ; double pwr = wf->powerDensity(m_carrier - m_apt_stop_freq, bandwidth_apt_stop); return decayavg( avg_pwr, pwr, 10 ); } /// This evaluates the signal/noise ratio for some specific bandwidths. class fax_signal { const fax_implementation * _ptr_fax ; int _cnt ; /// The value can be reused a couple of times. double _apt_start ; double _phasing ; double _image ; double _black ; double _apt_stop ; fax_state _state ; /// Deduction made based on signal power. const char * _text; const char * _stop_code; /// Finer tests can be added. These are all rule-of-thumb values based /// on observation of real signals. /// TODO: Adds a learning mode using the Hamfax detector to train the signal-based one. void set_state(void) { _state = IDLE ; _text = _("No signal detected"); _stop_code = "" ; if( ( _apt_start > 20.0 ) && ( _phasing < 10.0 ) && ( _image < 10.0 ) && ( _apt_stop < 10.0 ) ) { _state = RXAPTSTART ; _text = _("Strong APT start signal: Skip to phasing."); } if( /// The image signal may be weak if the others signals are even weaker. ( ( _apt_start < 1.0 ) && ( _phasing < 1.0 ) && ( _image > 10.0 ) && ( _apt_stop < 1.0 ) ) || ( ( _apt_start < 1.0 ) && ( _phasing < 0.5 ) && ( _image > 8.0 ) && ( _apt_stop < 0.5 ) ) || ( ( _apt_start < 3.0 ) && ( _phasing < 1.0 ) && ( _image > 15.0 ) && ( _apt_stop < 1.0 ) ) ) { _state = RXIMAGE ; _text = _("Strong image signal when getting APT start: Starting phasing."); } if( ( _apt_start < 10.0 ) && ( _phasing > 20.0 ) && ( _image < 10.0 ) && ( _apt_stop < 10.0 ) ) { _state = RXPHASING ; _text = _("Strong phasing signal when getting APT start: Starting phasing."); } /// TODO: Beware that quite often, it cuts image in the middle. // Maybe the levels should be amended. if( ( ( _apt_start < 2.0 ) && ( _phasing < 2.0 ) && ( _image < 2.0 ) && ( _apt_stop > 8.0 ) ) || ( ( _apt_start < 1.0 ) && ( _phasing < 1.0 ) && ( _image < 1.0 ) && ( _apt_stop > 6.0 ) ) ) { /// This test is redundant now that apt_stop_freq is better (On several lines). // It had also the disadvantage to be triggered on a plain horizontal line. LOG_DEBUG("Strong APT Stop TEMPORARILY DISABLED\n"); if(false) { _state = RXAPTSTOP ; _text = _("Strong APT stop signal: Stopping reception."); _stop_code = "stop"; } // END TEMP DISABLED. } /// Consecutive lines in a wefax image have a strong statistical correlation. fax_state state_corr = _ptr_fax->correlation_state( &_stop_code ); if( ( _state == RXIMAGE ) || ( _state == IDLE ) ) { if( state_corr == RXAPTSTOP ) { _state = RXAPTSTOP ; _text = _("No significant line-to-line correlation: Reception should stop."); } } if( ( _state == IDLE ) || ( _state == RXAPTSTART ) || ( _state == RXPHASING ) ) { if( state_corr == RXIMAGE ) { _state = RXIMAGE ; _text = _("Significant line-to-line correlation: Reception should start."); } } } void recalc(void) { /// Adds a small value to avoid division by zero. double noise = _ptr_fax->power_usb_noise() + 1e-10 ; /// Multiplications are faster than divisions. double inv_noise = 1.0 / noise ; _apt_start = _ptr_fax->power_usb_apt_start() * inv_noise ; _phasing = _ptr_fax->power_usb_phasing() * inv_noise ; _image = _ptr_fax->power_usb_image() * inv_noise ; _black = _ptr_fax->power_usb_black() * inv_noise ; _apt_stop = _ptr_fax->power_usb_apt_stop() * inv_noise ; set_state(); } public: /// This recomputes, if needed, the various signal power ratios. void refresh(void) { /// Values reevaluated every X input samples. Must be smaller /// than the typical audio input frames (512 samples). static const int validity = 1000 ; /// Calculated at least the first time. if( ( _cnt % validity ) == 0 ) { recalc(); } /// Does not matter if wrapped beyond 2**31. ++_cnt ; } fax_signal( const fax_implementation * ptr_fax) : _ptr_fax(ptr_fax) , _cnt(0) , _text(NULL) {} fax_state signal_state(void) const { return _state ; } const char * signal_text(void) const { return _text; }; const char * signal_stop_code(void) const { return _stop_code; } double image_noise_ratio(void) const { return _image ; } /// This updates a Fl_Chart widget. void display(void) const { // Protected with REQ, otherwise will segfault. Do not use REQ_SYNC // otherwise it hangs when switching to another mode with a macro. REQ( wefax_pic::power, _apt_start, _phasing, _image, _black, _apt_stop ); } /// For debugging only. friend std::ostream & operator<<( std::ostream & refO, const fax_signal & ref_sig ) { refO << " start=" << std::setw(10) << ref_sig._apt_start << " phasing=" << std::setw(10) << ref_sig._phasing << " image=" << std::setw(10) << ref_sig._image << " black=" << std::setw(10) << ref_sig._black << " stop=" << std::setw(10) << ref_sig._apt_stop << " pwr_state=" << state_to_str(ref_sig._state); return refO ; } std::string to_string(void) const { std::stringstream tmp_strm ; tmp_strm << *this ; return tmp_strm.str(); } }; /// We tolerate a small difference between the frequencies. bool is_near_freq( int f1, int f2, int margin ) const { int delta = f1 - f2 ; if( delta < 0 ) { delta = -delta ; } if( delta < margin ) { return true ; } else { return false ; } } void save_automatic( const char * extra_msg, const std::string & comment); void decode_apt(int x, const fax_signal & the_signal ); void decode_phasing(int x, const fax_signal & the_signal ); bool decode_image(int x); private: /// Each received file has its name pushed in this queue. syncobj m_sync_rx ; std::queue< std::string > m_received_files ; public: /// Called by the engine each time a file is saved. void put_received_file( const std::string &filnam ) { guard_lock g( m_sync_rx.mtxp() ); LOG_INFO("%s", filnam.c_str() ); m_received_files.push( filnam ); m_sync_rx.signal(); } /// Returns a received file name, by chronological order. std::string get_received_file( int max_seconds ) { guard_lock g( m_sync_rx.mtxp() ); LOG_INFO(_("delay=%d"), max_seconds ); if( m_received_files.empty() ) { if( ! m_sync_rx.wait(max_seconds) ) return std::string(); } std::string filnam = m_received_files.front(); m_received_files.pop(); return filnam ; } private: /// No unicity if the same filename is sent by several clients at the same time. /// This does not really matter because the error codes should be the same. syncobj m_sync_tx_fil ; std::string m_tx_fil ; // Filename being transmitted. syncobj m_sync_tx_msg ; typedef std::map< std::string, std::string > sent_files_type ; sent_files_type m_sent_files ; public: /// If the delay is exceeded, returns with an error message. std::string send_file( const std::string & filnam, double max_seconds ) { LOG_INFO("%s rf_carried=%d carrier=%d", filnam.c_str(), static_cast(wf->rfcarrier()), m_carrier ); bool is_acquired = transmit_lock_acquire(filnam, max_seconds); if( ! is_acquired ) return "Timeout sending " + filnam ; REQ( wefax_pic::send_image, filnam ); guard_lock g( m_sync_tx_fil.mtxp() ); sent_files_type::iterator itFi ; while(true) { itFi = m_sent_files.find( filnam ); if( itFi != m_sent_files.end() ) { break ; } LOG_INFO("Locking"); guard_lock g( m_sync_tx_msg.mtxp() ); LOG_INFO("Waiting %f",max_seconds); if( ! m_sync_tx_msg.wait( max_seconds ) ) { LOG_INFO("Timeout %f", max_seconds ); return "Timeout"; } } std::string err_msg = itFi->second ; LOG_INFO("err_msg=%s", err_msg.c_str() ); m_sent_files.erase( itFi ); return err_msg ; } /// Called when loading a file from the GUI, or indirectly from XML-RPC. bool transmit_lock_acquire(const std::string & filnam, double delay = wefax::max_delay ) { LOG_INFO("Sending %s delay=%f tid=%d", filnam.c_str(), delay, (int)GET_THREAD_ID() ); guard_lock g( m_sync_tx_fil.mtxp() ); LOG_INFO("Locked"); if ( ! m_tx_fil.empty() ) { if( ! m_sync_tx_fil.wait( delay ) ) return false ; } m_tx_fil = filnam ; LOG_INFO("Sent %s", filnam.c_str() ); return true ; } /// Allows to send another file. Called by XML-RPC and the GUI. void transmit_lock_release( const std::string & err_msg ) { LOG_INFO("err_msg=%s tid=%d", err_msg.c_str(), (int)GET_THREAD_ID() ); guard_lock g( m_sync_tx_msg.mtxp() ); LOG_INFO("%s %s", m_tx_fil.c_str(), err_msg.c_str() ); if( m_tx_fil.empty() ) { LOG_WARN(_("%s: File name should not be empty"), err_msg.c_str() ); } else { m_sent_files[ m_tx_fil ] = err_msg ; m_tx_fil.clear(); } LOG_INFO("Signaling"); m_sync_tx_msg.signal(); } /// Maybe we could reset this buffer when we change the state so that we could /// use the current LPM width. struct corr_buffer_t : public std::vector { unsigned char at_mod(size_t i) const { return operator[](i % size()); } unsigned char & at_mod(size_t i) { return operator[](i % size()); } }; mutable corr_buffer_t m_correlation_buffer ; mutable double m_curr_corr_avg ; // Average line-to-line correlation for the last m_min_corr_lines sampled lines. mutable double m_imag_corr_max ; // Max line-to-line correlation for the current image. mutable double m_imag_corr_min ; // Min line-to-line correlation for the current image. mutable int m_corr_calls_nb; static const int m_min_corr_lines = 15 ; /// Evaluates the correlation between two lines separated by line_offset pixels. double correlation_from_index(size_t line_length, size_t line_offset) const { /// This is a ring buffer. size_t line_length_plus_img_sample = line_length + m_img_sample ; int avg_pred = 0, avg_curr = 0 ; for( size_t i = m_img_sample ; i < line_length_plus_img_sample ; ++i ) { int pix_pred = m_correlation_buffer.at_mod( i ); int pix_curr = m_correlation_buffer.at_mod( i + line_offset ); avg_pred += pix_pred; avg_curr += pix_curr ; } avg_pred /= line_length; avg_curr /= line_length; /// Use integers because it is faster. Samples are chars, so no overflow possible. int numerator = 0, denom_pred = 0, denom_curr = 0 ; for( size_t i = m_img_sample ; i < line_length_plus_img_sample ; ++i ) { int pix_pred = m_correlation_buffer.at_mod( i ); int pix_curr = m_correlation_buffer.at_mod( i + line_offset ); int delta_pred = pix_pred - avg_pred ; int delta_curr = pix_curr - avg_curr ; numerator += delta_pred * delta_curr ; denom_pred += delta_pred * delta_pred ; denom_curr += delta_curr * delta_curr ; } double denominator = sqrt( (double)denom_pred * (double)denom_curr ); if( denominator == 0.0 ) { return 0.0 ; } else { return fabs( numerator / denominator ); } } // This is experimental, and is disabled yet. // The goal is to eliminate artefact which echoes each pixel a couple of pixels later. // This correlates each sample line with itself for each pixel number in a small given // range. When the correlation reaches a maximum (A couple of dozens of samples), // this estimates the echo delay. // This delay is typical of a given emitter, at a given time of the day. // Therefore, the array of occurences of a given delay must be refreshed when the frequence // is changed. // The next step is to estimate the amplitude of the echo, and later to substract // each sample to the same sample "delay" mater, with the right attenuation. // // For an unknown reason, there is frequently a correlation peak after 9 or 10 samples. // Just as there were two propagation paths, distant from 10 / 11025 Hz * 300000 = 300 km. // // This happens with Bracknell (Not far from where I live), // and surprisingly the weak signal comes first. // This never happens with Deutsche Wetterdienst (Hundredth of kilometers). size_t correlation_shift( size_t corr_smpl_lin ) const { static bool is_init = false ; static const size_t max_space_echo = 100 ; /// Specific to the antenna and the reception, so no need to clean it up. static size_t shift_histogram[max_space_echo]; static size_t nb_calls = 0 ; if( ! is_init ) { for( size_t i = 0; i < max_space_echo; ++i ) shift_histogram[i] = 0 ; is_init = true ; } double tmpCorrPrev = correlation_from_index(corr_smpl_lin, 0 ); // double tmpCorrMax = 0.0 ; size_t local_max = 0 ; bool is_growing = false ; /// We could even start the loop later because we are not interested by small shifts. for( size_t i = 1 ; i < max_space_echo; i++ ) { double tmpCorr = correlation_from_index(corr_smpl_lin, i ); bool is_growing_next = tmpCorr > tmpCorrPrev ; if( is_growing && ( ! is_growing_next ) ) { local_max = i - 1 ; // tmpCorrMax = tmpCorr ; break ; } is_growing = is_growing_next ; tmpCorrPrev = tmpCorr ; } if( local_max != 0 ) { ++shift_histogram[local_max]; // LOG_INFO("Local max: i=%d corr=%lf", local_max, tmpCorrMax ); } ++nb_calls ; size_t best_shift_idx = 0 ; size_t biggest_shift = shift_histogram[best_shift_idx]; if( ( nb_calls > 100 ) && ( ( nb_calls % 10 ) == 0 ) ) { for( size_t i = 0; i < max_space_echo; ++i ) { size_t new_hist = shift_histogram[i]; if( new_hist > biggest_shift ) { biggest_shift = new_hist ; best_shift_idx = i ; } } LOG_INFO("Shift: i=%d hist=%d", (int)best_shift_idx, (int)biggest_shift ); } return best_shift_idx ; } static const int min_white_level = 128 ; /// Absolute value of statistical correlation between the current line and the previous one. /// Called once per maximum sample line. void correlation_calc(void) const { ++m_corr_calls_nb; /// We should in fact take the smallest one, 60. size_t corr_smpl_lin = lpm_to_samples( m_default_lpm ); double current_corr = correlation_from_index(corr_smpl_lin, corr_smpl_lin); /// This never happened, but who knows (Inaccuracy etc...)? if( current_corr > 1.0 ) { LOG_WARN("Inconsistent correlation:%lf", current_corr ); current_corr = 1.0; } if( m_corr_calls_nb < m_min_corr_lines ) { m_curr_corr_avg = current_corr ; /// The max value of the correlation must be significative (Does not take peak values). m_imag_corr_max = 0.0; m_imag_corr_min = 0.0; } else { /// Equivalent to decayavg with weight= (min_corr_lin +1)/min_corr_lin m_curr_corr_avg = ( m_curr_corr_avg * m_min_corr_lines + current_corr ) / ( m_min_corr_lines + 1 ); m_imag_corr_max = std::max( m_curr_corr_avg, m_imag_corr_max ); m_imag_corr_min = std::min( m_curr_corr_avg, m_imag_corr_min ); } /// Debugging purpose only. if( ( m_corr_calls_nb % 100 ) == 0 ) { LOG_DEBUG( "current_corr=%lf m_curr_corr_avg=%lf m_imag_corr_max=%f m_corr_calls_nb=%d " "m_min_corr_lines=%d state=%s m_lpm_img=%f", current_corr, m_curr_corr_avg, m_imag_corr_max, m_corr_calls_nb, m_min_corr_lines, state_rx_str(), m_lpm_img ); } double metric = m_curr_corr_avg * 100.0 ; m_ptr_wefax->display_metric(metric); static const bool calc_corr_shift = false ; if( calc_corr_shift ) correlation_shift( corr_smpl_lin ); } /// This is called quite often. It estimates, based on the mobile /// average of statistical correlation between consecutive lines, whether this is a wefax /// signal or not. fax_state correlation_state(const char ** stop_code) const { static fax_state stable_state = IDLE ; switch( stable_state ) { case RXAPTSTART : *stop_code = "stable_start" ; break; case RXAPTSTOP : *stop_code = "stable_stop" ; break; case RXPHASING : *stop_code = "stable_phasing"; break; case RXIMAGE : *stop_code = "stable_image" ; break; case IDLE : *stop_code = "stable_idle" ; break; default : *stop_code = "unexpected" ; break; } /// If the mobile average is not computed on enough lines, returns IDLE /// which means "Do not know" in this context. if( m_corr_calls_nb >= m_min_corr_lines ) { int crr_row = m_img_sample / m_smpl_per_lin ; /// Sometimes, we detected a Stop just after the header, and we create an image // of 300 lignes. This is a rule of thumb. The bad consequence is that the image // would be a bit too high. This an approximate row number. // On the other hand, if we read very few lines, we assume this is just noise. const double low_corr = ( crr_row < 600 ) ? 0.01 // Short images containing text. : ( crr_row < 1300 ) ? 0.02 // Most of images. : 0.05 ; // Deutsche Wetterdienst sometimes 1900 pixels high. /// The thresholds are very approximate. This is a compromise: // * If high threshold, we cut images in two. // * If low threshold, we go on reading an image after its end if apt stop is not seen, // and might read the beginning of the next image. // This might be suppressed if phasing band detection is much better. if( m_curr_corr_avg < low_corr ) { LOG_DEBUG("Setting to stop m_curr_corr_avg=%f low_corr=%f", m_curr_corr_avg, low_corr ); *stop_code = "nocorr"; stable_state = RXAPTSTOP ; /// TODO: Beware, this is sometimes triggered with cyclic parasites. } else if( m_curr_corr_avg > 0.20 ) { stable_state = RXIMAGE ; } else if( ( m_imag_corr_max < 0.10 ) && ( crr_row > 200 ) ) { // If the correlation was always very low for many lines, // this means that we started to read a wrong image, so // there might be a wrong tuning or the DWD constant frequency. // So we trash the image. // TODO: It is done too many times: SOMETIMES THE MESSAGE IS REPEATED HUNDREDTH. // crr8row continues to grow although it makes no sense. LOG_INFO("Flushing dummy image m_imag_corr_max=%f crr_row=%d 200 lines.", m_imag_corr_max, crr_row ); static const char * garbage_200 = GARBAGE_STR ".200"; *stop_code = garbage_200; reset_afc(); stable_state = RXAPTSTOP ; } else if( ( m_imag_corr_max < 0.20 ) && ( crr_row > 500 ) ) { // If the max line-to-line correlation still low for a bigger image. LOG_INFO("Flushing dummy image m_imag_corr_max=%f crr_row=%d 500 lines.", m_imag_corr_max, crr_row ); static const char * garbage_500 = GARBAGE_STR ".500"; *stop_code = garbage_500; reset_afc(); stable_state = RXAPTSTOP ; } else { stable_state = IDLE ; } } /// Message for first detection. if( (stable_state == IDLE) && (m_corr_calls_nb == m_min_corr_lines) ) { // Do not display twice the same value. static double last_corr_avg = 0.0 ; if( m_curr_corr_avg != last_corr_avg ) { LOG_INFO("Correlation average %lf m_imag_corr_max=%f: Detected %s", m_curr_corr_avg, m_imag_corr_max, state_to_str(stable_state) ); last_corr_avg = m_curr_corr_avg ; } } return stable_state; } /// We compute about the same when plotting a pixel. void correlation_update( int the_sample ) { size_t corr_smpl_lin = lpm_to_samples( m_default_lpm ); size_t corr_buff_sz = 2 * corr_smpl_lin ; static size_t cnt_upd = 0 ; if( m_correlation_buffer.size() != corr_buff_sz ) { m_correlation_buffer.resize( corr_buff_sz, 0 ); m_curr_corr_avg = 0.0 ; } if( ( cnt_upd % corr_smpl_lin ) == 0 ) { correlation_calc(); } ++cnt_upd ; m_correlation_buffer.at_mod( m_img_sample ) = the_sample ; } // correlation_update /// Clean trick so that we can reset internal variables of process_afc(). void reset_afc() const { process_afc(true); } /// Called once for each row of input data. void process_afc(bool reset_afc = false) const { static int prev_row = -1 ; static int total_img_rows = 0 ; /// Audio frequency. static int stable_carrier = 0 ; static const int max_median_freqs = 20 ; static double median_freqs[ max_median_freqs ]; static int nb_median_freqs = 0 ; /// Rig frequency. static long long stable_rfcarrier = 0 ; /// TODO: Maybe we could restrict the range of frequencies. if( reset_afc ) { /// Displays the message only once. if( prev_row != -1 ) { LOG_INFO("Resetting AFC total_img_rows=%d",total_img_rows); } prev_row = -1 ; total_img_rows = 0 ; stable_carrier = 0; stable_rfcarrier = 0 ; nb_median_freqs = 0 ; return; } if( progStatus.afconoff == false ) return ; /// The LPM might have changed, but this is very improbable. /// We do not know the LPM so we assume the default. double smpl_per_lin = lpm_to_samples( m_default_lpm ); int crr_row = m_img_sample / smpl_per_lin ; // Actually executed once for each line of samples. if( crr_row == prev_row ) { return ; } long long curr_rfcarr = wf->rfcarrier() ; /// If the freq changed, reset the number of good lines read. if( ( m_carrier != stable_carrier ) || ( curr_rfcarr != stable_rfcarrier ) ) { /// Displays the messages once only. if( total_img_rows != 0 ) { LOG_INFO("Setting m_carrier=%d curr_rfcarr=%d total_img_rows=%d", m_carrier, static_cast(curr_rfcarr), total_img_rows ); } total_img_rows = 0 ; stable_carrier = m_carrier ; stable_rfcarrier = curr_rfcarr ; } /// If we could read a big portion of an image, then no adjustment. if( m_rx_state == RXIMAGE ) { /// Maybe this is a new image so last_img_rows is from the previous image. if( prev_row < crr_row ) { total_img_rows += crr_row - prev_row ; } else { LOG_DEBUG("prev_crr_row=%d crr_row=%d total_img_rows=%d", prev_row, crr_row, total_img_rows ); } } else { LOG_DEBUG("State=%s crr_row=%d", state_rx_str(), crr_row ); } prev_row = crr_row ; /// If we could succesfully read this number of lines, it must be the right frequency. static const int threshold_rows = 200 ; /// Consider than not only we could read many lines, but also other criterias such // as correlation, or if we could read apt start/stop. Otherwise, it may stabilize a useless frequency. if( ( total_img_rows >= threshold_rows ) && ( m_curr_corr_avg > 0.10 ) ) { if( total_img_rows == threshold_rows ) { LOG_INFO("Stable total_img_rows=%d m_curr_corr_avg=%f", total_img_rows, m_curr_corr_avg ); } /// TODO: If the reception is always poor for a long time, // and a close frequency is constantly better for a long time, then restart AFC. return ; } /* TODO: If there are parasites, there is an excursion of the frequency. Therefore, * in order to keep constant a frequency which might be temporarily decentered, * it would be better to: * - Stabilize an average of the last X frequencies. * - And/Or maximize as well the correlation. */ /// This centers the carrier where the activity is the strongest. static const int bw_dual[][2] = { { -fm_deviation - 50, -fm_deviation + 50 }, { fm_deviation - 50, fm_deviation + 50 } }; double max_carrier_dual = wf->powerDensityMaximum( 2, bw_dual ); static const int bw_right[][2] = { { fm_deviation - 50, fm_deviation + 50 } }; double max_carrier_right = wf->powerDensityMaximum( 1, bw_right ); // This might have to be adjusted because DWD has all the energy on the right // band, but Northwood has some on the left. double max_carrier = 0.0 ; /// Maybe there is not enough room on the left. if( max_carrier_dual < 0.0 ) { LOG_DEBUG("Invalid AFC: Dual band=%f, right band=%f. Take right", max_carrier_dual, max_carrier_right ); max_carrier = max_carrier_right ; } else /// Both mask detect approximately the same frequency: This is the consistent case. if( fabs( max_carrier_dual - max_carrier_right ) < 20 ) { max_carrier = max_carrier_right ; } else if( max_carrier_dual < max_carrier_right ) { LOG_DEBUG("Inconsistent AFC: Dual band=%f, right band=%f. Take right", max_carrier_dual, max_carrier_right ); max_carrier = max_carrier_right ; } else /// Single-band mask close to the left frequency of the dual-freq mask if( fabs( fabs( max_carrier_dual - max_carrier_right ) - 2 * fm_deviation ) < 20 ) { LOG_DEBUG("Dual band=%f instead of right band=%f. Take dual", max_carrier_dual, max_carrier_right ); max_carrier = max_carrier_dual ; } else { LOG_DEBUG("Inconsistent AFC: Dual band=%f, right band=%f. Take dual.", max_carrier_dual, max_carrier_right ); max_carrier = max_carrier_dual ; } /// The max power is unreachable, there might be another reason. Stay where we are. static bool prevWasRight = true ; /// TODO: We might find the next solution, maybe by giving to powerDensityMaximum a smaller range. if( ( max_carrier <= fm_deviation ) || ( max_carrier >= IMAGE_WIDTH - fm_deviation ) ) { /// Display this message once only. if( prevWasRight ) { LOG_INFO("Invalid max_carrier=%f", max_carrier); } prevWasRight = false ; return ; } else { prevWasRight = true ; } // TODO: If the correlation is below a given threshold, it might be useless to add it. median_freqs[ nb_median_freqs % max_median_freqs ] = max_carrier ; ++nb_median_freqs; if( nb_median_freqs >= max_median_freqs ) { std::sort( median_freqs, median_freqs + max_median_freqs ); max_carrier = median_freqs[ max_median_freqs / 2 ]; } double delta = fabs( m_carrier - max_carrier ); if( delta > 5.0 ) { // Hertz. /// Do not change the frequency too quickly if an image is received. double next_carr = max_carrier ; LOG_DEBUG("m_carrier=%f max_carrier=%f next_carr=%f", (double)m_carrier, max_carrier, next_carr ); m_ptr_wefax->set_freq(next_carr); } // So we can detect if it was changed manually. stable_carrier = m_carrier ; } }; // class fax_implementation /// Narrow, middle etc... input filters. Constructed at program startup. Readonly. fir_filter_pair_set fax_implementation::m_rx_filters ; // http://www.newearth.demon.co.uk/radio/hfwefax1.htm // "...the total offset is 1900Hz, so to tune a fax station on 4610kHz, tune to 4608.1kHz USB." static const double wefax_default_carrier = 1900; fax_implementation::fax_implementation( int fax_mode, wefax * ptr_wefax ) : m_ptr_wefax( ptr_wefax ) , m_dbl_sine(8192),m_dbl_cosine(8192),m_dbl_arc_sine(256) , m_short_sine(8192) { m_freq_mod = true; m_apt_stop_freq = 450 ; m_img_color = false ; m_tx_phasing_lin = 20 ; m_carrier = wefax_default_carrier ; m_start_duration = 5 ; m_stop_duration = 5 ; m_manual_mode = false ; m_rx_state = IDLE ; m_tx_state = IDLE ; m_sample_rate = 0 ; reset_counters(); int index_of_correlation ; /// http://en.wikipedia.org/wiki/Radiofax switch( fax_mode ) { case MODE_WEFAX_576: m_apt_start_freq = 300 ; index_of_correlation = IOC_576 ; m_default_lpm = 120 ; break; case MODE_WEFAX_288: m_apt_start_freq = 675 ; index_of_correlation = IOC_288 ; m_default_lpm = 60 ; break; default: LOG_ERROR(_("Invalid fax mode:%d"), fax_mode); abort(); } m_img_width = ioc_to_width( index_of_correlation ); for(size_t i=0; i(32767*std::sin(2.0*M_PI*i/m_short_sine.size())); } }; void fax_implementation::init_rx(int the_smpl_rat) { m_sample_rate=the_smpl_rat; m_rx_state=RXAPTSTART; m_apt_count=m_apt_trans=0; m_apt_high=false; /// Centers the carriers on the GUI and reinits the trigonometric tables. m_ptr_wefax->set_freq(wefax_default_carrier); /// Default value, can be the with the GUI. m_ix_filt = 0 ; // 0=narrow, 1=middle, 2=wide. reset_increments(); m_i_fir_old=m_q_fir_old=0; m_corr_calls_nb = 0; } /// Values are between zero and +range_sample void fax_implementation::decode(const int* buf, int nb_samples) { if(nb_samples==0) { LOG_WARN(_("Empty buffer.")); end_rx(); } fax_signal my_signal(this); process_afc(); for(int i=0; i 0 ) { /// If the maximum number of lines is reached, we stop the reception. decode_image(crr_val); } } m_img_sample++; } } // The number of transitions between black and white is counted. After 1/2 // second, the frequency is calculated. If it matches the APT start frequency, // the state skips to the detection of phasing lines, if it matches the apt // stop frequency two times, the reception is ended. void fax_implementation::decode_apt(int x, const fax_signal & the_signal ) { if( (m_img_sample % 10000) == 0 ) { PUT_STATUS( state_rx_str() << " apt_count=" << m_apt_count ); } /// Maybe the thresholds 229 and 25 should be changed if the image is not contrasted enough. // if(x>229 && !m_apt_high) { if(x>215 && !m_apt_high) { m_apt_high=true; ++m_apt_trans; // } else if(x<25 && m_apt_high) { } else if(x<40 && m_apt_high) { m_apt_high=false; } ++m_apt_count ; /// This makes one line if LPM=120: // samples_per_line = m_sample_rate * 60.0 / the_lpm ; if( m_apt_count >= m_sample_rate/2 ) { static int curr_freq = 0 ; static int cr_1_freq = 0 ; static int cr_2_freq = 0 ; static int cr_3_freq = 0 ; // For APT start, we have several lines with freq=300 nearly exactly. // For APT stop, one or two lines maximum with freq=452, and this is not accurate. // On top of that, sometimes lines randomly have 300 or 452 black-white transitions, // especially if the signal is very noisy. This is why we check the transitions // frequency of two consecutive lines. cr_3_freq=cr_2_freq; cr_2_freq=cr_1_freq; cr_1_freq=curr_freq; curr_freq=m_sample_rate*m_apt_trans/m_apt_count; /// This writes the S/R level on the status bar. double tmp_snr = the_signal.image_noise_ratio(); char snr_buffer[64]; snprintf(snr_buffer, sizeof(snr_buffer), "s/n %3.0f dB", 20.0 * log10(tmp_snr)); put_Status1(snr_buffer); LOG_DEBUG("m_apt_count=%d m_apt_trans=%d curr_freq=%d cr_1_freq=%d cr_2_freq=%d", m_apt_count, m_apt_trans, curr_freq, cr_1_freq, cr_2_freq ); m_apt_count=m_apt_trans=0; if(m_rx_state==RXAPTSTART) { if( is_near_freq(curr_freq,m_apt_start_freq, 8 ) && is_near_freq(cr_1_freq,m_apt_start_freq, 8 ) ) { LOG_INFO(_("Skipping APT freq=%d State=%s"), curr_freq, state_rx_str() ); skip_apt_rx(); PUT_STATUS( state_rx_str() << ", " << _("frequency") << ": " << curr_freq << " Hz. " << _("Skipping.") ); return ; } if( is_near_freq(curr_freq,m_apt_stop_freq, 2 ) && is_near_freq(cr_1_freq,m_apt_stop_freq, 2 ) ) { LOG_INFO(_("Spurious APT stop frequency=%d Hz as waiting for APT start. SNR=%f State=%s"), curr_freq, tmp_snr, state_rx_str() ); return ; } PUT_STATUS( state_rx_str() << ", " << _("frequency") << ": " << curr_freq << " Hz." ); } /// If APT start in the middle of an image, maybe the preceding APT Stop was not caught. if(m_rx_state==RXIMAGE) { /// TODO: We could enhance accuracy by taking into account the number of read lines. int crr_row = m_img_sample / m_smpl_per_lin ; const char * msg_start = NULL ; if( is_near_freq(curr_freq,m_apt_start_freq, 4 ) && is_near_freq(cr_1_freq,m_apt_start_freq, 4 ) && is_near_freq(cr_2_freq,m_apt_start_freq, 4 ) ) { msg_start = "apt"; } else if( is_near_freq(curr_freq,m_apt_start_freq, 5 ) && is_near_freq(cr_1_freq,m_apt_start_freq, 5 ) && is_near_freq(cr_2_freq,m_apt_start_freq, 5 ) && is_near_freq(cr_3_freq,m_apt_start_freq, 5 ) ) { msg_start = "apt2"; } if( msg_start != NULL ) { std::string comment = strformat( "APT start: freq=%d cr_1=%d cr_2=%d cr_3=%d crr_row=%d State=%s msg=%s", curr_freq, cr_1_freq, cr_2_freq, cr_3_freq, crr_row, state_rx_str(), msg_start ); LOG_INFO("%s",comment.c_str()); PUT_STATUS( state_rx_str() << ", " << _("frequency") << ": " << curr_freq << " Hz. " << _("Skipping.") ); save_automatic(msg_start,comment); skip_apt_rx(); return ; } } /// TODO: Check that the correlation is not too high because there are false stops. const char * msg_stop = NULL ; if( is_near_freq(curr_freq,m_apt_stop_freq, 6 ) && is_near_freq(cr_1_freq,m_apt_stop_freq, 6 ) ) { msg_stop = "ok" ; } else if( is_near_freq(curr_freq,m_apt_stop_freq, 7 ) && is_near_freq(cr_1_freq,m_apt_stop_freq, 7 ) && is_near_freq(cr_2_freq,m_apt_stop_freq, 7 ) ) { msg_stop = "ok2" ; } if( msg_stop != NULL ) { std::string comment = strformat( "APT Stop: curr_freq=%d m_img_sample=%d State=%s_ msg=%s", curr_freq, m_img_sample, state_rx_str(), msg_stop ); LOG_INFO("%s",comment.c_str()); PUT_STATUS( state_rx_str() << " " << _("Apt stop frequency") << ": " << curr_freq << " Hz. " << _("Stopping.") ); save_automatic(msg_stop,comment); return ; } switch( the_signal.signal_state() ) { case RXAPTSTART : switch( m_rx_state ) { case RXAPTSTART : skip_apt_rx(); LOG_INFO( "Start, start: %s", the_signal.signal_text() ); break ; default : LOG_DEBUG( "Start, %s: %s", state_rx_str(), the_signal.signal_text() ); break ; } break ; case RXPHASING : switch( m_rx_state ) { case RXAPTSTART : skip_apt_rx(); LOG_INFO( "Phasing, start: %s", the_signal.signal_text() ); break ; default : LOG_DEBUG( "Phasing, %s: %s", state_rx_str(), the_signal.signal_text() ); break ; } break ; case RXIMAGE : switch( m_rx_state ) { case RXAPTSTART : skip_apt_rx(); /// The phasing step will start receiving the image later. First we try /// to phase the image correctly. LOG_INFO( "Image, start: %s", the_signal.signal_text() ); break ; default : LOG_DEBUG( "Image, %s: %s", state_rx_str(), the_signal.signal_text() ); break ; } break ; case RXAPTSTOP : switch( m_rx_state ) { case RXIMAGE : LOG_INFO( "Stop, image: %s", the_signal.signal_text() ); save_automatic( the_signal.signal_stop_code(), the_signal.signal_text() ); break; default : LOG_DEBUG( "Stop, %s: %s", state_rx_str(), the_signal.signal_text() ); break ; } break ; default : LOG_DEBUG( "%s, %s: %s", state_to_str(the_signal.signal_state()), state_rx_str(), the_signal.signal_text() ); break ; } } } /// This generates a file name with the reception time and the frequency. std::string fax_implementation::generate_filename( const char *extra_msg ) const { time_t tmp_time = time(NULL); struct tm tmp_tm ; localtime_r( &tmp_time, &tmp_tm ); char buf_fil_nam[256] ; long long tmp_fl = wf->rfcarrier() ; snprintf( buf_fil_nam, sizeof(buf_fil_nam), "wefax_%04d%02d%02d_%02d%02d%02d_%d_%s.png", 1900 + tmp_tm.tm_year, 1 + tmp_tm.tm_mon, tmp_tm.tm_mday, tmp_tm.tm_hour, tmp_tm.tm_min, tmp_tm.tm_sec, static_cast(tmp_fl), extra_msg ); return buf_fil_nam ; } /// This saves an image and adds the right comments. void fax_implementation::save_automatic( const char * extra_msg, const std::string & comment) { std::string new_filnam ; std::stringstream extra_comments ; /// These criteria used by rules-of-thumb to eliminate blank images. m_statistics.calc(); double avg = m_statistics.average(); double stddev = m_statistics.stddev(); int current_row = m_img_sample / m_smpl_per_lin ; /* Sometimes the AFC leaves the right frequency (Because no signal) and it produces * images which are plain wrong (Pure periodic parasites). We might find * a criteria to suppress them but maybe it's better to enhance AFC. */ /// Minimum pixel numbers for a valid image. static const int max_fax_pix_num = 150000 ; if( m_fax_pix_num < max_fax_pix_num ) { /// Maybe we should reset AFC ? LOG_INFO( _("Do not save small image (%d bytes). Manual=%d"), m_fax_pix_num, m_manual_mode ); goto cleanup_rx ; } /// If correlation was always low. if( 0 == strncmp( extra_msg, GARBAGE_STR, strlen(GARBAGE_STR) ) ) { LOG_INFO( _("Do not save garbage file") ); goto cleanup_rx ; } static const double min_max_correlation = 0.20 ; if( m_imag_corr_max < min_max_correlation ) { LOG_INFO(_("Do not save image with correlation < less than %f"), min_max_correlation ); goto cleanup_rx ; } /// Intermediate blank images, low standard deviation and correlation. if( ( ( avg > 220 ) && ( m_imag_corr_max < 0.30 ) && ( stddev < 30 ) ) || ( ( avg > 240 ) && ( m_imag_corr_max < 0.35 ) && ( stddev < 30 ) ) || ( ( avg > 230 ) && ( m_imag_corr_max < 0.25 ) && ( stddev < 35 ) ) || ( ( avg > 220 ) && ( stddev < 20 ) ) ) { LOG_INFO(_("Do not save non-significant image, avg=%f, m_imag_corr_max=%f stddev=%f"), avg, m_imag_corr_max, stddev ); goto cleanup_rx ; } /// Dark images coming from local parasites. if( ( avg < 100 ) && ( m_imag_corr_max < 0.30 ) ) { LOG_INFO(_("Do not save dark parasite image, avg=%f, m_imag_corr_max=%f"), avg, m_imag_corr_max ); goto cleanup_rx ; } /// Same: Dark images due to parasites. if( ( avg < 80 ) && ( m_imag_corr_max < 0.35 ) ) { LOG_INFO(_("Do not save dark parasite image (II), avg=%f, m_imag_corr_max=%f"), avg, m_imag_corr_max ); goto cleanup_rx ; } if( ( avg > 235 ) && ( m_imag_corr_max < 0.65 ) && ( stddev < 40 ) && ( current_row < 100 ) ) { LOG_INFO(_("Do not save small white image, avg=%f, m_imag_corr_max=%f stddev=%f current_row=%d"), avg, m_imag_corr_max, stddev, current_row ); goto cleanup_rx ; } /// Small image cut between APT start and phasing. if( ( avg < 130 ) && ( m_imag_corr_max < 0.70 ) && ( stddev < 100 ) && ( current_row < 100 ) ) { LOG_INFO(_("Do not save small white image, avg=%f, m_imag_corr_max=%f stddev=%f current_row=%d"), avg, m_imag_corr_max, stddev, current_row ); goto cleanup_rx ; } new_filnam = generate_filename(extra_msg); LOG_INFO( "Saving %d bytes in %s. m_imag_corr_max=%f", m_fax_pix_num, new_filnam.c_str(), m_imag_corr_max ); extra_comments << "ControlMode:" << ( m_manual_mode ? "Manual" : "APT control" ) << "\n" ; extra_comments << "LPM:" << m_lpm_img << "\n" ; extra_comments << "FrequencyMode:" << ( m_freq_mod ? "FM" : "AM" ) << "\n" ; extra_comments << "Carrier:" << m_carrier << "\n" ; extra_comments << "Inversion:" << ( m_phase_inverted ? "Inverted" : "Normal" ) << "\n" ; extra_comments << "Color:" << ( m_img_color ? "Color" : "BW" ) << "\n" ; extra_comments << "SampleRate:" << m_sample_rate << "\n" ; extra_comments << "Maximum line-to-line correlation:" << m_imag_corr_max << "\n" ; extra_comments << "Minimum line-to-line correlation:" << m_imag_corr_min << "\n" ; extra_comments << "Average:" << avg << "\n" ; extra_comments << "Row number:" << current_row << "\n" ; extra_comments << "Standard deviation:" << stddev << "\n" ; extra_comments << "Comment:" << comment << "\n" ; extra_comments << "PID:" << getpid() << "\n" ; wefax_pic::save_image( new_filnam, extra_comments.str() ); cleanup_rx: /// This clears the current image. end_rx(); }; // Phasing lines consist of 2.5% white at the beginning, 95% black and again // 2.5% white at the end (or inverted). In normal phasing lines we try to // count the length between the white-black transitions. If the line has // a reasonable amount of black (4.8%--5.2%) and the length fits in the // range of 60--360lpm (plus some tolerance) it is considered a valid // phasing line. Then the start of a line and the lpm is calculated. void fax_implementation::decode_phasing(int x, const fax_signal & the_signal ) { static const bool filter_phasing = true ; if( filter_phasing ) { // The input is filtered over X columns because the blacks bands are very wide. static const size_t phasing_width = 16 ; static size_t phasing_count = 0 ; static int phasing_history[ phasing_width ]; /// Mobile average filters out parasites. phasing_history[ phasing_count % phasing_width ] = x ; ++phasing_count ; if( phasing_count >= phasing_width ) { x = 0 ; for( size_t i = 0; i < phasing_width; ++i ) x += phasing_history[ i ]; x /= phasing_width ; } } /// Number of samples per line. m_curr_phase_len++; ++m_phasing_calls_nb ; /// Number of black pixels. if(x>128) { m_curr_phase_high++; } /* If the high level is too high (229) we miss some phasing lines. * but if it is too low (200) the center is not at the right place. * We should instead use an histogram and determine what is the highest level in the image. */ // if((!m_phase_inverted && x>229 && !m_phase_high) || if((!m_phase_inverted && x>200 && !m_phase_high) || ( m_phase_inverted && x<25 && m_phase_high)) { m_phase_high=m_phase_inverted?false:true; } else if((!m_phase_inverted && x<25 && m_phase_high) || ( m_phase_inverted && x>200 && !m_phase_high)) // ( m_phase_inverted && x>229 && !m_phase_high)) { m_phase_high=m_phase_inverted?true:false; /// In the phasing line, there is a white segment of 5% of the total length, // so it is approximated with 0.048->0.052. if(m_curr_phase_high>=(m_phase_inverted?0.948:0.048)*m_curr_phase_len && m_curr_phase_high<=(m_phase_inverted?0.952:0.052)*m_curr_phase_len && m_curr_phase_len <= 1.1 * m_sample_rate && m_curr_phase_len >= 0.15 * m_sample_rate) { double tmp_lpm = 60.0 * m_sample_rate / m_curr_phase_len; m_lpm_sum_rx += tmp_lpm; ++m_phase_lines; PUT_STATUS( state_rx_str() << ". " << _("Decoding phasing line") << ", lpm = " << tmp_lpm << " " << _("count") << "=" << m_phase_lines ); m_num_phase_lines=0; /// This option was selected just once, in the middle of an image, // with many vertical lines. if( m_phase_lines >= 5 /* Was 4 */ ) { /// The precision cannot really increase because there cannot // be more than a couple of loops. This is used for guessing // whether the LPM is around 120 or 60. lpm_set( m_lpm_sum_rx / m_phase_lines ); std::string comment = strformat( "Skipping to reception: m_phase_lines=%d m_num_phase_lines=%d LPM=%f State=%s" " m_img_sample=%d m_last_col=%d m_lpm_img=%f m_smpl_per_lin=%f", m_phase_lines, m_num_phase_lines, m_lpm_img, state_rx_str(), m_img_sample, m_last_col, m_lpm_img, m_smpl_per_lin ); LOG_INFO( "%s", comment.c_str() ); skip_phasing_to_image_save(comment); /// reset_counters sets these to zero, so restore right values. // But skip_phasing_to_image normalizes the LPM if not accurate. /// Half of the band of the phasing line. m_img_sample=static_cast(1.025 * m_smpl_per_lin ); double tmp_pos=std::fmod(m_img_sample,m_smpl_per_lin) / m_smpl_per_lin; m_last_col=static_cast(tmp_pos*m_img_width); /// Now the image will start at the right column offset. m_fax_pix_num = m_last_col * bytes_per_pixel ; LOG_INFO("Center set: m_last_col=%d m_img_width=%d m_smpl_per_lin=%f", m_last_col, m_img_width, m_smpl_per_lin ); } } else if( m_rx_state == RXPHASING && m_phase_lines>0 && ++m_num_phase_lines>=5) { /// TODO: Compare with m_tx_phasing_lin which indicates the number of phasing /// lines sent when transmitting an image. std::string comment = strformat( "Missed last phasing line m_phase_lines=%d m_num_phase_lines=%d LPM=%f State=%s", m_phase_lines, m_num_phase_lines, m_lpm_img, state_rx_str() ); LOG_INFO("%s", comment.c_str() ); /// Phasing header is finished but could not get the center. skip_phasing_to_image(true); } else if(m_curr_phase_len>5*m_sample_rate) { m_curr_phase_len=0; PUT_STATUS( state_rx_str() << ". " << _("Decoding phasing line, resetting.") ); } else { /// Here, if no phasing is detected. Must be very fast. } PUT_STATUS( state_rx_str() << ". " << _("Decoding phasing line, reset.") ); m_curr_phase_len=m_curr_phase_high=0; } else if ( m_rx_state == RXPHASING ) { /// We do not know the LPM so we assume the default. /// TODO: We could take the one given by the GUI. Apparently; problem for Japanese faxes when lpm=60: // http://forums.radioreference.com/digital-signals-decoding/228802-problems-decoding-wefax.html double smpl_per_lin = lpm_to_samples( m_default_lpm ); int smpl_per_lin_int = smpl_per_lin ; int nb_tested_phasing_lines = m_phasing_calls_nb / smpl_per_lin ; /// If this is too big, we lose the beginning of the fax. // If this is too small, we start recording when we should not (But why not starting early ?) // Value was: 30 static const int max_tested_phasing_lines = 20 ; if( (m_phase_lines == 0) && (m_num_phase_lines == 0) && (nb_tested_phasing_lines >= max_tested_phasing_lines ) && ( (m_phasing_calls_nb % smpl_per_lin_int) == 0 ) ) { switch( the_signal.signal_state() ) { case RXIMAGE : LOG_INFO(_("Starting reception when phasing:%s"), the_signal.signal_text() ); skip_phasing_to_image(true); break ; /// If RXPHASING, we stay in phasing mode. case RXAPTSTOP : /// Do not display the same message over and over. LOG_DEBUG( _("Strong APT stop when phasing:%s"), the_signal.signal_text() ); end_rx(); skip_apt_rx(); default : break ; } } } } bool fax_implementation::decode_image(int x) { double current_row_dbl = m_img_sample / m_smpl_per_lin ; int current_row = current_row_dbl ; int curr_col= m_img_width * (current_row_dbl - current_row) ; if(curr_col==m_last_col) { m_pixel_val+=x; m_pix_samples_nb++; } else { if(m_pix_samples_nb>0) { m_pixel_val/=m_pix_samples_nb; /// TODO: Put m_fax_pix_num in wefax_pic so that the saving of an image /// will only be the number of added pixels. And it will hide /// the storage of B/W pixels in three contiguous ones. // // TODO: If the machine is heavily loaded, it loses a couple of pixel. // The consequence is that the image is shifted. // We could use the local clock to deduce where the pixel must be written: // - Store the first pixel reception time. // - Compute m_fax_pix_num = (reception_time * LPM * image_width) REQ( wefax_pic::update_rx_pic_bw, m_pixel_val, m_fax_pix_num ); m_statistics.add_bw( m_pixel_val ); m_fax_pix_num += bytes_per_pixel ; } m_last_col=curr_col; m_pixel_val=x; m_pix_samples_nb=1; } /// Prints the status from time to time. if( (m_img_sample % 10000) == 0 ) { PUT_STATUS( state_rx_str() << ". " << _("Image reception") << ", " << _("sample") << "=" << m_img_sample ); } /// Hard-limit to the number of rows. if( current_row >= progdefaults.WEFAX_MaxRows ) { std::string comment = strformat( _("Maximum number of rows %d reached:%d. m_last_col=%d Manual=%d"), progdefaults.WEFAX_MaxRows, current_row, m_last_col, m_manual_mode ); LOG_INFO("%s", comment.c_str()); /// The reception might be very poor, so reset AFC. reset_afc(); save_automatic("max",comment); return true ; } else { return false ; } } /// Called automatically or by the GUI, when clicking "Skip APT" void fax_implementation::skip_apt_rx(void) { LOG_INFO("state=%s",state_rx_str() ); REQ( wefax_pic::skip_rx_apt ); if(m_rx_state!=RXAPTSTART) { LOG_ERROR( _("Should be in APT state. State=%s. Manual=%d"), state_rx_str(), m_manual_mode ); } lpm_set( 0 ); m_rx_state=RXPHASING; reset_phasing_counters(); m_img_sample=0; /// Used for correlation between consecutive lines. m_imag_corr_max = 0.0 ; // Used for finally deciding whether it is worth saving the image. m_imag_corr_min = 1.0 ; // Used for finally deciding whether it is worth saving the image. m_statistics.reset(); } void fax_implementation::skip_phasing_to_image_save(const std::string & comment) { switch( m_rx_state ) { /// Maybe we were still reading an image when the phasing band was detected. case RXIMAGE : LOG_INFO("Detected phasing when in image state."); // TODO: Maybe we could keep the top margin, and not save if less than X lines. save_automatic("phasing",comment); skip_apt_rx(); break ; default: LOG_ERROR( _("Should be in phasing or image state. State=%s"), state_rx_str() ); case RXPHASING: break ; } /// Because we might find a phasing band when reading an image. reset_phasing_counters(); /// Auto-centering by default. Beware that if an image is saved and /// if we lose samples, the alignment is lost. skip_phasing_to_image(false); } /// Called by the user when skipping phasing, /// or automatically when phasing is detected. void fax_implementation::skip_phasing_to_image(bool auto_center) { m_ptr_wefax->qso_rec_init(); REQ( wefax_pic::skip_rx_phasing, auto_center ); m_rx_state=RXIMAGE; /// For monochrome, LPM=60, 90, 100, 120, 180, 240. For colour, LPM =120, 240 /// So we round to the nearest integer to avoid slanting. int lpm_integer = wefax_pic::normalize_lpm( m_lpm_img ); if( m_lpm_img != lpm_integer ) { /// If we could not find a valid LPM, then set the default one for this mode (576/288). lpm_integer = wefax_pic::normalize_lpm( m_default_lpm ); LOG_INFO( _("LPM rounded from %f to %d. Manual=%d State=%s"), m_lpm_img, lpm_integer, m_manual_mode, state_rx_str() ); } /// From now on, m_lpm_img will never change and has a normalized value. REQ( wefax_pic::update_rx_lpm, lpm_integer); PUT_STATUS( state_rx_str() << ". " << _("Decoding phasing line LPM=") << lpm_integer ); lpm_set( lpm_integer ); } /// Called by the user when clicking button. Never called automatically. void fax_implementation::skip_phasing_rx(bool auto_center) { if(m_rx_state!=RXPHASING) { LOG_ERROR( _("Should be in phasing state. State=%s"), state_rx_str() ); } skip_phasing_to_image(auto_center); /// We force these two values because these could not be detected automatically. if( m_lpm_img != m_default_lpm ) { lpm_set( m_default_lpm ); LOG_INFO( _("Forcing m_lpm_img=%f. Manual=%d"), m_lpm_img, m_manual_mode ); } m_img_sample=0; /// The image start may not be what the phasing would have told. } // Here we want to remove the last detected phasing line and the following // non phasing line from the beginning of the image and one second of apt stop // from the end void fax_implementation::end_rx(void) { /// Synchronized otherwise there might be a crash if something tries to access the data. REQ(wefax_pic::abort_rx_viewer ); m_rx_state=RXAPTSTART; reset_counters(); } /// Receives data from the soundcard. void fax_implementation::rx_new_samples(const double* audio_ptr, int audio_sz) { int demod[audio_sz]; static const double half_255 = (double)range_sample * 0.5 ; const double ratio_sam_devi = half_255 * static_cast(m_sample_rate)/fm_deviation; /// The reception filter may have been changed by the GUI. C_FIR_filter & ref_fir_filt_pair = m_rx_filters[ m_ix_filt ]; const double half_arc_sine_size = m_dbl_arc_sine.size() / 2.0 ; for(int i=0; i10000) { /// Real part of the product of current vector, /// by previous vector rotated of 90 degrees. /// It makes something like sine(a-b). /// Maybe the derivative of the phase, that is, /// the instantaneous frequency ? double y = m_q_fir_old * ifirout - m_i_fir_old * qfirout ; /// Mapped to the interval [0 .. size] /// m_dbl_arc_sine[i] = asin(2*i/m_dbl_arc_sine.size-1)/2/Pi. /// TODO: Therefore it could be simplified ? y = ( y + 1.0 ) * half_arc_sine_size; /// TODO: y might be rounded with more accuracy: (int)(Y+0.5) double x = ratio_sam_devi * m_dbl_arc_sine[static_cast(y)]; int scaled_x = x + half_255 ; if(scaled_x < 0) { scaled_x=0; } else if(scaled_x > range_sample) { scaled_x=range_sample; } demod[i]=scaled_x; } else { demod[i]=0; } } else { /// Why 96000 ? bytes_per_pixel * 32000 because color ? ifirout/=96000; qfirout/=96000; demod[i]=static_cast (std::sqrt(ifirout*ifirout+qfirout*qfirout)); } m_i_fir_old=ifirout; m_q_fir_old=qfirout; } decode( demod, audio_sz); #ifdef WEFAX_DISPLAY_SCOPE /// Nothing really meaningful to display. /// Beware that some pixels are lost if too many things are displayed double scope_demod[ audio_sz ]; /// TODO: Do this in the loop, it will avoid conversions. for( int i = 0 ; i < audio_sz ; ++i ) { scope_demod[ i ] = demod[i]; } set_scope( (double *)scope_demod, audio_sz , true ); #endif // WEFAX_DISPLAY_SCOPE } // Init transmission. Called once only. void fax_implementation::init_tx(int the_smpl_rat) { m_sample_rate=the_smpl_rat; set_carrier(wefax_default_carrier); /// These reset increments of trigo tables. m_ptr_wefax->set_freq(wefax_default_carrier); m_tx_state=TXAPTSTART; } /// Elements of buffer are between 0.0 and 1.0 void fax_implementation::modulate(const double* buffer, int number) { /// TODO: This should be in m_short_sine static const double dbl_max_short_invert = 1.0 / 32768.0 ; double stack_xmt_buf[number] ; if( m_freq_mod ) { for(int i = 0; i < number; i++) { double tmp_freq = m_carrier + 2. * ( buffer[i] - 0.5 ) * fm_deviation ; m_short_sine.set_increment(m_short_sine.size() * tmp_freq / m_sample_rate); stack_xmt_buf[i] = m_short_sine.next_value() * dbl_max_short_invert ; } } else { /// Beware: Not tested ! for(int i = 0; i < number; i++) { stack_xmt_buf[i] = m_short_sine.next_value() * buffer[i] * dbl_max_short_invert ; } } m_ptr_wefax->ModulateXmtr( stack_xmt_buf, number ); } /// Returns true if succesful /* MULTIPSK: 120 LPM / 288 IOC and a transmission takes with a 200 lines picture 150 sec. In FLDIGI it took 480 sec. For 120 LPM it's too slow. "240 LPM" in FLDIGI gives 130 sec which is nearly real 120 LPM. APT 5 sec m_start_duration=5 SYNC 30 sec m_tx_phasing_line=20 lines => 10 seconds if LPM=120 PIC APT 5 sec m_stop_duration=5 BLACK 10 sec No black signal. This is in summary 50 sec + PIC (60*LINES/LPM). */ bool fax_implementation::trx_do_next(void) { LOG_DEBUG("m_lpm_img=%f", m_lpm_img ); /// The number of samples sent for one line. The LPM is given by the GUI. const int smpl_per_lin= m_smpl_per_lin; /// Should not be too big because it is allocated on the stack, gcc feature. static const int block_len = 256 ; double buf[block_len]; bool end_of_loop = false ; bool tx_completed = true ; int curr_sample_idx = 0 , nb_samples_to_send = 0 ; for(int num_bytes_to_write=0; ; ++num_bytes_to_write ) { bool disp_msg = ( ( num_bytes_to_write % block_len ) == 0 ) && ( num_bytes_to_write > 0 ); if( disp_msg ) { modulate( buf, num_bytes_to_write); const char * curr_status_msg = state_to_str( m_tx_state ); /// TODO: Should be multiplied by 3 when sending in BW ? if( m_ptr_wefax->is_tx_finished(curr_sample_idx, nb_samples_to_send, curr_status_msg ) ) { end_of_loop = true ; tx_completed = false; continue ; }; num_bytes_to_write = 0 ; }; if( end_of_loop == true ) { break ; } if(m_tx_state==TXAPTSTART) { nb_samples_to_send = m_sample_rate * m_start_duration ; if( curr_sample_idx < nb_samples_to_send ) { buf[num_bytes_to_write]=(curr_sample_idx*2*m_apt_start_freq/m_sample_rate)%2; curr_sample_idx++; } else { m_tx_state=TXPHASING; curr_sample_idx=0; } } if(m_tx_state==TXPHASING) { nb_samples_to_send = smpl_per_lin * m_tx_phasing_lin ; if( curr_sample_idx < nb_samples_to_send ) { double pos= (double)(curr_sample_idx % smpl_per_lin) / (double)smpl_per_lin; buf[num_bytes_to_write] = (pos<0.025||pos>=0.975 ) ? (m_phase_inverted?0.0:1.0) : (m_phase_inverted?1.0:0.0); curr_sample_idx++; } else { m_tx_state=ENDPHASING; curr_sample_idx=0; } } if(m_tx_state==ENDPHASING) { nb_samples_to_send = smpl_per_lin ; if( curr_sample_idx < nb_samples_to_send ) { buf[num_bytes_to_write]= m_phase_inverted?0.0:1.0; curr_sample_idx++; } else { m_tx_state=TXIMAGE; curr_sample_idx=0; } } if(m_tx_state==TXIMAGE) { /// The image must be stretched so that its width matches the fax width, /// which cannot change because because it depends on the LPM. /// Accordingly the height is stretched. /// For LPM=120 and sample rate=11025 Hz, smpl_per_lin=5512. double ratio_img_to_fax = (double)m_img_width / m_img_tx_cols ; double samples_per_pix = smpl_per_lin / (double)m_img_width ; double ratio_pow = ratio_img_to_fax * ratio_img_to_fax * samples_per_pix ; nb_samples_to_send = m_img_tx_cols * m_img_tx_rows * ratio_pow ; if( curr_sample_idx < nb_samples_to_send ) { int tmp_col = (double)( curr_sample_idx % smpl_per_lin ) * (double)m_img_tx_cols / smpl_per_lin; int tmp_row = (double)( curr_sample_idx / smpl_per_lin ) * (double)m_img_tx_cols / m_img_width; if( tmp_row >= m_img_tx_rows ) { LOG_ERROR( "Inconsistent tmp_row=%d m_img_tx_rows=%d " "curr_sample_idx=%d smpl_per_lin=%d " "ratio_img_to_fax=%f nb_samples_to_send=%d", tmp_row, m_img_tx_rows, curr_sample_idx, smpl_per_lin, ratio_img_to_fax, nb_samples_to_send ); exit(EXIT_FAILURE); } int byte_offset = bytes_per_pixel * ( tmp_row * m_img_tx_cols + tmp_col ); unsigned char temp_pix = m_xmt_pic_buf[ byte_offset ]; curr_sample_idx++; REQ( wefax_pic::set_tx_pic, temp_pix, tmp_col, tmp_row, m_img_color ); buf[num_bytes_to_write]= (double)temp_pix / 256.0 ; if( ( curr_sample_idx % 5000 ) == 0 ) { LOG_INFO( "curr_sample_idx=%d tmp_row=%d tmp_col=%d smpl_per_lin=%d " "samples_per_pix=%f nb_samples_to_send=%d m_img_width=%d", curr_sample_idx, tmp_row, tmp_col, smpl_per_lin, samples_per_pix, nb_samples_to_send, m_img_width ); } } else { m_tx_state=TXAPTSTOP; curr_sample_idx=0; } } if(m_tx_state==TXAPTSTOP) { nb_samples_to_send = m_sample_rate * m_stop_duration ; if( curr_sample_idx < nb_samples_to_send ) { buf[num_bytes_to_write]=curr_sample_idx*2*m_apt_stop_freq/m_sample_rate%2; curr_sample_idx++; } else { m_tx_state=IDLE; end_of_loop = true ; continue ; } } } // loop return tx_completed ; } void fax_implementation::tx_params_set( int the_lpm, const unsigned char * xmtpic_buffer, bool is_color, int img_w, int img_h ) { LOG_DEBUG("img_w=%d img_h=%d the_lpm=%d is_color=%d", img_w, img_h, the_lpm, (int)is_color); m_img_tx_rows=img_h; m_img_tx_cols=img_w; m_img_color = is_color ; lpm_set( the_lpm ); m_xmt_pic_buf = xmtpic_buffer ; PUT_STATUS( _("Sending picture.") << _(" rows=") << m_img_tx_rows << _(" cols=") << m_img_tx_cols ); } void fax_implementation::tx_apt_stop(void) { m_tx_state=TXAPTSTOP; } //============================================================================= // //============================================================================= /// Called by trx_trx_transmit_loop void wefax::tx_init(SoundBase *sc) { modem::scard = sc; // SoundBase videoText(); // In trx/modem.cxx m_impl->init_tx(modem::samplerate) ; } /// This updates the window label according to the state. void wefax::update_rx_label(void) const { std::string tmp_label( _("Reception ") ); tmp_label += mode_info[modem::mode].name ; if( m_impl->manual_mode_get() ) { tmp_label += _(" - Manual") ; } else { tmp_label += _(" - APT control") ; } REQ( wefax_pic::set_rx_label, tmp_label ); } void wefax::rx_init() { put_MODEstatus(modem::mode); m_impl->init_rx(modem::samplerate) ; REQ( wefax_pic::resize_rx_viewer, m_impl->fax_width() ); } void wefax::init() { modem::init(); /// TODO: Maybe remove, probably not necessary because called by trx_trx_loop rx_init(); /// TODO: Display scope. set_scope_mode(Digiscope::SCOPE); } void wefax::shutdown() { } wefax::~wefax() { modem::stopflag = true; /// Maybe we are receiving an image, this must be stopped. end_reception(); /// Maybe we are sending an image. REQ( wefax_pic::abort_tx_viewer ); activate_wefax_image_item(false); delete m_impl ; /// Not really useful, just to help debugging. m_impl = 0 ; } wefax::wefax(trx_mode wefax_mode) : modem() { /// Beware that it is already set by modem::modem modem::cap |= CAP_AFC | CAP_REV | CAP_IMG ; LOG_DEBUG("wefax_mode=%d", (int)wefax_mode); wefax::mode = wefax_mode; modem::samplerate = 11025; m_impl = new fax_implementation(wefax_mode, this); /// Now this object is usable by wefax_pic. wefax_pic::setpicture_link(this); int tmpShift = progdefaults.WEFAX_Shift ; if( (progdefaults.WEFAX_Shift < 100 ) || ( progdefaults.WEFAX_Shift > 1000 ) ) { static const int standard_shift = 800; LOG_WARN("Invalid weather fax shift: %d. setting standard value: %d", progdefaults.WEFAX_Shift, standard_shift ); tmpShift = standard_shift ; } fm_deviation = tmpShift / 2 ; modem::bandwidth = fm_deviation * 2 ; m_abortxmt = false; modem::stopflag = false; // There is only one instance of the reception and transmission // windows, therefore only static methods. wefax_pic::create_both( false ); /// This updates the window label. set_rx_manual_mode( false ); activate_wefax_image_item(true); init(); } //===================================================================== // receive processing //===================================================================== /// This must return the current time in seconds with high precision. #if defined(__WIN32__) || defined(__APPLE__) #include /// This is much less accurate. static double current_time(void) { clock_t clks = clock(); return clks * 1.0 / CLOCKS_PER_SEC; } #else #if defined(HAVE_CLOCK_GETTIME) #include static double current_time(void) { // DJV/AB3NR // Replace call to deprecated ftime() function with call to // clock_gettime(2). clock_gettime(2) is POSIX.1 compliant. // Replace ifdef __linux__ with autoconf generated guard. // (Note __linux__ fails for *BSD, which all have better functions // than the fallback Windows routine. Note, clock(2) on Unix systems // returns CPU time used so far. It's not a "clock" in any generally // accepted sense of the word. // // Check system call return codes and abort on failure. // DJV/AB3NR struct timespec ts; double curtime; // Do not know if CLOCK_MONOTONIC or CLOCK_REALTIME is appropriate. DJV if(clock_gettime(CLOCK_REALTIME, &ts)!=0) { LOG_PERROR("clock_gettime"); abort(); } curtime= ts.tv_nsec*1e-09 + (double)ts.tv_sec; return curtime; } #else #include // This is much less accurate. // Add compile time warning DJV/AB3NR #warning imprecise clock() call in function current_time in wefax.cxx static double current_time(void) { clock_t clks = clock(); return clks * 1.0 / CLOCKS_PER_SEC; } #endif // HAVE_CLOCK_GETTIME #endif //__WIN32__ /// Callback continuously called by fldigi modem class. int wefax::rx_process(const double *buf, int len) { if( len == 0 ) { return 0 ; } static const int avg_buf_size = 256 ; static int idx = 0 ; static double buf_tim[avg_buf_size]; static int buf_len[avg_buf_size]; int idx_mod = idx % avg_buf_size ; /// Here we estimate the average number of pixels per second. buf_tim[idx_mod] = current_time(); buf_len[idx_mod] = len ; ++idx ; /// Wait some seconds otherwise not significant. if( idx >= avg_buf_size ) { if( idx == avg_buf_size ) { LOG_INFO( _("Starting samples loss control avg_buf_size=%d"), avg_buf_size); } int idx_mod_first = idx % avg_buf_size ; double total_tim = buf_tim[idx_mod] - buf_tim[idx_mod_first]; int total_len = 0 ; for( int ix = 0 ; ix < avg_buf_size ; ++ix ) { total_len += buf_len[ix] ; } /// Estimate the real sample rate. double estim_smpl_rate = (double)total_len / total_tim ; /// If too far from what it should be, it means that pixels were lost. if( estim_smpl_rate < 0.95 * modem::samplerate ) { int expected_samples = (int)( modem::samplerate * total_tim + 0.5 ); int missing_samples = expected_samples - total_len ; LOG_INFO(_("Lost %d samples idx=%d estim_smpl_rate=%f total_tim=%f total_len=%d. Auto-center."), missing_samples, idx, estim_smpl_rate, total_tim, total_len ); REQ( wefax_pic::update_auto_center, true ); if( missing_samples <= 0 ) { /// This should practically never happen. LOG_WARN(_("Cannot compensate")); } else { /// Adjust the number of received pixels, /// so the lost frames are signaled once only. buf_len[idx_mod] += missing_samples ; } } } /// Back to normal processing. m_impl->rx_new_samples( buf, len ); return 0; } //===================================================================== // transmit processing //===================================================================== /// This is called by wefax-pix.cxx before entering transmission loop. void wefax::set_tx_parameters( int the_lpm, const unsigned char * xmtpic_buffer, bool is_color, int img_w, int img_h) { m_impl->tx_params_set( the_lpm, xmtpic_buffer, is_color, img_w, img_h ); } /// Callback continuously called by fldigi modem class. int wefax::tx_process() { bool tx_was_completed = m_impl->trx_do_next(); std::string status ; if( false == tx_was_completed ) { status = _("Transmission cancelled"); LOG_INFO("Sending cancelled" ); m_qso_rec.putField(NOTES, status.c_str() ); } qso_rec_save(); REQ_FLUSH(GET_THREAD_ID()); FL_LOCK_E(); wefax_pic::restart_tx_viewer(); transmit_lock_release(status); m_abortxmt = false; FL_UNLOCK_E(); m_impl->tx_apt_stop(); return -1; } void wefax::skip_apt(void) { m_impl->skip_apt_rx(); } /// auto_center indicates whether we try to find the margin of the image /// automatically. This is the fact when skipping to image reception /// is triggered manually or based on the signal power. void wefax::skip_phasing(bool auto_center) { m_impl->skip_phasing_rx(auto_center); } void wefax::end_reception(void) { m_impl->end_rx(); } // Continuous reception or APT control. void wefax::set_rx_manual_mode( bool manual_flag ) { m_impl->manual_mode_set( manual_flag ); wefax_pic::set_manual( manual_flag ); update_rx_label(); } void wefax::set_lpm( int the_lpm ) { return m_impl->lpm_set( the_lpm ); } /// Transmission time in seconds. Factor 3 if b/w image. int wefax::tx_time( int nb_bytes ) const { return (double)nb_bytes / modem::samplerate ; } /// This prints a message about the progress of image sending, /// then tells whether the user has requested the end. bool wefax::is_tx_finished( int ix_sample, int nb_sample, const char * msg ) const { static char wefaxmsg[256]; double fraction_done = nb_sample ? 100.0 * (double)ix_sample / nb_sample : 0.0 ; int tm_left = tx_time( nb_sample - ix_sample ); snprintf( wefaxmsg, sizeof(wefaxmsg), "%s : %04.1f%% done. Time left: %dm %ds", msg, fraction_done, tm_left / 60, tm_left % 60 ); put_status(wefaxmsg); bool is_finished = modem::stopflag || m_abortxmt ; if( is_finished ) { LOG_INFO("Transmit finished"); } return is_finished ; } /// This returns the names of the possible reception filters. const char ** wefax::rx_filters(void) { return fir_filter_pair_set::filters_list(); } /// Allows to choose the reception filter. void wefax::set_rx_filter( int idx_filter ) { m_impl->set_filter_rx( idx_filter ); } std::string wefax::suggested_filename(void) const { return m_impl->generate_filename( "gui" ); }; /// This creates a QSO record to be written to an adif file. void wefax::qso_rec_init(void) { /// This is always initialised because the flag progdefaults.WEFAX_AdifLog /// may be set in the middle of an image reception. /// Ideally we should find out the name of the fax station. m_qso_rec.putField(CALL, "Wefax"); m_qso_rec.putField(NAME, "Weather fax"); m_qso_rec.putField( TX_PWR, "0"); m_qso_rec.setDateTime(true); m_qso_rec.setFrequency( wf->rfcarrier() + m_impl->carrier() ); m_qso_rec.putField(MODE, mode_info[get_mode()].adif_name ); // m_qso_rec.putField(QTH, inpQth_log->value()); // m_qso_rec.putField(STATE, inpState_log->value()); // m_qso_rec.putField(VE_PROV, inpVE_Prov_log->value()); // m_qso_rec.putField(COUNTRY, inpCountry_log->value()); // m_qso_rec.putField(GRIDSQUARE, inpLoc_log->value()); // m_qso_rec.putField(QSLRDATE, inpQSLrcvddate_log->value()); // m_qso_rec.putField(QSLSDATE, inpQSLsentdate_log->value()); // m_qso_rec.putField(RST_RCVD, inpRstR_log->value ()); // m_qso_rec.putField(RST_SENT, inpRstS_log->value ()); // m_qso_rec.putField(SRX, inpSerNoIn_log->value()); // m_qso_rec.putField(STX, inpSerNoOut_log->value()); // m_qso_rec.putField(XCHG1, inpXchgIn_log->value()); // m_qso_rec.putField(MYXCHG, inpMyXchg_log->value()); // m_qso_rec.putField(IOTA, inpIOTA_log->value()); // m_qso_rec.putField(DXCC, inpDXCC_log->value()); // m_qso_rec.putField(CONT, inpCONT_log->value()); // m_qso_rec.putField(CQZ, inpCQZ_log->value()); // m_qso_rec.putField(ITUZ, inpITUZ_log->value()); } /// Called once a QSO rec has been filled with information. Saved to adif file. void wefax::qso_rec_save(void) { if( progdefaults.WEFAX_AdifLog == false ) { return ; } m_qso_rec.setDateTime(false); qsodb.qsoNewRec (&m_qso_rec); qsodb.isdirty(0); loadBrowser(true); adifFile.writeLog (logbook_filename.c_str(), &qsodb); // dxcc_entity_cache_add(&rec); LOG_INFO( _("Updating log book %s"), logbook_filename.c_str() ); } /// Called when changing the carrier in the GUI, and by class modem with 1000Hz, when initializing. void wefax::set_freq(double freq) { modem::set_freq(freq); /// This must recompute the increments of the trigonometric tables. m_impl->set_carrier( freq ); } // String telling the tx and rx internal state. std::string wefax::state_string(void) const { return m_impl->state_string(); } /// Called when a file is saved, so XML-RPC calls can get the filename. void wefax::put_received_file( const std::string &filnam ) { m_impl->put_received_file( filnam ); } /// Returns a received file name, by chronological order. std::string wefax::get_received_file( int max_seconds ) { return m_impl->get_received_file( max_seconds ); } std::string wefax::send_file( const std::string & filnam, double max_seconds ) { return m_impl->send_file( filnam, max_seconds ); } /// Transmitting files is done in exclusive mode. bool wefax::transmit_lock_acquire(const std::string & filnam, double max_seconds ) { return m_impl->transmit_lock_acquire( filnam, max_seconds ); } /// Called after a file is sent. void wefax::transmit_lock_release( const std::string & err_msg ) { m_impl->transmit_lock_release( err_msg ); } fldigi-3.21.80/src/include/0000775000175000017500000000000012313333727012344 500000000000000fldigi-3.21.80/src/include/record_browse.h0000664000175000017500000000106212313150713015263 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0302 #ifndef record_browse_h #define record_browse_h #include #include "record_loader_gui.h" #include #include #include extern Fl_Group *tabDataFiles; #include extern Fl_Input_Choice *inpDataSources; #include extern Fl_Light_Button *btnDataSourceUpdate; #include extern Fl_Button *btnDataSourceReset; Fl_Double_Window* make_record_loader_window(); #endif fldigi-3.21.80/src/include/fontdef.h0000664000175000017500000000321412313064025014052 00000000000000// ------------------------------------------------------------------------------ // // fontdef.h -- FELDHELL modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _FONTDEF_H #define _FONTDEF_H struct fntchr { char c; int byte[14]; }; extern fntchr feld7x7_14[]; extern fntchr feld7x7n_14[]; extern fntchr feldDx_14[]; extern fntchr feldfat_14[]; extern fntchr feldhell_12[]; extern fntchr feldlittle_12[]; extern fntchr feldlo8_14[]; extern fntchr feldlow_14[]; extern fntchr feldmodern_14[]; extern fntchr feldmodern8_14[]; extern fntchr feldnarr_14[]; extern fntchr feldreal_14[]; extern fntchr feldstyl_14[]; extern fntchr feldvert_14[]; extern fntchr feldwide_14[]; extern char szFeldFonts[]; #endif fldigi-3.21.80/src/include/psk.h0000664000175000017500000001041312313064025013221 00000000000000// ---------------------------------------------------------------------------- // psk.h -- psk modem // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _PSK_H #define _PSK_H #include "complex.h" #include "modem.h" #include "globals.h" #include "viterbi.h" #include "filters.h" #include "pskcoeff.h" #include "pskvaricode.h" #include "viewpsk.h" #include "pskeval.h" #include "interleave.h" //MFSK varicode instead of psk for PSKR modes #include "mfskvaricode.h" //===================================================================== #define PskSampleRate (8000) #define PipeLen (64) #define SNTHRESHOLD 6.0 #define AFCDECAYSLOW 8 #define NUM_FILTERS 3 #define GOERTZEL 288 //96 x 2 must be an integer value #define MAX_CARRIERS 32 //===================================================================== class psk : public modem { private: // tx & rx int symbollen; bool _qpsk; bool _pskr; double phaseacc[MAX_CARRIERS]; cmplx prevsymbol[MAX_CARRIERS]; unsigned int shreg; //FEC: 2nd stream unsigned int shreg2; int numinterleavers; //interleaver size (speed dependant) double inter_carrier; // Frequency gap betweeb carriers // rx variables & functions C_FIR_filter *fir1[MAX_CARRIERS]; C_FIR_filter *fir2[MAX_CARRIERS]; // C_FIR_filter *fir3; double *fir1c; double *fir2c; Cmovavg *snfilt; Cmovavg *imdfilt; double I1[NUM_FILTERS]; double I2[NUM_FILTERS]; double Q1[NUM_FILTERS]; double Q2[NUM_FILTERS]; double COEF[NUM_FILTERS]; double m_Energy[NUM_FILTERS]; int m_NCount; bool imdValid; encoder *enc; viterbi *dec; //PSKR modes - 2nd Viterbi decoder and 2 receive de-interleaver for comparison viterbi *dec2; interleave *Rxinlv; interleave *Rxinlv2; interleave *Txinlv; unsigned int bitshreg; int rxbitstate; //PSKR modes - Soft decoding unsigned char symbolpair[2]; double fecmet; double fecmet2; double phase; double freqerr; int bits; double bitclk; double syncbuf[16]; double scope_pipe[2*PipeLen];//[PipeLen]; unsigned int pipeptr; unsigned int dcdshreg; //PSKR modes - 2nd stream unsigned int dcdshreg2; int dcd; int dcdbits; cmplx quality; int acquire; viewpsk* pskviewer; pskeval* evalpsk; void rx_symbol(cmplx symbol, int car); void rx_bit(int bit); void rx_bit2(int bit); void rx_qpsk(int bits); void rx_pskr(unsigned char symbol); double scopedata[16]; // IMD & s/n variables double k0, k1, k2; double I11, I12, I21, I22, I31, I32; double snratio, s2n, imdratio, imd; double E1, E2, E3; double afcmetric; //PSKR modes bool firstbit; bool startpreamble; //MULTI-CARRIER double sc_bw; // single carrier bandwidth // cmplx thirdorder; // tx variables & functions int txsymbols[MAX_CARRIERS]; double *tx_shape; int preamble; void tx_carriers(); void tx_symbol(int sym); void tx_bit(int bit); void tx_char(unsigned char c); void tx_flush(); void update_syncscope(); void signalquality(); void findsignal(); void phaseafc(); void afc(); void coreafc(); void initSN_IMD(); void resetSN_IMD(); void calcSN_IMD(cmplx z); //PSKR modes - for Tx interleaver priming void clearbits(); protected: void s2nreport(void); public: psk(trx_mode mode); ~psk(); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart(); int rx_process(const double *buf, int len); int tx_process(); void searchDown(); void searchUp(); }; #endif fldigi-3.21.80/src/include/outputencoder.h0000664000175000017500000000267012313064025015332 00000000000000// ---------------------------------------------------------------------------- // outputencoder.h -- output charset conversion // // Copyright (C) 2012 // Andrej Lajovic, S57LN // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef OUTPUTENCODER_H #define OUTPUTENCODER_H #include #include class OutputEncoder { public: OutputEncoder(const int charset_out = TINICONV_CHARSET_UTF_8, unsigned int buffer_size = 32); ~OutputEncoder(void); void set_output_encoding(const int charset_out); void push(std::string s); const unsigned int pop(void); private: unsigned int buffer_size; unsigned char *buffer; unsigned char *encoding_ptr; unsigned char *pop_ptr; unsigned int data_length; tiniconv_ctx_s ctx; }; #endif fldigi-3.21.80/src/include/filters.h0000664000175000017500000001043412313064025014077 00000000000000// ---------------------------------------------------------------------------- // // filters.h -- Several Digital Filter classes used in fldigi // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. These filters are based on the // gmfsk design and the design notes given in // "Digital Signal Processing", A Practical Guid for Engineers and Scientists // by Steven W. Smith. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _FILTER_H #define _FILTER_H #include "complex.h" //===================================================================== // FIR filters //===================================================================== class C_FIR_filter { #define FIRBufferLen 4096 private: int length; int decimateratio; double *ifilter; double *qfilter; double ffreq; double ibuffer[FIRBufferLen]; double qbuffer[FIRBufferLen]; int pointer; int counter; cmplx fu; inline double sinc(double x) { if (fabs(x) < 1e-10) return 1.0; else return sin(M_PI * x) / (M_PI * x); } inline double cosc(double x) { if (fabs(x) < 1e-10) return 0.0; else return (1.0 - cos(M_PI * x)) / (M_PI * x); } inline double hamming(double x) { return 0.54 - 0.46 * cos(2 * M_PI * x); } inline double mac(const double *a, const double *b, unsigned int size) { double sum = 0.0; double sum2 = 0.0; double sum3 = 0.0; double sum4 = 0.0; // Reduces read-after-write dependencies : Each subsum does not wait for the others. // The CPU can therefore schedule each line independently. for (; size > 3; size -= 4, a += 4, b+=4) { sum += a[0] * b[0]; sum2 += a[1] * b[1]; sum3 += a[2] * b[2]; sum4 += a[3] * b[3]; } for (; size; --size) sum += (*a++) * (*b++); return sum + sum2 + sum3 + sum4 ; } protected: public: C_FIR_filter (); ~C_FIR_filter (); void init (int len, int dec, double *ifil, double *qfil); void init_lowpass (int len, int dec, double freq ); void init_bandpass (int len, int dec, double freq1, double freq2); void init_hilbert (int len, int dec); double *bp_FIR(int len, int hilbert, double f1, double f2); void dump(); int run (const cmplx &in, cmplx &out); int Irun (const double &in, double &out); int Qrun (const double &in, double &out); }; //===================================================================== // Moving average filter //===================================================================== class Cmovavg { #define MAXMOVAVG 2048 private: double *in; double out; int len, pint; bool empty; public: Cmovavg(int filtlen); ~Cmovavg(); double run(double a); void setLength(int filtlen); void reset(); }; //===================================================================== // Sliding FFT //===================================================================== class sfft { #define K1 0.99999999999L private: int fftlen; int first; int last; int ptr; struct vrot_bins_pair ; vrot_bins_pair * __restrict__ vrot_bins ; cmplx * __restrict__ delay; double k2; public: sfft(int len, int first, int last); ~sfft(); void run(const cmplx& input, cmplx * __restrict__ result, int stride ); }; //============================================================================= // Goertzel DFT //============================================================================= class goertzel { private: int N; int count; double Q0; double Q1; double Q2; double k1; double k2; double k3; bool isvalid; public: goertzel(int n, double freq, double sr); ~goertzel(); void reset(); void reset(int n, double freq, double sr); bool run(double v); double real(); double imag(); double mag(); }; #endif /* _FILTER_H */ fldigi-3.21.80/src/include/misc.h0000664000175000017500000000610112313064025013356 00000000000000// ---------------------------------------------------------------------------- // misc.h -- Miscellaneous helper functions // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. These filters were adapted from code contained // in the gmfsk source code distribution. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _MISC_H #define _MISC_H #include extern unsigned long hweight32(unsigned long w); extern unsigned short int hweight16(unsigned short int w); extern unsigned char hweight8(unsigned char w); extern int parity(unsigned long w); extern unsigned long rbits32(unsigned long w); extern unsigned short int rbits16(unsigned short int w); extern unsigned char rbits8(unsigned char w); extern unsigned int log2u(unsigned int x); extern unsigned char graydecode(unsigned char data); extern unsigned char grayencode(unsigned char data); extern void MilliSleep(long msecs); inline double sinc(double x) { return (fabs(x) < 1e-10) ? 1.0 : (sin(M_PI * x) / (M_PI * x)); } inline double cosc(double x) { return (fabs(x) < 1e-10) ? 0.0 : ((1.0 - cos(M_PI * x)) / (M_PI * x)); } inline double clamp(double x, double min, double max) { return (x < min) ? min : ((x > max) ? max : x); } /// This is always called with an int weight inline double decayavg(double average, double input, int weight) { if (weight <= 1) return input; return ( ( input - average ) / (double)weight ) + average ; } // following are defined inline to provide best performance inline double blackman(double x) { return (0.42 - 0.50 * cos(2 * M_PI * x) + 0.08 * cos(4 * M_PI * x)); } inline double hamming(double x) { return 0.54 - 0.46 * cos(2 * M_PI * x); } inline double hanning(double x) { return 0.5 - 0.5 * cos(2 * M_PI * x); } inline double rcos( double t, double T, double alpha=1.0 ) { if( t == 0 ) return 1.0; double taT = T / (2.0 * alpha); if( fabs(t) == taT ) return ((alpha/2.0) * sin(M_PI/(2.0*alpha))); return (sin(M_PI*t/T)/(M_PI*t/T))*cos(alpha*M_PI*t/T)/(1.0-(t/taT)*(t/taT)); } // Rectangular - no pre filtering of data array void RectWindow(double *array, int n); // Hamming - used by gmfsk void HammingWindow(double *array, int n); // Hanning - used by winpsk void HanningWindow(double *array, int n); // Best lob suppression - least in band ripple void BlackmanWindow(double *array, int n); // Simple about effective as Hamming or Hanning void TriangularWindow(double *array, int n); #endif fldigi-3.21.80/src/include/FreqControl.h0000664000175000017500000000555312313064025014673 00000000000000// ---------------------------------------------------------------------------- // Frequency Control Widget for the Fast Light Tool Kit (Fltk) // // Copyright 2005-2006, Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- // Usage: // Create a multi-digit receiver / transceiver frequency control widget // // label used to pass # digits & decimal position to control // the widget can be used in Fluid & initialized with the // number of digits as the label string // default is 7; min number is 1, max number is 9 as in // // cFreqControl myFreqConrol(x0, y0, w0, h0, "N"); where N is # digits // cFreqControl *pMyFreqControl = new cFreqControl(x0,y0,w0,h0,"N"); #ifndef _FREQCONTROL_H_ #define _FREQCONTROL_H_ #include #include #include #include #include #ifdef MAX_DIGITS #undef MAX_DIGITS #endif #define MAX_DIGITS 9 class Fl_Box; class Fl_Float_Input; class cFreqControl : public Fl_Group { friend void cbSelectDigit (Fl_Widget *btn, void * nbr); public: cFreqControl(int x, int y, int w, int h, const char *lbl = "7"); ~cFreqControl(); void updatevalue(); void value(long lv); long value(){return val;}; void font(Fl_Font n); void SetONCOLOR (uchar r, uchar g, uchar b); void SetOFFCOLOR (uchar r, uchar g, uchar b); void GetONCOLOR (uchar &r, uchar &g, uchar &b) { Fl::get_color(ONCOLOR, r, g, b); }; void GetOFFCOLOR (uchar &r, uchar &g, uchar &b) { Fl::get_color(OFFCOLOR, r, g, b); }; void SetONOFFCOLOR( Fl_Color, Fl_Color); // void setCallBack (int (*cbf)(Fl_Widget *, void *) ){ cbFunc = cbf;}; // void do_callback() { if (cbFunc) cbFunc(this, NULL); } int handle(int event); private: Fl_Repeat_Button *Digit[MAX_DIGITS]; Fl_Float_Input *finp; static const char *Label[]; int mult[MAX_DIGITS]; Fl_Box *decbx; Fl_Font font_number; Fl_Color OFFCOLOR; Fl_Color ONCOLOR; Fl_Color SELCOLOR; Fl_Color ILLUMCOLOR; int nD; int active; long maxVal; long minVal; void DecFreq(int n); void IncFreq(int n); int (*cbFunc)(); static void freq_input_cb(Fl_Widget* input, void* arg); void cancel_kb_entry(void); protected: long val, oldval; }; #endif fldigi-3.21.80/src/include/coordinate.h0000664000175000017500000000530112313064025014553 00000000000000// ---------------------------------------------------------------------------- // coordinate.h -- Handling of longitude and latitude. // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _COORDINATE_H #define _COORDINATE_H #include // Models a longitude or latitude. class CoordinateT { // Precision is: 360 * 3600 = 1296000, 21 bits. A float might be enough. double m_angle ; // In decimal degrees, between -180.0 and 180.0. bool m_is_lon ; // Longitude or latitude. // TODO: Consider adding a big offset to m_angle, instead of an extra flag. void Check(void) const ; void Init( char direction, double degrees ); public: CoordinateT(bool ll=true) : m_angle(0.0), m_is_lon(ll) {}; CoordinateT( double degrees, bool is_lon ); CoordinateT( char direction, double degrees ); CoordinateT( char direction, int degree, int minute, int second ); double angle(void) const { return m_angle ; } bool is_lon(void) const { return m_is_lon; } // Specific for reading from the file of navtex or wmo stations. // Navtex: "57 06 N" // Wmo : "69-36N", "013-27E", "009-25E" friend std::istream & operator>>( std::istream & istrm, CoordinateT & ref ); friend std::ostream & operator<<( std::ostream & ostrm, const CoordinateT & ref ); class Pair ; }; // CoordinateT // Longitude , latitude. class CoordinateT::Pair { CoordinateT m_lon, m_lat ; public: Pair() {} Pair( const CoordinateT & coo1, const CoordinateT & coo2 ); Pair( double lon, double lat ); Pair( const std::string & locator ); CoordinateT longitude() const { return m_lon ; } CoordinateT latitude() const { return m_lat ; } CoordinateT & longitude() { return m_lon ; } CoordinateT & latitude() { return m_lat ; } double distance( const Pair & a ) const; std::string locator() const ; friend std::istream & operator>>( std::istream & istrm, Pair & ref ); friend std::ostream & operator<<( std::ostream & ostrm, const Pair & ref ); }; // CoordinateT::Pair #endif // _COORDINATE_H fldigi-3.21.80/src/include/notify.h0000664000175000017500000000227012313064025013736 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef NOTIFY_H_ #define NOTIFY_H_ #include "globals.h" void notify_start(void); void notify_stop(void); void notify_show(void); void notify_dxcc_show(bool readonly = true); void notify_change_callsign(void); void notify_rsid(trx_mode mode, int afreq); void notify_create_rsid_event(bool val); #endif // NOTIFY_H_ fldigi-3.21.80/src/include/xmlreader.h0000664000175000017500000000300112313064025014402 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "irrXML.h" using namespace irr; using namespace io; class IIrrXMLStringReader: public IFileReadCallBack { const char *s; int len; int p; public: IIrrXMLStringReader(const char *szStr) { s = szStr; len = strlen(s); p=0; } IIrrXMLStringReader(const std::string &str) { s=str.c_str(); len = strlen(s); p=0; } int read(void * buffer, int sizeToRead) { char *sss = (char *)buffer; if (p >= len) return 0; int j = 0; for (int i = p; i < len && j < sizeToRead; ) { sss[j++] = s[i++]; } return 1; } int getSize() { return len-p; } }; fldigi-3.21.80/src/include/log.h0000664000175000017500000000236612313064025013215 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _LOG_H #define _LOG_H #include #include class cLogfile { public: enum log_t { LOG_RX, LOG_TX, LOG_START, LOG_STOP }; private: FILE* logfile; bool retflag; log_t logtype; public: cLogfile(const std::string& fname); ~cLogfile(); void log_to_file(log_t type, const std::string& s); void log_to_file_start(); void log_to_file_stop(); }; #endif fldigi-3.21.80/src/include/fldigi-config.h0000664000175000017500000000570712313147652015147 00000000000000// ---------------------------------------------------------------------------- // fldigi-config.h -- user configuration items for fldigi // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef FLDIGI_CONFIG_H #define FLDIGI_CONFIG_H //============================================================================= // You can change the x1 width of the waterfall / spectrum display by modifying this // constant. // Suggest that you make the value a multiple of 100. // DO NOT EXCEED 4000 // The larger the number the greater the cpu load will be for creating the // waterfall display // // Setting the DEFAULT_IMAGE_WIDTH to 3200 will size the x1 waterfall to be // 800 pixels wide. The x1 waterfall size is always DEFAULT_IMAGE_WIDTH / 4 // and the minimum width of main display would then be // // DEFAULT_IMAGE_WIDTH / 4 + 2 * BEZEL + 2 * DEFAULT_SW // // where BEZEL is set to 2 (border around the waterfall), and // DEFAULT_SW is the width of the signal level and squelch controls #define DEFAULT_IMAGE_WIDTH 3000 //============================================================================= // widget sizes internal to the waterfall widget #define BEZEL 2 #define WFTEXT 10 #define WFSCALE 10 #define WFMARKER 6 #define BTN_HEIGHT 20 #define DEFAULT_SW 16 //#define DEFAULT_HWFALL 144 #define DEFAULT_HWFALL 124 #define DEFAULT_HNOM 500 #define WMIN 645 #define HMIN 450 //#define Wwfall (DEFAULT_HNOM + 2 * BEZEL) #define DEFAULT_WNOM (Wwfall + 2* DEFAULT_SW) //#define EMC_HWFALL 144 //#define EMC_HNOM 500 //#define EMC_WNOM (500 + 2 * DEFAULT_SW + 2 * BEZEL) extern int IMAGE_WIDTH; extern int Hwfall; extern int HNOM; extern int WNOM; extern int Wwfall; extern int Haqsoframe; extern int Hmenu; extern int Hstatus; extern int Hmacros; //#define Htext (DEFAULT_HNOM - 4 - Hwfall - Hmenu - Hstatus - Hmacros - Hqsoframe) //#define Hrcvtxt (Htext) / 2 //#define Hxmttxt (Htext - (Hrcvtxt)) #define Wmode 80 #define Ws2n 120 #define Wimd 120 #define Wwarn 16 #define bwTxLevel 120 #define bwAfcOnOff (Hwfall -22)/2 #define bwSqlOnOff (Hwfall -22)/2 #define Wstatus (WNOM - Wmode - Ws2n - Wimd - bwAfcOnOff - bwSqlOnOff - Wwarn) #define SCOPEWIN_MIN_WIDTH 48 #define SCOPEWIN_MIN_HEIGHT 48 #endif // FLDIGI_CONFIG_H fldigi-3.21.80/src/include/morse.h0000664000175000017500000000342112313064025013552 00000000000000/* * morse.h -- morse code tables * * Copyright (C) 2004 * Lawrence Glaister (ve7it@shaw.ca) * Tomi Manninen (oh2bns@sral.fi) * * This modem borrowed heavily from other gmfsk modems and * also from the unix-cw project. I would like to thank those * authors for enriching my coding experience by providing * and supporting open source. * * This file is part of fldigi. * * Fldigi 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. * * Fldigi 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 fldigi. If not, see . * */ #ifndef _MORSE_H #define _MORSE_H #define MorseTableSize 256 #define CW_DOT_REPRESENTATION '.' #define CW_DASH_REPRESENTATION '-' struct CW_TABLE { char chr; /* The character(s) represented */ const char *prt; /* The printable representation of the character */ const char *rpr; /* Dot-dash shape of the character */ }; struct CW_XMT_TABLE { unsigned long code; const char *prt; }; class cMorse { private: CW_TABLE *cw_rx_lookup[256]; CW_XMT_TABLE cw_tx_lookup[256]; unsigned int tokenize_representation(const char *representation); public: cMorse() { init(); } ~cMorse() { } void init(); const char *rx_lookup(char *r); unsigned long tx_lookup(int c); const char *tx_print(int c); }; #endif fldigi-3.21.80/src/include/contestia.h0000664000175000017500000000361712313064025014425 00000000000000// ---------------------------------------------------------------------------- // contestia.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _CONTESTIA_H #define _CONTESTIA_H #include "modem.h" #include "jalocha/pj_mfsk.h" #include "sound.h" #define TONE_DURATION (SCBLOCKSIZE * 16) #define SR4 ((TONE_DURATION) / 4) class contestia : public modem { private: MFSK_Transmitter < double >*Tx; MFSK_Receiver < double >*Rx; double *txfbuffer; int txbufferlen; double phaseacc; cmplx prevsymbol; int preamble; unsigned int shreg; double np; double sp; double sigpwr; double noisepwr; int escape; int smargin; int sinteg; int tones; int bw; double tone_bw; int preamblesent; int postamblesent; double preamblephase; double txbasefreq; double tone_midfreq; double lastfreq; double ampshape[SR4]; double tonebuff[TONE_DURATION]; double nco(double freq); void send_tones(); public: contestia(); ~contestia(); void init(); void rx_init(); void rx_flush(); void tx_init(SoundBase *sc); void restart(); int rx_process(const double *buf, int len); int tx_process(); int unescape(int c); }; #endif fldigi-3.21.80/src/include/mt63base.h0000664000175000017500000003152012313064025014052 00000000000000/* * mt63base.h -- MT63 transmitter and receiver in C++ for LINUX * * Copyright (c) 2007, 2008 Dave Freese, W1HKJ * * base class for use by fldigi * modified from original * excluded CW_ID which is a part of the base modem class for fldigi * * based on mt63 code by Pawel Jalocha * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * Copyright (c) 2007-2011 Dave Freese, W1HKJ * * This file is part of fldigi. * * Fldigi 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. * * Fldigi 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 fldigi. If not, see . * */ #ifndef MT63BASE_H #define MT63BASE_H // ========================================================================== // Character encoder and block interleaver for the MT63 modem /* How to use this class: 1. Create or declare an object like: MT63encoder Encoder; 2. Preset the object for the given number of carriers and interleave: err=Encoder.Preset(,,); MT63 uses 64 carriers and interleave of 32 or 64 - the corresponding interleave patterns can be found in mt63.dat. If Encode.Preset() returns non-zero you are in big troubles ! 3. For each character to be encode you make the call: Encoder.Process(); and you should then take the bits from the Encode.Output - these are the bits to be sent out on the carriers. (for MT63 logical 0 means carrier flip, logical 1 is no flip). 4. At any time you can call Encoder.Preset() again to change the parameters (this will clean away the interleaver pipe). */ // MT63 modem specific routines, made to be compatible with the MT63ASC.ASM // (c) 1999 Pawel Jalocha, SP9VRC, jalocha@hpdel1.ifj.edu.pl // Date: 05-NOV-1999 class MT63encoder { public: MT63encoder(); ~MT63encoder(); void Free(); int Preset(int Carriers, int Intlv, int *Pattern, int RandFill=0); int Process(char code); char *Output; private: int DataCarriers; char CodeMask; int IntlvLen; int IntlvSize; int *IntlvPatt; char *IntlvPipe; int IntlvPtr; double *WalshBuff; } ; // ========================================================================== // MT63 deinterleaver and decoder /* How to use this class: 1. Create or declare an object: MT63decoder Decoder; 2. Preset given parameters with Decoder.Preset(); Decoder.Preset(); Number of carriers and interleave are same as for MT63encoder. "Margin" is the number of extra carriers demodulated on the side because with the MT63 you cannot say with full confidence which is really the first carrier: the FEC decoder have to tell you this. "Integ" is the integration period to find the best FEC match. "Integ" is measured in MT63 symbols (at 1000 kHz we do 10 symbols/s). 3. For each symbol period feed the demodulated data into the object: Decoder.Process(); and then get the demodulated character code from Decoder.Output You can get as well the measured signal-to-noise ratio from Decoder.SNR and the index of the first carrier (according to the FEC match) from Decoder.CarrOfs 4. You can change the parameters at any time with Decoder.Preset() (this will clean the data pipes). */ class MT63decoder { public: MT63decoder(); ~MT63decoder(); void Free(); int Preset(int Carriers, int Intlv, int *Pattern, int Margin, int Integ); int Process(double *Data); char Output; double SignalToNoise; int CarrOfs; private: int DataCarriers; double *IntlvPipe; int IntlvLen; int IntlvSize; int IntlvPtr; int *IntlvPatt; double *WalshBuff; int ScanLen; int ScanSize; double *DecodeSnrMid,*DecodeSnrOut; double W1, W2, W5; char *DecodePipe; int DecodeLen; int DecodeSize; int DecodePtr; } ; // ========================================================================== // MT63 transmitter /* How to use this class: 1. Create or declare an object: MT63tx Tx; 2. Preset parameters: Tx.Preset(,); Allowed values are: bandwidth=500,1000,2000; interleave=0,1; Non-zero value returned means there was a problem... 3. For each character to be sent: Tx.SendChar(); After each call to SendChar() you must read the samples from the Tx.Comb.Output.Data, the number of samples to read is in Tx.Comb.Output.Len. They are in double floating point, so you should convert them to 16-bit integers and output them to your soundcard. 4. If you have nothing to transmit, you must not stop, because you have to keep the sound going. MT63 transmits NL characters (code=0) in this case. 5. When you are done with all the characters and you want to stop, you should still put some NL characters in to flush the interleave thus please call the Tx.SendChar() Tx.DataInterleave times (still add few more characters to flush the windowed IFFT buffers). After that the MT63 transmits a jamming dspSequence for some time to speed up carrier drop at the receiver: you do this by calling Tx.SendJam(); 6. You can transmit few symbols of silence by: Tx.SendSilence() to make a gracefull switch-off. Remember: each time you call SendChar(), SendJam() or SendSilence() you must send the contains of Tx.Comb.Output out to your soundcard. Each Tx.SendXxx() produces the amount of sound corresponding to one symbol time that is 0.1 second for the 1000 Hz mode. The soundcard output rate must be 8000 Hz, rather precisely, that is the error should be below 1 Hz. If it is not you should use the rate converter: look into mt63tx for an example. 7. Inbetween transmissions you may change the settings by calling the Tx.Preset() again. */ class MT63tx { public: MT63tx(); ~MT63tx(); void Free(void); int Preset(double freq, int BandWidth=1000, int LongInterleave=0); int SendTune(bool twotones); int SendChar(char ch); int SendJam(void); int SendSilence(void); private: int DataCarriers; // the number of data carriers int FirstDataCarr; // the FFT index of the first data carrier int WindowLen; // FFT window and symbol shape length double *TxWindow; // The shape of the FFT window (=symbol shape) int AliasFilterLen; // anti-alias filter length double *AliasShapeI, *AliasShapeQ; // and shapes (for fixed lower freq of 500 Hz) int DecimateRatio; // decimation/interpolation after/before filter int *InterleavePattern; // how the bits of one block are placed on data carriers double TxAmpl; // Amplitude applied to generate a carrier (before IFFT) long CarrMarkCode; int CarrMarkAmpl; MT63encoder Encoder; // data encode and interleaver int *TxVect; // modulator vector (dspPhases) int *dspPhaseCorr; // dspPhase corrections for each carrier dspCmpx_buff WindowBuff; // FFT/window buffer dsp_r2FFT FFT; // FFT engine dspCmpxMixer txmixer; dspCmpxOverlapWindow Window; // overlapping window int ProcessTxVect(); public: int DataInterleave; dspQuadrComb Comb; // the output of this module is in Comb.Output } ; // ========================================================================== // MT63 receiver /* How to use this class: 1. Declare the object: MT63rx Rx; 2. Preset paramateres Rx.Preset(,,); For weak signals I recommend integration of 32 or more, otherwise 16 is enough. By the way, 16 means 1.6 second for 1000 Hz mode because then we transmit 10 symbols per second. 3. After EACH new batch of samples you should look into Rx.Output for the decoded characters. You can egzamin the receiver status at any time by calling: Rx.SYNC_LockStatus() => logical value 0 or 1 Rx.SYNC_Confidence() => lock confidence: a double between 0.0 and 1.0 Rx.FEC_SNR() => signal-to-noise seen by FEC Rx.TotalFreqOffset() => measured frequency offset in [Hz] assuming 8000 Hz sAmpling */ class MT63rx { public: MT63rx(); ~MT63rx(); void Free(void); int Preset( double freq, int BandWidth = 1000, int LongInterleave = 0, int Integ = 16, void (*Display)(double *Spectra, int Len) = NULL); int Process(double_buff *Input); char_buff Output; // decoded characters int SYNC_LockStatus(void); // 1 => locked, 0 => not locked double SYNC_Confidence(void); // lock confidence <0..1> double SYNC_FreqOffset(void); double SYNC_FreqDevdspRMS(void); double SYNC_TimeOffset(void); double TotalFreqOffset(); // Total frequency offset in [Hz] double FEC_SNR(void); // signal-to-noise ratio at the FEC int FEC_CarrOffset(void); private: dspQuadrSplit InpSplit; // input filter, I/Q splitter, decimator dspCmpxMixer TestOfs; // frequency offset for tests dspDelayLine ProcLine; // processing pipe int ProcdspDelay; // processing dspDelay for optimal symbol probing int SyncProcPtr; // sAmpling pointer for the synchronizer int DataProcPtr; // sAmpling pointer for the data demodulator dsp_r2FFT FFT; // FFT engine int WindowLen; // FFT window length = symbol shape length int WindowLenMask; // WindowLen-1 for pointer wrapping double *RxWindow; // FFT window shape = symbol shape void (*SpectraDisplay)(double *Spectra, int Len); double *SpectradspPower; int AliasFilterLen; // anti-alias filter length double *AliasShapeI, *AliasShapeQ; // and shapes int DecimateRatio; // decimation/interpolation after/before filter // how the bits of one block are placed on data carriers int *InterleavePattern; int DataInterleave; // data interleave depth int DataCarriers; // number of carriers int FirstDataCarr; // the FFT index of the first data carrier // int DataCarrSepar; // freq. separation between carriers [FFT bins] long CarrMarkCode; // code to mark carriers (not in use here) // int SymbolSepar; // time separation between symbols [samples] int ScanMargin; // How many carriers up and down to search int IntegLen; // Over how many symbols we integrate to synchronize int SymbolDiv; // =4 we probe the input 4 times per symbol time int SyncStep; // SymbolSepar/SymbolDiv int ScanFirst; // first carrier to scan int ScanLen; // number of carriers to scan dspCmpx *FFTbuff; dspCmpx *FFTbuff2; // here starts the time/frequency synchronizer void SyncProcess(dspCmpx *Slice); dspCmpx *SyncPipe[4]; // FFT result buffer for sync. int SyncPtr; // wrapping pointer for SyncPipe and integrators int SymbPtr; // points about where the symbol is dspCmpx *SyncPhCorr; // dspPhase corrections for the sync. processor dspCmpx *CorrelMid[4], *CorrelOut[4]; // correlation integrator double *dspPowerMid, *dspPowerOut; // carrier dspPower integrator dspCmpx *CorrelNorm[4]; // normalized correlation double W1, W2, W5; // correlation integrator weights double W1p, W2p, W5p; // dspPower integrator weights dspCmpx *CorrelAver[4]; // sliding sum to fit the carrier pattern int FitLen; void DoCorrelSum(dspCmpx *Correl1, dspCmpx *Correl2, dspCmpx *Aver); dspCmpx *SymbFit; // vectors to match symbol shift and confidence int SymbFitPos; // "smoothed" peak position double *FreqPipe; // smoothing pipe for frequency offset dspCmpx *SymbPipe; // smoothing pipe for symbol shift int TrackPipeLen; // tracking pipe length int TrackPipePtr; // pipe pointer double AverFreq; // dspAveraged frequency dspCmpx AverSymb; // dspAveraged symbol dspPhase double SyncLockThres; // lock confidence threshold double SyncHoldThres; // minimal confidence to hold the lock int SyncLocked; // locked or not locked double SyncSymbConf; // current smoothed confidence double SyncFreqOfs; // current smoothed frequency offset double SyncFreqDev; // frequency deviation (dspRMS) double SyncSymbShift; // current smoothed symbol time shift // here starts the data decoder void DataProcess( dspCmpx *EvenSlice, dspCmpx *OddSlice, double FreqOfs, int TimeDist); int DataScanMargin; // +/- data carriers to scan for best FEC match int DataScanLen; // total number of data carriers being processed int DataScanFirst; dspCmpx *RefDataSlice; // reference data slice for differential dspPhase decode dspCmpx *DataVect; // differentially decoded data vactor int DataPipeLen; // pipe length int DataPipePtr; // wrapping pointer dspCmpx **DataPipe; // decoded vectors pipe double *DataPwrMid, *DataPwrOut; // carrier dspPower integrator dspCmpx *DataSqrMid, *DataSqrOut; // carrier complex square integrator double dW1, dW2, dW5; // integrator constants double *DatadspPhase; // differential decoded dspPhases double *DatadspPhase2; // rather for debugging, not use otherwise MT63decoder Decoder; } ; #endif // MT63_BASE_H fldigi-3.21.80/src/include/Fl_Text_Editor_mod.H0000664000175000017500000001304212313064025016077 00000000000000// // "$Id: Fl_Text_Editor_mod.H 7903 2010-11-28 21:06:39Z matt $" // // Header file for Fl_Text_Editor_mod class. // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA. // // Please report all bugs and problems on the following page: // // http://www.fltk.org/str.php // /* \file Fl_Text_Editor_mod widget . */ #ifndef Fl_Text_Editor_mod_H #define Fl_Text_Editor_mod_H #include "Fl_Text_Display_mod.H" // key will match in any state #define Fl_Text_Editor_mod_ANY_STATE (-1L) /** This is the FLTK text editor widget. It allows the user to edit multiple lines of text and supports highlighting and scrolling. The buffer that is displayed in the widget is managed by the Fl_Text_Buffer_mod class. */ class FL_EXPORT Fl_Text_Editor_mod : public Fl_Text_Display_mod { public: /** Key function binding callback type */ typedef int (*Key_Func)(int key, Fl_Text_Editor_mod* editor); /** Simple linked list associating a key/state to a function */ struct Key_Binding { int key; ///< the key pressed int state; ///< the state of key modifiers Key_Func function; ///< associated function Key_Binding* next; ///< next key binding in the list }; Fl_Text_Editor_mod(int X, int Y, int W, int H, const char* l = 0); ~Fl_Text_Editor_mod() { remove_all_key_bindings(); } virtual int handle(int e); /** Sets the current insert mode; if non-zero, new text is inserted before the current cursor position. Otherwise, new text replaces text at the current cursor position. */ void insert_mode(int b) { insert_mode_ = b; } /** Gets the current insert mode; if non-zero, new text is inserted before the current cursor position. Otherwise, new text replaces text at the current cursor position. */ int insert_mode() { return insert_mode_; } void add_key_binding(int key, int state, Key_Func f, Key_Binding** list); /** Adds a key of state "state" with the function "function" */ void add_key_binding(int key, int state, Key_Func f) { add_key_binding(key, state, f, &key_bindings); } void remove_key_binding(int key, int state, Key_Binding** list); /** Removes the key binding associated with the key "key" of state "state". */ void remove_key_binding(int key, int state) { remove_key_binding(key, state, &key_bindings); } void remove_all_key_bindings(Key_Binding** list); /** Removes all of the key bindings associated with the text editor or list. */ void remove_all_key_bindings() { remove_all_key_bindings(&key_bindings); } void add_default_key_bindings(Key_Binding** list); Key_Func bound_key_function(int key, int state, Key_Binding* list); /** Returns the function associated with a key binding. */ Key_Func bound_key_function(int key, int state) { return bound_key_function(key, state, key_bindings); } /** Sets the default key function for unassigned keys. */ void default_key_function(Key_Func f) { default_key_function_ = f; } // functions for the built in default bindings static int kf_default(int c, Fl_Text_Editor_mod* e); static int kf_ignore(int c, Fl_Text_Editor_mod* e); static int kf_backspace(int c, Fl_Text_Editor_mod* e); static int kf_enter(int c, Fl_Text_Editor_mod* e); static int kf_move(int c, Fl_Text_Editor_mod* e); static int kf_shift_move(int c, Fl_Text_Editor_mod* e); static int kf_ctrl_move(int c, Fl_Text_Editor_mod* e); static int kf_c_s_move(int c, Fl_Text_Editor_mod* e); static int kf_meta_move(int c, Fl_Text_Editor_mod* e); static int kf_m_s_move(int c, Fl_Text_Editor_mod* e); static int kf_home(int, Fl_Text_Editor_mod* e); static int kf_end(int c, Fl_Text_Editor_mod* e); static int kf_left(int c, Fl_Text_Editor_mod* e); static int kf_up(int c, Fl_Text_Editor_mod* e); static int kf_right(int c, Fl_Text_Editor_mod* e); static int kf_down(int c, Fl_Text_Editor_mod* e); static int kf_page_up(int c, Fl_Text_Editor_mod* e); static int kf_page_down(int c, Fl_Text_Editor_mod* e); static int kf_insert(int c, Fl_Text_Editor_mod* e); static int kf_delete(int c, Fl_Text_Editor_mod* e); static int kf_copy(int c, Fl_Text_Editor_mod* e); static int kf_cut(int c, Fl_Text_Editor_mod* e); static int kf_paste(int c, Fl_Text_Editor_mod* e); static int kf_select_all(int c, Fl_Text_Editor_mod* e); static int kf_undo(int c, Fl_Text_Editor_mod* e); protected: int handle_key(); void maybe_do_callback(); #ifndef FL_DOXYGEN int insert_mode_; Key_Binding* key_bindings; static Key_Binding* global_key_bindings; Key_Func default_key_function_; #endif }; #endif // // End of "$Id: Fl_Text_Editor_mod.H 7903 2010-11-28 21:06:39Z matt $". // fldigi-3.21.80/src/include/stacktrace.h0000664000175000017500000000204512313064025014552 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef STACKTRACE_H #define STACKTRACE_H void pstack_maybe(void); void diediedie(void); void handle_unexpected(void); void handle_signal(int s); #endif // STACKTRACE_H fldigi-3.21.80/src/include/rx_extract.h0000664000175000017500000000227612313064025014617 00000000000000// ---------------------------------------------------------------------------- // ex_extract.h Remote Log Interface for fldigi // // Copyright W1HKJ, Dave Freese 2006 // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _RX_EXTRACT_H #define _RX_EXTRACT_H #include extern const char *txtWrapInfo; extern void rx_extract_add(int c); extern void select_flmsg_pathname(); extern std::string select_binary_pathname(std::string deffilename); extern bool extract_wrap; extern bool extract_flamp; #endif fldigi-3.21.80/src/include/util.h0000664000175000017500000001577212313064025013416 00000000000000/* ----------------------------------------------------------------------------- * util.h -- included by config.h * * Copyright (C) 2007-2009 * Stelios Bounanos, M0GLD * * This file is part of fldigi. * * Fldigi 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. * * Fldigi 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 fldigi. If not, see . * ----------------------------------------------------------------------------- */ #ifndef UTIL_H #define UTIL_H #ifdef __cplusplus extern "C" { #endif #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS #endif #ifndef __STDC_FORMAT_MACROS # define __STDC_FORMAT_MACROS 1 #endif #include #ifndef powerof2 # define powerof2(n) ((((n) - 1) & (n)) == 0) #endif #ifndef MAX # define MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifndef MIN # define MIN(a, b) (((a) < (b)) ? (a) : (b)) #endif #ifndef CLAMP # define CLAMP(x, low, high) (((x)>(high))?(high):(((x)<(low))?(low):(x))) #endif #define WCLAMP(x, low, high) (((x)>(high))?(low):(((x)<(low))?(high):(x))) #ifdef __GNUC__ # if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) # define full_memory_barrier() __sync_synchronize() # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() # elif defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__x86_64__) # define full_memory_barrier() asm volatile ("lock; addl $0,0(%%esp)":::"memory") # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() /* These would be faster on SSE2-capable processors: # define full_memory_barrier() asm volatile ("mfence":::"memory") # define read_memory_barrier() asm volatile ("lfence":::"memory") # define write_memory_barrier() asm volatile ("sfence":::"memory") */ # elif defined(__ppc__) || defined(__powerpc__) || defined(__PPC__) # define full_memory_barrier() asm volatile("sync":::"memory") # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() # else # warning Memory barriers not defined on this system # define full_memory_barrier() ((void)0) # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() # endif #else # warning Memory barriers not defined on this system # define full_memory_barrier() ((void)0) # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() #endif /* http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html */ #if defined(__GNUC__) && (__GNUC__ >= 3) # define likely(x) __builtin_expect (!!(x), 1) # define unlikely(x) __builtin_expect (!!(x), 0) # define used__ __attribute__ ((__used__)) # define unused__ __attribute__ ((__unused__)) # define must_check__ __attribute__ ((__warn_unused_result__)) # define deprecated__ __attribute__ ((__deprecated__)) # define noreturn__ __attribute__ ((__noreturn__)) # define pure__ __attribute__ ((__pure__)) # define const__ __attribute__ ((__const__)) # define malloc__ __attribute__ ((__malloc__)) # define packed__ __attribute__ ((__packed__)) # define inline__ inline __attribute__ ((__always_inline__)) # define noinline__ __attribute__ ((__noinline__)) # define nonnull__(x) __attribute__ ((__nonnull__(x))) # define format__(type_, index_, first_) __attribute__ ((format(type_, index_, first_))) #else # define likely(x) (x) # define unlikely(x) (x) # define used__ # define unused__ # define must_check__ # define deprecated__ # define noreturn__ # define pure__ # define const__ # define malloc__ # define packed__ # define inline__ # define noinline__ # define nonnull__(x) # define format__(type_, index_, first_) #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) # define hot__ __attribute__ ((__hot__)) # define cold__ __attribute__ ((__cold__)) #else # define hot__ # define cold__ #endif #include const__ uint32_t ceil2(uint32_t n); const__ uint32_t floor2(uint32_t n); #if !HAVE_STRCASESTR char* strcasestr(const char* haystack, const char* needle); #endif #if !HAVE_STRLCPY size_t strlcpy(char* dest, const char* src, size_t size); #endif #if !HAVE_SETENV int setenv(const char *name, const char *value, int replace); #endif #if !HAVE_UNSETENV int unsetenv(const char *name); #endif int set_cloexec(int fd, unsigned char v); int set_nonblock(int fd, unsigned char v); int set_nodelay(int fd, unsigned char v); int get_bufsize(int fd, int dir, int* len); int set_bufsize(int fd, int dir, int len); unsigned long ver2int(const char* version); void save_signals(void); void restore_signals(void); void MilliSleep(long msecs); #ifdef __cplusplus } // extern "C" #endif #ifdef __cplusplus uint32_t simple_hash_data(const unsigned char* buf, size_t len, uint32_t code = 0); uint32_t simple_hash_str(const unsigned char* str, uint32_t code = 0); #endif #ifdef __cplusplus const char* str2hex(const unsigned char* str, size_t len); const char* str2hex(const char* str, size_t len = 0); #else const char* str2hex(const unsigned* str, size_t len); #endif const char* uint2bin(unsigned u, size_t len); #if 0 && !defined(NDEBUG) && defined(deprecated__) && defined(__GNUC__) && !defined(__MINGW32__) #include #include deprecated__ typeof(sprintf) sprintf; /* there are far too many of these in the qrz code deprecated__ typeof(strcpy) strcpy; deprecated__ typeof(strcat) strcat; */ #endif #ifdef __WOE32__ # define NOMINMAX 1 #endif #ifndef __MINGW32__ # define PRIuSZ "zu" # define PRIdSZ "zd" #else # define PRIuSZ "Iu" # define PRIdSZ "Id" #endif # define PATH_SEP "/" /// Unnamed sempahores are not supported on OS X (and named semaphores are broken on cygwin). #ifdef __APPLE__ # define USE_NAMED_SEMAPHORES 1 #else # define USE_NAMED_SEMAPHORES 0 #endif /// Returns 0 if a process is running, 0 if not there and -1 if the test cannot be made. int test_process(int pid); /// Starts a process and returns its pid, and -1 if error. Returns 0 if this cannot be made. int fork_process( const char * cmd ); /// Returns NULL if no error. const char * create_directory( const char * dir ); int directory_is_created( const char * dir ); #endif /* UTIL_H */ /* Local Variables: mode: c++ c-file-style: "linux" End: */ fldigi-3.21.80/src/include/wwv.h0000664000175000017500000000433712313064025013257 00000000000000// ---------------------------------------------------------------------------- // wwv.h -- wwv receive only modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _wwv_H #define _wwv_H //#include "complex.h" #include "modem.h" #include "filters.h" #include "fftfilt.h" #include "mbuffer.h" #define wwvSampleRate 8000 #define MaxSymLen 512 // lp filter #1 //#define DEC_1 40 #define DEC_1 8 #define FIRLEN_1 512 #define BW_1 20 // lp filter #2 #define DEC_2 5 #define FIRLEN_2 256 #define BW_2 100 // wwv function return status codes. #define wwv_SUCCESS 0 #define wwv_ERROR -1 class wwv : public modem { protected: double phaseacc; double phaseincr; int smpl_ctr; // sample counter for timing wwv rx double agc; // threshold for tick detection C_FIR_filter *hilbert; C_FIR_filter *lpfilter; Cmovavg *vidfilter; mbuffer buffer; // storage for 1000 samples/sec video unsigned int buffptr; int sync; int sync0; int ticks; int x1; int y1; int x2; int y2; bool calc; bool zoom; double keyshape[32]; // 4 msec rise and fall time for pulse double audio[400]; double quiet[400]; double play[400]; double nco(double freq); void makeshape(); void makeaudio(); public: wwv(); ~wwv(); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart() {}; int rx_process(const double *buf, int len); int tx_process(); void update_syncscope(); void set1(int x, int y); void set2(int x, int y); }; #endif fldigi-3.21.80/src/include/Fl_Text_Buffer_mod.H0000664000175000017500000006622112313064025016071 00000000000000// // "$Id: Fl_Text_Buffer_mod.H 8148 2010-12-31 22:38:03Z matt $" // // Header file for Fl_Text_Buffer_mod class. // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA. // // Please report all bugs and problems on the following page: // // http://www.fltk.org/str.php // /* \file Fl_Text_Buffer_mod, Fl_Text_Selection_mod widget . */ #ifndef Fl_Text_Buffer_mod_H #define Fl_Text_Buffer_mod_H #undef ASSERT_UTF8 #ifdef ASSERT_UTF8 # include # define IS_UTF8_ALIGNED(a) if (a && *a) assert(fl_utf8len(*(a))>0); # define IS_UTF8_ALIGNED2(a, b) if (b>=0 && blength()) assert(fl_utf8len(a->byte_at(b))>0); #else # define IS_UTF8_ALIGNED(a) # define IS_UTF8_ALIGNED2(a, b) #endif /* "character size" is the size of a UTF-8 character in bytes "character width" is the width of a Unicode character in pixels "column" was orginally defined as a character offset from the left margin. It was identical to the byte offset. In UTF-8, we have neither a byte offset nor truly fixed width fonts (*). Column could be a pixel value multiplied with an average character width (which is a bearable approximation). * in Unicode, there are no fixed width fonts! Even if the ASCII characters may happen to be all the same width in pixels, chinese charcaters surely are not. There are plenty of exceptions, like ligatures, that make special handling of "fixed" character widths a nightmare. I decided to remove all references to fixed fonts and see "columns" as a multiple of the average width of a character in the main font. - Matthias */ /* Maximum length in characters of a tab or control character expansion of a single buffer character */ #define FL_TEXT_MAX_EXP_CHAR_LEN 20 #include /** \class Fl_Text_Selection_mod \brief This is an internal class for Fl_Text_Buffer_mod to manage text selections. This class works correctly with utf-8 strings assuming that the parameters for all calls are on character boundaries. */ class FL_EXPORT Fl_Text_Selection_mod { friend class Fl_Text_Buffer_mod; public: /** \brief Set the selection range. \param start byte offset to first selected character \param end byte offset pointing after last selected character */ void set(int start, int end); /** \brief Updates a selection afer text was modified. Updates an individual selection for changes in the corresponding text \param pos byte offset into text buffer at which the change occured \param nDeleted number of bytes deleted from the buffer \param nInserted number of bytes inserted into the buffer */ void update(int pos, int nDeleted, int nInserted); /** \brief Return the byte offset to the first selected character. \return byte offset */ int start() const { return mStart; } /** \brief Return the byte ofsset to the character after the last selected character. \return byte offset */ int end() const { return mEnd; } /** \brief Returns true if any text is selected. \return a non-zero number if any text has been selected, or 0 if no text is selected. */ bool selected() const { return mSelected; } /** \brief Modify the 'selected' flag. \param b new flag */ void selected(bool b) { mSelected = b; } /** Return true if position \p pos with indentation \p dispIndex is in the Fl_Text_Selection_mod. */ int includes(int pos) const; /** \brief Return the positions of this selection. \param start retrun byte offset to first selected character \param end retrun byte offset pointing after last selected character \return true if selected */ int position(int* start, int* end) const; protected: int mStart; ///< byte offset to the first selected character int mEnd; ///< byte offset to the character after the last selected character bool mSelected; ///< this flag is set if any text is selected }; typedef void (*Fl_Text_Modify_Cb)(int pos, int nInserted, int nDeleted, int nRestyled, const char* deletedText, void* cbArg); typedef void (*Fl_Text_Predelete_Cb)(int pos, int nDeleted, void* cbArg); /** \brief This class manages unicode displayed in one or more Fl_Text_Display_mod widgets. All text in Fl_Text_Buffer_modmust be encoded in UTF-8. All indices used in the function calls must be aligned to the start of a UTF-8 sequence. All indices and pointers returned will be aligned. All functions that return a single character will return that in an unsiged int in UCS-4 encoding. The Fl_Text_Buffer_mod class is used by the Fl_Text_Display_mod and Fl_Text_Editor_mod to manage complex text data and is based upon the excellent NEdit text editor engine - see http://www.nedit.org/. */ class FL_EXPORT Fl_Text_Buffer_mod { public: /** Create an empty text buffer of a pre-determined size. \param requestedSize use this to avoid unnecessary re-allocation if you know exactly how much the buffer will need to hold \param preferredGapSize Initial size for the buffer gap (empty space in the buffer where text might be inserted if the user is typing sequential chars) */ Fl_Text_Buffer_mod(int requestedSize = 0, int preferredGapSize = 1024); /** Frees a text buffer */ ~Fl_Text_Buffer_mod(); /** \brief Returns the number of bytes in the buffer. \return size of text in bytes */ int length() const { return mLength; } /** \brief Get a copy of the entire contents of the text buffer. Memory is allocated to contain the returned string, which the caller must free. \return newly allocated text buffer - must be free'd, text is utf8 */ char* text() const; /** Replaces the entire contents of the text buffer. \param text Text must be valid utf8. */ void text(const char* text); /** \brief Get a copy of a part of the text buffer. Return a copy of the text between \p start and \p end character positions from text buffer \p buf. Positions start at 0, and the range does not include the character pointed to by \p end. When you are done with the text, free it using the free() function. \param start byte offset to first character \param end byte offset after last character in range \return newly allocated text buffer - must be free'd, text is utf8 */ char* text_range(int start, int end) const; /** Returns the UCS-4 character at the specified position pos in the buffer. Positions start at 0 \param pos byte offset into buffer, pos must be at a character boundary \return Unicode UCS-4 encoded character */ unsigned int char_at(int pos) const; /** Returns the UTF-8 character at the specified position pos in the buffer. Positions start at 0 param pos byte offset into buffer, pos must be at a character boundary return Unicode UTF-8 encoded character return length of Unicode encoded character in len */ unsigned int get_char_at(int pos, int &len) const; /** Returns the raw byte at the specified position pos in the buffer. Positions start at 0 \param pos byte offset into buffer \return unencoded raw byte */ char byte_at(int pos) const; /** Convert a byte offset in buffer into a memory address. \param pos byte offset into buffer \return byte offset converted to a memory address */ const char *address(int pos) const { return (pos < mGapStart) ? mBuf+pos : mBuf+pos+mGapEnd-mGapStart; } /** Convert a byte offset in buffer into a memory address. \param pos byte offset into buffer \return byte offset converted to a memory address */ char *address(int pos) { return (pos < mGapStart) ? mBuf+pos : mBuf+pos+mGapEnd-mGapStart; } /** Inserts null-terminated string \p text at position \p pos. \param pos insertion position as byte offset (must be utf-8 character aligned) \param text utf-8 encoded and nul terminated text */ void insert(int pos, const char* text); /** Appends the text string to the end of the buffer. \param t utf-8 encoded and nul terminated text */ void append(const char* t) { insert(length(), t); } /** Deletes a range of characters in the buffer. \param start byte offset to first character to be removed \param end byte offset to charcatre after last character to be removed */ void remove(int start, int end); /** Deletes the characters between \p start and \p end, and inserts the null-terminated string \p text in their place in the buffer. \param start byte offset to first character to be removed and new insert position \param end byte offset to charcatre after last character to be removed \param text utf-8 encoded and nul terminated text */ void replace(int start, int end, const char *text); /** Copies text from one buffer to this one. \param fromBuf source text buffer may be the same as this \param fromStart byte offset into buffer \param fromEnd byte offset into buffer \param toPos destination byte offset into buffer */ void copy(Fl_Text_Buffer_mod* fromBuf, int fromStart, int fromEnd, int toPos); /** Undo text modification according to the undo variables or insert text from the undo buffer */ int undo(int *cp=0); /** Lets the undo system know if we can undo changes */ void canUndo(char flag=1); /** Inserts a file at the specified position. Returns 0 on success, non-zero on error (strerror() contains reason). 1 indicates open for read failed (no data loaded). 2 indicates error occurred while reading data (data was partially loaded). File can be UTF-8 or CP1252-encoded. If the input file is not UTF-8-encoded, the Fl_Text_Buffer_mod widget will contain UTF-8-transcoded data. By default, the message Fl_Text_Buffer_mod::file_encoding_warning_message will warn the user about this. \see input_file_was_transcoded and transcoding_warning_action. */ int insertfile(const char *file, int pos, int buflen = 128*1024); /** Appends the named file to the end of the buffer. See also insertfile(). */ int appendfile(const char *file, int buflen = 128*1024) { return insertfile(file, length(), buflen); } /** Loads a text file into the buffer. See also insertfile(). */ int loadfile(const char *file, int buflen = 128*1024) { select(0, length()); remove_selection(); return appendfile(file, buflen); } /** Writes the specified portions of the file to a file. Returns 0 on success, non-zero on error (strerror() contains reason). 1 indicates open for write failed (no data saved). 2 indicates error occurred while writing data (data was partially saved). */ int outputfile(const char *file, int start, int end, int buflen = 128*1024); /** Saves a text file from the current buffer */ int savefile(const char *file, int buflen = 128*1024) { return outputfile(file, 0, length(), buflen); } /** Gets the tab width. */ int tab_distance() const { return mTabDist; } /** Set the hardware tab distance (width) used by all displays for this buffer, and used in computing offsets for rectangular selection operations. */ void tab_distance(int tabDist); /** Selects a range of characters in the buffer. */ void select(int start, int end); /** Returns a non 0 value if text has been selected, 0 otherwise */ int selected() const { return mPrimary.selected(); } /** Cancels any previous selection on the primary text selection object */ void unselect(); /** Gets the selection position */ int selection_position(int* start, int* end); /** Returns the currently selected text. When you are done with the text, free it using the free() function. */ char* selection_text(); /** Removes the text in the primary selection. */ void remove_selection(); /** Replaces the text in the primary selection. */ void replace_selection(const char* text); /** Selects a range of characters in the secondary selection. */ void secondary_select(int start, int end); /** Returns a non 0 value if text has been selected in the secondary text selection, 0 otherwise */ int secondary_selected() { return mSecondary.selected(); } /** Clears any selection in the secondary text selection object. */ void secondary_unselect(); /** Returns the current selection in the secondary text selection object. */ int secondary_selection_position(int* start, int* end); /** Returns the text in the secondary selection. When you are done with the text, free it using the free() function. */ char* secondary_selection_text(); /** Removes the text from the buffer corresponding to the secondary text selection object. */ void remove_secondary_selection(); /** Replaces the text from the buffer corresponding to the secondary text selection object with the new string \p text. */ void replace_secondary_selection(const char* text); /** Highlights the specified text within the buffer. */ void highlight(int start, int end); /** Returns the highlighted text. When you are done with the text, free it using the free() function. */ int highlight() { return mHighlight.selected(); } /** Unhighlights text in the buffer. */ void unhighlight(); /** Highlights the specified text between \p start and \p end within the buffer. */ int highlight_position(int* start, int* end); /** Returns the highlighted text. When you are done with the text, free it using the free() function. */ char* highlight_text(); /** Adds a callback function that is called whenever the text buffer is modified. The callback function is declared as follows: \code typedef void (*Fl_Text_Modify_Cb)(int pos, int nInserted, int nDeleted, int nRestyled, const char* deletedText, void* cbArg); \endcode */ void add_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void* cbArg); /** Removes a modify callback. */ void remove_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void* cbArg); /** Calls all modify callbacks that have been registered using the add_modify_callback() method. */ void call_modify_callbacks() { call_modify_callbacks(0, 0, 0, 0, 0); } /** Adds a callback routine to be called before text is deleted from the buffer. */ void add_predelete_callback(Fl_Text_Predelete_Cb bufPredelCB, void* cbArg); /** Removes a callback routine \p bufPreDeleteCB associated with argument \p cbArg to be called before text is deleted from the buffer. */ void remove_predelete_callback(Fl_Text_Predelete_Cb predelCB, void* cbArg); /** Calls the stored pre-delete callback procedure(s) for this buffer to update the changed area(s) on the screen and any other listeners. */ void call_predelete_callbacks() { call_predelete_callbacks(0, 0); } /** Returns the text from the entire line containing the specified character position. When you are done with the text, free it using the free() function. \param pos byte index into buffer \return copy of utf8 text, must be free'd */ char* line_text(int pos) const; /** Returns the position of the start of the line containing position \p pos. \param pos byte index into buffer \return byte offset to line start */ int line_start(int pos) const; /** Finds and returns the position of the end of the line containing position \p pos (which is either a pointer to the newline character ending the line, or a pointer to one character beyond the end of the buffer) \param pos byte index into buffer \return byte offset to line end */ int line_end(int pos) const; /** Returns the position corresponding to the start of the word \param pos byte index into buffer \return byte offset to word start */ int word_start(int pos) const; /** Returns the position corresponding to the end of the word. \param pos byte index into buffer \return byte offset to word end */ int word_end(int pos) const; /** Count the number of displayed characters between buffer position \p lineStartPos and \p targetPos. (displayed characters are the characters shown on the screen to represent characters in the buffer, where tabs and control characters are expanded) */ int count_displayed_characters(int lineStartPos, int targetPos) const; /** Count forward from buffer position \p startPos in displayed characters (displayed characters are the characters shown on the screen to represent characters in the buffer, where tabs and control characters are expanded) \param lineStartPos byte offset into buffer \param nChars number of bytes that are sent to the display \return byte offset in input after all output bytes are sent */ int skip_displayed_characters(int lineStartPos, int nChars); /** Counts the number of newlines between \p startPos and \p endPos in buffer. The character at position \p endPos is not counted. */ int count_lines(int startPos, int endPos) const; /** Finds the first character of the line \p nLines forward from \p startPos in the buffer and returns its position */ int skip_lines(int startPos, int nLines); /** Finds and returns the position of the first character of the line \p nLines backwards from \p startPos (not counting the character pointed to by \p startpos if that is a newline) in the buffer. \p nLines == 0 means find the beginning of the line */ int rewind_lines(int startPos, int nLines); /** Finds the next occurrence of the specified character. Search forwards in buffer for character \p searchChar, starting with the character \p startPos, and returning the result in \p foundPos returns 1 if found, 0 if not. (The difference between this and BufSearchForward is that it's optimized for single characters. The overall performance of the text widget is dependent on its ability to count lines quickly, hence searching for a single character: newline) \param startPos byte offset to start position \param searchChar UCS-4 character that we want to find \param foundPos byte offset where the character was found \return 1 if found, 0 if not */ int findchar_forward(int startPos, unsigned searchChar, int* foundPos) const; /** Search backwards in buffer \p buf for character \p searchChar, starting with the character BEFORE \p startPos, returning the result in \p foundPos returns 1 if found, 0 if not. (The difference between this and BufSearchBackward is that it's optimized for single characters. The overall performance of the text widget is dependent on its ability to count lines quickly, hence searching for a single character: newline) \param startPos byte offset to start position \param searchChar UCS-4 character that we want to find \param foundPos byte offset where the character was found \return 1 if found, 0 if not */ int findchar_backward(int startPos, unsigned int searchChar, int* foundPos) const; /** Search forwards in buffer for string \p searchString, starting with the character \p startPos, and returning the result in \p foundPos returns 1 if found, 0 if not. \param startPos byte offset to start position \param searchString utf8 string that we want to find \param foundPos byte offset where the string was found \param matchCase if set, match character case \return 1 if found, 0 if not */ int search_forward(int startPos, const char* searchString, int* foundPos, int matchCase = 0) const; /** Search backwards in buffer for string searchCharssearchString, starting with the character BEFORE \p startPos, returning the result in \p foundPos returns 1 if found, 0 if not. \param startPos byte offset to start position \param searchString utf8 string that we want to find \param foundPos byte offset where the string was found \param matchCase if set, match character case \return 1 if found, 0 if not */ int search_backward(int startPos, const char* searchString, int* foundPos, int matchCase = 0) const; int findchars_forward(int startPos, const char* searchChars, int* foundPos); int findchars_backward(int startPos, const char* searchChars, int* foundPos); /** Returns the primary selection. */ const Fl_Text_Selection_mod* primary_selection() const { return &mPrimary; } /** Returns the primary selection. */ Fl_Text_Selection_mod* primary_selection() { return &mPrimary; } /** Returns the secondary selection. */ const Fl_Text_Selection_mod* secondary_selection() const { return &mSecondary; } /** Returns the current highlight selection. */ const Fl_Text_Selection_mod* highlight_selection() const { return &mHighlight; } /** Returns the index of the previous character. \param ix index to the current char */ int prev_char(int ix) const; int prev_char_clipped(int ix) const; /** Returns the index of the next character. \param ix index to the current char */ int next_char(int ix) const; int next_char_clipped(int ix) const; /** Align an index into the buffer to the current or previous utf8 boundary. */ int utf8_align(int) const; /** \brief true iff the loaded file has been transcoded to UTF-8 */ int input_file_was_transcoded; /** This message may be displayed using the fl_alert() function when a file which was not UTF-8 encoded is input. */ static const char* file_encoding_warning_message; /** \brief Pointer to a function called after reading a non UTF-8 encoded file. This function is called after reading a file if the file content was transcoded to UTF-8. Its default implementation calls fl_alert() with the text of \ref file_encoding_warning_message. No warning message is displayed if this pointer is set to NULL. Use \ref input_file_was_transcoded to be informed if file input required transcoding to UTF-8. */ void (*transcoding_warning_action)(Fl_Text_Buffer_mod*); protected: /** Calls the stored modify callback procedure(s) for this buffer to update the changed area(s) on the screen and any other listeners. */ void call_modify_callbacks(int pos, int nDeleted, int nInserted, int nRestyled, const char* deletedText) const; /** Calls the stored pre-delete callback procedure(s) for this buffer to update the changed area(s) on the screen and any other listeners. */ void call_predelete_callbacks(int pos, int nDeleted) const; /** Internal (non-redisplaying) version of BufInsert. Returns the length of text inserted (this is just strlen(\p text), however this calculation can be expensive and the length will be required by any caller who will continue on to call redisplay). \p pos must be contiguous with the existing text in the buffer (i.e. not past the end). \return the number of bytes inserted */ int insert_(int pos, const char* text); /** Internal (non-redisplaying) version of BufRemove. Removes the contents of the buffer between start and end (and moves the gap to the site of the delete). */ void remove_(int start, int end); /** Calls the stored redisplay procedure(s) for this buffer to update the screen for a change in a selection. */ void redisplay_selection(Fl_Text_Selection_mod* oldSelection, Fl_Text_Selection_mod* newSelection) const; /** Move the gap to start at a new position. */ void move_gap(int pos); /** Reallocates the text storage in the buffer to have a gap starting at \p newGapStart and a gap size of \p newGapLen, preserving the buffer's current contents. */ void reallocate_with_gap(int newGapStart, int newGapLen); char* selection_text_(Fl_Text_Selection_mod* sel) const; /** Removes the text from the buffer corresponding to \p sel. */ void remove_selection_(Fl_Text_Selection_mod* sel); /** Replaces the \p text in selection \p sel. */ void replace_selection_(Fl_Text_Selection_mod* sel, const char* text); /** Updates all of the selections in the buffer for changes in the buffer's text */ void update_selections(int pos, int nDeleted, int nInserted); Fl_Text_Selection_mod mPrimary; /**< highlighted areas */ Fl_Text_Selection_mod mSecondary; /**< highlighted areas */ Fl_Text_Selection_mod mHighlight; /**< highlighted areas */ int mLength; /**< length of the text in the buffer (the length of the buffer itself must be calculated: gapEnd - gapStart + length) */ char* mBuf; /**< allocated memory where the text is stored */ int mGapStart; /**< points to the first character of the gap */ int mGapEnd; /**< points to the first char after the gap */ // The hardware tab distance used by all displays for this buffer, // and used in computing offsets for rectangular selection operations. int mTabDist; /**< equiv. number of characters in a tab */ int mNModifyProcs; /**< number of modify-redisplay procs attached */ Fl_Text_Modify_Cb *mModifyProcs;/**< procedures to call when buffer is modified to redisplay contents */ void** mCbArgs; /**< caller arguments for modifyProcs above */ int mNPredeleteProcs; /**< number of pre-delete procs attached */ Fl_Text_Predelete_Cb *mPredeleteProcs; /**< procedure to call before text is deleted from the buffer; at most one is supported. */ void **mPredeleteCbArgs; /**< caller argument for pre-delete proc above */ int mCursorPosHint; /**< hint for reasonable cursor position after a buffer modification operation */ char mCanUndo; /**< if this buffer is used for attributes, it must not do any undo calls */ int mPreferredGapSize; /**< the default allocation for the text gap is 1024 bytes and should only be increased if frequent and large changes in buffer size are expected */ }; #endif // // End of "$Id: Fl_Text_Buffer_mod.H 8148 2010-12-31 22:38:03Z matt $". // fldigi-3.21.80/src/include/FTextView.h0000664000175000017500000001223312313064025014313 00000000000000// ---------------------------------------------------------------------------- // FTextView.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef FTextView_H_ #define FTextView_H_ #include #include #include #include #include #include #include "Fl_Text_Editor_mod.H" /// /// The text widgets base class. /// This class implements a basic text editing widget based on Fl_Text_Editor_mod. /// class FTextBase : public Fl_Text_Editor_mod { public: // CLICK_START: same as first clickable style // NATTR: number of styles (last style + 1) enum TEXT_ATTR { RECV, XMIT, CTRL, SKIP, ALTR, CLICK_START, QSY = CLICK_START, /* FOO, BAR, ..., */ NATTR }; FTextBase(int x, int y, int w, int h, const char *l = 0); virtual ~FTextBase() { delete tbuf; delete sbuf; } virtual void add(unsigned char c, int attr = RECV); virtual void add(const char *text, int attr = RECV); void addstr(std::string text, int attr = RECV) { add(text.c_str(), attr); } void addchr(unsigned char c, int attr = RECV) { add(c, attr); } virtual int handle(int event); virtual void handle_context_menu(void) { } virtual void clear(void);//{ tbuf->text(""); sbuf->text(""); } void set_word_wrap(bool b, bool b2 = false); bool get_word_wrap(void) { return wrap; } virtual void setFont(Fl_Font f, int attr = NATTR); void setFontSize(int s, int attr = NATTR); void setFontColor(Fl_Color c, int attr = NATTR); // Override Fl_Text_Display, which stores the font number in an unsigned // character and therefore cannot represent all fonts Fl_Font textfont(void) { return styles[0].font; } void textfont(Fl_Font f) { setFont(f); } void textfont(uchar s) { textfont((Fl_Font)s); } void cursorON(void) { show_cursor(); } virtual void resize(int X, int Y, int W, int H); static bool wheight_mult_tsize(void *arg, int xd, int yd); protected: void set_style(int attr, Fl_Font f, int s, Fl_Color c, int set = SET_FONT | SET_SIZE | SET_COLOR); int readFile(const char* fn = 0); void saveFile(void); char* get_word(int x, int y, const char* nwchars = "", bool ontext = true); void init_context_menu(void); void show_context_menu(void); virtual void menu_cb(size_t item) { } int reset_wrap_col(void); void reset_styles(int set); private: FTextBase(); FTextBase(const FTextBase &t); protected: enum { FTEXT_DEF = 'A' }; enum set_style_op_e { SET_FONT = 1 << 0, SET_SIZE = 1 << 1, SET_COLOR = 1 << 2 }; Fl_Text_Buffer_mod *tbuf; ///< text buffer Fl_Text_Buffer_mod *sbuf; ///< style buffer Fl_Text_Display_mod::Style_Table_Entry styles[NATTR]; Fl_Menu_Item *context_menu; int popx, popy; bool wrap; int wrap_col; int max_lines; bool scroll_hint; bool restore_wrap; // bool wrap_restore; private: int oldw, oldh, olds; Fl_Font oldf; }; /// /// A TextBase subclass to display received & transmitted text /// class FTextView : public FTextBase { public: FTextView(int x, int y, int w, int h, const char *l = 0); ~FTextView() { } virtual int handle(int event); protected: enum { VIEW_MENU_COPY, VIEW_MENU_CLEAR, VIEW_MENU_SELECT_ALL, VIEW_MENU_SAVE, VIEW_MENU_WRAP }; virtual void handle_context_menu(void); virtual void menu_cb(size_t item); static void changed_cb(int pos, int nins, int ndel, int nsty, const char *dtext, void *arg); void change_keybindings(void); private: FTextView(); FTextView(const FTextView &t); protected: static Fl_Menu_Item menu[]; bool quick_entry; }; /// /// A FTextBase subclass to display and edit text to be transmitted /// class FTextEdit : public FTextBase { public: FTextEdit(int x, int y, int w, int h, const char *l = 0); virtual int handle(int event); protected: enum { EDIT_MENU_CUT, EDIT_MENU_COPY, EDIT_MENU_PASTE, EDIT_MENU_CLEAR, EDIT_MENU_READ, EDIT_MENU_WRAP }; virtual int handle_key(int key); int handle_key_ascii(int key); virtual int handle_dnd_drag(int pos); int handle_dnd_drop(void); virtual void handle_context_menu(void); virtual void menu_cb(size_t item); static void changed_cb(int pos, int nins, int ndel, int nsty, const char *dtext, void *arg); private: FTextEdit(); FTextEdit(const FTextEdit &t); protected: static Fl_Menu_Item menu[]; char ascii_cnt; unsigned ascii_chr; bool dnd_paste; }; #endif // FTextView_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-3.21.80/src/include/mbuffer.h0000664000175000017500000002326212313064025014060 00000000000000// ---------------------------------------------------------------------------- // mbuffer.h // // Copyright (C) 2007 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- // A simple vector wrapper for fldigi's double-buffering needs. // Most vector operations are provided for mbuffers by redirecting them to the // current vector. // The template arguments are // 1) T - the type // 2) S - the apparent mbuffer size, i.e., the size of each vector. Defaults to 0. // A mbuffer instantiated with S == 0 is not very useful until resized // with alloc(). // 3) N - the number of vectors that we can cycle between. Defaults to 1. // Things to note: // 1) There is a T* conversion operator // 2) Operations that modify the length of the container are not provided // 3) Comparison operators are not implemented (but see (1)!) // 4) mbuffer is meant to be used when we don't know the size at // compile time, in which case we resize with alloc. The compiler will treat // mbuffers resized to different lengths in this way as objects of the same type. #ifndef MBUFFER_H #define MBUFFER_H #include #include #ifndef NDEBUG #include #include #endif #ifndef NDEBUG template class mbuffer; template std::ostream& operator<<(std::ostream& o, const mbuffer& b); #endif // NDEBUG template class mbuffer { protected: std::vector data[N]; mutable std::size_t cur; public: explicit mbuffer(void) { alloc(S); } explicit mbuffer(std::size_t n) { alloc(n); } mbuffer(const std::vector& v) { data[0] = v; // resize 1 to N only alloc(data[0].size(), 1); } mbuffer(const T* a, std::size_t n) { data[0].assign(a, a + n); // resize 1 to N only alloc(n, 1); } void alloc(std::size_t n, std::size_t start = 0) { for (size_t i = start; i < N; ++i) data[i].resize(n); cur = 0; } typedef typename std::vector::iterator iterator; typedef typename std::vector::const_iterator const_iterator; iterator begin(void) { return data[cur].begin(); } const_iterator begin(void) const { return data[cur].begin(); } iterator end(void) { return data[cur].end(); } const_iterator end(void) const { return data[cur].end(); } typedef typename std::vector::reverse_iterator reverse_iterator; typedef typename std::vector::const_reverse_iterator const_reverse_iterator; reverse_iterator rbegin(void) { return reverse_iterator(end()); } const_reverse_iterator rbegin(void) const { return const_reverse_iterator(end()); } reverse_iterator rend(void) { return reverse_iterator(begin()); } const_reverse_iterator rend(void) const { return const_reverse_iterator(begin()); } typedef typename std::vector::value_type value_type; typedef typename std::vector::reference reference; typedef typename std::vector::const_reference const_reference; typedef typename std::vector::size_type size_type; typedef typename std::vector::difference_type difference_type; // These should be the same for all vectors in data[] size_type size(void) { return data[0].size(); } size_type max_size(void) { return data[0].max_size(); } size_type capacity(void) { return data[0].capacity(); } bool empty(void) { return data[0].empty(); } // Instead of these, we provide a conversion operator for T* // reference operator[](size_type i) { return data[cur][i]; } // const_reference operator[](size_type i) const { return data[cur][i]; } reference at(size_type i) { return data[cur].at(i); } const_reference at(size_type i) const { return data[cur].at(i); } reference front(void) { return data[cur].front(); } const_reference front(void) const { return data[cur].front(); } reference back(void) { return data[cur].back(); } const_reference back(void) const { return data[cur].back(); } // Operations that modify the size of data[cur] might invalidate // pointers to internal buffers. The rest of the data vectors would need // to be resized, e.g. with check_size below. For this reason these // operations are not provided, but are included here for completeness // void check_size(void) // { // for (size_t i = 0; i < N; ++i) // if (data[i].size() != data[cur].size()) // data[i].resize(data[cur].size()); // } // mbuffer& operator=(const mbuffer& o) // { // for (int i = 0; i < N; ++i) // std::copy(o.data[i].begin(), o.data[i].end(), data[i].begin()); // return *this; // } // std::vector& operator=(const std::vector& o) // { // std::copy(o.begin(), o.end(), data[cur].begin()); // check_size(); // return data[cur]; // } // The methods below would modify the length of the vector. // We would need to check_size() before returning from them. // There is no vector::assign; the one provided here fills the vector // with copies of the same value without causing a resize. void assign(const_reference v) { std::fill_n(begin(), size(), v); } // template // void assign(input_iterator first, input_iterator last) // { // data[cur].assign(first, last); // } // void push_back(const_reference v) { data[cur].push_back(v); } // void pop_back(void) { data[cur].pop_back(); } // iterator insert(iterator pos, const_reference v) // { // return data[cur].insert(pos, v); // } // iterator insert(iterator pos, size_type n, const_reference v) // { // return data[cur].insert(pos, n, v); // } // template // void insert(iterator pos, input_iterator first, input_iterator last) // { // data[cur].insert(pos, first, last); // } // iterator erase(iterator pos) { return data[cur].erase(pos); } // iterator erase(iterator first, iterator last) { return data[cur].erase(first, last); } // void clear(void) { data[cur].clear(); } void swap(mbuffer& o) { for (int i = 0; i < N; ++i) std::swap(data[i].begin(), data[i].end(), o.data[i].begin()); } // void swap(std::vector& o) // { // std::swap(data[cur].begin(), data[cur].end(), o.begin()); // check_size(); // o.check_size(); // } // and now for something completely different void next(void) const { if (++cur == N) cur = 0; } void prev(void) const { if (cur > 0) --cur; } void reset(void) const { cur = 0; } T* c_array(void) { return &data[cur][0]; } operator T*(void) { return c_array(); } const T* c_array(void) const { return &data[cur][0]; } operator const T*(void) const { return c_array(); } std::vector& vec(void) { return data[cur]; } const std::vector& vec(void) const { return data[cur]; } // We also do not provide vector conversions // operator std::vector&(void) { return vec(); } // operator const std::vector&(void) const { return vec(); } std::size_t idx(void) { return cur; } std::size_t nvec(void) { return N; } std::vector* vecp(std::size_t i) { return &data[i]; } #ifndef NDEBUG friend std::ostream& operator<<<>(std::ostream& o, const mbuffer& b); #endif // NDEBUG }; #ifndef NDEBUG template std::ostream& operator<<(std::ostream& o, const mbuffer& b) { for (std::size_t i = 0; i < N; ++i) { o << '<' << i << ">\n"; copy(b.data[i].begin(), b.data[i].end(), std::ostream_iterator(o, "\n")); } return o; } #endif // NDEBUG template inline void swap(mbuffer& a, mbuffer& b) { a.swap(b); } #endif // MBUFFER_H // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-3.21.80/src/include/rtty.h0000664000175000017500000001157312313064025013436 00000000000000// ---------------------------------------------------------------------------- // rtty.h -- RTTY modem // // Copyright (C) 2012 // Dave Freese, W1HKJ // Stefan Fendt, DL1SMF // // This file is part of fldigi. // // This code bears some resemblance to code contained in gmfsk from which // it originated. Much has been changed, but credit should still be // given to Tomi Manninen (oh2bns@sral.fi), who so graciously distributed // his gmfsk modem under the GPL. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _RTTY_H #define _RTTY_H #include #include "complex.h" #include "modem.h" #include "globals.h" #include "filters.h" #include "fftfilt.h" #include "digiscope.h" #define RTTY_SampleRate 8000 //#define RTTY_SampleRate 11025 //#define RTTY_SampleRate 12000 #define MAXPIPE 1024 #define MAXBITS (2 * RTTY_SampleRate / 23 + 1) #define LETTERS 0x100 #define FIGURES 0x200 #define dispwidth 100 enum RTTY_RX_STATE { RTTY_RX_STATE_IDLE = 0, RTTY_RX_STATE_START, RTTY_RX_STATE_DATA, RTTY_RX_STATE_PARITY, RTTY_RX_STATE_STOP, RTTY_RX_STATE_STOP2 }; enum RTTY_PARITY { RTTY_PARITY_NONE = 0, RTTY_PARITY_EVEN, RTTY_PARITY_ODD, RTTY_PARITY_ZERO, RTTY_PARITY_ONE }; // simple oscillator-class class Oscillator { public: Oscillator( double samplerate ); ~Oscillator() {} double Update( double frequency ); private: double m_phase; double m_samplerate; }; class SymbolShaper { public: SymbolShaper(double baud = 45.45, double sr = 8000.0); ~SymbolShaper() {} void reset(); void Preset(double baud, double sr); void print_sinc_table(); double Update( bool state ); private: int m_table_size; double* m_sinc_table; bool m_State; double m_Accumulator; long m_Counter0; long m_Counter1; long m_Counter2; long m_Counter3; long m_Counter4; long m_Counter5; double m_Factor0; double m_Factor1; double m_Factor2; double m_Factor3; double m_Factor4; double m_Factor5; double m_SincTable[1024]; double baudrate; double samplerate; }; //enum TTY_MODE { LETTERS, FIGURES }; class rtty : public modem { public: static const double SHIFT[]; static const double BAUD[]; static const int BITS[]; private: Oscillator *m_Osc1; Oscillator *m_Osc2; SymbolShaper *m_SymShaper1; SymbolShaper *m_SymShaper2; double shift; int symbollen; int nbits; int stoplen; int msb; bool useFSK; double phaseacc; double rtty_squelch; double rtty_shift; double rtty_BW; double rtty_baud; int rtty_bits; RTTY_PARITY rtty_parity; int rtty_stop; bool rtty_msbfirst; double mark_noise; double space_noise; Cmovavg *bits; bool nubit; bool bit; bool bit_buf[MAXBITS]; double mark_phase; double space_phase; fftfilt *mark_filt; fftfilt *space_filt; double *pipe; double *dsppipe; int pipeptr; cmplx mark_history[MAXPIPE]; cmplx space_history[MAXPIPE]; RTTY_RX_STATE rxstate; int counter; int bitcntr; int rxdata; double cfreq; // center frequency between MARK/SPACE tones double shift_offset; // 1/2 rtty_shift double prevsymbol; cmplx prevsmpl; double xy_phase; double rotate; cmplx QI[MAXPIPE]; int inp_ptr; cmplx xy; bool clear_zdata; double sigpwr; double noisepwr; double avgsig; double mark_mag; double space_mag; double mark_env; double space_env; double noise_floor; double FSKbuf[OUTBUFSIZE]; // signal array for qrq drive double FSKphaseacc; double FSKnco(); unsigned char lastchar; int rxmode; int txmode; bool preamble; void Clear_syncscope(); void Update_syncscope(); double IF_freq; inline cmplx mixer(double &phase, double f, cmplx in); unsigned char Bit_reverse(unsigned char in, int n); int decode_char(); int rttyparity(unsigned int); bool rx(bool bit); // transmit double nco(double freq); void send_symbol(int symbol, int len); void send_stop(); void send_char(int c); void send_idle(); int rttyxprocess(); int baudot_enc(unsigned char data); char baudot_dec(unsigned char data); void Metric(); bool is_mark_space(int &); bool is_mark(); public: rtty(trx_mode mode); ~rtty(); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart(); void reset_filters(); int rx_process(const double *buf, int len); int tx_process(); void flush_stream(); void searchDown(); void searchUp(); }; #endif fldigi-3.21.80/src/include/pskrep.h0000664000175000017500000000262412313064025013735 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef PSKREP_H_ #define PSKREP_H_ bool pskrep_start(void); void pskrep_stop(); const char* pskrep_error(void); unsigned pskrep_count(void); // The regular expression that matches the spotter's buffer when it calls us. // It must define at least two capturing groups, the second of which is the // spotted callsign. #define CALLSIGN_RE "[[:alnum:]]?[[:alpha:]/]+[[:digit:]]+[[:alnum:]/]+" #define PSKREP_RE "(de|cq|qrz)[^[:alnum:]/\n]+" "(" CALLSIGN_RE ")" " +(.* +)?\\2[^[:alnum:]]+$" #define PSKREP_RE_INDEX 2 #endif // PSKREP_H_ fldigi-3.21.80/src/include/ptt.h0000664000175000017500000000475112313064025013243 00000000000000// ---------------------------------------------------------------------------- // // ptt.h -- PTT control // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef PTT_H_ #define PTT_H_ #include #if HAVE_LINUX_PPDEV_H || HAVE_DEV_PPBUS_PPI_H # define HAVE_PARPORT 1 #else # define HAVE_PARPORT 0 #endif #ifdef __APPLE__ # define HAVE_UHROUTER 1 # define UHROUTER_FIFO_PREFIX "/tmp/microHamRouter" #else # define HAVE_UHROUTER 0 #endif #if HAVE_TERMIOS_H # define HAVE_TTYPORT 1 #else # define HAVE_TTYPORT 0 #endif struct termios; #ifdef __MINGW32__ # include "serial.h" #endif class PTT { public: // The ptt_t enums must be defined even if the corresponding // code is not compiled. New tags go to the end of the list. enum ptt_t { PTT_INVALID = -1, PTT_NONE, PTT_HAMLIB, PTT_RIGCAT, PTT_TTY, PTT_PARPORT, PTT_UHROUTER }; PTT(ptt_t dev = PTT_NONE); ~PTT(); void set(bool on); void reset(ptt_t dev); private: ptt_t pttdev; // tty and parport int pttfd; struct termios* oldtio; #if HAVE_UHROUTER // uhrouter int uhkfd[2]; // keyer int uhfd[2]; // ptt #endif #ifdef __MINGW32__ Cserial serPort; #endif void close_all(void); void open_tty(void); void set_tty(bool ptt); void close_tty(void); #if HAVE_PARPORT void open_parport(void); void set_parport(bool ptt); void close_parport(void); #endif #if HAVE_UHROUTER void open_uhrouter(void); void set_uhrouter(bool ptt); void close_uhrouter(void); #endif }; #endif // PTT_H_ fldigi-3.21.80/src/include/record_loader_gui.h0000664000175000017500000000305412313064025016077 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef RECORD_LOADER_GUI_H #define RECORD_LOADER_GUI_H #include #include class RecordLoaderInterface ; class DerivedRecordLst : public Fl_Table { DerivedRecordLst(); DerivedRecordLst( const DerivedRecordLst & ); DerivedRecordLst & operator=( const DerivedRecordLst & ); public: DerivedRecordLst(int, int, int, int, const char * title = 0); virtual ~DerivedRecordLst(); static void cbGuiUpdate(); static void cbGuiReset(); void AddRow(int R); void DrawRow(int R); protected: void draw_cell(TableContext context, // table cell drawing int R=0, int C=0, int X=0, int Y=0, int W=0, int H=0); }; #endif // RECORD_LOADER_GUI_H fldigi-3.21.80/src/include/confdialog.h0000664000175000017500000005407012313150713014540 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0302 #ifndef confdialog_h #define confdialog_h #include #include "font_browser.h" #include "globals.h" #include "modem.h" #include "configuration.h" #include "combo.h" #include "flinput2.h" #include "flslider2.h" #include "flmisc.h" extern Fl_Double_Window *dlgConfig; extern Mode_Browser* mode_browser; void cbWaterfallFontBrowser(Fl_Widget*, void*); void cbViewerFontBrowser(Fl_Widget*, void*); void cbFreqControlFontBrowser(Fl_Widget*, void*); void set_qrzxml_buttons(Fl_Button* b); void set_qrzweb_buttons(Fl_Button* b); #include #include extern Fl_Tabs *tabsConfigure; #include extern Fl_Group *tabOperator; extern Fl_Input2 *inpMyCallsign; extern Fl_Input2 *inpMyName; extern Fl_Input2 *inpMyQth; extern Fl_Input2 *inpMyLocator; extern Fl_Input2 *inpMyAntenna; extern Fl_Group *grpNoise; #include extern Fl_Check_Button *btnNoiseOn; extern Fl_Counter2 *noiseDB; extern Fl_Group *tabUI; extern Fl_Tabs *tabsUI; extern Fl_Group *tabBrowser; extern Fl_Spinner2 *cntChannels; extern Fl_Spinner2 *cntTimeout; extern Fl_ListBox *listboxViewerLabel; #include extern Fl_Button *btnViewerFont; extern Fl_Check_Button *btnFixedIntervals; extern Fl_Check_Button *btnMarquee; extern Fl_Check_Button *btnAscend; extern Fl_Check_Button *btnBrowserHistory; extern Fl_Button *bwsrSliderColor; extern Fl_Button *bwsrSldrSelColor; #include "Viewer.h" extern Fl_Button *bwsrHiLite_1_color; extern Fl_Button *bwsrHiLite_2_color; extern Fl_Button *bwsrHiLite_even_lines; extern Fl_Button *bwsrHiLite_odd_lines; extern Fl_Button *bwsrHiLite_select; extern Fl_Group *tabContest; #include extern Fl_Box *lblSend; extern Fl_Input2 *inpSend1; extern Fl_Check_Button *btn599; extern Fl_Check_Button *btnCutNbrs; extern Fl_Check_Button *btnUseLeadingZeros; extern Fl_Value_Input2 *nbrContestStart; extern Fl_Value_Input2 *nbrContestDigits; extern Fl_Button *btnResetSerNbr; #include extern Fl_Light_Button *btnDupCheckOn; extern Fl_Check_Button *btnDupBand; extern Fl_Check_Button *btnDupMode; extern Fl_Check_Button *btnDupState; extern Fl_Check_Button *btnDupXchg1; extern Fl_Check_Button *btnDupTimeSpan; extern Fl_Value_Input2 *nbrTimeSpan; #include extern Fl_Button *btnDupColor; extern Fl_Group *tabUserInterface; extern Fl_Check_Button *btnShowTooltips; extern Fl_Check_Button *chkMenuIcons; extern Fl_ListBox *listboxScheme; extern Fl_Button *bVisibleModes; extern Fl_ListBox *listbox_language; extern Fl_Check_Button *btn_rx_lowercase; extern Fl_Check_Button *btn_tx_lowercase; extern Fl_Check_Button *btn_save_config_on_exit; extern Fl_Check_Button *btn2_save_macros_on_exit; extern Fl_Check_Button *btn2NagMe; extern Fl_Check_Button *btn2_confirm_exit; extern Fl_Check_Button *btn_check_for_updates; extern Fl_Group *tabLogServer; #include extern Fl_Input *xmllogServerAddress; extern Fl_Input *xmllogServerPort; extern Fl_Button *btn_reconnect_log_server; extern Fl_Check_Button *btnNagMe; extern Fl_Check_Button *btnClearOnSave; extern Fl_Check_Button *btnCallUpperCase; extern Fl_Check_Button *btnAutoFillQSO; extern Fl_Check_Button *btnDateTimeSort; extern Fl_Check_Button *btndate_time_force; extern Fl_Check_Button *btnRSTindefault; extern Fl_Check_Button *btnRSTdefault; #include "dxcc.h" extern Fl_Input2 *txt_cty_dat_pathname; extern Fl_Button *btn_select_cty_dat; extern Fl_Button *btn_default_cty_dat; extern Fl_Button *btn_reload_cty_dat; extern Fl_Input2 *inpMyPower; extern Fl_Check_Button *btnRXClicks; extern Fl_Check_Button *btnRXTooltips; extern Fl_Input2 *inpNonword; extern Fl_Group *tabMBars; extern Fl_Check_Button *btnMacroMouseWheel; #include extern Fl_Round_Button *btn_oneA; extern Fl_Round_Button *btn_oneB; extern Fl_Round_Button *btn_twoA; extern Fl_Round_Button *btn_twoB; extern Fl_Round_Button *btn_twoC; extern Fl_Round_Button *btn_twoD; extern Fl_Round_Button *btn_twoE; extern Fl_Round_Button *btn_twoF; extern Fl_Check_Button *btnUseLastMacro; extern Fl_Check_Button *btnDisplayMacroFilename; extern Fl_Check_Button *btn_save_macros_on_exit; extern Fl_Group *tabWF_UI; extern Fl_Check_Button *btnWF_UIrev; extern Fl_Check_Button *btnWF_UIx1; extern Fl_Check_Button *btnWF_UIwfcarrier; extern Fl_Check_Button *btnWF_UIwfshift; extern Fl_Check_Button *btnWF_UIwfreflevel; extern Fl_Check_Button *btnWF_UIwfdrop; extern Fl_Check_Button *btnWF_UIwfampspan; extern Fl_Check_Button *btnWF_UIwfstore; extern Fl_Check_Button *btnWF_UIwfmode; extern Fl_Check_Button *btnWF_UIqsy; extern Fl_Check_Button *btnWF_UIxmtlock; extern Fl_Button *btn_wf_enable_all; extern Fl_Button *btn_wf_disable_all; extern Fl_Group *tabColorsFonts; extern Fl_Tabs *tabsColors; #include "fl_digi.h" extern Fl_ListBox *listbox_charset_status; extern Fl_Input *RxText; extern Fl_Button *btnRxColor; extern Fl_Button *btnTxColor; extern Fl_Input *TxText; extern Fl_Button *btnRxFont; extern Fl_Button *btnTxFont; extern Fl_Button *btnXMIT; extern Fl_Button *btnCTRL; extern Fl_Button *btnSKIP; extern Fl_Button *btnALTR; extern Fl_Button *btnSEL; extern Fl_Button *btnNoTextColor; extern Fl_Button *btnTextDefaults; extern Fl_Box *FDdisplay; extern Fl_Button *btn_freq_control_font; extern Fl_Button *btnBackgroundColor; extern Fl_Button *btnForegroundColor; extern Fl_Button *btnFD_SystemColor; #include extern Fl_Output *LOGGINGdisplay; extern Fl_Button *btnLOGGING_color; extern Fl_Button *btn_LOGGING_font; extern Fl_Button *btnLOGGINGdefault_colors_font; extern Fl_Output *LOGBOOKdisplay; extern Fl_Button *btnLOGBOOK_color; extern Fl_Button *btn_LOGBOOK_font; extern Fl_Button *btnLOGBOOKdefault_colors_font; extern Fl_Check_Button *btnUseGroupColors; extern Fl_Button *btnGroup1; extern Fl_Button *btnGroup2; extern Fl_Button *btnGroup3; extern Fl_Button *btnFkeyTextColor; extern Fl_Button *btnFkeyDEfaults; extern Fl_Button *btnTabColor; extern Fl_Button *btnTabDefaultColor; extern Fl_Button *btnSpotColor; extern Fl_Button *btnRxIDColor; extern Fl_Button *btnTxIDColor; extern Fl_Button *btnTuneColor; extern Fl_Button *btnLkColor; extern Fl_Button *btnRevColor; extern Fl_Button *btnXmtColor; extern Fl_Button *btnAfcColor; extern Fl_Button *btnSql1Color; extern Fl_Button *btnSql2Color; extern Fl_Box *spotcolor; extern Fl_Box *rxidcolor; extern Fl_Box *txidcolor; extern Fl_Box *tunecolor; extern Fl_Box *lockcolor; extern Fl_Box *revcolor; extern Fl_Box *xmtcolor; extern Fl_Box *afccolor; extern Fl_Box *sql1color; extern Fl_Box *sql2color; extern Fl_Button *btnLowSignal; extern Fl_Box *lowcolor; extern Fl_Button *btnHighSignal; extern Fl_Box *highcolor; extern Fl_Button *btnNormalSignal; extern Fl_Box *normalcolor; extern Fl_Button *btnOverSignal; extern Fl_Box *overcolor; extern Fl_Group *tabWaterfall; extern Fl_Tabs *tabsWaterfall; #include "colorbox.h" extern colorbox *WF_Palette; extern Fl_Button *btnColor[9]; extern Fl_Button *btnLoadPalette; extern Fl_Button *btnSavePalette; extern Fl_Check_Button *btnUseCursorLines; extern Fl_Button *btnCursorBWcolor; extern Fl_Check_Button *btnUseWideCursor; extern Fl_Check_Button *btnUseCursorCenterLine; extern Fl_Button *btnCursorCenterLineColor; extern Fl_Check_Button *btnUseWideCenter; extern Fl_Check_Button *btnUseBWTracks; extern Fl_Button *btnBwTracksColor; extern Fl_Check_Button *btnUseWideTracks; extern Fl_Button *btnNotchColor; extern Fl_Check_Button *chkShowAudioScale; extern Fl_Button *btnWaterfallFont; extern Fl_Check_Button *btnViewXmtSignal; extern Fl_Value_Slider2 *valTxMonitorLevel; extern Fl_Counter2 *cntLowFreqCutoff; extern Fl_Check_Button *btnWFaveraging; extern Fl_ListBox *listboxFFTPrefilter; extern Fl_Counter2 *cntrWfwidth; extern Fl_Counter2 *wf_latency; extern Fl_Counter2 *cntrWfheight; extern Fl_Check_Button *btnWaterfallHistoryDefault; extern Fl_Check_Button *btnWaterfallQSY; extern Fl_Check_Button *btnWaterfallClickInsert; extern Fl_Input2 *inpWaterfallClickText; extern Fl_ListBox *listboxWaterfallWheelAction; extern Fl_Group *tabModems; extern Fl_Tabs *tabsModems; extern Fl_Group *tabCW; extern Fl_Tabs *tabsCW; extern Fl_Value_Slider2 *sldrCWbandwidth; #include extern Fl_Value_Output *valCWrcvWPM; #include extern Fl_Progress *prgsCWrcvWPM; extern Fl_Check_Button *btnCWuseSOMdecoding; extern Fl_Counter2 *cntLower; extern Fl_Counter2 *cntUpper; extern Fl_Check_Button *btnCWmfilt; extern Fl_Check_Button *btnCWuseFFTfilter; extern Fl_Check_Button *btnCWrcvTrack; extern Fl_Counter2 *cntCWrange; extern Fl_Value_Slider2 *sldrCWxmtWPM; extern Fl_Counter2 *cntCWdefWPM; #include extern Fl_Counter *cntCWlowerlimit; extern Fl_Counter *cntCWupperlimit; extern Fl_Value_Slider2 *sldrCWfarnsworth; extern Fl_Check_Button *btnCWusefarnsworth; extern Fl_Counter2 *cntCWweight; extern Fl_Counter2 *cntCWdash2dot; extern Fl_Counter2 *cntCWrisetime; extern Fl_ListBox *i_listboxQSKshape; extern Fl_Check_Button *btnCWnarrow; extern Fl_Check_Button *btnQSK; extern Fl_Counter2 *cntPreTiming; extern Fl_Counter2 *cntPostTiming; extern Fl_Check_Button *btnQSKadjust; extern char szTestChar[]; extern Fl_ListBox *i_listbox_test_char; extern Fl_Check_Button *btnCW_use_paren; extern Fl_ListBox *listbox_prosign[9]; extern Fl_Group *tabDomEX; extern Fl_Input2 *txtSecondary; extern Fl_Check_Button *valDominoEX_FILTER; extern Fl_Counter2 *valDominoEX_BW; extern Fl_Check_Button *chkDominoEX_FEC; extern Fl_Value_Slider2 *valDomCWI; extern Fl_Counter2 *valDominoEX_PATHS; extern Fl_Group *tabFeld; #include "fontdef.h" extern Fl_ListBox *listboxHellFont; extern Fl_Check_Button *btnBlackboard; extern Fl_Spinner2 *valHellXmtWidth; extern Fl_Check_Button *btnHellRcvWidth; extern Fl_ListBox *listboxHellPulse; extern Fl_Value_Slider2 *sldrHellBW; extern Fl_Check_Button *btnFeldHellIdle; extern Fl_Check_Button *btnHellXmtWidth; extern Fl_Group *tabMT63; extern Fl_Check_Button *btnMT63_8bit; extern Fl_Check_Button *btnMT63_rx_integration; extern Fl_Check_Button *btnMT63_usetones; extern Fl_Check_Button *btnMT63_upper_lower; extern Fl_Spinner2 *MT63_tone_duration; extern Fl_Check_Button *btnMT63_at500; extern Fl_Group *tabOlivia; extern Fl_ListBox *i_listbox_olivia_bandwidth; extern Fl_ListBox *i_listbox_olivia_tones; extern Fl_Counter2 *cntOlivia_smargin; extern Fl_Counter2 *cntOlivia_sinteg; extern Fl_Check_Button *btn_olivia_reset_fec; extern Fl_Check_Button *btnOlivia_8bit; extern Fl_Group *tabContestia; extern Fl_ListBox *i_listbox_contestia_bandwidth; extern Fl_ListBox *i_listbox_contestia_tones; extern Fl_Counter2 *cntContestia_smargin; extern Fl_Counter2 *cntContestia_sinteg; extern Fl_Check_Button *btn_contestia_reset_fec; extern Fl_Check_Button *btnContestia_8bit; extern Fl_Group *tabPSK; extern Fl_Tabs *tabsPSK; extern Fl_Counter2 *cntSearchRange; extern Fl_Counter2 *cntACQsn; extern Fl_ListBox *listbox_psk_status_timeout; extern Fl_Check_Button *btnEnablePSKbrowsing; extern Fl_Group *tabRTTY; extern Fl_Tabs *tabsRTTY; extern Fl_ListBox *i_listbox_rtty_afc_speed; extern Fl_Check_Button *chkUOSrx; #include extern Fl_Value_Input *rtty_rx_shape; extern Fl_Check_Button *btnRxTones[3]; extern Fl_Check_Button *btnPreferXhairScope; extern Fl_Check_Button *chk_true_scope; extern Fl_Check_Button *chk_useMARKfreq; extern Fl_Button *btnRTTY_mark_color; extern Fl_ListBox *selShift; extern Fl_Counter2 *selCustomShift; extern Fl_ListBox *selBaud; extern Fl_ListBox *selBits; extern Fl_ListBox *selParity; extern Fl_ListBox *selStopBits; extern Fl_Check_Button *btnAUTOCRLF; extern Fl_Counter2 *cntrAUTOCRLF; extern Fl_Check_Button *btnCRCRLF; extern Fl_Check_Button *chkUOStx; extern Fl_Check_Button *chkPseudoFSK; extern Fl_Check_Button *btnSynopAdifDecoding; extern Fl_Check_Button *btnSynopKmlDecoding; extern Fl_Check_Button *btnSynopInterleaved; extern Fl_Group *tabTHOR; extern Fl_Input2 *txtTHORSecondary; extern Fl_Check_Button *valTHOR_FILTER; extern Fl_Counter2 *valTHOR_BW; extern Fl_Value_Slider2 *valThorCWI; extern Fl_Check_Button *valTHOR_PREAMBLE; extern Fl_Check_Button *valTHOR_SOFTSYMBOLS; extern Fl_Check_Button *valTHOR_SOFTBITS; extern Fl_Counter2 *valTHOR_PATHS; extern Fl_Group *tabNavtex; extern Fl_Check_Button *btnNvtxAdifLog; extern Fl_Check_Button *btnNvtxKmlLog; extern Fl_Group *tabWefax; extern Fl_Check_Button *btnWefaxEmbeddedGui; extern Fl_Check_Button *btnWefaxHideTx; extern Fl_Check_Button *btnWefaxAdifLog; extern Fl_Counter *cntr_wefax_shift; extern Fl_Counter *ctr_wefax_max_rows; extern Fl_Input *btnWefaxSaveDir; extern Fl_Button *btnSelectFaxDestDir; extern Fl_Check_Button *btnWefaxSaveMonochrome; extern Fl_Group *tabRig; extern Fl_Tabs *tabsRig; extern Fl_Check_Button *btnPTTrightchannel; extern Fl_Group *grpHWPTT; extern Fl_Round_Button *btnTTYptt; extern Fl_ComboBox *inpTTYdev; extern Fl_Round_Button *btnRTSptt; extern Fl_Round_Button *btnRTSplusV; extern Fl_Round_Button *btnDTRptt; extern Fl_Round_Button *btnDTRplusV; extern Fl_Button *btnInitHWPTT; extern Fl_Round_Button *btnUsePPortPTT; extern Fl_Round_Button *btnUseUHrouterPTT; extern Fl_Group *grpPTTdelays; extern Fl_Counter *cntPTT_on_delay; extern Fl_Counter *cntPTT_off_delay; extern Fl_Check_Button *chkUSERIGCAT; extern Fl_Group *grpRigCAT; extern Fl_Output *txtXmlRigFilename; extern Fl_Button *btnSelectRigXmlFile; extern Fl_ComboBox *inpXmlRigDevice; extern Fl_Value_Input2 *cntRigCatRetries; extern Fl_Value_Input2 *cntRigCatTimeout; extern Fl_Value_Input2 *cntRigCatWait; extern Fl_ListBox *listbox_xml_rig_baudrate; extern Fl_Counter2 *valRigCatStopbits; extern Fl_Button *btnInitRIGCAT; extern Fl_Check_Button *btnRigCatEcho; extern Fl_Round_Button *btnRigCatCMDptt; extern Fl_Round_Button *btnRigCatRTSptt; extern Fl_Round_Button *btnRigCatDTRptt; extern Fl_Check_Button *btnRigCatRTSplus; extern Fl_Check_Button *btnRigCatDTRplus; extern Fl_Check_Button *chkRigCatRTSCTSflow; extern Fl_Check_Button *chk_restore_tio; #include "rigio.h" extern Fl_Button *btnRevertRIGCAT; extern Fl_Check_Button *chkRigCatVSP; extern Fl_Value_Input2 *cntRigCatInitDelay; extern Fl_Group *tabHamlib; extern Fl_Check_Button *chkUSEHAMLIB; extern Fl_Group *grpHamlib; extern Fl_ComboBox *cboHamlibRig; extern Fl_ComboBox *inpRIGdev; extern Fl_Value_Input2 *cntHamlibRetries; extern Fl_Value_Input2 *cntHamlibTimeout; extern Fl_Value_Input2 *cntHamlibWriteDelay; extern Fl_Value_Input2 *cntHamlibWait; extern Fl_ListBox *listbox_baudrate; extern Fl_Counter2 *valHamRigStopbits; extern Fl_Counter2 *cntHamlibTimeout0; extern Fl_Input2 *inpHamlibConfig; extern Fl_Button *btnInitHAMLIB; extern Fl_ListBox *listbox_sideband; extern Fl_Round_Button *btnHamlibCMDptt; extern Fl_Check_Button *btnHamlibDTRplus; extern Fl_Check_Button *chkHamlibRTSplus; extern Fl_Check_Button *chkHamlibRTSCTSflow; extern Fl_Check_Button *chkHamlibXONXOFFflow; extern Fl_Button *btnRevertHAMLIB; extern Fl_Group *tabXMLRPC; extern Fl_Group *grpXMLRPC; extern Fl_Check_Button *chkUSEXMLRPC; extern Fl_Button *btnInitXMLRPC; extern Fl_Group *tabSoundCard; extern Fl_Tabs *tabsSoundCard; extern Fl_Group *tabAudio; extern Fl_Group *AudioOSS; #include extern Fl_Input_Choice *menuOSSDev; extern Fl_Group *AudioPort; #include extern Fl_Choice *menuPortInDev; extern Fl_Choice *menuPortOutDev; extern Fl_Group *AudioPulse; extern Fl_Input2 *inpPulseServer; extern Fl_Group *AudioNull; extern Fl_Round_Button *btnAudioIO[4]; extern Fl_Group *tabAudioOpt; extern Fl_Group *grpAudioSampleRate; extern Fl_ListBox *menuInSampleRate; extern Fl_ListBox *menuOutSampleRate; #include extern Fl_ListBox *menuSampleConverter; extern Fl_Spinner2 *cntRxRateCorr; extern Fl_Spinner2 *cntTxRateCorr; extern Fl_Spinner2 *cntTxOffset; extern Fl_Group *tabMixer; extern void resetMixerControls(); extern Fl_Check_Button *btnMixer; extern Fl_ListBox *menuMix; extern Fl_Light_Button *btnMicIn; extern void setMixerInput(int); extern Fl_Light_Button *btnLineIn; extern void setPCMvolume(double); extern Fl_Value_Slider2 *valPCMvolume; extern Fl_Group *tabAudioRightChannel; extern Fl_Check_Button *chkForceMono; extern Fl_Check_Button *chkAudioStereoOut; extern Fl_Check_Button *chkReverseAudio; extern Fl_Check_Button *btnPTTrightchannel2; extern Fl_Check_Button *btnQSK2; extern Fl_Check_Button *chkPseudoFSK2; extern Fl_Group *tabWavFile; extern Fl_ListBox *listbox_wav_samplerate; extern Fl_Group *tabID; extern Fl_Tabs *tabsID; extern Fl_Group *tabRsID; extern Fl_Check_Button *chkRSidNotifyOnly; extern Fl_Button *bRSIDRxModes; extern Fl_Check_Button *chkRSidWideSearch; extern Fl_Check_Button *chkRSidMark; extern Fl_Check_Button *chkRSidAutoDisable; extern Fl_ListBox *listbox_rsid_errors; extern Fl_Value_Slider2 *sldrRSIDsquelch; extern Fl_Check_Button *chkRSidShowAlert; extern Fl_Check_Button *chkRetainFreqLock; extern Fl_Check_Button *chkDisableFreqChange; extern Fl_Counter *val_pretone; extern Fl_Button *bRSIDTxModes; extern Fl_Check_Button *btn_post_rsid; extern Fl_Group *tabVideoID; extern Fl_Check_Button *btnsendid; extern Fl_Check_Button *btnsendvideotext; extern Fl_Input2 *valVideotext; extern Fl_Check_Button *chkID_SMALL; extern Fl_Value_Slider2 *sldrVideowidth; extern Fl_Check_Button *btn_vidlimit; extern Fl_Check_Button *btn_vidmodelimit; extern Fl_Button *bVideoIDModes; extern Fl_Group *tabCwID; extern Fl_Group *sld; extern Fl_Check_Button *btnCWID; extern Fl_Value_Slider2 *sldrCWIDwpm; extern Fl_Button *bCWIDModes; extern Fl_Group *tabMisc; extern Fl_Tabs *tabsMisc; extern Fl_Group *tabCPUspeed; extern Fl_Check_Button *chkSlowCpu; extern Fl_Group *tabNBEMS; extern Fl_Check_Button *chkAutoExtract; extern Fl_Check_Button *chk_open_wrap_folder; extern Fl_Check_Button *chk_open_flmsg; extern Fl_Check_Button *chk_open_flmsg_print; extern Fl_Input2 *txt_flmsg_pathname; extern Fl_Button *btn_select_flmsg; #include extern Fl_Value_Slider *sldr_extract_timeout; extern Fl_Group *tabPskmail; extern Fl_Counter2 *cntServerCarrier; extern Fl_Counter2 *cntServerOffset; extern Fl_Counter2 *cntServerACQsn; extern Fl_Counter2 *cntServerAFCrange; extern Fl_Check_Button *btnPSKmailSweetSpot; extern Fl_Check_Button *btn_arq_s2n_report; extern Fl_Group *tabSpot; extern Fl_Check_Button *btnPSKRepAuto; extern Fl_Check_Button *btnPSKRepLog; extern Fl_Check_Button *btnPSKRepQRG; extern Fl_Check_Button *btn_report_when_visible; extern Fl_Input2 *inpPSKRepHost; extern Fl_Input2 *inpPSKRepPort; extern Fl_Button *btnPSKRepInit; extern Fl_Box *boxPSKRepMsg; extern Fl_Group *tabSweetSpot; extern Fl_Value_Input2 *valCWsweetspot; extern Fl_Value_Input2 *valRTTYsweetspot; extern Fl_Value_Input2 *valPSKsweetspot; extern Fl_Check_Button *btnStartAtSweetSpot; extern Fl_Check_Button *btnCWIsLSB; extern Fl_Group *tabText_IO; extern Fl_Group *grpTalker; extern void open_talker(); extern void close_talker(); extern Fl_Light_Button *btnConnectTalker; extern Fl_Check_Button *btn_auto_talk; extern Fl_Check_Button *chkRxStream; extern Fl_Group *tabDTMF; extern Fl_Check_Button *chkDTMFdecode; extern Fl_Group *tabWX; extern Fl_Input *inpWXsta; extern Fl_Check_Button *btn_wx_full; extern Fl_Check_Button *btn_wx_station_name; extern Fl_Check_Button *btn_wx_condx; extern Fl_Check_Button *btn_wx_fahrenheit; extern Fl_Check_Button *btn_wx_celsius; extern Fl_Check_Button *btn_wx_mph; extern Fl_Check_Button *btn_wx_kph; extern Fl_Check_Button *btn_wx_inches; extern Fl_Check_Button *btn_wx_mbars; #include "weather.h" extern Fl_Button *btn_metar_search; extern Fl_Group *tabKML; extern Fl_Input *btnKmlSaveDir; extern Fl_Input *inputKmlRootFile; extern Fl_Counter *cntKmlMergeDistance; extern Fl_Counter *cntKmlRetentionTime; extern Fl_Spinner2 *cntKmlRefreshInterval; extern Fl_ListBox *listbox_kml_balloon_style; extern Fl_Input *btnKmlCommand; extern Fl_Button *btlTestKmlCommand; extern Fl_Button *btnSelectKmlDestDir; extern Fl_Button *btlPurge; extern Fl_Check_Button *btnKmlPurgeOnStartup; extern Fl_Group *tabQRZ; extern Fl_Tabs *tabsQRZ; extern Fl_Round_Button *btnQRZWEBnotavailable; extern Fl_Round_Button *btnQRZonline; extern Fl_Round_Button *btnHAMCALLonline; extern Fl_Round_Button *btnHamQTHonline; extern Fl_Round_Button *btnQRZXMLnotavailable; extern Fl_Round_Button *btnQRZcdrom; extern Fl_Round_Button *btnQRZsub; extern Fl_Round_Button *btnHamcall; extern Fl_Round_Button *btnHamQTH; extern Fl_Round_Button *btnCALLOOK; extern Fl_Input2 *txtQRZpathname; extern Fl_Input2 *inpQRZusername; extern Fl_Input2 *inpQRZuserpassword; extern Fl_Button *btnQRZpasswordShow; extern Fl_Check_Button *btn_notes_address; extern Fl_Input2 *inpEQSL_id; extern Fl_Input2 *inpEQSL_pwd; extern Fl_Button *btnEQSL_pwd_show; extern Fl_Input2 *inpEQSL_nick; extern Fl_Check_Button *btn_send_when_logged; extern Fl_Input2 *txt_eqsl_default_message; extern Fl_Box *eqsl_txt1; extern Fl_Box *eqsl_txt2; extern Fl_Box *eqsl_txt3; extern Fl_Check_Button *btn_send_datetime_off; extern Fl_Group *tabAutoStart; extern Fl_Input2 *txt_auto_flrig_pathname; extern Fl_Button *btn_select_flrig; extern Fl_Input2 *txt_auto_flamp_pathname; extern Fl_Button *btn_select_auto_flamp; extern Fl_Input2 *txt_auto_flnet_pathname; extern Fl_Button *btn_select_auto_flnet; extern Fl_Input2 *txt_auto_fllog_pathname; extern Fl_Button *btn_select_fllog; extern Fl_Input2 *txt_auto_prog1_pathname; extern Fl_Button *btn_select_prog1; extern Fl_Input2 *txt_auto_prog2_pathname; extern Fl_Button *btn_select_prog2; extern Fl_Input2 *txt_auto_prog3_pathname; extern Fl_Button *btn_select_prog3; extern Fl_Check_Button *btn_flrig_auto_enable; extern Fl_Check_Button *btn_flamp_auto_enable; extern Fl_Check_Button *btn_flnet_auto_enable; extern Fl_Check_Button *btn_fllog_auto_enable; extern Fl_Check_Button *btn_prog1_auto_enable; extern Fl_Check_Button *btn_prog2_auto_enable; extern Fl_Check_Button *btn_prog3_auto_enable; extern Fl_Button *btn_test_flrig; extern Fl_Button *btn_test_flamp; extern Fl_Button *btn_test_flnet; extern Fl_Button *btn_test_fllog; extern Fl_Button *btn_test_prog1; extern Fl_Button *btn_test_prog2; extern Fl_Button *btn_test_prog3; extern Fl_Button *btnSaveConfig; #include extern Fl_Return_Button *btnCloseConfig; extern Fl_Button *btnResetConfig; Fl_Double_Window* ConfigureDialog(); void openConfig(); void closeDialog(); void createConfig(); class Fl_File_Chooser ; void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata); void KmlDestDirSet(Fl_File_Chooser *w, void *userdata); void make_window(); #endif fldigi-3.21.80/src/include/qrunner.h0000664000175000017500000001506512313064025014126 00000000000000// ---------------------------------------------------------------------------- // qrunner.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef QRUNNER_H_ #define QRUNNER_H_ #ifndef NDEBUG # include # include "debug.h" #endif #include #include #include #include #if HAVE_STD_BIND # include namespace qrbind { using std::bind; }; #elif HAVE_STD_TR1_BIND # include namespace qrbind { using std::tr1::bind; }; #else # error need std::bind or std::tr1::bind #endif #include "threads.h" #include "qrunner/fqueue.h" #ifndef __MINGW32__ # define QRUNNER_READ(fd__, buf__, len__) read(fd__, buf__, len__) # define QRUNNER_WRITE(fd__, buf__, len__) write(fd__, buf__, len__) #else # define QRUNNER_READ(fd__, buf__, len__) recv(fd__, (char*)buf__, len__, 0) # define QRUNNER_WRITE(fd__, buf__, len__) send(fd__, (const char*)buf__, len__, 0) #endif class qexception : public std::exception { public: qexception(const char *msg_) : msg(msg_) { } qexception(int e) : msg(strerror(e)) { } ~qexception() throw() { } const char *what(void) const throw() { return msg.c_str(); } private: std::string msg; }; struct fsignal { typedef void result_type; pthread_mutex_t* m; pthread_cond_t* c; fsignal(pthread_mutex_t* m_, pthread_cond_t* c_) : m(m_), c(c_) { } void operator()(void) const { pthread_mutex_lock(m); pthread_cond_signal(c); pthread_mutex_unlock(m); } }; struct nop { typedef void result_type; void operator()(void) const { } }; class qrunner { public: qrunner(); ~qrunner(); void attach(void); void detach(void); template bool request(const F& f) { if (fifo->push(f)) { #ifdef NDEBUG if (unlikely(QRUNNER_WRITE(pfd[1], "", 1) != 1)) throw qexception(errno); #else assert(QRUNNER_WRITE(pfd[1], "", 1) == 1); #endif return true; } #ifndef NDEBUG //Remi's extra debugging info LOG_ERROR("qrunner: thread %" PRIdPTR " fifo full!", GET_THREAD_ID()); LOG_ERROR("qrunner: thread %" PRIdPTR " fifo full at %s!", GET_THREAD_ID(),typeid(F).name() ); #endif return false; } template bool request_sync(const F& f) { if (!attached) return request(f); for (;;) { if (request(f)) break; sched_yield(); } static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t c = PTHREAD_COND_INITIALIZER; fsignal s(&m, &c); pthread_mutex_lock(&m); for (;;) { if (request(s)) break; sched_yield(); } pthread_cond_wait(&c, &m); pthread_mutex_unlock(&m); return true; } static void execute(int fd, void *arg); void flush(void); void drop(void) { fifo->drop(); } size_t size(void) { return fifo->size(); } protected: fqueue *fifo; int pfd[2]; bool attached; bool inprog; public: bool drop_flag; }; extern qrunner *cbq[NUM_QRUNNER_THREADS]; #if BENCHMARK_MODE #define REQ(...) ((void)0) #define REQ_DROP(...) ((void)0) #define REQ_SYNC(...) ((void)0) #define REQ_FLUSH(...) ((void)0) #define QRUNNER_DROP(...) ((void)0) #else #define REQ REQ_ASYNC #define REQ_DROP REQ_ASYNC_DROP #define REQ_ASYNC(...) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) \ cbq[GET_THREAD_ID()]->request(qrbind::bind(__VA_ARGS__)); \ else \ qrbind::bind(__VA_ARGS__)(); \ } while (0) #define REQ_SYNC(...) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) \ cbq[GET_THREAD_ID()]->request_sync(qrbind::bind(__VA_ARGS__)); \ else \ qrbind::bind(__VA_ARGS__)(); \ } while (0) #define REQ_ASYNC_DROP(...) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) { \ if (unlikely(cbq[GET_THREAD_ID()]->drop_flag)) \ break; \ cbq[GET_THREAD_ID()]->request(qrbind::bind(__VA_ARGS__)); \ } \ else \ qrbind::bind(__VA_ARGS__)(); \ } while (0) #define REQ_SYNC_DROP(...) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) { \ if (unlikely(cbq[GET_THREAD_ID()]->drop_flag)) \ break; \ cbq[GET_THREAD_ID()]->request_sync(qrbind::bind(__VA_ARGS__)); \ } \ else \ qrbind::bind(__VA_ARGS__)(); \ } while (0) #define REQ_FLUSH(t_) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) \ cbq[GET_THREAD_ID()]->request_sync(nop()); \ else if (t_ < NUM_QRUNNER_THREADS) \ cbq[t_]->flush(); \ else \ for (int i = 0; i < NUM_QRUNNER_THREADS; i++) \ cbq[i]->flush(); \ } while (0) #define QRUNNER_DROP(v_) \ do { \ if ((GET_THREAD_ID() != FLMAIN_TID)) \ cbq[GET_THREAD_ID()]->drop_flag = v_; \ } while (0) #endif // BENCHMARK_MODE #endif // QRUNNER_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-3.21.80/src/include/qso_db.h0000664000175000017500000000710312313064025013675 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef QSO_DB #define QSO_DB #include #include #include #include "adif_def.h" using namespace std; enum COMPTYPE {COMPTIME, COMPDATE, COMPCALL, COMPFREQ, COMPMODE}; class cQsoDb; class cQsoRec; class cQsoRec { friend int compareCalls (const cQsoRec &, const cQsoRec &); friend int compareDates (const cQsoRec &, const cQsoRec &); friend int compareTimes (const cQsoRec &, const cQsoRec &); friend int compareModes (const cQsoRec &, const cQsoRec &); friend int compareFreqs (const cQsoRec &, const cQsoRec &); friend std::ostream &operator<<( std::ostream &, const cQsoRec &); friend std::istream &operator>>( std::istream &, cQsoRec & ); private: string qsofield[NUMFIELDS]; bool normal; // sort ordering public: cQsoRec (); ~cQsoRec (); void putField (int, const char *); void putField (int, const char *, int); void addtoField (int, const char *); const char *getField (int) const; void trimFields(); void clearRec (); int validRec(); void checkBand(); void checkDateTimes(); void setDateTime(bool dtOn); void setFrequency(long long freq); // operator overloads const cQsoRec &operator=(const cQsoRec &); bool operator==(const cQsoRec &) const; bool operator<(const cQsoRec &) const; bool operator!=(const cQsoRec &right) const { return !( *this == right); } bool operator<=(const cQsoRec &right) const { if (*this < right || *this == right) return true; return false; } bool operator>(const cQsoRec &right) const { return !(*this <= right); } }; class cQsoDb { private: cQsoRec * qsorec; int maxrecs; int nbrrecs; int dirty; static const int jdays[][13]; bool isleapyear( int y ) const; int dayofyear (int year, int mon, int mday); unsigned long epoch_dt (const char *szdate, const char *sztime); public: cQsoDb (); cQsoDb (cQsoDb *); ~cQsoDb (); static bool reverse; void deleteRecs(); void clearDatabase(); void isdirty(int n) {dirty = n;} int isdirty() const {return dirty;} void qsoNewRec (cQsoRec *); cQsoRec *newrec(); void qsoDelRec (int); void qsoUpdRec (int, cQsoRec *); int qsoFindRec (cQsoRec *); cQsoRec *getRec (int n) {return &qsorec[n];}; int nbrRecs () const {return nbrrecs;}; bool qsoIsValidFile(const char *); int qsoReadFile (const char *); int qsoWriteFile (const char *); void SortByDate(bool); void SortByCall (); void SortByMode (); void SortByFreq (); void sort_reverse(bool rev) { reverse = rev;} const cQsoRec *recarray() { return qsorec; } bool duplicate( const char *callsign, const char *date, const char *time, unsigned int interval, bool chkdatetime, const char *freq, bool chkfreq, const char *state, bool chkstate, const char *mode, bool chkmode, const char *xchg1, bool chkxchg1 ); }; #endif fldigi-3.21.80/src/include/adif_def.h0000664000175000017500000000217612312610206014151 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef ADIF_DEF #define ADIF_DEF #include #include #include #include "field_def.h" using namespace std; struct FIELD { int type; const char *name; Fl_Check_Button **btn; }; extern FIELD fields[]; #endif fldigi-3.21.80/src/include/thorvaricode.h0000664000175000017500000000205112313064025015114 00000000000000// ---------------------------------------------------------------------------- // thorvaricode.h -- DEX Varicode // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _DEXVARICODE_H #define _DEXVARICODE_H extern const char *thorvarienc(int c, int secondary); extern int thorvaridec(unsigned int symbol); #endif fldigi-3.21.80/src/include/configuration.h0000664000175000017500000042726412313147652015323 00000000000000// ---------------------------------------------------------------------------- // configuration.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _CONFIGURATION_H #define _CONFIGURATION_H #include #include #include "rtty.h" #include "waterfall.h" #include "lookupcall.h" #include "psk_browser.h" #if defined(__linux__) # define DEFAULT_PTTDEV "/dev/ttyS0" # define DEFAULT_CWFSKPORT "/dev/ttyS1" # define DEFAULT_HAMRIGDEVICE "/dev/ttyS0" #elif defined(__FreeBSD__) # define DEFAULT_PTTDEV "/dev/ttyd0" # define DEFAULT_CWFSKPORT "/dev/ttyd1" # define DEFAULT_HAMRIGDEVICE "/dev/ttyd0" #elif defined(__NetBSD__) # define DEFAULT_PTTDEV "/dev/tty00" # define DEFAULT_CWFSKPORT "/dev/tty01" # define DEFAULT_HAMRIGDEVICE "/dev/tty00" #elif defined(__OpenBSD__) # define DEFAULT_PTTDEV "/dev/tty00" # define DEFAULT_CWFSKPORT "/dev/tty01" # define DEFAULT_HAMRIGDEVICE "/dev/tty00" #elif defined(__WOE32__) # define DEFAULT_PTTDEV "COM1" # define DEFAULT_CWFSKPORT "COM2" # define DEFAULT_HAMRIGDEVICE "COM1" #else // not sure # define DEFAULT_PTTDEV "/dev/ptt" # define DEFAULT_CWFSKPORT "/dev/fsk" # define DEFAULT_HAMRIGDEVICE "/dev/rig" #endif // Format: ELEM_(TYPE, VARIABLE-NAME, TAG-STRING, DOC-STRING, DEFAULT-VALUE) // Variables that are not saved to the xml file have empty TAG-STRINGs and DOC-STRINGs // // No preprocessor directives or C++ comments inside this macro! // Indent with spaces only. #ifdef ELEM_ # error ELEM_ should not be defined at this point #endif #define CONFIG_LIST \ ELEM_(bool, confirmExit, "CONFIRMEXIT", \ "Ensure user wants to leave flgidi", \ false) \ ELEM_(bool, SaveConfig, "SAVECONFIG", \ "Save current configuration on exit", \ false) \ ELEM_(bool, noise, "NOISETEST", \ "Noise test on/off", \ false) \ ELEM_(double, s2n, "SIGNAL2NOISE", \ "Signal to Noise ratio for test", \ +20.0) \ ELEM_(bool, rsidWideSearch, "RSIDWIDESEARCH", \ "RSID detector searches the entire passband", \ false) \ ELEM_(int, rsid_squelch, "RSIDSQUELCH", \ "RSID detection opens squelch for nn seconds", \ 5) \ ELEM_(bool, rsid, "RECEIVERSID", \ "Enable Reed Soloman ID decoding", \ false) \ ELEM_(bool, TransmitRSid, "TRANSMITRSID", \ "Send RSID at beginning and end of transmission", \ false) \ ELEM_(bool, rsid_mark, "RSIDMARK", \ "Append marker (for the previous modem and frequency) to the RX text\n" \ "widget before changing to the new modem and/or frequency", \ true) \ ELEM_(bool, rsid_notify_only, "RSIDNOTIFYONLY", \ "Trigger RSID notifications but do not change modem and frequency", \ false) \ ELEM_(bool, rsid_auto_disable, "RSIDAUTODISABLE", \ "Disable RSID detection when RsID signal is detected", \ false) \ ELEM_(bool, rsid_post, "RSIDPOST", \ "Transmit an RSID signal when modem data is concluded", \ false) \ ELEM_(mode_set_t, rsid_rx_modes, "RSIDRXMODESEXCLUDE", \ "Mode names for which RSID reception is disabled", \ mode_set_t()) \ ELEM_(mode_set_t, rsid_tx_modes, "RSIDTXMODESEXCLUDE", \ "Mode names for which RSID transmission is disabled", \ mode_set_t()) \ \ ELEM_(int, RsID_label_type, "RSID_ERRORS", \ "values (low, medium, high) 0, 1, 2", \ 1) \ ELEM_(bool, disable_rsid_warning_dialog_box, "DISABLE_RSID_WARNING_DIALOG_BOX", \ "disable displaying the rsid warning dialog box", \ false) \ ELEM_(bool, slowcpu, "SLOWCPU", \ "Disable expensive processing in some decoders", \ true) \ ELEM_(bool, disable_rsid_freq_change, "DISABLERSIDFREQCHANGE", \ "disable changing frequency on rsid modem change/reset", \ false) \ ELEM_(bool, retain_freq_lock, "RETAINFREQLOCK", \ "retain frequency lock on rsid modem change/reset", \ false) \ ELEM_(bool, changed, "", "", false) \ \ ELEM_(double, wfRefLevel, "WFREFLEVEL", \ "Waterfall reference level (dB)", \ -20.0) \ ELEM_(double, wfAmpSpan, "WFAMPSPAN", \ "Waterfall amplitude span (dB)", \ 70.0) \ ELEM_(bool, WF_UIrev, "WF_UIREV", \ "WF_UI - enable reverse button", \ false) \ ELEM_(bool, WF_UIx1, "WF_UIX1", \ "WF_UI - enable scale multiplication button", \ false) \ ELEM_(bool, WF_UIwfcarrier, "WF_UIWFCARRIER", \ "WF_UI - enable wf carrier button", \ false) \ ELEM_(bool, WF_UIwfshift, "WF_UIWFSHIFT", \ "WF_UI - enable wf shift buttons", \ false) \ ELEM_(bool, WF_UIwfreflevel, "WF_UIWFREFLEVEL", \ "WF_UI - enable rf level and range controls", \ false) \ ELEM_(bool, WF_UIwfdrop, "WF_UIWFDROP", \ "WF_UI - enable wf drop rate control", \ false) \ ELEM_(bool, WF_UIwfampspan, "WF_UIWFAMPSPAN", \ "WF_UI - enable wf amp span control", \ false) \ ELEM_(bool, WF_UIwfstore, "WF_UIWFSTORE", \ "WF_UI - enable wf memory store button", \ false) \ ELEM_(bool, WF_UIwfmode, "WF_UIWFMODE", \ "WF_UI - enable wf mode control", \ false) \ ELEM_(bool, WF_UIqsy, "WF_UIQSY", \ "WF_UI - enable wf qsy button", \ false) \ ELEM_(bool, WF_UIxmtlock, "WF_UIXMTLOCK", \ "WF_UI - enable wf transmit lock button", \ false) \ ELEM_(int, LowFreqCutoff, "LOWFREQCUTOFF", \ "Lowest frequency shown on waterfall (Hz)", \ 0) \ ELEM_(int, HighFreqCutoff, "HIGHFREQCUTOFF", \ "Highest frequency shown on waterfall (Hz)", \ 3000) \ ELEM_(double, CWsweetspot, "CWSWEETSPOT", \ "Default CW tracking point (Hz)", \ 1000) \ ELEM_(double, RTTYsweetspot, "RTTYSWEETSPOT", \ "Default RTTY tracking point (Hz)", \ 1000) \ ELEM_(double, PSKsweetspot, "PSKSWEETSPOT", \ "Default tracking point for all other modems (Hz)", \ 1000) \ ELEM_(bool, StartAtSweetSpot, "STARTATSWEETSPOT", \ "Always start new modems at sweet spot frequencies", \ false) \ ELEM_(bool, CWOffset, "CWOFFSET", \ "Select if waterfall should compensate for BFO offset in CW", \ false) \ ELEM_(bool, CWIsLSB, "CWISLSB", \ "Select if BFO is injected as LSB instead of USB", \ false) \ ELEM_(bool, WaterfallHistoryDefault, "WATERFALLHISTORYDEFAULT", \ "Replay audio history when changing frequency by clicking on\n" \ "the waterfall", \ false) \ ELEM_(bool, WaterfallQSY, "WATERFALLQSY", \ "Change rig frequency by dragging the mouse cursor on the waterfall\n" \ "frequency scale area", \ false) \ ELEM_(bool, WaterfallClickInsert, "WATERFALLCLICKINSERT", \ "Insert text to the RX text widget when changing frequency by left\n" \ "clicking on the waterfall", \ false) \ ELEM_(std::string, WaterfallClickText, "WATERFALLCLICKTEXT", \ "Waterfall left click text for WATERFALLCLICKINSERT", \ "\n\n") \ ELEM_(int, WaterfallWheelAction, "WATERFALLWHEELACTION", \ "Describes how waterfall mouse wheel events are handled\n" \ " 0: do nothing; 1: change AFC width or decoder bandwidth;\n" \ " 2: signal search; 3: change squelch level; 4: change modem carrier;\n" \ " 5: change modem; 6: scroll visible area. The default is 4.", \ waterfall::WF_CARRIER) \ ELEM_(bool, rx_lowercase, "RX_LOWERCASE", \ "Print Rx in lowercase for CW, RTTY, CONTESTIA and THROB", \ false) \ ELEM_(bool, tx_lowercase, "TX_LOWERCASE", \ "Transmit all text in lowercase", \ false) \ /* PSK, filter can be 0, 1, 2, 3 or 4 */ \ ELEM_(int, PSK_filter, "PSKFILTER", \ "Not configurable; must always be 0", \ 0) \ ELEM_(bool, pskbrowser_on, "PSKBROWSER_ON", \ "Enable psk multi-channel detector - disable for very slow cpus", \ true) \ /* PSK / PSKmail interface */ \ ELEM_(int, SearchRange, "PSKSEARCHRANGE", \ "PSK signal acquisition search range (Hz)", \ 50) \ ELEM_(double, ACQsn, "ACQSN", \ "PSK signal acquisition S/N (dB)", \ 9.0) \ ELEM_(bool, Pskmails2nreport, "PSKMAILS2NREPORT", \ "Send s2n report to pskmail client/server", \ false) \ ELEM_(bool, StatusDim, "STATUSDIM", \ "Behaviour of status (S/N and IMD) fields:\n" \ " 0: Clear after timeout\n" \ " 1: Dim after timeout\n", \ true) \ ELEM_(double, StatusTimeout, "STATUSTIMEOUT", \ "Dim or Clear timeout (seconds)", \ 15.0) \ ELEM_(bool, PSKmailSweetSpot, "PSKMAILSWEETSPOT", \ "Reset to carrier when no signal is present", \ false) \ ELEM_(int, ServerOffset, "PSKSERVEROFFSET", \ "Listen for signals within this range (Hz)", \ 50) \ ELEM_(int, ServerCarrier, "PSKSERVERCARRIER", \ "Default PSKMail listen / transmit frequency", \ 1500) \ ELEM_(int, ServerAFCrange, "PSKSERVERAFCRANGE", \ "Limit AFC movement to this range (Hz)", \ 25) \ ELEM_(double, ServerACQsn, "PSKSERVERACGSN", \ "Acquisition S/N (dB)", \ 9.0) \ /* RTTY */ \ ELEM_(int, kahn_demod, "KAHNDEMOD", \ "1 - use Kahn power demodulator\n" \ "0 - use ATC (Kok Chen) demodulator", \ 1) \ ELEM_(bool, true_scope, "TRUESCOPE", \ "Enabled - XY scope displays Mark/Space channel signals\n" \ "Disabled - XY scope displays pseudo M/S signals", \ true) \ ELEM_(int, rtty_shift, "RTTYSHIFT", \ "Carrier shift (Hz). Values are as follows:\n" \ " 0: 23; 1: 85; 2: 160; 3: 170; 4: 182; 5: 200; 6: 240; 7: 350;\n" \ " 8: 425; 9: 850; -1: custom", \ 3) /* 170 */ \ ELEM_(int, rtty_custom_shift, "RTTYCUSTOMSHIFT", \ "Custom shift (Hz)", \ 450) \ ELEM_(double, RTTY_BW, "RTTYBW", \ "Receive filter bandwidth (Hz)", \ 68.0) \ ELEM_(int, rtty_cwi, "RTTYCWI", \ "Selective decoding of mark/space tones\n" \ "0 - both\n" \ "1 - mark only\n" \ "2 - space only", \ 0) \ ELEM_(double, rtty_filter, "RTTYFILTER", \ "Rtty Rx Filter shape factor, K * (t/T)\n" \ "You may alter this value using a text editor\n" \ "change will be effective when restarting fldigi\n" \ "K = 1.25; best for W1HKJ (default)\n" \ "K = 1.5 - best for DO2SMF", \ 1.25) \ ELEM_(int, rtty_baud, "RTTYBAUD", \ "Carrier baud rate. Values are as follows:\n" \ " 1: 45; 1: 45.45; 2: 50; 3: 56; 4: 75; 5: 100; 6: 110; 7: 150; \n" \ " 8: 200; 9: 300", \ 0) /* 45 */ \ ELEM_(int, rtty_bits, "RTTYBITS", \ "Bits per character. Values are as follows:\n" \ " 0: 5 (baudot); 1: 7 (ascii); 2: 8 (ascii)", \ 0) /* 5 */ \ ELEM_(int, rtty_parity, "RTTYPARITY", \ "Parity. Values are as folows:\n" \ " 0: none; 1: even; 2: odd: 3: zero; 4: one", \ RTTY_PARITY_NONE) \ ELEM_(int, rtty_stop, "RTTYSTOP", \ "Stop bits. Values are as folows:\n" \ " 0: 1; 1: 1.5; 2: 2", \ 1) /* 1.5 */ \ ELEM_(bool, rtty_reverse, "RTTYREVERSE", \ "This setting is currently unused", \ false) \ ELEM_(bool, rtty_msbfirst, "RTTYMSBFIRST", \ "This setting is currently unused", \ false) \ ELEM_(bool, rtty_crcrlf, "RTTYCRCLF", \ "Use \"CR CR LF\" for \"CR LF\"", \ false) \ ELEM_(bool, rtty_autocrlf, "RTTYAUTOCRLF", \ "Automatically add CRLF after `page width' characters", \ true) \ ELEM_(int, rtty_autocount, "RTTYAUTOCOUNT", \ "Page width for RTTYAUTOCRLF", \ 72) \ ELEM_(int, rtty_afcspeed, "RTTYAFCSPEED", \ "AFC tracking speed. Values are as follows:\n" \ " 0: slow; 1: normal; 2: fast", \ 1) /* normal */ \ ELEM_(bool, useFSKkeyline, "", "", false) \ ELEM_(bool, useFSKkeylineDTR, "", "", false) \ ELEM_(bool, FSKisLSB, "", "", true) \ ELEM_(bool, useUART, "", "", false) \ ELEM_(bool, PreferXhairScope, "PREFERXHAIRSCOPE", \ "Default to crosshair digiscope", \ false) \ ELEM_(bool, PseudoFSK, "PSEUDOFSK", \ "Generate Pseudo-FSK signal on right audio channel", \ false) \ ELEM_(bool, SynopAdifDecoding, "SYNOPADIFDECODING", \ "Decoding of Synop weather information on RTTY to ADIF log", \ false) \ ELEM_(bool, SynopKmlDecoding, "SYNOPKMLDECODING", \ "Decoding of Synop weather information on RTTY to KML file", \ false) \ ELEM_(bool, SynopInterleaved, "SYNOPINTERLEAVED", \ "Decoding of Synop interleaved with coded text, or replaces it", \ false) \ ELEM_(bool, UOSrx, "UOSRX", \ "Revert to unshifted chars on a space (RX)", \ true) \ ELEM_(bool, UOStx, "UOSTX", \ "Revert to unshifted chars on a space (TX)", \ true) \ ELEM_(bool, useMARKfreq, "USEMARKFREQ", \ "Use MARK frequency for logging", \ true) \ /* CW */ \ ELEM_(bool, useCWkeylineRTS, "", "", false) \ ELEM_(bool, useCWkeylineDTR, "", "", false) \ ELEM_(int, CWweight, "CWWEIGHT", \ "Dot to dot-space ratio", \ 50) \ ELEM_(int, CWspeed, "CWSPEED", \ "Transmit speed (WPM)", \ 18) \ ELEM_(int, CWfarnsworth, "CWFARNSWORTH", \ "Speed for Farnsworth timing (WPM)", \ 18) \ ELEM_(bool, CWusefarnsworth, "CWUSEFARNSWORTH", \ "Use Farnsworth timing", \ false) \ ELEM_(int, defCWspeed, "CWDEFSPEED", \ "Default speed (WPM)", \ 24) \ ELEM_(int, CWbandwidth, "CWBANDWIDTH", \ "Filter bandwidth (Hz)", \ 150) \ ELEM_(double, CWlower, "CWLOWER", \ "Detector hysterisis, lower threshold", \ 0.4) \ ELEM_(double, CWupper, "CWUPPER", \ "Detector hysterisis, upper threshold", \ 0.6) \ ELEM_(int, CWmfiltlen, "CWMFILTLEN", \ "Matched Filter length", \ 100) \ ELEM_(bool, CWtrack, "CWTRACK", \ "Automatic receive speed tracking", \ true) \ ELEM_(bool, CWmfilt, "CWMFILT", \ "Matched Filter in use", \ false) \ ELEM_(bool, CWuse_fft_filter, "CWUSEFFTFILTER", \ "Use FFT overlap and add convolution filter", \ false) \ ELEM_(bool, CWuseSOMdecoding, "CWUSESOMDECODING", \ "Self Organizing Map decoding", \ false) \ ELEM_(int, CWrange, "CWRANGE", \ "Tracking range for CWTRACK (WPM)", \ 10) \ ELEM_(int, CWlowerlimit, "CWLOWERLIMIT", \ "Lower RX limit (WPM)", \ 5) \ ELEM_(int, CWupperlimit, "CWUPPERLIMIT", \ "Upper TX limit (WPM)", \ 50) \ ELEM_(double, CWrisetime, "CWRISETIME", \ "Leading and trailing edge rise times (milliseconds)", \ 4.0) \ ELEM_(double, CWdash2dot, "CWDASH2DOT", \ "Dash to dot ratio", \ 3.0) \ ELEM_(bool, QSK, "QSK", \ "Generate QSK signal on right audio channel", \ false) \ ELEM_(double, CWpre, "CWPRE", \ "Pre-keydown timing (milliseconds)", \ 4.0) \ ELEM_(double, CWpost, "CWPOST", \ "Post-keydown timing (milliseconds)", \ 4.0) \ ELEM_(bool, CWid, "CWID", \ "Send callsign in CW at the end of every transmission", \ false) \ ELEM_(int, CWIDwpm, "IDWPM", \ "CW ID speed (WPM)", \ 18) \ ELEM_(mode_set_t, cwid_modes, "CWIDMODESEXCLUDE", \ "Mode names for which CWID transmission is disabled", \ mode_set_t()) \ ELEM_(bool, QSKadjust, "QSKADJUST", \ "Send a continuous stream of test characters as the QSK signal", \ false) \ ELEM_(int, TestChar, "TESTCHAR", \ "Test character for QSKADJUST (ASCII value)", \ 0) \ ELEM_(int, QSKshape, "QSKSHAPE", \ "QSK edge shape. Values are as follows:\n" \ " 0: Hanning; 1: Blackman.\n" \ "Raised cosine = Hanning.\n", \ 0) /* Hanning */ \ ELEM_(bool, CWnarrow, "CWNARROW", \ "Weight decreases with increasing edge timing", \ false) \ ELEM_(bool, CW_use_paren, "CWUSEPAREN", \ "Use open paren character; typically used in MARS ops", \ false) \ ELEM_(std::string, CW_prosigns, "CWPROSIGNS", \ "CW prosigns BT AA AS AR SK KN INT HM VE", \ "=~<>%+&{}") \ /* FELD HELL */ \ ELEM_(double, HELL_BW, "HELL_BW0", "Feld Hell working bandwidth", 245.0) \ ELEM_(double, HELL_BW_FH, "HELL_BW1", "FH bandwidth", 245.0) \ ELEM_(double, HELL_BW_SH, "HELL_BW2", "Slow Hell bandwidth", 30.0) \ ELEM_(double, HELL_BW_X5, "HELL_BW3", "X5 Hell bandwidth", 1225.) \ ELEM_(double, HELL_BW_X9, "HELL_BW4", "X9 Hell bandwidth", 2205.0) \ ELEM_(double, HELL_BW_FSK, "HELL_BW5", "FSK Hell bandwidth", 180.0) \ ELEM_(double, HELL_BW_FSK105, "HELL_BW6", "FSK105 Hell bandwidth", 100.0) \ ELEM_(double, HELL_BW_HELL80, "HELL_BW7", "HELL80 bandwidth", 450.0) \ ELEM_(bool, HellRcvWidth, "HELLRCVWIDTH", \ "Halve receive width (compress RX in time)", \ false) \ ELEM_(bool, HellBlackboard, "HELLBLACKBOARD", \ "Display RX in reverse video", \ false) \ ELEM_(int, HellXmtWidth, "HELLXMTWIDTH", \ "Transmit width (number of multiple scans per character line)", \ 1) \ ELEM_(bool, HellXmtIdle, "HELLXMTIDLE", \ "Transmit periods (.) when idle", \ false) \ ELEM_(bool, HellPulseFast, "HELLPULSEFAST", \ "Raised cosine pulse shape factor. Values are as follows:\n" \ " 0: slow (4 ms); 1: fast (2 ms).", \ false) /* slow */ \ /* OLIVIA */ \ ELEM_(int, oliviatones, "OLIVIATONES", \ "Number of tones. Values are as follows:\n" \ " 0: 2; 1: 4; 2: 8; 3: 16; 4: 32; 5: 64; 6: 128; 7: 256", \ 2) /* 8 */ \ ELEM_(int, oliviabw, "OLIVIABW", \ "Bandwidth (Hz). Values are as follows:\n" \ " 0: 125; 1: 250; 2: 500; 3: 1000; 4: 2000.", \ 2) /* 500 */ \ ELEM_(int, oliviasmargin, "OLIVIASMARGIN", \ "Tune margin (tone frequency spacing)", \ 8) \ ELEM_(int, oliviasinteg, "OLIVIASINTEG", \ "Integration period (FEC blocks)", \ 4) \ ELEM_(bool, olivia_reset_fec, "OLIVIARESETFEC", \ "Force Integration (FEC) depth to be reset when new BW/Tones selected", \ false) \ ELEM_(bool, olivia8bit, "OLIVIA8BIT", \ "8-bit extended characters", \ true) \ /* CONTESTIA */ \ ELEM_(int, contestiatones, "CONTESTIATONES", \ "Number of tones. Values are as follows:\n" \ " 0: 2; 1: 4; 2: 8; 3: 16; 4: 32; 5: 64; 6: 128; 7: 256", \ 2) /* 8 */ \ ELEM_(int, contestiabw, "CONTESTIABW", \ "Bandwidth (Hz). Values are as follows:\n" \ " 0: 125; 1: 250; 2: 500; 3: 1000; 4: 2000.", \ 2) /* 500 */ \ ELEM_(int, contestiasmargin, "CONTESTIASMARGIN", \ "Tune margin (tone frequency spacing)", \ 8) \ ELEM_(int, contestiasinteg, "CONTESTIASINTEG", \ "Integration period (FEC blocks)", \ 4) \ ELEM_(bool, contestia8bit, "CONTESTIA8BIT", \ "8-bit extended characters", \ true) \ ELEM_(bool, contestia_reset_fec, "CONTESTIARESETFEC", \ "Force Integration (FEC) depth to be reset when new BW/Tones selected", \ false) \ /* THOR */ \ ELEM_(double, THOR_BW, "THORBW", \ "Filter bandwidth factor (bandwidth relative to signal width)", \ 2.0) \ ELEM_(bool, THOR_FILTER, "THORFILTER", \ "Enable filtering before decoding", \ true) \ ELEM_(std::string, THORsecText, "THORSECTEXT", \ "Secondary text (sent during keyboard idle times)", \ "") \ ELEM_(int, THOR_PATHS, "THORPATHS", \ "This setting is currently unused", \ 5) \ ELEM_(double, ThorCWI, "THORCWI", \ "CWI threshold (CWI detection and suppression)", \ 0.0) \ ELEM_(bool, THOR_PREAMBLE, "THORPREAMBLE", \ "Detect THOR preamble (and flush Rx pipeline)", \ true) \ ELEM_(bool, THOR_SOFTSYMBOLS, "THORSOFTSYMBOLS", \ "Enable Soft-symbol decoding", \ true) \ ELEM_(bool, THOR_SOFTBITS, "THORSOFTBITS", \ "Enable Soft-bit decoding", \ true) \ /* PACKET */ \ ELEM_(int, PKT_BAUD_SELECT, "PKTBAUDSELECT", \ "Packet baud rate. Values are as follows:\n" \ " 0: 1200 (V/UHF); 1: 300 (HF); 2: 2400 (V/UHF)", \ 0) /* 1200 baud (V/UHF) default. */ \ ELEM_(double, PKT_LOSIG_RXGAIN, "LOSIGRXGAIN", \ "Signal gain for lower frequency (Mark) tone (in dB)", \ 0.0) \ ELEM_(double, PKT_HISIG_RXGAIN, "HISIGRXGAIN", \ "Signal gain for higher frequency (Space) tone (in dB)", \ 0.0) \ ELEM_(double, PKT_LOSIG_TXGAIN, "LOSIGTXGAIN", \ "Signal gain for Mark (lower frequency) tone (in dB)", \ 0.0) \ ELEM_(double, PKT_HISIG_TXGAIN, "HISIGTXGAIN", \ "Signal gain for Space (higher frequency) tone (in dB)", \ 0.0) \ ELEM_(bool, PKT_PreferXhairScope, "PKTPREFERXHAIRSCOPE", \ "Default to syncscope (detected symbol scope)", \ false) \ ELEM_(bool, PKT_AudioBoost, "PKTAUDIOBOOST", \ "No extra input gain (similar to Mic Boost) by default", \ false) \ \ ELEM_(bool, PKT_RXTimestamp, "PKTRXTIMESTAMP", \ "No timestamps on RX packets by default", \ false) \ \ ELEM_(bool, PKT_expandMicE, "PKTEXPANDMICE", \ "decode received Mic-E data", \ false) \ ELEM_(bool, PKT_expandPHG, "PKTEXPANDPHG", \ "decode received PHG data", \ false) \ ELEM_(bool, PKT_expandCmp, "PKTEXPANDCMP", \ "decode received Compressed Position data", \ false) \ ELEM_(bool, PKT_unitsSI, "PKTUNITSSI", \ "display decoded data in SI units", \ false) \ ELEM_(bool, PKT_unitsEnglish, "PKTUNITSENGLISH", \ "display decoded data in English units", \ false) \ /* DOMINOEX */ \ ELEM_(double, DOMINOEX_BW, "DOMINOEXBW", \ "Filter bandwidth factor (bandwidth relative to signal width)", \ 2.0) \ ELEM_(std::string, secText, "SECONDARYTEXT", \ "Secondary text (sent during keyboard idle times)", \ "") \ ELEM_(bool, DOMINOEX_FILTER, "DOMINOEXFILTER", \ "Enable filtering before decoding", \ true) \ ELEM_(bool, DOMINOEX_FEC, "DOMINOEXFEC", \ "Enable MultiPSK-compatible FEC", \ false) \ ELEM_(int, DOMINOEX_PATHS, "DOMINOEXPATHS", \ "This setting is currently unused", \ 5) \ ELEM_(double, DomCWI, "DOMCWI", \ "CWI threshold (CWI detection and suppression)", \ 0.0) \ /* MT63 */ \ ELEM_(bool, mt63_8bit, "MT638BIT", \ "8-bit extended characters", \ true) \ ELEM_(bool, mt63_rx_integration, "MT63INTEGRATION", \ "Long receive integration", \ false) \ ELEM_(bool, mt63_twotones, "MT63TWOTONES", \ "Also transmit upper start tone (only if MT63USETONES is enabled)", \ true) \ ELEM_(bool, mt63_usetones, "MT63USETONES", \ "Transmit lower start tone", \ true) \ ELEM_(int, mt63_tone_duration, "MT63TONEDURATION", \ "Tone duration (seconds)", \ 4) \ ELEM_(bool, mt63_at500, "MT63AT500", \ "Always transmit lowest tone at 500 Hz", \ false) \ /* Waterfall & UI */ \ ELEM_(uchar, red, "", "", 0) \ ELEM_(uchar, green, "", "", 255) \ ELEM_(uchar, blue, "", "", 255) \ ELEM_(bool, MultiColorWF, "", "", false) \ ELEM_(int, wfPreFilter, "WFPREFILTER", \ "Waterfal FFT prefilter window function. Values are as follows:\n" \ " 0: Rectangular; 1: Blackman; 2: Hamming; 3: Hanning; 4: Triangular", \ 1) /* Blackman */ \ ELEM_(bool, WFaveraging, "WFAVERAGING", \ "Use FFT averaging to decrease waterfall noise", \ false) \ ELEM_(int, wf_latency, "WF_LATENCY", \ "Waterfal latency, 1...16", \ 8) \ ELEM_(bool, UseCursorLines, "USECURSORLINES", \ "Draw cursor with vertical lines", \ true) \ ELEM_(bool, UseCursorCenterLine, "USECURSORCENTERLINE", \ "Draw cursor center line", \ true) \ ELEM_(bool, UseBWTracks, "USEBWTRACKS", \ "Draw bandwidth marker with vertical lines", \ true) \ ELEM_(bool, UseWideTracks, "USEWIDETRACKS", \ "Draw bandwidth marker with 3x vertical lines", \ false) \ ELEM_(bool, UseWideCursor, "USEWIDECURSOR", \ "Draw cursor with 3x vertical lines", \ false) \ ELEM_(bool, UseWideCenter, "USEWIDECENTER", \ "Draw center line marker with 3x vertical lines", \ false) \ ELEM_(RGBI, cursorLineRGBI, "CLCOLORS", \ "Color of cursor lines (RGBI)", \ {255, 255, 0, 255}) \ ELEM_(RGBI, cursorCenterRGBI, "CCCOLORS", \ "Color of cursor center line (RGBI)", \ {255, 255, 255, 255}) \ ELEM_(RGBI, bwTrackRGBI, "BWTCOLORS", \ "Color of bandwidth marker (RGBI)", \ {255, 0, 0, 255}) \ ELEM_(RGBI, notchRGBI, "NOTCHCOLORS", \ "Color of notch marker (RGBI)", \ {255, 255, 255, 255}) \ ELEM_(RGBI, rttymarkRGBI, "RTTYMARKRGBI", \ "Color of RTTY MARK freq marker (RGBI)", \ {255, 120, 0, 255}) \ ELEM_(int, feldfontnbr, "FELDFONTNBR", \ "Index of raster font used for transmission", \ 4) \ ELEM_(bool, viewXmtSignal, "VIEWXMTSIGNAL", \ "Show transmit signal on waterfall", \ false) \ ELEM_(bool, sendid, "SENDID", \ "Send video ID containing modem name", \ false) \ ELEM_(bool, macroid, "MACROID", \ "This setting is currently unused", \ false) \ ELEM_(bool, sendtextid, "SENDTEXTID", \ "Send video ID containing arbitrary text", \ false) \ ELEM_(std::string, strTextid, "STRTEXTID", \ "Video ID text for SENDTEXTID (keep short!)", \ "CQ") \ ELEM_(double, pretone, "PRETONE", \ "Single tone at center of modem BW, carrier detect for amplifiers", \ 0.0) \ ELEM_(bool, macroCWid, "", "", false) \ ELEM_(std::string, DTMFstr, "", "", "") \ ELEM_(bool, DTMFdecode, "DTMFDECODE", \ "Decode received DTMF tones", \ false) \ ELEM_(int, videowidth, "VIDEOWIDTH", \ "Video ID text width (characters per row)", \ 1) \ ELEM_(bool, vidlimit, "VIDLIMIT", \ "Limit video width to 500 Hz", \ true) \ ELEM_(bool, vidmodelimit, "VIDMODELIMIT", \ "Limit video width to mode bandwidth", \ true) \ ELEM_(bool, ID_SMALL, "IDSMALL", \ "Use small video ID font", \ true) \ ELEM_(mode_set_t, videoid_modes, "VIDEOIDMODESEXCLUDE", \ "Mode names for which Video ID transmission is disabled", \ mode_set_t()) \ ELEM_(bool, macrotextid, "", "", false) \ ELEM_(bool, docked_rig_control, "DOCKEDRIGCONTROL", \ "Docked rig control", \ true) \ ELEM_(int, wfheight, "WFHEIGHT", \ "Waterfall height (pixels)", \ 125) \ ELEM_(bool, tooltips, "TOOLTIPS", \ "Show tooltips", \ true) \ ELEM_(bool, NagMe, "NAGME", \ "Prompt to save log", \ false) \ ELEM_(bool, ClearOnSave, "CLEARONSAVE", \ "Clear log fields on save", \ false) \ ELEM_(bool, sort_date_time_off, "SORTDATEOFF", \ "Sort log by date/time off", \ true) \ ELEM_(bool, force_date_time, "FORCEDATETIME", \ "Force date/time ON == OFF", \ false) \ ELEM_(bool, menuicons, "MENUICONS", \ "Show menu icons", \ true) \ ELEM_(mode_set_t, visible_modes, "VISIBLEMODES", \ "Modes that are not shown in the opmodes menu", \ mode_set_t()) \ ELEM_(bool, rxtext_clicks_qso_data, "RXTEXTCLICKS", \ "Double-click on RX text enters QSO data", \ true) \ ELEM_(bool, rxtext_tooltips, "RXTEXTTOOLTIPS", \ "Show callsign tooltips in received text", \ false) \ ELEM_(bool, autofill_qso_fields, "AUTOFILLQSO", \ "Auto-fill Country and Azimuth QSO fields", \ false) \ ELEM_(bool, calluppercase, "CALLUPPERCASE", \ "Convert callsign field to upper case", \ true) \ ELEM_(bool, RSTdefault, "RSTDEFAULT", \ "Default outgoing RST to 599", \ false) \ ELEM_(bool, RSTin_default, "RSTINDEFAULT", \ "Default incoming RST to 599", \ false) \ ELEM_(bool, autoextract, "AUTOEXTRACT", \ "Enable detection and extraction of \"wrapped\" text", \ true) \ ELEM_(bool, open_flmsg, "OPEN_FLMSG", \ "Open flmsg with the autoextract file", \ true) \ ELEM_(bool, open_flmsg_print, "OPEN_FLMSG_PRINT", \ "Open flmsg with the autoextract file\nprint to browser\nclose flmsg", \ true) \ ELEM_(bool, open_nbems_folder, "OPEN_NBEMS_FOLDER", \ "Open NBEMS folder upon receipt of an autoextract file", \ false) \ ELEM_(std::string, flmsg_pathname, "FLMSG_PATHNAME", \ "Full pathname to the flmsg executable", \ "") \ ELEM_(std::string, flnet_pathname, "FLNET_PATHNAME", \ "Full pathname to the flnet executable", \ "") \ ELEM_(double, extract_timeout, "EXTRACT_TIMEOUT", \ "Abort message extraction after nn.n seconds of inactivity", \ 2.0) \ ELEM_(std::string, cty_dat_pathname, "CTYDAT_PATHNAME", \ "Full pathname to the cty.dat data file", \ "") \ ELEM_(bool, speak, "SPEAK", \ "Capture text to file 'talk/textout.txt'", \ false) \ ELEM_(bool, auto_talk, "AUTO_TALK", \ "Connect to Digitalk socket server during program initialization", \ false) \ /* QRZ */ \ ELEM_(int, QRZXML, "QRZXMLTYPE", \ "Callsign xml query type. Values are as follows:\n" \ " 0: none; 1: QRZ (paid sub.); 2: QRZ cdrom; 3: HamCall (paid sub.);\n" \ " 4: callook free US calls xml service; 5: hamQTH free xml service.\n" \ " The default is none.", \ QRZXMLNONE) \ ELEM_(int, QRZWEB, "QRZWEBTYPE", \ "Callsign browser query type. Values are as follows:\n" \ " 0: none; 1: QRZ web browser; 2: HamCall web browser\n" \ " 3: hamQTH web browser.\n The default is none.", \ QRZWEBNONE) \ ELEM_(std::string, QRZpathname, "QRZPATHNAME", \ "QRZ cdrom path", \ "") \ ELEM_(std::string, QRZusername, "QRZUSER", \ "QRZ or HamCall subscriber username", \ "") \ ELEM_(std::string, QRZuserpassword, "QRZPASSWORD", \ "QRZ or HamCall subscriber password", \ "") \ ELEM_(bool, notes_address, "NOTES_ADDRESS", \ "Populate logbook notes (comment) field with mailing address", \ false) \ ELEM_(bool, QRZchanged, "", "", false) \ /* eQSL */ \ ELEM_(std::string, eqsl_id, "EQSL_ID", \ "eQSL login id", \ "") \ ELEM_(std::string, eqsl_pwd, "EQSL_PASSWORD", \ "eQSL login password", \ "") \ ELEM_(std::string, eqsl_nick, "EQSL_NICKNAME", \ "eQSL nickname", \ "") \ ELEM_(std::string, eqsl_default_message, "EQSL_DEF_MSG", \ "eQSl default message", \ "") \ ELEM_(bool, eqsl_when_logged, "EQSL_WHEN_LOGGED", \ "Send eQSL when other log action invoked", \ false) \ ELEM_(bool, eqsl_datetime_off, "EQSL_DATETIME_OFF", \ "Send logbook date/time off vice date on (default)", \ false) \ /* Rig control */ \ ELEM_(bool, btnusb, "BTNUSB", \ "This setting is currently unused", \ true) \ ELEM_(bool, RTSptt, "RTSPTT", \ "RTS is PTT signal line", \ false) \ ELEM_(bool, DTRptt, "DTRPTT", \ "DTR is PTT signal line", \ false) \ ELEM_(bool, RTSplus, "RTSPLUS", \ "Initial voltage on RTS is +V", \ false) \ ELEM_(bool, DTRplus, "DTRPLUS", \ "Initial voltage on DTR is +V", \ false) \ ELEM_(bool, PTTrightchannel, "PTTRIGHTCHANNEL", \ "Generate PTT signal on right audio channel", \ false) \ ELEM_(int, chkUSEHAMLIBis, "CHKUSEHAMLIBIS", \ "Use Hamlib rig control", \ 0) \ ELEM_(int, chkUSERIGCATis, "CHKUSERIGCATIS", \ "Use RigCAT rig control", \ 0) \ ELEM_(int, chkUSEXMLRPCis, "CHKUSEXMLRPCIS", \ "Use XML-RPC rig control", \ 0) \ ELEM_(std::string, PTTdev, "PTTDEV", \ "PTT device", \ DEFAULT_PTTDEV) \ ELEM_(std::string, CWFSKport, "", "", DEFAULT_CWFSKPORT) \ ELEM_(std::string, HamRigDevice, "HAMRIGDEVICE", \ "Hamlib rig device", \ DEFAULT_HAMRIGDEVICE) \ ELEM_(std::string, HamRigName, "HAMRIGNAME", \ "Hamlib rig name", \ "") \ ELEM_(int, HamRigModel, "HAMRIGMODEL", \ "Hamlib rig model", \ 0) \ ELEM_(std::string, HamConfig, "HAMCONFIG", \ "Hamlib configuration (param=val, ...)", \ "") \ ELEM_(int, HamRigBaudrate, "HAMRIGBAUDRATE", \ "Hamlib rig baud rate. Values are as follows:\n" \ " 0: 300; 1: 600; 2: 1200; 3: 2400; 4: 4800; 5: 9600; 6: 19200;\n" \ " 7: 38400; 8: 57600; 9: 115200; 10: 230400; 11: 460800.", \ 1) /* 600 baud */ \ ELEM_(int, HamRigStopbits, "HAMRIGSTOPBITS", \ "Hamlib stopbits <1/2>.", \ 2) /* 600 baud */ \ ELEM_(std::string, XmlRigFilename, "XMLRIGFILENAME", \ "RigCAT XML file name", \ "") \ ELEM_(std::string, XmlRigDevice, "XMLRIGDEVICE", \ "RigCAT device", \ DEFAULT_HAMRIGDEVICE) \ ELEM_(int, XmlRigBaudrate, "XMLRIGBAUDRATE", \ "RigCAT rig baud rate. See HAMRIGBAUDRATE.", \ 1) /* 600 baud */ \ ELEM_(int, RigCatStopbits, "RIGCATSTOPBITS", \ "RigCAT stopbits. <1/2>", \ 2) /* 600 baud */ \ ELEM_(bool, TTYptt, "TTYPTT", \ "Use separate device for PTT", \ false) \ ELEM_(bool, HamlibCMDptt, "HAMLIBCMDPTT", \ "PTT via Hamlib command", \ false) \ ELEM_(bool, RigCatCMDptt, "RIGCATCMDPTT", \ "PTT via RigCAT command", \ false) \ ELEM_(bool, UseUHrouterPTT, "USEUHROUTERPTT", \ "Use uHRouter PTT (OS X only)", \ false) \ ELEM_(bool, UsePPortPTT, "USEPPORTPTT", \ "Use parallel port PTT", \ false) \ /* RigCAT parameters */ \ ELEM_(bool, RigCatRTSplus, "RIGCATRTSPLUS", \ "Initial state of RTS", \ false) \ ELEM_(bool, RigCatDTRplus, "RIGCATDTRPLUS", \ "Initial state of DTR", \ false) \ ELEM_(bool, RigCatRTSptt, "RIGCATRTSPTT", \ "Toggle RTS for PTT", \ false) \ ELEM_(bool, RigCatDTRptt, "RIGCATDTRPTT", \ "Toggle DTR for PTT", \ false) \ ELEM_(bool, RigCatRTSCTSflow, "RIGCATRTSCTSFLOW", \ "RTS/CTS flow control", \ false) \ ELEM_(int, RigCatRetries, "RIGCATRETRIES", \ "Number of retries before giving up", \ 2) \ ELEM_(int, RigCatTimeout, "RIGCATTIMEOUT", \ "Retry interval (milliseconds)", \ 10) \ ELEM_(int, RigCatWait, "RIGCATWAIT", \ "Write delay (milliseconds)", \ 50) \ ELEM_(int, RigCatInitDelay, "RIGCATINITDELAY", \ "Wait delay (milliseconds) on first command to serial device", \ 200) \ ELEM_(bool, RigCatECHO, "RIGCATECHO", \ "Commands are echoed", \ false) \ ELEM_(bool, RigCatVSP, "RIGCATVSP", \ "VSP support enabled", \ false) \ ELEM_(bool, RigCatRestoreTIO, "RIGCATRESTORETIO", \ "Restore original state of comm port when closing", \ false) \ /* Hamlib parameters */ \ ELEM_(bool, HamlibRTSplus, "HAMLIBRTSPLUS", \ "RTS +12", \ false) \ ELEM_(bool, HamlibDTRplus, "HAMLIBDTRPLUS", \ "DTR +12", \ false) \ ELEM_(bool, HamlibRTSCTSflow, "HAMLIBRTSCTSFLOW", \ "RTS/CTS flow control", \ false) \ ELEM_(bool, HamlibXONXOFFflow, "HAMLIBXONXOFFFLOW", \ "XON/XOFF flow control", \ false) \ ELEM_(int, HamlibRetries, "HAMLIBRETRIES", \ "Number of times to resend command before giving up", \ 2) \ ELEM_(int, HamlibTimeout, "HAMLIBTIMEOUT", \ "Retry interval (milliseconds)", \ 10) \ ELEM_(int, HamlibWait, "HAMLIBWAIT", \ "Wait interval before reading response (milliseconds)", \ 5) \ ELEM_(int, HamlibWriteDelay, "HAMLIBWRITEDELAY", \ "Write delay (milliseconds)", \ 0) \ ELEM_(int, HamlibSideband, "HAMLIBSIDEBAND", \ "Force the rig sideband (for the purpose of calculating frequencies).\n" \ "Values are as follows: 0: as reported by rig; 1: LSB; 2: USB.", \ 0) /* SIDEBAND_RIG */ \ /* Operator */ \ ELEM_(std::string, myCall, "MYCALL", \ "Operator callsign", \ "") \ ELEM_(std::string, myQth, "MYQTH", \ "Operator QTH", \ "") \ ELEM_(std::string, myName, "MYNAME", \ "Operator name", \ "") \ ELEM_(std::string, myLocator, "MYLOC", \ "Operator Maidenhead locator", \ "") \ ELEM_(std::string, myAntenna, "MYANTENNA", \ "Antenna description (keep short!)", \ "") \ /* Sound card */ \ ELEM_(int, btnAudioIOis, "AUDIOIO", \ "Audio subsystem. Values are as follows:\n" \ " 0: OSS; 1: PortAudio; 2: PulseAudio; 3: File I/O", \ SND_IDX_NULL) \ ELEM_(std::string, OSSdevice, "OSSDEVICE", \ "OSS device name", \ "") \ ELEM_(std::string, PAdevice, "PADEVICE", \ "For compatibility with older versions", \ "") \ ELEM_(std::string, PortInDevice, "PORTINDEVICE", \ "PortAudio input device name", \ "") \ ELEM_(int, PortInIndex, "PORTININDEX", \ "PortAudio input device index", \ -1) \ ELEM_(std::string, PortOutDevice, "PORTOUTDEVICE", \ "PortAudio input device name", \ "") \ ELEM_(int, PortOutIndex, "PORTOUTINDEX", \ "PortAudio input device index", \ -1) \ ELEM_(int, PortFramesPerBuffer, "", "", 0) \ ELEM_(std::string, PulseServer, "PULSESERVER", \ "PulseAudio server string", \ "") \ ELEM_(int, in_channels, "INCHANNELS", \ "Number of audio input channels", \ 1) \ ELEM_(bool, mono_audio, "MONOAUDIO", \ "Force use of mono audio output", \ false) \ ELEM_(bool, sig_on_right_channel, "SIGONRIGHTCHANNEL", \ "Duplicate modem signal on left & right", \ false) \ ELEM_(bool, ReverseAudio, "REVERSEAUDIO", \ "Reverse left-right audio channels", \ false) \ ELEM_(int, sample_rate, "SAMPLERATE", \ "For compatibility with older versions", \ SAMPLE_RATE_UNSET) \ ELEM_(int, in_sample_rate, "INSAMPLERATE", \ "Input sample rate", \ SAMPLE_RATE_UNSET) \ ELEM_(int, out_sample_rate, "OUTSAMPLERATE", \ "Output sample rate", \ SAMPLE_RATE_UNSET) \ ELEM_(int, sample_converter, "SAMPLECONVERTER", \ "Sample rate conversion type. Values are as follows:\n" \ " 0: Best SINC; 1: Medium SINC; 2: Fastest SINC; 3: ZOH; 4: Linear.\n" \ "The default is 2.", \ SRC_SINC_FASTEST) \ ELEM_(int, RX_corr, "RXCORR", \ "Input (RX) sample rate correction (PPM)", \ 0) \ ELEM_(int, TX_corr, "TXCORR", \ "Output (TX) sample rate correction (PPM)", \ 0) \ ELEM_(int, TxOffset, "TXOFFSET", \ "Difference between RX and TX freq (rig offset)", \ 0) \ ELEM_(int, wavSampleRate, "WAV_SAMPLERATE", \ "Wave file record sample rate\n" \ "0 - 8000, 1 - 11025, 2 - 16000, 3 - 22050\n" \ "4 - 24000, 5 - 44100, 6 - 48000", \ 0) \ ELEM_(bool, loop_playback, "LOOPPLAYBACK", \ "true = continuous loop of sound file playback\n" \ "false = single pass through playback file.", \ false) \ ELEM_(int, PTT_on_delay, "PTTONDELAY", \ "Start of transmit delay before sending audio", \ 0) \ ELEM_(int, PTT_off_delay, "PTTOFFDELAY", \ "End of transmit delay before disabling PTT", \ 0) \ /* Contest controls and Logbook */ \ ELEM_(std::string, logbookfilename, "LOGBOOKFILENAME", \ "Logbook file name", \ "") \ ELEM_(bool, fixed599, "FIXED599", \ "Force RST in/out to 599", \ false) \ ELEM_(bool, UseLeadingZeros, "USELEADINGZEROS", \ "Insert leading zeros into transmitted serial number (contest)", \ true) \ ELEM_(bool, cutnbrs, "CUTNBRS", \ "Send CW cut numbers", \ false) \ ELEM_(RGB, bwsrSliderColor, "BWSRSLIDERCOLOR", \ "Background color of signal browser detect level", \ {185, 211, 238}) \ ELEM_(RGB, bwsrSldrSelColor,"BWSRSLDRSELCOLOR", \ "Button highlight color, signal browser detect level", \ {54, 100, 139}) \ ELEM_(int, bwsrHiLight1, "BWSRHILIGHT1", \ "View Browser highlight color 1, default Dark Red", \ FL_RED) \ ELEM_(int, bwsrHiLight2, "BWSRHILIGHT2", \ "View Browser highlight color 2, default Dark Green", \ FL_GREEN) \ ELEM_(int, bwsrBackgnd1, "BWSRBACKGND1", \ "View Browser background odd lines", \ 55) \ ELEM_(int, bwsrBackgnd2, "BWSRBACKGND2", \ "View Browser background odd lines", \ 53) \ ELEM_(int, bwsrSelect, "BWSRSELECT", \ "View Browser line select color", \ FL_BLUE) \ ELEM_(RGB, dup_color, "dupcolor", \ "Callsign background color when duplicate detected", \ {255, 110, 180}) \ ELEM_(bool, EnableDupCheck, "ENABLEDUPCHECK", \ "Check for duplicates (contest)", \ false) \ ELEM_(bool, dupmode, "DUPMODE", \ "Predicate for ENABLEDUPCHECK (mode must match)", \ true) \ ELEM_(bool, dupband, "DUPBAND", \ "Predicate for ENABLEDUPCHECK (band must match)", \ true) \ ELEM_(bool, dupstate, "DUPSTATE", \ "Predicate for ENABLEDUPCHECK (state must match)", \ false) \ ELEM_(bool, dupxchg1, "DUPXCHG1", \ "Predicate for ENABLEDUPCHECK (exchange must match)", \ false) \ ELEM_(bool, duptimespan, "DUPTIMESPAN", \ "Predicate for ENABLEDUPCHECK (QSO inside timespan)", \ false) \ ELEM_(int, timespan, "TIMESPAN", \ "Time for DUPTIMESPAN (minutes)", \ 120) \ ELEM_(int, ContestStart, "CONTESTSTART", \ "Contest starting number", \ 0) \ ELEM_(int, ContestDigits, "CONTESTDIGITS", \ "Number of digits in serial number", \ 4) \ ELEM_(std::string, nonwordchars, "NONWORDCHARS", \ "Additional characters used to delimit WORDS", \ "*,-.;") \ ELEM_(std::string, myXchg, "MYXCGH", \ "Free form exchange", \ "") \ ELEM_(std::string, mytxpower, "TXPOWER", \ "TX power used for logbook entries", \ "") \ /* Macro controls */ \ ELEM_(bool, UseLastMacro, "USELASTMACRO", \ "Load last used macro file on startup", \ false) \ ELEM_(bool, DisplayMacroFilename, "DISPLAYMACROFILENAME", \ "Display macro filename on startup", \ false) \ ELEM_(bool, SaveMacros, "SAVEMACROS", \ "Save current macros on exit", \ false) \ ELEM_(bool, macro_wheel, "MACROWHEEL", \ "Enable mouse wheel rotation to control visible macro set", \ false) \ ELEM_(bool, mbar1_pos, "MBAR1POS", \ "Principal macro bar position, true=above wf, false=below", \ true) \ ELEM_(int, mbar2_pos, "MBAR2POS", \ "Position second macro button above data stream panesl", \ 0) \ /* Mixer */ \ ELEM_(std::string, MXdevice, "MXDEVICE", \ "Mixer device", \ "") \ ELEM_(bool, MicIn, "MICIN", \ "Control the microphone mixer channel", \ false) \ ELEM_(bool, LineIn, "LINEIN", \ "Control the line-in mixer channel", \ true) \ ELEM_(bool, EnableMixer, "ENABLEMIXER", \ "Enable mixer controls", \ false) \ ELEM_(double, PCMvolume, "PCMVOLUME", \ "PCM channel level", \ 0.8) \ ELEM_(double, txlevel, "TXATTEN", \ "TX attenuator (db) -30 .. 0", \ -3.0) \ ELEM_(bool, MuteInput, "MUTEINPUT", \ "This setting is currently unused", \ true) \ ELEM_(double, TxMonitorLevel, "TXMONITORLEVEL", \ "Level for monitored (on waterfall) transmit signal", \ 0.5) \ /* Waterfall palette */ \ ELEM_(std::string, PaletteName, "PALETTENAME", \ "Waterfall color palette file name", \ "default.pal") \ ELEM_(RGB, cfgpal0, "PALETTE0", \ "Custom palette 0", \ { 0,0,0 }) \ ELEM_(RGB, cfgpal1, "PALETTE1", \ "Custom palette 1", \ { 0,0,136 }) \ ELEM_(RGB, cfgpal2, "PALETTE2", \ "Custom palette 2", \ { 0,19,198 }) \ ELEM_(RGB, cfgpal3, "PALETTE3", \ "Custom palette 3", \ { 0,32,239 }) \ ELEM_(RGB, cfgpal4, "PALETTE4", \ "Custom palette 4", \ { 172,167,105 }) \ ELEM_(RGB, cfgpal5, "PALETTE5", \ "Custom palette 5", \ { 194,198,49 }) \ ELEM_(RGB, cfgpal6, "PALETTE6", \ "Custom palette 6", \ { 225,228,107 }) \ ELEM_(RGB, cfgpal7, "PALETTE7", \ "Custom palette 7", \ { 255,255,0 }) \ ELEM_(RGB, cfgpal8, "PALETTE8", \ "Custom palette 8", \ { 251,51,0 }) \ /* Palettes for macro button groups */ \ ELEM_(bool, useGroupColors, "USEGROUPCOLORS", \ "Use macro group colors", \ true) \ ELEM_(RGB, btnGroup1, "FKEYGROUP1", \ "Macro group 1 color", \ { 80, 144, 144 }) \ ELEM_(RGB, btnGroup2, "FKEYGROUP2", \ "Macro group 2 color", \ { 144, 80, 80 }) \ ELEM_(RGB, btnGroup3, "FKEYGROUP3", \ "Macro group 3 color", \ { 80, 80, 144 }) \ ELEM_(RGB, btnFkeyTextColor, "FKEYTEXTCOLOR", \ "Macro button foreground ", \ { 255, 255, 255 }) \ /* RX / TX / Waterfall text widgets */ \ ELEM_(std::string, charset_name, "CHARSET_NAME", \ "Default character set", \ "UTF-8") \ ELEM_(std::string, RxFontName, "RXFONTNAME", \ "RX text font name", \ "") \ ELEM_(bool, RxFontWarn, "RXFONTWARN", \ "Enable RX font warnings", \ true) \ ELEM_(Fl_Font, RxFontnbr, "RXFONTNBR", \ "RX text font index", \ FL_COURIER) \ ELEM_(int, RxFontsize, "RXFONTSIZE", \ "RX text font size", \ 16) \ ELEM_(Fl_Color, RxFontcolor, "RXFNTCOLOR", \ "RX text font color", \ FL_BLACK) \ ELEM_(Fl_Color, RxTxSelectcolor, "RXTXSELCOLOR", \ "RX/TX text select color", \ FL_MAGENTA) \ ELEM_(std::string, TxFontName, "TXFONTNAME", \ "TX text font name", \ "") \ ELEM_(bool, TxFontWarn, "TXFONTWARN", \ "Enable TX font warnings", \ true) \ ELEM_(Fl_Font, TxFontnbr, "TXFONTNBR", \ "TX text font index", \ FL_COURIER) \ ELEM_(int, TxFontsize, "TXFONTSIZE", \ "TX text font size", \ 16) \ ELEM_(Fl_Color, TxFontcolor, "TXFNTCOLOR", \ "TX text font color", \ FL_BLACK) \ ELEM_(RGB, RxColor, "RXFONTCOLOR", \ "RX text font color (RGB)", \ { 255, 242, 190 }) \ ELEM_(RGB, TxColor, "TXFONTCOLOR", \ "TX text font color (RGB)", \ { 200, 235, 255 }) \ ELEM_(Fl_Color, XMITcolor, "XMITCOLOR", \ "Color for Transmit text style", \ FL_RED) \ ELEM_(Fl_Color, CTRLcolor, "CTRLCOLOR", \ "Color for Control text style", \ FL_DARK_GREEN) \ ELEM_(Fl_Color, SKIPcolor, "SKIPCOLOR", \ "Color for Skipped text style", \ FL_BLUE) \ ELEM_(Fl_Color, ALTRcolor, "ALTRCOLOR", \ "Color for Alternate text style", \ FL_DARK_MAGENTA) \ ELEM_(Fl_Color, LowSignal, "LOWSIGNAL", \ "Color for low signal level", \ FL_BLACK) \ ELEM_(Fl_Color, NormSignal, "NORMSIGNAL", \ "Color for normal signal level", \ FL_GREEN) \ ELEM_(Fl_Color, HighSignal, "HIGHSIGNAL", \ "Color for high signal level", \ FL_YELLOW) \ ELEM_(Fl_Color, OverSignal, "OVERSIGNAL", \ "Color for over driven signal", \ FL_RED) \ ELEM_(std::string, WaterfallFontName, "WATERFALLFONTNAME", \ "Waterfall font name", \ "") \ ELEM_(Fl_Font, WaterfallFontnbr, "WATERFALLFONTNBR", \ "Waterfall font number", \ FL_COURIER) \ ELEM_(int, WaterfallFontsize, "WATERFALLFONTSIZE", \ "Waterfall font size", \ 12) \ ELEM_(Fl_Color, LOGGINGtextcolor, "LOGGINGTEXTCOLOR", \ "Text color in logging controls", \ FL_BLACK) \ ELEM_(Fl_Color, LOGGINGcolor, "LOGGINGCOLOR", \ "Background color in logging controls", \ FL_BACKGROUND2_COLOR) \ ELEM_(Fl_Font, LOGGINGtextfont, "LOGGINGTEXTFONT", \ "Logging Controls font number", \ FL_HELVETICA) \ ELEM_(int, LOGGINGtextsize, "LOGGINGTEXTSIZE", \ "Logging Controls font size", \ 12) \ ELEM_(Fl_Color, LOGBOOKtextcolor, "LOGBOOKTEXTCOLOR", \ "Text color in logbook dialog", \ FL_BLACK) \ ELEM_(Fl_Color, LOGBOOKcolor, "LOGBOOKCOLOR", \ "Background color in logbook dialog", \ FL_BACKGROUND2_COLOR) \ ELEM_(Fl_Font, LOGBOOKtextfont, "LOGBOOKTEXTFONT", \ "Logbook dialog controls font number", \ FL_HELVETICA) \ ELEM_(int, LOGBOOKtextsize, "LOGBOOKTEXTSIZE", \ "Logbook dialog controls font size", \ 12) \ ELEM_(std::string, FreqControlFontName, "FREQCONTROLFONTNAME", \ "Frequency Control font name", \ "") \ ELEM_(Fl_Font, FreqControlFontnbr, "FREQCONTROLFONTNBR", \ "Frequency Control font number", \ FL_COURIER) \ ELEM_(std::string, ui_scheme, "UISCHEME", \ "FLTK UI scheme (none or base, gtk+, plastic)", \ "gtk+") \ ELEM_(int, ui_language, "UILANGUAGE", \ "UI language", \ 0) \ ELEM_(bool, wf_audioscale, "WFAUDIOSCALE", \ "Always show audio frequencies on waterfall", \ true) \ /* Freq Display colors */ \ ELEM_(RGB, FDbackground, "FDBACKGROUND", \ "Frequency display background color", \ { 0, 0, 0 }) \ ELEM_(RGB, FDforeground, "FDFOREGROUND", \ "Frequency display foreground color", \ { 0, 200, 0 }) \ /* Tab selection color */ \ ELEM_(Fl_Color, TabsColor, "TABSCOLOR", \ "UI tabs color", \ FL_BACKGROUND2_COLOR) \ /* Signal Viewer */ \ ELEM_(bool, VIEWERascend, "VIEWERASCEND", \ "Low frequency on bottom of viewer", \ true) \ ELEM_(bool, VIEWERmarquee, "VIEWERMARQUEE", \ "Signal Viewer text continuous scrolling", \ true) \ ELEM_(bool, VIEWERsort, "VIEWERSORT", \ "Signal Viewer sort after channel changes- unused", \ false) \ ELEM_(bool, VIEWERhistory, "VIEWERHISTORY", \ "Signal Viewer playback history on select", \ false) \ ELEM_(bool, VIEWERfixed, "VIEWERfixed", \ "Signal Viewer data displayed on fixed 100 Hz intervals", \ true) \ ELEM_(int, VIEWERlabeltype, "VIEWERSHOWFREQ", \ "Signal Viewer label type. Values are as follows:\n" \ " 0: None; 1: Audio freq; 2: Radio freq; 2: Channel #.", \ VIEWER_LABEL_RF) \ ELEM_(int, VIEWERchannels, "VIEWERCHANNELS", \ "Number of Signal Viewer Channels", \ 30) \ ELEM_(int, VIEWERwidth, "VIEWERWIDTH", \ "Width of viewer (% of full panel width)", \ 25) \ ELEM_(int, VIEWERtimeout, "VIEWERTIMEOUT", \ "Signal Viewer inactivity timeout (to clear text)", \ 15) \ ELEM_(std::string, ViewerFontName, "VIEWERFONTNAME", \ "Signal Viewer font name", \ "") \ ELEM_(Fl_Font, ViewerFontnbr, "VIEWERFONTNBR", \ "Signal Viewer font index", \ FL_COURIER) \ ELEM_(int, ViewerFontsize, "VIEWERFONTSIZE", \ "Signal Viewer font size", \ FL_NORMAL_SIZE) \ \ ELEM_(Fl_Color, Sql1Color, "SQL1COLOR", \ "UI SQL button select color 1", \ FL_YELLOW) \ ELEM_(Fl_Color, Sql2Color, "SQL2COLOR", \ "UI SQL button select color 2", \ FL_GREEN) \ ELEM_(Fl_Color, AfcColor, "AFCCOLOR", \ "UI AFC button select color", \ FL_GREEN) \ ELEM_(Fl_Color, LkColor, "LKCOLOR", \ "UI Lk xmt frequ select color", \ FL_GREEN) \ ELEM_(Fl_Color, RevColor, "REVCOLOR", \ "UI Rev select color", \ FL_GREEN) \ ELEM_(Fl_Color, XmtColor, "XMTCOLOR", \ "UI T/R select color", \ FL_RED) \ ELEM_(Fl_Color, SpotColor, "SPOTCOLOR", \ "UI Spot select color", \ FL_GREEN) \ ELEM_(Fl_Color, RxIDColor, "RXIDCOLOR", \ "UI RxID select color", \ FL_GREEN) \ ELEM_(Fl_Color, TxIDColor, "TXIDCOLOR", \ "UI TxID select color", \ FL_GREEN) \ ELEM_(Fl_Color, TuneColor, "TUNECOLOR", \ "UI Tune select color", \ FL_RED) \ \ /* XMLRPC LOGBOOK server */ \ ELEM_(bool, xml_logbook, "XML_LOGBOOK", \ "Try to open remote xml logbook", \ false) \ ELEM_(std::string, xmllog_address, "XMLLOG_ADDRESS", \ "Logbook server address", \ "127.0.0.1") \ ELEM_(std::string, xmllog_port, "XMLLOG_PORT", \ "Logbook server port", \ "8421") \ \ ELEM_(bool, check_for_updates, "CHECK_FOR_UPDATES", \ "Check for updates when starting program", \ false) \ /* XML-RPC/ARQ servers */ \ ELEM_(std::string, xmlrpc_address, "", "", "127.0.0.1") \ ELEM_(std::string, xmlrpc_port, "", "", "7362") \ ELEM_(std::string, xmlrpc_allow, "", "", "") \ ELEM_(std::string, xmlrpc_deny, "", "", "") \ ELEM_(int, rx_msgid, "", "", 9876) \ ELEM_(int, tx_msgid, "", "", 6789) \ ELEM_(std::string, arq_address, "", "", "127.0.0.1") \ ELEM_(std::string, arq_port, "", "", "7322") \ /* PSK reporter */ \ ELEM_(bool, usepskrep, "USEPSKREP", \ "(Set by fldigi)", \ false) \ ELEM_(bool, pskrep_auto, "PSKREPAUTO", \ "Report callsigns spotted in received text", \ false) \ ELEM_(bool, pskrep_log, "PSKREPLOG", \ "Report callsigns in logged QSOs", \ false) \ ELEM_(bool, pskrep_qrg, "PSKREPQRG", \ "Include rig frequency in reception report", \ false) \ ELEM_(bool, report_when_visible, "REPORTWHENVISIBLE", \ "Enable Reporter ONLY when a signal browser is visible", \ false) \ ELEM_(std::string, pskrep_host, "PSKREPHOST", \ "Reception report server address", \ "report.pskreporter.info") \ ELEM_(std::string, pskrep_port, "PSKREPPORT", \ "Reception report server port", \ "4739") \ /* WEFAX configuration items */ \ ELEM_(double, wefax_slant, "WEFAXSLANT", \ "Slant correction for wefax Rx", \ 0.0) \ ELEM_(std::string, wefax_save_dir, "WEFAXSAVEDIR", \ "Target directory for storing automatically received images storage", \ "") \ ELEM_(std::string, wefax_load_dir, "WEFAXLOADDIR", \ "Source directory for sending images", \ "") \ ELEM_(int, wefax_filter, "WEFAXFILTER", \ "Input filter for image reception", \ 0) \ ELEM_(bool, WEFAX_EmbeddedGui, "WEFAXEMBEDDEDGUI", \ "Embedded GUI", \ true) \ ELEM_(bool, WEFAX_HideTx, "WEFAXHIDETX", \ "Hide transmission window", \ true) \ ELEM_(int, WEFAX_Shift, "WEFAXSHIFT", \ "Shift (Standard 800Hz)", \ 800 ) \ ELEM_(int, WEFAX_MaxRows, "WEFAXMAXROWS", \ "Received fax maximum number of rows", \ 2900 ) \ ELEM_(int, WEFAX_NoiseMargin, "WEFAXNOISEMARGIN", \ "Pixel margin for noise removal", \ 1 ) \ ELEM_(int, WEFAX_NoiseThreshold, "WEFAXNOISETHRESHOLD", \ "Threshold level for noise detection and removal", \ 5 ) \ ELEM_(int, WEFAX_SaveMonochrome, "WEFAXSAVEMONOCHROME", \ "Save fax image as monochrome", \ true ) \ ELEM_(bool, WEFAX_AdifLog, "WEFAXADIFLOG", \ "Logs wefax file names in Adif log file", \ false) \ /* NAVTEX configuration items */ \ ELEM_(bool, NVTX_AdifLog, "NAVTEXADIFLOG", \ "Logs Navtex messages in Adig log file", \ false) \ ELEM_(bool, NVTX_KmlLog, "NAVTEXKMLLOG", \ "Logs Navtex messages to KML document", \ false) \ ELEM_(int, NVTX_MinSizLoggedMsg, "NAVTEXMINSIZLOGGEDMSG", \ "Minimum length of logged messages", \ 0 ) \ /* WX fetch from NOAA */ \ ELEM_(std::string, wx_eoh, "WX_EOH", \ "Text at end of METAR report header\n" \ "default = Connection: close", \ "Connection: close") \ ELEM_(std::string, wx_sta, "WX_STA", \ "4 letter specifier for wx station", \ "KMDQ") \ ELEM_(bool, wx_condx, "WX_CONDX", \ "Weather conditions", \ true) \ ELEM_(bool, wx_fahrenheit, "WX_FAHRENHEIT", \ "Report in Fahrenheit", \ true) \ ELEM_(bool, wx_celsius, "WX_CELSIUS", \ "Report in Celsius", \ true) \ ELEM_(bool, wx_mph, "WX_MPH", \ "Report speed in miles per hour", \ true) \ ELEM_(bool, wx_kph, "WX_KPH", \ "Report speed in kilometers per hour", \ true) \ ELEM_(bool, wx_inches, "WX_INCHES", \ "Report pressure in inches of mercury", \ true) \ ELEM_(bool, wx_mbars, "WX_MBARS", \ "Report pressure in millibars", \ true) \ ELEM_(bool, wx_full, "WX_FULL", \ "Use complete METAR report", \ true) \ ELEM_(bool, wx_station_name, "WX_STATION_NAME", \ "Report station noun name", \ true) \ /* KML Keyhole Markup Language */ \ ELEM_(bool, kml_purge_on_startup, "KML_PURGE_ON_STARTUP", \ "Purge KML data at startup", \ false) \ ELEM_(std::string, kml_save_dir, "KML_SAVE_DIR", \ "Destination directory for generated KML documents", \ "") \ ELEM_(std::string, kml_command, "KML_COMMAND", \ "Command executed when creating KML files", \ "") \ ELEM_(int, kml_merge_distance, "KML_MERGE_DISTANCE", \ "Minimum distance for splitting alias nodes", \ 10000) \ ELEM_(int, kml_retention_time, "KML_RETENTION_TIME", \ "Number of hours for keeping data in each node", \ 0) \ ELEM_(int, kml_refresh_interval, "KML_REFRESH_INTERVAL", \ "Refresh interval written in KML files (In seconds)", \ 120) \ ELEM_(int, kml_balloon_style, "KML_BALLOON_STYLE", \ "KML balloons data displayed as text, HTML tables, HTML single matrix", \ 2) \ ELEM_(std::string, auto_flrig_pathname, "AUTO_FLRIG_PATHNAME", \ "Full pathname to the flrig executable", \ "") \ ELEM_(std::string, auto_flamp_pathname, "AUTO_FLAMP_PATHNAME", \ "Full pathname to the flamp executable", \ "") \ ELEM_(std::string, auto_flnet_pathname, "AUTO_FLNET_PATHNAME", \ "Full pathname to the flnet executable", \ "") \ ELEM_(std::string, auto_fllog_pathname, "AUTO_FLLOG_PATHNAME", \ "Full pathname to the fllog executable", \ "") \ ELEM_(std::string, auto_prog1_pathname, "AUTO_PROG1_PATHNAME", \ "Full pathname to the prog1 executable", \ "") \ ELEM_(std::string, auto_prog2_pathname, "AUTO_PROG2_PATHNAME", \ "Full pathname to the prog2 executable", \ "") \ ELEM_(std::string, auto_prog3_pathname, "AUTO_PROG3_PATHNAME", \ "Full pathname to the prog3 executable", \ "") \ ELEM_(bool, flrig_auto_enable, "FLRIG_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, flnet_auto_enable, "FLNET_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, fllog_auto_enable, "FLLOG_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, flamp_auto_enable, "FLAMP_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, prog1_auto_enable, "PROG1_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, prog2_auto_enable, "PROG2_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, prog3_auto_enable, "PROG3_AUTO_ENABLE", \ "Enable on program start", \ false) \ // declare the struct #define ELEM_DECLARE_CONFIGURATION(type_, var_, tag_, ...) type_ var_; #undef ELEM_ #define ELEM_ ELEM_DECLARE_CONFIGURATION struct configuration { CONFIG_LIST void writeDefaultsXML(); void storeDefaults(); bool readDefaultsXML(); void loadDefaults(); void saveDefaults(); int setDefaults(); void resetDefaults(void); static void reset(void); void initInterface(); void initMixerDevices(); void testCommPorts(); const char* strBaudRate(); int BaudRate(size_t); int nBaudRate(const char *); void initFonts(void); }; extern configuration progdefaults; extern void mixerInputs(); extern void enableMixer(bool); extern Fl_Font font_number(const char* name); enum { SAMPLE_RATE_UNSET = -1, SAMPLE_RATE_AUTO, SAMPLE_RATE_NATIVE, SAMPLE_RATE_OTHER }; #endif fldigi-3.21.80/src/include/main.h0000664000175000017500000000634712313147652013373 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef MAIN_H_ #define MAIN_H_ #include #include #include "ptt.h" #include "log.h" #if USE_HAMLIB # include "rigclass.h" #endif extern std::string appname; extern std::string BaseDir; extern std::string HomeDir; extern std::string RigsDir; extern std::string ScriptsDir; extern std::string PalettesDir; extern std::string LogsDir; extern std::string PicsDir; extern std::string HelpDir; extern std::string MacrosDir; extern std::string WrapDir; extern std::string TalkDir; extern std::string TempDir; extern std::string KmlDir; extern std::string PskMailDir; extern std::string DATA_dir; extern std::string NBEMS_dir; extern std::string ARQ_dir; extern std::string ARQ_files_dir; extern std::string ARQ_recv_dir; extern std::string ARQ_send; extern std::string WRAP_dir; extern std::string WRAP_recv_dir; extern std::string WRAP_send_dir; extern std::string WRAP_auto_dir; extern std::string ICS_dir; extern std::string ICS_msg_dir; extern std::string ICS_tmp_dir; extern std::string FLMSG_dir; extern std::string FLMSG_WRAP_dir; extern std::string FLMSG_WRAP_recv_dir; extern std::string FLMSG_WRAP_send_dir; extern std::string FLMSG_WRAP_auto_dir; extern std::string FLMSG_ICS_dir; extern std::string FLMSG_ICS_msg_dir; extern std::string FLMSG_ICS_tmp_dir; extern std::string FLAMP_dir; extern std::string FLAMP_rx_dir; extern std::string FLAMP_tx_dir; extern std::string xmlfname; extern std::string scDevice[2]; extern PTT *push2talk; #if USE_HAMLIB extern Rig *xcvr; #endif extern cLogfile *Maillogfile; extern cLogfile *logfile; extern bool gmfskmail; extern bool arqmode; extern std::string ArqFilename; extern bool mailclient; extern bool mailserver; extern bool tlfio; extern bool arq_text_available; extern int arq_get_char(); // ARQ mail implementation extern void arq_init(); extern void arq_close(); extern void WriteARQ(unsigned char); extern void checkTLF(); void check_nbems_dirs(void); void check_data_dir(void); extern bool nbems_dirs_checked; // This inits or reinits everything related to KML: Reloads params etc... void kml_init(bool load_files = false); // close down remaining threads just before exiting UI extern void exit_process(); int directory_is_created( const char * strdir ); // autostart an external program extern void start_process(std::string executable); #endif fldigi-3.21.80/src/include/flslider2.h0000664000175000017500000001424312313064025014317 00000000000000// ---------------------------------------------------------------------------- // flslider2.h // // Copyright (C) 2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef FL_SLIDER2_ #define FL_SLIDER2_ #include "config.h" #if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR < 3 #include #include #include #include #include class Fl_Slider2 : public Fl_Slider { public: Fl_Slider2(int x, int y, int w, int h, const char* l = 0) : Fl_Slider(x, y, w, h, l) { } int handle(int event); }; class Fl_Value_Slider2 : public Fl_Value_Slider { public: Fl_Value_Slider2(int x, int y, int w, int h, const char* l = 0) : Fl_Value_Slider(x, y, w, h, l) { } int handle(int event); }; class Fl_Counter2 : public Fl_Counter { Fl_Font textfont_; int textsize_; Fl_Color textcolor_; Fl_Color bkcolor_; public: Fl_Counter2(int x, int y, int w, int h, const char* l = 0) : Fl_Counter(x, y, w, h, l) { } int handle(int event); /** Gets the text font */ Fl_Font textfont() const {return textfont_;} /** Sets the text font to \p s */ void textfont(Fl_Font s) {textfont_ = s;} /** Gets the font size */ int textsize() const {return textsize_;} /** Sets the font size to \p s */ void textsize(int s) {textsize_ = s;} /** Gets the font color */ Fl_Color textcolor() const {return textcolor_;} /** Sets the font color to \p s */ void textcolor(Fl_Color s) {textcolor_ = s;} void textbkcolor(Fl_Color c) {bkcolor_ = c;} }; class Fl_Value_Input2 : public Fl_Value_Input { public: Fl_Value_Input2(int x, int y, int w, int h, const char* l = 0) : Fl_Value_Input(x, y, w, h, l) { } int handle(int event); }; class Fl_Spinner2 : public Fl_Spinner { public: Fl_Spinner2(int x, int y, int w, int h, const char* l = 0) : Fl_Spinner(x, y, w, h, l) { } int handle(int event); }; #else // support for 1.3.0 style slider #include #include #include #include class Fl_Slider2 : public Fl_Slider { public: Fl_Slider2(int x, int y, int w, int h, const char* l = 0) : Fl_Slider(x, y, w, h, l) { } int handle(int event); }; class Fl_Value_Slider2 : public Fl_Value_Slider { public: Fl_Value_Slider2(int x, int y, int w, int h, const char* l = 0) : Fl_Value_Slider(x, y, w, h, l) { } int handle(int event); }; class Fl_Value_Input2 : public Fl_Value_Input { public: Fl_Value_Input2(int x, int y, int w, int h, const char* l = 0) : Fl_Value_Input(x, y, w, h, l) { } int handle(int event); }; class Fl_Spinner2 : public Fl_Spinner { public: Fl_Spinner2(int x, int y, int w, int h, const char* l = 0) : Fl_Spinner(x, y, w, h, l) { } int handle(int event); }; //====================================================================== // Fl_Counter with // improved event handling, // color rendering //====================================================================== // values for type(): #define FL_NORMAL_COUNTER 0 /**< type() for counter with fast buttons */ #define FL_SIMPLE_COUNTER 1 /**< type() for counter without fast buttons */ /** Controls a single floating point value with button (or keyboard) arrows. Double arrows buttons achieve larger steps than simple arrows. \see Fl_Spinner for value input with vertical step arrows.

\image html counter.png

\image latex counter.png "My_Counter" width=4cm \todo Refactor the doxygen comments for My_Counter type() documentation. The type of an My_Counter object can be set using type(uchar t) to: \li \c FL_NORMAL_COUNTER: Displays a counter with 4 arrow buttons. \li \c FL_SIMPLE_COUNTER: Displays a counter with only 2 arrow buttons. */ class FL_EXPORT My_Counter : public Fl_Valuator { Fl_Font textfont_; Fl_Fontsize textsize_; Fl_Color textcolor_; Fl_Color bkcolor_; double lstep_; uchar mouseobj; static void repeat_callback(void *); int calc_mouseobj(); void increment_cb(); protected: void draw(); public: int handle(int); My_Counter(int X, int Y, int W, int H, const char* L = 0); ~My_Counter(); /** Sets the increment for the large step buttons. The default value is 1.0. \param[in] a large step increment. */ void lstep(double a) {lstep_ = a;} /** Sets the increments for the normal and large step buttons. \param[in] a, b normal and large step increments. */ void step(double a,double b) {Fl_Valuator::step(a); lstep_ = b;} /** Sets the increment for the normal step buttons. \param[in] a normal step increment. */ void step(double a) {Fl_Valuator::step(a);} /** Returns the increment for normal step buttons. */ double step() const {return Fl_Valuator::step();} /** Gets the text font */ Fl_Font textfont() const {return textfont_;} /** Sets the text font to \p s */ void textfont(Fl_Font s) {textfont_ = s;} /** Gets the font size */ Fl_Fontsize textsize() const {return textsize_;} /** Sets the font size to \p s */ void textsize(Fl_Fontsize s) {textsize_ = s;} /** Gets the font color */ Fl_Color textcolor() const {return textcolor_;} /** Sets the font color to \p s */ void textcolor(Fl_Color s) {textcolor_ = s;} void textbkcolor(Fl_Color c) {bkcolor_ = c;} }; class Fl_Counter2 : public My_Counter { public: Fl_Counter2(int x, int y, int w, int h, const char* l = 0) : My_Counter(x, y, w, h, l) { } int handle(int event); }; #endif // fltk-1.3.0 style slider #endif // FL_SLIDER2_ fldigi-3.21.80/src/include/logger.h0000664000175000017500000000250312313064025013704 00000000000000// ---------------------------------------------------------------------------- // logger.h Remote Log Interface for fldigi // // Copyright W1HKJ, Dave Freese 2006 // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _LOGGER_H #define _LOGGER_H // IPC interface to Xlog and fl_logbook #define LOG_MVERSION "1" #define LOG_MKEY 1238 #define LOG_MTYPE 88 #define LOG_MSG_LEN 1024 #include "qso_db.h" typedef struct { long mtype; char mtext[LOG_MSG_LEN]; } msgtype; extern void submit_log(); extern void submit_record(cQsoRec &); extern char logdate[]; extern char logtime[]; extern char adifdate[]; extern const char *logmode; #endif fldigi-3.21.80/src/include/psk_browser.h0000664000175000017500000000604512313064025014772 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef PSK_BROWSER_H #define PSK_BROWSER_H #include #include #include #include #include #include #include "viewpsk.h" #include "globals.h" #include "charsetdistiller.h" #include "re.h" #define BWSR_BORDER 2 class pskBrowser : public Fl_Hold_Browser{ private: static std::string hilite_color_1; static std::string hilite_color_2; static std::string white; static std::string bkgnd[]; std::string fline; std::string nuline; std::string bwsrline[MAXCHANNELS]; int bwsrfreq[MAXCHANNELS]; CharsetDistiller *cdistiller; int labelwidth[VIEWER_LABEL_NTYPES]; Fl_Font fnt; Fl_Color HiLite_1; Fl_Color HiLite_2; Fl_Color BkSelect; Fl_Color Backgnd1; Fl_Color Backgnd2; int siz; int cols[2]; char szLine[32]; size_t nchars; size_t linechars[32]; public: static int cwidth; static int cheight; static int sbarwidth; long long rfc; bool usb; fre_t *seek_re; public: pskBrowser(int x, int y, int w, int h, const char *l = ""); ~pskBrowser(); void makecolors(); void evalcwidth(); void setfont(Fl_Font font, int sz) { fnt = font; siz = sz; evalcwidth();} void HighLight_1(Fl_Color clr) { HiLite_1 = clr; } Fl_Color HighLight_1() { return HiLite_1; } void HighLight_2(Fl_Color clr) { HiLite_2 = clr; } Fl_Color HighLight_2() { return HiLite_2; } void SelectColor(Fl_Color clr) { BkSelect = clr; } Fl_Color SelectColor() { return BkSelect; } void Background1(Fl_Color clr) { Backgnd1 = clr; } Fl_Color Background1() { return Backgnd1; } void Background2(Fl_Color clr) { Backgnd2 = clr; } Fl_Color Background2() { return Backgnd2; } void columns(int a) { cols[0] = a; cols[1] = 0; column_widths(cols); } void resize(int x, int y, int w, int h); void addchr(int ch, int freq, unsigned char c, int md); std::string freqformat (int i); void set_freq(int i, int freq); void clearline(int i) { bwsrline[i] = ""; } std::string line(int i) { return (i < 1 ? "" : i > MAXCHANNELS ? "" : bwsrline[i - 1]); } int freq(int i); void clear(); void clearch(int n, int freq); void swap(int, int); int numchars() { return nchars; } void set_input_encoding(int encoding_id); }; #endif fldigi-3.21.80/src/include/benchmark.h0000664000175000017500000000237412313064025014365 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef BENCHMARK_H_ #define BENCHMARK_H_ #include #include #include "globals.h" struct benchmark_params { trx_mode modem; int freq; bool afc, sql; double sqlevel; double src_ratio; int src_type; std::string input, output, buffer; size_t samples; }; extern struct benchmark_params benchmark; int setup_benchmark(void); void do_benchmark(void); #endif fldigi-3.21.80/src/include/fileselect.h0000664000175000017500000000422512313064025014547 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef FILESELECT_H #define FILESELECT_H #include #if (FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR < 3) || (FLARQ_FLTK_API_MAJOR == 1 && FLARQ_FLTK_API_MINOR < 3) class Fl_Native_File_Chooser; class FSEL { public: static void create(void); static void destroy(void); static const char* select(const char* title, const char* filter, const char* def = 0, int* fsel = 0); static const char* saveas(const char* title, const char* filter, const char* def = 0, int* fsel = 0); static const char* dir_select(const char* title, const char* filter, const char* def = 0); ~FSEL(); private: FSEL(); FSEL(const FSEL&); FSEL& operator=(const FSEL&); const char* get_file(void); #if FSEL_THREAD static void* thread_func(void* arg); #endif private: static FSEL* inst; #ifdef __APPLE__ MAC_chooser* chooser; #else Fl_Native_File_Chooser* chooser; #endif int result; }; #else // API >=1.3.0 namespace FSEL { void create(void); void destroy(void); const char* select(const char* title, const char* filter, const char* def = 0, int *fsel = NULL); const char* saveas(const char* title, const char* filter, const char* def = 0, int *fsel = NULL); const char* dir_select(const char* title, const char* filter, const char* def = 0); } #endif // API < 1.3.0 #endif // FILESELECT_H fldigi-3.21.80/src/include/olivia.h0000664000175000017500000000407012313064025013711 00000000000000// ---------------------------------------------------------------------------- // olivia.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // Copyright (C) 2005 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _OLIVIA_H #define _OLIVIA_H #include "modem.h" #include "jalocha/pj_mfsk.h" #include "sound.h" #define TONE_DURATION (SCBLOCKSIZE * 16) #define SR4 ((TONE_DURATION) / 4) class olivia : public modem { private: MFSK_Transmitter < double >*Tx; MFSK_Receiver < double >*Rx; double *txfbuffer; int txbufferlen; double phaseacc; cmplx prevsymbol; int preamble; unsigned int shreg; double np; double sp; double sigpwr; double noisepwr; int escape; int smargin; int sinteg; int tones; int bw; double tone_bw; int preamblesent; int postamblesent; double preamblephase; double txbasefreq; double tone_midfreq; double lastfreq; double ampshape[SR4]; double tonebuff[TONE_DURATION]; double nco(double freq); void send_tones(); public: olivia(trx_mode omode = MODE_OLIVIA); ~olivia(); void init(); void rx_init(); void rx_flush(); void tx_init(SoundBase *sc); void restart(); int rx_process(const double *buf, int len); int tx_process(); int unescape(int c); }; #endif fldigi-3.21.80/src/include/Viewer.h0000664000175000017500000000313612313064025013671 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef Viewer_h #define Viewer_h #include #include #include #include #include #include #include "viewpsk.h" #include "psk_browser.h" #include "flslider2.h" #include "flinput2.h" extern Fl_Double_Window *dlgViewer; extern Fl_Value_Slider2 *sldrViewerSquelch; extern Fl_Double_Window* createViewer(); extern Fl_Input2 *viewer_inp_seek; extern pskBrowser *brwsViewer; extern void openViewer(); extern void viewaddchr(int ch, int freq, char c, int md); extern void viewerswap(int, int); extern void initViewer(); extern void viewclearchannel(int ch); extern void viewer_paste_freq(int freq); extern void viewer_redraw(); #endif fldigi-3.21.80/src/include/lgbook.h0000664000175000017500000001120512313150734013704 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0302 #ifndef lgbook_h #define lgbook_h #include #include "flinput2.h" // Avoid 'nitems' macro collision between FreeBSD's sys/params.h and fltk's // FL/Fl_Check_Browser.H (http://www.fltk.org/str.php?L2984) #undef nitems #include #define FLTK_nitems nitems #undef nitems // ^^^ Avoid 'nitems' macro collision extern Fl_Check_Browser *chkExportBrowser; #include extern Fl_Double_Window *wExport; #include #include extern Fl_Check_Browser *chkExportBrowser; #include extern Fl_Button *btnClearAll; extern Fl_Button *btnCheckAll; #include "calendar.h" extern Fl_DateInput *inp_export_start_date; extern Fl_DateInput *inp_export_stop_date; #include extern Fl_Check_Button *btn_export_by_date; #include extern Fl_Return_Button *btnOK; extern Fl_Button *btnCancel; extern Fl_Button *btnClearAllFields; extern Fl_Button *btnCheckAllFields; extern Fl_Check_Button *btnSelectCall; extern Fl_Check_Button *btnSelectName; extern Fl_Check_Button *btnSelectFreq; extern Fl_Check_Button *btnSelectBand; extern Fl_Check_Button *btnSelectMode; extern Fl_Check_Button *btnSelectQSOdateOn; extern Fl_Check_Button *btnSelectQSOdateOff; extern Fl_Check_Button *btnSelectTimeON; extern Fl_Check_Button *btnSelectTimeOFF; extern Fl_Check_Button *btnSelectTX_pwr; extern Fl_Check_Button *btnSelectRSTsent; extern Fl_Check_Button *btnSelectRSTrcvd; extern Fl_Check_Button *btnSelectQth; extern Fl_Check_Button *btnSelectLOC; extern Fl_Check_Button *btnSelectState; extern Fl_Check_Button *btnSelectQSL_VIA; extern Fl_Check_Button *btnSelectProvince; extern Fl_Check_Button *btnSelectCountry; extern Fl_Check_Button *btnSelectNotes; extern Fl_Check_Button *btnSelectQSLrcvd; extern Fl_Check_Button *btnSelectQSLsent; extern Fl_Check_Button *btnSelectSerialIN; extern Fl_Check_Button *btnSelectSerialOUT; extern Fl_Check_Button *btnSelectXchgIn; extern Fl_Check_Button *btnSelectMyXchg; extern Fl_Check_Button *btnSelectCNTY; extern Fl_Check_Button *btnSelectCONT; extern Fl_Check_Button *btnSelectCQZ; extern Fl_Check_Button *btnSelectDXCC; extern Fl_Check_Button *btnSelectIOTA; extern Fl_Check_Button *btnSelectITUZ; extern Fl_Button *btnSetFieldDefaults; extern Fl_Double_Window *dlgLogbook; extern Fl_DateInput *inpDate_log; extern Fl_Input2 *inpTimeOn_log; extern Fl_Input2 *inpCall_log; extern Fl_Input2 *inpName_log; extern Fl_Input2 *inpRstR_log; extern Fl_DateInput *inpQSLrcvddate_log; extern Fl_DateInput *inpDateOff_log; extern Fl_Input2 *inpTimeOff_log; extern Fl_Input2 *inpFreq_log; extern Fl_Input2 *inpMode_log; extern Fl_Input2 *inpTX_pwr_log; extern Fl_Input2 *inpRstS_log; extern Fl_DateInput *inpQSLsentdate_log; extern Fl_Input2 *inpQth_log; extern Fl_Input2 *inpState_log; extern Fl_Input2 *inpVE_Prov_log; extern Fl_Input2 *inpCountry_log; extern Fl_Input2 *inpLoc_log; extern Fl_Input2 *inpNotes_log; extern Fl_Input2 *inpCNTY_log; extern Fl_Input2 *inpIOTA_log; extern Fl_Input2 *inpCQZ_log; extern Fl_Input2 *inpITUZ_log; extern Fl_Input2 *inpCONT_log; extern Fl_Input2 *inpDXCC_log; extern Fl_Input2 *inpQSL_VIA_log; extern Fl_Input2 *inpSerNoOut_log; extern Fl_Input2 *inpMyXchg_log; extern Fl_Input2 *inpSerNoIn_log; extern Fl_Input2 *inpXchgIn_log; extern Fl_Input2 *inpSearchString; extern Fl_Input2 *txtNbrRecs_log; extern void cb_btnNewSave(Fl_Button*, void*); extern Fl_Button *bNewSave; extern void cb_btnUpdateCancel(Fl_Button*, void*); extern Fl_Button *bUpdateCancel; extern void cb_btnDelete(Fl_Button*, void*); extern Fl_Button *bDelete; extern void cb_btnDialFreq(Fl_Button*, void*); extern Fl_Button *bDialFreq; extern void cb_search(Fl_Button*, void*); extern Fl_Button *bSearchPrev; extern Fl_Button *bSearchNext; #include "table.h" extern Table *wBrowser; extern Fl_Double_Window *wCabrillo; extern Fl_Check_Browser *chkCabBrowser; extern Fl_Button *btnCabClearAll; extern Fl_Button *btnCabCheckAll; extern Fl_Return_Button *btnCabOK; extern Fl_Button *btnCabCancel; #include "combo.h" extern void setContestType(); extern Fl_ComboBox *cboContest; extern Fl_Check_Button *btnCabCall; extern Fl_Check_Button *btnCabFreq; extern Fl_Check_Button *btnCabMode; extern Fl_Check_Button *btnCabQSOdate; extern Fl_Check_Button *btnCabTimeOFF; extern Fl_Check_Button *btnCabRSTsent; extern Fl_Check_Button *btnCabRSTrcvd; extern Fl_Check_Button *btnCabSerialIN; extern Fl_Check_Button *btnCabSerialOUT; extern Fl_Check_Button *btnCabXchgIn; extern Fl_Check_Button *btnCabMyXchg; extern Fl_Button *btnCabClearAllFields; extern Fl_Button *btnCabCheckAllFields; void create_logbook_dialogs(); #endif fldigi-3.21.80/src/include/lookupcall.h0000664000175000017500000000306712313064025014600 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef LOOKUPCALL_H #define LOOKUPCALL_H #include extern std::string lookup_latd; extern std::string lookup_lond; extern std::string lookup_addr1; extern std::string lookup_addr2; extern std::string lookup_qth; extern std::string lookup_state; extern std::string lookup_province; extern std::string lookup_zip; extern std::string lookup_country; extern void clear_Lookup(); extern void CALLSIGNquery(); enum qrz_xmlquery_t { QRZXML_EXIT = -1, QRZXMLNONE, QRZNET, QRZCD, HAMCALLNET, CALLOOK, HAMQTH }; enum qrz_webquery_t { QRZWEB_EXIT = -1, QRZWEBNONE, QRZHTML, HAMCALLHTML, HAMQTHHTML }; extern void sendEQSL(const char *url); extern void makeEQSL(const char *msg); #endif fldigi-3.21.80/src/include/thor.h0000664000175000017500000000777612313064025013422 00000000000000// ---------------------------------------------------------------------------- // thor.h -- thor modem // // Copyright (C) 2008-2012 // David Freese // John Douyere // John Phelps // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _thor_H #define _thor_H #include #include "complex.h" #include "modem.h" #include "globals.h" #include "filters.h" #include "fftfilt.h" #include "dominovar.h" #include "mbuffer.h" // NASA coefficients for viterbi encode/decode algorithms #define THOR_K 7 #define THOR_POLY1 0x6d #define THOR_POLY2 0x4f //VK2ETA high speed modes // IEEE coefficients for viterbi encode/decode algorithms #define THOR_K15 15 #define K15_POLY1 044735 #define K15_POLY2 063057 //#include "mfskvaricode.h" #include "interleave.h" #include "viterbi.h" #define THORNUMTONES 18 #define THORMAXFFTS 8 #define THORBASEFREQ 1500.0 #define THORFIRSTIF 2000.0 #define THORSCOPESIZE 64 #define THORSLOWPATHS 3 #define THORFASTPATHS 5 // the following constant changes if a mode with more tones than 25x4 is // created #define MAXPATHS (8 * THORFASTPATHS * THORNUMTONES ) struct THORrxpipe { cmplx vector[THORMAXFFTS * THORNUMTONES * 6]; }; class thor : public modem { public: enum { TX_STATE_PREAMBLE, TX_STATE_START, TX_STATE_DATA, TX_STATE_END, TX_STATE_FLUSH }; protected: // common variables double phase[THORMAXFFTS + 1]; double txphase; int symlen; int doublespaced; double tonespacing; int counter; unsigned int twosym; int paths; int numbins; bool slowcpu; int basetone; int lotone; int hitone; int extones; // rx variables C_FIR_filter *hilbert; sfft *binsfft[THORMAXFFTS]; fftfilt *fft; Cmovavg *vidfilter[THORSCOPESIZE]; Cmovavg *syncfilter; THORrxpipe *pipe; unsigned int pipeptr; unsigned int datashreg; mbuffer scopedata; mbuffer videodata; cmplx currvector; int currsymbol; int prev1symbol; int prev2symbol; double currmag; double prev1mag; double prev2mag; double met1; double met2; double sig; double noise; double s2n; int synccounter; unsigned char symbolbuf[MAX_VARICODE_LEN]; int symcounter; int symbolbit; bool filter_reset; bool staticburst; int fec_confidence; // tx variables int txstate; int txprevtone; unsigned int bitshreg; std::string strSecXmtText; unsigned int cptr; viterbi *Dec; interleave *Rxinlv; encoder *Enc; interleave *Txinlv; int bitstate; unsigned char symbolpair[2]; int flushlength; private: cmplx mixer(int n, const cmplx& in); // Rx void recvchar(int c); void decodesymbol(); void softdecodesymbol(); int harddecode(); int softdecode(); void update_syncscope(); void synchronize(); void reset_afc(); void eval_s2n(); int get_secondary_char(); void reset_filters(); void decodePairs(unsigned char symbol); bool preambledetect(int c); void softflushrx(); // Tx void sendtone(int tone, int duration); void sendsymbol(int sym); void sendchar(unsigned char c, int secondary); void sendidle(); void sendsecondary(); void flushtx(); void Clearbits(); protected: void s2nreport(void); public: thor (trx_mode md); ~thor (); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart(); int rx_process(const double *buf, int len); int tx_process(); }; #endif fldigi-3.21.80/src/include/fftfilt.h0000664000175000017500000000372012313064025014065 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _FFTFILT_H #define _FFTFILT_H #include "complex.h" #include "gfft.h" //---------------------------------------------------------------------- class fftfilt { enum {NONE, BLACKMAN, HAMMING, HANNING}; protected: int flen; int flen2; g_fft *fft; g_fft *ift; cmplx *ht; cmplx *filter; cmplx *timedata; cmplx *freqdata; cmplx *ovlbuf; cmplx *output; int inptr; int pass; int window; inline double fsinc(double fc, int i, int len) { return (i == len/2) ? 2.0 * fc: sin(2 * M_PI * fc * (i - len/2)) / (M_PI * (i - len/2)); } inline double _blackman(int i, int len) { return (0.42 - 0.50 * cos(2.0 * M_PI * i / len) + 0.08 * cos(4.0 * M_PI * i / len)); } void init_filter(); public: fftfilt(double f1, double f2, int len); fftfilt(double f, int len); ~fftfilt(); // f1 < f2 ==> bandpass // f1 > f2 ==> band reject void create_filter(double f1, double f2); void create_lpf(double f) { create_filter(0, f); } void create_hpf(double f) { create_filter(f, 0); } void rtty_filter(double); int run(const cmplx& in, cmplx **out); }; #endif fldigi-3.21.80/src/include/speak.h0000664000175000017500000000205512313064025013532 00000000000000// ---------------------------------------------------------------------------- // speak.h Remote Log Interface for fldigi // // Copyright W1HKJ, Dave Freese 2009 // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _SPEAK_H #define _SPEAK_H extern const char *txtTalkInfo; void open_talker(); void close_talker(); void toggle_talker(); void speak(int c); #endif fldigi-3.21.80/src/include/view_rtty.h0000664000175000017500000000675212313064025014473 00000000000000// ---------------------------------------------------------------------------- // rtty.h -- RTTY modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef VIEW_RTTY_H #define VIEW_RTTY_H #include "rtty.h" #include "complex.h" #include "modem.h" #include "globals.h" #include "filters.h" #include "fftfilt.h" #include "digiscope.h" #define VIEW_RTTY_SampleRate 8000 #define VIEW_RTTY_MAXBITS (2 * VIEW_RTTY_SampleRate / 23 + 1) #define MAX_CHANNELS 30 enum CHANNEL_STATE {IDLE, SRCHG, RCVNG, WAITING}; struct RTTY_CHANNEL { int state; double phaseacc; fftfilt *mark_filt; fftfilt *space_filt; Cmovavg *bits; bool nubit; bool bit; bool bit_buf[MAXBITS]; double mark_phase; double space_phase; double metric; int rxmode; RTTY_RX_STATE rxstate; double frequency; double freqerr; double phase; double posfreq; double negfreq; double freqerrhi; double freqerrlo; double poserr; double negerr; int poscnt; int negcnt; int timeout; double mark_mag; double space_mag; double mark_env; double space_env; double noise_floor; double mark_noise; double space_noise; double sigpwr; double noisepwr; double avgsig; double prevsymbol; cmplx prevsmpl; int counter; int bitcntr; int rxdata; int inp_ptr; cmplx mark_history[MAXPIPE]; cmplx space_history[MAXPIPE]; int sigsearch; }; class view_rtty : public modem { public: static const double SHIFT[]; static const double BAUD[]; static const int BITS[]; private: double shift; int symbollen; int nbits; int stoplen; int msb; bool useFSK; RTTY_CHANNEL channel[MAX_CHANNELS]; double rtty_squelch; double rtty_shift; double rtty_BW; double rtty_baud; int rtty_bits; RTTY_PARITY rtty_parity; int rtty_stop; bool rtty_msbfirst; int bflen; double bp_filt_lo; double bp_filt_hi; int txmode; int preamble; void clear_syncscope(); void update_syncscope(); cmplx mixer(double &phase, double f, cmplx in); unsigned char bitreverse(unsigned char in, int n); int decode_char(int ch); int rttyparity(unsigned int); bool rx(int ch, bool bit); int rttyxprocess(); char baudot_dec(int ch, unsigned char data); void Metric(int ch); public: view_rtty(trx_mode mode); ~view_rtty(); void init(); void rx_init(); void tx_init(SoundBase *sc){} void restart(); void reset_filters(int ch); int rx_process(const double *buf, int len); int tx_process(); void find_signals(); void clearch(int ch); void clear(); int get_freq(int n) { return (int)channel[n].frequency;} bool is_mark_space(int ch, int &); bool is_mark(int ch); }; extern view_rtty *rttyviewer; #endif fldigi-3.21.80/src/include/strutil.h0000664000175000017500000002132612313301270014133 00000000000000// ---------------------------------------------------------------------------- // strutil.h // // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef STRUTIL_H_ #define STRUTIL_H_ #include #include #include #include #include namespace join_ { template struct empty { bool operator()(const T& v) const { return false; }; }; template <> struct empty { bool operator()(const char* v) const { return !v || *v == '\0'; }; }; template <> struct empty { bool operator()(char* v) const { return !v || *v == '\0'; }; }; template <> struct empty { bool operator()(const wchar_t* v) const { return !v || *v == L'\0'; }; }; template <> struct empty { bool operator()(wchar_t* v) const { return !v || *v == L'\0'; }; }; template struct empty > { bool operator()(const std::basic_string& v) const { return v.empty(); }; }; template > class ostream_iterator : public std::iterator { public: typedef std::basic_ostream ostream_type; ostream_iterator(ostream_type& s, const CharT* sep = 0, bool ie = false) : stream(&s), join_string(sep), print_sep(false), ignore_empty(ie) { } ostream_iterator& operator=(const T& value) { if (!ignore_empty || !is_empty(value)) { if (print_sep) *stream << join_string; *stream << value; print_sep = true; } return *this; } ostream_iterator& operator*(void) { return *this; } ostream_iterator& operator++(void) { return *this; } ostream_iterator& operator++(int) { return *this; } private: ostream_type* stream; const CharT* join_string; bool print_sep, ignore_empty; empty is_empty; }; }; template std::basic_ostream& join(std::basic_ostream& stream, const T* begin, const T* end, const char* sep, bool ignore_empty = false) { std::copy(begin, end, join_::ostream_iterator(stream, sep, ignore_empty)); return stream; } template std::basic_ostream& join(std::basic_ostream& stream, const T* ptr, size_t len, const char* sep, bool ignore_empty = false) { join(stream, ptr, ptr + len, sep, ignore_empty); return stream; } template std::string join(const T* begin, const T* end, const char* sep, bool ignore_empty = false) { std::ostringstream stream; join(stream, begin, end, sep, ignore_empty); return stream.str(); } template std::string join(const T* ptr, size_t len, const char* sep, bool ignore_empty = false) { return join(ptr, ptr + len, sep, ignore_empty); } template std::basic_string join(const std::basic_string* begin, const std::basic_string* end, const char* sep, bool ignore_empty = false) { std::basic_ostringstream > stream; join >(stream, begin, end, sep, ignore_empty); return stream.str(); } template std::basic_string join(const std::basic_string* begin, size_t len, const char* sep, bool ignore_empty = false) { return join(begin, begin + len, sep, ignore_empty); } #include #include std::vector split(const char* re_str, const char* str, unsigned max_split = UINT_MAX); // Fills a string with snpritnf format string. std::string strformat( const char * fmt, ... ); // Eliminates spaces and tabs at the beginning and the end. void strtrim( std::string & str ); // First letter of each word in uppercase, the rest in lowercase. void strcapitalize( std::string & str ); // Returns the replacement of all occurences of a given string by another. std::string strreplace( const std::string & inp, const std::string & from, const std::string & to ); /// Edit distance: Returns an integer which is the distance between the two strings. size_t levenshtein(const std::string & source, const std::string & target); // Conversion to uppercase. std::string uppercase( const std::string & str ); // ---------------------------------------------------------------------------- /// This is a read-only replacement for std::stringstream. struct imemstream : public std::streambuf, public std::istream { /// Faster than stringstream because no copy. imemstream(char* s, std::size_t n) : std::istream( this ) { setg(s, s, s + n); } /// Faster than stringstream because no copy. imemstream(const std::string & r) : std::istream( this ) { char * s = const_cast< char * >( r.c_str() ); setg(s, s, s + r.size()); } }; // ---------------------------------------------------------------------------- /// Tells if type is a char[]. Used for SFINAE. template< class T > struct DtTyp { /// In the general case, data types are not char arrays. struct Any {}; }; /// Matches if the type is a char[]. template< size_t N > struct DtTyp< char[N] > { struct Array {}; static const size_t Size = N ; }; /// Reads all chars until after the delimiter. bool read_until_delim( char delim, std::istream & istrm ); /// Reads a char followed by the delimiter. bool read_until_delim( char delim, std::istream & istrm, char & ref, const char dflt ); /// Reads a double up to the given delimiter. inline bool read_until_delim( char delim, std::istream & istrm, double & ref ) { istrm >> ref ; if( ! istrm ) return false ; char tmp = istrm.get(); if( istrm.eof() ) { /// Resets to good to mean that it worked fine. istrm.clear(); return true ; } return tmp == delim ; } /// Reads a string up to the given delimiter. inline bool read_until_delim( char delim, std::istream & istrm, std::string & ref ) { std::getline( istrm, ref, delim ); if ( (istrm.rdstate() & std::istream::goodbit) == 0 ) return true ; else return false ; } /// For reading from a string with tokens separated by a char. Used to load CSV files. template< typename Tp > bool read_until_delim( char delim, std::istream & istrm, Tp & ref, typename DtTyp< Tp >::Any = typename DtTyp< Tp >::Any() ) { std::string parsed_str ; std::getline( istrm, parsed_str, delim ); if( ! ((istrm.rdstate() & std::istream::goodbit) == 0)) { return false ; } imemstream sstrm( parsed_str ); sstrm >> ref ; return true ; } /// Same, with a default value if there is nothing to read. template< typename Tp > bool read_until_delim( char delim, std::istream & istrm, Tp & ref, const Tp dflt, typename DtTyp< Tp >::Any = typename DtTyp< Tp >::Any() ) { std::string parsed_str ; std::getline( istrm, parsed_str, delim ) ; if( ! ((istrm.rdstate() & std::istream::goodbit) == 0) ) { return false ; } if( parsed_str.empty() ) { ref = dflt ; return true; } imemstream sstrm( parsed_str ); sstrm >> ref ; return true ; } /// For reading from a string with tokens separated by a char to a fixed-size array. template< typename Tp > bool read_until_delim( char delim, std::istream & istrm, Tp & ref, typename DtTyp< Tp >::Array = typename DtTyp< Tp >::Array() ) { istrm.getline( ref, DtTyp< Tp >::Size, delim ); // Should we return an error if buffer is too small? return( (istrm.rdstate() & std::istream::goodbit) == 0 ); } /// Same, with a default value if there is nothing to read. Fixed-size array. template< typename Tp > bool read_until_delim( char delim, std::istream & istrm, Tp & ref, const Tp dflt, typename DtTyp< Tp >::Array = typename DtTyp< Tp >::Array() ) { istrm.getline( ref, DtTyp< Tp >::Size, delim ); // If nothing to read, copy the default value. if( ref[0] == '\0' ) { strncpy( ref, dflt, DtTyp< Tp >::Size - 1 ); } // Should we return an error if buffer is too small? return ((istrm.rdstate() & std::istream::goodbit) == 0 ); } // ---------------------------------------------------------------------------- #endif // STRUTIL_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-3.21.80/src/include/locator.h0000664000175000017500000000354312313064025014075 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef LOCATOR_H_ #define LOCATOR_H_ #include #if USE_HAMLIB # include #else # ifdef __cplusplus extern "C" { # endif extern int qrb(double lon1, double lat1, double lon2, double lat2, double *distance, double *azimuth); extern double distance_long_path(double distance); extern double azimuth_long_path(double azimuth); extern int longlat2locator(double longitude, double latitude, char *locator_res, int pair_count); extern int locator2longlat(double *longitude, double *latitude, const char *locator); extern double dms2dec(int degrees, int minutes, double seconds, int sw); extern int dec2dms(double dec, int *degrees, int *minutes, double *seconds, int *sw); extern int dec2dmmm(double dec, int *degrees, double *minutes, int *sw); extern double dmmm2dec(int degrees, double minutes, int sw); # define HAMLIB_API /* empty */ enum rig_errcode_e { RIG_OK = 0, RIG_EINVAL }; # ifdef __cplusplus } # endif #endif /* USE_HAMLIB */ #endif /* LOCATOR_H_ */ fldigi-3.21.80/src/include/mt63.h0000664000175000017500000000323212313064025013216 00000000000000// ---------------------------------------------------------------------------- // mt63.h // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // Copyright (C) 2005 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef MT63_MODEM_H #define MT63_MODEM_H #include "dsp.h" #include "mt63base.h" #include "modem.h" class mt63 : public modem { private: int Interleave; int flush; int escape; bool long_integral; MT63tx *Tx; MT63rx *Rx; dspLevelMonitor *InpLevel; double_buff *InpBuff; double_buff *emptyBuff; bool flushbuffer; double FEC_offset; double FEC_snr; public: mt63(trx_mode mode); ~mt63(); void init(); void rx_init(); void tx_init(SoundBase*); void restart(); int rx_process(const double *buf, int len); int tx_process(); void rx_flush(); void set_freq(double); }; #endif fldigi-3.21.80/src/include/feld.h0000664000175000017500000000516112313064025013342 00000000000000// ---------------------------------------------------------------------------- // feld.h -- FELDHELL modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _FELD_H #define _FELD_H #include "modem.h" #include "filters.h" #include "fftfilt.h" #include "mbuffer.h" #define FeldSampleRate 8000 #define FeldMaxSymLen 1024 #define RxColumnLen 30 #define TxColumnLen 14 #define PIXMAP_W 14 #define PIXMAP_H (TxColumnLen) #define MAXLEN 512 class feld : public modem { enum FELD_STATE {PREAMBLE, POSTAMBLE, DATA}; protected: //rx double rxphacc; double rxdelta; double rxcounter; double agc; double peakval; double peakhold; double minhold; double rxpixrate; double txpixrate; double downsampleinc; double upsampleinc; double phi2freq; C_FIR_filter *hilbert; fftfilt *bpfilt; Cmovavg *bbfilt; Cmovavg *minmaxfilt; Cmovavg *average; //tx FELD_STATE tx_state; double txphacc; double txcounter; double hell_bandwidth; double filter_bandwidth; int depth; int dxmode; int halfwidth; bool blackboard; bool hardkeying; double feldcolumnrate; int preamble; int postamble; int prevsymb; cmplx prev; double OnShape[MAXLEN]; double OffShape[MAXLEN]; mbuffer col_data; int col_pointer; int fntnbr; cmplx mixer(cmplx); double nco(double); void rx(cmplx); void FSKHELL_rx(cmplx); void send_symbol(int currsymbol, int nextsymbol); void send_null_column(); void tx_char(char); void initKeyWaveform(); public: feld(trx_mode); ~feld(); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart(); int rx_process(const double *buf, int len); int tx_process(); int get_font_data(unsigned char c, int col); }; #endif fldigi-3.21.80/src/include/colorbox.h0000664000175000017500000000240312313064025014253 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef COLORBOX_H #define COLORBOX_H #include extern void loadPalette(); extern void savePalette(); extern void selectColor(int); extern void setColorButtons(); class colorbox : public Fl_Button { void draw(); public: colorbox(int x, int y, int w, int h, const char *label = 0) : Fl_Button(x,y,w,h,label) { Fl_Button::box(FL_DOWN_BOX); }; void end(){}; }; #endif fldigi-3.21.80/src/include/network.h0000664000175000017500000000263712313064025014126 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef NETWORK_H_ #define NETWORK_H_ #include bool request_reply(const std::string& node, const std::string& service, const std::string& request, std::string& reply, double timeout = 0.0); bool fetch_http(const std::string& url, std::string& reply, double timeout = 0.0); bool fetch_http_gui(const std::string& url, std::string& reply, double timeout = 0.0); bool fetch_http_gui(const std::string& url, std::string& reply, double timeout, void(*busy)(void*), void* arg1, void(*done)(void*), void* arg2); #endif // NETWORK_H_ fldigi-3.21.80/src/include/dxcc.h0000664000175000017500000000334412313064025013352 00000000000000// ---------------------------------------------------------------------------- // dxcc.h // // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef DXCC_H_ #define DXCC_H_ #include struct dxcc { const char* country; int cq_zone; int itu_zone; char continent[3]; float latitude; float longitude; float gmt_offset; dxcc(const char* cn = "", int cq = 0, int itu = 0, const char* ct = "", float lat = 0.0f, float lon = 0.0f, float tz = 0.0f); }; enum qsl_t { QSL_LOTW, QSL_EQSL, QSL_END }; extern const char* qsl_names[]; bool dxcc_open(const char* filename); bool dxcc_is_open(void); void dxcc_close(void); const dxcc* dxcc_lookup(const char* callsign); const std::vector* dxcc_entity_list(void); bool qsl_open(const char* filename, qsl_t qsl_type); unsigned char qsl_is_open(void); void qsl_close(void); unsigned char qsl_lookup(const char* callsign); extern void reload_cty_dat(); extern void default_cty_dat_pathname(); extern void select_cty_dat_pathname(); #endif // DXCC_H_ fldigi-3.21.80/src/include/globals.h0000664000175000017500000001307112313147652014062 00000000000000// ---------------------------------------------------------------------------- // globals.h -- constants, variables, arrays & functions that need to be // outside of any thread // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted in part from code contained in gmfsk // source code distribution. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _GLOBALS_H #define _GLOBALS_H #include #include enum state_t { STATE_PAUSE = 0, STATE_RX, STATE_TX, STATE_RESTART, STATE_TUNE, STATE_ABORT, STATE_FLUSH, STATE_NOOP, STATE_EXIT, STATE_ENDED, STATE_IDLE, STATE_NEW_MODEM }; enum { MODE_PREV = -2, MODE_NEXT, MODE_NULL, MODE_CW, MODE_CONTESTIA, MODE_DOMINOEX4, MODE_DOMINOEX5, MODE_DOMINOEX8, MODE_DOMINOEX11, MODE_DOMINOEX16, MODE_DOMINOEX22, MODE_DOMINOEX44, MODE_DOMINOEX88, MODE_DOMINOEX_FIRST = MODE_DOMINOEX4, MODE_DOMINOEX_LAST = MODE_DOMINOEX88, MODE_FELDHELL, MODE_SLOWHELL, MODE_HELLX5, MODE_HELLX9, MODE_FSKHELL, MODE_FSKH105, MODE_HELL80, MODE_HELL_FIRST = MODE_FELDHELL, MODE_HELL_LAST = MODE_HELL80, MODE_MFSK8, MODE_MFSK16, MODE_MFSK32, MODE_MFSK4, MODE_MFSK11, MODE_MFSK22, MODE_MFSK31, MODE_MFSK64, MODE_MFSK128, MODE_MFSK64L, MODE_MFSK128L, MODE_MFSK_FIRST = MODE_MFSK8, MODE_MFSK_LAST = MODE_MFSK128L, MODE_WEFAX_576, MODE_WEFAX_288, MODE_WEFAX_FIRST = MODE_WEFAX_576, MODE_WEFAX_LAST = MODE_WEFAX_288, MODE_NAVTEX, MODE_SITORB, MODE_NAVTEX_FIRST = MODE_NAVTEX, MODE_NAVTEX_LAST = MODE_SITORB, MODE_MT63_500S, MODE_MT63_500L, MODE_MT63_1000S, MODE_MT63_1000L, MODE_MT63_2000S, MODE_MT63_2000L, MODE_MT63_FIRST = MODE_MT63_500S, MODE_MT63_LAST = MODE_MT63_2000L, MODE_PSK31, MODE_PSK63, MODE_PSK63F, MODE_PSK125, MODE_PSK250, MODE_PSK500, MODE_QPSK31, MODE_QPSK63, MODE_QPSK125, MODE_QPSK250, MODE_QPSK500, MODE_PSK125R, MODE_PSK250R, MODE_PSK500R, MODE_PSK1000, MODE_PSK1000R, MODE_PSK_FIRST = MODE_PSK31, MODE_PSK_LAST = MODE_PSK1000R, MODE_OLIVIA, MODE_OLIVIA_4_250, MODE_OLIVIA_8_250, MODE_OLIVIA_4_500, MODE_OLIVIA_8_500, MODE_OLIVIA_16_500, MODE_OLIVIA_8_1000, MODE_OLIVIA_16_1000, MODE_OLIVIA_32_1000, MODE_OLIVIA_64_2000, MODE_RTTY, MODE_THOR4, MODE_THOR5, MODE_THOR8, MODE_THOR11, MODE_THOR16, MODE_THOR22, MODE_THOR25x4, MODE_THOR50x1, MODE_THOR50x2, MODE_THOR100, MODE_THOR_FIRST = MODE_THOR4, MODE_THOR_LAST = MODE_THOR100, MODE_THROB1, MODE_THROB2, MODE_THROB4, MODE_THROBX1, MODE_THROBX2, MODE_THROBX4, MODE_THROB_FIRST = MODE_THROB1, MODE_THROB_LAST = MODE_THROBX4, // high speed && multiple carrier modes MODE_4X_PSK63R, MODE_5X_PSK63R, MODE_10X_PSK63R, MODE_20X_PSK63R, MODE_32X_PSK63R, MODE_4X_PSK125R, MODE_5X_PSK125R, MODE_10X_PSK125R, MODE_12X_PSK125, MODE_12X_PSK125R, MODE_16X_PSK125R, MODE_6X_PSK250, MODE_2X_PSK250R, MODE_3X_PSK250R, MODE_5X_PSK250R, MODE_6X_PSK250R, MODE_7X_PSK250R, MODE_2X_PSK500, MODE_4X_PSK500, MODE_2X_PSK500R, MODE_3X_PSK500R, MODE_4X_PSK500R, MODE_2X_PSK800, MODE_2X_PSK800R, MODE_2X_PSK1000, MODE_2X_PSK1000R, MODE_SSB, MODE_WWV, MODE_ANALYSIS, NUM_MODES, NUM_RXTX_MODES = NUM_MODES - 2 }; typedef intptr_t trx_mode; struct mode_info_t { trx_mode mode; class modem **modem; const char *sname; const char *name; const char *pskmail_name; const char *adif_name; const char *vid_name; }; extern const struct mode_info_t mode_info[NUM_MODES]; class qrg_mode_t { public: long long rfcarrier; std::string rmode; int carrier; trx_mode mode; qrg_mode_t() : rfcarrier(0), rmode("NONE"), carrier(0), mode(NUM_MODES) { } qrg_mode_t(long long rfc_, std::string rm_, int c_, trx_mode m_) : rfcarrier(rfc_), rmode(rm_), carrier(c_), mode(m_) { } bool operator<(const qrg_mode_t& rhs) const { return rfcarrier < rhs.rfcarrier; } bool operator==(const qrg_mode_t& rhs) const { return rfcarrier == rhs.rfcarrier && rmode == rhs.rmode && carrier == rhs.carrier && mode == rhs.mode; } std::string str(void); }; std::ostream& operator<<(std::ostream& s, const qrg_mode_t& m); std::istream& operator>>(std::istream& s, qrg_mode_t& m); #include class mode_set_t : public std::bitset { }; enum band_t { BAND_160M, BAND_80M, BAND_75M, BAND_60M, BAND_40M, BAND_30M, BAND_20M, BAND_17M, BAND_15M, BAND_12M, BAND_10M, BAND_6M, BAND_4M, BAND_2M, BAND_125CM, BAND_70CM, BAND_33CM, BAND_23CM, BAND_13CM, BAND_9CM, BAND_6CM, BAND_3CM, BAND_125MM, BAND_6MM, BAND_4MM, BAND_2P5MM, BAND_2MM, BAND_1MM, BAND_OTHER, NUM_BANDS }; band_t band(long long freq_hz); band_t band(const char* freq_mhz); const char* band_name(band_t b); const char* band_name(const char* freq_mhz); const char* band_freq(band_t b); const char* band_freq(const char* band_name); // psk_browser enums enum { VIEWER_LABEL_OFF, VIEWER_LABEL_AF, VIEWER_LABEL_RF, VIEWER_LABEL_CH, VIEWER_LABEL_NTYPES }; #endif fldigi-3.21.80/src/include/gettext.h0000664000175000017500000002275412313064025014123 00000000000000/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002, 2004-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 fldigi. If not, see . */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 #include "config.h" /* NLS can be disabled through the configure --disable-nls option. */ #if ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include /* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by the gettext() and ngettext() macros. This is an alternative to calling textdomain(), and is useful for libraries. */ # ifdef DEFAULT_TEXT_DOMAIN # undef gettext # define gettext(Msgid) \ dgettext (DEFAULT_TEXT_DOMAIN, Msgid) # undef ngettext # define ngettext(Msgid1, Msgid2, N) \ dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) # endif #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Many header files from the libstdc++ coming with g++ 3.3 or newer include , which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. */ #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) # include # if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H # include # endif #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # define gettext(Msgid) ((const char *) (Msgid)) # define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) # define dcgettext(Domainname, Msgid, Category) \ ((void) (Category), dgettext (Domainname, Msgid)) # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 \ ? ((void) (Msgid2), (const char *) (Msgid1)) \ : ((void) (Msgid1), (const char *) (Msgid2))) # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N)) # define textdomain(Domainname) ((const char *) (Domainname)) # define bindtextdomain(Domainname, Dirname) \ ((void) (Domainname), (const char *) (Dirname)) # define bind_textdomain_codeset(Domainname, Codeset) \ ((void) (Domainname), (const char *) (Codeset)) #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define gettext_noop(String) String /* The separator between msgctxt and msgid in a .mo file. */ #define GETTEXT_CONTEXT_GLUE "\004" /* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be short and rarely need to change. The letter 'p' stands for 'particular' or 'special'. */ #ifdef DEFAULT_TEXT_DOMAIN # define pgettext(Msgctxt, Msgid) \ pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #else # define pgettext(Msgctxt, Msgid) \ pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #endif #define dpgettext(Domainname, Msgctxt, Msgid) \ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) #ifdef DEFAULT_TEXT_DOMAIN # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #else # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #endif #define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * pgettext_aux (const char *domain, const char *msg_ctxt_id, const char *msgid, int category) { const char *translation = dcgettext (domain, msg_ctxt_id, category); if (translation == msg_ctxt_id) return msgid; else return translation; } #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * npgettext_aux (const char *domain, const char *msg_ctxt_id, const char *msgid, const char *msgid_plural, unsigned long int n, int category) { const char *translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); if (translation == msg_ctxt_id || translation == msgid_plural) return (n == 1 ? msgid : msgid_plural); else return translation; } /* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID can be arbitrary expressions. But for string literals these macros are less efficient than those above. */ #include #define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \ /* || __STDC_VERSION__ >= 199901L */ ) #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS #include #endif #define pgettext_expr(Msgctxt, Msgid) \ dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) #define dpgettext_expr(Domainname, Msgctxt, Msgid) \ dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * dcpgettext_expr (const char *domain, const char *msgctxt, const char *msgid, int category) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS char msg_ctxt_id[msgctxt_len + msgid_len]; #else char buf[1024]; char *msg_ctxt_id = (msgctxt_len + msgid_len <= sizeof (buf) ? buf : (char *) malloc (msgctxt_len + msgid_len)); if (msg_ctxt_id != NULL) #endif { memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = dcgettext (domain, msg_ctxt_id, category); #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS if (msg_ctxt_id != buf) free (msg_ctxt_id); #endif if (translation != msg_ctxt_id) return translation; } return msgid; } #define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) #define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * dcnpgettext_expr (const char *domain, const char *msgctxt, const char *msgid, const char *msgid_plural, unsigned long int n, int category) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS char msg_ctxt_id[msgctxt_len + msgid_len]; #else char buf[1024]; char *msg_ctxt_id = (msgctxt_len + msgid_len <= sizeof (buf) ? buf : (char *) malloc (msgctxt_len + msgid_len)); if (msg_ctxt_id != NULL) #endif { memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS if (msg_ctxt_id != buf) free (msg_ctxt_id); #endif if (!(translation == msg_ctxt_id || translation == msgid_plural)) return translation; } return (n == 1 ? msgid : msgid_plural); } #if ENABLE_NLS #define _(String) gettext (String) #define N_(String) gettext_noop (String) #else #define _(String) (String) #define N_(String) String #endif #if ENABLE_NLS int setup_nls(void); unused__ static const int nls_init_ = setup_nls(); #endif #endif /* _LIBGETTEXT_H */ fldigi-3.21.80/src/include/field_def.h0000664000175000017500000000370512313064025014333 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef FIELD_DEFS #define FIELD_DEFS // removed unused fields to reduce size of each record and speed up // record processing enum ADIF_FIELD_POS { FREQ = 0, CALL, MODE, NAME, QSO_DATE, QSO_DATE_OFF, TIME_OFF, TIME_ON, QTH, RST_RCVD, RST_SENT, STATE, VE_PROV, NOTES, QSLRDATE, QSLSDATE, GRIDSQUARE, BAND, CNTY, COUNTRY, CQZ, DXCC, IOTA, ITUZ, CONT, MYXCHG, XCHG1, SRX, STX, TX_PWR, EXPORT, // flag used internally in fldigi's logbook QSL_VIA, NUMFIELDS }; // ADIF multiline string is a sequence of Characters and line-breaks, // where a line break is an ASCII CR (code 13) followed immediately by an ASCII LF (code 10) // Not sure fldigi is completely conformant with this. // #define ADIF_EOL "\r\n" #define ADIF_EOL "\n" // Forward declaration for QsoHelper. class cQsoRec ; // Helps for creating a new ADIF record. class QsoHelper { cQsoRec * qso_rec ; QsoHelper(); QsoHelper(const QsoHelper &); QsoHelper & operator=(const QsoHelper &); public: QsoHelper(int mode); ~QsoHelper(); // Inserts a key-value pair. void Push( ADIF_FIELD_POS pos, const std::string & value ); }; #endif fldigi-3.21.80/src/include/trx.h0000664000175000017500000000351612313064025013247 00000000000000// ---------------------------------------------------------------------------- // trx.h // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef TRX_H #define TRX_H #include "threads.h" #include "modem.h" #include "sound.h" #include "globals.h" #include "rsid.h" // ---------------------------------------------------------------------------- extern void trx_start_modem(modem* m, int f = 0); extern void trx_start(void); extern void trx_close(); extern void trx_transmit(); extern void trx_tune(); extern void trx_receive(); extern void trx_reset(void); extern void trx_wait_state(void); extern state_t trx_state; extern modem *active_modem; extern cRsId *ReedSolomon; extern SoundBase *scard; extern bool bHistory; extern bool bHighSpeed; #define TRX_WAIT(s_, code_) \ do { \ ENSURE_NOT_THREAD(TRX_TID); \ code_; \ while (trx_state != s_) \ trx_wait_state(); \ } while (0) void trx_xmit_wfall_queue(int samplerate, const double* buf, size_t len); #endif fldigi-3.21.80/src/include/table.h0000664000175000017500000001344112313064025013517 00000000000000/* Copyright (c) 2004 Markus Niemistö 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. */ #ifndef __TABLE_HH #define __TABLE_HH #include #include #include #include #include #include #define TABLE_WHEN_DCLICK 16 enum SCROLLS {always, never, var}; struct ColumnInfo { bool hidden; const char *title; int width; Fl_Align align; Fl_Align hdr_align; int (*comparator)(const char*, const char*); void (*callback)(); }; int compareInt(const char *val1, const char *val2); class Table : public Fl_Group { private: // Scrollbars Fl_Scrollbar *hScroll, *vScroll; SCROLLS Vscroll; SCROLLS Hscroll; // Popup menu const Fl_Menu_Item *popupMenu; bool menuAlloc; // Column data std::vector header; // Cell data std::vector data; bool (*highlighter)(int, char **, Fl_Color *); // Table dimensions int tableHeight, tableWidth; int oX, oY, oW, oH; // Outer dimensions (widget - box) int iX, iY, iW, iH; /* * Table area dimensions * (outer dimension - header - scrollbars) */ // For optimization int topRow, bottomRow, leftCol, rightCol; int topRowY, leftColX; int nCols, nRows; // Number of rows and columns int cPos; // Column where new entry is added. int resizing, dragX; int pushed; int sortColumn; // Object sizes int scrollbarSize; int headerHeight; int rowHeight; int selected; char **curRow; Fl_Font tbl_font; int tbl_fontsize; // Various flags bool ascent; bool canResize, canSort; bool noMoreColumns; bool toBeSorted; bool dimensionsChanged; bool headerEnabled; bool withGrid; void dSort(int start, int end, int (*compare)(const char *, const char*)); void aSort(int start, int end, int (*compare)(const char *, const char*)); protected: virtual int handle(int event); virtual void drawHeader(int x, int y); virtual void drawRow(int row, char *rowData[], int x, int y); virtual void draw(); void calcDimensions(); void scrolled(); void resized(); static void scrollCallback(Fl_Widget *widget, void *data); public: Table(int x, int y, int w, int h, char *label = NULL); ~Table(); bool headerOn() const; void headerOn(bool enabled); bool allowResize() const; void allowResize(bool allow); bool allowSort() const; void allowSort(bool allow); bool gridEnabled() const; void gridEnabled(bool enable); int headerSize() const; void headerSize(int height); int rowSize() const; void rowSize(int height); int scrollbSize() const; void scrollbSize(int size); virtual void resize(int x, int y, int w, int h); void font(Fl_Font fnt) { tbl_font = fnt; } Fl_Font font() { return tbl_font; } void fontsize(int fntsize) { tbl_fontsize = fntsize; headerHeight = tbl_fontsize + 4; rowHeight = tbl_fontsize + 4; } int fontsize() { return tbl_fontsize; } Fl_Align headerAlign(int column) const; void headerAlign(int column, Fl_Align align); Fl_Align columnAlign(int column) const; void columnAlign(int column, Fl_Align align); int columnWidth(int column) const; void columnWidth(int column, int width); const char *columnTitle(int column); void columnTitle(int column, const char *title); bool columnHidden(int column); void columnHidden(int column, bool hidden); void sort(); void sort(int column, bool ascent); void getSort(int &sortColumn, bool &ascent); void setHighlighter(bool (*highlighter)(int, char **, Fl_Color *)); void addColumn(const char *label, int width = 150, Fl_Align align = (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP), int (*comparator)(const char*, const char*) = NULL); void colcomparator (int column, int (*comparator)(const char*, const char*) = NULL); void colcallback (int column, void (*callback)() = NULL); void addHiddenColumn(const char *label); void addCell(char *data); void addRow(int cols, ...); void addFromTSV(const char *data); void removeRow(int row); void clear(bool removeColumns = false); void where(int x, int y, int &row, int &column, int &resize); void scrollTo(int pos); int scrollPos() const; int columns(); int rows(); void value(int selection); int value(); char *valueAt(int row, int column); int intValueAt(int row, int column); void valueAt(int row, int column, char *data); void valueAt(int row, int column, int data); const char **getRow(int row); const Fl_Menu_Item *menu(); void menu(const Fl_Menu_Item *m); void menuCopy(const Fl_Menu_Item *m); void menuClear(); void allowVscroll(SCROLLS when) {Vscroll = when;} void allowHscroll(SCROLLS when) {Hscroll = when;} void FirstRow (); void PrevRow (); void NextRow (); void LastRow (); void PrevPage (); void NextPage (); void GotoRow (int); int vScrollWidth() { return (vScroll ? vScroll->w() : 0);} bool search(int& row, int& col, bool rev, const char* re); }; #endif fldigi-3.21.80/src/include/weather.h0000664000175000017500000000205712313064025014070 00000000000000// ---------------------------------------------------------------------------- // weather.cxx -- a part of fldigi // // Copyright (C) 2012 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef WEATHER_H #define WEATHER_H #include extern void getwx(std::string& wx, const char *metar = NULL); extern void get_METAR_station(); #endif fldigi-3.21.80/src/include/throb.h0000664000175000017500000000563412313064025013553 00000000000000// ---------------------------------------------------------------------------- // throb.h -- BASIS FOR ALL MODEMS // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _THROB_H #define _THROB_H #include "modem.h" #include "globals.h" #include "fftfilt.h" #include "filters.h" #include "complex.h" #include "mbuffer.h" #define THROB_SAMPLE_RATE 8000 #define SYMLEN 512 #define BUFFLEN 4096 #define SCOPE_DATA_LEN 1024 #define DOWN_SAMPLE 32 #define SYMLEN_1 8192 #define SYMLEN_2 4096 #define SYMLEN_4 2048 #define MAX_RX_SYMLEN (SYMLEN_1 / DOWN_SAMPLE) #define FilterFFTLen 8192 class throb : public modem { static double ThrobToneFreqsNar[]; static double ThrobToneFreqsWid[]; static double ThrobXToneFreqsNar[]; static double ThrobXToneFreqsWid[]; static unsigned char ThrobCharSet[]; static unsigned char ThrobXCharSet[]; static int ThrobTonePairs[][2]; static int ThrobXTonePairs[][2]; protected: int num_tones; int num_chars; int idlesym; int spacesym; char lastchar; double phaseacc; double phaseincr; fftfilt *fftfilter; C_FIR_filter *syncfilt; C_FIR_filter *hilbert; Cmovavg *snfilter; int symlen; double freqs[55]; // receive double *scope_data; cmplx *rxtone[55]; cmplx symbol[MAX_RX_SYMLEN]; double syncbuf[MAX_RX_SYMLEN]; mbuffer dispbuf; double rxcntr; double signal; double noise; double s2n; int rxsymlen; int symptr; int deccntr; int shift; int waitsync; cmplx mixer(cmplx in); void sync(cmplx in); void rx(cmplx in); void decodechar(int tone1, int tone2); int findtones(cmplx *word, int &tone1, int &tone2); cmplx *mk_rxtone(double freq, double *pulse, int len); void show_char(int); void flip_syms(); void reset_syms(); // transmit int txstate; int preamble; double *txpulse; double *outbuf; unsigned int buffptr; double *mk_semi_pulse(int len); double *mk_full_pulse(int len); void send(int); public: throb(trx_mode); ~throb(); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart() {}; int rx_process(const double *buf, int len); int tx_process(); void update_syncscope(); }; #endif fldigi-3.21.80/src/include/viewpsk.h0000664000175000017500000000510612313064025014117 00000000000000// ---------------------------------------------------------------------------- // viewpsk.h -- psk modem // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _VIEWPSK_H #define _VIEWPSK_H #include "complex.h" #include "modem.h" #include "globals.h" #include "filters.h" #include "pskeval.h" //===================================================================== #define VPSKSAMPLERATE (8000) #define VAFCDECAY 8 #define MAXCHANNELS 30 #define VSEARCHWIDTH 70 #define VSIGSEARCH 5 #define VWAITCOUNT 4 #define NULLFREQ 1e6 //===================================================================== struct CHANNEL { double phaseacc; cmplx prevsymbol; cmplx quality; unsigned int shreg; double metric; double frequency; double freqerr; double phase; double syncbuf[16]; C_FIR_filter *fir1; C_FIR_filter *fir2; int bits; double bitclk; unsigned int dcdshreg; int dcd; int waitcount; int timeout; bool reset; int acquire; }; class viewpsk { private: trx_mode viewmode; int symbollen; double bandwidth; int dcdbits; int fa; int fb; int ftest; double test_peak_amp; time_t now; bool reset_all; bool tracked; bool browser_changed; CHANNEL channel[MAXCHANNELS]; int nchannels; int lowfreq; pskeval* evalpsk; void rx_symbol(int ch, cmplx symbol); void rx_bit(int ch, int bit); void findsignal(int); void afc(int); inline void timeout_check(); inline void insert(); public: viewpsk(pskeval* eval, trx_mode mode); ~viewpsk(); void init(); void restart(trx_mode mode); void rx_init(){}; void tx_init(SoundBase *sc){}; void restart() {}; int rx_process(const double *buf, int len); int get_freq(int n); void set_freq(int n, double f) { channel[n].frequency = f; } void findsignals(); void clearch(int n); void clear(); }; extern viewpsk *pskviewer; #endif fldigi-3.21.80/src/include/digiscope.h0000664000175000017500000000475512313064025014406 00000000000000// ---------------------------------------------------------------------------- // digiscope.h, Miniature Oscilloscope/Phasescope Widget // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted in part from code contained in // gmfsk source code distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef DIGISCOPE_H #define DIGISCOPE_H #include #include "complex.h" class Digiscope : public Fl_Widget { public: #define DEFAULT_WIDTH 100 #define DEFAULT_HEIGHT 100 #define MAX_LEN 1024 #define MAX_ZLEN 1024 enum scope_mode { SCOPE, PHASE, PHASE1, PHASE2, PHASE3, RTTY, XHAIRS, WWV, DOMDATA, DOMWF, BLANK }; private: scope_mode _mode; double _buf[MAX_LEN]; cmplx _zdata[MAX_ZLEN]; int _zlen; int _zptr; unsigned char *vidbuf; unsigned char *vidline; int _len; int linecnt; double _phase; double _quality; double _flo, _fhi, _amp; double _x1, _x2, _y1, _y2; bool _highlight; scope_mode phase_mode; public: Digiscope(int, int, int, int); ~Digiscope(); int handle(int); void resize(int x, int y, int w, int h); void draw(); void draw_scope(); void draw_phase(); void draw_rtty(); void draw_xy(); void draw_video(); void data(double *data, int len, bool scale = true); void phase(double ph, double ql, bool hl); void video(double *data, int len, bool dir ); void zdata(cmplx *z, int len); void rtty(double flo, double fhi, double amp); void mode(scope_mode md); scope_mode mode() { return _mode;}; void xaxis_1(double y1) { _y1 = y1; } void xaxis_2(double y2) { _y2 = y2; } void yaxis_1(double x1) { _x1 = x1; } void yaxis_2(double x2) { _x2 = x2; } void clear_axis() { _x1 = _x2 = _y1 = _y2 = 0; } }; #endif fldigi-3.21.80/src/include/FTextRXTX.h0000664000175000017500000001005112313064025014202 00000000000000// ---------------------------------------------------------------------------- // FTextView.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef FTextRXTX_H_ #define FTextRXTX_H_ #include #include "FTextView.h" /// /// A TextBase subclass to display received & transmitted text /// class FTextRX : public FTextView { public: FTextRX(int x, int y, int w, int h, const char *l = 0); ~FTextRX(); virtual int handle(int event); #if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR == 3 virtual void add(unsigned int c, int attr = RECV); virtual void add(const char *s, int attr = RECV) { while (*s) add(*s++, attr); } #else virtual void add(unsigned char c, int attr = RECV); virtual void add(const char *s, int attr = RECV) { while (*s) add(*s++, attr); } #endif void set_quick_entry(bool b); bool get_quick_entry(void) { return menu[RX_MENU_QUICK_ENTRY].value(); } void set_scroll_hints(bool b); bool get_scroll_hints(void) { return menu[RX_MENU_SCROLL_HINTS].value(); } void mark(FTextBase::TEXT_ATTR attr = CLICK_START); void clear(void); void setFont(Fl_Font f, int attr = NATTR); protected: enum { RX_MENU_QRZ_THIS, RX_MENU_CALL, RX_MENU_NAME, RX_MENU_QTH, RX_MENU_STATE, RX_MENU_PROVINCE,RX_MENU_COUNTRY, RX_MENU_LOC, RX_MENU_RST_IN, RX_MENU_XCHG, RX_MENU_SERIAL, RX_MENU_DIV, RX_MENU_COPY, RX_MENU_CLEAR, RX_MENU_SELECT_ALL, RX_MENU_SAVE, RX_MENU_WRAP, RX_MENU_QUICK_ENTRY, RX_MENU_SCROLL_HINTS }; void handle_clickable(int x, int y); void handle_qsy(int start, int end); void handle_qso_data(int start, int end); void handle_context_menu(void); void menu_cb(size_t item); const char* dxcc_lookup_call(int x, int y); static void dxcc_tooltip(void* obj); private: FTextRX(); FTextRX(const FTextRX &t); protected: static Fl_Menu_Item menu[]; struct { bool enabled; float delay; } tooltips; }; /// /// A FTextBase subclass to display and edit text to be transmitted /// class FTextTX : public FTextEdit { public: FTextTX(int x, int y, int w, int h, const char *l = 0); virtual int handle(int event); void clear(void); void clear_sent(void); int nextChar(void); bool eot(void); void add_text(std::string s); void pause() { PauseBreak = true; } void setFont(Fl_Font f, int attr = NATTR); protected: enum { TX_MENU_TX, TX_MENU_RX, TX_MENU_ABORT, TX_MENU_MFSK16_IMG, TX_MENU_CUT, TX_MENU_COPY, TX_MENU_PASTE, TX_MENU_CLEAR, TX_MENU_READ, TX_MENU_WRAP }; int handle_key_shortcuts(int key); int handle_key(int key); int handle_key_macro(int key); int handle_dnd_drag(int pos); void handle_context_menu(void); void menu_cb(size_t item); void change_keybindings(void); static int kf_default(int c, Fl_Text_Editor_mod* e); static int kf_enter(int c, Fl_Text_Editor_mod* e); static int kf_delete(int c, Fl_Text_Editor_mod* e); static int kf_cut(int c, Fl_Text_Editor_mod* e); static int kf_paste(int c, Fl_Text_Editor_mod* e); private: FTextTX(); FTextTX(const FTextTX &t); protected: static Fl_Menu_Item menu[]; bool PauseBreak; int txpos; int utf8_txpos; static int *ptxpos; int bkspaces; }; #endif // FTextRXTX_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-3.21.80/src/include/date.h0000664000175000017500000000611512313064025013345 00000000000000/* -*-C++-*- "$Id: Fl_Date.H,v 1.4 2000/03/30 04:43:56 davefreese Exp $" Copyright 1999-2000 by the Dave Freese & the Flek development team. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. */ // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef DATE_H #define DATE_H #include typedef enum { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } weekday_t; typedef enum { JANUARY = 1, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER } month_t; class Date { friend std::ostream &operator<<(std::ostream &, Date &); protected: int year; int month; int day; int fmt; static const int mdays[]; static const int jdays[][13]; static const char *month_name[]; void helpIncrement(); public: Date(); Date( int m, int d, int y ); void setDate( int, int, int ); // set the date void setDate( Date & ); void setFormat (int); void today(); // set date to the present day void Year( int ); int Year(); void Month( int ); int Month(); void Day( int ); int Day(); void previous_month (); void next_month (); void previous_year (); void next_year (); bool endOfMonth( int ); bool leapYear (int); bool leapYear () { return leapYear (year); } bool isleapyear (int year) { return leapYear (year); } bool isleapyear () { return isleapyear (year); } int daysinmonth (int, int); int daysinmonth () { return daysinmonth (month, isleapyear (year)); } bool isvalid (int, int, int); bool datevalid (int year, int mon, int day) { return isvalid (mon, day, year); } bool datevalid () { return isvalid (month, day, year); } int dayofyear (int, int, int); int dayofyear () { return dayofyear (year, month, day); } int dayofepoch (int, int, int); int dayofepoch () { return dayofepoch (year, month, day); } int dayofweek (int, int, int); int dayofweek () { return dayofweek (year, month, day); } char *szDate (int); char *szDate (); double dJulian (); bool operator==( const Date & ); bool operator!=( const Date & ); bool operator<( const Date & ); bool operator>( const Date & ); void operator=( const Date & ); const Date &operator+=( int); // add days, modify object Date &operator++(); // pre-increment operator Date operator++( int ); // post-increment operator }; #endif fldigi-3.21.80/src/include/arq_io.h0000664000175000017500000000314712313064025013704 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef ARQIO_H #define ARQIO_H #include #include "threads.h" #include "socket.h" extern void WriteARQsocket(unsigned char* data, size_t len); extern bool Socket_arqRx(); extern void AbortARQ(); extern void pskmail_notify_rsid(trx_mode mode); extern void pskmail_notify_s2n(double s2n_count, double s2n_avg, double s2n_stddev); class ARQ_SOCKET_Server { public: static bool start(const char* node, const char* service); static void stop(void); private: ARQ_SOCKET_Server(); ~ARQ_SOCKET_Server(); ARQ_SOCKET_Server(const ARQ_SOCKET_Server&); ARQ_SOCKET_Server operator=(const ARQ_SOCKET_Server&); static void* thread_func(void*); private: static ARQ_SOCKET_Server* inst; bool run; Socket* server_socket; }; #endif // ARQIO_H fldigi-3.21.80/src/include/progress.h0000664000175000017500000000336412313064025014277 00000000000000// // progress.h // // Progress bar widget routines. // // Based on Fl_Progress widget, Copyright 2000-2005 by Michael Sweet. // // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _Progress_H_ # define _Progress_H_ // // Include necessary headers. // #include // // Progress class... // class Progress : public Fl_Widget { public: enum PTYPE {HORIZONTAL, VERTICAL}; private: double value_, minimum_, maximum_; PTYPE direction; protected: virtual void draw(); public: Progress(int x, int y, int w, int h, const char *l = 0); void type(PTYPE direc) { direction = direc;} void maximum(double v) { maximum_ = v; redraw(); } double maximum() const { return (maximum_); } void minimum(double v) { minimum_ = v; redraw(); } double minimum() const { return (minimum_); } void value(double v) { value_ = v; redraw(); } double value() const { return (value_); } }; #endif // !_Progress_H_ fldigi-3.21.80/src/include/charsetdistiller.h0000664000175000017500000000360312313064025015774 00000000000000// ---------------------------------------------------------------------------- // charsetdistiller.h -- input charset cleaning and conversion // // Copyright (C) 2012 // Andrej Lajovic, S57LN // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef CHARSETDISTILLER_H #define CHARSETDISTILLER_H #include #include "tiniconv.h" class CharsetDistiller { public: CharsetDistiller(const int charset_in = TINICONV_CHARSET_UTF_8); int set_input_encoding(const int charset_in); void rx(const unsigned char c); void rx(const unsigned char *c); void flush(); void reset(void); void clear(void); int data_length(void); int num_chars(void); const std::string &data(void); private: void process_buffer(void); void shift_first_out(); unsigned char buf[6]; // input buffer unsigned char *bufptr; // points to the next unused byte in the buffer tiniconv_ctx_s ctx; // libtiniconv conversion state for input encoding -> UTF-8 tiniconv_ctx_s ctx1252; // libtiniconv conversion state for CP1252 -> UTF-8 std::string outdata; // valid data int nutf8; // number of UTF-8 characters in the output buffer }; #endif fldigi-3.21.80/src/include/interleave.h0000664000175000017500000000314512313064025014566 00000000000000// ---------------------------------------------------------------------------- // interleave.h -- MFSK (de)interleaver // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _INTERLEAVE_H #define _INTERLEAVE_H #define INTERLEAVE_FWD 0 #define INTERLEAVE_REV 1 #define PUNCTURE 128 class interleave { protected: int size; int depth; int len; int direction; unsigned char *table; unsigned char *tab(int i, int j, int k) { return &table[(size * size * i) + (size * j) + k]; } public: interleave(int _size, int depth, int dir); ~interleave(); void symbols (unsigned char *psyms); void bits (unsigned int *pbits); void flush(); }; // ---------------------------------------------------------------------------- #endif fldigi-3.21.80/src/include/dsp.h0000664000175000017500000011445212313064025013222 00000000000000/* * dsp.h -- various DSP algorithms * * based on mt63 code by Pawel Jalocha * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * Copyright (c) 2007-2008 Dave Freese, W1HKJ * * This file is part of fldigi. * * Fldigi 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. * * Fldigi 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 fldigi. If not, see . * */ #include #include #include // ---------------------------------------------------------------------------- // double/other-complex type template struct Cdspcmpx { type re,im; } ; typedef Cdspcmpx dspCmpx; // Some complex operators template inline void operator +=(Cdspcmpx &Dst, Cdspcmpx &Src) { Dst.re+=Src.re; Dst.im+=Src.im; } template inline void operator -=(Cdspcmpx &Dst, Cdspcmpx &Src) { Dst.re-=Src.re; Dst.im-=Src.im; } template inline void operator *=(Cdspcmpx &Dst, num Src) { Dst.re*=Src; Dst.im*=Src; } template inline void operator /=(Cdspcmpx &Dst, num Src) { Dst.re/=Src; Dst.im/=Src; } // scalar product of two vectors template inline double dspScalProd(Cdspcmpx &A, Cdspcmpx &B) { return A.re*B.re+A.im*B.im; } template inline double dspScalProd(typeA Ia, typeA Qa, Cdspcmpx &B) { return Ia*B.re+Qa*B.im; } // complex multiply template inline void CdspcmpxMultAxB(Cdspcmpx &Dst, Cdspcmpx &A, Cdspcmpx &B) { Dst.re=A.re*B.re-A.im*B.im; Dst.im=A.re*B.im+A.im*B.re; } template inline void CdspcmpxMultAxB(typeDst &DstI, typeDst &DstQ, Cdspcmpx &A, Cdspcmpx &B) { DstI=A.re*B.re-A.im*B.im; DstQ=A.re*B.im+A.im*B.re; } // complex multiply, second argument with a "star" (B.im is negated) template inline void CdspcmpxMultAxBs(Cdspcmpx &Dst, Cdspcmpx &A, Cdspcmpx &B) { Dst.re=A.re*B.re+A.im*B.im; Dst.im=A.im*B.re-A.re*B.im; } // ---------------------------------------------------------------------------- // signed 16-bit format (standard 16-bit audio) typedef short dspS16; // ---------------------------------------------------------------------------- template inline int dspRedspAllocArray(type **Array, int Size) { (*Array)=(type *)realloc(*Array,Size*sizeof(type)); return (*Array)==NULL; } template inline int dspAllocArray(type **Array, int Size) { (*Array)=(type *)malloc(Size*sizeof(type)); return (*Array)==NULL; } template inline void dspClearArray(type *Array, int Size) { memset(Array,0,Size*sizeof(type)); } template inline void dspCopyArray(type *Dst, type *Src, int Size) { memcpy(Dst,Src,Size*sizeof(type)); } template inline void dspMoveArray(type *Dst, type *Src, int Size) { memmove(Dst,Src,Size*sizeof(type)); } template int dspAllocArray2D(type ***Array, int Size1, int Size2) { int i; (*Array)=(type **)malloc(Size1*(sizeof(type *))); if((*Array)==NULL) return 1; for(i=0; i void dspFreeArray2D(type **Array, int Size1) { int i; for(i=0; i void dspClearArray2D(type **Array, int Size1, int Size2) { int i; for(i=0; i class dspSeq { public: dspSeq(); ~dspSeq(); int EnsureSpace(int ReqSpace); // make sure that there is enough space void Free(void); // free space to save RAM when buffer is not in use int Space; // that much is allocated in *Data int Len; // that much is filled up type *Data; // contains Len elements } ; template dspSeq::dspSeq() { Data = NULL; Len = Space = 0; } template dspSeq::~dspSeq() { free(Data); } template int dspSeq::EnsureSpace(int ReqSpace) { if (ReqSpace <= Space) return 0; Data = (type *)realloc(Data, ReqSpace * sizeof(type)); if (Data == NULL) { Space = Len = 0; return -1; } Space = ReqSpace; return 0; } template void dspSeq::Free(void) { free(Data); Data = NULL; Space = Len = 0; } typedef dspSeq float_buff; typedef dspSeq double_buff; typedef dspSeq dspCmpx_buff; typedef dspSeq dspCmpx_buff; // typedef dspSeq int16_buff; <- this doesn't work - why ?! typedef dspSeq dspS16_buff; typedef dspSeq char_buff; // ---------------------------------------------------------------------------- // First-In First-Out pipes template class dspFIFO { public: dspFIFO(); ~dspFIFO(); int Preset(int Max); void Free(void); void Clear(void); int Inp(type Elem); int Out(type &Elem); int InpReady(void); int OutReady(void); private: type *Buff; int Size; int Rd,Wr; } ; template dspFIFO::dspFIFO() { Buff=NULL; } template dspFIFO::~dspFIFO() { free(Buff); } template void dspFIFO::Free(void) { free(Buff); Buff=NULL; } template int dspFIFO::Preset(int Max) { Size=Max+1; if(dspRedspAllocArray(&Buff,Size)) return -1; Rd=0; Wr=0; return 0; } template void dspFIFO::Clear(void) { Rd=Wr; } template int dspFIFO::Inp(type Elem) { int w=Wr; Buff[w]=Elem; w+=1; if(w>=Size) w=0; if(w==Rd) return -1; Wr=w; return 0; } template int dspFIFO::Out(type &Elem) { if(Rd==Wr) return -1; Elem=Buff[Rd]; Rd+=1; if(Rd>=Size) Rd=0; return 0; } template int dspFIFO::OutReady(void) { return (Wr>=Rd) ? Wr-Rd : Wr-Rd+Size; } template int dspFIFO::InpReady(void) { return (Rd>Wr) ? Rd-Wr-1 : Rd-Wr+Size-1; } typedef dspFIFO char_dspFIFO; // ---------------------------------------------------------------------------- // dspPower of single and complex values and dspSequences of these inline double dspPower(double X) { return X*X; } inline double dspPower(double I, double Q) { return I*I + Q*Q; } inline double dspPower(dspCmpx X) { return X.re*X.re+X.im*X.im; } double dspPower(double *X, int Len); double dspPower(double *I, double *Q, int Len); double dspPower(dspCmpx *X, int Len); inline double dspPower(double_buff *buff) { return dspPower(buff->Data,buff->Len); } inline double dspPower(dspCmpx_buff *buff) { return dspPower(buff->Data,buff->Len); } // dspAmplitude calculations inline double dspAmpl(double I, double Q) { return sqrt(I*I+Q*Q); } inline double dspAmpl(dspCmpx X) { return sqrt(X.re*X.re+X.im*X.im); } // dspPhase calculation (output = <-PI..PI) ) inline double dspPhase(double I, double Q) { return atan2(Q,I); } inline double dspPhase(dspCmpx X) { return atan2(X.im,X.re); } // dspPhase normalization inline double dspPhaseNorm(double dspPhase) { if(dspPhase>=M_PI) return dspPhase-2*M_PI; if(dspPhase<(-M_PI)) return dspPhase+2*M_PI; return dspPhase; } // ---------------------------------------------------------------------------- // min./max. of integers inline int dspIntmin(int i1, int i2) { return i1i2 ? i1 : i2; } inline int dspIntmin(int i1, int i2, int i3) { return i1i2 ? (i1>i3 ? i1 : i3) : (i2>i3 ? i2 : i3); } // ---------------------------------------------------------------------------- // Extreme search, dspAverage, fitting double dspAverage(double *Data, int Len); int dspCountInRange(double *Data, int Len, double Low, double Upp); inline int dspCountInRange(double_buff *Input, double Low, double Upp) { return dspCountInRange(Input->Data,Input->Len,Low,Upp); } inline double dspRMS(double *Data, int Len) { return sqrt(dspPower(Data,Len)/Len); } inline double dspRMS(dspCmpx *Data, int Len) { return sqrt(dspPower(Data,Len)/Len); } inline double dspRMS(double_buff *Input) { return dspRMS(Input->Data,Input->Len); } inline double dspRMS(dspCmpx_buff *Input) { return dspRMS(Input->Data,Input->Len); } template type dspFindMin(type *Data, int Len) { type Min; int i; Min=Data[0]; for(i=1; i type dspFindMin(type *Data, int Len, int &MinPos) { type Min; int i,pos; Min=Data[0]; pos=0; for(i=1; i type dspFindMax(type *Data, int Len) { type Max; int i; Max=Data[0]; for(i=1; iMax) Max=Data[i]; return Max; } template type dspFindMax(type *Data, int Len, int &MaxPos) { type Max; int i,pos; Max=Data[0]; pos=0; for(i=1; iMax) { Max=Data[i]; pos=i; } MaxPos=pos; return Max; } double dspFindMaxdspPower(dspCmpx *Data, int Len); double dspFindMaxdspPower(dspCmpx *Data, int Len, int &MaxPos); double dspFitPoly1(double *Data, int Len, double &A, double &B); double dspFitPoly2(double *Data, int Len, double &A, double &B, double &C); void dspFitPoly2(double Data[3], double &A, double &B, double &C); // ---------------------------------------------------------------------------- // "selective" dspAverage fit template int dspSelFitAver(type *Data, int Len, double SelThres, int Loops, double &Aver, double &dspRMS, int &Sel) { int i, loop, Incl;//, prev; double Sum, ErrSum, Lev, dLev, Diff, Thres; for (ErrSum = Sum = 0.0, i = 0; i < Len; i++) { Sum += Data[i]; ErrSum += dspPower(Data[i]); } Lev = Sum/Len; ErrSum /= Len; ErrSum -= Lev*Lev; // printf("Len=%d, Lev=%+7.4f, ErrSum=%7.4f, dspRMS=%7.4f\n", // Len,Lev,ErrSum,sqrt(ErrSum)); // prev = Len; Incl = 0; for (loop = 0; loop < Loops; loop++) { Thres = SelThres * SelThres * ErrSum; for (ErrSum = Sum = 0.0, Incl = 0, i = 0; i < Len; i++) { Diff = dspPower(Data[i]-Lev); if (Diff <= Thres) { Sum += Data[i]; ErrSum += Diff; Incl += 1; } // else printf(" %d",i); } Sum /= Incl; dLev = Sum - Lev; ErrSum /= Incl; ErrSum -= dLev * dLev; Lev += dLev; ErrSum = fabs(ErrSum); // printf("\nLoop #%d, Lev=%+7.4f, dLev=%+7.4f, ErrSum=%7.4f, dspRMS=%7.4f, Incl=%d\n", // loop,Lev,dLev,ErrSum,sqrt(ErrSum),Incl); // if(Incl==prev) { loop++; break; } // prev=Incl; } Aver = Lev; dspRMS = sqrt(ErrSum); Sel=Incl; return loop; } template int dspSelFitAver(Cdspcmpx *Data, int Len, double SelThres, int Loops, Cdspcmpx &Aver, double &dspRMS, int &Sel) { int i, loop, Incl;//, prev; dspCmpx Sum, Lev, dLev; double ErrSum, Diff, Thres; for (ErrSum = 0.0, Sum.re = Sum.im = 0.0, i = 0; i < Len; i++) { Sum.re += Data[i].re; Sum.im += Data[i].im; ErrSum += dspPower(Data[i]); } Lev.re = Sum.re / Len; Lev.im = Sum.im / Len; ErrSum /= Len; ErrSum -= dspPower(Lev); // printf("Len=%d, Lev=[%+7.4f,%+7.4f], ErrSum=%7.4f, dspRMS=%7.4f\n", // Len,Lev.re,Lev.im,ErrSum,sqrt(ErrSum)); Incl = 0; // prev = Len; for (loop = 0; loop < Loops; loop++) { Thres = 0.5 * SelThres * SelThres * ErrSum; for (ErrSum = 0.0, Sum.re = Sum.im = 0.0, Incl = 0, i = 0; i < Len; i++) { Diff = dspPower(Data[i].re - Lev.re, Data[i].im - Lev.im); if (Diff <= Thres) { Sum.re += Data[i].re; Sum.im += Data[i].im; ErrSum += Diff; Incl += 1; } // else printf(" %d",i); } Sum.re /= Incl; Sum.im /= Incl; dLev.re = Sum.re - Lev.re; dLev.im = Sum.im - Lev.im; ErrSum /= Incl; ErrSum -= dspPower(dLev); ErrSum = fabs(ErrSum); Lev.re += dLev.re; Lev.im += dLev.im; // printf("\nLoop #%d, Lev=[%+6.3f,%+6.3f], dLev=[%+6.3f,%+6.3f], ErrSum=%7.4f, dspRMS=%7.4f, Incl=%d\n", // loop, Lev.re,Lev.im, dLev.re,dLev.im, ErrSum,sqrt(ErrSum), Incl); // if(Incl==prev) { loop++; break; } // prev=Incl; } Aver = Lev; dspRMS = sqrt(ErrSum); Sel = Incl; return loop; } // ---------------------------------------------------------------------------- // white noise generator template void dspWhiteNoise(type &X) { double Rand,dspPower,dspPhase; Rand=((double)rand()+1.0)/((double)RAND_MAX+1.0); dspPower=sqrt(-2*log(Rand)); Rand=(double)rand()/(double)RAND_MAX; dspPhase=2*M_PI*Rand; X=dspPower*cos(dspPhase); } template void CdspcmpxdspWhiteNoise(Cdspcmpx &X) { double Rand,dspPower,dspPhase; Rand=((double)rand()+1.0)/((double)RAND_MAX+1.0); dspPower=sqrt(-log(Rand)); Rand=(double)rand()/(double)RAND_MAX; dspPhase=2*M_PI*Rand; X.re=dspPower*cos(dspPhase); X.im=dspPower*sin(dspPhase); } // ---------------------------------------------------------------------------- // various window shapes (for the FFT and FIR filters) // these functions are supposed to be called with the argument "dspPhase" // between -PI and +PI. Most (or even all) will return zero for input // euqal -PI or +PI. double dspWindowHanning(double dspPhase); double WindowBlackman2(double dspPhase); // from Freq 5.1 FFT analyzer double dspWindowBlackman3(double dspPhase); // from the Motorola BBS // ---------------------------------------------------------------------------- // FIR shape calculation for a flat response from FreqLow to FreqUpp void dspWinFirI(double LowOmega, double UppOmega, double *Shape, int Len, double (*Window)(double), double shift=0.0); void WinFirQ(double LowOmega, double UppOmega, double *Shape, int Len, double (*Window)(double), double shift=0.0); // ---------------------------------------------------------------------------- // convert 16-bit signed or 8-bit unsigned into doubles void dspConvS16todouble(dspS16 *dspS16, double *dbl, int Len, double Gain=1.0/32768.0); int dspConvS16todouble(dspS16 *dspS16, double_buff *dbl, int Len, double Gain=1.0/32768.0); void dspConvdoubleTodspS16(double *dbl, dspS16 *dspS16, int Len, double Gain=32768.0); inline int dspConvdoubleTodspS16(double_buff *dbl, dspS16_buff *dspS16, double Gain=32768.0) { int err=dspS16->EnsureSpace(dbl->Len); if(err) return -1; dspConvdoubleTodspS16(dbl->Data,dspS16->Data, dbl->Len,Gain); dspS16->Len=dbl->Len; return 0; } void dspConvU8todouble(unsigned char *U8, double *dbl, int Len, double Gain=1.0/128.0); int dspConvU8todouble(unsigned char *U8, double_buff *dbl, int Len, double Gain=1.0/128.0); // ---------------------------------------------------------------------------- // other converts void dspConvCmpxTodspPower(dspCmpx *Inp, int InpLen, double *Out); int dspConvCmpxTodspPower(dspCmpx_buff *Input, double_buff *Output); void dspConvCmpxTodspAmpl(dspCmpx *Inp, int InpLen, double *Out); int dspConvCmpxTodspAmpl(dspCmpx_buff *Input, double_buff *Output); void dspConvCmpxTodspPhase(dspCmpx *Inp, int InpLen, double *Out); int dspConvCmpxTodspPhase(dspCmpx_buff *Input, double_buff *Output); // ---------------------------------------------------------------------------- // Pulse noise limiter class dspPulseLimiter { public: dspPulseLimiter(); ~dspPulseLimiter(); void Free(void); int Preset(int TapLen, double Limit=4.0); int Process(double *Inp, int InpLen, double *Out); int Process(double_buff *Input); double_buff Output; double dspRMS; private: int Len; double Thres; double *Tap; int Ptr; double PwrSum; } ; // ---------------------------------------------------------------------------- // Signal level monitor class dspLevelMonitor { public: dspLevelMonitor(); ~dspLevelMonitor(); int Preset(double Integ, double Range=0.75); int Process(double *Inp, int Len); int Process(double_buff *Input); double dspRMS; double OutOfRange; private: double PwrMid,PwrOut; double OutOfRangeMid; double MaxSqr; double W1,W2,W5; } ; // ---------------------------------------------------------------------------- // Automatic Gain/Level Control for the Mixer class dspMixerAutoLevel { public: dspMixerAutoLevel(); // ~dspMixerAutoLevel(); int Process(double *Inp, int InpLen); int Process(double_buff *Inp) { return Process(Inp->Data, Inp->Len); } public: int IntegLen; // mean dspPower integration time [samples] double MinMS; // minimum acceptable dspAverage dspPower double MaxMS; // maximum acceptable dspAverage dspPower int PeakHold; // level holding time after a peak [samples] int MinHold; // minimal time between changing the mixer level [samples] int AdjStep; // mixer level adjusting step int MinLevel; // mimimum allowed mixer level int MaxLevel; // maximum allowed mixer level double AvedspRMS; // dspAverage dspPower of the input signal int Hold; // time counter for holding levels int Level; // actual mixer level } ; // ---------------------------------------------------------------------------- // Two-element IIR low pass filter struct dspLowPass2elem { double Mid,Out; } ; struct dspLowPass2weight { double W1,W2,W5; } ; // first calculate the coefficiants W1,W2 and W5 for given integration time template inline void dspLowPass2Coeff(typeLen IntegLen, typeW &W1, typeW &W2, typeW &W5) { W1=1.0/IntegLen; W2=2.0/IntegLen; W5=5.0/IntegLen; } template inline void dspLowPass2Coeff(typeLen IntegLen, dspLowPass2weight &Weight) { Weight.W1=1.0/IntegLen; Weight.W2=2.0/IntegLen; Weight.W5=5.0/IntegLen; } // then you can process samples template inline void dspLowPass2(typeInp Inp, typeOut &Mid, typeOut &Out, typeW W1, typeW W2, typeW W5) { double Sum, Diff; Sum=Mid+Out; Diff=Mid-Out; Mid+=W2*Inp-W1*Sum; Out+=W5*Diff; } template inline void dspLowPass2(typeInp Inp, dspLowPass2elem &Elem, typeW W1, typeW W2, typeW W5) { double Sum, Diff; Sum=Elem.Mid+Elem.Out; Diff=Elem.Mid-Elem.Out; Elem.Mid+=W2*Inp-W1*Sum; Elem.Out+=W5*Diff; } template inline void dspLowPass2(typeInp Inp, dspLowPass2elem &Elem, dspLowPass2weight &Weight) { double Sum, Diff; Sum=Elem.Mid+Elem.Out; Diff=Elem.Mid-Elem.Out; Elem.Mid+=Weight.W2*Inp-Weight.W1*Sum; Elem.Out+=Weight.W5*Diff; } void dspLowPass2(dspCmpx *Inp, dspCmpx *Mid, dspCmpx *Out, double W1, double W2, double W5); // ---------------------------------------------------------------------------- // periodic low pass class dspPeriodLowPass2 { public: dspPeriodLowPass2(); ~dspPeriodLowPass2(); void Free(void); int Preset(int Period, double IntegLen); int Process(double Inp, double &Out); int Process(double *Inp, int InpLen, double *Out); int Process(double_buff *Input); double_buff Output; private: int Len; double *TapMid,*TapOut; int TapPtr; double W1,W2,W5; } ; // ---------------------------------------------------------------------------- // a simple dspDelay template class dspDelay { public: dspDelay(); ~dspDelay(); void Free(void); int Preset(int len); void Process(type *Inp, int InpLen, type *Out); int Process(dspSeq *Input); dspSeq Output; private: int Len; type *Tap; int TapPtr; } ; template dspDelay::dspDelay() { Tap=NULL; } template dspDelay::~dspDelay() { free(Tap); } template void dspDelay::Free(void) { free(Tap); Tap=NULL; } template int dspDelay::Preset(int dspDelayLen) { Len=dspDelayLen; if(dspRedspAllocArray(&Tap,Len)) return -1; dspClearArray(Tap,Len); TapPtr=0; return 0; } template void dspDelay::Process(type *Inp, int InpLen, type *Out) { int i,batch; for(i=0; i=Len) TapPtr=0; } } template int dspDelay::Process(dspSeq *Input) { int err=Output.EnsureSpace(Input->Len); if(err) return -1; Process(Input->Data,Input->Len,Output.Data); Output.Len=Input->Len; return 0; } // ---------------------------------------------------------------------------- // dspDelayLine, like dspDelay but more flexible // The idea is that we hold addressable history of at least MaxdspDelay // samples. // After each input batch is processed, the InpPtr points to the first sample // of this batch and we can address samples backwards upto MaxdspDelay. // For more optimal performace we allocate more RAM than just for MaxdspDelay. // Infact the allocated size (MaxSize) should be at least // MaxdspDelay plus the largest expected input length. template class dspDelayLine { public: dspDelayLine(); ~dspDelayLine(); void Free(void); int Preset(int MaxdspDelay, int MaxSize=0); int Process(type *Inp, int Len); int Process(dspSeq *Input); type *Line; // line storage int dspDelay; // how many (at least) backward samples are stored int LineSize; // allocated size int DataLen; // length of the valid data type *InpPtr; // first sample for the most recent processed batch int InpLen; // number of samples for the most recent input } ; template dspDelayLine::dspDelayLine() { Line=NULL; } template dspDelayLine::~dspDelayLine() { free(Line); } template void dspDelayLine::Free(void) { free(Line); Line=NULL; } template int dspDelayLine::Preset(int MaxdspDelay, int MaxSize) { LineSize=MaxSize; if(LineSize<(2*MaxdspDelay)) LineSize=2*MaxdspDelay; DataLen=MaxdspDelay; dspDelay=MaxdspDelay; if(dspRedspAllocArray(&Line,LineSize)) return -1; dspClearArray(Line,LineSize); InpPtr=Line+DataLen; InpLen=0; return 0; } template int dspDelayLine::Process(type *Inp, int Len) { if((DataLen+Len)>LineSize) { dspMoveArray(Line,Line+DataLen-dspDelay,dspDelay); DataLen=dspDelay; } if((DataLen+Len)>LineSize) return -1; dspCopyArray(Line+DataLen,Inp,Len); InpPtr=Line+DataLen; InpLen=Len; DataLen+=Len; return 0; } template int dspDelayLine::Process(dspSeq *Input) { return Process(Input->Data,Input->Len); } // ---------------------------------------------------------------------------- // Low pass "moving box" FIR filter // very unpure spectral response but CPU complexity very low // and independent on the integration time class dspBoxFilter { public: dspBoxFilter(); ~dspBoxFilter(); void Free(void); int Preset(int BoxLen); int Process(double Inp, double &Out); int Process(double *Inp, int InpLen, double *Out); int Process(double_buff *Input); void Recalibrate(); double_buff Output; private: int Len; double *Tap; int TapPtr; double Sum; } ; class dspCmpxBoxFilter { public: dspCmpxBoxFilter(); ~dspCmpxBoxFilter(); void Free(void); int Preset(int BoxLen); int Process(dspCmpx *Inp, int InpLen, dspCmpx *Out); void Recalibrate(); int Process(dspCmpx_buff *Input); dspCmpx_buff Output; private: int Len; dspCmpx *Tap; int TapPtr; dspCmpx Sum; } ; // ---------------------------------------------------------------------------- // FIR filter with a given shape class dspFirFilter { public: dspFirFilter(); ~dspFirFilter(); void Free(void); int Preset(int FilterLen, double *FilterShape=(double*)NULL); int Process(double *Inp, int InpLen, double *Out); int Process(double_buff *Input); // Response(double Freq, double *Resp); int ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)); // UseExternShape(double *shape); double_buff Output; private: int Len; // Tap/Shape length double *Shape; // Response shape int ExternShape; // that we are using an externally provided shape double *Tap; int TapPtr; } ; // ---------------------------------------------------------------------------- // a pair of FIR filters. quadrature split, decimate // the decimation rate must be integer class dspQuadrSplit { public: dspQuadrSplit(); ~dspQuadrSplit(); void Free(void); int Preset(int FilterLen, double *FilterShape_I, double *FilterShape_Q, int DecimateRate); int ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)); // int Process(double *Inp, int InpLen, // double *OutI, double *OutQ, int MaxOutLen, int *OutLen); // int Process(double *Inp, int InpLen, // dspCmpx *Out, int MaxOutLen, int *OutLen); int Process(double_buff *Input); dspCmpx_buff Output; private: int Len; double_buff Tap; double *ShapeI, *ShapeQ; int ExternShape; int Rate; } ; // ---------------------------------------------------------------------------- // reverse of dspQuadrSplit: interpolates and combines the I/Q // back into 'real' signal. class dspQuadrComb { public: dspQuadrComb(); ~dspQuadrComb(); void Free(void); int Preset(int FilterLen, double *FilterShape_I, double *FilterShape_Q, int DecimateRate); int ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)); int Process(dspCmpx_buff *Input); double_buff Output; private: int Len; double *Tap; int TapPtr; double *ShapeI, *ShapeQ; int ExternShape; int Rate; } ; // ---------------------------------------------------------------------------- // complex mix with an oscilator (carrier) // here we could avoid computing sine/cos at every sample class dspCmpxMixer { public: dspCmpxMixer(); // ~dspCmpxMixer(); void Free(void); int Preset(double CarrierOmega); int ProcessFast(double *InpI, double *InpQ, int InpLen, double *OutI, double *OutQ); int Process(dspCmpx *Inp, int InpLen, dspCmpx *Out); int ProcessFast(dspCmpx *Inp, int InpLen, dspCmpx *Out); int Process(dspCmpx_buff *Input); int ProcessFast(dspCmpx_buff *Input); dspCmpx_buff Output; public: double dspPhase,Omega; } ; // ---------------------------------------------------------------------------- // FM demodulator (dspPhase rotation speed-meter) class dspFMdemod { public: dspFMdemod(); // ~dspFMdemod(); int Preset(double CenterOmega); int Process(double *InpI, double *InpQ, int InpLen, double *Out); int Process(dspCmpx *Inp, int InpLen, double *Out); int Process(dspCmpx_buff *Input); double_buff Output; private: double PrevdspPhase; public: double RefOmega; } ; // ---------------------------------------------------------------------------- // Rate converter - real input/output, linear interpolation // expect large error when high frequency components are present // thus the best place to convert rates is after a low pass filter // of a demodulator. class dspRateConvLin { public: dspRateConvLin(); // ~dspRateConvLin(); void SetOutVsInp(double OutVsInp); void SetInpVsOut(double InpVsOut); int Process(double_buff *InpBuff); double_buff Output; private: double OutStep, OutdspPhase; double PrevSample; } ; // ---------------------------------------------------------------------------- // Rate converter - real input/output, quadratic interpolation // similar limits like for RateConv1 class dspRateConvQuadr { public: dspRateConvQuadr(); // ~dspRateConvQuadr(); void SetOutVsInp(double OutVsInp); void SetInpVsOut(double InpVsOut); int Process(double *Inp, int InpLen, double *Out, int MaxOutLen, int *OutLen); int Process(double_buff *InpBuff); double_buff Output; private: double OutStep, OutdspPhase; double Tap[4]; int TapPtr; } ; // ---------------------------------------------------------------------------- // Rate converter, real input/output, // bandwidth-limited interpolation, several shifted FIR filters class dspRateConvBL { public: dspRateConvBL(); ~dspRateConvBL(); void Free(void); int Preset(int FilterLen, double *FilterShape[], int FilterShapeNum); int ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)); void SetOutVsInp(double OutVsInp); void SetInpVsOut(double InpVsOut); int Process(double_buff *Input); int ProcessLinI(double_buff *Input); double_buff Output; private: double OutStep, OutdspPhase; int Len; double *Tap; int TapSize; double **Shape; int ShapeNum; int ExternShape; } ; // ---------------------------------------------------------------------------- // Sliding window (for FFT input) class dspCmpxSlideWindow { public: dspCmpxSlideWindow(); ~dspCmpxSlideWindow(); void Free(void); int Preset(int WindowLen, int SlideDist, double *WindowShape=(double*)NULL); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=1.0); int Process(dspCmpx_buff *Input); dspCmpx_buff Output; private: int Len; // Window length dspCmpx *Buff; // storage int Dist; // distance between slides int Ptr; // data pointer in Buff double *Window; // window shape int ExternWindow; } ; // ---------------------------------------------------------------------------- // Overlapping window (for IFFT output) class dspCmpxOverlapWindow { public: dspCmpxOverlapWindow(); ~dspCmpxOverlapWindow(); void Free(void); int Preset(int WindowLen, int SlideDist, double *WindowShape=(double*)NULL); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=1.0); void Process(dspCmpx *Inp, dspCmpx *Out); int ProcessSilence(int Slides=1); int Process(dspCmpx_buff *Input); int Process(dspCmpx *Input); // int Process(dspCmpx_buff *Input); dspCmpx_buff Output; private: int Len; // Window length dspCmpx *Buff; // storage int Dist; // distance between slides double *Window; // window shape int ExternWindow; } ; // ---------------------------------------------------------------------------- // FFT dspPhase corrector class dspFFT_TimeShift { public: dspFFT_TimeShift(); ~dspFFT_TimeShift(); void Free(void); int Preset(int FFTlen, int Backwards=0); int Process(dspCmpx *Data, int Time); private: int Len; // FFT length int LenMask; // length-1 for pointer wrapping dspCmpx *FreqTable; // sin/cos table int dspPhase; } ; // ---------------------------------------------------------------------------- // bit synchronizer, the bit rate is the input rate divided by four class dspDiffBitSync4 { public: dspDiffBitSync4(int IntegBits); ~dspDiffBitSync4(); void Free(void); int Process(double *Inp, int InpLen, double *BitOut, double *IbitOut, int MaxOutLen, int *OutLen); double GetSyncDriftRate(); // get aver. sync. drift double GetSyncConfid(); private: // eg. 0.01 means 1 bit drift per 100 bits double *InpTap; int InpTapLen, InpTapPtr; // buffer tap, length and pointer int IntegLen; // integrate tdspIntming over that many bits double W1,W2,W5; // weights for the two-stage IIR lopass filter double DiffInteg0[4], DiffInteg[4]; // signal diff. integrators int DiffTapPtr; // integrator and bit-sdspAmpling pointer int BitPtr; double SyncdspPhase; // sync. pointer/dspPhase double SyncDrift0,SyncDrift; // low pass filter for the sync. drift rate double SyncConfid; } ; // ---------------------------------------------------------------------------- // bit slicer, SNR/Tune meter class dspBitSlicer { public: dspBitSlicer(int IntegBits); ~dspBitSlicer(); int Process(double *Bits, double *IBits, int InpLen, double *OutBits); double GetSigToNoise(); double GetdspAmplAsym(); double GetTimeAsym(); private: int IntegLen,TapLen; double W1,W2,W5; double Sum0[2], Sum[2]; double SumSq0[2], SumSq[2]; double TimeAsym0, TimeAsym; double dspAmplAsym0, dspAmplAsym; double Noise[2]; double OptimThres; double *Tap; int TapPtr; double PrevBit, PrevIBit; } ; // ---------------------------------------------------------------------------- // The decoder for the HDLC frames, // makes no AX.25 CRC check, only the length in bytes against MinLen and MaxLen // however it does not pass frames with non-complete bytes. class dspHDLCdecoder { public: dspHDLCdecoder(int minlen, int maxlen, int diff, int invert, int chan, int (*handler)(int, char *, int)); ~dspHDLCdecoder(); int Process(double *Inp, int InpLen); public: int AllFrameCount; int BadFrameCount; private: int MinLen,MaxLen; int RxDiff,RxInvert; int ChanId; int (*FrameHandler)(int ChanId, char *Frame, int Len); char *Buff; int Len,PrevLev; unsigned int ShiftReg; int BitCount,Count1s; } ; // ---------------------------------------------------------------------------- // AX.25 CRC short unsigned int dspAX25CRC(char *Data, int Len); // ---------------------------------------------------------------------------- // check if the given number (an integer) is a dspPower of 2 template int dspPowerOf2(type I) { int c; if(I<=0) return 0; for(c=0; I!=0; I>>=1) c+=I&1; return c==1; } // ---------------------------------------------------------------------------- class dsp_r2FFT // radix-2 FFT { public: // size must a dspPower of 2: 2,4,8,16,32,64,128,256,... dsp_r2FFT(); ~dsp_r2FFT(); void Free(void); // preset tables for given processing size int Preset(int size); // scramble/unscramble input void Scramble(dspCmpx x[]); // apply input window // separate the result of a two real channels FFT void SeparTwoReals(dspCmpx Buff[], dspCmpx Out0[], dspCmpx Out1[]); // join spectra of two real channels void JoinTwoReals(dspCmpx Inp0[], dspCmpx Inp1[], dspCmpx Buff[]); // core process: the classic tripple loop of butterflies void CoreProc(dspCmpx x[]); // complex FFT process in place, includes unscrambling inline void ProcInPlace(dspCmpx x[]) { Scramble(x); CoreProc(x); } // define the FFT window and input/output scales (NULL => rectangular window) public: int Size; // FFT size int *BitRevIdx; // Bit-reverse indexing table for data (un)scrambling dspCmpx *Twiddle; // Twiddle factors (sine/cos values) private: // double *Window; // window shape (NULL => rectangular window // double WinInpScale, WinOutScale; // window scales on input/output private: // classic radix-2 butterflies inline void FFTbf(dspCmpx &x0, dspCmpx &x1, dspCmpx &W); // special 2-elem. FFT for the first pass inline void FFT2(dspCmpx &x0, dspCmpx &x1); // special 2-elem. FFT for the second pass inline void FFT4(dspCmpx &x0, dspCmpx &x1, dspCmpx &x2, dspCmpx &x3); } ; // --------------------------------------------------------------------------- // Sliding window FFT for spectral analysis (e.g. SETI) // input: real-valued time-domain signal, // output: complex-valued Fourier Transform // // We use a little trick here to process two real-valued FFT // in one go using the complex FFT engine. // This cuts the CPU but makes the input->output dspDelay longer. class dspSlideWinFFT { public: dspSlideWinFFT(); ~dspSlideWinFFT(); void Free(); int Preset(int size, int step, double *window); int Preset(int size, int step, double (*NewWindow)(double dspPhase), double Scale=1.0); int SetWindow(double *window); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=1.0); int Process(double_buff *Input); dsp_r2FFT FFT; // FFT engine dspCmpx_buff Output; // output buffer int Size; int SizeMask; // FFT size, size mask for pointer wrapping int Dist; int Left; // distance between slides, samples left before the next slide int Slide; // even/odd slide private: double *SlideBuff; int SlidePtr; // sliding window buffer, pointer double *Window; int ExternWindow; // window shape dspCmpx *FFTbuff; // FFT buffer } ; // --------------------------------------------------------------------------- // Overlapping window Inverse FFT to convert spectra into time-domain signal class dspOvlapWinIFFT { public: dspOvlapWinIFFT(); ~dspOvlapWinIFFT(); void Free(void); int Preset(int size, int step, double *window); int Preset(int size, int step, double (*NewWindow)(double dspPhase), double Scale=1.0); int SetWindow(double *window); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=1.0); int Process(dspCmpx *Input); dsp_r2FFT FFT; // FFT engine double_buff Output; // output buffer int Size; int SizeMask; // FFT size, size mask for pointer wrapping int Dist; // distance between slides int Slide; private: dspCmpx *Spectr[2]; dspCmpx *FFTbuff; // FFT buffer double *Window; int ExternWindow; // window shape double *OvlapBuff; int OvlapPtr; } ; // --------------------------------------------------------------------------- // Sliding window FFT for spectral processing (e.g. de-noising) // input: real-valued signal // in the middle you are given a chance to process // the complex-valued Fourier Transform (SpectraProc() routine). // output: real-valued signal // If you don't touch the spectra in SpectralProc() // the output will be an exact copy (only dspDelayed) of the input. class dspSlideWinFFTproc { public: dspSlideWinFFTproc(); ~dspSlideWinFFTproc(); void Free(void); int Preset(int size, int step, void (*proc)(dspCmpx *Spectra, int Len), double *window); int Preset(int size, int step, void (*proc)(dspCmpx *Spectra, int Len), double (*NewWindow)(double dspPhase), double Scale=0.0); int SetWindow(double *window); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=0.0); int Process(double_buff *Input); dsp_r2FFT FFT; double_buff Output; int Size; int SizeMask; int Dist; int Left; int Slide; private: double *SlideBuff; int SlidePtr; double *Window; int ExternWindow; dspCmpx *FFTbuff; dspCmpx *Spectr[2]; void (*SpectraProc)(dspCmpx *Spectra, int Len); double *OvlapBuff; int OvlapPtr; } ; // --------------------------------------------------------------------------- // Walsh (Hadamard ?) transform. void dspWalshTrans(double *Data, int Len); void dspWalshInvTrans(double *Data, int Len); // --------------------------------------------------------------------------- fldigi-3.21.80/src/include/debug.h0000664000175000017500000000606012313064025013515 00000000000000// ---------------------------------------------------------------------------- // debug.h // // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _DEBUG_H_ #define _DEBUG_H_ #define DEBUG_PSKMAIL 1 #include "util.h" class debug { public: enum level_e { QUIET_LEVEL, ERROR_LEVEL, WARN_LEVEL, INFO_LEVEL, VERBOSE_LEVEL, DEBUG_LEVEL, LOG_NLEVELS }; enum source_e { LOG_ARQCONTROL = 1 << 0, LOG_AUDIO = 1 << 1, LOG_MODEM = 1 << 2, LOG_RIGCONTROL = 1 << 3, LOG_RPC = 1 << 4, LOG_SPOTTER = 1 << 5, LOG_OTHER = 1 << 6 }; static void start(const char* filename); static void stop(void); static void log(level_e level, const char* func, const char* srcf, int line, const char* format, ...) format__(printf, 5, 6); static void elog(const char* func, const char* srcf, int line, const char* text); static void rotate_log(const char* filename); static void show(void); static level_e level; static uint32_t mask; private: static void sync_text(void*); debug(const char* filename); debug(const debug&); debug& operator=(const debug&); ~debug(); static debug* inst; }; #define LOG(level__, source__, ...) \ do { \ if (level__ <= debug::level && source__ & debug::mask) \ debug::log(level__, __func__, __FILE__, __LINE__, __VA_ARGS__); \ } while (0) #define LOG_DEBUG(...) LOG(debug::DEBUG_LEVEL, log_source_, __VA_ARGS__) #define LOG_VERBOSE(...) LOG(debug::VERBOSE_LEVEL, log_source_, __VA_ARGS__) #define LOG_INFO(...) LOG(debug::INFO_LEVEL, log_source_, __VA_ARGS__) #define LOG_WARN(...) LOG(debug::WARN_LEVEL, log_source_, __VA_ARGS__) #define LOG_ERROR(...) LOG(debug::ERROR_LEVEL, log_source_, __VA_ARGS__) #define LOG_PERROR(msg__) \ do { \ if (debug::ERROR_LEVEL <= debug::level && log_source_ & debug::mask) \ debug::elog(__func__, __FILE__, __LINE__, msg__); \ } while (0) unused__ static uint32_t log_source_ = debug::LOG_OTHER; #if defined(__GNUC__) && (__GNUC__ >= 3) # define LOG_FILE_SOURCE(source__) \ __attribute__((constructor)) \ static void log_set_source_(void) { log_source_ = source__; } #else # define LOG_FILE_SOURCE(source__) #endif #define LOG_SET_SOURCE(source__) log_source_ = source__ extern bool debug_pskmail; extern bool debug_audio; #endif // _DEBUG_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-3.21.80/src/include/icons.h0000664000175000017500000000406412313064025013544 00000000000000// ---------------------------------------------------------------------------- // icons.h // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef ICONS_H_ #define ICONS_H_ #define USE_IMAGE_LABELS 1 #include #include #include #include "pixmaps.h" const char* make_icon_label(const char* text, const char** pixmap = 0); void set_icon_label(Fl_Menu_Item* item); void set_icon_label(Fl_Widget* w); void toggle_icon_labels(void); const char* get_icon_label_text(Fl_Menu_Item* item); const char* get_icon_label_text(Fl_Widget* w); void free_icon_label(Fl_Menu_Item* item); void free_icon_label(Fl_Widget* w); void set_active(Fl_Menu_Item* item, bool v); void set_active(Fl_Widget* w, bool v); // fltk message dialogs with nicer icons void set_message_icon(const char** pixmap); #define fl_input2(...) ({ set_message_icon(dialog_question_48_icon); fl_input(__VA_ARGS__); }) #define fl_choice2(...) ({ set_message_icon(dialog_question_48_icon); fl_choice(__VA_ARGS__); }) #define fl_message2(...) ({ set_message_icon(dialog_information_48_icon); fl_message(__VA_ARGS__); }) #define fl_alert2(...) ({ set_message_icon(dialog_warning_48_icon); fl_alert(__VA_ARGS__); }) #define fl_warn_choice2(...) ({ set_message_icon(dialog_warning_48_icon); fl_choice(__VA_ARGS__); }) #endif // ICONS_H_ fldigi-3.21.80/src/include/complex.h0000664000175000017500000000237712313064025014105 00000000000000// ---------------------------------------------------------------------------- // complex.h -- Complex arithmetic // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _COMPLEX_H #define _COMPLEX_H #include #include typedef std::complex cmplx; inline cmplx cmac (const cmplx *a, const cmplx *b, int ptr, int len) { cmplx z; ptr %= len; for (int i = 0; i < len; i++) { z += a[i] * b[ptr]; ptr = (ptr + 1) % len; } return z; } #endif fldigi-3.21.80/src/include/re.h0000664000175000017500000000422312311177404013040 00000000000000// ---------------------------------------------------------------------------- // re.h // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef RE_H_ #define RE_H_ #if HAVE_REGEX_H # include #else # include "compat/regex.h" #endif #include #include class re_t { public: re_t(const char* pattern_ = "", int cflags_ = 0); re_t(const re_t& re); ~re_t(); re_t& operator=(const re_t& rhs); void recompile(const char* pattern_); operator bool(void) const { return !error; } bool operator==(const re_t& o) const { return o.cflags == cflags && o.pattern == pattern; } bool match(const char* str, int eflags_ = 0); const std::string& submatch(size_t n) const; void suboff(size_t n, int* start, int* end) const; const std::vector& suboff(void) const { return suboffsets; } size_t nsub(void) const { return suboffsets.size(); } const std::string& re(void) const { return pattern; } int cf(void) const { return cflags; } size_t hash(void) const; protected: void compile(void); std::string pattern; int cflags, eflags; regex_t preg; std::vector suboffsets; std::vector substrings; bool error; bool need_substr; }; class fre_t : public re_t { public: fre_t(const char* pattern_, int cflags_ = 0); bool match(const char* str, int eflags_ = 0); }; #endif // RE_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-3.21.80/src/include/rigxml.h0000664000175000017500000000575612313064025013744 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef XML_H #define XML_H #include #include using namespace std; struct MODE { std::string SYMBOL; std::string BYTES; MODE(std::string nm, std::string b) { SYMBOL = nm; BYTES = b;} MODE(std::string nm, char c) { SYMBOL = nm; BYTES += c;} }; struct BW { std::string SYMBOL; std::string BYTES; BW(std::string nm, std::string b) { SYMBOL = nm; BYTES = b;} BW(std::string nm, char c) { SYMBOL = nm; BYTES += c;} }; struct DATA { std::string dtype; int size; int max; int min; float resolution; bool reverse; int andmask; int shiftbits; void clear() { size = 0; dtype.clear(); max = 199999999; min = 0; resolution = 1.0; reverse = false; andmask = 0xFF; shiftbits = 0; } }; struct XMLIOS { std::string SYMBOL; int size; std::string str1; std::string str2; DATA data; int fill1; int fill2; std::string info; std::string ok; std::string bad; void clear() { SYMBOL.clear(); str1.clear(); str2.clear(); info.clear(); ok.clear(); bad.clear(); size = fill1 = fill2 = 0; data.clear(); }; }; struct TAGS { const char *tag; void (*fp)(size_t &);}; struct XMLRIG { std::string port; string rigTitle; int baud; int stopbits; bool dtr; bool dtrptt; bool rts; bool rtsptt; bool rtscts; bool restore_tio; int write_delay; int init_delay; int post_write_delay; int timeout; int retries; bool echo; bool cmdptt; bool vsp; void clear() { port.clear(); baud = 1200; stopbits = 2; dtr = false; dtrptt = false; rts = false; rtsptt = false; rtscts = false; restore_tio = true; echo = false; cmdptt = false; vsp = false; write_delay = 0; init_delay = 0; post_write_delay = 50; timeout = 200; retries = 5; rigTitle = ""; } }; extern std::list commands; extern std::list reply; extern std::list lmodes; extern std::list lmodeCMD; extern std::list lmodeREPLY; extern std::list lbws; extern std::list lbwCMD; extern std::list lbwREPLY; extern std::list LSBmodes; extern XMLRIG xmlrig; extern bool readRigXML(); extern void selectRigXmlFilename(); #endif fldigi-3.21.80/src/include/rigCAT.h0000664000175000017500000000232712313064025013542 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef RIGCAT_H_ #define RIGCAT_H_ #ifndef RIGCATTEST # error FIXME: file should not have been included #endif #include #include #include #include #include extern Fl_Double_Window *window; extern char *homedir; extern string xmlfname; extern void MilliSleep(long msecs); #endif fldigi-3.21.80/src/include/combo.h0000664000175000017500000000763312312551341013536 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // // This 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 software 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 . // ---------------------------------------------------------------------------- #ifndef _FL_COMBOBOX_H #define _FL_COMBOBOX_H #include #include #include #include #include #include #include #include #define FL_COMBO_UNIQUE 1 #define FL_COMBO_UNIQUE_NOCASE 2 #define FL_COMBO_LIST_INCR 100 class Fl_ComboBox; enum {COMBOBOX, LISTBOX}; struct datambr { char *s; void *d; }; class Fl_PopBrowser : public Fl_Window { friend void popbrwsr_cb(Fl_Widget *, long); Fl_Select_Browser *popbrwsr; int hRow; int wRow; std::string keystrokes; public: Fl_PopBrowser (int x, int y, int w, int h, const char *label); ~Fl_PopBrowser (); void popshow (int, int); void pophide (); void popbrwsr_cb_i (Fl_Widget *, long); void add (char *s, void *d = 0); void clear (); void sort (); int handle (int); void clear_kbd() { keystrokes.clear(); } Fl_ComboBox *parentCB; Fl_Widget *parentWindow; }; class Fl_ComboBox : public Fl_Group { friend int DataCompare (const void *, const void *); friend class Fl_PopBrowser; Fl_Button *btn; Fl_Box *valbox; Fl_Input *val; Fl_PopBrowser *Brwsr; datambr **datalist; int listsize; int maxsize; int listtype; int numrows_; int type_; int width; int height; void *retdata; int idx; Fl_Color _color; void insert(const char *, void *); public: Fl_ComboBox (int x, int y, int w, int h, const char *lbl = 0, int wtype = COMBOBOX); ~Fl_ComboBox(); const char *value (); void value (const char *); void put_value( const char *); void fl_popbrwsr(Fl_Widget *); void type (int = 0); void add (const char *s, void *d = 0); void clear (); void sort (); int index (); void index (int i); void *data (); void textfont (int); void textsize (uchar); void textcolor (Fl_Color c); void color (Fl_Color c); void readonly(bool yes = true); int numrows() { return numrows_; } void numrows(int n) { numrows_ = n; } int lsize() { return listsize; } void set_focus() { Fl::focus(btn); }; void labelfont(Fl_Font fnt) { Fl_Group::labelfont(fnt); } Fl_Font labelfont() { return Fl_Group::labelfont(); } void labelsize(Fl_Fontsize n) { Fl_Group::labelsize(n); } Fl_Fontsize labelsize() { return Fl_Group::labelsize(); } int handle(int); // Custom resize behavior -- input stretches, button doesn't inline int val_x() { return x(); } inline int val_y() { return y(); } inline int val_w() { return w() - h(); } inline int val_h() { return h(); } inline int btn_x() { return x() + w() - h(); } inline int btn_y() { return y(); } inline int btn_w() { return h(); } inline int btn_h() { return h(); } void resize(int X, int Y, int W, int H) { Fl_Group::resize(X,Y,W,H); if (type_ == LISTBOX) valbox->resize(val_x(), val_y(), val_w(), val_h()); else val->resize(val_x(), val_y(), val_w(), val_h()); btn->resize(btn_x(), btn_y(), btn_w(), btn_h()); } }; class Fl_ListBox : public Fl_ComboBox { public: Fl_ListBox (int x, int y, int w, int h, const char *lbl = 0) : Fl_ComboBox(x,y,w,h,lbl,LISTBOX) {}; ~Fl_ListBox() {}; }; #endif fldigi-3.21.80/src/include/socket.h0000664000175000017500000000775412313147652013742 00000000000000// ---------------------------------------------------------------------------- // socket.h // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef SOCKET_H_ #define SOCKET_H_ #include #include #ifndef __MINGW32__ # include # include # if defined(__OpenBSD__) && defined(nitems) # undef nitems # endif # include #else # include #endif #include #include #include class SocketException : public std::exception { public: SocketException(int err_ = 0) : err(err_), msg(err_to_str(err_)) { } SocketException(const char* msg_) : err(1), msg(msg_) { } SocketException(int err_, const std::string& prefix) : err(err_), msg(std::string(prefix).append(": ").append(err_to_str(err_))) { } virtual ~SocketException() throw() { } const char* what(void) const throw() { return msg.c_str(); } int error(void) const { return err; } protected: const char* err_to_str(int e) { #if HAVE_GETADDRINFO if (e < 0) return gai_strerror(e); else #endif return strerror(e); } int err; std::string msg; }; #if HAVE_GETADDRINFO typedef struct addrinfo addr_info_t; #else struct addr_info_t { int ai_family; int ai_socktype; int ai_protocol; int ai_addrlen; struct sockaddr* ai_addr; }; #endif class Address { public: Address(const char* host = "", int port = 0, const char* proto_name = "tcp"); Address(const char* host, const char* port_name, const char* proto_name = "tcp"); Address(const Address& addr); ~Address(); Address& operator=(const Address& rhs); size_t size(void) const; const addr_info_t* get(size_t n = 0) const; static std::string get_str(const addr_info_t* addr); private: void lookup(const char* proto_name); std::string node; std::string service; int port; #if HAVE_GETADDRINFO struct addrinfo* info; #else struct hostent host_entry; struct servent service_entry; mutable addr_info_t addr; mutable struct sockaddr_in saddr; #endif bool copied; }; class Socket { public: Socket(const Address& addr); Socket(int fd = -1); Socket(const Socket& s); ~Socket(); Socket& operator=(const Socket& rhs); void open(const Address& addr); void close(void); bool wait(int dir); // Server void bind(void); void listen(int backlog = SOMAXCONN); Socket accept(void); Socket accept1(void); // Client void connect(const Address& addr); void connect(void); // Data Transimission size_t send(const void* buf, size_t len); size_t send(const std::string& buf); size_t recv(void* buf, size_t len); size_t recv(std::string& buf); // Options int get_bufsize(int dir); void set_bufsize(int dir, int len); void set_nonblocking(bool v = true); void set_nodelay(bool v = true); void set_timeout(const struct timeval& t); void set_timeout(double t); void set_autoclose(bool v) const; void set_close_on_exec(bool v, int fd = -1); int fd(void); private: int sockfd; Address address; size_t anum; const addr_info_t* ainfo; char* buffer; struct timeval timeout; bool nonblocking; mutable bool autoclose; }; #endif // SOCKET_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-3.21.80/src/include/pkg.h0000664000175000017500000000261112313064025013206 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef PKG_H_ #define PKG_H_ #include #if BUILD_FLDIGI # define PACKAGE_AUTHORS FLDIGI_AUTHORS #else # define PACKAGE_AUTHORS FLARQ_AUTHORS # undef PACKAGE # define PACKAGE "flarq" # undef PACKAGE_NAME # define PACKAGE_NAME "flarq" # undef PACKAGE_TARNAME # define PACKAGE_TARNAME "flarq" # undef PACKAGE_VERSION # define PACKAGE_VERSION FLARQ_VERSION # undef PACKAGE_STRING # define PACKAGE_STRING PACKAGE_TARNAME " " PACKAGE_VERSION # undef VERSION # define VERSION PACKAGE_VERSION #endif #endif fldigi-3.21.80/src/include/pixmaps.h0000664000175000017500000000660112313064025014111 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef PIXMAPS_H_ #define PIXMAPS_H_ extern const char *address_book_icon[]; extern const char *edit_undo_icon[]; extern const char *edit_select_all_icon[]; extern const char *edit_clear_icon[]; extern const char *edit_copy_icon[]; extern const char *edit_cut_icon[]; extern const char *edit_paste_icon[]; extern const char *file_open_icon[]; extern const char *format_indent_more_icon[]; extern const char *left_arrow_icon[]; extern const char *log_out_icon[]; extern const char *minus_icon[]; extern const char *net_icon[]; extern const char *plus_icon[]; extern const char *process_stop_icon[]; extern const char *right_arrow_icon[]; extern const char *save_as_icon[]; extern const char *save_icon[]; extern const char *time_icon[]; extern const char *trash_icon[]; extern const char *image_icon[]; extern const char *weather_clear_icon[]; extern const char *start_here_icon[]; extern const char *help_browser_icon[]; extern const char *system_search_icon[]; extern const char *system_software_update_icon[]; extern const char *utilities_terminal_icon[]; extern const char *emblem_symbolic_link_icon[]; extern const char *emblems_system_icon[]; extern const char *dialog_information_icon[]; extern const char *executable_icon[]; extern const char *other_icon[]; extern const char *folder_open_icon[]; extern const char *preferences_system_icon[]; extern const char *preferences_desktop_font_icon[]; extern const char *system_users_icon[]; extern const char *utilities_system_monitor_icon[]; extern const char *multimedia_player_icon[]; extern const char *chat_icon[]; extern const char *dialog_information_48_icon[]; extern const char *dialog_warning_48_icon[]; extern const char *refresh_icon[]; extern const char *text_editor_icon[]; extern const char *text_icon[]; extern const char *shutdown_icon[]; extern const char *applications_system_icon[]; extern const char *audio_card_icon[]; extern const char *help_about_icon[]; extern const char *insert_link_icon[]; extern const char *close_icon[]; extern const char *apply_icon[]; extern const char *enter_key_icon[]; extern const char *dialog_question_48_icon[]; extern const char *clear_sq_icon[]; extern const char *clear_row_icon[]; extern const char *rx1_icon[]; extern const char *tx1_icon[]; extern const char *rx2_icon[]; extern const char *tx2_icon[]; extern const char *rx_icon[]; extern const char *tx_icon[]; extern const char *fldigi_icon[]; extern const char *flarq_icon[]; extern const char *waterfall_icon[]; extern const char *dice_icon[]; extern const char *pskr_icon[]; #endif // PIXMAPS_H_ fldigi-3.21.80/src/include/modem.h0000664000175000017500000002156412313147652013546 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _MODEM_H #define _MODEM_H #include #include "threads.h" #include "sound.h" #include "digiscope.h" #include "globals.h" #include "morse.h" #include "ascii.h" #define OUTBUFSIZE 16384 // Constants for signal searching & s/n threshold #define SIGSEARCH 5 #define TWOPI (2.0 * M_PI) class modem { public: static double frequency; static double tx_frequency; static bool freqlock; static unsigned long tx_sample_count; static unsigned int tx_sample_rate; static bool XMLRPC_CPS_TEST; protected: cMorse morse; trx_mode mode; SoundBase *scard; bool stopflag; int fragmentsize; int samplerate; bool reverse; int sigsearch; double bandwidth; double freqerr; double rx_corr; double tx_corr; double PTTphaseacc; double PTTchannel[OUTBUFSIZE]; // for CW modem use only bool cwTrack; bool cwLock; double cwRcvWPM; double cwXmtWPM; double squelch; double metric; double syncpos; int backspaces; unsigned char *txstr; unsigned char *txptr; double outbuf[OUTBUFSIZE]; bool historyON; Digiscope::scope_mode scopemode; int scptr; // extended s/n reporting double s2n_ncount, s2n_sum, s2n_sum2, s2n_metric; bool s2n_valid; unsigned cap; public: modem(); virtual ~modem(){}; // these processes must be declared in the derived class virtual void init(); virtual void tx_init (SoundBase *sc) = 0; virtual void rx_init () = 0; virtual void restart () = 0; virtual void rx_flush() {}; virtual int tx_process () = 0; virtual int rx_process (const double *, int len) = 0; virtual void shutdown(){}; virtual void set1(int, int){}; virtual void set2(int, int){}; virtual void makeTxViewer(int W, int H){}; virtual void searchDown() {}; virtual void searchUp() {}; void HistoryON(bool val) {historyON = val;} bool HistoryON() const { return historyON;} /// Inlined const getters are faster and smaller. trx_mode get_mode() const { return mode; }; const char *get_mode_name() const { return mode_info[get_mode()].sname;} virtual void set_freq(double); /// Inlining small formulas is still faster and shorter. int get_freq() const { return (int)( frequency + 0.5 ); } void init_freqlock(); void set_freqlock(bool); void set_sigsearch(int n) { sigsearch = n; freqerr = 0.0;}; bool freqlocked() const { return freqlock;} /// Getters are semantically const. double get_txfreq() const; double get_txfreq_woffset() const; void set_metric(double); void display_metric(double); double get_metric() const { return metric;} void set_reverse(bool on); bool get_reverse() const { return reverse;} double get_bandwidth() const { return bandwidth;} void set_bandwidth(double); int get_samplerate() const { return samplerate;} void set_samplerate(int); void init_queues(); void ModulateXmtr(double *, int); void ModulateStereo(double *, double *, int); void videoText(); void pretone(); virtual void send_image(std::string) {} void set_stopflag(bool b) { stopflag = b;}; bool get_stopflag() const { return stopflag; }; unsigned get_cap(void) const { return cap; } enum { CAP_AFC = 1 << 0, CAP_AFC_SR = 1 << 1, CAP_REV = 1 << 2, CAP_IMG = 1 << 3, CAP_BW = 1 << 4, CAP_RX = 1 << 5, CAP_TX = 1 << 6 }; // for CW modem use only bool get_cwTrack(); void set_cwTrack(bool); bool get_cwLock(); void set_cwLock(bool); double get_cwXmtWPM(); void set_cwXmtWPM(double); double get_cwRcvWPM(); virtual void incWPM() {}; virtual void decWPM() {}; virtual void toggleWPM() {}; virtual void sync_parameters() {}; virtual void reset_rx_filter(bool) {}; virtual void update_Status() {}; // for waterfall id transmission private: static double wfid_w[]; static double wfid_outbuf[]; int vidwidth; void wfid_make_tones(int numchars); void wfid_send(int numchars); void wfid_sendchars(std::string s); double PTTnco(); public: void wfid_text(const std::string& s); // for CW ID transmission private: double cwid_keyshape[128]; double cwid_phaseacc; int RT; int cwid_symbollen; int cwid_lastsym; public: void cwid_makeshape(); double cwid_nco(double freq); void cwid_send_symbol(int bits); void cwid_send_ch(int ch); void cwid_sendtext (const std::string& s); void cwid(); // for noise tests private: void add_noise(double *, int); double sigmaN (double es_ovr_n0); double gauss(double sigma); protected: virtual void s2nreport(void); // JD & DF for multiple carriers public: int numcarriers; //Number of parallel carriers for M CAR PSK and PSKR and QPSKR int symbols; //JD for multiple carriers int acc_symbols; int char_symbols; int xmt_symbols; int ovhd_symbols; int acc_samples; int char_samples; int xmt_samples; int ovhd_samples; }; extern modem *null_modem; extern modem *cw_modem; extern modem *mfsk8_modem; extern modem *mfsk16_modem; extern modem *mfsk32_modem; // experimental modes extern modem *mfsk4_modem; extern modem *mfsk11_modem; extern modem *mfsk22_modem; extern modem *mfsk31_modem; extern modem *mfsk64_modem; extern modem *mfsk128_modem; extern modem *mfsk64l_modem; extern modem *mfsk128l_modem; extern modem *wefax576_modem; extern modem *wefax288_modem; extern modem *navtex_modem; extern modem *sitorb_modem; extern modem *mt63_500S_modem; extern modem *mt63_1000S_modem; extern modem *mt63_2000S_modem; extern modem *mt63_500L_modem; extern modem *mt63_1000L_modem; extern modem *mt63_2000L_modem; extern modem *feld_modem; extern modem *feld_slowmodem; extern modem *feld_x5modem; extern modem *feld_x9modem; extern modem *feld_FMmodem; extern modem *feld_FM105modem; extern modem *feld_80modem; extern modem *feld_CMTmodem; extern modem *psk31_modem; extern modem *psk63_modem; extern modem *psk63f_modem; extern modem *psk125_modem; extern modem *psk250_modem; extern modem *psk500_modem; extern modem *psk1000_modem; extern modem *qpsk31_modem; extern modem *qpsk63_modem; extern modem *qpsk125_modem; extern modem *qpsk250_modem; extern modem *qpsk500_modem; extern modem *psk125r_modem; extern modem *psk250r_modem; extern modem *psk500r_modem; extern modem *psk1000r_modem; extern modem *psk800_c2_modem; extern modem *psk800r_c2_modem; extern modem *psk1000_c2_modem; extern modem *psk1000r_c2_modem; extern modem *psk63r_c4_modem; extern modem *psk63r_c5_modem; extern modem *psk63r_c10_modem; extern modem *psk63r_c20_modem; extern modem *psk63r_c32_modem; extern modem *psk125r_c4_modem; extern modem *psk125r_c5_modem; extern modem *psk125r_c10_modem; extern modem *psk125_c12_modem; extern modem *psk125r_c12_modem; extern modem *psk125r_c16_modem; extern modem *psk250r_c2_modem; extern modem *psk250r_c3_modem; extern modem *psk250r_c5_modem; extern modem *psk250_c6_modem; extern modem *psk250r_c6_modem; extern modem *psk250r_c7_modem; extern modem *psk500_c2_modem; extern modem *psk500_c4_modem; extern modem *psk500r_c2_modem; extern modem *psk500r_c3_modem; extern modem *psk500r_c4_modem; extern modem *rtty_modem; extern modem *pkt_modem; extern modem *olivia_modem; extern modem *olivia_4_250_modem; extern modem *olivia_8_250_modem; extern modem *olivia_4_500_modem; extern modem *olivia_8_500_modem; extern modem *olivia_16_500_modem; extern modem *olivia_8_1000_modem; extern modem *olivia_16_1000_modem; extern modem *olivia_32_1000_modem; extern modem *olivia_64_2000_modem; extern modem *contestia_modem; extern modem *thor4_modem; extern modem *thor5_modem; extern modem *thor8_modem; extern modem *thor11_modem; extern modem *thor16_modem; extern modem *thor22_modem; extern modem *thor25x4_modem; extern modem *thor50x1_modem; extern modem *thor50x2_modem; extern modem *thor100_modem; extern modem *dominoex4_modem; extern modem *dominoex5_modem; extern modem *dominoex8_modem; extern modem *dominoex11_modem; extern modem *dominoex16_modem; extern modem *dominoex22_modem; extern modem *dominoex44_modem; extern modem *dominoex88_modem; extern modem *throb1_modem; extern modem *throb2_modem; extern modem *throb4_modem; extern modem *throbx1_modem; extern modem *throbx2_modem; extern modem *throbx4_modem; extern modem *wwv_modem; extern modem *anal_modem; extern modem *ssb_modem; #endif fldigi-3.21.80/src/include/dominoex.h0000664000175000017500000000735712313064025014263 00000000000000// ---------------------------------------------------------------------------- // dominoex.h -- DominoEX modem // // Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2006 // Hamish Moffatt (hamish@debian.org) // Copyright (C) 2006 // David Freese (w1hkj@w1hkj.com) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _DOMINOEX_H #define _DOMINOEX_H #include #include "complex.h" #include "modem.h" #include "filters.h" #include "fftfilt.h" #include "dominovar.h" #include "mbuffer.h" // NASA coefficients for viterbi encode/decode algorithms #define K 7 #define POLY1 0x6d #define POLY2 0x4f //#include "mfskvaricode.h" #include "interleave.h" #include "viterbi.h" #define NUMTONES 18 #define MAXFFTS 8 #define BASEFREQ 1000.0 #define FIRSTIF 1500.0 #define SCOPESIZE 64 struct domrxpipe { cmplx vector[MAXFFTS * NUMTONES * 6]; }; class dominoex : public modem { public: enum { TX_STATE_PREAMBLE, TX_STATE_START, TX_STATE_DATA, TX_STATE_END, TX_STATE_FLUSH }; protected: // common variables double phase[MAXFFTS + 1]; double txphase; int symlen; int doublespaced; double tonespacing; int counter; unsigned int twosym; int paths; int numbins; bool slowcpu; int basetone; int lotone; int hitone; int extones; // rx variables C_FIR_filter *hilbert; sfft *binsfft[MAXFFTS]; fftfilt *fft; Cmovavg *vidfilter[SCOPESIZE]; Cmovavg *syncfilter; domrxpipe *pipe; unsigned int pipeptr; mbuffer scopedata; mbuffer videodata; cmplx currvector; int currsymbol; int prev1symbol; int prev2symbol; double met1; double met2; double sig; double noise; double s2n; int synccounter; unsigned char symbolbuf[MAX_VARICODE_LEN]; int symcounter; int symbolbit; bool filter_reset; bool staticburst; bool outofrange; // tx variables int txstate; int txprevtone; unsigned int bitshreg; std::string strSecXmtText; // FEC variables viterbi *MuPskDec; interleave *MuPskRxinlv; encoder *MuPskEnc; interleave *MuPskTxinlv; int Mu_bitstate; unsigned char Mu_symbolpair[2]; unsigned int Mu_datashreg; int Mu_symcounter; private: cmplx mixer(int n, cmplx in); void recvchar(int c); void decodesymbol(); void decodeDomino(int c); int harddecode(); void update_syncscope(); void synchronize(); void afc(); void reset_afc(); void eval_s2n(); void sendtone(int tone, int duration); void sendsymbol(int sym); void sendchar(unsigned char c, int secondary); void sendidle(); void sendsecondary(); void flushtx(); int get_secondary_char(); void reset_filters(); // MultiPsk FEC scheme // Rx unsigned int MuPskPriSecChar(unsigned int c); void decodeMuPskSymbol(unsigned char symbol); void decodeMuPskEX(int c); // Tx unsigned char MuPskSec2Pri(int c); void sendMuPskEX(unsigned char c, int secondary); void MuPskClearbits(); void MuPskFlushTx(); void MuPsk_sec2pri_init(void); public: dominoex (trx_mode md); ~dominoex (); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart(); int rx_process(const double *buf, int len); int tx_process(); }; #endif fldigi-3.21.80/src/include/flinput2.h0000664000175000017500000000212312313064025014166 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef FL_INPUT2_ #define FL_INPUT2_ #include class Fl_Input2 : public Fl_Input { public: Fl_Input2(int x, int y, int w, int h, const char* l = 0); int handle(int event); }; #endif // FL_INPUT2_ fldigi-3.21.80/src/include/gfft.h0000664000175000017500000023320012313064025013353 00000000000000//============================================================================== // g_fft.h: // // FFT library // Copyright (C) 2013 // Dave Freese, W1HKJ // // based on public domain code by John Green // original version is available at // http://hyperarchive.lcs.mit.edu/ // /HyperArchive/Archive/dev/src/ffts-for-risc-2-c.hqx // // ported to C++ for fldigi by Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi 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 fldigi. If not, see . //============================================================================== //============================================================================== // Original Green C implementation written as a C++ template // Code has been tested for types // g_fft // g_fft // g_fft // g_fft // where the xxx types perform better than the xxx_t types // typical performance for 8192 point fft on an Intel(R) Pentium(R) Dual // CPU E2180 @ 2.00GHz // type complex_fwd real_fwd // double 0.407 ms 0.203 ms // double_t 1.269 ms 0.593 ms // float 0.385 ms 0.193 ms // float_t 1.160 ms 0.627 ms //============================================================================== #ifndef CGREEN_FFT_H #define CGREEN_FFT_H #include template class g_fft { #define FFT_RECIPLN2 1.442695040888963407359924681001892137426 // 1.0/log(2) // some useful conversions between a number and its power of 2 #define LOG2(a) (FFT_RECIPLN2*log(a)) // floating point logarithm base 2 #define POW2(m) ((unsigned int) 1 << (m)) // integer power of 2 for m<32 // fft's with M bigger than this bust primary cache #define MCACHE (11 - (sizeof(FFT_TYPE) / 8)) // some math constants to 40 decimal places #define FFT_PI 3.141592653589793238462643383279502884197 // pi #define FFT_ROOT2 1.414213562373095048801688724209698078569 // sqrt(2) #define FFT_COSPID8 0.9238795325112867561281831893967882868224 // cos(pi/8) #define FFT_SINPID8 0.3826834323650897717284599840303988667613 // sin(pi/8) private: int FFT_size; int FFT_N; FFT_TYPE *FFT_table_1[32]; short int *FFT_table_2[32]; FFT_TYPE *Utbl; short *BRLow; void fftInit(); int ConvertFFTSize(int); // base fft methods void riffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow); void ifrstage(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl); void rifft8pt(FFT_TYPE *ioptr, FFT_TYPE scale); void rifft4pt(FFT_TYPE *ioptr, FFT_TYPE scale); void rifft2pt(FFT_TYPE *ioptr, FFT_TYPE scale); void rifft1pt(FFT_TYPE *ioptr, FFT_TYPE scale); void rffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow); void frstage(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl); void rfft8pt(FFT_TYPE *ioptr); void rfft4pt(FFT_TYPE *ioptr); void rfft2pt(FFT_TYPE *ioptr); void rfft1pt(FFT_TYPE *ioptr); void iffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow); void ifftrecurs(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt); void ibfstages(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt); void ibfR4(FFT_TYPE *ioptr, int M, int NDiffU); void ibfR2(FFT_TYPE *ioptr, int M, int NDiffU); void ifft8pt(FFT_TYPE *ioptr, FFT_TYPE scale); void ifft4pt(FFT_TYPE *ioptr, FFT_TYPE scale); void ifft2pt(FFT_TYPE *ioptr, FFT_TYPE scale); void scbitrevR2(FFT_TYPE *ioptr, int M, short *BRLow, FFT_TYPE scale); void ffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow); void fftrecurs(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt); void bfstages(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt); void bfR4(FFT_TYPE *ioptr, int M, int NDiffU); void bfR2(FFT_TYPE *ioptr, int M, int NDiffU); void fft8pt(FFT_TYPE *ioptr); void fft4pt(FFT_TYPE *ioptr); void fft2pt(FFT_TYPE *ioptr); void bitrevR2(FFT_TYPE *ioptr, int M, short *BRLow); void fftBRInit(int M, short *BRLow); void fftCosInit(int M, FFT_TYPE *Utbl); public: g_fft(int M = 8192) { if (M < 16) M = 16; if (M > 268435456) M = 268435456; FFT_size = M; fftInit(); } ~g_fft() { for (int i = 0; i < 32; i++) { if (FFT_table_1[i] != 0) delete [] FFT_table_1[i]; if (FFT_table_2[i] != 0) delete [] FFT_table_2[i]; } } void ComplexFFT(std::complex *buf); void InverseComplexFFT(std::complex *buf); void RealFFT(std::complex *buf); void InverseRealFFT(std::complex *buf); FFT_TYPE GetInverseComplexFFTScale(); FFT_TYPE GetInverseRealFFTScale(); }; //------------------------------------------------------------------------------ // Compute Utbl, the cosine table for ffts // of size (pow(2,M)/4 +1) // INPUTS // M = log2 of fft size // OUTPUTS // *Utbl = cosine table //------------------------------------------------------------------------------ template void g_fft::fftCosInit(int M, FFT_TYPE *Utbl) { unsigned int fftN = POW2(M); unsigned int i1; Utbl[0] = FFT_TYPE(1.0); for (i1 = 1; i1 < fftN/4; i1++) Utbl[i1] = (FFT_TYPE)cos((2.0 * FFT_PI * (double)i1) / (double)fftN); Utbl[fftN/4] = FFT_TYPE(0.0); } //------------------------------------------------------------------------------ // Compute BRLow, the bit reversed table for ffts // of size pow(2,M/2 -1) // INPUTS // M = log2 of fft size // OUTPUTS // *BRLow = bit reversed counter table //------------------------------------------------------------------------------ template void g_fft::fftBRInit(int M, short *BRLow) { int Mroot_1 = M / 2 - 1; int Nroot_1 = POW2(Mroot_1); int i1; int bitsum; int bitmask; int bit; for (i1 = 0; i1 < Nroot_1; i1++) { bitsum = 0; bitmask = 1; for (bit = 1; bit <= Mroot_1; bitmask <<= 1, bit++) if (i1 & bitmask) bitsum = bitsum + (Nroot_1 >> bit); BRLow[i1] = bitsum; } } //------------------------------------------------------------------------------ // parts of ffts1 // bit reverse and first radix 2 stage of forward or inverse fft //------------------------------------------------------------------------------ template void g_fft::bitrevR2(FFT_TYPE *ioptr, int M, short *BRLow) { FFT_TYPE f0r; FFT_TYPE f0i; FFT_TYPE f1r; FFT_TYPE f1i; FFT_TYPE f2r; FFT_TYPE f2i; FFT_TYPE f3r; FFT_TYPE f3i; FFT_TYPE f4r; FFT_TYPE f4i; FFT_TYPE f5r; FFT_TYPE f5i; FFT_TYPE f6r; FFT_TYPE f6i; FFT_TYPE f7r; FFT_TYPE f7i; FFT_TYPE t0r; FFT_TYPE t0i; FFT_TYPE t1r; FFT_TYPE t1i; FFT_TYPE *p0r; FFT_TYPE *p1r; FFT_TYPE *IOP; FFT_TYPE *iolimit; int Colstart; int iCol; unsigned int posA; unsigned int posAi; unsigned int posB; unsigned int posBi; const unsigned int Nrems2 = POW2((M + 3) / 2); const unsigned int Nroot_1_ColInc = POW2(M) - Nrems2; const unsigned int Nroot_1 = POW2(M / 2 - 1) - 1; const unsigned int ColstartShift = (M + 1) / 2 + 1; posA = POW2(M); // 1/2 of POW2(M) complex posAi = posA + 1; posB = posA + 2; posBi = posB + 1; iolimit = ioptr + Nrems2; for (; ioptr < iolimit; ioptr += POW2(M / 2 + 1)) { for (Colstart = Nroot_1; Colstart >= 0; Colstart--) { iCol = Nroot_1; p0r = ioptr + Nroot_1_ColInc + BRLow[Colstart] * 4; IOP = ioptr + (Colstart << ColstartShift); p1r = IOP + BRLow[iCol] * 4; f0r = *(p0r); f0i = *(p0r + 1); f1r = *(p0r + posA); f1i = *(p0r + posAi); for (; iCol > Colstart;) { f2r = *(p0r + 2); f2i = *(p0r + (2 + 1)); f3r = *(p0r + posB); f3i = *(p0r + posBi); f4r = *(p1r); f4i = *(p1r + 1); f5r = *(p1r + posA); f5i = *(p1r + posAi); f6r = *(p1r + 2); f6i = *(p1r + (2 + 1)); f7r = *(p1r + posB); f7i = *(p1r + posBi); t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r + f3r; t1i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; f0r = f4r + f5r; f0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; f2r = f6r + f7r; f2i = f6i + f7i; f7r = f6r - f7r; f7i = f6i - f7i; *(p1r) = t0r; *(p1r + 1) = t0i; *(p1r + 2) = f1r; *(p1r + (2 + 1)) = f1i; *(p1r + posA) = t1r; *(p1r + posAi) = t1i; *(p1r + posB) = f3r; *(p1r + posBi) = f3i; *(p0r) = f0r; *(p0r + 1) = f0i; *(p0r + 2) = f5r; *(p0r + (2 + 1)) = f5i; *(p0r + posA) = f2r; *(p0r + posAi) = f2i; *(p0r + posB) = f7r; *(p0r + posBi) = f7i; p0r -= Nrems2; f0r = *(p0r); f0i = *(p0r + 1); f1r = *(p0r + posA); f1i = *(p0r + posAi); iCol -= 1; p1r = IOP + BRLow[iCol] * 4; } f2r = *(p0r + 2); f2i = *(p0r + (2 + 1)); f3r = *(p0r + posB); f3i = *(p0r + posBi); t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r + f3r; t1i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; *(p0r) = t0r; *(p0r + 1) = t0i; *(p0r + 2) = f1r; *(p0r + (2 + 1)) = f1i; *(p0r + posA) = t1r; *(p0r + posAi) = t1i; *(p0r + posB) = f3r; *(p0r + posBi) = f3i; } } } //------------------------------------------------------------------------------ // RADIX 2 fft //------------------------------------------------------------------------------ template void g_fft::fft2pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i, f1r, f1i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[2]; f1i = ioptr[3]; // Butterflys // f0 - - - t0 // f1 - 1 - f1 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; // store result ioptr[0] = t0r; ioptr[1] = t0i; ioptr[2] = f1r; ioptr[3] = f1i; } //------------------------------------------------------------------------------ // RADIX 4 fft //------------------------------------------------------------------------------ template void g_fft::fft4pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE t0r, t0i, t1r, t1i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[4]; f1i = ioptr[5]; f2r = ioptr[2]; f2i = ioptr[3]; f3r = ioptr[6]; f3i = ioptr[7]; // Butterflys // f0 - - t0 - - f0 // f1 - 1 - f1 - - f1 // f2 - - f2 - 1 - f2 // f3 - 1 - t1 - -i - f3 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r - t1i; f3i = f1i + t1r; f1r = f1r + t1i; f1i = f1i - t1r; // store result ioptr[0] = f0r; ioptr[1] = f0i; ioptr[2] = f1r; ioptr[3] = f1i; ioptr[4] = f2r; ioptr[5] = f2i; ioptr[6] = f3r; ioptr[7] = f3i; } //------------------------------------------------------------------------------ // RADIX 8 fft //------------------------------------------------------------------------------ template void g_fft::fft8pt(FFT_TYPE *ioptr) { FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[8]; f1i = ioptr[9]; f2r = ioptr[4]; f2i = ioptr[5]; f3r = ioptr[12]; f3i = ioptr[13]; f4r = ioptr[2]; f4i = ioptr[3]; f5r = ioptr[10]; f5i = ioptr[11]; f6r = ioptr[6]; f6i = ioptr[7]; f7r = ioptr[14]; f7i = ioptr[15]; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - 1 - f1 - - f1 - - f1 // f2 - - f2 - 1 - f2 - - f2 // f3 - 1 - t1 - -i - f3 - - f3 // f4 - - t0 - - f4 - 1 - t0 // f5 - 1 - f5 - - f5 - w3 - f4 // f6 - - f6 - 1 - f6 - -i - t1 // f7 - 1 - t1 - -i - f7 - iw3- f6 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r - t1i; f3i = f1i + t1r; f1r = f1r + t1i; f1i = f1i - t1r; t0r = f4r + f5r; t0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; t1r = f6r - f7r; t1i = f6i - f7i; f6r = f6r + f7r; f6i = f6i + f7i; f4r = t0r + f6r; f4i = t0i + f6i; f6r = t0r - f6r; f6i = t0i - f6i; f7r = f5r - t1i; f7i = f5i + t1r; f5r = f5r + t1i; f5i = f5i - t1r; t0r = f0r - f4r; t0i = f0i - f4i; f0r = f0r + f4r; f0i = f0i + f4i; t1r = f2r - f6i; t1i = f2i + f6r; f2r = f2r + f6i; f2i = f2i - f6r; f4r = f1r - f5r * w0r - f5i * w0r; f4i = f1i + f5r * w0r - f5i * w0r; f1r = f1r * Two - f4r; f1i = f1i * Two - f4i; f6r = f3r + f7r * w0r - f7i * w0r; f6i = f3i + f7r * w0r + f7i * w0r; f3r = f3r * Two - f6r; f3i = f3i * Two - f6i; // store result ioptr[0] = f0r; ioptr[1] = f0i; ioptr[2] = f1r; ioptr[3] = f1i; ioptr[4] = f2r; ioptr[5] = f2i; ioptr[6] = f3r; ioptr[7] = f3i; ioptr[8] = t0r; ioptr[9] = t0i; ioptr[10] = f4r; ioptr[11] = f4i; ioptr[12] = t1r; ioptr[13] = t1i; ioptr[14] = f6r; ioptr[15] = f6i; } //------------------------------------------------------------------------------ // 2nd radix 2 stage //------------------------------------------------------------------------------ template void g_fft::bfR2(FFT_TYPE *ioptr, int M, int NDiffU) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int NSameU; unsigned int SameUCnt; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 4; pos = 2; posi = pos + 1; NSameU = POW2(M) / 4 / NDiffU; // 4 Us at a time pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - f4 // f1 - 1 - f5 // f2 - - f6 // f3 - 1 - f7 // Butterflys // f0 - - f4 // f1 - 1 - f5 // f2 - - f6 // f3 - 1 - f7 for (SameUCnt = NSameU; SameUCnt > 0; SameUCnt--) { f0r = *p0r; f1r = *p1r; f0i = *(p0r + 1); f1i = *(p1r + 1); f2r = *p2r; f3r = *p3r; f2i = *(p2r + 1); f3i = *(p3r + 1); f4r = f0r + f1r; f4i = f0i + f1i; f5r = f0r - f1r; f5i = f0i - f1i; f6r = f2r + f3r; f6i = f2i + f3i; f7r = f2r - f3r; f7i = f2i - f3i; *p0r = f4r; *(p0r + 1) = f4i; *p1r = f5r; *(p1r + 1) = f5i; *p2r = f6r; *(p2r + 1) = f6i; *p3r = f7r; *(p3r + 1) = f7i; f0r = *(p0r + pos); f1i = *(p1r + posi); f0i = *(p0r + posi); f1r = *(p1r + pos); f2r = *(p2r + pos); f3i = *(p3r + posi); f2i = *(p2r + posi); f3r = *(p3r + pos); f4r = f0r + f1i; f4i = f0i - f1r; f5r = f0r - f1i; f5i = f0i + f1r; f6r = f2r + f3i; f6i = f2i - f3r; f7r = f2r - f3i; f7i = f2i + f3r; *(p0r + pos) = f4r; *(p0r + posi) = f4i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; *(p2r + pos) = f6r; *(p2r + posi) = f6i; *(p3r + pos) = f7r; *(p3r + posi) = f7i; p0r += pnext; p1r += pnext; p2r += pnext; p3r += pnext; } } //------------------------------------------------------------------------------ // 1 radix 4 stage //------------------------------------------------------------------------------ template void g_fft::bfR4(FFT_TYPE *ioptr, int M, int NDiffU) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int pnexti; unsigned int NSameU; unsigned int SameUCnt; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE w1r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t1r, t1i; const FFT_TYPE Two = 2.0; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 4; pnexti = pnext + 1; pos = 2; posi = pos + 1; NSameU = POW2(M) / 4 / NDiffU; // 4 pts per butterfly pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - f0 - - f4 // f1 - 1 - f5 - - f5 // f2 - - f6 - 1 - f6 // f3 - 1 - f3 - -i - f7 // Butterflys // f0 - - f4 - - f4 // f1 - -i - t1 - - f5 // f2 - - f2 - w1 - f6 // f3 - -i - f7 - iw1- f7 f0r = *p0r; f1r = *p1r; f2r = *p2r; f3r = *p3r; f0i = *(p0r + 1); f1i = *(p1r + 1); f2i = *(p2r + 1); f3i = *(p3r + 1); f5r = f0r - f1r; f5i = f0i - f1i; f0r = f0r + f1r; f0i = f0i + f1i; f6r = f2r + f3r; f6i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; for (SameUCnt = NSameU - 1; SameUCnt > 0; SameUCnt--) { f7r = f5r - f3i; f7i = f5i + f3r; f5r = f5r + f3i; f5i = f5i - f3r; f4r = f0r + f6r; f4i = f0i + f6i; f6r = f0r - f6r; f6i = f0i - f6i; f2r = *(p2r + pos); f2i = *(p2r + posi); f1r = *(p1r + pos); f1i = *(p1r + posi); f3i = *(p3r + posi); f0r = *(p0r + pos); f3r = *(p3r + pos); f0i = *(p0r + posi); *p3r = f7r; *p0r = f4r; *(p3r + 1) = f7i; *(p0r + 1) = f4i; *p1r = f5r; *p2r = f6r; *(p1r + 1) = f5i; *(p2r + 1) = f6i; f7r = f2r - f3i; f7i = f2i + f3r; f2r = f2r + f3i; f2i = f2i - f3r; f4r = f0r + f1i; f4i = f0i - f1r; t1r = f0r - f1i; t1i = f0i + f1r; f5r = t1r - f7r * w1r + f7i * w1r; f5i = t1i - f7r * w1r - f7i * w1r; f7r = t1r * Two - f5r; f7i = t1i * Two - f5i; f6r = f4r - f2r * w1r - f2i * w1r; f6i = f4i + f2r * w1r - f2i * w1r; f4r = f4r * Two - f6r; f4i = f4i * Two - f6i; f3r = *(p3r + pnext); f0r = *(p0r + pnext); f3i = *(p3r + pnexti); f0i = *(p0r + pnexti); f2r = *(p2r + pnext); f2i = *(p2r + pnexti); f1r = *(p1r + pnext); f1i = *(p1r + pnexti); *(p2r + pos) = f6r; *(p1r + pos) = f5r; *(p2r + posi) = f6i; *(p1r + posi) = f5i; *(p3r + pos) = f7r; *(p0r + pos) = f4r; *(p3r + posi) = f7i; *(p0r + posi) = f4i; f6r = f2r + f3r; f6i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; f5r = f0r - f1r; f5i = f0i - f1i; f0r = f0r + f1r; f0i = f0i + f1i; p3r += pnext; p0r += pnext; p1r += pnext; p2r += pnext; } f7r = f5r - f3i; f7i = f5i + f3r; f5r = f5r + f3i; f5i = f5i - f3r; f4r = f0r + f6r; f4i = f0i + f6i; f6r = f0r - f6r; f6i = f0i - f6i; f2r = *(p2r + pos); f2i = *(p2r + posi); f1r = *(p1r + pos); f1i = *(p1r + posi); f3i = *(p3r + posi); f0r = *(p0r + pos); f3r = *(p3r + pos); f0i = *(p0r + posi); *p3r = f7r; *p0r = f4r; *(p3r + 1) = f7i; *(p0r + 1) = f4i; *p1r = f5r; *p2r = f6r; *(p1r + 1) = f5i; *(p2r + 1) = f6i; f7r = f2r - f3i; f7i = f2i + f3r; f2r = f2r + f3i; f2i = f2i - f3r; f4r = f0r + f1i; f4i = f0i - f1r; t1r = f0r - f1i; t1i = f0i + f1r; f5r = t1r - f7r * w1r + f7i * w1r; f5i = t1i - f7r * w1r - f7i * w1r; f7r = t1r * Two - f5r; f7i = t1i * Two - f5i; f6r = f4r - f2r * w1r - f2i * w1r; f6i = f4i + f2r * w1r - f2i * w1r; f4r = f4r * Two - f6r; f4i = f4i * Two - f6i; *(p2r + pos) = f6r; *(p1r + pos) = f5r; *(p2r + posi) = f6i; *(p1r + posi) = f5i; *(p3r + pos) = f7r; *(p0r + pos) = f4r; *(p3r + posi) = f7i; *(p0r + posi) = f4i; } //------------------------------------------------------------------------------ // RADIX 8 Stages //------------------------------------------------------------------------------ template void g_fft::bfstages(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int NSameU; int Uinc; int Uinc2; int Uinc4; unsigned int DiffUCnt; unsigned int SameUCnt; unsigned int U2toU3; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE *u0r, *u0i, *u1r, *u1i, *u2r, *u2i; FFT_TYPE w0r, w0i, w1r, w1i, w2r, w2i, w3r, w3i; FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = FFT_TYPE(2.0); pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 8; pos = pinc * 4; posi = pos + 1; NSameU = POW2(M) / 8 / NDiffU; // 8 pts per butterfly Uinc = (int) NSameU * Ustride; Uinc2 = Uinc * 2; Uinc4 = Uinc * 4; U2toU3 = (POW2(M) / 8) * Ustride; for (; StageCnt > 0; StageCnt--) { u0r = &Utbl[0]; u0i = &Utbl[POW2(M - 2) * Ustride]; u1r = u0r; u1i = u0i; u2r = u0r; u2i = u0i; w0r = *u0r; w0i = *u0i; w1r = *u1r; w1i = *u1i; w2r = *u2r; w2i = *u2i; w3r = *(u2r + U2toU3); w3i = *(u2i - U2toU3); pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - w0- f1 - - f1 - - f1 // f2 - - f2 - w1- f2 - - f4 // f3 - w0- t1 - iw1- f3 - - f5 // // f4 - - t0 - - f4 - w2- t0 // f5 - w0- f5 - - f5 - w3- t1 // f6 - - f6 - w1- f6 - iw2- f6 // f7 - w0- t1 - iw1- f7 - iw3- f7 for (DiffUCnt = NDiffU; DiffUCnt > 0; DiffUCnt--) { f0r = *p0r; f0i = *(p0r + 1); f1r = *p1r; f1i = *(p1r + 1); for (SameUCnt = NSameU - 1; SameUCnt > 0; SameUCnt--) { f2r = *p2r; f2i = *(p2r + 1); f3r = *p3r; f3i = *(p3r + 1); t0r = f0r + f1r * w0r + f1i * w0i; t0i = f0i - f1r * w0i + f1i * w0r; f1r = f0r * Two - t0r; f1i = f0i * Two - t0i; f4r = *(p0r + pos); f4i = *(p0r + posi); f5r = *(p1r + pos); f5i = *(p1r + posi); f6r = *(p2r + pos); f6i = *(p2r + posi); f7r = *(p3r + pos); f7i = *(p3r + posi); t1r = f2r - f3r * w0r - f3i * w0i; t1i = f2i + f3r * w0i - f3i * w0r; f2r = f2r * Two - t1r; f2i = f2i * Two - t1i; f0r = t0r + f2r * w1r + f2i * w1i; f0i = t0i - f2r * w1i + f2i * w1r; f2r = t0r * Two - f0r; f2i = t0i * Two - f0i; f3r = f1r + t1r * w1i - t1i * w1r; f3i = f1i + t1r * w1r + t1i * w1i; f1r = f1r * Two - f3r; f1i = f1i * Two - f3i; t0r = f4r + f5r * w0r + f5i * w0i; t0i = f4i - f5r * w0i + f5i * w0r; f5r = f4r * Two - t0r; f5i = f4i * Two - t0i; t1r = f6r - f7r * w0r - f7i * w0i; t1i = f6i + f7r * w0i - f7i * w0r; f6r = f6r * Two - t1r; f6i = f6i * Two - t1i; f4r = t0r + f6r * w1r + f6i * w1i; f4i = t0i - f6r * w1i + f6i * w1r; f6r = t0r * Two - f4r; f6i = t0i * Two - f4i; f7r = f5r + t1r * w1i - t1i * w1r; f7i = f5i + t1r * w1r + t1i * w1i; f5r = f5r * Two - f7r; f5i = f5i * Two - f7i; t0r = f0r - f4r * w2r - f4i * w2i; t0i = f0i + f4r * w2i - f4i * w2r; f0r = f0r * Two - t0r; f0i = f0i * Two - t0i; t1r = f1r - f5r * w3r - f5i * w3i; t1i = f1i + f5r * w3i - f5i * w3r; f1r = f1r * Two - t1r; f1i = f1i * Two - t1i; *(p0r + pos) = t0r; *(p1r + pos) = t1r; *(p0r + posi) = t0i; *(p1r + posi) = t1i; *p0r = f0r; *p1r = f1r; *(p0r + 1) = f0i; *(p1r + 1) = f1i; p0r += pnext; f0r = *p0r; f0i = *(p0r + 1); p1r += pnext; f1r = *p1r; f1i = *(p1r + 1); f4r = f2r - f6r * w2i + f6i * w2r; f4i = f2i - f6r * w2r - f6i * w2i; f6r = f2r * Two - f4r; f6i = f2i * Two - f4i; f5r = f3r - f7r * w3i + f7i * w3r; f5i = f3i - f7r * w3r - f7i * w3i; f7r = f3r * Two - f5r; f7i = f3i * Two - f5i; *p2r = f4r; *p3r = f5r; *(p2r + 1) = f4i; *(p3r + 1) = f5i; *(p2r + pos) = f6r; *(p3r + pos) = f7r; *(p2r + posi) = f6i; *(p3r + posi) = f7i; p2r += pnext; p3r += pnext; } f2r = *p2r; f2i = *(p2r + 1); f3r = *p3r; f3i = *(p3r + 1); t0r = f0r + f1r * w0r + f1i * w0i; t0i = f0i - f1r * w0i + f1i * w0r; f1r = f0r * Two - t0r; f1i = f0i * Two - t0i; f4r = *(p0r + pos); f4i = *(p0r + posi); f5r = *(p1r + pos); f5i = *(p1r + posi); f6r = *(p2r + pos); f6i = *(p2r + posi); f7r = *(p3r + pos); f7i = *(p3r + posi); t1r = f2r - f3r * w0r - f3i * w0i; t1i = f2i + f3r * w0i - f3i * w0r; f2r = f2r * Two - t1r; f2i = f2i * Two - t1i; f0r = t0r + f2r * w1r + f2i * w1i; f0i = t0i - f2r * w1i + f2i * w1r; f2r = t0r * Two - f0r; f2i = t0i * Two - f0i; f3r = f1r + t1r * w1i - t1i * w1r; f3i = f1i + t1r * w1r + t1i * w1i; f1r = f1r * Two - f3r; f1i = f1i * Two - f3i; if ((int) DiffUCnt == NDiffU / 2) Uinc4 = -Uinc4; u0r += Uinc4; u0i -= Uinc4; u1r += Uinc2; u1i -= Uinc2; u2r += Uinc; u2i -= Uinc; pstrt += 2; t0r = f4r + f5r * w0r + f5i * w0i; t0i = f4i - f5r * w0i + f5i * w0r; f5r = f4r * Two - t0r; f5i = f4i * Two - t0i; t1r = f6r - f7r * w0r - f7i * w0i; t1i = f6i + f7r * w0i - f7i * w0r; f6r = f6r * Two - t1r; f6i = f6i * Two - t1i; f4r = t0r + f6r * w1r + f6i * w1i; f4i = t0i - f6r * w1i + f6i * w1r; f6r = t0r * Two - f4r; f6i = t0i * Two - f4i; f7r = f5r + t1r * w1i - t1i * w1r; f7i = f5i + t1r * w1r + t1i * w1i; f5r = f5r * Two - f7r; f5i = f5i * Two - f7i; w0r = *u0r; w0i = *u0i; w1r = *u1r; w1i = *u1i; if ((int) DiffUCnt <= NDiffU / 2) w0r = -w0r; t0r = f0r - f4r * w2r - f4i * w2i; t0i = f0i + f4r * w2i - f4i * w2r; f0r = f0r * Two - t0r; f0i = f0i * Two - t0i; f4r = f2r - f6r * w2i + f6i * w2r; f4i = f2i - f6r * w2r - f6i * w2i; f6r = f2r * Two - f4r; f6i = f2i * Two - f4i; *(p0r + pos) = t0r; *p2r = f4r; *(p0r + posi) = t0i; *(p2r + 1) = f4i; w2r = *u2r; w2i = *u2i; *p0r = f0r; *(p2r + pos) = f6r; *(p0r + 1) = f0i; *(p2r + posi) = f6i; p0r = pstrt; p2r = pstrt + pinc + pinc; t1r = f1r - f5r * w3r - f5i * w3i; t1i = f1i + f5r * w3i - f5i * w3r; f1r = f1r * Two - t1r; f1i = f1i * Two - t1i; f5r = f3r - f7r * w3i + f7i * w3r; f5i = f3i - f7r * w3r - f7i * w3i; f7r = f3r * Two - f5r; f7i = f3i * Two - f5i; *(p1r + pos) = t1r; *p3r = f5r; *(p1r + posi) = t1i; *(p3r + 1) = f5i; w3r = *(u2r + U2toU3); w3i = *(u2i - U2toU3); *p1r = f1r; *(p3r + pos) = f7r; *(p1r + 1) = f1i; *(p3r + posi) = f7i; p1r = pstrt + pinc; p3r = p2r + pinc; } NSameU /= 8; Uinc /= 8; Uinc2 /= 8; Uinc4 = Uinc * 4; NDiffU *= 8; pinc *= 8; pnext *= 8; pos *= 8; posi = pos + 1; } } template void g_fft::fftrecurs(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt) { // recursive bfstages calls to maximize on chip cache efficiency int i1; if (M <= (int) MCACHE) // fits on chip ? bfstages(ioptr, M, Utbl, Ustride, NDiffU, StageCnt); // RADIX 8 Stages else { for (i1 = 0; i1 < 8; i1++) { fftrecurs(&ioptr[i1 * POW2(M - 3) * 2], M - 3, Utbl, 8 * Ustride, NDiffU, StageCnt - 1); // RADIX 8 Stages } bfstages(ioptr, M, Utbl, Ustride, POW2(M - 3), 1); // RADIX 8 Stage } } //------------------------------------------------------------------------------ // Compute in-place complex fft on the rows of the input array // INPUTS // *ioptr = input data array // M = log2 of fft size (ex M=10 for 1024 point fft) // *Utbl = cosine table // *BRLow = bit reversed counter table // OUTPUTS // *ioptr = output data array //------------------------------------------------------------------------------ template void g_fft::ffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow) { int StageCnt; int NDiffU; switch (M) { case 0: break; case 1: fft2pt(ioptr); // a 2 pt fft break; case 2: fft4pt(ioptr); // a 4 pt fft break; case 3: fft8pt(ioptr); // an 8 pt fft break; default: bitrevR2(ioptr, M, BRLow); // bit reverse and first radix 2 stage StageCnt = (M - 1) / 3; // number of radix 8 stages NDiffU = 2; // one radix 2 stage already complete if ((M - 1 - (StageCnt * 3)) == 1) { bfR2(ioptr, M, NDiffU); // 1 radix 2 stage NDiffU *= 2; } if ((M - 1 - (StageCnt * 3)) == 2) { bfR4(ioptr, M, NDiffU); // 1 radix 4 stage NDiffU *= 4; } if (M <= (int) MCACHE) bfstages(ioptr, M, Utbl, 1, NDiffU, StageCnt); // RADIX 8 Stages else fftrecurs(ioptr, M, Utbl, 1, NDiffU, StageCnt); // RADIX 8 Stages } } //------------------------------------------------------------------------------ // parts of iffts1 // scaled bit reverse and first radix 2 stage forward or inverse fft //------------------------------------------------------------------------------ template void g_fft::scbitrevR2(FFT_TYPE *ioptr, int M, short *BRLow, FFT_TYPE scale) { FFT_TYPE f0r; FFT_TYPE f0i; FFT_TYPE f1r; FFT_TYPE f1i; FFT_TYPE f2r; FFT_TYPE f2i; FFT_TYPE f3r; FFT_TYPE f3i; FFT_TYPE f4r; FFT_TYPE f4i; FFT_TYPE f5r; FFT_TYPE f5i; FFT_TYPE f6r; FFT_TYPE f6i; FFT_TYPE f7r; FFT_TYPE f7i; FFT_TYPE t0r; FFT_TYPE t0i; FFT_TYPE t1r; FFT_TYPE t1i; FFT_TYPE *p0r; FFT_TYPE *p1r; FFT_TYPE *IOP; FFT_TYPE *iolimit; int Colstart; int iCol; unsigned int posA; unsigned int posAi; unsigned int posB; unsigned int posBi; const unsigned int Nrems2 = POW2((M + 3) / 2); const unsigned int Nroot_1_ColInc = POW2(M) - Nrems2; const unsigned int Nroot_1 = POW2(M / 2 - 1) - 1; const unsigned int ColstartShift = (M + 1) / 2 + 1; posA = POW2(M); // 1/2 of POW2(M) complexes posAi = posA + 1; posB = posA + 2; posBi = posB + 1; iolimit = ioptr + Nrems2; for (; ioptr < iolimit; ioptr += POW2(M / 2 + 1)) { for (Colstart = Nroot_1; Colstart >= 0; Colstart--) { iCol = Nroot_1; p0r = ioptr + Nroot_1_ColInc + BRLow[Colstart] * 4; IOP = ioptr + (Colstart << ColstartShift); p1r = IOP + BRLow[iCol] * 4; f0r = *(p0r); f0i = *(p0r + 1); f1r = *(p0r + posA); f1i = *(p0r + posAi); for (; iCol > Colstart;) { f2r = *(p0r + 2); f2i = *(p0r + (2 + 1)); f3r = *(p0r + posB); f3i = *(p0r + posBi); f4r = *(p1r); f4i = *(p1r + 1); f5r = *(p1r + posA); f5i = *(p1r + posAi); f6r = *(p1r + 2); f6i = *(p1r + (2 + 1)); f7r = *(p1r + posB); f7i = *(p1r + posBi); t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r + f3r; t1i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; f0r = f4r + f5r; f0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; f2r = f6r + f7r; f2i = f6i + f7i; f7r = f6r - f7r; f7i = f6i - f7i; *(p1r) = scale * t0r; *(p1r + 1) = scale * t0i; *(p1r + 2) = scale * f1r; *(p1r + (2 + 1)) = scale * f1i; *(p1r + posA) = scale * t1r; *(p1r + posAi) = scale * t1i; *(p1r + posB) = scale * f3r; *(p1r + posBi) = scale * f3i; *(p0r) = scale * f0r; *(p0r + 1) = scale * f0i; *(p0r + 2) = scale * f5r; *(p0r + (2 + 1)) = scale * f5i; *(p0r + posA) = scale * f2r; *(p0r + posAi) = scale * f2i; *(p0r + posB) = scale * f7r; *(p0r + posBi) = scale * f7i; p0r -= Nrems2; f0r = *(p0r); f0i = *(p0r + 1); f1r = *(p0r + posA); f1i = *(p0r + posAi); iCol -= 1; p1r = IOP + BRLow[iCol] * 4; } f2r = *(p0r + 2); f2i = *(p0r + (2 + 1)); f3r = *(p0r + posB); f3i = *(p0r + posBi); t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r + f3r; t1i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; *(p0r) = scale * t0r; *(p0r + 1) = scale * t0i; *(p0r + 2) = scale * f1r; *(p0r + (2 + 1)) = scale * f1i; *(p0r + posA) = scale * t1r; *(p0r + posAi) = scale * t1i; *(p0r + posB) = scale * f3r; *(p0r + posBi) = scale * f3i; } } } //------------------------------------------------------------------------------ // RADIX 2 ifft //------------------------------------------------------------------------------ template void g_fft::ifft2pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i, f1r, f1i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[2]; f1i = ioptr[3]; // Butterflys // f0 - - t0 // f1 - 1 - f1 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; // store result ioptr[0] = scale * t0r; ioptr[1] = scale * t0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; } //------------------------------------------------------------------------------ // RADIX 4 ifft //------------------------------------------------------------------------------ template void g_fft::ifft4pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE t0r, t0i, t1r, t1i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[4]; f1i = ioptr[5]; f2r = ioptr[2]; f2i = ioptr[3]; f3r = ioptr[6]; f3i = ioptr[7]; // Butterflys // f0 - - t0 - - f0 // f1 - 1 - f1 - - f1 // f2 - - f2 - 1 - f2 // f3 - 1 - t1 - i - f3 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r + t1i; f3i = f1i - t1r; f1r = f1r - t1i; f1i = f1i + t1r; // store result ioptr[0] = scale * f0r; ioptr[1] = scale * f0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; } //------------------------------------------------------------------------------ // RADIX 8 ifft //------------------------------------------------------------------------------ template void g_fft::ifft8pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[8]; f1i = ioptr[9]; f2r = ioptr[4]; f2i = ioptr[5]; f3r = ioptr[12]; f3i = ioptr[13]; f4r = ioptr[2]; f4i = ioptr[3]; f5r = ioptr[10]; f5i = ioptr[11]; f6r = ioptr[6]; f6i = ioptr[7]; f7r = ioptr[14]; f7i = ioptr[15]; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - 1 - f1 - - f1 - - f1 // f2 - - f2 - 1 - f2 - - f2 // f3 - 1 - t1 - i - f3 - - f3 // f4 - - t0 - - f4 - 1 - t0 // f5 - 1 - f5 - - f5 - w3 - f4 // f6 - - f6 - 1 - f6 - i - t1 // f7 - 1 - t1 - i - f7 - iw3- f6 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r + t1i; f3i = f1i - t1r; f1r = f1r - t1i; f1i = f1i + t1r; t0r = f4r + f5r; t0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; t1r = f6r - f7r; t1i = f6i - f7i; f6r = f6r + f7r; f6i = f6i + f7i; f4r = t0r + f6r; f4i = t0i + f6i; f6r = t0r - f6r; f6i = t0i - f6i; f7r = f5r + t1i; f7i = f5i - t1r; f5r = f5r - t1i; f5i = f5i + t1r; t0r = f0r - f4r; t0i = f0i - f4i; f0r = f0r + f4r; f0i = f0i + f4i; t1r = f2r + f6i; t1i = f2i - f6r; f2r = f2r - f6i; f2i = f2i + f6r; f4r = f1r - f5r * w0r + f5i * w0r; f4i = f1i - f5r * w0r - f5i * w0r; f1r = f1r * Two - f4r; f1i = f1i * Two - f4i; f6r = f3r + f7r * w0r + f7i * w0r; f6i = f3i - f7r * w0r + f7i * w0r; f3r = f3r * Two - f6r; f3i = f3i * Two - f6i; // store result ioptr[0] = scale * f0r; ioptr[1] = scale * f0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; ioptr[8] = scale * t0r; ioptr[9] = scale * t0i; ioptr[10] = scale * f4r; ioptr[11] = scale * f4i; ioptr[12] = scale * t1r; ioptr[13] = scale * t1i; ioptr[14] = scale * f6r; ioptr[15] = scale * f6i; } //------------------------------------------------------------------------------ // 2nd radix 2 stage //------------------------------------------------------------------------------ template void g_fft::ibfR2(FFT_TYPE *ioptr, int M, int NDiffU) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int NSameU; unsigned int SameUCnt; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 4; pos = 2; posi = pos + 1; NSameU = POW2(M) / 4 / NDiffU; // 4 Us at a time pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - f4 // f1 - 1 - f5 // f2 - - f6 // f3 - 1 - f7 // Butterflys // f0 - - f4 // f1 - 1 - f5 // f2 - - f6 // f3 - 1 - f7 for (SameUCnt = NSameU; SameUCnt > 0; SameUCnt--) { f0r = *p0r; f1r = *p1r; f0i = *(p0r + 1); f1i = *(p1r + 1); f2r = *p2r; f3r = *p3r; f2i = *(p2r + 1); f3i = *(p3r + 1); f4r = f0r + f1r; f4i = f0i + f1i; f5r = f0r - f1r; f5i = f0i - f1i; f6r = f2r + f3r; f6i = f2i + f3i; f7r = f2r - f3r; f7i = f2i - f3i; *p0r = f4r; *(p0r + 1) = f4i; *p1r = f5r; *(p1r + 1) = f5i; *p2r = f6r; *(p2r + 1) = f6i; *p3r = f7r; *(p3r + 1) = f7i; f0r = *(p0r + pos); f1i = *(p1r + posi); f0i = *(p0r + posi); f1r = *(p1r + pos); f2r = *(p2r + pos); f3i = *(p3r + posi); f2i = *(p2r + posi); f3r = *(p3r + pos); f4r = f0r - f1i; f4i = f0i + f1r; f5r = f0r + f1i; f5i = f0i - f1r; f6r = f2r - f3i; f6i = f2i + f3r; f7r = f2r + f3i; f7i = f2i - f3r; *(p0r + pos) = f4r; *(p0r + posi) = f4i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; *(p2r + pos) = f6r; *(p2r + posi) = f6i; *(p3r + pos) = f7r; *(p3r + posi) = f7i; p0r += pnext; p1r += pnext; p2r += pnext; p3r += pnext; } } //------------------------------------------------------------------------------ // 1 radix 4 stage //------------------------------------------------------------------------------ template void g_fft::ibfR4(FFT_TYPE *ioptr, int M, int NDiffU) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int pnexti; unsigned int NSameU; unsigned int SameUCnt; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE w1r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t1r, t1i; const FFT_TYPE Two = 2.0; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 4; pnexti = pnext + 1; pos = 2; posi = pos + 1; NSameU = POW2(M) / 4 / NDiffU; // 4 pts per butterfly pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - f0 - - f4 // f1 - 1 - f5 - - f5 // f2 - - f6 - 1 - f6 // f3 - 1 - f3 - -i - f7 // Butterflys // f0 - - f4 - - f4 // f1 - -i - t1 - - f5 // f2 - - f2 - w1 - f6 // f3 - -i - f7 - iw1- f7 f0r = *p0r; f1r = *p1r; f2r = *p2r; f3r = *p3r; f0i = *(p0r + 1); f1i = *(p1r + 1); f2i = *(p2r + 1); f3i = *(p3r + 1); f5r = f0r - f1r; f5i = f0i - f1i; f0r = f0r + f1r; f0i = f0i + f1i; f6r = f2r + f3r; f6i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; for (SameUCnt = NSameU - 1; SameUCnt > 0; SameUCnt--) { f7r = f5r + f3i; f7i = f5i - f3r; f5r = f5r - f3i; f5i = f5i + f3r; f4r = f0r + f6r; f4i = f0i + f6i; f6r = f0r - f6r; f6i = f0i - f6i; f2r = *(p2r + pos); f2i = *(p2r + posi); f1r = *(p1r + pos); f1i = *(p1r + posi); f3i = *(p3r + posi); f0r = *(p0r + pos); f3r = *(p3r + pos); f0i = *(p0r + posi); *p3r = f7r; *p0r = f4r; *(p3r + 1) = f7i; *(p0r + 1) = f4i; *p1r = f5r; *p2r = f6r; *(p1r + 1) = f5i; *(p2r + 1) = f6i; f7r = f2r + f3i; f7i = f2i - f3r; f2r = f2r - f3i; f2i = f2i + f3r; f4r = f0r - f1i; f4i = f0i + f1r; t1r = f0r + f1i; t1i = f0i - f1r; f5r = t1r - f7r * w1r - f7i * w1r; f5i = t1i + f7r * w1r - f7i * w1r; f7r = t1r * Two - f5r; f7i = t1i * Two - f5i; f6r = f4r - f2r * w1r + f2i * w1r; f6i = f4i - f2r * w1r - f2i * w1r; f4r = f4r * Two - f6r; f4i = f4i * Two - f6i; f3r = *(p3r + pnext); f0r = *(p0r + pnext); f3i = *(p3r + pnexti); f0i = *(p0r + pnexti); f2r = *(p2r + pnext); f2i = *(p2r + pnexti); f1r = *(p1r + pnext); f1i = *(p1r + pnexti); *(p2r + pos) = f6r; *(p1r + pos) = f5r; *(p2r + posi) = f6i; *(p1r + posi) = f5i; *(p3r + pos) = f7r; *(p0r + pos) = f4r; *(p3r + posi) = f7i; *(p0r + posi) = f4i; f6r = f2r + f3r; f6i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; f5r = f0r - f1r; f5i = f0i - f1i; f0r = f0r + f1r; f0i = f0i + f1i; p3r += pnext; p0r += pnext; p1r += pnext; p2r += pnext; } f7r = f5r + f3i; f7i = f5i - f3r; f5r = f5r - f3i; f5i = f5i + f3r; f4r = f0r + f6r; f4i = f0i + f6i; f6r = f0r - f6r; f6i = f0i - f6i; f2r = *(p2r + pos); f2i = *(p2r + posi); f1r = *(p1r + pos); f1i = *(p1r + posi); f3i = *(p3r + posi); f0r = *(p0r + pos); f3r = *(p3r + pos); f0i = *(p0r + posi); *p3r = f7r; *p0r = f4r; *(p3r + 1) = f7i; *(p0r + 1) = f4i; *p1r = f5r; *p2r = f6r; *(p1r + 1) = f5i; *(p2r + 1) = f6i; f7r = f2r + f3i; f7i = f2i - f3r; f2r = f2r - f3i; f2i = f2i + f3r; f4r = f0r - f1i; f4i = f0i + f1r; t1r = f0r + f1i; t1i = f0i - f1r; f5r = t1r - f7r * w1r - f7i * w1r; f5i = t1i + f7r * w1r - f7i * w1r; f7r = t1r * Two - f5r; f7i = t1i * Two - f5i; f6r = f4r - f2r * w1r + f2i * w1r; f6i = f4i - f2r * w1r - f2i * w1r; f4r = f4r * Two - f6r; f4i = f4i * Two - f6i; *(p2r + pos) = f6r; *(p1r + pos) = f5r; *(p2r + posi) = f6i; *(p1r + posi) = f5i; *(p3r + pos) = f7r; *(p0r + pos) = f4r; *(p3r + posi) = f7i; *(p0r + posi) = f4i; } //------------------------------------------------------------------------------ // RADIX 8 Stages //------------------------------------------------------------------------------ template void g_fft::ibfstages(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int NSameU; int Uinc; int Uinc2; int Uinc4; unsigned int DiffUCnt; unsigned int SameUCnt; unsigned int U2toU3; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE *u0r, *u0i, *u1r, *u1i, *u2r, *u2i; FFT_TYPE w0r, w0i, w1r, w1i, w2r, w2i, w3r, w3i; FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 8; pos = pinc * 4; posi = pos + 1; NSameU = POW2(M) / 8 / NDiffU; // 8 pts per butterfly Uinc = (int) NSameU * Ustride; Uinc2 = Uinc * 2; Uinc4 = Uinc * 4; U2toU3 = (POW2(M) / 8) * Ustride; for (; StageCnt > 0; StageCnt--) { u0r = &Utbl[0]; u0i = &Utbl[POW2(M - 2) * Ustride]; u1r = u0r; u1i = u0i; u2r = u0r; u2i = u0i; w0r = *u0r; w0i = *u0i; w1r = *u1r; w1i = *u1i; w2r = *u2r; w2i = *u2i; w3r = *(u2r + U2toU3); w3i = *(u2i - U2toU3); pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - w0- f1 - - f1 - - f1 // f2 - - f2 - w1- f2 - - f4 // f3 - w0- t1 - iw1- f3 - - f5 // f4 - - t0 - - f4 - w2- t0 // f5 - w0- f5 - - f5 - w3- t1 // f6 - - f6 - w1- f6 - iw2- f6 // f7 - w0- t1 - iw1- f7 - iw3- f7 for (DiffUCnt = NDiffU; DiffUCnt > 0; DiffUCnt--) { f0r = *p0r; f0i = *(p0r + 1); f1r = *p1r; f1i = *(p1r + 1); for (SameUCnt = NSameU - 1; SameUCnt > 0; SameUCnt--) { f2r = *p2r; f2i = *(p2r + 1); f3r = *p3r; f3i = *(p3r + 1); t0r = f0r + f1r * w0r - f1i * w0i; t0i = f0i + f1r * w0i + f1i * w0r; f1r = f0r * Two - t0r; f1i = f0i * Two - t0i; f4r = *(p0r + pos); f4i = *(p0r + posi); f5r = *(p1r + pos); f5i = *(p1r + posi); f6r = *(p2r + pos); f6i = *(p2r + posi); f7r = *(p3r + pos); f7i = *(p3r + posi); t1r = f2r - f3r * w0r + f3i * w0i; t1i = f2i - f3r * w0i - f3i * w0r; f2r = f2r * Two - t1r; f2i = f2i * Two - t1i; f0r = t0r + f2r * w1r - f2i * w1i; f0i = t0i + f2r * w1i + f2i * w1r; f2r = t0r * Two - f0r; f2i = t0i * Two - f0i; f3r = f1r + t1r * w1i + t1i * w1r; f3i = f1i - t1r * w1r + t1i * w1i; f1r = f1r * Two - f3r; f1i = f1i * Two - f3i; t0r = f4r + f5r * w0r - f5i * w0i; t0i = f4i + f5r * w0i + f5i * w0r; f5r = f4r * Two - t0r; f5i = f4i * Two - t0i; t1r = f6r - f7r * w0r + f7i * w0i; t1i = f6i - f7r * w0i - f7i * w0r; f6r = f6r * Two - t1r; f6i = f6i * Two - t1i; f4r = t0r + f6r * w1r - f6i * w1i; f4i = t0i + f6r * w1i + f6i * w1r; f6r = t0r * Two - f4r; f6i = t0i * Two - f4i; f7r = f5r + t1r * w1i + t1i * w1r; f7i = f5i - t1r * w1r + t1i * w1i; f5r = f5r * Two - f7r; f5i = f5i * Two - f7i; t0r = f0r - f4r * w2r + f4i * w2i; t0i = f0i - f4r * w2i - f4i * w2r; f0r = f0r * Two - t0r; f0i = f0i * Two - t0i; t1r = f1r - f5r * w3r + f5i * w3i; t1i = f1i - f5r * w3i - f5i * w3r; f1r = f1r * Two - t1r; f1i = f1i * Two - t1i; *(p0r + pos) = t0r; *(p0r + posi) = t0i; *p0r = f0r; *(p0r + 1) = f0i; p0r += pnext; f0r = *p0r; f0i = *(p0r + 1); *(p1r + pos) = t1r; *(p1r + posi) = t1i; *p1r = f1r; *(p1r + 1) = f1i; p1r += pnext; f1r = *p1r; f1i = *(p1r + 1); f4r = f2r - f6r * w2i - f6i * w2r; f4i = f2i + f6r * w2r - f6i * w2i; f6r = f2r * Two - f4r; f6i = f2i * Two - f4i; f5r = f3r - f7r * w3i - f7i * w3r; f5i = f3i + f7r * w3r - f7i * w3i; f7r = f3r * Two - f5r; f7i = f3i * Two - f5i; *p2r = f4r; *(p2r + 1) = f4i; *(p2r + pos) = f6r; *(p2r + posi) = f6i; p2r += pnext; *p3r = f5r; *(p3r + 1) = f5i; *(p3r + pos) = f7r; *(p3r + posi) = f7i; p3r += pnext; } f2r = *p2r; f2i = *(p2r + 1); f3r = *p3r; f3i = *(p3r + 1); t0r = f0r + f1r * w0r - f1i * w0i; t0i = f0i + f1r * w0i + f1i * w0r; f1r = f0r * Two - t0r; f1i = f0i * Two - t0i; f4r = *(p0r + pos); f4i = *(p0r + posi); f5r = *(p1r + pos); f5i = *(p1r + posi); f6r = *(p2r + pos); f6i = *(p2r + posi); f7r = *(p3r + pos); f7i = *(p3r + posi); t1r = f2r - f3r * w0r + f3i * w0i; t1i = f2i - f3r * w0i - f3i * w0r; f2r = f2r * Two - t1r; f2i = f2i * Two - t1i; f0r = t0r + f2r * w1r - f2i * w1i; f0i = t0i + f2r * w1i + f2i * w1r; f2r = t0r * Two - f0r; f2i = t0i * Two - f0i; f3r = f1r + t1r * w1i + t1i * w1r; f3i = f1i - t1r * w1r + t1i * w1i; f1r = f1r * Two - f3r; f1i = f1i * Two - f3i; if ((int) DiffUCnt == NDiffU / 2) Uinc4 = -Uinc4; u0r += Uinc4; u0i -= Uinc4; u1r += Uinc2; u1i -= Uinc2; u2r += Uinc; u2i -= Uinc; pstrt += 2; t0r = f4r + f5r * w0r - f5i * w0i; t0i = f4i + f5r * w0i + f5i * w0r; f5r = f4r * Two - t0r; f5i = f4i * Two - t0i; t1r = f6r - f7r * w0r + f7i * w0i; t1i = f6i - f7r * w0i - f7i * w0r; f6r = f6r * Two - t1r; f6i = f6i * Two - t1i; f4r = t0r + f6r * w1r - f6i * w1i; f4i = t0i + f6r * w1i + f6i * w1r; f6r = t0r * Two - f4r; f6i = t0i * Two - f4i; f7r = f5r + t1r * w1i + t1i * w1r; f7i = f5i - t1r * w1r + t1i * w1i; f5r = f5r * Two - f7r; f5i = f5i * Two - f7i; w0r = *u0r; w0i = *u0i; w1r = *u1r; w1i = *u1i; if ((int) DiffUCnt <= NDiffU / 2) w0r = -w0r; t0r = f0r - f4r * w2r + f4i * w2i; t0i = f0i - f4r * w2i - f4i * w2r; f0r = f0r * Two - t0r; f0i = f0i * Two - t0i; f4r = f2r - f6r * w2i - f6i * w2r; f4i = f2i + f6r * w2r - f6i * w2i; f6r = f2r * Two - f4r; f6i = f2i * Two - f4i; *(p0r + pos) = t0r; *p2r = f4r; *(p0r + posi) = t0i; *(p2r + 1) = f4i; w2r = *u2r; w2i = *u2i; *p0r = f0r; *(p2r + pos) = f6r; *(p0r + 1) = f0i; *(p2r + posi) = f6i; p0r = pstrt; p2r = pstrt + pinc + pinc; t1r = f1r - f5r * w3r + f5i * w3i; t1i = f1i - f5r * w3i - f5i * w3r; f1r = f1r * Two - t1r; f1i = f1i * Two - t1i; f5r = f3r - f7r * w3i - f7i * w3r; f5i = f3i + f7r * w3r - f7i * w3i; f7r = f3r * Two - f5r; f7i = f3i * Two - f5i; *(p1r + pos) = t1r; *p3r = f5r; *(p1r + posi) = t1i; *(p3r + 1) = f5i; w3r = *(u2r + U2toU3); w3i = *(u2i - U2toU3); *p1r = f1r; *(p3r + pos) = f7r; *(p1r + 1) = f1i; *(p3r + posi) = f7i; p1r = pstrt + pinc; p3r = p2r + pinc; } NSameU /= 8; Uinc /= 8; Uinc2 /= 8; Uinc4 = Uinc * 4; NDiffU *= 8; pinc *= 8; pnext *= 8; pos *= 8; posi = pos + 1; } } //------------------------------------------------------------------------------ // recursive bfstages calls to maximize on chip cache efficiency //------------------------------------------------------------------------------ template void g_fft::ifftrecurs(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt) { int i1; if (M <= (int) MCACHE) ibfstages(ioptr, M, Utbl, Ustride, NDiffU, StageCnt); // RADIX 8 Stages else { for (i1 = 0; i1 < 8; i1++) { ifftrecurs(&ioptr[i1 * POW2(M - 3) * 2], M - 3, Utbl, 8 * Ustride, NDiffU, StageCnt - 1); // RADIX 8 Stages } ibfstages(ioptr, M, Utbl, Ustride, POW2(M - 3), 1); // RADIX 8 Stage } } //------------------------------------------------------------------------------ // Compute in-place inverse complex fft on the rows of the input array // INPUTS // *ioptr = input data array // M = log2 of fft size // *Utbl = cosine table // *BRLow = bit reversed counter table // OUTPUTS // *ioptr = output data array //------------------------------------------------------------------------------ template void g_fft::iffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow) { int StageCnt; int NDiffU; const FFT_TYPE scale = 1.0 / POW2(M); switch (M) { case 0: break; case 1: ifft2pt(ioptr, scale); // a 2 pt fft break; case 2: ifft4pt(ioptr, scale); // a 4 pt fft break; case 3: ifft8pt(ioptr, scale); // an 8 pt fft break; default: // bit reverse and first radix 2 stage scbitrevR2(ioptr, M, BRLow, scale); StageCnt = (M - 1) / 3; // number of radix 8 stages NDiffU = 2; // one radix 2 stage already complete if ((M - 1 - (StageCnt * 3)) == 1) { ibfR2(ioptr, M, NDiffU); // 1 radix 2 stage NDiffU *= 2; } if ((M - 1 - (StageCnt * 3)) == 2) { ibfR4(ioptr, M, NDiffU); // 1 radix 4 stage NDiffU *= 4; } if (M <= (int) MCACHE) ibfstages(ioptr, M, Utbl, 1, NDiffU, StageCnt); // RADIX 8 Stages else ifftrecurs(ioptr, M, Utbl, 1, NDiffU, StageCnt); // RADIX 8 Stages } } //------------------------------------------------------------------------------ // parts of rffts1 // RADIX 2 rfft //------------------------------------------------------------------------------ template void g_fft::rfft1pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; // finish rfft t0r = f0r + f0i; t0i = f0r - f0i; // store result ioptr[0] = t0r; ioptr[1] = t0i; } //------------------------------------------------------------------------------ // RADIX 4 rfft //------------------------------------------------------------------------------ template void g_fft::rfft2pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i, f1r, f1i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[2]; f1i = ioptr[3]; // Butterflys // f0 - - t0 // f1 - 1 - f1 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f1i - f0i; // finish rfft f0r = t0r + t0i; f0i = t0r - t0i; // store result ioptr[0] = f0r; ioptr[1] = f0i; ioptr[2] = f1r; ioptr[3] = f1i; } //------------------------------------------------------------------------------ // RADIX 8 rfft //------------------------------------------------------------------------------ template void g_fft::rfft4pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE t0r, t0i, t1r, t1i; FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) const FFT_TYPE Two = 2.0; const FFT_TYPE scale = 0.5; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[4]; f1i = ioptr[5]; f2r = ioptr[2]; f2i = ioptr[3]; f3r = ioptr[6]; f3i = ioptr[7]; // Butterflys // f0 - - t0 - - f0 // f1 - 1 - f1 - - f1 // f2 - - f2 - 1 - f2 // f3 - 1 - t1 - -i - f3 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = f2i - t0i; // neg for rfft f3r = f1r - t1i; f3i = f1i + t1r; f1r = f1r + t1i; f1i = f1i - t1r; // finish rfft t0r = f0r + f0i; // compute Re(x[0]) t0i = f0r - f0i; // compute Re(x[N/2]) t1r = f1r + f3r; t1i = f1i - f3i; f0r = f1i + f3i; f0i = f3r - f1r; f1r = t1r + w0r * f0r + w0r * f0i; f1i = t1i - w0r * f0r + w0r * f0i; f3r = Two * t1r - f1r; f3i = f1i - Two * t1i; // store result ioptr[4] = f2r; ioptr[5] = f2i; ioptr[0] = t0r; ioptr[1] = t0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; } //------------------------------------------------------------------------------ // RADIX 16 rfft //------------------------------------------------------------------------------ template void g_fft::rfft8pt(FFT_TYPE *ioptr) { FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE w1r = FFT_COSPID8; // cos(pi/8) FFT_TYPE w1i = FFT_SINPID8; // sin(pi/8) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; const FFT_TYPE scale = 0.5; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[8]; f1i = ioptr[9]; f2r = ioptr[4]; f2i = ioptr[5]; f3r = ioptr[12]; f3i = ioptr[13]; f4r = ioptr[2]; f4i = ioptr[3]; f5r = ioptr[10]; f5i = ioptr[11]; f6r = ioptr[6]; f6i = ioptr[7]; f7r = ioptr[14]; f7i = ioptr[15]; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - 1 - f1 - - f1 - - f1 // f2 - - f2 - 1 - f2 - - f2 // f3 - 1 - t1 - -i - f3 - - f3 // f4 - - t0 - - f4 - 1 - t0 // f5 - 1 - f5 - - f5 - w3 - f4 // f6 - - f6 - 1 - f6 - -i - t1 // f7 - 1 - t1 - -i - f7 - iw3- f6 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r - t1i; f3i = f1i + t1r; f1r = f1r + t1i; f1i = f1i - t1r; t0r = f4r + f5r; t0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; t1r = f6r - f7r; t1i = f6i - f7i; f6r = f6r + f7r; f6i = f6i + f7i; f4r = t0r + f6r; f4i = t0i + f6i; f6r = t0r - f6r; f6i = t0i - f6i; f7r = f5r - t1i; f7i = f5i + t1r; f5r = f5r + t1i; f5i = f5i - t1r; t0r = f0r - f4r; t0i = f4i - f0i; // neg for rfft f0r = f0r + f4r; f0i = f0i + f4i; t1r = f2r - f6i; t1i = f2i + f6r; f2r = f2r + f6i; f2i = f2i - f6r; f4r = f1r - f5r * w0r - f5i * w0r; f4i = f1i + f5r * w0r - f5i * w0r; f1r = f1r * Two - f4r; f1i = f1i * Two - f4i; f6r = f3r + f7r * w0r - f7i * w0r; f6i = f3i + f7r * w0r + f7i * w0r; f3r = f3r * Two - f6r; f3i = f3i * Two - f6i; // finish rfft f5r = f0r + f0i; // compute Re(x[0]) f5i = f0r - f0i; // compute Re(x[N/2]) f0r = f2r + t1r; f0i = f2i - t1i; f7r = f2i + t1i; f7i = t1r - f2r; f2r = f0r + w0r * f7r + w0r * f7i; f2i = f0i - w0r * f7r + w0r * f7i; t1r = Two * f0r - f2r; t1i = f2i - Two * f0i; f0r = f1r + f6r; f0i = f1i - f6i; f7r = f1i + f6i; f7i = f6r - f1r; f1r = f0r + w1r * f7r + w1i * f7i; f1i = f0i - w1i * f7r + w1r * f7i; f6r = Two * f0r - f1r; f6i = f1i - Two * f0i; f0r = f3r + f4r; f0i = f3i - f4i; f7r = f3i + f4i; f7i = f4r - f3r; f3r = f0r + w1i * f7r + w1r * f7i; f3i = f0i - w1r * f7r + w1i * f7i; f4r = Two * f0r - f3r; f4i = f3i - Two * f0i; // store result ioptr[8] = t0r; ioptr[9] = t0i; ioptr[0] = f5r; ioptr[1] = f5i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[12] = scale * t1r; ioptr[13] = scale * t1i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; ioptr[10] = scale * f4r; ioptr[11] = scale * f4i; ioptr[14] = scale * f6r; ioptr[15] = scale * f6i; } //------------------------------------------------------------------------------ // Finish RFFT //------------------------------------------------------------------------------ template void g_fft::frstage(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl) { unsigned int pos; unsigned int posi; unsigned int diffUcnt; FFT_TYPE *p0r, *p1r; FFT_TYPE *u0r, *u0i; FFT_TYPE w0r, w0i; FFT_TYPE f0r, f0i, f1r, f1i, f4r, f4i, f5r, f5i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; pos = POW2(M - 1); posi = pos + 1; p0r = ioptr; p1r = ioptr + pos / 2; u0r = Utbl + POW2(M - 3); w0r = *u0r, f0r = *(p0r); f0i = *(p0r + 1); f4r = *(p0r + pos); f4i = *(p0r + posi); f1r = *(p1r); f1i = *(p1r + 1); f5r = *(p1r + pos); f5i = *(p1r + posi); t0r = Two * f0r + Two * f0i; // compute Re(x[0]) t0i = Two * f0r - Two * f0i; // compute Re(x[N/2]) t1r = f4r + f4r; t1i = -f4i - f4i; f0r = f1r + f5r; f0i = f1i - f5i; f4r = f1i + f5i; f4i = f5r - f1r; f1r = f0r + w0r * f4r + w0r * f4i; f1i = f0i - w0r * f4r + w0r * f4i; f5r = Two * f0r - f1r; f5i = f1i - Two * f0i; *(p0r) = t0r; *(p0r + 1) = t0i; *(p0r + pos) = t1r; *(p0r + posi) = t1i; *(p1r) = f1r; *(p1r + 1) = f1i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; u0r = Utbl + 1; u0i = Utbl + (POW2(M - 2) - 1); w0r = *u0r, w0i = *u0i; p0r = (ioptr + 2); p1r = (ioptr + (POW2(M - 2) - 1) * 2); // Butterflys // f0 - t0 - - f0 // f5 - t1 - w0 - f5 // f1 - t0 - - f1 // f4 - t1 -iw0 - f4 for (diffUcnt = POW2(M - 3) - 1; diffUcnt > 0; diffUcnt--) { f0r = *(p0r); f0i = *(p0r + 1); f5r = *(p1r + pos); f5i = *(p1r + posi); f1r = *(p1r); f1i = *(p1r + 1); f4r = *(p0r + pos); f4i = *(p0r + posi); t0r = f0r + f5r; t0i = f0i - f5i; t1r = f0i + f5i; t1i = f5r - f0r; f0r = t0r + w0r * t1r + w0i * t1i; f0i = t0i - w0i * t1r + w0r * t1i; f5r = Two * t0r - f0r; f5i = f0i - Two * t0i; t0r = f1r + f4r; t0i = f1i - f4i; t1r = f1i + f4i; t1i = f4r - f1r; f1r = t0r + w0i * t1r + w0r * t1i; f1i = t0i - w0r * t1r + w0i * t1i; f4r = Two * t0r - f1r; f4i = f1i - Two * t0i; *(p0r) = f0r; *(p0r + 1) = f0i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; w0r = *++u0r; w0i = *--u0i; *(p1r) = f1r; *(p1r + 1) = f1i; *(p0r + pos) = f4r; *(p0r + posi) = f4i; p0r += 2; p1r -= 2; } } //------------------------------------------------------------------------------ // Compute in-place real fft on the rows of the input array // The result is the complex spectra of the positive frequencies // except the location for the first complex number contains the real // values for DC and Nyquest // INPUTS // *ioptr = real input data array // M = log2 of fft size // *Utbl = cosine table // *BRLow = bit reversed counter table // OUTPUTS // *ioptr = output data array in the following order // Re(x[0]), Re(x[N/2]), Re(x[1]), Im(x[1]), Re(x[2]), Im(x[2]), // ... Re(x[N/2-1]), Im(x[N/2-1]). //------------------------------------------------------------------------------ template void g_fft::rffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow) { FFT_TYPE scale; int StageCnt; int NDiffU; M = M - 1; switch (M) { case -1: break; case 0: rfft1pt(ioptr); // a 2 pt fft break; case 1: rfft2pt(ioptr); // a 4 pt fft break; case 2: rfft4pt(ioptr); // an 8 pt fft break; case 3: rfft8pt(ioptr); // a 16 pt fft break; default: scale = 0.5; // bit reverse and first radix 2 stage scbitrevR2(ioptr, M, BRLow, scale); StageCnt = (M - 1) / 3; // number of radix 8 stages NDiffU = 2; // one radix 2 stage already complete if ((M - 1 - (StageCnt * 3)) == 1) { bfR2(ioptr, M, NDiffU); // 1 radix 2 stage NDiffU *= 2; } if ((M - 1 - (StageCnt * 3)) == 2) { bfR4(ioptr, M, NDiffU); // 1 radix 4 stage NDiffU *= 4; } if (M <= (int) MCACHE) bfstages(ioptr, M, Utbl, 2, NDiffU, StageCnt); // RADIX 8 Stages else fftrecurs(ioptr, M, Utbl, 2, NDiffU, StageCnt); // RADIX 8 Stages frstage(ioptr, M + 1, Utbl); } } //------------------------------------------------------------------------------ // parts of riffts1 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // RADIX 2 rifft //------------------------------------------------------------------------------ template void g_fft::rifft1pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; // finish rfft t0r = f0r + f0i; t0i = f0r - f0i; // store result ioptr[0] = scale * t0r; ioptr[1] = scale * t0i; } //------------------------------------------------------------------------------ // RADIX 4 rifft //------------------------------------------------------------------------------ template void g_fft::rifft2pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i, f1r, f1i; FFT_TYPE t0r, t0i; const FFT_TYPE Two = FFT_TYPE(2.0); // bit reversed load t0r = ioptr[0]; t0i = ioptr[1]; f1r = Two * ioptr[2]; f1i = Two * ioptr[3]; // start rifft f0r = t0r + t0i; f0i = t0r - t0i; // Butterflys // f0 - - t0 // f1 - 1 - f1 t0r = f0r + f1r; t0i = f0i - f1i; f1r = f0r - f1r; f1i = f0i + f1i; // store result ioptr[0] = scale * t0r; ioptr[1] = scale * t0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; } //------------------------------------------------------------------------------ // RADIX 8 rifft //------------------------------------------------------------------------------ template void g_fft::rifft4pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE t0r, t0i, t1r, t1i; FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) const FFT_TYPE Two = FFT_TYPE(2.0); // bit reversed load t0r = ioptr[0]; t0i = ioptr[1]; f2r = ioptr[2]; f2i = ioptr[3]; f1r = Two * ioptr[4]; f1i = Two * ioptr[5]; f3r = ioptr[6]; f3i = ioptr[7]; // start rfft f0r = t0r + t0i; // compute Re(x[0]) f0i = t0r - t0i; // compute Re(x[N/2]) t1r = f2r + f3r; t1i = f2i - f3i; t0r = f2r - f3r; t0i = f2i + f3i; f2r = t1r - w0r * t0r - w0r * t0i; f2i = t1i + w0r * t0r - w0r * t0i; f3r = Two * t1r - f2r; f3i = f2i - Two * t1i; // Butterflys // f0 - - t0 - - f0 // f1 - 1 - f1 - - f1 // f2 - - f2 - 1 - f2 // f3 - 1 - t1 - i - f3 t0r = f0r + f1r; t0i = f0i - f1i; f1r = f0r - f1r; f1i = f0i + f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r + t1i; f3i = f1i - t1r; f1r = f1r - t1i; f1i = f1i + t1r; // store result ioptr[0] = scale * f0r; ioptr[1] = scale * f0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; } //------------------------------------------------------------------------------ // RADIX 16 rifft //------------------------------------------------------------------------------ template void g_fft::rifft8pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE w0r = (FFT_TYPE) (1.0 / FFT_ROOT2); // cos(pi/4) FFT_TYPE w1r = FFT_COSPID8; // cos(pi/8) FFT_TYPE w1i = FFT_SINPID8; // sin(pi/8) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = FFT_TYPE(2.0); // bit reversed load t0r = ioptr[0]; t0i = ioptr[1]; f4r = ioptr[2]; f4i = ioptr[3]; f2r = ioptr[4]; f2i = ioptr[5]; f6r = ioptr[6]; f6i = ioptr[7]; f1r = Two * ioptr[8]; f1i = Two * ioptr[9]; f5r = ioptr[10]; f5i = ioptr[11]; f3r = ioptr[12]; f3i = ioptr[13]; f7r = ioptr[14]; f7i = ioptr[15]; // start rfft f0r = t0r + t0i; // compute Re(x[0]) f0i = t0r - t0i; // compute Re(x[N/2]) t0r = f2r + f3r; t0i = f2i - f3i; t1r = f2r - f3r; t1i = f2i + f3i; f2r = t0r - w0r * t1r - w0r * t1i; f2i = t0i + w0r * t1r - w0r * t1i; f3r = Two * t0r - f2r; f3i = f2i - Two * t0i; t0r = f4r + f7r; t0i = f4i - f7i; t1r = f4r - f7r; t1i = f4i + f7i; f4r = t0r - w1i * t1r - w1r * t1i; f4i = t0i + w1r * t1r - w1i * t1i; f7r = Two * t0r - f4r; f7i = f4i - Two * t0i; t0r = f6r + f5r; t0i = f6i - f5i; t1r = f6r - f5r; t1i = f6i + f5i; f6r = t0r - w1r * t1r - w1i * t1i; f6i = t0i + w1i * t1r - w1r * t1i; f5r = Two * t0r - f6r; f5i = f6i - Two * t0i; // Butterflys // f0 - - t0 - - f0 - - f0 // f1* - 1 - f1 - - f1 - - f1 // f2 - - f2 - 1 - f2 - - f2 // f3 - 1 - t1 - i - f3 - - f3 // f4 - - t0 - - f4 - 1 - t0 // f5 - 1 - f5 - - f5 - w3 - f4 // f6 - - f6 - 1 - f6 - i - t1 // f7 - 1 - t1 - i - f7 - iw3- f6 t0r = f0r + f1r; t0i = f0i - f1i; f1r = f0r - f1r; f1i = f0i + f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r + t1i; f3i = f1i - t1r; f1r = f1r - t1i; f1i = f1i + t1r; t0r = f4r + f5r; t0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; t1r = f6r - f7r; t1i = f6i - f7i; f6r = f6r + f7r; f6i = f6i + f7i; f4r = t0r + f6r; f4i = t0i + f6i; f6r = t0r - f6r; f6i = t0i - f6i; f7r = f5r + t1i; f7i = f5i - t1r; f5r = f5r - t1i; f5i = f5i + t1r; t0r = f0r - f4r; t0i = f0i - f4i; f0r = f0r + f4r; f0i = f0i + f4i; t1r = f2r + f6i; t1i = f2i - f6r; f2r = f2r - f6i; f2i = f2i + f6r; f4r = f1r - f5r * w0r + f5i * w0r; f4i = f1i - f5r * w0r - f5i * w0r; f1r = f1r * Two - f4r; f1i = f1i * Two - f4i; f6r = f3r + f7r * w0r + f7i * w0r; f6i = f3i - f7r * w0r + f7i * w0r; f3r = f3r * Two - f6r; f3i = f3i * Two - f6i; // store result ioptr[0] = scale * f0r; ioptr[1] = scale * f0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; ioptr[8] = scale * t0r; ioptr[9] = scale * t0i; ioptr[10] = scale * f4r; ioptr[11] = scale * f4i; ioptr[12] = scale * t1r; ioptr[13] = scale * t1i; ioptr[14] = scale * f6r; ioptr[15] = scale * f6i; } //------------------------------------------------------------------------------ // Start RIFFT //------------------------------------------------------------------------------ template void g_fft::ifrstage(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl) { unsigned int pos; unsigned int posi; unsigned int diffUcnt; FFT_TYPE *p0r, *p1r; FFT_TYPE *u0r, *u0i; FFT_TYPE w0r, w0i; FFT_TYPE f0r, f0i, f1r, f1i, f4r, f4i, f5r, f5i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = FFT_TYPE(2.0); pos = POW2(M - 1); posi = pos + 1; p0r = ioptr; p1r = ioptr + pos / 2; u0r = Utbl + POW2(M - 3); w0r = *u0r, f0r = *(p0r); f0i = *(p0r + 1); f4r = *(p0r + pos); f4i = *(p0r + posi); f1r = *(p1r); f1i = *(p1r + 1); f5r = *(p1r + pos); f5i = *(p1r + posi); t0r = f0r + f0i; t0i = f0r - f0i; t1r = f4r + f4r; t1i = -f4i - f4i; f0r = f1r + f5r; f0i = f1i - f5i; f4r = f1r - f5r; f4i = f1i + f5i; f1r = f0r - w0r * f4r - w0r * f4i; f1i = f0i + w0r * f4r - w0r * f4i; f5r = Two * f0r - f1r; f5i = f1i - Two * f0i; *(p0r) = t0r; *(p0r + 1) = t0i; *(p0r + pos) = t1r; *(p0r + posi) = t1i; *(p1r) = f1r; *(p1r + 1) = f1i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; u0r = Utbl + 1; u0i = Utbl + (POW2(M - 2) - 1); w0r = *u0r, w0i = *u0i; p0r = (ioptr + 2); p1r = (ioptr + (POW2(M - 2) - 1) * 2); // Butterflys // f0 - t0 - f0 // f1 - t1 -w0- f1 // f2 - t0 - f2 // f3 - t1 -iw0- f3 for (diffUcnt = POW2(M - 3) - 1; diffUcnt > 0; diffUcnt--) { f0r = *(p0r); f0i = *(p0r + 1); f5r = *(p1r + pos); f5i = *(p1r + posi); f1r = *(p1r); f1i = *(p1r + 1); f4r = *(p0r + pos); f4i = *(p0r + posi); t0r = f0r + f5r; t0i = f0i - f5i; t1r = f0r - f5r; t1i = f0i + f5i; f0r = t0r - w0i * t1r - w0r * t1i; f0i = t0i + w0r * t1r - w0i * t1i; f5r = Two * t0r - f0r; f5i = f0i - Two * t0i; t0r = f1r + f4r; t0i = f1i - f4i; t1r = f1r - f4r; t1i = f1i + f4i; f1r = t0r - w0r * t1r - w0i * t1i; f1i = t0i + w0i * t1r - w0r * t1i; f4r = Two * t0r - f1r; f4i = f1i - Two * t0i; *(p0r) = f0r; *(p0r + 1) = f0i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; w0r = *++u0r; w0i = *--u0i; *(p1r) = f1r; *(p1r + 1) = f1i; *(p0r + pos) = f4r; *(p0r + posi) = f4i; p0r += 2; p1r -= 2; } } //------------------------------------------------------------------------------ // Compute in-place real ifft on the rows of the input array // data order as from rffts1 // INPUTS // *ioptr = input data array in the following order // M = log2 of fft size // Re(x[0]), Re(x[N/2]), Re(x[1]), Im(x[1]), // Re(x[2]), Im(x[2]), ... Re(x[N/2-1]), Im(x[N/2-1]). // *Utbl = cosine table // *BRLow = bit reversed counter table // OUTPUTS // *ioptr = real output data array //------------------------------------------------------------------------------ template void g_fft::riffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow) { FFT_TYPE scale; int StageCnt; int NDiffU; scale = (FFT_TYPE)(1.0 / (double)((int)POW2(M))); M = M - 1; switch (M) { case -1: break; case 0: rifft1pt(ioptr, scale); // a 2 pt fft break; case 1: rifft2pt(ioptr, scale); // a 4 pt fft break; case 2: rifft4pt(ioptr, scale); // an 8 pt fft break; case 3: rifft8pt(ioptr, scale); // a 16 pt fft break; default: ifrstage(ioptr, M + 1, Utbl); // bit reverse and first radix 2 stage scbitrevR2(ioptr, M, BRLow, scale); StageCnt = (M - 1) / 3; // number of radix 8 stages NDiffU = 2; // one radix 2 stage already complete if ((M - 1 - (StageCnt * 3)) == 1) { ibfR2(ioptr, M, NDiffU); // 1 radix 2 stage NDiffU *= 2; } if ((M - 1 - (StageCnt * 3)) == 2) { ibfR4(ioptr, M, NDiffU); // 1 radix 4 stage NDiffU *= 4; } if (M <= (int) MCACHE) ibfstages(ioptr, M, Utbl, 2, NDiffU, StageCnt); // RADIX 8 Stages else ifftrecurs(ioptr, M, Utbl, 2, NDiffU, StageCnt); // RADIX 8 Stages } } //============================================================================== // End of original C functions // // Wrapper methods for simple class access //============================================================================== //------------------------------------------------------------------------------ // malloc and init cosine and bit reversed tables for a given size // fft, ifft, rfft, rifft // INPUTS // M = log2 of fft size (ex M=10 for 1024 point fft) // OUTPUTS // private cosine and bit reversed tables //------------------------------------------------------------------------------ template void g_fft::fftInit() { for (int i = 0; i < 32; i++) { FFT_table_1[i] = (FFT_TYPE*)0; FFT_table_2[i] = (short int*)0; } FFT_N = ConvertFFTSize(FFT_size); // create and initialize cos table FFT_table_1[FFT_N] = new FFT_TYPE[(POW2(FFT_N) / 4 + 1)]; fftCosInit(FFT_N, FFT_table_1[FFT_N]); // create and initialize bit reverse tables FFT_table_2[FFT_N/2] = new short[POW2(FFT_N/2 - 1)]; fftBRInit(FFT_N, FFT_table_2[FFT_N/2]); FFT_table_2[(FFT_N - 1) / 2] = new short[POW2((FFT_N - 1) / 2 - 1)]; fftBRInit(FFT_N - 1, FFT_table_2[(FFT_N - 1) / 2]); Utbl = ((FFT_TYPE**) FFT_table_1)[FFT_N]; BRLow = ((short**) FFT_table_2)[FFT_N / 2]; } //------------------------------------------------------------------------------ // convert from N to LOG2(N) //------------------------------------------------------------------------------ template int g_fft::ConvertFFTSize(int N) { if (N <= 0) N = -N; switch (N) { case 0x00000001: return 0; // 1 case 0x00000002: return 1; // 2 case 0x00000004: return 2; // 4 case 0x00000008: return 3; // 8 case 0x00000010: return 4; // 16 case 0x00000020: return 5; // 32 case 0x00000040: return 6; // 64 case 0x00000080: return 7; // 128 case 0x00000100: return 8; // 256 case 0x00000200: return 9; // 512 case 0x00000400: return 10; // 1024 case 0x00000800: return 11; // 2048 case 0x00001000: return 12; // 4096 case 0x00002000: return 13; // 8192 case 0x00004000: return 14; // 16384 case 0x00008000: return 15; // 32768 case 0x00010000: return 16; // 65536 case 0x00020000: return 17; // 131072 case 0x00040000: return 18; // 262144 case 0x00080000: return 19; // 525288 case 0x00100000: return 20; // 1048576 case 0x00200000: return 21; // 2097152 case 0x00400000: return 22; // 4194304 case 0x00800000: return 23; // 8388608 case 0x01000000: return 24; // 16777216 case 0x02000000: return 25; // 33554432 case 0x04000000: return 26; // 67108864 case 0x08000000: return 27; // 134217728 case 0x10000000: return 28; // 268435456 } return 0; } //------------------------------------------------------------------------------ // Compute in-place complex FFT // FFTsize: FFT length in samples // buf: array of FFTsize*2 FFT_TYPE values, // in interleaved real/imaginary format //------------------------------------------------------------------------------ template void g_fft::ComplexFFT(std::complex *buf) { void *ptr = buf; FFT_TYPE *nbuf = static_cast(ptr); ffts1(nbuf, FFT_N, Utbl, BRLow); } //------------------------------------------------------------------------------ // Compute in-place inverse complex FFT // FFTsize: FFT length in samples // buf: array of FFTsize*2 FFT_TYPE values, // in interleaved real/imaginary format // Output should be scaled by the return value of // GetInverseComplexFFTScale(fft_struct, FFTsize). //------------------------------------------------------------------------------ template void g_fft::InverseComplexFFT(std::complex *buf) { void *ptr = buf; FFT_TYPE *nbuf = static_cast(ptr); iffts1(nbuf, FFT_N, Utbl, BRLow); } //------------------------------------------------------------------------------ // Compute in-place real FFT // FFTsize: FFT length in samples // buf: array of FFTsize FFT_TYPE values; output is in interleaved // real/imaginary format, except for buf[1] which is the real // part for the Nyquist frequency //------------------------------------------------------------------------------ template void g_fft::RealFFT(std::complex *buf) { void *ptr = buf; FFT_TYPE *nbuf = static_cast(ptr); rffts1(nbuf, FFT_N, Utbl, BRLow); } //------------------------------------------------------------------------------ // Compute in-place inverse real FFT // FFTsize: FFT length in samples // buf: array of FFTsize FFT_TYPE values; input is expected to be in // interleaved real/imaginary format, except for buf[1] which // is the real part for the Nyquist frequency // Output should be scaled by the return value of // GetInverseRealFFTScale(fft_struct, FFTsize). //------------------------------------------------------------------------------ template void g_fft::InverseRealFFT(std::complex *buf) { void *ptr = buf; FFT_TYPE *nbuf = static_cast(ptr); riffts1(nbuf, FFT_N, Utbl, BRLow); } //------------------------------------------------------------------------------ // Returns the amplitude scale that should be applied to the result of // an inverse complex FFT with a length of 'FFTsize' samples. //------------------------------------------------------------------------------ template FFT_TYPE g_fft::GetInverseComplexFFTScale() { return FFT_TYPE(1.0); } //------------------------------------------------------------------------------ // Returns the amplitude scale that should be applied to the result of // an inverse real FFT with a length of 'FFTsize' samples. //------------------------------------------------------------------------------ template FFT_TYPE g_fft::GetInverseRealFFTScale() { return FFT_TYPE(1.0); } #endif fldigi-3.21.80/src/include/mfsk.h0000664000175000017500000001402312313064025013365 00000000000000// ---------------------------------------------------------------------------- // mfsk.h -- mfsk modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _MFSK_H #define _MFSK_H #include #include #include #include #include "globals.h" #include "modem.h" #include "filters.h" #include "interleave.h" #include "viterbi.h" #include "complex.h" #include "mfskvaricode.h" #include "mbuffer.h" #include "picture.h" #define MFSKSampleRate 8000 // 1 ms per pixel #define SAMPLES_PER_PIXEL 8 #define MAX_SYMBOLS 32 #define PICHEADER 64 // NASA coefficients for viterbi encode/decode algorithms #define K 7 #define POLY1 0x6d #define POLY2 0x4f class mfsk; extern int print_time_left(float secs, char *str, size_t len, const char *prefix = "", const char *suffix = ""); extern void updateTxPic(unsigned char data); extern void updateRxPic(unsigned char data, int pos); extern void TxViewerResize(int W, int H); extern void showTxViewer(int W, int H); extern void createTxViewer(); extern void createRxViewer(); extern void showRxViewer(int W, int H); extern void deleteRxViewer(); extern void deleteTxViewer(); extern void cb_picRxClose( Fl_Widget *w, void *); extern void cb_picRxAbort( Fl_Widget *w, void *); extern void picTxSendColor(); extern void cb_picTxSendColor( Fl_Widget *w, void *); extern void cb_picTxSendGrey( Fl_Widget *w, void *); extern void cb_picTxSendAbort( Fl_Widget *w, void *); extern void load_file(const char *n); extern Fl_Double_Window *picRxWin; extern picture *picRx; extern Fl_Button *btnpicRxSave; extern Fl_Button *btnpicRxAbort; extern Fl_Button *btnpicRxClose; extern Fl_Double_Window *picTxWin; extern picture *picTx; extern Fl_Button *btnpicTxSPP; extern Fl_Button *btnpicTxSendColor; extern Fl_Button *btnpicTxSendGrey; extern Fl_Button *btnpicTxSendAbort; extern Fl_Button *btnpicTxLoad; extern Fl_Button *btnpicTxClose; extern Fl_Shared_Image *TxImg; extern unsigned char *xmtimg; extern unsigned char *xmtpicbuff; struct rxpipe { cmplx vector[MAX_SYMBOLS]; //numtones <= 32 }; struct history { cmplx val; int symnbr; }; class mfsk : public modem { #define SCOPESIZE 64 friend void updateTxPic(unsigned char data); friend void cb_picRxClose( Fl_Widget *w, void *); friend void cb_picRxAbort( Fl_Widget *w, void *); friend void pic_TxSendColor(); friend void cb_picTxSendColor( Fl_Widget *w, void *); friend void cb_picTxSendGrey( Fl_Widget *w, void *); friend void cb_picTxSendAbort( Fl_Widget *w, void *); friend void cb_picTxSPP( Fl_Widget *w, void *); friend void load_image(const char *n); public: enum { TX_STATE_PREAMBLE, TX_STATE_START, TX_STATE_DATA, TX_STATE_END, TX_STATE_FLUSH, TX_STATE_FINISH, TX_STATE_TUNE, TX_STATE_PICTURE_START, TX_STATE_PICTURE }; enum { RX_STATE_DATA, RX_STATE_PICTURE_START, // RX_STATE_PICTURE_START_1, // RX_STATE_PICTURE_START_2, RX_STATE_PICTURE }; protected: // general double phaseacc; int symlen; int symbits; int numtones; int basetone; double tonespacing; double basefreq; int counter; int depth; // receive int rxstate; C_FIR_filter *hbfilt; sfft *binsfft; C_FIR_filter *bpfilt; C_FIR_filter *xmtfilt; Cmovavg *vidfilter[SCOPESIZE]; Cmovavg *syncfilter; viterbi *dec1; viterbi *dec2; interleave *rxinlv; rxpipe *pipe; unsigned int pipeptr; unsigned int datashreg; //VK2ETA high speed modes int preamble; cmplx currvector; cmplx prev1vector; cmplx prev2vector; int currsymbol; int prev1symbol; int prev2symbol; double maxval; double prevmaxval; double met1; double met2; mbuffer scopedata; double s2n; double sig; double noise; double afcmetric; bool staticburst; double currfreq; int synccounter; int AFC_COUNT; unsigned char symbolpair[2]; int symcounter; int RXspp; // samples per pixel int TXspp; int symbolbit; // transmit int txstate; encoder *enc; interleave *txinlv; unsigned int bitshreg; int bitstate; // Picutre data and methods int picturesize; char picheader[PICHEADER]; cmplx prevz; double picf; unsigned char prepost[128]; int row; int col; int rgb; int pixelnbr; int picW; int picH; bool color; unsigned char picprologue[176]; int xmtbytes; bool startpic; bool abortxmt; void recvpic(cmplx z); void recvchar(int c); void recvbit(int bit); // internal processes void decodesymbol(unsigned char symbol); void softdecode(cmplx *bins); cmplx mixer(cmplx in, double f); int harddecode(cmplx *in); void update_syncscope(); void synchronize(); void afc(); void reset_afc(); void eval_s2n(); void transmit(double *, int); void sendsymbol(int sym); void sendbit(int bit); void sendchar(unsigned char c); void sendidle(); void flush_xmt_filter(int); void send_prologue(); void send_epilogue(); void flushtx(int nbits); void clearbits(); void sendpic(unsigned char *data, int len); bool check_picture_header(char c); void s2nreport(void); public: mfsk (trx_mode md); ~mfsk (); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart() {}; int rx_process(const double *buf, int len); int tx_process(); void send_image(std::string s); void shutdown(); }; #endif fldigi-3.21.80/src/include/pskeval.h0000664000175000017500000000264312313064025014077 00000000000000// ---------------------------------------------------------------------------- // pskeval.cxx -- psk signal evaluator // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _PSKEVAL_H #define _PSKEVAL_H #include "complex.h" #include "filters.h" #include "waterfall.h" #define FLOWER 200 #define FUPPER 4000 class pskeval { private: double sigpwr[FFT_LEN]; double sigmin; double bw; public: pskeval(); ~pskeval(); void clear(); void setbw(double w) { bw = w;} void sigdensity(); double sigpeak(int &f, int f1, int f2); double peak(int &f, int f1, int f2, double level); double power(int f1, int f2); }; #endif fldigi-3.21.80/src/include/calendar.h0000664000175000017500000000651412313064025014204 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _FL_CALENDAR_H #define _FL_CALENDAR_H #include #include #include #include #include "flinput2.h" #include "date.h" class Fl_Calendar_Base : public Fl_Group , public Date { private: protected: int cal_x; int cal_y; int cal_w; int cal_h; Fl_Button * days[6*7]; public: Fl_Widget *target; int calfmt; /** * The constructor for an empty Fl_Calendar_Base. */ Fl_Calendar_Base (int x, int y, int w = (7*20), int h = (6*20), const char *l = 0); Fl_Button * day_button (int i); void update (); void csize (int cx, int cy, int cw, int ch); void setTarget (Fl_Widget *tgt); }; class Fl_Calendar : public Fl_Calendar_Base { public: /** * The constructor for an empty Fl_Calendar. */ Fl_Calendar (int x, int y, int w = (7*20), int h = (8*20), const char *l = 0); void today (); void previous_month (); void next_month (); void previous_year (); void next_year (); void setDate (int, int, int); void update (); void csize (int cx, int cy, int cw, int ch); int handle (int); protected: // Fl_Button * weekdays[7]; // Fl_Button * caption; Fl_Box * weekdays[7]; Fl_Box * caption; Fl_Button * nxt_month; Fl_Button * prv_month; Fl_Button * nxt_year; Fl_Button * prv_year; }; class Fl_PopCal : public Fl_Window { friend void popcal_cb(Fl_Widget *, long); protected: int popcalfmt_; // Fl_Window popcal_form; Fl_Calendar *popcal; Fl_Input2 *target; public: Fl_PopCal (int x, int y, int w, int h, Fl_Input2 *inp = 0); ~Fl_PopCal (); void popposition (int, int); void popshow (); void pophide (); void popcal_cb_i (Fl_Widget *, long); void popcalfmt (int); int popcalfmt (); int handle (int); void setDate (int, int, int); }; class Fl_DateInput : public Fl_Group { protected: Fl_Button *Btn; Fl_Input2 *Input; Fl_PopCal *Cal; Fl_Window *popcal_form; Fl_Calendar *popcal; int popcalfmt_; void makepopcal(); public: Fl_DateInput (int x, int y, int w, int h, const char * = 0); void format (int); const char *value (); void value (const char *); void color (Fl_Color); void textfont (int); void textsize (int); void textcolor (Fl_Color); void labelfont (int); void labelsize (int); void labelcolor (int); void align (Fl_Align); void fl_popcal(); void take_focus(); }; #endif fldigi-3.21.80/src/include/serial.h0000664000175000017500000001155312313064025013711 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef SERIAL_H #define SERIAL_H #include void com_to_tty(std::string& port); void tty_to_com(std::string& port); #ifndef __MINGW32__ #include class Cserial { public: Cserial(); ~Cserial(); //Methods bool OpenPort(); bool IsOpen() { return fd < 0 ? 0 : 1; }; void ClosePort(); void Device (std::string dev) { device = dev;}; std::string Device() { return device;}; void Baud(int b) { baud = b;}; int Baud() { return baud;}; void Timeout(int tm) { timeout = tm;} int Timeout() { return timeout; } void Retries(int r) { retries = r;} int Retries() { return retries;} void RTS(bool r){rts = r;} bool RTS(){return rts;} void RTSptt(bool b){rtsptt = b;} bool RTSptt(){return rtsptt;} void DTR(bool d){dtr = d;} bool DTR(){return dtr;} void DTRptt(bool b){dtrptt = b;} bool DTRptt(){return dtrptt;} void RTSCTS(bool b){rtscts = b;} bool RTSCTS(){return rtscts;} void SetPTT(bool b); void RestoreTIO(bool b) { restore_tio = b; } bool RestoreTIO() { return restore_tio; } void Stopbits(int n) {stopbits = (n == 1 ? 1 : 2);} int Stopbits() { return stopbits;} int ReadBuffer (unsigned char *b, int nbr); int WriteBuffer(unsigned char *str, int nbr); void FlushBuffer(); private: //Members std::string device; int fd; int baud; int speed; struct termios oldtio, newtio; int timeout; int retries; int status, origstatus; bool dtr; bool dtrptt; bool rts; bool rtsptt; bool rtscts; bool restore_tio; int stopbits; char bfr[2048]; //Methods bool IOselect(); }; #else //__MINGW32__ #include class Cserial { public: Cserial() { rts = dtr = false; rtsptt = dtrptt = false; rtscts = false; baud = CBR_9600; stopbits = 2; }; Cserial( std::string portname) { device = portname; Cserial(); // OpenPort(); }; virtual ~Cserial() {}; //Methods BOOL OpenPort(); void ClosePort(); BOOL ConfigurePort(DWORD BaudRate,BYTE ByteSize,DWORD fParity,BYTE Parity,BYTE StopBits); bool IsBusy() { return busyflag; }; void IsBusy(bool val) { busyflag = val; }; bool IsOpen() { return hComm == INVALID_HANDLE_VALUE ? 0 : 1; }; BOOL ReadByte(unsigned char &resp); int ReadData (unsigned char *b, int nbr); int ReadBuffer (unsigned char *b, int nbr) { return ReadData (b,nbr); } BOOL WriteByte(unsigned char bybyte); int WriteBuffer(unsigned char *str, int nbr); BOOL SetCommunicationTimeouts( DWORD ReadIntervalTimeout, DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant, DWORD WriteTotalTimeoutMultiplier, DWORD WriteTotalTimeoutConstant); BOOL SetCommTimeout(); void Timeout(int tm) { timeout = tm; return; }; int Timeout() { return timeout; }; void FlushBuffer(); void Device (std::string dev) { device = dev;}; std::string Device() { return device;}; void Baud(int b) { baud = b;}; int Baud() { return baud;}; void Retries(int r) { retries = r;} int Retries() { return retries;} void RTS(bool r){rts = r;} bool RTS(){return rts;} void RTSptt(bool b){rtsptt = b;} bool RTSptt(){return rtsptt;} void DTR(bool d){dtr = d;} bool DTR(){return dtr;} void DTRptt(bool b){dtrptt = b;} bool DTRptt(){return dtrptt;} void RTSCTS(bool b){rtscts = b;} bool RTSCTS(){return rtscts;} void SetPTT(bool b); void RestoreTIO(bool b) { restore_tio = b; } bool RestoreTIO() { return restore_tio; } void Stopbits(int n) {stopbits = (n == 1 ? 1 : 2);} int Stopbits() { return stopbits;} //Members private: std::string device; //For use by CreateFile HANDLE hComm; //DCB Defined in WinBase.h DCB dcb; COMMTIMEOUTS CommTimeoutsSaved; COMMTIMEOUTS CommTimeouts; //Is the Port Ready? BOOL bPortReady; //Number of Bytes Written to port DWORD nBytesWritten; //Number of Bytes Read from port DWORD nBytesRead; //Number of bytes Transmitted in the cur session DWORD nBytesTxD; int timeout; bool busyflag; int baud; int retries; bool dtr; bool dtrptt; bool rts; bool rtsptt; bool rtscts; bool restore_tio; int stopbits; }; #endif // __MINGW32__ #endif // SERIAL_H fldigi-3.21.80/src/include/notifydialog.h0000664000175000017500000000410712313150713015117 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0302 #ifndef notifydialog_h #define notifydialog_h #include #include "table.h" #include "flinput2.h" #include "flslider2.h" #include #include extern Fl_Group *grpNotifyEvent; #include extern Fl_Choice *mnuNotifyEvent; extern Fl_Input2 *inpNotifyRE; #include extern Fl_Light_Button *btnNotifyEnabled; extern Fl_Group *grpNotifyFilter; #include extern Fl_Round_Button *chkNotifyFilterCall; extern Fl_Input2 *inpNotifyFilterCall; extern Fl_Round_Button *chkNotifyFilterDXCC; #include extern Fl_Button *btnNotifyFilterDXCC; #include extern Fl_Check_Button *chkNotifyFilterNWB; extern Fl_Check_Button *chkNotifyFilterLOTW; extern Fl_Check_Button *chkNotifyFilterEQSL; extern Fl_Group *grpNotifyDup; extern Fl_Check_Button *chkNotifyDupIgnore; extern Fl_Choice *mnuNotifyDupWhich; extern Fl_Spinner2 *cntNotifyDupTime; extern Fl_Check_Button *chkNotifyDupBand; extern Fl_Check_Button *chkNotifyDupMode; extern Fl_Group *grpNotifyAction; extern Fl_Spinner2 *cntNotifyActionLimit; extern Fl_Input2 *inpNotifyActionDialog; extern Fl_Button *btnNotifyActionDialogDefault; extern Fl_Spinner2 *cntNotifyActionDialogTimeout; extern Fl_Input2 *inpNotifyActionRXMarker; extern Fl_Button *btnNotifyActionMarkerDefault; extern Fl_Input2 *inpNotifyActionMacro; extern Fl_Button *btnNotifyActionMacro; extern Fl_Input2 *inpNotifyActionProgram; extern Fl_Button *btnNotifyActionProgram; extern Fl_Button *btnNotifyAdd; extern Fl_Button *btnNotifyRemove; extern Fl_Button *btnNotifyUpdate; extern Fl_Button *btnNotifyTest; extern Fl_Button *btnNotifyClose; extern Table *tblNotifyList; Fl_Double_Window* make_notify_window(); extern Table *tblNotifyFilterDXCC; extern Fl_Input2 *inpNotifyDXCCSearchCountry; extern Fl_Input2 *inpNotifyDXCCSearchCallsign; extern Fl_Button *btnNotifyDXCCSelect; extern Fl_Button *btnNotifyDXCCDeselect; extern Fl_Button *btnNotifyDXCCClose; Fl_Double_Window* make_dxcc_window(); #endif fldigi-3.21.80/src/include/ascii.h0000664000175000017500000000241212313064025013514 00000000000000// ---------------------------------------------------------------------------- // ascii.h -- ASCII table // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef ASCII_H #define ASCII_H extern const char *ascii[]; extern const char *ascii2[]; extern const char *ascii3[]; #define SOH 0x01 // SOH ascii character #define EOT 0x04 // EOT ascii character #endif fldigi-3.21.80/src/include/utf8file_io.h0000664000175000017500000000213012313064025014636 00000000000000// ---------------------------------------------------------------------------- // utf8file_io.h // // Copyright (C) 2012 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef UTF8_FILE_IO #define UTF8_FILE_IO #include int UTF8_readfile ( const char *file, std::string &textread ); int UTF8_writefile( const char *file, std::string &textwrite ); #endif fldigi-3.21.80/src/include/newinstall.h0000664000175000017500000000205612313064025014610 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef NEW_INSTALL_H #define NEW_INSTALL_H extern void create_new_macros(); extern void create_new_palettes(); extern void show_wizard(int argc = 0, char** argv = NULL); #endif fldigi-3.21.80/src/include/ringbuffer.h0000664000175000017500000001406112313064025014560 00000000000000// ---------------------------------------------------------------------------- // ringbuffer.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // C++ version of PortAudio's ringbuffer code. The copying read/write methods // use memcpy, so it generally safe to use them only for POD types. Thread safe // for one reader and one writer. // // Licensed according to original copyright notice: // // Author: Phil Burk, http://www.softsynth.com // modified for SMP safety on OS X by Bjorn Roche. // also allowed for const where possible. // Note that this is safe only for a single-thread reader // and a single-thread writer. // // This program is distributed with the PortAudio Portable Audio Library. // For more information see: http://www.portaudio.com // Copyright (c) 1999-2000 Ross Bencina and Phil Burk // // 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. #ifndef RINGBUFFER_H #define RINGBUFFER_H #include #include #include "util.h" template class ringbuffer { protected: size_t size, big_mask, small_mask; T* buf; volatile size_t ridx, widx; public: typedef T value_type; typedef struct { value_type* buf; size_t len; } vector_type; public: ringbuffer(size_t s) : ridx(0), widx(0) { assert(powerof2(s)); size = s; big_mask = size * 2 - 1; small_mask = size - 1; buf = new T[size]; } ~ringbuffer() { delete [] buf; } size_t read_space(void) { read_memory_barrier(); return (widx - ridx) & big_mask; } size_t write_space(void) { return size - read_space(); } void read_advance(size_t n) { write_memory_barrier(); ridx = (ridx + n) & big_mask; } void write_advance(size_t n) { write_memory_barrier(); widx = (widx + n) & big_mask; } size_t get_rv(vector_type v[2], size_t n = 0) { size_t rspace = read_space(); size_t index = ridx & small_mask; if (n == 0 || n > rspace) n = rspace; if (index + n > size) { // two part vector v[0].buf = buf + index; v[0].len = size - index; v[1].buf = buf; v[1].len = n - v[0].len; } else { v[0].buf = buf + index; v[0].len = n; v[1].len = 0; } return n; } size_t read(T* dst, size_t n) { vector_type v[2]; n = get_rv(v, n); memcpy(dst, v[0].buf, v[0].len * sizeof(T)); if (v[1].len) memcpy(dst + v[0].len, v[1].buf, v[1].len * sizeof(T)); read_advance(n); return n; } size_t peek(T* dst, size_t n) { vector_type v[2]; n = get_rv(v, n); memcpy(dst, v[0].buf, v[0].len * sizeof(T)); if (v[1].len) memcpy(dst + v[0].len, v[1].buf, v[1].len * sizeof(T)); return n; } size_t get_wv(vector_type v[2], size_t n = 0) { size_t wspace = write_space(); size_t index = widx & small_mask; if (n == 0 || n > wspace) n = wspace; if (index + n > size) { // two part vector v[0].buf = buf + index; v[0].len = size - index; v[1].buf = buf; v[1].len = n - v[0].len; } else { v[0].buf = buf + index; v[0].len = n; v[1].len = 0; } return n; } size_t write(const T* src, size_t n) { vector_type v[2]; n = get_wv(v, n); memcpy(v[0].buf, src, v[0].len * sizeof(T)); if (v[1].len) memcpy(v[1].buf, src + v[0].len, v[1].len * sizeof(T)); write_advance(n); return n; } void fill(const value_type& v) { reset(); for (size_t i = 0; i < size; i++) buf[i] = v; write_advance(size); } void zero(void) { reset(); memset(buf, 0, size * sizeof(T)); write_advance(size); } void reset(void) { ridx = widx = 0; } size_t length(void) { return size; } size_t bytes(void) { return size * sizeof(T); } }; #endif // RINGBUFFER_H // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-3.21.80/src/include/macros.h0000664000175000017500000000475312313064025013722 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _MACROS_H #define _MACROS_H #include #define NUMMACKEYS 12 #define NUMKEYROWS 2 #define MAXKEYROWS 4 #define MAXMACROS (MAXKEYROWS * NUMMACKEYS) extern void CPS_report(int); extern bool PERFORM_CPS_TEST; extern int num_cps_chars; extern struct timeval tv_cps_start; struct CONTESTCNTR { int count; char szCount[20]; char szDisp[40]; std::string fmt; CONTESTCNTR() { count = 0; fmt = "%04d"; } void Format(int ndigits, bool lz) { char c; fmt = '%'; if (lz) fmt = fmt + '0'; c = '0' + ndigits; fmt = fmt + c; fmt = fmt + 'd'; } }; struct MACROTEXT { bool changed; std::string name[MAXMACROS]; std::string text[MAXMACROS]; int loadMacros(const std::string& filename); void loadDefault(); void openMacroFile(); void writeMacroFile(); void saveMacroFile(); void saveMacros(const std::string& fname); std::string expandMacro(std::string &s, bool recurse); void execute(int n); void repeat(int n); void timed_execute(); MACROTEXT(); private: std::string expanded; void loadnewMACROS(std::string& s, size_t &i, size_t endbracket); void savecurrentMACROS(std::string& s, size_t &i, size_t endbracket); }; extern MACROTEXT macros; extern CONTESTCNTR contest_count; extern std::string info1msg; extern std::string info2msg; extern std::string qso_time; extern std::string qso_exchange; extern std::string exec_date; extern std::string exec_time; extern std::string exec_string; extern std::string text2repeat; extern bool macro_idle_on; extern size_t repeatchar; void set_macro_env(void); void queue_reset(); void queue_execute(); bool queue_must_rx(); void idleTimer(void *); #endif fldigi-3.21.80/src/include/mfskvaricode.h0000664000175000017500000000213112313064025015077 00000000000000// ---------------------------------------------------------------------------- // mfskvaricode.h -- MFSK Varicode // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _MFSKVARICODE_H #define _MFSKVARICODE_H extern const char *varienc(int c); extern int varidec(unsigned int symbol); #endif fldigi-3.21.80/src/include/analysis.h0000664000175000017500000000353512313064025014256 00000000000000// ---------------------------------------------------------------------------- // anal.h -- frequency analysis modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _anal_H #define _anal_H #include #include #include "complex.h" #include "filters.h" #include "fftfilt.h" #include "modem.h" #include "mbuffer.h" #define anal_SampleRate 8000 #define analMaxSymLen 512 #define dispwidth 100 class anal : public modem { private: double phaseacc; double anal_squelch; C_FIR_filter *hilbert; fftfilt *bpfilt; Cmovavg *ffilt; Cmovavg *favg; mbuffer pipe; int pipeptr; double prevsymbol; cmplx prevsmpl; int symbollen; int restart_count; double fout_1; double fout_2; long wf_freq; struct timespec start_time; double sum; void clear_syncscope(); inline cmplx mixer(cmplx in); int rx(bool bit); double nco(double freq); void writeFile(); std::string analysisFilename; public: anal(); ~anal(); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart(); int rx_process(const double *buf, int len); int tx_process(); }; #endif fldigi-3.21.80/src/include/stack.h0000664000175000017500000000306212313064025013533 00000000000000// Copyright 2007 Edd Dawson. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef STACK_HPP_0022_01092007 #define STACK_HPP_0022_01092007 #include #include #include #include namespace dbg { class stack_error : public std::exception { public: stack_error(const std::string &what); ~stack_error() throw(); const char *what() const throw(); private: std::string what_; }; class stack_frame { public: stack_frame(const void *instruction, const std::string &function); const void *instruction() const; const std::string &function() const; private: const void *instruction_; const std::string function_; }; std::ostream &operator<< (std::ostream &out, const stack_frame &frame); class stack { public: typedef std::list::size_type depth_type; typedef std::list::const_iterator const_iterator; stack(depth_type limit = 0); const_iterator begin() const; const_iterator end() const; depth_type depth() const; private: std::list frames_; }; } // close namespace dbg #endif // STACK_HPP_0022_01092007 fldigi-3.21.80/src/include/wefax.h0000664000175000017500000000716212313064025013545 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // Remi Chateauneu // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _WEFAX_H #define _WEFAX_H #include "globals.h" #include "modem.h" #include "filters.h" #include "mbuffer.h" #include "logbook.h" /// Forward definition. class fax_implementation ; class wefax : public modem { fax_implementation * m_impl ; bool m_abortxmt; /// For updating the logbook when loading/saving an image file. cQsoRec m_qso_rec ; /// Non-copiable object. wefax (); wefax ( const wefax & ); wefax & operator=( const wefax & ); public: wefax (trx_mode md); virtual ~wefax (); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart() {}; int rx_process(const double *buf, int len); int tx_process(); void shutdown(); int tx_time( int nb_bytes ) const ; bool is_tx_finished( int ix_sample, int nb_sample, const char * msg ) const; void skip_apt(void); void skip_phasing(bool auto_center); void end_reception(void); void set_tx_parameters( int the_lpm, const unsigned char * xmtpic_buffer, bool is_color, int img_w, int img_h ); void set_tx_abort_flag(void) { m_abortxmt = true ; } /// Whether reading without end, or apt/phasing/stop. void set_rx_manual_mode( bool manual_flag ); /// There are several possible input filter designated /// by a name, for displaying, and an index. static const char ** rx_filters(void); /// Set by the GUI. void set_rx_filter( int idx_filter ); void set_lpm( int the_lpm ); /// Restores the window label by taking into account wefax state mode. void update_rx_label(void) const ; /// Returns a filename matching current image properties. std::string suggested_filename(void) const ; cQsoRec & qso_rec(void) { return m_qso_rec ; } /// Called before loading/sending an image. void qso_rec_init(void); /// Called when transmitting/receiving is finished. void qso_rec_save(void); void set_freq(double); /// Helper string indicating the internal state of the wefax engine. std::string state_string(void) const; /// Maximum wait time when getting information about received and sent files. static const int max_delay = 3600 * 24 * 365 ; /// Called by the engine when a file is received. void put_received_file(const std::string & filnam); /// Used by XML-RPC to get the list of received files. std::string get_received_file(int max_seconds=max_delay); /// Called by XML-RPC to send a file which resides on the machine where fldigi runs. std::string send_file( const std::string & filnam, double max_seconds=max_delay); /// Called before sending a file. Transmitting is an exclusive process. bool transmit_lock_acquire( const std::string & filnam, double max_seconds=max_delay); /// Called after sending a file so another sending can take place. void transmit_lock_release( const std::string & err_msg ); }; #endif fldigi-3.21.80/src/include/logbook.h0000664000175000017500000000225112313064025014061 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef FL_LOGBOOK_H #define FL_LOGBOOK_H #include #include "lgbook.h" #include "logsupport.h" #include "threads.h" extern std::string log_checksum; extern pthread_t logbook_thread; extern pthread_mutex_t logbook_mutex; extern void start_logbook(); extern void close_logbook(); #endif fldigi-3.21.80/src/include/Panel.h0000664000175000017500000000233012313064025013462 00000000000000// ---------------------------------------------------------------------------- // Panel_Check.h // // Copyright (C) 2011 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef Panel_h_ #define Panel_h_ #include class Panel : public Fl_Group { public: int handle(int); Panel(int X,int Y,int W,int H,const char*l=0) : Fl_Group(X,Y,W,H,l) { clip_children(true); } void resize(int, int, int, int); void position(int, int, int, int); int orgx(); int orgy(); }; #endif fldigi-3.21.80/src/include/wefax-pic.h0000664000175000017500000000512412313064025014312 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // Remi Chateauneu // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _WEFAX_PIC_H #define _WEFAX_PIC_H #include class Fl_Menu_ ; class wefax ; class wefax_pic { static void create_rx_viewer(int wid_x, int wid_y,int wid_win, int hei_win); static void create_tx_viewer(int wid_x, int wid_y,int wid_win, int hei_win); public: static void set_tx_pic(unsigned char data, int col, int row, bool is_color ); static int normalize_lpm( double the_lpm_value ); static void update_rx_lpm(int lpm); static int update_rx_pic_col(unsigned char data, int pos); static void update_rx_pic_bw(unsigned char data, int pos); static void tx_viewer_resize(int the_width, int the_height); static void restart_tx_viewer(void); static void abort_rx_viewer(void); static void abort_tx_viewer(void); static void resize_rx_viewer(int width_img); static void set_rx_label(const std::string & win_label); static void delete_rx_viewer(void); static void delete_tx_viewer(void); static void skip_rx_apt(void); static void skip_rx_phasing(bool auto_center); static void cb_mnu_pic_viewer_rx(Fl_Menu_ *, void *); static void cb_mnu_pic_viewer_tx(Fl_Menu_ *, void *); static void setpicture_link(wefax *me); static void save_image(const std::string & fil_name, const std::string & extra_comments); static void power( double start, double phase, double image, double black, double stop ); static void send_image( const std::string & fil_name ); static void set_manual( bool manual_mode ); static void update_auto_center( bool is_auto_center ); static void create_both( bool called_from_fl_digi ); static void show_both(); static void hide_both(); }; extern Fl_Double_Window *wefax_pic_tx_win; extern Fl_Double_Window *wefax_pic_rx_win; #endif // _WEFAX_PIC_H fldigi-3.21.80/src/include/fl_lock.h0000664000175000017500000000534512313064025014045 00000000000000// ---------------------------------------------------------------------------- // fl_lock.h // // Copyright (C) 2007 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef FL_LOCK_H_ #define FL_LOCK_H_ // disabled calls #define FL_LOCK_D(x) ((void)0) #define FL_UNLOCK_D(x) ((void)0) #define FL_AWAKE_D(x) ((void)0) // enabled calls #define FL_LOCK_E(x) FL_LOCK(x) #define FL_UNLOCK_E(x) FL_UNLOCK(x) #define FL_AWAKE_E(x) FL_AWAKE(x) #if !defined(NDEBUG) && !defined(NO_LOCKS) # include #endif #ifdef NDEBUG # define FL_LOCK(x) Fl::lock(x) # define FL_UNLOCK(x) Fl::unlock(x) # define FL_AWAKE(x) Fl::awake(x) #else // debugging # include # ifndef NO_LOCKS # include "debug.h" # define FL_LOCK(x) \ do { \ switch (GET_THREAD_ID()) { \ case TRX_TID: \ LOG_ERROR("trx lock"); \ break; \ case FLMAIN_TID: \ LOG_WARN("flrun lock"); \ break; \ default: \ LOG_VERBOSE("lock"); \ } \ pstack_maybe(); \ Fl::lock(x); \ } while (0); # define FL_UNLOCK(x) Fl::unlock(x) # define FL_AWAKE(x) Fl::awake(x) # else // no locks # define FL_LOCK(x) ((void)0) # define FL_UNLOCK(x) ((void)0) # define FL_AWAKE(x) ((void)0) # endif // NO_LOCKS #endif // NDEBUG #endif // FL_LOCK_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-3.21.80/src/include/ssb.h0000664000175000017500000000224012313064025013212 00000000000000// ---------------------------------------------------------------------------- // ssb.h -- ssb modem // // Copyright (C) 2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _SSB_H #define _SSB_H #include "modem.h" #define ssb_SampleRate 8000 class ssb : public modem { public: ssb(); ~ssb(); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart(); int rx_process(const double *buf, int len); int tx_process(); }; #endif fldigi-3.21.80/src/include/rigsupport.h0000664000175000017500000000342312313064025014645 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef RIG_SUPPORT_H #define RIG_SUPPORT_H #include #include #include "serial.h" #if USE_HAMLIB #include "hamlib.h" #endif extern std::string windowTitle; extern Cserial rigio; extern void initOptionMenus(); extern void clearList(); extern void updateSelect(); extern size_t addtoList(long val); extern void buildlist(); extern void qso_movFreq(Fl_Widget* w, void*); extern int cb_qso_opMODE(); extern int cb_qso_opBW(); extern void qso_setMode(); extern void setTitle(); extern void qso_addFreq(); extern void qso_delFreq(); extern void qso_selectFreq(); extern void qso_setFreq(); extern void qso_clearList(); extern void saveFreqList(); extern bool readRigXML(); extern bool init_Xml_RigDialog(); extern bool init_NoRig_RigDialog(); #if USE_HAMLIB extern bool init_Hamlib_RigDialog(); extern void selMode(rmode_t m); extern std::string modeString(rmode_t m); #endif #endif fldigi-3.21.80/src/include/soundconf.h0000664000175000017500000000253612313064025014431 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef SOUNDCONF_H #define SOUNDCONF_H enum { SND_IDX_UNKNOWN = -1, SND_IDX_OSS, SND_IDX_PORT, SND_IDX_PULSE, SND_IDX_NULL, SND_IDX_END }; enum { FLDIGI_SRC_BEST, FLDIGI_SRC_MEDIUM, FLDIGI_SRC_FASTEST, #if !(defined(__ppc__) || defined(__powerpc__) || defined(__PPC__)) FLDIGI_SRC_LINEAR, #endif FLDIGI_NUM_SRC }; extern int sample_rate_converters[FLDIGI_NUM_SRC]; void sound_init(void); void sound_close(void); void sound_update(unsigned idx); #endif // SOUNDCONF_H fldigi-3.21.80/src/include/charsetlist.h0000664000175000017500000000212112313064025014746 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef CHARSETLIST_H #define CHARSETLIST_H struct charset_info { const char *name; int tiniconv_id; }; extern const struct charset_info charset_list[]; extern const unsigned int number_of_charsets; #endif fldigi-3.21.80/src/include/fl_digi.h0000664000175000017500000002350312313147652014035 00000000000000// ---------------------------------------------------------------------------- // // fl_digi.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef FL_DIGI_H #define FL_DIGI_H #include #include #include #include "combo.h" //#include "Fl_Tile_Check.h" #include "Panel.h" #include "FTextRXTX.h" #include "raster.h" #include "waterfall.h" #include "digiscope.h" #include "globals.h" #include "mixer.h" #include "progress.h" #include "FreqControl.h" #include "flinput2.h" #include "flslider2.h" #include "psk_browser.h" #include "re.h" extern fre_t seek_re; extern Fl_Double_Window *fl_digi_main; extern Fl_Double_Window *scopeview; //extern Fl_Double_Window *opBrowserView; extern Fl_Double_Window *dlgRecordLoader; extern bool NBEMSapps_dir; extern FTextRX *ReceiveText; extern FTextTX *TransmitText; extern pskBrowser *mainViewer; extern Fl_Input2 *txtInpSeek; extern Fl_Box *hideViewer; extern Fl_Group *mvgroup; extern Panel *text_panel; extern Fl_Box *minbox; extern int oix; extern Fl_Box *Status2; extern Fl_Box *Status1; extern Fl_Counter2 *cntCW_WPM; extern Fl_Counter2 *cntTxLevel; extern Fl_Button *MODEstatus; extern Fl_Slider2 *sldrSquelch; extern Progress *pgrsSquelch; extern Fl_Button *btnMacro[]; extern Fl_Button *btnAltMacros1; extern Fl_Button *btnAltMacros2; extern Fl_Group *macroFrame1; extern Fl_Group *macroFrame2; extern Fl_Input2 *inpFreq; extern Fl_Input2 *inpTimeOff; extern Fl_Input2 *inpTimeOn; extern Fl_Input2 *inpCall; extern Fl_Input2 *inpName; extern Fl_Input2 *inpRstIn; extern Fl_Input2 *inpRstOut; extern Fl_Input2 *inpQth; extern Fl_Input2 *inpState; extern Fl_Input2 *inpCountry; extern Fl_Input2 *inpSerNo; extern Fl_Input2 *outSerNo; extern Fl_Input2 *inpXchgIn; extern Fl_Input2 *inpVEprov; extern Fl_Input2 *inpLoc; extern Fl_Input2 *inpNotes; extern Fl_Input2 *inpAZ; // WA5ZNU extern Fl_Button *qsoSave; extern Fl_Box *txtRigName; extern cFreqControl *qsoFreqDisp1; extern cFreqControl *qsoFreqDisp2; extern cFreqControl *qsoFreqDisp3; extern Fl_Input2 *inpFreq2; extern Fl_Input2 *inpCall1; extern Fl_Input2 *inpCall2; extern Fl_Input2 *inpCall3; extern Fl_Input2 *inpCall4; extern Fl_Input2 *inpName1; extern Fl_Group *QsoInfoFrame1B; extern Fl_Group *qsoFrameView; extern Fl_Group *QsoInfoFrame; extern cFreqControl *qsoFreqDisp; extern Fl_ComboBox *qso_opMODE; extern Fl_ComboBox *qso_opBW; extern Fl_Button *qso_opPICK; extern Fl_Browser *qso_opBrowser; extern Fl_Value_Slider2 *mvsquelch; extern Fl_Value_Slider2 *valRcvMixer; extern Fl_Value_Slider2 *valXmtMixer; extern Fl_Button *btnAFC; extern Fl_Button *btnSQL; extern Fl_Light_Button *btnRSID; extern Fl_Light_Button *btnTxRSID; extern Fl_Light_Button *btnTune; extern bool bWF_only; extern bool withnoise; extern int altMacros; extern waterfall *wf; extern Digiscope *digiscope; extern std::string main_window_title; extern int Qwait_time; extern int Qidle_time; extern void toggleRSID(); extern int rightof(Fl_Widget* w); extern int leftof(Fl_Widget* w); extern int above(Fl_Widget* w); extern int below(Fl_Widget* w); extern void set_menus(); extern void create_fl_digi_main(int argc, char** argv); extern void update_main_title(); extern void activate_rig_menu_item(bool b); extern void activate_test_menu_item(bool b); extern void activate_mfsk_image_item(bool b); extern void activate_wefax_image_item(bool b); extern void WF_UI(); extern void set_macroLabels(); extern void UI_select(); extern void cb_mnuVisitURL(Fl_Widget*, void* arg); extern void put_freq(double frequency); extern void put_Bandwidth(int bandwidth); extern void global_display_metric(double metric); extern void put_cwRcvWPM(double wpm); extern void set_scope_mode(Digiscope::scope_mode md); extern void set_scope(double *data, int len, bool autoscale = true); extern void set_phase(double phase, double quality, bool highlight); extern void set_rtty(double, double, double); extern void set_video(double *, int, bool = true); extern void set_zdata(cmplx *, int); extern void set_scope_xaxis_1(double y1); extern void set_scope_xaxis_2(double y2); extern void set_scope_yaxis_1(double x1); extern void set_scope_yaxis_2(double x2); extern void set_scope_clear_axis(); extern void set_CWwpm(); extern void put_rx_char(unsigned int data, int style = FTextBase::RECV); extern void put_sec_char( char chr ); enum status_timeout { STATUS_CLEAR, STATUS_DIM, STATUS_NUM }; extern void put_status(const char *msg, double timeout = 0.0, status_timeout action = STATUS_CLEAR); extern void clear_StatusMessages(); extern void put_MODEstatus(const char* fmt, ...) format__(printf, 1, 2); extern void put_MODEstatus(trx_mode mode); extern void put_Status1(const char *msg, double timeout = 0.0, status_timeout action = STATUS_CLEAR); extern void put_Status2(const char *msg, double timeout = 0.0, status_timeout action = STATUS_CLEAR); extern void show_frequency(long long); extern void show_mode(const std::string& mode); extern void show_bw(const std::string& sWidth); extern void show_spot(bool v); extern void showMacroSet(); extern void setwfrange(); extern void showDTMF(const std::string s); extern void xmtrcv_selection_color(); extern void rev_selection_color(); extern void xmtlock_selection_color(); extern void sql_selection_color(); extern void afc_selection_color(); extern void rxid_selection_color(); extern void txid_selection_color(); extern void tune_selection_color(); extern void spot_selection_color(); extern void put_WARNstatus(double); extern void qsoSave_cb(Fl_Widget *b, void *); extern bool que_ok; extern void post_queue_execute(void*); extern void queue_execute_after_rx(void*); extern int rxtx_charset; extern void put_rx_data(int *data, int len); // Values returned by get_tx_char() to signal various conditions to the // modems. These values need to be negative so they don't interfere with // normal TX data (which is always byte-sized and positive). #define GET_TX_CHAR_NODATA -1 // no data available #define GET_TX_CHAR_ETX -3 // end of transmission requested extern int get_tx_char(); extern int get_secondary_char(); extern void put_echo_char(unsigned int data, int style = FTextBase::XMIT); extern char *get_rxtx_data(); extern char *get_rx_data(); extern char *get_tx_data(); extern void resetRTTY(); extern void resetOLIVIA(); extern void resetCONTESTIA(); extern void resetTHOR(); extern void resetDOMEX(); extern void resetSoundCard(); extern void restoreFocus(Fl_Widget* w = 0); extern void setReverse(int); extern void clearQSO(); extern void closeRigDialog(); extern void CloseQsoView(); extern void setAfcOnOff(bool b); extern void setSqlOnOff(bool b); extern bool QueryAfcOnOff(); extern bool QuerySqlOnOff(); extern void init_modem(trx_mode mode, int freq = 0); extern void init_modem_sync(trx_mode mode, int freq = 0); extern void init_modem_squelch(trx_mode mode, int freq = 0); extern void start_tx(); extern void abort_tx(); extern void LOGGING_colors_font(); extern void LOGBOOK_colors_font(); extern void colorize_macro(int i); extern void colorize_macros(); extern void set_rtty_tab_widgets(); extern void set_olivia_tab_widgets(); extern void set_olivia_default_integ(); extern void set_dominoex_tab_widgets(); extern void set_contestia_tab_widgets(); extern void set_contestia_default_integ(); extern void startMacroTimer(); extern void stopMacroTimer(); extern void macro_timer(void *); extern void macro_timed_execute(void *); extern void startTimedExecute(std::string &); extern void cb_ResetSerNbr(); extern void updateOutSerNo(); extern void connect_to_log_server(void *p = NULL); extern void set_server_label(bool); extern void activate_menu_item(const char *caption, bool val); extern bool xml_check_dup(); extern bool xml_get_record(const char *); extern const char* zdate(void); extern const char* ztime(void); extern void setTabColors(); extern void toggle_visible_modes(Fl_Widget*, void*); extern void qsy(long long rfc, int fmid = -1); extern void note_qrg(bool no_dup = true, const char* prefix = " ", const char* suffix = " ", trx_mode mode = NUM_MODES, long long rfc = 0LL, int afreq = 0); extern void set_olivia_bw(int bw); extern void set_olivia_tones(int tones); extern void set_contestia_bw(int bw); extern void set_contestia_tones(int tones); extern void set_rtty_shift(int shift); extern void set_rtty_baud(float baud); extern void set_rtty_bits(int bits); extern void set_rtty_bw(float bw); extern void sync_cw_parameters(); extern void open_recv_folder(const char *fname); extern void reset_mnuPlayback(); // character set extern void set_charset_listbox(Fl_Widget *, void *charset); extern void cb_listbox_charset(Fl_Widget *, void *); extern void populate_charset_listbox(void); extern void set_default_charset(void); // set notch parameter on flrig extern int notch_frequency; extern void notch_on(int); extern void notch_off(); // thread terminators extern void ADIF_RW_close(void); extern void EQSL_close(void); // notifier dialogs extern Fl_Double_Window *notify_window; extern Fl_Double_Window *dxcc_window; extern void cb_mnuCheckUpdate(Fl_Widget *, void *); bool ask_dir_creation( const std::string & dir ); #endif fldigi-3.21.80/src/include/status.h0000664000175000017500000000617012313147652013764 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _status_H #define _status_H #include #include "globals.h" struct status { trx_mode lastmode; std::string mode_name; int mainX; int mainY; int mainW; int mainH; bool WF_UI; bool NO_RIGLOG; bool Rig_Log_UI; bool Rig_Contest_UI; bool DOCKEDSCOPE; int RxTextHeight; int tiled_group_x; bool show_channels; int rigX; int rigY; int rigW; int rigH; int carrier; int noCATfreq; std::string noCATmode; std::string noCATwidth; int mag; int offset; int speed; double reflevel; double ampspan; unsigned int VIEWERnchars; unsigned int VIEWERxpos; unsigned int VIEWERypos; unsigned int VIEWERwidth; unsigned int VIEWERheight; double VIEWER_psksquelch; double VIEWER_rttysquelch; bool VIEWERvisible; int tile_x; int tile_w; int tile_y; int tile_h; bool LOGenabled; double sldrSquelchValue; bool afconoff; bool sqlonoff; double RcvMixer; double XmtMixer; int scopeX; int scopeY; bool scopeVisible; int scopeW; int scopeH; int repeatMacro; float repeatIdleTime; int timer; int timerMacro; std::string LastMacroFile; int n_rsids; bool spot_recv; bool spot_log; bool contest; bool quick_entry; bool rx_scroll_hints; bool rx_word_wrap; bool tx_word_wrap; int logbook_x; int logbook_y; int logbook_w; int logbook_h; bool logbook_reverse; int logbook_col_0; int logbook_col_1; int logbook_col_2; int logbook_col_3; int logbook_col_4; int logbook_col_5; // Contestia, Olivia, RTTY state values int contestiatones; int contestiabw; int contestiamargin; int contestiainteg; bool contestia8bit; int oliviatones; int oliviabw; int oliviamargin; int oliviainteg; bool olivia8bit; int rtty_shift; int rtty_custom_shift; int rtty_baud; int rtty_bits; int rtty_parity; int rtty_stop; bool rtty_reverse; bool rtty_crcrlf; bool rtty_autocrlf; int rtty_autocount; int rtty_afcspeed; bool rtty_filter_changed; bool useFSKkeyline; bool useFSKkeylineDTR; bool FSKisLSB; bool useUART; bool PreferXhairScope; bool PseudoFSK; bool UOSrx; bool UOStx; // end Contestia, Olivia, RTTY state values std::string browser_search; bool bLastStateRead; void initLastState(); void saveLastState(); void loadLastState(); }; extern status progStatus; #endif fldigi-3.21.80/src/include/picture.h0000664000175000017500000000616512313064025014110 00000000000000// ---------------------------------------------------------------------------- // picture.h // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef picture_H #define picture_H #include #include #include class picture : public Fl_Widget { private: unsigned char *vidbuf; int bufsize; int width; int height; int numcol; int slantdir; void slant_corr(int x, int y); void slant_undo(); int zoom ; int background ; bool binary ; unsigned char binary_threshold ; inline unsigned char pix2bin( unsigned char x ) const { return x < binary_threshold ? 0 : 255 ; } static void draw_cb(void *data, int x, int y, int w, uchar *buf); void resize_zoom(int, int, int, int); public: picture(int, int, int, int, int bg_col = 0); ~picture(); void video(unsigned char const *, int); void pixel(unsigned char data, int pos) { if (pos < 0 || pos >= bufsize) { return ; } FL_LOCK_D(); vidbuf[pos] = data; if (pos % (width * depth) == 0) redraw(); FL_UNLOCK_D(); } unsigned char pixel(int); int handle(int); void draw(); void clear(); void image(Fl_Image *img) {Fl_Widget::image(img);} void resize(int, int, int, int); void resize_height(int new_height, bool clear_img); void shift_horizontal_center(int hShift); void stretch(double the_ratio); int save_png(const char * filename, bool monochrome = false, const char * extra_comments = NULL); void set_zoom(int the_zoom); void set_binary(bool bin_mode) { binary = bin_mode ;} int pix_width(void) const { return width ; } int pix_height(void) const { return height ; } const unsigned char * buffer(void) const { return vidbuf; } /// Sometimes the row number goes back of one due to rounding error. /// If this happens, noise removal does not work. static const int noise_height_margin = 5 ; void remove_noise( int row, int half_len, int noise_margin ); static const int depth = 3; private: bool restore( int row, int margin ); public: void dilatation( int row ); void erosion( int row ); void set_binary_threshold(unsigned char thres) { binary_threshold = thres ; } unsigned char get_binary_threshold() const { return binary_threshold ; } }; class picbox : public Fl_Box { public: picbox(int x, int y, int w, int h, const char* l = 0) : Fl_Box(x, y, w, h, l) { } int handle(int event); }; #endif fldigi-3.21.80/src/include/timeops.h0000664000175000017500000000405512313064025014111 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef TIMEOPS_H_ #define TIMEOPS_H_ #include #include #include #ifdef __MINGW32__ # include #endif #if !HAVE_CLOCK_GETTIME enum clockid_t { CLOCK_REALTIME, CLOCK_MONOTONIC }; int clock_gettime(clockid_t clock_id, struct timespec* tp); #endif struct timespec operator+(const struct timespec &t0, const double &t); struct timespec operator-(const struct timespec &t0, const struct timespec &t1); struct timespec& operator-=(struct timespec &t0, const struct timespec &t1); bool operator>(const struct timespec &t0, const struct timespec &t1); bool operator==(const struct timespec &t0, const struct timespec &t1); struct timeval operator+(const struct timeval &t0, const double &t); struct timeval operator-(const struct timeval &t0, const struct timeval &t1); struct timeval& operator-=(struct timeval &t0, const struct timeval &t1); bool operator>(const struct timeval &t0, const struct timeval &t1); bool operator==(const struct timeval &t0, const struct timeval &t1); #ifndef GMTIME_R extern struct tm *gmtime_r(const time_t *timer, struct tm *tmbuf); extern struct tm *localtime_r(const time_t *_Time,struct tm *_Tm); #endif #endif // TIMEOPS_H_ fldigi-3.21.80/src/include/rigio.h0000664000175000017500000000321112313064025013533 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef RIGIO_H #define RIGIO_H #include #include "serial.h" extern Cserial rigio; extern bool hexout(const std::string&); extern bool sendCommand(std::string, int retnbr, int waitval); extern long long rigCAT_getfreq(int retries, bool &failed, int multiplier = 1); extern void rigCAT_setfreq(long long); extern std::string rigCAT_getmode(); extern void rigCAT_setmode(const std::string&); extern std::string rigCAT_getwidth(); extern void rigCAT_setwidth(const std::string&); extern void rigCAT_close(); extern bool rigCAT_init(bool); extern void rigCAT_sendINIT(const std::string& icmd, int multiplier = 1); extern void rigCAT_set_ptt(int); extern void rigCAT_set_qsy(long long f); extern void rigCAT_defaults(); extern void rigCAT_restore_defaults(); #endif fldigi-3.21.80/src/include/dtmf.h0000664000175000017500000000412412313064025013360 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "filters.h" class cDTMF { private: //#define N 240 // 30 msec interval at 8000 sps #define RANGE 0.5 /* any thing higher than RANGE*peak is "on" */ #define THRESH 1000 /* 6 dB s/n for detection */ #define FLUSH_TIME 10 /* 10 frames ~ 330 millisecond */ #define NUMTONES 8 private: double power[NUMTONES]; double thresh; double maxpower; double minpower; double data[350]; goertzel *filt[NUMTONES]; int framesize; static double coef[]; static int k[]; static const char *dtran[]; static int row[]; static int col[]; static const char rc[]; double outbuf[16384]; double shape[128]; int RT; int duration; int silence_time; int last; std::string dtmfchars; public: cDTMF() { for (int i = 0; i < 4; i++) filt[i] = new goertzel(240, row[i], 8000); for (int i = 0; i < 4; i++) filt[i+4] = new goertzel(240, col[i], 8000); for (int i = 0; i < 240; i++) data[i] = 0; dtmfchars.clear(); framesize = 240; // 8000 sr default silence_time = 0; last = ' '; } ~cDTMF() {}; // receive void calc_power(); int decode(); void receive(const float* buf, size_t len); // transmit void makeshape(); void silence(int); void two_tones(int); void send(); }; fldigi-3.21.80/src/include/waterfall.h0000664000175000017500000002010312313064025014402 00000000000000// ---------------------------------------------------------------------------- // Waterfall Spectrum Analyzer Widget // Copyright (C) 2006-2010 Dave Freese, W1HKJ // Copyright (C) 2008 Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _WF_H #define _WF_H #include #include #include #include #include #include #include #include "gfft.h" #include "fldigi-config.h" #include "digiscope.h" #include "flslider2.h" enum { WF_FFT_RECTANGULAR, WF_FFT_BLACKMAN, WF_FFT_HAMMING, WF_FFT_HANNING, WF_FFT_TRIANGULAR }; #define FFT_LEN 8192 #define SC_SMPLRATE 8000 #define WFBLOCKSIZE 512 struct RGB { uchar R; uchar G; uchar B; }; struct RGBI { uchar R; uchar G; uchar B; uchar I; }; // you can change the basic fft processing type by a simple change in the // following typedef. change to float if you need to skimp on cpu cycles. typedef double wf_fft_type; typedef std::complex wf_cpx_type; extern RGBI mag2RGBI[256]; extern RGB palette[9]; enum WFmode { WATERFALL, SPECTRUM, SCOPE, NUM_WF_MODES }; #define MAG_1 1 #define MAG_2 2 #define MAG_4 3 //enum WFspeed {FAST = 1, NORMAL = 2, SLOW = 8}; enum WFspeed { PAUSE = 0, FAST = 1, NORMAL = 2, SLOW = 4 }; extern void do_qsy(bool); class WFdisp : public Fl_Widget { public: WFdisp (int x, int y, int w, int h, char *lbl = 0); ~WFdisp (); int wfmag(); int setMag(int m); void setOffset(int v); void Mode(WFmode M) { mode = M; } WFmode Mode() { return mode; } int cursorFreq(int xpos) { return (offset + step * xpos); } void Ampspan(double AmpSpn) { ampspan = (int)AmpSpn; } double Ampspan() { return ampspan; } void Reflevel(double RefLev) { reflevel = (int)RefLev; } double Reflevel() { return reflevel; } void Bandwidth (int bw) { bandwidth = bw; makeMarker(); } int Bandwidth () { return bandwidth; } void Overload(int ovr) { if (overload == ovr) return; overload = ovr; } double AudioPeak() { return peakaudio; } WFspeed Speed() { return wfspeed;} void Speed(WFspeed rate) { wfspeed = rate;} int Mag() { return mag;} void Mag(int m) { setMag(m);} int Offset() { return offset;} void Offset(int v) { setOffset(v);} void initmaps(); void draw(); int handle(int event); void update_sigmap(); void update_waterfall(); void checkoffset(); void slew(int); void movetocenter(); void carrier(int cf); int carrier(); inline void makeNotch_(int notch_frequency); inline void makeMarker_(int width, const RGB* color, int freq, const RGB* clrMin, RGB* clrM, const RGB* clrMax); void makeMarker(); void process_analog(wf_fft_type *sig, int len); void processFFT(); void sig_data( double *sig, int len, int sr ); void rfcarrier(long long f) { rfc = f; } void USB(bool b) { usb = b; } bool USB() {return usb;}; long long rfcarrier() { return rfc;}; void updateMarker() { drawMarker();}; int peakFreq(int f0, int delta); double powerDensity(double f0, double bw); double powerDensityMaximum(int bw_nb, const int (*bw)[2]) const ; void setPrefilter(int v); void setcolors(); double dFreq() {return dfreq;} void redrawCursor(); void defaultColors(); private: int disp_width; int image_width; int scale_width; int RGBwidth; int RGBsize; int image_height; int image_area; int sig_image_area; int mag; int magset; WFmode mode; bool overload; bool usb; long long rfc; int offset; int sigoffset; int step; int carrierfreq; int bandwidth; int wfspdcnt; int dispcnt; int ampspan; double peakaudio; int reflevel; double dfreq; bool centercarrier; bool cursormoved; WFspeed wfspeed; int srate; RGBI *fft_img; RGB *markerimage; RGB RGBmarker; RGB RGBcursor; RGBI RGBInotch; double *fftwindow; uchar *scaleimage; uchar *fft_sig_img; uchar *sig_img; uchar *scline; wf_cpx_type *wfbuf; short int *fft_db; int ptrFFTbuff; double *circbuff; int ptrCB; wf_fft_type *pwr; g_fft *wfft; int prefilter; int checkMag(); void checkWidth(); void initMarkers(); void makeScale(); void drawScale(); void drawMarker(); int log2disp(int v); void drawcolorWF(); void drawgrayWF(); void drawspectrum(); void drawsignal(); protected: public: bool wantcursor; int cursorpos; int newcarrier; int oldcarrier; bool tmp_carrier; double Pwr(int i) { if ( i > 0 && i < IMAGE_WIDTH) return pwr[i]; return 0.0; } }; class waterfall: public Fl_Group { friend void x1_cb(Fl_Widget *w, void* v); friend void slew_left(Fl_Widget *w, void * v); friend void slew_right(Fl_Widget *w, void * v); friend void center_cb(Fl_Widget *w, void *v); friend void carrier_cb(Fl_Widget *w, void *v); friend void mode_cb(Fl_Widget *w, void *v); friend void reflevel_cb(Fl_Widget *w, void *v); friend void ampspan_cb(Fl_Widget *w, void *v); friend void qsy_cb(Fl_Widget *w, void *v); friend void rate_cb(Fl_Widget *w, void *v); friend void btnMem_cb(Fl_Widget *w, void *v); public: waterfall(int x, int y, int w, int h, char *lbl= 0); ~waterfall(){}; void show_scope(bool on); void opmode(); void sig_data(double *sig, int len, int sr){ wfdisp->sig_data(sig, len, sr); } void Overload(bool ovr) { wfdisp->Overload(ovr); } int carrier() { return wfdisp->carrier(); } void carrier(int f); void rfcarrier(long long cf); long long rfcarrier(); bool tmp_carrier(void) { return wfdisp->tmp_carrier; } void set_XmtRcvBtn(bool val); void USB(bool b); bool USB(); void Reverse( bool v) { reverse = v;} bool Reverse() { return reverse;} void xmtrcv_selection_color(Fl_Color clr) {xmtrcv->selection_color(clr);} void reverse_selection_color(Fl_Color clr) {btnRev->selection_color(clr);} void xmtlock_selection_color(Fl_Color clr) {xmtlock->selection_color(clr);} void Bandwidth(int bw) { wfdisp->Bandwidth(bw); } int peakFreq(int f0, int delta) { return (wfdisp->peakFreq(f0, delta)); } double powerDensity(double f0, double bw) { return (wfdisp->powerDensity(f0,bw)); } double powerDensityMaximum(int bw_nb, const int (*bw)[2]) const { return (wfdisp->powerDensityMaximum(bw_nb,bw)); } int Speed(); void Speed(int rate); int Mag(); void Mag(int m); int Offset(); void Offset(int v); int Carrier(); void Carrier(int f); void movetocenter() { wfdisp->movetocenter();} void redraw_marker() { wfdisp->makeMarker(); } void setPrefilter(int v) {wfdisp->setPrefilter(v);} void setcolors() { wfdisp->setcolors(); } void setRefLevel(); void setAmpSpan(); double dFreq() { return wfdisp->dFreq();} void setQSY(bool on) { if (on) qsy->activate(); else qsy->deactivate(); } double Pwr(int i) { return wfdisp->Pwr(i); } int handle(int event); void insert_text(bool check = false); enum { WF_NOP, WF_AFC_BW, WF_SIGNAL_SEARCH, WF_SQUELCH, WF_CARRIER, WF_MODEM, WF_SCROLL }; static const char* wf_wheel_action[7]; void handle_mouse_wheel(int what, int d); Fl_Button *btnRev; Fl_Counter2 *wfcarrier; Fl_Counter2 *wfRefLevel; Fl_Counter2 *wfAmpSpan; Fl_Light_Button *xmtrcv; Fl_Light_Button *xmtlock; Fl_Button *qsy; void UI_select(bool); Digiscope *wfscope; private: bool ishidden; int wf_dim; Fl_Box *bezel; WFdisp *wfdisp; Fl_Group *rs1, *rs2, *hidden; Fl_Button *mode; Fl_Button *x1; Fl_Button *left; Fl_Button *center; Fl_Button *right; Fl_Button *wfrate; Fl_Button *btnMem; Fl_Menu_Button *mbtnMem; int buttonrow; bool reverse; }; #endif fldigi-3.21.80/src/include/pskcoeff.h0000664000175000017500000000216312313064025014227 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _COEFF_H #define _COEFF_H #define FIRLEN 64 extern double gmfir1c[FIRLEN]; extern double gmfir2c[FIRLEN]; extern double syncfilt[16]; extern void raisedcosfilt(double *); extern void wsincfilt(double *, double fc, bool blackman); #endif fldigi-3.21.80/src/include/testmodem.h0000664000175000017500000000217212313064025014430 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include "trx.h" class psktest : public trx { public: psktest(char *dev) : trx(dev) {}; ~psktest(){}; protected: virtual void txinit (){}; virtual void rxinit (){}; virtual int txprocess (){}; virtual int rxprocess (unsigned char *, int len){}; }; fldigi-3.21.80/src/include/textio.h0000664000175000017500000000241412313064025013742 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef MULTIPSK_H #define MULTIPSK_H #include "qso_db.h" class cTextFile { private: char header[120]; void makeHeader(); char *adif_to_date( char *s); char *adif_to_time( char *s); public: cTextFile () {}; ~cTextFile () {}; void writeCSVHeader(FILE *); int writeCSVFile (const char *, cQsoDb *); void writeTXTHeader(FILE *); int writeTXTFile (const char *, cQsoDb *); }; #endif fldigi-3.21.80/src/include/jalocha/0000775000175000017500000000000012313333726013744 500000000000000fldigi-3.21.80/src/include/jalocha/pj_cmpx.h0000664000175000017500000001234712313064025015475 00000000000000 // Complex numbers // (c) 1999-2003, Pawel Jalocha #ifndef __CMPX_H__ #define __CMPX_H__ #include #include // ---------------------------------------------------------------------------- // float/double/other-complex type template class Cmpx { public: Type Re,Im; public: template Cmpx const &operator=(const Cmpx &New) { Re=New.Re; Im=New.Im; return (*this); } template Cmpx const &operator=(const Type2 &New) { Re=New; Im=0; return (*this); } template void Set(Type2 NewRe, Type2 NewIm=0) { Re=NewRe; Im=NewIm; } template void Set(Cmpx New) { Re=New.Re; Im=New.Im; } void SetPhase(double Phase, double Mag=1.0) { Re=Mag*cos(Phase); Im=Mag*sin(Phase); } void Conugate(void) { Im=(-Im); } void Negate(void) { Re=(-Re); Im=(-Im); } void QuarterTurnLeft(void) { Type OldIm=Im; Im=Re; Re=(-OldIm); } void QuarterTurnRight(void) { Type OldIm=Im; Im=(-Re); Re=OldIm; } double Energy(void) { return Re*Re+Im*Im; } double Mag2(void) { return Re*Re+Im*Im; } double Mag(void) { return sqrt(Re*Re+Im*Im); } double Phase(void) { return atan2(Im,Re); } int Zero(void) { return (Re==0)&&(Im==0); } int NotZero(void) { return (Re!=0)||(Im!=0); } // template // void operator *= (const Type2 Mult) // { Re*=Mult; Im*=Mult; } // template // void operator /= (const Type2 Mult) // { Re*=Mult; Im*=Mult; } template double VectDotProd(Cmpx X) { return Re*X.Re+Im*X.Im; } void Print(char *Form="%+6.3f") { printf("["); printf(Form,Re); printf(","); printf(Form,Im); printf("]"); } } ; typedef Cmpx fcmpx; typedef Cmpx dcmpx; // Some complex operators: // at least with the BC++ they carry some overhead because // a function is always called instead of making the code inline. template // equal (both Re and Im) ? inline int operator ==(Cmpx &Left, Cmpx &Right) { return (Left.Re==Right.Re)&&(Left.Im==Right.Im); } template // equal (both Re and Im) ? inline int operator !=(Cmpx &Left, Cmpx &Right) { return (Left.Re!=Right.Re)||(Left.Im!=Right.Im); } template // equal ? inline int operator ==(Cmpx &Left, type &Right) { return (Left.Re==Right)&&(Left.Im==0); } template // not equal ? inline int operator !=(Cmpx &Left, RightType &Right) { return (Left.Re!=Right)||(Left.Im!=0); } template // bigger (magnitude) ? inline int operator >(Cmpx &Left, Cmpx &Right) { return Left.Mag2() > Right.Mag2(); } template // smaller (magnitude) ? inline int operator <(Cmpx &Left, Cmpx &Right) { return Left.Mag2() < Right.Mag2(); } template // addition to the argument on the left inline void operator +=(Cmpx &Dst, Cmpx &Src) { Dst.Re+=Src.Re; Dst.Im+=Src.Im; } template // subtraction from the argument on the left inline void operator -=(Cmpx &Dst, Cmpx &Src) { Dst.Re-=Src.Re; Dst.Im-=Src.Im; } template // multiplication by a scalar inline void operator *=(Cmpx &Dst, num Src) { Dst.Re*=Src; Dst.Im*=Src; } template // multiplication by another complex number inline void operator *=(Cmpx &Dst, Cmpx Src) { type Re=Dst.Re*Src.Re-Dst.Im*Src.Im; type Im=Dst.Re*Src.Im+Dst.Im*Src.Re; Dst.Re=Re; Dst.Im=Im; } template // division by a scalar inline void operator /=(Cmpx &Dst, num Src) { Dst.Re/=Src; Dst.Im/=Src; } template // scalar multiplication inline double operator *(Cmpx &Left, Cmpx &Right) { return Left.Re*Right.Re+Left.Im*Right.Im; } // some arithmetic functions: // scalar product of two vectors template inline double ScalProd(Cmpx &A, Cmpx &B) { return A.Re*B.Re+A.Im*B.Im; } template inline double ScalProd(typeA Ia, typeA Qa, Cmpx &B) { return Ia*B.Re+Qa*B.Im; } // complex multiply template inline void CmpxMultAxB(Cmpx &Dst, Cmpx &A, Cmpx &B) { Dst.Re=A.Re*B.Re-A.Im*B.Im; Dst.Im=A.Re*B.Im+A.Im*B.Re; } template inline void CmpxMultAxB(typeDst &DstI, typeDst &DstQ, Cmpx &A, Cmpx &B) { DstI=A.Re*B.Re-A.Im*B.Im; DstQ=A.Re*B.Im+A.Im*B.Re; } // complex multiply, second argument with a "star" (B.im is negated) // (effectively subtracts the phase of the second argument) template inline void CmpxMultAxBs(Cmpx &Dst, Cmpx &A, Cmpx &B) { Dst.Re=A.Re*B.Re+A.Im*B.Im; Dst.Im=A.Im*B.Re-A.Re*B.Im; } template void CmpxSqrt(Cmpx &X) { Type Mag=X.Mag(); int NegIm=(X.Im<0); X.Im=sqrt((Mag-X.Re)/2); X.Re=sqrt((Mag+X.Re)/2); if(NegIm) X.Re=(-X.Re); } template void CmpxSquare(Cmpx &X) { Type Re=X.Re*X.Re-X.Im*X.Im; X.Im=2*X.Re*X.Im; X.Re=Re; } // ---------------------------------------------------------------------------- #endif /* __CMPX_H__ */ fldigi-3.21.80/src/include/jalocha/pj_lowpass3.h0000664000175000017500000000235612313064025016300 00000000000000 #ifndef __LOWPASS3_H__ #define __LOWPASS3_H__ // ========================================================================== // IIR low pass filter for integration (averaging) purposes // Overshoot is about 1% for Feedback=0.5, and about 1e-6 for Feedback=0.1 // Weight is 1 / PeakingTime template class LowPass3_Filter { public: Type Out1, Out2, Output; template void Process(InpType Inp, WeightType Weight, WeightType Feedback = 0.1) { Weight *= 2.0; Type DiffI1 = Inp; DiffI1 -= Out1; Type Diff12 = Out1; Diff12 -= Out2; Type Diff23 = Out2; Diff23 -= Output; DiffI1 *= Weight; Out1 += DiffI1; Diff12 *= Weight; Out2 += Diff12; Diff23 *= Weight; Output += Diff23; Diff23 *= Feedback; Out2 += Diff23; } template void operator = (LevelType Level) { Out1 = Level; Out2 = Level; Output=Level; } template void Set(LevelType Level=0) { Out1 = Level; Out2 = Level; Output=Level; } }; // ========================================================================== #endif // of __LOWPASS3_H__ fldigi-3.21.80/src/include/jalocha/pj_mfsk.h0000664000175000017500000021265012313064025015465 00000000000000// MFSK trasnmitter and receiver code, Pawel Jalocha, December 2004 #ifndef __PJ_MFSK_H__ #define __PJ_MFSK_H__ // ===================================================================== #include #include #include #include "pj_struc.h" #include "pj_fht.h" #include "pj_cmpx.h" #include "pj_fft.h" #include "pj_gray.h" #include "pj_lowpass3.h" #include "pj_fifo.h" // ===================================================================== static inline size_t Exp2(uint32_t X) { return (uint32_t)1 << X; } static inline size_t Log2(uint32_t X) { uint32_t Y; for ( Y = 0; X > 1; X >>= 1) Y += 1; return Y; } // ===================================================================== // the symbol shape described in frequency domain static const double MFSK_SymbolFreqShape[] = { 1.0, 1.0 } ; // use raised cosine shape - experimental // from gMFSK // { +1.0000000000, // +1.1913785723, // -0.0793018558, // -0.2171442026, // -0.0014526076 //}; // from DM780 //{ // +1.0000000000, // +2.1373197349, // +1.1207588117, // -0.0165609232 //}; static const size_t MFSK_SymbolFreqShapeLen = sizeof(MFSK_SymbolFreqShape) / sizeof(double); // ===================================================================== template class MFSK_Modulator { public: // parameters to be set before calling Preset() size_t SymbolLen; // length of the symbol, must be a power of 2 size_t FirstCarrier; // first carrier in terms of FFT freq. bins size_t BitsPerSymbol; // bits per symbol => number of carriers/tones int UseGrayCode; static const size_t CarrierSepar = 2; // parameters that are calculated by Preset() size_t Carriers; // number of tones/carriers size_t SymbolSepar; // time distance between symbols int SymbolPhase; // the phase of the tone being transmitted int Reverse; // send carriers in reverse order? private: Type *CosineTable; // Cosine table for fast cos/sin calculation Type *SymbolShape; // the shape of the symbol Type *OutTap; // output tap (buffer) size_t TapPtr; size_t WrapMask; public: MFSK_Modulator() { Init(); Default(); } ~MFSK_Modulator() { Free(); } void Init(void) { CosineTable = 0; SymbolShape = 0; OutTap = 0; } void Free(void) { free(CosineTable); CosineTable = 0; free(SymbolShape); SymbolShape = 0; free(OutTap); OutTap = 0; } void Default(void) { SymbolLen = 512; FirstCarrier = 32; BitsPerSymbol = 5; Reverse = 0; UseGrayCode = 1; } int Preset(void) { size_t Idx; Carriers = Exp2(BitsPerSymbol); SymbolSepar = SymbolLen / 2; if (ReallocArray(&CosineTable, SymbolLen) < 0) goto Error; for (Idx = 0; Idx < SymbolLen; Idx++) CosineTable[Idx] = cos((2*M_PI*Idx) / SymbolLen); if (ReallocArray(&SymbolShape, SymbolLen) < 0) goto Error; { size_t Time; double Ampl = MFSK_SymbolFreqShape[0]; for (Time = 0; Time < SymbolLen; Time++) SymbolShape[Time] = Ampl; } size_t Freq; for (Freq = 1; Freq < MFSK_SymbolFreqShapeLen; Freq++) { size_t Time; double Ampl = MFSK_SymbolFreqShape[Freq]; if (Freq & 1) Ampl = (-Ampl); size_t Phase = 0; for (Time = 0; Time < SymbolLen; Time++) { SymbolShape[Time] += Ampl*CosineTable[Phase]; Phase += Freq; if (Phase >= SymbolLen) Phase-=SymbolLen; } } { size_t Time; double Scale = 1.0/4; for (Time = 0; Time < SymbolLen; Time++) SymbolShape[Time] *= Scale; } if (ReallocArray(&OutTap, SymbolLen) < 0) goto Error; for (Idx = 0; Idx < SymbolLen; Idx++) OutTap[Idx] = 0; TapPtr = 0; WrapMask = SymbolLen-1; SymbolPhase = 0; return 0; Error: Free(); return -1; } void Send(uint8_t Symbol) { if (UseGrayCode) Symbol=GrayCode(Symbol); int SymbolFreq; if (Reverse == 1) { int RevFirstCar=FirstCarrier-2; SymbolFreq=RevFirstCar-CarrierSepar*Symbol; } else { SymbolFreq=FirstCarrier+CarrierSepar*Symbol; } int TimeShift=SymbolSepar/2-SymbolLen/2; SymbolPhase+=SymbolFreq*TimeShift; SymbolPhase&=WrapMask; AddSymbol(SymbolFreq,SymbolPhase); TimeShift=SymbolSepar/2+SymbolLen/2; SymbolPhase+=SymbolFreq*TimeShift; SymbolPhase&=WrapMask; int PhaseDiffer=SymbolLen/4; if (rand()&1) PhaseDiffer=(-PhaseDiffer); SymbolPhase+=PhaseDiffer; SymbolPhase&=WrapMask; } // get output as 16-bit signed data int Output(int16_t *Buffer) { const Type Scale = 32768.0; const int32_t Limit = 0x7FFF; size_t Idx; for (Idx = 0; Idx < SymbolSepar; Idx++) { Type Ampl = OutTap[TapPtr]; Ampl *= Scale; int32_t Out = (int32_t)floor(Ampl + 0.5); if (Out > Limit) Out = Limit; else if (Out < (-Limit)) Out = (-Limit); Buffer[Idx] = (int16_t)Out; OutTap[TapPtr] = 0; TapPtr += 1; TapPtr &= WrapMask; } return SymbolSepar; } template int Output(OutType *Buffer) { size_t Idx; for (Idx = 0; Idx < SymbolSepar; Idx++) { Buffer[Idx] = OutTap[TapPtr]; OutTap[TapPtr] = 0; TapPtr += 1; TapPtr &= WrapMask; } return SymbolSepar; } private: void AddSymbol(int Freq, int Phase) { size_t Time; for (Time = 0; Time < SymbolLen; Time++) { // experimental use with {1.0, 1.0}; Type Shape=1.0-CosineTable[Time]; OutTap[TapPtr] += CosineTable[Phase] * Shape; // OutTap[TapPtr] += CosineTable[Phase] * SymbolShape[Time]; Phase += Freq; Phase &= WrapMask; TapPtr += 1; TapPtr &= WrapMask; } } } ; // ===================================================================== template class BoxFilter { public: size_t Len; TapType *Tap; size_t Ptr; OutType Output; BoxFilter() { Tap = 0; } ~BoxFilter() { free(Tap); } void Free(void) { free(Tap); Tap = 0; } int Preset(void) { if (ReallocArray(&Tap, Len) < 0) return -1; Clear(); return 0; } void Clear(void) { size_t Idx; for (Idx = 0; Idx < Len; Idx++) Tap[Idx] = 0; Ptr = 0; Output = 0; } template void Process(InpType Input) { Output -= Tap[Ptr]; Output += Input; Tap[Ptr] = Input; Ptr += 1; if (Ptr >= Len) Ptr -= Len; } }; // ===================================================================== template class MFSK_InputProcessor { public: size_t WindowLen; size_t WrapMask; Type *InpTap; size_t InpTapPtr; Type *OutTap; size_t OutTapPtr; Type *WindowShape; size_t SliceSepar; r2FFT< Cmpx > FFT; // FFT engine Cmpx *FFT_Buff; // FFT buffer size_t SpectraLen; Cmpx *Spectra[2]; Type *Output; Type *Energy; BoxFilter Filter; public: MFSK_InputProcessor() { Init(); Default(); } ~MFSK_InputProcessor() { Free(); } void Init(void) { InpTap = 0; OutTap = 0; WindowShape = 0; FFT_Buff = 0; Spectra[0] = 0; Spectra[1] = 0; Output = 0; Energy = 0; } void Free(void) { free(InpTap); InpTap = 0; free(OutTap); OutTap = 0; free(WindowShape); WindowShape = 0; free(FFT_Buff); FFT_Buff = 0; free(Spectra[0]); Spectra[0] = 0; free(Spectra[1]); Spectra[1] = 0; free(Output); Output = 0; free(Energy); Energy = 0; FFT.Free(); Filter.Free(); } void Default(void) { WindowLen = 8192; } int Preset(void) { size_t Idx; WrapMask = WindowLen - 1; Type ShapeScale = 2.0 / WindowLen; if (ReallocArray(&InpTap, WindowLen) < 0) goto Error; ClearArray(InpTap, WindowLen); InpTapPtr = 0; if (ReallocArray(&OutTap, WindowLen) < 0) goto Error; ClearArray(OutTap, WindowLen); OutTapPtr = 0; if (FFT.Preset(WindowLen) < 0) goto Error; if (ReallocArray(&FFT_Buff, WindowLen) < 0) goto Error; SliceSepar = WindowLen / 2; if (ReallocArray(&WindowShape, WindowLen)< 0) goto Error; for (Idx = 0; Idx < WindowLen; Idx++) WindowShape[Idx] = ShapeScale * sqrt(1.0 - FFT.Twiddle[Idx].Re); SpectraLen = WindowLen / 2; if (ReallocArray(&Spectra[0], SpectraLen) < 0) goto Error; if (ReallocArray(&Spectra[1], SpectraLen) < 0) goto Error; if (ReallocArray(&Output, WindowLen) < 0) goto Error; ClearArray(Output, WindowLen); if (ReallocArray(&Energy, SpectraLen) < 0) goto Error; Filter.Len = WindowLen / 16; if (Filter.Preset() < 0) goto Error; return 0; Error: Free(); return -1; } void Reset(void) { ClearArray(InpTap, WindowLen); InpTapPtr = 0; ClearArray(OutTap, WindowLen); OutTapPtr = 0; } void LimitSpectraPeaks( Cmpx *Spectra, size_t Len = 64, Type Threshold = 4.0) { Filter.Len = Len; Filter.Preset(); size_t MaxFreq = 3 * (SpectraLen / 4); size_t Freq, Idx; for (Freq = 0; Freq < Len; Freq++) Filter.Process(Energy[Freq]); for (Idx = Len / 2; Freq < MaxFreq; Freq++,Idx++) { Filter.Process(Energy[Freq]); Type Signal = Energy[Idx]; Type Limit = (Filter.Output/Len) * Threshold; if (Signal > Limit) { Spectra[Idx] *= sqrt(Limit / Signal); Energy[Idx] = Limit; } } } void LimitOutputPeaks(Type Threshold = 2.5) { size_t Idx; Type RMS = 0; for (Idx = 0; Idx < WindowLen; Idx++) { Type Signal = Output[Idx]; RMS += Signal * Signal; } RMS = sqrt(RMS / WindowLen); Type Limit = RMS * Threshold; for (Idx = 0; Idx < WindowLen; Idx++) { Type Signal = Output[Idx]; if (Signal > Limit) Output[Idx] = Limit; else if (Signal < (-Limit)) Output[Idx] = (-Limit); } } void AverageEnergy(size_t Len = 32) { Filter.Len = Len; Filter.Preset(); size_t MaxFreq = 3 * (SpectraLen / 4); Type Scale = 1.0 / Len; size_t Len2 = Len / 2; size_t Idx, Freq; for (Freq = 0; Freq < Len; Freq++) Filter.Process(Energy[Freq]); for (Idx = 0; Idx < Len2; Idx++) Energy[Idx] = Filter.Output * Scale; for ( ; Freq < MaxFreq; Freq++,Idx++) { Filter.Process(Energy[Freq]); Energy[Idx] = Filter.Output * Scale; } for ( ; Idx < SpectraLen; Idx++) Energy[Idx] = Filter.Output*Scale; } // here we process the spectral data void ProcessSpectra(Cmpx *Spectra) { size_t Freq; for (Freq = 0; Freq < SpectraLen; Freq++) Energy[Freq] = Spectra[Freq].Energy(); LimitSpectraPeaks(Spectra, WindowLen / 64, 4.0); LimitSpectraPeaks(Spectra, WindowLen / 64, 4.0); LimitSpectraPeaks(Spectra, WindowLen / 64, 4.0); AverageEnergy(WindowLen / 96); AverageEnergy(WindowLen / 64); for (Freq = 0; Freq < SpectraLen; Freq++) { Type Corr = Energy[Freq]; if (Corr <= 0) continue; Corr = 1.0 / sqrt(Corr); Spectra[Freq] *= Corr; } } template void ProcessInpTap(InpType *Input) { size_t InpIdx; for (InpIdx = 0; InpIdx < SliceSepar; InpIdx++) { InpTap[InpTapPtr] = Input[InpIdx]; InpTapPtr += 1; InpTapPtr &= WrapMask; } } void ProcessInpTap() { size_t InpIdx; for (InpIdx = 0; InpIdx < SliceSepar; InpIdx++) { InpTap[InpTapPtr] = 0; InpTapPtr += 1; InpTapPtr &= WrapMask; } } void ProcessInpWindow_Re(void) { size_t Time; for (Time = 0; Time < WindowLen; Time++) { FFT_Buff[Time].Re = InpTap[InpTapPtr] * WindowShape[Time]; InpTapPtr += 1; InpTapPtr &= WrapMask; } } void ProcessInpWindow_Im(void) { size_t Time; for (Time = 0; Time < WindowLen; Time++) { FFT_Buff[Time].Im = InpTap[InpTapPtr] * WindowShape[Time]; InpTapPtr += 1; InpTapPtr &= WrapMask; } } void ProcessOutWindow_Re(void) { size_t Time; for (Time=0; Time int Process(InpType *Input) { if (Input) ProcessInpTap(Input); else ProcessInpTap(); ProcessInpWindow_Re(); if (Input) ProcessInpTap(Input+SliceSepar); else ProcessInpTap(); ProcessInpWindow_Im(); FFT.Process(FFT_Buff); FFT.SeparTwoReals(FFT_Buff, Spectra[0], Spectra[1]); ProcessSpectra(Spectra[0]); ProcessSpectra(Spectra[1]); FFT.JoinTwoReals(Spectra[0], Spectra[1], FFT_Buff); FFT.Process(FFT_Buff); ProcessOutWindow_Re(); ProcessOutTap(Output); ProcessOutWindow_Im(); ProcessOutTap(Output+SliceSepar); LimitOutputPeaks(2.5); LimitOutputPeaks(2.5); return WindowLen; } // get output as 16-bit signed data int GetOutput(int16_t *Buffer) { const Type Scale = 32768.0; const int32_t Limit = 0x7FFF; size_t Idx; for (Idx = 0; Idx < WindowLen; Idx++) { Type Ampl = Output[Idx]; Ampl *= Scale; int32_t Out = (int32_t)floor(Ampl + 0.5); if (Out > Limit) Out = Limit; else if (Out < (-Limit)) Out = (-Limit); Buffer[Idx] = (int16_t)Out; } return WindowLen; } } ; // ===================================================================== // A circular buffer to store history of data. // Data may come as single numbers or in batches // of fixed size (-> Width) template class CircularBuffer { public: size_t Width; // input/output data width (row width) size_t Len; // buffer length (column height) size_t Size; // total size of the storage in the buffer size_t Ptr; // current pointer (counts rows) Type *Data; // allocated storage CircularBuffer() { Init(); } ~CircularBuffer() { free(Data); } void Init(void) { Data = 0; Size = 0; Width = 1; } void Free(void) { free(Data); Data = 0; Size = 0; } // reset: set pointer to the beginning of the buffer void Reset(void) { Ptr = 0; } // preset for given length and width int Preset(void) { Size = Width * Len; if (ReallocArray(&Data, Size) < 0) return -1; Reset(); return 0; } // set all elements to given value void Set(Type &Value) { size_t Idx; for (Idx = 0; Idx < Size; Idx++) Data[Idx]=Value; } // set all elements to zero void Clear(void) { Type Zero; Zero = 0; Set(Zero); } // increment the pointer (with wrapping around) void IncrPtr(size_t &Ptr, size_t Step=1) { Ptr += Step; if (Ptr >= Len) Ptr -= Len; } // decrement the pointer (with wrapping around) void DecrPtr(size_t &Ptr, size_t Step=1) { if (Ptr >= Step) Ptr -= Step; else Ptr += (Len - Step); } // synchronize current pointer with another circular buffer template void operator |= (CircularBuffer Buffer) { Ptr = Buffer.Ptr; } // advance (increment) current pointer void operator += (size_t Step) { IncrPtr(Ptr, Step); } // decrement current pointer void operator -= (size_t Step) { DecrPtr(Ptr, Step); } // index operator to get the absolute data pointer Type *operator [] (size_t Idx) { return Data + (Idx * Width); } // get storage pointer corresponding to an absolute pipe pointer Type *AbsPtr(size_t Ptr) { return Data + (Ptr * Width); } // get storage pointer corresponding to current pipe pointer Type *CurrPtr(void) { return Data + (Ptr * Width); } // get storage pointer corresponding to current pointer +/- offset Type *OffsetPtr(int Offset) { Offset += Ptr; Offset *= Width; if (Offset < 0) Offset += Size; else if (Offset >= (int)Size) Offset -= Size; return Data + Offset; } }; // ===================================================================== template class MFSK_Demodulator { public: // parameters to be set before calling Preset() size_t SymbolLen; // length of the symbol, must be a power of 2 size_t FirstCarrier; // first carrier in terms of FFT freq. bins size_t BitsPerSymbol; // bits per symbol => number of carriers/tones int UseGrayCode; size_t DecodeMargin; int EqualizerDepth; // leave this at 0 (disable the equalizer) int Reverse; static const size_t CarrierSepar=2; static const size_t SpectraPerSymbol = 2; // FFT slices per symbol public: size_t Carriers; // number of tones/carriers size_t SymbolSepar; // time distance between symbols private: size_t DecodeWidth; size_t SymbolSepar2; size_t WrapMask; Type *InpTap; // input buffer size_t InpTapPtr; Type *SymbolShape; // the shape of the symbol and the FFT window r2FFT< Cmpx > FFT; // FFT engine Cmpx *FFT_Buff; // FFT buffer size_t SpectraLen; // number of spectra points per FFT Cmpx *Spectra[SpectraPerSymbol]; // two buffers for FFT spectra Type *Energy[SpectraPerSymbol]; CircularBuffer EnergyBuffer; LowPass3_Filter *AverageEnergy; Type FilterWeight; public: MFSK_Demodulator() { Init(); Default(); } ~MFSK_Demodulator() { Free(); } void Init(void) { InpTap=0; SymbolShape=0; FFT_Buff=0; Spectra[0]=0; Spectra[1]=0; Energy[0]=0; Energy[1]=0; AverageEnergy=0; } void Free(void) { free(InpTap); InpTap=0; free(SymbolShape); SymbolShape=0; free(FFT_Buff); FFT_Buff=0; free(Spectra[0]); Spectra[0]=0; free(Spectra[1]); Spectra[1]=0; free(Energy[0]); Energy[0]=0; free(Energy[1]); Energy[1]=0; free(AverageEnergy); AverageEnergy=0; FFT.Free(); EnergyBuffer.Free(); } void Default(void) { SymbolLen=512; FirstCarrier=32; BitsPerSymbol=5; UseGrayCode=1; DecodeMargin=32; Reverse=0; EqualizerDepth=0; } int Preset(void) { Carriers=Exp2(BitsPerSymbol); WrapMask=SymbolLen-1; Type ShapeScale=1.0/SymbolLen; if (ReallocArray(&InpTap,SymbolLen)<0) goto Error; ClearArray(InpTap,SymbolLen); InpTapPtr=0; if (FFT.Preset(SymbolLen)<0) goto Error; if (ReallocArray(&FFT_Buff,SymbolLen)<0) goto Error; SymbolSepar=SymbolLen/2; SymbolSepar2=SymbolSepar/2; if (ReallocArray(&SymbolShape,SymbolLen)<0) goto Error; { size_t Time; double Ampl=MFSK_SymbolFreqShape[0]; for (Time=0; Time=SymbolLen) Phase-=SymbolLen; } } { size_t Time; for (Time=0; TimeFirstCarrier) DecodeMargin=FirstCarrier; DecodeWidth=(Carriers*CarrierSepar-1)+2*DecodeMargin; if (ReallocArray(&Energy[0],DecodeWidth)<0) goto Error; if (ReallocArray(&Energy[1],DecodeWidth)<0) goto Error; if (EqualizerDepth) { EnergyBuffer.Len=EqualizerDepth; EnergyBuffer.Width=DecodeWidth; if (EnergyBuffer.Preset()<0) goto Error; EnergyBuffer.Clear(); if (ReallocArray(&AverageEnergy,DecodeWidth)<0) goto Error; size_t Idx; for (Idx=0; Idx void Process(InpType *Input) { size_t InpIdx,Time; for (InpIdx=0; InpIdx0) { Energy[0][Idx]/=RefEnergy; Energy[1][Idx]/=RefEnergy; } else { Energy[0][Idx]=0; Energy[1][Idx]=0; } } */ EnergyBuffer+=2; } else { size_t Idx; if (Reverse==1) { size_t Freq=FirstCarrier; for (Idx=0; IdxPeak) { Peak=Energy; PeakIdx=Idx; } Freq+=CarrierSepar; } if (UseGrayCode) PeakIdx=BinaryCode(PeakIdx); return PeakIdx; } template void SoftDecode(SymbType *Symbol, size_t Slice=0, int FreqOffset=0) { size_t Bit,Idx; for (Bit=0; Bit0) { for (Bit=0; Bit void SoftDecode_Test(SymbType *Symbol, size_t Slice=0, int FreqOffset=0) { size_t Bit,Idx,Freq; Type *EnergyPtr=Energy[Slice]+(DecodeMargin+FreqOffset); // printf("SoftDecode:"); Type TotalEnergy=0; Type PeakEnergy=0; for (Freq=0,Idx=0; IdxPeakEnergy) PeakEnergy=Energy; } Type AverageNoise=(TotalEnergy-PeakEnergy)/(Carriers-1)/2; /* printf(" PeakEnergy/TotalEnergy=%4.3f",PeakEnergy/TotalEnergy); printf(" AverageNoise/TotalEnergy=%4.3f\n",AverageNoise/TotalEnergy); printf("Energy[%d]/Tot =",Carriers); for (Freq=0,Idx=0; Idx void PrintBinary(Type Number, size_t Bits) { Type Mask=1; Mask<<=(Bits-1); for ( ; Bits; Bits--) { printf("%c",Number&Mask ? '1':'0'); Mask>>=1; } } // ===================================================================== class MFSK_Encoder { public: size_t BitsPerSymbol; size_t BitsPerCharacter; public: size_t Symbols; size_t SymbolsPerBlock; bool bContestia; // bool bRTTYM; private: static const uint64_t ScramblingCodeOlivia = 0xE257E6D0291574ECLL; static const uint64_t ScramblingCodeContestia = 0xEDB88320LL; // static const uint64_t ScramblingCodeRTTYM = 0xEDB88320LL; uint64_t ScramblingCode; int8_t *FHT_Buffer; public: uint8_t *OutputBlock; public: MFSK_Encoder() { Default(); Init(); } ~MFSK_Encoder() { Free(); } void Default(void) { bContestia = false; BitsPerSymbol=5; BitsPerCharacter=7; ScramblingCode = ScramblingCodeOlivia; } void Init(void) { FHT_Buffer=0; OutputBlock=0; } void Free(void) { free(FHT_Buffer); FHT_Buffer=0; free(OutputBlock); OutputBlock=0; } int Preset(void) { if (bContestia) { ScramblingCode = ScramblingCodeContestia; BitsPerCharacter = 6; // } else if (bRTTYM) { // ScramblingCode = ScramblingCodeRTTYM; // BitsPerCharacter = 5; } else { // standard Olivia ScramblingCode = ScramblingCodeOlivia; BitsPerCharacter = 7; } Symbols = 1 << BitsPerSymbol; SymbolsPerBlock = Exp2(BitsPerCharacter-1); if (ReallocArray(&FHT_Buffer,SymbolsPerBlock)<0) goto Error; if (ReallocArray(&OutputBlock,SymbolsPerBlock)<0) goto Error; return 0; Error: Free(); return -1; } void EncodeCharacter(uint8_t Char) { size_t TimeBit; uint8_t Mask = (SymbolsPerBlock << 1) - 1; if (bContestia) { if (Char >= 'a' && Char <= 'z') Char += 'A' - 'a'; if (Char == ' ') Char = 59; else if (Char == '\r') Char = 60; else if (Char == '\n') Char = 0; else if (Char >= 33 && Char <= 90) Char -= 32; else if (Char == 8) Char = 61; else if (Char == 0) Char = 0; else Char = '?' - 32; // } else if (bRTTYM) { } else { Char &= Mask; } for (TimeBit = 0; TimeBit < SymbolsPerBlock; TimeBit++) FHT_Buffer[TimeBit] = 0; if (Char= BitsPerSymbol) Bit -= BitsPerSymbol; uint8_t Mask = 1; Mask <<= Bit; OutputBlock[TimeBit] |= Mask; } Rotate += 1; if (Rotate >= BitsPerSymbol) Rotate -= BitsPerSymbol; } } } void PrintOutputBlock(void) { size_t TimeBit; for (TimeBit=0; TimeBit class MFSK_SoftDecoder { public: size_t BitsPerSymbol; // number of bits per symbol size_t BitsPerCharacter; // number of bits per character size_t Symbols; // number of symbols size_t SymbolsPerBlock; // number of symbols per FEC block float Signal, NoiseEnergy; uint8_t *OutputBlock; bool bContestia; // bool bRTTYM; private: static const uint64_t ScramblingCodeOlivia = 0xE257E6D0291574ECLL; static const uint64_t ScramblingCodeContestia = 0xEDB88320LL; // static const uint64_t ScramblingCodeRTTYM = 0xEDB88320LL; uint64_t ScramblingCode; size_t InputBufferLen; InpType *InputBuffer; size_t InputPtr; CalcType *FHT_Buffer; public: MFSK_SoftDecoder() { bContestia = false; Init(); Default(); } ~MFSK_SoftDecoder() { Free(); } void Default(void) { bContestia = false; BitsPerSymbol = 5; BitsPerCharacter = 7; ScramblingCode = ScramblingCodeOlivia; } void Init(void) { InputBuffer = 0; FHT_Buffer = 0; OutputBlock = 0; } void Free(void) { free(InputBuffer); InputBuffer = 0; free(FHT_Buffer); FHT_Buffer = 0; free(OutputBlock); OutputBlock = 0; } void Reset(void) { size_t Idx; for (Idx = 0; Idx < InputBufferLen; Idx++) InputBuffer[Idx] = 0; InputPtr = 0; } int Preset(void) { // if (bRTTYM) { // BitsPerCharacter = 5; // ScramblingCode = ScramblingCodeRTTYM; // } else if (bContestia) { BitsPerCharacter = 6; ScramblingCode = ScramblingCodeContestia; } else { BitsPerCharacter = 7; ScramblingCode = ScramblingCodeOlivia; } Symbols = 1 << BitsPerSymbol; SymbolsPerBlock = Exp2(BitsPerCharacter - 1); InputBufferLen = SymbolsPerBlock * BitsPerSymbol; if (ReallocArray(&InputBuffer, InputBufferLen) < 0) goto Error; if (ReallocArray(&FHT_Buffer, SymbolsPerBlock) < 0) goto Error; if (ReallocArray(&OutputBlock, BitsPerSymbol) < 0) goto Error; Reset(); return 0; Error: Free(); return -1; } int Preset(MFSK_SoftDecoder &RefDecoder) { BitsPerSymbol = RefDecoder.BitsPerSymbol; // BitsPerCharacter = RefDecoder.BitsPerCharacter; return Preset(); } void Input(InpType *Symbol) { size_t FreqBit; for (FreqBit = 0; FreqBit < BitsPerSymbol; FreqBit++) { InputBuffer[InputPtr] = Symbol[FreqBit]; InputPtr += 1; } if (InputPtr >= InputBufferLen) InputPtr -= InputBufferLen; } void DecodeCharacter(size_t FreqBit) { size_t TimeBit; size_t Ptr = InputPtr; size_t Rotate = FreqBit; size_t CodeWrap = (SymbolsPerBlock - 1); // Olivia (13 bit shift) or Contestia/RTTYM (5 bit shift) // size_t nShift = (bContestia || bRTTYM) ? 5 : 13; size_t nShift = (bContestia) ? 5 : 13; size_t CodeBit = FreqBit * nShift; CodeBit &= CodeWrap; for (TimeBit = 0; TimeBit < SymbolsPerBlock; TimeBit++) { InpType Bit = InputBuffer[Ptr + Rotate]; uint64_t CodeMask = 1; CodeMask <<= CodeBit; if (ScramblingCode & CodeMask) Bit = (-Bit); FHT_Buffer[TimeBit] = Bit; CodeBit += 1; CodeBit &= CodeWrap; Rotate += 1; if (Rotate >= BitsPerSymbol) Rotate -= BitsPerSymbol; Ptr += BitsPerSymbol; if (Ptr >= InputBufferLen) Ptr -= InputBufferLen; } FHT(FHT_Buffer, SymbolsPerBlock); CalcType Peak = 0; size_t PeakPos = 0; CalcType SqrSum = 0; for (TimeBit = 0; TimeBit < SymbolsPerBlock; TimeBit++) { CalcType Signal = FHT_Buffer[TimeBit]; SqrSum += Signal * Signal; if (fabs(Signal) > fabs(Peak)) { Peak = Signal; PeakPos = TimeBit; } } uint8_t Char = PeakPos; if (Peak < 0) Char += SymbolsPerBlock; SqrSum -= Peak * Peak; if (bContestia && Char > 0) { if (Char == 59) Char = ' '; else if (Char == 60) Char = '\r'; else if (Char == 61) Char = 8; // backspace else Char += 32; } OutputBlock[FreqBit] = Char; NoiseEnergy += (float)SqrSum / (SymbolsPerBlock - 1); Signal += fabs(Peak); } void Process(void) { size_t FreqBit; Signal = 0; NoiseEnergy = 0; for (FreqBit = 0; FreqBit < BitsPerSymbol; FreqBit++) DecodeCharacter(FreqBit); Signal /= BitsPerSymbol; NoiseEnergy /= BitsPerSymbol; } size_t Output(uint8_t *Buffer) { size_t FreqBit; for (FreqBit = 0; FreqBit < BitsPerSymbol; FreqBit++) Buffer[FreqBit] = OutputBlock[FreqBit]; return BitsPerSymbol; } size_t Output(uint64_t &PackedBuffer) { size_t FreqBit; PackedBuffer = 0; for (FreqBit = BitsPerSymbol; FreqBit > 0; ) { PackedBuffer <<= 8; FreqBit--; PackedBuffer |= OutputBlock[FreqBit]; } return BitsPerSymbol; } void PrintOutputBlock(FILE *File = stdout) { size_t FreqBit; fprintf(File, "'"); for (FreqBit = 0; FreqBit < BitsPerSymbol; FreqBit++) { uint8_t Char = OutputBlock[FreqBit]; fprintf(File, "%c", (Char >= ' ') && (Char < 127) ? Char:' '); } fprintf(File, "'"); if (NoiseEnergy > 0) fprintf(File, ", S/N = %5.1f", Signal / sqrt(NoiseEnergy)); fprintf(File, "\n"); } size_t Output(uint64_t *PackedBuffer) { return Output(*PackedBuffer); } }; // ===================================================================== // rate converter template class RateConverter { public: // parameters to be set by the user size_t TapLen; // filter tap length (in term of input samples) size_t OverSampling; // internal oversampling factor Type UpperFreq; // upper frequency of the (lowpass) filter (in terms of input sampling rate) Type OutputRate; // the output rate (in terms of the input rate) private: size_t FilterLen; // the total length of the filter (in term of oversampled rate) Type *FilterShape; // the shape of the filter Type *InputTap; // filter tap size_t InputTapPtr; size_t InputWrap; Type OutputTime; Type OutputPeriod; Type OutputBefore; Type OutputAfter; size_t OutputPtr; public: RateConverter() { Init(); Default(); } ~RateConverter() { Free(); } void Init(void) { FilterShape = 0; InputTap = 0; } void Free(void) { free(FilterShape); FilterShape = 0; free(InputTap); InputTap = 0; } void Default(void) { TapLen = 16; OverSampling = 16; UpperFreq = 3.0 / 8; OutputRate = 1.0; } int Preset(void) { size_t Idx; TapLen = Exp2(Log2(TapLen)); FilterLen = TapLen * OverSampling; if ((ReallocArray(&FilterShape, FilterLen)) < 0) goto Error; if ((ReallocArray(&InputTap, TapLen)) < 0) goto Error; for (Idx = 0; Idx < FilterLen; Idx++) { Type Phase = (M_PI * (2 * (int)Idx - (int)FilterLen)) / FilterLen; // Hanning // Type Window = 0.50 + 0.50 * cos(Phase); // Blackman // Type Window = 0.42 + 0.50 * cos(Phase) + 0.08 * cos(2 * Phase); // Blackman-Harris Type Window = 0.35875 + 0.48829 * cos(Phase) + 0.14128 * cos(2 * Phase) + 0.01168 * cos(3 * Phase); Type Filter = 1.0; if (Phase != 0) { Phase *= (UpperFreq * TapLen); Filter = sin(Phase) / Phase; } // printf("%3d: %+9.6f %+9.6f %+9.6f\n", Idx, Window, Filter, Window*Filter); FilterShape[Idx] = Window * Filter; } Reset(); return 0; Error: Free(); return -1; } void Reset(void) { size_t Idx; InputWrap = TapLen - 1; for (Idx = 0; Idx < TapLen; Idx++) InputTap[Idx] = 0; InputTapPtr = 0; OutputTime = 0; OutputPeriod = OverSampling / OutputRate; OutputBefore = 0; OutputAfter = 0; OutputPtr = 0; } private: Type Convolute(size_t Shift=0) { Type Sum = 0; Shift = (OverSampling - 1) - Shift; size_t Idx = InputTapPtr; for ( ; Shift < FilterLen; Shift += OverSampling) { Sum += InputTap[Idx] * FilterShape[Shift]; Idx += 1; Idx &= InputWrap; } return Sum; } void NewInput(Type Input) { // printf("I:\n"); InputTap[InputTapPtr]=Input; InputTapPtr+=1; InputTapPtr&=InputWrap; } public: template int Process(InpType *Input, size_t InputLen, OutType *Output) { size_t OutputLen = 0; // printf("E: %d %3.1f %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen); for ( ; ; ) { // printf("L: %d %3.1f %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen); if (OutputPtr) { size_t Idx = (size_t)floor(OutputTime) + 1; if (Idx >= OverSampling) { if (InputLen == 0) break; NewInput(*Input); Input++; InputLen -= 1; Idx -= OverSampling; OutputTime -= (Type)OverSampling; } OutputAfter = Convolute(Idx); Type Weight = Idx - OutputTime; (*Output) = Weight * OutputBefore + (1.0 - Weight) * OutputAfter; Output++; OutputLen += 1; // printf("O: %d %3.1f %d %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen, Idx); OutputPtr = 0; } else { size_t Idx = (size_t)floor(OutputTime + OutputPeriod); if (Idx >= OverSampling) { if (InputLen == 0) break; NewInput(*Input); Input++; InputLen -= 1; Idx -= OverSampling; OutputTime -= (Type)OverSampling; } OutputBefore = Convolute(Idx); OutputTime += OutputPeriod; OutputPtr = 1; } } // printf("R: %d %3.1f %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen); return OutputLen; } template int Process(InpType Input, size_t InputLen, Seq &Output) { size_t OutPtr = Output.Len; size_t MaxOutLen = (size_t)ceil(InputLen * OutputRate + 2); if (Output.EnsureSpace(OutPtr + MaxOutLen) < 0) return -1; int OutLen = Process(Input, InputLen, Output.Elem+OutPtr); Output.Len += OutLen; return OutLen; } template int Process(InpType Input, OutType *Output) { return Process(&Input, 1, Output); } }; // ===================================================================== template class MFSK_Transmitter { public: // primary parameters: set by the user bool bContestia; size_t Tones; // number of tones: 4, 8, 16, 32, 64, 128, 256 size_t Bandwidth; // bandwidth: 125, 250, 500, 1000, 2000 Type SampleRate; // audio sampling rate (internal processing) Type OutputSampleRate; // true sampling rate of the soundcard float FirstCarrierMultiplier; int Reverse; // secondary parameters: calculated by Preset() size_t BitsPerSymbol; // number of bits per symbol size_t SymbolsPerBlock; // number of symbols per one FEC code block size_t MaxOutputLen; // maximum length of the audio batch returned by Output() private: static const int State_Running = 0x0001; static const int State_StopReq = 0x0010; int State; FIFO Input; // buffer(queue) for the characters to be encoded uint8_t InputBlock[8]; // FEC code block buffer FIFO Monitor; // buffer for monitoring the characters being sent MFSK_Encoder Encoder; // FEC encoder size_t SymbolPtr; MFSK_Modulator Modulator; // MFSK modulator Type *ModulatorOutput; RateConverter Converter; // output rate converter Type *ConverterOutput; public: MFSK_Transmitter() { bContestia = false; Init(); } ~MFSK_Transmitter() { Free(); } void Init(void) { ModulatorOutput = 0; ConverterOutput = 0; } void Free(void) { Input.Free(); Monitor.Free(); Encoder.Free(); Modulator.Free(); free(ModulatorOutput); ModulatorOutput = 0; Converter.Free(); free(ConverterOutput); ConverterOutput = 0; } // set default primary parameters void Default(void) { Tones = 32; Bandwidth = 1000; Reverse = 0; SampleRate = 8000; OutputSampleRate = 8000; } // preset internal arrays according to primary paramaters int Preset(void) { // impose limits on the primary parameters if (Tones < 2 ) Tones = 2; else if (Tones > 256) Tones = 256; if (Bandwidth < 125) Bandwidth = 125; else if (Bandwidth > 2000) Bandwidth = 2000; // calculate the secondary parameters BitsPerSymbol = Log2(Tones); Tones = Exp2(BitsPerSymbol); // preset the input character buffer Input.Len = 1024; if (Input.Preset() <0 ) goto Error; Monitor.Len = 256; if (Monitor.Preset() < 0) goto Error; // preset the encoder Encoder.bContestia = bContestia; Encoder.BitsPerSymbol = BitsPerSymbol; if (Encoder.Preset() < 0) goto Error; SymbolsPerBlock = Encoder.SymbolsPerBlock; // preset the modulator Modulator.Default(); Modulator.BitsPerSymbol = BitsPerSymbol; Modulator.SymbolLen = (size_t)1 << (BitsPerSymbol + 7 - Log2(Bandwidth / 125)); Bandwidth = Exp2(Log2(Bandwidth / 125)) * 125; Modulator.FirstCarrier = (size_t) ((Modulator.SymbolLen / 16) * FirstCarrierMultiplier) + 1; Modulator.Reverse = Reverse; if (Modulator.Preset() < 0) goto Error; if (ReallocArray(&ModulatorOutput, Modulator.SymbolSepar) < 0) goto Error; // preset the rate converter Converter.OutputRate = OutputSampleRate / SampleRate; if (Converter.Preset() < 0) goto Error; MaxOutputLen = (size_t)ceil(Modulator.SymbolSepar * OutputSampleRate / SampleRate + 2); if (ReallocArray(&ConverterOutput, MaxOutputLen) < 0) goto Error; // reset the state logic SymbolPtr = 0; State = 0; return 0; Error: Free(); return -1; } void Reset(void) { Input.Reset(); Monitor.Reset(); SymbolPtr = 0; State = 0; Converter.Reset(); } Type BaudRate(void) { return SampleRate / Modulator.SymbolSepar; } Type BlockPeriod(void) { return (SymbolsPerBlock * Modulator.SymbolSepar) / SampleRate; } Type CharactersPerSecond(void) { return BitsPerSymbol * SampleRate / (SymbolsPerBlock * Modulator.SymbolSepar); } // start the transmission void Start(void) { State |= State_Running; } // request to stop (and complete) the transmission // but the transmitter will only stop after transmitting all the data void Stop(void) { State |= State_StopReq; } // check if the transmission is still running (not complete) int Running(void) { return State & State_Running; } // put the character into the transmitter input queue int PutChar(uint8_t Char) { return Input.Write(Char); } // get one character from the monitor buffer int GetChar(uint8_t &Char) { return Monitor.Read(Char); } size_t GetReadReady(void) { return Input.ReadReady(); } int DoPostambleYet(void) { if (State == 0) return 1; else return 0; } double GetSymbolPhase(void) { return Modulator.SymbolPhase; } // get out the transmitter output (audio) int Output(double *Buffer) { if (SymbolPtr == 0) { if ((State&State_StopReq) && Input.Empty()) { State=0; } else if (State&State_Running) { size_t Idx; for (Idx = 0; Idx < BitsPerSymbol; Idx++) { uint8_t Char; if (Input.Read(Char) <= 0) break; InputBlock[Idx] = Char; Monitor.Write(Char); } for ( ; Idx < BitsPerSymbol; Idx++) InputBlock[Idx] = 0; Encoder.EncodeBlock(InputBlock); } } if (State&State_Running) { Modulator.Send(Encoder.OutputBlock[SymbolPtr]); SymbolPtr += 1; if (SymbolPtr >= SymbolsPerBlock) SymbolPtr = 0; } int ModLen = Modulator.Output(ModulatorOutput); int ConvLen = Converter.Process(ModulatorOutput, ModLen, ConverterOutput); if (ConvLen < 0) return ConvLen; double maxval = 0, tempnum; for (int Idx = 0; Idx < ConvLen; Idx++) if ((tempnum = fabs(ConverterOutput[Idx])) > maxval) maxval = tempnum; for (int Idx = 0; Idx < ConvLen; Idx++) Buffer[Idx] = (double) ConverterOutput[Idx] / maxval; return ConvLen; } }; // ===================================================================== /* How to use the MFSK_Receiver class: 1. create an object like: #include "mfsk.h" MFSK_Receiver Receiver; 2. Set the parameters, for example: Receiver.Tones = 32; // number of tones (symbols) Receiver.Bandwidth = 1000; // bandwidth [Hz] Receiver.SyncMargin = 8; // synchronizer tune margin [tone freq. spacing] Receiver.SyncIntegLen = 4; // synchronizer integration period [FEC blocks] Receiver.SyncThreshold = 3.2; // S/N threshold for printing Receiver.SampleRate = 8000.0; // internal processor sampling rate [Hz] Receiver.InputSampleRate = 8000.0; // soundcard sampling rate [Hz] You don't need to set all the parameters, as upon creation of the Receiver object they are already given certain default values. If you changed parameters at one time and want later to go back to the default values you can call: Receiver.Default(); 3. Preset the Receiver internal arrays for the parameters you just set: if (Receiver.Preset()<0) printf("Not enough RAM or another problem\n"); Each time you change the parameters you need to call Preset() in order to resize the internal arrays. Preset() will as well destroy all data being in the process of decoding, if you need this data then call first Receiver.Flush() 4. Read back the parameters you set in point 1., they could have been adjusted by Preset() to their closest allowed values. 5. Feed the audio into the Receiver: Receiver.Process(AudioBuffer, BufferLength); AudioBuffer can be an array of int16_t (16-bit signed integers) that you fill with the data from the soundcard. I suggest you feed the receiver with batches of 512 or 1024 samples, but in can be any number of samples at a time. 6. Call GetChar(Char) to get decoded characters. Note, that characters come in batches, and so, you need to call GetChar() possibly several times. GetChar() returns 0 when the decoder FIFO is empty or 1 when not empty. In the latter case the argument contains the character read form the FIFO. The loop could be like: for ( ; ; ) { uint8_t Char; if (Receiver.GetChar(Char)==0) break; printf("%c",Char); } Keep in mind that you may see (random) control code characters here, and thus you must be able to deal with them. I suggest to process only carriage return (code=13) and Backspace (code=8). NUL (code=0) is the idle character: it is being sent when there is no text to be sent. 7. At any time you can read the signal-to-noise ratio of the incoming signal by calling Receiver.SignalToNoiseRatio() or frequency offset by calling Receiver.FrequencyOffset() 8. When the user decides to turn off the receiver and switch over to transmitt you may still call Receiver.Flush()in order to flush the data still being buffered in the decoder pipeplines. */ template class MFSK_Receiver { public: // primary parameters: set by the user bool bContestia; size_t Tones; // number of tones: 4, 8, 16, 32, 64, 128, 256 size_t Bandwidth; // bandwidth: 125, 250, 500, 1000, 2000 size_t SyncMargin; // synchronizer search margin, frequency-wide size_t SyncIntegLen; // synchronizer integration period Type SyncThreshold; // synchronizer S/N threshold Type SampleRate; // audio sampling rate (internal processing) Type InputSampleRate; // true sampling rate of the soundcard float FirstCarrierMultiplier; int Reverse; // secondary parameters: calculated by Preset() size_t BitsPerSymbol; // number of bits per symbol size_t SymbolsPerBlock; // number of symbols per one FEC code block private: RateConverter Converter; Seq InputBuffer; MFSK_InputProcessor InputProcessor; // equalizes the input spectrum // and removes coherent interferences MFSK_Demodulator Demodulator; // FFT demodulator const static size_t SlicesPerSymbol = MFSK_Demodulator::SpectraPerSymbol; // number of possible frequency offsets size_t FreqOffsets; // number of possible time-phases within the FEC block size_t BlockPhases; // reference decoder MFSK_SoftDecoder RefDecoder; // array of decoders MFSK_SoftDecoder *Decoder; // current running time-phase size_t BlockPhase; // FEC noise integrators CircularBuffer< LowPass3_Filter > SyncNoiseEnergy; // FEC signal integrators CircularBuffer< LowPass3_Filter > SyncSignal; // weight for the integrators Type SyncFilterWeight; // best signal Type SyncBestSignal; // time-phase of the best signal size_t SyncBestBlockPhase; // frequency offset of the best signal size_t SyncBestFreqOffset; // S/N corresponding to the SyncBestSignal Type SyncSNR; // pipeline for decoded FEC blocks CircularBuffer *DecodePipe; // buffer for decoded characters FIFO Output; public: MFSK_Receiver() { bContestia = false; Init(); Default(); } ~MFSK_Receiver() { Free(); } void Init(void) { Decoder = 0; DecodePipe = 0; } void Free(void) { if (Decoder) { size_t Idx; for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) Decoder[Idx].Free(); free(Decoder); Decoder=0; } if (DecodePipe) { size_t Idx; for (Idx = 0; Idx < BlockPhases; Idx++) DecodePipe[Idx].Free(); free(DecodePipe); DecodePipe = 0; } Converter.Free(); InputBuffer.Free(); InputProcessor.Free(); Demodulator.Free(); RefDecoder.Free(); SyncSignal.Free(); SyncNoiseEnergy.Free(); Output.Free(); } // set defaults values for all parameters void Default(void) { Tones = 32; Reverse = 0; Bandwidth = 1000; SyncMargin = 8; SyncIntegLen = 4; SyncThreshold = 3.0; SampleRate = 8000; InputSampleRate = 8000.0; } // resize internal arrays according the parameters int Preset(void) { size_t Idx; if (Tones < 2) Tones = 2; else if (Tones > 256) Tones = 256; if (Bandwidth < 125) Bandwidth = 125; else if (Bandwidth > 2000) Bandwidth = 2000; if (SyncMargin < 2) SyncMargin = 2; if (SyncIntegLen < 2) SyncIntegLen = 2; if (SyncThreshold < 3.0) SyncThreshold = 3.0; BitsPerSymbol = Log2(Tones); Tones = Exp2(BitsPerSymbol); Converter.OutputRate = SampleRate/InputSampleRate; if (Converter.Preset() < 0) goto Error; Demodulator.BitsPerSymbol = BitsPerSymbol; Demodulator.SymbolLen = Exp2(BitsPerSymbol + 7 - Log2(Bandwidth/125)); Bandwidth = Exp2(Log2(Bandwidth/125)) * 125; Demodulator.FirstCarrier = (size_t) ((Demodulator.SymbolLen/16) * FirstCarrierMultiplier) + 1; Demodulator.Reverse = Reverse; Demodulator.DecodeMargin = SyncMargin; if (Demodulator.Preset() < 0) goto Error; SyncMargin = Demodulator.DecodeMargin; InputProcessor.WindowLen = 16 * Demodulator.SymbolLen; if (InputProcessor.Preset() < 0) goto Error; RefDecoder.Default(); RefDecoder.BitsPerSymbol=BitsPerSymbol; RefDecoder.bContestia = bContestia; if (RefDecoder.Preset()<0) goto Error; SymbolsPerBlock=RefDecoder.SymbolsPerBlock; if (Decoder) { for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) Decoder[Idx].Free(); } if (DecodePipe) { for (Idx = 0; Idx < BlockPhases; Idx++) DecodePipe[Idx].Free(); } FreqOffsets = 2 * SyncMargin + 1; BlockPhases = SlicesPerSymbol * SymbolsPerBlock; if (ReallocArray(&Decoder, SlicesPerSymbol * FreqOffsets) < 0) goto Error; for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) { Decoder[Idx].bContestia = bContestia; Decoder[Idx].Init(); } for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) if (Decoder[Idx].Preset(RefDecoder) < 0) goto Error; if (ReallocArray(&DecodePipe,BlockPhases) < 0) goto Error; for (Idx = 0; Idx < BlockPhases; Idx++) DecodePipe[Idx].Init(); for (Idx = 0; Idx < BlockPhases; Idx++) { DecodePipe[Idx].Width = FreqOffsets; DecodePipe[Idx].Len = SyncIntegLen; if (DecodePipe[Idx].Preset() < 0) goto Error; DecodePipe[Idx].Clear(); } SyncSignal.Width = FreqOffsets; SyncSignal.Len = BlockPhases; if (SyncSignal.Preset() < 0) goto Error; SyncSignal.Clear(); SyncNoiseEnergy.Width = FreqOffsets; SyncNoiseEnergy.Len = BlockPhases; if (SyncNoiseEnergy.Preset() < 0) goto Error; SyncNoiseEnergy.Clear(); SyncFilterWeight = 1.0 / SyncIntegLen; BlockPhase=0; SyncBestSignal = 0; SyncBestBlockPhase = 0; SyncBestFreqOffset = 0; SyncSNR = 0; if (InputBuffer.EnsureSpace(InputProcessor.WindowLen + 2048) < 0) goto Error; Output.Len = 1024; if (Output.Preset() < 0) goto Error; return 0; Error: Free(); return -1; } void Reset(void) { size_t Idx; Converter.Reset(); InputBuffer.Clear(); InputProcessor.Reset(); for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) Decoder[Idx].Reset(); for (Idx = 0; Idx < BlockPhases; Idx++) DecodePipe[Idx].Clear(); SyncSignal.Clear(); SyncNoiseEnergy.Clear(); BlockPhase = 0; SyncBestSignal = 0; SyncBestBlockPhase = 0; SyncBestFreqOffset = 0; SyncSNR = 0; Output.Reset(); } char *PrintParameters(void) { static char szParams[1000]; Type FreqBin = SampleRate/Demodulator.SymbolLen; snprintf(szParams, sizeof(szParams), "\ %d tones, %4.2f Hz/tone, %4.1f Hz bandwidth\n\ %d bits/symbol(tone), %4.2f baud\n\ FEC block: %d char. => %d x %d bits, %3.1f sec\n\ Audio band: %3.1f - %3.1f Hz, %3.1f Hz total\n\ Tuning tolerance = +/- %3.1f Hz\n\ Sync. S/N threshold = %3.1f\n", (int)Demodulator.Carriers, FreqBin*Demodulator.CarrierSepar, FreqBin*Demodulator.CarrierSepar*Demodulator.Carriers, (int)Demodulator.BitsPerSymbol, SampleRate/Demodulator.SymbolSepar, (int)RefDecoder.BitsPerSymbol, (int)RefDecoder.BitsPerSymbol, (int)RefDecoder.SymbolsPerBlock, (SymbolsPerBlock*Demodulator.SymbolSepar)/SampleRate, FreqBin * Demodulator.FirstCarrier, FreqBin * (Demodulator.FirstCarrier + Demodulator.CarrierSepar * Demodulator.Carriers), FreqBin * Demodulator.CarrierSepar * Demodulator.Carriers, FreqBin * SyncMargin, SyncThreshold ); return szParams; } Type BaudRate(void) { return SampleRate / Demodulator.SymbolSepar; } Type TuneMargin(void) { return SyncMargin * (SampleRate / Demodulator.SymbolLen); } Type BlockPeriod(void) { return (SymbolsPerBlock * Demodulator.SymbolSepar) / SampleRate; } Type CharactersPerSecond(void) { return BitsPerSymbol * SampleRate / (SymbolsPerBlock*Demodulator.SymbolSepar); } Type SignalToNoiseRatio(void) { return SyncSNR; } Type FrequencyOffset(void) { return ( (int)SyncBestFreqOffset - (int)FreqOffsets / 2) * (SampleRate / Demodulator.SymbolLen); } Type TimeOffset(void) { return ( (Type)SyncBestBlockPhase / SlicesPerSymbol) * (Demodulator.SymbolSepar / SampleRate); } // process an audio batch: first the input processor, then the demodulator template int Process(InpType *Input, size_t InputLen) { if (Converter.Process(Input, InputLen, InputBuffer) < 0) return -1; ProcessInputBuffer(); return 0; } void Flush(void) { ProcessInputBuffer(); size_t Idx; for (Idx = InputBuffer.Len; Idx < InputProcessor.WindowLen; Idx++) InputBuffer[Idx] = 0; InputBuffer.Len = InputProcessor.WindowLen; ProcessInputBuffer(); for (Idx = 0; Idx < InputProcessor.WindowLen; Idx++) InputBuffer[Idx] = 0; size_t FlushLen = Demodulator.SymbolSepar * SymbolsPerBlock * SyncIntegLen * 2; for (Idx=0; Idx= InputProcessor.WindowLen) { InputProcessor.Process(InputBuffer.Elem); InputBuffer.Delete(0, InputProcessor.WindowLen); size_t Idx; for (Idx = 0; Idx < InputProcessor.WindowLen; Idx += Demodulator.SymbolSepar ) ProcessSymbol(InputProcessor.Output+Idx); } } // process (through the demodulator) an audio batch corresponding to one symbol // demodulator always uses audio batches corresponding to one symbol period template void ProcessSymbol(InpType *Input) { Demodulator.Process(Input); MFSK_SoftDecoder *DecoderPtr = Decoder; size_t Offset,Slice; for (Slice = 0; Slice < SlicesPerSymbol; Slice++) { LowPass3_Filter *NoiseEnergyPtr = SyncNoiseEnergy.AbsPtr(BlockPhase); LowPass3_Filter *SignalPtr = SyncSignal.AbsPtr(BlockPhase); uint64_t *DecodeBlockPtr = DecodePipe[BlockPhase].CurrPtr(); size_t BestSliceOffset = 0; Type BestSliceSignal = 0; Type NoiseEnergy = 0; Type Signal; Type Symbol[8]; for (Offset = 0; Offset < FreqOffsets; Offset++) { Demodulator.SoftDecode(Symbol, Slice, (int)Offset - (FreqOffsets / 2)); DecoderPtr->Input(Symbol); DecoderPtr->Process(); DecoderPtr->Output(DecodeBlockPtr); NoiseEnergy = DecoderPtr->NoiseEnergy; NoiseEnergyPtr->Process(NoiseEnergy, SyncFilterWeight); Signal = DecoderPtr->Signal; SignalPtr->Process(Signal, SyncFilterWeight); Signal = SignalPtr->Output; if (Signal > BestSliceSignal) { BestSliceSignal = Signal; BestSliceOffset = Offset; } DecoderPtr++; DecodeBlockPtr++; NoiseEnergyPtr++; SignalPtr++; } DecodePipe[BlockPhase] += 1; if (BlockPhase == SyncBestBlockPhase) { SyncBestSignal = BestSliceSignal; SyncBestFreqOffset = BestSliceOffset; } else { if (BestSliceSignal > SyncBestSignal) { SyncBestSignal = BestSliceSignal; SyncBestBlockPhase = BlockPhase; SyncBestFreqOffset = BestSliceOffset; } } int Dist = (int)BlockPhase - (int)SyncBestBlockPhase; if (Dist < 0) Dist += BlockPhases; if (Dist == (int)(BlockPhases / 2)) { Type BestNoise = sqrt( NoiseEnergyPtr->Output); if (BestNoise == 0) SyncSNR = 0; else SyncSNR = SyncBestSignal / BestNoise; // printf( // "%d, %6.3f/%6.3f = %5.2f\n", // SyncBestFreqOffset, // SyncBestSignal, // BestNoise, // SyncSNR ); if (SyncSNR >= SyncThreshold) { uint64_t *BestBlockPtr = DecodePipe[SyncBestBlockPhase].CurrPtr(); uint64_t Block = BestBlockPtr[SyncBestFreqOffset]; for ( size_t Byte = 0; Byte < BitsPerSymbol; Byte++) { uint8_t Char = Block&0xFF; Output.Write(Char); Block >>= 8; } } if (SyncSNR > 100) SyncSNR = 0.0; } BlockPhase++; } if (BlockPhase >= BlockPhases) BlockPhase -= BlockPhases; } }; // unused code // ===================================================================== /* template class MFSK_Symbol { public: size_t BitsPerSymbol; size_t Carriers; Type *Energy; Type *Correction; Type *Corrected; size_t Code; Type PeakEnergy; Type Background; Type ScanThreshold; size_t ScanIndex; MFSK_Symbol() { Init(); Default(); } ~MFSK_Symbol() { Free(); } void Init(void) { Energy = 0; Correction = 0; Corrected = 0; } void Free(void) { free(Energy); Energy = 0; free(Correction); Correction = 0; free(Corrected); Corrected = 0; } void Default(void) { BitsPerSymbol = 5; } int Preset(void) { Carriers = Exp2(BitsPerSymbol); if (ReallocArray(&Energy, Carriers) < 0) goto Error; if (ReallocArray(&Correction, Carriers) < 0) goto Error; if (ReallocArray(&Corrected, Carriers) < 0) goto Error; return 0; Error: Free(); return -1; } void ClearCorrection(void) { size_t Idx; for (Idx = 0; Idx < Carriers; Idx++) Correction[Idx] = 0; } void AddCorrection(void) { size_t Idx; for (Idx = 0; Idx < Carriers; Idx++) Corrected[Idx] = Energy[Idx] + Correction[Idx]; } void AddCorrection(Type Weight) { size_t Idx; for (Idx = 0; Idx < Carriers; Idx++) Corrected[Idx] = Energy[Idx] + Weight * Correction[Idx]; } void MakeRandom(Type SignalToNoise = 1.0) { Type Signal = 1.0; Type Noise = 1.0 / SignalToNoise; Type NoiseEnergy = Noise * Noise; NoiseEnergy /= Carriers; size_t Idx; double UniformNoise = 0; for (Idx = 0; Idx < Carriers; Idx++) { UniformNoise = ((double)rand()+1.0)/((double)RAND_MAX+1.0); Energy[Idx] = NoiseEnergy * (-log(UniformNoise)); } double Phase = 2 * M_PI * ((double)rand()+1.0)/((double)RAND_MAX+1.0); Type NoiseAmpl = sqrt(Energy[Code]); Signal += cos(Phase) * NoiseAmpl; NoiseAmpl *= sin(Phase); Energy[Code] = Signal*Signal + NoiseAmpl * NoiseAmpl; ClearCorrection(); AddCorrection(); } void Decode(void) { size_t Idx; PeakEnergy = 0; Code = 0; Background = 0; for (Idx=0; Idx PeakEnergy) { PeakEnergy = Energy; Code = Idx; } } Background -= PeakEnergy; Background /= (Carriers-1); } void Scan_Init(Type Threshold = 4.0) { ScanThreshold = Threshold * Background; } int Scan_First(void) { for (ScanIndex = 0; ScanIndex < Carriers; ScanIndex++) if (Corrected[ScanIndex] > ScanThreshold) return 0; return -1; } // 0 => OK, -1 => no data above threshold int Scan_Next(void) { for ( ScanIndex++; ScanIndex < Carriers; ScanIndex++) if (Corrected[ScanIndex]>ScanThreshold) return 0; if (Scan_First() < 0) return -1; return 1; } // 0 => OK, 1 => wrapped around, -1 => no data above threshold void Print(void) { size_t Idx; printf("MFSK_Symbol: %d bits/%d carriers, Peak = %3.1f/%3.1f @ 0x%02X\n", BitsPerSymbol,Carriers, PeakEnergy,Background, Code); printf("Energy:"); for (Idx=0; Idx class MFSK_Delay { public: size_t Len; Type *Tap; size_t TapPtr; MFSK_Delay() { Tap = 0; Len = 0; } ~MFSK_Delay() { free(Tap); } int Preset(size_t NewLen) { Len = NewLen; if (ReallocArray(&Tap, Len) < 0) { Len = 0; return -1; } size_t Idx; for (Idx = 0; Idx < Len; Idx++) Tap[Idx] = 0; TapPtr = 0; return 0; } void Process(Type Input) { if (Len == 0) return; Tap[TapPtr] = Input; TapPtr += 1; if (TapPtr >= Len) TapPtr -= Len; } void Process(Type Input, Type &Output) { if (Len == 0) { Output = Input; return; } Output = Tap[TapPtr]; Tap[TapPtr] = Input; TapPtr += 1; if (TapPtr >= Len) TapPtr -= Len; } void Process(Type * Buffer, size_t BufferLen) { size_t Idx; Type Output; for (Idx = 0; Idx < BufferLen; Idx++) { Process(Buffer[Idx], Output); Buffer[Idx] = Output; } } }; template class MFSK_FEC { public: size_t BitsPerSymbol; size_t SymbolsPerLine; size_t Dimensions; size_t SymbolsPerBlock; size_t CodeMask; MFSK_Symbol *Symbol; MFSK_FEC() { Init(); Default(); } ~MFSK_FEC() { Free(); } void Init(void) { Symbol = 0; } void Free(void) { delete [] Symbol; Symbol = 0; } void Default(void) { BitsPerSymbol = 5; SymbolsPerLine = 4; Dimensions = 3; } int Preset(void) { Free(); SymbolsPerBlock = 1; size_t Dim; for (Dim = 0; Dim < Dimensions; Dim++) SymbolsPerBlock *= SymbolsPerLine; CodeMask = Exp2(BitsPerSymbol) - 1; Symbol = new MFSK_Symbol[SymbolsPerBlock]; if (Symbol == 0) return -1; size_t Idx; for (Idx = 0; Idx < SymbolsPerBlock; Idx++) { Symbol[Idx].BitsPerSymbol = BitsPerSymbol; if (Symbol[Idx].Preset() < 0) return -1; } return 0; } void CalculateCheck(size_t Idx, size_t Step) { size_t Check=0; size_t LineIdx; for ( LineIdx = 0; LineIdx < (SymbolsPerLine - 1); LineIdx++,Idx += Step) Check -= Symbol[Idx].Code; Check &= CodeMask; Symbol[Idx].Code = Check; } int Correct(void) { return 0; } }; template class MFSK_LineCorrector { public: size_t BitsPerSymbol; size_t SymbolsPerLine; size_t CodeMask; MFSK_Symbol **Symbol; MFSK_LineCorrector() { Init(); Default(); } ~MFSK_LineCorrector() { Free(); } void Init(void) { Symbol = 0; } void Free(void) { free(Symbol); Symbol = 0; } void Default(void) { BitsPerSymbol = 5; SymbolsPerLine = 4; } int Preset(void) { CodeMask = Exp2(BitsPerSymbol) - 1; if (ReallocArray(&Symbol, SymbolsPerLine) < 0) goto Error; return 0; Error: Free(); return -1; } void CorrectSymbol(size_t SymbolIdx) { size_t Idx; size_t Check = 0; Type Corr = 0; for (Idx = 0; Idx < SymbolsPerLine; Idx++) { if (Idx == SymbolIdx) continue; MFSK_Symbol *SymbolPtr = Symbol[Idx]; Check -= SymbolPtr->Code; Corr += SymbolPtr->PeakEnergy; // -SymbolPtr->Background; } Check &= CodeMask; Symbol[SymbolIdx]->Correction[Check] += Corr; } void CorrectSymbol_Slow(size_t SymbolIdx) { size_t Idx; for (Idx = 0; IdxScan_First()<0) break; } if (Idx < SymbolsPerLine) return; for ( ; ; ) { size_t Check = 0; Type Corr = 0; for (Idx = 0; Idx < SymbolsPerLine; Idx++) { if (Idx == SymbolIdx) continue; MFSK_Symbol *SymbolPtr = Symbol[Idx]; size_t Code = SymbolPtr->ScanIndex; Check -= Code; Corr += SymbolPtr->Corrected[Code] - SymbolPtr->ScanThreshold; } Check &= CodeMask; Symbol[SymbolIdx]->Correction[Check] += Corr; for (Idx = 0; Idx < SymbolsPerLine; Idx++) { if (Idx == SymbolIdx) continue; if (Symbol[Idx]->Scan_Next() == 0) break; } if (Idx >= SymbolsPerLine) break; } } void Correct(size_t Iter = 8, Type Weight = 1.0) { Weight /= (2 * SymbolsPerLine); for ( ; Iter; Iter--) { size_t Idx; for (Idx = 0; Idx < SymbolsPerLine; Idx++) { Symbol[Idx]->ClearCorrection(); Symbol[Idx]->Scan_Init(); } for (Idx = 0; Idx < SymbolsPerLine; Idx++) CorrectSymbol(Idx); for (Idx = 0; Idx < SymbolsPerLine; Idx++) { Symbol[Idx]->AddCorrection(Weight); Symbol[Idx]->Decode(); } } } } ; class MFSK_HardDecoder { public: size_t BitsPerSymbol; size_t BitsPerCharacter; size_t Symbols; size_t SymbolsPerBlock; float Signal, NoiseEnergy; uint8_t *OutputBlock; bContestia = false; // bRTTYM = false; static const uint64_t ScramblingCodeOlivia = 0xE257E6D0291574EC; static const uint64_t ScramblingCodeContestia = 0xEDB88320L; private: static const uint64_t ScramblingCode = ScramblingCodeOlivia; uint8_t *InputBuffer; size_t InputPtr; size_t InputWrap; int8_t *FHT_Buffer; public: MFSK_HardDecoder() { Init(); Default(); } ~MFSK_HardDecoder() { Free(); } void Default(void) { BitsPerSymbol = 5; BitsPerCharacter = 7; } void Init(void) { InputBuffer = 0; FHT_Buffer = 0; OutputBlock = 0; } void Free(void) { free(InputBuffer); InputBuffer = 0; free(FHT_Buffer); FHT_Buffer = 0; free(OutputBlock); OutputBlock = 0; } void Reset(void) { size_t Idx; for (Idx = 0; Idx < SymbolsPerBlock; Idx++) InputBuffer[Idx] = 0; InputPtr = 0; } int Preset(void) { Symbols = 1<>= Rotate; Bit &= 1; uint64_t CodeMask = 1; CodeMask <<= CodeBit; if (ScramblingCode&CodeMask) Bit ^= 1; FHT_Buffer[TimeBit]= Bit ? -1 : 1; CodeBit += 1; CodeBit &= CodeWrap; Rotate += 1; if (Rotate >= BitsPerSymbol) Rotate -= BitsPerSymbol; Ptr += 1; Ptr &= InputWrap; } FHT(FHT_Buffer,SymbolsPerBlock); int32_t Peak = 0; size_t PeakPos = 0; int32_t SqrSum = 0; for (TimeBit = 0; TimeBit < SymbolsPerBlock; TimeBit++) { int32_t Signal = FHT_Buffer[TimeBit]; SqrSum += Signal * Signal; if (abs(Signal) > abs(Peak)) { Peak = Signal; PeakPos = TimeBit; } } uint8_t Char = PeakPos; if (Peak < 0) Char += SymbolsPerBlock; SqrSum -= Peak * Peak; OutputBlock[FreqBit] = Char; NoiseEnergy += (float)SqrSum / (SymbolsPerBlock - 1); Signal += abs(Peak); } void Process(void) { size_t FreqBit; Signal = 0; NoiseEnergy = 0; for (FreqBit=0; FreqBit 0; ) { PackedBuffer <<= 8; FreqBit--; PackedBuffer |= OutputBlock[FreqBit]; } return BitsPerSymbol; } size_t Output(uint64_t *PackedBuffer) { return Output(*PackedBuffer); } void PrintOutputBlock(FILE *File=stdout) { size_t FreqBit; fprintf(File,"'"); for (FreqBit=0; FreqBit=' ')&&(Char<127) ? Char:' '); } fprintf(File,"', S/N = %5.1f/%4.1f",Signal,sqrt(NoiseEnergy)); if (NoiseEnergy>0) fprintf(File," = %5.1f",Signal/sqrt(NoiseEnergy)); fprintf(File,"\n"); } void PrintInputBuffer(void) { size_t TimeBit; size_t Ptr = InputPtr; for (TimeBit = 0; TimeBit < SymbolsPerBlock; TimeBit++) { printf("%2d: ",(int)TimeBit); PrintBinary(InputBuffer[Ptr], BitsPerSymbol); printf("\n"); Ptr += 1; Ptr &= InputWrap; } } }; */ // ===================================================================== #endif // of __MFSK_H__ fldigi-3.21.80/src/include/jalocha/pj_fht.h0000664000175000017500000000210612313064025015277 00000000000000// Fast Hadamard Transform, Pawel Jalocha, December 2004 #ifndef __FHT_H__ #define __FHT_H__ // Forward Fast Hadamard Transform template // Type can be float, Cmpx<>, int8_t, etc. void FHT(Type *Data, size_t Len) { size_t Step, Ptr, Ptr2; Type Bit1, Bit2, NewBit1, NewBit2; for(Step=1; Step void IFHT(Type *Data, size_t Len) { size_t Step, Ptr, Ptr2; Type Bit1, Bit2, NewBit1, NewBit2; for(Step=Len/2; Step; Step/=2) { for(Ptr=0; Ptr #include #include // ======================================================================== // array re(sizing), copy, move, preset, etc. template inline int ReallocArray(type **Array, size_t Size) { // CINT doesn't accept NULL pointers to realloc #ifdef __CINT__ // if(*Array) free(*Array); // (*Array)=(type *)malloc(Size*sizeof(type)); if(*Array) (*Array)=(type *)realloc(*Array,Size*sizeof(type)); else (*Array)=(type *)malloc(Size*sizeof(type)); #else (*Array)=(type *)realloc(*Array,Size*sizeof(type)); #endif return (*Array)==0 ? -1:0; } template int ReallocArraySafe(type **Array, size_t OldSize, size_t NewSize) { type *New; size_t Size; New=(type *)malloc(NewSize*sizeof(type)); if(New==0) return -1; Size=OldSize; if(NewSize inline int AllocArray(type **Array, size_t Size) { (*Array)=(type *)malloc(Size*sizeof(type)); return (*Array)==0; } template inline void ClearArray(type *Array, size_t Size) { memset(Array,0,Size*sizeof(type)); } template void PresetArray(type *Array, size_t Size, const type &Val) { size_t i; for(i=0; i inline void CopyArray(type *Dst, type *Src, size_t Size) { memcpy(Dst,Src,Size*sizeof(type)); } template inline void MoveArray(type *Dst, type *Src, size_t Size) { memmove(Dst,Src,Size*sizeof(type)); } template void PrintArray(type *Array, size_t Size, char *ValueFormat, char *IndexFormat="%3d", size_t Columns=10) { size_t Idx,Col; for(Col=0,Idx=0; Idx=Columns) { printf("\n"); Col=0; } } if(Col>0) printf("\n"); } // ----------------------------------------------------------------------- // 2-dimensional array (re)sizing template int AllocArray2D(type ***Array, size_t Rows, size_t Cols) { size_t i; (*Array)=(type **)malloc(Rows*(sizeof(type *))); if((*Array)==0) return -1; for(i=0; i int AddRowsToArray2D(type ***Array, size_t Rows, size_t Cols, size_t NewRows=1) { size_t i; type **NewArray; NewArray=(type **)malloc((Rows+NewRows)*(sizeof(type *))); if(NewArray==0) return -1; memcpy(NewArray,*Array,Rows*sizeof(type *)); return 0; } */ template void FreeArray2D(type **Array, size_t Rows) { size_t i; for(i=0; i void ClearArray2D(type **Array, size_t Rows, size_t Cols) { size_t i; for(i=0; i void PresetArray2D(type **Array, size_t Rows, size_t Cols, type &Val) { size_t i; for(i=0; i class Seq { public: Seq(); ~Seq(); // default constructor/destructor Seq(Seq &SrcSeq); // copy constructor void Init(); // user callable "constructor" int EnsureSpace(size_t ReqSpace); // make sure that there is enough space int EnsureSpace(void) { return EnsureSpace(Len); } int SetLen(size_t NewLen) { Len=NewLen; return EnsureSpace(Len); } int ReallocLen(size_t NewLen); int EnsureSpaceSafe(size_t ReqSpace); void Free(void); // free all allocated space, remove all data void Clear(void) { Len=0; } // clear the sequence (set length to zero) size_t Index(type *Item) { return (size_t)(Item-Elem); } type &operator[] (int idx) { return (Elem[idx]); } // [index] operator Seq const &operator=(Seq const &SrcSeq); // assignment operator type *First(void) { return Elem; } type *Last(void) { return Elem+(Len-1); } type *Append(size_t Num=1); // add one or more elements at the seq. end, returns the pointer to the new element(s) type *Insert(size_t Pos=0, size_t Num=1); // insert Num elements at Pos void Delete(size_t Pos=0, size_t Num=1); // delete Num elements at Pos void Shift(int Pos, const type &Fill); // shift left or right with filling int Truncate(size_t Margin=0); // remove unused but allocated space int Copy(type *Data, size_t DataLen); int Copy(Seq &Src, size_t StartPos=0) // copy the contains of another sequence { return Copy(Src.Elem+StartPos,Src.Len-StartPos); } int Copy(Seq &Seq, size_t StartPos, size_t MaxLen); void Move(Seq &Seq); // move the contains of another sequence, clear the other sequence int Join(const type &Data); int Join(type *Data, size_t DataLen); // join (append) given data int Join(Seq &Seq) { return Join(Seq.Elem,Seq.Len); } // join a copy of the other sequence int NullTerm(void); // null-terminate (for character strings) void Reverse(void); // reverse the sequence order void FillWith(const type &Data, size_t StartPos=0); // fill with given value void Print(char *Format, size_t Columns=10); int SaveToFile(FILE *File); int LoadFromFile(FILE *File); public: size_t Space; // that many elements are allocated in *Elem size_t Len; // that many elements are used up type *Elem; // the storage space, contains Len elements } ; template Seq::Seq() { Elem=0; Len=Space=0; } template void Seq::Init() { Elem=0; Len=Space=0; } template Seq::~Seq() { free(Elem); } template Seq::Seq(Seq &SrcSeq) { if(EnsureSpace(SrcSeq.Len)==0) { Len=SrcSeq.Len; memcpy(Elem,SrcSeq.Elem,Len*sizeof(type)); } } template void Seq::Free(void) { free(Elem); Elem=0; Space=Len=0; } template int Seq::EnsureSpace(size_t ReqSpace) { if(ReqSpace<=Space) return 0; // CINT doesn't accept NULL pointers to realloc() #ifdef __CINT__ if(Elem) Elem=(type *)realloc(Elem,ReqSpace*sizeof(type)); else Elem=(type *)malloc(ReqSpace*sizeof(type)); #else Elem=(type *)realloc(Elem,ReqSpace*sizeof(type)); #endif if(Elem==0) { Space=Len=0; return -1; } Space=ReqSpace; return 0; } template Seq const &Seq::operator=(Seq const &SrcSeq) { if((this!=&SrcSeq)&&(EnsureSpace(SrcSeq.Len)==0)) { Len=SrcSeq.Len; memcpy(Elem,SrcSeq.Elem,Len*sizeof(type)); } return (*this); } template int Seq::ReallocLen(size_t NewLen) { Elem=(type *)realloc(Elem,NewLen*sizeof(type)); if(Elem==0) { Space=Len=0; return -1; } Space=Len=NewLen; return 0; } template int Seq::Truncate(size_t Margin) { if(Space==(Len+Margin)) return 0; Elem=(type *)realloc(Elem,(Len+Margin)*sizeof(type)); if(Elem==0) { Space=Len=0; return -1; } Space=Len+Margin; return 0; } template void Seq::Move(Seq &Seq) { free(Elem); Len=Seq.Len; Space=Seq.Space; Elem=Seq.Elem; Seq.Elem=0; Seq.Len=Seq.Space=0; } template int Seq::Copy(type *Data, size_t DataLen) { if(EnsureSpace(DataLen)) return -1; memcpy(Elem,Data,DataLen*sizeof(type)); Len=DataLen; return 0; } template int Seq::Copy(Seq &Src, size_t StartPos, size_t MaxLen) { int DataLen; DataLen=Src.Len-StartPos; if(DataLen>MaxLen) DataLen=MaxLen; if(EnsureSpace(DataLen)) return -1; memcpy(Elem,Src.Elem+StartPos,DataLen*sizeof(type)); Len=DataLen; return 0; } template int Seq::Join(const type &Data) { if(EnsureSpace(Len+1)) return -1; Elem[Len++]=Data; return 0; } template int Seq::Join(type *Data, size_t DataLen) { if(EnsureSpace(Len+DataLen)) return -1; memcpy(Elem+Len,Data,DataLen*sizeof(type)); Len+=DataLen; return 0; } template type *Seq::Insert(size_t Pos, size_t Num) { if(EnsureSpace(Len+Num)) return 0; // int p; for(p=Len-1; p>=Pos; p--) Elem[p+Num]=Elem[p]; if((Len-Pos)>0) memmove(Elem+Pos+Num,Elem+Pos,(Len-Pos)*sizeof(type)); Len+=Num; return Elem+Pos; } template void Seq::Delete(size_t Pos, size_t Num) { if((Len-Pos-Num)>0) memmove(Elem+Pos,Elem+Pos+Num,(Len-Pos-Num)*sizeof(type)); Len-=Num; } template type *Seq::Append(size_t Num) { if(EnsureSpace(Len+Num)) return 0; Len+=Num; return Elem+(Len-Num); } /* template int Seq::NullTerm(void) { if(EnsureSpace(Len+1)) return -1; Elem[Len]=0; return 0; } int Seq::NullTerm(void) { if(EnsureSpace(Len+1)) return -1; Elem[Len]=0; return 0; } */ template void Seq::Reverse(void) { size_t i,j; type T; for(i=0,j=Len-1; i void Seq::FillWith(const type &Data, size_t StartPos) { size_t i; for(i=StartPos; i void Seq::Shift(int Pos, const type &Fill) { size_t i; if(Pos>0) // shift toward higher positions - data inserted at the start of the sequence { if(Pos void Seq::Print(char *Format, size_t Columns) { size_t i,Col; for(Col=0, i=0; i=Columns) { printf("\n"); Col=0; } } if(Col>0) printf("\n"); } // ======================================================================== // A 2-dimensional sequence template class Seq2d { public: Seq2d(); ~Seq2d(); int EnsureSpace(size_t rows, size_t cols); // make sure that there is enough space void Free(void); // free all space void Clear(void) { Rows=0; Cols=0; } // clear the sequence (set length to zero) // type &operator[] (int idx) { return (Elem[idx]); } // [idx] operator // type *Add(int Num=1); // add one or more elements, returns the index to the new element(s) size_t Rows,Cols; // that much is filled up size_t AllocRows,AllocCols; // that much is allocated type **Elem; // contains Len elements } ; template Seq2d::Seq2d() { Elem=0; AllocRows=Rows=AllocCols=Cols=0; } template Seq2d::~Seq2d() { size_t r; for(r=0; r void Seq2d::Free(void) { size_t r; for(r=0; r int Seq2d::EnsureSpace(size_t rows, size_t cols) { size_t r; type **New; if(rows>AllocRows) { New=(type**)malloc(rows*sizeof(type*)); if(New==0) { Free(); return -1; } // printf("[Seq2d::EnsureSpace] AllocRows %d->%d\n",AllocRows,rows); if(Elem) { memcpy(New,Elem,AllocRows*sizeof(type**)); free(Elem); } Elem=New; for(r=AllocRows; rAllocCols) { for(r=0; r%d\n",AllocCols,cols); AllocCols=cols; } return 0; } // ======================================================================== // A buffer structure for processing a continues series of samples. // It is a linear array: // - data between "Read" and "Write" is ready to be readout // - data between "Write" and "Size" is still beeing written or processed // - data before "Read" has been read-out and is thus obsolete // As more data comes the samples must be shifted and the obsolete data removed: // this is done by: RemovePastData() template class SampleBuffer { public: SampleBuffer() { Sample=0; AllocSize=Size=Read=Write=0; } ~SampleBuffer() { free(Sample); } void Free(void) { free(Sample); Sample=0; AllocSize=Size=Read=Write=0; } int EnsureSize(size_t MaxSize) { // printf(" SampleBuffer::EnsureSize(%d)\n",MaxSize); if(MaxSize<=AllocSize) return 0; #ifdef __CINT__ // CINT doesn't accept NULL pointers to realloc() if(Sample) Sample=(Type *)realloc(Sample,MaxSize*sizeof(Type)); else Sample=(Type *)malloc(MaxSize*sizeof(Type)); #else Sample=(Type *)realloc(Sample,MaxSize*sizeof(Type)); #endif if(Sample==0) { AllocSize=Size=0; return -1; } AllocSize=MaxSize; return 0; } int EnsureWriteLen(size_t MaxWriteLen) // ensure enough space for writing new data { return EnsureSize(Write+MaxWriteLen); } void SetEmpty(void) // remove all data, make buffer empty { Read=Write=Size=0; } void RemovePastData(void) // remove data before the read pointer { memcpy(Sample,Sample+Read,(Size-Read)*sizeof(Type)); Write-=Read; Size-=Read; Read=0; } Type &operator[] (size_t Idx) // access data given by index { return Sample[Idx]; } size_t ReadLen(void) // length of data to be read { return Write-Read; } Type *ReadPtr(void) // get pointer to read data { return Sample+Read; } size_t WriteLen(void) // length of data that can be written { return Size-Write; } Type *WritePtr(void) // get pointer to write data { return Sample+Write; } void Print(char *Title=0) { printf("%s Sample=%08X, Read=%d, Write=%d, Size=%d, AllocSize=%d\n", Title ? Title:"SampleBuffer:", (int)Sample, Read, Write, Size, AllocSize); } public: Type *Sample; // allocated storage pointer size_t Read; // index to data that is ready to be read size_t Write; // index to data that is still to be written size_t Size; // current size of data (includes data before the read pointer) size_t AllocSize; // allocated size for data } ; // ======================================================================== #endif // __STRUC_H__ fldigi-3.21.80/src/include/jalocha/pj_fifo.h0000664000175000017500000000561412313064025015450 00000000000000 #ifndef __FIFO_H__ #define __FIFO_H__ #include "pj_struc.h" // a simple FIFO buffer template class FIFO { public: size_t Len; private: size_t ReadPtr; size_t WritePtr; Type *Data; public: FIFO() { Init(); } ~FIFO() { free(Data); } void Init(void) { Data=0; Len=0; } void Free(void) { free(Data); Data=0; Len=0; } void Reset(void) { ReadPtr=WritePtr=0; } void Clear(void) { ReadPtr=WritePtr; } int Preset(void) { if(ReallocArray(&Data,Len)<0) return -1; Reset(); return 0; } // increment the pointer (with wrapping around) void IncrPtr(size_t &Ptr, size_t Step=1) { Ptr+=Step; if(Ptr>=Len) Ptr-=Len; } // FIFO is full ? int Full(void) { size_t Ptr=WritePtr; IncrPtr(Ptr); return (Ptr==ReadPtr); } // FIFO is empty ? int Empty(void) { return (ReadPtr==WritePtr); } // how many elements we can write = space left in the FIFO size_t WriteReady(void) { int Ready=ReadPtr-WritePtr; if(Ready<=0) Ready+=Len; return Ready-1; } // how many elements we can read = space taken in the FIFO size_t ReadReady(void) { int Ready=WritePtr-ReadPtr; if(Ready<0) Ready+=Len; return Ready; } // write a new element int Write(Type &NewData) { size_t Ptr=WritePtr; IncrPtr(Ptr); if(Ptr==ReadPtr) return 0; Data[WritePtr]=NewData; WritePtr=Ptr; return 1; } // read the oldest element int Read(Type &OldData) { if(ReadPtr==WritePtr) return 0; OldData=Data[ReadPtr]; IncrPtr(ReadPtr); return 1; } // lookup data in the FIFO but without taking them out int Lookup(Type &OldData, size_t Offset=0) { size_t Ready=ReadReady(); if(Offset>=Ready) return 0; size_t Ptr=ReadPtr; IncrPtr(Ptr,Offset); OldData=Data[Ptr]; return 1; } } ; /* // FIFO buffer for batches of data (incomplete) template class WideFIFO { public: size_t Width; size_t Len; size_t ReadPtr; size_t WritePtr; size_t Size; Type *Data; public: WideFIFO() { Init(); } ~WideFIFO() { free(Data); } void Init(void) { Data=0; Size=0; } void Free(void) { free(Data); Data=0; Size=0; } // reset: set pointers to the beginning of the buffer void Reset(void) { ReadPtr=WritePtr=0; } // preset for given length and width int Preset(size_t NewLen, size_t NewWidth) { Width=NewWidth; Len=NewLen; Size=Width*Len; if(ReallocArray(&Data,Size)<0) return -1; Reset(); return 0; } // increment the pointer (with wrapping around) void IncrPtr(size_t &Ptr, size_t Step=1) { Ptr+=Step; if(Ptr>=Len) Ptr-=Len; } int Full(void) { Ptr=WritePtr; Incr(Ptr); return (Ptr==ReadPtr); } int Empty(void) { return (ReadPtr==WritePtr); } int Write(Type *DataBatch) { } int Read(Type *DataBatch) { } } ; */ #endif // of __FIFO_H__ fldigi-3.21.80/src/include/jalocha/pj_gray.h0000664000175000017500000000117212313064025015462 00000000000000// Gray code convertion // (c) 2004, Pawel Jalocha #ifndef __GRAY_H__ #define __GRAY_H__ #include template Type GrayCode(Type Binary) { return Binary ^ (Binary>>1); } inline uint8_t BinaryCode(uint8_t Gray) { Gray ^= (Gray>>4); Gray ^= (Gray>>2); Gray ^= (Gray>>1); return Gray; } inline uint16_t BinaryCode(uint16_t Gray) { Gray ^= (Gray>>8); Gray ^= (Gray>>4); Gray ^= (Gray>>2); Gray ^= (Gray>>1); return Gray; } inline uint32_t BinaryCode(uint32_t Gray) { Gray ^= (Gray>>16); Gray ^= (Gray>>8); Gray ^= (Gray>>4); Gray ^= (Gray>>2); Gray ^= (Gray>>1); return Gray; } #endif fldigi-3.21.80/src/include/jalocha/pj_fft.h0000664000175000017500000004041512313064025015302 00000000000000// Fast Fourier Transform // (c) 1999-2004, Pawel Jalocha #ifndef __FFT_H__ #define __FFT_H__ #include #include "pj_cmpx.h" #include "pj_struc.h" // ---------------------------------------------------------------------------- /* How to use the r2FFT class: 1. define the object: r2FFT FFT; 2. preset it for given FFT length: ret=FFT.Preset(1024); if return code is negative => your RAM is out, you can't use the FFT object. - after FFT.Preset() you have the unscrambling table in FFT.BitRevIdx[] and the full (co)sine table in FFT.Twiddle[] 3. for forward complex FFT of "Data": FFT.Process(Data); (this includes unscrambling) 4. for inverse complex FFT of "Data": - first: negate the imaginary part of "Data" - second: execute FFT.Process(Data); - third: negate (again) the imaginary part of "Data" New feature: you can call FFT.Process(Data,Len); 5. You may call FFT.Free() to free allocated RAM, but you will need to call FFT.Preset() before using the FFT object again. 6. Scaling: each pass of the FFT.Process(Data) multiplies the energy of the sequence contained in "Data" by the length of the FFT. To get the same scale (amplitude) after executing one forward and another inverse FFT you need to multiply the sequence by 1/length. 7. To make an FFT of two _real_ time sequences in one go: - place the first time sequence in the real part of complex "Data" - place the second time sequence in the imaginary part of "Data" - execute: FFT.Process(Data); - execute: FFT.SeparTwoReals(Data,Spectr1,Spectr2); where Spectr1/2 are complex arrays half the size of the FFT length. Spectr1/2 contains now the complex FFT result for the first and second real input sequence - Scaling: the sequence energy is multiplied by FFT length 8. To execute an Inverse FFT as to get two real sequences out of two spectral data: - have the two freq. sequeces in Spectr1/2 - execute: FFT.JoinTwoReals(Spectr1,Spect2,Data); - execute: FFT.Process(Data); - Data[].Re contains the first time sequence - Data[].Im contains the second time sequence - Spectr1/2 and Data arrays are like for SeparTwoReals() - Scaling: the sequence energy is multiplied by _twice_ the FFT length */ template class r2FFT // radix-2 FFT { public: // size must a power of 2: 2,4,8,16,32,64,128,256,... r2FFT(int MaxSize) { BitRevIdx=0; Twiddle=0; Preset(MaxSize); } r2FFT() { BitRevIdx=0; Twiddle=0; } ~r2FFT() { free(BitRevIdx); free(Twiddle); } void Free(void) { free(BitRevIdx); BitRevIdx=0; free(Twiddle); Twiddle=0; } // preset tables for given (maximum) processing size int Preset(int MaxSize) { size_t idx,ridx,mask,rmask; double phase; size_t Size4; if(MaxSize<4) goto Error; Size=MaxSize; while((MaxSize&1)==0) MaxSize>>=1; if(MaxSize!=1) goto Error; if(ReallocArray(&BitRevIdx,Size)<0) goto Error; if(ReallocArray(&Twiddle,Size)<0) goto Error; // for(idx=0; idx>=1,rmask<<=1) { if(idx&mask) ridx|=rmask; } BitRevIdx[idx]=ridx; /* printf("%04x %04x\n",idx,ridx); */ } return 0; Error: Free(); return -1; } // scramble/unscramble (I)FFT input template void Scramble(DataType x[]) { size_t idx,ridx; DataType tmp; for(idx=0; idxidx) { tmp=x[idx]; x[idx]=x[ridx]; x[ridx]=tmp; /* printf("%d <=> %d\n",idx,ridx); */ } } } template void Scramble(DataType x[], size_t ShrinkShift) { size_t idx,ridx; DataType tmp; size_t Len=Size>>ShrinkShift; for(idx=0; idx>=ShrinkShift; if(ridx>idx) { tmp=x[idx]; x[idx]=x[ridx]; x[ridx]=tmp; /* printf("%d <=> %d\n",idx,ridx); */ } } } // separate the result of a two real channels FFT template void SeparTwoReals(BuffType Buff[], DataType Out0[], DataType Out1[]) { int idx,HalfSize=Size/2; // for(idx=0; idx void JoinTwoReals(DataType Inp0[], DataType Inp1[], BuffType Buff[]) { int idx,HalfSize=Size/2; // for(idx=0; idx void CoreProc(BuffType x[]) { size_t Groups,GroupSize2,Group,Bf,TwidIdx; size_t Size2=Size/2; for(Bf=0; Bf>=1, GroupSize2<<=1) for(Groups=Size2/2,GroupSize2=2; Groups; Groups>>=1, GroupSize2<<=1) for(Group=0,Bf=0; Group void CoreProc(BuffType x[], size_t ShrinkShift) { size_t Groups,GroupSize2,Group,Bf,TwidIdx,TwidIncr; size_t Len=Size>>ShrinkShift; size_t Size2=Size/2; size_t Len2=Len/2; for(Bf=0; Bf>=1, TwidIncr>>=1, GroupSize2<<=1) for(Group=0,Bf=0; Group int Process(BuffType x[]) { Scramble(x); CoreProc(x); return 0; } // find the "shrink" factor for processing batches smaller than declared by Preset() int FindShrinkShift(size_t Len) { size_t Shift; for(Shift=0; Len int Process(BuffType x[], size_t Len) { if(Len<4) return -1; if(Len==Size) { Scramble(x); CoreProc(x); return 0; } int ShrinkShift=FindShrinkShift(Len); if(ShrinkShift<0) return -1; Scramble(x,ShrinkShift); CoreProc(x,ShrinkShift); return 0; } public: size_t Size; // FFT size (needs to be power of 2) size_t *BitRevIdx; // Bit-reverse indexing table for data (un)scrambling Type *Twiddle; // Twiddle factors (sine/cos values) private: // classic radix-2 butterflies template inline void FFTbf(BuffType &x0, BuffType &x1, Type &W) { Type x1W; x1W.Re=x1.Re*W.Re+x1.Im*W.Im; // x1W.Re=x1.Re*W.Re-x1.Im*W.Im; x1W.Im=(-x1.Re*W.Im)+x1.Im*W.Re; // x1W.Im=x1.Re*W.Im+x1.Im*W.Re; x1.Re=x0.Re-x1W.Re; x1.Im=x0.Im-x1W.Im; x0.Re=x0.Re+x1W.Re; x0.Im=x0.Im+x1W.Im; } // special 2-point FFT for the first pass template inline void FFT2(BuffType &x0, BuffType &x1) { Type x1W; x1W.Re=x1.Re; x1W.Im=x1.Im; x1.Re=x0.Re-x1.Re; x1.Im=x0.Im-x1.Im; x0.Re+=x1W.Re; x0.Im+=x1W.Im; } // special 4-point FFT for the second pass template inline void FFT4(BuffType &x0, BuffType &x1, BuffType &x2, BuffType &x3) { Type x1W; x1W.Re=x2.Re; x1W.Im=x2.Im; x2.Re=x0.Re-x1W.Re; x2.Im=x0.Im-x1W.Im; x0.Re=x0.Re+x1W.Re; x0.Im=x0.Im+x1W.Im; x1W.Re=x3.Im; x1W.Im=(-x3.Re); x3.Re=x1.Re-x1W.Re; x3.Im=x1.Im-x1W.Im; x1.Re=x1.Re+x1W.Re; x1.Im=x1.Im+x1W.Im; } } ; // --------------------------------------------------------------------------- #if 0 // unused code, under developement // sliding window for FFT spectral analysis template class AnalysisWindow { public: AnalysisWindow() { Shape=0; Output=0; Len=0; Step=0; } ~AnalysisWindow() { free(Shape); free(Output); } void Free(void) { free(Shape); Shape=0; free(Output); Output=0; Tap.Free(); Len=0; Step=0; } int Preset(size_t WindowLen, size_t WindowStep=0, int WindowShape=2, double WindowScale=1.0) { size_t Idx; Len=WindowLen; if(WindowStep==0) // find default "Step" { if(WindowShape==1) WindowStep=WindowLen/2; else if(WindowShape==2) WindowStep=WindowLen/4; else WindowStep=WindowLen; } Step=WindowStep; if(WindowShape) // set the window shape { if(ReallocArray(&Shape,Len)<0) goto Error; if(WindowShape==1) // like Hamming but zero at the edges { for(Idx=0; Idx=Tap.Len) Tap.RemovePastData(); if(Tap.EnsureWriteLen(InpLen)<0) return -1; Tap.Size+=InpLen; memcpy(Tap.WritePtr(),Input,InpLen); Tap.Write+=InpLen; } int Process(Seq &Input) { return Process(Input.Elem,Input.Len); } // int Flush(size_t ZeroInpLen) // { return Process((Type *)0,ZeroInpLen); } size_t GetOutput(fcmpx *&Data) { if(OutputValid==0) { if(Tap.ReadLen() Tap; size_t Len; size_t Step; double *Shape; Type *Output; int OutputValid; } ; // --------------------------------------------------------------------------- // sliding window for FFT spectral synthesis template class SynthesisWindow { public: SynthesisWindow() { Shape=0; Len=0; Step=0; } ~SynthesisWindow() { free(Shape); } void Free(void) { free(Shape); Shape=0; Len=0; Step=0; Output.Free(); } int Preset(size_t WindowLen, size_t WindowStep=0, int WindowShape=2, double WindowScale=1.0) { size_t Idx; Len=WindowLen; if(WindowStep==0) // find default "Step" { if(WindowShape==1) WindowStep=WindowLen/2; else if(WindowShape==2) WindowStep=WindowLen/4; else WindowStep=WindowLen; } Step=WindowStep; if(WindowShape) // set the window shape { if(ReallocArray(&Shape,Len)<0) goto Error; if(WindowShape==1) // like Hamming but zero at the edges { for(Idx=0; Idx=Len) Output.RemovePastData(); if(Output.EnsureWriteLen(Len+Step)<0) { Free(); return -1; } Write=Output.WritePtr(); if(Shape) { for(Idx=0; Idx=Len) Output.RemovePastData(); if(Output.EnsureWriteLen(Len+Step)<0) { Free(); return -1; } Write=Output.WritePtr(); if(Shape) { for(Idx=0; Idx=Len) Output.RemovePastData(); if(Output.EnsureWriteLen(Len+Step)<0) { Free(); return -1; } Write=Output.WritePtr(); Write+=Len; for(Idx=0; Idx Output; } ; #endif // of unused code // --------------------------------------------------------------------------- #endif // __FFT_H__ fldigi-3.21.80/src/include/nullmodem.h0000664000175000017500000000236312313064025014425 00000000000000// ---------------------------------------------------------------------------- // NULLMODEM.h -- BASIS FOR ALL MODEMS // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _NULLMODEM_H #define _NULLMODEM_H #include "trx.h" #include "modem.h" #define NULLMODEMSampleRate 8000 class NULLMODEM : public modem { protected: public: NULLMODEM(); ~NULLMODEM(); void init(); void rx_init(); void restart(); void tx_init(SoundBase *sc); int rx_process(const double *buf, int len); int tx_process(); }; #endif fldigi-3.21.80/src/include/navtex.h0000664000175000017500000000277312313064025013743 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // Remi Chateauneu // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _NAVTEX_H #define _NAVTEX_H /// Forward definition. class navtex_implementation ; #include #include "modem.h" class navtex : public modem { navtex_implementation * m_impl ; /// Non-copiable object. navtex(); navtex(const navtex *); navtex & operator=(const navtex *); public: navtex (trx_mode md); virtual ~navtex(); void rx_init(); void tx_init(SoundBase *sc); void restart(); int rx_process(const double *buf, int len); int tx_process(); void set_freq( double ); std::string get_message(int max_seconds); std::string send_message(const std::string & msg); }; #endif fldigi-3.21.80/src/include/Fl_Text_Display_mod.H0000664000175000017500000004166712313064025016274 00000000000000// // "$Id: Fl_Text_Display_mod.H 8306 2011-01-24 17:04:22Z matt $" // // Header file for Fl_Text_Display_mod class. // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA. // // Please report all bugs and problems on the following page: // // http://www.fltk.org/str.php // /* \file Fl_Text_Display_mod widget . */ #ifndef Fl_Text_Display_mod_H #define Fl_Text_Display_mod_H #include #include #include #include #include #include "Fl_Text_Buffer_mod.H" /** \brief Rich text display widget. This is the FLTK text display widget. It allows the user to view multiple lines of text and supports highlighting and scrolling. The buffer that is displayed in the widget is managed by the Fl_Text_Buffer_mod class. A single Text Buffer can be displayed by multiple Text Displays. */ class FL_EXPORT Fl_Text_Display_mod: public Fl_Group { public: /** text display cursor shapes enumeration */ enum { NORMAL_CURSOR, /**< I-beam */ CARET_CURSOR, /**< caret under the text */ DIM_CURSOR, /**< dim I-beam */ BLOCK_CURSOR, /**< unfille box under the current character */ HEAVY_CURSOR /**< thick I-beam */ }; /** the character position is the left edge of a character, whereas the cursor is thought to be between the centers of two consecutive characters. */ enum { CURSOR_POS, CHARACTER_POS }; /** drag types - they match Fl::event_clicks() so that single clicking to start a collection selects by character, double clicking selects by word and triple clicking selects by line. */ enum { DRAG_NONE = -2, DRAG_START_DND = -1, DRAG_CHAR = 0, DRAG_WORD = 1, DRAG_LINE = 2 }; /** wrap types - used in wrap_mode() */ enum { WRAP_NONE, /**< don't wrap text at all */ WRAP_AT_COLUMN, /**< wrap text at the given text column */ WRAP_AT_PIXEL, /**< wrap text at a pixel position */ WRAP_AT_BOUNDS /**< wrap text so that it fits into the widget width */ }; friend void fl_text_drag_me(int pos, Fl_Text_Display_mod* d); typedef void (*Unfinished_Style_Cb)(int, void *); /** This structure associates the color, font, andsize of a string to draw with an attribute mask matching attr */ struct Style_Table_Entry { Fl_Color color; Fl_Font font; Fl_Fontsize size; unsigned attr; }; Fl_Text_Display_mod(int X, int Y, int W, int H, const char *l = 0); ~Fl_Text_Display_mod(); virtual int handle(int e); void buffer(Fl_Text_Buffer_mod* buf); /** Sets the current text buffer associated with the text widget. Multiple text widgets can be associated with the same text buffer. \param buf new text buffer */ void buffer(Fl_Text_Buffer_mod& buf) { buffer(&buf); } /** Gets the current text buffer associated with the text widget. Multiple text widgets can be associated with the same text buffer. \return current text buffer */ Fl_Text_Buffer_mod* buffer() const { return mBuffer; } void redisplay_range(int start, int end); void scroll(int topLineNum, int horizOffset); void insert(const char* text); void overstrike(const char* text); void insert_position(int newPos); /** Gets the position of the text insertion cursor for text display. \return insert position index into text buffer */ int insert_position() const { return mCursorPos; } int position_to_xy(int pos, int* x, int* y) const; int in_selection(int x, int y) const; void show_insert_position(); int move_right(); int move_left(); int move_up(); int move_down(); int count_lines(int start, int end, bool start_pos_is_line_start) const; int line_start(int pos) const; int line_end(int startPos, bool startPosIsLineStart) const; int skip_lines(int startPos, int nLines, bool startPosIsLineStart); int rewind_lines(int startPos, int nLines); void next_word(void); void previous_word(void); void show_cursor(int b = 1); /** Hides the text cursor. */ void hide_cursor() { show_cursor(0); } void cursor_style(int style); /** Gets the text cursor color. \return cursor color */ Fl_Color cursor_color() const {return mCursor_color;} /** Sets the text cursor color. \param n new cursor color */ void cursor_color(Fl_Color n) {mCursor_color = n;} /** Gets the width/height of the scrollbars. /return width of scrollbars */ int scrollbar_width() const { return scrollbar_width_; } /** Sets the width/height of the scrollbars. \param W width of scrollbars */ void scrollbar_width(int W) { scrollbar_width_ = W; } /** Gets the scrollbar alignment type. \return scrollbar alignment */ Fl_Align scrollbar_align() const { return scrollbar_align_; } /** Sets the scrollbar alignment type. \param a new scrollbar alignment */ void scrollbar_align(Fl_Align a) { scrollbar_align_ = a; } /** Moves the insert position to the beginning of the current word. \param pos start calculation at this index \return beginning of the words */ int word_start(int pos) const { return buffer()->word_start(pos); } /** Moves the insert position to the end of the current word. \param pos start calculation at this index \return index of first character after the end of the word */ int word_end(int pos) const { return buffer()->word_end(pos); } void highlight_data(Fl_Text_Buffer_mod *styleBuffer, const Style_Table_Entry *styleTable, int nStyles, char unfinishedStyle, Unfinished_Style_Cb unfinishedHighlightCB, void *cbArg); int position_style(int lineStartPos, int lineLen, int lineIndex) const; /** \todo FIXME : get set methods pointing on shortcut_ have no effects as shortcut_ is unused in this class and derived! \return the current shortcut key */ int shortcut() const {return shortcut_;} /** \todo FIXME : get set methods pointing on shortcut_ have no effects as shortcut_ is unused in this class and derived! \param s the new shortcut key */ void shortcut(int s) {shortcut_ = s;} /** Gets the default font used when drawing text in the widget. \return current text font face unless overridden by a style */ Fl_Font textfont() const {return textfont_;} /** Sets the default font used when drawing text in the widget. \param s default text font face */ void textfont(Fl_Font s) {textfont_ = s; mColumnScale = 0;} /** Gets the default size of text in the widget. \return current text height unless overridden by a style */ Fl_Fontsize textsize() const {return textsize_;} /** Sets the default size of text in the widget. \param s new text size */ void textsize(Fl_Fontsize s) {textsize_ = s; mColumnScale = 0;} /** Gets the default color of text in the widget. \return text color unless overridden by a style */ Fl_Color textcolor() const {return textcolor_;} /** Sets the default color of text in the widget. \param n new text color */ void textcolor(Fl_Color n) {textcolor_ = n;} int wrapped_column(int row, int column) const; int wrapped_row(int row) const; void wrap_mode(int wrap, int wrap_margin); virtual void resize(int X, int Y, int W, int H); /** Convert an x pixel position into a column number. \param x number of pixels from the left margin \return an approximate column number based on the main font */ double x_to_col(double x) const; /** Convert a column number into an x pixel position. \param col an approximate column number based on the main font \return number of pixels from the left margin to the left of an average sized character */ double col_to_x(double col) const; protected: // Most (all?) of this stuff should only be called from resize() or // draw(). // Anything with "vline" indicates thats it deals with currently // visible lines. virtual void draw(); void draw_text(int X, int Y, int W, int H); void draw_range(int start, int end); void draw_cursor(int, int); void draw_string(int style, int x, int y, int toX, const char *string, int nChars) const; void draw_vline(int visLineNum, int leftClip, int rightClip, int leftCharIndex, int rightCharIndex); int find_x(const char *s, int len, int style, int x) const; enum { DRAW_LINE, FIND_INDEX, FIND_INDEX_FROM_ZERO, GET_WIDTH }; int handle_vline(int mode, int lineStart, int lineLen, int leftChar, int rightChar, int topClip, int bottomClip, int leftClip, int rightClip) const; void draw_line_numbers(bool clearAll); void clear_rect(int style, int x, int y, int width, int height) const; void display_insert(); void offset_line_starts(int newTopLineNum); void calc_line_starts(int startLine, int endLine); void update_line_starts(int pos, int charsInserted, int charsDeleted, int linesInserted, int linesDeleted, int *scrolled); void calc_last_char(); int position_to_line( int pos, int* lineNum ) const; double string_width(const char* string, int length, int style) const; static void scroll_timer_cb(void*); static void buffer_predelete_cb(int pos, int nDeleted, void* cbArg); static void buffer_modified_cb(int pos, int nInserted, int nDeleted, int nRestyled, const char* deletedText, void* cbArg); static void h_scrollbar_cb(Fl_Scrollbar* w, Fl_Text_Display_mod* d); static void v_scrollbar_cb( Fl_Scrollbar* w, Fl_Text_Display_mod* d); void update_v_scrollbar(); void update_h_scrollbar(); int measure_vline(int visLineNum) const; int longest_vline() const; int empty_vlines() const; int vline_length(int visLineNum) const; int xy_to_position(int x, int y, int PosType = CHARACTER_POS) const; void xy_to_rowcol(int x, int y, int* row, int* column, int PosType = CHARACTER_POS) const; void maintain_absolute_top_line_number(int state); int get_absolute_top_line_number() const; void absolute_top_line_number(int oldFirstChar); int maintaining_absolute_top_line_number() const; void reset_absolute_top_line_number(); int position_to_linecol(int pos, int* lineNum, int* column) const; int scroll_(int topLineNum, int horizOffset); void extend_range_for_styles(int* start, int* end); void find_wrap_range(const char *deletedText, int pos, int nInserted, int nDeleted, int *modRangeStart, int *modRangeEnd, int *linesInserted, int *linesDeleted); void measure_deleted_lines(int pos, int nDeleted); void wrapped_line_counter(Fl_Text_Buffer_mod *buf, int startPos, int maxPos, int maxLines, bool startPosIsLineStart, int styleBufOffset, int *retPos, int *retLines, int *retLineStart, int *retLineEnd, bool countLastLineMissingNewLine = true) const; void find_line_end(int pos, bool start_pos_is_text_start, int *lineEnd, int *nextLineStart) const; double measure_proportional_character(const char *s, int colNum, int pos) const; int wrap_uses_character(int lineEndPos) const; static const int DEFAULT_TOP_MARGIN; static const int DEFAULT_BOTTOM_MARGIN; static const int DEFAULT_LEFT_MARGIN; static const int DEFAULT_RIGHT_MARGIN; int TOP_MARGIN, BOTTOM_MARGIN, LEFT_MARGIN, RIGHT_MARGIN; int damage_range1_start, damage_range1_end; int damage_range2_start, damage_range2_end; int mCursorPos; int mCursorOn; int mCursorOldY; /* Y pos. of cursor for blanking */ int mCursorToHint; /* Tells the buffer modified callback where to move the cursor, to reduce the number of redraw calls */ int mCursorStyle; /* One of enum cursorStyles above */ int mCursorPreferredXPos; /* Pixel position for vert. cursor movement */ int mNVisibleLines; /* # of visible (displayed) lines */ int mNBufferLines; /* # of newlines in the buffer */ Fl_Text_Buffer_mod* mBuffer; /* Contains text to be displayed */ Fl_Text_Buffer_mod* mStyleBuffer; /* Optional parallel buffer containing color and font information */ int mFirstChar, mLastChar; /* Buffer positions of first and last displayed character (lastChar points either to a newline or one character beyond the end of the buffer) */ int mContinuousWrap; /* Wrap long lines when displaying */ int mFastDisplay; /* force continuous wrap and insertion of eol characters used in FTextRX */ std::string s_text; /* current contents of line text buffer */ std::string s_style; /* current contents of line stype buffer */ int mWrapMarginPix; /* Margin in # of pixels for wrapping in continuousWrap mode */ int* mLineStarts; int mTopLineNum; /* Line number of top displayed line of file (first line of file is 1) */ int mAbsTopLineNum; /* In continuous wrap mode, the line number of the top line if the text were not wrapped (note that this is only maintained as needed). */ int mNeedAbsTopLineNum; /* Externally settable flag to continue maintaining absTopLineNum even if it isn't needed for line # display */ int mHorizOffset; /* Horizontal scroll pos. in pixels */ int mTopLineNumHint; /* Line number of top displayed line of file (first line of file is 1) */ int mHorizOffsetHint; /* Horizontal scroll pos. in pixels */ int mNStyles; /* Number of entries in styleTable */ const Style_Table_Entry *mStyleTable; /* Table of fonts and colors for coloring/syntax-highlighting */ char mUnfinishedStyle; /* Style buffer entry which triggers on-the-fly reparsing of region */ Unfinished_Style_Cb mUnfinishedHighlightCB; /* Callback to parse "unfinished" */ /* regions */ void* mHighlightCBArg; /* Arg to unfinishedHighlightCB */ int mMaxsize; int mSuppressResync; /* Suppress resynchronization of line starts during buffer updates */ int mNLinesDeleted; /* Number of lines deleted during buffer modification (only used when resynchronization is suppressed) */ int mModifyingTabDistance; /* Whether tab distance is being modified */ mutable double mColumnScale; /* Width in pixels of an average character. This value is calculated as needed (lazy eval); it needs to be mutable so that it can be calculated within a method marked as "const" */ Fl_Color mCursor_color; Fl_Scrollbar* mHScrollBar; Fl_Scrollbar* mVScrollBar; int scrollbar_width_; Fl_Align scrollbar_align_; int dragPos, dragType, dragging; int display_insert_position_hint; struct { int x, y, w, h; } text_area; int shortcut_; Fl_Font textfont_; Fl_Fontsize textsize_; Fl_Color textcolor_; // The following are not presently used from the original NEdit code, // but are being put here so that future versions of Fl_Text_Display_mod // can implement line numbers without breaking binary compatibility. /* Line number margin and width */ int mLineNumLeft, mLineNumWidth; }; #endif // // End of "$Id: Fl_Text_Display_mod.H 8306 2011-01-24 17:04:22Z matt $". // fldigi-3.21.80/src/include/font_browser.h0000664000175000017500000000571012313064025015141 00000000000000// ---------------------------------------------------------------------------- // Font_Browser.h v 0.0.1 2005-10-17 // // for the Fast Light Tool Kit (FLTK) 1.1.x . // // David Freese, w1hkj@w1hkj.com // based on similar widget by Mariwan Jalal // // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef FONTBROWSER_H #define FONTBROWSER_H #include #include #include #include #include #include #include "flslider2.h" // Preview box for showing font class Preview_Box : public Fl_Widget { private: int fontName; int fontSize; Fl_Color fontColor; void draw(); public: Preview_Box(int x, int y, int w, int h, const char* l); void SetFont( int fontname, int fontsize, Fl_Color c); }; // Font browser widget class Font_Browser : public Fl_Window { public: enum filter_t { FIXED_WIDTH, VARIABLE_WIDTH, ALL_TYPES }; private: int numfonts; Fl_Font fontnbr; int fontsize; Fl_Color fontcolor; filter_t filter; void *data_; Fl_Browser *lst_Font; Fl_Browser *lst_Size; Fl_Value_Input2 *txt_Size; Fl_Return_Button *btn_OK; Fl_Button *btn_Cancel; Fl_Button *btn_Color; Preview_Box *box_Example; void FontSort(); Fl_Callback* callback_; public: Font_Browser(int x = 100, int y = 100, int w = 430, int h = 225, const char *lbl = "Font Browser"); void callback(Fl_Callback* cb, void *d = 0) { callback_ = cb; data_ = d; } static void fb_callback(Fl_Widget* w, void* arg); void FontNameSelect(); void ColorSelect(); int numFonts() { return numfonts; } void fontNumber(Fl_Font n); Fl_Font fontNumber() { return fontnbr; } void fontSize(int s); int fontSize() { return fontsize; } void fontColor(Fl_Color c); Fl_Color fontColor() { return fontcolor; }; const char *fontName() { return lst_Font->text(lst_Font->value()); } void fontName(const char* n); static bool fixed_width(Fl_Font f); void fontFilter(filter_t filter); }; extern Font_Browser* font_browser; #endif fldigi-3.21.80/src/include/dominovar.h0000664000175000017500000000201212313064025014416 00000000000000/* * varicode.h -- DominoEX Varicode * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of fldigi. * * Fldigi 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. * * Fldigi 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 fldigi. If not, see . * */ #ifndef _DOMVARICODE_H #define _DOMVARICODE_H #define MAX_VARICODE_LEN 3 extern unsigned char *dominoex_varienc(unsigned char c, int secondary); extern int dominoex_varidec(unsigned int symbol); #endif fldigi-3.21.80/src/include/macroedit.h0000664000175000017500000000311612313064025014375 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef MACROEDIT_H #define MACROEDIT_H #include #include #include #include #include #include #include #include "flinput2.h" extern void loadBrowser(Fl_Widget *widget); extern Fl_Button *btnMacroEditOK; extern Fl_Button *btnMacroEditCancel; extern Fl_Hold_Browser *macroDefs; extern Fl_Button *btnInsertMacro; extern Fl_Input2 *macrotext; extern Fl_Input2 *labeltext; extern Fl_Double_Window *MacroEditDialog; extern Fl_Double_Window* make_macroeditor(); enum { MACRO_EDIT_BUTTON, MACRO_EDIT_INPUT }; extern void editMacro(int b, int t = MACRO_EDIT_BUTTON, Fl_Input* in = 0); #endif fldigi-3.21.80/src/include/viterbi.h0000664000175000017500000000316412313064025014075 00000000000000// ---------------------------------------------------------------------------- // viterbi.h -- Viterbi decoder // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. These filters were adapted from code contained // in the gmfsk source code distribution. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef VITERBI_H #define VITERBI_H #define PATHMEM 128 class viterbi { private: int _traceback; int _chunksize; int nstates; int *output; int *metrics[PATHMEM]; int *history[PATHMEM]; int sequence[PATHMEM]; int mettab[2][256]; unsigned int ptr; int traceback(int *metric); public: viterbi(int k, int poly1, int poly2); ~viterbi(); void reset(); int settraceback(int trace); int setchunksize(int chunk); int decode(unsigned char *sym, int *metric); }; class encoder { private: int *output; unsigned int shreg; unsigned int shregmask; public: encoder(int k, int poly1, int poly2); ~encoder(); int encode(int bit); }; #endif fldigi-3.21.80/src/include/nls.h0000664000175000017500000000235112313064025013222 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef NLS_H_ #define NLS_H_ #include #if ENABLE_NLS && defined(__WOE32__) struct lang_def_t { const char* lang; const char* lang_region; const char* native_name; int percent_done; }; extern struct lang_def_t ui_langs[]; int get_ui_lang(const char* homedir = NULL); void set_ui_lang(int lang, const char* homedir = NULL); #endif #endif // NLS_H_ fldigi-3.21.80/src/include/htmlstrings.h0000664000175000017500000000175712313064025015015 00000000000000// ---------------------------------------------------------------------------- // // htmlstrings.h // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef HTMLSTRINGS_H #define HTMLSTRINGS_H extern const char* szBeginner; extern const char* szAbout; #endif fldigi-3.21.80/src/include/hamlib.h0000664000175000017500000000316412313064025013665 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _HAMLIB_H #define _HAMLIB_H #include extern void hamlib_get_rigs(void); extern size_t hamlib_get_index(rig_model_t model); extern rig_model_t hamlib_get_rig_model(size_t i); extern rig_model_t hamlib_get_rig_model_compat(const char* name); extern void hamlib_get_rig_str(int (*func)(const char*)); extern void hamlib_close(); extern bool hamlib_init(bool bPtt); extern void hamlib_set_ptt(int); extern void hamlib_set_qsy(long long f); extern int hamlib_setfreq(long int); extern int hamlib_setmode(rmode_t); extern rmode_t hamlib_getmode(); extern int hamlib_setwidth(pbwidth_t); extern pbwidth_t hamlib_getwidth(); extern void hamlib_get_defaults(); extern void hamlib_restore_defaults(); extern void hamlib_init_defaults(); #endif fldigi-3.21.80/src/include/logsupport.h0000664000175000017500000000541112313147746014660 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef SUPPORT_H #define SUPPORT_H #include #include #include #include "qso_db.h" #include "adif_io.h" #include "lgbook.h" #ifdef __WOE32__ # define ADIF_SUFFIX "adi" #else # define ADIF_SUFFIX "adif" #endif enum savetype {ADIF, CSV, TEXT, LO}; extern cQsoDb qsodb; extern cAdifIO adifFile; extern std::string logbook_filename; extern std::string sDate_on; extern std::string sDate_off; extern std::string sTime_on; extern std::string sTime_off; extern void loadBrowser(bool keep_pos = false); extern void Export_log(); extern void cb_SortByCall(); extern void cb_SortByDate(); extern void cb_SortByMode(); extern void cb_SortByFreq(); extern void cb_browser(Fl_Widget *, void *); extern void cb_mnuNewLogbook(Fl_Menu_* m, void* d); extern void cb_mnuOpenLogbook(Fl_Menu_* m, void* d); extern void cb_mnuSaveLogbook(Fl_Menu_*m, void* d); extern void cb_mnuMergeADIF_log(Fl_Menu_* m, void* d); extern void cb_mnuExportADIF_log(Fl_Menu_* m, void* d); extern void cb_mnuExportCSV_log(Fl_Menu_* m, void* d); extern void cb_mnuExportTEXT_log(Fl_Menu_* m, void* d); extern void cb_Export_Cabrillo(Fl_Menu_* m, void* d); extern void cb_export_date_select(); extern void saveLogbook(); extern void cb_mnuShowLogbook(Fl_Menu_ *m, void* d); extern void activateButtons(); extern void saveRecord (); extern void clearRecord (); extern void updateRecord (); extern void deleteRecord (); extern void AddRecord (); extern void DisplayRecord (int idxRec); extern void SearchLastQSO (const char *); extern cQsoRec* SearchLog(const char *callsign); extern void DupCheck(); extern void cb_search(Fl_Widget* w, void*); extern int log_search_handler(int); extern void reload_browser(); extern void cb_doExport(); extern void WriteCabrillo(); extern void dxcc_entity_cache_enable(bool v); extern bool qsodb_dxcc_entity_find(const char* country); extern void adif_read_OK(); #endif fldigi-3.21.80/src/include/mixer.h0000664000175000017500000000712412313064025013555 00000000000000// ---------------------------------------------------------------------------- // // mixer.h // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // Copyright (C) 2007-2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef MIXER_H #define MIXER_H #include #include #include #if USE_OSS # if defined(__OpenBSD__) # include # else # include # endif #endif class MixerException { char szError[80]; int error; public: MixerException() { *szError = 0; error = 0; } MixerException(int e) { snprintf(szError, sizeof(szError), "Mixer error %d: %s", e, strerror(e)); error = e; } MixerException(char *s) { snprintf(szError, sizeof(szError), "Mixer error: %s", s); error = 1; } const char* what(void) const { return szError; } }; class MixerBase { public: MixerBase() { } virtual ~MixerBase() { } virtual void openMixer(const char* dev = "/dev/mixer") { }; virtual void closeMixer(void) { }; virtual void setXmtLevel(double v) { }; virtual void setRcvGain(double v) { }; virtual double PCMVolume(void) { return 0; }; virtual void PCMVolume(double volume) { }; virtual int InputSourceNbr(const char *source) { return 0; }; virtual void SetCurrentInputSource(int i) { }; }; #if USE_OSS class MixerOSS : public MixerBase { private: std::string mixer; int mixer_fd; int recmask; int devmask; int outmask; int recsrc; int recmask0; int devmask0; int recsrc0; int num_out; int outs[SOUND_MIXER_NRDEVICES]; int num_rec; int recs[SOUND_MIXER_NRDEVICES]; // values on init for restoration int inpsrc0; double linelevel0; // double lineplaythrough0; double miclevel0; // double micplaythrough0; double pcmlevel0; double vollevel0; // double playthrough0; int NumMixers; int NumDevice; int Devices[10]; char szDevice[12]; int initMask(); void findNumMixers(); double ChannelVolume(int); void initValues(); void restoreValues(); public: MixerOSS(); ~MixerOSS(); void openMixer(const char *dev = "/dev/mixer"); void closeMixer(); void setXmtLevel(double v); void setRcvGain(double v); double PCMVolume(); void PCMVolume(double volume ); int InputSourceNbr(const char *source); void SetCurrentInputSource( int i ); // double GetPlaythrough(); // void SetPlaythrough( double volume ); // void SetMuteInput(bool); protected: int numMixers() { return NumMixers;} int MixerNum(int i) { return Devices[i];} const char * MixerName( int index ); double OutVolume(); void OutVolume(double vol); int NumOutputVolumes(); double OutputVolume( int i ); void OutputVolume( int i, double volume ); const char * OutputVolumeName( int i ); int GetNumInputSources(); const char * GetInputSourceName( int i); double InputVolume(); void InputVolume( double volume ); int GetCurrentInputSource(); }; #endif // USE_OSS #endif fldigi-3.21.80/src/include/spot.h0000664000175000017500000000405712313064025013420 00000000000000// ---------------------------------------------------------------------------- // spot.h // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef SPOT_H_ #define SPOT_H_ #if HAVE_REGEX_H # include #else # include "compat/regex.h" #endif #include #include "globals.h" typedef void (*spot_recv_cb_t)(trx_mode mode, int afreq, const char* str, const regmatch_t* sub, size_t len, void* data); typedef void (*spot_log_cb_t)(const char* call, const char* loc, long long freq, trx_mode mode, time_t rtime, void* data); void spot_recv(char c, int decoder = -1, int afreq = 0, int md = 0); void spot_log(const char* callsign, const char* locator = "", long long freq = 0LL, trx_mode mode = NUM_MODES, time_t rtime = -1L); void spot_manual(const char* callsign, const char* locator = "", long long freq = 0LL, trx_mode mode = NUM_MODES, time_t rtime = -1L); void spot_register_log(spot_log_cb_t lcb, void* ldata); void spot_register_manual(spot_log_cb_t mcb, void* mdata); void spot_register_recv(spot_recv_cb_t rcb, void* rdata, const char* re, int reflags); void spot_unregister_log(spot_log_cb_t lcb, const void* ldata); void spot_unregister_manual(spot_log_cb_t mcb, const void* mdata); void spot_unregister_recv(spot_recv_cb_t rcb, const void* rdata); #endif // SPOT_H_ fldigi-3.21.80/src/include/cw.h0000664000175000017500000001547512313064025013052 00000000000000// ---------------------------------------------------------------------------- // cw.h -- morse code modem // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted in part from code contained in // gmfsk source code distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _CW_H #define _CW_H #include #include #include "modem.h" #include "filters.h" #include "fftfilt.h" #include "mbuffer.h" #define CWSampleRate 8000 #define CWMaxSymLen 4096 // AG1LE: - was 4096 #define KNUM 122 // decimation ratio for the receiver //#define DEC_RATIO 8 //#define CW_FIRLEN 32 //#define CW_FIRLEN 122 //#define CW_FIRLEN 256 //#define CW_FIRLEN 512 // Limits on values of CW send and timing parameters //#define CW_MIN_SPEED 5 // Lowest WPM allowed //#define CW_MAX_SPEED 100 // Highest WPM allowed // CW function return status codes. #define CW_SUCCESS 0 #define CW_ERROR -1 #define ASC_NUL '\0' // End of string #define ASC_SPACE ' ' // ASCII space char // Tone and timing magic numbers. #define DOT_MAGIC 1200000 // Dot length magic number. The Dot // length is 1200000/WPM Usec #define TONE_SILENT 0 // 0Hz = silent 'tone' #define USECS_PER_SEC 1000000 // Microseconds in a second #define INITIAL_SEND_SPEED 18 // Initial send speed in WPM #define INITIAL_RECEIVE_SPEED 18 // Initial receive speed in WPM // Initial adaptive speed threshold #define INITIAL_THRESHOLD ((DOT_MAGIC / INITIAL_RECEIVE_SPEED) * 2) // Initial noise filter threshold #define INITIAL_NOISE_THRESHOLD ((DOT_MAGIC / CW_MAX_SPEED) / 2) #define TRACKING_FILTER_SIZE 16 #define MAX_PIPE_SIZE (22 * CWSampleRate * 12 / 800) enum CW_RX_STATE { RS_IDLE = 0, RS_IN_TONE, RS_AFTER_TONE }; enum CW_EVENT { CW_RESET_EVENT, CW_KEYDOWN_EVENT, CW_KEYUP_EVENT, CW_QUERY_EVENT }; class cw : public modem { #define CLRCOUNT 16 #define DEC_RATIO 16 #define CW_FIRLEN 512 // Maximum number of signs (dit or dah) in a Morse char. #define WGT_SIZE 7 struct SOM_TABLE { char chr; /* The character(s) represented */ const char *prt; /* The printable representation of the character */ float wgt[WGT_SIZE]; /* Dot-dash weight vector */ }; protected: int symbollen; // length of a dot in sound samples (tx) int fsymlen; // length of extra interelement space (farnsworth) double phaseacc; // used by NCO for rx/tx tones double FFTphase; double FIRphase; double FFTvalue; double FIRvalue; unsigned int smpl_ctr; // sample counter for timing cw rx double agc_peak; // threshold for tone detection int FilterFFTLen; bool use_matched_filter; bool use_fft_filter; double upper_threshold; double lower_threshold; C_FIR_filter *hilbert; // Hilbert filter precedes sinc filter fftfilt *cw_FFT_filter; // sinc / matched filter C_FIR_filter *cw_FIR_filter; // linear phase finite impulse response filter Cmovavg *bitfilter; Cmovavg *trackingfilter; int bitfilterlen; CW_RX_STATE cw_receive_state; // Indicates receive state CW_RX_STATE old_cw_receive_state; CW_EVENT cw_event; // functions used by cw process routine double pipe[MAX_PIPE_SIZE+1]; // storage for sync scope data double clearpipe[MAX_PIPE_SIZE+1]; mbuffer scopedata; int pipeptr; int pipesize; bool scope_clear; // user configurable data - local copy passed in from gui int cw_speed; int cw_bandwidth; int cw_squelch; int cw_send_speed; // Initially 18 WPM int cw_receive_speed; // Initially 18 WPM bool usedefaultWPM; // use default WPM int cw_upper_limit; int cw_lower_limit; long int cw_noise_spike_threshold; // Initially ignore any tone < 10mS int cw_in_sync; // Synchronization flag // Sending parameters: long int cw_send_dot_length; // Length of a send Dot, in Usec long int cw_send_dash_length; // Length of a send Dash, in Usec int lastsym; // last symbol sent double risetime; // leading/trailing edge rise time (msec) int knum; // number of samples on edges int QSKshape; // leading/trailing edge shape factor double qskbuf[OUTBUFSIZE]; // signal array for qsk drive double qskphase; // bool firstelement; // double *keyshape; // array defining leading edge // Receiving parameters: long int cw_receive_dot_length; // Length of a receive Dot, in Usec long int cw_receive_dash_length; // Length of a receive Dash, in Usec // Receive buffering #define RECEIVE_CAPACITY 256 // Way longer than any representation char rx_rep_buf[RECEIVE_CAPACITY]; int cw_rr_current; // Receive buffer current location unsigned int cw_rr_start_timestamp; // Tone start timestamp unsigned int cw_rr_end_timestamp; // Tone end timestamp long int cw_adaptive_receive_threshold; // 2-dot threshold for adaptive speed int in_replay; //AG1LE: if we have replay even, set to 1 otherwise = 0 ; // Receive adaptive speed tracking. double dot_tracking; double dash_tracking; inline double nco(double freq); inline double qsknco(); void update_syncscope(); void clear_syncscope(); void update_Status(); void sync_parameters(); void reset_rx_filter(); int handle_event(int cw_event, const char **c); int usec_diff(unsigned int earlier, unsigned int later); void send_symbol(int symbol, int len); void send_ch(int c); bool tables_init(); unsigned int tokenize_representation(char *representation); void update_tracking(int dot, int dash); void makeshape(); cmplx mixer(cmplx in); static const SOM_TABLE som_table[]; float cw_buffer[512]; int cw_ptr; int clrcount; bool use_paren; std::string prosigns; public: cw(); ~cw(); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart() {}; int rx_process(const double *buf, int len); void rx_FFTprocess(const double *buf, int len); void rx_FIRprocess(const double *buf, int len); void decode_stream(double); int tx_process(); void incWPM(); void decWPM(); void toggleWPM(); int normalize(float *v, int n, int twodots); const char *find_winner (float *inbuf, int twodots); }; #endif fldigi-3.21.80/src/include/threads.h0000664000175000017500000001013112313147652014063 00000000000000// ---------------------------------------------------------------------------- // threads.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef THREADS_H_ #define THREADS_H_ #include #include #include #include #if !HAVE_SEM_TIMEDWAIT # include int sem_timedwait(sem_t* sem, const struct timespec* abs_timeout); #endif int sem_timedwait_rel(sem_t* sem, double rel_timeout); int pthread_cond_timedwait_rel(pthread_cond_t* cond, pthread_mutex_t* mutex, double rel_timeout); enum { INVALID_TID = -1, TRX_TID, QRZ_TID, RIGCTL_TID, NORIGCTL_TID, EQSL_TID, ADIF_RW_TID, XMLRPC_TID, ARQ_TID, ARQSOCKET_TID, FLMAIN_TID, NUM_THREADS, NUM_QRUNNER_THREADS = NUM_THREADS - 1 }; #ifdef __linux__ void linux_log_tid(void); # define LOG_THREAD_ID() linux_log_tid() #else # define LOG_THREAD_ID() /* nothing */ #endif #if USE_TLS # define THREAD_ID_TYPE __thread intptr_t # define CREATE_THREAD_ID() thread_id_ = INVALID_TID # define SET_THREAD_ID(x) do { thread_id_ = (x); LOG_THREAD_ID(); } while (0) # define GET_THREAD_ID() thread_id_ #else # define THREAD_ID_TYPE pthread_key_t # define CREATE_THREAD_ID() pthread_key_create(&thread_id_, NULL) # define SET_THREAD_ID(x) do { pthread_setspecific(thread_id_, (const void *)(x + 1)); LOG_THREAD_ID(); } while (0) # define GET_THREAD_ID() ((intptr_t)pthread_getspecific(thread_id_) - 1) #endif // USE_TLS extern THREAD_ID_TYPE thread_id_; #ifndef NDEBUG # include "debug.h" bool thread_in_list(int id, const int* list); # define ENSURE_THREAD(...) \ do { \ int id_ = GET_THREAD_ID(); \ int t_[] = { __VA_ARGS__, INVALID_TID }; \ if (!thread_in_list(id_, t_)) \ LOG_ERROR("bad thread context: %d", id_); \ } while (0) # define ENSURE_NOT_THREAD(...) \ do { \ int id_ = GET_THREAD_ID(); \ int t_[] = { __VA_ARGS__, INVALID_TID }; \ if (thread_in_list(id_, t_)) \ LOG_ERROR("bad thread context: %d", id_); \ } while (0) #else # define ENSURE_THREAD(...) ((void)0) # define ENSURE_NOT_THREAD(...) ((void)0) #endif // ! NDEBUG // On POSIX systems we cancel threads by sending them SIGUSR2, // which will also interrupt blocking calls. On woe32 we use // pthread_cancel and there is no good/sane way to interrupt. #ifndef __WOE32__ # define SET_THREAD_CANCEL() \ do { \ sigset_t usr2; \ sigemptyset(&usr2); \ sigaddset(&usr2, SIGUSR2); \ pthread_sigmask(SIG_UNBLOCK, &usr2, NULL); \ } while (0) # define TEST_THREAD_CANCEL() /* nothing */ # define CANCEL_THREAD(t__) pthread_kill(t__, SIGUSR2) #else // threads have PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DEFERRED when created # define SET_THREAD_CANCEL() /* nothing */ # define TEST_THREAD_CANCEL() pthread_testcancel() # define CANCEL_THREAD(t__) pthread_cancel(t__); #endif #include "fl_lock.h" /// This ensures that a mutex is always unlocked when leaving a function or block. class guard_lock { public: guard_lock(pthread_mutex_t* m); ~guard_lock(void); private: pthread_mutex_t* mutex; }; /// This wraps together a mutex and a condition variable which are used /// together very often for queues etc... class syncobj { pthread_mutex_t m_mutex ; pthread_cond_t m_cond ; public: syncobj(); ~syncobj(); pthread_mutex_t * mtxp(void) { return & m_mutex; } void signal(); bool wait( double seconds ); }; #endif // !THREADS_H_ fldigi-3.21.80/src/include/record_loader.h0000664000175000017500000000455412313064025015241 00000000000000// ---------------------------------------------------------------------------- // record_loader.h // // Copyright (C) 2013 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef RECORD_LOADER_H #define RECORD_LOADER_H #include #include class RecordLoaderInterface { RecordLoaderInterface & operator=( const RecordLoaderInterface & ); public: RecordLoaderInterface(); virtual void Clear() = 0 ; /// Reads just one record. virtual bool ReadRecord( std::istream & ) = 0 ; /// Loads a file and stores it for later lookup. Returns the number of records, or -1. int LoadAndRegister(); std::string ContentSize() const ; virtual ~RecordLoaderInterface(); /// Base name. In case the URL is not nice enough to build a clean data filename. virtual std::string base_filename() const ; /// The place where we store the data locally. std::pair< std::string, bool > storage_filename(bool create_dir = false) const ; virtual const char * Url() const { return NULL; } virtual const char * Description() const = 0 ; std::string Timestamp() const; static void SetDataDir( const std::string & data_dir ); }; // RecordLoaderInterface /// Loads records from a file or an Url. template< class Catalog > class RecordLoaderSingleton { static Catalog s_cata_inst ; public: static Catalog & InstCatalog() { return s_cata_inst ; } }; template Catalog RecordLoaderSingleton< Catalog >::s_cata_inst = Catalog(); /// Loads tabular records from a file. template< class Catalog > struct RecordLoader : public RecordLoaderInterface, public RecordLoaderSingleton { }; // RecordLoader void createRecordLoader(); #endif // RECORD_LOADER_H fldigi-3.21.80/src/include/rsid.h0000664000175000017500000000770212313064025013374 00000000000000// ---------------------------------------------------------------------------- // // rsid.h // // Copyright (C) 2008, 2009 // Dave Freese, W1HKJ // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // Tone separation: 10.766Hz // Integer tone separator (x 16): 172 // Error on 16 tones: 0.25Hz // Tone duration: 0.093 sec // Tone duration, #samples at 8ksps: 743 // Error on 15 tones: negligible // 1024 samples -> 512 tones // 2048 samples, second half zeros // each 512 samples new FFT // ---------------------------------------------------------------------------- #ifndef RSID_H #define RSID_H #include #include #include "ringbuffer.h" #include "globals.h" #include "modem.h" #include "gfft.h" #define RSID_SAMPLE_RATE 11025.0 #define RSID_FFT_SAMPLES 512 #define RSID_FFT_SIZE 1024 #define RSID_ARRAY_SIZE (RSID_FFT_SIZE * 2) #define RSID_BUFFER_SIZE (RSID_ARRAY_SIZE * 2) #define RSID_NSYMBOLS 15 #define RSID_NTIMES (RSID_NSYMBOLS * 2) #define RSID_PRECISION 2.7 // detected frequency precision in Hz // each rsid symbol has a duration equal to 1024 samples at 11025 Hz smpl rate #define RSID_SYMLEN (1024.0 / RSID_SAMPLE_RATE) // 0.09288 // duration of each rsid symbol enum { RSID_BANDWIDTH_500 = 0, RSID_BANDWIDTH_1K, RSID_BANDWIDTH_WIDE, }; typedef double rs_fft_type; typedef std::complex rs_cpx_type; struct RSIDs { unsigned short rs; trx_mode mode; const char* name; }; class cRsId { protected: enum { INITIAL, EXTENDED, WAIT }; private: // Table of precalculated Reed Solomon symbols unsigned char *pCodes1; unsigned char *pCodes2; bool found1; bool found2; static const RSIDs rsid_ids_1[]; static const int rsid_ids_size1; static const int Squares[]; static const int indices[]; static const RSIDs rsid_ids_2[]; static const int rsid_ids_size2; int rsid_secondary_time_out; int hamming_resolution; // Span of FFT bins, in which the RSID will be searched for int nBinLow; int nBinHigh; float aInputSamples[RSID_ARRAY_SIZE * 2]; rs_fft_type fftwindow[RSID_ARRAY_SIZE]; rs_cpx_type aFFTcmplx[RSID_ARRAY_SIZE]; rs_fft_type aFFTAmpl[RSID_FFT_SIZE]; g_fft *rsfft; bool bPrevTimeSliceValid; int iPrevDistance; int iPrevBin; int iPrevSymbol; int fft_buckets[RSID_NTIMES][RSID_FFT_SIZE]; bool bPrevTimeSliceValid2; int iPrevDistance2; int iPrevBin2; int iPrevSymbol2; // resample SRC_STATE* src_state; SRC_DATA src_data; int inptr; static long src_callback(void* cb_data, float** data); // transmit double *outbuf; size_t symlen; unsigned short rmode; unsigned short rmode2; private: void Encode(int code, unsigned char *rsid); void search(void); void setup_mode(int m); void CalculateBuckets(const rs_fft_type *pSpectrum, int iBegin, int iEnd); inline int HammingDistance(int iBucket, unsigned char *p2); bool search_amp( int &bin_out, int &symbol_out, unsigned char *pcode_table ); void apply ( int iBin, int iSymbol, int extended ); public: cRsId(); ~cRsId(); void reset(); void receive(const float* buf, size_t len); void send(bool postidle); bool assigned(trx_mode mode); friend void reset_rsid(void *who); }; #endif fldigi-3.21.80/src/include/compat.h0000664000175000017500000000412212313064025013707 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef COMPAT_H #define COMPAT_H /* adapted from compat.h in git-1.6.1.2 */ #if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__USLC__) && !defined(_M_UNIX) # define _XOPEN_SOURCE 600 /* glibc2 and AIX 5.3L need 500, OpenBSD needs 600 for S_ISLNK() */ # define _XOPEN_SOURCE_EXTENDED 1 /* AIX 5.3L needs this */ #endif #define _ALL_SOURCE 1 #define _GNU_SOURCE 1 #define _BSD_SOURCE 1 #include #include #include #include #include #include #include #include #include #include #include #include #include // this tests depends on a modified FL/filename.H in the Fltk-1.3.0 // change //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) // to //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) && !defined(__WOE32__) #ifdef __MINGW32__ # if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR < 3 # undef dirent # include # else # include # endif #else # include #endif #include #include #include #include #include "compat/mingw.h" #endif // MINGW32_H fldigi-3.21.80/src/include/synop.h0000664000175000017500000000570112313064025013600 00000000000000// ---------------------------------------------------------------------------- // synop.h -- SYNOP decoding // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _SYNOP_H #define _SYNOP_H // This tells how Synop data are serialized. class synop_callback { public: virtual ~synop_callback() {} ; // These methods could as well be pure virtual. virtual bool interleaved(void) const { return true; } virtual void print( const char * str, size_t nb, bool ) const = 0; virtual bool log_adif(void) const = 0; virtual bool log_kml(void) const = 0 ; }; // Implementation hidden in synop.cxx class synop { // When set, the output does not contain Synop sentences but only // the name of the regular expression which matched. It helps // for debugging because the output is independent of the locale. static bool m_test_mode ; public: static const synop_callback * ptr_callback ; template< class Callback > static void setup() { static const Callback cstCall = Callback(); ptr_callback = &cstCall ; }; static synop * instance(); static void regex_usage(void); virtual ~synop() {}; // It is used as a global object, the constructor does not do anything. virtual void init() = 0; virtual void cleanup() = 0; /// We should have a tempo as well. virtual void add(char c) = 0; // When Synop decoding is disabled. virtual void flush(bool finish_decoding) = 0; virtual bool enabled(void) const = 0; static bool GetTestMode(void) { return m_test_mode ; }; static void SetTestMode(bool test_mode) { m_test_mode = test_mode ; }; }; // gathers the various data files used for Synop decoding. struct SynopDB { // Loads the files from s given directory. static bool Init( const std::string & data_dir ); // For testing purpose. static const std::string & IndicatorToName( int wmo_indicator ); static const std::string IndicatorToCoordinates( int wmo_indicator ); // To Test the reading of our weather stations data files. static const std::string & BuoyToName( const char * buoy_id ); static const std::string & ShipToName( const char * ship_id ); static const std::string & JCommToName( const char * ship_id ); }; // ---------------------------------------------------------------------------- #endif // _SYNOP_H fldigi-3.21.80/src/include/kmlserver.h0000664000175000017500000000672312313064025014447 00000000000000// ---------------------------------------------------------------------------- // kmlserver.h -- KML Server // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _KMLSERVER_H #define _KMLSERVER_H #include #include #include #include #include /// Keyhole Markup Language: This publishes a complete message, localisation+time+weather etc... class KmlServer { protected: /// Counts the number of complete messages written. int m_nb_broadcasts ; int exit_kml_server; int request_broadcast; public: /// List of key-value pairs displayed for example in Google Earth balloons. struct CustomDataT : public std::vector< std::pair< std::string, std::string > > { /// Also used when reloading a KML file. void Push( const char * k, const std::string & v ); /// TODO: Most of keys are duplicated. Should store them in a hash to reduce memory footprint. void Push( const char * k, const char * v ) { Push( k, std::string(v) ); } /// This helper makes insertions simpler. template< class Type > void Push( const char * k, const Type & v ) { std::stringstream strm ; strm << v ; Push( k, strm.str() ); } }; KmlServer() : m_nb_broadcasts(0), exit_kml_server(0), request_broadcast(0) {} virtual ~KmlServer() {} /// BEWARE: Will work until 2038. static const time_t UniqueEvent = INT_MAX ; /// This can for example go to a NMEA client. virtual void Broadcast( const std::string & category, time_t evtTim, const CoordinateT::Pair & refCoo, double altitude, const std::string & kml_name, const std::string & styleNam, const std::string & descrTxt, const CustomDataT & custDat ) = 0; /// Singleton. static KmlServer * GetInstance(void); /// Number of calls to Broadcast(). Debugging purpose only. int NbBroadcasts(void) const { return m_nb_broadcasts; } /// Debugging only, just to check what happens inside. void ResetCounter() { m_nb_broadcasts = 0;} virtual void Reset() = 0; /// TODO: Maybe have one display style per category, instead of the same for all. virtual void InitParams( const std::string & kml_command, const std::string & kml_dir, double kml_merge = 10000, int kml_retention = 0, // Keep all data. int kml_refresh = 120, int kml_balloon_style = 0) = 0; virtual void ReloadKmlFiles() = 0; /// Creates the process for the command to be run when KML data is saved. static void SpawnProcess(); /// Stops the sub-thread, flush KML data to the files. static void Exit(); static std::string Tm2Time( time_t tim ); /// No value means, now. static std::string Tm2Time(void); }; #endif // _KMLSERVER_H fldigi-3.21.80/src/include/xmlrpc.h0000664000175000017500000000310712313064025013733 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef XMLRPC_H #define XMLRPC_H #include #include class XmlRpcImpl; class XML_RPC_Server { public: static void start(const char* node, const char* service); static void stop(void); static std::ostream& list_methods(std::ostream& out); private: XML_RPC_Server(); ~XML_RPC_Server(); XML_RPC_Server(const XML_RPC_Server&); XML_RPC_Server operator=(const XML_RPC_Server&); static void add_methods(void); static void* thread_func(void*); private: static XML_RPC_Server* inst; bool run; XmlRpcImpl* server_impl; }; extern void xmlrpc_set_qsy(long long rfc); extern int xmltest_char(); extern bool xmltest_char_available; extern int number_of_samples(std::string s); #endif // XMLRPC_H fldigi-3.21.80/src/include/pskvaricode.h0000664000175000017500000000216212313064025014740 00000000000000// ---------------------------------------------------------------------------- // varicode.h -- PSK31 Varicode // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _VARICODE_H #define _VARICODE_H extern const char *psk_varicode_encode(unsigned char c); extern int psk_varicode_decode(unsigned int symbol); #endif fldigi-3.21.80/src/include/flmisc.h0000664000175000017500000000564112313064025013710 00000000000000// ---------------------------------------------------------------------------- // flmisc.h // // Copyright (C) 2009-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef fl_misc_h_ #define fl_misc_h_ #include #include #include #include #include #include #include #include #include "flinput2.h" unsigned quick_choice_menu(const char* title, unsigned sel, const Fl_Menu_Item* menu); unsigned quick_choice(const char* title, unsigned sel, ...); Fl_Color adjust_color(Fl_Color fg, Fl_Color bg); void adjust_color_inv(unsigned char& bg1r, unsigned char& bg1g, unsigned char& bg1b, Fl_Color bg2, Fl_Color def); #if !defined(__APPLE__) && !defined(__WOE32__) # include void make_pixmap(Pixmap *xpm, const char **data, int argc, char** argv); #endif class notify_dialog : public Fl_Window { Fl_Box icon; Fl_Input2 message; Fl_Dial dial; Fl_Return_Button button; Fl_Box resize_box; bool delete_on_hide; public: notify_dialog(int X = 410, int Y = 103, const char* l = 0); ~notify_dialog(); int handle(int event); Fl_Button* make_button(int W, int H = 23); void notify(const char* msg, double timeout, bool delete_on_hide_ = false); private: static void button_cb(Fl_Widget* w, void*); static void dial_timer(void* arg); int newx; }; #ifdef BUILD_FLDIGI #include #include // Avoid 'nitems' macro collision between FreeBSD's sys/params.h and fltk's // FL/Fl_Check_Browser.H (http://www.fltk.org/str.php?L2984) #undef nitems #include #define FLTK_nitems nitems #undef nitems // ^^^ Avoid 'nitems' macro collision #include "globals.h" class Mode_Browser : public Fl_Double_Window { public: Mode_Browser(void); ~Mode_Browser(void); void show(mode_set_t* b); void callback(Fl_Callback* cb, void* args = 0); private: Fl_Button *close_button, *all_button, *none_button; Fl_Check_Browser* modes; mode_set_t* store; Fl_Callback* changed_cb; void* changed_args; static void modes_cb(Fl_Widget* w, void* arg); static void button_cb(Fl_Widget* w, void* arg); }; #endif // BUILD_FLDIGI #endif // fl_misc_h_ fldigi-3.21.80/src/include/raster.h0000664000175000017500000000306012313064025013724 00000000000000// ---------------------------------------------------------------------------- // raster.h, Raster scan Widget for display of fuzzy modes // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _RASTER_H #define _RASTER_H #include class Raster : public Fl_Widget { public: private: unsigned char *vidbuf; int width; int height; int col; int row; int Nrows; int rowheight; int space; int vidpos; // column start position int numcols; // number of columns to redraw int yp; public: Raster(int, int, int, int); ~Raster(); void draw(); void resize(int x, int y, int w, int h); unsigned char *buffer() { return vidbuf;} int size() { return width * height;} void data(int data[], int len); void clear(); void show() { Fl_Widget::show();} void hide() { Fl_Widget::hide();} }; #endif fldigi-3.21.80/src/include/adif_io.h0000664000175000017500000000427212313064025014024 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef ADIFIO #define ADIFIO #include #include #include "qso_db.h" #define ADIF_VERS "2.2.3" class cAdifIO { private: bool write_all; cQsoRec *adifqso; FILE *adiFile; void fillfield(int, char *); static int instances; public: cAdifIO (); ~cAdifIO (); int readAdifRec () {return 0;}; int writeAdifRec () {return 0;}; void readFile (const char *, cQsoDb *); void do_readfile(const char *, cQsoDb *); void do_writelog(); int writeFile (const char *, cQsoDb *); int writeLog (const char *, cQsoDb *, bool b = true); bool log_changed(const char *fname); }; // crc 16 cycle redundancy check sum class Ccrc16 { private: unsigned int crcval; char ss[5]; public: Ccrc16() { crcval = 0xFFFF; } ~Ccrc16() {}; void reset() { crcval = 0xFFFF;} unsigned int val() {return crcval;} std::string sval() { snprintf(ss, sizeof(ss), "%04X", crcval); return ss; } void update(char c) { crcval ^= c & 255; for (int i = 0; i < 8; ++i) { if (crcval & 1) crcval = (crcval >> 1) ^ 0xA001; else crcval = (crcval >> 1); } } unsigned int crc16(char c) { update(c); return crcval; } unsigned int crc16(std::string s) { reset(); for (size_t i = 0; i < s.length(); i++) update(s[i]); return crcval; } std::string scrc16(std::string s) { crc16(s); return sval(); } }; #endif fldigi-3.21.80/src/include/sound.h0000664000175000017500000002226412313064025013563 00000000000000// ---------------------------------------------------------------------------- // // sound.h // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _SOUND_H #define _SOUND_H #include #include #include #if USE_SNDFILE # include #endif #include #define SCBLOCKSIZE 512 class SndException : public std::exception { public: SndException(int err_ = 0) : err(err_), msg(std::string("Sound error: ") + err_to_str(err_)) { } SndException(const char* msg_) : err(1), msg(msg_) { } SndException(int err_, const std::string& msg_) : err(err_), msg(msg_) { } virtual ~SndException() throw() { } const char* what(void) const throw() { return msg.c_str(); } int error(void) const { return err; } protected: const char* err_to_str(int e) { return strerror(e); } int err; std::string msg; }; class SoundBase { protected: int sample_frequency; int txppm; int rxppm; // for interface to the samplerate resampling library SRC_STATE *tx_src_state; SRC_STATE *rx_src_state; double *wrt_buffer; #if USE_SNDFILE SNDFILE* ofCapture; SNDFILE* ifPlayback; SNDFILE* ofGenerate; SRC_STATE *writ_src_state; SRC_STATE *play_src_state; SRC_DATA *writ_src_data; SRC_DATA *play_src_data; float *src_out_buffer; float *src_inp_buffer; float *inp_pointer; SF_INFO play_info; float modem_wr_sr; float modem_play_sr; bool new_playback; sf_count_t read_file(SNDFILE* file, float* buf, size_t count); void write_file(SNDFILE* file, float* buf, size_t count); void write_file(SNDFILE* file, double* buf, size_t count); bool format_supported(int format); void tag_file(SNDFILE *sndfile, const char *title); #endif bool capture; bool playback; bool generate; public: SoundBase(); virtual ~SoundBase(); virtual int Open(int mode, int freq = 8000) = 0; virtual void Close(unsigned dir = UINT_MAX) = 0; virtual void Abort(unsigned dir = UINT_MAX) = 0; virtual size_t Write(double *, size_t) = 0; virtual size_t Write_stereo(double *, double *, size_t) = 0; virtual size_t Read(float *, size_t) = 0; virtual void flush(unsigned dir = UINT_MAX) = 0; virtual bool must_close(int dir = 0) = 0; #if USE_SNDFILE void get_file_params(const char* def_fname, const char** fname, int* format); int Capture(bool val); int Playback(bool val); int Generate(bool val); #endif }; #if USE_OSS class SoundOSS : public SoundBase { private: std::string device; int device_fd; int version; int capability_mask; int format_mask; int channels; int play_format; int mode; bool formatok; unsigned char *cbuff; SRC_DATA *rx_src_data; SRC_DATA *tx_src_data; float *snd_buffer; float *src_buffer; void getVersion(); void getCapabilities(); void getFormats(); void setfragsize(); void Channels(int); void Frequency(int); void Format(int); int BufferSize(int); bool wait_till_finished(); bool reset_device(); public: SoundOSS(const char *dev = "/dev/dsp"); ~SoundOSS(); int Open(int mode, int freq = 8000); void Close(unsigned dir = UINT_MAX); void Abort(unsigned dir = UINT_MAX) { Close(dir); } size_t Write(double *, size_t); size_t Write_stereo(double *, double *, size_t); size_t Read(float *, size_t); bool must_close(int dir = 0) { return true; } void flush(unsigned dir = UINT_MAX) { wait_till_finished(); } private: int Fd() { return device_fd; } int Frequency() { return sample_frequency;}; int Version() {return version;}; int Capabilities() {return capability_mask;}; int Formats() { return format_mask;}; int Channels() { return channels;}; int Format() { return play_format;}; bool FormatOK() { return formatok;}; }; #endif // USE_OSS #if USE_PORTAUDIO # include # include # include # include # include "ringbuffer.h" class SoundPort : public SoundBase { public: typedef std::vector::const_iterator device_iterator; static void initialize(void); static void terminate(void); static const std::vector& devices(void); static void devices_info(std::string& in, std::string& out); static const std::vector& get_supported_rates(const std::string& name, unsigned dir); public: SoundPort(const char *in_dev, const char *out_dev); ~SoundPort(); int Open(int mode, int freq = 8000); void Close(unsigned dir = UINT_MAX); void Abort(unsigned dir = UINT_MAX); size_t Write(double *buf, size_t count); size_t Write_stereo(double *bufleft, double *bufright, size_t count); size_t Read(float *buf, size_t count); bool must_close(int dir = 0); void flush(unsigned dir = UINT_MAX); private: void src_data_reset(unsigned dir); static long src_read_cb(void* arg, float** data); size_t resample_write(float* buf, size_t count); device_iterator name_to_device(const std::string& name, unsigned dir); void init_stream(unsigned dir); void start_stream(unsigned dir); void pause_stream(unsigned dir); bool stream_active(unsigned dir); bool full_duplex_device(const PaDeviceInfo* dev); double find_srate(unsigned dir); static void probe_supported_rates(const device_iterator& idev); void pa_perror(int err, const char* str = 0); static void init_hostapi_ext(void); static PaStreamCallback stream_process; static PaStreamFinishedCallback stream_stopped; private: static bool pa_init; static std::vector devs; double req_sample_rate; float* fbuf; float* src_buffer; SRC_DATA *tx_src_data; enum { spa_continue = paContinue, spa_complete = paComplete, spa_abort = paAbort, spa_drain, spa_pause }; struct stream_data { std::string device; device_iterator idev; PaStream* stream; PaStreamParameters params; unsigned frames_per_buffer; double dev_sample_rate; double src_ratio; sem_t* rwsem; pthread_mutex_t* cmutex; pthread_cond_t* ccond; int state; ringbuffer* rb; size_t blocksize; size_t advance; } sd[2]; }; class SndPortException : public SndException { public: SndPortException(int err_ = 0) : SndException(err_, std::string("PortAudio error: ") + err_to_str(err_)) { } SndPortException(const char* msg_) : SndException(msg_) { } protected: const char* err_to_str(int e) { return Pa_GetErrorText(e); } }; #endif // USE_PORTAUDIO #if USE_PULSEAUDIO # include # include extern "C" { const char* pa_get_library_version(void); }; class SoundPulse : public SoundBase { public: SoundPulse(const char* dev); virtual ~SoundPulse(); int Open(int mode, int freq = 8000); void Close(unsigned dir = UINT_MAX); void Abort(unsigned dir = UINT_MAX); size_t Write(double* buf, size_t count); size_t Write_stereo(double* bufleft, double* bufright, size_t count); size_t Read(float *buf, size_t count); bool must_close(int dir = 0) { return false; } void flush(unsigned dir = UINT_MAX); private: void src_data_reset(int mode); static long src_read_cb(void* arg, float** data); size_t resample_write(float* buf, size_t count); private: struct stream_data { pa_simple* stream; pa_sample_spec stream_params; pa_buffer_attr buffer_attrs; pa_stream_direction_t dir; double src_ratio; size_t blocksize; } sd[2]; SRC_DATA* tx_src_data; float* fbuf; float* snd_buffer; float* src_buffer; }; class SndPulseException : public SndException { public: SndPulseException(int err_ = 0) : SndException(err_, std::string("PulseAudio error: ") + err_to_str(err_)) { } SndPulseException(const char* msg_) : SndException(msg_) { } protected: const char* err_to_str(int e) { return pa_strerror(e); } }; #endif // USE_PULSEAUDIO class SoundNull : public SoundBase { public: int Open(int mode, int freq = 8000) { sample_frequency = freq; return 0; } void Close(unsigned) { } void Abort(unsigned) { } size_t Write(double* buf, size_t count); size_t Write_stereo(double* bufleft, double* bufright, size_t count); size_t Read(float *buf, size_t count); bool must_close(int dir = 0) { return false; } void flush(unsigned) { } }; #endif // SOUND_H fldigi-3.21.80/src/include/qrzlib.h0000664000175000017500000002022512313064025013731 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef QRZHEADER // To include the email code remove the comment specifier from the following line #define HAVE_EMAIL // QRZ CDROM data structures /* ** Index Header Block Definition (Version 2) ** (applies to all QRZ CDROMS from Version 2 onward) ** ** This block is located at the start of each index */ typedef struct { char dataname[16]; /* Name of the data file */ char bytesperkey[8]; /* Data Bytes per Index Item */ char numkeys[8]; /* Number of items in this index */ char keylen[8]; /* Length of each key item in bytes */ char version[8]; /* Database Version ID */ } index_header; /* Index Usage The name index is set to a maximum of 16 characters with longer names being truncated. Names are stored in last-first format with a space between the names. The city/state index uses 12 characters per entry, the callsign index 6 characters and the zip code index 5 characters. The data which follows the header is simply a long list of single field records. The records are tightly packed on 'bytesperkey' boundaries without separators. There is no guarantee of a null terminator on any index record entry. When the program qrz.exe is run it first searches for a drive containing the base directory \CALLBK . Next, it loads all four index files (callbkc.idx, callbkn.idx, callbks.idx and callbkz.idx) into tables in memory. These tables were kept small so as not to place an undue RAM requirement on the user's system. Next, when a user specifies a field and key to search, the program searches the relevant index table and returns the closest match lower (or equal to) the supplied key. The table position of this key is then taken and multiplied by the 'bytesperkey' value to arrive at a database file offset. This offset is then used to perform the first and only seek into the database. Once on position within the file, a sequential search is performed to return the match. The search terminates at the next index key value if the field is not found. The database files all have the same format. The records each consist of comma separated fields which end with a single newline '\n' (ASCII 0xa) character. Blank fields are simply stored as a comma. Every record has the same number of commas in it. Actual comma's in the data field are stored as a semi-colon ';' which should be replaced by a comma in the user's output formatting routine. Example: AA7BQ ,LLOYD,,FRED L,,53340,90009,00009,8215 E WOOD DR,SCOTTSDALE,AZ, 85260,E,KJ6RK,A The callsign database is sorted by SUFFIX, AREA, PREFIX. For example, the following order would be observed: QE24AA ... ZZ99ZZ ... A 0A ... AA0AAA ... ZZ9ZZZ This ordering also pertains to the index file since it is just a snaphot of every nth record in the database. */ /* ** Standard Record Field Offsets */ #define QRZLIB_CALL 0 #define QRZLIB_LNAME 1 #define QRZLIB_JR 2 #define QRZLIB_FNAME 3 #define QRZLIB_MI 4 #define QRZLIB_DOB 5 #define QRZLIB_EFDATE 6 #define QRZLIB_EXPDATE 7 #define QRZLIB_MAIL_STR 8 #define QRZLIB_MAIL_CITY 9 #define QRZLIB_MAIL_ST 10 #define QRZLIB_MAIL_ZIP 11 #define QRZLIB_CLASS 12 #define QRZLIB_P_CALL 13 #define QRZLIB_P_CLASS 14 /* The fields JR and MI were obsoleted by the FCC in July 1994. The callsign fields are arranged in a strict "ccdccc" columnar format where 'c' represents a letter and 'd' a digit. Callsigns which do not conform to the "ccdccc" format are space filled in the relevant positions. This field is rearranged to the proper layout by the user program's output formatting routines. All dates are stored in 5 character Julian format, e.g. 93003 equals January 3, 1993. Dates before 1900 or after year 2000 must be determined by their context usage. In other words, if the resultant age does not make sense, then it's wrong. For example, all licenses expire in the future so 02 is 2002. Birthdays are more difficult but most can be determined to be greater than 10 years old. This is not a perfect method, but it does yield satisfactory results. Some folks may notice that the database no longer contains station location information. This information is no longer supplied nor available from the FCC since it is no longer a part of their record keeping (See the May 1993 QST for more info). Cross Reference Information Callsigns in the database are now cross-referenced to both the current and the previous call sign for each entry in which they are available. A cross reference record takes the form of 'old,new' with no other information in the record. A record can be identified as a cross reference either one of two ways: First, if the record length is less than 15 characters, then it is a cross reference record. Secondly, if the record contains only one comma "," , then it is a cross reference record. It is not necessary to test for both cases, either will do. When a cross reference record is encountered, you must fetch the second field and restart the search to return the primary reference. */ #include #include #include extern char *Composite( char * ); class QRZ { private: char criteria; index_header idxhdr; char *data; char *index; char *top; FILE *idxfile; long idxsize; FILE *datafile; long dataoffset; long databytesread; char *dfptr; char *endofline; char *idxptr; int found; char recbuffer[512]; unsigned int datarecsize; long numkeys; int keylen; void OpenQRZFiles( const char * ); int FindCallsign( char * ); int FindName( char * ); int FindState( char * ); int FindZip( char * ); int ReadDataBlock( long ); int nextrec(); bool hasImage; char *Qcall; char *Qlname; char *Qfname; char *Qdob; char *Qefdate; char *Qexpdate; char *Qmail_str; char *Qmail_city; char *Qmail_st; char *Qmail_zip; char *Qopclass; char *Qp_call; char *Qimagefname; char *Qp_class; int QRZvalid; public: QRZ( const char * ); QRZ( const char *, char ); ~QRZ(); int CallComp( char *, char * ); int CompState( const char *, const char *, const char * ); int getQRZvalid(); void NewDBpath( const char * ); int FindRecord( char * ); int NextRecord(); int ReadRec(); int GetCount( char * ); char *GetCall(); const char *GetLname(); const char *GetFname(); const char *GetDOB(); const char *GetEFdate(); const char *GetEXPdate(); const char *GetStreet(); const char *GetCity(); const char *GetState(); const char *GetZIP(); const char *GetOPclass(); const char *GetPriorCall(); const char *GetPriorClass(); const char *GetImageFileName(); char *CSV_Record(); char *Fmt_Record(); bool ImageExists(); const char *ImageFileName() {return Qimagefname;}; }; extern void SetQRZdirectory(char *dir); extern int filename_expand(char *to,int tolen, const char *from); #define QRZHEADER #endif fldigi-3.21.80/src/include/rigclass.h0000664000175000017500000000525712313064025014245 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _RIGCLASS_H #define _RIGCLASS_H #include #include #include class RigException : public std::exception { public: RigException(int e = 0) : err(e), msg(rigerror(e)) { } RigException(const char* m) : err(0), msg(m) { } RigException(const char* prefix, int e) : err(e), msg(std::string(prefix).append(": ").append(rigerror(e))) { } virtual ~RigException() throw() { } const char* what(void) const throw() { return msg.c_str(); } int error(void) const { return err; } protected: int err; std::string msg; }; class Rig { protected: RIG *rig; // Global ref. to the rig freq_t fnull; public: Rig(); Rig(rig_model_t rig_model); virtual ~Rig(); void init(rig_model_t rig_model); bool isOnLine() { return rig; } // This method open the communication port to the rig void open(void); // This method close the communication port to the rig void close(void); void setFreq(freq_t freq, vfo_t vfo = RIG_VFO_CURR); freq_t getFreq(vfo_t vfo = RIG_VFO_CURR); bool canSetFreq(); bool canGetFreq(); void setMode(rmode_t, pbwidth_t width = RIG_PASSBAND_NORMAL, vfo_t vfo = RIG_VFO_CURR); rmode_t getMode(pbwidth_t&, vfo_t vfo = RIG_VFO_CURR); bool canSetMode(); bool canGetMode(); void setPTT (ptt_t ptt, vfo_t vfo = RIG_VFO_CURR); ptt_t getPTT (vfo_t vfo = RIG_VFO_CURR); bool canSetPTT(); bool canGetPTT(); void setVFO(vfo_t); vfo_t getVFO(); void setConf(token_t token, const char *val); void setConf(const char *name, const char *val); void getConf(token_t token, char *val); void getConf(const char *name, char *val); const char *getName(); const struct rig_caps* getCaps(void); token_t tokenLookup(const char *name); pbwidth_t passbandNormal (rmode_t mode); pbwidth_t passbandNarrow (rmode_t mode); pbwidth_t passbandWide (rmode_t mode); }; #endif fldigi-3.21.80/src/throb/0000775000175000017500000000000012313333726012036 500000000000000fldigi-3.21.80/src/throb/throb.cxx0000664000175000017500000004633312313064025013622 00000000000000// ---------------------------------------------------------------------------- // throb.cxx -- throb modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // ThrobX additions by Joe Veldhuis, KD8ATU // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "throb.h" #include "ascii.h" #include "configuration.h" #include "fl_digi.h" #include "status.h" #define MAX_TONES 15 #undef CLAMP #define CLAMP(x,low,high) (((x)>(high))?(high):(((x)<(low))?(low):(x))) char throbmsg[80]; void throb::tx_init(SoundBase *sc) { scard = sc; preamble = 4; reset_syms(); videoText(); } void throb::rx_init() { rxcntr = rxsymlen; waitsync = 1; deccntr = 0; symptr = 0; shift = 0; lastchar = '\0'; reset_syms(); put_MODEstatus(mode); } void throb::init() { modem::init(); rx_init(); set_scope_mode(Digiscope::SCOPE); } throb::~throb() { if (hilbert) delete hilbert; if (syncfilt) delete syncfilt; if (fftfilter) delete fftfilter; if (snfilter) delete snfilter; if (scope_data) delete [] scope_data; if (txpulse) delete [] txpulse; if (outbuf) delete[] outbuf; for (int i = 0; i < num_tones; i++) if (rxtone[i]) delete [] rxtone[i]; } void throb::flip_syms() //call this whenever a space or idle is sent or received { switch(mode) { case MODE_THROBX1: case MODE_THROBX2: case MODE_THROBX4: if (idlesym == 0) { idlesym = 1; spacesym = 0; } else { idlesym = 0; spacesym = 1; } break; default: //if we're not running a ThrobX mode, do nothing break; } } void throb::reset_syms() //call when switching from TX to RX or vice versa { switch(mode) { case MODE_THROBX1: case MODE_THROBX2: case MODE_THROBX4: idlesym = 0; spacesym = 1; break; default: //paranoia idlesym = 0; spacesym = 44; break; } } throb::throb(trx_mode throb_mode) : modem() { cap |= CAP_AFC | CAP_REV; double bw; double *fp = 0; mode = throb_mode; switch (mode) { case MODE_THROB1: symlen = SYMLEN_1; txpulse = mk_semi_pulse(symlen); fp = mk_semi_pulse(symlen / DOWN_SAMPLE); num_tones = 9; num_chars = 45; idlesym = 0; spacesym = 44; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobToneFreqsNar[i]; bw = 36.0 / THROB_SAMPLE_RATE; break; case MODE_THROB2: symlen = SYMLEN_2; txpulse = mk_semi_pulse(symlen); fp = mk_semi_pulse(symlen / DOWN_SAMPLE); num_tones = 9; num_chars = 45; idlesym = 0; spacesym = 44; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobToneFreqsNar[i]; bw = 36.0 / THROB_SAMPLE_RATE; break; case MODE_THROB4: default: symlen = SYMLEN_4; txpulse = mk_full_pulse(symlen); fp = mk_full_pulse(symlen / DOWN_SAMPLE); num_tones = 9; num_chars = 45; idlesym = 0; spacesym = 44; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobToneFreqsWid[i]; bw = 72.0 / THROB_SAMPLE_RATE; break; case MODE_THROBX1: symlen = SYMLEN_1; txpulse = mk_semi_pulse(symlen); fp = mk_semi_pulse(symlen / DOWN_SAMPLE); num_tones = 11; num_chars = 55; idlesym = 0; spacesym = 1; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobXToneFreqsNar[i]; bw = 47.0 / THROB_SAMPLE_RATE; break; case MODE_THROBX2: symlen = SYMLEN_2; txpulse = mk_semi_pulse(symlen); fp = mk_semi_pulse(symlen / DOWN_SAMPLE); num_tones = 11; num_chars = 55; idlesym = 0; spacesym = 1; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobXToneFreqsNar[i]; bw = 47.0 / THROB_SAMPLE_RATE; break; case MODE_THROBX4: //NONSTANDARD symlen = SYMLEN_4; txpulse = mk_full_pulse(symlen); fp = mk_full_pulse(symlen / DOWN_SAMPLE); num_tones = 11; num_chars = 55; idlesym = 0; spacesym = 1; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobXToneFreqsWid[i]; bw = 94.0 / THROB_SAMPLE_RATE; break; } outbuf = new double[symlen]; rxsymlen = symlen / DOWN_SAMPLE; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); fftfilter = new fftfilt(0, bw, FilterFFTLen); syncfilt = new C_FIR_filter(); syncfilt->init(symlen / DOWN_SAMPLE, 1, fp, NULL); delete [] fp; snfilter = new Cmovavg(16); for (int i = 0; i < num_tones; i++) rxtone[i] = mk_rxtone(freqs[i], txpulse, symlen); reverse = 0; samplerate = THROB_SAMPLE_RATE; fragmentsize = symlen; bandwidth = freqs[num_tones - 1] - freqs[0]; syncpos = 0.5; scope_data = new double [SCOPE_DATA_LEN]; phaseacc = 0.0; metric = 0.0; symptr = 0; for (int i = 0; i < MAX_RX_SYMLEN; i++) syncbuf[i] = dispbuf[i] = 0.0; // init(); } //===================================================================== // receive processing //===================================================================== // Make a 32 times down sampled cmplx prototype tone for rx. cmplx *throb::mk_rxtone(double freq, double *pulse, int len) { cmplx *tone; double x; int i; tone = new cmplx [len / DOWN_SAMPLE]; for (i = 0; i < len; i += DOWN_SAMPLE) { x = -2.0 * M_PI * freq * i / THROB_SAMPLE_RATE; tone[i / DOWN_SAMPLE] = cmplx ( pulse[i] * cos(x), pulse[i] * sin(x) ); } return tone; } cmplx throb::mixer(cmplx in) { double f; cmplx z (cos(phaseacc), sin(phaseacc)); z = z * in; f = frequency; phaseacc -= 2.0 * M_PI * f / THROB_SAMPLE_RATE; if (phaseacc < -M_PI) phaseacc += 2.0 * M_PI; if (phaseacc > M_PI) phaseacc -= 2.0 * M_PI; return z; } int throb::findtones(cmplx *word, int &tone1, int &tone2) { double max1, max2; int maxtone, i; max1 = 0; tone1 = 0; for (i = 0; i < num_tones; i++) { if ( abs(word[i]) > max1 ) { max1 = abs(word[i]); tone1 = i; } } maxtone = tone1; max2 = 0; tone2 = 0; for (i = 0; i < num_tones; i++) { if (i == tone1) continue; if ( abs(word[i]) > max2) { max2 = abs(word[i]); tone2 = i; } } //handle single-tone symbols (Throb only) if (mode == MODE_THROB1 || mode == MODE_THROB2 || mode == MODE_THROB4) if (max1 > max2 * 2) tone2 = tone1; if (tone1 > tone2) { i = tone1; tone1 = tone2; tone2 = i; } signal = noise = 0.0; for (i = 0; i < num_tones; i++) { if ( i == tone1 || i == tone2) signal += abs(word[i]) / 2.0; else noise += abs(word[i]) / (num_tones - 2.0); } metric = snfilter->run( signal / (noise + 1e-6)); s2n = CLAMP( 10.0*log10( metric ) - 3.0, 0.0, 100.0); return maxtone; } void throb::show_char(int c) { if (metric > progStatus.sldrSquelchValue || progStatus.sqlonoff == false) put_rx_char(progdefaults.rx_lowercase ? tolower(c) : c); } void throb::decodechar(int tone1, int tone2) { int i; switch(mode) { case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: if (shift == true) { if (tone1 == 0 && tone2 == 8) show_char('?'); if (tone1 == 1 && tone2 == 7) show_char('@'); if (tone1 == 2 && tone2 == 6) show_char('='); if (tone1 == 4 && tone2 == 4) show_char('\n'); shift = false; return; } if (tone1 == 3 && tone2 == 5) { shift = true; return; } for (i = 0; i < num_chars; i++) { if (ThrobTonePairs[i][0] == tone1 + 1 && ThrobTonePairs[i][1] == tone2 + 1) { show_char(ThrobCharSet[i]); break; } } break; //ThrobX mode. No shifted case, but idle and space symbols alternate default: for (i = 0; i < num_chars; i++) { if (ThrobXTonePairs[i][0] == tone1 + 1 && ThrobXTonePairs[i][1] == tone2 + 1) { if (i == spacesym || i == idlesym) { if (lastchar != '\0' && lastchar != ' ') { show_char(ThrobXCharSet[1]); lastchar = ' '; } else { lastchar = '\0'; } flip_syms(); } else { show_char(ThrobXCharSet[i]); lastchar = ThrobXCharSet[i]; } } } break; } return; } void throb::rx(cmplx in) { cmplx rxword[MAX_TONES]; int i, tone1, tone2, maxtone; symbol[symptr] = in; if (rxcntr > 0.0) return; // correlate against all tones for (i = 0; i < num_tones; i++) rxword[i] = cmac(rxtone[i], symbol, symptr + 1, rxsymlen); // find the strongest tones maxtone = findtones(rxword, tone1, tone2); // decode if (reverse) decodechar (num_tones - 1 - tone2, num_tones - 1 - tone1); else decodechar (tone1, tone2); if (progStatus.afconoff == true && (metric >= progStatus.sldrSquelchValue || progStatus.sqlonoff == false)) { cmplx z1, z2; double f; z1 = rxword[maxtone]; z2 = cmac(rxtone[maxtone], symbol, symptr + 2, rxsymlen); f = arg( conj(z1) * z2 ) / (2 * DOWN_SAMPLE * M_PI / THROB_SAMPLE_RATE); f -= freqs[maxtone]; set_freq(frequency + f / (num_tones - 1)); } /* done with this symbol, start over */ rxcntr = rxsymlen; waitsync = 1; snprintf(throbmsg, sizeof(throbmsg), "S/N: %3d dB", (int)(floor(s2n))); put_Status1(throbmsg); display_metric(metric); } void throb::sync(cmplx in) { double f, maxval = 0; double mag; int i, maxpos = 0; /* "rectify", filter and store input */ mag = abs(in); syncfilt->Irun( mag, f); syncbuf[symptr] = f; /* check counter if we are waiting for sync */ if (waitsync == 0 || rxcntr > (rxsymlen / 2.0)) return; for (i = 0; i < rxsymlen; i++) { f = syncbuf[(i + symptr + 1) % rxsymlen]; dispbuf[i] = f; } for (i = 0; i < rxsymlen; i++) { if (dispbuf[i] > maxval) { maxpos = i; maxval = dispbuf[i]; } } /* correct sync */ rxcntr += (maxpos - rxsymlen / 2) / (num_tones - 1); waitsync = 0; if (metric >= progStatus.sldrSquelchValue || progStatus.sqlonoff == false) set_scope(dispbuf, rxsymlen); else { dispbuf[0] = 0.0; set_scope(dispbuf, 1); } dispbuf.next(); // change buffers } int throb::rx_process(const double *buf, int len) { cmplx z, *zp; int i, n; while (len-- > 0) { z = cmplx( *buf, *buf ); buf++; hilbert->run(z, z); z = mixer(z); n = fftfilter->run(z, &zp); /* DOWN_SAMPLE by 32 and push to the receiver */ for (i = 0; i < n; i++) { if (++deccntr >= DOWN_SAMPLE) { rxcntr -= 1.0; /* do symbol sync */ sync(zp[i]); /* decode */ rx(zp[i]); symptr = (symptr + 1) % rxsymlen; deccntr = 0; } } } return 0; } //===================================================================== // transmit processing //===================================================================== double *throb::mk_semi_pulse(int len) { double *pulse, x; int i, j; pulse = new double [len]; for (i = 0; i < len; i++) { if (i < len / 5) { x = M_PI * i / (len / 5.0); pulse[i] = 0.5 * (1 - cos(x)); } if (i >= len / 5 && i < len * 4 / 5) pulse[i] = 1.0; if (i >= len * 4 / 5) { j = i - len * 4 / 5; x = M_PI * j / (len / 5.0); pulse[i] = 0.5 * (1 + cos(x)); } } return pulse; } double *throb::mk_full_pulse(int len) { double *pulse; int i; pulse = new double [len]; for (i = 0; i < len; i++) pulse[i] = 0.5 * (1 - cos(2 * M_PI * i / len)); return pulse; } void throb::send(int symbol) { int tone1, tone2; double w1, w2; int i; if (symbol < 0 || symbol >= num_chars) return; switch(mode) { case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: tone1 = ThrobTonePairs[symbol][0] - 1; tone2 = ThrobTonePairs[symbol][1] - 1; break; default: tone1 = ThrobXTonePairs[symbol][0] -1; tone2 = ThrobXTonePairs[symbol][1] -1; break; } if (reverse) { tone1 = (num_tones - 1) - tone1; tone2 = (num_tones - 1) - tone2; } w1 = 2.0 * M_PI * (get_txfreq_woffset() + freqs[tone1]) / THROB_SAMPLE_RATE; w2 = 2.0 * M_PI * (get_txfreq_woffset() + freqs[tone2]) / THROB_SAMPLE_RATE; for (i = 0; i < symlen; i++) outbuf[i] = txpulse[i] * (sin(w1 * i) + sin(w2 * i)) / 2.0; ModulateXmtr(outbuf, symlen); } int throb::tx_process() { int i, c, sym; if (preamble > 0) { send(idlesym); /* send idle throbs */ flip_syms(); preamble--; return 0; } c = get_tx_char(); // end of transmission if (c == GET_TX_CHAR_ETX || stopflag) { send(idlesym); // reset_syms(); //prepare RX. idle/space syms always start as 0 and 1, respectively. cwid(); return -1; } // TX buffer empty if (c == GET_TX_CHAR_NODATA) { send(idlesym); /* send idle throbs */ flip_syms(); return 0; } switch(mode) { case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: /* handle the special cases first, if we're doing regular Throb */ switch (c) { case '?': send(5); /* shift */ send(20); put_echo_char(c); return 0; case '@': send(5); /* shift */ send(13); put_echo_char(c); return 0; case '-': send(5); /* shift */ send(9); put_echo_char(c); return 0; case '\r': return 0; case '\n': send(5); /* shift */ send(0); put_echo_char(c); return 0; default: break; } break; default: //If we're doing ThrobX, no need to handle shifts break; } /* map lower case character to upper case */ if (islower(c)) c = toupper(c); /* see if the character can be found in our character set */ switch(mode) { case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: for (sym = -1, i = 0; i < num_chars; i++) if (c == ThrobCharSet[i]) sym = i; break; default: for (sym = -1, i = 0; i < num_chars; i++) if (c == ThrobXCharSet[i]) sym = i; break; } // send a space for unknown chars if (sym == -1) c = ' '; // handle spaces for throbx if (c == ' ') { sym = spacesym; flip_syms(); } send(sym); put_echo_char(progdefaults.rx_lowercase ? tolower(c) : c); return 0; } //===================================================================== // throb static declarations //===================================================================== int throb::ThrobTonePairs[45][2] = { {5, 5}, /* idle... no print */ {4, 5}, /* A */ {1, 2}, /* B */ {1, 3}, /* C */ {1, 4}, /* D */ {4, 6}, /* SHIFT (was E) */ {1, 5}, /* F */ {1, 6}, /* G */ {1, 7}, /* H */ {3, 7}, /* I */ {1, 8}, /* J */ {2, 3}, /* K */ {2, 4}, /* L */ {2, 8}, /* M */ {2, 5}, /* N */ {5, 6}, /* O */ {2, 6}, /* P */ {2, 9}, /* Q */ {3, 4}, /* R */ {3, 5}, /* S */ {1, 9}, /* T */ {3, 6}, /* U */ {8, 9}, /* V */ {3, 8}, /* W */ {3, 3}, /* X */ {2, 2}, /* Y */ {1, 1}, /* Z */ {3, 9}, /* 1 */ {4, 7}, /* 2 */ {4, 8}, /* 3 */ {4, 9}, /* 4 */ {5, 7}, /* 5 */ {5, 8}, /* 6 */ {5, 9}, /* 7 */ {6, 7}, /* 8 */ {6, 8}, /* 9 */ {6, 9}, /* 0 */ {7, 8}, /* , */ {7, 9}, /* . */ {8, 8}, /* ' */ {7, 7}, /* / */ {6, 6}, /* ) */ {4, 4}, /* ( */ {9, 9}, /* E */ {2, 7} /* space */ }; int throb::ThrobXTonePairs[55][2] = { {6, 11}, /* idle (initially) */ {1, 6}, /* space (initially) */ {2, 6}, /* A */ {2, 5}, /* B */ {2, 7}, /* C */ {2, 8}, /* D */ {5, 6}, /* E */ {2, 9}, /* F */ {2, 10}, /* G */ {4, 8}, /* H */ {4, 6}, /* I */ {2, 11}, /* J */ {3, 4}, /* K */ {3, 5}, /* L */ {3, 6}, /* M */ {6, 9}, /* N */ {6, 10}, /* O */ {3, 7}, /* P */ {3, 8}, /* Q */ {3, 9}, /* R */ {6, 8}, /* S */ {6, 7}, /* T */ {3, 10}, /* U */ {3, 11}, /* V */ {4, 5}, /* W */ {4, 7}, /* X */ {4, 9}, /* Y */ {4, 10}, /* Z */ {1, 2}, /* 1 */ {1, 3}, /* 2 */ {1, 4}, /* 3 */ {1, 5}, /* 4 */ {1, 7}, /* 5 */ {1, 8}, /* 6 */ {1, 9}, /* 7 */ {1, 10}, /* 8 */ {2, 3}, /* 9 */ {2, 4}, /* 0 */ {4, 11}, /* , */ {5, 7}, /* . */ {5, 8}, /* ' */ {5, 9}, /* / */ {5, 10}, /* ) */ {5, 11}, /* ( */ {7, 8}, /* # */ {7, 9}, /* " */ {7, 10}, /* + */ {7, 11}, /* - */ {8, 9}, /* ; */ {8, 10}, /* : */ {8, 11}, /* ? */ {9, 10}, /* ! */ {9, 11}, /* @ */ {10, 11}, /* = */ {1, 11} /* cr */ //FIXME: !!COMPLETELY NONSTANDARD!! }; unsigned char throb::ThrobCharSet[45] = { '\0', /* idle */ 'A', 'B', 'C', 'D', '\0', /* shift */ 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.', '\'', '/', ')', '(', 'E', ' ' }; unsigned char throb::ThrobXCharSet[55] = { '\0', /* idle (initially) */ ' ', /* space (initially) */ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.', '\'', '/', ')', '(', '#', '"', '+', '-', ';', ':', '?', '!', '@', '=', '\n' }; double throb::ThrobToneFreqsNar[9] = {-32, -24, -16, -8, 0, 8, 16, 24, 32}; double throb::ThrobToneFreqsWid[9] = {-64, -48, -32, -16, 0, 16, 32, 48, 64}; double throb::ThrobXToneFreqsNar[11] = {-39.0625, -31.25, -23.4375, -15.625, -7.8125, 0, 7.8125, 15.625, 23.4375, 31.25, 39.0625}; double throb::ThrobXToneFreqsWid[11] = {-78.125, -62.5, -46.875, -31.25, -15.625, 0, 15.625, 31.25, 46.875, 62.5, 78.125}; fldigi-3.21.80/src/config.h.in0000664000175000017500000003353212313065142012663 00000000000000/* src/config.h.in. Generated from configure.ac by autoheader. */ #ifndef CONFIG_H_ #define CONFIG_H_ /* Defined if we are building for benchmarking */ #undef BENCHMARK_MODE /* Build platform */ #undef BUILD_BUILD_PLATFORM /* Compiler */ #undef BUILD_COMPILER /* Configure arguments */ #undef BUILD_CONFIGURE_ARGS /* Build date */ #undef BUILD_DATE /* Build host */ #undef BUILD_HOST /* Host platform */ #undef BUILD_HOST_PLATFORM /* Target platform */ #undef BUILD_TARGET_PLATFORM /* Build user */ #undef BUILD_USER /* Define to 1 if the `closedir' function returns void instead of `int'. */ #undef CLOSEDIR_VOID /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Flarq authors */ #undef FLARQ_AUTHORS /* Flarq compiler flags */ #undef FLARQ_BUILD_CXXFLAGS /* Flarq linker flags */ #undef FLARQ_BUILD_LDFLAGS /* Flarq Docs index */ #undef FLARQ_DOCS /* Flarq version string */ #undef FLARQ_VERSION /* Flarq major version number */ #undef FLARQ_VERSION_MAJOR /* Flarq minor version number */ #undef FLARQ_VERSION_MINOR /* Flarq patch/alpha version string */ #undef FLARQ_VERSION_PATCH /* Fldigi authors */ #undef FLDIGI_AUTHORS /* Fldigi compiler flags */ #undef FLDIGI_BUILD_CXXFLAGS /* Fldigi linker flags */ #undef FLDIGI_BUILD_LDFLAGS /* FLTK API major version */ #undef FLDIGI_FLTK_API_MAJOR /* FLTK API minor version */ #undef FLDIGI_FLTK_API_MINOR /* FLTK API patch */ #undef FLDIGI_FLTK_API_PATCH /* Fldigi version string */ #undef FLDIGI_VERSION /* Fldigi major version number */ #undef FLDIGI_VERSION_MAJOR /* Fldigi minor version number */ #undef FLDIGI_VERSION_MINOR /* Fldigi patch/alpha version string */ #undef FLDIGI_VERSION_PATCH /* FLTK version */ #undef FLTK_BUILD_VERSION /* hamlib version */ #undef HAMLIB_BUILD_VERSION /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define to 1 if we have clock_gettime */ #undef HAVE_CLOCK_GETTIME /* Define to 0 if not using dbg::stack */ #undef HAVE_DBG_STACK /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_DEV_PPBUS_PPI_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if we have dlopen */ #undef HAVE_DLOPEN /* Define to 1 if you have the header file. */ #undef HAVE_EXECINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `getaddrinfo' function. */ #undef HAVE_GETADDRINFO /* Define to 1 if you have the `gethostbyname' function. */ #undef HAVE_GETHOSTBYNAME /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the `gmtime_r' function. */ #undef HAVE_GMTIME_R /* Define to 1 if you have the `hstrerror' function. */ #undef HAVE_HSTRERROR /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_PPDEV_H /* Define to 1 if you have the `localtime_r' function. */ #undef HAVE_LOCALTIME_R /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the `mkdir' function. */ #undef HAVE_MKDIR /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have O_CLOEXEC defined */ #undef HAVE_O_CLOEXEC /* Define to 1 if you have the header file. */ #undef HAVE_REGEX_H /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if we have sem_timedwait */ #undef HAVE_SEM_TIMEDWAIT /* Define to 1 if we have sem_unlink */ #undef HAVE_SEM_UNLINK /* Define to 1 if you have the `setenv' function. */ #undef HAVE_SETENV /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if you have the `socketpair' function. */ #undef HAVE_SOCKETPAIR /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if we have std::bind in */ #undef HAVE_STD_BIND /* Define to 1 if we have std::tr1::bind in */ #undef HAVE_STD_TR1_BIND /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strcasestr' function. */ #undef HAVE_STRCASESTR /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strlcpy' function. */ #undef HAVE_STRLCPY /* Define to 1 if you have the `strncasecmp' function. */ #undef HAVE_STRNCASECMP /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* 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. */ #undef HAVE_SYS_IOCTL_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. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UTSNAME_H /* Define to 1 if you have the header file. */ #undef HAVE_TERMIOS_H /* Define to 1 if you have the `uname' function. */ #undef HAVE_UNAME /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `unsetenv' function. */ #undef HAVE_UNSETENV /* Define to 1 if you have the header file. */ #undef HAVE_VALUES_H /* Define to 1 if you have the `vsnprintf' function. */ #undef HAVE_VSNPRINTF /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Download page */ #undef PACKAGE_DL /* Docs index */ #undef PACKAGE_DOCS /* Beginners guide */ #undef PACKAGE_GUIDE /* Home page */ #undef PACKAGE_HOME /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Trac new ticket page */ #undef PACKAGE_NEWBUG /* BerliOS page */ #undef PACKAGE_PROJ /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* png version */ #undef PNG_BUILD_VERSION /* portaudio version */ #undef PORTAUDIO_BUILD_VERSION /* pulseaudio version */ #undef PULSEAUDIO_BUILD_VERSION /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* samplerate version */ #undef SAMPLERATE_BUILD_VERSION /* Define to the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* sndfile version */ #undef SNDFILE_BUILD_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Define to 1 if we are using hamlib */ #undef USE_HAMLIB /* Defined if we are using OSS */ #undef USE_OSS /* Define to 1 if we are using png */ #undef USE_PNG /* Define to 1 if we are using portaudio */ #undef USE_PORTAUDIO /* Define to 1 if we are using pulseaudio */ #undef USE_PULSEAUDIO /* Define to 1 if we are using samplerate */ #undef USE_SAMPLERATE /* Define to 1 if we are using sndfile */ #undef USE_SNDFILE /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Defined if we are using TLS */ #undef USE_TLS /* Define to 1 if we are using x */ #undef USE_X /* Version number of package */ #undef VERSION /* x version */ #undef X_BUILD_VERSION /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT32_T /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT64_T /* Define for Solaris 2.5.1 so the uint8_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT8_T /* Define to 1 if we are building on cygwin or mingw */ #undef _WINDOWS /* Define to 1 if we are building on cygwin or mingw */ #undef __MINGW32__ /* Define to 1 if we are building on cygwin or mingw */ #undef __WOE32__ /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to the type of a signed integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef int16_t /* Define to the type of a signed integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef int32_t /* Define to the type of a signed integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef int64_t /* Define to the type of a signed integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef int8_t /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #undef restrict /* Work around a bug in Sun C++: it does not support _Restrict or __restrict__, even though the corresponding Sun C compiler ends up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. Perhaps some future version of Sun C++ will work with restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict # define __restrict__ #endif /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to the type of an unsigned integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef uint16_t /* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef uint32_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t /* Define to the type of an unsigned integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef uint8_t /* Define to empty if the keyword `volatile' does not work. Warning: valid code using `volatile' can become incorrect without. Disable with care. */ #undef volatile #include "pkg.h" #include "util.h" #endif /* CONFIG_H_ */ fldigi-3.21.80/src/xmlrpcpp/0000775000175000017500000000000012313333727012566 500000000000000fldigi-3.21.80/src/xmlrpcpp/XmlRpcServer.cpp0000664000175000017500000003351712313064025015607 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "XmlRpcServer.h" #include "XmlRpcServerConnection.h" #include "XmlRpcServerMethod.h" #include "XmlRpcSocket.h" #include "XmlRpcUtil.h" #include "XmlRpcException.h" #include "XmlRpc.h" #include using namespace XmlRpc; // Static data const char XmlRpcServer::METHODNAME_TAG[] = "methodName"; const char XmlRpcServer::PARAMS_TAG[] = "params"; const char XmlRpcServer::PARAM_TAG[] = "param"; const std::string XmlRpcServer::METHODNAME = "methodName"; const std::string XmlRpcServer::PARAMS = "params"; const std::string XmlRpcServer::FAULTCODE = "faultCode"; const std::string XmlRpcServer::FAULTSTRING = "faultString"; XmlRpcServer::XmlRpcServer() { _introspectionEnabled = false; _listMethods = 0; _methodHelp = 0; } XmlRpcServer::~XmlRpcServer() { this->shutdown(); _methods.clear(); delete _listMethods; delete _methodHelp; } // Add a command to the RPC server void XmlRpcServer::addMethod(XmlRpcServerMethod* method) { _methods[method->name()] = method; } // Remove a command from the RPC server void XmlRpcServer::removeMethod(XmlRpcServerMethod* method) { MethodMap::iterator i = _methods.find(method->name()); if (i != _methods.end()) _methods.erase(i); } // Remove a command from the RPC server by name void XmlRpcServer::removeMethod(const std::string& methodName) { MethodMap::iterator i = _methods.find(methodName); if (i != _methods.end()) _methods.erase(i); } // Look up a method by name XmlRpcServerMethod* XmlRpcServer::findMethod(const std::string& name) const { MethodMap::const_iterator i = _methods.find(name); if (i == _methods.end()) return 0; return i->second; } // Create a socket, bind to the specified port, and // set it in listen mode to make it available for clients. bool XmlRpcServer::bindAndListen(int port, int backlog /*= 5*/) { XmlRpcSocket::Socket fd = XmlRpcSocket::socket(); if (XmlRpcSocket::Invalid == fd) { XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not create socket (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } this->setfd(fd); // Don't block on reads/writes if ( ! XmlRpcSocket::setNonBlocking(fd)) { this->close(); XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not set socket to non-blocking input mode (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } // Allow this port to be re-bound immediately so server re-starts are not delayed if ( ! XmlRpcSocket::setReuseAddr(fd)) { this->close(); XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not set SO_REUSEADDR socket option (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } // Bind to the specified port on the default interface if ( ! XmlRpcSocket::bind(fd, port)) { this->close(); XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not bind to specified port (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } // Set in listening mode if ( ! XmlRpcSocket::listen(fd, backlog)) { this->close(); XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not set socket in listening mode (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(2, "XmlRpcServer::bindAndListen: server listening on port %d fd %d", port, fd); // Notify the dispatcher to listen on this source when we are in work() _disp.addSource(this, XmlRpcDispatch::ReadableEvent); return true; } // Get port number that this server is listening on int XmlRpcServer::getPort(void) const { return XmlRpcSocket::getPort(getfd()); } // Process client requests for the specified time (in seconds) void XmlRpcServer::work(double timeSeconds) { XmlRpcUtil::log(2, "XmlRpcServer::work: waiting for a connection"); _disp.work(timeSeconds); } // Handle input on the server socket by accepting the connection // and reading the rpc request. unsigned XmlRpcServer::handleEvent(unsigned mask) { acceptConnection(); return XmlRpcDispatch::ReadableEvent; // Continue to monitor this fd } // Accept a client connection request and create a connection to // handle method calls from the client. void XmlRpcServer::acceptConnection() { XmlRpcSocket::Socket s = XmlRpcSocket::accept(this->getfd()); XmlRpcUtil::log(2, "XmlRpcServer::acceptConnection: socket %d", s); if (XmlRpcSocket::Invalid == s) { //this->close(); XmlRpcUtil::error("XmlRpcServer::acceptConnection: Could not accept connection (%s).", XmlRpcSocket::getErrorMsg().c_str()); } else if ( ! XmlRpcSocket::setNonBlocking(s)) { XmlRpcSocket::close(s); XmlRpcUtil::error("XmlRpcServer::acceptConnection: Could not set socket to non-blocking input mode (%s).", XmlRpcSocket::getErrorMsg().c_str()); } else // Notify the dispatcher to listen for input on this source when we are in work() { XmlRpcUtil::log(2, "XmlRpcServer::acceptConnection: creating a connection"); XmlRpcServerConnection* c = this->createConnection(s); if (c) this->dispatchConnection(c); } } // Create a new connection object for processing requests from a specific client. XmlRpcServerConnection* XmlRpcServer::createConnection(XmlRpcSocket::Socket s) { // Specify that the connection object be deleted when it is closed return new XmlRpcServerConnection(s, this, true); } // Hand off a new connection to a dispatcher void XmlRpcServer::dispatchConnection(XmlRpcServerConnection* sc) { _disp.addSource(sc, XmlRpcDispatch::ReadableEvent); } // Remove a connection. Called by the connection when it closes down. void XmlRpcServer::removeConnection(XmlRpcServerConnection* sc) { _disp.removeSource(sc); } // Stop processing client requests void XmlRpcServer::exit() { _disp.exit(); } // Close the server socket file descriptor and stop monitoring connections void XmlRpcServer::shutdown() { // This closes and destroys all connections as well as closing this socket _disp.clear(); } // Introspection support static const std::string LIST_METHODS("system.listMethods"); static const std::string METHOD_HELP("system.methodHelp"); static const std::string MULTICALL("system.multicall"); // List all methods available on a server class ListMethods : public XmlRpcServerMethod { public: ListMethods(XmlRpcServer* s) : XmlRpcServerMethod(LIST_METHODS, s) {} void execute(XmlRpcValue& params, XmlRpcValue& result) { _server->listMethods(result); } std::string help() { return std::string("List all methods available on a server as an array of strings"); } }; // Retrieve the help string for a named method class MethodHelp : public XmlRpcServerMethod { public: MethodHelp(XmlRpcServer* s) : XmlRpcServerMethod(METHOD_HELP, s) {} void execute(XmlRpcValue& params, XmlRpcValue& result) { if (params[0].getType() != XmlRpcValue::TypeString) throw XmlRpcException(METHOD_HELP + ": Invalid argument type"); XmlRpcServerMethod* m = _server->findMethod(params[0]); if ( ! m) throw XmlRpcException(METHOD_HELP + ": Unknown method name"); result = m->help(); } std::string help() { return std::string("Retrieve the help string for a named method"); } }; // Specify whether introspection is enabled or not. Default is enabled. void XmlRpcServer::enableIntrospection(bool enabled) { if (_introspectionEnabled == enabled) return; _introspectionEnabled = enabled; if (enabled) { if ( ! _listMethods) { _listMethods = new ListMethods(this); _methodHelp = new MethodHelp(this); } else { addMethod(_listMethods); addMethod(_methodHelp); } } else { removeMethod(LIST_METHODS); removeMethod(METHOD_HELP); } } void XmlRpcServer::listMethods(XmlRpcValue& result) { int i = 0; result.setSize(int(_methods.size())+1); for (MethodMap::iterator it=_methods.begin(); it != _methods.end(); ++it) result[i++] = it->first; // Multicall support is built into XmlRpcServer::executeRequest result[i] = MULTICALL; } // Parse the request, run the method, generate a response string. std::string XmlRpcServer::executeRequest(std::string const& request) { XmlRpcValue params, resultValue; std::string methodName = parseRequest(request, params); XmlRpcUtil::log(2, "XmlRpcServer::executeRequest: server calling method '%s'", methodName.c_str()); std::string response; try { if ( ! executeMethod(methodName, params, resultValue) && ! executeMulticall(methodName, params, resultValue)) response = generateFaultResponse(methodName + ": unknown method name"); else response = generateResponse(resultValue.toXml()); } catch (const XmlRpcException& fault) { XmlRpcUtil::log(2, "XmlRpcServer::executeRequest: fault %s.", fault.getMessage().c_str()); response = generateFaultResponse(fault.getMessage(), fault.getCode()); } return response; } // Parse the method name and the argument values from the request. std::string XmlRpcServer::parseRequest(std::string const& request, XmlRpcValue& params) { std::string methodName; int offset = 0; // Number of chars parsed from the request bool emptyTag; if (XmlRpcUtil::parseTag(METHODNAME_TAG, request, &offset, methodName) && XmlRpcUtil::findTag(PARAMS_TAG, request, &offset, &emptyTag) && ! emptyTag) { int nArgs = 0; while (XmlRpcUtil::nextTagIs(PARAM_TAG, request, &offset, &emptyTag)) { if (emptyTag) { params[nArgs++] = XmlRpcValue(""); } else { params[nArgs++] = XmlRpcValue(request, &offset); (void) XmlRpcUtil::nextTagIsEnd(PARAM_TAG, request, &offset); } } (void) XmlRpcUtil::nextTagIsEnd(PARAMS_TAG, request, &offset); } return methodName; } // Execute a named method with the specified params. bool XmlRpcServer::executeMethod(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result) { XmlRpcServerMethod* method = findMethod(methodName); if ( ! method) return false; method->execute(params, result); // Ensure a valid result value if ( ! result.valid()) result = std::string(); return true; } // Execute multiple calls and return the results in an array. bool XmlRpcServer::executeMulticall(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result) { if (methodName != MULTICALL) return false; // There ought to be 1 parameter, an array of structs if (params.size() != 1 || params[0].getType() != XmlRpcValue::TypeArray) throw XmlRpcException(MULTICALL + ": Invalid argument (expected an array)"); int nc = params[0].size(); result.setSize(nc); for (int i=0; i\r\n" "\r\n\t"; const char RESPONSE_2[] = "\r\n\r\n"; std::string body = RESPONSE_1 + resultXml + RESPONSE_2; std::string header = generateHeader(body); std::string response = header + body; XmlRpcUtil::log(5, "XmlRpcServer::generateResponse:\n%s\n", response.c_str()); return response; } // Prepend http headers std::string XmlRpcServer::generateHeader(std::string const& body) { std::string header = "HTTP/1.1 200 OK\r\n" "Server: "; header += XMLRPC_VERSION; header += "\r\n" "Content-Type: text/xml\r\n" "Content-length: "; char buffLen[40]; sprintf(buffLen,"%"PRIuSZ"\r\n\r\n", body.size()); return header + buffLen; } std::string XmlRpcServer::generateFaultResponse(std::string const& errorMsg, int errorCode) { const char RESPONSE_1[] = "\r\n" "\r\n\t"; const char RESPONSE_2[] = "\r\n\r\n"; XmlRpcValue faultStruct; faultStruct[FAULTCODE] = errorCode; faultStruct[FAULTSTRING] = errorMsg; std::string body = RESPONSE_1 + faultStruct.toXml() + RESPONSE_2; std::string header = generateHeader(body); return header + body; } fldigi-3.21.80/src/xmlrpcpp/XmlRpcServerConnection.cpp0000664000175000017500000001630012313064025017616 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "XmlRpcServerConnection.h" #include "XmlRpcDispatch.h" #include "XmlRpcServer.h" #include "XmlRpcSocket.h" #include "XmlRpcUtil.h" #include #include #include #include using namespace XmlRpc; // The server delegates handling client requests to a serverConnection object. XmlRpcServerConnection::XmlRpcServerConnection(XmlRpcSocket::Socket fd, XmlRpcServer* server, bool deleteOnClose /*= false*/) : XmlRpcSource(fd, deleteOnClose) { XmlRpcUtil::log(2,"XmlRpcServerConnection: new socket %d.", fd); _server = server; _connectionState = READ_HEADER; _keepAlive = true; } XmlRpcServerConnection::~XmlRpcServerConnection() { XmlRpcUtil::log(4,"XmlRpcServerConnection dtor."); _server->removeConnection(this); } // Handle input on the server socket by accepting the connection // and reading the rpc request. Return true to continue to monitor // the socket for events, false to remove it from the dispatcher. unsigned XmlRpcServerConnection::handleEvent(unsigned /*eventType*/) { if (_connectionState == READ_HEADER) if ( ! readHeader()) return 0; if (_connectionState == READ_REQUEST) if ( ! readRequest()) return 0; if (_connectionState == WRITE_RESPONSE) if ( ! writeResponse()) return 0; return (_connectionState == WRITE_RESPONSE) ? XmlRpcDispatch::WritableEvent : XmlRpcDispatch::ReadableEvent; } bool XmlRpcServerConnection::readHeader() { // Read available data bool eof; if ( ! nbRead(_header, &eof)) { // Its only an error if we already have read some data if (_header.length() > 0) XmlRpcUtil::error("XmlRpcServerConnection::readHeader: error while reading header (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(4, "XmlRpcServerConnection::readHeader: read %d bytes.", _header.length()); char *hp = (char*)_header.c_str(); // Start of header char *ep = hp + _header.length(); // End of string char *bp = 0; // Start of body char *lp = 0; // Start of content-length value char *kp = 0; // Start of connection value for (char *cp = hp; (bp == 0) && (cp < ep); ++cp) { if ((ep - cp > 16) && (strncasecmp(cp, "Content-length: ", 16) == 0)) lp = cp + 16; else if ((ep - cp > 12) && (strncasecmp(cp, "Connection: ", 12) == 0)) kp = cp + 12; else if ((ep - cp > 4) && (strncmp(cp, "\r\n\r\n", 4) == 0)) bp = cp + 4; else if ((ep - cp > 2) && (strncmp(cp, "\n\n", 2) == 0)) bp = cp + 2; } // If we haven't gotten the entire header yet, return (keep reading) if (bp == 0) { // EOF in the middle of a request is an error, otherwise its ok if (eof) { XmlRpcUtil::log(4, "XmlRpcServerConnection::readHeader: EOF"); if (_header.length() > 0) XmlRpcUtil::error("XmlRpcServerConnection::readHeader: EOF while reading header"); return false; // Either way we close the connection } return true; // Keep reading } // Decode content length if (lp == 0) { XmlRpcUtil::error("XmlRpcServerConnection::readHeader: No Content-length specified"); return false; // We could try to figure it out by parsing as we read, but for now... } _contentLength = atoi(lp); if (_contentLength <= 0) { XmlRpcUtil::error("XmlRpcServerConnection::readHeader: Invalid Content-length specified (%d).", _contentLength); return false; } XmlRpcUtil::log(3, "XmlRpcServerConnection::readHeader: specified content length is %d.", _contentLength); // Otherwise copy non-header data to request buffer and set state to read request. _request = bp; // Parse out any interesting bits from the header (HTTP version, connection) _keepAlive = true; if (_header.find("HTTP/1.0") != std::string::npos) { if (kp == 0 || strncasecmp(kp, "keep-alive", 10) != 0) _keepAlive = false; // Default for HTTP 1.0 is to close the connection } else { if (kp != 0 && strncasecmp(kp, "close", 5) == 0) _keepAlive = false; } XmlRpcUtil::log(3, "KeepAlive: %d", _keepAlive); _header = ""; _connectionState = READ_REQUEST; return true; // Continue monitoring this source } bool XmlRpcServerConnection::readRequest() { // If we dont have the entire request yet, read available data if (int(_request.length()) < _contentLength) { bool eof; if ( ! nbRead(_request, &eof)) { XmlRpcUtil::error("XmlRpcServerConnection::readRequest: read error (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } // If we haven't gotten the entire request yet, return (keep reading) if (int(_request.length()) < _contentLength) { if (eof) { XmlRpcUtil::error("XmlRpcServerConnection::readRequest: EOF while reading request"); return false; // Either way we close the connection } return true; } } // Otherwise, parse and dispatch the request XmlRpcUtil::log(3, "XmlRpcServerConnection::readRequest read %d bytes.", _request.length()); //XmlRpcUtil::log(5, "XmlRpcServerConnection::readRequest:\n%s\n", _request.c_str()); _connectionState = WRITE_RESPONSE; return true; // Continue monitoring this source } bool XmlRpcServerConnection::writeResponse() { if (_response.length() == 0) { executeRequest(); _bytesWritten = 0; if (_response.length() == 0) { XmlRpcUtil::error("XmlRpcServerConnection::writeResponse: empty response."); return false; } } // Try to write the response if ( ! nbWrite(_response, &_bytesWritten)) { XmlRpcUtil::error("XmlRpcServerConnection::writeResponse: write error (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(3, "XmlRpcServerConnection::writeResponse: wrote %d of %d bytes.", _bytesWritten, _response.length()); // Prepare to read the next request if (_bytesWritten == int(_response.length())) { _header = ""; _request = ""; _response = ""; _connectionState = READ_HEADER; } return _keepAlive; // Continue monitoring this source if true } //! Helper method to execute the client request void XmlRpcServerConnection::executeRequest() { _response = _server->executeRequest(_request); } fldigi-3.21.80/src/xmlrpcpp/XmlRpcUtil.cpp0000664000175000017500000002032512313064025015247 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "XmlRpcUtil.h" #include #include #include #include #include #include "XmlRpc.h" using namespace XmlRpc; //#define USE_WINDOWS_DEBUG // To make the error and log messages go to VC++ debug output #ifdef USE_WINDOWS_DEBUG #define WIN32_LEAN_AND_MEAN #include #endif // Version id const char XmlRpc::XMLRPC_VERSION[] = "XMLRPC++ 0.8"; // Default log verbosity: 0 for no messages through 5 (writes everything) int XmlRpcLogHandler::_verbosity = 0; // Default log handler static class DefaultLogHandler : public XmlRpcLogHandler { public: void log(int level, const char* msg) { #ifdef USE_WINDOWS_DEBUG if (level <= _verbosity) { OutputDebugString(msg); OutputDebugString("\n"); } #else if (level <= _verbosity) std::cout << msg << std::endl; #endif } } defaultLogHandler; // Message log singleton XmlRpcLogHandler* XmlRpcLogHandler::_logHandler = &defaultLogHandler; // Default error handler static class DefaultErrorHandler : public XmlRpcErrorHandler { public: void error(const char* msg) { #ifdef USE_WINDOWS_DEBUG OutputDebugString(msg); OutputDebugString("\n"); #else std::cerr << msg << std::endl; #endif } } defaultErrorHandler; // Error handler singleton XmlRpcErrorHandler* XmlRpcErrorHandler::_errorHandler = &defaultErrorHandler; // Easy API for log verbosity int XmlRpc::getVerbosity() { return XmlRpcLogHandler::getVerbosity(); } void XmlRpc::setVerbosity(int level) { XmlRpcLogHandler::setVerbosity(level); } void XmlRpcUtil::log(int level, const char* fmt, ...) { if (level <= XmlRpcLogHandler::getVerbosity()) { va_list va; char buf[1024]; va_start( va, fmt); vsnprintf(buf,sizeof(buf)-1,fmt,va); buf[sizeof(buf)-1] = 0; XmlRpcLogHandler::getLogHandler()->log(level, buf); } } void XmlRpcUtil::error(const char* fmt, ...) { va_list va; va_start(va, fmt); char buf[1024]; vsnprintf(buf,sizeof(buf)-1,fmt,va); buf[sizeof(buf)-1] = 0; XmlRpcErrorHandler::getErrorHandler()->error(buf); } // Returns true if the tag is parsed. No attributes are parsed. // Sets val to the contents between and , or an empty string if is found. // Updates offset to char after bool XmlRpcUtil::parseTag(const char* tag, std::string const& xml, int* offset, std::string &val) { size_t nxml = xml.length(); if (*offset >= int(nxml)) return false; // Find or /> bool lastSlash = false; while (istart < nxml && xml[istart] != '>') { lastSlash = (xml[istart] == '/'); ++ istart; } if (istart == nxml) return false; val.clear(); if (lastSlash) // { *offset = int(istart+1); // 1 after > } else // Find { std::string etag = ""; size_t iend = xml.find(etag, istart); if (iend == std::string::npos) return false; *offset = int(iend + etag.length()); ++ istart; val = xml.substr(istart, iend-istart); } return true; } // Returns true if the tag is found and updates offset to the char after the tag bool XmlRpcUtil::findTag(const char* tag, std::string const& xml, int* offset, bool* emptyTag) { size_t nxml = xml.length(); if (*offset >= int(nxml)) return false; std::string stag = "<"; stag += tag; size_t istart = xml.find(stag, *offset); if (istart == std::string::npos) return false; istart += stag.length(); // Advance istart past > or />, skips attribs bool lastSlash = false; while (istart < nxml && xml[istart] != '>') { lastSlash = (xml[istart] == '/'); ++ istart; } if (istart == nxml) return false; *emptyTag = lastSlash; *offset = int(istart+1); // char after > return true; } // Returns true if the or is found at the specified offset (modulo any whitespace) // and updates offset to the char after the tag. *emptyTag is set to true if is found, false otherwise bool XmlRpcUtil::nextTagIs(const char* tag, std::string const& xml, int* offset, bool *emptyTag) { if (*offset >= int(xml.length())) return false; const char* cp = xml.c_str() + *offset; int nc = 0; while (*cp && isspace(*cp)) { ++cp; ++nc; } int len = int(strlen(tag)); if (*cp == '<' && (strncmp(cp+1, tag, len) == 0)) { cp += len + 1; if (*cp == '>') // { *offset += nc + len + 2; *emptyTag = false; return true; } while (*cp && isspace(*cp)) { ++cp; ++nc; } if (*cp == '/' && *(cp + 1) == '>') // { *offset += nc + len + 3; *emptyTag = true; return true; } } return false; } // Returns true if the next tag found at the specified offset is // and updates offset to the char after the tag. bool XmlRpcUtil::nextTagIsEnd(const char* tag, std::string const& xml, int* offset) { if (*offset >= int(xml.length())) return false; const char* cp = xml.c_str() + *offset; int nc = 0; while (*cp && *cp != '<') { ++cp; ++nc; } int len = int(strlen(tag)); if (*cp == '<' && *(cp+1) == '/' && (strncmp(cp+2, tag, len) == 0) && *(cp + len + 2) == '>') { *offset += nc + len + 3; return true; } return false; } // xml encodings (xml-encoded entities are preceded with '&') static const char AMP = '&'; static const char rawEntity[] = { '<', '>', '&', '\'', '\"', 0 }; static const char* xmlEntity[] = { "lt;", "gt;", "amp;", "apos;", "quot;", 0 }; static const int xmlEntLen[] = { 3, 3, 4, 5, 5 }; // Replace xml-encoded entities with the raw text equivalents. std::string XmlRpcUtil::xmlDecode(const std::string& encoded) { std::string::size_type iAmp = encoded.find(AMP); if (iAmp == std::string::npos) return encoded; std::string decoded(encoded, 0, iAmp); std::string::size_type iSize = encoded.size(); decoded.reserve(iSize); const char* ens = encoded.c_str(); while (iAmp != iSize) { if (encoded[iAmp] == AMP && iAmp+1 < iSize) { int iEntity; for (iEntity=0; xmlEntity[iEntity] != 0; ++iEntity) //if (encoded.compare(iAmp+1, xmlEntLen[iEntity], xmlEntity[iEntity]) == 0) if (strncmp(ens+iAmp+1, xmlEntity[iEntity], xmlEntLen[iEntity]) == 0) { decoded += rawEntity[iEntity]; iAmp += xmlEntLen[iEntity]+1; break; } if (xmlEntity[iEntity] == 0) // unrecognized sequence decoded += encoded[iAmp++]; } else { decoded += encoded[iAmp++]; } } return decoded; } // Replace raw text with xml-encoded entities. std::string XmlRpcUtil::xmlEncode(const std::string& raw) { std::string::size_type iRep = raw.find_first_of(rawEntity); if (iRep == std::string::npos) return raw; std::string encoded(raw, 0, iRep); std::string::size_type iSize = raw.size(); while (iRep != iSize) { int iEntity; for (iEntity=0; rawEntity[iEntity] != 0; ++iEntity) if (raw[iRep] == rawEntity[iEntity]) { encoded += AMP; encoded += xmlEntity[iEntity]; break; } if (rawEntity[iEntity] == 0) encoded += raw[iRep]; ++iRep; } return encoded; } fldigi-3.21.80/src/xmlrpcpp/XmlRpcSocket.h0000664000175000017500000000571712313064025015237 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSOCKET_H_ #define _XMLRPCSOCKET_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include namespace XmlRpc { //! A platform-independent socket API. class XmlRpcSocket { public: // On windows, a socket is an unsigned int large enough to hold a ptr // This should match the definition of SOCKET in winsock2.h #if defined(_WINDOWS) # if defined(_WIN64) typedef unsigned __int64 Socket; # else typedef unsigned int Socket; # endif #else typedef int Socket; #endif //! An invalid socket constant. static const Socket Invalid = (Socket) -1; //! Creates a stream (TCP) socket. Returns XmlRpcSocket::Invalid on failure. static Socket socket(); //! Closes a socket. static void close(Socket socket); //! Sets a stream (TCP) socket to perform non-blocking IO. Returns false on failure. static bool setNonBlocking(Socket socket); // The next four methods are appropriate for servers. //! Allow the port the specified socket is bound to to be re-bound immediately so //! server re-starts are not delayed. Returns false on failure. static bool setReuseAddr(Socket socket); //! Bind to a specified port static bool bind(Socket socket, int port); //! Set socket in listen mode static bool listen(Socket socket, int backlog); //! Accept a client connection request static Socket accept(Socket socket); //! Connect a socket to a server (from a client) static bool connect(Socket socket, std::string& host, int port); //! Get the port of a bound socket static int getPort(Socket socket); //! Returns true if the last error was not a fatal one (eg, EWOULDBLOCK) static bool nonFatalError(); //! Returns last errno static int getError(); //! Returns message corresponding to last error static std::string getErrorMsg(); //! Returns message corresponding to error static std::string getErrorMsg(int error); }; } // namespace XmlRpc #endif fldigi-3.21.80/src/xmlrpcpp/XmlRpcMutex.cpp0000664000175000017500000000375112313064025015440 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #if defined(XMLRPC_THREADS) #include #include "XmlRpcMutex.h" #if defined(_WINDOWS) # define WIN32_LEAN_AND_MEAN # include #else # include #endif using namespace XmlRpc; //! Destructor. XmlRpcMutex::~XmlRpcMutex() { if (_pMutex) { #if defined(_WINDOWS) ::CloseHandle((HANDLE)_pMutex); #else ::pthread_mutex_destroy((pthread_mutex_t*)_pMutex); delete _pMutex; #endif _pMutex = 0; } } //! Wait for the mutex to be available and then acquire the lock. void XmlRpcMutex::acquire() { #if defined(_WINDOWS) if ( ! _pMutex) _pMutex = ::CreateMutex(0, TRUE, 0); else ::WaitForSingleObject(_pMutex, INFINITE); #else if ( ! _pMutex) { _pMutex = new pthread_mutex_t; ::pthread_mutex_init((pthread_mutex_t*)_pMutex, 0); } ::pthread_mutex_lock((pthread_mutex_t*)_pMutex); #endif } //! Release the mutex. void XmlRpcMutex::release() { if (_pMutex) #if defined(_WINDOWS) ::ReleaseMutex(_pMutex); #else ::pthread_mutex_unlock((pthread_mutex_t*)_pMutex); #endif } #endif // XMLRPC_THREADS fldigi-3.21.80/src/xmlrpcpp/XmlRpc.h0000664000175000017500000000621112313064025014054 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _XMLRPC_H_ #define _XMLRPC_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include "XmlRpcClient.h" #include "XmlRpcException.h" #include "XmlRpcServer.h" #include "XmlRpcServerMethod.h" #include "XmlRpcValue.h" #include "XmlRpcUtil.h" namespace XmlRpc { //! An interface allowing custom handling of error message reporting. class XmlRpcErrorHandler { public: XmlRpcErrorHandler() {} ~XmlRpcErrorHandler() {} //! Returns a pointer to the currently installed error handling object. static XmlRpcErrorHandler* getErrorHandler() { return _errorHandler; } //! Specifies the error handler. static void setErrorHandler(XmlRpcErrorHandler* eh) { _errorHandler = eh; } //! Report an error. Custom error handlers should define this method. virtual void error(const char* msg) = 0; protected: static XmlRpcErrorHandler* _errorHandler; }; //! An interface allowing custom handling of informational message reporting. class XmlRpcLogHandler { public: //! Returns a pointer to the currently installed message reporting object. static XmlRpcLogHandler* getLogHandler() { return _logHandler; } //! Specifies the message handler. static void setLogHandler(XmlRpcLogHandler* lh) { _logHandler = lh; } //! Returns the level of verbosity of informational messages. 0 is no output, 5 is very verbose. static int getVerbosity() { return _verbosity; } //! Specify the level of verbosity of informational messages. 0 is no output, 5 is very verbose. static void setVerbosity(int v) { _verbosity = v; } //! Output a message. Custom error handlers should define this method. virtual void log(int level, const char* msg) = 0; protected: static XmlRpcLogHandler* _logHandler; static int _verbosity; }; //! Returns log message verbosity. This is short for XmlRpcLogHandler::getVerbosity() int getVerbosity(); //! Sets log message verbosity. This is short for XmlRpcLogHandler::setVerbosity(level) void setVerbosity(int level); //! Version identifier extern const char XMLRPC_VERSION[]; } // namespace XmlRpc #endif // _XMLRPC_H_ fldigi-3.21.80/src/xmlrpcpp/XmlRpcSocket.cpp0000664000175000017500000001226312313064025015564 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "XmlRpcSocket.h" #include "XmlRpcUtil.h" #if defined(_WINDOWS) # include # include //# pragma lib(WS2_32.lib) # define EINPROGRESS WSAEINPROGRESS # define EWOULDBLOCK WSAEWOULDBLOCK # define ETIMEDOUT WSAETIMEDOUT typedef int socklen_t; #else extern "C" { # include # include # include # include # include # include # include # include # include # include } #endif // _WINDOWS using namespace XmlRpc; // One-time initializations static bool initialized = false; static void initialize() { initialized = true; #if defined(_WINDOWS) { WORD wVersionRequested = MAKEWORD( 2, 0 ); WSADATA wsaData; WSAStartup(wVersionRequested, &wsaData); } #else { // Ignore SIGPIPE (void) signal(SIGPIPE, SIG_IGN); } #endif // _WINDOWS } // These errors are not considered fatal for an IO operation; the operation will be re-tried. bool XmlRpcSocket::nonFatalError() { int err = XmlRpcSocket::getError(); return (err == EINPROGRESS || #if defined(EAGAIN) err == EAGAIN || #endif #if defined(EINTR) err == EINTR || #endif err == EWOULDBLOCK); } XmlRpcSocket::Socket XmlRpcSocket::socket() { if ( ! initialized) initialize(); return ::socket(AF_INET, SOCK_STREAM, 0); } void XmlRpcSocket::close(XmlRpcSocket::Socket fd) { XmlRpcUtil::log(4, "XmlRpcSocket::close: fd %d.", fd); #if defined(_WINDOWS) closesocket(fd); #else ::close(fd); #endif // _WINDOWS } bool XmlRpcSocket::setNonBlocking(XmlRpcSocket::Socket fd) { #if defined(_WINDOWS) unsigned long flag = 1; return (ioctlsocket(fd, FIONBIO, &flag) == 0); #else return (fcntl(fd, F_SETFL, O_NONBLOCK) == 0); #endif // _WINDOWS } bool XmlRpcSocket::setReuseAddr(XmlRpcSocket::Socket fd) { // Allow this port to be re-bound immediately so server re-starts are not delayed int sflag = 1; return (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&sflag, sizeof(sflag)) == 0); } // Bind to a specified port bool XmlRpcSocket::bind(XmlRpcSocket::Socket fd, int port) { struct sockaddr_in saddr; memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = htonl(INADDR_ANY); saddr.sin_port = htons((u_short) port); return (::bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) == 0); } // Set socket in listen mode bool XmlRpcSocket::listen(XmlRpcSocket::Socket fd, int backlog) { return (::listen(fd, backlog) == 0); } XmlRpcSocket::Socket XmlRpcSocket::accept(XmlRpcSocket::Socket fd) { struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); return ::accept(fd, (struct sockaddr*)&addr, &addrlen); } // Connect a socket to a server (from a client) bool XmlRpcSocket::connect(XmlRpcSocket::Socket fd, std::string& host, int port) { struct sockaddr_in saddr; memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; struct hostent *hp = gethostbyname(host.c_str()); if (hp == 0) return false; saddr.sin_family = hp->h_addrtype; memcpy(&saddr.sin_addr, hp->h_addr, hp->h_length); saddr.sin_port = htons((u_short) port); // For asynch operation, this will return EWOULDBLOCK (windows) or // EINPROGRESS (linux) and we just need to wait for the socket to be writable... int result = ::connect(fd, (struct sockaddr *)&saddr, sizeof(saddr)); return result == 0 || nonFatalError(); } // Get the port of a bound socket int XmlRpcSocket::getPort(XmlRpcSocket::Socket socket) { struct sockaddr_in saddr; socklen_t saddr_len = sizeof(saddr); int port; int result = ::getsockname(socket, (sockaddr*) &saddr, &saddr_len); if (result != 0) { port = -1; } else { port = ntohs(saddr.sin_port); } return port; } // Returns last errno int XmlRpcSocket::getError() { #if defined(_WINDOWS) return WSAGetLastError(); #else return errno; #endif } // Returns message corresponding to last errno std::string XmlRpcSocket::getErrorMsg() { return getErrorMsg(getError()); } // Returns message corresponding to errno... well, it should anyway std::string XmlRpcSocket::getErrorMsg(int error) { char err[60]; snprintf(err,sizeof(err),"error %d", error); return std::string(err); } fldigi-3.21.80/src/xmlrpcpp/XmlRpcValue.h0000664000175000017500000002753712313064025015067 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _XMLRPCVALUE_H_ #define _XMLRPCVALUE_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include #include #include namespace XmlRpc { enum xmlrpc_nil_t { nil }; //! A class to represent RPC arguments and results. //! Each XmlRpcValue object contains a typed value, //! where the type is determined by the initial value //! assigned to the object. // should probably refcount them... class XmlRpcValue { public: //! XmlRpcValue types enum Type { TypeInvalid, TypeNil, TypeBoolean, TypeInt, TypeUnsigned, TypeLongLong, TypeDouble, TypeString, TypeDateTime, TypeBase64, TypeArray, TypeStruct }; // Non-primitive types typedef std::vector BinaryData; typedef std::vector ValueArray; typedef std::map ValueStruct; // Constructors //! Construct an empty XmlRpcValue XmlRpcValue() : _type(TypeInvalid) { _value.asBinary = 0; } //! Construct an XmlRpcValue with a nil value XmlRpcValue(xmlrpc_nil_t value) : _type(TypeNil) { } //! Construct an XmlRpcValue with a bool value XmlRpcValue(bool value) : _type(TypeBoolean) { _value.asBool = value; } //! Construct an XmlRpcValue with an int value XmlRpcValue(int value) : _type(TypeInt) { _value.asInt = value; } XmlRpcValue(unsigned int value) : _type(TypeUnsigned) { _value.asUnsigned = value; } XmlRpcValue(long long value) : _type(TypeLongLong) { _value.asLongLong = value; } //! Construct an XmlRpcValue with a double value XmlRpcValue(double value) : _type(TypeDouble) { _value.asDouble = value; } //! Construct an XmlRpcValue with a string value XmlRpcValue(std::string const& value) : _type(TypeString) { _value.asString = new std::string(value); } //! Construct an XmlRpcValue with a string value. //! @param value A null-terminated (C) string. XmlRpcValue(const char* value) : _type(TypeString) { _value.asString = new std::string(value); } XmlRpcValue(BinaryData const& value) : _type(TypeBase64) { _value.asBinary = new BinaryData(value); } XmlRpcValue(ValueStruct const& value) : _type(TypeStruct) { _value.asStruct = new ValueStruct(value); } XmlRpcValue(ValueArray const& value) : _type(TypeArray) { _value.asArray = new ValueArray(value); } //! Construct an XmlRpcValue with a date/time value. //! @param value A pointer to a struct tm (see localtime) XmlRpcValue(struct tm* value) : _type(TypeDateTime) { _value.asTime = new struct tm(*value); } //! Construct an XmlRpcValue with a binary data value //! @param value A pointer to data //! @param nBytes The length of the data pointed to, in bytes XmlRpcValue(void* value, int nBytes) : _type(TypeBase64) { _value.asBinary = new BinaryData((char*)value, ((char*)value)+nBytes); } //! Construct from xml, beginning at *offset chars into the string, updates offset XmlRpcValue(std::string const& xml, int* offset) : _type(TypeInvalid) { if ( ! fromXml(xml,offset)) _type = TypeInvalid; } //! Copy constructor XmlRpcValue(XmlRpcValue const& rhs) : _type(TypeInvalid) { *this = rhs; } //! Destructor (make virtual if you want to subclass) /*virtual*/ ~XmlRpcValue() { invalidate(); } //! Erase the current value void clear() { invalidate(); } // Operators //! Assignment from one XmlRpcValue to this one. //! @param rhs The value in rhs is copied to this value. XmlRpcValue& operator=(XmlRpcValue const& rhs); //! Assign nil to this XmlRpcValue. XmlRpcValue& operator=(xmlrpc_nil_t const& rhs) { return operator=(XmlRpcValue(rhs)); } //! Assign a bool to this XmlRpcValue. XmlRpcValue& operator=(bool const& rhs) { return operator=(XmlRpcValue(rhs)); } //! Assign an int to this XmlRpcValue. XmlRpcValue& operator=(int const& rhs) { return operator=(XmlRpcValue(rhs)); } //! Assign a double to this XmlRpcValue. XmlRpcValue& operator=(double const& rhs) { return operator=(XmlRpcValue(rhs)); } //! Assign a string to this XmlRpcValue. XmlRpcValue& operator=(const char* rhs) { return operator=(XmlRpcValue(std::string(rhs))); } //! Tests two XmlRpcValues for equality bool operator==(XmlRpcValue const& other) const; //! Tests two XmlRpcValues for inequality bool operator!=(XmlRpcValue const& other) const; //! Treat an XmlRpcValue as a bool. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeBoolean. operator bool&() { assertType(TypeBoolean); return _value.asBool; } operator bool() const { assertType(TypeBoolean); return _value.asBool; } //! Treat an XmlRpcValue as an int. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeInt. operator int&() { assertType(TypeInt); return _value.asInt; } operator int() const { assertType(TypeInt); return _value.asInt; } operator unsigned int&() { assertType(TypeUnsigned); return _value.asUnsigned; } operator unsigned int() const { assertType(TypeUnsigned); return _value.asUnsigned; } operator long long&() { assertType(TypeLongLong); return _value.asLongLong; } operator long long() const { assertType(TypeLongLong); return _value.asLongLong; } //! Treat an XmlRpcValue as a double. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeDouble. operator double&() { assertType(TypeDouble); return _value.asDouble; } operator double() const { assertType(TypeDouble); return _value.asDouble; } //! Treat an XmlRpcValue as a string. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeString. operator std::string&() { assertType(TypeString); return *_value.asString; } operator std::string const&() const { assertType(TypeString); return *_value.asString; } //! Access the BinaryData value. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeBase64. operator BinaryData&() { assertType(TypeBase64); return *_value.asBinary; } operator BinaryData const&() const { assertType(TypeBase64); return *_value.asBinary; } //! Access the DateTime value. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeDateTime. operator struct tm&() { assertType(TypeDateTime); return *_value.asTime; } operator struct tm const&() const { assertType(TypeDateTime); return *_value.asTime; } //! Const array value accessor. //! Access the ith value of the array. //! Throws XmlRpcException if the value is not an array or if the index i is //! not a valid index for the array. XmlRpcValue const& operator[](int i) const { assertArray(i+1); return _value.asArray->at(i); } //! Array value accessor. //! Access the ith value of the array, growing the array if necessary. //! Throws XmlRpcException if the value is not an array. XmlRpcValue& operator[](int i) { assertArray(i+1); return _value.asArray->at(i); } //! Struct entry accessor. //! Returns the value associated with the given entry, creating one if necessary. XmlRpcValue& operator[](std::string const& k) { assertStruct(); return (*_value.asStruct)[k]; } //! Struct entry accessor. //! Returns the value associated with the given entry, creating one if necessary. XmlRpcValue& operator[](const char* k) { assertStruct(); std::string s(k); return (*_value.asStruct)[s]; } //! Access the struct value map. //! Can be used to iterate over the entries in the map to find all defined entries. operator ValueStruct const&() { assertStruct(); return *_value.asStruct; } operator ValueArray const&() const { assertType(TypeArray); return *_value.asArray; } // Accessors //! Return true if the value has been set to something. bool valid() const { return _type != TypeInvalid; } //! Return the type of the value stored. \see Type. Type const &getType() const { return _type; } //! Return the size for string, base64, array, and struct values. int size() const; //! Specify the size for array values. Array values will grow beyond this size if needed. void setSize(int size) { assertArray(size); } //! Check for the existence of a struct member by name. bool hasMember(const std::string& name) const; //! Decode xml. Destroys any existing value. bool fromXml(std::string const& valueXml, int* offset); //! Encode the Value in xml std::string toXml() const; //! Write the value (no xml encoding) std::ostream& write(std::ostream& os) const; // Formatting //! Return the format used to write double values. static std::string const& getDoubleFormat() { return _doubleFormat; } //! Specify the format used to write double values. static void setDoubleFormat(const char* f) { _doubleFormat = f; } protected: // Clean up void invalidate(); // Type checking. Non-const versions coerce to the desired type if currently un-typed. void assertType(Type t) const; void assertType(Type t); void assertArray(int size) const; void assertArray(int size); void assertStruct(); // XML decoding bool boolFromXml(std::string const& valueXml, int* offset); bool intFromXml(std::string const& valueXml, int* offset); bool doubleFromXml(std::string const& valueXml, int* offset); bool stringFromXml(std::string const& valueXml, int* offset); bool timeFromXml(std::string const& valueXml, int* offset); bool binaryFromXml(std::string const& valueXml, int* offset); bool arrayFromXml(std::string const& valueXml, int* offset); bool structFromXml(std::string const& valueXml, int* offset); // XML encoding std::string nilToXml() const; std::string boolToXml() const; std::string intToXml() const; std::string doubleToXml() const; std::string stringToXml() const; std::string timeToXml() const; std::string binaryToXml() const; std::string arrayToXml() const; std::string structToXml() const; // Format strings static std::string _doubleFormat; // Type tag and values Type _type; // At some point I will split off Arrays and Structs into // separate ref-counted objects for more efficient copying. union { bool asBool; int asInt; unsigned int asUnsigned; long long asLongLong; double asDouble; struct tm* asTime; std::string* asString; BinaryData* asBinary; ValueArray* asArray; ValueStruct* asStruct; } _value; }; } // namespace XmlRpc std::ostream& operator<<(std::ostream& os, XmlRpc::XmlRpcValue& v); #endif // _XMLRPCVALUE_H_ fldigi-3.21.80/src/xmlrpcpp/XmlRpcThread.h0000664000175000017500000000470212313064025015207 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _XMLRPCTHREAD_H_ #define _XMLRPCTHREAD_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif namespace XmlRpc { //! An abstract class providing an interface for objects that can run in a separate thread. class XmlRpcRunnable { public: //! Code to be executed. virtual void run() = 0; }; // class XmlRpcRunnable //! A simple platform-independent thread API implemented for posix and windows. class XmlRpcThread { public: //! Construct a thread object. Not usable until setRunnable() has been called. XmlRpcThread() : _runner(0), _pThread(0) {} //! Construct a thread object. XmlRpcThread(XmlRpcRunnable* runnable) : _runner(runnable), _pThread(0) {} //! Destructor. Does not perform a join() (ie, the thread may continue to run). ~XmlRpcThread(); //! Execute the run method of the runnable object in a separate thread. //! Returns immediately in the calling thread. void start(); //! Waits until the thread exits. void join(); //! Access the runnable XmlRpcRunnable* getRunnable() const { return _runner; } //! Set the runnable void setRunnable(XmlRpcRunnable* r) { _runner = r; } private: //! Start the runnable going in a thread static unsigned int __stdcall runInThread(void* pThread); //! Code to be executed XmlRpcRunnable* _runner; //! Native thread object void* _pThread; }; // class XmlRpcThread } // namespace XmlRpc #endif // _XMLRPCTHREAD_H_ fldigi-3.21.80/src/xmlrpcpp/XmlRpcSource.h0000664000175000017500000000674712313064025015253 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSOURCE_H_ #define _XMLRPCSOURCE_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include "XmlRpcSocket.h" namespace XmlRpc { //! Proxy for Ssl data to avoid including headers here. struct SslProxy; //! An RPC source represents a file descriptor to monitor class XmlRpcSource { public: //! Constructor //! @param fd The socket file descriptor to monitor. //! @param deleteOnClose If true, the object deletes itself when close is called. XmlRpcSource(XmlRpcSocket::Socket fd = XmlRpcSocket::Invalid, bool deleteOnClose = false); //! Destructor virtual ~XmlRpcSource(); //! Return the file descriptor being monitored. XmlRpcSocket::Socket getfd() const { return _fd; } //! Specify the file descriptor to monitor. void setfd(XmlRpcSocket::Socket fd) { _fd = fd; } //! Return whether the file descriptor should be kept open if it is no longer monitored. bool getKeepOpen() const { return _keepOpen; } //! Specify whether the file descriptor should be kept open if it is no longer monitored. void setKeepOpen(bool b=true) { _keepOpen = b; } //! Return whether ssl is enabled. bool getSslEnabled() const { return _sslEnabled; } //! Specify whether to enable ssl. Use getSslEnabled() to verify that Ssl is available. void setSslEnabled(bool b=true); //! Close the owned fd. If deleteOnClose was specified at construction, the object is deleted. virtual void close(); //! Return true to continue monitoring this source virtual unsigned handleEvent(unsigned eventType) = 0; protected: // Execution processing helpers virtual bool doConnect(); //! Read text from the source. Returns false on error. bool nbRead(std::string& s, bool *eof); //! Write text to the source. Returns false on error. bool nbWrite(std::string const& s, int *bytesSoFar); private: // Socket. This is an int for linux/unix, and unsigned on win32, and unsigned __int64 on win64. // Casting to int/long/unsigned on win64 is a bad idea. XmlRpcSocket::Socket _fd; // In the server, a new source (XmlRpcServerConnection) is created // for each connected client. When each connection is closed, the // corresponding source object is deleted. bool _deleteOnClose; // In the client, keep connections open if you intend to make multiple calls. bool _keepOpen; // Enable use of SSL bool _sslEnabled; // SSL data SslProxy *_ssl; }; } // namespace XmlRpc #endif //_XMLRPCSOURCE_H_ fldigi-3.21.80/src/xmlrpcpp/XmlRpcClient.cpp0000664000175000017500000003641312313064025015555 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "XmlRpcClient.h" #include "XmlRpcSocket.h" #include "XmlRpc.h" #include "base64.h" // For HTTP authentication encoding #include #include #include #include #include using namespace XmlRpc; using namespace std; // Static data const char REQUEST_BEGIN[] = "\r\n" ""; const char REQUEST_END_METHODNAME[] = "\r\n"; const char PARAMS_TAG[] = ""; const char PARAMS_ETAG[] = ""; const char PARAM_TAG[] = ""; const char PARAM_ETAG[] = ""; const char REQUEST_END[] = "\r\n"; XmlRpcClient::XmlRpcClient(const char* host, int port, const char* uri/*=0*/) { XmlRpcUtil::log(1, "XmlRpcClient new client: host %s, port %d.", host, port); _host = host; _port = port; if (uri && *uri) _uri = uri; else _uri = "/RPC2"; _connectionState = NO_CONNECTION; _executing = false; _eof = false; // Default to keeping the connection open until an explicit close is done setKeepOpen(); } XmlRpcClient::XmlRpcClient(const char* host, int port, const char* login, const char* password, const char* uri/*=0*/) { XmlRpcUtil::log(1, "XmlRpcClient new client: host %s, port %d, login %s.", host, port, login); _host = host; _port = port; _login = login ? login : ""; _password = password ? password : ""; _uri = uri ? uri : "/RPC2"; _connectionState = NO_CONNECTION; _executing = false; _eof = false; // Default to keeping the connection open until an explicit close is done setKeepOpen(); } XmlRpcClient::~XmlRpcClient() { XmlRpcUtil::log(1, "XmlRpcClient dtor client: host %s, port %d.", _host.c_str(), _port); if (_connectionState != NO_CONNECTION) close(); } // Close the owned fd void XmlRpcClient::close() { XmlRpcUtil::log(4, "XmlRpcClient::close: fd %d.", getfd()); _connectionState = NO_CONNECTION; _disp.exit(); _disp.removeSource(this); XmlRpcSource::close(); } // Clear the referenced flag even if exceptions or errors occur. struct ClearFlagOnExit { ClearFlagOnExit(bool& flag) : _flag(flag) {} ~ClearFlagOnExit() { _flag = false; } bool& _flag; }; // Execute the named procedure on the remote server. // Params should be an array of the arguments for the method. // Returns true if the request was sent and a result received (although the result // might be a fault). bool XmlRpcClient::execute(const char* method, XmlRpcValue const& params, XmlRpcValue& result, double timeoutSeconds) { XmlRpcUtil::log(1, "XmlRpcClient::execute: method %s (_connectionState %d).", method, _connectionState); // This is not a thread-safe operation, if you want to do multithreading, use separate // clients for each thread. If you want to protect yourself from multiple threads // accessing the same client, replace this code with a real mutex. if (_executing) return false; _executing = true; ClearFlagOnExit cf(_executing); _sendAttempts = 0; _isFault = false; if ( ! setupConnection()) return false; if ( ! generateRequest(method, params)) return false; result.clear(); // Process until either a response is received or the timeout period passes _disp.work(timeoutSeconds); if (_connectionState != IDLE || ! parseResponse(result)) return false; XmlRpcUtil::log(1, "XmlRpcClient::execute: method %s completed.", method); _response.clear(); return true; } // XmlRpcSource interface implementation // Handle server responses. Called by the event dispatcher during execute. unsigned XmlRpcClient::handleEvent(unsigned eventType) { if (eventType == XmlRpcDispatch::Exception) { //if (XmlRpcSocket::nonFatalError()) // return (_connectionState == WRITE_REQUEST) // ? XmlRpcDispatch::WritableEvent : XmlRpcDispatch::ReadableEvent; if (_connectionState == WRITE_REQUEST && _bytesWritten == 0) XmlRpcUtil::error("Error in XmlRpcClient::handleEvent: could not connect to server (%s).", XmlRpcSocket::getErrorMsg().c_str()); else XmlRpcUtil::error("Error in XmlRpcClient::handleEvent (state %d): %s.", _connectionState, XmlRpcSocket::getErrorMsg().c_str()); return 0; } if (_connectionState == WRITE_REQUEST) if ( ! writeRequest()) return 0; if (_connectionState == READ_HEADER) if ( ! readHeader()) return 0; if (_connectionState == READ_RESPONSE) if ( ! readResponse()) return 0; // This should probably always ask for Exception events too return (_connectionState == WRITE_REQUEST) ? XmlRpcDispatch::WritableEvent : XmlRpcDispatch::ReadableEvent; } // Create the socket connection to the server if necessary bool XmlRpcClient::setupConnection() { // If an error occurred last time through, or if the server closed the connection, close our end if ((_connectionState != NO_CONNECTION && _connectionState != IDLE) || _eof) close(); _eof = false; if (_connectionState == NO_CONNECTION) if (! doConnect()) return false; // Prepare to write the request _connectionState = WRITE_REQUEST; _bytesWritten = 0; // Notify the dispatcher to listen on this source (calls handleEvent when the socket is writable) _disp.removeSource(this); // Make sure nothing is left over _disp.addSource(this, XmlRpcDispatch::WritableEvent | XmlRpcDispatch::Exception); return true; } // Connect to the xmlrpc server bool XmlRpcClient::doConnect() { XmlRpcSocket::Socket fd = XmlRpcSocket::socket(); if (fd == XmlRpcSocket::Invalid) { XmlRpcUtil::error("Error in XmlRpcClient::doConnect: Could not create socket (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(3, "XmlRpcClient::doConnect: fd %d.", fd); this->setfd(fd); // Don't block on connect/reads/writes if ( ! XmlRpcSocket::setNonBlocking(fd)) { this->close(); XmlRpcUtil::error("Error in XmlRpcClient::doConnect: Could not set socket to non-blocking IO mode (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } if ( ! XmlRpcSocket::connect(fd, _host, _port)) { this->close(); XmlRpcUtil::error("Error in XmlRpcClient::doConnect: Could not connect to server (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } return XmlRpcSource::doConnect(); } // Encode the request to call the specified method with the specified parameters into xml bool XmlRpcClient::generateRequest(const char* methodName, XmlRpcValue const& params) { std::string body = REQUEST_BEGIN; body += methodName; body += REQUEST_END_METHODNAME; // If params is an array, each element is a separate parameter if (params.valid()) { body += PARAMS_TAG; if (params.getType() == XmlRpcValue::TypeArray) { for (int i=0; i base64data; int iostatus = 0; base64 encoder; std::back_insert_iterator > ins = std::back_inserter(base64data); std::string authBuf = _login + ":" + _password; encoder.put(authBuf.begin(), authBuf.end(), ins, iostatus, base64<>::crlf()); header += "Authorization: Basic "; std::string authEnc(base64data.begin(), base64data.end()); // handle pesky linefeed characters string::size_type lf; while ( (lf = authEnc.find("\r")) != string::npos ) { authEnc.erase(lf, 1); } while ( (lf = authEnc.find("\n")) != string::npos ) { authEnc.erase(lf, 1); } header += authEnc; header += "\r\n"; } header += "Content-Type: text/xml\r\nContent-length: "; sprintf(buff,"%"PRIuSZ"\r\n\r\n", body.size()); return header + buff; } bool XmlRpcClient::writeRequest() { if (_bytesWritten == 0) XmlRpcUtil::log(5, "XmlRpcClient::writeRequest (attempt %d):\n%s\n", _sendAttempts+1, _request.c_str()); // Try to write the request if ( ! nbWrite(_request, &_bytesWritten)) { XmlRpcUtil::error("Error in XmlRpcClient::writeRequest: write error (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(3, "XmlRpcClient::writeRequest: wrote %d of %d bytes.", _bytesWritten, _request.length()); // Wait for the result if (_bytesWritten == int(_request.length())) { _header = ""; _response = ""; _connectionState = READ_HEADER; } return true; } // Read the header from the response bool XmlRpcClient::readHeader() { // Read available data if ( ! nbRead(_header, &_eof) || (_eof && _header.length() == 0)) { // If we haven't read any data yet and this is a keep-alive connection, the server may // have timed out, so we try one more time. if (getKeepOpen() && _header.length() == 0 && _sendAttempts++ == 0) { XmlRpcUtil::log(4, "XmlRpcClient::readHeader: re-trying connection"); XmlRpcSource::close(); _connectionState = NO_CONNECTION; _eof = false; return setupConnection(); } XmlRpcUtil::error("Error in XmlRpcClient::readHeader: error while reading header (%s) on fd %d.", XmlRpcSocket::getErrorMsg().c_str(), getfd()); return false; } XmlRpcUtil::log(4, "XmlRpcClient::readHeader: client has read %d bytes", _header.length()); return parseHeader(); } bool XmlRpcClient::parseHeader() { char const *hp = _header.c_str(); // Start of header char const *ep = hp + _header.length(); // End of string char const *bp = 0; // Start of body char const *lp = 0; // Start of content-length value std::string const CONTINUE100("100 Continue"); int nc100 = int(CONTINUE100.length()); for (char const *cp = hp; (bp == 0) && (cp < ep); ++cp) { if ((ep - cp > 16) && (strncasecmp(cp, "Content-length: ", 16) == 0)) { lp = cp + 16; } else if ((ep - cp > 4) && (strncmp(cp, "\r\n\r\n", 4) == 0)) { if (cp - hp > nc100 && strncmp(cp-CONTINUE100.length(), CONTINUE100.c_str(), CONTINUE100.length()) == 0) cp += 3; else bp = cp + 4; } else if ((ep - cp > 2) && (strncmp(cp, "\n\n", 2) == 0)) { if (cp - hp > nc100 && strncmp(cp-CONTINUE100.length(), CONTINUE100.c_str(), CONTINUE100.length()) == 0) ++ cp; else bp = cp + 2; } } // If we haven't gotten the entire header yet, return (keep reading) if (bp == 0) { if (_eof) // EOF in the middle of a response is an error { XmlRpcUtil::error("Error in XmlRpcClient::readHeader: EOF while reading header"); return false; // Close the connection } return true; // Keep reading } // Decode content length if (lp == 0) { XmlRpcUtil::error("Error XmlRpcClient::readHeader: No Content-length specified"); return false; // We could try to figure it out by parsing as we read, but for now... } _contentLength = atoi(lp); if (_contentLength <= 0) { XmlRpcUtil::error("Error in XmlRpcClient::readHeader: Invalid Content-length specified (%d).", _contentLength); return false; } XmlRpcUtil::log(4, "client read content length: %d", _contentLength); // Otherwise copy non-header data to response buffer and set state to read response. _response = bp; _header = ""; // should parse out any interesting bits from the header (connection, etc)... _connectionState = READ_RESPONSE; return true; // Continue monitoring this source } bool XmlRpcClient::readResponse() { // If we dont have the entire response yet, read available data if (int(_response.length()) < _contentLength) { if ( ! nbRead(_response, &_eof)) { XmlRpcUtil::error("Error in XmlRpcClient::readResponse: read error (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } // If we haven't gotten the entire _response yet, return (keep reading) if (int(_response.length()) < _contentLength) { if (_eof) { XmlRpcUtil::error("Error in XmlRpcClient::readResponse: EOF while reading response"); return false; } return true; } } // Otherwise, parse and return the result XmlRpcUtil::log(3, "XmlRpcClient::readResponse (read %d bytes)", _response.length()); XmlRpcUtil::log(5, "response:\n%s", _response.c_str()); _connectionState = IDLE; return false; // Stop monitoring this source (causes return from work) } // Convert the response xml into a result value bool XmlRpcClient::parseResponse(XmlRpcValue& result) { std::string r; _response.swap(r); // Parse response xml into result bool emptyParam; int offset = 0; if ( ! XmlRpcUtil::findTag("methodResponse",r,&offset,&emptyParam) || emptyParam) { XmlRpcUtil::error("Error in XmlRpcClient::parseResponse: Invalid response - no methodResponse. Response:\n%s", r.c_str()); return false; } // Expect either ... or ... if (XmlRpcUtil::nextTagIs("params",r,&offset,&emptyParam) && XmlRpcUtil::nextTagIs("param",r,&offset,&emptyParam)) { if (emptyParam) { result = 0; // No result? } else if ( ! result.fromXml(r, &offset)) { XmlRpcUtil::error("Error in XmlRpcClient::parseResponse: Invalid response value. Response:\n%s", r.c_str()); return false; } } else if (XmlRpcUtil::nextTagIs("fault",r,&offset,&emptyParam)) { _isFault = true; if (emptyParam || ! result.fromXml(r, &offset)) { result = 0; // No result? return false; } } else { XmlRpcUtil::error("Error in XmlRpcClient::parseResponse: Invalid response - no param or fault tag. Response:\n%s", r.c_str()); return false; } return result.valid(); } fldigi-3.21.80/src/xmlrpcpp/XmlRpcServerMethod.cpp0000664000175000017500000000250712313064025016743 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "XmlRpcServerMethod.h" #include "XmlRpcServer.h" namespace XmlRpc { XmlRpcServerMethod::XmlRpcServerMethod(std::string const& name, XmlRpcServer* server) { _name = name; _server = server; if (_server) _server->addMethod(this); } XmlRpcServerMethod::~XmlRpcServerMethod() { if (_server) _server->removeMethod(this); } } // namespace XmlRpc fldigi-3.21.80/src/xmlrpcpp/XmlRpcThreadedServer.cpp0000664000175000017500000000362512313064025017245 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #if defined(XMLRPC_THREADS) #include "XmlRpcThreadedServer.h" //#include "XmlRpcServerConnection.h" #include using namespace XmlRpc; // executeRequestThreaded: // remove the serverConnection from the dispatcher (but don't close the socket) // push the request onto the request queue // (acquire the mutex, push_back request, release mutex, incr semaphore) // // worker::run // while ! stopped // pop a request off the request queue (block on semaphore/decr, acquire mutex, get request, rel) // executeRequest (parse, run, generate response) // notify the serverConnection that the response is available // (the serverConnection needs to add itself back to the dispatcher safely - mutex) // How do I interrupt the dispatcher if it is waiting in a select call? // i) Replace select with WaitForMultipleObjects, using WSAEventSelect to associate // each socket with an event object, and adding an additional "signal" event. // #endif // XMLRPC_THREADS fldigi-3.21.80/src/xmlrpcpp/XmlRpcThread.cpp0000664000175000017500000000441512313064025015543 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #if defined(XMLRPC_THREADS) #include #include "XmlRpcThread.h" #if defined(_WINDOWS) # define WIN32_LEAN_AND_MEAN # include # include #else # include #endif using namespace XmlRpc; //! Destructor. Does not perform a join() (ie, the thread may continue to run). XmlRpcThread::~XmlRpcThread() { if (_pThread) { #if defined(_WINDOWS) ::CloseHandle((HANDLE)_pThread); #else ::pthread_detach((pthread_t)_pThread); #endif _pThread = 0; } } //! Execute the run method of the runnable object in a separate thread. //! Returns immediately in the calling thread. void XmlRpcThread::start() { if ( ! _pThread) { #if defined(_WINDOWS) unsigned threadID; _pThread = (HANDLE)_beginthreadex(NULL, 0, &runInThread, this, 0, &threadID); #else ::pthread_create((pthread_t*) &_pThread, NULL, &runInThread, this); #endif } } //! Waits until the thread exits. void XmlRpcThread::join() { if (_pThread) { #if defined(_WINDOWS) ::WaitForSingleObject(_pThread, INFINITE); ::CloseHandle(_pThread); #else ::pthread_join((pthread_t)_pThread, 0); #endif _pThread = 0; } } //! Start the runnable going in a thread unsigned int XmlRpcThread::runInThread(void* pThread) { XmlRpcThread* t = (XmlRpcThread*)pThread; t->getRunnable()->run(); return 0; } #endif // XMLRPC_THREADS fldigi-3.21.80/src/xmlrpcpp/base64.h0000664000175000017500000002103412313064025013733 00000000000000// base64.hpp // Autor Konstantin Pilipchuk // mailto:lostd@ukr.net // ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #if !defined(__BASE64_H_INCLUDED__) #define __BASE64_H_INCLUDED__ 1 #include static int _base64Chars[]= {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9', '+','/' }; #define _0000_0011 0x03 #define _1111_1100 0xFC #define _1111_0000 0xF0 #define _0011_0000 0x30 #define _0011_1100 0x3C #define _0000_1111 0x0F #define _1100_0000 0xC0 #define _0011_1111 0x3F #define _EQUAL_CHAR (-1) #define _UNKNOWN_CHAR (-2) #define _IOS_FAILBIT std::ios_base::failbit #define _IOS_EOFBIT std::ios_base::eofbit #define _IOS_BADBIT std::ios_base::badbit #define _IOS_GOODBIT std::ios_base::goodbit // TEMPLATE CLASS base64_put template > class base64 { public: typedef unsigned char byte_t; typedef _E char_type; typedef _Tr traits_type; // base64 requires max line length <= 72 characters // you can fill end of line // it may be crlf, crlfsp, noline or other class like it struct crlf { template _OI operator()(_OI _To) const{ *_To = _Tr::to_char_type('\r'); ++_To; *_To = _Tr::to_char_type('\n'); ++_To; return (_To); } }; struct crlfsp { template _OI operator()(_OI _To) const{ *_To = _Tr::to_char_type('\r'); ++_To; *_To = _Tr::to_char_type('\n'); ++_To; *_To = _Tr::to_char_type(' '); ++_To; return (_To); } }; struct noline { template _OI operator()(_OI _To) const{ return (_To); } }; struct three2four { void zero() { _data[0] = 0; _data[1] = 0; _data[2] = 0; } byte_t get_0() const { return _data[0]; } byte_t get_1() const { return _data[1]; } byte_t get_2() const { return _data[2]; } void set_0(byte_t _ch) { _data[0] = _ch; } void set_1(byte_t _ch) { _data[1] = _ch; } void set_2(byte_t _ch) { _data[2] = _ch; } // 0000 0000 1111 1111 2222 2222 // xxxx xxxx xxxx xxxx xxxx xxxx // 0000 0011 1111 2222 2233 3333 int b64_0() const {return (_data[0] & _1111_1100) >> 2;} int b64_1() const {return ((_data[0] & _0000_0011) << 4) + ((_data[1] & _1111_0000)>>4);} int b64_2() const {return ((_data[1] & _0000_1111) << 2) + ((_data[2] & _1100_0000)>>6);} int b64_3() const {return (_data[2] & _0011_1111);} void b64_0(int _ch) {_data[0] = ((_ch & _0011_1111) << 2) | (_0000_0011 & _data[0]);} void b64_1(int _ch) { _data[0] = ((_ch & _0011_0000) >> 4) | (_1111_1100 & _data[0]); _data[1] = ((_ch & _0000_1111) << 4) | (_0000_1111 & _data[1]); } void b64_2(int _ch) { _data[1] = ((_ch & _0011_1100) >> 2) | (_1111_0000 & _data[1]); _data[2] = ((_ch & _0000_0011) << 6) | (_0011_1111 & _data[2]); } void b64_3(int _ch){ _data[2] = (_ch & _0011_1111) | (_1100_0000 & _data[2]);} private: byte_t _data[3]; }; template _II put(_II _First, _II _Last, _OI _To, _State& _St, _Endline _Endl) const { three2four _3to4; int line_octets = 0; while(_First != _Last) { _3to4.zero(); // áåð¸ì ïî 3 ñèìâîëà _3to4.set_0(*_First); _First++; if(_First == _Last) { *_To = _Tr::to_char_type(_base64Chars[_3to4.b64_0()]); ++_To; *_To = _Tr::to_char_type(_base64Chars[_3to4.b64_1()]); ++_To; *_To = _Tr::to_char_type('='); ++_To; *_To = _Tr::to_char_type('='); ++_To; goto __end; } _3to4.set_1(*_First); _First++; if(_First == _Last) { *_To = _Tr::to_char_type(_base64Chars[_3to4.b64_0()]); ++_To; *_To = _Tr::to_char_type(_base64Chars[_3to4.b64_1()]); ++_To; *_To = _Tr::to_char_type(_base64Chars[_3to4.b64_2()]); ++_To; *_To = _Tr::to_char_type('='); ++_To; goto __end; } _3to4.set_2(*_First); _First++; *_To = _Tr::to_char_type(_base64Chars[_3to4.b64_0()]); ++_To; *_To = _Tr::to_char_type(_base64Chars[_3to4.b64_1()]); ++_To; *_To = _Tr::to_char_type(_base64Chars[_3to4.b64_2()]); ++_To; *_To = _Tr::to_char_type(_base64Chars[_3to4.b64_3()]); ++_To; if(line_octets == 17) // base64 ïîçâîëÿåò äëèíó ñòðîêè íå áîëåå 72 ñèìâîëîâ { //_To = _Endl(_To); *_To = '\n'; ++_To; line_octets = 0; } else ++line_octets; } __end: ; return (_First); } template _II get(_II _First, _II _Last, _OI _To, _State& _St) const { three2four _3to4; int _Char; while(_First != _Last) { // Take octet _3to4.zero(); // -- 0 -- // Search next valid char... while((_Char = _getCharType(*_First)) < 0 && _Char == _UNKNOWN_CHAR) { if(++_First == _Last) { _St |= _IOS_FAILBIT|_IOS_EOFBIT; return _First; // unexpected EOF } } if(_Char == _EQUAL_CHAR){ // Error! First character in octet can't be '=' _St |= _IOS_FAILBIT; return _First; } else _3to4.b64_0(_Char); // -- 1 -- // Search next valid char... while(++_First != _Last) if((_Char = _getCharType(*_First)) != _UNKNOWN_CHAR) break; if(_First == _Last) { _St |= _IOS_FAILBIT|_IOS_EOFBIT; // unexpected EOF return _First; } if(_Char == _EQUAL_CHAR){ // Error! Second character in octet can't be '=' _St |= _IOS_FAILBIT; return _First; } else _3to4.b64_1(_Char); // -- 2 -- // Search next valid char... while(++_First != _Last) if((_Char = _getCharType(*_First)) != _UNKNOWN_CHAR) break; if(_First == _Last) { // Error! Unexpected EOF. Must be '=' or base64 character _St |= _IOS_FAILBIT|_IOS_EOFBIT; return _First; } if(_Char == _EQUAL_CHAR){ // OK! _3to4.b64_2(0); _3to4.b64_3(0); // chek for EOF if(++_First == _Last) { // Error! Unexpected EOF. Must be '='. Ignore it. //_St |= _IOS_BADBIT|_IOS_EOFBIT; _St |= _IOS_EOFBIT; } else if(_getCharType(*_First) != _EQUAL_CHAR) { // Error! Must be '='. Ignore it. //_St |= _IOS_BADBIT; } else ++_First; // Skip '=' // write 1 byte to output *_To = (byte_t) _3to4.get_0(); return _First; } else _3to4.b64_2(_Char); // -- 3 -- // Search next valid char... while(++_First != _Last) if((_Char = _getCharType(*_First)) != _UNKNOWN_CHAR) break; if(_First == _Last) { // Unexpected EOF. It's error. But ignore it. //_St |= _IOS_FAILBIT|_IOS_EOFBIT; _St |= _IOS_EOFBIT; return _First; } if(_Char == _EQUAL_CHAR) { // OK! _3to4.b64_3(0); // write to output 2 bytes *_To = (byte_t) _3to4.get_0(); *_To = (byte_t) _3to4.get_1(); ++_First; // set position to next character return _First; } else _3to4.b64_3(_Char); // write to output 3 bytes *_To = (byte_t) _3to4.get_0(); *_To = (byte_t) _3to4.get_1(); *_To = (byte_t) _3to4.get_2(); ++_First; } // while(_First != _Last) return (_First); } protected: int _getCharType(int _Ch) const { if(_base64Chars[62] == _Ch) return 62; if(_base64Chars[63] == _Ch) return 63; if((_base64Chars[0] <= _Ch) && (_base64Chars[25] >= _Ch)) return _Ch - _base64Chars[0]; if((_base64Chars[26] <= _Ch) && (_base64Chars[51] >= _Ch)) return _Ch - _base64Chars[26] + 26; if((_base64Chars[52] <= _Ch) && (_base64Chars[61] >= _Ch)) return _Ch - _base64Chars[52] + 52; if(_Ch == _Tr::to_int_type('=')) return _EQUAL_CHAR; return _UNKNOWN_CHAR; } }; #endif fldigi-3.21.80/src/xmlrpcpp/XmlRpcServerConnection.h0000664000175000017500000000573612313064025017276 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSERVERCONNECTION_H_ #define _XMLRPCSERVERCONNECTION_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include "XmlRpcValue.h" #include "XmlRpcSource.h" namespace XmlRpc { // The server waits for client connections and provides support for executing methods class XmlRpcServer; class XmlRpcServerMethod; //! A class to handle XML RPC requests from a particular client class XmlRpcServerConnection : public XmlRpcSource { public: //! Constructor XmlRpcServerConnection(XmlRpcSocket::Socket fd, XmlRpcServer* server, bool deleteOnClose = false); //! Destructor virtual ~XmlRpcServerConnection(); // XmlRpcSource interface implementation //! Handle IO on the client connection socket. //! @param eventType Type of IO event that occurred. @see XmlRpcDispatch::EventType. virtual unsigned handleEvent(unsigned eventType); protected: //! Reads the http header bool readHeader(); //! Reads the request (based on the content-length header value) bool readRequest(); //! Executes the request and writes the resulting response bool writeResponse(); //! Helper method to execute the client request virtual void executeRequest(); //! The XmlRpc server that accepted this connection XmlRpcServer* _server; //! Possible IO states for the connection enum ServerConnectionState { READ_HEADER, READ_REQUEST, WRITE_RESPONSE }; //! Current IO state for the connection ServerConnectionState _connectionState; //! Request headers std::string _header; //! Number of bytes expected in the request body (parsed from header) int _contentLength; //! Request body std::string _request; //! Response std::string _response; //! Number of bytes of the response written so far int _bytesWritten; //! Whether to keep the current client connection open for further requests bool _keepAlive; }; } // namespace XmlRpc #endif // _XMLRPCSERVERCONNECTION_H_ fldigi-3.21.80/src/xmlrpcpp/XmlRpcValue.cpp0000664000175000017500000005077612313064025015423 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "XmlRpcValue.h" #include "XmlRpcException.h" #include "XmlRpcUtil.h" #include "base64.h" #include #include #include #include namespace XmlRpc { static const char VALUE_TAG[] = "value"; static const char NIL_TAG[] = "nil"; static const char BOOLEAN_TAG[] = "boolean"; static const char DOUBLE_TAG[] = "double"; static const char INT_TAG[] = "int"; static const char I4_TAG[] = "i4"; static const char STRING_TAG[] = "string"; static const char DATETIME_TAG[] = "dateTime.iso8601"; static const char BASE64_TAG[] = "base64"; static const char ARRAY_TAG[] = "array"; static const char DATA_TAG[] = "data"; static const char STRUCT_TAG[] = "struct"; static const char MEMBER_TAG[] = "member"; static const char NAME_TAG[] = "name"; // Format strings std::string XmlRpcValue::_doubleFormat("%f"); // Clean up void XmlRpcValue::invalidate() { switch (_type) { case TypeString: delete _value.asString; break; case TypeDateTime: delete _value.asTime; break; case TypeBase64: delete _value.asBinary; break; case TypeArray: delete _value.asArray; break; case TypeStruct: delete _value.asStruct; break; default: break; } _type = TypeInvalid; _value.asBinary = 0; } // Type checking void XmlRpcValue::assertType(Type t) const { if (_type != t) { throw XmlRpcException("type error"); } } void XmlRpcValue::assertType(Type t) { if (_type == TypeInvalid) { _type = t; switch (_type) { // Ensure there is a valid value for the type case TypeString: _value.asString = new std::string(); break; case TypeDateTime: _value.asTime = new struct tm(); break; case TypeBase64: _value.asBinary = new BinaryData(); break; case TypeArray: _value.asArray = new ValueArray(); break; case TypeStruct: _value.asStruct = new ValueStruct(); break; default: _value.asBinary = 0; break; } } else if (_type != t) { throw XmlRpcException("type error"); } } void XmlRpcValue::assertArray(int size) const { if (_type != TypeArray) throw XmlRpcException("type error: expected an array"); else if (int(_value.asArray->size()) < size) throw XmlRpcException("range error: array index too large"); } void XmlRpcValue::assertArray(int size) { if (_type == TypeInvalid) { _type = TypeArray; _value.asArray = new ValueArray(size); } else if (_type == TypeArray) { if (int(_value.asArray->size()) < size) _value.asArray->resize(size); } else throw XmlRpcException("type error: expected an array"); } void XmlRpcValue::assertStruct() { if (_type == TypeInvalid) { _type = TypeStruct; _value.asStruct = new ValueStruct(); } else if (_type != TypeStruct) throw XmlRpcException("type error: expected a struct"); } // Operators XmlRpcValue& XmlRpcValue::operator=(XmlRpcValue const& rhs) { if (this != &rhs) { invalidate(); _type = rhs._type; switch (_type) { case TypeBoolean: _value.asBool = rhs._value.asBool; break; case TypeInt: _value.asInt = rhs._value.asInt; break; case TypeDouble: _value.asDouble = rhs._value.asDouble; break; case TypeDateTime: _value.asTime = new struct tm(*rhs._value.asTime); break; case TypeString: _value.asString = new std::string(*rhs._value.asString); break; case TypeBase64: _value.asBinary = new BinaryData(*rhs._value.asBinary); break; case TypeArray: _value.asArray = new ValueArray(*rhs._value.asArray); break; case TypeStruct: _value.asStruct = new ValueStruct(*rhs._value.asStruct); break; default: _value.asBinary = 0; break; } } return *this; } // Predicate for tm equality static bool tmEq(struct tm const& t1, struct tm const& t2) { return t1.tm_sec == t2.tm_sec && t1.tm_min == t2.tm_min && t1.tm_hour == t2.tm_hour && t1.tm_mday == t1.tm_mday && t1.tm_mon == t2.tm_mon && t1.tm_year == t2.tm_year; } bool XmlRpcValue::operator==(XmlRpcValue const& other) const { if (_type != other._type) return false; switch (_type) { case TypeBoolean: return ( !_value.asBool && !other._value.asBool) || ( _value.asBool && other._value.asBool); case TypeInt: return _value.asInt == other._value.asInt; case TypeDouble: return _value.asDouble == other._value.asDouble; case TypeDateTime: return tmEq(*_value.asTime, *other._value.asTime); case TypeString: return *_value.asString == *other._value.asString; case TypeBase64: return *_value.asBinary == *other._value.asBinary; case TypeArray: return *_value.asArray == *other._value.asArray; // The map<>::operator== requires the definition of value< for kcc case TypeStruct: //return *_value.asStruct == *other._value.asStruct; { if (_value.asStruct->size() != other._value.asStruct->size()) return false; ValueStruct::const_iterator it1=_value.asStruct->begin(); ValueStruct::const_iterator it2=other._value.asStruct->begin(); while (it1 != _value.asStruct->end()) { const XmlRpcValue& v1 = it1->second; const XmlRpcValue& v2 = it2->second; if ( ! (v1 == v2)) return false; it1++; it2++; } return true; } default: break; } return true; // Both invalid values ... } bool XmlRpcValue::operator!=(XmlRpcValue const& other) const { return !(*this == other); } // Works for strings, binary data, arrays, and structs. int XmlRpcValue::size() const { switch (_type) { case TypeString: return int(_value.asString->size()); case TypeBase64: return int(_value.asBinary->size()); case TypeArray: return int(_value.asArray->size()); case TypeStruct: return int(_value.asStruct->size()); default: break; } throw XmlRpcException("type error"); } // Checks for existence of struct member bool XmlRpcValue::hasMember(const std::string& name) const { return _type == TypeStruct && _value.asStruct->find(name) != _value.asStruct->end(); } // Set the value from xml. The chars at *offset into valueXml // should be the start of a tag. Destroys any existing value. bool XmlRpcValue::fromXml(std::string const& valueXml, int* offset) { int savedOffset = *offset; invalidate(); bool emptyTag; if ( ! XmlRpcUtil::nextTagIs(VALUE_TAG, valueXml, offset, &emptyTag)) return false; // Not a value, offset not updated // No value? Pretend its an empty string... if (emptyTag) { *this = ""; return true; } // No type tag? Assume string // bool result = true; bool result = false; int valueOffset = *offset; if (XmlRpcUtil::nextTagIsEnd(VALUE_TAG, valueXml, offset)) { result = true; return stringFromXml(valueXml, &valueOffset); } else if (XmlRpcUtil::nextTagIs(NIL_TAG, valueXml, offset, &emptyTag)) { _type = TypeNil; result = true; } else if (XmlRpcUtil::nextTagIs(BOOLEAN_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = false; result = true; } else result = boolFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(BOOLEAN_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(I4_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = 0; result = true; } else result = intFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(I4_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(INT_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = 0; result = true; } else result = intFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(INT_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(DOUBLE_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = 0.0; result = true; } else result = doubleFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(DOUBLE_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(STRING_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = ""; result = true; } else result = stringFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(STRING_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(DATETIME_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) result = false; else result = timeFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(DATETIME_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(BASE64_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) result = binaryFromXml("", 0); else result = binaryFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(BASE64_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(ARRAY_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) result = false; else result = arrayFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(ARRAY_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(STRUCT_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) result = false; else result = structFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(STRUCT_TAG, valueXml, offset); } // Unrecognized tag after or no if ( ! result || ! XmlRpcUtil::nextTagIsEnd(VALUE_TAG, valueXml, offset)) { *offset = savedOffset; return false; } return true; } // Encode the Value in xml std::string XmlRpcValue::toXml() const { switch (_type) { case TypeNil: return nilToXml(); case TypeBoolean: return boolToXml(); case TypeInt: return intToXml(); case TypeDouble: return doubleToXml(); case TypeString: return stringToXml(); case TypeDateTime: return timeToXml(); case TypeBase64: return binaryToXml(); case TypeArray: return arrayToXml(); case TypeStruct: return structToXml(); default: break; } return std::string(); // Invalid value } // Boolean bool XmlRpcValue::boolFromXml(std::string const& valueXml, int* offset) { const char* valueStart = valueXml.c_str() + *offset; char* valueEnd; long ivalue = strtol(valueStart, &valueEnd, 10); if (valueEnd == valueStart || (ivalue != 0 && ivalue != 1)) return false; _type = TypeBoolean; _value.asBool = (ivalue == 1); *offset += int(valueEnd - valueStart); return true; } std::string XmlRpcValue::nilToXml() const { return ""; } std::string XmlRpcValue::boolToXml() const { static std::string booleanTrueXml("1"); static std::string booleanFalseXml("0"); return _value.asBool ? booleanTrueXml : booleanFalseXml; } // Int bool XmlRpcValue::intFromXml(std::string const& valueXml, int* offset) { const char* valueStart = valueXml.c_str() + *offset; char* valueEnd; long ivalue = strtol(valueStart, &valueEnd, 10); if (valueEnd == valueStart) return false; _type = TypeInt; _value.asInt = int(ivalue); *offset += int(valueEnd - valueStart); return true; } std::string XmlRpcValue::intToXml() const { char buf[256]; snprintf(buf, sizeof(buf)-1, "%d", _value.asInt); buf[sizeof(buf)-1] = 0; return std::string(buf); } // Double bool XmlRpcValue::doubleFromXml(std::string const& valueXml, int* offset) { const char* valueStart = valueXml.c_str() + *offset; char* valueEnd; double dvalue = strtod(valueStart, &valueEnd); if (valueEnd == valueStart) return false; _type = TypeDouble; _value.asDouble = dvalue; *offset += int(valueEnd - valueStart); return true; } std::string XmlRpcValue::doubleToXml() const { char fmtbuf[256], buf[256]; snprintf(fmtbuf, sizeof(fmtbuf)-1, "%s", getDoubleFormat().c_str()); fmtbuf[sizeof(fmtbuf)-1] = 0; snprintf(buf, sizeof(buf)-1, fmtbuf, _value.asDouble); buf[sizeof(buf)-1] = 0; return std::string(buf); } // String bool XmlRpcValue::stringFromXml(std::string const& valueXml, int* offset) { size_t valueEnd = valueXml.find('<', *offset); if (valueEnd == std::string::npos) return false; // No end tag; _type = TypeString; _value.asString = new std::string(XmlRpcUtil::xmlDecode(valueXml.substr(*offset, valueEnd-*offset))); *offset += int(_value.asString->length()); return true; } std::string XmlRpcValue::stringToXml() const { return std::string("") + XmlRpcUtil::xmlEncode(*_value.asString) + std::string(""); } // DateTime (stored as a struct tm) bool XmlRpcValue::timeFromXml(std::string const& valueXml, int* offset) { size_t valueEnd = valueXml.find('<', *offset); if (valueEnd == std::string::npos) return false; // No end tag; std::string stime = valueXml.substr(*offset, valueEnd-*offset); struct tm t; if (sscanf(stime.c_str(),"%4d%2d%2dT%2d:%2d:%2d",&t.tm_year,&t.tm_mon,&t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec) != 6) return false; t.tm_year -= 1900; // years since 1900 t.tm_mon -= 1; // months 0..11 t.tm_isdst = -1; _type = TypeDateTime; _value.asTime = new struct tm(t); *offset += int(stime.length()); return true; } std::string XmlRpcValue::timeToXml() const { struct tm* t = _value.asTime; char buf[20]; snprintf(buf, sizeof(buf)-1, "%04d%02d%02dT%02d:%02d:%02d", 1900+t->tm_year,1+t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); buf[sizeof(buf)-1] = 0; return std::string("") + buf + std::string(""); } // Base64 bool XmlRpcValue::binaryFromXml(std::string const& valueXml, int* offset) { size_t valueEnd = valueXml.find('<', *offset); if (valueEnd == std::string::npos) return false; // No end tag; _type = TypeBase64; std::string asString = valueXml.substr(*offset, valueEnd-*offset); _value.asBinary = new BinaryData(); // check whether base64 encodings can contain chars xml encodes... // convert from base64 to binary int iostatus = 0; base64 decoder; std::back_insert_iterator ins = std::back_inserter(*(_value.asBinary)); decoder.get(asString.begin(), asString.end(), ins, iostatus); *offset += int(asString.length()); return true; } std::string XmlRpcValue::binaryToXml() const { // convert to base64 std::vector base64data; int iostatus = 0; base64 encoder; std::back_insert_iterator > ins = std::back_inserter(base64data); encoder.put(_value.asBinary->begin(), _value.asBinary->end(), ins, iostatus, base64<>::crlf()); // Wrap with xml std::string xml = ""; xml.append(base64data.begin(), base64data.end()); xml += ""; return xml; } // Array bool XmlRpcValue::arrayFromXml(std::string const& valueXml, int* offset) { bool emptyTag; if ( ! XmlRpcUtil::nextTagIs(DATA_TAG, valueXml, offset, &emptyTag)) return false; _type = TypeArray; _value.asArray = new ValueArray; if ( ! emptyTag) { XmlRpcValue v; while (v.fromXml(valueXml, offset)) _value.asArray->push_back(v); // copy... // Skip the trailing
(void) XmlRpcUtil::nextTagIsEnd(DATA_TAG, valueXml, offset); } return true; } // In general, its preferable to generate the xml of each element of the // array as it is needed rather than glomming up one big string. std::string XmlRpcValue::arrayToXml() const { std::string xml = ""; int s = int(_value.asArray->size()); for (int i=0; iat(i).toXml(); xml += ""; return xml; } // Struct bool XmlRpcValue::structFromXml(std::string const& valueXml, int* offset) { _type = TypeStruct; _value.asStruct = new ValueStruct; std::string name; bool emptyTag; while (XmlRpcUtil::nextTagIs(MEMBER_TAG, valueXml, offset, &emptyTag)) { if ( ! emptyTag) { if (XmlRpcUtil::parseTag(NAME_TAG, valueXml, offset, name)) { // value XmlRpcValue val(valueXml, offset); if ( ! val.valid()) { invalidate(); return false; } const std::pair p(name, val); _value.asStruct->insert(p); (void) XmlRpcUtil::nextTagIsEnd(MEMBER_TAG, valueXml, offset); } } } return true; } // In general, its preferable to generate the xml of each element // as it is needed rather than glomming up one big string. std::string XmlRpcValue::structToXml() const { std::string xml = ""; ValueStruct::const_iterator it; for (it=_value.asStruct->begin(); it!=_value.asStruct->end(); ++it) { xml += ""; xml += XmlRpcUtil::xmlEncode(it->first); xml += ""; xml += it->second.toXml(); xml += ""; } xml += ""; return xml; } // Write the value without xml encoding it std::ostream& XmlRpcValue::write(std::ostream& os) const { switch (_type) { default: break; case TypeBoolean: os << _value.asBool; break; case TypeInt: os << _value.asInt; break; case TypeDouble: os << _value.asDouble; break; case TypeString: os << *_value.asString; break; case TypeDateTime: { struct tm* t = _value.asTime; char buf[20]; snprintf(buf, sizeof(buf)-1, "%4d%02d%02dT%02d:%02d:%02d", t->tm_year,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); buf[sizeof(buf)-1] = 0; os << buf; break; } case TypeBase64: { int iostatus = 0; std::ostreambuf_iterator out(os); base64 encoder; encoder.put(_value.asBinary->begin(), _value.asBinary->end(), out, iostatus, base64<>::crlf()); break; } case TypeArray: { int s = int(_value.asArray->size()); os << '{'; for (int i=0; i 0) os << ','; _value.asArray->at(i).write(os); } os << '}'; break; } case TypeStruct: { os << '['; ValueStruct::const_iterator it; for (it=_value.asStruct->begin(); it!=_value.asStruct->end(); ++it) { if (it!=_value.asStruct->begin()) os << ','; os << it->first << ':'; it->second.write(os); } os << ']'; break; } } return os; } } // namespace XmlRpc // ostream std::ostream& operator<<(std::ostream& os, XmlRpc::XmlRpcValue& v) { // If you want to output in xml format: //return os << v.toXml(); return v.write(os); } fldigi-3.21.80/src/xmlrpcpp/XmlRpcClient.h0000664000175000017500000001322512313064025015216 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _XMLRPCCLIENT_H_ #define _XMLRPCCLIENT_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include "XmlRpcDispatch.h" #include "XmlRpcSource.h" namespace XmlRpc { // Arguments and results are represented by XmlRpcValues class XmlRpcValue; //! A class to send XML RPC requests to a server and return the results. class XmlRpcClient : public XmlRpcSource { public: //! Construct a client to connect to the server at the specified host:port address //! @param host The name of the remote machine hosting the server, eg "myserver.mycompany.com" //! @param port The port on the remote machine where the server is listening //! @param uri An optional string to be sent as the URI in the HTTP GET header //! Note that the host is not a URL, do not prepend "http://" or other protocol specifiers. XmlRpcClient(const char* host, int port, const char* uri=0); //! Construct a client to connect to the server at the specified host:port address including HTTP authentication //! @param host The name of the remote machine hosting the server //! @param port The port on the remote machine where the server is listening //! @param login The username passed to the server //! @param pass The password passed to the server //! @param uri An optional string to be sent as the URI in the HTTP GET header XmlRpcClient(const char* host, int port, const char* login, const char* password, const char* uri=0); //! Destructor virtual ~XmlRpcClient(); //! Execute the named procedure on the remote server. //! @param method The name of the remote procedure to execute //! @param params An array of the arguments for the method //! @param result The result value to be returned to the client //! @param timeoutSeconds Seconds to wait for a response (defaults to forever) //! @return true if the request was sent and a result received //! (although the result might be a fault). //! //! Currently this is a synchronous (blocking) implementation (execute //! does not return until it receives a response or an error). Use isFault() //! to determine whether the result is a fault response. bool execute(const char* method, XmlRpcValue const& params, XmlRpcValue& result, double timeoutSeconds = -1); //! Returns true if the result of the last execute() was a fault response. bool isFault() const { return _isFault; } //! Return the host name of the server const char* const host() const { return _host.c_str(); } //! Return the port int port() const { return _port; } //! Return the URI const char* const uri() const { return _uri.c_str(); } // XmlRpcSource interface implementation //! Close the connection virtual void close(); //! Handle server responses. Called by the event dispatcher during execute. //! @param eventType The type of event that occurred. //! @see XmlRpcDispatch::EventType virtual unsigned handleEvent(unsigned eventType); protected: // Execution processing helpers virtual bool doConnect(); virtual bool setupConnection(); virtual bool generateRequest(const char* method, XmlRpcValue const& params); virtual std::string generateHeader(std::string const& body); virtual bool writeRequest(); virtual bool readHeader(); virtual bool parseHeader(); virtual bool readResponse(); virtual bool parseResponse(XmlRpcValue& result); // Possible IO states for the connection enum ClientConnectionState { NO_CONNECTION, CONNECTING, WRITE_REQUEST, READ_HEADER, READ_RESPONSE, IDLE }; ClientConnectionState _connectionState; // Server location std::string _host; std::string _uri; int _port; // Login information for HTTP authentication std::string _login; std::string _password; // The xml-encoded request, http header of response, and response xml std::string _request; std::string _header; std::string _response; // Number of times the client has attempted to send the request int _sendAttempts; // Number of bytes of the request that have been written to the socket so far int _bytesWritten; // True if we are currently executing a request. If you want to multithread, // each thread should have its own client. bool _executing; // True if the server closed the connection bool _eof; // True if a fault response was returned by the server bool _isFault; // Number of bytes expected in the response body (parsed from response header) int _contentLength; // Event dispatcher XmlRpcDispatch _disp; }; // class XmlRpcClient } // namespace XmlRpc #endif // _XMLRPCCLIENT_H_ fldigi-3.21.80/src/xmlrpcpp/XmlRpcSource.cpp0000664000175000017500000001144612313064025015576 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "XmlRpcSource.h" #include "XmlRpcUtil.h" #if defined(_WINDOWS) # include # include #else extern "C" { # include # include } #endif #if USE_OPENSSL # include # include # include # include # include #endif namespace XmlRpc { struct SslProxy { #if USE_OPENSSL SSL_CTX* _ssl_ctx; SSL_METHOD* _ssl_meth; SSL* _ssl_ssl; #endif }; XmlRpcSource::XmlRpcSource(XmlRpcSocket::Socket fd /*= -1*/, bool deleteOnClose /*= false*/) : _fd(fd) , _deleteOnClose(deleteOnClose) , _keepOpen(false) , _sslEnabled(false) , _ssl(0) { } XmlRpcSource::~XmlRpcSource() { delete _ssl; } void XmlRpcSource::setSslEnabled(bool b /*=true*/) { #if USE_OPENSSL _sslEnabled = b; #endif } bool XmlRpcSource::doConnect() { #if USE_OPENSSL // Perform SSL if needed if (_sslEnabled) { _ssl = new SslProxy; SSLeay_add_ssl_algorithms(); _ssl->_ssl_meth = SSLv23_client_method(); SSL_load_error_strings(); _ssl->_ssl_ctx = SSL_CTX_new(_ssl->_ssl_meth); _ssl->_ssl_ssl = SSL_new(_ssl->_ssl_ctx); SSL_set_fd(_ssl->_ssl_ssl, _fd); return SSL_connect(_ssl->_ssl_ssl) == 1; } #endif return true; } // Read available text from the specified socket. Returns false on error. bool XmlRpcSource::nbRead(std::string& s, bool *eof) { const int READ_SIZE = 4096; // Number of bytes to attempt to read at a time char readBuf[READ_SIZE]; bool wouldBlock = false; *eof = false; while ( ! wouldBlock && ! *eof) { int n; #if USE_OPENSSL // Perform SSL if needed if (_ssl && _ssl->_ssl_ssl) { n = SSL_read(_ssl->_ssl_ssl, readBuf, READ_SIZE-1); } else #endif #if defined(_WINDOWS) n = recv(_fd, readBuf, READ_SIZE-1, 0); #else n = read(_fd, readBuf, READ_SIZE-1); #endif XmlRpcUtil::log(5, "XmlRpcSocket::nbRead: read/recv returned %d.", n); if (n > 0) { readBuf[n] = 0; s.append(readBuf, n); } else if (n == 0) { *eof = true; } else if (XmlRpcSocket::nonFatalError()) { wouldBlock = true; } else { return false; // Error } } return true; } // Write text to the socket. Returns false on error. bool XmlRpcSource::nbWrite(std::string const& s, int *bytesSoFar) { int nToWrite = int(s.length()) - *bytesSoFar; const char *sp = s.c_str() + *bytesSoFar; bool wouldBlock = false; while ( nToWrite > 0 && ! wouldBlock ) { int n; #if USE_OPENSSL // Perform SSL if needed if (_ssl && _ssl->_ssl_ssl) { n = SSL_write(_ssl->_ssl_ssl, sp, nToWrite); } else #endif #if defined(_WINDOWS) n = send(_fd, sp, nToWrite, 0); #else n = write(_fd, sp, nToWrite); #endif XmlRpcUtil::log(5, "XmlRpcSocket::nbWrite: send/write returned %d.", n); if (n > 0) { sp += n; *bytesSoFar += n; nToWrite -= n; } else if (XmlRpcSocket::nonFatalError()) { wouldBlock = true; } else { return false; // Error } } return true; } void XmlRpcSource::close() { #if USE_OPENSSL if (_ssl && _ssl->_ssl_ssl) { SSL_shutdown(_ssl->_ssl_ssl); // Should close be called here ? ... SSL_free(_ssl->_ssl_ssl); SSL_CTX_free(_ssl->_ssl_ctx); delete _ssl; _ssl = 0; } #endif if ( (int)_fd != -1) { XmlRpcUtil::log(2,"XmlRpcSource::close: closing socket %d.", _fd); XmlRpcSocket::close(_fd); _fd = -1; } if (_deleteOnClose) { XmlRpcUtil::log(2,"XmlRpcSource::close: deleting this"); _deleteOnClose = false; delete this; } } } // namespace XmlRpc fldigi-3.21.80/src/xmlrpcpp/XmlRpcServerMethod.h0000664000175000017500000000406212313064025016406 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSERVERMETHOD_H_ #define _XMLRPCSERVERMETHOD_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include namespace XmlRpc { // Representation of a parameter or result value class XmlRpcValue; // The XmlRpcServer processes client requests to call RPCs class XmlRpcServer; //! Abstract class representing a single RPC method class XmlRpcServerMethod { public: //! Constructor XmlRpcServerMethod(std::string const& name, XmlRpcServer* server = 0); //! Destructor virtual ~XmlRpcServerMethod(); //! Returns the name of the method std::string& name() { return _name; } //! Execute the method. Subclasses must provide a definition for this method. virtual void execute(XmlRpcValue& params, XmlRpcValue& result) = 0; //! Returns a help string for the method. //! Subclasses should define this method if introspection is being used. virtual std::string help() { return std::string(); } protected: std::string _name; XmlRpcServer* _server; }; } // namespace XmlRpc #endif // _XMLRPCSERVERMETHOD_H_ fldigi-3.21.80/src/xmlrpcpp/XmlRpcDispatch.h0000664000175000017500000000700712313064025015540 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _XMLRPCDISPATCH_H_ #define _XMLRPCDISPATCH_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include namespace XmlRpc { // An RPC source represents a file descriptor to monitor class XmlRpcSource; //! An object which monitors file descriptors for events and performs //! callbacks when interesting events happen. class XmlRpcDispatch { public: //! Constructor XmlRpcDispatch(); ~XmlRpcDispatch(); //! Values indicating the type of events a source is interested in enum EventType { ReadableEvent = 1, //!< data available to read WritableEvent = 2, //!< connected/data can be written without blocking Exception = 4 //!< uh oh }; //! Monitor this source for the event types specified by the event mask //! and call its event handler when any of the events occur. //! @param source The source to monitor //! @param eventMask Which event types to watch for. \see EventType void addSource(XmlRpcSource* source, unsigned eventMask); //! Stop monitoring this source. //! @param source The source to stop monitoring //! The source socket is not closed. void removeSource(XmlRpcSource* source); //! Modify the types of events to watch for on this source void setSourceEvents(XmlRpcSource* source, unsigned eventMask); //! Watch current set of sources and process events for the specified //! duration (in seconds, -1 implies wait forever, or until exit is called) void work(double timeSeconds); //! Exit from work routine void exit(); //! Clear all sources from the monitored sources list. Sources are closed. void clear(); protected: //! Wait for I/O on any source, timeout, or interrupt signal. bool waitForAndProcessEvents(double timeoutSeconds); //! Returns current time in seconds since something double getTime(); // A source to monitor and what to monitor it for struct MonitoredSource { MonitoredSource(XmlRpcSource* src, unsigned mask) : _src(src), _mask(mask) {} XmlRpcSource* getSource() const { return _src; } unsigned& getMask() { return _mask; } XmlRpcSource* _src; unsigned _mask; }; // A list of sources to monitor typedef std::vector< MonitoredSource > SourceList; // Sources being monitored SourceList _sources; // When work should stop (-1 implies wait forever, or until exit is called) double _endTime; bool _doClear; bool _inWork; }; } // namespace XmlRpc #endif // _XMLRPCDISPATCH_H_ fldigi-3.21.80/src/xmlrpcpp/XmlRpcThreadedServer.h0000664000175000017500000000445512313064025016714 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _XMLRPCTHREADEDSERVER_H_ #define _XMLRPCTHREADEDSERVER_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #ifndef MAKEDEPEND # include # include #endif #include "XmlRpcMutex.h" #include "XmlRpcServer.h" #include "XmlRpcThread.h" namespace XmlRpc { //! A class to handle multiple simultaneous XML RPC requests class XmlRpcThreadedServer : public XmlRpcServer { public: //! Create a server object with a specified number of worker threads. XmlRpcThreadedServer(int nWorkers = 6) : _workers(nWorkers) {} //! Execute a request protected: //! Each client request is assigned to one worker to handle. //! Workers are executed on separate threads, and one worker may be //! responsible for dispatching events to multiple client connections. class Worker : XmlRpcRunnable { public: //! Constructor. Executes the run method in a separate thread. Worker() { _thread.setRunnable(this); _thread.start(); } //! Implement the Runnable interface void run(); protected: //! The thread this worker is running in. XmlRpcThread _thread; }; //! The worker pool std::vector _workers; //! Serialize dispatcher access XmlRpcMutex _mutex; }; // class XmlRpcThreadedServer } #endif // _XMLRPCTHREADEDSERVER_H_ fldigi-3.21.80/src/xmlrpcpp/XmlRpcMutex.h0000664000175000017500000000367212313064025015107 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _XMLRPCMUTEX_H_ #define _XMLRPCMUTEX_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif namespace XmlRpc { //! A simple platform-independent mutex API implemented for posix and windows. class XmlRpcMutex { public: //! Construct a Mutex object. XmlRpcMutex() : _pMutex(0) {} //! Destroy a Mutex object. ~XmlRpcMutex(); //! Wait for the mutex to be available and then acquire the lock. void acquire(); //! Release the mutex. void release(); //! Utility class to acquire a mutex at construction and release it when destroyed. struct AutoLock { //! Acquire the mutex at construction AutoLock(XmlRpcMutex& m) : _m(m) { _m.acquire(); } //! Release at destruction ~AutoLock() { _m.release(); } //! The mutex being held XmlRpcMutex& _m; }; private: //! Native Mutex object void* _pMutex; }; // class XmlRpcMutex } // namespace XmlRpc #endif // _XMLRPCMUTEX_H_ fldigi-3.21.80/src/xmlrpcpp/XmlRpcDispatch.cpp0000664000175000017500000001557212313064025016101 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include "XmlRpcDispatch.h" #include "XmlRpcSource.h" #include "XmlRpcUtil.h" #include #include #if defined(__FreeBSD__) # ifdef USE_FTIME # include # endif #else # include #endif // __FreeBSD__ #if defined(_WINDOWS) # include # define USE_FTIME # if defined(_MSC_VER) # define timeb _timeb # define ftime _ftime # endif #else # include #endif // _WINDOWS using namespace XmlRpc; XmlRpcDispatch::XmlRpcDispatch() { _endTime = -1.0; _doClear = false; _inWork = false; } XmlRpcDispatch::~XmlRpcDispatch() { } // Monitor this source for the specified events and call its event handler // when the event occurs void XmlRpcDispatch::addSource(XmlRpcSource* source, unsigned mask) { _sources.push_back(MonitoredSource(source, mask)); } // Stop monitoring this source. Does not close the source. void XmlRpcDispatch::removeSource(XmlRpcSource* source) { for (SourceList::iterator it=_sources.begin(); it!=_sources.end(); ++it) if (it->getSource() == source) { _sources.erase(it); break; } } // Modify the types of events to watch for on this source void XmlRpcDispatch::setSourceEvents(XmlRpcSource* source, unsigned eventMask) { for (SourceList::iterator it=_sources.begin(); it!=_sources.end(); ++it) if (it->getSource() == source) { it->getMask() = eventMask; break; } } // Watch current set of sources and process events void XmlRpcDispatch::work(double timeoutSeconds) { // Compute end time double timeNow = getTime(); _endTime = (timeoutSeconds < 0.0) ? -1.0 : (timeNow + timeoutSeconds); _doClear = false; _inWork = true; // Only work while there is something to monitor while (_sources.size() > 0) { // Wait for and dispatch events if ( ! waitForAndProcessEvents(timeoutSeconds)) { _inWork = false; return; } // Check whether to clear all sources if (_doClear) { SourceList sourcesToClose; _sources.swap(sourcesToClose); for (SourceList::iterator it=sourcesToClose.begin(); it!=sourcesToClose.end(); ++it) { XmlRpcSource *src = it->getSource(); src->close(); } _doClear = false; } // Check whether end time has passed or exit has been called if (_endTime == 0.0) // Exit { break; } else if (_endTime > 0.0) // Check for timeout { double t = getTime(); if (t > _endTime) break; // Decrement timeout by elapsed time timeoutSeconds -= (t - timeNow); if (timeoutSeconds < 0.0) timeoutSeconds = 0.0; // Shouldn't happen but its fp math... timeNow = t; } } _inWork = false; } // Exit from work routine. Presumably this will be called from // one of the source event handlers. void XmlRpcDispatch::exit() { _endTime = 0.0; // Return from work asap } // Clear all sources from the monitored sources list void XmlRpcDispatch::clear() { if (_inWork) { _doClear = true; // Finish reporting current events before clearing } else { SourceList sourcesToClose; _sources.swap(sourcesToClose); for (SourceList::iterator it=sourcesToClose.begin(); it!=sourcesToClose.end(); ++it) it->getSource()->close(); } } // Time utility- return time in seconds double XmlRpcDispatch::getTime() { #ifdef USE_FTIME struct timeb tbuff; ftime(&tbuff); return ((double) tbuff.time + ((double)tbuff.millitm / 1000.0) + ((double) tbuff.timezone * 60)); #else struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); return (tv.tv_sec + tv.tv_usec / 1000000.0); #endif /* USE_FTIME */ } // Wait for I/O on any source, timeout, or interrupt signal. bool XmlRpcDispatch::waitForAndProcessEvents(double timeoutSeconds) { // Construct the sets of descriptors we are interested in fd_set inFd, outFd, excFd; FD_ZERO(&inFd); FD_ZERO(&outFd); FD_ZERO(&excFd); XmlRpcSocket::Socket maxFd = 0; for (SourceList::iterator it=_sources.begin(); it!=_sources.end(); ++it) { XmlRpcSocket::Socket fd = it->getSource()->getfd(); if (it->getMask() & ReadableEvent) FD_SET(fd, &inFd); if (it->getMask() & WritableEvent) FD_SET(fd, &outFd); if (it->getMask() & Exception) FD_SET(fd, &excFd); if (it->getMask() && fd > maxFd) maxFd = fd; } // Check for events int nEvents; if (_endTime < 0.0) { nEvents = select(int(maxFd+1), &inFd, &outFd, &excFd, NULL); } else { struct timeval tv; tv.tv_sec = (int)floor(timeoutSeconds); tv.tv_usec = ((int)floor(1000000.0 * (timeoutSeconds-floor(timeoutSeconds)))) % 1000000; nEvents = select(int(maxFd+1), &inFd, &outFd, &excFd, &tv); } if (nEvents < 0 && errno != EINTR) { XmlRpcUtil::error("Error in XmlRpcDispatch::work: error in select (%d).", nEvents); return false; } // Process events. Copy source list to avoid invalidating iterator by removing sources. SourceList s(_sources); for (SourceList::iterator it=s.begin(); it != s.end(); ++it) { XmlRpcSource* src = it->getSource(); XmlRpcSocket::Socket fd = src->getfd(); if (fd <= maxFd) { // handleEvent is called once per event type signalled unsigned newMask = 0; int nset = 0; if (FD_ISSET(fd, &inFd)) { newMask |= src->handleEvent(ReadableEvent); ++nset; } if (FD_ISSET(fd, &outFd)) { newMask |= src->handleEvent(WritableEvent); ++nset; } if (FD_ISSET(fd, &excFd)) { newMask |= src->handleEvent(Exception); ++nset; } // Some event occurred if (nset) { // This bit is not terribly efficient if many connections are active... if (newMask) { setSourceEvents(src, newMask); } else // Stop monitoring this one { removeSource(src); if ( ! src->getKeepOpen()) src->close(); } } } } return true; } fldigi-3.21.80/src/xmlrpcpp/XmlRpcException.h0000664000175000017500000000345612313064025015743 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _XMLRPCEXCEPTION_H_ #define _XMLRPCEXCEPTION_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #ifndef MAKEDEPEND # include #endif namespace XmlRpc { //! A class representing an error. //! If server methods throw this exception, a fault response is returned //! to the client. class XmlRpcException { public: //! Constructor //! @param message A descriptive error message //! @param code An integer error code XmlRpcException(const std::string& message, int code=-1) : _message(message), _code(code) {} //! Return the error message. const std::string& getMessage() const { return _message; } //! Return the error code. int getCode() const { return _code; } private: std::string _message; int _code; }; } #endif // _XMLRPCEXCEPTION_H_ fldigi-3.21.80/src/xmlrpcpp/XmlRpcUtil.h0000664000175000017500000000620012313064025014710 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _XMLRPCUTIL_H_ #define _XMLRPCUTIL_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #if defined(_MSC_VER) # define snprintf _snprintf # define vsnprintf _vsnprintf # define strcasecmp _stricmp # define strncasecmp _strnicmp #elif defined(__BORLANDC__) # define strcasecmp stricmp # define strncasecmp strnicmp #endif namespace XmlRpc { //! Utilities for XML parsing, encoding, and decoding and message handlers. class XmlRpcUtil { public: //! Parses the specified tag. No attributes are parsed, no validation is done. //! Sets val to the contents between and , or an empty string if is found. //! Returns true if the tag is parsed. Updates offset to char after static bool parseTag(const char* tag, std::string const& xml, int* offset, std::string &val); //! Returns true if the tag is found and updates offset to the char after the tag. //! If the tag is of the form , emptyTag is set to true. static bool findTag(const char* tag, std::string const& xml, int* offset, bool* emptyTag); //! Returns true if the tag is found at the specified offset (modulo any whitespace) //! and updates offset to the char after the tag. If an empty tag is found (eg, //! ), true is returned, offset is updated to be after the close of the tag, and //! emptyTag is set to true. static bool nextTagIs(const char* tag, std::string const& xml, int* offset, bool* emptyTag); //! Passes over the next tag found at the specified offset is , //! offset is updated to be after the close of the tag. //! Will skip over all characters until < is seen. static bool nextTagIsEnd(const char* tag, std::string const& xml, int* offset); //! Convert raw text to encoded xml. static std::string xmlEncode(const std::string& raw); //! Convert encoded xml to raw text static std::string xmlDecode(const std::string& encoded); //! Dump messages somewhere static void log(int level, const char* fmt, ...); //! Dump error messages somewhere static void error(const char* fmt, ...); }; } // namespace XmlRpc #endif // _XMLRPCUTIL_H_ fldigi-3.21.80/src/xmlrpcpp/XmlRpcServer.h0000664000175000017500000001321312313064025015243 00000000000000// ---------------------------------------------------------------------------- // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSERVER_H_ #define _XMLRPCSERVER_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include #include "XmlRpcDispatch.h" #include "XmlRpcSource.h" namespace XmlRpc { // An abstract class supporting XML RPC methods class XmlRpcServerMethod; // Class representing connections to specific clients class XmlRpcServerConnection; // Class representing argument and result values class XmlRpcValue; //! A class to handle XML RPC requests class XmlRpcServer : public XmlRpcSource { public: //! Create a server object. XmlRpcServer(); //! Destructor. virtual ~XmlRpcServer(); //! Specify whether introspection is enabled or not. Default is not enabled. void enableIntrospection(bool enabled=true); //! Add a command to the RPC server void addMethod(XmlRpcServerMethod* method); //! Remove a command from the RPC server void removeMethod(XmlRpcServerMethod* method); //! Remove a command from the RPC server by name void removeMethod(const std::string& methodName); //! Look up a method by name XmlRpcServerMethod* findMethod(const std::string& name) const; //! Create a socket, bind to the specified port, and //! set it in listen mode to make it available for clients. //! @param port The port to bind and listen on (zero to choose an arbitrary port) bool bindAndListen(int port, int backlog = 5); //! Get the port number this server is listening on. int getPort(void) const; //! Process client requests for the specified time (in seconds) void work(double timeSeconds); //! Temporarily stop processing client requests and exit the work() method. void exit(); //! Close all connections with clients and the socket file descriptor void shutdown(); //! Introspection support void listMethods(XmlRpcValue& result); //! Parses the request xml, runs the method, generates the response (header+xml). //! Returns a fault response if an error occurs during method execution. virtual std::string executeRequest(std::string const& request); // XmlRpcSource interface implementation //! Handle client connection requests virtual unsigned handleEvent(unsigned eventType); //! Remove a connection from the dispatcher virtual void removeConnection(XmlRpcServerConnection*); protected: // Static data static const char METHODNAME_TAG[]; static const char PARAMS_TAG[]; static const char PARAM_TAG[]; static const std::string SYSTEM_MULTICALL; static const std::string METHODNAME; static const std::string PARAMS; static const std::string FAULTCODE; static const std::string FAULTSTRING; //! Accept a client connection request virtual void acceptConnection(); //! Create a new connection object for processing requests from a specific client. //! If the client is not authorized to connect, close the socket and return 0. virtual XmlRpcServerConnection* createConnection(XmlRpcSocket::Socket socket); //! Hand off a new connection object to a dispatcher. virtual void dispatchConnection(XmlRpcServerConnection* sc); //! Parse the methodName and parameters from the request. //! @returns the methodName std::string parseRequest(std::string const& request, XmlRpcValue& params); //! Execute a named method with the specified params. bool executeMethod(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result); //! Execute multiple calls and return the results in an array. //! System.multicall implementation bool executeMulticall(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result); //! Construct a response from the result XML. std::string generateResponse(std::string const& resultXml); //! Construct a fault response. std::string generateFaultResponse(std::string const& msg, int errorCode = -1); //! Return the appropriate headers for the response. std::string generateHeader(std::string const& body); //! Whether the introspection API is supported by this server bool _introspectionEnabled; //! Event dispatcher XmlRpcDispatch _disp; //! Collection of methods. This could be a set keyed on method name if we wanted... typedef std::map< std::string, XmlRpcServerMethod* > MethodMap; //! Registered RPC methods. MethodMap _methods; //! List all registered RPC methods (only available if introspection is enabled) XmlRpcServerMethod* _listMethods; //! Return help string for a specified method (only available if introspection is enabled) XmlRpcServerMethod* _methodHelp; }; } // namespace XmlRpc #endif //_XMLRPCSERVER_H_ fldigi-3.21.80/src/ssb/0000775000175000017500000000000012313333726011507 500000000000000fldigi-3.21.80/src/ssb/ssb.cxx0000664000175000017500000000320212313064025012730 00000000000000// ---------------------------------------------------------------------------- // ssb.cxx -- ssb modem // // Copyright (C) 2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "ssb.h" #include "modem.h" #include "digiscope.h" #include "fl_digi.h" #include "debug.h" #define ssb_bw 4 void ssb::tx_init(SoundBase *sc) { } void ssb::rx_init() { put_MODEstatus(mode); } void ssb::init() { modem::init(); rx_init(); set_scope_mode(Digiscope::BLANK); } ssb::~ssb() { } void ssb::restart() { set_bandwidth(ssb_bw); } ssb::ssb() { mode = MODE_SSB; samplerate = 8000; cap &= ~CAP_TX; restart(); } // dummy process int ssb::rx_process(const double *buf, int len) { return 0; } //===================================================================== // ssb transmit // dummy process //===================================================================== int ssb::tx_process() { return -1; } fldigi-3.21.80/src/logbook/0000775000175000017500000000000012313333727012355 500000000000000fldigi-3.21.80/src/logbook/lgbook.fl0000664000175000017500000004605512313150734014102 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0302 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include } {private local } decl {\#include } {private local } decl {\#include "flmisc.h"} {selected private local } decl {\#include "logsupport.h"} {private local } decl {\#include "pixmaps.h"} {private local } decl {\#include "flinput2.h"} {public local } decl { // Avoid 'nitems' macro collision between FreeBSD's sys/params.h and fltk's // FL/Fl_Check_Browser.H (http://www.fltk.org/str.php?L2984) \#undef nitems \#include \#define FLTK_nitems nitems \#undef nitems // ^^^ Avoid 'nitems' macro collision extern Fl_Check_Browser *chkExportBrowser; } {public local } Function {create_logbook_dialogs()} {open return_type void } { Fl_Window wExport { label {Export Setup} open xywh {168 180 675 435} type Double hide } { Fl_Group {} { label {Select Records to Export} xywh {4 4 388 400} box ENGRAVED_FRAME align 21 } { Fl_Check_Browser chkExportBrowser { xywh {13 25 370 295} } Fl_Button btnClearAll { label {Clear All} callback {btn_export_by_date->value(0); chkExportBrowser->check_none();} xywh {69 325 90 24} } Fl_Button btnCheckAll { label {Check All} callback {btn_export_by_date->value(0); chkExportBrowser->check_all();} xywh {200 325 90 24} } Fl_Input inp_export_start_date { label {Start Date} callback {cb_export_date_select();} tooltip {Start date for export} xywh {14 371 100 22} align 5 code0 {\#include "calendar.h"} code1 {inp_export_start_date->format(2);} class Fl_DateInput } Fl_Input inp_export_stop_date { label {Stop Date} callback {cb_export_date_select();} tooltip {Inclusive stop date for export} xywh {138 371 100 22} align 5 code0 {\#include "calendar.h"} code1 {inp_export_stop_date->format(2);} class Fl_DateInput } Fl_Check_Button btn_export_by_date { label {select by date} callback {cb_export_date_select();} tooltip {Enable to select date range} xywh {263 374 70 15} down_box DOWN_BOX } } Fl_Return_Button btnOK { label OK callback {wExport->hide(); Export_log();} xywh {536 408 90 24} } Fl_Button btnCancel { label Cancel callback {wExport->hide();} xywh {405 408 90 24} } Fl_Group {} { label {Select Fields to Export} open xywh {392 4 280 400} box ENGRAVED_FRAME align 21 } { Fl_Button btnClearAllFields { label {Clear All} callback {btnSelectCall->value(0); btnSelectName->value(0); btnSelectFreq->value(0); btnSelectBand->value(0); btnSelectMode->value(0); btnSelectQSOdateOn->value(0); btnSelectQSOdateOff->value(0); btnSelectTimeON->value(0); btnSelectTimeOFF->value(0); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectRSTsent->value(0); btnSelectRSTrcvd->value(0); btnSelectIOTA->value(0); btnSelectDXCC->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectITUZ->value(0); btnSelectTX_pwr->value(0); btnSelectNotes->value(0);} xywh {395 375 90 24} } Fl_Button btnCheckAllFields { label {Check All} callback {btnSelectCall->value(1); btnSelectName->value(1); btnSelectFreq->value(1); btnSelectBand->value(1); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(1); btnSelectTimeON->value(1); btnSelectTimeOFF->value(1); btnSelectQth->value(1); btnSelectLOC->value(1); btnSelectState->value(1); btnSelectProvince->value(1); btnSelectCountry->value(1); btnSelectQSLrcvd->value(1); btnSelectQSLsent->value(1); btnSelectSerialIN->value(1); btnSelectSerialOUT->value(1); btnSelectXchgIn->value(1); btnSelectMyXchg->value(1); btnSelectRSTsent->value(1); btnSelectRSTrcvd->value(1); btnSelectIOTA->value(1); btnSelectDXCC->value(1); btnSelectCNTY->value(1); btnSelectCONT->value(1); btnSelectCQZ->value(1); btnSelectITUZ->value(1); btnSelectTX_pwr->value(1); btnSelectNotes->value(1);} xywh {487 375 90 24} } Fl_Check_Button btnSelectCall { label Call xywh {402 31 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectName { label Name xywh {402 52 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectFreq { label Freq xywh {402 73 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectBand { label Band xywh {402 94 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectMode { label Mode xywh {402 115 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectQSOdateOn { label {QSO Date On} xywh {402 136 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectQSOdateOff { label {QSO Date Off} xywh {402 157 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectTimeON { label {Time ON} xywh {402 178 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectTimeOFF { label {Time OFF} xywh {402 199 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectTX_pwr { label {TX Power} xywh {402 220 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectRSTsent { label {RST sent} xywh {402 241 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectRSTrcvd { label {RST rcvd} xywh {402 262 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectQth { label Qth xywh {402 283 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectLOC { label LOC xywh {402 304 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectState { label State xywh {402 325 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectQSL_VIA { label {QSL-VIA} xywh {402 346 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectProvince { label Province xywh {533 31 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectCountry { label Country xywh {533 52 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectNotes { label Notes xywh {533 73 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectQSLrcvd { label {QSL rcvd date} xywh {533 94 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectQSLsent { label {QSL sent date} xywh {533 115 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectSerialIN { label {Serial \# in} xywh {533 136 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectSerialOUT { label {Serial \# out} xywh {533 157 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectXchgIn { label {Exchange In} xywh {533 178 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectMyXchg { label {Exchange Out} xywh {533 199 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectCNTY { label County xywh {533 220 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectCONT { label Continent xywh {533 241 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectCQZ { label CQZ xywh {533 262 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectDXCC { label DXCC xywh {533 283 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectIOTA { label IOTA xywh {533 304 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectITUZ { label ITUZ xywh {533 325 70 15} down_box DOWN_BOX } Fl_Button btnSetFieldDefaults { label Defaults callback {btnSelectCall->value(1); btnSelectName->value(1); btnSelectFreq->value(1); btnSelectBand->value(1); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(1); btnSelectTimeON->value(1); btnSelectTimeOFF->value(1); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectRSTsent->value(0); btnSelectRSTrcvd->value(1); btnSelectIOTA->value(0); btnSelectDXCC->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectITUZ->value(0); btnSelectTX_pwr->value(0); btnSelectNotes->value(0);} xywh {578 375 90 24} } } } Fl_Window dlgLogbook { label Logbook open xywh {885 64 590 510} type Double resizable visible } { Fl_Input inpDate_log { label {Date On} tooltip {Date QSO started} xywh {4 24 100 24} align 5 code0 {\#include "calendar.h"} code1 {inpDate_log->format(2);} class Fl_DateInput } Fl_Input inpTimeOn_log { label {Time On} tooltip {Time QSO started} xywh {106 24 70 24} align 5 class Fl_Input2 } Fl_Input inpCall_log { label Call tooltip {Call sign worked} xywh {178 24 100 24} align 5 class Fl_Input2 } Fl_Input inpName_log { label Name tooltip {Operator worked} xywh {280 24 166 24} align 5 class Fl_Input2 } Fl_Input inpRstR_log { label In tooltip {Rst received} xywh {448 24 36 24} align 5 class Fl_Input2 } Fl_Input inpQSLrcvddate_log { label {QSL-rcvd} tooltip {QSL received on this date} xywh {486 24 100 24} align 5 code1 {o->format(2);} class Fl_DateInput } Fl_Input inpDateOff_log { label {Date Off} tooltip {Date QSO Ended} xywh {4 68 100 24} align 5 code0 {\#include "calendar.h"} code1 {inpDateOff_log->format(2);} class Fl_DateInput } Fl_Input inpTimeOff_log { label {Time Off} tooltip {Time QSO ended} xywh {106 68 70 24} align 5 class Fl_Input2 } Fl_Input inpFreq_log { label {Freq.} tooltip {Frequency in MHz} xywh {178 68 100 24} align 5 class Fl_Input2 } Fl_Input inpMode_log { label Mode tooltip {Mode in use} xywh {280 68 127 24} align 5 class Fl_Input2 } Fl_Input inpTX_pwr_log { label Pwr tooltip {Transmit power used} xywh {410 68 36 24} align 5 class Fl_Input2 } Fl_Input inpRstS_log { label Out tooltip {Rst sent} xywh {448 68 36 24} align 5 class Fl_Input2 } Fl_Input inpQSLsentdate_log { label {QSL-sent} tooltip {QSL sent on this date} xywh {486 68 100 24} align 5 code1 {o->format(2);} class Fl_DateInput } Fl_Input inpQth_log { label Qth tooltip {City of station worked} xywh {4 112 232 24} align 5 class Fl_Input2 } Fl_Input inpState_log { label St tooltip {US state of station worked} xywh {240 112 44 24} align 5 class Fl_Input2 } Fl_Input inpVE_Prov_log { label Pr tooltip {Province of station worked} xywh {287 112 44 24} align 5 class Fl_Input2 } Fl_Input inpCountry_log { label Country tooltip {Country of station worked} xywh {334 112 166 24} align 5 class Fl_Input2 } Fl_Input inpLoc_log { label Loc tooltip {Stations grid square} xywh {506 112 80 24} align 5 class Fl_Input2 } Fl_Input inpNotes_log { label Notes tooltip {Interesting notes} xywh {4 156 300 72} type Multiline align 5 class Fl_Input2 } Fl_Input inpCNTY_log { label County tooltip County xywh {311 156 120 24} align 5 class Fl_Input2 } Fl_Input inpIOTA_log { label IOTA tooltip {Islands on the air} xywh {435 156 70 24} align 5 class Fl_Input2 } Fl_Input inpCQZ_log { label CQZ tooltip {CQ zone} xywh {516 156 70 24} align 5 class Fl_Input2 } Fl_Input inpITUZ_log { label ITUZ tooltip {ITU zone} xywh {311 204 59 24} align 5 class Fl_Input2 } Fl_Input inpCONT_log { label CONT tooltip Continent xywh {374 204 66 24} align 5 class Fl_Input2 } Fl_Input inpDXCC_log { label DXCC tooltip {DXCC designator} xywh {445 204 70 24} align 5 class Fl_Input2 } Fl_Input inpQSL_VIA_log { label {QSL-VIA} tooltip {QSL route of contacted station} xywh {518 204 70 24} align 5 class Fl_Input2 } Fl_Input inpSerNoOut_log { label {Ser out} tooltip {Contest serial \# sent} xywh {4 252 55 24} align 1 class Fl_Input2 } Fl_Input inpMyXchg_log { label {Exchange Out} tooltip {Contest exchange sent} xywh {63 252 176 24} align 1 class Fl_Input2 } Fl_Input inpSerNoIn_log { label {Ser in} tooltip {Contest serial \# received} xywh {242 252 55 24} align 1 class Fl_Input2 } Fl_Input inpXchgIn_log { label {Exchange In} tooltip {Contest exchange received} xywh {299 252 176 24} align 1 class Fl_Input2 } Fl_Input inpSearchString { label {Call Search} tooltip {Search for this callsign} xywh {481 252 105 24} align 1 class Fl_Input2 } Fl_Input txtNbrRecs_log { label Recs tooltip {\# Records in logbook} xywh {54 284 65 22} class Fl_Input2 } Fl_Button bNewSave { label New callback cb_btnNewSave tooltip {New record / Save record} xywh {135 284 75 22} shortcut 0x8004e color 50 selection_color 48 } Fl_Button bUpdateCancel { label Update callback cb_btnUpdateCancel tooltip {Update the current record} xywh {222 284 75 22} shortcut 0x80055 color 50 selection_color 48 } Fl_Button bDelete { label Delete callback cb_btnDelete tooltip {Delete the current record} xywh {310 284 75 22} shortcut 0x80044 color 50 selection_color 48 } Fl_Button bDialFreq { label Dial callback cb_btnDialFreq tooltip {Retrieve for active modem use} xywh {398 284 75 22} shortcut 0x50066 color 50 selection_color 48 } Fl_Button bSearchPrev { callback cb_search tooltip {Find previous} xywh {495 284 24 22} color 50 selection_color 48 align 16 code0 {bSearchPrev->image(new Fl_Pixmap(left_arrow_icon));} } Fl_Button bSearchNext { callback cb_search tooltip {Find next} xywh {547 284 24 22} color 50 selection_color 48 align 16 code0 {bSearchNext->image(new Fl_Pixmap(right_arrow_icon));} } Fl_Group wBrowser {open xywh {2 315 586 195} box DOWN_FRAME color 7 selection_color 15 resizable code0 {\#include "table.h"} class Table } {} } code {wBrowser->align (FL_ALIGN_TOP | FL_ALIGN_LEFT); wBrowser->addColumn (_("Date"),85); wBrowser->colcallback (0,cb_SortByDate); wBrowser->addColumn (_("Time"),47); wBrowser->addColumn (_("Callsign"),100); wBrowser->colcallback (2,cb_SortByCall); wBrowser->addColumn (_("Name"),110); wBrowser->addColumn (_("Frequency"),120); wBrowser->colcallback (4,cb_SortByFreq); wBrowser->addColumn (_("Mode"),103); wBrowser->colcallback (5,cb_SortByMode); wBrowser->addHiddenColumn ("rn"); wBrowser->allowSort(true); wBrowser->callback(cb_browser); wBrowser->when(FL_WHEN_CHANGED); wBrowser->rowSize (FL_NORMAL_SIZE); wBrowser->headerSize (FL_NORMAL_SIZE); wBrowser->allowResize (1); wBrowser->gridEnabled (0); dlgLogbook->xclass(PACKAGE_TARNAME);} {} Fl_Window wCabrillo { label {Cabrillo Setup} xywh {516 612 675 340} type Double hide } { Fl_Group {} { label {Select Records to Export} open xywh {4 4 388 305} box ENGRAVED_FRAME align 21 } { Fl_Check_Browser chkCabBrowser { xywh {13 25 370 245} } Fl_Button btnCabClearAll { label {Clear All} callback {chkCabBrowser->check_none();} xywh {69 277 110 24} } Fl_Button btnCabCheckAll { label {Check All} callback {chkCabBrowser->check_all();} xywh {200 277 110 24} } } Fl_Return_Button btnCabOK { label OK callback {wCabrillo->hide(); WriteCabrillo();} xywh {544 312 100 24} } Fl_Button btnCabCancel { label Cancel callback {wCabrillo->hide();} xywh {414 312 100 24} } Fl_Group {} { label {Select Cabrillo Contest & Fields} xywh {390 4 283 305} box ENGRAVED_FRAME align 21 } { Fl_Group cboContest { label {Contest:} callback {setContestType();} open xywh {486 41 180 20} box BORDER_BOX color 7 align 4 code0 {\#include "combo.h"} code1 {extern void setContestType();} class Fl_ComboBox } {} Fl_Check_Button btnCabCall { label Call xywh {423 75 70 16} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabFreq { label Freq xywh {423 100 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabMode { label Mode xywh {423 124 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabQSOdate { label {QSO Date} xywh {423 148 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabTimeOFF { label {Time OFF} xywh {423 172 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabRSTsent { label {RST sent} xywh {423 196 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabRSTrcvd { label {RST rcvd} xywh {423 221 70 16} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabSerialIN { label {Serial \# in} xywh {533 100 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabSerialOUT { label {Serial \# out} xywh {533 124 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabXchgIn { label {Exchange In} xywh {533 148 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabMyXchg { label {Exchange Out} xywh {533 172 70 15} down_box DOWN_BOX value 1 } Fl_Button btnCabClearAllFields { label {Clear All} callback {btnCabCall->value(0); btnCabFreq->value(0); btnCabMode->value(0); btnCabQSOdate->value(0); btnCabTimeOFF->value(0); btnCabSerialIN->value(0); btnCabSerialOUT->value(0); btnCabXchgIn->value(0); btnCabMyXchg->value(0); btnCabRSTsent->value(0); btnCabRSTrcvd->value(0);} xywh {409 277 110 24} } Fl_Button btnCabCheckAllFields { label {Check All} callback {btnCabCall->value(1); btnCabFreq->value(1); btnCabMode->value(1); btnCabQSOdate->value(1); btnCabTimeOFF->value(1); btnCabSerialIN->value(1); btnCabSerialOUT->value(1); btnCabXchgIn->value(1); btnCabMyXchg->value(1); btnCabRSTsent->value(1); btnCabRSTrcvd->value(1);} xywh {539 277 110 24} } } } } fldigi-3.21.80/src/logbook/qso_db.cxx0000664000175000017500000003454312313064025014271 00000000000000// ---------------------------------------------------------------------------- // qso_db.cxx // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Remi Chateaunaeu, 2011 // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include "qso_db.h" #include "field_def.h" #include "globals.h" #include "timeops.h" // following needed for localtime_r #include using namespace std; // class cQsoRec static int compby = COMPDATE; static bool date_off = true; bool cQsoDb::reverse = false; cQsoRec::cQsoRec() { for (int i=0;i < NUMFIELDS; i++) qsofield[i] = ""; } cQsoRec::~cQsoRec () { } void cQsoRec::clearRec () { for (int i = 0; i < NUMFIELDS; i++) qsofield[i].clear(); } int cQsoRec::validRec() { return 0; } void cQsoRec::checkBand() { size_t flen = qsofield[FREQ].length(), blen = qsofield[BAND].length(); if (flen == 0 && blen != 0) { for (size_t n = 0; n < blen; n++) qsofield[BAND][n] = tolower(qsofield[BAND][n]); qsofield[FREQ] = band_freq(qsofield[BAND].c_str()); } else if (blen == 0 && flen != 0) qsofield[BAND] = band_name(qsofield[FREQ].c_str()); } void cQsoRec::checkDateTimes() { size_t len1 = qsofield[TIME_ON].length(), len2 = qsofield[TIME_OFF].length(); if (len1 == 0 && len2 != 0) qsofield[TIME_ON] = qsofield[TIME_OFF]; else if (len1 != 0 && len2 == 0) qsofield[TIME_OFF] = qsofield[TIME_ON]; len1 = qsofield[QSO_DATE].length(); len2 = qsofield[QSO_DATE_OFF].length(); if (len1 == 0 && len2 != 0) qsofield[QSO_DATE] = qsofield[QSO_DATE_OFF]; else if (len1 != 0 && len2 == 0) qsofield[QSO_DATE_OFF] = qsofield[QSO_DATE]; } // Sets the current time, with the right format. void cQsoRec::setDateTime(bool dtOn) { time_t tmp_time = time(NULL); struct tm tmp_tm ; if (localtime_r(&tmp_time, &tmp_tm)) { char buf_date[64] ; snprintf( buf_date, sizeof(buf_date), "%04d%02d%02d", 1900 + tmp_tm.tm_year, 1 + tmp_tm.tm_mon, tmp_tm.tm_mday ); char buf_time[64] ; snprintf( buf_time, sizeof(buf_time), "%02d%02d%02d", tmp_tm.tm_hour, tmp_tm.tm_min, tmp_tm.tm_sec ); if(dtOn) { putField(QSO_DATE, buf_date); putField(TIME_ON, buf_time); } else { putField(QSO_DATE_OFF, buf_date); putField(TIME_OFF, buf_time); } } } /// It must match a specific format. Input in Hertz. void cQsoRec::setFrequency(long long freq) { double freq_dbl = freq / 1000000.0 ; char buf_freq[64]; snprintf( buf_freq, sizeof(buf_freq), "%lf", freq_dbl ); putField(FREQ, buf_freq ); } void cQsoRec::putField (int n, const char *s){ if (n < 0 || n >= NUMFIELDS) return; qsofield[n] = s; } void cQsoRec::putField (int n, const char *s, int len) { if (n < 0 || n >= NUMFIELDS) return; qsofield[n].assign(s, len); } void cQsoRec::addtoField (int n, const char *s){ if (n < 0 || n >= NUMFIELDS) return; qsofield[n].append(s); } void cQsoRec::trimFields () { size_t p; string s; for (int i = 0; i < NUMFIELDS; i++) { s = qsofield[i]; //right trim string p = s.length(); while (p && s[p-1] == ' ') { s.erase(p - 1); p = s.length(); } //left trim string p = s.length(); while (p && s[0] == ' ') { s.erase(0,1); p = s.length(); } //make all upper case if Callsign or Mode if (i == CALL || i == MODE) { for (p = 0; p < s.length(); p++) s[p] = toupper(s[p]); } qsofield[i] = s; } } const char * cQsoRec::getField (int n) const { if (n < 0 || n >= NUMFIELDS) return 0; return (qsofield[n].c_str()); } const cQsoRec &cQsoRec::operator=(const cQsoRec &right) { if (this != &right) { for (int i = 0; i < NUMFIELDS; i++) this->qsofield[i] = right.qsofield[i]; } return *this; } int compareTimes (const cQsoRec &r1, const cQsoRec &r2) { if (date_off) return r1.qsofield[TIME_OFF].compare( r2.qsofield[TIME_OFF] ); return r1.qsofield[TIME_ON].compare( r2.qsofield[TIME_ON] ); } int compareDates (const cQsoRec &r1, const cQsoRec &r2) { if (date_off) return r1.qsofield[QSO_DATE_OFF].compare( r2.qsofield[QSO_DATE_OFF] ); return r1.qsofield[QSO_DATE].compare( r2.qsofield[QSO_DATE] ); } int compareCalls (const cQsoRec &r1, const cQsoRec &r2) { int cmp = 0; const char * s1 = r1.qsofield[CALL].c_str(); const char * s2 = r2.qsofield[CALL].c_str(); const char * p1 = strpbrk (s1+1, "0123456789"); const char * p2 = strpbrk (s2+1, "0123456789"); if (p1 && p2) { cmp = (*p1 < *p2) ? -1 : (*p1 > *p2) ? 1 : 0; if (cmp == 0) { cmp = strncmp (s1, s2, max(p1 - s1, p2 - s2)); if (cmp == 0) cmp = strcmp(p1+1, p2+1); } } else cmp = strcmp(s1, s2); return cmp; } int compareModes (const cQsoRec &r1, const cQsoRec &r2) { return r1.qsofield[MODE].compare( r2.qsofield[MODE] ); } int compareFreqs (const cQsoRec &r1, const cQsoRec &r2) { double f1, f2; f1 = atof(r1.qsofield[FREQ].c_str()); f2 = atof(r2.qsofield[FREQ].c_str()); return (f1 == f2 ? 0 : f1 < f2 ? -1 : 1); } int compareqsos (const void *p1, const void *p2) { cQsoRec *r1, *r2; if (cQsoDb::reverse) { r2 = (cQsoRec *)p1; r1 = (cQsoRec *)p2; } else { r1 = (cQsoRec *)p1; r2 = (cQsoRec *)p2; } int cmp; switch (compby) { case COMPCALL : if ((cmp = compareCalls(*r1, *r2)) != 0) return cmp; if ((cmp = compareDates(*r1, *r2)) != 0) return cmp; if ((cmp = compareTimes(*r1, *r2)) != 0) return cmp; if ((cmp = compareModes(*r1, *r2)) != 0) return cmp; return compareFreqs(*r1, *r2); case COMPMODE : if ((cmp = compareModes (*r1, *r2)) != 0) return cmp; if ((cmp = compareDates(*r1, *r2)) != 0) return cmp; if ((cmp = compareTimes(*r1, *r2)) != 0) return cmp; if ((cmp = compareCalls(*r1, *r2)) != 0) return cmp; return compareFreqs(*r1, *r2); case COMPFREQ : if ((cmp = compareFreqs (*r1, *r2)) != 0) return cmp; if ((cmp = compareDates(*r1, *r2)) != 0) return cmp; if ((cmp = compareTimes(*r1, *r2)) != 0) return cmp; if ((cmp = compareCalls(*r1, *r2)) != 0) return cmp; return compareModes(*r1, *r2); case COMPDATE : default : if ((cmp = compareDates (*r1, *r2)) != 0) return cmp; if ((cmp = compareTimes(*r1, *r2)) != 0) return cmp; if ((cmp = compareCalls(*r1, *r2)) != 0) return cmp; if ((cmp = compareModes (*r1, *r2)) != 0) return cmp; return compareFreqs (*r1, *r2); } } bool cQsoRec::operator==(const cQsoRec &right) const { if (compareDates (*this, right) != 0) return false; if (compareTimes (*this, right) != 0) return false; if (compareCalls (*this, right) != 0) return false; if (compareFreqs (*this, right) != 0) return false; return true; } bool cQsoRec::operator<(const cQsoRec &right) const { if (compareDates (*this, right) > -1) return false; if (compareTimes (*this, right) > -1) return false; if (compareCalls (*this, right) > -1) return false; if (compareFreqs (*this, right) > -1) return false; return true; } static char delim_in = '\t'; static char delim_out = '\t'; static bool isVer3 = false; ostream &operator<< (ostream &output, const cQsoRec &rec) { for (int i = 0; i < EXPORT; i++) output << rec.qsofield[i].c_str() << delim_out; return output; } istream &operator>> (istream &input, cQsoRec &rec ) { static char buf[1024]; // Must be big enough for a field. for (int i = 0; i < NUMFIELDS; i++) { input.getline( buf, sizeof(buf), delim_in ); rec.qsofield[i] = buf ; } return input; } //====================================================================== // class cQsoDb #define MAXRECS 32768 #define INCRRECS 8192 cQsoDb::cQsoDb() { nbrrecs = 0; maxrecs = MAXRECS; qsorec = new cQsoRec[maxrecs]; compby = COMPDATE; dirty = 0; } cQsoDb::cQsoDb(cQsoDb *db) { nbrrecs = 0; maxrecs = db->nbrRecs(); qsorec = new cQsoRec[maxrecs]; for (int i = 0; i < maxrecs; i++) qsorec[i] = db->qsorec[i]; compby = COMPDATE; nbrrecs = maxrecs; dirty = 0; } cQsoDb::~cQsoDb() { delete [] qsorec; } void cQsoDb::deleteRecs() { delete [] qsorec; nbrrecs = 0; maxrecs = MAXRECS; qsorec = new cQsoRec[maxrecs]; dirty = 0; } void cQsoDb::clearDatabase() { deleteRecs(); } int cQsoDb::qsoFindRec(cQsoRec *rec) { for (int i = 0; i < nbrrecs; i++) if (qsorec[i] == *rec) return i; return -1; } void cQsoDb::qsoNewRec (cQsoRec *nurec) { if (nbrrecs == maxrecs) { maxrecs += INCRRECS; cQsoRec *atemp = new cQsoRec[maxrecs]; for (int i = 0; i < nbrrecs; i++) atemp[i] = qsorec[i]; delete [] qsorec; qsorec = atemp; } qsorec[nbrrecs] = *nurec; qsorec[nbrrecs].checkBand(); qsorec[nbrrecs].checkDateTimes(); nbrrecs++; } cQsoRec* cQsoDb::newrec() { if (nbrrecs == maxrecs) { maxrecs += INCRRECS; cQsoRec *atemp = new cQsoRec[maxrecs]; for (int i = 0; i < nbrrecs; i++) atemp[i] = qsorec[i]; delete [] qsorec; qsorec = atemp; } nbrrecs++; return &qsorec[nbrrecs - 1]; } void cQsoDb::qsoDelRec (int rnbr) { if (rnbr < 0 || rnbr > (nbrrecs - 1)) return; for (int i = rnbr; i < nbrrecs - 1; i++) qsorec[i] = qsorec[i+1]; nbrrecs--; qsorec[nbrrecs].clearRec(); } void cQsoDb::qsoUpdRec (int rnbr, cQsoRec *updrec) { if (rnbr < 0 || rnbr > (nbrrecs - 1)) return; qsorec[rnbr] = *updrec; qsorec[rnbr].checkBand(); return; } void cQsoDb::SortByDate (bool how) { date_off = how; compby = COMPDATE; qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); } void cQsoDb::SortByCall () { compby = COMPCALL; qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); } void cQsoDb::SortByMode () { compby = COMPMODE; qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); } void cQsoDb::SortByFreq () { compby = COMPFREQ; qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); } bool cQsoDb::qsoIsValidFile(const char *fname) { char buff[256]; ifstream inQsoFile (fname, ios::in); if (!inQsoFile) return false; inQsoFile.getline (buff, 256); if (strstr (buff, "_LOGBODUP DB") == 0) { inQsoFile.close(); return false; } inQsoFile.close(); return true; } int cQsoDb::qsoReadFile (const char *fname) { char buff[256]; ifstream inQsoFile (fname, ios::in); if (!inQsoFile) return 1; inQsoFile.getline (buff, 256); if (strstr (buff, "_LOGBODUP DB") == 0) { inQsoFile.close(); return 2; } if (strstr (buff, "_LOGBODUP DBX") == 0) // new file format delim_in = '\n'; if (strstr (buff, "3.0") != 0) isVer3 = true; cQsoRec inprec; while (inQsoFile >> inprec) qsoNewRec (&inprec); inQsoFile.close(); SortByDate(date_off); return 0; } int cQsoDb::qsoWriteFile (const char *fname) { ofstream outQsoFile (fname, ios::out); if (!outQsoFile) { printf("write failure: %s\n", fname); return 1; } outQsoFile << "_LOGBODUP DBX 3.0" << '\n'; for (int i = 0; i < nbrrecs; i++) outQsoFile << qsorec[i]; outQsoFile.close(); return 0; } const int cQsoDb::jdays[2][13] = { { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }, { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 } }; bool cQsoDb::isleapyear( int y ) const { if( y % 400 == 0 || ( y % 100 != 0 && y % 4 == 0 ) ) return true; return false; } int cQsoDb::dayofyear (int year, int mon, int mday) { return mday + jdays[isleapyear (year) ? 1 : 0][mon]; } unsigned long cQsoDb::epoch_dt (const char *szdate, const char *sztime) { unsigned long doe; int era, cent, quad, rest; int year, mon, mday; int secs; year = ((szdate[0]*10 + szdate[1])*10 + szdate[2])*10 + szdate[3]; mon = szdate[4]*10 + szdate[5]; mday = szdate[6]*10 + szdate[7]; secs = ((sztime[0]*10 + sztime[1])*60 + sztime[2]*10 + sztime[3])*60 + + sztime[4]*10 + sztime[5]; /* break down the year into 400, 100, 4, and 1 year multiples */ rest = year - 1; quad = rest / 4; rest %= 4; cent = quad / 25; quad %= 25; era = cent / 4; cent %= 4; /* set up doe */ doe = dayofyear (year, mon, mday); doe += era * (400 * 365 + 97); doe += cent * (100 * 365 + 24); doe += quad * (4 * 365 + 1); doe += rest * 365; return doe*60*60*24 + secs; } bool cQsoDb::duplicate( const char *callsign, const char *szdate, const char *sztime, unsigned int interval, bool chkdatetime, const char *freq, bool chkfreq, const char *state, bool chkstate, const char *mode, bool chkmode, const char *xchg1, bool chkxchg1 ) { int f1, f2 = 0; f1 = (int)(atof(freq)/1000.0); bool b_freqDUP = true, b_stateDUP = true, b_modeDUP = true, b_xchg1DUP = true, b_dtimeDUP = true; unsigned long datetime = epoch_dt(szdate, sztime); unsigned long qsodatetime; for (int i = 0; i < nbrrecs; i++) { if (strcasecmp(qsorec[i].getField(CALL), callsign) == 0) { // found callsign duplicate b_freqDUP = b_stateDUP = b_modeDUP = b_xchg1DUP = b_dtimeDUP = false; if (chkfreq) { f2 = (int)atof(qsorec[i].getField(FREQ)); b_freqDUP = (f1 == f2); } if (chkstate) b_stateDUP = (qsorec[i].getField(STATE)[0] == 0 && state[0] == 0) || (strcasestr(qsorec[i].getField(STATE), state) != 0); if (chkmode) b_modeDUP = (qsorec[i].getField(MODE)[0] == 0 && mode[0] == 0) || (strcasestr(qsorec[i].getField(MODE), mode) != 0); if (chkxchg1) b_xchg1DUP = (qsorec[i].getField(XCHG1)[0] == 0 && xchg1[0] == 0) || (strcasestr(qsorec[i].getField(XCHG1), xchg1) != 0); if (chkdatetime) { qsodatetime = epoch_dt ( qsorec[i].getField(QSO_DATE), qsorec[i].getField(TIME_OFF)); if ((datetime - qsodatetime) < interval*60) b_dtimeDUP = true; } if ( (!chkfreq || (chkfreq && b_freqDUP)) && (!chkstate || (chkstate && b_stateDUP)) && (!chkmode || (chkmode && b_modeDUP)) && (!chkxchg1 || (chkxchg1 && b_xchg1DUP)) && (!chkdatetime || (chkdatetime && b_dtimeDUP))) { return true; } } } return false; } fldigi-3.21.80/src/logbook/lookupcall.cxx0000664000175000017500000010436112313064025015163 00000000000000// ---------------------------------------------------------------------------- // lookupcall.cxx -- a part of fldigi // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2006-2007 // Leigh Klotz, WA5ZNU // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include "signal.h" #include #include #include #include #include #include "threads.h" #include "misc.h" #include "configuration.h" #include "lookupcall.h" #include "logsupport.h" #include "main.h" #include "confdialog.h" #include "fl_digi.h" #include "qrzlib.h" #include "trx.h" #include "xmlreader.h" #include "qrunner.h" #include "debug.h" #include "network.h" #include "locator.h" using namespace std; string qrzhost = "xml.qrz.com"; //"online.qrz.com"; string qrzSessionKey; string qrzalert; string qrzerror; string callsign; string lookup_name; string lookup_addr1; string lookup_addr2; string lookup_state; string lookup_province; string lookup_zip; string lookup_country; string lookup_born; string lookup_fname; string lookup_qth; string lookup_grid; string lookup_latd; string lookup_lond; string lookup_notes; qrz_xmlquery_t DB_XML_query = QRZXMLNONE; qrz_webquery_t DB_WEB_query = QRZWEBNONE; enum TAG { QRZ_IGNORE, QRZ_KEY, QRZ_ALERT, QRZ_ERROR, QRZ_CALL, QRZ_FNAME, QRZ_NAME, QRZ_ADDR1, QRZ_ADDR2, QRZ_STATE, QRZ_ZIP, QRZ_COUNTRY, QRZ_LATD, QRZ_LOND, QRZ_GRID, QRZ_DOB }; pthread_t* QRZ_thread = 0; pthread_mutex_t qrz_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t qrz_cond = PTHREAD_COND_INITIALIZER; static void *LOOKUP_loop(void *args); bool parseSessionKey(); bool parse_xml(); bool getSessionKey(string& sessionpage); bool QRZGetXML(string& xmlpage); int bearing(const char *, const char *); void qra(const char *, double &, double &); void QRZ_disp_result(); void QRZ_CD_query(); void Lookup_init(void); void QRZclose(void); void qthappend(string &qth, string &datum); void QRZAlert(); bool QRZLogin(string& sessionpage); void QRZquery(); void parse_html(const string& htmlpage); bool HAMCALLget(string& htmlpage); void HAMCALLquery(); void QRZ_DETAILS_query(); QRZ *qCall = 0; void print_query(const string &name, const string &s) { LOG_DEBUG("%s query:\n%s\n", name.c_str(), s.c_str()); } void print_data(const string &name, const string &s) { LOG_DEBUG("%s data:\n%s\n", name.c_str(), s.c_str()); } void clear_Lookup() { lookup_name.clear(); lookup_addr1.clear(); lookup_addr2.clear(); lookup_state.clear(); lookup_province.clear(); lookup_zip.clear(); lookup_born.clear(); lookup_fname.clear(); lookup_qth.clear(); lookup_grid.clear(); lookup_latd.clear(); lookup_lond.clear(); lookup_notes.clear(); lookup_country.clear(); } // ---------------------------------------------------------------------------- // QRZ subscription query // ---------------------------------------------------------------------------- bool parseSessionKey(const string& sessionpage) { IrrXMLReader* xml = createIrrXMLReader(new IIrrXMLStringReader(sessionpage)); TAG tag=QRZ_IGNORE; while(xml && xml->read()) { switch(xml->getNodeType()) { case EXN_TEXT: case EXN_CDATA: switch (tag) { default: break; case QRZ_KEY: qrzSessionKey = xml->getNodeData(); break; case QRZ_ALERT: qrzalert = xml->getNodeData(); break; case QRZ_ERROR: qrzerror = xml->getNodeData(); break; } break; case EXN_ELEMENT_END: tag=QRZ_IGNORE; break; case EXN_ELEMENT: { const char *nodeName = xml->getNodeName(); if (!strcmp("Key", nodeName)) tag=QRZ_KEY; else if (!strcmp("Alert", nodeName)) tag=QRZ_ALERT; else if (!strcmp("Error", nodeName)) tag=QRZ_ERROR; else tag=QRZ_IGNORE; break; } case EXN_NONE: case EXN_COMMENT: case EXN_UNKNOWN: break; } } delete xml; return true; } bool parse_xml(const string& xmlpage) { print_data("QTH.com", xmlpage); IrrXMLReader* xml = createIrrXMLReader(new IIrrXMLStringReader(xmlpage)); // If we got any result back, clear the session key so that it will be // refreshed by this response, or if not present, will be removed and we'll // know to log in next time. if (xml) { qrzSessionKey.clear(); qrzalert.clear(); qrzerror.clear(); clear_Lookup(); } TAG tag = QRZ_IGNORE; // parse the file until end reached while(xml && xml->read()) { switch(xml->getNodeType()) { case EXN_TEXT: case EXN_CDATA: switch (tag) { default: case QRZ_IGNORE: break; case QRZ_CALL: break; case QRZ_FNAME: lookup_fname = xml->getNodeData(); break; case QRZ_NAME: lookup_name = xml->getNodeData(); break; case QRZ_ADDR1: { lookup_addr1 = xml->getNodeData(); size_t apt = lookup_addr1.find("#"); if (apt != string::npos) lookup_addr1.erase(apt, lookup_addr1.length() - apt); break; } case QRZ_ADDR2: lookup_addr2 = xml->getNodeData(); break; case QRZ_STATE: lookup_state = xml->getNodeData(); break; case QRZ_ZIP: lookup_zip = xml->getNodeData(); break; case QRZ_COUNTRY: lookup_country = xml->getNodeData(); break; case QRZ_LATD: lookup_latd = xml->getNodeData(); break; case QRZ_LOND: lookup_lond = xml->getNodeData(); break; case QRZ_GRID: lookup_grid = xml->getNodeData(); break; case QRZ_ALERT: qrzalert = xml->getNodeData(); break; case QRZ_ERROR: qrzerror = xml->getNodeData(); break; case QRZ_KEY: qrzSessionKey = xml->getNodeData(); break; } break; case EXN_ELEMENT_END: tag=QRZ_IGNORE; break; case EXN_ELEMENT: { const char *nodeName = xml->getNodeName(); if (!strcmp("call", nodeName)) tag = QRZ_CALL; else if (!strcmp("fname", nodeName)) tag = QRZ_FNAME; else if (!strcmp("name", nodeName)) tag = QRZ_NAME; else if (!strcmp("addr1", nodeName)) tag = QRZ_ADDR1; else if (!strcmp("addr2", nodeName)) tag = QRZ_ADDR2; else if (!strcmp("state", nodeName)) tag = QRZ_STATE; else if (!strcmp("zip", nodeName)) tag = QRZ_ZIP; else if (!strcmp("country", nodeName)) tag = QRZ_COUNTRY; else if (!strcmp("lat", nodeName)) tag = QRZ_LATD; else if (!strcmp("lon", nodeName)) tag = QRZ_LOND; else if (!strcmp("grid", nodeName)) tag = QRZ_GRID; else if (!strcmp("dob", nodeName)) tag = QRZ_DOB; else if (!strcmp("Alert", nodeName)) tag = QRZ_ALERT; else if (!strcmp("Error", nodeName)) tag = QRZ_ERROR; else if (!strcmp("Key", nodeName)) tag = QRZ_KEY; else tag = QRZ_IGNORE; } break; case EXN_NONE: case EXN_COMMENT: case EXN_UNKNOWN: break; } } // delete the xml parser after usage delete xml; return true; } bool getSessionKey(string& sessionpage) { string detail; detail = "GET /bin/xml?username="; detail += progdefaults.QRZusername; detail += ";password="; detail += progdefaults.QRZuserpassword; detail += ";version="; detail += PACKAGE_NAME; detail += "/"; detail += PACKAGE_VERSION; detail += " HTTP/1.0\n"; detail += "Host: "; detail += qrzhost; detail += "\n"; detail += "Connection: close\n"; detail += "\n"; print_query("QRZ session key", detail); return request_reply(qrzhost, "http", detail, sessionpage, 5.0); } bool QRZGetXML(string& xmlpage) { string detail; detail = "GET /bin/xml?s="; detail += qrzSessionKey; detail += ";callsign="; detail += callsign; detail += " HTTP/1.0\n"; detail += "Host: "; detail += qrzhost; detail += "\n"; detail += "Connection: close\n"; detail += "\n"; // return request_reply(qrzhost, "http", detail, xmlpage, 5.0); print_query("QRZ data", detail); bool res = request_reply(qrzhost, "http", detail, xmlpage, 5.0); LOG_DEBUG("result = %d", res); return res; } void camel_case(string &s) { bool first_letter = true; for (size_t n = 0; n < s.length(); n++) { if (s[n] == ' ') first_letter = true; else if (first_letter) { s[n] = toupper(s[n]); first_letter = false; } else s[n] = tolower(s[n]); } } void QRZ_disp_result() { ENSURE_THREAD(FLMAIN_TID); if (lookup_fname.length() > 0) { camel_case(lookup_fname); string::size_type spacePos = lookup_fname.find(" "); // if fname is "ABC" then display "ABC" // or if fname is "A BCD" then display "A BCD" if (spacePos == string::npos || (spacePos == 1)) { inpName->value(lookup_fname.c_str()); } // if fname is "ABC Y" then display "ABC" else if (spacePos > 2) { string fname; fname.assign(lookup_fname, 0, spacePos); inpName->value(fname.c_str()); } // fname must be "ABC DEF" so display "ABC DEF" else { inpName->value(lookup_fname.c_str()); } } else if (lookup_name.length() > 0) { // only name is set; don't know first/last, so just show all inpName->value(lookup_name.c_str()); } inpQth->value(lookup_qth.c_str()); inpState->value(lookup_state.c_str()); inpVEprov->value(lookup_province.c_str()); inpLoc->value(lookup_grid.c_str()); if (!lookup_country.empty()) inpCountry->value(lookup_country.c_str()); if (!progdefaults.myLocator.empty() && !lookup_grid.empty()) { char buf[10]; buf[0] = '\0'; double distance, azimuth, lon[2], lat[2]; if (locator2longlat(&lon[0], &lat[0], progdefaults.myLocator.c_str()) == RIG_OK && locator2longlat(&lon[1], &lat[1], lookup_grid.c_str()) == RIG_OK && qrb(lon[0], lat[0], lon[1], lat[1], &distance, &azimuth) == RIG_OK) snprintf(buf, sizeof(buf), "%03.0f", round(azimuth)); inpAZ->value(buf); } inpNotes->value(lookup_notes.c_str()); } void QRZ_CD_query() { ENSURE_THREAD(QRZ_TID); char srch[20]; size_t snip; memset( srch, 0, sizeof(srch) ); strncpy( srch, callsign.c_str(), 6 ); for (size_t i = 0; i < strlen(srch); i ++ ) srch[i] = toupper(srch[i]); string notes; notes.assign(inpNotes->value()); if( qCall->FindRecord( srch ) == 1) { lookup_fname = qCall->GetFname(); camel_case(lookup_fname); snip = lookup_fname.find(' '); if (snip != string::npos) lookup_fname.erase(snip, lookup_fname.length() - snip); lookup_qth = qCall->GetCity(); lookup_state = qCall->GetState(); lookup_grid.clear(); if (progdefaults.notes_address) { if (!notes.empty()) notes.append("\n"); notes.append(lookup_fname).append(" ").append(lookup_name).append("\n"); notes.append(lookup_addr1).append("\n"); notes.append(lookup_addr2); if (!lookup_state.empty()) notes.append(", ").append(lookup_state).append(" ").append(lookup_zip); else if (!lookup_province.empty()) notes.append(", ").append(lookup_province).append(" ").append(lookup_zip); else notes.append(" ").append(lookup_country); } } else { lookup_fname.clear(); lookup_qth.clear(); lookup_grid.clear(); lookup_born.clear(); lookup_notes.append("Not found in CD database"); } REQ(QRZ_disp_result); } void Lookup_init(void) { ENSURE_THREAD(FLMAIN_TID); if (QRZ_thread) return; QRZ_thread = new pthread_t; if (pthread_create(QRZ_thread, NULL, LOOKUP_loop, NULL) != 0) { LOG_PERROR("pthread_create"); return; } MilliSleep(10); } void QRZclose(void) { ENSURE_THREAD(FLMAIN_TID); if (!QRZ_thread) return; CANCEL_THREAD(*QRZ_thread); DB_XML_query = QRZXML_EXIT; DB_WEB_query = QRZWEB_EXIT; pthread_mutex_lock(&qrz_mutex); pthread_cond_signal(&qrz_cond); pthread_mutex_unlock(&qrz_mutex); pthread_join(*QRZ_thread, NULL); delete QRZ_thread; QRZ_thread = 0; } void qthappend(string &qth, string &datum) { if (datum.empty()) return; if (!qth.empty()) qth += ", "; qth += datum; } void QRZAlert() { ENSURE_THREAD(FLMAIN_TID); string qrznote; if (!qrzalert.empty()) { qrznote.append("QRZ alert notice:\n"); qrznote.append(qrzalert); qrznote.append("\n"); qrzalert.clear(); } if (!qrzerror.empty()) { qrznote.append("QRZ error notice:\n"); qrznote.append(qrzalert); qrzerror.clear(); } string notes; notes.assign(inpNotes->value()); if (!qrznote.empty()) notes.append("\n").append(qrznote); inpNotes->value(notes.c_str()); } bool QRZLogin(string& sessionpage) { bool ok = true; if (qrzSessionKey.empty()) { ok = getSessionKey(sessionpage); if (ok) ok = parseSessionKey(sessionpage); } if (!ok) { LOG_DEBUG("failed"); REQ(QRZAlert); } return ok; } void QRZquery() { ENSURE_THREAD(QRZ_TID); bool ok = true; string qrzpage; if (qrzSessionKey.empty()) ok = QRZLogin(qrzpage); if (ok) ok = QRZGetXML(qrzpage); if (!ok) { // change to negative for MS not getting on first try if (qrzSessionKey.empty()) ok = QRZLogin(qrzpage); if (ok) ok = QRZGetXML(qrzpage); } if (ok) { parse_xml(qrzpage); if (!qrzalert.empty() || !qrzerror.empty()) REQ(QRZAlert); else { lookup_qth = lookup_addr2; if (lookup_country.find("Canada") != string::npos) { lookup_province = lookup_state; lookup_state.clear(); } string notes; notes.assign(inpNotes->value()); if (progdefaults.notes_address) { if (!notes.empty()) notes.append("\n"); notes.append(lookup_fname).append(" ").append(lookup_name).append("\n"); notes.append(lookup_addr1).append("\n"); notes.append(lookup_addr2); if (!lookup_state.empty()) notes.append(", ").append(lookup_state).append(" ").append(lookup_zip); else if (!lookup_province.empty()) notes.append(", ").append(lookup_province).append(" ").append(lookup_zip); else notes.append(" ").append(lookup_country); } lookup_notes = notes; REQ(QRZ_disp_result); } } else { qrzerror = qrzpage; REQ(QRZAlert); } } // --------------------------------------------------------------------- // HTTP:://callook.info queries // --------------------------------------------------------------------- string node_data(const string &xmlpage, const string nodename) { size_t pos1, pos2; string test; test.assign("<").append(nodename).append(">"); pos1 = xmlpage.find(test); if (pos1 == string::npos) return ""; pos1 += test.length(); test.assign(""); pos2 = xmlpage.find(test); if (pos2 == string::npos) return ""; return xmlpage.substr(pos1, pos2 - pos1); } void parse_callook(string& xmlpage) { print_data("Callook info", xmlpage); string nodestr; nodestr = node_data(xmlpage, "current"); if (nodestr.empty()) { lookup_notes = "no data from callook.info"; return; } size_t start_pos = xmlpage.find(""); if (start_pos == string::npos) return; start_pos += 10; xmlpage = xmlpage.substr(start_pos); lookup_name = node_data(xmlpage, "name"); camel_case(lookup_name); lookup_fname = lookup_name; nodestr = node_data(xmlpage, "address"); if (!nodestr.empty()) { lookup_addr1 = node_data(nodestr, "line1"); lookup_addr2 = node_data(nodestr, "line2"); } nodestr = node_data(xmlpage, "location"); if (!nodestr.empty()) { lookup_lond = node_data(nodestr, "longitude"); lookup_latd = node_data(nodestr, "latitude"); lookup_grid = node_data(nodestr, "gridsquare"); } string notes; notes.assign(inpNotes->value()); if (progdefaults.notes_address) { if (!notes.empty()) notes.append("\n"); notes.append(lookup_name).append("\n"); notes.append(lookup_addr1).append("\n"); notes.append(lookup_addr2); } lookup_notes = notes; size_t p = lookup_addr2.find(","); if (p != string::npos) { lookup_qth = lookup_addr2.substr(0, p); lookup_addr2.erase(0, p+2); p = lookup_addr2.find(" "); if (p != string::npos) lookup_state = lookup_addr2.substr(0, p); } } bool CALLOOKGetXML(string& xmlpage) { string url = string("http://callook.info/").append(callsign).append("/xml"); bool res = fetch_http(url, xmlpage, 5.0); LOG_DEBUG("result = %d", res); return res; } void CALLOOKquery() { ENSURE_THREAD(QRZ_TID); bool ok = true; string CALLOOKpage; clear_Lookup(); ok = CALLOOKGetXML(CALLOOKpage); if (!ok) // change to negative for MS not getting on first try ok = CALLOOKGetXML(CALLOOKpage); if (ok) parse_callook(CALLOOKpage); REQ(QRZ_disp_result); } // --------------------------------------------------------------------- // Hamcall specific functions // --------------------------------------------------------------------- #define HAMCALL_CALL 181 #define HAMCALL_FIRST 184 #define HAMCALL_CITY 191 #define HAMCALL_STATE 192 #define HAMCALL_GRID 202 #define HAMCALL_DOB 194 void parse_html(const string& htmlpage) { print_data("Hamcall data", htmlpage); size_t p; clear_Lookup(); if ((p = htmlpage.find(HAMCALL_FIRST)) != string::npos) { p++; while ((uchar)htmlpage[p] < 128 && p < htmlpage.length() ) lookup_fname += htmlpage[p++]; camel_case(lookup_fname); } if ((p = htmlpage.find(HAMCALL_CITY)) != string::npos) { p++; while ((uchar)htmlpage[p] < 128 && p < htmlpage.length()) lookup_qth += htmlpage[p++]; } if ((p = htmlpage.find(HAMCALL_STATE)) != string::npos) { p++; while ((uchar)htmlpage[p] < 128 && p < htmlpage.length()) lookup_state += htmlpage[p++]; } if ((p = htmlpage.find(HAMCALL_GRID)) != string::npos) { p++; while ((uchar)htmlpage[p] < 128 && p < htmlpage.length()) lookup_grid += htmlpage[p++]; } if ((p = htmlpage.find(HAMCALL_DOB)) != string::npos) { p++; lookup_notes = "DOB: "; while ((uchar)htmlpage[p] < 128 && p < htmlpage.length()) lookup_notes += htmlpage[p++]; } } bool HAMCALLget(string& htmlpage) { string url_detail; url_detail = "GET /call?username="; url_detail += progdefaults.QRZusername; url_detail += "&password="; url_detail += progdefaults.QRZuserpassword; url_detail += "&rawlookup=1&callsign="; url_detail += callsign; url_detail += "&program=fldigi-"; url_detail += VERSION; url_detail += "\r\n"; print_query("hamcall", url_detail); return request_reply("www.hamcall.net", "http", url_detail, htmlpage, 5.0); } void HAMCALLquery() { ENSURE_THREAD(QRZ_TID); string htmlpage; if (HAMCALLget(htmlpage)) parse_html(htmlpage); else lookup_notes = htmlpage; REQ(QRZ_disp_result); } // --------------------------------------------------------------------- // Hamcall specific functions // --------------------------------------------------------------------- static string HAMQTH_session_id = ""; static string HAMQTH_reply = ""; #define HAMQTH_DEBUG 1 #undef HAMQTH_DEBUG bool HAMQTH_get_session_id() { string url = ""; string retstr = ""; size_t p1 = string::npos; size_t p2 = string::npos; url.append("http://www.hamqth.com/xml.php?u=").append(progdefaults.QRZusername); url.append("&p=").append(progdefaults.QRZuserpassword); HAMQTH_session_id.clear(); if (!fetch_http(url, retstr, 5.0)) { return false; } p1 = retstr.find(""); if (p1 != string::npos) { p2 = retstr.find(""); if (p2 != string::npos) { p1 += 7; lookup_notes = retstr.substr(p1, p2 - p1); } return false; } p1 = retstr.find(""); if (p1 == string::npos) { lookup_notes = "HamQTH not available"; return false; } p2 = retstr.find(""); HAMQTH_session_id = retstr.substr(p1 + 12, p2 - p1 - 12); print_data("HamQTH session id", HAMQTH_session_id); return true; } void parse_HAMQTH_html(const string& htmlpage) { print_data("HamQth html", htmlpage); size_t p = string::npos; size_t p1 = string::npos; string tempstr; clear_Lookup(); lookup_fname.clear(); lookup_qth.clear(); lookup_state.clear(); lookup_grid.clear(); lookup_notes.clear(); lookup_country.clear(); if ((p = htmlpage.find("")) != string::npos) { p += 7; p1 = htmlpage.find("", p); if (p1 != string::npos) lookup_notes.append(htmlpage.substr(p, p1 - p)); return; } if ((p = htmlpage.find("")) != string::npos) { p += 6; p1 = htmlpage.find("", p); if (p1 != string::npos) { lookup_fname = htmlpage.substr(p, p1 - p); camel_case(lookup_fname); } } if ((p = htmlpage.find("")) != string::npos) { p += 5; p1 = htmlpage.find("", p); if (p1 != string::npos) lookup_qth = htmlpage.substr(p, p1 - p); } if ((p = htmlpage.find("")) != string::npos) { p += 9; p1 = htmlpage.find("", p); if (p1 != string::npos) { lookup_country = htmlpage.substr(p, p1 - p); if (lookup_country == "Canada") { p = htmlpage.find(""); if (p != string::npos) { p += 10; p1 = htmlpage.find("", p); if (p1 != string::npos) lookup_province = htmlpage.substr(p, p1 - p); } } } } if ((p = htmlpage.find("")) != string::npos) { p += 10; p1 = htmlpage.find("", p); if (p1 != string::npos) lookup_state = htmlpage.substr(p, p1 - p); } if ((p = htmlpage.find("")) != string::npos) { p += 6; p1 = htmlpage.find("", p); if (p1 != string::npos) lookup_grid = htmlpage.substr(p, p1 - p); } if ((p = htmlpage.find("")) != string::npos) { p += 9; p1 = htmlpage.find("", p); if (p1 != string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append("QSL via: ").append(tempstr).append("\n"); } } if (progdefaults.notes_address) { if ((p = htmlpage.find("")) != string::npos) { p += 10; p1 = htmlpage.find("", p); if (p1 != string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append(tempstr).append("\n"); } } if ((p = htmlpage.find("")) != string::npos) { p += 13; p1 = htmlpage.find("", p); if (p1 != string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append(tempstr).append("\n"); } } if ((p = htmlpage.find("")) != string::npos) { p += 10; p1 = htmlpage.find("", p); if (p1 != string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append(tempstr); if (!lookup_state.empty()) lookup_notes.append(", ").append(lookup_state); else if (!lookup_province.empty()) lookup_notes.append(", ").append(lookup_province); } } if ((p = htmlpage.find("")) != string::npos) { p += 9; p1 = htmlpage.find("", p); if (p1 != string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append(" ").append(tempstr); } } } } bool HAMQTHget(string& htmlpage) { string url = ""; bool ret; if (HAMQTH_session_id.empty()) { if (!HAMQTH_get_session_id()) { LOG_WARN("HAMQTH session id failed!"); lookup_notes = "Get session id failed!\n"; return false; } } url.append("http://www.hamqth.com/xml.php?id=").append(HAMQTH_session_id); url.append("&callsign=").append(callsign); url.append("&prg=FLDIGI"); print_query("HamQTH", url); ret = fetch_http(url, htmlpage, 5.0); size_t p = htmlpage.find(""); string tempstr = ""; if (p != string::npos ) { size_t p1 = htmlpage.find("", p); if (p1 != string::npos) { tempstr.clear(); p += 7; tempstr.assign(htmlpage.substr(p, p1 - p)); if (tempstr.find("Session does not exist or expired") != string::npos) { htmlpage.clear(); LOG_WARN("HAMQTH session id expired!"); HAMQTH_session_id.clear(); if (!HAMQTH_get_session_id()) { LOG_WARN("HAMQTH get session id failed!"); lookup_notes = "Get session id failed!\n"; htmlpage.clear(); return false; } ret = fetch_http(url, htmlpage, 5.0); } else { LOG_WARN("HAMQTH error: %s", tempstr.c_str()); htmlpage.clear(); return false; } } } #ifdef HAMQTH_DEBUG FILE *fetchit = fopen("fetchit.txt", "a"); fprintf(fetchit, "%s\n", htmlpage.c_str()); fclose(fetchit); #endif return ret; } void HAMQTHquery() { ENSURE_THREAD(QRZ_TID); string htmlpage; if (!HAMQTHget(htmlpage)) return; parse_HAMQTH_html(htmlpage); REQ(QRZ_disp_result); } // ---------------------------------------------------------------------------- void QRZ_DETAILS_query() { string qrzurl = "http://www.qrz.com/db/"; qrzurl.append(callsign); cb_mnuVisitURL(0, (void*)qrzurl.c_str()); } void HAMCALL_DETAILS_query() { string hamcallurl = "http://www.hamcall.net/call?callsign="; hamcallurl.append(callsign); cb_mnuVisitURL(0, (void*)hamcallurl.c_str()); } void HAMQTH_DETAILS_query() { string hamqthurl = "http://www.hamQTH.com/"; hamqthurl.append(callsign); cb_mnuVisitURL(0, (void*)hamqthurl.c_str()); } // ---------------------------------------------------------------------------- static void *LOOKUP_loop(void *args) { SET_THREAD_ID(QRZ_TID); SET_THREAD_CANCEL(); for (;;) { TEST_THREAD_CANCEL(); pthread_mutex_lock(&qrz_mutex); pthread_cond_wait(&qrz_cond, &qrz_mutex); pthread_mutex_unlock(&qrz_mutex); switch (DB_XML_query) { case QRZCD : QRZ_CD_query(); break; case QRZNET : QRZquery(); break; case HAMCALLNET : HAMCALLquery(); break; case CALLOOK: CALLOOKquery(); break; case HAMQTH: HAMQTHquery(); break; case QRZXML_EXIT: return NULL; default: break; } switch (DB_WEB_query) { case QRZHTML : QRZ_DETAILS_query(); break; case HAMCALLHTML : HAMCALL_DETAILS_query(); break; case HAMQTHHTML : HAMQTH_DETAILS_query(); break; case QRZWEB_EXIT: return NULL; default: break; } } return NULL; } void CALLSIGNquery() { ENSURE_THREAD(FLMAIN_TID); if (!QRZ_thread) Lookup_init(); // Filter callsign for nonsense characters (remove all but [A-Za-z0-9/]) callsign.clear(); for (const char* p = inpCall->value(); *p; p++) if (isalnum(*p) || *p == '/') callsign += *p; if (callsign.empty()) return; if (callsign != inpCall->value()) inpCall->value(callsign.c_str()); size_t slash; while ((slash = callsign.rfind('/')) != string::npos) { if (((slash+1) * 2) < callsign.length()) callsign.erase(0, slash + 1); else callsign.erase(slash); } switch (DB_XML_query = static_cast(progdefaults.QRZXML)) { case QRZNET: LOG_INFO("%s","Request sent to\nqrz.com..."); break; case HAMCALLNET: LOG_INFO("%s","Request sent to\nwww.hamcall.net..."); break; case QRZCD: if (!qCall) qCall = new QRZ( "callbkc" ); if (progdefaults.QRZchanged) { qCall->NewDBpath("callbkc"); progdefaults.QRZchanged = false; } if (!qCall->getQRZvalid()) { LOG_ERROR("%s","QRZ DB error"); DB_XML_query = QRZXMLNONE; return; } break; case CALLOOK: LOG_INFO("%s","Request sent to\nhttp://callook.info..."); break; case HAMQTH: LOG_INFO("%s","Request sent to \nhttp://hamqth.com..."); break; case QRZXMLNONE: break; default: LOG_ERROR("Bad query type %d", DB_XML_query); return; } DB_WEB_query = static_cast(progdefaults.QRZWEB); pthread_mutex_lock(&qrz_mutex); pthread_cond_signal(&qrz_cond); pthread_mutex_unlock(&qrz_mutex); } //====================================================================== // thread to support sending log entry to eQSL //====================================================================== pthread_t* EQSLthread = 0; pthread_mutex_t EQSLmutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t EQSLcond = PTHREAD_COND_INITIALIZER; static void *EQSL_loop(void *args); static void EQSL_init(void); void EQSL_close(void); void EQSL_send(); static std::string EQSL_url = ""; static std::string EQSL_xmlpage = ""; static bool EQSLEXIT = false; static void *EQSL_loop(void *args) { SET_THREAD_ID(EQSL_TID); SET_THREAD_CANCEL(); for (;;) { TEST_THREAD_CANCEL(); pthread_mutex_lock(&EQSLmutex); pthread_cond_wait(&EQSLcond, &EQSLmutex); pthread_mutex_unlock(&EQSLmutex); if (EQSLEXIT) return NULL; size_t p; if (fetch_http(EQSL_url, EQSL_xmlpage, 5.0) == -1) LOG_ERROR("%s", "eQSL not available"); else if ((p = EQSL_xmlpage.find("Error:")) != std::string::npos) { size_t p2 = EQSL_xmlpage.find('\n', p); LOG_ERROR("%s\n%s", EQSL_xmlpage.substr(p, p2 - p - 1).c_str(), EQSL_url.c_str()); } else LOG_INFO("eQSL logged %s", EQSL_url.c_str()); } return NULL; } void EQSL_close(void) { ENSURE_THREAD(FLMAIN_TID); if (!EQSLthread) return; CANCEL_THREAD(*EQSLthread); pthread_mutex_lock(&qrz_mutex); EQSLEXIT = true; pthread_cond_signal(&qrz_cond); pthread_mutex_unlock(&qrz_mutex); pthread_join(*QRZ_thread, NULL); delete QRZ_thread; QRZ_thread = 0; } static void EQSL_init(void) { ENSURE_THREAD(FLMAIN_TID); if (EQSLthread) return; EQSLthread = new pthread_t; EQSLEXIT = false; if (pthread_create(EQSLthread, NULL, EQSL_loop, NULL) != 0) { LOG_PERROR("pthread_create"); return; } MilliSleep(10); } void sendEQSL(const char *url) { ENSURE_THREAD(FLMAIN_TID); if (!EQSLthread) EQSL_init(); pthread_mutex_lock(&EQSLmutex); EQSL_url = url; pthread_cond_signal(&EQSLcond); pthread_mutex_unlock(&EQSLmutex); } // this function may be called from several places including macro // expansion and execution void makeEQSL(const char *message) { char sztemp[100]; std::string tempstr; std::string eQSL_url; std::string msg; size_t p = 0; msg = message; if (msg.empty()) msg = progdefaults.eqsl_default_message; // replace message tags {CALL}, {NAME}, {MODE} while ((p = msg.find("{CALL}")) != std::string::npos) msg.replace(p, 6, inpCall->value()); while ((p = msg.find("{NAME}")) != std::string::npos) msg.replace(p, 6, inpName->value()); while ((p = msg.find("{MODE}")) != std::string::npos) msg.replace(p, 6, mode_info[active_modem->get_mode()].adif_name); // eqsl url header eQSL_url = "http://www.eqsl.cc/qslcard/importADIF.cfm?ADIFdata=upload 2.1.9"; snprintf(sztemp, sizeof(sztemp),"%s%s", static_cast(progdefaults.eqsl_id.length()), progdefaults.eqsl_id.c_str(), static_cast(progdefaults.eqsl_pwd.length()), progdefaults.eqsl_pwd.c_str()); eQSL_url.append(sztemp); eQSL_url.append("FLDIGI"); // eqsl nickname if (!progdefaults.eqsl_nick.empty()) { snprintf(sztemp, sizeof(sztemp), "%s", static_cast(progdefaults.eqsl_nick.length()), progdefaults.eqsl_nick.c_str()); eQSL_url.append(sztemp); } // eqsl record // band tempstr = band_name(band(wf->rfcarrier())); snprintf(sztemp, sizeof(sztemp), "%s", static_cast(tempstr.length()), tempstr.c_str()); eQSL_url.append(sztemp); // call tempstr = inpCall->value(); snprintf(sztemp, sizeof(sztemp), "%s", static_cast(tempstr.length()), tempstr.c_str()); eQSL_url.append(sztemp); // mode tempstr = mode_info[active_modem->get_mode()].adif_name; // test for modes not supported by eQSL if ((tempstr.find("MFSK4") != std::string::npos) || (tempstr.find("MFSK11") != std::string::npos) || (tempstr.find("MFSK22") != std::string::npos) || (tempstr.find("MFSK31") != std::string::npos) || (tempstr.find("MFSK32") != std::string::npos) || (tempstr.find("MFSK64") != std::string::npos) ) tempstr = "MFSK16"; if ((tempstr.find("PSK250") != std::string::npos) || (tempstr.find("PSK500") != std::string::npos) || (tempstr.find("PSK125R") != std::string::npos) || (tempstr.find("PSK250R") != std::string::npos) || (tempstr.find("PSK500R") != std::string::npos)) tempstr = "PSK125"; if ((tempstr.find("QPSK250") != std::string::npos) || (tempstr.find("QPSK500") != std::string::npos) || (tempstr.find("QPSK125R") != std::string::npos) || (tempstr.find("QPSK250R") != std::string::npos) || (tempstr.find("QPSK500R") != std::string::npos)) tempstr = "QPSK125"; snprintf(sztemp, sizeof(sztemp), "%s", static_cast(tempstr.length()), tempstr.c_str()); eQSL_url.append(sztemp); // qso date if (progdefaults.eqsl_datetime_off) snprintf(sztemp, sizeof(sztemp), "%s", static_cast(sDate_on.length()), sDate_off.c_str()); else snprintf(sztemp, sizeof(sztemp), "%s", static_cast(sDate_on.length()), sDate_on.c_str()); eQSL_url.append(sztemp); // qso time if (progdefaults.eqsl_datetime_off) tempstr = inpTimeOff->value(); else tempstr = inpTimeOn->value(); snprintf(sztemp, sizeof(sztemp), "%s", static_cast(tempstr.length()), tempstr.c_str()); eQSL_url.append(sztemp); // rst sent tempstr = inpRstOut->value(); snprintf(sztemp, sizeof(sztemp), "%s", static_cast(tempstr.length()), tempstr.c_str()); eQSL_url.append(sztemp); // message if (!msg.empty()) { snprintf(sztemp, sizeof(sztemp), "%s", static_cast(msg.length()), msg.c_str()); eQSL_url.append(sztemp); } eQSL_url.append(""); tempstr.clear(); for (size_t n = 0; n < eQSL_url.length(); n++) { if (eQSL_url[n] == ' ' || eQSL_url[n] == '\n') tempstr.append("%20"); else if (eQSL_url[n] == '<') tempstr.append("%3c"); else if (eQSL_url[n] == '>') tempstr.append("%3e"); else if (eQSL_url[n] > ' ' && eQSL_url[n] <= '}') tempstr += eQSL_url[n]; } sendEQSL(tempstr.c_str()); } /// With this constructor, no need to declare the array mode_info[] in the calling program. QsoHelper::QsoHelper(int the_mode) : qso_rec( new cQsoRec ) { qso_rec->putField(MODE, mode_info[the_mode].adif_name ); } /// This saves the new record to a file and must be run in the main thread. static void QsoHelperSave(cQsoRec * qso_rec_ptr) { qsodb.qsoNewRec (qso_rec_ptr); qsodb.isdirty(0); qsodb.isdirty(0); loadBrowser(true); /// It is mandatory to do this in the main thread. TODO: Crash suspected. adifFile.writeLog (logbook_filename.c_str(), &qsodb); /// Beware that this object is created in a thread and deleted in the main one. delete qso_rec_ptr ; } /// This must be called from the main thread, according to writeLog(). QsoHelper::~QsoHelper() { qso_rec->setDateTime(true); qso_rec->setDateTime(false); qso_rec->setFrequency( wf->rfcarrier() ); REQ( QsoHelperSave, qso_rec ); // It will be deleted in the main thread. qso_rec = NULL ; } /// Adds one key-value pair to display in the ADIF file. void QsoHelper::Push( ADIF_FIELD_POS pos, const std::string & value ) { qso_rec->putField( pos, value.c_str() ); } fldigi-3.21.80/src/logbook/textio.cxx0000664000175000017500000003007512313064025014332 00000000000000// ---------------------------------------------------------------------------- // textio.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "textio.h" #include "lgbook.h" using namespace std; #ifdef __WOE32__ static const char *szEOL = "\r\n"; #else static const char *szEOL = "\n"; #endif char * cTextFile::adif_to_date( char *s) { static char date[9]; strcpy(date, " / / "); for (int i = 0; i < 2; i++) { date[i+6] = s[i+2]; date[i] = s[i+4]; date[i+3] = s[i+6]; } return date; } char * cTextFile::adif_to_time( char *s) { static char time[6]; strcpy(time, " : "); for (int i = 0; i < 2; i++) { time[i] = s[i]; time[i+3] = s[i+2]; } return time; } void cTextFile::writeCSVHeader(FILE *txtFile) { if (btnSelectQSOdateOn->value()) fprintf (txtFile, "%s", "\"DATE_ON\""); if (btnSelectQSOdateOff->value())fprintf (txtFile, "%s", ",\"DATE_OFF\""); if (btnSelectTimeON->value()) fprintf (txtFile, "%s", ",\"ON\""); if (btnSelectTimeOFF->value()) fprintf (txtFile, "%s", ",\"OFF\""); if (btnSelectCall->value()) fprintf (txtFile, "%s", ",\"CALL\""); if (btnSelectName->value()) fprintf (txtFile, "%s", ",\"NAME\""); if (btnSelectBand->value()) fprintf (txtFile, "%s", ",\"BAND\""); if (btnSelectFreq->value()) fprintf (txtFile, "%s", ",\"FREQ\""); if (btnSelectMode->value()) fprintf (txtFile, "%s", ",\"MODE\""); if (btnSelectTX_pwr->value()) fprintf (txtFile, "%s", ",\"TX_PWR\""); if (btnSelectRSTsent->value()) fprintf (txtFile, "%s", ",\"RSTSENT\""); if (btnSelectRSTrcvd->value()) fprintf (txtFile, "%s", ",\"RSTRCVD\""); if (btnSelectQth->value()) fprintf (txtFile, "%s", ",\"QTH\""); if (btnSelectState->value()) fprintf (txtFile, "%s", ",\"ST\""); if (btnSelectProvince->value()) fprintf (txtFile, "%s", ",\"PR\""); if (btnSelectCNTY->value()) fprintf (txtFile, "%s", ",\"CNTY\""); if (btnSelectCountry->value()) fprintf (txtFile, "%s", ",\"CNTRY\""); if (btnSelectDXCC->value()) fprintf (txtFile, "%s", ",\"DXCC\""); if (btnSelectIOTA->value()) fprintf (txtFile, "%s", ",\"IOTA\""); if (btnSelectCONT->value()) fprintf (txtFile, "%s", ",\"CONT\""); if (btnSelectITUZ->value()) fprintf (txtFile, "%s", ",\"ITUZ\""); if (btnSelectLOC->value()) fprintf (txtFile, "%s", ",\"GRIDSQUARE\""); if (btnSelectQSLrcvd->value()) fprintf (txtFile, "%s", ",\"QSL_RCVD\""); if (btnSelectQSLsent->value()) fprintf (txtFile, "%s", ",\"QSL_SENT\""); if (btnSelectNotes->value()) fprintf (txtFile, "%s", ",\"NOTES\""); if (btnSelectSerialIN->value()) fprintf (txtFile, "%s", ",\"SERIAL RCVD\""); if (btnSelectSerialOUT->value()) fprintf (txtFile, "%s", ",\"SERIAL_SENT\""); if (btnSelectXchgIn->value()) fprintf (txtFile, "%s", ",\"XCHG1\""); if (btnSelectMyXchg->value()) fprintf (txtFile, "%s", ",\"MYXCHG\""); fprintf (txtFile, "%s", szEOL); } int cTextFile::writeCSVFile (const char *fname, cQsoDb *db) { cQsoRec *pRec = (cQsoRec *)0; FILE *txtFile = fopen (fname, "w"); if (!txtFile) return 1; if (txtFile) { writeCSVHeader(txtFile); for (int i = 0; i < db->nbrRecs(); i++) { pRec = db->getRec(i); if (pRec->getField(EXPORT)[0] == 'E') { if (btnSelectQSOdateOn->value()) fprintf (txtFile, "\"%s\"", pRec->getField(QSO_DATE)); if (btnSelectQSOdateOff->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(QSO_DATE_OFF)); if (btnSelectTimeON->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(TIME_ON)); if (btnSelectTimeOFF->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(TIME_OFF)); if (btnSelectCall->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CALL)); if (btnSelectName->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(NAME)); if (btnSelectBand->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(BAND)); if (btnSelectFreq->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(FREQ)); if (btnSelectMode->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(MODE)); if (btnSelectTX_pwr->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(TX_PWR)); if (btnSelectRSTsent->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(RST_SENT)); if (btnSelectRSTrcvd->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(RST_RCVD)); if (btnSelectQth->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(QTH)); if (btnSelectState->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(STATE)); if (btnSelectProvince->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(VE_PROV)); if (btnSelectCNTY->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CNTY)); if (btnSelectCountry->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(COUNTRY)); if (btnSelectDXCC->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(DXCC)); if (btnSelectIOTA->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(IOTA)); if (btnSelectCONT->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CONT)); if (btnSelectITUZ->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(ITUZ)); if (btnSelectLOC->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(GRIDSQUARE)); if (btnSelectQSLrcvd->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(QSLRDATE)); if (btnSelectQSLsent->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(QSLSDATE)); if (btnSelectNotes->value()) { string temp = pRec->getField(NOTES); for (size_t n = 0; n < temp.length(); n++) if (temp[n] == '\r' || temp[n] == '\n') temp[n] = '-'; fprintf (txtFile, ",\"%s\"", temp.c_str()); } if (btnSelectSerialIN->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(SRX)); if (btnSelectSerialOUT->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(STX)); if (btnSelectXchgIn->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(XCHG1)); if (btnSelectMyXchg->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(MYXCHG)); fprintf (txtFile, "%s", szEOL); pRec->putField(EXPORT,""); db->qsoUpdRec(i, pRec); } } fclose (txtFile); } return 0; } // text file in fixed fields void cTextFile::writeTXTHeader(FILE *txtFile) { if (btnSelectQSOdateOn->value()) fprintf (txtFile, "%-10s", "DATE_ON"); if (btnSelectQSOdateOff->value())fprintf (txtFile, "%-10s", "DATE_OFF"); if (btnSelectTimeON->value()) fprintf (txtFile, "%-6s", "ON"); if (btnSelectTimeOFF->value()) fprintf (txtFile, "%-6s", "OFF"); if (btnSelectCall->value()) fprintf (txtFile, "%-10s", "CALL"); if (btnSelectName->value()) fprintf (txtFile, "%-15s", "NAME"); if (btnSelectBand->value()) fprintf (txtFile, "%-7s", "BAND"); if (btnSelectFreq->value()) fprintf (txtFile, "%-12s", "FREQ"); if (btnSelectMode->value()) fprintf (txtFile, "%-8s", "MODE"); if (btnSelectTX_pwr->value()) fprintf (txtFile, "%-8s", "TX_PWR"); if (btnSelectRSTsent->value()) fprintf (txtFile, "%-6s", "RSTX"); if (btnSelectRSTrcvd->value()) fprintf (txtFile, "%-6s", "RSTR"); if (btnSelectQth->value()) fprintf (txtFile, "%-20s", "QTH"); if (btnSelectState->value()) fprintf (txtFile, "%-5s", "ST"); if (btnSelectProvince->value()) fprintf (txtFile, "%-5s", "PR"); if (btnSelectCountry->value()) fprintf (txtFile, "%-15s", "CNTRY"); if (btnSelectCNTY->value()) fprintf (txtFile, "%-8s", "CNTY"); if (btnSelectDXCC->value()) fprintf (txtFile, "%-8s", "DXCC"); if (btnSelectIOTA->value()) fprintf (txtFile, "%-8s", "IOTA"); if (btnSelectCONT->value()) fprintf (txtFile, "%-8s", "CONT"); if (btnSelectITUZ->value()) fprintf (txtFile, "%-8s", "ITUZ"); if (btnSelectLOC->value()) fprintf (txtFile, "%-15s", "GRIDSQUARE"); if (btnSelectQSLrcvd->value()) fprintf (txtFile, "%-10s", "QSLR"); if (btnSelectQSLsent->value()) fprintf (txtFile, "%-10s", "QSLS"); if (btnSelectNotes->value()) fprintf (txtFile, "%-80s", "NOTES"); if (btnSelectSerialIN->value()) fprintf (txtFile, "%-7s", "SRX"); if (btnSelectSerialOUT->value()) fprintf (txtFile, "%-7s", "STX"); if (btnSelectXchgIn->value()) fprintf (txtFile, "%-15s", "XCHG1"); if (btnSelectMyXchg->value()) fprintf (txtFile, "%-15s", "MYXCHG"); fprintf (txtFile, "%s", szEOL); } int cTextFile::writeTXTFile (const char *fname, cQsoDb *db) { cQsoRec *pRec = (cQsoRec *)0; FILE *txtFile = fopen (fname, "w"); if (!txtFile) return 1; if (txtFile) { writeTXTHeader(txtFile); for (int i = 0; i < db->nbrRecs(); i++) { pRec = db->getRec(i); if (pRec->getField(EXPORT)[0] == 'E') { if (btnSelectQSOdateOn->value()) fprintf (txtFile, "%-10s", pRec->getField(QSO_DATE)); if (btnSelectQSOdateOff->value()) fprintf (txtFile, "%-10s", pRec->getField(QSO_DATE_OFF)); if (btnSelectTimeON->value()) fprintf (txtFile, "%-8s", pRec->getField(TIME_ON)); if (btnSelectTimeOFF->value()) fprintf (txtFile, "%-8s", pRec->getField(TIME_OFF)); if (btnSelectCall->value()) fprintf (txtFile, "%-10s", pRec->getField(CALL)); if (btnSelectName->value()) fprintf (txtFile, "%-15s", pRec->getField(NAME)); if (btnSelectBand->value()) fprintf (txtFile, "%-7s", pRec->getField(BAND)); if (btnSelectFreq->value()) fprintf (txtFile, "%-12s", pRec->getField(FREQ)); if (btnSelectMode->value()) fprintf (txtFile, "%-8s", pRec->getField(MODE)); if (btnSelectTX_pwr->value()) fprintf (txtFile, "%-8s", pRec->getField(TX_PWR)); if (btnSelectRSTsent->value()) fprintf (txtFile, "%-6s", pRec->getField(RST_SENT)); if (btnSelectRSTrcvd->value()) fprintf (txtFile, "%-6s", pRec->getField(RST_RCVD)); if (btnSelectQth->value()) fprintf (txtFile, "%-20s", pRec->getField(QTH)); if (btnSelectState->value()) fprintf (txtFile, "%-5s", pRec->getField(STATE)); if (btnSelectProvince->value()) fprintf (txtFile, "%-5s", pRec->getField(VE_PROV)); if (btnSelectCountry->value()) fprintf (txtFile, "%-15s", pRec->getField(COUNTRY)); if (btnSelectCNTY->value()) fprintf (txtFile, "%-8s", pRec->getField(CNTY)); if (btnSelectDXCC->value()) fprintf (txtFile, "%-8s", pRec->getField(DXCC)); if (btnSelectIOTA->value()) fprintf (txtFile, "%-8s", pRec->getField(IOTA)); if (btnSelectCONT->value()) fprintf (txtFile, "%-8s", pRec->getField(CONT)); if (btnSelectITUZ->value()) fprintf (txtFile, "%-8s", pRec->getField(ITUZ)); if (btnSelectLOC->value()) fprintf (txtFile, "%-15s", pRec->getField(GRIDSQUARE)); if (btnSelectQSLrcvd->value()) fprintf (txtFile, "%-10s", pRec->getField(QSLRDATE)); if (btnSelectQSLsent->value()) fprintf (txtFile, "%-10s", pRec->getField(QSLSDATE)); if (btnSelectNotes->value()) { string temp = pRec->getField(NOTES); for (size_t n = 0; n < temp.length(); n++) if (temp[n] == '\n') temp[n] = ';'; fprintf (txtFile, "%-80s", temp.c_str()); } if (btnSelectSerialIN->value()) fprintf (txtFile, "%-7s", pRec->getField(SRX)); if (btnSelectSerialOUT->value()) fprintf (txtFile, "%-7s", pRec->getField(STX)); if (btnSelectXchgIn->value()) fprintf (txtFile, "%-15s", pRec->getField(XCHG1)); if (btnSelectMyXchg->value()) fprintf (txtFile, "%-15s", pRec->getField(MYXCHG)); fprintf (txtFile, "%s", szEOL); pRec->putField(EXPORT,""); db->qsoUpdRec(i, pRec); } } fclose (txtFile); } return 0; } fldigi-3.21.80/src/logbook/lgbook.cxx0000664000175000017500000013101612313150713014270 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0302 #include "gettext.h" #include "lgbook.h" #include #include #include "flmisc.h" #include "logsupport.h" #include "pixmaps.h" Fl_Double_Window *wExport=(Fl_Double_Window *)0; Fl_Check_Browser *chkExportBrowser=(Fl_Check_Browser *)0; Fl_Button *btnClearAll=(Fl_Button *)0; static void cb_btnClearAll(Fl_Button*, void*) { btn_export_by_date->value(0); chkExportBrowser->check_none(); } Fl_Button *btnCheckAll=(Fl_Button *)0; static void cb_btnCheckAll(Fl_Button*, void*) { btn_export_by_date->value(0); chkExportBrowser->check_all(); } Fl_DateInput *inp_export_start_date=(Fl_DateInput *)0; static void cb_inp_export_start_date(Fl_DateInput*, void*) { cb_export_date_select(); } Fl_DateInput *inp_export_stop_date=(Fl_DateInput *)0; static void cb_inp_export_stop_date(Fl_DateInput*, void*) { cb_export_date_select(); } Fl_Check_Button *btn_export_by_date=(Fl_Check_Button *)0; static void cb_btn_export_by_date(Fl_Check_Button*, void*) { cb_export_date_select(); } Fl_Return_Button *btnOK=(Fl_Return_Button *)0; static void cb_btnOK(Fl_Return_Button*, void*) { wExport->hide(); Export_log(); } Fl_Button *btnCancel=(Fl_Button *)0; static void cb_btnCancel(Fl_Button*, void*) { wExport->hide(); } Fl_Button *btnClearAllFields=(Fl_Button *)0; static void cb_btnClearAllFields(Fl_Button*, void*) { btnSelectCall->value(0); btnSelectName->value(0); btnSelectFreq->value(0); btnSelectBand->value(0); btnSelectMode->value(0); btnSelectQSOdateOn->value(0); btnSelectQSOdateOff->value(0); btnSelectTimeON->value(0); btnSelectTimeOFF->value(0); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectRSTsent->value(0); btnSelectRSTrcvd->value(0); btnSelectIOTA->value(0); btnSelectDXCC->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectITUZ->value(0); btnSelectTX_pwr->value(0); btnSelectNotes->value(0); } Fl_Button *btnCheckAllFields=(Fl_Button *)0; static void cb_btnCheckAllFields(Fl_Button*, void*) { btnSelectCall->value(1); btnSelectName->value(1); btnSelectFreq->value(1); btnSelectBand->value(1); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(1); btnSelectTimeON->value(1); btnSelectTimeOFF->value(1); btnSelectQth->value(1); btnSelectLOC->value(1); btnSelectState->value(1); btnSelectProvince->value(1); btnSelectCountry->value(1); btnSelectQSLrcvd->value(1); btnSelectQSLsent->value(1); btnSelectSerialIN->value(1); btnSelectSerialOUT->value(1); btnSelectXchgIn->value(1); btnSelectMyXchg->value(1); btnSelectRSTsent->value(1); btnSelectRSTrcvd->value(1); btnSelectIOTA->value(1); btnSelectDXCC->value(1); btnSelectCNTY->value(1); btnSelectCONT->value(1); btnSelectCQZ->value(1); btnSelectITUZ->value(1); btnSelectTX_pwr->value(1); btnSelectNotes->value(1); } Fl_Check_Button *btnSelectCall=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectName=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectFreq=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectBand=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectMode=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSOdateOn=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSOdateOff=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectTimeON=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectTimeOFF=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectTX_pwr=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectRSTsent=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectRSTrcvd=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQth=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectLOC=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectState=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSL_VIA=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectProvince=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectCountry=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectNotes=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSLrcvd=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSLsent=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectSerialIN=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectSerialOUT=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectXchgIn=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectMyXchg=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectCNTY=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectCONT=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectCQZ=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectDXCC=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectIOTA=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectITUZ=(Fl_Check_Button *)0; Fl_Button *btnSetFieldDefaults=(Fl_Button *)0; static void cb_btnSetFieldDefaults(Fl_Button*, void*) { btnSelectCall->value(1); btnSelectName->value(1); btnSelectFreq->value(1); btnSelectBand->value(1); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(1); btnSelectTimeON->value(1); btnSelectTimeOFF->value(1); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectRSTsent->value(0); btnSelectRSTrcvd->value(1); btnSelectIOTA->value(0); btnSelectDXCC->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectITUZ->value(0); btnSelectTX_pwr->value(0); btnSelectNotes->value(0); } Fl_Double_Window *dlgLogbook=(Fl_Double_Window *)0; Fl_DateInput *inpDate_log=(Fl_DateInput *)0; Fl_Input2 *inpTimeOn_log=(Fl_Input2 *)0; Fl_Input2 *inpCall_log=(Fl_Input2 *)0; Fl_Input2 *inpName_log=(Fl_Input2 *)0; Fl_Input2 *inpRstR_log=(Fl_Input2 *)0; Fl_DateInput *inpQSLrcvddate_log=(Fl_DateInput *)0; Fl_DateInput *inpDateOff_log=(Fl_DateInput *)0; Fl_Input2 *inpTimeOff_log=(Fl_Input2 *)0; Fl_Input2 *inpFreq_log=(Fl_Input2 *)0; Fl_Input2 *inpMode_log=(Fl_Input2 *)0; Fl_Input2 *inpTX_pwr_log=(Fl_Input2 *)0; Fl_Input2 *inpRstS_log=(Fl_Input2 *)0; Fl_DateInput *inpQSLsentdate_log=(Fl_DateInput *)0; Fl_Input2 *inpQth_log=(Fl_Input2 *)0; Fl_Input2 *inpState_log=(Fl_Input2 *)0; Fl_Input2 *inpVE_Prov_log=(Fl_Input2 *)0; Fl_Input2 *inpCountry_log=(Fl_Input2 *)0; Fl_Input2 *inpLoc_log=(Fl_Input2 *)0; Fl_Input2 *inpNotes_log=(Fl_Input2 *)0; Fl_Input2 *inpCNTY_log=(Fl_Input2 *)0; Fl_Input2 *inpIOTA_log=(Fl_Input2 *)0; Fl_Input2 *inpCQZ_log=(Fl_Input2 *)0; Fl_Input2 *inpITUZ_log=(Fl_Input2 *)0; Fl_Input2 *inpCONT_log=(Fl_Input2 *)0; Fl_Input2 *inpDXCC_log=(Fl_Input2 *)0; Fl_Input2 *inpQSL_VIA_log=(Fl_Input2 *)0; Fl_Input2 *inpSerNoOut_log=(Fl_Input2 *)0; Fl_Input2 *inpMyXchg_log=(Fl_Input2 *)0; Fl_Input2 *inpSerNoIn_log=(Fl_Input2 *)0; Fl_Input2 *inpXchgIn_log=(Fl_Input2 *)0; Fl_Input2 *inpSearchString=(Fl_Input2 *)0; Fl_Input2 *txtNbrRecs_log=(Fl_Input2 *)0; Fl_Button *bNewSave=(Fl_Button *)0; Fl_Button *bUpdateCancel=(Fl_Button *)0; Fl_Button *bDelete=(Fl_Button *)0; Fl_Button *bDialFreq=(Fl_Button *)0; Fl_Button *bSearchPrev=(Fl_Button *)0; Fl_Button *bSearchNext=(Fl_Button *)0; Table *wBrowser=(Table *)0; Fl_Double_Window *wCabrillo=(Fl_Double_Window *)0; Fl_Check_Browser *chkCabBrowser=(Fl_Check_Browser *)0; Fl_Button *btnCabClearAll=(Fl_Button *)0; static void cb_btnCabClearAll(Fl_Button*, void*) { chkCabBrowser->check_none(); } Fl_Button *btnCabCheckAll=(Fl_Button *)0; static void cb_btnCabCheckAll(Fl_Button*, void*) { chkCabBrowser->check_all(); } Fl_Return_Button *btnCabOK=(Fl_Return_Button *)0; static void cb_btnCabOK(Fl_Return_Button*, void*) { wCabrillo->hide(); WriteCabrillo(); } Fl_Button *btnCabCancel=(Fl_Button *)0; static void cb_btnCabCancel(Fl_Button*, void*) { wCabrillo->hide(); } Fl_ComboBox *cboContest=(Fl_ComboBox *)0; static void cb_cboContest(Fl_ComboBox*, void*) { setContestType(); } Fl_Check_Button *btnCabCall=(Fl_Check_Button *)0; Fl_Check_Button *btnCabFreq=(Fl_Check_Button *)0; Fl_Check_Button *btnCabMode=(Fl_Check_Button *)0; Fl_Check_Button *btnCabQSOdate=(Fl_Check_Button *)0; Fl_Check_Button *btnCabTimeOFF=(Fl_Check_Button *)0; Fl_Check_Button *btnCabRSTsent=(Fl_Check_Button *)0; Fl_Check_Button *btnCabRSTrcvd=(Fl_Check_Button *)0; Fl_Check_Button *btnCabSerialIN=(Fl_Check_Button *)0; Fl_Check_Button *btnCabSerialOUT=(Fl_Check_Button *)0; Fl_Check_Button *btnCabXchgIn=(Fl_Check_Button *)0; Fl_Check_Button *btnCabMyXchg=(Fl_Check_Button *)0; Fl_Button *btnCabClearAllFields=(Fl_Button *)0; static void cb_btnCabClearAllFields(Fl_Button*, void*) { btnCabCall->value(0); btnCabFreq->value(0); btnCabMode->value(0); btnCabQSOdate->value(0); btnCabTimeOFF->value(0); btnCabSerialIN->value(0); btnCabSerialOUT->value(0); btnCabXchgIn->value(0); btnCabMyXchg->value(0); btnCabRSTsent->value(0); btnCabRSTrcvd->value(0); } Fl_Button *btnCabCheckAllFields=(Fl_Button *)0; static void cb_btnCabCheckAllFields(Fl_Button*, void*) { btnCabCall->value(1); btnCabFreq->value(1); btnCabMode->value(1); btnCabQSOdate->value(1); btnCabTimeOFF->value(1); btnCabSerialIN->value(1); btnCabSerialOUT->value(1); btnCabXchgIn->value(1); btnCabMyXchg->value(1); btnCabRSTsent->value(1); btnCabRSTrcvd->value(1); } void create_logbook_dialogs() { { wExport = new Fl_Double_Window(675, 435, _("Export Setup")); { Fl_Group* o = new Fl_Group(4, 4, 388, 400, _("Select Records to Export")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkExportBrowser = new Fl_Check_Browser(13, 25, 370, 295); } // Fl_Check_Browser* chkExportBrowser { btnClearAll = new Fl_Button(69, 325, 90, 24, _("Clear All")); btnClearAll->callback((Fl_Callback*)cb_btnClearAll); } // Fl_Button* btnClearAll { btnCheckAll = new Fl_Button(200, 325, 90, 24, _("Check All")); btnCheckAll->callback((Fl_Callback*)cb_btnCheckAll); } // Fl_Button* btnCheckAll { inp_export_start_date = new Fl_DateInput(14, 371, 100, 22, _("Start Date")); inp_export_start_date->tooltip(_("Start date for export")); inp_export_start_date->box(FL_DOWN_BOX); inp_export_start_date->color(FL_BACKGROUND2_COLOR); inp_export_start_date->selection_color(FL_SELECTION_COLOR); inp_export_start_date->labeltype(FL_NORMAL_LABEL); inp_export_start_date->labelfont(0); inp_export_start_date->labelsize(14); inp_export_start_date->labelcolor(FL_FOREGROUND_COLOR); inp_export_start_date->callback((Fl_Callback*)cb_inp_export_start_date); inp_export_start_date->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_export_start_date->when(FL_WHEN_RELEASE); inp_export_start_date->format(2); } // Fl_DateInput* inp_export_start_date { inp_export_stop_date = new Fl_DateInput(138, 371, 100, 22, _("Stop Date")); inp_export_stop_date->tooltip(_("Inclusive stop date for export")); inp_export_stop_date->box(FL_DOWN_BOX); inp_export_stop_date->color(FL_BACKGROUND2_COLOR); inp_export_stop_date->selection_color(FL_SELECTION_COLOR); inp_export_stop_date->labeltype(FL_NORMAL_LABEL); inp_export_stop_date->labelfont(0); inp_export_stop_date->labelsize(14); inp_export_stop_date->labelcolor(FL_FOREGROUND_COLOR); inp_export_stop_date->callback((Fl_Callback*)cb_inp_export_stop_date); inp_export_stop_date->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_export_stop_date->when(FL_WHEN_RELEASE); inp_export_stop_date->format(2); } // Fl_DateInput* inp_export_stop_date { btn_export_by_date = new Fl_Check_Button(263, 374, 70, 15, _("select by date")); btn_export_by_date->tooltip(_("Enable to select date range")); btn_export_by_date->down_box(FL_DOWN_BOX); btn_export_by_date->callback((Fl_Callback*)cb_btn_export_by_date); } // Fl_Check_Button* btn_export_by_date o->end(); } // Fl_Group* o { btnOK = new Fl_Return_Button(536, 408, 90, 24, _("OK")); btnOK->callback((Fl_Callback*)cb_btnOK); } // Fl_Return_Button* btnOK { btnCancel = new Fl_Button(405, 408, 90, 24, _("Cancel")); btnCancel->callback((Fl_Callback*)cb_btnCancel); } // Fl_Button* btnCancel { Fl_Group* o = new Fl_Group(392, 4, 280, 400, _("Select Fields to Export")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnClearAllFields = new Fl_Button(395, 375, 90, 24, _("Clear All")); btnClearAllFields->callback((Fl_Callback*)cb_btnClearAllFields); } // Fl_Button* btnClearAllFields { btnCheckAllFields = new Fl_Button(487, 375, 90, 24, _("Check All")); btnCheckAllFields->callback((Fl_Callback*)cb_btnCheckAllFields); } // Fl_Button* btnCheckAllFields { btnSelectCall = new Fl_Check_Button(402, 31, 70, 15, _("Call")); btnSelectCall->down_box(FL_DOWN_BOX); btnSelectCall->value(1); } // Fl_Check_Button* btnSelectCall { btnSelectName = new Fl_Check_Button(402, 52, 70, 15, _("Name")); btnSelectName->down_box(FL_DOWN_BOX); btnSelectName->value(1); } // Fl_Check_Button* btnSelectName { btnSelectFreq = new Fl_Check_Button(402, 73, 70, 15, _("Freq")); btnSelectFreq->down_box(FL_DOWN_BOX); btnSelectFreq->value(1); } // Fl_Check_Button* btnSelectFreq { btnSelectBand = new Fl_Check_Button(402, 94, 70, 15, _("Band")); btnSelectBand->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectBand { btnSelectMode = new Fl_Check_Button(402, 115, 70, 15, _("Mode")); btnSelectMode->down_box(FL_DOWN_BOX); btnSelectMode->value(1); } // Fl_Check_Button* btnSelectMode { btnSelectQSOdateOn = new Fl_Check_Button(402, 136, 70, 15, _("QSO Date On")); btnSelectQSOdateOn->down_box(FL_DOWN_BOX); btnSelectQSOdateOn->value(1); } // Fl_Check_Button* btnSelectQSOdateOn { btnSelectQSOdateOff = new Fl_Check_Button(402, 157, 70, 15, _("QSO Date Off")); btnSelectQSOdateOff->down_box(FL_DOWN_BOX); btnSelectQSOdateOff->value(1); } // Fl_Check_Button* btnSelectQSOdateOff { btnSelectTimeON = new Fl_Check_Button(402, 178, 70, 15, _("Time ON")); btnSelectTimeON->down_box(FL_DOWN_BOX); btnSelectTimeON->value(1); } // Fl_Check_Button* btnSelectTimeON { btnSelectTimeOFF = new Fl_Check_Button(402, 199, 70, 15, _("Time OFF")); btnSelectTimeOFF->down_box(FL_DOWN_BOX); btnSelectTimeOFF->value(1); } // Fl_Check_Button* btnSelectTimeOFF { btnSelectTX_pwr = new Fl_Check_Button(402, 220, 70, 15, _("TX Power")); btnSelectTX_pwr->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectTX_pwr { btnSelectRSTsent = new Fl_Check_Button(402, 241, 70, 15, _("RST sent")); btnSelectRSTsent->down_box(FL_DOWN_BOX); btnSelectRSTsent->value(1); } // Fl_Check_Button* btnSelectRSTsent { btnSelectRSTrcvd = new Fl_Check_Button(402, 262, 70, 15, _("RST rcvd")); btnSelectRSTrcvd->down_box(FL_DOWN_BOX); btnSelectRSTrcvd->value(1); } // Fl_Check_Button* btnSelectRSTrcvd { btnSelectQth = new Fl_Check_Button(402, 283, 70, 15, _("Qth")); btnSelectQth->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectQth { btnSelectLOC = new Fl_Check_Button(402, 304, 70, 15, _("LOC")); btnSelectLOC->down_box(FL_DOWN_BOX); btnSelectLOC->value(1); } // Fl_Check_Button* btnSelectLOC { btnSelectState = new Fl_Check_Button(402, 325, 70, 15, _("State")); btnSelectState->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectState { btnSelectQSL_VIA = new Fl_Check_Button(402, 346, 70, 15, _("QSL-VIA")); btnSelectQSL_VIA->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectQSL_VIA { btnSelectProvince = new Fl_Check_Button(533, 31, 70, 15, _("Province")); btnSelectProvince->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectProvince { btnSelectCountry = new Fl_Check_Button(533, 52, 70, 15, _("Country")); btnSelectCountry->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectCountry { btnSelectNotes = new Fl_Check_Button(533, 73, 70, 15, _("Notes")); btnSelectNotes->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectNotes { btnSelectQSLrcvd = new Fl_Check_Button(533, 94, 70, 15, _("QSL rcvd date")); btnSelectQSLrcvd->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectQSLrcvd { btnSelectQSLsent = new Fl_Check_Button(533, 115, 70, 15, _("QSL sent date")); btnSelectQSLsent->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectQSLsent { btnSelectSerialIN = new Fl_Check_Button(533, 136, 70, 15, _("Serial # in")); btnSelectSerialIN->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectSerialIN { btnSelectSerialOUT = new Fl_Check_Button(533, 157, 70, 15, _("Serial # out")); btnSelectSerialOUT->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectSerialOUT { btnSelectXchgIn = new Fl_Check_Button(533, 178, 70, 15, _("Exchange In")); btnSelectXchgIn->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectXchgIn { btnSelectMyXchg = new Fl_Check_Button(533, 199, 70, 15, _("Exchange Out")); btnSelectMyXchg->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectMyXchg { btnSelectCNTY = new Fl_Check_Button(533, 220, 70, 15, _("County")); btnSelectCNTY->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectCNTY { btnSelectCONT = new Fl_Check_Button(533, 241, 70, 15, _("Continent")); btnSelectCONT->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectCONT { btnSelectCQZ = new Fl_Check_Button(533, 262, 70, 15, _("CQZ")); btnSelectCQZ->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectCQZ { btnSelectDXCC = new Fl_Check_Button(533, 283, 70, 15, _("DXCC")); btnSelectDXCC->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectDXCC { btnSelectIOTA = new Fl_Check_Button(533, 304, 70, 15, _("IOTA")); btnSelectIOTA->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectIOTA { btnSelectITUZ = new Fl_Check_Button(533, 325, 70, 15, _("ITUZ")); btnSelectITUZ->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectITUZ { btnSetFieldDefaults = new Fl_Button(578, 375, 90, 24, _("Defaults")); btnSetFieldDefaults->callback((Fl_Callback*)cb_btnSetFieldDefaults); } // Fl_Button* btnSetFieldDefaults o->end(); } // Fl_Group* o wExport->end(); } // Fl_Double_Window* wExport { dlgLogbook = new Fl_Double_Window(590, 510, _("Logbook")); { inpDate_log = new Fl_DateInput(4, 24, 100, 24, _("Date On")); inpDate_log->tooltip(_("Date QSO started")); inpDate_log->box(FL_DOWN_BOX); inpDate_log->color(FL_BACKGROUND2_COLOR); inpDate_log->selection_color(FL_SELECTION_COLOR); inpDate_log->labeltype(FL_NORMAL_LABEL); inpDate_log->labelfont(0); inpDate_log->labelsize(14); inpDate_log->labelcolor(FL_FOREGROUND_COLOR); inpDate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpDate_log->when(FL_WHEN_RELEASE); inpDate_log->format(2); } // Fl_DateInput* inpDate_log { inpTimeOn_log = new Fl_Input2(106, 24, 70, 24, _("Time On")); inpTimeOn_log->tooltip(_("Time QSO started")); inpTimeOn_log->box(FL_DOWN_BOX); inpTimeOn_log->color(FL_BACKGROUND2_COLOR); inpTimeOn_log->selection_color(FL_SELECTION_COLOR); inpTimeOn_log->labeltype(FL_NORMAL_LABEL); inpTimeOn_log->labelfont(0); inpTimeOn_log->labelsize(14); inpTimeOn_log->labelcolor(FL_FOREGROUND_COLOR); inpTimeOn_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpTimeOn_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpTimeOn_log { inpCall_log = new Fl_Input2(178, 24, 100, 24, _("Call")); inpCall_log->tooltip(_("Call sign worked")); inpCall_log->box(FL_DOWN_BOX); inpCall_log->color(FL_BACKGROUND2_COLOR); inpCall_log->selection_color(FL_SELECTION_COLOR); inpCall_log->labeltype(FL_NORMAL_LABEL); inpCall_log->labelfont(0); inpCall_log->labelsize(14); inpCall_log->labelcolor(FL_FOREGROUND_COLOR); inpCall_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCall_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCall_log { inpName_log = new Fl_Input2(280, 24, 166, 24, _("Name")); inpName_log->tooltip(_("Operator worked")); inpName_log->box(FL_DOWN_BOX); inpName_log->color(FL_BACKGROUND2_COLOR); inpName_log->selection_color(FL_SELECTION_COLOR); inpName_log->labeltype(FL_NORMAL_LABEL); inpName_log->labelfont(0); inpName_log->labelsize(14); inpName_log->labelcolor(FL_FOREGROUND_COLOR); inpName_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpName_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpName_log { inpRstR_log = new Fl_Input2(448, 24, 36, 24, _("In")); inpRstR_log->tooltip(_("Rst received")); inpRstR_log->box(FL_DOWN_BOX); inpRstR_log->color(FL_BACKGROUND2_COLOR); inpRstR_log->selection_color(FL_SELECTION_COLOR); inpRstR_log->labeltype(FL_NORMAL_LABEL); inpRstR_log->labelfont(0); inpRstR_log->labelsize(14); inpRstR_log->labelcolor(FL_FOREGROUND_COLOR); inpRstR_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpRstR_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpRstR_log { Fl_DateInput* o = inpQSLrcvddate_log = new Fl_DateInput(486, 24, 100, 24, _("QSL-rcvd")); inpQSLrcvddate_log->tooltip(_("QSL received on this date")); inpQSLrcvddate_log->box(FL_DOWN_BOX); inpQSLrcvddate_log->color(FL_BACKGROUND2_COLOR); inpQSLrcvddate_log->selection_color(FL_SELECTION_COLOR); inpQSLrcvddate_log->labeltype(FL_NORMAL_LABEL); inpQSLrcvddate_log->labelfont(0); inpQSLrcvddate_log->labelsize(14); inpQSLrcvddate_log->labelcolor(FL_FOREGROUND_COLOR); inpQSLrcvddate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpQSLrcvddate_log->when(FL_WHEN_RELEASE); o->format(2); } // Fl_DateInput* inpQSLrcvddate_log { inpDateOff_log = new Fl_DateInput(4, 68, 100, 24, _("Date Off")); inpDateOff_log->tooltip(_("Date QSO Ended")); inpDateOff_log->box(FL_DOWN_BOX); inpDateOff_log->color(FL_BACKGROUND2_COLOR); inpDateOff_log->selection_color(FL_SELECTION_COLOR); inpDateOff_log->labeltype(FL_NORMAL_LABEL); inpDateOff_log->labelfont(0); inpDateOff_log->labelsize(14); inpDateOff_log->labelcolor(FL_FOREGROUND_COLOR); inpDateOff_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpDateOff_log->when(FL_WHEN_RELEASE); inpDateOff_log->format(2); } // Fl_DateInput* inpDateOff_log { inpTimeOff_log = new Fl_Input2(106, 68, 70, 24, _("Time Off")); inpTimeOff_log->tooltip(_("Time QSO ended")); inpTimeOff_log->box(FL_DOWN_BOX); inpTimeOff_log->color(FL_BACKGROUND2_COLOR); inpTimeOff_log->selection_color(FL_SELECTION_COLOR); inpTimeOff_log->labeltype(FL_NORMAL_LABEL); inpTimeOff_log->labelfont(0); inpTimeOff_log->labelsize(14); inpTimeOff_log->labelcolor(FL_FOREGROUND_COLOR); inpTimeOff_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpTimeOff_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpTimeOff_log { inpFreq_log = new Fl_Input2(178, 68, 100, 24, _("Freq.")); inpFreq_log->tooltip(_("Frequency in MHz")); inpFreq_log->box(FL_DOWN_BOX); inpFreq_log->color(FL_BACKGROUND2_COLOR); inpFreq_log->selection_color(FL_SELECTION_COLOR); inpFreq_log->labeltype(FL_NORMAL_LABEL); inpFreq_log->labelfont(0); inpFreq_log->labelsize(14); inpFreq_log->labelcolor(FL_FOREGROUND_COLOR); inpFreq_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpFreq_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpFreq_log { inpMode_log = new Fl_Input2(280, 68, 127, 24, _("Mode")); inpMode_log->tooltip(_("Mode in use")); inpMode_log->box(FL_DOWN_BOX); inpMode_log->color(FL_BACKGROUND2_COLOR); inpMode_log->selection_color(FL_SELECTION_COLOR); inpMode_log->labeltype(FL_NORMAL_LABEL); inpMode_log->labelfont(0); inpMode_log->labelsize(14); inpMode_log->labelcolor(FL_FOREGROUND_COLOR); inpMode_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpMode_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMode_log { inpTX_pwr_log = new Fl_Input2(410, 68, 36, 24, _("Pwr")); inpTX_pwr_log->tooltip(_("Transmit power used")); inpTX_pwr_log->box(FL_DOWN_BOX); inpTX_pwr_log->color(FL_BACKGROUND2_COLOR); inpTX_pwr_log->selection_color(FL_SELECTION_COLOR); inpTX_pwr_log->labeltype(FL_NORMAL_LABEL); inpTX_pwr_log->labelfont(0); inpTX_pwr_log->labelsize(14); inpTX_pwr_log->labelcolor(FL_FOREGROUND_COLOR); inpTX_pwr_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpTX_pwr_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpTX_pwr_log { inpRstS_log = new Fl_Input2(448, 68, 36, 24, _("Out")); inpRstS_log->tooltip(_("Rst sent")); inpRstS_log->box(FL_DOWN_BOX); inpRstS_log->color(FL_BACKGROUND2_COLOR); inpRstS_log->selection_color(FL_SELECTION_COLOR); inpRstS_log->labeltype(FL_NORMAL_LABEL); inpRstS_log->labelfont(0); inpRstS_log->labelsize(14); inpRstS_log->labelcolor(FL_FOREGROUND_COLOR); inpRstS_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpRstS_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpRstS_log { Fl_DateInput* o = inpQSLsentdate_log = new Fl_DateInput(486, 68, 100, 24, _("QSL-sent")); inpQSLsentdate_log->tooltip(_("QSL sent on this date")); inpQSLsentdate_log->box(FL_DOWN_BOX); inpQSLsentdate_log->color(FL_BACKGROUND2_COLOR); inpQSLsentdate_log->selection_color(FL_SELECTION_COLOR); inpQSLsentdate_log->labeltype(FL_NORMAL_LABEL); inpQSLsentdate_log->labelfont(0); inpQSLsentdate_log->labelsize(14); inpQSLsentdate_log->labelcolor(FL_FOREGROUND_COLOR); inpQSLsentdate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpQSLsentdate_log->when(FL_WHEN_RELEASE); o->format(2); } // Fl_DateInput* inpQSLsentdate_log { inpQth_log = new Fl_Input2(4, 112, 232, 24, _("Qth")); inpQth_log->tooltip(_("City of station worked")); inpQth_log->box(FL_DOWN_BOX); inpQth_log->color(FL_BACKGROUND2_COLOR); inpQth_log->selection_color(FL_SELECTION_COLOR); inpQth_log->labeltype(FL_NORMAL_LABEL); inpQth_log->labelfont(0); inpQth_log->labelsize(14); inpQth_log->labelcolor(FL_FOREGROUND_COLOR); inpQth_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpQth_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpQth_log { inpState_log = new Fl_Input2(240, 112, 44, 24, _("St")); inpState_log->tooltip(_("US state of station worked")); inpState_log->box(FL_DOWN_BOX); inpState_log->color(FL_BACKGROUND2_COLOR); inpState_log->selection_color(FL_SELECTION_COLOR); inpState_log->labeltype(FL_NORMAL_LABEL); inpState_log->labelfont(0); inpState_log->labelsize(14); inpState_log->labelcolor(FL_FOREGROUND_COLOR); inpState_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpState_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpState_log { inpVE_Prov_log = new Fl_Input2(287, 112, 44, 24, _("Pr")); inpVE_Prov_log->tooltip(_("Province of station worked")); inpVE_Prov_log->box(FL_DOWN_BOX); inpVE_Prov_log->color(FL_BACKGROUND2_COLOR); inpVE_Prov_log->selection_color(FL_SELECTION_COLOR); inpVE_Prov_log->labeltype(FL_NORMAL_LABEL); inpVE_Prov_log->labelfont(0); inpVE_Prov_log->labelsize(14); inpVE_Prov_log->labelcolor(FL_FOREGROUND_COLOR); inpVE_Prov_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpVE_Prov_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpVE_Prov_log { inpCountry_log = new Fl_Input2(334, 112, 166, 24, _("Country")); inpCountry_log->tooltip(_("Country of station worked")); inpCountry_log->box(FL_DOWN_BOX); inpCountry_log->color(FL_BACKGROUND2_COLOR); inpCountry_log->selection_color(FL_SELECTION_COLOR); inpCountry_log->labeltype(FL_NORMAL_LABEL); inpCountry_log->labelfont(0); inpCountry_log->labelsize(14); inpCountry_log->labelcolor(FL_FOREGROUND_COLOR); inpCountry_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCountry_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCountry_log { inpLoc_log = new Fl_Input2(506, 112, 80, 24, _("Loc")); inpLoc_log->tooltip(_("Stations grid square")); inpLoc_log->box(FL_DOWN_BOX); inpLoc_log->color(FL_BACKGROUND2_COLOR); inpLoc_log->selection_color(FL_SELECTION_COLOR); inpLoc_log->labeltype(FL_NORMAL_LABEL); inpLoc_log->labelfont(0); inpLoc_log->labelsize(14); inpLoc_log->labelcolor(FL_FOREGROUND_COLOR); inpLoc_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpLoc_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpLoc_log { inpNotes_log = new Fl_Input2(4, 156, 300, 72, _("Notes")); inpNotes_log->tooltip(_("Interesting notes")); inpNotes_log->type(4); inpNotes_log->box(FL_DOWN_BOX); inpNotes_log->color(FL_BACKGROUND2_COLOR); inpNotes_log->selection_color(FL_SELECTION_COLOR); inpNotes_log->labeltype(FL_NORMAL_LABEL); inpNotes_log->labelfont(0); inpNotes_log->labelsize(14); inpNotes_log->labelcolor(FL_FOREGROUND_COLOR); inpNotes_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpNotes_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpNotes_log { inpCNTY_log = new Fl_Input2(311, 156, 120, 24, _("County")); inpCNTY_log->tooltip(_("County")); inpCNTY_log->box(FL_DOWN_BOX); inpCNTY_log->color(FL_BACKGROUND2_COLOR); inpCNTY_log->selection_color(FL_SELECTION_COLOR); inpCNTY_log->labeltype(FL_NORMAL_LABEL); inpCNTY_log->labelfont(0); inpCNTY_log->labelsize(14); inpCNTY_log->labelcolor(FL_FOREGROUND_COLOR); inpCNTY_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCNTY_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCNTY_log { inpIOTA_log = new Fl_Input2(435, 156, 70, 24, _("IOTA")); inpIOTA_log->tooltip(_("Islands on the air")); inpIOTA_log->box(FL_DOWN_BOX); inpIOTA_log->color(FL_BACKGROUND2_COLOR); inpIOTA_log->selection_color(FL_SELECTION_COLOR); inpIOTA_log->labeltype(FL_NORMAL_LABEL); inpIOTA_log->labelfont(0); inpIOTA_log->labelsize(14); inpIOTA_log->labelcolor(FL_FOREGROUND_COLOR); inpIOTA_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpIOTA_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpIOTA_log { inpCQZ_log = new Fl_Input2(516, 156, 70, 24, _("CQZ")); inpCQZ_log->tooltip(_("CQ zone")); inpCQZ_log->box(FL_DOWN_BOX); inpCQZ_log->color(FL_BACKGROUND2_COLOR); inpCQZ_log->selection_color(FL_SELECTION_COLOR); inpCQZ_log->labeltype(FL_NORMAL_LABEL); inpCQZ_log->labelfont(0); inpCQZ_log->labelsize(14); inpCQZ_log->labelcolor(FL_FOREGROUND_COLOR); inpCQZ_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCQZ_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCQZ_log { inpITUZ_log = new Fl_Input2(311, 204, 59, 24, _("ITUZ")); inpITUZ_log->tooltip(_("ITU zone")); inpITUZ_log->box(FL_DOWN_BOX); inpITUZ_log->color(FL_BACKGROUND2_COLOR); inpITUZ_log->selection_color(FL_SELECTION_COLOR); inpITUZ_log->labeltype(FL_NORMAL_LABEL); inpITUZ_log->labelfont(0); inpITUZ_log->labelsize(14); inpITUZ_log->labelcolor(FL_FOREGROUND_COLOR); inpITUZ_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpITUZ_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpITUZ_log { inpCONT_log = new Fl_Input2(374, 204, 66, 24, _("CONT")); inpCONT_log->tooltip(_("Continent")); inpCONT_log->box(FL_DOWN_BOX); inpCONT_log->color(FL_BACKGROUND2_COLOR); inpCONT_log->selection_color(FL_SELECTION_COLOR); inpCONT_log->labeltype(FL_NORMAL_LABEL); inpCONT_log->labelfont(0); inpCONT_log->labelsize(14); inpCONT_log->labelcolor(FL_FOREGROUND_COLOR); inpCONT_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCONT_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCONT_log { inpDXCC_log = new Fl_Input2(445, 204, 70, 24, _("DXCC")); inpDXCC_log->tooltip(_("DXCC designator")); inpDXCC_log->box(FL_DOWN_BOX); inpDXCC_log->color(FL_BACKGROUND2_COLOR); inpDXCC_log->selection_color(FL_SELECTION_COLOR); inpDXCC_log->labeltype(FL_NORMAL_LABEL); inpDXCC_log->labelfont(0); inpDXCC_log->labelsize(14); inpDXCC_log->labelcolor(FL_FOREGROUND_COLOR); inpDXCC_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpDXCC_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpDXCC_log { inpQSL_VIA_log = new Fl_Input2(518, 204, 70, 24, _("QSL-VIA")); inpQSL_VIA_log->tooltip(_("QSL route of contacted station")); inpQSL_VIA_log->box(FL_DOWN_BOX); inpQSL_VIA_log->color(FL_BACKGROUND2_COLOR); inpQSL_VIA_log->selection_color(FL_SELECTION_COLOR); inpQSL_VIA_log->labeltype(FL_NORMAL_LABEL); inpQSL_VIA_log->labelfont(0); inpQSL_VIA_log->labelsize(14); inpQSL_VIA_log->labelcolor(FL_FOREGROUND_COLOR); inpQSL_VIA_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpQSL_VIA_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpQSL_VIA_log { inpSerNoOut_log = new Fl_Input2(4, 252, 55, 24, _("Ser out")); inpSerNoOut_log->tooltip(_("Contest serial # sent")); inpSerNoOut_log->box(FL_DOWN_BOX); inpSerNoOut_log->color(FL_BACKGROUND2_COLOR); inpSerNoOut_log->selection_color(FL_SELECTION_COLOR); inpSerNoOut_log->labeltype(FL_NORMAL_LABEL); inpSerNoOut_log->labelfont(0); inpSerNoOut_log->labelsize(14); inpSerNoOut_log->labelcolor(FL_FOREGROUND_COLOR); inpSerNoOut_log->align(Fl_Align(FL_ALIGN_TOP)); inpSerNoOut_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpSerNoOut_log { inpMyXchg_log = new Fl_Input2(63, 252, 176, 24, _("Exchange Out")); inpMyXchg_log->tooltip(_("Contest exchange sent")); inpMyXchg_log->box(FL_DOWN_BOX); inpMyXchg_log->color(FL_BACKGROUND2_COLOR); inpMyXchg_log->selection_color(FL_SELECTION_COLOR); inpMyXchg_log->labeltype(FL_NORMAL_LABEL); inpMyXchg_log->labelfont(0); inpMyXchg_log->labelsize(14); inpMyXchg_log->labelcolor(FL_FOREGROUND_COLOR); inpMyXchg_log->align(Fl_Align(FL_ALIGN_TOP)); inpMyXchg_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMyXchg_log { inpSerNoIn_log = new Fl_Input2(242, 252, 55, 24, _("Ser in")); inpSerNoIn_log->tooltip(_("Contest serial # received")); inpSerNoIn_log->box(FL_DOWN_BOX); inpSerNoIn_log->color(FL_BACKGROUND2_COLOR); inpSerNoIn_log->selection_color(FL_SELECTION_COLOR); inpSerNoIn_log->labeltype(FL_NORMAL_LABEL); inpSerNoIn_log->labelfont(0); inpSerNoIn_log->labelsize(14); inpSerNoIn_log->labelcolor(FL_FOREGROUND_COLOR); inpSerNoIn_log->align(Fl_Align(FL_ALIGN_TOP)); inpSerNoIn_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpSerNoIn_log { inpXchgIn_log = new Fl_Input2(299, 252, 176, 24, _("Exchange In")); inpXchgIn_log->tooltip(_("Contest exchange received")); inpXchgIn_log->box(FL_DOWN_BOX); inpXchgIn_log->color(FL_BACKGROUND2_COLOR); inpXchgIn_log->selection_color(FL_SELECTION_COLOR); inpXchgIn_log->labeltype(FL_NORMAL_LABEL); inpXchgIn_log->labelfont(0); inpXchgIn_log->labelsize(14); inpXchgIn_log->labelcolor(FL_FOREGROUND_COLOR); inpXchgIn_log->align(Fl_Align(FL_ALIGN_TOP)); inpXchgIn_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpXchgIn_log { inpSearchString = new Fl_Input2(481, 252, 105, 24, _("Call Search")); inpSearchString->tooltip(_("Search for this callsign")); inpSearchString->box(FL_DOWN_BOX); inpSearchString->color(FL_BACKGROUND2_COLOR); inpSearchString->selection_color(FL_SELECTION_COLOR); inpSearchString->labeltype(FL_NORMAL_LABEL); inpSearchString->labelfont(0); inpSearchString->labelsize(14); inpSearchString->labelcolor(FL_FOREGROUND_COLOR); inpSearchString->align(Fl_Align(FL_ALIGN_TOP)); inpSearchString->when(FL_WHEN_RELEASE); } // Fl_Input2* inpSearchString { txtNbrRecs_log = new Fl_Input2(54, 284, 65, 22, _("Recs")); txtNbrRecs_log->tooltip(_("# Records in logbook")); txtNbrRecs_log->box(FL_DOWN_BOX); txtNbrRecs_log->color(FL_BACKGROUND2_COLOR); txtNbrRecs_log->selection_color(FL_SELECTION_COLOR); txtNbrRecs_log->labeltype(FL_NORMAL_LABEL); txtNbrRecs_log->labelfont(0); txtNbrRecs_log->labelsize(14); txtNbrRecs_log->labelcolor(FL_FOREGROUND_COLOR); txtNbrRecs_log->align(Fl_Align(FL_ALIGN_LEFT)); txtNbrRecs_log->when(FL_WHEN_RELEASE); } // Fl_Input2* txtNbrRecs_log { bNewSave = new Fl_Button(135, 284, 75, 22, _("New")); bNewSave->tooltip(_("New record / Save record")); bNewSave->shortcut(0x8004e); bNewSave->color(FL_LIGHT1); bNewSave->selection_color((Fl_Color)48); bNewSave->callback((Fl_Callback*)cb_btnNewSave); } // Fl_Button* bNewSave { bUpdateCancel = new Fl_Button(222, 284, 75, 22, _("Update")); bUpdateCancel->tooltip(_("Update the current record")); bUpdateCancel->shortcut(0x80055); bUpdateCancel->color(FL_LIGHT1); bUpdateCancel->selection_color((Fl_Color)48); bUpdateCancel->callback((Fl_Callback*)cb_btnUpdateCancel); } // Fl_Button* bUpdateCancel { bDelete = new Fl_Button(310, 284, 75, 22, _("Delete")); bDelete->tooltip(_("Delete the current record")); bDelete->shortcut(0x80044); bDelete->color(FL_LIGHT1); bDelete->selection_color((Fl_Color)48); bDelete->callback((Fl_Callback*)cb_btnDelete); } // Fl_Button* bDelete { bDialFreq = new Fl_Button(398, 284, 75, 22, _("Dial")); bDialFreq->tooltip(_("Retrieve for active modem use")); bDialFreq->shortcut(0x50066); bDialFreq->color(FL_LIGHT1); bDialFreq->selection_color((Fl_Color)48); bDialFreq->callback((Fl_Callback*)cb_btnDialFreq); } // Fl_Button* bDialFreq { bSearchPrev = new Fl_Button(495, 284, 24, 22); bSearchPrev->tooltip(_("Find previous")); bSearchPrev->color(FL_LIGHT1); bSearchPrev->selection_color((Fl_Color)48); bSearchPrev->callback((Fl_Callback*)cb_search); bSearchPrev->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); bSearchPrev->image(new Fl_Pixmap(left_arrow_icon)); } // Fl_Button* bSearchPrev { bSearchNext = new Fl_Button(547, 284, 24, 22); bSearchNext->tooltip(_("Find next")); bSearchNext->color(FL_LIGHT1); bSearchNext->selection_color((Fl_Color)48); bSearchNext->callback((Fl_Callback*)cb_search); bSearchNext->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); bSearchNext->image(new Fl_Pixmap(right_arrow_icon)); } // Fl_Button* bSearchNext { wBrowser = new Table(2, 315, 586, 195); wBrowser->box(FL_DOWN_FRAME); wBrowser->color(FL_BACKGROUND2_COLOR); wBrowser->selection_color(FL_SELECTION_COLOR); wBrowser->labeltype(FL_NORMAL_LABEL); wBrowser->labelfont(0); wBrowser->labelsize(14); wBrowser->labelcolor(FL_FOREGROUND_COLOR); wBrowser->align(Fl_Align(FL_ALIGN_TOP)); wBrowser->when(FL_WHEN_RELEASE); wBrowser->end(); Fl_Group::current()->resizable(wBrowser); } // Table* wBrowser dlgLogbook->end(); } // Fl_Double_Window* dlgLogbook wBrowser->align (FL_ALIGN_TOP | FL_ALIGN_LEFT); wBrowser->addColumn (_("Date"),85); wBrowser->colcallback (0,cb_SortByDate); wBrowser->addColumn (_("Time"),47); wBrowser->addColumn (_("Callsign"),100); wBrowser->colcallback (2,cb_SortByCall); wBrowser->addColumn (_("Name"),110); wBrowser->addColumn (_("Frequency"),120); wBrowser->colcallback (4,cb_SortByFreq); wBrowser->addColumn (_("Mode"),103); wBrowser->colcallback (5,cb_SortByMode); wBrowser->addHiddenColumn ("rn"); wBrowser->allowSort(true); wBrowser->callback(cb_browser); wBrowser->when(FL_WHEN_CHANGED); wBrowser->rowSize (FL_NORMAL_SIZE); wBrowser->headerSize (FL_NORMAL_SIZE); wBrowser->allowResize (1); wBrowser->gridEnabled (0); dlgLogbook->xclass(PACKAGE_TARNAME); { wCabrillo = new Fl_Double_Window(675, 340, _("Cabrillo Setup")); { Fl_Group* o = new Fl_Group(4, 4, 388, 305, _("Select Records to Export")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkCabBrowser = new Fl_Check_Browser(13, 25, 370, 245); } // Fl_Check_Browser* chkCabBrowser { btnCabClearAll = new Fl_Button(69, 277, 110, 24, _("Clear All")); btnCabClearAll->callback((Fl_Callback*)cb_btnCabClearAll); } // Fl_Button* btnCabClearAll { btnCabCheckAll = new Fl_Button(200, 277, 110, 24, _("Check All")); btnCabCheckAll->callback((Fl_Callback*)cb_btnCabCheckAll); } // Fl_Button* btnCabCheckAll o->end(); } // Fl_Group* o { btnCabOK = new Fl_Return_Button(544, 312, 100, 24, _("OK")); btnCabOK->callback((Fl_Callback*)cb_btnCabOK); } // Fl_Return_Button* btnCabOK { btnCabCancel = new Fl_Button(414, 312, 100, 24, _("Cancel")); btnCabCancel->callback((Fl_Callback*)cb_btnCabCancel); } // Fl_Button* btnCabCancel { Fl_Group* o = new Fl_Group(390, 4, 283, 305, _("Select Cabrillo Contest & Fields")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { cboContest = new Fl_ComboBox(486, 41, 180, 20, _("Contest:")); cboContest->box(FL_BORDER_BOX); cboContest->color(FL_BACKGROUND2_COLOR); cboContest->selection_color(FL_BACKGROUND_COLOR); cboContest->labeltype(FL_NORMAL_LABEL); cboContest->labelfont(0); cboContest->labelsize(14); cboContest->labelcolor(FL_FOREGROUND_COLOR); cboContest->callback((Fl_Callback*)cb_cboContest); cboContest->align(Fl_Align(FL_ALIGN_LEFT)); cboContest->when(FL_WHEN_RELEASE); cboContest->end(); } // Fl_ComboBox* cboContest { btnCabCall = new Fl_Check_Button(423, 75, 70, 16, _("Call")); btnCabCall->down_box(FL_DOWN_BOX); btnCabCall->value(1); } // Fl_Check_Button* btnCabCall { btnCabFreq = new Fl_Check_Button(423, 100, 70, 15, _("Freq")); btnCabFreq->down_box(FL_DOWN_BOX); btnCabFreq->value(1); } // Fl_Check_Button* btnCabFreq { btnCabMode = new Fl_Check_Button(423, 124, 70, 15, _("Mode")); btnCabMode->down_box(FL_DOWN_BOX); btnCabMode->value(1); } // Fl_Check_Button* btnCabMode { btnCabQSOdate = new Fl_Check_Button(423, 148, 70, 15, _("QSO Date")); btnCabQSOdate->down_box(FL_DOWN_BOX); btnCabQSOdate->value(1); } // Fl_Check_Button* btnCabQSOdate { btnCabTimeOFF = new Fl_Check_Button(423, 172, 70, 15, _("Time OFF")); btnCabTimeOFF->down_box(FL_DOWN_BOX); btnCabTimeOFF->value(1); } // Fl_Check_Button* btnCabTimeOFF { btnCabRSTsent = new Fl_Check_Button(423, 196, 70, 15, _("RST sent")); btnCabRSTsent->down_box(FL_DOWN_BOX); btnCabRSTsent->value(1); } // Fl_Check_Button* btnCabRSTsent { btnCabRSTrcvd = new Fl_Check_Button(423, 221, 70, 16, _("RST rcvd")); btnCabRSTrcvd->down_box(FL_DOWN_BOX); btnCabRSTrcvd->value(1); } // Fl_Check_Button* btnCabRSTrcvd { btnCabSerialIN = new Fl_Check_Button(533, 100, 70, 15, _("Serial # in")); btnCabSerialIN->down_box(FL_DOWN_BOX); btnCabSerialIN->value(1); } // Fl_Check_Button* btnCabSerialIN { btnCabSerialOUT = new Fl_Check_Button(533, 124, 70, 15, _("Serial # out")); btnCabSerialOUT->down_box(FL_DOWN_BOX); btnCabSerialOUT->value(1); } // Fl_Check_Button* btnCabSerialOUT { btnCabXchgIn = new Fl_Check_Button(533, 148, 70, 15, _("Exchange In")); btnCabXchgIn->down_box(FL_DOWN_BOX); btnCabXchgIn->value(1); } // Fl_Check_Button* btnCabXchgIn { btnCabMyXchg = new Fl_Check_Button(533, 172, 70, 15, _("Exchange Out")); btnCabMyXchg->down_box(FL_DOWN_BOX); btnCabMyXchg->value(1); } // Fl_Check_Button* btnCabMyXchg { btnCabClearAllFields = new Fl_Button(409, 277, 110, 24, _("Clear All")); btnCabClearAllFields->callback((Fl_Callback*)cb_btnCabClearAllFields); } // Fl_Button* btnCabClearAllFields { btnCabCheckAllFields = new Fl_Button(539, 277, 110, 24, _("Check All")); btnCabCheckAllFields->callback((Fl_Callback*)cb_btnCabCheckAllFields); } // Fl_Button* btnCabCheckAllFields o->end(); } // Fl_Group* o wCabrillo->end(); } // Fl_Double_Window* wCabrillo } fldigi-3.21.80/src/logbook/qrzlib.cxx0000664000175000017500000004604512313064025014325 00000000000000// ---------------------------------------------------------------------------- // qrzlib.cc // // Interface library to the QRZ database distributed by AA7BQ // // Copyright (C) 1999-2009 David Freese // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include using namespace std; #include "qrzlib.h" #include "configuration.h" #include "debug.h" static char QRZdir[256] = ""; static const char *QRZpath; static const char *QRZtry[] = { #ifdef __WOE32__ "C:/CALLBK/", // look on C: drive first "D:/CALLBK/", "E:/CALLBK/", "F:/CALLBK/", "G:/CALLBK/", #else "~/callbk/", "/cdrom/callbk/", "/mnt/cdrom/callbk/", "/mnt/cdrom0/callbk/", "/mnt/cdrom1/callbk/", "/media/cdrom/callbk/", "/media/cdrom0/callbk/", "/media/cdrom1/callbk/", #endif 0 }; FILE *imagefile = NULL; #define isdirsep(c) ((c)=='/') int filename_expand(char *to,int tolen, const char *from) { char temp[tolen]; strlcpy(temp,from, tolen); char *start = temp; char *end = temp+strlen(temp); int ret = 0; for (char *a=temp; a= tolen) end += tolen - (end+1-e+t); memmove(a+t, e, end+1-e); end = a+t+(end-e); *end = '\0'; memcpy(a, value, t); ret++; } else { a = e+1; } } strlcpy(to, start, tolen); return ret; } char *QRZImageFilename (char *call) { static char fname[80], *p, imgcall[12]; FILE *f; strcpy(imgcall, call); p = imgcall; while (*p) {*p = tolower (*p); p++; } strcpy (fname, QRZdir); strcat (fname, "images/"); strcat (fname, &imgcall[strlen(imgcall)-1]); strcat (fname, "/"); strcat (fname, imgcall); while (fname[strlen(fname)-1] == ' ') fname[strlen(fname)-1] = 0; strcat (fname, ".jpg"); f = fopen(fname, "r"); if (f != NULL) { fclose (f); return fname; } return NULL; } int checkPath( const char *filename ) { char fname[120]; FILE *f; bool notfound = false; if (!progdefaults.QRZpathname.empty()) { strcpy ( fname, progdefaults.QRZpathname.c_str()); for (size_t i = 0; i < strlen(fname); i++) if (fname[i] == '\\') fname[i] = '/'; // fix for DOS path convention strcat( fname, filename ); strcat( fname, ".dat" ); if (fname[0] == '~' || fname[0] == '$') { char f2name[80]; filename_expand(f2name, 79, fname); strcpy (fname, f2name); } f = fopen(fname, "r" ); if( f != NULL ) { fclose( f ); char pathname[120]; strcpy( pathname, progdefaults.QRZpathname.c_str()); if (pathname[0] == '~' || pathname[0] == '$') filename_expand(QRZdir, 79, pathname); else strcpy (QRZdir, pathname); return 1; } string err = fname; err.append(" not found, performing search"); LOG_WARN("%s", err.c_str()); notfound = true; } // not specified, perform a search const char **pQRZpath = QRZtry; while (*pQRZpath) { strcpy( fname, *pQRZpath ); strcat( fname, filename ); strcat( fname, ".dat" ); if (fname[0] == '~' || fname[0] == '$') { char f2name[80]; filename_expand(f2name, 79, fname); strcpy (fname, f2name); } f = fopen(fname, "r" ); if( f != NULL ) { fclose( f ); QRZpath = *pQRZpath; if (QRZpath[0] == '~' || QRZpath[0] == '$') filename_expand(QRZdir, 79, QRZpath); else strcpy (QRZdir, QRZpath); if (notfound) { string err = "Using "; err.append(fname); LOG_WARN("%s", err.c_str()); } return 1; } pQRZpath++; } QRZpath = QRZtry[0]; LOG_WARN("QRZ data base not found"); return 0; } void SetQRZdirectory(char *dir) { strcpy(QRZdir, dir); strcat(QRZdir, "/"); } bool QRZ::ImageExists() { if (Qimagefname == NULL) return (hasImage = false); imagefile = fopen(Qimagefname, "r"); if (imagefile) { fclose (imagefile); return (hasImage = true); } return (hasImage = false); } void QRZ::OpenQRZFiles( const char *fname ) { long fsize; char dfname[64]; char idxname[64]; int num1; int num2; num1 = 0; num2 = 0; if( fname[0] == 0 ) { QRZvalid = 0; return; } QRZvalid = 1; if (*QRZdir == 0) if( checkPath( fname ) == 0 ) { QRZvalid = 0; return; } strcpy( dfname, QRZdir ); strcpy( idxname, QRZdir ); strcat( idxname, fname ); strcat( idxname, ".idx" ); strcat( dfname, fname ); strcat( dfname, ".dat" ); idxfile = fopen( idxname, "r" ); if( idxfile == NULL ) { QRZvalid = 0; return; } fseek( idxfile, 0, SEEK_END ); fsize = ftell( idxfile ); rewind( idxfile ); idxsize = fsize - 48; index = (char *) malloc( idxsize ); if( index == NULL ) { fclose( idxfile ); QRZvalid = 0; return; } memset( index, 0, idxsize ); num1 = fread( &idxhdr.dataname, 48, 1, idxfile ); num2 = fread( index, idxsize, 1, idxfile ); if (num1 != 1 || num2 != 1) { fclose( idxfile ); free( index ); QRZvalid = 0; return; } fflush( stdout ); fclose( idxfile ); datafile = fopen( dfname, "r" ); if( datafile == NULL ) { free( index ); QRZvalid = 0; return; } sscanf( idxhdr.bytesperkey, "%d", &datarecsize ); if( datarecsize == 0 || datarecsize > 32767 ) { free( index ); QRZvalid = 0; return; } // allocate sufficient data buffer for file read over key boundary data = (char *) malloc( datarecsize + 512 ); if( data == NULL ) { free( index ); QRZvalid = 0; return; } // fill buffer with new-lines to insure not reading past end of // the buffer memset( data, '\n', datarecsize + 512 ); sscanf( idxhdr.keylen, "%d", &keylen ); sscanf( idxhdr.numkeys, "%ld", &numkeys ); top = index + idxsize - keylen; } QRZ::QRZ( const char *fname ) { int len = strlen(fname); criteria = fname[ len - 1 ]; OpenQRZFiles( fname ); } QRZ::QRZ( const char *fname, char c ) { criteria = c; OpenQRZFiles( fname ); } void QRZ::NewDBpath( const char *fname ) { int len = strlen(fname); criteria = fname[ len - 1 ]; *QRZdir = 0; OpenQRZFiles( fname ); } QRZ::~QRZ() { if( index != NULL ) free( index ); if( data != NULL ) free( data ); if( datafile != NULL ) fclose( datafile ); return; } int QRZ::CallComp( char *s1, char *s2 ) { static char sa[7], sb[7]; strncpy( sb, s2, 6 ); strncpy( sa, s1, 6 ); sa[6] = 0; sb[6] = 0; int stest = strncasecmp( sa + 3, sb + 3, 3 ); if( stest < 0 ) return -1; if( stest > 0 ) return 1; // suffix are equal int atest = strncasecmp( sa + 2, sb + 2, 1 ); if( atest < 0 ) return -1; if( atest > 0 ) return 1; // suffix & call area are equal int ptest = strncasecmp( sa, sb, 2 ); if( ptest < 0 ) return -1; if( ptest > 0 ) return 1; // total match of calls return 0; } char *Composite( char *s ) { static char newstr[7]; int ccount = strlen(s) < 7 ? strlen(s) : 6; memset(newstr, ' ', 6 ); newstr[6] = 0; if( isdigit( s[2] ) ) { for( int i = 0; i < ccount; i++ ) newstr[i] = s[i]; } else { newstr[0] = s[0]; newstr[2] = s[1]; for( int i = 2; i < ccount; i++ ) newstr[i+1] = s[i]; } return( newstr ); } int QRZ::ReadDataBlock( long p ) { rewind( datafile ); if ( p < 0 ) p = 0; if( fseek( datafile, p, SEEK_SET ) != 0 ) { return 1; } databytesread = fread( data, 1, datarecsize + 512, datafile ); dataoffset = p; fflush( stdout); return 0; } int QRZ::FindCallsign( char *field ) { char composite[7], testcall[7]; char *endofdata; int matched = 0, iOffset; memset( composite, 0, 6 ); memset( testcall, 0, 6 ); found = 0; idxptr = index; if( strlen( field ) < 3 ) // must be a valid callsign return 0; if ( !(isdigit( field[1] ) || isdigit( field[2] ) ) ) return 0; strcpy( composite, Composite( field ) ); for( iOffset = 0; iOffset < numkeys; iOffset++, idxptr += keylen ) if( CallComp( composite, idxptr) <= 0 ) break; iOffset--; if (iOffset < 0) iOffset = 0; ReadDataBlock( datarecsize * iOffset ); dfptr = data; endofdata = data + databytesread; endofline = strchr( dfptr, '\n' ); if( idxptr != index ) { endofline = strchr( dfptr, '\n' ); if (endofline != NULL ) dfptr = endofline + 1; } found = 0; while ( !found && (dfptr < endofdata ) ) { memcpy( testcall, dfptr, 6 ); if( (matched = CallComp( composite, Composite(testcall) ) ) <= 0 ) found = 1; else { endofline = strchr( dfptr, '\n' ); dfptr = endofline + 1; } } if ( matched == 0 ) { endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); // check for old call referencing new call if (strlen(recbuffer) < 15 ) { dfptr = strchr( dfptr, ',' ) + 1; strcpy( recbuffer, dfptr ); // Qcall = recbuffer; found = -1; } else { found = 1; dfptr = endofline + 1; // point to next record } return (found); } found = 0; return 0; } int QRZ::nextrec() { if( dfptr > data + datarecsize ) { if( ReadDataBlock( dataoffset + (dfptr - data) ) != 0) return 0; dfptr = data; } endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); dfptr = endofline + 1; if (strlen(recbuffer) < 15 ) { nextrec(); } return 1; } int QRZ::NextRecord() { if( nextrec() == 1 ) return( ReadRec() ); return 0; } int QRZ::FindName( char *field ) { char *endofdata; int matched = 0, iOffset; char *Lname, *Fname; char sFname[17]; char sLname[17]; char sIdxName[33]; char *cptr; memset( sFname, 0, 17 ); memset( sLname, 0, 17 ); memset( sIdxName, 0, 33 ); if ( (cptr = strchr( field, ',' ) ) != NULL ) { strncpy( sLname, field, cptr - field ); strcpy( sFname, cptr + 1 ); } else strcpy( sLname, field ); strcpy( sIdxName, sLname ); if( strlen( sFname ) > 0 ) { strcat( sIdxName, " " ); strcat( sIdxName, sFname ); } found = 0; idxptr = index; for( iOffset = 0; iOffset < numkeys; iOffset++, idxptr += keylen ) if( strncasecmp( sIdxName, idxptr, keylen ) <= 0 ) break; iOffset--; if (iOffset < 0) iOffset = 0; ReadDataBlock( datarecsize * iOffset ); dfptr = data; endofdata = data + databytesread; if( idxptr != index ) { endofline = strchr( dfptr, '\n' ); if (endofline != NULL ) dfptr = endofline + 1; } found = 0; while ( !found && (dfptr < endofdata ) ) { endofline = strchr( dfptr, '\n' ); if( endofline == NULL || endofline > endofdata ) break; if( endofline - dfptr > 14 ) { // valid racord Lname = strchr( dfptr, ',' ) + 1; // locate Lname element Fname = strchr( Lname, ',' ) + 1; // locate Fname element if( *Fname == ',' ) Fname++; else Fname = strchr( Fname, ',' ) + 1; if( (matched = strncasecmp( sLname, Lname, strlen(sLname) ) ) == 0 ) { if( sFname[0] == 0 ) found = 1; else if( ( matched = strncasecmp( sFname, Fname, strlen(sFname) ) ) <= 0 ) found = 1; } } if (!found && (dfptr < endofdata ) ) dfptr = strchr( dfptr, '\n' ) + 1; // move to next record } if ( matched == 0 ) { endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); found = 1; dfptr = endofline + 1; // point to next record return (found); } found = 0; return 0; } int QRZ::CompState( const char *field, const char *state, const char *city ) { int compsize = strlen(field+2), chk; if (compsize > keylen) compsize = keylen; if(strlen( field ) == 2) return ( strncasecmp( field, state, 2 ) ); if( (chk = strncasecmp( field, state, 2 ) ) < 0 ) return -1; if( chk > 0 ) return 1; chk = strncasecmp( field + 2, city, compsize); if (chk < 0) return -1; if (chk > 0) return 1; return 0; } int QRZ::FindState( char *field ) { char *endofdata; int matched = 0, iOffset; char *state; char *city; int compsize = strlen(field); if (compsize > keylen) compsize = keylen; found = 0; idxptr = index; for( iOffset = 0; iOffset < numkeys; iOffset++, idxptr += keylen ) if( strncasecmp( field, idxptr, compsize ) <= 0 ) break; iOffset--; if (iOffset < 0) iOffset = 0; ReadDataBlock( datarecsize * iOffset ); dfptr = data; endofdata = data + datarecsize; if( idxptr != index ) { endofline = strchr( dfptr, '\n' ); if (endofline != NULL ) dfptr = endofline + 1; } found = 0; while ( !found && (dfptr < endofdata ) ) { endofline = strchr( dfptr, '\n' ); if( endofline - dfptr > 14 ) { // valid record city = dfptr; for( int i = 0; i < 9; i++ ) // move to city element city = strchr( city, ',' ) + 1; state = strchr( city, ',' ) + 1; // move to state element matched = CompState( field, state, city ); if( matched == 0) found = 1; else { endofline = strchr( dfptr, '\n' ); // no match, move to next dfptr = endofline + 1; } } else { endofline = strchr( dfptr, '\n' ); // invalid record, move to next dfptr = endofline + 1; } } if ( matched == 0 ) { endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); found = 1; dfptr = endofline + 1; // point to next record return (found); } found = 0; return 0; } int QRZ::FindZip( char *field ) { char *endofdata; int matched = 0, iOffset; char *zip; found = 0; idxptr = index; for( iOffset = 0; iOffset < numkeys; iOffset++, idxptr += keylen ) if( strncasecmp( field, idxptr, 5 ) <= 0 ) break; iOffset--; if (iOffset < 0) iOffset = 0; ReadDataBlock( datarecsize * iOffset ); dfptr = data; endofdata = data + datarecsize; if( idxptr != index ) { endofline = strchr( dfptr, '\n' ); if (endofline != NULL ) dfptr = endofline + 1; } found = 0; while ( !found && (dfptr < endofdata ) ) { endofline = strchr( dfptr, '\n' ); if( endofline - dfptr > 14 ) { // valid record zip = dfptr; for( int i = 0; i < 11; i++ ) // move to Zip element zip = strchr( zip, ',' ) + 1; if( (matched = strncasecmp( field, zip, 5 ) ) <= 0 ) found = 1; else { endofline = strchr( dfptr, '\n' ); // no match, move to next dfptr = endofline + 1; } } else { endofline = strchr( dfptr, '\n' ); // invalid record, move to next dfptr = endofline + 1; } } if ( matched == 0 ) { endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); found = 1; dfptr = endofline + 1; // point to next record return (found); } found = 0; return 0; } int QRZ::FindRecord( char *field ) { if (QRZvalid == 0 ) return 0; switch (criteria) { case 'c' : FindCallsign( field ); break; case 'n' : FindName( field ); break; case 's' : FindState( field ); break; case 'z' : FindZip( field ); } return( ReadRec() ); } static char empty[] = { '\0' }; int QRZ::ReadRec() { char *comma; if( found == 1 ) { Qcall = recbuffer; comma = strchr( Qcall, ',' ); *comma = 0; Qlname = comma + 1; comma = strchr( Qlname, ',' ); *comma = 0; Qfname = comma + 1; comma = strchr( Qfname, ',' ); Qfname = comma + 1; // skip JR field comma = strchr( Qfname, ',' ); *comma = 0; Qdob = comma + 1; comma = strchr( Qdob, ',' ); Qdob = comma + 1; // skip MI field comma = strchr( Qdob, ',' ); *comma = 0; Qefdate = comma + 1; comma = strchr( Qefdate, ',' ); *comma = 0; Qexpdate = comma + 1; comma = strchr( Qexpdate, ',' ); *comma = 0; Qmail_str = comma + 1; comma = strchr( Qmail_str, ',' ); *comma = 0; Qmail_city = comma + 1; comma = strchr( Qmail_city, ',' ); *comma = 0; Qmail_st = comma + 1; comma = strchr( Qmail_st, ',' ); *comma = 0; Qmail_zip = comma + 1; comma = strchr( Qmail_zip, ',' ); *comma = 0; Qopclass = comma + 1; comma = strchr( Qopclass, ',' ); *comma = 0; Qp_call = comma + 1; comma = strchr( Qp_call, ',' ); *comma = 0; Qp_class = comma + 1; //Qp_class[1] = 0; *(comma + 2) = 0; Qimagefname = QRZImageFilename (GetCall()); return( 1 ); } else { Qcall = empty; Qlname = empty; Qfname = empty; Qdob = empty; Qefdate = empty; Qexpdate = empty; Qmail_str = empty; Qmail_city = empty; Qmail_st = empty; Qmail_zip = empty; Qopclass = empty; Qp_call = empty; Qp_class = empty; Qimagefname = NULL; return( 0 ); } } int QRZ::GetCount( char *unknown ) { int matched, cnt = 0; char temp[40]; if( FindRecord( unknown ) != 1 ) return(0); matched = 0; while (matched == 0) { cnt++; NextRecord(); switch (criteria) { case 'c' : matched = 1; break; case 'n' : if( strchr( unknown, ',' ) == 0 ) matched = strcasecmp( unknown, GetLname() ); else { strcpy( temp, GetLname() ); strcat( temp, "," ); strcat( temp, GetFname() ); matched = strncasecmp( unknown, temp, strlen(unknown) ); } break; case 'z' : matched = strncmp( unknown, GetZIP(), 5 ); break; case 's' : matched = CompState( unknown, GetState(), GetCity() ); break; default : matched = 1; } } return cnt; } char * QRZ::GetCall() { static char call[15]; char *p = call; strcpy (call, Qcall); while (*p) { if (*p == ' ') strcpy (p, p+1); if (*p != ' ') p++; } return( call ); }; const char * QRZ::GetLname() { return( Qlname ); }; const char * QRZ::GetFname() { return( Qfname ); }; const char * QRZ::GetDOB() { return( Qdob ); }; const char * QRZ::GetEFdate() { return( Qefdate ); }; const char * QRZ::GetEXPdate() { return( Qexpdate ); }; const char * QRZ::GetStreet() { return( Qmail_str ); }; const char * QRZ::GetCity() { return( Qmail_city ); }; const char * QRZ::GetState() { return( Qmail_st ); }; const char * QRZ::GetZIP() { return( Qmail_zip ); }; const char * QRZ::GetOPclass() { return( Qopclass ); }; const char * QRZ::GetPriorCall() { return( Qp_call ); }; const char * QRZ::GetPriorClass() { return( Qp_class ); }; int QRZ::getQRZvalid() { return( QRZvalid ); } const char * QRZ::GetImageFileName () { return (Qimagefname); } char * QRZ::CSV_Record() { static char info[256]; memset( info, 0, 256 ); snprintf( info, sizeof(info) - 1, "%s,%s,%s,%s,%s,%s,%s,%s,%s", GetCall(), Qopclass, Qefdate, Qlname, Qfname, Qmail_str, Qmail_city, Qmail_st, Qmail_zip ); return info; } char *QRZ::Fmt_Record() { static char info[256]; memset( info, 0, 256 ); snprintf( info, sizeof(info) - 1, "%s %s : %s\n%s %s\n%s\n%s, %s %s\n", GetCall(), Qopclass, Qefdate, Qfname, Qlname, Qmail_str, Qmail_city, Qmail_st, Qmail_zip ); return info; } fldigi-3.21.80/src/logbook/xmlrpc_log.cxx0000664000175000017500000001672712313064025015174 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "xmlrpcpp/XmlRpc.h" #include "config.h" #include "lgbook.h" #include "icons.h" #include "gettext.h" #include "debug.h" #include "util.h" #include "date.h" #include "logbook.h" #include "logger.h" #include "locator.h" #include "fl_digi.h" #include "adif_io.h" #include "modem.h" #include "trx.h" #include "status.h" #include "configuration.h" using namespace XmlRpc; XmlRpcClient *log_client = (XmlRpcClient *)0; bool test_connection(bool info = false) { XmlRpcValue query, result; if (log_client->execute("system.listMethods", query, result)) { if (info) { string res; int asize = result.size(); XmlRpcValue oneArg, help; res = "Xml-log methods:"; for (int i = 0; i < asize; i++) { oneArg[0] = result[i]; try { if (std::string(result[i]).find("system") == string::npos) { log_client->execute("system.methodHelp", oneArg, help); res.append("\n\t").append(help); } } catch ( XmlRpcException err) { res.append("\n").append(oneArg[0]).append(": ").append(err.getMessage()); } } LOG_INFO("%s", res.c_str()); } return true; } return false; } void activate_log_menus(bool val) { set_server_label(!val); activate_menu_item(_("View"), val); activate_menu_item(_("New"), val); activate_menu_item(_("Open..."), val); activate_menu_item(_("Save"), val); activate_menu_item(_("ADIF"), val); activate_menu_item(_("Reports"), val); } string get_field(string &adifline, int field) { string fld; fld.append("<").append(fields[field].name).append(":"); size_t pos1 = adifline.find(fld); if (pos1 == std::string::npos) return ""; pos1 = adifline.find(">", pos1) + 1; size_t pos2 = adifline.find("<", pos1); fld = adifline.substr(pos1, pos2 - pos1); return fld; } bool xml_get_record(const char *callsign) { XmlRpcValue oneArg, result; if (!test_connection()) { LOG_INFO("%s","Logbook server down!"); progdefaults.xml_logbook = false; activate_log_menus(true); start_logbook(); return false; } oneArg[0] = callsign; if (log_client->execute("log.get_record", oneArg, result)) { string adifline = std::string(result); inpName->value(get_field(adifline, NAME).c_str()); inpQth->value(get_field(adifline, QTH).c_str()); inpState->value(get_field(adifline, STATE).c_str()); inpVEprov->value(get_field(adifline, VE_PROV).c_str()); inpCountry->value(get_field(adifline, COUNTRY).c_str()); inpLoc->value(get_field(adifline, GRIDSQUARE).c_str()); inpNotes->value(get_field(adifline, NOTES).c_str()); } else { inpName->value(""); inpQth->value(""); inpState->value(""); inpVEprov->value(""); inpCountry->value(""); inpLoc->value(""); inpNotes->value(""); } if (inpLoc->value()[0]) { double lon1, lat1, lon2, lat2; double azimuth, distance; char szAZ[4]; if ( locator2longlat(&lon1, &lat1, progdefaults.myLocator.c_str()) == RIG_OK && locator2longlat(&lon2, &lat2, inpLoc->value()) == RIG_OK && qrb(lon1, lat1, lon2, lat2, &distance, &azimuth) == RIG_OK ) { snprintf(szAZ,sizeof(szAZ),"%0.f", azimuth); inpAZ->value(szAZ); } else inpAZ->value(""); } else inpAZ->value(""); return true; } static std::string adif; static std::string notes; #define adif_str(a, b) { \ std::ostringstream os; \ os << "<" << fields[(a)].name << ":" << strlen((b)) << ">" << (b); \ adif.append(os.str()); } void xml_add_record() { if (!test_connection()) { LOG_INFO("%s","Logbook server down!"); progdefaults.xml_logbook = false; activate_log_menus(true); start_logbook(); AddRecord(); return; } // create the ADIF record adif.erase(); adif_str(QSO_DATE, sDate_on.c_str()); adif_str(QSO_DATE_OFF, sDate_off.c_str()); adif_str(TIME_ON, sTime_on.c_str()); adif_str(TIME_OFF, sTime_off.c_str()); adif_str(CALL, inpCall->value()); { char Mhz[30]; snprintf(Mhz, sizeof(Mhz), "%-f", atof(inpFreq->value()) / 1000.0); inpFreq_log->value(Mhz); adif_str(FREQ, Mhz); } adif_str(MODE, mode_info[active_modem->get_mode()].adif_name); adif_str(RST_SENT, inpRstOut->value()); adif_str(RST_RCVD, inpRstIn->value()); adif_str(TX_PWR, progdefaults.mytxpower.c_str()); adif_str(NAME, inpName->value()); adif_str(QTH, inpQth->value()); adif_str(STATE, inpState->value()); adif_str(VE_PROV, inpVEprov->value()); adif_str(COUNTRY, inpCountry->value()); adif_str(GRIDSQUARE, inpLoc->value()); adif_str(STX, outSerNo->value()); adif_str(SRX, inpSerNo->value()); adif_str(XCHG1, inpXchgIn->value()); adif_str(MYXCHG, progdefaults.myXchg.c_str()); adif_str(NOTES, inpNotes->value()); // these fields will always be blank unless they are added to the main // QSO log area. // need to add the remaining fields adif_str(IOTA, ""); adif_str(DXCC, ""); adif_str(QSL_VIA, ""); adif_str(QSLRDATE, ""); adif_str(QSLSDATE, ""); adif.append(""); // send it to the server XmlRpcValue oneArg, result; oneArg[0] = adif.c_str(); std::cout << "result: " << log_client->execute("log.add_record", oneArg, result) << std::endl; } bool xml_check_dup() { if (!test_connection()) { LOG_INFO("%s","Logbook server down!"); progdefaults.xml_logbook = false; activate_log_menus(true); start_logbook(); return false; } XmlRpcValue six_args, result; six_args[0] = inpCall->value(); six_args[1] = progdefaults.dupmode ? mode_info[active_modem->get_mode()].adif_name : "0"; char tspn[10]; snprintf(tspn, sizeof(tspn), "%d", progdefaults.timespan); six_args[2] = progdefaults.duptimespan ? tspn : "0"; six_args[3] = progdefaults.dupband ? inpFreq->value() : "0"; six_args[4] = (progdefaults.dupstate && inpState->value()[0]) ? inpState->value() : "0"; six_args[5] = (progdefaults.dupxchg1 && inpXchgIn->value()[0]) ? inpXchgIn->value() : "0"; if (log_client->execute("log.check_dup", six_args, result)) { string res = std::string(result); if (res == "true") return true; } return false; } void connect_to_log_server(void *) { if (!log_client) { int xmllog_port = atoi(progdefaults.xmllog_port.c_str()); log_client = new XmlRpcClient(progdefaults.xmllog_address.c_str(), xmllog_port); } else { delete log_client; int xmllog_port = atoi(progdefaults.xmllog_port.c_str()); log_client = new XmlRpcClient(progdefaults.xmllog_address.c_str(), xmllog_port); } if (progdefaults.xml_logbook) { if (test_connection(true)) { close_logbook(); if (dlgLogbook) dlgLogbook->hide(); activate_log_menus(false); } else { progdefaults.xml_logbook = false; activate_log_menus(true); start_logbook(); } } else { close_logbook(); activate_log_menus(true); start_logbook(); } } fldigi-3.21.80/src/logbook/table.cxx0000664000175000017500000012371212313064025014106 00000000000000/* Copyright (c) 2004 Markus Niemistö 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. */ #include #include #include #include #include #include #include #include "table.h" //#define DAMAGE_HEADER FL_DAMAGE_USER1 //#define DAMAGE_ROWS FL_DAMAGE_USER2 #define DAMAGE_HEADER FL_DAMAGE_ALL #define DAMAGE_ROWS FL_DAMAGE_ALL using namespace std; /* * ====================================== * void Table.drawHeader(int x, int y); * ====================================== * * Draws header buttons starting at (x, y). */ void Table::drawHeader(int x, int y) { int w; struct ColumnInfo col; fl_font(tbl_font, tbl_fontsize); /* * Draw all header cells that aren't clipped. */ for (int i = leftCol; i <= rightCol; i++) { col = header[i]; if (col.hidden) continue; // Draw box if (pushed != i) fl_draw_box(FL_THIN_UP_BOX, x, y, w = col.width, headerHeight, FL_GRAY); else fl_draw_box(FL_THIN_DOWN_BOX, x, y, w = col.width, headerHeight, FL_GRAY); fl_color(FL_FOREGROUND_COLOR); // Draw labels if (col.title != NULL) fl_draw(col.title, x + 2, y - 1, w - 2, headerHeight, col.hdr_align); x += w; // Draw "the sort arrow", if any. if (sortColumn == i) { int mod = headerHeight - 10; if (ascent) fl_polygon(x - mod - 6, y + 5, x - mod / 2 - 6, y + mod + 5, x - 6, y + 5); else fl_polygon(x - mod - 6, y + mod + 5, x - mod / 2 - 6, y + 5, x - 6, y + mod + 5); } } } /* * ============================================================= * void Table.drawRow(int row, char *rowData[], int x, int y); * ============================================================= * * Draws all items in the row. Starts drawing from (x, y). */ void Table::drawRow(int row, char *rowData[], int x, int y) { int w; ColumnInfo col; fl_font(tbl_font, tbl_fontsize); // Draw background box. if (row != selected) { Fl_Color bg; if (!withGrid && row % 2 == 0) // different bg for consecutive rows bg = color(); else { bg = fl_color_average(color(), FL_BLACK, .9); if (fl_contrast(bg, FL_BLACK) == FL_WHITE) // widget has very dark text bg bg = fl_color_average(color(), FL_WHITE, .9); } fl_rectf(iX, y, tableWidth - hScroll->value(), rowHeight, bg); fl_color(FL_FOREGROUND_COLOR); } else { if (Fl::focus() == this) { fl_rectf(iX, y, tableWidth - hScroll->value(), rowHeight, selection_color()); fl_color(FL_FOREGROUND_COLOR); // Draw focus fl_line_style(FL_DOT); fl_rect(iX, y, tableWidth - hScroll->value(), rowHeight); fl_line_style(FL_SOLID); } else fl_rectf(iX, y, tableWidth - hScroll->value(), rowHeight, selection_color()); fl_color(fl_contrast(FL_FOREGROUND_COLOR, selection_color())); } // Get color from highlighter. Fl_Color color; if ((highlighter != NULL) && (highlighter(row, rowData, &color))) fl_color(color); const char *str; // Draw the data. for (int i = leftCol; i <= rightCol; i++) { w = (col = header[i]).width; if (col.hidden) continue; if (withGrid == true) { fl_color(FL_FOREGROUND_COLOR); fl_line_style(FL_SOLID); fl_rect(x,y,w,rowHeight); fl_color(FL_FOREGROUND_COLOR); } if ((str = rowData[i]) != NULL) fl_draw(str, x + 1, y - 1, w - 2, rowHeight + 1, col.align); x += w; } } /* * ======================================================= * Table.Table(int x, int y, int w, int h, char *label); * ======================================================= * * This is standard FLTK constructor. See FLTK documentation for * more information. */ Table::Table(int x, int y, int w, int h, char *label) : Fl_Group(x, y, w, h, label) { // Setup variables. align((Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP)); box(FL_THIN_DOWN_FRAME); color(FL_BACKGROUND2_COLOR, FL_SELECTION_COLOR); tbl_fontsize = 14; headerHeight = tbl_fontsize + 4; rowHeight = tbl_fontsize + 4; scrollbarSize = 16; // Create scrollbars. vScroll = new Fl_Scrollbar(x + w - scrollbarSize, y, scrollbarSize, h + scrollbarSize); vScroll->type(FL_VERTICAL); vScroll->linesize(3 * rowHeight); vScroll->callback(scrollCallback, (void*)this); vScroll->hide(); hScroll = new Fl_Scrollbar(x, y + h - scrollbarSize, w, scrollbarSize); hScroll->type(FL_HORIZONTAL); hScroll->callback(scrollCallback, (void*)this); hScroll->hide(); Fl_Group::end(); // Setup the rest of the variables to reasonable defaults. nCols = nRows = 0; cPos = 0; dragX = 0; resizing = -1; pushed = -1; curRow = NULL; highlighter = NULL; sortColumn = -1; selected = -1; canSort = true; canResize = true; ascent = false; noMoreColumns = false; dimensionsChanged = false; toBeSorted = false; headerEnabled = true; withGrid = false; popupMenu = NULL; menuAlloc = false; Vscroll = var; Hscroll = var; tbl_font = FL_HELVETICA; } /* * ================= * Table.~Table(); * ================= * * Destructor. */ Table::~Table() { delete vScroll; delete hScroll; menuClear(); clear(); } /* * ==================================== * bool Table.headerOn(); * void Table.headerOn(bool enabled); * ==================================== * * These methods get or set the value of variable controlling * whether header buttons are displayed. */ bool Table::headerOn() const { return headerEnabled; } void Table::headerOn(bool enabled) { headerEnabled = enabled; dimensionsChanged = true; redraw(); } /* * ==================================== * bool Table.gridEnabled(); * void Table.gridEnabled(bool enabled); * ==================================== * * These methods get or set the value of variable controlling * whether the table grid is displayed. */ bool Table::gridEnabled() const { return withGrid; } void Table::gridEnabled(bool enabled) { withGrid = enabled; dimensionsChanged = true; redraw(); } /* * ===================================== * bool Table.allowResize(); * void Table.allowResize(bool allow); * ===================================== * * These methods get or set the value of variable controlling * whether user may resize columns by dragging the column border. */ bool Table::allowResize() const { return canResize; } void Table::allowResize(bool allow) { canResize = allow; } /* * =================================== * bool Table.allowSort(); * void Table.allowSort(bool allow); * =================================== * * These methods get or set the value of variable controlling * whether user can determine how data on table is sorted by * clicking on the header buttons. */ bool Table::allowSort() const { return canSort; } void Table::allowSort(bool allow) { canSort = allow; } /* * ================================== * int Table.headerSize(); * void Table.headerSize(int size); * ================================== * * These methods get or set the value of variable controlling * the height of header buttons. */ int Table::headerSize() const { return headerHeight; } void Table::headerSize(int height) { headerHeight = height + 4; dimensionsChanged = true; redraw(); } /* * =============================== * int Table.rowSize(); * void Table.rowSize(int size); * =============================== * * These methods get or set the value of variable controlling * the height of rows. */ int Table::rowSize() const { return rowHeight; } void Table::rowSize(int height) { height += 4; rowHeight = height; vScroll->linesize(3 * height); dimensionsChanged = true; redraw(); } /* * =================================== * int Table.scrollbSize(); * void Table.scrollbSize(int size); * =================================== * * These methods get or set the value of variable controlling * the size (width) of the scrollbars. */ int Table::scrollbSize() const { return scrollbarSize; } void Table::scrollbSize(int size) { scrollbarSize = size; dimensionsChanged = true; redraw(); } /* * ===================================================== * Fl_Align Table.columnAlign(int column); * void Table.columnAlign(int column, Fl_Align align); * ===================================================== * * These methods get or set the value of variable controlling * the alignment of the specified column. */ Fl_Align Table::columnAlign(int column) const { if ((column < 0) && (column >= nCols)) return (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP); /* NOT REACHED */ return header[column].align; } void Table::columnAlign(int column, Fl_Align align) { if ((column < 0) || (column >= nCols)) return; /* NOT REACHED */ header[column].align = (Fl_Align)(align | FL_ALIGN_CLIP); redraw(); } Fl_Align Table::headerAlign(int column) const { if ((column < 0) && (column >= nCols)) return (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP); /* NOT REACHED */ return header[column].hdr_align; } void Table::headerAlign(int column, Fl_Align align) { if ((column < 0) && (column >= nCols)) return; /* NOT REACHED */ header[column].hdr_align = (Fl_Align)(align | FL_ALIGN_CLIP); redraw(); } /* * ===================================================== * int Table.columnWidth(int column); * void Table.columnWidth(int column, int width); * ===================================================== * * These methods get or set the value of variable controlling * the width of the specified column. */ int Table::columnWidth(int column) const { if ((column < 0) && (column >= nCols)) return 0; /* NOT REACHED */ return header[column].width; } void Table::columnWidth(int column, int width) { if ((column < 0) && (column >= nCols)) return; /* NOT REACHED */ header[column].width = width; dimensionsChanged = true; redraw(); } /* * ======================================================== * const char *Table.columnTitle(int column); * void Table.columnTitle(int column, const char *title); * ======================================================== * * These methods get or set the value of variable controlling * the width of the specified column. */ const char *Table::columnTitle(int column) { if ((column < 0) && (column >= nCols)) return NULL; /* NOT REACHED */ return header[column].title; } void Table::columnTitle(int column, const char *title) { if ((column < 0) && (column >= nCols)) return; /* NOT REACHED */ free((void*)header[column].title); header[column].title = strdup(title); damage(DAMAGE_HEADER); } /* * =================================================== * bool Table.columnHidden(int column); * void Table.columnHidden(int column, bool hidden); * =================================================== * * These methods get or set the value of variable controlling * whether column is visible or not. */ bool Table::columnHidden(int column) { if ((column < 0) && (column >= nCols)) return false; /* NOT REACHED */ return header[column].hidden; } void Table::columnHidden(int column, bool hidden) { if ((column < 0) && (column >= nCols)) return; /* NOT REACHED */ header[column].hidden = hidden; dimensionsChanged = true; damage(DAMAGE_HEADER | DAMAGE_ROWS); } /* * =================== * int Table.rows(); * =================== * * Returns the number of rows in table. */ int Table::rows() { return nRows; } /* * ====================== * int Table.columns(); * ====================== * * Returns the number of columns in table. */ int Table::columns() { return nCols; } /* * ================================== * void Table.value(int selection); * ================================== * * Sets the currently selected row. */ void Table::value(int selection) { if ((selection >= 0) && (selection < nRows)) selected = selection; damage(DAMAGE_ROWS); } /* * ==================== * int Table.value(); * ==================== * * Returns the number of the currently selected row. */ int Table::value() { return selected; } /* * ==================================================================== * void Table.addColumn(const char *label, int width, Fl_Align align, * int (*comparator)(const char*, const char*)); * ==================================================================== * * Adds column with label as title, width, align and comparator as * sort function. */ void Table::addColumn(const char *label, int width, Fl_Align align, int (*comparator)(const char*, const char*)) { if (!noMoreColumns) { struct ColumnInfo col; dimensionsChanged = true; col.title = strdup(label); col.width = width; col.hidden = false; col.align = (Fl_Align)(align | FL_ALIGN_CLIP); col.hdr_align = (Fl_Align)(FL_ALIGN_CENTER | FL_ALIGN_CLIP); col.comparator = comparator; col.callback = NULL; header.push_back(col); nCols++; } } void Table::colcomparator(int col, int (*comparator)(const char*, const char*)) { header[col].comparator = comparator; } void Table::colcallback (int col, void (*callback)()) { header[col].callback = callback; } /* * ================================================ * void Table.addHiddenColumn(const char *label); * ================================================ * * Adds a nonvisible column with label as title. */ void Table::addHiddenColumn(const char *label) { if (!noMoreColumns) { struct ColumnInfo col; col.title = strdup(label); col.width = 0; col.hidden = true; col.align = FL_ALIGN_LEFT; col.comparator = NULL; header.push_back(col); nCols++; } } /* * ================================= * void Table.addCell(char *data); * ================================= * * Adds a cell with data to the table. */ void Table::addCell(char *data) { if (!noMoreColumns) noMoreColumns = true; if ((cPos >= nCols) || (curRow == NULL)) { this->data.push_back(curRow = new char*[nCols]); dimensionsChanged = true; nRows++; cPos = 0; } if (data != NULL) curRow[cPos] = strdup(data); else curRow[cPos] = strdup(""); if (cPos == sortColumn) toBeSorted = true; cPos++; } /* * =================================== * void Table.addRow(int cols, ...); * =================================== * * Adds cols number of cells to table. */ void Table::addRow(int cols, ...) { char *temp; if (!noMoreColumns) noMoreColumns = true; if ((cPos != 0) || (curRow == NULL)) { this->data.push_back(curRow = new char*[nCols]); dimensionsChanged = true; nRows++; cPos = 0; } if (cols > nCols) cols = nCols; va_list ap; va_start(ap, cols); for (int c = 0; c < cols; c++, cPos++) { if (cPos >= nCols) { this->data.push_back(curRow = new char*[nCols]); dimensionsChanged = true; nRows++; cPos = 0; } if ((temp = va_arg(ap, char *)) != NULL) curRow[cPos] = strdup(temp); else curRow[cPos] = strdup(""); } va_end(ap); toBeSorted = true; dimensionsChanged = true; } /* * ================================ * void Table.removeRow(int row); * ================================ * * Removes row referenced by row. */ void Table::removeRow(int row) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows)) { char **rowData = data[row]; if (rowData == curRow) curRow = NULL; for (int i = 0; i < nCols; i++) free(rowData[i]); data.erase(row + data.begin()); nRows--; dimensionsChanged = true; toBeSorted = true; selected = -1; } redraw (); } /* * ======================================= * void Table.clear(bool removeColumns); * ======================================= * * Frees all data in table. If removeColumns is true, frees also header * structures. */ void Table::clear(bool removeColumns) { nRows = 0; curRow = NULL; cPos = 0; // Delete row data. vector::iterator end = data.end(); char **row; for (vector::iterator i = data.begin(); i < end; ++i) { row = *i; for (int i = 0; i < nCols; i++) free(row[i]); delete [] row; } data.clear(); if (removeColumns) { // Delete header data. vector::iterator end = header.end(); for (vector::iterator i = header.begin(); i < end; ++i) free((void*)(*i).title); header.clear(); nCols = 0; } selected = -1; dimensionsChanged = true; redraw (); } /* * ============================================ * char *Table.valueAt(int row, int column); * int Table.intValueAt(int row, int column); * ============================================ * * Returns value in cell referenced by row and column. */ char *Table::valueAt(int row, int column) { if ((row >= 0) && (row < nRows) && (column >= 0) && (column < nCols)) return data[row][column]; else if ((row == -1) && (selected >= 0) && (column >= 0) && (column < nCols)) return data[selected][column]; else return NULL; } int Table::intValueAt(int row, int column) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows) && (column >= 0) && (column < nCols)) return strtol(data[row][column], NULL, 10); else return 0; } /* * ====================================================== * void Table.valueAt(int row, int column, char *data); * void Table.valueAt(int row, int column, int data); * ====================================================== * * Sets alue in cell referenced by row and column. */ void Table::valueAt(int row, int column, char *data) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows) && (column >= 0) && (column < nCols)) { if (column == sortColumn) toBeSorted = true; if (this->data[row][column] != NULL) free(this->data[row][column]); this->data[row][column] = strdup(data); } } void Table::valueAt(int row, int column, int data) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows) && (column >= 0) && (column < nCols)) { if (column == sortColumn) toBeSorted = true; if (this->data[row][column] != NULL) free(this->data[row][column]); string temp = ""; temp += data; strcpy(this->data[row][column] = (char*)malloc(temp.length()), temp.c_str()); } } /* * ===================================== * const char **Table.getRow(int row); * ===================================== * * Returns pointer to the data of the row number row. */ const char **Table::getRow(int row) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows)) return (const char**)data[row]; else return NULL; } /* * ============== * Menu methods * ============== * * These work in the same way as in class Fl_Menu_ (methods menu, * copy and clear). These are used for handling the popup menu. */ const Fl_Menu_Item *Table::menu() { return popupMenu; } void Table::menu(const Fl_Menu_Item *m) { menuClear(); popupMenu = m; } void Table::menuCopy(const Fl_Menu_Item *m) { int n = m->size(); Fl_Menu_Item* newMenu = new Fl_Menu_Item[n]; memcpy(newMenu, m, n * sizeof(Fl_Menu_Item)); menu(newMenu); menuAlloc = true; } void Table::menuClear() { if (menuAlloc) delete[] popupMenu; popupMenu = NULL; } /* * ================================================================ * Table.where(int x, int y, int &row, int &column, int &resize); * ================================================================ * * Finds corresponding row and column for x and y coordinates. This function * uses Fl::event_inside() method. * * row = -1 means header and row = -2 means that coordinates don't * correspond any cell. */ void Table::where(int x, int y, int &row, int &column, int &resize) { int temp, temp2; // Inside the header if ((nCols > 0) && headerEnabled && Fl::event_inside(oX, oY, iW, headerHeight)) { row = -1; temp = leftColX + iX - hScroll->value(); // Scan visible columns until found one that matches. for (column = leftCol; column <= rightCol; column++ ) { if (header[column].hidden) continue; temp2 = temp; // Near the left border of the column header if ((x >= temp) && (x <= temp + 3)) { resize = 1; return; /* NOT REACHED */ } // Near the right border of the column header else if ((x >= (temp += header[column].width) - 3) && (x < temp)) { resize = 2; return; /* NOT REACHED */ } // Somewhere else else if ((x >= temp2) && (x < temp)) { resize = 0; return; /* NOT REACHED */ } } } // Header /* * Now the harder one. X and Y lie somewhere in the table. * Find correct row and column. */ else if ((nRows > 0) && Fl::event_inside(iX, iY, iW, iH)) { temp = topRowY; int yMod = iY - vScroll->value(); int leftX = leftColX + iX - hScroll->value(); // Scan rows for (row = topRow; row <= bottomRow; row++) { int temp2 = leftX; for (column = leftCol; column <= rightCol; column++) { if (header[column].hidden) continue; if (Fl::event_inside(temp2, temp + yMod, header[column].width, rowHeight)) return; /* NOT REACHED */ temp2 += header[column].width; } temp += rowHeight; } } row = column = -2; } void Table::FirstRow() { if (nRows == 0 || selected == 0) return; scrollTo (selected = 0); } void Table::PrevPage () { // Does it make sense to move up? if (selected > 0) { // Number of rows on the 'page' int step = iH / rowHeight; // Change selection if (selected >= step) selected -= step; else selected = 0; scrollTo(selected * rowHeight); } } void Table::PrevRow() { int newpos, oldpos; if (nRows == 0) return; selected = (selected > 0) ? selected - 1 : 0; oldpos = vScroll->value(); newpos = rowHeight * selected; if (newpos - oldpos > 0) scrollTo (oldpos); else scrollTo (newpos); } void Table::NextRow() { int newpos, oldpos, lastrow; if (nRows == 0 || selected == (nRows - 1)) return; lastrow = nRows -1; selected = (selected < lastrow) ? selected + 1 : lastrow; oldpos = vScroll->value(); newpos = rowHeight *(selected + 1) - iH; if (newpos - oldpos < 0) scrollTo (oldpos); else scrollTo (newpos); } void Table::NextPage () { if ((selected >= 0) && (selected < (nRows - 1))) { int step = iH / rowHeight; if ((selected += step) >= nRows) selected = nRows - 1; scrollTo(rowHeight * (selected + 1) - iH); } } void Table::LastRow() { if (nRows == 0) return; selected = nRows - 1; scrollTo (rowHeight * (selected + 1) - iH); } void Table::GotoRow(int n) { if (n >= 0 && (n < nRows)) { selected = n; scrollTo(rowHeight * (selected + 1) - iH); } } /* * ============================== * int Table.handle(int event); * ============================== * * FLTK internal. Handles incoming events. */ int Table::handle(int event) { int ret = 0; static int row, prev_row; int column, resize; if (event != FL_KEYDOWN) ret = Fl_Group::handle(event); /* * MAIN SWITCH */ switch (event) { /* * PUSH event */ case FL_PUSH: // Which row/column are we over? where(Fl::event_x(), Fl::event_y(), row, column, resize); switch (row) { // Push on nothing... Not interested case -2: if (selected != -1) { // selected = -1; damage(DAMAGE_ROWS); } break; // Push on header. case -1: if ((canResize) && (Fl::event_button() == 1) && (resize != 0)) { resizing = (resize == 1) ? column - 1 : column; dragX = Fl::event_x(); ret = 1; } else if ((canSort) && (Fl::event_button() == 1)) { pushed = column; damage(DAMAGE_HEADER); ret = 1; } break; // Push on cell. default: bool changed = selected != row; selected = row; // Create new selection int len = 0; char **tableRow = data[selected]; char *buffer; for (int col = 0; col < nCols; col++) len += strlen(tableRow[col]) + 1; // Create a tab separated list from data. buffer = (char*)malloc(len); strcpy(buffer, tableRow[0]); for (int col = 1; col < nCols; col++) { strcat(buffer, "\t"); strcat(buffer, tableRow[col]); } Fl::selection(*this, buffer, len); free(buffer); // Update view. damage(DAMAGE_ROWS); take_focus(); // Show popup menu if ((Fl::event_button() == 3) && (popupMenu != NULL)) { const Fl_Menu_Item *m; m = popupMenu->popup(Fl::event_x(), Fl::event_y()); if (m != NULL) m->do_callback(this, m->user_data()); ret = 1; break; } // Callback if ((Fl::event_clicks() != 0) && !changed && (when() & TABLE_WHEN_DCLICK)) { Fl::event_is_click(0); do_callback(); } else if (changed && (when() & FL_WHEN_CHANGED)) do_callback(); else if (!changed && (when() & FL_WHEN_NOT_CHANGED)) do_callback(); ret = 1; break; } // switch(row) break; /* * DRAG event */ case FL_DRAG: // Resizing... if (resizing > -1 ) { int offset = dragX - Fl::event_x(); int newWidth = header[resizing].width - offset; // Width must be at least 1. if (newWidth < 1) newWidth = 1; // Test if column really is resized. if (header[resizing].width != newWidth) { header[resizing].width = newWidth; dragX = Fl::event_x(); resized(); redraw(); } ret = 1; } else { prev_row = row; where(Fl::event_x(), Fl::event_y(), row, column, resize); if (row < 0 || pushed != -1) { ret = 1; break; } if (prev_row != row) { selected = row; damage(DAMAGE_ROWS); take_focus(); if (when() & FL_WHEN_CHANGED) do_callback(); } } break; /* * RELEASE event */ case FL_RELEASE: // Which row/column are we over? where(Fl::event_x(), Fl::event_y(), row, column, resize); // Restore cursor and end resizing. if (Fl::event_button() == 1) { fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE); if ((pushed == column) && canSort) { if (this->header[pushed].callback != NULL) (this->header[pushed].callback)(); if (this->header[pushed].comparator != NULL) { if (sortColumn == pushed) { if (ascent) ascent = false; else sortColumn = -1; } else { ascent = true; sortColumn = pushed; } sort(); } redraw(); } pushed = -1; resizing = -1; ret = 1; } // Callback. if ((row >= 0) && (when() & FL_WHEN_RELEASE)) do_callback(); break; /* * MOVE event */ case FL_MOVE: // Which row/column are we over? where(Fl::event_x(), Fl::event_y(), row, column, resize); // If near header boundary. if ((row == -1) && canResize && resize) fl_cursor(FL_CURSOR_WE, FL_BLACK, FL_WHITE); else fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE); ret = 1; break; case FL_ENTER: case FL_LEAVE: if (event == FL_LEAVE) fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE); ret = 1; break; case FL_FOCUS: case FL_UNFOCUS: if (Fl::visible_focus()) { damage(DAMAGE_ROWS); ret = 1; } break; /* * KEYDOWN event */ case FL_KEYDOWN: switch(Fl::event_key()) { case FL_Enter: if ((selected > -1) && ((when() & TABLE_WHEN_DCLICK) || (when() & FL_WHEN_ENTER_KEY))) do_callback(); ret = 1; break; case FL_Home: FirstRow(); ret = 1; break; case FL_Up: PrevRow(); ret = 1; break; case FL_Down: NextRow(); ret = 1; break; case FL_End: LastRow(); ret = 1; break; case FL_Page_Up: PrevPage (); ret = 1; break; case FL_Page_Down: NextPage (); ret = 1; break; } break; } return ret; } /* * =============================== * void Table.scrollTo(int pos); * =============================== * * Scrolls table to given position. */ void Table::scrollTo(int pos) { if (vScroll->visible() || nRows > (iH / rowHeight)) { int max = rowHeight * nRows - iH; //printf ("pos %d, max %d\n", pos, max); fflush (stdout); if (pos < 0 || max < 0) pos = 0; if (pos > max) pos = max; vScroll->Fl_Valuator::value(1.0*pos); vScroll->damage (FL_DAMAGE_ALL); vScroll->redraw (); scrolled(); } damage(DAMAGE_ROWS); if (when() & FL_WHEN_CHANGED) do_callback(); } int Table::scrollPos() const { return (int)vScroll->value(); } /* * =========================================== * void Table.sort(int column, bool ascent); * =========================================== * * Sets sortColumn and ascent and sorts table. Does not redraw. */ void Table::sort(int column, bool ascent) { if ((column < -1) || (column >= nCols)) return; sortColumn = column; this->ascent = ascent; sort(); } void Table::aSort(int start, int end, int (*compare)(const char *, const char*)) { int i, j; const char *x; char **temp; x = data[(start + end) / 2][sortColumn]; i = start; j = end; for (;;) { while ((i < end) && (compare(data[i][sortColumn], x) < 0)) i++; while ((j > 0) && (compare(data[j][sortColumn], x) > 0)) j--; while ((i < end) && (i != j) && (compare(data[i][sortColumn], data[j][sortColumn]) == 0)) i++; if (i == j) break; temp = data[i]; data[i] = data[j]; data[j] = temp; } if (start < --i) aSort(start, i, compare); if (end > ++j) aSort(j, end, compare); } void Table::dSort(int start, int end, int (*compare)(const char *, const char*)) { int i, j; const char *x; char **temp; x = data[(start + end) / 2][sortColumn]; i = start; j = end; for (;;) { while ((i < end) && (compare(data[i][sortColumn], x) > 0)) i++; while ((j > 0) && (compare(data[j][sortColumn], x) < 0)) j--; while ((i < end) && (i != j) && (compare(data[i][sortColumn], data[j][sortColumn]) == 0)) i++; if (i == j) break; temp = data[i]; data[i] = data[j]; data[j] = temp; } if (start < --i) dSort(start, i, compare); if (end > ++j) dSort(j, end, compare); } /* * ==================== * void Table.sort(); * ==================== * * Sorts table according sortColumn and ascent. Does not redraw. */ void Table::sort() { if ((sortColumn == -1) || !canSort) return; /* NOT REACHED */ toBeSorted = false; int (*compare)(const char *, const char*); // Get comparator function or set it to the default. if (this->header[sortColumn].comparator == NULL) // compare = strcasecmp; return; else compare = header[sortColumn].comparator; // Sort in descending order. if ((nRows > 1) && ascent) aSort(0, nRows - 1, compare); // Sort in ascending order. else if (nRows > 1) dSort(0, nRows - 1, compare); } /* * ==================================================== * void Table.getSort(int &sortColumn, bool &ascent); * ==================================================== * * Set sortColumn and ascent according to current sort policy. */ void Table::getSort(int &sortColumn, bool &ascent) { sortColumn = this->sortColumn; ascent = this->ascent; } /* * ===================================================== * int compareInt(const char *val1, const char *val2); * ===================================================== * * This function compares values as numbers instead of strings. Solves * problem with string sorting (eg. 1 - 10 - 11 - 12 - 2 - 3 ...). */ int compareInt(const char *val1, const char *val2) { return strtol(val1, NULL, 0) - strtol(val2, NULL, 0); } /* * ============================================================================== * void Table.setHighlighter(bool (*highliter)(int, char **, Fl_Color &color)); * ============================================================================== * * Sets highlighter function to highlighter. Highlighter is used to determine * text color in Table.drawRow(). */ void Table::setHighlighter(bool (*highlighter)(int, char **, Fl_Color *)) { this->highlighter = highlighter; } /* * ==================== * void Table.draw(); * ==================== * * FLTK internal. Called when Table widget needs to be drawn. */ void Table::draw() { int damage; if (dimensionsChanged) { dimensionsChanged = false; resized(); } if (toBeSorted) sort(); damage = Fl_Widget::damage(); // Draw children. if (damage & (FL_DAMAGE_ALL | FL_DAMAGE_CHILD)) { fl_push_clip(oX, oY, oW, oH); Fl_Group::draw(); fl_pop_clip(); } // Draw box. if (damage & FL_DAMAGE_ALL) { // Draw box. draw_box(box(), x(), y(), w(), h(), FL_GRAY); // Draw label. draw_label(); } // Draw header. int xPos = leftColX + iX - hScroll->value(); if (headerEnabled && (damage & (FL_DAMAGE_ALL | DAMAGE_HEADER)) && (nCols > 0)) { fl_push_clip(iX, oY, iW, headerHeight); drawHeader(xPos, oY); fl_pop_clip(); } // Draw all the cells. if ((damage & (FL_DAMAGE_ALL | DAMAGE_ROWS)) && (nRows > 0) && (nCols > 0)) { fl_push_clip(iX, iY, iW, iH); int yMod = iY - vScroll->value(); for (int row = topRow, rowY = topRowY; row <= bottomRow; row++, rowY += rowHeight) drawRow(row, data[row], xPos, rowY + yMod); fl_pop_clip(); } fl_push_clip(oX, oY, oW, oH); if (tableWidth < iW) fl_rectf(iX + tableWidth, oY, iW - tableWidth, oH, FL_GRAY); // Table height smaller than window? Fill remainder with rectangle if (tableHeight < iH) fl_rectf(iX, iY + tableHeight, iW, iH - tableHeight, FL_GRAY); if (vScroll->visible()) { vScroll->damage (FL_DAMAGE_ALL); vScroll->redraw(); } if (hScroll->visible()) { hScroll->damage (FL_DAMAGE_ALL); hScroll->redraw(); } // Both scrollbars? Draw little box in lower right if (vScroll->visible() && hScroll->visible()) fl_rectf(vScroll->x(), hScroll->y(), vScroll->w(), hScroll->h(), FL_GRAY); fl_pop_clip(); } /* * ================================================ * void Table.resize(int x, int y, int w, int h); * ================================================ * * FLTK internal. Called when Table widget is resized. */ void Table::resize(int x, int y, int w2, int h) { // resize the columns proportionally if the width changes if (w2 != w()) { int iw = w() - (vScroll->visible() ? vScroll->w() : 0) - 4; int iw2 = w2 - (vScroll->visible() ? vScroll->w() : 0) - 4; if (iw > 0 && iw2 > 0) { int lastcol = 0; int iw3 = 0; for (int i = 0; i < nCols - 1; i++) { if (!header[i].hidden) { header[i].width = (int)(1.0 * header[i].width * iw2 / iw + 0.5); iw3 += header[i].width; lastcol = i; } } // adjust last visible column if (iw3 < iw2) header[lastcol].width += (iw2 - iw3); if (iw3 > iw2) header[lastcol].width -= (iw3 - iw2); } } Fl_Widget::resize(x, y, w2, h); resized(); damage(FL_DAMAGE_ALL); } /* * ============================== * void Table.calcDimensions(); * ============================== * * Calculates table dimensions. */ void Table::calcDimensions() { // Calculate width and height of the table (in pixels). tableWidth = 0; for (int i = 0; i < nCols; i++) if (!header[i].hidden) tableWidth +=header[i].width; tableHeight = nRows * rowHeight; Fl_Boxtype b; iX = oX = x() + Fl::box_dx(b = box()); iY = oY = y() + Fl::box_dy(b); iW = oW = w() - Fl::box_dw(b); iH = oH = h() - Fl::box_dh(b); // Trim inner size if header enabled. if (headerEnabled) { iY += headerHeight; iH -= headerHeight; } // Hide scrollbars if window is large enough int hideV, hideH; hideV = (tableHeight <= iH), hideH = (tableWidth <= iW); if (!hideH & hideV) hideV = (tableHeight - iH - scrollbarSize) <= 0; if (!hideV & hideH) hideH = (tableWidth - iW + scrollbarSize) <= 0; if (Vscroll == always) { vScroll->show(); iW -= scrollbarSize; } else if (Vscroll == never) { vScroll->hide(); vScroll->Fl_Valuator::value(0); } else if (hideV) { vScroll->hide(); vScroll->Fl_Valuator::value(0); } else { vScroll->show(); iW -= scrollbarSize; } if (Hscroll == always) { hScroll->show(); iH -= scrollbarSize; } else if (Hscroll == never) { hScroll->hide(); hScroll->Fl_Valuator::value(0); } else if (hideH) { hScroll->hide(); hScroll->Fl_Valuator::value(0); } else { hScroll->show(); iH -= scrollbarSize; } } /* * ======================== * void Table.scrolled(); * ======================== * * Calculates visible are after scroll or adding data. */ void Table::scrolled() { int y, row, voff = vScroll->value(); // First visible row row = voff / rowHeight; topRow = (row >= nRows) ? (nRows - 1) : row; topRow = (topRow < 0) ? 0 : topRow; y = topRow * rowHeight; if ((topRow > 0) && (y > voff)) { topRow--; y -= rowHeight; } topRowY = y; // Last visible row row = (voff + iH) / rowHeight; bottomRow = (row >= nRows) ? (nRows - 1) : row; // First visible column int x, col, h = hScroll->value(); for (col = x = 0; col < nCols; col++) { if (header[col].hidden) continue; x += header[col].width; if (x >= h) { x -= header[col].width; break; } } leftCol = (col >= nCols) ? (nCols - 1) : col; leftColX = x; // Last visible column h += iW; for (; col < nCols; col++) { if (header[col].hidden) continue; x += header[col].width; if (x >= h) break; } rightCol = (col >= nCols) ? (nCols - 1) : col; } /* * ======================= * void Table.resized(); * ======================= * * Calculates scrollbar properties after resizing or adding data. */ void Table::resized() { calcDimensions(); // Calculate properties for vertical scrollbar. if (vScroll->visible()) { vScroll->bounds(0, tableHeight - iH); vScroll->resize(oX + oW - scrollbarSize, oY, scrollbarSize, oH - (hScroll->visible() ? scrollbarSize : 0)); vScroll->Fl_Valuator::value(vScroll->clamp(vScroll->value())); vScroll->slider_size(iH > tableHeight ? 1 : (float)iH / tableHeight); } // Calculate properties for horizontal scrollbar. if (hScroll->visible()) { hScroll->bounds(0, tableWidth - iW); hScroll->resize(oX, oY + oH - scrollbarSize, oW - (vScroll->visible() ? scrollbarSize : 0), scrollbarSize); hScroll->Fl_Valuator::value(hScroll->clamp(hScroll->value())); hScroll->slider_size(iW > tableWidth ? 1 : (float)iW / tableWidth); } scrolled(); dimensionsChanged = false; } /* * =========================================================== * void Table.scrollCallback(Fl_Widget *widget, void *data); * =========================================================== * * Internal callback for scrollbars. Scrolls view. */ void Table::scrollCallback(Fl_Widget *widget, void *data) { Table *me = (Table*)data; me->scrolled(); if (widget == me->vScroll) me->damage(DAMAGE_ROWS); else me->damage(DAMAGE_ROWS | DAMAGE_HEADER); } #include "re.h" inline static bool search_row(const std::vector& data, int row, int col, int ncols, fre_t& re, bool allcols) { if (unlikely(allcols)) { for (col = 0; col < ncols; col++) if (re.match(data[row][col])) return true; } else if (re.match(data[row][col])) return true; return false; } /* * ================================================================== * void Table.search(int& row, int& col, bool rev, const char* re); * ================================================================== * * Searches Table data starting at `row', in direction indicated by `rev', * for column data matching regexp `re'. Looks in all row columns if `col' * is equal to nCols, or just the specified column if 0 <= col < nCols. * Returns true if found, in which case the `row' and `col' arguments will * point to the matching data. If false is returned, the contents of * `row' and `col' are undefined. */ bool Table::search(int& row, int& col, bool rev, const char* re) { if (unlikely(col < 0 || col > nCols || row < 0 || row >= nRows)) return false; bool allcols = col == nCols; fre_t sre(re, REG_EXTENDED | REG_ICASE | REG_NOSUB); if (!sre) return false; int r = row; if (rev) { for (; row >= 0; row--) if (search_row(data, row, col, nCols, sre, allcols)) return true; for (row = nRows - 1; row > r; row--) if (search_row(data, row, col, nCols, sre, allcols)) return true; } else { for (; row < nRows; row++) if (search_row(data, row, col, nCols, sre, allcols)) return true; for (row = 0; row < r; row++) if (search_row(data, row, col, nCols, sre, allcols)) return true; } return false; } fldigi-3.21.80/src/logbook/adif_io.cxx0000664000175000017500000004174512313064025014416 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "fl_digi.h" #include "signal.h" #include "threads.h" #include "adif_io.h" #include "config.h" #include "configuration.h" #include "lgbook.h" #include "icons.h" #include "gettext.h" #include "debug.h" #include "util.h" #include "date.h" #include "logsupport.h" #include "qrunner.h" #include "timeops.h" using namespace std; #ifdef __WOE32__ static const char *szEOL = "\r\n"; #else static const char *szEOL = "\n"; #endif static const char *szEOR = ""; // These ADIF fields define the ADIF database FIELD fields[] = { // TYPE, NAME, WIDGET {FREQ, "FREQ", &btnSelectFreq}, // QSO frequency in Mhz {CALL, "CALL", &btnSelectCall}, // contacted stations CALLSIGN {MODE, "MODE", &btnSelectMode}, // QSO mode {NAME, "NAME", &btnSelectName}, // contacted operators NAME {QSO_DATE, "QSO_DATE", &btnSelectQSOdateOn}, // QSO data {QSO_DATE_OFF, "QSO_DATE_OFF", &btnSelectQSOdateOff},// QSO data OFF, according to ADIF 2.2.6 {TIME_OFF, "TIME_OFF", &btnSelectTimeOFF}, // HHMM or HHMMSS in UTC {TIME_ON, "TIME_ON", &btnSelectTimeON}, // HHMM or HHMMSS in UTC {QTH, "QTH", &btnSelectQth}, // contacted stations city {RST_RCVD, "RST_RCVD", &btnSelectRSTrcvd}, // received signal report {RST_SENT, "RST_SENT", &btnSelectRSTsent}, // sent signal report {STATE, "STATE", &btnSelectState}, // contacted stations STATE {VE_PROV, "VE_PROV", &btnSelectProvince}, // 2 letter abbreviation for Canadian Province {NOTES, "NOTES", &btnSelectNotes}, // QSO notes {QSLRDATE, "QSLRDATE", &btnSelectQSLrcvd}, // QSL received date {QSLSDATE, "QSLSDATE", &btnSelectQSLsent}, // QSL sent date {GRIDSQUARE, "GRIDSQUARE", &btnSelectLOC}, // contacted stations Maidenhead Grid Square {BAND, "BAND", &btnSelectBand}, // QSO band {CNTY, "CNTY", &btnSelectCNTY}, // secondary political subdivision, ie: county {COUNTRY, "COUNTRY", &btnSelectCountry}, // contacted stations DXCC entity name {CQZ, "CQZ", &btnSelectCQZ}, // contacted stations CQ Zone {DXCC, "DXCC", &btnSelectDXCC}, // contacted stations Country Code {QSL_VIA, "QSL_VIA", &btnSelectQSL_VIA}, // contacted stations path {IOTA, "IOTA", &btnSelectIOTA}, // Islands on the air {ITUZ, "ITUZ", &btnSelectITUZ}, // ITU zone {CONT, "CONT", &btnSelectCONT}, // contacted stations continent {MYXCHG, "MYXCHG", &btnSelectMyXchg}, // contest exchange sent {XCHG1, "XCHG1", &btnSelectXchgIn}, // contest exchange #1 / free1 in xlog {MYXCHG, "STX_STRING", &btnSelectMyXchg}, // contest exchange sent {XCHG1, "SRX_STRING", &btnSelectXchgIn}, // contest exchange #1 / free1 in xlog {SRX, "SRX", &btnSelectSerialIN}, // received serial number for a contest QSO {STX, "STX", &btnSelectSerialOUT}, // QSO transmitted serial number {TX_PWR, "TX_PWR", &btnSelectTX_pwr}, // power transmitted by this station {NUMFIELDS, "", NULL} }; // This ADIF fields is in the fldigi QSO database, but not saved in the ADIF file /* {EXPORT, "EXPORT", NULL}, // used to indicate record is to be exported */ // These ADIF fields are not in the fldigi QSO database /* {COMMENT, "COMMENT", NULL}, // comment field for QSO {ADDRESS, "ADDRESS", NULL}, // contacted stations mailing address {AGE, "AGE", NULL}, // contacted operators age in years {ARRL_SECT, "ARRL_SECT", NULL}, // contacted stations ARRL section {CONTEST_ID, "CONTEST_ID", NULL}, // QSO contest identifier {OPERATOR, "OPERATOR", NULL}, // Callsign of person logging the QSO {PFX, "PFX", NULL}, // WPA prefix {PROP_MODE, "PROP_MODE", NULL}, // propogation mode {QSL_MSG, "QSL_MSG", NULL}, // personal message to appear on qsl card {QSL_RCVD, "QSL_RCVD", NULL}, // QSL received status {QSL_SENT, "QSL_SENT", NULL}, // QSL sent status {QSL_VIA, "QSL_VIA", NULL}, // QSL via this person {RX_PWR, "RX_PWR", NULL}, // power of other station in watts {SAT_MODE, "SAT_MODE", NULL}, // satellite mode {SAT_NAME, "SAT_NAME", NULL}, // satellite name {TEN_TEN, "TEN_TEN", NULL} // ten ten # of other station }; */ static char *fastlookup = 0; static unsigned int maxlen = 0; static void initfields() { if (fastlookup) return; // may have multiple instances using common code int i = 0; while (fields[i].type != NUMFIELDS) { if (strlen(fields[i].name) > maxlen) maxlen = strlen(fields[i].name); i++; } maxlen++; fastlookup = new char[maxlen * i + 1]; fastlookup[0] = 0; i = 0; while (fields[i].type != NUMFIELDS) { strcat(fastlookup, fields[i].name); unsigned int n = maxlen - strlen(fastlookup) % maxlen; if (n > 0 && n < maxlen) for (unsigned int j = 0; j < n; j++) strcat(fastlookup, " "); i++; } } static inline int findfield( char *p ) { if (strncasecmp (p, "EOR>", 4) == 0 || !maxlen) return -1; char *pos; char *p1 = strchr(p, ':'); char *p2 = strchr(p, '>'); if (p1 && p2) { if (p1 < p2) { pos = p; do { *pos = toupper(*pos); } while (++pos < p1); *p1 = 0; pos = strcasestr(fastlookup, p); *p1 = ':'; if (pos) return fields[(pos - fastlookup) / maxlen].type; } } return -2; //search key not found } int cAdifIO::instances = 0; cAdifIO::cAdifIO () { initfields(); instances++; } cAdifIO::~cAdifIO() { if (--instances == 0) { delete [] fastlookup; fastlookup = 0; } } void cAdifIO::fillfield (int fieldnum, char *buff) { char *p1 = strchr(buff, ':'); char *p2 = strchr(buff, '>'); if (!p1 || !p2 || p2 < p1) return; // bad ADIF specifier ---> no ':' after field name p1++; int fldsize = 0; while (p1 != p2) { if (*p1 >= '0' && *p1 <= '9') { fldsize = fldsize * 10 + *p1 - '0'; } p1++; } if ((fieldnum == TIME_ON || fieldnum == TIME_OFF) && fldsize < 6) { string tmp = ""; tmp.assign(p2+1, fldsize); while (tmp.length() < 6) tmp += '0'; adifqso->putField(fieldnum, tmp.c_str(), 6); } else adifqso->putField (fieldnum, p2+1, fldsize); } static void write_rxtext(const char *s) { ReceiveText->addstr(s); } void cAdifIO::do_readfile(const char *fname, cQsoDb *db) { long filesize = 0; char *buff; int found; LOG_INFO("Reading %s", fname); // open the adif file FILE *adiFile = fopen (fname, "r"); if (adiFile == NULL) { LOG_INFO("Cannot open %s", fname); return; } // determine its size for buffer creation fseek (adiFile, 0, SEEK_END); filesize = ftell (adiFile); if (filesize == 0) { LOG_INFO(_("Empty ADIF logbook file %s"), fl_filename_name(fname)); return; } buff = new char[filesize + 1]; static char szmsg[100]; static char szmsg2[100]; snprintf(szmsg, sizeof(szmsg), "Reading %ld bytes from %s", filesize, fl_filename_name(fname)); REQ(write_rxtext, "\n*** "); REQ(write_rxtext, szmsg); LOG_INFO("%s", szmsg); // read the entire file into the buffer fseek (adiFile, 0, SEEK_SET); int retval = fread (buff, filesize, 1, adiFile); fclose (adiFile); if (retval != 1) { LOG_ERROR(_("Error reading %s"), fl_filename_name(fname)); return; } // relaxed file integrity test to all importing from non conforming log programs if (strcasestr(buff, "clearDatabase(); return; } struct timespec t0, t1; #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t0); #else clock_gettime(CLOCK_REALTIME, &t0); #endif char *p1 = buff, *p2; if (*p1 != '<') { // yes, skip over header to start of records p1 = strchr(buff, '<'); while (strncasecmp (p1+1,"EOH>", 4) != 0) { p1 = strchr(p1+1, '<'); // find next <> field } if (!p1) { delete [] buff; strcpy(szmsg2, "Corrupt ADIF file ***"); REQ(write_rxtext, "\n*** "); REQ(write_rxtext, szmsg2); REQ(write_rxtext, "\n"); LOG_ERROR("%s", szmsg2); return; // must not be an ADIF compliant file } p1 += 1; } p2 = strchr(p1,'<'); // find first ADIF specifier adifqso = 0; while (p2) { found = findfield(p2+1); if (found > -1) { if (!adifqso) adifqso = db->newrec(); // need new record in db fillfield (found, p2+1); } else if (found == -1) { // reached; adifqso = 0; } p1 = p2 + 1; p2 = strchr(p1,'<'); } delete [] buff; #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t1); #else clock_gettime(CLOCK_REALTIME, &t1); #endif t0 = t1 - t0; float t = (t0.tv_sec + t0.tv_nsec/1e9); snprintf(szmsg2, sizeof(szmsg2), "Read %d records in %4.2f seconds", db->nbrRecs(), t); REQ(write_rxtext, "\n*** "); REQ(write_rxtext, szmsg2); REQ(write_rxtext, "\n"); LOG_INFO("%s", szmsg2); if (db == &qsodb) REQ(adif_read_OK); } static const char *adifmt = "<%s:%d>"; // write ALL or SELECTED records to the designated file int cAdifIO::writeFile (const char *fname, cQsoDb *db) { string ADIFHEADER; ADIFHEADER = "File: %s"; ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append(""); ADIFHEADER.append(szEOL); // open the adif file cQsoRec *rec; string sFld; adiFile = fopen (fname, "w"); if (!adiFile) return 1; fprintf (adiFile, ADIFHEADER.c_str(), fl_filename_name(fname), strlen(ADIF_VERS), ADIF_VERS, strlen(PACKAGE_NAME), PACKAGE_NAME, strlen(PACKAGE_VERSION), PACKAGE_VERSION); for (int i = 0; i < db->nbrRecs(); i++) { rec = db->getRec(i); if (rec->getField(EXPORT)[0] == 'E') { int j = 0; while (fields[j].type != NUMFIELDS) { if (strcmp(fields[j].name,"MYXCHG") == 0) { j++; continue; } if (strcmp(fields[j].name,"XCHG1") == 0) { j++; continue; } if (fields[j].btn != NULL) if ((*fields[j].btn)->value()) { sFld = rec->getField(fields[j].type); if (!sFld.empty()) fprintf(adiFile, adifmt, fields[j].name,//->c_str(), sFld.length()); fprintf(adiFile, "%s", sFld.c_str()); } j++; } rec->putField(EXPORT,""); db->qsoUpdRec(i, rec); fprintf(adiFile, "%s", szEOR); fprintf(adiFile, "%s", szEOL); } } fclose (adiFile); return 0; } // write ALL records to the common log //====================================================================== // thread support writing database //====================================================================== pthread_t* ADIF_RW_thread = 0; pthread_mutex_t ADIF_RW_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t ADIF_RW_cond = PTHREAD_COND_INITIALIZER; static void ADIF_RW_init(); static string adif_file_image; static string adif_file_name; static string records; static string record; static char recfield[200]; static int nrecs; static bool ADIF_READ = false; static bool ADIF_WRITE = false; static cQsoDb *adif_db; static cAdifIO *adifIO = 0; void cAdifIO::readFile (const char *fname, cQsoDb *db) { ENSURE_THREAD(FLMAIN_TID); if (!ADIF_RW_thread) { ADIF_RW_init(); MilliSleep(50); } pthread_mutex_lock(&ADIF_RW_mutex); adif_file_name = fname; adif_db = db; adifIO = this; ADIF_READ = true; pthread_cond_signal(&ADIF_RW_cond); pthread_mutex_unlock(&ADIF_RW_mutex); } static cQsoDb *adifdb = 0; static cQsoDb *wrdb = 0; static struct timespec t0, t1; int cAdifIO::writeLog (const char *fname, cQsoDb *db, bool immediate) { ENSURE_THREAD(FLMAIN_TID); if (!ADIF_RW_thread) ADIF_RW_init(); #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t0); #else clock_gettime(CLOCK_REALTIME, &t0); #endif if (!immediate) { pthread_mutex_lock(&ADIF_RW_mutex); adif_file_name = fname; adifIO = this; ADIF_WRITE = true; if (wrdb) delete wrdb; wrdb = new cQsoDb(db); adifdb = wrdb; pthread_cond_signal(&ADIF_RW_cond); pthread_mutex_unlock(&ADIF_RW_mutex); } else { adif_file_name = fname; adifdb = db; do_writelog(); } return 1; } void cAdifIO::do_writelog() { string ADIFHEADER; ADIFHEADER = "File: %s"; ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append(""); ADIFHEADER.append(szEOL); Ccrc16 checksum; string s_checksum; adiFile = fopen (adif_file_name.c_str(), "w"); if (!adiFile) { LOG_ERROR("Cannot write to %s", adif_file_name.c_str()); if (wrdb) { delete wrdb; wrdb = 0; } return; } LOG_INFO("Writing %s", adif_file_name.c_str()); string sFld; cQsoRec *rec; records.clear(); for (int i = 0; i < adifdb->nbrRecs(); i++) { rec = adifdb->getRec(i); record.clear(); int j = 0; while (fields[j].type != NUMFIELDS) { if (strcmp(fields[j].name,"MYXCHG") == 0) { j++; continue; } if (strcmp(fields[j].name,"XCHG1") == 0) { j++; continue; } sFld = rec->getField(fields[j].type); if (!sFld.empty()) { snprintf(recfield, sizeof(recfield), adifmt, fields[j].name, sFld.length()); record.append(recfield).append(sFld); } j++; } record.append(szEOR); record.append(szEOL); records.append(record); adifdb->qsoUpdRec(i, rec); } nrecs = adifdb->nbrRecs(); s_checksum = checksum.scrc16(records); fprintf (adiFile, ADIFHEADER.c_str(), fl_filename_name(adif_file_name.c_str()), strlen(ADIF_VERS), ADIF_VERS, strlen(PACKAGE_NAME), PACKAGE_NAME, strlen(PACKAGE_VERSION), PACKAGE_VERSION, s_checksum.length(), s_checksum.c_str() ); fprintf (adiFile, "%s", records.c_str()); fclose (adiFile); if (wrdb) { delete wrdb; wrdb = 0; } #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t1); #else clock_gettime(CLOCK_REALTIME, &t1); #endif t0 = t1 - t0; float t = (t0.tv_sec + t0.tv_nsec/1e9); static char szmsg[50]; snprintf(szmsg, sizeof(szmsg), "%d records in %4.2f seconds", adifdb->nbrRecs(), t); LOG_INFO("%s", szmsg); return; } //====================================================================== // thread to support writing database in a separate thread //====================================================================== static void *ADIF_RW_loop(void *args); static bool ADIF_RW_EXIT = false; static void *ADIF_RW_loop(void *args) { SET_THREAD_ID(ADIF_RW_TID); for (;;) { pthread_mutex_lock(&ADIF_RW_mutex); pthread_cond_wait(&ADIF_RW_cond, &ADIF_RW_mutex); pthread_mutex_unlock(&ADIF_RW_mutex); if (ADIF_RW_EXIT) return NULL; if (ADIF_WRITE && adifIO) { adifIO->do_writelog(); ADIF_WRITE = false; } else if (ADIF_READ && adifIO) { adifIO->do_readfile(adif_file_name.c_str(), adif_db); ADIF_READ = false; } } return NULL; } void ADIF_RW_close(void) { ENSURE_THREAD(FLMAIN_TID); if (!ADIF_RW_thread) return; pthread_mutex_lock(&ADIF_RW_mutex); ADIF_RW_EXIT = true; pthread_cond_signal(&ADIF_RW_cond); pthread_mutex_unlock(&ADIF_RW_mutex); pthread_join(*ADIF_RW_thread, NULL); delete ADIF_RW_thread; ADIF_RW_thread = 0; } static void ADIF_RW_init() { ENSURE_THREAD(FLMAIN_TID); if (ADIF_RW_thread) return; LOG_INFO("%s","Starting logbook r/w thread"); ADIF_RW_thread = new pthread_t; ADIF_RW_EXIT = false; if (pthread_create(ADIF_RW_thread, NULL, ADIF_RW_loop, NULL) != 0) { LOG_PERROR("pthread_create"); return; } // MilliSleep(50); // increased from 10 for Win7 testing } fldigi-3.21.80/src/logbook/date.cxx0000664000175000017500000001570112313064025013732 00000000000000// ---------------------------------------------------------------------------- // // Date.cxx date class for Fast Light Took Kit // // Copyright (C) 1998 David Freese // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "date.h" using namespace std; const int Date::mdays[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; const int Date::jdays[2][13] = { { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }, { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 } }; const char *Date::month_name[] = { "January", "Febuary", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; void Date::today() { time_t t; struct tm *now; time( &t ); now = localtime( &t ); year = now->tm_year + 1900; month = now->tm_mon + 1; day = now->tm_mday; } Date::Date() { today(); fmt = 0; } Date::Date( int m, int d, int y ) { setDate( m, d, y ); fmt = 1; } void Date::setDate( int mm, int dd, int yy ) { if( isvalid( mm, dd, yy ) ) { year = yy; month = mm; day = dd; } else today(); } void Date::setDate( Date &dt ) { year = dt.year; month = dt.month; day = dt.day; } void Date::setFormat( int iFmt ) { fmt = iFmt; } void Date::Year( int y ) { year = y; } int Date::Year() { return year; } void Date::Month( int m ) { month = m; } int Date::Month() { return month; } void Date::Day( int d ) { day = d; } int Date::Day() { return day; } bool Date::leapYear( int y ) { if( y % 400 == 0 || ( y % 100 != 0 && y % 4 == 0 ) ) return true; return false; } bool Date::isvalid( int m, int d, int y ) { if( y > 2035 ) return false; if( m < 1 || m > 12 ) return false; if( d < 1 ) return false; if( leapYear( y ) ){ if( m == 2 && d > 29 ) return false; else return true; } if( d > mdays[m] ) return false; return true; } int Date::daysinmonth (int month, int leap) { /* Validate the month. */ if (month < JANUARY || month > DECEMBER) return -1; /* Return 28, 29, 30, or 31 based on month/leap. */ switch (month) { case FEBRUARY: return leap ? 29 : 28; default: return mdays[month]; } } int Date::dayofyear (int year, int mon, int mday) { /* Return day of year. */ return mday + jdays[isleapyear (year) ? 1 : 0][mon]; } int Date::dayofepoch (int year, int mon, int mday) { int doe; int era, cent, quad, rest; /* break down the year into 400, 100, 4, and 1 year multiples */ rest = year - 1; quad = rest / 4; rest %= 4; cent = quad / 25; quad %= 25; era = cent / 4; cent %= 4; /* set up doe */ doe = dayofyear (year, mon, mday); doe += era * (400 * 365 + 97); doe += cent * (100 * 365 + 24); doe += quad * (4 * 365 + 1); doe += rest * 365; return doe; } int Date::dayofweek (int year, int mon, int mday) { return dayofepoch (year, mon, mday) % 7; } void Date::previous_month () { if (month == 1) { month = 12; year--; } else month--; while ((day >= 1) && (!datevalid ())) day--; } void Date::next_month () { if (month == 12) { month = 1; year++; } else month++; while ((day >= 1) && (!datevalid ())) day--; } void Date::previous_year () { if (month == 2 && day == 29) day = 28; year--; } void Date::next_year () { if (month == 2 && day == 29) day = 28; year++; } char *Date::szDate (int fmt) { static char temp[20]; char szMonth[10]; switch (fmt) { case 1 : snprintf (temp, sizeof(temp), "%02d/%02d/%02d", month, day, year > 1999 ? year - 2000 : year - 1900); break; case 2 : snprintf (temp, sizeof(temp), "%4d%02d%02d", year, month, day); break; case 3 : snprintf (temp, sizeof(temp), "%s %2d, %4d", month_name[month - 1], day, year); break; case 4 : strcpy (szMonth, month_name [month - 1]); szMonth[3] = 0; snprintf (temp, sizeof(temp), "%s %2d, %4d", szMonth, day, year); break; case 5 : strcpy (szMonth, month_name [month - 1]); szMonth[3] = 0; snprintf (temp, sizeof(temp), "%02d %s %4d", day, szMonth, year); break; case 0 : default : snprintf (temp, sizeof(temp), "%02d/%02d/%04d", month, day, year); break; } return temp; } char *Date::szDate () { return szDate (fmt); } // operator functions ostream &operator<<( ostream &output, Date &d ) { output << d.szDate (); return output; } bool Date::endOfMonth( int d ) { if( month == 2 && leapYear( year ) ) return (d == 29 ); // last day of Feb in leap year else return (d == mdays[ month ] ); } void Date::helpIncrement() { if( endOfMonth( day ) && month == 12 ) { // end year day = 1; month = 1; ++year; } else if ( endOfMonth( day ) ) { day = 1; ++month; } else ++day; } Date &Date::operator++() { helpIncrement(); return *this; // reference return to create an lvalue } Date Date::operator++( int ) { Date temp = *this; helpIncrement(); return temp; // return non-increment, saved temporary object } const Date &Date::operator+=( int ndays ) { for( int i = 0; i < ndays; i++ ) helpIncrement(); return *this; // enables cascading } bool Date::operator==( const Date &d ) { if( this->year != d.year ) return false; if( this->month != d.month ) return false; if( this->day != d.day ) return false; return true; } bool Date::operator!=( const Date &d ) { return ( !( *this == d ) ); } bool Date::operator<( const Date &d ) { if( this->year < d.year ) return true; if( this->year > d.year ) return false; if( this->month < d.month ) return true; if( this->month > d.month ) return false; if( this->day < d.day ) return true; return false; } bool Date::operator>( const Date &d ) { if( *this < d ) return false; if( *this == d ) return false; return true; } void Date::operator=( const Date &d ) { this->year = d.year; this->month = d.month; this->day = d.day; } double Date::dJulian () { int DaysInYear = 365; if (leapYear ()) DaysInYear++; return ( year + 1.0 * (dayofyear (year, month, day) - 1) / DaysInYear); } fldigi-3.21.80/src/logbook/calendar.cxx0000664000175000017500000003062512313064025014570 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "pixmaps.h" #include "calendar.h" void popcal_cb (Fl_Widget *v, long d); static void fl_calendar_button_cb (Fl_Button *a, void *b) { long j=0; Fl_Calendar *c = (Fl_Calendar *)b; Fl_Button *sb; int numdays = c->daysinmonth () + 1; for (int i=1; i < numdays; i++) { sb = c->day_button(i); sb->color (52); if (a == sb) { c->Day (i); j = i; sb->color (sb->selection_color()); if (c->target) { ((Fl_Input2 *)(c->target))->value(c->szDate(c->calfmt)); (c->target)->redraw(); } } } c->redraw(); c->do_callback(c, j); } void Fl_Calendar_Base::setTarget (Fl_Widget *tgt) { target = tgt; } Fl_Calendar_Base::Fl_Calendar_Base (int x, int y, int w, int h, const char *l) : Fl_Group (x, y, w, h, l), Date () { int i; for (i = 0; i<(7*6); i++) { days[i] = new Fl_Button ((w/7)*(i%7) + x, (h/6)*(i/7) + y, (w/7), (h/6)); days[i]->down_box (FL_THIN_DOWN_BOX); days[i]->labelsize (10); days[i]->box (FL_THIN_UP_BOX); days[i]->color (52); days[i]->callback ((Fl_Callback*)&fl_calendar_button_cb, (void *)this); } calfmt = 0; } void Fl_Calendar_Base::csize (int cx, int cy, int cw, int ch) { int i; for (i = 0; i<(7*6); i++) { days[i]->resize ((cw/7)*(i%7) + cx, (ch/6)*(i/7) + cy, (cw/7), (ch/6)); } } void Fl_Calendar_Base::update () { int dow = dayofweek (Year(), Month(), 1); int dim = daysinmonth (Month(), isleapyear (Year())); int i; for (i=0; ihide (); } for (i=(dim+dow); i<(6*7); i++) { days[i]->hide (); } for (i=dow; i<(dim+dow); i++) { char t[8]; snprintf (t, sizeof(t), "%d", (i-dow+1)); days[i]->label (strdup(t)); days[i]->color (52); if ((i-dow+1) == Day()) days[i]->color (selection_color()); days[i]->show (); } } Fl_Button * Fl_Calendar_Base::day_button (int i) { if ((i > 0) && (i <= daysinmonth ())) return days[i + dayofweek (Year(), Month(), 1) - 1]; return 0; } static void fl_calendar_prv_month_cb (Fl_Button *, void *b) { Fl_Calendar *c = (Fl_Calendar *)b; c->previous_month (); c->do_callback(c, (long)0); } static void fl_calendar_nxt_month_cb (Fl_Button *, void *b) { Fl_Calendar *c = (Fl_Calendar *)b; c->next_month (); c->do_callback(c, (long)0); } static void fl_calendar_prv_year_cb (Fl_Button *, void *b) { Fl_Calendar *c = (Fl_Calendar *)b; c->previous_year (); c->do_callback(c, (long)0); } static void fl_calendar_nxt_year_cb (Fl_Button *, void *b) { Fl_Calendar *c = (Fl_Calendar *)b; c->next_year (); c->do_callback(c, (long)0); } Fl_Calendar::Fl_Calendar (int x, int y, int w, int h, const char *l) : Fl_Calendar_Base (x, y, w, h, l) { int i, bw; for (i = 0; i<7; i++) { // weekdays[i] = new Fl_Button ((w/7)*(i%7) + x, weekdays[i] = new Fl_Box ((w/7)*(i%7) + x, (h/8)*((i/7)+1) + y, (w/7), (h/8)); weekdays[i]->box (FL_THIN_UP_BOX); weekdays[i]->labelsize (10); weekdays[i]->color (52); } weekdays[SUNDAY]->label ("S"); weekdays[MONDAY]->label ("M"); weekdays[TUESDAY]->label ("T"); weekdays[WEDNESDAY]->label ("W"); weekdays[THURSDAY]->label ("T"); weekdays[FRIDAY]->label ("F"); weekdays[SATURDAY]->label ("S"); bw = w/10 < 16 ? 16 : w/10; prv_year = new Fl_Button (x, y, bw, (h/8), "@<<"); prv_year->box (FL_THIN_UP_BOX); prv_year->labeltype (FL_SYMBOL_LABEL); prv_year->labelsize (10); prv_year->down_box (FL_THIN_DOWN_BOX); prv_year->callback ((Fl_Callback*)&fl_calendar_prv_year_cb, (void *)this); prv_month = new Fl_Button (x + bw, y, bw, (h/8), "@<"); prv_month->box (FL_THIN_UP_BOX); prv_month->labeltype (FL_SYMBOL_LABEL); prv_month->labelsize (10); prv_month->down_box (FL_THIN_DOWN_BOX); prv_month->callback ((Fl_Callback*)&fl_calendar_prv_month_cb, (void *)this); nxt_month = new Fl_Button (x + w - 2*bw, y, bw, (h/8), "@>"); nxt_month->box (FL_THIN_UP_BOX); nxt_month->labeltype (FL_SYMBOL_LABEL); nxt_month->labelsize (10); nxt_month->down_box (FL_THIN_DOWN_BOX); nxt_month->callback ((Fl_Callback*)&fl_calendar_nxt_month_cb, (void *)this); nxt_year = new Fl_Button (x + w - bw, y, bw, (h/8), "@>>"); nxt_year->box (FL_THIN_UP_BOX); nxt_year->labeltype (FL_SYMBOL_LABEL); nxt_year->labelsize (10); nxt_year->down_box (FL_THIN_DOWN_BOX); nxt_year->callback ((Fl_Callback*)&fl_calendar_nxt_year_cb, (void *)this); // caption = new Fl_Button (x + (w/10)*2, y, (6*w/10), (h/8)); caption = new Fl_Box (x + 2*bw, y, w - 4*bw, (h/8)); caption->box (FL_THIN_UP_BOX); caption->labeltype (FL_SYMBOL_LABEL); caption->labelfont (1); if (bw < 20) caption->labelsize (9); else caption->labelsize (11); // caption->down_box (FL_THIN_DOWN_BOX); Fl_Calendar_Base::csize (x, y + (2*h/8), w, (6*h/8)); target = 0; update (); } void Fl_Calendar::csize (int cx, int cy, int cw, int ch) { int i; for (i = 0; i<7; i++) { // weekdays[i] = new Fl_Button ((cw/7)*(i%7) + cx, weekdays[i] = new Fl_Box ((cw/7)*(i%7) + cx, (ch/8)*((i/7)+1) + cy, (cw/7), (ch/8)); } prv_month->resize (cx + (cw/10), cy, (cw/10), (ch/8)); nxt_month->resize (cx + (cw/10)*8, cy, (cw/10), (ch/8)); prv_year->resize (cx, cy, (cw/10), (ch/8)); nxt_year->resize (cx + (cw/10)*9, cy, (cw/10), (ch/8)); caption->resize (cx + (cw/10)*2, cy, (cw/10)*6, (ch/8)); Fl_Calendar_Base::csize (cx, cy + (2*ch/8), cw, (6*ch/8)); } void Fl_Calendar::update () { int dow = dayofweek (Year(), Month(), 1); int dim = daysinmonth (Month(), isleapyear (Year())); int i; for (i=dow; i<(dim+dow); i++) { char t[8]; snprintf (t, sizeof(t), "%d", (i-dow+1)); days[i]->label (strdup(t)); } char tmp[32]; snprintf (tmp, sizeof(tmp), "%s %d", month_name[Month()-1], Year()); Fl_Calendar_Base::update (); if (caption->label ()) free ((void *) caption->label ()); caption->label (strdup(tmp)); redraw (); } void Fl_Calendar::today () { Date::today(); update (); } void Fl_Calendar::previous_month () { Date::previous_month(); update (); } void Fl_Calendar::next_month () { Date::next_month(); update (); } void Fl_Calendar::previous_year () { Date::previous_year(); update (); } void Fl_Calendar::next_year () { Date::next_year(); update (); } void Fl_Calendar::setDate(int m, int d, int y) { Date::setDate(m,d,y); } int Fl_Calendar::handle (int event) { int m, d, y, o, md; switch (event) { case FL_FOCUS: case FL_UNFOCUS: return 1; case FL_KEYBOARD: m = Month (); d = Day (); y = Year (); switch(Fl::event_key ()) { case FL_Enter: do_callback(this, d); return 1; break; case FL_Up: o = -7; break; case FL_Down: o = 7; break; case FL_Right: o = 1; break; case FL_Left: o = -1; break; case FL_Page_Up: previous_month (); return 1; case FL_Page_Down: next_month (); return 1; default: return Fl_Group::handle (event); } if (datevalid (y, m, d + o)) setDate (m, d + o, y); else { if (o < 0) { previous_month (); m = Month (); y = Year (); md = daysinmonth (m, isleapyear (y)); d = d + o + md; setDate (m, d, y); } else { md = daysinmonth (m, isleapyear (y)); next_month (); m = Month (); y = Year (); d = d + o - md; setDate (m, d, y); } } return 1; } return Fl_Group::handle (event); } // Popup Calendar class Fl_PopCal::Fl_PopCal (int X, int Y, int W, int H, Fl_Input2 * tgt) : Fl_Window (X, Y, W, H, "") { target = tgt; clear_border(); box(FL_UP_BOX); // popcal = new Fl_Calendar(2, 2); popcal = new Fl_Calendar(2, 2, W-4, H-4); popcal->callback ( (Fl_Callback*)popcal_cb); end(); } Fl_PopCal::~Fl_PopCal () { } void Fl_PopCal::popcalfmt (int i) { popcalfmt_ = i; } int Fl_PopCal::popcalfmt () { return popcalfmt_; } void Fl_PopCal::setDate (int m, int d, int y) { popcal->setDate (m,d,y); popcal->update(); } int Fl_PopCal::handle(int event) { int ex = Fl::event_x_root(), ey = Fl::event_y_root(); if (event == FL_PUSH) { if ( ex < x() || ex > (x() + w()) || ey < y() || ey > (y() + h()) ) { pophide(); return 1; } } if (Fl_Group::handle(event)) return 1; return 0; } void Fl_PopCal::popposition (int x, int y) { position (x, y); } void Fl_PopCal::popshow () { show (); Fl::grab(this); } void Fl_PopCal::pophide () { hide (); Fl::release(); } void Fl_PopCal::popcal_cb_i (Fl_Widget *v, long d) { int ey = Fl::event_y_root(); Fl_PopCal *me = (Fl_PopCal *)(v->parent()); Fl_Input2 *tgt = me->target; if (ey > me->y() + 40) { if (d && tgt) tgt->value (((Fl_Calendar *)v)->szDate (me->popcalfmt_)); me->pophide(); } return; } void popcal_cb (Fl_Widget *v, long d) { ((Fl_PopCal *)(v))->popcal_cb_i (v, d); return; } void Fl_DateInput::fl_popcal() { Fl_Widget *who = this, *parent; int xpos = who->x(), ypos = who->h() + who->y(); int w = who->w(), h; int m = 0, d = 0, y = 0; w = w < 140 ? 140 : w; w = w - (w % 7); h = 8*(w/7); w += 4; h += 4; parent = who; while (parent) { who = parent; parent = parent->parent(); if (parent == 0) { xpos += who->x(); ypos += who->y(); } } if (!Cal) // Cal = new Fl_PopCal(xpos, ypos, 7*20+4, 8*20+4, Input); Cal = new Fl_PopCal(xpos, ypos, w, h, Input); else Cal->popposition(xpos, ypos); if (popcalfmt_ < 3) { switch (popcalfmt_) { case 0: case 1: sscanf(Input->value(), "%d/%d/%d", &m, &d, &y); break; case 2: default: sscanf(Input->value(),"%4d%2d%2d", &y, &m, &d); break; } if (y < 10) y+=2000; if (y < 100) y+=1900; Cal->setDate (m,d,y); } Cal->popcalfmt (popcalfmt_); Cal->popshow(); return; } void btnDateInput_cb (Fl_Widget *v, void *d) { ((Fl_DateInput *)(v->parent()))->fl_popcal (); return; } Fl_DateInput::Fl_DateInput (int X,int Y,int W,int H, const char *L) : Fl_Group (X, Y, W, H, 0) { Btn = new Fl_Button (X + W - H, Y, H, H); (new Fl_Pixmap (time_icon))->label (Btn); Btn->callback ((Fl_Callback *)btnDateInput_cb, 0); Input = new Fl_Input2 (X, Y, W-H, H, L); popcalfmt_ = 0; Cal = 0; end(); } void Fl_DateInput::align (Fl_Align how) { Input->align(how); } // DateInput value is contained in the Input widget void Fl_DateInput::value( const char *s ) { Input->value (s); } const char *Fl_DateInput::value() { return (Input->value ()); } void Fl_DateInput::textfont(int tf) { Input->textfont (tf); } void Fl_DateInput::textsize(int sz) { Input->textsize (sz); } void Fl_DateInput::textcolor(Fl_Color c) { Input->textcolor(c); } void Fl_DateInput::color(Fl_Color c) { Input->color(c); } void Fl_DateInput::labelfont(int fnt) { Input->labelfont(fnt); } void Fl_DateInput::labelsize(int size) { Input->labelsize(size); } void Fl_DateInput::labelcolor(int clr) { Input->labelcolor(clr); } void Fl_DateInput::format (int fmt) { switch (fmt) { case 0: case 1: case 2: case 3: case 4: popcalfmt_ = fmt; break; default : popcalfmt_ = 0; } } void Fl_DateInput::take_focus() { Input->take_focus(); } fldigi-3.21.80/src/logbook/logsupport.cxx0000664000175000017500000012071012313332157015234 00000000000000// ---------------------------------------------------------------------------- // logsupport.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "main.h" #include "trx.h" #include "debug.h" #include "macros.h" #include "status.h" #include "date.h" #include "logger.h" #include "adif_io.h" #include "textio.h" #include "logbook.h" #include "rigsupport.h" #include "fl_digi.h" #include "fileselect.h" #include "configuration.h" #include "main.h" #include "locator.h" #include "icons.h" #include "gettext.h" #include "qrunner.h" #include "flmisc.h" #include #include using namespace std; cQsoDb qsodb; cAdifIO adifFile; cTextFile txtFile; string logbook_filename; enum sorttype {NONE, SORTCALL, SORTDATE, SORTFREQ, SORTMODE}; sorttype lastsort = SORTDATE; bool callfwd = true; bool modefwd = true; bool freqfwd = true; void restore_sort(); // convert to and from "00:00:00" <=> "000000" const char *timeview(const char *s) { static char ds[9]; int len = strlen(s); strcpy(ds, "00:00:00"); if (len < 4) return ds; ds[0] = s[0]; ds[1] = s[1]; ds[3] = s[2]; ds[4] = s[3]; if (len < 6) return ds; ds[6] = s[4]; ds[7] = s[5]; return ds; } const char *timestring(const char *s) { static char ds[7]; int len = strlen(s); if (len <= 4) return s; ds[0] = s[0]; ds[1] = s[1]; ds[2] = s[3]; ds[3] = s[4]; if (len < 8) { ds[4] = ds[5] = '0'; ds[6] = 0; return ds; } ds[4] = s[6]; ds[5] = s[7]; ds[6] = 0; return ds; } const char *timeview4(const char *s) { static char ds[6]; int len = strlen(s); strcpy(ds, "00:00"); if (len < 5) return ds; ds[0] = s[0]; ds[1] = s[1]; ds[3] = s[2]; ds[4] = s[3]; return ds; } const char *time4(const char *s) { static char ds[5]; int len = strlen(s); if (len <= 4) return ds; memset(ds, 0, 5); strncpy(ds, s, 4); return ds; } void Export_CSV() { if (chkExportBrowser->nchecked() == 0) return; cQsoRec *rec; string title = _("Export to CSV file"); string filters = "CSV\t*.csv"; #ifdef __APPLE__ filters.append("\n"); #endif const char* p = FSEL::saveas( title.c_str(), filters.c_str(), "export.csv"); if (!p) return; for (int i = 0; i < chkExportBrowser->FLTK_nitems(); i++) { if (chkExportBrowser->checked(i + 1)) { rec = qsodb.getRec(i); rec->putField(EXPORT, "E"); qsodb.qsoUpdRec (i, rec); } } string sp = p; if (sp.find(".csv") == string::npos) sp.append(".csv"); txtFile.writeCSVFile(sp.c_str(), &qsodb); } void Export_TXT() { if (chkExportBrowser->nchecked() == 0) return; cQsoRec *rec; string title = _("Export to fixed field text file"); string filters = "TEXT\t*.txt"; #ifdef __APPLE__ filters.append("\n"); #endif const char* p = FSEL::saveas( title.c_str(), filters.c_str(), "export.txt"); if (!p) return; for (int i = 0; i < chkExportBrowser->FLTK_nitems(); i++) { if (chkExportBrowser->checked(i + 1)) { rec = qsodb.getRec(i); rec->putField(EXPORT, "E"); qsodb.qsoUpdRec (i, rec); } } string sp = p; if (sp.find(".txt") == string::npos) sp.append(".txt"); txtFile.writeTXTFile(p, &qsodb); } void Export_ADIF() { if (chkExportBrowser->nchecked() == 0) return; cQsoRec *rec; string title = _("Export to ADIF file"); string filters; string defname; filters.assign("ADIF\t*.").append(ADIF_SUFFIX); #ifdef __APPLE__ filters.append("\n"); #endif defname.assign("export.").append(ADIF_SUFFIX); const char* p = FSEL::saveas( title.c_str(), filters.c_str(), defname.c_str()); if (!p) return; for (int i = 0; i < chkExportBrowser->FLTK_nitems(); i++) { if (chkExportBrowser->checked(i + 1)) { rec = qsodb.getRec(i); rec->putField(EXPORT, "E"); qsodb.qsoUpdRec (i, rec); } } string sp = p; if (sp.find("." ADIF_SUFFIX) == string::npos) sp.append("." ADIF_SUFFIX); adifFile.writeFile (sp.c_str(), &qsodb); } static savetype export_to = ADIF; void Export_log() { if (export_to == ADIF) Export_ADIF(); else if (export_to == CSV) Export_CSV(); else Export_TXT(); } void saveLogbook() { if (!qsodb.isdirty()) return; if (progdefaults.NagMe) if (!fl_choice2(_("Save changed Logbook?"), _("No"), _("Yes"), NULL)) return; cQsoDb::reverse = false; qsodb.SortByDate(progdefaults.sort_date_time_off); qsodb.isdirty(0); restore_sort(); adifFile.writeLog (logbook_filename.c_str(), &qsodb); } static void dxcc_entity_cache_clear(void); static void dxcc_entity_cache_add(cQsoRec* r); static void dxcc_entity_cache_rm(cQsoRec* r); static void dxcc_entity_cache_add(cQsoDb& db); void cb_mnuNewLogbook(Fl_Menu_* m, void* d){ if (!fl_choice2(_("Create New Logbook?"), _("No"), _("Yes"), NULL)) return; saveLogbook(); logbook_filename = LogsDir; logbook_filename.append("newlog.").append(ADIF_SUFFIX); progdefaults.logbookfilename = logbook_filename; dlgLogbook->label(fl_filename_name(logbook_filename.c_str())); progdefaults.changed = true; qsodb.deleteRecs(); dxcc_entity_cache_clear(); wBrowser->clear(); clearRecord(); } void adif_read_OK() { if (qsodb.nbrRecs() == 0) adifFile.writeFile(logbook_filename.c_str(), &qsodb); dxcc_entity_cache_clear(); dxcc_entity_cache_add(qsodb); restore_sort(); activateButtons(); loadBrowser(); } void cb_mnuOpenLogbook(Fl_Menu_* m, void* d) { string title = _("Open logbook file"); string filters; filters.assign("ADIF\t*.").append(ADIF_SUFFIX); #ifdef __APPLE__ filters.append("\n"); #endif const char* p = FSEL::select( title.c_str(), filters.c_str(), logbook_filename.c_str()); if (p) { saveLogbook(); qsodb.deleteRecs(); logbook_filename = p; progdefaults.logbookfilename = logbook_filename; progdefaults.changed = true; adifFile.readFile (logbook_filename.c_str(), &qsodb); dlgLogbook->label(fl_filename_name(logbook_filename.c_str())); qsodb.isdirty(0); } } void cb_mnuSaveLogbook(Fl_Menu_*m, void* d) { string title = _("Save logbook file"); string filter; filter.assign("ADIF\t*.").append(ADIF_SUFFIX); #ifdef __APPLE__ filter.append("\n"); #endif const char* p = FSEL::saveas( title.c_str(), filter.c_str(), logbook_filename.c_str()); if (p) { logbook_filename = p; if (logbook_filename.find("." ADIF_SUFFIX) == string::npos) logbook_filename.append("." ADIF_SUFFIX); dlgLogbook->label(fl_filename_name(logbook_filename.c_str())); cQsoDb::reverse = false; qsodb.SortByDate(progdefaults.sort_date_time_off); qsodb.isdirty(0); restore_sort(); adifFile.writeLog (logbook_filename.c_str(), &qsodb); } } int comparerecs (const void *rp1, const void *rp2) { // rp1 needle, rp2 haystack cQsoRec *r1 = (cQsoRec *)rp1; cQsoRec *r2 = (cQsoRec *)rp2; int cmp = 0; // compare by call const char * s1 = r1->getField(CALL); const char * s2 = r2->getField(CALL); const char *p1 = strpbrk (s1+1, "0123456789"); const char *p2 = strpbrk (s2+1, "0123456789"); if (p1 && p2) { cmp = (*p1 < *p2) ? -1 : (*p1 > *p2) ? 1 : 0; if (cmp == 0) { cmp = strncmp (s1, s2, max(p1 - s1, p2 - s2)); if (cmp == 0) cmp = strcmp(p1+1, p2+1); } } else // not a normal call, do a simple string comparison cmp = strcmp(s1, s2); if (cmp != 0) return cmp; // compare by date cmp = strcmp( r1->getField(QSO_DATE), r2->getField(QSO_DATE)); if (cmp != 0) return cmp; // compare by time int t1 = atoi(r1->getField(TIME_ON)); int t2 = atoi(r2->getField(TIME_ON)); if (abs(t1 - t2) > 200) { // changed from 2 to accommodate seconds if (t1 < t2) return -1; if (t1 > t2) return 1; } // matched with +/- 2 minutes // compare by mode const char *m1 = r1->getField(MODE); // needle const char *m2 = r2->getField(MODE); // haystack if (strcasestr(m1, "DOM")) cmp = strncasecmp("DOM", m2, 3); else if (strcasestr(m2, m1)) // eQSL, LoTW use sparse MODE designators cmp = 0; else cmp = strcasecmp(m1, m2); if (cmp != 0) return cmp; // compare by band cmp = strcasecmp( r1->getField(BAND), r2->getField(BAND)); if (cmp == 0) printf("r1: %s, %s, %s, %s, %s\nr2: %s, %s, %s, %s, %s\n", r1->getField(CALL), r1->getField(QSO_DATE), r1->getField(TIME_ON), r1->getField(MODE), r1->getField(BAND), r2->getField(CALL), r2->getField(QSO_DATE), r2->getField(TIME_ON), r2->getField(MODE), r2->getField(BAND)); return cmp; } static void rxtext(const char *s) { ReceiveText->addstr(s); } void merge_recs( cQsoDb *db, cQsoDb *mrgdb ) // (haystack, needle) { static char msg1[100]; static char msg2[100]; static char msg3[100]; sorttype origsort = lastsort; cQsoDb::reverse = false; cQsoDb *reject = new cQsoDb; cQsoDb *copy = new cQsoDb(db); cQsoDb *merged = new cQsoDb; snprintf(msg1, sizeof(msg1), "Read %d records", mrgdb->nbrRecs()); LOG_INFO("%s", msg1); REQ(rxtext, "\n*** "); REQ(rxtext, msg1); db->clearDatabase(); copy->SortByCall(); mrgdb->SortByCall(); int n = 0; // copy int m = 0; // merge int N = copy->nbrRecs(); int M = mrgdb->nbrRecs(); int cmp; for (;;) { if (n == N && m == M) break; if (n < N && m < M) { if ((cmp = comparerecs(copy->getRec(n), mrgdb->getRec(m))) <= 0) { db->qsoNewRec(copy->getRec(n)); n++; if (cmp == 0) { reject->qsoNewRec(mrgdb->getRec(m)); m++; } } else { if (db->nbrRecs() == 0) { db->qsoNewRec(mrgdb->getRec(m)); merged->qsoNewRec(mrgdb->getRec(m)); } else if (comparerecs(db->getRec(db->nbrRecs()-1), mrgdb->getRec(m)) != 0) { db->qsoNewRec(mrgdb->getRec(m)); merged->qsoNewRec(mrgdb->getRec(m)); } else { reject->qsoNewRec(mrgdb->getRec(m)); } m++; } } else if (n == N) { if (db->nbrRecs() == 0) { db->qsoNewRec(mrgdb->getRec(m)); merged->qsoNewRec(mrgdb->getRec(m)); } else if (comparerecs(db->getRec(db->nbrRecs()-1), mrgdb->getRec(m)) != 0) { db->qsoNewRec(mrgdb->getRec(m)); merged->qsoNewRec(mrgdb->getRec(m)); } else { reject->qsoNewRec(mrgdb->getRec(m)); } m++; } else { db->qsoNewRec(copy->getRec(n)); n++; } } if (merged->nbrRecs()) { string mergedname = LogsDir; mergedname.append("merged_recs"); #ifdef __WIN32__ mergedname.append(".adi"); #else mergedname.append(".adif"); #endif adifFile.writeLog (mergedname.c_str(), merged, true); snprintf(msg2, sizeof(msg2), "%d merged records saved in\n*** %s", merged->nbrRecs(), mergedname.c_str()); REQ(rxtext, "\n*** "); REQ(rxtext, msg2); LOG_INFO("%s", msg2); db->isdirty(1); } if (reject->nbrRecs()) { string rejname = LogsDir; rejname.append("duplicate_recs"); #ifdef __WIN32__ rejname.append(".adi"); #else rejname.append(".adif"); #endif adifFile.writeLog (rejname.c_str(), reject, true); snprintf(msg3, sizeof(msg3), "%d duplicates's saved in\n %s", reject->nbrRecs(), rejname.c_str()); REQ(rxtext, "\n*** "); REQ(rxtext, msg3); LOG_INFO("%s", msg3); } delete reject; delete copy; delete merged; lastsort = origsort; restore_sort(); loadBrowser(); } void cb_mnuMergeADIF_log(Fl_Menu_* m, void* d) { const char* p = FSEL::select(_("Merge ADIF file"), "ADIF\t*." ADIF_SUFFIX); Fl::wait(); fl_digi_main->redraw(); Fl::awake(); if (p) { cQsoDb *mrgdb = new cQsoDb; adifFile.do_readfile (p, mrgdb); merge_recs(&qsodb, mrgdb); delete mrgdb; } } void cb_export_date_select() { if (qsodb.nbrRecs() == 0) return; int start = atoi(inp_export_start_date->value()); int stop = atoi(inp_export_stop_date->value()); if (!start || !stop) return; int chkdate; chkExportBrowser->check_none(); if (!btn_export_by_date->value()) return; cQsoRec *rec; for (int i = 0; i < qsodb.nbrRecs(); i++) { rec = qsodb.getRec (i); chkdate = atoi(rec->getField(progdefaults.sort_date_time_off ? QSO_DATE_OFF : QSO_DATE)); if (chkdate >= start && chkdate <= stop) chkExportBrowser->checked(i+1, 1); } chkExportBrowser->redraw(); } inline const char *szfreq(const char *freq) { static char szf[11]; float f = atof(freq); snprintf(szf, sizeof(szf), "%10.6f", f); return szf; } void cb_Export_log() { if (qsodb.nbrRecs() == 0) return; cQsoRec *rec; char line[80]; chkExportBrowser->clear(); chkExportBrowser->textfont(FL_COURIER); chkExportBrowser->textsize(12); for( int i = 0; i < qsodb.nbrRecs(); i++ ) { rec = qsodb.getRec (i); snprintf(line,sizeof(line),"%8s|%6s|%-10s|%10s|%-s", rec->getField(QSO_DATE), rec->getField(TIME_OFF), rec->getField(CALL), szfreq(rec->getField(FREQ)), rec->getField(MODE) ); chkExportBrowser->add(line); } cb_export_date_select(); wExport->show(); } void cb_mnuExportADIF_log(Fl_Menu_* m, void* d) { export_to = ADIF; cb_Export_log(); } void cb_mnuExportCSV_log(Fl_Menu_* m, void* d) { export_to = CSV; cb_Export_log(); } void cb_mnuExportTEXT_log(Fl_Menu_* m, void *d) { export_to = TEXT; cb_Export_log(); } void cb_mnuShowLogbook(Fl_Menu_* m, void* d) { dlgLogbook->show(); } enum State {VIEWREC, NEWREC}; static State logState = VIEWREC; void activateButtons() { if (logState == NEWREC) { bNewSave->label(_("Save")); bUpdateCancel->label(_("Cancel")); bUpdateCancel->activate(); bDelete->deactivate (); bSearchNext->deactivate (); bSearchPrev->deactivate (); inpDate_log->take_focus(); return; } bNewSave->label(_("New")); bUpdateCancel->label(_("Update")); if (qsodb.nbrRecs() > 0) { bDelete->activate(); bUpdateCancel->activate(); bSearchNext->activate (); bSearchPrev->activate (); wBrowser->take_focus(); } else { bDelete->deactivate(); bUpdateCancel->deactivate(); bSearchNext->deactivate(); bSearchPrev->deactivate(); } } void cb_btnNewSave(Fl_Button* b, void* d) { if (logState == VIEWREC) { logState = NEWREC; clearRecord(); activateButtons(); } else { saveRecord(); qsodb.SortByDate(progdefaults.sort_date_time_off); loadBrowser(); logState = VIEWREC; activateButtons(); } } void cb_btnUpdateCancel(Fl_Button* b, void* d) { if (logState == NEWREC) { logState = VIEWREC; activateButtons (); } else { updateRecord(); wBrowser->take_focus(); } } void cb_btnDelete(Fl_Button* b, void* d) { deleteRecord(); wBrowser->take_focus(); } void restore_sort() { switch (lastsort) { case SORTCALL : cQsoDb::reverse = callfwd; qsodb.SortByCall(); break; case SORTDATE : cQsoDb::reverse = progStatus.logbook_reverse; qsodb.SortByDate(progdefaults.sort_date_time_off); break; case SORTFREQ : cQsoDb::reverse = freqfwd; qsodb.SortByFreq(); break; case SORTMODE : cQsoDb::reverse = modefwd; qsodb.SortByMode(); break; default: break; } } void cb_SortByCall (void) { if (lastsort == SORTCALL) callfwd = !callfwd; else { callfwd = false; lastsort = SORTCALL; } cQsoDb::reverse = callfwd; qsodb.SortByCall(); loadBrowser(); } void cb_SortByDate (void) { if (lastsort == SORTDATE) progStatus.logbook_reverse = !progStatus.logbook_reverse; else { lastsort = SORTDATE; } cQsoDb::reverse = progStatus.logbook_reverse; qsodb.SortByDate(progdefaults.sort_date_time_off); loadBrowser(); } void reload_browser() { qsodb.SortByDate(progdefaults.sort_date_time_off); loadBrowser(); } void cb_SortByMode (void) { if (lastsort == SORTMODE) modefwd = !modefwd; else { modefwd = false; lastsort = SORTMODE; } cQsoDb::reverse = modefwd; qsodb.SortByMode(); loadBrowser(); } void cb_SortByFreq (void) { if (lastsort == SORTFREQ) freqfwd = !freqfwd; else { freqfwd = false; lastsort = SORTFREQ; } cQsoDb::reverse = freqfwd; qsodb.SortByFreq(); loadBrowser(); } void DupCheck() { Fl_Color call_clr = progdefaults.LOGGINGcolor; if (progdefaults.xml_logbook) if (xml_check_dup()) call_clr = fl_rgb_color( progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B); if (!progdefaults.xml_logbook && qsodb.duplicate( inpCall->value(), zdate(), ztime(), progdefaults.timespan, progdefaults.duptimespan, inpFreq->value(), progdefaults.dupband, inpState->value(), progdefaults.dupstate, mode_info[active_modem->get_mode()].adif_name, progdefaults.dupmode, inpXchgIn->value(), progdefaults.dupxchg1 ) ) { call_clr = fl_rgb_color( progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B); } inpCall1->color(call_clr); inpCall2->color(call_clr); inpCall3->color(call_clr); inpCall4->color(call_clr); inpCall1->redraw(); inpCall2->redraw(); inpCall3->redraw(); inpCall4->redraw(); } cQsoRec* SearchLog(const char *callsign) { size_t len = strlen(callsign); char* re = new char[len + 3]; snprintf(re, len + 3, "^%s$", callsign); int row = 0, col = 2; return wBrowser->search(row, col, !cQsoDb::reverse, re) ? qsodb.getRec(row) : 0; } void SearchLastQSO(const char *callsign) { size_t len = strlen(callsign); if (len < 3) return; if (progdefaults.xml_logbook) { if(xml_get_record(callsign)) return; } Fl::focus(inpCall); char* re = new char[len + 3]; snprintf(re, len + 3, "^%s$", callsign); int row = 0, col = 2; if (wBrowser->search(row, col, !cQsoDb::reverse, re)) { wBrowser->GotoRow(row); inpName->value(inpName_log->value()); inpQth->value(inpQth_log->value()); inpLoc->value(inpLoc_log->value()); inpState->value(inpState_log->value()); inpVEprov->value(inpVE_Prov_log->value ()); inpCountry->value(inpCountry_log->value ()); inpSearchString->value(callsign); if (inpLoc->value()[0]) { double lon1, lat1, lon2, lat2; double azimuth, distance; char szAZ[4]; if ( locator2longlat(&lon1, &lat1, progdefaults.myLocator.c_str()) == RIG_OK && locator2longlat(&lon2, &lat2, inpLoc->value()) == RIG_OK && qrb(lon1, lat1, lon2, lat2, &distance, &azimuth) == RIG_OK ) { snprintf(szAZ,sizeof(szAZ),"%0.f", azimuth); inpAZ->value(szAZ); } else inpAZ->value(""); } else inpAZ->value(""); } else { inpName->value(""); inpQth->value(""); inpLoc->value(""); inpState->value(""); inpVEprov->value(""); inpCountry->value(""); inpAZ->value(""); inpSearchString->value(""); } delete [] re; } void cb_search(Fl_Widget* w, void*) { const char* str = inpSearchString->value(); if (!*str) return; bool rev = w == bSearchPrev; int col = 2, row = wBrowser->value() + (rev ? -1 : 1); row = WCLAMP(row, 0, wBrowser->rows() - 1); if (wBrowser->search(row, col, rev, str)) wBrowser->GotoRow(row); wBrowser->take_focus(); } int log_search_handler(int) { if (!(Fl::event_state() & FL_CTRL)) return 0; switch (Fl::event_key()) { case 's': bSearchNext->do_callback(); break; case 'r': bSearchPrev->do_callback(); break; default: return 0; } return 1; } static int editNbr = 0; void cb_btnDialFreq(Fl_Button* b, void* d) { double drf = atof(inpFreq_log->value()); if (!drf) return; int rf1, rf, audio; rf1 = drf * 1e6; rf = rf1 / 10000; rf *= 10000; audio = rf1 - rf; // try to keep within normal xcvr bw, 500 - 3000 Hz while (audio > 3000) { audio -= 3000; rf += 3000; } if (audio < 500) { audio += 500; rf -= 500; } qsy(rf, audio); std::string mode_name = inpMode_log->value(); trx_mode m; for (m = 0; m < NUM_MODES; m++) if (mode_name == mode_info[m].adif_name) break; // do we have a valid modem? if (m < NUM_MODES && active_modem->get_mode() != mode_info[m].mode) init_modem(mode_info[m].mode); const cQsoRec *qsoPtr = qsodb.getRec(editNbr); inpCall->value(qsoPtr->getField(CALL)); inpName->value (qsoPtr->getField(NAME)); inpTimeOn->value (inpTimeOff->value()); inpState->value (qsoPtr->getField(STATE)); inpCountry->value (qsoPtr->getField(COUNTRY)); inpXchgIn->value(qsoPtr->getField(XCHG1)); inpQth->value (qsoPtr->getField(QTH)); inpLoc->value (qsoPtr->getField(GRIDSQUARE)); inpNotes->value (qsoPtr->getField(NOTES)); wBrowser->take_focus(); } void clearRecord() { Date tdy; inpCall_log->value (""); inpName_log->value (""); inpDate_log->value (tdy.szDate(2)); inpDateOff_log->value (tdy.szDate(2)); inpTimeOn_log->value (""); inpTimeOff_log->value (""); inpRstR_log->value (""); inpRstS_log->value (""); inpFreq_log->value (""); inpMode_log->value (""); inpQth_log->value (""); inpState_log->value (""); inpVE_Prov_log->value (""); inpCountry_log->value (""); inpLoc_log->value (""); inpQSLrcvddate_log->value (""); inpQSLsentdate_log->value (""); inpSerNoOut_log->value (""); inpSerNoIn_log->value (""); inpXchgIn_log->value(""); inpMyXchg_log->value(progdefaults.myXchg.c_str()); inpNotes_log->value (""); inpIOTA_log->value(""); inpDXCC_log->value(""); inpQSL_VIA_log->value(""); inpCONT_log->value(""); inpCNTY_log->value(""); inpCQZ_log->value(""); inpITUZ_log->value(""); inpTX_pwr_log->value(""); inpSearchString->value (""); } void saveRecord() { cQsoRec rec; rec.putField(CALL, inpCall_log->value()); rec.putField(NAME, inpName_log->value()); rec.putField(QSO_DATE, inpDate_log->value()); rec.putField(QSO_DATE_OFF, inpDateOff_log->value()); string tm = timestring(inpTimeOn_log->value()); rec.putField(TIME_ON, tm.c_str()); inpTimeOn_log->value(timeview(tm.c_str())); tm = timestring(inpTimeOff_log->value()); rec.putField(TIME_OFF, tm.c_str()); inpTimeOff_log->value(timeview(tm.c_str())); rec.putField(FREQ, inpFreq_log->value()); rec.putField(MODE, inpMode_log->value()); rec.putField(QTH, inpQth_log->value()); rec.putField(STATE, inpState_log->value()); rec.putField(VE_PROV, inpVE_Prov_log->value()); rec.putField(COUNTRY, inpCountry_log->value()); rec.putField(GRIDSQUARE, inpLoc_log->value()); rec.putField(NOTES, inpNotes_log->value()); rec.putField(QSLRDATE, inpQSLrcvddate_log->value()); rec.putField(QSLSDATE, inpQSLsentdate_log->value()); rec.putField(RST_RCVD, inpRstR_log->value ()); rec.putField(RST_SENT, inpRstS_log->value ()); rec.putField(SRX, inpSerNoIn_log->value()); rec.putField(STX, inpSerNoOut_log->value()); rec.putField(XCHG1, inpXchgIn_log->value()); if (!qso_exchange.empty()) { rec.putField(MYXCHG, qso_exchange.c_str()); qso_exchange.clear(); qso_time.clear(); } else if (!qso_time.empty()) { string myexch = inpMyXchg_log->value(); myexch.append(" ").append(qso_time); rec.putField(MYXCHG, myexch.c_str()); qso_time.clear(); } else { rec.putField(MYXCHG, inpMyXchg_log->value()); } rec.putField(CNTY, inpCNTY_log->value()); rec.putField(IOTA, inpIOTA_log->value()); rec.putField(DXCC, inpDXCC_log->value()); rec.putField(DXCC, inpQSL_VIA_log->value()); rec.putField(CONT, inpCONT_log->value()); rec.putField(CQZ, inpCQZ_log->value()); rec.putField(ITUZ, inpITUZ_log->value()); rec.putField(TX_PWR, inpTX_pwr_log->value()); qsodb.qsoNewRec (&rec); dxcc_entity_cache_add(&rec); submit_record(rec); cQsoDb::reverse = false; qsodb.SortByDate(progdefaults.sort_date_time_off); qsodb.isdirty(0); loadBrowser(); adifFile.writeLog (logbook_filename.c_str(), &qsodb); } void updateRecord() { cQsoRec rec; if (qsodb.nbrRecs() == 0) return; rec.putField(CALL, inpCall_log->value()); rec.putField(NAME, inpName_log->value()); rec.putField(QSO_DATE, inpDate_log->value()); rec.putField(QSO_DATE_OFF, inpDateOff_log->value()); string tm = timestring(inpTimeOn_log->value()); rec.putField(TIME_ON, tm.c_str()); inpTimeOn_log->value(timeview(tm.c_str())); tm = timestring(inpTimeOff_log->value()); rec.putField(TIME_OFF, tm.c_str()); inpTimeOff_log->value(timeview(tm.c_str())); rec.putField(FREQ, inpFreq_log->value()); rec.putField(MODE, inpMode_log->value()); rec.putField(QTH, inpQth_log->value()); rec.putField(STATE, inpState_log->value()); rec.putField(VE_PROV, inpVE_Prov_log->value()); rec.putField(COUNTRY, inpCountry_log->value()); rec.putField(GRIDSQUARE, inpLoc_log->value()); rec.putField(NOTES, inpNotes_log->value()); rec.putField(QSLRDATE, inpQSLrcvddate_log->value()); rec.putField(QSLSDATE, inpQSLsentdate_log->value()); rec.putField(RST_RCVD, inpRstR_log->value ()); rec.putField(RST_SENT, inpRstS_log->value ()); rec.putField(SRX, inpSerNoIn_log->value()); rec.putField(STX, inpSerNoOut_log->value()); rec.putField(XCHG1, inpXchgIn_log->value()); rec.putField(MYXCHG, inpMyXchg_log->value()); rec.putField(CNTY, inpCNTY_log->value()); rec.putField(IOTA, inpIOTA_log->value()); rec.putField(DXCC, inpDXCC_log->value()); rec.putField(QSL_VIA, inpQSL_VIA_log->value()); rec.putField(CONT, inpCONT_log->value()); rec.putField(CQZ, inpCQZ_log->value()); rec.putField(ITUZ, inpITUZ_log->value()); rec.putField(TX_PWR, inpTX_pwr_log->value()); dxcc_entity_cache_rm(qsodb.getRec(editNbr)); qsodb.qsoUpdRec (editNbr, &rec); dxcc_entity_cache_add(&rec); cQsoDb::reverse = false; qsodb.SortByDate(progdefaults.sort_date_time_off); qsodb.isdirty(0); restore_sort(); loadBrowser(true); adifFile.writeLog (logbook_filename.c_str(), &qsodb); } void deleteRecord () { if (qsodb.nbrRecs() == 0 || fl_choice2(_("Really delete record for \"%s\"?"), _("Yes"), _("No"), NULL, wBrowser->valueAt(-1, 2))) return; dxcc_entity_cache_rm(qsodb.getRec(editNbr)); qsodb.qsoDelRec(editNbr); cQsoDb::reverse = false; qsodb.SortByDate(progdefaults.sort_date_time_off); qsodb.isdirty(0); restore_sort(); loadBrowser(true); adifFile.writeLog (logbook_filename.c_str(), &qsodb); } void EditRecord( int i ) { cQsoRec *editQSO = qsodb.getRec (i); if( !editQSO ) return; inpCall_log->value (editQSO->getField(CALL)); inpName_log->value (editQSO->getField(NAME)); inpDate_log->value (editQSO->getField(QSO_DATE)); inpDateOff_log->value (editQSO->getField(QSO_DATE_OFF)); inpTimeOn_log->value (timeview(editQSO->getField(TIME_ON))); inpTimeOff_log->value (timeview(editQSO->getField(TIME_OFF))); inpRstR_log->value (editQSO->getField(RST_RCVD)); inpRstS_log->value (editQSO->getField(RST_SENT)); inpFreq_log->value (editQSO->getField(FREQ)); inpMode_log->value (editQSO->getField(MODE)); inpState_log->value (editQSO->getField(STATE)); inpVE_Prov_log->value (editQSO->getField(VE_PROV)); inpCountry_log->value (editQSO->getField(COUNTRY)); inpQth_log->value (editQSO->getField(QTH)); inpLoc_log->value (editQSO->getField(GRIDSQUARE)); inpQSLrcvddate_log->value (editQSO->getField(QSLRDATE)); inpQSLsentdate_log->value (editQSO->getField(QSLSDATE)); inpNotes_log->value (editQSO->getField(NOTES)); inpSerNoIn_log->value(editQSO->getField(SRX)); inpSerNoOut_log->value(editQSO->getField(STX)); inpXchgIn_log->value(editQSO->getField(XCHG1)); inpMyXchg_log->value(editQSO->getField(MYXCHG)); inpCNTY_log->value(editQSO->getField(CNTY)); inpIOTA_log->value(editQSO->getField(IOTA)); inpDXCC_log->value(editQSO->getField(DXCC)); inpQSL_VIA_log->value(editQSO->getField(QSL_VIA)); inpCONT_log->value(editQSO->getField(CONT)); inpCQZ_log->value(editQSO->getField(CQZ)); inpITUZ_log->value(editQSO->getField(ITUZ)); inpTX_pwr_log->value(editQSO->getField(TX_PWR)); } std::string sDate_on = ""; std::string sTime_on = ""; std::string sDate_off = ""; std::string sTime_off = ""; void AddRecord () { inpCall_log->value(inpCall->value()); inpName_log->value (inpName->value()); if (progdefaults.force_date_time) { inpDate_log->value(sDate_off.c_str()); inpTimeOn_log->value (timeview(sTime_off.c_str())); } else { inpDate_log->value(sDate_on.c_str()); inpTimeOn_log->value (timeview(sTime_on.c_str())); } inpDateOff_log->value(sDate_off.c_str()); inpTimeOff_log->value (timeview(sTime_off.c_str())); inpRstR_log->value (inpRstIn->value()); inpRstS_log->value (inpRstOut->value()); { char Mhz[30]; snprintf(Mhz, sizeof(Mhz), "%-f", atof(inpFreq->value()) / 1000.0); inpFreq_log->value(Mhz); } inpMode_log->value (logmode); inpState_log->value (inpState->value()); inpVE_Prov_log->value (inpVEprov->value()); inpCountry_log->value (inpCountry->value()); inpSerNoIn_log->value(inpSerNo->value()); inpSerNoOut_log->value(outSerNo->value()); inpXchgIn_log->value(inpXchgIn->value()); inpMyXchg_log->value(progdefaults.myXchg.c_str()); inpQth_log->value (inpQth->value()); inpLoc_log->value (inpLoc->value()); inpQSLrcvddate_log->value (""); inpQSLsentdate_log->value (""); inpNotes_log->value (inpNotes->value()); inpTX_pwr_log->value (progdefaults.mytxpower.c_str()); inpCNTY_log->value(""); inpIOTA_log->value(""); inpDXCC_log->value(""); inpQSL_VIA_log->value(""); inpCONT_log->value(""); inpCQZ_log->value(""); inpITUZ_log->value(""); saveRecord(); restore_sort(); loadBrowser(); logState = VIEWREC; activateButtons(); } void cb_browser (Fl_Widget *w, void *data ) { Table *table = (Table *)w; editNbr = atoi(table->valueAt(-1,6)); EditRecord (editNbr); } void loadBrowser(bool keep_pos) { cQsoRec *rec; char sNbr[6]; int row = wBrowser->value(), pos = wBrowser->scrollPos(); if (row >= qsodb.nbrRecs()) row = qsodb.nbrRecs() - 1; wBrowser->clear(); if (qsodb.nbrRecs() == 0) return; for( int i = 0; i < qsodb.nbrRecs(); i++ ) { rec = qsodb.getRec (i); snprintf(sNbr,sizeof(sNbr),"%d",i); wBrowser->addRow (7, rec->getField(progdefaults.sort_date_time_off ? QSO_DATE_OFF : QSO_DATE), timeview4(rec->getField(progdefaults.sort_date_time_off ? TIME_OFF : TIME_ON)), rec->getField(CALL), rec->getField(NAME), rec->getField(FREQ), rec->getField(MODE), sNbr); } if (keep_pos && row >= 0) { wBrowser->value(row); wBrowser->scrollTo(pos); } else { if (cQsoDb::reverse == true) wBrowser->FirstRow (); else wBrowser->LastRow (); } char szRecs[6]; snprintf(szRecs, sizeof(szRecs), "%5d", qsodb.nbrRecs()); txtNbrRecs_log->value(szRecs); } //============================================================================= // Cabrillo reporter //============================================================================= const char *contests[] = { "AP-SPRINT", "ARRL-10", "ARRL-160", "ARRL-DX-CW", "ARRL-DX-SSB", "ARRL-SS-CW", "ARRL-SS-SSB", "ARRL-UHF-AUG", "ARRL-VHF-JAN", "ARRL-VHF-JUN", "ARRL-VHF-SEP", "ARRL-RTTY", "BARTG-RTTY", "BARTG-SPRINT", "CQ-160-CW", "CQ-160-SSB", "CQ-WPX-CW", "CQ-WPX-RTTY", "CQ-WPX-SSB", "CQ-VHF", "CQ-WW-CW", "CQ-WW-RTTY", "CQ-WW-SSB", "DARC-WAEDC-CW", "DARC-WAEDC-RTTY", "DARC-WAEDC-SSB", "FCG-FQP", "IARU-HF", "JIDX-CW", "JIDX-SSB", "NAQP-CW", "NAQP-RTTY", "NAQP-SSB", "NA-SPRINT-CW", "NA-SPRINT-SSB", "NCCC-CQP", "NEQP", "OCEANIA-DX-CW", "OCEANIA-DX-SSB", "RDXC", "RSGB-IOTA", "SAC-CW", "SAC-SSB", "STEW-PERRY", "TARA-RTTY", 0 }; enum icontest { AP_SPRINT, ARRL_10, ARRL_160, ARRL_DX_CW, ARRL_DX_SSB, ARRL_SS_CW, ARRL_SS_SSB, ARRL_UHF_AUG, ARRL_VHF_JAN, ARRL_VHF_JUN, ARRL_VHF_SEP, ARRL_RTTY, BARTG_RTTY, BARTG_SPRINT, CQ_160_CW, CQ_160_SSB, CQ_WPX_CW, CQ_WPX_RTTY, CQ_WPX_SSB, CQ_VHF, CQ_WW_CW, CQ_WW_RTTY, CQ_WW_SSB, DARC_WAEDC_CW, DARC_WAEDC_RTTY, DARC_WAEDC_SSB, FCG_FQP, IARU_HF, JIDX_CW, JIDX_SSB, NAQP_CW, NAQP_RTTY, NAQP_SSB, NA_SPRINT_CW, NA_SPRINT_SSB, NCCC_CQP, NEQP, OCEANIA_DX_CW, OCEANIA_DX_SSB, RDXC, RSGB_IOTA, SAC_CW, SAC_SSB, STEW_PERRY, TARA_RTTY }; bool bInitCombo = true; icontest contestnbr; void setContestType() { contestnbr = (icontest)cboContest->index(); btnCabCall->value(true); btnCabFreq->value(true); btnCabMode->value(true); btnCabQSOdate->value(true); btnCabTimeOFF->value(true); btnCabRSTsent->value(true); btnCabRSTrcvd->value(true); btnCabSerialIN->value(true);btnCabSerialOUT->value(true); btnCabXchgIn->value(true); btnCabMyXchg->value(true); switch (contestnbr) { case ARRL_SS_CW : case ARRL_SS_SSB : btnCabRSTrcvd->value(false); break; case BARTG_RTTY : case BARTG_SPRINT : break; case ARRL_UHF_AUG : case ARRL_VHF_JAN : case ARRL_VHF_JUN : case ARRL_VHF_SEP : case CQ_VHF : btnCabRSTrcvd->value(false); btnCabSerialIN->value(false); btnCabSerialOUT->value(false); break; case AP_SPRINT : case ARRL_10 : case ARRL_160 : case ARRL_DX_CW : case ARRL_DX_SSB : case CQ_160_CW : case CQ_160_SSB : case CQ_WPX_CW : case CQ_WPX_RTTY : case CQ_WPX_SSB : case RDXC : case OCEANIA_DX_CW : case OCEANIA_DX_SSB : break; case DARC_WAEDC_CW : case DARC_WAEDC_RTTY : case DARC_WAEDC_SSB : break; case NAQP_CW : case NAQP_RTTY : case NAQP_SSB : case NA_SPRINT_CW : case NA_SPRINT_SSB : break; case RSGB_IOTA : break; default : break; } } void cb_Export_Cabrillo(Fl_Menu_* m, void* d) { if (qsodb.nbrRecs() == 0) return; cQsoRec *rec; char line[80]; int indx = 0; if (bInitCombo) { bInitCombo = false; while (contests[indx]) { cboContest->add(contests[indx]); indx++; } } cboContest->index(0); chkCabBrowser->clear(); chkCabBrowser->textfont(FL_COURIER); chkCabBrowser->textsize(12); for( int i = 0; i < qsodb.nbrRecs(); i++ ) { rec = qsodb.getRec (i); memset(line, 0, sizeof(line)); snprintf(line,sizeof(line),"%8s|%4s|%-10s|%10s|%-s", rec->getField(QSO_DATE), time4(rec->getField(TIME_OFF)), rec->getField(CALL), szfreq(rec->getField(FREQ)), rec->getField(MODE) ); chkCabBrowser->add(line); } wCabrillo->show(); } void cabrillo_append_qso (FILE *fp, cQsoRec *rec) { char freq[16] = ""; string rst_in, rst_out, exch_in, exch_out, date, time, mode, mycall, call; string qsoline = "QSO: "; int rst_len = 3; int ifreq = 0; size_t len = 0; exch_out.clear(); if (btnCabFreq->value()) { ifreq = (int)(1000.0 * atof(rec->getField(FREQ))); snprintf(freq, sizeof(freq), "%d", ifreq); qsoline.append(freq); qsoline.append(" "); } if (btnCabMode->value()) { mode = rec->getField(MODE); if (mode.compare("USB") == 0 || mode.compare("LSB") == 0 || mode.compare("SSB") == 0 || mode.compare("PH") == 0 ) mode = "PH"; else if (mode.compare("FM") == 0 || mode.compare("CW") == 0 ) ; else mode = "RY"; if (mode.compare("PH") == 0 || mode.compare("FM") == 0 ) rst_len = 2; qsoline.append(mode); qsoline.append(" "); } if (btnCabQSOdate->value()) { date = rec->getField(progdefaults.sort_date_time_off ? QSO_DATE_OFF : QSO_DATE); date.insert(4,"-"); date.insert(7,"-"); qsoline.append(date); qsoline.append(" "); } if (btnCabTimeOFF->value()) { time = rec->getField(progdefaults.sort_date_time_off ? TIME_OFF : TIME_ON); qsoline.append(time4(time.c_str())); qsoline.append(" "); } mycall = progdefaults.myCall; if (mycall.length() > 13) mycall = mycall.substr(0,13); if ((len = mycall.length()) < 13) mycall.append(13 - len, ' '); qsoline.append(mycall); qsoline.append(" "); if (btnCabRSTsent->value()) { rst_out = rec->getField(RST_SENT); rst_out = rst_out.substr(0,rst_len); exch_out.append(rst_out).append(" "); } if (btnCabSerialOUT->value()) { exch_out.append(rec->getField(STX)).append(" "); } if (btnCabMyXchg->value()) { exch_out.append(rec->getField(MYXCHG)).append(" "); } if (contestnbr == BARTG_RTTY && exch_out.length() < 11) { string toff = rec->getField(TIME_OFF); toff = toff.substr(0,4).append(" "); exch_out.append(toff); } if (exch_out.length() > 14) exch_out = exch_out.substr(0,14); if ((len = exch_out.length()) < 14) exch_out.append(14 - len, ' '); qsoline.append(exch_out).append(" "); if (btnCabCall->value()) { call = rec->getField(CALL); if (call.length() > 13) call = call.substr(0,13); if ((len = call.length()) < 13) call.append(13 - len, ' '); qsoline.append(call); qsoline.append(" "); } if (btnCabRSTrcvd->value()) { rst_in = rec->getField(RST_RCVD); rst_in = rst_in.substr(0,rst_len); qsoline.append(rst_in); qsoline.append(" "); } if (btnCabSerialIN->value()) { exch_in = rec->getField(SRX); if (exch_in.length()) exch_in += ' '; } if (btnCabXchgIn->value()) exch_in.append(rec->getField(XCHG1)); if (exch_in.length() > 14) exch_in = exch_in.substr(0,14); if ((len = exch_in.length()) < 14) exch_in.append(14 - len, ' '); qsoline.append(exch_in); fprintf (fp, "%s\n", qsoline.c_str()); return; } void WriteCabrillo() { if (chkCabBrowser->nchecked() == 0) return; cQsoRec *rec; string title = _("Create cabrillo report"); string filters = "TEXT\t*.txt"; #ifdef __APPLE__ filters.append("\n"); #endif string strContest = ""; const char* p = FSEL::saveas( title.c_str(), filters.c_str(), "contest.txt"); if (!p) return; for (int i = 0; i < chkCabBrowser->FLTK_nitems(); i++) { if (chkCabBrowser->checked(i + 1)) { rec = qsodb.getRec(i); rec->putField(EXPORT, "E"); qsodb.qsoUpdRec (i, rec); } } string sp = p; if (sp.find(".txt") == string::npos) sp.append(".txt"); FILE *cabFile = fopen (p, "w"); if (!cabFile) return; strContest = cboContest->value(); contestnbr = (icontest)cboContest->index(); fprintf (cabFile, "START-OF-LOG: 3.0\n\ CREATED-BY: %s %s\n\ \n\ # The callsign used during the contest.\n\ CALLSIGN: %s\n\ \n\ # ASSISTED or NON-ASSISTED\n\ CATEGORY-ASSISTED: \n\ \n\ # Band: ALL, 160M, 80M, 40M, 20M, 15M, 10M, 6M, 2M, 222, 432, 902, 1.2G\n\ CATEGORY-BAND: \n\ \n\ # Mode: SSB, CW, RTTY, MIXED \n\ CATEGORY-MODE: \n\ \n\ # Operator: SINGLE-OP, MULTI-OP, CHECKLOG \n\ CATEGORY-OPERATOR: \n\ \n\ # Power: HIGH, LOW, QRP \n\ CATEGORY-POWER: \n\ \n\ # Station: FIXED, MOBILE, PORTABLE, ROVER, EXPEDITION, HQ, SCHOOL \n\ CATEGORY-STATION: \n\ \n\ # Time: 6-HOURS, 12-HOURS, 24-HOURS \n\ CATEGORY-TIME: \n\ \n\ # Transmitter: ONE, TWO, LIMITED, UNLIMITED, SWL \n\ CATEGORY-TRANSMITTER: \n\ \n\ # Overlay: ROOKIE, TB-WIRES, NOVICE-TECH, OVER-50 \n\ CATEGORY-OVERLAY: \n\ \n\ # Integer number\n\ CLAIMED-SCORE: \n\ \n\ # Name of the radio club with which the score should be aggregated.\n\ CLUB: \n\ \n\ # Contest: AP-SPRINT, ARRL-10, ARRL-160, ARRL-DX-CW, ARRL-DX-SSB, ARRL-SS-CW,\n\ # ARRL-SS-SSB, ARRL-UHF-AUG, ARRL-VHF-JAN, ARRL-VHF-JUN, ARRL-VHF-SEP,\n\ # ARRL-RTTY, BARTG-RTTY, CQ-160-CW, CQ-160-SSB, CQ-WPX-CW, CQ-WPX-RTTY,\n\ # CQ-WPX-SSB, CQ-VHF, CQ-WW-CW, CQ-WW-RTTY, CQ-WW-SSB, DARC-WAEDC-CW,\n\ # DARC-WAEDC-RTTY, DARC-WAEDC-SSB, FCG-FQP, IARU-HF, JIDX-CW, JIDX-SSB,\n\ # NAQP-CW, NAQP-RTTY, NAQP-SSB, NA-SPRINT-CW, NA-SPRINT-SSB, NCCC-CQP,\n\ # NEQP, OCEANIA-DX-CW, OCEANIA-DX-SSB, RDXC, RSGB-IOTA, SAC-CW, SAC-SSB,\n\ # STEW-PERRY, TARA-RTTY \n\ CONTEST: %s\n\ \n\ # Optional email address\n\ EMAIL: \n\ \n\ LOCATION: \n\ \n\ # Operator name\n\ NAME: \n\ \n\ # Maximum 4 address lines.\n\ ADDRESS: \n\ ADDRESS: \n\ ADDRESS: \n\ ADDRESS: \n\ \n\ # A space-delimited list of operator callsign(s). \n\ OPERATORS: \n\ \n\ # Offtime yyyy-mm-dd nnnn yyyy-mm-dd nnnn \n\ # OFFTIME: \n\ \n\ # Soapbox comments.\n\ SOAPBOX: \n\ SOAPBOX: \n\ SOAPBOX: \n\n", PACKAGE_NAME, PACKAGE_VERSION, progdefaults.myCall.c_str(), strContest.c_str() ); qsodb.SortByDate(progdefaults.sort_date_time_off); for (int i = 0; i < qsodb.nbrRecs(); i++) { rec = qsodb.getRec(i); if (rec->getField(EXPORT)[0] == 'E') { cabrillo_append_qso(cabFile, rec); rec->putField(EXPORT,""); qsodb.qsoUpdRec(i, rec); } } fprintf(cabFile, "END-OF-LOG:\n"); fclose (cabFile); return; } #ifdef __clang__ # include typedef std::unordered_map dxcc_entity_cache_t; #else # include typedef tr1::unordered_map dxcc_entity_cache_t; #endif static dxcc_entity_cache_t dxcc_entity_cache; static bool dxcc_entity_cache_enabled = false; #include "dxcc.h" static void dxcc_entity_cache_clear(void) { if (dxcc_entity_cache_enabled) dxcc_entity_cache.clear(); } static void dxcc_entity_cache_add(cQsoRec* r) { if (!dxcc_entity_cache_enabled | !r) return; const dxcc* e = dxcc_lookup(r->getField(CALL)); if (e) dxcc_entity_cache[e->country]++; } static void dxcc_entity_cache_add(cQsoDb& db) { if (!dxcc_entity_cache_enabled) return; int n = db.nbrRecs(); for (int i = 0; i < n; i++) dxcc_entity_cache_add(db.getRec(i)); if (!dxcc_entity_cache.empty()) LOG_INFO("Found %" PRIuSZ " countries in %d QSO records", dxcc_entity_cache.size(), n); } static void dxcc_entity_cache_rm(cQsoRec* r) { if (!dxcc_entity_cache_enabled || !r) return; const dxcc* e = dxcc_lookup(r->getField(CALL)); if (!e) return; dxcc_entity_cache_t::iterator i = dxcc_entity_cache.find(e->country); if (i != dxcc_entity_cache.end()) { if (i->second) i->second--; else dxcc_entity_cache.erase(i); } } void dxcc_entity_cache_enable(bool v) { if (dxcc_entity_cache_enabled == v) return; dxcc_entity_cache_clear(); if ((dxcc_entity_cache_enabled = v)) dxcc_entity_cache_add(qsodb); } bool qsodb_dxcc_entity_find(const char* country) { return dxcc_entity_cache.find(country) != dxcc_entity_cache.end(); } fldigi-3.21.80/src/logbook/logbook.cxx0000664000175000017500000000365312313064025014454 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi 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. // // fldigi 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 . // ---------------------------------------------------------------------------- #include #include #include #include #include "main.h" #include "logbook.h" #include "configuration.h" #include "debug.h" #include "qrunner.h" #include "gettext.h" #include "icons.h" using namespace std; void start_logbook () { if (progdefaults.logbookfilename.empty()) { logbook_filename = LogsDir; logbook_filename.append("logbook." ADIF_SUFFIX); progdefaults.logbookfilename = logbook_filename; progdefaults.changed = true; } else logbook_filename = progdefaults.logbookfilename; qsodb.deleteRecs(); adifFile.readFile (logbook_filename.c_str(), &qsodb); string label = "Logbook - "; label.append(fl_filename_name(logbook_filename.c_str())); dlgLogbook->copy_label(label.c_str()); return; } void close_logbook() { if (!qsodb.isdirty()) return; if (progdefaults.NagMe) if (!fl_choice2(_("Save changed Logbook?"), _("No"), _("Yes"), NULL)) return; cQsoDb::reverse = false; qsodb.SortByDate(progdefaults.sort_date_time_off); adifFile.writeLog (logbook_filename.c_str(), &qsodb, true); } fldigi-3.21.80/src/trx/0000775000175000017500000000000012313333727011536 500000000000000fldigi-3.21.80/src/trx/tune.cxx0000664000175000017500000000765312313064025013160 00000000000000// ---------------------------------------------------------------------------- // tune.cxx -- create a single sinewave output with controlled start/end shape // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "sound.h" namespace xmttune { // use same wave shaping for tune key down / key up as for the CW tx_process // produces a 4 msec leading / trailing edge #define KNUM 32 // keydown wave shape double kdshape[KNUM] = { 0.00240750255310301, 0.00960708477768751, 0.02152941088003600, 0.03805966253618680, 0.05903864465505320, 0.08426431851158830, 0.11349374748686800, 0.14644543667658500, 0.18280204383628200, 0.22221343555548300, 0.26430005922814900, 0.30865659834558700, 0.35485587590940700, 0.40245296837259500, 0.45098949048925500, 0.49999800980765500, 0.54900654829266300, 0.59754312772456200, 0.64514031509964400, 0.69133972425796200, 0.73569643038517400, 0.77778325487450100, 0.81719487928327800, 0.85355174876454100, 0.88650372738152000, 0.91573347010241700, 0.94095947900139100, 0.96193881423287900, 0.97846943367117300, 0.99039213868324900, 0.99759210729604500, 0.99999999999295900 }; // keyup wave shape double kushape[KNUM] = { 0.99999999999295900, 0.99759210729604500, 0.99039213868324900, 0.97846943367117300, 0.96193881423287900, 0.94095947900139100, 0.91573347010241700, 0.88650372738152000, 0.85355174876454100, 0.81719487928327800, 0.77778325487450100, 0.73569643038517400, 0.69133972425796200, 0.64514031509964400, 0.59754312772456200, 0.54900654829266300, 0.49999800980765500, 0.45098949048925500, 0.40245296837259500, 0.35485587590940700, 0.30865659834558700, 0.26430005922814900, 0.22221343555548300, 0.18280204383628200, 0.14644543667658500, 0.11349374748686800, 0.08426431851158830, 0.05903864465505320, 0.03805966253618680, 0.02152941088003600, 0.00960708477768751, 0.00240750255310301 }; #define BUFLEN 512 double phaseacc = 0.0; double phaseincr = 0.0; double outbuf[BUFLEN]; //=========================================================================== inline double nco() { phaseacc += phaseincr; if (phaseacc > M_PI) phaseacc -= 2.0 * M_PI; return cos(phaseacc); } //===================================================================== //===================================================================== void keydown(double freq, SoundBase *scard) { int i; phaseincr = 2.0 * M_PI * freq / active_modem->get_samplerate(); for (i = 0; i < KNUM; i++) outbuf[i] = nco() * kdshape[i]; for (; i < BUFLEN; i++) outbuf[i] = nco(); active_modem->ModulateXmtr(outbuf, BUFLEN); } //===================================================================== void keyup(double freq, SoundBase *scard) { int i; phaseincr = 2.0 * M_PI * freq / active_modem->get_samplerate(); for (i = 0; i < KNUM; i++) outbuf[i] = nco() * kushape[i]; for (; i < BUFLEN; i++) outbuf[i] = 0.0; active_modem->ModulateXmtr(outbuf, BUFLEN); } //===================================================================== void tune(double freq, SoundBase *scard) { int i; phaseincr = 2.0 * M_PI * freq / active_modem->get_samplerate(); for (i = 0; i < BUFLEN; i++) outbuf[i] = nco(); active_modem->ModulateXmtr(outbuf, BUFLEN); } } // namespace tune fldigi-3.21.80/src/trx/trx.cxx0000664000175000017500000004030512313147652013021 00000000000000// ---------------------------------------------------------------------------- // trx.cxx -- Main transmit/receive control loop / thread // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted in part from code contained in gmfsk // source code distribution. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "trx.h" #include "main.h" #include "fl_digi.h" #include "ascii.h" #include "misc.h" #include "configuration.h" #include "status.h" #include "dtmf.h" #include "soundconf.h" #include "ringbuffer.h" #include "qrunner.h" #include "debug.h" #include "nullmodem.h" #include "macros.h" #if BENCHMARK_MODE # include "benchmark.h" #endif LOG_FILE_SOURCE(debug::LOG_MODEM); using namespace std; void trx_reset_loop(); void trx_start_modem_loop(); void trx_receive_loop(); void trx_transmit_loop(); void trx_tune_loop(); static void trx_signal_state(void); //#define DEBUG /* ---------------------------------------------------------------------- */ static sem_t* trx_sem; static pthread_t trx_thread; state_t trx_state; modem *active_modem = 0; cRsId *ReedSolomon = 0; cDTMF *dtmf = 0; SoundBase *scard; static int _trx_tune; // Ringbuffer for the audio "history". A pointer into this buffer // is also passed to the waterfall signal drawing routines. #define NUMMEMBUFS 1024 static ringbuffer trxrb(ceil2(NUMMEMBUFS * SCBLOCKSIZE)); static float fbuf[SCBLOCKSIZE]; bool bHistory = false; bool bHighSpeed = false; static double hsbuff[SCBLOCKSIZE]; static bool trxrunning = false; #include "tune.cxx" //============================================================================= // Draws the xmit data one WFBLOCKSIZE-sized block at a time static void trx_xmit_wfall_draw(int samplerate) { ENSURE_THREAD(FLMAIN_TID); ringbuffer::vector_type rv[2]; rv[0].buf = 0; rv[1].buf = 0; #define block_read_(vec_) \ while (vec_.len >= WFBLOCKSIZE) { \ wf->sig_data(vec_.buf, WFBLOCKSIZE, samplerate); \ vec_.len -= WFBLOCKSIZE; \ vec_.buf += WFBLOCKSIZE; \ trxrb.read_advance(WFBLOCKSIZE); \ } trxrb.get_rv(rv); block_read_(rv[0]); // read blocks from the first vector if (rv[0].len + rv[1].len < WFBLOCKSIZE) return; if (rv[0].len == 0) block_read_(rv[1]); #undef block_read_ // read non-contiguous data into tmp buffer so that we can // still draw it one block at a time if (unlikely(trxrb.read_space() >= WFBLOCKSIZE)) { double buf[WFBLOCKSIZE]; do { trxrb.read(buf, WFBLOCKSIZE); wf->sig_data(buf, WFBLOCKSIZE, samplerate); } while (trxrb.read_space() >= WFBLOCKSIZE); } } // Called by trx_trx_transmit_loop() to handle data that may be left in the // ringbuffer when we stop transmitting. Will pad with zeroes to a multiple of // WFBLOCKSIZE. static void trx_xmit_wfall_end(int samplerate) { ENSURE_THREAD(TRX_TID); size_t pad = WFBLOCKSIZE - trxrb.read_space() % WFBLOCKSIZE; if (pad == WFBLOCKSIZE) // rb empty or multiple of WFBLOCKSIZE return; ringbuffer::vector_type wv[2]; wv[0].buf = wv[1].buf = 0; trxrb.get_wv(wv, pad); assert(wv[0].len + wv[1].len == pad); if (likely(wv[0].len)) { // fill first vector, write rest to second vector memset(wv[0].buf, 0, wv[0].len * sizeof(*wv[0].buf)); if (pad > wv[0].len) memset(wv[1].buf, 0, (pad - wv[0].len) * sizeof(*wv[1].buf)); } else // all write space is in the second write vector memset(wv[1].buf, 0, pad * sizeof(*wv[1].buf)); trxrb.write_advance(pad); REQ(trx_xmit_wfall_draw, samplerate); } // Copy buf to the ringbuffer if it has enough space. Queue a waterfall // request whenever there are at least WFBLOCKSIZE samples to draw. void trx_xmit_wfall_queue(int samplerate, const double* buf, size_t len) { ENSURE_THREAD(TRX_TID); ringbuffer::vector_type wv[2]; wv[0].buf = wv[1].buf = 0; trxrb.get_wv(wv, len); if (unlikely(wv[0].len + wv[1].len < len)) // not enough space return; #define write_(vec_, len_) \ for (size_t i = 0; i < len_; i++) \ vec_[i] = buf[i] * progdefaults.TxMonitorLevel; size_t n = MIN(wv[0].len, len); write_(wv[0].buf, n); if (len > n) { // write the rest to the second vector buf += n; n = len - n; write_(wv[1].buf, n); } #undef write_ trxrb.write_advance(len); if (trxrb.read_space() >= WFBLOCKSIZE) REQ(trx_xmit_wfall_draw, samplerate); } //============================================================================= void trx_trx_receive_loop() { size_t numread; int current_samplerate; assert(powerof2(SCBLOCKSIZE)); if (unlikely(!active_modem)) { MilliSleep(10); return; } #if BENCHMARK_MODE do_benchmark(); trx_state = STATE_ENDED; return; #endif if (unlikely(!scard)) { MilliSleep(10); return; } try { current_samplerate = active_modem->get_samplerate(); if (scard->Open(O_RDONLY, current_samplerate)) REQ(sound_update, progdefaults.btnAudioIOis); } catch (const SndException& e) { LOG_ERROR("%s", e.what()); put_status(e.what(), 5); scard->Close(); if (e.error() == EBUSY && progdefaults.btnAudioIOis == SND_IDX_PORT) { sound_close(); sound_init(); } MilliSleep(1000); return; } active_modem->rx_init(); ringbuffer::vector_type rbvec[2]; rbvec[0].buf = rbvec[1].buf = 0; while (1) { try { numread = 0; while (numread < SCBLOCKSIZE && trx_state == STATE_RX) numread += scard->Read(fbuf + numread, SCBLOCKSIZE - numread); if (bHighSpeed) { for (size_t i = 0; i < numread; i++) hsbuff[i] = fbuf[i]; } else { if (trxrb.write_space() == 0) // discard some old data trxrb.read_advance(SCBLOCKSIZE); trxrb.get_wv(rbvec); // convert to double and write to rb for (size_t i = 0; i < numread; i++) rbvec[0].buf[i] = fbuf[i]; } } catch (const SndException& e) { scard->Close(); LOG_ERROR("%s", e.what()); put_status(e.what(), 5); MilliSleep(10); return; } if (trx_state != STATE_RX) break; if (bHighSpeed) { bool afc = progStatus.afconoff; progStatus.afconoff = false; QRUNNER_DROP(true); if (progdefaults.rsid) ReedSolomon->receive(fbuf, numread); active_modem->HistoryON(true); active_modem->rx_process(hsbuff, numread); QRUNNER_DROP(false); progStatus.afconoff = afc; active_modem->HistoryON(false); } else { trxrb.write_advance(numread); REQ(&waterfall::sig_data, wf, rbvec[0].buf, numread, current_samplerate); if (!bHistory) { active_modem->rx_process(rbvec[0].buf, numread); if (progdefaults.rsid) ReedSolomon->receive(fbuf, numread); dtmf->receive(fbuf, numread); } else { bool afc = progStatus.afconoff; progStatus.afconoff = false; QRUNNER_DROP(true); active_modem->HistoryON(true); trxrb.get_rv(rbvec); if (rbvec[0].len) active_modem->rx_process(rbvec[0].buf, rbvec[0].len); if (rbvec[1].len) active_modem->rx_process(rbvec[1].buf, rbvec[1].len); QRUNNER_DROP(false); progStatus.afconoff = afc; bHistory = false; active_modem->HistoryON(false); } } } if (scard->must_close(O_RDONLY)) scard->Close(O_RDONLY); } //============================================================================= void trx_trx_transmit_loop() { int current_samplerate; if (!scard) { MilliSleep(10); return; } if (active_modem) { try { current_samplerate = active_modem->get_samplerate(); scard->Open(O_WRONLY, current_samplerate); } catch (const SndException& e) { LOG_ERROR("%s", e.what()); put_status(e.what(), 1); MilliSleep(10); return; } if ((active_modem != ssb_modem) && (active_modem != anal_modem) && !active_modem->XMLRPC_CPS_TEST && !PERFORM_CPS_TEST ) { push2talk->set(true); REQ(&waterfall::set_XmtRcvBtn, wf, true); } active_modem->tx_init(scard); if (!progdefaults.DTMFstr.empty()) dtmf->send(); if ( ReedSolomon->assigned(active_modem->get_mode()) && (progdefaults.TransmitRSid || progStatus.n_rsids != 0)) { if (progStatus.n_rsids < 0) { for (int i = 0; i > progStatus.n_rsids; i--) { ReedSolomon->send(true); MilliSleep(200); } } else if ( progStatus.n_rsids > 0 ) { for (int i = 0; i < progStatus.n_rsids; i++) { ReedSolomon->send(true); MilliSleep(200); } MilliSleep(200); if (progStatus.n_rsids == 1) progStatus.n_rsids = 0; } else ReedSolomon->send(true); } if (progStatus.n_rsids >= 0) { // if(trx_state == STATE_TX) { active_modem->tx_sample_count = 0; active_modem->tx_sample_rate = active_modem->get_samplerate(); // } while (trx_state == STATE_TX) { try { if (active_modem->tx_process() < 0) { trx_state = STATE_RX; } } catch (const SndException& e) { scard->Close(); LOG_ERROR("%s", e.what()); put_status(e.what(), 5); MilliSleep(10); return; } } } else trx_state = STATE_RX; if (ReedSolomon->assigned(active_modem->get_mode()) && progdefaults.TransmitRSid && progdefaults.rsid_post && progStatus.n_rsids >= 0) ReedSolomon->send(false); progStatus.n_rsids = 0; trx_xmit_wfall_end(current_samplerate); scard->flush(); if (scard->must_close(O_WRONLY)) scard->Close(O_WRONLY); } else MilliSleep(10); push2talk->set(false); REQ(&waterfall::set_XmtRcvBtn, wf, false); if (progStatus.timer) REQ(startMacroTimer); WriteARQ(0x06); } //============================================================================= void trx_tune_loop() { int current_samplerate; if (!scard) { MilliSleep(10); return; } if (active_modem) { try { current_samplerate = active_modem->get_samplerate(); scard->Open(O_WRONLY, current_samplerate); } catch (const SndException& e) { LOG_ERROR("%s", e.what()); put_status(e.what(), 1); MilliSleep(10); return; } push2talk->set(true); active_modem->tx_init(scard); try { while (trx_state == STATE_TUNE) { if (_trx_tune == 0) { REQ(&waterfall::set_XmtRcvBtn, wf, true); xmttune::keydown(active_modem->get_txfreq_woffset(), scard); _trx_tune = 1; } else xmttune::tune(active_modem->get_txfreq_woffset(), scard); } xmttune::keyup(active_modem->get_txfreq_woffset(), scard); } catch (const SndException& e) { scard->Close(); LOG_ERROR("%s", e.what()); put_status(e.what(), 5); MilliSleep(10); return; } scard->flush(); if (scard->must_close(O_WRONLY)) scard->Close(O_WRONLY); _trx_tune = 0; } else MilliSleep(10); push2talk->set(false); REQ(&waterfall::set_XmtRcvBtn, wf, false); } //============================================================================= void *trx_loop(void *args) { SET_THREAD_ID(TRX_TID); state_t old_state = STATE_NOOP; for (;;) { if (unlikely(old_state != trx_state)) { old_state = trx_state; if (trx_state == STATE_TX || trx_state == STATE_TUNE) trxrb.reset(); trx_signal_state(); } LOG_DEBUG("trx state %s", trx_state == STATE_ABORT ? "abort" : trx_state == STATE_ENDED ? "ended" : trx_state == STATE_RESTART ? "restart" : trx_state == STATE_NEW_MODEM ? "new modem" : trx_state == STATE_TX ? "tx" : trx_state == STATE_TUNE ? "tune" : trx_state == STATE_RX ? "rx" : "unknown"); switch (trx_state) { case STATE_ABORT: delete scard; scard = 0; trx_state = STATE_ENDED; // fall through case STATE_ENDED: return 0; case STATE_RESTART: trx_reset_loop(); break; case STATE_NEW_MODEM: trx_start_modem_loop(); break; case STATE_TX: trx_trx_transmit_loop(); break; case STATE_TUNE: trx_tune_loop(); break; case STATE_RX: trx_trx_receive_loop(); break; default: LOG(debug::ERROR_LEVEL, debug::LOG_MODEM, "trx in bad state %d\n", trx_state); MilliSleep(100); } } } //============================================================================= static modem* new_modem; static int new_freq; void trx_start_modem_loop() { if (new_modem == active_modem) { if (new_freq > 0) active_modem->set_freq(new_freq); active_modem->restart(); trx_state = STATE_RX; return; } modem* old_modem = active_modem; new_modem->init(); active_modem = new_modem; if (new_freq > 0) active_modem->set_freq(new_freq); trx_state = STATE_RX; REQ(&waterfall::opmode, wf); if (old_modem) { *mode_info[old_modem->get_mode()].modem = 0; delete old_modem; } } //============================================================================= void trx_start_modem(modem* m, int f) { new_modem = m; new_freq = f; trx_state = STATE_NEW_MODEM; } //============================================================================= void trx_reset_loop() { if (scard) { delete scard; scard = 0; } switch (progdefaults.btnAudioIOis) { #if USE_OSS case SND_IDX_OSS: scard = new SoundOSS(scDevice[0].c_str()); break; #endif #if USE_PORTAUDIO case SND_IDX_PORT: scard = new SoundPort(scDevice[0].c_str(), scDevice[1].c_str()); break; #endif #if USE_PULSEAUDIO case SND_IDX_PULSE: scard = new SoundPulse(scDevice[0].c_str()); break; #endif case SND_IDX_NULL: scard = new SoundNull; break; default: abort(); } trx_state = STATE_RX; } //============================================================================= void trx_reset(void) { trx_state = STATE_RESTART; } //============================================================================= void trx_start(void) { #if !BENCHMARK_MODE if (trxrunning) { LOG(debug::ERROR_LEVEL, debug::LOG_MODEM, "trx already running!"); return; } if (scard) delete scard; if (ReedSolomon) delete ReedSolomon; if (dtmf) delete dtmf; switch (progdefaults.btnAudioIOis) { #if USE_OSS case SND_IDX_OSS: scard = new SoundOSS(scDevice[0].c_str()); break; #endif #if USE_PORTAUDIO case SND_IDX_PORT: scard = new SoundPort(scDevice[0].c_str(), scDevice[1].c_str()); break; #endif #if USE_PULSEAUDIO case SND_IDX_PULSE: scard = new SoundPulse(scDevice[0].c_str()); break; #endif case SND_IDX_NULL: scard = new SoundNull; break; default: abort(); } ReedSolomon = new cRsId; dtmf = new cDTMF; #endif // !BENCHMARK_MODE #if USE_NAMED_SEMAPHORES char sname[32]; snprintf(sname, sizeof(sname), "trx-%u-%s", getpid(), PACKAGE_TARNAME); if ((trx_sem = sem_open(sname, O_CREAT | O_EXCL, 0600, 0)) == (sem_t*)SEM_FAILED) { LOG_PERROR("sem_open"); abort(); } # if HAVE_SEM_UNLINK if (sem_unlink(sname) == -1) { LOG_PERROR("sem_unlink"); abort(); } # endif #else trx_sem = new sem_t; if (sem_init(trx_sem, 0, 0) == -1) { LOG_PERROR("sem_init"); abort(); } #endif trx_state = STATE_RX; _trx_tune = 0; active_modem = 0; if (pthread_create(&trx_thread, NULL, trx_loop, NULL) < 0) { LOG(debug::ERROR_LEVEL, debug::LOG_MODEM, "pthread_create failed"); trxrunning = false; exit(1); } trxrunning = true; } //============================================================================= void trx_close() { trx_state = STATE_ABORT; while (trx_state != STATE_ENDED) MilliSleep(100); #if USE_NAMED_SEMAPHORES if (sem_close(trx_sem) == -1) LOG_PERROR("sem_close"); #else if (sem_destroy(trx_sem) == -1) LOG_PERROR("sem_destroy"); delete trx_sem; #endif if (scard) { delete scard; scard = 0; } } //============================================================================= void trx_transmit(void) { trx_state = STATE_TX; } void trx_tune(void) { trx_state = STATE_TUNE; } void trx_receive(void) { trx_state = STATE_RX; } //============================================================================= void trx_wait_state(void) { ENSURE_NOT_THREAD(TRX_TID); sem_wait(trx_sem); } static void trx_signal_state(void) { ENSURE_THREAD(TRX_TID); sem_post(trx_sem); } fldigi-3.21.80/src/trx/modem.cxx0000664000175000017500000010203712313147652013306 00000000000000// ---------------------------------------------------------------------------- // modem.cxx - modem class - base for all modems // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "misc.h" #include "filters.h" #include "confdialog.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "main.h" #include "arq_io.h" #include "configuration.h" #include "waterfall.h" #include "qrunner.h" #include "macros.h" #include "status.h" #include "debug.h" using namespace std; modem *null_modem = 0; modem *cw_modem = 0; modem *mfsk8_modem = 0; modem *mfsk16_modem = 0; modem *mfsk32_modem = 0; // experimental modes modem *mfsk4_modem = 0; modem *mfsk11_modem = 0; modem *mfsk22_modem = 0; modem *mfsk31_modem = 0; modem *mfsk64_modem = 0; modem *mfsk128_modem = 0; modem *mfsk64l_modem = 0; modem *mfsk128l_modem = 0; modem *wefax576_modem = 0; modem *wefax288_modem = 0; modem *navtex_modem = 0; modem *sitorb_modem = 0; modem *mt63_500S_modem = 0; modem *mt63_500L_modem = 0; modem *mt63_1000S_modem = 0; modem *mt63_1000L_modem = 0; modem *mt63_2000S_modem = 0; modem *mt63_2000L_modem = 0; modem *feld_modem = 0; modem *feld_slowmodem = 0; modem *feld_x5modem = 0; modem *feld_x9modem = 0; modem *feld_FMmodem = 0; modem *feld_FM105modem = 0; modem *feld_80modem = 0; modem *feld_CMTmodem = 0; modem *psk31_modem = 0; modem *psk63_modem = 0; modem *psk63f_modem = 0; modem *psk125_modem = 0; modem *psk250_modem = 0; modem *psk500_modem = 0; modem *psk1000_modem = 0; modem *qpsk31_modem = 0; modem *qpsk63_modem = 0; modem *qpsk125_modem = 0; modem *qpsk250_modem = 0; modem *qpsk500_modem = 0; modem *psk125r_modem = 0; modem *psk250r_modem = 0; modem *psk500r_modem = 0; modem *psk1000r_modem = 0; modem *psk800_c2_modem = 0; modem *psk800r_c2_modem = 0; modem *psk1000_c2_modem = 0; modem *psk1000r_c2_modem = 0; modem *psk63r_c4_modem = 0; modem *psk63r_c5_modem = 0; modem *psk63r_c10_modem = 0; modem *psk63r_c20_modem = 0; modem *psk63r_c32_modem = 0; modem *psk125r_c4_modem = 0; modem *psk125r_c5_modem = 0; modem *psk125r_c10_modem = 0; modem *psk125_c12_modem = 0; modem *psk125r_c12_modem = 0; modem *psk125r_c16_modem = 0; modem *psk250r_c2_modem = 0; modem *psk250r_c3_modem = 0; modem *psk250r_c5_modem = 0; modem *psk250_c6_modem = 0; modem *psk250r_c6_modem = 0; modem *psk250r_c7_modem = 0; modem *psk500_c2_modem = 0; modem *psk500_c4_modem = 0; modem *psk500r_c2_modem = 0; modem *psk500r_c3_modem = 0; modem *psk500r_c4_modem = 0; modem *olivia_modem = 0; modem *olivia_4_250_modem = 0; modem *olivia_8_250_modem = 0; modem *olivia_4_500_modem = 0; modem *olivia_8_500_modem = 0; modem *olivia_16_500_modem = 0; modem *olivia_8_1000_modem = 0; modem *olivia_16_1000_modem = 0; modem *olivia_32_1000_modem = 0; modem *olivia_64_2000_modem = 0; modem *contestia_modem = 0; modem *rtty_modem = 0; modem *thor4_modem = 0; modem *thor5_modem = 0; modem *thor8_modem = 0; modem *thor11_modem = 0; modem *thor16_modem = 0; modem *thor22_modem = 0; modem *thor25x4_modem = 0; modem *thor50x1_modem = 0; modem *thor50x2_modem = 0; modem *thor100_modem = 0; modem *dominoex4_modem = 0; modem *dominoex5_modem = 0; modem *dominoex8_modem = 0; modem *dominoex11_modem = 0; modem *dominoex16_modem = 0; modem *dominoex22_modem = 0; modem *dominoex44_modem = 0; modem *dominoex88_modem = 0; modem *throb1_modem = 0; modem *throb2_modem = 0; modem *throb4_modem = 0; modem *throbx1_modem = 0; modem *throbx2_modem = 0; modem *throbx4_modem = 0; modem *wwv_modem = 0; modem *anal_modem = 0; modem *ssb_modem = 0; double modem::frequency = 1000; double modem::tx_frequency = 1000; bool modem::freqlock = false; // For xml socket command unsigned long modem::tx_sample_count = 0; unsigned int modem::tx_sample_rate = 0; bool modem::XMLRPC_CPS_TEST = false; modem::modem() { scptr = 0; if( !progdefaults.retain_freq_lock ) { freqlock = false; frequency = tx_frequency = 1000; } sigsearch = 0; if (wf) { bool wfrev = wf->Reverse(); bool wfsb = wf->USB(); reverse = wfrev ^ !wfsb; } else reverse = false; historyON = false; cap = CAP_RX | CAP_TX; PTTphaseacc = 0.0; s2n_ncount = s2n_sum = s2n_sum2 = s2n_metric = 0.0; s2n_valid = false; bandwidth = 0.0; } // modem types CW and RTTY do not use the base init() void modem::init() { stopflag = false; if (!wf) return; bool wfrev = wf->Reverse(); bool wfsb = wf->USB(); reverse = wfrev ^ !wfsb; if (progdefaults.StartAtSweetSpot) { set_freq(progdefaults.PSKsweetspot); } else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); } void modem::set_freq(double freq) { frequency = CLAMP( freq, progdefaults.LowFreqCutoff + bandwidth / 2, progdefaults.HighFreqCutoff - bandwidth / 2); if (freqlock == false) tx_frequency = frequency; REQ(put_freq, frequency); } void modem::set_freqlock(bool on) { freqlock = on; set_freq(frequency); } double modem::get_txfreq(void) const { if (unlikely(!(cap & CAP_TX))) return 0; else if (mailserver && progdefaults.PSKmailSweetSpot) return progdefaults.PSKsweetspot; return tx_frequency; } double modem::get_txfreq_woffset(void) const { if (mailserver && progdefaults.PSKmailSweetSpot) return (progdefaults.PSKsweetspot - progdefaults.TxOffset); return (tx_frequency - progdefaults.TxOffset); } void modem::set_bandwidth(double bw) { bandwidth = bw; put_Bandwidth((int)bandwidth); } void modem::set_reverse(bool on) { if (likely(wf)) reverse = on ^ (!wf->USB()); else reverse = false; } void modem::set_metric(double m) { metric = m; } void modem::display_metric(double m) { set_metric(m); ::global_display_metric(m); } bool modem::get_cwTrack() { return cwTrack; } void modem::set_cwTrack(bool b) { cwTrack = b; } bool modem::get_cwLock() { return cwLock; } void modem::set_cwLock(bool b) { cwLock = b; } double modem::get_cwRcvWPM() { return cwRcvWPM; } double modem::get_cwXmtWPM() { return cwXmtWPM; } void modem::set_cwXmtWPM(double wpm) { cwXmtWPM = wpm; } void modem::set_samplerate(int smprate) { samplerate = smprate; } double modem::PTTnco() { PTTphaseacc += TWOPI * 1000 / samplerate; if (PTTphaseacc > M_PI) PTTphaseacc -= TWOPI; return sin(PTTphaseacc); } double modem::sigmaN (double es_ovr_n0) { double sn_ratio, sigma; double mode_factor = 0.707; switch (mode) { case MODE_CW: mode_factor /= 0.44; break; case MODE_FELDHELL: case MODE_SLOWHELL: case MODE_HELLX5: case MODE_HELLX9: mode_factor /= 0.22; break; case MODE_MT63_500S: case MODE_MT63_1000S: case MODE_MT63_2000S : case MODE_MT63_500L: case MODE_MT63_1000L: case MODE_MT63_2000L : mode_factor *= 3.0; break; case MODE_PSK31: case MODE_PSK63: case MODE_PSK63F: case MODE_PSK125: case MODE_PSK250: case MODE_PSK500: case MODE_QPSK31: case MODE_QPSK63: case MODE_QPSK125: case MODE_QPSK250: case MODE_PSK125R: case MODE_PSK250R: case MODE_PSK500R: mode_factor *= 16; break; case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: case MODE_THROBX1: case MODE_THROBX2: case MODE_THROBX4: mode_factor *= 6.0; break; // case MODE_RTTY: // case MODE_OLIVIA: // case MODE_DOMINOEX4: case MODE_DOMINOEX5: case MODE_DOMINOEX8: // case MODE_DOMINOEX11: case MODE_DOMINOEX16: case MODE_DOMINOEX22: // case MODE_MFSK4: case MODE_MFSK11: case MODE_MFSK22: case MODE_MFSK31: // case MODE_MFSK64: case MODE_MFSK8: case MODE_MFSK16: case MODE_MFSK32: // case MODE_THOR4: case MODE_THOR5: case MODE_THOR8: // case MODE_THOR11:case MODE_THOR16: case MODE_THOR22: // case MODE_FSKHELL: case MODE_FSKH105: case MODE_HELL80: default: break; } if (trx_state == STATE_TUNE) mode_factor = 0.707; sn_ratio = pow(10, ( es_ovr_n0 / 10) ); sigma = sqrt ( mode_factor / sn_ratio ); return sigma; } // A Rayleigh-distributed random variable R, with the probability // distribution // F(R) = 0 where R < 0 and // F(R) = 1 - exp(-R^2/2*sigma^2) where R >= 0, // is related to a pair of Gaussian variables C and D // through the transformation // C = R * cos(theta) and // D = R * sin(theta), // where theta is a uniformly distributed variable in the interval // 0 to 2 * Pi. double modem::gauss(double sigma) { double u, r; u = 1.0 * rand() / RAND_MAX; r = sigma * sqrt( 2.0 * log( 1.0 / (1.0 - u) ) ); u = 1.0 * rand() / RAND_MAX; return r * cos(2 * M_PI * u); } // given the desired Es/No, calculate the standard deviation of the // additive white gaussian noise (AWGN). The standard deviation of // the AWGN will be used to generate Gaussian random variables // simulating the noise that is added to the signal. // return signal + noise, limiting value to +/- 1.0 void modem::add_noise(double *buffer, int len) { double sigma = sigmaN(progdefaults.s2n); double sn = 0; for (int n = 0; n < len; n++) { sn = (buffer[n] + gauss(sigma)) / (1.0 + 3.0 * sigma); buffer[n] = clamp(sn, -1.0, 1.0); } } void modem::s2nreport(void) { double s2n_avg = s2n_sum / s2n_ncount; double s2n_stddev = sqrt((s2n_sum2 / s2n_ncount) - (s2n_avg * s2n_avg)); pskmail_notify_s2n(s2n_ncount, s2n_avg, s2n_stddev); } void modem::ModulateXmtr(double *buffer, int len) { if (unlikely(!scard)) return; tx_sample_count += len; if (progdefaults.PTTrightchannel) { for (int i = 0; i < len; i++) PTTchannel[i] = PTTnco(); ModulateStereo( buffer, PTTchannel, len); return; } if (progdefaults.viewXmtSignal && !(PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST)) trx_xmit_wfall_queue(samplerate, buffer, (size_t)len); if (withnoise && progdefaults.noise) add_noise(buffer, len); double mult = pow(10, progdefaults.txlevel / 20.0); for (int i = 0; i < len; i++) { if (buffer[i] < -1.0) buffer[i] = -1.0; if (buffer[i] > 1.0) buffer[i] = 1.0; buffer[i] *= mult; } try { unsigned n = 4; while (scard->Write(buffer, len) == 0 && --n); if (n == 0) throw SndException(-99, "Sound write failed"); } catch (const SndException& e) { if(e.error() < 0) { LOG_ERROR("%s", e.what()); throw; } return; } } #include using namespace std; void modem::ModulateStereo(double *left, double *right, int len) { if (unlikely(!scard)) return; tx_sample_count += len; if (progdefaults.viewXmtSignal && !(PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST)) trx_xmit_wfall_queue(samplerate, left, (size_t)len); if (withnoise && progdefaults.noise) add_noise(left, len); double mult = 0.98 * pow(10, progdefaults.txlevel / 20.0); for (int i = 0; i < len; i++) { if (right[i] < -1.0) right[i] = -1.0; if (right[i] > 1.0) right[i] = 1.0; if (left[i] < -1.0) left[i] = -1.0; if (left[i] > 1.0) left[i] = 1.0; left[i] *= mult; } try { unsigned n = 4; while (scard->Write_stereo(left, right, len) == 0 && --n); if (n == 0) throw SndException(-99, "Sound write failed"); } catch (const SndException& e) { if(e.error() < 0) { LOG_ERROR("%s", e.what()); throw; } return; } } void modem::videoText() { if (trx_state == STATE_TUNE) return; if (progdefaults.pretone > 0.2) pretone(); if (progdefaults.sendtextid == true) { wfid_text(progdefaults.strTextid); } else if (progdefaults.macrotextid == true) { wfid_text(progdefaults.strTextid); progdefaults.macrotextid = false; } if (progdefaults.videoid_modes.test(mode) && (progdefaults.sendid || progdefaults.macroid)) { #define TLEN 20 char idtxt[TLEN] = ""; switch(mode_info[mode].mode) { case MODE_CONTESTIA: snprintf(idtxt, TLEN, "%s-%d/%d", mode_info[mode].vid_name, 2*(1<(rtty::BAUD[progdefaults.rtty_baud]), rtty::BITS[progdefaults.rtty_bits]); break; case MODE_DOMINOEX4: case MODE_DOMINOEX5: case MODE_DOMINOEX8: case MODE_DOMINOEX11: case MODE_DOMINOEX16: case MODE_DOMINOEX22: if (progdefaults.DOMINOEX_FEC) snprintf(idtxt, TLEN, "%s-FEC", mode_info[mode].vid_name); else strcpy(idtxt, mode_info[mode].vid_name); break; default: strcpy(idtxt, mode_info[mode].vid_name); break; } wfid_text(idtxt); progdefaults.macroid = false; } } // CW ID transmit routines //=========================================================================== // cw transmit routines to send a post amble message // Define the amplitude envelop for key down events // this is 1/2 cycle of a raised cosine //=========================================================================== void modem::cwid_makeshape() { for (int i = 0; i < 128; i++) cwid_keyshape[i] = 1.0; for (int i = 0; i < RT; i++) cwid_keyshape[i] = 0.5 * (1.0 - cos (M_PI * i / RT)); } double modem::cwid_nco(double freq) { cwid_phaseacc += 2.0 * M_PI * freq / samplerate; if (cwid_phaseacc > M_PI) cwid_phaseacc -= 2.0 * M_PI; return sin(cwid_phaseacc); } //===================================================================== // cwid_send_symbol() // Sends a part of a morse character (one dot duration) of either // sound at the correct freq or silence. Rise and fall time is controlled // with a raised cosine shape. // // Left channel contains the shaped A2 CW waveform //======================================================================= void modem::cwid_send_symbol(int bits) { double freq; int i, keydown, keyup, sample = 0, currsym = bits & 1; freq = tx_frequency - progdefaults.TxOffset; if ((currsym == 1) && (cwid_lastsym == 0)) cwid_phaseacc = 0.0; keydown = cwid_symbollen - RT; keyup = cwid_symbollen - RT; if (currsym == 1) { for (i = 0; i < RT; i++, sample++) { if (cwid_lastsym == 0) outbuf[sample] = cwid_nco(freq) * cwid_keyshape[i]; else outbuf[sample] = cwid_nco(freq); } for (i = 0; i < keydown; i++, sample++) { outbuf[sample] = cwid_nco(freq); } } else { for (i = RT - 1; i >= 0; i--, sample++) { if (cwid_lastsym == 1) { outbuf[sample] = cwid_nco(freq) * cwid_keyshape[i]; } else { outbuf[sample] = 0.0; } } for (i = 0; i < keyup; i++, sample++) { outbuf[sample] = 0.0; } } ModulateXmtr(outbuf, cwid_symbollen); cwid_lastsym = currsym; } //===================================================================== // send_ch() // sends a morse character and the space afterwards //======================================================================= void modem::cwid_send_ch(int ch) { int code; // handle word space separately (7 dots spacing) // last char already had 2 elements of inter-character spacing if ((ch == ' ') || (ch == '\n')) { cwid_send_symbol(0); cwid_send_symbol(0); cwid_send_symbol(0); cwid_send_symbol(0); cwid_send_symbol(0); put_echo_char(ch); return; } // convert character code to a morse representation if ((ch < 256) && (ch >= 0)) { code = morse.tx_lookup(ch); //cw_tx_lookup(ch); } else { code = 0x04; // two extra dot spaces } // loop sending out binary bits of cw character while (code > 1) { cwid_send_symbol(code);// & 1); code = code >> 1; } } void modem::cwid_sendtext (const string& s) { cwid_symbollen = (int)(1.2 * samplerate / progdefaults.CWIDwpm); RT = (int) (samplerate * 6 / 1000.0); // 6 msec risetime for CW pulse cwid_makeshape(); cwid_lastsym = 0; for (unsigned int i = 0; i < s.length(); i++) { cwid_send_ch(s[i]); } } void modem::cwid() { if (progdefaults.cwid_modes.test(mode) && (progdefaults.CWid == true || progdefaults.macroCWid == true)) { string tosend = " DE "; tosend += progdefaults.myCall; cwid_sendtext(tosend); progdefaults.macroCWid = false; } } //===================================================================== // transmit processing of waterfall video id //===================================================================== static int NUMROWS; static int NUMCOLS; static int TONESPACING; static int IDSYMLEN; static int CHARSPACE; static bool useIDSMALL = true; #define MAXROWS 14 #define MAXIDSYMLEN 16384 #define MAXTONES 128 #define MAXCHARS 10 struct mfntchr { char c; int byte[MAXROWS]; }; extern mfntchr idch1[]; // original id font definition extern mfntchr idch2[]; // extended id font definition static int id_symbols[MAXCHARS]; static C_FIR_filter vidfilt; void modem::wfid_make_tones(int numchars) { double f, flo, fhi; int vwidth = (numchars*NUMCOLS + (numchars-1)*CHARSPACE - 1); f = frequency + TONESPACING * vwidth/2.0; fhi = f + TONESPACING; flo = fhi - (vwidth + 2) * TONESPACING; for (int i = 1; i <= NUMCOLS * numchars; i++) { wfid_w[i-1] = f * 2.0 * M_PI / samplerate; f -= TONESPACING; if ( (i > 0) && (i % NUMCOLS == 0) ) f -= TONESPACING * CHARSPACE; } vidfilt.init_bandpass( 1024, 1, flo/samplerate, fhi/samplerate) ; } void modem::wfid_send(int numchars) { int i, j, k; int sym; double val; for (i = 0; i < IDSYMLEN; i++) { val = 0.0; for (k = 0; k < numchars; k++) { sym = id_symbols[numchars - k - 1]; for (j = 0; j < NUMCOLS; j++) { if (sym & 1) val += sin(wfid_w[j + k * NUMCOLS] * i); sym = sym >> 1; } } // soft limit the signal - heuristic formulation val = (1.0 - exp(-fabs(val)/3.0)) * (val >= 0.0 ? 1 : -1); // band pass filter the soft limited signal vidfilt.Irun( val, val ); wfid_outbuf[i] = val; } ModulateXmtr(wfid_outbuf, IDSYMLEN); } void modem::wfid_sendchars(string s) { int len = s.length(); int n[len]; int c; wfid_make_tones(s.length()); for (int i = 0; i < len; i++) { if (useIDSMALL) { c = toupper(s[i]); if (c > 'Z' || c < ' ') c = ' '; } else { c = s[i]; if (c > '~' || c < ' ') c = ' '; } n[i] = c - ' '; } // send rows from bottom to top so they appear to scroll down the waterfall correctly for (int row = 0; row < NUMROWS; row++) { for (int i = 0; i < len; i++) { if (useIDSMALL) id_symbols[i] = idch1[n[i]].byte[NUMROWS - 1 - row]; else id_symbols[i] = idch2[n[i]].byte[NUMROWS - 1 - row]; } wfid_send(len); if (stopflag) return; } } void modem::pretone() { int sr = get_samplerate(); int symlen = sr / 10; double phaseincr = 2.0 * M_PI * get_txfreq() / sr; double phase = 0.0; double outbuf[symlen]; for (int j = 0; j < symlen; j++) { outbuf[j] = (0.5 * (1.0 - cos (M_PI * j / symlen)))*sin(phase); phase += phaseincr; if (phase > 2.0 * M_PI) phase -= 2.0 * M_PI; } ModulateXmtr(outbuf, symlen); for (int i = 0; i < progdefaults.pretone * 10 - 2; i++) { for (int j = 0; j < symlen; j++) { outbuf[j] = sin(phase); phase += phaseincr; if (phase > 2.0 * M_PI) phase -= 2.0 * M_PI; } ModulateXmtr(outbuf, symlen); } for (int j = 0; j < symlen; j++) { outbuf[j] = (0.5 * (1.0 - cos (M_PI * (symlen - j) / symlen)))*sin(phase); phase += phaseincr; if (phase > 2.0 * M_PI) phase -= 2.0 * M_PI; } ModulateXmtr(outbuf, symlen); memset(outbuf, 0, symlen * sizeof(*outbuf)); ModulateXmtr(outbuf, symlen); } void modem::wfid_text(const string& s) { int len = s.length(); string video = "Video text: "; video += s; if (progdefaults.ID_SMALL) { NUMROWS = 7; NUMCOLS = 5; CHARSPACE = 2; vidwidth = progdefaults.videowidth; TONESPACING = 6; IDSYMLEN = 3072; useIDSMALL = true; } else { NUMROWS = 14; NUMCOLS = 8; CHARSPACE = 2; vidwidth = progdefaults.videowidth; TONESPACING = 8; IDSYMLEN = 2560; useIDSMALL = false; } if (progdefaults.vidlimit) { if ((vidwidth * TONESPACING * (NUMCOLS + CHARSPACE)) > 500) vidwidth = 500 / (TONESPACING * (NUMCOLS + CHARSPACE)); } if (progdefaults.vidmodelimit) { if ((vidwidth * TONESPACING * (NUMCOLS + CHARSPACE)) > get_bandwidth()) vidwidth = (int)ceil(get_bandwidth() / (TONESPACING * (NUMCOLS + CHARSPACE))); } put_status(video.c_str()); int numlines = 0; string tosend; while (numlines < len) numlines += vidwidth; numlines -= vidwidth; while (numlines >= 0) { tosend = s.substr(numlines, vidwidth); wfid_sendchars(tosend); numlines -= vidwidth; if (stopflag) break; } // blank lines for (int i = 0; i < vidwidth; i++) id_symbols[i] = 0; wfid_send(vidwidth); wfid_send(vidwidth); put_status(""); } double modem::wfid_outbuf[MAXIDSYMLEN]; double modem::wfid_w[MAXTONES]; mfntchr idch1[] = { { ' ', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, }, { '!', { 0x00, 0x08, 0x08, 0x08, 0x00, 0x08, 0x00, }, }, { '"', { 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, }, }, { '#', { 0x00, 0x0A, 0x1F, 0x0A, 0x1F, 0x0A, 0x00, }, }, { '$', { 0x00, 0x0F, 0x14, 0x0E, 0x05, 0x1E, 0x00, }, }, { '%', { 0x00, 0x19, 0x02, 0x04, 0x08, 0x13, 0x00, }, }, { '&', { 0x00, 0x08, 0x1C, 0x0D, 0x12, 0x0F, 0x00, }, }, { '\'', { 0x00, 0x18, 0x08, 0x10, 0x00, 0x00, 0x00, }, }, { '(', { 0x00, 0x0C, 0x10, 0x10, 0x10, 0x0C, 0x00, }, }, { ')', { 0x00, 0x18, 0x04, 0x04, 0x04, 0x18, 0x00, }, }, { '*', { 0x00, 0x15, 0x0E, 0x1F, 0x0E, 0x15, 0x00, }, }, { '+', { 0x00, 0x00, 0x04, 0x1F, 0x04, 0x00, 0x00, }, }, { ',', { 0x00, 0x00, 0x00, 0x00, 0x18, 0x08, 0x00, }, }, { '-', { 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, }, }, { '.', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, }, }, { '/', { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, }, }, { '0', { 0x00, 0x0E, 0x13, 0x15, 0x19, 0x0E, 0x00, }, }, { '1', { 0x00, 0x0C, 0x14, 0x04, 0x04, 0x04, 0x00, }, }, { '2', { 0x00, 0x1C, 0x02, 0x04, 0x08, 0x1F, 0x00, }, }, { '3', { 0x00, 0x1E, 0x01, 0x06, 0x01, 0x1E, 0x00, }, }, { '4', { 0x00, 0x12, 0x12, 0x1F, 0x02, 0x02, 0x00, }, }, { '5', { 0x00, 0x1F, 0x10, 0x1E, 0x01, 0x1E, 0x00, }, }, { '6', { 0x00, 0x0E, 0x10, 0x1E, 0x11, 0x0E, 0x00, }, }, { '7', { 0x00, 0x1F, 0x01, 0x02, 0x04, 0x08, 0x00, }, }, { '8', { 0x00, 0x0E, 0x11, 0x0E, 0x11, 0x0E, 0x00, }, }, { '9', { 0x00, 0x0E, 0x11, 0x0F, 0x01, 0x0E, 0x00, }, }, { ':', { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, }, }, { ';', { 0x00, 0x18, 0x00, 0x18, 0x08, 0x10, 0x00, }, }, { '<', { 0x00, 0x01, 0x06, 0x18, 0x06, 0x01, 0x00, }, }, { '=', { 0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, }, }, { '>', { 0x00, 0x10, 0x0C, 0x03, 0x0C, 0x10, 0x00, }, }, { '?', { 0x00, 0x1C, 0x02, 0x04, 0x00, 0x04, 0x00, }, }, { '@', { 0x00, 0x0E, 0x11, 0x16, 0x10, 0x0F, 0x00, }, }, { 'A', { 0x00, 0x0E, 0x11, 0x1F, 0x11, 0x11, 0x00, }, }, { 'B', { 0x00, 0x1E, 0x09, 0x0E, 0x09, 0x1E, 0x00, }, }, { 'C', { 0x00, 0x0F, 0x10, 0x10, 0x10, 0x0F, 0x00, }, }, { 'D', { 0x00, 0x1E, 0x11, 0x11, 0x11, 0x1E, 0x00, }, }, { 'E', { 0x00, 0x1F, 0x10, 0x1C, 0x10, 0x1F, 0x00, }, }, { 'F', { 0x00, 0x1F, 0x10, 0x1C, 0x10, 0x10, 0x00, }, }, { 'G', { 0x00, 0x0F, 0x10, 0x13, 0x11, 0x0F, 0x00, }, }, { 'H', { 0x00, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x00, }, }, { 'I', { 0x00, 0x1C, 0x08, 0x08, 0x08, 0x1C, 0x00, }, }, { 'J', { 0x00, 0x01, 0x01, 0x01, 0x11, 0x0E, 0x00, }, }, { 'K', { 0x00, 0x11, 0x12, 0x1C, 0x12, 0x11, 0x00, }, }, { 'L', { 0x00, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, }, }, { 'M', { 0x00, 0x11, 0x1B, 0x15, 0x11, 0x11, 0x00, }, }, { 'N', { 0x00, 0x11, 0x19, 0x15, 0x13, 0x11, 0x00, }, }, { 'O', { 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00, }, }, { 'P', { 0x00, 0x1E, 0x11, 0x1E, 0x10, 0x10, 0x00, }, }, { 'Q', { 0x00, 0x0E, 0x11, 0x11, 0x15, 0x0E, 0x01, }, }, { 'R', { 0x00, 0x1E, 0x11, 0x1E, 0x12, 0x11, 0x00, }, }, { 'S', { 0x00, 0x0F, 0x10, 0x0E, 0x01, 0x1E, 0x00, }, }, { 'T', { 0x00, 0x1F, 0x04, 0x04, 0x04, 0x04, 0x00, }, }, { 'U', { 0x00, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00, }, }, { 'V', { 0x00, 0x11, 0x12, 0x14, 0x18, 0x10, 0x00, }, }, { 'W', { 0x00, 0x11, 0x11, 0x15, 0x15, 0x0A, 0x00, }, }, { 'X', { 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x00, }, }, { 'Y', { 0x00, 0x11, 0x0A, 0x04, 0x04, 0x04, 0x00, }, }, { 'Z', { 0x00, 0x1F, 0x02, 0x04, 0x08, 0x1F, 0x00, }, }, }; mfntchr idch2[] = { {' ', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'!', { 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00 }, }, {'"', { 0x00, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'#', { 0x00, 0x50, 0x50, 0xF8, 0xF8, 0x50, 0x50, 0xF8, 0xF8, 0x50, 0x50, 0x00, 0x00, 0x00 }, }, {'$', { 0x00, 0x20, 0x20, 0x78, 0xF8, 0xA0, 0xF0, 0x78, 0x28, 0xF8, 0xF0, 0x20, 0x20, 0x00 }, }, {'%', { 0x00, 0x40, 0xE4, 0xE4, 0x4C, 0x18, 0x30, 0x60, 0xC8, 0x9C, 0x9C, 0x88, 0x00, 0x00 }, }, {'&', { 0x00, 0x30, 0x78, 0x48, 0x48, 0x70, 0xF4, 0x8C, 0x88, 0xFC, 0x74, 0x00, 0x00, 0x00 }, }, {'\'', { 0x00, 0x40, 0x40, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'(', { 0x00, 0x00, 0x20, 0x60, 0xC0, 0x80, 0x80, 0x80, 0x80, 0xC0, 0x60, 0x20, 0x00, 0x00 }, }, {')', { 0x00, 0x00, 0x80, 0xC0, 0x60, 0x20, 0x20, 0x20, 0x20, 0x60, 0xC0, 0x80, 0x00, 0x00 }, }, {'*', { 0x00, 0x00, 0x00, 0x10, 0x10, 0xFE, 0x7C, 0x38, 0x6C, 0x44, 0x00, 0x00, 0x00, 0x00 }, }, {'+', { 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0xF8, 0xF8, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00 }, }, {',', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x40, 0xC0, 0x80 }, }, {'-', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'.', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00 }, }, {'/', { 0x00, 0x08, 0x08, 0x18, 0x10, 0x30, 0x20, 0x60, 0x40, 0xC0, 0x80, 0x80, 0x00, 0x00 }, }, {'0', { 0x00, 0x00, 0x78, 0xFC, 0x8C, 0x9C, 0xB4, 0xE4, 0xC4, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'1', { 0x00, 0x00, 0x10, 0x30, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00 }, }, {'2', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xFC, 0xFC, 0x00, 0x00 }, }, {'3', { 0x00, 0x00, 0xFC, 0xFC, 0x04, 0x0C, 0x18, 0x1C, 0x04, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'4', { 0x00, 0x00, 0x38, 0x78, 0x48, 0xC8, 0x88, 0xFC, 0xFC, 0x08, 0x08, 0x08, 0x00, 0x00 }, }, {'5', { 0x00, 0x00, 0xFC, 0xFC, 0x80, 0x80, 0xF8, 0xFC, 0x04, 0x04, 0xFC, 0xF8, 0x00, 0x00 }, }, {'6', { 0x00, 0x00, 0x78, 0xF8, 0x80, 0x80, 0xF8, 0xFC, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'7', { 0x00, 0x00, 0xFC, 0xFC, 0x04, 0x04, 0x0C, 0x18, 0x30, 0x20, 0x20, 0x20, 0x00, 0x00 }, }, {'8', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x84, 0x78, 0xFC, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'9', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x84, 0xFC, 0x7C, 0x04, 0x04, 0x7C, 0x78, 0x00, 0x00 }, }, {':', { 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00 }, }, {';', { 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x20, 0x20, 0xE0, 0xC0, 0x00, 0x00 }, }, {'<', { 0x00, 0x00, 0x08, 0x18, 0x30, 0x60, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x08, 0x00, 0x00 }, }, {'=', { 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00 }, }, {'>', { 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00 }, }, {'?', { 0x00, 0x00, 0x70, 0xF8, 0x88, 0x08, 0x18, 0x30, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00 }, }, {'@', { 0x00, 0x00, 0x7C, 0xFE, 0x82, 0x82, 0xB2, 0xBE, 0xBC, 0x80, 0xFC, 0x7C, 0x00, 0x00 }, }, {'A', { 0x00, 0x00, 0x30, 0x78, 0xCC, 0x84, 0x84, 0xFC, 0xFC, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'B', { 0x00, 0x00, 0xF8, 0xFC, 0x84, 0x84, 0xF8, 0xF8, 0x84, 0x84, 0xFC, 0xF8, 0x00, 0x00 }, }, {'C', { 0x00, 0x00, 0x38, 0x7C, 0xC4, 0x80, 0x80, 0x80, 0x80, 0xC4, 0x7C, 0x38, 0x00, 0x00 }, }, {'D', { 0x00, 0x00, 0xF0, 0xF8, 0x8C, 0x84, 0x84, 0x84, 0x84, 0x8C, 0xF8, 0xF0, 0x00, 0x00 }, }, {'E', { 0x00, 0x00, 0xFC, 0xFC, 0x80, 0x80, 0xF0, 0xF0, 0x80, 0x80, 0xFC, 0xFC, 0x00, 0x00 }, }, {'F', { 0x00, 0x00, 0xFC, 0xFC, 0x80, 0x80, 0xF0, 0xF0, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 }, }, {'G', { 0x00, 0x00, 0x3C, 0x7C, 0xC0, 0x80, 0x8C, 0x8C, 0x84, 0xC4, 0x7C, 0x38, 0x00, 0x00 }, }, {'H', { 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0xFC, 0xFC, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'I', { 0x00, 0x00, 0xF8, 0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xF8, 0xF8, 0x00, 0x00 }, }, {'J', { 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'K', { 0x00, 0x00, 0x84, 0x84, 0x8C, 0x98, 0xF0, 0xF0, 0x98, 0x8C, 0x84, 0x84, 0x00, 0x00 }, }, {'L', { 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFC, 0xFC, 0x00, 0x00 }, }, {'M', { 0x00, 0x00, 0x82, 0xC6, 0xEE, 0xBA, 0x92, 0x82, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00 }, }, {'N', { 0x00, 0x00, 0x84, 0xC4, 0xE4, 0xB4, 0x9C, 0x8C, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'O', { 0x00, 0x00, 0x30, 0x78, 0xCC, 0x84, 0x84, 0x84, 0x84, 0xCC, 0x78, 0x30, 0x00, 0x00 }, }, {'P', { 0x00, 0x00, 0xF8, 0xFC, 0x84, 0x84, 0xFC, 0xF8, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 }, }, {'Q', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x84, 0x84, 0x84, 0x94, 0x94, 0xFC, 0x78, 0x08, 0x08 }, }, {'R', { 0x00, 0x00, 0xF8, 0xFC, 0x84, 0x84, 0xFC, 0xF8, 0x88, 0x8C, 0x84, 0x84, 0x00, 0x00 }, }, {'S', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x80, 0xF8, 0x7C, 0x04, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'T', { 0x00, 0x00, 0xF8, 0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00 }, }, {'U', { 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'V', { 0x00, 0x00, 0x82, 0x82, 0x82, 0xC6, 0x44, 0x6C, 0x28, 0x38, 0x10, 0x10, 0x00, 0x00 }, }, {'W', { 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x82, 0x92, 0x92, 0x92, 0xFE, 0x6C, 0x00, 0x00 }, }, {'X', { 0x00, 0x00, 0x82, 0x82, 0xC6, 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x82, 0x82, 0x00, 0x00 }, }, {'Y', { 0x00, 0x00, 0x82, 0x82, 0xC6, 0x6C, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00 }, }, {'Z', { 0x00, 0x00, 0xFC, 0xFC, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0xFC, 0xFC, 0x00, 0x00 }, }, {'[', { 0x00, 0x00, 0xE0, 0xE0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xE0, 0xE0, 0x00, 0x00 }, }, {'\\', { 0x00, 0x80, 0x80, 0xC0, 0x40, 0x60, 0x20, 0x30, 0x10, 0x18, 0x08, 0x08, 0x00, 0x00 }, }, {']', { 0x00, 0x00, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xE0, 0xE0, 0x00, 0x00 }, }, {'^', { 0x00, 0x20, 0x20, 0x70, 0x50, 0xD8, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'_', { 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00 }, }, {'`', { 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'a', { 0x00, 0x00, 0x00, 0x00, 0x78, 0x7C, 0x04, 0x7C, 0xFC, 0x84, 0xFC, 0x7C, 0x00, 0x00 }, }, {'b', { 0x00, 0x00, 0x80, 0x80, 0xB8, 0xFC, 0xC4, 0x84, 0x84, 0x84, 0xFC, 0xF8, 0x00, 0x00 }, }, {'c', { 0x00, 0x00, 0x00, 0x00, 0x78, 0xF8, 0x80, 0x80, 0x80, 0x80, 0xF8, 0x78, 0x00, 0x00 }, }, {'d', { 0x00, 0x00, 0x04, 0x04, 0x74, 0xFC, 0x8C, 0x84, 0x84, 0x84, 0xFC, 0x7C, 0x00, 0x00 }, }, {'e', { 0x00, 0x00, 0x00, 0x00, 0x78, 0xFC, 0x84, 0xFC, 0xFC, 0x80, 0xF8, 0x78, 0x00, 0x00 }, }, {'f', { 0x00, 0x00, 0x3C, 0x7C, 0x40, 0x40, 0xF8, 0xF8, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00 }, }, {'g', { 0x00, 0x00, 0x00, 0x7C, 0xFC, 0x84, 0x84, 0x8C, 0xFC, 0x74, 0x04, 0x7C, 0x78, 0x00 }, }, {'h', { 0x00, 0x00, 0x80, 0x80, 0xB8, 0xFC, 0xC4, 0x84, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'i', { 0x00, 0x20, 0x20, 0x00, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0xF8, 0xF8, 0x00, 0x00 }, }, {'j', { 0x00, 0x08, 0x08, 0x00, 0x38, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x88, 0xF8, 0x70 }, }, {'k', { 0x00, 0x00, 0x80, 0x88, 0x98, 0xB0, 0xE0, 0xE0, 0xB0, 0x98, 0x88, 0x88, 0x00, 0x00 }, }, {'l', { 0x00, 0x00, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xF8, 0xF8, 0x00, 0x00 }, }, {'m', { 0x00, 0x00, 0x00, 0x00, 0xEC, 0xFE, 0x92, 0x92, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00 }, }, {'n', { 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFC, 0xC4, 0x84, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'o', { 0x00, 0x00, 0x00, 0x00, 0x78, 0xFC, 0x84, 0x84, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'p', { 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0x84, 0x84, 0xC4, 0xFC, 0xB8, 0x80, 0x80, 0x80 }, }, {'q', { 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFC, 0x84, 0x84, 0x8C, 0xFC, 0x74, 0x04, 0x04, 0x04 }, }, {'r', { 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFC, 0xC4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 }, }, {'s', { 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFC, 0x80, 0xF8, 0x7C, 0x04, 0xFC, 0xF8, 0x00, 0x00 }, }, {'t', { 0x00, 0x00, 0x40, 0x40, 0xF0, 0xF0, 0x40, 0x40, 0x40, 0x40, 0x78, 0x38, 0x00, 0x00 }, }, {'u', { 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, 0x8C, 0xFC, 0x74, 0x00, 0x00 }, }, {'v', { 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00 }, }, {'w', { 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x92, 0x92, 0x92, 0xFE, 0x6C, 0x00, 0x00 }, }, {'x', { 0x00, 0x00, 0x00, 0x00, 0x82, 0xC6, 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x82, 0x00, 0x00 }, }, {'y', { 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x8C, 0xFC, 0x74, 0x04, 0x7C, 0x78 }, }, {'z', { 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0x18, 0x30, 0x60, 0xC0, 0xFC, 0xFC, 0x00, 0x00 }, }, {'{', { 0x00, 0x20, 0x60, 0x40, 0x40, 0x40, 0xC0, 0xC0, 0x40, 0x40, 0x40, 0x60, 0x20, 0x00 }, }, {'|', { 0x00, 0x80, 0x80, 0xC0, 0x40, 0x60, 0x20, 0x30, 0x10, 0x18, 0x08, 0x08, 0x00, 0x00 }, }, {'}', { 0x00, 0x80, 0xC0, 0x40, 0x40, 0x40, 0x60, 0x60, 0x40, 0x40, 0x40, 0xC0, 0x80, 0x00 }, }, {'~', { 0x00, 0x98, 0xFC, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }; fldigi-3.21.80/src/trx/nullmodem.cxx0000664000175000017500000000444012313064025014170 00000000000000// ---------------------------------------------------------------------------- // NULLMODEM.cxx -- NULLMODEM modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gMFSK source code // distribution. // gMFSK Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "nullmodem.h" #include "fl_digi.h" #include "ascii.h" #define null_bw 1 // a NULLMODEM and will be instantiated before the dynamic member wf, // digiscope, and fl_digi_main, the main dialog NULLMODEM:: NULLMODEM() : modem() { mode = MODE_NULL; samplerate = 8000; restart(); } NULLMODEM::~NULLMODEM() {}; void NULLMODEM::tx_init(SoundBase *sc) { scard = sc; } void NULLMODEM::rx_init() { if (fl_digi_main) put_MODEstatus(mode); } void NULLMODEM::init() { modem::init(); rx_init(); if (digiscope) digiscope->mode(Digiscope::SCOPE); } void NULLMODEM::restart() { if (wf) set_bandwidth(null_bw); } //===================================================================== // receive processing //===================================================================== int NULLMODEM::rx_process(const double *buf, int len) { return 0; } //===================================================================== // transmit processing //===================================================================== int NULLMODEM::tx_process() { MilliSleep(10); if (!fl_digi_main) return 0; if ( get_tx_char() == GET_TX_CHAR_ETX || stopflag) { stopflag = false; return -1; } return 0; } fldigi-3.21.80/configure.ac0000664000175000017500000002475012313332207012340 00000000000000# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_COPYRIGHT([Copyright (C) 2007, 2008, 2009 Stelios Bounanos, M0GLD (m0gld AT enotty DOT net)]) AC_PREREQ(2.61) dnl major and minor must be integers; patch may dnl contain other characters or be empty m4_define(FLDIGI_MAJOR, [3]) m4_define(FLDIGI_MINOR, [21]) m4_define(FLDIGI_PATCH, [.80]) m4_define(FLARQ_MAJOR, [4]) m4_define(FLARQ_MINOR, [3]) m4_define(FLARQ_PATCH, [.4]) AC_INIT([fldigi], FLDIGI_MAJOR.FLDIGI_MINOR[]FLDIGI_PATCH, [fldigi-devel@lists.berlios.de]) # substitute in Makefiles AC_SUBST([FLDIGI_VERSION_MAJOR], [FLDIGI_MAJOR]) AC_SUBST([FLDIGI_VERSION_MINOR], [FLDIGI_MINOR]) AC_SUBST([FLDIGI_VERSION_PATCH], [FLDIGI_PATCH]) AC_SUBST([FLDIGI_VERSION], [FLDIGI_MAJOR.FLDIGI_MINOR[]FLDIGI_PATCH]) AC_SUBST([FLARQ_VERSION_MAJOR], [FLARQ_MAJOR]) AC_SUBST([FLARQ_VERSION_MINOR], [FLARQ_MINOR]) AC_SUBST([FLARQ_VERSION_PATCH], [FLARQ_PATCH]) AC_SUBST([FLARQ_VERSION], [FLARQ_MAJOR.FLARQ_MINOR[]FLARQ_PATCH]) # define in config.h AC_DEFINE([FLDIGI_VERSION_MAJOR], [FLDIGI_MAJOR], [Fldigi major version number]) AC_DEFINE([FLDIGI_VERSION_MINOR], [FLDIGI_MINOR], [Fldigi minor version number]) AC_DEFINE([FLDIGI_VERSION_PATCH], ["FLDIGI_PATCH"], [Fldigi patch/alpha version string]) AC_DEFINE([FLARQ_VERSION_MAJOR], [FLARQ_MAJOR], [Flarq major version number]) AC_DEFINE([FLARQ_VERSION_MINOR], [FLARQ_MINOR], [Flarq minor version number]) AC_DEFINE([FLARQ_VERSION_PATCH], ["FLARQ_PATCH"], [Flarq patch/alpha version string]) AC_DEFINE([FLDIGI_VERSION], ["FLDIGI_MAJOR.FLDIGI_MINOR[]FLDIGI_PATCH"], [Fldigi version string]) AC_DEFINE([FLARQ_VERSION], ["FLARQ_MAJOR.FLARQ_MINOR[]FLARQ_PATCH"], [Flarq version string]) AC_SUBST([AC_CONFIG_ARGS], [$ac_configure_args]) AC_CONFIG_AUX_DIR([build-aux]) # define build, build_cpu, build_vendor, build_os AC_CANONICAL_BUILD # define host, host_cpu, host_vendor, host_os AC_CANONICAL_HOST # define target, target_cpu, target_vendor, target_os AC_CANONICAL_TARGET AM_INIT_AUTOMAKE([-Wall foreign std-options 1.9.6]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) AM_MAINTAINER_MODE AC_CONFIG_SRCDIR([src/main.cxx]) AC_CONFIG_HEADER([src/config.h]) AC_CONFIG_MACRO_DIR([m4]) FLDIGI_AUTHORS="Dave Freese, Stelios Bounanos, Leigh Klotz, Remi Chateauneu, and others" FLARQ_AUTHORS="Dave Freese" PACKAGE_HOME="http://www.w1hkj.com/Fldigi.html" PACKAGE_DL="http://www.w1hkj.com/download.html" PACKAGE_PROJ="http://developer.berlios.de/project/showfiles.php?group_id=9149" PACKAGE_NEWBUG="https://fedorahosted.org/fldigi/newticket" PACKAGE_DOCS="http://www.w1hkj.com/FldigiHelp/index.html" PACKAGE_GUIDE="http://www.w1hkj.com/beginners.html" FLARQ_DOCS="http://www.w1hkj.com/FlarqHelpFiles/flarq.html" AC_DEFINE_UNQUOTED([FLDIGI_AUTHORS], ["$FLDIGI_AUTHORS"], [Fldigi authors]) AC_DEFINE_UNQUOTED([FLARQ_AUTHORS], ["$FLARQ_AUTHORS"], [Flarq authors]) AC_DEFINE_UNQUOTED([PACKAGE_HOME], ["$PACKAGE_HOME"], [Home page]) AC_DEFINE_UNQUOTED([PACKAGE_DL], ["$PACKAGE_DL"], [Download page]) AC_DEFINE_UNQUOTED([PACKAGE_PROJ], ["$PACKAGE_PROJ"], [BerliOS page]) AC_DEFINE_UNQUOTED([PACKAGE_NEWBUG], ["$PACKAGE_NEWBUG"], [Trac new ticket page]) AC_DEFINE_UNQUOTED([PACKAGE_DOCS], ["$PACKAGE_DOCS"], [Docs index]) AC_DEFINE_UNQUOTED([PACKAGE_GUIDE], ["$PACKAGE_GUIDE"], [Beginners guide]) AC_DEFINE_UNQUOTED([FLARQ_DOCS], ["$FLARQ_DOCS"], [Flarq Docs index]) AC_SUBST([FLDIGI_AUTHORS], [$FLDIGI_AUTHORS]) AC_SUBST([FLARQ_AUTHORS], [$FLARQ_AUTHORS]) AC_SUBST([PACKAGE_HOME], [$PACKAGE_HOME]) AC_SUBST([PACKAGE_DL], [$PACKAGE_DL]) AC_SUBST([PACKAGE_PROJ], [$PACKAGE_PROJ]) AC_SUBST([PACKAGE_NEWBUG], [$PACKAGE_NEWBUG]) AC_SUBST([PACKAGE_DOCS], [$PACKAGE_DOCS]) AC_SUBST([PACKAGE_GUIDE], [$PACKAGE_GUIDE]) AC_SUBST([FLARQ_DOCS], [$FLARQ_DOCS]) # Checks for programs. AC_PROG_CXX AC_PROG_CC AC_USE_SYSTEM_EXTENSIONS # Checks for header files. AC_HEADER_STDC AC_HEADER_DIRENT AC_CHECK_HEADERS([arpa/inet.h execinfo.h fcntl.h limits.h memory.h netdb.h netinet/in.h regex.h stdint.h stdlib.h string.h strings.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h sys/utsname.h termios.h unistd.h values.h linux/ppdev.h dev/ppbus/ppi.h]) # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL AC_C_CONST AC_C_INLINE AC_TYPE_INT16_T AC_TYPE_INT32_T AC_TYPE_INT64_T AC_TYPE_INT8_T AC_C_RESTRICT AC_TYPE_SIZE_T AC_HEADER_TIME AC_STRUCT_TM AC_TYPE_UINT16_T AC_TYPE_UINT32_T AC_TYPE_UINT64_T AC_TYPE_UINT8_T AC_C_VOLATILE # Checks for library functions. AC_FUNC_CLOSEDIR_VOID AC_FUNC_ERROR_AT_LINE AC_PROG_GCC_TRADITIONAL dnl AC_FUNC_MALLOC dnl AC_FUNC_REALLOC AC_FUNC_SELECT_ARGTYPES AC_TYPE_SIGNAL AC_FUNC_STRFTIME AC_FUNC_STRTOD AC_CHECK_FUNCS([getaddrinfo gethostbyname hstrerror gmtime_r localtime_r memmove memset mkdir select setenv snprintf socket socketpair strcasecmp strcasestr strchr strdup strerror strlcpy strncasecmp strrchr strstr strtol uname unsetenv vsnprintf]) # Check for O_CLOEXEC AC_FCNTL_FLAGS AC_PRESERVE_HELP_ORDER ### Internationalization AM_GNU_GETTEXT([external]) AM_CONDITIONAL([USE_NLS], [test "x$USE_NLS" = "xyes"]) ### Programs # Determine if fldigi and flarq have been requested and can be built # Set ac_cv_want_fldigi and ac_cv_want_flarq to yes/no # Set WANT_FLDIGI and WANT_FLARQ Makefile conditionals AC_FLDIGI_PROGRAMS ###### OS support ### OSX # Set ac_cv_mac_universal to yes/no # Set DARWIN Makefile conditional # Substitute MAC_UNIVERSAL_CFLAGS and MAC_UNIVERSAL_LDFLAGS in Makefile AC_FLDIGI_MACOSX ### win32 # Set WIN32 Makefile conditional # Set HAVE_WINDRES Makefile conditional # Substitute WINDRES in Makefile AC_FLDIGI_WIN32 ### Non-POSIX compatibility (i.e. mingw32) # Sets various Makefile conditionals; see m4/np-compat.m4 AC_FLDIGI_NP_COMPAT ### static flag # Set ac_cv_static to yes/no # Substitute RTLIB in Makefile AC_FLDIGI_STATIC ### optimizations # Set ac_cv_opt to arg # Substitute OPT_FLAGS in Makefile AC_FLDIGI_OPT ### debug flag # Set ac_cv_debug to yes/no # Override CXXFLAGS # Set ENABLE_DEBUG Makefile conditional # Substitute RDYNAMIC in Makefile AC_FLDIGI_DEBUG ### benchmark mode # Set ac_cv_benchmark to yes/no # Define BENCHMARK_MODE in config.h # Set ENABLE_BENCHMARK Makefile conditional AC_FLDIGI_BENCHMARK ### TLS flag # Set ac_cv_tls to yes/no # Define USE_TLS in config.h AC_FLDIGI_TLS ### std::bind or alternatives # Set ac_cv_std_bind or ac_cv_std_tr1_bind to yes/no # Define HAVE_STD_BIND or HAVE_STD_TR1_BIND in config.h # Substitute BOOST_CPPFLAGS and BOOST_LDFLAGS in Makefile # if falling back to Boost AC_FLDIGI_BIND ### FLTK # Substitute FLTK_CFLAGS and FLTK_LIBS in Makefile # Set FLUID variable # Set HAVE_FLUID Makefile conditional AC_FLDIGI_FLTK ### OSS # Set ac_cv_oss to yes/no # Define USE_OSS in config.h AC_FLDIGI_OSS ### libpng # Required if $ac_cv_want_fldigi is "yes" # Set ac_cv_png to yes/no (not used) # Define USE_PNG in config.h (as above) # Substitute PNG_CFLAGS and PNG_LIBS in Makefile if test "x$ac_cv_want_fldigi" = "xyes"; then AC_FLDIGI_PKG_CHECK([png], [libpng >= 1.2.8], [no], [no]) fi ### libsamplerate # Required if $ac_cv_want_fldigi is "yes" # Set ac_cv_samplerate to yes/no (not used) # Define USE_SAMPLERATE in config.h (as above) # Substitute SAMPLERATE_CFLAGS and SAMPLERATE_LIBS in Makefile if test "x$ac_cv_want_fldigi" = "xyes"; then AC_FLDIGI_PKG_CHECK([samplerate], [samplerate >= 0.1.1], [no], [no]) fi ### libsndfile # Set ac_cv_sndfile to yes/no # Define USE_SNDFILE in config.h # Substitute SNDFILE_CFLAGS and SNDFILE_LIBS in Makefile AC_FLDIGI_PKG_CHECK([sndfile], [sndfile >= 1.0.10], [yes], [yes], [enable reading/writing of audio files via libsndfile @<:@autodetect@:>@] ) ### portaudio # Set ac_cv_portaudio to yes/no # Define USE_PORTAUDIO in config.h # Substitute PORTAUDIO_CFLAGS and PORTAUDIO_LIBS in Makefile AC_FLDIGI_PKG_CHECK([portaudio], [portaudio-2.0 >= 19], [yes], [yes], [enable support for PortAudio @<:@autodetect@:>@] ) ### pulseaudio # Set ac_cv_pulseaudio to yes/no # Define USE_PULSEAUDIO in config.h # Substitute PULSEAUDIO_CFLAGS and PULSEAUDIO_LIBS in Makefile AC_FLDIGI_PKG_CHECK([pulseaudio], [libpulse-simple >= 0.9.7], [yes], [yes], [enable support for PulseAudio @<:@autodetect@:>@] ) if test "x$ac_cv_oss" = "xno" && \ test "x$ac_cv_portaudio" = "xno" && \ test "x$ac_cv_pulseaudio" = "xno"; then AC_MSG_WARN([*** $PACKAGE will be compiled without audio device support ***]) fi ### hamlib # Set ac_cv_hamlib to yes/no # Define USE_HAMLIB in config.h # Substitute HAMLIB_CFLAGS and HAMLIB_LIBS in Makefile # Set ENABLE_HAMLIB Makefile conditional AC_FLDIGI_PKG_CHECK([hamlib], [hamlib >= 1.2.4], [yes], [yes], [use hamradio control libraries @<:@autodetect@:>@], [ENABLE_HAMLIB]) # We compile our own copy of hamlib's locator.c if hamlib is not available # or if it is version <= 1.2.9, which has a broken azimuth_long_path function AX_COMPARE_VERSION([$pkg_hamlib_version], [le], [1.2.9], [need_locator_c=yes], [need_locator_c=no]) AM_CONDITIONAL([NEED_HAMLIB_LOCATOR], [test "$need_locator_c" = "yes"]) ### X11 # Set ac_cv_x to yes/no # Define USE_X in config.h # Substitute X_CFLAGS and X_LIBS in Makefile if test "x$target_darwin" = "xno" && test "x$target_win32" = "xno"; then AC_FLDIGI_PKG_CHECK([x], [x11], [no], [yes]) fi ### libintl # Substitute INTL_CFLAGS in Makefile # Substitute INTL_LIBS in Makefile # (default to LIBINTL) AC_FLDIGI_INTL ### asciidoc # substitute ASCIIDOC and A2X in doc/Makefile # set HAVE_ASCIIDOC Makefile conditional AC_FLDIGI_DOCS ### build info # Define various build variables in config.h AC_FLDIGI_BUILD_INFO ### silent build rules AC_FLDIGI_BUILD_RULES ### output AH_TOP([ #ifndef CONFIG_H_ #define CONFIG_H_ ]) AH_BOTTOM([ #include "pkg.h" #include "util.h" #endif /* CONFIG_H_ */ ]) AC_CONFIG_FILES([Makefile src/Makefile po/Makefile.in doc/Makefile]) AC_OUTPUT ### summary AC_MSG_RESULT([ Configuration summary: Version ..................... $VERSION Static linking .............. $ac_cv_static CPU optimizations ........... $ac_cv_opt Debugging ................... $ac_cv_debug fldigi ...................... $ac_cv_want_fldigi flarq ....................... $ac_cv_want_flarq i18n ........................ $USE_NLS ]) if test "x$ac_cv_want_fldigi" = "xyes"; then AC_MSG_RESULT([ fldigi build options: sndfile ..................... $ac_cv_sndfile oss ......................... $ac_cv_oss portaudio ................... $ac_cv_portaudio pulseaudio .................. $ac_cv_pulseaudio hamlib ...................... $ac_cv_hamlib ]) fi fldigi-3.21.80/scripts/0000775000175000017500000000000012313333727011621 500000000000000fldigi-3.21.80/scripts/mkappbundle.sh0000775000175000017500000000763212313064025014402 00000000000000#!/bin/sh ### Script to create the .app structure for osx ### 20080227 Stelios Bounanos M0GLD ### Updated 20080727: enable the .icns support ### Updated 20090525: add flarq if [ $# -ne 2 ]; then echo "Syntax: $0 data-dir build-dir" >&2 exit 1 fi if [ -z "$PACKAGE_TARNAME" ]; then echo "E: \$PACKAGE_TARNAME undefined" exit 1 fi PWD=`pwd` data="${PWD}/$1" build="${PWD}/$2" bundle_dir="$APPBUNDLE_NOLIBS" static_bundle_dir="$APPBUNDLE" # more sanity checks for d in "$data" "$build"; do test -d "$d" && continue echo "E: ${d}: not a directory" >&2 exit 1 done if ! test -w "$build"; then echo "E: ${build} is not writeable" >&2 exit 1 fi plist="${data}/mac/Info.plist.in" fldigi_icon="${data}/mac/fldigi.icns" flarq_icon="${data}/mac/flarq.icns" for f in "$plist" "$fldigi_icon" "$flarq_icon"; do test -r "$f" && continue echo "E: ${f}: not readable" >&2 exit 1 done # aaaaaaaaaargh => Aaaaaaaaaargh upcase1() { sed 'h; s/\(^.\).*/\1/; y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/; G; s/\n.//' } function copy_libs() { list="$1" while test "x$list" != "x"; do change="$list" list="" for obj in $change; do for lib in `otool -L $obj | \ sed -n 's!^.*[[:space:]]\([^[:space:]]*\.dylib\).*$!\1!p' | \ grep -Ev '^/(usr/lib|System)'`; do libfn="`basename $lib`" if ! test -f "Frameworks/$libfn"; then cp "$lib" "Frameworks/$libfn" install_name_tool -id "@executable_path/../Frameworks/$libfn" "Frameworks/$libfn" list="$list Frameworks/$libfn" fi install_name_tool -change "$lib" "@executable_path/../Frameworks/$libfn" "$obj" done done done } function bundle() { appname="${binary}-${appversion}.app" cd "$build" # bundle the binary echo "creating ${build}/$bundle_dir/$appname" $mkinstalldirs "$bundle_dir/$appname/Contents/MacOS" "$bundle_dir/$appname/Contents/Resources" cd "$bundle_dir" $INSTALL_PROGRAM "${build}/$binary" "$appname/Contents/MacOS" test "x$NOSTRIP" = "x" && ${STRIP:-strip} -S "$appname/Contents/MacOS/$binary" $INSTALL_DATA "$icon" "$appname/Contents/Resources" echo "APPL${signature}" > "$appname/Contents/PkgInfo" sed -e "s!%%IDENTIFIER%%!${identifier}!g; s!%%NAME%%!${name}!g;\ s!%%SIGNATURE%%!${signature}!g; s!%%BINARY%%!${binary}!g;\ s!%%VERSION%%!${version}!g; s!%%ICON%%!${icon##*/}!g;" < "$plist" > "$appname/Contents/Info.plist" if grep '%%[A-Z]*%%' "$appname/Contents/Info.plist"; then echo "E: unsubstituted variables in $appname/Contents/Info.plist" >&2 exit 1 fi # bundle the binary and its non-standard dependencies echo "creating ${build}/$static_bundle_dir/$appname" cd .. $mkinstalldirs "$static_bundle_dir" cp -pR "$bundle_dir/$appname" "$static_bundle_dir" $mkinstalldirs "$static_bundle_dir/$appname/Contents/Frameworks" cd "$static_bundle_dir/$appname/Contents" copy_libs "MacOS/$binary" } set -e if test "x$WANT_FLDIGI" = "xyes"; then identifier="com.w1hkj.$PACKAGE_TARNAME" name=$(echo "$PACKAGE_TARNAME" | upcase1) # we'll use the first four consonants as the signature signature="$(echo $PACKAGE_TARNAME | sed 's/[aeiouAEIOU]//g; s/\(^....\).*/\1/')" binary="$PACKAGE_TARNAME" icon="$fldigi_icon" version="${FLDIGI_VERSION_MAJOR}.${FLDIGI_VERSION_MINOR}" appversion="$FLDIGI_VERSION" bundle fi if test "x$WANT_FLARQ" = "xyes"; then identifier="com.w1hkj.flarq" name="Flarq" signature="flrq" binary="flarq" icon="$flarq_icon" version="${FLARQ_VERSION_MAJOR}.${FLARQ_VERSION_MINOR}" appversion="$FLARQ_VERSION" bundle fi cd "$build" echo $ECHO_N "creating disk image" hdiutil create -ov -srcfolder "$bundle_dir" -format UDZO -tgtimagekey zlib-level=9 "${APPBUNDLE}-nolibs.dmg" echo $ECHO_N "creating disk image" hdiutil create -ov -srcfolder "$static_bundle_dir" -format UDZO -tgtimagekey zlib-level=9 "${APPBUNDLE}.dmg" fldigi-3.21.80/scripts/fldigi-shell0000775000175000017500000003166412313064025014034 00000000000000#!/usr/bin/perl # ---------------------------------------------------------------------------- # fldigi-shell version 0.36 # A program to control fldigi over HTTP/XML-RPC. # # Fldigi must have been built with xml-rpc support; see INSTALL. # # Copyright (C) 2008 # Stelios Bounanos, M0GLD # # fldigi-shell 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. # # fldigi-shell 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 . # ---------------------------------------------------------------------------- use strict; use warnings; use RPC::XML qw(:types); use RPC::XML::Client; use Term::ReadLine; use POSIX qw(:termios_h); use IO::Handle; use Getopt::Std; use Data::Dumper; use Time::HiRes qw(gettimeofday tv_interval usleep); use LWP; ################################################################################ our $VERSION = "0.37"; our $progname = (split(/\//, $0))[-1]; our $histfile = $ENV{'HOME'} . "/.fldigi/shell-history"; our $client; our $ua; our $term; our $OUT = \*STDOUT; our $debug; our %methods; our %commands; our %encoders; our %opts; ################################################################################ # terminal routines from perlfaq8 our ($termios, $oterm, $echo, $noecho, $fd_stdin); sub term_get_attr { $fd_stdin = fileno(STDIN); $termios = POSIX::Termios->new(); $termios->getattr($fd_stdin); $oterm = $termios->getlflag(); $echo = ECHO | ECHOK | ICANON; $noecho = $oterm & ~$echo; } sub term_cbreak { $termios->setlflag($noecho); $termios->setcc(VTIME, 1); $termios->setattr($fd_stdin, TCSANOW); } sub term_cooked { $termios->setlflag($oterm); $termios->setcc(VTIME, 0); $termios->setattr($fd_stdin, TCSANOW); } sub term_getc { my $key = ''; term_cbreak(); sysread(STDIN, $key, 1); term_cooked(); return $key; } ################################################################################ # xml-rpc helper routines sub encode { my $aref = $_[0]; return unless (exists( $methods{$aref->[0]} )); my $sig = $methods{$aref->[0]}->[0]; $sig =~ s/.+://; my @args = split(//, $sig); # Try to find an encoder for each format string char. # Use it to encode the corresponding method argument. for (my $i = 0; $i <= $#args; $i++) { if (exists($encoders{$args[$i]}) && exists($aref->[$i])) { print "Encoding arg " . ($i+1) . " as $args[$i]\n" if ($debug); $aref->[$i+1] = &{ $encoders{$args[$i]} }($aref->[$i+1]); } } } sub req { encode(\@_); my $r = $client->send_request(@_); if (!ref($r)) { print $OUT "Error: " . $r . "\n" unless ($r =~ /Unknown tag.+nil$/); $r = undef; } elsif ($r->is_fault()) { print $OUT "Error " . $r->value->{"faultCode"} . ": " . $r->value->{"faultString"} . "\n"; $r = undef; } return $r; } sub decode { my $r; return "" unless defined($r = req(@_)); return ref($r->value) ? Dumper($r->value) : $r->value; } sub execute($) { my @line = split(/\s+/, $_[0]); my $ret; if (exists( $commands{$line[0]} )) { my $cmd = shift(@line); &{ $commands{$cmd}->[2] }(@line); } elsif (exists( $methods{$line[0]} )) { # should we resplit the line? my $sig = $methods{$line[0]}->[0]; $sig =~ s/.+://; $sig =~ s/n//; print "Method " . $line[0] . " takes " . length($sig) . " args\n" if ($debug); if (length($sig) != $#line) { @line = split(/ +/, $_[0], length($sig) + 1); } print Dumper(\@line) if ($debug); my $r = decode(@line); if (defined $r) { print $OUT $r, "\n"}; } else { print $OUT $line[0] . ": command not found. Do you need ``help''?\n"; } } ################################################################################ # command routines sub help { my @k = (@_ ? @_ : (sort keys %methods, sort keys %commands)); if (%methods) { print $OUT "Server methods:", "\n" if (!@_); foreach (@k) { next unless (exists($methods{$_})); printf($OUT " %-32s%-8s%s\n", $_, $methods{$_}->[0], $methods{$_}->[1]); } print $OUT "\n" if (!@_); } print $OUT "Shell commands:", "\n" if (!@_); foreach (@k) { next unless (exists($commands{$_})); printf(" %-32s%-8s%s\n", $_, $commands{$_}->[0], $commands{$_}->[1]); } } sub recv_text { my ($r, $len, $start, $cont) = (0, 0, 0, 1); my ($delay) = (@_ ? @_ : 1); my $sigint = $SIG{INT}; $SIG{INT} = sub { $cont = 0; }; while ($cont) { sleep($delay); next unless defined($r = req("text.get_rx_length")); $start -= $len - $r->value if ($r->value < $len); $len = $r->value; next unless ($len - $start > 0 && defined($r = req("text.get_rx", $start, $len - $start))); print STDOUT $r->value; $start = $len; } print "\n"; $SIG{INT} = $sigint; } sub get_recv_text { my ($r, $len); return unless defined($r = req("text.get_rx_length")); return unless defined($r = req("text.get_rx", 0, $r->value)); print STDOUT $r->value, "\n"; } sub send_line { if (@_) { req("text.add_tx_bytes", join(" ", @_)); return; } my $r; my $cont = 1; my $sigint = $SIG{INT}; $SIG{INT} = sub { $cont = 0; }; print $OUT "Text will be sent line by line. EOF to end.\n"; print "> "; while () { last unless ($cont); req("text.add_tx_bytes", $_); print "> "; } print"\n"; $SIG{INT} = $sigint; } sub send_file { open(IN, '<', $_[0]) or warn("Could not read $_[0]: $!\n") and return; while () { send_line($_); } close(IN); } sub send_char { my ($c, $char); my $cont = 1; my $sigint = $SIG{INT}; $SIG{INT} = sub { $cont = 0; }; print $OUT "Text will be sent char by char. EOF to end.\n"; print "> "; while (ord($c = term_getc()) != 0x04 && ord($c) != 0x03 && $cont) { req("text.add_tx_bytes", ($char = $c)); print $c; } print "\n"; $SIG{INT} = $sigint; } sub print_history { my $out = $_[0]; my @h = $term->GetHistory(); splice(@h, 0, $_[1]) if ($_[1] > 0); print $out join("\n", @h), "\n" if (@h); } sub list_modem_names { my $r = req("modem.get_names"); print join("\n", @{$r->value}), "\n" if (defined($r)); } sub wait_for_state { warn "not enough arguments\n" and return unless (@_); my $r; sleep(1) while (defined($r = req("main.get_trx_status")) && $r->value ne $_[0]); } sub time_cmd { my $t0 = [gettimeofday()]; execute("@_"); print tv_interval($t0), " seconds\n"; } sub evaluate(@) { warn "$@" unless (defined(eval "@_")); } sub source { open(IN, '<', $_[0]) or warn "Could not read input file: $!\n" and return; evaluate(); close(IN); } sub pskrep_qsy { if (!defined($ua)) { $ua = LWP::UserAgent->new; $ua->agent($progname . "/" . $VERSION . " "); } my $url = 'http://pskreporter.info/cgi-bin/psk-freq.pl'; my $idx = 0; foreach (@_) { $url .= '?grid=' . $_ if (m/[A-R]{2}/i); $idx = $_ if (/^\d+$/); } my $r = $ua->request(HTTP::Request->new(GET => $url)); if (!$r->is_success()) { print STDERR "HTTP::Request error: ", $r->status_line, "\n"; return; } print "pskreporter response='", $r->content, "'\n" if ($debug); my @freqs = grep(!/^#/, split(/\n/, $r->content)); if ($idx <= $#freqs && $freqs[$idx] =~ m/^(\d{5,})/) { execute("main.set_frequency $1"); } } ################################################################################ %opts = ( "c" => "", "d" => 0, "u" => "http://localhost:7362/RPC2" ); %commands = ( "debug" => [ "n:n", "Toggle debugging output", sub { $debug = (@_ ? $_[0] : !$debug); } ], "eval" => [ "s:s", "Evaluate Perl code", sub { evaluate "@_"; } ], "exit" => [ "n:n", "Exit the shell", sub { exit(0) } ], "help" => [ "n:n", "Print this command help", \&help ], "history" => [ "s:n", "Print command history", sub { print_history($OUT, 0); } ], "modems" => [ "s:n", "List all modem names", \&list_modem_names ], "poll" => [ "s:i", "Poll for new received text every ``i'' seconds (def=1)", \&recv_text ], "pskrqsy" => [ "n:si", "QSY to ``i''th best frequency for grid ``s''", \&pskrep_qsy ], "recvtext" => [ "s:n", "Get all received text", \&get_recv_text ], "reinit" => [ "n:n", "Rebuild command list", sub { build_cmds(); setup_compl(); } ], "send" => [ "n:s", "Send text, one line at a time", \&send_line ], "sendchar" => [ "n:s", "Send text, one character at a time", \&send_char ], "sendfile" => [ "n:s", "Send text from file ``s''", \&send_file ], "sendstr" => [ "n:s", "Send string ``s''", sub { send_line(@_); } ], "source" => [ "n:s", "Read commands from file ``s''", sub { source(@_) } ], "time" => [ "s:s", "Time a command", \&time_cmd ], "wait" => [ "n:s", "Wait for trx state to become ``s''", \&wait_for_state ] ); %encoders = ( "b" => \&RPC_BOOLEAN, "6" => \&RPC_BASE64, "d" => \&RPC_DOUBLE, "s" => \&RPC_STRING ); ################################################################################ sub HELP_MESSAGE { print <value}) { $methods{ $_->{"name"} } = [ $_->{"signature"}, $_->{"help"} ]; } # $methods{"system.listMethods"} = [ "i:n", "Return an array of all available XML-RPC methods on this server." ]; # $methods{"system.methodHelp"} = [ "i:s", "Given the name of a method, return a help string." ]; # $methods{"system.methodSignature"} = [ "A:s", "Given the name of a method, return an array of legal signatures." ]; # $methods{"system.multicall"} = [ "i:n", "Process an array of calls, and return an array of results." ]; # $methods{"system.shutdown"} = [ "i:i", "Shut down the server. Return code is always zero." ]; } } sub setup_compl { # Use the hashes to set up simple completion for rpc methods and shell commands if ($term->ReadLine eq "Term::ReadLine::Gnu") { my $attribs = $term->Attribs(); $attribs->{"completion_entry_function"} = $attribs->{"list_completion_function"}; $attribs->{"completion_word"} = [keys %methods, keys %commands]; } elsif ($term->ReadLine eq "Term::ReadLine::Perl") { readline::rl_basic_commands(keys %methods, keys %commands); } } sub load_history { open(HIST, '<', $histfile) or return 0; while () { chomp; $term->addhistory($_); } my $r = $.; close(HIST); return $r; } sub save_history { open(HIST, '>>', $histfile) or return; print_history(\*HIST, $_[0]); close(HIST); } ################################################################################ ################################################################################ # parse cmd line handle_cmdline(); # create client $client = RPC::XML::Client->new($opts{"u"}); # save terminal attributes; used by getc routine term_get_attr(); # initialise termline $term = new Term::ReadLine "fldigi-shell"; #$OUT = $term->OUT || \*STDOUT; STDOUT->autoflush(1); my $histskip = load_history(); # build commands hashes build_cmds(); if ($opts{'c'} ne "") { # execute argument and exit execute($opts{'c'}); exit(0); } elsif (@ARGV) { source($_) foreach(@ARGV); exit(0); } setup_compl(); # ignore interrupts $SIG{INT} = 'IGNORE'; # execute commands while (defined($_ = $term->readline("fldigi % "))) { execute($_) if (/\w/); } save_history($histskip); fldigi-3.21.80/scripts/mknsisinst.sh0000775000175000017500000000316012313064025014272 00000000000000#!/bin/sh ### Script to create a win32 installer file ### 20110209 Stelios Bounanos M0GLD if [ $# -ne 2 ]; then echo "Syntax: $0 data-dir build-dir" >&2 exit 1 fi if [ -z "$PACKAGE_TARNAME" ]; then echo "E: \$PACKAGE_TARNAME undefined" exit 1 fi PWD=`pwd` data="${PWD}/$1" build="${PWD}/$2" # more sanity checks for d in "$data" "$build"; do test -d "$d" && continue echo "E: ${d}: not a directory" >&2 exit 1 done if ! test -w "$build"; then echo "E: ${build} is not writeable" >&2 exit 1 fi set -e fldigi_name=Fldigi fldigi_bin=fldigi.exe flarq_name=Flarq flarq_bin=flarq.exe def= if test "x$WANT_FLDIGI" != "xyes" && test "x$WANT_FLARQ" != "xyes"; then echo "E: refusing to create empty installer" >&2 exit 1 fi if test "x$WANT_FLDIGI" = "xyes"; then test "x$NOSTRIP" = "x" && $STRIP -S "$fldigi_bin" def="$def -DHAVE_FLDIGI -DFLDIGI_NAME=$fldigi_name -DFLDIGI_BINARY=$fldigi_bin -DFLDIGI_VERSION=$PACKAGE_VERSION" fi if test "x$WANT_FLARQ" = "xyes"; then test "x$NOSTRIP" = "x" && $STRIP -S "$flarq_bin" def="$def -DHAVE_FLARQ -DFLARQ_NAME=$flarq_name -DFLARQ_BINARY=$flarq_bin -DFLARQ_VERSION=$FLARQ_VERSION" fi if test "x$USE_NLS" = "xyes" && make -C "$srcdir/../po" install prefix="$build" >/dev/null; then def="$def -DFLDIGI_LOCALE_PATH=$build/share -DFLDIGI_LOCALE_DIR=locale" fi $MAKENSIS -V2 -NOCD -D"INSTALLER_FILE=$INSTALLER_FILE" -D"LICENSE_FILE=$data/../COPYING" \ -D"SUPPORT_URL=$PACKAGE_HOME" -D"UPDATES_URL=$PACKAGE_DL" -D"FLDIGI_DOCS_URL=$PACKAGE_DOCS" \ -D"FLARQ_DOCS_URL=$FLARQ_DOCS" -D"GUIDE_URL=$PACKAGE_GUIDE" $def "$data/win32/fldigi.nsi" fldigi-3.21.80/scripts/tests/0000775000175000017500000000000012313333727012763 500000000000000fldigi-3.21.80/scripts/tests/cr.sh0000775000175000017500000000104412313064025013635 00000000000000#!/bin/sh # Check for files with CRLF line terminators r=0 for f in $fldigi_SOURCES $flarq_SOURCES $EXTRA_fldigi_SOURCES $EXTRA_DIST; do base=$(echo $f | sed -n '/\.[cC][cCpPxX]\{1,\}/ { s!.*/\(.*\)\.[^.]*$!\1!; p }') if test "x$base" != "x" && grep " " "${srcdir}/${f}" >/dev/null; then echo "E: $f has CRLF line terminators" >&2 r=1 fi done if [ $r -eq 1 ]; then echo "Please remove the CRs from the above file(s)." 2>&1 echo "You can use something like: sed -i 's/\r$//' FILE1 FILE2 ..." 2>&1 fi exit $r fldigi-3.21.80/scripts/tests/config-h.sh0000775000175000017500000000074012313064025014725 00000000000000#!/bin/sh # Check for translation units that don't include config.h r=0 for f in $fldigi_SOURCES $flarq_SOURCES; do base=$(echo $f | sed -n '/\.[cC][cCpPxX]\{1,\}/ { s!.*/\(.*\)\.[^.]*$!\1!; p }') test "x$base" = "x" && continue test -f "fldigi-${base}.${OBJEXT}" || test -f "flarq-${base}.${OBJEXT}" || continue if ! grep "include.*config\.h" "${srcdir}/${f}" >/dev/null; then echo "E: $f does not include config.h" >&2 r=1 fi done exit $r fldigi-3.21.80/scripts/mkhamlibstatic.sh0000775000175000017500000000274612313064025015075 00000000000000#!/bin/sh # This script must be run by make set -e if test "x$PKG_CONFIG" != "x"; then hamlib_dir="$($PKG_CONFIG --variable=libdir hamlib)" if test "x$hamlib_dir" = "x"; then echo "E: Could not determine hamlib \$libdir" >&2 exit 1 fi else hamlib_dir="${HAMLIB_LIBS#*-L}" hamlib_dir="${HAMLIB_LIBS%% *}" if test "x$hamlib_dir" = "x"; then\ hamlib_dir=/usr/lib fi fi hamlib_libs="$hamlib_dir/hamlib-*.a" case "$target_os" in *linux*) AM_LDFLAGS="$AM_LDFLAGS -Wl,--export-dynamic -Wl,--whole-archive $hamlib_libs -Wl,--no-whole-archive" ;; *darwin*) # Apple's ld isn't quite up to this task: there is no way to specify -all_load for # only a subset of the libraries that we must link with. For this reason we resort # to using the "dangerous" -m flag, which turns "multiply defined symbol" errors # into warnings. This will probably not work for ppc64 and x86_64 universal binaries. AM_LDFLAGS="$AM_LDFLAGS -Wl,-all_load -Wl,-m $hamlib_libs" ;; *cygwin*) AM_LDFLAGS="$AM_LDFLAGS -Wl,--export-all-symbols -Wl,--whole-archive $hamlib_libs -Wl,--no-whole-archive" ;; *mingw32*) AM_LDFLAGS="$AM_LDFLAGS -Wl,--export-dynamic -Wl,--allow-multiple-definition -Wl,--whole-archive $hamlib_libs -Wl,--no-whole-archive" ;; *) echo "E: This script does not support $target_os" >&2 exit 1 ;; esac $CXX -o ${1}${EXEEXT} $AM_CXXFLAGS $fldigi_CXXFLAGS $CXXFLAGS $AM_LDFLAGS $fldigi_LDFLAGS $LDFLAGS $fldigi_OBJECTS $fldigi_LDADD fldigi-3.21.80/INSTALL0000664000175000017500000003325212313064025011100 00000000000000Installation Instructions for fldigi ************************************ To compile fldigi you will need: * A recent C++ compiler. The GNU C++ compilers in the 4.x series are known to work. * Version 1.1.x of the Fast Light Tool Kit (FLTK), with its development library and headers. Versions 1.1.7 to 1.1.9 are known to work. FLTK's multi-threading support is required. * The samplerate (a.k.a. secret rabbit code) library. * The PNG library. You should also install the libraries and headers for PortAudio, the Portable audio I/O library. Additional features are enabled if the corresponding libraries are present on your system: * Support for rig control via hamlib is enabled if the hamlib development files are installed. * Audio file generation, capture and playback support is enabled if `configure' can find the sndfile library. * The PulseAudio sound backend is compiled if the development files for libpulse-simple, the PulseAudio simple API library, are present. * The embedded XML-RPC web server is enabled if `configure' can find the C++ bindings for the libxmlrpc-c3 library. An example client can be found in scripts/fldigi-shell. Once you have installed the required packages, the following commands should be sufficient to compile fldigi and install it under /usr/local: ./configure make make install (you may need superuser privileges for installation) The `install' target installs the executables, icons, .desktop files and manual pages. After installation, an fldigi launcher should appear somewhere in your applications menu. If you are building a GIT snapshot (see README), you will need to run `autoreconf' to generate the configure script. Mac OS X installation notes *************************** Mac OS X support was added in version 2.10. To run fldigi on OS X, you will need to create an app bundle. For this purpose, the Makefile has an `appbundle' target that can be used instead of `install': make appbundle This target will generate two bundles inside the build directory (by default src/): * mac-bundle/fldigi.app, which only contains the bare minimum that is required to run fldigi on the build system * mac-libs-bundle/fldigi.app, which also includes copies of non-system libraries (such as PortAudio and FLTK) that the binary links to The configure script has some support for building universal x86/ppc binaries. Pass the following additional arguments to enable it: --enable-mac-universal --disable-dependency-tracking See this page for more information: https://fedorahosted.org/fldigi/wiki/Documentation/HOWTO/BuildOnOSX Windows installation notes ************************** As of version 3.12, Cygwin is not required to build or run fldigi. Refer to this page for Mingw32 build information: https://fedorahosted.org/fldigi/wiki/Documentation/HOWTO/BuildOnMinGW Building under Cygwin should still work but is not supported. To install Cygwin, use the following installer link: http://www.cygwin.com/setup.exe Refer to the list of library requirements and install the corresponding cygwin packages. You will need at least the following: Base: (all base packages) Devel: binutils fltk-devel gcc-g++ make pkg-config Graphics: libjpeg-devel libpng12-devel Libs: zlib Use the default "Curr" option for the package selection. To build an internationalized version of fldigi, install these additional packages: gettext gettext-devel libiconv libiconv2 PortAudio and libsamplerate are not available from Cygwin and must be compiled from source. If you wish to build easily redistributable binaries, configure these libraries for static linking, e.g. with `--enable-static --disable-shared'. After you have installed them in the desired location, remember to tell `pkg-config' how to find them, e.g. with export PKG_SEARCH_PATH=/usr/local/lib/pkgconfig To configure fldigi itself for static linking, use the following command: ./configure --enable-static LDFLAGS=-static This will produce a binary that only depends on the cygwin library, which can be found in /bin/cygwin1.dll. At the time of writing, fldigi has been built with the latest release of Cygwin, version 1.5.25. The binary runs on Windows 2000 and XP, however, a newer version of the cygwin1.dll library may be required for Vista. Version 20080530 of the 1.7 pre-release snapshot has been tested and is known to work: http://cygwin.com/snapshots/ ========== Generic installation instructions follow ========== Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. fldigi-3.21.80/m4/0000775000175000017500000000000012313333721010444 500000000000000fldigi-3.21.80/m4/funcs.m40000664000175000017500000000243512313064025011746 00000000000000# args: function, search-libs, other-libraries AC_DEFUN([AC_FLDIGI_SEARCH_LIBS], [ m4_define([FUNC_NAME_UC], m4_translit([$1], [a-z], [A-Z])) LIBS_search_libs_save="$LIBS" LIBS="" AC_SEARCH_LIBS($1, $2, [ac_cv_have_func_[]$1=1], [ac_cv_have_func_[]$1=0], $3) if test "x$LIBS" != "x"; then echo "$EXTRA_LIBS" | grep -q -e "$LIBS" || EXTRA_LIBS="$EXTRA_LIBS $LIBS" fi AC_DEFINE_UNQUOTED([HAVE_]FUNC_NAME_UC, $ac_cv_have_func_[]$1, [Define to 1 if we have $1]) LIBS="$LIBS_search_libs_save" ]) # --------------------------------------------------------------------------- # Macro: FCNTL_FLAGS # --------------------------------------------------------------------------- AC_DEFUN([AC_FCNTL_FLAGS], [ AC_CACHE_CHECK([for O_CLOEXEC], [ac_cv_o_cloexec], [ AC_LANG_PUSH([C]) save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -I${srcdir}" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include ], [ int flags= O_CLOEXEC])], [ac_cv_o_cloexec="yes"], [ac_cv_o_cloexec="no"]) AC_LANG_POP ]) AS_IF([test "x$ac_cv_o_cloexec" = "xyes"],[ AC_DEFINE(HAVE_O_CLOEXEC, 1, [Define to 1 if you have O_CLOEXEC defined])]) ]) # --------------------------------------------------------------------------- # End Macro: FCNTL_FLAGS # --------------------------------------------------------------------------- fldigi-3.21.80/m4/static.m40000664000175000017500000000062412313064025012115 00000000000000AC_DEFUN([AC_FLDIGI_STATIC], [ AC_ARG_ENABLE([static], AC_HELP_STRING([--enable-static], [enable static linking for some libraries]), [case "${enableval}" in yes|no) ac_cv_static="${enableval}" ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-static]) ;; esac], [ac_cv_static=no]) ]) fldigi-3.21.80/m4/progs.m40000664000175000017500000000157112313064025011762 00000000000000AC_DEFUN([AC_FLDIGI_PROGRAMS], [ AC_ARG_ENABLE([fldigi], AC_HELP_STRING([--disable-fldigi], [do not build fldigi]), [case "${enableval}" in yes|no) ac_cv_want_fldigi="${enableval}" ;; *) AC_MSG_ERROR([bad value ${enableval} for --disable-fldigi]) ;; esac], [ac_cv_want_fldigi=yes]) AM_CONDITIONAL([WANT_FLDIGI], [test "x$ac_cv_want_fldigi" = "xyes"]) AC_ARG_ENABLE([flarq], AC_HELP_STRING([--disable-flarq], [do not build flarq]), [case "${enableval}" in yes|no) ac_cv_want_flarq="${enableval}" ;; *) AC_MSG_ERROR([bad value ${enableval} for --disable-flarq]) ;; esac], [ac_cv_want_flarq=yes]) AM_CONDITIONAL([WANT_FLARQ], [test "x$ac_cv_want_flarq" = "xyes"]) ]) fldigi-3.21.80/m4/pkg-config.m40000664000175000017500000000266512313064025012661 00000000000000# name, version, show-in-help?, optional?, help-text, [am-cond] AC_DEFUN([AC_FLDIGI_PKG_CHECK], [ m4_define([PKG_NAME_UC], m4_translit([$1], [a-z], [A-Z])) m4_if([$3], [yes], [ AC_ARG_WITH($1, AC_HELP_STRING([--with-[]$1], [$5]), [case "${withval}" in yes|no) ac_cv_want_[]$1="${withval}" ;; *) AC_MSG_ERROR([bad value "${withval}" for --with-[]$1]) ;; esac], [ac_cv_want_[]$1=check]) ]) m4_if([$4], [no], [ac_cv_want_[]$1=yes]) test "x$ac_cv_want_[]$1" = "x" && ac_cv_want_[]$1="check" case "x$ac_cv_want_[]$1" in "xno") ac_cv_[]$1=no ;; "xcheck") PKG_CHECK_MODULES(PKG_NAME_UC, [$2], [ac_cv_[]$1=yes], [ac_cv_[]$1=no]) ;; "xyes") PKG_CHECK_MODULES(PKG_NAME_UC, [$2]) # if we get here the test has succeeded ac_cv_[]$1=yes ;; esac if test "x$ac_cv_[]$1" = "xyes"; then AC_DEFINE([USE_]PKG_NAME_UC, 1, [Define to 1 if we are using $1]) pkg_[]$1_version=`$PKG_CONFIG --modversion "$2" 2>/dev/null` else AC_DEFINE([USE_]PKG_NAME_UC, 0, [Define to 1 if we are using $1]) pkg_[]$1_version="" fi AC_SUBST(PKG_NAME_UC[_CFLAGS]) AC_SUBST(PKG_NAME_UC[_LIBS]) AC_DEFINE_UNQUOTED(PKG_NAME_UC[_BUILD_VERSION], ["$pkg_[]$1_version"], [$1 version]) m4_ifval([$6], [ AM_CONDITIONAL([$6], [test "x$ac_cv_[]$1" = "xyes"]) ], [:]) ]) fldigi-3.21.80/m4/tls.m40000664000175000017500000001024012313064025011423 00000000000000dnl Check whether TLS is supported. C test code from gcc's config/tls.m4. AC_DEFUN([CHECK_TLS], [ AC_MSG_CHECKING([for TLS support]) AC_LANG_PUSH(C++) AC_RUN_IFELSE([__thread int a; int b; int main() { return a = b; }], [chktls_save_CXXFLAGS="$CXXFLAGS" thread_CXXFLAGS=failed for flag in "" "-pthread" "-lpthread"; do CXXFLAGS="$flag $chktls_save_CXXFLAGS" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include void *g(void *d) { return NULL; }]], [[pthread_t t; pthread_create(&t, NULL, g, NULL);]] ) ], [thread_CXXFLAGS="$flag"] ) if test "x$thread_CXXFLAGS" != "xfailed"; then break fi done CXXFLAGS="$chktls_save_CXXFLAGS" if test "x$thread_CXXFLAGS" != "xfailed"; then CXXFLAGS="$thread_CXXFLAGS $chktls_save_CXXFLAGS" AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include __thread int a; static int *a_in_other_thread; static void *thread_func(void *arg) { a_in_other_thread = &a; return (void *)0; }]], [[pthread_t thread; void *thread_retval; int *a_in_main_thread; if (pthread_create(&thread, (pthread_attr_t *)0, thread_func, (void *)0)) return 0; a_in_main_thread = &a; if (pthread_join (thread, &thread_retval)) return 0; return (a_in_other_thread == a_in_main_thread);]] ) ], [ac_cv_tls=yes], [ac_cv_tls=no] ) CXXFLAGS="$chktls_save_CXXFLAGS" fi], [ac_cv_tls=no], [AC_LINK_IFELSE([__thread int a; int b; int main() { return a = b; }], [ac_cv_tls=yes], [ac_cv_tls=no])] ) AC_LANG_POP(C++) AC_MSG_RESULT([$ac_cv_tls]) ]) AC_DEFUN([AC_FLDIGI_TLS], [ AC_ARG_ENABLE([tls], AC_HELP_STRING([--enable-tls], [enable use of TLS @<:@autodetect@:>@]), [case "${enableval}" in yes|no) ac_cv_want_tls="${enableval}" ;; *) AC_MSG_ERROR([bad value "${enableval}" for --enable-tls]) ;; esac], [ac_cv_want_tls=check]) if test "x$target_mingw32" = "xyes"; then ac_cv_want_tls=no fi if test "x$ac_cv_want_tls" = "xno"; then AC_DEFINE(USE_TLS, 0, [Defined if we are using TLS]) ac_cv_tls=no AC_MSG_CHECKING([for TLS support]) AC_MSG_RESULT([disabled]) else CHECK_TLS() if test "x$ac_cv_want_tls" = "xcheck"; then if test "x$ac_cv_tls" = "xyes"; then AC_DEFINE(USE_TLS, 1, [Defined if we are using TLS]) else AC_DEFINE(USE_TLS, 0, [Defined if we are using TLS]) fi else # $ac_cv_want_tls is yes if test "x$ac_cv_tls" = "xno"; then AC_MSG_FAILURE([--enable-tls was given, but TLS is not supported]) else AC_DEFINE(USE_TLS, 1, [Defined if we are using TLS]) fi fi fi ]) fldigi-3.21.80/m4/docs.m40000664000175000017500000000317312313064025011560 00000000000000AC_DEFUN([AC_FLDIGI_DOCS], [ AC_ARG_WITH([asciidoc], AC_HELP_STRING([--with-asciidoc], [build documentation using asciidoc @<:@autodetect@:>@]), [case "${withval}" in yes|no) ac_cv_want_asciidoc="${withval}" ;; *) AC_MSG_ERROR([bad value "${withval}" for --with-asciidoc]) ;; esac], [ac_cv_want_asciidoc=check]) if test "x$ac_cv_want_asciidoc" != "xno"; then AC_PATH_PROG([ASCIIDOC], [asciidoc]) asciidoc_min=8.2.0 if test "x$ASCIIDOC" != "x"; then AC_MSG_CHECKING([for asciidoc >= $asciidoc_min]) asciidoc_ver=$($ASCIIDOC --version | sed -n '1 s/.* //; p') AX_COMPARE_VERSION([$asciidoc_ver], [ge], [$asciidoc_min], [AC_MSG_RESULT([yes ($asciidoc_ver)])], [AC_MSG_RESULT([no ($asciidoc_ver)]); ASCIIDOC=""]) fi if test "x$ASCIIDOC" != "x"; then AC_PATH_PROG([A2X], [a2x]) AX_COMPARE_VERSION([$asciidoc_ver], [ge], [8.3.0], [no_xmllint=yes], [no_xmllint=no]) fi if test "x$ac_cv_want_asciidoc" = "xyes"; then if test "x$ASCIIDOC" = "x" -o "x$A2X" = "x"; then AC_MSG_FAILURE([--with-asciidoc was given, but check for asciidoc failed]) elif test "x$A2X" = "x"; then AC_MSG_FAILURE([--with-asciidoc was given, but check for a2x failed]) fi fi fi AC_SUBST([ASCIIDOC]) AC_SUBST([A2X]) AM_CONDITIONAL([HAVE_ASCIIDOC], [test "x$ASCIIDOC" != "x" -a "x$A2X" != "x"]) AM_CONDITIONAL([HAVE_ASCIIDOC_NO_XMLLINT], [test "$no_xmllint" = "yes"]) ]) fldigi-3.21.80/m4/intl/0000775000175000017500000000000012313333721011412 500000000000000fldigi-3.21.80/m4/intl/iconv.m40000664000175000017500000001375312313064025012721 00000000000000# iconv.m4 serial AM6 (gettext-0.17) dnl Copyright (C) 2000-2002, 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_lib_iconv=yes am_cv_func_iconv=yes) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], am_cv_func_iconv_works, [ dnl This tests against bugs in AIX 5.1 and HP-UX 11.11. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi AC_TRY_RUN([ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; }], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], [case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac]) LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST(LIBICONV) AC_SUBST(LTLIBICONV) ]) AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL(am_cv_proto_iconv, [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([$]{ac_t:- }[$]am_cv_proto_iconv) AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, [Define as const if the declaration of iconv() needs const.]) fi ]) fldigi-3.21.80/m4/intl/gettext.m40000664000175000017500000003457012313064025013267 00000000000000# gettext.m4 serial 60 (gettext-0.17) dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2006. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value `$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH(included-gettext, [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], [$gt_func_gnugettext_libintl], [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv. if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE(HAVE_GETTEXT, 1, [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE(HAVE_DCGETTEXT, 1, [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST(BUILD_INCLUDED_LIBINTL) AC_SUBST(USE_INCLUDED_LIBINTL) AC_SUBST(CATOBJEXT) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST(DATADIRNAME) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST(INSTOBJEXT) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST(GENCAT) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST(INTLOBJS) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST(INTLLIBS) dnl Make all documented variables known to autoconf. AC_SUBST(LIBINTL) AC_SUBST(LTLIBINTL) AC_SUBST(POSUB) ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) fldigi-3.21.80/m4/intl/lib-link.m40000664000175000017500000007205512313064025013304 00000000000000# lib-link.m4 serial 13 (gettext-0.17) dnl Copyright (C) 2001-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ(2.54) dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes undefine([Name]) undefine([NAME]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. If found, it dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" LIBS="$LIBS $LIB[]NAME" AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= LIB[]NAME[]_PREFIX= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) undefine([Name]) undefine([NAME]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl acl_libext, dnl acl_shlibext, dnl acl_hardcode_libdir_flag_spec, dnl acl_hardcode_libdir_separator, dnl acl_hardcode_direct, dnl acl_hardcode_minus_L. AC_DEFUN([AC_LIB_RPATH], [ dnl Tell automake >= 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE(rpath, [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Autoconf >= 2.61 supports dots in --with options. define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix], [ --with-lib]N_A_M_E[-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib --without-lib]N_A_M_E[-prefix don't search for lib$1 in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIB[]NAME[]_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) fldigi-3.21.80/m4/intl/po.m40000664000175000017500000004460612313064025012222 00000000000000# po.m4 serial 15 (gettext-0.17) dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.17]) dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) dnl Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac changequote([,])dnl AC_SUBST([MSGFMT_015]) changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Installation directories. dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we dnl have to define it here, so that it can be used in po/Makefile. test -n "$localedir" || localedir='${datadir}/locale' AC_SUBST([localedir]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done]], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" <, 1996. AC_PREREQ(2.50) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) fldigi-3.21.80/m4/intl/lib-ld.m40000664000175000017500000000653112313064025012742 00000000000000# lib-ld.m4 serial 3 (gettext-0.13) dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, [# I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1
conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by GCC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(acl_cv_path_LD, [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT($LD) else AC_MSG_RESULT(no) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) fldigi-3.21.80/m4/intl/lib-prefix.m40000664000175000017500000001503612313064025013640 00000000000000# lib-prefix.m4 serial 5 (gettext-0.15) dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing dnl the basename of the libdir, either "lib" or "lib64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. The current dnl practice is that on a system supporting 32-bit and 64-bit instruction dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit dnl libraries go under $prefix/lib. We determine the compiler's default dnl mode by looking at the compiler's library search path. If at least dnl of its elements ends in /lib64 or points to a directory whose absolute dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the dnl default, namely "lib". acl_libdirstem=lib searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ]) fldigi-3.21.80/m4/intl/nls.m40000664000175000017500000000226612313064025012374 00000000000000# nls.m4 serial 3 (gettext-0.15) dnl Copyright (C) 1995-2003, 2005-2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT($USE_NLS) AC_SUBST(USE_NLS) ]) fldigi-3.21.80/m4/benchmark.m40000664000175000017500000000130512313064025012555 00000000000000AC_DEFUN([AC_FLDIGI_BENCHMARK], [ AC_ARG_ENABLE([benchmark], AC_HELP_STRING([--enable-benchmark], [build for benchmark-only operation]), [case "${enableval}" in yes|no) ac_cv_benchmark="${enableval}" ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-benchmark]) ;; esac], [ac_cv_benchmark=no]) if test "x$ac_cv_benchmark" = "xyes"; then AC_DEFINE(BENCHMARK_MODE, 1, [Defined if we are building for benchmarking]) else AC_DEFINE(BENCHMARK_MODE, 0, [Defined if we are building for benchmarking]) fi AM_CONDITIONAL([ENABLE_BENCHMARK], [test "x$ac_cv_benchmark" = "xyes"]) ]) fldigi-3.21.80/m4/debug.m40000664000175000017500000000744512313064025011724 00000000000000AC_DEFUN([AC_FLDIGI_RDYNAMIC], [ LDFLAGS_saved="$LDFLAGS" LDFLAGS="$LDFLAGS -rdynamic" AC_MSG_CHECKING([whether $CC supports -rdynamic]) # don't try this on win32; it succeeds but emits a warning at link time if test "x$target_win32" != "xyes"; then AC_TRY_LINK([], [], [ac_cv_rdynamic=yes], [ac_cv_rdynamic=no]) else ac_cv_rdynamic=no fi AC_MSG_RESULT([$ac_cv_rdynamic]) AC_LANG_PUSH(C++) AC_MSG_CHECKING([whether $CXX supports -rdynamic]) if test "x$target_win32" != "xyes"; then AC_TRY_LINK([], [], [ac_cv_rdynamic=yes], [ac_cv_rdynamic=no]) else ac_cv_rdynamic=no fi AC_LANG_POP(C++) AC_MSG_RESULT([$ac_cv_rdynamic]) LDFLAGS="$LDFLAGS_saved" ]) AC_DEFUN([AC_FLDIGI_DEBUG], [ AC_REQUIRE([AC_FLDIGI_OPT]) AC_ARG_ENABLE([debug], AC_HELP_STRING([--enable-debug], [turn on debugging]), [case "${enableval}" in yes|no) ac_cv_debug="${enableval}" ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;; esac], [ac_cv_debug=no]) AC_ARG_VAR([BFD_CFLAGS], [C compiler flags for libbfd]) AC_ARG_VAR([BFD_LIBS], [linker flags for libbfd]) AC_ARG_WITH([bfd], AC_HELP_STRING([--with-bfd@<:@=DIR@:>@], [search for libbfd in DIR/include and DIR/lib @<:@mingw32 only@:>@]), [ac_cv_want_bfd="$withval"], [ac_cv_want_bfd=yes]) if test "x$ac_cv_debug" = "xyes" && test "x$ac_cv_want_bfd" != "xno" && \ test "x$target_mingw32" = "xyes"; then if test "x$ac_cv_want_bfd" != "xyes"; then # set -I and -L switches bfd_default_cflags="-I${ac_cv_want_bfd}/include" bfd_default_libs="-L${ac_cv_want_bfd}/lib" fi # don't override the user-specified vars BFD_CFLAGS="${BFD_CFLAGS:-$bfd_default_cflags}" BFD_LIBS="${BFD_LIBS:-$bfd_default_libs}" ac_cv_want_bfd="yes" CPPFLAGS_saved="$CPPFLAGS" LDFLAGS_saved="$LDFLAGS" CPPFLAGS="$CPPFLAGS $BFD_CFLAGS" LDFLAGS="$LDFLAGS $BFD_LIBS" AC_CHECK_HEADER([bfd.h], [ac_cv_have_bfd="yes"], [ac_cv_have_bfd="no"]) if test "x$ac_cv_have_bfd" = "xyes"; then bfd_other_libs="-liberty -lpsapi -limagehlp" AC_CHECK_LIB([bfd], [bfd_set_format], [ac_cv_have_bfd="yes"], [ac_cv_have_bfd="no"], [$bfd_other_libs]) fi CPPFLAGS="$CPPFLAGS_saved" LDFLAGS="$LDFLAGS_saved" if test "x$ac_cv_have_bfd" = "xyes"; then BFD_LIBS="$BFD_LIBS -lbfd $bfd_other_libs" fi fi if test "x$ac_cv_debug" = "xyes"; then AC_MSG_CHECKING([for debug info flag]) if test "x$GXX" = "xyes"; then if test "x$target_mingw32" = "xyes"; then gflag="-gstabs" else gflag="-ggdb3" fi else gflag="-g" fi AC_MSG_RESULT([$gflag]) DEBUG_CFLAGS="-O0 -fno-inline-functions $gflag -Wall" AC_FLDIGI_RDYNAMIC if test "x$ac_cv_rdynamic" = "xyes"; then RDYNAMIC=-rdynamic fi CXXFLAGS="" CFLAGS="$CXXFLAGS" AC_MSG_NOTICE([debugging enabled; overriding CXXFLAGS]) if test "x$target_darwin" = "xyes"; then ac_cv_compat_stack=yes AC_DEFINE([HAVE_DBG_STACK], 1, [Define to 1 if we have dbg::stack]) elif test "x$target_mingw32" = "xyes" && test "x$ac_cv_have_bfd" = "xyes"; then ac_cv_compat_stack=yes AC_DEFINE([HAVE_DBG_STACK], 1, [Define to 1 if we have dbg::stack]) else ac_cv_compat_stack=no AC_DEFINE([HAVE_DBG_STACK], 0, [Define to 0 if not using dbg::stack]) fi fi AM_CONDITIONAL([ENABLE_DEBUG], [test "x$ac_cv_debug" = "xyes"]) AC_SUBST([DEBUG_CFLAGS]) AC_SUBST([RDYNAMIC]) AM_CONDITIONAL([COMPAT_STACK], [test "x$ac_cv_compat_stack" = "xyes"]) ]) fldigi-3.21.80/m4/opt.m40000664000175000017500000000161312313064025011427 00000000000000AC_DEFUN([AC_FLDIGI_OPT], [ AC_ARG_ENABLE([optimizations], AC_HELP_STRING([--enable-optimizations], [use x86 optimizations (none|sse|sse2|sse3|native) @<:@none@:>@]), [case "${enableval}" in none|sse|sse2|sse3|native) ac_cv_opt="${enableval}" ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-optimizations]) ;; esac], [ac_cv_opt=none]) OPT_CFLAGS="-O2 -ffast-math -finline-functions" case "$ac_cv_opt" in sse) OPT_CFLAGS="$OPT_CFLAGS -msse -mfpmath=sse" ;; sse2) OPT_CFLAGS="$OPT_CFLAGS -msse2 -mfpmath=sse" ;; sse3) OPT_CFLAGS="$OPT_CFLAGS -msse3 -mfpmath=sse" ;; native) OPT_CFLAGS="$OPT_CFLAGS -march=native -mfpmath=sse" ;; none) ;; esac AC_SUBST([OPT_CFLAGS]) ]) fldigi-3.21.80/m4/bind.m40000664000175000017500000000302212313064025011535 00000000000000dnl Look for a working std::bind or std::tr1::bind. AC_DEFUN([AC_FLDIGI_BIND], [ AC_LANG_PUSH(C++) AC_MSG_CHECKING([for std::bind in ]) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include void f(void) { }]], [[std::bind(f)();]])], [ac_cv_std_bind=yes], [ac_cv_std_bind=no] ) AC_MSG_RESULT([$ac_cv_std_bind]) if test "x$ac_cv_std_bind" = "xyes"; then AC_DEFINE(HAVE_STD_BIND, 1, [Define to 1 if we have std::bind in ]) else AC_DEFINE(HAVE_STD_BIND, 0, [Define to 1 if we have std::bind in ]) fi if test "x$ac_cv_std_bind" = "xno"; then AC_MSG_CHECKING([for std::tr1::bind in ]) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include void f(void) { }]], [[std::tr1::bind(f)();]])], [ac_cv_std_tr1_bind=yes], [ac_cv_std_tr1_bind=no] ) AC_MSG_RESULT([$ac_cv_std_tr1_bind]) if test "x$ac_cv_std_tr1_bind" = "xyes"; then AC_DEFINE(HAVE_STD_TR1_BIND, 1, [Define to 1 if we have std::tr1::bind in ]) else AC_DEFINE(HAVE_STD_TR1_BIND, 0, [Define to 1 if we have std::tr1::bind in ]) fi fi AC_LANG_POP(C++) if test "x$ac_cv_std_bind" = "xno" && test "x$ac_cv_std_tr1_bind" = "xno"; then AC_MSG_ERROR([Could not find std::bind or std::tr1::bind]) fi ]) fldigi-3.21.80/m4/build.m40000664000175000017500000001154112313064025011725 00000000000000AC_DEFUN([AC_FLDIGI_SH_DQ], [ ac_sh_dq="\"`$1 | sed 's/"/\\\\"/g'`\"" ]) AC_DEFUN([AC_FLDIGI_BUILD_INFO], [ # Define build flags and substitute in Makefile.in # CPPFLAGS FLDIGI_BUILD_CPPFLAGS="-I\$(srcdir) -I\$(srcdir)/include \ -I\$(srcdir)/irrxml \ -I\$(srcdir)/libtiniconv \ -I\$(srcdir)/fileselector \ -I\$(srcdir)/xmlrpcpp" # CXXFLAGS FLDIGI_BUILD_CXXFLAGS="$PORTAUDIO_CFLAGS $FLTK_CFLAGS $X_CFLAGS $SNDFILE_CFLAGS $SAMPLERATE_CFLAGS \ $PULSEAUDIO_CFLAGS $HAMLIB_CFLAGS $PNG_CFLAGS $XMLRPC_CFLAGS $MAC_UNIVERSAL_CFLAGS \ $INTL_CFLAGS $PTW32_CFLAGS $BFD_CFLAGS -pipe -Wall -fexceptions $OPT_CFLAGS $DEBUG_CFLAGS" if test "x$target_mingw32" = "xyes"; then FLDIGI_BUILD_CXXFLAGS="-mthreads $FLDIGI_BUILD_CXXFLAGS" fi # LDFLAGS FLDIGI_BUILD_LDFLAGS="$MAC_UNIVERSAL_LDFLAGS" if test "x$target_mingw32" = "xyes"; then FLDIGI_BUILD_LDFLAGS="-mthreads $FLDIGI_BUILD_LDFLAGS" fi # LDADD FLDIGI_BUILD_LDADD="$PORTAUDIO_LIBS $FLTK_LIBS $X_LIBS $SNDFILE_LIBS $SAMPLERATE_LIBS \ $PULSEAUDIO_LIBS $HAMLIB_LIBS $PNG_LIBS $XMLRPC_LIBS $INTL_LIBS $PTW32_LIBS $BFD_LIBS $EXTRA_LIBS" # CPPFLAGS FLARQ_BUILD_CPPFLAGS="-I\$(srcdir) -I\$(srcdir)/include -I\$(srcdir)/fileselector \ -I\$(srcdir)/flarq-src -I\$(srcdir)/flarq-src/include" # CXXFLAGS FLARQ_BUILD_CXXFLAGS="$FLTK_CFLAGS $X_CFLAGS $MAC_UNIVERSAL_CFLAGS $INTL_CFLAGS $PTW32_CFLAGS \ $BFD_CFLAGS -pipe -Wall -fexceptions $OPT_CFLAGS $DEBUG_CFLAGS" if test "x$target_mingw32" = "xyes"; then FLARQ_BUILD_CXXFLAGS="-mthreads $FLARQ_BUILD_CXXFLAGS" fi # LDFLAGS FLARQ_BUILD_LDFLAGS="$MAC_UNIVERSAL_LDFLAGS" if test "x$target_mingw32" = "xyes"; then FLARQ_BUILD_LDFLAGS="-mthreads $FLARQ_BUILD_LDFLAGS" fi # LDADD FLARQ_BUILD_LDADD="$FLTK_LIBS $X_LIBS $INTL_LIBS $PTW32_LIBS $BFD_LIBS $EXTRA_LIBS" if test "x$ac_cv_debug" = "xyes"; then FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS -UNDEBUG" FLDIGI_BUILD_LDFLAGS="$FLDIGI_BUILD_LDFLAGS $RDYNAMIC" FLARQ_BUILD_CXXFLAGS="$FLARQ_BUILD_CXXFLAGS -UNDEBUG" FLARQ_BUILD_LDFLAGS="$FLARQ_BUILD_LDFLAGS $RDYNAMIC" else FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS -DNDEBUG" FLARQ_BUILD_CXXFLAGS="$FLARQ_BUILD_CXXFLAGS -DNDEBUG" fi AC_SUBST([FLDIGI_BUILD_CPPFLAGS]) AC_SUBST([FLDIGI_BUILD_CXXFLAGS]) AC_SUBST([FLDIGI_BUILD_LDFLAGS]) AC_SUBST([FLDIGI_BUILD_LDADD]) AC_SUBST([FLARQ_BUILD_CPPFLAGS]) AC_SUBST([FLARQ_BUILD_CXXFLAGS]) AC_SUBST([FLARQ_BUILD_LDFLAGS]) AC_SUBST([FLARQ_BUILD_LDADD]) #define build variables for config.h AC_DEFINE_UNQUOTED([BUILD_BUILD_PLATFORM], ["$build"], [Build platform]) AC_DEFINE_UNQUOTED([BUILD_HOST_PLATFORM], ["$host"], [Host platform]) AC_DEFINE_UNQUOTED([BUILD_TARGET_PLATFORM], ["$target"], [Target platform]) test "x$LC_ALL" != "x" && LC_ALL_saved="$LC_ALL" LC_ALL=C export LC_ALL AC_FLDIGI_SH_DQ([echo $ac_configure_args]) AC_DEFINE_UNQUOTED([BUILD_CONFIGURE_ARGS], [$ac_sh_dq], [Configure arguments]) AC_FLDIGI_SH_DQ([date]) AC_DEFINE_UNQUOTED([BUILD_DATE], [$ac_sh_dq], [Build date]) AC_FLDIGI_SH_DQ([whoami]) AC_DEFINE_UNQUOTED([BUILD_USER], [$ac_sh_dq], [Build user]) AC_FLDIGI_SH_DQ([hostname]) AC_DEFINE_UNQUOTED([BUILD_HOST], [$ac_sh_dq], [Build host]) AC_FLDIGI_SH_DQ([$CXX -v 2>&1 | tail -1]) AC_DEFINE_UNQUOTED([BUILD_COMPILER], [$ac_sh_dq], [Compiler]) AC_FLDIGI_SH_DQ([echo $FLDIGI_BUILD_CPPFLAGS $FLDIGI_BUILD_CXXFLAGS]) AC_DEFINE_UNQUOTED([FLDIGI_BUILD_CXXFLAGS], [$ac_sh_dq], [Fldigi compiler flags]) AC_FLDIGI_SH_DQ([echo $FLDIGI_BUILD_LDFLAGS $FLDIGI_BUILD_LDADD]) AC_DEFINE_UNQUOTED([FLDIGI_BUILD_LDFLAGS], [$ac_sh_dq], [Fldigi linker flags]) AC_FLDIGI_SH_DQ([echo $FLARQ_BUILD_CPPFLAGS $FLARQ_BUILD_CXXFLAGS]) AC_DEFINE_UNQUOTED([FLARQ_BUILD_CXXFLAGS], [$ac_sh_dq], [Flarq compiler flags]) AC_FLDIGI_SH_DQ([echo $FLARQ_BUILD_LDFLAGS $FLARQ_BUILD_LDADD]) AC_DEFINE_UNQUOTED([FLARQ_BUILD_LDFLAGS], [$ac_sh_dq], [Flarq linker flags]) if test "x$LC_ALL_saved" != "x"; then LC_ALL="$LC_ALL_saved" export LC_ALL fi ]) # This macro defines SILENT_CMDS, which is @expanded@ in # {src,doc}/Makefile.am to define a function that generates custom build # command output depending on the values of the variables # $(AM_DEFAULT_VERBOSITY) and $(V). These variables affect the custom # command output in the same way as they do for automake's build rules. AC_DEFUN([AC_FLDIGI_BUILD_RULES_SILENT], [ m4_ifdef([AM_SUBST_NOTMAKE], [AM_SUBST_NOTMAKE([SILENT_CMDS])]) AC_SUBST([SILENT_CMDS], ['silent_cmd = @echo " $(1)" $(2); ifeq ($(AM_DEFAULT_VERBOSITY),0) silent = $(if $(subst 0,,$(V)),,$(silent_cmd)) else ifeq ($(V),0) silent = $(silent_cmd) endif endif']) ]) AC_DEFUN([AC_FLDIGI_BUILD_RULES], [m4_ifdef([AM_SILENT_RULES], [AC_FLDIGI_BUILD_RULES_SILENT], [AC_SUBST([SILENT_CMDS], [])])]) fldigi-3.21.80/m4/ax_compare_version.m40000664000175000017500000001461212313064025014513 00000000000000# =========================================================================== # http://autoconf-archive.cryp.to/ax_compare_version.html # =========================================================================== # # SYNOPSIS # # AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # # DESCRIPTION # # This macro compares two version strings. Due to the various number of # minor-version numbers that can exist, and the fact that string # comparisons are not compatible with numeric comparisons, this is not # necessarily trivial to do in a autoconf script. This macro makes doing # these comparisons easy. # # The six basic comparisons are available, as well as checking equality # limited to a certain number of minor-version levels. # # The operator OP determines what type of comparison to do, and can be one # of: # # eq - equal (test A == B) # ne - not equal (test A != B) # le - less than or equal (test A <= B) # ge - greater than or equal (test A >= B) # lt - less than (test A < B) # gt - greater than (test A > B) # # Additionally, the eq and ne operator can have a number after it to limit # the test to that number of minor versions. # # eq0 - equal up to the length of the shorter version # ne0 - not equal up to the length of the shorter version # eqN - equal up to N sub-version levels # neN - not equal up to N sub-version levels # # When the condition is true, shell commands ACTION-IF-TRUE are run, # otherwise shell commands ACTION-IF-FALSE are run. The environment # variable 'ax_compare_version' is always set to either 'true' or 'false' # as well. # # Examples: # # AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8]) # AX_COMPARE_VERSION([3.15],[lt],[3.15.8]) # # would both be true. # # AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8]) # AX_COMPARE_VERSION([3.15],[gt],[3.15.8]) # # would both be false. # # AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8]) # # would be true because it is only comparing two minor versions. # # AX_COMPARE_VERSION([3.15.7],[eq0],[3.15]) # # would be true because it is only comparing the lesser number of minor # versions of the two values. # # Note: The characters that separate the version numbers do not matter. An # empty string is the same as version 0. OP is evaluated by autoconf, not # configure, so must be a string, not a variable. # # The author would like to acknowledge Guido Draheim whose advice about # the m4_case and m4_ifvaln functions make this macro only include the # portions necessary to perform the specific comparison specified by the # OP argument in the final configure script. # # LAST MODIFICATION # # 2008-04-12 # # COPYLEFT # # Copyright (c) 2008 Tim Toolan # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. dnl ######################################################################### AC_DEFUN([AX_COMPARE_VERSION], [ AC_REQUIRE([AC_PROG_AWK]) # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. AS_VAR_PUSHDEF([A],[ax_compare_version_A]) A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/[[^0-9]]//g'` AS_VAR_PUSHDEF([B],[ax_compare_version_B]) B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/[[^0-9]]//g'` dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary dnl # then the first line is used to determine if the condition is true. dnl # The sed right after the echo is to remove any indented white space. m4_case(m4_tolower($2), [lt],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"` ], [gt],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"` ], [le],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"` ], [ge],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"` ],[ dnl Split the operator from the subversion count if present. m4_bmatch(m4_substr($2,2), [0],[ # A count of zero means use the length of the shorter version. # Determine the number of characters in A and B. ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'` ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'` # Set A to no more than B's length and B to no more than A's length. A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"` B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"` ], [[0-9]+],[ # A count greater than zero means use only that many subversions A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` ], [.+],[ AC_WARNING( [illegal OP numeric parameter: $2]) ],[]) # Pad zeros at end of numbers to make same length. ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`" B="$B`echo $A | sed 's/./0/g'`" A="$ax_compare_version_tmp_A" # Check for equality or inequality as necessary. m4_case(m4_tolower(m4_substr($2,0,2)), [eq],[ test "x$A" = "x$B" && ax_compare_version=true ], [ne],[ test "x$A" != "x$B" && ax_compare_version=true ],[ AC_WARNING([illegal OP parameter: $2]) ]) ]) AS_VAR_POPDEF([A])dnl AS_VAR_POPDEF([B])dnl dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE. if test "$ax_compare_version" = "true" ; then m4_ifvaln([$4],[$4],[:])dnl m4_ifvaln([$5],[else $5])dnl fi ]) dnl AX_COMPARE_VERSION fldigi-3.21.80/m4/macosx.m40000664000175000017500000000312512313064025012117 00000000000000AC_DEFUN([AC_FLDIGI_MACOSX], [ case "$target_os" in darwin*) target_darwin="yes" ;; *) target_darwin="no" ;; esac if test "$target_darwin" = "yes"; then AC_MSG_NOTICE([using bundled GNU regex on $target_os]) # pretend that the regex.h check failed so that we use the bundled regex code ac_cv_header_regex_h=no AC_DEFINE([HAVE_REGEX_H], 0, [Define to 1 if you have the header file.]) fi AC_ARG_ENABLE([mac-universal], AC_HELP_STRING([--enable-mac-universal], [build a universal binary on Mac OS X @<:@no@:>@]), [case "${enableval}" in yes|no) ac_cv_mac_universal="${enableval}" ;; *) AC_MSG_ERROR([bad value "${enableval}" for --enable-mac-universal]) ;; esac], [ac_cv_mac_universal=no]) if test "x$target_darwin" = "xyes" && test "x$ac_cv_mac_universal" = "xyes"; then mac_minversion="-mmacosx-version-min=10.4" case "$target_os" in darwin8*) mac_arches="-arch i386 -arch ppc" mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.4u.sdk" ;; darwin9*) mac_arches="-arch i386 -arch ppc -arch x86_64 -arch ppc64" mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.5.sdk" ;; *) mac_arches="" mac_sysroot="" ;; esac MAC_UNIVERSAL_CFLAGS="$mac_arches $mac_sysroot $mac_minversion" MAC_UNIVERSAL_LDFLAGS="$mac_arches" fi AC_SUBST([MAC_UNIVERSAL_CFLAGS]) AC_SUBST([MAC_UNIVERSAL_LDFLAGS]) AM_CONDITIONAL([DARWIN], [test "x$target_darwin" = "xyes"]) ]) fldigi-3.21.80/m4/oss.m40000664000175000017500000000305012313064025011426 00000000000000AC_DEFUN([AC_FLDIGI_OSS], [ AC_REQUIRE([AC_FLDIGI_MACOSX]) AC_REQUIRE([AC_FLDIGI_WIN32]) if test "x$target_darwin" = "xno" && test "x$target_win32" = "xno"; then AC_ARG_ENABLE([oss], AC_HELP_STRING([--disable-oss], [disable support for OSS @<:@autodetect@:>@]), [case "${enableval}" in yes|no) ac_cv_want_oss="${enableval}" ;; *) AC_MSG_ERROR([bad value "${enableval}" for --disable-oss]) ;; esac], [ac_cv_want_oss=check]) else AC_MSG_NOTICE([disabling OSS driver on $target_os]) ac_cv_want_oss=no fi ac_cv_oss=no if test "x$ac_cv_want_oss" = "xno"; then AC_DEFINE(USE_OSS, 0, [Defined if we are using OSS]) else AC_CHECK_HEADER( [sys/soundcard.h], [ac_cv_oss=yes], [AC_CHECK_HEADER([machine/soundcard.h], [ac_cv_oss=yes], [AC_CHECK_HEADER([soundcard.h], [ac_cv_oss=yes], [])])]) if test "x$ac_cv_want_oss" = "xcheck"; then if test "x$ac_cv_oss" = "xyes"; then AC_DEFINE(USE_OSS, 1, [Defined if we are using OSS]) else AC_MSG_NOTICE([disabling OSS driver]) AC_DEFINE(USE_OSS, 0, [Defined if we are using OSS]) fi else # $ac_cv_want_oss is yes if test "x$ac_cv_oss" = "xno"; then AC_MSG_FAILURE([--enable-oss was given, but test for OSS failed]) else AC_DEFINE(USE_OSS, 1, [Defined if we are using OSS]) fi fi fi ]) fldigi-3.21.80/m4/np-compat.m40000664000175000017500000000246312313064025012527 00000000000000AC_DEFUN([AC_FLDIGI_NP_COMPAT], [ AC_REQUIRE([AC_FLDIGI_MACOSX]) AC_REQUIRE([AC_FLDIGI_WIN32]) if test "x$target_mingw32" = "xyes"; then # Newer versions of mingw32 comes with pthread. sem_libs="pthreadGC2 pthread" # pretend that the regex.h check failed so that we use the bundled regex code ac_cv_header_regex_h=no AC_DEFINE([HAVE_REGEX_H], 0, [Define to 1 if you have the header file.]) else sem_libs="pthread rt" fi AM_CONDITIONAL([COMPAT_REGEX], [test "x$ac_cv_header_regex_h" != "xyes"]) other_libs="" if test "x$ac_cv_want_ptw32" = "xyes"; then CFLAGS_saved="$CFLAGS" LDFLAGS_saved="$LDFLAGS" EXTRA_LIBS_saved="$EXTRA_LIBS" CFLAGS="$CFLAGS $PTW32_CFLAGS" LDFLAGS="$LDFLAGS $PTW32_LIBS" other_libs=-lws2_32 fi AC_FLDIGI_SEARCH_LIBS([dlopen], [dl], [$other_libs]) AC_FLDIGI_SEARCH_LIBS([clock_gettime], [rt], [$other_libs]) AC_FLDIGI_SEARCH_LIBS([sem_unlink], [$sem_libs], [$other_libs]) AC_FLDIGI_SEARCH_LIBS([sem_timedwait], [$sem_libs], [$other_libs]) if test "x$ac_cv_want_ptw32" = "xyes"; then CFLAGS="$CFLAGS_saved" LDFLAGS="$LDFLAGS_saved" EXTRA_LIBS="$EXTRA_LIBS_saved" fi AC_SUBST([EXTRA_LIBS]) AM_CONDITIONAL([COMPAT_STRCASESTR], [test "x$ac_cv_func_strcasestr" != "xyes"]) ]) fldigi-3.21.80/m4/libintl.m40000664000175000017500000000050012313064025012254 00000000000000AC_DEFUN([AC_FLDIGI_INTL], [ AC_ARG_VAR([INTL_CFLAGS], [C compiler flags for libintl, overriding gettext macros]) AC_ARG_VAR([INTL_LIBS], [linker flags for libintl, overriding gettext macros]) if test "x$INTL_LIBS" = "x"; then INTL_LIBS="$LIBINTL" fi AC_SUBST([INTL_CFLAGS]) AC_SUBST([INTL_LIBS]) ]) fldigi-3.21.80/m4/fltk.m40000664000175000017500000000507712313064025011575 00000000000000AC_DEFUN([AC_FLDIGI_FLTK], [ AC_ARG_VAR([FLTK_CONFIG], [Path to fltk-config utility]) AC_ARG_VAR([FLTK_CFLAGS], [C compiler flags for FLTK, overriding fltk-config]) AC_ARG_VAR([FLTK_LIBS], [linker flags for FLTK, overriding fltk-config]) if test "x$FLTK_CFLAGS" = "x" && test "x$FLTK_LIBS" = "x"; then if test "x$FLTK_CONFIG" = "x"; then AC_PATH_PROG([FLTK_CONFIG], [fltk-config], [no]) else AC_MSG_CHECKING([for fltk-config]) AC_MSG_RESULT([$FLTK_CONFIG]) fi if test "$FLTK_CONFIG" = "no"; then AC_MSG_ERROR([ *** The fltk-config script could not be found. Please install the development *** headers and libraries for FLTK 1.1.x, or set PATH to the directory that *** contains fltk-config. ]) fi HAVE_FLTK_API_VERSION=no FLTK_API_VERSION="`$FLTK_CONFIG --version`" if test $? -ne 0; then AC_MSG_ERROR([$FLTK_CONFIG failed]) fi if test -n "$(expr $FLTK_API_VERSION : '1\.1[3]')"; then HAVE_FLTK_API_VERSION=yes fi FLDIGI_FLTK_API_MAJOR=${FLTK_API_VERSION%%.*} FLDIGI_FLTK_API_MINOR=${FLTK_API_VERSION#*.}; FLDIGI_FLTK_API_MINOR=${FLDIGI_FLTK_API_MINOR%%.*} FLDIGI_FLTK_API_PATCH=${FLTK_API_VERSION#*.}; FLDIGI_FLTK_API_PATCH=${FLDIGI_FLTK_API_PATCH#*.}; if test "${HAVE_FLTK_API_VERSION}" = "no"; then AC_MSG_ERROR([ *** The version of FLTK found on your system provides API version $FLTK_API_VERSION. *** To build $PACKAGE you need a FLTK version that provides API 1.1, 1.2 or 1.3. ]) fi if test $FLDIGI_FLTK_API_MINOR -gt 3; then AC_MSG_WARN([$PACKAGE_TARNAME may not work with FLTK $FLTK_API_VERSION]) fi FLTK_CFLAGS=`$FLTK_CONFIG --cxxflags` if test "x$ac_cv_static" != "xyes"; then FLTK_LIBS=`$FLTK_CONFIG --ldflags --use-images` else FLTK_LIBS=`$FLTK_CONFIG --ldstaticflags --use-images` fi else AC_MSG_NOTICE([not checking for FLTK]) fi AC_SUBST([FLTK_CFLAGS]) AC_SUBST([FLTK_LIBS]) AC_DEFINE_UNQUOTED([FLTK_BUILD_VERSION], ["`$FLTK_CONFIG --version`"], [FLTK version]) AC_DEFINE_UNQUOTED([FLDIGI_FLTK_API_MAJOR], [$FLDIGI_FLTK_API_MAJOR], [FLTK API major version]) AC_DEFINE_UNQUOTED([FLDIGI_FLTK_API_MINOR], [$FLDIGI_FLTK_API_MINOR], [FLTK API minor version]) AC_DEFINE_UNQUOTED([FLDIGI_FLTK_API_PATCH], [$FLDIGI_FLTK_API_PATCH], [FLTK API patch]) AC_ARG_VAR([FLUID], [Fast Light User-Interface Designer]) AC_CHECK_PROG([FLUID], [fluid], [fluid]) AM_CONDITIONAL([HAVE_FLUID], [test -n "$FLUID"]) ]) fldigi-3.21.80/m4/win32.m40000664000175000017500000000377212313064025011577 00000000000000AC_DEFUN([AC_FLDIGI_WIN32], [ case "$target_os" in *mingw*) target_win32="yes" target_mingw32="yes" ;; *cygwin*|*win32*|*w32*) target_win32="yes" ;; *) target_win32="no" ;; esac if test "x$target_win32" = "xyes"; then AC_CHECK_PROG([WINDRES], [${ac_tool_prefix}windres], [${ac_tool_prefix}windres]) if [ test "x$WINDRES" = "x" ]; then AC_MSG_WARN([The windres utility could not be found]) fi AC_DEFINE([__WOE32__], 1, [Define to 1 if we are building on cygwin or mingw]) AC_DEFINE([__MINGW32__], 1, [Define to 1 if we are building on cygwin or mingw]) AC_DEFINE([_WINDOWS], 1, [Define to 1 if we are building on cygwin or mingw]) fi if test "x$target_mingw32" = "xyes"; then AC_CHECK_PROG([MAKENSIS], [makensis], [makensis]) fi AC_SUBST([WINDRES]) AM_CONDITIONAL([HAVE_WINDRES], [test "x$WINDRES" != "x"]) AC_SUBST([MAKENSIS]) AM_CONDITIONAL([HAVE_NSIS], [test "x$MAKENSIS" != "x"]) AM_CONDITIONAL([WIN32], [test "x$target_win32" = "xyes"]) AM_CONDITIONAL([MINGW32], [test "x$target_mingw32" = "xyes"]) AC_ARG_VAR([PTW32_CFLAGS], [C compiler flags for pthreads-w32]) AC_ARG_VAR([PTW32_LIBS], [linker flags for pthreads-w32]) AC_ARG_WITH([ptw32], AC_HELP_STRING([--with-ptw32@<:@=DIR@:>@], [search for pthreads-w32 in DIR/include and DIR/lib @<:@mingw32 only@:>@]), [ac_cv_want_ptw32="$withval"], [ac_cv_want_ptw32=no]) if test "x$ac_cv_want_ptw32" != "xno"; then if test "x$ac_cv_want_ptw32" != "xyes"; then # set -I and -L switches ptw32_default_cflags="-I${ac_cv_want_ptw32}/include" ptw32_default_libs="-L${ac_cv_want_ptw32}/lib" fi ptw32_default_libs="$ptw32_default_libs -lpthreadGC2 -lws2_32" # don't override the user-specified vars PTW32_CFLAGS="${PTW32_CFLAGS:-$ptw32_default_cflags}" PTW32_LIBS="${PTW32_LIBS:-$ptw32_default_libs}" ac_cv_want_ptw32="yes" fi AC_SUBST([PTW32_CFLAGS]) AC_SUBST([PTW32_LIBS]) ]) fldigi-3.21.80/configure0000775000175000017500000142506412313332264011770 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for fldigi 3.21.80. # # Report bugs to . # # Copyright (C) 2007, 2008, 2009 Stelios Bounanos, M0GLD (m0gld AT enotty DOT net) # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: fldigi-devel@lists.berlios.de about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0
&1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='fldigi' PACKAGE_TARNAME='fldigi' PACKAGE_VERSION='3.21.80' PACKAGE_STRING='fldigi 3.21.80' PACKAGE_BUGREPORT='fldigi-devel@lists.berlios.de' PACKAGE_URL='' ac_unique_file="src/main.cxx" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" gt_needs= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS SILENT_CMDS FLARQ_BUILD_LDADD FLARQ_BUILD_LDFLAGS FLARQ_BUILD_CXXFLAGS FLARQ_BUILD_CPPFLAGS FLDIGI_BUILD_LDADD FLDIGI_BUILD_LDFLAGS FLDIGI_BUILD_CXXFLAGS FLDIGI_BUILD_CPPFLAGS HAVE_ASCIIDOC_NO_XMLLINT_FALSE HAVE_ASCIIDOC_NO_XMLLINT_TRUE HAVE_ASCIIDOC_FALSE HAVE_ASCIIDOC_TRUE A2X ASCIIDOC INTL_LIBS INTL_CFLAGS X_LIBS X_CFLAGS NEED_HAMLIB_LOCATOR_FALSE NEED_HAMLIB_LOCATOR_TRUE ENABLE_HAMLIB_FALSE ENABLE_HAMLIB_TRUE HAMLIB_LIBS HAMLIB_CFLAGS PULSEAUDIO_LIBS PULSEAUDIO_CFLAGS PORTAUDIO_LIBS PORTAUDIO_CFLAGS SNDFILE_LIBS SNDFILE_CFLAGS SAMPLERATE_LIBS SAMPLERATE_CFLAGS PNG_LIBS PNG_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG HAVE_FLUID_FALSE HAVE_FLUID_TRUE FLUID FLTK_LIBS FLTK_CFLAGS FLTK_CONFIG ENABLE_BENCHMARK_FALSE ENABLE_BENCHMARK_TRUE COMPAT_STACK_FALSE COMPAT_STACK_TRUE RDYNAMIC DEBUG_CFLAGS ENABLE_DEBUG_FALSE ENABLE_DEBUG_TRUE BFD_LIBS BFD_CFLAGS OPT_CFLAGS COMPAT_STRCASESTR_FALSE COMPAT_STRCASESTR_TRUE EXTRA_LIBS COMPAT_REGEX_FALSE COMPAT_REGEX_TRUE PTW32_LIBS PTW32_CFLAGS MINGW32_FALSE MINGW32_TRUE WIN32_FALSE WIN32_TRUE HAVE_NSIS_FALSE HAVE_NSIS_TRUE HAVE_WINDRES_FALSE HAVE_WINDRES_TRUE MAKENSIS WINDRES DARWIN_FALSE DARWIN_TRUE MAC_UNIVERSAL_LDFLAGS MAC_UNIVERSAL_CFLAGS WANT_FLARQ_FALSE WANT_FLARQ_TRUE WANT_FLDIGI_FALSE WANT_FLDIGI_TRUE USE_NLS_FALSE USE_NLS_TRUE POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV INTL_MACOSX_LIBS XGETTEXT_EXTRA_OPTIONS MSGMERGE XGETTEXT_015 XGETTEXT GMSGFMT_015 MSGFMT_015 GMSGFMT MSGFMT GETTEXT_MACRO_VERSION USE_NLS POW_LIB LIBOBJS EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX FLARQ_DOCS PACKAGE_GUIDE PACKAGE_DOCS PACKAGE_NEWBUG PACKAGE_PROJ PACKAGE_DL PACKAGE_HOME FLARQ_AUTHORS FLDIGI_AUTHORS MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build AC_CONFIG_ARGS FLARQ_VERSION FLARQ_VERSION_PATCH FLARQ_VERSION_MINOR FLARQ_VERSION_MAJOR FLDIGI_VERSION FLDIGI_VERSION_PATCH FLDIGI_VERSION_MINOR FLDIGI_VERSION_MAJOR target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_dependency_tracking enable_nls with_gnu_ld enable_rpath with_libiconv_prefix with_libintl_prefix enable_fldigi enable_flarq enable_mac_universal with_ptw32 enable_static enable_optimizations enable_debug with_bfd enable_benchmark enable_tls enable_oss with_sndfile with_portaudio with_pulseaudio with_hamlib with_asciidoc ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP PTW32_CFLAGS PTW32_LIBS BFD_CFLAGS BFD_LIBS FLTK_CONFIG FLTK_CFLAGS FLTK_LIBS FLUID PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PNG_CFLAGS PNG_LIBS SAMPLERATE_CFLAGS SAMPLERATE_LIBS SNDFILE_CFLAGS SNDFILE_LIBS PORTAUDIO_CFLAGS PORTAUDIO_LIBS PULSEAUDIO_CFLAGS PULSEAUDIO_LIBS HAMLIB_CFLAGS HAMLIB_LIBS X_CFLAGS X_LIBS INTL_CFLAGS INTL_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures fldigi 3.21.80 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/fldigi] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of fldigi 3.21.80:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0') --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors Optional Features and Packages: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --disable-nls do not use Native Language Support --with-gnu-ld assume the C compiler uses GNU ld default=no --disable-rpath do not hardcode runtime library paths --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --disable-fldigi do not build fldigi --disable-flarq do not build flarq --enable-mac-universal build a universal binary on Mac OS X [no] --with-ptw32[=DIR] search for pthreads-w32 in DIR/include and DIR/lib [mingw32 only] --enable-static enable static linking for some libraries --enable-optimizations use x86 optimizations (none|sse|sse2|sse3|native) [none] --enable-debug turn on debugging --with-bfd[=DIR] search for libbfd in DIR/include and DIR/lib [mingw32 only] --enable-benchmark build for benchmark-only operation --enable-tls enable use of TLS [autodetect] --disable-oss disable support for OSS [autodetect] --with-sndfile enable reading/writing of audio files via libsndfile [autodetect] --with-portaudio enable support for PortAudio [autodetect] --with-pulseaudio enable support for PulseAudio [autodetect] --with-hamlib use hamradio control libraries [autodetect] --with-asciidoc build documentation using asciidoc [autodetect] Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor PTW32_CFLAGS C compiler flags for pthreads-w32 PTW32_LIBS linker flags for pthreads-w32 BFD_CFLAGS C compiler flags for libbfd BFD_LIBS linker flags for libbfd FLTK_CONFIG Path to fltk-config utility FLTK_CFLAGS C compiler flags for FLTK, overriding fltk-config FLTK_LIBS linker flags for FLTK, overriding fltk-config FLUID Fast Light User-Interface Designer PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path PNG_CFLAGS C compiler flags for PNG, overriding pkg-config PNG_LIBS linker flags for PNG, overriding pkg-config SAMPLERATE_CFLAGS C compiler flags for SAMPLERATE, overriding pkg-config SAMPLERATE_LIBS linker flags for SAMPLERATE, overriding pkg-config SNDFILE_CFLAGS C compiler flags for SNDFILE, overriding pkg-config SNDFILE_LIBS linker flags for SNDFILE, overriding pkg-config PORTAUDIO_CFLAGS C compiler flags for PORTAUDIO, overriding pkg-config PORTAUDIO_LIBS linker flags for PORTAUDIO, overriding pkg-config PULSEAUDIO_CFLAGS C compiler flags for PULSEAUDIO, overriding pkg-config PULSEAUDIO_LIBS linker flags for PULSEAUDIO, overriding pkg-config HAMLIB_CFLAGS C compiler flags for HAMLIB, overriding pkg-config HAMLIB_LIBS linker flags for HAMLIB, overriding pkg-config X_CFLAGS C compiler flags for X, overriding pkg-config X_LIBS linker flags for X, overriding pkg-config INTL_CFLAGS C compiler flags for libintl, overriding gettext macros INTL_LIBS linker flags for libintl, overriding gettext macros Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF fldigi configure 3.21.80 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Copyright (C) 2007, 2008, 2009 Stelios Bounanos, M0GLD (m0gld AT enotty DOT net) _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## -------------------------------------------- ## ## Report this to fldigi-devel@lists.berlios.de ## ## -------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_find_intX_t LINENO BITS VAR # ----------------------------------- # Finds a signed integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_intX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 $as_echo_n "checking for int$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in int$2_t 'int' 'long int' \ 'long long int' 'short int' 'signed char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else case $ac_type in #( int$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_intX_t # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by fldigi $as_me 3.21.80, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi gt_needs="$gt_needs " # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # substitute in Makefiles FLDIGI_VERSION_MAJOR=3 FLDIGI_VERSION_MINOR=21 FLDIGI_VERSION_PATCH=.80 FLDIGI_VERSION=3.21.80 FLARQ_VERSION_MAJOR=4 FLARQ_VERSION_MINOR=3 FLARQ_VERSION_PATCH=.4 FLARQ_VERSION=4.3.4 # define in config.h $as_echo "#define FLDIGI_VERSION_MAJOR 3" >>confdefs.h $as_echo "#define FLDIGI_VERSION_MINOR 21" >>confdefs.h $as_echo "#define FLDIGI_VERSION_PATCH \".80\"" >>confdefs.h $as_echo "#define FLARQ_VERSION_MAJOR 4" >>confdefs.h $as_echo "#define FLARQ_VERSION_MINOR 3" >>confdefs.h $as_echo "#define FLARQ_VERSION_PATCH \".4\"" >>confdefs.h $as_echo "#define FLDIGI_VERSION \"3.21.80\"" >>confdefs.h $as_echo "#define FLARQ_VERSION \"4.3.4\"" >>confdefs.h AC_CONFIG_ARGS=$ac_configure_args ac_aux_dir= for ac_dir in build-aux "$srcdir"/build-aux; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # define build, build_cpu, build_vendor, build_os # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac # define host, host_cpu, host_vendor, host_os { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # define target, target_cpu, target_vendor, target_os { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- am__api_version='1.11' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='fldigi' VERSION='3.21.80' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE ac_config_headers="$ac_config_headers src/config.h" FLDIGI_AUTHORS="Dave Freese, Stelios Bounanos, Leigh Klotz, Remi Chateauneu, and others" FLARQ_AUTHORS="Dave Freese" PACKAGE_HOME="http://www.w1hkj.com/Fldigi.html" PACKAGE_DL="http://www.w1hkj.com/download.html" PACKAGE_PROJ="http://developer.berlios.de/project/showfiles.php?group_id=9149" PACKAGE_NEWBUG="https://fedorahosted.org/fldigi/newticket" PACKAGE_DOCS="http://www.w1hkj.com/FldigiHelp/index.html" PACKAGE_GUIDE="http://www.w1hkj.com/beginners.html" FLARQ_DOCS="http://www.w1hkj.com/FlarqHelpFiles/flarq.html" cat >>confdefs.h <<_ACEOF #define FLDIGI_AUTHORS "$FLDIGI_AUTHORS" _ACEOF cat >>confdefs.h <<_ACEOF #define FLARQ_AUTHORS "$FLARQ_AUTHORS" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_HOME "$PACKAGE_HOME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_DL "$PACKAGE_DL" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_PROJ "$PACKAGE_PROJ" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_NEWBUG "$PACKAGE_NEWBUG" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_DOCS "$PACKAGE_DOCS" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_GUIDE "$PACKAGE_GUIDE" _ACEOF cat >>confdefs.h <<_ACEOF #define FLARQ_DOCS "$FLARQ_DOCS" _ACEOF FLDIGI_AUTHORS=$FLDIGI_AUTHORS FLARQ_AUTHORS=$FLARQ_AUTHORS PACKAGE_HOME=$PACKAGE_HOME PACKAGE_DL=$PACKAGE_DL PACKAGE_PROJ=$PACKAGE_PROJ PACKAGE_NEWBUG=$PACKAGE_NEWBUG PACKAGE_DOCS=$PACKAGE_DOCS PACKAGE_GUIDE=$PACKAGE_GUIDE FLARQ_DOCS=$FLARQ_DOCS # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi for ac_header in arpa/inet.h execinfo.h fcntl.h limits.h memory.h netdb.h netinet/in.h regex.h stdint.h stdlib.h string.h strings.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h sys/utsname.h termios.h unistd.h values.h linux/ppdev.h dev/ppbus/ppi.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "16" "ac_cv_c_int16_t" case $ac_cv_c_int16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int16_t $ac_cv_c_int16_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t" case $ac_cv_c_int32_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int32_t $ac_cv_c_int32_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t" case $ac_cv_c_int64_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int64_t $ac_cv_c_int64_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "8" "ac_cv_c_int8_t" case $ac_cv_c_int8_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int8_t $ac_cv_c_int8_t _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 $as_echo_n "checking for C/C++ restrict keyword... " >&6; } if ${ac_cv_c_restrict+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_restrict=no # The order here caters to the fact that C++ does not require restrict. for ac_kw in __restrict __restrict__ _Restrict restrict; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int * int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int main () { int s[1]; int * $ac_kw t = s; t[0] = 0; return foo(t) ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_restrict=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_restrict" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 $as_echo "$ac_cv_c_restrict" >&6; } case $ac_cv_c_restrict in restrict) ;; no) $as_echo "#define restrict /**/" >>confdefs.h ;; *) cat >>confdefs.h <<_ACEOF #define restrict $ac_cv_c_restrict _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t" case $ac_cv_c_uint16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define uint16_t $ac_cv_c_uint16_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) $as_echo "#define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint32_t $ac_cv_c_uint32_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) $as_echo "#define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint64_t $ac_cv_c_uint64_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t" case $ac_cv_c_uint8_t in #( no|yes) ;; #( *) $as_echo "#define _UINT8_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint8_t $ac_cv_c_uint8_t _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 $as_echo_n "checking for working volatile... " >&6; } if ${ac_cv_c_volatile+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { volatile int x; int * volatile y = (int *) 0; return !x && !y; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_volatile=yes else ac_cv_c_volatile=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 $as_echo "$ac_cv_c_volatile" >&6; } if test $ac_cv_c_volatile = no; then $as_echo "#define volatile /**/" >>confdefs.h fi # Checks for library functions. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5 $as_echo_n "checking whether closedir returns void... " >&6; } if ${ac_cv_func_closedir_void+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_closedir_void=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include <$ac_header_dirent> #ifndef __cplusplus int closedir (); #endif int main () { return closedir (opendir (".")) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_closedir_void=no else ac_cv_func_closedir_void=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5 $as_echo "$ac_cv_func_closedir_void" >&6; } if test $ac_cv_func_closedir_void = yes; then $as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5 $as_echo_n "checking for error_at_line... " >&6; } if ${ac_cv_lib_error_at_line+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { error_at_line (0, 0, "", 0, "an error occurred"); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_error_at_line=yes else ac_cv_lib_error_at_line=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5 $as_echo "$ac_cv_lib_error_at_line" >&6; } if test $ac_cv_lib_error_at_line = no; then case " $LIBOBJS " in *" error.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS error.$ac_objext" ;; esac fi if test $ac_cv_c_compiler_gnu = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 $as_echo_n "checking whether $CC needs -traditional... " >&6; } if ${ac_cv_prog_gcc_traditional+:} false; then : $as_echo_n "(cached) " >&6 else ac_pattern="Autoconf.*'x'" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 $as_echo "$ac_cv_prog_gcc_traditional" >&6; } if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi for ac_header in sys/select.h sys/socket.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 $as_echo_n "checking types of arguments for select... " >&6; } if ${ac_cv_func_select_args+:} false; then : $as_echo_n "(cached) " >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : "${ac_cv_func_select_args=int,int *,struct timeval *}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 $as_echo "$ac_cv_func_select_args" >&6; } ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "#define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strtod" >&5 $as_echo_n "checking for working strtod... " >&6; } if ${ac_cv_func_strtod+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_strtod=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifndef strtod double strtod (); #endif int main() { { /* Some versions of Linux strtod mis-parse strings with leading '+'. */ char *string = " +69"; char *term; double value; value = strtod (string, &term); if (value != 69 || term != (string + 4)) return 1; } { /* Under Solaris 2.4, strtod returns the wrong value for the terminating character under some conditions. */ char *string = "NaN"; char *term; strtod (string, &term); if (term != string && *(term - 1) == 0) return 1; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_strtod=yes else ac_cv_func_strtod=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strtod" >&5 $as_echo "$ac_cv_func_strtod" >&6; } if test $ac_cv_func_strtod = no; then case " $LIBOBJS " in *" strtod.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtod.$ac_objext" ;; esac ac_fn_c_check_func "$LINENO" "pow" "ac_cv_func_pow" if test "x$ac_cv_func_pow" = xyes; then : fi if test $ac_cv_func_pow = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5 $as_echo_n "checking for pow in -lm... " >&6; } if ${ac_cv_lib_m_pow+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pow (); int main () { return pow (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_pow=yes else ac_cv_lib_m_pow=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_pow" >&5 $as_echo "$ac_cv_lib_m_pow" >&6; } if test "x$ac_cv_lib_m_pow" = xyes; then : POW_LIB=-lm else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot find library containing definition of pow" >&5 $as_echo "$as_me: WARNING: cannot find library containing definition of pow" >&2;} fi fi fi for ac_func in getaddrinfo gethostbyname hstrerror gmtime_r localtime_r memmove memset mkdir select setenv snprintf socket socketpair strcasecmp strcasestr strchr strdup strerror strlcpy strncasecmp strrchr strstr strtol uname unsetenv vsnprintf do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Check for O_CLOEXEC { $as_echo "$as_me:${as_lineno-$LINENO}: checking for O_CLOEXEC" >&5 $as_echo_n "checking for O_CLOEXEC... " >&6; } if ${ac_cv_o_cloexec+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -I${srcdir}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int flags= O_CLOEXEC ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_o_cloexec="yes" else ac_cv_o_cloexec="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_o_cloexec" >&5 $as_echo "$ac_cv_o_cloexec" >&6; } if test "x$ac_cv_o_cloexec" = "xyes"; then : $as_echo "#define HAVE_O_CLOEXEC 1" >>confdefs.h fi ### Internationalization { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } GETTEXT_MACRO_VERSION=0.17 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f messages.po case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$localedir" || localedir='${datadir}/locale' test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= ac_config_commands="$ac_config_commands po-directories" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 $as_echo_n "checking for ld used by GCC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi acl_libdirstem=lib searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIBICONV_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyCurrent=yes else gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if eval \${$gt_func_gnugettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libc=yes" else eval "$gt_func_gnugettext_libc=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$gt_func_gnugettext_libc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes else am_cv_func_iconv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi fi LIBINTL= LTLIBINTL= INCINTL= LIBINTL_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIBINTL_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if eval \${$gt_func_gnugettext_libintl+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libintl=yes" else eval "$gt_func_gnugettext_libintl=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi eval ac_res=\$$gt_func_gnugettext_libintl { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 $as_echo_n "checking whether to use NLS... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 $as_echo_n "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 $as_echo "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi INTLLIBS="$LIBINTL" if test "x$USE_NLS" = "xyes"; then USE_NLS_TRUE= USE_NLS_FALSE='#' else USE_NLS_TRUE='#' USE_NLS_FALSE= fi ### Programs # Determine if fldigi and flarq have been requested and can be built # Set ac_cv_want_fldigi and ac_cv_want_flarq to yes/no # Set WANT_FLDIGI and WANT_FLARQ Makefile conditionals # Check whether --enable-fldigi was given. if test "${enable_fldigi+set}" = set; then : enableval=$enable_fldigi; case "${enableval}" in yes|no) ac_cv_want_fldigi="${enableval}" ;; *) as_fn_error $? "bad value ${enableval} for --disable-fldigi" "$LINENO" 5 ;; esac else ac_cv_want_fldigi=yes fi if test "x$ac_cv_want_fldigi" = "xyes"; then WANT_FLDIGI_TRUE= WANT_FLDIGI_FALSE='#' else WANT_FLDIGI_TRUE='#' WANT_FLDIGI_FALSE= fi # Check whether --enable-flarq was given. if test "${enable_flarq+set}" = set; then : enableval=$enable_flarq; case "${enableval}" in yes|no) ac_cv_want_flarq="${enableval}" ;; *) as_fn_error $? "bad value ${enableval} for --disable-flarq" "$LINENO" 5 ;; esac else ac_cv_want_flarq=yes fi if test "x$ac_cv_want_flarq" = "xyes"; then WANT_FLARQ_TRUE= WANT_FLARQ_FALSE='#' else WANT_FLARQ_TRUE='#' WANT_FLARQ_FALSE= fi ###### OS support ### OSX # Set ac_cv_mac_universal to yes/no # Set DARWIN Makefile conditional # Substitute MAC_UNIVERSAL_CFLAGS and MAC_UNIVERSAL_LDFLAGS in Makefile case "$target_os" in darwin*) target_darwin="yes" ;; *) target_darwin="no" ;; esac if test "$target_darwin" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: using bundled GNU regex on $target_os" >&5 $as_echo "$as_me: using bundled GNU regex on $target_os" >&6;} # pretend that the regex.h check failed so that we use the bundled regex code ac_cv_header_regex_h=no $as_echo "#define HAVE_REGEX_H 0" >>confdefs.h fi # Check whether --enable-mac-universal was given. if test "${enable_mac_universal+set}" = set; then : enableval=$enable_mac_universal; case "${enableval}" in yes|no) ac_cv_mac_universal="${enableval}" ;; *) as_fn_error $? "bad value \"${enableval}\" for --enable-mac-universal" "$LINENO" 5 ;; esac else ac_cv_mac_universal=no fi if test "x$target_darwin" = "xyes" && test "x$ac_cv_mac_universal" = "xyes"; then mac_minversion="-mmacosx-version-min=10.4" case "$target_os" in darwin8*) mac_arches="-arch i386 -arch ppc" mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.4u.sdk" ;; darwin9*) mac_arches="-arch i386 -arch ppc -arch x86_64 -arch ppc64" mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.5.sdk" ;; *) mac_arches="" mac_sysroot="" ;; esac MAC_UNIVERSAL_CFLAGS="$mac_arches $mac_sysroot $mac_minversion" MAC_UNIVERSAL_LDFLAGS="$mac_arches" fi if test "x$target_darwin" = "xyes"; then DARWIN_TRUE= DARWIN_FALSE='#' else DARWIN_TRUE='#' DARWIN_FALSE= fi ### win32 # Set WIN32 Makefile conditional # Set HAVE_WINDRES Makefile conditional # Substitute WINDRES in Makefile case "$target_os" in *mingw*) target_win32="yes" target_mingw32="yes" ;; *cygwin*|*win32*|*w32*) target_win32="yes" ;; *) target_win32="no" ;; esac if test "x$target_win32" = "xyes"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$WINDRES"; then ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_WINDRES="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi WINDRES=$ac_cv_prog_WINDRES if test -n "$WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5 $as_echo "$WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$WINDRES" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The windres utility could not be found" >&5 $as_echo "$as_me: WARNING: The windres utility could not be found" >&2;} fi $as_echo "#define __WOE32__ 1" >>confdefs.h $as_echo "#define __MINGW32__ 1" >>confdefs.h $as_echo "#define _WINDOWS 1" >>confdefs.h fi if test "x$target_mingw32" = "xyes"; then # Extract the first word of "makensis", so it can be a program name with args. set dummy makensis; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MAKENSIS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MAKENSIS"; then ac_cv_prog_MAKENSIS="$MAKENSIS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_MAKENSIS="makensis" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MAKENSIS=$ac_cv_prog_MAKENSIS if test -n "$MAKENSIS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKENSIS" >&5 $as_echo "$MAKENSIS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$WINDRES" != "x"; then HAVE_WINDRES_TRUE= HAVE_WINDRES_FALSE='#' else HAVE_WINDRES_TRUE='#' HAVE_WINDRES_FALSE= fi if test "x$MAKENSIS" != "x"; then HAVE_NSIS_TRUE= HAVE_NSIS_FALSE='#' else HAVE_NSIS_TRUE='#' HAVE_NSIS_FALSE= fi if test "x$target_win32" = "xyes"; then WIN32_TRUE= WIN32_FALSE='#' else WIN32_TRUE='#' WIN32_FALSE= fi if test "x$target_mingw32" = "xyes"; then MINGW32_TRUE= MINGW32_FALSE='#' else MINGW32_TRUE='#' MINGW32_FALSE= fi # Check whether --with-ptw32 was given. if test "${with_ptw32+set}" = set; then : withval=$with_ptw32; ac_cv_want_ptw32="$withval" else ac_cv_want_ptw32=no fi if test "x$ac_cv_want_ptw32" != "xno"; then if test "x$ac_cv_want_ptw32" != "xyes"; then # set -I and -L switches ptw32_default_cflags="-I${ac_cv_want_ptw32}/include" ptw32_default_libs="-L${ac_cv_want_ptw32}/lib" fi ptw32_default_libs="$ptw32_default_libs -lpthreadGC2 -lws2_32" # don't override the user-specified vars PTW32_CFLAGS="${PTW32_CFLAGS:-$ptw32_default_cflags}" PTW32_LIBS="${PTW32_LIBS:-$ptw32_default_libs}" ac_cv_want_ptw32="yes" fi ### Non-POSIX compatibility (i.e. mingw32) # Sets various Makefile conditionals; see m4/np-compat.m4 if test "x$target_mingw32" = "xyes"; then # Newer versions of mingw32 comes with pthread. sem_libs="pthreadGC2 pthread" # pretend that the regex.h check failed so that we use the bundled regex code ac_cv_header_regex_h=no $as_echo "#define HAVE_REGEX_H 0" >>confdefs.h else sem_libs="pthread rt" fi if test "x$ac_cv_header_regex_h" != "xyes"; then COMPAT_REGEX_TRUE= COMPAT_REGEX_FALSE='#' else COMPAT_REGEX_TRUE='#' COMPAT_REGEX_FALSE= fi other_libs="" if test "x$ac_cv_want_ptw32" = "xyes"; then CFLAGS_saved="$CFLAGS" LDFLAGS_saved="$LDFLAGS" EXTRA_LIBS_saved="$EXTRA_LIBS" CFLAGS="$CFLAGS $PTW32_CFLAGS" LDFLAGS="$LDFLAGS $PTW32_LIBS" other_libs=-lws2_32 fi LIBS_search_libs_save="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 $as_echo_n "checking for library containing dlopen... " >&6; } if ${ac_cv_search_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF for ac_lib in '' dl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $other_libs $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_dlopen=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_dlopen+:} false; then : break fi done if ${ac_cv_search_dlopen+:} false; then : else ac_cv_search_dlopen=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 $as_echo "$ac_cv_search_dlopen" >&6; } ac_res=$ac_cv_search_dlopen if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ac_cv_have_func_dlopen=1 else ac_cv_have_func_dlopen=0 fi if test "x$LIBS" != "x"; then echo "$EXTRA_LIBS" | grep -q -e "$LIBS" || EXTRA_LIBS="$EXTRA_LIBS $LIBS" fi cat >>confdefs.h <<_ACEOF #define HAVE_DLOPEN $ac_cv_have_func_dlopen _ACEOF LIBS="$LIBS_search_libs_save" LIBS_search_libs_save="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 $as_echo_n "checking for library containing clock_gettime... " >&6; } if ${ac_cv_search_clock_gettime+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char clock_gettime (); int main () { return clock_gettime (); ; return 0; } _ACEOF for ac_lib in '' rt; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $other_libs $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_clock_gettime=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_clock_gettime+:} false; then : break fi done if ${ac_cv_search_clock_gettime+:} false; then : else ac_cv_search_clock_gettime=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 $as_echo "$ac_cv_search_clock_gettime" >&6; } ac_res=$ac_cv_search_clock_gettime if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ac_cv_have_func_clock_gettime=1 else ac_cv_have_func_clock_gettime=0 fi if test "x$LIBS" != "x"; then echo "$EXTRA_LIBS" | grep -q -e "$LIBS" || EXTRA_LIBS="$EXTRA_LIBS $LIBS" fi cat >>confdefs.h <<_ACEOF #define HAVE_CLOCK_GETTIME $ac_cv_have_func_clock_gettime _ACEOF LIBS="$LIBS_search_libs_save" LIBS_search_libs_save="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sem_unlink" >&5 $as_echo_n "checking for library containing sem_unlink... " >&6; } if ${ac_cv_search_sem_unlink+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sem_unlink (); int main () { return sem_unlink (); ; return 0; } _ACEOF for ac_lib in '' $sem_libs; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $other_libs $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_sem_unlink=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_sem_unlink+:} false; then : break fi done if ${ac_cv_search_sem_unlink+:} false; then : else ac_cv_search_sem_unlink=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sem_unlink" >&5 $as_echo "$ac_cv_search_sem_unlink" >&6; } ac_res=$ac_cv_search_sem_unlink if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ac_cv_have_func_sem_unlink=1 else ac_cv_have_func_sem_unlink=0 fi if test "x$LIBS" != "x"; then echo "$EXTRA_LIBS" | grep -q -e "$LIBS" || EXTRA_LIBS="$EXTRA_LIBS $LIBS" fi cat >>confdefs.h <<_ACEOF #define HAVE_SEM_UNLINK $ac_cv_have_func_sem_unlink _ACEOF LIBS="$LIBS_search_libs_save" LIBS_search_libs_save="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sem_timedwait" >&5 $as_echo_n "checking for library containing sem_timedwait... " >&6; } if ${ac_cv_search_sem_timedwait+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sem_timedwait (); int main () { return sem_timedwait (); ; return 0; } _ACEOF for ac_lib in '' $sem_libs; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $other_libs $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_sem_timedwait=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_sem_timedwait+:} false; then : break fi done if ${ac_cv_search_sem_timedwait+:} false; then : else ac_cv_search_sem_timedwait=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sem_timedwait" >&5 $as_echo "$ac_cv_search_sem_timedwait" >&6; } ac_res=$ac_cv_search_sem_timedwait if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ac_cv_have_func_sem_timedwait=1 else ac_cv_have_func_sem_timedwait=0 fi if test "x$LIBS" != "x"; then echo "$EXTRA_LIBS" | grep -q -e "$LIBS" || EXTRA_LIBS="$EXTRA_LIBS $LIBS" fi cat >>confdefs.h <<_ACEOF #define HAVE_SEM_TIMEDWAIT $ac_cv_have_func_sem_timedwait _ACEOF LIBS="$LIBS_search_libs_save" if test "x$ac_cv_want_ptw32" = "xyes"; then CFLAGS="$CFLAGS_saved" LDFLAGS="$LDFLAGS_saved" EXTRA_LIBS="$EXTRA_LIBS_saved" fi if test "x$ac_cv_func_strcasestr" != "xyes"; then COMPAT_STRCASESTR_TRUE= COMPAT_STRCASESTR_FALSE='#' else COMPAT_STRCASESTR_TRUE='#' COMPAT_STRCASESTR_FALSE= fi ### static flag # Set ac_cv_static to yes/no # Substitute RTLIB in Makefile # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; case "${enableval}" in yes|no) ac_cv_static="${enableval}" ;; *) as_fn_error $? "bad value ${enableval} for --enable-static" "$LINENO" 5 ;; esac else ac_cv_static=no fi ### optimizations # Set ac_cv_opt to arg # Substitute OPT_FLAGS in Makefile # Check whether --enable-optimizations was given. if test "${enable_optimizations+set}" = set; then : enableval=$enable_optimizations; case "${enableval}" in none|sse|sse2|sse3|native) ac_cv_opt="${enableval}" ;; *) as_fn_error $? "bad value ${enableval} for --enable-optimizations" "$LINENO" 5 ;; esac else ac_cv_opt=none fi OPT_CFLAGS="-O2 -ffast-math -finline-functions" case "$ac_cv_opt" in sse) OPT_CFLAGS="$OPT_CFLAGS -msse -mfpmath=sse" ;; sse2) OPT_CFLAGS="$OPT_CFLAGS -msse2 -mfpmath=sse" ;; sse3) OPT_CFLAGS="$OPT_CFLAGS -msse3 -mfpmath=sse" ;; native) OPT_CFLAGS="$OPT_CFLAGS -march=native -mfpmath=sse" ;; none) ;; esac ### debug flag # Set ac_cv_debug to yes/no # Override CXXFLAGS # Set ENABLE_DEBUG Makefile conditional # Substitute RDYNAMIC in Makefile # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes|no) ac_cv_debug="${enableval}" ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else ac_cv_debug=no fi # Check whether --with-bfd was given. if test "${with_bfd+set}" = set; then : withval=$with_bfd; ac_cv_want_bfd="$withval" else ac_cv_want_bfd=yes fi if test "x$ac_cv_debug" = "xyes" && test "x$ac_cv_want_bfd" != "xno" && \ test "x$target_mingw32" = "xyes"; then if test "x$ac_cv_want_bfd" != "xyes"; then # set -I and -L switches bfd_default_cflags="-I${ac_cv_want_bfd}/include" bfd_default_libs="-L${ac_cv_want_bfd}/lib" fi # don't override the user-specified vars BFD_CFLAGS="${BFD_CFLAGS:-$bfd_default_cflags}" BFD_LIBS="${BFD_LIBS:-$bfd_default_libs}" ac_cv_want_bfd="yes" CPPFLAGS_saved="$CPPFLAGS" LDFLAGS_saved="$LDFLAGS" CPPFLAGS="$CPPFLAGS $BFD_CFLAGS" LDFLAGS="$LDFLAGS $BFD_LIBS" ac_fn_c_check_header_mongrel "$LINENO" "bfd.h" "ac_cv_header_bfd_h" "$ac_includes_default" if test "x$ac_cv_header_bfd_h" = xyes; then : ac_cv_have_bfd="yes" else ac_cv_have_bfd="no" fi if test "x$ac_cv_have_bfd" = "xyes"; then bfd_other_libs="-liberty -lpsapi -limagehlp" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bfd_set_format in -lbfd" >&5 $as_echo_n "checking for bfd_set_format in -lbfd... " >&6; } if ${ac_cv_lib_bfd_bfd_set_format+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbfd $bfd_other_libs $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bfd_set_format (); int main () { return bfd_set_format (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bfd_bfd_set_format=yes else ac_cv_lib_bfd_bfd_set_format=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bfd_bfd_set_format" >&5 $as_echo "$ac_cv_lib_bfd_bfd_set_format" >&6; } if test "x$ac_cv_lib_bfd_bfd_set_format" = xyes; then : ac_cv_have_bfd="yes" else ac_cv_have_bfd="no" fi fi CPPFLAGS="$CPPFLAGS_saved" LDFLAGS="$LDFLAGS_saved" if test "x$ac_cv_have_bfd" = "xyes"; then BFD_LIBS="$BFD_LIBS -lbfd $bfd_other_libs" fi fi if test "x$ac_cv_debug" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for debug info flag" >&5 $as_echo_n "checking for debug info flag... " >&6; } if test "x$GXX" = "xyes"; then if test "x$target_mingw32" = "xyes"; then gflag="-gstabs" else gflag="-ggdb3" fi else gflag="-g" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gflag" >&5 $as_echo "$gflag" >&6; } DEBUG_CFLAGS="-O0 -fno-inline-functions $gflag -Wall" LDFLAGS_saved="$LDFLAGS" LDFLAGS="$LDFLAGS -rdynamic" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -rdynamic" >&5 $as_echo_n "checking whether $CC supports -rdynamic... " >&6; } # don't try this on win32; it succeeds but emits a warning at link time if test "x$target_win32" != "xyes"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_rdynamic=yes else ac_cv_rdynamic=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext else ac_cv_rdynamic=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_rdynamic" >&5 $as_echo "$ac_cv_rdynamic" >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports -rdynamic" >&5 $as_echo_n "checking whether $CXX supports -rdynamic... " >&6; } if test "x$target_win32" != "xyes"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_rdynamic=yes else ac_cv_rdynamic=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext else ac_cv_rdynamic=no fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_rdynamic" >&5 $as_echo "$ac_cv_rdynamic" >&6; } LDFLAGS="$LDFLAGS_saved" if test "x$ac_cv_rdynamic" = "xyes"; then RDYNAMIC=-rdynamic fi CXXFLAGS="" CFLAGS="$CXXFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: debugging enabled; overriding CXXFLAGS" >&5 $as_echo "$as_me: debugging enabled; overriding CXXFLAGS" >&6;} if test "x$target_darwin" = "xyes"; then ac_cv_compat_stack=yes $as_echo "#define HAVE_DBG_STACK 1" >>confdefs.h elif test "x$target_mingw32" = "xyes" && test "x$ac_cv_have_bfd" = "xyes"; then ac_cv_compat_stack=yes $as_echo "#define HAVE_DBG_STACK 1" >>confdefs.h else ac_cv_compat_stack=no $as_echo "#define HAVE_DBG_STACK 0" >>confdefs.h fi fi if test "x$ac_cv_debug" = "xyes"; then ENABLE_DEBUG_TRUE= ENABLE_DEBUG_FALSE='#' else ENABLE_DEBUG_TRUE='#' ENABLE_DEBUG_FALSE= fi if test "x$ac_cv_compat_stack" = "xyes"; then COMPAT_STACK_TRUE= COMPAT_STACK_FALSE='#' else COMPAT_STACK_TRUE='#' COMPAT_STACK_FALSE= fi ### benchmark mode # Set ac_cv_benchmark to yes/no # Define BENCHMARK_MODE in config.h # Set ENABLE_BENCHMARK Makefile conditional # Check whether --enable-benchmark was given. if test "${enable_benchmark+set}" = set; then : enableval=$enable_benchmark; case "${enableval}" in yes|no) ac_cv_benchmark="${enableval}" ;; *) as_fn_error $? "bad value ${enableval} for --enable-benchmark" "$LINENO" 5 ;; esac else ac_cv_benchmark=no fi if test "x$ac_cv_benchmark" = "xyes"; then $as_echo "#define BENCHMARK_MODE 1" >>confdefs.h else $as_echo "#define BENCHMARK_MODE 0" >>confdefs.h fi if test "x$ac_cv_benchmark" = "xyes"; then ENABLE_BENCHMARK_TRUE= ENABLE_BENCHMARK_FALSE='#' else ENABLE_BENCHMARK_TRUE='#' ENABLE_BENCHMARK_FALSE= fi ### TLS flag # Set ac_cv_tls to yes/no # Define USE_TLS in config.h # Check whether --enable-tls was given. if test "${enable_tls+set}" = set; then : enableval=$enable_tls; case "${enableval}" in yes|no) ac_cv_want_tls="${enableval}" ;; *) as_fn_error $? "bad value \"${enableval}\" for --enable-tls" "$LINENO" 5 ;; esac else ac_cv_want_tls=check fi if test "x$target_mingw32" = "xyes"; then ac_cv_want_tls=no fi if test "x$ac_cv_want_tls" = "xno"; then $as_echo "#define USE_TLS 0" >>confdefs.h ac_cv_tls=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TLS support" >&5 $as_echo_n "checking for TLS support... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 $as_echo "disabled" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TLS support" >&5 $as_echo_n "checking for TLS support... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ __thread int a; int b; int main() { return a = b; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_tls=yes else ac_cv_tls=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ __thread int a; int b; int main() { return a = b; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : chktls_save_CXXFLAGS="$CXXFLAGS" thread_CXXFLAGS=failed for flag in "" "-pthread" "-lpthread"; do CXXFLAGS="$flag $chktls_save_CXXFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include void *g(void *d) { return NULL; } int main () { pthread_t t; pthread_create(&t, NULL, g, NULL); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : thread_CXXFLAGS="$flag" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "x$thread_CXXFLAGS" != "xfailed"; then break fi done CXXFLAGS="$chktls_save_CXXFLAGS" if test "x$thread_CXXFLAGS" != "xfailed"; then CXXFLAGS="$thread_CXXFLAGS $chktls_save_CXXFLAGS" if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include __thread int a; static int *a_in_other_thread; static void *thread_func(void *arg) { a_in_other_thread = &a; return (void *)0; } int main () { pthread_t thread; void *thread_retval; int *a_in_main_thread; if (pthread_create(&thread, (pthread_attr_t *)0, thread_func, (void *)0)) return 0; a_in_main_thread = &a; if (pthread_join (thread, &thread_retval)) return 0; return (a_in_other_thread == a_in_main_thread); ; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : ac_cv_tls=yes else ac_cv_tls=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CXXFLAGS="$chktls_save_CXXFLAGS" fi else ac_cv_tls=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5 $as_echo "$ac_cv_tls" >&6; } if test "x$ac_cv_want_tls" = "xcheck"; then if test "x$ac_cv_tls" = "xyes"; then $as_echo "#define USE_TLS 1" >>confdefs.h else $as_echo "#define USE_TLS 0" >>confdefs.h fi else # $ac_cv_want_tls is yes if test "x$ac_cv_tls" = "xno"; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--enable-tls was given, but TLS is not supported See \`config.log' for more details" "$LINENO" 5; } else $as_echo "#define USE_TLS 1" >>confdefs.h fi fi fi ### std::bind or alternatives # Set ac_cv_std_bind or ac_cv_std_tr1_bind to yes/no # Define HAVE_STD_BIND or HAVE_STD_TR1_BIND in config.h # Substitute BOOST_CPPFLAGS and BOOST_LDFLAGS in Makefile # if falling back to Boost ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for std::bind in " >&5 $as_echo_n "checking for std::bind in ... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include void f(void) { } int main () { std::bind(f)(); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_std_bind=yes else ac_cv_std_bind=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_std_bind" >&5 $as_echo "$ac_cv_std_bind" >&6; } if test "x$ac_cv_std_bind" = "xyes"; then $as_echo "#define HAVE_STD_BIND 1" >>confdefs.h else $as_echo "#define HAVE_STD_BIND 0" >>confdefs.h fi if test "x$ac_cv_std_bind" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for std::tr1::bind in " >&5 $as_echo_n "checking for std::tr1::bind in ... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include void f(void) { } int main () { std::tr1::bind(f)(); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_std_tr1_bind=yes else ac_cv_std_tr1_bind=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_std_tr1_bind" >&5 $as_echo "$ac_cv_std_tr1_bind" >&6; } if test "x$ac_cv_std_tr1_bind" = "xyes"; then $as_echo "#define HAVE_STD_TR1_BIND 1" >>confdefs.h else $as_echo "#define HAVE_STD_TR1_BIND 0" >>confdefs.h fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "x$ac_cv_std_bind" = "xno" && test "x$ac_cv_std_tr1_bind" = "xno"; then as_fn_error $? "Could not find std::bind or std::tr1::bind" "$LINENO" 5 fi ### FLTK # Substitute FLTK_CFLAGS and FLTK_LIBS in Makefile # Set FLUID variable # Set HAVE_FLUID Makefile conditional if test "x$FLTK_CFLAGS" = "x" && test "x$FLTK_LIBS" = "x"; then if test "x$FLTK_CONFIG" = "x"; then # Extract the first word of "fltk-config", so it can be a program name with args. set dummy fltk-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_FLTK_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $FLTK_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_FLTK_CONFIG="$FLTK_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_FLTK_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_FLTK_CONFIG" && ac_cv_path_FLTK_CONFIG="no" ;; esac fi FLTK_CONFIG=$ac_cv_path_FLTK_CONFIG if test -n "$FLTK_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLTK_CONFIG" >&5 $as_echo "$FLTK_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fltk-config" >&5 $as_echo_n "checking for fltk-config... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLTK_CONFIG" >&5 $as_echo "$FLTK_CONFIG" >&6; } fi if test "$FLTK_CONFIG" = "no"; then as_fn_error $? " *** The fltk-config script could not be found. Please install the development *** headers and libraries for FLTK 1.1.x, or set PATH to the directory that *** contains fltk-config. " "$LINENO" 5 fi HAVE_FLTK_API_VERSION=no FLTK_API_VERSION="`$FLTK_CONFIG --version`" if test $? -ne 0; then as_fn_error $? "$FLTK_CONFIG failed" "$LINENO" 5 fi if test -n "$(expr $FLTK_API_VERSION : '1\.13')"; then HAVE_FLTK_API_VERSION=yes fi FLDIGI_FLTK_API_MAJOR=${FLTK_API_VERSION%%.*} FLDIGI_FLTK_API_MINOR=${FLTK_API_VERSION#*.}; FLDIGI_FLTK_API_MINOR=${FLDIGI_FLTK_API_MINOR%%.*} FLDIGI_FLTK_API_PATCH=${FLTK_API_VERSION#*.}; FLDIGI_FLTK_API_PATCH=${FLDIGI_FLTK_API_PATCH#*.}; if test "${HAVE_FLTK_API_VERSION}" = "no"; then as_fn_error $? " *** The version of FLTK found on your system provides API version $FLTK_API_VERSION. *** To build $PACKAGE you need a FLTK version that provides API 1.1, 1.2 or 1.3. " "$LINENO" 5 fi if test $FLDIGI_FLTK_API_MINOR -gt 3; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $PACKAGE_TARNAME may not work with FLTK $FLTK_API_VERSION" >&5 $as_echo "$as_me: WARNING: $PACKAGE_TARNAME may not work with FLTK $FLTK_API_VERSION" >&2;} fi FLTK_CFLAGS=`$FLTK_CONFIG --cxxflags` if test "x$ac_cv_static" != "xyes"; then FLTK_LIBS=`$FLTK_CONFIG --ldflags --use-images` else FLTK_LIBS=`$FLTK_CONFIG --ldstaticflags --use-images` fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not checking for FLTK" >&5 $as_echo "$as_me: not checking for FLTK" >&6;} fi cat >>confdefs.h <<_ACEOF #define FLTK_BUILD_VERSION "`$FLTK_CONFIG --version`" _ACEOF cat >>confdefs.h <<_ACEOF #define FLDIGI_FLTK_API_MAJOR $FLDIGI_FLTK_API_MAJOR _ACEOF cat >>confdefs.h <<_ACEOF #define FLDIGI_FLTK_API_MINOR $FLDIGI_FLTK_API_MINOR _ACEOF cat >>confdefs.h <<_ACEOF #define FLDIGI_FLTK_API_PATCH $FLDIGI_FLTK_API_PATCH _ACEOF # Extract the first word of "fluid", so it can be a program name with args. set dummy fluid; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_FLUID+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$FLUID"; then ac_cv_prog_FLUID="$FLUID" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_FLUID="fluid" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi FLUID=$ac_cv_prog_FLUID if test -n "$FLUID"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLUID" >&5 $as_echo "$FLUID" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -n "$FLUID"; then HAVE_FLUID_TRUE= HAVE_FLUID_FALSE='#' else HAVE_FLUID_TRUE='#' HAVE_FLUID_FALSE= fi ### OSS # Set ac_cv_oss to yes/no # Define USE_OSS in config.h if test "x$target_darwin" = "xno" && test "x$target_win32" = "xno"; then # Check whether --enable-oss was given. if test "${enable_oss+set}" = set; then : enableval=$enable_oss; case "${enableval}" in yes|no) ac_cv_want_oss="${enableval}" ;; *) as_fn_error $? "bad value \"${enableval}\" for --disable-oss" "$LINENO" 5 ;; esac else ac_cv_want_oss=check fi else { $as_echo "$as_me:${as_lineno-$LINENO}: disabling OSS driver on $target_os" >&5 $as_echo "$as_me: disabling OSS driver on $target_os" >&6;} ac_cv_want_oss=no fi ac_cv_oss=no if test "x$ac_cv_want_oss" = "xno"; then $as_echo "#define USE_OSS 0" >>confdefs.h else ac_fn_c_check_header_mongrel "$LINENO" "sys/soundcard.h" "ac_cv_header_sys_soundcard_h" "$ac_includes_default" if test "x$ac_cv_header_sys_soundcard_h" = xyes; then : ac_cv_oss=yes else ac_fn_c_check_header_mongrel "$LINENO" "machine/soundcard.h" "ac_cv_header_machine_soundcard_h" "$ac_includes_default" if test "x$ac_cv_header_machine_soundcard_h" = xyes; then : ac_cv_oss=yes else ac_fn_c_check_header_mongrel "$LINENO" "soundcard.h" "ac_cv_header_soundcard_h" "$ac_includes_default" if test "x$ac_cv_header_soundcard_h" = xyes; then : ac_cv_oss=yes fi fi fi if test "x$ac_cv_want_oss" = "xcheck"; then if test "x$ac_cv_oss" = "xyes"; then $as_echo "#define USE_OSS 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: disabling OSS driver" >&5 $as_echo "$as_me: disabling OSS driver" >&6;} $as_echo "#define USE_OSS 0" >>confdefs.h fi else # $ac_cv_want_oss is yes if test "x$ac_cv_oss" = "xno"; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--enable-oss was given, but test for OSS failed See \`config.log' for more details" "$LINENO" 5; } else $as_echo "#define USE_OSS 1" >>confdefs.h fi fi fi ### libpng # Required if $ac_cv_want_fldigi is "yes" # Set ac_cv_png to yes/no (not used) # Define USE_PNG in config.h (as above) # Substitute PNG_CFLAGS and PNG_LIBS in Makefile if test "x$ac_cv_want_fldigi" = "xyes"; then if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi ac_cv_want_png=yes test "x$ac_cv_want_png" = "x" && ac_cv_want_png="check" case "x$ac_cv_want_png" in "xno") ac_cv_png=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG" >&5 $as_echo_n "checking for PNG... " >&6; } if test -n "$PNG_CFLAGS"; then pkg_cv_PNG_CFLAGS="$PNG_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.2.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng >= 1.2.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_CFLAGS=`$PKG_CONFIG --cflags "libpng >= 1.2.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PNG_LIBS"; then pkg_cv_PNG_LIBS="$PNG_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.2.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng >= 1.2.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_LIBS=`$PKG_CONFIG --libs "libpng >= 1.2.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpng >= 1.2.8" 2>&1` else PNG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpng >= 1.2.8" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PNG_PKG_ERRORS" >&5 ac_cv_png=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_png=no else PNG_CFLAGS=$pkg_cv_PNG_CFLAGS PNG_LIBS=$pkg_cv_PNG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_png=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG" >&5 $as_echo_n "checking for PNG... " >&6; } if test -n "$PNG_CFLAGS"; then pkg_cv_PNG_CFLAGS="$PNG_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.2.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng >= 1.2.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_CFLAGS=`$PKG_CONFIG --cflags "libpng >= 1.2.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PNG_LIBS"; then pkg_cv_PNG_LIBS="$PNG_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.2.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng >= 1.2.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_LIBS=`$PKG_CONFIG --libs "libpng >= 1.2.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpng >= 1.2.8" 2>&1` else PNG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpng >= 1.2.8" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PNG_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libpng >= 1.2.8) were not met: $PNG_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables PNG_CFLAGS and PNG_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables PNG_CFLAGS and PNG_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else PNG_CFLAGS=$pkg_cv_PNG_CFLAGS PNG_LIBS=$pkg_cv_PNG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_png=yes ;; esac if test "x$ac_cv_png" = "xyes"; then $as_echo "#define USE_PNG 1" >>confdefs.h pkg_png_version=`$PKG_CONFIG --modversion "libpng >= 1.2.8" 2>/dev/null` else $as_echo "#define USE_PNG 0" >>confdefs.h pkg_png_version="" fi cat >>confdefs.h <<_ACEOF #define PNG_BUILD_VERSION "$pkg_png_version" _ACEOF : fi ### libsamplerate # Required if $ac_cv_want_fldigi is "yes" # Set ac_cv_samplerate to yes/no (not used) # Define USE_SAMPLERATE in config.h (as above) # Substitute SAMPLERATE_CFLAGS and SAMPLERATE_LIBS in Makefile if test "x$ac_cv_want_fldigi" = "xyes"; then ac_cv_want_samplerate=yes test "x$ac_cv_want_samplerate" = "x" && ac_cv_want_samplerate="check" case "x$ac_cv_want_samplerate" in "xno") ac_cv_samplerate=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SAMPLERATE" >&5 $as_echo_n "checking for SAMPLERATE... " >&6; } if test -n "$SAMPLERATE_CFLAGS"; then pkg_cv_SAMPLERATE_CFLAGS="$SAMPLERATE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"samplerate >= 0.1.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "samplerate >= 0.1.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SAMPLERATE_CFLAGS=`$PKG_CONFIG --cflags "samplerate >= 0.1.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$SAMPLERATE_LIBS"; then pkg_cv_SAMPLERATE_LIBS="$SAMPLERATE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"samplerate >= 0.1.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "samplerate >= 0.1.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SAMPLERATE_LIBS=`$PKG_CONFIG --libs "samplerate >= 0.1.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SAMPLERATE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "samplerate >= 0.1.1" 2>&1` else SAMPLERATE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "samplerate >= 0.1.1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$SAMPLERATE_PKG_ERRORS" >&5 ac_cv_samplerate=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_samplerate=no else SAMPLERATE_CFLAGS=$pkg_cv_SAMPLERATE_CFLAGS SAMPLERATE_LIBS=$pkg_cv_SAMPLERATE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_samplerate=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SAMPLERATE" >&5 $as_echo_n "checking for SAMPLERATE... " >&6; } if test -n "$SAMPLERATE_CFLAGS"; then pkg_cv_SAMPLERATE_CFLAGS="$SAMPLERATE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"samplerate >= 0.1.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "samplerate >= 0.1.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SAMPLERATE_CFLAGS=`$PKG_CONFIG --cflags "samplerate >= 0.1.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$SAMPLERATE_LIBS"; then pkg_cv_SAMPLERATE_LIBS="$SAMPLERATE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"samplerate >= 0.1.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "samplerate >= 0.1.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SAMPLERATE_LIBS=`$PKG_CONFIG --libs "samplerate >= 0.1.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SAMPLERATE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "samplerate >= 0.1.1" 2>&1` else SAMPLERATE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "samplerate >= 0.1.1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$SAMPLERATE_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (samplerate >= 0.1.1) were not met: $SAMPLERATE_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables SAMPLERATE_CFLAGS and SAMPLERATE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables SAMPLERATE_CFLAGS and SAMPLERATE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else SAMPLERATE_CFLAGS=$pkg_cv_SAMPLERATE_CFLAGS SAMPLERATE_LIBS=$pkg_cv_SAMPLERATE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_samplerate=yes ;; esac if test "x$ac_cv_samplerate" = "xyes"; then $as_echo "#define USE_SAMPLERATE 1" >>confdefs.h pkg_samplerate_version=`$PKG_CONFIG --modversion "samplerate >= 0.1.1" 2>/dev/null` else $as_echo "#define USE_SAMPLERATE 0" >>confdefs.h pkg_samplerate_version="" fi cat >>confdefs.h <<_ACEOF #define SAMPLERATE_BUILD_VERSION "$pkg_samplerate_version" _ACEOF : fi ### libsndfile # Set ac_cv_sndfile to yes/no # Define USE_SNDFILE in config.h # Substitute SNDFILE_CFLAGS and SNDFILE_LIBS in Makefile # Check whether --with-sndfile was given. if test "${with_sndfile+set}" = set; then : withval=$with_sndfile; case "${withval}" in yes|no) ac_cv_want_sndfile="${withval}" ;; *) as_fn_error $? "bad value \"${withval}\" for --with-sndfile" "$LINENO" 5 ;; esac else ac_cv_want_sndfile=check fi test "x$ac_cv_want_sndfile" = "x" && ac_cv_want_sndfile="check" case "x$ac_cv_want_sndfile" in "xno") ac_cv_sndfile=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SNDFILE" >&5 $as_echo_n "checking for SNDFILE... " >&6; } if test -n "$SNDFILE_CFLAGS"; then pkg_cv_SNDFILE_CFLAGS="$SNDFILE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile >= 1.0.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "sndfile >= 1.0.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SNDFILE_CFLAGS=`$PKG_CONFIG --cflags "sndfile >= 1.0.10" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$SNDFILE_LIBS"; then pkg_cv_SNDFILE_LIBS="$SNDFILE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile >= 1.0.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "sndfile >= 1.0.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SNDFILE_LIBS=`$PKG_CONFIG --libs "sndfile >= 1.0.10" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SNDFILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "sndfile >= 1.0.10" 2>&1` else SNDFILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "sndfile >= 1.0.10" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$SNDFILE_PKG_ERRORS" >&5 ac_cv_sndfile=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_sndfile=no else SNDFILE_CFLAGS=$pkg_cv_SNDFILE_CFLAGS SNDFILE_LIBS=$pkg_cv_SNDFILE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_sndfile=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SNDFILE" >&5 $as_echo_n "checking for SNDFILE... " >&6; } if test -n "$SNDFILE_CFLAGS"; then pkg_cv_SNDFILE_CFLAGS="$SNDFILE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile >= 1.0.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "sndfile >= 1.0.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SNDFILE_CFLAGS=`$PKG_CONFIG --cflags "sndfile >= 1.0.10" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$SNDFILE_LIBS"; then pkg_cv_SNDFILE_LIBS="$SNDFILE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile >= 1.0.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "sndfile >= 1.0.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SNDFILE_LIBS=`$PKG_CONFIG --libs "sndfile >= 1.0.10" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SNDFILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "sndfile >= 1.0.10" 2>&1` else SNDFILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "sndfile >= 1.0.10" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$SNDFILE_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (sndfile >= 1.0.10) were not met: $SNDFILE_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables SNDFILE_CFLAGS and SNDFILE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables SNDFILE_CFLAGS and SNDFILE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else SNDFILE_CFLAGS=$pkg_cv_SNDFILE_CFLAGS SNDFILE_LIBS=$pkg_cv_SNDFILE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_sndfile=yes ;; esac if test "x$ac_cv_sndfile" = "xyes"; then $as_echo "#define USE_SNDFILE 1" >>confdefs.h pkg_sndfile_version=`$PKG_CONFIG --modversion "sndfile >= 1.0.10" 2>/dev/null` else $as_echo "#define USE_SNDFILE 0" >>confdefs.h pkg_sndfile_version="" fi cat >>confdefs.h <<_ACEOF #define SNDFILE_BUILD_VERSION "$pkg_sndfile_version" _ACEOF : ### portaudio # Set ac_cv_portaudio to yes/no # Define USE_PORTAUDIO in config.h # Substitute PORTAUDIO_CFLAGS and PORTAUDIO_LIBS in Makefile # Check whether --with-portaudio was given. if test "${with_portaudio+set}" = set; then : withval=$with_portaudio; case "${withval}" in yes|no) ac_cv_want_portaudio="${withval}" ;; *) as_fn_error $? "bad value \"${withval}\" for --with-portaudio" "$LINENO" 5 ;; esac else ac_cv_want_portaudio=check fi test "x$ac_cv_want_portaudio" = "x" && ac_cv_want_portaudio="check" case "x$ac_cv_want_portaudio" in "xno") ac_cv_portaudio=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PORTAUDIO" >&5 $as_echo_n "checking for PORTAUDIO... " >&6; } if test -n "$PORTAUDIO_CFLAGS"; then pkg_cv_PORTAUDIO_CFLAGS="$PORTAUDIO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"portaudio-2.0 >= 19\""; } >&5 ($PKG_CONFIG --exists --print-errors "portaudio-2.0 >= 19") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PORTAUDIO_CFLAGS=`$PKG_CONFIG --cflags "portaudio-2.0 >= 19" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PORTAUDIO_LIBS"; then pkg_cv_PORTAUDIO_LIBS="$PORTAUDIO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"portaudio-2.0 >= 19\""; } >&5 ($PKG_CONFIG --exists --print-errors "portaudio-2.0 >= 19") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PORTAUDIO_LIBS=`$PKG_CONFIG --libs "portaudio-2.0 >= 19" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PORTAUDIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "portaudio-2.0 >= 19" 2>&1` else PORTAUDIO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "portaudio-2.0 >= 19" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PORTAUDIO_PKG_ERRORS" >&5 ac_cv_portaudio=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_portaudio=no else PORTAUDIO_CFLAGS=$pkg_cv_PORTAUDIO_CFLAGS PORTAUDIO_LIBS=$pkg_cv_PORTAUDIO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_portaudio=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PORTAUDIO" >&5 $as_echo_n "checking for PORTAUDIO... " >&6; } if test -n "$PORTAUDIO_CFLAGS"; then pkg_cv_PORTAUDIO_CFLAGS="$PORTAUDIO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"portaudio-2.0 >= 19\""; } >&5 ($PKG_CONFIG --exists --print-errors "portaudio-2.0 >= 19") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PORTAUDIO_CFLAGS=`$PKG_CONFIG --cflags "portaudio-2.0 >= 19" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PORTAUDIO_LIBS"; then pkg_cv_PORTAUDIO_LIBS="$PORTAUDIO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"portaudio-2.0 >= 19\""; } >&5 ($PKG_CONFIG --exists --print-errors "portaudio-2.0 >= 19") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PORTAUDIO_LIBS=`$PKG_CONFIG --libs "portaudio-2.0 >= 19" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PORTAUDIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "portaudio-2.0 >= 19" 2>&1` else PORTAUDIO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "portaudio-2.0 >= 19" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PORTAUDIO_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (portaudio-2.0 >= 19) were not met: $PORTAUDIO_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables PORTAUDIO_CFLAGS and PORTAUDIO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables PORTAUDIO_CFLAGS and PORTAUDIO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else PORTAUDIO_CFLAGS=$pkg_cv_PORTAUDIO_CFLAGS PORTAUDIO_LIBS=$pkg_cv_PORTAUDIO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_portaudio=yes ;; esac if test "x$ac_cv_portaudio" = "xyes"; then $as_echo "#define USE_PORTAUDIO 1" >>confdefs.h pkg_portaudio_version=`$PKG_CONFIG --modversion "portaudio-2.0 >= 19" 2>/dev/null` else $as_echo "#define USE_PORTAUDIO 0" >>confdefs.h pkg_portaudio_version="" fi cat >>confdefs.h <<_ACEOF #define PORTAUDIO_BUILD_VERSION "$pkg_portaudio_version" _ACEOF : ### pulseaudio # Set ac_cv_pulseaudio to yes/no # Define USE_PULSEAUDIO in config.h # Substitute PULSEAUDIO_CFLAGS and PULSEAUDIO_LIBS in Makefile # Check whether --with-pulseaudio was given. if test "${with_pulseaudio+set}" = set; then : withval=$with_pulseaudio; case "${withval}" in yes|no) ac_cv_want_pulseaudio="${withval}" ;; *) as_fn_error $? "bad value \"${withval}\" for --with-pulseaudio" "$LINENO" 5 ;; esac else ac_cv_want_pulseaudio=check fi test "x$ac_cv_want_pulseaudio" = "x" && ac_cv_want_pulseaudio="check" case "x$ac_cv_want_pulseaudio" in "xno") ac_cv_pulseaudio=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PULSEAUDIO" >&5 $as_echo_n "checking for PULSEAUDIO... " >&6; } if test -n "$PULSEAUDIO_CFLAGS"; then pkg_cv_PULSEAUDIO_CFLAGS="$PULSEAUDIO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpulse-simple >= 0.9.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpulse-simple >= 0.9.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSEAUDIO_CFLAGS=`$PKG_CONFIG --cflags "libpulse-simple >= 0.9.7" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PULSEAUDIO_LIBS"; then pkg_cv_PULSEAUDIO_LIBS="$PULSEAUDIO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpulse-simple >= 0.9.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpulse-simple >= 0.9.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSEAUDIO_LIBS=`$PKG_CONFIG --libs "libpulse-simple >= 0.9.7" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PULSEAUDIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpulse-simple >= 0.9.7" 2>&1` else PULSEAUDIO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpulse-simple >= 0.9.7" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PULSEAUDIO_PKG_ERRORS" >&5 ac_cv_pulseaudio=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_pulseaudio=no else PULSEAUDIO_CFLAGS=$pkg_cv_PULSEAUDIO_CFLAGS PULSEAUDIO_LIBS=$pkg_cv_PULSEAUDIO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_pulseaudio=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PULSEAUDIO" >&5 $as_echo_n "checking for PULSEAUDIO... " >&6; } if test -n "$PULSEAUDIO_CFLAGS"; then pkg_cv_PULSEAUDIO_CFLAGS="$PULSEAUDIO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpulse-simple >= 0.9.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpulse-simple >= 0.9.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSEAUDIO_CFLAGS=`$PKG_CONFIG --cflags "libpulse-simple >= 0.9.7" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PULSEAUDIO_LIBS"; then pkg_cv_PULSEAUDIO_LIBS="$PULSEAUDIO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpulse-simple >= 0.9.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpulse-simple >= 0.9.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSEAUDIO_LIBS=`$PKG_CONFIG --libs "libpulse-simple >= 0.9.7" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PULSEAUDIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpulse-simple >= 0.9.7" 2>&1` else PULSEAUDIO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpulse-simple >= 0.9.7" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PULSEAUDIO_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libpulse-simple >= 0.9.7) were not met: $PULSEAUDIO_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables PULSEAUDIO_CFLAGS and PULSEAUDIO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables PULSEAUDIO_CFLAGS and PULSEAUDIO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else PULSEAUDIO_CFLAGS=$pkg_cv_PULSEAUDIO_CFLAGS PULSEAUDIO_LIBS=$pkg_cv_PULSEAUDIO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_pulseaudio=yes ;; esac if test "x$ac_cv_pulseaudio" = "xyes"; then $as_echo "#define USE_PULSEAUDIO 1" >>confdefs.h pkg_pulseaudio_version=`$PKG_CONFIG --modversion "libpulse-simple >= 0.9.7" 2>/dev/null` else $as_echo "#define USE_PULSEAUDIO 0" >>confdefs.h pkg_pulseaudio_version="" fi cat >>confdefs.h <<_ACEOF #define PULSEAUDIO_BUILD_VERSION "$pkg_pulseaudio_version" _ACEOF : if test "x$ac_cv_oss" = "xno" && \ test "x$ac_cv_portaudio" = "xno" && \ test "x$ac_cv_pulseaudio" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** $PACKAGE will be compiled without audio device support ***" >&5 $as_echo "$as_me: WARNING: *** $PACKAGE will be compiled without audio device support ***" >&2;} fi ### hamlib # Set ac_cv_hamlib to yes/no # Define USE_HAMLIB in config.h # Substitute HAMLIB_CFLAGS and HAMLIB_LIBS in Makefile # Set ENABLE_HAMLIB Makefile conditional # Check whether --with-hamlib was given. if test "${with_hamlib+set}" = set; then : withval=$with_hamlib; case "${withval}" in yes|no) ac_cv_want_hamlib="${withval}" ;; *) as_fn_error $? "bad value \"${withval}\" for --with-hamlib" "$LINENO" 5 ;; esac else ac_cv_want_hamlib=check fi test "x$ac_cv_want_hamlib" = "x" && ac_cv_want_hamlib="check" case "x$ac_cv_want_hamlib" in "xno") ac_cv_hamlib=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HAMLIB" >&5 $as_echo_n "checking for HAMLIB... " >&6; } if test -n "$HAMLIB_CFLAGS"; then pkg_cv_HAMLIB_CFLAGS="$HAMLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"hamlib >= 1.2.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "hamlib >= 1.2.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HAMLIB_CFLAGS=`$PKG_CONFIG --cflags "hamlib >= 1.2.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$HAMLIB_LIBS"; then pkg_cv_HAMLIB_LIBS="$HAMLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"hamlib >= 1.2.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "hamlib >= 1.2.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HAMLIB_LIBS=`$PKG_CONFIG --libs "hamlib >= 1.2.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then HAMLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "hamlib >= 1.2.4" 2>&1` else HAMLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "hamlib >= 1.2.4" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$HAMLIB_PKG_ERRORS" >&5 ac_cv_hamlib=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_hamlib=no else HAMLIB_CFLAGS=$pkg_cv_HAMLIB_CFLAGS HAMLIB_LIBS=$pkg_cv_HAMLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_hamlib=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HAMLIB" >&5 $as_echo_n "checking for HAMLIB... " >&6; } if test -n "$HAMLIB_CFLAGS"; then pkg_cv_HAMLIB_CFLAGS="$HAMLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"hamlib >= 1.2.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "hamlib >= 1.2.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HAMLIB_CFLAGS=`$PKG_CONFIG --cflags "hamlib >= 1.2.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$HAMLIB_LIBS"; then pkg_cv_HAMLIB_LIBS="$HAMLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"hamlib >= 1.2.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "hamlib >= 1.2.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HAMLIB_LIBS=`$PKG_CONFIG --libs "hamlib >= 1.2.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then HAMLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "hamlib >= 1.2.4" 2>&1` else HAMLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "hamlib >= 1.2.4" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$HAMLIB_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (hamlib >= 1.2.4) were not met: $HAMLIB_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables HAMLIB_CFLAGS and HAMLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables HAMLIB_CFLAGS and HAMLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else HAMLIB_CFLAGS=$pkg_cv_HAMLIB_CFLAGS HAMLIB_LIBS=$pkg_cv_HAMLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_hamlib=yes ;; esac if test "x$ac_cv_hamlib" = "xyes"; then $as_echo "#define USE_HAMLIB 1" >>confdefs.h pkg_hamlib_version=`$PKG_CONFIG --modversion "hamlib >= 1.2.4" 2>/dev/null` else $as_echo "#define USE_HAMLIB 0" >>confdefs.h pkg_hamlib_version="" fi cat >>confdefs.h <<_ACEOF #define HAMLIB_BUILD_VERSION "$pkg_hamlib_version" _ACEOF if test "x$ac_cv_hamlib" = "xyes"; then ENABLE_HAMLIB_TRUE= ENABLE_HAMLIB_FALSE='#' else ENABLE_HAMLIB_TRUE='#' ENABLE_HAMLIB_FALSE= fi # We compile our own copy of hamlib's locator.c if hamlib is not available # or if it is version <= 1.2.9, which has a broken azimuth_long_path function # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo "$pkg_hamlib_version" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "1.2.9" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then need_locator_c=yes else need_locator_c=no fi if test "$need_locator_c" = "yes"; then NEED_HAMLIB_LOCATOR_TRUE= NEED_HAMLIB_LOCATOR_FALSE='#' else NEED_HAMLIB_LOCATOR_TRUE='#' NEED_HAMLIB_LOCATOR_FALSE= fi ### X11 # Set ac_cv_x to yes/no # Define USE_X in config.h # Substitute X_CFLAGS and X_LIBS in Makefile if test "x$target_darwin" = "xno" && test "x$target_win32" = "xno"; then test "x$ac_cv_want_x" = "x" && ac_cv_want_x="check" case "x$ac_cv_want_x" in "xno") ac_cv_x=no ;; "xcheck") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } if test -n "$X_CFLAGS"; then pkg_cv_X_CFLAGS="$X_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"x11\""; } >&5 ($PKG_CONFIG --exists --print-errors "x11") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_X_CFLAGS=`$PKG_CONFIG --cflags "x11" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$X_LIBS"; then pkg_cv_X_LIBS="$X_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"x11\""; } >&5 ($PKG_CONFIG --exists --print-errors "x11") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_X_LIBS=`$PKG_CONFIG --libs "x11" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then X_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "x11" 2>&1` else X_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "x11" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$X_PKG_ERRORS" >&5 ac_cv_x=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_cv_x=no else X_CFLAGS=$pkg_cv_X_CFLAGS X_LIBS=$pkg_cv_X_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_cv_x=yes fi ;; "xyes") pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } if test -n "$X_CFLAGS"; then pkg_cv_X_CFLAGS="$X_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"x11\""; } >&5 ($PKG_CONFIG --exists --print-errors "x11") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_X_CFLAGS=`$PKG_CONFIG --cflags "x11" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$X_LIBS"; then pkg_cv_X_LIBS="$X_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"x11\""; } >&5 ($PKG_CONFIG --exists --print-errors "x11") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_X_LIBS=`$PKG_CONFIG --libs "x11" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then X_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "x11" 2>&1` else X_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "x11" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$X_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (x11) were not met: $X_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables X_CFLAGS and X_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables X_CFLAGS and X_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else X_CFLAGS=$pkg_cv_X_CFLAGS X_LIBS=$pkg_cv_X_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # if we get here the test has succeeded ac_cv_x=yes ;; esac if test "x$ac_cv_x" = "xyes"; then $as_echo "#define USE_X 1" >>confdefs.h pkg_x_version=`$PKG_CONFIG --modversion "x11" 2>/dev/null` else $as_echo "#define USE_X 0" >>confdefs.h pkg_x_version="" fi cat >>confdefs.h <<_ACEOF #define X_BUILD_VERSION "$pkg_x_version" _ACEOF : fi ### libintl # Substitute INTL_CFLAGS in Makefile # Substitute INTL_LIBS in Makefile # (default to LIBINTL) if test "x$INTL_LIBS" = "x"; then INTL_LIBS="$LIBINTL" fi ### asciidoc # substitute ASCIIDOC and A2X in doc/Makefile # set HAVE_ASCIIDOC Makefile conditional # Check whether --with-asciidoc was given. if test "${with_asciidoc+set}" = set; then : withval=$with_asciidoc; case "${withval}" in yes|no) ac_cv_want_asciidoc="${withval}" ;; *) as_fn_error $? "bad value \"${withval}\" for --with-asciidoc" "$LINENO" 5 ;; esac else ac_cv_want_asciidoc=check fi if test "x$ac_cv_want_asciidoc" != "xno"; then # Extract the first word of "asciidoc", so it can be a program name with args. set dummy asciidoc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ASCIIDOC+:} false; then : $as_echo_n "(cached) " >&6 else case $ASCIIDOC in [\\/]* | ?:[\\/]*) ac_cv_path_ASCIIDOC="$ASCIIDOC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ASCIIDOC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ASCIIDOC=$ac_cv_path_ASCIIDOC if test -n "$ASCIIDOC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ASCIIDOC" >&5 $as_echo "$ASCIIDOC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi asciidoc_min=8.2.0 if test "x$ASCIIDOC" != "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for asciidoc >= $asciidoc_min" >&5 $as_echo_n "checking for asciidoc >= $asciidoc_min... " >&6; } asciidoc_ver=$($ASCIIDOC --version | sed -n '1 s/.* //; p') # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo "$asciidoc_ver" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "$asciidoc_min" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($asciidoc_ver)" >&5 $as_echo "yes ($asciidoc_ver)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no ($asciidoc_ver)" >&5 $as_echo "no ($asciidoc_ver)" >&6; }; ASCIIDOC="" fi fi if test "x$ASCIIDOC" != "x"; then # Extract the first word of "a2x", so it can be a program name with args. set dummy a2x; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_A2X+:} false; then : $as_echo_n "(cached) " >&6 else case $A2X in [\\/]* | ?:[\\/]*) ac_cv_path_A2X="$A2X" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_A2X="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi A2X=$ac_cv_path_A2X if test -n "$A2X"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $A2X" >&5 $as_echo "$A2X" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo "$asciidoc_ver" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "8.3.0" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then no_xmllint=yes else no_xmllint=no fi fi if test "x$ac_cv_want_asciidoc" = "xyes"; then if test "x$ASCIIDOC" = "x" -o "x$A2X" = "x"; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--with-asciidoc was given, but check for asciidoc failed See \`config.log' for more details" "$LINENO" 5; } elif test "x$A2X" = "x"; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--with-asciidoc was given, but check for a2x failed See \`config.log' for more details" "$LINENO" 5; } fi fi fi if test "x$ASCIIDOC" != "x" -a "x$A2X" != "x"; then HAVE_ASCIIDOC_TRUE= HAVE_ASCIIDOC_FALSE='#' else HAVE_ASCIIDOC_TRUE='#' HAVE_ASCIIDOC_FALSE= fi if test "$no_xmllint" = "yes"; then HAVE_ASCIIDOC_NO_XMLLINT_TRUE= HAVE_ASCIIDOC_NO_XMLLINT_FALSE='#' else HAVE_ASCIIDOC_NO_XMLLINT_TRUE='#' HAVE_ASCIIDOC_NO_XMLLINT_FALSE= fi ### build info # Define various build variables in config.h # Define build flags and substitute in Makefile.in # CPPFLAGS FLDIGI_BUILD_CPPFLAGS="-I\$(srcdir) -I\$(srcdir)/include \ -I\$(srcdir)/irrxml \ -I\$(srcdir)/libtiniconv \ -I\$(srcdir)/fileselector \ -I\$(srcdir)/xmlrpcpp" # CXXFLAGS FLDIGI_BUILD_CXXFLAGS="$PORTAUDIO_CFLAGS $FLTK_CFLAGS $X_CFLAGS $SNDFILE_CFLAGS $SAMPLERATE_CFLAGS \ $PULSEAUDIO_CFLAGS $HAMLIB_CFLAGS $PNG_CFLAGS $XMLRPC_CFLAGS $MAC_UNIVERSAL_CFLAGS \ $INTL_CFLAGS $PTW32_CFLAGS $BFD_CFLAGS -pipe -Wall -fexceptions $OPT_CFLAGS $DEBUG_CFLAGS" if test "x$target_mingw32" = "xyes"; then FLDIGI_BUILD_CXXFLAGS="-mthreads $FLDIGI_BUILD_CXXFLAGS" fi # LDFLAGS FLDIGI_BUILD_LDFLAGS="$MAC_UNIVERSAL_LDFLAGS" if test "x$target_mingw32" = "xyes"; then FLDIGI_BUILD_LDFLAGS="-mthreads $FLDIGI_BUILD_LDFLAGS" fi # LDADD FLDIGI_BUILD_LDADD="$PORTAUDIO_LIBS $FLTK_LIBS $X_LIBS $SNDFILE_LIBS $SAMPLERATE_LIBS \ $PULSEAUDIO_LIBS $HAMLIB_LIBS $PNG_LIBS $XMLRPC_LIBS $INTL_LIBS $PTW32_LIBS $BFD_LIBS $EXTRA_LIBS" # CPPFLAGS FLARQ_BUILD_CPPFLAGS="-I\$(srcdir) -I\$(srcdir)/include -I\$(srcdir)/fileselector \ -I\$(srcdir)/flarq-src -I\$(srcdir)/flarq-src/include" # CXXFLAGS FLARQ_BUILD_CXXFLAGS="$FLTK_CFLAGS $X_CFLAGS $MAC_UNIVERSAL_CFLAGS $INTL_CFLAGS $PTW32_CFLAGS \ $BFD_CFLAGS -pipe -Wall -fexceptions $OPT_CFLAGS $DEBUG_CFLAGS" if test "x$target_mingw32" = "xyes"; then FLARQ_BUILD_CXXFLAGS="-mthreads $FLARQ_BUILD_CXXFLAGS" fi # LDFLAGS FLARQ_BUILD_LDFLAGS="$MAC_UNIVERSAL_LDFLAGS" if test "x$target_mingw32" = "xyes"; then FLARQ_BUILD_LDFLAGS="-mthreads $FLARQ_BUILD_LDFLAGS" fi # LDADD FLARQ_BUILD_LDADD="$FLTK_LIBS $X_LIBS $INTL_LIBS $PTW32_LIBS $BFD_LIBS $EXTRA_LIBS" if test "x$ac_cv_debug" = "xyes"; then FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS -UNDEBUG" FLDIGI_BUILD_LDFLAGS="$FLDIGI_BUILD_LDFLAGS $RDYNAMIC" FLARQ_BUILD_CXXFLAGS="$FLARQ_BUILD_CXXFLAGS -UNDEBUG" FLARQ_BUILD_LDFLAGS="$FLARQ_BUILD_LDFLAGS $RDYNAMIC" else FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS -DNDEBUG" FLARQ_BUILD_CXXFLAGS="$FLARQ_BUILD_CXXFLAGS -DNDEBUG" fi #define build variables for config.h cat >>confdefs.h <<_ACEOF #define BUILD_BUILD_PLATFORM "$build" _ACEOF cat >>confdefs.h <<_ACEOF #define BUILD_HOST_PLATFORM "$host" _ACEOF cat >>confdefs.h <<_ACEOF #define BUILD_TARGET_PLATFORM "$target" _ACEOF test "x$LC_ALL" != "x" && LC_ALL_saved="$LC_ALL" LC_ALL=C export LC_ALL ac_sh_dq="\"`echo $ac_configure_args | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define BUILD_CONFIGURE_ARGS $ac_sh_dq _ACEOF ac_sh_dq="\"`date | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define BUILD_DATE $ac_sh_dq _ACEOF ac_sh_dq="\"`whoami | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define BUILD_USER $ac_sh_dq _ACEOF ac_sh_dq="\"`hostname | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define BUILD_HOST $ac_sh_dq _ACEOF ac_sh_dq="\"`$CXX -v 2>&1 | tail -1 | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define BUILD_COMPILER $ac_sh_dq _ACEOF ac_sh_dq="\"`echo $FLDIGI_BUILD_CPPFLAGS $FLDIGI_BUILD_CXXFLAGS | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define FLDIGI_BUILD_CXXFLAGS $ac_sh_dq _ACEOF ac_sh_dq="\"`echo $FLDIGI_BUILD_LDFLAGS $FLDIGI_BUILD_LDADD | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define FLDIGI_BUILD_LDFLAGS $ac_sh_dq _ACEOF ac_sh_dq="\"`echo $FLARQ_BUILD_CPPFLAGS $FLARQ_BUILD_CXXFLAGS | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define FLARQ_BUILD_CXXFLAGS $ac_sh_dq _ACEOF ac_sh_dq="\"`echo $FLARQ_BUILD_LDFLAGS $FLARQ_BUILD_LDADD | sed 's/"/\\\\"/g'`\"" cat >>confdefs.h <<_ACEOF #define FLARQ_BUILD_LDFLAGS $ac_sh_dq _ACEOF if test "x$LC_ALL_saved" != "x"; then LC_ALL="$LC_ALL_saved" export LC_ALL fi ### silent build rules SILENT_CMDS='silent_cmd = @echo " $(1)" $(2); ifeq ($(AM_DEFAULT_VERBOSITY),0) silent = $(if $(subst 0,,$(V)),,$(silent_cmd)) else ifeq ($(V),0) silent = $(silent_cmd) endif endif' ### output ac_config_files="$ac_config_files Makefile src/Makefile po/Makefile.in doc/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_NLS_TRUE}" && test -z "${USE_NLS_FALSE}"; then as_fn_error $? "conditional \"USE_NLS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WANT_FLDIGI_TRUE}" && test -z "${WANT_FLDIGI_FALSE}"; then as_fn_error $? "conditional \"WANT_FLDIGI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WANT_FLARQ_TRUE}" && test -z "${WANT_FLARQ_FALSE}"; then as_fn_error $? "conditional \"WANT_FLARQ\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DARWIN_TRUE}" && test -z "${DARWIN_FALSE}"; then as_fn_error $? "conditional \"DARWIN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_WINDRES_TRUE}" && test -z "${HAVE_WINDRES_FALSE}"; then as_fn_error $? "conditional \"HAVE_WINDRES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_NSIS_TRUE}" && test -z "${HAVE_NSIS_FALSE}"; then as_fn_error $? "conditional \"HAVE_NSIS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WIN32_TRUE}" && test -z "${WIN32_FALSE}"; then as_fn_error $? "conditional \"WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MINGW32_TRUE}" && test -z "${MINGW32_FALSE}"; then as_fn_error $? "conditional \"MINGW32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COMPAT_REGEX_TRUE}" && test -z "${COMPAT_REGEX_FALSE}"; then as_fn_error $? "conditional \"COMPAT_REGEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COMPAT_STRCASESTR_TRUE}" && test -z "${COMPAT_STRCASESTR_FALSE}"; then as_fn_error $? "conditional \"COMPAT_STRCASESTR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_DEBUG_TRUE}" && test -z "${ENABLE_DEBUG_FALSE}"; then as_fn_error $? "conditional \"ENABLE_DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COMPAT_STACK_TRUE}" && test -z "${COMPAT_STACK_FALSE}"; then as_fn_error $? "conditional \"COMPAT_STACK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_BENCHMARK_TRUE}" && test -z "${ENABLE_BENCHMARK_FALSE}"; then as_fn_error $? "conditional \"ENABLE_BENCHMARK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_FLUID_TRUE}" && test -z "${HAVE_FLUID_FALSE}"; then as_fn_error $? "conditional \"HAVE_FLUID\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_HAMLIB_TRUE}" && test -z "${ENABLE_HAMLIB_FALSE}"; then as_fn_error $? "conditional \"ENABLE_HAMLIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NEED_HAMLIB_LOCATOR_TRUE}" && test -z "${NEED_HAMLIB_LOCATOR_FALSE}"; then as_fn_error $? "conditional \"NEED_HAMLIB_LOCATOR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ASCIIDOC_TRUE}" && test -z "${HAVE_ASCIIDOC_FALSE}"; then as_fn_error $? "conditional \"HAVE_ASCIIDOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ASCIIDOC_NO_XMLLINT_TRUE}" && test -z "${HAVE_ASCIIDOC_NO_XMLLINT_FALSE}"; then as_fn_error $? "conditional \"HAVE_ASCIIDOC_NO_XMLLINT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by fldigi $as_me 3.21.80, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ fldigi config.status 3.21.80 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "po-directories":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ### summary { $as_echo "$as_me:${as_lineno-$LINENO}: result: Configuration summary: Version ..................... $VERSION Static linking .............. $ac_cv_static CPU optimizations ........... $ac_cv_opt Debugging ................... $ac_cv_debug fldigi ...................... $ac_cv_want_fldigi flarq ....................... $ac_cv_want_flarq i18n ........................ $USE_NLS " >&5 $as_echo " Configuration summary: Version ..................... $VERSION Static linking .............. $ac_cv_static CPU optimizations ........... $ac_cv_opt Debugging ................... $ac_cv_debug fldigi ...................... $ac_cv_want_fldigi flarq ....................... $ac_cv_want_flarq i18n ........................ $USE_NLS " >&6; } if test "x$ac_cv_want_fldigi" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: fldigi build options: sndfile ..................... $ac_cv_sndfile oss ......................... $ac_cv_oss portaudio ................... $ac_cv_portaudio pulseaudio .................. $ac_cv_pulseaudio hamlib ...................... $ac_cv_hamlib " >&5 $as_echo " fldigi build options: sndfile ..................... $ac_cv_sndfile oss ......................... $ac_cv_oss portaudio ................... $ac_cv_portaudio pulseaudio .................. $ac_cv_pulseaudio hamlib ...................... $ac_cv_hamlib " >&6; } fi fldigi-3.21.80/build-aux/0000775000175000017500000000000012313333721012016 500000000000000fldigi-3.21.80/build-aux/missing0000755000175000017500000002415212142773040013341 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: fldigi-3.21.80/build-aux/config.rpath0000775000175000017500000004364712313064025014262 00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2007 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix4* | aix5*) library_names_spec='$libname$shrext' ;; amigaos*) library_names_spec='$libname.a' ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd1*) ;; freebsd* | dragonfly*) case "$host_os" in freebsd[123]*) library_names_spec='$libname$shrext$versuffix' ;; *) library_names_spec='$libname$shrext' ;; esac ;; gnu*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; nto-qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fldigi-3.21.80/build-aux/install-sh0000755000175000017500000003325612142773040013753 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # 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 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: fldigi-3.21.80/build-aux/config.guess0000755000175000017500000012743212142773040014267 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fldigi-3.21.80/build-aux/depcomp0000755000175000017500000004755612142773041013335 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2011-12-04.11; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/ \1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/ / G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: fldigi-3.21.80/doc/0000775000175000017500000000000012313333723010673 500000000000000fldigi-3.21.80/doc/Makefile.am0000664000175000017500000000374312313064025012652 00000000000000# Copyright (C) 2009 Stelios Bounanos, M0GLD (m0gld AT enotty DOT net) # License: GPLv3+: GNU GPL version 3 or later. ASCIIDOC_CONF = asciidoc.conf ASCIIDOC_SRC = fldigi.1.txt fldigi-shell.1.txt flarq.1.txt guide.txt ASCIIDOC_MAN_DIST = fldigi.1 fldigi-shell.1 flarq.1 ASCIIDOC_MAN_INST = ASCIIDOC_HTML = if WANT_FLDIGI ASCIIDOC_MAN_INST += fldigi.1 ASCIIDOC_MAN_INST += fldigi-shell.1 ASCIIDOC_HTML += guide.html endif if WANT_FLARQ ASCIIDOC_MAN_INST += flarq.1 endif EXTRA_DIST = $(ASCIIDOC_CONF) $(ASCIIDOC_SRC) $(ASCIIDOC_MAN_DIST) man_MANS = $(ASCIIDOC_MAN_INST) MOSTLYCLEANFILES = *.xml DISTCLEANFILES = $(ASCIIDOC_HTML) MAINTAINERCLEANFILES = $(ASCIIDOC_MAN_INST) A2X_ARGS = --format=manpage --destination-dir=$(builddir)/../doc if HAVE_ASCIIDOC_NO_XMLLINT A2X_ARGS += --no-xmllint endif .SECONDEXPANSION: # Define the custom silent rule function @SILENT_CMDS@ %.1: $$@.txt $(ASCIIDOC_CONF) if HAVE_ASCIIDOC $(call silent,ADOC ,$@)$(A2X) $(A2X_ARGS) $< else $(call silent,ADOC ,$@)echo '.TH "NOT-BUILT" "1" "" "" ""' > $@ endif # Without .SECONDEXPANSION we would use something like this: #$(ASCIIDOC_MAN_INST): asciidoc.conf # a2x $(A2X_ARGS) $@.txt #fldigi.1: fldigi.1.txt #fldigi-shell.1: fldigi-shell.1.txt # The rest of the Makefile is enabled only if we have asciidoc if HAVE_ASCIIDOC ASCIIDOC_ICONS_DIR ?= /usr/share/asciidoc/images/icons # Additional attributes are defined in guide.conf ASCIIDOC_ARGS = --unsafe -a toc -a data-uri -a badges -a icons -a iconsdir=$(ASCIIDOC_ICONS_DIR) %.html: $$*.txt $(ASCIIDOC_CONF) @if ! test -d $(ASCIIDOC_ICONS_DIR); then \ echo " *** The default asciidoc icons directory, \"$(ASCIIDOC_ICONS_DIR)\", does not exist." >&2; \ echo " *** Please rerun make with the correct ASCIIDOC_ICONS_DIR, e.g.:" >&2; \ echo " *** make ASCIIDOC_ICONS_DIR=/path/to/icons" >&2; \ false; \ fi $(call silent,ADOC ,$@)$(ASCIIDOC) $(ASCIIDOC_ARGS) --out-file $@ $< all-local: $(ASCIIDOC_MAN_DIST) $(ASCIIDOC_HTML) endif fldigi-3.21.80/doc/guide.txt0000664000175000017500000011106412313064025012450 00000000000000Beginners' Guide to Fldigi ========================== // Uncomment the section below to enable the hand written TOC and avoid some // javascript security warnings with brain-dead browsers. Remember to update // when changing the sections. //////////////////////////////////////////////////////////////////////////////// .Table of Contents <> <> <> <> <> // <> //////////////////////////////////////////////////////////////////////////////// :revision: 3.11 // Aliases :docsurl: http://www.w1hkj.com/FldigiHelp/index.html :docs: {docsurl}[Online Documentation] :home: http://www.w1hkj.com/Fldigi.html // This used to be a subsection titled "Where can I find detailed instructions // for Fldigi?" ******************************************************************************** Of necessity, this Beginners' Guide contains only as much as you need to know to get started. You should learn how to make best use of the program by reading the {docs}. You can also access it from within the Fldigi program from the 'Help' menu item. ******************************************************************************** [[ref-beginners-q-a]] == Beginners' Questions Answered == === What is Fldigi? === {home}[Fldigi] is a computer program intended for Amateur Radio Digital Modes operation using a PC (Personal Computer). Fldigi operates (as does most similar software) in conjunction with a conventional HF SSB radio transceiver, and uses the PC sound card as the main means of input from the radio, and output to the radio. These are audio-frequency signals. The software also controls the radio by means of another connection, typically a serial port. Fldigi is multi-mode, which means that it is able to operate many popular digital modes without switching programs, so you only have one program to learn. Fldigi includes all the popular modes, such as DominoEX, MFSK16, PSK31, and RTTY. Unusually, Fldigi is available for multiple computer operating systems; FreeBSD(TM); Linux(TM), OS X(TM) and Windows(TM). === What is a Digital Mode? === Digital Modes are a means of operating Amateur radio from the computer keyboard. The computer acts as 'modem' (modulator - demodulator), as well as allowing you to type, and see what the other person types. It also controls the transmitter, changes modes as required, and provides various convenient features such as easy tuning of signals and prearranged messages. In this context, we are talking about modes used on the HF (high frequency) bands, specifically 'chat' modes, those used to have a regular conversation in a similar way to voice or Morse, where one operator 'talks' for a minute or two, then another does the same. These chat modes allow multiple operators to take part in a 'net'. Because of sophisticated digital signal processing which takes place inside the computer, digital modes can offer performance that cannot be achieved using voice (and in some cases even Morse), through reduced bandwidth, improved signal-to-noise performance and reduced transmitter power requirement. Some modes also offer built-in automatic error correction. Digital Mode operating procedure is not unlike Morse operation, and many of the same abbreviations are used. Software such as Fldigi makes this very simple as most of the procedural business is set up for you using the Function Keys at the top of the keyboard. These are easy to learn. === Why all the different modes? === HF propagation is very dependent on the ionosphere, which reflects the signals back to earth. There are strong interactions between different signals arriving from different paths. Experience has shown that particular modulation systems, speeds and bandwidths suit different operating conditions. Other factors such as available band space, operating speed and convenience, noise level, signal level and available power also affect the choice of mode. While in many cases several different modes might be suitable, having a choice adds to the operating pleasure. It is difficult to advise which mode is best for each particular occasion, and experience plays an important role. footnote:[To gain a good insight into each mode and its capabilities, you might consider purchasing 'Digital Modes for All Occasions' (ISBN 1-872309-82-8) by Murray Greenman ZL1BPU, published by the RSGB and also available from FUNKAMATEUR and CQ Communications; or the ARRL's 'HF Digital Handbook' (ISBN 0-87259-103-4) by Steve Ford, WB8IMY.] === How do I recognise and tune in the signals? === Recognising the different modes comes with experience. It is a matter of listening to the signal, and observing the appearance of the signal on the tuning display. You can also practise transmitting with the transceiver disconnected, listening to the sound of the signals coming from the computer. There is also (see later paragraph) an automatic tuning option which can recognise and tune in most modes for you. The software provides a tuning display which shows the radio signals that are receivable within the transceiver passband. Using a 'point and click' technique with the mouse, you can click on the centre of a signal to select it, and the software will tune it in for you. Some modes require more care than others, and of course you need to have the software set for the correct mode first — not always so easy! The <> (automatic mode detection and tuning) feature uses a special sequence of tones transmitted at the beginning of each transmission to identify and tune in the signals received. For this feature to work, not only do you need to enable the feature in the receiver, but in addition the stations you are wishing to tune in need to have this feature enabled on transmission. Other programs also offer this RSID feature as an option. [[ref-setting-up]] == Setting Up == === Fldigi settings === .Essentials * Use the menu +Configure->Operator+ item to set the operator name, callsign, locator and so on. * If you have more than one sound card, use the menu +Configure->Sound Card+, +Audio Devices+ tab, to select the sound card you wish to use. You can ignore the other tabs for now. .Rig Control * Use the menu +Configure->Rig Control+ item to set how you will control the rig. If you will key the rig via a serial port, in the +Hardware PTT+ tab select 'Use serial port PTT', the device name you will use, and which line controls PTT. If in doubt, check both 'RTS' and 'DTR'. You *must* then press the +Initialize+ button. * If you plan to use CAT control of the rig via the COM port, check 'Use Hamlib' in the +Hamlib+ tab. Select your rig model from the drop-down menu and set the serial port device name, baud rate, and RTS/CTS options as needed. If in addition you wish to use PTT control via CAT, also check 'PTT via Hamlib command'. You *must* then press the +Initialize+ button. [NOTE] ================================================================================ If your rig is CAT-capable but not yet supported by http://www.hamlib.org/[Hamlib], it may still be possible to control it via Fldigi's +RigCAT+ system. Refer to the {docs} for details. ================================================================================ // The above paragraph & note replace this one: //////////////////////////////////////////////////////////////////////////////// * If you plan to use CAT control of the rig via the COM port, check 'Use RigCAT' in the RigCAT tab. If in addition you wish to use PTT control via CAT, also then check 'PTT via CAT command'. You *must* then press the +Initialize+ button. //////////////////////////////////////////////////////////////////////////////// .CPU Speed * When you start Fldigi for the very first time, it makes a series of measurements to determine your computer's processing speed. Although these measurements are usually accurate, if you have a very slow processor (under 700MHz), you should verify that 'Slow CPU' under +Configure->Misc->CPU+ has been enabled. The receiver decoding strategy of certain modems uses fewer processor cycles in this mode. .Modems * Each of the modems can be individually set up from the +Configure->Modems+ multi-tabbed dialog. You need not change anything here to start with, although it might be a good idea to set the 'secondary text' for DominoEX and THOR to something useful, such as your call and locator. footnote:[Secondary text is transmitted when the text you type does not keep up with the typing speed of the mode — this handy text appears in a small window at the very bottom of the screen.] Note that this set of tabs is also where you set the RTTY modem speed and shift, although the default values should be fine for normal operation. .Other settings * Use the menu +Configure->UI+, +Restart+ tab, to set the aspect ratio of the waterfall display and whether or not you want to dock a second digiscope to the main window. * Use the menu +Configure->IDs+ item to set whether you wish to transmit RSID data at the start of each over (this is for the benefit of others and does not affect RSID reception). If you plan to regularly use the RSID feature on receive, you should deselect the option that starts new modems at the ``sweet spot'' frequencies in +Misc->Sweet Spot+. Finally, use the menu item +Configure->Save Config+ to save the new configuration. === Sound Card Mixer === * Use your sound card 'Master Volume' applet to select the sound card, the Wave output and set the transmit audio level. You can check the level using the <> button, top right, beyond the Menu. * On Windows, the 'Volume' applet can usually be opened by clicking +Start->Run…+ and entering +sndvol32+, or from the Control Panel. * Use your sound card 'Recording Control' applet to select the sound card, the Line or Mic input and set the receiver audio level. Watch the waterfall display for receiver noise when setting the level. If you see any dark blue noise, you have the right input and about the right level. The actual setting is not very important, provided you see blue noise. If the audio level is too high, the little diamond shaped indicator (bottom right) will show red. The waterfall may also show red bands. Performance will be degraded if the level is too high. * On Windows, the 'Record' applet can usually be opened by clicking +Start->Run…+ and entering +sndvol32+, or from the Control Panel. If opened from the Control Panel, you'll end up with the Master Volume applet, and need to switch using +Options->Properties+, and selecting the +Recording+ radio button. [[ref-guided-tour]] == Guided Tour == The main window consists of three main panes. Study it carefully as you read these notes. From top to bottom, these are the Receive pane (navajo white), the Transmit pane (light cyan), and the Waterfall pane (black). At the top is the collection of entry items which form the Log Data, and at the very top, a conventional drop-down Menu system, with entries for File, Op Mode, Configure, View and Help. Between the Transmit and the Waterfall panes is a line of boxes (buttons) which represent the Function Keys F1 - F12. This is the Macro group. Below the Waterfall pane is another line of boxes (buttons), which provide various control features. This is the Controls group. The program and various buttons can mostly be operated using the mouse or the keyboard, and users generally find it convenient to use the mouse while tuning around, and the keyboard and function keys during a QSO. [[ref-receive-pane]] === Receive Pane === This is where the text from decoded incoming signals is displayed, in black text. When you transmit, the transmitted text is also displayed here, but in red, so the Receive pane becomes a complete record of the QSO. The information in this pane can also be logged to a file. The line at the bottom of this pane can be dragged up and down with the mouse. You might prefer to drag it down a bit to enlarge the Receive pane and reduce the size of the Transmit pane. === Transmit Pane === This is where you type what you want to transmit. The mouse must click in here before you type (to obtain 'focus') otherwise your text will go nowhere. You can type in here while you are receiving, and when you start transmitting, the text already typed will be sent first. This trick is a cool way to impress others with your typing speed! As the text is transmitted, the text colour changes from black to red. At the end of the over, all the transmitted text (and any as yet not transmitted) will be deleted. === Waterfall Pane === This is the main tuning facility. There are three modes, Waterfall, FFT and Signal, selected by a button in the Control group. For now, leave it in Waterfall mode, as this is the easiest to tune with, and gives the best identification of the signal. [horizontal] *+WF+* (Waterfall):: A spectrogram display of signal strength versus frequency over passing time. The receiver passband is analysed and displayed with lower frequencies to the left, higher to the right. Weak signals and background noise are dark while stronger signals show as brighter colours. As time passes (over a few seconds), the historic signals move downwards like a waterfall. *+FFT+* (Fast Fourier Transform):: A spectrum display of the mean signal strength versus frequency. Again frequency is displayed from left to right, but now the vertical direction shows signal strength and there is no brightness or historic information. *+SIG+* (Signal):: An oscilloscope type of display showing the raw audio being captured by the sound card. At the top of the pane is a scale of frequency in Hz, which corresponds to the frequency displayed immediately below it. This scale can be moved around and zoomed using buttons in the Control group. As you move the mouse around in this pane you will see a yellow group of tuning marks following the mouse pointer. Tuning is achieved by left-clicking on a signal displayed by the waterfall in this pane. Use these yellow marks to exactly straddle the signal and then left-click on the centre of the signal. The tuning marks change to red. The red vertical lines will show the approximate width of the active signal area (the expected signal bandwidth), while a red horizontal bar above will indicate the receiver software's active decoding range. When you left-click, the red marks move to where you clicked, and will attempt to auto-track the signal from there. [TIP] .Audio history and ``casual tuning'' ================================================================================ You can temporarily ``monitor'' a different signal by right-clicking on it. As long as you hold the mouse button down, the signal under it will be decoded; as soon as you release the mouse, decoding will revert to the previously tuned spot (where the red marks are). If you also hold the +Control+ key down before right-clicking, Fldigi will first decode all of its buffered audio at that frequency. ================================================================================ === Log Data === Fldigi provides two QSO entry views, one for casual QSO logging and the second for contesting. The +View->Contest fields+ menu item switches between the two modes. The 'Frequency', 'Time Off', and (when in contest mode) '#Out' fields are filled by the program. All the others can be populated by manual keyboard entry or by selection from the <>. The 'Time Off' field is continuously updated with the current GMT time. The 'Time On' field will be filled in when the 'Call' is updated, but can be modified later by the operator. A right click on the Receive pane brings up a context sensitive menu that will reflect which of the two QSO capture views you have open. If you highlight text in the Receive pane then the menu selection will operate on that text. If you simply point to a word of text and right click then the menu selection will operate on the single word. [TIP] .Quick log entry ================================================================================ Certain fields ('Call', 'Name', 'RST In', 'QTH' and 'Locator') may also be populated semi-automatically. Point to a word in the Receive pane and either double-left-click or hold a Shift key down and left-click. The program will then use some simple heuristics to decide which log field will receive the text. ================================================================================ It is generally not possible to distinguish between Operator and QTH names. For this reason, Fldigi will use the first non-Call and non-Locator word to fill the 'Name' field, and subsequent clicks will send text to the 'QTH' field. Likewise, a text string may be both a valid callsign and a valid http://en.wikipedia.org/wiki/Maidenhead_Locator_System[IARU (Maidenhead) locator]. For best results, you should attempt to fill the log fields in the order in which they appear on the main window, and clear the log fields after logging the QSO. Of course, text can always be manually typed or pasted into any of the log fields! You can query online and local (e.g. CD) database systems for data regarding a callsign. You make the query by either clicking on the globe button, or selecting 'Look up call' from the popup menu. The latter will also move the call to the 'Call' field. When the 'Call' field is filled in, the logbook will be searched for the most recent QSO with that station and, if an entry is found, the 'Name', 'QTH' and other fields will be pre-filled. If the logbook dialog is open, that last QSO will also be selected for viewing in the logbook. You open the logbook by selecting from the View menu; +View->Logbook+. The logbook title bar will show you which logbook you currently have open. Fldigi can maintain an unlimited (except for disk space) number of logbooks. === Menu === At the very top of the program window is a conventional drop-down menu. If you click on any of the items, a list of optional functions will appear. Keyboard menu selection is also provided. Where underscored characters are shown in the menu, you can select these menu items from the keyboard using the marked character and +Alt+ at the same time, then moving around with the +up+/+down+/+left+/+right+ keys. Press +Esc+ to quit from the menu with no change. ==== Menu functions ==== .File Allows you to open or save Macros (we won't get into that here), turn on/off logging to file, record/play audio samples, and exit the program. You can also exit the program by clicking on the +X+ in the top right corner of the window, in the usual manner. .Op Mode This is where you select the operating modem used for transmission and reception. Some modes only have one option. Where more are offered, drag the mouse down the list and sideways following the arrow to a secondary list, before releasing it. When you start the program next time, it will remember the last mode you used. Not all the modes are widely used, so choose a mode which _(a)_ maximises your chance of a QSO, and _(b)_ is appropriate for the band, conditions, bandwidth requirements and permissions relevant to your operating licence. At the bottom of the list are two ``modes'' which aren't modes at all, and do not transmit (see {docs} for details). 'WWV' mode allows you to receive a standard time signal so the beeps it transmits can be used for sound card calibration. 'Freq Analysis' provides just a waterfall display with a very narrow cursor, and a frequency meter which indicates the received frequency in Hz to two decimal places. This is useful for on-air frequency measurement. .Configure This is where you set up the program to suit your computer, yourself and your operating preferences. The operating settings of the program are grouped into several categories and there are menu items in which you enter your personal information, or define your computer sound card, for example. Modems can be individually changed, each having different adjustments. The Modems dialog has multiple tabs, so you can edit any one of them. Don't fool with the settings until you know what you are doing! The final item, +Save Config+ allows you to save the altered configuration for next time you start the program (otherwise changes are temporary). .View This menu item allows you to open extra windows. Most will be greyed out, but two that are available are the Digiscope, and the PSK Browser. The Digiscope provides a mode-specific graphical analysis of the received signal, and can have more than one view (left click in the new window to change the view), or maybe none at all. The PSK Browser is a rather cool tool that allows you to monitor several PSK31 signals all at the same time! These windows can be resized to suit. .Help Brings up the Online Documentation, the Fldigi Home Page, and various information about the program. ==== Other controls ==== [[ref-rsid]] .RSID The RxID button turns on the receive RSID (automatic mode detection and tuning) feature. When in use, the button turns yellow and no text reception is possible until a signal is identified, or the feature is turned off again. If you plan to use the RSID feature on receive, you must leave the 'Start New Modem at Sweet Spot' item in the menu +Configure->Defaults->Misc+ tab unchecked. [[ref-tune]] .TUNE This button transmits a continuous tone at the current audio frequency. The tone level will be at the maximum signal level for any modem, which makes this function useful for adjusting your transceiver's output power. === Macro buttons === This line of buttons provides user-editable QSO features. For example, the first button on the left sends CQ for you. Both the function of these buttons (we call them Macros) and the label on each button, can be changed. Select each button to use it by pressing the corresponding Function Key (F1 - F12, you'll notice the buttons are grouped in patterns four to a group, just as the Function Keys are). You can also select them with a left-click of the mouse. If you right-click on the button, you are able to edit the button's label and its function. A handy dialog pops up to allow this to be done. There are many standard shortcuts, such as ++, which you can use within the Macros. Notice that the buttons also turn the transmitter on and off as necessary. You can just about hold a complete QSO using these buttons from left to right (but please don't!). Notice that at the right are two spare buttons you can set as you wish, and then a button labelled +1+. Yes, this is the first set of _four_ sets of Macros, and you can access the others using this button, which changes to read +2+, +3+, +4+ then +1+ again (right-click to go backwards), or by pressing +Alt+ and the corresponding number (1-4, not F1-F4) at the same time. [NOTE] ================================================================================ If you _really_ mess up the Macros and can't see how to fix them, just close the program without saving them, and reopen it. ================================================================================ === Controls === The line of buttons under the waterfall is used to control the program (as opposed to the QSO). If you hover the mouse over these buttons, you'll see a little yellow hint box appear which tells you what each button does. The first button switches between Waterfall, FFT and Scope modes. The next two buttons adjust the signal level over which the waterfall works. The default range is from 0dB downwards 70dB (i.e. to -70dB). Both of these values can be adjusted to suit your sound card and receiver audio level. The next button sets the scale zoom factor (visible display width, ×1, ×2 or ×4), and the next three buttons move the visible waterfall area in relation to the bandwidth cursor. The next button selects the waterfall speed. NORM or SLOW setting is best unless you have a very fast computer. The next four buttons (two on either side of a number, the audio frequency in Hz) control the receiving frequency (they move the red cursor lines). The +QSY+ button moves the signal under the bandwidth cursor to a preset audio frequency (typically, the centre of the transceiver's passband). The Store button allows you to store or recall the current frequency and mode. See the {docs} for details on these functions. The +Lk+ button locks the transmit frequency (and illuminates a green marker), and the +Rv+ button turns the signal decoding upside down (some modes are sideband sensitive, and if they are the wrong way up, can't be received correctly). Remember to turn this one off when you're done, or you won't receive anything! If every signal you hear is upside down, check your transceiver sideband setting. The +T/R+ button forces the transmitter on or off. [CAUTION] ================================================================================ Use the +T/R+ button with care, as it will stop transmission immediately, losing whatever is in the buffer (what you have typed in the Transmit pane), or start it immediately, even if nothing is ready to transmit. ================================================================================ There are two further controls in the bottom right corner of the program, to the right of the Status line: +AFC+ (AFC) control:: When this button is pressed, an indicator on the button turns yellow, and the program will automatically retune to drifting signals. When the button is again pressed, AFC is off, and the tuning will stay where you leave it. +SQL+ (Squelch) control:: When off (no coloured indicator on the button), the receiver displays all ``text'' received, even if there is no signal present, and the receiver is simply attempting to decode noise. When activated by pressing the button, the indicator turns yellow. If the incoming signal strength exceeds that set by the adjacent slider control (above the +SQL+ button), the indicator turns green and the incoming signal is decoded and printed. The signal strength is indicated on the green bar beside the Squelch level slider. If nothing seems to be printing, the first thing to do is check the Squelch! === Status Line === At the very bottom line of the Fldigi window is a row of useful information. At the left is the current operating mode. Next (some modes) is the measured signal-to-noise ratio at the receiver, and (in some modes) the measured signal intermodulation level (IMD). The larger central box shows (in DominoEX and THOR modes) the received 'Secondary Text'. This is information (such as station identification) which is transmitted automatically whenever the transmitter has completed all user text that is available to send. It is transmitted using special characters, and is automatically directed to this special window. Secondary text you transmit is also shown here. This box changes size when you enlarge the program window. [[ref-operating]] == Operating == === Procedure === Operating procedure for digital modes is similar to that for Morse. Some of the same abbreviations are used. For example, at the beginning of an over, you might send +VK3XYZ de WB8ABC+ or just +RR Jack+ and so on. At the end of an over, it is usual to send +ZL1ABC de AA3AR K+, and at the end of a QSO +73 F3XYZ de 3D2ZZ SK+. When operating in a group or net it is usual to sign +AA3AE es gp de ZK8WW K+. It is also considered a courtesy to send a blank line or two (press +Enter+) before any text at the start of an over, and following the last text at the end of an over. You can also place these in the macros. The purpose is to separate your text from the previous text, and especially from any rubbish that was printed between overs. Fldigi does all of this for you. The Function Keys are set up to provide these start and end of over facilities, and can be edited to suit your preferences. In order that the other station's callsign can appear when these keys are used, you need to set the other station's callsign in the log data — it does not matter if you use the log facility or not. [NOTE] .Macro symbols ================================================================================ Some Function Key Macro buttons have graphic symbols on them which imply the following: [horizontal] *+>>+*:: The transmitter comes on and stays on when you use this button/macro. *+||+*:: The transmitter goes off when the text from this button/macro has been sent. *+>|+*:: The transmitter comes on, sends the text from this button/macro, and goes off when the text from this button/macro has been sent. ================================================================================ The Macros are set up to control the transmitter as necessary, but you can also switch the transmitter on at the start of an over with +Ctrl+ and +T+ or the TX macro button, and off again with +Ctrl+ and +R+ or the RX macro button. If you have Macros copied into or text already typed in the Transmit pane when you start the transmitter, this is sent first. Calling another station you have tuned in is as simple as pushing a button. Put his callsign into the log data (right click, select Call) and press the +ANS+ Macro button (or F2) when you are ready. If he replies, you are in business! Then press +QSO+ (F3) to start each over, and +BTU+ (F4) to end it, and +SK+ (F5) to sign off. [NOTE] ================================================================================ When typing text, the correct use of upper and lower case is important: * Modes such as RTTY and THROB have no lower case capability. * In most other modes, excessive use of upper case is considered impolite, like SHOUTING! * Modes such as PSK31, MFSK16, DominoEX and THOR use character sets which are optimised for lower case. You should use lower case as much as possible in these modes to achieve maximum text speed. In these modes upper case characters are noticeably slower to send and also slightly more prone to errors. ================================================================================ === Adjustment === Most digital modes do not require much transmitter power, as the receiver software is very sensitive. Many modes (PSK31, THROB, MT63) also require very high transmitter linearity, which is another reason to keep transmitter power below 30% of maximum. Some modes (Hellschreiber, Morse) have high peak power output, which may not indicate well on the conventional power meter, another reason to keep the average transmitted power low to prevent a very broad signal being transmitted. Adjust the transmitter output power using the TUNE button, top right, beyond the Menu. The output will be the same as the peak power in other modes. Adjust the master Volume applet Wave Out and Master Volume controls to achieve the appropriate power. Use of excessive drive will result in distortion (signal difficult to tune in, and often poorer reception) and a very broad signal. Some multi-carrier modes (MT63 for example) may require individual adjustment as the average power may be rather low. [TIP] ================================================================================ Where possible, use the area above 1200Hz on the waterfall. * Below 1200Hz the second harmonic of the transmitted audio will pass through the transmitter filters. * When using lower frequency tones, adjust the transmitter and audio level with great care, as the second (and even third) harmonic will appear in the transmitter passband, causing excessive signal width. * A narrow (CW) filter in the rig is no help in this regard, as it is only used on receive. When you do use a narrow filter, this will restrict the area over which the receiver and transmitter will operate (without retuning of course). Try adjusting the passband tuning (if available). * Keep the sound card audio level to a minimum and set the transmitter gain to a similar level used for SSB. ================================================================================ === Waterfall Tuning === When using this program, as with most other digital modes programs, tuning is generally accomplished by leaving the transceiver VFO at a popular spot (for example 14.070MHz, USB), and performing all the 'tuning' by moving around within the software. The Fldigi software has a second ``VFO'' which is tuned by clicking on the waterfall. On a busy band, you may see many signals at the same time (especially with PSK31 or Morse), and so you can click with the mouse on any one of these signals to tune it in, receive it, and if the opportunity allows, reply to the station. The software ``VFO'' operates in a transceive mode, so the transmitter signal is automatically and exactly tuned to the received frequency. If you click correctly on the signal, your reply will always be in tune with the other station. [IMPORTANT] ================================================================================ You *must not* use RIT (Clarifier) when using digital modes. * With RIT on, you will probably have to retune after every over. * Use of the RIT will also cause the other station to change frequency, and you will chase each other across the band. * Older transceivers without digital synthesis may have an unwanted offset (frequency difference) between transmit and receive frequencies. Such rigs should not be used for digital modes. ================================================================================ Wider digital modes (MT63, Olivia) can be tuned using the rig if necessary, as tuning is not at all critical. The software tuning still operates, but because the signal is so wide, there is limited ability to move around in the waterfall tuning. [[ref-special-keys]] == Special Keys == Several special keyboard controls are provided to make operating easier. .Start Transmission Press +Ctrl+ and +T+ to start transmission if there is text ready in the transmit buffer. .Pause Transmission Press +Pause+ or +Break+ while in receive, and the program will switch to transmit mode. It will continue with the text in the transmit buffer (the Transmit pane text) from the current point, i.e. where the red (previously sent) text ends and the black (yet to be sent) text begins. If the buffer only contains unsent text, then it will begin at the first character in the buffer. If the buffer is empty, the program will switch to transmit mode, and depending on the mode of operation, will send idle characters or nothing at all until characters are entered into the buffer. If you press +Pause+ or +Break+ while in transmit mode, the program will return to receive mode. There may be a slight delay for some modes like MFSK, PSK and others, that requires the transmitter to send a postamble at the end of a transmission. The transmit text buffer stays intact, ready for the +Pause+/+Break+ key to return you to the transmit mode . Pressing +Alt+ or +Meta+ and +R+ has the same effect as +Pause+/+Break+. You could think of the +Pause+/+Break+ key as a software break-in capability. .Escape Pressing +Esc+ while transmitting will abort the transmission. Transmission stops as soon as possible, (any necessary postamble is sent), and the program returns to receive. Any unsent text in the transmit buffer will be lost. [TIP] ================================================================================ If you press +Esc Esc+ (i.e. twice in quick succession), transmission stops immediately, without sending any postamble, and the program returns to receive. Any unsent text in the transmit buffer will be lost. Use this feature as an *emergency stop*. ================================================================================ .Return to Receive Press +Ctrl+ and +R+ to insert the +^r+ command in the transmit buffer at the current typing point. When transmission reaches this point, transmission will stop. .Move Typing Cursor Press +Tab+ to move the cursor (typing insertion point) to the end of the transmit buffer. This will also pause transmission. A +Tab+ press at that position moves the cursor back to the character following the last one transmitted. Morse operation is slightly different. See the {docs} for CW. .Send Any ASCII Character Press +Ctrl+ and (at the same time) any three-digit number (on the numeric keypad or the normal numeric keys) to insert the ASCII character designated by that entry value into the transmit buffer. For example, +Ctrl 177+ is ``±'' (plus/minus) and +Ctrl 176+ is ``°'' (degree). If you press a key other than the numeric keypad's 0-9 the sequence will be discarded. [[ref-credits]] [float] == Credits == Copyright (C) 2008 Murray Greenman, +ZL1BPU+. Copyright (C) 2008-2009 David Freese, +W1HKJ+. Copyright (C) 2009 Stelios Bounanos, +M0GLD+. License GPLv3+: http://www.gnu.org/licenses/gpl.html[GNU GPL version 3 or later]. //////////////////////////////////////////////////////////////////////////////// // Emacs settings // Local Variables: // mode: doc // End: //////////////////////////////////////////////////////////////////////////////// fldigi-3.21.80/doc/flarq.1.txt0000664000175000017500000000726612313064025012627 00000000000000FLARQ(1) ========= == NAME == flarq - ARQ data transfer utility for fldigi == SYNOPSIS == *flarq* ['OPTIONS'] == DESCRIPTION == *Flarq* (fast light automatic repeat request) is a file transfer application that is based on the ARQ specification developed by Paul Schmidt, K9PS. It is capable of transmitting and receiving frames of ARQ data via fldigi, as well as MultiPSK on Windows. == OPTIONS == Long options begin with two hyphens and are handled by flarq. The option names may be abbreviated to any unambiguous substring, and the option argument may be separated from the name by a space or equals sign, as per +getopt(3)+. Short options begin with a single hyphen and are passed directly to FLTK. They may be abbreviated only as indicated. *--arq-protocol* 'TYPE':: Set the ARQ protocol. May be either ``fldigi'' or ``multipsk''. Defaults to ``fldigi''. *--arq-server-address* 'HOSTNAME':: Set the ARQ TCP server address. Defaults to ``127.0.0.1''. 'HOSTNAME' may be any 'node name' string accepted by +getaddrinfo(3)+. *--arq-server-port* 'PORT':: Set the ARQ TCP server port. Defaults to ``7322''. 'PORT' may be any 'service name' string accepted by +getaddrinfo(3)+. *--debug*:: Enable debugging messages. *--version*:: Print version information and exit. *--build-info*:: Print build information and exit. *--help*:: Print options summary and exit. === Standard FLTK options === *-bg, -background* 'COLOUR':: Set the background colour. *-bg2, -background2* 'COLOUR':: Set the secondary (text) background colour. *-di, -display* 'DISPLAY':: Specifies the X server to connect to; see +X(7)+. *-dn, -dnd* or *-nodn, -nodnd*:: Enable or disable drag and drop copy and paste in text fields. *-fg, -foreground* 'COLOUR':: Set the foreground colour. *-g, -geometry* 'GEOMETRY':: Set the initial window size and position. *Flarq may not honour this option*. *-i, -iconic*:: Start flarq in iconified state. *Flarq may not honour this option*. *-k, -kbd* or *-nok, -nokbd*:: Enable or disable visible keyboard focus in non-text widgets. *-na, -name* 'CLASSNAME':: Set the window class. Defaults to ``Flarq''. *-ti, -title* 'WINDOWTITLE':: Set the window title. Defaults to ``flarq - ''. === Additional UI options === *--font* 'FONT[:SIZE]':: Set the widget font and (optionally) size. Defaults to ``sans:12''. == FILES == $HOME/.flarq:: The main settings file. The following directories are used to interface with MUAs such as Sylpheed: $HOME/Mail/ARQin:: Stores incoming email messages. $HOME/Mail/ARQout:: Stores outgoing email messages. $HOME/Mail/ARQsent:: Stores sent email messages. The following directories are used for ARQ file transfer: $HOME/ARQrecv:: Stores received files. $HOME/ARQsend:: Stores files to be transmitted. $HOME/ARQfiles/logfile.txt:: Stores transfer logs. == BUGS == * There are no command line arguments to override the default configuration file and ARQ and Mail directories. == SEE ALSO == fldigi(1), getaddrinfo(3), getopt(3), X(7) == RESOURCES == Flarq web site: http://www.w1hkj.com/flarq_main.html Fldigi web site: http://www.w1hkj.com/Fldigi.html BerliOS project page: http://developer.berlios.de/projects/fldigi/ ARQ specification by Paul Schmidt, K9PS: http://www.w1hkj.com/FlarqHelpFiles/ARQ2.pdf == AUTHORS == Flarq was written by David Freese, +W1HKJ+. This manual page was written by Stelios Bounanos . == COPYING == License GPLv3+: GNU GPL version 3 or later. //////////////////////////////////////////////////////////////////////////////// // Emacs settings // Local Variables: // mode: doc // End: //////////////////////////////////////////////////////////////////////////////// fldigi-3.21.80/doc/Makefile.in0000664000175000017500000004514712313332265012673 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2009 Stelios Bounanos, M0GLD (m0gld AT enotty DOT net) # License: GPLv3+: GNU GPL version 3 or later. VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @WANT_FLDIGI_TRUE@am__append_1 = fldigi.1 fldigi-shell.1 @WANT_FLDIGI_TRUE@am__append_2 = guide.html @WANT_FLARQ_TRUE@am__append_3 = flarq.1 @HAVE_ASCIIDOC_NO_XMLLINT_TRUE@am__append_4 = --no-xmllint subdir = doc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/intl/gettext.m4 \ $(top_srcdir)/m4/intl/iconv.m4 $(top_srcdir)/m4/intl/lib-ld.m4 \ $(top_srcdir)/m4/intl/lib-link.m4 \ $(top_srcdir)/m4/intl/lib-prefix.m4 \ $(top_srcdir)/m4/intl/nls.m4 $(top_srcdir)/m4/intl/po.m4 \ $(top_srcdir)/m4/intl/progtest.m4 \ $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/benchmark.m4 $(top_srcdir)/m4/bind.m4 \ $(top_srcdir)/m4/build.m4 $(top_srcdir)/m4/debug.m4 \ $(top_srcdir)/m4/docs.m4 $(top_srcdir)/m4/fltk.m4 \ $(top_srcdir)/m4/funcs.m4 $(top_srcdir)/m4/libintl.m4 \ $(top_srcdir)/m4/macosx.m4 $(top_srcdir)/m4/np-compat.m4 \ $(top_srcdir)/m4/opt.m4 $(top_srcdir)/m4/oss.m4 \ $(top_srcdir)/m4/pkg-config.m4 $(top_srcdir)/m4/progs.m4 \ $(top_srcdir)/m4/static.m4 $(top_srcdir)/m4/tls.m4 \ $(top_srcdir)/m4/win32.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) A2X = @A2X@ ACLOCAL = @ACLOCAL@ AC_CONFIG_ARGS = @AC_CONFIG_ARGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CFLAGS = @BFD_CFLAGS@ BFD_LIBS = @BFD_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEBUG_CFLAGS = @DEBUG_CFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTRA_LIBS = @EXTRA_LIBS@ FLARQ_AUTHORS = @FLARQ_AUTHORS@ FLARQ_BUILD_CPPFLAGS = @FLARQ_BUILD_CPPFLAGS@ FLARQ_BUILD_CXXFLAGS = @FLARQ_BUILD_CXXFLAGS@ FLARQ_BUILD_LDADD = @FLARQ_BUILD_LDADD@ FLARQ_BUILD_LDFLAGS = @FLARQ_BUILD_LDFLAGS@ FLARQ_DOCS = @FLARQ_DOCS@ FLARQ_VERSION = @FLARQ_VERSION@ FLARQ_VERSION_MAJOR = @FLARQ_VERSION_MAJOR@ FLARQ_VERSION_MINOR = @FLARQ_VERSION_MINOR@ FLARQ_VERSION_PATCH = @FLARQ_VERSION_PATCH@ FLDIGI_AUTHORS = @FLDIGI_AUTHORS@ FLDIGI_BUILD_CPPFLAGS = @FLDIGI_BUILD_CPPFLAGS@ FLDIGI_BUILD_CXXFLAGS = @FLDIGI_BUILD_CXXFLAGS@ FLDIGI_BUILD_LDADD = @FLDIGI_BUILD_LDADD@ FLDIGI_BUILD_LDFLAGS = @FLDIGI_BUILD_LDFLAGS@ FLDIGI_VERSION = @FLDIGI_VERSION@ FLDIGI_VERSION_MAJOR = @FLDIGI_VERSION_MAJOR@ FLDIGI_VERSION_MINOR = @FLDIGI_VERSION_MINOR@ FLDIGI_VERSION_PATCH = @FLDIGI_VERSION_PATCH@ FLTK_CFLAGS = @FLTK_CFLAGS@ FLTK_CONFIG = @FLTK_CONFIG@ FLTK_LIBS = @FLTK_LIBS@ FLUID = @FLUID@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ HAMLIB_CFLAGS = @HAMLIB_CFLAGS@ HAMLIB_LIBS = @HAMLIB_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_CFLAGS = @INTL_CFLAGS@ INTL_LIBS = @INTL_LIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAC_UNIVERSAL_CFLAGS = @MAC_UNIVERSAL_CFLAGS@ MAC_UNIVERSAL_LDFLAGS = @MAC_UNIVERSAL_LDFLAGS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKENSIS = @MAKENSIS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_DL = @PACKAGE_DL@ PACKAGE_DOCS = @PACKAGE_DOCS@ PACKAGE_GUIDE = @PACKAGE_GUIDE@ PACKAGE_HOME = @PACKAGE_HOME@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_NEWBUG = @PACKAGE_NEWBUG@ PACKAGE_PROJ = @PACKAGE_PROJ@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ PORTAUDIO_CFLAGS = @PORTAUDIO_CFLAGS@ PORTAUDIO_LIBS = @PORTAUDIO_LIBS@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ PTW32_CFLAGS = @PTW32_CFLAGS@ PTW32_LIBS = @PTW32_LIBS@ PULSEAUDIO_CFLAGS = @PULSEAUDIO_CFLAGS@ PULSEAUDIO_LIBS = @PULSEAUDIO_LIBS@ RDYNAMIC = @RDYNAMIC@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ X_CFLAGS = @X_CFLAGS@ X_LIBS = @X_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ASCIIDOC_CONF = asciidoc.conf ASCIIDOC_SRC = fldigi.1.txt fldigi-shell.1.txt flarq.1.txt guide.txt ASCIIDOC_MAN_DIST = fldigi.1 fldigi-shell.1 flarq.1 ASCIIDOC_MAN_INST = $(am__append_1) $(am__append_3) ASCIIDOC_HTML = $(am__append_2) EXTRA_DIST = $(ASCIIDOC_CONF) $(ASCIIDOC_SRC) $(ASCIIDOC_MAN_DIST) man_MANS = $(ASCIIDOC_MAN_INST) MOSTLYCLEANFILES = *.xml DISTCLEANFILES = $(ASCIIDOC_HTML) MAINTAINERCLEANFILES = $(ASCIIDOC_MAN_INST) A2X_ARGS = --format=manpage --destination-dir=$(builddir)/../doc \ $(am__append_4) # Additional attributes are defined in guide.conf @HAVE_ASCIIDOC_TRUE@ASCIIDOC_ARGS = --unsafe -a toc -a data-uri -a badges -a icons -a iconsdir=$(ASCIIDOC_ICONS_DIR) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man1: $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list=''; test -n "$(man1dir)" || exit 0; \ { for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am @HAVE_ASCIIDOC_FALSE@all-local: all-am: Makefile $(MANS) all-local installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ distclean distclean-generic distdir dvi dvi-am html html-am \ info info-am install install-am install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-man uninstall-man1 .SECONDEXPANSION: # Define the custom silent rule function @SILENT_CMDS@ %.1: $$@.txt $(ASCIIDOC_CONF) @HAVE_ASCIIDOC_TRUE@ $(call silent,ADOC ,$@)$(A2X) $(A2X_ARGS) $< @HAVE_ASCIIDOC_FALSE@ $(call silent,ADOC ,$@)echo '.TH "NOT-BUILT" "1" "" "" ""' > $@ # Without .SECONDEXPANSION we would use something like this: #$(ASCIIDOC_MAN_INST): asciidoc.conf # a2x $(A2X_ARGS) $@.txt #fldigi.1: fldigi.1.txt #fldigi-shell.1: fldigi-shell.1.txt # The rest of the Makefile is enabled only if we have asciidoc @HAVE_ASCIIDOC_TRUE@ASCIIDOC_ICONS_DIR ?= /usr/share/asciidoc/images/icons @HAVE_ASCIIDOC_TRUE@%.html: $$*.txt $(ASCIIDOC_CONF) @HAVE_ASCIIDOC_TRUE@ @if ! test -d $(ASCIIDOC_ICONS_DIR); then \ @HAVE_ASCIIDOC_TRUE@ echo " *** The default asciidoc icons directory, \"$(ASCIIDOC_ICONS_DIR)\", does not exist." >&2; \ @HAVE_ASCIIDOC_TRUE@ echo " *** Please rerun make with the correct ASCIIDOC_ICONS_DIR, e.g.:" >&2; \ @HAVE_ASCIIDOC_TRUE@ echo " *** make ASCIIDOC_ICONS_DIR=/path/to/icons" >&2; \ @HAVE_ASCIIDOC_TRUE@ false; \ @HAVE_ASCIIDOC_TRUE@ fi @HAVE_ASCIIDOC_TRUE@ $(call silent,ADOC ,$@)$(ASCIIDOC) $(ASCIIDOC_ARGS) --out-file $@ $< @HAVE_ASCIIDOC_TRUE@all-local: $(ASCIIDOC_MAN_DIST) $(ASCIIDOC_HTML) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fldigi-3.21.80/doc/fldigi.1.txt0000664000175000017500000003625612313064025012761 00000000000000FLDIGI(1) ========= == NAME == fldigi - digital modem program for hamradio operators == SYNOPSIS == *fldigi* ['OPTIONS'] == DESCRIPTION == *Fldigi* is a cross-platform multi-modem program for most of the digital modes used by radio amateurs today: CW, PSK, MFSK, MT-63, RTTY, Hellschreiber, DominoEX, Olivia, THOR and Throb are all supported. It can also help calibrate a sound card to a time signal and do on-air frequency measurement tests. Fldigi features basic rig control, logging, and contest operation, ``panoramic'' PSK decoding, a PSK Reporter client, and remote control via XML-RPC. == OPTIONS == Long options begin with two hyphens and are handled by fldigi. The option names may be abbreviated to any unambiguous substring, and the option argument may be separated from the name by a space or equals sign, as per +getopt(3)+. Short options begin with a single hyphen and are passed directly to FLTK. They may be abbreviated only as indicated. *--config-dir* 'DIRECTORY':: Look for and store configuration files in directory 'DIRECTORY', which is created if it does not exist. Defaults to ``$HOME/.fldigi''. *--rx-ipc-key* 'KEY':: Set the receive message queue key. May be given in hex if prefixed with ``0x''. Defaults to ``9876'' or ``0x2694''. *--tx-ipc-key* 'KEY':: Set the transmit message queue key. May be given in hex if prefixed with ``0x''. Defaults to ``6789'' or ``0x1a85''. *--arq-server-address* 'HOSTNAME':: Set the ARQ TCP server address. Defaults to ``127.0.0.1''. 'HOSTNAME' may be any 'node name' string accepted by +getaddrinfo(3)+. *--arq-server-port* 'PORT':: Set the ARQ TCP server port. Defaults to ``7322''. 'PORT' may be any 'service name' string accepted by +getaddrinfo(3)+. [NOTE] ================================================================================ The '--xmlrpc-*' options are only available if fldigi was built with XML-RPC support. ================================================================================ *--xmlrpc-server-address* 'HOSTNAME':: Set the XML-RPC server address. Defaults to ``127.0.0.1''. *--xmlrpc-server-port* 'PORT':: Set the XML-RPC server port. Defaults to ``7362''. *--xmlrpc-allow* 'REGEX':: Allow only the methods whose names match 'REGEX'. 'REGEX' is a POSIX extended regular expression. *--xmlrpc-deny* 'REGEX':: Allow only the methods whose names do not match 'REGEX'. *--xmlrpc-list*:: List all available XML-RPC methods and exit. May be preceded by the '--xmlrpc-allow' or '--xmlrpc-deny' options to verify their effect. *--cpu-speed-test*:: Perform the CPU speed test that is normally done when fldigi is run without an existing configuration directory. Results are shown in the event log and options may be changed to the recommended values for the measured CPU speed. *--noise*:: Unhide controls for adding noise to the transmitted signal. *--wfall-only*:: Hide all main window widgets except the menu bar and waterfall (with its associated controls). Meant to be used with external programs that control fldigi with XML-RPC. *--debug-level* 'LEVEL':: Set the event log verbosity. 'LEVEL' is clamped to the range [0,5]; for 'Quiet', 'Error', 'Warning', 'Info', 'Verbose' and 'Debug'. Defaults to ``3'' ('Info'). *--version*:: Print version information and exit. *--build-info*:: Print build information and exit. *--help*:: Print options summary and exit. === Standard FLTK options === *-bg, -background* 'COLOUR':: Set the background colour. *-bg2, -background2* 'COLOUR':: Set the secondary (text) background colour. *-di, -display* 'DISPLAY':: Specifies the X server to connect to; see +X(7)+. *-dn, -dnd* or *-nodn, -nodnd*:: Enable or disable drag and drop copy and paste in text fields. *-fg, -foreground* 'COLOUR':: Set the foreground colour. *-g, -geometry* 'GEOMETRY':: Set the initial window size and position. *Fldigi may not honour this option*. *-i, -iconic*:: Start fldigi in iconified state. *Fldigi may not honour this option*. *-k, -kbd* or *-nok, -nokbd*:: Enable or disable visible keyboard focus in non-text widgets. *-na, -name* 'CLASSNAME':: Set the window class. Defaults to ``Fldigi''. *-ti, -title* 'WINDOWTITLE':: Set the window title. Defaults to ``fldigi - ''. === Additional UI options === *--font* 'FONT[:SIZE]':: Set the widget font and (optionally) size. Defaults to ``sans:12''. === Options useful to developers === [NOTE] ================================================================================ The --benchmark-* options are only enabled if fldigi was built (exclusively) for benchmarking and batch decoding. ================================================================================ *--benchmark-modem* 'ID':: Specify the modem. Defaults to ``25'' (``BPSK31''). *--benchmark-frequency* 'FREQ':: Set the modem frequency in Hz. Defaults to ``1000''. *--benchmark-afc* 'BOOLEAN':: Enable or disable modem AFC. Defaults to ``false''. *--benchmark-squelch* 'BOOLEAN':: Enable or disable modem squelch. Defaults to ``false''. *--benchmark-squelch-level* 'LEVEL':: Set the modem squelch level (1--100%). Defaults to ``0.0''. *--benchmark-input* 'INPUT':: Specify the input. Must be a positive integer indicating the number of samples of silence to generate as the input, or, if fldigi was linked with libsndfile, the name of the input audio file. The filename must contain non-digit characters. *--benchmark-output* 'FILE':: Specify the output data file. Non-textual output (i.e. Hellschreiber or MFSK images) cannot be saved. Default: decoder output is discarded. *--benchmark-src-ratio* 'RATIO':: Specify the sample rate conversion ratio. Defaults to ``1.0'' (input is not resampled). *--benchmark-src-type* 'TYPE':: Set the sample rate conversion type. TYPE is an integer in the range [0,4]. Defaults to ``2'' (``Fastest SINC Interpolator''). [WARNING] ================================================================================ *The following options should not be relied upon. They are listed here only for the sake of completeness, and may be replaced by GUI settings or removed altogether in a future version.* ================================================================================ *--wfall-width* 'WIDTH':: Set the waterfall width. *--wfall-height* 'HEIGHT':: Set the waterfall height. *--window-width* 'WIDTH':: Set the minimum window width. *--window-height* 'HEIGHT':: Set the minimum window height. *--exit-after* 'SECONDS':: Run for approximately 'SECONDS' seconds. *--frames-per-buffer* 'FRAMES':: Set frames per buffer option to 'FRAMES' when creating PortAudio streams. Defaults to ``0'' (let PortAudio choose). == ENVIRONMENT == Fldigi uses several environment variables, mainly set for child processes created by the macro and the notifier. === General variables === FLDIGI_BROWSER:: The web browser to use for http and file URIs. Overrides +$BROWSER+ and +xdg-open(1)+. === Macro variables === The following variables are created in the environment of the child process that is forked by the '' macro. They are empty if values are not available. FLDIGI_RX_IPC_KEY:: The receive message queue key. FLDIGI_TX_IPC_KEY:: The transmit message queue key. FLDIGI_XMLRPC_ADDRESS:: The XML-RPC server address string. FLDIGI_XMLRPC_PORT:: The XML-RPC server port string. FLDIGI_ARQ_ADDRESS:: The ARQ server address string. FLDIGI_ARQ_PORT:: The ARQ server port string. FLDIGI_VERSION:: The version string. FLDIGI_PID:: The process ID of the parent fldigi process. FLDIGI_CONFIG_DIR:: The configuration directory. FLDIGI_MY_CALL:: The operator's callsign. FLDIGI_MY_NAME:: The operator's name. FLDIGI_MY_LOCATOR:: The operator's IARU (Maidenhead) locator. FLDIGI_MODEM:: The short modem name. FLDIGI_MODEM_LONG_NAME:: The long modem name. FLDIGI_DIAL_FREQUENCY:: The rig (radio) frequency. FLDIGI_AUDIO_FREQUENCY:: The modem (audio) centre frequency. FLDIGI_FREQUENCY:: The actual receive/transmit frequency, i.e. the sum of rig and modem frequencies taking into account the rig sideband. FLDIGI_LOG_FREQUENCY:: The text (frequency in MHz) contained in the 'QSO Freq' log field. FLDIGI_LOG_TIME_ON:: The text (QSO start time) contained in the (time) 'On' log field. FLDIGI_LOG_TIME_OFF:: The text (QSO end time) contained in the (time) 'Off' log field. FLDIGI_LOG_CALL:: The text (other station's callsign) contained in the 'Call' log field. FLDIGI_LOG_NAME:: The text (other station's name) contained in the 'Name' log field. FLDIGI_LOG_RST_IN:: The text (received RST) contained in the (RST) 'In' log field. FLDIGI_LOG_RST_OUT:: The text (sent RST) contained in the (RST) 'Out' log field. FLDIGI_LOG_QTH:: The text (other station's QTH) contained in the 'QTH' log field. FLDIGI_LOG_LOCATOR:: The text (other station's Maidenhead locator) contained in the 'Loc' log field. FLDIGI_LOG_NOTES:: The text (free-form notes) contained in the 'Notes' log field. FLDIGI_AZ:: The text (azimuth in degrees to other station) contained in the 'Az' log field. === Notifier variables === The following variables are created in the environment of child processes created by the notifier. FLDIGI_NOTIFY_STRi:: These variables (i in [0,9]) contain substrings matched by capturing groups in the event's regular expression. 0 contains the whole matched text. FLDIGI_NOTIFY_STR_NUM:: The number of substrings available. FLDIGI_NOTIFY_CALLSIGN:: Builtin event types that match callsigns will place the callsign in this variable. FLDIGI_NOTIFY_TEXT:: The complete string that matched the event's regular expression. FLDIGI_NOTIFY_AUDIO_FREQUENCY:: The modem frequency. FLDIGI_NOTIFY_EVENT:: The event type. FLDIGI_NOTIFY_COUNTRY:: The station's country name (for events of type "station heard twice"). === Debugging variables === The following variables are only used if fldigi was built with debugging support ('--enable-debug'), or they are only useful when debugging specific modules. FLDIGI_NO_EXEC:: If set, this variable disables glibc's malloc debugging, which fldigi enables by default when built for debugging. FLDIGI_TRACE_LOCKS:: Traces 'Fl::lock()' calls. FLDIGI_HAMLIB_DEBUG:: Initialises hamlib in debug mode. == RESTRICTIONS == Fldigi is licensed under the GNU GPL, which grants you the right to run the program for any purpose (freedom 0). However, permission to use it for the transmission of radio signals can only be obtained from the communications authority of your country. When given, this permission almost always comes in the form of an amateur radio license. If you do not have an amateur radio license you can still have fun using fldigi as a shortwave listener. One way to do so is by using the builtin PSK Reporter client to submit realtime spots of transmitting stations; see RESOURCES below. All you need is a computer, homebrew SDR receiver, and simple wire antenna! == FILES == Various files and subdirectories are created in $HOME/.fldigi. Some of the most interesting ones are listed below. fldigi_def.xml:: The main settings file. fldigi.prefs:: The ``status'' file. Stores window geometries, button states, current modem, current audio frequency, squelch level, and so on. status_log.txt:: The event log. macros/macros.mdf:: The default macro file. palettes/:: This directory contains waterfall palettes. scripts/:: This directory is added to the PATH environment variable of the child process that runs macros. logs/:: This directory contains logged received and sent text (when such logging is enabled), including the default logbook database, logbook.adif. images/:: Received MFSK images are automatically saved in this directory. freqanalysis.csv:: This file is written by the frequency analysis modem. The fields are dial frequency, audio frequency, and offset. See documentation for details. [NOTE] ================================================================================ The following files are used if present. They must be downloaded and copied to ~/.fldigi/ by the user. ================================================================================ cty.dat:: List of DXCC entities and callsign prefixes; used to display tooltips in the received text buffer, and also to auto-fill the Country, Locator and Azimuth log fields. Available at http://www.country-files.com/cty/. lotw1.txt:: List of known LOTW users (one callsign per line); used for the received text tooltips. Available at http://www.hb9bza.net/lotw/. AGMemberList.txt or eqsl.txt:: List of ``Authenticity Guaranteed'' eQSL users (one callsign per line); used for the received text tooltips. Available at http://www.eqsl.cc/QSLcard/Programming.cfm. == EXAMPLES == +fldigi --wfall-height 144 --font sans:11 -fg "#c0c0c0" -bg "#5f5f63" -bg2 "#19213b"+:: This is how the author of this document invokes fldigi. +fldigi --xmlrpc-deny "main.(tx|tune|run_macro)"+:: Unregister XML-RPC methods that may transmit. +ssh -L 7362:localhost:7362 remote-host xvfb-run fldigi -display :99+:: Start fldigi on 'remote-host' under a ``fake'' X server. (The +xvfb-run(1)+ utility is available on Debian systems). The remote ``headless'' fldigi is then controlled via XML-RPC on port 7362, e.g. using +fldigi-shell(1)+. +fldigi --benchmark-input 480000 --benchmark-modem 1+:: Benchmark the DominoEX-4 modem with 480K audio samples. +fldigi --benchmark-input audio.wav --benchmark-modem 25 --benchmark-frequency 1500 --benchmark-afc 1 --benchmark-squelch 1 --benchmark-squelch-level 5.0 --benchmark-output out.txt+:: Read 'audio.wav' (whose sample rate must be 8000Hz in this case) and decode BPSK-31 signals at 1500Hz. AFC is enabled and the squelch is set to 5%. Decoded text is saved to 'out.txt'. == BUGS == Yes. == SEE ALSO == fldigi-shell(1), gmfsk(1), gpsk31(1), grig(1), rigctl(1), xlog(1), getaddrinfo(3), getopt(3), regex(7), X(7) == RESOURCES == Main web site: http://www.w1hkj.com/Fldigi.html BerliOS project page: http://developer.berlios.de/projects/fldigi/ Wiki and bug tracker: https://fedorahosted.org/fldigi/ More information on MFSK16, DominoEX and other digital modes can be found at http://www.qsl.net/zl1bpu/ and http://www.w1hkj.com/FldigiHelp/Modes/index.htm The PSK Automatic Propagation Reporter site can be found at http://www.pskreporter.info/ == AUTHORS == Fldigi was written by:: ________________________________________________________________________________ * David Freese, +W1HKJ+. * Stelios Bounanos, +M0GLD+. * Leigh L. Klotz, Jr., +WA5ZNU+. ________________________________________________________________________________ Fldigi also includes code written by others. Among them are::: ________________________________________________________________________________ * Tomi Manninen, +OH2BNS+. * Pawel Jalocha, +SP9VRC+. * Hamish Moffatt, +VK3SB+. ________________________________________________________________________________ +++ +++ This manual page was written by Stelios Bounanos . == COPYING == License GPLv3+: GNU GPL version 3 or later. //////////////////////////////////////////////////////////////////////////////// // Emacs settings // Local Variables: // mode: doc // End: //////////////////////////////////////////////////////////////////////////////// fldigi-3.21.80/doc/flarq.10000664000175000017500000000003512313305572012001 00000000000000.TH "NOT-BUILT" "1" "" "" "" fldigi-3.21.80/doc/asciidoc.conf0000664000175000017500000000003312313064025013230 00000000000000[miscellaneous] newline=\n fldigi-3.21.80/doc/fldigi.10000664000175000017500000000003512313305572012132 00000000000000.TH "NOT-BUILT" "1" "" "" "" fldigi-3.21.80/doc/fldigi-shell.1.txt0000664000175000017500000000712612313064025014060 00000000000000FLDIGI-SHELL(1) =============== == NAME == fldigi-shell - program for controlling fldigi == SYNOPSIS == *fldigi-shell* ['OPTIONS'] ['FILE'] == DESCRIPTION == The fldigi-shell program controls +fldigi(1)+ over HTTP via XML-encoded remote procedure calls (XML-RPC). It can call any XML-RPC method exported by fldigi, and also defines some useful commands of its own. == OPTIONS == *-d*:: Enable debug output. *-u* 'URL':: Use 'URL' to access the server. Defaults to ``http://localhost:7362/RPC2'', which corresponds to fldigi's default listen address and port. *-c* 'COMMAND':: Execute command 'COMMAND' and exit. == COMMANDS == [NOTE] ================================================================================ The ``x:yz'' notation refers to the return type and argument type(s). They are: ``n'' (nil), ``i'' (integer), and ``s'' (string). ================================================================================ debug (n:n:):: Toggle debug output. eval (s:s):: Evaluate Perl code. exit (n:n):: Exit the shell. help (n:n):: Print help for server (fldigi) methods and shell commands. history (s:n):: Print command history. modems (s:n):: List all modem names. poll (s:i):: Poll for new received text every 'i' seconds. Defaults to '1'. pskrqsy (n:si):: QSY to 'i'^th^ best frequency for grid 's'. The list of frequencies is retrieved from the PSK Reporter website; see *RESOURCES*. The grid square string may be left empty, and the index argument defaults to '0' (first frequency). recvtext (s:n):: Get all received text. reinit (n:n):: Fetch commands from the server and rebuild command list. send (n:s):: Send text interactively, one line at a time. sendchar (n:s):: Send text interactively, one character at a time. sendfile (n:s):: Send text read from file 's'. sendstr (n:s):: Send string 's'. source (n:s):: Read commands from file 's'. time (s:s):: Time a command. wait (n:s):: Wait for server TRX state to become 's'. == EXTENDED DESCRIPTION == The shell has three modes of operation: . Interactive mode with history, tab completion and command line editing. This is the default mode when fldigi-shell is run without arguments. . Batch mode for a single command with the *-c* option. . Batch mode to ``source'' a file containing Perl code. Fldigi-shell commands can be called using ``execute("COMMAND [ARG ...]")'' calls. == FILES == $HOME/.fldigi/shell-history:: Contains the fldigi-shell command history. == EXAMPLES == +while :; do fldigi-shell -c pskrqsy; sleep 900; done+:: Change to the ``best frequency'' (see PSK Reporter) every fifteen minutes. == SEE ALSO == fldigi(1), xmlrpc(1), readline(3), RPC::XML(3pm) == BUGS == * Some additional command wrappers are needed. * Command completion should be enabled for the arguments of some commands. * The XML-RPC handling code should probably go in a separate module. * It should be possible to pass multiple '-c CMD' arguments. == RESOURCES == Fldigi web site: http://www.w1hkj.com/Fldigi.html The PSK Automatic Propagation Reporter site can be found at http://www.pskreporter.info/ The GNU Readline Library: http://directory.fsf.org/project/readline/ XML-RPC home page: http://www.xmlrpc.com/ == AUTHOR == Fldigi-shell and this manual page were written by Stelios Bounanos, +M0GLD+ . == COPYING == License GPLv2+: GNU GPL version 2 or later. //////////////////////////////////////////////////////////////////////////////// // Emacs settings // Local Variables: // mode: doc // End: //////////////////////////////////////////////////////////////////////////////// fldigi-3.21.80/doc/fldigi-shell.10000664000175000017500000000003512313305572013237 00000000000000.TH "NOT-BUILT" "1" "" "" "" fldigi-3.21.80/data/0000775000175000017500000000000012313333727011043 500000000000000fldigi-3.21.80/data/station_table.txt0000664000175000017500000101433612313064025014354 00000000000000# STATION_ID | OWNER | TTYPE | HULL | NAME | PAYLOAD | LOCATION | TIMEZONE | FORECAST | NOTE # 0y2w3|CG|Weather Station||Sturgeon Bay CG Station, WS||44.794 N 87.313 W (44°47'40" N 87°18'47" W)|C| | 13001|PR|Atlas Buoy|PM-595|NE Extension||12.000 N 23.000 W (12°0'0" N 23°0'0" W)|| | 13002|PR|Atlas Buoy||NE Extension||21.000 N 23.000 W (21°0'0" N 23°0'0" W)|| | 13008|PR|Atlas Buoy|PM-531|Reggae||15.000 N 38.000 W (15°0'0" N 38°0'0" W)|| | 13009|PR|Atlas Buoy|PM-533|Lambada||8.000 N 38.000 W (8°0'0" N 38°0'0" W)|| | 13010|PR|Atlas Buoy|PM-590|Soul||0.000 N 0.000 E (0°0'0" N 0°0'0" E)|| | 15001|PR|Atlas Buoy|PM-597|Gavotte||10.000 S 10.000 W (10°0'0" S 10°0'0" W)|| | 15002|PR|Atlas Buoy|PM-591|Java||0.000 N 10.000 W (0°0'0" N 10°0'0" W)|| | 15006|PR|Atlas Buoy|PM-593|Valse||6.000 S 10.000 W (6°0'0" S 10°0'0" W)|| | 15007|PR|Atlas Buoy|PM-605A|SE Extension||6.000 S 8.000 E (6°0'0" S 8°0'0" E)|| | 15319|CT|Fixed Drilling Platform||Sanha - WANE 25947||5.583 S 11.833 E (5°35'0" S 11°50'0" E)|?| | 21178|JM|Buoy||South of Shikoku||33.120 N 133.620 E (33°7'12" N 133°37'12" E)|?| | 21401|HY|STB - SAIC Tsunami Buoy||250NM Southeast of Iturup Island|STB payload|42.617 N 152.583 E (42°37'0" N 152°35'0" E)|?| |This station was established on 11/08/2010. 21413|N|2.6-meter discus buoy|2.6D20|690 NM Southeast of Tokyo, Japan|DART II payload|30.515 N 152.117 E (30°30'55" N 152°7'1" E)|?| | 21414|N|2.6-meter discus buoy|2.6D49|NW Pacific|DART II payload|48.948 N 178.263 E (48°56'54" N 178°15'48" E)|?| | 21415|N|2.6-meter discus buoy|2.6D06|175 NM S of Attu AK|DART II payload|50.183 N 171.847 E (50°11'0" N 171°50'48" E)|?| | 21416|N|2.6-meter discus buoy|2.6D33|240NM SE of Kamchatka Peninsula|DART II payload|48.058 N 163.505 E (48°3'30" N 163°30'18" E)|?| | 21417|N|2.6-meter discus buoy|26D38|290NM SE of the Kuril Islands|DART II payload|43.192 N 157.142 E (43°11'30" N 157°8'30" E)|?| |

Station 21417 has been disestablished 7/05/2009, replaced by station 21419 92NM to the Northeast.

21418|N|2.6-meter discus buoy|26D42|450 NM NE of Tokyo, Japan|DART II payload|38.711 N 148.694 E (38°42'38" N 148°41'37" E)|?| |DART station 21418 has been declared inoperative as of 9/1/2012 due to spiking issues. It will be entered into the maintenance schedule for service. 21419|N|2.6-meter discus buoy|2.6D21|209NM SE of KURIL ISLANDS|DART II payload|44.455 N 155.736 E (44°27'18" N 155°44'8" E)|P| | 21595|JM|Drifting Buoy||Drifter||36.700 N 132.167 W (36°42'0" N 132°10'0" W)|?| | 21597|JM|Drifting Buoy||Drifter||32.800 N 155.200 E (32°48'0" N 155°12'0" E)|?| | 21598|JM|Drifting Buoy||Drifter||31.300 N 152.700 E (31°18'0" N 152°42'0" E)|?| | 21600|JM|Drifting Buoy||Drifter||40.700 N 154.500 E (40°42'0" N 154°30'0" E)|?| | 21636|JM|Drifting Buoy||Drifter||31.500 N 127.400 E (31°30'0" N 127°24'0" E)|?| | 21637|JM|Drifting Buoy||Drifter||29.300 N 141.250 E (29°18'0" N 141°15'0" E)|?| | 21640|JM|Drifting Buoy||Drifter||28.300 N 135.500 E (28°18'0" N 135°30'0" E)|?| | 21707|JM|Drifting Buoy||||25.000 N 136.000 E (25°0'0" N 136°0'0" E)|?| | 22101|KO|Buoy||||37.230 N 126.020 E (37°13'48" N 126°1'12" E)|?| | 22102|KO|Buoy||||34.800 N 125.770 E (34°48'0" N 125°46'12" E)|?| | 22103|KO|Buoy||||34.000 N 127.500 E (34°0'0" N 127°30'0" E)|?| | 22104|KO|Buoy||||34.770 N 128.900 E (34°46'12" N 128°54'0" E)|?| | 22105|KO|Buoy||||37.530 N 130.000 E (37°31'48" N 130°0'0" E)|?| | 22106|KO|Buoy||||36.350 N 129.780 E (36°21'0" N 129°46'48" E)|?| | 22107|KO|Buoy||||33.080 N 126.030 E (33°4'48" N 126°1'48" E)|?| | 22108|KO|Buoy||||36.250 N 125.750 E (36°15'0" N 125°45'0" E)|?| | 23020|KA|Buoy|2.8DX1|Red Sea|WAMDAS payload|22.162 N 38.500 E (22°9'43" N 38°30'0" E)|?| | 23227|IS|STB - SAIC Tsunami Buoy||Bay of Bengal|SAIC Tsunami Buoy (STB) with DART II BPR|6.255 N 88.792 E (6°15'17" N 88°47'31" E)|?| | 23228|IS|STB - SAIC Tsunami Buoy||Arabian Sea|SAIC Tsunami Buoy (STB) with DART II BPR|20.799 N 65.347 E (20°47'55" N 65°20'48" E)|?| | 23401|TH|STB - SAIC Tsunami Buoy||600 NM West-Northwest of Phuket, Thailand|DART II payload|8.905 N 88.540 E (8°54'18" N 88°32'24" E)|?| | 28401|PM|Buoy||Kuroshio Extension Observatory (KEO)||32.400 N 144.600 E (32°24'0" N 144°36'0" E)|?| | 28900|UW|Sea Glider||SG168||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 28901|UW|Sea Glider||SG169||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 28902|UW|Sea Glider||SG176||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 28903|UW|Sea Glider||SG182||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 28904|UW|Sea Glider||SG140||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 28905|UW|Sea Glider||SG122||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 31001|PR|Atlas Buoy|PM-527|Samba||0.000 N 35.000 W (0°0'0" N 35°0'0" W)|| | 31002|PR|Atlas Buoy|PM-541|Frevo||4.000 N 38.000 W (4°0'0" N 38°0'0" W)|| | 31003|PR|Atlas Buoy|PM-542|SW Extension||8.000 S 30.000 W (8°0'0" S 30°0'0" W)|| | 31004|PR|Atlas Buoy|PM-543|SW Extension||14.000 S 32.000 W (14°0'0" S 32°0'0" W)|| | 31005|PR|Atlas Buoy|PM-544|SW Extension||19.000 S 34.000 W (19°0'0" S 34°0'0" W)|| | 31006|PR|Atlas Buoy|PM-598|NE Extension||4.000 N 23.000 W (4°0'0" N 23°0'0" W)|| | 31007|PR|Atlas Buoy|PM-599|Jazz||0.000 N 23.000 W (0°0'0" N 23°0'0" W)|| | 31201|R|Waverider Buoy||Floripa, Brazil (109)||27.705 S 48.134 W (27°42'17" S 48°8'2" W)|?| | 31260|HC|Buoy||||23.031 S 43.088 W (23°1'52" S 43°5'17" W)|| |This buoy was removed from its old location near 28.485S  47.522W and was re-deployed on 1/14/2010 near 23.031S  43.088W. 31261|IP|Buoy||||31.538 S 49.862 W (31°32'17" S 49°51'43" W)|| | 31478|IP|Buoy||||22.882 S 43.132 W (22°52'55" S 43°7'54" W)|| | 32012|WH|2.4-meter discus buoy|24DX2|Woods Hole Stratus Wave Station |WAMDAS payload|19.691 S 85.567 W (19°41'28" S 85°34'1" W)|C| |

For meteorological data at this station, see 32ST0.

32066|IR|2.6-meter discus buoy||Ecuador INOCAR|EBM22TS (MSM Tsunami Warning System, Compatible with NOAA payload)|1.130 S 81.769 W (1°7'47" S 81°46'7" W)|?| | 32301|N|3-meter discus buoy|||DACT payload|9.900 S 105.200 W (9°54'0" S 105°12'0" W)|C| | 32302|N|3-meter discus buoy|||DACT payload|18.000 S 85.100 W (18°0'0" S 85°5'59" W)|C| | 32401|E|2.6-meter discus buoy||260 NM West-Southwest of Arica Chile|DART II payload|19.297 S 74.746 W (19°17'50" S 74°44'44" W)|?| |

This station is operative as of 12/2/2011

32411|N|2.6-meter discus buoy|2.6D46|710 NM West-Southwest of Panama City, Panama|DART II payload|4.999 N 90.841 W (4°59'58" N 90°50'27" W)|?| |Station 32411 has stopped transmitting water column height and event data since 5/12/12. It will be restored to service when it can be worked into the Maintenance Schedule . 32412|N|2.6-meter discus buoy|2.6D47|630 NM Southwest of Lima, Peru|DART II payload|17.975 S 86.392 W (17°58'30" S 86°23'30" W)|| | 32413|N|2.6-meter discus buoy|2.6D77|1000 NM WestNorthwest of Lima, Peru|DART II payload|7.397 S 93.500 W (7°23'48" S 93°30'0" W)|| |

This station was established 8/23/2010 which replaces 51406 in the DART array.

32487|DC|Offshore Buoy||Buenaventura, Colombia||3.517 N 77.737 W (3°31'0" N 77°44'13" W)|E| | 32488|DC|Offshore Buoy||Bahia Solano, Colombia||6.258 N 77.511 W (6°15'27" N 77°30'40" W)|E| | 32745|N|Drifting Buoy||TAO Buoy Adrift||2.109 N 95.316 W (2°6'33" N 95°18'59" W)|?| | 32746|N|Buoy||TAO Buoy Adrift||5.000 S 110.000 W (5°0'0" S 110°0'0" W)|?| |Buoy was recovered on 11/14/2008. 32st0|WH|Ocean Reference Station||Stratus||19.713 S 85.585 W (19°42'46" S 85°35'7" W)|?| |For wave data at this station, see 32012. 41001|N|3-meter discus buoy|3DV10|150 NM East of Cape HATTERAS|ARES payload|34.561 N 72.631 W (34°33'40" N 72°37'50" W)|E|FZNT22.KWBC | 41002|N|3-meter discus buoy|3D70|S HATTERAS - 250 NM East of Charleston, SC|AMPS payload|31.862 N 74.835 W (31°51'42" N 74°50'6" W)|E|FZNT22.KWBC |



 

41003|N|6-meter NOMAD buoy|||MVXII payload|30.400 N 80.100 W (30°23'60" N 80°5'60" W)|E| |(formerly eb05) 41004|N|3-meter discus buoy|3D37|EDISTO - 41 NM Southeast of Charleston, SC|AMPS payload|32.501 N 79.099 W (32°30'2" N 79°5'58" W)|E|FZUS52.KCHS FZNT22.KWBC|
  41005|N|6-meter NOMAD buoy|||GSBP payload|31.700 N 79.700 W (31°41'60" N 79°42'0" W)|E| | 41006|N|6-meter NOMAD buoy|||GSBP payload|29.300 N 77.400 W (29°18'0" N 77°24'0" W)|E| | 41007|N|3-meter discus buoy|||DACT payload|34.200 N 76.500 W (34°12'0" N 76°30'0" W)|E| | 41008|N|3-meter discus buoy|3D36|GRAYS REEF - 40 NM Southeast of Savannah, GA|AMPS payload|31.402 N 80.869 W (31°24'9" N 80°52'9" W)|E|FZUS52.KCHS |

This buoy is located in Gray's Reef National Marine Sanctuary

The southern third of NOAA's 22-square mile Gray's Reef National Marine Sanctuary has be designated a research area specifically designed for conducting controlled scientific studies where human activities cannot affect the results. Fishing and diving will be prohibited in the lightly used, 8-square mile research area. Vessels are permitted to travel through it without stopping. For complete information, go the Gray's Reef website at graysreef.noaa.gov  

LINK TO PMEL's pCO2 SITE for their data on this Station: http://www.pmel.noaa.gov/co2/coastal/NDBC_41008/data_081w_14d.htm

NDBC ADCPs are now quality controlled using automated methods. Historical and forty-five day files beginning 1 June 2010 are available in a new format that contains more QC information.  The forty-five day files in the old format will be resident until approximately 31 July 2010. 

41009|N|6-meter NOMAD buoy|6N23|CANAVERAL 20 NM East of Cape Canaveral, FL|ARES payload|28.519 N 80.166 W (28°31'9" N 80°9'59" W)|E|FZUS52.KMLB |Station 41009 went adrift on 06/25/2012 and the last report from its moored position was at 21Z. It has been retrieved as of 12Z, 6/29/12. This buoy will be restored to service when it can be worked into the schedule. When the service date is known, it will be posted in the  maintenance report. 
Going to Oculina Bank? Please review Oculina fishing regulations

Right whales are active off FL. Speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the U.S. East Coast.  It is illegal to approach right whales within 500 yards.  To learn more about right whales and rules protecting them, go to: http://www.nmfs.noaa.gov/pr/shipstrike/ 41010|N|6-meter NOMAD buoy|6N26|CANAVERAL EAST 120NM East of Cape Canaveral|ARES payload|28.906 N 78.471 W (28°54'22" N 78°28'16" W)|E|FZNT23.KNHC |
  41011|N|6-meter NOMAD buoy|||DACT payload|28.200 N 80.100 W (28°11'60" N 80°5'60" W)|E| | 41012|N|3-meter discus buoy|3D72|St. Augustine, FL 40NM ENE of St Augustine, FL|AMPS payload|30.042 N 80.534 W (30°2'32" N 80°32'1" W)|E|FZUS52.KJAX |NDBC ADCPs are now quality controlled using automated methods. Historical and forty-five day files beginning 1 June 2010 are available in a new format that contains more QC information.  The forty-five day files in the old format will be resident until approximately 31 July 2010.

Right whales are active off FL. Speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the U.S. East Coast.  It is illegal to approach right whales within 500 yards.  To learn more about right whales and rules protecting them, go to: http://www.nmfs.noaa.gov/pr/shipstrike/ 41013|N|3-meter discus buoy|3D55|Frying Pan Shoals, NC Buoy|AMPS payload|33.436 N 77.743 W (33°26'11" N 77°44'35" W)|E|FZUS52.KILM FZUS52.KMHX|
  41015|N|3-meter discus buoy|||DACT payload|35.400 N 75.300 W (35°23'60" N 75°17'60" W)|E| | 41016|N|12-meter discus buoy|||GSBP payload|24.600 N 76.500 W (24°36'0" N 76°30'0" W)|E| | 41017|N|3-meter discus buoy|||DACT payload|35.400 N 75.100 W (35°23'60" N 75°5'60" W)|E| | 41018|N|3-meter discus buoy|||DACT payload|15.000 N 75.000 W (15°0'0" N 75°0'0" W)|E| | 41021|N|3-meter discus buoy|48|Olympic Northeast|VEEP payload|31.920 N 80.850 W (31°55'12" N 80°50'60" W)|E| | 41022|N|3-meter discus buoy|52|Olympic Southwest|VEEP payload|31.890 N 80.860 W (31°53'24" N 80°51'36" W)|E| | 41023|N|3-meter discus buoy|52|Olympic Southwest|VEEP payload|31.920 N 80.930 W (31°55'12" N 80°55'48" W)|E| | 41024|A|Offshore Buoy||Sunset Nearshore (SUN 2)||33.848 N 78.489 W (33°50'52" N 78°29'21" W)|E|FZUS52.KILM |
  41025|N|3-meter discus buoy|3D42|Diamond Shoals|ARES payload|35.006 N 75.402 W (35°0'22" N 75°24'7" W)|E|FZUS52.KMHX |This buoy is located in the Monitor National Marine Sanctuary.

41026|PR|Atlas Buoy|PM-529|Forro||12.000 N 38.000 W (12°0'0" N 38°0'0" W)|| | 41027|A|Offshore Buoy||Sunset Mid-Shelf (SUN 3)||33.302 N 78.137 W (33°18'7" N 78°8'14" W)|E|FZUS52.KILM FZNT22.KWBC|
  41029|A|Offshore Buoy||Capers Nearshore (CAP 2)||32.810 N 79.630 W (32°48'36" N 79°37'48" W)|E|FZUS52.KCHS |
  41030|A|Offshore Buoy||Capers Mid-Shelf (CAP 3)||32.520 N 79.340 W (32°31'12" N 79°20'24" W)|E|FZUS52.KCHS |
  41033|A|Offshore Buoy||Fripp Nearshore (FRP 2)||32.280 N 80.410 W (32°16'48" N 80°24'36" W)|E|FZUS52.KCHS |
  41035|N|3-meter discus buoy|3D85|Onslow Bay Inner, NC|ARES payload|34.476 N 77.280 W (34°28'34" N 77°16'47" W)|E|FZUS52.KMHX |


The buoy at station 41035 has been recovered and dis-established as of 8/22/11. See station 41036 that is moored 23NM to the south and east for data in the Onslow Bay area.


 

41036|N|3-meter discus buoy|3D49|Onslow Bay Outer, NC|AMPS payload|34.207 N 76.949 W (34°12'25" N 76°56'56" W)|E|FZUS52.KMHX |
  41037|CR|Offshore Buoy||ILM3 - 27 miles SE of Wrightsville Beach, NC||33.991 N 77.360 W (33°59'26" N 77°21'35" W)|E| |
  41038|CR|Offshore Buoy||ILM2 - 5 miles SE of Wrightsville Beach, NC||34.141 N 77.715 W (34°8'27" N 77°42'53" W)|E| |
  41040|N|6-meter NOMAD buoy|6N57|West Atlantic|ARES payload|14.477 N 53.008 W (14°28'38" N 53°0'28" W)|?|FZNT23.KNHC | 41041|N|6-meter NOMAD buoy|6N58|Middle Atlantic|ARES payload|14.175 N 45.998 W (14°10'30" N 45°59'53" W)|?|FZNT02.KNHC | 41043|N|3-meter discus buoy|3D29|South Western Atlantic|AMPS payload|21.061 N 64.966 W (21°3'39" N 64°57'59" W)|N|FZNT23.KNHC | 41044|N|6-meter NOMAD buoy|6N50|South Atlantic|ARES 4.4 payload|21.639 N 58.614 W (21°38'20" N 58°36'50" W)|N|FZNT02.KNHC |On 5/07/12, the buoy was re-deployed about 4 nm east-southeast of its previous location.
41046|N|6-meter NOMAD buoy|6N59|E Bahamas|ARES 4.4 payload|23.838 N 68.333 W (23°50'17" N 68°19'59" W)|E|FZNT02.KNHC |The previous moored position for 41046 was 23*52'01"N, 70*52'12"W or 75 nm west of its present position.
41047|N|3-meter discus buoy|3DV24|NE Bahamas|AMPS payload|27.517 N 71.483 W (27°31'0" N 71°29'0" W)|E|FZNT02.KNHC |

NOTICE:  In addition to the 3 meter hull for station 41047, an  old 12 meter hull is in standby mode for the station and is located at position  27.469N,71.491W (27*28'10"N 71*29'28" W)

41048|N|3-meter discus buoy|3D20|W Bermuda|AMPS payload|31.950 N 69.497 W (31°57'0" N 69°29'48" W)|E|FZNT01.KWBC |

NOTICE:  In  addition to the 3 meter hull for station 41048, an  old 12 meter hull is in standby mode for the  station and is located at position  31.978N,69.649W (31*58'42"N 69*38'56" W)


 

41049|N|3-meter discus buoy|3D51|Atlantic (South)|ARES 4.4 payload|27.500 N 63.000 W (27°30'0" N 63°0'0" W)|?|FZNT02.KNHC | 41052|CI|2.5-meter ODAS buoy||South of St. John, Virgin Islands||18.251 N 64.763 W (18°15'2" N 64°45'45" W)|N| |http://www.caricoos.org/drupal/ 41053|CI|2.5-meter ODAS buoy||San Juan, PR||18.476 N 66.099 W (18°28'33" N 66°5'58" W)|N| |http://www.caricoos.org/drupal/ 41060|WH|2.4-meter discus buoy||Woods Hole Northwest Tropical Atlantic Wave Station||11.436 N 54.829 W (11°26'10" N 54°49'44" W)|?| |For meteorological data at this station, see 41NT0. 41096|F|Buoy||North of Guadeloupe||16.533 N 61.404 W (16°31'59" N 61°24'14" W)|?| | 41097|F|Buoy||Fort-de-France, Martinique||14.480 N 61.096 W (14°28'48" N 61°5'46" W)|?| | 41098|F|Buoy||North of Martinique||14.894 N 61.113 W (14°53'38" N 61°6'47" W)|?| | 41100|F|Buoy||East of Guadeloupe||15.900 N 57.883 W (15°54'0" N 57°53'0" W)|?| | 41101|F|Buoy||East of Martinique||14.600 N 56.201 W (14°36'0" N 56°12'2" W)|?| | 41109|R|Waverider Buoy||New River Inlet, NC - 190||34.483 N 77.300 W (34°29'0" N 77°18'0" W)|E| | 41110|CR|Waverider Buoy||Masonboro Inlet, NC||34.141 N 77.709 W (34°8'28" N 77°42'31" W)|E| | 41112|R|Waverider Buoy||Offshore Fernandina Beach, FL (132)||30.719 N 81.293 W (30°43'7" N 81°17'34" W)|E| |
  41113|R|Waverider Buoy||Cape Canaveral Nearshore, FL (143)||28.400 N 80.530 W (28°23'59" N 80°31'48" W)|E| |
  41114|R|Waverider Buoy||Fort Pierce, FL (134)||27.551 N 80.225 W (27°33'5" N 80°13'31" W)|E| |Going to Oculina Bank? Please review Oculina fishing regulations  41115|CI|Waverider Buoy||Rincon, Puerto Rico (181)||18.376 N 67.280 W (18°22'35" N 67°16'48" W)|N| |Data provided by Scripps Institution of Oceanography
CDIP station
41139|PR|Atlas Buoy||||20.000 N 38.000 W (20°0'0" N 38°0'0" W)|| | 41140|R|Waverider Buoy||Christiansted, St. Croix, Virgin Islands||17.769 N 64.723 W (17°46'7" N 64°43'24" W)|N| |Station 41140 was disestablished November 2, 2010. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 41141|R|Waverider Buoy||Fareham, St. Croix, Virgin Islands||17.684 N 64.635 W (17°41'2" N 64°38'6" W)|N| |Station 41141 was disestablished April 13, 2011. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 41193|DC|Offshore Buoy||Puerto Bolivar, Colombia||12.351 N 72.218 W (12°21'4" N 72°13'4" W)|E| | 41194|DC|Offshore Buoy||Barranquilla, Colombia||11.161 N 74.681 W (11°9'41" N 74°40'51" W)|E| | 41420|N|2.6-meter discus buoy|2.6D71|690 NM East of Miami, FL|DART II payload|23.490 N 67.325 W (23°29'25" N 67°19'29" W)|?| | 41421|N|2.6-meter discus buoy|2.6D09|320 NM North of San Juan, PR|DART II payload|23.415 N 63.967 W (23°24'55" N 63°58'2" W)|?| |

Station 41421 was re established with a new hull 2.6D70 on 5/9/2012. Buoy hull 2.6D70 from DART station 42421 went adrift after 5/12/2012 01Z. Last report from its moored position was 5/11/2012 1315Z. The buoy was recovered on 8/4/2012, and will be restored into service when it can be recovered and then worked into the maintenance schedule. 

Buoy hull 2.6D09 went adrift at 1/17/2012. It has been renamed 41X21.   Click here to see the latest positions.

41424|N|2.6-meter discus buoy|2.6D15|370 NM East of Charleston, SC|DART II payload|32.922 N 72.466 W (32°55'18" N 72°27'57" W)|?| |

Hull 2.6D15 from the previous deployment went adrift 1/09/2012 has been renamed 41X24 and is still adrift. Click here to see the latest positions.


41554|AO|Drifting Buoy||||18.078 N 64.743 W (18°4'42" N 64°44'36" W)|?| | 41670|AO|Drifting Buoy||||24.710 N 28.420 W (24°42'36" N 28°25'12" W)|?| | 41852|AO|Drifting Buoy||||23.240 N 24.020 W (23°14'24" N 24°1'12" W)|?| | 41904|AO|Drifting Buoy||||3.017 N 90.900 E (3°1'0" N 90°54'0" E)|?| | 41933|AO|Drifting Buoy||||44.950 N 12.800 W (44°57'0" N 12°48'0" W)|?| | 41nt0|WH|Ocean Reference Station||NTAS - Northwest Tropical Atlantic||14.825 N 51.017 W (14°49'30" N 51°1'3" W)|?| |41NT0 has gone adrift.  Data is no longer being posted to this webpage.
42001|N|3-meter discus buoy|3DV14|MID GULF 180 nm South of Southwest Pass, LA|AMPS payload|25.888 N 89.658 W (25°53'16" N 89°39'27" W)|C|FZNT24.KNHC |
42002|N|10-meter discus buoy|10D10|W GULF 207 NM East of Brownsville, TX|ARES payload|25.790 N 93.666 W (25°47'24" N 93°39'58" W)|C|FZNT24.KNHC |Station 42002 is transmitting intermittently since 04/18/2012. This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.

42002 was re-established at the above location on 2/8/2008.  

Previously the station was positioned at  25* 10' 00" N 094* 25' 00" W.

42003|N|3-meter discus buoy|3D25|E GULF 208 nm West of Naples, FL|AMPS payload|26.044 N 85.612 W (26°2'38" N 85°36'42" W)|C|FZNT24.KNHC | 42004|N|12-meter discus buoy|||MVXII payload|27.500 N 85.500 W (27°30'0" N 85°30'0" W)|C| | 42005|N|12-meter discus buoy|||MVXII payload|30.000 N 85.900 W (30°0'0" N 85°54'0" W)|C| | 42006|N|6-meter NOMAD buoy|||MVXII payload|26.500 N 96.000 W (26°30'0" N 96°0'0" W)|C| | 42007|N|3-meter discus buoy|3D36|BILOXI 22 nm SSE of Biloxi, MS|ARES 4.4 payload|30.090 N 88.769 W (30°5'25" N 88°46'7" W)|C|FZUS54.KLIX |42007 has been disestablished.  Station 42040 has been re-established approximately 60 NM south of 42007's nominal position
42008|N|Platform BTA||||28.700 N 95.300 W (28°42'0" N 95°18'0" W)|C| | 42009|N|10-meter discus buoy|||GSBP payload|29.300 N 87.500 W (29°18'0" N 87°30'0" W)|C| | 42010|N|Platform BTA||||29.700 N 93.400 W (29°42'0" N 93°24'0" W)|C| | 42011|N|Platform BTA||||29.700 N 93.500 W (29°42'0" N 93°30'0" W)|C| | 42012|N|3-meter discus buoy|3D12|Orange Beach, AL Buoy|ARES 4.4 payload|30.065 N 87.555 W (30°3'55" N 87°33'19" W)|C|FZUS54.KMOB |  42013|P|Offshore Buoy||C10 - Navy-2||27.169 N 82.926 W (27°10'9" N 82°55'34" W)|E|FZUS52.KTBW | 42014|P|Offshore Buoy||C17 - W. FL Sea-Coos||25.254 N 82.220 W (25°15'16" N 82°13'11" W)|E|FZUS52.KKEY | 42015|N|3-meter discus buoy|||DACT payload|30.100 N 88.200 W (30°6'0" N 88°12'0" W)|E| | 42016|N|3-meter discus buoy|||DACT payload|30.200 N 88.100 W (30°11'60" N 88°5'60" W)|C| | 42017|N|3-meter discus buoy|||DACT payload|27.900 N 90.900 W (27°53'60" N 90°54'0" W)|C| | 42018|N|3-meter discus buoy|||DACT payload|30.000 N 88.200 W (30°0'0" N 88°12'0" W)|C| | 42019|N|3-meter discus buoy|3D58|Freeport, TX 60 NM South of Freeport, TX|AMPS payload|27.913 N 95.353 W (27°54'48" N 95°21'10" W)|C|FZNT24.KNHC FZUS54.KHGX|

Station 42019 failed on 3/1/2012.  It will berestored to service when it can be worked into the schedule.  When thedate is known it will be posted in the Weekly Maintenance Report.

42020|N|3-meter discus buoy|3DV11|Corpus Christi, TX 50NM Southeast of Corpus Christi, TX|ARES payload|26.966 N 96.695 W (26°57'59" N 96°41'42" W)|C|FZNT24.KNHC FZUS54.KBRO| 42021|P|Offshore Buoy||C14 - Pasco County Buoy, FL||28.311 N 83.306 W (28°18'40" N 83°18'22" W)|E|FZUS52.KTBW | 42022|P|Offshore Buoy||C12 - West Florida Central Buoy||27.498 N 83.722 W (27°29'54" N 83°43'18" W)|E|FZUS52.KTBW | 42023|P|Offshore Buoy||C13 - West Florida South Buoy||26.064 N 83.074 W (26°3'49" N 83°4'25" W)|E|FZUS52.KTBW | 42024|P|Offshore Buoy||C16 - W. FL MERHAB||27.464 N 84.219 W (27°27'50" N 84°13'8" W)|E|FZNT24.KNHC | 42025|N|1.8-meter discus buoy|||VEEP payload|24.900 N 80.400 W (24°53'60" N 80°24'0" W)|C| | 42035|N|3-meter discus buoy|3D54|GALVESTON 22NM East of Galveston, TX|ARES 4.4 payload|29.232 N 94.413 W (29°13'54" N 94°24'46" W)|C|FZUS54.KHGX FZUS54.KLCH| 42036|N|3-meter discus buoy|3D73|W. TAMPA 106NM West Northwest of Tampa, FL|ARES 4.4 payload|28.500 N 84.517 W (28°30'0" N 84°31'0" W)|E|FZUS52.KTBW FZNT24.KNHC| 42037|N|2.4-meter discus buoy|||DACT payload|24.500 N 81.400 W (24°30'0" N 81°24'0" W)|E| |Buoy disestablished. 42038|N|3-meter discus buoy|3D35|North Mid Gulf of Mexico|ARES payload|27.421 N 92.555 W (27°25'15" N 92°33'17" W)|C|FZNT24.KNHC |Station 42038 failed and was disestablished May 9, 2006. The station had been part of an externally funded Minerals Management Service program that has ended. Use the "Observations from Nearby Stations and Ships" link below to see a listing of the nearest stations. The historical data will remain available. The station page is accessible via our historical map, or you can always just put the station ID in the Station ID Search box. 42039|N|3-meter discus buoy|3D15|PENSACOLA - 115NM East Southeast of Pensacola, FL|ARES payload|28.791 N 86.008 W (28°47'28" N 86°0'29" W)|C|FZUS52.KTAE FZNT24.KNHC|

Station 42039 stopped transmitting 06/10/2012. This buoy will be fully restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report. 

Buoy hull 3D15 has gone adrift 8/28/12 by 2130Z. Click here for latest position.

42040|N|10-meter discus buoy|10D08|LUKE OFFSHORE TEST PLATFORM 64 nm South of Dauphin Island, AL|ARES 4.4 payload|29.212 N 88.207 W (29°12'45" N 88°12'27" W)|C|FZUS54.KLIX FZNT24.KNHC|

Station 42040 was re-established on 4/1/2010.

Previously the station was positioned at 29° 12' 19"N 88° 12' 19"W.

Station 42040 is transmitting sporadically since 8/7/12. This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.

42041|N|3-meter discus buoy| 24|North Mid Gulf 110NM South of Grand Isle, LA|MARS payload|27.504 N 90.462 W (27°30'14" N 90°27'44" W)|C|FZUS54.KLIX |Station 42041 was disestablished March 16, 2005. The station had been part of an externally funded Minerals Management Service program that has ended. Use the "Observations from Nearby Stations and Ships" link below to see a listing of the nearest stations. The historical data will remain available. The station page is accessible via our historical map, or you can always just put the station ID in the Station ID Search box. 42042|N|3-meter discus buoy| 28|Pascagoula|MARS payload|29.880 N 88.320 W (29°52'48" N 88°19'12" W)|C| | 42043|T|TABS II||GA-252 TABS B||28.982 N 94.919 W (28°58'55" N 94°55'7" W)|C|FZUS54.KHGX | 42044|T|TABS II||PS-1126 TABS J||26.191 N 97.051 W (26°11'29" N 97°3'3" W)|C|FZUS54.KBRO | 42045|T|TABS II||PI-745 TABS K||26.217 N 96.500 W (26°13'0" N 96°29'59" W)|C|FZNT24.KNHC | 42046|T|TABS II||HI-A595 TABS N||27.890 N 94.037 W (27°53'23" N 94°2'12" W)|C|FZNT24.KNHC | 42047|T|TABS II||HI-A389 TABS V||27.897 N 93.597 W (27°53'48" N 93°35'50" W)|C|FZNT24.KNHC | 42048|T|TABS II||TABS D||27.940 N 96.843 W (27°56'23" N 96°50'35" W)|C|FZNT24.KNHC |

NOTICE:  In addition  to  the  3  meter hull  for  station  41048, an  old  12  meter  hull  is in  standby  mode  for the  station  and  is  located  at  position 31.978N, 69.649W (31*58'42"N 69*38'56"W)

42049|T|TABS II||TABS W||28.351 N 96.006 W (28°21'3" N 96°0'21" W)|C|FZNT24.KNHC | 42050|T|TABS II||TABS F||28.843 N 94.242 W (28°50'33" N 94°14'30" W)|C|FZNT24.KNHC | 42051|T|TABS II||TABS R||29.635 N 93.642 W (29°38'6" N 93°38'30" W)|C|FZNT24.KNHC | 42053|N|12-meter discus buoy| LNB11|Pascagoula South|MARS payload|29.550 N 88.500 W (29°33'0" N 88°30'0" W)|C| | 42054|N|12-meter discus buoy| LNB06|East Gulf|MARS payload|26.000 N 87.730 W (26°0'0" N 87°43'48" W)|C|FZNT24.KNHC |Buoy 42054 was a short term project that has ended. 42055|N|3-meter discus buoy|3DV12|Bay of Campeche|AMPS payload|22.203 N 94.000 W (22°12'10" N 94°0'1" W)|C|FZNT24.KNHC |

 NOTICE:  In addition to the 3 meter hull for station 42055, an old 12 meter hull is located at position 22.017N, 94.046W (22*01'02"N 94 *02'45" W) and is non-functional.



42056|N|3-meter discus buoy|3D39| Yucatan Basin|AMPS payload|19.802 N 84.857 W (19°48'6" N 84°51'24" W)|C|FZNT23.KNHC |NOTICE:  In addition to the 3 meter hull for station 42056, an old 12 meter hull is in standby mode for the station and is located at position19.877N, 85.059W (19*52'37"N 85*03'32" W) 42057|N|3-meter discus buoy|3D80|Western Caribbean|AMPS payload|17.002 N 81.501 W (17°0'8" N 81°30'2" W)|E|FZNT23.KNHC |

NOTICE:  In addition  to  the  3  meter hull  for  station  42057, an  old  10  meter  hull  is in  standby  mode  for the  station  and  is  located  at  position 16.834N, 81.501W (16*50'01"N 81*30'02"W)

42058|N|3-meter discus buoy|3D59|Central Caribbean|ARES 4.4 payload|14.923 N 74.918 W (14°55'23" N 74°55'4" W)|E|FZNT23.KNHC | 42059|N|6-meter NOMAD buoy|6N43|Eastern Caribbean|ARES payload|15.054 N 67.472 W (15°3'14" N 67°28'19" W)|N|FZNT23.KNHC |
  42060|N|6-meter NOMAD buoy|6N56|Eastern Caribbean|AMPS payload|16.333 N 63.500 W (16°19'59" N 63°30'1" W)|N|FZNT23.KNHC | 42065|N|2.3-meter NOOSS buoy|2.3D09|Near 42058 Central Caribbean|AMPS payload|14.926 N 75.046 W (14°55'35" N 75°2'45" W)|E|FZNT23.KNHC |Buoy at station 42065 went adrift on 12/7/11 and has since been recovered. 

42067|US|3-meter discus buoy||USM3M02||30.043 N 88.649 W (30°2'36" N 88°38'57" W)|C|FZUS54.KLIX | 42080|N|1.8-meter discus buoy|1.8D008|Offshore Sand Key, FL|WAMDAS payload|24.396 N 81.934 W (24°23'44" N 81°56'2" W)|E|FZUS52.KKEY |Other weather data for this area are available at SANF1.

Station 42080 has been disestablished

42085|CI|2.5-meter ODAS buoy||Southeast of Ponce, PR||17.860 N 66.524 W (17°51'37" N 66°31'26" W)|N| |http://www.caricoos.org/drupal/ 42099|R|Waverider Buoy||Offshore St. Petersburg, FL (144)||27.340 N 84.245 W (27°20'25" N 84°14'42" W)|E| | 42360|PB|Buoy||BW Pioneer buoy - Walker Ridge 249||26.700 N 90.460 W (26°42'0" N 90°27'36" W)|C| |Anemometers are located at 3 meters above sea level but they are corrected to 10 meters by the owner. 42361|SH|Fixed Drilling Platform||Auger - Garden Banks 426||27.550 N 92.490 W (27°33'0" N 92°29'24" W)|C| | 42362|SH|Fixed Drilling Platform||Brutus - Green Canyon 158||27.800 N 90.670 W (27°48'0" N 90°40'12" W)|C| | 42363|SH|Fixed Drilling Platform||Mars - Mississippi Canyon 807||28.160 N 89.220 W (28°9'36" N 89°13'12" W)|C| | 42364|SH|Fixed Drilling Platform||Ram-Powell - Viosca Knoll 956||29.060 N 88.090 W (29°3'36" N 88°5'24" W)|C| | 42365|SH|Fixed Drilling Platform||Ursa - Mississippi Canyon 809||28.200 N 89.120 W (28°12'0" N 89°7'12" W)|C| | 42366|KM|Fixed Drilling Platform||Red Hawk - Garden Banks 877||27.122 N 91.959 W (27°7'18" N 91°57'31" W)|C| | 42367|TO|Fixed Drilling Platform||Matterhorn - Mississippi Canyon 243||28.743 N 88.826 W (28°44'33" N 88°49'32" W)|C| | 42368|CO|Fixed Drilling Platform||Magnolia - Garden Banks 783||27.204 N 92.203 W (27°12'14" N 92°12'9" W)|C| | 42369|BP|Fixed Drilling Platform||Mad Dog - Green Canyon 782||27.189 N 90.269 W (27°11'19" N 90°16'7" W)|C| | 42370|BP|Fixed Drilling Platform||Holstein - Green Canyon 645||27.321 N 90.536 W (27°19'17" N 90°32'8" W)|C| | 42371|CT|Fixed Drilling Platform||Typhoon - Green Canyon 237||27.732 N 91.111 W (27°43'54" N 91°6'40" W)|C| |This station was disestablished in 2005 and no longer produces data. The historical data remain available. 42372|CT|Fixed Drilling Platform||Genesis - Green Canyon 205||27.779 N 90.519 W (27°46'46" N 90°31'7" W)|C| | 42373|KM|Fixed Drilling Platform||Boomvang - East Breaks 643||27.354 N 94.625 W (27°21'13" N 94°37'31" W)|C| | 42374|BP|Fixed Drilling Platform||Horn Mountain - Mississippi Canyon 126 and 127||28.866 N 88.056 W (28°51'58" N 88°3'23" W)|C| | 42375|BP|Fixed Drilling Platform||Na Kika - Mississippi Canyon 474||28.521 N 88.289 W (28°31'15" N 88°17'20" W)|C| | 42376|BP|Fixed Drilling Platform||Marlin - Viosca Knoll 915||29.108 N 87.944 W (29°6'27" N 87°56'37" W)|C| | 42377|KM|Fixed Drilling Platform||Constitution - Green Canyon 680||27.293 N 90.968 W (27°17'33" N 90°58'5" W)|C| | 42379|AN|Fixed Drilling Platform||Marco Polo - Green Canyon 608||27.362 N 90.181 W (27°21'43" N 90°10'53" W)|C| | 42380|WI|Fixed Drilling Platform||Devil's Tower - Mississippi Canyon 773||28.209 N 88.738 W (28°12'32" N 88°44'15" W)|C| | 42381|AT|Fixed Drilling Platform||Innovator - Mississippi Canyon 711||28.221 N 89.616 W (28°13'15" N 89°36'56" W)|C| | 42382|KM|Mobile Offshore Drilling Unit||Gunnison - Garden Banks 668||27.304 N 93.538 W (27°18'14" N 93°32'18" W)|C| | 42383|BH|Fixed Drilling Platform||Neptune - Green Canyon 613||27.370 N 89.924 W (27°22'12" N 89°55'26" W)|C| | 42384|EP|Fixed Drilling Platform||Prince TLP - Ewing Bank 1003||27.993 N 90.326 W (27°59'34" N 90°19'33" W)|C| | 42385|CT|Fixed Drilling Platform||Blind Faith - Mississippi Canyon 696||28.340 N 88.266 W (28°20'24" N 88°15'56" W)|C| | 42386|CT|Fixed Drilling Platform||Tahiti - Green Canyon 641||27.326 N 90.714 W (27°19'34" N 90°42'51" W)|C| | 42387|MU|Fixed Drilling Platform||Thunderhawk - Mississippi Canyon 734||28.267 N 88.399 W (28°16'2" N 88°23'56" W)|C| | 42388|HE|Mobile Offshore Drilling Unit||Producer 1 - Green Canyon 237||27.730 N 91.109 W (27°43'47" N 91°6'31" W)|C| | 42390|SH|Fixed Drilling Platform||Perdido Host - Alaminos Canyon 857||26.129 N 94.898 W (26°7'44" N 94°53'53" W)|C| | 42391|AT|Fixed Drilling Platform||Titan - Mississippi Canyon 941||28.034 N 89.101 W (28°2'2" N 89°6'4" W)|C| | 42392|BP|Fixed Drilling Platform||Atlantis - Green Canyon ###||27.196 N 90.027 W (27°11'44" N 90°1'37" W)|C| | 42393|BH|Fixed Drilling Platform||Shenzi - Green Canyon 653||27.301 N 90.135 W (27°18'2" N 90°8'6" W)|C| | 42407|N|2.6-meter discus buoy|2.6D03|230 NM South of San Juan, PR|DART II payload|15.289 N 68.215 W (15°17'22" N 68°12'54" W)|?| | 42408|N|2.6-meter discus buoy|D22|310 NM South-Southeast of New Orleans, LA|DART II payload|25.200 N 87.000 W (25°12'0" N 87°0'0" W)|?| |Buoy 42408 has gone adrift on 12/11/2008 and was recovered 12/19/2008. It is not reporting any water column heights or tsunami event messages since 12/11/2008. It has been replaced by 42409 located approximately 100NM to the NE. Station has been disestablished. 42409|N|2.6-meter discus buoy|2.6D22|295 NM Southeast of New Orleans, LA|DART II payload|27.080 N 85.714 W (27°4'49" N 85°42'50" W)|E| |

Station 42409 has stopped transmitting water column height and tsunami data as of 4/28/2012. It will be serviced when it can be worked into the maintenance schedule.

Last reported position was 4/19/2012 and it was on station at that time.  Hull 2.6D22 stopped transmitting position data as of 4/19/2012.  However, during service visit on 5/24/2012, the buoy was not on station and is now presumed adrift.

42429|N||NDBC2|DART GLIDER TEST STATION |DART II payload|27.401 N 85.671 W (27°24'4" N 85°40'17" W)|| |

This station is a DART Test station and is NOT an operational station.

This test station is being used to test the Mid Frequency BPR  and the DART Glider (NDBC2).

42430|N|Test station||DART Test Station||27.000 N 86.000 W (27°0'0" N 86°0'0" W)|E| |This is a DART TEST station only. It is NOT an operational station. 42534|N|Drifting Buoy||Moored Drifter||29.643 N 93.839 W (29°38'34" N 93°50'20" W)|C| |Station 42534 has  failed. 42851|SH|Mobile Offshore Drilling Unit||Globetrotter 1 - Walker Ridge 95||26.863 N 91.587 W (26°51'48" N 91°35'12" W)|C| | 42852|LL|Mobile Offshore Drilling Unit||Who Dat - Mississippi Canyon 547||28.501 N 89.769 W (28°30'4" N 89°46'8" W)|C| | 42861|SH|Mobile Offshore Drilling Unit||Deepwater Nautilus - Mississippi Canyon 348||28.634 N 87.982 W (28°38'4" N 87°58'56" W)|C| | 42862|SH|Mobile Offshore Drilling Unit||Jim Thompson - Green Canyon 158||27.800 N 90.670 W (27°48'0" N 90°40'12" W)|C| | 42863|AT|Mobile Offshore Drilling Unit||Ocean Victory - Green Canyon 300 #2||27.486 N 90.191 W (27°29'9" N 90°11'26" W)|C| | 42864|NF|Mobile Offshore Drilling Unit||Noble Max Smith - Mississippi Canyon 754||28.195 N 89.636 W (28°11'42" N 89°38'9" W)|C| | 42865|EN|Mobile Offshore Drilling Unit||Celtic Sea - Green Canyon 517||27.466 N 90.305 W (27°27'56" N 90°18'18" W)|C| | 42866|EN|Mobile Offshore Drilling Unit||Transocean Amirante - Mississippi Canyon 460||28.491 N 88.997 W (28°29'27" N 88°59'51" W)|C| | 42867|CT|Mobile Offshore Drilling Unit||DeepSeas - Green Canyon 640||27.317 N 90.754 W (27°19'0" N 90°45'14" W)|C| | 42868|BP|Mobile Offshore Drilling Unit||Discoverer Enterprise - Green Canyon 699||27.262 N 89.998 W (27°15'42" N 89°59'54" W)|C| | 42869|AT|Mobile Offshore Drilling Unit||Ocean Confidence - Mississippi Canyon 305||28.695 N 87.931 W (28°41'43" N 87°55'50" W)|C| | 42870|ME|Mobile Offshore Drilling Unit||Ocean America - Green Canyon 505||27.458 N 90.867 W (27°27'30" N 90°52'2" W)|C| | 42871|BH|Mobile Offshore Drilling Unit||C R Luigs - Green Canyon 654||27.309 N 90.072 W (27°18'32" N 90°4'20" W)|C| | 42872|BP|Mobile Offshore Drilling Unit||Deepwater Horizon||28.738 N 88.366 W (28°44'17" N 88°21'57" W)|C| |Station disestablished on 4/21/2010.
42873|AT|Mobile Offshore Drilling Unit||Ocean Quest - Mississippi Canyon 711||28.252 N 89.622 W (28°15'6" N 89°37'18" W)|C| | 42874|AN|Mobile Offshore Drilling Unit||DeepWater Millennium - Garden Banks 877||27.121 N 91.922 W (27°7'16" N 91°55'19" W)|C| | 42875|LL|Mobile Offshore Drilling Unit||Amos Runner - Mississippi Canyon 431||28.567 N 88.257 W (28°34'3" N 88°15'27" W)|C| | 42876|NF|Mobile Offshore Drilling Unit||Ocean Star - Garden Banks 293||27.676 N 92.534 W (27°40'34" N 92°32'4" W)|C| | 42877|SH|Mobile Offshore Drilling Unit||Cajun Express - Mississippi Canyon 762||28.180 N 89.290 W (28°10'48" N 89°17'24" W)|C| | 42878|MO|Mobile Offshore Drilling Unit||Paul Romano - Green Canyon 244||27.726 N 90.730 W (27°43'32" N 90°43'49" W)|C| | 42879|CT|Mobile Offshore Drilling Unit||ENSCO 7500 - Atwater Valley 138||27.801 N 89.642 W (27°48'5" N 89°38'32" W)|C| | 42880|NF|Mobile Offshore Drilling Unit||Ocean Voyager - Mississippi Canyon 29||28.936 N 88.543 W (28°56'10" N 88°32'34" W)|C| | 42881|EN|Mobile Offshore Drilling Unit||Transocean Marianas - Atwater Valley 428||27.554 N 88.361 W (27°33'13" N 88°21'38" W)|C| | 42882|AN|Mobile Offshore Drilling Unit||Ocean Valiant - East Breaks 646||27.339 N 94.470 W (27°20'20" N 94°28'13" W)|C| | 42883|TN|Mobile Offshore Drilling Unit||Ocean Concord - Ewing Bank 301||27.678 N 94.151 W (27°40'41" N 94°9'5" W)|C| | 42884|PB|Mobile Offshore Drilling Unit||Falcon 100 - Garden Banks 244||27.735 N 92.740 W (27°44'7" N 92°44'25" W)|C| | 42885|BP|Mobile Offshore Drilling Unit||Development Driller II - Mississippi Canyon 727||28.249 N 88.828 W (28°14'57" N 88°49'40" W)|C| | 42886|AN|Mobile Offshore Drilling Unit||Discoverer Spirit - Green Canyon 770||27.223 N 90.836 W (27°13'24" N 90°50'11" W)|C| | 42887|BP|Fixed Drilling Platform||Thunder Horse - Mississippi Canyon 778||28.191 N 88.496 W (28°11'27" N 88°29'44" W)|C| | 42888|NX|Mobile Offshore Drilling Unit||Arctic 1 - Green Canyon 243||27.712 N 90.786 W (27°42'43" N 90°47'11" W)|C| | 42889|MU|Mobile Offshore Drilling Unit||Medusa - Mississippi Canyon 582||28.394 N 89.465 W (28°23'40" N 89°27'54" W)|C| | 42890|MU|Mobile Offshore Drilling Unit||Front Runner - Green Canyon 338||27.625 N 90.441 W (27°37'29" N 90°26'28" W)|C| | 42891|WO|Mobile Offshore Drilling Unit||Ocean Lexington||27.617 N 92.086 W (27°37'1" N 92°5'11" W)|C| |This system is not currently recording data. Historical data remain available. 42892|AH|Mobile Offshore Drilling Unit||Ocean Baroness - Garden Banks 386||27.599 N 92.298 W (27°35'57" N 92°17'54" W)|C| | 42893|KM|Mobile Offshore Drilling Unit||Therald Martin - East Breaks 588||27.410 N 94.464 W (27°24'37" N 94°27'50" W)|C| |This system is not currently recording data. Historical data remain available. 42894|LL|Mobile Offshore Drilling Unit||Lorris Bouzigard - Mississippi Canyon 199||28.770 N 88.834 W (28°46'13" N 88°50'2" W)|C| | 42895|RS|Mobile Offshore Drilling Unit||Stena DrillMAX - Keathley Canyon 872||26.133 N 92.176 W (26°7'57" N 92°10'35" W)|C| |This is the second usage of this WMO ID.  The previous drilling unit failed during 2006. 42896|BP|Mobile Offshore Drilling Unit||Glomar Explorer - Mississippi Canyon 862||28.271 N 88.853 W (28°16'14" N 88°51'11" W)|C| | 42897|BH|Mobile Offshore Drilling Unit||Development Driller 1 - Atwater Valley 617||27.331 N 89.860 W (27°19'52" N 89°51'36" W)|C| | 42898|WO|Mobile Offshore Drilling Unit||Ocean New Era - Ewing Bank 878||28.092 N 89.964 W (28°5'33" N 89°57'50" W)|C| | 42899|EX|Mobile Offshore Drilling Unit||Ocean Endeavor - Keathley Canyon 919||27.066 N 92.060 W (27°3'59" N 92°3'35" W)|C| | 42900|LL|Mobile Offshore Drilling Unit||Ocean Saratoga - Garden Banks 339||27.632 N 92.420 W (27°37'54" N 92°25'11" W)|C| | 42901|EX|Mobile Offshore Drilling Unit||Eirik Raude - Walker Ridge 584||26.384 N 91.366 W (26°23'2" N 91°21'59" W)|C| | 42902|SH|Mobile Offshore Drilling Unit||Clyde Boudreaux - Alaminos Canyon 857||26.130 N 94.900 W (26°7'48" N 94°54'0" W)|C| | 42903|MO|Mobile Offshore Drilling Unit||Henry Goodrich - Green Canyon 244||27.726 N 90.731 W (27°43'33" N 90°43'52" W)|C| | 42904|AN|Mobile Offshore Drilling Unit||Independence Hub - Mississippi Canyon 920||28.085 N 87.986 W (28°5'6" N 87°59'9" W)|C| | 42905|AN|Mobile Offshore Drilling Unit||Belford Dolphin - Green Canyon 561||27.396 N 90.305 W (27°23'47" N 90°18'17" W)|C| | 42906|PE|Mobile Offshore Drilling Unit||Petrolia - Block Chapabil-1||19.633 N 92.483 W (19°38'0" N 92°29'0" W)|C| | 42907|WO|Mobile Offshore Drilling Unit||Ocean Ambassador - Ewing Bank 1006||27.975 N 90.150 W (27°58'29" N 90°9'1" W)|C| | 42908|BP|Mobile Offshore Drilling Unit||West Sirius - Keathley Canyon 292||26.679 N 92.573 W (26°40'43" N 92°34'23" W)|C| | 42909|AN|Mobile Offshore Drilling Unit||ENSCO 8500 - Walker Ridge 793||26.157 N 91.873 W (26°9'26" N 91°52'24" W)|C| | 42910|SH|Mobile Offshore Drilling Unit||Frontier Driller - Green Canyon 248||27.721 N 90.577 W (27°43'16" N 90°34'37" W)|C| | 42911|MO|Mobile Offshore Drilling Unit||Ocean Monarch - Garden Banks 515||27.464 N 92.433 W (27°27'51" N 92°25'59" W)|C| | 42912|CT|Mobile Offshore Drilling Unit||Discoverer Clear Leader - WR758||26.208 N 91.443 W (26°12'28" N 91°26'34" W)|C| | 42913|NE|Mobile Offshore Drilling Unit||ENSCO 8501 - Green Canyon 723||27.245 N 90.245 W (27°14'43" N 90°14'43" W)|C| | 42914|SL|Mobile Offshore Drilling Unit||Discoverer Americas - Walker Ridge 543||26.442 N 91.190 W (26°26'30" N 91°11'24" W)|C| | 42915|MD|Mobile Offshore Drilling Unit||Maersk Developer - LL400||27.555 N 87.278 W (27°33'19" N 87°16'41" W)|C| | 42916|BP|Mobile Offshore Drilling Unit||Development Driller 3 - Green Canyon 743||27.267 N 90.033 W (27°16'1" N 90°1'59" W)|C| | 42917|CT|Mobile Offshore Drilling Unit||Discoverer Inspiration - Walker Ridge 677||26.298 N 91.093 W (26°17'52" N 91°5'35" W)|C| | 42918|SH|Mobile Offshore Drilling Unit||Noble Danny Adkins - Alaminos Canyon 859||26.133 N 94.800 W (26°7'59" N 94°47'60" W)|C| | 42919|AH|Mobile Offshore Drilling Unit||Stenna Forth - Green Canyon 469||27.504 N 90.532 W (27°30'13" N 90°31'56" W)|C| | 42921|MU|Mobile Offshore Drilling Unit||Deepwater Pathfinder - Mississippi Canyon 734||28.241 N 88.468 W (28°14'28" N 88°28'4" W)|C| | 42922|MU|Mobile Offshore Drilling Unit||Noble Jim Day - DeSoto Canyon 134||28.827 N 87.851 W (28°49'36" N 87°51'4" W)|C| | 42923|LL|Mobile Offshore Drilling Unit||Ensco 8502 - MC761||28.219 N 89.295 W (28°13'8" N 89°17'43" W)|| | 42924|CY|Mobile Offshore Drilling Unit||Ensco 8503 - Green Canyon 814||27.149 N 90.861 W (27°8'57" N 90°51'41" W)|| | 42925|PB|Mobile Offshore Drilling Unit||Ensco 5 - Walker Ridge 250||26.736 N 90.492 W (26°44'8" N 90°29'30" W)|C| | 42926|CT|Mobile Offshore Drilling Unit||Discoverer India - Walker Ridge 29||26.933 N 90.520 W (26°55'57" N 90°31'12" W)|C| | 42927|SH|Mobile Offshore Drilling Unit||Noble Bully 1 - Green Canyon 434||27.555 N 90.070 W (27°33'19" N 90°4'13" W)|C| | 42928|AN|Mobile Offshore Drilling Unit||ENSCO 8505 - Walker Ridge 54||26.927 N 91.564 W (26°55'38" N 91°33'51" W)|C| | 42929|CT|Mobile Offshore Drilling Unit||Pacific Santa Ana - Walker Ridge 98||26.846 N 91.438 W (26°50'47" N 91°26'16" W)|C| | 42930|EX|Mobile Offshore Drilling Unit||Deepwater Champion - Keathley Canyon 918||26.080 N 92.063 W (26°4'47" N 92°3'48" W)|C| | 42otp|N|3-meter discus buoy|19|OSM/NOSIC Test Buoy|ARES payload|30.073 N 88.750 W (30°4'24" N 88°45'0" W)|C|FZUS54.KLIX |This is a test station for the Ocean Sensor Module (OSM) integrated with the NDBC Oceanographic Sensor Interface Controller (NOSIC). 43412|N|2.6-meter discus buoy|2.6D59|240 NM Southwest of Manzanillo, Mexico|DART II payload|16.069 N 106.996 W (16°4'10" N 106°59'47" W)|?| |DART station 43412 has been declared inoperative. No water column height or tsunami data has been received since 12/24/2011. 43413|N|2.6-meter discus buoy|2.6D48|360 NM South-Southwest of Acapulco, Mexico|DART II payload|11.065 N 99.853 W (11°3'54" N 99°51'12" W)|?| | 44001|N|6-meter NOMAD buoy|||MVXI payload|38.700 N 73.600 W (38°42'0" N 73°35'60" W)|E| |(formerly eb41) 44003|N|6-meter NOMAD buoy|||MVXII payload|40.800 N 68.500 W (40°47'60" N 68°30'0" W)|E| |(formerly eb63) 44004|N|6-meter NOMAD buoy|3D06|HOTEL 200NM East of Cape May,NJ|ARES payload|38.484 N 70.433 W (38°29'2" N 70°25'57" W)|E|FZNT22.KWBC |

Station 44004 went adrift on 03/08/2008 and the last report from its moored position was at 2000Z.  The buoy was recovered on 05/18/09. When redeployed the station will be moved approximately 120 nm northwest of its former position, to the outer continental shelf near the Hudson Canyon.  This is to fill the data gap that presently exists along the outer shelf in that area.  This station has since been disestablished and replaced by buoy 44066.

 

 

44005|N|3-meter discus buoy|6N16|GULF OF MAINE 78 NM EAST OF PORTSMOUTH, NH|AMPS payload|43.204 N 69.128 W (43°12'13" N 69°7'40" W)|E|FZNT21.KWBC |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike

44006|N|3-meter discus buoy|||GSBP payload|36.300 N 75.400 W (36°17'60" N 75°24'0" W)|E| | 44007|N|3-meter discus buoy|3DV04|PORTLAND 12 NM Southeast of Portland,ME|ARES 4.4 payload|43.531 N 70.144 W (43°31'53" N 70°8'39" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike 44008|N|3-meter discus buoy|3D71|NANTUCKET 54NM Southeast of Nantucket|ARES 4.4 payload|40.502 N 69.247 W (40°30'9" N 69°14'48" W)|E|FZNT21.KWBC |

Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike  

44009|N|3-meter discus buoy|3D47|DELAWARE BAY 26 NM Southeast of Cape May, NJ|ARES payload|38.464 N 74.702 W (38°27'49" N 74°42'7" W)|E|FZUS51.KPHI FZUS51.KLWX|


 

44010|N|3-meter discus buoy|||GSBP payload|36.900 N 75.700 W (36°53'59" N 75°41'59" W)|E| | 44011|N|3-meter discus buoy|3D75|GEORGES BANK 170 NM East of Hyannis, MA|ARES payload|41.105 N 66.600 W (41°6'18" N 66°36'0" W)|E|FZNT21.KWBC |Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike 
44012|N|USCG Large Navigational Buoy|||DACT payload|38.800 N 74.600 W (38°47'60" N 74°35'60" W)|E| | 44013|N|3-meter discus buoy|3D85|BOSTON 16 NM East of Boston, MA|ARES 4.4 payload|42.346 N 70.651 W (42°20'44" N 70°39'4" W)|E| |Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike  

For area forecasts and warnings, select: Boston WFO

44014|N|3-meter discus buoy|3D87|VIRGINIA BEACH 64 NM East of Virginia Beach, VA|ARES 4.4 payload|36.611 N 74.842 W (36°36'41" N 74°50'31" W)|E|FZNT22.KWBC |
  44015|N|3-meter discus buoy|||DACT payload|37.500 N 73.400 W (37°30'0" N 73°24'0" W)|E| | 44017|N|3-meter discus buoy|3DV08|23 Nautical Miles Southwest of Montauk Point, NY|AMPS payload|40.692 N 72.048 W (40°41'32" N 72°2'52" W)|E|FZNT21.KWBC |

Station 44017 stopped transmitting 08/20/11. This buoy was recovered 11/10/11, and will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.


 

44018|N|3-meter discus buoy|3DV02|East of Cape Cod 17NM East-Northeast of Provincetown, MA|AMPS payload|42.126 N 69.630 W (42°7'34" N 69°37'49" W)|E| |

Station 44018 hull 3DV02  went adrift on 3/6/2012. The buoy was recovered on 3/14/12 and will be restored to service when it can be worked into the schedule. When service data is known, it will be posted in the maintenance report.

Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike 

For area forecasts and warnings, select: Boston WFO

On 11/13/11, Buoy 44018 was relocated to a new location approximately 17 nautical miles east-northeast of Provincetown, MA.

44019|N|3-meter discus buoy|||VEEP payload|36.400 N 75.200 W (36°23'60" N 75°12'0" W)|E| | 44020|N|3-meter discus buoy|3D84|NANTUCKET SOUND|ARES 4.4 payload|41.443 N 70.186 W (41°26'35" N 70°11'11" W)|E|FZUS51.KBOX |

Caution: Right whales may be active in northeast waters year-round.  NOAA recommends vessels reduce speeds below 10 knots, when consistent with safe navigation. For latest sightings, go to: http://rwhalesightings.nefsc.noaa.gov/

For area forecasts and warnings, select: Boston WFO

44021|NC|Moored Buoy||Buoy D - New Meadows River||43.782 N 69.888 W (43°46'57" N 69°53'16" W)|E|FZNT21.KWBC |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike
44022|Y|2.4-meter foam hull buoy||Execution Rocks||40.880 N 73.730 W (40°52'48" N 73°43'48" W)|E|FZUS51.KOKX | 44023|N|3-meter discus buoy|||DACT payload|37.500 N 74.400 W (37°30'0" N 74°24'0" W)|E| | 44024|NC|2-meter discus buoy||Buoy N - Northeast Channel||42.312 N 65.927 W (42°18'42" N 65°55'36" W)|E|FZNT21.KWBC |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44025|N|3-meter discus buoy|3DV18|LONG ISLAND 33 NM South of Islip, NY|AMPS payload|40.250 N 73.167 W (40°15'0" N 73°10'0" W)|E|FZUS51.KOKX FZUS51.KPHI|


 

44026|N|3-meter discus buoy|||DACT payload|36.000 N 73.500 W (36°0'0" N 73°30'0" W)|E| | 44027|N|3-meter discus buoy|3D65|Jonesport, Maine|AMPS payload|44.273 N 67.314 W (44°16'21" N 67°18'51" W)|E|FZUS51.KCAR FZNT21.KWBC|Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike

44028|N|USCG Large Navigational Buoy|09|Buzzard's Bay|DACT payload|41.400 N 71.080 W (41°23'60" N 71°4'48" W)|E| |Caution: Right whales may be active in northeast waters year-round. NOAA recommends vessels reduce speeds below 10 knots, when consistent with safe navigation. For latest sightings, go to: http://rwhalesightings.nefsc.noaa.gov/





For area forecasts and warnings, select: Boston WFO

44029|NC|2-meter discus buoy||Buoy A0102 - Mass. Bay/Stellwagen||42.520 N 70.570 W (42°31'12" N 70°34'12" W)|E| |Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike  

For area forecasts and warnings, select: Boston WFO

44030|NC|2-meter discus buoy||Buoy B0102 - Western Maine Shelf||43.183 N 70.418 W (43°11'0" N 70°25'4" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44031|NC|2-meter discus buoy||Buoy C0201 - Casco Bay||43.570 N 70.060 W (43°34'12" N 70°3'36" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44032|NC|2-meter discus buoy||Buoy E0104 - Central Maine Shelf||43.715 N 69.358 W (43°42'53" N 69°21'28" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike   44033|NC|2-meter discus buoy||Buoy F0103 - West Penobscot Bay||44.060 N 69.000 W (44°3'36" N 69°0'0" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44034|NC|2-meter discus buoy||Buoy I0103 - Eastern Maine Shelf||44.110 N 68.110 W (44°6'36" N 68°6'36" W)|E|FZUS51.KCAR |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44035|NC|2-meter discus buoy||Buoy J0201 - Cobscook Bay||44.890 N 67.020 W (44°53'24" N 67°1'12" W)|E|FZUS51.KCAR |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44036|NC|2-meter discus buoy||Buoy K0102 - Saint John||45.200 N 66.020 W (45°12'0" N 66°1'12" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44037|NC|2-meter discus buoy||Buoy M0102 - Jordan Basin||43.484 N 67.883 W (43°29'2" N 67°53'0" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44038|NC|2-meter discus buoy||Buoy L0102 - Scotian Shelf||43.633 N 66.550 W (43°38'0" N 66°33'0" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  44039|Y|2.4-meter foam hull buoy||Central Long Island Sound||41.138 N 72.655 W (41°8'15" N 72°39'18" W)|E|FZUS51.KOKX | 44040|Y|Buoy||Western Long Island Sound||40.956 N 73.580 W (40°57'21" N 73°34'48" W)|E|FZUS51.KOKX | 44041|CB|Moored Buoy||Jamestown, VA||37.204 N 76.777 W (37°12'15" N 76°46'38" W)|E| | 44042|CB|Moored Buoy||Potomac, MD||38.033 N 76.336 W (38°1'59" N 76°20'8" W)|E| | 44043|CB|CBOS Station||Patapsco, MD||39.152 N 76.391 W (39°9'7" N 76°23'28" W)|E| | 44044|B|Moored Buoy||Patuxent River Buoy||38.389 N 76.526 W (38°23'19" N 76°31'35" W)|E| | 44052|VM|Marine Observation Buoy||Goodwin Islands||37.236 N 76.399 W (37°14'11" N 76°23'56" W)|E| | 44053|VM|Marine Observation Buoy||Gloucester Point||37.244 N 76.500 W (37°14'40" N 76°30'1" W)|E| | 44054|DW|Moored Buoy||Lower Delaware Bay Buoy||38.883 N 75.183 W (38°53'0" N 75°11'0" W)|E| |


 

44055|DW|Moored Buoy||Central Delaware Bay||39.122 N 75.256 W (39°7'20" N 75°15'20" W)|E| | 44056|AC|Waverider Buoy||Duck FRF, NC||36.200 N 75.714 W (36°12'0" N 75°42'51" W)|E| | 44057|CB|Moored Buoy||Susquehanna, MD||39.544 N 76.075 W (39°32'37" N 76°4'29" W)|E| | 44058|CB|Moored Buoy||Stingray Point, VA||37.552 N 76.251 W (37°33'6" N 76°15'5" W)|E| | 44059|CB|Moored Buoy||Norfolk, VA||36.846 N 76.298 W (36°50'44" N 76°17'53" W)|E| | 44060|Y|2.4-meter foam hull buoy||Eastern Long Island Sound||41.263 N 72.067 W (41°15'48" N 72°4'0" W)|E|FZUS51.KOKX | 44061|CB|Moored Buoy||Upper Potomac, MD||38.785 N 77.036 W (38°47'6" N 77°2'8" W)|E| | 44062|CB|Moored Buoy||Gooses Reef, MD||38.556 N 76.415 W (38°33'23" N 76°24'53" W)|E| | 44063|CB|Buoy||Annapolis||38.963 N 76.448 W (38°57'47" N 76°26'51" W)|E| | 44064|CB|Moored Buoy||FIRST LANDING||36.979 N 76.043 W (36°58'46" N 76°2'36" W)|E| | 44065|N|3-meter discus buoy|3D46|Entrance to New York Harbor|ARES payload|40.369 N 73.703 W (40°22'10" N 73°42'10" W)|E|FZUS51.KOKX FZUS51.KPHI| 44066|N|3-meter discus buoy|3D17|Texas Tower #4|ARES 4.4 payload|42.175 N 36.202 W (42°10'30" N 36°12'6" W)|E|FZNT22.KWBC |Station 44066 went adrift on 01/09/2012 and the last report from its moored position was at 0742Z. It ceased transmitting on 2/26/12, and resumed transmitting on 7/10/12 with no position data. This buoy will be restored to service when it can be worked into the schedule. When the service date is known, it will be posted in the  maintenance report. 44067|IN|Buoy||Potomac River, Near HWY 301||38.368 N 76.996 W (38°22'5" N 76°59'45" W)|E| | 44070|N|1.8-meter discus buoy|18D13|Buzzards Bay MA. Offshore|WAMDAS payload|41.392 N 71.004 W (41°23'33" N 71°0'13" W)|E| |

For area forecasts and warnings, select: Boston WFO

Met data for this area are available at BUZM3.

Station 44070 has been disestablished 

44095|R|Waverider Buoy||Oregon Inlet, NC - 192||35.750 N 75.330 W (35°45'0" N 75°19'48" W)|E| | 44096|R|Waverider Buoy||Cape Charles, VA - 186||37.023 N 75.810 W (37°1'23" N 75°48'35" W)|E| | 44097|R|Waverider Buoy||Block Island, RI (154)||40.981 N 71.117 W (40°58'52" N 71°7'1" W)|E| | 44098|NH|Waverider Buoy||Jeffrey's Ledge, NH (160)||42.801 N 70.169 W (42°48'3" N 70°10'7" W)|E| | 44099|R|Waverider Buoy||Cape Henry, VA (147)||36.901 N 75.720 W (36°54'5" N 75°43'12" W)|E| | 44100|R|Waverider Buoy||Duck FRF 26m, NC (430)||36.258 N 75.591 W (36°15'28" N 75°35'29" W)|E| | 44137|C|Canadian NOMAD buoy||East Scotia Slope||42.230 N 62.020 W (42°13'47" N 62°1'12" W)|N| | 44138|C|Canadian NOMAD buoy||SW Grand Banks||44.250 N 53.633 W (44°15'0" N 53°38'0" W)|N| | 44139|C|Canadian NOMAD buoy||Banqureau Banks||44.240 N 57.101 W (44°14'24" N 57°6'5" W)|N| | 44140|C|Canadian NOMAD buoy||Tail of the Bank||42.870 N 51.470 W (42°52'11" N 51°28'11" W)|N| | 44141|C|Canadian NOMAD buoy||Laurentian Fan||42.990 N 57.960 W (42°59'24" N 57°57'36" W)|N| | 44142|C|Canadian NOMAD buoy||La Have Bank||42.500 N 64.033 W (42°30'0" N 64°2'0" W)|N| | 44150|C|3-meter discus buoy||La Have Bank||42.500 N 64.020 W (42°30'0" N 64°1'12" W)|N| | 44172|R|Waverider Buoy||Halifax Harbor, NS, Canada - 176||44.500 N 63.408 W (44°30'0" N 63°24'29" W)|N| | 44174|C|Buoy||Anticosti||49.060 N 60.860 W (49°3'36" N 60°51'36" W)|?| | 44175|C|Buoy||iles de la Madeleine||46.880 N 62.000 W (46°52'48" N 62°0'0" W)|?| | 44235|C|Waverider Buoy||South Ramea Island, Newfoundland (170)||47.263 N 57.341 W (47°15'45" N 57°20'26" W)|N| | 44251|C|Canadian NOMAD buoy||Nickerson Bank||46.440 N 53.390 W (46°26'23" N 53°23'24" W)|N| | 44255|C|Canadian NOMAD buoy||NE Burgeo Bank||47.270 N 57.340 W (47°16'12" N 57°20'24" W)|N| | 44258|C|Canadian NOMAD buoy||Halifax Harbour||44.500 N 63.400 W (44°30'0" N 63°24'0" W)|N| | 44401|N|2.6-meter discus buoy|2.6D76|790 NM NE of Bermuda|DART II payload|37.922 N 50.010 W (37°55'21" N 50°0'37" W)|?| |

Current station has hull 2.6D76.

Old hull 2.6D52 has gone adrift from station 44401 at 4/16/2011 and has been been renamed 444X1. Position data only can be found here

44402|N|2.6-meter discus buoy|2.6D72|136NM SE of Fire Island, NY.|DART II payload|39.399 N 70.942 W (39°23'58" N 70°56'30" W)|?| | 44585|N|Drifting Buoy||Drifting Buoy||43.354 N 67.635 W (43°21'14" N 67°38'6" W)|?| |Wind speed corrected to the 10-meter height. 45001|N|3-meter discus buoy|3DV15|MID SUPERIOR 60NM North Northeast Hancock, MI|AMPS payload|48.064 N 87.777 W (48°3'49" N 87°46'37" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS


45002|N|2.4-meter discus buoy|2.4DV04|N MICHIGAN- Halfway between North Manitou and Washington Islands.|ARES payload|45.344 N 86.411 W (45°20'40" N 86°24'41" W)|C| |

For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS

45003|N|2.4-meter discus buoy|2.4DV03|N HURON 37NM Northeast of Alpena, MI|ARES payload|45.351 N 82.840 W (45°21'3" N 82°50'23" W)|E| |

For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS


45004|N|2.4-meter discus buoy|2.4DV05|78NM Northeast of Marquette, MI|ARES payload|47.584 N 86.587 W (47°35'3" N 86°35'12" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS 45005|N|3-meter discus buoy|3DV22|W ERIE 28NM Northwest of Cleveland, OH|AMPS payload|41.677 N 82.398 W (41°40'36" N 82°23'54" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS
45006|N|3-meter discus buoy|3DV20|W SUPERIOR 48NM North of Ironwood, MI|AMPS payload|47.335 N 89.793 W (47°20'5" N 89°47'34" W)|C| |

For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS


45007|N|3-meter discus buoy|3DV19|S MICHIGAN 43NM East Southeast of Milwaukee, WI|AMPS payload|42.674 N 87.026 W (42°40'25" N 87°1'34" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS




45008|N|3-meter discus buoy|3D41|S HURON 43NM East of Oscoda, MI|ARES 4.4 payload|44.283 N 82.416 W (44°17'0" N 82°24'59" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS


45009|N|3-meter discus buoy|||DACT payload|41.600 N 82.000 W (41°36'0" N 82°0'0" W)|E| | 45010|N|2.4-meter discus buoy|||DACT payload|43.000 N 87.800 W (43°0'0" N 87°47'60" W)|E| | 45011|N|3-meter discus buoy|02|Grand Haven Michigan|VEEP payload|43.020 N 86.270 W (43°1'12" N 86°16'12" W)|E| | 45012|N|2.4-meter foam hull buoy|2.4DV06|Lake Ontario Buoy - 20NM North Northeast of Rochester, NY|ARES payload|43.619 N 77.405 W (43°37'9" N 77°24'18" W)|E| |

For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS


 


45013|WM|Buoy||Atwater Park, WI||43.098 N 87.850 W (43°5'54" N 87°50'59" W)|C| | 45014|WM|Buoy||Central Green Bay, WI||44.795 N 87.759 W (44°47'41" N 87°45'32" W)|C| | 45015|CH|Buoy||Calumet Beach||41.714 N 87.527 W (41°42'52" N 87°31'38" W)|C| | 45016|CH|Buoy||Sixth-third St Beach||41.783 N 87.573 W (41°46'58" N 87°34'23" W)|| | 45017|CH|Buoy||Oak St Beach||41.903 N 87.622 W (41°54'12" N 87°37'20" W)|C| | 45018|CH|Buoy||Montrose Ave Beach||41.968 N 87.637 W (41°58'4" N 87°38'14" W)|C| | 45019|CH|Buoy||Foster Ave. Beach||41.979 N 87.649 W (41°58'45" N 87°38'55" W)|C| | 45020|MI|Moored Buoy||Grand Traverse Bay Observing System Station 1||44.789 N 85.604 W (44°47'20" N 85°36'16" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS. 45021|MI|Moored Buoy||Traverse Bay #3, MI||45.048 N 85.493 W (45°2'53" N 85°29'35" W)|E| | 45022|MI|Moored Buoy||Little Traverse Bay, MI||45.403 N 85.088 W (45°24'11" N 85°5'16" W)|E| | 45023|MT|Moored Buoy||Portage Canal||47.279 N 88.611 W (47°16'44" N 88°36'38" W)|E| | 45024|MI|Moored Buoy||Ludington, MI||43.977 N 86.560 W (43°58'36" N 86°33'36" W)|E| | 45025|MT|Buoy||South Entrance to Keweenaw Waterway, MI||46.950 N 88.409 W (46°57'1" N 88°24'34" W)|C| | 45026|LT|Buoy||St. Joseph, MI||41.983 N 86.617 W (41°58'57" N 86°37'0" W)|E| | 45027|MN|Buoy||North of Duluth, MN||46.864 N 91.929 W (46°51'52" N 91°55'45" W)|C| | 45028|MN|||Western Lake Superior||46.812 N 91.835 W (46°48'42" N 91°50'6" W)|C| | 45029|LT|Buoy||Holland, MI||42.801 N 86.264 W (42°48'2" N 86°15'51" W)|E| | 45132|C|Canadian NOMAD buoy||Port Stanley||42.470 N 81.220 W (42°28'12" N 81°13'12" W)|E| | 45135|C|Canadian NOMAD buoy||Prince Edward Pt||43.790 N 76.870 W (43°47'24" N 76°52'12" W)|E| | 45136|C|Canadian NOMAD buoy||Slate Island||48.530 N 86.950 W (48°31'48" N 86°57'0" W)|E| | 45137|C|Canadian NOMAD buoy||Georgian Bay||45.540 N 81.010 W (45°32'24" N 81°0'36" W)|E| | 45138|C|Canadian NOMAD buoy||Mount Louis||49.540 N 65.760 W (49°32'23" N 65°45'36" W)|E| | 45139|C|Canadian NOMAD buoy||West Lake Ontario - Grimsby||43.260 N 79.540 W (43°15'36" N 79°32'24" W)|E| | 45140|C|Canadian NOMAD buoy||Lake Winnipeg S. Basin||50.790 N 96.730 W (50°47'23" N 96°43'48" W)|C| | 45142|C|Canadian NOMAD buoy||Port Colborne||42.740 N 79.290 W (42°44'24" N 79°17'24" W)|E| | 45143|C|||South Georgian Bay||44.940 N 80.630 W (44°56'24" N 80°37'48" W)|E| | 45144|C|Canadian NOMAD buoy||Lake Winnipeg North||53.230 N 98.290 W (53°13'47" N 98°17'24" W)|C| | 45145|C|Canadian NOMAD buoy||Lake Winnipeg Narrows||51.867 N 96.970 W (51°52'0" N 96°58'11" W)|C| | 45147|C|Canadian NOMAD buoy||Lake St Clair||42.430 N 82.680 W (42°25'48" N 82°40'48" W)|E| | 45148|C|Canadian NOMAD buoy||Lake of the Woods||49.660 N 94.520 W (49°39'35" N 94°31'11" W)|C| | 45149|C|Canadian NOMAD buoy||Southern Lake Huron||43.540 N 82.070 W (43°32'23" N 82°4'12" W)|E| | 45151|C|Canadian NOMAD buoy||Lake Simcoe||44.500 N 79.370 W (44°30'0" N 79°22'12" W)|E| | 45152|C|Canadian NOMAD buoy||Lake Nipissing||46.230 N 79.720 W (46°13'48" N 79°43'12" W)|E| | 45154|C|Canadian NOMAD buoy||North Channel East||46.050 N 82.640 W (46°3'0" N 82°38'24" W)|E| | 45159|C|Canadian NOMAD buoy||NW Lake Ontario Ajax||43.770 N 78.980 W (43°46'12" N 78°58'48" W)|E| | 45160|C|Canadian NOMAD buoy||16-Mile Creek||43.417 N 79.633 W (43°25'1" N 79°38'0" W)|E| |Experimental buoy no longer operating. 45161|G|Buoy||Muskegon, MI||43.179 N 86.336 W (43°10'43" N 86°20'11" W)|E| | 45162|G|Buoy||Alpena, MI||44.984 N 83.269 W (44°59'3" N 83°16'7" W)|E| | 45163|G|Buoy||Saginaw Bay, MI||43.988 N 83.599 W (43°59'17" N 83°35'56" W)|E| | 45164|G|Buoy||Cleveland, OH||41.734 N 81.698 W (41°44'1" N 81°41'54" W)|E| | 46001|N|6-meter NOMAD buoy|6N25|GULF OF AK 175NM South East of Kodiak, AK|ARES 4.4 payload|56.304 N 147.920 W (56°18'16" N 147°55'13" W)|A|FZAK61.PAFC | 46002|N|3-meter discus buoy|3D30|OREGON - 275NM West of Coos Bay OR|AMPS payload|42.589 N 130.474 W (42°35'21" N 130°28'28" W)|P|FZPN25.KWBC | 46003|N|6-meter NOMAD buoy| 21|S ALEUTIANS|DACT payload|51.831 N 155.850 W (51°49'53" N 155°51'1" W)|A| |Buoy 46003 disestablished in 1999. Buoy 46066 was established nearby. 46004|C|Canadian NOMAD buoy||Middle Nomad||50.930 N 136.100 W (50°55'47" N 136°6'0" W)|P| | 46005|N|3-meter discus buoy|3D77|WASHINGTON 315NM West of Aberdeen, WA|AMPS payload|46.100 N 131.001 W (46°5'59" N 131°0'5" W)|P|FZPN25.KWBC | 

Station 46005 stopped transmitting 07/01/12. It will be restored to service when it can be worked into the schedule. When the service date is known, it will be posted in the maintenancereport.

46006|N|3-meter discus buoy|3D08|SE PAPA - 600NM West of Eureka, CA|ARES 4.4 payload|40.754 N 137.464 W (40°45'16" N 137°27'51" W)|P|FZPN01.KWBC | 46007|N|6-meter NOMAD buoy|||MVXI payload|59.200 N 152.700 W (59°12'0" N 152°41'60" W)|A| |(formerly eb39) 46008|N|12-meter discus buoy|||MVXII payload|57.100 N 151.700 W (57°6'0" N 151°42'0" W)|A| |(formerly eb72) 46009|N|6-meter NOMAD buoy|||MVXI payload|60.200 N 146.800 W (60°12'0" N 146°48'0" W)|A| |(formerly eb45) 46010|N|USCG Large Navigational Buoy|||GSBP payload|46.200 N 124.200 W (46°12'0" N 124°12'0" W)|P| | 46011|N|3-meter discus buoy|3D68|SANTA MARIA - 21 NM Northwest of Point Arguello, CA|AMPS payload|35.000 N 120.992 W (35°0'0" N 120°59'30" W)|P|FZUS56.KLOX FZUS56.KMTR| 46012|N|3-meter discus buoy|3D13|HALF MOON BAY - 24NM South Southwest of San Francisco, CA|AMPS payload|37.363 N 122.881 W (37°21'45" N 122°52'52" W)|P|FZUS56.KMTR |

Station 46012 is transmitting intermittently since 8/19/12. This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.

"Potential Explosion Hazard Exists for this Buoy"

46013|N|3-meter discus buoy|3D48|Bodega Bay - 48NM North Northwest of San Francisco, CA|AMPS payload|38.242 N 123.301 W (38°14'31" N 123°18'2" W)|P|FZUS56.KMTR |
"Potential Explosion Hazard Exist for this Buoy"

46014|N|3-meter discus buoy|3D44|PT ARENA - 19NM North of Point Arena, CA|AMPS payload|39.235 N 123.974 W (39°14'6" N 123°58'26" W)|P|FZUS56.KEKA FZUS56.KMTR|"Potential Explosive Hazard Exists for this Buoy"
46015|N|3-meter discus buoy|3DV03|Port Orford - 16 NM West of Port Orford, OR|AMPS payload|42.764 N 124.832 W (42°45'52" N 124°49'57" W)|P|FZUS56.KMFR | 46016|N|Platform EXXON||||63.283 N 170.300 W (63°17'0" N 170°18'0" W)|A| | 46017|N|Platform EXXON 6||||60.283 N 172.300 W (60°17'0" N 172°18'0" W)|A| | 46018|N|MAREX||||60.283 N 177.000 W (60°17'0" N 177°0'0" W)|A| | 46019|N|Platform||||57.200 N 170.300 W (57°12'0" N 170°18'0" W)|A| | 46020|N|MAREX||||55.883 N 168.000 W (55°53'0" N 168°0'0" W)|A| | 46021|N|MAREX||||57.700 N 160.000 W (57°42'0" N 160°0'0" W)|A| | 46022|N|3-meter discus buoy|3D69|EEL RIVER - 17NM West-Southwest of Eureka, CA|ARES 4.4 payload|40.724 N 124.578 W (40°43'25" N 124°34'41" W)|P|FZUS56.KEKA | 46023|N|10-meter discus buoy|10D04| PT ARGUELLO - 17NM West Northwest of Point Arguello, CA|DACT payload|34.714 N 120.967 W (34°42'50" N 120°58'0" W)|P|FZUS56.KLOX |This station has been disestablished as of 9/8/10. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed.

In the absence of the station, the NOAA-NDBC directs the user to station  46011 (Santa Maria, CA) which is currently located eleven (11) nautical miles from the disestablished station.

46024|N|10-meter discus buoy|||GSBP payload|33.000 N 119.200 W (33°0'0" N 119°12'0" W)|P| | 46025|N|3-meter discus buoy|3D57|Santa Monica Basin - 33NM West Southwest of Santa Monica, CA|ARES payload|33.749 N 119.053 W (33°44'58" N 119°3'10" W)|P|FZUS56.KLOX |

"Potential Explosion Hazard Exists for this Buoy"

Station 46025 failed on 4/11/2012.  It will be restored to service when it can be worked into the schedule.  When the date is known it will be posted in the Weekly Maintenance Report.

46026|N|3-meter discus buoy|3D60|SAN FRANCISCO - 18NM West of San Francisco, CA|AMPS payload|37.759 N 122.833 W (37°45'32" N 122°50'0" W)|P|FZUS56.KMTR |"Potential Explosion Hazard Exists for this Buoy"

46027|N|3-meter discus buoy|3D28|ST GEORGES - 8NM West Northwest of Crescent City, CA|AMPS payload|41.850 N 124.381 W (41°51'1" N 124°22'52" W)|P|FZUS56.KMFR FZUS56.KEKA|

"Potential Explosion Hazard Exists for this Buoy"

46028|N|3-meter discus buoy|3D53|CAPE SAN MARTIN - 55NM West Northwest of Morro Bay, CA|ARES payload|35.741 N 121.884 W (35°44'29" N 121°53'3" W)|P|FZUS56.KMTR |
46029|N|3-meter discus buoy|3D86|COL RIVER BAR - 20NM West of Columbia River Mouth|ARES 4.4 payload|46.159 N 124.514 W (46°9'32" N 124°30'52" W)|P|FZUS56.KPQR | 46030|N|3-meter discus buoy| 56|BLUNTS REEF|VEEP payload|40.423 N 124.525 W (40°25'22" N 124°31'31" W)|P|FZUS56.KEKA |This station was dis established during 2002. The National Weather Service decided to move the station location to Southern Oregon, where it is identified as 46015. The closest buoy is now 46022. 46031|N|Platform||||55.500 N 161.683 W (55°30'0" N 161°41'0" W)|P| | 46032|N|MAREX||||54.200 N 165.800 W (54°12'0" N 165°48'0" W)|A| | 46033|N|MAREX||||55.783 N 159.800 W (55°47'0" N 159°48'0" W)|P| | 46034|N|MAREX||||55.100 N 163.100 W (55°6'0" N 163°5'60" W)|A| | 46035|N|12-meter discus buoy|12D02|BERING SEA 310 NM North of Adak, AK|ARES 4.4 payload|57.067 N 177.750 W (57°4'0" N 177°45'0" W)|A|FZAK62.PAFC | 46036|C|Canadian NOMAD buoy||South Nomad||48.351 N 133.940 W (48°21'5" N 133°56'23" W)|P| | 46037|N|3-meter discus buoy|||DACT payload|48.300 N 133.800 W (48°17'60" N 133°48'0" W)|P| | 46038|N|ELB|||DACT payload|41.900 N 124.400 W (41°53'60" N 124°24'0" W)|P| | 46039|N|ATON|||DACT payload|48.200 N 123.400 W (48°12'0" N 123°24'0" W)|P| | 46040|N|3-meter discus buoy|||DACT payload|44.800 N 124.300 W (44°47'60" N 124°17'60" W)|P| | 46041|N|3-meter discus buoy|3D19|CAPE ELIZABETH- 45NM Northwest of Aberdeen, WA|AMPS payload|47.349 N 124.708 W (47°20'58" N 124°42'30" W)|P|FZUS56.KSEW |"Potential Explosion Hazard Exists for this Buoy" 46042|N|3-meter discus buoy|3D69|MONTEREY - 27NM West of Monterey Bay, CA|ARES payload|36.785 N 122.469 W (36°47'7" N 122°28'9" W)|P|FZUS56.KMTR |"Potential Explosion Hazard Exists for this Buoy" 46043|N|ELB|||DACT payload|46.900 N 124.200 W (46°53'60" N 124°12'0" W)|P| | 46044|MB|2.3-meter NOOSS buoy|2.3DV05||AMPS payload|36.751 N 122.335 W (36°45'5" N 122°20'6" W)|| |NDBC/MBARI Co-op Effort

This site is currently in test. This is NOT an operational weather station.

Subsurface Conductivity and Temperature data are available at 46B44. 46045|N|3-meter discus buoy|V08|REDONDO BEACH|DACT payload|33.840 N 118.450 W (33°50'24" N 118°27'0" W)|P|FZUS56.KLOX | 46047|N|3-meter discus buoy|3D27|TANNER BANK - 121NM West of San Diego, CA|ARES 4.4 payload|32.403 N 119.536 W (32°24'11" N 119°32'8" W)|P|FZUS56.KSGX FZPN26.KWBC| 46048|N|10-meter discus buoy|||VEEP payload|32.900 N 117.900 W (32°53'60" N 117°54'0" W)|P| | 46050|N|3-meter discus buoy|3D05|STONEWALL BANK - 20NM West of Newport, OR|AMPS payload|44.639 N 124.534 W (44°38'20" N 124°32'2" W)|P|FZUS56.KPQR |


46051|N|3-meter discus buoy|41|Harvest Experiment Platform|DACT payload|34.480 N 120.690 W (34°28'48" N 120°41'24" W)|P|FZUS56.KLOX | 46053|N|3-meter discus buoy|3D10|E. SANTA BARBARA - 12NM Southwest of Santa Barbara, CA|ARES 4.4 payload|34.248 N 119.841 W (34°14'52" N 119°50'28" W)|P|FZUS56.KLOX | 46054|N|3-meter discus buoy|3D26|SANTA BARBARA W 38 NM West of Santa Barbara, CA|ARES payload|34.274 N 120.459 W (34°16'28" N 120°27'34" W)|P|FZUS56.KLOX |

Station 46054 is transmitting intermittently.   This buoy will be restored to servicewhen it can be worked into the schedule.  When the service date is known,it will be posted in the maintenancereport.

46059|N|3-meter discus buoy|3D09|CALIFORNIA - 357NM West of San Francisco, CA|AMPS payload|38.047 N 129.969 W (38°2'49" N 129°58'8" W)|P|FZPN26.KWBC |

Station 46059 went adrift on 05/19/2012 and the last report from its moored position was at 1000Z.  The buoy was recovered on 6/5/12, and will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.

Click here to see the latest positions.

46060|N|3-meter discus buoy|3D52|West Orca Bay 36NM South Southwest of Valdez, AK|AMPS payload|60.584 N 146.784 W (60°35'1" N 146°47'1" W)|A|FZAK51.PAFC |

Station 46060 has been re established with hull 3D52. The previous hull 3D61 is still adrift/aground.

46061|N|6-meter NOMAD buoy|6N18|Seal Rocks 55NM South of Valdez, AK|ARES 4.4 payload|60.233 N 146.834 W (60°13'58" N 146°50'1" W)|A|FZAK51.PAFC | 46062|N|3-meter discus buoy|06|Pt. San Luis, CA - 18 NM South Southwest of Morro Bay, CA|ARES payload|35.101 N 121.010 W (35°6'3" N 121°0'36" W)|P|FZUS56.KLOX |Station 46062 was disestablished on November 21, 2004. 46063|N|3-meter discus buoy|3D60|Pt.Conception, CA - 50NM West of Santa Barbara, CA|ARES 4.4 payload|34.273 N 120.699 W (34°16'21" N 120°41'55" W)|P|FZUS56.KLOX |This station has been disestablished.

The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed.   In the absence of the station, the NOAA-NDBC directs the user to station 46054 (Santa Barbara, CA) which is currently located eleven (11) nautical miles from the disestablished station. 46066|N|6-meter NOMAD buoy|6N42|S Aleutians 380NM Southwest of Kodiak, AK|ARES payload|52.737 N 154.961 W (52°44'14" N 154°57'40" W)|A|FZPN01.KWBC | Station 46066 stopped transmitting 10/25/11. This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report. 46069|N|3-meter discus buoy|3D89|South Santa Rosa Island, CA|AMPS payload|33.670 N 120.200 W (33°40'13" N 120°12'0" W)|P|FZUS56.KLOX |
  46070|N|6-meter NOMAD buoy|6N49|S.W. Bering Sea|ARES payload|55.083 N 175.270 E (55°5'0" N 175°16'12" E)|A| |

For area forecasts and warnings, select: Anchorage WFO.


46071|N|6-meter NOMAD buoy|6N44|Western Aleutians|ARES payload|51.141 N 179.119 E (51°8'28" N 179°7'9" E)|A|FZAK52.PAFC |

NOTICE:  In addition  to  the  present 6  meter  hull  for  station  46071, the  old  6  meter  hull  forthe station  is  still located  at  position 51.155N, 179.001E (51*09'17"N 179*00'02"E)

46072|N|6-meter NOMAD buoy|6N32|Central Aleutians 230NM Southwest of Dutch Harbor|ARES 4.4 payload|51.663 N 172.162 W (51°39'46" N 172°9'43" W)|A|FZAK52.PAFC |


46073|N|12-meter discus buoy|12D01|Southeast Bering Sea|MARS payload|55.011 N 171.981 W (55°0'40" N 171°58'50" W)|A|FZAK52.PAFC |Station 46073 stopped transmitting 04/07/11. This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.  46075|N|6-meter NOMAD buoy|6N46|Shumagin Islands, AK|ARES payload|53.911 N 160.806 W (53°54'39" N 160°48'21" W)|A|FZAK52.PAFC | 46076|N|6-meter NOMAD buoy|6N61|Cape Cleare AK|ARES payload|59.498 N 147.983 W (59°29'54" N 147°58'59" W)|A|FZAK51.PAFC | 46077|N|6-meter NOMAD buoy|6N52|Shelikof Strait, AK|ARES payload|57.892 N 154.291 W (57°53'32" N 154°17'26" W)|A| |CAUTION....This buoy is protected from northwest winds. Northwest winds may be much stronger in other parts of Shelikof Strait.
46078|N|6-meter NOMAD buoy|6N54|Albatross Banks AK|ARES payload|56.074 N 152.572 W (56°4'25" N 152°34'20" W)|A|FZAK51.PAFC |

Station 46078 stopped transmitting on 1/18/12. Station 46078 was discovered to not have an O&I Light 6/19/12. Buoy damaged beyond repair. This buoy will be fully restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.  

46079|N|6-meter NOMAD buoy|34|Barren Island|DACT payload|59.050 N 152.230 W (59°3'0" N 152°13'48" W)|N|FZAK51.PAFC |Buoy 46079 has failed. 46080|N|6-meter NOMAD buoy|6N41|Northwest Gulf 57NM East of Kodiak, AK|ARES payload|58.036 N 149.985 W (58°2'10" N 149°59'5" W)|A|FZAK61.PAFC |
  46081|N|6-meter NOMAD buoy|6N35|Western Prince William Sound|ARES 4.4 payload|60.794 N 148.285 W (60°47'40" N 148°17'5" W)|A|FZAK51.PAFC |

Station 46081 stopped transmitting 12/04/11. This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.

Funding to support water measurements of the velocity profile, temperature, and salinity is provided by the Prince William Sound Science Center.

NDBC ADCPs are now quality controlled using automated methods. Historical and forty-five day files beginning 1 June 2010 are available in a new format that contains more QC information.  The forty-five day files in the old format will be resident until approximately 31 July 2010.

46082|N|6-meter NOMAD buoy|6N47|Cape Suckling 84NM Southeast of Cordova, AK|ARES 4.4 payload|59.668 N 143.392 W (59°40'6" N 143°23'32" W)|A|FZAK52.PAJK FZAK51.PAJK| 46083|N|6-meter NOMAD buoy|6N31|Fairweather Grounds 92NM Southeast of Yakutat, AK|ARES 4.4 payload|58.237 N 137.986 W (58°14'13" N 137°59'8" W)|A|FZAK52.PAJK FZAK51.PAJK|
46084|N|6-meter NOMAD buoy|6N14|Cape Edgecumbe Buoy AK|ARES 4.4 payload|56.612 N 136.065 W (56°36'44" N 136°3'55" W)|A|FZAK52.PAJK FZAK51.PAJK|

Station 46084 went adrift on 08/25/2012 and the last report from its moored position was at 0600Z. The buoy was recovered on 8/31/12, and will be restored to service when it can be worked into the schedule. When service date is known, it will be posted int he maintenance report.

46085|N|6-meter NOMAD buoy|6N21|Central Gulf of Alaska Buoy|ARES 4.4 payload|55.868 N 142.492 W (55°52'5" N 142°29'31" W)|A|FZAK52.PAJK FZAK51.PAJK|Station 46085 stopped transmitting on 6/23/12. This buoy will be fully restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report. 46086|N|3-meter discus buoy|3D20|San Clemente Basin|ARES 4.4 payload|32.491 N 118.034 W (32°29'27" N 118°2'4" W)|P|FZUS56.KSGX | 46087|N|3-meter discus buoy|3D16|Neah Bay, WA (Traffic Separation Lighted Buoy)|AMPS payload|48.494 N 124.728 W (48°29'37" N 124°43'39" W)|P|FZUS56.KSEW | 46088|N|3-meter discus buoy|3D90|New Dungeness, WA (Hein Bank)|AMPS payload|48.333 N 123.167 W (48°20'0" N 123°10'0" W)|P|FZUS56.KSEW |Pressure Tendency is not normally reported for this station. 46089|N|3-meter discus buoy|3D62|Tillamook, OR - 85 NM WNW of Tillamook, OR|AMPS payload|45.893 N 125.819 W (45°53'36" N 125°49'9" W)|P|FZUS56.KPQR |Station 46089 stopped transmitting 08/12/2012. This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report. 46091|MB|Buoy||MBM0||36.835 N 121.899 W (36°50'6" N 121°53'55" W)|P|FZUS56.KMTR | 46092|MB|Buoy||MBM1||36.750 N 122.020 W (36°45'0" N 122°1'12" W)|P|FZUS56.KMTR | 46093|MB|Buoy||MBM2||36.690 N 122.410 W (36°41'24" N 122°24'36" W)|P|FZUS56.KMTR | 46094|OR|Moored Buoy||West of Newport NH-10, OR||44.633 N 124.304 W (44°38'0" N 124°18'13" W)|P| | 46096|CM|Buoy||Columbia River Entrance - SATURN Station #02 Offshore||46.173 N 124.127 W (46°10'24" N 124°7'38" W)|P| | 46105|N|1.8-meter discus buoy|1.8D06|South Cook Inlet AK|WAMDAS payload|59.049 N 152.233 W (59°2'55" N 152°14'0" W)|A|FZAK51.PAFC |

Station 46105 ceased transmitting on 1/16/12.

 

46106|N|1.8-meter discus buoy||Central Cook Inlet AK|WAMDAS payload|59.760 N 152.090 W (59°45'36" N 152°5'24" W)|A|FZAK58.PAVW FZAK51.PAFC|

Other weather data for this area are available at FILA2.

Station 46106 stopped transmitting 2/25/2010, went adrift on 05/17/2010, and was recovered to port on 5/21/10.

This station has been disestablished as of 5/6/11. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed.

Another buoy, owned and operated by the Scripps CDIP program has been established on this location and is providing data as station 46108.

46107|N|1.8-meter discus buoy|1.8D09|Montague Strait|WAMDAS payload|59.925 N 147.992 W (59°55'30" N 147°59'31" W)|A|FZAK51.PAJK |This station has been disestablished as of 2/12/11. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed. 46108|R|Waverider Buoy||Central Cook Inlet - 175||59.760 N 152.090 W (59°45'36" N 152°5'24" W)|A| |This buoy is deployed on the same location previously operated by NDBC as Station 46106. 46109|IN|Buoy||Port Angeles Buoy||48.123 N 123.395 W (48°7'23" N 123°23'42" W)|P| | 46110|IN|Buoy||Sequim Buoy||48.115 N 123.032 W (48°6'56" N 123°1'54" W)|P| | 46111|IN|Buoy||Fort Worden Buoy||48.131 N 122.748 W (48°7'51" N 122°44'54" W)|P| | 46112|IN|Buoy||Marrowstone Buoy||48.100 N 122.730 W (48°5'59" N 122°43'48" W)|P| | 46113|IN|Buoy||Poulsbo Buoy||47.730 N 122.646 W (47°43'47" N 122°38'45" W)|P| | 46114|N|Waverider Buoy|30743|West Monterey Bay, CA|An industry-supplied payload|36.710 N 122.342 W (36°42'35" N 122°20'32" W)|P| | 46115|N|12-meter discus buoy||Bering Sea|ARES 4.4 payload|57.069 N 177.750 W (57°4'10" N 177°45'0" W)|?| |For area forecasts and warnings, select: Anchorage WFO

Hourly air temperature, wind  and wave data from another payload system on this deployed buoy are available using this link: 46035

Data from station 46035 will be restored to full service when it can be worked into the schedule.  When the date is known, it will be posted in the Maintenance Report.
46120|WA|Buoy||Pt Wells, WA (U of Wash)||47.761 N 122.397 W (47°45'40" N 122°23'50" W)|P| | 46121|WA|Buoy||Carr Inlet, WA (U of Wash) ||47.280 N 122.730 W (47°16'48" N 122°43'48" W)|P| | 46122|WA|Buoy||Dabob Bay, WA (U of Wash)||47.803 N 122.803 W (47°48'12" N 122°48'10" W)|P| | 46123|WA|Buoy||Twanoh - Hood Canal, WA (U of Wash)||47.375 N 123.008 W (47°22'30" N 123°0'30" W)|P| | 46124|WA|Buoy||Hoodsport - Hood Canal, WA (U of Wash)||47.422 N 123.112 W (47°25'18" N 123°6'45" W)|P| | 46125|WA|Buoy||Hansville - Hood Canal, WA||47.907 N 122.627 W (47°54'26" N 122°37'37" W)|P| | 46131|C|Canadian NOMAD buoy||Sentry Shoal||49.910 N 124.990 W (49°54'35" N 124°59'23" W)|P| | 46132|C|Canadian NOMAD buoy||South Brooks||49.740 N 127.930 W (49°44'24" N 127°55'48" W)|P| | 46134|C|Canadian NOMAD buoy||Pat Bay||48.650 N 123.500 W (48°38'59" N 123°30'0" W)|P| | 46138|C|Waverider Buoy||South Hecate Strait, Canada (174)||52.437 N 129.795 W (52°26'12" N 129°47'42" W)|A| | 46139|C|Waverider Buoy||La Perouse Bank DWR, Canada (215)||48.840 N 126.000 W (48°50'24" N 126°0'0" W)|P| |To view data from a nearby buoy 46206.
46145|C|Canadian NOMAD buoy||Central Dixon Entrance Buoy||54.370 N 132.420 W (54°22'11" N 132°25'11" W)|P| | 46146|C|Canadian NOMAD buoy||Halibut Bank||49.340 N 123.730 W (49°20'24" N 123°43'48" W)|P| | 46147|C|Canadian NOMAD buoy||South Moresby||51.830 N 131.220 W (51°49'47" N 131°13'11" W)|P| | 46181|C|Canadian NOMAD buoy||Nanakwa Shoal||53.830 N 128.830 W (53°49'47" N 128°49'47" W)|P| | 46183|C|Canadian NOMAD buoy||North Hecate Strait||53.620 N 131.100 W (53°37'11" N 131°6'0" W)|P| | 46184|C|Canadian NOMAD buoy||North Nomad||53.910 N 138.850 W (53°54'35" N 138°51'0" W)|P| | 46185|C|Canadian NOMAD buoy||South Hecate Strait||52.420 N 129.790 W (52°25'12" N 129°47'23" W)|P| | 46204|C|Canadian NOMAD buoy||West Sea Otter||51.370 N 128.750 W (51°22'11" N 128°45'0" W)|P| | 46205|C|Canadian NOMAD buoy||West Dixon Entrance||54.160 N 134.280 W (54°9'35" N 134°16'48" W)|P| | 46206|C|Canadian NOMAD buoy||La Perouse Bank||48.840 N 126.000 W (48°50'24" N 126°0'0" W)|P| |To view data from a nearby buoy 46139. 46207|C|Canadian NOMAD buoy||East Dellwood||50.870 N 129.920 W (50°52'11" N 129°55'11" W)|P| | 46208|C|Canadian NOMAD buoy||West Moresby||52.520 N 132.690 W (52°31'12" N 132°41'23" W)|P| | 46211|R|Waverider Buoy||Grays Harbor, WA (036)||46.857 N 124.244 W (46°51'24" N 124°14'40" W)|P| | 46212|R|Waverider Buoy||Humboldt Bay South Spit, CA (128)||40.753 N 124.313 W (40°45'12" N 124°18'48" W)|P|FZUS56.KEKA | 46213|R|Waverider Buoy||Cape Mendocino, CA (094)||40.294 N 124.740 W (40°17'38" N 124°44'25" W)|P|FZUS56.KEKA | 46214|R|Waverider Buoy||Point Reyes, CA (029)||37.945 N 123.470 W (37°56'43" N 123°28'11" W)|P|FZUS56.KMTR | 46215|R|Waverider Buoy||Diablo Canyon, CA (076)||35.204 N 120.860 W (35°12'13" N 120°51'36" W)|P|FZUS56.KLOX | 46216|R|Waverider Buoy||Goleta Point, CA (107)||34.334 N 119.804 W (34°20'1" N 119°48'13" W)|P|FZUS56.KLOX | 46217|R|Waverider Buoy||Anacapa Passage, CA (111)||34.167 N 119.435 W (34°10'2" N 119°26'5" W)|P|FZUS56.KLOX | 46218|R|Waverider Buoy||Harvest, CA (071)||34.451 N 120.769 W (34°27'2" N 120°46'7" W)|P|FZUS56.KLOX | 46219|R|Waverider Buoy||San Nicolas Island, CA (067)||33.221 N 119.882 W (33°13'17" N 119°52'55" W)|P|FZUS56.KLOX | 46220|R|Waverider Buoy||El Porto, CA (125)||33.897 N 118.446 W (33°53'48" N 118°26'45" W)|P|FZUS56.KLOX |

Station 46220 was disestablished October 5, 2004. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box.

46221|R|Waverider Buoy||Santa Monica Bay, CA (028)||33.854 N 118.633 W (33°51'16" N 118°37'59" W)|P|FZUS56.KLOX | 46222|R|Waverider Buoy||San Pedro, CA (092)||33.618 N 118.317 W (33°37'4" N 118°19'1" W)|P|FZUS56.KLOX | 46223|R|Waverider Buoy||Dana Point, CA (096)||33.458 N 117.767 W (33°27'30" N 117°46'0" W)|P|FZUS56.KLOX | 46224|R|Waverider Buoy||Oceanside Offshore, CA (045)||33.179 N 117.471 W (33°10'46" N 117°28'17" W)|P|FZUS56.KSGX | 46225|R|Waverider Buoy||Torrey Pines Outer, CA (100)||32.930 N 117.393 W (32°55'49" N 117°23'33" W)|P|FZUS56.KSGX | 46226|R|Waverider Buoy||Point La Jolla, CA (095)||32.848 N 117.353 W (32°50'53" N 117°21'12" W)|P|FZUS56.KSGX FZUS56.KLOX|

Station 46226 was disestablished October 4, 2005. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box.

46227|R|Waverider Buoy||Point Loma, CA (091)||32.632 N 117.444 W (32°37'55" N 117°26'40" W)|P|FZUS56.KSGX |This was a seasonal buoy: February - July.

Station 46227 was disestablished August 27, 2005.  Use the "Observations from Nearby Stations and Ships" link below to see a listing of the nearest stations. The historical data will remain available. The station page is accessible via our historical map, or you can always just put the station ID in the Station ID Search box.


46228|R|Waverider Buoy||Pitas Point, CA (130)||34.317 N 119.417 W (34°19'0" N 119°25'0" W)|P|FZUS56.KLOX |Station 46228 was disestablished September 2, 2005. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 46229|R|Waverider Buoy||UMPQUA OFFSHORE, OR (139)||43.769 N 124.551 W (43°46'10" N 124°33'2" W)|P| | 46230|R|Waverider Buoy||Huntington Beach Nearshore, CA (172)||33.623 N 118.012 W (33°37'23" N 118°0'43" W)|P|FZUS56.KLOX |Station 46230 was disestablished November 17, 2006. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 46231|R|Waverider Buoy||Mission Bay, CA (093)||32.748 N 117.370 W (32°44'52" N 117°22'11" W)|P|FZUS56.KSGX | 46232|R|Waverider Buoy||Point Loma South, CA (191)||32.530 N 117.431 W (32°31'49" N 117°25'52" W)|P|FZUS56.KSGX | 46233|SC|Offshore Buoy||SCCOOS San Diego Mooring||32.936 N 117.320 W (32°56'10" N 117°19'11" W)|P|FZUS56.KSGX | 46234|R|Waverider Buoy||Port Hueneme Nearshore, CA (141)||34.100 N 119.168 W (34°6'0" N 119°10'3" W)|P|FZUS56.KLOX |Station 46234 was disestablished March 4, 2009. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 46235|R|Waverider Buoy||Imperial Beach Nearshore, CA (155)||32.572 N 117.167 W (32°34'18" N 117°10'0" W)|P|FZUS56.KSGX |Station 46235 was disestablished January 14, 2010. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 46236|R|Waverider Buoy||Monterey Canyon Outer, CA (156)||36.761 N 121.947 W (36°45'38" N 121°56'48" W)|P|FZUS56.KMTR | 46237|R|Waverider Buoy||San Francisco Bar, CA (142)||37.781 N 122.599 W (37°46'53" N 122°35'56" W)|P| | 46238|R|Waverider Buoy||San Nicolas Island North, CA (167)||33.499 N 119.490 W (33°29'57" N 119°29'23" W)|P| | 46239|R|Waverider Buoy||Point Sur, CA (157)||36.338 N 122.101 W (36°20'16" N 122°6'5" W)|P| | 46240|R|Waverider Buoy||Cabrillo Point, Monterey Bay, CA (158)||36.626 N 121.907 W (36°37'35" N 121°54'26" W)|P| | 46241|R|Waverider Buoy||San Elijo Nearshore, CA (161)||33.003 N 117.292 W (33°0'10" N 117°17'30" W)|P| | 46242|R|Waverider Buoy||Camp Pendleton Nearshore, CA (043)||33.220 N 117.440 W (33°13'12" N 117°26'23" W)|P| | 46243|R|Waverider Buoy||Clatsop Spit, OR - 162||46.216 N 124.128 W (46°12'56" N 124°7'41" W)|P| | 46244|R|Waverider Buoy||Humboldt Bay, North Spit, CA||40.888 N 124.357 W (40°53'18" N 124°21'24" W)|P| | 46245|R|Waverider Buoy||Ventura Nearshore, CA - 169||34.251 N 119.308 W (34°15'3" N 119°18'28" W)|P| |Station 46245 was disestablished February 9, 2011. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 46246|R|Waverider Buoy||Ocean Station PAPA (166)||49.985 N 145.089 W (49°59'7" N 145°5'20" W)|P| | 46247|R|Waverider Buoy||San Francisco Offshore, CA (180)||37.753 N 122.833 W (37°45'12" N 122°50'0" W)|P| | 46248|R|Waverider Buoy||Astoria Canyon, OR (179)||46.133 N 124.667 W (46°8'0" N 124°40'2" W)|P| | 46249|R|Waverider Buoy||Santa Cruz Island South, CA (182)||33.821 N 119.708 W (33°49'17" N 119°42'30" W)|P| | 46250|R|Waverider Buoy||Point Mugu Offshore, CA - 184||34.034 N 119.090 W (34°2'3" N 119°5'24" W)|P| |Station 46250 was disestablished September 14, 2011. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 46270|N|6-meter NOMAD buoy|6N49|S.W. Bering Sea|ARES payload|55.003 N 175.284 E (55°0'11" N 175°17'2" E)|?| |For area forecasts and warnings, select: Anchorage WFO

Hourly data, without winds, from another payload system on this deployed buoy are available using this link: 46070.

Data transmissions from this station are sporadic.  Data from station 46070 will be restored to full service when it can be worked into the schedule.  When the date is known, it will be posted in the Maintenance Report.
46290|N|2.3-meter NOOSS buoy|2.3D03|NOOSS Optimization Buoy||32.659 N 120.630 W (32°39'32" N 120°37'48" W)|| |Station 46290 stopped transmitting 10/16/08, and has gone adrift.  Click here to see the latest positions on the adrift buoy.  46401|N|2.6-meter discus buoy||East of ADAK, AK|DART I payload|46.638 N 170.790 W (46°38'15" N 170°47'24" W)|?| |DART Station 46401 was disestablished on 23 July 2006. 46402|N|2.6-meter discus buoy|2.6D14|240 NM South of Dutch Harbor, AK|DART II payload|51.068 N 164.020 W (51°4'6" N 164°1'12" W)|?| |

Station 46402 has been serviced and is back in operation.

46403|N|2.6-meter discus buoy|2.6D41|230 NM Southeast of Shumagin Island, AK|DART II payload|52.650 N 156.943 W (52°38'59" N 156°56'34" W)|?| | 46404|N|2.6-meter discus buoy|2.6D16|230 NM West of Astoria, OR|DART II payload|45.858 N 128.768 W (45°51'29" N 128°46'4" W)|?| |Buoy hull 2.6D16 from station 46404 went adrift on 12/26/2011 and is no longer providing water column or tsunami event data. This buoy is recovered 2/01/2012. It will be restored into service when it can be recovered and then worked into the maintenance schedule.  Click here to see the latest positions.
46405|N|2.6-meter discus buoy||325 NM West-Southwest of Newport, OR|DART I payload|42.903 N 130.909 W (42°54'11" N 130°54'32" W)|?| |46405 has been disestablished and a new station has been established at 46407
46406|N|2.6-meter discus buoy||2,900 NM Southeast of Hawaii|DART I payload|8.491 S 125.022 W (8°29'26" S 125°1'21" W)|?| |Station data from DART 46406 was placed in test on September 1, 2006 in preparation for a buoy exchange. Data from this DART location resumed on Tuesday, September 5, 2006 as DART station 51406. 46407|N|2.6-meter discus buoy|2.6D74|210 NM West of Coos Bay, OR|DART II payload|42.605 N 128.897 W (42°36'18" N 128°53'49" W)|?| |

Buoy hull 2.6D74 went adrift from station 46407 before 5/1/12 0113Z and is no longer providing water column height  or tsunami event data. It will be restored into service when it can be recovered and then worked into the maintenance schedule.  

Click  here  to see latest positions.

46408|N|2.6-meter discus buoy|26D39|NW Pacific S AK|DART II payload|49.626 N 169.855 W (49°37'34" N 169°51'17" W)|?| |

DART station 46408 data is showing low level spiking in the 30-45mm range due to unknown causes. Tsunami threshhold has been increased to 50mm.

46409|N|2.6-meter discus buoy|2.6D51|240 NM Southeast of Kodiak, AK|DART II payload|55.300 N 148.515 W (55°18'1" N 148°30'55" W)|?| | 46410|N|2.6-meter discus buoy|2.6D12|330 NM Southeast of Anchorage, AK|DART II payload|57.635 N 143.786 W (57°38'5" N 143°47'8" W)|?|FZAK67.PAJK FZAK61.PAJK| 46411|N|2.6-meter discus buoy|2.6D20|260 NM Northwest of San Francisco, CA|DART II payload|39.349 N 127.021 W (39°20'55" N 127°1'15" W)|?| | 46412|N|2.6-meter discus buoy|2.6D58|190 NM West-Southwest of San Diego, CA|DART II payload|32.456 N 120.558 W (32°27'22" N 120°33'29" W)|?| | 46413|N|2.6-meter discus buoy|D01|East of ADAK, AK|DART II payload|48.305 N 174.212 W (48°18'18" N 174°12'42" W)|?| | 46419|N|2.6-meter discus buoy|2.6D32|300 NM West-Northwest of Seattle, WA|DART II payload|48.766 N 129.633 W (48°45'59" N 129°37'57" W)|?| | 46490|N|Moored Buoy|2.3D02|NOOSS Optimization Buoy |DART II payload|32.455 N 120.557 W (32°27'19" N 120°33'25" W)|P| | 46499|N|2.6-meter discus buoy||DART Special Test |DART II payload|40.000 N 150.000 W (40°0'0" N 150°0'0" W)|P| |

This is a special test identifier. 

The buoy is not deployed.  Data are canned data.  Disregard all event data. 

This is a special test identifier.

46518|AK|Drifting Buoy||Drifting Buoy||44.500 N 170.000 W (44°30'0" N 170°0'0" W)|?| | 46531|AK|Drifting Buoy||Drifting Buoy||41.000 N 165.000 W (41°0'0" N 165°0'0" W)|?| | 46534|AK|Drifting Buoy||Drifting Buoy||48.000 N 165.000 W (48°0'0" N 165°0'0" W)|?| | 46537|C|Drifting Buoy||Drifting Buoy||51.000 N 165.000 W (51°0'0" N 165°0'0" W)|?| | 46538|AK|Drifting Buoy||Drifting Buoy||24.140 N 127.900 W (24°8'24" N 127°54'0" W)|?| | 46551|N|Drifting Buoy||Drifting Buoy||53.033 N 161.810 W (53°2'0" N 161°48'36" W)|?| | 46553|N|Drifting Buoy||Drifting Buoy||54.540 N 165.440 W (54°32'24" N 165°26'24" W)|?| | 46559|C|Drifting Buoy||Drifting Buoy||29.550 N 177.580 W (29°33'0" N 177°34'48" W)|?| | 46561|C|Drifting Buoy||Drifting Buoy||28.390 N 171.290 W (28°23'24" N 171°17'24" W)|?| | 46562|C|Drifting Buoy||Drifting Buoy||35.910 N 133.150 W (35°54'36" N 133°9'0" W)|?| | 46563|C|Drifting Buoy||Drifting Buoy||50.440 N 144.940 W (50°26'24" N 144°56'24" W)|?| | 46564|C|Drifting Buoy||Drifting Buoy||27.180 N 159.010 W (27°10'48" N 159°0'36" W)|?| | 46565|AK|Drifting Buoy||Drifting Buoy||44.500 N 170.000 W (44°30'0" N 170°0'0" W)|?| | 46632|C|Drifting Buoy||Drifting Buoy||47.300 N 168.100 W (47°17'60" N 168°5'60" W)|?| | 46633|C|Drifting Buoy||Drifting Buoy||47.120 N 144.690 W (47°7'12" N 144°41'24" W)|?| | 46634|C|Drifting Buoy||Drifting Buoy||45.750 N 146.880 W (45°45'0" N 146°52'48" W)|?| | 46635|C|Drifting Buoy||Drifting Buoy||47.640 N 126.580 W (47°38'24" N 126°34'48" W)|?| | 46636|C|Drifting Buoy||Drifting Buoy||47.090 N 123.110 W (47°5'24" N 123°6'36" W)|?| | 46637|C|Drifting Buoy||Drifting Buoy||45.500 N 164.800 W (45°30'0" N 164°48'0" W)|?| | 46638|C|Drifting Buoy||Drifting Buoy||53.280 N 130.180 W (53°16'48" N 130°10'48" W)|?| | 46639|C|Drifting Buoy||Drifting Buoy||58.480 N 143.540 W (58°28'48" N 143°32'24" W)|?| | 46640|C|Drifting Buoy||Drifting Buoy||45.100 N 167.500 W (45°6'0" N 167°30'0" W)|?| | 46641|C|Drifting Buoy||Drifting Buoy||47.400 N 168.300 W (47°23'60" N 168°18'0" W)|?| | 46642|C|Drifting Buoy||Drifting Buoy||25.610 N 155.060 W (25°36'36" N 155°3'36" W)|?| | 46643|C|Drifting Buoy||Drifting Buoy||48.200 N 168.000 W (48°12'0" N 168°0'0" W)|?| | 46651|C|Drifting Buoy||Drifting Buoy||45.630 N 151.350 W (45°37'48" N 151°21'0" W)|?| | 46652|C|Drifting Buoy||Drifting Buoy||23.570 N 120.820 W (23°34'12" N 120°49'12" W)|?| | 46657|C|Drifting Buoy||Drifting Buoy||50.000 N 170.000 W (50°0'0" N 170°0'0" W)|?| | 46660|C|Drifting Buoy||Drifting Buoy||48.800 N 161.900 W (48°47'60" N 161°54'0" W)|?| | 46661|C|Drifting Buoy||Drifting Buoy||49.950 N 127.430 W (49°57'0" N 127°25'48" W)|?| | 46692|C|Drifting Buoy||Drifting Buoy||42.900 N 162.700 W (42°53'60" N 162°41'60" W)|?| | 46695|C|Drifting Buoy||Drifting Buoy||35.030 N 128.410 W (35°1'48" N 128°24'36" W)|?| | 46698|C|Drifting Buoy||Drifting Buoy||54.450 N 156.330 W (54°27'0" N 156°19'48" W)|?| | 46700|C|Drifting Buoy||Drifting Buoy||54.480 N 130.870 W (54°28'48" N 130°52'12" W)|?| | 46701|C|Drifting Buoy||Drifting Buoy||41.600 N 165.800 W (41°36'0" N 165°48'0" W)|?| | 46702|C|Drifting Buoy||Drifting Buoy||58.410 N 152.870 W (58°24'36" N 152°52'12" W)|?| | 46705|C|Drifting Buoy||Drifting Buoy||41.370 N 129.080 W (41°22'12" N 129°4'48" W)|?| | 46707|C|Drifting Buoy||Drifting Buoy||46.520 N 144.520 W (46°31'12" N 144°31'12" W)|?| | 46710|C|Drifting Buoy||Drifting Buoy||22.240 N 136.000 W (22°14'24" N 136°0'0" W)|?| | 46779|N|Drifting Buoy||Drifting Buoy||57.000 N 149.000 W (57°0'0" N 149°0'0" W)|?| | 46780|N|Drifting Buoy||Drifting Buoy||56.040 N 167.140 W (56°2'24" N 167°8'24" W)|?| |Wind speed corrected to the 10 meter height. 46781|N|Drifting Buoy||Drifting Buoy||54.634 N 177.948 W (54°38'2" N 177°56'53" W)|?| |Wind speed corrected to the 10 meter height. 46782|N|Drifting Buoy||Drifting Buoy||56.040 N 167.140 W (56°2'24" N 167°8'24" W)|?| | 46785|N|Drifting Buoy||Drifting Buoy||55.000 N 173.000 W (55°0'0" N 173°0'0" W)|?| | 46x84|N|6-meter NOMAD buoy|6N33|Old 46084 (Adrift)|ARES payload|56.625 N 136.148 W (56°37'30" N 136°8'54" W)|A|FZAK52.PAJK FZAK51.PAJK|On 05/23/2010, a new buoy was deployed at station 46084.  The previously-deployed buoy went adrift on 12/26/08, and went aground on 01/15/09. Positions have not transmitted since 08/27/09. If the buoy ever resumes transmits, click here to see the latest positions on the adrift buoy.  47559|C|Drifting Buoy||||78.911 N 105.294 W (78°54'40" N 105°17'38" W)|?| | 47560|C|Drifting Buoy||||79.549 N 103.459 W (79°32'56" N 103°27'32" W)|?| | 48011|N|3-meter discus buoy|42|Red Dog Mine|DACT payload|67.582 N 164.185 W (67°34'54" N 164°11'6" W)|P|FZPN01.KWBC |Buoy retrieved 48400|PM|Buoy||Ocean Climate Station Papa||50.000 N 145.000 W (50°0'0" N 145°0'0" W)|P| |http://www.pmel.noaa.gov/stnP/ 48677|SH|Drifting Buoy||||72.568 N 177.610 W (72°34'5" N 177°36'36" W)|?| | 48678|SH|Drifting Buoy||||74.076 N 172.987 W (74°4'34" N 172°59'13" W)|?| | 48679|SH|Drifting Buoy||||75.778 N 159.890 W (75°46'41" N 159°53'24" W)|?| | 48680|SH|Drifting Buoy||||74.776 N 157.236 W (74°46'34" N 157°14'10" W)|?| | 48708|SM|Drifting Buoy||Drifting Ice Buoy||81.000 N 133.000 W (81°0'0" N 133°0'0" W)|| | 48900|RU|Slocum Glider||(R21)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48901|P|Slocum Glider||(SAM)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48902|UW|Sea Glider||(SG515)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48903|UD|Slocum Glider||(UD_134)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48904|RU|Slocum Glider||(RU23)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48905|P|Slocum Glider||(BASS)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48906|MM|Slocum Glider||(WALDO)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48907|RU|Slocum Glider||(COOK)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48908|V|Sea Glider||(SG135)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48909|V|Sea Glider||(SG137)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48910|R|Spray Glider||(SPRAY40)||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 48911|SH|Sea Glider||SG553||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 51000|N|3-meter discus buoy|3DV21|Northern Hawaii|AMPS payload|23.546 N 154.056 W (23°32'47" N 154°3'20" W)|H|FZHW50.PHFO | 51001|N|3-meter discus buoy|3DXX|NW HAWAII 170 NM West Northwest of Kauai Island|ARES payload|23.445 N 162.279 W (23°26'42" N 162°16'43" W)|H|FZHW50.PHFO |

Station 51001 stopped transmitting 12/25/09 and was retrieved 03/23/2011.  This buoy will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report.

51002|N|3-meter discus buoy|3D31|SW HAWAII 215 NM South SouthWest of Hilo, HI|AMPS payload|17.094 N 157.808 W (17°5'39" N 157°48'27" W)|H|FZHW50.PHFO |
51003|N|3-meter discus buoy|3D73|W HAWAII 205 NM Southwest of Honolulu, HI|ARES payload|19.018 N 160.582 W (19°1'6" N 160°34'54" W)|H|FZHW50.PHFO | 51004|N|3-meter discus buoy|3D88|SE HAWAII 185 NM Southeast of Hilo, HI|AMPS payload|17.525 N 152.382 W (17°31'31" N 152°22'55" W)|H|FZHW50.PHFO | 51005|N|3-meter discus buoy|||DACT payload|20.400 N 156.100 W (20°23'60" N 156°5'60" W)|H| | 51026|N|3-meter discus buoy| 17|Northern Molokai|DACT payload|21.350 N 156.930 W (21°21'0" N 156°55'48" W)|H| | 51027|N|3-meter discus buoy|||DACT payload|20.400 N 157.100 W (20°23'60" N 157°5'60" W)|H| | 51028|N|3-meter discus buoy|3D30|Christmas Island |ARES 4.4 payload|0.000 N 153.913 W (0°0'1" N 153°54'46" W)|H|FZPN40.PHFO |

Station 51028 has failed and stopped transmitting at 00Z, 03/11/2009. 

This station has been disestablished as of 6/1/09. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed.

51100|N|3-meter discus buoy|3D83|Northern Hawaii|AMPS payload|23.558 N 153.900 W (23°33'30" N 153°54'0" W)|H|FZHW50.PHFO | 51101|N|3-meter discus buoy|3D02|NW Hawaii|AMPS payload|24.321 N 162.058 W (24°19'15" N 162°3'30" W)|H|FZHW50.PHFO | 51167|PF|||French Frigate Shoals (FFS Ocean 006)||23.856 N 166.275 W (23°51'23" N 166°16'31" W)|?| | 51168|PF|||East Tutuilla Island, American Samoa (TUT 001)||14.284 S 170.562 W (14°17'1" S 170°33'44" W)|?| | 51169|PF|||Jarvis Island (JAR 016)||0.379 S 159.978 W (0°22'46" S 159°58'42" W)|?| | 51170|PF|||Johnston Atoll (JOH 005)||16.759 N 169.500 W (16°45'34" N 169°29'59" W)|?| | 51171|PF|||Kingman Reef (KIN 001)||6.393 N 162.342 W (6°23'33" N 162°20'32" W)|?| | 51172|PF|||Kure Atoll (KUR 008)||28.418 N 178.343 W (28°25'5" N 178°20'36" W)|?| | 51173|PF|||Litsianski Island (LIS 001)||25.968 N 173.916 W (25°58'4" N 173°54'58" W)|?| | 51174|PF|||Ofu Island, American Samoa (OFU 008)||14.181 S 169.652 W (14°10'50" S 169°39'7" W)|?| | 51175|PF|||Palmyra Atoll (PAL 015)||5.874 N 162.041 W (5°52'28" N 162°2'26" W)|?| | 51176|PF|||Pearl and Hermes Reef (PHR 001)||27.837 N 175.816 W (27°50'12" N 175°48'58" W)|?| | 51177|PF|||Rose Atoll (ROS 002)||14.551 S 168.160 W (14°33'5" S 168°9'36" W)|?| | 51178|PF|||Tau Island, American Samoa (TAU 004)||14.244 S 169.509 W (14°14'38" S 169°30'33" W)|?| | 51179|PF|||Southwestern Tutuila Island, American Samoa (TUT 002)||14.328 S 170.833 W (14°19'42" S 170°50'0" W)|?| | 51180|PF|||Western Tutuila Island, American Samoa (TUT 034)||14.281 S 170.725 W (14°16'53" S 170°43'29" W)|?| | 51181|PF|||Southern Tutuila Island, American Samoa (TUT 029)||14.363 S 170.764 W (14°21'48" S 170°45'50" W)|?| | 51200|R|Waverider Buoy||Barbers Point, HI (164)||21.096 N 158.303 W (21°5'47" N 158°18'10" W)|H| |Station 51200 was disestablished November 13, 2010. Use the "Observations from Nearby Stations and Ships" below to see a listing of nearest stations.  The historical data will remain available.  The station page is accessible via our historical map, or you can always just put in the station ID in the Station ID Search Box. 51201|PO|Waverider Buoy||Waimea Bay, HI (106)||21.673 N 158.116 W (21°40'22" N 158°6'57" W)|H|FZHW50.PHFO | 51202|PO|Waverider Buoy||Mokapu Point, HI (098)||21.417 N 157.668 W (21°25'1" N 157°40'4" W)|H|FZHW50.PHFO | 51203|PO|Waverider Buoy||Kaumalapau, HI (146)||20.788 N 157.010 W (20°47'16" N 157°0'35" W)|H|FZHW50.PHFO | 51204|PO|Waverider Buoy||Barbers Point, HI #2 (165)||21.281 N 158.124 W (21°16'53" N 158°7'25" W)|H| | 51205|PO|Waverider Buoy||Pauwela, Maui, HI (187)||21.019 N 156.427 W (21°1'10" N 156°25'38" W)|H| | 51206|PO|Waverider Buoy||Hilo, Hawaii, HI - 188||19.780 N 154.970 W (19°46'48" N 154°58'12" W)|H| | 51406|N|2.6-meter discus buoy|2.6D50|2,900 NM Southeast of Hawaii|DART II payload|8.480 S 125.027 W (8°28'49" S 125°1'36" W)|?| |

Station 51406 was formerly known as 46406.

This station is no longer being maintained but will continue to provide data until it becomes non-operational.

51407|N|2.6-meter discus buoy|2.6D68|140 NM Southeast of Honolulu, HI|DART II payload|19.591 N 156.585 W (19°35'26" N 156°35'7" W)|?| | 51425|N|2.6-meter discus buoy|26D40|370 NM NW of Apia|DART II payload|9.510 S 176.241 W (9°30'37" S 176°14'26" W)|| | 51426|N|2.6-meter discus buoy|2.6D03|400NM Southeast of Tonga|DART II payload|22.993 S 168.133 W (22°59'34" S 168°7'58" W)|| |

Buoy hull 2.6D45 from DART station 51426 (in the SW Pacific) has gone adrift between 11/1/11 1305Z and 11/2/11 0113Z and is no longer providing water column height or Tsunami event data . It will be restored into service when it can be recovered  and worked into the maintenance schedule .

click here to see the latest positions

51542|N|Drifting Buoy||TAO Buoy Adrift||0.018 N 179.903 W (0°1'6" N 179°54'12" W)|?| | 51wh0|WH|Ocean Reference Station||WHOTS - Woods Hole Ocean Time-series||22.667 N 157.950 W (22°40'0" N 157°57'0" W)|H| | 52009|N|3-meter discus buoy|||DACT payload|13.729 N 144.668 W (13°43'46" N 144°40'4" W)|?| | 52200|PO|Waverider Buoy||Ipan, Guam (121)||13.354 N 144.789 E (13°21'15" N 144°47'20" E)|?| | 52201|PO|Waverider Buoy||Kalo, Majuro, Marshall Islands - 163||7.092 N 171.395 E (7°5'30" N 171°23'42" E)|?| | 52243|PF|||Wake Island (WAK 002)||19.308 N 166.622 E (19°18'27" N 166°37'20" E)|?| | 52244|PF|||Maug Islands (MAU 002)||20.029 N 145.232 E (20°1'45" N 145°13'55" E)|?| | 52245|PF|||Pagan Island (PAG 001)||18.127 N 145.757 E (18°7'38" N 145°45'27" E)|?| | 52246|PF|||Saipan Island (SAI 008)||15.172 N 145.695 E (15°10'19" N 145°41'41" E)|?| | 52247|PF|||Rota Island (ROT 002)||14.128 N 145.164 E (14°7'42" N 145°9'49" E)|?| | 52248|PF|||Guam (GUA 003)||13.529 N 144.801 E (13°31'44" N 144°48'2" E)|?| | 52249|PF|||Kimbe, New Britain, PNG (KIM 001)||5.157 S 150.299 E (5°9'25" S 150°17'57" E)|?| | 52401|N|2.6-meter discus buoy|2.6D35|610 NM Northeast of Saipan|DART II payload|19.261 N 155.771 E (19°15'38" N 155°46'16" E)|?| | 52402|N|2.6-meter discus buoy|2.6D18|790 NM Northwest of Kwajalein|DART II payload|11.869 N 154.039 E (11°52'7" N 154°2'19" E)|?| |.
52403|N|2.6-meter discus buoy|2.6D62|430 NM Southwest of Truk|DART II payload|4.052 N 145.592 E (4°3'8" N 145°35'31" E)|?| |DART station 52403 has serviced and is back in operation. 52404|N|2.6-meter discus buoy|2.6D55|760 NM Northeast of Manila, Philippines|DART II payload|20.949 N 132.314 E (20°56'56" N 132°18'49" E)|?| |

Station 52404 has been serviced and now operational.

52405|N|2.6-meter discus buoy|26D57|740 NM West of Agana, Guam|DART II payload|12.881 N 132.333 E (12°52'50" N 132°20'0" E)|?| | 52406|N|2.6-meter discus buoy|D54|450 NM Northeast of the Guadalcanal|DART II payload|5.293 S 165.002 E (5°17'36" S 165°0'6" E)|| | 52834|AO|Drifting Buoy||||14.000 N 154.953 E (14°0'0" N 154°57'10" E)|?| | 52837|AO|Drifting Buoy||||9.777 N 137.000 E (9°46'38" N 137°0'0" E)|?| | 52838|AO|Drifting Buoy||||7.774 N 140.000 E (7°46'28" N 140°0'0" E)|?| | 52839|AO|Drifting Buoy||||5.758 N 143.000 E (5°45'28" N 143°0'0" E)|?| | 52840|AO|Drifting Buoy||||8.731 N 151.000 E (8°43'51" N 151°0'0" E)|?| | 52841|AO|Drifting Buoy||||5.943 N 149.000 E (5°56'34" N 149°0'0" E)|?| | 52842|AO|Drifting Buoy||||6.759 N 150.000 E (6°45'34" N 150°0'0" E)|?| | 52843|AO|Drifting Buoy||||11.761 N 134.000 E (11°45'38" N 134°0'0" E)|?| | 52849|AO|Drifting Buoy||||16.000 N 155.256 E (16°0'0" N 155°15'21" E)|?| | 52858|AO|Drifting Buoy||||14.000 N 154.953 E (14°0'0" N 154°57'10" E)|?| | 52862|AO|Drifting Buoy||||16.000 N 155.256 E (16°0'0" N 155°15'21" E)|?| | 52901|AO|Drifting Buoy||||15.000 N 155.104 E (15°0'0" N 155°6'14" E)|?| | 53046|AU|ETD||South Bali|ETD payload|11.445 S 113.607 E (11°26'42" S 113°36'25" E)|?| | 53401|ID|2.6-meter discus buoy|2.6D36|Indonesia|DART II payload|0.050 N 91.899 E (0°3'1" N 91°53'58" E)|| |This station failed 3/15/2008. 54401|N|2.6-meter discus buoy|2.6D25|640NM Northeast of Auckland, New Zealand|DART II payload|33.005 S 172.985 W (33°0'19" S 172°59'6" W)|| |

Buoy hull 2.6D37 from DART station 54401 went adrift after 4/3/2012 1305Z. Last report from its moored position was 4/3/2012 1315Z. It is no longer providing water column height or tsunami event data. It will be restored into service when it can be recovered and then worked into the maintenance schedule.

See here for latest positions

55012|AU|STB - SAIC Tsunami Buoy||Coral Sea 1 - 1285km ENE of Townsville|STB payload|15.799 S 158.400 E (15°47'56" S 158°24'1" E)|?| | 55013|AU|2.6-meter discus buoy||TASMAN SEA 3 - 1160km ESE of Hobart|DART II payload|46.665 S 161.001 E (46°39'55" S 161°0'5" E)|| | 55015|AU|STB - SAIC Tsunami Buoy||TASMAN SEA 1 - 1110km ESE of Hobart|SAIC Tsunami Buoy (STB) with DART II BPR|46.840 S 160.254 E (46°50'24" S 160°15'16" E)|?| | 55016|AU|ETD||ETD Fiji Basin|ETD payload|26.000 S 176.000 E (26°0'0" S 176°0'0" E)|?| |The Australian ETD buoy went adrift 1/4/2011. The buoy has been recovered as of 2/8/2011.  Until it is re-deployed, there will be no water column height data from this station. 55023|AU|ETD||Coral Sea 2 - 870km NE of Townsville|ETD payload|14.800 S 153.580 E (14°48'0" S 153°34'47" E)|?| | 55039|ES|Waverider Buoy||||38.360 S 148.110 E (38°21'36" S 148°6'36" E)|?| |Data from this station are not quality controlled by NDBC 55042|AU|2.6-meter discus buoy||Tasman Sea 2 - 1175km ESE of Hobart|ETD payload|44.853 S 161.728 E (44°51'10" S 161°43'41" E)|| | 55401|AU|2.6-meter discus buoy||600 NM Southeast of Hobart, Tasmania|DART II payload|46.922 S 160.562 E (46°55'20" S 160°33'44" E)|?| | 56001|AU|STB - SAIC Tsunami Buoy||Indian Ocean 1 - 1025km NW of Dampier|STB payload|13.985 S 110.005 E (13°59'7" S 110°0'17" E)|?| | 56003|AU|STB - SAIC Tsunami Buoy||Indian Ocean 2 - 630km NNE of Dampier|STB payload|15.021 S 117.989 E (15°1'17" S 117°59'22" E)|?| |Data from buoy was interrupted during service from 17 to 21 Nov 2011. 58900|UW|Sea Glider||SG177||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58901|UW|Sea Glider||SG167||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58902|UW|Sea Glider||SG166||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58903|UW|Sea Glider||SG181||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58904|UW|Sea Glider||SG170||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58905|UW|Sea Glider||SG165||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58951|IO|Sea Glider||SG997||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58952|IO|Sea Glider||SG998||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 58953|IO|Sea Glider||SG999||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 61001|F|Buoy||Nice Buoy||43.400 N 7.800 E (43°24'0" N 7°48'0" E)|?| | 61002|F|Buoy||Lion Buoy||42.102 N 4.703 E (42°6'9" N 4°42'9" E)|?| | 62001|U|Buoy||Gascogne Buoy||45.201 N 5.000 W (45°12'2" N 5°0'0" W)|?| | 62027|SJ|Buoy||Jersey Buoy, English Channel - 5 nm south of Jersey, UK||49.082 N 2.218 W (49°4'56" N 2°13'6" W)|?| | 62028|U|Buoy||Weymouth Bay, UK||50.590 N 2.300 W (50°35'24" N 2°18'0" W)|?| | 62029|U|Buoy||K1 Buoy||48.701 N 12.401 W (48°42'2" N 12°24'2" W)|?| | 62052|F|Buoy||||48.500 N 5.600 W (48°30'0" N 5°36'0" W)|?| | 62081|U|Buoy||K2 Buoy||51.000 N 13.301 W (51°0'0" N 13°18'4" W)|?| | 62090|W|2.5-meter ODAS buoy||M1 - 50 NM West of Aran Islands||53.127 N 11.200 W (53°7'36" N 11°12'0" W)|?| | 62091|W|2.5-meter ODAS buoy||M2 - 20 NM East of Lambay||53.469 N 5.418 W (53°28'8" N 5°25'5" W)|?| | 62092|W|2.5-meter ODAS buoy||M3 - 30 NM Southwest of Mizen Head||51.217 N 10.550 W (51°13'0" N 10°33'0" W)|?| | 62093|W|2.5-meter ODAS buoy||M4 - Donegal Bay||55.000 N 10.000 W (55°0'0" N 10°0'0" W)|?| | 62094|W|2.5-meter ODAS buoy||M5 - South East||51.690 N 6.704 W (51°41'24" N 6°42'14" W)|?| | 62095|W|2.5-meter ODAS buoy||M6 - West Coast||53.056 N 15.924 W (53°3'22" N 15°55'28" W)|?| | 62103|U|Lightship||Channel Lightship||49.900 N 2.900 W (49°54'0" N 2°54'0" W)|?| | 62105|U|Buoy||K4 Buoy||55.400 N 12.200 W (55°24'0" N 12°12'0" W)|?| | 62107|U|Lightship||Sevenstones Lightship||50.103 N 6.100 W (50°6'9" N 6°6'0" W)|?| | 62108|U|Buoy||K3 Buoy||53.500 N 19.500 W (53°30'0" N 19°30'0" W)|?| | 62114|X|Oil Platform||North Sea||58.300 N 0.100 E (58°18'0" N 0°6'0" E)|?| | 62121|X|Oil Platform||||53.500 N 2.700 E (53°30'0" N 2°42'0" E)|?| | 62125|X|Oil Platform||||53.800 N 3.500 W (53°48'0" N 3°30'0" W)|?| | 62126|X|Oil Platform||||53.900 N 3.600 W (53°54'0" N 3°36'0" W)|?| | 62127|X|Oil Platform||||54.000 N 0.700 E (54°0'0" N 0°42'0" E)|?| | 62130|X|Oil Platform||||53.000 N 1.700 E (53°0'0" N 1°42'0" E)|?| | 62135|X|Oil Platform||||54.000 N 3.800 W (54°0'0" N 3°48'0" W)|?| | 62142|X|Oil Platform||North Sea||53.000 N 2.101 E (53°0'0" N 2°6'5" E)|?| | 62144|X|Oil Platform||North Sea||53.400 N 1.700 E (53°24'0" N 1°42'0" E)|?| | 62145|X|Oil Platform||North Sea||53.103 N 2.800 E (53°6'9" N 2°48'0" E)|?| | 62146|X|Oil Platform||||53.800 N 2.800 E (53°48'0" N 2°48'0" E)|?| | 62147|X|Oil Platform||North Sea||57.603 N 1.700 E (57°36'9" N 1°42'0" E)|?| | 62148|X|Oil Platform||||53.600 N 1.500 E (53°36'0" N 1°30'0" E)|?| | 62149|X|Oil Platform||||53.700 N 1.100 E (53°42'0" N 1°6'0" E)|?| | 62150|X|Oil Platform||||53.600 N 0.700 E (53°36'0" N 0°42'0" E)|?| | 62163|U|Buoy||Brittany Buoy||47.500 N 8.500 W (47°30'0" N 8°30'0" W)|?| | 62164|X|Oil Platform||North Sea||57.201 N 0.500 E (57°12'2" N 0°30'0" E)|?| | 62165|X|Oil Platform||||54.000 N 1.100 E (54°0'0" N 1°6'0" E)|?| | 62166|X|Oil Platform||North Sea||57.201 N 0.500 E (57°12'2" N 0°30'0" E)|?| | 62301|U|Buoy||Aberporth Buoy||52.300 N 4.500 W (52°18'0" N 4°30'0" W)|?| | 62303|U|Buoy||Pembroke Buoy||51.603 N 5.100 W (51°36'9" N 5°6'0" W)|?| | 62304|U|Lightship||Sandettie Lightship||51.103 N 1.800 E (51°6'9" N 1°48'0" E)|?| | 62305|U|Lightship||Greenwich Lightship||50.400 N 0.000 E (50°24'0" N 0°0'0" E)|?| | 63105|X|Oil Platform||North Sea||61.000 N 1.700 E (61°0'0" N 1°42'0" E)|?| | 63110|X|Oil Platform||North Sea||59.500 N 1.500 E (59°30'0" N 1°30'0" E)|?| | 63112|X|Oil Platform||North Sea||61.103 N 0.000 E (61°6'9" N 0°0'0" E)|?| | 63113|X|Oil Platform||North Sea||61.000 N 1.700 E (61°0'0" N 1°42'0" E)|?| | 63117|X|Oil Platform||North Sea||61.400 N 1.200 E (61°24'0" N 1°12'0" E)|?| | 64045|U|Buoy||K5 Buoy||59.100 N 11.401 W (59°6'0" N 11°24'2" W)|?| | 64046|U|Buoy||K7 Buoy||60.701 N 4.500 W (60°42'2" N 4°30'0" W)|?| | 78900|UW|Sea Glider||SG502||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 78901|UW|Sea Glider||SG503||30.000 N 90.000 W (30°0'0" N 90°0'0" W)|?| | 91204|N|C-MAN Station||Ulithi Is., Caroline|WAAP (POES reporting) payload|9.900 N 139.700 E (9°54'0" N 139°41'60" E)|?| | 91222|N|C-MAN Station||Pagan Is.,Mariana|WAAP (POES reporting) payload|18.130 N 145.770 E (18°7'48" N 145°46'12" E)|?| |Station Failed. 91251|N|C-MAN Station||Enewetak, MarShall|VEEP payload|11.430 N 162.350 E (11°25'48" N 162°20'60" E)|?| |Station Failed. 91328|N|C-MAN Station||Ulul Atoll, Caroline|WAAP (POES reporting) payload|8.600 N 149.670 E (8°35'60" N 149°40'12" E)|?| | 91338|N|C-MAN Station||Satawan Atoll, Caro.|WAAP (POES reporting) payload|5.280 N 153.650 E (5°16'48" N 153°39'0" E)|?| |Station Failed 91343|N|C-MAN Station||Oroluk, Caroline|VEEP payload|7.630 N 155.160 E (7°37'48" N 155°9'36" E)|?| | 91352|N|C-MAN Station||Pingelap, Caroline|WAAP (POES reporting) payload|6.210 N 160.700 E (6°12'36" N 160°41'60" E)|?| | 91355|N|C-MAN Station||Kosrae, Caroline|VEEP payload|5.360 N 162.960 E (5°21'36" N 162°57'36" E)|?| |Station Failed 91356|N|C-MAN Station||Kosrae, Caroline|VEEP payload|5.360 N 162.960 E (5°21'36" N 162°57'36" E)|?| |Station Failed 91365|N|C-MAN Station||Ujae Atoll, Marshall|DACT payload|8.930 N 165.750 E (8°55'48" N 165°45'0" E)|?| |This station was destroyed by Typhoon Gay in December 1992. 91374|N|C-MAN Station||Maloelap, Marshall|VEEP payload|8.700 N 171.200 E (8°41'60" N 171°11'60" E)|?| | 91377|N|C-MAN Station||Mili, Marshalls Is.|WAAP (POES reporting) payload|6.100 N 172.100 E (6°5'60" N 172°5'60" E)|?| | 91411|N|C-MAN Station||Ngulu Atoll, Caroline|WAAP (POES reporting) payload|8.300 N 137.500 E (8°18'0" N 137°30'0" E)|?| | 91442|N|C-MAN Station||Ebon Atoll, Caroline|VEEP payload|4.600 N 168.700 E (4°35'60" N 168°41'60" E)|?| | aamc1|O|Water Level Observation Network||9414750 - Alameda, CA||37.772 N 122.298 W (37°46'18" N 122°17'54" W)|P|FZUS56.KMTR | aban6|N|C-MAN Station||Alexandria Bay, NY|MARS payload|44.333 N 75.933 W (44°20'0" N 75°56'0" W)|E|FZUS61.KBUF |This station has been disestablished as of 9/30/09. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed. acmn4|J|Shorebased Tower||Atlantic City Marina, NJ||39.380 N 74.420 W (39°22'48" N 74°25'12" W)|E| |


 

acqs1|NR|NERRS Water Quality Station||St. Pierre, Ace Basin Reserve, SC||32.523 N 80.357 W (32°31'24" N 80°21'24" W)|E| | acxs1|NR|NERRS Weather Station||ACE Basin Reserve, SC||32.559 N 80.454 W (32°33'34" N 80°27'13" W)|E| |Water Quality data for this Reserve are available at....
ACQS1 -- St. Pierre


acyn4|O|Water Level Observation Network||8534720 - Atlantic City, NJ||39.355 N 74.418 W (39°21'18" N 74°25'6" W)|E|FZUS51.KPHI |


 

adka2|O|Water Level Observation Network||9461380 - Adak Island, AK||51.863 N 176.632 W (51°51'48" N 176°37'54" W)|A|FZAK52.PAFC | agcm4|O|Weather Station||Algonac, MI - 9014070||42.621 N 82.527 W (42°37'16" N 82°31'37" W)|E| | agmw3|CE|Weather Station||Algoma City Marina WI||44.608 N 87.433 W (44°36'29" N 87°25'59" W)|C|FZUS53.KGRB |NOTE: WINDS FREQUENTLY DROP TO ZERO DUE TO WINTER FREEZING. alia2|O|Water Level Observation Network||9457804 - Alitak, AK||56.898 N 154.247 W (56°53'53" N 154°14'49" W)|A| | alrf1|N|C-MAN Station||Alligator Reef||24.900 N 80.600 W (24°53'59" N 80°35'59" W)|E| | alsn6|N|C-MAN Station||Ambrose Light, NY|ARES 4.4 payload|40.450 N 73.800 W (40°27'0" N 73°48'0" W)|E|FZUS51.KOKX FZUS51.KPHI|

On 7/28/08, Ambrose Light Tower was decommissioned. No data will be available from this station from 7/28/08 until a suitable replacement is established.


 

alxn6|O|Water Level Observation Network||8311062 - Alexandria Bay, NY||44.330 N 75.933 W (44°19'48" N 75°55'59" W)|E| | amaa2|N|C-MAN Station||East Amatuli Station Light, AK|ARES payload|58.915 N 151.952 W (58°54'54" N 151°57'6" W)|A|FZAK51.PAFC | amps1|N|Test station||Payload Test (LAB Set-Up)|AMPS payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|C| |Data from this site is provided for internal use only. This is NOT an operational weather station. These are test data only. amps2|N|2.4-meter discus buoy||Payload Test (BUOY Set-Up)|AMPS payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|C| |Data from this site is provided for internal use only. This is NOT an operational weather station. These are test data only. amps3|N|Test station||Payload Test (C-MAN Set-Up)|AMPS payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|C| |Data from this site is provided for internal use only. This is NOT an operational weather station. These are test data only. amps4|N|Test station||Payload Test (PSI Set-Up)|AMPS payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|C| |Data from this site is provided for internal use only. This is NOT an operational weather station. These are test data only. amrl1|O|Water Level Observation Network||8764227 - Amerada Pass, LA||29.450 N 91.338 W (29°26'59" N 91°20'17" W)|C| | ancf1|P|Shorebased Tower||Anclote Gulf Park, FL||28.193 N 82.789 W (28°11'34" N 82°47'19" W)|E|FZUS52.KTBW | anmf1|P|Shorebased Tower||ANM - Anna Maria, FL||27.550 N 82.750 W (27°33'0" N 82°45'0" W)|E|FZUS52.KTBW | anmn6|NR|NERRS Weather Station||Hudson River Reserve, NY||42.018 N 73.917 W (42°1'5" N 73°55'1" W)|E| |Water Quality data for this Reserve are available at....
ANRN6 -- Tivoli South
HUQN6 -- Tivoli North
anrn6|NR|NERRS Water Quality Station||Tivoli South, Hudson River Reserve, NY||42.027 N 73.926 W (42°1'37" N 73°55'33" W)|E| | anta2|O|Water Level Observation Network||9455920 - Anchorage, AK||61.238 N 149.890 W (61°14'18" N 149°53'24" W)|A|FZAK52.PAFC | anvc1|O|Water Level Observation Network||9416841 - Arena Cove, CA||38.913 N 123.708 W (38°54'48" N 123°42'30" W)|P|FZUS56.KEKA | apam2|O|Water Level Observation Network||8575512 - Annapolis, MD||38.983 N 76.480 W (38°59'0" N 76°28'48" W)|E|FZUS51.KLWX | apcf1|O|Water Level Observation Network||8728690 - Apalachicola, FL||29.727 N 84.982 W (29°43'36" N 84°58'54" W)|E|FZUS52.KTAE | apnm4|G|C-MAN Station||Alpena Harbor Light, MI||45.060 N 83.424 W (45°3'35" N 83°25'25" W)|E|FZUS53.KAPX | apqf1|NR|NERRS Water Quality Station||East Bay, Apalachicola Reserve, FL||29.786 N 84.875 W (29°47'9" N 84°52'31" W)|E| | aprp7|O|Water Level Observation Network||1630000 - Apra Harbor, Guam||13.442 N 144.653 E (13°26'31" N 144°39'10" E)|?| | apxf1|NR|NERRS Weather Station||Apalachicola Reserve, FL||29.791 N 84.883 W (29°47'27" N 84°53'0" W)|E| |Water Quality data for this Reserve are available at....
APQF1 -- East Bay
arop4|PN|Water Level Observation Network||9757809 - Arecibo, PR||18.480 N 66.702 W (18°28'48" N 66°42'7" W)|N| | arpf1|P|Shorebased Tower||APK - Aripeka, FL||28.433 N 82.667 W (28°25'59" N 82°40'0" W)|E|FZUS52.KTBW | asto3|O|Water Level Observation Network||9439040 - Astoria, OR||46.208 N 123.767 W (46°12'30" N 123°46'0" W)|P|FZUS56.KPQR | atgm1|O|Water Level Observation Network||8413320 - Bar Harbor, ME||44.392 N 68.205 W (44°23'30" N 68°12'18" W)|E| | atka2|O|Water Level Observation Network||9461710 - Atka, AK||52.232 N 174.173 W (52°13'55" N 174°10'23" W)|A| | audp4|O|Water Level Observation Network||9759412 - Aquadilla, PR||18.458 N 67.164 W (18°27'29" N 67°9'50" W)|N| | auga2|N|C-MAN Station||Augustine Island, AK|MARS payload|59.378 N 153.348 W (59°22'42" N 153°20'54" W)|A|FZAK51.PAFC | avan4|J|Shorebased Tower||Avalon, NJ||39.090 N 74.720 W (39°5'24" N 74°43'12" W)|E| |


 

babt2|K|Shorebased Tower||8776604 - Baffin Bay; Point of Rocks, TX||27.301 N 97.416 W (27°18'4" N 97°24'59" W)|C| | bara9|O|Water Level Observation Network||9761115 - Barbuda, Barbuda||17.591 N 61.821 W (17°35'27" N 61°49'14" W)|N| | barn6|EA|GLOS Weather Station||Barcelona Harbor, NY||42.346 N 79.596 W (42°20'45" N 79°35'44" W)|E| | batn6|O|Water Level Observation Network||8518750 - The Battery, NY||40.700 N 74.015 W (40°42'0" N 74°0'54" W)|E|FZUS51.KOKX | bdrn4|O|Water Level Observation Network||8539094 - Burlington, Delaware River, NJ||40.082 N 74.872 W (40°4'55" N 74°52'19" W)|E| |For area forecasts and warnings, select: Philadelphia WFO bdvf1|NP|Water Quality Station||Broad River, FL||25.476 N 80.990 W (25°28'35" N 80°59'24" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. bepb6|O|Water Level Observation Network||2695540 - Bermuda Esso Pier||32.373 N 64.703 W (32°22'22" N 64°42'10" W)|E| | bftn7|O|Water Level Observation Network||8656483 - Beaufort, NC||34.720 N 76.670 W (34°43'12" N 76°40'12" W)|E|FZUS52.KMHX |
  bgcf1|P|Shorebased Tower||Big Carlos Pass, FL||26.404 N 81.881 W (26°24'16" N 81°52'52" W)|E|FZUS52.KTBW | bgnn4|O|Water Level Observation Network||8519483 - Bergen Point West Reach, NJ||40.640 N 74.147 W (40°38'24" N 74°8'48" W)|E|FZUS51.KOKX | bgxn3|NR|NERRS Weather Station||Great Bay Reserve, NH||43.059 N 70.830 W (43°3'32" N 70°49'49" W)|| |Water Quality data for this Reserve are available at....
GBQN3 -- Oyster River
bhbm3|O|Water Level Observation Network||8443970 - Boston, MA||42.355 N 71.052 W (42°21'18" N 71°3'6" W)|E| |Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike 

For area forecasts and warnings, select: Boston WFO

bhrc3|I|Long Island Ferry||Bridgeport Terminal, CT||41.175 N 73.185 W (41°10'31" N 73°11'6" W)|E|FZUS51.KOKX | bhri3|CE|GLOS Weather Station||Burns Harbor, IN||41.647 N 87.147 W (41°38'48" N 87°8'49" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS bigm4|CE|GLOS Weather Station||Big Bay, MI||46.830 N 87.730 W (46°49'47" N 87°43'47" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS bism2|O|Water Level Observation Network||8571421 - Bishops Head, MD||38.220 N 76.038 W (38°13'12" N 76°2'17" W)|E| |For area forecasts and warnings, select: Philadelphia WFO blia2|N|C-MAN Station||Bligh Reef Light, AK|Sutron XPERT payload|60.840 N 146.880 W (60°50'24" N 146°52'48" W)|A|FZAK58.PAVW FZAK51.PAFC| blta2|AK|C-MAN Station||Bartlett Cove AK||58.455 N 135.888 W (58°27'18" N 135°53'18" W)|A| | bltm2|O|Water Level Observation Network||8574680 - Baltimore, MD||39.267 N 76.578 W (39°16'0" N 76°34'42" W)|E|FZUS51.KLWX | bltm3|O|Water Level Observation Network||8447387 - Borden Flats Light at Fall River, MA||41.705 N 71.173 W (41°42'18" N 71°10'24" W)|E| |For area forecasts and warnings, select: Boston WFO bnkf1|NP|Water Quality Station||Butternut Key, FL||25.087 N 80.519 W (25°5'12" N 80°31'9" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. bobf1|NP|Water Quality Station||Bob Allen, FL||25.027 N 80.681 W (25°1'36" N 80°40'53" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. bphf1|TC|Water Quality Station||BISHOP HARBOR, FL||27.611 N 82.571 W (27°36'39" N 82°34'16" W)|E| | brbn4|J|Shorebased Tower||Brant Beach, NJ||39.610 N 74.200 W (39°36'36" N 74°12'0" W)|E| |


 

brhc3|O|Water Level Observation Network||8467150 - Bridgeport, CT||41.173 N 73.182 W (41°10'24" N 73°10'54" W)|E|FZUS51.KOKX | brim2|NR|NERRS Water Quality Station||Railroad, Chesapeake Bay Reserve, MD||38.781 N 76.714 W (38°46'53" N 76°42'49" W)|E| | brnd1|O|Water Level Observation Network||8555889 - Brandywine Shoal Light, DE||38.987 N 75.113 W (38°59'13" N 75°6'47" W)|E| |For area forecasts and warnings, select: Philadelphia WFO bsbm4|CE|GLOS Weather Station||Big Sable Point, MI||44.055 N 86.514 W (44°3'17" N 86°30'50" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS bsca1|DI|Water Quality Station||Bon Secour, AL||30.329 N 87.829 W (30°19'44" N 87°49'45" W)|C| | bslm2|NR|NERRS Weather Station||Chesapeake Bay, MD||38.781 N 76.708 W (38°46'51" N 76°42'29" W)|E| |Water Quality data for this Reserve are available at....
BRIM2 -- Railroad
LTQM2 -- Otter Point Creek
bufn6|O|Water Level Observation Network||9063020 - Buffalo, NY||42.877 N 78.890 W (42°52'36" N 78°53'24" W)|E|FZUS51.KBUF | burl1|N|C-MAN Station||Southwest Pass, LA|ARES 4.4 payload|28.905 N 89.428 W (28°54'18" N 89°25'42" W)|C|FZUS54.KLIX |

Possible lightning strike on 4/4/2012 caused all data except wind speed to fail at this station.  BURL1 will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenancereport.

busl1|N|C-MAN Station||Bullwinkle Block 65|An industry-supplied payload|27.883 N 90.900 W (27°53'0" N 90°54'0" W)|C| | buzm3|N|C-MAN Station||Buzzards Bay, MA|MARS payload|41.397 N 71.033 W (41°23'48" N 71°2'0" W)|E| |Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike

For area forecasts and warnings, select: Boston WFO

bvqw1|NR|NERRS Water Quality Station||Bayview Channel - Padilla Bay, WA||48.496 N 122.501 W (48°29'47" N 122°30'2" W)|P| | bwsf1|NP|Water Quality Station||Blackwater Sound, FL||25.178 N 80.438 W (25°10'42" N 80°26'18" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. bygl1|O|Water Level Observation Network||8762482 - Bayou Gauche, LA||29.789 N 90.420 W (29°47'20" N 90°25'12" W)|C|FZUS54.KLIX | bzbm3|O|Water Level Observation Network||8447930 - Woods Hole, MA||41.523 N 70.672 W (41°31'24" N 70°40'18" W)|E| |Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike  

For area forecasts and warnings, select: Boston WFO

c58w3|CG|Weather Station||Two Rivers CG Station, WI||44.146 N 87.563 W (44°8'46" N 87°33'47" W)|C| | camf1|P|Shorebased Tower||Campbell Park, FL||27.765 N 82.649 W (27°45'54" N 82°38'56" W)|E|FZUS52.KTBW | camm2|O|Water Level Observation Network||8571892 - Cambridge, MD||38.573 N 76.068 W (38°34'24" N 76°4'6" W)|E|FZUS51.KLWX | canf1|NP|Water Quality Station||Cane Patch, FL||25.420 N 80.943 W (25°25'12" N 80°56'33" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. capl1|O|Water Level Observation Network||8768094 - Calcasieu Pass, LA||29.768 N 93.343 W (29°46'5" N 93°20'34" W)|C|FZUS54.KLCH | caro3|N|C-MAN Station||Cape Arago, OR|MARS payload|43.342 N 124.375 W (43°20'30" N 124°22'30" W)|P|FZUS56.KMFR FZUS56.KPQR| casm1|O|Water Level Observation Network||8418150 - Portland, ME||43.657 N 70.247 W (43°39'24" N 70°14'48" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  cbbv2|O|Water Level Observation Network||8638863 - Chesapeake Bay Bridge Tunnel, VA||36.967 N 76.113 W (36°58'0" N 76°6'48" W)|E|FZUS51.KAKQ |


 

cbim2|B|Coastal Marine Station||Chesapeake Biological Laboratory Weather Station MD||38.321 N 76.452 W (38°19'16" N 76°27'7" W)|E|FZUS51.KLWX | cblo1|EA|GLOS Weather Station||Conneaut Breakwater Light, OH||41.981 N 80.555 W (41°58'50" N 80°33'19" W)|E| | cbrw3|CE|GLOS Weather Station||Chambers Island, WI||45.198 N 87.360 W (45°11'54" N 87°21'35" W)|C| | ccuf1|O|Water Level Observation Network||8726413 - C-Cut, St. Petersburg, FL||27.663 N 82.618 W (27°39'47" N 82°37'5" W)|E| | cdea2|AK|Weather Station||Cape Decision, AK||56.002 N 134.133 W (56°0'7" N 134°8'0" W)|A| |For area forecasts and warnings, select: Juneau WFO cdrf1|N|C-MAN Station||Cedar Key, FL|MARS payload|29.136 N 83.029 W (29°8'10" N 83°1'45" W)|E|FZUS52.KTAE FZUS52.KTBW|
cecc1|O|Water Level Observation Network||9419750 - Crescent City, CA||41.745 N 124.183 W (41°44'42" N 124°11'0" W)|P|FZUS56.KEKA | cfwm1|O|Water Level Observation Network||Cutler Farris Wharf, ME (8411060)||44.657 N 67.210 W (44°39'24" N 67°12'36" W)|E| | chao3|O|Water Level Observation Network||9432780 - Charleston, OR||43.345 N 124.322 W (43°20'42" N 124°19'18" W)|P|FZUS56.KMFR | chav3|O|Water Level Observation Network||9751639 - Charlotte Amalie, VI||18.335 N 64.920 W (18°20'6" N 64°55'12" W)|N|FZCA52.TJSJ | chcm2|O|Water Level Observation Network||8573927 - Chesapeake City, MD||39.527 N 75.810 W (39°31'36" N 75°48'36" W)|E|FZUS51.KLWX | chds1|EA|Weather Station||Strom Thurmond Dam, SC||33.662 N 82.200 W (33°39'44" N 82°11'59" W)|E| | chii2|G|C-MAN Station||Chicago, IL||42.000 N 87.500 W (42°0'0" N 87°30'0" W)|C|FZUS53.KLOT | chlv2|N|C-MAN Station||Chesapeake Light, VA|DACT payload|36.910 N 75.710 W (36°54'35" N 75°42'35" W)|E|FZUS51.KLWX FZUS51.KAKQ|


 

chno3|NR|NERRS Weather Station||South Slough Reserve, OR ||43.345 N 124.329 W (43°20'42" N 124°19'43" W)|P| |Water Quality data for this Reserve are available at....
SOQO3 -- Valino Island
CWQO3 -- Charleston Bridge
chqo3|NR|NERRS Water Quality Station||Winchester Arm - South Slough, OR||43.282 N 124.320 W (43°16'56" N 124°19'13" W)|P| | chsv3|O|Water Level Observation Network||9751364 - Christiansted Harbor, Virgin Islands||17.748 N 64.699 W (17°44'53" N 64°41'56" W)|N| | chyv2|O|Water Level Observation Network||8638999 - Cape Henry, VA||36.930 N 76.007 W (36°55'48" N 76°0'25" W)|E| |For area forecasts and warnings, select: Wakefield WFO chyw1|O|Water Level Observation Network||9449424 - Cherry Point, WA||48.863 N 122.758 W (48°51'48" N 122°45'30" W)|P|FZUS56.KSEW | clbp4|O|Water Level Observation Network||9752235 - Culebra, PR||18.301 N 65.302 W (18°18'3" N 65°18'9" W)|N| | clkn7|N|C-MAN Station||Cape Lookout, NC|MARS payload|34.622 N 76.525 W (34°37'18" N 76°31'30" W)|E|FZUS52.KMHX |


 

cllt2|K|Shorebased Tower||8770933 - Clear Lake, TX||29.563 N 95.067 W (29°33'48" N 95°4'0" W)|C| | clsm4|CE|GLOS Weather Station||St. Clair Shores, MI||42.471 N 82.877 W (42°28'16" N 82°52'36" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS
cman4|O|Water Level Observation Network||8536110 - Cape May, NJ||38.968 N 74.960 W (38°58'6" N 74°57'36" W)|E|FZUS51.KPHI |
  cmti2|O|Water Level Observation Network||9087044 - Calumet, IL||41.730 N 87.538 W (41°43'48" N 87°32'18" W)|C|FZUS53.KLOT | cnbf1|NP|Water Quality Station||Cannon Bay, FL||25.700 N 81.186 W (25°42'0" N 81°11'9" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. cndo1|O|Water Level Observation Network||9063063 - Cleveland, OH||41.540 N 81.635 W (41°32'24" N 81°38'6" W)|E| |For area forecasts and warnings, select: Cleveland WFO cnii2|CE|GLOS Weather Station||Northerly Island, IL||41.856 N 87.609 W (41°51'21" N 87°36'34" W)|C| | covm2|O|Water Level Observation Network||8577018 - Cove Point LNG Pier, MD||38.404 N 76.386 W (38°24'14" N 76°23'8" W)|E| | cpnt2|K|Water Level Observation Network||Copano Bay, TX - 8774513||28.118 N 97.022 W (28°7'6" N 97°1'18" W)|C| | cptr1|O|Water Level Observation Network||8452944 - Conimicut Light, RI||41.717 N 71.343 W (41°43'0" N 71°20'36" W)|E| |For area forecasts and warnings, select: Boston WFO cpxc1|CP|CICORE water quality station||Cal Poly Pier, CA||35.170 N 120.741 W (35°10'12" N 120°44'28" W)|P| | crta1|DI|C-MAN Station||Cedar Point, AL||30.308 N 88.140 W (30°18'30" N 88°8'22" W)|C| | crva2|O|Water Level Observation Network||9454050- Cordova, AK||60.557 N 145.755 W (60°33'27" N 145°45'19" W)|A| | cryv2|O|Water Level Observation Network||8638595 - South Craney Island, VA||36.888 N 76.338 W (36°53'17" N 76°20'17" W)|E| |For area forecasts and warnings, select: Wakefield WFO csbf1|N|C-MAN Station||Cape San Blas, FL|MARS payload|29.672 N 85.357 W (29°40'18" N 85°21'24" W)|E|FZUS52.KTAE |Station CSBF1 has been replaced with Station SGOF1 cspa2|AK|Weather Station||Cape Spencer, AK||58.199 N 136.639 W (58°11'56" N 136°38'19" W)|A| |For area forecasts and warnings, select: Juneau WFO ctgm1|O|Water Level Observation Network||8411250 - Cutler, ME||44.642 N 67.297 W (44°38'30" N 67°17'48" W)|E| | cvqv2|NR|NERRS Water Quality Station||Sweet Hall, Chesapeake Bay Reserve, VA||37.571 N 76.884 W (37°34'17" N 76°53'3" W)|E| | cwaf1|NP|Water Quality Station||Clear Water Pass, FL ||25.295 N 81.013 W (25°17'41" N 81°0'47" W)|E| | cwbf1|O|Water Level Observation Network||8726724 - Clearwater Beach, FL||27.977 N 82.832 W (27°58'36" N 82°49'54" W)|E|FZUS52.KTBW | cwqo3|NR|NERRS Water Quality Station||Charleston Bridge, South Slough Reserve, OR||43.338 N 124.321 W (43°20'16" N 124°19'14" W)|P| | cygm4|CE|GLOS Weather Station||Cheybogan, MI||45.651 N 84.472 W (45°39'4" N 84°28'19" W)|E| | darth|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.612 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only darti|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |

Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only.

dartj|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartk|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartl|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartm|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartn|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. darto|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartp|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartq|N|2.6-meter discus buoy||Test|DART II payload|30.357 N 89.613 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartr|N|2.6-meter discus buoy||TEST|DART II payload|30.357 N 89.612 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. darts|N|2.6-meter discus buoy||TEST|DART II payload|30.357 N 89.612 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartt|N|2.6-meter discus buoy||TEST|DART II payload|30.357 N 89.612 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only. dartu|N|2.6-meter discus buoy||TEST|DART II payload|30.357 N 89.612 W (30°21'24" N 89°36'45" W)|?| |Data from this site are provided for internal use only. This is NOT an operational DART station. These are test data only dbln6|N|C-MAN Station||Dunkirk, NY|MARS payload|42.493 N 79.353 W (42°29'36" N 79°21'12" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS dbqs1|NR|NERRS Water Quality Station||Debidue Creek - North Inlet - Winyah Bay, SC||33.360 N 79.168 W (33°21'37" N 79°10'3" W)|E| | deld1|O|Water Level Observation Network||8551762 - Delaware City, DE||39.582 N 75.590 W (39°34'55" N 75°35'24" W)|E| |For area forecasts and warnings, select: Philadelphia WFO demo2|LR|Test station||NDBC Demo Glider #2||40.122 N 71.270 W (40°7'20" N 71°16'12" W)|E| |Glider data are not quality controlled by NDBC.

Click  here  to see latest positions.
deqd1|NR|NERRS Water Quality Station||Lebanon Landing, Delaware Reserve, DE||39.114 N 75.499 W (39°6'52" N 75°29'57" W)|E| | desw1|N|C-MAN Station||Destruction Island, WA|MARS payload|47.675 N 124.485 W (47°40'30" N 124°29'6" W)|C|FZUS56.KSEW | disw3|N|C-MAN Station||Devils Island, WI|Sutron XPERT payload|47.080 N 90.728 W (47°4'48" N 90°43'42" W)|C| |

For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS.

dkcm6|O|Water Level Observation Network||8741501 - Dock C, Pascagoula, MS||30.355 N 88.567 W (30°21'18" N 88°34'1" W)|C| | dkkf1|NP|Water Quality Station||Duck Key, FL||25.180 N 80.490 W (25°10'48" N 80°29'24" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. dmbc1|EB|CICORE water quality station||Dumbarton Bridge at Newark, CA||37.507 N 122.117 W (37°30'25" N 122°7'0" W)|P| | domv2|O|Water Level Observation Network||8638511 - Dominion Terminal Association, VA||36.962 N 76.425 W (36°57'43" N 76°25'29" W)|E| | dpha1|DI|Coastal Marine Station||Dauphin Island, AL||30.251 N 88.078 W (30°15'5" N 88°4'40" W)|C| | dpia1|N|C-MAN Station||Dauphin Island, AL|Sutron XPERT payload|30.248 N 88.073 W (30°14'54" N 88°4'24" W)|C|FZUS54.KMOB | dpxc1|O|||9415141 - Davis Point, San Pablo Bay, CA||38.057 N 122.259 W (38°3'24" N 122°15'34" W)|| | drfa2|N|C-MAN Station||Drift River Terminal, AK|MARS payload|60.553 N 152.137 W (60°33'12" N 152°8'12" W)|A|FZAK58.PAVW FZAK51.PAFC| drsd1|NR|NERRS Weather Station||Delaware Reserve, DE||39.089 N 75.437 W (39°5'20" N 75°26'13" W)|E| |Water Quality data for this Reserve are available at....
DEQD1 -- Lebanon Landing
SCLD1 -- Scotton Landing
dryf1|N|C-MAN Station||Dry Tortugas, FL|MARS payload|24.638 N 82.862 W (24°38'18" N 82°51'42" W)|E|FZUS52.KKEY |Station DRYF1 failed on September 21, 2005. It has been replaced with a station installed nearby at Pulaski Shoal Light, PLSF1 dsln7|N|C-MAN Station||Diamond Shls Lt., NC|DACT payload|35.153 N 75.297 W (35°9'12" N 75°17'48" W)|E|FZUS52.KMHX |Station 41025, the replacement station for DSLN7, was deployed on March 28, 2003. dtlm4|O|Water Level Observation Network||9075099 - De Tour Village, MI||45.992 N 83.897 W (45°59'30" N 83°53'48" W)|E|FZUS53.KAPX | ducn7|N|C-MAN Station||Duck Pier, NC|ARES payload|36.184 N 75.745 W (36°11'3" N 75°44'43" W)|E|FZUS52.KMHX |Station DUCN7 failed on 07/31/2008. Meteorological data for this location is available at DUKN7.

  dukn7|O|Water Level Observation Network||Duck Pier, NC - 8651370||36.183 N 75.747 W (36°11'0" N 75°44'48" W)|E| | dulm5|O|Water Level Observation Network||9099064 - Duluth, MN||46.775 N 92.093 W (46°46'30" N 92°5'36" W)|C|FZUS53.KDLH | eb01|N|12-meter discus buoy||||36.500 N 73.500 W (36°30'0" N 73°30'0" W)|| | eb10|N|12-meter discus buoy|||EEP payload|27.500 N 88.000 W (27°30'0" N 88°0'0" W)|C| | eb31|N|12-meter discus buoy|||LCB payload|27.000 N 86.000 W (27°0'0" N 86°0'0" W)|| | eb32|N|12-meter discus buoy|||LCB payload|27.000 N 84.300 W (27°0'0" N 84°17'60" W)|| | eb33|N|6-meter NOMAD buoy|||MVXI payload|58.500 N 141.000 W (58°30'0" N 141°0'0" W)|A| | eb35|N|6-meter NOMAD buoy|||MVXI payload|55.300 N 157.000 W (55°17'60" N 157°0'0" W)|A| | eb36|N|USCG Large Navigational Buoy|||LCB payload|26.000 N 84.800 W (26°0'0" N 84°47'60" W)|?| | eb43|N|6-meter NOMAD buoy|||MVXI payload|59.800 N 142.000 W (59°47'60" N 142°0'0" W)|A| | eb52|N|USCG Large Navigational Buoy||||38.400 N 74.300 W (38°23'60" N 74°17'60" W)|| | eb53|N|USCG Large Navigational Buoy|||DACT payload|28.900 N 88.300 W (28°53'60" N 88°17'60" W)|E| | eb61|N|GE|||LCB payload|26.900 N 84.600 W (26°53'60" N 84°35'60" W)|?| | eb62|N|USCG Large Navigational Buoy|||DACT payload|29.000 N 85.600 W (29°0'0" N 85°35'60" W)|E| | eb70|N|12-meter discus buoy|||MVXII payload|59.500 N 142.300 W (59°30'0" N 142°18'0" W)|A| | eb90|N|12-meter discus buoy| 02|BERING SEA|DACT payload|47.000 N 130.900 W (47°0'0" N 130°54'0" W)|A|FZAK61.PAFC | eb91|N|USCG Large Navigational Buoy|||DACT payload|38.400 N 74.300 W (38°23'60" N 74°17'60" W)|E| | eb92|N|USCG Large Navigational Buoy|||DACT payload|28.500 N 90.000 W (28°30'0" N 90°0'0" W)|E| | ebsw1|O|Water Level Observation Network||9447130 - Seattle, WA||47.605 N 122.338 W (47°36'18" N 122°20'18" W)|P|FZUS56.KSEW | egkf1|P|Shorebased Tower||EGK - Egmont Key, FL||27.601 N 82.760 W (27°36'4" N 82°45'36" W)|E|FZUS52.KTBW | elfa2|O|Water Level Observation Network||9452634 - Elfin Cove, AK||58.193 N 136.343 W (58°11'35" N 136°20'35" W)|A| | elqc1|NR|NERRS Water Quality Station||South Marsh, Elkhorn Slough Reserve, CA||36.818 N 121.739 W (36°49'5" N 121°44'22" W)|P| | elxc1|NR|NERRS Weather Station||Elkhorn Slough Reserve, CA||36.815 N 121.738 W (36°48'55" N 121°44'17" W)|P| |Water Quality data for this Reserve are available at....
ELQC1 -- South Marsh
eptt2|O|Water Level Observation Network||8771013 - Eagle Point, TX||29.480 N 94.918 W (29°28'48" N 94°55'6" W)|C|FZUS54.KHGX | erkc1|HU|CICORE water quality station||Dock B Eureka, CA||40.801 N 124.182 W (40°48'5" N 124°10'54" W)|P| | eroa2|AK|Weather Station||Eldred Rock, AK||58.971 N 135.220 W (58°58'16" N 135°13'11" W)|A| |For area forecasts and warnings, select: Juneau WFO ertf1|O|Water Level Observation Network||8726669 - Berth 223 Met, FL||27.917 N 82.443 W (27°55'1" N 82°26'34" W)|E| | espp4|O|Water Level Observation Network||9752695 - Esperanza, PR||18.094 N 65.471 W (18°5'38" N 65°28'17" W)|N| | faio1|O|Water Level Observation Network||9063053 - Fairport, OH||41.760 N 81.281 W (41°45'35" N 81°16'52" W)|E| | farp2|N|C-MAN Station||Faraulep, Carolines Island|DACT payload|8.583 N 144.583 E (8°35'0" N 144°35'0" E)|?| | fbis1|N|C-MAN Station||Folly Island, SC|MARS payload|32.685 N 79.888 W (32°41'6" N 79°53'18" W)|E|FZUS52.KCHS |


 

fbps1|NS|Coastal Marine Station||Folly Beach Pier, SC||32.652 N 79.938 W (32°39'7" N 79°56'17" W)|E|FZUS52.KCHS |
  fcgt2|O|Water Level Observation Network||8772447 - USCG Freeport, TX||28.943 N 95.303 W (28°56'36" N 95°18'9" W)|C| | ffia2|N|C-MAN Station||Five Finger, AK|Sutron XPERT payload|57.272 N 133.630 W (57°16'18" N 133°37'48" W)|A| |For area forecasts and warnings, select: Juneau WFO fgbl1|Q|Fixed Structure Weather Station||High Island 334||28.118 N 93.670 W (28°7'6" N 93°40'12" W)|C|FZUS54.KLCH FZNT24.KNHC| fhpf1|P|Shorebased Tower||Fred Howard Park, FL||28.153 N 82.801 W (28°9'12" N 82°48'4" W)|E|FZUS52.KTBW | fila2|N|C-MAN Station||Flat Island Light, AK|ARES payload|59.332 N 151.995 W (59°19'54" N 151°59'42" W)|A|FZAK58.PAVW FZAK51.PAFC|Wave data for this area were available at 46106.

fmoa1|O|Water Level Observation Network||8734673 - Fort Morgan, AL||30.228 N 88.025 W (30°13'41" N 88°1'30" W)|C| | fmrf1|O|Water Level Observation Network||8725520 - Fort Myers, FL||26.647 N 81.872 W (26°38'48" N 81°52'18" W)|E|FZUS52.KTBW | foxr1|O|Water Level Observation Network||8454000 - Providence, RI||41.807 N 71.402 W (41°48'24" N 71°24'6" W)|E| |For area forecasts and warnings, select: Boston WFO fpkg1|O|Water Level Observation Network||8670870 - Fort Pulaski, GA||32.033 N 80.902 W (32°2'0" N 80°54'6" W)|E|FZUS52.KCHS | fpsn7|N|C-MAN Station||Frying Pan Shoals, NC|DACT payload|33.485 N 77.590 W (33°29'6" N 77°35'24" W)|E|FZUS52.KMHX FZUS52.KILM|The CMAN station at FPSN7 has been disestablished.  For local data, please refer to buoy 41013.


  fptm4|CE|GLOS Weather Station||Fairport, MI||45.619 N 86.659 W (45°37'8" N 86°39'34" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS fptt2|O|Water Level Observation Network||8772440 - Freeport, TX||28.948 N 95.308 W (28°56'54" N 95°18'30" W)|C|FZUS54.KHGX | frdf1|O|Water Level Observation Network||8720030 - Fernandina Beach, FL||30.672 N 81.465 W (30°40'18" N 81°27'54" W)|E|FZUS52.KJAX |
  frdp4|PN|Water Level Observation Network||9753216 - Fajardo, PR||18.335 N 65.631 W (18°20'6" N 65°37'52" W)|N| | frdw1|O|Water Level Observation Network||9449880 - Friday Harbor, WA||48.547 N 123.010 W (48°32'48" N 123°0'36" W)|P|FZUS56.KSEW | frkf1|TC|Shorebased Tower||Frog Creek, FL||27.591 N 82.552 W (27°35'28" N 82°33'7" W)|E| | frps1|O|Water Level Observation Network||8668498 - Fripps Inlet, SC||32.340 N 80.460 W (32°20'24" N 80°27'36" W)|E| |For area forecasts and warnings, select: Charleston WFO


  frvm3|O|Water Level Observation Network||8447386 - Fall River, MA||41.705 N 71.163 W (41°42'18" N 71°9'48" W)|E| |For area forecasts and warnings, select: Boston WFO frwl1|O|Water Level Observation Network||8766072 - Fresh Water Canal Locks, LA||29.555 N 92.305 W (29°33'18" N 92°18'18" W)|C|FZUS54.KLCH | fskm2|O|Water Level Observation Network||8574728 - Francis Scott Key Bridge, MD||39.219 N 76.528 W (39°13'9" N 76°31'42" W)|E|FZUS51.KLWX | fsti2|CH|C-MAN Station||Foster Ave Chicago, IL (CPD)||41.976 N 87.648 W (41°58'35" N 87°38'51" W)|C| | ftgm4|O|Water Level Observation Network||9014098 - Fort Gratiot, MI||43.007 N 82.423 W (43°0'24" N 82°25'24" W)|E|FZUS53.KDTX |For area marine forecasts, select: Great Lakes Forecasts ftpc1|O|Water Level Observation Network||9414290 - San Francisco, CA||37.807 N 122.465 W (37°48'24" N 122°27'54" W)|P|FZUS56.KMTR | fwic3|I|Long Island Ferry||Fayerweather Island, CT||41.150 N 73.172 W (41°9'0" N 73°10'19" W)|E|FZUS51.KOKX | fwyf1|N|C-MAN Station||Fowey Rocks, FL|MARS payload|25.591 N 80.097 W (25°35'26" N 80°5'49" W)|E|FZUS52.KMFL FZUS52.KKEY| gbcl1|N|C-MAN Station||Garden Banks||27.800 N 93.100 W (27°48'0" N 93°6'0" W)|C| | gbif1|NP|Water Quality Station||Gunboat Island, FL||25.376 N 81.029 W (25°22'35" N 81°1'46" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. gblw3|CE|Weather Station||Green Bay Entrance Light WI||44.655 N 87.902 W (44°39'18" N 87°54'6" W)|C|FZUS53.KGRB |NOTE: WINDS FREQUENTLY DROP TO ZERO DUE TO WINTER FREEZING.
gbqn3|NR|NERRS Water Quality Station||Oyster River, Great Bay Reserve, NH||43.134 N 70.911 W (43°8'2" N 70°54'40" W)|E| | gbtf1|NP|Water Quality Station||Garfield Bight, FL||25.170 N 80.797 W (25°10'13" N 80°47'48" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. gdil1|N|C-MAN Station||Grand Isle, LA|MARS payload|29.267 N 89.957 W (29°16'0" N 89°57'24" W)|C|FZUS54.KLIX |The Coast Guard building where this station is located sustained extensive damage during Hurricane Katrina. Because of this, we anticipate a lengthy station outage. For comparable local weather and water level observations, see Station GISL1. gdiv2|VM|Marine Observation Station||Goodwin Island Met Station||37.222 N 76.404 W (37°13'20" N 76°24'14" W)|E| | gdmm5|O|Water Level Observation Network||9099090 - Grand Marais, MN||47.748 N 90.342 W (47°44'54" N 90°20'30" W)|C|FZUS53.KDLH | gdqm6|NR|NERRS Water Quality Station||Bangs Lake, Grand Bay Reserve, MS||30.357 N 88.463 W (30°21'26" N 88°27'46" W)|C| | gdwv2|NR|NERRS Water Quality Station||Goodwin Island, Chesapeake Bay Reserve, VA||37.218 N 76.395 W (37°13'3" N 76°23'43" W)|E| | gdxm6|NR|NERRS Weather Station||Grand Bay Reserve, MS||30.359 N 88.420 W (30°21'33" N 88°25'12" W)|C| |Water Quality data for this Reserve are available at....
GDQM6 -- Bangs Lake
gelo1|EA|GLOS Weather Station||Geneva on the Lake, OH||41.860 N 80.974 W (41°51'35" N 80°58'26" W)|E| | gisl1|O|Water Level Observation Network||8761724 - Grand Isle, LA||29.263 N 89.957 W (29°15'48" N 89°57'24" W)|C|FZUS54.KLIX | glln6|N|C-MAN Station||Galloo Island, NY|VEEP payload|43.890 N 76.450 W (43°53'24" N 76°27'0" W)|E|FZUS61.KBUF |Station GLLN6 was disestablished on September 30, 2002 glpt2|K|Shorebased Tower||021: Galveston Pleasure Pier; Gulf of Mexico||29.300 N 94.794 W (29°17'59" N 94°47'38" W)|C|FZUS54.KHGX |Station disestablished. Refer to Station GPST2 for current data. gnjt2|O|Water Level Observation Network||8771341 - Galveston Bay (North Jetty), TX||29.357 N 94.723 W (29°21'24" N 94°43'24" W)|C| | gpom6|O|Water Level Observation Network||8744707 - Gulfport Outer Range, MS||30.230 N 88.982 W (30°13'48" N 88°58'55" W)|C| | gpst2|O|Water Level Observation Network||8771510 - Galveston Pleasure Pier, TX||29.285 N 94.788 W (29°17'6" N 94°47'18" W)|C|FZUS54.KHGX | gptw1|CM|Water Quality Station||Grays Point, WA||46.273 N 123.767 W (46°16'23" N 123°46'1" W)|P| | grmm4|CE|GLOS Weather Station||Grand Marais, MI||46.680 N 85.970 W (46°40'47" N 85°58'11" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS gslm4|CE|Weather Station||Gravelly Shoals Light MI||44.018 N 83.537 W (44°1'6" N 83°32'14" W)|E|FZUS53.KDTX | gtbm4|MI|Coastal Marine Station||Grand Traverse Bay Observing System Station 2||44.767 N 85.606 W (44°46'0" N 85°36'21" W)|E| |For Great Lakes marine forecast, selec: GREAT LAKES FORECAST

gtlm4|CE|GLOS Weather Station||Grand Traverse Light, MI||45.211 N 85.550 W (45°12'38" N 85°33'1" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS gtot2|O|Water Level Observation Network||8771450 - Galveston Pier 21, TX||29.310 N 94.793 W (29°18'36" N 94°47'36" W)|C|FZUS54.KHGX | gtqf1|NR|NERRS Water Quality Station||Pellicer Creek, Guan Tolomato Matanzas Reserve, FL||29.669 N 81.256 W (29°40'9" N 81°15'22" W)|E| | gtrm4|CE|GLOS Weather Station||Superior Grand Traverse Bay, MI||47.179 N 88.242 W (47°10'44" N 88°14'30" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS gtxf1|NR|NERRS Weather Station||Guana Tolomato Matanzas Reserve, FL||29.658 N 81.220 W (29°39'28" N 81°13'13" W)|E| |

Water Quality data for this Reserve are available at....
GTQF1 -- Pellicer Creek

 




gwpm6|O|Water Level Observation Network||8745651 - West Pier, Gulfport, MS||30.348 N 89.087 W (30°20'53" N 89°5'13" W)|C| | hbyc1|O|Water Level Observation Network||9418767 - North Spit, CA||40.767 N 124.217 W (40°46'0" N 124°13'0" W)|P|FZUS56.KEKA | hcef1|NP|Water Quality Station||Highway Creek, FL||25.254 N 80.444 W (25°15'15" N 80°26'39" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. hcgn7|O|Water Level Observation Network||8654467 - Hatteras, NC||35.208 N 75.703 W (35°12'29" N 75°42'11" W)|E| | hhlo1|EA|GLOS Weather Station||Huron Light, OH||41.401 N 82.545 W (41°24'2" N 82°32'43" W)|E| | hlnm4|O|Water Level Observation Network||9087031 - Holland, MI||42.773 N 86.213 W (42°46'24" N 86°12'46" W)|E| | hmno3|CM|||Hammond Tide Gauge, OR||46.203 N 123.767 W (46°12'10" N 123°46'1" W)|P| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. hmra2|NR|NERRS Weather Station||Kachemak Bay Reserve, AK||59.601 N 151.416 W (59°36'5" N 151°24'58" W)|A| |

Water Quality data for this Reserve are available at....

KCHA2 -- Homer Deep

SEQA2 -- Seldovia

hplm2|HP|CBOS Station||Horn Point Weather Station MD||38.590 N 76.133 W (38°35'24" N 76°8'0" W)|E|FZUS51.KLWX | hrbm4|O|Water Level Observation Network||9075014 - Harbor Beach, MI||43.847 N 82.643 W (43°50'48" N 82°38'36" W)|E|FZUS53.KDTX | hssf1|P|Offshore Tower||HOM - Homosassa, FL||28.772 N 82.707 W (28°46'20" N 82°42'26" W)|E|FZUS52.KTBW | huqn6|NR|NERRS Water Quality Station||Tivoli North, Hudson River Reserve, NY||42.037 N 73.925 W (42°2'12" N 73°55'31" W)|E| | icac1|O|Water Level Observation Network||9410840 - Santa Monica Pier||34.008 N 118.500 W (34°0'30" N 118°30'0" W)|P|FZUS56.KLOX |The Station ID prior to 18z, on 1/22/2010 was SMOC1. iiwc1|O|Water Level Observation Network||9410172 - USS Midway South Navy Pier, San Diego, CA||32.714 N 117.175 W (32°42'50" N 117°10'31" W)|P| | ildl1|Z|Shorebased Tower||Isle Dernieres, LA / CSI05||29.053 N 90.533 W (29°3'12" N 90°32'0" W)|C|FZUS54.KLIX | iloh1|O|Water Level Observation Network||1617760 - Hilo, HI||19.730 N 155.055 W (19°43'48" N 155°3'18" W)|H| | iosn3|N|C-MAN Station||Isle of Shoals, NH|Sutron XPERT payload|42.967 N 70.623 W (42°58'0" N 70°37'24" W)|E|FZUS51.KGYX |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike
irdt2|K|Shorebased Tower||8776139 - South Bird Island, TX||27.485 N 97.318 W (27°29'5" N 97°19'5" W)|C| | jaki2|CH|C-MAN Station||63rd ST, Chicago, IL (CPD)||41.781 N 87.573 W (41°46'50" N 87°34'23" W)|| | jcqn4|NR|NERRS Water Quality Station||Chestnut Neck, Jacques Cousteau Reserve, NJ||39.548 N 74.461 W (39°32'52" N 74°27'41" W)|E| | jcrn4|NR|NERRS Weather Station||Jacques Cousteau Reserve, NJ||39.535 N 74.464 W (39°32'6" N 74°27'49" W)|E| |Water Quality data for this Reserve are available at....
JCQN4 -- Chestnut Neck
JCTN4 -- Buoy 126
jctn4|NR|NERRS Water Quality Station||Buoy 126, Jacques Cousteau Reserve, NJ||39.508 N 74.338 W (39°30'29" N 74°20'18" W)|E| | jkyf1|NP|Water Quality Station||Johnson Key, FL||25.050 N 80.904 W (25°3'1" N 80°54'16" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. jmpn7|O|Water Level Observation Network||8658163 - Johnny Mercer Pier, Wrightsville Beach, NC||34.210 N 77.795 W (34°12'36" N 77°47'42" W)|E| |

For area forecasts and warnings, select: Wilmington WFO


 

jnea2|O|Water Level Observation Network||9452210 - Juneau, AK||58.298 N 134.412 W (58°17'54" N 134°24'42" W)|A| | joqp4|NR|NERRS Water Quality Station||Station 20, Jobos Bay Reserve, Puerto Rico||17.930 N 66.211 W (17°55'49" N 66°12'41" W)|N| | joxp4|NR|NERRS Weather Station||Jobos Bay Reserve, Puerto Rico||17.956 N 66.239 W (17°57'23" N 66°14'19" W)|N| |Water Quality data for this Reserve are available at....
JOQP4 -- Station 20
jtaw1|CM|Water Quality Station||Jetty A, USCG Station Disappointment||46.269 N 124.037 W (46°16'10" N 124°2'15" W)|P| | kata1|DI|C-MAN Station||Katrina Cut, AL||30.258 N 88.213 W (30°15'30" N 88°12'47" W)|C| | katp|FA|Oil Platform||Green Canyon 787 / Atlantis (BP)||27.195 N 90.027 W (27°11'42" N 90°1'37" W)|C| |Data from this station are not quality controlled by NDBC kbbf|FA|Oil Platform||Brazos 133B (Apache Corp)||28.058 N 95.872 W (28°3'29" N 95°52'19" W)|C| |Data from this station are not quality controlled by NDBC kbqx|FA|Oil Platform||Brazos 451 (Medco Energi)||28.493 N 95.724 W (28°29'35" N 95°43'26" W)|C| |Data from this station are not quality controlled by NDBC kcha2|NR|NERRS Water Quality Station||Homer Deep, Kachemak Bay Reserve, AK||59.603 N 151.408 W (59°36'10" N 151°24'29" W)|A| | kcmb|FA|Oil Platform||East Cameron 47JP (Apache Corp)||29.441 N 92.979 W (29°26'28" N 92°58'44" W)|C| |Data from this station are not quality controlled by NDBC kcrh|FA|Oil Platform||West Cameron 368A (Century Exploration)||28.909 N 93.302 W (28°54'32" N 93°18'7" W)|C| |Data from this station are not quality controlled by NDBC kdaa2|O|Water Level Observation Network||9457292- Kodiak Island, AK||57.730 N 152.514 W (57°43'49" N 152°30'50" W)|A| | kdlp|FA|Oil Platform||West Delta 27A (AngloSuisse Offshore Partners)||29.121 N 89.547 W (29°7'16" N 89°32'49" W)|C| |Data from this station are not quality controlled by NDBC keca2|O|Water Level Observation Network||9450460 - Ketchikan, AK||55.333 N 131.625 W (55°19'59" N 131°37'30" W)|A| | kehc|FA|Oil Platform||East Cameron 278B (Apache Corp)||28.429 N 92.878 W (28°25'44" N 92°52'41" W)|C| |Data from this station are not quality controlled by NDBC keir|FA|Oil Platform||Eugene Island 215 (McMoRan Oil & Gas)||28.634 N 91.489 W (28°38'2" N 91°29'20" W)|C| |Data from this station are not quality controlled by NDBC kemk|FA|Oil Platform||East Breaks 165 (SandRidge Energy)||27.819 N 94.323 W (27°49'8" N 94°19'23" W)|C| |Data from this station are not quality controlled by NDBC kgbk|FA|Oil Platform||Garden Banks 783 / Magnolia TLP (ConocoPhillips)||27.204 N 92.203 W (27°12'14" N 92°12'11" W)|C| |Data from this station are not quality controlled by NDBC kgca2|O|Water Level Observation Network||9459881 - King Cove, AK||55.062 N 162.327 W (55°3'42" N 162°19'36" W)|A| | kghb|FA|Oil Platform||Garden Banks 172 / Salsa (Shell E & P)||27.840 N 91.988 W (27°50'24" N 91°59'17" W)|C| |Data from this station are not quality controlled by NDBC kgna|CE|Weather Station||Bay of Grand Marais, MN||47.745 N 90.346 W (47°44'43" N 90°20'44" W)|C| |Data from this station are not quality controlled by NDBC kgry|FA|Oil Platform||Green Canyon 338 / Front Runner (Murphy E&P)||27.625 N 90.441 W (27°37'30" N 90°26'28" W)|C| |Data from this station are not quality controlled by NDBC kgul|FA|Oil Platform||Garden Banks 668 / Gunnison Spar (Anadarko)||27.304 N 93.538 W (27°18'14" N 93°32'17" W)|C| |Data from this station are not quality controlled by NDBC kgvx|FA|Oil Platform||Galveston 424C (Nippon Oil Exploration)||28.577 N 94.976 W (28°34'37" N 94°58'34" W)|C| |Data from this station are not quality controlled by NDBC khhv|FA|Oil Platform||Alaminos Canyon 25 / Hoover-Diana (ExxonMobile Corp)||26.939 N 94.689 W (26°56'20" N 94°41'20" W)|C| |Data from this station are not quality controlled by NDBC khqi|FA|Oil Platform||High Island 376B (Apache)||27.934 N 93.669 W (27°56'2" N 93°40'8" W)|C| |Data from this station are not quality controlled by NDBC kipn|FA|Oil Platform||Mississippi Canyon 920 / Independence Hub (Anadarko / Enterprise)||28.085 N 87.986 W (28°5'6" N 87°59'10" W)|C| |Data from this station are not quality controlled by NDBC klih1|O|Water Level Observation Network||1615680 - Kahului Bay, Maui, HI||20.898 N 156.472 W (20°53'54" N 156°28'18" W)|H|FZHW50.PHFO | kmdj|FA|Oil Platform||Mississippi Canyon 311A (Apache Corp)||28.643 N 89.794 W (28°38'35" N 89°47'38" W)|C| |Data from this station are not quality controlled by NDBC kmis|FA|Oil Platform||MP 140B AWOS (Apache Corp)||29.296 N 88.842 W (29°17'46" N 88°50'31" W)|C| |Data from this station are not quality controlled by NDBC kmiu|FA|Oil Platform||Mustang Island A31B (Merit Energy)||27.289 N 96.736 W (27°17'20" N 96°44'10" W)|C| |Data from this station are not quality controlled by NDBC kmyt|FA|Oil Platform||Mississippi Canyon 711 / ATP Innovator (ATP Oil & Gas)||28.221 N 89.615 W (28°13'16" N 89°36'54" W)|C| |Data from this station are not quality controlled by NDBC kmzg|FA|Oil Platform||Mustang Island A85A (Apache Corp)||27.727 N 96.191 W (27°43'37" N 96°11'28" W)|C| |Data from this station are not quality controlled by NDBC knoh1|UH|Platform||Kilo Nalu Observatory, Hawaii||21.288 N 157.865 W (21°17'18" N 157°51'54" W)|H| |Sensors located at 11.5 meters below mean sea level. knsw3|CE|C-MAN Station||Kenosha, WI||42.589 N 87.809 W (42°35'20" N 87°48'31" W)|C|FZUS53.KMKX | kopm|FA|Oil Platform||North Padre Island 975 (Peregrine Oil & Gas)||26.833 N 96.940 W (26°49'59" N 96°56'24" W)|C| |Data from this station are not quality controlled by NDBC kp53|CE|Weather Station||Munising Lake Shore, MI||46.417 N 86.650 W (46°25'0" N 86°39'0" W)|E| |Data from this station are not quality controlled by NDBC kp58|CE|Weather Station||Port Hope, MI||44.017 N 82.800 W (44°1'0" N 82°48'0" W)|E| |Data from this station are not quality controlled by NDBC kp59|CE|Weather Station||Copper Harbor, MI||47.467 N 87.883 W (47°28'0" N 87°53'0" W)|E| |Data from this station are not quality controlled by NDBC kptn6|O|Water Level Observation Network||8516945 - Kings Point, NY||40.810 N 73.765 W (40°48'36" N 73°45'54" W)|E|FZUS51.KOKX | kptv2|O|Water Level Observation Network||8632200 - Kiptopeke, VA||37.167 N 75.988 W (37°10'0" N 75°59'18" W)|E|FZUS51.KAKQ |


 

kscf|FA|Oil Platform||South Marsh 268A (Apache Corp)||29.116 N 91.871 W (29°6'58" N 91°52'16" W)|C| |Data from this station are not quality controlled by NDBC kspr|FA|Oil Platform||Ship Shoal 178 (Apache Corp)||28.599 N 91.206 W (28°35'56" N 91°12'22" W)|C| |Data from this station are not quality controlled by NDBC kstz|FA|Oil Platform||South Timballer 301B / Popeye (Shell E & P)||28.160 N 90.666 W (28°9'36" N 90°39'58" W)|C| |Data from this station are not quality controlled by NDBC ktnf1|N|C-MAN Station||Keaton Beach, FL|MARS payload|29.817 N 83.592 W (29°49'2" N 83°35'30" W)|E|FZUS52.KTAE |
kvaf|FA|Oil Platform||East Breaks 643 / Boomvang Spar (Anadarko)||27.354 N 94.625 W (27°21'14" N 94°37'30" W)|C| |Data from this station are not quality controlled by NDBC kvbs|FA|Oil Platform||Sabine Pass 13B (Nippon Oil Exploration)||29.478 N 93.638 W (29°28'41" N 93°38'17" W)|C| |Data from this station are not quality controlled by NDBC kvky|FA|Oil Platform||Main Pass 289C (Apache Corp.)||29.248 N 88.441 W (29°14'53" N 88°26'28" W)|C| |Data from this station are not quality controlled by NDBC kvnp|FA|Oil Platform||Vermillion 26 (Mariner Energy)||29.467 N 92.368 W (29°28'1" N 92°22'5" W)|C| |Data from this station are not quality controlled by NDBC kvoa|FA|Oil Platform||Vissco Knoll 786 / Petronius (Chevron)||29.229 N 87.781 W (29°13'44" N 87°46'52" W)|C| |Data from this station are not quality controlled by NDBC kvqt|FA|Oil Platform||Vermillon 331A (ERT / Helix)||28.270 N 92.264 W (28°16'12" N 92°15'50" W)|C| |Data from this station are not quality controlled by NDBC kwjp8|O|Water Level Observation Network||1820000 - Kwajalein Island||8.737 N 167.737 E (8°44'12" N 167°44'12" E)|?| | kwnw3|O|Water Level Observation Network||9087069- Kewaunee, WI||44.465 N 87.496 W (44°27'54" N 87°29'45" W)|C| |

To visit the CO-OPS web site:

For Meteorological data: Station = 9087069

For nearby Water Level data: Station = 9087068

kxih|FA|Oil Platform||High Island 179A AWOS (Apache Corp)||29.180 N 94.521 W (29°10'48" N 94°31'16" W)|C| |Data from this station are not quality controlled by NDBC kxpy|FA|Weather Station||Fourchon Heliport (Era Helicopters)||29.123 N 90.202 W (29°7'23" N 90°12'7" W)|C| |Data from this station are not quality controlled by NDBC kywf1|O|Water Level Observation Network||8724580 - Key West, FL||24.553 N 81.808 W (24°33'12" N 81°48'30" W)|E|FZUS52.KKEY | labl1|O|Water Level Observation Network||8762372 - Bayou LaBranch, LA||30.050 N 90.368 W (30°3'0" N 90°22'6" W)|C|FZUS54.KLIX | lapw1|O|Water Level Observation Network||9442396 - La Push, WA||47.913 N 124.637 W (47°54'47" N 124°38'13" W)|P| |For area forecasts and warnings, select: Seattle WFO lbrf1|NP|Water Quality Station||Broad River Lower, FL||25.484 N 81.111 W (25°29'4" N 81°6'40" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. lbsf1|NP|Water Quality Station||Little Blackwater, FL||25.214 N 80.432 W (25°12'52" N 80°25'56" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. lciy2|IC|Fixed Structure Weather Station||Little Cayman Research Centre, Cayman Islands||19.699 N 80.061 W (19°41'56" N 80°3'38" W)|E| | lcll1|O|Water Level Observation Network||8767816 - Lake Charles, LA||30.223 N 93.222 W (30°13'24" N 93°13'18" W)|C| | lcna2|AK|Weather Station||Lincoln Rock, AK||56.057 N 132.696 W (56°3'25" N 132°41'46" W)|A| |For area forecasts and warnings, select: Juneau WFO ldlc3|Y|Weather Station||New London Ledge CT - Ledge Light Weather Station||41.305 N 72.077 W (41°18'18" N 72°4'36" W)|E|FZUS51.KOKX | ldtm4|O|Water Level Observation Network||9087023 - Ludington, MI||43.947 N 86.442 W (43°56'48" N 86°26'30" W)|E|FZUS53.KGRR | ljac1|O|Water Level Observation Network||9410230 - La Jolla, CA||32.867 N 117.258 W (32°52'0" N 117°15'30" W)|P|FZUS56.KSGX | ljpc1|R|C-MAN Station||La Jolla, CA (073)||32.867 N 117.257 W (32°52'0" N 117°15'24" W)|P|FZUS56.KSGX | lkpl1|L|Shorebased Tower||Western Lake Pontchartrain, LA||30.315 N 90.281 W (30°18'54" N 90°16'50" W)|C|FZUS54.KLIX | lkwf1|O|Water Level Observation Network||8722670 - Lake Worth, FL||26.612 N 80.033 W (26°36'42" N 80°2'0" W)|E|FZUS52.KMFL | llbp7|IC|Water Quality Station||Lao Lao Bay, Saipan, CNMI||15.157 N 145.770 E (15°9'24" N 145°46'11" E)|?| | lmbv4|EM|Weather Station||La Mancha Beach, Mexico|Sutron XPERT payload|19.594 N 96.379 W (19°35'38" N 96°22'44" W)|C| | lmdf1|NP|Water Quality Station||Little Madeira, FL||25.174 N 80.632 W (25°10'26" N 80°37'56" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. lmfs1|EA|C-MAN Station||Lake Murray SC||34.107 N 81.271 W (34°6'26" N 81°16'14" W)|E| | lmrf1|NP|Water Quality Station||Lostmans River, FL||25.554 N 81.169 W (25°33'15" N 81°10'7" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. lmss1|EA|C-MAN Station||Lake Marion, SC||33.552 N 80.501 W (33°33'7" N 80°30'5" W)|E| | lndc1|O|Water Level Observation Network||9414763 - Oakland, CA||37.795 N 122.288 W (37°47'42" N 122°17'17" W)|P| | lnel1|N|C-MAN Station||Lena||28.200 N 89.100 W (28°12'0" N 89°6'0" W)|C| | lonf1|N|C-MAN Station||Long Key, FL|MARS payload|24.843 N 80.862 W (24°50'36" N 80°51'42" W)|E|FZUS52.KKEY | lopl1|LP|Oil Platform||Louisiana Offshore Oil Port, LA||28.885 N 90.024 W (28°53'7" N 90°1'28" W)|C| | lopw1|O|Water Level Observation Network||9440422 - Longview, WA||46.108 N 122.957 W (46°6'30" N 122°57'24" W)|P| | lpnm4|O|Water Level Observation Network||Alpena, MI - 9075065||45.063 N 83.428 W (45°3'48" N 83°25'42" W)|E| | lpoi1|N|C-MAN Station||Lake Pend Oreille, ID|VEEP payload|48.060 N 116.500 W (48°3'36" N 116°30'0" W)|P| |The C-Man station at LPOI1 has been disestablished. lprp4|IC|Fixed Structure Weather Station||Media Luna, La Parguera, PR||17.939 N 67.052 W (17°56'19" N 67°3'7" W)|N| | lrif1|NP|Water Quality Station||Lane River, FL ||25.284 N 80.894 W (25°17'4" N 80°53'38" W)|E| | lrkf1|NP|Water Quality Station||Little Rabbit Key, FL||24.979 N 80.826 W (24°58'46" N 80°49'33" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. lscm4|N|C-MAN Station||Lake St Clair, MI|VEEP payload|42.465 N 82.755 W (42°27'54" N 82°45'18" W)|E| |This station was disestablished on 5/16/2011. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed.
Station LSCM4 is transmitting intermittently due to power issues. Usable data will be posted until the station fails again. 
For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS lsnf1|NP|Water Quality Station||Long Sound, FL||25.233 N 80.457 W (25°14'0" N 80°27'27" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. ltbv3|O|Water Level Observation Network||9751401 - Lime Tree Bay, VI||17.697 N 64.753 W (17°41'48" N 64°45'12" W)|N|FZCA52.TJSJ | ltqm2|NR|NERRS Water Quality Station||Otter Point Creek, Chesapeake Bay Reserve, MD||39.451 N 76.275 W (39°27'3" N 76°16'29" W)|E| | ltrm4|O|Water Level Observation Network||9076032 - Little Rapids, MI||46.485 N 84.300 W (46°29'6" N 84°18'0" W)|E| |For area forecasts and warnings, select: Gaylord WFO luml1|L|Shorebased Tower||LUMCON Marine Center, LA||29.253 N 90.663 W (29°15'12" N 90°39'48" W)|C|FZUS54.KLIX | lwsd1|O|Water Level Observation Network||8557380 - Lewes, DE||38.782 N 75.120 W (38°46'54" N 75°7'12" W)|E|FZUS51.KPHI |


 

lwtv2|O|Water Level Observation Network||8635750 - Lewisetta, VA||37.995 N 76.465 W (37°59'42" N 76°27'54" W)|E|FZUS51.KLWX | macm4|O|Water Level Observation Network||9075080 - Mackinaw City, MI||45.778 N 84.725 W (45°46'40" N 84°43'31" W)|E| | maqt2|NR|NERRS Water Quality Station||Mission-Aransas Reserve, TX||27.980 N 97.029 W (27°58'47" N 97°1'43" W)|C| |The previous position listed on this site, 28 4' 11''N 97 12' 11''W, was in error.  The correct position is now posted on this webpage.
maxt2|NR|NERRS Weather Station||Mission-Aransas Reserve, TX||28.132 N 97.034 W (28°7'56" N 97°2'4" W)|C| |Water Quality data for this Reserve are available at....
MAQT2 -- Mission-Aransas mbla1|DI|Coastal Marine Station||Middle Bay Light, AL||30.437 N 88.012 W (30°26'12" N 88°0'42" W)|C| | mbrm4|O|Water Level Observation Network||9014090 - Mouth of the Black River, MI ||42.974 N 82.420 W (42°58'26" N 82°25'13" W)|E| | mcga1|O|Water Level Observation Network||8736897 - Coast Guard Sector Mobile, AL||30.648 N 88.058 W (30°38'53" N 88°3'29" W)|C| | mcgm4|O|Water Level Observation Network||9099018 - Marquette C.G., MI||46.545 N 87.378 W (46°32'42" N 87°22'42" W)|E|FZUS53.KMQT | mcyf1|O|Water Level Observation Network||8726667 - McKay Bay Entrance, FL||27.913 N 82.425 W (27°54'48" N 82°25'30" W)|E|FZUS52.KTBW | mcyi3|G|C-MAN Station||Michigan City, IN||41.729 N 86.913 W (41°43'43" N 86°54'45" W)|C|FZUS53.KLOT | mdrm1|N|C-MAN Station||Mt Desert Rock, ME|MARS payload|43.968 N 68.128 W (43°58'6" N 68°7'42" W)|E|FZUS51.KCAR |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike 

meem4|CE|GLOS Weather Station||Manistee Harbor, MI||44.248 N 86.346 W (44°14'51" N 86°20'44" W)|E| | mgip4|O|Water Level Observation Network||9759110 - Magueyes Islands, PR||17.972 N 67.047 W (17°58'18" N 67°2'48" W)|N|FZCA52.TJSJ | mgpt2|O|Water Level Observation Network||8770613 - Morgans Point, TX||29.682 N 94.985 W (29°40'54" N 94°59'6" W)|C|FZUS54.KHGX | mgzp4|PN|Water Level Observation Network||9759394 - Mayaguez, PR||18.218 N 67.159 W (18°13'5" N 67°9'32" W)|N| | mhpa1|DI|Coastal Marine Station||Meaher Park, AL||30.667 N 87.936 W (30°40'2" N 87°56'11" W)|C| | misc3|I|Long Island Ferry||North Middle Sound, CT||41.074 N 73.134 W (41°4'27" N 73°8'2" W)|E|FZUS51.KOKX | mism1|N|C-MAN Station||Matinicus Rock, ME|MARS payload|43.783 N 68.855 W (43°47'0" N 68°51'18" W)|E|FZUS51.KCAR FZUS51.KGYX|Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike
misn6|I|Long Island Ferry||South Middle Sound, NY||41.049 N 73.121 W (41°2'56" N 73°7'16" W)|E|FZUS51.KOKX | misp4|O|Water Level Observation Network||9759938 - Mona Island, PR||18.090 N 67.939 W (18°5'24" N 67°56'19" W)|N| | mkgm4|G|C-MAN Station||Muskegon, MI||43.228 N 86.339 W (43°13'40" N 86°20'20" W)|E|FZUS53.KGRR | mlrf1|N|C-MAN Station||Molasses Reef, FL|MARS payload|25.012 N 80.376 W (25°0'42" N 80°22'35" W)|E|FZUS52.KKEY |Ocean temperature and salinity data are provided by Integrated Coral Observing Network (ICON)  mlsc1|ML|CICORE water quality station||Moss Landing, South Harbor, CA||36.807 N 121.788 W (36°48'24" N 121°47'16" W)|P| | mlto3|D|C-MAN Station||Marsh Island, OR||46.214 N 123.620 W (46°12'51" N 123°37'12" W)|P|FZUS56.KPQR | mlww3|G|C-MAN Station||Milwaukee, WI||43.046 N 87.879 W (43°2'44" N 87°52'44" W)|C|FZUS53.KMKX | mnmm4|O|Water Level Observation Network||9087088 - Menominee, MI||45.096 N 87.590 W (45°5'45" N 87°35'24" W)|C| | mnpv2|O|Water Level Observation Network||8639348 - Money Point, VA||36.778 N 76.302 W (36°46'42" N 76°18'6" W)|E|FZUS51.KAKQ |Water temperatures at this station may be higher than normally expected due to near-by industrial activity sites and the physical location of the sensor.  mokh1|O|Water Level Observation Network||1612480 - Mokuoloe, HI||21.432 N 157.790 W (21°25'55" N 157°47'24" W)|H| | mpcl1|N|C-MAN Station||Main Pass||29.400 N 88.600 W (29°24'0" N 88°36'0" W)|C| | mqtt2|O|Water Level Observation Network||8775870 - Malaquite Beach (Corpus Christi), TX||27.580 N 97.217 W (27°34'48" N 97°13'0" W)|C|FZUS54.KCRP | mrcp1|O|Water Level Observation Network||8540433 - Marcus Hook, PA||39.812 N 75.410 W (39°48'43" N 75°24'36" W)|E| | mrho1|O|Water Level Observation Network||9063079 - Marblehead, OH||41.545 N 82.732 W (41°32'42" N 82°43'54" W)|E|FZUS51.KCLE | mrka2|N|C-MAN Station||Middle Rock Light, AK|Sutron XPERT payload|61.082 N 146.662 W (61°4'54" N 146°39'42" W)|A|FZAK58.PAVW FZAK51.PAFC| mros1|O|Water Level Observation Network||8661070 - Springmaid Pier, SC||33.655 N 78.918 W (33°39'18" N 78°55'6" W)|E|FZUS52.KILM |This station is co-located with the University of South Carolina station SMBS1.


  mrsl1|Z|Shorebased Tower||Marsh Island, LA / CSI03||29.440 N 92.061 W (29°26'25" N 92°3'41" W)|C|FZUS54.KLCH | mtbf1|P|Offshore Tower||Middle Tampa Bay||27.661 N 82.594 W (27°39'40" N 82°35'38" W)|E|FZUS52.KTBW | mtkn6|O|Water Level Observation Network||8510560 - Montauk, NY||41.048 N 71.960 W (41°2'54" N 71°57'36" W)|E|FZUS51.KOKX |


 

mtyc1|O|Water Level Observation Network||9413450 - Monterey, CA||36.605 N 121.888 W (36°36'18" N 121°53'18" W)|P|FZUS56.KMTR | mukf1|NP|Water Quality Station||Murray Key, FL||25.104 N 80.942 W (25°6'15" N 80°56'32" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. mypf1|O|Water Level Observation Network||8720218 - Mayport (Bar Pilots Dock), FL||30.397 N 81.430 W (30°23'48" N 81°25'48" W)|E|FZUS52.KJAX |
  mzxc1|O|||9415102 - Martinez-Amorco CA||38.033 N 122.125 W (38°1'59" N 122°7'30" W)|| | nabm4|CE|GLOS Weather Station||Naubinway, MI||46.087 N 85.443 W (46°5'13" N 85°26'35" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS naqr1|NR|NERRS Water Quality Station||T-Wharf Bottom, Narragansett Bay Reserve, RI||41.579 N 71.321 W (41°34'44" N 71°19'17" W)|E| | naxr1|NR|NERRS Weather Station||Narragansett Bay Reserve, RI||41.639 N 71.339 W (41°38'20" N 71°20'22" W)|E| |Water Quality data for this Reserve are available at....
NAQR1 -- T-Wharf Bottom
nblp1|O|Water Level Observation Network||8548989 - Newbold, PA||40.137 N 74.750 W (40°8'13" N 74°45'0" W)|E| |For area forecasts and warnings, select: Philadelphia WFO ncht2|K|Weather Station||8770777 - Manchester, TX ||29.726 N 95.266 W (29°43'35" N 95°15'56" W)|C| | ncsc3|I|Long Island Ferry||North Central Sound, CT||41.099 N 73.147 W (41°5'58" N 73°8'49" W)|E|FZUS51.KOKX | ndbc1|N|Test station||NDBC Glider #1||36.810 N 122.320 W (36°48'37" N 122°19'11" W)|P| |Glider data are not quality controlled by NDBC.
ndbc2|N|Test station||NDBC Glider #2||27.500 N 84.500 W (27°30'0" N 84°30'0" W)|E| | neaw1|O|Water Level Observation Network||9443090 - Neah Bay, WA||48.368 N 124.617 W (48°22'6" N 124°37'0" W)|P|FZUS56.KSEW | nfbf1|P|Offshore Tower||NFB - Northwest Florida Bay, FL||25.084 N 81.096 W (25°5'4" N 81°5'45" W)|E|FZUS52.KKEY | nglt2|K|Shorebased Tower||8775283 - Port Ingleside, TX||27.822 N 97.203 W (27°49'18" N 97°12'12" W)|C| | nian6|O|Water Level Observation Network||9063012 - Niagara Intake, NY||43.077 N 79.013 W (43°4'36" N 79°0'48" W)|E| | niqs1|NR|NERRS Water Quality Station||Oyster Landing, North Inlet-Winyah Bay Reserve, SC||33.349 N 79.193 W (33°20'58" N 79°11'34" W)|E| | niws1|NR|NERRS Weather Station||North Inlet-Winyah Bay Reserve, SC||33.349 N 79.193 W (33°20'58" N 79°11'34" W)|E| |

Water Quality data for this Reserve are available at....
NIQS1 -- Oyster Landing

DBQS1 -- Debidue Creek, North Inlet


nkta2|O|Water Level Observation Network||9455760 - Nikiski, AK||60.683 N 151.398 W (60°41'0" N 151°23'54" W)|A|FZAK51.PAFC | nlec1|EB|CICORE water quality station||San Leandro Marina, CA||37.696 N 122.192 W (37°41'45" N 122°11'32" W)|P| | nlnc3|O|Water Level Observation Network||8461490 - New London, CT||41.355 N 72.087 W (41°21'18" N 72°5'12" W)|E|FZUS51.KOKX | nmta2|O|Water Level Observation Network||9468756 - Nome, Norton Sound, AK||64.500 N 165.430 W (64°30'0" N 165°25'48" W)|A|FZAK51.PAFC | noqn7|NR|NERRS Water Quality Station||Research Creek, North Carolina Reserve, NC||34.156 N 77.850 W (34°9'22" N 77°51'0" W)|E| | nosc3|I|Long Island Ferry||Northern Open Sound, CT||41.125 N 73.159 W (41°7'29" N 73°9'32" W)|E|FZUS51.KOKX | noxn7|NR|NERRS Weather Station||North Carolina Reserve, NC||34.156 N 77.851 W (34°9'20" N 77°51'3" W)|E| |

Water Quality data for this Reserve are available at....
NOQN7 -- Research Creek

ZBQN7 -- Zeke's Basin


npdw3|CE|Weather Station||Northport Pier at Death's Door WI||45.290 N 86.978 W (45°17'25" N 86°58'40" W)|C|FZUS53.KGRB | npsf1|O|Water Level Observation Network||8725110 - Naples, FL||26.130 N 81.807 W (26°7'48" N 81°48'24" W)|E|FZUS52.KMFL | nstp6|O|Water Level Observation Network||1770000 - Pago Pago||14.280 S 170.688 W (14°16'48" S 170°41'17" W)|?| |For area forecasts and warnings, select: NWS Pago Pago Site ntbc1|O|Water Level Observation Network||Santa Barbara, CA - 9411340||34.408 N 119.685 W (34°24'30" N 119°41'6" W)|P| | ntkm3|O|Water Level Observation Network||8449130 - Nantucket Island, MA||41.285 N 70.097 W (41°17'6" N 70°5'48" W)|E| |Caution: Right whales may be active in northeast waters year-round. Mandatory speed restrictions of 10 knots apply to vessels 65 feet or greater in specific areas and times along the US east coast. Voluntary speed restrictions may be in effect in other areas and times. For current information on speed-restricted areas, go to: http://www.nmfs.noaa.gov/pr/shipstrike  

For area forecasts and warnings, select: Boston WFO

nwcl1|O|Water Level Observation Network||8761927 - New Canal, LA||30.027 N 90.113 W (30°1'37" N 90°6'47" W)|C| | nwhc3|O|Water Level Observation Network||8465705 - New Haven, CT||41.283 N 72.908 W (41°17'0" N 72°54'30" W)|E|FZUS51.KOKX | nwpo3|N|C-MAN Station||Newport, OR|MARS payload|44.613 N 124.067 W (44°36'48" N 124°4'0" W)|P|FZUS56.KPQR | nwpr1|O|Water Level Observation Network||8452660 - Newport, RI||41.505 N 71.327 W (41°30'18" N 71°19'36" W)|E| |For area forecasts and warnings, select: Boston WFO nwst2|K|Shorebased Tower||098: NWS Weather Station 1; Gulf of Mexico||27.750 N 96.768 W (27°45'0" N 96°46'6" W)|C|FZUS54.KCRP | nwwh1|O|Water Level Observation Network||1611400 - Nawiliwili, HI||21.953 N 159.355 W (21°57'11" N 159°21'18" W)|H| | obgn6|O|Water Quality Station||8311030 - Ogdensburg, NY||44.703 N 75.495 W (44°42'11" N 75°29'42" W)|E| | obla1|O|Water Level Observation Network||8737048 - Mobile State Docks, AL||30.708 N 88.043 W (30°42'29" N 88°2'35" W)|C| | ocgn4|J|Shorebased Tower||Ocean Grove, NJ||40.209 N 74.004 W (40°12'32" N 74°0'14" W)|E| | ocim2|O|Water Level Observation Network||8570283 - Ocean City Inlet, MD||38.328 N 75.092 W (38°19'41" N 75°5'31" W)|E| | ocpn7|CR|||OCP1 - Ocean Crest Pier, NC||33.908 N 78.148 W (33°54'29" N 78°8'53" W)|E| |


 

ofpn6|I|Long Island Ferry||Old Field Island, NY||40.973 N 73.083 W (40°58'23" N 73°4'59" W)|E|FZUS51.KOKX | ohbc1|O|Water Level Observation Network||9410660 - Los Angeles, CA||33.720 N 118.272 W (33°43'12" N 118°16'18" W)|P|FZUS56.KLOX | oksi2|CH|C-MAN Station||Oak ST, Chicago, IL (CPD)||41.912 N 87.624 W (41°54'44" N 87°37'25" W)|C| | okxc1|O|||9414776 - Oakland (Berth 34), CA||37.811 N 122.333 W (37°48'38" N 122°19'59" W)|| | olcn6|EA|GLOS Weather Station||Olcott Harbor, NY||43.341 N 78.719 W (43°20'26" N 78°43'10" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS
olsa2|O|Water Level Observation Network||9462450 - Nokolski, AK||52.941 N 168.871 W (52°56'26" N 168°52'17" W)|A| | omhc1|O|C-MAN Station||9414769 - Oakland Middle Harbor Met, CA||37.800 N 122.330 W (37°48'0" N 122°19'48" W)|P| | oouh1|O|Water Level Observation Network||1612340 - Honolulu, HI||21.307 N 157.867 W (21°18'24" N 157°52'0" W)|H|FZHW50.PHFO | optf1|O|Water Level Observation Network||8726607 - Old Port Tampa, FL||27.858 N 82.553 W (27°51'29" N 82°33'11" W)|E| |For area forecasts and warnings, select: Tampa Bay WFO orin7|O|Water Level Observation Network||8652587 - Oregon Inlet Marina, NC||35.795 N 75.548 W (35°47'42" N 75°32'54" W)|E|FZUS52.KMHX |
  osgn6|O|Water Level Observation Network||9052030 - Oswego, NY||43.463 N 76.512 W (43°27'48" N 76°30'42" W)|E|FZUS51.KBUF | ostf1|N|Test station||Stennis Test Facility|ARES 4.4 payload|30.357 N 89.612 W (30°21'24" N 89°36'45" W)|C| |Data from this site is provided for internal use only. This is NOT an operational weather station. otnm4|CE|GLOS Weather Station||Ontonagon, MI||46.874 N 89.329 W (46°52'25" N 89°19'45" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS ovia2|O|Water Level Observation Network||9455500 - Seldovia, AK||59.440 N 151.720 W (59°26'24" N 151°43'12" W)|A| | owqo1|NR|NERRS Water Quality Station||Lower Estuary, Old Woman Creek Reserve, OH||41.382 N 82.514 W (41°22'55" N 82°30'51" W)|E| | owxo1|NR|NERRS Weather Station||Old Woman Creek, OH||41.378 N 82.508 W (41°22'40" N 82°30'29" W)|E| |Water Quality data for this Reserve are available at....
OWQO1 -- OL pacf1|O|Water Level Observation Network||8729108 - Panama City, FL||30.152 N 85.667 W (30°9'7" N 85°40'1" W)|C| | pact2|K|Shorebased Tower||8775792 - Packery Channel, TX||27.633 N 97.237 W (27°37'59" N 97°14'13" W)|C| | pbfw1|NR|NERRS Weather Station||Padilla Bay Reserve, WA||48.464 N 122.468 W (48°27'51" N 122°28'5" W)|P| |

Water Quality data for this Reserve are available at....
PBLW1 -- Joe Leary Slough

BVQW1 -- Bayview Channel

pblw1|NR|NERRS Water Quality Station||Joe Leary Slough, Padilla Bay Reserve, WA||48.556 N 122.530 W (48°33'23" N 122°31'47" W)|P| | pbpa2|AK|Weather Station||Point Bishop, AK||58.203 N 134.148 W (58°12'9" N 134°8'52" W)|A| |For area forecasts and warnings, select: Juneau WFO pcbf1|O|Water Level Observation Network||8729210 - Panama City Beach, FL||30.213 N 85.880 W (30°12'48" N 85°52'48" W)|E|FZUS52.KTAE | pcgt2|K|Weather Station||8779748 - South Padre Island CGS, TX ||26.077 N 97.177 W (26°4'36" N 97°10'36" W)|C| | pclf1|O|Water Level Observation Network||8729840 - Pensacola, FL||30.403 N 87.212 W (30°24'12" N 87°12'42" W)|C|FZUS54.KMOB | pclm4|CE|GLOS Weather Station||Portage Canal, MI||47.276 N 88.528 W (47°16'32" N 88°31'40" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS pcnt2|K|Shorebased Tower||8773701 - Matagorda Bay; Port O'Connor, TX||28.452 N 96.388 W (28°27'6" N 96°23'18" W)|C| | pcoc1|O|Water Level Observation Network||9415144 - Port Chicago, CA||38.057 N 122.038 W (38°3'24" N 122°2'18" W)|P|FZUS56.KMTR | pgbp7|O|Water Level Observation Network||1631428 - Pago Bay, Guam||13.428 N 144.797 E (13°25'41" N 144°47'49" E)|| | phbp1|O|Water Level Observation Network||8545240 - Philadelphia, PA||39.933 N 75.142 W (39°56'0" N 75°8'30" W)|E|FZUS51.KPHI | pila2|N|C-MAN Station||Pilot Rock, AK|MARS payload|59.742 N 149.470 W (59°44'30" N 149°28'12" W)|A|FZAK58.PAVW FZAK51.PAFC|

pill1|O|Water Level Observation Network||8760721 - Pilot Town, LA||29.178 N 89.258 W (29°10'42" N 89°15'30" W)|C| | pilm4|N|C-MAN Station||Passage Island, MI|MARS payload|48.223 N 88.367 W (48°13'24" N 88°22'0" W)|E| | For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS

pkyf1|NP|Water Quality Station||Peterson Key, FL||24.917 N 80.746 W (24°55'0" N 80°44'46" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. plsf1|N|C-MAN Station||Pulaski Shoals Light, FL|ARES payload|24.693 N 82.773 W (24°41'36" N 82°46'23" W)|E|FZUS52.KKEY |Station PLSF1 stopped transmitting on 07/10/2012. This station will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in themaintenance report.
Replacement for the failed Dry Tortugas station DRYF1.

plsp4|PN|Water Level Observation Network||9758053 - Penuelas, PR||17.973 N 66.762 W (17°58'23" N 66°45'43" W)|A| | plxa2|O|Water Level Observation Network||9451054 - Port Alexander, AK||56.247 N 134.647 W (56°14'48" N 134°38'48" W)|A| | pmaf1|O|Water Level Observation Network||8726384 - Port Manatee, FL||27.637 N 82.563 W (27°38'13" N 82°33'47" W)|E| |For area forecasts and warnings, select: Tampa Bay WFO pngw3|CE|GLOS Weather Station||Port Wing, WI||46.792 N 91.386 W (46°47'32" N 91°23'10" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS pnlm4|O|Water Level Observation Network||9087096 - Port Inland, MI||45.970 N 85.871 W (45°58'12" N 85°52'16" W)|E|FZUS53.KAPX | pnlm6|O|Water Level Observation Network||8741533 - Pascagoula NOAA Lab, MS||30.358 N 88.567 W (30°21'29" N 88°34'1" W)|C| | poro3|O|Water Level Observation Network||9431647 - Port Orford, OR||42.740 N 124.497 W (42°44'24" N 124°29'48" W)|P|FZUS56.KMFR | port2|K|Shorebased Tower||8770475 - Port Arthur, TX||29.867 N 93.930 W (29°52'1" N 93°55'48" W)|C| | pota2|N|C-MAN Station||Potato Point, AK|Sutron XPERT payload|61.060 N 146.700 W (61°3'36" N 146°42'0" W)|A|FZAK58.PAVW FZAK51.PAFC| ppta1|DI|Water Quality Station||Perdido Pass, AL||30.279 N 87.556 W (30°16'45" N 87°33'22" W)|C| | pptm2|O|Water Level Observation Network||8578240 - Piney Point, MD||38.133 N 76.533 W (38°7'59" N 76°31'59" W)|E| |For area forecasts and warnings, select: Baltimore-Washington WFO ppxc1|O|||9414847 - Richmond (Point Potrero), CA||37.906 N 122.365 W (37°54'20" N 122°21'54" W)|| | prda2|O|Water Level Observation Network||9497645 - Prudhoe Bay, AK||70.400 N 148.527 W (70°24'0" N 148°31'36" W)|A|FZAK51.PAFC | prim4|CE|GLOS Weather Station||Presque Isle Light, MI||45.356 N 83.492 W (45°21'22" N 83°29'31" W)|E| | prta2|AK|Weather Station||Point Retreat, AK||58.412 N 134.953 W (58°24'42" N 134°57'11" W)|A| |For area forecasts and warnings, select: Juneau WFO prto3|CM|Water Quality Station||SATURN River Station #06 at Portland||45.519 N 122.667 W (45°31'7" N 122°40'0" W)|P| | pryc1|O|Water Level Observation Network||9415020 - Point Reyes, CA||37.997 N 122.975 W (37°59'48" N 122°58'30" W)|P|FZUS56.KMTR | psbc1|O|||9415115 - Pittsburg (Suisun Bay), CA||38.042 N 121.887 W (38°2'30" N 121°53'12" W)|| | psbm1|O|Water Level Observation Network||8410140 - Eastport, ME||44.903 N 66.985 W (44°54'12" N 66°59'6" W)|E|FZUS51.KCAR |Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike  pscm4|CE|GLOS Weather Station||Port Sanilac, MI||43.422 N 82.536 W (43°25'21" N 82°32'9" W)|E| | pslc1|O|Water Level Observation Network||9412110 - Port San Luis, CA||35.177 N 120.760 W (35°10'36" N 120°45'36" W)|P|FZUS56.KMTR | pstl1|O|Water Level Observation Network||8760922 - Pilot's Station East, SW Pass, LA||28.932 N 89.407 W (28°55'55" N 89°24'25" W)|C| |For area forecasts and warnings, select: Slidell WFO pstn6|O|Water Level Observation Network||9063028 - Sturgeon Point, NY||42.691 N 79.047 W (42°41'29" N 79°2'50" W)|E| | ptac1|N|C-MAN Station||Point Arena, CA|MARS payload|38.955 N 123.740 W (38°57'18" N 123°44'24" W)|P|FZUS56.KMTR |
  ptat2|N|C-MAN Station||Port Aransas, TX|MARS payload|27.828 N 97.050 W (27°49'42" N 97°3'0" W)|C|FZUS54.KCRP |
ptaw1|O|Water Level Observation Network||9444090 - Port Angeles, WA||48.125 N 123.440 W (48°7'30" N 123°26'24" W)|P|FZUS56.KSEW | ptbm6|O|Water Level Observation Network||8741003 - Petit Bois Island, MS||30.213 N 88.500 W (30°12'47" N 88°30'0" W)|C| | ptcr1|O|Water Level Observation Network||8452951 - Potter Cove, Prudence Island, RI||41.637 N 71.339 W (41°38'14" N 71°20'21" W)|E| |For area forecasts and warnings, select: Boston WFO ptgc1|N|C-MAN Station||Point Arguello, CA|MARS payload|34.577 N 120.648 W (34°34'36" N 120°38'54" W)|P|FZUS56.KLOX |
ptim4|O|Water Level Observation Network||9099004 - Point Iroquois, MI||46.485 N 84.632 W (46°29'6" N 84°37'54" W)|E|FZUS53.KAPX | ptit2|O|Water Level Observation Network||8779770 - Port Isabel, TX||26.060 N 97.215 W (26°3'36" N 97°12'54" W)|C|FZUS54.KBRO | ptjn6|I|Long Island Ferry||Port Jefferson, NY||40.948 N 73.070 W (40°56'52" N 73°4'12" W)|E|FZUS51.KOKX | ptrf1|P|Shorebased Tower||PAS -Port Richey, FL||28.285 N 82.733 W (28°17'6" N 82°43'57" W)|E|FZUS52.KTBW | ptww1|O|Water Level Observation Network||9444900 - Port Townsend, WA||48.112 N 122.758 W (48°6'42" N 122°45'30" W)|P|FZUS56.KSEW | pvgf1|IC|Fixed Structure Weather Station||Port Everglades Channel, FL||26.092 N 80.109 W (26°5'33" N 80°6'32" W)|E| | pwaw3|CE|GLOS Weather Station||Port Washington, WI||43.388 N 87.868 W (43°23'15" N 87°52'4" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS pxoc1|O|||9414311 - San Francisco (Pier 1), CA||37.798 N 122.393 W (37°47'52" N 122°23'34" W)|P| | qptr1|O|Water Level Observation Network||8454049 - Quonset Point, RI||41.585 N 71.408 W (41°35'6" N 71°24'30" W)|E| |For area forecasts and warnings, select: Boston WFO rarm6|O|Water Level Observation Network||8741094 - Range A rear, Pascagoula, MS||30.343 N 88.512 W (30°20'35" N 88°30'43" W)|C| | rckm4|O|Water Level Observation Network||9076024 - Rock Cut, MI||46.265 N 84.192 W (46°15'54" N 84°11'30" W)|E|FZUS53.KAPX | rcmc1|O|Water Level Observation Network||9414863 - Richmond, CA||37.928 N 122.400 W (37°55'42" N 122°24'0" W)|P|FZUS56.KMTR | rcpt2|O|Water Level Observation Network||8774770 - Rockport, TX||28.022 N 97.047 W (28°1'19" N 97°2'49" W)|C| | rcrn6|O|Water Level Observation Network||9052058 - Rochester, NY||43.268 N 77.625 W (43°16'6" N 77°37'30" W)|E| | rdda2|O|Water Level Observation Network||9491094 - Red Dog Dock, AK||67.577 N 164.065 W (67°34'37" N 164°3'54" W)|A| |For area forecasts and warnings, select: Alaska Marine Forecasts rdyd1|O|Water Level Observation Network||8551910 - Reedy Point, DE||39.558 N 75.573 W (39°33'30" N 75°34'24" W)|E|FZUS51.KPHI | rkqf1|NR|NERRS Water Quality Station||Lower Henderson, Rockery Bay Reserve, FL||26.026 N 81.733 W (26°1'33" N 81°44'0" W)|E| | rkxf1|NR|NERRS Weather Station||Rookery Bay Reserve, FL||26.050 N 81.701 W (26°2'59" N 81°42'4" W)|E| |Water Quality data for this Reserve are available at....
RKQF1 -- Lower Henderson
rlot2|K|Shorebased Tower||8770971 - Rollover Pass, TX||29.515 N 94.513 W (29°30'54" N 94°30'48" W)|C| | roam4|N|C-MAN Station||Rock of Ages, MI|MARS payload|47.867 N 89.313 W (47°52'0" N 89°18'48" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS robn4|O|Water Level Observation Network||8530973 - Robins Reef, NJ||40.657 N 74.065 W (40°39'25" N 74°3'53" W)|E| | rplv2|O|Water Level Observation Network||8632837 - Rappahannock Light, VA||37.538 N 76.015 W (37°32'18" N 76°0'54" W)|E|FZUS51.KAKQ | rprn6|EA|GLOS Weather Station||Rochester, NY||43.258 N 77.592 W (43°15'27" N 77°35'32" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS rsjt2|K|Shorebased Tower||8777812 - Rincon del San Jose; Potrero Lopeno SW, TX||26.801 N 97.483 W (26°48'4" N 97°28'59" W)|C| | rtat2|K|Shorebased Tower||8775237 - Port Aransas, TX||27.840 N 97.073 W (27°50'23" N 97°4'22" W)|C| | rtot2|K|Offshore Tower||100: RTNS Offshore, TX||27.753 N 96.967 W (27°45'9" N 96°58'2" W)|C|FZUS54.KCRP | rtyc1|O|Water Level Observation Network||9414523 - Redwood City, CA||37.507 N 122.210 W (37°30'24" N 122°12'36" W)|P|FZUS56.KMTR | sacv4|EM|Weather Station||Sacrifice Island, Mexico|Sutron XPERT payload|19.174 N 96.093 W (19°10'27" N 96°5'34" W)|C| | sanf1|N|C-MAN Station||Sand Key, FL|MARS payload|24.454 N 81.877 W (24°27'14" N 81°52'39" W)|E|FZUS52.KKEY |Station SANF1 is transmitting intermittent data. This station will be fully restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report. sapf1|O|Water Level Observation Network||8726520 - St. Petersburg, FL||27.760 N 82.627 W (27°45'36" N 82°37'36" W)|E|FZUS52.KTBW | saqg1|NR|NERRS Water Quality Station||Lower Duplin, Sapelo Island Reserve, GA||31.418 N 81.296 W (31°25'4" N 81°17'46" W)|E| | sauf1|N|C-MAN Station||St. Augustine, FL|MARS payload|29.857 N 81.265 W (29°51'24" N 81°15'54" W)|E|FZUS52.KJAX |Station SAUF1 stopped transmitting on 06/12/2012. This station will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report. saxg1|NR|NERRS Weather Station||Sapelo Island Reserve, GA||31.418 N 81.295 W (31°25'4" N 81°17'43" W)|E| |Water Quality data for this Reserve are available at....
SAQG1 -- Lower Duplin sbeo3|O|Water Level Observation Network||9435380 - South Beach, OR||44.625 N 124.043 W (44°37'30" N 124°2'36" W)|P|FZUS56.KPQR | sbio1|N|C-MAN Station||South Bass Island, OH|MARS payload|41.628 N 82.842 W (41°37'42" N 82°50'30" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS
sblf1|O|Water Level Observation Network||8726673 - Seabulk, Tampa, FL||27.923 N 82.445 W (27°55'23" N 82°26'42" W)|E| | sblm4|CE|GLOS Weather Station||Saginaw Bay Light #1, MI||43.806 N 83.719 W (43°48'21" N 83°43'8" W)|E| | sbpt2|O|Water Level Observation Network||8770570 - Sabine Pass North, TX||29.730 N 93.870 W (29°43'48" N 93°52'12" W)|C|FZUS54.KLCH | scis1|O|Water Level Observation Network||8664941 - South Capers Island, SC||32.857 N 79.707 W (32°51'24" N 79°42'24" W)|E| |For area forecasts and warnings, select: Charleston WFO


  scld1|NR|NERRS Water Quality Station||Scotton Landing, Delaware Reserve, DE||39.085 N 75.461 W (39°5'6" N 75°27'38" W)|E| | scqc1|NR|NERRS Water Quality Station||China Camp, San Francisco Bay Reserve, CA||38.001 N 122.460 W (38°0'5" N 122°27'37" W)|P| | scsn6|I|Long Island Ferry||South Central Sound, NY||41.024 N 73.108 W (41°1'25" N 73°6'29" W)|E|FZUS51.KOKX | sdbc1|O|Water Level Observation Network||9410170 - San Diego, CA||32.713 N 117.173 W (32°42'48" N 117°10'24" W)|P|FZUS56.KSGX | sdhn4|O|Water Level Observation Network||8531680 - Sandy Hook, NJ||40.467 N 74.010 W (40°28'0" N 74°0'36" W)|E|FZUS51.KPHI |


 

sdia2|AK|Weather Station||South Douglas, AK||58.277 N 134.389 W (58°16'38" N 134°23'21" W)|A| |For area forecasts and warnings, select: Juneau WFO sdrt2|K|Shorebased Tower||8773037 - Seadrift, TX||28.407 N 96.712 W (28°24'26" N 96°42'44" W)|C| | secg1|H|C-MAN Station||U.S. Navy Tower R4 GA||30.800 N 80.316 W (30°48'0" N 80°18'58" W)|E|FZUS52.KJAX FZNT23.KNHC|
  sefo3|CM|Water Quality Station||SATURN Estuary Station #04 at Mott Basin||46.204 N 123.759 W (46°12'13" N 123°45'31" W)|P| | seqa2|NR|NERRS Water Quality Station||Katchemak Bay near Seldovia, AK||59.441 N 151.719 W (59°26'28" N 151°43'7" W)|A| | seto3|CM|Water Quality Station||SATURN Estuary Station #03||46.200 N 123.940 W (46°11'59" N 123°56'24" W)|P| | sfxc1|NR|NERRS Weather Station||San Francisco Bay Reserve, CA||38.223 N 122.026 W (38°13'21" N 122°1'32" W)|P| |Water Quality data for this Reserve are available at....
SCQC1 -- China Camp
sgnw3|N|C-MAN Station||Sheboygan, WI|Sutron XPERT payload|43.750 N 87.692 W (43°45'0" N 87°41'30" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS sgof1|N|C-MAN Station||Tyndall AFB Tower C (N4), FL|MARS payload|29.407 N 84.863 W (29°24'24" N 84°51'48" W)|E|FZUS52.KTAE |Station SGOF1 is transmitting intermittently since 06/30/2012. This C-Man will be restored to service when it can be worked into the schedule.  When the service date is known, it will be posted in the maintenance report. sgrn4|J|Shorebased Tower||Sea Girt, NJ||40.120 N 74.030 W (40°7'12" N 74°1'48" W)|E|FZUS51.KOKX |


 

shbl1|O|Water Level Observation Network||8761305 - Shell Beach, LA||29.868 N 89.673 W (29°52'5" N 89°40'23" W)|C| | shpf1|P|Shorebased Tower||SHP - Shell Point, FL||30.060 N 84.291 W (30°3'36" N 84°17'26" W)|E|FZUS52.KTAE | sipm6|Z|Shorebased Tower||Ship Island Pass, MS / CSI13||30.267 N 89.017 W (30°16'0" N 89°1'0" W)|C|FZUS54.KLIX | sisa2|AK|Weather Station||Sisters Island, AK||58.171 N 135.256 W (58°10'15" N 135°15'23" W)|A| |For area forecasts and warnings, select: Juneau WFO sisw1|N|C-MAN Station||Smith Island, WA|MARS payload|48.318 N 122.843 W (48°19'6" N 122°50'36" W)|P|FZUS56.KSEW |
  sjlf1|N|C-MAN Station||St. John's Light||30.400 N 81.400 W (30°24'0" N 81°24'0" W)|E| | sjnp4|O|Water Level Observation Network||9755371 - San Juan, PR||18.462 N 66.117 W (18°27'42" N 66°7'0" W)|N|FZCA52.TJSJ | sjom4|CE|GLOS Weather Station||St. Joseph, MI||42.099 N 86.494 W (42°5'56" N 86°29'39" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS sjsn4|O|Water Level Observation Network||8537121 - Ship John Shoal, NJ||39.305 N 75.375 W (39°18'17" N 75°22'30" W)|E| |For area forecasts and warnings, select: Philadelphia WFO skmg1|S|C-MAN Station||U.S. Navy Tower M2R6 GA||31.534 N 80.236 W (31°32'1" N 80°14'9" W)|E|FZUS52.KCHS |
  skta2|O|Water Level Observation Network||9452400 - Skagway, AK||59.450 N 135.327 W (59°27'0" N 135°19'36" W)|A| | slim2|O|Water Level Observation Network||8577330 - Solomons Island, MD||38.317 N 76.450 W (38°19'0" N 76°27'0" W)|E|FZUS51.KLWX | slpl1|Z|Shorebased Tower||Salt Point, LA / CSI14||29.517 N 91.550 W (29°31'0" N 91°33'0" W)|C|FZUS54.KLCH | slvm5|CE|GLOS Weather Station||Silver Bay, MN||47.269 N 91.252 W (47°16'8" N 91°15'6" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS smbs1|NS|Coastal Marine Station||Springmaid pier, SC||33.655 N 78.918 W (33°39'18" N 78°55'6" W)|E| |This station is co-located with the NOS station MROS1.
smkf1|N|C-MAN Station||Sombrero Key, FL|MARS payload|24.628 N 81.111 W (24°37'39" N 81°6'40" W)|E|FZUS52.KKEY | smoc1|O|Water Level Observation Network||9410840 - Santa Monica, CA||34.008 N 118.500 W (34°0'30" N 118°30'0" W)|P|FZUS56.KLOX |As of 1800 UTC, January 22, 2010; observations for this location will be under Station ID ICAC1. snda2|O|Water Level Observation Network||9459450 - Sand Point, AK||55.337 N 160.502 W (55°20'12" N 160°30'6" W)|A| | sndp5|O|Water Level Observation Network||1619910 - Sand Island, Midway Islands||28.212 N 177.360 W (28°12'42" N 177°21'36" W)|?| | snsn7|A|Weather Station||8659897 - Sunset Beach, NC||33.865 N 78.507 W (33°51'54" N 78°30'24" W)|E|FZUS52.KILM |
  soqo3|NR|NERRS Water Quality Station||Valino Island, South Slough Reserve, OR||43.317 N 124.322 W (43°19'2" N 124°19'18" W)|P| |

Water Quality data for this Reserve are available at...

CHQO3 -- Winchester Arm

sosn6|I|Long Island Ferry||Southern Open Sound, NY||40.998 N 73.095 W (40°59'54" N 73°5'42" W)|E|FZUS51.KOKX | spag1|S|C-MAN Station||U.S. Navy Tower R2 GA||31.375 N 80.567 W (31°22'30" N 80°34'1" W)|E|FZUS52.KCHS |
  spgf1|N|C-MAN Station||Settlement Point, GBI|MARS payload|26.704 N 78.994 W (26°42'16" N 78°59'40" W)|E|FZUS52.KMFL | spll1|Z|Shorebased Tower||South Timbalier Block 52, LA / CSI06||28.867 N 90.483 W (28°52'0" N 90°29'0" W)|C|FZUS54.KLIX | sptm4|CE|GLOS Weather Station||Sturgeon Point Light, MI||44.713 N 83.273 W (44°42'47" N 83°16'23" W)|E| | srbv3|IC|Fixed Structure Weather Station||Salt River Bay, St. Croix, U.S. Virgin Islands||17.784 N 64.762 W (17°47'2" N 64°45'42" W)|N| | srfw1|CM|Water Quality Station||SATURN River Station #05||46.184 N 123.188 W (46°11'4" N 123°11'15" W)|P| | srst2|N|C-MAN Station||Sabine Pass, TX|MARS payload|29.683 N 94.033 W (29°41'0" N 94°2'0" W)|C|FZUS54.KLCH FZUS54.KHGX| ssbn7|CR|||Sunset Beach Nearshore Waves||33.842 N 78.476 W (33°50'31" N 78°28'34" W)|E| |Right whales are active off NC. Speed restrictions of 10 knots apply to vessels 65 feet or greater within the vicinity of this station. To learn more about right whales and rules protecting them, go to: http://www.nmfs.noaa.gov/pr/shipstrike/ stdm4|N|C-MAN Station||Stannard Rock, MI|Sutron XPERT payload|47.183 N 87.225 W (47°11'0" N 87°13'30" W)|E| |

For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS

supn6|N|C-MAN Station||Superior Shoals, NY|VEEP payload|44.467 N 75.800 W (44°28'0" N 75°48'0" W)|E|FZUS61.KBUF |This station has been disestablished as of 11/16/09. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed. svls1|N|C-MAN Station||Savannah Light, GA|DACT payload|31.950 N 80.680 W (31°57'0" N 80°40'48" W)|E| |Savannah Light was destroyed by a collision with the 800-foot container ship Neptune Jade on the evening of November 27, 1996. svnm4|G|C-MAN Station||South Haven, MI||42.401 N 86.289 W (42°24'5" N 86°17'20" W)|E|FZUS53.KGRR | swla2|O|Water Level Observation Network||9455090- Seward, AK||60.120 N 149.427 W (60°7'12" N 149°25'36" W)|A| | swpm4|O|Water Level Observation Network||9076070 - S.W. Pier, MI||46.502 N 84.373 W (46°30'6" N 84°22'24" W)|E|FZUS53.KAPX | swpv2|O|Water Level Observation Network||8638610 - Sewells Point, VA||36.947 N 76.330 W (36°56'48" N 76°19'48" W)|E|FZUS51.KAKQ | sxhw3|CE|GLOS Weather Station||Saxon Harbor, WI||46.563 N 90.440 W (46°33'45" N 90°26'24" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS syww3|CE|Weather Station||Yacht Works Sister Bay WI||45.202 N 87.121 W (45°12'8" N 87°7'15" W)|C|FZUS53.KGRB |NOTE: WINDS FREQUENTLY DROP TO ZERO DUE TO WINTER FREEZING. taml1|L|Shorebased Tower||Tambour Bay, LA||29.188 N 90.665 W (29°11'15" N 90°39'55" W)|C|FZUS54.KLIX | tano3|CM|Water Quality Station||Tansy Point, OR||46.189 N 123.919 W (46°11'20" N 123°55'10" W)|P| | taqt2|K|Weather Station||8775296 - Texas State Aquarium, TX||27.812 N 97.390 W (27°48'42" N 97°23'24" W)|C| | tarf1|P|Shorebased Tower||TAS - Tarpon Springs, FL||28.156 N 82.758 W (28°9'20" N 82°45'29" W)|E|FZUS52.KTBW | tawm4|CE|GLOS Weather Station||Tawas City, MI||44.256 N 83.443 W (44°15'22" N 83°26'35" W)|E| | tcbm2|O|Water Level Observation Network||8573364 - Tolchester Beach, MD||39.213 N 76.245 W (39°12'48" N 76°14'42" W)|E|FZUS51.KLWX | tcmw1|O|Water Level Observation Network||9446482 - Tacoma Met, WA||47.276 N 122.418 W (47°16'34" N 122°25'5" W)|P| | tcnw1|O|Water Level Observation Network||9446484 - Tacoma, WA||47.267 N 122.413 W (47°16'0" N 122°24'48" W)|P|FZUS56.KSEW | tcvf1|NP|Water Quality Station||Trout Cove, FL||25.209 N 80.533 W (25°12'34" N 80°32'0" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. tdpc1|HU|CICORE water quality station||Trinidad Pier Trinidad, CA||41.055 N 124.147 W (41°3'19" N 124°8'50" W)|P| | tesl1|O|C-MAN Station||Tesoro Marine Terminal - 8764044 - Berwick, LA||29.667 N 91.237 W (29°40'0" N 91°14'12" W)|C| | tfblk|IM|Buoy||10.0 nm WNW on Blakknes, Iceland||65.698 N 24.778 W (65°41'52" N 24°46'41" W)|?| | thin6|N|C-MAN Station||Thousand I. Brdg., NY|MARS payload|44.300 N 75.983 W (44°18'0" N 75°59'0" W)|E|FZUS61.KBUF |This station has been disestablished as of 9/17/09. The station is a non-NWS funded station for which the operating agreement between the NWS and the Program Sponsor has expired and will not be renewed. thlo1|G|C-MAN Station||Toledo Light No. 2 OH||41.826 N 83.194 W (41°49'32" N 83°11'37" W)|E|FZUS61.KCLE | thro1|O|Water Level Observation Network||9063085 - Toledo, OH||41.693 N 83.472 W (41°41'36" N 83°28'18" W)|E|FZUS51.KCLE | tibc1|SF|Environmental Monitoring Station||Tiburon Pier, San Francisco Bay, CA||37.891 N 122.447 W (37°53'29" N 122°26'48" W)|P| |For area forecasts and warnings, select: San Francisco/Monterey WFO tiqc1|NR|NERRS Water Quality Station||Oneonta Slough, Tijuana River Reserve, CA||32.568 N 117.131 W (32°34'5" N 117°7'52" W)|P| | tixc1|NR|NERRS Weather Station||Tijuana River Reserve, CA||32.574 N 117.127 W (32°34'28" N 117°7'37" W)|P| |Water Quality data for this Reserve are available at....
TIQC1 -- Oneonta Slough
tkea2|MA|Fixed Structure Weather Station||Tenakee Springs, AK||57.779 N 135.219 W (57°46'45" N 135°13'9" W)|A| | tlbo3|O|Water Level Observation Network||9437540 - Garibaldi, Tillamook Bay, OR||45.555 N 123.912 W (45°33'18" N 123°54'43" W)|P| |For area forecasts and warnings, select: Portland WFO tnso3|CM|Water Quality Station||Tenasillahe Island USFW Dock, OR||46.238 N 123.468 W (46°14'15" N 123°28'6" W)|P| | tokw1|O|Water Level Observation Network||9440910 - Toke Point, WA||46.708 N 123.965 W (46°42'30" N 123°57'54" W)|P|FZUS56.KPQR | tpaf1|O|Water Level Observation Network||8726694 - TPA Cruise Terminal 2, Tampa, FL||27.933 N 82.433 W (27°55'59" N 82°25'59" W)|E| | tpbn4|O|Water Level Observation Network||8538886 - Tacony-Palmyra Bridge, NJ||40.012 N 75.042 W (40°0'42" N 75°2'30" W)|E| | tpef1|NP|Water Quality Station||Tarpon Bay East, FL||25.408 N 80.964 W (25°24'30" N 80°57'52" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. tplm2|N|C-MAN Station||Thomas Point, MD|MARS payload|38.898 N 76.437 W (38°53'54" N 76°26'12" W)|E|FZUS51.KLWX | trbl1|L|Shorebased Tower||Terrebonne Bay, LA||29.167 N 90.583 W (29°10'0" N 90°35'0" W)|C|FZUS54.KLIX | trdf1|O|Water Level Observation Network||8721604 - Trident Pier, FL||28.415 N 80.593 W (28°24'54" N 80°35'36" W)|E|FZUS52.KMLB |
  trrf1|NP|Water Quality Station||Taylor River, FL||25.223 N 80.653 W (25°13'23" N 80°39'11" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. tshf1|O|Water Level Observation Network||8726667 - East Bay Causeway, FL||27.928 N 82.425 W (27°55'42" N 82°25'30" W)|E| | ttiw1|N|C-MAN Station||Tatoosh Island, WA|DACT payload|48.392 N 124.735 W (48°23'30" N 124°44'6" W)|P|FZUS56.KSEW | txpt2|O|Water Level Observation Network||Texas Point, TX - 8770822||29.689 N 93.842 W (29°41'21" N 93°50'31" W)|C| | tybg1|S|C-MAN Station||U.S. Navy Tower R8 GA||31.633 N 79.925 W (31°37'59" N 79°55'29" W)|E|FZUS52.KCHS |
  ulam6|O|Water Level Observation Network||8741041 - Dock E. Port of Pascagoula, MS||30.348 N 88.505 W (30°20'53" N 88°30'18" W)|C| | unla2|O|Water Level Observation Network||9462620- Unalaska, AK||53.879 N 166.540 W (53°52'45" N 166°32'25" W)|A| | vakf1|O|Water Level Observation Network||8723214 - Virginia Key, FL||25.732 N 80.162 W (25°43'54" N 80°9'42" W)|E|FZUS52.KMFL | vcaf1|O|Water Level Observation Network||8723970 - Vaca Key, FL||24.712 N 81.105 W (24°42'42" N 81°6'18" W)|E|FZUS52.KKEY | vcat2|K|||8773259 - Port Lavaca, TX ||28.640 N 96.595 W (28°38'24" N 96°35'42" W)|C| | vdza2|O|Water Level Observation Network||9454240 - Valdez, AK||61.125 N 146.362 W (61°7'30" N 146°21'42" W)|A| | venf1|N|C-MAN Station||Venice, FL|ARES payload|27.070 N 82.450 W (27°4'12" N 82°27'0" W)|E|FZUS52.KTBW | verv4|EM|Weather Station||Veracruz Harbor, Mexico|Sutron XPERT payload|19.202 N 96.113 W (19°12'6" N 96°6'46" W)|C| | vmsv2|VM|Marine Observation Station||VIMS Pier||37.246 N 76.500 W (37°14'45" N 76°30'0" W)|E| | vqsp4|PN|Water Level Observation Network||9752619 - Isabel Segunda, Vieques, PR||18.153 N 65.444 W (18°9'11" N 65°26'38" W)|N| | wahv2|O|Water Level Observation Network||8631044 - Wachapreague, VA||37.607 N 75.687 W (37°36'24" N 75°41'12" W)|E|FZUS51.KAKQ |


 

wakp8|O|Water Level Observation Network||1890000 - Wake Island||19.290 N 166.618 E (19°17'24" N 166°37'6" E)|?| | waqm3|NR|NERRS Water Quality Station||Menauhant, Waquoit Bay Reserve, MA||41.552 N 70.549 W (41°33'9" N 70°32'55" W)|E| | wasd2|O|Water Level Observation Network||8594900 - Washington, DC||38.870 N 77.020 W (38°52'12" N 77°1'12" W)|E|FZUS51.KLWX | wats1|EA|Weather Station||Lake Wateree, SC||34.335 N 80.702 W (34°20'7" N 80°42'8" W)|E| | wavm6|O|Water Level Observation Network||8747766 - Waveland, MS||30.282 N 89.367 W (30°16'54" N 89°22'0" W)|C|FZUS54.KLIX | waxm3|NR|NERRS Weather Station||Waquoit Bay Reserve, MA||41.582 N 70.525 W (41°34'54" N 70°31'30" W)|E| |

Water Quality data for this Reserve are available at....
WAQM3 -- Wacquoit Bay (Not operational)

wdel1|SH|Offshore Tower||Shell West Delta 143||28.662 N 89.551 W (28°39'43" N 89°33'4" W)|C| | wdsv2|O|Water Level Observation Network||8638614 - Willoughby Deguassing Station, VA||36.982 N 76.322 W (36°58'55" N 76°19'19" W)|E| | wdyo3|CM|Water Quality Station||Woody Island, OR||46.252 N 123.534 W (46°15'8" N 123°32'3" W)|P| | welm1|O|Water Level Observation Network||8419317 - Wells, ME||43.320 N 70.563 W (43°19'12" N 70°33'47" W)|E| |For area forecasts and warnings, select: Gray/Portland WFO

Caution: Right whales may be active in northeast waters year-round. NOAA may establish temporary Dynamic Management Areas (DMAs) to protect aggregations of right whales. Mariners are requested to transit DMAs at 10 knots or less when consistent with safe navigation. For information on currently active DMAs, go to: http://www.nmfs.noaa.gov/pr/shipstrike
weqm1|NR|NERRS Water Quality Station||Skinner Mill, Wells Reserve, ME||43.345 N 70.549 W (43°20'41" N 70°32'57" W)|E| | wexm1|NR|NERRS Weather Station||Wells Reserve, ME||43.338 N 70.550 W (43°20'15" N 70°33'0" W)|E| |Water Quality data for this Reserve are available at....
WEQM1 -- Skinner Mill
wfpm4|CE|GLOS Weather Station||Whitefish Point, MI||46.762 N 84.966 W (46°45'43" N 84°57'58" W)|E| | whoi2|WH|2.4-meter discus buoy||Woods Hole Wave Test Station #2||41.339 N 70.555 W (41°20'19" N 70°33'17" W)|E| | whri2|CE|GLOS Weather Station||Waukegan Harbor, IL||42.361 N 87.813 W (42°21'38" N 87°48'48" W)|C| |For Great Lakes marine forecasts, select: GREAT LAKES FORECASTS wiwf1|NP|Water Quality Station||Willy Willy, FL||25.619 N 81.044 W (25°37'8" N 81°2'39" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. wkqa1|NR|NERRS Water Quality Station||Fish River, Weeks Bay Reserve, AL||30.416 N 87.823 W (30°24'58" N 87°49'22" W)|C| | wkxa1|NR|NERRS Weather Station||Weeks Bay Reserve, AL||30.421 N 87.829 W (30°25'16" N 87°49'43" W)|C| |Water Quality data for this Reserve are available at....
WKQA1 -- Fish River
wndv2|O|Water Level Observation Network||8636580 - Windmill Point, VA||37.615 N 76.290 W (37°36'54" N 76°17'24" W)|E|FZUS51.KAKQ | wnem4|O|Water Level Observation Network||9076027 - West Neebish, MI||46.283 N 84.205 W (46°16'59" N 84°12'18" W)|E| | wplf1|NP|Water Quality Station||Watson Place, FL||25.708 N 81.248 W (25°42'28" N 81°14'53" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. wpow1|N|C-MAN Station||West Point, WA|MARS payload|47.662 N 122.436 W (47°39'44" N 122°26'9" W)|P|FZUS56.KSEW | wptw1|O|Water Level Observation Network||9441102 - Westport, WA||46.904 N 124.105 W (46°54'16" N 124°6'18" W)|P| | wrbf1|NP|Water Quality Station||Whipray Basin, FL||25.077 N 80.728 W (25°4'36" N 80°43'39" W)|E| |Water levels are referenced to local datums.  They provide relative change in water level and are not to be used for navigation. wwef1|NP|Water Quality Station||White Water -West, FL||25.230 N 80.939 W (25°13'47" N 80°56'19" W)|| | wycm6|O|Water Level Observation Network||8747437 - Bay Waveland Yacht Club, MS||30.326 N 89.326 W (30°19'34" N 89°19'34" W)|C| | yabp4|PN|Water Level Observation Network||9754228 - Yabucoa Harbor, PR||18.055 N 65.833 W (18°3'18" N 65°49'59" W)|N| | yata2|O|Water Level Observation Network||9453220- Yakutat, AK||59.548 N 139.733 W (59°32'55" N 139°44'0" W)|A| | ygnn6|EA|GLOS Weather Station||Niagara Coast Guard Station, NY||43.261 N 79.064 W (43°15'41" N 79°3'51" W)|E| |For Great Lakes marine forecasts, select: GREAT LAKES
FORECASTS

ykrv2|O|Water Level Observation Network||8637611 - York River East Rear Range Light, VA||37.250 N 76.333 W (37°15'0" N 76°19'59" W)|E| |For area forecasts and warnings, select: Wakefield WFO yktv2|O|Water Level Observation Network||8637689 - Yorktown, VA||37.227 N 76.478 W (37°13'36" N 76°28'42" W)|E|FZUS51.KAKQ | yrsv2|NR|NERRS Weather Station||Chesapeake Bay,VA||37.414 N 76.713 W (37°24'51" N 76°42'45" W)|E| |Water Quality data for this Reserve are available at....
CVQV2 -- Sweet Hall
GDWV2 -- Goodwin Island
zbqn7|NR|NERRS Water Quality Station||Zeke's Basin, North Carolina||33.955 N 77.935 W (33°57'17" N 77°56'6" W)|E| | fldigi-3.21.80/data/nsd_bbsss.txt0000664000175000017500000271757112313064025013520 0000000000000000;000;PABL;Buckland, Buckland Airport;AK;United States;4;65-58-56N;161-09-07W;;;7;; 01;001;ENJA;Jan Mayen;;Norway;6;70-56N;008-40W;70-56N;008-40W;10;9;P 01;002;----;Grahuken;;Norway;6;79-47N;014-28E;;;;15; 01;003;----;Hornsund;;Norway;6;77-00N;015-30E;;;10;12; 01;004;ENAS;Ny-Alesund Ii;;Norway;6;78-55N;011-56E;78-55N;011-56E;8;8; 01;006;----;Edgeoya;;Norway;6;78-14N;022-47E;;;;14; 01;007;----;Ny Alesund;;Norway;6;78-55N;011-56E;;;;12; 01;008;ENSB;Svalbard Lufthavn;;Norway;6;78-15N;015-28E;;;2;29;P 01;009;----;Phippsoya;;Norway;6;80-41N;020-52E;;;4;; 01;010;ENAN;Andoya;;Norway;6;69-18N;016-09E;69-18N;016-09E;1;14;P 01;011;----;Kvitoya;;Norway;6;80-06N;031-24E;80-06N;031-24E;16;16; 01;015;----;Hekkingen Fyr;;Norway;6;69-36N;017-50E;;;14;; 01;016;----;Senja-Grasmyrskogen;;Norway;6;69-17N;017-46E;;;50;; 01;023;ENDU;Bardufoss;;Norway;6;69-04N;018-32E;;;7;79;P 01;025;ENTC;Tromso / Langnes;;Norway;6;69-41N;018-55E;;;1;10;P 01;026;----;Tromso;;Norway;6;69-39N;018-56E;;;103;114; 01;028;ENBJ;Bjornoya;;Norway;6;74-31N;019-01E;74-31N;019-01E;16;16;P 01;033;----;Torsvag Fyr;;Norway;6;70-15N;019-30E;;;21;24; 01;034;----;Fugloykalven Fyr;;Norway;6;70-19N;020-09E;;;37;38; 01;035;----;Oteren;;Norway;6;69-15N;019-53E;;;12;; 01;041;----;Nodreisa-Oyeng;;Norway;6;69-44N;021-01E;;;5;; 01;043;----;Loppa;;Norway;6;70-20N;021-28E;;;10;11; 01;045;----;Nordstraum I Kvaenangen;;Norway;6;69-50N;021-53E;;;6;; 01;046;ENSR;Sorkjosen;;Norway;6;69-47N;020-58E;;;0;6; 01;047;ENKA;Kautokeino;;Norway;6;69-00N;023-02E;;;305;308; 01;049;ENAT;Alta Lufthavn;;Norway;6;69-59N;023-22E;;;0;3;P 01;051;----;Suolovuopmi;;Norway;6;69-35N;023-32E;;;374;; 01;052;ENHF;Hammerfest;;Norway;6;70-40N;023-40E;;;8;81; 01;055;----;Fruholmen Fyr;;Norway;6;71-06N;024-00E;;;13;14;P 01;057;----;Cuovddatmohkki;;Norway;6;69-22N;024-26E;;;286;; 01;059;ENNA;Banak;;Norway;6;70-04N;024-59E;;;0;8;P 01;062;ENHO;Hopen;;Norway;6;76-30N;025-04E;;;6;10;P 01;065;----;Karasjok;;Norway;6;69-28N;025-30E;;;129;133; 01;066;----;Helnes Fyr;;Norway;6;71-04N;026-14E;;;33;; 01;068;ENHV;Honningsvag / Valan;;Norway;6;71-01N;025-59E;;;1;14; 01;074;ENMH;Mehamn;;Norway;6;71-02N;027-50E;;;1;13; 01;075;----;Rustefjelbma;;Norway;6;70-24N;028-12E;;;9;11; 01;078;----;Sletnes Fyr;;Norway;6;71-05N;028-14E;;;8;10;P 01;083;ENBV;Berlevag;;Norway;6;70-52N;029-02E;;;1;13; 01;088;ENVD;Vadso;;Norway;6;70-04N;029-51E;;;3;39; 01;089;ENKR;Kirkenes Lufthavn;;Norway;6;69-44N;029-54E;;;9;91;P 01;092;----;Makkaur Fyr;;Norway;6;70-42N;030-05E;;;9;; 01;097;ENSS;Svartnes;;Norway;6;70-21N;031-03E;;;12;; 01;098;----;Vardo;;Norway;6;70-22N;031-06E;;;14;15;P 01;102;----;Sklinna Fyr;;Norway;6;65-12N;011-00E;;;23;16;P 01;103;----;Leka;;Norway;6;65-06N;011-42E;;;47;; 01;106;----;Rost Ii;;Norway;6;67-30N;012-05E;;;10;11;P 01;107;ENRS;Rost Flyplass;;Norway;6;67-31N;012-06E;;;4;; 01;108;----;Vega-Vallsjo;;Norway;6;65-42N;011-51E;;;2;9; 01;110;----;Ytterholmen Fyr;;Norway;6;66-00N;011-41E;;;33;33; 01;112;ENBN;Bronnoysund / Bronnoy;;Norway;6;65-28N;012-13E;;;0;9; 01;115;----;Myken;;Norway;6;66-45N;012-29E;;;17;13; 01;116;ENST;Sandnessjoen / Stokka;;Norway;6;65-58N;012-28E;;;1;17; 01;121;----;Nord-Solvaer;;Norway;6;66-24N;012-37E;;;10;; 01;122;ENMS;Mosjoen Kjaerstad;;Norway;6;65-48N;013-08E;;;70;; 01;134;----;Majavatn Iii;;Norway;6;65-11N;013-25E;;;339;339; 01;137;----;Stott;;Norway;6;66-56N;013-27E;;;12;; 01;138;----;Tennholmen Fyr;;Norway;6;67-18N;013-30E;;;14;; 01;141;ENLK;Leknes;;Norway;6;68-09N;013-37E;;;2;26; 01;147;----;Susendal-Bjormo;;Norway;6;65-31N;014-01E;;;265;; 01;149;----;Rana-Basmoen;;Norway;6;66-20N;014-06E;;;40;42; 01;151;ENRA;Mo I Rana / Rossvoll;;Norway;6;66-22N;014-18E;;;7;70; 01;152;ENBO;Bodo Vi;;Norway;6;67-16N;014-22E;67-15N;014-24E;1;13;P 01;154;----;Litloy Fyr;;Norway;6;68-35N;014-18E;;;30;; 01;155;----;Bo I Vesteralen Ii;;Norway;6;68-38N;014-28E;;;12;13; 01;160;----;Skrova Fyr;;Norway;6;68-09N;014-39E;;;11;; 01;161;ENSH;Svolvaer / Helle;;Norway;6;68-15N;014-40E;;;0;9; 01;162;ENSK;Storkmarknes / Skagen;;Norway;6;68-35N;015-01E;;;0;3; 01;167;----;Sortland;;Norway;6;68-42N;015-25E;;;3;3;P 01;169;----;Saltdal;;Norway;6;66-51N;015-19E;;;81;; 01;172;----;Finnoy I Hamaroy;;Norway;6;68-00N;015-37E;;;53;; 01;183;ENEV;Evenes;;Norway;6;68-31N;016-41E;;;26;26; 01;193;----;Narvik / Framnes;;Norway;6;68-26N;017-24E;;;3;30; 01;194;ENNK;Narvik Iii;;Norway;6;68-28N;017-30E;;;17;23; 01;196;----;Tennevoll;;Norway;6;68-45N;017-49E;;;21;; 01;199;----;Sihcajavri;;Norway;6;68-45N;023-32E;;;382;; 01;203;----;Krakenes;;Norway;6;62-02N;004-59E;;;41;; 01;205;----;Svinoy Fyr;;Norway;6;62-20N;005-16E;;;38;41;P 01;209;ENOV;Orsta-Volda / Hovden;;Norway;6;62-11N;006-04E;;;7;74; 01;210;ENAL;Alesund / Vigra;;Norway;6;62-34N;006-07E;;;2;22; 01;212;----;Ona Ii;;Norway;6;62-52N;006-32E;;;13;15; 01;217;ENML;Molde / Aro;;Norway;6;62-45N;007-16E;;;0;3; 01;218;----;Tafjord;;Norway;6;62-14N;007-25E;;;15;17; 01;223;ENKB;Kristiansund / Kvernberget;;Norway;6;63-07N;007-50E;;;6;62; 01;224;----;Skalmen Fyr;;Norway;6;63-28N;007-45E;;;13;13; 01;227;----;Tingvoll-Hanem;;Norway;6;62-50N;008-18E;;;69;69; 01;228;----;Sula;;Norway;6;63-51N;008-28E;;;4;6;P 01;231;----;Lesjaskog;;Norway;6;62-14N;008-22E;;;621;; 01;232;----;Vinjeora Ii;;Norway;6;63-12N;009-00E;;;47;; 01;237;----;Fokstua Ii;;Norway;6;62-09N;009-17E;;;;974; 01;238;----;Fokstua Ii;;Norway;6;62-07N;009-17E;;;972;974; 01;240;----;Halten Fyr;;Norway;6;64-10N;009-25E;;;16;16; 01;241;ENOL;Orland Iii;;Norway;6;63-42N;009-36E;63-42N;009-36E;0;7;P 01;245;----;Oppdal-Bjorke;;Norway;6;62-36N;009-41E;;;630;; 01;252;----;Berkak-Lyngholt;;Norway;6;62-49N;010-01E;;;475;; 01;259;----;Buholmrasa Fyr;;Norway;6;64-24N;010-27E;;;21;18; 01;262;----;Nordoyan Fyr;;Norway;6;64-48N;010-33E;;;33;; 01;265;----;Tynset Ii;;Norway;6;62-16N;010-46E;;;;482; 01;271;ENVA;Trondheim / Vaernes;;Norway;6;63-28N;010-56E;;;1;17;P 01;274;----;Selbu-Stubbe;;Norway;6;63-12N;011-07E;;;242;; 01;277;----;Steinkjer;;Norway;6;64-01N;011-27E;;;80;; 01;278;----;Verdal-Reppe;;Norway;6;63-47N;011-40E;;;81;81; 01;280;----;Namdalseid;;Norway;6;64-15N;011-12E;;;86;87; 01;282;ENRM;Rorvik / Ryum;;Norway;6;64-50N;011-09E;;;4;; 01;288;----;Roros;;Norway;6;62-34N;011-23E;;;628;630; 01;289;ENRO;Roros Lufthavn;;Norway;6;62-35N;011-21E;;;62;626; 01;290;ENNM;Namsos Lufthavn;;Norway;6;64-28N;011-35E;;;0;2; 01;292;----;Maraker-Utsyn;;Norway;6;63-25N;011-45E;;;239;240; 01;298;----;Nordli-Holand;;Norway;6;64-27N;013-43E;;;433;; 01;304;----;Ytteroyane Fyr;;Norway;6;61-34N;004-41E;;;26;25; 01;306;----;Hellisoy Fyr;;Norway;6;60-45N;004-43E;;;23;23; 01;310;ENFL;Floro;;Norway;6;61-35N;005-02E;;;0;9; 01;311;ENBR;Bergen / Flesland;;Norway;6;60-17N;005-14E;;;5;50;P 01;317;----;Bergen / Florida;;Norway;6;60-23N;005-20E;;;12;36;P 01;319;----;Takle;;Norway;6;61-02N;005-23E;;;38;; 01;320;ENSD;Sandane / Anda;;Norway;6;61-50N;006-07E;;;6;60; 01;321;----;Stryn;;Norway;6;61-54N;006-33E;;;;208; 01;322;----;Forde-Tefre;;Norway;6;61-28N;005-55E;;;64;64; 01;323;----;Forde / Bringelandsasen;;Norway;6;61-24N;005-46E;;;31;319; 01;325;----;Modalen Ii;;Norway;6;60-50N;005-57E;;;114;; 01;328;----;Kvamskogen;;Norway;6;60-24N;005-55E;;;408;; 01;330;----;Omastrand;;Norway;6;60-13N;005-59E;;;1;6; 01;336;ENBM;Voss-Bo;;Norway;6;60-39N;006-30E;;;125;122; 01;338;----;Vangsnes;;Norway;6;61-10N;006-39E;;;;51; 01;341;----;Eidfjord-Bu;;Norway;6;60-28N;006-52E;;;117;119; 01;344;----;Reimegrend;;Norway;6;60-41N;006-45E;;;590;; 01;347;ENSG;Sogndal / Haukasen;;Norway;6;61-09N;007-08E;;;49;497; 01;350;----;Finsevatn;;Norway;6;60-36N;007-32E;;;;1208; 01;355;----;Laerdal-Tonjum;;Norway;6;61-04N;007-31E;;;24;36; 01;357;----;Fortun;;Norway;6;61-30N;007-42E;;;35;35; 01;360;----;Brata;;Norway;6;61-54N;007-52E;;;712;711; 01;364;----;Geilo-Geilostolen;;Norway;6;60-31N;008-13E;;;810;; 01;366;----;Sognefjell;;Norway;6;61-34N;008-00E;;;1415;; 01;367;----;Fagernes;;Norway;6;60-59N;009-14E;;;365;365;P 01;368;ENFG;Fagernes Leirin;;Norway;6;61-00N;009-18E;;;822;; 01;370;----;Skabu-Storslaen;;Norway;6;61-31N;009-23E;;;865;; 01;372;----;Nesbyen-Skoglund;;Norway;6;60-34N;009-08E;;;167;167; 01;374;----;Vest-Torpa Ii;;Norway;6;60-56N;010-02E;;;542;; 01;375;----;Kvitfjell;;Norway;6;61-29N;009-58E;;;1028;; 01;378;----;Lillehammer-Saetherengen;;Norway;6;61-06N;010-28E;;;239;; 01;379;----;Sor-Nesset;;Norway;6;61-53N;010-09E;;;739;; 01;380;----;Venabu;;Norway;6;61-39N;010-07E;;;940;; 01;383;----;Evenstad-Overenget;;Norway;6;61-24N;011-09E;;;255;; 01;384;ENGM;Oslo / Gardermoen;;Norway;6;60-12N;011-05E;60-12N;011-06E;20;204;P 01;389;----;Haugedalshogda;;Norway;6;61-10N;011-27E;;;240;; 01;391;----;Flisa;;Norway;6;60-37N;012-01E;;;184;188; 01;393;----;Drevsjo;;Norway;6;61-53N;012-03E;;;672;674; 01;397;----;Trysil Vegstasjon;;Norway;6;61-18N;012-16E;;;;360; 01;400;----;Ekofisk;;Norway;6;56-32N;003-13E;56-32N;003-13E;46;46; 01;403;----;Utsira Fyr;;Norway;6;59-18N;004-53E;;;55;56;P 01;406;----;Slatteroy Fyr;;Norway;6;59-55N;005-04E;;;15;16;P 01;408;ENHD;Haugesund / Karmoy;;Norway;6;59-21N;005-13E;;;2;24; 01;412;----;Obrestad;;Norway;6;58-39N;005-34E;;;26;26; 01;415;ENZV;Stavanger / Sola;;Norway;6;58-53N;005-38E;58-52N;005-40E;0;9;P 01;417;----;Nedre Vats;;Norway;6;59-29N;005-45E;;;64;65; 01;423;----;Fister-Tonnevik;;Norway;6;59-10N;006-03E;;;50;; 01;424;----;Sauda;;Norway;6;59-39N;006-22E;;;5;6; 01;425;----;Ualand-Bjuland;;Norway;6;58-33N;006-21E;;;196;201; 01;426;----;Lista Fyr;;Norway;6;58-07N;006-34E;;;;14; 01;427;----;Lista Fyr;;Norway;6;58-07N;006-34E;;;14;14;P 01;428;ENLI;Lista Flyplass;;Norway;6;58-06N;006-38E;;;1;10; 01;432;----;Sirdal-Tjorhom;;Norway;6;58-53N;006-51E;;;500;; 01;433;----;Midtlaeger;;Norway;6;59-50N;006-59E;;;1082;1081; 01;434;----;Vaagsli;;Norway;6;59-46N;007-22E;;;;822; 01;436;----;Lindesnes Fyr;;Norway;6;57-59N;007-03E;;;13;; 01;439;----;Konsmo-Hoyland;;Norway;6;58-15N;007-19E;;;260;; 01;441;----;Hovden-Lundane;;Norway;6;59-35N;007-23E;;;;836; 01;442;----;Byglandsfjord-Solbakken;;Norway;6;58-40N;007-48E;;;212;211; 01;446;----;Oyfjell-Trovatn;;Norway;6;59-34N;008-12E;;;715;714;P 01;448;----;Oksoy Fyr;;Norway;6;58-04N;008-03E;;;9;8;P 01;450;----;Mosstrand Ii;;Norway;6;59-50N;008-11E;;;977;; 01;452;ENCN;Kristiansand / Kjevik;;Norway;6;58-12N;008-05E;;;1;17;P 01;453;----;Kristiansand / Kjevik;;Norway;6;58-13N;008-05E;;;;16; 01;455;----;Tveitsund;;Norway;6;59-02N;008-31E;;;252;255;P 01;459;----;Nelaug;;Norway;6;58-39N;008-38E;;;142;; 01;465;----;Torungen Fyr;;Norway;6;58-24N;008-48E;;;12;15; 01;467;----;Lyngor Fyr;;Norway;6;58-38N;009-09E;;;4;5;P 01;474;----;Lyngdal I Numedal;;Norway;6;59-54N;009-32E;;;288;294; 01;475;ENSN;Skien-Geiteryggen;;Norway;6;59-11N;009-34E;;;1;14; 01;476;----;Jomfruland Fyr;;Norway;6;58-51N;009-33E;;;12;5; 01;477;----;Kongsberg Iv;;Norway;6;59-40N;009-39E;;;168;169;P 01;482;----;Ferder Fyr;;Norway;6;59-02N;010-32E;;;6;8;P 01;483;ENTO;Torp;;Norway;6;59-12N;010-16E;;;8;88; 01;488;ENFB;Oslo / Fornebu;;Norway;6;59-54N;010-38E;;;1;17;P 01;490;----;Tryvasshogda Ii;;Norway;6;59-59N;010-41E;;;528;529; 01;492;----;Oslo-Blindern;;Norway;6;59-57N;010-43E;;;94;96; 01;494;ENRY;Rygge;;Norway;6;59-23N;010-47E;;;5;53;P 01;495;----;Stromtangen Fyr;;Norway;6;59-09N;010-50E;;;;10; 01;496;----;Holand-Loken;;Norway;6;59-49N;011-29E;;;152;154; 01;497;----;Prestebakke;;Norway;6;59-00N;011-32E;;;157;; 01;498;----;Magnor;;Norway;6;59-58N;012-13E;;;154;153; 02;012;----;Ritsem;;Sweden;6;67-44N;017-28E;;;521;523;P 02;020;----;Katterjakk;;Sweden;6;68-25N;018-10E;;;515;517;P 02;022;----;Abisko;;Sweden;6;68-21N;018-49E;;;394;394; 02;032;----;Tornetrask Lake;;Sweden;6;68-13N;019-43E;;;393;; 02;036;----;Nikkaluokta;;Sweden;6;67-51N;019-02E;;;467;468; 02;043;----;Esrange;;Sweden;6;67-56N;021-04E;;;330;341; 02;044;ESNQ;Kiruna Airport;;Sweden;6;67-49N;020-20E;;;452;; 02;045;----;Kiruna Geofysiska;;Sweden;6;67-50N;020-26E;;;408;; 02;049;ESNG;Gallivare;;Sweden;6;67-09N;020-39E;;;359;360; 02;080;----;Karesuando;;Sweden;6;68-27N;022-30E;;;327;327;P 02;096;----;Pajala;;Sweden;6;67-13N;023-24E;;;168;168;P 02;103;----;Hemavan-Skorvfjallet;;Sweden;6;65-47N;015-04E;;;800;; 02;104;----;Hemavan;;Sweden;6;65-49N;015-06E;;;473;473; 02;105;----;Abelvattnet;;Sweden;6;65-32N;014-59E;;;670;; 02;118;----;Dikanas-Skansnas;;Sweden;6;65-19N;016-02E;;;525;; 02;120;----;Kvikkjokk;;Sweden;6;66-57N;017-45E;;;337;337;P 02;124;----;Arjeplog;;Sweden;6;66-02N;017-52E;;;430;;P 02;128;ESPD;Gunnarn;;Sweden;6;64-58N;017-42E;;;280;283;P 02;141;----;Tjakaape;;Sweden;6;66-19N;019-13E;;;;582; 02;142;ESNJ;Jokkmokk;;Sweden;6;66-38N;019-39E;;;263;264;P 02;143;----;Paljamyren;;Sweden;6;66-13N;019-08E;;;;570; 02;145;----;Tellejaur;;Sweden;6;66-09N;019-38E;;;;436; 02;154;ESPE;Vidsel;;Sweden;6;65-52N;020-08E;;;180;182; 02;159;----;Fallfors;;Sweden;6;65-07N;020-46E;;;195;0; 02;160;----;Nattavaara;;Sweden;6;66-45N;021-03E;;;327;329; 02;169;----;Heden;;Sweden;6;65-52N;021-27E;;;39;36; 02;171;----;Boden;;Sweden;6;65-49N;021-42E;;;16;23; 02;176;----;Ronnskar;;Sweden;6;65-02N;021-34E;;;3;3; 02;181;----;Svartbyn;;Sweden;6;66-16N;022-51E;;;61;62; 02;183;----;Lulea Sol;;Sweden;6;65-33N;022-08E;;;17;; 02;185;----;Lulea / Kallax;;Sweden;6;65-33N;022-08E;65-33N;022-08E;17;34; 02;186;ESPA;Lulea / Kallax;;Sweden;6;65-33N;022-08E;65-33N;022-08E;17;34;P 02;188;----;Rodkallen;;Sweden;6;65-19N;022-23E;65-19N;022-23E;1;0; 02;196;----;Haparanda;;Sweden;6;65-50N;024-09E;;;5;6;P 02;206;----;Storlien-Visjovalen;;Sweden;6;63-18N;012-07E;;;642;644;P 02;209;----;Sylarna;;Sweden;6;63-03N;012-16E;;;1035;; 02;215;----;Areskutan;;Sweden;6;63-26N;013-05E;;;1280;; 02;221;----;Korsvattnet;;Sweden;6;63-50N;013-30E;;;717;0; 02;222;----;Gaddede;;Sweden;6;64-30N;014-08E;;;328;330;P 02;226;ESPC;Ostersund / Froson;;Sweden;6;63-11N;014-30E;63-11N;014-30E;376;370;P 02;229;----;Ostersund Sol;;Sweden;6;63-12N;014-30E;;;376;; 02;244;----;Junsele;;Sweden;6;63-42N;016-52E;;;210;; 02;245;----;Vilhelmina;;Sweden;6;64-35N;016-51E;;;348;349; 02;247;----;Krangede;;Sweden;6;63-09N;016-10E;;;183;184; 02;248;----;Krangede;;Sweden;6;63-10N;016-10E;;;223;; 02;259;ESNK;Kramfors Flygplats;;Sweden;6;63-03N;017-46E;;;10;19;P 02;267;ESNO;Ornskoldsvik Airport;;Sweden;6;63-24N;018-58E;;;103;; 02;269;----;Skagsudde;;Sweden;6;63-11N;019-01E;;;11;0; 02;274;----;Vindeln;;Sweden;6;64-13N;019-43E;;;204;206;P 02;283;----;Umea Robacksdalen;;Sweden;6;63-49N;020-15E;;;10;; 02;284;----;Jarnasklubb;;Sweden;6;63-26N;019-41E;;;5;; 02;286;ESNU;Umea Flygplats;;Sweden;6;63-48N;020-17E;;;7;14;P 02;288;----;Holmogadd;;Sweden;6;63-36N;020-46E;;;6;6;P 02;293;ESNS;Skelleftea Airport;;Sweden;6;64-38N;021-05E;;;49;; 02;296;----;Bjuroklubb;;Sweden;6;64-29N;021-35E;;;36;36;P 02;307;----;Idre;;Sweden;6;61-54N;012-51E;;;875;; 02;308;----;Tannas;;Sweden;6;62-27N;012-40E;;;723;724; 02;316;----;Sarna;;Sweden;6;61-42N;013-10E;;;437;438;P 02;318;----;Tandadalen;;Sweden;6;61-10N;013-01E;;;830;; 02;323;----;Klovsjo;;Sweden;6;62-32N;014-12E;;;550;551;P 02;324;----;Sveg;;Sweden;6;62-02N;014-22E;;;360;360;P 02;338;----;Edsbyn;;Sweden;6;61-22N;015-43E;;;184;185; 02;355;----;Kuggoren;;Sweden;6;61-42N;017-32E;;;8;10; 02;365;----;Sundvall-Harnlsand Flygplats;;Sweden;6;62-32N;017-27E;62-32N;017-27E;6;6; 02;366;ESNN;Sundsvall-Harnosand Flygplats;;Sweden;6;62-32N;017-27E;62-32N;017-27E;4;10;P 02;368;----;Bramon;;Sweden;6;62-13N;017-45E;;;20;; 02;376;ESCL;Soderhamn;;Sweden;6;61-16N;017-06E;;;26;36;P 02;382;----;Lungo;;Sweden;6;62-37N;018-04E;;;10;; 02;400;----;Ostmark;;Sweden;6;60-21N;012-39E;;;308;310;P 02;408;----;Blomskog;;Sweden;6;59-13N;012-05E;;;170;171; 02;410;----;Malung;;Sweden;6;60-41N;013-43E;;;308;308;P 02;415;----;Karlstad Sol;;Sweden;6;59-22N;013-28E;;;46;; 02;417;----;Naven;;Sweden;6;58-42N;013-07E;;;53;0; 02;418;ESSQ;Karlstad Flygplats;;Sweden;6;59-22N;013-28E;;;46;55;P 02;424;----;Stalldalen;;Sweden;6;59-57N;014-57E;;;210;210;P 02;432;----;Orebro;;Sweden;6;59-14N;015-03E;;;53;55; 02;433;----;Falun;;Sweden;6;60-37N;015-40E;;;157;; 02;435;ESSD;Borlange;;Sweden;6;60-26N;015-31E;;;145;0; 02;443;ESSK;Gavle / Sandviken Air Force Base;;Sweden;6;60-36N;016-57E;;;79;; 02;446;ESOW;Vasteras / Hasslo;;Sweden;6;59-35N;016-38E;;;6;31;P 02;450;----;Eggegrund;;Sweden;6;60-44N;017-34E;;;5;; 02;453;----;Gavle;;Sweden;6;60-43N;017-10E;;;16;0; 02;456;----;Films Kyrkby;;Sweden;6;60-14N;017-54E;;;39;39;P 02;458;ESCM;Uppsala;;Sweden;6;59-53N;017-36E;;;21;41;P 02;460;ESSA;Stockholm / Arlanda;;Sweden;6;59-39N;017-57E;;;38;61;P 02;464;ESSB;Stockholm / Bromma;;Sweden;6;59-21N;017-57E;59-21N;017-57E;14;14; 02;476;----;Floda;;Sweden;6;59-03N;016-24E;;;19;20; 02;483;----;Stockholm Kth;;Sweden;6;59-21N;018-04E;;;30;; 02;485;----;Stockholm / Observatoriet;;Sweden;6;59-34N;018-06E;;;44;0; 02;487;----;Stavsnas;;Sweden;6;59-18N;018-42E;;;;13; 02;488;----;Orskar;;Sweden;6;60-32N;018-23E;;;8;9; 02;489;----;Harsfjarden;;Sweden;6;59-04N;018-07E;;;4;9;P 02;496;----;Svenska Hogarna;;Sweden;6;59-27N;019-30E;;;12;12;P 02;499;----;Almagrundet;;Sweden;6;59-09N;019-08E;;;25;; 02;500;----;Nordkoster;;Sweden;6;58-54N;011-00E;;;10;11;P 02;501;----;Vaderoarna;;Sweden;6;58-35N;011-04E;;;;21; 02;505;----;Maseskar;;Sweden;6;58-06N;011-20E;;;16;0; 02;508;----;Maseskar Light House ;;Sweden;6;58-06N;011-21E;;;14;; 02;512;ESGP;Goteborg / Save;;Sweden;6;57-47N;011-53E;;;20;53;P 02;513;----;Goteborg;;Sweden;6;57-42N;012-00E;;;5;; 02;516;----;Vinga;;Sweden;6;57-38N;011-37E;;;19;; 02;517;----;Trubaduren;;Sweden;6;57-36N;011-38E;;;26;; 02;518;----;Nidingen;;Sweden;6;57-18N;011-54E;;;2;0; 02;519;----;Ringhals;;Sweden;6;57-16N;012-07E;;;;; 02;520;ESIB;Satenas;;Sweden;6;58-26N;012-42E;;;54;74;P 02;526;ESGG;Goteborg / Landvetter;;Sweden;6;57-40N;012-18E;;;169;; 02;527;----;Goteborg / Landvetter;;Sweden;6;57-40N;012-18E;57-40N;012-18E;155;155; 02;535;ESGR;Skovde Flygplats;;Sweden;6;58-27N;013-58E;;;98;105; 02;536;----;Rangedala;;Sweden;6;57-47N;013-10E;;;297;299; 02;545;----;Axstal;;Sweden;6;58-34N;014-34E;;;91;; 02;550;ESGJ;Jonkoping Flygplats;;Sweden;6;57-46N;014-05E;;;226;232;P 02;556;ESMV;Hagshult;;Sweden;6;57-18N;014-08E;;;169;172;P 02;562;ESCF;Linkoping / Malmen;;Sweden;6;58-24N;015-31E;;;93;117;P 02;564;----;Malexander;;Sweden;6;58-04N;015-14E;;;200;; 02;565;ESSF;Hultsfred Swedish Air Force Base ;;Sweden;6;57-31N;015-50E;;;112;; 02;566;----;Malilla;;Sweden;6;57-24N;015-50E;;;96;98;P 02;567;----;Landsort;;Sweden;6;58-45N;017-52E;;;18;20; 02;569;----;Stavsjo;;Sweden;6;58-44N;016-22E;;;60;; 02;571;ESSP;Norrkoping;;Sweden;6;58-35N;016-09E;;;34;0; 02;574;----;Smhi;;Sweden;6;58-35N;016-09E;;;32;; 02;575;----;Olands Norra Udde;;Sweden;6;57-22N;017-06E;;;2;4; 02;583;----;Gustaf Dalen;;Sweden;6;58-36N;017-28E;;;;21; 02;584;----;Gotska Sandon;;Sweden;6;58-24N;019-12E;;;12;12;P 02;586;----;Harstena;;Sweden;6;58-15N;017-01E;;;5;7;P 02;590;ESSV;Visby Flygplats;;Sweden;6;57-40N;018-21E;;;51;47;P 02;591;----;Visby Aerologiska Station;;Sweden;6;57-39N;018-21E;;;45;47; 02;599;----;Nasudden;;Sweden;6;57-04N;018-13E;;;;; 02;604;ESMT;Halmstad Swedish Air Force Base ;;Sweden;6;56-41N;012-50E;;;30;; 02;605;----;Hallands Vadero;;Sweden;6;56-27N;012-33E;;;10;0; 02;606;----;Kullen;;Sweden;6;56-18N;012-27E;;;72;72;P 02;607;ESDB;Angelholm;;Sweden;6;56-18N;012-51E;;;20;47;P 02;611;----;Helsingborg;;Sweden;6;56-02N;012-46E;;;43;44; 02;614;----;Oskarsgrundet;;Sweden;6;55-36N;012-51E;;;3;0; 02;616;----;Falsterbo;;Sweden;6;55-23N;012-49E;;;5;5;P 02;620;----;Torup;;Sweden;6;56-58N;013-06E;;;85;; 02;625;----;Skillinge;;Sweden;6;55-29N;014-19E;;;4;5; 02;626;----;Osby;;Sweden;6;56-22N;013-57E;;;83;85;P 02;627;----;Lund Lth;;Sweden;6;55-43N;013-13E;;;73;; 02;628;----;Hano;;Sweden;6;56-01N;014-51E;;;60;0; 02;630;ESDA;Ljungbyhed, Ljungbyhed, SWE-AFB;;Sweden;6;56-05-07N;013-12-26E;;;52;52;P 02;635;----;Malmo;;Sweden;6;55-35N;013-01E;;;13;; 02;636;ESMS;Malmo / Sturup;;Sweden;6;55-33N;013-22E;;;106;; 02;641;ESMX;Vaxjo;;Sweden;6;56-51N;014-50E;;;199;200; 02;644;----;Olands Sodra Udde;;Sweden;6;56-12N;016-24E;;;2;3; 02;651;ESMK;Kristianstad / Everod;;Sweden;6;55-55N;014-05E;;;23;; 02;664;ESDF;Ronneby;;Sweden;6;56-16N;015-17E;;;58;74;P 02;666;----;Ungskar;;Sweden;6;56-02N;015-48E;;;3;; 02;668;----;Kungsholms Fort;;Sweden;6;56-04N;015-35E;;;5;; 02;670;----;Kalmar Flygplats;;Sweden;6;56-41N;016-18E;;;6;17; 02;672;ESMQ;Kalmar;;Sweden;6;56-44N;016-18E;;;16;; 02;680;----;Hoburg;;Sweden;6;56-55N;018-09E;;;38;39;P 02;681;----;Vreta Kloster;;Sweden;6;58-29N;015-31E;;;52;; 02;685;----;Olands Sodra Grund;;Sweden;6;56-04N;016-41E;;;;30; 02;801;----;Kilpisjarvi;;Finland;6;69-03N;020-47E;;;478;476; 02;805;----;Kevo;;Finland;6;69-45N;027-02E;;;107;101; 02;807;EFIV;Ivalo;;Finland;6;68-37N;027-25E;;;147;148;P 02;823;----;Muonio;;Finland;6;67-58N;023-41E;;;253;253; 02;836;EFSO;Sodankyla;;Finland;6;67-22N;026-39E;67-22N;026-39E;179;179;P 02;844;EFPE;Pello;;Finland;6;66-48N;024-00E;;;84;84; 02;845;EFRO;Rovaniemi;;Finland;6;66-34N;025-50E;;;197;201; 02;848;----;Salla;;Finland;6;66-49N;028-40E;;;221;223; 02;863;----;Kemi I;;Finland;6;65-25N;024-08E;;;13;13; 02;864;EFKE;Kemi;;Finland;6;65-47N;024-35E;;;15;; 02;867;EFPU;Pudasjarvi;;Finland;6;65-22N;027-01E;;;114;117; 02;869;EFKS;Kuusamo;;Finland;6;65-58N;029-11E;;;262;263;P 02;874;EFHL;Hailuoto;;Finland;6;65-02N;024-48E;;;6;6; 02;875;EFOU;Oulu;;Finland;6;64-56N;025-22E;;;12;15;P 02;879;EFSU;Suomussalmi;;Finland;6;64-54N;029-01E;;;223;224; 02;897;EFKI;Kajaani;;Finland;6;64-17N;027-41E;;;143;136;P 02;901;----;Masskar;;Finland;6;63-44N;022-35E;;;11;13; 02;903;EFKK;Kruunupyy;;Finland;6;63-43N;023-09E;;;25;; 02;905;----;Nivala;;Finland;6;63-55N;024-58E;;;79;81;P 02;907;----;Ulkokalla;;Finland;6;64-20N;023-36E;;;10;10; 02;910;----;Valassaaret;;Finland;6;63-26N;021-04E;;;4;8; 02;911;EFVA;Vaasa;;Finland;6;63-03N;021-46E;;;4;; 02;912;----;Vaasa;;Finland;6;63-06N;021-35E;;;4;14; 02;913;EFKA;Kauhava;;Finland;6;63-06N;023-02E;;;42;44; 02;915;EFVI;Viitasaari;;Finland;6;63-05N;025-52E;;;132;132; 02;917;EFKU;Kuopio;;Finland;6;63-01N;027-48E;63-01N;027-48E;98;102;P 02;919;----;Ilomantsi;;Finland;6;62-41N;030-57E;;;162;165; 02;921;----;Moikipaa;;Finland;6;62-53N;021-06E;;;4;13; 02;924;EFHT;Ahtari;;Finland;6;62-32N;024-13E;;;157;161; 02;929;EFJO;Joensuu;;Finland;6;62-40N;029-38E;;;119;117;P 02;935;EFJY;Jyvaskyla;;Finland;6;62-24N;025-41E;62-24N;025-40E;141;145;P 02;942;----;Niinisalo;;Finland;6;61-51N;022-28E;;;134;136; 02;944;EFTP;Tampere / Pirkkala;;Finland;6;61-25N;023-35E;;;112;112;P 02;945;EFHA;Halli;;Finland;6;61-51N;024-48E;;;143;145; 02;947;EFMI;Mikkeli;;Finland;6;61-44N;027-18E;;;138;138; 02;948;EFSA;Savonlinna;;Finland;6;61-57N;028-57E;;;95;95; 02;952;EFPO;Pori;;Finland;6;61-28N;021-48E;;;13;17;P 02;958;EFLP;Lappeenranta;;Finland;6;61-02-45N;028-08-55E;;;106;; 02;961;----;Kuuskajaskari;;Finland;6;61-08N;021-22E;;;6;10; 02;963;----;Jokioinen;;Finland;6;60-49N;023-30E;60-49N;023-30E;104;103;P 02;965;----;Lahti;;Finland;6;60-58N;025-38E;;;83;84; 02;966;EFUT;Utti;;Finland;6;60-54N;026-56E;;;100;100; 02;970;EFMA;Mariehamn / Aland Island;;Finland;6;60-07N;019-54E;;;6;; 02;971;----;Jomala;;Finland;6;60-09N;019-52E;;;9;10; 02;972;EFTU;Turku;;Finland;6;60-31N;022-16E;60-31N;022-16E;49;59;P 02;973;----;Suomusjarvi;;Finland;6;60-24N;023-46E;;;84;86; 02;974;EFHK;Helsinki-Vantaa;;Finland;6;60-19N;024-58E;60-19N;024-58E;51;56;P 02;975;EFHF;Helsinki-Malmi;;Finland;6;60-15N;025-03E;;;17;28; 02;976;----;Rankki;;Finland;6;60-22N;026-58E;;;11;12;P 02;980;----;Nyhamn;;Finland;6;59-58N;019-58E;;;8;10; 02;981;----;Uto;;Finland;6;59-47N;021-23E;;;9;7;P 02;982;----;Russaro;;Finland;6;59-46N;022-57E;;;6;11;P 02;984;----;Bagaskar;;Finland;6;59-56N;024-01E;;;10;21; 02;987;----;Kallbadagrund;;Finland;6;59-59N;025-36E;;;19;19; 02;988;----;Isosaari;;Finland;6;60-06N;025-04E;;;4;5; 02;990;----;Kumlinge;;Finland;6;60-18N;020-45E;;;4;5; 02;993;----;Market;;Finland;6;60-18N;019-08E;;;11;11; 03;001;----;Muckle Flugga;;United Kingdom;6;60-51N;000-53W;;;53;0; 03;002;----;Baltasound;;United Kingdom;6;60-45N;000-51W;;;15;0; 03;003;EGPB;Sumburgh Cape ;;United Kingdom;6;59-53N;001-18W;;;5;; 03;005;----;Lerwick;;United Kingdom;6;60-08N;001-11W;60-08N;001-11W;82;84;P 03;006;----;Sella Ness;;United Kingdom;6;60-27N;001-16W;;;7;0; 03;007;----;Muckle Holm;;United Kingdom;6;60-35N;001-16W;;;22;0; 03;008;----;Fair Isle;;United Kingdom;6;59-32N;001-38W;;;57;0; 03;009;----;North Ronaldsay;;United Kingdom;6;59-22N;002-25W;;;11;; 03;010;----;Sule Skerry;;United Kingdom;6;59-05N;004-24W;;;16;0; 03;011;----;North Rona;;United Kingdom;6;59-07N;005-49W;;;98;0; 03;013;----;Foula;;United Kingdom;6;60-09N;002-04W;;;22;; 03;014;----;Foula;;United Kingdom;6;60-07N;002-04W;;;13;0; 03;017;EGPA;Kirkwall Airport;;United Kingdom;6;58-57N;002-54W;;;21;0;P 03;021;----;Lochboisdale;;United Kingdom;6;57-09N;007-19W;;;6;; 03;022;EGPL;Benbecula;;United Kingdom;6;57-28N;007-22W;;;6;0;P 03;023;----;South Uist Range;;United Kingdom;6;57-20N;007-22W;;;10;; 03;025;----;Butt Of Lewis;;United Kingdom;6;58-31N;006-16W;;;23;0; 03;026;EGPO;Stornoway;;United Kingdom;6;58-13N;006-19W;58-13N;006-19W;9;13;P 03;027;----;Waterstein;;United Kingdom;6;57-26N;006-46W;;;83;; 03;031;----;Loch Glascanoch;;United Kingdom;6;57-43N;004-53W;;;265;; 03;034;----;Aultbea;;United Kingdom;6;57-52N;005-38W;;;11;0; 03;035;----;Barra;;United Kingdom;6;57-02N;007-27W;;;3;; 03;040;----;Kilmory;;United Kingdom;6;56-46N;006-03W;;;45;; 03;041;----;Aonach Mor;;United Kingdom;6;56-49N;004-58W;;;1130;; 03;044;----;Altnaharra;;United Kingdom;6;58-17N;004-26W;;;81;; 03;047;----;Tulloch Bridge;;United Kingdom;6;56-52N;004-42W;;;237;0; 03;049;----;Cape Wrath;;United Kingdom;6;58-38N;005-00W;;;112;0; 03;054;----;Strathy Point;;United Kingdom;6;58-36N;004-01W;;;32;; 03;055;----;Rackwick;;United Kingdom;6;58-52N;003-23W;;;20;; 03;057;----;Foyers;;United Kingdom;6;57-16N;004-29W;;;21;0; 03;058;----;Invergordon Harbour;;United Kingdom;6;57-41N;004-10W;;;3;0; 03;059;EGPE;Inverness / Dalcross;;United Kingdom;6;57-32N;004-03W;;;9;0; 03;062;EGQA;Tain Range;;United Kingdom;6;57-49N;003-58W;;;4;0; 03;063;----;Aviemore;;United Kingdom;6;57-12N;003-50W;;;220;0; 03;065;----;Cairngorm;;United Kingdom;6;57-07N;003-38W;;;1245;0; 03;066;EGQK;Kinloss;;United Kingdom;6;57-39N;003-34W;57-39N;003-34W;7;0;P 03;068;EGQS;Lossiemouth;;United Kingdom;6;57-43N;003-19W;;;13;;P 03;070;----;Glenlivet;;United Kingdom;6;57-21N;003-21W;;;213;0; 03;072;----;Cairnwell;;United Kingdom;6;56-53N;003-25W;;;933;0; 03;074;----;Scrabster Harbour;;United Kingdom;6;58-37N;003-33W;;;10;; 03;075;EGPC;Wick;;United Kingdom;6;58-27N;003-05W;;;39;0;P 03;076;----;Temp For 03075;;United Kingdom;6;58-27N;003-06W;;;39;; 03;077;----;Lybster;;United Kingdom;6;58-19N;003-17W;;;85;; 03;080;----;Aboyne;;United Kingdom;6;57-05N;002-50W;;;140;0; 03;085;----;Inchmarlo;;United Kingdom;6;57-04N;002-32W;;;80;; 03;088;----;Inverbervie;;United Kingdom;6;56-51N;002-16W;;;134;0; 03;091;EGPD;Aberdeen / Dyce;;United Kingdom;6;57-12N;002-13W;57-12N;002-13W;65;0;P 03;092;----;Peterhead Harbour;;United Kingdom;6;57-30N;001-46W;;;15;0; 03;094;----;Rosehearty;;United Kingdom;6;57-42N;002-07W;;;4;0; 03;100;EGPU;Tiree;;United Kingdom;6;56-30N;006-53W;;;12;0;P 03;102;----;Orsay;;United Kingdom;6;55-40N;006-30W;;;23;0; 03;111;EGQJ;Machrihanish;;United Kingdom;6;55-26N;005-42W;;;13;0; 03;114;----;Oban;;United Kingdom;6;56-25N;005-28W;;;4;0; 03;120;----;Lochranza;;United Kingdom;6;55-42N;005-18W;;;46;; 03;121;----;Kildonan;;United Kingdom;6;55-26N;005-06W;;;18;; 03;130;----;West Freugh;;United Kingdom;6;54-51N;004-57W;;;17;0; 03;132;EGOY;West Freugh;;United Kingdom;6;54-51N;004-57W;;;11;0; 03;135;EGPK;Prestwick Airport;;United Kingdom;6;55-30N;004-35W;;;20;0;P 03;136;----;Prestwick Rnas;;United Kingdom;6;55-31N;004-35W;;;26;0; 03;137;----;Whithorn;;United Kingdom;6;54-42N;004-25W;;;40;; 03;138;----;Greenock Mrcc;;United Kingdom;6;55-58N;004-48W;;;5;0; 03;139;----;Saughall;;United Kingdom;6;55-36N;004-13W;;;221;; 03;140;EGPF;Glasgow Airport;;United Kingdom;6;55-52N;004-26W;;;8;0;P 03;144;----;Strathallan;;United Kingdom;6;56-19N;003-44W;;;35;0; 03;148;----;Glen Ogle;;United Kingdom;6;56-25N;004-19W;;;564;; 03;152;----;Salsburgh;;United Kingdom;6;55-52N;003-52W;;;277;; 03;153;----;Dundrennan;;United Kingdom;6;54-48N;004-00W;;;114;0; 03;154;----;Dumfries / Drungans;;United Kingdom;6;55-03N;003-39W;;;16;0; 03;155;----;Drumalbin;;United Kingdom;6;55-37N;003-44W;;;245;; 03;158;----;Charterhall;;United Kingdom;6;55-42N;002-23W;;;112;0; 03;160;EGPH;Edinburgh Airport;;United Kingdom;6;55-57N;003-21W;;;41;0;P 03;162;----;Eskdalemuir;;United Kingdom;6;55-19N;003-12W;;;242;0;P 03;165;EGOM;Spadeadam;;United Kingdom;6;55-03N;002-33W;;;325;; 03;168;----;Galashiels;;United Kingdom;6;55-36N;002-54W;;;146;; 03;171;EGQL;Leuchars;;United Kingdom;6;56-23N;002-52W;;;12;0;P 03;174;----;Fife Ness;;United Kingdom;6;56-18N;002-35W;;;12;0; 03;176;----;Carterhouse;;United Kingdom;6;55-22N;002-31W;;;308;; 03;188;----;Berwick Upon Tweed;;United Kingdom;6;55-45N;002-02W;;;42;; 03;204;EGNS;Isle Of Man / Ronaldsway Airport;;United Kingdom;6;54-05N;004-38W;;;17;0;P 03;207;----;Snaefell-Isle;;United Kingdom;6;54-16N;004-28W;;;615;; 03;208;----;Point Of Ayre Lighthouse ;;United Kingdom;6;54-25N;004-22W;;;9;; 03;209;----;Drumburgh;;United Kingdom;6;54-56N;003-09W;;;7;; 03;210;----;Saint Bees Head;;United Kingdom;6;54-31N;003-36W;;;124;0; 03;212;----;Keswick;;United Kingdom;6;54-37N;003-10W;;;81;0; 03;213;----;Eskmeals;;United Kingdom;6;54-19N;003-24W;54-19N;003-24W;8;9; 03;214;EGNL;Walney Island;;United Kingdom;6;54-07N;003-15W;;;15;0; 03;215;----;Aspatria;;United Kingdom;6;54-46N;003-19W;;;61;0; 03;220;----;Carlisle;;United Kingdom;6;54-56N;002-58W;;;28;0; 03;222;EGNC;Carlisle;;United Kingdom;6;54-56N;002-57W;;;26;; 03;224;----;Spadeadam;;United Kingdom;6;55-03N;002-33W;;;285;; 03;225;----;Shap;;United Kingdom;6;54-30N;002-41W;;;249;0; 03;226;----;Warcop Range;;United Kingdom;6;54-34N;002-25W;;;227;0; 03;227;----;Great Dun Fell;;United Kingdom;6;51-41N;002-27W;;;847;0; 03;229;----;Great Dun Fell;;United Kingdom;6;54-41N;002-27W;;;847;; 03;230;----;Redesdale;;United Kingdom;6;55-17N;002-17W;;;211;0; 03;235;----;Boltshope Park;;United Kingdom;6;54-49N;002-05W;;;434;; 03;240;EGQM;Boulmer;;United Kingdom;6;55-25N;001-36W;55-25N;001-36W;23;0;P 03;241;----;Long Framlington;;United Kingdom;6;55-18N;001-48W;;;158;; 03;242;----;Burnhope;;United Kingdom;6;54-49N;001-43W;;;240;; 03;246;----;Newcastle Weather Centre;;United Kingdom;6;54-59N;001-36W;;;30;; 03;249;----;Sunderland Polytech;;United Kingdom;6;54-54N;001-23W;;;56;; 03;257;EGXE;Leeming;;United Kingdom;6;54-18N;001-32W;54-18N;001-32W;40;40; 03;261;EGXD;Disforth;;United Kingdom;6;54-08N;001-25W;;;36;0; 03;262;----;Tynemouth;;United Kingdom;6;55-01N;001-25W;;;30;0; 03;266;EGXU;Linton-On-Ouse;;United Kingdom;6;54-03N;001-15W;;;16;0; 03;275;----;Loftus Samos;;United Kingdom;6;54-34N;000-52W;;;58;; 03;281;----;Fylingdales;;United Kingdom;6;54-22N;000-40W;;;262;0; 03;282;----;Whitby;;United Kingdom;6;54-29N;000-36W;;;60;0; 03;292;----;Bridlington Mrsc;;United Kingdom;6;54-06N;000-10W;;;15;0; 03;293;----;Cowden;;United Kingdom;6;53-51N;000-06W;;;15;; 03;302;EGOV;Valley;;United Kingdom;6;53-15N;004-32W;;;1;0;P 03;303;----;Amlwch;;United Kingdom;6;53-23N;004-22W;;;114;; 03;305;----;Capel Curig;;United Kingdom;6;53-06N;003-56W;;;216;0; 03;308;----;Snowdon Summit;;United Kingdom;6;53-04N;004-05W;;;1070;; 03;313;----;Rhyl;;United Kingdom;6;53-15N;003-30W;;;77;0; 03;314;----;Moel-Y-Crio;;United Kingdom;6;53-13N;003-13W;;;263;0; 03;316;----;Crosby;;United Kingdom;6;53-30N;003-04W;;;8;; 03;318;EGNH;Blackpool Airport;;United Kingdom;6;53-46N;003-02W;;;10;0;P 03;321;EGNR;Hawarden;;United Kingdom;6;53-10N;002-59W;;;10;0; 03;322;----;Aughton;;United Kingdom;6;53-33N;002-55W;53-33N;002-55W;56;54; 03;329;----;Winter Hill;;United Kingdom;6;53-37N;002-31W;;;440;; 03;334;EGCC;Manchester Airport;;United Kingdom;6;53-21N;002-17W;;;69;0;P 03;338;----;Cellarhead;;United Kingdom;6;53-02N;002-05W;;;228;0; 03;339;----;Skipton;;United Kingdom;6;53-58N;002-02W;;;153;; 03;344;----;Bingley;;United Kingdom;6;53-49N;001-52W;;;262;0; 03;345;----;Emley Moor;;United Kingdom;6;53-37N;001-40W;53-37N;001-40W;259;259; 03;347;----;Leeds Weather Centre;;United Kingdom;6;53-48N;001-33W;;;47;; 03;354;----;Nottingham Weather Centre;;United Kingdom;6;53-00N;001-15W;;;117;0;P 03;355;EGXG;Church Fenton;;United Kingdom;6;53-50N;001-12W;;;9;0; 03;377;EGXW;Waddington;;United Kingdom;6;53-10N;000-31W;53-10N;000-31W;68;0;P 03;379;EGYD;Cranwell;;United Kingdom;6;53-02N;000-30W;;;67;0; 03;384;EGXV;Leconfield;;United Kingdom;6;53-52N;000-26W;;;6;0; 03;385;----;Donna Nook;;United Kingdom;6;53-29N;000-05E;;;8;; 03;387;----;Easington;;United Kingdom;6;53-40N;000-07E;;;10;0; 03;391;EGXC;Coningsby Royal Air Force Base;;United Kingdom;6;53-05N;000-10W;;;7;; 03;392;EGYW;Wainfleet;;United Kingdom;6;53-05N;000-16E;;;3;0; 03;402;----;Mynydd Rhiw;;United Kingdom;6;52-49N;004-38W;;;253;; 03;403;----;Nantmor;;United Kingdom;6;53-00N;004-05W;;;53;; 03;405;----;Aberdaron;;United Kingdom;6;52-47N;004-44W;;;95;0; 03;408;----;Cynwyd;;United Kingdom;6;52-57N;003-25W;;;228;0; 03;410;----;Lake Vyrnwy;;United Kingdom;6;52-45N;003-28W;;;360;0; 03;411;----;Aberhosan;;United Kingdom;6;52-34N;003-43W;;;244;; 03;414;EGOS;Shawbury;;United Kingdom;6;52-48N;002-40W;;;76;0;P 03;453;EGXJ;Cottesmore;;United Kingdom;6;52-44N;000-39W;;;138;; 03;462;EGXT;Wittering;;United Kingdom;6;52-37N;000-28W;;;84;0; 03;469;EGYH;Holbeach;;United Kingdom;6;52-52N;000-09E;;;3;0; 03;482;EGYM;Marham;;United Kingdom;6;52-39N;000-34E;;;23;0;P 03;488;----;Weybourne;;United Kingdom;6;52-57N;001-08E;;;21;0; 03;492;EGSH;Norwich Weather Centre;;United Kingdom;6;52-38N;001-18E;;;14;0; 03;495;EGYC;Coltishall;;United Kingdom;6;52-26N;001-21E;;;20;0;P 03;496;----;Hemsby;;United Kingdom;6;52-41N;001-41E;52-41N;001-41E;13;14;P 03;501;----;Capel Dewi;;United Kingdom;6;52-25N;004-00W;55-25N;004-00W;92;92; 03;502;EGUC;Aberporth;;United Kingdom;6;52-08N;004-34W;52-08N;004-34W;133;134;P 03;503;----;Trawscoed;;United Kingdom;6;52-21N;003-57W;;;63;0; 03;507;----;Sennybridge;;United Kingdom;6;52-04N;003-37W;;;307;0; 03;511;----;Newcastle On Clun;;United Kingdom;6;52-26N;003-07W;;;215;; 03;520;----;Shobdon;;United Kingdom;6;52-15N;002-53W;;;99;0; 03;521;----;Madley;;United Kingdom;6;52-02N;002-51W;;;77;0; 03;525;----;Malvern;;United Kingdom;6;52-05N;002-18W;;;53;53; 03;526;----;Barbourne;;United Kingdom;6;52-12N;002-13W;;;25;; 03;527;----;Great Malvern;;United Kingdom;6;52-07N;002-18W;;;46;0; 03;529;----;Pershore;;United Kingdom;6;52-09N;002-02W;;;32;0; 03;534;EGBB;Birmingham / Airport;;United Kingdom;6;52-27N;001-44W;;;99;0;P 03;544;----;Church Lawford;;United Kingdom;6;52-22N;001-20W;;;107;0; 03;559;----;Cardington;;United Kingdom;6;52-06N;000-25W;52-06N;000-25W;30;30; 03;560;----;Bedford;;United Kingdom;6;52-13N;000-29W;;;85;0; 03;562;EGWZ;Alconbury Royal Air Force Base;;United Kingdom;6;52-22N;000-13W;;;49;; 03;566;EGUY;Wyton Royal Air Force Base;;United Kingdom;6;52-21N;000-07W;;;41;; 03;577;EGUN;Mildenhall Royal Air Force Base;;United Kingdom;6;52-22N;000-29E;;;10;; 03;583;EGUL;Lakenheath Royal Air Force Base;;United Kingdom;6;52-25N;000-34E;;;10;; 03;586;EGXH;Honington Royal Air Force Base;;United Kingdom;6;52-20N;000-46E;52-20N;000-46E;54;54; 03;590;EGUW;Wattisham;;United Kingdom;6;52-07N;000-58E;;;87;0;P 03;604;----;Milford Haven;;United Kingdom;6;51-42N;005-03W;;;44;0; 03;605;EGOP;Pembrey Sands;;United Kingdom;6;51-43N;004-22W;;;3;; 03;607;----;Pendine;;United Kingdom;6;51-45N;004-31W;;;5;0; 03;608;----;Pendine;;United Kingdom;6;51-45N;004-31W;;;5;0; 03;609;----;Mumbles;;United Kingdom;6;51-34N;003-59W;;;35;0; 03;614;----;Cilfynydd;;United Kingdom;6;51-38N;003-18W;;;194;; 03;644;EGVA;Fairford Royal Air Force Base;;United Kingdom;6;51-41N;001-47W;;;87;; 03;647;----;Little Rissington;;United Kingdom;6;51-52N;001-41W;;;215;0; 03;649;EGVN;Brize Norton;;United Kingdom;6;51-45N;001-35W;51-45N;001-35W;88;0;P 03;658;EGUB;Benson;;United Kingdom;6;51-37N;001-05W;;;63;0;P 03;660;----;High Wicombe Hqstc;;United Kingdom;6;51-41N;000-48W;;;204;; 03;670;----;Northwood;;United Kingdom;6;51-37N;000-24W;;;113;0; 03;672;EGWU;Northolt;;United Kingdom;6;51-33N;000-25W;;;38;0; 03;674;----;Chenies;;United Kingdom;6;51-41N;000-32W;;;139;0; 03;683;EGSS;Stansted Airport;;United Kingdom;6;51-53N;000-14E;;;106;0;P 03;693;----;Shoeburyness;;United Kingdom;6;51-33N;000-50E;51-33N;000-50E;2;3; 03;695;----;Thames Tower;;United Kingdom;6;51-40N;001-06E;;;8;0; 03;696;----;Walton-On-Naze;;United Kingdom;6;51-51N;001-17E;;;3;0; 03;700;----;Saint Gowan L. V.;;United Kingdom;6;51-30N;005-00W;;;5;; 03;701;----;Gawlish;;United Kingdom;6;51-01N;004-29W;;;122;; 03;707;EGDC;Chivenor;;United Kingdom;6;51-05N;004-09W;;;8;0; 03;710;----;Liscombe;;United Kingdom;6;51-05N;003-36W;;;348;0; 03;712;----;Tivington;;United Kingdom;6;51-12N;003-32W;;;80;0; 03;715;EGFF;Cardiff-Wales Airport;;United Kingdom;6;51-24N;003-21W;51-24N;003-21W;67;0;P 03;717;----;Cardiff Weather Centre;;United Kingdom;6;51-29N;003-11W;;;9;0; 03;726;----;Bristol Weather Centre;;United Kingdom;6;51-28N;002-36W;;;11;; 03;740;EGDL;Lyneham;;United Kingdom;6;51-30N;001-59W;;;145;0;P 03;743;----;Larkhill;;United Kingdom;6;51-12N;001-48W;51-12N;001-48W;132;133; 03;746;EGDM;Boscombe Down;;United Kingdom;6;51-10N;001-45W;;;124;0;P 03;749;EGVP;Middle Wallop;;United Kingdom;6;51-09N;001-34W;;;91;0; 03;759;----;Test Samos 03761;;United Kingdom;6;51-15N;000-57W;;;123;; 03;761;EGVO;Odiham;;United Kingdom;6;51-14N;000-57W;;;123;0; 03;763;EGRR;Bracknell / Beaufort Park;;United Kingdom;6;51-23N;000-47W;;;74;0; 03;766;EGUF;Farnborough Military ;;United Kingdom;6;51-17N;000-46W;;;72;; 03;768;EGLF;Farnborough;;United Kingdom;6;51-17N;000-46W;;;65;0; 03;772;EGLL;London / Heathrow Airport;;United Kingdom;6;51-29N;000-27W;;;24;0;P 03;776;EGKK;London / Gatwick Airport;;United Kingdom;6;51-09N;000-11W;;;62;0;P 03;779;EGRB;London Weather Centre;;United Kingdom;6;51-31N;000-07W;;;5;0; 03;781;----;Kenley;;United Kingdom;6;51-18N;000-05W;;;170;0; 03;784;----;Gravesend-Broadness;;United Kingdom;6;51-28N;000-18E;;;3;; 03;785;----;Charing;;United Kingdom;6;51-12N;000-47E;;;91;; 03;789;----;Jubilee Corner;;United Kingdom;6;51-11N;000-38E;;;47;0; 03;791;----;Sheerness;;United Kingdom;6;51-27N;000-45E;;;25;0; 03;796;----;Langdon Bay;;United Kingdom;6;51-08N;001-21E;;;117;0; 03;797;EGUM;Manston;;United Kingdom;6;51-21N;001-21E;;;55;0;P 03;803;EGHE;Scilly, Saint Mary'S;;United Kingdom;6;49-55N;006-18W;;;31;0; 03;808;----;Camborne;;United Kingdom;6;50-13N;005-19W;50-13N;005-19W;87;88;P 03;809;EGDR;Culdrose;;United Kingdom;6;50-05N;005-15W;;;78;0;P 03;810;----;Pendennis Point;;United Kingdom;6;50-09N;005-04W;;;35;0; 03;815;----;Lizard Lighthouse;;United Kingdom;6;49-58N;005-12W;;;60;; 03;817;EGDG;Saint Mawgan;;United Kingdom;6;50-26N;005-00W;;;119;0;P 03;820;----;Davidstow Moor;;United Kingdom;6;50-38N;004-36W;;;291;; 03;823;----;Cardinham;;United Kingdom;6;50-30N;004-40W;;;200;0; 03;824;----;Bastreet;;United Kingdom;6;50-34N;004-29W;;;233;; 03;827;EGDB;Plymouth;;United Kingdom;6;50-21N;004-07W;;;50;0;P 03;830;----;Burrington;;United Kingdom;6;50-56N;003-59W;;;199;; 03;831;----;North Hessary Tor;;United Kingdom;6;50-33N;004-00W;;;510;; 03;837;----;Brixham;;United Kingdom;6;50-24N;003-29W;;;3;; 03;839;EGTE;Exeter Airport;;United Kingdom;6;50-44N;003-25W;;;30;; 03;840;----;Dunkeswell Aerodrome;;United Kingdom;6;50-52N;003-14W;;;252;; 03;841;----;Temp For 03840;;United Kingdom;6;50-52N;003-15W;;;255;; 03;853;EGDY;Yeovilton;;United Kingdom;6;51-00N;002-38W;;;23;0;P 03;857;----;Isle Of Portland;;United Kingdom;6;50-31N;002-28W;;;53;; 03;858;EGDP;Portland / Rnas;;United Kingdom;6;50-34N;002-27W;;;3;0; 03;862;EGHH;Bournemouth Airport;;United Kingdom;6;50-47N;001-50W;;;11;0;P 03;865;EGHI;Southampton / Weather Centre;;United Kingdom;6;50-54N;001-24W;;;9;0; 03;866;----;Saint Catherine's Point;;United Kingdom;6;50-35N;001-18W;;;16;; 03;867;----;Lee-On-Solent;;United Kingdom;6;50-49N;001-13W;;;10;0; 03;872;----;Thorney Island;;United Kingdom;6;50-49N;000-55W;;;4;0; 03;874;----;Solent M. R. S. C.;;United Kingdom;6;50-48N;001-13W;;;9;0; 03;876;EGKA;Shoreham Airport;;United Kingdom;6;50-50N;000-17W;;;2;0; 03;880;----;Newhaven;;United Kingdom;6;50-47N;000-03E;;;5;0; 03;881;----;Brede;;United Kingdom;6;50-56N;000-36E;;;82;; 03;882;----;Herstmonceux;;United Kingdom;6;50-54N;000-19E;50-54N;000-19E;52;0;P 03;894;EGJB;Guernsey Airport;;United Kingdom;6;49-26N;002-36W;;;102;0;P 03;895;EGJJ;Jersey Airport;;United Kingdom;6;49-13N;002-12W;;;84;0;P 03;896;----;Saint Helier;;United Kingdom;6;49-12N;002-06W;;;54;; 03;900;----;Knockarevan;;United Kingdom;6;54-25N;008-05W;;;50;; 03;902;----;Corgary;;United Kingdom;6;54-26N;008-03W;;;45;0; 03;903;----;St Angelo;;United Kingdom;6;54-24N;007-39W;;;47;0; 03;904;----;Castlederg;;United Kingdom;6;54-42N;007-35W;;;51;0; 03;906;----;Carmoney;;United Kingdom;6;55-01N;007-14W;;;73;; 03;908;----;Ballykelly;;United Kingdom;6;55-04N;007-01W;;;2;0; 03;911;----;Lough Fea;;United Kingdom;6;54-43N;006-49W;;;225;0; 03;912;----;Moyola;;United Kingdom;6;54-43N;006-31W;;;17;0; 03;914;----;Portrush;;United Kingdom;6;55-12N;006-39W;;;8;0; 03;915;----;Portglenone;;United Kingdom;6;54-52N;006-27W;;;64;; 03;916;----;Ballypatrick Forest;;United Kingdom;6;55-11N;006-10W;;;156;0; 03;917;EGAA;Belfast / Aldergrove Airport;;United Kingdom;6;54-39N;006-13W;;;81;0;P 03;920;----;Hillsborough;;United Kingdom;6;54-29N;006-06W;54-29N;006-06W;37;38;P 03;923;----;Glenanne;;United Kingdom;6;54-14N;006-30W;;;161;0; 03;924;EGAC;Belfast / Harbour;;United Kingdom;6;54-36N;005-53W;;;5;0; 03;926;----;Killough;;United Kingdom;6;54-14N;005-37W;;;15;; 03;927;----;Bangor Harbour;;United Kingdom;6;54-40N;005-40W;;;11;; 03;928;----;Larne;;United Kingdom;6;54-51N;005-48W;;;3;; 03;952;----;Roches Point;;Ireland;6;51-48N;008-15W;;;40;41;P 03;953;----;Valentia Observatory;;Ireland;6;51-56N;010-15W;51-56N;010-15W;9;14;P 03;955;EICK;Cork Airport;;Ireland;6;51-51N;008-29W;;;153;162;P 03;957;----;Rosslare;;Ireland;6;52-15N;006-20W;52-15N;006-20W;23;25;P 03;960;----;Kilkenny;;Ireland;6;52-40N;007-16W;;;63;64;P 03;962;EINN;Shannon Airport;;Ireland;6;52-42N;008-55W;;;14;20;P 03;964;----;Galway;;Ireland;6;53-17N;009-01W;;;18;21;P 03;965;----;Birr;;Ireland;6;53-05N;007-53W;;;70;72;P 03;967;EIME;Casement Aerodrome;;Ireland;6;53-18N;006-26W;;;97;93;P 03;969;EIDW;Dublin Airport;;Ireland;6;53-26N;006-15W;;;68;85;P 03;970;----;Claremorris;;Ireland;6;53-43N;008-59W;;;69;69;P 03;971;----;Mullingar;;Ireland;6;53-32N;007-22W;;;101;104;P 03;973;----;Connaught Airport;;Ireland;6;53-54N;008-49W;;;203;209; 03;974;----;Clones;;Ireland;6;54-11N;007-14W;;;87;89;P 03;976;----;Belmullet;;Ireland;6;54-14N;010-00W;54-14N;010-00W;9;10;P 03;978;----;Finner;;Ireland;6;54-30N;008-14W;;;39;45; 03;980;----;Malin Head;;Ireland;6;55-22N;007-20W;55-22N;007-20W;20;25;P 04;001;----;Breidavik;;Iceland;6;65-32N;024-21W;;;20;; 04;003;----;Kvigindisdalur;;Iceland;6;65-33N;024-01W;;;49;; 04;005;----;Bolungavik;;Iceland;6;66-09N;023-15W;;;23;24; 04;007;----;Holar I Dyrafirdi;;Iceland;6;65-52N;023-36W;;;30;; 04;010;----;Nedri-Holl;;Iceland;6;64-48N;023-02W;;;8;; 04;013;BIST;Stykkisholmur;;Iceland;6;65-05N;022-44W;;;8;8; 04;014;----;Reykjanesviti;;Iceland;6;63-49N;022-43W;;;20;26; 04;017;----;Aedey;;Iceland;6;66-06N;022-40W;;;5;; 04;018;BIKF;Keflavikurflugvollur;;Iceland;6;63-58N;022-36W;63-58N;022-36W;52;54;P 04;025;----;Reykholar;;Iceland;6;65-27N;022-12W;;;11;; 04;027;----;Asgardur;;Iceland;6;65-14N;021-45W;;;10;; 04;030;BIRK;Reykjavik;;Iceland;6;64-08N;021-54W;;;54;61;P 04;034;----;Stafholtsey;;Iceland;6;64-37N;021-36W;;;14;; 04;038;----;Eyrarbakki;;Iceland;6;63-52N;021-09W;;;5;5; 04;041;----;Tannstadabakki;;Iceland;6;65-17N;021-06W;;;8;; 04;042;----;Hjardarland;;Iceland;6;64-15N;020-25W;;;101;; 04;044;----;Hella;;Iceland;6;63-50N;020-24W;;;20;; 04;045;----;Blonduos;;Iceland;6;65-40N;020-18W;;;23;22; 04;048;BIVM;Vestmannaeyjar;;Iceland;6;63-24N;020-17W;;;118;124;P 04;050;----;Haell;;Iceland;6;64-04N;020-15W;;;121;; 04;051;----;Hraun A Skaga;;Iceland;6;66-07N;020-07W;;;3;; 04;052;----;Basar;;Iceland;6;64-41N;019-29W;;;240;; 04;053;----;Bergstadir;;Iceland;6;65-42N;019-37W;;;43;43; 04;055;----;Nautabu;;Iceland;6;65-27N;019-22W;;;115;; 04;056;----;Hveravellir;;Iceland;6;64-52N;019-34W;;;641;642; 04;058;----;Vatnsskardsholar;;Iceland;6;63-25N;019-11W;;;20;; 04;059;----;Saudanesviti;;Iceland;6;66-11N;018-58W;;;30;; 04;062;----;Nordurhjaleiga;;Iceland;6;63-30N;018-23W;;;18;; 04;063;BIAR;Akureyri;;Iceland;6;65-41N;018-05W;;;23;27;P 04;064;----;Kirkjubaejarklaustur;;Iceland;6;63-47N;018-04W;;;32;38; 04;065;BIGR;Grimsey;;Iceland;6;66-32N;018-01W;;;15;16; 04;066;----;Versalir;;Iceland;6;64-27N;018-45W;;;610;; 04;069;----;Stadarholl;;Iceland;6;65-49N;017-12W;;;42;; 04;071;----;Manarbakki;;Iceland;6;66-12N;017-06W;;;17;; 04;072;----;Fagurholsmyri;;Iceland;6;63-53N;016-39W;;;46;; 04;073;----;Grimsstadir;;Iceland;6;65-38N;016-07W;;;384;386; 04;077;BIRG;Raufarhofn;;Iceland;6;66-27N;015-57W;;;8;8;P 04;080;----;Snaefellsskali;;Iceland;6;64-48N;015-38W;;;810;; 04;081;----;Saudanes;;Iceland;6;66-15N;015-16W;;;17;; 04;082;BIHN;Akurnes;;Iceland;6;64-18N;015-13W;;;17;21;P 04;085;BIVO;Skjaldthingsstadir;;Iceland;6;65-42N;014-49W;;;44;48; 04;087;----;Strandhofn;;Iceland;6;65-54N;014-39W;;;20;19; 04;089;BIEG;Egilsstadir;;Iceland;6;65-17N;014-24W;;;23;23; 04;091;----;Reydarfjordur;;Iceland;6;65-02N;014-14W;;;25;; 04;094;----;Nupur;;Iceland;6;64-42N;014-06W;;;25;; 04;097;----;Dalatangi;;Iceland;6;65-16N;013-35W;;;9;11;P 04;101;----;Bjargtangar;;Iceland;6;65-30N;024-31W;;;35;36; 04;103;----;Patreksfjordur;;Iceland;6;65-36N;024-00W;;;3;4; 04;104;----;Gufuskalar;;Iceland;6;64-54N;023-56W;;;6;7; 04;109;----;Thverfjall;;Iceland;6;66-03N;023-19W;;;752;753; 04;110;----;Navy Operated Automatic Meteorological Observing System ;;Greenland;6;72-17N;038-48W;;;3195;; 04;115;----;Dynjandiheidi;;Iceland;6;65-42N;023-05W;;;620;621; 04;119;----;Thingmannaheidi;;Iceland;6;65-38N;022-48W;;;298;299; 04;120;----;Grindavik;;Iceland;6;63-51N;022-25W;;;3;4; 04;124;----;Straumsvik;;Iceland;6;64-03N;022-20W;;;4;5; 04;126;----;Grundartangi;;Iceland;6;64-21N;021-47W;;;4;5; 04;130;----;Reykjavik;;Iceland;6;64-08N;021-54W;;;52;53; 04;131;----;Gjogur;;Iceland;6;65-59N;021-21W;;;31;32; 04;140;----;Thorlakshofn;;Iceland;6;63-51N;021-23W;;;4;5; 04;149;----;Kolka;;Iceland;6;65-24N;019-43W;;;504;505; 04;154;----;Burfell;;Iceland;6;64-05N;019-44W;;;248;249; 04;160;----;Thufuver;;Iceland;6;64-35N;018-36W;;;613;614; 04;161;----;Dalvik;;Iceland;6;65-58N;018-32W;;;3;4; 04;162;----;Veidivatnahraun;;Iceland;6;64-24N;018-30W;;;647;648; 04;165;----;Grimsey;;Iceland;6;66-32N;018-01W;;;16;17; 04;166;----;Jokulheimar;;Iceland;6;64-19N;018-13W;;;726;727; 04;168;----;Sandbudir;;Iceland;6;64-56N;017-59W;;;820;821; 04;170;----;Skardsfjoruviti;;Iceland;6;63-31N;017-59W;;;8;9; 04;180;----;Hvanney;;Iceland;6;64-14N;015-12W;;;4;5; 04;183;----;Fontur;;Iceland;6;66-23N;014-32W;;;43;44; 04;193;----;Gagnheidi;;Iceland;6;65-13N;014-16W;;;948;949; 04;196;----;Kambanes;;Iceland;6;64-48N;013-51W;;;34;; 04;197;----;Dalatangi;;Iceland;6;65-16N;013-35W;;;10;11; 04;201;----;Qaanaaq;;Greenland;6;77-28N;063-13W;;;16;19; 04;202;BGTL;Thule A. B.;;Greenland;6;76-32N;068-45W;76-32N;068-45W;77;77;P 04;203;----;Carey Isl.;;Greenland;6;76-38N;073-00W;;;11;11; 04;207;----;Hall Land;;Greenland;6;81-41N;059-57W;;;105;105; 04;208;----;Edderfugle Oeer;;Greenland;6;74-02N;057-49W;;;40;40; 04;210;----;Upernavik;;Greenland;6;72-47N;056-10W;;;120;122; 04;214;----;Nuussuaq;;Greenland;6;70-41N;054-37W;;;27;27; 04;220;BGEM;Egedesminde;;Greenland;6;68-42N;052-45W;68-42N;052-45W;43;41;P 04;221;BGJN;Jacobshavn Lufthavn;;Greenland;6;69-14N;051-04W;;;29;31; 04;228;----;Attu Kitsissut;;Greenland;6;67-47N;053-58W;;;12;12; 04;230;BGHB;Holsteinsborg;;Greenland;6;66-55N;053-40W;;;12;9;P 04;231;BGSF;Sdr Stroemfjord;;Greenland;6;67-01N;050-42W;67-00N;050-48W;50;53;P 04;242;----;Sioralik;;Greenland;6;65-01N;052-33W;;;14;14; 04;250;BGGH;Godthaab / Nuuk;;Greenland;6;64-10N;051-45W;;;80;70;P 04;253;----;Frederikshaab Isblink;;Greenland;6;62-34N;050-25W;;;22;22; 04;254;----;Godthaab Lufthavn;;Greenland;6;64-12N;051-41W;;;86;92; 04;260;BGFH;Frederikshaab;;Greenland;6;62-00N;049-40W;;;13;15;P 04;261;BGGD;Groennedal;;Greenland;6;61-14N;048-06W;;;35;32; 04;266;----;Nunarsuit;;Greenland;6;60-46N;048-25W;;;33;33; 04;270;BGBW;Narsarsuaq;;Greenland;6;61-10N;045-25W;61-11N;045-26W;34;32;P 04;272;BGJH;Julianehaab;;Greenland;6;60-43N;046-03W;;;32;34;P 04;285;BGAS;Angisoq;;Greenland;6;59-59N;045-12W;;;16;16; 04;301;----;Kap Morris Jesup;;Greenland;6;83-39N;033-22W;;;4;4; 04;305;----;Cape Harald Moltke;;Greenland;6;82-09N;029-55W;;;4;; 04;310;----;Nord;;Greenland;6;81-36N;016-39W;81-36N;016-40W;36;39; 04;312;----;Nord Aws;;Greenland;6;81-36N;016-39W;;;34;34; 04;313;----;Henrik Kroeyer Holme;;Greenland;6;80-39N;013-43W;;;10;10; 04;320;BGDH;Danmarkshavn;;Greenland;6;76-46N;018-40W;76-46N;018-40W;11;12;P 04;330;BGDB;Daneborg;;Greenland;6;74-18N;020-13W;;;44;44; 04;339;BGSC;Scoresbysund;;Greenland;6;70-29N;021-57W;70-29N;021-58W;65;69; 04;340;BGKT;Cape Tobin Automated Reporting Station ;;Greenland;6;70-25N;021-58W;70-25N;021-58W;41;41; 04;341;BGCO;Constable Pynt;;Greenland;6;70-45N;022-39W;;;14;10; 04;351;BGAT;Aputiteeq;;Greenland;6;67-47N;032-18W;;;13;12; 04;360;BGAM;Tasiilaq;;Greenland;6;65-36N;037-38W;65-36N;037-38W;50;52;P 04;361;BGKK;Kulusuk Lufthavn;;Greenland;6;65-35N;037-09W;;;35;37; 04;373;----;Ikermit;;Greenland;6;64-47N;040-18W;;;85;85; 04;382;----;Ikermiuarsuk;;Greenland;6;61-56N;042-04W;;;39;39; 04;390;BGPC;Prins Christian Sund;;Greenland;6;60-03N;043-10W;;;88;75; 06;009;----;Akraberg;;Denmark;6;61-24N;006-40W;;;99;102; 06;010;EKVG;Soervaag / Vagar;;Denmark;6;62-04N;007-17W;;;85;92; 06;011;----;Thorshavn;;Denmark;6;62-01N;006-46W;62-01N;006-46W;54;55;P 06;022;----;Tyra Oest;;Denmark;6;55-43N;004-48E;;;75;75; 06;024;EKTS;Thisted Lufthavn;;Denmark;6;57-04N;008-43E;;;7;7; 06;030;EKYT;Aalborg;;Denmark;6;57-06N;009-51E;57-06N;009-52E;3;13;P 06;034;EKSN;Sindal Flyveplads;;Denmark;6;57-30N;010-13E;;;28;28; 06;041;----;Skagen;;Denmark;6;57-44N;010-38E;;;3;10;P 06;043;----;Frederikshavn;;Denmark;6;57-24N;010-31E;;;83;80; 06;048;EKHS;Hadsund;;Denmark;6;56-43N;010-07E;;;2;2; 06;052;----;Thyboroen;;Denmark;6;56-42N;008-13E;;;2;9;P 06;053;----;Aggersund;;Denmark;6;57-00N;009-18E;;;6;; 06;054;EKHO;Lindtorp Airport;;Denmark;6;56-24N;008-27E;;;15;; 06;058;----;Hvide Sande;;Denmark;6;56-00N;008-08E;;;3;5;P 06;060;EKKA;Karup;;Denmark;6;56-18N;009-07E;;;52;53;P 06;062;EKSV;Skive Lufthavn;;Denmark;6;56-33N;009-10E;;;23;21; 06;066;EKVJ;Stauning Lufthavn;;Denmark;6;56-00N;008-21E;;;5;5; 06;069;----;Foulum;;Denmark;6;56-30N;009-35E;;;54;58; 06;070;EKAH;Tirstrup;;Denmark;6;56-18N;010-37E;;;23;25;P 06;071;----;Fornaes;;Denmark;6;56-27N;010-58E;;;8;10;P 06;078;EKAT;Anholt Island Automated Reporting Station ;;Denmark;6;56-42N;011-33E;;;8;; 06;079;----;Anholt;;Denmark;6;56-43N;011-31E;;;2;3; 06;080;EKEB;Esbjerg;;Denmark;6;55-32N;008-34E;;;30;29; 06;081;----;Blaavand;;Denmark;6;55-33N;008-05E;;;22;18; 06;096;----;Roemoe;;Denmark;6;55-11N;008-34E;;;4;11; 06;099;----;Roemoe Havneby;;Denmark;6;55-05N;008-34E;;;5;; 06;100;EKVA;Vandel;;Denmark;6;55-42N;009-12E;;;73;76; 06;104;EKBI;Billund Lufthavn;;Denmark;6;55-44N;009-10E;;;75;79;P 06;108;EKVD;Vamdrup;;Denmark;6;55-26N;009-20E;;;44;45; 06;110;EKSP;Skrydstrup;;Denmark;6;55-14N;009-16E;;;43;47;P 06;111;----;Baagoe;;Denmark;6;55-18N;009-48E;;;2;; 06;113;----;Toftlund;;Denmark;6;55-11N;009-04E;;;48;; 06;118;EKSB;Soenderborg Lufthavn;;Denmark;6;54-58N;009-47E;;;7;14; 06;119;----;Kegnaes;;Denmark;6;54-51N;009-59E;;;16;17;P 06;120;EKOD;Odense / Beldringe;;Denmark;6;55-29N;010-20E;;;17;17;P 06;124;EKST;Sydfyns Flyveplads;;Denmark;6;55-01N;010-34E;;;6;; 06;131;----;Vesborg;;Denmark;6;55-46N;010-33E;;;5;; 06;142;----;Albuen;;Denmark;6;54-50N;010-58E;;;2;4; 06;143;EKMB;Maribo Lufthavn;;Denmark;6;54-42N;011-27E;;;5;5; 06;149;----;Gedser Odde;;Denmark;6;54-34N;011-58E;;;8;8; 06;150;EKAV;Avno Danish Air Force Base ;;Denmark;6;55-05N;011-47E;;;4;; 06;151;----;Omoe;;Denmark;6;55-10N;011-08E;;;1;3; 06;153;----;Tyvelse;;Denmark;6;55-23N;011-43E;;;35;38; 06;156;----;Holbaek;;Denmark;6;55-43N;011-43E;;;15;; 06;159;----;Roesnaes;;Denmark;6;55-45N;010-52E;;;12;14; 06;160;EKVL;Vaerloese;;Denmark;6;55-46N;012-20E;;;18;31; 06;165;----;Hesseloe;;Denmark;6;56-12N;011-43E;;;8;12; 06;168;----;Nakkehoved;;Denmark;6;56-07N;012-21E;;;37;40; 06;169;----;Gniben;;Denmark;6;56-01N;011-17E;;;13;12; 06;170;EKRK;Koebenhavn / Roskilde;;Denmark;6;55-35N;012-08E;;;44;44; 06;173;----;Stevns;;Denmark;6;55-17N;031-24E;55-17N;012-27E;40;40; 06;179;----;Moen;;Denmark;6;54-57N;012-33E;;;14;16; 06;180;EKCH;Koebenhavn / Kastrup;;Denmark;6;55-37N;012-39E;55-38N;012-40E;5;5;P 06;181;----;Koebenhavn / Jaegersborg;;Denmark;6;55-46N;012-32E;55-46N;012-32E;40;42; 06;183;----;Drogden;;Denmark;6;55-32N;012-43E;;;0;; 06;186;----;Koebenhavn / Landbohoejskolen;;Denmark;6;55-41N;012-32E;;;9;; 06;190;EKRN;Roenne;;Denmark;6;55-04N;014-45E;;;16;16; 06;191;----;Christiansoe;;Denmark;6;55-19N;015-11E;;;13;17; 06;193;----;Hammer Odde;;Denmark;6;55-18N;014-47E;;;11;11; 06;210;EHVB;Valkenburg;;Netherlands;6;52-11N;004-25E;52-11N;004-25E;0;2; 06;225;----;Ijmuiden;;Netherlands;6;52-28N;004-35E;;;12;19; 06;229;----;Texelhors Wp;;Netherlands;6;53-00N;004-43E;;;0;; 06;235;EHKD;De Kooy;;Netherlands;6;52-55N;004-47E;;;0;14;P 06;239;----;F3;;Netherlands;6;54-51N;004-44E;;;0;49; 06;240;EHAM;Amsterdam Airport Schiphol;;Netherlands;6;52-18N;004-46E;;;-4;-2;P 06;241;----;Amsterdam Coenhaven Aws;;Netherlands;6;52-25N;004-52E;;;;0; 06;242;EHVL;Vlieland;;Netherlands;6;53-15N;004-55E;53-15N;004-55E;11;12; 06;244;----;Hoorn Aws;;Netherlands;6;52-39N;005-03E;;;-1;; 06;247;----;Bloemendaal;;Netherlands;6;52-25N;004-33E;;;18;0; 06;248;----;Wudenes;;Netherlands;6;52-38N;005-10E;;;1;0; 06;250;----;Terschelling;;Netherlands;6;53-22N;005-13E;;;26;15; 06;251;----;Terschelling Hoorn;;Netherlands;6;53-23N;005-21E;;;1;2; 06;252;----;K13-A;;Netherlands;6;53-13N;003-13E;;;30;30; 06;253;----;Auk-Alfa;;Netherlands;6;56-24N;002-04E;;;34;34; 06;254;----;Meetpost Noordwuk;;Netherlands;6;52-16N;004-18E;;;17;17; 06;255;----;Noordeluke Zeeraaf;;Netherlands;6;61-14N;001-09E;;;47;47; 06;260;EHDB;De Bilt;;Netherlands;6;52-06N;005-11E;52-06N;005-11E;2;15;P 06;265;EHSB;Soesterberg;;Netherlands;6;52-08N;005-17E;;;20;25; 06;267;----;Stavoren Aws;;Netherlands;6;52-53N;005-21E;;;3;; 06;268;----;Houtrib;;Netherlands;6;52-32N;005-26E;;;2;16; 06;269;EHLE;Lelystad;;Netherlands;6;52-27N;005-31E;;;0;; 06;270;EHLW;Leeuwarden;;Netherlands;6;53-13N;005-46E;;;1;11;P 06;273;----;Marknesse Aws;;Netherlands;6;52-42N;005-53E;;;-3;; 06;275;EHDL;Deelen;;Netherlands;6;52-04N;005-53E;;;48;52; 06;277;----;Lauwersoog Aws;;Netherlands;6;53-25N;006-12E;;;0;; 06;278;----;Heino Aws;;Netherlands;6;52-26N;006-16E;;;5;; 06;279;----;Hoogeveen Aws;;Netherlands;6;52-44N;006-31E;;;12;14; 06;280;EHGG;Groningen Airport Eelde;;Netherlands;6;53-08N;006-35E;;;4;4; 06;283;----;Hupsel Aws;;Netherlands;6;52-04N;006-39E;;;29;; 06;285;----;Huibertgat Wp;;Netherlands;6;53-34N;006-24E;;;0;; 06;286;----;Nieuw Beerta Aws;;Netherlands;6;53-12N;007-09E;;;0;; 06;290;EHTW;Twenthe;;Netherlands;6;52-16N;006-54E;52-16N;006-54E;35;57;P 06;308;----;Cadzand Wp;;Netherlands;6;51-23N;003-23E;;;7;; 06;310;----;Vlissingen;;Netherlands;6;51-27N;003-36E;;;8;10;P 06;312;----;Oosterschelde Wp;;Netherlands;6;51-41N;003-36E;;;0;; 06;316;----;Schaar Wp;;Netherlands;6;51-39N;003-42E;;;0;; 06;319;----;Westdorpe Aws;;Netherlands;6;51-32N;003-54E;;;2;; 06;320;----;Le Goeree;;Netherlands;6;51-56N;003-40E;;;19;19; 06;321;----;Euro Platform;;Netherlands;6;52-00N;003-17E;;;18;18; 06;323;----;Wilhelminadorp Aws;;Netherlands;6;51-32N;003-54E;;;1;; 06;330;----;Hoek Van Holland;;Netherlands;6;51-59N;004-06E;;;7;13; 06;331;----;Tholen Wp;;Netherlands;6;51-31N;004-08E;;;0;; 06;340;EHWO;Woensdrecht;;Netherlands;6;51-27N;004-20E;51-27N;004-20E;20;17; 06;343;----;Rotterdam Geulhaven Aws;;Netherlands;6;51-53N;004-19E;;;4;; 06;344;EHRD;Rotterdam Airport Zestienhoven;;Netherlands;6;51-57N;004-27E;;;-5;-4; 06;348;----;Cabauw Tower;;Netherlands;6;51-58N;004-56E;;;0;2; 06;350;EHGR;Gilze-Rijen;;Netherlands;6;51-34N;004-56E;;;15;24; 06;356;----;Herwijnen Aws;;Netherlands;6;51-52N;005-09E;;;1;; 06;370;EHEH;Eindhoven;;Netherlands;6;51-27N;005-25E;;;23;28; 06;375;EHVK;Volkel;;Netherlands;6;51-39N;005-42E;;;22;21;P 06;379;----;Oost Maarland Aws;;Netherlands;6;50-48N;005-43E;;;49;; 06;380;EHBK;Maastricht Airport Zuid Limburg;;Netherlands;6;50-55N;005-47E;;;114;116; 06;391;----;Arcen Aws;;Netherlands;6;51-30N;006-12E;;;19;; 06;400;EBFN;Koksijde;;Belgium;6;51-05N;002-39E;;;4;9;P 06;407;EBOS;Oostende Airport ;;Belgium;6;51-12N;002-52E;;;4;5;P 06;408;----;Oostende Pier ;;Belgium;6;51-14N;002-55E;;;12;15;P 06;428;EBMT;Munte;;Belgium;6;50-56N;003-44E;;;55;60;P 06;431;EBGT;Gent / Industrie-Zone;;Belgium;6;51-11N;003-49E;;;10;13;P 06;432;EBCV;Chievres;;Belgium;6;50-34N;003-50E;;;60;63;P 06;447;----;Uccle;;Belgium;6;50-48N;004-21E;50-48N;004-21E;100;104;P 06;448;EBMB;Melsbroek Bel-Afb ;;Belgium;6;50-54N;004-30E;;;55;; 06;449;EBCI;Charleroi / Gosselies;;Belgium;6;50-28N;004-27E;;;187;192;P 06;450;EBAW;Antwerpen / Deurne;;Belgium;6;51-12N;004-28E;;;12;14;P 06;451;EBBR;Bruxelles National;;Belgium;6;50-54N;004-32E;50-54N;004-28E;55;58;P 06;452;EBBT;Brasschaat;;Belgium;6;51-20N;004-30E;;;22;23;P 06;456;EBFS;Florennes;;Belgium;6;50-14N;004-39E;;;279;299;P 06;458;EBBE;Beauvechain;;Belgium;6;50-45N;004-46E;;;105;127;P 06;462;EBWE;Weelde Military ;;Belgium;6;51-25N;005-00E;;;60;; 06;463;EBTN;Goetsenhoven;;Belgium;6;50-47N;004-57E;;;71;81;P 06;465;EBDT;Schaffen;;Belgium;6;51-00N;005-04E;;;30;54; 06;467;EBBX;Bertrix Bel-Afb ;;Belgium;6;49-54N;005-13E;;;461;; 06;470;EBST;Sint-Truiden;;Belgium;6;50-48N;005-12E;;;74;75;P 06;473;----;Sinsin;;Belgium;6;50-16N;005-15E;;;243;244; 06;476;EBSU;St-Hubert;;Belgium;6;50-02N;005-24E;50-02N;005-24E;563;557;P 06;478;EBLG;Bierset;;Belgium;6;50-39N;005-27E;;;186;178;P 06;479;EBBL;Kleine Brogel;;Belgium;6;51-10N;005-28E;51-10N;005-28E;55;64;P 06;480;----;Meix-Devant-Virton;;Belgium;6;49-36N;005-29E;;;250;252; 06;481;EBZW;Genk;;Belgium;6;50-56N;005-30E;;;61;63;P 06;490;EBSP;Spa / La Sauveniere;;Belgium;6;50-29N;005-55E;;;470;482;P 06;496;EBLB;Elsenborn;;Belgium;6;50-28N;006-11E;50-28N;006-11E;564;570;P 06;585;----;Clervaux;;Luxembourg;6;50-03N;006-01E;;;;454; 06;589;----;Luxembourg Beggen ;;Luxembourg;6;49-39N;006-08E;;;;235; 06;590;ELLX;Luxembourg / Luxembourg;;Luxembourg;6;49-37N;006-13E;49-37N;006-13E;376;379;P 06;597;----;Echternach;;Luxembourg;6;49-48N;006-27E;;;;244; 06;604;LSGN;Neuchatel;;Switzerland;6;47-00N;006-57E;;;485;487; 06;610;LSMP;Payerne;;Switzerland;6;46-49N;006-57E;46-49N;006-57E;490;491;P 06;612;----;La Chaux-De-Fonds;;Switzerland;6;47-05N;006-48E;;;1018;1019; 06;616;----;Fahy;;Switzerland;6;47-26N;006-57E;;;596;597; 06;628;----;Plaffeien-Oberschrot;;Switzerland;6;46-45N;007-16E;;;1042;1041; 06;630;----;Bern-Belp;;Switzerland;6;46-55N;007-30E;;;510;505; 06;632;LSZG;Grenchen;;Switzerland;6;47-10-53N;007-24-59E;;;430;; 06;639;----;Napf;;Switzerland;6;47-00N;007-56E;;;1407;1406; 06;642;----;Langenbruck;;Switzerland;6;47-21N;007-46E;;;735;; 06;643;----;Wynau;;Switzerland;6;47-15N;007-47E;;;422;416; 06;649;----;Laufenburg;;Switzerland;6;47-33N;008-03E;;;322;; 06;652;----;Mettlen;;Switzerland;6;47-07N;008-20E;;;417;; 06;653;----;Beromuenster;;Switzerland;6;47-12N;008-10E;;;693;; 06;654;----;Brugg-Wildegg;;Switzerland;6;47-28N;008-10E;;;350;; 06;657;----;Giswil;;Switzerland;6;46-49N;008-10E;;;489;; 06;658;----;Buochs;;Switzerland;6;46-59N;008-23E;;;442;; 06;660;----;Zurich Town / Ville.;;Switzerland;6;47-23N;008-34E;;;556;569; 06;661;----;Albis;;Switzerland;6;47-17N;008-31E;;;923;; 06;662;----;Trasadingen;;Switzerland;6;47-40N;008-26E;;;402;; 06;669;----;Laegern;;Switzerland;6;47-29N;008-24E;;;868;; 06;670;LSZH;Zurich-Kloten;;Switzerland;6;47-29N;008-32E;;;436;432;P 06;672;----;Altdorf;;Switzerland;6;46-52N;008-38E;;;449;451; 06;680;----;Saentis;;Switzerland;6;47-15N;009-21E;;;2490;2500; 06;681;----;Saint Gallen;;Switzerland;6;47-26N;009-24E;;;779;791; 06;684;----;Weesen;;Switzerland;6;47-08N;009-06E;;;423;; 06;689;----;Hoernli;;Switzerland;6;47-22N;008-57E;;;1144;; 06;690;----;Altenrhein-Flugplatz;;Switzerland;6;47-29N;009-23E;;;398;; 06;691;LSZR;Saint Gallen-Altenrhein;;Switzerland;6;47-29-06N;009-33-43E;;;398;; 06;700;LSGG;Geneve-Cointrin;;Switzerland;6;46-15N;006-08E;;;420;416;P 06;702;----;La Dole;;Switzerland;6;46-26N;006-06E;;;1670;1675; 06;703;----;La Cure;;Switzerland;6;46-28N;006-05E;;;1170;; 06;710;LSGL;Lausanne;;Switzerland;6;46-33N;006-37E;;;616;615; 06;712;----;Aigle;;Switzerland;6;46-20N;006-55E;;;381;383; 06;718;----;Savatan;;Switzerland;6;46-12N;007-01E;;;665;; 06;719;----;Le Grand Saint-Bernard Douane;;Switzerland;6;45-52N;007-10E;;;2460;; 06;720;LSGS;Sion;;Switzerland;6;46-13N;007-20E;;;482;481;P 06;721;----;Fionnay;;Switzerland;6;46-02N;007-19E;;;1500;; 06;724;----;Montana;;Switzerland;6;46-19N;007-29E;;;1508;1508; 06;726;----;Gemmi;;Switzerland;6;46-24N;007-37E;;;2342;; 06;730;----;Jungfraujoch;;Switzerland;6;46-33N;007-59E;;;3580;3576; 06;731;----;Wimmis;;Switzerland;6;46-46N;007-39E;;;630;; 06;734;----;Interlaken;;Switzerland;6;46-40N;007-52E;;;580;579; 06;742;----;Simplon;;Switzerland;6;46-15N;008-02E;;;2008;; 06;743;----;Ernen;;Switzerland;6;46-24N;008-08E;;;1000;; 06;750;----;Guetsch;;Switzerland;6;46-39N;008-37E;46-39N;008-37E;2287;2284;P 06;753;----;Piotta;;Switzerland;6;46-31N;008-41E;;;1007;1016; 06;756;----;Comprovasco;;Switzerland;6;46-28N;008-56E;;;575;552; 06;759;----;Cimetta;;Switzerland;6;46-12N;008-48E;;;1672;1648; 06;760;----;Locarno-Monti;;Switzerland;6;46-10N;008-47E;;;366;380; 06;762;----;Locarno-Magadino;;Switzerland;6;46-10N;008-53E;;;197;198;P 06;770;LSZA;Lugano;;Switzerland;6;46-00N;008-58E;;;273;276; 06;771;----;Stabio;;Switzerland;6;45-51N;008-56E;;;353;356; 06;775;----;Lugano-Agno;;Switzerland;6;46-00N;008-54E;;;279;; 06;781;----;Tavanasa;;Switzerland;6;46-45N;009-03E;;;800;; 06;782;----;Disentis;;Switzerland;6;46-42N;008-51E;;;1190;1180; 06;783;----;San Bernardino;;Switzerland;6;46-28N;009-11E;;;1639;1638; 06;786;----;Chur-Ems;;Switzerland;6;46-52N;009-32E;;;555;556; 06;789;----;Loebbia;;Switzerland;6;46-23N;009-40E;;;1420;1421; 06;790;----;St. Moritz;;Switzerland;6;46-30N;009-51E;;;1850;; 06;791;----;Corvatsch;;Switzerland;6;46-25N;009-49E;;;3315;3299; 06;792;----;Samedam-Flugplatz;;Switzerland;6;46-32N;009-53E;;;1705;1706; 06;794;----;Robbia;;Switzerland;6;46-21N;010-04E;;;1078;1078; 06;990;----;Vaduz;;Liechtenstein;6;47-08N;009-31E;;;460;463;P 07;002;----;Boulogne;;France;6;50-44N;001-36E;50-44N;001-36E;70;74;P 07;003;LFAT;Le Touquet;;France;6;50-31N;001-37E;;;10;14;P 07;005;LFOI;Abbeville;;France;6;50-08N;001-50E;50-08N;001-50E;74;77;P 07;010;----;Dunkerque;;France;6;51-03N;002-20E;51-03N;002-20E;6;23;P 07;015;LFQQ;Lille;;France;6;50-34N;003-06E;50-34N;003-06E;48;52;P 07;017;LFQI;Cambrai;;France;6;50-13N;003-09E;;;78;77;P 07;019;----;Barfleur Point ;;France;6;49-42N;001-16W;;;7;; 07;020;----;La Hague;;France;6;49-43N;001-56W;;;3;9;P 07;022;----;Vigite Du Haumet;;France;6;49-39N;001-30W;;;130;; 07;024;LFRC;Cherbourg / Maupertus;;France;6;49-39N;001-28W;49-39N;001-28W;138;139; 07;027;LFRK;Caen;;France;6;49-11N;000-27W;;;78;67;P 07;028;LFOH;La Heve;;France;6;49-31N;000-04E;;;100;103;P 07;029;----;Port En Bessin;;France;6;49-21N;000-46W;;;63;73;P 07;031;----;Deauville;;France;6;49-22N;000-10E;;;146;147; 07;033;LFOS;Vittefleur / St. Vale;;France;6;49-50N;000-39E;;;83;; 07;034;----;Carteret;;France;6;49-22N;001-48W;;;61;65;P 07;037;LFOP;Rouen;;France;6;49-23N;001-11E;49-23N;001-11E;157;157;P 07;038;LFOE;Evreux;;France;6;49-01N;001-13E;;;141;146;P 07;039;----;Valognes;;France;6;49-31N;001-30W;;;61;; 07;040;----;Dieppe;;France;6;49-56N;001-06E;;;33;34;P 07;055;LFOB;Beauvais;;France;6;49-28N;002-07E;;;109;111;P 07;057;LFPC;Creil Fafb ;;France;6;49-15N;002-31E;;;88;; 07;061;LFOW;Saint-Quentin;;France;6;49-49N;003-12E;49-49N;003-12E;98;101;P 07;070;LFSR;Reims;;France;6;49-18N;004-02E;49-18N;004-02E;95;99;P 07;075;LFQV;Charleville;;France;6;49-47N;004-38E;;;149;150;P 07;090;LFSF;Metz / Frescaty;;France;6;49-05N;006-08E;;;190;191;P 07;093;LFJL;Metz-Nancy-Lorraine;;France;6;48-59N;006-15E;;;264;; 07;100;----;Ouessant;;France;6;48-28N;005-08W;;;35;32;P 07;103;----;Pointe Du Raz;;France;6;48-02N;004-44W;;;72;86;P 07;106;LFRJ;Landivisiau;;France;6;48-31N;004-09W;;;106;115;P 07;107;----;Brignogan;;France;6;48-41N;004-20W;;;20;22;P 07;109;LFRL;Lanveoc Poulmic;;France;6;48-17N;004-26W;;;87;82;P 07;110;LFRB;Brest;;France;6;48-27N;004-25W;48-27N;004-25W;99;103;P 07;116;----;Ile De Batz;;France;6;48-45N;004-01W;;;27;37;P 07;120;LFRT;Saint-Brieuc;;France;6;48-32N;002-51W;;;138;136;P 07;121;----;Brehat;;France;6;48-51N;003-00W;;;25;36;P 07;125;LFRD;Dinard;;France;6;48-35N;002-04W;;;65;60; 07;127;----;Grouin De Cancale;;France;6;48-43N;001-51W;;;40;41;P 07;130;LFRN;Rennes;;France;6;48-04N;001-44W;48-04N;001-44W;37;37;P 07;133;----;Pointe Du Roc;;France;6;48-50N;001-37W;;;37;42;P 07;134;----;Laval;;France;6;48-02N;000-44W;;;100;101;P 07;139;LFOF;Alencon;;France;6;48-27N;000-07E;48-27N;000-07E;144;141;P 07;140;LFOC;Chateaudun;;France;6;48-03N;001-23E;;;134;127;P 07;143;LFOR;Chartres;;France;6;48-28N;001-31E;;;155;156;P 07;145;----;Trappes;;France;6;48-46N;002-01E;48-46N;002-01E;168;168;P 07;146;LFPN;Toussus Le Noble;;France;6;48-46N;001-06E;;;164;161;P 07;147;LFPV;Villacoublay;;France;6;48-46N;002-12E;;;177;179;P 07;148;----;Bretigny;;France;6;48-36N;002-20E;;;82;80;P 07;149;LFPO;Paris-Orly;;France;6;48-44N;002-24E;48-44N;002-24E;89;96;P 07;150;LFPB;Paris / Le Bourget;;France;6;48-58N;002-27E;;;66;65;P 07;153;LFPM;Melun;;France;6;48-37N;002-41E;;;95;92;P 07;156;----;Paris-Montsouris;;France;6;48-49N;002-20E;;;75;77;P 07;157;LFPG;Paris-Aeroport Charles De Gaulle;;France;6;49-01N;002-32E;;;118;109;P 07;168;LFQB;Troyes;;France;6;48-20N;004-01E;;;118;118;P 07;169;LFSI;St-Dizier;;France;6;48-38N;004-54E;;;139;140;P 07;172;----;Loxeville;;France;6;48-45N;005-24E;;;313;316;P 07;173;----;Epinal;;France;6;48-12N;006-26E;;;317;317; 07;179;LFSL;Toul / Rosieres;;France;6;48-47N;005-29E;;;285;298;P 07;180;LFSN;Nancy / Essey;;France;6;48-41N;006-13E;48-41N;006-13E;225;217;P 07;181;LFSO;Nancy / Ochey;;France;6;48-35N;005-58E;;;336;350;P 07;182;----;Rechicourt;;France;6;48-43N;006-35E;;;285;; 07;190;LFST;Strasbourg;;France;6;48-33N;007-38E;;;153;154;P 07;197;LFSC;Colmar;;France;6;47-55N;007-24E;;;211;217;P 07;200;----;Penmarch;;France;6;47-48N;004-22W;;;6;22;P 07;201;LFRQ;Quimper;;France;6;47-58N;004-10W;;;92;94;P 07;203;----;Beg Melen;;France;6;47-39N;003-30W;;;47;54;P 07;205;LFRH;Lann Bihoue;;France;6;47-46N;003-27W;;;52;44;P 07;207;----;Le Talut;;France;6;47-18N;003-13W;;;37;43;P 07;210;----;Vannes;;France;6;47-38N;002-45W;;;11;11; 07;217;LFRZ;St-Nazaire;;France;6;47-19N;002-10W;;;3;4;P 07;222;LFRS;Nantes;;France;6;47-10N;001-36W;47-10N;001-36W;27;27;P 07;230;LFRA;Angers;;France;6;47-30N;000-34W;;;57;58;P 07;235;LFRM;Le Mans;;France;6;47-56N;000-12E;;;59;52;P 07;240;LFOT;Tours;;France;6;47-27N;000-43E;47-27N;000-43E;108;112;P 07;247;LFYR;Romorantin;;France;6;47-19N;001-41E;;;85;86;P 07;249;LFOJ;Orleans;;France;6;47-59N;001-45E;47-59N;001-45E;126;125;P 07;255;LFLD;Bourges;;France;6;47-04N;002-22E;47-04N;002-22E;161;166;P 07;257;----;Avord;;France;6;47-03N;002-39E;;;175;179;P 07;260;LFQG;Nevers;;France;6;47-00N;003-06E;;;180;181;P 07;265;LFLA;Auxerre;;France;6;47-48N;003-33E;47-48N;003-33E;207;212;P 07;270;----;Chateau-Chinon Automated Reporting Station ;;France;6;47-04N;003-56E;;;605;; 07;276;LFQH;Chatillon-Sur-Seine;;France;6;47-51N;004-33E;;;264;; 07;280;LFSD;Dijon;;France;6;47-16N;005-05E;47-16N;005-05E;222;227;P 07;283;----;Langres;;France;6;47-50N;005-19E;;;464;462;P 07;288;LFSA;Besancon;;France;6;47-15N;005-59E;;;307;309;P 07;292;LFSX;Luxeuil;;France;6;47-47N;006-21E;;;278;273;P 07;295;LFSQ;Belfort;;France;6;47-38N;006-52E;;;422;423;P 07;299;LFSB;Bale-Mulhouse;;France;6;47-36N;007-31E;;;270;271;P 07;300;----;St-Sauveur;;France;6;46-42N;002-20W;;;32;48;P 07;306;LFRI;La Roche-Sur-Yon;;France;6;46-42N;001-23W;;;90;91;P 07;314;----;Chassiron;;France;6;46-02N;001-25W;;;11;22;P 07;315;LFBH;La Rochelle;;France;6;46-09N;001-09W;;;4;10;P 07;330;LFBN;Niort;;France;6;46-19N;000-24W;;;61;61;P 07;335;LFBI;Poitiers;;France;6;46-35N;000-19E;46-35N;000-19E;129;120;P 07;354;LFLX;Chateauroux;;France;6;46-51N;001-43E;;;160;157;P 07;374;LFLV;Vichy;;France;6;46-10N;003-24E;;;249;251;P 07;379;LFLN;Saint-Yan;;France;6;46-25N;004-01E;;;242;244;P 07;382;----;Mont Saint Vincent;;France;6;46-39N;004-26E;46-39N;004-26E;603;602; 07;385;LFLM;Macon;;France;6;46-18N;004-48E;46-18N;004-48E;221;217;P 07;390;----;Lons-Le-Saunier;;France;6;46-41N;005-31E;;;280;280; 07;394;----;Morbier;;France;6;46-34N;006-02E;;;928;928; 07;400;----;La Coubre;;France;6;45-42N;001-14W;;;6;7;P 07;412;LFBG;Cognac;;France;6;45-40N;000-19W;45-40N;000-19W;30;31;P 07;428;LFBX;Perigueux;;France;6;45-12N;000-49E;;;100;97; 07;434;LFBL;Limoges;;France;6;45-52N;001-11E;45-52N;001-11E;396;402;P 07;438;LFBV;Brive;;France;6;45-09N;001-28E;;;111;117;P 07;460;LFLC;Clermont-Ferrand;;France;6;45-47N;003-10E;45-47N;003-10E;332;330;P 07;471;LFHP;Le Puy;;France;6;45-05N;003-46E;;;832;833;P 07;475;LFMH;St-Etienne Boutheon;;France;6;45-32N;004-18E;;;404;402;P 07;477;----;Les Sauvages Automated Reporting Station ;;France;6;45-56N;004-23E;;;730;; 07;480;LFLY;Lyon / Bron;;France;6;45-43N;004-57E;45-43N;004-57E;200;201;P 07;481;LFLL;Lyon / Satolas;;France;6;45-44N;005-05E;45-44N;005-05E;248;240;P 07;482;LFXA;Amberieu;;France;6;45-59N;005-20E;;;250;257;P 07;486;LFLS;Grenoble / St. Geoirs;;France;6;45-22N;005-20E;;;384;386;P 07;491;LFLB;Chambery / Aix-Les-Bains;;France;6;45-39N;005-53E;;;235;239;P 07;496;----;Modane Avrieux;;France;6;45-13N;006-43E;;;1102;1104; 07;497;----;Bourg-St-Maurice;;France;6;45-37N;006-46E;;;865;868;P 07;500;----;Cap Ferret;;France;6;44-38N;001-15W;;;9;10;P 07;502;LFBC;Cazaux;;France;6;44-32N;001-08W;44-32N;001-08W;25;33;P 07;503;LFBS;Biscarosse;;France;6;44-26N;001-15W;44-26N;001-15W;33;39;P 07;510;LFBD;Bordeaux / Merignac;;France;6;44-50N;000-42W;44-50N;000-42W;49;61;P 07;524;LFBA;Agen;;France;6;44-11N;000-36E;;;61;60;P 07;530;LFBE;Bergerac;;France;6;44-49N;000-31E;;;51;52;P 07;535;----;Gourdon;;France;6;44-45N;001-24E;44-45N;001-24E;259;264;P 07;549;LFLW;Aurillac;;France;6;44-54N;002-25E;;;640;639;P 07;552;LFCR;Rodez;;France;6;44-24N;002-29E;;;581;580; 07;554;----;Mende;;France;6;44-32N;003-27E;;;932;934; 07;555;LFIG;Cassagnes-Begonhes;;France;6;44-11N;002-31E;;;1020;; 07;558;----;Millau;;France;6;44-07N;003-01E;44-07N;003-01E;715;720;P 07;560;----;Mont Aigoual;;France;6;44-07N;003-35E;;;1567;1565;P 07;577;LFLQ;Montelimar;;France;6;44-35N;004-44E;44-35N;004-44E;73;74;P 07;579;LFMO;Orange;;France;6;44-08N;004-50E;;;60;55;P 07;586;----;Carpentras;;France;6;44-05N;005-03E;;;99;105;P 07;587;----;Lus-La-Croix-Haute;;France;6;44-41N;005-43E;;;1059;1061;P 07;588;LFMX;St-Auban-Sur-Durance;;France;6;44-04N;006-00E;44-04N;006-00E;460;461;P 07;591;----;Embrun;;France;6;44-34N;006-30E;44-34N;006-30E;871;876;P 07;593;----;Briancon;;France;6;44-55N;006-39E;;;1328;1336; 07;600;----;Socoa;;France;6;43-24N;001-41W;;;24;47;P 07;602;LFBZ;Biarritz;;France;6;43-28N;001-32W;43-28N;001-32W;75;71;P 07;603;LFBY;Dax;;France;6;43-41N;001-04W;43-41N;001-04W;32;32;P 07;607;LFBM;Mont-De-Marsan;;France;6;43-55N;000-30W;43-55N;000-30W;62;63;P 07;610;LFBP;Pau;;France;6;43-23N;000-25W;;;188;185;P 07;621;LFBT;Tarbes Ossun Lourdes;;France;6;43-11N;000-00W;;;379;363;P 07;622;LFDH;Auch;;France;6;43-41N;000-36E;;;125;128;P 07;627;LFCG;St-Girons;;France;6;43-00N;001-06E;43-00N;001-06E;414;412;P 07;630;LFBO;Toulouse / Blagnac;;France;6;43-38N;001-22E;43-38N;001-22E;152;153;P 07;631;LFBF;Toulouse / Francazal;;France;6;43-32N;001-22E;;;164;166;P 07;632;LFCI;Albi;;France;6;43-55N;002-07E;;;172;178;P 07;635;LFMK;Carcassonne;;France;6;43-13N;002-19E;43-13N;002-19E;130;130;P 07;641;----;Sete;;France;6;43-24N;003-41E;;;80;81;P 07;643;LFMT;Montpellier;;France;6;43-35N;003-58E;;;5;6;P 07;645;LFME;Nimes / Courbessac;;France;6;43-52N;004-24E;43-52N;004-24E;60;62;P 07;646;LFTW;Nimes / Garons;;France;6;43-45N;004-25E;;;94;96;P 07;647;LFMI;Istres;;France;6;43-31N;004-56E;;;23;24;P 07;648;LFMY;Salon;;France;6;43-36N;005-06E;;;59;60;P 07;649;LFMA;Aix Les Milles;;France;6;43-30N;005-22E;;;111;111;P 07;650;LFML;Marseille / Marignane;;France;6;43-27N;005-14E;43-27N;005-13E;6;36;P 07;652;----;Cap Pomegues;;France;6;43-16N;005-18E;;;70;73;P 07;653;----;Cap Couronne;;France;6;43-20N;005-03E;;;27;35;P 07;656;----;Bec De L'Aigle;;France;6;43-11N;005-35E;;;315;332;P 07;660;----;Toulon;;France;6;43-06N;005-56E;43-06N;005-56E;24;27;P 07;661;----;Cap Cepet;;France;6;43-05N;005-56E;;;126;136;P 07;667;LFTH;Hyeres;;France;6;43-06N;006-09E;;;3;4;P 07;670;----;Porquerolles;;France;6;43-00N;006-14E;;;143;147;P 07;675;LFMC;Le Luc;;France;6;43-23N;006-23E;;;80;78;P 07;677;----;Cap Camarat;;France;6;43-12N;006-41E;;;110;112;P 07;678;----;Toulon / Ile Du Levant;;France;6;43-02N;006-28E;;;110;131;P 07;680;LFTU;St-Raphael;;France;6;43-25N;006-45E;43-25N;006-45E;2;6;P 07;684;LFMD;Cannes;;France;6;43-33N;006-57E;;;3;9;P 07;688;----;La Garoupe;;France;6;43-34N;007-08E;;;74;82;P 07;690;LFMN;Nice;;France;6;43-39N;007-12E;43-39N;007-12E;4;10;P 07;695;----;Cap Ferrat;;France;6;43-41N;007-20E;;;138;144;P 07;738;----;Les Escaldes;;France;6;42-29N;001-59E;;;1420;1432; 07;740;----;Ste Leocadie;;France;6;42-27N;002-00E;;;1320;1328; 07;747;LFMP;Perpignan;;France;6;42-44N;002-52E;42-44N;002-52E;43;48;P 07;749;----;Cap Bear;;France;6;42-31N;003-08E;;;82;86;P 07;752;----;La Parata;;France;6;41-55N;008-37E;;;40;; 07;753;----;Ile Rousse;;France;6;42-38N;008-55E;;;120;129;P 07;754;LFKC;Calvi;;France;6;42-32N;008-48E;;;64;58;P 07;761;LFKJ;Ajaccio;;France;6;41-55N;008-48E;41-55N;008-48E;6;9;P 07;765;LFKS;Solenzara;;France;6;41-55N;009-24E;41-55N;009-24E;8;22;P 07;768;----;La Chiappa;;France;6;41-36N;009-22E;;;62;68;P 07;770;----;Pertusato;;France;6;41-22N;009-11E;;;105;110;P 07;780;LFKF;Figari;;France;6;41-30N;009-06E;;;26;23;P 07;785;----;Cap Corse;;France;6;43-00N;009-22E;;;108;111;P 07;790;LFKB;Bastia;;France;6;42-33N;009-29E;42-33N;009-29E;8;12;P 07;791;----;Cap Sagro;;France;6;42-48N;009-29E;;;111;120;P 08;001;----;La Coruna;;Spain;6;43-22N;008-25W;43-22N;008-25W;58;67;P 08;002;LECO;La Coruna / Alvedro;;Spain;6;43-18N;008-23W;43-18N;008-23W;97;103; 08;003;----;Montefaro;;Spain;6;43-27N;008-17W;;;240;244; 08;005;----;El Ferrol;;Spain;6;43-29N;008-14W;;;6;9; 08;008;----;Lugo / Rozas;;Spain;6;43-07N;007-27W;;;445;446;P 08;011;LEAS;Asturias / Aviles;;Spain;6;43-33N;006-02W;;;127;130; 08;014;----;Gijon;;Spain;6;43-32N;005-38W;;;3;10; 08;015;----;Oviedo;;Spain;6;43-21N;005-52W;43-21N;005-52W;335;339;P 08;021;LEXJ;Santander / Parayas;;Spain;6;43-26N;003-49W;;;6;9; 08;023;----;Santander;;Spain;6;43-28N;003-49W;43-28N;003-49W;64;65;P 08;025;LEBB;Bilbao / Sondica;;Spain;6;43-18N;002-56W;;;42;37;P 08;027;----;San Sebastian / Igueldo;;Spain;6;43-18N;002-03W;;;258;259;P 08;029;LESO;San Sebastian / Fuenterrabia;;Spain;6;43-21N;001-48W;;;5;8; 08;042;LEST;Santiago / Labacolla;;Spain;6;42-54N;008-26W;;;370;367;P 08;043;----;Marin;;Spain;6;42-24N;008-42W;;;3;14; 08;044;----;Pontevedra;;Spain;6;42-26N;008-37W;;;108;108; 08;045;LEVX;Vigo / Peinador;;Spain;6;42-13N;008-38W;;;264;255;P 08;046;----;Vigo;;Spain;6;42-14N;008-45W;;;82;85; 08;048;----;Orense;;Spain;6;42-20N;007-52W;;;128;147; 08;053;----;Ponferrada;;Spain;6;42-32N;006-35W;;;550;555; 08;055;LELN;Leon / Virgen Del Camino;;Spain;6;42-35N;005-39W;42-35N;005-39W;926;914;P 08;075;LEBG;Burgos / Villafria;;Spain;6;42-22N;003-38W;;;894;891;P 08;080;LEVT;Vitoria;;Spain;6;42-53N;002-43W;;;513;510; 08;084;LELO;Logrono / Agoncillo;;Spain;6;42-27N;002-20W;42-27N;002-20W;353;363;P 08;085;LEPP;Pamplona / Noain;;Spain;6;42-46N;001-38W;;;459;453; 08;087;----;Bardenas Reales;;Spain;6;42-12N;001-27W;;;295;; 08;094;----;Huesca / Monflorite;;Spain;6;42-05N;000-20W;;;542;554; 08;112;----;Talar;;Spain;6;42-12N;000-52E;;;800;800; 08;117;----;La Molina;;Spain;6;42-20N;001-56E;;;1704;1702; 08;130;----;Zamora;;Spain;6;41-30N;005-45W;;;654;660; 08;140;LEVD;Valladolid / Villanubla;;Spain;6;41-43N;004-51W;41-43N;004-51W;849;846;P 08;141;----;Valladolid;;Spain;6;41-39N;004-46W;;;734;739; 08;148;----;Soria;;Spain;6;41-46N;002-28W;;;1082;1083; 08;157;----;Daroca;;Spain;6;41-07N;001-25W;;;779;779; 08;160;LEZG;Zaragoza / Aeropuerto;;Spain;6;41-40N;001-01W;41-40N;001-01W;263;258;P 08;171;----;Lerida;;Spain;6;41-37N;000-38E;;;203;199; 08;175;LERS;Reus / Aeropuerto;;Spain;6;41-09N;001-10E;;;71;76; 08;181;LEBL;Barcelona / Aeropuerto;;Spain;6;41-17N;002-04E;41-17N;002-04E;4;6;P 08;184;LEGE;Gerona / Costa Brava;;Spain;6;41-54N;002-46E;;;143;129; 08;202;LESA;Salamanca / Matacan;;Spain;6;40-57N;005-30W;40-57N;005-30W;793;795;P 08;210;----;Avila;;Spain;6;40-39N;004-42W;;;1130;1131; 08;213;----;Segovia;;Spain;6;40-57N;004-07W;;;1005;1006; 08;215;----;Navacerrada;;Spain;6;40-47N;004-01W;;;1894;1888; 08;219;LECV;Madri-Colmenar;;Spain;6;40-39N;003-44W;;;;; 08;220;----;Madrid / C. Universitaria;;Spain;6;40-27N;003-43W;;;664;669; 08;221;LEMD;Madrid / Barajas;;Spain;6;40-27N;003-33W;40-30N;003-35W;609;582;P 08;222;----;Madrid;;Spain;6;40-25N;003-41W;40-25N;003-41W;655;655; 08;223;LEVS;Madrid / Cuatro Vientos;;Spain;6;40-23N;003-47W;;;690;687; 08;224;LEGT;Madrid / Getafe;;Spain;6;40-18N;003-43W;;;620;617; 08;226;----;Guadalajara;;Spain;6;40-40N;003-10W;;;639;640; 08;227;LETO;Madrid / Torrejon;;Spain;6;40-29N;003-27W;;;607;611; 08;231;----;Cuenca;;Spain;6;40-04N;002-08W;;;955;956; 08;232;----;Molina De Aragon;;Spain;6;40-51N;001-53W;;;1056;1063; 08;233;LECH;Calamocha;;Spain;6;40-56N;001-18W;;;890;889; 08;235;----;Teruel;;Spain;6;40-21N;001-07W;;;900;902; 08;238;----;Tortosa;;Spain;6;40-49N;000-30E;40-49N;000-30E;44;50;P 08;261;----;Caceres;;Spain;6;39-28N;006-20W;;;405;405;P 08;272;----;Toledo;;Spain;6;39-53N;004-03W;;;515;516; 08;280;LEAB;Albacete / Los Llanos;;Spain;6;38-57N;001-51W;38-57N;001-51W;702;704;P 08;284;LEVC;Valencia / Aeropuerto;;Spain;6;39-30N;000-28W;39-30N;000-28W;69;62;P 08;285;----;Valencia;;Spain;6;39-29N;000-23W;39-29N;000-23W;13;11; 08;286;----;Castellon;;Spain;6;39-57N;000-04W;;;36;35; 08;301;----;Palma De Mallorca;;Spain;6;39-33N;002-37E;39-33N;002-37E;3;6; 08;306;LEPA;Palma De Mallorca / Son San Juan;;Spain;6;39-33N;002-44E;;;4;8;P 08;314;LEMH;Menorca / Mahon;;Spain;6;39-52N;004-14E;39-52N;004-14E;87;82;P 08;330;LEBZ;Badajoz / Talavera La Real;;Spain;6;38-53N;006-49W;38-53N;006-49W;185;192;P 08;335;LEHI;Hinojosa Del Duque;;Spain;6;38-31N;005-07W;;;540;540; 08;348;----;Ciudad Real;;Spain;6;38-59N;003-55W;;;628;629;P 08;359;----;Alicante;;Spain;6;38-22N;000-30W;;;81;82; 08;360;LEAL;Alicante / El Altet;;Spain;6;38-17N;000-33W;;;43;31;P 08;373;LEIB;Ibiza / Es Codola;;Spain;6;38-52N;001-23E;;;7;12;P 08;383;----;Huelva;;Spain;6;37-17N;006-55W;;;20;20; 08;391;LEZL;Sevilla / San Pablo;;Spain;6;37-25N;005-54W;37-25N;005-54W;34;31;P 08;397;LEMO;Moron De La Frontera;;Spain;6;37-09N;005-37W;;;87;88; 08;410;LEBA;Cordoba / Aeropuerto;;Spain;6;37-51N;004-51W;;;90;92;P 08;417;----;Jaen;;Spain;6;37-47N;003-48W;;;582;580; 08;419;LEGR;Granada / Aeropuerto;;Spain;6;37-11N;003-47W;;;567;570;P 08;429;LERI;Murcia / Alcantarilla;;Spain;6;37-57N;001-14W;;;75;75; 08;430;----;Murcia;;Spain;6;38-00N;001-10W;37-59N;001-07W;61;62; 08;431;----;Castillo Galeras;;Spain;6;37-35N;001-00W;;;219;217; 08;433;LELC;Murcia / San Javier;;Spain;6;37-47N;000-48W;37-47N;000-48W;5;3;P 08;449;LERT;Rota;;Spain;6;36-39N;006-21W;36-39N;006-21W;26;26; 08;451;LEJR;Jerez De La Fronteraaeropuerto;;Spain;6;36-45N;006-04W;;;27;28;P 08;458;----;Tarifa;;Spain;6;36-00N;005-36W;;;10;25; 08;482;LEMG;Malaga / Aeropuerto;;Spain;6;36-40N;004-29W;36-40N;004-29W;16;7;P 08;487;LEAM;Almeria / Aeropuerto;;Spain;6;36-51N;002-23W;36-51N;002-23W;15;21;P 08;495;LXGB;Gibraltar;;Gibraltar;6;36-09N;005-21W;36-15N;005-33W;5;0; 08;501;LPFL;Flores Acores ;;Portugal;6;39-27N;031-08W;;;28;29;P 08;502;----;Corvo Acores ;;Portugal;6;39-40N;031-07W;;;18;26; 08;505;LPHR;Horta / Castelo Branco Acores ;;Portugal;6;38-31N;028-43W;;;40;41;P 08;506;----;Horta Acores ;;Portugal;6;38-31N;028-38W;;;60;62; 08;508;----;Lajes / Santa Rita Acores ;;Portugal;6;38-44N;027-04W;38-44N;027-04W;112;113;P 08;509;LPLA;Lajes Acores ;;Portugal;6;38-46N;027-06W;38-44N;027-05W;52;54;P 08;511;----;Angra Do Heroismo Acores ;;Portugal;6;38-40N;027-13W;;;74;76; 08;512;LPPD;Ponta Delgada / Nordela Acores ;;Portugal;6;37-44N;025-42W;;;71;72;P 08;513;----;Ponta Delgada / Obs. Acores ;;Portugal;6;37-45N;025-40W;;;35;36; 08;515;LPAZ;Santa Maria Acores ;;Portugal;6;36-58N;025-10W;;;100;100;P 08;521;LPFU;Funchal / S. Catarina;;Portugal;1;32-41N;016-46W;32-41N;016-46W;58;49;P 08;522;----;Funchal;;Portugal;1;32-38N;016-54W;32-38N;016-54W;58;56; 08;524;LPPS;Porto Santo;;Portugal;1;33-04N;016-21W;;;97;82;P 08;530;----;Cabo Carvoeiro;;Portugal;6;39-21N;009-24W;;;32;34;P 08;532;----;Sintra / Granja;;Portugal;6;38-50N;009-20W;;;134;130; 08;534;----;Montijo;;Portugal;6;38-42N;009-02W;;;14;11; 08;535;----;Lisboa / Geof;;Portugal;6;38-43N;009-09W;;;77;95; 08;536;LPPT;Lisboa / Portela;;Portugal;6;38-46N;009-08W;38-46N;009-08W;114;123; 08;537;----;Alverca;;Portugal;6;38-53N;009-02W;;;3;3; 08;538;----;Sagres;;Portugal;6;37-00N;008-57W;;;25;25;P 08;539;----;Ota;;Portugal;6;39-07N;008-59W;;;41;49; 08;540;----;Monte Real;;Portugal;6;39-50N;008-53W;;;52;54; 08;541;----;Sines / Montes Chaos;;Portugal;6;37-57N;008-52W;;;98;103;P 08;543;----;Viana Do Castelo;;Portugal;6;41-42N;008-48W;;;16;18; 08;544;----;Ovar / Maceda;;Portugal;6;40-55N;008-38W;;;17;22; 08;545;LPPR;Porto / Pedras Rubras;;Portugal;6;41-14N;008-41W;41-14N;008-41W;69;77;P 08;546;----;Porto / Serra Do Pilar;;Portugal;6;41-08N;008-36W;;;93;100; 08;548;----;Coimbra / Cernache;;Portugal;6;40-09N;008-28W;;;179;179; 08;549;----;Coimbra;;Portugal;6;40-12N;008-25W;40-12N;008-25W;140;141; 08;552;----;Tancos;;Portugal;6;39-29N;008-26W;;;83;80; 08;554;LPFR;Faro / Aeroporto;;Portugal;6;37-01N;007-58W;37-01N;007-58W;7;8;P 08;555;----;Faro / Cidade;;Portugal;6;37-01N;007-55W;;;27;8; 08;557;----;Evora;;Portugal;6;38-34N;007-54W;;;309;321; 08;558;----;Evora / C. Coord;;Portugal;6;38-32N;007-54W;;;245;246;P 08;560;----;Viseu;;Portugal;6;40-43N;007-53W;;;644;644; 08;561;----;Beja / B. Aerea;;Portugal;6;38-04N;007-55W;;;194;203; 08;562;LPBJ;Beja;;Portugal;6;38-01N;007-52W;;;246;247;P 08;567;LPVR;Vila Real;;Portugal;6;41-16N;007-43W;;;561;562; 08;568;----;Penhas Douradas;;Portugal;6;40-25N;007-33W;;;1380;1388; 08;570;----;Castelo Branco;;Portugal;6;39-50N;007-29W;;;386;384;P 08;571;----;Portalegre;;Portugal;6;39-17N;007-25W;;;597;590;P 08;575;LPBG;Braganca;;Portugal;6;41-48N;006-44W;;;691;692;P 08;579;----;Lisboa / Gago Coutinho;;Portugal;6;38-46N;009-08W;38-46N;009-08W;104;105;P 08;583;----;Mindelo;;Cape Verde;1;16-53N;025-00W;;;62;63;P 08;589;----;Praia;;Cape Verde;1;14-54N;023-31W;14-54N;023-31W;27;35;P 08;594;GVAC;Sal;;Cape Verde;1;16-44N;022-57W;16-44N;022-57W;54;55;P 08;912;----;Isaba,'Refugio Belagua;;Spain;6;42-57N;000-50W;;;1434;; 08;914;----;Candanchu,' Etuksa;;Spain;6;42-47N;000-32W;;;1560;; 08;916;----;Astun,' Esqui 1730;;Spain;6;42-49N;000-30W;;;1730;; 08;917;----;Sallent De Gallego,'Furco;;Spain;6;42-46N;000-23W;;;1780;; 08;918;----;Sallent De Gallego,'Formigal;;Spain;6;42-47N;000-22W;;;1560;; 08;920;----;Sallent De Gallego,'Respomuso;;Spain;6;42-49N;000-17W;;;2180;; 08;922;----;Panticosa,' Refugio Casa Piedra;;Spain;6;42-46N;000-14W;;;1660;; 08;926;----;Fanlo,' Refugio De Goriz;;Spain;6;42-40N;000-01E;;;2215;; 08;928;----;Benasque,' Refugio De Estos;;Spain;6;42-41N;000-29E;;;1890;; 08;930;----;Cerler,' Esqui;;Spain;6;42-35N;000-32E;;;1540;; 08;932;----;Boi Tahull;;Spain;6;42-29N;000-52E;;;2020;; 08;934;----;Baqueira;;Spain;6;42-42N;000-57E;;;1880;; 08;936;----;Sort;;Spain;6;42-25N;001-08E;;;680;; 08;938;----;Port Aine;;Spain;6;42-25N;001-13E;;;2080;; 08;940;----;Tavescan;;Spain;6;42-38N;001-15E;;;1100;; 08;942;----;Port Del Comte;;Spain;6;42-10N;001-34E;;;1800;; 08;944;----;Masella;;Spain;6;42-20N;001-53E;;;1985;; 08;946;----;Nuria;;Spain;6;42-24N;002-09E;;;1967;; 08;948;----;Vallter 2000;;Spain;6;42-26N;002-16E;;;2180;; 08;960;----;Valdelinares,' Esqui;;Spain;6;40-23N;000-38W;;;1975;; 10;004;----;Ufs Tw Ems;;Germany;6;54-10N;006-21E;;;0;0;P 10;005;----;Ufs Elbe;;Germany;6;54-00N;008-07E;;;0;0; 10;007;----;Ufs Deutsche Bucht.;;Germany;6;54-11N;007-26E;;;0;0; 10;015;----;Helgoland;;Germany;6;54-11N;007-54E;;;4;8;P 10;018;EDXW;Westerland / Sylt;;Germany;6;54-55N;008-21E;;;16;20; 10;020;----;List / Sylt;;Germany;6;55-01N;008-25E;;;26;29;P 10;022;----;Leck;;Germany;6;54-48N;008-57E;;;7;17; 10;026;----;Husum;;Germany;6;54-31N;009-09E;54-31N;009-09E;28;37; 10;031;----;Flensburg-Schaeferhaus;;Germany;6;54-47N;009-23E;;;41;43; 10;033;ETGG;Gluecksburg / Meierwik;;Germany;6;54-50N;009-30E;;;27;33; 10;034;ETME;Eggebek;;Germany;6;54-38N;009-21E;;;20;22; 10;035;----;Schleswig;;Germany;6;54-32N;009-33E;54-32N;009-33E;43;48;P 10;037;ETNS;Schleswig-Jagel;;Germany;6;54-28N;009-31E;;;22;25; 10;038;ETNH;Hohn;;Germany;6;54-19N;009-32E;;;12;17; 10;042;----;Olpenitz;;Germany;6;54-40N;010-02E;;;4;10; 10;044;----;Leuchtturm Kiel;;Germany;6;54-30N;010-17E;;;5;23; 10;046;ETMK;Kiel-Holtenau;;Germany;6;54-23N;010-09E;54-23N;010-09E;31;31; 10;048;----;Friedrichsort;;Germany;6;54-23N;010-11E;;;11;; 10;055;----;Westermarkelsdorf;;Germany;6;54-32N;011-04E;;;3;9; 10;067;----;Marienleuchte;;Germany;6;54-30N;011-14E;;;5;; 10;091;----;Arkona;;Germany;6;54-41N;013-26E;;;42;42;P 10;093;----;Putbus;;Germany;6;54-22N;013-29E;;;40;34; 10;113;----;Norderney;;Germany;6;53-43N;007-09E;;;11;16;P 10;120;----;Helgoland Island;;Germany;6;54-11N;007-53E;;;53;; 10;121;----;Wangerooge;;Germany;6;53-47N;007-55E;;;2;; 10;122;ETNJ;Jever;;Germany;6;53-32N;007-53E;;;7;21; 10;123;----;Wangerooge;;Germany;6;53-48N;007-54E;;;14;29; 10;124;----;Leuchtturm Alte Weser;;Germany;6;53-52N;008-08E;;;30;31; 10;125;----;Wilhelmshaven-Mariensiel;;Germany;6;53-30N;008-03E;;;5;; 10;126;ETNT;Wittmundhaven;;Germany;6;53-33N;007-40E;;;8;12; 10;129;----;Bremerhaven;;Germany;6;53-32N;008-35E;;;7;11;P 10;130;----;Elpersbuettel;;Germany;6;54-04N;009-01E;;;3;5; 10;131;----;Cuxhaven;;Germany;6;53-52N;008-42E;;;5;12;P 10;133;----;Saint Michaelisdonn;;Germany;6;53-59N;009-09E;;;38;41; 10;136;ETMN;Nordholz;;Germany;6;53-46N;008-40E;;;23;31; 10;139;----;Bremervoerde;;Germany;6;53-30N;009-10E;;;3;5; 10;141;----;Hamburg-Sasel;;Germany;6;53-39N;010-07E;;;49;49; 10;142;ETHI;Itzehoe;;Germany;6;54-00N;009-35E;;;25;26; 10;146;----;Quickborn;;Germany;6;53-44N;009-53E;;;13;17; 10;147;EDDH;Hamburg-Fuhlsbuettel;;Germany;6;53-38N;010-00E;;;16;15;P 10;148;----;Hamburg-Stadt;;Germany;6;53-33N;009-58E;;;22;; 10;149;EDHI;Hamburg-Finkenwerder;;Germany;6;53-32N;009-50E;;;5;13; 10;152;----;Pelzerhaken;;Germany;6;54-05N;010-53E;;;1;2; 10;156;EDHL;Luebeck-Blankensee;;Germany;6;53-49N;010-42E;;;14;15; 10;161;----;Boltenhagen;;Germany;6;54-00N;011-12E;;;15;17; 10;162;----;Schwerin;;Germany;6;53-39N;011-23E;;;59;68;P 10;168;----;Goldberg;;Germany;6;53-36N;012-06E;;;58;58; 10;169;----;Rostock;;Germany;6;54-11N;012-03E;;;4;; 10;170;----;Rostock-Warnemuende;;Germany;6;54-11N;012-05E;;;4;10;P 10;172;ETNL;Laage;;Germany;6;53-55N;012-17E;;;40;46; 10;177;----;Teterow;;Germany;6;53-46N;012-37E;;;46;50; 10;180;----;Barth;;Germany;6;54-20N;012-43E;;;7;7; 10;184;----;Greifswald;;Germany;6;54-06N;013-24E;54-06N;013-24E;2;6;P 10;192;----;Heringsdorf;;Germany;6;53-53N;014-09E;;;22;; 10;193;----;Ueckermuende;;Germany;6;53-45N;014-04E;;;1;7; 10;200;----;Emden-Koenigspolder;;Germany;6;53-21N;007-13E;53-21N;007-13E;5;5; 10;203;----;Emden-Hafen;;Germany;6;53-21N;007-12E;;;5;12; 10;215;----;Oldenburg;;Germany;6;53-11N;008-10E;;;11;20; 10;222;----;Lemwerder;;Germany;6;53-09N;008-37E;;;6;30; 10;224;EDDW;Bremen;;Germany;6;53-03N;008-48E;;;3;5;P 10;235;----;Soltau;;Germany;6;53-00N;009-50E;;;77;78; 10;238;ETGB;Bergen;;Germany;6;52-49N;009-56E;52-49N;009-56E;70;69; 10;246;ETHS;Fassberg;;Germany;6;52-55N;010-11E;;;75;88; 10;249;----;Boizenburg;;Germany;6;53-24N;010-41E;;;45;46; 10;253;----;Luechow;;Germany;6;52-58N;011-08E;;;17;18;P 10;261;----;Seehausen;;Germany;6;52-54N;011-44E;;;21;23; 10;264;----;Marnitz;;Germany;6;53-19N;011-56E;;;81;85; 10;267;----;Kyritz;;Germany;6;52-56N;012-25E;;;40;42; 10;268;----;Waren;;Germany;6;53-31N;012-40E;;;70;71; 10;270;----;Neuruppin;;Germany;6;52-54N;012-49E;;;38;39;P 10;272;ETGW;Wittstock;;Germany;6;53-12N;012-31E;53-12N;012-31E;72;74; 10;277;----;Neuglobsow;;Germany;6;53-09N;013-02E;;;62;62; 10;280;----;Neubrandenburg;;Germany;6;53-33N;013-12E;;;81;80;P 10;281;ETNU;Trollenhagen;;Germany;6;53-36N;013-19E;;;71;70; 10;289;----;Gruenow;;Germany;6;53-19N;013-56E;;;55;57; 10;291;----;Angermuende;;Germany;6;53-02N;014-00E;;;56;55;P 10;304;----;Meppen;;Germany;6;52-43N;007-19E;52-43N;007-19E;21;41; 10;305;----;Lingen;;Germany;6;52-31N;007-18E;;;24;26;P 10;306;ETHE;Rheine-Bentlage;;Germany;6;52-18N;007-23E;;;40;49; 10;308;ETUN;Nordhorn;;Germany;6;52-27N;007-10E;;;26;26; 10;314;ETNP;Hopsten;;Germany;6;52-20N;007-32E;;;39;43; 10;315;EDDG;Muenster / Osnabrueck;;Germany;6;52-08N;007-42E;;;48;53;P 10;317;----;Osnabrueck;;Germany;6;52-15N;008-03E;;;95;97; 10;320;ETUO;Guetersloh;;Germany;6;51-55N;008-18E;;;72;72; 10;321;ETND;Diepholz;;Germany;6;52-35N;008-21E;;;39;43; 10;325;----;Bad Salzuflen;;Germany;6;52-06N;008-45E;;;135;139; 10;326;----;Bielefeld-Windelsbleiche;;Germany;6;51-58N;008-33E;;;138;139; 10;334;ETNW;Wunstorf;;Germany;6;52-27N;009-26E;;;57;70; 10;335;ETHB;Bueckeburg;;Germany;6;52-17N;009-05E;;;70;78; 10;337;----;Hildesheim ;;Germany;6;52-11N;009-57E;52-11N;009-57E;88;88; 10;338;EDDV;Hannover;;Germany;6;52-28N;009-41E;52-28N;009-42E;56;59;P 10;343;ETHC;Celle;;Germany;6;52-36N;010-01E;;;39;52; 10;346;----;Braunschweig-Waggum;;Germany;6;52-19N;010-33E;;;84;100; 10;348;EDVE;Braunschweig;;Germany;6;52-18N;010-27E;;;81;88;P 10;356;----;Ummendorf;;Germany;6;52-10N;011-11E;;;162;163; 10;359;----;Gardelegen;;Germany;6;52-31N;011-24E;;;47;48; 10;361;----;Magdeburg;;Germany;6;52-08N;011-36E;;;79;85;P 10;365;----;Genthin;;Germany;6;52-23N;012-10E;;;35;39; 10;368;----;Wiesenburg;;Germany;6;52-07N;012-28E;;;187;188; 10;370;----;Brandenburg / Briest;;Germany;6;52-26N;012-27E;;;31;; 10;376;----;Baruth;;Germany;6;52-03N;013-30E;;;56;57; 10;378;----;Potsdam Sor ;;Germany;6;52-22N;013-05E;;;89;; 10;379;----;Potsdam;;Germany;6;52-23N;013-04E;;;81;100; 10;381;----;Berlin-Dahlem;;Germany;6;52-28N;013-18E;;;51;58; 10;382;EDDT;Berlin-Tegel;;Germany;6;52-34N;013-19E;;;37;37; 10;384;EDDI;Berlin-Tempelhof;;Germany;6;52-28N;013-24E;52-29N;013-25E;50;49;P 10;385;EDDB;Berlin-Schoenefeld;;Germany;6;52-23N;013-31E;52-23N;013-31E;47;50;P 10;389;----;Berlin-Alexanderplatz;;Germany;6;52-31N;013-25E;;;37;84; 10;393;----;Lindenberg;;Germany;6;52-13N;014-07E;52-13N;014-07E;98;104;P 10;395;----;Neuhardenberg / Wriez;;Germany;6;52-37N;014-14E;;;10;; 10;396;----;Manschnow;;Germany;6;52-33N;014-33E;;;12;16; 10;400;EDDL;Duesseldorf;;Germany;6;51-18N;006-46E;;;45;41;P 10;401;ETUR;Brueggen;;Germany;6;51-12N;006-08E;;;73;76; 10;403;----;Moenchengladbach;;Germany;6;51-14N;006-30E;;;37;; 10;404;ETGY;Kalkar;;Germany;6;51-44N;006-16E;;;31;43; 10;405;ETUL;Laarbruch;;Germany;6;51-36N;006-09E;;;32;31; 10;406;----;Bocholt;;Germany;6;51-50N;006-32E;;;21;24; 10;409;----;Essen / Muelheim;;Germany;6;51-24N;006-56E;;;129;; 10;410;EDZE;Essen;;Germany;6;51-24N;006-58E;51-24N;006-58E;152;161; 10;413;----;Marl / Loemuehle;;Germany;6;51-39N;007-10E;;;74;; 10;416;EDLW;Dortmund / Wickede;;Germany;6;51-31N;007-37E;;;127;; 10;418;----;Luedenscheid;;Germany;6;51-15N;007-39E;;;387;392; 10;425;----;Arnsberg;;Germany;6;51-29N;007-54E;;;242;; 10;426;EDLP;Paderborn / Lippstadt;;Germany;6;51-37N;008-37E;;;213;; 10;427;----;Kahler Asten;;Germany;6;51-11N;008-29E;;;839;859;P 10;430;----;Bad Lippspringe;;Germany;6;51-47N;008-50E;;;157;158; 10;431;----;Eggegebirge;;Germany;6;51-50N;008-57E;;;450;; 10;432;----;Koeterberg;;Germany;6;51-51N;009-19E;;;492;493; 10;435;----;Warburg;;Germany;6;51-30N;009-11E;;;225;225; 10;436;EDVK;Kassel / Calden;;Germany;6;51-24N;009-23E;;;277;283; 10;437;----;Fritzlar-Kasseler Warte;;Germany;6;51-08N;009-17E;51-08N;009-17E;222;223; 10;438;----;Kassel;;Germany;6;51-18N;009-27E;;;231;233;P 10;439;ETHF;Fritzlar;;Germany;6;51-07N;009-17E;;;172;181; 10;444;----;Goettingen;;Germany;6;51-30N;009-57E;51-33N;009-57E;167;171; 10;449;----;Leinefelde;;Germany;6;51-24N;010-19E;;;356;356; 10;452;----;Braunlage;;Germany;6;51-44N;010-36E;;;607;610; 10;453;----;Brocken;;Germany;6;51-48N;010-37E;;;1142;1153;P 10;454;----;Wernigerode;;Germany;6;51-51N;010-46E;51-51N;010-46E;234;240; 10;458;----;Harzgerode;;Germany;6;51-39N;011-08E;;;404;405; 10;460;----;Artern;;Germany;6;51-23N;011-18E;;;164;166; 10;466;----;Halle-Kroellwitz;;Germany;6;51-31N;011-57E;;;96;96; 10;469;EDDP;Leipzig-Schkeuditz;;Germany;6;51-25N;012-14E;;;144;149;P 10;471;----;Leipzig;;Germany;6;51-19N;012-25E;;;146;148; 10;474;----;Wittenberg;;Germany;6;51-53N;012-39E;;;105;106;P 10;476;ETSH;Holzdorf;;Germany;6;51-46N;013-11E;;;79;83; 10;480;----;Oschatz;;Germany;6;51-18N;013-06E;;;150;152; 10;486;----;Dresden;;Germany;6;51-07N;013-41E;51-07N;013-41E;231;232; 10;488;EDDC;Dresden-Klotzsche;;Germany;6;51-08N;013-45E;;;230;232;P 10;490;----;Doberlug-Kirchhain;;Germany;6;51-39N;013-35E;;;97;100;P 10;492;ETHT;Cottbus Flugplatz ;;Germany;6;51-46N;014-18E;;;67;68; 10;493;ETNR;Preschen;;Germany;6;51-40N;014-38E;;;100;; 10;496;----;Cottbus;;Germany;6;51-47N;014-19E;;;69;70; 10;499;----;Goerlitz;;Germany;6;51-10N;014-57E;;;237;238;P 10;500;ETNG;Geilenkirchen;;Germany;6;50-58N;006-03E;;;90;98; 10;501;----;Aachen;;Germany;6;50-47N;006-06E;50-47N;006-06E;202;205;P 10;502;ETNN;Noervenich;;Germany;6;50-50N;006-40E;;;118;135; 10;503;ETBA;Aachen / Merzbruck;;Germany;6;50-49N;006-11E;50-49N;006-11E;191;190; 10;504;----;Eifel;;Germany;6;50-39N;006-17E;;;572;; 10;505;----;Bonn-Hangelar;;Germany;6;50-46N;007-10E;;;60;67; 10;506;----;Nuerburg-Barweiler;;Germany;6;50-21N;006-52E;;;485;486; 10;507;----;Dahlemer Binz;;Germany;6;50-24N;006-32E;;;578;581; 10;510;----;Nuerburg;;Germany;6;50-20N;006-57E;;;629;; 10;513;EDDK;Koeln / Bonn;;Germany;6;50-52N;007-10E;50-52N;007-08E;91;100;P 10;514;ETHM;Mendig;;Germany;6;50-22N;007-19E;;;182;190; 10;515;----;Bendorf;;Germany;6;50-25N;007-35E;;;127;129; 10;517;----;Bonn-Friesdorf;;Germany;6;50-42N;007-09E;;;64;64; 10;518;----;Bonn-Hardthoehe;;Germany;6;50-42N;007-02E;;;158;160; 10;519;----;Bonn-Roleber;;Germany;6;50-44N;007-12E;;;159;168; 10;521;----;Rothaargebirge;;Germany;6;50-56N;008-12E;;;635;; 10;526;----;Bad Marienberg;;Germany;6;50-40N;007-58E;;;547;555; 10;528;----;Siegerland;;Germany;6;50-43N;008-05E;;;599;617; 10;532;----;Giessen;;Germany;6;50-35N;008-42E;50-34N;008-42E;186;195;P 10;533;----;Giessen United States Army Heliport ;;Germany;6;50-36N;008-44E;50-36N;008-44E;152;152; 10;535;----;Wahlen;;Germany;6;50-49N;009-08E;;;349;350; 10;536;----;Fulda Usa \ Af ;;Germany;6;50-33N;009-39E;;;305;; 10;542;----;Bad Hersfeld;;Germany;6;50-51N;009-44E;;;273;272; 10;544;----;Wasserkuppe;;Germany;6;50-30N;009-57E;;;921;925;P 10;546;----;Kaltennordheim;;Germany;6;50-38N;010-09E;;;487;494; 10;548;----;Meiningen;;Germany;6;50-34N;010-23E;50-34N;010-22E;450;453;P 10;551;----;Suhl;;Germany;6;50-37N;010-40E;;;505;; 10;552;----;Schmuecke;;Germany;6;50-39N;010-46E;;;937;948; 10;554;EDDE;Erfurt-Bindersleben;;Germany;6;50-59N;010-58E;;;315;322;P 10;555;----;Weimar;;Germany;6;50-59N;011-19E;;;264;; 10;557;----;Neuhaus A. R.;;Germany;6;50-30N;011-08E;;;845;851; 10;558;----;Sonneberg-Neufang;;Germany;6;50-23N;011-11E;;;626;630; 10;564;----;Schleiz;;Germany;6;50-34N;011-49E;;;501;502; 10;565;----;Osterfeld;;Germany;6;51-05N;011-56E;;;262;263; 10;567;----;Gera-Leumnitz;;Germany;6;50-53N;012-08E;;;311;311; 10;569;----;Plauen;;Germany;6;50-29N;012-08E;;;386;389; 10;574;----;Carlsfeld;;Germany;6;50-26N;012-37E;;;898;899; 10;575;----;Aue;;Germany;6;50-36N;012-43E;;;391;397; 10;577;----;Chemnitz;;Germany;6;50-48N;012-52E;;;418;420;P 10;578;----;Fichtelberg;;Germany;6;50-26N;012-57E;;;1213;1215;P 10;579;----;Marienberg;;Germany;6;50-39N;013-09E;;;639;640; 10;582;----;Zinnwald-Georgenfeld;;Germany;6;50-44N;013-45E;;;877;882; 10;591;----;Lichtenhain-Mittelndorf;;Germany;6;50-56N;014-13E;;;300;325; 10;607;ETAD;Spangdahlem;;Germany;6;49-59N;006-42E;;;365;356; 10;609;----;Trier-Petrisberg;;Germany;6;49-45N;006-40E;;;265;273;P 10;613;ETSB;Buechel;;Germany;6;50-10N;007-04E;;;478;486; 10;614;ETAR;Ramstein;;Germany;6;49-26N;007-36E;;;238;237; 10;615;----;Deuselbach;;Germany;6;49-46N;007-03E;;;480;483; 10;616;EDFH;Hahn;;Germany;6;49-57N;007-16E;;;491;498; 10;617;----;Traben-Trarbach;;Germany;6;49-58N;007-07E;;;257;252; 10;618;ETGI;Idar-Oberstein;;Germany;6;49-42N;007-20E;49-42N;007-20E;376;377; 10;619;----;Baumholder United States Army Air Field ;;Germany;6;49-39N;007-18E;49-39N;007-18E;426;426; 10;626;ETSP;Pferdsfeld;;Germany;6;49-51N;007-36E;;;396;403; 10;627;ETEH;Bad Kreuznach;;Germany;6;49-51N;007-53E;;;103;105; 10;628;----;Geisenheim;;Germany;6;49-59N;007-57E;;;118;120; 10;633;ETOU;Wiesbaden;;Germany;6;50-03N;008-20E;;;140;; 10;635;----;Kleiner Feldberg / Taunus;;Germany;6;50-13N;008-27E;;;805;802; 10;637;EDDF;Frankfurt / M-Flughafen;;Germany;6;50-03N;008-36E;50-03N;008-35E;111;113;P 10;638;----;Maurice Rose Usahp ;;Germany;6;50-11N;008-39E;;;104;; 10;639;----;Langen;;Germany;6;50-01N;008-40E;50-01N;008-40E;125;135; 10;640;----;Offenbach / M;;Germany;6;50-07N;008-44E;50-07N;008-44E;98;112; 10;642;ETID;Hanau;;Germany;6;50-10N;008-58E;50-10N;008-57E;112;114; 10;644;----;Aschaffenburg / Grossostheim;;Germany;6;49-56N;009-04E;;;125;; 10;645;----;Breitsol;;Germany;6;49-54N;009-26E;;;585;581; 10;648;----;Michelstadt-Vielbrunn;;Germany;6;49-43N;009-06E;;;453;455; 10;653;ETEU;Giebelstadt;;Germany;6;49-39N;009-58E;49-39N;009-58E;298;298; 10;655;----;Wuerzburg;;Germany;6;49-46N;009-58E;49-46N;009-58E;268;272;P 10;657;----;Wertheim United States Army Heliport ;;Germany;6;49-45N;009-30E;49-46N;009-29E;338;338; 10;658;----;Bad Kissingen;;Germany;6;50-12N;010-05E;;;262;266; 10;669;ETIN;Kitzingen Usa \ Af ;;Germany;6;49-45N;010-12E;49-45N;010-12E;210;210; 10;671;----;Coburg;;Germany;6;50-17N;010-59E;;;322;323; 10;675;----;Bamberg;;Germany;6;49-55N;010-54E;49-53N;010-55E;239;240; 10;677;EDQD;Bayreuth;;Germany;6;49-59N;011-38E;;;488;498; 10;684;----;Hof;;Germany;6;50-17N;011-51E;;;585;588; 10;685;EDQM;Hof;;Germany;6;50-19N;011-53E;;;567;568;P 10;687;ETIC;Grafenwoehr;;Germany;6;49-42N;011-57E;49-06N;011-08E;415;415; 10;688;----;Weiden;;Germany;6;49-40N;012-11E;;;438;439;P 10;704;----;Berus;;Germany;6;49-17N;006-41E;;;363;367; 10;706;----;Tholey;;Germany;6;49-29N;007-03E;;;396;398; 10;708;EDDR;Saarbruecken / Ensheim;;Germany;6;49-13N;007-07E;49-13N;007-07E;322;320;P 10;709;----;Saarbruecken;;Germany;6;49-15N;006-56E;;;213;; 10;712;ETAS;Sembach United States Air Force Operated Base In Foreign Country ;;Germany;6;49-30N;007-52E;;;321;; 10;714;----;Zweibrucken United States Air Force Operated Base In Foreign Country ;;Germany;6;49-13N;007-24E;;;345;; 10;717;----;Pirmasens United States Army Heliport ;;Germany;6;49-13N;007-37E;;;415;; 10;724;----;Weinbiet;;Germany;6;49-23N;008-07E;;;553;557; 10;725;----;Baden-Oos;;Germany;6;48-48N;008-11E;;;126;; 10;727;----;Karlsruhe;;Germany;6;49-02N;008-22E;;;112;145; 10;728;ETOR;Coleman Mannheim ;;Germany;6;49-34N;008-28E;;;96;95; 10;729;EDFM;Baden Wurttemberg, Neuostheim;;Germany;6;49-28-21N;008-30-56E;;;100;; 10;734;ETIE;Heidelberg;;Germany;6;49-24N;008-39E;;;110;109; 10;735;----;Sinsheim;;Germany;6;49-15N;008-53E;;;169;169; 10;736;----;Muehlacker;;Germany;6;48-58N;008-52E;;;244;245; 10;737;----;Stuttgart / Neckartal;;Germany;6;48-47N;009-13E;;;224;; 10;738;EDDS;Stuttgart-Echterdingen;;Germany;6;48-41N;009-13E;48-41N;009-13E;396;391;P 10;739;----;Stuttgart / Schnarrenberg;;Germany;6;48-50N;009-12E;48-50N;009-12E;314;311; 10;742;----;Oehringen;;Germany;6;49-13N;009-31E;;;276;277; 10;743;ETHN;Niederstetten;;Germany;6;49-24N;009-58E;;;468;473; 10;745;EDOP;Mecklenburg-Vorpommern, Parchim;;Germany;6;53-25-37N;011-47-01E;;;52;; 10;752;ETIK;Illesheim;;Germany;6;49-28N;010-23E;;;325;347; 10;755;ETEB;Ansbach / Katterbach;;Germany;6;49-19N;010-38E;49-19N;010-38E;467;476; 10;761;----;Weissenburg;;Germany;6;49-01N;010-58E;;;422;424; 10;762;----;Furth United States Army Heliport ;;Germany;6;49-30N;010-58E;49-30N;010-58E;302;302; 10;763;EDDN;Nuernberg;;Germany;6;49-30N;011-03E;49-30N;011-05E;318;318;P 10;764;----;Feucht Usa \ Af ;;Germany;6;49-23N;011-10E;49-23N;011-10E;386;386; 10;765;ETHR;Roth;;Germany;6;49-13N;011-06E;49-13N;011-06E;388;395; 10;771;ETGK;Kuemmersruck;;Germany;6;49-26N;011-54E;49-26N;011-54E;419;418; 10;775;ETIH;Hohenfels;;Germany;6;49-13N;011-50E;;;442;442; 10;776;----;Regensburg;;Germany;6;49-03N;012-06E;;;366;371;P 10;777;----;Gelbelsee;;Germany;6;48-57N;011-26E;48-57N;011-26E;539;539; 10;788;----;Straubing;;Germany;6;48-50N;012-34E;;;350;359; 10;791;----;Grosser Arber;;Germany;6;49-07N;013-08E;;;1437;1446; 10;796;----;Zwiesel;;Germany;6;49-02N;013-14E;;;612;613; 10;803;----;Freiburg;;Germany;6;48-00N;007-51E;;;269;300;P 10;805;----;Lahr;;Germany;6;48-22N;007-50E;;;155;157; 10;815;----;Freudenstadt;;Germany;6;48-27N;008-25E;;;797;801; 10;818;----;Klippeneck;;Germany;6;48-06N;008-45E;;;973;975; 10;827;ETGZ;Messstetten;;Germany;6;48-11N;009-00E;;;920;930; 10;828;----;Sigmaringen;;Germany;6;48-06N;009-15E;48-06N;009-15E;645;646; 10;836;----;Stoetten;;Germany;6;48-40N;009-52E;;;734;738;P 10;837;ETHL;Laupheim;;Germany;6;48-13N;009-55E;;;538;550; 10;838;----;Ulm;;Germany;6;48-23N;009-57E;;;567;571; 10;850;----;Harburg;;Germany;6;48-47N;010-42E;;;457;457; 10;852;EDMA;Augsburg;;Germany;6;48-26N;010-56E;48-23N;010-51E;461;463;P 10;853;ETSN;Neuburg / Donau;;Germany;6;48-43N;011-13E;;;380;387; 10;856;ETSL;Lechfeld;;Germany;6;48-11N;010-52E;;;555;562; 10;857;ETSA;Landsberg;;Germany;6;48-04N;010-54E;;;623;628; 10;858;ETSF;Fuerstenfeldbruck;;Germany;6;48-12N;011-16E;;;519;535; 10;859;----;Oberpfaffenhofen;;Germany;6;48-05N;011-17E;;;593;600; 10;860;ETSI;Ingolstadt;;Germany;6;48-43N;011-32E;;;367;370; 10;862;----;Siegenburg;;Germany;6;48-45N;011-48E;48-45N;011-48E;397;404; 10;863;----;Weihenstephan;;Germany;6;48-24N;011-42E;;;470;; 10;864;----;Neubiberg Ger-Afb ;;Germany;6;48-04N;011-38E;;;560;; 10;865;----;Muenchen-Stadt;;Germany;6;48-08N;011-33E;;;520;535; 10;866;EDDM;Munchen;;Germany;6;48-21N;011-47E;48-08N;011-43E;453;; 10;868;----;Muenchen-Oberschleissheim;;Germany;6;48-15N;011-33E;48-15N;011-35E;484;489; 10;869;ETSE;Erding;;Germany;6;48-19N;011-57E;;;462;467; 10;870;----;Muenchen, Flughafen;;Germany;6;48-22N;011-48E;;;453;447;P 10;871;----;Fuerholzen;;Germany;6;48-20N;011-37E;;;510;; 10;875;----;Muehldorf;;Germany;6;48-17N;012-30E;;;405;410; 10;893;----;Passau;;Germany;6;48-35N;013-28E;;;409;408;P 10;900;----;Bremgarten Ger-Afb ;;Germany;6;47-54N;007-37E;;;217;; 10;908;----;Feldberg / Schwarzwald;;Germany;6;47-53N;008-00E;;;1486;1493; 10;912;EDTD;Donaueschingen / Villingen;;Germany;6;47-58N;008-31E;;;680;; 10;929;EDTZ;Konstanz;;Germany;6;47-41N;009-11E;;;443;447;P 10;935;EDNY;Friedrichshafen;;Germany;6;47-40N;009-31E;;;416;424; 10;946;----;Kempten;;Germany;6;47-43N;010-20E;;;705;705; 10;947;ETSM;Memmingen;;Germany;6;47-59N;010-14E;;;634;644; 10;948;----;Oberstdorf;;Germany;6;47-24N;010-17E;;;810;812; 10;954;ETHA;Altenstadt;;Germany;6;47-50N;010-52E;47-50N;010-52E;739;757; 10;961;----;Zugspitze;;Germany;6;47-25N;010-59E;;;2960;2962;P 10;962;----;Hohenpeissenberg;;Germany;6;47-48N;011-01E;47-48N;011-01E;977;986;P 10;963;----;Garmisch-Partenkirchen;;Germany;6;47-29N;011-04E;;;719;720; 10;971;----;Bad Tolz United States Army Air Field ;;Germany;6;47-46N;011-36E;;;716;; 10;980;----;Wendelstein;;Germany;6;47-42N;012-01E;;;1832;1835; 10;982;----;Chieming;;Germany;6;47-53N;012-32E;;;549;549; 11;001;----;Wolfsegg;;Austria;6;48-06N;013-41E;;;634;; 11;003;----;Ried Im Innkreis;;Austria;6;48-13N;013-29E;;;435;443; 11;008;----;Rohrbach;;Austria;6;48-34N;014-00E;;;602;; 11;009;----;Wels-Flugfeld;;Austria;6;48-11N;014-02E;;;318;323; 11;010;LOWL;Linz / Hoersching-Flughafen;;Austria;6;48-14N;014-11E;48-14N;014-11E;298;313;P 11;011;LOXL;Horsching Aus-Afb ;;Austria;6;48-14N;014-11E;48-14N;014-11E;313;298; 11;012;----;Kremsmuenster;;Austria;6;48-03N;014-08E;;;383;389; 11;013;----;Stadt Haag / Heimberg;;Austria;6;48-07N;014-37E;;;408;; 11;014;----;Koenigswiesen;;Austria;6;48-24N;014-50E;;;608;; 11;015;----;Freistadt;;Austria;6;48-31N;014-30E;;;548;; 11;016;----;Freistadt-Flugfeld;;Austria;6;48-31N;014-25E;;;682;; 11;017;----;Freistadt;;Austria;6;48-31N;014-30E;;;563;; 11;018;----;Amstetten;;Austria;6;48-07N;014-52E;;;274;; 11;019;----;Allentsteig;;Austria;6;48-41N;015-22E;;;598;607; 11;020;----;Zwettl;;Austria;6;48-37N;015-12E;;;506;511; 11;021;----;Litschau;;Austria;6;48-58N;015-02E;;;564;561; 11;022;----;Retz;;Austria;6;48-46N;015-57E;;;256;262;P 11;024;----;Jauerling;;Austria;6;48-21N;015-22E;48-21N;015-22E;860;860; 11;026;----;Krems / Langenlois Gneixendorf;;Austria;6;48-27N;015-38E;;;312;; 11;028;----;Saint Poelten;;Austria;6;48-12N;015-37E;;;272;282;P 11;030;LOXT;Tulln;;Austria;6;48-19N;016-07E;;;175;176; 11;032;----;Poysdorf;;Austria;6;48-40N;016-38E;;;209;; 11;034;----;Wien / City;;Austria;6;48-12N;016-22E;;;171;; 11;035;----;Wien / Hohe Warte;;Austria;6;48-15N;016-22E;48-15N;016-22E;203;209;P 11;036;LOWW;Wien / Schwechat-Flughafen;;Austria;6;48-07N;016-34E;;;183;190;P 11;037;----;Grossenzersdorf;;Austria;6;48-12N;016-34E;;;153;; 11;051;----;Ranshofen;;Austria;6;48-13N;013-02E;;;382;390; 11;055;----;Schaerding;;Austria;6;48-28N;013-26E;;;318;315; 11;059;----;Wels / Schleissheim;;Austria;6;48-10N;014-04E;;;312;314; 11;060;----;Linz / Stadt;;Austria;6;48-18N;014-17E;;;263;262; 11;075;----;Langenlois;;Austria;6;48-28N;015-42E;;;210;; 11;078;----;Lilienfeld / Sulzer;;Austria;6;48-02N;015-35E;48-02N;015-35E;681;681; 11;082;----;Gumpoldskirchen;;Austria;6;48-02N;016-17E;;;218;; 11;101;----;Bregenz;;Austria;6;47-30N;009-44E;;;424;438;P 11;103;----;Hohenems / Dornbirn Flugfeld;;Austria;6;47-23N;009-42E;;;412;418; 11;105;----;Feldkirch;;Austria;6;47-16N;009-36E;;;439;440;P 11;109;----;Saint Anton Am Arlberg;;Austria;6;47-08N;010-19E;;;1275;; 11;110;----;Galzig;;Austria;6;47-08N;010-14E;;;2080;; 11;112;----;Landeck;;Austria;6;47-09N;010-34E;;;785;794;P 11;116;----;Reutte / Tirol;;Austria;6;47-30N;010-45E;;;870;; 11;120;LOWI;Innsbruck-Flughafen;;Austria;6;47-16N;011-21E;;;581;593;P 11;122;LOXS;Schwaz Heliport ;;Austria;6;47-20N;011-42E;;;543;; 11;126;----;Patscherkofel;;Austria;6;47-13N;011-28E;;;2247;;P 11;127;----;Obergurgl;;Austria;6;46-52N;011-02E;;;1938;1937; 11;128;----;Brenner;;Austria;6;47-00N;011-31E;;;1450;;P 11;130;----;Kufstein;;Austria;6;47-35N;012-10E;;;495;508;P 11;132;----;Saint Johann In Tirol-Flugfeld;;Austria;6;47-31N;012-27E;;;670;674; 11;134;----;Gerlos;;Austria;6;47-13N;012-02E;;;1250;; 11;135;----;Hahnenkamm / Ehrenbachhoehe;;Austria;6;47-25N;012-22E;;;1760;;P 11;136;----;Krimml;;Austria;6;47-14N;012-11E;;;1000;; 11;138;----;Alpinzentrum Rudolfshuette;;Austria;6;47-08N;012-37E;;;2304;2309; 11;139;----;Annaberg Im Lammertal;;Austria;6;47-33N;013-26E;;;885;; 11;140;----;Lofer;;Austria;6;47-35N;012-42E;;;629;; 11;141;----;Bischofshofen;;Austria;6;47-24N;013-13E;;;550;; 11;143;----;Zell Am See-Flugfeld;;Austria;6;47-18N;012-47E;;;753;754; 11;144;----;Zell Am See;;Austria;6;47-20N;012-48E;;;766;763; 11;145;----;Bad Gastein;;Austria;6;47-07N;013-08E;;;1100;; 11;146;----;Sonnblick;;Austria;6;47-03N;012-57E;;;3105;3109;P 11;147;----;Radstadt;;Austria;6;47-23N;013-27E;;;845;; 11;148;----;Saint Michael Im Lungau;;Austria;6;47-06N;013-39E;;;1094;; 11;149;----;Obertauern;;Austria;6;47-16N;013-34E;;;1742;1737; 11;150;LOWS;Salzburg-Flughafen;;Austria;6;47-48N;013-00E;;;430;450;P 11;151;----;Seewalchen / Attersee;;Austria;6;47-57N;013-36E;;;496;; 11;152;----;Mattsee;;Austria;6;47-58N;013-06E;;;502;; 11;153;----;Mondsee;;Austria;6;47-51N;013-22E;;;491;; 11;154;----;Gmunden;;Austria;6;47-54N;013-47E;;;424;427; 11;155;----;Feuerkogel;;Austria;6;47-49N;013-44E;;;1618;1621;P 11;156;----;Bad Ischl;;Austria;6;47-43N;013-38E;;;469;470; 11;157;LOXA;Aigen Im Ennstal;;Austria;6;47-32N;014-08E;;;638;649;P 11;159;----;Pyhrnpass;;Austria;6;47-37N;014-18E;;;940;; 11;160;----;Hieflau;;Austria;6;47-36N;014-45E;;;492;; 11;162;----;Mauterndorf;;Austria;6;47-08N;013-41E;;;1115;; 11;163;----;Stolzalpe;;Austria;6;47-07N;014-12E;;;1305;; 11;165;LOXZ;Zeltweg;;Austria;6;47-12N;014-45E;;;677;682;P 11;168;----;Wald Am Schober;;Austria;6;47-27N;014-40E;;;849;; 11;170;----;Lunz;;Austria;6;47-51N;015-00E;;;614;615; 11;171;----;St Sebastian / Mariazell;;Austria;6;47-48N;015-18E;;;872;; 11;172;----;Mariazell;;Austria;6;47-46N;015-19E;;;875;;P 11;174;----;Saint Michael / Leoben;;Austria;6;47-20N;015-05E;;;580;; 11;175;----;Bruck / Mur;;Austria;6;47-25N;015-16E;;;482;;P 11;176;----;Kapfenberg-Flugfeld;;Austria;6;47-28N;015-20E;;;515;527; 11;180;----;Rax / Seilbahn-Bergstat;;Austria;6;47-43N;015-47E;;;1546;; 11;181;LOAV;Niederosterreich / Lugplatz Voslau;;Austria;6;47-57-52N;016-15-34E;;;233;; 11;182;----;Wiener Neustadt;;Austria;6;47-50N;016-13E;;;280;285; 11;183;----;Semmering;;Austria;6;47-38N;015-49E;;;960;; 11;185;----;Moenichkirchen;;Austria;6;47-31N;016-02E;;;1000;1001; 11;186;----;Moenichkirchen;;Austria;6;47-31N;016-03E;;;940;; 11;190;----;Eisenstadt;;Austria;6;47-51N;016-32E;;;184;190; 11;192;----;Kleinzicken;;Austria;6;47-13N;016-20E;;;267;267; 11;194;----;Neusiedl Am See;;Austria;6;47-57N;016-52E;;;129;; 11;195;----;Punitz / Guessing Flugfeld;;Austria;6;47-09N;016-19E;;;290;; 11;196;----;Saint Michael / Guessing;;Austria;6;47-07N;016-16E;;;235;; 11;202;----;Felbertauern / Suedportal;;Austria;6;47-07N;012-30E;;;1632;; 11;204;----;Lienz;;Austria;6;46-50N;012-48E;;;659;665;P 11;207;----;Reisach;;Austria;6;46-39N;013-09E;;;646;; 11;209;----;Spittal / Drau-Kleinsass;;Austria;6;46-46N;013-32E;;;710;; 11;210;----;Mallnitz;;Austria;6;46-59N;013-11E;;;1185;; 11;211;----;Radenthein;;Austria;6;46-47N;013-42E;;;685;; 11;212;----;Villacheralpe;;Austria;6;46-36N;013-40E;;;2140;2160;P 11;213;----;Villach;;Austria;6;46-37N;013-52E;;;495;; 11;214;----;Preitenegg;;Austria;6;46-56N;014-55E;;;1055;;P 11;219;----;Neumarkter Sattel;;Austria;6;47-07N;014-24E;;;1125;; 11;225;----;Weitensfeld;;Austria;6;46-51N;014-12E;;;705;; 11;229;----;Saint Andrae I. L.;;Austria;6;46-47N;014-48E;;;468;; 11;231;LOWK;Klagenfurt-Flughafen;;Austria;6;46-39N;014-20E;;;448;476;P 11;232;----;Feistritz Ob Bleiburg;;Austria;6;46-34N;014-46E;;;527;; 11;234;----;Eisenkappel;;Austria;6;46-29N;014-36E;;;623;623; 11;236;----;Uebelbach / Reicherhoehe;;Austria;6;47-14N;015-14E;;;999;; 11;240;LOWG;Graz-Thalerhof-Flughafen;;Austria;6;47-00N;015-26E;47-00N;015-27E;340;347;P 11;241;----;Schoeckl;;Austria;6;47-12N;015-28E;;;1436;1438; 11;245;----;Bad Gleichenberg;;Austria;6;46-52N;015-54E;;;303;326; 11;248;----;Bad Radkersburg;;Austria;6;46-41N;015-59E;;;208;214; 11;252;----;Virgen;;Austria;6;47-00N;012-27E;;;1198;1191; 11;255;----;Koetschach / Mauthen;;Austria;6;46-41N;013-00E;;;709;706; 11;260;----;Mallnitz Ii;;Austria;6;46-59N;013-11E;;;1200;1202; 11;261;----;Obervellach;;Austria;6;46-56N;013-13E;;;820;822; 11;263;----;Weissensee / Gatschach;;Austria;6;46-43N;013-18E;;;945;953; 11;270;----;Dellach Im Drautal;;Austria;6;46-45N;013-05E;;;627;630; 11;275;----;Arriach;;Austria;6;46-44N;013-51E;;;896;; 11;280;----;Murau;;Austria;6;47-07N;014-11E;;;813;813; 11;290;----;Graz Universitaet;;Austria;6;47-07N;015-27E;;;366;377; 11;292;----;Lassnitzhoehe;;Austria;6;47-05N;015-35E;;;524;526; 11;302;----;Dornbirn;;Austria;6;47-26N;009-44E;;;410;411; 11;308;----;Warth;;Austria;6;47-15N;010-11E;;;1475;; 11;310;----;Ischgl / Idalpe;;Austria;6;46-59N;010-19E;;;2323;2320; 11;316;----;Pitztaler Gletscher;;Austria;6;46-56N;010-53E;;;2850;2843; 11;320;----;Innsbruck / Universitaet;;Austria;6;47-16N;011-23E;;;577;579; 11;322;----;Mayrhofen;;Austria;6;47-10N;011-51E;;;643;647; 11;340;----;Schmittenhoehe;;Austria;6;47-20N;012-44E;;;1973;1956; 11;345;----;Saint Veit Im Pongau;;Austria;6;47-21N;013-09E;;;750;750; 11;346;----;Rauris;;Austria;6;47-15N;012-50E;;;916;917; 11;348;----;Mariapfarr;;Austria;6;47-09N;013-45E;;;1153;; 11;350;----;Salzburg / Freisaal;;Austria;6;47-47N;013-03E;;;420;422; 11;351;----;Ramsau / Dachstein;;Austria;6;47-25N;013-38E;;;1203;1207; 11;353;----;Schoberstein;;Austria;6;47-54N;014-20E;;;1250;; 11;355;----;Windischgarsten;;Austria;6;47-44N;014-20E;;;596;611; 11;356;----;Bad Aussee;;Austria;6;47-37N;013-47E;;;665;661; 11;357;----;Saint Wolfgang;;Austria;6;47-44N;013-27E;;;539;542; 11;358;----;Bad Mitterndorf;;Austria;6;47-33N;013-57E;;;804;802; 11;360;----;Irdning / Gumpenstein;;Austria;6;47-30N;014-07E;;;710;; 11;365;----;Zeltweg / Autom. Stat.;;Austria;6;47-12N;014-47E;;;669;677; 11;375;----;Aflenz;;Austria;6;47-33N;015-15E;;;784;775; 11;380;----;Reichenau / Rax;;Austria;6;47-42N;015-51E;;;486;485; 11;382;----;Puchberg;;Austria;6;47-47N;015-55E;;;584;586; 11;384;----;Hirschenkogel;;Austria;6;47-38N;015-49E;;;1325;1323; 11;385;----;Hohe Wand / Hochkogelhaus;;Austria;6;47-49N;016-02E;;;932;936; 11;387;----;Seibersdorf;;Austria;6;47-59N;016-30E;;;185;186; 11;406;----;Cheb;;Czech Republic;6;50-05N;012-24E;50-05N;012-24E;470;471;P 11;414;LKKV;Karlovy Vary;;Czech Republic;6;50-12N;012-55E;;;603;604; 11;418;----;Marianske Lazne;;Czech Republic;6;49-55N;012-43E;;;540;541; 11;423;----;Primda;;Czech Republic;6;49-40N;012-40E;;;742;748; 11;438;----;Tusimice;;Czech Republic;6;50-23N;013-20E;;;322;328; 11;448;----;Plzen-Line;;Czech Republic;6;49-10N;013-16E;;;364;365; 11;457;----;Churanov;;Czech Republic;6;49-04N;013-37E;;;1122;1126; 11;464;----;Milesovka;;Czech Republic;6;50-33N;013-56E;;;836;; 11;487;----;Kocelovice;;Czech Republic;6;49-28N;013-50E;;;519;522;P 11;502;----;Usti Nad Labem;;Czech Republic;6;50-41N;014-02E;;;377;379; 11;509;----;Doksany;;Czech Republic;6;50-28N;014-10E;;;158;159; 11;518;LKPR;Praha / Ruzyne;;Czech Republic;6;50-06N;014-15E;50-06N;014-17E;365;365;P 11;520;----;Praha-Libus;;Czech Republic;6;50-01N;014-27E;50-00N;014-27E;304;304; 11;538;----;Temelin;;Czech Republic;6;49-12N;014-20E;;;500;507; 11;540;----;Hosin;;Czech Republic;6;49-02N;014-29E;;;488;; 11;541;----;Ceske Budejovice;;Czech Republic;6;48-56N;014-27E;;;432;436; 11;567;----;Praha Kbely;;Czech Republic;6;50-07N;014-32E;;;286;287; 11;603;----;Liberec;;Czech Republic;6;50-46N;015-01E;;;398;399; 11;624;----;Caslav;;Czech Republic;6;49-56N;015-23E;;;242;239; 11;628;----;Kramolin-Kosetice;;Czech Republic;6;49-35N;015-05E;;;534;533; 11;636;----;Kostelni Myslova;;Czech Republic;6;49-11N;015-28E;;;569;573; 11;643;----;Pec Pod Snezkou;;Czech Republic;6;50-40N;015-45E;;;816;817; 11;648;----;Hradec Kralove;;Czech Republic;6;50-15N;015-51E;;;244;; 11;649;----;Hradec Kralove;;Czech Republic;6;50-11N;015-50E;;;285;285; 11;652;----;Pardubice;;Czech Republic;6;50-01N;015-44E;;;225;230; 11;659;----;Pribyslav;;Czech Republic;6;49-35N;015-46E;49-35N;015-46E;533;536;P 11;679;----;Usti Nad Orlici;;Czech Republic;6;49-59N;016-26E;;;402;406; 11;683;----;Svratouch;;Czech Republic;6;49-44N;016-02E;;;735;740; 11;692;----;Namest Nad Oslavou;;Czech Republic;6;49-10N;016-08E;;;472;478; 11;693;----;Dukovany;;Czech Republic;6;49-06N;016-08E;;;400;405; 11;698;----;Kucharovice;;Czech Republic;6;48-53N;016-05E;;;334;339; 11;710;----;Luka;;Czech Republic;6;49-39N;016-57E;;;513;518; 11;722;----;Brno Rebesovice;;Czech Republic;6;49-05N;016-37E;49-05N;016-37E;195;195; 11;723;LKTB;Brno / Turany;;Czech Republic;6;49-09N;016-42E;;;241;246;P 11;735;----;Praded;;Czech Republic;6;50-04N;017-14E;;;1492;1512; 11;748;----;Prerov;;Czech Republic;6;49-26N;017-24E;;;206;211; 11;766;----;Cervena;;Czech Republic;6;49-46N;017-33E;;;750;753; 11;774;LKHO;Holesov;;Czech Republic;6;49-19N;017-34E;;;224;224; 11;782;LKMT;Ostrava / Mosnov;;Czech Republic;6;49-41N;018-07E;49-47N;018-16E;256;256;P 11;787;----;Lysa Hora;;Czech Republic;6;49-33N;018-27E;;;1324;1327; 11;801;----;Malacky;;Slovakia;6;48-24N;017-09E;;;205;207; 11;816;LZIB;Bratislava Ivanka;;Slovakia;6;48-12N;017-12E;48-10N;017-12E;133;142;P 11;819;----;Jaslovske Bohunice;;Slovakia;6;48-29N;017-40E;;;176;185; 11;826;LKPP;Piestany;;Slovakia;6;48-37N;017-50E;;;163;164; 11;841;----;Zilina / Hricov;;Slovakia;6;49-14N;018-37E;;;310;311; 11;842;----;Trencin;;Slovakia;6;48-52N;017-59E;;;207;209; 11;855;----;Nitra;;Slovakia;6;48-17N;018-08E;;;135;136; 11;856;----;Mochovce;;Slovakia;6;48-17N;018-27E;;;261;269; 11;858;----;Hurbanovo;;Slovakia;6;47-52N;018-12E;;;115;124;P 11;867;----;Prievidza;;Slovakia;6;48-46N;018-36E;;;259;261; 11;880;----;Dudince;;Slovakia;6;48-10N;018-52E;;;140;141; 11;903;LKSL;Sliac;;Slovakia;6;48-39N;019-09E;;;314;315;P 11;916;----;Chopok;;Slovakia;6;48-59N;019-36E;;;2008;2012; 11;918;----;Liesek;;Slovakia;6;49-22N;019-41E;;;692;698; 11;927;LZLU;Lucenec;;Slovakia;6;48-20N;019-44E;;;214;; 11;930;----;Lomnicky Stit;;Slovakia;6;49-12N;020-13E;;;2633;2635; 11;933;----;Strbske Pleso;;Slovakia;6;49-07N;020-05E;;;1355;1356; 11;934;LZTT;Poprad / Tatry;;Slovakia;6;49-04N;020-15E;49-04N;020-15E;694;695;P 11;938;----;Telgart;;Slovakia;6;48-51N;020-11E;;;901;906; 11;952;----;Poprad / Ganovce;;Slovakia;6;49-03N;020-32E;49-02N;020-19E;706;706; 11;955;----;Presov;;Slovakia;6;49-02N;021-19E;;;307;324; 11;958;----;Kojovska Hola;;Slovakia;6;48-47N;020-59E;;;1242;1247; 11;968;LKKZ;Kosice;;Slovakia;6;48-40N;021-13E;48-42N;021-16E;230;231;P 11;976;----;Stropkov, Tisinec;;Slovakia;6;49-13N;021-39E;;;216;217; 11;978;----;Milhostov;;Slovakia;6;48-40N;021-44E;;;104;; 11;993;LZKC;Kamenica Nad Cirochou;;Slovakia;6;48-56N;022-00E;;;177;; 12;100;----;Kolobrzeg;;Poland;6;54-11N;015-35E;;;3;5;P 12;105;EPKO;Koszalin;;Poland;6;54-12N;016-09E;54-12N;016-11E;32;34; 12;106;----;Koszalin Zegrze Pom.;;Poland;6;54-02N;016-18E;;;72;73; 12;115;----;Ustka;;Poland;6;54-35N;016-52E;;;6;8;P 12;120;----;Leba;;Poland;6;54-45N;017-32E;54-45N;017-32E;2;2;P 12;125;----;Lebork;;Poland;6;54-33N;017-45E;;;17;22;P 12;135;----;Hel;;Poland;6;54-36N;018-49E;;;1;3;P 12;145;----;Gdynia;;Poland;6;54-31N;018-34E;;;2;15; 12;150;EPGD;Gdansk-Rebiechowo;;Poland;6;54-23N;018-28E;54-23N;018-28E;135;138;P 12;155;----;Gdansk-Swibno;;Poland;6;54-20N;018-56E;;;7;9; 12;160;----;Elblag;;Poland;6;54-10N;019-26E;;;40;43;P 12;185;----;Ketrzyn;;Poland;6;54-04N;021-22E;;;108;110;P 12;195;----;Suwalki;;Poland;6;54-08N;022-57E;54-08N;022-57E;184;186;P 12;200;----;Swinoujscie;;Poland;6;53-55N;014-14E;;;6;5;P 12;205;EPSC;Szczecin;;Poland;6;53-24N;014-37E;53-24N;014-37E;1;3;P 12;206;----;Goleniow;;Poland;6;53-35N;014-54E;;;36;38; 12;210;----;Resko;;Poland;6;53-46N;015-25E;;;52;56;P 12;215;----;Szczecinek;;Poland;6;53-43N;016-41E;;;137;144;P 12;230;----;Pila;;Poland;6;53-08N;016-45E;;;72;73;P 12;235;----;Chojnice;;Poland;6;53-42N;017-33E;;;172;177;P 12;250;----;Torun;;Poland;6;53-02N;018-35E;;;69;72;P 12;270;----;Mlawa;;Poland;6;53-06N;020-21E;;;147;149;P 12;272;----;Olsztyn;;Poland;6;53-46N;020-25E;53-46N;020-25E;133;135;P 12;280;----;Mikolajki;;Poland;6;53-47N;021-35E;;;127;131;P 12;285;----;Ostroleka;;Poland;6;53-05N;021-34E;;;95;96;P 12;295;----;Bialystok;;Poland;6;53-06N;023-10E;53-06N;023-10E;148;151;P 12;300;----;Gorzow Wlkp;;Poland;6;52-45N;015-17E;;;72;73;P 12;310;----;Slubice;;Poland;6;52-21N;014-36E;;;21;24;P 12;330;EPPO;Poznan;;Poland;6;52-25N;016-50E;52-25N;016-50E;86;92;P 12;345;----;Kolo;;Poland;6;52-12N;018-40E;;;115;117;P 12;360;----;Plock;;Poland;6;52-35N;019-44E;52-32N;019-40E;106;109;P 12;365;----;Brwinow;;Poland;6;52-08N;020-43E;;;96;98; 12;372;----;Warszawa Bielany;;Poland;6;52-17N;020-58E;;;98;99; 12;374;----;Legionowo;;Poland;6;52-24N;020-58E;52-24N;020-58E;94;96;P 12;375;EPWA;Warszawa-Okecie;;Poland;6;52-10N;020-58E;52-11N;020-59E;106;107;P 12;385;----;Siedlce;;Poland;6;52-11N;022-16E;;;146;149;P 12;399;----;Terespol;;Poland;6;52-04N;023-37E;;;133;137;P 12;400;EPZG;Zielona Gora;;Poland;6;51-56N;015-32E;;;192;192;P 12;415;----;Legnica Bartoszow;;Poland;6;51-12N;016-12E;;;122;124;P 12;418;----;Leszno-Strzyzewice;;Poland;6;51-50N;016-32E;;;91;92;P 12;424;EPWR;Wroclaw Ii;;Poland;6;51-06N;016-53E;;;120;121;P 12;425;----;Wroclaw I;;Poland;6;51-08N;016-59E;51-08N;016-59E;116;116;P 12;435;----;Kalisz;;Poland;6;51-44N;018-05E;;;140;144;P 12;455;----;Wielun;;Poland;6;51-13N;018-34E;;;200;201;P 12;465;----;Lodz;;Poland;6;51-44N;019-24E;51-44N;019-24E;187;188;P 12;469;----;Sulejow;;Poland;6;51-21N;019-52E;;;188;189; 12;471;----;Belsk;;Poland;6;51-50N;020-48E;;;180;; 12;485;----;Radom;;Poland;6;51-25N;021-07E;;;183;185;P 12;488;----;Kozienice;;Poland;6;51-34N;021-33E;;;107;126; 12;490;----;Deblin / Irena;;Poland;6;51-33N;021-51E;;;124;; 12;491;----;Pulawy;;Poland;6;51-25N;021-58E;;;142;143; 12;495;----;Lublin Radawiec;;Poland;6;51-13N;022-24E;;;238;240;P 12;497;----;Wlodawa;;Poland;6;51-33N;023-32E;;;177;179;P 12;500;----;Jelenia Gora;;Poland;6;50-54N;015-48E;50-54N;015-48E;342;344;P 12;510;----;Sniezka;;Poland;6;50-44N;015-44E;;;1603;1613;P 12;520;----;Klodzko;;Poland;6;50-26N;016-37E;;;356;357;P 12;530;----;Opole;;Poland;6;50-40N;017-58E;;;176;178;P 12;540;----;Raciborz;;Poland;6;50-03N;018-12E;;;205;206;P 12;550;----;Czestochowa;;Poland;6;50-49N;019-06E;;;293;295;P 12;555;----;Pyrzowice;;Poland;6;50-29N;019-05E;;;303;301; 12;560;EPKT;Katowice;;Poland;6;50-14N;019-02E;;;284;284;P 12;566;EPKK;Krakow;;Poland;6;50-05N;019-48E;50-05N;019-48E;237;237;P 12;570;----;Kielce;;Poland;6;50-49N;020-42E;50-51N;020-37E;260;261;P 12;575;----;Tarnow;;Poland;6;50-02N;020-59E;;;209;209;P 12;580;EPRZ;Rzeszow-Jasionka;;Poland;6;50-06N;022-03E;50-06N;022-03E;200;202;P 12;585;----;Sandomierz;;Poland;6;50-42N;021-43E;;;217;218;P 12;595;----;Zamosc;;Poland;6;50-42N;023-15E;;;212;213;P 12;600;----;Bielsko-Biala;;Poland;6;49-48N;019-00E;49-48N;019-00E;398;399;P 12;625;----;Zakopane;;Poland;6;49-18N;019-57E;;;857;860;P 12;650;----;Kasprowy Wierch;;Poland;6;49-14N;019-59E;;;1991;1989;P 12;660;----;Nowy Sacz;;Poland;6;49-37N;020-42E;;;292;295;P 12;690;----;Lesko;;Poland;6;49-28N;022-20E;;;420;422;P 12;695;----;Przemysl;;Poland;6;49-48N;022-46E;;;279;280;P 12;756;----;Szecseny;;Hungary;6;48-07N;019-31E;;;152;153; 12;766;----;Josvafo;;Hungary;6;48-29N;020-32E;;;305;; 12;772;LHMC;Miskolc;;Hungary;6;48-05N;020-46E;48-06N;020-47E;232;236;P 12;786;----;Zahony;;Hungary;6;48-24N;022-10E;;;103;104; 12;805;----;Sopron;;Hungary;6;47-41N;016-36E;47-41N;016-36E;233;239;P 12;812;LHSY;Szombathely;;Hungary;6;47-16N;016-38E;47-16N;016-38E;220;221;P 12;815;----;Mosonmagyarovar;;Hungary;6;47-53N;017-17E;;;121;122; 12;822;----;Gyor;;Hungary;6;47-43N;017-41E;47-42N;017-41E;116;117;P 12;825;LHPA;Papa;;Hungary;6;47-12N;017-30E;;;145;146;P 12;830;----;Veszprem / Szentkiralyszabadja;;Hungary;6;47-04N;017-50E;;;280;281;P 12;836;----;Tata;;Hungary;6;47-39N;018-19E;;;128;129; 12;838;LHBS;Budaors;;Hungary;6;47-27N;018-58E;;;132;; 12;839;LHBP;Budapest / Ferihegy;;Hungary;6;47-26N;019-16E;;;151;185; 12;840;LHBM;Budapest Met Center;;Hungary;6;47-31N;019-02E;;;129;; 12;843;----;Budapest / Lorinc;;Hungary;6;47-26N;019-11E;47-26N;019-11E;138;139;P 12;844;----;Tokol;;Hungary;6;47-21N;018-59E;;;100;104; 12;846;----;Agard;;Hungary;6;47-11N;018-37E;;;105;106; 12;851;----;Kekesteto;;Hungary;6;47-52N;020-01E;;;1010;1015;P 12;860;LHSN;Szolnok;;Hungary;6;47-07N;020-14E;47-10N;020-14E;89;94;P 12;866;----;Poroszlo;;Hungary;6;47-39N;020-38E;;;91;92; 12;870;----;Eger;;Hungary;6;47-54N;020-23E;;;220;218;P 12;882;LHDC;Debrecen;;Hungary;6;47-29N;021-36E;47-29N;021-38E;108;109;P 12;892;LHNY;Nyiregyhaza / Napkor;;Hungary;6;47-58N;021-59E;;;141;142;P 12;910;----;Szentgotthard / Farkasfa;;Hungary;6;46-55N;016-19E;;;312;313;P 12;915;----;Zalaegerszeg / Andrashida;;Hungary;6;46-52N;016-48E;;;179;180; 12;920;----;Keszthely;;Hungary;6;46-44N;017-14E;46-45N;017-15E;112;113;P 12;925;----;Nagykanizsa;;Hungary;6;46-27N;016-58E;;;139;141;P 12;930;LHKV;Kaposvar;;Hungary;6;46-23N;017-50E;;;144;145; 12;932;----;Taszar;;Hungary;6;46-24N;017-55E;;;156;156;P 12;935;LHSK;Siofok;;Hungary;6;46-55N;018-03E;46-55N;018-03E;108;109;P 12;942;LHPP;Pecs / Pogany;;Hungary;6;46-06N;018-14E;46-00N;018-14E;201;203;P 12;950;----;Paks;;Hungary;6;46-35N;018-51E;;;97;98;P 12;960;----;Baja;;Hungary;6;46-11N;019-01E;;;112;113;P 12;970;LHKE;Kecskemet;;Hungary;6;46-55N;019-45E;;;113;123;P 12;982;LHUD;Szeged;;Hungary;6;46-15N;020-06E;46-15N;020-06E;82;83;P 12;992;LHBC;Bekescsaba;;Hungary;6;46-41N;021-10E;;;88;90;P 13;005;----;Bovec;;Serbia and Montenegro;6;46-20N;013-34E;;;452;; 13;007;----;Ratece / Planica;;Serbia and Montenegro;6;46-30N;013-43E;;;865;; 13;023;----;Celje;;Serbia and Montenegro;6;46-15N;015-15E;;;244;; 13;024;----;Lisca;;Serbia and Montenegro;6;46-04N;015-17E;;;941;; 13;026;----;Maribor;;Slovenia;6;46-29N;015-41E;46-32N;015-39E;265;264; 13;031;LJMS;Murska Sobota;;Slovenia;6;46-39N;016-11E;;;188;; 13;067;----;Palic;;Serbia and Montenegro;6;46-06N;019-46E;46-06N;019-46E;102;105;P 13;105;LJPZ;Portoroz;;Slovenia;6;45-31N;013-34E;;;95;; 13;116;LDRI;Rijeka / Omisalj;;Croatia;6;45-13N;014-35E;;;85;; 13;150;----;Became Station 143700;;Serbia and Montenegro;6;45-10N;018-00E;45-10N;018-00E;89;88; 13;160;----;Sombor;;Serbia and Montenegro;6;45-46N;019-09E;;;87;89;P 13;168;----;Novi Sad Rimski Sancevi;;Serbia and Montenegro;6;45-20N;019-51E;;;86;87;P 13;173;----;Zrenjanin;;Serbia and Montenegro;6;45-22N;020-25E;;;80;82; 13;174;----;Kikinda;;Serbia and Montenegro;6;45-51N;020-28E;;;81;82; 13;180;----;Banatski Karlovac;;Serbia and Montenegro;6;45-03N;021-02E;;;90;91; 13;183;LYVR;Vrsac;;Serbia and Montenegro;6;45-09N;021-19E;;;83;85;P 13;219;----;Zavizan Mountain;;Serbia and Montenegro;6;44-49N;014-59E;;;1597;; 13;228;LQBI;Bihac;;Serbia and Montenegro;6;44-49N;015-53E;44-49N;015-53E;250;246; 13;242;LQBK;Banja Luka;;Bosnia and Herzegovina;6;44-47N;017-13E;;;156;; 13;244;----;Became Station 145440;;Serbia and Montenegro;6;44-04N;017-28E;;;566;; 13;249;----;Became Station 145490;;Serbia and Montenegro;6;44-13N;017-54E;;;348;; 13;257;LQTZ;Tuzla;;Bosnia and Herzegovina;6;44-33N;018-42E;;;306;; 13;262;----;Loznica;;Serbia and Montenegro;6;44-33N;019-14E;;;121;122;P 13;266;----;Sremska Mitrovica;;Serbia and Montenegro;6;45-06N;019-33E;;;82;83; 13;269;----;Valjevo;;Serbia and Montenegro;6;44-19N;019-55E;;;176;177;P 13;272;LYBE;Beograd / Surcin;;Serbia and Montenegro;6;44-49N;020-17E;;;96;99;P 13;274;----;Beograd;;Serbia and Montenegro;6;44-48N;020-28E;;;132;132;P 13;275;----;Beograd / Kosutnjak;;Serbia and Montenegro;6;44-46N;020-25E;;;203;203; 13;279;----;Smederevska Palanka;;Serbia and Montenegro;6;44-22N;020-57E;44-22N;020-57E;121;122; 13;285;----;Veliko Gradiste;;Serbia and Montenegro;6;44-45N;021-31E;;;82;84;P 13;289;----;Crni Vrh;;Serbia and Montenegro;6;44-07N;021-57E;;;1037;1039;P 13;295;----;Negotin;;Serbia and Montenegro;6;44-14N;022-33E;;;42;44;P 13;334;----;Split / Marjan;;Serbia and Montenegro;6;43-31N;016-26E;43-31N;016-26E;128;122; 13;340;----;Became Station 146400;;Serbia and Montenegro;6;43-50N;017-01E;;;728;; 13;348;LQMO;Mostar;;Bosnia and Herzegovina;6;43-21N;017-48E;43-21N;017-48E;108;99; 13;352;----;Became Station 146520;;Serbia and Montenegro;6;43-43N;018-16E;;;2070;; 13;353;LQSA;Sarajevo;;Bosnia and Herzegovina;6;43-49N;018-20E;43-49N;018-20E;511;510; 13;354;----;Became Station 146540;;Serbia and Montenegro;6;43-52N;018-26E;;;638;; 13;361;----;Zabljak;;Serbia and Montenegro;6;43-09N;019-08E;;;1450;1450; 13;363;----;Plevlja;;Serbia and Montenegro;6;43-21N;019-21E;;;784;788;P 13;367;----;Zlatibor;;Serbia and Montenegro;6;43-44N;019-43E;;;1029;1029;P 13;369;----;Sjenica;;Serbia and Montenegro;6;43-17N;020-00E;;;1038;1039;P 13;370;----;Pozega Uzicka;;Serbia and Montenegro;6;43-50N;020-02E;;;310;312; 13;376;----;Kraljevo;;Serbia and Montenegro;6;43-42N;020-42E;;;215;217;P 13;378;----;Kopaonik;;Serbia and Montenegro;6;43-17N;020-48E;;;1711;1713; 13;383;----;Krusevac;;Serbia and Montenegro;6;43-34N;021-21E;;;166;167; 13;384;----;Cuprija;;Serbia and Montenegro;6;43-56N;021-23E;;;123;125;P 13;388;LYNI;Nis;;Serbia and Montenegro;6;43-20N;021-54E;43-20N;021-54E;202;202;P 13;389;----;Leskovac;;Serbia and Montenegro;6;42-59N;021-57E;;;230;232;P 13;397;----;Dimitrovgrad;;Serbia and Montenegro;6;43-01N;022-45E;;;448;450; 13;455;----;Herceg Novi-Igalo;;Serbia and Montenegro;6;42-27N;018-33E;;;10;10; 13;457;LYTV;Tivat;;Serbia and Montenegro;6;42-24N;018-44E;;;5;5;P 13;459;----;Niksic;;Serbia and Montenegro;6;42-46N;018-57E;;;647;647;P 13;461;----;Bar;;Serbia and Montenegro;6;42-06N;019-06E;;;4;6; 13;462;LYTI;Podgorica / Golubovci;;Serbia and Montenegro;6;42-22N;019-15E;42-22N;019-15E;33;33;P 13;463;----;Podgorica-Grad;;Serbia and Montenegro;6;42-26N;019-17E;;;49;50; 13;464;----;Ulcinj;;Serbia and Montenegro;6;41-55N;019-13E;;;24;29; 13;465;----;Kolasin;;Serbia and Montenegro;6;42-50N;019-32E;;;944;945; 13;473;----;Pec;;Serbia and Montenegro;6;42-40N;020-18E;;;498;499;P 13;477;----;Prizren;;Serbia and Montenegro;6;42-13N;020-44E;;;402;403;P 13;481;LYPR;Pristina;;Serbia and Montenegro;6;42-34N;021-02E;;;545;576;P 13;489;----;Vranje;;Serbia and Montenegro;6;42-33N;021-55E;;;433;434;P 13;492;----;Popova Sapka;;Macedonia, The Republic of;6;41-01N;020-53E;;;;1750; 13;493;----;Kriva Palanka;;Macedonia, The Republic of;6;42-12N;022-20E;;;691;696;P 13;562;----;Ulcinj;;Serbia and Montenegro;6;41-55N;019-13E;;;29;; 13;575;----;Pozarane-Pgc;;Macedonia, The Republic of;6;41-51N;020-52E;;;;885; 13;577;----;Lazaropole;;Macedonia, The Republic of;6;41-32N;020-42E;;;1332;1321; 13;578;LWOH;Ohrid;;Macedonia, The Republic of;6;41-07N;020-48E;;;760;761; 13;579;----;Ohrid-Aerodrome;;Macedonia, The Republic of;6;41-06N;028-49E;;;705;700; 13;580;----;Pretor-Pgc;;Macedonia, The Republic of;6;40-51N;021-04E;;;912;910; 13;581;----;Topolcani-Pgc;;Macedonia, The Republic of;6;41-13N;021-28E;;;;; 13;583;----;Bitola;;Macedonia, The Republic of;6;41-03N;021-22E;;;586;589;P 13;584;----;Solunska Glava;;Macedonia, The Republic of;6;41-44N;021-31E;;;;2540; 13;585;----;Prilep;;Macedonia, The Republic of;6;41-20N;021-34E;;;673;674; 13;586;LWSK;Skopje-Petrovec;;Macedonia, The Republic of;6;41-58N;021-39E;41-57N;021-38E;238;239;P 13;588;----;Skopje-Zajceprid;;Macedonia, The Republic of;6;42-01N;021-24E;;;302;301; 13;590;----;Gjuriste-Pgc;;Macedonia, The Republic of;6;41-54N;021-51E;;;854;856; 13;591;----;Stip;;Macedonia, The Republic of;6;41-45N;022-11E;;;326;327; 13;592;----;Demir Kapija;;Macedonia, The Republic of;6;41-25N;022-15E;;;125;126; 13;593;----;Pozar-Pgc;;Macedonia, The Republic of;6;41-18N;022-25E;;;1031;1030; 13;594;----;Vinica-Pgc;;Macedonia, The Republic of;6;41-53N;022-30E;;;518;513; 13;595;----;Strumica;;Macedonia, The Republic of;6;41-26N;022-39E;;;;; 13;597;----;Gevgelija;;Macedonia, The Republic of;6;41-09N;022-30E;;;60;59; 13;598;----;Berovo;;Macedonia, The Republic of;6;41-43N;022-51E;;;834;836; 13;600;----;Shkodra;;Albania;6;42-06N;019-32E;;;43;44;P 13;610;----;Kukes;;Albania;6;42-02N;020-25E;;;354;358;P 13;611;----;Durres;;Albania;6;41-18N;019-27E;;;15;12;P 13;615;LATI;Tirana;;Albania;6;41-20N;019-47E;41-20N;019-47E;89;90;P 13;619;----;Peshkopi;;Albania;6;41-41N;020-26E;;;657;653;P 13;622;----;Vlore;;Albania;6;40-28N;019-29E;;;1;5;P 13;624;----;Qyteti Stalin;;Albania;6;40-48N;019-54E;;;32;33;P 13;625;----;Gjirokastra;;Albania;6;40-05N;020-09E;;;193;194;P 13;629;----;Korca;;Albania;6;40-36N;020-46E;;;889;900;P 14;005;----;Bovec;;Slovenia;6;46-20N;013-34E;;;452;; 14;006;----;Vogel;;Slovenia;6;46-16N;013-50E;;;1535;; 14;007;----;Ratece;;Slovenia;6;46-30N;013-43E;;;864;865; 14;008;----;Kredarica;;Slovenia;6;46-23N;013-51E;;;2514;2515; 14;009;----;Vojsko;;Slovenia;6;46-02N;013-54E;;;1067;; 14;010;----;Lesce;;Slovenia;6;46-22N;014-11E;;;515;; 14;012;----;Katarina;;Slovenia;6;46-06N;014-22E;;;685;; 14;014;LJLJ;Ljubljana / Brnik;;Slovenia;6;46-13N;014-29E;46-13N;014-29E;385;362; 14;015;----;Ljubljana / Bezigrad;;Slovenia;6;46-04N;014-31E;46-04N;014-31E;299;298; 14;021;----;Slovenj Gradec;;Slovenia;6;46-29N;015-07E;;;452;; 14;023;----;Celje;;Slovenia;6;46-15N;015-15E;;;244;; 14;024;----;Lisca;;Slovenia;6;46-04N;015-17E;;;943;941; 14;025;----;Maribor / Tabor;;Slovenia;6;46-32N;015-39E;;;275;278; 14;026;LJMB;Maribor / Slivnica;;Slovenia;6;46-29N;015-41E;;;264;265; 14;031;----;Murska Sobota;;Slovenia;6;46-39N;016-11E;;;188;188; 14;105;LYPZ;Portoroz / Secovlje;;Slovenia;6;45-29N;013-37E;;;2;3; 14;106;----;Nova Gorica;;Slovenia;6;45-54N;013-38E;;;55;56; 14;111;----;Ilirska Bistrica;;Slovenia;6;45-34N;014-15E;;;413;; 14;112;----;Postojna;;Slovenia;6;45-46N;014-12E;;;533;; 14;118;----;Kocevje;;Slovenia;6;45-39N;014-51E;;;467;; 14;120;----;Crnomelj;;Slovenia;6;45-34N;015-09E;;;157;; 14;121;----;Novo Mesto;;Slovenia;6;45-48N;015-11E;;;220;213; 14;216;----;Rijeka / Kozala;;Croatia;6;45-20N;014-27E;;;120;125; 14;219;----;Parg;;Croatia;6;45-36N;014-38E;;;863;863; 14;232;----;Karlovac;;Croatia;6;45-30N;015-33E;;;112;117; 14;234;----;Krapina;;Croatia;6;46-08N;015-53E;;;202;203; 14;235;----;Puntijarka;;Croatia;6;45-55N;015-58E;;;988;988; 14;236;----;Zagreb / Gric;;Croatia;6;45-49N;015-59E;;;157;162; 14;240;LDDD;Zagreb / Maksimir;;Croatia;6;45-49N;016-02E;45-49N;016-02E;123;128; 14;241;LDZA;Zagreb / Pleso;;Croatia;6;45-44N;016-04E;;;106;107; 14;244;----;Sisak;;Croatia;6;45-30N;016-22E;;;98;106; 14;246;LDVA;Varazdin;;Croatia;6;46-18N;016-23E;;;167;168; 14;248;----;Krizevci;;Croatia;6;46-02N;016-33E;;;155;146; 14;253;----;Bjelovar;;Croatia;6;45-44N;016-51E;;;141;142; 14;256;----;Bilogora;;Croatia;6;45-53N;017-12E;;;261;263; 14;258;----;Daruvar;;Croatia;6;45-36N;017-14E;;;161;161; 14;279;----;Osijek / Spa;;Croatia;6;45-32N;018-38E;;;89;92; 14;280;LDOS;Osijek / Cepin;;Croatia;6;45-27N;018-48E;;;88;; 14;283;----;Osijek / Zeleno Polje;;Croatia;6;45-32N;014-44E;;;89;92; 14;284;----;Osijek / Klisa;;Croatia;6;45-28N;018-49E;;;88;88; 14;301;----;Porec;;Croatia;6;45-14N;013-36E;;;15;15; 14;303;----;Rovinj / Sv. Ivan Na Pucini;;Croatia;6;45-03N;013-37E;;;8;; 14;307;LDPL;Pula Aerodrome;;Croatia;6;45-54N;013-55E;;;63;63; 14;308;----;Pazin;;Croatia;6;45-14N;013-56E;;;291;293; 14;314;----;Mali Losinj;;Croatia;6;44-32N;014-28E;;;53;53; 14;317;----;Rijeka / Omisalj;;Croatia;6;45-13N;014-35E;;;85;85; 14;320;----;Crikvenica;;Croatia;6;45-10N;014-42E;;;2;; 14;321;----;Rab;;Croatia;6;44-45N;014-46E;;;24;20; 14;323;----;Senj;;Croatia;6;44-59N;014-54E;;;26;28; 14;324;----;Zavizan;;Croatia;6;44-49N;014-59E;;;1594;1597; 14;328;----;Ogulin;;Croatia;6;45-16N;015-14E;;;328;328; 14;330;----;Gospic;;Croatia;6;44-33N;015-22E;;;564;565; 14;370;LDOR;Slavonski Brod;;Croatia;6;45-10N;018-00E;45-10N;018-00E;88;89; 14;382;----;Gradiste;;Croatia;6;45-09N;018-42E;;;97;98; 14;427;----;Vela Sestrica;;Croatia;6;43-51N;015-12E;;;35;; 14;428;----;Zadar Puntamika;;Croatia;6;44-08N;015-13E;;;5;7; 14;431;LDZD;Zadar / Zemunik;;Croatia;6;44-06N;015-21E;;;82;; 14;437;----;Gradak;;Croatia;6;44-18N;015-51E;;;560;; 14;438;----;Sibenik;;Croatia;6;43-44N;015-55E;;;77;75; 14;441;----;Komiza;;Croatia;6;43-03N;016-02E;;;6;20; 14;442;----;Knin;;Croatia;6;44-02N;016-12E;;;255;255; 14;443;----;Palagruza;;Croatia;6;42-24N;016-16E;;;97;98; 14;444;LDSP;Split / Resnik;;Croatia;6;43-32N;016-18E;;;19;21; 14;445;----;Split / Marjan;;Croatia;6;43-31N;016-26E;;;122;128; 14;447;LDSH;Hvar;;Croatia;6;43-10N;016-27E;;;20;25; 14;452;----;Lastovo;;Croatia;6;42-26N;016-54E;;;186;187; 14;454;----;Makarska;;Croatia;6;43-17N;017-01E;;;49;49; 14;457;----;Imotski;;Croatia;6;43-27N;017-13E;;;435;; 14;462;----;Ploce;;Croatia;6;43-02N;017-25E;;;2;5; 14;472;----;Dubrovnik / Gorica;;Croatia;6;42-39N;018-05E;;;52;53; 14;474;LDDU;Dubrovnik / Cilipi;;Croatia;6;42-34N;018-16E;;;157;165; 14;528;----;Bihac;;Bosnia and Herzegovina;6;44-49N;015-53E;;;246;250;P 14;542;----;Banja Luka;;Bosnia and Herzegovina;6;44-47N;017-13E;;;153;156;P 14;544;----;Bugojno;;Bosnia and Herzegovina;6;44-04N;017-28E;;;562;566; 14;549;----;Zenica;;Bosnia and Herzegovina;6;44-13N;017-54E;;;345;348; 14;557;----;Tuzla;;Bosnia and Herzegovina;6;44-33N;018-42E;;;305;306; 14;640;LQLV;Livno;;Bosnia and Herzegovina;6;43-50N;017-01E;;;724;728; 14;648;----;Mostar;;Bosnia and Herzegovina;6;43-21N;017-48E;;;99;108;P 14;652;----;Bjelasnica;;Bosnia and Herzegovina;6;43-43N;018-16E;;;2067;2070;P 14;653;----;Sarajevo-Butmir;;Bosnia and Herzegovina;6;43-49N;018-20E;;;510;511;P 14;654;----;Sarajevo-Bejelave;;Bosnia and Herzegovina;6;43-52N;018-26E;;;630;638;P 14;656;----;Cemerno;;Bosnia and Herzegovina;6;43-14N;018-36E;;;1305;1309; 15;001;----;Avrameni;;Romania;6;48-01N;026-57E;;;240;; 15;004;----;Sighetu Marmatiei;;Romania;6;47-58N;023-55E;;;275;276;P 15;007;----;Radauti;;Romania;6;47-51N;025-55E;;;392;; 15;009;----;Dorohoi;;Romania;6;47-58N;026-24E;;;241;; 15;010;LRSM;Satu Mare;;Romania;6;47-48N;022-53E;47-47N;022-53E;123;124;P 15;014;LRBM;Baia Mare;;Romania;6;47-40N;023-35E;47-40N;023-35E;218;194; 15;015;----;Ocna Sugatag;;Romania;6;47-47N;023-56E;;;504;; 15;020;----;Botosani;;Romania;6;47-41N;026-40E;;;161;162;P 15;023;LRSV;Suceava / Salcea;;Romania;6;47-39N;026-15E;47-39N;026-15E;351;351; 15;033;----;Ineu Mountain;;Romania;6;47-32N;024-53E;;;1792;; 15;040;----;Cimpulung Moldovene;;Romania;6;47-32N;025-34E;;;660;; 15;041;----;Rauseni;;Romania;6;47-34N;027-12E;;;61;; 15;042;----;Sacueni;;Romania;6;47-22N;022-06E;;;113;; 15;044;----;Supuru De Jos;;Romania;6;47-28N;022-48E;;;162;; 15;052;----;Rarau;;Romania;6;47-27N;025-34E;;;1572;1574;P 15;055;----;Radaseni;;Romania;6;47-28N;026-15E;;;230;; 15;056;----;Cotnari;;Romania;6;47-21N;026-59E;;;289;; 15;063;----;Zalau;;Romania;6;47-11N;023-05E;;;292;294; 15;069;----;Poiana Stampei;;Romania;6;47-19N;025-08E;;;910;; 15;073;----;Tirgu Neamt;;Romania;6;47-12N;026-22E;;;389;; 15;075;----;Podul Iloaiei;;Romania;6;47-13N;027-16E;;;90;; 15;080;LROD;Oradea;;Romania;6;47-03N;021-56E;47-03N;021-56E;135;140;P 15;083;----;Dej;;Romania;6;47-09N;023-52E;;;150;; 15;085;----;Bistrita;;Romania;6;47-08N;024-30E;;;366;367;P 15;089;----;Ceahlau;;Romania;6;47-03N;025-58E;;;554;; 15;090;LRIA;Iasi;;Romania;6;47-10N;027-38E;47-10N;027-38E;102;104;P 15;095;----;Borod;;Romania;6;46-59N;022-38E;;;317;; 15;099;----;Huedin;;Romania;6;46-52N;023-03E;;;561;; 15;107;----;Toplita;;Romania;6;46-55N;025-20E;;;689;; 15;108;----;Ceahlau Toaca;;Romania;6;46-56N;025-55E;;;1897;1898;P 15;109;----;Piatra Neamt;;Romania;6;46-55N;026-20E;;;361;; 15;111;----;Roman;;Romania;6;46-55N;026-50E;;;216;217; 15;113;----;Negresti;;Romania;6;46-50N;027-26E;;;133;; 15;117;----;Holod;;Romania;6;46-47N;022-08E;;;161;; 15;119;----;Vladeasa Mountain;;Romania;6;46-45N;022-48E;;;1848;; 15;120;LRCL;Cluj-Napoca;;Romania;6;46-47N;023-34E;46-47N;023-34E;410;413;P 15;123;----;Sarmasu;;Romania;6;46-45N;024-10E;;;401;; 15;127;----;Joseni;;Romania;6;46-42N;025-30E;;;749;; 15;132;----;Plopana;;Romania;6;46-41N;027-14E;;;251;; 15;134;----;Husi;;Romania;6;46-41N;028-04E;;;98;; 15;136;----;Chisineu Cris;;Romania;6;46-32N;021-31E;;;96;; 15;138;----;Zerind;;Romania;6;46-37N;021-31E;;;589;; 15;140;----;Steiu;;Romania;6;46-32N;022-27E;;;500;; 15;143;----;Turda;;Romania;6;46-34N;023-47E;;;430;; 15;145;LRTM;Tirgu Mures;;Romania;6;46-32N;024-32E;46-32N;024-32E;308;309;P 15;148;----;Luizi Calugara;;Romania;6;46-32N;026-50E;;;1285;; 15;150;LRBC;Bacau;;Romania;6;46-35N;026-58E;46-35N;026-59E;184;190;P 15;154;----;Vaslui;;Romania;6;46-38N;027-44E;;;116;; 15;158;----;Zarand;;Romania;6;46-24N;021-39E;;;112;; 15;159;----;Mocrea;;Romania;6;46-23N;021-49E;;;697;; 15;160;----;Doctor Petru Groza;;Romania;6;46-37N;022-25E;;;279;; 15;162;----;Cimpeni;;Romania;6;46-22N;023-03E;;;583;; 15;163;----;Baisoara;;Romania;6;46-35N;023-28E;;;1353;; 15;168;----;Odorheiu;;Romania;6;46-18N;025-18E;;;525;; 15;170;----;Miercurea Ciuc;;Romania;6;46-22N;025-44E;;;662;662; 15;174;----;Oncesti;;Romania;6;46-28N;027-15E;;;204;; 15;182;----;Gurahont;;Romania;6;46-16N;022-21E;;;179;; 15;184;----;Medias;;Romania;6;46-10N;024-21E;;;1186;; 15;189;----;Dumbraveni;;Romania;6;46-14N;024-34E;;;318;; 15;194;----;Tirgu Ocna;;Romania;6;46-17N;026-37E;;;243;; 15;197;----;Birlad;;Romania;6;46-14N;027-40E;;;172;173;P 15;199;----;Sinnicolau Mare;;Romania;6;46-05N;020-38E;;;84;; 15;200;LRAR;Arad;;Romania;6;46-12N;021-24E;46-10N;021-19E;117;118;P 15;204;----;Varadia De Mures;;Romania;6;46-01N;022-09E;;;156;; 15;206;----;Brad;;Romania;6;46-08N;022-47E;;;257;; 15;208;----;Alba Iulia;;Romania;6;46-04N;023-35E;;;253;; 15;209;----;Blaj;;Romania;6;46-11N;023-55E;;;334;334; 15;212;----;Homorod;;Romania;6;46-03N;025-16E;;;451;; 15;215;----;Baraolt;;Romania;6;46-05N;025-36E;;;508;; 15;217;----;Tirgu Secuesc;;Romania;6;46-00N;026-08E;;;568;; 15;219;----;Adjud;;Romania;6;46-06N;027-10E;;;101;; 15;221;----;Balintesti;;Romania;6;46-02N;027-55E;;;214;; 15;230;----;Deva;;Romania;6;45-53N;022-54E;45-53N;022-54E;230;231;P 15;231;----;Sebes;;Romania;6;45-58N;023-34E;;;253;; 15;235;----;Fagaras;;Romania;6;45-51N;024-59E;45-51N;024-59E;428;429;P 15;238;----;Sfintu Gheorghe;;Romania;6;45-52N;025-47E;;;525;; 15;241;----;Tulnici;;Romania;6;45-55N;026-40E;;;563;; 15;247;LRTR;Timisoara;;Romania;6;45-46N;021-15E;45-46N;021-15E;86;88;P 15;254;----;Paltinis Sibiu;;Romania;6;45-39N;023-55E;;;1454;; 15;260;LRSB;Sibiu;;Romania;6;45-48N;024-09E;45-48N;024-09E;443;444;P 15;261;----;Intorsura Buzaului;;Romania;6;45-41N;026-01E;;;707;710; 15;262;----;Lacaut Mountain;;Romania;6;45-49N;026-22E;;;1776;; 15;265;----;Tecuci;;Romania;6;45-52N;027-25E;;;61;; 15;267;----;Rauti;;Romania;6;45-40N;020-56E;;;80;; 15;270;----;Lugoj;;Romania;6;45-41N;021-55E;;;125;; 15;273;----;Piclisa;;Romania;6;45-34N;022-53E;;;381;; 15;277;----;Boita;;Romania;6;45-38N;024-15E;;;517;; 15;280;----;Vf. Omu;;Romania;6;45-27N;025-27E;;;2504;2509;P 15;287;----;Maicanesti;;Romania;6;45-30N;027-30E;;;18;; 15;289;----;Banloc;;Romania;6;45-23N;021-08E;;;82;; 15;292;LRCS;Caransebes;;Romania;6;45-25N;022-15E;;;241;242;P 15;296;----;Petrosani;;Romania;6;45-25N;023-23E;;;607;599; 15;297;----;Brezoi;;Romania;6;45-21N;024-15E;;;1346;; 15;298;----;Cozia Pass Automated Reporting Station ;;Romania;6;45-15N;024-15E;;;1640;; 15;299;----;Rucar;;Romania;6;45-24N;025-10E;;;581;; 15;300;----;Brasov;;Romania;6;45-38N;025-35E;45-42N;025-32E;538;528; 15;301;----;Fundata;;Romania;6;45-27N;025-18E;;;1380;; 15;302;----;Predeal;;Romania;6;45-30N;025-35E;45-30N;025-35E;1090;1093; 15;307;----;Rimnicu Sarat;;Romania;6;45-23N;027-03E;;;154;; 15;310;----;Galati;;Romania;6;45-30N;028-01E;45-30N;028-01E;71;72;P 15;315;----;Semenicului Mountain Range;;Romania;6;45-05N;022-05E;;;1445;; 15;316;----;Cuntu;;Romania;6;45-18N;022-31E;;;1447;; 15;317;----;Tarcu Mountain;;Romania;6;45-17N;022-32E;;;2180;; 15;319;----;Voineasa;;Romania;6;45-25N;023-57E;;;587;; 15;320;----;Paring;;Romania;6;45-23N;023-28E;;;1561;; 15;321;----;Paring Automated Reporting Station ;;Romania;6;45-21N;023-31E;;;2075;; 15;324;----;Cimpulung;;Romania;6;45-16N;025-03E;;;600;; 15;325;----;Sinaia;;Romania;6;45-21N;025-33E;;;1510;; 15;328;----;Patirlagele;;Romania;6;45-19N;026-21E;;;284;; 15;333;----;Boboc;;Romania;6;45-12N;026-58E;45-12N;026-58E;15;15; 15;335;LRTC;Tulcea;;Romania;6;45-11N;028-49E;45-11N;028-49E;4;6; 15;336;----;Gorgova;;Romania;6;45-11N;029-10E;;;3;; 15;338;----;Oravita;;Romania;6;45-02N;021-41E;;;308;309; 15;340;----;Tirgu Jiu;;Romania;6;45-02N;023-17E;;;205;206;P 15;341;----;Padesu / Apa Neagra;;Romania;6;45-01N;022-51E;;;262;; 15;344;----;Polovraci Monastery;;Romania;6;45-11N;023-48E;;;530;; 15;345;----;Dedulesti;;Romania;6;45-02N;024-32E;;;548;; 15;346;----;Rimnicu Vilcea;;Romania;6;45-06N;024-22E;;;239;237;P 15;347;----;Curtea De Arges;;Romania;6;45-08N;024-41E;;;448;; 15;349;----;Cimpina;;Romania;6;45-08N;025-44E;;;464;; 15;350;----;Buzau;;Romania;6;45-09N;026-49E;45-09N;026-49E;96;97;P 15;355;----;Faurei /= 694514 Kqyb;;Romania;6;45-04N;027-14E;;;53;; 15;356;----;Viziru;;Romania;6;45-01N;027-42E;;;20;; 15;360;----;Sulina;;Romania;6;45-09N;029-40E;45-09N;029-40E;3;9;P 15;364;----;Bozovici;;Romania;6;44-56N;022-00E;;;257;; 15;366;----;Tirgu Carbunesti;;Romania;6;44-57N;023-31E;;;177;; 15;369;----;Tirgu Logresti;;Romania;6;44-52N;023-43E;;;262;; 15;373;----;Pitesti;;Romania;6;44-51N;024-52E;;;315;; 15;375;----;Tirgoviste;;Romania;6;44-56N;025-26E;;;296;297; 15;377;----;Ploiesti;;Romania;6;44-57N;026-00E;;;177;178;P 15;387;----;Sfintu Gheorghe;;Romania;6;44-54N;029-26E;;;1;; 15;388;----;Moldova Veche;;Romania;6;44-43N;021-37E;;;82;; 15;389;----;Berzasca;;Romania;6;44-39N;021-57E;;;68;; 15;395;----;Dragasani;;Romania;6;44-39N;024-16E;;;280;; 15;402;----;Urziceni;;Romania;6;44-43N;026-38E;;;62;; 15;405;----;Grivita;;Romania;6;44-45N;027-18E;;;50;51;P 15;406;----;Hirsova;;Romania;6;44-41N;027-56E;;;38;; 15;408;----;Corugea;;Romania;6;44-44N;028-20E;;;220;; 15;409;----;Umirea;;Romania;6;44-46N;028-53E;;;37;38; 15;410;----;Drobeta Tr. Severin;;Romania;6;44-38N;022-38E;44-38N;022-38E;77;79;P 15;412;----;Biclesu;;Romania;6;44-27N;023-08E;;;314;; 15;416;----;Stolnici;;Romania;6;44-34N;024-47E;;;209;; 15;419;----;Titu;;Romania;6;44-39N;025-32E;;;159;; 15;420;LRBS;Bucuresti / Imh;;Romania;6;44-30N;026-08E;44-30N;026-08E;90;91;P 15;421;LROP;Bucuresti Otopeni;;Romania;6;44-33N;026-06E;;;95;95; 15;422;----;Bucharest / Filaret;;Romania;6;44-25N;026-05E;;;82;; 15;423;----;Dilga;;Romania;6;44-27N;026-58E;;;51;; 15;424;----;Fundulea;;Romania;6;44-28N;026-31E;;;67;; 15;425;----;Solacolu;;Romania;6;44-23N;026-34E;;;52;; 15;429;----;Sarulesti;;Romania;6;44-25N;026-39E;;;88;; 15;434;----;Gurbanesti;;Romania;6;44-23N;026-42E;;;177;; 15;443;----;Dor Marunt;;Romania;6;44-27N;026-55E;;;40;; 15;444;----;Fetesti;;Romania;6;44-22N;027-51E;;;58;61; 15;450;LRCV;Craiova;;Romania;6;44-14N;023-52E;44-14N;023-52E;192;195;P 15;455;----;Videle;;Romania;6;44-17N;025-31E;;;108;; 15;460;----;Calarasi;;Romania;6;44-12N;027-21E;;;19;20;P 15;462;----;Medgidia;;Romania;6;44-15N;028-17E;;;67;; 15;465;----;Bailesti;;Romania;6;44-01N;023-21E;;;58;; 15;469;----;Caracal;;Romania;6;44-07N;024-21E;;;107;; 15;470;----;Rosiori De Vede;;Romania;6;44-07N;025-00E;;;102;103;P 15;475;----;Chiriac;;Romania;6;44-03N;025-46E;;;16;; 15;476;----;Greaca;;Romania;6;44-07N;026-20E;;;4;; 15;477;----;Oltenita;;Romania;6;44-05N;026-38E;;;32;; 15;479;----;Adamclisi;;Romania;6;44-05N;027-57E;;;158;; 15;480;----;Constanta;;Romania;6;44-13N;028-38E;44-13N;028-38E;13;14;P 15;481;LRCK;Kogalniceanu;;Romania;6;44-20N;028-26E;;;97;102; 15;482;----;Calafat;;Romania;6;43-59N;022-57E;;;68;68; 15;489;----;Alexandria;;Romania;6;43-59N;025-20E;;;76;; 15;490;----;Turnu Magurele;;Romania;6;43-45N;024-53E;43-45N;024-53E;31;31;P 15;491;----;Giurgiu;;Romania;6;43-52N;025-57E;;;24;24; 15;494;----;Bechet;;Romania;6;43-46N;023-57E;;;40;; 15;499;----;Mangalia;;Romania;6;43-49N;028-35E;;;6;9; 15;501;----;Novo Selo;;Bulgaria;6;44-10N;022-48E;;;36;38;P 15;502;----;Vidin;;Bulgaria;6;43-49N;022-53E;;;31;33; 15;505;----;Vratza;;Bulgaria;6;43-12N;023-32E;;;308;310; 15;507;----;Montana;;Bulgaria;6;43-25N;023-13E;;;202;204; 15;511;----;Lom;;Bulgaria;6;43-49N;023-15E;;;32;33;P 15;514;----;Oryahovo;;Bulgaria;6;43-41N;023-58E;;;29;31;P 15;525;----;Lovetch;;Bulgaria;6;43-08N;024-43E;;;220;221; 15;526;----;Pleven;;Bulgaria;6;43-25N;024-36E;;;71;; 15;530;----;Veliko Tarnovo;;Bulgaria;6;43-05N;025-39E;;;217;218; 15;533;----;Svichtov;;Bulgaria;6;43-37N;025-21E;;;24;26; 15;535;LBRS;Rousse;;Bulgaria;6;43-51N;025-57E;;;37;45;P 15;549;----;Razgrad;;Bulgaria;6;43-31N;026-32E;;;345;347; 15;550;----;Silistra;;Bulgaria;6;44-07N;027-51E;;;16;16;P 15;552;LBWN;Varna;;Bulgaria;6;43-12N;027-55E;;;41;43;P 15;561;----;Shabla;;Bulgaria;6;43-32N;028-32E;;;27;28; 15;562;----;Kaliakpa;;Bulgaria;6;43-22N;028-28E;;;63;64; 15;600;----;Mourgash;;Bulgaria;6;42-50N;023-40E;;;1687;1692; 15;601;----;Kustendil;;Bulgaria;6;42-16N;022-46E;;;522;527;P 15;605;----;Dragoman;;Bulgaria;6;42-56N;022-56E;;;714;716; 15;613;----;Cherni Vrah Top / Sommet ;;Bulgaria;6;42-35N;023-16E;;;2286;2292;P 15;614;LBSF;Sofia Observ. ;;Bulgaria;6;42-39N;023-23E;42-39N;023-23E;586;595;P 15;615;----;Mussala Top / Sommet ;;Bulgaria;6;42-11N;023-35E;;;2925;2927;P 15;625;LBPD;Plovdiv;;Bulgaria;6;42-08N;024-45E;;;179;185;P 15;627;----;Botev Vrah Top / Sommet ;;Bulgaria;6;42-40N;024-50E;;;2384;2389;P 15;628;----;Ivailo;;Bulgaria;6;42-13N;024-20E;;;213;214; 15;635;----;Chirpan;;Bulgaria;6;42-12N;025-20E;;;173;178; 15;640;----;Sliven;;Bulgaria;6;42-40N;026-19E;;;257;; 15;642;----;Elhovo;;Bulgaria;6;42-51N;026-34E;;;138;139; 15;655;LBBG;Burgas;;Bulgaria;6;42-29N;027-29E;;;16;28;P 15;661;----;Achtopol;;Bulgaria;6;42-06N;027-51E;;;18;19; 15;712;----;Sandanski;;Bulgaria;6;41-31N;023-16E;;;206;207;P 15;725;----;Snejanka Top / Sommet ;;Bulgaria;6;41-40N;024-41E;;;1923;1930; 15;730;----;Kurdjali;;Bulgaria;6;41-39N;025-22E;41-39N;025-24E;330;331;P 15;741;----;Svilengrad;;Bulgaria;6;41-46N;026-12E;;;54;55; 16;008;----;S. Valentino Alla Muta;;Italy;6;46-45N;010-32E;;;1459;1461;P 16;020;LIPB;Bolzano;;Italy;6;46-28N;011-20E;;;1459;1461;P 16;021;LIVR;Passo Rolle;;Italy;6;46-18N;011-47E;;;2004;2006; 16;022;LIVP;Paganella;;Italy;6;46-09N;011-02E;;;2125;2129; 16;033;LIVD;Dobbiaco;;Italy;6;46-44N;012-13E;;;1222;1226; 16;036;LIPA;Aviano;;Italy;6;46-02N;012-36E;;;128;128; 16;037;LIYW;Aviano Usaf ;;Italy;6;46-02N;012-37E;;;126;; 16;040;LIVO;Tarvisio;;Italy;6;46-30N;013-35E;;;777;778;P 16;044;LIPD;Udine / Campoformido;;Italy;6;46-02N;013-11E;46-02N;013-11E;93;94;P 16;045;LIPI;Udine / Rivolto;;Italy;6;45-59N;013-02E;;;51;53;P 16;052;LIMH;Pian Rosa;;Italy;6;45-56N;007-42E;;;3480;3488;P 16;054;----;Aosta;;Italy;6;45-44N;007-21E;;;547;547; 16;059;LIMF;Torino / Caselle;;Italy;6;45-13N;007-39E;45-13N;007-39E;301;287;P 16;061;LIMK;Torino / Bric Della Croce;;Italy;6;45-02N;007-44E;;;709;710; 16;064;LIMN;Novara / Cameri;;Italy;6;45-31N;008-40E;;;178;169; 16;066;LIMC;Milano / Malpensa;;Italy;6;45-37N;008-44E;;;234;211;P 16;072;LIMO;Monte Bisbino;;Italy;6;45-52N;009-04E;;;1319;1322; 16;076;LIME;Bergamo / Orio Al Serio;;Italy;6;45-40N;009-42E;;;238;237; 16;080;LIML;Milano / Linate;;Italy;6;45-26N;009-17E;45-26N;009-17E;107;103;P 16;084;LIMS;Piacenza;;Italy;6;44-55N;009-44E;;;134;138;P 16;088;LIPL;Brescia / Ghedi;;Italy;6;45-25N;010-17E;;;102;97; 16;090;LIPX;Verona / Villafranca;;Italy;6;45-23N;010-52E;;;67;68;P 16;094;LIPT;Vicenza;;Italy;6;45-34N;011-31E;;;39;53; 16;095;----;Padova;;Italy;6;45-24N;011-51E;;;13;14; 16;098;LIPS;Treviso / Istrana;;Italy;6;45-41N;012-06E;;;45;46; 16;099;LIPH;Treviso / S. Angelo;;Italy;6;45-39N;012-11E;;;18;23; 16;101;----;Trieste;;Italy;6;45-39N;013-45E;;;8;; 16;105;LIPZ;Venezia / Tessera;;Italy;6;45-30N;012-20E;45-30N;012-20E;2;6;P 16;108;LIPQ;Ronchi Dei Legionari;;Italy;6;45-49N;013-29E;;;12;12; 16;110;LIVT;Trieste;;Italy;6;45-39N;013-45E;;;8;20;P 16;114;----;Mondovi;;Italy;6;44-23N;007-49E;;;559;560; 16;115;LIMY;Monte Malanotte;;Italy;6;44-15N;007-48E;;;1741;1742; 16;116;----;Govone;;Italy;6;44-48N;008-06E;;;300;315; 16;118;----;Novi Ligure;;Italy;6;44-46N;008-47E;;;189;187; 16;119;LIMV;Passo Dei Giovi;;Italy;6;44-38N;008-56E;;;468;475; 16;120;LIMJ;Genova / Sestri;;Italy;6;44-25N;008-51E;;;2;3;P 16;122;LIMG;Albenga;;Italy;6;44-03N;008-07E;;;45;49; 16;124;LIMT;Passo Della Cisa;;Italy;6;44-26N;009-56E;;;1039;1040; 16;125;LIQW;Sarzana / Luni;;Italy;6;44-05N;009-59E;;;9;10; 16;129;LIQP;Isola Di Palmaria;;Italy;6;44-02N;009-50E;;;192;191; 16;134;LIVC;Monte Cimone;;Italy;6;44-12N;010-42E;;;2165;2173;P 16;136;----;Passo Porretta;;Italy;6;44-01N;011-00E;;;1313;1314; 16;138;LIPF;Ferrara;;Italy;6;44-50N;011-37E;;;10;10; 16;140;LIPE;Bologna / Borgo Panigale;;Italy;6;44-32N;011-18E;44-32N;011-18E;36;49; 16;142;----;Rifredo Mugello;;Italy;6;44-03N;011-23E;;;882;887; 16;144;----;S. Pietro Capofiume Molinella Bologna ;;Italy;6;44-39N;011-37E;44-39N;011-37E;10;11; 16;146;LIVM;Punta Marina;;Italy;6;44-27N;012-18E;;;2;6; 16;147;LIPK;Forli;;Italy;6;44-12N;012-04E;;;27;32; 16;148;LIPC;Cervia;;Italy;6;44-13N;012-18E;;;6;10; 16;149;LIPR;Rimini;;Italy;6;44-02N;012-37E;;;12;13;P 16;153;LIMU;Capo Mele;;Italy;6;43-57N;008-10E;43-57N;008-10E;220;221;P 16;154;----;Imperia;;Italy;6;43-53N;008-02E;;;;54; 16;158;LIRP;Pisa / S. Giusto;;Italy;6;43-41N;010-23E;43-40N;010-23E;2;6;P 16;164;LIQV;Volterra;;Italy;6;43-24N;010-52E;;;555;575; 16;168;LIQO;Monte Argentario;;Italy;6;42-23N;011-10E;;;630;631; 16;170;LIRQ;Firenze / Peretola;;Italy;6;43-48N;011-12E;;;40;38;P 16;172;LIQB;Arezzo;;Italy;6;43-28N;011-51E;;;248;249; 16;179;LIVF;Frontone;;Italy;6;43-31N;012-44E;;;570;574; 16;181;LIRZ;Perugia;;Italy;6;43-05N;012-30E;43-05N;012-30E;208;205;P 16;191;LIPY;Falconara;;Italy;6;43-37N;013-22E;;;12;10;P 16;197;LIRJ;M. Calamita;;Italy;6;42-44N;010-24E;;;396;397; 16;204;LIQR;Radicofani;;Italy;6;42-54N;011-46E;;;816;828; 16;206;LIRS;Grosseto;;Italy;6;42-45N;011-04E;;;5;7;P 16;214;LIQJ;Civitavecchia;;Italy;6;42-02N;011-50E;;;3;4; 16;216;LIRV;Viterbo;;Italy;6;42-26N;012-03E;;;300;308; 16;219;LIRK;Monte Terminillo;;Italy;6;42-28N;012-59E;;;1874;1875;P 16;221;LIQN;Rieti;;Italy;6;42-25N;012-51E;;;389;; 16;224;LIRB;Vigna Di Valle;;Italy;6;42-05N;012-13E;;;262;266; 16;227;----;Fucino;;Italy;6;41-53N;013-35E;;;655;655; 16;228;----;Preturo;;Italy;6;42-22N;013-18E;;;665;667; 16;230;LIBP;Pescara;;Italy;6;42-26N;014-12E;42-26N;014-12E;10;11;P 16;232;LIBT;Termoli;;Italy;6;42-00N;015-00E;;;16;44; 16;234;LIRG;Guidonia;;Italy;6;42-00N;012-44E;;;88;89; 16;235;LIRU;Roma / Urbe;;Italy;6;41-57N;012-30E;;;18;24; 16;239;LIRA;Roma / Ciampino;;Italy;6;41-47N;012-35E;;;129;105; 16;240;----;Rome;;Italy;6;41-54N;012-29E;;;95;; 16;242;LIRF;Roma Fiumicino;;Italy;6;41-48N;012-14E;41-48N;012-14E;2;3; 16;243;LIRL;Latina;;Italy;6;41-33N;012-54E;;;25;26; 16;244;LIRH;Frosinone;;Italy;6;41-38N;013-18E;;;180;185; 16;245;LIRE;Pratica Di Mare;;Italy;6;41-39N;012-27E;41-39N;012-26E;6;21; 16;252;LIBS;Campobasso;;Italy;6;41-34N;014-39E;;;793;807;P 16;253;LIRM;Grazzanise;;Italy;6;41-03N;014-04E;;;9;10; 16;258;LIBE;Monte S. Angelo;;Italy;6;41-42N;015-57E;;;838;844; 16;261;LIBA;Amendola;;Italy;6;41-32N;015-43E;;;57;60;P 16;263;LIRT;Trevico;;Italy;6;41-03N;015-14E;;;1085;1093; 16;270;LIBD;Bari / Palese Macchie;;Italy;6;41-08N;016-47E;;;34;49;P 16;280;LIQZ;Ponza;;Italy;6;40-55N;012-57E;;;184;185;P 16;289;LIRN;Napoli / Capodichino;;Italy;6;40-51N;014-18E;40-53N;014-18E;88;72;P 16;294;LIQC;Capri;;Italy;6;40-33N;014-12E;;;160;161; 16;300;LIBZ;Potenza;;Italy;6;40-38N;015-48E;40-38N;015-48E;823;843;P 16;310;LIQK;Capo Palinuro;;Italy;6;40-01N;015-17E;;;184;185;P 16;312;LIBV;Gioia Del Colle;;Italy;6;40-46N;016-56E;;;345;350; 16;316;LIBU;Latronico;;Italy;6;40-05N;016-01E;;;888;896; 16;320;LIBR;Brindisi;;Italy;6;40-39N;017-57E;40-39N;017-57E;15;10;P 16;324;LIBG;Grottaglie;;Italy;6;40-31N;017-24E;;;64;69; 16;325;LIBH;Marina Di Ginosa;;Italy;6;40-26N;016-53E;;;2;12;P 16;332;LIBN;Lecce;;Italy;6;40-14N;018-09E;;;48;61; 16;337;LIBW;Bonifati;;Italy;6;39-35N;015-53E;39-35N;015-53E;484;485; 16;344;LIBQ;Monte Scuro;;Italy;6;39-20N;016-24E;;;1710;1720; 16;350;LIBC;Crotone;;Italy;6;39-00N;017-04E;;;155;161;P 16;360;LIBY;S. Maria Di Leuca;;Italy;6;39-49N;018-21E;;;104;112;P 16;362;LICA;Lamezia Terme;;Italy;6;38-54N;016-15E;;;15;;P 16;400;LICU;Ustica;;Italy;6;38-42N;013-11E;38-42N;013-11E;250;251;P 16;405;LICJ;Palermo / Punta Raisi;;Italy;6;38-11N;013-06E;38-11N;013-06E;21;21;P 16;410;LICP;Palermo Boccadifalco;;Italy;6;38-06N;013-18E;;;107;117; 16;415;----;Isola Di Salina;;Italy;6;38-35N;014-52E;;;46;46; 16;420;LICF;Messina;;Italy;6;38-12N;015-33E;38-12N;015-33E;59;51;P 16;422;LICR;Reggio Calabria;;Italy;6;38-04N;015-39E;;;11;21; 16;429;LICT;Trapani / Birgi;;Italy;6;37-55N;012-30E;37-55N;012-30E;7;14;P 16;434;----;Prizzi;;Italy;6;37-43N;013-26E;;;1034;1035; 16;450;LICE;Enna;;Italy;6;37-34N;014-17E;;;940;965; 16;453;LICL;Gela;;Italy;6;37-05N;014-13E;;;11;33;P 16;459;LICZ;Catania / Sigonella;;Italy;6;37-24N;014-55E;;;22;22; 16;460;LICC;Catania / Fontanarossa;;Italy;6;37-28N;015-03E;37-28N;015-03E;11;17;P 16;470;LICG;Pantelleria;;Italy;6;36-49N;011-58E;36-49N;011-58E;191;170;P 16;480;LICO;Cozzo Spadaro;;Italy;6;36-41N;015-08E;;;46;51;P 16;490;LICD;Lampedusa;;Italy;6;35-30N;012-36E;;;16;20;P 16;506;LIEG;Guardiavecchia;;Italy;6;41-13N;009-24E;;;158;159;P 16;520;LIEA;Alghero;;Italy;6;40-38N;008-17E;40-38N;008-17E;23;40;P 16;522;LIEH;Capo Caccia;;Italy;6;40-34N;008-10E;40-34N;008-10E;200;204; 16;531;LIEO;Olbia / Costa Smeralda;;Italy;6;40-54N;009-31E;;;11;13; 16;538;LIEN;Fonni;;Italy;6;40-07N;009-15E;;;1022;1029; 16;539;LIEF;Capo Frasca;;Italy;6;39-45N;008-28E;;;89;95;P 16;541;LIEP;Perdasdefogu;;Italy;6;39-40N;009-26E;;;608;606; 16;542;LIEL;Capo S. Lorenzo;;Italy;6;39-30N;009-38E;;;4;5; 16;546;LIED;Decimomannu;;Italy;6;39-21N;008-58E;;;29;28; 16;548;----;Carloforte;;Italy;6;39-08N;008-19E;;;14;15; 16;549;----;Isola Di Carloforte;;Italy;6;39-08N;008-19E;;;12;12; 16;550;LIEB;Capo Bellavista;;Italy;6;39-56N;009-43E;;;138;150;P 16;560;LIEE;Cagliari / Elmas;;Italy;6;39-15N;009-04E;39-15N;009-03E;4;5;P 16;564;LIEC;Capo Carbonara;;Italy;6;39-06N;009-31E;;;116;118; 16;597;LMML;Luqa;;Malta;6;35-51N;014-29E;35-51N;014-29E;91;91;P 16;606;----;Serrai;;Greece;6;41-04N;023-34E;;;33;35; 16;613;----;Florina;;Greece;6;40-47N;021-24E;;;650;662; 16;614;LGKA;Kastoria Airport ;;Greece;6;40-27N;021-17E;;;604;;P 16;622;LGTS;Thessaloniki Airport ;;Greece;6;40-31N;022-58E;40-31N;022-58E;8;4;P 16;624;LGKV;Chrysoupoli Airport ;;Greece;6;40-59N;024-36E;;;5;5;P 16;627;LGAL;Alexandroupoli Airport ;;Greece;6;40-51N;025-55E;;;7;3;P 16;632;LGKZ;Kozani Airport ;;Greece;6;40-18N;021-47E;;;634;627; 16;641;LGKR;Kerkyra Airport ;;Greece;6;39-37N;019-55E;;;2;4;P 16;642;----;Ioannina Airport ;;Greece;6;39-42N;020-49E;;;480;483; 16;643;LGPZ;Aktion Airport ;;Greece;6;38-37N;020-46E;;;4;4;P 16;645;----;Trikala;;Greece;6;39-33N;021-46E;;;112;116; 16;648;LGLR;Larissa Airport ;;Greece;6;39-38N;022-25E;;;73;74; 16;650;LGLM;Limnos Airport ;;Greece;6;39-55N;025-14E;;;5;4;P 16;654;----;Arta Halkiades ;;Greece;6;39-10N;021-00E;;;10;11; 16;665;LGBL;Anchialos Airport ;;Greece;6;39-13N;022-48E;;;25;15; 16;667;LGMT;Mytilini Airport ;;Greece;6;39-04N;026-36E;;;3;5;P 16;672;----;Agrinion Airport ;;Greece;6;38-36N;021-21E;;;24;24; 16;674;----;Aliartos;;Greece;6;38-23N;023-06E;;;110;; 16;675;----;Lamia;;Greece;6;38-54N;022-24E;;;144;144;P 16;682;LGAD;Andravida Airport ;;Greece;6;37-55N;021-17E;;;10;14;P 16;684;----;Skyros Airport ;;Greece;6;38-58N;024-29E;;;27;28;P 16;685;LGKF;Kefalhnia Airport ;;Greece;6;38-07N;020-30E;;;19;22; 16;687;LGRX;Araxos Airport ;;Greece;6;38-09N;021-25E;38-10N;021-25E;11;12; 16;689;----;Patrai;;Greece;6;38-15N;021-44E;;;1;3; 16;699;LGTG;Tanagra Airport ;;Greece;6;38-19N;023-32E;;;148;140; 16;701;----;Athinai Filadelfia ;;Greece;6;38-03N;023-40E;;;136;138; 16;706;LGHI;Chios Airport ;;Greece;6;38-20N;026-08E;;;5;4;P 16;710;LGTP;Tripolis Airport;;Greece;6;37-32N;022-24E;;;644;652; 16;715;LGTT;Tatoi;;Greece;6;38-06N;023-47E;;;239;235; 16;716;LGAT;Athinai Airport ;;Greece;6;37-54N;023-44E;37-54N;023-44E;28;15;P 16;717;----;Piraeus;;Greece;6;37-59N;023-34E;;;2;2; 16;718;LGEL;Elefsis Airport ;;Greece;6;38-04N;023-33E;;;44;31; 16;723;LGSM;Samos Airport ;;Greece;6;37-42N;026-55E;;;2;7; 16;726;LGKL;Kalamata Airport ;;Greece;6;37-04N;022-01E;;;6;8; 16;732;----;Naxos;;Greece;6;37-06N;025-23E;;;9;9;P 16;734;----;Methoni;;Greece;6;36-50N;021-42E;36-50N;021-42E;33;34;P 16;738;----;Milos;;Greece;6;36-43N;024-27E;;;182;183;P 16;742;LGKO;Kos Airport ;;Greece;6;36-47N;027-04E;;;129;;P 16;743;----;Kythira;;Greece;6;36-17N;023-01E;;;167;167;P 16;744;----;Thira Airport ;;Greece;6;36-25N;025-26E;;;40;36; 16;746;LGSA;Souda Airport ;;Greece;6;35-29N;024-07E;;;146;151;P 16;749;LGRP;Rhodes Airport ;;Greece;6;36-24N;028-05E;36-23N;028-07E;4;11;P 16;754;LGIR;Heraklion Airport ;;Greece;6;35-20N;025-11E;35-20N;025-11E;37;39;P 16;756;----;Ierapetra;;Greece;6;35-00N;025-44E;;;13;; 16;757;----;Sitia;;Greece;6;35-12N;026-06E;;;25;28; 16;758;----;Rethymnon;;Greece;6;35-21N;024-31E;;;7;7; 16;759;----;Tymbakion Airport ;;Greece;6;35-00N;024-45E;;;7;7; 16;760;----;Kasteli Airport ;;Greece;6;35-11N;025-19E;35-11N;025-19E;360;336; 16;765;LGKP;Karpathos Airport;;Greece;6;35-24-51N;027-08-54E;;;6;; 17;022;LTAS;Zonguldak;;Turkey;6;41-27N;031-48E;41-27N;031-48E;136;136;P 17;024;----;Inebolu;;Turkey;6;41-59N;033-47E;;;64;64;P 17;026;----;Sinop;;Turkey;6;42-02N;035-10E;;;32;32;P 17;029;LTAQ;Samsun;;Turkey;6;41-16N;036-18E;;;162;168; 17;030;----;Samsun;;Turkey;6;41-17N;036-20E;41-17N;036-20E;4;4;P 17;034;----;Giresun;;Turkey;6;40-55N;038-24E;;;38;38;P 17;038;LTCG;Trabzon;;Turkey;6;41-00N;039-43E;;;35;30;P 17;042;----;Hopa;;Turkey;6;41-23N;041-25E;;;33;33;P 17;045;----;Artvin;;Turkey;6;41-10N;041-49E;;;30;30; 17;050;----;Edirne;;Turkey;6;41-40N;026-34E;41-40N;026-34E;48;48;P 17;052;----;Kirklareli;;Turkey;6;41-44N;027-13E;;;232;232; 17;056;----;Tekirdag;;Turkey;6;40-59N;027-29E;;;4;4;P 17;059;----;Kumkoy;;Turkey;6;41-18N;029-00E;;;30;30;P 17;060;LTBA;Istanbul / Ataturk;;Turkey;6;40-58N;028-49E;;;48;37;P 17;062;----;Istanbul / Goztepe;;Turkey;6;40-58N;029-05E;40-58N;029-05E;33;33; 17;067;----;Golcuk / Dumlupinar;;Turkey;6;40-43N;029-49E;;;18;18;P 17;068;----;Cengiztopel;;Turkey;6;40-44N;030-05E;;;70;70; 17;069;----;Adapazari;;Turkey;6;40-47N;030-25E;;;30;30; 17;070;----;Bolu;;Turkey;6;40-44N;031-36E;;;742;742;P 17;074;----;Kastamonu;;Turkey;6;41-22N;033-46E;;;799;799;P 17;082;LTAP;Merzifon;;Turkey;6;40-51N;035-35E;40-50N;035-31E;545;535;P 17;084;----;Corum;;Turkey;6;40-33N;034-58E;;;776;776;P 17;085;----;Amasya;;Turkey;6;40-39N;035-51E;;;412;412; 17;086;LTAW;Tokat;;Turkey;6;40-18N;036-34E;;;608;608; 17;088;----;Gumushane;;Turkey;6;40-27N;039-27E;;;1219;1219;P 17;090;LTAR;Sivas;;Turkey;6;39-45N;037-01E;;;1285;1285;P 17;092;LTCD;Erzincan;;Turkey;6;39-44N;039-30E;;;1156;1215;P 17;096;LTCE;Erzurum;;Turkey;6;39-55N;041-16E;;;1756;1758;P 17;098;LTCF;Kars;;Turkey;6;40-36N;043-05E;;;1775;1775;P 17;099;----;Agri;;Turkey;6;39-43N;043-03E;;;1632;1632; 17;100;----;Igdir;;Turkey;6;39-56N;044-02E;;;858;858;P 17;110;----;Gokceada;;Turkey;6;40-11N;025-54E;;;72;72;P 17;112;LTBH;Canakkale;;Turkey;6;40-08N;026-24E;;;3;3;P 17;115;LTBG;Bandirma;;Turkey;6;40-19N;027-58E;40-19N;027-58E;51;49;P 17;116;LTBE;Bursa;;Turkey;6;40-11N;029-04E;;;101;100;P 17;120;LTAE;Murted Tur-Afb ;;Turkey;6;40-05N;032-34E;;;843;; 17;124;LTBI;Eskisehir;;Turkey;6;39-47N;030-34E;39-47N;030-34E;785;785;P 17;128;LTAC;Ankara / Esenboga;;Turkey;6;40-07N;032-59E;;;953;949;P 17;129;LTAD;Ankara / Etimesgut;;Turkey;6;39-57N;032-41E;;;799;806;P 17;130;----;Ankara / Central;;Turkey;6;39-57N;032-53E;39-57N;032-53E;891;891; 17;140;----;Yozgat;;Turkey;6;39-50N;034-49E;;;1298;1298; 17;150;LTBF;Balikesir;;Turkey;6;39-37N;027-55E;;;101;102;P 17;160;----;Kirsehir;;Turkey;6;39-08N;034-10E;39-08N;034-10E;995;1007;P 17;162;----;Gemerek;;Turkey;6;39-11N;036-03E;;;1171;1171;P 17;170;LTCI;Van;;Turkey;6;38-27N;043-19E;;;1667;1661;P 17;180;----;Dikili;;Turkey;6;39-03N;026-52E;;;3;3;P 17;184;LTBT;Akhisar;;Turkey;6;38-55N;027-51E;;;93;93;P 17;186;----;Manisa;;Turkey;6;38-37N;027-26E;;;71;71;P 17;188;LTBO;Usak;;Turkey;6;38-40N;029-25E;;;919;919;P 17;190;LTAH;Afyon;;Turkey;6;38-45N;030-32E;;;1034;1034;P 17;193;----;Nevsehir;;Turkey;6;38-37N;034-43E;;;1260;1260; 17;195;LTAU;Kayseri / Erkilet;;Turkey;6;38-47N;035-29E;38-47N;035-29E;1053;1054;P 17;200;LTAT;Malatya / Erhac;;Turkey;6;38-26N;038-05E;38-26N;038-05E;862;849;P 17;202;LTCA;Elazig;;Turkey;6;38-36N;039-17E;;;902;882;P 17;203;----;Bingol;;Turkey;6;38-52N;040-30E;;;1177;1177; 17;204;----;Mus;;Turkey;6;38-44N;041-31E;;;1320;1320; 17;205;----;Tatvan;;Turkey;6;38-31N;042-16E;;;1664;1664;P 17;210;----;Siirt;;Turkey;6;37-56N;042-00E;;;895;895;P 17;218;LTBL;Izmir / Cigli;;Turkey;6;38-30N;027-01E;;;5;5;P 17;219;LTBJ;Izmir / Adnan Menderes;;Turkey;6;38-16N;027-09E;;;125;120; 17;220;----;Izmir;;Turkey;6;38-26N;027-10E;38-26N;027-10E;25;25; 17;234;LTBD;Aydin;;Turkey;6;37-51N;027-51E;;;57;57;P 17;237;----;Denizli;;Turkey;6;37-46N;029-05E;;;428;428;P 17;240;LTBM;Isparta;;Turkey;6;37-45N;030-33E;37-45N;030-33E;997;997;P 17;244;LTAN;Konya;;Turkey;6;37-58N;032-33E;37-58N;032-33E;1032;1022;P 17;248;----;Konya / Eregli;;Turkey;6;37-30N;034-04E;;;1044;1044;P 17;250;----;Nigde;;Turkey;6;37-58N;034-41E;;;1208;1208; 17;255;----;Kahramanmaras;;Turkey;6;37-36N;036-56E;;;549;549; 17;260;LTAJ;Gaziantep;;Turkey;6;37-05N;037-22E;;;701;701;P 17;270;LTCH;Urfa;;Turkey;6;37-08N;038-46E;;;547;547;P 17;275;----;Mardin;;Turkey;6;37-18N;040-44E;;;1050;1050; 17;280;LTCC;Diyarbakir;;Turkey;6;37-53N;040-11E;37-53N;040-11E;686;677;P 17;282;LTCJ;Batman;;Turkey;6;37-52N;041-10E;;;540;540; 17;285;----;Hakkari;;Turkey;6;37-34N;043-46E;;;;1720;P 17;290;LTBV;Bodrum;;Turkey;6;37-02N;027-25E;;;27;27;P 17;292;----;Mugla;;Turkey;6;37-12N;028-21E;;;646;646;P 17;295;LTBS;Dalaman;;Turkey;6;36-42N;028-47E;;;7;2; 17;298;----;Marmaris;;Turkey;6;36-50N;028-16E;;;3;3; 17;300;LTAI;Antalya;;Turkey;6;36-42N;030-44E;36-54N;030-47E;50;57;P 17;320;----;Anamur;;Turkey;6;36-06N;032-50E;;;3;4;P 17;330;----;Silifke;;Turkey;6;36-22N;033-56E;;;15;15;P 17;340;----;Mersin;;Turkey;6;36-49N;034-36E;;;3;3; 17;350;LTAG;Adana / Incirlik;;Turkey;6;37-00N;035-25E;37-00N;035-25E;73;66;P 17;351;----;Adana;;Turkey;6;37-03N;035-21E;37-03N;035-21E;28;28; 17;352;LTAF;Adana / Sakirpasa;;Turkey;6;36-59N;035-18E;36-59N;035-18E;20;20; 17;370;LTAK;Iskenderun;;Turkey;6;36-35N;036-10E;;;3;3;P 17;375;----;Finike;;Turkey;6;36-18N;030-09E;;;3;3;P 17;600;LCPH;Paphos Airport;;Cyprus;6;34-43N;032-29E;34-43N;032-29E;11;8;P 17;601;LCRA;Akrotiri;;Cyprus;6;34-35N;032-59E;34-35N;032-59E;23;0; 17;607;LCNC;Athalassa;;Cyprus;6;35-09N;033-24E;35-09N;033-24E;162;161; 17;609;LCLK;Larnaca Airport;;Cyprus;6;34-53N;033-38E;34-53N;033-38E;2;2;P 20;026;----;Viktoriya Island;;Russia;6;80-10N;036-45E;;;9;; 20;046;----;Polargmo Im. E. T. Krenkelja;;Russia;2;80-37N;058-03E;80-37N;058-03E;20;22;P 20;049;----;Tikhaya Bay;;Russia;2;80-22N;052-55E;;;46;; 20;066;----;Ushakova Island;;Russia;2;80-50N;079-42E;;;47;; 20;069;----;Ostrov Vize;;Russia;2;79-30N;076-59E;79-30N;076-59E;10;10;P 20;087;----;Ostrov Golomjannyj;;Russia;2;79-33N;090-37E;;;8;8;P 20;097;----;Cape Peschaniy;;Russia;2;79-23N;102-25E;;;6;; 20;107;----;Barencburg;;Russia;6;78-04N;014-15E;78-04N;014-13E;49;75;P 20;199;----;Malyy Taymir Island;;Russia;2;78-08N;107-12E;;;12;; 20;274;----;Ostrov Uedinenija;;Russia;2;77-30N;082-12E;77-30N;082-14E;23;23;P 20;277;----;Isachenko Island;;Russia;2;77-17N;089-40E;;;5;; 20;289;----;Russkiy Island;;Russia;2;77-11N;096-35E;;;9;; 20;291;----;Solnechnaya Bay;;Russia;2;78-14N;103-07E;;;30;; 20;292;----;Gmo Im. E. K. Fedorova;;Russia;2;77-43N;104-18E;77-43N;104-17E;13;15;P 20;353;----;Mys Zelanija;;Russia;2;76-57N;068-33E;76-57N;068-35E;8;9;P 20;357;----;Russkaya Gavan;;Russia;2;76-11N;063-34E;;;9;; 20;388;----;Pravdy Island;;Russia;2;76-17N;094-44E;;;10;; 20;471;----;Troynoy Island;;Russia;2;75-55N;083-15E;;;12;; 20;476;----;Cape Sterlegova;;Russia;2;75-24N;088-47E;;;10;; 20;665;----;Vilkickogo Island;;Russia;2;73-30N;076-00E;;;4;; 20;667;----;Im. M. V. Popova;;Russia;2;73-20N;070-03E;73-20N;070-02E;6;7;P 20;674;----;Ostrov Dikson;;Russia;2;73-30N;080-24E;73-30N;080-14E;47;47;P 20;675;----;Makarova;;Russia;2;73-41N;085-15E;;;15;; 20;679;----;Tareya Stream ;;Russia;2;73-15N;090-55E;;;21;; 20;744;----;Malye Karmakuly;;Russia;2;72-22N;052-42E;72-23N;052-44E;16;15;P 20;766;----;Leskino;;Russia;2;72-20N;079-30E;;;10;; 20;856;----;Cape Kharasovoy;;Russia;2;71-24N;067-38E;;;18;; 20;862;----;Mongatalyang;;Russia;2;71-59N;075-24E;;;21;; 20;864;----;Tambey;;Russia;2;71-29N;071-49E;;;8;; 20;871;----;Sopochnaya Karga;;Russia;2;71-54N;082-43E;;;2;; 20;891;----;Hatanga;;Russia;2;71-59N;102-28E;71-59N;102-28E;33;33;P 20;946;----;Cape Bolvanskij;;Russia;2;70-27N;059-04E;;;13;; 20;963;----;Gyda;;Russia;2;70-53N;078-30E;;;8;; 20;967;----;Sejaha;;Russia;2;70-10N;072-31E;;;16;; 20;973;----;Kresti;;Russia;2;70-51N;089-53E;;;29;; 20;978;----;Karaul;;Russia;2;70-10N;083-08E;;;29;; 20;982;----;Volochanka;;Russia;2;70-59N;094-33E;;;37;; 21;301;----;Andreya Island;;Russia;2;76-48N;110-50E;;;6;; 21;432;----;Ostrov Kotel'Nyj;;Russia;2;76-00N;137-52E;76-00N;137-54E;10;8;P 21;504;----;Ostrov Preobrazenija;;Russia;2;74-40N;112-56E;74-40N;112-56E;57;57;P 21;647;----;Mys Shalaurova;;Russia;2;73-11N;143-14E;73-12N;143-32E;22;22;P 21;701;----;Uryung-Khaya;;Russia;2;72-49N;113-16E;;;25;; 21;711;----;Ust-Olenek;;Russia;2;72-58N;119-42E;;;21;; 21;721;----;Stolb Island;;Russia;2;72-25N;126-30E;;;26;; 21;802;----;Saskylah;;Russia;2;71-58N;114-05E;;;24;18;P 21;824;----;Tiksi;;Russia;2;71-35N;128-55E;71-38N;128-51E;8;7;P 21;825;----;Mostakh Island;;Russia;2;71-32N;129-55E;71-32N;129-55E;3;3; 21;826;----;Ozero Khargy Lake ;;Russia;2;71-30N;132-40E;;;18;; 21;908;----;Dzalinda;;Russia;2;70-08N;113-58E;70-08N;113-58E;62;62; 21;921;----;Kjusjur;;Russia;2;70-41N;127-24E;;;39;33;P 21;931;----;Jubilejnaja;;Russia;2;70-46N;136-13E;70-45N;136-13E;22;24;P 21;946;----;Chokurdah;;Russia;2;70-37N;147-53E;70-37N;147-53E;61;61;P 21;965;----;Ostrov Chetyreh-Stolbovoy;;Russia;2;70-38N;162-29E;;;;41;P 21;982;----;Ostrov Vrangelja;;Russia;2;70-59N;178-29W;70-58N;178-32W;3;5;P 22;003;----;Vaida Guba Bay ;;Russia;6;69-57N;032-02E;;;8;; 22;004;----;Nikel;;Russia;6;69-24N;030-12E;;;126;; 22;009;----;Perevalyaur;;Russia;6;69-16N;031-46E;;;302;; 22;012;----;Tsip-Navolok Point ;;Russia;6;69-43N;033-08E;;;24;; 22;014;----;Bolshaya-Zapadnaya;;Russia;6;69-25N;032-10E;;;117;; 22;018;----;Ura-Guba Bay ;;Russia;6;69-17N;032-48E;;;27;; 22;019;----;Severomorsk;;Russia;6;69-05N;033-27E;;;20;; 22;028;----;Teriberka;;Russia;6;69-12N;035-07E;;;29;30;P 22;095;----;Kolguyev Island;;Russia;6;69-05N;049-15E;;;24;; 22;100;----;Verkhove Lotta;;Russia;6;68-27N;028-43E;;;120;; 22;101;----;Virtaniemi;;Russia;6;68-54N;028-27E;;;118;; 22;105;----;Nivankyul;;Russia;6;68-23N;030-45E;;;91;; 22;106;----;Padun;;Russia;6;68-36N;031-51E;;;63;63;P 22;113;ULMM;Murmansk;;Russia;6;68-58N;033-03E;68-58N;033-03E;51;51;P 22;114;----;Loparskaya;;Russia;6;68-38N;033-12E;;;112;; 22;119;----;Pulozero;;Russia;6;68-21N;033-18E;;;144;143; 22;123;----;Golitsino;;Russia;6;69-04N;035-44E;;;15;; 22;127;----;Lovozero;;Russia;6;68-00N;035-02E;;;161;162;P 22;133;----;Kharlovka;;Russia;6;68-47N;037-20E;;;64;; 22;140;----;Gremikha Bay ;;Russia;6;68-03N;039-30E;;;122;; 22;144;----;Chernyy Cape ;;Russia;6;68-24N;038-40E;;;10;; 22;165;----;Kanin Nos;;Russia;6;68-39N;043-18E;;;49;49;P 22;193;----;Bugrino;;Russia;6;68-48N;049-09E;;;11;; 22;204;----;Kovdor;;Russia;6;67-34N;030-24E;;;247;; 22;212;----;Moncegorsk;;Russia;6;67-58N;032-53E;67-55N;032-52E;132;132; 22;213;----;Apatitovaya;;Russia;6;67-50N;033-45E;;;135;; 22;214;----;Zasheyek;;Russia;6;67-25N;032-33E;;;151;; 22;216;----;Apatity;;Russia;6;67-34N;033-22E;;;136;; 22;217;----;Kandalaksa;;Russia;6;67-09N;032-21E;67-08N;032-26E;26;25;P 22;219;----;Kirovsk;;Russia;6;67-37N;033-40E;;;1093;; 22;232;----;Kolmyabr;;Russia;6;67-42N;037-07E;;;244;; 22;235;----;Krasnoscel'E;;Russia;6;67-21N;037-03E;67-22N;037-02E;155;156;P 22;249;----;Kanevka;;Russia;6;67-08N;039-40E;;;149;; 22;259;----;Tersko-Orlovskaja;;Russia;6;67-13N;041-20E;;;72;; 22;269;----;Mys Konusin;;Russia;6;67-09N;043-54E;;;14;13;P 22;271;----;Sojna;;Russia;6;67-53N;044-08E;67-52N;044-10E;16;8;P 22;282;----;Mys Mikulkin;;Russia;6;67-48N;046-40E;;;6;6;P 22;292;----;Indiga;;Russia;6;67-41N;048-41E;;;3;4;P 22;302;----;Nyam Lake ;;Russia;6;66-58N;031-28E;;;152;; 22;305;----;Olanga Stream ;;Russia;6;66-10N;030-41E;;;106;; 22;312;----;Kovda;;Russia;6;66-42N;032-53E;;;17;18; 22;318;----;Louhi;;Russia;6;66-04N;033-00E;;;;94; 22;324;----;Umba;;Russia;6;66-41N;034-21E;66-40N;034-20E;40;40;P 22;334;----;Varzuga;;Russia;6;66-24N;036-37E;;;6;; 22;339;----;Chavanga Stream ;;Russia;6;66-06N;037-49E;;;7;; 22;349;----;Pjalica;;Russia;6;66-11N;039-32E;66-12N;039-32E;8;9;P 22;355;----;Sosnovets Island;;Russia;6;66-29N;040-41E;;;16;; 22;361;----;Morzhovets Island;;Russia;6;66-45N;042-35E;;;15;; 22;365;----;Abramovskij Majak;;Russia;6;66-23N;043-15E;;;24;21;P 22;375;----;Nes;;Russia;6;66-39N;044-41E;;;14;; 22;383;----;Nizhnyaya Pesha;;Russia;6;66-46N;047-47E;;;9;; 22;408;----;Kalevala;;Russia;6;65-13N;031-10E;65-12N;031-10E;112;120;P 22;422;----;Gridino;;Russia;6;65-54N;034-46E;;;10;12;P 22;429;----;Kreml;;Russia;6;65-02N;035-43E;;;7;; 22;438;----;Zizgin;;Russia;6;65-12N;036-49E;;;18;17;P 22;446;----;Zimnegorskij Majak;;Russia;6;65-28N;039-44E;;;81;77;P 22;452;----;Incy;;Russia;6;65-58N;040-43E;;;;5; 22;456;----;Kepino;;Russia;6;65-23N;041-50E;;;74;; 22;471;----;Mezen;;Russia;6;65-52N;044-13E;65-52N;044-13E;14;19;P 22;481;----;Moseyevo;;Russia;6;65-47N;046-11E;;;39;; 22;499;----;Barkovskaja;;Russia;6;65-14N;049-35E;;;;155; 22;511;----;Juskozero;;Russia;6;64-45N;032-07E;;;;97;P 22;518;----;Rugozero;;Russia;6;64-05N;032-47E;;;159;159; 22;522;----;Kem'- Port;;Russia;6;64-59N;034-48E;64-59N;034-47E;10;8;P 22;525;----;Raznavolok;;Russia;6;64-34N;034-55E;;;9;9; 22;529;----;Kolezma;;Russia;6;64-14N;035-53E;;;6;3; 22;541;----;Unskij Majak;;Russia;6;64-50N;038-24E;;;5;5; 22;546;----;Severodvinsk;;Russia;6;64-34N;039-50E;;;1;; 22;550;ULAA;Arhangel'Sk;;Russia;6;64-30N;040-44E;64-35N;040-30E;13;8;P 22;551;----;Mud'Jug;;Russia;6;64-51N;040-17E;;;3;3; 22;559;----;Holmogory;;Russia;6;64-13N;041-40E;;;14;12; 22;563;----;Pinega;;Russia;6;64-42N;043-23E;;;31;31;P 22;573;----;Lesukonskoe;;Russia;6;64-54N;045-46E;64-54N;045-46E;66;71; 22;583;----;Kojnas;;Russia;6;64-45N;047-39E;;;62;64;P 22;602;----;Reboly;;Russia;6;63-50N;030-49E;63-49N;030-49E;181;182;P 22;619;----;Padany;;Russia;6;63-16N;033-25E;;;;128; 22;621;----;Segeza;;Russia;6;63-46N;034-17E;63-44N;034-18E;113;112;P 22;638;----;Kalgachikha;;Russia;6;63-20N;036-44E;;;181;; 22;641;----;Onega;;Russia;6;63-54N;038-07E;63-54N;038-07E;8;13;P 22;648;----;Turcasovo;;Russia;6;63-07N;039-14E;;;35;34; 22;656;----;Emeck;;Russia;6;63-29N;041-48E;;;28;18; 22;671;----;Karpogory;;Russia;6;63-59N;044-27E;;;60;; 22;676;----;Sura;;Russia;6;63-35N;045-38E;;;66;62;P 22;686;----;Vendinga;;Russia;6;63-27N;047-55E;63-27N;047-55E;81;80; 22;695;----;Koslan;;Russia;6;63-27N;048-54E;;;159;158;P 22;721;----;Medvezegorsk;;Russia;6;62-55N;034-26E;62-54N;034-24E;80;81;P 22;723;----;Danilovo;;Russia;6;62-58N;035-42E;;;139;139; 22;727;----;Kondopoga;;Russia;6;62-10N;034-18E;;;40;38; 22;738;----;Kugonavolok;;Russia;6;62-14N;036-53E;;;151;147; 22;749;----;Konevo;;Russia;6;62-08N;039-20E;;;100;; 22;762;----;Dvinskij Bereznik;;Russia;6;62-52N;042-43E;62-52N;042-43E;24;34; 22;768;----;Senkursk;;Russia;6;62-06N;042-54E;;;50;45;P 22;778;----;Verhnjaja Tojma;;Russia;6;62-14N;045-01E;;;53;58;P 22;781;----;Okulovskaya;;Russia;6;62-58N;046-35E;;;95;; 22;798;----;Jarensk;;Russia;6;62-10N;049-07E;;;92;92;P 22;802;----;Sortavala;;Russia;6;61-43N;030-43E;61-43N;030-43E;18;19;P 22;805;----;Valaam Island;;Russia;6;61-23N;030-57E;;;9;; 22;806;----;Mantsinsari Island;;Russia;6;61-20N;031-36E;;;24;; 22;816;----;Priaza;;Russia;6;61-41N;033-37E;;;;133; 22;820;----;Petrozavodsk;;Russia;6;61-49N;034-16E;61-49N;034-16E;112;110;P 22;823;----;Klimenitsy;;Russia;6;61-51N;035-12E;;;40;; 22;824;----;Ladva-Vetka;;Russia;6;61-21N;034-27E;;;57;; 22;831;----;Pudoz;;Russia;6;61-48N;036-31E;;;48;44;P 22;833;----;Kolodozero;;Russia;6;61-47N;037-45E;;;120;116; 22;835;----;Mironova;;Russia;6;61-27N;036-54E;;;152;; 22;837;----;Vytegra;;Russia;6;61-01N;036-27E;;;59;56;P 22;845;----;Kargopol;;Russia;6;61-30N;038-56E;61-30N;038-56E;121;126;P 22;854;----;Njandoma;;Russia;6;61-40N;040-11E;;;224;233;P 22;867;----;Vel'Sk;;Russia;6;61-05N;042-04E;;;89;91;P 22;869;----;Shangaly;;Russia;6;61-07N;043-24E;;;122;; 22;887;ULAK;Kotlas;;Russia;6;61-14N;046-43E;61-14N;046-38E;56;56;P 22;889;----;Shirokiy Priluk;;Russia;6;61-07N;048-50E;;;122;; 22;891;----;Lesogorskiy;;Russia;6;61-02N;028-56E;;;39;; 22;892;----;Vyborg;;Russia;6;60-43N;028-44E;;;15;13;P 22;896;----;Roscino;;Russia;6;60-13N;029-43E;;;96;; 22;897;----;Sursari / Gogland Island;;Russia;6;60-04N;027-00E;;;6;; 22;907;----;Toksovo;;Russia;6;60-09N;030-31E;;;115;; 22;912;----;Olonec;;Russia;6;60-59N;032-59E;;;11;12; 22;913;----;Lodejnoe Pole;;Russia;6;60-43N;033-33E;60-43N;033-33E;23;23; 22;915;----;Svirica;;Russia;6;60-28N;032-54E;;;8;8;P 22;917;----;Novaja Ladoga;;Russia;6;60-07N;032-19E;;;;9; 22;925;----;Vinnicy;;Russia;6;60-38N;034-47E;;;90;111; 22;939;----;Belozersk;;Russia;6;60-02N;037-47E;;;131;131;P 22;944;----;Charozero;;Russia;6;60-28N;038-39E;;;158;; 22;954;----;Vozega;;Russia;6;60-28N;040-12E;;;178;202;P 22;974;----;Nyuksenitsa;;Russia;6;60-25N;044-15E;;;137;; 22;981;----;Velikij Ustjug;;Russia;6;60-46N;046-18E;;;98;99; 22;996;----;Ob " Jacevo;;Russia;6;60-22N;049-39E;60-20N;049-39E;153;152;P 23;022;----;Amderma;;Russia;2;69-45N;061-42E;69-46N;061-41E;53;49;P 23;024;----;Cape Bely;;Russia;2;69-29N;060-20E;;;6;; 23;029;----;Ust-Kara;;Russia;2;69-15N;064-59E;;;4;; 23;032;----;Maresale;;Russia;2;69-43N;066-48E;;;25;25;P 23;058;----;Antipajeta;;Russia;2;69-09N;077-00E;;;4;; 23;074;----;Dudinka;;Russia;2;69-24N;086-10E;69-24N;086-10E;19;19;P 23;078;----;Norilsk;;Russia;2;69-20N;088-06E;69-20N;088-06E;62;62; 23;103;----;Hodovariha;;Russia;2;68-56N;053-46E;;;11;; 23;104;----;Sengejski Strait;;Russia;2;68-29N;051-15E;;;5;; 23;109;----;Ndsovaja;;Russia;2;68-15N;054-31E;;;24;; 23;112;----;Varandey;;Russia;2;68-48N;058-00E;;;5;; 23;114;----;Cape Svedskij;;Russia;2;68-35N;056-38E;;;4;; 23;174;----;Potapovo;;Russia;2;68-42N;087-16E;;;43;; 23;205;----;Nar'Jan-Mar;;Russia;2;67-38N;053-02E;67-39N;053-01E;7;12;P 23;207;----;Kotkino;;Russia;2;67-01N;051-12E;;;18;18; 23;214;----;Layato Lake ;;Russia;2;67-34N;056-08E;;;137;; 23;215;----;Horej-Ver;;Russia;2;67-26N;058-02E;;;71;; 23;219;----;Hoseda-Hard;;Russia;2;67-05N;059-23E;;;84;84;P 23;220;----;Zeleznodorozny;;Russia;2;67-50N;064-45E;;;116;; 23;226;----;Vorkuta;;Russia;2;67-29N;064-01E;67-29N;064-01E;180;172; 23;242;----;Novy Port;;Russia;2;67-41N;072-52E;;;12;; 23;256;----;Tazovskoe;;Russia;2;67-28N;078-44E;67-28N;078-44E;8;8;P 23;274;----;Igarka;;Russia;2;67-28N;086-34E;67-28N;086-34E;30;31;P 23;305;----;Okunev Nos;;Russia;2;66-15N;052-35E;;;20;20; 23;311;----;Misvan;;Russia;2;66-57N;055-46E;;;61;; 23;324;----;Petrun;;Russia;2;66-28N;060-45E;;;58;; 23;330;----;Salehard;;Russia;2;66-32N;066-40E;66-32N;066-32E;16;16;P 23;331;----;Ra-Iz;;Russia;2;66-54N;065-40E;;;890;890;P 23;332;----;Sangomnoy;;Russia;2;66-45N;067-45E;;;31;; 23;333;----;Jambur;;Russia;2;66-48N;068-53E;;;32;; 23;339;----;Jangi-Jugan;;Russia;2;66-03N;068-41E;;;40;; 23;341;----;Jar-Sale;;Russia;2;66-50N;070-50E;;;8;; 23;345;----;Nyda;;Russia;2;66-36N;072-54E;;;10;; 23;365;----;Sidorovsk;;Russia;2;66-36N;082-30E;;;34;; 23;375;----;Kurejka River;;Russia;2;66-25N;087-12E;;;27;; 23;383;----;Agata;;Russia;2;66-53N;093-28E;;;280;278;P 23;405;----;Ust'- Cil'Ma;;Russia;2;65-26N;052-16E;65-27N;052-10E;70;68;P 23;411;----;Muntniy Materik;;Russia;2;65-57N;055-09E;;;72;; 23;412;----;Ust'- Usa;;Russia;2;65-58N;056-55E;;;77;78;P 23;416;----;Kosju River;;Russia;2;65-38N;059-09E;;;89;; 23;418;----;Pechora;;Russia;2;65-07N;057-06E;65-07N;057-06E;56;59;P 23;423;----;Unsilgort;;Russia;2;65-51N;065-00E;;;40;; 23;426;----;Muzi;;Russia;2;65-23N;064-43E;65-23N;064-43E;18;19;P 23;443;----;Pravaja Hetta;;Russia;2;65-52N;074-30E;;;54;; 23;445;----;Nadym;;Russia;2;65-36N;072-42E;;;12;; 23;465;----;Krasnoselkup;;Russia;2;65-41N;082-28E;;;60;; 23;471;----;Ust-Bajha;;Russia;2;65-52N;086-13E;;;58;; 23;472;----;Turuhansk;;Russia;2;65-47N;087-56E;65-47N;087-57E;32;38;P 23;484;----;Bolsoj Porog;;Russia;2;65-38N;090-01E;;;65;; 23;501;----;Levkinskaja;;Russia;2;64-47N;051-04E;;;167;; 23;503;----;Izma;;Russia;2;65-02N;053-55E;;;38;; 23;509;----;Kedva River;;Russia;2;64-14N;053-30E;;;60;; 23;514;----;Irael;;Russia;2;64-27N;055-08E;;;157;; 23;516;----;Ijid-Patok;;Russia;2;64-20N;058-13E;;;84;; 23;518;----;Ust'- Sugor;;Russia;2;64-16N;057-37E;;;75;75; 23;527;----;Saran-Paul;;Russia;2;64-17N;060-53E;64-17N;060-53E;29;29;P 23;552;----;Tarko-Sale;;Russia;2;64-55N;077-49E;64-55N;077-49E;27;27;P 23;578;----;Verescagino;;Russia;2;64-15N;087-36E;;;26;; 23;589;----;Tugoncani;;Russia;2;64-13N;093-48E;;;102;; 23;606;----;Uhta;;Russia;2;63-33N;053-49E;63-34N;053-43E;149;137; 23;609;----;Izvajil;;Russia;2;63-03N;054-28E;;;112;; 23;612;----;Vuktyl;;Russia;2;63-50N;057-25E;;;97;; 23;625;----;Sosva;;Russia;2;63-39N;062-06E;;;27;28;P 23;629;----;Igrim;;Russia;2;63-12N;064-29E;;;28;; 23;631;----;Berezovo;;Russia;2;63-56N;065-03E;63-56N;065-03E;27;32;P 23;632;----;Kislor West;;Russia;2;63-43N;066-42E;;;61;; 23;635;----;Kazym River;;Russia;2;63-40N;067-14E;;;27;; 23;656;----;Hale-Savoy;;Russia;2;63-23N;078-20E;;;66;; 23;662;----;Kiki Akki;;Russia;2;63-48N;082-44E;;;33;; 23;678;----;Verhneimbatsk;;Russia;2;63-09N;087-57E;63-09N;087-57E;40;46;P 23;691;----;Ucami;;Russia;2;63-50N;096-39E;;;105;; 23;699;----;Vivi River;;Russia;2;63-52N;097-50E;;;109;; 23;701;----;Vesljana;;Russia;2;62-59N;050-54E;;;94;103; 23;709;----;Pomozdino;;Russia;2;62-12N;054-12E;;;154;; 23;711;----;Troicko-Pecherskoe;;Russia;2;62-42N;056-12E;62-42N;056-12E;139;139;P 23;724;----;Njaksimvol;;Russia;2;62-26N;060-52E;62-26N;060-52E;50;51;P 23;734;----;Oktjabr'Skoe;;Russia;2;62-27N;066-03E;62-27N;066-03E;73;72;P 23;748;----;Russkinskaja;;Russia;2;62-09N;073-36E;;;68;; 23;774;----;Kellog;;Russia;2;62-27N;086-35E;;;58;; 23;776;----;Bahta;;Russia;2;62-20N;089-15E;;;58;; 23;788;----;Kuzmovka;;Russia;2;62-19N;092-08E;;;60;; 23;803;UUYT;Ust'- Kulom;;Russia;2;61-41N;053-41E;;;139;144;P 23;804;UUYY;Syktyvkar;;Russia;2;61-43N;050-50E;61-40N;050-51E;119;119;P 23;807;----;Vizinga;;Russia;2;61-05N;050-10E;;;134;; 23;812;----;Jaksa;;Russia;2;61-48N;056-50E;;;130;; 23;813;----;Ust'- Un'Ja;;Russia;2;61-48N;057-55E;;;;174; 23;829;----;Sovetski;;Russia;2;61-20N;063-29E;;;116;; 23;841;----;Gorskova;;Russia;2;61-42N;070-40E;;;46;; 23;847;----;Sitomino;;Russia;2;61-19N;071-16E;;;33;; 23;848;----;Neftejugansk;;Russia;2;61-06N;072-45E;;;27;; 23;849;USRR;Surgut;;Russia;2;61-15N;073-30E;61-15N;073-30E;44;56;P 23;862;----;Korliki;;Russia;2;61-32N;082-25E;;;80;; 23;867;----;Larjak;;Russia;2;61-06N;080-16E;;;55;; 23;884;----;Bor;;Russia;2;61-36N;090-01E;61-36N;090-00E;63;58;P 23;891;----;Bajkit;;Russia;2;61-40N;096-22E;61-40N;096-22E;261;262;P 23;904;----;Kazim;;Russia;2;60-20N;051-33E;;;126;; 23;905;----;Ust-Cernaja;;Russia;2;60-30N;052-40E;;;152;; 23;909;----;Gajny;;Russia;2;60-17N;054-21E;60-17N;054-18E;199;198;P 23;914;----;Cherdyn;;Russia;2;60-24N;056-31E;60-24N;056-29E;206;207;P 23;919;----;Pokrovsk-Ural'Skiy;;Russia;2;60-08N;059-49E;;;229;; 23;921;----;Ivdel;;Russia;2;60-41N;060-27E;60-41N;060-26E;101;95;P 23;923;----;Supra;;Russia;2;60-52N;064-54E;;;81;; 23;927;----;Severouralsk;;Russia;2;60-09N;060-01E;60-09N;060-01E;186;186; 23;929;----;Saim;;Russia;2;60-19N;064-13E;;;53;53; 23;933;USHH;Hanty-Mansijsk;;Russia;2;61-01N;069-02E;60-58N;069-04E;40;46;P 23;939;----;Altay;;Russia;2;60-20N;068-57E;;;30;; 23;946;----;Ugut;;Russia;2;60-31N;074-02E;;;48;; 23;953;----;Lobcinskije;;Russia;2;60-57N;078-47E;;;56;; 23;955;----;Aleksandrovskoe;;Russia;2;60-26N;077-52E;60-26N;077-52E;47;48;P 23;966;----;Vanzil'- Kynak;;Russia;2;60-21N;084-05E;;;99;99;P 23;973;----;Vorogovo;;Russia;2;61-02N;089-38E;;;46;49;P 23;975;----;Sym;;Russia;2;60-21N;088-22E;;;85;86;P 23;982;----;Jel'Mo;;Russia;2;61-05N;093-04E;;;122;; 23;986;----;Severo-Jenisejsk;;Russia;2;60-28N;093-01E;;;521;; 23;987;----;Jarcevo;;Russia;2;60-15N;090-14E;;;58;58;P 23;992;----;Ust-Kamo;;Russia;2;60-44N;097-31E;;;179;; 24;052;----;Sahanja;;Russia;2;69-45N;128-12E;;;315;; 24;105;----;Essej;;Russia;2;68-28N;102-22E;;;271;271;P 24;125;----;Olenek;;Russia;2;68-30N;112-26E;68-29N;112-26E;220;220;P 24;143;----;Dzardzan;;Russia;2;68-44N;124-00E;68-44N;124-00E;45;39;P 24;166;----;Jansk;;Russia;2;68-27N;134-48E;;;103;; 24;266;----;Verhojansk;;Russia;2;67-33N;133-23E;67-33N;133-23E;137;137;P 24;329;----;Selagoncy;;Russia;2;66-15N;114-17E;;;235;236;P 24;343;----;Zhigansk;;Russia;2;66-46N;123-24E;66-46N;123-24E;93;92;P 24;382;----;Ust'- Moma;;Russia;2;66-27N;143-14E;;;196;196;P 24;477;----;Iema;;Russia;2;65-15N;135-54E;;;676;; 24;507;----;Tura;;Russia;2;64-16N;100-14E;64-10N;100-04E;186;168;P 24;557;----;Tas-Tumus;;Russia;2;64-12N;126-37E;;;76;; 24;585;----;Ust-Nera;;Russia;2;64-34N;143-12E;;;523;; 24;606;----;Kislokan;;Russia;2;63-36N;103-59E;;;209;; 24;639;----;Njurba;;Russia;2;63-17N;118-20E;63-17N;118-20E;129;119;P 24;641;----;Viljujsk;;Russia;2;63-46N;121-37E;63-46N;121-37E;107;111;P 24;652;----;Sangary;;Russia;2;63-58N;127-28E;63-58N;127-28E;90;96;P 24;656;----;Batamaj;;Russia;2;63-31N;129-29E;;;79;79;P 24;671;----;Tompo;;Russia;2;63-57N;135-52E;;;400;402;P 24;679;----;Vostocnaja;;Russia;2;63-02N;139-21E;;;1292;; 24;688;----;Ojmjakon;;Russia;2;63-15N;143-09E;63-28N;142-48E;745;741;P 24;713;----;Nakanno;;Russia;2;62-54N;108-30E;;;246;; 24;718;----;Hamakar;;Russia;2;62-06N;108-14E;;;272;; 24;724;----;Chernishevskij;;Russia;2;62-02N;112-30E;;;424;422;P 24;726;----;Mirnvy;;Russia;2;62-32N;113-52E;62-33N;114-00E;347;357; 24;738;----;Suntar;;Russia;2;62-09N;117-39E;62-09N;117-39E;124;133;P 24;768;----;Curapca;;Russia;2;62-02N;132-36E;62-02N;132-36E;179;186;P 24;771;----;Telpy Kljuch;;Russia;2;62-47N;136-48E;62-47N;136-48E;289;289; 24;817;----;Erbogacen;;Russia;2;61-16N;108-01E;61-16N;108-01E;291;291;P 24;843;----;Tongulah;;Russia;2;61-58N;124-51E;;;205;; 24;856;----;Pokrovskaja;;Russia;2;61-29N;129-09E;;;112;115; 24;871;----;Ohotsky Perevoz;;Russia;2;61-52N;135-32E;61-52N;135-32E;140;140; 24;891;----;Kulu;;Russia;2;61-53N;147-21E;61-53N;147-21E;670;670; 24;908;----;Vanavara;;Russia;2;60-20N;102-16E;60-20N;102-16E;260;260;P 24;918;----;Preobrazenka;;Russia;2;60-04N;107-58E;;;292;; 24;923;----;Lensk;;Russia;2;60-43N;114-53E;60-43N;114-53E;243;234;P 24;944;----;Olekminsk;;Russia;2;60-24N;120-25E;60-24N;120-25E;226;226;P 24;951;----;Isit;;Russia;2;60-49N;125-19E;;;118;118;P 24;959;UEEE;Jakutsk;;Russia;2;62-01N;129-43E;62-05N;129-45E;103;101;P 24;962;----;Amga;;Russia;2;60-54N;131-59E;60-54N;131-59E;148;146;P 24;966;----;Ust'- Maja;;Russia;2;60-23N;134-27E;60-25N;134-32E;175;170;P 24;967;----;Tegjultje-Terde;;Russia;2;60-10N;130-12E;;;171;; 24;982;----;Uega;;Russia;2;60-43N;142-47E;;;398;398; 24;988;----;Arka;;Russia;2;60-05N;142-20E;;;198;198;P 25;017;----;Andryuskino;;Russia;2;69-11N;154-27E;;;46;; 25;034;----;Buhta Ambarcik;;Russia;2;69-37N;162-18E;;;;23; 25;042;----;Ajon Island;;Russia;2;69-50N;168-40E;69-56N;167-58E;16;16; 25;077;----;Cape Kjangtokjnmank;;Russia;2;69-13N;179-22E;;;7;; 25;121;----;Koljmskaja;;Russia;2;68-44N;158-44E;;;15;; 25;123;----;Cherskij;;Russia;2;68-45N;161-17E;68-45N;161-18E;32;28;P 25;150;----;Caunskaja Bay;;Russia;2;68-54N;170-40E;;;6;; 25;151;----;Caun;;Russia;2;68-48N;170-40E;;;6;; 25;173;----;Mys Shmidta;;Russia;2;68-54N;179-22W;68-55N;179-29W;7;4;P 25;248;----;Ilirnej;;Russia;2;67-15N;167-58E;;;356;353;P 25;325;----;Ust'- Oloj;;Russia;2;66-33N;159-25E;;;125;127; 25;356;----;Muhomornoje;;Russia;2;66-23N;173-21E;;;74;; 25;372;----;Amgujema;;Russia;2;67-02N;178-55W;;;138;; 25;378;----;Egvekinot;;Russia;2;66-21N;179-07W;;;26;26; 25;399;----;Mys Uelen;;Russia;2;66-10N;169-50W;66-10N;169-50W;7;3;P 25;400;----;Zyrjanka;;Russia;2;65-44N;150-54E;65-44N;150-54E;43;43;P 25;428;----;Omolon;;Russia;2;65-14N;160-32E;65-13N;160-30E;265;264; 25;503;----;Korkodon River;;Russia;2;64-43N;154-05E;;;101;; 25;538;----;Verhnee Penzino;;Russia;2;64-13N;164-14E;;;326;326; 25;551;----;Markovo;;Russia;2;64-41N;170-25E;64-41N;170-25E;33;26;P 25;563;UHMA;Anadyr;;Russia;2;64-47N;177-34E;64-47N;177-34E;62;61;P 25;594;UHMD;Buhta Providenja;;Russia;2;64-25N;173-14W;64-26N;173-14W;3;17;P 25;621;----;Kedon;;Russia;2;64-00N;158-55E;64-07N;159-14E;683;683;P 25;656;----;Berezovo;;Russia;2;63-25N;172-43E;;;200;; 25;677;----;Beringovskaja;;Russia;2;63-03N;179-19E;63-03N;179-19E;82;82;P 25;703;----;Sejmchan;;Russia;2;62-55N;152-25E;62-56N;152-25E;207;205;P 25;744;----;Kamenskoe;;Russia;2;62-26N;166-05E;62-28N;166-13E;8;10; 25;777;----;Buhta Gavriila;;Russia;2;62-25N;179-08E;;;;7; 25;902;----;Atka;;Russia;2;60-51N;151-46E;;;;901; 25;913;UHMM;Magadan;;Russia;2;59-33N;150-47E;59-35N;150-47E;118;116;P 25;914;----;Nagajeva Bay;;Russia;2;59-29N;150-30E;;;6;; 25;941;----;Cemurnaut;;Russia;2;60-52N;163-38E;;;14;; 25;954;----;Korf;;Russia;2;60-21N;166-00E;60-21N;166-00E;3;4;P 25;956;----;Apuka;;Russia;2;60-26N;169-40E;;;8;5;P 26;029;----;Pakri;;Estonia;6;59-21N;024-03E;;;;26; 26;045;----;Kunda;;Estonia;6;59-31N;026-33E;;;2;3; 26;046;----;Johvi;;Estonia;6;59-20N;027-23E;;;73;75; 26;058;----;Narva;;Estonia;6;59-22N;028-07E;;;30;30; 26;059;----;Kingisepp;;Russia;6;59-22N;028-36E;;;19;19;P 26;060;----;Lomonosov;;Russia;6;59-55N;029-46E;;;2;; 26;063;ULLI;St. Peterburg;;Russia;6;59-58N;030-18E;59-58N;030-18E;4;6;P 26;064;----;Begunitsy;;Russia;6;59-35N;029-19E;;;160;; 26;067;----;Volosovo;;Russia;6;59-26N;029-29E;;;127;; 26;069;----;Belogorka;;Russia;6;59-21N;030-08E;;;91;90; 26;072;----;Petrokrepost;;Russia;6;59-56N;031-00E;;;11;17; 26;078;----;Ljuban;;Russia;6;59-21N;031-14E;;;40;39; 26;080;----;Motokhovo;;Russia;6;59-32N;032-23E;;;34;; 26;092;----;Sugozero;;Russia;6;59-57N;034-12E;;;;91; 26;094;----;Tihvin;;Russia;6;59-39N;033-33E;;;61;61;P 26;099;----;Efimovskaja;;Russia;6;59-30N;034-42E;;;173;176; 26;115;----;Ristna;;Estonia;6;58-55N;022-04E;58-55N;022-04E;9;9; 26;116;EEKA;Kardla;;Estonia;6;58-59N;022-49E;;;5;; 26;124;----;Nigula;;Estonia;6;58-57N;023-49E;;;4;25; 26;128;----;Virtsu;;Estonia;6;58-34N;023-31E;;;2;3; 26;134;----;Kuusiku;;Estonia;6;58-58N;024-44E;;;;52; 26;135;----;Turi;;Estonia;6;58-49N;025-25E;;;61;65; 26;141;----;Valke-Maarja;;Estonia;6;59-08N;026-14E;;;123;123; 26;144;----;Jogeva;;Estonia;6;58-45N;026-25E;;;;71; 26;145;----;Tilrikoja;;Estonia;6;58-52N;026-57E;;;32;34; 26;157;----;Gdov;;Russia;6;58-44N;027-50E;58-45N;027-50E;36;40; 26;167;----;Nikolaevskoe;;Russia;6;58-34N;029-48E;;;93;91; 26;179;----;Novgorod;;Russia;6;58-31N;031-15E;;;24;24; 26;184;----;Malaya Vishera;;Russia;6;58-51N;032-14E;;;61;; 26;196;----;Hvojnaja;;Russia;6;58-54N;034-32E;;;;164; 26;214;----;Vilsandi;;Estonia;6;58-23N;021-49E;;;;8; 26;215;----;Kuressaare;;Estonia;6;58-14N;022-30E;;;7;4; 26;218;----;Sorve;;Estonia;6;57-55N;022-03E;;;;4; 26;226;----;Kihnu;;Estonia;6;58-06N;023-58E;;;;4; 26;229;----;Ainazi;;Latvia;6;57-52N;024-22E;;;5;5; 26;231;----;Parnu;;Estonia;6;58-23N;024-30E;;;14;8; 26;233;----;Viljandi;;Estonia;6;58-22N;025-36E;;;;87; 26;238;----;Rujiena;;Latvia;6;57-54N;025-23E;;;61;12; 26;242;----;Tartu;;Estonia;6;58-18N;026-44E;;;59;68; 26;247;----;Valga;;Estonia;6;57-47N;026-02E;;;62;66; 26;249;----;Voru;;Estonia;6;57-51N;027-01E;;;82;83; 26;258;----;Pskov;;Russia;6;57-49N;028-25E;57-50N;028-21E;42;45;P 26;264;----;Strugi Krasnye;;Russia;6;58-16N;029-06E;;;135;129; 26;268;----;Dno;;Russia;6;57-49N;029-57E;;;71;71; 26;275;----;Staraja Russa;;Russia;6;58-01N;031-19E;58-01N;031-19E;25;25;P 26;283;----;Okulovka;;Russia;6;58-22N;033-19E;;;172;176; 26;285;----;Krestcy;;Russia;6;58-16N;032-32E;;;54;63; 26;289;----;Valdaj;;Russia;6;57-58N;033-14E;;;219;219; 26;291;----;Borovici;;Russia;6;58-25N;033-54E;58-25N;033-54E;92;89; 26;298;----;Bologoe;;Russia;6;57-54N;034-03E;57-54N;034-03E;178;188;P 26;313;----;Kolka;;Latvia;6;57-45N;022-36E;57-45N;022-36E;5;5;P 26;314;UMRW;Ventspils;;Latvia;6;57-24N;021-32E;57-22N;021-33E;3;3; 26;318;----;Stende;;Latvia;6;57-11N;022-33E;;;79;79; 26;324;----;Mersrags;;Latvia;6;57-21N;023-07E;;;6;6; 26;326;----;Skulte;;Latvia;6;57-19N;024-25E;;;10;10; 26;335;----;Priekuli;;Latvia;6;57-19N;025-20E;;;122;122; 26;339;----;Zoseni;;Latvia;6;57-08N;025-55E;;;180;180; 26;346;----;Aluksne;;Latvia;6;57-26N;027-02E;;;193;193; 26;348;----;Gulbene;;Latvia;6;57-08N;026-43E;;;143;143;P 26;359;----;Puskinskie Gory;;Russia;6;57-01N;028-54E;;;110;108; 26;378;----;Holm;;Russia;6;57-09N;031-11E;;;71;71; 26;381;----;Demjansk;;Russia;6;57-39N;032-28E;;;48;62; 26;389;----;Ostaskov;;Russia;6;57-08N;033-07E;;;217;218;P 26;393;----;Vysnij Volocek;;Russia;6;57-33N;034-34E;;;161;169; 26;403;----;Pavilosta;;Latvia;6;56-53N;021-11E;;;9;10; 26;406;----;Liepaja;;Latvia;6;56-29N;021-01E;56-31N;021-01E;7;7;P 26;416;----;Saldus;;Latvia;6;56-41N;022-30E;;;112;112; 26;422;UMRR;Riga;;Latvia;6;56-58N;024-03E;56-58N;024-04E;7;7;P 26;424;----;Dobele;;Latvia;6;56-37N;023-19E;;;44;44; 26;425;----;Jelgava;;Latvia;6;56-39N;023-44E;;;9;9; 26;429;----;Bauska;;Latvia;6;56-24N;024-13E;;;33;33; 26;435;----;Skriveri;;Latvia;6;56-39N;025-08E;;;83;83; 26;436;----;Zilani;;Latvia;6;56-31N;025-55E;;;109;109; 26;446;----;Rezekne;;Latvia;6;56-32N;027-16E;;;157;157; 26;477;ULOL;Velikie Luki;;Russia;6;56-21N;030-37E;56-23N;030-36E;98;106;P 26;479;----;Toropets;;Russia;6;56-30N;031-39E;;;187;; 26;498;----;Rzev;;Russia;6;56-16N;034-19E;56-16N;034-19E;196;197;P 26;502;----;Palanga;;Lithuania;6;55-58N;021-06E;;;10;15; 26;509;----;Klaipeda;;Lithuania;6;55-44N;021-04E;;;6;7;P 26;515;----;Telsiai;;Lithuania;6;55-58N;022-15E;;;153;152; 26;517;----;Vezaiciai;;Lithuania;6;55-42N;021-29E;;;62;64; 26;518;----;Laukuva;;Lithuania;6;55-37N;022-14E;;;165;166; 26;524;----;Siauliai;;Lithuania;6;55-56N;023-19E;55-56N;023-19E;106;107;P 26;529;----;Panevezys;;Lithuania;6;55-45N;024-23E;;;57;58; 26;531;----;Birzai;;Lithuania;6;56-12N;024-46E;;;60;62; 26;544;----;Daugavpils;;Latvia;6;55-52N;026-37E;55-52N;026-37E;122;122;P 26;547;----;Dukstas;;Lithuania;6;55-31N;026-18E;;;164;168; 26;551;----;Dagda;;Latvia;6;56-06N;027-33E;;;181;181; 26;554;----;Verhnedvinsk;;Belarus;6;55-49N;027-57E;;;133;132;P 26;578;----;Velizh;;Russia;6;55-36N;031-12E;;;183;; 26;585;----;Belyj;;Russia;6;55-51N;032-57E;;;214;222;P 26;595;----;Sychevka;;Russia;6;55-50N;034-17E;;;200;; 26;600;----;Silute;;Lithuania;6;55-21N;021-28E;;;3;5; 26;603;----;Nida;;Lithuania;6;55-19N;021-01E;;;2;3; 26;620;----;Dotnuva;;Lithuania;6;55-24N;023-52E;;;69;79; 26;621;----;Raseiniai;;Lithuania;6;55-23N;023-07E;;;111;111; 26;629;----;Kaunas;;Lithuania;6;54-53N;023-50E;54-53N;023-53E;76;77;P 26;633;----;Utena;;Lithuania;6;55-32N;025-36E;;;105;106; 26;634;----;Ukmerge;;Lithuania;6;55-15N;024-46E;;;72;73; 26;643;----;Sarcovschina;;Belarus;6;55-22N;027-28E;;;;131; 26;645;----;Lyntupy;;Belarus;6;55-03N;026-19E;;;209;212; 26;653;----;Polock;;Belarus;6;55-28N;028-46E;;;;133; 26;659;----;Lepel;;Belarus;6;54-53N;028-42E;;;174;174; 26;666;UMII;Vitebsk;;Belarus;6;55-10N;030-13E;55-10N;030-08E;176;176;P 26;668;----;Senno;;Belarus;6;54-49N;029-41E;;;;176; 26;695;----;Vjaz'Ma;;Russia;6;55-10N;034-24E;;;253;251;P 26;702;----;Kaliningrad;;Russia;6;54-43N;020-33E;54-42N;020-37E;27;21;P 26;713;----;Kybartai;;Lithuania;6;54-38N;022-47E;;;58;59; 26;728;----;Lazdijai;;Lithuania;6;54-14N;023-31E;;;133;134; 26;730;EYVI;Vilnius;;Lithuania;6;54-38N;025-06E;;;162;156;P 26;732;----;Vilnius;;Lithuania;6;54-38N;025-17E;;;196;196; 26;737;----;Varena;;Lithuania;6;54-15N;024-33E;;;109;111; 26;745;----;Vileyka;;Belarus;6;54-29N;026-54E;;;;183; 26;759;----;Borisov;;Belarus;6;54-16N;028-30E;;;;189; 26;763;----;Orsa;;Belarus;6;54-59N;030-25E;;;192;185; 26;774;----;Gorki;;Belarus;6;54-18N;030-56E;;;;205; 26;781;----;Smolensk;;Russia;6;54-45N;032-04E;54-45N;032-04E;241;239;P 26;784;----;Pochinok;;Russia;6;54-25N;032-27E;;;210;; 26;795;----;Spas-Demensk;;Russia;6;54-25N;034-01E;;;233;238; 26;825;----;Grodno;;Belarus;6;53-36N;024-03E;53-41N;023-50E;135;134; 26;832;----;Lida;;Belarus;6;53-51N;025-19E;;;158;157; 26;836;----;Novogrudok;;Belarus;6;53-36N;025-51E;;;;280; 26;846;----;Stolbtsy;;Belarus;6;53-28N;026-44E;;;;173; 26;850;UMMS;Minsk;;Belarus;6;53-56N;027-38E;53-52N;027-32E;234;231;P 26;853;----;Berezino;;Belarus;6;53-50N;028-59E;;;;154; 26;855;----;Mar'Ina Gorka;;Belarus;6;55-27N;028-08E;;;;177; 26;863;----;Mogilev;;Belarus;6;53-57N;030-04E;;;193;192;P 26;864;----;Klicev;;Belarus;6;53-30N;029-20E;;;;155; 26;878;----;Slavgorod;;Belarus;6;53-27N;031-01E;;;;170; 26;882;----;Roslavl;;Russia;6;53-56N;032-50E;;;217;224;P 26;887;----;Kostjvkovici;;Belarus;6;53-21N;032-04E;;;164;167; 26;894;----;Zukovka;;Russia;6;53-32N;033-45E;;;174;177; 26;898;UUBP;Brjansk;;Russia;6;53-15N;034-19E;53-14N;034-23E;217;216;P 26;923;----;Volkovysk;;Belarus;6;53-10N;024-27E;;;;183; 26;938;----;Ivacevici;;Belarus;6;52-43N;025-21E;;;;156; 26;941;----;Baranovici;;Belarus;6;53-07N;026-00E;53-07N;026-00E;194;193;P 26;951;----;Sluck;;Belarus;6;53-02N;027-33E;;;157;162;P 26;961;----;Bobruysr;;Belarus;6;53-13N;029-11E;;;165;156; 26;966;----;Zlobin;;Belarus;6;52-54N;030-02E;;;;142; 26;976;----;Krasnaja Gora;;Russia;6;53-01N;031-36E;;;148;148; 26;997;----;Trubcevsk;;Russia;6;52-35N;033-46E;;;180;178;P 27;008;----;Babaevo;;Russia;6;59-24N;035-56E;59-24N;035-55E;136;137;P 27;026;----;Korobovo;;Russia;6;59-38N;039-18E;;;;133; 27;037;ULWW;Vologda;;Russia;6;59-19N;039-55E;59-17N;039-52E;131;130;P 27;051;ULWT;Tot'Ma;;Russia;6;59-53N;042-45E;;;134;134;P 27;066;----;Nikol'Sk;;Russia;6;59-32N;045-28E;;;136;143;P 27;083;----;Oparino;;Russia;6;59-51N;048-17E;;;183;180;P 27;097;----;Murasi;;Russia;6;59-23N;048-59E;;;;213; 27;108;----;Ohony;;Russia;6;58-34N;035-38E;;;145;145; 27;113;----;Cerepovec;;Russia;6;59-15N;037-58E;;;131;114;P 27;199;----;Kirov;;Russia;6;58-36N;049-38E;58-36N;049-38E;158;158;P 27;215;----;Krasnyy Kholm;;Russia;6;58-03N;037-07E;;;137;; 27;217;----;Bezeck;;Russia;6;57-46N;036-42E;;;147;141;P 27;225;----;Rybinsk;;Russia;6;58-06N;038-41E;;;114;105;P 27;242;----;Buj;;Russia;6;58-29N;041-32E;;;97;103;P 27;243;----;Galic;;Russia;6;58-23N;042-22E;;;;132; 27;252;----;Nikolo-Poloma;;Russia;6;58-21N;043-23E;;;144;150;P 27;271;----;Sar'Ja;;Russia;6;58-22N;045-32E;58-22N;045-33E;125;125;P 27;277;----;Vetluga;;Russia;6;57-51N;045-46E;;;;136; 27;281;----;Sabalino;;Russia;6;58-18N;047-07E;;;;166; 27;283;----;Kotel'Nic;;Russia;6;58-18N;048-21E;;;;127; 27;316;----;Kasin;;Russia;6;57-21N;037-35E;;;;138; 27;321;----;Uglic;;Russia;6;57-30N;038-18E;;;;122; 27;329;----;Rostov;;Russia;6;57-12N;039-25E;;;102;101;P 27;331;----;Jaroslavl;;Russia;6;57-38N;039-45E;;;;129; 27;333;----;Kostroma;;Russia;6;57-44N;040-47E;;;;126; 27;346;----;Kinesma;;Russia;6;57-27N;042-10E;;;;128; 27;347;----;Ivanovo;;Russia;6;56-57N;040-58E;;;;126; 27;355;----;Jur'Evec;;Russia;6;57-20N;043-07E;;;132;132;P 27;369;----;Krasnye Baki;;Russia;6;57-08N;045-10E;;;111;110;P 27;373;----;Sakun'Ja;;Russia;6;57-40N;046-38E;;;176;175;P 27;393;----;Nolinsk;;Russia;6;57-33N;049-57E;;;136;136;P 27;401;----;Mednoye;;Russia;6;56-56N;035-29E;;;140;; 27;402;UUEM;Tver;;Russia;6;56-54N;035-53E;;;137;146;P 27;412;----;Savelovo;;Russia;6;56-52N;037-23E;;;123;124; 27;417;----;Klin;;Russia;6;56-21N;036-45E;;;;167; 27;428;----;Aleksandrov;;Russia;6;56-24N;038-45E;;;;185; 27;441;----;Suja;;Russia;6;56-51N;041-24E;;;;98; 27;453;----;Volzskaja Gmo;;Russia;6;56-41N;043-26E;;;;103; 27;459;----;Niznij Novgorod;;Russia;6;56-16N;044-00E;56-16N;044-00E;157;157;P 27;462;----;Semenov;;Russia;6;56-44N;044-31E;;;;118; 27;479;----;Koz'Modem'Jansk;;Russia;6;56-20N;046-35E;;;114;107;P 27;480;----;Sancursk;;Russia;6;56-59N;047-19E;;;92;103; 27;485;----;Joskar-Ola;;Russia;6;56-42N;047-55E;;;;106; 27;491;----;Novyj Tor'Jal;;Russia;6;57-00N;048-44E;;;;143; 27;502;----;Volokolamsk;;Russia;6;56-01N;035-56E;;;;198; 27;507;----;Gagarin;;Russia;6;55-31N;035-02E;;;;194; 27;509;----;Mozajsk;;Russia;6;55-31N;036-00E;;;;185; 27;511;----;Novo-Jerusalim;;Russia;6;55-54N;036-49E;;;;162; 27;523;----;Pavlovskij Posad;;Russia;6;55-46N;038-41E;;;;135; 27;532;----;Vladimir;;Russia;6;56-07N;040-21E;;;170;172;P 27;539;----;Gus'- Hrustal'Nyj;;Russia;6;55-36N;040-39E;;;;136; 27;549;----;Murom;;Russia;6;55-36N;042-02E;;;;119; 27;577;----;Sergac;;Russia;6;55-32N;045-30E;;;;125; 27;581;----;Ceboksary;;Russia;6;56-05N;047-20E;;;;163; 27;587;----;Kanas;;Russia;6;55-31N;047-28E;;;;183; 27;595;----;Kazan;;Russia;6;55-36N;049-17E;55-47N;049-11E;116;116;P 27;606;----;Malojaroslavec;;Russia;6;55-01N;036-29E;;;197;197; 27;611;----;Naro-Fominsk;;Russia;6;55-23N;036-42E;;;;193; 27;612;----;Moskva;;Russia;6;55-50N;037-37E;55-45N;037-34E;156;156;P 27;618;----;Serpuhov;;Russia;6;54-56N;037-28E;;;;166; 27;625;----;Kolomna;;Russia;6;55-08N;038-44E;;;;114; 27;627;----;Kasira;;Russia;6;54-50N;038-09E;;;;221; 27;643;----;Vyksa;;Russia;6;55-20N;042-07E;;;;114; 27;648;----;Elat'Ma;;Russia;6;54-57N;041-46E;;;136;136;P 27;653;----;Arzamas;;Russia;6;55-22N;043-47E;;;;127; 27;665;----;Lukojanov;;Russia;6;55-02N;044-30E;;;220;219;P 27;679;----;Alatyr;;Russia;6;54-49N;046-35E;;;180;180;P 27;697;----;Tetjusi;;Russia;6;54-57N;048-49E;;;;156; 27;703;----;Kaluga;;Russia;6;54-34N;036-24E;;;201;201;P 27;707;----;Suhinici;;Russia;6;54-06N;035-21E;54-07N;035-20E;239;238;P 27;719;----;Tula;;Russia;6;54-14N;037-37E;;;204;203;P 27;729;----;Mihajlov;;Russia;6;54-14N;039-02E;;;;166; 27;730;----;Rjazan;;Russia;6;54-38N;039-42E;54-38N;039-42E;158;158;P 27;736;----;Silovo;;Russia;6;54-18N;040-53E;;;;99; 27;745;----;Sasovo;;Russia;6;54-21N;041-58E;;;;115; 27;752;----;Temnikov;;Russia;6;54-38N;043-14E;;;;139; 27;758;----;Torbeevo;;Russia;6;54-05N;043-15E;;;;198; 27;760;----;Saransk;;Russia;6;54-08N;045-14E;;;;201; 27;776;----;Surskoe;;Russia;6;54-29N;046-42E;;;;100; 27;786;----;Ulyanovsk;;Russia;6;54-19N;048-20E;54-17N;048-15E;127;129;P 27;799;----;Dimitrovgrad;;Russia;6;54-14N;049-36E;;;;73; 27;817;----;Mcensk;;Russia;6;53-23N;036-32E;;;;201; 27;821;----;Uzlovaja;;Russia;6;54-00N;038-08E;;;;231; 27;823;----;Pavelec;;Russia;6;53-47N;039-15E;;;210;209;P 27;835;----;Rjazsk;;Russia;6;53-43N;040-07E;;;;127; 27;848;----;Morsansk;;Russia;6;53-27N;041-48E;;;144;142; 27;853;----;Narovcat;;Russia;6;53-52N;043-41E;;;;148; 27;857;----;Zametcino;;Russia;6;53-29N;042-38E;;;133;131; 27;858;----;Pacelma;;Russia;6;53-20N;043-19E;;;;261; 27;894;----;Novodevic'E;;Russia;6;53-36N;048-50E;;;;143; 27;906;----;Orel;;Russia;6;52-56N;036-00E;53-00N;036-02E;203;196;P 27;921;----;Efremov;;Russia;6;53-09N;038-07E;;;153;215; 27;928;----;Elec;;Russia;6;52-38N;038-31E;;;168;168;P 27;930;----;Lipeck;;Russia;6;52-42N;039-31E;;;150;177; 27;935;----;Micurinsk;;Russia;6;52-53N;040-29E;;;158;158; 27;944;----;Tambov;;Russia;6;52-44N;041-28E;52-43N;041-47E;161;161; 27;947;----;Tambov;;Russia;6;52-48N;041-20E;52-42N;041-23E;139;128;P 27;957;----;Kirsanov;;Russia;6;52-40N;042-43E;;;130;169; 27;962;UWPP;Penza;;Russia;6;53-07N;045-01E;53-08N;045-01E;174;177;P 27;983;----;Syzran;;Russia;6;53-11N;048-24E;;;104;103;P 27;995;----;Samara Bezencuk ;;Russia;6;52-59N;049-26E;52-59N;049-26E;45;46; 28;009;----;Kirs;;Russia;2;59-22N;052-13E;59-20N;052-14E;167;169;P 28;028;----;Berezniki;;Russia;2;59-33N;056-50E;;;124;223; 28;036;----;Kytlym;;Russia;2;59-30N;059-12E;;;411;; 28;044;----;Serov;;Russia;2;59-36N;060-32E;;;132;130;P 28;049;----;Gari;;Russia;2;59-26N;062-20E;;;131;131;P 28;064;----;Leusi;;Russia;2;59-37N;065-43E;;;72;72;P 28;066;----;Kondinskoje;;Russia;2;59-40N;067-25E;;;41;; 28;076;----;Dem'Janskoe;;Russia;2;59-36N;069-17E;59-36N;069-17E;57;57;P 28;097;----;Usanovy;;Russia;2;59-28N;073-22E;;;82;; 28;116;----;Kudymkar;;Russia;2;58-59N;054-39E;;;187;186;P 28;128;----;Cermoz;;Russia;2;58-46N;056-12E;;;;123; 28;131;----;Kizel;;Russia;2;59-02N;057-34E;;;316;; 28;134;----;Gubakha;;Russia;2;58-52N;057-47E;;;304;; 28;138;----;Biser;;Russia;2;58-31N;058-51E;;;;463; 28;144;----;Verhotur'E;;Russia;2;58-52N;060-47E;;;126;125;P 28;158;----;Tabory;;Russia;2;58-31N;064-33E;;;73;; 28;165;----;Pump Station;;Russia;2;58-49N;065-58E;;;64;; 28;202;----;Falenki;;Russia;2;58-21N;051-34E;;;;178; 28;214;----;Glazov;;Russia;2;58-08N;052-35E;58-08N;052-40E;170;169;P 28;216;----;Verescagino;;Russia;2;58-05N;054-41E;;;228;226; 28;224;----;Perm';;Russia;2;58-01N;056-18E;;;;171; 28;225;----;Perm';;Russia;2;57-57N;056-12E;58-01N;056-18E;170;170;P 28;233;----;Kusva;;Russia;2;58-18N;059-45E;;;268;; 28;234;----;Lys'Va;;Russia;2;58-07N;057-47E;;;;226; 28;238;----;Kyn;;Russia;2;57-50N;058-39E;;;176;245; 28;240;----;Nizhnyj Tagil;;Russia;2;57-53N;060-04E;57-53N;060-04E;258;260;P 28;248;----;Alapaevsk;;Russia;2;57-52N;061-42E;;;128;130; 28;255;----;Turinsk;;Russia;2;58-03N;063-41E;;;71;103;P 28;264;----;Tavda;;Russia;2;58-03N;065-16E;58-03N;065-21E;62;60; 28;275;----;Tobol'Sk;;Russia;2;58-09N;068-15E;58-09N;068-11E;44;50;P 28;278;----;Vagay River;;Russia;2;57-55N;069-02E;;;100;; 28;302;----;Uni;;Russia;2;57-45N;051-30E;;;;183; 28;307;----;Urzum;;Russia;2;57-07N;050-00E;;;;165; 28;319;----;Nozovka;;Russia;2;57-05N;054-45E;;;130;131;P 28;321;----;Ohansk;;Russia;2;57-43N;055-23E;;;164;163; 28;324;----;Osa;;Russia;2;57-17N;055-26E;;;98;; 28;326;----;Kungur;;Russia;2;57-25N;056-56E;;;140;150; 28;333;----;Visim;;Russia;2;57-39N;059-30E;;;314;; 28;334;----;Samary;;Russia;2;57-21N;058-13E;;;244;244;P 28;346;----;Artenovsky;;Russia;2;57-22N;061-55E;;;177;154; 28;351;----;Irbit;;Russia;2;57-41N;063-03E;;;76;; 28;359;----;Tugulym;;Russia;2;57-04N;064-40E;;;91;90; 28;366;----;Jarkovo;;Russia;2;57-26N;067-05E;;;50;; 28;367;----;Tjumen;;Russia;2;57-07N;065-26E;;;104;102;P 28;382;----;Ust'- Isim;;Russia;2;57-41N;071-11E;57-43N;071-11E;56;62;P 28;383;----;Tevriz;;Russia;2;57-31N;072-24E;;;66;67; 28;409;----;Mozga;;Russia;2;56-26N;052-12E;;;;169; 28;411;----;Izhevsk;;Russia;2;56-50N;053-27E;;;158;159;P 28;419;----;Janaul;;Russia;2;56-16N;054-54E;;;99;102;P 28;421;----;Barda;;Russia;2;56-55N;055-36E;;;133;; 28;428;----;Cernuska;;Russia;2;56-30N;056-08E;;;142;148; 28;429;----;Oktjabrski;;Russia;2;56-31N;057-12E;;;229;; 28;434;----;Krasnoufimsk;;Russia;2;56-39N;057-47E;;;207;206;P 28;440;USSS;Ekaterinburg;;Russia;2;56-50N;060-38E;56-48N;060-38E;237;283;P 28;443;----;Bogdanovich;;Russia;2;56-47N;062-04E;;;159;; 28;445;----;Verhnee Dubrovo;;Russia;2;56-44N;061-04E;56-44N;061-04E;290;288; 28;448;----;Sysert;;Russia;2;56-31N;060-50E;56-30N;060-50E;266;266; 28;449;----;Kamensk-Uralskij;;Russia;2;56-26N;061-52E;;;168;171; 28;451;----;Kamyslov;;Russia;2;56-51N;062-43E;;;126;127; 28;455;----;Butka;;Russia;2;56-43N;063-46E;;;121;106; 28;456;----;Satrovo;;Russia;2;56-31N;064-39E;;;113;114; 28;457;----;Katajsk;;Russia;2;56-18N;062-36E;;;152;; 28;465;----;Jalturovosk;;Russia;2;56-41N;066-21E;56-41N;066-21E;60;61; 28;481;----;Vikulovo;;Russia;2;56-49N;070-37E;;;70;78;P 28;491;----;Bol'Sie Uki;;Russia;2;56-56N;072-40E;;;87;87;P 28;493;----;Tara;;Russia;2;56-54N;074-23E;56-54N;074-23E;74;73;P 28;498;----;Kolosovka;;Russia;2;56-27N;073-39E;;;95;98; 28;502;----;Vjatskie Poljany;;Russia;2;56-12N;051-06E;;;;212; 28;506;----;Elabuga;;Russia;2;55-46N;052-04E;;;192;91;P 28;517;----;Menzelinsk;;Russia;2;55-43N;053-04E;;;;112; 28;522;----;Askino;;Russia;2;56-05N;056-35E;;;;207; 28;526;----;Karaidelski;;Russia;2;55-49N;057-05E;;;200;; 28;533;----;Ntazepetrovsk;;Russia;2;56-03N;059-35E;;;320;320; 28;535;----;Karljhanovo;;Russia;2;55-57N;058-40E;;;231;; 28;537;----;Duvan;;Russia;2;55-42N;057-54E;;;326;338; 28;541;----;Verhnij Ufalej;;Russia;2;56-05N;060-18E;;;401;399; 28;548;----;Argajas;;Russia;2;55-31N;060-55E;;;254;; 28;552;----;Sadrinsk;;Russia;2;56-04N;063-39E;56-05N;063-38E;81;89;P 28;561;----;Tebenjakskoe;;Russia;2;56-10N;065-27E;;;61;; 28;566;----;Mokrousovo;;Russia;2;55-49N;066-47E;;;115;; 28;573;----;Isim;;Russia;2;56-06N;069-26E;56-06N;069-26E;83;82;P 28;581;----;Kamjsenka;;Russia;2;56-09N;070-39E;;;122;; 28;586;----;Tjukalinsk;;Russia;2;55-52N;072-12E;;;120;118; 28;588;----;Nazyvoevsk;;Russia;2;55-34N;071-22E;;;129;126; 28;593;----;Bol'Sherech'E;;Russia;2;56-06N;074-38E;;;78;77;P 28;598;----;Sargatskoe;;Russia;2;55-36N;073-29E;;;87;81;P 28;601;----;Cistopol;;Russia;2;55-19N;050-37E;;;113;179; 28;611;----;Musljumovo;;Russia;2;55-19N;053-12E;;;;80; 28;615;----;Bakaly;;Russia;2;55-11N;053-48E;;;126;125; 28;621;----;Birsk;;Russia;2;55-25N;055-32E;;;187;186;P 28;629;----;Ulu-Teljak;;Russia;2;54-54N;056-57E;;;119;119; 28;630;----;Zlatoust;;Russia;2;55-12N;059-40E;;;;538; 28;637;----;Kropacevo;;Russia;2;55-00N;057-59E;;;415;413;P 28;642;----;Cheljabinsk-Balandino;;Russia;2;55-18N;061-32E;55-18N;061-32E;227;230; 28;655;----;Sumiha;;Russia;2;55-14N;063-19E;;;176;178; 28;659;----;Kurtamys;;Russia;2;54-55N;064-26E;;;127;158; 28;661;----;Kurgan;;Russia;2;55-28N;065-24E;55-28N;065-24E;79;74;P 28;662;----;Lebjazje;;Russia;2;55-16N;066-30E;;;135;; 28;666;----;Makusino;;Russia;2;55-15N;067-18E;;;143;140;P 28;668;----;Polovinnoe;;Russia;2;54-46N;066-00E;;;152;152; 28;674;----;Petuhovo;;Russia;2;55-06N;067-58E;;;136;; 28;679;----;Petropavlovsk;;Kazakhstan;2;54-50N;069-09E;54-50N;069-09E;136;142;P 28;688;----;Isil'Kul;;Russia;2;54-54N;071-15E;;;128;125; 28;696;----;Kalacinsk;;Russia;2;55-02N;074-35E;;;107;110; 28;698;----;Omsk;;Russia;2;55-01N;073-23E;54-56N;073-24E;123;122;P 28;704;----;Culpanovo;;Russia;2;54-30N;050-25E;;;80;78; 28;705;----;Celno-Versiny;;Russia;2;54-25N;051-06E;;;;158; 28;710;----;Raevsky;;Russia;2;54-05N;054-55E;;;120;120; 28;711;----;Bugul'Ma;;Russia;2;54-35N;052-48E;54-35N;052-48E;312;304;P 28;712;----;Tuimazy;;Russia;2;54-35N;053-44E;;;126;135; 28;713;----;Buzdyak;;Russia;2;54-34N;054-31E;;;171;; 28;719;----;Aksakovo;;Russia;2;54-02N;054-11E;;;348;348; 28;722;----;Ufa;;Russia;2;54-43N;055-50E;54-49N;056-09E;105;104;P 28;726;----;Arhangelskoje;;Russia;2;54-24N;056-48E;;;168;; 28;741;----;Mirnii;;Russia;2;54-33N;060-18E;;;319;319; 28;748;----;Troizk;;Russia;2;54-05N;061-37E;54-05N;061-37E;193;192;P 28;752;----;Polovinnoje;;Russia;2;54-42N;063-50E;;;217;; 28;754;----;Oktjabrski;;Russia;2;54-24N;062-44E;;;168;; 28;756;----;Zverinogolovskaja;;Russia;2;54-28N;064-52E;;;117;117; 28;766;----;Blacoveschenka;;Kazakhstan;2;54-22N;066-58E;;;153;151;P 28;785;----;Vozvishen Sovkhoz;;Russia;2;54-26N;070-55E;;;127;; 28;786;----;Poltavka;;Russia;2;54-22N;071-45E;;;124;125;P 28;791;----;Serbakul;;Russia;2;54-38N;072-26E;;;109;115; 28;797;----;Odesskoe;;Russia;2;54-12N;072-58E;;;125;125;P 28;798;----;Pavlogradka;;Russia;2;54-12N;073-33E;;;125;; 28;799;----;Cerlak;;Russia;2;54-10N;074-48E;;;115;115;P 28;801;----;Krasnoe Poselenie;;Russia;2;53-58N;050-22E;;;;65; 28;806;----;Buguruslan;;Russia;2;53-37N;052-27E;;;87;92; 28;807;----;Samara Snysljaevka ;;Russia;2;53-15N;050-27E;;;40;40; 28;823;----;Tukan;;Russia;2;53-50N;057-31E;;;548;; 28;825;----;Sterlitamak;;Russia;2;53-35N;056-00E;53-37N;055-59E;130;137;P 28;831;----;Beloreck;;Russia;2;53-56N;058-20E;53-56N;058-20E;565;568; 28;833;----;Verhneural'Sk;;Russia;2;53-53N;059-12E;;;;403; 28;838;----;Magnitogorsk;;Russia;2;53-21N;059-05E;53-21N;059-05E;382;384;P 28;867;----;Uricky;;Kazakhstan;2;53-19N;065-33E;;;210;216;P 28;877;----;Volodarskoe;;Russia;2;53-19N;068-06E;;;319;; 28;879;----;Kokshetay;;Kazakhstan;2;53-17N;069-23E;53-17N;069-21E;229;229;P 28;886;----;Kzil-Tus Sovkhoz;;Russia;2;53-38N;072-22E;;;138;; 28;895;----;Russkaja Poliana;;Russia;2;53-47N;073-53E;;;125;; 28;900;UWWW;Samara;;Russia;2;53-12N;050-09E;;;44;; 28;908;----;Avangard Zernosovhoz;;Russia;2;52-37N;051-17E;;;;88; 28;909;----;Buzuluk;;Russia;2;52-49N;052-13E;;;80;80; 28;916;----;Sarlyk;;Russia;2;52-56N;054-45E;;;;190; 28;925;----;Meleuz;;Russia;2;52-57N;055-58E;;;179;180; 28;927;----;Jermolajevo;;Russia;2;52-43N;055-48E;;;247;; 28;938;----;Kizilskoje;;Russia;2;52-44N;058-54E;;;316;; 28;939;----;Kalininsk;;Russia;2;52-30N;059-42E;;;381;; 28;941;----;Kartaly;;Russia;2;53-03N;060-40E;;;300;301; 28;952;----;Kustanai;;Kazakhstan;2;53-13N;063-37E;53-13N;063-37E;156;156;P 28;957;----;Tobol;;Russia;2;52-41N;062-36E;52-41N;062-36E;208;208; 28;966;----;Ruzaevka;;Kazakhstan;2;52-49N;066-58E;;;227;227; 28;978;----;Balkasino;;Kazakhstan;2;52-32N;068-45E;;;399;398; 28;984;----;Sucinsk;;Kazakhstan;2;52-57N;070-13E;;;384;395; 29;023;----;Napas;;Russia;2;59-51N;081-57E;;;76;76;P 29;037;----;Berezovka;;Russia;2;59-23N;082-50E;;;68;; 29;068;----;Nazimovo;;Russia;2;59-30N;091-01E;;;64;67; 29;103;----;Katyl'Ga;;Russia;2;59-04N;076-44E;;;;69; 29;111;----;Sredny Vasjugan;;Russia;2;59-13N;078-14E;;;69;69;P 29;122;----;Kargasok;;Russia;2;59-03N;080-57E;;;63;59;P 29;128;----;Parabel;;Russia;2;58-42N;081-30E;;;63;63; 29;149;----;Maksimkin Jar;;Russia;2;58-38N;086-43E;;;105;; 29;203;----;Kuntiki;;Russia;2;58-27N;076-25E;;;81;; 29;209;----;Majsk;;Russia;2;57-47N;077-17E;;;100;100;P 29;224;----;Starica;;Russia;2;58-08N;080-35E;;;80;; 29;231;----;Kolpasevo;;Russia;2;58-19N;082-57E;58-18N;082-54E;76;75;P 29;241;----;Palocka;;Russia;2;58-23N;084-36E;;;81;; 29;247;----;Baturino;;Russia;2;57-45N;085-12E;;;90;; 29;253;----;Losinoborskoe;;Russia;2;58-26N;089-22E;;;142;137;P 29;263;UNII;Enisejsk;;Russia;2;58-27N;092-09E;58-27N;092-09E;78;79;P 29;274;----;Strelka;;Russia;2;58-05N;093-00E;;;89;90; 29;276;----;Molygino;;Russia;2;58-12N;094-45E;;;161;; 29;282;----;Bogucany;;Russia;2;58-23N;097-27E;58-23N;097-29E;134;133;P 29;289;----;Gonda;;Russia;2;57-51N;097-24E;;;378;; 29;313;----;Pudino;;Russia;2;57-32N;079-22E;;;93;97;P 29;328;----;Bakchar;;Russia;2;57-05N;081-55E;;;107;110;P 29;332;----;Molchanovo;;Russia;2;57-35N;083-47E;;;114;114; 29;348;----;Pervomajskoe;;Russia;2;57-04N;086-13E;;;115;114;P 29;355;----;Tutalo-Culym River;;Russia;2;57-27N;088-28E;;;140;; 29;363;----;Pirovskoe;;Russia;2;57-38N;092-16E;;;184;179; 29;367;----;Biriliussy;;Russia;2;57-08N;090-42E;;;182;; 29;393;----;Cervyanka;;Russia;2;57-40N;099-34E;57-40N;099-34E;220;220; 29;401;----;Sedelnikovo;;Russia;2;56-57N;075-18E;;;90;; 29;405;----;Kystovka;;Russia;2;56-36N;076-54E;;;90;116;P 29;418;----;Severnoe;;Russia;2;56-21N;078-21E;;;126;126;P 29;430;----;Tomsk;;Russia;2;56-30N;084-55E;;;174;139;P 29;456;----;Tjuhtet;;Russia;2;56-32N;089-19E;;;205;205; 29;464;----;Bol'Soj Uluj;;Russia;2;56-39N;090-33E;;;;231; 29;467;----;Acinsk;;Russia;2;56-17N;090-30E;;;272;; 29;471;----;Bol'Shaja Murta;;Russia;2;56-54N;093-08E;;;181;180;P 29;477;----;Suhobuzimskoe;;Russia;2;56-30N;093-17E;;;159;164; 29;481;----;Dzherzhinskoe;;Russia;2;56-51N;095-13E;;;188;188;P 29;498;----;Sitkino;;Russia;2;56-21N;098-22E;;;;221; 29;524;----;Kreschenka;;Russia;2;55-51N;080-02E;;;130;129;P 29;532;----;Kozevnikovo;;Russia;2;56-15N;084-00E;;;114;113; 29;539;----;Bolotnoe;;Russia;2;55-40N;084-24E;;;201;193; 29;540;----;Anzero-Sudzensk;;Russia;2;56-07N;086-00E;;;259;; 29;541;----;Tajga;;Russia;2;56-04N;085-37E;;;250;251; 29;548;----;Barzas;;Russia;2;55-43N;086-18E;;;208;; 29;551;----;Mariinsk;;Russia;2;56-13N;087-45E;;;134;140;P 29;552;----;Tjazin;;Russia;2;56-07N;088-31E;;;;222; 29;553;----;Bogotol;;Russia;2;56-14N;089-35E;56-14N;089-35E;291;291;P 29;557;----;Tisul;;Russia;2;55-45N;088-19E;;;212;211; 29;562;----;Kemchug;;Russia;2;56-06N;091-40E;;;330;332;P 29;563;----;Kaca;;Russia;2;56-07N;092-12E;;;;479; 29;570;----;Krasnojarsk Opytnoe Pole;;Russia;2;56-02N;092-45E;;;276;276;P 29;572;----;Emel'Janovo;;Russia;2;56-11N;092-37E;56-11N;092-37E;296;206; 29;576;----;Ujar;;Russia;2;55-48N;094-20E;;;343;375; 29;578;----;Salinskoe;;Russia;2;55-43N;093-44E;;;377;; 29;581;----;Kansk;;Russia;2;56-12N;095-38E;56-12N;095-41E;204;207;P 29;587;----;Irbejskoe;;Russia;2;55-38N;095-28E;55-38N;095-28E;251;252; 29;590;----;Novocunskoe;;Russia;2;56-09N;099-18E;;;265;; 29;594;----;Tajshet;;Russia;2;55-57N;098-00E;55-57N;098-00E;302;307;P 29;602;----;Chany;;Russia;2;55-17N;076-36E;;;113;111;P 29;605;----;Tatarsk;;Russia;2;55-12N;075-58E;;;112;112;P 29;612;----;Barabinsk;;Russia;2;55-20N;078-22E;55-22N;078-24E;120;120;P 29;613;----;Ubinskoe;;Russia;2;55-18N;079-37E;;;138;140; 29;625;----;Culym;;Russia;2;55-06N;080-58E;;;139;140; 29;626;----;Kocenevo;;Russia;2;55-02N;082-11E;;;;159; 29;631;----;Kolyvan;;Russia;2;55-18N;082-45E;;;140;137;P 29;632;----;Moskovo;;Russia;2;55-18N;083-36E;;;;215; 29;634;UNNN;Novosibirsk;;Russia;2;55-05N;082-54E;55-02N;082-54E;177;176;P 29;636;----;Toguchin;;Russia;2;55-14N;084-24E;;;171;173;P 29;642;----;Kemerovo;;Russia;2;55-14N;086-07E;;;262;260; 29;649;----;Krapivino;;Russia;2;55-00N;086-48E;;;153;151; 29;653;----;Uzur;;Russia;2;55-18N;089-49E;;;383;387;P 29;654;----;Central'Nyj Rudnik;;Russia;2;55-13N;087-39E;;;;495;P 29;662;----;Balahta;;Russia;2;55-23N;091-40E;;;;321; 29;664;----;Svetlolobovo;;Russia;2;55-06N;090-50E;;;329;; 29;675;----;Kolba;;Russia;2;55-05N;093-22E;;;477;477;P 29;676;----;Aginskoe;;Russia;2;55-15N;094-53E;;;336;337;P 29;698;UINN;Nizhneudinsk;;Russia;2;54-53N;099-02E;54-53N;099-02E;410;411;P 29;702;----;Cistoozernoje;;Russia;2;54-43N;076-43E;;;111;; 29;706;----;Kupino;;Russia;2;54-22N;077-17E;;;116;115;P 29;712;----;Zdvinsk;;Russia;2;54-42N;078-40E;;;112;113;P 29;722;----;Uzaniha;;Russia;2;54-40N;081-03E;;;175;; 29;724;----;Kochki;;Russia;2;54-18N;080-30E;;;166;164;P 29;726;----;Ordynskoe;;Russia;2;54-22N;081-57E;;;135;134;P 29;735;----;Posevnaja;;Russia;2;54-18N;083-23E;;;294;293; 29;736;----;Masljanino;;Russia;2;54-20N;084-13E;;;198;198;P 29;745;----;Gurjevsk;;Russia;2;54-20N;086-00E;;;225;; 29;752;----;Nenastnaja;;Russia;2;54-45N;088-49E;;;;1183; 29;756;----;Sira;;Russia;2;54-30N;089-56E;;;468;475; 29;759;----;Kommunar;;Russia;2;54-20N;089-17E;54-20N;089-17E;846;847;P 29;766;----;Idrinskoe;;Russia;2;54-22N;092-08E;;;281;282;P 29;789;----;Verhnjaja Gutara;;Russia;2;54-13N;096-58E;;;984;984; 29;794;----;Birjusa;;Russia;2;54-23N;097-47E;;;802;; 29;802;----;Mikhailovka;;Kazakhstan;2;53-49N;076-32E;;;;114; 29;807;----;Irtyshsk;;Kazakhstan;2;53-21N;075-27E;;;94;94;P 29;813;----;Krasnoozersk;;Russia;2;53-58N;079-14E;;;143;144; 29;814;----;Karasuk;;Russia;2;53-42N;078-04E;;;113;115;P 29;816;----;Habary;;Russia;2;53-37N;079-33E;;;;138; 29;822;----;Kamen'- Na-Obi;;Russia;2;53-49N;081-16E;;;130;129; 29;827;----;Baevo;;Russia;2;53-16N;080-46E;;;123;122;P 29;832;----;Talmenka;;Russia;2;53-49N;083-35E;;;142;144; 29;836;----;Sorokino;;Russia;2;53-45N;084-57E;;;221;; 29;837;----;Selaboliha;;Russia;2;53-24N;082-36E;;;170;; 29;838;UNBB;Barnaul;;Russia;2;53-26N;083-31E;53-20N;083-42E;252;184;P 29;839;----;Barnaul;;Russia;2;53-21N;083-49E;;;;159; 29;848;----;Togul;;Russia;2;53-28N;085-55E;;;270;272; 29;849;----;Kuzedeevo;;Russia;2;53-20N;087-10E;;;291;293; 29;854;----;Mezdurecensk;;Russia;2;53-41N;088-03E;;;242;; 29;855;----;Teba;;Russia;2;53-38N;088-34E;;;304;; 29;858;----;Neozidannij Priisk;;Russia;2;53-17N;089-10E;;;527;; 29;862;----;Hakasskaja;;Russia;2;53-46N;091-19E;53-46N;091-19E;256;256;P 29;864;----;Uybat;;Russia;2;53-43N;090-22E;;;525;525;P 29;866;----;Minusinsk;;Russia;2;53-42N;091-42E;;;;254; 29;869;----;Ermakovskoe;;Russia;2;53-18N;092-25E;;;301;298;P 29;870;----;Kuragino;;Russia;2;53-53N;092-40E;;;284;; 29;876;----;Ponomarovo;;Russia;2;53-43N;094-09E;;;445;; 29;892;----;Hadama;;Russia;2;53-57N;098-49E;;;704;705; 29;894;----;Alygdzer;;Russia;2;53-38N;098-13E;53-38N;098-13E;918;918; 29;915;----;Slavgorod;;Russia;2;52-58N;078-39E;53-58N;078-39E;125;126; 29;923;----;Rebriha;;Russia;2;53-04N;082-18E;;;214;219;P 29;937;----;Alejskaja;;Russia;2;52-31N;082-46E;52-31N;082-46E;174;175;P 29;939;----;Bijsk Zonal'Naja;;Russia;2;52-41N;084-57E;;;224;228;P 29;946;----;Kondoma;;Russia;2;52-52N;087-17E;;;354;; 29;956;----;Tastyp;;Russia;2;52-48N;089-55E;;;455;455;P 29;962;----;Beja;;Russia;2;53-03N;090-55E;;;448;469; 29;973;----;Verhni Amil;;Russia;2;53-08N;094-28E;;;765;; 29;974;----;Olen'Ja Recka;;Russia;2;52-53N;093-01E;52-53N;093-01E;1404;1404; 29;998;----;Orlik;;Russia;2;52-30N;099-49E;;;;1376; 29;999;----;Orlik Mountain Station ;;Russia;2;52-30N;099-49E;52-30N;099-49E;1570;1570; 30;014;----;Cemdalsk;;Russia;2;59-45N;103-18E;;;277;; 30;028;----;Ika;;Russia;2;59-17N;106-10E;59-19N;106-20E;352;352; 30;037;----;Nepa;;Russia;2;59-15N;108-14E;;;323;; 30;054;----;Vitim;;Russia;2;59-27N;112-35E;59-27N;112-35E;193;190;P 30;074;----;Maca;;Russia;2;59-54N;117-35E;;;162;; 30;089;----;Jikimda;;Russia;2;59-02N;121-45E;;;170;; 30;117;----;Ust'- Ilimsk;;Russia;2;58-12N;102-45E;;;402;401; 30;127;----;Tokma;;Russia;2;58-16N;105-51E;;;435;; 30;138;----;Cecujsk;;Russia;2;58-06N;108-41E;;;;245; 30;142;----;Vizirnyj;;Russia;2;58-53N;111-15E;;;;227; 30;151;----;Voroncovka;;Russia;2;58-51N;112-54E;;;201;203; 30;157;----;Mama;;Russia;2;58-19N;112-52E;58-19N;112-52E;224;224; 30;165;----;Svetli;;Russia;2;58-34N;116-00E;58-26N;115-59E;422;422; 30;173;----;Tjanja;;Russia;2;59-03N;119-48E;;;190;; 30;219;----;Maksimovo;;Russia;2;57-06N;105-00E;;;354;; 30;229;----;Verhne-Markovo;;Russia;2;57-20N;107-04E;;;;271; 30;230;UIKK;Kirensk;;Russia;2;57-46N;108-04E;57-46N;108-07E;258;259;P 30;246;----;Gorno-Cujski;;Russia;2;57-40N;111-40E;;;332;; 30;253;UIKB;Bodajbo;;Russia;2;57-51N;114-14E;57-51N;114-12E;278;275; 30;255;----;Mamakan;;Russia;2;57-48N;114-05E;;;532;; 30;263;----;Nicatka;;Russia;2;57-50N;117-40E;;;562;; 30;309;----;Bratsk;;Russia;2;56-17N;101-45E;56-04N;101-50E;489;416;P 30;317;----;Zajarsk;;Russia;2;56-12N;102-50E;;;427;; 30;320;----;Ust'- Kut;;Russia;2;56-52N;105-42E;56-48N;105-48E;672;669; 30;328;----;Orlinga;;Russia;2;56-03N;105-50E;;;338;338; 30;337;----;Kazachinsk;;Russia;2;56-19N;107-37E;56-17N;107-34E;357;362;P 30;356;----;Ulon-Makit;;Russia;2;56-22N;114-38E;;;516;; 30;364;----;Muja;;Russia;2;56-30N;115-40E;;;474;; 30;372;----;Chara;;Russia;2;56-54N;118-16E;56-55N;118-15E;711;711;P 30;374;----;Bolsaja-Leprinda;;Russia;2;56-39N;117-34E;;;1000;; 30;379;----;Katugino;;Russia;2;56-00N;119-27E;;;996;; 30;385;----;Ust'- Njukzha;;Russia;2;56-35N;121-29E;56-35N;121-29E;426;426;P 30;393;UELL;Cul'Man;;Russia;2;56-50N;124-52E;56-50N;124-52E;859;858;P 30;405;----;Tanguj;;Russia;2;55-23N;101-02E;;;425;423;P 30;413;----;Jasacnaja;;Russia;2;55-50N;104-14E;;;331;; 30;424;----;Golovskoe;;Russia;2;55-29N;105-29E;;;172;372; 30;432;----;Goujokit;;Russia;2;55-43N;109-04E;;;676;; 30;433;----;Nizhneangarsk;;Russia;2;55-47N;109-33E;55-47N;109-33E;475;487;P 30;437;----;Karam;;Russia;2;55-09N;107-37E;;;497;; 30;439;----;Tompa;;Russia;2;55-07N;109-45E;;;458;465; 30;455;----;Uakit;;Russia;2;55-28N;113-37E;;;1097;1097;P 30;457;----;Baunt;;Russia;2;55-16N;113-08E;;;;1078; 30;461;----;Tilisma;;Russia;2;55-48N;115-26E;;;830;; 30;469;----;Kalakan;;Russia;2;55-07N;116-46E;55-07N;116-45E;613;613;P 30;471;----;Srednij Kalar;;Russia;2;55-52N;117-22E;;;754;750; 30;484;----;Srednjaja Olekma;;Russia;2;55-26N;120-40E;;;531;; 30;493;----;Nagornyj;;Russia;2;55-58N;124-53E;;;864;861;P 30;497;----;Ust-Urkima;;Russia;2;55-18N;123-10E;;;522;; 30;499;----;Tynda;;Russia;2;55-11N;124-40E;;;531;528;P 30;504;----;Tulun;;Russia;2;54-36N;100-38E;;;522;522;P 30;507;----;Ikej;;Russia;2;54-11N;100-05E;;;527;527; 30;514;----;Ust-Uda;;Russia;2;54-10N;103-01E;;;420;427;P 30;521;----;Zhigalovo;;Russia;2;54-48N;105-13E;54-48N;105-10E;428;426;P 30;526;----;Tirka;;Russia;2;54-30N;107-08E;54-30N;107-08E;650;650; 30;536;----;Davsa;;Russia;2;54-21N;109-31E;;;469;; 30;537;----;Solnethnaya;;Russia;2;54-02N;108-16E;54-02N;108-16E;465;464; 30;542;----;Tassa;;Russia;2;54-51N;111-09E;;;563;563;P 30;547;----;Kurumkan;;Russia;2;54-19N;110-19E;;;509;; 30;549;----;Karaftit;;Russia;2;54-12N;111-57E;;;1302;1302;P 30;554;----;Bagdarin;;Russia;2;54-28N;113-35E;54-28N;113-35E;995;903;P 30;555;----;Troickij Priisk;;Russia;2;54-37N;113-08E;;;;1314; 30;565;----;Ust-Karenga;;Russia;2;54-27N;116-31E;54-27N;116-31E;686;686; 30;567;----;Bugarihta;;Russia;2;54-03N;115-01E;;;738;; 30;576;----;Tupik;;Russia;2;54-26N;119-54E;;;644;644; 30;603;----;Zima;;Russia;2;53-56N;102-03E;53-56N;102-03E;458;458;P 30;605;----;Saram;;Russia;2;53-20N;101-11E;;;600;; 30;606;----;Zalari;;Russia;2;53-36N;102-32E;;;450;; 30;612;----;Balagansk;;Russia;2;54-00N;103-04E;54-00N;103-03E;429;427;P 30;617;----;Ceremhovo;;Russia;2;53-10N;103-05E;;;598;; 30;618;----;Bohan;;Russia;2;53-08N;103-46E;;;446;446; 30;622;----;Kacug;;Russia;2;53-58N;105-54E;53-58N;105-52E;533;533;P 30;627;----;Bajandaj;;Russia;2;53-06N;105-32E;;;761;762;P 30;632;----;Bolsoj Uskan Island;;Russia;2;53-51N;108-36E;;;460;; 30;635;----;Ust'- Barguzin;;Russia;2;53-25N;109-01E;53-26N;108-59E;457;461;P 30;636;----;Barguzin;;Russia;2;53-37N;109-38E;53-37N;109-38E;486;489; 30;637;----;Huzir;;Russia;2;53-12N;107-20E;;;462;; 30;638;----;Maksimiha;;Russia;2;53-16N;108-45E;;;475;; 30;649;----;Ust-Zaza;;Russia;2;53-11N;111-43E;;;973;; 30;650;----;Romanovka;;Russia;2;53-12N;112-47E;53-13N;112-46E;923;923;P 30;651;----;Bolsoj Amalat;;Russia;2;53-55N;113-25E;;;935;; 30;655;----;Ingur;;Russia;2;53-35N;113-46E;;;810;; 30;664;----;Tungokocen;;Russia;2;53-32N;115-37E;53-32N;115-37E;812;811;P 30;667;----;Kiker;;Russia;2;53-10N;115-50E;;;596;; 30;669;----;Zilovo;;Russia;2;53-04N;117-29E;53-04N;117-29E;707;708;P 30;673;----;Mogoca;;Russia;2;53-45N;119-44E;53-44N;119-47E;619;625;P 30;675;----;Ksen'Evskaja;;Russia;2;53-33N;118-43E;;;582;582; 30;679;----;Gorbica;;Russia;2;53-06N;119-13E;;;388;384; 30;682;----;Amazar;;Russia;2;53-52N;120-52E;;;473;472; 30;683;----;Erofej Pavlovic;;Russia;2;53-58N;121-56E;53-58N;121-56E;524;522;P 30;686;----;Ignasino;;Russia;2;53-28N;122-24E;;;295;295; 30;688;----;Pokrovka;;Russia;2;53-21N;121-33E;53-20N;121-33E;315;314; 30;692;----;Skovorodino;;Russia;2;54-00N;123-58E;54-00N;123-58E;400;398;P 30;695;----;Dzalinda;;Russia;2;53-28N;123-54E;;;267;266;P 30;703;----;Inga;;Russia;2;52-58N;101-59E;52-58N;101-59E;543;543;P 30;710;UIII;Irkutsk;;Russia;2;52-16N;104-19E;52-22N;104-11E;513;469;P 30;712;----;Usolje-Sibirskoje;;Russia;2;52-47N;103-38E;;;445;; 30;713;UIIO;Ust'Ordynskij;;Russia;2;52-49N;104-46E;;;525;526; 30;714;----;Kheyta-In-Irkut;;Russia;2;52-33N;103-03E;;;759;; 30;715;----;Angarsk;;Russia;2;52-29N;103-51E;52-29N;103-51E;450;437; 30;726;----;Suhaja;;Russia;2;52-34N;107-08E;;;461;461; 30;727;----;Bolsoje-Goloustnoj;;Russia;2;52-02N;105-24E;;;461;; 30;729;----;Kabansk;;Russia;2;52-03N;106-39E;52-03N;106-39E;469;467; 30;731;----;Gorjacinsk;;Russia;2;52-59N;108-17E;52-59N;108-17E;486;487;P 30;739;UIUH;Horinsk;;Russia;2;52-10N;109-47E;52-10N;109-46E;666;666;P 30;741;----;Zamokta;;Russia;2;52-46N;109-58E;;;1292;1286;P 30;745;----;Sosnovo-Ozerskoe;;Russia;2;52-32N;111-33E;52-32N;111-33E;952;952;P 30;751;----;Telemba;;Russia;2;52-44N;113-16E;;;929;; 30;757;----;Beklemisevo;;Russia;2;52-07N;112-40E;;;968;; 30;758;UIAA;Chita;;Russia;2;52-05N;113-29E;52-01N;113-20E;685;671;P 30;764;----;Usugli;;Russia;2;52-39N;115-10E;;;646;646;P 30;765;----;Zjul'Zja;;Russia;2;52-33N;116-12E;;;526;533; 30;766;----;Chernyshevsk;;Russia;2;52-32N;117-00E;;;539;539; 30;768;----;Nercinsk;;Russia;2;52-00N;116-32E;;;479;482; 30;772;----;Ust'- Kara;;Russia;2;52-42N;118-48E;52-42N;118-48E;404;407; 30;777;----;Sretensk;;Russia;2;52-14N;117-42E;52-16N;117-42E;528;525; 30;781;----;Urjupino;;Russia;2;52-45N;120-02E;;;370;370;P 30;802;----;Mondy;;Russia;2;51-41N;100-59E;51-41N;100-59E;1303;1304;P 30;803;----;Bago-Gorhon;;Russia;2;51-42N;102-27E;;;889;; 30;806;----;Kyren;;Russia;2;51-41N;102-10E;;;758;; 30;811;----;Tunka;;Russia;2;51-44N;102-32E;;;722;721; 30;812;----;Sljudjanka;;Russia;2;51-39N;103-40E;51-39N;103-44E;471;464; 30;814;----;Kultuk;;Russia;2;51-44N;103-42E;;;472;; 30;815;----;Hamar-Daban;;Russia;2;51-32N;103-36E;;;1442;1442; 30;818;----;Unknown;;Russia;2;51-10N;103-40E;;;481;; 30;822;----;Babuskin;;Russia;2;51-43N;105-51E;51-43N;105-52E;469;467; 30;823;UIUU;Ulan-Ude;;Russia;2;51-50N;107-36E;51-48N;107-26E;510;515;P 30;824;----;Tanhoj;;Russia;2;51-34N;105-07E;;;470;472; 30;829;----;Novoselenginsk;;Russia;2;51-06N;106-39E;51-06N;106-39E;559;556;P 30;837;----;Muhorsibir;;Russia;2;51-01N;107-50E;;;733;; 30;838;----;Petrovskij Zavod;;Russia;2;51-19N;108-52E;51-17N;108-51E;800;806;P 30;843;----;Mogzon;;Russia;2;51-44N;112-00E;;;902;907; 30;844;----;Hilok;;Russia;2;51-21N;110-28E;51-21N;110-30E;808;802;P 30;845;----;Haragun;;Russia;2;51-33N;111-10E;;;858;; 30;846;----;Ulety;;Russia;2;51-21N;112-28E;;;741;743;P 30;849;----;Nikolajevskoe;;Russia;2;51-03N;111-46E;51-03N;111-46E;817;841; 30;853;----;Karymskaja;;Russia;2;51-38N;114-19E;;;616;616; 30;856;----;Sedlovaja;;Russia;2;51-29N;114-32E;51-29N;114-33E;881;877; 30;858;----;Kurot-Darasua;;Russia;2;51-12N;113-43E;51-12N;113-43E;805;797; 30;859;----;Aginskoe;;Russia;2;51-06N;114-31E;;;678;681;P 30;862;----;Shilka;;Russia;2;51-52N;116-02E;;;597;597;P 30;866;----;Balej;;Russia;2;51-35N;116-38E;;;649;; 30;874;----;Selopugino;;Russia;2;51-39N;117-34E;;;715;715; 30;875;----;Tajna;;Russia;2;51-35N;118-28E;51-35N;118-28E;698;698; 30;879;----;Nerchinskij Zavod;;Russia;2;51-19N;119-37E;51-19N;119-37E;619;619;P 30;911;----;Sanaga;;Russia;2;50-44N;102-50E;;;1170;; 30;915;----;Cakir;;Russia;2;50-25N;103-37E;50-25N;103-37E;989;984; 30;924;----;Petropavlovka;;Russia;2;50-38N;105-19E;;;684;; 30;925;----;Kjahta;;Russia;2;50-22N;106-27E;50-22N;106-27E;801;797;P 30;934;----;Bicura;;Russia;2;50-36N;107-35E;;;643;638; 30;935;----;Krasnyj Chikoj;;Russia;2;50-22N;108-45E;50-22N;108-45E;770;771;P 30;938;----;Menza;;Russia;2;49-26N;108-54E;;;940;; 30;944;----;Ceremhovo;;Russia;2;50-34N;110-12E;;;885;; 30;947;----;Sumilovka;;Russia;2;50-04N;110-09E;;;;1154; 30;948;----;Grjazi;;Russia;2;50-01N;111-11E;49-30N;111-35E;1234;1097; 30;949;----;Kyra;;Russia;2;49-34N;111-58E;;;908;908;P 30;954;----;Duldurga;;Russia;2;50-38N;113-35E;50-41N;113-35E;811;752; 30;957;----;Aksa;;Russia;2;50-16N;113-16E;50-17N;113-17E;734;732;P 30;961;----;Olovjannaja;;Russia;2;50-57N;115-35E;;;642;640; 30;964;----;Kubuhaj;;Russia;2;50-30N;114-49E;;;679;; 30;965;----;Borzja;;Russia;2;50-24N;116-31E;50-23N;116-31E;684;676;P 30;967;----;Solov'Evsk;;Russia;2;49-54N;115-45E;;;623;623;P 30;968;----;Haranor;;Russia;2;50-06N;116-40E;;;705;; 30;971;----;Aleksandrovskij Zavod;;Russia;2;50-55N;117-56E;;;807;807; 30;972;----;Dono;;Russia;2;50-53N;118-35E;;;694;694; 30;975;----;Priargunsk;;Russia;2;50-24N;119-04E;50-24N;119-07E;517;521;P 30;978;----;Kajlastuj;;Russia;2;49-50N;118-23E;;;550;550; 31;004;----;Aldan;;Russia;2;58-37N;125-22E;58-37N;125-22E;682;79;P 31;005;----;Tommot;;Russia;2;58-57N;126-18E;;;283;; 31;011;----;Bujaga;;Russia;2;59-39N;127-10E;;;278;; 31;016;----;Ugino;;Russia;2;58-40N;128-30E;;;130;; 31;041;----;Ust-Mil;;Russia;2;59-40N;133-05E;;;179;; 31;054;----;Ust'- Judoma;;Russia;2;59-11N;135-09E;;;212;212; 31;062;----;Jugarjonok;;Russia;2;59-46N;137-43E;;;381;; 31;067;----;Kurun-Urjakah;;Russia;2;58-39N;137-13E;;;457;; 31;083;----;Stary Hejdzan;;Russia;2;59-58N;144-45E;;;121;; 31;087;----;Ulja;;Russia;2;58-48N;141-40E;58-48N;141-40E;4;4; 31;088;----;Ohotsk;;Russia;2;59-22N;143-12E;59-22N;143-12E;6;6;P 31;092;----;Talon;;Russia;2;59-48N;148-50E;;;19;; 31;097;----;Uski;;Russia;2;59-11N;146-20E;;;17;; 31;123;----;Cjul'Bju;;Russia;2;57-46N;130-54E;;;266;255; 31;137;----;Toko;;Russia;2;56-17N;131-08E;56-10N;131-00E;858;850;P 31;152;----;Nelkan;;Russia;2;57-40N;136-09E;;;305;; 31;158;----;Batomga;;Russia;2;56-39N;136-21E;;;496;; 31;168;----;Ajan;;Russia;2;56-27N;138-09E;56-27N;138-09E;9;8;P 31;174;----;Bol'Soj Santar;;Russia;2;54-50N;137-32E;54-52N;137-30E;17;21; 31;199;----;Unaha;;Russia;2;55-02N;126-48E;;;453;448; 31;235;----;Jana;;Russia;2;55-29N;134-20E;;;318;; 31;253;----;Bomnak;;Russia;2;54-43N;128-56E;;;357;357;P 31;263;----;Loksak;;Russia;2;54-44N;130-27E;;;464;464; 31;286;----;Cumikan;;Russia;2;54-43N;135-19E;54-42N;135-17E;5;9; 31;295;----;Magdagaci;;Russia;2;53-28N;125-49E;;;372;370;P 31;299;----;Tygda;;Russia;2;53-06N;126-21E;;;;314; 31;300;----;Zeja;;Russia;2;53-42N;127-18E;53-45N;127-14E;232;229;P 31;311;----;Ogoron;;Russia;2;53-58N;129-04E;;;416;405; 31;318;----;Nora;;Russia;2;53-04N;130-01E;;;;254; 31;325;----;Sevli;;Russia;2;53-31N;132-55E;;;442;; 31;329;UHBP;Ekimchan;;Russia;2;53-04N;132-59E;53-04N;132-56E;543;542;P 31;331;----;Bolodek;;Russia;2;53-43N;133-09E;;;280;; 31;338;----;Selemdza;;Russia;2;53-08N;133-58E;;;682;; 31;346;----;Tugur;;Russia;2;53-51N;136-52E;;;52;; 31;348;----;Burukan;;Russia;2;53-03N;136-02E;;;154;153;P 31;362;----;Aleksandra;;Russia;2;54-17N;139-47E;;;9;; 31;364;----;Kulci;;Russia;2;53-34N;139-39E;;;128;; 31;369;----;Nikolaevsk-Na-Amure;;Russia;2;53-09N;140-42E;53-09N;140-42E;68;68;P 31;371;----;Chernjaevo;;Russia;2;52-47N;126-00E;;;212;210;P 31;373;----;Oktjabr'Skij Priisk;;Russia;2;53-00N;128-39E;;;330;332; 31;377;----;Muhino;;Russia;2;52-16N;127-13E;;;326;; 31;384;----;Gar;;Russia;2;52-34N;129-04E;;;245;246;P 31;388;----;Norsk;;Russia;2;52-21N;129-55E;52-21N;129-55E;207;208;P 31;392;----;Stojba;;Russia;2;52-48N;131-43E;;;358;359; 31;394;----;Selemdzinskoe;;Russia;2;52-35N;131-08E;;;;300; 31;397;----;Byssa;;Russia;2;52-22N;131-18E;;;;293; 31;416;----;Im Poliny Osipenko;;Russia;2;52-25N;136-30E;52-25N;136-30E;73;73;P 31;418;----;Veselaja Gorka;;Russia;2;52-17N;135-48E;;;201;201;P 31;421;----;Guga;;Russia;2;52-42N;137-32E;;;50;60;P 31;423;----;Udinskoje;;Russia;2;52-54N;138-52E;;;15;; 31;432;----;Voskresenskoje;;Russia;2;52-52N;140-00E;;;25;; 31;436;----;Uarki;;Russia;2;52-31N;141-12E;;;14;; 31;437;----;Somnitelnij-Priisk;;Russia;2;52-10N;139-04E;;;220;; 31;439;----;Bogorodskoe;;Russia;2;52-23N;140-28E;52-23N;140-28E;31;35;P 31;441;----;Usakovo;;Russia;2;51-54N;126-35E;;;159;; 31;442;----;Simanovsk;;Russia;2;51-59N;127-39E;;;276;281;P 31;443;----;Mazanovo;;Russia;2;51-38N;128-49E;;;163;161; 31;445;----;Svobodnyj;;Russia;2;51-27N;128-07E;51-23N;128-07E;197;197;P 31;459;----;Verhnjaja Tom;;Russia;2;51-21N;130-26E;;;260;261;P 31;469;----;Cegdomyn;;Russia;2;51-10N;132-57E;;;;374; 31;474;----;Ust'- Umal'Ta;;Russia;2;51-38N;133-19E;;;382;384;P 31;478;----;Sofijskij Priisk;;Russia;2;52-16N;133-59E;;;898;902;P 31;482;----;Duki;;Russia;2;51-43N;135-56E;;;131;132;P 31;484;----;Hularin;;Russia;2;51-25N;135-05E;;;269;269;P 31;489;----;Gorin;;Russia;2;51-12N;136-48E;;;92;92; 31;497;----;Baktor;;Russia;2;51-08N;137-25E;;;35;; 31;502;----;Mariinskoje;;Russia;2;51-43N;140-19E;;;20;; 31;504;----;Suhanovka;;Russia;2;51-21N;139-06E;;;63;; 31;509;----;De-Kastri;;Russia;2;51-29N;140-47E;;;35;36; 31;510;----;Blagovescensk;;Russia;2;50-15N;127-34E;50-16N;127-30E;137;132;P 31;511;----;Sergejevka;;Russia;2;50-47N;127-18E;;;145;; 31;513;----;Belogorsk;;Russia;2;50-55N;128-28E;;;178;178; 31;521;----;Bratoljubovka;;Russia;2;50-47N;129-20E;;;231;227;P 31;527;----;Zavitaja;;Russia;2;50-07N;129-28E;;;242;241;P 31;532;----;Cekunda;;Russia;2;50-52N;132-15E;50-49N;132-10E;273;272;P 31;534;----;Sektagli;;Russia;2;50-26N;131-01E;;;231;230;P 31;538;----;Sutur;;Russia;2;50-04N;132-08E;50-04N;132-08E;349;347;P 31;548;----;Verhovje Urmi;;Russia;2;50-01N;133-35E;;;533;; 31;550;----;Amursk;;Russia;2;50-16N;136-55E;;;24;; 31;561;----;Komsomolsk-On-Amur;;Russia;2;50-36N;137-02E;50-36N;137-02E;19;19; 31;562;----;Niznetambovskoe;;Russia;2;50-56N;138-12E;50-56N;138-12E;60;64; 31;566;----;Segzema;;Russia;2;50-20N;138-28E;;;193;; 31;573;----;Sizeman;;Russia;2;50-44N;140-26E;;;5;; 31;583;----;Malinovka;;Russia;2;49-47N;129-55E;;;;116; 31;587;----;Pojarkovo;;Russia;2;49-37N;128-39E;;;117;115;P 31;594;----;Arhara;;Russia;2;49-25N;130-05E;49-25N;130-05E;135;135;P 31;618;----;Bira;;Russia;2;49-01N;132-28E;;;;154; 31;624;----;Urmi;;Russia;2;49-24N;133-14E;;;198;198; 31;632;----;Kur;;Russia;2;49-56N;134-38E;;;266;283;P 31;636;----;Neran;;Russia;2;49-33N;134-44E;;;226;222; 31;647;----;Litovko;;Russia;2;49-17N;135-11E;;;71;; 31;655;UHHO;Troickoe;;Russia;2;49-27N;136-34E;49-27N;136-34E;29;33;P 31;661;----;Verhni Nergen;;Russia;2;49-52N;136-46E;;;64;; 31;677;----;Solekul;;Russia;2;49-01N;138-45E;;;894;; 31;683;----;Tumnin;;Russia;2;49-40N;140-07E;49-40N;140-07E;58;58; 31;702;----;Obluc'E;;Russia;2;49-00N;131-05E;;;257;257;P 31;703;----;Birakan;;Russia;2;49-00N;131-44E;;;;267; 31;707;----;Ekaterino-Nikol'Skoe;;Russia;2;47-44N;130-58E;47-44N;130-58E;74;73;P 31;710;----;Leninskoe;;Russia;2;47-57N;132-37E;;;56;56; 31;713;----;Birobidzhan;;Russia;2;48-44N;132-57E;48-47N;132-55E;76;80;P 31;725;----;Smidovich;;Russia;2;48-37N;133-50E;;;53;52;P 31;733;----;Elabuga;;Russia;2;48-49N;135-53E;;;41;58; 31;735;UHHH;Habarovsk;;Russia;2;48-31N;135-10E;48-31N;135-10E;72;76;P 31;736;----;Habarovsk;;Russia;2;48-32N;135-14E;48-32N;135-14E;72;72; 31;754;----;Tivjaku;;Russia;2;48-36N;137-03E;;;403;403;P 31;766;----;Ioli;;Russia;2;48-39N;138-59E;;;382;; 31;770;----;Sovetskaja Gavan;;Russia;2;48-58N;140-18E;49-00N;140-16E;22;22; 31;786;----;Vjazemskaja;;Russia;2;47-33N;134-49E;;;84;89; 31;788;----;Lermontovka;;Russia;2;47-09N;134-20E;;;;76; 31;790;----;Verino;;Russia;2;47-59N;135-05E;;;85;; 31;792;----;Bicevaja;;Russia;2;47-46N;135-38E;;;;105; 31;801;----;Gvasjugi;;Russia;2;47-40N;136-11E;47-40N;136-11E;180;180;P 31;823;----;Grossevichi;;Russia;2;47-58N;139-32E;47-58N;139-32E;3;3;P 31;825;----;Agzu;;Russia;2;47-36N;138-24E;;;160;165;P 31;829;----;Zolotoj;;Russia;2;47-19N;138-59E;47-19N;138-59E;26;26;P 31;832;----;Bikin;;Russia;2;46-48N;134-16E;46-48N;134-16E;62;68; 31;845;----;Krasnyj Jar;;Russia;2;46-32N;135-19E;;;130;130;P 31;851;----;Gamcanza;;Russia;2;46-41N;136-16E;;;244;; 31;866;----;Sosunovo;;Russia;2;46-32N;138-20E;;;4;4;P 31;869;----;Khucin;;Russia;2;46-04N;137-53E;;;10;; 31;873;----;Dal'Nerechensk;;Russia;2;45-52N;133-44E;45-56N;133-43E;107;101;P 31;878;----;Kirovskij;;Russia;2;45-05N;133-32E;;;95;98;P 31;884;----;Malinovo;;Russia;2;45-25N;134-16E;;;139;139; 31;895;----;Ust-Kolumbe;;Russia;2;45-16N;135-30E;45-16N;135-30E;335;335; 31;909;----;Ternej;;Russia;2;45-00N;136-36E;45-03N;136-37E;68;68;P 31;913;----;Turij Rog;;Russia;2;45-13N;131-59E;45-14N;131-59E;82;88; 31;915;----;Progranichnyj;;Russia;2;44-24N;131-23E;44-24N;131-23E;211;211;P 31;917;----;Poltavka;;Russia;2;44-02N;131-19E;;;109;109;P 31;921;----;Astrahanka;;Russia;2;44-43N;132-04E;;;75;78;P 31;924;----;Hkorol;;Russia;2;44-26N;132-04E;;;;128; 31;931;----;Svijagino;;Russia;2;44-48N;133-05E;44-48N;133-05E;99;99; 31;935;----;Jakovlevka;;Russia;2;44-25N;133-29E;;;;154; 31;939;----;Cuguevka;;Russia;2;44-09N;133-52E;44-09N;133-52E;258;259; 31;942;----;Zuravlevka;;Russia;2;44-45N;134-28E;;;170;; 31;943;----;Zavetnoje;;Russia;2;44-42N;134-42E;;;299;; 31;958;----;Bogopol;;Russia;2;44-15N;135-27E;;;;65; 31;959;----;Rudnaja Pristan;;Russia;2;44-22N;135-51E;;;34;34;P 31;960;UHWW;Vladivostok;;Russia;2;43-07N;131-56E;43-06N;131-54E;184;183;P 31;961;----;Pokrovka;;Russia;2;43-52N;131-43E;;;61;; 31;969;----;Pos'Et;;Russia;2;42-39N;130-48E;42-39N;130-48E;36;35;P 31;970;----;Nahodka;;Russia;2;42-48N;132-52E;;;121;; 31;977;----;Vladivostok Sad Gorod ;;Russia;2;43-16N;132-03E;43-16N;132-03E;82;82; 31;981;----;Anucino;;Russia;2;43-58N;133-04E;;;190;188;P 31;987;----;Partizansk;;Russia;2;43-09N;133-01E;;;202;208;P 31;989;----;Preobrazhenie;;Russia;2;42-54N;133-54E;42-54N;133-54E;34;43;P 31;994;----;Bereznjaki;;Russia;2;43-35N;134-10E;;;503;509; 31;996;----;Margaritovo;;Russia;2;43-26N;134-46E;;;25;; 32;004;----;Rybnovsk;;Russia;2;53-15N;141-55E;;;4;; 32;010;----;Oha;;Russia;2;53-34N;142-56E;;;8;; 32;013;----;Kajgan;;Russia;2;53-34N;142-45E;;;4;; 32;027;----;Pogibi;;Russia;2;52-13N;141-38E;52-13N;141-38E;7;6;P 32;053;----;Nogliki;;Russia;2;51-55N;143-08E;;;34;34;P 32;057;----;Ado-Tymovo;;Russia;2;51-08N;142-40E;;;65;66; 32;059;----;Kongi;;Russia;2;51-06N;143-33E;;;15;; 32;061;----;Aleksandrovsk-Sahalinskij;;Russia;2;50-54N;142-10E;50-54N;142-10E;31;31;P 32;069;----;Pil'Vo;;Russia;2;50-03N;142-10E;50-03N;142-10E;4;4;P 32;071;----;Tymovskoe;;Russia;2;50-44N;142-43E;50-42N;142-43E;95;95; 32;076;----;Progranichnoe;;Russia;2;50-24N;143-46E;;;8;8;P 32;077;----;Onor;;Russia;2;50-14N;142-35E;;;;181; 32;088;----;Uglegorsk;;Russia;2;49-04N;142-02E;;;53;43; 32;098;----;Poronajsk;;Russia;2;49-13N;143-06E;49-13N;143-06E;4;8;P 32;116;----;Makarov;;Russia;2;48-39N;142-51E;;;38;; 32;121;----;Ilyinskiy;;Russia;2;47-59N;142-12E;47-59N;142-12E;19;18; 32;128;----;Holmsk;;Russia;2;47-03N;142-03E;;;44;44; 32;133;----;Dolinsk;;Russia;2;47-20N;142-48E;;;42;11; 32;150;UHSS;Yuzhno-Sakhalinsk;;Russia;2;46-57N;142-43E;46-56N;142-44E;31;24;P 32;156;----;Korsakov;;Russia;2;46-38N;142-51E;;;34;; 32;158;----;Juznoje Light House ;;Russia;2;46-13N;143-27E;;;21;; 32;165;----;Juzhno-Kuril'Sk;;Russia;2;44-01N;145-52E;44-02N;145-51E;40;49;P 32;166;----;Malo-Kurilskoje;;Russia;2;43-45N;146-40E;;;65;; 32;186;----;Urup;;Russia;2;46-12N;150-30E;46-12N;150-30E;70;76;P 32;195;----;Simusir;;Russia;2;46-51N;151-52E;;;26;25;P 32;207;----;Matua;;Russia;2;48-04N;153-13E;48-03N;153-15E;68;58; 32;213;----;Cape Lopatka;;Russia;2;50-52N;156-40E;;;48;; 32;215;----;Severo-Kuril'Sk;;Russia;2;50-41N;156-08E;50-42N;156-14E;23;23; 32;252;----;Ust'- Vojampolka;;Russia;2;58-30N;159-10E;;;7;7; 32;287;----;Ust-Hajrjuzovo;;Russia;2;57-04N;156-50E;57-06N;156-45E;8;3; 32;389;----;Kljuchi;;Russia;2;56-19N;160-50E;59-19N;160-50E;28;29;P 32;408;----;Ust'Kamchatsk;;Russia;2;56-13N;162-43E;56-13N;162-28E;27;27;P 32;411;----;Ica;;Russia;2;55-35N;155-35E;;;4;6;P 32;447;----;Dolinovka;;Russia;2;55-07N;159-04E;;;100;; 32;509;----;Semjachik;;Russia;2;54-07N;159-59E;54-05N;159-57E;26;27;P 32;519;----;Storoz Bay;;Russia;2;54-36N;161-10E;;;15;; 32;540;UHPP;Petropavlovsk-Kamchatskij;;Russia;2;53-05N;158-35E;52-58N;158-45E;24;84; 32;562;----;Bol'Sheretskiy;;Russia;2;52-56N;156-34E;;;27;; 32;583;----;Petropavlovsk-Kamchatskij;;Russia;2;52-59N;158-39E;;;;24;P 32;594;----;Ozernaja;;Russia;2;51-29N;156-29E;;;29;28;P 32;596;----;Hodutka;;Russia;2;51-47N;158-02E;;;18;; 32;618;----;Nikol'Skoe;;Russia;2;55-12N;165-59E;55-12N;165-59E;6;18;P 33;008;----;Brest;;Belarus;6;52-07N;023-41E;52-07N;023-41E;144;146;P 33;019;----;Pinsk;;Belarus;6;52-07N;026-07E;52-07N;026-08E;144;142;P 33;027;----;Zitkovici;;Belarus;6;52-13N;027-52E;;;138;137; 33;036;----;Mozyr;;Belarus;6;51-57N;029-10E;52-02N;029-11E;173;170;P 33;038;----;Vasilevici;;Belarus;6;52-15N;029-50E;;;;142; 33;041;----;Gomel';;Belarus;6;52-24N;030-57E;52-27N;031-00E;127;126;P 33;049;----;Semenovka;;Ukraine;6;52-11N;032-35E;;;160;161; 33;058;----;Druzhba;;Ukraine;6;52-03N;033-57E;;;190;190; 33;075;----;Pnevno;;Ukraine;6;51-40N;025-16E;;;152;; 33;088;----;Sarny;;Ukraine;6;51-17N;026-37E;;;154;156;P 33;105;----;Lel'Oiov;;Belarus;6;51-47N;028-20E;;;;141; 33;135;----;Chernihiv;;Ukraine;6;51-28N;031-15E;51-29N;031-17E;139;141;P 33;136;----;Volskovtsky;;Ukraine;6;51-34N;031-58E;;;143;; 33;156;----;Glukhov;;Ukraine;6;51-41N;033-55E;;;180;; 33;173;----;Kovel;;Ukraine;6;51-13N;024-41E;51-13N;024-41E;173;174; 33;177;----;Volodymyr-Volyns'Kyi;;Ukraine;6;50-50N;024-19E;;;193;194;P 33;187;----;Luts'K;;Ukraine;6;50-42N;025-30E;;;233;232; 33;213;----;Ovruch;;Ukraine;6;51-19N;028-47E;;;168;170; 33;215;----;Korosten;;Ukraine;6;50-57N;028-39E;;;189;; 33;228;----;Teteriv;;Ukraine;6;50-42N;029-35E;;;132;132; 33;231;----;Chornobyl;;Ukraine;6;51-17N;030-14E;;;123;127; 33;246;----;Nizhyn;;Ukraine;6;51-03N;031-54E;;;124;126;P 33;261;----;Konotop;;Ukraine;6;51-14N;033-12E;;;144;149;P 33;268;----;Romny;;Ukraine;6;50-46N;033-27E;;;168;169; 33;275;----;Sumy;;Ukraine;6;50-51N;034-40E;;;180;181;P 33;287;----;Rava-Rus'Ka;;Ukraine;6;50-15N;023-38E;;;252;251; 33;288;----;Kamenka-Bugskaya;;Ukraine;6;50-06N;024-21E;;;228;; 33;297;----;Brody;;Ukraine;6;50-06N;025-09E;;;227;228; 33;301;UKLR;Rivne;;Ukraine;6;50-35N;026-08E;;;231;; 33;312;----;Novohrad-Volyns'Kyi;;Ukraine;6;50-36N;027-38E;;;216;218; 33;317;----;Shepetivka;;Ukraine;6;50-10N;027-02E;50-10N;027-03E;277;278;P 33;325;----;Zhytomyr;;Ukraine;6;50-14N;028-44E;;;219;224;P 33;339;----;Fastov;;Ukraine;6;50-05N;029-55E;;;209;; 33;345;UKKK;Kyiv;;Ukraine;6;50-24N;030-34E;50-24N;030-27E;166;167;P 33;347;UKBB;Boryspil;;Ukraine;6;50-20N;030-58E;;;121;122; 33;356;----;Yahotyn;;Ukraine;6;50-13N;031-48E;;;125;128; 33;362;----;Priluky;;Ukraine;6;50-35N;032-23E;;;132;133; 33;376;----;Hadiach;;Ukraine;6;50-22N;033-59E;;;154;154; 33;377;----;Lubny;;Ukraine;6;50-00N;033-01E;;;156;158;P 33;382;----;Lebedin;;Ukraine;6;50-35N;034-29E;;;142;; 33;391;----;Mostiska;;Ukraine;6;49-48N;023-09E;;;216;; 33;392;----;Yavorov;;Ukraine;6;49-56N;023-23E;;;229;; 33;393;UKLL;L'Viv;;Ukraine;6;49-49N;023-57E;49-49N;023-57E;319;323;P 33;398;----;Drohobych;;Ukraine;6;49-21N;023-31E;;;275;276; 33;409;----;Berezhany;;Ukraine;6;49-26N;024-57E;;;303;304; 33;415;----;Ternopil;;Ukraine;6;49-32N;025-40E;;;327;329;P 33;421;----;Yampol;;Ukraine;6;49-58N;026-15E;;;282;; 33;429;----;Khmel'Nyts'Kyi;;Ukraine;6;49-26N;026-59E;;;350;350;P 33;446;----;Bilopillja;;Ukraine;6;49-50N;028-53E;;;257;258; 33;464;----;Bila Tserkva;;Ukraine;6;49-45N;030-07E;;;179;180; 33;466;----;Myronivka;;Ukraine;6;49-40N;031-00E;;;151;153;P 33;484;----;Zolotonosha;;Ukraine;6;49-41N;032-31E;;;94;96; 33;487;----;Cherkasy;;Ukraine;6;49-25N;032-03E;;;106;107; 33;495;----;Veselyi Podil;;Ukraine;6;49-37N;033-16E;;;96;96; 33;506;----;Poltava;;Ukraine;6;49-36N;034-33E;49-36N;034-33E;160;160;P 33;514;----;Velikiy Berezny;;Ukraine;6;48-54N;022-28E;;;195;; 33;515;----;Skole;;Ukraine;6;49-02N;023-31E;;;549;; 33;517;----;Perechin;;Ukraine;6;48-44N;022-28E;;;198;; 33;524;----;Kalush;;Ukraine;6;49-01N;024-22E;;;285;; 33;526;----;Ivano-Frankivs'K;;Ukraine;6;48-58N;024-24E;48-54N;024-42E;275;280;P 33;536;----;Chortkiv;;Ukraine;6;49-01N;025-48E;;;320;318; 33;548;----;Kamianets'- Podil'Skyi;;Ukraine;6;48-39N;026-40E;;;217;222; 33;557;----;Nova Ushytsia;;Ukraine;6;48-51N;027-16E;;;292;290; 33;562;----;Vinnytsia;;Ukraine;6;49-14N;028-36E;49-14N;028-28E;296;298;P 33;577;----;Haisyn;;Ukraine;6;48-48N;029-24E;;;210;211; 33;581;----;Zhashkov;;Ukraine;6;49-15N;030-06E;;;224;; 33;586;----;Zvenihorodka;;Ukraine;6;49-05N;030-54E;;;214;215; 33;587;----;Uman;;Ukraine;6;48-46N;030-14E;;;214;216;P 33;593;----;Rotmistrovka;;Ukraine;6;49-08N;031-42E;;;168;; 33;605;----;Chyhyryn;;Ukraine;6;49-05N;032-40E;;;123;124; 33;609;----;Znamianka;;Ukraine;6;48-43N;032-40E;;;180;181; 33;614;----;Svitlovods'K;;Ukraine;6;49-03N;033-15E;;;85;84;P 33;615;----;Kremencug;;Ukraine;6;49-02N;033-26E;;;80;69; 33;621;----;Kobeliaky;;Ukraine;6;49-09N;034-12E;;;115;118; 33;631;----;Uzhhorod;;Ukraine;6;48-38N;022-16E;48-38N;022-16E;115;124;P 33;645;----;Yasnya;;Ukraine;6;48-16N;024-22E;;;731;; 33;651;----;Kolomyia;;Ukraine;6;48-32N;025-02E;;;295;298; 33;657;----;Seliatyn;;Ukraine;6;47-52N;025-13E;47-52N;025-13E;762;763; 33;658;----;Chernivtsi;;Ukraine;6;48-22N;025-54E;48-16N;025-58E;242;246;P 33;663;----;Mohyliv-Podil's'Kyi;;Ukraine;6;48-27N;027-47E;;;77;78;P 33;699;----;Pervomais'K;;Ukraine;6;48-03N;030-51E;;;105;103; 33;705;----;Pomichna;;Ukraine;6;48-14N;031-24E;;;211;211; 33;711;----;Kirovohrad;;Ukraine;6;48-31N;032-12E;48-29N;032-15E;170;171;P 33;717;----;Bobrynets;;Ukraine;6;48-04N;032-09E;;;142;143; 33;723;----;Komisarivka;;Ukraine;6;48-26N;033-54E;;;118;118; 33;745;----;Bel'Cy;;Moldova;6;47-47N;027-57E;;;;102; 33;748;----;Kornesty;;Moldova;6;47-20N;028-05E;;;;232; 33;761;----;Liubashivka;;Ukraine;6;47-51N;030-16E;;;181;183;P 33;777;----;Voznesens'K;;Ukraine;6;47-34N;031-20E;;;26;34; 33;788;----;Bastanka;;Ukraine;6;47-25N;032-28E;;;84;; 33;791;----;Kryvyi Rih;;Ukraine;6;43-02N;033-13E;47-56N;033-20E;123;124;P 33;805;----;Nikopol;;Ukraine;6;47-35N;034-27E;;;53;55; 33;815;UKII;Kisinev;;Moldova;6;47-01N;028-59E;47-01N;028-52E;180;173; 33;833;----;Serbka;;Ukraine;6;47-01N;030-45E;;;72;73; 33;834;----;Rozdil'Na;;Ukraine;6;46-51N;030-05E;;;146;148; 33;837;UKOO;Odesa;;Ukraine;6;46-26N;030-46E;46-29N;030-38E;42;42;P 33;846;----;Mikolaiv;;Ukraine;6;47-02N;031-57E;;;49;50; 33;862;----;Velyka Oleksandrivka;;Ukraine;6;47-19N;033-17E;;;57;56; 33;869;----;Nova Kakhovka;;Ukraine;6;46-47N;033-22E;;;26;25; 33;877;----;Nizhni Sirohozy;;Ukraine;6;46-51N;034-24E;;;54;53; 33;883;----;Komrat;;Moldova;6;46-18N;028-38E;;;;133; 33;885;----;Kagul;;Ukraine;6;45-54N;028-11E;;;39;; 33;889;----;Izmail;;Ukraine;6;45-22N;028-51E;45-22N;028-52E;28;30;P 33;896;----;Sarata;;Ukraine;6;46-01N;029-40E;;;12;14; 33;902;----;Kherson;;Ukraine;6;46-38N;032-34E;46-40N;032-37E;47;54;P 33;907;----;Bekhtery;;Ukraine;6;46-15N;032-18E;;;6;7; 33;910;----;Heniches'K;;Ukraine;6;46-10N;034-49E;46-10N;034-49E;14;15;P 33;915;----;Askaniia-Nova;;Ukraine;6;46-27N;033-53E;;;28;30; 33;917;----;Primorskiy;;Ukraine;6;46-03N;033-27E;;;12;; 33;922;----;Novo-Selovskoye;;Ukraine;6;45-27N;033-36E;;;15;; 33;924;----;Chornomors'Ke;;Ukraine;6;45-31N;032-42E;;;9;10;P 33;929;----;Yevpatoriia;;Ukraine;6;45-11N;033-22E;;;1;6; 33;934;----;Dzankoj;;Ukraine;6;45-43N;034-24E;;;8;; 33;939;----;Klepynine;;Ukraine;6;45-39N;034-12E;;;37;37; 33;945;----;Poshtove;;Ukraine;6;44-50N;033-57E;44-50N;033-57E;172;176; 33;946;UKFF;Simferopol;;Ukraine;6;44-41N;034-08E;45-09N;033-59E;180;181;P 33;959;----;Alushta;;Ukraine;6;44-41N;034-26E;;;3;7; 33;960;----;Sovetskiy;;Ukraine;6;45-21N;034-57E;;;18;; 33;962;----;Nyzhniohirs'K;;Ukraine;6;45-27N;034-44E;;;19;20; 33;966;----;Kryms'Ka;;Ukraine;6;45-03N;034-36E;;;205;205; 33;973;----;Vladislavovka;;Ukraine;6;45-10N;035-23E;;;37;; 33;976;----;Feodosiia;;Ukraine;6;45-02N;035-23E;45-02N;035-23E;22;26; 33;981;----;Cape Kazantip Lighthouse ;;Ukraine;6;45-28N;035-52E;;;101;; 33;983;----;Kerch;;Ukraine;6;45-24N;036-25E;;;46;49;P 33;990;----;Yalta;;Ukraine;6;45-29N;034-10E;;;66;72;P 33;994;----;Sevastopol / Belbek;;Ukraine;6;44-41N;033-34E;;;85;; 33;998;----;Ai-Petri;;Ukraine;6;44-26N;034-05E;;;1180;1180; 34;003;----;Ponyri;;Russia;6;52-19N;036-18E;;;251;251; 34;009;----;Kursk;;Russia;6;51-46N;036-10E;51-39N;036-11E;247;247; 34;013;----;Livny;;Russia;6;52-26N;037-36E;;;;179; 34;027;----;Novo-Kastornoe;;Russia;6;51-47N;038-08E;;;;191; 34;047;----;Zerdevka;;Russia;6;51-50N;041-29E;;;148;147;P 34;056;----;Rtiscevo;;Russia;6;52-15N;043-47E;;;;213; 34;063;----;Petrovsk;;Russia;6;52-17N;045-24E;;;;199; 34;069;----;Atkarsk;;Russia;6;51-52N;045-02E;;;;206; 34;072;----;Karabulak;;Russia;6;52-20N;046-22E;;;292;302; 34;083;----;Hvalynsk;;Russia;6;52-30N;048-05E;;;;88; 34;098;----;Pugacev;;Russia;6;52-02N;048-50E;;;43;38; 34;109;----;Obojan;;Russia;6;51-12N;036-19E;;;196;192; 34;116;----;Staryj Oskol;;Russia;6;51-18N;037-53E;51-18N;037-53E;218;218;P 34;122;UUOO;Voronez;;Russia;6;51-39N;039-15E;51-40N;039-16E;154;104; 34;123;----;Voronez;;Russia;6;51-42N;039-13E;51-42N;039-13E;149;149;P 34;139;----;Kamennaja Step;;Russia;6;51-03N;040-42E;;;;194; 34;146;----;Borisoglebsk;;Russia;6;51-22N;042-05E;51-22N;042-05E;106;106; 34;152;----;Balasov;;Russia;6;51-33N;043-09E;;;154;159;P 34;163;----;Oktjabr'Skij Gorodok;;Russia;6;51-38N;045-27E;;;;201; 34;172;----;Saratov;;Russia;6;51-34N;046-02E;51-34N;046-02E;156;156;P 34;186;----;Ersov;;Russia;6;51-22N;048-18E;51-20N;048-16E;106;111;P 34;199;----;Ozinki;;Russia;6;51-12N;049-44E;;;;104; 34;202;----;Gotnja;;Russia;6;50-48N;035-46E;;;222;226; 34;213;----;Novyj Oskol;;Russia;6;50-45N;037-52E;;;127;140; 34;214;----;Belgorod;;Russia;6;50-38N;036-35E;50-35N;036-35E;122;224; 34;231;----;Liski;;Russia;6;51-00N;039-30E;;;118;115; 34;238;----;Anna;;Russia;6;51-29N;040-25E;;;159;154; 34;240;----;Urjupinsk;;Russia;6;50-48N;042-00E;;;110;110;P 34;247;----;Kalac;;Russia;6;50-25N;041-03E;50-25N;041-03E;93;92;P 34;253;----;Elan;;Russia;6;50-57N;043-44E;;;;132; 34;254;----;Novoannenskij;;Russia;6;50-32N;042-41E;;;;98; 34;262;----;Rudnya;;Russia;6;50-50N;044-34E;;;;114; 34;267;----;Danilovka;;Russia;6;50-22N;044-07E;;;102;102; 34;273;----;Krasnyj Kut;;Russia;6;50-57N;046-58E;;;;50; 34;300;UKHH;Kharkiv;;Ukraine;6;49-58N;036-08E;49-56N;036-17E;154;155;P 34;302;----;Bohodukhiv;;Ukraine;6;50-12N;035-32E;;;202;203; 34;304;----;Kolomak;;Ukraine;6;49-51N;035-14E;;;178;; 34;312;----;Velykyi Burluk;;Ukraine;6;50-04N;037-23E;;;174;175; 34;319;----;Kupians'K;;Ukraine;6;49-38N;037-42E;;;87;83; 34;321;----;Valujki;;Russia;6;50-13N;038-06E;;;112;112; 34;336;----;Bogucar;;Russia;6;49-56N;040-34E;;;83;84;P 34;344;----;Kazanskaja;;Russia;6;49-48N;041-09E;;;;72; 34;356;----;Frolovo;;Russia;6;49-48N;043-40E;;;119;119; 34;357;----;Serafimovic;;Russia;6;49-34N;042-45E;;;200;200;P 34;363;----;Kamysin;;Russia;6;50-04N;045-22E;50-05N;045-25E;120;119;P 34;373;----;Pallasovka;;Russia;6;50-03N;046-53E;;;36;37; 34;391;----;Aleksandrov-Gaj;;Russia;6;50-09N;048-33E;;;25;25;P 34;398;----;Furmanovo;;Kazakhstan;6;49-40N;049-29E;49-40N;049-29E;10;10; 34;401;----;Krasnohrad;;Ukraine;6;49-23N;035-27E;;;158;159; 34;407;----;Hubynykha;;Ukraine;6;48-48N;035-15E;;;127;127; 34;409;----;Lozova;;Ukraine;6;48-54N;036-19E;;;175;177; 34;415;----;Izium;;Ukraine;6;49-11N;037-18E;;;77;78;P 34;421;----;Svatove;;Ukraine;6;49-25N;038-10E;;;86;89; 34;432;----;Certkovo;;Russia;6;49-23N;040-10E;;;;145; 34;434;----;Bilovods'K;;Ukraine;6;49-13N;039-35E;;;74;75; 34;438;----;Millerovo;;Russia;6;48-56N;040-23E;;;;155; 34;445;----;Bokovskaja;;Russia;6;49-13N;041-50E;;;;91; 34;476;----;El'Ton;;Russia;6;49-08N;046-51E;;;;6; 34;502;----;Pavlograd;;Ukraine;6;48-32N;035-50E;;;91;; 34;504;----;Dnipropetrovs'K;;Ukraine;6;48-36N;034-58E;;;141;143;P 34;509;----;Chaplyne;;Ukraine;6;48-08N;036-14E;;;173;175; 34;510;----;Artemivs'K;;Ukraine;6;48-36N;037-59E;;;123;124; 34;514;----;Aleksandropol;;Ukraine;6;48-36N;036-33E;;;125;; 34;519;----;Donets'K;;Ukraine;6;48-04N;037-46E;48-04N;037-46E;224;225;P 34;523;----;Luhans'K;;Ukraine;6;48-34N;039-15E;48-36N;039-16E;59;62;P 34;524;----;Debal'Tseve;;Ukraine;6;48-21N;038-26E;;;334;334; 34;535;----;Kamensk-Sahtinskij;;Russia;6;48-18N;040-18E;;;57;51; 34;537;----;Dar'Ivka;;Ukraine;6;48-05N;039-30E;;;300;302; 34;545;----;Morozovsk;;Russia;6;48-21N;041-52E;;;90;90;P 34;555;----;Nizhny-Chir;;Russia;6;48-20N;043-07E;;;77;68; 34;560;URWW;Volgograd;;Russia;6;48-47N;044-22E;48-41N;044-21E;145;134;P 34;578;----;Cernyj Jar;;Russia;6;48-04N;046-07E;;;;5; 34;579;----;Verhnij Baskuncak;;Russia;6;48-13N;046-44E;48-13N;046-44E;35;34;P 34;581;----;Urda;;Russia;6;48-46N;047-26E;;;4;; 34;601;----;Zaporizhzhia;;Ukraine;6;47-48N;035-01E;47-52N;035-19E;107;112;P 34;606;----;Gulyaypole;;Ukraine;6;47-40N;036-15E;;;135;; 34;607;----;Pryshyb;;Ukraine;6;47-16N;035-20E;;;87;88; 34;609;----;Kyrylivka;;Ukraine;6;47-20N;036-20E;;;221;221; 34;615;----;Volnovakha;;Ukraine;6;47-37N;037-21E;;;266;267; 34;622;----;Amvrosiivka;;Ukraine;6;47-48N;038-31E;;;164;164; 34;625;----;Matveev Kurgan;;Russia;6;47-34N;038-53E;;;;43; 34;635;----;Sahty;;Russia;6;47-42N;040-16E;;;;118; 34;644;----;Konstantinovsk;;Russia;6;47-35N;041-06E;;;;66; 34;646;----;Cimljansk;;Russia;6;47-38N;042-07E;;;104;65; 34;655;----;Kotel'Nikovo;;Russia;6;47-38N;043-09E;;;;49;P 34;662;----;Malye Derbety;;Russia;6;47-56N;044-42E;;;;9; 34;687;----;Kharabali;;Russia;6;47-25N;047-15E;;;-16;; 34;691;----;Novyj Ushtogan;;Kazakhstan;6;47-54N;048-48E;;;10;-10;P 34;704;----;Melitopol;;Ukraine;6;46-50N;035-22E;;;33;34; 34;708;----;Botieve;;Ukraine;6;46-41N;035-51E;;;17;19; 34;712;----;Mariupol;;Ukraine;6;47-02N;037-30E;;;68;70;P 34;719;----;Dolzhanka;;Russia;6;46-37N;037-48E;;;2;; 34;720;----;Taganrog;;Russia;6;47-12N;038-54E;;;;32; 34;723;----;Azov;;Russia;6;47-07N;039-25E;;;4;4; 34;727;----;Ejsk;;Russia;6;46-48N;038-16E;;;;3; 34;731;URRR;Rostov-Na-Donu;;Russia;6;47-16N;039-49E;47-15N;039-49E;77;75;P 34;737;----;Kuscevskaja;;Russia;6;46-32N;039-37E;46-34N;039-38E;14;22; 34;743;----;Zimovniki;;Russia;6;47-09N;042-29E;47-09N;042-29E;70;72; 34;747;----;Celina;;Russia;6;46-33N;041-03E;;;112;112;P 34;748;----;Proletarskaya;;Russia;6;46-42N;041-44E;;;25;25; 34;753;----;Zavetnoe;;Russia;6;47-07N;043-56E;;;73;81; 34;759;----;Remontnoe;;Russia;6;46-34N;043-40E;;;108;106;P 34;772;----;Yusta;;Russia;6;47-07N;046-18E;;;2;; 34;785;----;Dosang;;Russia;6;46-55N;047-56E;;;;-19; 34;798;----;Ganjushkino;;Kazakhstan;6;46-36N;049-16E;;;-22;-23; 34;824;----;Primorsko-Ahtarsk;;Russia;6;46-02N;038-09E;;;5;5;P 34;825;----;Kanevskaja;;Russia;6;46-04N;038-58E;;;;17; 34;838;----;Tihoreck;;Russia;6;45-51N;040-05E;45-51N;040-05E;79;78;P 34;845;----;Gorodovikovsk;;Russia;6;46-04N;041-58E;;;;86; 34;858;----;Divnoe;;Russia;6;45-55N;043-21E;45-55N;043-21E;77;87;P 34;861;URWI;Elista;;Russia;6;46-22N;044-20E;46-19N;044-18E;150;155; 34;866;----;Jaskul;;Russia;6;46-11N;045-21E;;;-7;-7;P 34;880;----;Astrahan;;Russia;6;46-17N;048-03E;46-21N;047-58E;18;-23;P 34;887;----;Liman;;Russia;6;45-48N;047-13E;;;;-18; 34;915;----;Kubanskaya Ust'Evaya;;Russia;6;45-19N;037-23E;;;;2; 34;922;----;Timasevskaja;;Russia;6;45-38N;038-56E;;;;22; 34;924;----;Slavjansk-Na-Kubani;;Russia;6;45-17N;038-07E;;;9;9; 34;929;URKK;Krasnodar;;Russia;6;45-02N;039-09E;45-02N;039-09E;33;34;P 34;936;----;Kropotkin;;Russia;6;45-26N;040-34E;;;;106; 34;949;----;Stavropol;;Russia;6;45-07N;042-05E;;;;452; 34;954;----;Svetlograd;;Russia;6;45-21N;042-51E;;;134;140;P 34;958;----;Blagodarnyj;;Russia;6;45-06N;043-27E;;;;162; 34;964;----;Arzgir;;Russia;6;45-24N;044-12E;;;;76; 34;984;----;Lagan;;Russia;6;45-24N;047-21E;;;;-24; 34;989;----;Iskusstvennyj Ostrov;;Russia;6;45-23N;047-47E;;;;-25; 35;001;----;Bol'Saja Gluscica;;Russia;2;52-23N;050-28E;;;;64; 35;007;----;Pereljub;;Russia;2;51-52N;050-20E;;;;71; 35;011;----;Sorocinsk;;Russia;2;52-26N;053-08E;;;;123; 35;015;----;Novosergievka;;Russia;2;52-05N;053-38E;;;;139; 35;026;----;Zilair;;Russia;2;52-13N;057-24E;52-13N;057-24E;523;521;P 35;037;----;Ak'Jar;;Russia;2;51-52N;058-11E;;;339;341;P 35;041;----;Bredy;;Russia;2;52-26N;060-21E;;;310;310; 35;042;----;Zabelovka;;Russia;2;52-18N;061-19E;;;279;; 35;053;----;Kusmurun;;Russia;2;52-28N;064-40E;;;110;; 35;067;----;Esil;;Kazakhstan;2;51-53N;066-20E;51-57N;066-25E;222;221;P 35;078;----;Atbasar;;Kazakhstan;2;51-49N;068-22E;51-49N;068-22E;308;304;P 35;085;----;Alekseevka;;Kazakhstan;2;52-00N;070-57E;;;384;384;P 35;108;UARR;Uralsk;;Kazakhstan;2;51-15N;051-17E;51-15N;051-24E;36;37;P 35;121;----;Orenburg;;Russia;2;51-41N;055-06E;51-45N;055-06E;109;117;P 35;125;----;Beljaevka;;Russia;2;51-25N;056-25E;;;;131; 35;127;----;Ak-Bulak;;Russia;2;51-01N;055-38E;;;144;144; 35;138;----;Orsk;;Russia;2;51-04N;058-36E;;;;285; 35;157;----;Aralkol;;Russia;2;51-05N;062-42E;;;230;; 35;163;----;Kijma;;Russia;2;51-36N;067-34E;;;272;; 35;173;----;Zhaltyr;;Kazakhstan;2;51-37N;069-48E;;;312;620; 35;188;----;Akmola;;Kazakhstan;2;51-08N;071-22E;51-08N;071-22E;348;350;P 35;191;----;Jermentau;;Russia;2;51-38N;073-10E;;;397;; 35;217;----;Dzhambejty;;Kazakhstan;2;50-15N;052-34E;;;33;32;P 35;225;----;Martuk;;Russia;2;50-45N;056-32E;50-45N;056-32E;178;178; 35;229;UATT;Aktjubinsk;;Kazakhstan;2;50-17N;057-09E;50-17N;057-09E;227;219;P 35;302;----;Chapaevo;;Kazakhstan;2;50-12N;051-10E;;;16;17; 35;321;----;Novoaleksjevka;;Russia;2;50-08N;055-42E;;;142;; 35;345;----;Tamabulak;;Russia;2;49-59N;061-29E;;;221;; 35;361;----;Amangeldy;;Russia;2;50-08N;065-14E;50-10N;065-12E;142;142; 35;363;----;Arkalyk;;Russia;2;50-13N;066-50E;;;343;; 35;368;----;Senber;;Russia;2;49-45N;066-09E;;;229;; 35;376;----;Berlik;;Kazakhstan;2;49-53N;069-31E;49-53N;069-31E;350;349;P 35;386;----;Kazgorodok;;Russia;2;49-57N;071-35E;;;422;; 35;394;UAKK;Karaganda;;Kazakhstan;2;49-48N;073-09E;;;553;; 35;404;----;Dzhangala;;Russia;2;49-13N;050-18E;;;7;; 35;406;----;Taipak;;Kazakhstan;2;49-03N;051-52E;49-03N;051-52E;4;2;P 35;416;----;Uil;;Kazakhstan;2;49-04N;054-41E;;;103;128;P 35;426;----;Temir;;Kazakhstan;2;49-09N;057-07E;;;236;234;P 35;430;----;Taldyk;;Russia;2;49-15N;059-33E;;;260;; 35;459;----;Bisary;;Russia;2;48-49N;064-37E;;;122;; 35;478;----;Algabas;;Russia;2;48-53N;068-05E;;;506;; 35;497;----;Zharyk;;Kazakhstan;2;48-51N;072-52E;;;656;656;P 35;514;----;Karabau;;Russia;2;48-27N;052-55E;;;0;; 35;519;----;Sagiz;;Russia;2;48-12N;054-56E;;;73;; 35;532;----;Mugodzarskaja;;Kazakhstan;2;48-38N;058-30E;;;397;398; 35;542;----;Irgiz;;Russia;2;48-37N;061-16E;48-37N;061-16E;114;114; 35;549;----;Taup;;Russia;2;48-15N;062-00E;;;74;; 35;576;----;Kzyl-Zar;;Russia;2;48-18N;069-39E;48-18N;069-39E;361;361; 35;582;----;Atasu;;Russia;2;48-42N;071-38E;;;488;; 35;605;----;Mahambet;;Russia;2;47-40N;051-35E;;;-15;; 35;663;----;Karsakpaj;;Russia;2;47-50N;066-45E;;;508;; 35;671;----;Zhezkazgan;;Kazakhstan;2;47-48N;067-43E;47-48N;067-43E;345;346;P 35;683;----;Kzyl-Tau;;Russia;2;47-51N;072-05E;;;810;; 35;687;----;Koktas;;Russia;2;47-31N;070-54E;;;471;; 35;699;----;Bektauata;;Kazakhstan;2;47-27N;074-49E;;;620;520; 35;700;----;Atyray;;Kazakhstan;2;47-06N;051-43E;47-01N;051-51E;-15;23;P 35;715;----;Kulsary;;Russia;2;46-48N;053-55E;;;18;; 35;721;----;Zambike;;Russia;2;47-02N;055-08E;;;45;; 35;739;----;Ayak-Kum;;Russia;2;46-43N;059-10E;;;114;; 35;746;UATA;Aralskoe More;;Kazakhstan;2;46-47N;061-39E;46-47N;061-40E;56;62;P 35;756;----;Kara-Kum;;Russia;2;46-53N;064-40E;46-53N;064-40E;79;79; 35;777;----;Jeti-Konur;;Russia;2;46-35N;068-37E;;;276;; 35;791;----;Mointy;;Russia;2;47-12N;073-21E;;;581;; 35;796;----;Balhash;;Kazakhstan;2;46-48N;075-05E;46-54N;075-00E;352;350;P 35;849;----;Kazalinsk;;Kazakhstan;2;45-46N;062-07E;;;68;68;P 35;884;----;Betpak-Dala Steppe ;;Russia;2;46-00N;070-00E;;;325;; 35;907;----;Kulaly Island;;Russia;2;45-01N;050-02E;;;-22;; 35;925;----;Sam;;Kazakhstan;2;45-24N;056-07E;;;82;82;P 35;941;----;Barsakelmes Island;;Russia;2;45-41N;059-55E;;;80;; 35;953;----;Dzhusaly;;Kazakhstan;2;45-30N;064-05E;45-31N;064-05E;101;103;P 35;969;----;Zlikha;;Kazakhstan;2;45-15N;067-04E;;;138;138; 35;997;----;Ciganak;;Russia;2;45-06N;073-58E;;;349;; 36;001;----;Ekibastuz;;Russia;2;51-42N;075-22E;;;234;; 36;003;----;Pavlodar;;Kazakhstan;2;52-18N;076-56E;52-17N;076-57E;123;122;P 36;020;----;Rodino;;Russia;2;52-30N;080-12E;;;168;59; 36;021;----;Kljuci;;Russia;2;52-15N;079-08E;;;143;143;P 36;022;----;Volciha;;Russia;2;52-01N;080-22E;;;208;208;P 36;034;----;Rubcovsk;;Russia;2;51-30N;081-13E;51-30N;081-13E;215;219;P 36;036;----;Krasno-Scekovo;;Russia;2;51-40N;082-44E;;;240;; 36;038;----;Zmeinogorsk;;Russia;2;51-09N;082-12E;;;356;355;P 36;045;----;Solonesnoje;;Russia;2;51-40N;084-19E;;;411;; 36;052;----;Majma;;Russia;2;52-01N;085-54E;;;331;; 36;058;----;Cemal;;Russia;2;51-26N;086-00E;;;420;420;P 36;061;----;Turocak;;Russia;2;52-16N;087-10E;52-15N;087-06E;322;327;P 36;064;----;Artibas;;Russia;2;51-48N;087-16E;;;400;; 36;078;----;Teeli;;Russia;2;50-57N;090-18E;;;983;; 36;083;----;Ust-Usa;;Russia;2;52-07N;092-17E;;;581;; 36;087;----;Cadan;;Russia;2;51-17N;091-40E;;;836;; 36;090;----;Hut;;Russia;2;52-37N;094-34E;;;1043;; 36;091;----;Nizne-Usinskoje;;Russia;2;52-16N;093-00E;52-16N;093-00E;665;660; 36;096;----;Kyzyl;;Russia;2;51-43N;094-30E;51-40N;094-23E;629;628; 36;103;----;Toora-Hem;;Russia;2;52-28N;096-22E;;;920;; 36;104;----;Saryg-Sep;;Russia;2;51-30N;095-40E;;;706;; 36;126;----;Bajanaul;;Russia;2;50-48N;075-42E;;;504;; 36;152;----;Semijarka;;Kazakhstan;2;50-52N;078-21E;;;148;149;P 36;177;----;Semipalatinsk;;Kazakhstan;2;50-25N;080-18E;50-21N;080-15E;196;196;P 36;186;----;Semonaiha;;Russia;2;50-38N;081-55E;;;320;; 36;208;----;Leninogorsk;;Kazakhstan;2;50-20N;083-33E;;;809;811;P 36;213;----;Ust-Kan;;Russia;2;50-57N;084-55E;;;1037;; 36;231;----;Ongudaj;;Russia;2;50-44N;086-09E;;;832;; 36;259;----;Kos-Agac;;Russia;2;50-00N;088-40E;50-00N;088-40E;1758;1758; 36;307;----;Erzin;;Russia;2;50-17N;095-10E;;;1101;; 36;335;----;Karkaralinsk;;Russia;2;49-23N;075-31E;;;812;; 36;358;----;Kajnar;;Russia;2;49-12N;077-22E;;;842;; 36;397;----;Zhangiztobe;;Kazakhstan;2;49-13N;081-13E;;;455;455; 36;403;----;Ust-Kamenogorsk;;Russia;2;49-58N;082-38E;49-58N;082-35E;292;284; 36;428;----;Bol'Soe Narymskoe;;Kazakhstan;2;49-12N;084-31E;;;401;401;P 36;439;----;Katon-Karagaj;;Russia;2;49-11N;085-37E;;;1081;; 36;442;----;Katun;;Russia;2;49-44N;086-33E;;;1800;; 36;443;----;Ak-Kem;;Russia;2;49-58N;086-42E;;;2050;; 36;467;----;Aktogaj;;Russia;2;48-18N;074-58E;;;780;; 36;487;----;Ogiztau;;Russia;2;48-16N;077-19E;;;699;; 36;501;----;Karaul;;Russia;2;49-00N;079-20E;;;618;; 36;535;----;Kokpekty;;Kazakhstan;2;48-45N;082-22E;48-45N;082-22E;511;512;P 36;546;----;Kurcum;;Russia;2;48-33N;083-41E;;;427;; 36;622;----;Ajaguz;;Russia;2;47-58N;080-27E;47-58N;080-27E;655;662; 36;639;----;Urdzhar;;Kazakhstan;2;47-07N;081-37E;;;501;491;P 36;686;----;Algazy Ostrov;;Kazakhstan;2;46-33N;076-52E;;;;349; 36;744;----;Aul;;Russia;2;45-38N;075-07E;;;353;; 36;770;----;Mulaly;;Russia;2;45-27N;078-20E;45-27N;078-19E;564;564; 36;778;----;Taldy-Kurgan;;Russia;2;45-00N;078-23E;45-00N;078-21E;602;602; 36;803;----;Uzynbulak;;Russia;2;45-51N;082-11E;;;362;; 36;821;----;Bakanas;;Kazakhstan;2;44-50N;076-16E;;;;396; 36;859;----;Panfilov;;Kazakhstan;2;44-10N;080-04E;44-10N;080-04E;640;645;P 36;864;----;Otar;;Kazakhstan;2;43-32N;075-15E;;;;743; 36;870;UAAA;Almaty;;Kazakhstan;2;43-14N;076-56E;43-14N;076-56E;847;851;P 36;877;----;Prudky;;Russia;2;43-10N;076-03E;;;992;; 36;911;----;Tokmak;;Kyrgyzstan;2;42-50N;075-17E;;;816;817;P 36;927;----;Rybacje;;Russia;2;42-28N;076-11E;;;1660;; 36;934;----;Colpon-Ata;;Russia;2;42-39N;077-06E;;;1645;; 36;948;----;Bolsaja Kzyl;;Russia;2;42-12N;078-12E;;;1719;; 36;963;----;Dolon Pass;;Russia;2;41-48N;075-46E;;;3040;; 36;974;----;Naryn;;Kyrgyzstan;2;41-26N;076-00E;41-26N;076-00E;2039;2041; 36;982;----;Tian-Shan;;Kyrgyzstan;2;41-53N;078-14E;41-54N;078-08E;3635;3639;P 36;983;----;Darhan;;Russia;2;42-19N;077-54E;;;1700;; 36;985;----;Karakolka;;Russia;2;41-29N;077-24E;;;3080;; 36;994;----;Ak-Syjrak;;Russia;2;41-49N;078-44E;;;3540;; 37;001;----;Anapa;;Russia;6;44-53N;037-17E;;;6;32; 37;004;----;Gelendzik;;Russia;6;44-34N;038-01E;44-34N;038-05E;4;27; 37;009;----;Dzugba;;Russia;6;44-20N;038-43E;;;25;23; 37;013;----;Belorecensk;;Russia;6;44-45N;039-54E;;;;137; 37;014;----;Gorjacij Kljuc;;Russia;6;44-38N;039-06E;;;;62; 37;017;----;Gornyij;;Russia;6;44-17N;039-16E;;;324;323; 37;018;----;Tuapse;;Russia;6;44-06N;039-04E;44-06N;039-04E;41;41;P 37;021;----;Majkop;;Russia;6;44-37N;040-05E;;;;220; 37;031;----;Armavir;;Russia;6;44-59N;041-07E;44-59N;041-07E;160;159;P 37;036;----;Nevinnomyssk;;Russia;6;44-38N;041-58E;;;333;343; 37;050;----;Pjatigorsk;;Russia;6;44-03N;043-02E;;;;538; 37;054;URMM;Mineral'Nye Vody;;Russia;6;44-14N;043-04E;44-13N;043-06E;314;316;P 37;058;----;Georgievsk;;Russia;6;44-09N;043-28E;;;;302; 37;061;----;Budennovsk;;Russia;6;44-47N;044-08E;44-48N;044-10E;136;136; 37;085;----;Kocubej;;Russia;6;44-24N;046-33E;;;-20;-21;P 37;089;----;Ostrov Tjulenij;;Russia;6;44-28N;047-29E;;;;-23; 37;099;----;Sotchi;;Russia;6;43-35N;039-46E;;;;34; 37;116;----;Karatchaevsk;;Russia;6;43-47N;041-54E;;;862;; 37;145;----;Mozdok;;Russia;6;43-44N;044-40E;;;132;136;P 37;163;----;Kizljar;;Russia;6;43-50N;046-43E;;;;-5; 37;171;URSS;Adler;;Russia;6;43-26N;039-54E;;;16;13;P 37;177;----;Gagby;;Georgia;6;43-15N;040-16E;;;7;7; 37;178;----;Picunda;;Russia;6;43-12N;040-21E;;;4;; 37;187;----;Gudauta Bay ;;Russia;6;43-06N;040-38E;;;11;; 37;193;----;Teberda;;Russia;6;43-27N;041-44E;;;;1325; 37;209;----;Verkhnaya Balkariya;;Russia;6;43-03N;042-43E;;;1441;; 37;212;----;Nal'Cik;;Russia;6;43-32N;043-38E;;;;425; 37;228;----;Wladikavkaz;;Russia;6;43-03N;044-39E;43-03N;044-39E;670;703;P 37;235;----;Groznyj;;Russia;6;43-21N;045-41E;43-21N;045-41E;162;163;P 37;244;----;Gudermes;;Russia;6;43-21N;046-07E;;;;75; 37;248;----;Hasavjurt;;Russia;6;43-15N;046-35E;;;;117; 37;260;----;Suhumi;;Georgia;6;42-52N;041-08E;43-01N;041-02E;13;13; 37;267;----;Ocemciri;;Georgia;6;42-42N;041-28E;;;5;5; 37;278;----;Gali;;Russia;6;42-38N;041-42E;;;63;; 37;279;----;Zugdidi;;Russia;6;42-30N;041-53E;;;117;; 37;286;----;Lebarde;;Russia;6;42-44N;042-29E;;;1610;; 37;295;----;Lentekhi;;Russia;6;42-47N;042-45E;;;1158;; 37;298;----;Cageri;;Russia;6;42-39N;042-42E;;;474;; 37;308;----;Ambrolauri;;Russia;6;42-31N;043-09E;;;544;; 37;309;----;Oni;;Georgia;6;42-35N;043-27E;;;789;789; 37;316;----;Nizhniy-Zaramag;;Russia;6;42-42N;043-58E;;;1730;; 37;334;----;Kazbek Mountain;;Russia;6;42-42N;044-31E;;;5033;; 37;367;----;Botlih;;Russia;6;42-41N;046-12E;;;;980; 37;379;----;Poti;;Russia;6;42-09N;041-40E;;;3;; 37;380;----;Miha Chakaja;;Russia;6;42-17N;042-02E;;;40;; 37;385;----;Samtredia;;Georgia;6;42-11N;042-22E;;;26;26; 37;386;----;Culukidze;;Russia;6;42-18N;042-25E;;;114;; 37;388;----;Lanchkhuti;;Russia;6;42-05N;042-00E;;;20;; 37;390;----;Orpiri;;Russia;6;42-20N;042-49E;;;175;; 37;393;----;Tkibuli;;Georgia;6;42-20N;042-59E;;;598;541; 37;395;----;Kutaisi;;Georgia;6;42-16N;042-38E;42-16N;042-38E;116;116; 37;403;----;Sachkhere;;Russia;6;42-21N;043-24E;;;415;; 37;404;----;Chiatura;;Russia;6;42-19N;043-18E;;;149;; 37;416;----;Chinvaly;;Georgia;6;42-14N;043-59E;;;871;871; 37;417;----;Hasuri;;Russia;6;41-59N;043-33E;;;690;; 37;429;----;Leningori;;Russia;6;42-07N;044-29E;42-07N;044-29E;760;760; 37;432;----;Pasanauri;;Georgia;6;42-21N;044-42E;;;1064;1064; 37;437;----;Duseti;;Georgia;6;42-05N;044-42E;;;902;902; 37;439;----;Tianeti;;Georgia;6;42-07N;044-58E;;;1091;1091; 37;448;----;Akhmeta;;Russia;6;42-02N;045-13E;;;546;; 37;463;----;Gunib;;Russia;6;42-24N;046-58E;;;;1399; 37;470;----;Derbent;;Russia;6;42-03N;048-18E;;;-19;; 37;471;----;Bujnaksk;;Russia;6;42-49N;047-07E;;;472;473; 37;472;----;Mahackala;;Russia;6;42-50N;047-33E;43-01N;047-26E;32;32;P 37;473;----;Izberg;;Russia;6;42-32N;047-55E;;;-21;-21; 37;475;----;Sergokala;;Russia;6;42-27N;047-40E;;;519;; 37;484;----;Batumi;;Georgia;6;41-39N;041-38E;41-39N;041-38E;6;6; 37;492;----;Dablatsikhe;;Russia;6;42-01N;042-18E;;;221;; 37;498;----;Charnali;;Russia;6;41-34N;041-37E;;;949;; 37;503;----;Abastumani;;Russia;6;41-43N;042-50E;;;1265;; 37;506;----;Ahalcihe;;Russia;6;41-38N;042-59E;;;982;; 37;507;----;Adigeni;;Russia;6;41-42N;042-42E;;;1185;; 37;508;----;Vale;;Russia;6;41-37N;042-52E;;;1097;; 37;513;----;Tsipa;;Russia;6;42-01N;043-27E;;;673;; 37;514;----;Aspindza;;Russia;6;41-34N;043-15E;;;983;; 37;515;----;Borzomi;;Russia;6;41-50N;043-23E;;;794;; 37;524;----;Bakuriani;;Russia;6;41-43N;043-31E;;;1665;; 37;525;----;Tabatskuri Lake ;;Russia;6;41-39N;043-37E;;;1995;; 37;531;----;Gori;;Georgia;6;41-59N;044-07E;;;612;590; 37;535;----;Manglisi;;Georgia;6;41-42N;044-23E;;;;1195; 37;537;----;Calka;;Russia;6;41-35N;044-05E;;;1457;; 37;539;----;Tetri-Tskaro;;Russia;6;41-33N;044-28E;41-33N;044-28E;1140;1140; 37;541;UGMM;Muhrani;;Georgia;6;41-56N;044-35E;;;551;551; 37;545;----;Tbilisi;;Russia;6;41-42N;044-45E;;;403;; 37;549;UGGG;Tbilisi;;Georgia;6;41-41N;044-57E;41-41N;044-57E;467;490; 37;553;----;Telavi;;Georgia;6;41-56N;045-23E;41-56N;045-27E;543;562; 37;556;----;Sagaredzo;;Georgia;6;41-44N;045-20E;;;806;806; 37;566;----;Gurdzhaani;;Russia;6;41-45N;045-48E;;;410;; 37;572;----;Lagodehi;;Georgia;6;41-49N;046-18E;;;435;435; 37;575;----;Zakatala;;Azerbaijan;6;41-38N;046-39E;41-38N;046-39E;487;490; 37;577;----;Cnoris;;Russia;6;41-36N;046-03E;;;291;; 37;578;----;Danachy;;Russia;6;41-33N;046-25E;;;213;; 37;579;----;Alibai;;Azerbaijan;6;41-40N;046-48E;;;1540;1539; 37;597;----;Kasumkent;;Russia;6;41-40N;048-09E;;;;477; 37;602;----;Akhalkalaki;;Russia;6;41-24N;043-29E;;;1716;; 37;621;----;Bolnisi;;Georgia;6;41-27N;044-33E;;;534;534; 37;632;----;Gardabani;;Georgia;6;41-27N;045-06E;;;303;303; 37;636;----;Jeyranchel;;Azerbaijan;6;41-18N;045-28E;;;403;404; 37;639;----;Agstapha Aerodrome;;Azerbaijan;6;41-08N;045-25E;41-07N;045-25E;331;333; 37;651;----;Shiraki Steppe ;;Russia;6;41-25N;046-15E;;;801;; 37;661;----;Shaki;;Azerbaijan;6;41-13N;047-10E;;;637;641; 37;663;----;Ahty;;Russia;6;41-28N;047-45E;;;;1015; 37;668;----;Oguz;;Azerbaijan;6;41-04N;047-28E;;;582;581; 37;670;----;Nabran;;Azerbaijan;6;41-47N;048-42E;;;-16;-15; 37;673;----;Khachmaz Aerodrome;;Azerbaijan;6;41-25N;048-53E;;;27;27; 37;674;----;Giriz;;Azerbaijan;6;41-13N;048-14E;;;2070;2071; 37;675;----;Kuba;;Azerbaijan;6;41-22N;048-31E;;;550;552; 37;676;----;Khinalig;;Azerbaijan;6;41-06N;048-10E;;;2426;2427; 37;677;----;Khaltan;;Azerbaijan;6;41-00N;048-42E;;;1104;1107; 37;682;----;Ashotsk;;Armenia;6;40-57N;043-47E;;;1878;1878; 37;686;----;Gumri;;Armenia;6;40-47N;043-50E;;;;1529;P 37;693;----;Stepanavan;;Russia;6;41-01N;044-23E;;;1397;; 37;699;----;Aparan;;Russia;6;40-35N;044-21E;;;1891;; 37;704;----;Vanadzor;;Armenia;6;40-49N;044-30E;;;1379;1379; 37;706;----;Dilidjan;;Armenia;6;40-45N;044-52E;;;;1255; 37;708;----;Sevan;;Russia;6;40-32N;044-57E;;;1918;; 37;709;----;Sevan;;Armenia;6;40-33N;044-56E;40-33N;044-56E;1937;1937; 37;711;----;Idjevan;;Armenia;6;40-52N;045-09E;;;733;696; 37;713;----;Berd;;Armenia;6;40-53N;045-23E;;;;900; 37;719;----;Chambarak;;Armenia;6;40-36N;045-21E;;;;1834; 37;729;----;Gadabay;;Azerbaijan;6;40-34N;045-49E;;;1480;1476; 37;734;----;Shamkir;;Azerbaijan;6;40-50N;046-02E;;;404;410; 37;735;----;Gyanja;;Azerbaijan;6;40-43N;046-25E;40-43N;046-25E;309;311; 37;736;----;Gyanja Airport;;Azerbaijan;6;40-44N;046-19E;;;325;326; 37;740;----;Kabala;;Azerbaijan;6;40-59N;047-52E;;;679;682; 37;744;----;Mingachevir;;Azerbaijan;6;40-46N;047-02E;;;93;94; 37;747;----;Evlakh Airport;;Azerbaijan;6;40-37N;047-09E;40-37N;047-09E;13;15; 37;749;----;Geokchay;;Azerbaijan;6;40-39N;047-45E;;;94;95; 37;750;----;Ismailly;;Azerbaijan;6;40-47N;048-08E;;;549;550; 37;753;----;Altiagach;;Azerbaijan;6;40-52N;048-56E;;;1099;1082; 37;756;----;Maraza;;Azerbaijan;6;40-32N;048-56E;;;755;755; 37;759;----;Shamakhy;;Azerbaijan;6;40-38N;048-38E;;;710;749; 37;769;----;Sumgait;;Azerbaijan;6;40-36N;049-38E;;;-20;-19; 37;789;UGEE;Yerevan;;Armenia;6;40-08N;044-28E;40-08N;044-28E;890;907;P 37;791;----;Lusavan / Charentsava;;Russia;6;40-24N;044-38E;;;1792;; 37;792;----;Rasdan;;Armenia;6;40-30N;044-46E;;;;1761; 37;801;----;Kamo;;Armenia;6;40-21N;045-08E;;;;1951; 37;808;----;Martuni No. 2 ;;Russia;6;40-08N;045-19E;;;1945;; 37;815;----;Mec Mazra;;Russia;6;40-13N;045-46E;;;1940;; 37;816;----;Dashkasan;;Azerbaijan;6;40-30N;046-05E;;;1655;1658; 37;825;----;Gyoy-Gyol;;Azerbaijan;6;40-25N;046-20E;;;1562;1582; 37;831;----;Tartar;;Azerbaijan;6;40-21N;047-01E;;;163;164; 37;832;----;Barda;;Azerbaijan;6;40-22N;047-08E;;;67;69; 37;835;----;Zardab;;Azerbaijan;6;40-12N;047-13E;;;-4;-5; 37;844;----;Kurdamir;;Azerbaijan;6;40-20N;048-10E;;;2;4; 37;849;----;Gazimammad Aerodrome;;Azerbaijan;6;40-01N;048-55E;;;-7;-5; 37;851;----;Baku Dendropark ;;Azerbaijan;6;40-25N;049-47E;;;60;61; 37;852;----;Shubany;;Azerbaijan;6;40-22N;049-46E;;;237;224; 37;853;----;Baku / Zabrat Airport;;Azerbaijan;6;40-29N;049-58E;;;;6; 37;860;----;Mashtaga;;Azerbaijan;6;40-32N;050-00E;40-32N;050-00E;27;28; 37;861;----;Neft Dashlary;;Azerbaijan;6;40-14N;050-52E;;;-17;-15; 37;864;UBBB;Baku / Bine Airport;;Azerbaijan;6;40-27N;050-04E;40-27N;050-04E;-6;-1; 37;866;----;Pirallahi;;Azerbaijan;6;40-28N;050-19E;;;-26;-24; 37;869;----;Chilov Island;;Azerbaijan;6;40-20N;050-37E;;;-17;-17; 37;874;----;Artashat;;Russia;6;39-57N;044-33E;;;822;; 37;877;----;Sharur;;Azerbaijan;6;39-34N;045-00E;;;817;817; 37;883;----;Istisu;;Azerbaijan;6;39-56N;045-58E;;;2294;2257; 37;893;----;Agdam;;Azerbaijan;6;39-59N;046-45E;;;250;252; 37;895;----;Khankandy;;Azerbaijan;6;39-59N;046-45E;39-49N;046-45E;827;828; 37;896;----;Khojaly Airport;;Azerbaijan;6;39-54N;046-47E;;;610;611; 37;897;----;Sisian;;Armenia;6;39-32N;046-01E;39-32N;046-10E;1615;1615; 37;898;----;Lachin;;Azerbaijan;6;39-39N;046-32E;;;1094;1099; 37;899;----;Shusha;;Azerbaijan;6;39-46N;046-45E;;;1356;1355; 37;901;----;Khojavand;;Azerbaijan;6;39-47N;047-06E;;;414;399; 37;905;----;Beylagan Aerodrome;;Azerbaijan;6;39-46N;047-45E;;;69;72; 37;907;----;Fizuly;;Azerbaijan;6;39-36N;047-09E;;;439;439; 37;912;----;Jafarkhan;;Azerbaijan;6;39-56N;048-32E;;;-16;-15; 37;913;----;Salyan;;Azerbaijan;6;39-35N;048-58E;;;-22;-21; 37;914;----;Imishly;;Azerbaijan;6;39-52N;048-03E;;;-3;-1; 37;923;----;Alat;;Azerbaijan;6;39-58N;049-24E;;;-18;-16; 37;925;----;Neftchala;;Azerbaijan;6;39-24N;049-15E;;;-25;-24; 37;936;----;Nakhchivan;;Azerbaijan;6;39-12N;045-25E;39-12N;045-25E;885;885; 37;941;----;Shahbuz;;Azerbaijan;6;39-24N;045-34E;;;1205;1206; 37;946;----;Paragachay;;Azerbaijan;6;39-07N;045-57E;;;2218;; 37;947;----;Julfa;;Azerbaijan;6;38-57N;045-38E;;;714;717; 37;952;----;Kalvaz;;Azerbaijan;6;38-40N;048-23E;;;1830;1832; 37;953;----;Goris;;Armenia;6;39-30N;046-21E;;;1367;1367; 37;957;----;Ordubad;;Azerbaijan;6;38-55N;046-01E;;;785;788; 37;958;----;Megri;;Armenia;6;38-54N;046-15E;;;629;670; 37;959;----;Kapan;;Armenia;6;39-12N;046-26E;;;704;704; 37;968;----;Minjivan;;Azerbaijan;6;39-00N;046-40E;;;312;315; 37;972;----;Bilasuvar;;Azerbaijan;6;39-28N;048-33E;;;2;4; 37;978;----;Gyoytapa;;Azerbaijan;6;39-08N;048-36E;;;2;4; 37;981;----;Yardimly;;Azerbaijan;6;38-54N;048-15E;;;729;730; 37;984;----;Lerik;;Russia;6;38-46N;048-24E;;;1115;; 37;985;----;Lankaran;;Azerbaijan;6;38-44N;048-50E;38-44N;048-50E;-13;-12; 37;989;----;Astara;;Azerbaijan;6;38-27N;048-53E;;;-23;-22; 38;001;----;Fort Shevchenko;;Kazakhstan;2;44-33N;050-15E;44-30N;050-17E;-20;-25;P 38;002;----;Tuscikuduk;;Russia;2;44-44N;051-58E;;;56;; 38;019;----;Duken;;Russia;2;44-19N;054-36E;;;143;; 38;023;----;Karakapalkija;;Uzbekistan;2;44-51N;056-20E;;;126;126;P 38;049;----;Cirik-Rabat;;Russia;2;44-04N;062-54E;;;88;; 38;062;UAOO;Kzyl-Orda;;Kazakhstan;2;44-51N;065-30E;44-46N;065-32E;129;130;P 38;069;----;Ciili;;Kazakhstan;2;44-10N;066-45E;;;;153; 38;081;----;Tasty;;Russia;2;44-48N;069-07E;;;190;; 38;091;----;Ulanbel;;Russia;2;44-48N;071-04E;;;266;; 38;111;----;Sevcenko;;Russia;2;43-35N;051-05E;;;-15;; 38;141;----;Jaslyk;;Uzbekistan;2;43-53N;057-31E;;;128;128;P 38;146;----;Mujnak;;Uzbekistan;2;43-45N;058-44E;;;;55; 38;149;----;Kungrad;;Uzbekistan;2;43-05N;058-56E;;;64;64;P 38;162;----;Cabankazgan;;Russia;2;43-36N;061-56E;;;64;; 38;178;----;Ak-Bajtal;;Uzbekistan;2;43-09N;064-20E;;;233;234;P 38;196;----;Achisaj;;Kazakhstan;2;43-33N;068-54E;;;;822; 38;198;----;Turkestan;;Kazakhstan;2;43-16N;068-13E;43-16N;068-13E;209;207;P 38;203;----;Ujuk;;Russia;2;43-47N;070-56E;;;366;; 38;220;----;Manas;;Kyrgyzstan;2;42-51N;074-52E;;;626;627; 38;222;----;Novotroitskoe;;Kazakhstan;2;43-42N;073-47E;;;456;456; 38;232;----;Akkuduk;;Kazakhstan;2;42-58N;054-07E;42-58N;054-07E;-79;78;P 38;261;----;Ak-Depe;;Turkmenistan;2;42-03N;059-22E;;;;74; 38;262;----;Chimbaj;;Uzbekistan;2;42-57N;059-49E;;;66;66;P 38;264;----;Nukus;;Uzbekistan;2;42-27N;059-37E;42-27N;059-37E;77;77;P 38;267;----;Keneurgench;;Turkmenistan;2;42-18N;059-08E;;;73;71; 38;284;----;Kul-Kuduk;;Russia;2;42-32N;063-17E;;;333;; 38;328;UAII;Shymkent;;Kazakhstan;2;42-19N;069-42E;42-18N;069-36E;552;604; 38;334;----;Aul Turara Ryskulova;;Kazakhstan;2;42-29N;070-18E;;;;808; 38;339;----;Olgaing;;Uzbekistan;2;42-10N;070-53E;;;2151;2151;P 38;341;----;Zhambyl;;Kazakhstan;2;42-51N;071-23E;42-51N;071-23E;653;651;P 38;343;----;Lugovoj;;Kazakhstan;2;42-57N;072-45E;;;;683; 38;345;----;Talas;;Kyrgyzstan;2;42-31N;072-13E;;;1217;1218;P 38;352;----;Belovodskoe;;Russia;2;42-51N;074-06E;42-51N;074-06E;726;726; 38;353;----;Bishkek;;Kyrgyzstan;2;42-51N;074-32E;42-50N;074-35E;756;760;P 38;358;----;Susamyr;;Russia;2;42-09N;073-59E;;;2092;; 38;367;----;Karabogazkel;;Turkmenistan;2;41-03N;052-55E;;;-23;-22; 38;383;----;Shasenem;;Turkmenistan;2;41-35N;058-43E;;;62;62; 38;388;----;Ekezhe;;Turkmenistan;2;41-02N;057-45E;;;62;308; 38;392;----;Dashkhovuz;;Turkmenistan;2;41-45N;059-49E;41-50N;059-59E;88;82; 38;396;----;Urgench;;Uzbekistan;2;41-34N;060-34E;;;99;101;P 38;403;----;Buzaubaj;;Uzbekistan;2;41-45N;062-28E;;;98;98;P 38;413;UTSM;Tamdy;;Uzbekistan;2;41-44N;064-37E;41-44N;064-37E;238;237;P 38;423;----;Toruk;;Russia;2;41-48N;066-43E;;;202;; 38;427;----;Mashikuduk;;Uzbekistan;2;41-03N;065-17E;;;200;200; 38;439;----;Cardara;;Kazakhstan;2;41-22N;068-00E;;;240;275;P 38;457;UTTT;Tashkent;;Uzbekistan;2;41-16N;069-16E;41-16N;069-16E;489;488;P 38;462;----;Pskem;;Uzbekistan;2;41-54N;070-22E;;;1258;1258;P 38;466;----;Ters;;Russia;2;41-40N;070-43E;;;1759;; 38;475;----;Andizan;;Uzbekistan;2;40-44N;072-20E;;;;477; 38;507;----;Turkmenbashi;;Turkmenistan;2;40-03N;053-00E;40-02N;052-59E;89;-13; 38;511;----;Chagyl;;Turkmenistan;2;40-47N;055-20E;;;115;115; 38;527;----;Davaly;;Turkmenistan;2;40-04N;057-23E;40-04N;057-23E;46;47; 38;529;----;Derveze;;Turkmenistan;2;40-11N;058-29E;;;84;84; 38;545;----;Darganata;;Turkmenistan;2;40-28N;062-17E;;;143;142; 38;551;----;Dzangeldy;;Uzbekistan;2;40-51N;063-20E;;;208;208; 38;553;----;Ayakagitma;;Uzbekistan;2;40-41N;064-29E;;;219;219; 38;565;----;Nurata;;Uzbekistan;2;40-33N;065-41E;;;501;485;P 38;567;----;Navoi;;Uzbekistan;2;40-08N;065-21E;;;;341; 38;579;UTED;Dzizak;;Uzbekistan;2;40-07N;067-50E;;;345;345;P 38;583;----;Syr-Dar'Ja;;Uzbekistan;2;40-49N;068-41E;;;264;264;P 38;589;----;Jangier;;Uzbekistan;2;40-13N;068-50E;;;;317; 38;599;----;Khudjand;;Tajikistan;2;40-13N;069-44E;40-13N;069-44E;428;427;P 38;606;----;Kokand;;Uzbekistan;2;40-33N;070-57E;40-33N;070-57E;405;499; 38;609;----;Isfara;;Tajikistan;2;40-08N;070-36E;;;874;873;P 38;611;----;Namangan;;Uzbekistan;2;40-59N;071-35E;;;476;474;P 38;613;----;Dzhalal-Abad;;Kyrgyzstan;2;40-55N;072-57E;40-55N;072-57E;764;765;P 38;615;----;Osh;;Kyrgyzstan;2;40-38N;072-48E;;;874;875;P 38;618;----;Fergana;;Uzbekistan;2;40-22N;071-45E;40-22N;071-45E;577;577;P 38;627;----;Gulca;;Russia;2;40-19N;073-33E;;;1555;; 38;634;----;Nebitdag;;Turkmenistan;2;39-30N;054-20E;;;-14;-8; 38;637;----;Ogryda;;Turkmenistan;2;39-06N;053-06E;;;-26;-26; 38;641;----;Jasga;;Turkmenistan;2;39-41N;055-34E;;;-9;-9; 38;647;----;Gazandzhyk;;Turkmenistan;2;39-15N;055-31E;;;35;31; 38;656;----;Erbent;;Turkmenistan;2;39-19N;058-36E;;;89;87; 38;665;----;Akmolla;;Turkmenistan;2;39-35N;059-57E;;;108;108; 38;683;----;Buhara;;Uzbekistan;2;39-43N;064-37E;;;230;226;P 38;684;----;Djachev;;Turkmenistan;2;39-19N;063-12E;;;;182; 38;685;----;Karakul;;Uzbekistan;2;39-30N;063-51E;;;;196; 38;687;----;Chardzhev;;Turkmenistan;2;39-05N;063-36E;39-05N;063-36E;193;190; 38;696;UTSS;Samarkand;;Uzbekistan;2;39-34N;066-57E;39-41N;066-57E;724;724;P 38;705;----;Pendzikent;;Russia;2;39-29N;067-38E;39-29N;067-36E;1015;1015; 38;713;----;Ura-Tyube;;Tajikistan;2;39-54N;069-59E;;;1006;1005;P 38;715;----;Sahristan Pass;;Russia;2;39-35N;068-38E;;;3150;; 38;716;----;Songiston Mountain Station ;;Russia;2;39-23N;068-37E;;;1507;; 38;725;----;Dehauz;;Russia;2;39-26N;069-57E;;;2564;; 38;744;----;Markansu;;Russia;2;39-18N;073-20E;;;4267;; 38;745;----;Sary-Tas;;Russia;2;39-44N;073-16E;;;3155;; 38;750;----;Esengyly;;Turkmenistan;2;37-28N;053-38E;37-28N;053-58E;-23;-22; 38;755;----;Bygdaili;;Turkmenistan;2;38-32N;054-18E;;;;-1; 38;756;----;Bekibent;;Turkmenistan;2;38-37N;055-11E;;;208;206; 38;759;----;Gyzyletrek;;Turkmenistan;2;37-37N;054-47E;;;32;29; 38;763;----;Gyzylarbat;;Turkmenistan;2;38-59N;056-17E;38-59N;056-17E;97;92; 38;767;----;Garryqala;;Turkmenistan;2;38-26N;056-18E;;;315;312; 38;773;----;Bokyrdak;;Turkmenistan;2;38-45N;058-28E;;;87;84; 38;774;----;Bakherden;;Turkmenistan;2;38-26N;057-25E;;;161;159; 38;791;----;Cheshme;;Turkmenistan;2;38-41N;061-12E;;;147;147; 38;799;----;Uchadzhi;;Turkmenistan;2;38-05N;062-48E;;;190;185; 38;804;----;Repatek;;Turkmenistan;2;38-34N;063-11E;;;;185; 38;806;----;Byrdalyk;;Turkmenistan;2;38-28N;064-22E;;;270;212; 38;812;----;Karshi;;Uzbekistan;2;38-48N;065-43E;;;376;376;P 38;815;----;Guzar;;Uzbekistan;2;38-37N;066-16E;;;;524;P 38;816;----;Minchukur;;Uzbekistan;2;38-39N;066-56E;;;2121;2121; 38;818;----;Akrabat;;Uzbekistan;2;38-15N;066-50E;;;1601;1601; 38;829;----;Denau;;Uzbekistan;2;38-16N;067-54E;;;520;520; 38;836;UTDD;Dushanbe;;Tajikistan;2;38-33N;068-47E;38-35N;068-47E;803;800;P 38;840;----;Nurek;;Russia;2;38-25N;069-21E;;;549;; 38;851;----;Garm;;Russia;2;39-02N;070-18E;;;1316;; 38;856;----;Kalaj Humo Valley;;Russia;2;38-25N;070-47E;;;1284;; 38;862;----;Fedcenko Glacier;;Russia;2;38-55N;072-10E;38-55N;072-10E;4169;4169; 38;867;----;Humragi;;Russia;2;38-17N;071-20E;;;1737;; 38;869;----;Irht;;Russia;2;38-08N;072-37E;;;3290;; 38;871;----;Karakul Lake;;Russia;2;39-05N;073-25E;;;3930;; 38;875;----;Akbajtal Pass;;Russia;2;38-31N;073-41E;;;4307;; 38;878;----;Murgab;;Russia;2;38-10N;073-59E;;;3576;; 38;880;----;Ashgabat Keshi;;Turkmenistan;2;37-58N;058-20E;37-58N;058-20E;210;208; 38;885;----;Kaka;;Turkmenistan;2;37-21N;059-38E;;;308;308; 38;886;----;Tedzhen;;Turkmenistan;2;37-23N;060-31E;37-23N;060-31E;188;186; 38;895;----;Bajramaly;;Turkmenistan;2;37-36N;062-11E;;;241;240; 38;899;----;Eloten;;Turkmenistan;2;37-18N;062-25E;;;;259; 38;911;----;Kerki;;Turkmenistan;2;37-50N;065-12E;37-50N;065-12E;242;240; 38;915;----;Carsanga;;Turkmenistan;2;37-31N;066-01E;;;266;265; 38;921;----;Shirabad;;Uzbekistan;2;37-40N;067-01E;;;;410; 38;927;UTST;Termez;;Uzbekistan;2;37-14N;067-16E;37-17N;067-19E;302;310;P 38;933;----;Kurgan-Tyube;;Tajikistan;2;37-49N;068-47E;;;430;429;P 38;937;----;Shaartuz;;Tajikistan;2;37-19N;068-08E;;;380;380; 38;943;----;Kulyab;;Tajikistan;2;37-55N;069-47E;;;;659;P 38;944;----;Parkhar;;Tajikistan;2;37-29N;069-23E;;;446;448; 38;947;----;Pyandj;;Tajikistan;2;37-14N;069-05E;;;;363;P 38;954;----;Khorog;;Tajikistan;2;37-30N;071-30E;37-30N;071-31E;2080;2077;P 38;956;----;Bulun-Kul;;Russia;2;37-42N;072-57E;;;3744;; 38;957;----;Iskasim;;Russia;2;36-44N;071-39E;;;2524;; 38;974;----;Saragt;;Turkmenistan;2;36-32N;061-13E;;;279;275; 38;987;----;Gyshgy;;Turkmenistan;2;35-17N;062-21E;;;630;625; 38;989;----;Tagtabazar;;Turkmenistan;2;35-57N;062-55E;35-54N;062-58E;349;349; 38;998;----;Lekker;;Turkmenistan;2;36-16N;063-42E;;;;787; 40;001;OSKL;Kamishli;;Syria;6;37-03N;041-13E;37-03N;041-13E;455;455;P 40;005;----;Jarablus;;Syria;6;36-49N;038-00E;;;351;351;P 40;007;OSAP;Aleppo International Airport;;Syria;6;36-11N;037-12E;36-20N;037-13E;393;384;P 40;009;----;Tel Abiadh;;Syria;6;36-42N;038-57E;;;348;349;P 40;016;----;Hassakah;;Syria;6;36-30N;040-45E;36-30N;040-45E;307;308;P 40;017;----;Edleb;;Syria;6;35-56N;036-37E;;;450;451;P 40;022;OSLK;Lattakia;;Syria;6;35-32N;035-46E;35-30N;035-47E;7;7;P 40;025;----;Basel Assad International Airport;;Syria;6;35-24N;035-56E;;;48;50;P 40;027;----;Etheria;;Syria;6;35-24N;037-51E;;;458;460;P 40;029;----;Salamya;;Syria;6;35-00N;037-02E;;;480;481;P 40;030;----;Hama;;Syria;6;35-07N;036-45E;35-08N;036-45E;301;303;P 40;039;----;Raqqa;;Syria;6;35-56N;039-01E;35-56N;039-01E;245;246;P 40;041;----;Al-Rastan;;Syria;6;34-56N;036-44E;;;480;450; 40;045;OSDZ;Deir Ezzor;;Syria;6;35-19N;040-09E;35-19N;040-09E;215;212;P 40;050;----;Tartous;;Syria;6;34-53N;035-53E;;;3;5;P 40;055;----;Homs;;Syria;6;34-45N;036-43E;;;483;485;P 40;061;OSPR;Palmyra;;Syria;6;34-33N;038-18E;;;408;404;P 40;066;----;Safita;;Syria;6;34-49N;036-08E;;;353;359;P 40;067;----;Sweida;;Syria;6;32-42N;035-36E;;;995;997; 40;072;----;Abukmal;;Syria;6;34-25N;040-55E;;;180;182;P 40;080;OSDI;Damascus Int. Airport;;Syria;6;33-25N;036-31E;33-25N;036-31E;608;609;P 40;083;----;Nabk;;Syria;6;34-02N;036-43E;;;1330;1333;P 40;087;----;Jabal Ettanf;;Syria;6;33-29N;038-40E;33-29N;038-40E;707;708;P 40;095;----;Dara'A;;Syria;6;32-36N;036-06E;;;543;543;P 40;100;OLBA;Beyrouth Aeroport ;;Lebanon;6;33-49N;035-29E;33-49N;035-29E;29;19; 40;101;----;Houche-Al-Oumara;;Lebanon;6;33-49N;035-51E;;;920;920;P 40;102;----;Rayack;;Lebanon;6;33-52N;036-00E;;;927;920; 40;103;----;Tripoli;;Lebanon;6;34-27N;035-48E;;;6;5;P 40;104;----;Merdjayoun;;Lebanon;6;33-22N;035-35E;;;;773; 40;105;----;Al-Arz Les Cedres ;;Lebanon;6;34-15N;036-03E;34-15N;036-03E;1916;1916; 40;110;----;Dahr Baidar;;Lebanon;6;33-49N;035-46E;;;;1524; 40;155;LLHA;Sde-Haifa Haifa;;Israel;6;32-48N;035-02E;;;8;8;P 40;176;----;Sde-Dov Tel-Aviv ;;Israel;6;32-06N;034-47E;;;4;4;P 40;179;----;Bet Dagan;;Israel;6;32-00N;034-49E;32-00N;034-49E;30;35;P 40;180;LLBG;Ben-Gurion International Airport;;Israel;6;32-00N;034-54E;32-00N;034-54E;40;49;P 40;184;----;Jerusalem;;Israel;6;31-47N;035-13E;;;757;757;P 40;191;LLBS;Beer-Sheva;;Israel;6;31-14N;034-47E;31-14N;034-47E;275;280;P 40;198;LLOV;Ovda;;Israel;6;30-00N;034-50E;;;432;445; 40;199;LLET;Eilat;;Israel;6;29-33N;034-57E;29-33N;034-57E;12;12;P 40;250;OJHR;H-4'Irwaished;;Jordan;6;32-30N;038-12E;;;686;688;P 40;255;OJBD;Irbid;;Jordan;6;32-33N;035-51E;32-33N;035-51E;618;619;P 40;260;OJHF;H-5'Safawi;;Jordan;6;32-12N;037-08E;;;668;670;P 40;265;OJMF;Mafraq;;Jordan;6;32-22N;036-15E;32-22N;036-16E;686;687; 40;270;OJAM;Amman Airport;;Jordan;6;31-59N;035-59E;31-59N;035-59E;767;768;P 40;272;OJAI;Queen Alia Airport;;Jordan;6;31-40N;035-58E;;;721;; 40;280;----;Jericho;;Jordan;6;31-52N;035-30E;;;-276;-275;P 40;290;LLJR;Jerusalem Airport;;Israel;6;31-52N;035-13E;31-52N;035-13E;749;759;P 40;296;----;Ghor El Safi;;Jordan;6;31-02N;035-28E;;;-350;; 40;310;OJMN;Ma'An;;Jordan;6;30-10N;035-47E;30-10N;035-47E;1069;1070;P 40;340;OJAQ;Aqaba Airport;;Jordan;6;29-38N;035-01E;;;53;51; 40;341;----;Aqaba Port;;Jordan;6;29-29N;034-59E;;;2;3;P 40;356;OETR;Turaif;;Saudi Arabia;2;31-41N;038-44E;;;813;852;P 40;357;OERR;Arar;;Saudi Arabia;2;30-54N;041-08E;;;555;549;P 40;360;OEGT;Guriat;;Saudi Arabia;2;31-24N;037-16E;;;509;504;P 40;361;OESK;Al-Jouf;;Saudi Arabia;2;29-47N;040-06E;;;689;689;P 40;362;OERF;Rafha;;Saudi Arabia;2;29-37N;043-29E;;;449;444;P 40;373;OEPA;Al Qaysumah;;Saudi Arabia;2;28-19N;046-07E;28-20N;046-07E;358;360;P 40;375;OETB;Tabuk;;Saudi Arabia;2;28-22N;036-36E;28-22N;036-35E;778;768;P 40;376;----;Tayma;;Saudi Arabia;2;27-36N;038-36E;;;860;; 40;377;OEKK;Hafr Al-Batin;;Saudi Arabia;2;27-54N;045-32E;;;413;414; 40;380;----;Al-Khafji;;Saudi Arabia;2;28-26N;048-30E;;;8;; 40;394;OEHL;Hail;;Saudi Arabia;2;27-26N;041-41E;27-31N;041-44E;1015;1013;P 40;400;OEWJ;Wejh;;Saudi Arabia;2;26-12N;036-28E;26-14N;036-26E;20;21;P 40;405;OEGS;Gassim;;Saudi Arabia;2;26-18N;043-46E;;;648;650;P 40;410;----;Khayber;;Saudi Arabia;2;25-40N;039-18E;;;;754; 40;415;OEDF;Dammam-King Fahd International Airport;;Saudi Arabia;2;26-28N;049-47E;;;22;; 40;416;OEDR;Dhahran;;Saudi Arabia;2;26-16N;050-09E;26-16N;050-10E;26;17;P 40;419;----;Dammam;;Saudi Arabia;2;26-24N;050-06E;;;10;; 40;420;OEAH;Al Ahsa;;Saudi Arabia;2;25-18N;049-29E;;;179;178;P 40;421;----;Hufuf;;Saudi Arabia;2;25-18N;049-38E;;;151;151; 40;430;OEMA;Madinah;;Saudi Arabia;2;24-33N;039-42E;24-33N;039-43E;654;636;P 40;432;----;Uqlat As Suqur;;Saudi Arabia;2;25-50N;042-14E;;;783;783; 40;435;OEDW;Dawadmi;;Saudi Arabia;2;24-30N;044-21E;;;990;991;P 40;437;OERK;King Khaled International Airport;;Saudi Arabia;2;24-56N;046-43E;24-56N;046-43E;614;612;P 40;438;OERY;Riyadh;;Saudi Arabia;2;24-43N;046-44E;24-42N;046-44E;635;620;P 40;439;OEYN;Yenbo;;Saudi Arabia;2;24-09N;038-04E;;;8;10;P 40;440;----;Yenbo;;Saudi Arabia;2;24-01N;038-13E;;;11;11; 40;445;----;Al-Kharj;;Saudi Arabia;2;24-09N;047-18E;;;439;439; 40;450;----;Al-Khusaria;;Saudi Arabia;2;23-43N;044-38E;;;1080;; 40;550;----;Abdaly;;Kuwait;2;30-05N;047-42E;;;;70; 40;552;----;Warba;;Kuwait;2;30-00N;048-06E;;;;3; 40;564;----;Umm Al-Aish;;Kuwait;2;29-48N;047-46E;;;;34; 40;568;----;Bubiyan;;Kuwait;2;29-47N;048-22E;;;;3; 40;570;----;Al-Salmi;;Kuwait;2;29-07N;046-40E;;;;290; 40;580;----;Experimental Farm;;Kuwait;2;29-17N;047-56E;;;;21; 40;581;----;Shuwaikh;;Kuwait;2;29-20N;048-03E;;;;11; 40;582;OKBK;Kuwait Internationalairport;;Kuwait;2;29-13N;047-59E;29-13N;047-59E;55;55;P 40;583;----;Ahmadi;;Kuwait;2;29-06N;048-08E;;;122;122; 40;584;----;Fahaaheel;;Kuwait;2;29-04N;048-09E;;;;16; 40;585;----;Al-Shuaiba;;Kuwait;2;29-02N;048-09E;29-02N;048-09E;6;6; 40;588;----;Failaka Island;;Kuwait;2;29-28N;048-17E;;;;5; 40;592;----;Al-Wafra;;Kuwait;2;28-34N;048-04E;;;;105; 40;594;----;Al-Nwaiseeb;;Kuwait;2;28-30N;048-28E;;;;3; 40;596;----;Umm-Al-Maradim;;Kuwait;2;28-41N;048-39E;;;;3; 40;602;----;Rabiah;;Iraq;2;36-48N;042-06E;;;382;382; 40;604;----;Sinjar;;Iraq;2;36-19N;041-50E;;;476;476;P 40;605;----;Zakho;;Iraq;2;37-08N;042-41E;;;;442; 40;608;ORBM;Mosul;;Iraq;2;36-19N;043-09E;36-19N;043-09E;223;223;P 40;611;----;Salahaddin;;Iraq;2;36-37N;044-13E;;;1088;1088;P 40;621;----;Kirkuk;;Iraq;2;35-28N;044-24E;;;;331;P 40;622;----;Chamchamal;;Iraq;2;35-25N;045-08E;;;701;701; 40;623;----;Sulaimaniya;;Iraq;2;35-33N;045-27E;;;853;853;P 40;629;----;Ana;;Iraq;2;34-28N;041-57E;;;;150; 40;631;----;Baiji;;Iraq;2;34-56N;043-29E;;;150;; 40;634;----;Haditha;;Iraq;2;34-04N;042-22E;;;140;140;P 40;637;----;Kanaqin;;Iraq;2;34-18N;045-26E;;;202;202;P 40;641;----;Toraybeel;;Iraq;2;32-43N;038-44E;;;;800; 40;642;----;Rutbah;;Iraq;2;33-02N;040-17E;33-02N;040-17E;615;615;P 40;644;----;H1;;Iraq;2;33-47N;041-38E;;;409;409; 40;650;ORBB;Baghdad;;Iraq;2;33-14N;044-14E;33-14N;044-14E;34;34;P 40;653;----;Tickreet;;Iraq;2;34-35N;044-18E;;;;107; 40;656;----;Karbalaa;;Iraq;2;32-37N;044-01E;;;29;29; 40;658;----;Nukaib;;Iraq;2;32-02N;042-15E;32-02N;042-15E;305;305; 40;665;----;Kut-Al-Hai;;Iraq;2;32-10N;046-03E;;;15;15;P 40;670;----;Najaf;;Iraq;2;31-59N;044-19E;;;32;32;P 40;672;----;Diwaniya;;Iraq;2;31-59N;044-59E;;;20;20;P 40;674;----;Semawa;;Iraq;2;31-18N;045-16E;;;6;6; 40;676;----;Nasiriya;;Iraq;2;31-05N;046-14E;31-05N;046-14E;3;3;P 40;680;----;Amarah;;Iraq;2;31-51N;047-10E;;;9;9;P 40;684;----;Al-Salman;;Iraq;2;30-30N;044-32E;;;202;202; 40;686;----;Bussaya;;Iraq;2;30-06N;046-07E;;;144;144; 40;688;ORMS;Shaibah / Basrah;;Iraq;2;30-25N;047-39E;;;19;; 40;689;----;Basrah;;Iraq;2;30-34N;047-47E;;;;2;P 40;691;----;Fao;;Iraq;2;29-59N;048-30E;;;;2; 40;700;----;Pars Abad Moghan;;Iran;2;39-39N;048-08E;;;45;45; 40;701;----;Makko;;Iran;2;39-20N;044-26E;;;1470;1470; 40;703;OITK;Khoy;;Iran;2;38-33N;044-58E;;;1107;1107;P 40;704;----;Ahar;;Iran;2;38-26N;047-04E;;;1390;1390; 40;706;OITT;Tabriz;;Iran;2;38-05N;046-17E;38-08N;046-15E;1367;1361;P 40;708;----;Ardebil;;Iran;2;38-15N;048-17E;;;1342;1342; 40;710;----;Sarab;;Iran;2;37-56N;047-32E;;;1500;; 40;712;OITR;Orumieh;;Iran;2;37-32N;045-05E;;;1297;1312;P 40;713;----;Maragheh;;Iran;2;37-24N;046-16E;;;1475;1476; 40;718;----;Anzali;;Iran;2;37-28N;049-28E;;;-23;-23;P 40;719;OIGG;Rasht;;Iran;2;37-12N;049-38E;;;-7;37;P 40;723;OIMN;Bojnourd;;Iran;2;37-28N;057-20E;;;1074;1074; 40;726;----;Mohabad;;Iran;2;36-46N;045-43E;;;1384;1385; 40;727;OITS;Saghez;;Iran;2;36-15N;046-16E;;;1493;1493;P 40;729;OITZ;Zanjan;;Iran;2;36-41N;048-29E;;;1663;1663;P 40;731;OIIK;Ghazvin;;Iran;2;36-15N;050-00E;;;1278;1278;P 40;732;OINR;Ramsar;;Iran;2;36-54N;050-40E;;;-23;-20;P 40;734;----;Noshahr;;Iran;2;36-30N;051-35E;;;-25;-20; 40;736;----;Babulsar;;Iran;2;36-43N;052-39E;;;-21;-21;P 40;737;----;Gharakhil;;Iran;2;36-27N;052-49E;;;12;14; 40;738;OING;Gorgan;;Iran;2;36-49N;054-28E;36-51N;054-28E;155;155;P 40;739;----;Shahrud;;Iran;2;36-25N;055-02E;;;1345;1345;P 40;740;----;Ghuchan;;Iran;2;36-51N;054-16E;;;1286;1287; 40;741;----;Sarakhs;;Iran;2;36-33N;061-10E;;;236;236; 40;743;OIMS;Sabzevar;;Iran;2;36-13N;057-40E;;;941;941;P 40;745;OIMM;Mashhad;;Iran;2;36-16N;059-38E;36-16N;059-38E;989;980;P 40;747;OICS;Sanandaj;;Iran;2;35-20N;047-00E;;;1373;1373;P 40;754;OIII;Tehran-Mehrabad;;Iran;2;35-41N;051-21E;35-41N;051-19E;1204;1191;P 40;757;OIIS;Semnan;;Iran;2;35-33N;053-23E;;;1171;1171;P 40;762;OIMH;Torbat-Heydarieh;;Iran;2;35-16N;059-13E;;;1333;1333;P 40;763;----;Kashmar;;Iran;2;35-12N;058-28E;;;1060;1060; 40;765;OICG;Ghasre-Shirin;;Iran;2;34-31N;045-35E;;;378;; 40;766;OICC;Kermanshah;;Iran;2;34-16N;047-07E;34-21N;047-09E;1320;1322;P 40;768;----;Hamedan;;Iran;2;34-51N;048-32E;;;1749;1749; 40;769;OIHR;Arak;;Iran;2;34-06N;049-24E;;;1720;1720;P 40;780;----;Ilam;;Iran;2;33-38N;046-25E;;;1362;1363; 40;782;----;Khorram Abad;;Iran;2;33-30N;048-18E;;;1125;1125;P 40;783;----;Ali-Goodarz;;Iran;2;32-24N;049-41E;;;1972;1972; 40;785;OIFK;Kashan;;Iran;2;33-59N;051-27E;;;982;982;P 40;789;----;Khor;;Iran;2;33-47N;055-05E;33-47N;055-05E;921;921; 40;791;OIMT;Tabas;;Iran;2;33-36N;056-55E;;;710;711; 40;792;----;Ferdous;;Iran;2;34-01N;058-10E;;;1292;1293; 40;794;----;Safi-Abad Dezful;;Iran;2;32-16N;048-26E;;;82;82; 40;798;OIFS;Shahre-Kord;;Iran;2;32-20N;050-51E;;;2078;1991;P 40;800;OIFM;Esfahan;;Iran;2;32-28N;051-43E;32-37N;051-40E;1590;1550;P 40;809;OIMB;Birjand;;Iran;2;32-52N;059-12E;32-52N;059-12E;1491;1491;P 40;811;OIAW;Ahwaz;;Iran;2;31-20N;048-40E;;;20;22;P 40;812;OIAI;Masjed-Soleyman;;Iran;2;31-59N;049-16E;;;372;372;P 40;818;OISA;Abadeh;;Iran;2;31-11N;052-40E;;;2004;2004; 40;821;OIYY;Yazd;;Iran;2;31-54N;054-24E;;;1238;1230;P 40;827;----;Nehbandan;;Iran;2;31-32N;060-02E;;;1211;1211; 40;829;OIZB;Zabol;;Iran;2;31-20N;061-29E;;;489;489;P 40;831;OIAA;Abadan;;Iran;2;30-22N;048-15E;;;3;11;P 40;833;OIAG;Omidieh;;Iran;2;30-46N;049-40E;;;29;27;P 40;835;OIAH;Gach Saran Du Gunbadan;;Iran;2;30-26N;050-46E;;;738;699;P 40;836;----;Yasoge;;Iran;2;30-50N;051-41E;;;1880;1880; 40;841;OIKK;Kerman;;Iran;2;30-15N;056-58E;30-15N;056-58E;1748;1754;P 40;845;----;Kharg;;Iran;2;29-16N;050-16E;;;3;3;P 40;848;OISS;Shiraz;;Iran;2;29-32N;052-35E;29-32N;052-35E;1486;1491;P 40;851;----;Sirjan;;Iran;2;29-28N;055-43E;;;1737;1739; 40;853;----;Baft;;Iran;2;29-14N;056-35E;;;2258;2258; 40;854;OIKM;Bam;;Iran;2;29-06N;058-24E;;;1067;1067;P 40;856;OIZH;Zahedan;;Iran;2;29-28N;060-53E;29-28N;060-53E;1370;1370;P 40;857;----;Bushehr;;Iran;2;28-57N;050-51E;;;8;8; 40;858;OIBB;Bushehr Civ / Afb ;;Iran;2;28-59N;050-50E;;;19;; 40;859;OISF;Fasa;;Iran;2;28-58N;053-41E;;;1383;1383;P 40;875;OIKB;Bandarabbass;;Iran;2;27-13N;056-22E;27-13N;056-22E;10;10;P 40;878;----;Saravan;;Iran;2;27-20N;062-20E;;;1195;1195; 40;879;OIZI;Iranshahr;;Iran;2;27-12N;060-42E;;;591;591;P 40;882;----;Kish Island;;Iran;2;26-32N;054-00E;;;30;32; 40;883;OIBL;Bandar Lengeh;;Iran;2;26-35N;054-50E;;;14;14;P 40;889;----;Siri Island;;Iran;2;25-53N;054-29E;;;16;17; 40;890;----;Abu Musa;;Iran;2;25-50N;054-50E;;;6;6; 40;893;OIZJ;Jask;;Iran;2;26-38N;057-46E;;;3;4; 40;897;----;Konarak;;Iran;2;25-26N;060-22E;;;5;10; 40;898;OIZC;Chahbahar;;Iran;2;25-25N;060-45E;;;6;6;P 40;904;OAFZ;Faizabad;;Afghanistan;2;37-07N;070-31E;;;1200;1200; 40;905;----;Shighnan;;Afghanistan;2;37-34N;071-30E;;;;2265; 40;906;----;Andkhoi;;Afghanistan;2;36-56N;065-07E;;;;310; 40;908;OASG;Shebirghan;;Afghanistan;2;36-40N;065-43E;;;360;360; 40;909;----;Qar-Qin;;Afghanistan;2;37-25N;066-05E;;;;262; 40;911;OAMS;Mazar-I-Sharif;;Afghanistan;2;36-42N;067-12E;;;378;378; 40;913;----;Kunduz;;Afghanistan;2;36-40N;068-55E;;;;433; 40;914;----;Baghlan-Farm;;Afghanistan;2;36-06N;068-39E;;;;550; 40;916;----;Hairatan;;Afghanistan;2;37-13N;067-25E;;;300;300; 40;918;----;Iskachem;;Afghanistan;2;36-42N;071-34E;;;;2620; 40;920;OAZB;Zebak;;Afghanistan;2;36-30N;071-15E;;;2600;2600; 40;921;----;Turghundi;;Afghanistan;2;35-14N;062-17E;;;680;680; 40;922;----;Mimana;;Afghanistan;2;35-56N;064-46E;;;;815; 40;923;----;Bala-Moorghab;;Afghanistan;2;35-35N;063-19E;;;;470; 40;925;----;Qaisar;;Afghanistan;2;35-40N;064-16E;;;;1300; 40;930;----;North-Salang;;Afghanistan;2;35-19N;069-01E;;;3366;3366; 40;931;----;South-Salang;;Afghanistan;2;35-18N;069-04E;;;3172;3172; 40;932;OAJS;Jabul-Saraj;;Afghanistan;2;35-08N;069-15E;;;1630;1630; 40;935;----;Islam-Qala;;Afghanistan;2;34-39N;061-35E;;;;800; 40;937;----;Qala-I-Now;;Afghanistan;2;35-00N;063-07E;;;;914; 40;938;OAHR;Herat;;Afghanistan;2;34-13N;062-13E;34-13N;062-13E;964;964; 40;940;----;Obe;;Afghanistan;2;34-22N;063-09E;;;;1298; 40;942;----;Chakhcharan;;Afghanistan;2;33-32N;068-25E;;;;2183; 40;945;----;Bamiyan;;Afghanistan;2;34-49N;067-49E;34-49N;067-49E;;2550; 40;948;OAKB;Kabul Airport;;Afghanistan;2;34-38N;069-12E;;;1789;; 40;949;----;Karizimir;;Afghanistan;2;34-38N;069-03E;;;;1905; 40;950;----;Logar;;Afghanistan;2;34-06N;069-03E;;;;1935; 40;951;----;Sarobi;;Afghanistan;2;34-35N;069-45E;;;;1020; 40;952;----;Laghman;;Afghanistan;2;34-39N;070-13E;;;;770; 40;953;----;Ghaziabad;;Afghanistan;2;34-19N;070-46E;;;;510; 40;954;OAJL;Jalalabad;;Afghanistan;2;34-26N;070-28E;;;580;580; 40;957;OASD;Shindand;;Afghanistan;2;33-24N;062-17E;;;1150;1150; 40;968;----;Ghazni;;Afghanistan;2;33-32N;068-25E;;;;2183; 40;970;----;Gardiz;;Afghanistan;2;33-37N;069-14E;;;;2350; 40;971;----;Khost;;Afghanistan;2;33-21N;069-57E;;;;1146; 40;974;OAFR;Farah;;Afghanistan;2;32-22N;062-11E;;;700;700; 40;977;----;Tirin Kot;;Afghanistan;2;32-37N;065-52E;;;;1350; 40;980;----;Mokur;;Afghanistan;2;32-50N;067-47E;;;;2000; 40;984;----;Urgoon;;Afghanistan;2;32-55N;069-08E;;;;2262; 40;986;OAZG;Zaranj;;Afghanistan;2;31-00N;061-51E;;;478;478; 40;988;----;Bust;;Afghanistan;2;31-33N;064-22E;;;;780; 40;990;----;Kandahar Airport;;Afghanistan;2;31-30N;065-51E;;;;1010; 40;996;----;Deshoo;;Afghanistan;2;30-26N;063-18E;;;;590; 41;006;----;Muwaih;;Saudi Arabia;2;22-26N;041-45E;;;;970;P 41;010;----;Layla;;Saudi Arabia;2;22-19N;046-43E;;;543;543; 41;014;----;Obaylah;;Saudi Arabia;2;21-59N;050-56E;;;588;144; 41;016;----;Shawalah;;Saudi Arabia;2;22-20N;054-00E;;;;468; 41;020;----;Jeddah / I. E.;;Saudi Arabia;2;21-25N;039-13E;;;10;10; 41;024;OEJN;Jeddah King Abdul Aziz International Airport ;;Saudi Arabia;2;21-42N;039-11E;21-40N;039-09E;15;17;P 41;026;OEJD;Jeddah ;;Saudi Arabia;2;21-30N;039-12E;;;15;; 41;030;OEMK;Makkah;;Saudi Arabia;2;21-26N;039-46E;;;310;240;P 41;035;----;Al-Hada;;Saudi Arabia;2;21-20N;040-16E;;;2089;2089; 41;036;OETF;Taif;;Saudi Arabia;2;21-29N;040-33E;;;1478;1454;P 41;055;OEBA;Al Baha;;Saudi Arabia;2;20-18N;041-38E;;;1652;1662;P 41;060;----;Wadi Al Dawasser;;Saudi Arabia;2;20-26N;044-41E;;;;701; 41;061;OEWD;Wadi Al Dawasser Airport;;Saudi Arabia;2;20-30N;045-12E;;;624;622;P 41;080;----;Al-Qunfudah;;Saudi Arabia;2;19-07N;041-25E;;;0;0; 41;084;OEBH;Bisha;;Saudi Arabia;2;19-59N;042-37E;;;1167;1163;P 41;112;OEAB;Abha;;Saudi Arabia;2;18-14N;042-39E;;;2090;2093;P 41;114;OEKM;Khamis Mushait;;Saudi Arabia;2;18-18N;042-48E;18-18N;042-48E;2066;2056;P 41;128;OENG;Najran;;Saudi Arabia;2;17-37N;044-25E;;;1212;1210;P 41;136;OESH;Sharurah;;Saudi Arabia;2;17-28N;047-07E;;;720;725;P 41;140;OEGN;Gizan;;Saudi Arabia;2;16-54N;042-35E;16-52N;042-35E;6;7;P 41;141;----;Gizan;;Saudi Arabia;2;16-54N;042-30E;;;6;5; 41;150;OBBI;Bahrain International Airport ;;Bahrain;2;26-16N;050-39E;;;2;2; 41;168;----;Doha Port;;Qatar;2;25-18N;051-33E;;;3;4; 41;170;OTBD;Doha International Airport;;Qatar;2;25-15N;051-34E;25-16N;051-33E;11;10; 41;176;----;Umm Said;;Qatar;2;24-54N;051-33E;;;4;5; 41;184;OMRK;Ras Al Khaimah International Airport;;United Arab Emirates;2;25-37N;055-56E;;;31;31; 41;194;OMDB;Dubai International Airport;;United Arab Emirates;2;25-15N;055-20E;;;8;5; 41;196;OMSJ;Sharjah International Airport;;United Arab Emirates;2;25-20N;055-31E;;;35;33; 41;198;OMFJ;Fujairah;;United Arab Emirates;2;25-06N;056-20E;;;28;28; 41;216;OMAD;Abu Dhabi Bateen Airport;;United Arab Emirates;2;24-26N;054-28E;;;5;3; 41;217;OMAA;Abu Dhabi International Airport;;United Arab Emirates;2;24-26N;054-39E;24-26N;054-39E;16;27; 41;218;OMAL;Al Ain International Airport;;United Arab Emirates;2;24-16N;055-36E;;;265;262; 41;226;----;Medina Zayed;;United Arab Emirates;2;23-38N;053-38E;;;;130; 41;240;OOKB;Khassab;;Oman;2;26-13N;056-14E;;;3;; 41;244;OOBR;Buraimi;;Oman;2;24-14N;055-47E;;;299;; 41;246;OOSH; Sohar Majis;;Oman;2;24-28N;056-38E;;;4;; 41;254;OOSQ;Saiq;;Oman;2;23-04N;057-39E;;;1755;; 41;256;OOMS;Seeb, International Airport;;Oman;2;23-35N;058-17E;23-35N;058-17E;8;17;P 41;258;----;Qaboos Port;;Oman;2;23-38N;058-34E;;;4;; 41;262;OOFD;Fahud;;Oman;2;22-21N;056-29E;;;170;; 41;268;OOSR;Sur;;Oman;2;22-32N;059-29E;;;14;; 41;288;OOMA;Masirah;;Oman;2;20-40N;058-54E;20-40N;058-54E;19;19;P 41;304;----;Marmul;;Oman;2;18-08N;055-11E;;;269;; 41;312;----;Raysut Port;;Oman;2;16-55N;053-55E;;;33;; 41;314;OOTH;Thumrait;;Oman;2;17-40N;054-02E;;;467;; 41;316;OOSA;Salalah;;Oman;2;17-02N;054-05E;17-02N;054-05E;20;17;P 41;326;OYZM;Al-Hazm ;;Yemen;2;16-12N;044-47E;;;1900;; 41;344;----;Sana'A Civ / Mil ;;Yemen;2;15-31N;044-11E;15-31N;044-11E;2190;2206; 41;350;OYMB;Marib ;;Yemen;2;15-26N;045-20E;;;1000;; 41;360;----;Hodeidah Civ / Mil ;;Yemen;2;14-45N;042-58E;14-45N;042-59E;115;9; 41;363;----;Al-Bouqe;;Yemen;2;17-19N;044-36E;;;;1154; 41;367;----;Thamud;;Yemen;2;17-22N;050-57E;;;;610; 41;372;----;Saada;;Yemen;2;17-02N;043-46E;;;;1890; 41;382;OYMK;Mokha ;;Yemen;2;13-15N;043-17E;;;3;; 41;390;----;Taiz Civ / Mil ;;Yemen;2;13-41N;044-09E;13-38N;044-04E;1385;1411; 41;391;----;Hajjah;;Yemen;2;15-50N;043-35E;;;1760;1760; 41;393;----;Al-Jouf;;Yemen;2;16-09N;044-47E;;;;1070; 41;396;----;Seiyoun;;Yemen;2;15-59N;048-57E;;;700;700; 41;398;----;Al-Ghaidah;;Yemen;2;16-05N;052-05E;;;42;42; 41;404;OYSN;Sana'A;;Yemen;2;15-31N;044-11E;15-23N;044-12E;2206;2190; 41;407;----;Marib;;Yemen;2;15-26N;045-20E;;;1070;1070; 41;408;----;Al-Mahwit;;Yemen;2;15-30N;043-30E;;;;; 41;416;----;Kamaran;;Yemen;2;15-22N;042-35E;;;;15; 41;431;OYHD;Hodeidah;;Yemen;2;14-45N;042-59E;;;115;115; 41;434;----;Dhamar;;Yemen;2;14-35N;044-25E;;;;2425; 41;437;OYAT;Ataq;;Yemen;2;14-31N;046-51E;;;1067;1067; 41;443;OYAR;Riyan;;Yemen;2;14-39N;049-23E;;;16;25; 41;448;----;Riyan ;;Yemen;2;14-35N;049-15E;;;25;; 41;451;----;Mukeiras;;Yemen;2;13-25N;045-41E;;;;1800; 41;452;----;Ibb;;Yemen;2;14-00N;044-20E;;;;1920; 41;453;----;Al-Baydha;;Yemen;2;14-06N;045-26E;;;;2027; 41;466;OYTZ;Taiz;;Yemen;2;13-41N;044-08E;;;1402;1385; 41;477;OYMC;Mokha;;Yemen;2;13-15N;044-08E;;;4;3; 41;480;OYAA;Aden;;Yemen;2;12-40N;045-02E;;;3;3; 41;494;OYSQ;Socotra;;Yemen;2;12-38N;053-54E;12-38N;053-54E;45;47; 41;506;----;Chitral;;Pakistan;2;35-51N;071-50E;;;1499;1500;P 41;508;----;Dir;;Pakistan;2;35-12N;071-51E;;;1369;1370; 41;515;----;Drosh;;Pakistan;2;35-34N;071-47E;35-33N;071-48E;1464;1465;P 41;523;----;Saidu Sharif;;Pakistan;2;34-44N;072-21E;;;950;951; 41;530;OPPS;Peshawar;;Pakistan;2;34-01N;071-35E;34-01N;071-35E;359;360;P 41;531;----;Battal;;Pakistan;2;34-35N;073-09E;;;1676;; 41;533;OPRS;Risalpur;;Pakistan;2;34-04N;071-59E;;;315;317;P 41;535;----;Kakul;;Pakistan;2;34-11N;073-15E;;;1308;1309;P 41;536;----;Balakot;;Pakistan;2;34-23N;073-21E;;;980;981;P 41;560;----;Parachinar;;Pakistan;2;33-52N;070-05E;33-54N;070-06E;1725;1726;P 41;564;----;Kohat;;Pakistan;2;33-34N;071-26E;;;511;513;P 41;565;----;Cherat;;Pakistan;2;33-49N;071-53E;;;1371;1372;P 41;571;OPRN;Islamabad Airport;;Pakistan;2;33-37N;073-06E;33-37N;073-06E;507;508;P 41;573;----;Murree;;Pakistan;2;33-55N;073-23E;;;2126;2127; 41;592;OPMI;Mianwali;;Pakistan;2;32-33N;071-31E;;;210;212;P 41;594;OPSR;Sargodha;;Pakistan;2;32-03N;072-40E;32-03N;072-40E;187;188;P 41;598;----;Jhelum;;Pakistan;2;32-56N;073-43E;32-56N;073-43E;232;234;P 41;600;----;Sialkot;;Pakistan;2;32-30N;074-32E;;;255;256;P 41;620;----;Zhob;;Pakistan;2;31-21N;069-28E;31-21N;069-28E;1405;1407;P 41;624;OPDI;Dera Ismail Khan;;Pakistan;2;31-49N;070-55E;31-49N;070-55E;172;173;P 41;640;OPLH;Lahore City;;Pakistan;2;31-33N;074-20E;31-33N;074-20E;214;215;P 41;641;OPLA;Lahore Airport;;Pakistan;2;31-31N;074-24E;;;216;217;P 41;652;----;Dera Ghazi Khan;;Pakistan;2;30-03N;070-38E;;;123;125;P 41;660;OPQT;Quetta Airport;;Pakistan;2;30-15N;066-53E;;;1587;1589;P 41;661;----;Quetta Sheikh Manda ;;Pakistan;2;30-16N;066-55E;30-11N;066-57E;1620;1621;P 41;675;OPMT;Multan;;Pakistan;2;30-12N;071-26E;30-12N;071-26E;122;123;P 41;678;----;Bahawalnagar;;Pakistan;2;29-57N;073-15E;29-58N;073-15E;162;163;P 41;685;----;Bar Khan;;Pakistan;2;29-53N;069-43E;29-54N;069-31E;1097;1098;P 41;697;OPSB;Sibi;;Pakistan;2;29-33N;067-53E;;;133;134;P 41;700;----;Bahawalpur;;Pakistan;2;29-24N;071-47E;;;112;113;P 41;710;----;Nokkundi;;Pakistan;2;28-49N;062-45E;28-49N;062-45E;682;683;P 41;712;----;Dal Bandin;;Pakistan;2;28-53N;064-24E;28-53N;064-24E;848;850;P 41;715;OPJA;Jacobabad;;Pakistan;2;28-18N;068-28E;28-18N;068-28E;55;56;P 41;718;----;Khanpur;;Pakistan;2;28-39N;070-41E;28-39N;070-41E;87;88;P 41;725;----;Rohri;;Pakistan;2;27-40N;068-54E;;;67;68;P 41;739;OPPG;Panjgur;;Pakistan;2;26-58N;064-06E;26-58N;064-06E;980;981;P 41;744;----;Khuzdar;;Pakistan;2;27-50N;066-38E;27-50N;066-38E;1231;1232;P 41;746;----;Pad Idan;;Pakistan;2;26-51N;068-08E;;;46;47;P 41;749;OPNH;Nawabshah;;Pakistan;2;26-15N;068-22E;26-15N;068-22E;37;38;P 41;756;OPJI;Jiwani;;Pakistan;2;25-04N;061-48E;25-04N;061-48E;56;57;P 41;759;----;Pasni;;Pakistan;2;25-16N;063-29E;;;4;6;P 41;764;OPKD;Hyderabad Airport;;Pakistan;2;25-23N;068-25E;;;40;41;P 41;768;----;Chhor;;Pakistan;2;25-31N;069-47E;25-31N;069-47E;5;6;P 41;780;OPKC;Karachi Airport;;Pakistan;2;24-54N;067-08E;24-54N;067-08E;21;22;P 41;781;----;Karachi Masroor;;Pakistan;2;24-54N;066-56E;;;11;16;P 41;782;----;Karachi Manora;;Pakistan;2;24-48N;066-59E;;;2;4;P 41;785;----;Badin;;Pakistan;2;24-38N;068-54E;;;10;11;P 41;852;----;Thakurgaon;;Bangladesh;2;26-01N;088-24E;;;;; 41;858;----;Saidpur;;Bangladesh;2;25-45N;088-55E;;;39;44;P 41;859;----;Rangpur;;Bangladesh;2;25-44N;089-14E;25-45N;089-15E;33;34;P 41;863;----;Dinajpur;;Bangladesh;2;25-39N;088-41E;;;36;37;P 41;883;----;Bogra;;Bangladesh;2;24-51N;089-22E;24-51N;089-22E;18;20;P 41;884;----;Jamalpur;;Bangladesh;2;24-56N;089-57E;;;18;20; 41;886;----;Mymensingh;;Bangladesh;2;24-43N;090-26E;;;18;19;P 41;890;----;Sylhet A. P.;;Bangladesh;2;24-58N;091-53E;;;;; 41;891;VGSY;Sylhet;;Bangladesh;2;24-54N;091-53E;24-54N;091-53E;34;35;P 41;895;VGRJ;Rajshahi;;Bangladesh;2;24-22N;088-42E;24-22N;088-42E;17;20;P 41;898;----;Serajgonj;;Bangladesh;2;24-27N;089-42E;;;13;15; 41;907;VGIS;Ishurdi;;Bangladesh;2;24-08N;089-03E;24-09N;089-02E;13;14;P 41;909;----;Tangail;;Bangladesh;2;24-15N;089-56E;;;;; 41;915;----;Srimangal;;Bangladesh;2;24-18N;091-44E;;;22;23;P 41;921;----;Joydevpur;;Bangladesh;2;23-59N;090-25E;;;;; 41;922;VGZR;Kurmitola, Dia;;Bangladesh;2;23-51N;090-24E;;;9;10;P 41;923;VGTJ;Dhaka;;Bangladesh;2;23-46N;090-23E;23-46N;090-23E;8;9;P 41;926;----;Chuadanga;;Bangladesh;2;23-39N;088-49E;;;;12;P 41;929;----;Farodpur;;Bangladesh;2;23-36N;089-51E;;;8;9;P 41;933;----;Comilla;;Bangladesh;2;23-26N;091-11E;;;9;10;P 41;936;VGJR;Jessore;;Bangladesh;2;23-11N;089-10E;23-11N;089-10E;6;7;P 41;939;----;Madaripur;;Bangladesh;2;23-10N;090-11E;;;7;13;P 41;941;----;Chandpur;;Bangladesh;2;23-16N;090-42E;;;6;7;P 41;943;----;Feni;;Bangladesh;2;23-02N;091-25E;23-02N;091-25E;6;8;P 41;946;----;Satkhira;;Bangladesh;2;22-43N;089-05E;;;4;6;P 41;947;----;Khulna;;Bangladesh;2;22-47N;089-32E;;;3;4;P 41;950;----;Barisal;;Bangladesh;2;22-45N;090-22E;22-43N;090-22E;3;4;P 41;951;----;Bhola;;Bangladesh;2;22-41N;090-39E;;;4;5;P 41;953;----;Maijdicourt;;Bangladesh;2;22-52N;091-06E;;;5;6;P 41;960;----;Patuakhali;;Bangladesh;2;22-20N;090-20E;;;2;3;P 41;963;----;Hatia;;Bangladesh;2;22-26N;091-06E;;;2;4;P 41;964;----;Sandwip;;Bangladesh;2;22-29N;091-26E;;;2;6;P 41;965;----;Sitakundu;;Bangladesh;2;22-35N;091-42E;;;6;10;P 41;966;----;Rangamati;;Bangladesh;2;22-38N;092-12E;;;63;63;P 41;967;----;Kaptai;;Bangladesh;2;22-29N;092-14E;;;26;31; 41;977;----;Chittagong Ambagan ;;Bangladesh;2;22-21N;091-49E;22-21N;091-49E;33;34;P 41;978;VGEG;Chittagong Patenga ;;Bangladesh;2;22-16N;091-49E;22-15N;091-49E;4;6;P 41;984;----;Khepupara;;Bangladesh;2;21-59N;090-14E;;;2;9;P 41;989;----;Kutubdia;;Bangladesh;2;21-49N;091-51E;;;2;7; 41;992;VGCB;Cox's Bazar;;Bangladesh;2;21-26N;091-58E;21-26N;091-58E;2;4;P 41;998;----;Teknaf;;Bangladesh;2;20-52N;092-18E;;;5;6;P 42;026;----;Gulmarg;;India;2;34-03N;074-24E;;;2652;2655; 42;027;----;Srinagar;;India;2;34-05N;074-50E;34-05N;074-50E;1585;1587;P 42;029;----;Sonamarg;;India;2;34-19N;075-19E;;;2515;; 42;030;----;Dras;;India;2;34-26N;075-46E;;;3066;; 42;042;----;Srinagar;;India;2;33-59N;074-47E;;;1664;1666; 42;044;----;Qazi Gund;;India;2;33-35N;075-05E;;;;1690; 42;045;----;Banihal;;India;2;33-30N;075-10E;;;1624;1630; 42;056;----;Jammu;;India;2;32-40N;074-50E;;;366;367; 42;059;----;Dalhousie;;India;2;32-32N;075-58E;;;1957;1959; 42;060;----;Kathua;;India;2;32-20N;075-30E;;;380;; 42;062;----;Dharmsala;;India;2;32-16N;076-23E;;;1211;1211; 42;063;----;Kyelong;;India;2;32-35N;077-04E;;;3348;; 42;065;----;Manali;;India;2;32-16N;077-10E;;;;2039; 42;071;VIAR;Amritsar;;India;2;31-38N;074-52E;31-42N;074-48E;229;234;P 42;074;----;Kapurthala;;India;2;31-20N;075-20E;;;;; 42;075;----;Jullundur;;India;2;31-28N;075-35E;;;;; 42;077;----;Una;;India;2;31-28N;076-16E;;;365;369; 42;078;----;Mandi;;India;2;31-43N;076-58E;;;760;761; 42;080;VABI;Bilaspur;;India;2;31-15N;076-40E;;;589;587;P 42;081;----;Bhuntar;;India;2;31-50N;077-10E;;;;1096; 42;083;----;Shimla;;India;2;31-06N;077-10E;;;2205;2202; 42;096;----;Ferozepur;;India;2;30-55N;074-40E;;;199;200; 42;097;----;Bhatinda;;India;2;30-10N;074-35E;;;207;211; 42;099;----;Ludhiana;;India;2;30-52N;075-56E;;;255;255; 42;101;----;Patiala;;India;2;30-20N;076-28E;30-20N;076-28E;249;251;P 42;103;----;Ambala;;India;2;30-23N;076-46E;30-23N;076-46E;271;272; 42;107;----;Dharmpur;;India;2;30-54N;077-01E;30-54N;077-01E;1986;1986; 42;108;----;Uttarkashi;;India;2;30-44N;078-27E;;;;; 42;110;----;Pauri;;India;2;30-09N;078-47E;;;1845;; 42;111;----;Dehradun;;India;2;30-19N;078-02E;30-19N;078-02E;683;682; 42;112;----;Mussoorie;;India;2;30-27N;078-05E;;;2005;2042; 42;114;----;Tehri;;India;2;30-24N;078-29E;;;;; 42;116;----;Joshimath;;India;2;30-33N;079-34E;;;1875;; 42;117;----;Chamoli;;India;2;30-24N;079-20E;;;1160;; 42;121;----;Munsyari;;India;2;30-07N;080-15E;;;3414;; 42;122;----;Anupgarh;;India;2;29-10N;073-10E;;;153;154; 42;123;----;Ganganagar;;India;2;29-55N;073-55E;29-55N;073-53E;176;177; 42;131;VIHR;Hissar;;India;2;29-10N;075-44E;;;216;221;P 42;135;----;Sangrur;;India;2;30-10N;075-50E;;;236;; 42;137;----;Karnal;;India;2;29-42N;077-02E;;;248;249; 42;139;----;Meerut;;India;2;29-01N;077-38E;;;221;222; 42;140;----;Roorkee;;India;2;29-51N;077-53E;;;273;274; 42;143;----;Najibabad;;India;2;29-37N;078-23E;;;269;270; 42;146;----;Nainital;;India;2;29-24N;079-28E;;;1953;1953; 42;147;----;Mukteshwar Kumaon;;India;2;29-28N;079-39E;;;2310;2311; 42;148;----;Pantnagar;;India;2;29-02N;079-28E;;;233;; 42;151;----;Dharchula;;India;2;29-51N;080-32E;;;;817; 42;165;----;Bikaner;;India;2;28-00N;073-18E;28-00N;073-18E;223;224;P 42;170;----;Churu;;India;2;28-15N;074-55E;;;290;291; 42;174;----;Pilani;;India;2;28-20N;075-35E;;;300;301; 42;176;----;Rohtak;;India;2;28-50N;076-35E;;;;; 42;177;----;Narnaul;;India;2;28-00N;076-05E;;;306;308; 42;178;----;Gurgaon;;India;2;28-25N;077-00E;;;;; 42;181;VIDP;New Delhi / Palam;;India;2;28-34N;077-07E;;;220;233; 42;182;VIDD;New Delhi / Safdarjung;;India;2;28-35N;077-12E;28-35N;077-12E;211;216;P 42;183;----;Bulandshahr;;India;2;28-24N;077-52E;28-24N;077-52E;;; 42;187;----;Moradabad;;India;2;28-50N;078-45E;;;;202; 42;188;----;Rampur;;India;2;28-45N;079-00E;28-45N;079-00E;191;191; 42;189;VIBY;Bareilly;;India;2;28-22N;079-24E;28-22N;079-24E;167;169;P 42;190;----;Pilibhit;;India;2;28-38N;079-48E;;;;; 42;191;----;Budaun;;India;2;28-03N;079-07E;;;;; 42;216;----;Along;;India;2;28-10N;094-48E;;;1768;; 42;220;----;Pasighat;;India;2;28-06N;095-23E;;;155;157; 42;237;----;Phalodi;;India;2;27-08N;072-22E;;;233;234; 42;242;----;Nagaur;;India;2;27-10N;073-40E;;;297;298; 42;249;----;Sikar;;India;2;27-37N;075-08E;;;431;433; 42;255;----;Alwar;;India;2;27-30N;076-35E;;;270;271; 42;257;----;Mathura;;India;2;27-30N;077-41E;;;;174; 42;258;----;Bharatpur;;India;2;27-13N;077-30E;;;175;176; 42;260;VIAG;Agra;;India;2;27-09N;077-58E;27-09N;077-58E;168;169;P 42;261;----;Agra;;India;2;27-10N;078-02E;;;168;169; 42;262;----;Aligarh;;India;2;27-53N;078-04E;;;186;187; 42;265;----;Mainpuri;;India;2;27-14N;079-03E;;;156;157; 42;266;----;Shahjahanpur;;India;2;27-53N;079-54E;;;155;155; 42;270;----;Kheri;;India;2;27-54N;080-48E;;;146;147; 42;271;----;Hardoi;;India;2;27-23N;080-10E;;;141;142; 42;273;----;Bahraich;;India;2;27-34N;081-36E;27-34N;081-36E;122;124; 42;274;----;Gonda;;India;2;27-08N;081-58E;;;108;110; 42;279;----;Basti;;India;2;26-48N;082-44E;;;89;; 42;282;----;Nautanwa;;India;2;27-26N;083-25E;27-26N;083-25E;98;99; 42;295;----;Darjeeling;;India;2;27-03N;088-16E;;;2127;2128; 42;296;----;Kalimpong;;India;2;27-04N;088-28E;;;;1209; 42;299;----;Gangtok;;India;2;27-20N;088-37E;;;1756;; 42;305;----;Bomdila;;India;2;27-25N;092-51E;;;2484;; 42;309;VELR;North Lakhimpur;;India;2;27-14N;094-07E;;;101;102;P 42;311;----;Sibsagar;;India;2;26-59N;094-38E;;;95;97; 42;312;----;Ziro;;India;2;27-55N;094-48E;;;1476;; 42;314;VEMN;Dibrugarh / Mohanbari;;India;2;27-29N;095-01E;27-29N;095-01E;110;111;P 42;316;----;Digboi;;India;2;27-23N;095-37E;;;143;152; 42;328;----;Jaisalmer;;India;2;26-54N;070-55E;26-54N;070-55E;231;231;P 42;339;VIJO;Jodhpur;;India;2;26-18N;073-01E;26-18N;073-01E;217;224;P 42;343;----;Ajmer;;India;2;26-27N;074-37E;;;485;486; 42;348;VIJP;Jaipur / Sanganer;;India;2;26-49N;075-48E;26-49N;075-48E;385;390;P 42;349;----;Tonk;;India;2;26-10N;075-45E;;;272;272; 42;354;----;Dholpur;;India;2;26-40N;077-50E;;;175;176; 42;358;----;Bhind;;India;2;26-34N;078-48E;;;163;168; 42;361;VIGR;Gwalior;;India;2;26-14N;078-15E;26-14N;078-15E;205;207;P 42;364;----;Etawah;;India;2;26-27N;079-01E;;;151;151; 42;366;----;Kanpur;;India;2;26-26N;080-22E;;;125;126; 42;367;VICX;Kanpur / Chakeri;;India;2;26-24N;080-24E;26-24N;080-24E;123;126; 42;368;----;Lucknow;;India;2;26-52N;080-56E;;;110;111; 42;369;VILK;Lucknow / Amausi;;India;2;26-45N;080-53E;26-45N;080-53E;122;128;P 42;374;----;Faizabad;;India;2;26-45N;082-05E;;;101;102; 42;375;----;Sultanpur;;India;2;26-15N;082-00E;;;96;97; 42;379;VEGK;Gorakhpur;;India;2;26-45N;083-22E;26-45N;083-22E;76;77;P 42;381;----;Azamgarh;;India;2;26-03N;083-13E;;;77;78; 42;382;----;Raxaul;;India;2;26-59N;084-51E;;;83;79; 42;383;----;Motihari;;India;2;26-40N;084-55E;;;65;66; 42;387;----;Muzaffarpur;;India;2;26-07N;085-24E;;;52;53; 42;390;----;Muzaffarpur Aerodrome;;India;2;26-07N;085-19E;;;53;58; 42;391;----;Darbhanga;;India;2;26-10N;085-54E;;;47;49; 42;393;----;Supaul;;India;2;26-08N;086-35E;;;;50; 42;395;----;Forbesganj;;India;2;26-18N;087-16E;;;59;61; 42;397;----;Siliguri;;India;2;26-40N;088-22E;26-40N;088-22E;123;123; 42;398;VEBD;Siliguri;;India;2;26-38N;088-19E;26-41N;088-20E;126;131;P 42;399;----;Jalpaiguri;;India;2;26-32N;088-43E;;;;83; 42;403;----;Cooch Behar;;India;2;26-20N;089-28E;;;41;43; 42;404;----;Dhubri;;India;2;26-01N;089-59E;;;;35; 42;406;----;Dhubri Rupsi;;India;2;26-09N;089-55E;;;35;45; 42;407;----;Goalpara;;India;2;26-11N;090-38E;;;36;38; 42;408;----;Rangia;;India;2;26-26N;091-37E;;;57;60; 42;409;----;Tangla;;India;2;26-39N;091-55E;;;63;65; 42;410;VEGT;Gauhati;;India;2;26-06N;091-35E;26-06N;091-35E;47;54;P 42;413;----;Majbat;;India;2;26-45N;092-21E;;;;120; 42;414;----;Chaparmukh;;India;2;26-12N;092-31E;;;64;66; 42;415;----;Tezpur;;India;2;26-37N;092-47E;26-37N;092-47E;77;79;P 42;416;----;Tezpur / Bindukuri;;India;2;26-43N;092-48E;;;71;75; 42;419;----;Gohpur;;India;2;26-50N;093-35E;;;;83; 42;420;----;Golaghat;;India;2;26-31N;093-59E;;;;95; 42;426;----;Tuensang;;India;2;26-16N;094-49E;;;1608;; 42;435;----;Barmer;;India;2;25-45N;071-23E;;;193;194; 42;439;----;Jalore;;India;2;25-21N;072-37E;;;;168; 42;441;----;Erinpura / Jawai Dam Site;;India;2;25-05N;073-05E;;;294;295; 42;447;----;Bhilwara;;India;2;25-21N;074-38E;;;421;425; 42;450;----;Bundi;;India;2;25-27N;075-38E;;;266;267; 42;452;VIKO;Kota Aerodrome;;India;2;25-09N;075-51E;;;273;274;P 42;453;----;Sawai Madhopur;;India;2;25-59N;076-22E;;;;; 42;456;----;Sheopur;;India;2;25-40N;076-41E;;;234;235; 42;459;----;Shivpuri;;India;2;25-20N;077-39E;;;463;464; 42;460;----;Datia;;India;2;25-40N;078-28E;;;227;229; 42;463;VIJN;Jhansi;;India;2;25-27N;078-35E;;;250;251; 42;467;----;Nowgong;;India;2;25-04N;079-27E;;;226;229; 42;468;----;Orai;;India;2;25-59N;079-30E;;;140;141; 42;469;----;Hamirpur;;India;2;25-57N;080-09E;;;109;109; 42;471;----;Fatehpur;;India;2;25-56N;080-50E;;;113;114; 42;472;----;Pratapgarh;;India;2;25-54N;081-57E;;;;; 42;473;----;Banda;;India;2;25-28N;080-22E;;;120;121; 42;475;VIAL;Allahabad / Bamhrauli;;India;2;25-27N;081-44E;25-27N;081-44E;97;98;P 42;477;----;Jaunpur;;India;2;25-45N;082-41E;;;;; 42;479;VIBN;Varanasi / Babatpur;;India;2;25-27N;082-52E;;;81;85; 42;482;----;Ghazipur;;India;2;25-24N;083-33E;;;;67; 42;483;----;Varanasi;;India;2;25-18N;083-01E;;;88;90; 42;484;----;Ballia;;India;2;25-45N;084-10E;;;62;64; 42;487;----;Arrah;;India;2;25-34N;084-40E;;;58;; 42;488;----;Chapra;;India;2;25-47N;084-44E;;;55;58; 42;492;VEPT;Patna;;India;2;25-36N;085-06E;25-36N;085-06E;51;60;P 42;498;----;Bhagalpur;;India;2;25-14N;086-57E;25-14N;086-57E;44;49; 42;499;----;Sabaur;;India;2;25-14N;087-04E;;;36;37; 42;500;----;Purnea;;India;2;25-16N;087-28E;;;;38; 42;503;----;Malda;;India;2;25-02N;088-08E;;;26;31; 42;506;----;Balurghat;;India;2;25-13N;088-47E;;;;26; 42;511;----;Tura;;India;2;25-31N;090-14E;;;;370; 42;515;----;Cherrapunji;;India;2;25-15N;091-44E;;;1312;1313; 42;516;----;Shillong;;India;2;25-34N;091-53E;;;1598;1598; 42;522;----;Haflong;;India;2;25-10N;093-01E;;;680;682; 42;523;----;Lumding;;India;2;25-45N;093-11E;;;147;149; 42;527;----;Kohima;;India;2;25-38N;094-10E;;;1405;1406; 42;539;----;Deesa;;India;2;24-12N;072-12E;;;135;136; 42;540;----;Mount Abu;;India;2;24-36N;072-43E;;;1196;1195; 42;542;VIUD;Udaipur Dabok;;India;2;24-37N;073-53E;24-37N;073-53E;509;514; 42;543;----;Udaipur;;India;2;24-35N;073-42E;;;581;582; 42;546;----;Chittorgarh;;India;2;24-53N;074-38E;;;404;404; 42;547;----;Nimach;;India;2;24-28N;074-54E;;;494;496; 42;552;----;Chambal / Rawat Bhata;;India;2;24-55N;075-35E;;;;351; 42;555;----;Jhalawar;;India;2;24-32N;076-10E;;;320;321; 42;557;----;Rajgarh;;India;2;24-00N;076-43E;;;380;382; 42;559;----;Guna;;India;2;24-39N;077-19E;;;477;478;P 42;562;----;Tikamgarh;;India;2;24-46N;078-50E;;;344;345; 42;567;----;Khajuraho;;India;2;24-59N;079-55E;;;217;221; 42;570;----;Panna;;India;2;24-43N;080-10E;;;350;354; 42;571;VIST;Satna;;India;2;24-34N;080-50E;;;315;317;P 42;574;----;Rewa;;India;2;24-32N;081-18E;;;298;299; 42;577;----;Sidhi;;India;2;24-25N;081-52E;;;270;272; 42;587;----;Daltonganj;;India;2;24-03N;084-04E;;;;221; 42;588;----;Dehri;;India;2;24-55N;084-11E;;;;107; 42;591;VEGY;Gaya;;India;2;24-45N;084-57E;24-45N;084-57E;110;116;P 42;595;----;Jamui;;India;2;24-56N;086-18E;;;;82; 42;599;----;Dumka;;India;2;24-16N;087-15E;;;;149; 42;603;----;Berhampore;;India;2;24-08N;088-16E;;;18;19; 42;618;----;Kailashahar;;India;2;24-19N;092-00E;;;27;30; 42;619;----;Silchar;;India;2;24-45N;092-48E;;;21;29; 42;623;VEIM;Imphal Tulihal;;India;2;24-46N;093-54E;24-46N;093-54E;780;781;P 42;631;----;Naliya;;India;2;23-15N;068-51E;;;20;21; 42;634;VABJ;Bhuj-Rudramata;;India;2;23-15N;069-40E;23-17N;069-40E;78;80;P 42;638;----;Kandla Aerodrome;;India;2;23-09N;070-07E;;;29;35; 42;639;----;New Kandla;;India;2;23-00N;070-13E;;;10;14; 42;643;----;Radhanpur;;India;2;23-50N;071-36E;;;28;30; 42;647;VAAH;Ahmadabad;;India;2;23-04N;072-38E;23-04N;072-38E;55;55;P 42;651;----;Idar;;India;2;23-50N;073-02E;;;217;219; 42;652;----;Dungarpur;;India;2;23-50N;073-40E;;;;291; 42;654;----;Gandhinagar;;India;2;23-14N;072-43E;;;;82; 42;655;----;Banswara;;India;2;23-33N;074-27E;;;;220; 42;661;----;Ratlam;;India;2;23-19N;075-03E;;;484;486; 42;662;----;Ujjain;;India;2;23-11N;075-47E;;;488;489; 42;665;----;Shajapur;;India;2;23-26N;076-19E;;;444;446; 42;667;VABP;Bhopal / Bairagarh;;India;2;23-17N;077-21E;23-17N;077-21E;523;523;P 42;669;----;Vidisha;;India;2;23-32N;077-49E;;;425;430; 42;671;----;Sagar;;India;2;23-51N;078-45E;;;550;551; 42;672;----;Raisen;;India;2;23-19N;077-50E;;;435;440; 42;674;----;Damoh;;India;2;23-50N;079-27E;;;369;371; 42;675;VAJB;Jabalpur;;India;2;23-12N;079-57E;23-10N;079-57E;391;393;P 42;679;----;Umaria;;India;2;23-32N;080-53E;;;458;459; 42;693;----;Ambikapur;;India;2;23-10N;083-15E;;;596;611; 42;699;----;Hazaribagh;;India;2;23-59N;085-22E;;;;611; 42;701;VERC;M. O. Ranchi;;India;2;23-19N;085-19E;23-19N;085-19E;652;652; 42;703;----;Dhanbad;;India;2;23-47N;086-26E;;;256;257; 42;705;----;Purulia;;India;2;23-20N;086-25E;;;254;255; 42;706;----;Bankura;;India;2;23-15N;087-03E;;;;82; 42;708;----;Shanti Niketan;;India;2;23-39N;087-42E;;;58;59; 42;709;----;Burdwan;;India;2;23-14N;087-51E;;;;30; 42;711;----;Krishnanagar;;India;2;23-24N;088-31E;;;12;15; 42;714;----;Bagati;;India;2;22-59N;088-22E;;;;12; 42;715;----;Malanjkhand;;India;2;22-00N;080-42E;;;580;581; 42;724;VEAT;Agartala;;India;2;23-53N;091-15E;23-53N;091-15E;15;16;P 42;727;----;Aijal;;India;2;23-44N;092-43E;;;;1097; 42;729;----;Mandvi;;India;2;22-49N;069-16E;;;3;9; 42;730;----;Okha;;India;2;22-29N;069-07E;;;5;7; 42;731;----;Dwarka;;India;2;22-22N;069-05E;;;10;11; 42;734;----;Jamnagar;;India;2;22-27N;070-05E;;;14;20; 42;737;VARK;Rajkot;;India;2;22-18N;070-47E;;;134;138;P 42;740;----;Surendranagar;;India;2;22-44N;071-36E;;;72;74; 42;744;----;Vallabh Vidyanagar;;India;2;22-34N;072-56E;;;41;44; 42;748;----;Baroda Aerodrome;;India;2;22-20N;073-16E;;;37;38; 42;751;----;Dohad;;India;2;22-50N;074-16E;;;332;333; 42;752;----;Dhar;;India;2;22-36N;075-18E;;;581;583; 42;753;----;Alirajpur;;India;2;22-17N;074-24E;;;291;293; 42;754;VAID;Indore;;India;2;22-43N;075-48E;22-43N;075-48E;561;567;P 42;759;----;Kannod;;India;2;22-40N;076-44E;;;351;353; 42;763;----;Hoshangabad;;India;2;22-46N;077-46E;;;300;302; 42;767;----;Pachmarhi;;India;2;22-28N;078-26E;22-28N;078-26E;1061;1075; 42;768;----;Chhindwara;;India;2;22-06N;079-00E;;;675;685; 42;770;----;Narsinghpur;;India;2;22-57N;079-11E;;;354;356; 42;771;----;Seoni;;India;2;22-05N;079-33E;;;617;619; 42;776;----;Mandla;;India;2;22-35N;080-22E;;;441;443; 42;779;----;Pendra Road;;India;2;22-46N;081-54E;22-46N;081-54E;624;625; 42;783;----;Champa;;India;2;22-02N;082-42E;;;244;245; 42;790;----;Jashpurnagar;;India;2;22-53N;084-08E;;;;771; 42;792;----;Sundargarh;;India;2;22-01N;084-00E;;;240;; 42;793;----;Rourkela;;India;2;22-13N;084-53E;;;;196; 42;795;----;Chaibasa;;India;2;22-33N;085-49E;;;;226; 42;798;VEJS;Jamshedpur;;India;2;22-49N;086-11E;22-49N;086-11E;140;142;P 42;799;----;Jamshedpur;;India;2;22-49N;086-11E;;;128;129; 42;803;----;Midnapore;;India;2;22-25N;087-19E;;;;45; 42;805;----;Uluberia;;India;2;22-30N;087-57E;;;;; 42;807;----;Calcutta / Alipore;;India;2;22-32N;088-20E;22-32N;088-20E;5;6; 42;809;VECC;Calcutta / Dum Dum;;India;2;22-39N;088-27E;22-39N;088-27E;4;6;P 42;811;----;Diamond Harbour;;India;2;22-11N;088-12E;;;4;7; 42;812;----;Canning;;India;2;22-15N;088-40E;;;3;4; 42;830;----;Porbandar;;India;2;21-39N;069-40E;21-39N;069-40E;5;7; 42;832;----;Keshod;;India;2;21-19N;070-19E;;;50;51; 42;834;----;Amreli;;India;2;21-36N;071-13E;;;;; 42;837;----;Mahuva;;India;2;21-05N;071-47E;;;8;9; 42;838;VABV;Bhaunagar;;India;2;21-45N;072-12E;;;5;11; 42;840;----;Surat;;India;2;21-12N;072-50E;21-12N;072-50E;10;12;P 42;841;----;Broach;;India;2;21-44N;073-00E;;;19;17; 42;846;----;Nandurbar;;India;2;21-20N;074-15E;;;204;206; 42;849;----;Khargone;;India;2;21-49N;075-37E;;;250;251; 42;851;----;Jalgaon;;India;2;21-03N;075-34E;;;200;201; 42;855;VAKD;Khandwa;;India;2;21-50N;076-22E;;;317;318; 42;860;----;Betul;;India;2;21-52N;077-56E;;;652;653; 42;866;----;Nagpur Mayo Hospital ;;India;2;21-09N;079-07E;;;311;; 42;867;VANP;Nagpur Sonegaon;;India;2;21-06N;079-03E;21-06N;079-03E;308;310;P 42;871;----;Gondia;;India;2;21-28N;080-12E;;;311;313; 42;874;----;Pbo Raipur;;India;2;21-13N;081-40E;21-13N;081-40E;294;298; 42;876;----;Durg;;India;2;21-11N;081-17E;;;292;293; 42;883;----;Sambalpur;;India;2;21-28N;083-58E;;;;148; 42;884;----;Raigarh;;India;2;21-53N;083-23E;;;214;220; 42;886;VEJH;Jharsuguda;;India;2;21-55N;084-05E;21-55N;084-05E;228;230;P 42;891;----;Keongjhargarh;;India;2;21-37N;085-31E;;;461;463; 42;894;----;Baripada;;India;2;21-56N;086-46E;;;53;54; 42;895;----;Balasore;;India;2;21-31N;086-56E;21-30N;086-56E;18;20;P 42;900;----;Contai;;India;2;21-47N;087-45E;;;10;11; 42;901;----;Digha;;India;2;21-50N;087-47E;;;;6; 42;903;----;Sagar Island;;India;2;21-45N;088-03E;;;2;3; 42;909;----;Veraval;;India;2;20-54N;070-22E;20-54N;070-22E;6;8;P 42;914;----;Diu;;India;2;20-43N;070-55E;;;10;15; 42;915;----;Bulsar;;India;2;20-37N;072-56E;;;;15; 42;916;----;Daman;;India;2;20-25N;072-51E;;;;12; 42;920;----;Nasik Ozar;;India;2;20-08N;073-55E;;;599;608; 42;921;----;Nasik;;India;2;20-00N;073-47E;;;598;; 42;925;----;Malegaon;;India;2;20-33N;074-32E;;;436;437; 42;931;----;Buldana;;India;2;20-32N;076-14E;;;648;650; 42;933;----;Akola;;India;2;20-42N;077-02E;;;280;282; 42;934;VAAK;Akola;;India;2;20-42N;077-04E;;;305;309;P 42;937;----;Amraoti;;India;2;20-56N;077-47E;;;367;370; 42;939;----;Wardha;;India;2;20-40N;078-35E;;;282;283; 42;943;----;Yeotmal;;India;2;20-24N;078-09E;;;450;451; 42;946;----;Bramhapuri;;India;2;20-36N;079-51E;;;227;229; 42;953;----;Kanker;;India;2;20-16N;081-29E;;;393;402; 42;961;----;Titlagarh;;India;2;20-18N;083-18E;;;209;211; 42;963;----;Bolangir;;India;2;20-42N;083-30E;;;;190; 42;966;----;Phulbani;;India;2;20-29N;084-16E;;;488;489; 42;969;----;Angul;;India;2;20-50N;085-06E;;;137;139; 42;970;----;Cuttack;;India;2;20-28N;085-56E;;;27;27; 42;971;VEBS;Bhubaneswar;;India;2;20-15N;085-50E;20-15N;085-50E;45;46;P 42;973;----;Chandbali;;India;2;20-47N;086-44E;;;5;6; 42;976;----;Paradip C. W. R. ;;India;2;20-18N;086-41E;;;4;8; 42;977;----;Sandheads;;India;2;20-51N;088-15E;20-51N;088-15E;10;10;P 43;001;----;Dahanu;;India;2;19-58N;072-43E;;;4;5; 43;002;----;Bombay / Juhu;;India;2;19-07N;072-50E;;;4;4; 43;003;VABB;Bombay / Santacruz;;India;2;19-07N;072-51E;19-05N;072-51E;8;14;P 43;009;----;Ahmadnagar;;India;2;19-05N;074-48E;;;655;657; 43;011;----;Bir;;India;2;19-00N;075-43E;;;;519; 43;013;----;Aurangabad;;India;2;19-53N;075-20E;;;579;581; 43;014;VAAU;Aurangabad Chikalthan Aerodrome;;India;2;19-51N;075-24E;19-51N;075-24E;582;579;P 43;017;----;Parbhani;;India;2;19-16N;076-46E;;;422;423; 43;019;----;Pusad;;India;2;19-55N;077-35E;;;332;334; 43;021;----;Nanded;;India;2;19-05N;077-20E;;;355;358; 43;022;----;Priyadarshini;;India;2;19-45N;078-02E;;;;459; 43;025;----;Adilabad;;India;2;19-39N;078-32E;;;;269; 43;029;----;Chandrapur;;India;2;19-58N;079-18E;;;191;193; 43;041;----;Jagdalpur;;India;2;19-05N;082-02E;19-05N;082-02E;552;553;P 43;042;----;Bhawanipatna;;India;2;19-55N;083-11E;;;261;261; 43;049;----;Gopalpur;;India;2;19-16N;084-53E;19-16N;084-53E;16;17; 43;053;----;Puri;;India;2;19-48N;085-49E;;;5;6; 43;057;----;Bombay / Colaba;;India;2;18-54N;072-49E;;;10;11; 43;058;----;Alibag;;India;2;18-38N;072-52E;;;5;7; 43;060;----;Matheran;;India;2;18-59N;073-17E;;;;695; 43;061;----;Khandala;;India;2;18-46N;073-22E;;;539;; 43;062;----;Bhira;;India;2;18-27N;073-24E;;;100;96; 43;063;----;Poona;;India;2;18-32N;073-51E;18-32N;073-51E;555;559;P 43;064;----;Poona / Lohogaon Aerodrome;;India;2;18-35N;073-55E;;;589;593; 43;069;----;Baramati;;India;2;18-09N;074-35E;;;550;551; 43;071;----;Jeur;;India;2;18-12N;075-12E;;;519;521; 43;081;----;Nizamabad;;India;2;18-40N;078-06E;;;379;381; 43;083;----;Medak;;India;2;18-03N;078-16E;;;472;472; 43;086;----;Ramgundam;;India;2;18-46N;079-26E;;;156;156;P 43;087;----;Hanamkonda;;India;2;18-01N;079-34E;;;266;269; 43;089;----;Sironcha;;India;2;18-51N;079-58E;;;122;123; 43;093;----;Bailadila;;India;2;18-35N;081-14E;;;1143;1144; 43;097;----;Koraput;;India;2;18-49N;082-43E;;;;913; 43;105;----;Kalingapatam;;India;2;18-20N;084-08E;;;5;6; 43;109;----;Harnai;;India;2;17-49N;073-06E;;;17;20; 43;110;----;Ratnagiri;;India;2;16-59N;073-20E;16-59N;073-20E;75;67;P 43;111;----;Mahabaleshwar;;India;2;17-56N;073-40E;;;1384;1382; 43;113;----;Satara;;India;2;17-31N;074-03E;;;610;612; 43;117;VASL;Sholapur;;India;2;17-40N;075-54E;;;477;479;P 43;121;----;Gulbarga;;India;2;17-21N;076-51E;;;457;458; 43;128;VOHY;Hyderabad Airport;;India;2;17-27N;078-28E;17-27N;078-28E;530;545; 43;133;----;Nalgonda;;India;2;17-00N;079-15E;;;;227; 43;136;----;Kothagudem;;India;2;17-33N;080-38E;;;110;111; 43;137;----;Khammam;;India;2;17-15N;080-09E;;;110;112; 43;147;----;Tuni;;India;2;17-21N;082-33E;;;35;35; 43;149;----;Vishakhapatnam;;India;2;17-43N;083-14E;;;3;3; 43;150;----;Cwc Vishakhapatnam / Waltair;;India;2;17-42N;083-18E;17-42N;083-18E;45;66;P 43;153;----;Devgarh;;India;2;16-23N;073-21E;;;34;36; 43;157;VAKP;Kolhapur;;India;2;16-42N;074-14E;;;569;570; 43;158;----;Sangli;;India;2;16-51N;074-36E;;;545;549; 43;161;----;Bijapur;;India;2;16-49N;075-43E;;;593;594; 43;168;----;Mahabubnagar;;India;2;16-45N;078-00E;;;504;505; 43;169;----;Raichur;;India;2;16-12N;077-21E;;;398;400; 43;177;----;Rentachintala;;India;2;16-33N;079-33E;;;104;106; 43;180;----;Vijayawada;;India;2;16-31N;080-37E;;;18;20; 43;181;VOBZ;Vijayawada / Gannavaram;;India;2;16-32N;080-48E;16-32N;080-48E;21;24; 43;182;----;Nandigama;;India;2;16-47N;080-17E;;;;51; 43;184;----;Nidadavole;;India;2;16-50N;081-35E;;;11;13; 43;185;----;Machilipatnam;;India;2;16-12N;081-09E;16-21N;081-09E;3;3;P 43;187;----;Narsapur;;India;2;16-26N;081-42E;;;;4; 43;189;----;Kakinada;;India;2;16-57N;082-14E;;;2;8;P 43;192;----;Goa / Panjim;;India;2;15-29N;073-49E;15-29N;073-49E;58;60;P 43;193;----;Vengurla;;India;2;15-52N;073-38E;;;15;16; 43;194;VAGO;Goa / Dabolim Airport;;India;2;15-23N;073-49E;;;42;52; 43;196;----;Mormugao;;India;2;15-25N;073-47E;;;61;62; 43;197;----;Belgaum;;India;2;15-51N;074-32E;;;751;753; 43;198;VABM;Belgaum / Sambra;;India;2;15-51N;074-37E;;;758;747;P 43;201;----;Gadag;;India;2;15-25N;075-38E;15-25N;075-38E;661;650;P 43;205;VOBI;Bellary;;India;2;15-09N;076-51E;;;448;449; 43;212;----;Nandyal;;India;2;15-28N;078-29E;;;211;212; 43;213;----;Kurnool;;India;2;15-48N;078-04E;;;280;281;P 43;220;----;Bapatla;;India;2;15-54N;080-28E;;;;6; 43;221;----;Ongole;;India;2;15-30N;080-05E;;;22;12; 43;225;----;Karwar;;India;2;14-47N;074-08E;;;3;4; 43;226;----;Honavar;;India;2;14-17N;074-27E;;;8;9; 43;229;----;Shirali;;India;2;14-04N;074-32E;;;45;45; 43;233;----;Chitradurga;;India;2;14-14N;076-26E;;;724;733;P 43;237;----;Anantapur;;India;2;14-41N;077-37E;14-41N;077-37E;349;350;P 43;241;VOCP;Cuddapah;;India;2;14-29N;078-50E;;;129;130; 43;243;----;Kavali;;India;2;14-54N;079-59E;;;17;17; 43;245;----;Nellore;;India;2;14-27N;079-59E;;;19;20;P 43;257;----;Agumbe;;India;2;13-30N;075-05E;;;658;659; 43;258;----;Shimoga;;India;2;13-56N;075-38E;;;571;571; 43;259;----;Balehonur;;India;2;13-22N;075-27E;;;907;; 43;260;----;Chickmagalur;;India;2;13-15N;075-45E;;;;1057; 43;263;----;Hassan;;India;2;13-00N;076-09E;;;955;960; 43;268;----;Tumkur;;India;2;13-20N;077-05E;;;;822; 43;271;----;Arogyavaram;;India;2;13-32N;078-30E;;;696;701; 43;275;----;Tirupathi;;India;2;13-40N;079-35E;;;110;105; 43;277;----;Tiruttani;;India;2;13-09N;079-32E;;;;87; 43;278;----;Madras;;India;2;13-04N;080-15E;;;6;6; 43;279;VOMM;Madras / Minambakkam;;India;2;13-00N;080-11E;13-00N;080-11E;10;16;P 43;284;VOML;Mangalore / Bajpe;;India;2;12-55N;074-53E;12-58N;074-54E;102;102;P 43;285;----;Mangalore / Panambur;;India;2;12-57N;074-50E;12-57N;074-50E;32;31; 43;287;----;Madikeri;;India;2;12-25N;075-44E;;;1150;1153; 43;289;----;Mandya;;India;2;12-30N;076-50E;12-30N;076-50E;695;695; 43;291;----;Mysore;;India;2;12-18N;076-42E;;;765;767; 43;295;----;Bangalore;;India;2;12-58N;077-35E;12-58N;077-35E;920;921;P 43;296;----;Bangalore / Hindustan Airport;;India;2;12-57N;077-38E;;;888;897; 43;299;----;Kolar Gold Fields;;India;2;12-57N;078-18E;;;;882; 43;301;----;Dharmapuri;;India;2;12-08N;078-02E;;;396;; 43;302;----;Tiruppattur;;India;2;12-29N;078-34E;;;385;390; 43;303;VOVR;Vellore;;India;2;12-55N;079-09E;;;213;214; 43;309;----;Maya Bandar;;India;2;12-55N;092-55E;;;27;28; 43;310;----;Long Island;;India;2;12-25N;092-56E;;;12;25; 43;311;----;Amini Divi;;India;2;11-07N;072-44E;11-07N;072-44E;3;4; 43;312;----;Agatti;;India;2;10-51N;072-28E;;;3;4; 43;314;----;Kozhikode;;India;2;11-15N;075-47E;;;4;5;P 43;315;----;Cannur;;India;2;11-50N;075-20E;;;11;18; 43;316;----;Nilambur;;India;2;11-17N;076-14E;;;;31; 43;317;----;Udhagamandalam;;India;2;11-24N;076-44E;;;2236;2249; 43;318;----;Coonoor;;India;2;11-21N;076-48E;;;1745;; 43;319;----;Coimbatore;;India;2;11-00N;076-58E;;;407;409; 43;321;VOCB;Coimbatore / Peelamedu;;India;2;11-02N;077-03E;;;396;399;P 43;324;----;Ariyalur;;India;2;11-10N;079-00E;;;75;; 43;325;----;Salem;;India;2;11-39N;078-10E;;;279;278; 43;327;----;Karaikudi;;India;2;10-04N;078-48E;;;86;92; 43;328;----;Pondicherry;;India;2;11-55N;079-50E;;;;6; 43;329;----;Cuddalore;;India;2;11-46N;079-46E;;;5;12;P 43;330;----;Thanjavur;;India;2;10-47N;079-08E;;;;68; 43;333;VEPB;Port Blair;;India;2;11-40N;092-43E;11-40N;092-43E;73;79;P 43;334;----;Androth;;India;2;10-48N;073-59E;;;3;5; 43;335;----;Palakkad;;India;2;10-46N;076-39E;;;95;97; 43;339;----;Kodaikanal;;India;2;10-14N;077-28E;;;2339;2343; 43;342;----;K. Paramathy;;India;2;10-57N;078-05E;;;182;181; 43;344;VOTR;Tiruchchirapalli;;India;2;10-46N;078-43E;10-46N;078-43E;85;88;P 43;345;----;Kudimiamalai;;India;2;10-24N;078-40E;;;122;123; 43;346;----;Karaikal;;India;2;10-55N;079-50E;10-55N;079-50E;7;7; 43;347;----;Nagappattinam;;India;2;10-46N;079-51E;;;2;9; 43;348;----;Atiramapattinam;;India;2;10-20N;079-23E;;;4;6; 43;349;----;Vedaranniyam;;India;2;10-22N;079-51E;10-22N;079-51E;2;4; 43;351;----;Fort Cochin;;India;2;09-58N;076-14E;;;2;3; 43;352;----;Alapuzha;;India;2;09-33N;076-25E;;;2;4; 43;353;VOCC;Cochin / Willingdon;;India;2;09-57N;076-16E;09-56N;076-14E;1;3;P 43;354;----;Punalur;;India;2;09-00N;076-55E;;;33;34; 43;355;----;Kottayam;;India;2;09-35N;076-31E;;;39;45; 43;359;----;Madurai;;India;2;09-55N;078-07E;09-55N;078-07E;132;133; 43;360;VOMD;Madurai;;India;2;09-50N;078-05E;;;139;131; 43;361;----;Tondi;;India;2;09-44N;079-02E;09-44N;079-02E;4;5; 43;363;----;Pamban;;India;2;09-16N;079-18E;;;10;11; 43;364;----;Hut Bay;;India;2;10-35N;092-33E;;;5;5; 43;367;----;Car Nicobar;;India;2;09-10N;092-50E;;;9;10; 43;368;VECX;Car Nicobar;;India;2;09-09N;092-49E;09-09N;092-49E;10;14;P 43;369;----;Minicoy;;India;2;08-18N;073-09E;08-18N;073-00E;1;2;P 43;371;----;Thiruvananthapuram;;India;2;08-29N;076-57E;08-29N;076-57E;60;64;P 43;372;VOTV;Thiruvananthapuram;;India;2;08-28N;076-57E;;;4;8; 43;373;----;Trivandrum Met. Obs./ Thumba;;India;2;08-32N;076-52E;;;;7; 43;374;----;Kovalam;;India;2;08-05N;077-15E;;;35;; 43;376;----;Palayankottai;;India;2;08-44N;077-45E;;;45;51; 43;377;----;Kanniyakumari;;India;2;08-05N;077-30E;;;36;37; 43;379;----;Tuticorin New Port;;India;2;08-45N;078-11E;;;;2; 43;382;----;Nancowry;;India;2;07-59N;093-32E;;;23;26; 43;385;----;Kondul;;India;2;07-13N;093-44E;;;6;8; 43;404;----;Jaffna;;Sri Lanka;2;09-39N;080-01E;;;3;3;P 43;410;----;Mullaittivu;;Sri Lanka;2;09-16N;080-49E;;;2;2;P 43;413;----;Mannar;;Sri Lanka;2;08-59N;079-55E;08-59N;079-55E;3;3;P 43;415;----;Vavuniya;;Sri Lanka;2;08-45N;080-30E;;;98;98;P 43;418;VCCT;Trincomalee;;Sri Lanka;2;08-35N;081-15E;08-35N;081-15E;3;7;P 43;421;VCCA;Anuradhapura;;Sri Lanka;2;08-20N;080-25E;;;89;89;P 43;422;----;Maha Illuppallama;;Sri Lanka;2;08-07N;080-28E;;;137;137;P 43;424;----;Puttalam;;Sri Lanka;2;08-02N;079-50E;08-02N;079-50E;2;2;P 43;436;VCCB;Batticaloa;;Sri Lanka;2;07-43N;081-42E;;;5;12;P 43;441;----;Kurunegala;;Sri Lanka;2;07-28N;080-22E;;;116;116;P 43;444;----;Kandy;;Sri Lanka;2;07-20N;080-38E;;;479;480;P 43;450;VCBI;Katunayake;;Sri Lanka;2;07-10N;079-53E;;;8;8;P 43;466;----;Colombo;;Sri Lanka;2;06-54N;079-52E;06-54N;079-52E;7;7;P 43;467;VCCC;Ratmalana;;Sri Lanka;2;06-49N;079-53E;;;5;5;P 43;473;----;Nuwara Eliya;;Sri Lanka;2;06-58N;080-46E;;;1880;;P 43;476;----;Diyatalawa;;Sri Lanka;2;06-49N;080-58E;;;1250;;P 43;479;----;Badulla;;Sri Lanka;2;06-59N;081-03E;;;667;;P 43;486;----;Ratnapura;;Sri Lanka;2;06-41N;080-24E;;;37;46;P 43;495;----;Galle;;Sri Lanka;2;06-02N;080-13E;;;9;18;P 43;497;----;Hambantota;;Sri Lanka;2;06-07N;081-08E;06-07N;081-08E;18;20;P 43;533;----;Hanimadu;;Maldives;2;06-44N;073-09E;;;1;; 43;555;VRMM;Male;;Maldives;2;04-12N;073-32E;04-12N;073-32E;2;2; 43;577;----;Kadhdhoo;;Maldives;2;01-53N;073-30E;;;2;; 43;599;VRGN;Gan;;Maldives;2;00-41S;073-09E;00-41S;073-09E;2;2; 44;203;----;Rinchinlhumbe;;Mongolia;2;51-07N;099-40E;;;1583;1583; 44;207;----;Hatgal;;Mongolia;2;50-26N;100-09E;;;1669;1668; 44;212;----;Ulaan-Gom;;Mongolia;2;49-59N;092-05E;49-58N;092-05E;940;939; 44;213;----;Baruunturuun;;Mongolia;2;49-39N;094-24E;;;1232;1232; 44;214;----;Uigi;;Mongolia;2;48-56N;089-56E;;;1716;1715; 44;215;----;Omno-Gobi;;Mongolia;2;49-01N;091-43E;;;1590;1590; 44;218;----;Hovd;;Mongolia;2;48-01N;091-34E;48-01N;091-39E;1406;1405; 44;225;----;Tosontsengel;;Mongolia;2;48-44N;098-12E;;;1724;1723; 44;230;----;Tarialan;;Mongolia;2;49-34N;102-00E;;;1236;1235; 44;231;----;Muren;;Mongolia;2;49-34N;100-10E;49-38N;100-10E;1285;1283; 44;232;----;Hutag;;Mongolia;2;49-23N;102-42E;;;938;938; 44;237;----;Erdenemandal;;Mongolia;2;48-32N;101-23E;48-03N;100-29E;1510;1509; 44;239;----;Bulgan;;Mongolia;2;48-48N;103-33E;48-48N;103-33E;1209;1208; 44;241;----;Baruunkharaa;;Mongolia;2;48-55N;106-04E;48-55N;106-04E;811;807; 44;256;----;Dashbalbar;;Mongolia;2;49-33N;114-24E;;;706;705; 44;259;----;Choibalsan;;Mongolia;2;48-05N;114-33E;48-04N;114-30E;747;747; 44;265;----;Baitag;;Mongolia;2;46-07N;091-28E;;;1186;1186; 44;272;----;Uliastai;;Mongolia;2;47-45N;096-51E;47-45N;096-51E;1761;1759; 44;275;----;Bayanbulag;;Mongolia;2;46-50N;098-05E;;;2255;2255; 44;277;----;Altai;;Mongolia;2;46-24N;096-15E;46-24N;096-15E;2182;2181; 44;282;----;Tsetserleg;;Mongolia;2;47-27N;101-28E;47-27N;101-28E;1693;1691; 44;284;----;Gaiuut;;Mongolia;2;46-42N;100-08E;;;2125;2126; 44;285;----;Hujirt;;Mongolia;2;46-54N;102-46E;;;1662;1662; 44;287;----;Bayanhongor;;Mongolia;2;46-08N;100-41E;;;1860;1859; 44;288;----;Arvaiheer;;Mongolia;2;46-16N;102-47E;46-16N;102-47E;1813;1813; 44;292;----;Ulaan-Baator;;Mongolia;2;47-55N;106-52E;47-56N;106-59E;1307;1306; 44;294;----;Maanti;;Mongolia;2;47-18N;107-29E;;;1429;1430; 44;298;----;Choir;;Mongolia;2;46-27N;108-13E;;;1287;1286; 44;302;----;Bayan-Ovoo;;Mongolia;2;47-47N;112-07E;;;926;926; 44;304;----;Underkhaan;;Mongolia;2;47-19N;110-38E;;;1035;1033; 44;305;----;Baruun-Urt;;Mongolia;2;46-41N;113-17E;;;982;981; 44;313;----;Khalkh-Gol;;Mongolia;2;47-37N;118-37E;;;689;688; 44;314;----;Matad;;Mongolia;2;47-10N;115-38E;;;907;907; 44;336;----;Saikhan-Ovoo;;Mongolia;2;45-27N;103-54E;;;1317;1316; 44;341;----;Mandalgovi;;Mongolia;2;45-46N;106-17E;45-46N;106-17E;1396;1393; 44;347;----;Tsogt-Ovoo;;Mongolia;2;44-25N;105-19E;;;1297;1298; 44;352;----;Bayandelger;;Mongolia;2;45-44N;112-22E;;;1101;1101; 44;354;----;Sainshand;;Mongolia;2;44-54N;110-07E;44-54N;110-07E;936;936; 44;358;----;Zamyn-Uud;;Mongolia;2;43-44N;111-54E;;;965;964; 44;373;----;Dalanzadgad;;Mongolia;2;43-35N;104-25E;43-35N;104-25E;1465;1465; 44;404;----;Dadeldhura;;Nepal;2;29-18N;080-35E;;;1865;1865; 44;416;VNSK;Surkhet;;Nepal;2;28-36N;081-37E;;;720;720; 44;424;VNJL;Jumla;;Nepal;2;29-17N;082-10E;;;2300;; 44;434;VNPK;Pokhara Airport;;Nepal;2;28-13N;084-00E;;;827;827; 44;438;VNBW;Bhairawa Airport;;Nepal;2;27-31N;083-27E;;;109;109; 44;449;VNSI;Simra Airport;;Nepal;2;27-10N;084-59E;;;137;137; 44;454;VNKT;Kathmandu Airport;;Nepal;2;27-42N;085-22E;27-42N;085-22E;1337;1337; 44;461;----;Syangboche;;Nepal;2;27-49N;086-43E;;;3700;3700; 44;462;----;Okhaldhunga;;Nepal;2;27-18N;086-30E;;;1720;1720; 44;474;VNTJ;Taplejung;;Nepal;2;27-21N;087-40E;;;1732;1732; 44;477;----;Dhankuta;;Nepal;2;26-59N;087-21E;;;1445;1445; 44;478;VNVT;Biratnagar Airport;;Nepal;2;26-29N;087-16E;;;72;72; 45;001;VHCH;Cheung Chau;;Hong Kong;2;22-12N;114-01E;;;79;; 45;004;----;King's Park;;Hong Kong;2;22-19N;114-10E;22-19N;114-10E;65;66;P 45;005;----;Royal Observatory;;Hong Kong;2;22-18N;114-10E;;;32;62; 45;007;VHHH;Hong Kong Inter-National Airport;;Hong Kong;2;22-20N;114-11E;;;5;24; 45;010;----;Tate's Cairn;;Hong Kong;2;22-22N;114-13E;;;576;; 45;011;VMMC;Taipa;;Macau;2;22-10N;113-34E;;;114;;P 45;012;----;Macao / Porto;;Macau;2;22-11N;113-31E;;;8;; 45;015;----;Taipa;;Macau;2;22-09N;113-32E;;;6;; 45;018;----;Ka-Ho;;Macau;2;22-08N;113-34E;;;27;; 45;031;----;Ping Chau;;Hong Kong;2;22-33N;114-26E;;;29;; 45;032;----;Ta Kwu Ling;;Hong Kong;2;22-32N;114-09E;;;12;13; 45;033;----;Kat O;;Hong Kong;2;22-32N;114-18E;;;10;; 45;034;----;Tai Mei Tuk;;Hong Kong;2;22-29N;114-14E;;;53;; 45;035;----;Lau Fau Shan;;Hong Kong;2;22-28N;113-59E;;;34;35; 45;036;----;Tap Municipal;;Hong Kong;2;22-28N;114-21E;;;15;; 45;037;----;Tai Po;;Hong Kong;2;22-27N;114-11E;;;4;; 45;038;----;Tuen Municipal;;Hong Kong;2;22-24N;113-58E;;;63;; 45;039;----;Sha Tin;;Hong Kong;2;22-24N;114-12E;;;7;8; 45;040;----;Sai Kung;;Hong Kong;2;22-23N;114-16E;;;3;; 45;041;----;Junk Bay;;Hong Kong;2;22-19N;114-15E;;;32;; 45;042;----;Sha Lo Wan;;Hong Kong;2;22-18N;113-54E;;;58;; 45;043;----;Wong Chuk Hang;;Hong Kong;2;22-15N;114-10E;;;5;; 45;044;----;Cheung Chau;;Hong Kong;2;22-12N;114-01E;;;72;79; 45;045;----;Waglan Island;;Hong Kong;2;22-11N;114-18E;;;55;60; 46;686;RCTP;Chiang Kai Shek;;Taiwan;2;25-05N;121-13E;;;33;; 46;689;RCFG;Mazu;;Taiwan;2;26-10N;119-56E;26-09N;119-57E;91;30; 46;692;----;Taibei = 589680 ;;Taiwan;2;25-02N;121-31E;25-02N;121-31E;9;9; 46;694;----;Chilung;;Taiwan;2;25-09N;121-48E;;;3;; 46;695;----;Pengjia Yu = 589740 ;;Taiwan;2;25-38N;122-04E;25-38N;122-04E;102;102; 46;696;RCSS;Sungshan / Taipei;;Taiwan;2;25-04N;121-33E;;;6;; 46;697;RCGM;Taoyuan Ab = 589650;;Taiwan;2;25-04N;121-14E;25-03N;121-15E;45;48; 46;699;----;Hua-Lien City;;Taiwan;2;23-59N;121-36E;23-59N;121-36E;19;19; 46;706;----;Suao Met Station;;Taiwan;2;24-36N;121-51E;;;3;; 46;708;----;Ilan City;;Taiwan;2;24-45N;121-47E;;;7;; 46;730;RCNO;Dongshi;;Taiwan;2;23-16N;119-40E;;;45;; 46;734;RCQC;Makung Ab;;Taiwan;2;23-35N;119-37E;23-35N;119-37E;31;31; 46;735;----;Penghu Islands;;Taiwan;2;23-30N;119-30E;23-32N;119-34E;21;21; 46;736;RCBS;Chinmem / Shatou Air Force Base ;;Taiwan;2;24-26N;118-22E;24-26N;118-26E;9;12; 46;738;RCUK;Pa Kuei / Bakuai;;Taiwan;2;24-56N;121-18E;;;141;; 46;740;RCKH;Kaohsiung International Airport;;Taiwan;2;22-35N;120-21E;;;9;; 46;741;----;Tainan = 593580 ;;Taiwan;2;23-00N;120-13E;;;14;; 46;743;RCNN;Tainan Tw-Afb ;;Taiwan;2;22-57N;120-12E;22-57N;120-13E;19;16; 46;744;----;Kaohsiung;;Taiwan;2;22-38N;120-17E;;;29;; 46;745;RCAY;Kangshan Tw-Afb ;;Taiwan;2;22-47N;120-16E;;;10;; 46;746;RCKU;Chiayi Tw-Afb ;;Taiwan;2;23-28N;120-23E;23-28N;120-23E;25;25; 46;747;RCMJ;Donggang;;Taiwan;2;22-28N;120-26E;22-28N;120-26E;8;8; 46;748;----;Chiayi;;Taiwan;2;23-30N;120-27E;;;28;; 46;749;----;Taichung = 591580 ;;Taiwan;2;24-09N;120-41E;24-09N;120-41E;78;78; 46;750;RCDC;Pingtung South Air Force Base ;;Taiwan;2;22-41N;120-28E;22-40N;120-27E;24;24; 46;751;RCLG;Taichung Tw-Afb ;;Taiwan;2;24-11N;120-39E;24-11N;120-39E;112;112; 46;752;RCKW;Hengchun;;Taiwan;2;21-56N;120-50E;;;13;; 46;753;----;Mount Alisan;;Taiwan;2;23-31N;120-48E;;;2406;; 46;754;----;Dawu;;Taiwan;2;22-21N;120-54E;;;8;; 46;755;----;Mount Morrison;;Taiwan;2;23-29N;120-57E;;;3850;; 46;756;RCPO;Hsinchu Tw-Afb ;;Taiwan;2;24-49N;120-56E;;;8;; 46;757;----;Hsinchu City;;Taiwan;2;24-50N;120-00E;;;27;; 46;758;RCSQ;Pingtung North Air Force Base ;;Taiwan;2;22-42N;120-29E;;;29;; 46;759;----;Hengchun = 595590 ;;Taiwan;2;22-00N;120-45E;22-00N;120-44E;24;24; 46;760;RCQS;Chihhang Tw-Afb ;;Taiwan;2;22-48N;121-11E;;;37;; 46;761;----;Cheng-Kung;;Taiwan;2;23-06N;121-22E;;;37;; 46;762;RCLY;Lan Yu;;Taiwan;2;22-02N;121-33E;;;325;; 46;763;RCYU;Hulien Ab;;Taiwan;2;24-02N;121-37E;24-01N;121-37E;16;14; 46;764;RCMS;Ilan;;Taiwan;2;24-45N;121-46E;;;9;; 46;765;----;Joyutang;;Taiwan;2;23-53N;120-51E;;;1015;; 46;766;----;Taidong = 595620 ;;Taiwan;2;22-45N;121-09E;22-45N;121-09E;10;10; 46;767;----;Tung-Shih Range;;Taiwan;2;23-32N;120-08E;23-32N;120-08E;1;1; 46;770;RCMQ;Wuchia Observatory;;Taiwan;2;24-16N;120-37E;24-16N;120-37E;5;203; 46;772;RCFS;Chia Tung;;Taiwan;2;22-25N;120-33E;;;20;; 46;777;----;Wu-Chi Observatory;;Taiwan;2;24-15N;120-31E;;;5;; 46;810;RCLM;Dongsha;;Taiwan;2;20-40N;116-43E;20-43N;116-43E;6;3; 46;811;----;Pratas Island;;Taiwan;2;20-43N;116-43E;20-43N;116-43E;3;3; 46;902;----;Nensha Island = 599970 ;;Taiwan;2;10-23N;114-22E;10-43N;115-50E;5;5; 47;003;----;Senbong;;Korea, North;2;42-19N;130-24E;;;2;3;P 47;005;----;Samjiyon;;Korea, North;2;41-49N;128-19E;;;1382;1386;P 47;008;----;Chongjin;;Korea, North;2;41-47N;129-49E;;;42;43;P 47;014;----;Chunggang;;Korea, North;2;41-47N;126-53E;;;331;332;P 47;016;----;Hyesan;;Korea, North;2;41-24N;128-10E;;;715;714;P 47;020;----;Kanggye;;Korea, North;2;40-58N;126-36E;;;305;306;P 47;022;----;Pungsan;;Korea, North;2;40-49N;128-09E;;;1200;1206;P 47;025;ZKKC;Kimchaek;;Korea, North;2;40-40N;129-12E;;;19;23;P 47;028;----;Supung;;Korea, North;2;40-27N;124-56E;;;82;83;P 47;031;----;Changjin;;Korea, North;2;40-22N;127-15E;;;1080;1081;P 47;035;----;Sinuiju;;Korea, North;2;40-06N;124-23E;;;6;7;P 47;037;----;Kusong;;Korea, North;2;39-59N;125-15E;;;101;99;P 47;039;----;Huichon;;Korea, North;2;40-10N;126-15E;;;153;155;P 47;041;----;Hamheung;;Korea, North;2;39-56N;127-33E;39-56N;127-33E;40;38;P 47;046;----;Sinpo;;Korea, North;2;40-02N;128-11E;;;15;19;P 47;050;----;Anju;;Korea, North;2;39-37N;125-39E;;;34;27;P 47;052;----;Yangdok;;Korea, North;2;39-10N;126-50E;;;278;279;P 47;055;----;Wonsan;;Korea, North;2;39-11N;127-26E;;;35;36;P 47;058;ZKPY;Pyongyang;;Korea, North;2;39-02N;125-47E;39-02N;125-47E;36;38;P 47;060;----;Nampo;;Korea, North;2;38-43N;125-22E;;;47;47;P 47;061;----;Changjon;;Korea, North;2;38-44N;128-11E;;;34;35;P 47;065;----;Sariwon;;Korea, North;2;38-31N;125-46E;;;52;52;P 47;067;----;Singye;;Korea, North;2;38-30N;126-32E;;;101;100;P 47;068;----;Ryongyon;;Korea, North;2;38-12N;124-53E;;;5;5;P 47;069;----;Haeju;;Korea, North;2;38-02N;125-42E;;;79;81;P 47;070;----;Kaesong;;Korea, North;2;37-58N;126-34E;;;72;70;P 47;075;----;Pyonggang;;Korea, North;2;38-24N;127-18E;;;375;371;P 47;080;----;Kojin Ab;;Korea, South;2;38-27N;128-27E;;;107;; 47;090;----;Sokcho;;Korea, South;2;38-15N;128-34E;;;18;18;P 47;091;----;Sokcho Airport;;Korea, South;2;38-08N;128-36E;;;30;30; 47;095;----;Cholwon;;Korea, South;2;38-09N;127-19E;;;155;156;P 47;100;----;Taegwallyong;;Korea, South;2;37-41N;128-45E;;;842;843;P 47;101;----;Chunchon;;Korea, South;2;37-54N;127-44E;;;74;75;P 47;103;RKSP;Paengnyongdo Ab;;Korea, South;2;37-58N;124-40E;37-58N;124-40E;171;177; 47;104;RKNC;Chunchon Ab;;Korea, South;2;37-52N;127-43E;37-53N;127-43E;76;75; 47;105;----;Kangnung;;Korea, South;2;37-45N;128-54E;;;26;27;P 47;106;RKSB;Tonghae Radar Site;;Korea, South;2;37-30N;129-08E;37-52N;126-48E;31;32;P 47;107;RKNN;Kangnung Ab;;Korea, South;2;37-45N;128-57E;37-45N;128-57E;11;6; 47;108;RKSL;Seoul;;Korea, South;2;37-34N;126-58E;;;86;87;P 47;110;RKSS;Seoul / Kimp'O International Airport;;Korea, South;2;37-33N;126-48E;37-33N;126-48E;18;18; 47;111;RKSM;Seoul E Ab;;Korea, South;2;37-26N;127-07E;37-26N;127-07E;20;20; 47;112;----;Inchon;;Korea, South;2;37-29N;126-38E;;;69;70;P 47;113;RKSI;Incheon International Airport;;Korea, South;2;37-28N;126-27E;;;7;; 47;114;RKNW;Wonju;;Korea, South;2;37-20N;127-57E;;;150;150;P 47;115;----;Ullungdo;;Korea, South;2;37-29N;130-54E;;;221;223;P 47;116;----;Kwanaksan;;Korea, South;2;37-27N;126-50E;37-27N;126-58E;629;629; 47;117;RKSF;Seoul / Yongdungp'O Rokaf Wc;;Korea, South;2;37-30N;126-56E;;;49;; 47;118;RKNH;Hoengsong Ab;;Korea, South;2;37-26N;127-57E;37-26N;126-58E;100;101; 47;119;----;Suwon;;Korea, South;2;37-16N;126-59E;;;37;38;P 47;120;RKSW;Suwon Ab;;Korea, South;2;37-15N;127-00E;;;24;24; 47;121;----;Yongwol;;Korea, South;2;37-11N;128-27E;;;241;239;P 47;122;RKSO;Osan Ab;;Korea, South;2;37-06N;127-02E;37-06N;127-02E;11;12; 47;124;RKTE;Songmu Ab;;Korea, South;2;36-24N;127-30E;;;79;79; 47;125;RKTI;Jung Won Rok-Ab ;;Korea, South;2;37-02N;127-53E;;;91;; 47;126;RKTM;Mangilsan Ab;;Korea, South;2;36-56N;126-27E;;;302;; 47;127;RKSG;Pyongtaek Ab;;Korea, South;2;36-56N;127-00E;;;16;16; 47;128;RKTU;Chongju Ab;;Korea, South;2;36-42N;127-30E;36-42N;127-30E;58;66; 47;129;----;Sosan;;Korea, South;2;36-46N;126-28E;;;20;21;P 47;130;----;Ulchin;;Korea, South;2;36-59N;129-25E;;;50;51;P 47;131;----;Chongju;;Korea, South;2;36-38N;127-26E;36-38N;127-26E;59;60;P 47;132;RKTD;Taejon Kor-Afb ;;Korea, South;2;36-20N;127-23E;;;63;; 47;133;RKTF;Taejon;;Korea, South;2;36-18N;127-24E;;;77;78;P 47;134;RKTY;Yechon Ab;;Korea, South;2;36-38N;128-21E;36-37N;128-21E;108;120; 47;135;----;Chupungnyong;;Korea, South;2;36-13N;128-00E;36-13N;128-00E;246;249;P 47;136;RKTA;Andong;;Korea, South;2;36-33N;128-43E;;;139;142;P 47;138;----;Pohang;;Korea, South;2;36-02N;129-23E;36-02N;129-23E;6;6;P 47;139;RKTH;Pohang Ab;;Korea, South;2;35-59N;129-25E;35-59N;129-25E;20;20; 47;140;----;Kunsan;;Korea, South;2;35-59N;126-42E;;;26;28;P 47;141;RKJK;Kunsan Ab;;Korea, South;2;35-55N;126-37E;35-54N;126-37E;10;10; 47;142;RKTN;Taegu Ab;;Korea, South;2;35-54N;128-39E;35-54N;128-39E;35;37; 47;143;RKTT;Taegu;;Korea, South;2;35-53N;128-37E;;;58;61;P 47;144;----;Kunsan Radar Site;;Korea, South;2;36-01N;126-47E;;;215;; 47;146;----;Chonju;;Korea, South;2;35-49N;127-09E;;;51;53;P 47;151;----;Ulsan Airport;;Korea, South;2;35-35N;129-21E;;;9;13; 47;152;RKPU;Ulsan;;Korea, South;2;35-33N;129-19E;;;32;33;P 47;153;RKPK;Pusan / Kimhae International Airport;;Korea, South;2;35-11N;128-56E;35-11N;128-56E;4;6; 47;155;----;Masan;;Korea, South;2;35-11N;128-34E;;;5;6;P 47;156;----;Kwangju;;Korea, South;2;35-10N;126-53E;;;70;74;P 47;158;RKJJ;Kwangju Ab;;Korea, South;2;35-07N;126-49E;35-07N;126-49E;13;13; 47;159;----;Pusan;;Korea, South;2;35-06N;129-02E;;;69;71;P 47;160;----;Pusan Radar Site;;Korea, South;2;35-07N;129-00E;;;523;; 47;161;RKPS;Sach'On Ab;;Korea, South;2;35-05N;128-05E;35-05N;128-05E;8;8; 47;162;----;Chungmu;;Korea, South;2;34-50N;128-26E;;;32;40;P 47;164;----;Muan;;Korea, South;2;35-06N;126-17E;;;23;24;P 47;165;----;Mokp'O;;Korea, South;2;34-47N;126-23E;;;53;56;P 47;166;----;Mokpo Airport;;Korea, South;2;34-45N;126-23E;;;7;4; 47;167;RKJY;Yosu Airport;;Korea, South;2;34-50N;127-37E;;;21;20; 47;168;----;Yosu;;Korea, South;2;34-44N;127-44E;;;67;68;P 47;170;----;Wando;;Korea, South;2;34-18N;126-45E;;;15;12;P 47;182;RKPC;Cheju International Airport;;Korea, South;2;33-30N;126-30E;;;36;28; 47;184;----;Cheju;;Korea, South;2;33-31N;126-32E;;;22;24;P 47;185;----;Cheju Upper / Radar;;Korea, South;2;33-17N;126-10E;33-17N;126-10E;72;73;P 47;187;RKPM;Mosulpo Ab;;Korea, South;2;33-12N;126-16E;33-12N;126-16E;27;27; 47;189;----;Sogwipo;;Korea, South;2;33-14N;126-34E;;;52;53;P 47;192;----;Chinju;;Korea, South;2;35-12N;128-06E;;;22;23;P 47;401;----;Wakkanai;;Japan;2;45-25N;141-41E;45-25N;141-41E;3;11;P 47;402;----;Kitamiesashi;;Japan;2;44-56N;142-35E;;;7;8; 47;404;----;Haboro;;Japan;2;44-22N;141-42E;;;8;13; 47;405;----;Omu;;Japan;2;44-35N;142-58E;;;14;15; 47;406;----;Rumoi;;Japan;2;43-57N;141-38E;;;24;28; 47;407;----;Asahikawa;;Japan;2;43-46N;142-22E;43-46N;142-22E;112;116;P 47;409;----;Abashiri;;Japan;2;44-01N;144-17E;;;38;43;P 47;411;----;Otaru;;Japan;2;43-11N;141-01E;;;25;26; 47;412;----;Sapporo;;Japan;2;43-03N;141-20E;43-03N;141-20E;17;19;P 47;413;----;Iwamizawa;;Japan;2;43-13N;141-47E;;;42;51; 47;415;----;Sapporo / Kenashiyama;;Japan;2;43-08N;141-01E;;;700;; 47;417;----;Obihiro;;Japan;2;42-55N;143-13E;;;38;43; 47;418;RJCS;Kushiro;;Japan;2;42-59N;144-24E;;;32;37;P 47;420;----;Nemuro;;Japan;2;43-20N;145-35E;43-20N;145-35E;25;39;P 47;421;----;Suttsu;;Japan;2;42-48N;140-14E;;;33;38;P 47;423;RJCY;Muroran;;Japan;2;42-19N;140-59E;;;40;49; 47;424;----;Tomakomai;;Japan;2;42-37N;141-33E;;;6;11; 47;425;RJCC;Chitose Ab;;Japan;2;42-48N;141-40E;;;27;30; 47;426;----;Urakawa;;Japan;2;42-10N;142-47E;;;33;33;P 47;428;----;Esashi;;Japan;2;41-52N;140-08E;;;4;12; 47;429;----;Mori;;Japan;2;42-06N;140-34E;;;18;27; 47;430;----;Hakodate;;Japan;2;41-49N;140-45E;;;35;43;P 47;431;----;Esan Cape / Lgt-H ;;Japan;2;41-49N;141-11E;;;36;; 47;432;----;Hakodake / Yokotsudake;;Japan;2;41-56N;140-47E;;;1111;; 47;433;----;Kutchan;;Japan;2;42-54N;140-46E;;;176;188; 47;434;RJCJ;Chitose Japanese Air Self Defense Force ;;Japan;2;42-49N;141-41E;;;27;; 47;435;----;Mombetsu;;Japan;2;44-21N;143-22E;;;16;16; 47;440;----;Hiroo;;Japan;2;42-18N;143-19E;;;32;33; 47;441;RJCW;Wakkanai Airport;;Japan;2;45-24N;141-48E;;;8;11; 47;472;----;Rishiri Airport;;Japan;2;45-14N;141-12E;;;30;33; 47;474;RJEB;Mombetsu Airport;;Japan;2;44-15N;143-32E;;;6;9; 47;476;RJEC;Asahikawa Airport;;Japan;2;43-40N;142-27E;;;208;211; 47;477;RJCA;Asahikawa Ab;;Japan;2;43-48N;142-22E;;;115;118; 47;479;RJCO;Sapporo Ab;;Japan;2;43-07N;141-23E;;;8;11; 47;480;----;Memambetsu;;Japan;2;43-55N;144-12E;;;39;41; 47;481;RJCM;Memambetsu Airport;;Japan;2;43-53N;144-10E;;;33;36; 47;483;RJCN;Nakashibetsu Airport;;Japan;2;43-34N;144-58E;;;66;69; 47;487;----;New Chitose Airport;;Japan;2;42-46N;141-42E;;;22;25; 47;488;RJCH;Hakodate Airport;;Japan;2;41-46N;140-49E;;;33;36; 47;489;RJCK;Kushiro Airport;;Japan;2;43-02N;144-12E;;;95;98; 47;490;RJCB;Obihiro Airport;;Japan;2;42-44N;143-13E;;;149;152; 47;491;----;Okushiri Airport;;Japan;2;42-04N;139-27E;;;36;39; 47;512;----;Ofunato;;Japan;2;39-04N;141-43E;;;37;41; 47;513;----;Ryori;;Japan;2;39-02N;141-50E;;;260;261; 47;515;RJSH;Hachinohe Ab;;Japan;2;40-33N;141-28E;40-33N;141-28E;46;49; 47;516;RJSO;Ominato Ab;;Japan;2;41-14N;141-08E;41-14N;141-09E;7;10; 47;517;----;Ominato;;Japan;2;41-14N;141-09E;;;10;; 47;520;----;Shinjo;;Japan;2;38-45N;140-19E;;;105;113; 47;542;RJSA;Aomori Airport;;Japan;2;40-44N;140-42E;;;199;202; 47;545;RJSK;Akita Airport;;Japan;2;39-37N;140-13E;;;93;96; 47;549;RJSI;Hanamaki Airport;;Japan;2;39-26N;141-08E;;;90;93; 47;551;----;Shonai Airport;;Japan;2;38-49N;139-47E;;;22;25; 47;553;RJSC;Yamagata Airport;;Japan;2;38-25N;140-22E;;;105;108; 47;557;RJSF;Fukushima Airport;;Japan;2;37-14N;140-26E;;;372;375; 47;567;RJSU;Kasuminome Ab;;Japan;2;38-14N;140-55E;;;7;10; 47;569;RJSS;Sendai Airport;;Japan;2;38-08N;140-55E;;;1;4; 47;570;----;Wakamatsu;;Japan;2;37-29N;139-55E;;;212;213;P 47;572;----;Niigata / Yahikoyama;;Japan;2;37-43N;138-49E;;;634;; 47;573;RJSN;Niigata Airport;;Japan;2;37-57N;139-07E;;;1;4; 47;574;----;Fukaura;;Japan;2;40-39N;139-56E;;;66;67; 47;575;----;Aomori;;Japan;2;40-49N;140-46E;;;3;3;P 47;576;----;Mutsu;;Japan;2;41-17N;141-13E;;;3;5; 47;577;----;Shiriya Point / Lh ;;Japan;2;41-26N;141-28E;;;16;; 47;580;RJSM;Misawa Ab;;Japan;2;40-42N;141-23E;40-41N;141-22E;36;39; 47;581;----;Hachinohe;;Japan;2;40-32N;141-32E;;;27;28; 47;582;----;Akita;;Japan;2;39-43N;140-06E;39-43N;140-06E;6;21;P 47;584;----;Morioka;;Japan;2;39-42N;141-10E;;;155;157; 47;585;----;Miyako;;Japan;2;39-39N;141-58E;;;43;46;P 47;587;----;Sakata;;Japan;2;38-54N;139-51E;;;3;4; 47;588;----;Yamagata;;Japan;2;38-15N;140-21E;;;153;153; 47;590;----;Sendai;;Japan;2;38-16N;140-54E;38-16N;140-54E;39;43;P 47;591;RJST;Matsushima Ab;;Japan;2;38-24N;141-13E;;;2;5; 47;592;----;Ishinomaki;;Japan;2;38-26N;141-18E;;;43;50; 47;595;----;Fukushima;;Japan;2;37-45N;140-28E;;;67;69; 47;597;----;Shirakawa;;Japan;2;37-08N;140-13E;;;355;372; 47;598;----;Onahama;;Japan;2;36-57N;140-54E;;;3;5;P 47;600;----;Wajima;;Japan;2;37-23N;136-54E;37-23N;136-54E;5;14;P 47;601;----;Hegurashima;;Japan;2;37-51N;136-55E;;;12;14; 47;602;----;Aikawa;;Japan;2;38-02N;138-15E;;;6;17;P 47;604;----;Niigata;;Japan;2;37-55N;139-03E;37-55N;139-03E;2;7; 47;605;----;Kanazawa;;Japan;2;36-35N;136-38E;;;6;33;P 47;606;----;Fushiki;;Japan;2;36-47N;137-03E;;;12;13; 47;607;----;Toyama;;Japan;2;36-42N;137-12E;;;9;17; 47;610;----;Nagano;;Japan;2;36-40N;138-12E;;;418;419; 47;612;----;Takada;;Japan;2;37-06N;138-15E;;;13;18; 47;615;----;Utsunomiya;;Japan;2;36-33N;139-52E;;;119;140; 47;616;----;Fukui;;Japan;2;36-03N;136-14E;;;9;17; 47;617;----;Takayama;;Japan;2;36-09N;137-15E;;;560;561; 47;618;----;Matsumoto;;Japan;2;36-15N;137-58E;;;610;611;P 47;620;----;Suwa;;Japan;2;36-03N;138-07E;;;760;762; 47;622;----;Karuizawa;;Japan;2;36-20N;138-33E;;;999;1004; 47;624;----;Maebashi;;Japan;2;36-24N;139-04E;36-24N;139-04E;112;113;P 47;626;----;Kumagaya;;Japan;2;36-09N;139-23E;;;30;31; 47;628;----;Kakioka;;Japan;2;36-14N;140-12E;;;28;28; 47;629;----;Mito;;Japan;2;36-23N;140-28E;36-23N;140-35E;29;31; 47;631;----;Tsuruga;;Japan;2;35-39N;136-04E;;;2;12; 47;632;----;Gifu;;Japan;2;35-24N;136-46E;;;13;17; 47;634;RJNG;Gifu Ab;;Japan;2;35-23N;136-52E;;;39;42; 47;635;RJNN;Nagoya Airport;;Japan;2;35-15N;136-56E;;;14;17; 47;636;----;Nagoya;;Japan;2;35-10N;136-58E;;;51;56;P 47;637;----;Iida;;Japan;2;35-31N;137-50E;;;482;484; 47;638;----;Kofu;;Japan;2;35-40N;138-33E;;;273;281; 47;639;----;Fujisan;;Japan;2;35-21N;138-44E;;;3772;3773; 47;640;----;Kawaguchiko;;Japan;2;35-30N;138-46E;;;860;861; 47;641;----;Chichibu;;Japan;2;35-59N;139-05E;;;218;219; 47;642;RJTY;Yokota Ab;;Japan;2;35-45N;139-21E;;;139;142; 47;643;RJTJ;Iruma Ab;;Japan;2;35-50N;139-25E;35-50N;139-25E;90;93; 47;644;----;Kiyose;;Japan;2;35-46N;139-32E;35-46N;139-32E;;; 47;646;----;Tateno;;Japan;2;36-03N;140-08E;36-03N;140-08E;25;31; 47;648;----;Choshi;;Japan;2;35-44N;140-52E;;;20;28;P 47;649;----;Ueno;;Japan;2;34-46N;136-09E;;;159;165; 47;651;----;Tsu;;Japan;2;34-44N;136-31E;;;3;18; 47;653;----;Irako;;Japan;2;34-38N;137-06E;;;6;8; 47;654;----;Hamamatsu;;Japan;2;34-42N;137-43E;;;32;33; 47;655;----;Omaezaki;;Japan;2;34-36N;138-13E;34-36N;138-13E;45;47;P 47;656;----;Shizuoka;;Japan;2;34-58N;138-24E;;;14;15; 47;657;----;Mishima;;Japan;2;35-07N;138-56E;;;21;22; 47;658;RJNY;Shizuhama Ab;;Japan;2;34-49N;138-18E;;;7;10; 47;660;RJTC;Tachikawa Ab;;Japan;2;35-42N;139-24E;;;95;98; 47;661;RJTK;Kisarazu Ab;;Japan;2;35-24N;139-55E;;;3;6; 47;662;RJTD;Tokyo;;Japan;2;35-41N;139-46E;;;5;36;P 47;663;----;Owase;;Japan;2;34-04N;136-12E;;;15;27;P 47;665;----;Dai Light House ;;Japan;2;34-16N;136-54E;;;27;; 47;666;----;Irozaki;;Japan;2;34-36N;138-51E;;;55;56; 47;668;----;Ajiro;;Japan;2;35-03N;139-06E;;;67;68; 47;670;----;Yokohama;;Japan;2;35-26N;139-39E;;;39;42; 47;671;RJTT;Tokyo International Airport;;Japan;2;35-33N;139-47E;;;5;8; 47;672;----;Tateyama;;Japan;2;34-59N;139-52E;;;6;7; 47;674;----;Katsuura;;Japan;2;35-09N;140-19E;;;12;13; 47;675;----;Oshima;;Japan;2;34-45N;139-22E;;;74;79;P 47;677;----;Miyakejima;;Japan;2;34-07N;139-31E;;;36;37; 47;678;----;Hachijojima;;Japan;2;33-06N;139-47E;33-07N;139-47E;79;80;P 47;679;RJTA;Atsugi United States Naval Air Station;;Japan;2;35-27N;139-27E;35-27N;139-28E;62;65; 47;680;RJTR;Zama Airfield;;Japan;2;35-31N;139-24E;;;109;112; 47;681;RJNH;Hamamatsu Ab;;Japan;2;34-45N;137-42E;34-44N;137-40E;45;48; 47;682;----;Chiba;;Japan;2;35-36N;140-06E;;;4;19; 47;683;RJTF;Chofu Airport;;Japan;2;35-40N;139-32E;;;41;44; 47;684;----;Yokkaichi;;Japan;2;34-56N;136-35E;34-56N;136-35E;47;52; 47;685;----;Matsushiro;;Japan;2;36-33N;138-13E;;;440;440; 47;686;RJAA;New Tokyo Inter-National Airport;;Japan;2;35-46N;140-23E;;;41;44; 47;687;RJTI;Tokyo Heliport;;Japan;2;35-38N;139-51E;;;5;8; 47;688;RJTE;Tateyama Ab;;Japan;2;34-59N;139-50E;34-59N;139-50E;3;6; 47;690;----;Nikko;;Japan;2;36-44N;139-30E;;;1292;1298; 47;692;RJTU;Utsunomiya Ab;;Japan;2;36-31N;139-52E;;;102;105; 47;695;----;Tokyo / Kashiwa;;Japan;2;35-51N;139-58E;;;19;; 47;696;RJTX;Yokosuka Fwf;;Japan;2;35-17N;139-40E;;;49;53; 47;700;RJSD;Sado Airport;;Japan;2;38-03N;138-25E;;;23;26; 47;704;RJNK;Komatsu Ab;;Japan;2;36-23N;136-25E;;;6;9; 47;705;----;Fukui / Tojimbo;;Japan;2;36-14N;136-09E;;;80;; 47;706;RJNF;Fukui Airport;;Japan;2;36-08N;136-14E;;;5;8; 47;707;RJNT;Toyama Airport;;Japan;2;36-39N;137-11E;;;24;27; 47;709;RJAF;Matsumoto Airport;;Japan;2;36-10N;137-56E;;;668;661; 47;715;RJAH;Hyakuri Ab;;Japan;2;36-11N;140-25E;;;32;35; 47;716;RJAK;Kasumigaura Ab;;Japan;2;36-02N;140-12E;;;26;29; 47;721;RJAT;Fuji Ab;;Japan;2;35-19N;138-52E;;;680;683; 47;727;RJTL;Shimofusa Ab;;Japan;2;35-48N;140-01E;35-47N;140-01E;30;33; 47;730;RJOE;Akeno Ab;;Japan;2;34-32N;136-41E;;;6;9; 47;735;RJTO;Oshima Airport;;Japan;2;34-47N;139-22E;;;38;41; 47;737;RJTQ;Miyakejima Airport;;Japan;2;34-04N;139-34E;;;20;23; 47;738;RJTH;Hachijojima Airport;;Japan;2;33-07N;139-47E;;;92;95; 47;739;RJNO;Oki Airport;;Japan;2;36-11N;133-20E;;;92;95; 47;740;----;Saigo;;Japan;2;36-12N;133-20E;;;27;31;P 47;741;----;Matsue;;Japan;2;35-27N;133-04E;;;17;22;P 47;742;----;Sakai;;Japan;2;35-33N;133-14E;;;2;3; 47;743;RJOH;Miho Ab;;Japan;2;35-29N;133-15E;;;6;9; 47;744;----;Yonago;;Japan;2;35-26N;133-21E;35-26N;133-21E;6;8; 47;746;----;Tottori;;Japan;2;35-29N;134-14E;35-31N;134-11E;7;15;P 47;747;----;Toyooka;;Japan;2;35-32N;134-49E;;;3;4; 47;750;----;Maizuru;;Japan;2;35-27N;135-19E;;;3;22;P 47;751;----;Ibukiyama;;Japan;2;35-25N;136-25E;;;1376;1377; 47;754;----;Hagi;;Japan;2;34-25N;131-24E;;;6;7; 47;755;----;Hamada;;Japan;2;34-54N;132-04E;;;19;20;P 47;756;----;Tsuyama;;Japan;2;35-04N;134-01E;;;146;147; 47;759;----;Kyoto;;Japan;2;35-01N;135-44E;;;41;46; 47;761;----;Hikone;;Japan;2;35-16N;136-15E;;;87;89; 47;762;----;Shimonoseki;;Japan;2;33-57N;130-56E;;;3;19; 47;764;RJOI;MCAS IWAKUNI,JAPAN;JA;Japan;2;34-09N;132-14E;34-08N;132-14E;2;5; 47;765;----;Hiroshima;;Japan;2;34-24N;132-28E;;;4;53; 47;766;----;Kure;;Japan;2;34-14N;132-33E;;;4;12; 47;767;----;Fukuyama;;Japan;2;34-27N;133-15E;;;2;3; 47;768;----;Okayama;;Japan;2;34-39N;133-55E;;;3;18; 47;769;----;Himeji;;Japan;2;34-50N;134-40E;;;38;40; 47;770;----;Kobe;;Japan;2;34-41N;135-11E;;;58;59; 47;771;RJOO;Osaka International Airport;;Japan;2;34-47N;135-27E;;;12;15; 47;772;----;Osaka;;Japan;2;34-41N;135-31E;34-41N;135-31E;23;83;P 47;773;----;Osaka / Takayasuyama;;Japan;2;34-37N;135-40E;;;474;; 47;774;RJBB;Kansai International Airport;;Japan;2;34-25N;135-15E;;;5;8; 47;776;----;Sumoto;;Japan;2;34-20N;134-54E;;;109;112; 47;777;----;Wakayama;;Japan;2;34-14N;135-10E;;;14;18; 47;778;----;Shionomisaki;;Japan;2;33-27N;135-46E;33-27N;135-46E;73;75;P 47;779;RJOY;Yao Airport;;Japan;2;34-36N;135-36E;;;10;13; 47;780;----;Nara;;Japan;2;34-41N;135-50E;;;104;106; 47;782;RJBD;Nankishirahama Airport;;Japan;2;33-40N;135-21E;;;105;108; 47;783;RJOW;Iwami Airport;;Japan;2;34-40N;131-48E;;;54;57; 47;784;----;Yamaguchi;;Japan;2;34-09N;131-27E;;;17;18; 47;786;RJDC;Yamaguchi Ube Airport;;Japan;2;33-56N;131-17E;;;5;8; 47;787;RJOZ;Ozuki Ab;;Japan;2;34-03N;131-03E;34-03N;131-03E;4;7; 47;788;RJOF;Hofu Ab;;Japan;2;34-02N;131-33E;34-02N;131-32E;2;5; 47;789;RJOA;Hiroshima Airport;;Japan;2;34-26N;132-55E;;;331;334; 47;790;RJOC;Izumo Airport;;Japan;2;35-25N;132-54E;;;2;5; 47;791;----;Matsue / Misakayama;;Japan;2;35-32N;133-06E;;;535;; 47;792;----;Hiroshima / Haigamine;;Japan;2;34-16N;132-36E;;;734;; 47;793;RJOB;Okayama Airport;;Japan;2;34-45N;133-51E;;;241;244; 47;794;RJOR;Tottori Airport;;Japan;2;35-32N;134-10E;;;15;18; 47;799;RJDT;Tsushima Airport;;Japan;2;34-17N;129-20E;;;63;66; 47;800;----;Izuhara;;Japan;2;34-12N;129-18E;;;4;19;P 47;803;RJFA;Ashiya Ab;;Japan;2;33-53N;130-39E;;;30;33; 47;805;----;Hirado;;Japan;2;33-21N;129-33E;;;58;58; 47;806;----;Fukuoka / Sefurisan;;Japan;2;33-26N;130-22E;;;960;; 47;807;----;Fukuoka;;Japan;2;33-35N;130-23E;33-35N;130-23E;3;14;P 47;808;RJFF;Fukuoka Airport;;Japan;2;33-35N;130-27E;33-35N;130-27E;9;12; 47;809;----;Iizuka;;Japan;2;33-39N;130-42E;;;37;38; 47;811;RJFW;Sasebo Usn;;Japan;2;33-09N;129-43E;;;19;22; 47;812;----;Sasebo;;Japan;2;33-09N;129-44E;;;17;15; 47;813;----;Saga;;Japan;2;33-15N;130-18E;;;4;5; 47;814;----;Hita;;Japan;2;33-19N;130-56E;;;83;84; 47;815;----;Oita;;Japan;2;33-14N;131-37E;;;5;13;P 47;817;----;Nagasaki;;Japan;2;32-44N;129-52E;;;27;35;P 47;818;----;Unzendake;;Japan;2;32-44N;130-16E;;;678;679; 47;819;----;Kumamoto;;Japan;2;32-49N;130-43E;;;38;39; 47;821;----;Asosan;;Japan;2;32-53N;131-05E;;;1143;1144; 47;822;----;Nobeoka;;Japan;2;32-35N;131-40E;;;19;21; 47;823;----;Akune;;Japan;2;32-01N;130-12E;;;40;45; 47;824;----;Hitoyoshi;;Japan;2;32-13N;130-45E;;;146;147; 47;827;----;Kagoshima;;Japan;2;31-33N;130-33E;31-38N;130-35E;4;31;P 47;829;----;Miyakonojo;;Japan;2;31-44N;131-05E;;;154;155; 47;830;----;Miyazaki;;Japan;2;31-55N;131-25E;;;6;7;P 47;831;----;Makurazaki;;Japan;2;31-16N;130-18E;;;30;31; 47;833;----;Kanoya;;Japan;2;31-25N;130-53E;;;105;; 47;835;----;Aburatsu;;Japan;2;31-34N;131-25E;;;3;15; 47;836;RJFC;Yakushima;;Japan;2;30-23N;130-40E;;;36;38; 47;837;----;Tanegashima;;Japan;2;30-44N;131-00E;;;17;18;P 47;838;----;Ushibuka;;Japan;2;32-12N;130-02E;;;3;14; 47;840;RJFZ;Tsuiki Ab;;Japan;2;33-41N;131-03E;;;17;20; 47;842;----;Meshima;;Japan;2;31-59N;128-21E;;;109;110; 47;843;----;Fukue;;Japan;2;32-42N;128-50E;;;25;26;P 47;844;RJFE;Fukue Airport;;Japan;2;32-40N;128-50E;;;77;80; 47;849;----;Uchinoura;;Japan;2;31-15N;131-05E;31-15N;131-05E;277;277; 47;850;RJFY;Kanoya Ab;;Japan;2;31-22N;130-50E;31-21N;130-50E;65;68; 47;851;RJFK;Kagoshima Airport;;Japan;2;31-48N;130-43E;;;272;275; 47;852;RJFO;Oita Airport;;Japan;2;33-29N;131-44E;;;5;8; 47;853;RJFR;Kitakyushu Airport;;Japan;2;33-50N;130-57E;;;3;6; 47;854;RJFN;Nyutabaru Ab;;Japan;2;32-05N;131-27E;;;79;82; 47;855;RJFU;Nagasaki Airport;;Japan;2;32-55N;129-55E;32-55N;129-55E;2;5; 47;856;RJFT;Kumamoto Airport;;Japan;2;32-50N;130-51E;;;193;196; 47;857;RJFM;Miyazaki Airport;;Japan;2;31-52N;131-27E;;;6;9; 47;858;RJDB;Iki Airport;;Japan;2;33-45N;129-47E;;;13;16; 47;860;RJDM;Metabaru Ab;;Japan;2;33-19N;130-25E;;;16;19; 47;869;----;Tanegashima / Nakatane;;Japan;2;30-38N;130-59E;;;281;; 47;870;RJFG;Tanegashima Airport;;Japan;2;30-33N;130-57E;;;92;95; 47;872;RJKA;Amami Airport;;Japan;2;28-26N;129-43E;;;4;7; 47;880;RJOT;Takamatsu Airport;;Japan;2;34-13N;134-01E;;;185;188; 47;881;RJOS;Tokushima Ab;;Japan;2;34-08N;134-37E;34-08N;134-36E;8;11; 47;882;RJOM;Matsuyama Airport;;Japan;2;33-49N;132-42E;;;4;7; 47;883;RJOK;Kochi Airport;;Japan;2;33-32N;133-40E;;;7;10; 47;884;RJOP;Komatsujima Ab;;Japan;2;34-00N;134-38E;34-00N;134-38E;3;6; 47;887;----;Matsuyama;;Japan;2;33-50N;132-47E;33-50N;132-47E;32;34;P 47;890;----;Tadotsu;;Japan;2;34-16N;133-45E;;;4;5; 47;891;----;Takamatsu;;Japan;2;34-19N;134-03E;;;9;10;P 47;892;----;Uwajima;;Japan;2;33-13N;132-33E;;;2;14; 47;893;----;Kochi;;Japan;2;33-33N;133-32E;;;2;18; 47;894;----;Tsurugisan;;Japan;2;33-51N;134-06E;;;1945;1946; 47;895;----;Tokushima;;Japan;2;34-04N;134-35E;;;2;6; 47;897;----;Sukumo;;Japan;2;32-55N;132-42E;;;2;11; 47;898;----;Shimizu;;Japan;2;32-43N;133-01E;32-43N;133-01E;31;33;P 47;899;----;Murotomisaki;;Japan;2;33-15N;134-11E;;;185;186;P 47;907;----;Tokunoshima Airport;;Japan;2;27-50N;128-53E;;;2;5; 47;909;----;Naze;;Japan;2;28-23N;129-30E;28-23N;129-33E;3;7;P 47;910;RJKN;Tokunoshima Island;;Japan;2;27-50N;128-53E;;;5;; 47;911;ROYN;Yonaguni Airport;;Japan;2;24-28N;122-59E;;;16;19; 47;912;----;Yonagunijima;;Japan;2;24-28N;123-01E;;;30;36; 47;917;----;Iriomotejima;;Japan;2;24-23N;123-45E;;;9;9; 47;918;ROIG;Ishigakijima;;Japan;2;24-20N;124-10E;24-20N;124-10E;6;7;P 47;919;----;Ishigaki Airport;;Japan;2;24-20N;124-11E;24-20N;124-11E;26;29; 47;920;----;Ishigakijima / Omotodake;;Japan;2;24-25N;124-11E;;;516;; 47;925;----;Shimojishima Airport;;Japan;2;24-49N;125-09E;;;8;11; 47;926;----;Miyako Airport;;Japan;2;24-47N;125-18E;;;43;46; 47;927;ROMY;Miyakojima;;Japan;2;24-47N;125-17E;;;40;41;P 47;928;----;Kumejima Airport;;Japan;2;26-22N;126-43E;;;6;9; 47;929;ROKJ;Kumejima;;Japan;2;26-20N;126-48E;;;4;5; 47;930;ROAH;Naha Airport;;Japan;2;26-11N;127-39E;;;3;6; 47;931;RODN;Kadena Ab;;Japan;2;26-21N;127-46E;26-21N;127-45E;45;48; 47;933;ROTM;Futenma Marine Corps Air Facility;;Japan;2;26-16N;127-45E;;;75;78; 47;935;ROHF;Hamby U. S. Army Airfield;;Japan;2;26-18N;127-46E;;;5;6; 47;936;----;Naha;;Japan;2;26-12N;127-41E;26-12N;127-41E;28;53;P 47;937;----;Naha / Itokazu;;Japan;2;26-09N;127-46E;;;180;; 47;938;RODE;Iejima Auxiliary Ab;;Japan;2;26-43N;127-47E;26-43N;127-47E;70;73; 47;940;----;Nago;;Japan;2;26-35N;127-58E;;;6;18; 47;942;RJKB;Okinoerabu;;Japan;2;27-26N;128-42E;;;27;29; 47;944;----;Minamidaito Airport;;Japan;2;25-51N;131-14E;;;4;7; 47;945;ROMD;Minamidaitojima;;Japan;2;25-50N;131-14E;25-50N;131-14E;16;20;P 47;971;RJAO;Chichijima;;Japan;2;27-05N;142-11E;27-05N;142-11E;3;8;P 47;981;RJAW;Iwojima;;Japan;2;24-47N;141-19E;24-47N;141-20E;113;116; 47;991;RJAM;Minamitorishima;;Japan;2;24-18N;153-58E;24-18N;153-58E;8;9;P 48;001;VBPT;Putao;;Myanmar;2;27-20N;097-25E;;;409;; 48;004;----;Hkamti;;Myanmar;2;26-00N;095-42E;;;146;; 48;008;VBMK;Myitkyina;;Myanmar;2;25-22N;097-24E;25-22N;097-24E;145;147;P 48;010;VBHL;Homalin;;Myanmar;2;24-52N;094-55E;;;130;131; 48;017;----;Pinlebu;;Myanmar;2;24-05N;095-22E;;;259;; 48;018;----;Katha;;Myanmar;2;24-10N;096-20E;;;113;95; 48;019;VBBM;Bhamo;;Myanmar;2;24-16N;097-12E;;;111;113; 48;020;----;Mawlaik;;Myanmar;2;23-38N;094-25E;;;115;116; 48;024;----;Kalemyo;;Myanmar;2;23-12N;094-04E;;;152;; 48;025;----;Kalewa;;Myanmar;2;23-12N;094-18E;;;109;109; 48;031;----;Falam;;Myanmar;2;22-55N;093-41E;;;1372;; 48;033;----;Shwebo;;Myanmar;2;22-35N;095-43E;;;106;110; 48;035;VBLS;Lashio;;Myanmar;2;22-56N;097-45E;;;747;749; 48;036;----;Gangaw;;Myanmar;2;22-10N;094-08E;;;214;; 48;037;----;Monywa;;Myanmar;2;22-06N;095-08E;;;81;82; 48;040;----;Hsipaw;;Myanmar;2;22-36N;097-18E;;;436;; 48;042;VBRM;Mandalay;;Myanmar;2;21-59N;096-06E;21-59N;096-06E;74;76; 48;045;----;Mindat;;Myanmar;2;21-23N;093-57E;;;1395;; 48;047;----;Myingyan;;Myanmar;2;21-28N;095-23E;;;60;; 48;048;----;Nyaung-U;;Myanmar;2;21-12N;094-55E;;;61;55; 48;053;VBML;Meiktila;;Myanmar;2;20-50N;095-50E;20-53N;095-54E;214;220;P 48;057;----;Taunggyi;;Myanmar;2;20-47N;097-03E;;;1436;; 48;058;----;Loilem;;Myanmar;2;20-55N;097-33E;;;1355;; 48;060;VBKG;Kengtung;;Myanmar;2;21-18N;099-37E;21-18N;099-37E;827;828; 48;062;VYSW;Sittwe;;Myanmar;2;20-08N;092-53E;20-08N;092-53E;4;5;P 48;064;----;Minbu;;Myanmar;2;20-10N;094-53E;;;48;51; 48;067;----;Yamethin;;Myanmar;2;20-25N;096-09E;;;199;; 48;068;----;Pinlaung;;Myanmar;2;20-08N;096-46E;;;1463;; 48;070;----;Monghsat;;Myanmar;2;20-33N;099-16E;;;572;; 48;071;VBKP;Kyaukpyu;;Myanmar;2;19-25N;093-33E;;;5;5; 48;074;----;Pyinmana;;Myanmar;2;19-43N;096-13E;;;101;104; 48;075;----;Loikaw;;Myanmar;2;19-41N;097-13E;;;895;; 48;077;VBPR;Prome;;Myanmar;2;18-48N;095-13E;;;58;60; 48;078;----;Toungoo;;Myanmar;2;18-55N;096-28E;18-55N;096-28E;47;49; 48;080;VBSY;Sandoway;;Myanmar;2;18-28N;094-21E;18-28N;094-21E;9;11;P 48;087;----;Henzada;;Myanmar;2;17-40N;095-25E;;;26;; 48;088;----;Tharrawaddy;;Myanmar;2;17-38N;095-48E;;;15;15; 48;089;----;Shwegyin;;Myanmar;2;17-55N;096-52E;;;12;14; 48;090;----;Papun;;Myanmar;2;18-04N;097-27E;;;95;97; 48;093;----;Bago;;Myanmar;2;17-20N;096-30E;;;15;; 48;094;VBBS;Pathein;;Myanmar;2;16-46N;094-46E;16-46N;094-46E;9;10;P 48;095;----;Maubin;;Myanmar;2;16-44N;095-39E;;;3;5; 48;096;VBRR;Mingaladon;;Myanmar;2;16-54N;096-11E;16-54N;096-11E;28;29; 48;097;VYYY;Yangon;;Myanmar;2;16-46N;096-10E;16-46N;096-10E;14;15;P 48;098;----;Thaton;;Myanmar;2;16-55N;097-22E;;;17;; 48;099;VBPA;Hpa-An;;Myanmar;2;16-45N;097-40E;;;9;10; 48;103;VBMM;Moulmein;;Myanmar;2;16-30N;097-37E;16-30N;097-37E;21;22; 48;107;----;Ye;;Myanmar;2;15-15N;097-52E;;;3;7; 48;108;VBTV;Dawei;;Myanmar;2;14-06N;098-13E;14-06N;098-13E;16;17;P 48;109;VBCI;Coco Island;;Myanmar;2;14-07N;093-22E;14-07N;093-22E;2;3;P 48;110;VBRN;Mergui;;Myanmar;2;12-26N;098-36E;12-26N;098-36E;36;37;P 48;112;----;Victoria Point;;Myanmar;2;09-58N;098-35E;09-58N;098-35E;46;47;P 48;300;VTCH;Mae Hong Son;;Thailand;2;19-18N;097-50E;;;267;269;P 48;303;VTCR;Chiang Rai;;Thailand;2;19-55N;099-50E;;;394;395;P 48;310;----;Phayao;;Thailand;2;19-08N;099-54E;;;397;399; 48;315;----;Tha Wang Pha;;Thailand;2;19-07N;100-48E;;;235;236; 48;325;VTCS;Mae Sariang;;Thailand;2;18-10N;097-56E;;;212;213;P 48;327;VTCC;Chiang Mai;;Thailand;2;18-47N;098-59E;18-47N;098-59E;312;314;P 48;328;VTCL;Lampang;;Thailand;2;18-17N;099-31E;18-16N;099-30E;241;242;P 48;329;----;Lamphun;;Thailand;2;18-55N;099-02E;;;296;298;P 48;330;VTCP;Phrae;;Thailand;2;18-10N;100-10E;;;161;162;P 48;331;VTCN;Nan;;Thailand;2;18-46N;100-46E;;;200;201;P 48;351;VTPU;Uttaradit;;Thailand;2;17-37N;100-06E;17-37N;100-06E;63;64;P 48;352;VTUM;Nong Khai;;Thailand;2;17-52N;102-43E;;;174;175;P 48;353;VTUL;Loei;;Thailand;2;17-27N;101-44E;;;253;254;P 48;354;VTUD;Udon Thani;;Thailand;2;17-23N;102-48E;17-23N;102-48E;177;182;P 48;356;VTUS;Sakon Nakhon;;Thailand;2;17-09N;104-08E;;;171;172;P 48;357;VTUP;Nakhon Phanom;;Thailand;2;17-25N;104-47E;17-25N;104-47E;146;148;P 48;375;VTPM;Mae Sot;;Thailand;2;16-40N;098-33E;16-42N;098-33E;196;197;P 48;376;VTPT;Tak;;Thailand;2;16-53N;099-09E;;;121;124;P 48;377;----;Bhumibol Dam;;Thailand;2;17-15N;099-01E;;;142;144;P 48;378;VTPS;Phitsanulok;;Thailand;2;16-47N;100-16E;16-49N;100-16E;44;45;P 48;379;----;Phetchabun;;Thailand;2;16-26N;101-09E;16-26N;101-09E;114;116;P 48;380;----;Kam Paeng Phet;;Thailand;2;16-29N;099-32E;;;80;81; 48;381;VTUK;Khon Kaen;;Thailand;2;16-26N;102-50E;;;165;166;P 48;383;VTUB;Mukdahan;;Thailand;2;16-32N;104-43E;;;138;139;P 48;400;VTPN;Nakhon Sawan;;Thailand;2;15-48N;100-10E;15-40N;100-08E;34;35;P 48;403;VTUC;Chaiyaphum;;Thailand;2;15-48N;102-02E;15-48N;102-02E;182;183;P 48;405;VTUR;Roi Et;;Thailand;2;16-03N;103-41E;;;140;142;P 48;407;VTUU;Ubon Ratchathani;;Thailand;2;15-15N;104-52E;15-15N;104-52E;123;127;P 48;413;----;Wichian Buri;;Thailand;2;15-38N;101-07E;;;68;69; 48;416;----;Tha Tum;;Thailand;2;15-19N;103-41E;15-19N;103-41E;127;129; 48;418;----;Bua Chum;;Thailand;2;15-16N;101-11E;;;48;50; 48;421;----;Thong Pha Phum;;Thailand;2;14-45N;098-38E;;;97;99; 48;425;----;Suphan Buri;;Thailand;2;14-28N;100-08E;;;7;8;P 48;426;----;Lop Buri;;Thailand;2;14-48N;100-37E;14-48N;100-37E;10;11;P 48;430;VTBI;Prachin Buri;;Thailand;2;14-03N;101-22E;;;5;6;P 48;431;VTUN;Nakhon Ratchasima;;Thailand;2;14-58N;102-05E;14-58N;102-05E;187;188;P 48;432;----;Surin;;Thailand;2;14-53N;103-30E;14-53N;103-30E;146;147;P 48;450;VTBG;Kanchanaburi;;Thailand;2;14-01N;099-32E;;;28;29;P 48;454;----;Bangkok;;Thailand;2;13-42N;100-34E;;;3;6; 48;455;----;Bangkok;;Thailand;2;13-44N;100-34E;13-44N;100-30E;2;20;P 48;456;VTBD;Don Muang;;Thailand;2;13-55N;100-36E;13-55N;100-36E;4;12;P 48;457;----;Bangkok Pilot;;Thailand;2;13-23N;100-36E;;;14;15; 48;459;VTBS;Chon Buri;;Thailand;2;13-22N;100-59E;;;1;2;P 48;460;----;Ko Sichang;;Thailand;2;13-10N;100-48E;;;25;26;P 48;461;----;Phatthaya;;Thailand;2;12-55N;100-52E;;;59;61;P 48;462;----;Aranyaprathet;;Thailand;2;13-42N;102-35E;;;47;49;P 48;463;----;Laemchabang;;Thailand;2;15-05N;100-53E;;;78;82; 48;465;VTBJ;Phetchaburi;;Thailand;2;13-09N;100-04E;;;2;4;P 48;475;VTPH;Hua Hin;;Thailand;2;12-35N;099-57E;;;5;6;P 48;477;----;Sattahip;;Thailand;2;12-41N;100-59E;12-41N;100-59E;16;18;P 48;478;VTBU;Rayong;;Thailand;2;12-38N;101-21E;12-38N;101-21E;3;5;P 48;480;VTBC;Chanthaburi;;Thailand;2;12-36N;102-07E;12-36N;102-07E;3;4;P 48;500;VTBP;Prachuap Khirikhan;;Thailand;2;11-50N;099-50E;11-48N;099-48E;4;5;P 48;501;----;Khlong Yai;;Thailand;2;11-46N;102-53E;;;2;4;P 48;517;VTSD;Chumphon;;Thailand;2;10-29N;099-11E;;;3;5;P 48;532;VTSR;Ranong;;Thailand;2;09-59N;098-37E;09-58N;098-38E;7;8;P 48;550;----;Ko Samui;;Thailand;2;09-28N;100-03E;;;5;7;P 48;551;VTSB;Surat Thani;;Thailand;2;09-07N;099-21E;09-07N;099-21E;10;11;P 48;552;VTSN;Nakhon Si Thammarat;;Thailand;2;08-28N;099-58E;;;7;9;P 48;553;----;Khanom;;Thailand;2;09-15N;099-52E;;;3;5; 48;561;----;Takua Pa;;Thailand;2;08-51N;098-16E;08-28N;098-16E;3;4;P 48;563;----;Krabi;;Thailand;2;08-04N;098-55E;;;3;8; 48;564;----;Phuket;;Thailand;2;07-53N;098-24E;;;2;3;P 48;565;VTSP;Phuket Airport;;Thailand;2;08-07N;098-19E;08-06N;098-18E;6;10;P 48;566;----;Ko Lanta;;Thailand;2;07-32N;099-03E;;;2;3; 48;567;VTST;Trang;;Thailand;2;07-31N;099-37E;;;14;16;P 48;568;VTSH;Songkhla;;Thailand;2;07-12N;100-36E;07-12N;100-36E;4;5;P 48;569;VTSS;Hat Yai;;Thailand;2;06-55N;100-26E;06-56N;100-25E;27;35;P 48;570;VTSA;Satun;;Thailand;2;06-39N;100-05E;;;4;6;P 48;580;VTSK;Pattani;;Thailand;2;06-47N;101-09E;06-47N;101-09E;5;9;P 48;583;----;Narathiwat;;Thailand;2;06-25N;101-49E;;;2;5;P 48;600;WMKL;Langkawi;;Malaysia;5;06-20N;099-44E;06-20N;099-44E;8;7;P 48;601;WMKP;Penang / Bayan Lepas;;Malaysia;5;05-18N;100-16E;05-18N;100-16E;3;4;P 48;602;----;Butterworth Air Base;;Malaysia;5;05-28S;100-23E;;;2;4;P 48;603;----;Alor Star;;Malaysia;5;06-12N;100-24E;;;5;5;P 48;604;----;Chuping;;Malaysia;5;06-29N;100-16E;;;22;;P 48;615;WMKC;Kota Bharu;;Malaysia;5;06-10N;102-17E;06-10N;102-17E;5;5;P 48;616;----;Kuala Krai;;Malaysia;5;05-32N;102-12E;;;68;65;P 48;618;----;Kuala Trengganu;;Malaysia;5;05-23N;103-06E;;;6;6;P 48;620;WMBA;Sitiawan;;Malaysia;5;04-13N;100-42E;04-13N;100-42E;7;8;P 48;625;----;Ipoh;;Malaysia;5;04-34N;101-06E;;;39;39;P 48;632;----;Cameron Highlands;;Malaysia;5;04-28N;101-22E;;;1545;;P 48;642;----;Batu Embun;;Malaysia;5;03-58N;102-21E;;;59;61;P 48;647;WMKK;Sepang/KL International Airport;;Malaysia;5;02-44N;101-42E;03-07N;101-33E;21;22;P 48;648;----;Kuala Lumpur / Petaling Jaya;;Malaysia;5;03-06N;101-39E;03-06N;101-39E;46;57;P 48;649;----;Muadzam Shah;;Malaysia;5;03-03N;103-05E;;;33;34;P 48;653;----;Temerloh;;Malaysia;5;03-28N;102-23E;;;39;40;P 48;657;WMKD;Kuantan;;Malaysia;5;03-37N;103-13E;03-47N;103-13E;18;16;P 48;665;WMKM;Malacca;;Malaysia;5;02-16N;102-15E;;;11;9;P 48;672;----;Kluang;;Malaysia;5;02-01N;103-19E;;;88;86;P 48;674;----;Mersing;;Malaysia;5;02-27N;103-50E;;;44;45;P 48;679;WMKJ;Johore Bharu / Senai;;Malaysia;5;01-38N;103-40E;;;37;40;P 48;687;----;Singapore / Tengah;;Singapore;5;01-23N;103-43E;;;15;12; 48;692;----;Singapore / Seletar;;Singapore;5;01-25N;103-53E;;;11;14; 48;694;WSAP;Singapore / Paya Lebar;;Singapore;5;01-22N;103-55E;01-22N;103-55E;18;32; 48;698;WSSS;Singapore / Changi Airport;;Singapore;5;01-22N;103-59E;01-22N;103-59E;5;16;P 48;803;----;Lao Cai;;Vietnam;2;22-30N;103-58E;;;112;112;P 48;806;----;Son La;;Vietnam;2;21-20N;103-54E;;;;676; 48;808;----;Cao Bang;;Vietnam;2;22-40N;106-15E;;;260;260;P 48;810;----;Bac Can;;Vietnam;2;22-09N;105-50E;;;176;; 48;820;VVNB;Ha Noi;;Vietnam;2;21-01N;105-48E;21-01N;105-48E;6;6;P 48;823;----;Nam Dinh;;Vietnam;2;20-26N;106-09E;;;3;3;P 48;826;----;Phu Lien;;Vietnam;2;20-48N;106-38E;;;119;119;P 48;830;----;Lang Son;;Vietnam;2;21-50N;106-46E;;;258;258;P 48;831;----;Thai Nguyen;;Vietnam;2;21-36N;105-50E;;;32;; 48;838;----;Mong Cai;;Vietnam;2;21-31N;107-58E;;;7;; 48;839;----;Bach Long Vi;;Vietnam;2;20-08N;107-43E;;;60;60;P 48;840;----;Thanh Hoa;;Vietnam;2;19-48N;105-47E;;;7;7;P 48;845;VVVH;Vinh;;Vietnam;2;18-42N;105-40E;;;6;6;P 48;846;----;Ha Tinh;;Vietnam;2;18-21N;105-54E;;;3;; 48;848;----;Dong Hoi;;Vietnam;2;17-31N;106-35E;;;8;8;P 48;852;VVPB;Hue;;Vietnam;2;16-24N;107-41E;;;17;17;P 48;855;VVDN;Da Nang;;Vietnam;2;16-02N;108-11E;16-02N;108-11E;7;7;P 48;860;----;Hoang Sa Pattle ;;Vietnam;2;16-33N;111-37E;;;;6; 48;866;VVPK;Pleiku City;;Vietnam;2;13-59N;108-00E;13-59N;108-00E;801;801; 48;870;VVQN;Quy Nhon;;Vietnam;2;13-46N;109-13E;13-46N;109-13E;6;6;P 48;873;----;Tuy-Hoa;;Vietnam;2;13-05N;109-17E;13-05N;109-17E;11;12; 48;875;----;Banmethuot;;Vietnam;2;12-41N;108-05E;12-41N;108-05E;537;537; 48;877;VVNT;Nha Trang;;Vietnam;2;12-15N;109-12E;12-15N;109-12E;10;10;P 48;887;----;Phan Thiet;;Vietnam;2;10-56N;108-06E;10-56N;108-06E;8;8;P 48;892;----;Song Tu Tay South West Cay ;;Vietnam;2;11-25N;114-20E;;;5;5; 48;900;VVTS;Ho Chi Minh;;Vietnam;2;10-49N;106-40E;10-49N;106-40E;19;19;P 48;907;----;Rach Gia;;Vietnam;2;10-00N;105-05E;10-00N;105-05E;3;3; 48;910;----;Vinh Long;;Vietnam;2;10-15N;105-57E;10-15N;105-57E;3;3; 48;913;----;Ba-Xuyen / Soc Trang;;Vietnam;2;09-36N;105-58E;09-36N;105-58E;5;3; 48;914;----;Ca Mau;;Vietnam;2;09-10N;105-10E;09-10N;105-10E;3;3;P 48;916;----;Tho Chu;;Vietnam;2;09-17N;103-28E;;;;; 48;917;----;Phu Quoc;;Vietnam;2;10-13N;103-58E;;;3;3;P 48;918;----;Con Son;;Vietnam;2;08-42N;106-35E;08-42N;106-35E;5;5;P 48;919;----;Huyen Tran;;Vietnam;2;08-01N;110-37E;;;;; 48;920;----;Truong Sa;;Vietnam;2;08-39N;111-55E;;;3;3;P 48;921;----;Bounneua;;Laos;2;21-38N;101-53E;;;;923; 48;924;----;Luang Namtha M. Sing ;;Laos;2;21-03N;101-28E;;;;644; 48;925;----;Oudomxay;;Laos;2;20-41N;102-00E;;;550;550; 48;927;----;Viengsay;;Laos;2;20-25N;104-14E;;;913;913;P 48;930;VLLB;Luang-Prabang;;Laos;2;19-53N;102-08E;;;305;305;P 48;935;----;Plaine Des Jarres Xiengkhouang ;;Laos;2;19-28N;103-08E;;;1050;1050;P 48;936;----;Paklay;;Laos;2;18-12N;101-12E;;;;220; 48;937;----;Nam Thane;;Laos;2;19-07N;101-33E;;;;370; 48;938;VLSB;Sayaboury;;Laos;2;19-14N;101-44E;19-14N;101-44E;326;326; 48;939;----;Vangvieng;;Laos;2;18-55N;102-27E;;;;298; 48;940;VLVT;Vientiane;;Laos;2;17-57N;102-34E;17-59N;102-34E;171;171;P 48;941;----;Phonhong;;Laos;2;18-28N;102-24E;;;;179; 48;942;----;Hat Dokeo;;Laos;2;17-51N;102-36E;;;;165; 48;943;----;Napheng Pakcheng ;;Laos;2;18-16N;102-57E;;;;172; 48;944;----;Thangone;;Laos;2;18-17N;102-38E;;;;185; 48;946;VLTK;Thakhek;;Laos;2;17-23N;104-39E;;;52;152; 48;947;VLSK;Savannakhet;;Laos;2;16-33N;104-39E;;;155;145;P 48;948;----;Seno;;Laos;2;16-40N;105-00E;;;;185; 48;952;VLSV;Saravane;;Laos;2;15-41N;106-26E;;;168;168;P 48;955;VLIP;Pakse;;Laos;2;15-07N;105-10E;15-08N;105-47E;102;102;P 48;956;----;Paksong;;Laos;2;15-11N;106-12E;;;;1200; 48;957;VLAP;Attopeu;;Laos;2;14-48N;106-50E;;;105;105; 48;962;----;Battambang;;Cambodia;2;13-06N;103-12E;;;13;13;P 48;966;VDSR;Siemreap;;Cambodia;2;13-22N;103-51E;13-22N;103-51E;15;15;P 48;968;----;Krakor;;Cambodia;2;12-31N;104-11E;;;5;5; 48;972;----;Stung Treng;;Cambodia;2;13-31N;105-58E;;;183;56; 48;982;----;Kos Kong;;Cambodia;2;11-37N;103-00E;;;4;4;P 48;983;----;Kompong Som / Ville Ex Sihanoukville ;;Cambodia;2;10-38N;103-29E;;;16;15;P 48;985;----;Kampot;;Cambodia;2;10-37N;104-13E;;;5;5;P 48;991;VDPP;Phnom-Penh / Pochentong;;Cambodia;2;11-33N;104-51E;11-33N;104-51E;10;10;P 48;995;VDKC;Kompong-Cham;;Cambodia;2;12-00N;105-27E;12-00N;105-27E;16;16; 48;998;----;Svay Rieng;;Cambodia;2;11-05N;105-48E;;;6;6;P 50;136;----;Mohe;;China;2;53-28N;122-22E;;;297;297; 50;246;----;Ta-He;;China;2;52-20N;124-48E;;;465;; 50;353;----;Huma;;China;2;51-43N;126-39E;51-43N;126-39E;179;179; 50;425;----;San-He;;China;2;50-30N;120-04E;;;671;; 50;434;----;Tulihe;;China;2;50-27N;121-42E;;;733;733; 50;468;----;Aihui;;China;2;50-15N;127-27E;;;166;166; 50;514;----;Man-Zhou-Li;;China;2;49-33N;117-28E;;;710;; 50;527;----;Hailar;;China;2;49-13N;119-45E;49-13N;119-45E;611;611; 50;548;----;Xiao'Ergou;;China;2;49-12N;123-43E;;;289;28; 50;557;----;Nenjiang;;China;2;49-10N;125-14E;49-10N;125-14E;243;243; 50;564;----;Sunwu;;China;2;49-26N;127-21E;;;235;235; 50;603;----;Xin Barag Youqi;;China;2;48-40N;116-49E;48-40N;116-49E;556;556; 50;632;----;Bugt;;China;2;48-46N;121-55E;;;739;739; 50;656;----;Long-Zhen;;China;2;48-39N;126-40E;;;305;; 50;658;----;Keshan;;China;2;48-03N;125-53E;;;237;237; 50;727;----;Arxan;;China;2;47-10N;119-57E;;;1028;1028; 50;742;----;San-Chen-Fang;;China;2;47-47N;124-10E;;;146;; 50;745;ZYQQ;Qiqihar;;China;2;47-23N;123-55E;47-23N;123-55E;148;148; 50;756;----;Hailun;;China;2;47-26N;126-58E;;;240;240; 50;758;----;Ming-Shui;;China;2;47-15N;125-53E;;;259;; 50;774;----;Yichun;;China;2;47-43N;128-54E;47-43N;128-54E;232;232; 50;775;----;He-Gang;;China;2;47-21N;130-12E;;;198;; 50;788;----;Fujin;;China;2;47-14N;131-59E;;;65;65; 50;834;----;Te-Po-Su-K /- Miao;;China;2;46-30N;121-22E;46-30N;121-22E;427;427; 50;844;----;Tailai;;China;2;46-24N;123-25E;;;150;150; 50;853;----;Wang-Kui;;China;2;46-50N;126-29E;;;158;; 50;854;----;Anda;;China;2;46-23N;125-19E;;;150;150; 50;877;----;Yi-Lan;;China;2;46-18N;129-33E;;;99;; 50;888;----;Baoqing;;China;2;46-19N;132-11E;;;83;83; 50;915;----;Uliastai;;China;2;45-31N;116-58E;;;840;840; 50;949;----;Qian Gorlos;;China;2;45-07N;124-50E;;;138;138; 50;953;----;Harbin;;China;2;45-45N;126-46E;45-45N;126-46E;143;143; 50;963;----;Tonghe;;China;2;45-58N;128-44E;;;110;110; 50;968;----;Shangzhi;;China;2;45-13N;127-58E;;;191;191; 50;978;----;Jixi;;China;2;45-17N;130-57E;;;234;234; 50;983;----;Hulin;;China;2;45-46N;132-58E;;;103;103; 51;053;----;Kaba He;;China;2;48-03N;086-21E;;;534;534; 51;068;----;Fuhai / Burultokay;;China;2;47-06N;087-23E;;;472;; 51;076;----;Altay;;China;2;47-44N;088-05E;47-44N;088-05E;737;737; 51;087;----;Fuyun;;China;2;46-59N;089-31E;47-01N;089-48E;827;827; 51;133;----;Tacheng;;China;2;46-44N;083-00E;46-44N;083-00E;535;535; 51;156;----;Hoboksar;;China;2;46-47N;085-43E;46-47N;085-43E;1294;1294; 51;186;----;Qinghe / Qinggli;;China;2;46-43N;090-24E;;;1463;; 51;232;----;Pa-Erh-Lu-K'O Mountain;;China;2;45-57N;082-34E;45-57N;082-34E;1067;1067; 51;241;----;To-Li;;China;2;45-57N;083-37E;;;2072;; 51;243;----;Karamay;;China;2;45-36N;084-51E;45-36N;084-51E;428;428; 51;288;----;Baytik Shan;;China;2;45-22N;090-32E;45-22N;090-32E;1651;1651; 51;330;----;Bole / Bortala;;China;2;44-55N;082-04E;;;1366;; 51;334;----;Jinghe;;China;2;44-37N;082-54E;44-37N;082-54E;321;321; 51;346;----;Kuytun;;China;2;44-26N;084-58E;;;442;; 51;356;----;Shihezi;;China;2;44-18N;086-02E;;;457;; 51;365;----;Fukang;;China;2;44-09N;087-59E;;;549;; 51;379;----;Qitai;;China;2;44-01N;089-34E;44-01N;089-34E;794;794; 51;431;ZWYN;Yining;;China;2;43-57N;081-20E;43-57N;081-20E;663;663; 51;437;----;Zhaosu / Monggolkure;;China;2;43-10N;081-07E;;;1830;; 51;463;----;Urumqi;;China;2;43-47N;087-37E;43-47N;087-37E;919;919; 51;467;----;Balguntay;;China;2;42-40N;086-20E;;;1753;1753; 51;477;----;Pau-Yang-Hu;;China;2;43-12N;088-28E;;;1037;; 51;495;----;Qijiaojing;;China;2;43-29N;091-38E;43-29N;091-38E;874;874; 51;496;----;Yiwanquan;;China;2;43-23N;092-06E;;;1890;; 51;526;----;Chugirty;;China;2;42-48N;080-51E;;;2042;; 51;542;----;Bayanbulak;;China;2;43-02N;084-09E;;;2459;2459; 51;567;----;Yanqi;;China;2;42-03N;086-34E;;;1097;; 51;573;----;Turpan;;China;2;42-56N;089-12E;42-56N;089-12E;37;37; 51;581;----;Shanshan / Piqan;;China;2;42-55N;090-15E;;;410;; 51;628;----;Wen-Su;;China;2;41-16N;080-14E;41-16N;080-18E;1286;1286; 51;633;----;Baicheng / Bay;;China;2;41-46N;081-52E;;;1280;; 51;642;----;Luntai / Bugur;;China;2;41-47N;084-10E;;;883;; 51;644;----;Kuqa;;China;2;41-43N;082-57E;41-43N;082-57E;1100;1100; 51;656;----;Korla;;China;2;41-45N;086-08E;41-45N;086-08E;933;933; 51;701;----;Sai-K'O-Lo-T'E-Ma;;China;2;40-27N;075-23E;40-27N;075-23E;3651;3651; 51;705;----;Ar-Tux;;China;2;39-40N;076-10E;39-40N;076-10E;1494;1494; 51;709;ZWSH;Kashi;;China;2;39-28N;075-59E;39-28N;075-59E;1291;1291; 51;711;----;Akqi;;China;2;40-56N;078-27E;40-56N;078-27E;1986;1986; 51;716;----;Bachu;;China;2;39-48N;078-34E;39-48N;078-34E;1117;1117; 51;720;----;Ch'I-Lan-Tai;;China;2;40-32N;079-32E;;;1158;; 51;730;----;Alar;;China;2;40-30N;081-03E;;;1013;1013; 51;765;----;Tikanlik;;China;2;40-38N;087-42E;40-38N;087-42E;847;847; 51;777;----;Ruoqiang;;China;2;39-02N;088-10E;39-02N;088-10E;889;889; 51;811;----;Shache;;China;2;38-26N;077-16E;38-26N;077-16E;1232;1232; 51;818;----;Pishan;;China;2;37-37N;078-17E;37-37N;078-17E;1376;1376; 51;828;ZWTN;Hotan;;China;2;37-08N;079-56E;37-08N;079-56E;1375;1375; 51;839;----;Minfeng / Niya;;China;2;37-04N;082-46E;37-04N;082-43E;1410;1410; 51;848;----;Andir;;China;2;37-56N;083-39E;37-56N;083-39E;1264;1264; 51;855;----;Qiemo / Qarqan;;China;2;38-09N;085-33E;38-09N;085-33E;1248;1248; 51;886;----;Mangnai;;China;2;38-15N;090-51E;38-21N;090-09E;2945;2945; 51;931;----;Yutian / Keriya;;China;2;36-52N;081-42E;;;1554;; 52;101;----;Barkol;;China;2;43-35N;092-51E;;;1584;; 52;118;----;Yiwu;;China;2;43-16N;094-42E;;;1729;1729; 52;203;ZWHM;Hami;;China;2;42-49N;093-31E;42-49N;093-31E;739;739; 52;267;----;Ejin Qi;;China;2;41-57N;101-04E;41-57N;101-04E;941;941; 52;313;----;Xing-Xing-Xia;;China;2;41-47N;095-08E;;;1935;; 52;323;----;Mazong Shan;;China;2;41-48N;097-02E;41-48N;097-02E;1770;1770; 52;378;----;Guaizihu;;China;2;41-22N;102-22E;41-22N;102-22E;960;960; 52;418;----;Dunhuang;;China;2;40-09N;094-41E;40-09N;094-41E;1140;1140; 52;424;----;An-Xi;;China;2;40-30N;096-00E;;;1177;; 52;436;----;Yumenzhen;;China;2;40-16N;097-02E;40-16N;097-02E;1527;1527; 52;446;----;Shuangchengtzu;;China;2;40-24N;099-48E;40-24N;099-48E;1158;1158; 52;447;----;Jinta;;China;2;39-49N;098-54E;;;1372;; 52;495;----;Bayan Mod;;China;2;40-45N;104-30E;40-45N;104-30E;1329;1329; 52;533;ZLJQ;Jiuquan;;China;2;39-46N;098-29E;39-46N;098-31E;1478;1478; 52;576;----;Lai-Yen-Ch'Ih;;China;2;39-23N;102-50E;;;1383;; 52;602;----;Lenghu;;China;2;38-50N;093-23E;38-50N;093-23E;2734;2734; 52;633;----;Tuo-Le;;China;2;38-48N;098-25E;38-48N;098-25E;609;609; 52;645;----;Yeh-Niu-Kou;;China;2;38-28N;099-33E;;;2169;; 52;652;----;Zhangye;;China;2;38-56N;100-26E;38-56N;100-26E;1483;1483; 52;657;----;Babao;;China;2;38-14N;100-15E;38-11N;100-15E;2700;2700; 52;661;----;Shan-Dan;;China;2;38-48N;101-05E;;;1760;; 52;674;----;Jin-Chang;;China;2;38-28N;102-11E;;;1676;; 52;681;----;Minqin;;China;2;38-38N;103-05E;38-38N;103-05E;1367;1367; 52;707;----;T'A-Erh-Ting;;China;2;37-04N;092-52E;37-04N;092-52E;2712;2712; 52;713;----;Da-Qaidam;;China;2;37-51N;095-22E;37-51N;095-22E;3174;3174; 52;737;----;Delingha;;China;2;37-22N;097-22E;37-19N;097-13E;2982;2982; 52;740;----;Hsin-Yuan;;China;2;37-18N;099-01E;;;3627;; 52;754;----;Gangca;;China;2;37-20N;100-08E;;;330;; 52;765;----;Hao-Men;;China;2;37-22N;101-37E;;;2682;; 52;787;----;Wushaoling;;China;2;37-12N;102-52E;;;3044;3044; 52;797;----;Ching-T'Ai;;China;2;37-08N;104-13E;;;1402;; 52;818;----;Golmud;;China;2;36-25N;094-54E;36-25N;094-54E;2809;2809; 52;825;----;Nuo-Mu-Hong;;China;2;36-27N;096-28E;;;2804;; 52;833;----;Serh;;China;2;36-57N;098-21E;;;2987;; 52;836;----;Dulan;;China;2;36-18N;098-06E;36-18N;098-06E;3192;3192; 52;842;----;Cha-Ka;;China;2;36-47N;099-05E;;;2925;; 52;856;----;Gonghe;;China;2;36-21N;100-47E;36-16N;100-37E;2743;2743; 52;866;ZLXN;Xining;;China;2;36-37N;101-46E;36-43N;101-45E;2262;2262; 52;868;----;Hey-In;;China;2;36-02N;101-26E;;;2072;; 52;876;----;Minhe;;China;2;36-20N;102-50E;;;1905;; 52;889;----;Lanzhou;;China;2;36-03N;103-53E;36-03N;103-53E;1518;1518; 52;895;----;Jingyuan;;China;2;36-35N;104-41E;;;1505;; 52;908;----;Wudaoliang;;China;2;35-13N;093-05E;35-13N;093-05E;4613;4613; 52;941;----;Name Unknown;;China;2;35-43N;098-55E;;;3962;; 52;943;----;Xinghai;;China;2;35-45N;099-59E;;;3200;; 52;957;----;Tongde;;China;2;35-16N;100-39E;;;3290;3290; 52;968;----;Son-Ag;;China;2;35-02N;101-28E;;;3565;; 52;984;----;Linxia;;China;2;35-28N;102-59E;;;1920;; 52;986;----;Lintao;;China;2;35-20N;104-00E;;;1905;; 52;996;----;Huajialing;;China;2;35-23N;105-00E;;;2450;2450; 53;068;----;Erenhot;;China;2;43-39N;112-00E;43-39N;112-00E;966;966; 53;083;----;Naran Bulag;;China;2;44-37N;114-09E;44-37N;114-09E;1183;1183; 53;149;----;Mandal;;China;2;42-32N;110-08E;;;1223;1223; 53;192;----;Abag Qi;;China;2;44-01N;114-57E;;;1128;1128; 53;231;----;Hails;;China;2;41-27N;106-23E;41-27N;106-23E;1510;1510; 53;276;----;Jurh;;China;2;42-24N;112-54E;42-24N;112-54E;1152;1152; 53;336;----;Haliut;;China;2;41-34N;108-31E;41-34N;108-31E;1290;1290; 53;352;----;Bailing-Miao;;China;2;41-42N;110-26E;;;1377;1377; 53;362;----;Shara Moron Sume;;China;2;42-02N;111-32E;;;1372;; 53;391;----;Huade;;China;2;41-54N;114-00E;;;1484;1484; 53;463;ZBHH;Hohhot;;China;2;40-49N;111-41E;40-49N;111-41E;1065;1065; 53;478;----;You-Yu;;China;2;40-10N;112-20E;;;1212;; 53;480;----;Jining;;China;2;41-02N;113-04E;;;1416;1416; 53;487;----;Datong;;China;2;40-06N;113-20E;40-06N;113-20E;1069;1069; 53;502;----;Jartai;;China;2;39-47N;105-45E;39-47N;105-45E;1033;103; 53;513;----;Linhe;;China;2;40-46N;107-24E;40-46N;107-24E;1041;1041; 53;519;----;Shizuishan / Dawukou;;China;2;39-03N;106-24E;;;975;; 53;529;----;Otog Qi;;China;2;39-06N;107-59E;39-06N;107-59E;1381;1381; 53;543;----;Dongsheng;;China;2;39-50N;109-59E;39-50N;109-59E;1459;1459; 53;564;----;Hequ;;China;2;39-23N;111-09E;39-23N;111-09E;861;861; 53;588;----;Wutai Shan;;China;2;39-02N;113-32E;;;2898;2898; 53;593;----;Yu Xian;;China;2;39-50N;114-34E;;;910;910; 53;602;----;Alxa Zuoqi / Bayan Ho;;China;2;38-50N;105-32E;;;1500;; 53;614;ZLIC;Yinchuan;;China;2;38-29N;106-13E;38-29N;106-13E;1112;1112; 53;615;----;Yinchuan City ;;China;2;38-28N;106-19E;;;1005;; 53;646;----;Yulin;;China;2;38-14N;109-42E;;;1058;1058; 53;664;----;Xinxian;;China;2;38-24N;112-43E;38-28N;111-07E;900;1067; 53;673;----;Yuanping;;China;2;38-45N;112-42E;38-45N;112-42E;838;838; 53;698;----;Shijiazhuang;;China;2;38-02N;114-25E;38-02N;114-25E;81;81; 53;705;----;Zhongning;;China;2;37-29N;105-40E;;;1185;1185; 53;723;----;Yanchi;;China;2;37-47N;107-24E;;;1349;1349; 53;738;----;Pin-Kou-Men;;China;2;37-09N;108-23E;;;1438;; 53;740;----;Zi-Chang;;China;2;37-08N;109-39E;;;1189;; 53;754;----;Suide;;China;2;37-28N;110-15E;;;900;; 53;764;----;Lishi;;China;2;37-30N;111-06E;;;951;951; 53;772;ZBYN;Taiyuan;;China;2;37-47N;112-33E;37-47N;112-33E;779;779; 53;782;----;Yangquan;;China;2;37-49N;113-34E;37-52N;113-33E;908;908; 53;787;----;Yushe;;China;2;37-04N;112-59E;;;1042;1042; 53;798;----;Xingtai;;China;2;37-04N;114-30E;37-04N;114-30E;78;78; 53;810;----;Qi-Ying;;China;2;36-33N;106-09E;;;1615;; 53;817;----;Guyuan;;China;2;36-01N;106-17E;;;1676;; 53;821;----;Hung-Te;;China;2;36-46N;107-12E;36-46N;107-12E;1322;1322; 53;845;ZLYA;Yan An;;China;2;36-36N;109-30E;36-36N;109-30E;959;959; 53;853;----;Xi-Xian;;China;2;36-42N;110-56E;36-42N;110-56E;1006;1006; 53;863;----;Jiexiu;;China;2;37-03N;111-56E;;;750;750; 53;898;----;Anyang;;China;2;36-07N;114-22E;36-07N;114-22E;76;76; 53;903;----;Xi-Ji;;China;2;35-58N;105-43E;;;1935;; 53;915;----;Pingliang;;China;2;35-33N;106-40E;35-33N;106-40E;1348;1348; 53;923;----;Xifengzhen;;China;2;35-44N;107-38E;;;1423;1423; 53;929;----;Chang-Wu;;China;2;35-13N;107-48E;;;1219;; 53;942;----;Luo-Chuan;;China;2;35-45N;109-25E;35-45N;109-25E;1000;1000; 53;947;----;Tongchuan;;China;2;35-10N;109-03E;;;914;; 53;959;----;Yuncheng;;China;2;35-02N;111-01E;;;376;376; 53;975;----;Yangcheng;;China;2;35-29N;112-24E;;;659;659; 54;012;----;Xi Ujimqin Qi;;China;2;44-35N;117-36E;44-35N;117-36E;997;997; 54;026;----;Jarud Qi;;China;2;44-34N;120-54E;;;266;266; 54;027;----;Lindong;;China;2;43-59N;119-24E;43-59N;119-24E;485;485; 54;049;----;Changling;;China;2;44-15N;123-58E;;;190;190; 54;063;----;Wu-Chai-Chan;;China;2;44-58N;125-41E;;;240;; 54;094;----;Mudanjiang;;China;2;44-34N;129-36E;44-34N;129-36E;242;242; 54;096;----;Suifenhe;;China;2;44-23N;131-09E;;;498;498; 54;102;----;Xilin Hot;;China;2;43-57N;116-04E;43-57N;116-04E;991;991; 54;115;----;Linxi;;China;2;43-36N;118-04E;43-36N;118-04E;800;800; 54;134;----;Kailu;;China;2;43-37N;121-19E;;;274;; 54;135;----;Tongliao;;China;2;43-36N;122-16E;43-36N;122-16E;180;180; 54;142;----;Wo-Hu-Tun;;China;2;43-42N;123-36E;;;183;; 54;157;----;Siping;;China;2;43-11N;124-20E;;;165;165; 54;161;ZYCC;Changchun;;China;2;43-54N;125-13E;43-54N;125-13E;238;238; 54;172;----;Jilin;;China;2;43-51N;126-33E;43-54N;126-35E;188;188; 54;186;----;Dunhua;;China;2;43-22N;128-12E;;;526;526; 54;195;----;Wang-Ch'Ing;;China;2;43-19N;129-45E;;;244;; 54;208;----;Duolun;;China;2;42-11N;116-28E;;;1247;1247; 54;213;----;Wudan / Ongniud Qi;;China;2;42-58N;119-02E;;;634;; 54;218;----;Chifeng;;China;2;42-16N;118-58E;42-16N;118-58E;572;572; 54;226;----;Bugt;;China;2;42-20N;120-42E;;;401;401; 54;236;----;Zhangwu;;China;2;42-25N;122-32E;;;84;84; 54;237;----;Fuxin;;China;2;42-00N;121-38E;42-00N;121-40E;182;182; 54;259;----;Qingyuan;;China;2;42-06N;124-57E;;;235;235; 54;273;----;Huadian;;China;2;42-59N;126-45E;;;264;264; 54;284;----;Fusong;;China;2;42-20N;127-17E;;;610;; 54;285;----;Lushuihe;;China;2;42-31N;127-48E;;;853;; 54;287;----;Songjianghe;;China;2;42-10N;127-30E;;;975;; 54;292;----;Yanji;;China;2;42-53N;129-28E;42-53N;129-28E;178;178; 54;308;----;Fengning;;China;2;41-13N;116-38E;;;661;661; 54;311;----;Weichang;;China;2;41-56N;117-45E;;;844;844; 54;324;----;Chaoyang;;China;2;41-33N;120-27E;;;176;176; 54;335;----;Goubangzi;;China;2;41-23N;121-48E;;;25;; 54;337;----;Jinzhou;;China;2;41-08N;121-07E;41-07N;121-04E;70;70; 54;339;----;Anshan;;China;2;41-08N;122-59E;;;17;; 54;346;----;Benxi;;China;2;41-19N;123-47E;;;183;185; 54;351;----;Da-Huo-Fang;;China;2;41-53N;124-05E;;;273;; 54;363;----;Tonghua;;China;2;41-43N;125-55E;;;312;; 54;365;----;Huanren;;China;2;41-16N;125-22E;;;204;; 54;374;----;Linjiang;;China;2;41-43N;126-55E;41-43N;126-55E;333;333; 54;377;----;Ji'An;;China;2;41-06N;126-09E;;;179;179; 54;386;----;Changbai;;China;2;41-21N;128-10E;;;1018;1018; 54;401;----;Zhangjiakou;;China;2;40-47N;114-53E;40-47N;114-53E;726;726; 54;405;----;Huailai;;China;2;40-24N;115-30E;;;538;538; 54;423;----;Chengde;;China;2;40-58N;117-56E;40-58N;117-50E;374;374; 54;429;----;Zunhua;;China;2;40-12N;117-58E;;;152;; 54;436;----;Qinglong;;China;2;40-24N;118-57E;;;228;228; 54;454;----;Suizhong;;China;2;40-21N;120-21E;;;18;; 54;471;----;Yingkou;;China;2;40-40N;122-12E;40-40N;122-12E;4;4; 54;493;----;Kuandian;;China;2;40-43N;124-47E;;;261;261; 54;497;----;Dandong;;China;2;40-03N;124-20E;40-05N;124-20E;14;14; 54;511;ZBAA;Beijing;;China;2;39-56N;116-17E;39-48N;116-28E;55;55; 54;518;----;Baxian;;China;2;39-03N;116-24E;;;8;; 54;527;----;Tianjin;;China;2;39-06N;117-10E;39-06N;117-10E;5;5; 54;534;----;Tangshan;;China;2;39-40N;118-09E;;;29;29; 54;539;----;Leting;;China;2;39-26N;118-54E;39-25N;118-54E;12;12; 54;563;----;Fuxian / Wafangdian;;China;2;39-38N;121-59E;;;17;; 54;587;----;Haiyang Dao;;China;2;39-03N;123-13E;;;10;; 54;602;----;Baoding;;China;2;38-51N;115-34E;38-50N;115-34E;19;19; 54;616;----;Cangzhou;;China;2;38-20N;116-50E;;;11;; 54;618;----;Potou;;China;2;38-05N;116-33E;;;;13; 54;623;----;Tanggu;;China;2;39-01N;117-36E;39-01N;117-40E;4;4; 54;624;----;Huanghua;;China;2;38-23N;117-21E;;;4;; 54;643;----;Moored Vessel;;China;2;38-58N;119-57E;;;6;; 54;646;----;Moored Vessel;;China;2;38-21N;119-41E;;;6;; 54;662;ZYTL;Dalian;;China;2;38-54N;121-38E;38-59N;121-38E;97;97; 54;705;----;Nangong;;China;2;37-22N;115-23E;;;42;; 54;715;----;Lingxian;;China;2;37-20N;116-34E;;;19;19; 54;725;----;Huimin;;China;2;37-30N;117-32E;;;12;12; 54;736;----;Yongan;;China;2;37-33N;118-44E;37-33N;118-44E;6;6; 54;751;----;Chang Dao;;China;2;37-56N;120-43E;;;43;40; 54;753;----;Longkou;;China;2;37-37N;120-19E;37-37N;120-19E;5;5; 54;774;----;Weihai;;China;2;37-27N;122-02E;37-30N;122-07E;61;61; 54;776;----;Chengshantou;;China;2;37-24N;122-41E;37-24N;122-41E;47;47; 54;808;----;Xinxian;;China;2;36-02N;115-35E;;;47;47; 54;823;ZSTN;Jinan;;China;2;36-41N;116-59E;36-41N;116-59E;58;58; 54;826;----;Tai Shan;;China;2;36-15N;117-06E;;;1536;1536; 54;830;----;Lin-Zi;;China;2;36-52N;118-20E;;;55;; 54;836;----;Yiyuan;;China;2;36-11N;118-09E;36-11N;118-09E;302;302; 54;843;----;Weifang;;China;2;36-42N;119-05E;36-37N;119-07E;51;51; 54;852;----;Laiyang;;China;2;36-59N;120-39E;;;72;; 54;857;ZSQD;Qingdao;;China;2;36-04N;120-20E;36-04N;120-20E;77;77; 54;863;----;Haiyang;;China;2;36-46N;121-10E;;;64;64; 54;906;----;Heze / Caozhou;;China;2;35-15N;115-26E;35-15N;115-26E;51;51; 54;909;----;Dingtao;;China;2;35-04N;115-34E;;;49;49; 54;916;----;Yanzhou;;China;2;35-34N;116-51E;;;53;53; 54;936;----;Juxian;;China;2;35-33N;118-45E;;;109;; 54;938;----;Linyi;;China;2;35-03N;118-21E;;;86;86; 54;945;----;Rizhao;;China;2;35-23N;119-32E;;;15;15; 54;952;----;Flashing Light;;China;2;35-58N;120-29E;;;25;; 55;228;----;Shiquanhe;;China;2;32-30N;080-05E;32-07N;080-04E;4279;4279; 55;248;----;Lumaringbo;;China;2;32-18N;084-03E;32-18N;084-03E;4420;4420; 55;279;----;Baingoin;;China;2;31-22N;090-01E;31-22N;090-01E;4701;470; 55;294;----;P'A-Na;;China;2;32-16N;091-40E;;;4724;; 55;299;----;Nagqu;;China;2;31-29N;092-04E;31-29N;092-03E;4508;4508; 55;437;----;T'U-Ko-Erh-Ho-Kung;;China;2;30-33N;081-26E;;;4736;; 55;472;----;Xainza;;China;2;30-57N;088-38E;30-57N;088-38E;4671;467; 55;493;----;Zha-Te-Ke-Tang;;China;2;30-44N;092-27E;;;4724;; 55;569;----;Lhaze;;China;2;29-04N;087-41E;;;4237;; 55;578;----;Xigaze;;China;2;29-15N;088-53E;29-13N;088-55E;3837;3837; 55;591;ZULS;Lhasa;;China;2;29-40N;091-08E;29-40N;091-08E;3650;3650; 55;598;----;Nedong;;China;2;29-14N;091-46E;;;3657;; 55;664;----;Tingri;;China;2;28-38N;087-05E;28-38N;087-05E;4302;430; 55;680;----;Gyangze;;China;2;29-00N;089-38E;;;3657;; 55;690;----;Che-Ku;;China;2;28-42N;091-38E;28-30N;091-48E;4336;4336; 55;696;----;Lhunze;;China;2;28-25N;092-28E;28-25N;092-28E;3861;386; 55;773;----;Pagri;;China;2;27-44N;089-05E;27-45N;089-10E;4301;430; 56;004;----;Tuotuohe;;China;2;34-13N;092-26E;33-57N;092-37E;4535;4535; 56;016;----;Bie-Li-Xi-Du;;China;2;34-06N;095-02E;;;4785;; 56;018;----;Zadoi;;China;2;32-54N;095-18E;;;4068;4068; 56;021;----;Qumarleb;;China;2;34-08N;095-47E;;;4176;4176; 56;029;----;Yushu;;China;2;33-01N;097-01E;33-00N;097-01E;3682;3682; 56;033;----;Madoi;;China;2;34-55N;098-13E;34-55N;098-13E;4273;4273; 56;034;----;Qingshui-He;;China;2;33-48N;097-08E;;;4419;; 56;038;----;Shiqu;;China;2;32-59N;098-06E;;;4114;; 56;041;----;Unknown;;China;2;34-30N;098-53E;;;4175;; 56;046;----;Darlag;;China;2;33-45N;099-39E;33-48N;099-48E;3968;3968; 56;065;----;Henan;;China;2;34-44N;101-36E;;;350;; 56;067;----;Jigzhi;;China;2;33-28N;101-29E;33-27N;101-27E;3350;3350; 56;074;----;Ga-Hai;;China;2;34-12N;102-18E;;;3109;; 56;079;----;Ruo'Ergai;;China;2;33-35N;102-58E;33-35N;102-58E;3441;3441; 56;080;----;Hezuo;;China;2;35-00N;102-54E;34-58N;102-54E;2910;2910; 56;093;----;Wu-Shan;;China;2;34-43N;104-53E;;;1371;; 56;096;----;Wudu;;China;2;33-24N;104-55E;33-23N;104-55E;1079;1079; 56;106;----;Sog Xian;;China;2;31-53N;093-47E;31-52N;093-46E;4024;4024; 56;116;----;Dengqen;;China;2;31-25N;095-36E;31-25N;095-36E;3874;3874; 56;125;----;Nangqen;;China;2;32-15N;096-13E;;;4145;; 56;137;----;Qamdo;;China;2;31-09N;097-10E;31-09N;097-10E;3307;3307; 56;144;----;Dege;;China;2;31-44N;098-34E;;;3204;320; 56;146;----;Garze;;China;2;31-37N;100-00E;31-38N;099-59E;3394;339; 56;151;----;Luo-Xue;;China;2;32-34N;100-35E;;;3505;; 56;152;----;Sertar;;China;2;32-17N;100-20E;;;3896;389; 56;167;----;Dawu;;China;2;30-59N;101-07E;;;2959;2959; 56;172;----;Barkam;;China;2;31-54N;102-14E;31-54N;102-14E;2666;2666; 56;173;----;Ma-Tang;;China;2;31-51N;102-42E;31-51N;102-42E;3422;3422; 56;178;----;Xiao-Jin;;China;2;31-01N;102-22E;31-01N;102-22E;2426;2426; 56;182;----;Songpan;;China;2;32-39N;103-34E;;;2852;2852; 56;188;----;Wenchuan;;China;2;31-29N;103-35E;;;2042;; 56;193;----;Pingwu;;China;2;32-25N;104-31E;;;877;877; 56;196;----;Mianyang;;China;2;31-28N;104-41E;;;472;472; 56;247;----;Batang;;China;2;30-00N;099-06E;29-58N;099-04E;2589;2589; 56;251;----;Xinlong / Nyagrong;;China;2;30-58N;100-12E;;;3500;; 56;257;----;Litang;;China;2;30-00N;100-16E;;;3950;3950; 56;287;----;Ya'An;;China;2;29-59N;103-00E;;;629;629; 56;294;ZUUU;Chengdu;;China;2;30-40N;104-01E;30-40N;104-01E;508;508; 56;312;----;Nyingchi;;China;2;29-34N;094-28E;29-33N;094-30E;3001;300; 56;357;----;Daocheng;;China;2;29-03N;100-18E;;;3729;372; 56;374;----;Kangding;;China;2;30-03N;101-58E;30-05N;102-02E;2617;2617; 56;385;----;Emei Shan;;China;2;29-31N;103-20E;;;3049;304; 56;386;----;Leshan;;China;2;29-34N;103-46E;29-33N;103-46E;440;440; 56;444;----;Deqen;;China;2;28-30N;098-54E;28-30N;098-54E;3488;3488; 56;459;----;Tu-Zha;;China;2;28-09N;100-56E;;;2743;; 56;462;----;Jiulong;;China;2;29-00N;101-30E;29-02N;101-30E;2994;299; 56;475;----;Yuexe;;China;2;28-37N;102-36E;;;1736;; 56;485;----;Hu-Jia-Pu-Ziia;;China;2;28-31N;103-37E;;;1485;; 56;492;----;Yibin;;China;2;28-48N;104-36E;28-49N;104-32E;342;342; 56;533;----;La-Wan;;China;2;27-41N;098-21E;27-41N;098-21E;3352;3352; 56;543;----;Zhongdian;;China;2;27-42N;099-42E;;;3001;; 56;548;----;Weixi;;China;2;27-13N;099-19E;;;2743;; 56;565;----;Yanyuan;;China;2;27-26N;101-32E;;;2591;; 56;571;----;Xichang;;China;2;27-54N;102-16E;27-53N;102-18E;1599;1599; 56;586;----;Zhaotong;;China;2;27-20N;103-45E;;;1950;1950; 56;651;----;Lijing;;China;2;26-50N;100-28E;26-52N;100-14E;2394;2394; 56;664;----;La-Shi;;China;2;26-22N;101-13E;;;1210;; 56;671;----;Huili;;China;2;26-39N;102-15E;26-39N;102-15E;1788;1788; 56;684;----;Huize;;China;2;26-25N;103-17E;;;2110;2110; 56;691;----;Weining;;China;2;26-52N;104-17E;26-52N;104-17E;2236;2236; 56;739;----;Tengchong;;China;2;25-07N;098-29E;25-02N;098-29E;1649;1649; 56;741;----;Liu-Ku;;China;2;25-47N;098-51E;;;2377;; 56;748;----;Baoshan;;China;2;25-08N;099-13E;;;1655;1655; 56;751;----;Dali;;China;2;25-42N;100-11E;;;1992;1992; 56;763;----;Yuanmou;;China;2;25-44N;101-52E;;;1120;1120; 56;768;----;Chuxiong;;China;2;25-01N;101-32E;25-01N;101-32E;1773;1773; 56;778;ZPPP;Kunming;;China;2;25-01N;102-41E;25-01N;102-41E;1892;1892; 56;786;----;Zhanyi;;China;2;25-35N;103-50E;;;1900;1900; 56;793;----;Pu-An;;China;2;25-47N;104-57E;;;2133;; 56;838;----;Ruili;;China;2;24-01N;097-50E;;;776;776; 56;856;----;Jing-Dong;;China;2;24-26N;100-51E;24-26N;100-50E;1676;1676; 56;875;----;Yuxi;;China;2;24-27N;102-34E;;;1677;; 56;886;----;Luxi;;China;2;24-32N;103-46E;;;1708;1708; 56;946;----;Gengma;;China;2;23-33N;099-24E;;;1104;1104; 56;951;----;Lincang;;China;2;23-57N;100-13E;23-57N;100-13E;1503;1503; 56;954;----;Lancang;;China;2;22-34N;099-56E;;;1054;1054; 56;959;----;Jinghong;;China;2;22-01N;100-48E;;;553;553; 56;964;----;Simao;;China;2;22-46N;100-59E;22-57N;101-49E;1303;1303; 56;966;----;Yuanjiang;;China;2;23-36N;101-59E;;;398;398; 56;969;----;Mengla;;China;2;21-30N;101-35E;21-30N;101-35E;633;633; 56;977;----;Jiangcheng;;China;2;22-37N;101-49E;;;1121;1121; 56;985;----;Mengzi;;China;2;23-23N;103-23E;23-23N;103-23E;1302;1302; 56;986;----;Dehoujie;;China;2;23-35N;103-52E;;;1423;; 56;994;----;Wenshan;;China;2;23-22N;104-23E;;;1278;; 57;006;----;Tianshui;;China;2;34-35N;105-45E;34-35N;105-45E;1143;1143; 57;016;----;Baoji;;China;2;34-21N;107-08E;;;610;610; 57;034;----;Qian-Xian;;China;2;34-32N;108-14E;;;335;; 57;036;ZLSN;Xi'An;;China;2;34-18N;108-56E;34-18N;108-56E;398;398; 57;046;----;Hua Shan;;China;2;34-29N;110-05E;34-29N;110-05E;2063;2063; 57;067;----;Lushi;;China;2;34-03N;111-02E;34-03N;111-02E;570;570; 57;071;----;Mengjin;;China;2;34-50N;112-26E;;;325;325; 57;077;----;Tien-Hu;;China;2;34-09N;112-06E;;;753;; 57;083;ZHCC;Zhengzhou;;China;2;34-43N;113-39E;34-43N;113-39E;111;111; 57;089;----;Xuchang;;China;2;34-00N;113-58E;34-02N;113-43E;72;72; 57;091;----;Kaifeng;;China;2;34-45N;114-25E;;;67;; 57;106;----;Cheng-Xian;;China;2;33-45N;105-45E;;;1128;; 57;127;----;Hanzhong;;China;2;33-04N;107-02E;33-04N;107-02E;509;509; 57;134;----;Wen-Huang-Ping;;China;2;33-27N;108-15E;;;548;; 57;143;----;Shangxian;;China;2;33-55N;109-57E;;;748;; 57;144;----;Chen-An;;China;2;33-25N;109-09E;;;610;; 57;156;----;Shang-Nan;;China;2;33-32N;110-53E;;;914;; 57;178;----;Nanyang;;China;2;33-02N;112-35E;33-01N;112-32E;131;131; 57;181;----;Jiaxian;;China;2;33-58N;113-13E;;;76;; 57;193;----;Xihua;;China;2;33-47N;114-31E;33-47N;114-31E;53;53; 57;232;----;Han-Yin;;China;2;32-54N;108-31E;;;457;; 57;237;----;Wanyuan;;China;2;32-04N;108-02E;32-04N;108-02E;674;674; 57;245;----;Ankang;;China;2;32-43N;109-02E;32-43N;109-02E;291;291; 57;251;----;Baihe;;China;2;32-46N;110-07E;;;610;; 57;259;----;Fangxian;;China;2;32-02N;110-46E;;;435;435; 57;265;----;Guanghua;;China;2;32-23N;111-40E;32-23N;111-40E;91;91; 57;279;----;Zaoyang;;China;2;32-09N;112-40E;;;127;127; 57;290;----;Zhumadian;;China;2;33-00N;114-01E;32-58N;114-03E;83;83; 57;297;----;Xinyang;;China;2;32-08N;114-03E;32-07N;114-05E;115;115; 57;306;----;Langzhong;;China;2;31-35N;105-58E;;;385;385; 57;313;----;Bazhong;;China;2;31-54N;106-42E;;;360;; 57;328;----;Da Xian;;China;2;31-12N;107-30E;31-13N;107-30E;311;311; 57;348;----;Fengjie;;China;2;31-03N;109-30E;;;607;607; 57;378;----;Zhongxiang;;China;2;31-10N;112-34E;;;66;66; 57;385;----;Suizhou;;China;2;31-43N;113-22E;;;61;; 57;399;----;Macheng;;China;2;31-11N;114-58E;;;59;59; 57;405;----;Suining;;China;2;30-30N;105-35E;;;300;; 57;411;----;Nanchong;;China;2;30-48N;106-05E;30-48N;106-05E;310;310; 57;426;----;Liangping;;China;2;30-41N;107-48E;30-41N;107-48E;455;455; 57;432;----;Wanxian;;China;2;30-48N;108-21E;;;299;; 57;447;----;Enshi;;China;2;30-17N;109-28E;30-16N;109-29E;458;458; 57;450;----;Zigui;;China;2;31-01N;110-42E;;;442;; 57;451;----;Lu-Cong-Po;;China;2;30-47N;110-16E;;;1188;; 57;458;----;Wu-Feng;;China;2;30-12N;110-40E;;;915;; 57;461;----;Yichang;;China;2;30-42N;111-18E;30-42N;111-17E;134;134; 57;476;----;Jiangling;;China;2;30-20N;112-11E;;;33;33; 57;494;ZHHH;Wuhan;;China;2;30-37N;114-08E;30-35N;114-16E;23;23; 57;504;----;Neijiang;;China;2;29-35N;105-03E;;;357;357; 57;516;ZUCK;Chongqing;;China;2;29-31N;106-29E;29-31N;106-29E;351;351; 57;522;----;Fou-Ling;;China;2;29-43N;107-24E;;;275;; 57;545;----;Laifeng;;China;2;29-32N;109-23E;;;561;; 57;554;----;Sangzhi;;China;2;29-24N;110-10E;;;322;322; 57;562;----;Shi-Men;;China;2;29-35N;111-18E;;;91;; 57;574;----;Anxiang;;China;2;29-26N;112-11E;29-25N;112-09E;28;28; 57;583;----;Puqi;;China;2;29-43N;113-53E;;;61;; 57;584;----;Yueyang;;China;2;29-23N;113-05E;29-23N;113-05E;52;52; 57;598;----;Xiushui;;China;2;29-02N;114-35E;;;147;147; 57;602;----;Luzhou;;China;2;28-53N;105-26E;;;336;336; 57;606;----;Ch'Ih-Shui Ho;;China;2;28-29N;105-56E;28-29N;105-56E;977;977; 57;608;----;Xuyong / Yongning;;China;2;28-13N;105-26E;;;366;; 57;622;----;Jinfo Shan Mount ;;China;2;28-57N;107-09E;;;1907;; 57;633;----;Youyang;;China;2;28-50N;108-46E;28-52N;108-54E;665;665; 57;649;----;Qian-Zhou-Zhen;;China;2;28-16N;109-41E;28-16N;109-41E;560;360; 57;655;----;Yuanling;;China;2;28-28N;110-24E;;;143;; 57;662;----;Changde;;China;2;29-03N;111-41E;29-03N;111-41E;35;35; 57;669;----;Mei-Cheng-Zhen;;China;2;28-09N;111-38E;28-09N;111-38E;201;201; 57;671;----;Yuanjiang;;China;2;28-51N;112-23E;;;27;; 57;679;ZGCS;Changsha;;China;2;28-12N;113-05E;28-12N;112-58E;46;46; 57;682;----;Pingjiang;;China;2;28-45N;113-37E;;;88;; 57;687;----;Changsha;;China;2;28-14N;112-52E;;;68;68; 57;707;----;Bijie;;China;2;27-18N;105-14E;27-18N;105-14E;1511;1511; 57;713;----;Zunyi;;China;2;27-42N;106-53E;;;845;845; 57;731;----;Sinan;;China;2;27-57N;108-15E;27-57N;108-15E;418;418; 57;745;----;Zhijiang;;China;2;27-27N;109-41E;27-27N;109-41E;273;273; 57;749;----;Huaihua;;China;2;27-34N;110-00E;27-34N;110-00E;261;261; 57;766;----;Shaoyang;;China;2;27-14N;111-28E;;;248;248; 57;774;----;Shuang-Feng;;China;2;27-27N;112-12E;;;916;; 57;776;----;Nanyue;;China;2;27-18N;112-42E;;;1279;1268; 57;793;----;Yichun;;China;2;27-48N;114-23E;27-48N;114-23E;129;129; 57;799;----;Ji'An;;China;2;27-07N;114-58E;27-07N;114-58E;78;78; 57;803;----;Zhi-Jin;;China;2;26-42N;105-46E;;;1676;; 57;806;----;Anshun;;China;2;26-16N;105-58E;;;1402;; 57;816;ZUGY;Guiyang;;China;2;26-35N;106-43E;26-29N;106-39E;1074;1074; 57;825;----;Ma-Jiang;;China;2;26-30N;107-35E;;;726;; 57;832;----;Sansui;;China;2;26-58N;108-40E;;;611;611; 57;845;----;Tongdao;;China;2;26-10N;109-47E;26-10N;109-47E;397;397; 57;853;----;Wugang;;China;2;26-44N;110-38E;;;340;; 57;866;----;Lingling;;China;2;26-14N;111-37E;;;174;; 57;872;----;Hengyang;;China;2;26-56N;112-35E;;;98;; 57;883;----;Chaling;;China;2;26-48N;113-32E;;;176;; 57;902;----;Xingren;;China;2;25-26N;105-11E;25-26N;105-11E;1379;1379; 57;906;----;Zhen-Feng;;China;2;25-23N;105-39E;;;571;; 57;916;----;Luodian;;China;2;25-26N;106-46E;25-26N;106-46E;441;441; 57;922;----;Dushan;;China;2;25-50N;107-33E;25-50N;107-33E;1018;971; 57;932;----;Rongjiang;;China;2;25-58N;108-32E;25-58N;108-32E;287;287; 57;947;----;Rong-Shui;;China;2;25-04N;109-15E;;;183;; 57;957;ZGKL;Guilin;;China;2;25-20N;110-18E;25-20N;110-18E;166;166; 57;965;----;Daoxian;;China;2;25-37N;111-36E;;;152;; 57;972;----;Chenzhou;;China;2;25-48N;113-02E;25-49N;113-01E;185;185; 57;993;ZSGZ;Ganzhou;;China;2;25-51N;114-57E;25-51N;114-56E;125;125; 57;996;----;Xin-Feng;;China;2;25-24N;114-56E;;;195;; 58;015;----;Tang-Shan;;China;2;34-25N;116-20E;;;44;; 58;027;----;Xuzhou;;China;2;34-17N;117-09E;34-17N;117-10E;42;42; 58;040;----;Ganyu;;China;2;34-50N;119-08E;34-50N;119-08E;10;10; 58;102;----;Boxian;;China;2;33-53N;115-46E;;;42;42; 58;122;----;Suining;;China;2;33-54N;117-57E;;;26;; 58;138;----;Hongze Hu Lake ;;China;2;33-20N;118-40E;33-17N;118-50E;2;2; 58;144;----;Qingjiang;;China;2;33-36N;119-02E;33-36N;119-02E;19;19; 58;150;----;Sheyang;;China;2;33-46N;120-15E;33-46N;120-15E;7;7; 58;203;----;Fuyang;;China;2;32-56N;115-50E;32-54N;115-48E;39;39; 58;208;----;Gushi;;China;2;32-10N;115-40E;;;58;58; 58;215;----;Shouxian / Shouyang;;China;2;32-35N;116-47E;;;23;; 58;221;----;Bengbu;;China;2;32-57N;117-22E;;;22;22; 58;238;ZSNJ;Nanjing;;China;2;32-00N;118-48E;32-00N;118-48E;12;12; 58;241;----;Gaoyou;;China;2;32-47N;119-27E;;;3;; 58;251;----;Dongtai;;China;2;32-52N;120-19E;;;5;5; 58;259;----;Nantong / Jinsha;;China;2;32-06N;120-52E;;;1;; 58;265;----;Lusi;;China;2;32-04N;121-36E;32-04N;121-36E;10;10; 58;314;----;Huoshan;;China;2;31-24N;116-20E;;;68;68; 58;321;ZSOF;Hefei;;China;2;31-52N;117-14E;31-52N;117-14E;36;36; 58;338;----;Wuhu;;China;2;31-20N;118-21E;;;16;16; 58;343;----;Changzhou;;China;2;31-46N;119-57E;31-46N;119-57E;15;15; 58;345;----;Liyang;;China;2;31-26N;119-29E;;;8;8; 58;358;----;Suzhou;;China;2;31-16N;120-37E;;;19;; 58;362;----;Shanghai;;China;2;31-24N;121-28E;31-24N;121-28E;8;4; 58;367;ZSSS;Shanghai / Hongqiao;;China;2;31-10N;121-26E;31-10N;121-26E;7;3; 58;402;----;Yingshan;;China;2;30-45N;115-40E;;;116;; 58;407;----;Qizhou;;China;2;30-04N;115-20E;;;29;; 58;424;----;Anqing;;China;2;30-32N;117-03E;30-31N;117-02E;20;20; 58;437;----;Huang Shan;;China;2;30-08N;118-09E;;;1836;1836; 58;445;----;Tianmu Shan;;China;2;30-21N;119-25E;;;1494;1494; 58;457;ZSHC;Hangzhou;;China;2;30-14N;120-10E;30-14N;120-10E;43;43; 58;464;----;Zha-Pu;;China;2;30-37N;121-05E;;;7;; 58;472;----;Shengsi;;China;2;30-44N;122-27E;;;81;81; 58;473;----;Sheng Shang;;China;2;30-43N;122-49E;;;197;; 58;477;----;Dinghai;;China;2;30-02N;122-07E;30-02N;122-07E;37;37; 58;506;----;Lu Shan;;China;2;29-35N;115-59E;;;1165;1165; 58;519;----;Gu-Xian-Du;;China;2;29-05N;116-53E;;;31;; 58;527;----;Jingdezhen;;China;2;29-18N;117-12E;29-18N;117-12E;60;60; 58;531;----;Tunxi;;China;2;29-45N;118-15E;;;61;; 58;549;----;Jinhua;;China;2;29-09N;119-38E;;;35;; 58;556;----;Shengxian;;China;2;29-36N;120-49E;;;108;108; 58;562;----;Ningbo;;China;2;29-55N;121-28E;;;6;; 58;569;----;Shipu;;China;2;29-12N;121-57E;;;127;127; 58;606;ZSCN;Nanchang;;China;2;28-36N;115-55E;28-40N;115-55E;50;50; 58;608;----;Qingjiang / Zhangshuz;;China;2;28-03N;115-32E;;;40;; 58;626;----;Shangrao;;China;2;28-29N;117-59E;;;90;; 58;633;----;Qu Xian;;China;2;28-58N;118-52E;28-58N;118-52E;71;71; 58;634;----;Yushan;;China;2;28-41N;118-15E;28-40N;118-15E;94;94; 58;646;----;Lishui;;China;2;28-27N;119-55E;;;62;62; 58;647;----;Longquan;;China;2;28-06N;119-05E;28-05N;119-07E;180;180; 58;659;----;Wenzhou;;China;2;28-01N;120-40E;;;7;7; 58;660;----;Linhai;;China;2;28-51N;121-08E;;;9;9; 58;665;----;Hongjia;;China;2;28-37N;121-25E;28-39N;120-05E;9;2; 58;666;----;Dachen Dao;;China;2;28-27N;121-53E;28-27N;121-53E;84;84; 58;667;----;Yu-Huan;;China;2;28-08N;121-13E;;;100;; 58;715;----;Nancheng;;China;2;27-35N;116-39E;27-35N;116-39E;82;82; 58;725;----;Shaowu;;China;2;27-20N;117-26E;27-20N;117-28E;192;192; 58;726;----;Qixian Shan;;China;2;27-57N;117-50E;;;1415;; 58;730;----;Wuyishan;;China;2;27-46N;118-02E;;;221;221; 58;731;----;Pucheng;;China;2;27-55N;118-32E;27-55N;118-32E;275;275; 58;737;----;Jian'Ou;;China;2;27-03N;118-19E;27-03N;118-18E;112;112; 58;754;----;Fuding;;China;2;27-20N;120-12E;27-20N;120-12E;38;38; 58;765;----;Nanji Shan;;China;2;27-28N;121-03E;;;2;; 58;813;----;Guangchang;;China;2;26-51N;116-20E;;;142;142; 58;820;----;Sanming;;China;2;26-11N;117-37E;;;198;; 58;834;----;Nanping;;China;2;26-39N;118-10E;;;128;128; 58;846;----;Luoyuan;;China;2;26-31N;119-32E;;;85;; 58;847;ZSFZ;Fuzhou;;China;2;26-05N;119-17E;26-05N;119-17E;85;85; 58;849;----;Mazu;;China;2;26-10N;119-56E;26-10N;119-56E;91;91; 58;853;----;Taishan;;China;2;27-00N;120-42E;;;106;106; 58;911;----;Changting;;China;2;25-51N;116-22E;25-51N;116-22E;311;311; 58;918;----;Shanghang;;China;2;25-04N;116-21E;;;207;; 58;921;----;Yong'An;;China;2;25-58N;117-21E;;;204;204; 58;926;----;Zhang Ping;;China;2;25-18N;117-24E;;;203;203; 58;927;----;Longyan;;China;2;25-06N;117-01E;;;341;; 58;931;----;Jiuxian Shan;;China;2;25-43N;118-06E;;;1651;1651; 58;944;----;Pingtan;;China;2;25-31N;119-47E;;;31;31; 58;965;----;Taoyuan;;China;2;25-03N;121-13E;;;;48; 58;968;----;Taibei;;China;2;25-02N;121-31E;25-02N;121-32E;9;9; 58;974;----;Pengjia Yu;;China;2;25-38N;122-04E;;;102;102; 59;007;----;Guangnan;;China;2;24-04N;105-04E;24-04N;105-04E;1251;1251; 59;021;----;Tian'E / Liupai;;China;2;25-05N;107-12E;;;305;; 59;023;----;Hechi;;China;2;24-42N;108-03E;24-42N;108-03E;214;214; 59;046;----;Liuzhou;;China;2;24-21N;109-24E;24-21N;109-24E;97;97; 59;058;----;Mengshan;;China;2;24-12N;110-31E;;;145;145; 59;065;----;Hexian / Babu;;China;2;24-28N;111-34E;;;91;; 59;072;----;Lian Xian;;China;2;24-47N;112-23E;;;98;98; 59;082;----;Shaoguan;;China;2;24-48N;113-35E;24-48N;113-35E;68;68; 59;087;----;Fogang;;China;2;23-52N;113-32E;;;68;68; 59;096;----;Lianping;;China;2;24-22N;114-29E;24-22N;114-29E;214;214; 59;102;----;Xunwu;;China;2;24-57N;115-39E;;;299;299; 59;117;----;Mei Xian;;China;2;24-18N;116-07E;;;84;84; 59;126;----;Zhangzhou;;China;2;24-38N;117-39E;;;24;; 59;133;----;Jin-Jiang;;China;2;24-48N;118-35E;;;22;; 59;134;ZSAM;Xiamen;;China;2;24-29N;118-05E;24-27N;118-04E;139;139; 59;152;----;Xinzhu;;China;2;24-48N;120-58E;;;;34; 59;158;----;Taizhong;;China;2;24-09N;120-41E;;;78;78; 59;162;----;Yilan;;China;2;24-46N;121-45E;;;;9; 59;209;----;Napo;;China;2;23-18N;105-57E;;;794;794; 59;211;----;Baise;;China;2;23-54N;106-36E;23-55N;106-37E;242;242; 59;218;----;Xinjing;;China;2;23-08N;106-25E;;;740;; 59;228;----;Long'An;;China;2;23-08N;107-39E;;;457;; 59;242;----;Da-Wan;;China;2;23-51N;109-25E;;;76;; 59;254;----;Guiping;;China;2;23-24N;110-05E;;;44;44; 59;265;----;Wuzhou;;China;2;23-29N;111-18E;23-29N;111-18E;120;120; 59;271;----;Huaiji;;China;2;23-57N;112-12E;;;57;; 59;278;----;Gaoyao;;China;2;23-03N;112-28E;23-03N;112-28E;12;12; 59;280;----;Qing Yuan;;China;2;23-40N;113-03E;;;;19; 59;287;ZGGG;Guangzhou;;China;2;23-10N;113-20E;23-08N;113-19E;8;42; 59;293;----;Heyuan;;China;2;23-44N;114-41E;;;41;41; 59;298;----;Hui-Yang;;China;2;23-05N;114-25E;;;16;; 59;303;----;Song-Lin-Ba;;China;2;23-58N;115-58E;;;152;; 59;316;ZGOW;Shantou;;China;2;23-24N;116-41E;23-21N;116-40E;3;3; 59;317;----;Huilai;;China;2;23-05N;116-18E;;;30;; 59;345;----;Magong;;China;2;23-31N;119-34E;;;;22; 59;348;----;Dongji;;China;2;23-16N;119-40E;;;;45; 59;353;----;Ali Shan;;China;2;23-31N;120-48E;;;;2408; 59;358;----;Tainan;;China;2;23-00N;120-13E;;;14;14; 59;362;----;Hualian;;China;2;24-01N;121-37E;24-01N;121-37E;14;14; 59;368;----;Xingang;;China;2;23-06N;121-22E;;;;37; 59;417;----;Longzhou;;China;2;22-22N;106-45E;22-21N;106-50E;129;129; 59;431;ZGNN;Nanning;;China;2;22-49N;108-21E;22-49N;108-21E;73;73; 59;446;----;Bobai;;China;2;22-15N;109-58E;;;121;; 59;453;----;Cen-Xi;;China;2;22-56N;110-59E;;;243;; 59;456;----;Xinyi;;China;2;22-21N;110-56E;;;84;84; 59;462;----;Luoding;;China;2;22-43N;111-33E;;;134;; 59;478;----;Tai-Shan;;China;2;22-16N;112-47E;;;46;; 59;493;ZGSZ;Shenzhen;;China;2;22-33N;114-06E;;;18;18; 59;501;----;Shanwei;;China;2;22-47N;115-22E;22-47N;115-22E;5;5; 59;553;----;Donggang;;China;2;22-28N;120-26E;;;;8; 59;554;----;Gaoxiong;;China;2;22-37N;120-16E;;;;33; 59;556;----;Dawu;;China;2;22-21N;120-54E;;;;9; 59;559;----;Hengchun;;China;2;22-00N;120-45E;22-00N;120-45E;24;24; 59;562;----;Taidong;;China;2;22-45N;121-09E;;;10;10; 59;567;----;Lan Yu;;China;2;22-02N;121-33E;;;325;325; 59;626;----;Dong-Xing;;China;2;21-33N;107-58E;;;13;; 59;632;----;Qinzhou;;China;2;21-57N;108-37E;21-57N;108-37E;6;6; 59;644;----;Beihai;;China;2;21-29N;109-06E;21-29N;109-06E;16;16; 59;647;----;Wei-Zhou Island;;China;2;21-02N;109-07E;21-02N;109-07E;41;41; 59;658;ZGZJ;Zhanjiang;;China;2;21-13N;110-24E;21-13N;110-24E;28;28; 59;663;----;Yangjiang;;China;2;21-52N;111-58E;21-52N;111-58E;22;22; 59;664;----;Tian-Cheng;;China;2;21-31N;111-18E;21-31N;111-18E;8;8; 59;673;----;Shangchuan Dao;;China;2;21-44N;112-46E;;;18;18; 59;754;----;Xuwen;;China;2;20-22N;110-10E;;;109;; 59;758;ZGHK;Haikou;;China;2;20-02N;110-21E;20-02N;110-21E;15;15; 59;792;----;Dongsha Dao;;China;2;20-40N;116-43E;20-43N;116-44E;6;6; 59;838;----;Dongfang;;China;2;19-06N;108-37E;19-06N;108-37E;8;8; 59;845;----;Danxian;;China;2;19-31N;109-35E;;;169;169; 59;849;----;Xin-Shi;;China;2;19-04N;109-53E;;;243;; 59;855;----;Qionghai;;China;2;19-14N;110-28E;;;25;25; 59;948;----;Yaxian;;China;2;18-14N;109-31E;18-17N;109-28E;7;7; 59;954;----;Ling-Shui;;China;2;18-30N;110-00E;;;50;; 59;981;----;Xisha Dao;;China;2;16-50N;112-20E;16-50N;112-20E;5;5; 59;985;----;Sanhu Dao;;China;2;16-32N;111-37E;;;5;5; 59;995;----;Yongshujiao;;China;2;09-32N;112-53E;;;6;; 59;997;----;Nansha Dao;;China;2;10-23N;114-22E;10-23N;114-22E;5;5; 60;001;GCHI;Hierro / Aeropuerto;;Spain;1;27-49N;017-53W;;;32;32; 60;005;GCLA;La Palma / Aeropuerto;;Spain;1;28-37N;017-45W;;;29;31;P 60;010;----;Izana;;Spain;1;28-18N;016-30W;;;2367;2368; 60;015;GCXO;Tenerife / Los Rodeos;;Spain;1;28-28N;016-19W;;;632;617;P 60;020;----;Santa Cruz De Tene-Rife, Cmz;;Spain;1;28-27N;016-15W;28-28N;016-15W;35;36;P 60;025;GCTS;Tenerife Sur;;Spain;1;28-03N;016-34W;;;64;77; 60;030;GCLP;Gran Canaria - Canary Islands;;Spain;1;27-56N;015-23W;27-56N;015-23W;23;47;P 60;033;----;El Aayoune;;Western Sahara;1;27-09N;013-12W;;;63;63; 60;035;GCFV;Fuerteventura / Aeropuerto;;Spain;1;28-27N;013-52W;;;22;30; 60;040;GCRR;Lanzarote / Aeropuerto;;Spain;1;28-57N;013-36W;;;14;21;P 60;060;GMMF;Sidi Ifni;;Morocco;1;29-22N;010-11W;29-22N;010-11W;58;66;P 60;096;GSVO;Villa Cisneros;;Western Sahara;1;23-42N;015-52W;23-42N;015-56W;10;10;P 60;101;GMTT;Tanger Aerodrome ;;Morocco;1;35-44N;005-54W;35-44N;005-54W;19;21;P 60;105;----;Larache;;Morocco;1;35-11N;006-08W;;;47;49;P 60;106;----;Chefchaouen;;Morocco;1;35-04N;005-18W;;;300;305; 60;107;GMTA;Al Hoceima;;Morocco;1;35-11N;003-51W;35-11N;003-51W;27;14;P 60;115;GMFO;Oujda;;Morocco;1;34-47N;001-56W;34-47N;001-57W;468;470;P 60;120;GMMY;Kenitra;;Morocco;1;34-18N;006-36W;;;5;14;P 60;127;GMFZ;Taza;;Morocco;1;34-13N;004-00W;34-13N;004-00W;509;510;P 60;135;GMME;Rabat-Sale;;Morocco;1;34-03N;006-46W;34-03N;006-46W;84;75;P 60;136;----;Sidi Slimane;;Morocco;1;34-14N;006-03W;;;53;52;P 60;141;GMFF;Fes-Sais;;Morocco;1;33-56N;004-59W;33-56N;004-59W;579;579;P 60;146;----;Mohammedia;;Morocco;1;33-43N;007-24W;;;;6; 60;150;GMFM;Meknes;;Morocco;1;33-53N;005-32W;33-53N;005-32W;576;549;P 60;155;GMMC;Casablanca;;Morocco;1;33-34N;007-40W;33-34N;007-40W;62;62;P 60;156;GMMN;Nouasseur;;Morocco;1;33-22N;007-35W;;;200;206;P 60;160;GMFI;Ifrane;;Morocco;1;33-30N;005-10W;33-30N;005-10W;1664;1665;P 60;165;----;El Jadida;;Morocco;1;33-14N;008-31W;;;27;28;P 60;178;----;Khouribga;;Morocco;1;32-52N;006-58W;;;785;785;P 60;185;GMMS;Safi;;Morocco;1;32-17N;009-14W;32-17N;009-14W;52;45;P 60;190;----;Kasba-Tadla;;Morocco;1;32-32N;006-17W;32-36N;006-16W;503;518; 60;191;----;Beni-Mellal;;Morocco;1;32-22N;006-24W;32-22N;006-24W;468;468;P 60;195;----;Midelt;;Morocco;1;32-41N;004-44W;32-41N;004-44W;1508;1515;P 60;200;----;Bouarfa;;Morocco;1;32-34N;001-57W;;;1075;1110; 60;210;GMFK;Errachidia;;Morocco;1;31-56N;004-24W;31-58N;004-25W;1034;1042;P 60;220;GMMI;Essaouira;;Morocco;1;31-31N;009-47W;31-31N;009-47W;15;8;P 60;230;GMMX;Marrakech;;Morocco;1;31-37N;008-02W;31-37N;008-02W;468;466;P 60;250;GMAA;Agadir;;Morocco;1;30-23N;009-34W;30-23N;009-34W;27;23;P 60;252;GMAD;Agadir Al Massira;;Morocco;1;30-20N;009-24W;30-20N;009-25W;74;74; 60;253;----;Taroudant;;Morocco;1;30-30N;008-49W;;;;265; 60;265;GMMZ;Ouarzazate;;Morocco;1;30-56N;006-54W;30-56N;006-54W;1139;1140;P 60;270;----;Tiznit;;Morocco;1;29-41N;009-44W;;;260;261; 60;275;----;Zagora;;Morocco;1;30-19N;005-52W;;;;729; 60;280;----;Guelmin;;Morocco;1;29-01N;010-03W;;;;301; 60;285;GMAT;Tan-Tan;;Morocco;1;28-27N;011-09W;;;229;200;P 60;289;----;Tarfaya;;Morocco;1;27-56N;013-00W;;;;; 60;318;GMTN;Tetuan / Sania Ramel;;Morocco;1;35-35N;005-20W;;;10;10;P 60;320;----;Ceuta;;Spain;1;35-54N;005-19W;;;2;4; 60;338;GEML;Melilla;;Spain;1;35-17N;002-57W;;;47;55;P 60;340;GMFN;Nador;;Morocco;1;35-09N;002-55W;35-09N;002-55W;3;16;P 60;351;DAAV;Jijel Achouat;;Algeria;1;36-53N;005-49E;;;2;10;P 60;353;----;Jijel Port;;Algeria;1;36-50N;005-47E;;;2;2;P 60;354;----;El Milia;;Algeria;1;36-44N;003-54E;;;;31;P 60;355;DABP;Skikda;;Algeria;1;36-56N;006-57E;36-56N;006-57E;7;7;P 60;360;DABB;Annaba;;Algeria;1;36-50N;007-49E;36-50N;007-49E;4;4;P 60;367;----;El-Kala;;Algeria;1;36-54N;008-27E;;;10;10;P 60;369;----;Alger Port;;Algeria;1;36-46N;003-06E;;;8;8;P 60;374;----;Cap Caxine;;Algeria;1;36-49N;002-57E;;;;33; 60;376;----;Bordj-El-Bahri;;Algeria;1;36-49N;003-16E;;;;58; 60;382;----;Cap Bengut;;Algeria;1;36-54N;003-54E;;;;30; 60;384;----;Cap Corbelin;;Algeria;1;36-54N;004-25E;;;;45; 60;387;----;Dellys;;Algeria;1;36-55N;003-57E;;;12;12;P 60;388;----;Cherchell;;Algeria;1;36-36N;002-11E;;;;33; 60;390;DAAG;Dar-El-Beida;;Algeria;1;36-43N;003-15E;36-43N;003-15E;25;25;P 60;395;----;Tizi-Ouzou;;Algeria;1;36-42N;004-03E;;;195;195;P 60;400;----;Cap Carbon;;Algeria;1;36-45N;005-06E;;;;13; 60;402;DAAE;Bejaia;;Algeria;1;36-43N;005-04E;36-43N;005-04E;2;2;P 60;403;----;Guelma;;Algeria;1;36-28N;007-28E;;;227;227;P 60;405;----;Guelma / Bouchegouf;;Algeria;1;36-30N;007-43E;;;;110; 60;410;----;Tenes;;Algeria;1;36-30N;001-20E;;;59;59;P 60;417;----;Bouira;;Algeria;1;36-23N;003-54E;;;635;635;P 60;419;DABC;Constantine;;Algeria;1;36-17N;006-37E;36-17N;006-37E;694;694;P 60;421;----;Oum El Bouaghi;;Algeria;1;35-53N;007-07E;;;889;889;P 60;423;----;Souk Ahras;;Algeria;1;36-17N;007-58E;;;680;680;P 60;425;DAOI;Chlef;;Algeria;1;36-13N;001-20E;36-13N;001-20E;143;143;P 60;430;----;Miliana;;Algeria;1;36-18N;002-14E;36-18N;002-14E;715;715;P 60;437;----;Medea;;Algeria;1;36-16N;002-45E;;;981;981;P 60;444;----;Bordj Bou Arreridj;;Algeria;1;36-04N;004-46E;;;928;928;P 60;445;DAAS;Setif;;Algeria;1;36-11N;005-25E;36-11N;005-25E;1038;1081;P 60;452;----;Arzew;;Algeria;1;35-49N;000-16W;;;4;3;P 60;456;----;Mostaganem Port;;Algeria;1;35-48N;000-05E;;;;210;P 60;457;----;Mostaganem Ville;;Algeria;1;35-53N;000-07E;;;137;137;P 60;459;----;Sidi Aissa;;Algeria;1;35-53N;003-46E;;;;658; 60;461;----;Oran Port;;Algeria;1;35-42N;000-39W;;;22;22;P 60;467;----;M'Sila;;Algeria;1;35-40N;004-30E;;;441;441;P 60;468;DABT;Batna;;Algeria;1;35-33N;006-11E;;;1052;1052;P 60;471;----;Barika;;Algeria;1;35-20N;005-20E;;;;460;P 60;475;DABS;Tebessa;;Algeria;1;35-29N;008-08E;35-29N;008-08E;813;813;P 60;476;----;Khenchella;;Algeria;1;35-25N;007-09E;;;1116;1116;P 60;478;----;Aris;;Algeria;1;35-15N;006-21E;;;;1240;P 60;481;----;Oran Tafaraoui;;Algeria;1;35-29N;000-31W;;;111;111;P 60;482;----;Cap Aiguille;;Algeria;1;35-52N;000-29W;;;;62; 60;485;----;Cap Falcon;;Algeria;1;35-46N;000-48W;;;;104; 60;490;DAOO;Oran / Es Senia;;Algeria;1;35-38N;000-36W;35-38N;000-36W;90;90;P 60;492;----;Relizane;;Algeria;1;35-44N;000-33E;;;;75; 60;506;----;Mascara Metmore;;Algeria;1;35-36N;000-18E;;;474;474;P 60;507;DAOV;Mascara-Ghriss;;Algeria;1;35-12N;000-08E;;;514;; 60;511;DAOB;Tiaret;;Algeria;1;35-15N;001-26E;;;1127;1127;P 60;514;----;Ksar Chellala;;Algeria;1;35-10N;002-19E;;;800;800;P 60;515;DAAD;Bou-Saada;;Algeria;1;35-20N;004-12E;;;461;461;P 60;517;----;Ghazaouet;;Algeria;1;35-06N;001-52W;;;83;83;P 60;518;----;Beni-Saf;;Algeria;1;35-18N;001-21W;;;68;68;P 60;520;----;Sidi Bel Abbes;;Algeria;1;35-11N;002-37W;;;450;450;P 60;522;----;Maghnia;;Algeria;1;34-49N;001-47W;;;426;426;P 60;525;DAUB;Biskra;;Algeria;1;34-48N;005-44E;34-48N;005-44E;87;87;P 60;531;DAON;Tlemcen Zenata ;;Algeria;1;35-01N;001-28W;;;247;247;P 60;533;----;Saida;;Algeria;1;34-52N;000-09E;;;;770;P 60;535;DAFI;Djelfa;;Algeria;1;34-41N;003-15E;34-41N;003-15E;1144;1144;P 60;536;----;Saida;;Algeria;1;34-52N;000-09E;;;770;750;P 60;540;----;El Kheiter;;Algeria;1;34-09N;000-04E;;;1000;1000;P 60;545;DAUL;Laghouat;;Algeria;1;33-46N;002-56E;33-46N;002-56E;765;765;P 60;549;DAAY;Mecheria;;Algeria;1;34-56N;000-26W;34-56N;000-26W;1149;1149;P 60;550;----;Elbayadh;;Algeria;1;33-40N;001-00E;33-41N;001-00E;1341;1341;P 60;555;DAUK;Touggourt;;Algeria;1;33-07N;006-08E;33-07N;006-08E;85;85;P 60;557;----;Naama;;Algeria;1;33-16N;000-18W;;;1166;1166;P 60;559;DAUO;El Oued;;Algeria;1;33-30N;006-07E;33-30N;006-47E;63;63;P 60;560;----;Ain Sefra;;Algeria;1;32-46N;000-36W;;;1058;1058;P 60;566;DAUG;Ghardaia;;Algeria;1;32-23N;003-49E;32-23N;003-49E;450;450;P 60;571;DAOR;Bechar;;Algeria;1;31-37N;002-14W;31-37N;002-14W;773;773;P 60;580;DAUU;Ouargla;;Algeria;1;31-55N;005-24E;31-55N;005-24E;141;141;P 60;581;DAUH;Hassi-Messaoud;;Algeria;1;31-40N;006-09E;;;142;142;P 60;590;DAUE;El Golea;;Algeria;1;30-34N;002-52E;30-34N;002-52E;397;397;P 60;602;----;Beni Abbes;;Algeria;1;30-08N;002-10W;30-08N;002-10W;499;499;P 60;607;DAUT;Timimoun;;Algeria;1;29-15N;000-17E;29-15N;000-17E;312;312;P 60;611;DAUZ;In Amenas;;Algeria;1;28-03N;009-38E;28-03N;009-38E;562;562;P 60;620;DAUA;Adrar;;Algeria;1;27-53N;000-17W;27-53N;000-17W;263;263;P 60;630;----;In Salah;;Algeria;1;27-12N;002-28E;27-12N;002-28E;293;293;P 60;640;DAAP;Illizi;;Algeria;1;26-30N;008-25E;26-30N;008-25E;558;558;P 60;656;DAOF;Tindouf;;Algeria;1;27-40N;008-08W;27-40N;008-08W;431;431;P 60;670;DAAJ;Djanet;;Algeria;1;24-33N;009-28E;24-33N;009-28E;1054;1054;P 60;680;----;Tamanrasset;;Algeria;1;22-47N;005-31E;22-47N;005-31E;1378;1378;P 60;686;----;Bordji B. Mokhtar;;Algeria;1;21-20N;000-57E;;;398;398;P 60;690;----;In-Guezzam;;Algeria;1;19-34N;005-46E;;;411;411;P 60;710;DTKA;Tabarka;;Tunisia;1;36-57N;008-45E;36-57N;008-45E;20;21; 60;714;DTTB;Bizerte;;Tunisia;1;37-15N;009-48E;37-14N;009-49E;5;3;P 60;715;DTTA;Tunis-Carthage;;Tunisia;1;36-50N;010-14E;36-50N;010-14E;3;4;P 60;720;DTTL;Kelibia;;Tunisia;1;36-51N;011-05E;37-04N;011-02E;29;30;P 60;723;----;Beja;;Tunisia;1;36-44N;009-11E;;;158;159; 60;725;DTTN;Jendouba;;Tunisia;1;36-29N;008-48E;36-29N;008-48E;143;144;P 60;728;----;Nabeul;;Tunisia;1;36-27N;010-44E;;;1;5; 60;734;----;Siliana;;Tunisia;1;36-04N;009-22E;;;443;445; 60;735;DTTK;Kairouan;;Tunisia;1;35-40N;010-06E;35-40N;010-06E;60;68;P 60;738;----;Thala;;Tunisia;1;35-33N;008-41E;35-33N;008-41E;1091;1092;P 60;740;DTTM;Monastir-Skanes;;Tunisia;1;35-40N;010-45E;35-45N;010-45E;2;3;P 60;745;DTTF;Gafsa;;Tunisia;1;34-25N;008-49E;34-25N;008-49E;313;314;P 60;748;----;Sidi Bouzid;;Tunisia;1;35-00N;009-29E;35-01N;009-30E;354;355; 60;750;DTTX;Sfax El-Maou;;Tunisia;1;34-43N;010-41E;34-43N;010-41E;21;23;P 60;760;DTTZ;Tozeur;;Tunisia;1;33-55N;008-06E;33-55N;008-10E;87;93;P 60;764;----;Kebili;;Tunisia;1;33-42N;008-58E;;;44;46; 60;765;DTTG;Gabes;;Tunisia;1;33-53N;010-06E;33-53N;010-06E;4;5; 60;769;DTTJ;Djerba Mellita;;Tunisia;1;33-52N;010-46E;33-52N;010-46E;3;4;P 60;770;----;Medenine;;Tunisia;1;33-21N;010-29E;33-21N;010-29E;116;117; 60;775;DTTD;Remada;;Tunisia;1;32-19N;010-24E;32-19N;010-24E;300;301;P 60;780;DTTR;El Borma;;Tunisia;1;31-41N;009-10E;31-41N;009-12E;258;259;P 61;017;DRRI;Bilma;;Niger;1;18-41N;012-55E;18-41N;012-55E;355;357; 61;024;DRZA;Agadez;;Niger;1;16-58N;007-59E;16-58N;007-59E;501;502; 61;028;----;Tchin-Tabaraden;;Niger;1;15-43N;005-48E;;;;; 61;033;----;Tesker;;Niger;1;15-08N;010-43E;;;;; 61;036;DRRL;Tillabery;;Niger;1;14-12N;001-27E;;;209;210; 61;043;DRRT;Tahoua;;Niger;1;14-54N;005-15E;;;386;391; 61;045;DRZG;Goure;;Niger;1;13-59N;010-18E;;;464;460; 61;049;----;N'Guigmi;;Niger;1;14-15N;013-07E;;;285;286; 61;052;DRRN;Niamey-Aero;;Niger;1;13-29N;002-10E;13-29N;002-10E;223;227; 61;075;DRRB;Birni-N'Konni;;Niger;1;13-48N;005-15E;13-48N;005-15E;272;273; 61;080;DRRM;Maradi;;Niger;1;13-28N;007-05E;13-28N;007-05E;372;373; 61;085;DRZF;Diffa;;Niger;1;13-25N;012-47E;;;303;305; 61;090;DRZR;Zinder;;Niger;1;13-47N;008-59E;13-47N;008-59E;452;453; 61;091;----;Magaria;;Niger;1;12-59N;008-56E;12-59N;008-56E;402;403; 61;096;DRZM;Maine-Soroa;;Niger;1;13-14N;011-59E;;;338;337; 61;099;DRRG;Gaya;;Niger;1;11-53N;003-27E;;;202;203; 61;202;GATS;Tessalit;;Mali;1;20-12N;000-59E;20-12N;000-59E;494;491;P 61;214;GAKL;Kidal;;Mali;1;18-26N;001-21E;18-26N;001-21E;458;459;P 61;223;GATB;Tombouctou;;Mali;1;16-43N;003-00W;16-43N;003-00W;263;264;P 61;226;GAGO;Gao;;Mali;1;16-16N;000-03W;16-16N;000-03W;265;260;P 61;230;GANR;Nioro Du Sahel;;Mali;1;15-14N;009-21W;;;235;237;P 61;233;GANK;Nara;;Mali;1;15-10N;007-17W;15-10N;007-17W;271;265;P 61;235;----;Yelimane;;Mali;1;15-07N;010-34W;;;;100; 61;240;GAHB;Hombori;;Mali;1;15-20N;001-41W;;;287;288;P 61;250;GAMK;Menaka;;Mali;1;15-52N;002-13E;;;278;278;P 61;257;GAKY;Kayes;;Mali;1;14-26N;011-26W;14-26N;011-26W;47;47;P 61;265;GAMB;Mopti;;Mali;1;14-31N;004-06W;14-31N;004-06W;276;272;P 61;270;GAKT;Kita;;Mali;1;13-04N;009-28W;;;333;334;P 61;272;GASG;Segou;;Mali;1;13-24N;006-09W;13-26N;006-17W;288;289;P 61;277;GASN;San;;Mali;1;13-20N;004-50W;;;283;284;P 61;285;GAKA;Kenieba;;Mali;1;12-51N;011-14W;;;132;132;P 61;288;----;Dioila;;Mali;1;12-29N;006-48W;;;;331; 61;291;GABS;Bamako / Senou;;Mali;1;12-32N;007-57W;12-32N;007-57W;380;381;P 61;293;GAKO;Koutiala;;Mali;1;12-23N;005-28W;;;365;367;P 61;296;GABG;Bougouni;;Mali;1;11-25N;007-30W;11-25N;007-30W;350;351;P 61;297;GASK;Sikasso;;Mali;1;11-21N;005-41W;11-21N;005-41W;374;375;P 61;401;GQPT;Bir Moghrein;;Mauritania;1;25-14N;011-37W;25-14N;011-37W;364;360;P 61;404;----;Zouerate;;Mauritania;1;22-45N;012-29W;22-45N;012-29W;343;343;P 61;415;GQPP;Nouadhibou;;Mauritania;1;20-56N;017-02W;20-56N;017-02W;5;3;P 61;421;GQPA;Atar;;Mauritania;1;20-31N;013-04W;20-31N;013-04W;226;224;P 61;437;GQNJ;Akjoujt;;Mauritania;1;19-45N;014-22W;;;123;120;P 61;442;GQNN;Nouakchott;;Mauritania;1;18-06N;015-57W;18-06N;015-57W;2;3;P 61;450;GQND;Tidjikja;;Mauritania;1;18-34N;011-26W;;;396;402;P 61;461;GQNB;Boutilimit;;Mauritania;1;17-32N;014-41W;;;77;75;P 61;470;----;Aleg;;Mauritania;1;17-03N;012-55W;;;45;; 61;489;GQNR;Rosso;;Mauritania;1;16-30N;015-49W;;;5;6;P 61;492;GQNK;Kaedi;;Mauritania;1;16-09N;013-31W;;;18;18; 61;497;GQNI;Nema;;Mauritania;1;16-36N;007-16W;16-36N;007-16W;269;269;P 61;498;GQNF;Kiffa;;Mauritania;1;16-38N;011-24W;16-38N;011-24W;115;115;P 61;499;GQNA;Aioun El Atrouss;;Mauritania;1;16-42N;009-36W;16-42N;009-36W;223;223;P 61;510;----;Selibaby;;Mauritania;1;15-14N;012-10W;;;60;; 61;520;----;Bassikounou;;Mauritania;1;15-52N;005-56W;;;261;; 61;600;GOSS;Saint-Louis;;Senegal;1;16-03N;016-27W;16-03N;016-27W;4;4;P 61;612;GOSP;Podor;;Senegal;1;16-39N;014-58W;;;6;7;P 61;627;GOOG;Linguere;;Senegal;1;15-23N;015-07W;;;20;21;P 61;630;GOSM;Matam;;Senegal;1;15-39N;013-15W;;;15;17;P 61;641;GOOY;Dakar / Yoff;;Senegal;1;14-44N;017-30W;14-44N;017-30W;27;24;P 61;666;GOOD;Diourbel;;Senegal;1;14-39N;016-14W;;;7;9;P 61;679;GOOK;Kaolack;;Senegal;1;14-08N;016-04W;;;6;7;P 61;687;GOTT;Tambacounda;;Senegal;1;13-46N;013-41W;13-46N;013-41W;49;50;P 61;695;GOGG;Ziguinchor;;Senegal;1;12-33N;016-16W;12-33N;016-16W;26;23;P 61;697;GOGS;Cap-Skirring;;Senegal;1;12-24N;016-45W;;;16;13; 61;698;GOGK;Kolda;;Senegal;1;12-53N;014-58W;;;10;10;P 61;699;GOTK;Kedougou;;Senegal;1;12-34N;012-13W;;;178;167;P 61;701;GBYD;Banjul / Yundum;;Gambia, The;1;13-21N;016-48W;13-21N;016-48W;36;36;P 61;705;----;Sibanor;;Gambia, The;1;13-13N;016-12W;;;;; 61;707;----;Jenoi;;Gambia, The;1;13-29N;015-34W;;;11;11; 61;711;----;Banjul / Half-Die;;Gambia, The;1;13-27N;016-27W;;;1;2; 61;712;----;Kerewan;;Gambia, The;1;13-29N;016-11W;;;15;15; 61;717;----;Kaur;;Gambia, The;1;13-43N;015-15W;;;6;6; 61;720;----;Kuntaur;;Gambia, The;1;13-40N;014-53W;;;4;; 61;721;----;Georgetown;;Gambia, The;1;13-32N;014-46W;;;1;1; 61;722;----;Sapu;;Gambia, The;1;13-34N;015-56W;;;2;2; 61;731;----;Basse;;Gambia, The;1;13-19N;014-13W;;;4;4; 61;733;----;Fatoto;;Gambia, The;1;13-53N;013-24W;;;15;; 61;766;GGOV;Bissau Aeroport ;;Guinea-Bissau;1;11-53N;015-39W;11-53N;015-39W;39;36; 61;769;----;Bolama;;Guinea-Bissau;1;11-35N;015-29W;;;18;20; 61;781;GGBF;Bafata;;Guinea-Bissau;1;12-10N;014-40W;;;42;43; 61;797;----;Cacine;;Guinea-Bissau;1;11-08N;015-01W;;;6;; 61;809;GULB;Labe;;Guinea;1;11-19N;012-18W;11-19N;012-18W;1025;1026; 61;811;GUSI;Siguiri;;Guinea;1;11-26N;009-10W;;;362;366; 61;816;GUOK;Boke;;Guinea;1;10-56N;014-19W;;;69;69; 61;818;GUID;Kindia;;Guinea;1;10-03N;012-52W;;;458;459; 61;820;----;Mamou;;Guinea;1;10-22N;012-05W;;;783;784; 61;829;GUXD;Kankan;;Guinea;1;10-23N;009-18W;10-23N;009-18W;377;384; 61;831;----;Conakry;;Guinea;1;09-34N;013-37W;09-34N;013-37W;48;49; 61;832;GUCY;Conakry / Gbessia;;Guinea;1;09-34N;013-37W;09-34N;013-38W;26;26; 61;833;GUFH;Faranah / Badala;;Guinea;1;10-02N;010-45W;;;458;459; 61;834;GUKU;Kissidougou;;Guinea;1;09-11N;010-06W;;;525;525; 61;847;GUMA;Macenta;;Guinea;1;08-32N;009-28W;;;543;544; 61;849;GUNZ;N'Zerekore;;Guinea;1;07-44N;008-50W;;;470;470; 61;856;GFLL;Lungi;;Sierra Leone;1;08-37N;013-12W;08-37N;013-12W;25;27;P 61;866;----;Bonthe;;Sierra Leone;1;07-32N;012-30W;;;7;8;P 61;873;----;Makeni;;Sierra Leone;1;08-33N;012-03W;;;;84; 61;877;----;Yele;;Sierra Leone;1;08-25N;011-50W;;;67;68; 61;878;----;Njala;;Sierra Leone;1;08-06N;012-06W;;;54;56; 61;881;----;Bo;;Sierra Leone;1;07-57N;011-46W;;;100;93;P 61;886;----;Kabala;;Sierra Leone;1;09-35N;011-33W;;;463;464;P 61;891;----;Daru;;Sierra Leone;1;07-59N;010-51W;;;185;186;P 61;892;----;Sefadu;;Sierra Leone;1;08-39N;010-58W;;;389;390; 61;901;----;Saint Helena Island;;United Kingdom;1;15-56S;005-04W;15-58S;005-42W;435;436;P 61;902;FHAW;Wide Awake Field Ascension Island ;;Saint Helena;1;07-58S;014-24W;07-58S;014-24W;86;79;P 61;931;FPST;S. Tome;;Sao Tome and Principe;1;00-23N;006-43E;00-23N;006-43E;8;13;P 61;934;FPPR;Principe;;Sao Tome and Principe;1;01-39N;007-25E;;;3;5;P 61;967;FJDG;NSF DIEGO GARCIA;IO;British Indian Ocean Territory;1;7-18S;72-24E;07-18S;072-24E;3;3; 61;968;----;Iles Glorieuses;;Reunion;1;11-35S;047-17E;11-33S;047-17E;3;4;P 61;970;----;Ile Juan De Nova;;Reunion;1;17-03S;042-42E;17-03S;042-43E;9;10;P 61;972;----;Ile Europa;;Reunion;1;22-19S;040-20E;22-21S;040-21E;12;13;P 61;974;----;Agalega;;Mauritius;1;10-26S;056-45E;10-26S;056-45E;2;3;P 61;976;----;Serge-Frolow Ile Tromelin ;;Reunion;1;15-53S;054-31E;15-53S;054-31E;7;13;P 61;980;FMEE;Saint-Denis / Gillot;;Reunion;1;20-53S;055-31E;20-53S;055-31E;21;25;P 61;981;----;Le Port Reunion ;;Reunion;1;20-56S;055-17E;;;10;11;P 61;984;FMEP;Saint-Pierre;;Reunion;1;21-20S;055-29E;21-20S;055-29E;52;53;P 61;986;----;Saint Brandon Saint Raphael ;;Mauritius;1;16-27S;059-37E;16-27S;059-37E;2;4;P 61;988;FIMR;Rodrigues;;Mauritius;1;19-41S;063-25E;19-41S;063-25E;58;59;P 61;990;FIMP;Plaisance Mauritius ;;Mauritius;1;20-26S;057-40E;;;55;57;P 61;995;----;Vacoas Mauritius ;;Mauritius;1;20-18S;057-30E;20-18S;057-30E;423;425; 61;996;----;Martin De Vivies Ile Amsterdam ;;French Southern Territories;1;37-48S;077-32E;37-48S;077-32E;27;29;P 61;997;----;Alfred Faure Iles Crozet ;;French Southern Territories;1;46-26S;051-52E;46-26S;051-52E;143;142; 61;998;----;Port-Aux-Francais Iles Kerguelen ;;French Southern Territories;1;49-21S;070-15E;49-21S;070-15E;29;30;P 62;002;----;Nalut;;Libya;1;31-52N;010-59E;31-52N;010-59E;620;621;P 62;007;----;Zuara;;Libya;1;32-53N;012-05E;32-53N;012-05E;3;3;P 62;008;----;Yefren;;Libya;1;32-05N;012-33E;32-04N;012-32E;691;691;P 62;010;HLLT;Tripoli Inter-National Airport;;Libya;1;32-40N;013-09E;32-41N;013-10E;80;82;P 62;012;----;El Khoms;;Libya;1;32-38N;014-18E;;;21;22;P 62;016;----;Misurata;;Libya;1;32-25N;015-03E;32-25N;015-06E;32;32;P 62;019;----;Sirte;;Libya;1;31-12N;016-35E;31-12N;016-35E;13;14;P 62;053;HLLB;Benina;;Libya;1;32-06N;020-16E;32-05N;020-16E;131;132;P 62;055;----;Agedabia;;Libya;1;30-43N;020-10E;30-43N;020-10E;6;7;P 62;056;----;Shahat;;Libya;1;32-49N;021-51E;32-49N;021-51E;625;625;P 62;059;----;Derna;;Libya;1;32-47N;022-35E;32-44N;022-38E;26;26;P 62;062;----;Tobruk;;Libya;1;32-06N;023-56E;32-05N;023-55E;50;51;P 62;103;HLTD;Ghadames;;Libya;1;30-08N;009-30E;30-08N;009-30E;346;347;P 62;120;----;Gariat El-Sharghia;;Libya;1;30-23N;013-35E;30-23N;013-35E;496;497;P 62;124;HLLS;Sebha;;Libya;1;27-01N;014-27E;27-01N;014-26E;435;432;P 62;131;----;Hon;;Libya;1;29-07N;015-57E;29-08N;015-57E;267;267;P 62;161;----;Jalo;;Libya;1;29-02N;021-34E;29-02N;021-34E;59;60;P 62;176;----;Giarabub;;Libya;1;29-45N;024-32E;29-45N;024-32E;-2;-1;P 62;200;----;Obari;;Libya;1;26-36N;012-47E;;;463;463;P 62;212;HLGT;Ghat;;Libya;1;25-08N;010-09E;25-08N;010-08E;699;693;P 62;259;----;Tazerbo;;Libya;1;25-48N;021-08E;25-43N;021-08E;260;261;P 62;271;HLKF;Kufra;;Libya;1;24-13N;023-18E;24-13N;023-18E;417;436;P 62;300;----;Salloum;;Egypt;1;31-32N;025-11E;31-32N;025-11E;6;4; 62;301;----;Sidi Barrani;;Egypt;1;31-37N;025-54E;31-37N;025-54E;24;24; 62;305;----;Sallum Plateau;;Egypt;1;31-34N;025-08E;31-32N;025-11E;180;6; 62;306;HEMM;Mersa Matruh;;Egypt;1;31-20N;027-13E;31-20N;027-13E;25;30; 62;309;----;Dabaa;;Egypt;1;30-56N;028-28E;;;17;18; 62;315;----;Port Alexandria;;Egypt;1;31-11N;029-52E;;;17;14; 62;318;HEAX;Alexandria / Nouzha;;Egypt;1;31-12N;029-57E;31-12N;029-57E;-2;7;P 62;324;----;Rosetta;;Egypt;1;31-24N;030-24E;;;2;3; 62;325;----;Baltim;;Egypt;1;31-33N;031-06E;;;1;2; 62;330;----;Damietta;;Egypt;1;31-25N;031-49E;;;2;5; 62;332;----;Port Said / El Gamil;;Egypt;1;31-17N;032-14E;31-17N;032-14E;3;6;P 62;333;HEPS;Port Said;;Egypt;1;31-16N;032-18E;31-16N;032-14E;6;6; 62;335;----;Rafh;;Egypt;1;31-12N;034-12E;;;;; 62;336;----;El Arish;;Egypt;1;31-05N;033-49E;;;;; 62;337;HEAR;El Arish;;Egypt;1;31-05N;033-49E;31-05N;033-50E;31;32; 62;338;----;Ghazza;;Egypt;1;31-30N;034-27E;31-30N;034-27E;10;16;P 62;339;----;Damanhour;;Egypt;1;31-02N;030-28E;;;2;; 62;345;----;Tahrir;;Egypt;1;30-39N;030-42E;;;16;; 62;354;----;Zagazig;;Egypt;1;30-35N;031-30E;;;8;13; 62;357;----;Wadi El Natroon;;Egypt;1;30-24N;030-12E;;;49;1; 62;360;----;Shebin El Kom;;Egypt;1;30-36N;031-01E;;;12;; 62;366;HECA;Cairo Airport;;Egypt;1;30-08N;031-24E;;;64;74;P 62;369;----;Bahtim;;Egypt;1;30-08N;031-15E;;;17;; 62;371;----;Cairo H. Q.;;Egypt;1;30-05N;031-17E;;;34;26; 62;373;----;Embaba;;Egypt;1;30-04N;031-11E;;;18;19; 62;375;----;Giza;;Egypt;1;30-03N;031-13E;;;19;; 62;378;----;Helwan;;Egypt;1;29-52N;031-20E;29-52N;031-20E;139;141;P 62;381;----;Fayoum;;Egypt;1;29-18N;030-51E;;;23;; 62;387;----;Minya;;Egypt;1;28-05N;030-44E;28-05N;030-44E;37;40;P 62;389;----;Malwy;;Egypt;1;30-45N;027-42E;;;;44; 62;392;----;Asyut;;Egypt;1;27-12N;031-10E;;;52;; 62;393;HEAT;Asyut;;Egypt;1;27-03N;031-01E;27-11N;031-06E;226;70;P 62;397;----;Sohag;;Egypt;1;26-34N;031-42E;;;61;; 62;402;----;Kena;;Egypt;1;26-11N;032-44E;;;78;77; 62;405;HELX;Luxor;;Egypt;1;25-40N;032-42E;25-40N;032-42E;93;99;P 62;408;----;Edfou;;Egypt;1;24-59N;032-49E;;;88;89; 62;411;----;Kawm Umbu;;Egypt;1;24-29N;032-57E;;;102;; 62;414;HESN;Asswan;;Egypt;1;23-58N;032-47E;23-58N;032-47E;200;194;P 62;416;----;Siwa;;Egypt;1;29-15N;025-31E;29-15N;025-31E;3;3; 62;417;----;Siwa;;Egypt;1;29-12N;025-19E;29-12N;025-29E;-15;-13;P 62;419;----;Abu Simbel;;Egypt;1;22-22N;031-37E;;;188;192; 62;420;----;Baharia;;Egypt;1;28-20N;028-54E;28-20N;028-54E;127;130;P 62;423;----;Farafra;;Egypt;1;27-03N;027-58E;27-03N;027-28E;82;92; 62;425;----;Shark-El-Ouinat;;Egypt;1;22-28N;028-42E;;;274;275; 62;432;----;Dakela;;Egypt;1;25-29N;029-00E;25-29N;029-00E;106;111;P 62;435;----;Kharga;;Egypt;1;25-27N;030-32E;25-27N;030-32E;78;73;P 62;440;----;Ismailia;;Egypt;1;30-36N;032-15E;;;12;13;P 62;450;----;El-Suez;;Egypt;1;29-52N;032-28E;;;3;4; 62;454;----;Bear El Abd;;Egypt;1;30-58N;032-46E;;;17;24; 62;455;----;Ras Sedr;;Egypt;1;29-35N;032-43E;;;3;16; 62;456;----;Taba Airport;;Egypt;1;29-36N;034-47E;;;749;749; 62;459;HETR;El Tor;;Egypt;1;28-14N;032-37E;28-14N;033-37E;21;14;P 62;460;----;Sharm El Sheikh;;Egypt;1;27-58N;034-23E;;;49;51; 62;463;HEGN;Hurguada;;Egypt;1;27-09N;033-43E;27-09N;033-43E;16;14; 62;464;----;Hurguada;;Egypt;1;27-17N;033-44E;;;7;7; 62;465;----;Kosseir;;Egypt;1;26-08N;034-13E;26-06N;034-17E;9;11;P 62;600;HSSW;Wadi Halfa;;Sudan;1;21-49N;031-29E;21-48N;031-31E;183;183;P 62;615;----;Halaib;;Sudan;1;22-13N;036-39E;;;2;2;P 62;635;----;Arbaat;;Sudan;1;19-50N;036-58E;;;;120; 62;640;----;Abu Hamed;;Sudan;1;19-32N;033-19E;19-32N;033-19E;312;312;P 62;641;HSSP;Port Sudan;;Sudan;1;19-35N;037-13E;19-35N;037-13E;3;2;P 62;650;HSDN;Dongola;;Sudan;1;19-10N;030-29E;19-10N;030-29E;226;226;P 62;652;----;Suakin;;Sudan;1;19-06N;037-20E;;;;3;P 62;660;----;Karima;;Sudan;1;18-33N;031-51E;18-33N;031-51E;249;249;P 62;671;----;Tokar;;Sudan;1;18-26N;037-44E;;;19;19; 62;675;----;Aqiq;;Sudan;1;18-14N;038-11E;;;2;2;P 62;680;HSAT;Atbara;;Sudan;1;17-42N;033-58E;17-42N;033-58E;347;345;P 62;682;----;Hudeiba;;Sudan;1;17-34N;033-56E;;;;350; 62;700;----;Shendi;;Sudan;1;16-42N;033-26E;;;360;360;P 62;721;HSSS;Khartoum;;Sudan;1;15-36N;032-33E;15-36N;032-33E;382;380;P 62;722;----;Aroma;;Sudan;1;15-50N;036-09E;;;430;431; 62;723;----;Shambat Observatory;;Sudan;1;15-40N;032-32E;;;;380; 62;730;HSKA;Kassala;;Sudan;1;15-28N;036-24E;15-28N;036-24E;500;500;P 62;733;----;Halfa El Gedida;;Sudan;1;15-19N;035-36E;;;451;451; 62;750;----;Ed Dueim;;Sudan;1;14-00N;032-20E;;;378;378;P 62;751;----;Wad Medani;;Sudan;1;14-24N;033-29E;14-24N;033-29E;408;408;P 62;752;HSGF;Gedaref;;Sudan;1;14-02N;035-24E;14-02N;035-24E;599;599;P 62;760;HSFS;El Fasher;;Sudan;1;13-37N;025-20E;13-37N;025-20E;733;730;P 62;762;HSNR;Sennar;;Sudan;1;13-33N;033-37E;;;418;418;P 62;770;HSGN;Geneina;;Sudan;1;13-29N;022-27E;13-29N;022-27E;805;805;P 62;771;HSOB;El Obeid;;Sudan;1;13-10N;030-14E;13-10N;030-14E;574;574;P 62;772;HSKI;Kosti;;Sudan;1;13-10N;032-40E;13-10N;032-40E;381;381;P 62;774;----;Umm Benin;;Sudan;1;13-04N;033-57E;;;;435; 62;781;----;En Nahud;;Sudan;1;12-42N;028-26E;12-42N;028-26E;56;564;P 62;790;HSNL;Nyala;;Sudan;1;12-03N;024-53E;;;67;674;P 62;795;----;Abu Na'Ama;;Sudan;1;12-44N;034-08E;12-44N;034-08E;445;445;P 62;801;HSRN;Renk;;Sudan;1;11-45N;032-47E;;;282;282; 62;803;----;Rashad;;Sudan;1;11-52N;031-03E;;;884;885;P 62;805;HSDZ;Damazine;;Sudan;1;11-47N;034-23E;11-47N;034-23E;474;470;P 62;809;----;Babanusa;;Sudan;1;11-20N;027-49E;;;453;453;P 62;810;HSLI;Kadugli;;Sudan;1;11-00N;029-43E;;;499;499;P 62;840;HSSM;Malakal;;Sudan;1;09-33N;031-39E;09-33N;031-39E;387;388;P 62;871;----;Raga;;Sudan;1;08-28N;025-41E;;;545;545; 62;880;----;Wau;;Sudan;1;07-42N;028-01E;;;438;438;P 62;941;HSSJ;Juba;;Sudan;1;04-52N;031-36E;04-52N;031-36E;460;457;P 63;006;----;Nacfa;;Ethiopia;1;16-40N;038-20E;;;1676;1676;P 63;021;HHAS;Asmara;;Ethiopia;1;15-17N;038-55E;15-17N;038-55E;2356;2325;P 63;023;HAMS;Massawa;;Ethiopia;1;15-37N;039-27E;;;10;10;P 63;043;HASB;Assab;;Ethiopia;1;13-04N;042-43E;;;14;14;P 63;125;HFFF;Djibouti;;Djibouti;1;11-33N;043-09E;11-33N;043-09E;13;19;P 63;145;----;Oboleh;;Djibouti;1;11-10N;042-43E;;;777;; 63;150;----;Borama;;Somalia;1;09-57N;043-11E;;;1454;1454;P 63;160;HCMI;Berbera;;Somalia;1;10-25N;045-01E;;;9;; 63;170;HCMH;Hargeisa;;Somalia;1;09-30N;044-05E;;;1326;; 63;175;HCMV;Burao;;Somalia;1;09-30N;045-34E;;;1032;; 63;180;----;Erigavo;;Somalia;1;10-38N;047-22E;;;;1743;P 63;190;----;Las-Anod;;Somalia;1;08-30N;047-22E;;;;700;P 63;200;----;Alula;;Somalia;1;11-57N;050-44E;;;;2;P 63;210;----;Bosaso;;Somalia;1;11-17N;049-11E;;;;2;P 63;220;----;Scusciuban;;Somalia;1;10-18N;050-14E;;;;344;P 63;225;----;Gardo;;Somalia;1;09-31N;049-05E;;;;812;P 63;227;----;Garoe;;Somalia;1;07-57N;048-30E;;;;; 63;228;----;Eil;;Somalia;1;07-57N;049-47E;;;;; 63;230;----;Galcayo;;Somalia;1;06-51N;047-16E;;;;302;P 63;235;----;Obbia;;Somalia;1;05-20N;048-34E;;;;10;P 63;237;----;El Bur;;Somalia;1;04-42N;046-37E;;;;175;P 63;240;HCMN;Belet Uen;;Somalia;1;04-42N;045-13E;;;173;173;P 63;245;----;Huddur;;Somalia;1;04-11N;043-52E;;;521;; 63;247;----;Iscia Baidoa;;Somalia;1;03-08N;043-40E;;;;487;P 63;248;----;Lug-Ganane;;Somalia;1;03-35N;042-27E;;;;; 63;250;----;Bardera;;Somalia;1;02-21N;042-18E;;;;116;P 63;260;HCMM;Mogadiscio;;Somalia;1;02-02N;045-21E;02-02N;045-21E;9;9;P 63;270;----;Chisimaio;;Somalia;1;00-22S;042-26E;;;;10;P 63;330;HAMK;Makale;;Ethiopia;1;13-30N;039-29E;;;2212;2212;P 63;331;HAGN;Gondar;;Ethiopia;1;12-32N;037-26E;;;1985;1966;P 63;332;HABD;Bahar Dar;;Ethiopia;1;11-36N;037-24E;;;1820;1805;P 63;333;HADC;Combolcha;;Ethiopia;1;11-05N;039-43E;;;1864;1916;P 63;334;HADM;Debremarcos;;Ethiopia;1;10-21N;037-43E;;;2476;2440;P 63;340;----;Lekemti;;Ethiopia;1;09-03N;036-36E;;;1950;1950; 63;402;HAJM;Jimma;;Ethiopia;1;07-40N;036-50E;;;1676;1577;P 63;403;HAGR;Gore;;Ethiopia;1;08-10N;035-33E;;;1974;1974;P 63;450;HAAB;Addis Ababa;;Ethiopia;1;08-59N;038-48E;08-59N;038-48E;2355;2324;P 63;451;HAHM;Harar Meda;;Ethiopia;1;08-44N;039-00E;08-44N;039-00E;1876;1876;P 63;453;----;Metehara;;Ethiopia;1;08-50N;039-47E;;;1062;1062; 63;460;HALA;Awassa;;Ethiopia;1;07-04N;038-30E;;;1652;1652;P 63;471;HADR;Dire Dawa;;Ethiopia;1;09-36N;041-52E;;;1146;1146;P 63;473;HAJJ;Jiggiga;;Ethiopia;1;09-20N;042-43E;;;1644;1644;P 63;474;----;Robe;;Ethiopia;1;07-06N;040-00E;;;2450;2450;P 63;478;HAGO;Gode;;Ethiopia;1;05-06N;044-35E;05-06N;044-35E;320;320;P 63;500;HAAM;Arba Minch;;Ethiopia;1;06-04N;037-40E;;;1219;; 63;533;HANG;Neghelli;;Ethiopia;1;05-17N;039-45E;05-17N;039-45E;1455;1455;P 63;602;HUAR;Arua;;Uganda;1;03-03N;030-55E;03-03N;030-55E;1204;1211;P 63;612;HKLO;Lodwar;;Kenya;1;03-07N;035-37E;03-07N;035-37E;506;515;P 63;619;HKMY;Moyale;;Kenya;1;03-32N;039-03E;03-32N;039-03E;1097;1097;P 63;624;HKMA;Mandera;;Kenya;1;03-56N;041-52E;03-56N;041-52E;230;231;P 63;628;----;Paraa;;Uganda;1;02-18N;031-35E;;;693;;P 63;630;HUGU;Gulu;;Uganda;1;02-45N;032-20E;02-45N;032-20E;1104;1105;P 63;641;HKMB;Marsabit;;Kenya;1;02-18N;037-54E;02-18N;037-54E;1219;1345;P 63;654;HUMI;Masindi;;Uganda;1;01-41N;031-43E;01-41N;031-43E;1146;1147;P 63;658;HUSO;Soroti;;Uganda;1;01-43N;033-37E;01-43N;033-37E;1132;1123;P 63;661;HKKT;Kitale;;Kenya;1;01-01N;035-00E;01-01N;035-00E;1890;1875;P 63;671;HKWJ;Wajir;;Kenya;1;01-45N;040-04E;01-45N;040-04E;244;244;P 63;674;HUKS;Kasese;;Uganda;1;00-11N;030-06E;00-11N;030-06E;959;961;P 63;680;----;Kampala;;Uganda;1;00-19N;032-37E;;;1144;1140;P 63;682;HUJI;Jinja;;Uganda;1;00-27N;033-11E;;;1175;1173;P 63;684;HUTO;Tororo;;Uganda;1;00-41N;034-10E;00-41N;034-10E;1170;1171;P 63;686;HKEL;Eldoret;;Kenya;1;00-32N;035-17E;00-32N;035-17E;2120;2133;P 63;687;HKKG;Kakamega;;Kenya;1;00-17N;034-47E;;;1530;; 63;695;HKME;Meru;;Kenya;1;00-05N;037-39E;00-05N;037-39E;1554;1554;P 63;702;HUMA;Mbarara;;Uganda;1;00-37S;030-39E;00-37S;030-39E;1412;1413;P 63;705;HUEN;Entebbe Airport;;Uganda;1;00-03N;032-27E;00-03N;032-27E;1155;1155;P 63;708;HKKI;Kisumu;;Kenya;1;00-06S;034-45E;00-06S;034-45E;1157;1146;P 63;709;HKKS;Kisii;;Kenya;1;00-40S;034-47E;;;1493;; 63;710;HKKR;Kericho;;Kenya;1;00-22S;035-21E;00-22S;035-21E;2184;2184;P 63;714;HKNK;Nakuru;;Kenya;1;00-16S;036-06E;00-16S;036-04E;1901;1901;P 63;717;HKNI;Nyeri;;Kenya;1;00-30S;036-58E;00-30S;036-58E;1759;1759;P 63;720;HKEM;Embu;;Kenya;1;00-30S;037-27E;00-30S;037-27E;1493;1493;P 63;723;HKGA;Garissa;;Kenya;1;00-28S;039-38E;00-28S;039-38E;138;147;P 63;726;HUKB;Kabale;;Uganda;1;01-15S;029-59E;01-15S;029-59E;1867;1869;P 63;729;HTBU;Bukoba;;Tanzania;1;01-20S;031-49E;01-20S;031-49E;1137;1137;P 63;733;HTMU;Musoma;;Tanzania;1;01-30S;033-48E;;;1147;1147;P 63;737;HKNO;Narok;;Kenya;1;01-08S;035-50E;01-06S;035-50E;1890;1890;P 63;740;HKNA;Nairobi ACC/FIC/RCC/MET/COM/;;Kenya;1;01-19S;036-56E;;;1624;; 63;741;HKNC;Nairobi / Dagoretti;;Kenya;1;01-18S;036-45E;01-18S;036-45E;1798;1798;P 63;742;HKNW;Nairobi / Wilson;;Kenya;1;01-19S;036-49E;;;1683;1679;P 63;756;HTMW;Mwanza;;Tanzania;1;02-28S;032-55E;02-28S;032-55E;1139;1140;P 63;766;HKMU;Makindu;;Kenya;1;02-17S;037-50E;02-17S;037-50E;1000;1000;P 63;772;HKLU;Lamu;;Kenya;1;02-16S;040-50E;;;6;;P 63;789;HTAR;Arusha;;Tanzania;1;03-20S;036-37E;03-20S;036-37E;1387;1387;P 63;790;HTMS;Moshi;;Tanzania;1;03-21S;037-20E;;;854;831;P 63;791;HTKJ;Kilimanjaro Airport;;Tanzania;1;03-25S;037-04E;03-25S;037-04E;891;896;P 63;793;HKVO;Voi;;Kenya;1;03-24S;038-34E;03-24S;038-34E;579;579;P 63;799;HKML;Malindi;;Kenya;1;03-14S;040-06E;03-14S;040-06E;20;23;P 63;801;HTKA;Kigoma;;Tanzania;1;04-53S;029-38E;04-53S;029-38E;882;885;P 63;816;HTSE;Same;;Tanzania;1;04-05S;037-43E;04-05S;037-43E;872;872;P 63;818;HTMO;Mombo;;Tanzania;1;04-53S;038-17E;04-55S;038-14E;511;411; 63;820;HKMO;Mombasa;;Kenya;1;04-02S;039-37E;04-02S;039-37E;57;55;P 63;832;HTTB;Tabora Airport;;Tanzania;1;05-05S;032-50E;05-05S;032-50E;1181;1190;P 63;844;HTTG;Tanga;;Tanzania;1;05-05S;039-04E;05-05S;039-04E;39;35;P 63;845;HTPE;Pemba / Karume Airport;;Tanzania;1;05-15S;039-49E;;;25;; 63;862;HTDO;Dodoma;;Tanzania;1;06-10S;035-46E;06-10S;035-46E;1119;1120;P 63;866;HTMG;Morogoro;;Tanzania;1;06-50S;037-39E;06-50S;037-39E;526;526;P 63;870;HTZA;Zanzibar / Kisauni;;Tanzania;1;06-13S;039-13E;;;15;15;P 63;887;HTIR;Iringa;;Tanzania;1;07-40S;035-45E;07-40S;035-45E;1426;1428;P 63;894;HTDA;Dar Es Salaam Airport;;Tanzania;1;06-52S;039-12E;06-52S;039-12E;55;55;P 63;895;----;Mafia / Kilindoni;;Tanzania;1;07-55S;039-40E;;;21;; 63;932;HTMB;Mbeya;;Tanzania;1;08-56S;033-28E;08-56S;033-28E;1704;1707;P 63;962;HTSO;Songea;;Tanzania;1;10-41S;035-35E;10-41S;035-35E;1067;1067;P 63;969;HTNA;Nachingwea;;Tanzania;1;10-21S;038-45E;;;463;465; 63;971;HTMT;Mtwara;;Tanzania;1;10-16S;040-11E;10-16S;040-11E;113;113;P 63;980;FSIA;Seychelles Inter-National Airport;;Seychelles;1;04-40S;055-31E;04-40S;055-31E;3;3;P 63;985;FSSS;Seychelles International Airport Rawinsonde Station ;;Seychelles;1;04-41S;055-32E;04-41S;055-32E;4;4; 63;995;----;Aldabra;;Seychelles;1;09-21S;046-32E;;;4;4;P 64;005;FZEA;Mbandaka;;Congo, Democratic Republic of the;1;00-03N;018-16E;00-03N;018-16E;345;317;P 64;006;FZFK;Gemena;;Congo, Democratic Republic of the;1;03-17N;019-47E;;;475;446;P 64;008;----;Basankusu;;Congo, Democratic Republic of the;1;01-13N;019-48E;;;360;353;P 64;014;----;Lisala;;Congo, Democratic Republic of the;1;02-19N;021-34E;;;;463;P 64;015;----;Libenge;;Congo, Democratic Republic of the;1;03-38N;018-38E;;;380;359;P 64;016;----;Bumba;;Congo, Democratic Republic of the;1;02-11N;022-33E;;;;361;P 64;018;----;Basoko;;Congo, Democratic Republic of the;1;01-15N;023-36E;;;410;366;P 64;021;----;Bondo;;Congo, Democratic Republic of the;1;03-48N;023-49E;;;487;474;P 64;034;----;Buta;;Congo, Democratic Republic of the;1;02-47N;024-47E;02-47N;024-47E;410;410;P 64;040;FZIA;Kisangani;;Congo, Democratic Republic of the;1;00-31N;025-11E;00-31N;025-11E;415;396;P 64;056;----;Bafwasende;;Congo, Democratic Republic of the;1;01-05N;027-08E;;;524;524;P 64;062;----;Isiro;;Congo, Democratic Republic of the;1;02-46N;027-39E;;;806;764;P 64;071;----;Mambasa;;Congo, Democratic Republic of the;1;01-22N;029-04E;;;900;855; 64;072;FZMB;Butembo;;Congo, Democratic Republic of the;1;00-08N;029-16E;;;1840;1840;P 64;074;----;Watsa;;Congo, Democratic Republic of the;1;03-04N;029-30E;;;985;1008;P 64;076;----;Bunia;;Congo, Democratic Republic of the;1;01-30N;030-13E;;;;1239;P 64;077;----;Bunia-Ruampara;;Congo, Democratic Republic of the;1;01-34N;030-13E;;;;1285; 64;101;----;Lukolela;;Congo, Democratic Republic of the;1;01-03S;017-12E;;;;318;P 64;108;FZBO;Bandundu;;Congo, Democratic Republic of the;1;03-18S;017-21E;;;324;324;P 64;115;FZBA;Inongo;;Congo, Democratic Republic of the;1;01-58S;018-16E;01-58S;018-16E;300;300;P 64;126;FZGN;Boende;;Congo, Democratic Republic of the;1;00-13S;020-51E;00-13S;020-51E;351;351;P 64;146;FZVA;Lodja;;Congo, Democratic Republic of the;1;03-29S;023-28E;;;479;500;P 64;155;FZOA;Kindu;;Congo, Democratic Republic of the;1;02-57S;025-55E;02-57S;025-55E;497;497;P 64;156;----;Kalima;;Congo, Democratic Republic of the;1;02-36S;026-33E;;;545;569;P 64;157;FZNC;Rutshuru;;Congo, Democratic Republic of the;1;01-11S;029-27E;;;1275;1275;P 64;159;----;Ubundu;;Congo, Democratic Republic of the;1;00-21S;025-27E;;;;423;P 64;170;----;Walikale;;Congo, Democratic Republic of the;1;01-25S;027-00E;;;;800;P 64;180;----;Bukavu;;Congo, Democratic Republic of the;1;02-31S;028-51E;;;;1612;P 64;184;FZNA;Goma;;Congo, Democratic Republic of the;1;01-41S;029-14E;;;1552;1552;P 64;201;FZAG;Moanda;;Congo, Democratic Republic of the;1;06-00S;012-25E;;;27;27;P 64;203;----;Kitona;;Congo, Democratic Republic of the;1;05-55S;012-27E;;;122;120;P 64;204;----;Boma;;Congo, Democratic Republic of the;1;05-51S;013-06E;;;22;8;P 64;206;FZAN;Inga;;Congo, Democratic Republic of the;1;05-31S;013-35E;;;277;277;P 64;207;FZAM;Matadi;;Congo, Democratic Republic of the;1;05-48S;013-26E;05-48S;013-26E;355;340;P 64;209;----;Luozi;;Congo, Democratic Republic of the;1;04-57S;014-08E;;;;236;P 64;210;FZAA;Kinshasa / N'Djili;;Congo, Democratic Republic of the;1;04-23S;015-26E;04-23S;015-26E;309;312;P 64;211;----;Kinshasa / N'Dolo;;Congo, Democratic Republic of the;1;04-19S;015-19E;;;;282;P 64;217;FZCS;Kenge;;Congo, Democratic Republic of the;1;04-55S;017-04E;;;563;563;P 64;220;----;Kinshasa / Binza;;Congo, Democratic Republic of the;1;04-22S;015-15E;;;;445; 64;222;FZCA;Kikwit;;Congo, Democratic Republic of the;1;05-02S;018-48E;05-02S;018-48E;518;449;P 64;224;FZVS;Ilebo;;Congo, Democratic Republic of the;1;04-20S;020-35E;;;465;420;P 64;228;FZUK;Tshikapa;;Congo, Democratic Republic of the;1;06-25S;020-51E;;;521;481;P 64;235;FZUA;Kananga;;Congo, Democratic Republic of the;1;05-53S;022-25E;;;654;657;P 64;246;FZVI;Lusambo;;Congo, Democratic Republic of the;1;04-58S;023-26E;;;424;424;P 64;247;FZWA;Mbuji-Mayi;;Congo, Democratic Republic of the;1;06-10S;023-37E;;;633;677;P 64;248;----;Luputa;;Congo, Democratic Republic of the;1;07-08S;023-44E;;;880;877;P 64;264;----;Kasongo;;Congo, Democratic Republic of the;1;04-31S;026-35E;;;544;544;P 64;276;FZRQ;Kongolo;;Congo, Democratic Republic of the;1;05-21S;027-00E;;;561;561; 64;282;FZRA;Manono;;Congo, Democratic Republic of the;1;07-17S;027-26E;07-17S;027-26E;614;633;P 64;285;FZRF;Kalemie;;Congo, Democratic Republic of the;1;05-53S;029-11E;05-52S;029-11E;790;818;P 64;301;----;Dilolo;;Congo, Democratic Republic of the;1;10-41S;022-20E;;;;1028; 64;303;----;Sandoa;;Congo, Democratic Republic of the;1;09-38S;022-51E;;;;921; 64;315;FZSA;Kamina / Base;;Congo, Democratic Republic of the;1;08-38S;025-15E;08-38S;025-15E;1088;1106;P 64;328;FZQM;Kolwezi;;Congo, Democratic Republic of the;1;10-43S;025-27E;;;1405;1526;P 64;348;----;Mitwaba;;Congo, Democratic Republic of the;1;08-36S;027-20E;;;;1579; 64;360;FZQA;Lubumbashi-Luano;;Congo, Democratic Republic of the;1;11-40S;027-29E;;;1276;1298;P 64;370;----;Lubumbashi-Karavia;;Congo, Democratic Republic of the;1;11-39S;027-28E;;;;1260; 64;380;----;Kamembe;;Rwanda;1;02-28S;028-55E;;;1591;1591;P 64;381;HRYG;Gisenyi;;Rwanda;1;01-40S;029-15E;;;1556;1554;P 64;383;----;Ruhengeri;;Rwanda;1;01-30S;029-38E;;;1878;1860;P 64;384;----;Butare;;Rwanda;1;02-36S;029-44E;;;1779;1768;P 64;387;HRYR;Kigali;;Rwanda;1;01-58S;030-07E;01-58S;030-07E;1491;1497;P 64;390;HBBA;Bujumbura;;Burundi;1;03-19S;029-19E;03-19S;029-19E;782;783;P 64;397;----;Muyinga;;Burundi;1;02-50S;030-20E;;;1755;1755;P 64;400;FCPP;Pointe-Noire;;Congo, Republic of the;1;04-49S;011-54E;04-49S;011-54E;17;17;P 64;401;FCPL;Loubomo;;Congo, Republic of the;1;04-12S;012-42E;04-13S;012-40E;329;330;P 64;402;FCBM;Mouyondzi;;Congo, Republic of the;1;03-59S;013-55E;;;509;512;P 64;403;FCPA;Makabana;;Congo, Republic of the;1;03-29S;012-37E;;;160;161;P 64;405;FCBS;Sibiti;;Congo, Republic of the;1;03-41S;013-21E;;;530;531;P 64;450;FCBB;Brazzaville / Maya-Maya;;Congo, Republic of the;1;04-15S;015-15E;04-15S;015-15E;319;316;P 64;451;----;Boulankio;;Congo, Republic of the;1;03-49S;015-15E;;;;750; 64;452;FCBO;M'Pouya;;Congo, Republic of the;1;02-37S;016-13E;;;311;312;P 64;453;FCBD;Djambala;;Congo, Republic of the;1;02-32S;014-46E;02-32S;014-46E;791;790;P 64;454;FCOG;Gamboma;;Congo, Republic of the;1;01-52S;015-52E;;;476;377;P 64;456;FCOM;Makoua;;Congo, Republic of the;1;00-01S;015-35E;00-01S;015-35E;394;379;P 64;458;FCOU;Ouesso;;Congo, Republic of the;1;01-37N;016-03E;01-37N;016-03E;352;352;P 64;459;FCOI;Impfondo;;Congo, Republic of the;1;01-37N;018-04E;01-37N;018-04E;335;326;P 64;460;FCOS;Souanke;;Congo, Republic of the;1;02-04N;014-08E;;;549;550;P 64;462;----;Kelle;;Congo, Republic of the;1;00-06N;013-33E;;;;408; 64;463;----;Ewo;;Congo, Republic of the;1;05-35S;014-49E;;;;438; 64;500;FOOL;Libreville;;Gabon;1;00-27N;009-25E;00-27N;009-25E;12;15;P 64;501;FOOG;Port-Gentil;;Gabon;1;00-42S;008-45E;00-42S;008-45E;3;4;P 64;503;FOOY;Mayumba;;Gabon;1;03-25S;010-39E;;;31;34;P 64;504;FOOC;Cocobeach;;Gabon;1;01-00N;009-36E;;;12;13;P 64;507;FOOT;Tchibanga;;Gabon;1;02-51S;011-01E;;;83;79;P 64;510;FOOB;Bitam;;Gabon;1;02-05N;011-29E;02-05N;011-29E;600;599;P 64;545;FOOE;Mekambo;;Gabon;1;01-01N;013-56E;;;499;501;P 64;550;FOGM;Mouila;;Gabon;1;01-52S;011-01E;;;88;89;P 64;551;FOGR;Lambarene;;Gabon;1;00-43S;010-14E;;;27;26;P 64;552;FOOM;Mitzic;;Gabon;1;00-47N;011-32E;;;583;583;P 64;556;FOOK;Makokou;;Gabon;1;00-34N;012-52E;;;509;515;P 64;560;FOOR;Lastoursville;;Gabon;1;00-50S;012-43E;;;483;485;P 64;565;FOOD;Moanda;;Gabon;1;01-32S;013-16E;01-32S;013-16E;572;573;P 64;600;FEFT;Berberati;;Central African Republic;1;04-15N;015-48E;04-13N;015-47E;582;583;P 64;601;FEFO;Bouar;;Central African Republic;1;05-58N;015-38E;05-58N;015-38E;1019;1020;P 64;605;FEFL;Bossembele;;Central African Republic;1;05-16N;017-38E;;;673;674;P 64;610;FEFS;Bossangoa;;Central African Republic;1;06-29N;017-26E;06-29N;017-26E;464;465;P 64;650;FEFF;Bangui;;Central African Republic;1;04-24N;018-31E;04-24N;018-31E;365;366;P 64;654;FEFN;N'Dele;;Central African Republic;1;08-24N;020-39E;08-24N;020-39E;510;511;P 64;655;FEFR;Bria;;Central African Republic;1;06-32N;021-59E;;;583;584;P 64;656;FEFG;Bangassou;;Central African Republic;1;04-44N;022-50E;04-44N;022-50E;499;500;P 64;658;FEFI;Birao;;Central African Republic;1;10-17N;022-47E;;;463;464;P 64;659;FEFB;Obo;;Central African Republic;1;05-24N;026-30E;;;650;651;P 64;660;FEFM;Bambari;;Central African Republic;1;05-51N;020-39E;;;474;475;P 64;661;FEFY;Yalinga;;Central African Republic;1;06-30N;023-16E;;;601;602;P 64;662;FEFA;Alindao;;Central African Republic;1;05-03N;021-12E;;;447;449;P 64;665;----;Mobaye;;Central African Republic;1;04-19N;021-11E;04-19N;021-11E;405;406; 64;700;FTTJ;Ndjamena;;Chad;1;12-08N;015-02E;12-08N;015-02E;295;295;P 64;701;----;Mao;;Chad;1;14-07N;015-19E;;;355;;P 64;702;FTTL;Bol-Berim;;Chad;1;13-26N;014-44E;;;291;292;P 64;705;----;Bousso;;Chad;1;10-29N;016-43E;;;334;336;P 64;706;FTTD;Moundou;;Chad;1;08-37N;016-04E;;;428;422;P 64;707;----;Moussoro;;Chad;1;13-39N;016-30E;;;301;; 64;708;FTTK;Bokoro;;Chad;1;12-23N;017-03E;;;300;301;P 64;709;FTTP;Pala;;Chad;1;09-22N;014-55E;;;467;455;P 64;750;FTTA;Sarh;;Chad;1;09-09N;018-23E;09-09N;018-23E;365;365;P 64;751;----;Ati;;Chad;1;13-13N;018-19E;;;333;334;P 64;753;FTTY;Faya;;Chad;1;18-00N;019-10E;18-00N;019-10E;235;234;P 64;754;FTTN;Am-Timan;;Chad;1;11-02N;020-17E;;;433;436;P 64;755;----;Goz-Beida;;Chad;1;12-14N;021-25E;;;557;; 64;756;FTTC;Abeche;;Chad;1;13-51N;020-51E;13-51N;020-51E;545;549;P 64;757;----;Fada;;Chad;1;17-10N;021-33E;;;540;; 64;758;----;Mongo;;Chad;1;12-11N;018-41E;;;427;428;P 64;810;FGSL;Malabo/Fernando Poo;;Equatorial Guinea;1;03-45N;008-46E;;;56;; 64;820;----;Bata Rio Municipal ;;Equatorial Guinea;1;01-54N;009-48E;;;2;8; 64;851;FKKA;Maroua-Salak;;Cameroon;1;10-27N;014-15E;;;423;422;P 64;860;FKKR;Garoua;;Cameroon;1;09-20N;013-23E;09-20N;013-23E;242;244;P 64;870;FKKN;Ngaoundere;;Cameroon;1;07-21N;013-34E;07-21N;013-34E;1114;1104;P 64;880;FKAB;Banyo;;Cameroon;1;06-47N;011-49E;;;1110;; 64;882;FKAM;Meiganga;;Cameroon;1;06-32N;014-22E;;;1027;1027;P 64;890;FKKF;Mamfe;;Cameroon;1;05-43N;009-17E;;;126;; 64;892;FKKV;Bamenda ;;Cameroon;1;06-03N;010-07E;;;1239;; 64;893;FKKM;Koundja;;Cameroon;1;05-39N;010-45E;05-39N;010-45E;1208;1210;P 64;900;FKAY;Yoko;;Cameroon;1;05-33N;012-22E;05-33N;012-22E;1027;1031;P 64;901;FKAO;Betare-Oya;;Cameroon;1;05-36N;014-04E;;;815;804; 64;910;FKKD;Douala Obs.;;Cameroon;1;04-00N;009-44E;04-01N;009-42E;10;9;P 64;911;FKAN;Nkongsamba;;Cameroon;1;04-57N;009-56E;04-57N;009-56E;816;821;P 64;912;FKKC;Tiko;;Cameroon;1;04-05N;009-22E;;;52;; 64;920;FKAF;Bafia;;Cameroon;1;04-44N;011-15E;;;500;500;P 64;931;FKKI;Batouri;;Cameroon;1;04-28N;014-22E;04-28N;014-22E;656;656;P 64;950;FKYS;Yaounde;;Cameroon;1;03-50N;011-31E;03-50N;011-31E;751;760;P 64;960;FKAG;Abong-Mbang;;Cameroon;1;03-58N;013-12E;;;693;; 64;961;FKAL;Lomie;;Cameroon;1;03-09N;013-37E;;;624;; 64;971;FKKB;Kribi;;Cameroon;1;02-57N;009-54E;;;10;16;P 65;001;----;Yelwa;;Nigeria;1;10-53N;004-45E;;;24;24;P 65;010;DNSO;Sokoto;;Nigeria;1;13-01N;005-15E;;;351;302;P 65;015;DNGU;Gusau;;Nigeria;1;12-10N;006-42E;;;463;469;P 65;019;DNKA;Kaduna;;Nigeria;1;10-36N;007-27E;;;645;642;P 65;028;----;Katsina;;Nigeria;1;13-01N;007-41E;;;427;517;P 65;030;DNZA;Zaria;;Nigeria;1;11-08N;007-41E;;;664;664;P 65;046;DNKN;Kano;;Nigeria;1;12-03N;008-32E;12-03N;008-32E;476;481;P 65;055;----;Bauchi;;Nigeria;1;10-17N;009-49E;;;591;609;P 65;064;----;Nguru;;Nigeria;1;12-53N;010-28E;;;343;344;P 65;073;----;Potiskum;;Nigeria;1;11-42N;011-02E;;;488;41;P 65;082;DNMA;Maiduguri;;Nigeria;1;11-51N;013-05E;;;354;; 65;101;DNIL;Ilorin;;Nigeria;1;08-29N;004-35E;;;308;305;P 65;112;DNBI;Bida;;Nigeria;1;09-06N;006-01E;;;137;143;P 65;123;----;Minna;;Nigeria;1;09-37N;006-32E;09-37N;006-32E;262;260;P 65;125;----;Abuja;;Nigeria;1;09-15N;007-00E;;;;344; 65;134;DNJO;Jos;;Nigeria;1;09-52N;008-54E;;;1295;1285;P 65;145;----;Ibi;;Nigeria;1;08-11N;009-45E;;;111;111;P 65;167;DNYO;Yola;;Nigeria;1;09-14N;012-28E;09-14N;012-28E;191;174;P 65;201;DNMM;Lagos / Ikeja;;Nigeria;1;06-35N;003-20E;06-35N;003-20E;40;38;P 65;202;----;Lagos / Oshodi;;Nigeria;1;06-33N;003-21E;;;;19; 65;208;DNIB;Ibadan;;Nigeria;1;07-26N;003-54E;07-26N;003-54E;234;228;P 65;215;DNOS;Oshogbo;;Nigeria;1;07-47N;004-29E;;;305;304;P 65;222;----;Ondo;;Nigeria;1;07-06N;004-50E;;;287;287;P 65;229;----;Benin City;;Nigeria;1;06-19N;005-36E;;;79;79;P 65;236;----;Warri;;Nigeria;1;05-31N;005-44E;;;0;4;P 65;243;----;Lokoja;;Nigeria;1;07-48N;006-44E;;;41;44;P 65;245;----;Onitsha;;Nigeria;1;06-09N;006-47E;;;86;86; 65;250;DNPO;Port Harcourt;;Nigeria;1;04-51N;007-01E;04-51N;007-01E;18;18;P 65;257;DNEN;Enugu;;Nigeria;1;06-28N;007-33E;;;137;; 65;264;DNCA;Calabar;;Nigeria;1;04-58N;008-21E;;;63;63;P 65;271;DNMK;Makurdi;;Nigeria;1;07-41N;008-37E;07-41N;008-37E;113;97;P 65;272;----;Ogoja;;Nigeria;1;06-40N;008-48E;;;;117; 65;273;----;Ikom;;Nigeria;1;05-58N;008-43E;;;93;93;P 65;306;DBBK;Kandi;;Benin;1;11-08N;002-56E;11-08N;002-56E;290;292;P 65;319;DBBN;Natitingou;;Benin;1;10-19N;001-23E;;;460;461;P 65;330;DBBP;Parakou;;Benin;1;09-21N;002-37E;09-21N;002-37E;392;393;P 65;335;DBBS;Save;;Benin;1;08-02N;002-28E;;;199;200;P 65;338;DBBC;Bohicon;;Benin;1;07-10N;002-04E;;;166;167;P 65;344;DBBB;Cotonou;;Benin;1;06-21N;002-23E;06-21N;002-23E;5;9;P 65;351;----;Dapaon;;Togo;1;10-52N;000-15E;;;329;330;P 65;352;DXMG;Mango;;Togo;1;10-22N;000-28E;;;145;146;P 65;355;DXNG;Niamtougou;;Togo;1;09-46N;001-06E;;;342;343;P 65;357;----;Kara;;Togo;1;09-33N;001-10E;;;340;341;P 65;361;DXSK;Sokode;;Togo;1;08-59N;001-09E;08-59N;001-09E;386;387;P 65;376;DXAK;Atakpame;;Togo;1;07-35N;001-07E;;;400;402;P 65;378;----;Kouma-Konda;;Togo;1;06-57N;000-35E;;;643;641;P 65;380;DXTA;Tabligbo;;Togo;1;06-35N;001-30E;;;44;44;P 65;387;DXXX;Lome;;Togo;1;06-10N;001-15E;06-10N;001-15E;20;25;P 65;401;DGLN;Navrongo;;Ghana;1;10-54N;001-06W;;;201;203;P 65;404;DGLW;Wa;;Ghana;1;10-03N;002-30W;;;323;323;P 65;416;DGLB;Bole;;Ghana;1;09-02N;002-29W;09-02N;002-29W;299;301;P 65;418;DGLE;Tamale;;Ghana;1;09-30N;000-51W;09-30N;000-51W;168;173;P 65;420;DGLY;Yendi;;Ghana;1;09-27N;000-01W;;;195;197;P 65;432;DGSW;Wenchi;;Ghana;1;07-45N;002-06W;;;339;340;P 65;437;----;Kete-Krachi;;Ghana;1;07-49N;000-02W;07-49N;000-02W;122;122;P 65;439;DGSN;Sunyani;;Ghana;1;07-20N;002-20W;;;309;312;P 65;442;DGSI;Kumasi;;Ghana;1;06-43N;001-36W;06-43N;001-36W;287;293;P 65;445;DGSB;Sefwi Bekwai;;Ghana;1;06-12N;002-20W;;;171;172;P 65;453;DGAH;Ho;;Ghana;1;06-36N;000-28E;;;158;158;P 65;457;DGKA;Akim Oda;;Ghana;1;05-56N;000-59W;;;139;140;P 65;459;DGKK;Koforidua;;Ghana;1;06-05N;000-15W;;;166;167;P 65;460;DGAK;Akuse;;Ghana;1;06-06N;000-07E;;;17;19;P 65;462;----;Akatsi;;Ghana;1;06-07N;000-48E;;;175;178;P 65;465;DGTX;Axim;;Ghana;1;04-52N;002-14W;;;38;40;P 65;467;DGTK;Takoradi;;Ghana;1;04-53N;001-46W;04-53N;001-46W;5;9;P 65;469;DGAS;Saltpond;;Ghana;1;05-12N;001-04W;;;44;47;P 65;472;DGAA;Accra;;Ghana;1;05-36N;000-10W;05-36N;000-10W;68;69;P 65;473;DGAT;Tema;;Ghana;1;05-37N;00-00E;;;14;18; 65;475;DGAD;Ada;;Ghana;1;05-47N;000-38E;;;5;7;P 65;500;----;Markoye;;Burkina Faso;1;14-38N;000-04W;;;295;; 65;501;DFEE;Dori;;Burkina Faso;1;14-02N;000-02W;14-02N;000-02W;276;277; 65;502;DFCC;Ouahigouya;;Burkina Faso;1;13-34N;002-25W;;;337;336; 65;503;DFFD;Ouagadougou;;Burkina Faso;1;12-21N;001-31W;12-21N;001-31W;316;306;P 65;505;DFOD;Dedougou;;Burkina Faso;1;12-28N;003-29W;;;300;300; 65;507;DFEF;Fada N'Gourma;;Burkina Faso;1;12-02N;000-22E;;;308;309; 65;510;DFOO;Bobo-Dioulasso;;Burkina Faso;1;11-10N;004-19W;11-10N;004-19W;460;460;P 65;516;DFCO;Boromo;;Burkina Faso;1;11-45N;002-56W;;;270;271; 65;518;DFCP;Po;;Burkina Faso;1;11-09N;001-09W;;;320;322; 65;522;DFOG;Gaoua;;Burkina Faso;1;10-20N;003-11W;;;333;335; 65;523;----;Mangodara;;Burkina Faso;1;09-54N;004-21W;;;260;; 65;528;DIOD;Odienne;;Cote d'Ivoire;1;09-30N;007-34W;09-30N;007-34W;434;421;P 65;536;DIKO;Korhogo;;Cote d'Ivoire;1;09-25N;005-37W;09-25N;005-37W;381;381;P 65;545;DIBU;Bondoukou;;Cote d'Ivoire;1;08-03N;002-47W;;;369;370;P 65;548;DIMN;Man;;Cote d'Ivoire;1;07-23N;007-31W;07-23N;007-31W;339;340;P 65;555;DIBK;Bouake;;Cote d'Ivoire;1;07-44N;005-04W;07-44N;005-04W;376;376;P 65;557;DIGA;Gagnoa;;Cote d'Ivoire;1;06-08N;005-57W;;;205;210;P 65;560;DIDL;Daloa;;Cote d'Ivoire;1;06-52N;006-28W;;;276;277;P 65;562;DIDK;Dimbokro;;Cote d'Ivoire;1;06-39N;004-42W;;;92;92;P 65;563;DIYO;Yamoussoukro;;Cote d'Ivoire;1;06-54N;005-21W;;;196;213;P 65;578;DIAP;Abidjan;;Cote d'Ivoire;1;05-15N;003-56W;05-15N;003-56W;7;8;P 65;585;DIAD;Adiake;;Cote d'Ivoire;1;05-18N;003-18W;;;33;39;P 65;592;DITB;Tabou;;Cote d'Ivoire;1;04-25N;007-22W;04-25N;007-22W;21;21;P 65;594;DISP;San Pedro;;Cote d'Ivoire;1;04-45N;006-39W;;;30;30;P 65;599;DISS;Sassandra;;Cote d'Ivoire;1;04-57N;006-05W;;;62;66;P 65;602;----;Spriggs Payne Air-Port;;Liberia;1;06-20N;010-45W;;;8;12; 65;660;GLRB;Grand Bassa, Roberts Field;;Liberia;1;06-15N;010-21W;;;18;; 66;104;FNCA;Cabinda;;Angola;1;05-33S;012-11E;;;25;20;P 66;116;----;Noqui;;Angola;1;05-52S;013-26E;;;300;; 66;118;----;Nbanza-Kongo;;Angola;1;06-16S;014-15E;;;567;; 66;121;----;Maquela Do Zombo;;Angola;1;06-02S;015-07E;;;920;920;P 66;130;----;N'Zeto Ambrizete ;;Angola;1;07-14S;012-52E;;;18;17;P 66;136;----;Toto;;Angola;1;07-10S;014-16E;;;540;;P 66;140;----;Carmona;;Angola;1;07-35S;015-00E;;;829;831; 66;142;----;Negage;;Angola;1;07-41S;015-22E;;;1248;1249;P 66;152;----;Dundo;;Angola;1;07-24S;020-49E;;;775;776;P 66;160;FNLU;Luanda;;Angola;1;08-51S;013-14E;08-51S;013-14E;74;70;P 66;172;----;N'Dalatando;;Angola;1;09-17S;014-55E;;;795;795; 66;187;----;Camaxilo;;Angola;1;08-22S;018-56E;;;1180;1180;P 66;210;----;Sumbe;;Angola;1;11-12S;013-51E;;;;10; 66;215;----;Malange;;Angola;1;09-33S;016-22E;;;1139;1142;P 66;223;----;Mbanza Congo;;Angola;1;06-16S;014-15E;;;;530; 66;226;----;Saurimo Henrique Decarvalho ;;Angola;1;09-39S;020-24E;;;1081;1080;P 66;240;----;Porto Amboim;;Angola;1;10-42S;013-45E;;;5;5;P 66;260;----;Sumbe;;Angola;1;11-12S;013-51E;;;;; 66;270;----;Waku Kungu Cela ;;Angola;1;11-25S;015-07E;;;1304;1304; 66;285;----;Luena Luso ;;Angola;1;11-47S;019-55E;;;1357;1357;P 66;296;----;Cazombo;;Angola;1;11-52S;022-54E;;;1125;1126;P 66;305;----;Lobito;;Angola;1;12-22S;013-32E;;;3;3;P 66;310;FNBG;Monbaca Benguela ;;Angola;1;12-35S;013-25E;;;33;4;P 66;318;FNHU;Huambo Nova Lisboa ;;Angola;1;12-48S;015-45E;12-48S;015-45E;1710;1701;P 66;325;FNKU;Bie Silva Porto ;;Angola;1;12-23S;016-57E;;;1701;1699;P 66;390;----;Lubango Sa Da Bandeira ;;Angola;1;14-56S;013-34E;;;1760;1758;P 66;410;----;Menongue Serpa Pinto ;;Angola;1;14-39S;017-41E;;;1348;1343;P 66;422;----;Mocamedes;;Angola;1;15-12S;012-09E;;;43;45;P 66;447;----;Mavinga;;Angola;1;15-50S;020-21E;;;1118;1088;P 66;450;----;Baia Dos Tigres;;Angola;1;16-36S;011-43E;;;1;1;P 66;460;----;Pereira De Eca;;Angola;1;17-05S;015-44E;;;1108;1109; 66;485;----;Rocadas;;Angola;1;16-43S;015-00E;;;1100;1099;P 67;001;----;Moroni Airport Grande-Comore ;;Comoros;1;11-42S;043-14E;;;6;6;P 67;002;FMCH;Hahaya International Airport;;Comoros;1;11-32S;043-16E;11-32S;043-16E;29;29; 67;004;FMCV;Ouani Anjouan ;;Comoros;1;12-07S;044-26E;12-07S;044-26E;19;12;P 67;005;FMCZ;Dzaoudzi / Pamanzi Mayotte ;;Comoros;1;12-48S;045-17E;12-48S;045-17E;8;7;P 67;009;FMNA;Diego-Suarez;;Madagascar;1;12-21S;049-18E;12-21S;049-18E;114;105;P 67;012;FMNN;Fascene Nossi-Be ;;Madagascar;1;13-19S;048-19E;13-19S;048-19E;10;9;P 67;017;FMNV;Vohemar;;Madagascar;1;13-22S;050-00E;13-22S;050-00E;6;5; 67;019;FMNL;Analalava;;Madagascar;1;14-38S;047-46E;14-38S;047-46E;105;57;P 67;020;----;Atsohihy;;Madagascar;1;14-53S;047-59E;;;23;; 67;022;FMND;Andapa;;Madagascar;1;14-39S;049-37E;;;473;474; 67;023;FMNS;Sambava;;Madagascar;1;14-17S;050-10E;14-17S;050-10E;5;5; 67;025;FMNH;Antalaha;;Madagascar;1;14-53S;050-15E;15-00S;050-20E;87;88;P 67;027;FMNM;Majunga;;Madagascar;1;15-40S;046-21E;14-53S;050-15E;26;18;P 67;037;FMNQ;Besalampy;;Madagascar;1;16-45S;044-29E;16-45S;044-29E;38;36; 67;045;----;Maevatanana;;Madagascar;1;16-57S;046-50E;16-57S;046-50E;76;79;P 67;072;FMMS;Sainte-Marie Aerodrome;;Madagascar;1;17-05S;049-49E;17-05S;049-49E;2;3;P 67;073;FMMO;Maintirano;;Madagascar;1;18-03S;044-02E;18-03S;044-02E;23;23;P 67;083;FMMI;Antananarivo / Ivato;;Madagascar;1;18-48S;047-29E;18-48S;047-29E;1279;1276;P 67;095;FMMT;Tamatave;;Madagascar;1;18-07S;049-24E;18-07S;049-24E;5;6;P 67;107;FMME;Antsirabe;;Madagascar;1;19-49S;047-04E;19-49S;047-04E;1523;1532; 67;113;FMMH;Mahanoro;;Madagascar;1;19-50S;048-48E;19-50S;048-48E;5;5;P 67;117;FMMV;Morondava;;Madagascar;1;20-17S;044-19E;20-17S;044-19E;7;8;P 67;131;FMSR;Morombe;;Madagascar;1;21-45S;043-22E;21-45S;043-22E;5;4; 67;137;FMSF;Fianarantsoa;;Madagascar;1;21-27S;047-06E;21-27S;047-06E;1115;1109;P 67;143;FMSM;Mananjary;;Madagascar;1;21-12S;048-22E;21-12S;048-22E;5;6;P 67;152;FMSO;Ranohira;;Madagascar;1;22-33S;045-24E;22-33S;045-24E;824;824;P 67;157;FMSG;Farafangana;;Madagascar;1;22-48S;047-50E;22-48S;047-50E;8;6;P 67;161;FMST;Tulear;;Madagascar;1;23-23S;043-44E;23-23S;043-44E;8;8;P 67;194;----;Faux-Cap;;Madagascar;1;25-33S;045-32E;25-33S;045-32E;22;22;P 67;197;FMSD;Fort-Dauphin;;Madagascar;1;25-02S;046-57E;25-02S;046-57E;8;9;P 67;205;FQMP;Mocimboa Da Praia;;Mozambique;1;11-21S;040-22E;;;27;29; 67;215;FQPB;Pemba;;Mozambique;1;12-59S;040-32E;12-58S;040-30E;101;50; 67;217;FQLC;Lichinga;;Mozambique;1;13-18S;035-14E;13-17S;035-15E;1364;1365; 67;221;----;Marrupa;;Mozambique;1;13-44S;037-33E;;;836;838; 67;223;----;Montepuez;;Mozambique;1;13-08S;039-02E;;;534;535; 67;229;----;Ulongue;;Mozambique;1;14-44S;034-21E;;;1270;1311; 67;231;FQCB;Cuamba;;Mozambique;1;14-49S;036-32E;;;606;607; 67;237;FQNP;Nampula;;Mozambique;1;15-06S;039-17E;15-06S;039-17E;438;441; 67;241;FQLU;Lumbo;;Mozambique;1;15-02S;040-40E;15-02S;040-40E;10;11; 67;243;----;Zumbo;;Mozambique;1;15-37S;030-26E;;;343;340; 67;261;FQTE;Tete;;Mozambique;1;16-11S;033-35E;16-11S;033-35E;149;150; 67;273;----;Angoche;;Mozambique;1;16-13S;039-54E;;;61;62; 67;280;----;Caia;;Mozambique;1;17-50S;035-20E;;;30;45; 67;283;FQQL;Quelimane;;Mozambique;1;17-53S;036-53E;17-53S;036-53E;6;16; 67;285;----;Pebane;;Mozambique;1;17-16S;038-09E;;;25;26; 67;295;FQCH;Chimoio;;Mozambique;1;19-07S;033-28E;;;731;732; 67;297;FQBR;Beira;;Mozambique;1;19-48S;034-54E;19-48S;034-54E;8;16; 67;308;----;Chicualacuala;;Mozambique;1;22-05S;031-41E;;;452;453; 67;315;FQVL;Vilanculos;;Mozambique;1;22-00S;035-19E;;;20;21; 67;323;FQIN;Inhambane;;Mozambique;1;23-52S;035-23E;23-52S;035-23E;14;15; 67;335;FQXA;Xai Xai;;Mozambique;1;25-03S;033-38E;;;4;5; 67;341;FQMA;Maputo / Mavalane;;Mozambique;1;25-55S;032-34E;25-55S;032-34E;39;44; 67;346;----;Changalane;;Mozambique;1;26-17S;032-11E;;;100;104; 67;403;FLKB;Kawambwa;;Zambia;1;09-48S;029-05E;;;1323;1324;P 67;413;FLBA;Mbala;;Zambia;1;08-51S;031-20E;;;1673;; 67;421;FWCT;Chitipa;;Malawi;1;09-42S;033-16E;;;1278;1278;P 67;423;FWKA;Karonga;;Malawi;1;09-57S;033-53E;09-57S;033-54E;529;529;P 67;424;----;Bolero;;Malawi;1;10-58S;033-44E;;;1100;1100; 67;441;FLMW;Mwinilunga;;Zambia;1;11-45S;024-26E;11-45S;024-26E;1361;1363;P 67;461;FLMA;Mansa;;Zambia;1;11-06S;028-51E;;;1382;1384;P 67;475;FLKS;Kasama;;Zambia;1;10-13S;031-08E;10-13S;031-08E;1382;1384;P 67;476;----;Misamfu;;Zambia;1;10-06S;031-15E;;;1536;; 67;477;FLMP;Mpika;;Zambia;1;11-54S;031-26E;;;1400;1402;P 67;481;FLIK;Isoka;;Zambia;1;10-07S;032-38E;;;1360;; 67;485;FWMZ;Mzimba;;Malawi;1;11-53S;033-37E;11-53S;033-37E;1349;1351;P 67;489;FWUU;Mzuzu;;Malawi;1;11-27S;034-01E;11-27S;034-01E;1251;1253;P 67;493;----;Nkhata Bay;;Malawi;1;11-36S;034-18E;;;500;500; 67;531;FLZB;Zambezi;;Zambia;1;13-32S;023-07E;;;1077;1078;P 67;541;FLPA;Kasempa;;Zambia;1;13-32S;025-51E;;;1234;1234;P 67;543;FLPO;Kabompo;;Zambia;1;13-36S;024-12E;;;1075;; 67;551;FLSW;Solwezi;;Zambia;1;12-11S;026-23E;;;1386;; 67;561;FLND;Ndola;;Zambia;1;13-00S;028-39E;13-00S;028-39E;1269;1270;P 67;563;----;Kafironda;;Zambia;1;12-36S;028-07E;;;1243;; 67;571;FLSE;Serenje;;Zambia;1;13-14S;030-13E;;;1384;; 67;575;----;Mkushi;;Zambia;1;13-38S;029-53E;;;1237;; 67;580;----;Msekera;;Zambia;1;13-39S;032-34E;;;1025;; 67;581;FLCP;Chipata;;Zambia;1;13-33S;032-35E;13-33S;032-35E;1028;1032;P 67;583;FLLD;Lundazi;;Zambia;1;12-17S;033-12E;;;1143;; 67;584;----;Kasungu;;Malawi;1;13-01S;033-28E;;;1015;1015; 67;585;----;Chitedze;;Malawi;1;13-59S;033-38E;;;1149;1149; 67;586;FWKI;Lilongwe International Airport;;Malawi;1;13-47S;033-46E;13-47S;033-47E;1229;1229;P 67;588;----;N. R. C.;;Malawi;1;14-10S;033-40E;;;1100;1100; 67;591;FWKK;Nkhota Kota;;Malawi;1;12-55S;034-16E;;;500;500; 67;597;FWSM;Salima;;Malawi;1;13-45S;034-35E;13-45S;034-35E;513;513;P 67;599;----;Mfuwe;;Zambia;1;13-16S;031-56E;;;568;570;P 67;625;----;Kalabo;;Zambia;1;14-51S;022-42E;;;;; 67;633;FLMG;Mongu;;Zambia;1;15-15S;023-09E;15-15S;023-09E;1052;1053;P 67;641;FLKO;Kaoma;;Zambia;1;14-48S;024-48E;;;1213;1213;P 67;655;----;Mumbwa;;Zambia;1;15-04S;027-11E;;;1216;1218;P 67;659;----;Kafue Polder;;Zambia;1;15-46S;027-55E;;;978;; 67;662;----;Kabwe Agric;;Zambia;1;14-24S;028-30E;;;1165;; 67;663;FLKW;Kabwe;;Zambia;1;14-27S;028-28E;14-27S;028-28E;1206;1207;P 67;665;FLLS;Lusaka Internationalairport;;Zambia;1;15-19S;028-27E;15-19S;028-27E;1152;1154;P 67;666;FLLC;Lusaka City Airport;;Zambia;1;14-27S;028-28E;15-25S;028-19E;1280;1280; 67;667;----;Mount Makulu;;Zambia;1;15-33S;028-15E;;;1213;; 67;673;FLPE;Petauke;;Zambia;1;14-15S;031-17E;;;1035;1036;P 67;687;----;Chichiri;;Malawi;1;15-47S;035-02E;;;1141;1141;P 67;689;FWDZ;Dedza;;Malawi;1;14-19S;034-16E;;;1630;1632; 67;690;FWMY;Monkey Bay;;Malawi;1;14-05S;034-55E;;;474;474; 67;692;----;Makoka;;Malawi;1;15-31S;035-13E;;;1028;1028; 67;693;FWCL;Chileka;;Malawi;1;15-41S;034-58E;15-41S;034-58E;766;767;P 67;695;FWMG;Mangochi;;Malawi;1;14-26S;035-15E;;;485;485;P 67;696;----;Chikweo ;;Malawi;1;14-45S;035-40E;;;717;; 67;699;----;Mimosa;;Malawi;1;16-05S;035-35E;;;653;653; 67;731;FLSN;Senanga;;Zambia;1;16-06S;023-16E;;;1027;; 67;741;FLSS;Sesheke;;Zambia;1;17-28S;024-18E;;;949;951;P 67;743;FLLI;Livingstone;;Zambia;1;17-49S;025-49E;17-49S;025-49E;985;986;P 67;751;----;Magoye;;Zambia;1;16-00S;027-36E;;;1018;; 67;753;FLCH;Choma;;Zambia;1;16-50S;027-04E;;;1213;1278;P 67;755;FVBI;Binga;;Zimbabwe;1;17-37S;027-20E;;;620;617; 67;761;FVKB;Kariba;;Zimbabwe;1;16-31S;028-53E;16-31S;028-53E;518;518; 67;765;FVKA;Karoi;;Zimbabwe;1;16-50S;029-37E;16-50S;029-37E;1343;1344;P 67;767;----;Kanyemba;;Zimbabwe;1;15-38S;030-25E;;;329;;P 67;771;----;Chinhoyi;;Zimbabwe;1;17-22S;030-12E;;;1140;; 67;773;----;Guruve;;Zimbabwe;1;16-39S;030-42E;;;1180;; 67;774;----;Harare Belvedere ;;Zimbabwe;1;17-50S;031-01E;17-50S;031-01E;1471;1472;P 67;775;FVHA;Harare Kutsaga ;;Zimbabwe;1;17-55S;031-08E;17-56S;031-06E;1479;1480;P 67;779;----;Mount Darwin;;Zimbabwe;1;16-47S;031-35E;;;965;966;P 67;781;FVMT;Mutoko;;Zimbabwe;1;17-25S;032-13E;17-25S;032-13E;1244;1244; 67;785;----;Hernderson;;Zimbabwe;1;17-35S;030-58E;;;1290;; 67;789;----;Mvurwi;;Zimbabwe;1;17-02S;030-51E;;;1480;; 67;791;----;Bvumbwe;;Malawi;1;15-55S;035-04E;;;1145;1146; 67;793;----;Thyolo;;Malawi;1;16-09S;035-13E;;;820;820; 67;796;----;Ngabu;;Malawi;1;16-30S;034-57E;;;102;102; 67;797;----;Makanga;;Malawi;1;16-31S;035-09E;;;58;58;P 67;843;FVFA;Victoria Falls;;Zimbabwe;1;18-06S;025-51E;18-06S;025-51E;1061;1062;P 67;853;FVWN;Hwange National Park;;Zimbabwe;1;18-38S;027-00E;18-38S;026-51E;1079;1077;P 67;861;FVGO;Gokwe;;Zimbabwe;1;18-13S;028-56E;18-13S;028-56E;1282;1282;P 67;865;----;Kwekwe;;Zimbabwe;1;18-56S;029-50E;;;1213;1215; 67;867;FVTL;Gweru;;Zimbabwe;1;19-27S;029-51E;19-27S;029-51E;1428;1429;P 67;869;----;Kadoma;;Zimbabwe;1;18-19S;029-53E;18-19S;029-53E;1150;1157; 67;871;----;Chivhu;;Zimbabwe;1;19-02S;030-53E;19-02S;030-53E;1460;1459; 67;875;----;Buhera;;Zimbabwe;1;19-19S;031-26E;;;1190;; 67;877;----;Grasslands;;Zimbabwe;1;18-11S;031-28E;;;1630;1632; 67;881;FVRU;Rusape;;Zimbabwe;1;18-32S;032-08E;18-32S;032-09E;1430;1430;P 67;889;----;Wyanga;;Zimbabwe;1;18-17S;032-45E;;;1880;; 67;891;----;Mhondoro;;Zimbabwe;1;19-19S;030-36E;;;1260;; 67;895;----;Mukandi;;Zimbabwe;1;18-43S;032-51E;18-43S;032-51E;1270;1270; 67;897;----;Chisengu;;Zimbabwe;1;19-53S;032-53E;;;1480;; 67;899;----;Wedza;;Zimbabwe;1;18-37S;031-34E;;;1380;; 67;951;----;Plumtree;;Zimbabwe;1;20-29S;027-48E;;;1390;; 67;961;----;Kezi;;Zimbabwe;1;20-55S;028-27E;;;1020;; 67;963;----;Matopos;;Zimbabwe;1;20-23S;028-30E;;;1350;; 67;964;----;Bulawayo Goetz Obsy. ;;Zimbabwe;1;20-09S;028-37E;20-09S;028-37E;1343;1344;P 67;965;FVBU;Bulawayo Airport;;Zimbabwe;1;20-01S;028-37E;20-01S;028-37E;1326;1326;P 67;967;----;Tuli;;Zimbabwe;1;21-23S;028-59E;;;770;; 67;969;----;West Nicholson;;Zimbabwe;1;21-03S;029-22E;;;860;861;P 67;971;----;Zvishavane;;Zimbabwe;1;20-19S;030-04E;;;980;; 67;974;----;Makoholi;;Zimbabwe;1;19-50S;030-47E;;;;; 67;975;FVMV;Masvingo;;Zimbabwe;1;20-04S;030-52E;20-04S;030-52E;1094;1095;P 67;977;FVCZ;Buffalo Range;;Zimbabwe;1;21-01S;031-35E;21-01S;031-35E;429;430;P 67;979;----;Zaka;;Zimbabwe;1;20-20S;031-28E;;;770;; 67;983;FVCH;Chipinge;;Zimbabwe;1;20-12S;032-37E;;;1131;1132;P 67;991;FVBB;Beitbridge;;Zimbabwe;1;22-13S;030-00E;22-13S;030-00E;456;457;P 68;006;----;Ondangwa;;Namibia;1;17-56S;015-59E;;;1095;1100;P 68;010;----;Okaukuejo;;Namibia;1;19-11S;015-55E;;;1102;1100; 68;014;FYGF;Grootfontein;;Namibia;1;19-36S;018-07E;19-36S;018-07E;1411;1400;P 68;016;----;Mowe;;Namibia;1;19-20S;012-43E;;;16;0;P 68;018;FYRU;Rundu;;Namibia;1;17-55S;019-46E;;;1083;1100;P 68;024;FBGZ;Ghanzi;;Botswana;1;21-42S;021-39E;21-42S;021-39E;1131;1100;P 68;026;FBSW;Shakawe;;Botswana;1;18-22S;021-51E;;;1032;1000;P 68;029;FBKE;Kasane;;Botswana;1;17-49S;025-09E;;;968;1000; 68;031;----;Moremi;;Botswana;1;19-20S;023-25E;;;964;; 68;032;FBMN;Maun;;Botswana;1;19-59S;023-25E;19-59S;023-25E;945;900;P 68;034;----;Gweta;;Botswana;1;20-15S;025-05E;;;927;; 68;038;FBSN;Sua-Pan;;Botswana;1;20-28S;025-59E;20-28S;025-59E;903;904; 68;040;FBLT;Letlhakane;;Botswana;1;21-25S;025-36E;;;986;985; 68;054;FBFT;Francistown;;Botswana;1;21-13S;027-30E;21-10S;027-29E;1001;1000;P 68;102;----;Sitrusdal;;Namibia;1;19-56S;016-23E;;;1341;;P 68;104;----;Walvis Bay-Pelican Point ;;Namibia;1;22-53S;014-26E;22-53S;014-26E;7;0;P 68;106;----;Gobabeb;;Namibia;1;23-34S;015-03E;;;407;400;P 68;108;----;Uis;;Namibia;1;21-14S;015-53E;;;835;800;P 68;110;----;Windhoek;;Namibia;1;22-34S;017-06E;22-34S;017-06E;1728;1700; 68;112;FYWH;J. G. Strijdom;;Namibia;1;22-29S;017-28E;22-29S;017-28E;1715;1700;P 68;116;FAGB;Gobabis;;Namibia;1;22-28S;018-58E;;;1440;1400;P 68;148;----;Mahalapye;;Botswana;1;23-05S;026-48E;;;991;1006;P 68;156;FAER;Ellisras;;South Africa;1;23-43-35S;027-41-18E;;;851;; 68;162;----;Marnitz;;South Africa;1;23-09S;028-13E;;;946;900;P 68;174;FAPB;Pietersburg;;South Africa;1;23-52S;029-27E;23-52S;029-27E;1228;1200;P 68;176;----;Mara;;South Africa;1;23-09S;029-34E;;;896;900;P 68;180;----;Macuville Messina Agri. Farm ;;South Africa;1;22-16S;029-54E;;;522;500;P 68;182;----;Levubu;;South Africa;1;23-05S;030-17E;;;706;700;P 68;184;----;Lydenburg;;South Africa;1;25-06S;030-28E;;;1436;1400;P 68;186;----;Tzaneen;;South Africa;1;23-50S;030-09E;;;716;700;P 68;190;FAPH;Phalaborwa;;South Africa;1;23-56S;031-09E;;;427;400;P 68;192;----;Thohoyandou;;South Africa;1;22-58S;030-30E;;;600;600;P 68;212;----;Hardap;;Namibia;1;24-32S;017-56E;;;1108;1100;P 68;220;----;Khutse;;Botswana;1;23-40S;024-10E;;;1100;; 68;226;FBTE;Tshane;;Botswana;1;24-01S;021-53E;;;1118;1100;P 68;234;FBJW;Jwaneng;;Botswana;1;24-36S;024-40E;;;1189;1200; 68;240;FBSK;Seretse Khama International Airport;;Botswana;1;24-13S;025-55E;24-13S;025-55E;1005;1005; 68;242;FAMM;Mafikeng Intl. Ad;;South Africa;1;25-47S;025-32E;25-47S;025-32E;1281;1300;P 68;244;----;Gaborone;;Botswana;1;24-40S;025-55E;24-40S;025-55E;983;1000;P 68;250;----;Pilansberg;;South Africa;1;25-20S;027-10E;;;1043;1000;P 68;252;----;Rustenburg;;South Africa;1;25-43S;027-18E;;;1157;1200;P 68;254;----;Thabazimbi;;South Africa;1;24-35S;027-25E;;;970;1000;P 68;262;FAPR;Pretoria;;South Africa;1;25-44S;028-11E;25-44S;028-11E;1330;1300;P 68;263;FAIR;Pretoria Irene ;;South Africa;1;25-55S;028-13E;25-55S;028-13E;1523;1500; 68;264;FAWK;Waterkloof (SAAF);;South Africa;1;25-50S;028-13E;;;1498;1500;P 68;268;----;Warmbaths Towoomba ;;South Africa;1;24-54S;028-20E;;;1143;1100;P 68;272;----;Oudestad;;South Africa;1;25-11S;029-20E;;;953;1000;P 68;276;----;Potgietersrus;;South Africa;1;24-11S;029-01E;;;1116;1100;P 68;284;----;Tswelopele;;South Africa;1;24-39S;030-17E;;;700;700;P 68;286;----;Graskop-Skool;;South Africa;1;24-56S;030-50E;;;1441;1400;P 68;288;FANS;Nelspruit;;South Africa;1;25-26S;030-59E;;;671;700;P 68;290;FAHS;Hoedspruit;;South Africa;1;24-22S;031-02E;;;513;500;P 68;292;----;Fleur De Lys ;;South Africa;1;24-32S;031-02E;;;620;; 68;296;----;Skukuza;;South Africa;1;24-59S;031-36E;;;263;0;P 68;300;----;Luderitz Diaz Point ;;Namibia;1;26-38S;015-06E;;;23;0;P 68;312;FYKT;Keetmanshoop;;Namibia;1;26-32S;018-07E;26-32S;018-07E;1067;1100;P 68;322;----;Twee Riviere;;South Africa;1;26-28S;020-37E;;;879;900;P 68;328;FBTS;Tsabong;;Botswana;1;26-03S;022-27E;26-03S;022-27E;960;1000;P 68;330;----;Vanzylsrus;;South Africa;1;26-53S;022-03E;;;932;900;P 68;332;----;Kuruman;;South Africa;1;27-28S;023-26E;;;1317;1300; 68;336;----;Taung;;South Africa;1;27-33S;024-46E;;;1110;1100; 68;338;FAVB;Vryburg;;South Africa;1;26-57S;024-38E;;;1234;1200;P 68;342;----;Ottosdal;;South Africa;1;26-49S;026-01E;;;1498;1500;P 68;344;----;Plessisdraai;;South Africa;1;27-59S;026-08E;;;1249;1300;P 68;346;FAWM;Welkom;;South Africa;1;28-00S;026-40E;;;1338;1300;P 68;347;FAKD;Klerksdorp;;South Africa;1;26-52S;026-43E;;;1355;; 68;350;----;Potchefstroom Agric.;;South Africa;1;26-44S;027-04E;;;1350;1300;P 68;351;----;Potchefstroom Upper-Air;;South Africa;1;26-40S;027-06E;;;1372;1400;P 68;352;----;Kroonstad;;South Africa;1;27-40S;027-15E;;;1348;1300;P 68;362;FAFF;Frankfort;;South Africa;1;27-16S;028-30E;;;1499;1500;P 68;368;FAJS;Johannesburg International Airport;;South Africa;1;26-08S;028-14E;26-08S;028-14E;1694;1700;P 68;369;----;Germiston;;South Africa;1;26-15S;028-09E;;;1668;1700; 68;370;----;Bethal;;South Africa;1;26-27S;029-29E;;;1663;1700;P 68;372;----;Standerton;;South Africa;1;26-56S;029-14E;;;1581;1600;P 68;378;----;Newcastle;;South Africa;1;27-44S;029-55E;;;1235;1200;P 68;380;FACL;Carolina;;South Africa;1;26-04S;030-07E;;;1693;1700; 68;388;----;Piet Retief;;South Africa;1;27-02S;030-48E;;;1252;1800;P 68;396;FDMS;Manzini / Matsapa Airport;;Swaziland;1;26-32S;031-18E;;;641;; 68;400;----;Makatini;;South Africa;1;27-24S;032-11E;;;73;0;P 68;406;FAAB;Alexander Bay;;South Africa;1;28-34S;016-32E;28-34S;016-32E;21;0;P 68;408;----;Port Nolloth;;South Africa;1;29-14S;016-52E;;;4;0;P 68;416;----;Pofadder;;South Africa;1;29-08S;019-23E;;;989;1000;P 68;424;FAUP;Upington, Up-Apt;;South Africa;1;28-24S;021-16E;28-24S;021-16E;839;800;P 68;430;----;Postmasburg;;South Africa;1;28-19S;023-04E;;;1323;1300; 68;438;FAKM;Kimberley, Kim-Apt;;South Africa;1;28-48S;024-46E;28-48S;024-46E;1198;1200;P 68;442;FABL;Bloemfontein, Bloemfontein Airport;;South Africa;1;29-06S;026-18E;29-06S;026-18E;1354;1400;P 68;452;----;Mokhotlong;;Lesotho;1;29-16S;029-08E;;;2200;2195; 68;454;FXMU;Maseru-Mia;;Lesotho;1;29-27S;027-33E;;;1631;1628;P 68;456;----;Qacha's Nek;;Lesotho;1;34-04S;028-42E;;;1970;1950; 68;461;FABM;Bethlehem Airport;;South Africa;1;28-15S;028-20E;28-15S;028-20E;1686;1700;P 68;462;----;Bethlehem;;South Africa;1;28-10S;028-46E;;;1680;1600; 68;476;FALY;Ladysmith;;South Africa;1;28-34S;029-46E;28-34S;029-46E;1078;1100;P 68;478;----;Estcourt;;South Africa;1;29-00S;029-53E;;;1148;1100;P 68;488;----;Babanango;;South Africa;1;28-23S;031-05E;;;1279;1300;P 68;496;----;Cape Saint Lucia;;South Africa;1;28-30S;032-24E;;;107;0;P 68;498;FARB;Richard Bay;;South Africa;1;28-48S;032-06E;;;47;0;P 68;512;FASB;Springbok;;South Africa;1;29-40S;017-52E;29-40S;017-52E;1006;1000;P 68;524;----;Vanwyksvlei;;South Africa;1;30-21S;021-49E;;;962;1000;P 68;528;----;Prieska;;South Africa;1;29-40S;022-45E;;;938;900;P 68;530;----;Douglas;;South Africa;1;29-04S;023-45E;;;994;1000; 68;536;FADA;De Aar;;South Africa;1;30-39S;024-01E;;;1247;; 68;538;FADY;De Aar;;South Africa;1;30-38S;023-55E;;;384;; 68;542;----;Fauresmith;;South Africa;1;29-46S;025-19E;;;1363;1400;P 68;546;FAAN;Aliwal North;;South Africa;1;30-43S;026-43E;;;1348;1300;P 68;550;----;Wepener;;South Africa;1;29-44S;027-02E;;;1438;1400;P 68;564;----;Sheeprun;;South Africa;1;30-59S;028-23E;;;1328;; 68;570;----;Matatiele;;South Africa;1;30-21S;028-48E;;;1492;1500; 68;572;----;Shaleburn;;South Africa;1;29-48S;029-21E;;;1614;1600;P 68;580;----;Cedara;;South Africa;1;29-32S;030-17E;;;1076;1100;P 68;584;----;Port Shepstone;;South Africa;1;30-44S;030-27E;;;17;0;P 68;588;FADN;Durban, Durban International Airport;;South Africa;1;29-58S;030-57E;29-58S;030-57E;14;0;P 68;614;FAVR;Vredendal;;South Africa;1;31-40S;018-30E;;;34;0;P 68;618;FACV;Calvinia;;South Africa;1;31-28S;019-46E;;;975;1000;P 68;624;FAFR;Fraserburg;;South Africa;1;31-55S;021-31E;;;1264;1300;P 68;638;FAMB;Middelburg;;South Africa;1;31-29S;025-02E;;;1270;1300;P 68;648;FAQT;Queenstown;;South Africa;1;31-54S;026-52E;;;1094;1100;P 68;668;FAUT;Umtata;;South Africa;1;31-32S;028-40E;;;742;700;P 68;674;FAPJ;Port St Johns;;South Africa;1;31-38S;029-33E;;;47;0;P 68;712;----;Cape Columbine;;South Africa;1;32-50S;017-51E;;;60;0;P 68;714;FALW;Langebaanweg;;South Africa;1;32-58S;018-10E;;;31;0;P 68;718;----;Robertson;;South Africa;1;33-50S;019-54E;;;159;0;P 68;722;----;Sutherland;;South Africa;1;32-23S;020-40E;;;1459;1500;P 68;728;FABY;Beaufort West;;South Africa;1;32-21S;022-35E;32-21S;022-35E;842;900;P 68;736;FAGR;Graaff Reinet;;South Africa;1;32-15S;024-32E;;;752;800;P 68;738;----;Jansenville;;South Africa;1;32-56S;024-40E;;;424;0;P 68;742;----;Somerset East;;South Africa;1;32-44S;025-35E;;;717;700;P 68;744;----;Cradock;;South Africa;1;32-10S;025-37E;;;927;900;P 68;752;----;Bisho-Airport;;South Africa;1;32-50S;027-27E;;;524;500;P 68;754;----;Dohne;;South Africa;1;32-31S;027-28E;;;899;900;P 68;816;FACT;Cape Town, Cape Town International Airport;;South Africa;1;33-59S;018-36E;33-58S;018-36E;42;0;P 68;818;----;Touws River;;South Africa;1;33-21S;020-03E;;;778;800;P 68;826;FAOH;Oudtshoorn;;South Africa;1;33-34S;022-13E;;;359;0;P 68;828;FAGG;George, George Airport;;South Africa;1;34-00S;022-23E;33-58S;022-25E;193;0;P 68;832;----;Willowmore;;South Africa;1;33-17S;023-30E;;;840;800;P 68;842;FAPE;Port Elizabeth, Port E Apt;;South Africa;1;33-59S;025-36E;33-59S;025-36E;61;0;P 68;858;FAEL;East London, East London Airport;;South Africa;1;33-02S;027-50E;33-02S;027-50E;125;0;P 68;902;FATC;Tristan Da Cunha;;South Africa;1;37-03S;012-19W;;;23;0; 68;906;FAGE;Gough Island;;South Africa;1;40-21S;009-53W;40-21S;009-53W;54;0;P 68;916;----;Cape Point;;South Africa;1;34-21S;018-30E;;;226;0;P 68;920;----;Cape Agulhas;;South Africa;1;34-50S;020-01E;;;8;0;P 68;926;----;Riversdale;;South Africa;1;34-05S;021-15E;;;138;0;P 68;928;FAMO;Mossel Bay Cape Saint Blaize ;;South Africa;1;34-11S;022-09E;;;59;0;P 68;938;----;Cape Saint Francis;;South Africa;1;34-12S;024-50E;;;7;0;P 68;992;----;Bouvet Island;;Bouvet Island;1;54-26S;003-24E;54-24S;003-18E;42;42; 68;994;FAME;Marion Island;;South Africa;1;46-53S;037-52E;46-53S;037-52E;22;0;P 69;010;RKSN;Koon-Ni Range;;Korea, South;2;37-02N;126-45E;;;15;; 70;026;PABR;POST ROGERS MEMORIAL AIRPORT;AK;United States;4;71-17N;156-46W;71-17-21N;156-47-02W;13;10; 70;030;PAWI;WAINWRIGHT AIRPORT;AK;United States;4;70-38N;160-02W;;;9;; 70;063;POLI;Oliktok Distant Early Warning ;AK;United States;4;70-30N;149-53W;;;5;; 70;086;PABA;Barter Island, Barter Island LRRS Airport;AK;United States;4;70-08-02N;143-34-37W;70-08N;143-38W;2;15;P 70;104;PALU;Cape Lisburne, Cape Lisburne LRRS Airport;AK;United States;4;68-53N;166-06W;;;4;; 70;116;----;Wales;;United States;4;65-37N;168-03W;;;9;5; 70;117;PATC;Tin City Airways Facilities Sector;AK;United States;4;65-34N;167-55W;;;83;; 70;119;PAPC;Port Clarence, Port Clarence Coast Guard Station;AK;United States;4;65-15N;166-51W;;;3;5; 70;121;PPIZ;Point Lay, Point Lay LRRS Airport;AK;United States;4;69-43N;163-00W;;;8;;P 70;133;PAOT;WIEN MEMORIAL AIRPORT;AK;United States;4;66-53N;162-36W;66-53-12N;162-36-31W;3;5; 70;162;PAUM;Umiat;AK;United States;4;69-22N;152-08W;;;81;85; 70;171;PAFM;Ambler, Ambler Airport;AK;United States;4;67-06N;157-51W;;;88;; 70;173;PAIM;Utopia Creek, Indian Mountain LRRS Airport;AK;United States;4;66-59N;153-42W;;;372;; 70;174;PABT;BETTLES AIRPORT;AK;United States;4;66-54N;151-31W;66-54N;151-31W;196;196; 70;178;PATA;TANANA CALHOUN MEMORIAL AIRPORT ;AK;United States;4;65-10N;152-06W;;;72;67; 70;194;PFYU;Fort Yukon, Fort Yukon Airport;AK;United States;4;66-34N;145-16W;66-35N;145-05W;433;431;P 70;200;PAOM;NOME AIRPORT;AK;United States;4;64-31N;165-26W;64-30-32N;165-25-50W;11;4; 70;204;PAGM;Gambell, Gambell Airport;AK;United States;4;63-46N;171-44W;;;8;; 70;207;PAUN;Unalakleet;AK;United States;4;63-53N;160-48W;;;6;6;P 70;212;PACZ;Cape Romanzof, Cape Romanzof LRRS Airport;AK;United States;4;61-47N;166-02W;;;139;; 70;218;----;Nunivak;;United States;4;60-00N;166-00W;;;;; 70;219;PABE;BETHEL AIRPORT;AK;United States;4;60-47N;161-50W;60-47N;161-50W;37;46; 70;222;PAGA;Galena, Edward G. Pitka Sr. Airport;AK;United States;4;64-44N;156-56W;64-44N;156-56W;46;49; 70;231;PAMC;MCGRATH AIRPORT;AK;United States;4;62-57N;155-36W;62-58N;155-37W;103;103; 70;232;PANI;Aniak, Aniak Airport;AK;United States;4;61-34-53N;159-32-34W;;;27;26; 70;235;PASV;Sparrevohn Airways Facilities Sector;AK;United States;4;61-06N;155-34W;;;484;; 70;246;PAMH;Minchumina, Minchumina Airport;AK;United States;4;63-52-50N;152-18-02W;;;208;214; 70;248;----;Farewell / Intermediate Field;;United States;4;63-30N;153-53W;;;468;458; 70;249;PAPT;Puntilla;AK;United States;4;62-06N;152-45W;;;560;; 70;251;PATK;TALKEETNA AIRPORT;AK;United States;4;62-19N;150-06W;;;109;109; 70;255;PASW;Skwentna;AK;United States;4;61-58-38N;151-13-02W;;;46;; 70;259;PAEN;KENAI MUNICIPAL AIRPORT;AK;United States;4;60-35N;151-14W;60-34-25N;151-14-13W;28;25; 70;260;PANN;NENANA MUNICIPAL AIRPORT;AK;United States;4;64-33N;149-04W;;;110;; 70;261;PAFA;Fairbanks, Fairbanks International Airport;AK;United States;4;64-48-14N;147-52-34W;64-49-11N;147-51-29W;132;140;P 70;264;----;Summit;;United States;4;63-20N;149-08W;;;734;;P 70;265;PAEI;Fairbanks, Eielson Air Force Base;AK;United States;4;64-39N;147-06W;64-39N;147-04W;167;167; 70;266;----;Fort Greely, Ak;;United States;4;63-58N;145-42W;;;;398; 70;267;PABI;ALLEN ARMY AIRFIELD;AK;United States;4;64-00N;145-43W;64-00N;145-44W;389;391; 70;270;PAFR;Ft. Richardson / Bryant U. S. Army Heliport, Ak;AK;United States;4;61-16N;149-39W;61-16N;149-39W;115;115; 70;271;PAGK;GULKANA AIRPORT;AK;United States;4;62-09N;145-27W;;;481;481; 70;272;PAED;Anchorage, Elmendorf Air Force Base;AK;United States;4;61-15-11N;149-47-38W;;;65;59; 70;273;PANC;TED STEVENS ANCHORAGE INTERNATIONAL ;AK;United States;4;61-10N;150-02W;61-10-25N;150-00-39W;44;48; 70;274;PAAQ;PALMER MUNICIPAL AIRPORT;AK;United States;4;61-36N;149-06W;;;76;; 70;275;----;Valdez;AK;United States;4;61-08N;146-21W;;;11;10; 70;277;PAWD;Seward;AK;United States;4;60-07N;149-27W;;;9;18; 70;279;----;Cape Hinchinbrook;;United States;4;60-14N;146-39W;;;5;5; 70;291;PAOR;NORTHWAY AIRPORT;AK;United States;4;62-58N;141-56W;62-57-44N;141-56-10W;523;522; 70;296;PACV;MERLE K. SMITH AIRPORT;AK;United States;4;60-30N;145-29W;;;13;13; 70;298;PACY;Yakataga;AK;United States;4;60-05N;142-30W;;;4;11; 70;305;PAEH;Cape Newenham, Cape Newenham LRRS Airport;AK;United States;4;58-39N;162-04W;;;165;; 70;308;PASN;ST PAUL ISLAND AIRPORT;AK;United States;4;57-10N;170-13W;57-09N;170-13W;19;9; 70;316;PACD;COLD BAY AIRPORT;AK;United States;4;55-13N;162-44W;55-12-05N;162-42-50W;30;29; 70;321;PADL;Dillingham, Dillingham Airport;AK;United States;4;59-03N;158-31W;;;26;29; 70;326;PAKN;KING SALMON AIRPORT;AK;United States;4;58-41N;156-39W;58-40-50N;156-39-28W;17;10; 70;333;PAPH;Port Heiden, Port Heiden Airport;AK;United States;4;56-57N;158-38W;;;29;;P 70;340;PAIL;ILIAMNA AIRPORT;AK;United States;4;59-45N;154-55W;;;63;49; 70;341;PAHD;Homer / Municipal;AK;United States;4;59-38N;151-30W;;;24;22; 70;343;PAMD;Middleton Island, Middleton Island Airport;AK;United States;4;59-26N;146-18W;;;27;14; 70;350;PADQ;KODIAK AIRPORT;AK;United States;4;57-45N;152-29W;57-45N;152-30W;22;34; 70;360;PACP;Cape Saint Elias;AK;United States;4;59-48N;144-36W;;;18;; 70;361;PAYA;YAKUTAT AIRPORT;AK;United States;4;59-30N;139-40W;59-31N;139-40W;10;9; 70;362;PAGY;SKAGWAY AIRPORT;AK;United States;4;59-28N;135-19W;;;13;5; 70;364;PAQT;NUIQSUT AIRPORT;AK;United States;4;70-13N;150-59W;70-12-49N;150-59-18W;12;17; 70;367;PAGS;Gustavus, Gustavus Airport;AK;United States;4;58-25N;135-42W;;;10;9; 70;371;PASI;SITKA AIRPORT;AK;United States;4;57-03N;135-22W;57-02-53N;135-21-53W;6;14; 70;381;PAJN;JUNEAU INTERNATIONAL AIRPORT;AK;United States;4;58-21N;134-34W;58-21-48N;134-34-33W;6;8; 70;383;PAGN;Angoon;AK;United States;4;57-30N;134-35W;;;0;1; 70;385;----;Five Finger Light;;United States;4;57-16N;133-37W;;;0;1; 70;386;PAPG;Petersburg;AK;United States;4;56-49N;132-58W;;;0;; 70;387;PAWG;Wrangell;AK;United States;4;56-29N;132-22W;;;13;13; 70;388;----;Cape Decision Automatic Meteorological Observing System ;AK;United States;4;56-00N;134-08W;;;12;; 70;389;PAKW;Klawock, Klawock Airport;AK;United States;4;55-35N;133-05W;;;24;; 70;395;PAKT;KETCHIKAN INTERNATIONAL AIRPORT ;AK;United States;4;55-21N;131-43W;55-21-10N;131-42-24W;27;25; 70;398;PANT;ANNETTE ISLAND AIRPORT;AK;United States;4;55-02N;131-35W;55-02N;131-34W;36;34; 70;409;----;Attu;;United States;4;52-50N;173-11E;;;21;; 70;414;PASY;SHEMYA EARECKSON AS;AK;United States;4;52-43N;174-07E;;;30;; 70;454;PADK;Adak Island, Adak Airport;AK;United States;4;51-52-40N;176-38-45W;51-52-50N;176-38-33W;6;4; 70;482;PAKO;Nikolski;AK;United States;4;52-57N;168-51W;;;21;;P 70;489;PADU;Unalaska, Unalaska Airport;AK;United States;4;53-54N;166-32W;;;7;; 71;032;CWPR;Princeton Automatic Weather Reporting System ;;Canada;4;50-36N;120-31W;;;700;; 71;039;CXCK;Carmacks CS, Y. T.;;Canada;4;62-07N;136-11W;;;632;; 71;043;CYVQ;Norman Wells, N. W. T.;;Canada;4;65-17N;126-48W;65-17N;126-45W;67;74;P 71;044;CZOC;Old Crow Automatic Weather Reporting System ;;Canada;4;67-34N;139-50W;;;251;; 71;045;CYZW;Teslin, Y. T.;;Canada;4;60-10N;132-44W;;;711;705;P 71;046;CWKM;Komakuk Beach, Y. T.;;Canada;4;69-37N;140-12W;;;13;; 71;048;CWZV;Virginia Falls;;Canada;4;61-38N;125-48W;;;610;; 71;049;CWBR;B, R;;Canada;4;66-02N;091-50W;;;31;; 71;050;CWPU;Puntzi Mountain, B. C.;;Canada;4;52-07N;124-08W;;;910;910;P 71;051;CWSY;Sachs Harbour, N. W. T.;;Canada;4;72-00N;125-16W;72-00N;125-16W;88;88;P 71;052;CWVH;Storm Hills , N. W. T.;;Canada;4;68-54N;133-56W;;;261;; 71;055;CWFX;Colville Lake;;Canada;4;67-02N;126-05W;;;259;; 71;056;CWCX;Clut Lake Automated Reporting Station ;;Canada;4;66-00N;117-46W;;;185;; 71;060;CWOA;Camsell River, N. W. T.;;Canada;4;65-37N;118-07W;;;230;;P 71;062;CWHS;Bernard Harbour;;Canada;4;68-47N;114-50W;;;65;; 71;066;CYOJ;High Level, Alta;;Canada;4;58-37N;117-10W;;;338;338;P 71;068;CYPE;Peace River, Alta.;;Canada;4;56-14N;117-26W;;;571;571;P 71;069;CYZH;Slave Lake, Alta;;Canada;4;55-18N;114-47W;55-18N;114-47W;581;581;P 71;071;CYUQ;Jenny Lind Island Airport;;Canada;4;68-39N;101-44W;;;18;; 71;072;CYMD;Mould Bay, N. W. T.;;Canada;4;76-14N;119-20W;76-15N;119-21W;15;12;P 71;073;CXXX;Cluff Lake , Sask.;;Canada;4;58-23N;109-30W;;;339;; 71;074;CWIC;Isachsen Meteorological Aeronautical Presentation System ;;Canada;4;78-47N;103-33W;;;58;; 71;075;CWWC;Collins Bay Automatic Weather Reporting System ;;Canada;4;58-11N;103-42W;;;492;; 71;076;CWDC;Uranium City, Sask.;;Canada;4;59-34N;108-29W;;;318;318;P 71;077;CWVT;Buffalo Narrows, Sask.;;Canada;4;55-50N;108-26W;;;434;434;P 71;078;CYYL;Lynn Lake, Man.;;Canada;4;56-52N;101-05W;56-52N;101-05W;357;357;P 71;079;CYTH;Thompson Weather Office, Man;;Canada;4;55-48N;097-51W;55-48N;097-52W;204;222;P 71;080;CWUU;Mackar Inlet;;Canada;4;68-18N;085-40W;;;395;; 71;081;CYUX;Hall Beach, N. W. T.;;Canada;4;68-47N;081-15W;68-46N;081-13W;8;8;P 71;082;CWLT;Alert, N. W. T.;;Canada;4;82-30N;062-20W;82-30N;062-20W;63;66;P 71;083;CYRT;Rankin Inlet, N. W. T.;;Canada;4;62-49N;092-07W;;;31;31;P 71;084;CWIL;Hat Island, N. W. T.;;Canada;4;68-19N;100-05W;;;36;; 71;085;CWEV;Ellice River Automated Reporting Station ;;Canada;4;67-42N;104-28W;;;42;; 71;087;CWID;Fort Providence;;Canada;4;61-19N;117-36W;;;161;; 71;090;CYCY;Clyde, N. W. T.;;Canada;4;70-29N;068-31W;70-27N;068-33W;25;26;P 71;091;CWLX;Longstaff Bluff, N. W. T.;;Canada;4;68-53N;075-08W;;;162;161;P 71;092;CWUW;Dewar Lakes, N. W. T.;;Canada;4;68-39N;071-10W;;;518;527;P 71;093;CWUP;Cape Hooper, N. W. T.;;Canada;4;68-28N;066-48W;;;401;390;P 71;094;CWFD;Cape Dyer, N. W. T.;;Canada;4;66-35N;061-37W;;;393;393;P 71;095;CYIO;Pond Inlet, N. W. T.;;Canada;4;72-42N;077-58W;;;59;55;P 71;096;CWVD;Broughton Island;;Canada;4;67-32N;063-47W;;;584;; 71;097;CWOB;Brevoort Island;;Canada;4;63-20N;064-09W;;;367;; 71;098;CWWV;Killinek Meteorological Aeronautical Presentation System ;;Canada;4;60-25N;064-51W;;;31;; 71;101;CYZP;Sandspit, B. C.;;Canada;4;53-15N;131-49W;;;6;6;P 71;102;CWTC;Ethelda Bay;;Canada;4;53-03N;129-41W;;;10;; 71;103;CYQZ;Quesnel Airport;;Canada;4;53-02N;122-31W;;;545;; 71;104;CYWL;Williams Lake, B. C.;;Canada;4;52-11N;122-03W;;;940;940;P 71;105;CWPI;Pine Island Meteorological Aeronautical Presentation System ;;Canada;4;50-59N;127-44W;;;9;; 71;106;CYAZ;Tofino Airport;;Canada;4;49-05N;125-46W;;;24;; 71;108;CYXX;Abbotsford, B. C.;;Canada;4;49-02N;122-22W;;;54;58;P 71;109;CYZT;Port Hardy, B. C.;;Canada;4;50-41N;127-22W;50-41N;127-22W;22;22;P 71;111;CWES;Cape Scott Light;;Canada;4;50-47N;128-26W;;;70;; 71;112;CWAN;Amphitrite Point;;Canada;4;48-55N;125-33W;;;27;; 71;113;CWZA;Agassiz Automated Reporting Station ;;Canada;;49-15N;121-46W;;;15;; 71;114;CYHE;Hope, B. C.;;Canada;4;49-22N;121-29W;;;39;39;P 71;115;CWVK;Vernon, B. C.;;Canada;4;50-14N;119-17W;;;555;556;P 71;116;CWOE;Onefour Automatic Weather Reporting System ;;Canada;4;49-07N;110-28W;;;935;; 71;119;CWSE;Edmonton Stony Plain Alta.;;Canada;4;53-32N;114-06W;53-33N;114-06W;766;766;P 71;120;CYOD;Cold Lake, Alta.;;Canada;4;54-25N;110-17W;54-25N;110-17W;541;541;P 71;121;CYED;Edmonton Namao Alta.;;Canada;4;53-40N;113-28W;53-40N;113-28W;688;688;P 71;122;CWBA;Banff, Alta.;;Canada;4;51-11N;115-34W;;;1397;1384;P 71;123;CYEG;Edmonton International, Alta.;;Canada;4;53-18N;113-35W;53-19N;113-35W;715;723;P 71;124;CWIQ;Primrose Lake ;;Canada;4;54-45N;110-03W;54-45N;110-03W;702;700; 71;125;CYLJ;Meadow Lake, Sask.;;Canada;4;54-08N;108-31W;;;480;480;P 71;127;CWOU;Primrose Lake 2;;Canada;4;54-47N;110-04W;54-47N;110-04W;606;606; 71;128;CYSD;Suffield Airport;;Canada;4;50-16N;111-11W;;;770;; 71;129;CYKY;Kindersley, Sask.;;Canada;4;51-31N;109-10W;51-31N;109-11W;694;694;P 71;130;CYBU;Nipawin, Sask.;;Canada;4;53-20N;104-00W;;;372;372;P 71;131;CWEH;Eastend Cypress, Sask;;Canada;4;49-26N;108-59W;;;1078;;P 71;132;CYSF;Stony Rapids Airport;;Canada;4;59-15N;105-50W;;;250;; 71;133;CWSR;Spiritwood West, Sask;;Canada;4;53-22N;107-33W;;;584;590;P 71;134;CWTF;Beartooth Island;;Canada;4;59-13N;109-42W;;;238;; 71;135;CWKO;Rockglen, Sask.;;Canada;4;49-10N;105-59W;;;915;917;P 71;136;----;Vanscoy Upper-Air, Sask;;Canada;4;52-01N;107-02W;;;;510;P 71;137;CWVN;Val Marie Southeast, Sask;;Canada;4;49-04N;107-35W;;;785;785;P 71;138;CYQV;Yorkton, Sask.;;Canada;4;51-16N;102-28W;;;498;498;P 71;139;CWVP;Cypress Hills Park;;Canada;4;49-39N;109-31W;;;1271;; 71;140;CYBR;Brandon, Man.;;Canada;4;49-55N;099-57W;;;409;409;P 71;141;CYNE;Norway House, Man.;;Canada;4;53-58N;097-50W;;;223;223;P 71;142;CWHH;Hunters Point Mar;;Canada;4;53-02N;100-56W;;;256;; 71;143;CWBL;Bachelors Island Automated Reporting Station ;;Canada;4;51-45N;099-54W;;;256;; 71;145;CYIV;Island Lake, Man.;;Canada;4;53-51N;094-39W;53-52N;094-40W;237;237;P 71;146;CWLZ;Candle Lake;;Canada;4;53-44N;105-16W;53-44N;105-16W;503;503; 71;147;CWNK;Carman U Of M;;Canada;4;49-30N;098-02W;;;268;; 71;148;CWPO;Pilot Mound, Man.;;Canada;4;49-12N;098-54W;;;470;470;P 71;150;CWUT;Shoal Lake Airport Automated Reporting Station ;;Canada;4;50-27N;100-36W;;;561;; 71;151;CWQG;Valcartier;;Canada;4;46-54N;071-30W;;;168;; 71;153;CWFJ;Cardston Automated Reporting Station ;;Canada;4;49-12N;113-17W;;;1136;; 71;154;CWGM;Waterton Park Gate;;Canada;4;59-08N;113-48W;;;1296;; 71;155;CXEG;Edmonton International CS , Alta.;;Canada;4;53-18N;113-36W;;;715;; 71;157;CXEC;Edmonton Municipal CR10 , Alta.;;Canada;4;53-34N;113-31W;;;671;; 71;158;CWCF;Berens River CS , Man.;;Canada;4;52-21N;097-02W;;;222;; 71;160;CWFZ;Fort Reliance, N. W. T.;;Canada;4;62-43N;109-11W;;;168;; 71;161;CWIE;Indian River ;;Canada;4;64-23N;115-01W;;;478;; 71;162;CWBJ;Inner Whalebacks;;Canada;4;61-55N;113-44W;;;165;; 71;163;CWMT;Lac La Martre;;Canada;4;63-09N;117-16W;;;271;; 71;164;CWLG;Little Chicago;;Canada;4;67-12N;130-13W;;;63;; 71;165;CWYH;Rae Lakes;;Canada;4;64-07N;117-22W;;;231;; 71;166;CWTE;Trout Lake;;Canada;4;60-26N;121-14W;;;498;; 71;167;CWJP;Porter Lake;;Canada;4;61-40N;108-25W;;;396;; 71;168;CWMP;Powder Lake;;Canada;4;61-03N;109-20W;;;396;; 71;170;CWCM;Carberry Mcdc;;Canada;4;49-54N;099-21W;;;384;; 71;176;CWKW;Cape Kakkiviak;;Canada;4;59-59N;064-10W;;;551;; 71;177;CWYK;Cape Kiglapait, Nfld.;;Canada;4;57-08N;061-29W;;;834;; 71;180;CZDI;Churchill Falls;;Canada;4;53-34N;064-06W;;;440;; 71;182;CZUM;Churchill Falls, Nfld.;;Canada;4;53-33N;064-06W;;;440;440;P 71;183;CWXW;Alexis River Meteorological Aeronautical Presentation System ;;Canada;4;52-39N;056-52W;;;43;; 71;184;CWHM;Varennes;;Canada;4;45-43N;073-23W;;;19;; 71;185;CWDH;Daniel's Harbour, Nfld;;Canada;4;50-14N;057-35W;;;18;19;P 71;186;CWQM;Cap Rouge;;Canada;4;48-23N;070-32W;;;7;; 71;187;CYBC;Baie Comeau, Que.;;Canada;4;49-08N;068-12W;;;21;22;P 71;188;CYGP;Gaspe, Que.;;Canada;4;48-46N;064-29W;;;33;33;P 71;189;CWQV;Puinte Claveau;;Canada;4;48-16N;070-07W;;;0;; 71;193;CWHW;Comfort Cove, Nfld.;;Canada;4;49-16N;054-53W;;;96;99;P 71;194;----;Burgeo, Nfld.;;Canada;4;47-37N;057-37W;;;12;12;P 71;196;CWVA;Bonavista, Nfld.;;Canada;4;48-40N;053-07W;;;25;27;P 71;197;CWZB;Port-Aux-Basques, Nfld.;;Canada;4;47-34N;059-10W;47-34N;059-10W;40;40;P 71;200;CWLM;Victoria Automatic Weather Reporting System ;;Canada;4;48-25N;123-19W;;;70;; 71;201;CWHC;Vancouver Automatic Weather Reporting System ;;Canada;4;49-18N;123-07W;;;2;; 71;203;CYLW;Kelowna Airport;;Canada;4;49-58N;119-23W;49-58N;119-23W;430;430; 71;206;CYBD;Bella Coola Airport ;;Canada;4;52-23N;126-35W;;;35;; 71;207;CWSK;Squamish Airport, B. C;;Canada;4;49-47N;123-10W;;;59;52;P 71;208;CYPW;Powell River Airport ;;Canada;4;49-50N;124-30W;;;130;; 71;211;CWAS;Pam Rocks;;Canada;4;49-29N;123-18W;;;;; 71;215;CWYY;Osoyoos Automatic Weather Reporting System ;;Canada;;49-02N;119-26W;;;283;; 71;216;CWNP;Nakusp Automatic Weather Reporting System ;;Canada;;50-16N;117-49W;;;524;; 71;218;CWSL;Salmon Arm Automatic Weather Reporting System ;;Canada;;50-42N;119-17W;;;351;; 71;222;CWKX;Dease Lake Coastal Station;;Canada;4;58-25N;130-00W;;;816;; 71;230;CWBM;Beaverlodge;;Canada;4;55-12N;119-24W;;;745;; 71;231;CWXL;Bow Island;;Canada;4;49-38N;111-27W;;;838;; 71;232;CWXA;Bow Valley;;Canada;4;51-05N;115-04W;;;1298;; 71;234;CWDK;Claresholm Automatic Weather Reporting System ;;Canada;4;50-01N;113-38W;;;1012;; 71;235;CWDU;Cop Upper;;Canada;4;51-05N;114-13W;;;1235;; 71;236;CWRT;Crowsnest;;Canada;4;49-38N;114-29W;;;1303;; 71;238;CWFE;Elk Island National Park;;Canada;4;53-41N;112-52W;;;716;; 71;239;CWHE;Ellerslie;;Canada;4;53-25N;113-12W;;;694;; 71;240;CWGY;Esther 1;;Canada;4;51-40N;110-12W;;;707;; 71;241;CWHA;Highvale;;Canada;4;53-27N;114-28W;;;747;; 71;242;CWQQ;Lacombe Cda;;Canada;4;52-27N;113-45W;;;874;; 71;243;CWQL;Lethbridge Automated Reporting Station ;;Canada;4;49-42N;112-47W;;;921;; 71;244;CWRY;Milk River;;Canada;4;49-08N;112-03W;;;1050;; 71;245;CWNR;Nakiska Ridgetop ;;Canada;4;50-57N;115-11W;;;2543;; 71;246;CWRD;Red Earth;;Canada;4;56-32N;115-16W;;;546;; 71;247;CWSH;Sousa Crk Avt ;;Canada;4;58-35N;118-30W;;;373;; 71;248;CWAV;Sundre;;Canada;4;51-46N;114-41W;;;1114;; 71;249;CWHI;Three Hills;;Canada;4;51-42N;113-13W;;;907;; 71;250;CWNT;Turtle Mountain;;Canada;4;49-35N;114-25W;;;2164;; 71;251;CWVO;Vauxhall Cda;;Canada;4;50-03N;112-08W;;;779;; 71;252;CWWO;Willow Creek;;Canada;4;53-23N;118-20W;;;1402;; 71;253;CWGF;Garden River Automatic Weather Reporting System ;;Canada;4;58-41N;113-53W;;;241;; 71;254;CWRV;Camrose;;Canada;4;53-02N;112-49W;;;739;; 71;255;CWMX;Mildred Lake;;Canada;4;57-32N;111-34W;;;310;; 71;256;CXZU;Whitecourt , Alta.;;Canada;4;54-09N;115-47W;;;785;; 71;260;CYAM;Sault Ste Marie, Ont.;;Canada;4;46-29N;084-30W;;;187;192;P 71;261;CWGD;Goderich Automatic Weather Reporting System ;;Canada;4;43-46N;081-43W;;;214;; 71;263;CYHM;Hamilton Airport ;;Canada;4;43-10N;079-56W;;;237;; 71;265;CYTZ;Toronto Island Airport Automated Reporting Station;;Canada;4;43-38N;079-24W;;;77;; 71;270;CWCO;Collingwood Automatic Weather Reporting System ;;Canada;4;44-30N;080-13W;;;180;; 71;271;CWLQ;Nipissing;;Canada;4;46-19N;079-28W;;;204;; 71;272;CWPB;Beausoleil Island Automated Reporting Station ;;Canada;4;44-51N;079-52W;;;183;; 71;273;KWDD;Belle River;;Canada;4;42-18N;082-42W;;;184;; 71;281;CWGH;Grenadier Island ;;Canada;4;44-25N;075-51W;;;82;; 71;282;CWGL;Lagoon City ;;Canada;4;44-32N;079-13W;;;221;; 71;283;CWDF;Oliphant \ Ont;;Canada;4;44-44N;081-17W;;;182;; 71;284;CWQE;Toronto Headland;;Canada;4;43-37N;079-21W;;;87;; 71;290;CWJM;Upper Rideau Lake;;Canada;4;44-42N;076-18W;;;125;; 71;313;CYGV;Havre St Pierre ;;Canada;4;50-17N;063-37W;;;33;; 71;319;CWIS;Charlevoix CS , Que.;;Canada;4;47-17N;070-38W;;;719;; 71;323;CWHV;Beauceville;;Canada;4;46-12N;070-47W;;;229;; 71;368;CYKF;Waterloo Well ;;Canada;4;43-28N;080-23W;;;317;; 71;370;CXSH;Shawinigan CS , Que.;;Canada;4;46-35N;072-35W;;;110;; 71;371;CYHU;Saint Hubert Airport ;;Canada;4;45-31N;073-25W;;;27;; 71;372;CWIZ;L'Acadie;;Canada;4;45-18N;073-21W;;;45;; 71;373;CWFQ;Frelighsburg;;Canada;4;45-03N;072-50W;;;152;; 71;374;CWQW;Cape Whittle;;Canada;4;50-10N;060-04W;;;7;; 71;375;CWQR;Ile Aux Perroquets, Que.;;Canada;4;50-13-25N;064-12-30W;;;9;; 71;376;CWJT;St Jovite Automatic Weather Reporting System ;;Canada;4;46-04N;074-32W;;;239;; 71;377;CWVQ;Ste Anne De Bell 1;;Canada;4;45-26N;073-56W;;;39;; 71;378;CWDQ;La Tuque;;Canada;4;47-25N;072-48W;;;169;; 71;379;CWOD;Normandin;;Canada;4;48-50N;072-33W;;;137;; 71;381;CWIX;Mistook Automated Reporting Station ;;Canada;4;48-46N;071-43W;;;113;; 71;382;CWPD;Parc Des Laurentid;;Canada;4;47-34N;071-14W;;;803;; 71;383;CWKD;Bonnard 1, Que.;;Canada;4;50-44N;071-01W;;;497;; 71;384;CWTN;Cap Tourmente;;Canada;4;47-04N;070-48W;;;6;; 71;385;CWQO;Ile Bicquette, Que.;;Canada;4;48-24-56N;068-53-36W;;;7;; 71;386;CWZS;Amqui , Que.;;Canada;4;48-28N;067-26W;;;166;; 71;387;CWXC;Onatchiway, Que.;;Canada;4;48-53N;071-02W;;;304;; 71;388;CWUX;La Baie , Que.;;Canada;4;48-18N;70-56W;;;135;; 71;389;CWHQ;Deschambaults , Que.;;Canada;4;46-41N;071-57W;;;55;; 71;390;CWIP;Pointe Noire , Que.;;Canada;4;50-10N;066-26W;;;25;; 71;391;CXHF;High Falls , Que.;;Canada;4;45-50N;075-39W;;;190;; 71;392;CWJB;Ste Foy CS , Que.;;Canada;4;47-18N;071-16W;;;91;; 71;395;CYHZ;Halifax International Airport ;;Canada;4;44-53N;063-30W;;;145;; 71;396;----;Halifax Metoc, N. S.;;Canada;4;44-40N;063-35W;44-54N;063-30W;0;10;P 71;397;CYZX;Greenwood, N. S.;;Canada;4;44-59N;064-55W;;;28;28;P 71;398;CWUR;Truro, N. S.;;Canada;4;45-22N;063-16W;;;40;;P 71;400;CWDI;Badger, Nfld;;Canada;4;48-58N;056-04W;;;105;;P 71;402;CWDO;Twillingate Meteorological Aeronautical Presentation System ;;Canada;4;49-41N;054-48W;;;92;; 71;403;CWBV;Beaven Island, N. S.;;Canada;4;44-49N;062-20W;;;14;10;P 71;408;CWZN;Sagona Island Meteorological Aeronautical Presentation System ;;Canada;4;47-22N;055-48W;;;35;; 71;410;CWAH;Amherst, N. S.;;Canada;4;45-51N;064-16W;;;22;23;P 71;411;CWWE;Western Head, N. S.;;Canada;4;43-59N;064-40W;;;9;;P 71;412;CWEP;East Point, P. E. I;;Canada;4;46-27N;061-58W;;;11;13;P 71;414;CWPJ;Point Escuminac Meteorological Aeronautical Presentation System ;;Canada;4;47-04N;064-48W;;;5;; 71;415;CWBK;Caribou Point Meteorological Aeronautical Presentation System ;;Canada;4;45-46N;062-41W;;;2;; 71;416;CWRW;Fourchu Head Meteorological Aeronautical Presentation System ;;Canada;4;45-43N;060-14W;;;10;; 71;417;CWDA;Englee Meteorological Aeronautical Presentation System ;;Canada;4;50-43N;056-07W;;;29;; 71;418;CWEF;Saint Paul Island Meteorological Aeronautical Presentation System ;;Canada;4;47-14N;060-08W;;;26;; 71;419;CWRN;Hart Island Meteorological Aeronautical Presentation System ;;Canada;4;45-21N;060-59W;;;4;; 71;421;CWEO;Lac Eon, Que;;Canada;4;51-52N;063-17W;;;561;561;P 71;423;CWHP;Heath Point Meteorological Aeronautical Presentation System ;;Canada;4;49-05N;061-42W;;;4;; 71;424;CWER;Ile D'Orleans Automated Reporting Station ;;Canada;4;47-00N;070-49W;;;5;; 71;425;CWSF;Cap Madeleine Meteorological Aeronautical Presentation System ;;Canada;4;49-15N;065-20W;;;29;; 71;426;CWAF;Ile Rouge Meteorological Aeronautical Presentation System ;;Canada;4;48-05N;069-33W;;;5;; 71;427;CWTG;Pointe-Des-Monts , Que.;;Canada;4;49-19N;067-23W;;;5;; 71;428;CWSG;Cap Chat CS, Que.;;Canada;4;49-07N;066-39W;;;5;; 71;429;CWRZ;Cap D'Espoir , Que.;;Canada;4;48-25N;064-19W;;;16;; 71;430;CWQP;Point Petre , Ont.;;Canada;4;43-50N;077-09W;;;79;79;P 71;431;CWNC;Cobourg, Ont.;;Canada;4;43-57N;078-10W;;;78;78;P 71;432;CWWZ;Port Weller, Ont.;;Canada;4;43-15N;079-13W;;;79;;P 71;433;CWCI;Caribou Island, Ont.;;Canada;4;47-20N;085-50W;;;187;;P 71;434;CWWN;Peawanuck Meteorological Aeronautical Presentation System ;;Canada;4;54-59N;085-26W;;;52;; 71;435;CWDV;Upsala, Ont.;;Canada;4;49-02N;090-28W;;;489;489;P 71;436;CWCU;Barrie, Ont.;;Canada;4;44-23N;079-47W;;;295;;P 71;437;CWWB;Burlington Piers ;;Canada;4;43-18N;079-48W;;;77;; 71;438;CWMZ;Western Island Meteorological Aeronautical Presentation System ;;Canada;4;45-02N;080-22W;;;191;; 71;439;CWWX;Cove Island Meteorological Aeronautical Presentation System ;;Canada;4;45-20N;081-44W;;;181;; 71;440;CWHL;Holland Rock Automatic Weather Reporting System ;;Canada;4;54-10N;130-22W;;;5;; 71;441;CWGN;Gretna, Man.;;Canada;4;49-02N;097-34W;;;251;253;P 71;442;CWSZ;Fisher Branch Marine Aviation Reporting Station ;;Canada;4;51-05N;097-33W;;;253;; 71;443;CWEQ;Swan River, Man.;;Canada;4;52-07N;101-14W;;;335;335;P 71;444;CWWP;Wasagaming, Man.;;Canada;4;50-39N;099-56W;;;626;627;P 71;445;CWWS;George Island Meteorological Aeronautical Presentation System ;;Canada;4;52-48N;097-37W;;;223;; 71;446;CWVC;Swift Current Automatic Weather Reporting System ;;Canada;4;50-16N;107-44W;;;825;; 71;447;CWEI;Melita, Man;;Canada;4;49-17N;100-59W;;;446;446;P 71;448;CWEA;Pinawa Automatic Weather Reporting System ;;Canada;4;50-11N;096-04W;;;268;; 71;450;CWOK;Elbow Marine Aviation Reporting Station ;;Canada;4;51-08N;106-35W;;;595;; 71;451;CWJH;Southend Automatic Weather Reporting System ;;Canada;4;56-20N;103-17W;;;344;; 71;452;CWWF;Weyburn Automatic Weather Reporting System ;;Canada;4;49-42N;103-48W;;;589;; 71;453;CWMQ;Maplecreek Automatic Weather Reporting System ;;Canada;4;49-54N;109-28W;;;767;; 71;454;CWLV;Waskesiu Lake Automated Reporting Station ;;Canada;4;53-55N;106-04W;;;569;; 71;455;CWLE;Lucky Lake Automatic Weather Reporting System ;;Canada;4;50-57N;107-09W;;;665;; 71;456;CWFF;Melfort Automatic Weather Reporting System ;;Canada;4;52-49N;104-36W;;;490;; 71;457;CWBO;Brooks Automatic Weather Reporting System ;;Canada;4;50-33N;111-51W;;;747;; 71;458;CWVI;Vegreville Automatic Weather Reporting System ;;Canada;4;53-37N;112-02W;;;639;; 71;459;CWJX;Leader Airport Automatic Weather Reporting System ;;Canada;4;50-54N;109-30W;;;672;; 71;460;CWBE;Killarney Meteorological Aeronautical Presentation System ;;Canada;4;45-58N;081-29W;;;196;; 71;461;----;Trowbridge Island;;Canada;4;48-18N;088-52W;;;218;; 71;462;CWNL;Great Duck Island;;Canada;4;45-38N;082-58W;;;183;; 71;463;CWPC;Port Colborne Automated Reporting Station ;;Canada;4;42-52N;079-15W;;;184;; 71;464;CWPS;Long Point Meteorological Aeronautical Presentation System ;;Canada;4;42-34N;080-03W;;;175;; 71;465;CWAJ;Erieau Meteorological Aeronautical Presentation System ;;Canada;4;42-15N;081-54W;;;178;; 71;466;CWNB;S. E. Shoal Meteorological Aeronautical Presentation System ;;Canada;4;41-50N;082-28W;;;195;; 71;468;CWKK;Katatota Island;;Canada;4;49-43N;088-20W;;;260;; 71;472;CWQS;Kindakun Rocks, B. C.;;Canada;4;53-19N;132-45W;;;14;14;P 71;473;CWEZ;Saturna Island Meteorological Aeronautical Presentation System ;;Canada;4;48-47N;123-03W;;;24;; 71;474;CWCL;Clinton, B. C.;;Canada;4;51-09N;121-30W;;;1057;1057;P 71;475;CWQC;Port Alberni, B. C.;;Canada;4;49-15N;124-50W;;;2;2;P 71;476;CWEK;Grey Islet Meteorological Aeronautical Presentation System ;;Canada;4;54-35N;130-42W;;;8;; 71;477;CWRO;Rose Spit Meteorological Aeronautical Presentation System ;;Canada;4;54-10N;131-40W;;;7;; 71;478;CWFG;Sartine Island Meteorological Aeronautical Presentation System ;;Canada;4;50-49N;128-54W;;;112;; 71;479;CWRU;Solander Island Meteorological Aeronautical Presentation System ;;Canada;4;50-07N;127-56W;;;99;; 71;481;CWXM;Helmcken Island Meteorological Aeronautical Presentation System ;;Canada;4;50-24N;125-52W;;;19;; 71;482;CWME;Cathedral Point Meteorological Aeronautical Presentation System ;;Canada;4;52-11N;127-28W;;;32;; 71;483;CWAC;Nitinat Lake Meteorological Aeronautical Presentation System ;;Canada;4;48-40N;124-50W;;;41;; 71;484;CWWL;Bonilla Island Meteorological Aeronautical Presentation System ;;Canada;4;53-30N;130-38W;;;17;; 71;485;CWLP;Herbert Island Meteorological Aeronautical Presentation System ;;Canada;4;50-56N;127-38W;;;17;; 71;486;CWJW;Jasper Warden Automated Reporting Station ;;Canada;4;52-56N;118-19W;52-56N;118-19W;1020;1020; 71;487;CWJI;Assiniboia Airport Automated Reporting Station;;Canada;4;49-44N;105-56W;;;724;; 71;488;CYKJ;Key Lake;;Canada;4;57-15N;105-37W;;;509;; 71;490;CWTD;Robertson Lake Automated Reporting Station ;;Canada;4;65-06N;102-26W;;;244;; 71;492;CXTN;Tuktut Nogait , N. W. T.;;Canada;4;69-11N;122-21W;;;552;; 71;496;CWIJ;Lupin, N. W. T.;;Canada;4;65-46N;111-14W;;;500;500;P 71;498;CWXV;Back River Meteorological Aeronautical Presentation System ;;Canada;4;66-05N;096-30W;;;28;; 71;499;CWJZ;Dubawnt Lake Meteorological Aeronautical Presentation System ;;Canada;4;63-14N;101-46W;;;237;; 71;501;CWJN;Herschel Island Automatic Weather Reporting System ;;Canada;4;69-34N;138-55W;;;1;; 71;502;CWND;Pelly Island Automatic Weather Reporting System ;;Canada;4;69-38N;135-26W;;;12;; 71;503;CXDE;Deline , N. W. T.;;Canada;4;65-13N;123-26W;;;213;; 71;505;CWHT;Haines Junction;;Canada;4;60-46N;137-35W;;;599;; 71;507;CWJY;Yathkyed Lake Meteorological Aeronautical Presentation System ;;Canada;4;62-42N;098-18W;;;148;; 71;510;CWRJ;Rosetown East, Sask;;Canada;4;51-34N;107-55W;;;586;;P 71;511;CWIW;Watrous East Automated Reporting Station ;;Canada;4;51-40N;105-24W;;;526;; 71;512;CWBT;Longue Point De Mingan, Que.;;Canada;4;50-16N;064-14W;;;11;; 71;513;CWCD;Saskatoon Kernen;;Canada;4;52-09N;106-33W;;;510;; 71;514;CWDJ;Regina University;;Canada;4;50-24N;104-35W;;;573;; 71;516;CWAQ;Coronach Spc;;Canada;4;49-03N;105-29W;;;756;; 71;520;CWDE;Lac Benoit;;Canada;4;51-33N;071-07W;;;549;; 71;521;CWDP;Manouane-Est Automated Reporting Station ;;Canada;4;50-40N;070-32W;;;496;; 71;522;CWDT;Chute Des Passes;;Canada;4;49-54N;071-15W;;;399;; 71;523;CWEE;Chamouchouane Automatic Weather Reporting System;;Canada;4;49-17N;073-21W;;;305;; 71;524;CWEW;L'Assomption;;Canada;4;45-49N;073-26W;45-49N;073-26W;21;21; 71;527;CWSI;Simcoe, Ont.;;Canada;4;42-51N;080-16W;;;241;;P 71;538;CYQG;Windsor, Ont.;;Canada;4;42-16N;082-58W;;;190;190;P 71;550;CWZT;Dauphin Coastal Station;;Canada;4;51-06N;100-03W;;;305;; 71;551;CWYE;Outlook Pfra;;Canada;4;51-29N;107-03W;;;541;; 71;552;CWII;Victoria Beach ;;Canada;4;50-42N;096-34W;;;220;; 71;562;CWXH;Holberg, B. C.;;Canada;4;50-38N;128-07W;;;568;; 71;564;CXMD;Morden CDA CS , Man.;;Canada;4;49-11N;098-05W;;;298;; 71;569;CXBK;Bratts Lake, Sask.;;Canada;4;50-12N;104-42W;;;580;; 71;571;CXSR;Spirit River Auto Station, Alta;;Canada;4;55-41-43N;119-14-03W;;;1015;; 71;573;CXDI;Delhi CS, Ont.;;Canada;4;42-52N;080-33W;;;232;; 71;577;CXGH;Gimli Harbour CS, Man.;;Canada;4;50-37-52N;096-58-56W;;;217;; 71;578;CXBO;Beauport CS, Que.;;Canada;4;46-50N;071-12W;;;10;; 71;579;CXWN;Winnipeg The Forks, Man.;;Canada;4;49-53N;097-08W;;;230;; 71;583;CXQA;Qavvik Lake, N. W. T.;;Canada;4;68-15-28N;122-06-13W;;;530;; 71;585;CXMM;Fort McMurray CS, Alta.;;Canada;4;56-39N;111-13W;;;369;; 71;586;CXOX;La Ronge , Sask.;;Canada;4;55-09N;105-16W;;;378;; 71;587;CXSW;St. John's West CDA CS, Nfld.;;Canada;4;47-30-56N;052-47-05W;;;114;; 71;588;CXRH;Rocky Harbour CS, Nfld.;;Canada;4;49-34N;057-53W;;;68;; 71;589;CXTP;Terra Nova National Park CS, Nfld.;;Canada;4;48-33-25N;053-58-28W;;;107;; 71;593;CXPV;Prairie River, Alta;;Canada;4;58-37-20N;111-40-21W;;;212;; 71;597;CWZQ;Grand Etang, N. S.;;Canada;4;46-33N;061-03W;;;13;; 71;599;CWKG;Kejimkujik 1, N. S.;;Canada;4;44-26N;065-12W;;;127;; 71;600;CWSA;Sable Island, N. S.;;Canada;4;43-56N;060-01W;43-56N;060-01W;4;4;P 71;601;CYAW;Shearwater, N. S.;;Canada;4;44-38N;063-30W;44-38N;063-30W;51;51;P 71;603;CYQI;Yarmouth, N. S.;;Canada;4;43-50N;066-05W;43-52N;066-06W;43;43;P 71;604;CXNM;North Mountain , N. S.;;Canada;4;46-49N;060-40W;;;439;; 71;605;CXKT;Kentville , N. S.;;Canada;4;45-04N;064-29W;;;49;; 71;607;CWSS;St. Stephen, N. B.;;Canada;4;45-13N;067-15W;;;26;;P 71;608;----;Gannet Rock Light House ;;Canada;4;44-31N;066-47W;;;5;; 71;609;CYSJ;Saint John, N. B.;;Canada;4;45-20N;065-53W;;;103;109;P 71;610;CYSC;Sherbrooke, Que.;;Canada;4;45-24N;071-53W;;;170;;P 71;611;CWQH;Lennoxville;;Canada;4;45-22N;071-49W;;;181;; 71;612;CWTA;Mc Tavish Automated Reporting Station ;;Canada;4;45-30N;073-35W;;;63;; 71;614;CWIT;Saint Clothilde Automated Reporting Station ;;Canada;4;45-10N;073-41W;;;52;; 71;616;CWVY;Villeroy Radar Site;;Canada;4;46-26N;071-56W;;;108;; 71;617;CWJO;Jonquiere Automated Reporting Station ;;Canada;4;48-25N;071-13W;;;133;; 71;618;CWHY;Mont-Orford;;Canada;4;45-19N;072-15W;;;851;; 71;619;CWOC;New Carlisle1;;Canada;4;48-01N;065-20W;;;47;; 71;620;CYGK;Kingston, Ont.;;Canada;4;44-13N;076-36W;;;93;93;P 71;621;CYTR;Trenton, Ont.;;Canada;4;44-07N;077-32W;44-07N;077-32W;85;86;P 71;623;CYXU;London, Ont.;;Canada;4;43-02N;081-09W;;;278;278;P 71;624;CYYZ;Toronto Pearson Int'L. Ont.;;Canada;4;43-40N;079-38W;43-41N;079-38W;173;173;P 71;625;CYWA;Petawawa, Ont.;;Canada;4;45-57N;077-19W;45-57N;077-19W;130;130;P 71;626;CWMN;Mcgill Radar Site;;Canada;4;45-25N;073-56W;;;63;; 71;627;CYUL;Montreal / Pierre Elliot Trudeau International Airport, Que;;Canada;4;45-28N;073-45W;45-28N;073-45W;31;36;P 71;628;CYOW;Ottawa Int'L. Ont.;;Canada;4;45-19N;075-40W;45-19N;075-40W;116;114;P 71;629;CYPQ;Peterborough Airport ;;Canada;4;44-14N;078-22W;;;191;; 71;630;CYQA;Muskoka, Ont.;;Canada;4;44-58N;079-18W;;;280;282;P 71;631;CWLS;Mount Forest, Ont.;;Canada;4;43-59N;080-45W;;;415;;P 71;632;CWBI;Britt, Ont.;;Canada;4;45-48N;080-32W;;;190;;P 71;633;CYVV;Wiarton, Ont.;;Canada;4;44-45N;081-06W;;;222;222;P 71;634;CYZR;Sarnia Airport ;;Canada;4;43-00N;082-19W;;;181;; 71;638;CWTO;Toronto Aes Hq ;;Canada;4;43-47N;079-28W;43-47N;079-28W;187;187; 71;642;----;Chapleau Airport, Ont.;;Canada;4;47-49N;083-21W;;;447;; 71;675;CWPQ;Montreal-Est;;Canada;4;45-38N;070-33W;;;51;; 71;680;CXLC;Lower Carp Lake , N. W. T.;;Canada;4;63-36N;113-52W;;;373;; 71;682;CXLL;Lindberg Landing , N. W. T.;;Canada;4;61-07N;122-51W;;;183;; 71;683;CXTV;Trail Valley , N. W. T.;;Canada;4;68-45N;133-30W;;;85;; 71;700;CYFC;Fredericton, N. B.;;Canada;4;45-52N;066-32W;;;17;20;P 71;701;CYCX;Gagetown Can-Mil ;;Canada;4;45-50N;066-26W;45-50N;066-26W;51;51; 71;702;CYSU;Summerside Can-Mil ;;Canada;4;46-26N;063-50W;46-26N;063-50W;24;24; 71;703;CYSL;Saint Leonard Airport ;;Canada;4;47-09N;067-50W;;;241;; 71;705;CYQM;Moncton, N. B.;;Canada;4;46-07N;064-41W;;;71;71;P 71;706;CYYG;Charlottetown, P. E. I.;;Canada;4;46-17N;063-08W;;;48;54;P 71;707;CYQY;Sydney, N. S.;;Canada;4;46-10N;060-03W;46-10N;060-03W;56;62;P 71;709;CYGR;Iles De La Madeleineque.;;Canada;4;47-25N;061-47W;;;10;10;P 71;710;CWGR;Iles-De-La-Madelein;;Canada;4;47-25N;061-48W;;;10;; 71;711;CYCL;Charlo, N. B.;;Canada;4;47-59N;066-20W;;;38;38;P 71;712;CWBZ;St Anicet;;Canada;4;45-07N;074-17W;45-07N;074-17W;49;49; 71;713;CWST;La Pocatiere;;Canada;4;47-21N;070-02W;;;31;; 71;714;CYQB;Quebec, Que;;Canada;4;46-48N;071-23W;46-48N;071-23W;70;74;P 71;715;CWNH;Riviere Du Loup, Que.;;Canada;4;47-48N;069-33W;;;148;148;P 71;716;CYOY;Valcartier Airport;;Canada;4;46-54N;071-30W;46-54N;071-29W;168;178; 71;717;CYCH;Chatham Can-Mil ;;Canada;4;47-00N;065-27W;47-01N;065-27W;31;34; 71;718;CYYY;Mont Joli, Que.;;Canada;4;48-36N;068-13W;;;48;52;P 71;719;CWMI;Miscou Island, N. B.;;Canada;4;48-01N;064-30W;;;3;4;P 71;720;CWOH;Ste Agathe Des Mont;;Canada;4;46-03N;074-17W;;;395;; 71;721;CWMJ;Maniwaki;;Canada;4;46-17N;076-00W;;;200;; 71;722;CWMW;Maniwaki, Que.;;Canada;4;46-23N;075-58W;46-22N;075-59W;170;173;P 71;723;CWNQ;Nicolet Automatic Weather Reporting System ;;Canada;4;46-13N;072-39W;;;10;; 71;724;CWTY;Trois Rivieres;;Canada;4;46-21N;072-31W;;;6;; 71;725;CYVO;Val D'Or, Que.;;Canada;4;48-04N;077-47W;;;337;337;P 71;726;CWPK;Parent, Que.;;Canada;4;47-55N;074-37W;;;442;441;P 71;727;CYBG;Bagotville, Que.;;Canada;4;48-20N;071-00W;48-20N;071-00W;159;159;P 71;728;CYRJ;Roberval, Que.;;Canada;4;48-31N;072-16W;;;179;179;P 71;730;CYSB;Sudbury, Ont.;;Canada;4;46-37N;080-48W;;;348;348;P 71;731;CYYB;North Bay, Ont.;;Canada;4;46-21N;079-26W;46-22N;079-25W;358;371;P 71;733;CYZE;Gore Bay, Ont.;;Canada;4;45-53N;082-34W;;;193;193;P 71;734;CWUY;Rouyn;;Canada;4;48-15N;079-02W;;;318;; 71;735;CYXR;Earlton, Ont.;;Canada;4;47-42N;079-51W;;;243;243;P 71;736;CWGQ;Roquemaure;;Canada;4;48-38N;079-27W;;;269;; 71;738;CYXZ;Wawa, Ont.;;Canada;4;47-58N;084-47W;;;287;287;P 71;739;CYTS;Timmins, Ont.;;Canada;4;48-34N;081-22W;;;295;295;P 71;747;----;Atikokan, Ont.;;Canada;4;48-46N;091-38W;;;424;429; 71;748;CWCH;Atikokan Automated Reporting Station ;;Canada;4;48-45N;091-37W;;;424;; 71;749;CYQT;Thunder Bay, Ont.;;Canada;4;48-22N;089-19W;;;199;199;P 71;750;CWCJ;Pukaskwa ;;Canada;4;48-36N;086-18W;;;206;; 71;751;CWEC;Welcome Island;;Canada;4;48-22N;089-07W;;;209;; 71;760;CWBG;Big Creek ;;Canada;4;51-15N;123-05W;;;1670;; 71;762;CWIO;Iskut River ;;Canada;4;56-44N;131-40W;;;15;; 71;763;CWNX;Nechako River ;;Canada;4;53-41N;124-50W;;;715;; 71;768;CWUS;Summerland Automatic Weather Reporting System ;;Canada;4;49-34N;119-39W;;;454;; 71;769;CWGB;Ballenas Island Automatic Weather Reporting System ;;Canada;4;49-21N;124-10W;;;5;; 71;770;CWJR;Creston Automatic Weather Reporting System ;;Canada;4;49-05N;116-30W;;;646;; 71;772;CWEL;Entrance Island Automatic Weather Reporting System ;;Canada;4;49-13N;123-48W;;;5;; 71;774;CWKH;Malahat Automatic Weather Reporting System ;;Canada;;48-35N;123-35W;;;366;; 71;775;CWMM;P. Meadows Coastal Station Automatic Weather Reporting System;;Canada;;49-12N;122-41W;;;5;; 71;776;CWNM;Nelson Automatic Weather Reporting System ;;Canada;4;49-30N;117-18W;;;535;; 71;777;CWGP;Pemberton Automatic Weather Reporting System ;;Canada;4;50-18N;122-44W;;;204;; 71;778;CWQK;Race Rocks Automatic Weather Reporting System ;;Canada;4;48-18N;123-32W;;;5;; 71;780;CWSP;Sheringham Automatic Weather Reporting System ;;Canada;4;48-23N;123-55W;;;21;; 71;781;CWGT;Sisters Island Automatic Weather Reporting System ;;Canada;4;49-29N;124-26W;;;5;; 71;782;CWGW;Sparwood Automatic Weather Reporting System ;;Canada;4;49-45N;114-54W;;;1137;; 71;783;CWYJ;Victoria University;;Canada;;48-27N;123-18W;;;60;; 71;784;CWWA;W Vancouver Automatic Weather Reporting System ;;Canada;4;49-21N;123-11W;;;178;; 71;785;CWWK;White Rock Automatic Weather Reporting System ;;Canada;4;49-01N;122-47W;;;15;; 71;786;CWYL;Yoho Park Automatic Weather Reporting System ;;Canada;;51-27N;116-20W;;;1615;; 71;798;CWPF;Esquimalt Harbour, B. C.;;Canada;4;48-26N;123-26W;;;3;; 71;799;CYYJ;Victoria Int. Airport, B. C.;;Canada;4;48-39N;123-26W;48-39N;123-26W;20;19;P 71;800;CWRA;Cape Race, Nfld;;Canada;4;46-39N;053-04W;;;27;28;P 71;801;CYYT;St. John's, Nfld;;Canada;4;47-37N;052-44W;47-40N;052-45W;134;140;P 71;802;CWDS;St. Lawrence, Nfld.;;Canada;4;46-55N;055-23W;;;46;49;P 71;803;CYQX;Gander Int. Airport, Nfld.;;Canada;4;48-57N;054-34W;48-57N;054-34W;151;151;P 71;804;CWZZ;Saglek Bay ;;Canada;4;58-20N;062-35W;;;483;; 71;805;LFVP;Saint-Pierre;;Saint Pierre and Miquelon;4;46-46N;056-10W;46-46N;056-10W;3;5;P 71;806;CWAG;La Scie, Nfld.;;Canada;4;49-55N;055-40W;;;192;194;P 71;807;CWAR;Argentia, Nfld;;Canada;4;47-18N;054-00W;47-17N;054-00W;16;16;P 71;808;CYBX;Blanc Sablon, Que.;;Canada;4;51-27N;057-11W;;;30;36;P 71;809;CYDF;Deer Lake, Nfld.;;Canada;4;49-13N;057-24W;;;17;22;P 71;810;CWBY;Port Menier, Que.;;Canada;4;49-50N;064-18W;;;53;53;P 71;811;CYZV;Sept-Iles, Que.;;Canada;4;50-13N;066-16W;50-13N;066-15W;55;55;P 71;813;CYNA;Natashquan, Que.;;Canada;4;50-11N;061-49W;;;7;11;P 71;814;CWDM;Chevery, Que.;;Canada;4;50-28N;059-38W;;;6;6;P 71;815;CYJT;Stephenville, Nfld.;;Canada;4;48-32N;058-33W;48-32N;058-33W;8;26;P 71;816;CYYR;Goose, Nfld.;;Canada;4;53-19N;060-25W;53-18N;060-22W;46;49;P 71;817;CWMH;Mary's Harbour, Nfld.;;Canada;4;52-18N;055-50W;;;10;11;P 71;818;CWCA;Cartwright, Nfld.;;Canada;4;53-42N;057-02W;;;14;14;P 71;819;CWAX;St. Anthony, Nfld.;;Canada;4;51-22N;055-38W;;;106;111;P 71;820;----;Barrage Angliers;;Canada;4;47-33N;079-14W;;;266;; 71;821;CYNM;Matagami, Que.;;Canada;4;49-46N;077-49W;;;281;281;P 71;822;CYMT;Chibougamau-Chapais, Que;;Canada;4;49-46N;074-32W;;;388;387;P 71;823;CYAH;La Grande Iv, Que.;;Canada;4;53-45N;073-40W;53-45N;073-40W;306;307;P 71;825;CYWK;Wabush Lake, Nfld.;;Canada;4;52-56N;066-52W;;;551;551;P 71;826;CWXP;Pangnirtung;;Canada;4;66-09N;065-44W;;;23;; 71;827;CYGL;La Grande Riviere, Que;;Canada;4;53-38N;077-42W;;;195;195;P 71;828;CYKL;Schefferville, Que.;;Canada;4;54-48N;066-48W;54-48N;066-49W;521;518;P 71;829;CWFW;Baie Comeau;;Canada;4;49-16N;068-09W;;;129;; 71;831;CYYU;Kapuskasing, Ont.;;Canada;4;49-25N;082-28W;;;227;227;P 71;832;CWNZ;Nagagami, Ont.;;Canada;4;49-45N;084-10W;;;259;263;P 71;834;CYGQ;Geraldton, Ont.;;Canada;4;49-47N;086-56W;49-42N;086-57W;349;349;P 71;836;CYMO;Moosonee, Ont.;;Canada;4;51-16N;080-39W;51-16N;080-39W;10;10;P 71;840;CXDW;Deerwood RCS , Man.;;Canada;4;49-24N;098-19W;;;341;; 71;841;CYYW;Armstrong, Ont.;;Canada;4;50-18N;089-02W;;;351;351;P 71;842;CYXL;Sioux Lookout, Ont.;;Canada;4;50-07N;091-54W;;;389;390;P 71;844;----;Big Trout Lake Remote Environment Automatic Data Acquisition Concept, Ont.;;Canada;4;53-48N;089-53W;;;222;224;P 71;845;CWPL;Pickle Lake, Ont.;;Canada;4;51-27N;090-12W;51-27N;090-12W;389;386;P 71;846;CWLF;Lansdowne House ;;Canada;4;52-14N;087-53W;;;242;; 71;848;CYTL;Big Trout Lake;;Canada;4;53-50N;089-52W;53-50N;089-52W;224;224; 71;850;CYQK;Kenora, Ont.;;Canada;4;49-47N;094-22W;;;407;410;P 71;851;CYPG;Portage Southport A;;Canada;4;49-54N;098-16W;;098-16W;269;259; 71;852;CYWG;Winnipeg Int. Airportman.;;Canada;4;49-54N;097-14W;49-54N;097-14W;239;239;P 71;853;CWLO;Shilo;;Canada;4;49-47N;099-38W;49-47N;099-38W;373;373; 71;854;CYRL;Red Lake, Ont.;;Canada;4;51-04N;093-48W;;;375;383;P 71;855;CYDN;Dauphin, Man.;;Canada;4;51-06N;100-03W;51-06N;100-03W;305;305;P 71;856;CYGM;Gimli Industrial, Man;;Canada;4;50-37N;097-02W;;;230;232;P 71;857;CWGU;Gypsumville;;Canada;4;51-40N;098-45W;;;265;; 71;858;CWJD;Grand Rapids, Man.;;Canada;4;53-11N;099-16W;;;223;223;P 71;859;CYBV;Berens River Airport;;Canada;4;52-21N;097-02W;;;222;; 71;861;CWIK;Broadview, Sask.;;Canada;4;50-23N;102-41W;50-23N;102-35W;598;602;P 71;862;CYEN;Estevan, Sask.;;Canada;4;49-13N;102-58W;;;572;581;P 71;863;CYQR;Regina, Sask.;;Canada;4;50-26N;104-40W;50-26N;104-40W;577;577;P 71;864;CYMJ;Moose Jaw, Sask.;;Canada;4;50-20N;105-33W;;;577;577;P 71;865;CWYO;Wynyard, Sask.;;Canada;4;51-46N;104-12W;;;561;561;P 71;866;CYXE;Saskatoon, Sask.;;Canada;4;52-10N;106-41W;52-10N;106-41W;501;504;P 71;867;CYQD;The Pas, Man.;;Canada;4;53-58N;101-06W;53-58N;101-06W;271;271;P 71;868;CYHB;Hudson Bay, Sask.;;Canada;4;52-49N;102-19W;;;357;358;P 71;869;CYPA;Prince Albert, Sask.;;Canada;4;53-13N;105-41W;53-13N;105-41W;428;428;P 71;870;CYYN;Swift Current, Sask.;;Canada;4;50-17N;107-41W;;;818;818;P 71;871;CYLL;Lloydminister, Alta.;;Canada;4;53-19N;110-04W;;;665;669;P 71;872;CYXH;Medicine Hat, Alta.;;Canada;4;50-01N;110-43W;;;717;717;P 71;873;CYCT;Coronation Marine Aviation Reporting Station ;;Canada;4;52-04N;111-27W;;;791;; 71;874;CYQL;Lethbridge, Alta.;;Canada;4;49-38N;112-48W;49-38N;112-48W;929;929;P 71;875;----;Pincher Creek Automated Reporting Station ;;Canada;4;49-31N;114-00W;;;1190;; 71;876;CYQW;North Battleford, Sask.;;Canada;4;52-46N;108-15W;;;548;548;P 71;877;CYYC;Calgary International, Alta.;;Canada;4;51-07N;114-01W;51-07N;114-01W;1077;1084;P 71;878;CYQF;Red Deer, Alta.;;Canada;4;52-11N;113-54W;52-11N;113-54W;905;905;P 71;879;CYXD;Edmonton Municipal Alta.;;Canada;4;53-34N;113-31W;53-34N;113-31W;671;671;P 71;880;CYXC;Cranbrook, B. C.;;Canada;4;49-37N;115-47W;;;939;939;P 71;881;CYET;Edson, Alta.;;Canada;4;53-35N;116-28W;;;921;927;P 71;882;CYRV;Revelstoke, B. C.;;Canada;4;50-58N;118-11W;;;443;443;P 71;883;CYCP;Blue River, B. C.;;Canada;4;52-08N;119-18W;;;679;683;P 71;884;CYCG;Castlegar Airport;;Canada;4;49-18N;117-38W;49-18N;117-38W;495;495; 71;886;CYDC;Princeton Airport ;;Canada;4;49-28N;120-31W;;;700;; 71;887;CYKA;Kamloops, B. C.;;Canada;4;50-42N;120-27W;;;345;346;P 71;888;CWJA;Jasper, Alta.;;Canada;4;52-53N;118-04W;;;1061;1061;P 71;889;CYYF;Penticton, B. C.;;Canada;4;49-28N;119-36W;;;344;344;P 71;890;CYCD;Nanaimo Airport;;Canada;4;49-03N;123-52W;;;28;; 71;891;CWLY;Lytton, B. C.;;Canada;4;50-14N;121-35W;;;229;229;P 71;892;CYVR;Vancouver International Air-Port, B. C.;;Canada;4;49-11N;123-10W;49-11N;123-10W;3;2;P 71;893;CYQQ;Comox, B. C.;;Canada;4;49-43N;124-54W;49-43N;124-54W;24;24;P 71;894;CWEB;Estevan Point, B. C.;;Canada;4;49-23N;126-33W;;;7;;P 71;896;CYXS;Prince George, B. C.;;Canada;4;53-53N;122-41W;53-53N;122-40W;691;691;P 71;897;CWMS;Mcinnes Island, B. C.;;Canada;4;52-16N;128-43W;;;25;26;P 71;898;CYPR;Prince Rupert, B. C.;;Canada;4;54-18N;130-26W;;;34;34;P 71;899;CWLA;Langara, B. C.;;Canada;4;54-15N;133-08W;;;41;; 71;900;CWHO;Hopedale Meteorological Aeronautical Presentation System ;;Canada;4;55-27N;060-14W;;;8;; 71;901;CWTB;Border, Que.;;Canada;4;55-20N;063-13W;;;479;479;P 71;902;CYDP;Nain, Nfld;;Canada;4;56-33N;061-41W;;;6;7;P 71;904;CYHA;Quaqtaq Airport;;Canada;4;61-03N;069-38W;;;30;; 71;905;CYGW;Kuujjuarapik, Que.;;Canada;4;55-17N;077-46W;;;21;10;P 71;906;CYVP;Kuujjuaq, Que.;;Canada;4;58-06N;068-25W;58-06N;068-25W;37;37;P 71;907;CWPH;Inukjuak, Que;;Canada;4;58-27N;078-07W;58-27N;078-07W;3;6;P 71;909;CYFB;Iqaluit, N. W. T.;;Canada;4;63-45N;068-33W;63-45N;068-33W;34;34;P 71;910;CYTE;Cape Dorset, N. W. T.;;Canada;4;64-13N;076-32W;;;51;50;P 71;911;CYUS;Shepherd Bay, N. W. T.;;Canada;4;68-49N;093-26W;;;51;42;P 71;912;CYGX;Gillam, Man.;;Canada;4;56-21N;094-42W;;;145;145;P 71;913;CYYQ;Churchill, Man.;;Canada;4;58-44N;094-04W;58-44N;094-05W;28;29;P 71;915;CYZS;Coral Harbour, N. W. T.;;Canada;4;64-12N;083-22W;64-12N;083-22W;64;64;P 71;917;CWEU;Eureka, N. W. T.;;Canada;4;79-59N;085-56W;79-59N;085-56W;10;10;P 71;918;CWRF;Pelly Bay 1;;Canada;4;69-26N;089-44W;;;325;; 71;919;CWKE;Pelly Bay;;Canada;4;68-26N;089-43W;;;326;; 71;920;CWFN;Cree Lake Meteorological Aeronautical Presentation System ;;Canada;4;57-21N;107-08W;57-21N;107-08W;495;497; 71;922;CYVC;La Ronge, Sask;;Canada;4;55-09N;105-16W;;;375;379;P 71;923;CWJC;Ennadai Lake Meteorological Aeronautical Presentation System ;;Canada;4;61-08N;100-54W;;;357;; 71;924;CYRB;Resolute, N. W. T.;;Canada;4;74-43N;094-59W;74-42N;094-58W;67;67;P 71;925;CYCB;Cambridge Bay, N. W. T.;;Canada;4;69-06N;105-07W;69-08N;105-04W;23;27;P 71;926;CYBK;Baker Lake, N. W. T.;;Canada;4;64-18N;096-05W;64-18N;096-00W;18;18;P 71;928;CYRM;Rocky Mountain House, Alta;;Canada;4;52-26N;114-55W;52-23N;114-55W;988;988;P 71;929;CYUK;Byron Bay Airport;;Canada;4;68-45N;109-04W;;;92;; 71;930;CYZU;Whitecourt, Alta.;;Canada;4;54-09N;115-47W;;;783;782;P 71;931;CWLB;Lac La Biche, Alta.;;Canada;4;54-46N;112-01W;;;565;567;P 71;932;CYMM;Fort Mcmurray, Alta.;;Canada;4;56-39N;111-13W;56-39N;111-13W;369;369;P 71;933;CYPY;Fort Chipewyan, Alta.;;Canada;4;58-46N;111-07W;;;232;232;P 71;934;CYSM;Fort Smith, N. W. T.;;Canada;4;60-01N;111-57W;60-02N;111-56W;203;205;P 71;935;CYHY;Hay River, N. W. T.;;Canada;4;60-50N;115-47W;;;164;166;P 71;936;CYZF;Yellowknife, N. W. T.;;Canada;4;62-28N;114-27W;;;205;206;P 71;937;CYUJ;Lady Franklin Point, N. W. T.;;Canada;4;68-30N;113-13W;;;21;16;P 71;938;CYCO;Coppermine, N. W. T.;;Canada;4;67-49N;115-08W;67-50N;115-07W;22;22;P 71;939;CYUI;Cape Young Airport;;Canada;4;68-56N;116-55W;;;16;; 71;940;CYQU;Grande Prairie, Alta.;;Canada;4;55-11N;118-53W;;;666;669;P 71;943;CYXJ;Fort St John, B. C.;;Canada;4;56-14N;120-44W;;;695;695;P 71;944;CYZY;Mackenzie, B. C.;;Canada;4;55-18N;123-08W;;;695;690;P 71;945;CYYE;Fort Nelson, B. C.;;Canada;4;58-50N;122-35W;58-50N;122-36W;382;382;P 71;946;CYFS;Fort Simpson, N. W. T.;;Canada;4;61-45N;121-14W;;;168;169;P 71;948;CZUE;Cape Parry, N. W. T.;;Canada;4;70-10N;124-42W;;;17;17;P 71;949;CWUM;Faro, Y. T.;;Canada;4;62-14N;133-21W;;;717;717;P 71;950;CYYD;Smithers, B. C.;;Canada;4;54-49N;127-11W;;;523;523;P 71;951;CYXT;Terrace, B. C.;;Canada;4;54-28N;128-35W;;;217;217;P 71;952;CYPZ;Burns Lake ;;Canada;4;54-23N;125-57W;;;713;; 71;953;CYQH;Watson Lake, Y. T.;;Canada;4;60-07N;128-49W;60-07N;128-49W;690;690;P 71;954;CYUB;Tuktoyaktuk ;;Canada;4;69-27N;133-01W;69-27N;133-01W;5;5; 71;955;CZST;Stewart Airport;;Canada;4;55-56N;129-59W;;;7;; 71;956;CWRP;Nicholson Peninsul ;;Canada;4;69-56N;128-58W;;;89;; 71;957;CYEV;Inuvik, N. W. T.;;Canada;4;68-18N;133-29W;68-19N;133-32W;59;68;P 71;958;CWDL;Dease Lake B. C.;;Canada;4;58-25N;130-00W;;;816;816;P 71;960;CWLI;Liverpool Bay;;Canada;4;69-36N;130-54W;;;102;; 71;963;CWQY;Hanbury River Automated Reporting Station ;;Canada;4;63-35N;105-09W;;;317;; 71;964;CYXY;Whitehorse, Y. T.;;Canada;4;60-43N;135-04W;60-43N;135-04W;703;703;P 71;965;CYMA;Mayo Airport;;Canada;4;63-37N;135-52W;;;504;; 71;966;CYDA;Dawson, Y. T.;;Canada;4;64-03N;139-08W;;;370;370;P 71;967;CWDB;Burwash Automatic Weather Reporting System ;;Canada;4;61-22N;139-03W;;;806;; 71;968;CYUA;Shingle Point, Y. T.;;Canada;4;68-57N;137-13W;;;56;38;P 71;969;CYAJ;Komakuk Beach Airport;;Canada;4;69-35N;140-11W;;;7;; 71;972;CWRH;Resolution Island, N. W. T.;;Canada;4;61-35N;64-39W;;;369;; 71;974;CWSQ;Aulvik National Park;;Canada;4;74-08N;119-59W;;;32;; 71;975;CWYM;Cape Mercy;;Canada;4;64-57N;063-35W;;;583;; 71;976;CWNO;Satah River Automatic Weather Reporting System;;Canada;4;66-52N;134-12W;;;86;; 71;978;CWOI;Ivvavik Park Automatic Weather Reporting System;;Canada;4;69-09N;140-09W;;;244;; 71;979;CWPA;Henderickson Automatic Weather Reporting System;;Canada;4;53-47N;118-26W;;;1542;; 71;980;CWQF;Rabbit Kettle Automated Reporting Station;;Canada;4;61-58N;127-13W;;;634;; 71;981;CWMU;Rampart River Automatic Weather Reporting System ;;Canada;4;65-57N;130-28W;;;155;; 71;982;CWNW;Haldane River Automatic Weather Reporting System;;Canada;4;67-04N;121-06W;;;186;; 71;984;CZPK;Paulatuk Automated Reporting Station ;;Canada;4;69-21N;124-03W;;;6;; 71;985;CZUB;Tuktoyaktuk Automated Reporting Station ;;Canada;4;69-26N;133-02W;;;6;; 71;986;CWMV;St Charles Creek;;Canada;4;64-45N;124-13W;;;341;; 71;988;CWVU;Brier Island, N. S.;;Canada;4;44-17-09N;066-20-48W;;;16;; 72;201;KEYW;KEY WEST INTERNATIONAL AIRPORT ;FL;United States;4;24-33N;81-46W;24-33-11N;081-45-24W;1;5; 72;202;KMIA;MIAMI INTERNATIONAL AIRPORT ;FL;United States;4;25-47N;080-19W;25-48-12N;080-17-49W;4;8; 72;203;KPBI;PALM BEACH INTERNATIONAL;FL;United States;4;26-41N;80-06W;26-40-40N;080-06-30W;6;6; 72;204;KMLB;MELBOURNE INTERNATIONAL;FL;United States;4;28-06N;080-39W;28-05-57N;080-38-36W;10;10; 72;205;KMCO;ORLANDO INTERNATIONAL AIRPORT ;FL;United States;4;28-25N;81-20W;28-25-52N;081-18-38W;29;29; 72;206;KJAX;JACKSONVILLE INTERNATIONAL;FL;United States;4;30-30N;81-42W;30-29-38N;081-40-52W;9;7; 72;207;KSAV;SAVANNAH INTERNATIONAL AIRPORT ;GA;United States;4;32-07N;81-12W;32-07-34N;081-11-55W;16;14; 72;208;KCHS;CHARLESTON INT'L AIRPORT;SC;United States;4;32-54N;080-02W;32-53-40N;080-01-40W;14;13; 72;209;KLHW;Ft. Stewart;GA;United States;4;31-53N;081-34W;31-53N;081-34W;14;14; 72;210;KTBW;Tampa Bay Area;FL;United States;4;27-42N;082-24W;27-42N;082-24W;12;13;P 72;211;KTPA;TAMPA INTERNATIONAL AIRPORT ;FL;United States;4;27-58N;082-32W;27-58-04N;082-31-33W;8;11; 72;212;KCTY;CROSS CITY AIRPORT;FL;United States;4;29-38N;083-06W;29-37-49N;083-06-31W;13;12; 72;213;KAYS;Waycross / Ware County, Ga;GA;United States;4;31-15N;082-24W;31-15N;082-24W;46;46;P 72;214;KTLH;TALLAHASSEE REGIONAL AIRPORT ;FL;United States;4;30-24N;84-21W;30-23-46N;084-21-20W;25;16; 72;215;----;Peachtree City, Ga.;GA;United States;4;33-22N;084-34W;33-22N;084-34W;262;244; 72;216;KABY;ALBANY SOUTHWEST GEORGIA;GA;United States;4;31-32N;084-12W;31-32-12N;084-14-3W;60;58; 72;217;KMCN;MIDDLE GEORGIA REGIONAL AIRPORT ;GA;United States;4;32-41N;83-39W;32-42-05N;083-38-53W;108;109; 72;218;KAGS;AUGUSTA BUSH FIELD;GA;United States;4;33-22N;081-58W;33-22-18N;081-58-27W;44;44; 72;219;KATL;HARTSFIELD-JACKSON ATLANTA;GA;United States;4;33-39N;84-26W;;;313;; 72;220;KAQQ;Apalachicola, Apalachicola;FL;United States;4;29-43-37N;085-01-29W;29-43-20N;085-01-32W;6;5;P 72;221;KVPS;Valparaiso / Eglin Air Force Base;FL;United States;4;30-29N;086-31W;30-29N;086-31W;26;29;P 72;223;KMOB;MOBILE REGIONAL AIRPORT;AL;United States;4;30-41N;88-14W;30-40-58N;088-14-30W;66;67; 72;224;----;Cape San Blas, Fl.;;United States;4;29-41N;085-22W;;;2;; 72;225;KLSF;Fort Benning;GA;United States;4;32-20N;084-50W;32-20N;084-50W;71;130; 72;226;KMGM;MONTGOMERY DANNELLY FIELD;AL;United States;4;32-18N;86-24W;32-18-17N;086-23-27W;67;63; 72;227;KMGE;Marietta / Dobbins Air Force Base;GA;United States;4;33-55N;084-31W;;;326;326;P 72;228;KBHM;BIRMINGHAM INT'L AIRPORT;AL;United States;4;33-34N;086-45W;33-33-48N;086-44-42W;196;197; 72;229;KCKL;Centreville;AL;United States;4;32-54N;087-15W;32-54N;087-15W;140;140;P 72;230;----;Shelby Country Airport, Al.;AL;United States;4;33-10N;086-46W;33-10N;086-46W;178;178; 72;231;KMSY;NEW ORLEANS INTERNATIONAL AIRPORT;LA;United States;4;30-00N;90-15W;29-59-11N;090-15-31W;2;5; 72;232;KBVE;Boothville;LA;United States;4;29-20N;089-24W;29-20N;089-24W;0;1; 72;233;KLIX;Slidell;LA;United States;4;30-20N;089-49W;30-20N;089-49W;8;8; 72;234;KMEI;MERIDIAN KEY FIELD;MS;United States;4;32-20N;088-45W;32-20-03N;088-44-25W;91;89; 72;235;KJAN;Jackson, Jackson International Airport;MS;United States;4;32-19-11N;090-04-39W;32-19-08N;090-04-49W;105;89;P 72;239;KPOE;Fort Polk, Polk AAF Ft Polk;LA;United States;4;31-03N;093-11-38W;;;101;; 72;240;KLCH;LAKE CHARLES REGIONAL AIRPORT ;LA;United States;4;30-12N;093-23W;30-07-29N;093-12-55W;5;3; 72;241;KBPT;SOUTHEAST TEXAS RGNL AIRPORT;TX;United States;4;29-57N;094-08W;29-57-27N;094-01-21W;5;5; 72;242;KGLS;SCHOLES FIELD;TX;United States;4;29-16N;094-52W;29-16-05N;094-51-18W;2;6; 72;243;KIAH;HOUSTON INTERCONTINENTAL;TX;United States;4;30-00N;095-22W;29-58-25N;095-20-33W;30;36; 72;247;KGGG;LONGVIEW GREGG COUNTY AIRPORT ;TX;United States;4;32-23N;094-43W;32-22-48N;094-42-43W;111;107; 72;248;KSHV;SHREVEPORT REGIONAL AIRPORT;LA;United States;4;32-27N;93-50W;32-27-02N;093-50-01W;79;80; 72;249;KFWD;Fort Worth;TX;United States;4;32-50N;097-18W;32-50N;097-18W;196;196; 72;250;KBRO;BROWNSVILLE/SOUTH PADRE IS;TX;United States;4;25-54N;97-25W;25-54-22N;097-25-54W;7;5; 72;251;KCRP;CORPUS CHRISTI INTERNATIONAL ;TX;United States;4;27-46N;97-31W;27-46-26N;097-29-59W;13;16; 72;252;KLRD;Laredo, Laredo International Airport;TX;United States;4;27-32-37N;099-27-41W;;;155;; 72;253;KSAT;SAN ANTONIO INTERNATIONAL AIRPORT ;TX;United States;4;29-32N;098-28W;29-31-42N;098-28-25W;247;243; 72;254;KATT;CAMP MABRY/AUSTIN CITY ASOS;TX;United States;4;30-19N;097-46W;;;201;; 72;255;KVCT;VICTORIA REGIONAL AIRPORT;TX;United States;4;28-52N;96-56W;28-50-43N;096-55-13W;35;31; 72;256;KACT;WACO REGIONAL AIRPORT;TX;United States;4;31-36N;97-13W;31-36-33N;097-13-18W;157;151; 72;257;KHLR;Fort Hood, Hood AAF Ft Hood;TX;United States;4;31-08N;097-42W;;;282;; 72;259;KDFW;DALLAS/FT. WORTH INTERNATIONAL AIRPORT ;TX;United States;4;32-54N;097-02W;32-53-07N;097-01-18W;184;174; 72;260;KSEP;Stephenville, Clark Field Municipal Airport;TX;United States;4;32-13N;098-11W;32-13N;098-11W;403;402; 72;261;KDRT;DEL RIO INTERNATIONAL AIRPORT;TX;United States;4;29-22N;100-55W;29-22-28N;100-55-06W;304;313; 72;262;KGDP;GUADALUPE PASS;TX;United States;4;31-50N;104-49W;;;1663;1692; 72;263;KSJT;MATHIS FIELD;TX;United States;4;31-21N;100-30W;31-21-22N;100-30-10W;584;581; 72;264;KMRF;Marfa;TX;United States;4;30-22N;104-01W;;;1478;1481;P 72;265;KMAF;MIDLAND INTERNATIONAL AIRPORT ;TX;United States;4;31-56N;102-12W;31-56-38N;102-11-23W;875;872; 72;266;KABI;ABILENE REGIONAL AIRPORT;TX;United States;4;32-25N;099-41W;32-24-45N;099-40-52W;546;548; 72;267;KLBB;LUBBOCK INTERNATIONAL AIRPORT ;TX;United States;4;33-40N;101-49W;33-39-30N;101-48-52W;1000;992; 72;268;KROW;ROSWELL INDUSTRIAL AIR CENTR;NM;United States;4;33-18N;104-32W;33-18-25N;104-31-38W;1118;1112; 72;269;K2C2;White Sands;NM;United States;4;32-23N;106-29W;32-24N;106-22W;1244;1244; 72;270;KELP;EL PASO INTERNATIONAL AIRPORT ;TX;United States;4;31-49N;106-23W;31-47-50N;106-23-28W;1206;1197; 72;271;KTCS;TRUTH OR CONSEQUENCES MUNI;NM;United States;4;33-14N;107-16W;33-14-17N;107-16-08W;1478;1469; 72;272;KSVC;Silver City / Grant;NM;United States;4;32-38N;108-09W;;;1659;; 72;273;KFHU;Fort Huachuca, Libby AAF Ft Huachuca;AZ;United States;4;31-35N;110-20W;;;1438;; 72;274;KTUS;TUCSON INTERNATIONAL AIRPORT ;AZ;United States;4;32-08N;110-57W;32-07-28N;110-56-25W;805;786; 72;276;KRQE;WINDOW ROCK AIRPORT;AZ;United States;4;35-39N;109-04W;35-39-34N;109-03-31W;2054;2055; 72;278;KPHX;Phoenix, Phoenix Sky Harbor International Airport;AZ;United States;4;33-26-03N;112-03-04W;33-26-07N;112-00-33W;345;336;P 72;280;KYUM;Yuma / Yuma International;AZ;United States;4;32-39N;114-36W;32-52N;114-20W;65;63;P 72;281;KNJK;El Centro, Naval Air Facility;CA;United States;4;32-49-30N;115-39-38W;32-49-28N;115-40-22W;-13;-13; 72;282;KBJN;Las Vegas, Tonopah Range #74 Nellis AFB;NV;United States;4;37-37-02N;116-15-51W;;;1756;; 72;286;KRIV;Riverside / March Air Force Base;CA;United States;4;33-54N;117-15W;;;469;468; 72;288;KBUR;BURBANK-GLENDALE-PASADENA;CA;United States;4;34-12N;118-22W;34-11-58N;118-21-11W;236;217; 72;289;KMWS;Mount Wilson;CA;United States;4;34-14N;118-04W;;;1739;; 72;290;KSAN;SAN DIEGO INTERNATIONAL \LINDBERGH FLD;CA;United States;4;32-44N;117-11W;32-44-11N;117-11-22W;5;12; 72;291;KNSI;SAN NICOLAS ISLAND;CA;United States;4;33-14N;119-28W;33-14-25N;119-27-31W;154;153; 72;292;KAVX;AVALON CATALINA AIRPORT;CA;United States;4;33-24N;118-25W;33-24-12N;118-24-48W;488;482; 72;293;KNKX;MCAS MIRAMAR;CA;United States;4;32-52N;117-09W;32-52-28N;117-08-20W;146;146; 72;295;KLAX;LOS ANGELES INTERNTL AIRPORT;CA;United States;4;33-56N;118-23W;33-56-41N;118-24-10W;38;46; 72;297;KLGB;LONG BEACH AIRPORT;CA;United States;4;33-49N;118-09W;33-48-42N;118-08-57W;17;10; 72;303;KPOB;Pope Air Force Base;NC;United States;4;35-10N;079-02W;35-10N;079-02W;61;61; 72;304;KHAT;Cape Hatteras;NC;United States;4;35-16N;075-33W;35-16N;075-33W;2;3;P 72;305;KMHX;Newport;NC;United States;4;34-47N;076-53W;34-47N;076-53W;11;11; 72;306;KRDU;RALEIGH-DURHAM INTERNATIONAL AIRPORT;NC;United States;4;35-54N;078-46W;35-52-59N;078-47-01W;133;130; 72;308;KORF;NORFOLK INTERNATIONAL AIRPORT ;VA;United States;4;36-54N;076-12W;36-53-28N;076-17-06W;8;14; 72;309;KNKT;Cherry Point, Marine Corps Air Station;NC;United States;4;34-53-52N;076-52-51W;34-54-35N;076-53-16W;8;9; 72;310;KCAE;COLUMBIA METROPOLITAN AIRPORT ;SC;United States;4;33-57N;081-07W;33-56-43N;081-07-22W;72;73; 72;311;KAHN;ATHENS BEN EPPS AIRPORT;GA;United States;4;33-57N;083-20W;33-57-05N;083-19-25W;246;244; 72;312;KGSP;GREER GREENVILLE SPARTBURG;SC;United States;4;34-53N;82-13W;34-53-00N;082-13-13W;296;286; 72;314;KCLT;CHARLOTTE/DOUGLAS INTERNATIONAL ;NC;United States;4;35-13N;80-57W;35-13-25N;080-56-46W;228;220; 72;315;KAVL;ASHEVILLE REGIONAL AIRPORT;NC;United States;4;35-26N;82-32W;35-26-04N;082-32-14W;660;670; 72;317;KGSO;PIEDMONT TRIAD INTERNATIONAL AIRPORT ;NC;United States;4;36-06N;079-57W;36-05-53N;079-56-38W;282;275; 72;318;----;Blacksburg, Va.;VA;United States;4;37-12N;080-25W;37-12N;080-25W;653;654;P 72;320;KRMG;ROME R. B. RUSSELL AIRPORT;GA;United States;4;34-21N;085-10W;34-21-09N;085-09-44W;195;193; 72;323;KHSV;HUNTSVILLE INTERNATIONAL JONES FIELD;AL;United States;4;34-39N;086-47W;34-38-46N;086-46-16W;192;191; 72;324;KCHA;LOVELL FIELD;TN;United States;4;35-02N;085-12W;35-01-31N;085-12-06W;208;210; 72;326;KTYS;MCGHEE TYSON AIRPORT;TN;United States;4;35-49N;083-59W;35-49-29N;083-59-10W;299;302; 72;327;KBNA;NASHVILLE INTERNATIONAL AIRPORT;TN;United States;4;36-07N;086-41W;36-06-59N;086-40-31W;183;210; 72;332;KTUP;TUPELO REGIONAL AIRPORT;MS;United States;4;34-16N;88-46W;34-15-54N;088-45-59W;105;105; 72;334;KMEM;MEMPHIS INTERNATIONAL AIRPORT ;TN;United States;4;35-02N;089-59W;35-03-00N;089-58-45W;102;86; 72;340;KLZK;North Little Rock, North Little Rock Airport;AR;United States;4;34-50N;092-15W;34-50N;092-15W;165;165;P 72;341;----;Page, Ok.;;United States;4;34-41N;094-37W;;;;883;P 72;342;KRUE;RUSSELVILLE MUNICIPAL AIRPORT ;AR;United States;4;35-15N;93-06W;35-15-35N;093-05-48W;123;115; 72;344;KFSM;FORT SMITH REGIONAL AIRPORT;AR;United States;4;35-20N;94-22W;35-20-16N;094-22-12W;143;140; 72;348;----;West Plains, Mo;MO;United States;4;36-44N;091-51W;;;307;308; 72;349;----;Monette Mo.;;United States;4;36-53N;093-54W;;;437;437;P 72;351;KSPS;WICHITA FALLS SHEPPARD AFB;TX;United States;4;33-59N;98-30W;33-58-25N;098-30-07W;309;308; 72;352;KLTS;Altus Air Force Base;OK;United States;4;34-39N;099-16W;34-39N;099-16W;420;420; 72;353;KOKC;WILL ROGERS WORLD AIRPORT;OK;United States;4;35-23N;97-36W;35-24-05N;097-36-04W;395;390; 72;354;KTIK;Tinker Air Force Base;OK;United States;4;35-25N;097-23W;35-25N;097-23W;394;397; 72;355;KFSI;Fort Sill;OK;United States;4;34-36N;098-24W;34-39N;098-24W;362;360; 72;356;KTUL;TULSA INTERNATIONAL AIRPORT;OK;United States;4;36-12N;95-53W;36-11-32N;095-54-13W;206;207; 72;357;KOUN;Norman / Max Westheimer;OK;United States;4;35-13N;097-27W;35-13N;097-27W;357;357; 72;360;KCAO;CLAYTON MUNICIPAL AIRPARK;NM;United States;4;36-27N;103-09W;36-26-46N;103-09-18W;1513;1514; 72;362;KONM;Socorro Municipal;NM;United States;4;34-01N;106-54W;;;1478;; 72;363;KAMA;AMARILLO INTERNATIONAL AIRPORT;TX;United States;4;35-13N;101-43W;35-13-58N;101-42-28W;1099;1093; 72;364;KEPZ;Santa Teresa;NM;United States;4;31-52N;106-42W;31-52N;106-42W;1252;1252;P 72;365;KABQ;ALBUQUERQUE INTERNATIONAL AIRPORT;NM;United States;4;35-02N;106-36W;35-02-13N;106-37-18W;1631;1618; 72;370;KIGM;KINGMAN AIRPORT;AZ;United States;4;35-15N;113-56W;35-15-35N;113-56-31W;1050;1032; 72;371;KPGA;PAGE MUNICIPAL AIRPORT;AZ;United States;4;36-56N;111-27W;36-55-15N;111-26-53W;1314;1307; 72;374;KINW;WINSLOW MUNICIPAL AIRPORT;AZ;United States;4;35-02N;110-43W;35-01-17N;110-43-02W;1505;1490; 72;376;----;Flagstaff, Az.;AZ;United States;4;35-14N;111-49W;35-14N;111-49W;2192;2192; 72;381;KEDW;Edwards Air Force Base;CA;United States;4;34-55N;117-54W;34-54N;117-55W;702;705; 72;382;KPMD;PALMDALE PROD FLIGHT PLANT;CA;United States;4;34-38N;118-05W;34-37-12N;118-04-50W;775;780; 72;383;KSDB;SANDBERG;CA;United States;4;34-45N;118-43W;34-44-37N;118-43-27W;1379;1377; 72;384;KBFL;BAKERSFIELD MEADOWS FIELD;CA;United States;4;35-26N;119-03W;35-26-02N;119-03-06W;155;151; 72;386;KLAS;MCCARRAN INTERNATIONAL AIRPORT ;NV;United States;4;36-07N;115-16W;36-04-58N;115-08-47W;663;636; 72;387;KDRA;DESERT ROCK AIRPORT;NV;United States;4;36-38N;116-02W;36-37-27N;116-01-06W;1010;1006; 72;389;KFAT;FRESNO AIR TERMINAL;CA;United States;4;36-47N;119-43W;36-47-13N;119-43-01W;101;104; 72;390;K87Q;Point Piedras Blanca;CA;United States;4;35-39-56N;121-17-05W;;;17;27;P 72;391;KNTD;NAWCWPNS POINT MUGU, CA;CA;United States;4;34-07N;119-07W;34-06-46N;119-07-04W;4;2; 72;393;KVBG;Lompoc, Vandenberg Air Force Base;CA;United States;4;34-43-46N;120-34-36W;34-44N;120-33W;112;121;P 72;394;KSMX;SANTA MARIA PUBLIC AIRPORT;CA;United States;4;34-54N;120-28W;34-53-57N;120-26-56W;79;74; 72;401;KRIC;RICHMOND INTERNATIONAL AIRPORT;VA;United States;4;37-31N;077-19W;37-30-34N;077-19-55W;51;50; 72;402;KWAL;WALLOPS FLIGHT FAC AIRPORT ;VA;United States;4;37-56N;075-28W;37-56-26N;075-28-01W;12;14; 72;403;KIAD;DULLES INTERNATIONAL AIRPORT;VA;United States;4;38-56N;077-27W;38-57-06N;077-26-37W;95;93; 72;404;KNHK;NAS PATUXENT RIVER MD;MD;United States;4;38-18N;76-24W;38-17-20N;076-25-23W;12;6; 72;405;KDCA;WASHINGTON NATIONAL AIRPORT ;VA;United States;4;38-51N;077-02W;38-50-56N;077-02-29W;5;18; 72;406;KBWI;BALTIMORE-WASHINGTON INTERNATIONAL ;MD;United States;4;39-10N;076-41W;39-10-44N;076-40-11W;45;59; 72;407;KACY;ATLANTIC CITY INTERNATIONAL;NJ;United States;4;39-28N;74-35W;39-26-58N;074-34-02W;23;35; 72;408;KPHL;PHILADELPHIA INTERNATIONAL AIRPT;PA;United States;4;39-52N;075-14W;39-52-34N;075-14-37W;6;18; 72;409;KNEL;Lakehurst Naval Air Station;NJ;United States;4;40-02N;074-19W;40-02N;074-19W;31;24; 72;410;KLYH;LYNCHBURG REGIONAL AIRPORT;VA;United States;4;37-19N;079-12W;37-19-45N;079-12-09W;286;295; 72;411;KROA;ROANOKE REGIONAL AIRPORT;VA;United States;4;37-19N;079-58W;37-19-32N;079-58-34W;358;362; 72;412;KBKW;RALEIGH COUNTY MEM AIRPORT ;WV;United States;4;37-48N;081-07W;37-47-00N;081-07-16W;763;764; 72;414;KCRW;YEAGER AIRPORT;WV;United States;4;38-22N;081-36W;38-21-44N;081-35-24W;299;309; 72;417;KEKN;JENNINGS RANDOLPH FIELD;WV;United States;4;38-53N;079-51W;38-53-01N;079-51-17W;606;603; 72;421;KCVG;CINCINNATI/NORTHERN KY INTERNATIONAL ;KY;United States;4;39-03N;084-40W;39-03-17N;084-39-40W;273;269; 72;422;KLEX;LEXINGTON BLUE GRASS AIRPORT;KY;United States;4;38-02N;084-36W;38-02-13N;084-35-54W;299;300; 72;423;KSDF;STANDIFORD FIELD;KY;United States;4;38-11N;085-44W;38-10-44N;085-43-50W;151;146; 72;424;KFTK;Fort Knox;KY;United States;4;37-54N;085-58W;37-54N;085-58W;230;230; 72;425;KHTS;TRI-STATE AIRPORT;WV;United States;4;38-22N;082-33W;38-22-09N;082-33-18W;252;254; 72;426;----;Wilmington, Oh.;OH;United States;4;39-25N;083-49W;39-25N;083-49W;317;317;P 72;428;KCMH;PORT COLUMBUS INTERNATIONAL AIRPORT;OH;United States;4;40-00N;82-53W;40-00-24N;082-53-15W;248;247; 72;429;KDAY;COX DAYTON INTERNATIONAL;OH;United States;4;39-54N;084-13W;39-54-16N;084-12-20W;308;305; 72;432;KEVV;EVANSVILLE REGIONAL;IN;United States;4;38-02N;087-32W;38-01-53N;087-32-16W;127;117; 72;433;KSLO;Salem, Salem-Leckrone Airport;IL;United States;4;38-38-34N;088-57-51W;38-39N;088-58W;175;174; 72;434;KSTL;LAMBERT-ST LOUIS INTERNATIONAL AIRPORT ;MO;United States;4;38-45N;90-22W;38-45-06N;090-21-07W;184;171; 72;435;KPAH;BARKLEY REGIONAL AIRPORT;KY;United States;4;37-03N;088-46W;37-04-07N;088-46-20W;125;118; 72;438;KIND;INDIANAPOLIS INTERNATIONAL AIRPORT ;IN;United States;4;39-43N;86-17W;39-42-29N;086-16-47W;243;242; 72;440;KSGF;SPRINGFIELD-BRANSON NATIONAL;MO;United States;4;37-14N;93-23W;37-14-26N;093-23-28W;386;389; 72;445;KCOU;COLUMBIA REGIONAL AIRPORT;MO;United States;4;38-49N;092-13W;38-49-06N;092-13-14W;271;271; 72;446;KMCI;KANSAS CITY INTERNATIONAL AIRPORT;MO;United States;4;39-18N;94-44W;39-17-57N;094-43-03W;313;320; 72;449;KSTJ;ROSECRANS MEMORIAL AIRPORT;MO;United States;4;39-46N;94-55W;39-46-14N;094-54-10W;252;247; 72;450;KICT;WICHITA MID-CONTINENT AIRPORT ;KS;United States;4;37-39N;97-26W;37-39-16N;097-26-35W;406;408; 72;451;KDDC;DODGE CITY REGIONAL AIRPORT;KS;United States;4;37-46N;99-58W;37-45-45N;099-58-08W;791;789; 72;452;KP28;MEDICINE LODGE;KS;United States;4;37-17N;098-33W;;;469;469; 72;455;KFRI;Fort Riley, Marshall AAF Ft Riley;KS;United States;4;39-03-20N;096-45-51W;;;324;; 72;456;KTOP;TOPEKA BILLARD MUNICIPAL AIRPORT;KS;United States;4;39-04N;95-38W;39-04-21N;095-37-50W;269;268; 72;458;KCNK;Concordia, Blosser Municipal Airport;KS;United States;4;39-33-05N;097-39-02W;39-33-00N;097-39-15W;453;447;P 72;460;K1K5;Elkhart / Elkhart-Morton County Airport;KS;United States;4;37-00N;101-53W;;;1102;1102;P 72;462;KALS;SAN LUIS VALLEY REGIONAL;CO;United States;4;37-26N;105-52W;37-26-36N;105-51-52W;2297;2299; 72;464;KPUB;PUEBLO MEMORIAL AIRPORT;CO;United States;4;38-17N;104-30W;38-17-03N;104-29-43W;1440;1420; 72;465;KGLD;GOODLAND RENNER FIELD;KS;United States;4;39-22N;101-42W;39-22-12N;101-41-53W;1114;1114; 72;466;KCOS;COLORADO SPRINGS MUNI;CO;United States;4;38-49N;104-43W;38-48-31N;104-43-14W;1885;1856; 72;468;KFCS;Fort Carson;CO;United States;4;38-42N;104-46W;38-42N;104-46W;1789;1789; 72;469;KDNR;Denver / Stapleton International, Co.;CO;United States;4;39-47N;104-52W;39-45N;104-52W;1626;1626;P 72;470;KPUC;PRICE CARBON COUNTY AIRPORT;UT;United States;4;39-37N;110-45W;39-36-41N;110-44-55W;1814;2091; 72;476;KGJT;GRAND JUNCTION WALKER FIELD;CO;United States;4;39-08N;108-32W;39-07-00N;108-32-00W;1481;1452; 72;480;KBIH;BISHOP AIRPORT;CA;United States;4;37-22N;118-22W;37-22-15N;118-21-59W;1256;1253; 72;481;KMER;Merced / Castle Air Force Base;CA;United States;4;37-22N;120-34W;37-23N;120-34W;57;60; 72;483;KSAC;SACRAMENTO EXECUTIVE AIRPORT ;CA;United States;4;38-30N;121-30W;38-30-50N;121-29-49W;6;11; 72;486;KELY;ELY AIRPORT (YELLAND FIELD);NV;United States;4;39-18N;114-51W;39-17-35N;114-50-32W;1907;1906; 72;487;KP38;Caliente;NV;United States;4;37-36-44N;114-31-35W;37-36-44N;114-31-35W;1333;1333;P 72;488;KRNO;RENO/TAHOE INTERNATIONAL AIRPORT;NV;United States;4;39-29N;119-46W;39-29-53N;119-46-24W;1345;1342; 72;489;----;Reno, Nv.;NV;United States;4;39-34N;119-48W;39-34N;119-47W;1463;1516; 72;491;----;Monterey / Naf, Ca.;CA;United States;4;36-36N;121-51W;36-36N;121-51W;46;46; 72;492;KSCK;STOCKTON METROPOLITAN AIRPORT ;CA;United States;4;37-54N;121-14W;37-53-51N;121-15-00W;9;10; 72;493;KOAK;METRO OAKLAND INTERNATIONAL AIRPORT ;CA;United States;4;37-43N;122-14W;37-42-45N;122-12-48W;2;26; 72;494;KSFO;SAN FRANCISCO INTERNATIONAL AIRPORT ;CA;United States;4;37-37N;122-22W;37-37-01N;122-22-58W;3;26; 72;495;K50Q;Farallon Island;CA;United States;4;37-42N;123-00W;;;12;; 72;501;----;Upton, Ny.;NY;United States;4;40-52N;072-52W;40-52N;072-52W;20;20; 72;502;KEWR;NEWARK INTERNATIONAL AIRPORT;NJ;United States;4;40-41N;74-10W;40-42-22N;074-09-36W;5;7; 72;503;KLGA;NEW YORK LA GUARDIA AIRPORT ;NY;United States;4;40-47N;73-53W;40-46-25N;073-53-08W;7;11; 72;504;KBDR;SIKORSKY MEMORIAL AIRPORT;CT;United States;4;41-10N;073-08W;41-09-50N;073-07-40W;3;7; 72;506;KFMH;Otis Air National Guard Base;MA;United States;4;41-39N;070-31W;;;40;; 72;507;KPVD;PROVIDENCE GREEN STATE AIRPORT ;RI;United States;4;41-44N;071-26W;41-43-53N;071-25-43W;17;16; 72;508;KBDL;BRADLEY INTERNATIONAL AIRPORT ;CT;United States;4;41-56N;072-41W;41-55-59N;072-41-12W;53;60; 72;509;KBOS;BOSTON LOGAN INTERNATIONAL;MA;United States;4;42-22N;071-01W;42-21-51N;071-01-09W;6;54; 72;513;KAVP;WILKES-BARRE/SCRANTON INTERNATIONAL ;PA;United States;4;41-20N;75-44W;41-20-10N;075-43-50W;293;291; 72;514;KIPT;WILLIAMSPORT-LYCOMING COUNTY;PA;United States;4;41-15N;076-55W;41-14-41N;076-55-08W;161;164; 72;515;KBGM;BINGHAMTON REGIONAL AIRPORT;NY;United States;4;42-12N;75-59W;42-12-32N;075-58-58W;499;492; 72;517;KABE;LEHIGH VALLEY INTERNATIONAL AIRPORT;PA;United States;4;40-39N;075-27W;40-39-12N;075-25-59W;120;114; 72;518;KALB;ALBANY INTERNATIONAL AIRPORT;NY;United States;4;42-45N;73-48W;;;87;; 72;519;KSYR;SYRACUSE HANCOCK INTERNATIONAL AIRPORT ;NY;United States;4;43-07N;76-06W;43-06-39N;076-06-38W;125;127; 72;520;KPIT;GREATER PITTSBURGH INTERNATIONAL ;PA;United States;4;40-29N;80-14W;40-29-41N;080-11-25W;367;357; 72;521;KCAK;AKRON-CANTON REGIONAL AIRPORT ;OH;United States;4;40-55N;081-27W;40-54-43N;081-26-18W;374;377; 72;523;----;Dansville / Municipal, Ny.;;United States;4;42-34N;077-43W;;;202;209; 72;524;KCLE;CLEVELAND-HOPKINS INTERNATIONAL ;OH;United States;4;41-24N;081-51W;41-24-41N;081-51-36W;241;236; 72;525;KYNG;YOUNGSTOWN-WARREN REG AIRPRT;OH;United States;4;41-15N;080-40W;41-15-48N;080-40-25W;365;360; 72;526;KERI;ERIE INTERNATIONAL AIRPORT;PA;United States;4;42-05N;080-11W;42-04-59N;080-11-00W;223;222; 72;528;KBUF;GREATER BUFFALO INTERNATIONAL AIRPORT ;NY;United States;4;42-56N;078-44W;42-56-21N;078-43-10W;221;225; 72;529;KROC;GREATER ROCHESTER INTERNATIONAL ;NY;United States;4;43-07N;077-41W;43-07-44N;077-40-27W;170;178; 72;530;KORD;CHICAGO O'HARE INTERNATIONAL;IL;United States;4;41-59N;087-55W;42-00N;087-53W;204;200; 72;531;----;Rantoul / Chanute Air Force Base, Il.;;United States;4;40-18N;088-09W;;;;228; 72;532;KPIA;GREATER PEORIA REGIONAL AIRPORT ;IL;United States;4;40-40N;89-41W;40-39-59N;089-41-15W;201;205; 72;533;KFWA;FORT WAYNE INTERNATIONAL;IN;United States;4;41-00N;85-12W;40-59-11N;085-11-17W;248;248; 72;534;KMDW;CHICAGO MIDWAY AIRPORT;IL;United States;4;41-47N;087-45W;41-46-49N;087-45-08W;189;188; 72;535;KSBN;SOUTH BEND REGIONAL AIRPORT;IN;United States;4;41-42N;086-19W;41-42-31N;086-18-52W;244;237; 72;536;KTOL;TOLEDO EXPRESS AIRPORT;OH;United States;4;41-35N;083-48W;41-35-33N;083-48-15W;208;210; 72;537;KDTW;DETROIT METROPOLITAN;MI;United States;4;42-14N;83-20W;42-12-51N;083-21-13W;195;195; 72;539;KLAN;CAPITAL CITY AIRPORT;MI;United States;4;42-47N;084-35W;42-46-27N;084-35-35W;262;264; 72;540;KP35;Spickard;MO;United States;4;40-15N;093-43W;;;271;270;P 72;543;KRFD;GREATER ROCKFORD AIRPORT;IL;United States;4;42-12N;89-06W;42-11-25N;089-05-10W;224;221; 72;544;KMLI;MOLINE QUAD-CITY AIRPORT;IL;United States;4;41-27N;90-31W;41-26-33N;090-30-34W;180;184; 72;546;KDSM;DES MOINES INTERNATIONAL;IA;United States;4;41-32N;93-40W;41-32-20N;093-39-25W;292;295; 72;547;KDBQ;DUBUQUE REGIONAL AIRPORT;IA;United States;4;42-24N;90-42W;42-24-20N;090-42-20W;328;326; 72;548;KALO;WATERLOO MUNICIPAL AIRPORT;IA;United States;4;42-33N;92-24W;42-33-00N;092-23-52W;266;264; 72;549;KFOD;Fort Dodge;IA;United States;4;42-33N;094-11W;;;354;355; 72;550;KOMA;OMAHA EPPLEY AIRFIELD;NE;United States;4;41-18N;095-54W;41-18-03N;095-53-55W;300;312; 72;551;KLNK;LINCOLN MUNICIPAL AIRPORT;NE;United States;4;40-50N;96-46W;40-51-01N;096-44-52W;372;364; 72;552;KGRI;CENTRAL NEBRASKA REGIONAL;NE;United States;4;40-58N;98-19W;40-57-30N;098-19-05W;563;561; 72;553;----;Omaha, Ne.;;United States;4;41-22N;096-01W;;;399;406;P 72;554;KOFF;Omaha / Offutt Air Force Base;NE;United States;4;41-07N;095-54W;;;319;315; 72;556;KOFK;KARL STEFAN MEMORIAL AIRPORT;NE;United States;4;41-59N;097-26W;41-59-05N;097-25-48W;479;470; 72;557;KSUX;SIOUX GATEWAY AIRPORT;IA;United States;4;42-23N;96-23W;42-24-03N;096-22-39W;335;338; 72;558;KOAX;Valley;NE;United States;4;41-19N;096-22W;41-19N;096-22W;350;350; 72;561;KSNY;SIDNEY MUNICIPAL AIRPORT;NE;United States;4;41-06N;102-59W;41-06-10N;102-58-56W;1315;1307; 72;562;KLBF;NORTH PLATTE REGIONAL AIRPORT ;NE;United States;4;41-07N;100-40W;41-07-58N;100-41-54W;847;847; 72;564;KCYS;CHEYENNE AIRPORT;WY;United States;4;41-09N;104-48W;41-09-11N;104-48-33W;1878;1865; 72;565;KDEN;DENVER INTERNATIONAL AIRPORT;CO;United States;4;39-52N;104-40W;39-51-45N;104-40-25W;1655;1640; 72;566;KBFF;SCOTTSBLUFF HEILIG FIELD;NE;United States;4;41-52N;103-36W;41-52-12N;103-35-36W;1209;1203; 72;567;KVTN;MILLER FIELD - VALENTINE, NE;NE;United States;4;42-52N;100-33W;42-51-41N;100-32-56W;789;788; 72;568;KDGW;DOUGLAS CONVERSE COUNTY;WY;United States;4;42-48N;105-23W;42-47-47N;105-23-06W;1502;1499; 72;569;KCPR;NATRONA COUNTY INTERNATIONAL AIRPORT ;WY;United States;4;42-54N;106-28W;42-53-50N;106-27-50W;1630;1621; 72;570;KCAG;CRAIG MOFFAT AIRPORT;CO;United States;4;40-30N;107-31W;40-29-34N;107-31-16W;1888;1887; 72;572;KSLC;SALT LAKE CITY INTERNATIONAL AIRPORT ;UT;United States;4;40-47N;111-58W;40-46-35N;111-57-31W;1288;1286; 72;574;KRKS;ROCK SPRINGS-SWEETWATER CO;WY;United States;4;41-36N;109-03W;;;2060;; 72;575;KOGD;OGDEN-HINCKLEY AIRPORT;UT;United States;4;41-12N;112-01W;41-11-36N;112-00-25W;1362;1353; 72;576;KLND;LANDER HUNT FIELD;WY;United States;4;42-49N;108-44W;42-49-00N;108-44-00W;1703;1694; 72;578;KPIH;POCATELLO REGIONAL AIRPORT;ID;United States;4;42-55N;112-36W;42-54-16N;112-35-24W;1356;1359; 72;581;KENV;Wendover / Air Force Auxillary Field;UT;United States;4;40-44N;114-02W;40-44N;114-02W;1291;1292;P 72;582;----;Elko, Nv.;NV;United States;4;40-52N;115-44W;40-52N;115-44W;1607;1608;P 72;583;KWMC;WINNEMUCCA MUNICIPAL AIRPORT;NV;United States;4;40-54N;117-48W;40-54-18N;117-48-24W;1312;1310; 72;590;KO64;Fort Bragg;CA;United States;4;39-24N;123-49W;;;19;; 72;591;KRBL;RED BLUFF MUNICIPAL AIRPORT;CA;United States;4;40-09N;122-15W;40-09-19N;122-14-28W;106;104; 72;592;KRDD;REDDING MUNICIPAL AIRPORT;CA;United States;4;40-30N;122-17W;40-31-00N;122-17-50W;153;155; 72;594;KEKA;Eureka;CA;United States;4;40-48N;124-10W;;;13;18;P 72;597;KMFR;ROGUE VALLEY INTERNATIONAL AIRPORT;OR;United States;4;42-23N;122-53W;42-22-37N;122-52-50W;406;396; 72;604;----;Franconia, Nh;;United States;4;44-13N;071-45W;;;;287; 72;605;KCON;Concord, Concord Municipal Airport;NH;United States;4;43-11-43N;071-30-04W;43-12-22N;071-30-36W;105;103; 72;606;KPWM;PORTLAND INTERNATIONAL JETPORT;ME;United States;4;43-39N;70-18W;43-38-53N;070-18-09W;23;15; 72;608;KEPO;Eastport;ME;United States;4;44-55N;067-00W;;;24;23; 72;612;K9B2;Newport;VT;United States;4;44-56N;072-12W;;;233;233; 72;613;KMWN;Mount Washington;NH;United States;4;44-16N;071-18W;;;1909;1910; 72;614;K1V4;ST JOHNSBURY FAIRBANKS;VT;United States;4;44-25N;072-01W;44-25-10N;072-01-10W;212;210; 72;616;KBML;BERLIN MUNICIPAL AIRPORT;NH;United States;4;44-35N;71-11W;44-34-41N;071-10-49W;353;345; 72;617;KBTV;BURLINGTON INTERNATIONAL;VT;United States;4;44-28N;73-09W;44-28-08N;073-09-18W;102;105; 72;618;KRUM;Rumford;ME;United States;4;44-32N;070-32W;;;192;205; 72;632;----;White Lake, Mi.;MI;United States;4;42-42N;083-28W;42-42N;083-28W;321;329; 72;634;----;Gaylord, Mi.;MI;United States;4;44-55N;084-43W;44-55N;084-43W;446;446;P 72;635;KGRR;GERALD R. FORD INTERNATIONAL;MI;United States;4;42-53N;085-31W;42-53-04N;085-31-45W;242;239; 72;636;KMKG;MUSKEGON COUNTY AIRPORT;MI;United States;4;43-10N;086-14W;43-09-50N;086-14-19W;191;191; 72;637;KFNT;FLINT BISHOP INTERNATIONAL AIRPORT;MI;United States;4;42-58N;83-45W;42-58-27N;083-44-52W;238;233; 72;638;KHTL;ROSCOMMON COUNTY AIRPORT;MI;United States;4;44-21N;084-40W;44-21-02N;084-40-39W;351;351; 72;639;KAPN;ALPENA COUNTY REGIONAL AIRPORT;MI;United States;4;45-05N;083-34W;45-04-12N;083-33-59W;210;210; 72;640;KMKE;GEN MITCHELL INTERNATIONAL AIRPORT;WI;United States;4;42-57N;87-54W;42-56-52N;087-54-23W;220;206; 72;641;KMSN;MADISON DANE COUNTY RGNL;WI;United States;4;43-08N;89-21W;43-08-22N;089-20-46W;263;261; 72;643;KLSE;LA CROSSE MUNICIPAL AIRPORT ;WI;United States;4;43-53N;091-15W;43-52-18N;091-15-09W;199;200; 72;644;KRST;ROCHESTER INTERNATIONAL AIRPORT ;MN;United States;4;43-54N;092-30W;43-54-42N;092-29-30W;401;403; 72;645;KGRB;AUSTIN STRAUBEL INTERNATIONAL AIRPORT ;WI;United States;4;44-29N;088-08W;44-29-47N;088-06-46W;212;205; 72;648;KESC;Escanaba;MI;United States;4;45-45N;087-02W;;;180;187; 72;649;----;Chanhaussen, Mn.;MN;United States;4;44-51N;093-34W;44-51N;093-34W;287;287; 72;651;KFSD;SIOUX FALLS FOSS FIELD;SD;United States;4;43-35N;096-45W;43-35-14N;096-44-03W;436;434; 72;652;----;Pickstown, Sd.;SD;United States;4;43-04N;098-32W;;;453;453; 72;653;K9V9;CHAMBERLAIN MUNICIPAL AIRPORT;SD;United States;4;43-46N;099-19W;43-46-00N;099-19-06W;517;519; 72;654;KHON;HURON REGIONAL AIRPORT;SD;United States;4;44-23N;098-14W;44-23-09N;098-13-22W;393;390; 72;656;KSFD;Winner, Bob Wiley Field Airport;SD;United States;4;43-23-26N;099-50-33W;;;619;; 72;658;KMSP;MINNEAPOLIS-ST PAUL INTERNATIONAL ;MN;United States;4;44-52N;93-13W;44-53-15N;093-12-25W;256;265; 72;659;KABR;ABERDEEN REGIONAL AIRPORT;SD;United States;4;45-27N;098-25W;45-27-25N;098-25-36W;397;400; 72;661;----;Redig, Sd.;;United States;4;45-16N;103-32W;;;924;925;P 72;662;KRAP;RAPID CITY REGIONAL AIRPORT ;SD;United States;4;44-03N;103-03W;44-02-33N;103-03-43W;976;965; 72;665;KGCC;GILLETTE-CAMPBELL CTY AIRPORT ;WY;United States;4;44-20N;105-33W;44-20-54N;105-32-13W;1330;1320; 72;666;KSHR;SHERIDAN COUNTY AIRPORT;WY;United States;4;44-46N;106-58W;44-46-26N;106-58-12W;1226;1202; 72;670;KCOD;Cody;WY;United States;4;44-31N;109-01W;;;1551;1553;P 72;671;KBPI;BIG PINEY-MARBLETON AIRPORT;WY;United States;4;42-35N;110-06W;42-34-41N;110-06-14W;2131;2117; 72;672;KRIW;RIVERTON REGIONAL AIRPORT;WY;United States;4;43-04N;108-27W;43-03-43N;108-27-19W;1684;1664; 72;677;KBIL;LOGAN INTERNATIONAL AIRPORT;MT;United States;4;45-49N;108-33W;45-48-15N;108-32-09W;1112;1091; 72;681;KBOI;BOISE AIR TERMINAL;ID;United States;4;43-34N;116-14W;43-34-03N;116-12-40W;871;875; 72;683;KBNO;BURNS MUNICIPAL AIRPORT;OR;United States;4;43-36N;118-57W;43-35-12N;118-57-12W;1263;1264; 72;688;KPDT;PENDLETON MUNICIPAL AIRPORT;OR;United States;4;45-40N;118-46W;45-41-22N;118-50-18W;455;458; 72;693;KEUG;MAHLON SWEET FIELD;OR;United States;4;44-08N;123-13W;44-07-15N;123-12-40W;111;114; 72;694;KSLE;SALEM MCNARY FIELD;OR;United States;4;44-54N;123-00W;44-54-33N;123-00-25W;64;59; 72;698;KPDX;PORTLAND INTERNATIONAL AIRPORT;OR;United States;4;45-35N;122-36W;45-35-50N;122-36-21W;8;7; 72;712;KCAR;CARIBOU MUNICIPAL AIRPORT;ME;United States;4;46-52N;68-01W;46-52-06N;068-00-48W;191;191; 72;713;KPQI;Presque Isle;ME;United States;4;46-41N;068-03W;;;163;146; 72;734;KANJ;SAULT STE. MARIE MUNI;MI;United States;4;46-29N;084-21W;46-28-45N;084-21-24W;218;219; 72;741;KPKF;Park Falls;WI;United States;4;45-56N;090-27W;;;462;469;P 72;743;KMQT;Marquette;MI;United States;4;46-32N;087-33W;46-34N;087-24W;434;434;P 72;744;KCMX;HANCOCK HOUGHTON CTY. MEMO;MI;United States;4;47-10N;088-29W;47-10-15N;088-29-46W;334;326; 72;745;KDLH;Duluth, Duluth International Airport;MN;United States;4;46-50-34N;092-13-34W;46-50-22N;092-11-24W;435;435;P 72;747;KINL;FALLS INTERNATIONAL AIRPORT ;MN;United States;4;48-34N;093-24W;48-33-59N;093-23-53W;361;360; 72;750;KP39;Pequot Lake;MN;United States;4;46-36N;094-19W;;;390;390; 72;753;KFAR;HECTOR INTERNATIONAL AIRPORT ;ND;United States;4;46-56N;096-49W;46-54-29N;096-48-31W;274;277; 72;755;KBJI;Bemidji;MN;United States;4;47-30N;094-56W;;;423;420;P 72;756;KD45;Warroad;MN;United States;4;48-56N;095-21W;;;328;328; 72;758;KP11;Devils Lake;ND;United States;4;48-06N;098-52W;;;439;443;P 72;764;KBIS;BISMARCK MUNICIPAL AIRPORT;ND;United States;4;46-47N;100-45W;46-46-20N;100-45-26W;511;503; 72;765;KP24;Roseglen;ND;United States;4;47-45N;101-50W;;;624;624;P 72;767;KISN;SLOULIN FIELD INTERNATIONAL AIRPORT;ND;United States;4;48-11N;103-39W;48-10-37N;103-37-52W;604;579; 72;768;KGGW;GLASGOW INTERNATIONAL AIRPORT ;MT;United States;4;48-13N;106-37W;48-12-30N;106-37-34W;699;693; 72;772;KHLN;HELENA REGIONAL AIRPORT;MT;United States;4;46-36N;111-58W;46-36-09N;111-59-39W;1180;1187; 72;773;KMSO;MISSOULA INTERNATIONAL AIRPORT ;MT;United States;4;46-55N;114-06W;46-55-30N;114-05-24W;976;975; 72;775;KGTF;GREAT FALLS INTERNATIONAL;MT;United States;4;47-28N;111-23W;47-28-48N;111-21-31W;1120;1119; 72;776;----;Great Falls, Mt.;MT;United States;4;47-28N;111-23W;47-28N;111-23W;1131;1131; 72;777;KHVR;HAVRE CITY-COUNTY AIRPORT;MT;United States;4;48-33N;109-46W;48-32-46N;109-45-42W;789;787; 72;779;KGPI;GLACIER PARK INTERNATIONAL AIRPORT;MT;United States;4;48-18N;114-16W;48-18-33N;114-15-01W;906;908; 72;781;KYKM;YAKIMA AIR TERMINAL;WA;United States;4;46-34N;120-32W;46-34-14N;120-32-27W;334;324; 72;783;KLWS;LEWISTON NEZ PERCE CO AIRPORT ;ID;United States;4;46-22N;117-01W;46-22-38N;117-00-37W;438;438; 72;784;KHMS;Hanford;WA;United States;4;46-34N;119-36W;;;223;223; 72;785;KGEG;SPOKANE INTERNATIONAL AIRPORT ;WA;United States;4;47-37N;117-32W;47-37-19N;117-32-22W;723;735; 72;786;----;Spokane, Wa.;WA;United States;4;47-41N;117-38W;47-41N;117-38W;728;728;P 72;788;----;Walla Walla, Wa;;United States;4;46-02N;118-20W;;;289;302; 72;791;KAST;PORT OF ASTORIA AIRPORT;OR;United States;4;46-09N;123-53W;46-09-22N;123-52-51W;3;3; 72;792;KOLM;OLYMPIA AIRPORT;WA;United States;4;46-58N;122-54W;46-58-30N;122-53-46W;63;58; 72;793;KSEA;SEATTLE-TACOMA INTERNATIONAL AIRPORT ;WA;United States;4;47-27N;122-19W;47-26-37N;122-18-07W;131;136; 72;797;KUIL;QUILLAYUTE STATE AIRPORT;WA;United States;4;47-56N;124-34W;47-56-03N;124-33-32W;59;54; 74;001;----;Redstone Arsenal, Al.;AL;United States;4;34-36N;086-38W;34-36N;086-38W;209;175; 74;002;----;Aberdeen Proving Grounds, Md.;MD;United States;4;39-30N;076-34W;39-28N;076-10W;5;5; 74;003;KDPG;Dugway Proving Grounds;UT;United States;4;40-10N;112-56W;40-11N;112-56W;1326;1325; 74;004;----;Yuma Proving Grounds Az.;;United States;4;32-30N;114-00W;;;;231; 74;201;KNOW;Port Angeles Coast Guard Air Station;WA;United States;4;48-08N;123-24W;;;5;9; 74;206;KTCM;Tacoma / McChord Air Force Base;WA;United States;4;47-09N;122-29W;47-09N;122-29W;98;87; 74;207;KGRF;Fort Lewis / Gray U. S. Army Airfield;WA;United States;4;47-07N;122-33W;47-08N;122-36W;92;87; 74;230;KMLS;MILES CITY WILEY FIELD;MT;United States;4;46-26N;105-53W;46-25-40N;105-52-29W;801;801; 74;341;----;Wood Lake, Mn.;;United States;4;44-40N;095-27W;;;319;; 74;357;----;Blue River, Wi.;;United States;4;43-13N;090-32W;;;226;; 74;365;K3RN;Graying Air Force Range;MI;United States;4;44-50N;084-33W;44-50N;084-33W;387;387; 74;370;KGTB;Fort Drum / Wheeler-Sack U. S. Army Airfield;NY;United States;4;44-03N;075-44W;44-03N;075-44W;207;207; 74;389;----;Gray, Me.;ME;United States;4;43-54N;070-15W;43-54N;070-15W;125;125; 74;392;KNHZ;BRUNSWICK NAVAL AIR STN;ME;United States;4;43-54N;69-56W;43-53-52N;069-56-06W;23;23; 74;393;----;Portland, Me.;;United States;4;43-32N;070-06W;;;0;7; 74;413;----;Saylor Creek Gunneryrange, Id.;;United States;4;42-32N;115-42W;;;;1108; 74;420;KU67;Roosevelt;UT;United States;4;40-18N;109-59W;;;1553;1556; 74;421;----;Craig, County;;United States;4;40-30N;107-31W;;;;1886; 74;431;----;Medicine Bow, Wy.;;United States;4;41-54N;106-11W;;;1997;; 74;433;----;Mccook, Ne.;;United States;4;40-05N;100-39W;;;800;; 74;437;----;Merriman, Ne.;;United States;4;42-54N;101-42W;;;991;; 74;440;----;Fairbury, Ne.;;United States;4;40-06N;097-20W;;;433;; 74;445;----;Neligh, Ne.;;United States;4;42-12N;097-48W;;;524;; 74;449;----;Slater, Ia.;;United States;4;41-54N;093-42W;;;315;; 74;455;----;Davenport, Ia.;IA;United States;4;41-37N;090-35W;41-37N;090-35W;229;229; 74;460;KMMO;Marseilles Island;IL;United States;4;41-22N;088-41W;;;223;225; 74;465;----;Dunne Crib Il.;;United States;4;41-47N;087-32W;;;;; 74;466;----;Wolcott, In.;;United States;4;40-49N;087-03W;;;212;; 74;468;----;Jefferson Proving Ground Madison, In.;;United States;4;38-50N;085-25W;;;;265; 74;480;----;Verona, Ny. Af ;;United States;4;43-08N;075-36W;;;;135; 74;483;----;Wilmington, Vt.;;United States;4;42-53N;072-53W;;;;482; 74;484;----;West Dover, Vt.;;United States;4;42-56N;072-52W;;;;595; 74;486;KJFK;KENNEDY INTERNATIONAL AIRPORT ;NY;United States;4;40-38N;073-46W;40-38-34N;073-46-52W;4;9; 74;490;KBED;BEDFORD HANSCOM FIELD;MA;United States;4;42-28N;071-18W;42-27-57N;071-17-22W;41;50; 74;491;KCEF;Chicopee Falls / Westover Air Force Base;MA;United States;4;42-12N;072-32W;;;75;75; 74;492;----;Blue Hill Obs. Ma.;;United States;4;42-13N;071-07W;;;195;; 74;494;KCHH;Chatham;MA;United States;4;41-40N;069-58W;41-40N;069-58W;14;16; 74;500;----;Sheridan, Ca;;United States;4;39-00N;121-20W;;;;60; 74;501;----;Freshpond, Ca;;United States;4;38-45N;120-31W;;;;1147; 74;504;----;Pilar Point Airways Facilities Sector, Ca.;CA;United States;4;37-30N;122-30W;37-30N;122-30W;49;49; 74;506;KNGZ;Alameda Naval Air Station;CA;United States;4;37-47N;122-19W;;;4;9; 74;509;KNUQ;MOFFETT FIELD;CA;United States;4;37-26N;122-03W;37-24-32N;122-02-59W;10;19; 74;516;KSUU;Fairfield / Travis Air Force Base;CA;United States;4;38-16N;121-57W;;;19;22;P 74;521;----;Durango, County;;United States;4;37-12N;107-49W;;;;2095; 74;530;----;Granada, Co.;;United States;4;37-46N;102-11W;;;1155;; 74;531;KAFF;Air Force Academy;CO;United States;4;38-58N;104-49W;38-58N;104-49W;2003;1999; 74;532;----;Limon, County;;United States;4;39-11N;103-42W;;;;1694; 74;533;----;Platteville, Co.;;United States;4;40-11N;104-43W;;;1524;; 74;541;----;Haviland, Ks.;;United States;4;37-39N;099-05W;;;648;; 74;542;----;Neodesha, Ks.;;United States;4;37-22N;095-38W;;;255;; 74;543;KPTT;Pratt Municipal;KS;United States;4;37-42N;098-45W;37-42N;098-45W;595;595; 74;545;----;Smokey Hill Gunnery Range, Ks.;;United States;4;38-39N;097-48W;;;;422; 74;546;----;Hillsboro, Ks.;;United States;4;38-19N;097-18W;;;447;; 74;550;----;Conway, Mo.;;United States;4;37-31N;092-42W;;;390;; 74;551;----;Lathrop, Mo.;;United States;4;39-35N;094-11W;;;297;; 74;556;----;Winchester, Il.;;United States;4;39-39N;090-29W;;;170;; 74;560;----;Lincoln, Il.;IL;United States;4;40-09N;089-20W;40-09N;089-20W;178;178; 74;570;KFFO;Dayton / Wright-Patterson Air Force Base;OH;United States;4;39-50N;084-03W;39-50N;084-03W;251;251;P 74;589;----;Chesapeake, Va.;;United States;4;36-54N;075-43W;;;0;23; 74;590;KN78;Barnegat Coast Guard Station;NJ;United States;4;39-46N;074-06W;;;6;; 74;594;KADW;Camp Springs / Andrews Air Force Base;MD;United States;4;38-49N;076-51W;;;86;88;P 74;595;KW30;Ocean City;MD;United States;4;38-20N;075-05W;;;4;4; 74;598;KLFI;Langley Air Force Base;VA;United States;4;37-05N;076-21W;;;3;6; 74;604;----;Vandenberg Air Force Base, Ca.;;United States;4;34-47N;120-32W;;;170;; 74;606;----;South Vandenberg Afbca.;CA;United States;4;34-39N;120-34W;34-39N;120-34W;112;112; 74;611;KBYS;Fort Irwin/Barstow, Bicycle Lake Army Airfield;CA;United States;4;35-17N;116-37W;35-17N;116-37W;716;716; 74;612;KNID;NAWS CHINA LAKE;CA;United States;4;35-41N;117-42W;35-41-15N;117-40-47W;696;682; 74;614;KINS;Indian Springs, Indian Springs Auxiliary AFLD Nellis AFB;NV;United States;4;36-35N;115-40W;;;955;; 74;618;K4CB;Cuddleback Gunnery Range;CA;United States;4;35-16N;117-26W;35-16N;117-26W;864;864; 74;619;K4SU;Superior Valley Gunnery Range;CA;United States;4;36-20N;117-06W;36-20N;117-06W;962;962; 74;629;----;White Sands, Nm.;;United States;4;32-24N;106-20W;;;1224;; 74;630;----;Stallion U. S. Army Airfield, Nm;NM;United States;4;33-49N;106-40W;33-49N;106-40W;1506;1506; 74;631;----;White Sands Missile Range Site No. 32, Nm;NM;United States;4;33-10N;106-29W;33-10N;106-30W;1235;1235; 74;635;----;Aztec, Nm.;NM;United States;4;36-50N;107-54W;;;1902;; 74;638;K4MR;Melrose Gunnery Range;NM;United States;4;34-18N;103-48W;34-18N;103-48W;1326;1326; 74;640;----;Vici, Ok.;;United States;4;36-04N;099-13W;;;648;; 74;641;KWWR;Woodward, West Woodward Airport;OK;United States;4;36-26-12N;099-31-16W;36-26N;099-32W;667;667; 74;643;KH92;Hominy Municipal;OK;United States;4;36-26N;096-23W;36-26N;096-23W;251;252; 74;645;KF10;Henryetta Municipal;OK;United States;4;35-24N;096-01W;35-24N;096-01W;259;259; 74;646;KF30;Sulphur Municipal;OK;United States;4;34-31N;096-59W;34-31N;096-59W;320;320; 74;647;----;Lamont, Ok.;;United States;4;36-41N;097-28W;;;306;; 74;648;----;Haskell, Ok.;;United States;4;35-48N;095-47W;;;212;; 74;649;----;Purcell, Ok.;;United States;4;34-59N;097-31W;;;331;; 74;662;----;Bloomfield, Mo.;;United States;4;36-53N;089-58W;;;130;; 74;671;KHOP;Fort Campbell U. S. Army Airfield;KY;United States;4;36-40N;087-30W;36-40N;087-30W;174;174; 74;693;KFBG;Fort Bragg / Simmons Army Airfield;NC;United States;4;35-08N;078-56W;35-08N;078-56W;74;74; 74;695;K2DP;Dare County Gunnery Range;NC;United States;4;35-40N;075-54W;35-41N;075-54W;3;3; 74;696;K44W;Diamond Shoals Coast Guard Station;NC;United States;4;35-09N;075-18W;;;1;; 74;699;----;Frying Pan Shoals, Nc.;;United States;4;33-29N;077-35W;;;0;;P 74;702;KNLC;LEMOORE NAVAL AIR STATION;CA;United States;4;36-20N;119-57W;36-19-40N;119-56-50W;71;72; 74;718;----;Salton Sea, Ca. Airways Facilities Sector ;CA;United States;4;33-13N;115-52W;33-13N;115-52W;-69;-69; 74;724;KGBN;Gila Bend U. S. Army Airfield;AZ;United States;4;32-26N;112-41W;32-56N;112-42W;262;261; 74;730;KP07;Sanderson;TX;United States;4;30-10N;102-25W;;;865;865;P 74;731;----;Tucumcari, Nm.;;United States;4;35-05N;103-37W;;;1241;; 74;732;KHMN;Holloman Air Force Base;NM;United States;4;32-51N;106-06W;32-54N;106-06W;1248;1248; 74;733;KE28;Northrup Landing Strip;NM;United States;4;33-54N;106-24W;32-54N;106-24W;1193;1193; 74;734;----;White Sands Missile Range Site No. 39;NM;United States;4;32-38N;106-24W;32-38N;106-24W;1204;1204; 74;735;----;Jayton, Tx.;;United States;4;33-01N;100-59W;;;707;; 74;740;KJCT;KIMBLE COUNTY AIRPORT;TX;United States;4;30-31N;099-46W;30-30-36N;099-45-57W;533;523; 74;750;----;Palestine, Tx.;;United States;4;31-47N;095-43W;;;119;; 74;752;----;Dequeen, Ar.;;United States;4;34-07N;094-17W;;;195;; 74;753;----;Winnfield, La.;;United States;4;31-54N;092-47W;;;93;141; 74;754;KAEX;ALEXANDRIA INTERNATIONAL AIRPORT;LA;United States;4;31-33N;092-56W;31-19-26N;092-32-37W;27;27; 74;755;K01R;Claiborne Range, Airways Facilities Sector ;LA;United States;4;31-08N;092-34W;31-11N;092-38W;67;67; 74;769;----;Okolona, Ms.;;United States;4;34-05N;088-52W;;;125;; 74;775;KPAM;Tyndall Air Force Base;FL;United States;4;30-04N;085-35W;30-04N;085-35W;5;13; 74;777;KHRT;Hurlburt Field;FL;United States;4;30-25N;086-41W;30-26N;086-41W;12;11; 74;778;----;Eglin Air Force Base Range No. 52, Fl.;FL;United States;4;30-34N;086-19W;30-34N;086-18W;48;48; 74;780;----;Fort Stewart Reservation, Ga;GA;United States;4;31-54N;081-38W;31-52N;081-38W;27;27; 74;781;KVAD;Moody Air Force Base;GA;United States;4;30-58N;083-12W;;;71;71; 74;788;KMCF;Macdill Air Force Base, Fl.;FL;United States;4;27-51N;082-30W;27-51N;082-30W;4;4; 74;790;KSSC;Shaw Air Force Base;SC;United States;4;33-58N;080-29W;33-58N;080-29W;74;73; 74;791;KMYR;Myrtle Beach Air Force Base;SC;United States;4;33-41N;078-56W;33-41N;078-56W;8;8; 74;792;K2PJ;Poinsett Range, Sumpter;SC;United States;4;33-51N;080-29W;33-51N;080-29W;68;68; 74;794;KXMR;Cocoa Beach, Cape Canaveral Air Force Station Skid Strip;FL;United States;4;28-28N;080-34W;28-28N;080-33W;3;3; 74;795;KCOF;Cocoa / Patrick Air Force Base;FL;United States;4;28-14N;080-36W;;;3;3; 74;796;KAGR;Avon Park Gunnery Range;FL;United States;4;27-39N;081-20W;27-39N;081-20W;20;20; 76;050;----;Ensenada;;Mexico;4;31-51N;116-38W;;;8;; 76;055;----;San Felipe, B. C. N.;;Mexico;4;31-02N;114-51W;;;440;; 76;061;----;Puerto Penasco, Son.;;Mexico;4;31-18N;113-33W;;;48;; 76;113;----;Altar, Son.;;Mexico;4;30-43N;111-44W;;;419;; 76;118;----;Pilares De Nacozari, Son.;;Mexico;4;30-22N;109-41W;;;1040;; 76;122;----;Nueva Casas Grandes, Chih.;;Mexico;4;30-25N;107-55W;;;1467;; 76;151;----;Isla Guadalupe, B. C.;;Mexico;4;29-10N;118-19W;28-53N;118-18W;23;23; 76;160;MMHO;Hermosillo, Son.;;Mexico;4;29-04N;110-57W;;;211;; 76;220;----;Temosachic, Chih.;;Mexico;4;28-57N;107-50W;;;1870;; 76;225;----;University De Chihuahua, Chihuahua, Chih.;;Mexico;4;28-38N;106-05W;28-42N;106-04W;1435;1429; 76;243;MMPG;Piedras Negras, Coah.;;Mexico;4;28-42N;100-31W;;;250;; 76;253;MMCN;Ciudad Obregon;;Mexico;4;27-23-34N;109-49-59W;;;62;; 76;256;----;Empalme, Son.;;Mexico;4;27-55N;110-54W;27-57N;110-48W;11;12; 76;258;----;Ciudad Obregon, Son.;;Mexico;4;27-29N;109-56W;;;38;; 76;305;MMLT;Loreto, B. C. S.;;Mexico;4;26-01N;111-21W;;;15;; 76;311;----;Choix, Sin.;;Mexico;4;26-43N;108-17W;;;238;; 76;323;----;Hidalgo Del Parral, Chih.;;Mexico;4;26-56N;105-40W;;;1744;; 76;342;MMMV;Monclova, Coah.;;Mexico;4;26-53N;101-25W;26-54N;101-25W;615;586; 76;373;----;Tepehuanes, Dgo.;;Mexico;4;25-21N;105-45W;;;1810;; 76;382;MMTC;Torreon, Coah.;;Mexico;4;25-32N;103-27W;25-32N;103-27W;1124;1150; 76;390;MMIO;Saltillo, Coah.;;Mexico;4;25-27N;100-59W;;;1790;; 76;393;----;Monterrey, N. L.;;Mexico;4;25-52N;100-12W;;;512;; 76;394;MMAN;Aerop. Internacional Monterrey, N. L.;;Mexico;4;25-52N;100-14W;25-52N;100-12W;448;450; 76;402;----;Ciudad Constitucion, B. C. S.;;Mexico;4;25-00N;111-40W;;;48;; 76;405;----;La Paz, B. C. S.;;Mexico;4;24-16N;110-25W;24-10N;110-18W;18;18; 76;412;MMCL;Culiacan, Sin.;;Mexico;4;24-49N;107-24W;;;39;; 76;423;----;Durango, Dgo.;;Mexico;4;24-02N;104-40W;;;1872;; 76;458;----;Colonia Juan Carras-Co Mazatlan, Sin.;;Mexico;4;23-12N;106-25W;23-12N;106-25W;4;4; 76;471;----;Sombrerete, Zac.;;Mexico;4;23-38N;103-38W;;;2359;; 76;491;----;Ciudad Victoria, Tamps.;;Mexico;4;23-45N;099-08W;23-44N;099-08W;355;321; 76;499;----;Soto La Marina, Tamps.;;Mexico;4;23-46N;098-12W;23-46N;098-12W;21;25; 76;519;----;Colotlan, Jal.;;Mexico;4;22-07N;103-16W;;;1673;; 76;525;----;Zacatecas, Zac. La Bufa, Zac. ;;Mexico;4;22-47N;102-34W;;;2612;; 76;539;MMSP;San Luis Potosi, S. L. P.;;Mexico;4;22-09N;100-59W;;;1870;; 76;548;----;Tampico, Tamps;;Mexico;4;22-13N;097-51W;;;9;; 76;551;----;Isla Maria Madre;;Mexico;4;21-40N;106-32W;;;5;; 76;556;MMEP;Tepic, Nay.;;Mexico;4;21-31N;104-54W;;;922;; 76;571;MMAS;Aguascalientes, Ags.;;Mexico;4;21-53N;102-18W;;;1874;; 76;577;----;Guanajuato, Gto.;;Mexico;4;21-01N;101-15W;;;1999;; 76;581;----;Rio Verde, S. L. P.;;Mexico;4;21-51N;100-00W;;;990;; 76;585;----;Matlapa, S. L. P.;;Mexico;4;21-20N;098-40W;;;133;; 76;593;----;Progreso, Yuc.;;Mexico;4;21-18N;089-49W;;;14;; 76;595;----;Cancun;;Mexico;4;21-02N;086-50W;21-02N;086-53W;10;10; 76;612;----;Guadalajara, Jal.;;Mexico;4;20-40N;103-23W;20-41N;103-23W;1551;1589; 76;625;MMQT;Queretaro, Qro.;;Mexico;4;20-36N;100-23W;;;1813;; 76;632;----;Pachuca, Hgo.;;Mexico;4;20-08N;098-44W;;;2417;; 76;634;MMTL;Tulancingo ;;Mexico;4;20-05N;098-22W;;;2181;; 76;640;----;Tuxpan. Ver.;;Mexico;4;20-57N;097-24W;;;28;; 76;642;----;Triangulos Reefs ;;Mexico;4;20-58N;092-19W;20-58N;092-19W;2;2; 76;644;MMMD;Merida / lic Manuel Crecencio;;Mexico;4;20-56N;089-39W;20-57N;089-40W;10;11; 76;647;----;Valladolid, Yuc.;;Mexico;4;20-42N;088-13W;;;22;; 76;654;----;Manzanillo, Col.;;Mexico;4;19-03N;104-20W;19-04N;104-20W;3;6; 76;656;----;Ciudad Guzman, Jal.;;Mexico;4;19-42N;103-28W;;;1507;; 76;658;MMIA;Colima ;;Mexico;4;19-16N;103-35W;;;723;; 76;662;----;Zamora, Mich.;;Mexico;4;19-59N;102-19W;;;1562;; 76;665;----;Morelia, Mich.;;Mexico;4;19-42N;101-11W;;;1913;; 76;675;----;Toluca, Mex.;;Mexico;4;19-18N;099-40W;;;2720;; 76;679;----;Aerop. Internacionalmexico, D. F.;;Mexico;4;19-26N;099-05W;19-26N;099-05W;2234;2231; 76;680;----;Mexico Central, D. F.;;Mexico;4;19-24N;099-12W;19-26N;099-08W;2303;2237; 76;683;----;Tlaxcala, Tlax.;;Mexico;4;19-19N;098-14W;;;2248;; 76;685;MMPB;Puebla, Pue.;;Mexico;4;19-03N;098-10W;;;2179;; 76;687;----;Jalapa, Ver.;;Mexico;4;19-32N;096-55W;;;1389;; 76;692;----;Hacienda Ylang Ylangveracruz, Ver.;;Mexico;4;19-09N;096-07W;19-09N;096-07W;13;13; 76;695;MMCP;Campeche, Camp.;;Mexico;4;19-51N;090-33W;;;5;; 76;698;----;Felipe Carrillo Puerto, Q. Roo.;;Mexico;4;19-35N;088-02W;;;20;; 76;723;----;Isla Socorro, Col.;;Mexico;4;18-43N;110-57W;18-43N;110-57W;35;35; 76;726;MMCB;Cuernavaca, Mor.;;Mexico;4;18-53N;099-14W;;;1618;; 76;737;----;Orizaba, Ver.;;Mexico;4;18-51N;097-06W;;;1259;; 76;741;----;Coatzacoalcos, Ver.;;Mexico;4;18-09N;094-25W;;;23;; 76;743;----;Villahermosa, Tab.;;Mexico;4;17-59N;092-55W;;;10;; 76;750;MMCM;Chetumal, Q. Roo;;Mexico;4;18-29N;088-18W;;;9;; 76;762;----;Chilpancingo, Gro.;;Mexico;4;17-33N;099-30W;;;1865;; 76;773;----;Huajuapan De Leon, Oax.;;Mexico;4;17-48N;097-46W;;;1680;; 76;775;----;Oaxaca, Oax.;;Mexico;4;17-04N;096-43W;;;1550;; 76;805;----;Acapulco, Gro.;;Mexico;4;16-50N;099-56W;16-50N;099-55W;13;3; 76;833;----;Salina Cruz, Oax.;;Mexico;4;16-10N;095-12W;;;6;; 76;840;----;Arriaga, Chis.;;Mexico;4;16-14N;093-54W;16-14N;093-54W;64;44; 76;843;MMTG;Tuxtla Gutierrez, Chis.;;Mexico;4;16-45N;093-07W;;;528;; 76;845;----;Sn. Cristobal Las Casas, Chis.;;Mexico;4;16-44N;092-38W;;;2276;; 76;848;----;Comitan, Chis.;;Mexico;4;16-15N;092-08W;;;1646;; 76;855;----;Puerto Angel, Oax.;;Mexico;4;15-39N;096-30W;;;43;; 76;903;----;Tapachula, Chis;;Mexico;4;14-55N;092-16W;;;118;; 78;016;TXKF;Bermuda;;Bermuda;4;32-22N;064-41W;;;6;;P 78;061;MYGW;West End, Grand Bahama;;Bahamas, The;4;26-42N;078-58W;;;2;4;P 78;062;MYGF;Freeport, Grand Bahama;;Bahamas, The;4;26-33N;078-42W;;;2;11;P 78;066;----;Green Turtle Cay, Abaco;;Bahamas, The;4;26-45N;077-20W;;;13;15;P 78;070;MYBS;Alice Town, Bimini;;Bahamas, The;4;25-44N;079-18W;;;2;3;P 78;073;MYNN;Nassau Airport;;Bahamas, The;4;25-03N;077-28W;25-03N;077-28W;3;7;P 78;077;----;Dunmore Town, Harbouris., Eleuthera;;Bahamas, The;4;25-30N;076-38W;;;14;16;P 78;086;----;Kemp's Bay, Andros;;Bahamas, The;4;24-05N;077-33W;;;2;4; 78;087;----;The Bight, Cat Island;;Bahamas, The;4;24-17N;075-25W;;;3;3;P 78;088;MYSM;Cockburn Town, San Salvador;;Bahamas, The;4;24-03N;074-32W;;;3;5;P 78;092;MYEG;Georgetown, Exuma;;Bahamas, The;4;23-28-30N;075-46-00W;;;2;3;P 78;095;----;Clarence Town, Long Island;;Bahamas, The;4;23-06N;074-58W;;;7;9;P 78;101;----;Duncan Town, Ragged Island;;Bahamas, The;4;22-12N;075-44W;;;11;13;P 78;104;----;Church Grove, Crooked Island;;Bahamas, The;4;22-45N;074-14W;;;12;29; 78;109;----;Abraham Bay, Mayaguana;;Bahamas, The;4;22-22N;072-58W;;;1;3;P 78;114;----;Providenciales;;Turks and Caicos Islands;4;21-46N;072-16W;;;;4; 78;118;----;Turks Island;;Turks and Caicos Islands;4;21-27N;071-09W;;;8;10; 78;121;MYIG;Matthew Town, Inagua;;Bahamas, The;4;20-57N;073-41W;;;2;4;P 78;221;MUNG;Nueva Gerona, Isla De Pinos;;Cuba;4;21-50N;082-47W;;;23;23; 78;224;MUHA;Aeropuerto Jose Marti, Rancho-Boyeros, Habana;;Cuba;4;22-59N;082-24W;;;59;75; 78;229;MUVR;Varadero, Matanzas;;Cuba;4;23-08N;081-17W;;;3;3; 78;244;MUCF;Cienfuegos, Las Villas;;Cuba;4;22-09N;080-24W;;;39;39; 78;255;MUCM;Camaguey Aeropuerto;;Cuba;4;21-25N;077-51W;21-25N;077-51W;122;118; 78;256;MUMZ;Manzanillo, Oriente;;Cuba;4;20-20N;077-07W;;;60;60; 78;264;MUCU;Santiago De Cuba, Oriente;;Cuba;4;19-58N;075-51W;;;69;55; 78;267;MUGT;Guantanamo, Oriente;;Cuba;4;20-05N;075-09W;;;8;8; 78;268;MUBA;Baracoa, Oriente;;Cuba;4;20-21N;074-30W;;;9;9; 78;310;----;Cabo San Antonio, Pinar Del Rio;;Cuba;4;21-52N;084-57W;;;8;8; 78;311;----;La Bajada, Pinar Del Rio;;Cuba;4;21-55N;084-28W;;;4;4; 78;312;----;Santa Lucia, Pinar Del Rio;;Cuba;4;22-40N;083-58W;;;;24; 78;313;----;Isabel Rubio, Pinar Del Rio;;Cuba;4;22-10N;084-06W;;;;28; 78;314;----;San Juan Y Martinez, Pinar Del Rio;;Cuba;4;22-17N;083-50W;;;;30; 78;315;MUPR;Pinar Del Rio, Pinar Del Rio;;Cuba;4;22-25N;083-41W;;;37;37; 78;316;----;La Palma, Pinar Del Rio;;Cuba;4;22-46N;083-33W;;;;47; 78;317;----;Paso Real De San Diego, Pinar Del Rio;;Cuba;4;22-33N;083-18W;;;;44; 78;318;----;Bahia Honda, Pinar Del Rio;;Cuba;4;22-55N;083-10W;;;3;3; 78;319;----;Artemisa, La Habana;;Cuba;4;22-48N;082-45W;;;;42; 78;320;----;Guira De Melena, La Habana;;Cuba;4;22-47N;082-31W;;;;10; 78;321;----;La Fe, Isla De La Juventud;;Cuba;4;21-44N;082-46W;;;32;32; 78;322;----;Batabano, La Habana;;Cuba;4;22-43N;082-17W;;;;7; 78;323;----;Guines, La Habana;;Cuba;4;22-51N;082-02W;;;;55; 78;324;----;Punta Del Este, Isla De La Juventud;;Cuba;4;21-33N;082-32W;;;10;10; 78;325;----;Casa Blanca, La Habana;;Cuba;4;23-10N;082-21W;23-10N;082-21W;50;50; 78;327;----;Union De Reyes, Matanzas;;Cuba;4;24-46N;081-32W;;;30;30; 78;329;----;Indio Hatuey, Matanzas;;Cuba;4;22-49N;081-00W;;;19;19; 78;330;----;Jovellanos, Matanzas;;Cuba;4;22-47N;081-11W;;;;25; 78;331;----;Jaguey Grande, Matanzas;;Cuba;4;22-38N;081-16W;;;;5; 78;332;----;Colon, Matanzas;;Cuba;4;22-41N;080-56W;;;;35; 78;333;----;Playa Giron, Matanzas;;Cuba;4;22-04N;081-02W;;;5;5; 78;335;----;Aguada De Pasajeros, Cienfuegos;;Cuba;4;22-23N;080-51W;;;;27; 78;336;----;Pico San Juan, Cienfuegos;;Cuba;4;21-55N;080-10W;;;1140;1140; 78;337;----;Trinidad, Sancti Spiritus;;Cuba;4;21-47N;079-59W;;;;54; 78;338;----;Saua La Grande, Villa Clara;;Cuba;4;22-49N;080-05W;;;22;22; 78;339;----;Cayo Coco, Ciego De Avila;;Cuba;4;22-31N;078-27W;;;;2; 78;340;----;Bainoa, La Habana;;Cuba;4;23-02N;081-55W;;;;80; 78;341;----;El Jibaro, Sancti Spiritus;;Cuba;4;21-43N;079-13W;;;;30; 78;342;----;Topes De Collantes, Sancti Spiritus;;Cuba;4;21-55N;080-01W;;;;771; 78;343;----;El Yabu, Villa Clara;;Cuba;4;22-26N;079-59W;;;;116; 78;344;----;Cienfuegos, Cienfuegos;;Cuba;4;21-55N;080-10W;;;;42; 78;345;----;Jucaro, Ciego De Avila;;Cuba;4;21-37N;078-51W;;;;1; 78;346;MUCA;Venezuela, Ciego De Avila;;Cuba;4;21-47N;078-47W;;;26;26; 78;347;----;Camilo Cienfuegos, Ciego De Avila;;Cuba;4;22-09N;078-45W;;;;16; 78;348;----;Caibarien, Villa Clara;;Cuba;4;22-31N;079-27W;;;;6; 78;349;----;Sancti Spiritus, Sancti Spiritus;;Cuba;4;21-56N;079-27W;;;97;97; 78;350;----;Florida, Camaguey;;Cuba;4;21-31N;078-14W;;;;58; 78;351;----;Santa Cruz Del Sur, Camaguey;;Cuba;4;20-43N;078-00W;;;;2; 78;352;----;Esmeralda, Camaguey;;Cuba;4;21-51N;078-07W;;;;31; 78;353;----;Nuevitas, Camaguey;;Cuba;4;21-32N;077-15W;;;;4; 78;354;----;Palo Seco, Camaguey;;Cuba;4;21-08N;077-19W;;;;96; 78;355;----;Camaguey, Camaguey;;Cuba;4;21-24N;077-51W;;;;124; 78;357;MUVT;Las Tunas, Las Tunas;;Cuba;4;20-57N;076-57W;;;106;106; 78;358;----;Puerto Padre, Las Tunas;;Cuba;4;21-12N;076-37W;;;13;13; 78;359;----;Mansanillo, Granma;;Cuba;4;20-20N;077-08W;;;;10; 78;360;----;Cabo Cruz, Granma;;Cuba;4;19-51N;077-14W;;;10;10; 78;361;----;Jucarito, Granma;;Cuba;4;20-40N;076-54W;;;;12; 78;362;----;La Jiquima, Holguin;;Cuba;4;20-56N;076-32W;;;;105; 78;363;----;Contramaestre, Santiago De Cuba;;Cuba;4;20-17N;076-15W;;;;100; 78;364;----;Universidad, Santiago De Cuba;;Cuba;4;20-03N;075-49W;;;;38; 78;365;----;Punta Lucrecia, Holguin;;Cuba;4;21-04N;075-37W;;;;4; 78;366;----;Gran Piedra, Santiago De Cuba;;Cuba;4;20-02N;075-38W;;;1226;1226; 78;367;MUGM;GUANTANAMO BAY, CUBA NAVAL;CU;Cuba;4;19-55N;075-12W;19-54N;075-08W;17;23; 78;368;----;Guantanamo, Guantanamo;;Cuba;4;20-08N;075-14W;;;55;55; 78;369;----;Punta De Maisi, Guantanamo;;Cuba;4;20-15N;074-09W;;;10;10; 78;370;----;Guaro, Holguin;;Cuba;4;20-40N;075-47W;;;;20; 78;371;----;Pinares De Mayari, Holguin;;Cuba;4;20-29N;075-48W;;;;646; 78;373;----;Santiago De Las Vegas, Ciudad Habana;;Cuba;4;22-58N;082-23W;;;;78; 78;374;----;Tapaste, La Habana;;Cuba;4;23-01N;082-08W;;;;120; 78;375;----;Melena Del Sur, La Habana;;Cuba;4;22-46N;082-08W;;;;25; 78;376;----;Bauta, La Habana;;Cuba;4;22-58N;082-32W;;;;65; 78;377;----;Veguitas, Granma;;Cuba;4;20-19N;076-53W;;;;30; 78;378;----;Velasco, Holguin;;Cuba;4;21-05N;076-18W;;;;35; 78;379;----;Loma El Maney, Granma;;Cuba;4;19-55N;077-25W;;;900;900; 78;383;----;Grand Cayman;;Cayman Islands;4;19-15N;081-25W;;;;0; 78;384;MWCR;Owen Roberts Airportgrand Cayman;;Cayman Islands;4;19-17N;081-21W;19-18N;081-22W;3;3; 78;387;----;Negril Point;;Jamaica;4;18-15N;078-22W;;;9;10; 78;388;MKJS;Montego Bay / Sangster;;Jamaica;4;18-30N;077-55W;;;1;8;P 78;397;MKJP;Kingston / Norman Manley;;Jamaica;4;17-56N;076-47W;17-56N;076-47W;3;14;P 78;399;----;Morant Point;;Jamaica;4;17-55N;076-11W;;;2;2;P 78;401;----;Mole Saint-Nicolas;;Haiti;4;19-49N;073-23W;;;;; 78;409;MTCH;Cap-Haitien;;Haiti;4;19-45N;072-11W;;;2;3; 78;435;----;Jeremie;;Haiti;4;18-37N;074-05W;;;;; 78;437;----;Port-Au-Prince Damien ;;Haiti;4;18-36N;072-17W;;;14;15; 78;439;KQHA;FOB Mandrian;;Haiti;4;19-40N;072-02W;;;17;; 78;447;----;Les Cayes;;Haiti;4;18-11N;073-44W;;;1;2; 78;449;----;Jacmel;;Haiti;4;18-14N;072-32W;;;;; 78;451;----;Monte Cristi;;Dominican Republic;4;19-53N;071-39W;;;;2; 78;457;MDPP;Puerto Plata International;;Dominican Republic;4;19-45N;070-33W;;;15;; 78;458;----;Puerto Plata;;Dominican Republic;4;19-45N;070-33W;;;5;;P 78;460;MDST;Santiago;;Dominican Republic;4;19-27N;070-42W;;;183;;P 78;464;----;Cabrera;;Dominican Republic;4;19-38N;069-53W;;;;14; 78;466;----;Arroyo Barril;;Dominican Republic;4;19-12N;069-27W;;;;42; 78;467;----;Sabana De La Mar;;Dominican Republic;4;19-03N;069-23W;;;10;10;P 78;470;----;San Juan De La Maguana;;Dominican Republic;4;18-49N;071-18W;;;;435; 78;473;----;Bayaguana;;Dominican Republic;4;18-45N;069-38W;;;;76; 78;478;----;Cabo Engano;;Dominican Republic;4;18-37N;069-19W;;;2;; 78;479;MDPC;Punta Cana;;Dominican Republic;4;18-34N;068-22W;;;12;;P 78;480;----;Jimani;;Dominican Republic;4;18-20N;071-51W;;;;56; 78;482;MDBH;Barahona;;Dominican Republic;4;18-12N;071-06W;;;3;;P 78;484;MDHE;Herrera;;Dominican Republic;4;18-28N;069-58W;;;58;; 78;485;MDSD;Las Americas;;Dominican Republic;4;18-26N;069-40W;;;18;;P 78;486;----;Santo Domingo;;Dominican Republic;4;18-26N;069-53W;18-28N;069-53W;14;14;P 78;501;MHIC;Islas Del Cisne;;Honduras;4;17-24N;083-56W;17-24N;083-56W;9;11;P 78;514;TJBQ;Aquadilla, Rafael Hernandez Airport;PR;United States;4;18-30N;067-08W;18-30N;067-08W;72;69; 78;526;----;San Juan / Int., Puerto Rico;;Puerto Rico;4;18-26N;066-00W;18-26N;066-00W;3;19;P 78;535;TJNR;ROOSEVELT ROADS PUERTO RICO;PR;United States;4;18-15N;65-38W;18-59-20N;065-38-20W;12;10; 78;543;TIST;Charlotte Amalie St. Thomas, Cyril E. King Airport;;Virgin Islands;4;18-20N;064-59W;;;7;; 78;545;----;Ham Bluff Light, Saint Croix;;Puerto Rico;4;17-46N;064-53W;;;21;; 78;547;TISX;Christiansted, Henry E. Rohlsen Airport;;Virgin Islands;4;17-42N;064-48W;17-42N;064-48W;20;17; 78;550;TUPJ;Beef Island, Tortola;;British Virgin Islands;4;18-27N;064-32W;;;4;; 78;583;MZBZ;Belize / Phillip Goldston Intl. Airport;;Belize;4;17-32N;088-18W;17-32N;088-18W;5;5;P 78;584;----;Belize / Landivar;;Belize;4;17-31N;088-12W;;;;1; 78;588;----;Half Moon Caye;;Belize;4;17-11N;087-30W;;;1;; 78;596;----;Hunting Caye;;Belize;4;16-06N;088-15W;;;1;; 78;615;MGFL;Flores;;Guatemala;4;16-55N;089-53W;;;115;115; 78;625;----;Poptun;;Guatemala;4;16-19N;089-25W;;;;500; 78;627;MGHT;Huehuetenango;;Guatemala;4;15-19N;091-28W;;;1901;1901; 78;631;MGCB;Coban;;Guatemala;4;15-28N;090-19W;;;1316;; 78;637;MGPB;Puerto Barrios;;Guatemala;4;15-43N;088-36W;15-43N;088-36W;1;1; 78;639;MGRT;Retalhuleu;;Guatemala;4;14-32N;091-40W;;;239;; 78;640;----;Guatemala Observa-Torio Nacional ;;Guatemala;4;14-35N;090-31W;;;1502;1502; 78;641;MGGT;Guatemala Aeropuertola Aurora ;;Guatemala;4;14-35N;090-31W;14-35N;090-31W;1489;1489; 78;647;MGSJ;San Jose;;Guatemala;4;13-55N;090-49W;13-55N;090-49W;2;2; 78;650;MSAC;Acajutla;;El Salvador;4;13-34N;089-50W;13-34N;089-50W;15;15;P 78;652;----;Los Andes;;El Salvador;4;13-53N;089-39W;;;1770;; 78;655;MSSA;Santa Ana / El Palmar;;El Salvador;4;13-59N;089-34W;;;725;; 78;662;----;San Salvador;;El Salvador;4;13-43N;089-12W;;;698;689; 78;663;MSSS;San Salvador / Ilopango;;El Salvador;4;13-42N;089-07W;13-42N;089-07W;616;621;P 78;666;MSLP;El Salvador Intl. Airport / Comalapa;;El Salvador;4;13-26N;089-03W;;;25;25; 78;670;MSSM;San Miguel / El Papalon;;El Salvador;4;13-27N;088-07W;;;80;; 78;672;----;La Union;;El Salvador;4;13-20N;087-53W;;;95;; 78;700;MHAM;Amapala;;Honduras;4;13-16N;087-39W;;;5;; 78;701;MHNO;Guanaja;;Honduras;4;16-28N;086-04W;;;2;; 78;703;MHRO;Roatan;;Honduras;4;16-19N;086-31W;;;5;2;P 78;705;MHLC;La Ceiba Airport ;;Honduras;4;15-44N;086-52W;;;3;26;P 78;706;MHTE;Tela;;Honduras;4;15-43N;087-29W;;;3;3;P 78;707;MHYR;Yoro;;Honduras;4;15-10N;087-07W;;;670;670; 78;708;MHLM;La Mesa San Pedro Sula ;;Honduras;4;15-27N;087-56W;;;31;31;P 78;711;MHPL;Puerto Lempira;;Honduras;4;15-13N;083-48W;;;13;13;P 78;714;MHCA;Catacamas;;Honduras;4;14-54N;085-56W;;;442;442;P 78;717;MHSR;Santa Rosa De Copan;;Honduras;4;14-47N;088-47W;;;1079;1079;P 78;718;MHSC;Coronel Enrique Soto Cano Air Base;;Honduras;4;14-23N;087-37W;14-23N;087-37W;628;628; 78;719;MHLE;La Esperanza;;Honduras;4;14-19N;088-09W;;;1100;1674; 78;720;MHTG;Tegucigalpa;;Honduras;4;14-03N;087-13W;14-02N;087-15W;994;1007;P 78;724;MHCH;Choluteca;;Honduras;4;13-18N;087-11W;13-18N;087-11W;48;48;P 78;728;----;San Isidro;;Nicaragua;4;12-54N;086-11W;;;;465; 78;729;----;Condega;;Nicaragua;4;13-22N;086-24W;;;;560; 78;730;MNPC;Puerto Cabezas;;Nicaragua;4;14-03N;083-22W;14-02N;083-24W;20;20;P 78;731;----;Nandaime;;Nicaragua;4;11-43N;086-03W;;;;95; 78;732;----;Masatepe;;Nicaragua;4;11-54N;086-09W;;;;150; 78;733;MNRS;Rivas;;Nicaragua;4;11-25N;085-50W;;;53;70;P 78;734;MNJG;Jinotega;;Nicaragua;4;13-05N;085-59W;;;985;1032;P 78;735;MNJU;Juigalpa;;Nicaragua;4;12-06N;085-22W;;;90;90;P 78;736;----;Posoltega;;Nicaragua;4;12-33N;086-59W;;;;80; 78;737;----;Leon;;Nicaragua;4;12-27N;086-52W;;;;110; 78;738;----;Corinto;;Nicaragua;4;12-31N;087-12W;;;;10; 78;739;MNCH;Chinandega;;Nicaragua;4;12-38N;087-08W;;;53;60;P 78;740;----;Ocotal;;Nicaragua;4;13-37N;086-28W;;;;612;P 78;741;MNMG;Managua A. C. Sandino;;Nicaragua;4;12-09N;086-10W;12-07N;086-11W;50;56;P 78;742;----;Nagarote;;Nicaragua;4;12-15N;086-33W;;;;76; 78;743;----;Muy Muy;;Nicaragua;4;12-46N;085-38W;;;;320;P 78;744;----;San Carlos;;Nicaragua;4;11-08N;084-47W;;;;40;P 78;745;MNBL;Bluefields;;Nicaragua;4;12-00N;086-46W;;;5;5;P 78;755;MRNC;Nicoya;;Costa Rica;4;10-09N;085-27W;;;120;; 78;760;----;Puntarenas;;Costa Rica;4;09-58N;084-50W;;;5;3;P 78;762;MROC;Juan Santamaria;;Costa Rica;4;10-00N;084-13W;09-59N;084-13W;920;939;P 78;767;MRLM;Puerto Limon;;Costa Rica;4;10-00N;083-03W;;;5;3;P 78;772;MRPM;Palmar Sur;;Costa Rica;4;08-57N;083-28W;;;15;16; 78;774;MRLB;Liberia;;Costa Rica;4;10-37N;085-26W;;;80;80; 78;789;----;Ailigandi;;Panama;4;09-15N;078-02W;;;1;2;P 78;792;MPTO;Tocumen;;Panama;4;09-03N;079-22W;;;45;;P 78;793;MPDA;David;;Panama;4;08-24N;082-25W;;;29;26;P 78;795;MPSA;Santiago;;Panama;4;08-05N;080-57W;;;83;88;P 78;801;MPFS;Ft Sherman Rocob ;;Panama;4;09-20N;079-59W;09-20N;079-59W;52;52; 78;806;MPHO;Howard Air Force Base;;Panama;4;08-55N;079-36W;08-55N;079-36W;16;13;P 78;825;----;Clipperton;;French Polynesia;4;10-18N;109-13W;;;;; 78;846;----;Anguilla;;Anguilla;4;18-12N;063-03W;;;;29; 78;857;----;Basseterre;;Saint Kitts and Nevis;4;17-17N;062-44W;;;30;9; 78;858;TKPK;Golden Rock;;Saint Kitts and Nevis;4;17-18N;062-41W;;;48;48; 78;859;TKPN;Charlestown / Newcast;;Antigua and Barbuda;4;17-12N;062-35W;;;17;; 78;861;----;Coolidge Field, Antigua Aux. Afb ;;Antigua and Barbuda;4;17-07N;061-47W;17-07N;061-47W;22;10; 78;862;TAPA;Vc Bird International Airport Antigua;;Antigua and Barbuda;4;17-07N;061-47W;;;8;10; 78;866;TNCM;Juliana Airport, Saint Maarten;;Netherlands Antilles;4;18-03N;063-07W;18-03N;063-07W;4;9;P 78;873;TNCE;Roosevelt Airport Saint Eustatius;;Netherlands Antilles;4;17-29N;062-59W;;;38;39;P 78;894;TFFJ;Gustavia, Saint Barthelemy;;Guadeloupe;4;17-54N;062-51W;17-54N;062-52W;48;52;P 78;897;TFFR;Le Raizet, Guadeloupe;;Guadeloupe;4;16-16N;061-31W;16-16N;061-32W;11;11;P 78;905;TDPD;Melville Hall Airport;;Dominica;4;15-32N;061-18W;;;13;14; 78;906;TDCF;Canefield Airport;;Dominica;4;15-32N;061-24W;;;5;5; 78;907;TDPR;Roseau;;Dominica;4;15-18N;061-24W;;;72;72; 78;922;----;Caravelle;;Martinique;4;14-46N;060-53W;;;33;34; 78;925;TFFF;Le Lamentin;;Martinique;4;14-36N;061-00W;14-36N;061-00W;5;7;P 78;947;TLPC;Vigie;;Saint Lucia;4;14-01N;061-00W;;;2;2; 78;948;TLPL;Hewanorra International Airport;;Saint Lucia;4;13-45N;060-57W;;;3;10; 78;951;TVSV;Arnos Vale;;Saint Vincent and the Grenadines;4;13-08N;061-12W;;;9;13; 78;954;TBPB;Grantley Adams;;Barbados;4;13-04N;059-29W;13-04N;059-30W;50;56;P 78;955;----;Caribbean Meteoro-Logical Institute;;Barbados;4;13-09N;059-37W;;;;113; 78;958;TGPY;Point Salines Airport;;Grenada;4;12-00N;061-47W;;;6;7; 78;962;TTPT;Crown Point Airport, Tobago;;Trinidad and Tobago;4;11-09N;060-50W;11-09N;060-50W;3;6;P 78;970;TTPP;Piarco International Airport, Trinidad;;Trinidad and Tobago;4;10-37N;061-21W;10-35N;061-21W;12;15;P 78;982;TNCA;Queen Beatrix Airport;;Aruba;4;12-30N;070-01W;;;18;33;P 78;988;TNCC;Hato Airport, Curacao;;Netherlands Antilles;4;12-12N;068-58W;12-12N;068-58W;9;67;P 78;990;TNCB;Flamingo Airport, Bonaire;;Netherlands Antilles;4;12-09N;068-17W;;;6;7;P 80;001;SKSP;San Andres Isla / Sesquicentenario;;Colombia;4;12-35N;081-43W;12-35N;081-42W;1;6;P 80;002;SKPV;Providencia Isla / El Embrujo;;Colombia;4;13-22N;081-21W;;;6;;P 80;009;SKSM;Santa Marta / Simon Bolivar;;Colombia;3;11-08N;074-14W;;;4;14;P 80;022;SKCG;Cartagena / Rafael Nunez;;Colombia;3;10-27N;075-31W;;;1;12;P 80;028;SKBQ;Barranquilla / Ernestocortissoz;;Colombia;3;10-53N;074-47W;10-54N;074-46W;14;30;P 80;035;SKRH;Riohacha / Almirante Padilla;;Colombia;3;11-32N;072-56W;11-32N;072-56W;4;4;P 80;036;SKVP;Valledupar / Alfonso Lopez;;Colombia;3;10-26N;073-15W;;;138;;P 80;044;----;Corozal / Las Brujas;;Colombia;3;09-20N;075-17W;;;81;86;P 80;048;----;Magangue / Baracoa;;Colombia;3;09-16N;074-49W;;;18;;P 80;062;----;Turbo / Gonzalo Mejia;;Colombia;3;08-07N;076-44W;;;1;5;P 80;063;SKMR;Monteria / Los Garzones;;Colombia;3;08-49N;075-51W;;;20;26;P 80;074;----;El Banco / Las Flores;;Colombia;3;09-04N;073-59W;;;34;;P 80;077;----;Ocana / Aguas Claras;;Colombia;3;08-19N;073-22W;;;1435;;P 80;084;SKLC;Apartado / Los Cedros;;Colombia;3;07-49N;076-42W;;;20;;P 80;091;SKEJ;Barrancabermeja / Yariguies;;Colombia;3;07-01N;073-48W;;;126;134;P 80;094;SKBG;Bucaramanga / Palonegro;;Colombia;3;07-06N;073-12W;;;1189;;P 80;097;SKCC;Cucuta / Camilo Daza;;Colombia;3;07-56N;072-31W;;;250;317;P 80;099;SKUC;Arauca / Santiago Perez;;Colombia;3;07-04N;070-44W;;;128;128;P 80;110;SKMD;Medellin / Olaya Herrera;;Colombia;3;06-13N;075-36W;;;1490;1499;P 80;112;SKRG;Rionegro / J. M. Cordova;;Colombia;3;06-08N;075-26W;;;2140;2142;P 80;132;----;Tame / Tame;;Colombia;3;06-27N;071-45W;;;350;;P 80;139;SKPC;Puerto Carreno / A. Guauquea;;Colombia;3;06-10N;067-30W;;;55;;P 80;143;----;Condoto / Mandinga;;Colombia;3;05-05N;076-42W;;;72;;P 80;144;SKUI;Quibdo / El Carano;;Colombia;3;05-43N;076-37W;;;53;;P 80;149;----;Manizales / La Nubia;;Colombia;3;05-02N;075-28W;;;2080;;P 80;175;----;Trinidad / Trinidad;;Colombia;3;05-26N;071-39W;;;217;;P 80;210;SKPE;Pereira / Matecana;;Colombia;3;04-49N;075-44W;;;1342;1342;P 80;211;SKAR;Armenia / El Eden;;Colombia;3;04-30N;075-43W;;;1204;1219;P 80;214;SKIB;Ibague / Perales;;Colombia;3;04-26N;075-09W;;;928;;P 80;219;----;Girardot / Santiago Villa;;Colombia;3;04-17N;074-48W;;;286;293;P 80;222;SKBO;Bogota / Eldorado;;Colombia;3;04-43N;074-09W;04-42N;074-09W;2547;2548;P 80;234;SKVV;Villavicencio / Vanguardia;;Colombia;3;04-10N;073-37W;;;423;431;P 80;241;----;Las Gaviotas;;Colombia;3;04-33N;070-55W;04-33N;070-55W;171;167;P 80;252;SKBU;Buenaventura;;Colombia;3;03-51N;076-58W;;;14;15;P 80;259;SKCL;Cali / Alfonso Bonillaaragon;;Colombia;3;03-33N;076-23W;03-33N;076-23W;961;969;P 80;300;----;Guapi;;Colombia;3;02-35N;077-54W;;;54;;P 80;308;SKPP;Popayan / Guillermo;;Colombia;3;02-28N;076-36W;02-27N;076-36W;1730;1730; 80;315;SKNV;Neiva / Benito Salas;;Colombia;3;02-58N;075-18W;;;439;443;P 80;318;----;San Vicente Del Caguan.;;Colombia;3;02-09N;074-48W;;;300;;P 80;322;SKSJ;San Jose Del Guaviare;;Colombia;3;02-34N;072-38W;;;155;155;P 80;336;----;Tumaco / La Florida;;Colombia;3;01-49N;078-45W;;;3;6;P 80;342;SKPS;Pasto / Antonio Narin;;Colombia;3;01-25N;077-16W;;;1826;; 80;346;----;Pitalito;;Colombia;3;01-52N;076-03W;;;1320;;P 80;354;----;Florencia / Capitolio;;Colombia;3;01-36N;075-32W;;;244;;P 80;361;SKMU;Mitu;;Colombia;3;01-08N;070-03W;;;207;; 80;370;SKIP;Ipiales / San Luis;;Colombia;3;00-49N;077-38W;;;2961;;P 80;372;SKAS;Puerto Asis;;Colombia;3;00-30N;076-30W;;;254;;P 80;385;----;Puerto Leguizamo;;Colombia;3;00-12S;074-46W;;;147;;P 80;398;SKLT;Leticia / Vasquez Cobo;;Colombia;3;04-10S;069-57W;04-10S;069-57W;84;84;P 80;400;----;Isla De Aves Base Cientifica Naval S. Bolivar ;;Venezuela;4;15-42N;063-38W;;;14;8; 80;403;SVCR;Coro;;Venezuela;3;11-25N;069-41W;11-25N;069-41W;16;17;P 80;405;SVLO;La Orchila;;Venezuela;3;11-48N;066-11W;11-48N;066-11W;3;3;P 80;407;SVMC;Maracaibo-La Chinita;;Venezuela;3;10-34N;071-44W;10-34N;071-44W;66;65;P 80;410;SVBM;Barquisimeto;;Venezuela;3;10-04N;069-19W;10-04N;069-19W;613;614;P 80;412;SVPC;Pto. Cabello;;Venezuela;3;10-30N;068-00W;;;2;2;P 80;413;SVBS;Maracay-B. A. Sucre;;Venezuela;3;10-15N;067-39W;10-15N;067-39W;436;437;P 80;415;SVMI;Caracas / Maiquetia Aerop. Intl. Simon Bolivar;;Venezuela;3;10-36N;066-59W;10-36N;066-59W;43;48;P 80;416;SVFM;Caracas / La Carlota;;Venezuela;3;10-30N;066-53W;10-30N;066-53W;835;835;P 80;419;SVBC;Barcelona;;Venezuela;3;10-07N;064-41W;10-07N;064-41W;7;7;P 80;420;SVCU;Cumana;;Venezuela;3;10-27N;064-11W;;;2;4;P 80;421;----;Porlamar Aero-Puerto International Del Caribe ;;Venezuela;3;10-55N;063-58W;10-55N;063-58W;24;19;P 80;423;SVGI;Guiria;;Venezuela;3;10-35N;062-19W;;;13;14;P 80;425;SVMN;Mene Grande;;Venezuela;3;09-49N;070-56W;09-49N;070-56W;27;28;P 80;426;SVVL;Valera;;Venezuela;3;09-21N;070-37W;09-21N;070-37W;582;582;P 80;427;SVAC;Acarigua;;Venezuela;3;09-33N;069-14W;;;226;225;P 80;428;SVGU;Guanare;;Venezuela;3;09-01N;069-44W;;;163;163;P 80;431;SVJM;San Juan De Los Morros;;Venezuela;3;09-55N;067-20W;;;429;429;P 80;432;----;Carrizal;;Venezuela;3;09-25N;066-55W;;;160;161;P 80;434;SVVP;Valle De La Pascua;;Venezuela;3;09-13N;066-01W;;;125;; 80;435;SVMT;Maturin;;Venezuela;3;09-45N;063-11W;09-45N;063-11W;65;66;P 80;437;----;El Vigia;;Venezuela;3;08-38N;071-39W;;;103;103; 80;438;SVMD;Merida;;Venezuela;3;08-36N;071-11W;;;1479;1498;P 80;440;SVBI;Barinas;;Venezuela;3;08-37N;070-13W;;;203;204;P 80;442;SVCL;Calabozo;;Venezuela;3;08-56N;067-25W;;;100;101;P 80;444;SVCB;Ciudad Bolivar;;Venezuela;3;08-09N;063-33W;08-07N;063-32W;43;48;P 80;447;SVSA;San Antonio Del Tachira;;Venezuela;3;07-51N;072-27W;07-51N;072-27W;377;378;P 80;448;SVGD;Guasdualito;;Venezuela;3;07-14N;070-48W;07-14N;070-48W;130;131;P 80;450;SVSR;San Fernando De Apure;;Venezuela;3;07-54N;067-25W;07-52N;067-26W;47;48;P 80;453;SVTM;Tumeremo;;Venezuela;3;07-18N;061-27W;07-18N;061-27W;180;181;P 80;457;SVPA;Puerto Ayacucho;;Venezuela;3;05-36N;067-30W;05-36N;067-30W;73;74;P 80;462;SVSE;Santa Elena De Uairen;;Venezuela;3;04-36N;061-07W;04-36N;061-07W;907;907;P 80;472;SVVA;Valencia;;Venezuela;3;10-10N;067-56W;;;430;431;P 80;475;SVSO;Sto. Domingo;;Venezuela;3;07-35N;072-04W;;;327;327;P 80;476;----;La Canada;;Venezuela;3;10-31N;071-39W;10-31N;071-39W;26;26;P 80;478;SVTR;Temblador;;Venezuela;3;09-01N;062-37W;;;30;30;P 80;479;----;Palmichal;;Venezuela;3;10-18N;068-14W;;;1000;; 81;001;SYGT;Georgetown;;Guyana;3;06-48N;058-09W;;;1;2; 81;002;SYTM;Timehri Airport;;Guyana;3;06-30N;058-15W;;;28;30; 81;005;----;Kamarang;;Guyana;3;05-53N;060-30W;;;494;495; 81;006;----;Lethem;;Guyana;3;03-22N;059-48W;;;82;82; 81;010;----;Ebini;;Guyana;3;05-34N;057-47W;;;28;29; 81;058;----;New Amsterdam;;Guyana;3;06-15N;057-15W;;;1;1; 81;080;----;Kaieteur Falls;;Guyana;3;05-11N;059-29W;;;438;439; 81;100;----;Mabaruma;;Guyana;3;08-12N;059-47W;;;50;50; 81;200;----;Zorg En Hoop;;Suriname;3;05-49N;055-11W;05-49N;055-11W;7;7; 81;202;----;Nickerie;;Suriname;3;05-57N;057-02W;05-57N;057-02W;2;2;P 81;209;----;Stoelmanseiland;;Suriname;3;04-21N;054-25W;;;52;52;P 81;225;SMZY;Zanderij;;Suriname;3;05-27N;055-12W;05-27N;055-12W;15;15;P 81;250;----;Tafelberg;;Suriname;3;03-47N;056-09W;;;;323;P 81;251;----;Sipaliwini;;Suriname;3;02-02N;056-07W;;;;265;P 81;253;----;Coeroeni;;Suriname;3;03-22N;057-20W;;;;165;P 81;260;----;Kabalebo;;Suriname;3;04-24N;057-13W;;;;80; 81;401;SOOM;Saint-Laurent-Du-Maroni;;French Guiana;3;05-30N;054-02W;05-30N;054-02W;4;9;P 81;403;----;Kourou;;French Guiana;3;05-12N;052-45W;;;8;; 81;405;SOCA;Cayenne / Rochambeau;;French Guiana;3;04-50N;052-22W;04-50N;052-22W;105;9;P 81;408;----;Saint Georges De L'Oyapock;;French Guiana;3;03-53N;051-48W;03-53N;051-48W;6;7;P 81;415;----;Maripasoula;;French Guiana;3;03-38N;054-02W;03-38N;054-02W;105;106;P 82;014;----;Normandia;;Brazil;3;03-30N;060-10W;;;700;; 82;017;SBOI;Oiapoque;;Brazil;3;03-50N;051-50W;;;39;39; 82;022;SBBV;Boa Vista, Boa Vista Intl ;;Brazil;3;02-50N;060-42W;02-50N;060-42W;84;; 82;024;----;Boa Vista;;Brazil;3;02-49N;060-39W;;;90;; 82;026;----;Tirios;;Brazil;3;02-29N;055-59W;;;325;326; 82;030;----;Amapa;;Brazil;3;02-04N;050-51W;;;;10; 82;042;----;Caracarai;;Brazil;3;01-50N;061-08W;;;95;95; 82;067;SBYA;Iauarete;;Brazil;3;00-37N;069-12W;;;120;; 82;094;----;Ponta Do Ceu;;Brazil;3;00-46N;050-06W;;;3;4; 82;098;SBMQ;Macapa;;Brazil;3;00-02N;050-03W;;;15;; 82;099;----;Macapa-Aeroporto;;Brazil;3;00-03N;051-04W;;;16;17; 82;100;----;Pari-Cachoeira;;Brazil;3;00-10S;069-58W;;;115;115; 82;103;----;Taracua;;Brazil;3;00-04N;068-14W;;;;105; 82;106;SBUA;Sao Gabriel Da Cachoeira;;Brazil;3;00-08S;067-05W;;;90;; 82;111;SBEG;Eduardo Gomes International;;Brazil;3;03-02S;060-03W;;;2;; 82;113;SWBC;Barcelos;;Brazil;3;00-59S;062-35W;;;40;; 82;141;----;Soure;;Brazil;3;00-40S;048-33W;;;11;11; 82;143;----;Salinopolis;;Brazil;3;00-37S;047-23W;;;25;14; 82;145;----;Tracuateua Braganca ;;Brazil;3;01-05S;046-56W;;;36;; 82;178;----;Obidos;;Brazil;3;01-55S;055-33W;;;37;37; 82;181;----;Monte Alegre;;Brazil;3;02-00S;054-05W;;;146;; 82;184;----;Porto De Moz;;Brazil;3;01-44S;052-14W;;;17;; 82;188;----;Breves;;Brazil;3;01-40S;050-29W;;;15;; 82;191;----;Belem;;Brazil;3;01-27S;048-28W;;;10;; 82;193;SBBE;Belem Aeroporto ;;Brazil;3;01-23S;048-29W;01-23S;048-29W;16;16; 82;198;----;Turiacu;;Brazil;3;01-43S;045-24W;;;44;; 82;212;----;Fonte Boa;;Brazil;3;02-32S;066-10W;;;55;; 82;240;----;Parintins;;Brazil;3;02-38S;056-44W;;;29;; 82;244;SBSN;Santarem-Aeroporto;;Brazil;3;02-26S;054-43W;02-26S;054-43W;72;72; 82;246;----;Belterra;;Brazil;3;02-38S;054-57W;;;176;; 82;263;----;Cameta;;Brazil;3;02-15S;049-30W;;;24;24; 82;277;----;Farol Santana;;Brazil;3;02-16S;043-37W;;;7;8; 82;280;----;Sao Luiz;;Brazil;3;02-32S;044-18W;02-32S;044-17W;51;51; 82;281;SBSL;Sao Luiz Aeroporto ;;Brazil;3;02-36S;044-14W;02-36S;044-14W;53;53; 82;287;----;Parnaiba;;Brazil;3;02-55S;041-36W;02-55S;041-36W;22;22; 82;288;SBPB;Parnaiba Aeroporto ;;Brazil;3;02-55S;041-45W;;;5;; 82;294;----;Arachu;;Brazil;3;02-53S;040-08W;;;17;; 82;303;----;S. Paulo De Olivenca;;Brazil;3;03-28S;068-57W;;;;94; 82;317;SBTF;Tefe;;Brazil;3;03-22S;064-41W;;;47;47; 82;326;----;Codajas;;Brazil;3;03-50S;062-05W;;;48;49; 82;331;----;Manaus;;Brazil;3;03-08S;060-01W;;;72;; 82;332;SBMN;Manaus Aeroporto ;;Brazil;3;03-09S;059-59W;03-09S;059-59W;84;84; 82;336;----;Itacoatiara;;Brazil;3;03-08S;058-26W;;;40;; 82;353;SBHT;Altamira;;Brazil;3;03-12S;052-12W;;;74;; 82;361;SBTU;Tucurui;;Brazil;3;03-43S;049-43W;;;40;; 82;376;----;Ze Doca;;Brazil;3;03-42S;045-34W;;;45;46; 82;392;----;Sobral;;Brazil;3;03-42S;040-21W;;;83;; 82;397;----;Fortaleza;;Brazil;3;03-46S;038-36W;03-43S;038-33W;26;19; 82;398;SBFZ;Fortaleza / pinto Martins ;;Brazil;3;03-47S;038-32W;03-47S;038-32W;25;25; 82;400;SBFN;Fernando De Noronha;;Brazil;3;03-51S;032-25W;03-51S;032-25W;56;45; 82;410;SBBC;Benjamin Constant;;Brazil;3;04-23S;070-02W;;;65;; 82;411;SBTT;Tabatinga;;Brazil;3;03-40S;069-40W;;;85;; 82;418;----;Carauari;;Brazil;3;04-57S;066-54W;;;81;; 82;425;----;Coari;;Brazil;3;04-55S;063-05W;;;46;; 82;444;SBIH;Itaituba;;Brazil;3;04-15S;056-00W;;;34;; 82;445;----;Itaituba;;Brazil;3;04-16S;055-35W;;;45;; 82;460;----;Bacabal;;Brazil;3;04-15S;044-47W;;;25;; 82;476;----;Caxias;;Brazil;3;04-51S;043-20W;;;103;103; 82;480;----;Piripiri;;Brazil;3;04-16S;041-47W;;;161;161; 82;487;----;Guaramiranga;;Brazil;3;04-17S;039-00W;;;870;870; 82;493;----;Jaguaruana;;Brazil;3;04-47S;037-46W;;;12;12; 82;533;SBMY;Manicore;;Brazil;3;05-49S;061-18W;;;50;; 82;562;SBMA;Maraba;;Brazil;3;05-21S;049-09W;;;95;; 82;564;SBIZ;Imperatriz;;Brazil;3;05-32S;047-30W;;;123;; 82;565;----;Imperatriz;;Brazil;3;05-32S;047-27W;;;131;131; 82;566;----;Imperatriz;;Brazil;3;05-32S;047-30W;;;123;; 82;568;----;Grajau;;Brazil;3;05-49S;046-28W;;;163;163; 82;571;----;Barra Do Corda;;Brazil;3;05-30S;045-16W;05-30S;045-16W;153;153; 82;578;----;Teresina;;Brazil;3;05-05S;042-49W;;;74;; 82;579;SBTE;Teresina Aeroporto ;;Brazil;3;05-03S;042-49W;05-03S;042-49W;69;69; 82;583;----;Crateus;;Brazil;3;05-10S;040-40W;;;299;299; 82;586;----;Quixeramobim;;Brazil;3;05-12S;039-18W;05-12S;039-18W;212;211; 82;588;----;Morada Nova;;Brazil;3;05-07S;038-22W;;;44;44; 82;590;----;Apodi;;Brazil;3;05-39S;037-48W;;;;65; 82;591;SBMS;Mocoro / 17 Rosado;;Brazil;3;05-12S;037-22W;;;23;; 82;594;----;Macau;;Brazil;3;05-07S;036-38W;;;6;; 82;595;----;Calcanhar;;Brazil;3;05-10S;035-29W;;;12;14; 82;596;----;Ceara-Mirim;;Brazil;3;05-39S;035-25W;05-39S;035-25W;61;61; 82;598;----;Natal;;Brazil;3;05-46S;035-12W;;;45;; 82;599;SBNT;Natal Aeroporto;;Brazil;3;05-55S;035-15W;05-55S;035-15W;52;49; 82;610;----;Eirunepe;;Brazil;3;06-40S;069-52W;;;104;; 82;640;SBEK;Jacareacanga;;Brazil;3;06-16S;057-44W;06-16S;057-44W;98;98; 82;659;----;Araguina;;Brazil;3;07-12S;048-12W;;;229;; 82;668;----;Sao Felix Do Xingu;;Brazil;3;06-38S;051-59W;;;150;; 82;669;----;S. Felix Do Piaui;;Brazil;3;05-57S;042-07W;;;184;184; 82;678;----;Floriano;;Brazil;3;06-46S;043-01W;06-46S;043-01W;127;123; 82;683;----;Taua;;Brazil;3;06-00S;040-25W;;;399;; 82;686;----;Iguatu;;Brazil;3;06-22S;039-18W;;;217;217; 82;689;----;Sao Goncalo;;Brazil;3;06-45S;038-13W;;;233;233; 82;691;----;Florania;;Brazil;3;06-07S;036-49W;;;324;; 82;693;----;Cruzeta;;Brazil;3;06-26S;036-35W;;;226;226; 82;704;SBCZ;Cruzeiro Do Sul;;Brazil;3;07-38S;072-40W;;;170;; 82;723;----;Labrea;;Brazil;3;07-15S;064-50W;;;60;; 82;727;----;Humaita;;Brazil;3;07-31S;063-00W;;;;50; 82;741;----;Alto Tapajos;;Brazil;3;07-21S;057-31W;;;;140; 82;753;----;Ouricuri;;Brazil;3;07-54S;040-03W;;;460;459; 82;764;SBCI;Maranhao / Carolina Airport;;Brazil;3;07-19S;047-28W;;;183;; 82;765;----;Carolina;;Brazil;3;07-20S;047-28W;07-20S;047-28W;193;192; 82;771;----;Urucui;;Brazil;3;07-14S;044-33W;;;190;187; 82;777;----;Campos Sales;;Brazil;3;07-00S;043-23W;;;583;583; 82;780;----;Picos;;Brazil;3;07-04S;041-29W;;;208;; 82;784;----;Barbalha;;Brazil;3;07-19S;039-18W;07-19S;039-18W;409;409; 82;789;----;Triunfo;;Brazil;3;07-51S;038-08W;;;1020;; 82;791;----;Patos;;Brazil;3;07-01S;037-16W;07-01S;037-16W;249;249; 82;792;----;Monteiro;;Brazil;3;07-53S;037-04W;;;599;599; 82;795;SBKG;Campina Grande;;Brazil;3;07-13S;035-53W;;;548;; 82;796;----;Campinagrande;;Brazil;3;07-16S;035-53W;;;500;; 82;797;----;Surubim;;Brazil;3;07-18S;035-26W;;;418;; 82;798;SBJP;Joao Pessoa;;Brazil;3;07-06S;034-52W;;;7;; 82;807;SBTK;Tarauaca;;Brazil;3;08-10S;070-46W;;;190;; 82;824;SBPV;Porto Velho Aeroporto ;;Brazil;3;08-46S;063-55W;08-46S;063-55W;102;102; 82;825;----;Porto Velho;;Brazil;3;08-46S;063-55W;;;95;; 82;861;SBAA;Conceicao Do Araguaia;;Brazil;3;08-15S;049-17W;;;157;; 82;863;----;Pedro Afonso;;Brazil;3;08-58S;048-11W;;;187;; 82;879;----;S. Joao Do Piaui;;Brazil;3;08-21S;042-15W;;;235;; 82;882;----;Paulistana;;Brazil;3;08-08S;041-09W;;;374;375; 82;886;----;Cabrobo;;Brazil;3;08-31S;039-20W;;;341;341; 82;893;----;Garanhuns;;Brazil;3;08-53S;036-31W;;;823;; 82;895;----;Caruaru;;Brazil;3;08-17S;035-58W;;;;529; 82;899;SBRF;Recife Aeroporto ;;Brazil;3;08-04S;034-51W;;;19;; 82;900;----;Recife;;Brazil;3;08-03S;034-55W;08-03S;034-55W;7;11; 82;915;----;Rio Branco;;Brazil;3;09-58S;067-48W;;;160;; 82;917;SBRB;Rio Branco;;Brazil;3;10-00S;067-48W;;;142;143; 82;927;----;Cotrigwacu;;Brazil;3;09-55S;058-16W;;;250;; 82;965;SBAT;Alta Floresta Aeroporto ;;Brazil;3;09-52S;056-06W;09-52S;056-06W;288;288; 82;975;----;Bom Jesus;;Brazil;3;09-06S;044-07W;09-06S;044-07W;331;331; 82;976;----;Caracol;;Brazil;3;09-17S;043-20W;;;523;; 82;979;----;Remanso;;Brazil;3;09-38S;042-06W;;;401;; 82;983;----;Petrolina;;Brazil;3;09-23S;040-29W;09-23S;040-30W;370;370; 82;984;SBPL;Petrolina ;;Brazil;3;09-21S;040-33W;;;385;; 82;986;SBUF;Paulo Afonso;;Brazil;3;09-24S;038-13W;;;253;; 82;989;----;Agua Branca;;Brazil;3;09-10S;037-32W;;;605;; 82;990;----;Pao De Acucatr;;Brazil;3;09-27S;037-15W;;;19;; 82;992;----;Palmeiro Dos Indios;;Brazil;3;09-27S;036-42W;;;275;; 82;993;SBMO;Maceio Aeroporto ;;Brazil;3;09-31S;035-47W;09-31S;035-47W;117;115; 82;994;----;Maceio;;Brazil;3;09-40S;035-42W;;;65;; 83;010;----;Brasileia;;Brazil;3;11-01S;068-44W;;;;260; 83;033;----;Machado;;Brazil;3;21-40S;045-50W;;;905;; 83;036;----;Sao Sebastiao;;Brazil;3;23-48S;045-24W;;;4;5; 83;055;----;Pico Couto;;Brazil;3;22-27S;043-17W;;;;; 83;058;----;Sao Roque / S. Paulo;;Brazil;3;23-31S;047-07W;;;;; 83;063;SBPN;Porto Nacional Aeroporto ;;Brazil;3;10-42S;048-24W;10-42S;048-24W;261;290; 83;064;----;Porto Nacional;;Brazil;3;10-31S;048-43W;10-42S;048-25W;239;238; 83;076;----;Ibipetuba;;Brazil;3;11-01S;044-31W;;;450;450; 83;088;----;Senar Do Bomfmi;;Brazil;3;10-28S;040-11W;;;55;; 83;090;----;Monte Santo;;Brazil;3;10-26S;039-18W;;;;464; 83;095;SBAR;Aracaju Aeroporto ;;Brazil;3;10-59S;037-04W;;;8;9; 83;096;----;Aracaju;;Brazil;3;10-55S;037-03W;10-55S;037-03W;5;6; 83;097;----;Propria;;Brazil;3;10-12S;036-52W;;;19;19; 83;111;SBJR;Rio / Jacarepagua;;Brazil;3;22-59S;043-22W;;;3;; 83;179;----;Barra;;Brazil;3;11-05S;043-10W;;;402;; 83;182;----;Irece;;Brazil;3;11-18S;041-52W;11-18S;041-52W;747;747; 83;184;----;Morro Do Chapeu;;Brazil;3;11-33S;041-09W;;;1002;1005; 83;186;----;Jacobina;;Brazil;3;11-11S;040-28W;;;485;; 83;190;----;Serrinha;;Brazil;3;11-38S;038-58W;;;;359; 83;192;----;Cipo;;Brazil;3;11-05S;038-30W;;;145;; 83;195;----;Itabaianinha;;Brazil;3;11-07S;037-49W;;;208;208; 83;208;SBVH;Vilhena Aeroporto ;;Brazil;3;12-42S;060-06W;12-44S;060-08W;612;652; 83;214;----;Matupa;;Brazil;3;10-15S;054-55W;;;285;; 83;220;----;Rio Xingu;;Brazil;3;12-00S;053-24W;;;;300; 83;221;----;Feira De Santana;;Brazil;3;12-12S;038-54W;;;234;; 83;228;----;Peixe;;Brazil;3;12-01S;048-32W;;;250;250; 83;229;----;Salvador;;Brazil;3;13-01S;038-31W;13-00S;038-31W;51;51; 83;231;----;Parana;;Brazil;3;12-33S;047-50W;;;275;; 83;235;----;Taguatinga;;Brazil;3;12-24S;046-26W;;;604;; 83;236;----;Barreiras;;Brazil;3;12-09S;045-00W;12-09S;045-00W;439;440; 83;242;----;Lencois;;Brazil;3;12-34S;041-23W;;;439;; 83;244;----;Itaberaba;;Brazil;3;12-33S;040-26W;;;249;249; 83;248;SBSV;Salvador Aeroporto ;;Brazil;3;12-54S;038-20W;12-56S;038-21W;6;13; 83;249;----;Alagoinha;;Brazil;3;12-17S;038-35W;;;130;; 83;264;----;Vera Gleba Celeste ;;Brazil;3;12-12S;056-30W;;;415;; 83;270;----;Canarana;;Brazil;3;13-20S;052-30W;;;430;; 83;286;----;Correntina;;Brazil;3;13-28S;044-46W;;;589;; 83;288;SBLP;Bom Jesus Da Lapa;;Brazil;3;13-16S;043-25W;13-16S;043-25W;440;440; 83;289;----;Bom Jesus Da Lapa Aeroporto;;Brazil;3;13-16S;043-25W;;;439;440; 83;292;----;Ituacu;;Brazil;3;13-49S;041-18W;;;531;533; 83;295;----;Itirucu Jaguaquara ;;Brazil;3;13-22S;039-57W;;;756;; 83;302;----;Alcomat;;Brazil;3;14-15S;059-15W;;;690;; 83;309;----;Diamantino;;Brazil;3;14-24S;056-27W;;;286;; 83;319;SBXV;Xavantina ;;Brazil;3;14-42S;052-21W;;;315;; 83;332;----;Posse;;Brazil;3;14-06S;046-22W;;;826;; 83;334;----;Formoso;;Brazil;3;14-56S;046-15W;;;840;840; 83;339;----;Caetite;;Brazil;3;14-03S;042-37W;;;882;882; 83;344;SBQV;Vitoria Da Conquista;;Brazil;3;14-57S;040-53W;14-51S;040-50W;840;1042; 83;348;----;Ilheus;;Brazil;3;14-48S;039-04W;;;60;; 83;349;SBIL;Ilheus Aeroporto ;;Brazil;3;14-49S;039-02W;;;4;; 83;358;----;Poxoreo Poxoreu ;;Brazil;3;15-50S;054-23W;;;450;; 83;359;SBBW;Barra Do Garcas;;Brazil;3;15-52S;052-23W;;;350;350; 83;361;----;Cuiaba;;Brazil;3;15-33S;056-07W;15-36S;056-06W;151;165; 83;362;SBCY;Cuiaba Aeroporto ;;Brazil;3;15-39S;056-06W;15-39S;056-06W;187;182; 83;364;----;Padre Records Rem;;Brazil;3;15-47S;056-04W;;;140;; 83;365;----;Sangradouro;;Brazil;3;15-38S;053-54W;;;555;555; 83;368;----;Aragarcas;;Brazil;3;15-54S;052-14W;;;345;; 83;374;----;Goias;;Brazil;3;15-55S;050-08W;;;512;; 83;375;SBGA;Gama;;Brazil;3;16-03S;048-03W;;;700;; 83;376;----;Pirenopolis;;Brazil;3;15-51S;048-58W;;;740;730; 83;377;----;Brasilia;;Brazil;3;15-47S;047-56W;;;1159;; 83;378;SBBR;Brasilia Aeroporto ;;Brazil;3;15-52S;047-56W;15-52S;047-56W;1061;1061; 83;379;----;Formosa;;Brazil;3;15-32S;047-20W;;;912;912; 83;383;----;Buritis;;Brazil;3;15-37S;046-25W;;;600;600; 83;384;----;Arinos;;Brazil;3;15-54S;046-03W;;;519;; 83;386;----;Januaria;;Brazil;3;15-26S;044-22W;;;474;; 83;388;----;Monte Azul;;Brazil;3;15-05S;042-45W;;;604;; 83;389;----;Mocambinho;;Brazil;3;15-03S;044-01W;;;452;452; 83;393;----;Pedra Azul;;Brazil;3;16-00S;041-17W;;;649;; 83;395;----;Janauba;;Brazil;3;15-47S;043-18W;;;516;516; 83;398;----;Canavieiras;;Brazil;3;15-40S;038-56W;;;4;5; 83;405;----;Caceres;;Brazil;3;16-03S;057-41W;;;118;; 83;408;----;Carinhanha;;Brazil;3;14-18S;043-47W;;;447;556; 83;410;----;Rondonopolis;;Brazil;3;16-27S;054-34W;;;94;; 83;419;SBAN;Anapolis Braz-Afb ;;Brazil;3;16-14S;048-58W;;;1137;; 83;423;----;Goiania;;Brazil;3;16-40S;049-15W;;;741;; 83;424;SBGO;Goiania Aeroporto ;;Brazil;3;16-38S;049-13W;;;747;; 83;437;SBMK;Montes Claros;;Brazil;3;16-43S;043-52W;16-44S;043-52W;646;647; 83;441;----;Salinas;;Brazil;3;16-11S;042-17W;;;471;472; 83;442;----;Aracuai;;Brazil;3;16-52S;042-04W;;;284;; 83;467;----;Limeiros;;Brazil;3;17-34S;052-33W;;;;800; 83;470;----;Rio Verde;;Brazil;3;17-55S;050-55W;;;727;727; 83;479;----;Paracatu;;Brazil;3;17-13S;046-52W;;;711;; 83;481;----;Joao Pinheiro;;Brazil;3;17-42S;046-10W;;;760;760; 83;483;----;Pirapora;;Brazil;3;17-20S;044-57W;;;505;; 83;488;----;Itamarandiba;;Brazil;3;17-51S;042-51W;;;1097;; 83;492;----;Teofilo Otoni;;Brazil;3;17-51S;041-31W;;;356;; 83;497;SBCV;Caravelas ;;Brazil;3;17-39S;039-15W;17-38S;039-15W;11;; 83;498;----;Caravelas;;Brazil;3;17-44S;039-15W;17-44S;039-15W;3;3; 83;499;----;Abrolhos;;Brazil;3;17-58S;038-42W;;;36;38; 83;512;----;Coxim;;Brazil;3;18-30S;054-46W;;;287;; 83;513;----;Nhumirim;;Brazil;3;18-59S;056-39W;;;89;; 83;514;----;Capinopolis;;Brazil;3;18-41S;049-34W;;;621;; 83;522;----;Ipameri;;Brazil;3;17-43S;048-10W;;;751;752; 83;526;----;Catalao;;Brazil;3;18-11S;047-57W;;;840;; 83;531;----;Patos De Minas;;Brazil;3;18-36S;046-31W;;;940;; 83;536;----;Curvelo;;Brazil;3;18-46S;044-26W;;;;616; 83;538;----;Diamantina;;Brazil;3;18-14S;043-36W;;;1296;1297; 83;543;----;Governador Valadares;;Brazil;3;18-51S;041-56W;;;277;277; 83;550;----;Sao Mateus;;Brazil;3;18-42S;039-51W;;;25;; 83;552;SBCR;Corumba;;Brazil;3;19-05S;057-30W;;;130;; 83;554;----;Corumba Aeroporto ;;Brazil;3;19-00S;057-40W;;;141;142; 83;565;----;Paranaiba;;Brazil;3;19-42S;051-11W;;;331;; 83;566;----;Confis Intnl Airport;;Brazil;3;19-37S;043-34W;19-37S;043-34W;827;827; 83;570;----;Pompeu;;Brazil;3;19-13S;045-00W;;;691;691; 83;574;----;Frutal;;Brazil;3;20-02S;048-56W;;;543;; 83;576;SBUR;Uberaba;;Brazil;3;19-47S;047-58W;19-46S;047-57W;807;809; 83;577;----;Uberaba;;Brazil;3;19-45S;047-55W;;;743;743; 83;579;----;Araxa;;Brazil;3;19-34S;046-56W;;;1004;; 83;582;----;Bambui;;Brazil;3;20-00S;045-59W;;;661;; 83;583;SBBH;Belo Horizonte Aeroporto ;;Brazil;3;19-51S;043-57W;19-51S;043-57W;785;785; 83;586;----;Sete Lagoas;;Brazil;3;19-29S;044-15W;;;732;732; 83;587;SBCF;Belo Horizonte;;Brazil;3;19-56S;043-56W;;;850;; 83;589;----;Conceicao Do Mato Dentro;;Brazil;3;19-02S;043-26W;;;675;675; 83;592;----;Caratinga;;Brazil;3;19-48S;042-09W;;;609;; 83;595;----;Aimores;;Brazil;3;19-29S;041-04W;;;83;; 83;597;----;Linhares;;Brazil;3;19-24S;040-04W;;;28;28; 83;611;----;Campo Grande;;Brazil;3;20-27S;054-37W;;;530;; 83;612;SBCG;Campo Grande Aeroporto ;;Brazil;3;20-28S;054-40W;20-28S;054-40W;567;567; 83;615;----;Agua Clara;;Brazil;3;20-27S;052-53W;;;365;; 83;617;----;Urubupunga;;Brazil;3;20-48S;051-34W;;;;356; 83;618;----;Tres Lagoas;;Brazil;3;20-47S;051-42W;;;313;; 83;623;----;Votuporanga;;Brazil;3;20-25S;049-59W;;;503;503; 83;625;----;Barreto;;Brazil;3;20-38S;048-34W;;;0;; 83;630;----;Franca;;Brazil;3;20-33S;047-26W;;;1026;; 83;637;----;Oliveira;;Brazil;3;20-41S;044-49W;;;;966; 83;639;----;Caparao;;Brazil;3;20-31S;041-52W;;;843;843; 83;642;----;Vicosa;;Brazil;3;20-45S;042-51W;;;690;; 83;646;----;Cachoeiro Itapemirim;;Brazil;3;20-51S;041-06W;;;77;77; 83;648;----;Vitoria;;Brazil;3;20-19S;040-20W;;;36;; 83;649;SBVT;Vitoria Aeroporto ;;Brazil;3;20-16S;040-17W;20-16S;040-17W;4;4; 83;650;----;Trindade Ilha ;;Brazil;3;20-30S;029-19W;20-30S;029-19W;5;4; 83;654;----;Porto Murtinho;;Brazil;3;21-43S;057-53W;;;97;98; 83;659;----;Dourados;;Brazil;3;22-14S;054-49W;;;452;; 83;660;----;Marambaia;;Brazil;3;23-03S;043-36W;;;10;16; 83;663;----;Ponta Da Armacao;;Brazil;3;22-53S;043-02W;;;1;2; 83;668;----;Ribeirao Preto;;Brazil;3;21-11S;047-43W;;;;621; 83;669;----;Sao Simao;;Brazil;3;21-29S;047-33W;;;617;617; 83;671;SBYS;Pirassununga;;Brazil;3;21-59S;047-20W;21-59S;047-21W;597;598; 83;672;----;Aracatuba;;Brazil;3;21-12S;050-26W;;;;397; 83;674;----;Lins;;Brazil;3;21-40S;049-45W;;;;426; 83;676;----;Catanduva;;Brazil;3;21-08S;048-58W;;;536;; 83;681;SBPC;Pocos De Caldas;;Brazil;3;21-51S;046-34W;;;1260;; 83;683;----;Machado;;Brazil;3;21-40S;045-55W;;;873;873; 83;687;----;Lavras;;Brazil;3;21-14S;045-00W;;;919;; 83;688;----;Sao Joao Del Rei;;Brazil;3;21-08S;044-16W;;;;991; 83;689;SBBQ;Barbacena;;Brazil;3;21-15S;043-46W;;;1171;1171; 83;692;SBJF;Juiz De Fora;;Brazil;3;21-46S;043-21W;;;939;939; 83;695;----;Itaperuna;;Brazil;3;21-12S;041-53W;;;123;123; 83;698;SBCP;Campos;;Brazil;3;21-45S;041-20W;21-45S;041-20W;11;11; 83;700;----;Sao Tome;;Brazil;3;22-03S;041-03W;;;3;4; 83;702;----;Ponta Pora;;Brazil;3;22-32S;055-44W;;;650;; 83;703;SBPP;Ponta Pora Intl ;;Brazil;3;22-33S;055-42W;;;657;; 83;704;----;Ivinhema;;Brazil;3;22-19S;053-56W;;;369;; 83;708;SBGW;Guaratingueta;;Brazil;3;22-47S;045-12W;;;537;537; 83;714;----;Campos Do Jordao;;Brazil;3;22-44S;045-35W;;;1579;; 83;716;SBDN;Presidente Prudente;;Brazil;3;22-07S;051-23W;;;436;; 83;718;----;Cordeiro;;Brazil;3;22-02S;042-22W;;;485;485; 83;719;----;Cabo Frio;;Brazil;3;22-59S;042-02W;;;7;7; 83;721;SBKP;Campinas Aeroporto ;;Brazil;3;23-00S;047-08W;23-00S;047-08W;661;661; 83;722;SBBU;Bauru;;Brazil;3;22-19S;049-04W;;;590;; 83;726;SBSA;Sao Carlos;;Brazil;3;22-01S;047-53W;;;856;; 83;729;----;Campinas;;Brazil;3;22-54S;047-05W;;;;669; 83;732;----;Ouro Fino;;Brazil;3;22-17S;046-33W;;;;925; 83;736;----;Sao Lourenco;;Brazil;3;22-06S;045-01W;;;900;900; 83;738;SBRS;Resende;;Brazil;3;22-29S;044-28W;;;440;; 83;741;SBSC;Rio De Janeiro-Santa Cruz Ab ;;Brazil;3;22-56S;043-43W;22-56S;043-43W;3;3; 83;742;----;Vassouras;;Brazil;3;22-24S;043-40W;;;;437; 83;743;----;Rio De Janeiro;;Brazil;3;22-55S;043-10W;22-54S;043-10W;5;3; 83;744;----;Ilha Rasa;;Brazil;3;23-04S;043-09W;;;73;75; 83;745;----;Nova Friburgo;;Brazil;3;22-17S;042-32W;;;;856; 83;746;SBGL;Galeao;;Brazil;3;22-49S;043-15W;22-49S;043-15W;6;42; 83;748;SBAF;Afonsos Aeroporto ;;Brazil;3;22-52S;043-22W;;;34;; 83;755;SBRJ;Rio De Janeiro Aeroporto ;;Brazil;3;22-54S;043-10W;;;3;; 83;757;----;Tremembe;;Brazil;3;22-58S;045-33W;;;;545; 83;759;SBES;S. P. Aldeia Aerodrome ;;Brazil;3;22-49S;042-06W;;;10;11; 83;766;----;Londrina;;Brazil;3;23-23S;051-11W;;;566;; 83;767;SBMG;Maringa;;Brazil;3;23-25S;051-57W;;;542;542; 83;768;SBLO;Londrina Aeroporto ;;Brazil;3;23-20S;051-08W;23-20S;051-08W;569;570; 83;769;----;Jacarezinho;;Brazil;3;23-09S;049-58W;;;471;; 83;773;----;Avare;;Brazil;3;23-06S;048-55W;;;793;793; 83;774;----;Itapeva;;Brazil;3;23-57S;048-53W;;;647;; 83;775;----;Guaira;;Brazil;3;24-05S;054-15W;;;230;; 83;779;SBMT;Marte Civ / Mil ;;Brazil;3;23-31S;046-38W;;;722;; 83;780;SBSP;Sao Paulo/Congonhas Aeroporto;;Brazil;3;23-37S;046-39W;23-37S;046-39W;803;802; 83;781;----;Sao Paulo;;Brazil;3;23-30S;046-37W;;;792;; 83;782;----;Santos;;Brazil;3;23-55S;046-20W;;;14;; 83;783;----;Campo Mourao;;Brazil;3;24-03S;052-22W;;;616;; 83;784;----;Taubate;;Brazil;3;23-01S;045-34W;;;577;577; 83;786;----;Ubatuba;;Brazil;3;23-27S;045-04W;;;8;; 83;787;----;Moela;;Brazil;3;24-03S;046-16W;;;100;101; 83;788;----;Angra Dos Reis;;Brazil;3;23-01S;044-19W;;;;2; 83;811;----;Ivai;;Brazil;3;24-24S;050-50W;;;808;; 83;813;----;Castro;;Brazil;3;24-47S;050-00W;;;1009;1009; 83;814;----;Jaguariaiva;;Brazil;3;24-15S;049-42W;;;;923; 83;818;SBST;Santos Aeroporto ;;Brazil;3;23-56S;046-18W;;;3;3; 83;821;----;Iguape;;Brazil;3;24-43S;047-33W;;;;3; 83;827;SBFI;Foz Do Iguacu Aeroporto ;;Brazil;3;25-31S;054-35W;25-31S;054-35W;180;180; 83;828;----;Toledo;;Brazil;3;24-44S;053-44W;;;550;550; 83;831;----;S. Miguel Iguacu;;Brazil;3;25-20S;054-15W;;;290;290; 83;836;----;Irati;;Brazil;3;25-28S;050-38W;;;837;; 83;837;----;Ponta Grossa;;Brazil;3;25-06S;050-10W;;;;868; 83;840;SBCT;Curitiba Aeroporto ;;Brazil;3;25-31S;049-10W;25-31S;049-10W;908;908; 83;842;SBBI;Curitiba;;Brazil;3;25-26S;049-16W;;;924;; 83;844;SBPG;Paranagua;;Brazil;3;25-31S;048-31W;;;5;; 83;851;----;Sorocaba;;Brazil;3;23-29S;047-28W;;;632;; 83;857;----;Sorocaba;;Brazil;3;23-29S;047-27W;;;;631; 83;860;----;Palmas;;Brazil;3;26-29S;051-59W;;;1090;1090; 83;864;----;Porto Uniao;;Brazil;3;26-14S;051-04W;;;778;778; 83;867;----;Rio Negro;;Brazil;3;26-06S;049-48W;;;;824; 83;872;----;Indaial;;Brazil;3;26-54S;049-13W;;;68;; 83;874;----;Sao Francisco Do Sul;;Brazil;3;26-15S;048-39W;;;;72; 83;881;----;Irai;;Brazil;3;27-11S;053-14W;;;258;247; 83;883;----;Chapeco;;Brazil;3;27-07S;052-37W;;;679;679; 83;887;----;Campos Novos;;Brazil;3;27-24S;051-12W;;;947;947; 83;891;----;Lages;;Brazil;3;27-49S;050-20W;27-49S;050-20W;937;937; 83;895;----;Arvoredo;;Brazil;3;27-18S;048-21W;;;18;20; 83;897;----;Florianopolis;;Brazil;3;27-35S;048-34W;;;2;2; 83;899;SBFL;Florianopolis Aeroporto ;;Brazil;3;27-40S;048-33W;27-40S;048-33W;5;5; 83;907;----;Sao Luiz Gonzaga;;Brazil;3;28-24S;055-01W;;;245;; 83;912;----;Cruz Alta;;Brazil;3;28-38S;053-37W;;;464;464; 83;914;SBPF;Passo Fundo;;Brazil;3;28-15S;052-24W;;;684;; 83;916;----;Lagoa Vermelha;;Brazil;3;28-13S;051-32W;;;806;806; 83;918;----;Vacaria;;Brazil;3;28-33S;050-56W;;;955;955; 83;919;----;Bom Jesus;;Brazil;3;28-40S;050-26W;;;1048;; 83;920;----;S. Joaquim;;Brazil;3;28-17S;049-55W;;;1402;; 83;924;----;Laguna;;Brazil;3;28-29S;048-48W;;;;31; 83;925;----;Santa Marta;;Brazil;3;28-36S;048-49W;;;43;45; 83;927;----;Uruguaiana;;Brazil;3;29-45S;057-05W;;;62;; 83;928;SBUG;Uruguaiana Aeroporto ;;Brazil;3;29-47S;057-02W;29-47S;057-02W;74;74; 83;931;----;Alegrete;;Brazil;3;29-41S;055-31W;;;;121; 83;936;----;Santa Maria;;Brazil;3;29-42S;053-42W;;;95;; 83;937;SBSM;Santa Maria Aero-Porto ;;Brazil;3;29-43S;053-42W;;;85;; 83;941;----;Bento Goncalves;;Brazil;3;29-10S;051-25W;;;;619; 83;942;----;Caxias Do Sul;;Brazil;3;29-10S;051-12W;;;759;759; 83;948;----;Torres;;Brazil;3;29-20S;049-44W;;;31;; 83;952;----;Canoas;;Brazil;3;29-56S;051-08W;;;8;9; 83;953;----;Santana Do Livramento;;Brazil;3;30-53S;055-32W;;;231;231; 83;964;----;Encruzilhada Do Sul;;Brazil;3;30-32S;052-31W;;;428;; 83;967;SBCO;Porto Alegre;;Brazil;3;30-01S;051-13W;;;47;; 83;970;----;Mostardas;;Brazil;3;31-15S;050-54W;31-17S;050-54W;4;5; 83;971;SBPA;Porto Alegre Aero-Porto ;;Brazil;3;30-00S;051-11W;30-00S;051-11W;3;3; 83;980;----;Bage;;Brazil;3;31-20S;054-06W;;;242;; 83;981;SBBG;Bage Aeroporto ;;Brazil;3;31-21S;054-07W;31-21S;054-07W;180;180; 83;985;SBPK;Pelotas;;Brazil;3;31-52S;052-21W;;;13;13; 83;995;----;Rio Grande;;Brazil;3;32-01S;052-05W;;;2;; 83;997;----;St. Vitoria Do Palmar;;Brazil;3;33-31S;053-21W;;;37;24; 83;998;----;Chui;;Brazil;3;33-45S;053-22W;;;11;13; 84;001;----;Seymour Galapagos ;;Ecuador;3;00-27S;090-16W;;;16;; 84;008;SEST;San Cristobal Galapagos ;;Ecuador;3;00-54S;089-36W;00-54S;089-37W;6;6;P 84;013;----;Esmeraldas Las Palmas;;Ecuador;3;00-56N;079-40W;;;;; 84;018;SEES;Esmeraldas-Tachina;;Ecuador;3;00-58N;079-38W;00-59N;079-39W;7;8;P 84;027;SETU;Tulcan / El Rosal;;Ecuador;3;00-49N;077-42W;;;2950;; 84;043;SEIB;Ibarra / Atahualpa;;Ecuador;3;00-21N;078-08W;;;2228;; 84;063;----;Lago Agrio;;Ecuador;3;00-05N;076-52W;;;299;; 84;069;----;Sto. Dgo. De Los Colorados;;Ecuador;3;00-15S;079-12W;;;660;; 84;071;SEQU;Quito / Mariscal Sucre;;Ecuador;3;00-09S;078-29W;00-08S;078-29W;2811;2812;P 84;088;----;Izobamba-Santa Catalina;;Ecuador;3;00-22S;078-33W;;;3058;; 84;099;----;Coca;;Ecuador;3;00-27S;076-57W;;;220;; 84;101;SEBC;Bahia De Caraquez;;Ecuador;3;00-35S;080-24W;;;3;; 84;117;SEMT;Manta;;Ecuador;3;00-57S;080-41W;;;13;14;P 84;123;SELT;Latacunga;;Ecuador;3;00-55S;078-37W;;;2785;; 84;131;SETI;Tiputini ;;Ecuador;3;00-47S;075-31W;;;220;; 84;132;----;Nuevo Rocafuerte;;Ecuador;3;00-55S;075-24W;;;215;; 84;135;----;Porto Viejo-Granja;;Ecuador;3;01-02S;080-26W;;;44;;P 84;137;----;Portoviejo-Aeropuerto;;Ecuador;3;01-02S;080-27W;;;44;; 84;140;----;Pichilingue;;Ecuador;3;01-06S;079-28W;;;73;;P 84;147;SEAM;Ambato / Chachoan;;Ecuador;3;01-12S;078-34W;;;2520;; 84;160;----;Ambato-Granja;;Ecuador;3;01-15S;078-37W;;;2680;; 84;163;SEPA;Pastaza / Rio Amazonas;;Ecuador;3;01-30S;078-03W;;;1043;1054;P 84;176;----;Riobamba / Chimborazo;;Ecuador;3;01-38S;078-40W;;;2796;; 84;179;----;El Puyo;;Ecuador;3;01-30S;077-57W;;;950;; 84;200;SESA;Salinas / General Ulpiano Paez;;Ecuador;3;02-12S;080-59W;;;4;8;P 84;202;----;Milagro;;Ecuador;3;02-07S;079-36W;;;13;; 84;203;SEGU;Guayaquil / Simon Bolivar;;Ecuador;3;02-09S;079-53W;02-09S;079-53W;4;9;P 84;226;----;Canar;;Ecuador;3;02-33S;078-56W;;;3120;; 84;239;SECU;Cuenca / Mariscal Lamar;;Ecuador;3;02-53S;078-59W;02-53S;078-58W;2530;2531;P 84;248;SEMH;Machala / General M. Serrano;;Ecuador;3;03-15S;079-58W;;;4;10; 84;265;SELO;Catamayo / Camilo Ponce Enriquez;;Ecuador;3;04-00S;079-22W;;;1239;1238;P 84;270;----;Loja / La Argelia;;Ecuador;3;04-02S;079-12W;;;2040;; 84;279;SEMA;Macara / J. M. Velasco I.;;Ecuador;3;04-22S;079-56W;;;430;; 84;331;----;Andoas;;Peru;3;02-54S;076-24W;;;;100; 84;347;----;Huambos;;Peru;3;06-27S;078-58W;;;2200;2201; 84;370;SPME;Tumbes;;Peru;3;03-33S;080-24W;;;25;27; 84;377;SPQT;Iquitos;;Peru;3;03-45S;073-15W;03-45S;073-15W;125;126; 84;390;SPYL;Talara;;Peru;3;04-34S;081-15W;04-34S;081-15W;85;90; 84;396;----;Requena;;Peru;3;05-03S;073-51W;;;200;201; 84;401;SPUR;Piura;;Peru;3;05-11S;080-36W;;;49;55; 84;405;----;Huancabamba;;Peru;3;05-14S;079-27W;;;;1552; 84;425;SPMS;Yurimaguas;;Peru;3;05-54S;076-05W;;;179;184; 84;435;----;Moyobamba;;Peru;3;06-02S;076-58W;;;832;833; 84;440;SPJA;Rioja;;Peru;3;06-03S;077-09W;;;792;; 84;444;SPPY;Chachapoyas;;Peru;3;06-13S;077-50W;;;2540;2540; 84;452;SPHI;Chiclayo;;Peru;3;06-47S;079-50W;06-47S;079-50W;29;34; 84;455;SPST;Tarapoto;;Peru;3;06-27S;076-23W;;;281;282; 84;472;SPJR;Cajamarca;;Peru;3;07-08S;078-28W;;;2620;2622; 84;474;SPJI;Juanjui;;Peru;3;07-13S;076-43W;;;350;363; 84;478;----;Contamana;;Peru;3;07-20S;075-01W;;;134;135; 84;501;SPRU;Trujillo;;Peru;3;08-06S;079-02W;;;26;30; 84;505;----;Santiago De Chuco;;Peru;3;08-08S;078-10W;;;3129;3130; 84;515;SPCL;Pucallpa;;Peru;3;08-25S;074-36W;08-22S;074-35W;148;149; 84;531;SPEO;Chimbote;;Peru;3;09-10S;078-31W;;;20;21; 84;534;SPGM;Tingo Maria;;Peru;3;09-08S;075-57W;;;664;665; 84;542;SPHZ;Anta Huaraz ;;Peru;3;09-21S;077-36W;;;2750;2760; 84;545;----;Llata;;Peru;3;09-33S;076-47W;;;3429;3430; 84;560;----;Puerto Esperanza;;Peru;3;09-45S;070-45W;;;350;351; 84;564;SPNC;Huanuco;;Peru;3;09-54S;075-45W;;;1859;1860; 84;567;----;Puerto Bermudez;;Peru;3;10-18S;074-54W;;;300;301; 84;570;----;Cerro De Pasco;;Peru;3;10-41S;076-15W;;;4333;4334; 84;593;SPAY;Atalaya;;Peru;3;10-44S;073-47W;;;450;451; 84;600;----;Matucana;;Peru;3;11-50S;076-23W;;;2378;2379; 84;628;SPIM;Lima-Callao / Aerop. Internacional Jorgechavez;;Peru;3;12-00S;077-07W;12-01S;077-02W;12;13; 84;630;----;Huayao;;Peru;3;12-02S;075-19W;;;3350;3351; 84;658;SPTU;Puerto Maldonado;;Peru;3;12-38S;069-12W;;;265;266; 84;670;----;Quillabamba;;Peru;3;12-53S;072-44W;;;950;951; 84;673;SPHO;Ayacucho;;Peru;3;13-08S;074-13W;;;2740;2749; 84;677;----;Quincemil;;Peru;3;13-16S;070-40W;;;619;634; 84;680;----;Castrovirreyna Sinto ;;Peru;3;13-17S;075-19W;;;3600;3601; 84;686;SPZO;Cuzco;;Peru;3;13-33S;071-59W;;;3248;3249; 84;688;SPHY;Andahuayla;;Peru;3;13-43S;073-21W;;;3444;; 84;691;SPSO;Pisco;;Peru;3;13-45S;076-17W;13-45S;076-13W;8;7; 84;695;----;Antabamba;;Peru;3;14-22S;072-53W;;;3639;3640; 84;705;----;Puquio;;Peru;3;14-42S;074-08W;;;3213;3214; 84;710;----;Yauri;;Peru;3;14-47S;071-25W;;;3915;3916; 84;721;SPJN;San Juan;;Peru;3;15-23S;075-10W;;;60;60; 84;735;SPJL;Juliaca;;Peru;3;15-29S;070-09W;;;3826;3827; 84;752;SPQU;Arequipa;;Peru;3;16-19S;071-33W;16-19S;071-33W;2538;2539; 84;760;----;Mazo Cruz;;Peru;3;16-44S;069-43W;;;;4045; 84;775;----;Punta Coles;;Peru;3;17-42S;071-23W;;;;50; 84;782;SPTN;Tacna;;Peru;3;18-04S;070-18W;;;468;469; 85;033;SLGY;Guayaramerin;;Bolivia;3;10-49S;065-21W;;;130;; 85;041;SLCO;Cobija;;Bolivia;3;11-02S;068-47W;11-01S;068-47W;235;260;P 85;043;SLRI;Riberalta;;Bolivia;3;11-00S;066-07W;;;141;;P 85;104;SLJO;San Joaquin;;Bolivia;3;13-04S;064-49W;;;140;;P 85;109;----;San Ramon;;Bolivia;3;13-18S;064-42W;;;140;; 85;114;SLMG;Magdalena;;Bolivia;3;13-20S;064-07W;;;140;; 85;123;SLSA;Santa Ana;;Bolivia;3;13-46S;065-26W;;;144;; 85;140;SLRY;Reyes;;Bolivia;3;14-19S;067-23W;;;140;; 85;141;SLRQ;Rurrenabaque;;Bolivia;3;14-28S;067-34W;14-28S;067-35W;204;274;P 85;151;SLAP;Apolo;;Bolivia;3;14-44S;068-30W;;;1415;; 85;152;SLSB;San Borja;;Bolivia;3;14-52S;066-52W;;;194;; 85;153;SLSM;San Ignacio De Moxos;;Bolivia;3;14-55S;065-36W;;;160;; 85;154;SLTR;Trinidad;;Bolivia;3;14-49S;064-55W;14-45S;064-48W;155;236;P 85;175;SLAS;Ascencion De Guarayos;;Bolivia;3;15-43S;063-06W;;;247;; 85;195;SLJV;San Javier;;Bolivia;3;16-16S;062-28W;;;534;; 85;196;SLCP;Concepcion;;Bolivia;3;16-09S;062-01W;;;497;; 85;201;SLLP;La Paz / Alto;;Bolivia;3;16-31S;068-11W;16-30S;068-11W;4058;4038;P 85;207;SLSI;San Ignacio De Velasco;;Bolivia;3;16-23S;060-58W;;;413;;P 85;210;----;San Matias;;Bolivia;3;16-20S;058-23W;;;124;; 85;223;SLCB;Cochabamba;;Bolivia;3;17-25S;066-11W;17-23S;066-10W;2548;2570;P 85;230;SLCN;Charana;;Bolivia;3;17-35S;069-36W;;;4054;;P 85;242;SLOR;Oruro;;Bolivia;3;17-58S;067-04W;;;3072;;P 85;244;SLVR;Viru-Viru;;Bolivia;3;17-38S;063-08W;;;373;;P 85;245;SLET;Santa Cruz / El Trompillo;;Bolivia;3;17-48S;063-11W;17-48S;063-10W;418;414;P 85;247;SLJE;San Jose De Chiquitos;;Bolivia;3;17-48S;060-44W;;;284;;P 85;264;----;Vallegrande;;Bolivia;3;18-28S;064-06W;;;1998;; 85;268;SLRB;Robore;;Bolivia;3;18-19S;059-46W;;;276;;P 85;283;SLSU;Sucre;;Bolivia;3;19-01S;065-18W;;;2904;; 85;289;SLPS;Puerto Suarez;;Bolivia;3;18-59S;057-49W;;;134;;P 85;293;SLPO;Potosi;;Bolivia;3;19-33S;065-44W;;;3935;; 85;312;----;Monteagudo;;Bolivia;3;19-47S;063-55W;;;992;; 85;315;SLCA;Camiri;;Bolivia;3;20-00S;063-32W;;;798;;P 85;345;SLVM;Villamontes;;Bolivia;3;21-15S;063-27W;;;398;; 85;364;SLTJ;Tarija;;Bolivia;3;21-33S;064-42W;;;1854;; 85;365;SLYA;Yacuiba;;Bolivia;3;21-57S;063-39W;;;645;;P 85;394;----;Bermejo;;Bolivia;3;22-46S;064-19W;;;381;; 85;406;SCAR;Arica;;Chile;3;18-20S;070-20W;18-21S;070-21W;58;58;P 85;417;----;Iquique;;Chile;3;20-32S;070-11W;;;52;;P 85;418;SCDA;Iquique / Diego Arac;;Chile;3;20-32S;070-11W;;;52;; 85;432;----;Calama;;Chile;3;22-30S;068-54W;;;;2312;P 85;442;SCFA;Antofagasta;;Chile;3;23-26S;070-26W;23-25S;070-28W;135;137;P 85;460;SCRA;Chanaral;;Chile;3;26-19S;070-37W;26-19S;070-37W;30;30;P 85;469;SCIP;Isla De Pascua;;Chile;3;27-09S;109-25W;27-10S;109-26W;51;41;P 85;470;SCHA;Copiapo;;Chile;3;27-18S;070-25W;27-18S;070-25W;291;291;P 85;486;SCLL;Vallenar;;Chile;3;28-36S;070-46W;;;538;526;P 85;488;SCSE;La Serena;;Chile;3;29-54S;071-12W;;;142;;P 85;543;SCER;Quintero Santiago;;Chile;3;32-47S;071-31W;32-47S;071-31W;8;8;P 85;574;SCEL;Pudahuel;;Chile;3;33-23S;070-47W;33-23S;070-47W;475;476;P 85;577;----;Santiago Q. Normal;;Chile;3;33-26S;070-41W;;;520;; 85;585;----;Isla Juan Fernandez;;Chile;3;33-40S;078-59W;;;30;;P 85;586;----;Santo Domingo;;Chile;3;33-39S;071-37W;;;;75;P 85;629;SCIC;Curico;;Chile;3;34-58S;071-14W;;;228;;P 85;672;SCCH;Chillan;;Chile;3;36-34S;072-02W;36-34S;072-02W;124;148;P 85;682;SCIE;Concepcion;;Chile;3;36-46S;073-03W;;;12;;P 85;743;SCTC;Temuco;;Chile;3;38-45S;072-38W;;;114;;P 85;766;SCVD;Valdivia;;Chile;3;39-37S;073-05W;;;19;;P 85;782;----;Osorno;;Chile;3;40-36S;073-03W;;;65;;P 85;799;SCTE;Puerto Montt;;Chile;3;41-25S;073-05W;41-26S;073-07W;85;84;P 85;831;----;Quellon;;Chile;3;43-07S;073-38W;;;;3;P 85;834;----;Isla Huafo;;Chile;3;43-34S;074-50W;43-34S;074-50W;140;140; 85;836;----;Alto Palena;;Chile;3;43-38S;071-48W;;;;277;P 85;862;----;Puerto Aysen;;Chile;3;45-24S;072-40W;;;11;;P 85;864;SCCY;Coyhaique;;Chile;3;45-35S;072-07W;;;310;;P 85;874;SCBA;Balmaceda;;Chile;3;45-55S;071-41W;45-54S;071-43W;520;520;P 85;886;SCCC;Chile Chico;;Chile;3;46-33S;071-42W;;;325;325;P 85;892;SCHR;Cochrane;;Chile;3;47-14S;072-33W;;;167;167;P 85;930;----;Islotes Evangelistas;;Chile;3;52-24S;075-06W;;;52;52;P 85;934;SCCI;Punta Arenas;;Chile;3;53-00S;070-51W;53-02S;070-51W;37;33;P 85;967;----;Puerto Williams;;Chile;3;54-56S;067-38W;;;;26;P 85;972;----;Isla Diego Ramirez;;Chile;3;56-36S;068-43W;;;42;42;P 86;011;----;Base 5 " Gral A. Jara ";;Paraguay;3;19-32S;059-22W;;;150;150; 86;017;SGNA;Nueva Asuncion;;Paraguay;3;20-43S;061-55W;20-43S;061-55W;318;315; 86;033;----;Bahia Negra;;Paraguay;3;20-13S;058-10W;;;92;96; 86;038;----;La Patria;;Paraguay;3;21-20S;061-30W;;;;; 86;065;----;Prats-Gil;;Paraguay;3;22-42S;061-30W;;;220;220; 86;068;SGME;Mariscal Estigarribia;;Paraguay;3;22-01S;060-36W;;;172;181; 86;086;----;Puerto Casado;;Paraguay;3;22-17S;057-52W;;;88;87; 86;097;----;Pedro Juan Caballero;;Paraguay;3;22-35S;055-39W;;;614;662; 86;107;----;Fortin " Gral Diaz ";;Paraguay;3;23-34S;060-34W;;;;155; 86;125;----;Pozo Colorado;;Paraguay;3;23-23S;058-54W;;;;100; 86;134;SGCO;Concepcion;;Paraguay;3;23-25S;057-18W;;;74;74; 86;135;----;Paso Barreto;;Paraguay;3;23-03S;056-59W;;;;95; 86;184;----;Puerto Antequera;;Paraguay;3;24-06S;057-10W;;;64;; 86;192;----;San Estanislao;;Paraguay;3;24-39S;056-26W;;;;; 86;210;----;Saltos Del Guaira;;Paraguay;3;24-03S;054-19W;;;300;; 86;216;----;San Lorenzo;;Paraguay;3;25-22S;057-33W;;;;120; 86;218;SGAS;Asuncion / Aeropuerto;;Paraguay;3;25-16S;057-38W;25-16S;057-38W;101;101; 86;220;----;Caacupe;;Paraguay;3;25-24S;057-06W;;;;228; 86;223;----;Carapegua;;Paraguay;3;25-48S;057-13W;;;;116; 86;233;----;Villarrica;;Paraguay;3;25-45S;056-26W;;;161;161; 86;234;----;Cnel. Oviedo;;Paraguay;3;25-27S;056-22W;;;;163; 86;247;----;Vivero Forestal;;Paraguay;3;25-31S;054-47W;;;;; 86;248;----;Ciudad Del Este;;Paraguay;3;25-32S;054-36W;;;196;196; 86;255;----;Pilar;;Paraguay;3;26-51S;058-19W;;;59;56; 86;259;----;Barrerito;;Paraguay;3;26-17S;057-03W;;;;; 86;260;----;San Juan Bautista Misiones;;Paraguay;3;26-40S;057-09W;;;126;126; 86;262;----;Esc. Agric. De San Juan Bautista;;Paraguay;3;26-39S;057-06W;;;;; 86;268;----;Caazapa;;Paraguay;3;26-11S;056-21W;;;;; 86;275;----;Pastoreo Itapua;;Paraguay;3;26-55S;055-40W;;;;205; 86;285;----;Capitan Meza;;Paraguay;3;26-56S;055-12W;;;;; 86;288;----;Ita-Cora;;Paraguay;3;27-13S;058-16W;;;;; 86;294;----;Cap. Miranda;;Paraguay;3;27-17S;055-49W;;;;; 86;296;----;Yasi-Reta;;Paraguay;3;27-24S;056-27W;;;;86; 86;297;SGEN;Encarnacion;;Paraguay;3;27-19S;055-50W;;;91;91; 86;315;----;Bella Union;;Uruguay;3;30-16S;057-35W;;;54;53; 86;330;SUAG;Artigas;;Uruguay;3;30-23S;056-30W;;;123;120;P 86;350;SURV;Rivera;;Uruguay;3;30-53S;055-32W;;;205;241; 86;360;SUSO;Salto;;Uruguay;3;31-23S;057-57W;;;34;33;P 86;370;SUTB;Tacuarembo;;Uruguay;3;31-42S;055-59W;;;134;134; 86;430;SUPU;Paysandu;;Uruguay;3;32-20S;058-02W;;;61;61; 86;440;SUMO;Melo;;Uruguay;3;32-22S;054-13W;;;100;100; 86;450;----;Young;;Uruguay;3;32-41S;057-38W;;;81;80; 86;460;----;Paso De Los Toros;;Uruguay;3;32-48S;056-31W;;;75;75;P 86;490;SUME;Mercedes;;Uruguay;3;33-15S;058-04W;;;22;17; 86;500;SUTR;Treinta Y Tres;;Uruguay;3;33-13S;054-23W;;;46;46;P 86;530;SUDU;Durazno;;Uruguay;3;33-21S;056-30W;;;93;92; 86;545;----;Florida;;Uruguay;3;34-04S;056-14W;;;97;96; 86;560;SUCA;Colonia;;Uruguay;3;34-27S;057-50W;;;23;22;P 86;565;----;Rocha;;Uruguay;3;34-29S;054-18W;;;18;18;P 86;575;SUAA;Melilla;;Uruguay;3;34-47S;056-15W;;;53;48; 86;580;SUMU;Carrasco;;Uruguay;3;34-50S;056-00W;;;32;32;P 86;585;----;Prado;;Uruguay;3;34-51S;056-12W;;;16;16;P 87;007;SASQ;La Quiaca Observatorio;;Argentina;3;22-06S;065-36W;;;3462;3459; 87;016;SASO;Oran Aerodrome;;Argentina;3;23-09S;064-19W;;;357;357; 87;022;SAST;Tartagal Aerodrome;;Argentina;3;22-39S;063-49W;;;450;450;P 87;046;SASJ;Jujuy Aerodrome;;Argentina;3;24-23S;065-05W;;;921;905;P 87;047;SASA;Salta Aerodrome;;Argentina;3;24-51S;065-29W;24-51S;065-29W;1238;1221;P 87;065;SASR;Rivadavia;;Argentina;3;24-10S;062-54W;;;205;205; 87;078;SATK;Las Lomitas;;Argentina;3;24-42S;060-35W;24-42S;060-35W;130;130;P 87;097;SARI;Iguazu Aerodrome;;Argentina;3;25-44S;054-28W;;;270;270;P 87;121;SANT;Tucuman Aerodrome;;Argentina;3;26-51S;065-06W;;;440;450;P 87;129;SANE;Santiago Del Estero Aero.;;Argentina;3;27-46S;064-18W;;;198;199;P 87;149;SARS;Presidencia Roque Saenz Pena Aerodrome;;Argentina;3;26-49S;060-27W;;;91;92;P 87;155;SARE;Resistencia Aero.;;Argentina;3;27-27S;059-03W;27-27S;059-03W;53;52;P 87;162;SARF;Formosa Aerodrome;;Argentina;3;26-12S;058-14W;;;59;60;P 87;163;----;B. De Irigoyen Aerodrome;;Argentina;3;26-15S;053-09W;;;815;815; 87;166;SARC;Corrientes Aero.;;Argentina;3;27-27S;058-46W;;;62;62; 87;171;----;General Paz;;Argentina;3;27-45S;057-38W;;;74;74; 87;173;----;Ituzaingo;;Argentina;3;27-35S;056-40W;;;71;72; 87;178;SARP;Posadas Aero.;;Argentina;3;27-22S;055-58W;27-22S;055-58W;131;133;P 87;187;----;Obera;;Argentina;3;27-29S;055-08W;;;343;303; 87;211;SANI;Tinogasta;;Argentina;3;28-04S;067-34W;;;1201;1201; 87;213;----;Chilecito Aerodrome;;Argentina;3;29-14S;067-26W;;;945;945; 87;214;SANO;Chilecito;;Argentina;3;29-13S;067-26W;;;950;; 87;217;SANL;La Rioja Aero.;;Argentina;3;29-23S;066-49W;;;438;429;P 87;222;SANC;Catamarca Aero.;;Argentina;3;28-36S;065-46W;;;454;454;P 87;244;SACV;Villa De Maria Del Rio Seco;;Argentina;3;29-54S;063-41W;;;341;341;P 87;257;SANW;Ceres Aerodrome;;Argentina;3;29-53S;061-57W;29-53S;061-57W;87;88;P 87;270;----;Reconquista Aerodrome;;Argentina;3;29-11S;059-42W;;;48;53;P 87;286;SATU;Curuzu Cuatia Aerodrome;;Argentina;3;29-47S;057-59W;;;80;73; 87;289;SARL;Paso De Los Libres Aerodrome;;Argentina;3;29-41S;057-09W;;;69;70;P 87;305;SAMJ;Jachal;;Argentina;3;30-15S;068-45W;;;1165;1165; 87;311;SANU;San Juan Aerodrome;;Argentina;3;31-34S;068-52W;;;597;598;P 87;320;----;Chamical Aerodrome;;Argentina;3;30-22S;066-17W;30-22S;066-17W;467;461; 87;322;SACP;Chepes;;Argentina;3;31-20S;066-36W;;;658;658; 87;328;SAOD;Villa Dolores Aerodrome;;Argentina;3;31-57S;065-08W;;;561;569; 87;344;SACO;Cordoba Aerodrome;;Argentina;3;31-19S;064-13W;31-19S;064-13W;484;474;P 87;349;SACI;Pilar Observatorio;;Argentina;3;31-40S;063-53W;;;338;338; 87;371;SAAV;Sauce Viejo Aerodrome;;Argentina;3;31-42S;060-49W;;;17;18; 87;374;SAAP;Parana Aerodrome;;Argentina;3;31-47S;060-29W;;;74;78;P 87;385;SAAU;Villaguay Aerodrome;;Argentina;3;31-51S;059-05W;;;40;43; 87;393;SARM;Monte Caseros Aerodrome;;Argentina;3;30-16S;057-39W;30-16S;057-39W;53;54; 87;395;SAAC;Concordia Aerodrome;;Argentina;3;31-18S;058-01W;;;35;38;P 87;405;SAMU;Uspallata;;Argentina;3;32-36S;069-20W;;;1844;1891; 87;412;SAMS;San Carlos;;Argentina;3;33-46S;069-02W;;;940;940; 87;416;SAMI;San Martin;;Argentina;3;33-05S;068-25W;;;653;653; 87;418;SAME;Mendoza Aerodrome;;Argentina;3;32-50S;068-47W;32-50S;068-47W;705;704;P 87;436;SAOU;San Luis Aerodrome;;Argentina;3;33-16S;066-21W;33-16S;066-21W;710;713;P 87;448;SAOR;Villa Reynolds Aerodrome;;Argentina;3;33-44S;065-23W;;;485;486; 87;453;SAOC;Rio Cuarto Aerodrome;;Argentina;3;33-07S;064-14W;;;420;421;P 87;467;SAOM;Marcos Juarez Aerodrome;;Argentina;3;32-42S;062-09W;;;110;114;P 87;468;----;Venado Tuerto Aerodrome;;Argentina;3;33-40S;061-58W;;;112;113; 87;470;----;El Trebol;;Argentina;3;32-30S;061-40W;;;;96; 87;480;SAAR;Rosario Aerodrome;;Argentina;3;32-55S;060-47W;;;25;25;P 87;497;SAAG;Gualeguaychu Aerodrome;;Argentina;3;33-00S;058-37W;;;23;21;P 87;506;SAMM;Malargue Aerodrome;;Argentina;3;35-30S;069-35W;;;1426;1425;P 87;509;SAMR;San Rafael Aerodrome;;Argentina;3;34-35S;068-24W;34-35S;068-24W;745;748;P 87;532;SAZG;General Pico Aerodrome;;Argentina;3;35-42S;063-45W;;;139;145; 87;534;SAOL;Laboulaye;;Argentina;3;34-08S;063-22W;34-08S;063-22W;136;137; 87;544;SAZP;Pehuajo Aerodrome;;Argentina;3;35-52S;061-54W;;;87;86; 87;548;SAAJ;Junin Aerodrome;;Argentina;3;34-33S;060-55W;;;82;81;P 87;550;----;Nueve De Julio;;Argentina;3;35-27S;060-53W;;;76;76; 87;563;----;Las Flores Aerodrome;;Argentina;3;36-04S;059-06W;;;38;38;P 87;568;SADD;Don Torcuato Aerodrome;;Argentina;3;34-29S;058-37W;;;5;4; 87;569;----;San Miguel;;Argentina;3;34-33S;058-44W;;;26;; 87;571;SADP;El Palomar Aerodrome;;Argentina;3;34-36S;058-36W;;;18;12; 87;576;SAEZ;Ezeiza Aerodrome;;Argentina;3;34-49S;058-32W;34-49S;058-32W;20;20;P 87;580;----;Isla Martin Garcia;;Argentina;3;34-11S;058-16W;;;;36; 87;582;SABE;Aeroparque Bs. As. Aerodrome;;Argentina;3;34-34S;058-25W;;;6;6; 87;585;SABA;Buenos Aires Observatorio;;Argentina;3;34-35S;058-29W;;;25;25; 87;593;SADL;La Plata Aerodrome;;Argentina;3;34-58S;057-54W;;;21;19; 87;596;----;Punta Indio B. A.;;Argentina;3;35-22S;057-17W;35-22S;057-17W;16;22; 87;598;----;Faro Ponton Recalada;;Argentina;3;35-10S;056-15W;;;11;11; 87;623;SAZR;Santa Rosa Aerodrome;;Argentina;3;36-34S;064-16W;36-34S;064-16W;190;191;P 87;637;----;Coronel Suarez Aerodrome;;Argentina;3;37-26S;061-53W;;;233;233; 87;640;----;Bolivar Aerodrome;;Argentina;3;36-12S;061-04W;;;94;94;P 87;641;----;Azul Aerodrome;;Argentina;3;36-50S;059-53W;;;146;147; 87;642;SAZA;Azul Airport;;Argentina;3;36-45S;059-50W;36-44S;059-50W;132;132; 87;643;----;Olovarria Aerodrome;;Argentina;3;36-53S;060-13W;;;165;166; 87;645;SAZT;Tandil Aerodrome;;Argentina;3;37-14S;059-15W;;;175;175;P 87;648;SAZD;Dolores Aerodrome;;Argentina;3;36-21S;057-44W;;;10;9;P 87;649;----;Benito Juarez;;Argentina;3;37-43S;059-47W;;;207;207; 87;658;----;Santa Teresita Aerodrome;;Argentina;3;36-33S;056-41W;;;3;4; 87;659;----;Faro Punta Medanos;;Argentina;3;36-53S;056-40W;;;;9; 87;663;SAZV;Villa Gesell;;Argentina;3;37-14S;057-02W;;;7;; 87;679;SAZE;Pigue Aerodrome;;Argentina;3;37-36S;062-23W;;;304;304; 87;688;SAZH;Tres Arroyos;;Argentina;3;38-20S;060-15W;;;115;115;P 87;692;SAZM;Mar Del Plata Aerodrome;;Argentina;3;37-56S;057-35W;37-56S;057-35W;18;21;P 87;715;SAZN;Neuquen Aerodrome;;Argentina;3;38-57S;068-08W;38-57S;068-08W;270;271;P 87;736;SAZQ;Rio Colorado;;Argentina;3;39-01S;064-05W;;;79;79; 87;743;----;Faro El Rincon;;Argentina;3;39-23S;062-01W;;;;6; 87;748;----;Comandante Espora;;Argentina;3;38-44S;062-10W;38-44S;062-10W;74;75; 87;750;SAZB;Bahia Blanca Aerodrome;;Argentina;3;38-44S;062-10W;;;75;83;P 87;761;SAZY;Chapelco;;Argentina;3;40-05S;071-08W;;;779;; 87;765;SAZS;Bariloche Aerodrome;;Argentina;3;41-09S;071-10W;;;845;840;P 87;774;----;Maquinchao;;Argentina;3;41-15S;068-44W;;;888;888;P 87;784;SAVO;San Antonio Oeste Aerodrome;;Argentina;3;40-47S;065-06W;;;20;20;P 87;789;----;Faro Santa Barranca;;Argentina;3;40-47S;052-16W;;;;9; 87;791;SAVV;Viedma Aerodrome;;Argentina;3;40-51S;063-01W;;;6;7;P 87;800;SAVB;El Bolson Aerodrome;;Argentina;3;41-58S;071-31W;;;337;337; 87;803;SAVE;Esquel Aerodrome;;Argentina;3;42-56S;071-09W;;;789;785;P 87;814;SAVP;Paso De Indios;;Argentina;3;43-49S;068-53W;;;460;460; 87;823;----;P. Madryn Aerodrome;;Argentina;3;42-44S;065-04W;;;136;136; 87;828;SAVT;Trelew Aerodrome;;Argentina;3;43-12S;065-16W;;;39;43;P 87;839;----;Faro P. Delgada;;Argentina;3;46-31S;063-38W;;;;56; 87;852;SAWP;Perito Moreno Aerodrome;;Argentina;3;46-31S;071-01W;;;429;429;P 87;860;SAVC;Comodoro Rivadavia Aerodrome;;Argentina;3;45-47S;067-30W;45-47S;067-27W;58;46;P 87;880;SAWR;Gobernador Gregores Aerodrome;;Argentina;3;48-47S;070-10W;;;358;357; 87;896;SAWD;Puerto Deseado Aerodrome;;Argentina;3;47-44S;065-55W;47-44S;065-55W;81;80; 87;898;----;Faro C. Blanco;;Argentina;3;47-12S;065-44W;;;;39; 87;903;SAWA;Lago Argentino Aerodrome;;Argentina;3;50-20S;072-18W;;;223;220;P 87;909;SAWJ;San Julian Aerodrome;;Argentina;3;49-19S;067-45W;;;58;62;P 87;912;SAWU;Santa Cruz Aerodrome;;Argentina;3;50-01S;068-34W;;;113;111; 87;925;SAWG;Rio Gallegos Aerodrome;;Argentina;3;51-37S;069-17W;;;20;19;P 87;928;----;Faro Cabo Virgenes;;Argentina;3;52-20S;068-21W;;;;24; 87;934;SAWE;Rio Grande B. A.;;Argentina;3;53-48S;067-45W;53-48S;067-45W;13;22; 87;936;----;Tolhuin;;Argentina;3;54-42S;067-15W;;;109;105; 87;938;SAWH;Ushuaia Aerodrome;;Argentina;3;54-48S;068-19W;54-48S;068-19W;16;14;P 88;880;----;West Point Island;;South Georgia and the Islands;3;51-21S;060-41W;;;;26; 88;882;----;Weddell Island;;South Georgia and the Islands;3;51-54S;060-54W;;;;7; 88;884;----;Fox Bay;;South Georgia and the Islands;3;51-57S;060-03W;;;;21; 88;889;EGYP;Mount Pleasant Airport;;South Georgia and the Islands;3;51-49S;058-27W;51-49S;058-27W;74;73; 88;891;SFAL;Stanley Airport;;Falkland Islands, Islas Malvinas;3;51-41S;057-46W;;;23;; 88;902;----;Grytviken / Flat Bluff;;South Georgia and the Islands;3;54-16S;036-30W;;;;10; 88;903;----;Grytviken, South Georgia;;South Georgia and the Islands;3;54-16S;036-30W;;;3;3;P 88;963;----;Base Esperanza;;Antarctica;7;63-24S;056-59W;;;13;13;P 88;968;----;Base Orcadas;;Antarctica;7;60-45S;044-43W;60-45S;044-43W;6;6;P 88;981;----;Zavodovski Island;;South Georgia and the Islands;3;56-17S;027-35W;;;104;113; 88;986;----;South Thule Island;;South Georgia and the Islands;3;59-27S;027-19W;;;78;268; 89;001;----;S. A. N. A. E. Station;;Antarctica;7;70-18S;002-21W;70-19S;002-22W;62;0;P 89;002;----;Neumayer;;Antarctica;7;70-40S;008-15W;70-37S;008-22W;50;50; 89;004;----;Sanae Aws;;Antarctica;7;71-42S;002-48W;;;815;817; 89;005;----;Kottas Argos Id 3314;;Antarctica;7;74-12S;009-45W;;;;1440; 89;009;NZSP;Amundsen-Scott South Pole Station;;Antarctica;7;90-00S;00-00E;90-00S;000-00E;2830;2835;P 89;014;----;Nordenskiold Base;;Antarctica;7;73-03S;013-23W;;;;; 89;022;----;Halley;;Antarctica;7;75-30S;026-39W;75-31S;026-36W;30;30;P 89;024;----;Navy Operated Automatic Meteorological Observing System ;;United States;7;77-31S;023-44W;;;1545;; 89;034;----;Base Belgrano Ii;;Antarctica;7;77-52S;034-37W;;;251;256;P 89;042;----;Signy Island;;Antarctica;7;60-43S;045-36W;60-43S;045-36W;6;6; 89;044;----;Druzhnaya Sov-Base;;Russia;7;77-34S;040-13W;;;35;; 89;045;----;Belgrano 3 Arg-Base;;Argentina;7;77-54S;045-59W;;;243;; 89;050;----;Bellingshausen;;Antarctica;7;62-12S;058-56W;62-12S;058-56W;16;16; 89;052;----;Arctowski;;Antarctica;7;62-10S;058-28W;;;3;2; 89;053;----;Base Jubany;;Antarctica;7;62-14S;058-38W;;;4;4;P 89;054;----;Dinamet-Uruguay;;Antarctica;7;62-11S;058-51W;;;10;17;P 89;055;----;Base Marambio Centro Met. Antartico ;;Antarctica;7;64-14S;056-43W;64-14S;056-43W;198;198;P 89;056;----;Centro Met. Antartico " Pdte. Eduardo Frei ";;Antarctica;7;62-25S;058-53W;62-11S;058-59W;10;10;P 89;057;----;Base Arturo Prat;;Antarctica;7;62-30S;059-41W;;;5;;P 89;058;----;Great Wall;;Antarctica;7;62-13S;058-58W;;;10;10; 89;059;----;Base Bernardo O'Higgins;;Antarctica;7;63-19S;056-41W;63-19S;057-54W;10;10;P 89;060;----;Primavera Arg-Base;;Argentina;7;64-09S;060-57W;;;50;; 89;061;----;Palmer Station;;Antarctica;7;64-46S;064-05W;;;8;8; 89;062;----;Rothera Point;;Antarctica;7;67-34S;068-08W;;;16;16; 89;063;----;Vernadsky;;Antarctica;7;65-15S;064-16W;65-15S;064-16W;11;11; 89;064;----;Juan Carlos I;;Antarctica;7;62-40S;060-23W;;;;; 89;065;----;Fossil Bluff;;Antarctica;7;71-20S;068-21W;;;55;55; 89;066;----;Base San Martin;;Antarctica;7;68-08S;067-08W;;;4;4;P 89;069;----;Faraday;;Antarctica;7;65-15S;064-16W;;;;11; 89;083;----;Siple Station;;Antarctica;7;75-55S;083-55W;75-55S;083-55W;914;91; 89;108;----;Henry;;United States;7;89-00S;000-18W;;;2755;; 89;125;----;Byrd Station;;Antarctica;7;80-01S;119-32W;80-01S;119-32W;1515;1515; 89;175;----;Brockton;;Antarctica;7;78-48S;174-40W;78-48S;174-40W;15;15; 89;202;----;University Wi Id 8985 Henry ;;Antarctica;7;89-00S;000-18W;;;;2877; 89;208;----;University Wi Id 8918;;Antarctica;7;89-57S;000-01W;;;2835;2835; 89;251;----;King Sejong;;Antarctica;7;62-13S;058-45W;;;10;11; 89;259;----;Fichner-Ronne Schelfice;;Antarctica;7;83-10S;059-35W;;;;165; 89;261;----;University Wi Id 8930;;Antarctica;7;64-10S;061-32W;;;17;17; 89;262;----;University Wi Id 8926;;Antarctica;7;66-58S;060-33W;;;17;17; 89;264;----;University Wi Id 8920;;Antarctica;7;71-26S;068-56W;;;780;780; 89;266;----;University Wi Id 8902;;Antarctica;7;72-13S;060-20W;;;91;91; 89;268;----;University Wi Id 8917;;Antarctica;7;75-01S;062-32W;;;25;25; 89;269;----;University Wi Id 8912 Bonaparte Park Point;;Antarctica;7;64-47S;063-04W;;;8;8; 89;272;----;University Wi Id 8917 Ski-Hi ;;Antarctica;7;74-58S;070-46W;;;;1395; 89;284;----;Navy Operated Automatic Meteorological Observing System ;;United States;7;75-55S;083-55W;;;1054;; 89;314;----;University Wi Id 21358 Theresa ;;Antarctica;7;84-36S;115-49W;;;;1463; 89;324;----;University Wi Id 8903;;Antarctica;7;80-00S;120-00W;;;1530;1530; 89;327;----;University Wi Id 8981 Mount Siple ;;Antarctica;7;72-12S;127-03W;;;30;30; 89;332;----;University Wi Id 21356 Elizabeth ;;Antarctica;7;82-37S;137-05W;;;;549; 89;371;----;University Wi Id 8928;;Antarctica;7;67-22S;179-58W;;;30;30; 89;374;----;University Wi Id 8900;;Antarctica;7;78-21S;173-22W;;;18;18; 89;376;----;Gill;;Antarctica;7;80-01S;178-44W;;;55;30; 89;377;----;University Wi Id 8908;;Antarctica;7;82-35S;174-16W;;;55;55; 89;504;----;Troll;;Antarctica;7;72-00S;002-32E;;;1290;1290; 89;512;----;Novolazarevskaja;;Antarctica;7;70-46S;011-50E;70-46S;011-50E;102;140; 89;514;----;Maitri;;Antarctica;7;70-46S;011-45E;;;120;; 89;524;----;Asuka;;Antarctica;7;71-32S;024-08E;;;931;931; 89;532;----;Syowa;;Antarctica;7;69-00S;039-35E;69-00S;039-35E;18;21;P 89;542;----;Molodeznaja;;Antarctica;7;67-40S;045-51E;67-40S;045-51E;40;40; 89;544;----;Mizuho;;Antarctica;7;70-42S;044-20E;;;2230;2230; 89;564;----;Mawson;;Antarctica;7;67-36S;062-52E;67-36S;062-53E;10;16; 89;567;----;Dovers;;Antarctica;7;70-14S;065-51E;70-14S;065-51E;1058;1059; 89;568;----;Davis Lgb 35 Aws ;;Antarctica;7;76-03S;065-01E;;;2343;2345; 89;571;----;Davis;;Antarctica;7;68-35S;077-58E;68-35S;077-59E;18;13; 89;573;----;Zhongshan Weather Office;;Antarctica;7;69-22S;076-22E;;;18;18; 89;574;----;Progress;;Russia;7;69-24S;076-24E;;;64;; 89;577;----;Davis Lgb 46 Aws ;;Antarctica;7;75-51S;071-29E;;;2354;2356; 89;592;----;Mirnyj;;Antarctica;7;66-33S;093-01E;66-33S;093-01E;30;30; 89;606;----;Vostok;;Antarctica;7;78-27S;106-52E;78-27S;106-52E;3420;3490; 89;611;----;Casey;;Antarctica;7;66-17S;110-31E;66-15S;110-32E;40;42; 89;642;----;Dumont D'Urville;;Antarctica;7;66-40S;140-01E;66-40S;140-01E;41;43;P 89;643;----;University Wi Id 8934;;Antarctica;7;66-49S;141-23E;;;39;39; 89;660;----;University Wi Id 8980;;Antarctica;7;66-17S;162-20E;;;30;30; 89;661;----;Cape Phillips;;Antarctica;7;73-03S;169-36E;;;200;201; 89;662;----;Base Baia Terra Nova;;Antarctica;7;74-42S;164-06E;;;80;81; 89;663;----;Lake Vanda;;Antarctica;7;77-32S;161-40E;;;18;15; 89;664;----;McMurdo;;Antarctica;7;77-51S;166-40E;77-51S;166-40E;34;24;P 89;665;----;Scott Base;;Antarctica;7;77-51S;166-45E;;;94;95; 89;666;----;Cape Ross;;Antarctica;7;76-43S;162-58E;;;200;201; 89;667;----;University Wi Id 8927;;Antarctica;7;77-57S;166-31E;;;20;20; 89;668;----;University Wi Id 8915 Minna Bluff ;;Antarctica;7;78-30S;166-30E;;;;900; 89;669;----;University Wi Id 8909 Linda ;;Antarctica;7;78-30S;168-21E;;;;50; 89;674;NZCM;Williams Field;;Antarctica;7;77-52S;166-58E;;;8;8; 89;705;----;University Wi Id 8932;;United States;7;81-30S;003-44E;;;2410;; 89;734;----;University Wi Id 8982 Dome Fuji ;;Antarctica;7;77-19S;039-42E;;;;3810; 89;744;----;University Wi Id 8918 Relay Stat ;;Antarctica;7;74-01S;043-00E;;;;3353; 89;757;----;Mawson Lgb 20 Aws ;;Antarctica;7;73-50S;055-40E;;;2741;2743; 89;758;----;Mawson Lgb 10 Aws ;;Antarctica;7;71-17S;059-13E;;;2617;2619; 89;762;----;Hawson Lgb 00 Ge 03 Aws ;;Antarctica;7;68-39S;061-07E;;;1833;1835; 89;768;----;Minna Bluff;;United States;7;78-33S;166-42E;;;920;; 89;769;----;Linda;;United States;7;78-30S;168-21E;;;50;; 89;774;----;Davis Lgb 59 Aws ;;Antarctica;7;73-27S;076-47E;;;2563;2565; 89;799;----;University Wi Id 8924 Nico ;;Antarctica;7;89-00S;090-08E;;;2935;3065; 89;803;----;Casey Gf 08 Aws ;;Antarctica;7;68-30S;102-11E;;;2123;2125; 89;805;----;Casey Gc 46 Aws ;;Antarctica;7;74-08S;109-50E;;;3096;3098; 89;807;----;Casey Snyder Rocks Aws ;;Antarctica;7;66-33S;107-45E;;;40;42; 89;810;----;Casey Casey Airstrip ;;Antarctica;7;66-17S;110-47E;;;390;392; 89;811;----;Casey Law Dome Summit ;;Antarctica;7;66-44S;112-45E;;;1366;1368; 89;812;----;Casey Ao 28 Aws ;;Antarctica;7;68-24S;112-13E;;;1622;1624; 89;813;----;Casey Gc 41 Aws ;;Antarctica;7;71-36S;111-16E;;;2761;2763; 89;814;----;Casey Balaena Island Aws ;;Antarctica;7;66-01S;111-05E;;;8;10; 89;815;----;Casey Haupt Nunatak ;;Antarctica;7;66-35S;110-42E;;;81;83; 89;816;----;Casey Law Dome Summit South ;;Antarctica;7;66-43S;112-56E;;;1375;; 89;828;----;University Wi Id 8904;;Antarctica;7;74-30S;123-00E;;;3280;3280; 89;832;----;University Wi Id 8912;;Antarctica;7;66-42S;139-48E;;;240;240; 89;834;----;University Wi Id 8916;;Antarctica;7;67-23S;138-43E;;;1560;1560; 89;836;----;University Wi Id 8919;;Antarctica;7;70-01S;134-43E;;;2500;2500; 89;847;----;University Wi Id 8929 Penguin Point ;;Antarctica;7;67-37S;146-00E;;;;30; 89;860;----;University Wi Id 8901;;Antarctica;7;74-14S;160-17E;;;1772;1772; 89;861;----;Sandra;;United States;7;74-29S;160-29E;;;1525;; 89;862;----;Navy Operated Automatic Meteorological Observing System ;;United States;7;74-42S;161-34E;;;1200;; 89;863;----;Gill;;United States;7;80-02S;178-38W;;;55;; 89;864;----;University Wi Id 8905;;Antarctica;7;74-55S;163-36E;;;80;80; 89;865;----;University Wi Id 8913;;Antarctica;7;76-14S;168-42E;;;275;275; 89;866;----;University Wi Id 8906;;Antarctica;7;77-26S;163-45E;;;120;120; 89;867;----;University Wi Id 8911;;Antarctica;7;77-30S;167-09E;;;3700;3700; 89;868;----;University Wi Id 8924;;Antarctica;7;79-56S;169-50E;;;60;60; 89;869;----;University Wi Id 8915;;Antarctica;7;79-57S;164-58E;;;75;75; 89;872;----;University Wi Id 8907;;Antarctica;7;78-01S;170-48E;;;45;45; 89;873;----;University Wi Id 8900 Elaine ;;Antarctica;7;83-09S;174-28E;;;60;60; 89;879;----;University Wi Id 8984 Possession Island ;;Antarctica;7;71-54S;171-08E;;;30;30; 91;066;PMDY;Sand Island, Henderson Field Airport;HI;United States;5;28-13N;177-22W;28-13N;177-22W;4;6; 91;158;----;Princeville Kauai;HI;United States;5;22-13N;159-27W;;;98;; 91;162;PHBK;PMRF BARKING SANDS;HI;United States;5;22-02N;159-47W;22-02-00N;159-47-00W;4;3; 91;163;----;Port Allen Airport;HI;United States;5;21-54N;159-36W;21-55N;159-35W;7;22; 91;165;PHLI;LIHUE AIRPORT;HI;United States;5;21-59N;159-20W;21-59-13N;159-20-36W;45;31; 91;166;----;Makahuena Pt / Kauai;HI;United States;5;21-52N;159-27W;;;16;; 91;168;----;Kapaa / Kauiai;HI;United States;5;22-04N;159-24W;;;162;; 91;170;PHHI;Wheeler Air Force Base / Oahu;HI;United States;5;21-29N;158-02W;21-29N;158-02W;255;256; 91;176;PHNG;MCBH KANEOHE BAY HAWAII;HI;United States;5;21-27N;157-45W;21-26-27N;157-46-32W;7;1; 91;178;PHJR;KALAELOA AIRPORT;HI;United States;5;21-19N;158-04W;21-18-20N;158-04-28W;10;15; 91;182;PHNL;HONOLULU INTERNATIONAL AIRPORT ;HI;United States;5;21-20N;157-57W;21-19-26N;157-55-47W;4;4; 91;186;PHMK;Kaunakakai, Molokai Airport;HI;United States;5;21-09N;157-06W;21-09N;157-06W;138;134; 91;190;PHOG;KAHULUI AIRPORT;HI;United States;5;20-54N;156-26W;20-54-02N;156-25-44W;16;12; 91;203;----;Falalop Island Coast Guard Station;;Micronesia, Federated States of;5;10-02N;139-48E;;;5;; 91;204;----;Uliyhi Atoll;;Micronesia, Federated States of;5;10-03N;139-48E;;;2;; 91;212;PGUM;Agana, Guam International Airport;GU;United States;5;13-29N;144-48E;13-21N;144-48E;91;; 91;217;PGAC;Guam, Mariana Island;GU;United States;5;13-55N;144-50E;;;111;; 91;218;PGUA;Andersen, Mariana Is, Andersen Air Force Base;GU;United States;5;13-35N;144-56E;13-35N;144-55E;187;187; 91;221;PGRO;Rota Island, N. Mariana Is, Rota International Airport;GU;United States;5;14-11N;145-15E;;;185;; 91;222;----;Pagan Island Aws Automated Reporting Station ;;United States Minor Outlying Islands;5;18-54N;145-36E;;;2;; 91;231;----;Tinian Mariana Island;;United States Minor Outlying Islands;5;15-00N;145-38E;;;82;; 91;232;PGSN;Saipan Island, Saipan International Airport;Northern Mariana Islands;United States;5;15-07N;145-44E;15-07N;145-45W;66;3; 91;233;PGWT;Tinian Island, N. Mariana Is, West Tinian Airport;GU;United States;5;14-59N;145-37E;;;82;; 91;245;PWAK;Wake Island, Wake Island Army Airfield Airport;GU;United States;5;19-17N;166-39E;19-17N;166-39E;4;4; 91;251;----;Eniwetok Atoll Aws;;Marshall Islands;5;11-22N;162-21E;;;2;; 91;275;PJON;Johnston Island, Johnston Atoll Airport;;United States Minor Outlying Islands;5;16-44N;169-32W;16-44N;169-31W;2;2; 91;281;----;Kona / Hawaii Island;HI;United States;5;19-39N;156-00W;;;9;; 91;285;PHTO;HILO INTERNATIONAL AIRPORT;HI;United States;5;19-43N;155-03W;19-43-16N;155-03-46W;12;12; 91;293;PHWH;South Kona / Hawaii;HI;United States;5;19-06N;155-45W;;;808;; 91;294;----;South Point;HI;United States;5;19-00N;155-40W;;;290;; 91;314;----;Sonsoral Marshal;;Micronesia, Federated States of;5;05-20N;132-23E;;;3;; 91;315;----;Euripik Marshal Island;;Micronesia, Federated States of;5;06-41N;143-05E;;;3;; 91;317;----;Woleai Atoll;;Micronesia, Federated States of;5;07-23N;143-55E;07-23N;143-55E;4;2; 91;324;----;Puluwat Atoll;;Micronesia, Federated States of;5;07-21N;149-12E;;;2;; 91;325;----;Pulusuk Caroline;;Micronesia, Federated States of;5;06-42N;149-18E;;;3;; 91;328;----;Ului Atoll Automatic Meteorological Observing System ;;Micronesia, Federated States of;5;08-42N;149-42E;;;2;; 91;334;PTKK;Weno Island, Chuuk Int. Airp.;;Micronesia, Federated States of;5;07-28N;151-51E;07-28N;151-51E;3;2; 91;338;----;Satawan Atoll;;Micronesia, Federated States of;5;05-20N;153-44E;;;2;; 91;339;----;Lukunor Atoll;;Micronesia, Federated States of;5;05-30N;153-49E;;;3;; 91;343;----;Oroluk Island;;Micronesia, Federated States of;5;07-38N;155-10E;;;3;; 91;347;----;Pohnpei;;Micronesia, Federated States of;5;06-58N;158-14E;06-58N;158-14E;37;37; 91;348;PTPN;Pohnpei Island, Pohnpei Int. Airp.;;Micronesia, Federated States of;5;06-59N;158-12E;06-58N;158-13E;2;; 91;352;----;Pingelap Atoll Automated Reporting Station ;;Micronesia, Federated States of;5;06-13N;160-43E;;;4;; 91;353;----;Pingelap Atoll;;Micronesia, Federated States of;5;06-13N;160-42E;;;4;; 91;354;----;Ujelang;;Marshall Islands;5;09-46N;160-59E;;;3;; 91;355;PTTK;Kosrae Carolines / V;;Micronesia, Federated States of;5;05-21N;162-57E;;;2;; 91;356;PTSA;Kosrae Island, Kosrae Airport;;Micronesia, Federated States of;5;05-21N;162-57E;;;3;; 91;365;----;Ujae Atoll Aws Automated Reporting Station;;Marshall Islands;5;08-54N;165-44E;;;2;; 91;366;PKWA;Kwajalein, Bucholz AAF, Kwajalein KMR ATOL Airport;;Marshall Islands;5;08-43N;167-44E;08-44N;167-44E;3;2; 91;367;----;Ailinglapalap Atoll;;Marshall Islands;5;07-16N;168-50E;07-16N;168-50E;3;2; 91;368;----;Ailinglapalap Marine Aviation Reporting Station;;Marshall Islands;5;07-17N;168-51E;;;2;; 91;369;----;Jaluit Atoll;;Marshall Islands;5;05-55N;169-39E;05-55N;169-39E;3;2; 91;371;----;Wotje Atoll;;Marshall Islands;5;09-28N;170-15E;09-28N;170-15E;3;2; 91;374;----;Maleolap Atoll;;Marshall Islands;5;08-54N;170-51E;;;3;; 91;376;PKMJ;Majuro Atoll, Marshall Islands Int. Airp.;;Marshall Islands;5;07-04N;171-17E;07-05N;171-23E;2;3; 91;377;----;Mili Atoll Aws Automated Reporting Station ;;Marshall Islands;5;06-06N;171-24E;;;2;; 91;378;----;Mili Atoll / Marshall;;Marshall Islands;5;06-05N;171-44E;;;4;; 91;408;PTRO;Babelthuap Island, Babelthuap/Koror Airport;;Palau;5;07-22N;134-32E;07-20N;134-29E;54;; 91;411;----;Ngulu Caroline Island;;Micronesia, Federated States of;5;08-18N;137-29E;;;3;; 91;413;PTYA;Yap Island, Yap Int. Airp.;;Micronesia, Federated States of;5;09-29N;138-05E;09-29N;138-05E;28;; 91;424;----;Became Station 941240;;Australia;5;12-34S;131-18E;;;10;; 91;425;----;Nukuoro Atoll;;Micronesia, Federated States of;5;03-51N;155-01E;;;4;; 91;434;----;Kapingamarangi Atol;;Micronesia, Federated States of;5;01-05N;154-46E;01-05N;154-46E;3;3; 91;442;----;Ebon Atoll Aws;;Marshall Islands;5;04-36N;168-41E;;;3;; 91;487;PLFA;Fanning Island;;New Zealand;5;03-51N;159-22W;03-54N;159-23W;5;3; 91;490;PLCH;Christmas / Cassidy;;New Zealand;5;01-59N;157-29W;;;3;; 91;492;----;Christmas Island;;New Zealand;5;02-00N;157-24W;02-00N;157-24W;3;3; 91;502;----;Taro Island;;Solomon Islands;5;06-42S;156-23E;;;2;3; 91;503;AGGM;Munda;;Solomon Islands;5;08-20S;157-16E;;;6;6;P 91;507;----;Auki;;Solomon Islands;5;08-47S;160-44E;08-46S;160-42E;10;11;P 91;517;----;Honiara;;Solomon Islands;5;09-25S;159-58E;09-25S;160-03E;55;56; 91;520;AGGH;Honiara / Henderson;;Solomon Islands;5;09-25S;160-03E;;;8;9;P 91;527;----;Kira Kira;;Solomon Islands;5;10-25S;161-55E;;;5;3;P 91;530;ANAU;Nauru Airport;;Nauru;5;00-32S;166-55E;;;6;6; 91;533;----;Banaba;;Kiribati;5;00-54S;169-32E;;;65;66;P 91;541;AGGL;Santa Cruz;;Solomon Islands;5;10-42S;165-48E;10-42S;165-48E;23;24;P 91;550;----;Linua Airport Aws Torres Island ;;Vanuatu;5;13-19S;166-37E;;;5;0; 91;551;NVSC;Sola Vanua Lava ;;Vanuatu;5;13-51S;167-33E;13-51S;167-33E;17;18;P 91;554;NVSS;Pekoa Airport Santo ;;Vanuatu;5;15-31S;167-13E;15-31S;167-13E;41;44;P 91;555;NVSL;Lamap Malekula ;;Vanuatu;5;16-25S;167-48E;;;26;26;P 91;557;NVVV;Bauerfield Efate ;;Vanuatu;5;17-42S;168-18E;17-42S;168-18E;20;21;P 91;565;----;Burtonfield Tanna ;;Vanuatu;5;19-32S;169-15E;;;70;73;P 91;568;----;Aneityum;;Vanuatu;5;20-14S;169-46E;20-14S;169-46E;6;7;P 91;570;----;Ile Surprise;;New Caledonia;5;18-29S;163-05E;;;4;5; 91;574;----;Ile Loop Chesterfield ;;New Caledonia;5;19-58S;158-31E;;;3;4; 91;577;NWWK;Koumac Nlle-Caledonie ;;New Caledonia;5;20-34S;164-17E;20-34S;164-17E;23;18;P 91;579;NWWV;Ouloup Ile Ouvea ;;New Caledonia;5;20-39S;166-35E;;;7;7; 91;582;NWWL;Ouanaham Ile Lifou ;;New Caledonia;5;20-46S;167-14E;20-46S;167-14E;28;29;P 91;583;----;Poindimie Nlle-Caledonie ;;New Caledonia;5;20-56S;165-19E;;;11;13;P 91;587;NWWR;La Roche Ile Mare ;;New Caledonia;5;21-29S;168-02E;;;43;42; 91;590;NWWW;La Tontouta Nlle-Caledonie ;;New Caledonia;5;22-01S;166-13E;22-01S;166-13E;16;14;P 91;592;NWWN;Noumea Nlle-Caledonie ;;New Caledonia;5;22-16S;166-27E;22-16S;166-27E;69;72;P 91;596;NWWE;Moue Ile Des Pins ;;New Caledonia;5;22-36S;167-27E;;;96;97; 91;598;----;Matthew Ilot ;;New Caledonia;5;22-20S;171-20E;;;26;27; 91;601;NGTU;Butaritari;;Kiribati;5;03-02N;172-47E;;;1;; 91;610;NGTA;Tarawa;;Kiribati;5;01-21N;172-55E;01-21N;172-55E;2;4;P 91;623;NGBR;Beru;;Kiribati;5;01-21S;176-00E;;;2;3; 91;629;NGTR;Arorae;;Kiribati;5;02-40S;176-50E;;;4;7; 91;631;NGFO;Nanumea;;Tuvalu;5;05-40S;176-08E;;;2;3; 91;636;----;Nui;;Tuvalu;5;07-14S;177-09E;;;1;2; 91;643;NGFU;Funafuti;;Tuvalu;5;08-31S;179-13E;08-31S;179-13E;1;2;P 91;644;----;Funafuti;;Tuvalu;5;08-31S;179-14E;;;0;; 91;648;----;Niulakita;;Tuvalu;5;10-45S;179-30E;;;2;3; 91;650;NFNR;Rotuma;;Fiji;5;12-30S;177-03E;12-30S;177-03E;26;26;P 91;652;----;Undu Point;;Fiji;5;16-08S;179-59W;;;62;63;P 91;657;----;Lambasa Airport;;Fiji;5;16-28S;179-21E;;;9;17; 91;659;----;Nambouwalu;;Fiji;5;17-00S;178-42E;;;34;36; 91;660;----;Yasawa-I-Rara;;Fiji;5;16-42S;177-35E;;;48;50; 91;663;----;Savusavu Airport;;Fiji;5;16-49S;179-21E;;;3;13; 91;665;----;Matei;;Fiji;5;16-41S;179-52W;;;21;21; 91;670;----;Viwa Island;;Fiji;5;17-09S;176-55E;;;5;5; 91;676;----;Vanua Mbalavu Island;;Fiji;5;17-15S;178-55W;;;5;; 91;678;----;Levuka;;Fiji;5;17-41S;178-50E;;;2;3; 91;680;NFFN;Nandi;;Fiji;5;17-45S;177-27E;17-45S;177-27E;13;18;P 91;683;NFNA;Nausori;;Fiji;5;18-03S;178-34E;;;5;7;P 91;690;----;Laucala Bay;;Fiji;5;18-09S;178-27E;18-09S;178-27E;6;9; 91;691;NFNK;Lakemba;;Fiji;5;18-14S;178-48W;;;2;3; 91;693;----;Vunisea;;Fiji;5;19-03S;178-10E;;;30;33; 91;697;----;Matuku;;Fiji;5;19-08S;179-45E;;;3;5; 91;699;----;Ono-I-Lau;;Fiji;5;20-40S;178-43W;;;27;28;P 91;701;----;Kanton Island;;Kiribati;5;02-46S;171-43W;02-46S;171-43W;2;2; 91;720;----;Atafu;;Tokelau Islands;5;08-32S;172-31W;;;2;3; 91;723;----;Nukunonu;;Tokelau Islands;5;09-12S;171-54W;;;3;; 91;724;----;Nukunono;;Tokelau Islands;5;09-12S;171-55W;;;1;3; 91;727;----;Fenuafala / Fakaofo;;Tokelau Islands;5;09-23S;171-16W;;;3;4; 91;739;----;Faleolo;;Samoa;5;13-49S;172-00W;;;1;5; 91;740;----;Asau;;Samoa;5;13-30S;172-38W;;;4;4; 91;742;----;Apia;;Samoa;5;13-48S;171-47W;;;2;2;P 91;753;NLWW;Hihifo Ile Wallis ;;France;5;13-14S;176-10W;13-14S;176-10W;23;27;P 91;754;NLWF;Maopoopo Ile Futuna ;;France;5;14-19S;178-07W;;;6;36;P 91;755;----;Avata;;Samoa;5;13-29S;172-46W;;;;; 91;757;----;Avao;;Samoa;5;13-27S;172-21W;;;;; 91;758;----;Faleolo Airport;;Samoa;5;13-49S;171-59W;;;;; 91;759;NSFA;Faleolo Intl / Apia;;Samoa;5;13-49S;172-00W;;;5;; 91;762;NSAP;Apia / Upolu Island;;Samoa;5;13-48S;171-47W;13-48S;171-47W;2;2; 91;763;----;Cape Tapanga;;Samoa;5;14-03S;171-27W;;;34;; 91;764;----;Cape Taputapu;;Samoa;5;14-19S;170-50W;;;122;; 91;765;NSTU;Pago Pago / Int. Airport;;United States Minor Outlying Islands;5;14-20S;170-43W;14-20S;170-43W;3;3;P 91;766;----;Cape Matatula;;Samoa;5;14-15S;171-34W;;;60;; 91;768;----;Ta'U;;Samoa;5;14-15S;169-29W;;;32;; 91;772;----;Niuafoou;;Tonga;5;15-34S;175-37W;;;60;61; 91;776;----;Keppel;;Tonga;5;15-57S;173-46W;;;2;3; 91;779;----;Lupepau'U;;Tonga;5;18-35S;173-58W;;;67;70; 91;780;----;Vavau;;Tonga;5;18-39S;173-59W;;;9;10; 91;784;NFTL;Haapai;;Tonga;5;19-48S;174-21W;;;2;3; 91;785;----;Ha'Afeva;;Tonga;5;19-57S;174-42W;;;4;; 91;786;----;Nomuka;;Tonga;5;20-15S;174-48W;;;35;36; 91;792;NFTF;Fua'Amotu;;Tonga;5;21-14S;175-09W;21-14S;175-09W;38;41; 91;801;----;Penrhyn;;Cook Islands;5;09-00S;158-03W;09-00S;158-03W;1;1; 91;802;----;Penrhyn Aws;;Cook Islands;5;09-02S;158-03W;;;1;; 91;809;----;Manihiki Aws;;Cook Islands;5;10-26S;161-01W;;;2;; 91;811;----;Pukapuka;;Cook Islands;5;10-53S;165-49W;;;2;3; 91;819;----;Suwarrow;;Cook Islands;5;13-14S;163-05W;;;3;; 91;822;NIUE;Alofi / Niue;;Cook Islands;5;19-04S;169-55W;;;20;22;P 91;823;----;Hanan Airport / Niue;;Cook Islands;5;19-05S;169-56W;;;58;60; 91;831;----;Aitutaki Aws;;Cook Islands;5;18-50S;159-46W;;;5;; 91;841;----;Mauke Aws;;Cook Islands;5;20-10S;157-21W;;;25;; 91;843;NCRG;Rarotonga;;Cook Islands;5;21-12S;159-49W;21-12S;159-49W;7;7;P 91;848;----;Mangaia Aws;;Cook Islands;5;21-55S;157-57W;;;41;; 91;925;----;Atuona;;French Polynesia;5;09-48S;139-02W;09-49S;139-02W;51;52;P 91;930;NTTB;Bora-Bora;;French Polynesia;5;16-27S;151-45W;16-29S;151-45W;4;3;P 91;938;NTAA;Tahiti-Faaa;;French Polynesia;5;17-33S;149-37W;17-33S;149-37W;2;2;P 91;941;NTTG;Rangiroa / Tuamoto Island;;French Polynesia;5;14-58S;147-40W;14-58S;147-40W;3;3; 91;943;----;Takaroa;;French Polynesia;5;14-29S;145-02W;14-29S;145-02W;2;3;P 91;944;NTTO;Hao;;French Polynesia;5;18-04S;140-57W;18-04S;140-57W;2;7;P 91;945;----;Hereheretue;;French Polynesia;5;19-52S;145-00W;19-52S;145-00W;2;3;P 91;948;----;Rikitea;;French Polynesia;5;23-08S;134-58W;23-06S;134-52W;91;89;P 91;952;NTTX;Mururoa;;French Polynesia;5;21-49S;138-48W;21-49S;138-49W;2;3;P 91;953;----;Marutea Pf;;French Polynesia;5;21-29S;135-27W;;;3;; 91;954;NTAT;Tubuai;;French Polynesia;5;23-21S;149-29W;23-21S;149-29W;2;3;P 91;958;----;Rapa;;French Polynesia;5;27-37S;144-20W;27-37S;144-20W;1;2;P 91;960;----;Pitcairn;;Pitcairn Islands;5;25-04S;130-06W;;;264;265; 91;997;----;Raoul Island, Kermadec Island;;Pitcairn Islands;5;29-15S;177-55W;;;38;49;P 93;004;----;Cape Reinga;;New Zealand;5;34-26S;172-41E;;;191;191; 93;012;----;Kaitaia;;New Zealand;5;35-06S;173-16E;;;54;54;P 93;020;----;Kerikeri;;New Zealand;5;35-16S;173-55E;;;150;151; 93;023;----;Purerua;;New Zealand;5;35-07S;174-01E;;;82;84; 93;026;----;Mimiwhangata;;New Zealand;5;35-26S;174-25E;;;5;; 93;034;----;Kaikohe Edr;;New Zealand;5;35-25S;173-49E;;;204;; 93;057;----;Whangarei Aerodrome;;New Zealand;5;35-46S;174-22E;;;37;38; 93;062;----;Dargarville;;New Zealand;5;35-57S;173-50E;;;15;18; 93;064;----;Tinopai;;New Zealand;5;36-14S;174-15E;;;20;; 93;069;----;Mokohinau Aws;;New Zealand;5;35-54S;175-06E;;;60;; 93;072;----;Mount Tamahunga;;New Zealand;5;36-18S;174-42E;36-18S;174-42E;452;452; 93;082;----;Great Barrier Island;;New Zealand;5;36-13S;175-29E;;;140;; 93;089;----;Warkworth;;New Zealand;5;36-26S;174-40E;;;72;72; 93;103;----;Whangaparaoa;;New Zealand;5;36-36S;174-50E;;;88;89; 93;104;----;Tiritiri Island;;New Zealand;5;36-36S;174-54E;;;70;; 93;110;----;Auckland Aerodrome Aws;;New Zealand;5;37-00S;174-48E;;;7;; 93;112;NZWP;Whenuapai;;New Zealand;5;36-47S;174-38E;36-47S;174-38E;30;27; 93;113;----;Musick Point;;New Zealand;5;36-50S;174-54E;;;18;; 93;116;----;Aukland City Edr;;New Zealand;5;36-51S;174-45E;;;75;; 93;119;NZAA;Auckland Airport;;New Zealand;5;37-01S;174-48E;37-01S;174-48E;7;6;P 93;129;----;Whitianga Aerodrome Aws;;New Zealand;5;36-52S;175-40E;;;5;6; 93;132;----;Manukau Heads;;New Zealand;5;37-03S;174-33E;;;244;; 93;136;----;Ardmore Aerodrome;;New Zealand;5;37-02S;174-58E;;;34;42; 93;146;----;Paeroa Aws;;New Zealand;5;37-22S;175-41E;;;18;19; 93;172;----;Hamilton Aerodrome;;New Zealand;5;37-52S;175-20E;;;52;54; 93;173;----;Hamilton Aws;;New Zealand;5;37-51S;175-20E;;;53;53; 93;184;----;Tauranga Harbour;;New Zealand;5;37-39S;176-11E;;;36;36; 93;185;----;Tauranga Aerodrome;;New Zealand;5;37-40S;176-12E;;;4;5; 93;186;NZTG;Tauranga Aerodrome Aws;;New Zealand;5;37-40S;176-12E;;;4;5; 93;187;----;Te Puke Edr;;New Zealand;5;37-49S;176-19E;;;91;; 93;190;----;Whakatane Aerodrome;;New Zealand;5;37-55S;176-55E;;;6;7; 93;191;----;Whakatane Aws;;New Zealand;5;37-55S;176-55E;;;7;7; 93;196;----;Hicks Bay Aws;;New Zealand;5;37-33S;178-18E;;;46;46; 93;201;----;Port Taharoa;;New Zealand;5;38-10S;174-42E;;;27;28; 93;210;----;Te Kuiti;;New Zealand;5;38-20S;175-10E;;;52;; 93;220;----;Taumarunui;;New Zealand;5;38-53S;175-15E;;;178;; 93;223;----;Taumarunui Affco;;New Zealand;5;38-53S;175-18E;;;210;; 93;243;----;Taupo Aerodrome;;New Zealand;5;38-45S;176-05E;;;407;401; 93;245;----;Taupo Aws;;New Zealand;5;38-44S;176-04E;;;407;401; 93;246;NZRO;Rotorua Aerodrome;;New Zealand;5;38-07S;176-19E;38-07S;176-19E;285;294; 93;247;----;Rotorua Aerodrome Aws;;New Zealand;5;38-07S;176-19E;;;285;285; 93;286;----;Motu Aws;;New Zealand;5;38-17S;177-31E;;;485;488; 93;289;----;Tuai;;New Zealand;5;38-49S;177-09E;;;274;; 93;291;NZGS;Gisborne Aerodrome;;New Zealand;5;38-40S;177-59E;38-40S;177-59E;5;8; 93;292;----;Gisborne Aerodrome Aws;;New Zealand;5;38-39S;177-59E;;;5;5; 93;305;----;Maui A Platform;;New Zealand;5;39-33S;173-26E;;;48;35; 93;308;NZNP;New Plymouth Aerodrome;;New Zealand;5;39-01S;174-11E;39-01S;174-11E;28;36;P 93;309;----;New Plymouth Aws;;New Zealand;5;39-01S;174-11E;;;28;32; 93;314;----;Normanby Edr;;New Zealand;5;39-30S;174-15E;;;122;; 93;331;----;Chateau Tongariro;;New Zealand;5;39-12S;175-32E;;;1112;; 93;332;----;Turoa Mount Ruapehu;;New Zealand;5;39-18S;175-32E;;;1628;; 93;334;----;Waiouru Aws;;New Zealand;5;39-28S;175-41E;;;821;823; 93;336;----;Waiouru Aerodrome;;New Zealand;5;39-27S;175-40E;;;823;; 93;340;----;Waiouru;;New Zealand;5;39-27S;175-39E;;;822;; 93;373;----;Napier Aerodrome Aws;;New Zealand;5;39-27S;176-51E;;;3;3; 93;375;----;Napier;;New Zealand;5;39-30S;176-55E;;;;; 93;393;----;Mahia Aws;;New Zealand;5;39-07S;177-57E;;;136;136; 93;401;NZOH;Ohakea;;New Zealand;5;40-12S;175-22E;40-12S;175-23E;50;52; 93;404;----;Palmerston North Aws;;New Zealand;5;40-19S;175-36E;;;45;39; 93;405;----;Palmerston North Aerodrome;;New Zealand;5;40-19S;175-37E;;;45;40; 93;410;----;Levin Aws;;New Zealand;5;40-39S;175-16E;;;46;47; 93;417;NZPP;Paraparaumu Aerodrome;;New Zealand;5;40-54S;174-59E;40-54S;174-59E;7;12;P 93;420;----;Paraparaumu Aws;;New Zealand;5;40-54S;174-59E;;;7;7; 93;431;----;Outlook Hill;;New Zealand;5;41-18S;174-38E;41-18S;174-38E;548;548; 93;436;NZWN;Wellington Airport;;New Zealand;5;41-20S;174-48E;;;12;8; 93;439;----;Wellington Aerodrome Aws;;New Zealand;5;41-20S;174-48E;;;12;; 93;440;----;Beacon Hill;;New Zealand;5;41-20S;174-50E;;;131;131; 93;471;----;East Taratahi;;New Zealand;5;41-05S;175-37E;;;92;93; 93;473;----;Masterton Aerodrome;;New Zealand;5;40-58S;175-38E;;;116;; 93;475;----;Masterton Armourguard;;New Zealand;5;40-57S;175-39E;;;110;; 93;477;----;Martinborough;;New Zealand;5;41-13S;175-27E;;;22;; 93;479;----;Ngawihi;;New Zealand;5;41-35S;175-14E;;;8;8; 93;497;----;Castlepoint;;New Zealand;5;40-54S;176-14E;;;5;; 93;498;----;Castlepoint;;New Zealand;5;40-54S;176-14E;;;6;20; 93;515;----;Westport Aerodrome;;New Zealand;5;41-44S;171-34E;;;18;5; 93;516;----;Westport Harbour;;New Zealand;5;41-45S;171-36E;;;2;4;P 93;527;----;Farewell Spit Aws;;New Zealand;5;40-33S;173-00E;;;3;3; 93;529;----;Turimawiwi;;New Zealand;5;40-44S;172-18E;;;15;; 93;540;----;Murchison;;New Zealand;5;41-48S;172-20E;;;168;; 93;545;----;Nelson Aerodrome;;New Zealand;5;41-18S;173-13E;41-18S;173-13E;5;7; 93;546;----;Nelson Aerodrome Aws;;New Zealand;5;41-17S;173-14E;41-18S;173-14E;6;7; 93;550;----;Lake Rotoiti;;New Zealand;5;41-48S;172-51E;;;634;; 93;561;----;Stephens Island;;New Zealand;5;40-40S;174-00E;;;175;187; 93;570;----;Crail Bay;;New Zealand;5;41-06S;173-57E;;;13;; 93;574;----;Picton;;New Zealand;5;41-17S;174-00E;;;5;; 93;577;----;Blenheim Aerodrome;;New Zealand;5;41-31S;173-52E;;;33;32; 93;579;----;Blenheim Aerodrome Aws;;New Zealand;5;41-31S;173-51E;;;35;36; 93;586;----;Brothers Island;;New Zealand;5;41-06S;174-26E;;;68;68; 93;597;----;Cape Campbell Aws;;New Zealand;5;41-44S;174-12E;;;1;32; 93;614;NZHK;Hokitika Aerodrome;;New Zealand;5;42-43S;170-59E;42-43S;170-59E;45;44; 93;615;----;Hokitika Aerodrome Aws;;New Zealand;5;42-43S;170-59E;;;45;40; 93;619;----;Okarito;;New Zealand;5;43-13S;170-09E;;;;6; 93;630;----;Arthurs Pass;;New Zealand;5;42-57S;171-34E;;;738;; 93;658;----;Culverden Airfield;;New Zealand;5;42-46S;172-53E;;;174;; 93;677;NZKI;Kaikoura ;;New Zealand;5;42-25S;173-42E;42-25S;173-42E;101;99; 93;678;----;Kaikoura;;New Zealand;5;42-25S;173-42E;;;105;101; 93;709;----;Haast Aws;;New Zealand;5;43-52S;169-00E;;;3;5; 93;720;----;Milford Sound;;New Zealand;5;44-40S;167-55E;;;3;6; 93;729;----;Wanaka Aws;;New Zealand;5;44-43S;169-14E;;;351;; 93;732;----;Tasman Aerodrome;;New Zealand;5;43-46S;170-08E;;;656;; 93;735;----;Twizel;;New Zealand;5;44-15S;170-06E;;;457;458; 93;747;----;Tara Hills;;New Zealand;5;44-31S;169-54E;;;488;; 93;749;----;Saint Bathans;;New Zealand;5;44-52S;169-49E;;;640;; 93;755;----;Fairlie;;New Zealand;5;44-06S;170-49E;;;300;; 93;758;----;Woodbury;;New Zealand;5;44-02S;171-12E;;;195;; 93;761;----;Hororata;;New Zealand;5;43-31S;171-56E;;;196;; 93;766;----;Ashburton;;New Zealand;5;43-54S;171-45E;;;89;; 93;769;----;Rakaia;;New Zealand;5;43-47S;172-01E;43-47S;172-01E;124;124; 93;772;----;Timaru Aerodrome;;New Zealand;5;44-18S;171-13E;;;27;; 93;773;----;Timaru Aerodrome Aws;;New Zealand;5;44-18S;171-14E;;;26;27; 93;775;----;Timaru Harbour;;New Zealand;5;44-24S;171-15E;;;3;8; 93;780;NZCH;Christchurch;;New Zealand;5;43-29S;172-33E;43-29S;172-33E;38;30;P 93;781;----;Christchurch Aerodrome Aws;;New Zealand;5;43-29S;172-31E;;;37;; 93;783;----;Wigram;;New Zealand;5;43-33S;172-33E;;;21;30; 93;786;----;Lyttelton;;New Zealand;5;43-37S;172-43E;;;5;14; 93;792;----;Le Bon Bay Aws;;New Zealand;5;43-44S;173-07E;;;237;238; 93;796;----;Oamaru Airport Aws;;New Zealand;5;44-58S;171-05E;;;30;31; 93;800;----;Secretary Island Aws;;New Zealand;5;45-13S;166-53E;;;19;; 93;805;----;Puysegur Point Aws;;New Zealand;5;46-10S;166-38E;;;46;44; 93;811;----;Manapouri Aerodrome Aws;;New Zealand;5;45-32S;167-38E;;;209;209; 93;831;----;Queenstown Aerodrome;;New Zealand;5;45-01S;168-44E;;;354;358; 93;834;----;Lumsden;;New Zealand;5;45-45S;168-27E;;;193;195; 93;844;NZNV;Invercargill Aerodrome;;New Zealand;5;46-42S;168-33E;46-25S;168-20E;0;4;P 93;845;----;Invercargill Airport Aws;;New Zealand;5;46-25S;168-20E;;;0;2; 93;855;----;Alexandra;;New Zealand;5;45-15S;169-23E;;;;143; 93;864;----;Gore Edr;;New Zealand;5;46-06S;168-53E;;;123;; 93;868;----;Edievale;;New Zealand;5;45-47S;169-21E;;;270;; 93;887;----;Nugget Point Aws;;New Zealand;5;46-27S;169-49E;;;129;130; 93;890;NZDN;Dunedin Aerodrome;;New Zealand;5;45-56S;170-12E;45-56S;170-12E;1;2; 93;891;----;Dunedin Aerodrome Aws;;New Zealand;5;45-55S;170-11E;;;1;2; 93;893;----;Dunedin Musselburgh;;New Zealand;5;45-54S;170-31E;;;2;2; 93;896;----;Taiaroa Head;;New Zealand;5;45-46S;170-44E;;;72;76; 93;909;----;South West Cape Aws;;New Zealand;5;47-16S;167-27E;;;101;102; 93;929;----;Enderby Island Aws;;New Zealand;5;50-29S;166-18E;;;40;40; 93;945;----;Campbell Island Aws;;New Zealand;5;52-33S;169-10E;;;19;; 93;947;----;Campbell Island Aws;;New Zealand;5;52-33S;169-09E;;;15;19; 93;986;NZCI;Chatham Island;;New Zealand;5;43-57S;176-34W;43-57S;176-34W;44;48;P 93;987;----;Chatham Islands Aws;;New Zealand;5;43-57S;176-34W;;;44;49; 93;994;----;Raoul Island Kermadec Island;;New Zealand;5;29-15S;177-55W;;;38;49; 93;997;NZRN;Raoul Island, Kermadec Island;;New Zealand;5;29-15S;177-55W;29-15S;177-55W;38;49;P 94;001;----;Kiunga;;Papua New Guinea;5;06-08S;141-18E;;;26;35; 94;003;----;Daru;;Papua New Guinea;5;09-05S;143-12E;;;6;;P 94;004;AYWK;Wewak;;Papua New Guinea;5;03-34S;143-38E;;;6;;P 94;005;----;Mount Hagen;;Papua New Guinea;5;05-50S;144-18E;;;1631;;P 94;006;----;Koinambe;;Papua New Guinea;5;05-29S;144-36E;;;884;; 94;010;----;Goroka;;Papua New Guinea;5;06-04S;145-23E;;;1587;; 94;011;----;Kundiawa;;Papua New Guinea;5;06-01S;144-58E;;;1493;; 94;012;----;Kerema;;Papua New Guinea;5;07-57S;145-46E;;;6;; 94;013;----;Orobiga;;Papua New Guinea;5;05-47S;140-20E;;;1480;; 94;014;AYMD;Madang;;Papua New Guinea;5;05-13S;145-47E;05-13S;145-47E;3;5;P 94;016;----;Aiyura;;Papua New Guinea;5;06-19S;145-54E;;;1554;; 94;017;----;Ambunti;;Papua New Guinea;5;04-13S;142-49E;;;10;; 94;021;----;Mendi;;Papua New Guinea;5;06-10S;143-40E;;;1676;; 94;022;----;Vanimo I. P. S;;Papua New Guinea;5;02-42S;141-19E;;;3;;P 94;023;----;Bulolo;;Papua New Guinea;5;07-12S;146-39E;;;583;; 94;026;----;Saramandi;;Papua New Guinea;5;04-05S;144-05E;;;40;; 94;031;----;Lake Kutubu;;Papua New Guinea;5;06-22S;143-18E;;;807;; 94;035;AYPY;Moresby;;Papua New Guinea;5;09-26S;147-13E;09-26S;147-13E;38;49;P 94;040;----;Bipi;;Papua New Guinea;5;02-01S;146-59E;;;4;; 94;042;----;Lemakot;;Papua New Guinea;5;03-01S;151-49E;;;6;; 94;044;----;Momote;;Papua New Guinea;5;02-04S;147-26E;02-03S;147-25E;4;5;P 94;047;----;Nadzab;;Papua New Guinea;5;05-34S;146-44E;05-34S;146-33E;70;71; 94;051;----;Erave;;Papua New Guinea;5;06-39S;143-53E;;;1036;; 94;057;----;Safia;;Papua New Guinea;5;09-35S;148-38E;;;45;; 94;068;----;Agaun;;Papua New Guinea;5;09-56S;149-23E;;;1005;; 94;069;----;Kurada;;Papua New Guinea;5;10-03S;151-00E;;;3;; 94;070;----;Sideia;;Papua New Guinea;5;10-37S;150-40E;;;3;; 94;071;----;Uvol;;Papua New Guinea;5;06-10S;150-57E;;;3;; 94;072;----;Hoskins;;Papua New Guinea;5;05-28S;150-24E;;;8;; 94;075;----;Dami;;Papua New Guinea;5;05-29S;150-24E;;;5;; 94;076;----;Kavieng;;Papua New Guinea;5;02-35S;150-48E;02-34S;150-49E;3;4;P 94;077;----;Gurney;;Papua New Guinea;5;10-19S;150-20E;;;20;25;P 94;080;----;Salamo;;Papua New Guinea;5;09-40S;150-47E;;;15;; 94;082;----;Nuguria;;Papua New Guinea;5;03-19S;154-40E;;;3;; 94;083;----;Namatanai;;Papua New Guinea;5;03-40S;152-27E;;;42;; 94;084;----;Feni;;Papua New Guinea;5;04-01S;153-40E;;;2;; 94;087;----;Misima;;Papua New Guinea;5;10-41S;152-50E;10-42S;152-50E;17;14;P 94;088;----;Lihir Island;;Papua New Guinea;5;03-37S;152-32E;;;3;; 94;090;----;Jinjo;;Papua New Guinea;5;11-19S;154-14E;;;18;;P 94;092;----;Mimowa;;Papua New Guinea;5;11-18S;153-16E;;;3;; 94;097;----;Kieta M. O.;;Papua New Guinea;5;06-19S;155-43E;;;3;5;P 94;101;----;Kalumburu;;Australia;5;14-17S;126-38E;;;29;24;P 94;102;----;Troughton Island W. A. ;;Australia;5;13-45S;126-09E;;;6;8; 94;103;----;Browse Island Aws;;Australia;5;14-07S;123-32E;;;4;5; 94;105;----;Scott Reef Aws;;Australia;5;14-02S;121-45E;;;3;3; 94;111;----;Port Keats Aws;;Australia;5;14-14S;129-27E;;;17;18; 94;116;----;Dum In Mirrie Aws;;Australia;5;12-38S;130-22E;;;4;4; 94;117;----;Mango Farm;;Australia;5;13-44S;130-40E;;;15;16;P 94;119;----;Garden Point;;Australia;5;11-24S;130-25E;;;12;12;P 94;120;YPDN;Darwin Airport;;Australia;5;12-24S;130-52E;12-26S;130-52E;31;30;P 94;121;----;Channel Point;;Australia;5;13-10S;130-07E;;;3;4; 94;122;----;Bathurst Island Aws Cape Fourcroy;;Australia;5;11-47S;130-01E;;;14;15; 94;123;----;Gunn Point;;Australia;5;12-15S;131-02E;;;20;; 94;124;----;Middle Point Research Station ;;Australia;5;12-34S;131-18E;;;10;; 94;125;----;Batchelor Aws;;Australia;5;13-03S;131-01E;;;104;105; 94;127;----;Point Stuart Aws;;Australia;5;12-14S;131-53E;;;5;6; 94;128;----;Cape Don Light House ;;Australia;5;11-19S;131-46E;;;20;; 94;129;----;Cape Don Aws;;Australia;5;11-19S;131-46E;;;19;20;P 94;131;----;Tindal AWS;;Australia;5;14-31S;132-22E;;;135;135; 94;134;----;Black Point Port Essington ;;Australia;5;11-09S;132-08E;;;5;10; 94;135;----;Mccluer Island Aws;;Australia;5;11-03S;132-59E;;;4;5; 94;137;----;Jabiru Airport;;Australia;5;12-40S;132-54E;;;26;; 94;138;----;Gunbalunya;;Australia;5;12-19S;133-03E;;;7;9;P 94;139;----;Warruwi;;Australia;5;11-39S;133-24E;;;4;5;P 94;140;----;Milingimbi Aws;;Australia;5;12-06S;134-54E;;;4;5;P 94;142;----;Maningrida;;Australia;5;12-03S;134-13E;;;11;13;P 94;145;----;Roper Valley;;Australia;5;14-55S;134-00E;;;69;70; 94;146;----;Elcho Island;;Australia;5;12-01S;135-33E;;;18;27;P 94;147;----;Cape Wessel Aws;;Australia;5;11-01S;136-45E;;;18;19; 94;149;----;Alyangula Police Police Station ;;Australia;5;13-50S;136-25E;;;20;22;P 94;150;YDGV;Gove Airport;;Australia;5;12-16S;136-49E;12-16S;136-49E;52;54;P 94;151;----;North East Island Aws;;Australia;5;13-39S;136-57E;;;17;19; 94;152;----;Borroloola Aws;;Australia;5;16-05S;136-18E;;;16;17; 94;170;----;Weipa Amo;;Australia;5;12-41S;141-55E;12-38S;141-53E;20;22; 94;171;YBWP;Weipa City;;Australia;5;12-38S;141-53E;;;12;; 94;174;----;Horn Island Aws;;Australia;5;10-35S;142-17E;;;5;5; 94;175;----;Thursday Island Township;;Australia;5;10-34S;142-13E;10-35S;142-13E;8;60;P 94;182;----;Coconut Island Aws;;Australia;5;10-03S;143-03E;;;9;10; 94;184;----;Coen Airport;;Australia;5;13-45S;143-07E;;;162;162;P 94;185;----;Coen Post Office ;;Australia;5;13-56S;143-12E;;;195;197;P 94;186;----;Lockhart River Airport;;Australia;5;12-47S;143-18E;;;24;20;P 94;187;----;Musgrave Station;;Australia;5;14-47S;143-30E;;;79;82; 94;200;----;Mandora;;Australia;5;19-45S;120-51E;;;7;8;P 94;201;----;Cygnet Bay;;Australia;5;16-27S;123-00E;;;12;16; 94;202;----;La Grange;;Australia;5;18-41S;121-46E;;;11;12;P 94;203;YBRM;Broome Airport;;Australia;5;17-57S;122-13E;17-57S;122-14E;17;9;P 94;204;----;Curtin Aws;;Australia;5;17-35S;123-50E;;;91;78; 94;205;YPDB;Derby;;Australia;5;17-18S;123-37E;17-19S;123-38E;8;9;P 94;206;----;Koolan Island;;Australia;5;16-08S;123-46E;;;145;; 94;207;----;Rowley Shoals Aws;;Australia;5;17-32S;118-57E;;;8;8; 94;208;----;Kuri Bay;;Australia;5;15-29S;124-31E;;;28;29; 94;209;----;Fitzroy Crossing Cadjebut;;Australia;5;18-43S;125-58E;;;200;202; 94;210;----;Adele Island Aws;;Australia;5;15-30S;123-09E;;;5;5; 94;211;----;Mount Barnett Mount Elizabeth;;Australia;5;16-25S;126-06E;;;550;551;P 94;212;----;Halls Creek Airport;;Australia;5;18-13S;127-39E;18-14S;127-40E;410;424;P 94;213;----;Turkey Creek;;Australia;5;17-01S;128-12E;;;203;205;P 94;214;----;Wyndham;;Australia;5;15-29S;128-07E;;;16;17;P 94;215;----;King Edward River;;Australia;5;15-22S;126-18E;;;400;386; 94;216;YPKU;Kununurra Kununurra Aws ;;Australia;5;15-46S;128-42E;;;44;45;P 94;217;----;Kununurra Argyle Aerodrome Aws;;Australia;5;16-38S;128-27E;;;159;165; 94;218;----;Inverway;;Australia;5;17-51S;129-38E;;;403;; 94;220;----;Timber Creek;;Australia;5;15-39S;130-28E;;;20;23; 94;229;----;Wave Hill;;Australia;5;17-23S;131-07E;;;195;197;P 94;232;----;Victoria River Downs;;Australia;5;16-24S;131-00E;;;82;82;P 94;236;----;Elliott;;Australia;5;17-33S;133-32E;;;220;223; 94;237;----;Larrimah;;Australia;5;15-34S;133-12E;;;183;186; 94;238;YDTC;Tennant Creek Airport;;Australia;5;19-38S;134-10E;19-38S;134-10E;375;376;P 94;239;----;Mcarthur River;;Australia;5;16-26S;136-05E;;;41;42;P 94;242;----;Brunette Downs;;Australia;5;18-39S;135-57E;;;218;219;P 94;248;----;Centre Island;;Australia;5;15-44S;136-48E;;;4;5;P 94;255;----;Camooweal;;Australia;5;19-55S;138-07E;;;233;235;P 94;256;----;Mornington Island Aws;;Australia;5;16-39S;139-09E;;;10;9;P 94;258;----;Wollogorang;;Australia;5;17-12S;137-56E;;;60;61; 94;259;----;Burketown;;Australia;5;17-44S;139-32E;;;6;8;P 94;267;----;Normanton;;Australia;5;17-40S;141-05E;;;9;10;P 94;268;----;Kowanyama;;Australia;5;15-29S;141-44E;;;11;14;P 94;269;----;Croydon;;Australia;5;18-12S;142-14E;;;116;119;P 94;275;----;Georgetown;;Australia;5;18-18S;143-33E;;;292;295;P 94;276;----;Palmerville;;Australia;5;16-59S;144-04E;;;205;204;P 94;283;----;Cooktown Amo Mission Strip ;;Australia;5;15-26S;145-11E;15-28S;145-15E;8;9;P 94;285;----;Low Isles;;Australia;5;16-23S;145-34E;;;3;4;P 94;286;----;Mareeba Airport;;Australia;5;17-04S;145-25E;;;475;476; 94;287;YBCS;Cairns Airport;;Australia;5;16-53S;145-45E;16-53S;145-45E;3;7;P 94;288;----;Atherton Treatment Plant;;Australia;5;17-15S;145-29E;;;752;; 94;289;----;Holmes Reef;;Australia;5;16-28S;147-52E;;;2;8; 94;290;----;Flinders Reef;;Australia;5;17-43S;148-26E;;;3;8; 94;291;----;Innisfail;;Australia;5;17-31S;146-01E;;;4;; 94;292;----;Cardwell;;Australia;5;18-15S;146-01E;;;6;7;P 94;294;YBTL;Townsville Amo;;Australia;5;19-15S;146-45E;19-15S;146-45E;6;9;P 94;295;----;Lucinda Point Aws;;Australia;5;18-31S;146-24E;;;10;10; 94;296;----;Lihou Reef;;Australia;5;17-07S;152-00E;;;3;9; 94;298;----;Marion Reef;;Australia;5;19-05S;152-23E;;;2;8; 94;299;----;Willis Island;;Australia;5;16-18S;149-59E;16-18S;149-59E;6;9;P 94;300;----;Carnarvon Airport;;Australia;5;24-52S;113-40E;24-53S;113-40E;4;7;P 94;302;YPLM;Learmonth Airport;;Australia;5;22-14S;114-05E;22-14S;114-05E;5;6;P 94;303;----;Thevenard Island Aws;;Australia;5;21-27S;115-01E;;;5;6; 94;304;----;Barrow Island;;Australia;5;20-49S;115-23E;;;62;63;P 94;305;----;Onslow;;Australia;5;21-38S;115-06E;21-38S;115-06E;4;5;P 94;306;----;Mardie;;Australia;5;21-11S;115-58E;;;11;12;P 94;307;----;Karratha Legendre Isalnd ;;Australia;5;20-22S;116-51E;;;30;29; 94;308;----;Dampier;;Australia;5;20-43S;116-44E;;;12;; 94;309;----;Roebourne;;Australia;5;20-47S;117-07E;;;12;13;P 94;310;----;Port Hedland Bedout Island Aws;;Australia;5;19-35S;119-06E;;;9;10; 94;311;----;Shay Gap;;Australia;5;20-30S;120-10E;;;164;167;P 94;312;YPPD;Port Hedland Pardoo;;Australia;5;20-06S;119-34E;20-22S;118-37E;9;10;P 94;313;----;Wittenoom;;Australia;5;22-14S;118-20E;;;463;464;P 94;314;----;Pannawonica;;Australia;5;21-38S;116-19E;;;200;; 94;315;----;Marble Bar;;Australia;5;21-10S;119-45E;;;188;189;P 94;316;----;Nullagine;;Australia;5;21-55S;120-12E;;;376;; 94;317;----;Newman Aerodrome;;Australia;5;23-25S;119-48E;;;524;526; 94;318;----;Nyang;;Australia;5;23-02S;115-02E;;;111;112;P 94;319;----;Telfer;;Australia;5;21-42S;122-13E;;;294;294; 94;320;----;Balgo Hills;;Australia;5;20-08S;127-52E;;;420;421; 94;322;----;Rabbit Flat;;Australia;5;20-11S;130-00E;20-13S;130-01E;340;340;P 94;323;----;Watarrka Kings Canyon ;;Australia;5;24-17S;131-32E;;;614;612; 94;324;----;Yuendumu;;Australia;5;22-15S;131-47E;;;661;668;P 94;325;----;Ali Curung Tennant Creek ;;Australia;5;21-01S;134-24E;;;375;376;P 94;326;YBAS;Alice Springs Aerodrome;;Australia;5;23-48S;133-53E;23-48S;133-54E;545;547;P 94;327;----;Jervois;;Australia;5;22-57S;131-08E;;;325;323;P 94;328;----;Territory Grape Farm Ti Tree;;Australia;5;22-27S;133-38E;;;623;; 94;329;----;Urandangie;;Australia;5;21-36S;138-18E;;;174;175;P 94;332;YBMA;Mount Isa Amo;;Australia;5;20-40S;139-28E;20-40S;139-29E;342;341;P 94;333;----;Boulia;;Australia;5;22-55S;139-54E;;;157;158;P 94;335;----;Cloncurry Composite;;Australia;5;20-42S;140-31E;;;200;; 94;337;----;Julia Creek;;Australia;5;20-39S;141-44E;;;123;124;P 94;339;----;Winton Post Office ;;Australia;5;22-23S;143-02E;;;182;184;P 94;340;----;Richmond;;Australia;5;20-43S;143-08E;;;211;215;P 94;343;----;Hughenden;;Australia;5;20-50S;144-12E;;;325;326;P 94;345;----;Isisford Post Office ;;Australia;5;24-16S;144-26E;;;205;; 94;346;YBLR;Longreach Airport;;Australia;5;23-26S;144-16E;23-26S;144-16E;192;193;P 94;350;----;Barcaldine;;Australia;5;23-33S;145-17E;;;267;; 94;351;----;Blackall;;Australia;5;24-25S;145-27E;;;283;285;P 94;355;----;Tambo;;Australia;5;24-53S;146-15E;;;395;397;P 94;356;----;Charters Towers Airport;;Australia;5;20-02S;146-16E;;;291;292;P 94;358;----;Moranbah;;Australia;5;22-59S;148-01E;;;254;255; 94;359;----;Clermont;;Australia;5;22-49S;147-38E;22-49S;147-38E;267;269;P 94;360;----;Collinsville;;Australia;5;20-33S;147-50E;;;187;; 94;362;----;Blackwater;;Australia;5;23-35S;148-52E;;;200;; 94;363;----;Emerald Airport;;Australia;5;23-34S;148-10E;;;190;190;P 94;364;----;Rolleston;;Australia;5;24-27S;148-37E;;;217;219; 94;365;YBPN;Proserpine Airport;;Australia;5;20-29S;148-32E;;;25;18; 94;366;----;Bowen Airport;;Australia;5;20-01S;148-12E;;;8;6;P 94;367;YBMK;Mackay Mo;;Australia;5;21-07S;149-12E;21-07S;149-13E;30;32;P 94;368;----;Hamilton Island;;Australia;5;20-21S;148-57E;;;2;17;P 94;369;----;St Lawrence Post Office ;;Australia;5;22-20S;149-32E;;;17;18;P 94;371;----;Creal Reef;;Australia;5;20-31S;150-22E;;;2;7; 94;373;----;Yeppoon Aws;;Australia;5;23-08S;151-45E;;;6;6; 94;374;YBRK;Rockhampton Airport;;Australia;5;23-23S;150-28E;23-23S;150-28E;10;14;P 94;375;----;Baralaba;;Australia;5;24-11S;149-48E;24-11S;149-49E;94;94; 94;376;----;Biloela Thangool Airport;;Australia;5;24-29S;150-34E;;;196;199; 94;377;----;Monto Airport;;Australia;5;24-53S;151-06E;;;231;228;P 94;378;----;Rundle Island Aws;;Australia;5;23-32S;151-17E;;;20;20; 94;379;----;Gannet Cay;;Australia;5;21-58S;152-28E;;;2;8; 94;380;YBGL;Gladstone;;Australia;5;23-51S;151-15E;23-51S;151-16E;75;76;P 94;381;----;Gladstone Airport Aws;;Australia;5;23-52S;151-13E;;;20;17; 94;384;----;Town Of 1770;;Australia;5;24-09S;151-53E;;;34;2;P 94;386;----;Heron Island Aws;;Australia;5;23-26S;151-55E;;;8;8; 94;387;----;Bundaberg Aerodrome;;Australia;5;24-54S;152-19E;;;33;35;P 94;388;----;Lady Elliot Island;;Australia;5;24-06S;152-42E;;;4;5;P 94;390;----;Sandy Cape;;Australia;5;24-43S;153-12E;;;99;101;P 94;393;----;Frederick Reef;;Australia;5;20-56S;154-24E;;;6;11; 94;394;----;Cato Island;;Australia;5;23-15S;155-32E;;;6;7; 94;401;----;Kalbarri;;Australia;5;27-42S;114-09E;;;6;7;P 94;402;----;Shark Bay Denham ;;Australia;5;25-55S;113-31E;;;9;10;P 94;403;YPGN;Geraldton Airport;;Australia;5;28-47S;114-42E;28-48S;114-42E;37;34;P 94;404;----;Paynes Find;;Australia;5;29-16S;117-40E;;;339;340; 94;405;----;Abrolhos Island North Island Aws ;;Australia;5;28-18S;113-35E;;;10;11; 94;410;----;Gascoyne Junction Gascoyne Jun ;;Australia;5;25-03S;115-12E;;;144;; 94;411;----;Mullewa;;Australia;5;28-32S;115-30E;;;282;; 94;414;----;Eneabba;;Australia;5;29-49S;115-16E;;;100;; 94;415;----;Carnamah;;Australia;5;29-41S;115-53E;;;267;; 94;416;----;Morawa;;Australia;5;29-13S;116-00E;;;274;; 94;422;----;Murchison Murchison Shire ;;Australia;5;26-53S;115-57E;;;288;289; 94;428;----;Mount Magnet;;Australia;5;28-03S;117-50E;;;426;427; 94;430;YPMR;Meekatharra Airport;;Australia;5;26-36S;118-32E;26-36S;118-31E;522;518;P 94;439;----;Wiluna;;Australia;5;26-35S;120-13E;;;521;519;P 94;440;----;Yeelirrie;;Australia;5;27-16S;120-05E;;;486;488;P 94;444;----;Sandstone Cashmere Downs;;Australia;5;28-58S;119-34E;;;450;; 94;445;----;Laverton Yamarna ;;Australia;5;28-09S;123-39E;;;442;443;P 94;446;----;Menzies;;Australia;5;29-41S;121-01E;;;426;427;P 94;447;----;Diemals;;Australia;5;29-40S;119-16E;;;434;; 94;448;----;Leonora;;Australia;5;28-53S;121-19E;;;379;380;P 94;449;----;Laverton Aws;;Australia;5;28-37S;122-25E;;;465;465; 94;451;----;Carnegie Carnegie ;;Australia;5;25-47S;122-58E;;;452;449;P 94;458;----;Coober Pedy Private ;;Australia;5;29-00S;134-45E;;;215;; 94;461;----;Giles;;Australia;5;25-02S;128-17E;25-02S;128-18E;580;599;P 94;462;YDYL;Yulara Aws;;Australia;5;25-11S;130-58E;;;493;492; 94;463;----;Curtin Springs;;Australia;5;25-19S;131-45E;;;488;; 94;466;----;Kulgera;;Australia;5;25-50S;133-17E;;;510;512;P 94;476;----;Oodnadatta Airport;;Australia;5;27-35S;135-27E;;;118;117; 94;477;----;Marla;;Australia;5;27-18S;133-37E;;;322;324;P 94;480;----;Marree;;Australia;5;29-39S;138-03E;;;50;51;P 94;482;----;Birdsville;;Australia;5;25-54S;139-21E;;;47;47;P 94;485;----;Tibooburra;;Australia;5;29-25S;142-01E;;;183;184;P 94;488;----;Windorah;;Australia;5;25-25S;142-39E;;;126;129;P 94;492;----;Thargomindah;;Australia;5;27-59S;143-49E;;;129;130;P 94;494;----;Quilpie;;Australia;5;26-37S;144-16E;;;197;198;P 94;497;----;Wanaaring Post Office ;;Australia;5;29-42S;144-09E;;;108;; 94;500;----;Cunnamulla;;Australia;5;28-04S;145-44E;28-04S;145-41E;189;191;P 94;510;YBCV;Charleville Airport;;Australia;5;26-24S;146-16E;26-25S;146-16E;306;304;P 94;511;----;Injune Post Office ;;Australia;5;25-51S;148-34E;;;390;; 94;513;----;Bollon;;Australia;5;28-01S;147-28E;;;183;185;P 94;514;----;Mitchell Post Office ;;Australia;5;26-29S;147-58E;;;336;338;P 94;515;----;Roma Airport;;Australia;5;26-32S;148-46E;;;315;305;P 94;516;----;St George;;Australia;5;28-02S;148-35E;;;201;203;P 94;520;----;Mungindi;;Australia;5;28-58S;148-59E;;;160;; 94;521;----;Surat;;Australia;5;27-09S;149-04E;;;246;; 94;525;----;Taroom;;Australia;5;25-38S;149-47E;;;200;200;P 94;527;----;Moree Mo;;Australia;5;29-28S;149-51E;29-28S;149-51E;212;212;P 94;529;----;Miles;;Australia;5;26-40S;150-11E;;;305;307;P 94;530;----;Goondiwindi Airport;;Australia;5;28-31S;150-19E;;;218;219;P 94;541;----;Inverell Post Office ;;Australia;5;29-46S;151-06E;;;584;586; 94;542;----;Dalby Airport;;Australia;5;27-09S;151-16E;;;347;348;P 94;543;----;Gayndah;;Australia;5;25-38S;151-37E;;;106;108;P 94;549;----;Kingaroy;;Australia;5;26-33S;151-50E;;;442;443;P 94;550;----;Stanthorpe;;Australia;5;28-39S;151-56E;;;792;795;P 94;551;----;Toowoomba Composite;;Australia;5;27-35S;151-55E;;;675;676;P 94;552;YBOK;Oakey Aerodrome;;Australia;5;27-25S;151-44E;;;407;407;P 94;555;----;Warwick Aws;;Australia;5;28-12S;152-06E;;;475;476; 94;556;----;Tenterfield Derby Street;;Australia;5;29-03S;152-01E;;;860;; 94;564;----;Rainbow Beach;;Australia;5;25-54S;153-05E;;;14;51; 94;565;----;Hervey Bay Pialba ;;Australia;5;25-18S;152-49E;;;17;; 94;566;----;Gympie Forestry ;;Australia;5;26-09S;152-38E;;;100;; 94;567;----;Maryborough;;Australia;5;25-32S;152-40E;;;11;11;P 94;568;YBAM;Amberley Aerodrome;;Australia;5;27-38S;152-43E;;;27;31;P 94;569;----;Maroochydore Airport Aws;;Australia;5;26-36S;153-06E;;;3;17; 94;571;----;Grafton;;Australia;5;29-41S;152-55E;;;9;; 94;573;----;Casino Airport Aws;;Australia;5;28-53S;153-03E;;;26;22; 94;574;----;Casino Airport;;Australia;5;28-53S;153-02E;;;26;; 94;575;YBAF;Archerfield Aerodrome;;Australia;5;27-34S;153-00E;;;23;18; 94;577;----;Hinze Dam Nerang River;;Australia;5;28-03S;153-17E;;;110;; 94;578;YBBN;Brisbane Airport M. O;;Australia;5;27-23S;153-06E;27-25S;153-05E;4;5;P 94;579;----;Brisbane Airport Aws No. 2;;Australia;5;27-23S;153-07E;;;4;; 94;580;----;Gold Coast Seaway Aws;;Australia;5;27-56S;153-26E;;;2;3; 94;581;----;Canungra;;Australia;5;28-02S;153-11E;;;120;; 94;582;----;Murwillumbah;;Australia;5;28-21S;153-23E;;;18;; 94;584;----;Double Island Point Ligh;;Australia;5;25-56S;153-11E;;;94;95; 94;585;----;Caloundra;;Australia;5;26-48S;153-09E;;;57;; 94;586;----;Lismore Centre Street;;Australia;5;28-48S;153-15E;;;11;13;P 94;587;----;Tabulam;;Australia;5;28-45S;152-27E;;;555;;P 94;589;----;Yamba;;Australia;5;29-26S;153-21E;;;29;30;P 94;592;YBCG;Coolangatta Airport Aws;;Australia;5;28-10S;153-30E;;;6;6; 94;594;----;Cape Moreton;;Australia;5;27-02S;153-28E;;;99;102;P 94;595;----;Cape Byron;;Australia;5;28-38S;153-38E;;;91;98;P 94;596;----;Ballina Airport Aws;;Australia;5;28-50S;153-34E;;;2;2; 94;600;----;Cape Naturaliste;;Australia;5;33-32S;115-00E;33-32S;115-00E;97;98;P 94;601;----;Cape Leeuwin;;Australia;5;34-22S;115-07E;;;14;14;P 94;602;----;Rottnest Island Aws;;Australia;5;32-00S;115-30E;;;43;44; 94;603;----;Rottnest Island;;Australia;5;32-00S;115-30E;;;46;48;P 94;604;----;Bunbury;;Australia;5;33-18S;115-39E;;;3;11;P 94;605;----;Mandurah Aws;;Australia;5;32-31S;115-44E;;;21;22; 94;606;----;Margaret River;;Australia;5;33-56S;115-04E;;;88;90; 94;607;----;Wanneroo Ocean Reef Aws ;;Australia;5;31-45S;115-43E;;;10;; 94;608;----;Mount Lawley Perth Metro Aws;;Australia;5;31-55S;115-52E;;;25;25;P 94;609;----;Spearwood Jandakot Aerodrome Aws;;Australia;5;32-05S;115-52E;;;30;31; 94;610;YPPH;Belmont Perth Airport ;;Australia;5;31-56S;115-57E;31-55S;115-58E;20;29;P 94;611;----;Moora;;Australia;5;30-38S;116-00E;;;203;; 94;612;YPEA;Bullsbrook Pearce Amo;;Australia;5;31-40S;116-01E;;;45;49;P 94;613;----;Windy Harbour;;Australia;5;34-50S;116-00E;;;6;; 94;614;----;Swanbourne Aws;;Australia;5;31-57S;115-45E;;;20;; 94;615;----;Kalamunda;;Australia;5;31-56S;116-02E;;;220;; 94;616;----;Bridgetown;;Australia;5;33-57S;116-08E;;;150;151;P 94;617;----;Manjimup;;Australia;5;34-14S;116-09E;;;280;; 94;619;----;Dalwallinu;;Australia;5;30-16S;116-39E;;;335;338;P 94;620;----;Dwellingup;;Australia;5;32-43S;116-03E;32-43S;116-03E;267;268;P 94;621;----;Northam Composite;;Australia;5;31-39S;116-40E;;;155;; 94;622;----;Wongan Hills;;Australia;5;30-53S;116-43E;;;282;283;P 94;623;----;York;;Australia;5;31-53S;116-45E;;;174;175;P 94;624;----;Wandering Shire;;Australia;5;32-40S;116-40E;;;280;; 94;625;----;Brookton;;Australia;5;32-22S;117-00E;;;240;; 94;626;----;Cunderdin Post Office ;;Australia;5;31-39S;117-14E;;;236;236;P 94;627;----;Narrogin;;Australia;5;32-56S;117-10E;32-56S;117-10E;338;350; 94;629;----;Katanning;;Australia;5;33-41S;117-33E;;;310;311;P 94;630;----;Mount Barker;;Australia;5;34-37S;117-39E;;;280;; 94;632;----;Bencubbin;;Australia;5;30-48S;117-51E;;;352;353;P 94;633;----;Corrigin;;Australia;5;32-19S;117-52E;;;295;296;P 94;634;----;Southern Cross;;Australia;5;31-13S;119-19E;;;355;356;P 94;635;----;Lake Grace;;Australia;5;33-07S;118-28E;;;286;287;P 94;636;----;Ravensthorpe;;Australia;5;33-34S;120-02E;;;232;233;P 94;637;YPKG;Kalgoorlie Boulder Amo;;Australia;5;30-47S;121-27E;30-46S;121-27E;367;370;P 94;638;----;Esperance;;Australia;5;33-49S;121-53E;33-49S;121-53E;25;26;P 94;639;----;Norseman;;Australia;5;32-12S;121-47E;;;277;278;P 94;642;----;Balladonia;;Australia;5;32-27S;123-52E;;;149;148;P 94;643;----;Balgair;;Australia;5;31-05S;125-39E;;;162;163;P 94;645;----;Eyre Madura;;Australia;5;32-14S;126-17E;;;6;6; 94;646;YPFT;Forrest Airport;;Australia;5;30-50S;128-06E;30-50S;128-06E;160;156; 94;647;----;Eucla Amo;;Australia;5;31-41S;128-54E;31-40S;128-53E;93;102;P 94;649;----;Cook;;Australia;5;30-37S;130-24E;;;120;121;P 94;651;----;Nullarbor;;Australia;5;31-26S;130-53E;;;64;65; 94;653;YPCD;Ceduna Airport;;Australia;5;32-07S;133-42E;32-07S;133-42E;23;17;P 94;654;----;Streaky Bay;;Australia;5;32-48S;134-13E;;;13;14;P 94;655;----;Tarcoola;;Australia;5;30-43S;134-34E;;;119;120;P 94;656;----;Elliston Post Office ;;Australia;5;33-39S;134-53E;;;4;5;P 94;657;----;Kyancutta;;Australia;5;33-07S;135-33E;;;58;61;P 94;658;----;Coles Point Aws;;Australia;5;34-23S;135-22E;;;28;29; 94;659;YPWR;Woomera Aerodrome;;Australia;5;31-08S;136-49E;31-09S;136-48E;165;167;P 94;660;----;Port Lincoln;;Australia;5;34-43S;135-52E;;;4;5;P 94;661;----;Cleve;;Australia;5;33-42S;136-29E;33-42S;136-29E;193;194;P 94;662;----;Whyalla Airport;;Australia;5;33-03S;137-30E;;;11;; 94;663;----;Warooka;;Australia;5;34-59S;137-24E;;;53;54;P 94;664;----;Whyalla;;Australia;5;33-01S;137-31E;;;13;15;P 94;665;----;Maitland;;Australia;5;34-22S;137-40E;;;186;186;P 94;666;----;Port Augusta;;Australia;5;32-32S;137-46E;;;4;8;P 94;667;----;Kadina P O;;Australia;5;33-58S;137-43E;;;44;; 94;668;----;Kimba;;Australia;5;33-09S;136-25E;;;263;; 94;669;----;Port Pirie;;Australia;5;33-11S;138-01E;;;3;; 94;670;----;Snowtown;;Australia;5;33-47S;138-13E;;;103;103;P 94;671;----;Virginia 3 ;;Australia;5;34-39S;138-32E;;;12;; 94;672;YPAD;Adelaide Airport;;Australia;5;34-56S;138-31E;34-56S;138-31E;6;4;P 94;673;----;Hawker;;Australia;5;31-52S;138-24E;;;315;316;P 94;674;YPLC;Leigh Creek Airport;;Australia;5;30-35S;138-25E;;;261;259; 94;675;----;Adelaide;;Australia;5;34-55S;138-37E;;;47;50;P 94;676;----;Arkaroola;;Australia;5;30-18S;139-20E;;;340;340; 94;677;----;Goolwa Marina ;;Australia;5;35-31S;138-48E;;;3;; 94;678;----;Williamstown Mount Crawford Aws;;Australia;5;34-44S;138-56E;;;515;; 94;679;----;Yongala;;Australia;5;33-01S;138-42E;;;515;; 94;680;----;Eudunda;;Australia;5;34-10S;139-05E;;;415;416;P 94;681;----;Nuriootpa;;Australia;5;34-28S;139-00E;;;274;; 94;682;----;Loxton;;Australia;5;34-26S;140-35E;;;30;; 94;684;----;Yunta;;Australia;5;32-34S;139-33E;;;303;; 94;685;----;Cadell;;Australia;5;34-03S;139-45E;;;16;; 94;686;----;Kirra;;Australia;5;35-46S;140-53E;;;155;; 94;687;----;Renmark;;Australia;5;34-10S;140-45E;;;20;21;P 94;688;----;Lameroo;;Australia;5;35-20S;140-31E;;;99;100;P 94;689;YPBH;Broken Hill Patton Street;;Australia;5;31-58S;141-28E;;;315;;P 94;691;----;Broken Hill Aws;;Australia;5;32-00S;141-28E;;;281;282; 94;693;YMMI;Mildura Airport;;Australia;5;34-13S;142-05E;34-14S;142-05E;50;52;P 94;694;----;Menindee;;Australia;5;32-24S;142-25E;;;61;; 94;695;----;Wilcannia;;Australia;5;31-33S;143-22E;;;76;;P 94;696;----;Balranald;;Australia;5;34-38S;143-33E;;;61;; 94;697;----;Ivanhoe Post Office ;;Australia;5;32-54S;144-17E;;;85;86; 94;698;----;Hay Miller Street;;Australia;5;34-31S;144-51E;;;93;94;P 94;699;----;White Cliffs;;Australia;5;30-51S;143-05E;;;151;151; 94;700;----;Hillston Airport;;Australia;5;33-29S;145-31E;33-29S;145-31E;123;120;P 94;701;----;Hay Aws;;Australia;5;34-32S;144-52E;;;90;; 94;703;----;Bourke Post Office ;;Australia;5;30-05S;145-56E;;;106;;P 94;705;----;Griffith Aws;;Australia;5;34-19S;146-04E;34-33S;146-24E;125;137; 94;706;----;Narrandera;;Australia;5;34-44S;146-33E;;;173;174;P 94;707;----;Condoblin;;Australia;5;33-05S;147-09E;;;199;; 94;708;----;Nyngan;;Australia;5;31-33S;147-11E;;;173;; 94;709;----;Wyalong;;Australia;5;33-55S;147-14E;;;245;; 94;710;----;Cobar Airport Aws;;Australia;5;31-33S;145-48E;;;217;218; 94;711;----;Cobar;;Australia;5;31-29S;145-49E;31-29S;145-49E;264;265;P 94;712;----;Young Aws;;Australia;5;34-15S;148-14E;;;380;381; 94;713;----;Forbes Camp Street;;Australia;5;33-23S;148-00E;;;240;;P 94;714;----;Cootamundra;;Australia;5;34-38S;148-01E;;;318;; 94;715;----;Walgett;;Australia;5;30-01S;148-07E;;;133;; 94;716;----;Goulburn;;Australia;5;34-43S;149-44E;;;650;; 94;717;----;Parkes Macarthur Street;;Australia;5;33-08S;148-09E;33-08S;148-10E;324;324;P 94;718;----;Coonamble;;Australia;5;30-57S;148-23E;;;180;; 94;719;YSDU;Dubbo;;Australia;5;32-12S;148-34E;32-12S;148-34E;275;275;P 94;720;----;Cowra Airport;;Australia;5;33-50S;148-38E;;;294;; 94;721;----;Peak Hill;;Australia;5;32-43S;148-11E;;;267;; 94;723;----;Wellington;;Australia;5;32-33S;148-56E;;;304;; 94;726;----;Orange Airport;;Australia;5;33-23S;149-07E;;;949;951;P 94;727;----;Mudgee Aws;;Australia;5;32-33S;149-36E;;;471;; 94;728;----;Coonabarabran Namoi Street;;Australia;5;31-16S;149-16E;;;505;510;P 94;729;----;Bathurst Airport Aws;;Australia;5;33-24S;149-39E;;;742;745; 94;730;----;Bathurst Agricult. Res Station;;Australia;5;33-26S;149-34E;;;713;; 94;731;----;Mudgee;;Australia;5;32-35S;149-35E;;;454;; 94;732;----;Frogmore;;Australia;5;34-16S;148-50E;;;500;; 94;733;----;Singleton Water Board ;;Australia;5;32-34S;151-09E;;;40;; 94;734;----;Narrabri West;;Australia;5;30-20S;149-45E;;;212;; 94;735;----;Taralga Post Office ;;Australia;5;34-24S;149-49E;;;845;; 94;739;----;Jerrys Plains;;Australia;5;32-29S;150-54E;;;90;; 94;741;----;Lithgow;;Australia;5;33-29S;150-08E;;;950;; 94;742;----;Gunnedah;;Australia;5;30-59S;150-15E;;;306;; 94;743;----;Mount Boyce Aws;;Australia;5;33-37S;150-16E;;;1080;1080; 94;744;----;Katoomba;;Australia;5;33-43S;150-17E;;;1030;; 94;747;----;Bowral;;Australia;5;34-29S;150-24E;;;690;; 94;748;----;Wollongong;;Australia;5;34-24S;150-53E;;;30;;P 94;749;----;Bellambi Aws;;Australia;5;34-23S;150-56E;;;10;; 94;750;YSNW;Nowra Ran Air Station;;Australia;5;34-57S;150-32E;34-57S;150-32E;122;110;P 94;752;----;Badgery's Creek Airport;;Australia;5;33-53S;150-42E;;;81;82; 94;753;YSRI;Richmond Aus-Afb ;;Australia;5;33-36S;150-47E;;;21;; 94;754;----;Nullo Mountains Aws;;Australia;5;32-43S;150-14E;;;1080;; 94;755;YSCN;Camden Airport;;Australia;5;34-02S;150-41E;;;70;; 94;756;----;Murrurundi;;Australia;5;31-46S;150-50E;;;466;467; 94;758;----;Scone;;Australia;5;32-03S;150-52E;32-03S;150-52E;208;208; 94;761;----;Barraba;;Australia;5;30-22S;150-36E;;;500;; 94;762;YSTW;Tamworth Airport;;Australia;5;31-05S;150-50E;;;410;; 94;763;----;Penrith;;Australia;5;33-43S;150-40E;;;25;; 94;764;----;Parramatta North;;Australia;5;33-48S;151-01E;;;55;; 94;765;YSBK;Bankstown Airport Aws;;Australia;5;33-55S;150-59E;;;9;8; 94;766;----;Canterbury;;Australia;5;33-54S;151-06E;;;3;; 94;767;YSSY;Sydney Airport;;Australia;5;33-57S;151-11E;33-57S;151-11E;6;3;P 94;768;----;Sydney Regional Office;;Australia;5;33-51S;151-12E;;;39;40;P 94;769;----;Fort Denison Aws;;Australia;5;33-51S;151-13E;;;2;; 94;770;----;Norah Head;;Australia;5;33-17S;151-34E;;;27;24;P 94;771;----;Cessnock;;Australia;5;32-48S;151-20E;;;62;; 94;773;----;Armidale;;Australia;5;30-31S;151-39E;;;980;; 94;774;----;Newcastle;;Australia;5;32-55S;151-47E;;;33;; 94;775;----;Paterson;;Australia;5;32-37S;151-35E;;;30;; 94;776;YSWM;Williamtown Aerodrome;;Australia;5;32-47S;151-49E;32-47S;151-49E;9;8;P 94;778;----;Glen Innes;;Australia;5;29-44S;151-44E;;;1062;; 94;784;----;Taree;;Australia;5;31-54S;152-29E;;;6;6;P 94;786;----;Port Macquarie Airport;;Australia;5;31-26S;152-51E;;;4;5; 94;787;----;Port Macquarie;;Australia;5;31-26S;152-55E;;;7;10;P 94;788;----;Kempsey;;Australia;5;31-03S;152-49E;;;10;; 94;790;----;Smoky Cape Lighthouse Sw Rocks;;Australia;5;30-55S;153-05E;30-55S;153-05E;117;114;P 94;791;YSCH;Coffs Harbour Mo;;Australia;5;30-19S;153-07E;30-19S;153-07E;5;6;P 94;802;YPAL;Albany Airport;;Australia;5;34-56S;117-48E;34-56S;117-48E;71;69;P 94;803;----;Gosse Allandale;;Australia;5;35-46S;137-01E;;;232;; 94;804;----;Neptune Island;;Australia;5;35-20S;136-07E;;;32;37;P 94;805;----;Cape Borda;;Australia;5;35-45S;136-35E;35-45S;136-35E;143;144;P 94;806;----;Mount Barker Post Office ;;Australia;5;35-04S;138-51E;;;325;; 94;807;----;Kingscote;;Australia;5;35-39S;137-38E;;;20;; 94;809;----;Edithburgh Aws;;Australia;5;35-06S;137-44E;;;6;; 94;810;----;Strathalbyn Post Office ;;Australia;5;35-15S;138-53E;;;70;; 94;811;----;Parawa Second Valley Forest Aws;;Australia;5;35-34S;138-17E;;;341;342; 94;812;----;Robe Post Office ;;Australia;5;37-10S;139-45E;;;3;4;P 94;813;----;Cape Jaffa Aws;;Australia;5;36-58S;139-43E;;;17;18; 94;815;----;Victor Harbour P. O ;;Australia;5;35-33S;138-37E;;;5;;P 94;816;----;Keith Post Office ;;Australia;5;36-05S;140-21E;;;29;31;P 94;818;----;Cape Northumberland;;Australia;5;38-03S;140-40E;;;5;6;P 94;819;----;Naracoorte;;Australia;5;36-57S;140-44E;;;58;; 94;820;----;Mount Burr;;Australia;5;37-33S;140-25E;37-33S;140-25E;64;64; 94;821;YMMG;Mount Gambier Aerodrome;;Australia;5;37-44S;140-47E;37-44S;140-47E;65;69;P 94;822;----;Cape Willoughby;;Australia;5;35-50S;138-08E;;;55;59;P 94;824;----;Heywood;;Australia;5;38-08S;141-38E;;;27;; 94;825;----;Casterton;;Australia;5;37-36S;141-25E;;;73;; 94;826;----;Cape Nelson;;Australia;5;38-26S;141-33E;;;45;47;P 94;827;----;Nhill Composite;;Australia;5;36-20S;141-38E;;;133;133;P 94;828;----;Portland Airport;;Australia;5;38-19S;141-28E;;;81;; 94;829;----;Hamilton Airport;;Australia;5;37-38S;142-03E;;;245;242;P 94;830;----;Port Fairy Aws;;Australia;5;38-24S;142-14E;;;10;10; 94;831;----;Ouyen;;Australia;5;35-04S;142-19E;;;50;; 94;832;----;Warrnambool Airport;;Australia;5;38-17S;142-26E;;;74;76;P 94;833;----;Stawell;;Australia;5;37-03S;142-46E;;;203;; 94;834;----;Ararat;;Australia;5;37-17S;142-59E;;;295;296;P 94;835;----;Lookout Hill Aws;;Australia;5;37-17S;143-15E;;;965;; 94;840;----;Mortlake Aws;;Australia;5;38-04S;142-46E;;;130;131; 94;841;----;Warracknabeal;;Australia;5;36-15S;142-24E;;;113;; 94;842;----;Cape Otway;;Australia;5;38-51S;143-30E;;;82;83;P 94;843;----;Swan Hill;;Australia;5;35-21S;143-34E;;;70;73;P 94;844;----;Kerang;;Australia;5;35-44S;143-55E;;;78;; 94;845;----;Elliminyt;;Australia;5;38-23S;143-36E;;;248;; 94;846;----;Aireys Inlet Aws;;Australia;5;38-27S;144-06E;;;95;; 94;847;----;Point Wilson Aws;;Australia;5;38-06S;144-32E;;;18;; 94;849;----;Maryborough;;Australia;5;37-03S;143-44E;;;249;; 94;850;----;King Island Airport;;Australia;5;39-52S;143-52E;;;40;38; 94;851;----;King Island Currie;;Australia;5;39-56S;143-51E;;;24;24;P 94;852;----;Ballarat;;Australia;5;37-31S;143-46E;;;441;442; 94;853;----;South Channel Island;;Australia;5;38-18S;144-48E;;;5;; 94;854;----;Avalon Aws;;Australia;5;38-02S;144-28E;;;11;9; 94;855;----;Bendigo Airport Aws;;Australia;5;36-44S;144-19E;;;215;209;P 94;856;----;Geelong;;Australia;5;38-05S;144-20E;;;55;; 94;857;----;Geelong Airport Aws;;Australia;5;38-14S;144-20E;;;43;44; 94;858;----;West Channel Aws;;Australia;5;38-12S;144-45E;;;0;; 94;859;----;Redesdale Aws;;Australia;5;37-01S;144-31E;;;290;; 94;860;----;Kilmore Gap Aws;;Australia;5;37-23S;144-58E;;;528;528; 94;861;----;Echuca;;Australia;5;36-09S;144-45E;;;96;97;P 94;862;----;Yarrawonga;;Australia;5;36-01S;145-59E;;;125;; 94;863;----;Sheoaks Aws;;Australia;5;37-54S;144-07E;;;237;237; 94;864;YMEN;Goldstream Aws;;Australia;5;37-44S;145-24E;;;76;84; 94;865;YMLV;Laverton Aerodrome;;Australia;5;37-51S;144-44E;37-52S;144-45E;18;21;P 94;866;YMML;Melbourne Airport;;Australia;5;37-40S;144-50E;37-44S;144-50E;132;141;P 94;867;----;Training Annex;;Australia;5;37-41S;144-57E;37-41S;144-57E;132;110; 94;868;----;Melbourne;;Australia;5;37-49S;144-58E;;;35;113;P 94;869;----;Deniliquin;;Australia;5;35-33S;144-56E;;;93;93;P 94;870;YMMB;Moorabbin Airport Aws;;Australia;5;37-58S;145-06E;;;13;13;P 94;871;----;Frankston Aws;;Australia;5;38-09S;145-07E;;;6;; 94;872;----;Dunns Hill Aws;;Australia;5;37-53S;145-20E;;;561;; 94;873;----;Melbourne Harbour Contro Aws;;Australia;5;37-49S;144-56E;;;40;; 94;874;----;Mangalore Airport;;Australia;5;36-53S;145-11E;;;142;142;P 94;876;----;Finley Aws;;Australia;5;35-43S;145-37E;;;110;; 94;877;----;Tocumwal Airport;;Australia;5;35-48S;145-35E;;;114;; 94;878;----;Hunters Hill Aws;;Australia;5;36-13S;147-32E;;;981;; 94;880;----;Noojee Slivar;;Australia;5;37-54S;145-58E;;;270;; 94;881;----;Rubicon;;Australia;5;37-17S;145-49E;;;838;; 94;882;----;Lake Eildon;;Australia;5;37-14S;145-55E;;;262;; 94;884;----;Benalla;;Australia;5;36-33S;145-59E;;;169;170;P 94;889;----;Wangaratta Aerodrome;;Australia;5;36-25S;146-18E;;;154;153; 94;890;----;Gundagai;;Australia;5;35-02S;148-06E;;;250;; 94;891;----;Latrobe Valley Airport;;Australia;5;38-12S;146-28E;;;56;; 94;892;----;Rhyll Aws ;;Australia;5;38-27S;145-18E;;;13;14; 94;893;----;Wilsons Promontory Light;;Australia;5;39-07S;146-25E;;;89;97;P 94;894;----;Mount Buller;;Australia;5;37-09S;146-26E;;;1707;; 94;895;----;Beechworth;;Australia;5;36-19S;146-40E;;;330;; 94;896;YMAY;Albury Airport;;Australia;5;36-04S;146-57E;;;165;171; 94;898;----;Cerberus Aws;;Australia;5;38-21S;145-10E;;;13;14; 94;899;----;Corryong;;Australia;5;36-12S;147-53E;;;314;; 94;901;----;Hume Reservoir;;Australia;5;36-06S;147-01E;;;184;;P 94;903;----;Falls Creek Aws;;Australia;5;36-52S;147-16E;;;1767;; 94;904;----;Mount Beauty;;Australia;5;36-45S;147-10E;;;366;; 94;906;----;Mount Hotham Aws;;Australia;5;36-58S;147-07E;;;1849;; 94;907;YMES;East Sale Aerodrome;;Australia;5;38-06S;147-08E;38-06S;147-08E;5;8;P 94;910;YSWG;Wagga Airport;;Australia;5;35-09S;147-27E;35-09S;147-27E;221;213;P 94;911;----;Omeo;;Australia;5;37-05S;147-36E;;;677;679;P 94;912;----;Bairnsdale Airport;;Australia;5;37-53S;147-33E;;;50;; 94;913;----;Gelantipy Aws;;Australia;5;37-13S;148-16E;;;760;; 94;914;----;Combienbar Aws;;Australia;5;37-20S;149-01E;;;640;641; 94;915;----;Perisher Valley;;Australia;5;36-24S;148-24E;;;1735;; 94;916;----;Cabramurra;;Australia;5;35-56S;148-23E;;;1475;; 94;917;----;Orbost;;Australia;5;37-41S;148-27E;;;41;42;P 94;918;----;Tumbarumba;;Australia;5;35-46S;148-00E;;;645;; 94;921;----;Cooma Airport Aws;;Australia;5;36-18S;148-58E;;;947;931; 94;922;----;Tindbinbilla Nature Res;;Australia;5;35-27S;148-56E;35-27N;148-56E;743;743; 94;923;YSCM;Cooma;;Australia;5;36-14S;149-05E;;;778;; 94;926;YSCB;Canberra;;Australia;5;35-18S;149-11E;35-18S;149-11E;575;580;P 94;927;----;Braidwood;;Australia;5;32-25S;149-47E;;;665;666; 94;928;----;Bombala;;Australia;5;36-55S;149-14E;;;705;; 94;929;----;Bombala Aws;;Australia;5;37-00S;149-13E;;;761;762; 94;931;----;Bega;;Australia;5;36-40S;149-49E;;;11;; 94;932;----;Point Hicks;;Australia;5;37-48S;149-16E;;;24;; 94;933;----;Gabo Island;;Australia;5;37-34S;149-54E;;;15;15;P 94;934;----;Green Cape Aws;;Australia;5;37-15S;150-02E;;;19;20; 94;935;----;Mallacoota Aws;;Australia;5;37-36S;149-44E;;;22;23; 94;937;----;Moruya Heads;;Australia;5;35-54S;150-09E;;;17;17;P 94;938;----;Ulladulla Aws;;Australia;5;35-21S;150-29E;;;36;37; 94;939;----;Montague Island Lighthou;;Australia;5;36-15S;150-13E;;;52;54; 94;940;----;Jervis Bay;;Australia;5;35-05S;150-48E;;;85;83;P 94;941;----;Batemans Bay;;Australia;5;35-44S;150-11E;;;15;; 94;949;----;Hogan Island Aws;;Australia;5;39-13S;146-59E;;;117;; 94;950;----;Marrawah;;Australia;5;40-54S;144-42E;;;107;108;P 94;951;----;Erriba;;Australia;5;41-26S;146-06E;;;590;; 94;952;----;Smithton;;Australia;5;40-50S;145-06E;;;8;8;P 94;953;----;Strahan;;Australia;5;42-09S;145-19E;;;8;; 94;954;----;Cape Grim B. A. P. S.*;;Australia;5;40-40S;144-41E;;;94;93; 94;955;----;Hellyer Mine;;Australia;5;41-34S;145-43E;;;684;; 94;956;----;Strahan Airport Aws;;Australia;5;42-09S;145-17E;;;20;22;P 94;957;YMWY;Wynyard West;;Australia;5;40-59S;145-43E;;;11;; 94;958;----;Burnie;;Australia;5;41-04S;145-56E;;;10;;P 94;959;----;Adamsons Peak Aws;;Australia;5;43-21S;146-48E;;;1070;; 94;960;YMDV;Devonport East;;Australia;5;41-10S;146-22E;;;47;; 94;961;----;Dover;;Australia;5;43-18S;147-01E;;;16;; 94;962;----;Maatsuyker Island;;Australia;5;43-39S;146-16E;;;147;148;P 94;963;----;Maydena Post Office;;Australia;5;42-45S;146-37E;;;275;; 94;964;----;Bushy Park;;Australia;5;42-42S;146-53E;;;35;; 94;965;----;Low Head;;Australia;5;41-03S;146-48E;;;28;30;P 94;966;----;Geeveston Forestry ;;Australia;5;43-10S;146-55E;;;60;; 94;967;----;Cape Bruny;;Australia;5;43-30S;147-09E;;;55;53;P 94;968;YMLT;Launceston Airport;;Australia;5;41-32S;147-12E;41-32S;147-12E;171;178;P 94;969;----;Launceston;;Australia;5;41-25S;147-07E;;;5;; 94;970;----;Hobart Regional Office ;;Australia;5;42-53S;147-19E;42-53S;147-20E;51;57;P 94;971;----;Melton Mowbray Lovely Banks;;Australia;5;42-26S;147-13E;;;270;; 94;972;----;Scottsdale No. 2 ;;Australia;5;41-11S;147-30E;;;190;; 94;973;----;Moogara;;Australia;5;42-47S;146-54E;;;530;; 94;974;----;Cape Sorell Aws;;Australia;5;42-12S;145-10E;;;19;20; 94;975;YMHB;Hobart Airport;;Australia;5;42-50S;147-29E;42-50S;147-30E;4;27;P 94;976;----;Lake Saint Clair National Park ;;Australia;5;42-07S;146-10E;;;750;; 94;977;----;Hartz Mountains;;Australia;5;43-12S;146-46E;;;830;; 94;978;----;Palmers Lookout;;Australia;5;43-10S;147-50E;;;192;193; 94;979;----;Lake Leake;;Australia;5;42-00S;147-47E;;;580;; 94;980;----;Flinders Island Airport;;Australia;5;40-05S;148-00E;;;10;10;P 94;981;----;Swansea;;Australia;5;42-07S;148-04E;;;7;8;P 94;982;----;St Helens;;Australia;5;41-19S;148-14E;;;5;; 94;983;----;Eddystone Point Lighthouse;;Australia;5;40-59S;148-20E;;;13;14;P 94;984;----;Whitemark;;Australia;5;40-07S;148-01E;;;6;; 94;985;----;Ross Waterloo Street;;Australia;5;42-01S;147-30E;;;195;; 94;995;----;Lord Howe Island;;Australia;5;31-32S;159-04E;31-31S;159-05E;5;7;P 94;996;YSNF;Norfolk Island Airport;;Australia;5;29-02S;167-56E;29-02S;167-56E;113;109;P 94;997;----;Heard Island The Spit ;;Australia;5;53-06S;073-43E;;;12;13; 94;998;YMMQ;Macquarie Island;;Australia;5;54-29S;158-57E;54-29S;158-56E;6;8;P 95;205;----;Derby Aerodrome Aws;;Australia;5;17-22S;123-40E;;;7;7; 95;287;----;Norman Reef Cairns;;Australia;5;16-26S;145-59E;;;2;; 95;288;----;Bougainville Reef Aws;;Australia;5;15-30S;147-07E;;;2;6; 95;289;----;Green Island Aws;;Australia;5;16-46S;145-58E;;;3;3; 95;290;----;Moore Reef Cairns;;Australia;5;16-51S;146-14E;;;2;; 95;291;----;Ingham Composite;;Australia;5;18-38S;146-10E;;;16;; 95;295;----;Ayr Dpi Research Station;;Australia;5;19-37S;146-23E;;;12;; 95;297;----;Hook Reef Aws;;Australia;5;19-44S;149-10E;;;1;3; 95;307;----;Karratha Aerodrome Aws;;Australia;5;20-43S;116-46E;;;9;9; 95;308;----;Karratha King Bay;;Australia;5;20-37S;116-45E;20-37S;116-45E;48;55; 95;310;----;Paraburdoo;;Australia;5;23-12S;117-40E;;;391;391; 95;314;----;Newman;;Australia;5;23-21S;119-43E;;;544;545;P 95;315;----;Mount Phillip Mount Phillip ;;Australia;5;24-24S;116-18E;;;300;; 95;362;----;Springsure Post Office ;;Australia;5;24-07S;148-05E;;;326;; 95;367;----;Mackay Airport;;Australia;5;21-10S;149-10E;;;6;6; 95;400;----;Three Rivers;;Australia;5;25-07S;119-08E;;;520;522;P 95;448;----;Leonora Leinster Aerodrome Aws;;Australia;5;27-51S;120-42E;;;497;498; 95;458;----;Coober Pedy Aws;;Australia;5;29-02S;134-43E;;;226;226; 95;481;----;Moomba Airport;;Australia;5;28-06S;140-11E;;;44;38; 95;512;----;Brewarrina Hospital;;Australia;5;29-57S;146-51E;;;115;; 95;520;----;Collarenbri;;Australia;5;29-32S;148-34E;;;145;; 95;527;----;Moree Mo;;Australia;5;29-29S;149-50E;29-30S;149-50E;214;219; 95;533;----;Texas Post Office ;;Australia;5;28-51S;151-10E;;;284;; 95;541;----;Inverell Raglan St;;Australia;5;29-47S;151-07E;;;582;588; 95;555;----;Warwick;;Australia;5;28-13S;152-01E;;;477;; 95;572;----;Nambour;;Australia;5;26-38S;152-56E;;;25;; 95;573;----;Inglewood Forestry;;Australia;5;28-25S;151-05E;;;280;; 95;574;----;Tewantin;;Australia;5;26-23S;153-02E;;;8;10;P 95;581;----;Longan City;;Australia;5;27-42S;153-11E;;;10;; 95;590;----;Redcliffe Ses;;Australia;5;27-13S;153-06E;;;25;; 95;591;----;Ipswich Composite ;;Australia;5;27-37S;152-45E;;;40;; 95;600;----;Jurien;;Australia;5;30-18S;115-02E;;;3;4;P 95;604;----;Gosnells City;;Australia;5;32-03S;115-59E;;;10;; 95;605;----;Fremantle East Fremantle;;Australia;5;32-03S;115-46E;32-03S;115-46E;15;15; 95;606;----;Lancelin;;Australia;5;31-01S;115-19E;;;4;5;P 95;607;----;Ludlow;;Australia;5;33-36S;115-28E;;;15;; 95;608;----;Kwinana Medina Research Centre;;Australia;5;33-41S;115-48E;;;14;; 95;610;----;Kalamunda Bicley;;Australia;5;32-01S;116-08E;32-01S;116-08E;384;385; 95;611;----;Mettler;;Australia;5;34-36S;118-32E;;;107;; 95;613;----;Pemberton;;Australia;5;34-27S;116-02E;;;174;175;P 95;614;----;Karnet;;Australia;5;32-26S;116-04E;;;286;; 95;618;----;Wagin;;Australia;5;33-18S;117-19E;;;256;; 95;619;----;Ongerup Nalyerlup;;Australia;5;34-11S;118-29E;;;250;; 95;624;----;Merredin;;Australia;5;31-28S;118-16E;;;315;; 95;626;----;Narembeen;;Australia;5;32-04S;118-24E;;;276;; 95;627;----;Hyden;;Australia;5;32-28S;118-53E;;;299;; 95;628;----;Ongerup;;Australia;5;33-57S;118-29E;;;286;288;P 95;636;----;Jerramungup Jacup Aws;;Australia;5;33-53S;119-06E;;;305;306; 95;638;----;Esperance Aerodrome Aws;;Australia;5;33-41S;121-49E;;;143;142; 95;645;----;Melaleuca;;Australia;5;33-36S;120-45E;;;230;; 95;646;----;Forrest Aws;;Australia;5;30-50S;128-07E;;;156;160; 95;655;----;Nonning;;Australia;5;32-31S;136-29E;;;205;; 95;659;----;Roxby Downs;;Australia;5;30-27S;136-52E;;;98;105; 95;660;----;Andamooka;;Australia;5;30-27S;137-10E;;;76;; 95;661;----;Port Lincoln Aerodrome Aws;;Australia;5;34-36S;135-52E;;;6;6; 95;664;----;Whyalla Airport Aws ;;Australia;5;33-04S;137-31E;;;13;7; 95;666;----;Port Augusta Aws;;Australia;5;32-29S;137-44E;;;19;19; 95;667;----;Clare High School;;Australia;5;33-49S;138-36E;;;395;396; 95;676;YPED;Edinburgh M. O.;;Australia;5;34-42S;138-37E;;;20;20;P 95;677;YPPF;Parafield Airport;;Australia;5;34-47S;138-38E;;;17;10;P 95;678;----;Mount Lofty Aws;;Australia;5;34-58S;138-42E;;;730;; 95;687;----;Renmark Aerodrome;;Australia;5;34-12S;140-40E;;;35;32; 95;703;----;Bourke Airport;;Australia;5;30-02S;145-57E;;;107;108; 95;704;----;Griffith Airport;;Australia;5;34-15S;146-04E;;;135;; 95;706;----;Narrandera Airport;;Australia;5;34-42S;146-30E;;;145;; 95;707;----;Lake Cargelligo Airport;;Australia;5;33-17S;146-22E;;;169;; 95;708;----;Condobolin Airport Aws;;Australia;5;33-04S;147-13E;;;199;194; 95;715;----;Walgett Airport;;Australia;5;30-02S;148-07E;;;134;134; 95;716;----;Goulburn Airport Aws;;Australia;5;34-48S;149-43E;;;652;; 95;719;----;Dubbo Airport Aws;;Australia;5;32-13S;148-35E;;;285;285; 95;723;----;Yass;;Australia;5;34-51S;148-54E;;;500;; 95;727;----;Dunedoo;;Australia;5;32-01S;149-23E;;;388;; 95;735;----;Oberon;;Australia;5;33-44S;149-52E;;;1190;; 95;746;----;Quirindi;;Australia;5;31-30S;150-40E;;;390;; 95;750;----;Liverpool;;Australia;5;33-55S;150-55E;;;21;; 95;753;----;Richmond Amo Aws;;Australia;5;33-36S;150-47E;;;21;20; 95;758;----;Scone Airport Aws;;Australia;5;32-02S;150-50E;;;227;; 95;762;----;Tamworth Airport Aws;;Australia;5;31-04S;150-50E;;;407;396; 95;764;----;Riverview Observatory;;Australia;5;33-50S;151-09E;;;40;; 95;765;----;Homebush;;Australia;5;33-51S;151-03E;;;28;; 95;768;----;Maryville;;Australia;5;32-55S;151-45E;;;8;; 95;770;----;Norah Head Lighthouse;;Australia;5;33-16S;151-34E;;;19;20; 95;771;----;Cessnock Airport Aws;;Australia;5;32-48S;151-20E;;;64;62; 95;773;----;Armidale Airport Aws;;Australia;5;30-32S;151-37E;;;1084;1081; 95;774;----;Mangrove Mountain Aws Bloodtree Road;;Australia;5;33-17S;151-13E;;;305;; 95;807;----;Cygnet River Kingstone Aerodrome Aws;;Australia;5;35-43S;137-31E;;;8;6; 95;812;----;Murray Bridge;;Australia;5;35-07S;139-16E;;;15;; 95;814;----;Meningie;;Australia;5;35-41S;139-20E;;;3;; 95;817;----;Penola;;Australia;5;37-29S;140-49E;;;65;; 95;834;----;Horsham Composite ;;Australia;5;36-39S;142-06E;;;141;; 95;842;----;Donald;;Australia;5;36-23S;143-00E;;;118;; 95;853;----;Castlemaine;;Australia;5;37-04S;144-14E;;;325;; 95;855;----;Weeaproinah;;Australia;5;38-38S;143-31E;;;492;; 95;871;----;Lemnos;;Australia;5;36-22S;145-28E;;;113;; 95;872;----;Fawkner Beacon Aws;;Australia;5;37-57S;144-55E;;;10;; 95;876;----;Tarrawarra;;Australia;5;37-39S;145-26E;;;100;; 95;881;----;Wonthaggi Composite;;Australia;5;38-36S;145-35E;;;52;42;P 95;884;----;Olsens Bridge;;Australia;5;38-29S;146-19E;;;183;;P 95;896;----;Albury Aeroport Aws;;Australia;5;36-04S;146-57E;;;165;165; 95;904;----;Lakes Entrance Composite;;Australia;5;37-52S;147-59E;;;36;; 95;906;----;Adelong;;Australia;5;35-19S;148-04E;;;333;; 95;907;----;Khancoban;;Australia;5;36-13S;148-08E;;;337;; 95;908;----;Thredbo;;Australia;5;36-30S;148-18E;;;1380;; 95;909;----;Crackenback;;Australia;5;36-29S;148-17E;;;1957;; 95;912;----;Charlotte Pass Kosciusko Chalet;;Australia;5;36-26S;148-20E;;;1755;; 95;913;----;Mount Moornapa Aws;;Australia;5;37-45S;147-08E;;;486;; 95;930;----;Merimbula Airport;;Australia;5;36-54S;149-54E;;;2;; 95;931;----;Bega Aws;;Australia;5;36-40S;149-49E;;;41;42; 95;935;----;Narooma Vrcp;;Australia;5;36-13S;150-08E;;;25;; 95;936;----;Green Cape Light House ;;Australia;5;37-15S;150-03E;;;18;; 95;950;----;Waratah;;Australia;5;41-27S;145-31E;;;615;; 95;951;----;Qeenstown;;Australia;5;42-04S;145-34E;;;187;; 95;953;----;Strathgordon;;Australia;5;42-46S;146-03E;;;320;; 95;954;----;Rosebery Station;;Australia;5;41-47S;145-31E;;;155;; 95;955;----;Liawenee;;Australia;5;41-53S;146-40E;;;1060;; 95;957;----;Wynyard Airport Aws;;Australia;5;40-59S;145-43E;;;19;12; 95;960;----;Devonport Airport Aws;;Australia;5;41-10S;146-25E;;;10;10; 95;961;----;Low Rocky Point Aws ;;Australia;5;42-59S;145-30E;;;34;35; 95;965;----;Deal Island;;Australia;5;39-28S;147-18E;;;85;77; 95;968;----;Powranna;;Australia;5;41-41S;147-17E;;;163;; 95;969;----;Liapootah;;Australia;5;42-23S;146-31E;;;238;; 95;970;----;Tarraleah;;Australia;5;42-18S;146-26E;;;589;; 95;972;----;Palmerston;;Australia;5;41-47S;146-59E;;;180;; 95;973;----;Bridport Emma St;;Australia;5;41-01S;147-24E;;;25;; 95;974;----;Fingal;;Australia;5;41-38S;147-58E;;;233;; 95;975;----;Bull Bay;;Australia;5;43-06S;147-22E;;;40;; 95;978;----;Flinders Island Lady Barron Aerodrome;;Australia;5;40-12S;148-14E;;;12;11; 95;979;----;Mount Wellington;;Australia;5;42-53S;147-14E;;;1261;; 95;980;----;Swan Island;;Australia;5;40-44S;148-07E;;;9;; 95;982;----;Storys Creek Aws;;Australia;5;41-37S;147-44E;;;779;781; 95;984;----;Orford;;Australia;5;42-33S;147-52E;;;15;; 95;989;----;Bicheno;;Australia;5;41-52S;148-18E;;;10;; 96;001;WIAA;Sabang / Cut Bau;;Indonesia;5;05-52N;095-19E;05-52N;095-19E;126;126;P 96;009;WITM;Lhokseumawe / Malikussaleh;;Indonesia;5;05-14N;097-12E;05-14N;097-12E;87;87;P 96;011;WITT;Banda Aceh / Blangbintang;;Indonesia;5;05-31N;095-25E;05-31N;095-25E;21;21;P 96;015;WITC;Meulaboh / Cut Nyak Dhien;;Indonesia;5;04-15N;096-07E;04-15N;096-07E;90;90; 96;033;----;Belawan;;Indonesia;5;03-48N;098-42E;;;3;3;P 96;035;WIMM;Medan / Polonia;;Indonesia;5;03-34N;098-41E;03-34N;098-40E;25;25;P 96;039;----;Tebingtinggi;;Indonesia;5;03-22N;099-07E;;;;; 96;043;----;Kisaran;;Indonesia;5;03-00N;099-33E;;;;; 96;045;----;Tapak Tuan / Teuku Alirasian;;Indonesia;5;03-28N;097-18E;;;;; 96;055;----;Penatang Siantar;;Indonesia;5;02-57N;099-04E;;;;400; 96;059;----;Prapat / Sibisa Motung;;Indonesia;5;02-10N;098-56E;;;;1200; 96;065;----;Tarutung;;Indonesia;5;02-01N;098-57E;;;;1076; 96;073;WIMS;Sibolga / Pinangsori;;Indonesia;5;01-33N;098-53E;01-33N;098-54E;3;3;P 96;075;WIMB;Gunung Sitoli / Binaka;;Indonesia;5;01-30N;097-38E;01-30N;097-38E;6;6;P 96;087;WIKB;Batan, Sumatra;;Indonesia;5;01-07N;104-07E;;;24;; 96;091;WIKN;Tanjungpinang / Kijang;;Indonesia;5;00-55N;104-32E;00-55N;104-32E;18;18;P 96;109;WIBB;Pakanbaru / Simpangtiga;;Indonesia;5;00-28N;101-27E;00-28N;101-27E;31;31;P 96;145;----;Tarempa;;Indonesia;5;03-12N;106-15E;03-12N;106-15E;3;3;P 96;147;WION;Ranai / Ranai;;Indonesia;5;03-57N;108-23E;03-55N;108-23E;2;2;P 96;163;WIMG;Padang / Tabing;;Indonesia;5;00-53S;100-21E;00-53S;100-21E;3;3;P 96;171;WIPR;Rengat / Japura;;Indonesia;5;00-28N;102-19E;00-21S;102-20E;46;46;P 96;179;WIKS;Singkep / Dabo;;Indonesia;5;00-29S;104-35E;00-29S;104-35E;31;31;P 96;195;WIPA;Jambi / Sultan Taha;;Indonesia;5;01-38S;103-39E;01-38S;103-39E;25;25;P 96;207;WIPH;Kerinci / Depati Parbo;;Indonesia;5;02-46S;101-22E;;101-22E;782;782; 96;221;WIPP;Palembang / Talangbetutu;;Indonesia;5;02-54S;104-42E;02-54S;104-42E;10;10;P 96;237;WIKK;Pangkalpinang / Pangkalpinang;;Indonesia;5;02-10S;106-08E;02-10S;106-08E;33;33;P 96;249;WIKD;Tanjungpandan / Buluh Tumbang;;Indonesia;5;02-45S;107-45E;02-45S;107-46E;44;44;P 96;253;WIPL;Bengkulu / Padangkemiling;;Indonesia;5;03-53S;102-20E;03-52S;102-21E;16;16;P 96;273;WIAG;Menggala / Astra Ksetra;;Indonesia;5;04-27S;105-11E;04-37S;105-13E;19;19; 96;295;WIIT;Telukbetung / Beranti;;Indonesia;5;05-16S;105-11E;05-14S;105-11E;96;96;P 96;315;WBSB;Brunei Airport;;Brunei;5;04-56N;114-56E;04-56N;114-56E;22;15; 96;323;----;Kuala Belait;;Brunei;5;04-35N;114-12E;;;;3; 96;413;WBGG;Kuching;;Malaysia;5;01-29N;110-20E;01-29N;110-20E;27;27;P 96;418;----;Sri Aman / Simanggang;;Malaysia;5;01-13N;111-27E;;;11;10;P 96;421;WBGS;Sibu;;Malaysia;5;02-20N;111-50E;;;8;8;P 96;441;WBGB;Bintulu;;Malaysia;5;03-12N;113-02E;03-12N;113-02E;2;5;P 96;449;WBGR;Miri;;Malaysia;5;04-20N;113-59E;;;17;18;P 96;465;WBKL;Labuan;;Malaysia;5;05-18N;115-15E;05-17N;115-14E;30;30;P 96;471;WBKK;Kota Kinabalu;;Malaysia;5;05-56N;116-03E;05-57N;116-03E;3;3;P 96;477;WBKT;Kudat;;Malaysia;5;06-55N;116-50E;06-55N;116-50E;3;5;P 96;481;WBKW;Tawau;;Malaysia;5;04-16N;117-53E;04-16N;117-52E;18;20;P 96;491;WBKS;Sandakan;;Malaysia;5;05-54N;118-04E;05-54N;118-04E;12;13;P 96;505;WRLB;Longbawan / Juvai Semaring;;Indonesia;5;03-44N;115-41E;;;550;; 96;509;WRLR;Tarakan / Juwata;;Indonesia;5;03-20N;117-34E;03-20N;117-34E;6;6;P 96;525;WRLG;Tanjung Selor;;Indonesia;5;02-51N;117-20E;;;50;50; 96;529;WRLK;Tanjung Redep / Berau;;Indonesia;5;02-07N;117-27E;02-07N;117-27E;26;26; 96;533;WIOI;Singkawang Ii;;Indonesia;5;01-05N;109-40E;01-05N;109-40E;38;38; 96;535;----;Paloh;;Indonesia;5;01-42S;109-18E;;;15;15; 96;539;----;Long Nawan;;Indonesia;5;01-49N;114-54E;;;;600; 96;557;----;Nangapinoh;;Indonesia;5;00-21S;111-47E;;;37;37; 96;559;WIOS;Sintang;;Indonesia;5;00-07N;111-32E;;;30;30; 96;565;----;Putusibau;;Indonesia;5;00-53N;112-56E;;;;; 96;577;----;Sangkulirang;;Indonesia;5;01-00N;118-00E;;;;; 96;581;WIOO;Pontianak / Supadio;;Indonesia;5;00-09S;109-24E;00-09S;109-24E;3;3;P 96;595;WRBM;Muaratewe / Beringin;;Indonesia;5;00-57S;114-54E;00-57S;114-54E;60;60; 96;597;----;Longiram;;Indonesia;5;01-38S;114-50E;;;;; 96;607;WRLS;Samarinda / Temindung;;Indonesia;5;00-37S;117-09E;00-37S;117-09E;230;230;P 96;615;WIOK;Ketapang / Rahadi Usmaman;;Indonesia;5;01-51S;109-58E;;;9;9; 96;633;WRLL;Balikpapan / Sepinggan;;Indonesia;5;01-16S;116-54E;01-16S;116-54E;3;3;P 96;639;----;Tanahgrogot;;Indonesia;5;02-12S;116-19E;;;;; 96;645;WRBI;Pangkalan Bun / Iskandar;;Indonesia;5;02-42S;110-42E;02-42S;111-41E;25;25; 96;651;----;Sampit / Haji Hasan;;Indonesia;5;02-31S;112-57E;;;;27; 96;655;WRBP;Palangkaraya / Panarung;;Indonesia;5;01-00S;114-00E;01-00S;114-00E;27;27;P 96;685;WRBB;Banjarmasin / Syamsuddin Noor;;Indonesia;5;03-26S;114-45E;03-27S;114-46E;20;20;P 96;695;WRBK;Kotabaru;;Indonesia;5;03-24S;116-13E;;;18;18; 96;737;----;Serang;;Indonesia;5;06-07S;106-08E;06-07S;106-08E;40;40;P 96;739;WIIA;Curug / Budiarto;;Indonesia;5;06-14S;106-39E;06-17S;106-34E;46;46;P 96;741;----;Jakarta / Tanjung Priok;;Indonesia;5;06-06S;106-52E;;;2;2;P 96;745;----;Jakarta / Observatory;;Indonesia;5;06-11S;106-50E;;;8;8;P 96;747;WIIH;Jakarta Halim Perdanakusuma;;Indonesia;5;06-15S;106-54E;;;30;30;P 96;749;WIII;Jakarta / Soekarno-Hatta;;Indonesia;5;06-07S;106-39E;06-08S;106-40E;8;8; 96;751;----;Citeko / Puncak;;Indonesia;5;06-42S;106-56E;;;300;; 96;753;----;Bogor / Dermaga;;Indonesia;5;06-30S;106-45E;;;250;250; 96;755;----;Bogor / Atang Sanjaya;;Indonesia;5;06-33S;106-54E;06-33S;106-54E;171;171;P 96;757;----;Pulau Pari;;Indonesia;5;05-51S;106-37E;;;;; 96;773;WIIK;Kalijati;;Indonesia;5;06-33S;107-40E;06-33S;107-40E;110;110; 96;781;WIIB;Bandung / Husein;;Indonesia;5;06-54S;107-35E;06-54S;107-35E;740;740;P 96;783;----;Bandung;;Indonesia;5;06-53S;107-36E;;;791;791; 96;791;----;Jatiwangi;;Indonesia;5;06-45S;108-16E;06-45S;108-16E;50;50;P 96;797;----;Tegal;;Indonesia;5;06-51S;109-09E;06-51S;109-09E;10;10;P 96;801;WIAM;Tasikmalaya / Cibeureum;;Indonesia;5;07-20S;108-15E;07-21S;108-15E;335;335;P 96;805;WIIL;Cilacap;;Indonesia;5;07-44S;109-01E;07-44S;109-01E;6;6;P 96;837;----;Semarang;;Indonesia;5;06-58S;110-25E;;;3;3;P 96;839;WIIS;Semarang / Ahmadyani;;Indonesia;5;06-59S;110-23E;06-59S;110-23E;3;3;P 96;845;WRSQ;Surakarta / Adisumarmo;;Indonesia;5;07-52S;110-55E;07-31S;110-45E;104;104;P 96;853;WIIJ;Jogyakarta / Adisucipto;;Indonesia;5;07-47S;110-26E;07-47S;110-26E;107;107;P 96;857;----;Pacitan;;Indonesia;5;08-12S;111-03E;;;1;1; 96;881;WIAR;Madiun / Iswahyudi;;Indonesia;5;07-37S;111-31E;07-37S;111-26E;110;110;P 96;925;----;Sangkapura Bawean Island ;;Indonesia;5;05-51S;112-38E;05-51S;112-38E;3;3;P 96;933;WRSP;Surabaya / Perak;;Indonesia;5;07-13S;112-43E;07-13S;112-43E;3;3;P 96;935;WRSJ;Surabaya / Juanda;;Indonesia;5;07-22S;112-46E;07-23S;112-47E;3;3;P 96;937;WRSS;Surabaya;;Indonesia;5;07-13S;113-43E;;;3;3; 96;947;WIAS;Malang / Abdul Rahkmansaleh;;Indonesia;5;07-58S;112-42E;07-56S;112-43E;526;526;P 96;973;----;Kalianget Madura Island ;;Indonesia;5;07-03S;113-58E;07-03S;113-58E;3;3;P 96;987;----;Banyuwangi;;Indonesia;5;08-13S;114-23E;08-13S;114-23E;5;5;P 96;995;YPXM;Christmas Island Aerodrome;;Christmas Island;5;10-26S;105-41E;10-27S;105-42E;279;262;P 96;996;YPCC;Cocos Island Airport;;Christmas Island;5;12-11S;096-49E;12-11S;096-50E;3;3;P 97;004;----;Malanguane;;Indonesia;5;04-13N;126-42E;;;;9; 97;008;WAMH;Tahuna;;Indonesia;5;03-35N;125-28E;03-35N;125-28E;38;38; 97;010;----;Ulu Siau;;Indonesia;5;02-40N;125-20E;;;;; 97;014;WAMM;Menado / Dr. Sam Ratulangi;;Indonesia;5;01-32N;124-55E;01-33N;124-56E;80;80;P 97;016;----;Bitung;;Indonesia;5;01-26N;125-11E;;;3;3;P 97;026;----;Bolang Mongondaw;;Indonesia;5;00-59N;124-00E;;;;; 97;028;WAMI;Toli-Toli / Lalos;;Indonesia;5;01-01N;120-48E;01-01N;120-48E;2;2; 97;048;WAMG;Gorontalo / Jalaluddin;;Indonesia;5;00-31N;123-04E;00-38N;122-51E;2;2;P 97;072;WAML;Palu / Mutiara;;Indonesia;5;00-41S;119-44E;00-55S;119-54E;6;6;P 97;086;WAMW;Luwuk / Bubung;;Indonesia;5;00-54S;122-47E;00-54S;122-47E;2;2;P 97;096;WAMP;Poso / Kasiguncu;;Indonesia;5;01-23S;120-44E;01-24S;120-43E;2;2;P 97;100;----;Kolonedale;;Indonesia;5;02-00S;121-19E;;;;2; 97;114;----;Soroako / Luwu;;Indonesia;5;02-32S;121-21E;;;;; 97;120;----;Majene;;Indonesia;5;02-30S;119-00E;02-30S;119-00E;8;8; 97;126;----;Masamba;;Indonesia;5;02-33S;120-22E;;;50;50; 97;142;----;Kolaka / Poma;;Indonesia;5;04-18S;121-32E;;;;3; 97;146;WAAU;Kendari / Woltermon-Ginsidi;;Indonesia;5;04-06S;122-26E;04-05S;122-25E;50;50;P 97;180;WAAA;Ujung Pandang / Hasanuddin;;Indonesia;5;05-04S;119-33E;05-04S;119-33E;14;14;P 97;182;----;Ujang Pandang;;Indonesia;5;05-04S;119-33E;;;14;; 97;192;WAAB;Bau-Bau / Beto Ambiri;;Indonesia;5;05-28S;122-37E;05-28S;122-37E;2;2; 97;230;WRRR;Denpasar / Ngurah-Rai;;Indonesia;5;08-45S;115-10E;08-45S;115-10E;1;1;P 97;240;WRRA;Ampenan / Selaparang;;Indonesia;5;08-32S;116-04E;08-34S;116-06E;3;3;P 97;260;WRRS;Sumbawa Besar / Sumbawa Besar;;Indonesia;5;08-26S;117-25E;08-30S;117-25E;3;3;P 97;270;WRRB;Bima;;Indonesia;5;08-33S;118-42E;08-33S;118-41E;2;2; 97;284;----;Ruteng / Satartacik;;Indonesia;5;08-38S;120-27E;;;;1170; 97;290;----;Endeh;;Indonesia;5;08-48S;121-36E;;;;3; 97;300;WRKC;Maumere / Wai Oti;;Indonesia;5;08-38S;122-15E;08-38S;122-14E;3;3;P 97;310;WRKL;Larantuka;;Indonesia;5;08-16S;122-58E;;;9;; 97;320;WRKM;Alor / Mali;;Indonesia;5;08-13S;124-34E;;;12;12; 97;330;----;Wonreli;;Indonesia;5;08-04S;127-12E;;;;22; 97;340;WRRW;Waingapu / Mau Hau;;Indonesia;5;09-40S;120-20E;09-40S;120-19E;12;12;P 97;372;WRKK;Kupang / El Tari;;Indonesia;5;10-10S;123-40E;10-10S;123-40E;108;108;P 97;374;----;Atambua / Haliwen;;Indonesia;5;09-20S;124-54E;;;;; 97;378;WRKR;Rote / Baa;;Indonesia;5;10-44S;123-04E;;;1;1; 97;380;WRKS;Sabu / Tardamu;;Indonesia;5;10-30S;121-50E;10-30S;121-50E;26;26; 97;385;WPOC;Oe-Cusse / Oe Cusse;;East Timor;5;09-12S;124-22E;;124-22E;5;5;P 97;388;----;Komoro;;East Timor;5;08-33S;126-34E;08-33S;126-34E;550;550; 97;390;WPDL;Dilli / Dilli Airport;;East Timor;5;08-34S;125-34E;08-33S;125-33E;6;6;P 97;394;----;Viqueque;;East Timor;5;08-52S;126-22E;;;;47; 97;395;WPEC;Baucau;;East Timor;5;08-30S;126-24E;08-30S;126-24E;522;522; 97;396;----;Dili Kota;;East Timor;5;08-32S;126-34E;;;;; 97;404;----;Morotai / Pitu;;Indonesia;5;02-03N;129-19E;;;;15; 97;406;WAMA;Galela / Gamarmalamu;;Indonesia;5;01-49N;127-50E;;;8;; 97;410;----;Kau;;Indonesia;5;01-10N;127-53E;;;;; 97;430;WAMT;Ternate / Babullah;;Indonesia;5;00-47N;127-23E;00-50N;127-23E;23;23;P 97;438;----;Weda;;Indonesia;5;00-21N;127-55E;;;;2; 97;450;----;Mapia Island;;Indonesia;5;00-50N;134-18E;;;;3; 97;460;WAPH;Labuha / Taliabu;;Indonesia;5;01-37S;124-33E;01-37S;124-33E;3;3; 97;502;WASS;Sorong / Jefman;;Indonesia;5;00-56S;131-07E;00-56S;131-07E;3;3;P 97;530;WASR;Manokwari / Rendani;;Indonesia;5;00-53S;134-03E;00-53S;134-03E;3;3;P 97;560;WABB;Biak / Mokmer;;Indonesia;5;01-11S;136-07E;01-12S;136-07E;11;11;P 97;570;WABO;Serui / Yendosa;;Indonesia;5;01-52S;136-14E;;;3;3;P 97;580;WAJI;Sarmi;;Indonesia;5;01-50S;138-43E;01-50S;138-43E;3;3;P 97;600;WAPN;Sanana;;Indonesia;5;02-05S;126-00E;02-05S;126-00E;2;2;P 97;630;WASF;Fak-Fak / Torea;;Indonesia;5;02-53S;132-15E;;;130;130;P 97;682;WABI;Nabire;;Indonesia;5;03-20S;135-30E;;;3;3;P 97;686;WAJW;Wamena / Wamena;;Indonesia;5;04-04S;138-57E;04-06S;138-57E;1660;1660;P 97;690;WAJJ;Jayapura / Sentani;;Indonesia;5;02-34S;140-29E;02-35S;140-31E;99;99;P 97;698;----;Jayapura;;Indonesia;5;02-22S;140-43E;;;3;3; 97;700;WAPR;Namlea;;Indonesia;5;03-15S;127-05E;;;20;20; 97;722;WAPA;Amahai;;Indonesia;5;03-21S;128-53E;;;10;10; 97;724;WAPP;Ambon / Pattimura;;Indonesia;5;03-42S;128-05E;03-42S;128-05E;12;12;P 97;748;----;Geser;;Indonesia;5;03-48S;130-50E;03-53S;130-54E;3;3; 97;760;WASK;Kaimana / Utarom;;Indonesia;5;03-40S;133-45E;03-40S;133-45E;3;3;P 97;780;WABT;Enarotali;;Indonesia;5;03-55S;136-22E;03-55S;136-22E;1770;1770;P 97;790;----;Neira;;Indonesia;5;04-32S;129-54E;;;4;4; 97;796;WABN;Kokonao / Timuka;;Indonesia;5;04-43S;136-26E;;;3;3;P 97;810;----;Tual / Dumatubun;;Indonesia;5;05-41S;132-45E;05-41S;132-45E;12;12;P 97;876;WAKT;Tanah Merah / Tanah Merah;;Indonesia;5;06-06S;140-18E;;140-18E;16;16;P 97;890;----;Tepa;;Indonesia;5;07-50S;129-40E;;;;2; 97;900;WAPI;Saumlaki;;Indonesia;5;07-59S;131-18E;07-59S;131-18E;24;24;P 97;980;WAKK;Merauke / Mopah;;Indonesia;5;08-28S;140-23E;08-31S;140-25E;3;3;P 98;132;----;Itbayat;;Philippines;5;20-48N;121-51E;;;123;124; 98;133;----;Calayan;;Philippines;5;19-16N;121-28E;;;12;13; 98;134;----;Basco Radar Site;;Philippines;5;20-26N;121-57E;;;12;13; 98;135;RPUO;Basco;;Philippines;5;20-27N;121-58E;20-27N;121-58E;10;11;P 98;136;----;Basco Radar Site;;Philippines;5;20-26N;121-57E;;;167;; 98;222;RPUQ;Vigan;;Philippines;5;17-34N;120-23E;;;31;33; 98;223;RPLI;Laoag;;Philippines;5;18-11N;120-32E;18-11N;120-32E;4;5;P 98;231;----;Aparri Radar Site;;Philippines;5;18-22N;121-37E;;;8;; 98;232;RPUA;Aparri;;Philippines;5;18-22N;121-38E;;;2;3;P 98;233;RPUT;Tuguegarao;;Philippines;5;17-37N;121-44E;;;61;62; 98;321;----;Sto. Tomas;;Philippines;5;16-20N;120-34E;;;2254;2256; 98;322;----;Crow Valley Gunnery Range;;Philippines;5;15-19N;120-23E;;;;161; 98;323;----;Naula Point;;Philippines;5;15-42N;119-58E;;;;5; 98;324;RPUI;Iba;;Philippines;5;15-20N;119-58E;;;4;5; 98;325;----;Dagupan;;Philippines;5;16-03N;120-20E;16-03N;120-20E;1;2;P 98;326;----;Basa Ab;;Philippines;5;14-59N;120-29E;;;;46; 98;327;RPMK;Clark Ab;;Philippines;5;15-10N;120-34E;15-10N;120-34E;196;196; 98;328;RPUB;Baguio;;Philippines;5;16-25N;120-36E;16-25N;120-36E;1500;1501;P 98;329;----;Munoz;;Philippines;5;15-43N;120-54E;;;75;76; 98;330;----;Cabanatuan;;Philippines;5;15-29N;120-58E;;;31;32;P 98;333;RPUR;Baler;;Philippines;5;15-46N;121-34E;;;4;6; 98;334;----;Baler Radar Site;;Philippines;5;15-45N;121-38E;;;175;178; 98;336;----;Casiguran;;Philippines;5;16-17N;122-07E;;;3;4;P 98;425;----;Manila;;Philippines;5;14-35N;120-59E;;;16;13; 98;426;RPLB;Subic Bay Weather Station;;Philippines;5;14-48N;120-16E;14-48N;120-16E;18;19; 98;427;----;Tayabas;;Philippines;5;14-02N;121-35E;;;157;158; 98;428;RPMS;Sangley Point;;Philippines;5;14-30N;120-55E;14-30N;120-55E;3;4; 98;429;RPLL;Ninoy Aquino Inter-National Airport;;Philippines;5;14-31N;121-00E;;;14;15;P 98;430;----;Science Garden;;Philippines;5;14-38N;121-01E;;;45;46; 98;431;RPUK;Calapan;;Philippines;5;13-25N;121-11E;;;39;41;P 98;432;----;Ambulong;;Philippines;5;14-05N;121-03E;;;10;11; 98;433;----;Tanay;;Philippines;5;14-30N;121-21E;;;614;; 98;434;----;Infanta;;Philippines;5;14-45N;121-39E;;;5;7; 98;435;RPXT;Alabat;;Philippines;5;14-05N;122-01E;;;4;5; 98;436;----;Fernando Ab;;Philippines;5;13-57N;121-23E;;;;372; 98;437;----;San Francisco;;Philippines;5;13-22N;122-31E;;;44;45; 98;440;RPUD;Daet;;Philippines;5;14-08N;122-59E;;;3;4;P 98;442;----;Pili;;Philippines;5;13-34N;123-16E;;;34;35; 98;444;RPMP;Legaspi;;Philippines;5;13-08N;123-44E;13-08N;123-44E;16;17;P 98;446;RPUV;Virac;;Philippines;5;13-35N;124-14E;;;39;40; 98;447;----;Catanduanes Radar Site;;Philippines;5;13-59N;124-19E;;;228;233; 98;526;----;Coron;;Philippines;5;12-00N;120-12E;;;12;14; 98;531;RPUH;San Jose;;Philippines;5;12-21N;121-02E;;;2;3;P 98;536;RPMR;Romblon;;Philippines;5;12-35N;122-16E;;;46;47;P 98;538;RPVR;Roxas;;Philippines;5;11-35N;122-45E;;;3;4; 98;543;RPVM;Masbate;;Philippines;5;12-22N;123-37E;;;6;6;P 98;546;RPVF;Catarman;;Philippines;5;12-29N;124-38E;;;4;5; 98;548;----;Catbalogan;;Philippines;5;11-47N;124-53E;;;3;5; 98;550;RPVA;Tacloban;;Philippines;5;11-15N;125-00E;;;2;3;P 98;553;----;Borongan;;Philippines;5;11-37N;125-26E;;;6;7; 98;558;RPVG;Guiuan;;Philippines;5;11-02N;126-44E;11-02N;126-44E;56;60; 98;618;RPVP;Puerto Princesa;;Philippines;5;09-45N;118-44E;09-45N;118-44E;14;16;P 98;630;----;Cuyo;;Philippines;5;10-51N;121-02E;10-51N;121-02E;3;4;P 98;637;RPVI;Iloilo;;Philippines;5;10-42N;122-34E;;;7;8;P 98;642;RPVD;Dumaguete;;Philippines;5;09-18N;123-18E;;;5;8; 98;644;RPVT;Tagbilaran;;Philippines;5;09-36N;123-51E;;;7;8; 98;645;----;Lahug;;Philippines;5;10-20N;123-54E;;;33;35; 98;646;RPMT;Mactan;;Philippines;5;10-18N;123-58E;10-18N;123-58E;23;24;P 98;648;----;Maasin;;Philippines;5;10-08N;124-50E;;;71;72; 98;653;RPWS;Surigao;;Philippines;5;09-48N;125-30E;09-48N;125-30E;54;55;P 98;712;----;Bugsuk;;Philippines;5;08-11N;117-18E;;;2;3; 98;741;RPWG;Dipolog;;Philippines;5;08-36N;123-21E;;;3;5;P 98;746;RPWC;Cotobato;;Philippines;5;07-10N;124-13E;;;58;62; 98;747;----;Lumbia Airport;;Philippines;5;08-26N;124-17E;;;186;188;P 98;748;RPWL;Cagayan De Oro;;Philippines;5;08-29N;124-38E;;;5;6; 98;751;RPWY;Malaybalay;;Philippines;5;08-09N;125-05E;;;626;627; 98;752;RPWE;Butuan;;Philippines;5;09-56N;125-31E;;;45;46; 98;753;RPMD;Davao Airport;;Philippines;5;07-07N;125-39E;07-07N;125-39E;17;18;P 98;755;----;Hinatuan;;Philippines;5;08-22N;126-20E;;;2;3;P 98;815;----;Cagayan De Tawi-Tawi;;Philippines;5;07-00N;118-05E;;;33;34; 98;830;----;Jolo;;Philippines;5;06-03N;121-00E;;;11;13; 98;836;RPMZ;Zamboanga;;Philippines;5;06-54N;122-04E;06-54N;122-04E;5;6;P 98;851;RPWB;Gen. Santos;;Philippines;5;06-07N;125-11E;;;14;15; fldigi-3.21.80/data/fldigi-rtty.png0000664000175000017500000000054112313064025013717 00000000000000‰PNG  IHDR00Wù‡ pHYs  šœIDAThí™M 1…Í0«. ]uÕ›ÎM{» L'èà…Bã3šŽÙ´' % h³#Úsá¾ °Ò…ÒeJoãäièÕ+ m¬Ôø<î1¯·AøûHùœ¾_µ[y^DíŠÎú=ð]®ØÅý&Ü l©À˯\rü(–“§£YV`E'¢°(ý=0Xbö dóc AÐ& h– ¸NÔ äž;{¯¡ž² Nc˜ž‰Ϲ0;& Ú„ml œ+¶ po üWâ ÷j€Œ±”<·.!¥—6÷K( h³“Fݵ¾'òô+Àyô<´bßcÍ„xÄK½&ýƒÌî+´ùý%²~Ÿé„IEND®B`‚fldigi-3.21.80/data/flarq.desktop0000664000175000017500000000027212313064025013454 00000000000000[Desktop Entry] Name=Flarq GenericName=Fldigi ARQ Utility Comment=Amateur Radio Data Transfer with ARQ Exec=flarq Icon=flarq Terminal=false Type=Application Categories=Network;HamRadio; fldigi-3.21.80/data/flarq.xpm0000664000175000017500000004626512313064025012623 00000000000000/* XPM */ static char * flarq_xpm[] = { "48 48 924 2", " c None", ". c #5B1E0E", "+ c #7F381B", "@ c #A7624B", "# c #A8624E", "$ c #652012", "% c #90555F", "& c #AA7A86", "* c #D4B5BE", "= c #5E231C", "- c #540900", "; c #AC5D55", "> c #B4644F", ", c #CF7F58", "' c #FCAD85", ") c #FBB18F", "! c #BA7057", "~ c #965140", "{ c #4F1509", "] c #3B1314", "^ c #45151B", "/ c #895156", "( c #AB8687", "_ c #D7C6C1", ": c #FFFFFD", "< c #FFFFFE", "[ c #A58088", "} c #945D68", "| c #642D34", "1 c #AC6352", "2 c #A45C49", "3 c #A35B46", "4 c #CC8C74", "5 c #F4B8A0", "6 c #FAC5A8", "7 c #FFD4B3", "8 c #FFD8B8", "9 c #FFDCBD", "0 c #FFCFAC", "a c #E7A380", "b c #A2563C", "c c #984D37", "d c #A2787A", "e c #997474", "f c #AA8B91", "g c #D1C0C6", "h c #CAB3BD", "i c #FBE6F1", "j c #F9FFFF", "k c #F8FAFA", "l c #FEFFFF", "m c #F3F2EF", "n c #E9D7D9", "o c #AC9092", "p c #AC8C8D", "q c #926A6E", "r c #9A737B", "s c #9B747C", "t c #9E573C", "u c #98543D", "v c #9A5F47", "w c #BF8469", "x c #E9AE90", "y c #FFCAA8", "z c #FFD9B6", "A c #FFDFBA", "B c #FDE1BA", "C c #FDDEB8", "D c #FEDBBB", "E c #FBDBC3", "F c #F8DBC5", "G c #FFDCC3", "H c #FFD1AF", "I c #FBB891", "J c #E79B74", "K c #9A4E30", "L c #9B5644", "M c #7D4F54", "N c #D0BCBE", "O c #F5EDE7", "P c #FCF4EE", "Q c #FFFAFC", "R c #FFFFFF", "S c #C7BDC6", "T c #C4B0BD", "U c #F4F3F8", "V c #FDFCFF", "W c #FFFDFF", "X c #F7FFFF", "Y c #DEDCDC", "Z c #E6E1E1", "` c #FFFAF9", " . c #FFF3F5", ".. c #FFF4F7", "+. c #E2D9DA", "@. c #C1AEB5", "#. c #C5A3AF", "$. c #7B5057", "%. c #7D2F24", "&. c #C87559", "*. c #EA9464", "=. c #FFA873", "-. c #FFB886", ";. c #FFC193", ">. c #FBBD92", ",. c #FBBE92", "'. c #F9B98A", "). c #FAB784", "!. c #F8AE77", "~. c #F9AC76", "{. c #F3A97B", "]. c #F3BB97", "^. c #FDD7BD", "/. c #FEDCC3", "(. c #FFDBB4", "_. c #FED2A6", ":. c #FEBF94", "<. c #E89574", "[. c #D07355", "}. c #C06F4F", "|. c #C09581", "1. c #F0F1E9", "2. c #E8FBF4", "3. c #EEF9F3", "4. c #FDFDFE", "5. c #FDF8FE", "6. c #EFE7ED", "7. c #A6969F", "8. c #F2E9EF", "9. c #F7F9F9", "0. c #FEFDFF", "a. c #B2A3AC", "b. c #CBBFC7", "c. c #FCFBFE", "d. c #F9F6F8", "e. c #F5F8F7", "f. c #F6FFFF", "g. c #69302D", "h. c #5D0100", "i. c #A0402C", "j. c #CC7D59", "k. c #BF6F4E", "l. c #C16645", "m. c #F6996A", "n. c #FCA264", "o. c #F8995F", "p. c #F3925E", "q. c #F29968", "r. c #F29F71", "s. c #E79469", "t. c #C26640", "u. c #CF6A43", "v. c #FD9366", "w. c #FF9B68", "x. c #F99B63", "y. c #F19F6E", "z. c #EEAB80", "A. c #F8C59B", "B. c #FBD3AB", "C. c #FCD2AA", "D. c #FCD9B1", "E. c #F8D1AA", "F. c #F9C596", "G. c #FFB371", "H. c #FEAC6B", "I. c #D69B78", "J. c #EAD5D1", "K. c #ECF6FA", "L. c #F1FAFB", "M. c #FFFBFF", "N. c #FDF4FB", "O. c #FDFAFB", "P. c #D3CACE", "Q. c #D8C7CE", "R. c #F6FAF8", "S. c #FEFCFF", "T. c #C4B4C0", "U. c #D3C8D3", "V. c #FAFBFF", "W. c #FBFBFF", "X. c #FBFDFF", "Y. c #F7FEFF", "Z. c #F8DEDA", "`. c #B76C57", " + c #D76E4E", ".+ c #F89463", "++ c #F9A36A", "@+ c #FFB783", "#+ c #F5A27A", "$+ c #D0744E", "%+ c #EB9060", "&+ c #E68655", "*+ c #EA8855", "=+ c #F1935B", "-+ c #F0975D", ";+ c #D27B43", ">+ c #E18450", ",+ c #E98B5A", "'+ c #DD7C50", ")+ c #D07242", "!+ c #F9A06A", "~+ c #FFA771", "{+ c #F6A26B", "]+ c #EE9D67", "^+ c #EEA26D", "/+ c #F2AA77", "(+ c #ECA776", "_+ c #EDAC7B", ":+ c #EEB17D", "<+ c #F1A55D", "[+ c #FFA45C", "}+ c #DC855E", "|+ c #D9A3A2", "1+ c #F5F0FC", "2+ c #E9F7FA", "3+ c #F6FDFE", "4+ c #FDFBFE", "5+ c #F8F9F9", "6+ c #D1CFD0", "7+ c #CCB9C0", "8+ c #F9FAF9", "9+ c #FBFAFC", "0+ c #F7F0F5", "a+ c #D7C6D1", "b+ c #E7E0EB", "c+ c #EAF4FB", "d+ c #F1F9FD", "e+ c #F9FEFF", "f+ c #F2FCFB", "g+ c #F6F5F5", "h+ c #CA9E8E", "i+ c #F4A27A", "j+ c #FAA77A", "k+ c #F6B280", "l+ c #F5C896", "m+ c #FED8AD", "n+ c #FFCFAB", "o+ c #FFCCA8", "p+ c #F8C39B", "q+ c #F5BC9C", "r+ c #F2B48F", "s+ c #ECA878", "t+ c #F3A86C", "u+ c #FCAA68", "v+ c #FAA664", "w+ c #F9A76A", "x+ c #EC9B65", "y+ c #D38048", "z+ c #E69056", "A+ c #E0874E", "B+ c #FAA26B", "C+ c #FAA470", "D+ c #F5A06F", "E+ c #F59E6A", "F+ c #FA9C62", "G+ c #F99A5D", "H+ c #F49E6C", "I+ c #F89E63", "J+ c #FF9D5E", "K+ c #ED8F64", "L+ c #B67466", "M+ c #F5EBF0", "N+ c #E4F6F9", "O+ c #EAFCFA", "P+ c #FDFFFF", "Q+ c #F5F8F8", "R+ c #E6E6E7", "S+ c #BEAAB2", "T+ c #E9E2E6", "U+ c #FCF9FB", "V+ c #DFCFD2", "W+ c #C4AEB7", "X+ c #FAF0F9", "Y+ c #EAF0F6", "Z+ c #F3F8FC", "`+ c #FBFEFF", " @ c #F8F9F8", ".@ c #EADFDD", "+@ c #B47A60", "@@ c #E99560", "#@ c #F3BB8E", "$@ c #FDD8B6", "%@ c #FFDDC1", "&@ c #FDCFB2", "*@ c #FECEAD", "=@ c #FBD0A7", "-@ c #F7D3A7", ";@ c #FAD1AA", ">@ c #F9CAA1", ",@ c #F8C392", "'@ c #FAB179", ")@ c #F9A468", "!@ c #F9A166", "~@ c #F69F67", "{@ c #F9A470", "]@ c #FDA56E", "^@ c #F69A5A", "/@ c #D37536", "(@ c #D1753D", "_@ c #EF9868", ":@ c #F8A67A", "<@ c #F39F71", "[@ c #FB9E68", "}@ c #FF9D60", "|@ c #FA9C65", "1@ c #FAA06B", "2@ c #FA9C63", "3@ c #FDA26C", "4@ c #D5926E", "5@ c #F2DFDA", "6@ c #F0F3FD", "7@ c #EDF3F8", "8@ c #FEFCFC", "9@ c #F9FAFA", "0@ c #F3F4F6", "a@ c #A2929B", "b@ c #C0B1BA", "c@ c #C4B0B0", "d@ c #AC9398", "e@ c #FEF1F8", "f@ c #EEF2F7", "g@ c #F2F3F8", "h@ c #FEF9FB", "i@ c #FBF2F0", "j@ c #EFD9D8", "k@ c #E09D81", "l@ c #F0A268", "m@ c #F9CCA1", "n@ c #FDD3B7", "o@ c #F2B094", "p@ c #F3A377", "q@ c #F5A66E", "r@ c #F4A873", "s@ c #F3A476", "t@ c #F4A66D", "u@ c #F6A367", "v@ c #F9A269", "w@ c #FBA169", "x@ c #FD9F69", "y@ c #FC9F69", "z@ c #FC9F68", "A@ c #F99F65", "B@ c #F4A471", "C@ c #F9B385", "D@ c #F6A36E", "E@ c #F19359", "F@ c #D1743D", "G@ c #E3905E", "H@ c #F5A370", "I@ c #F59F69", "J@ c #FAA062", "K@ c #FBA05E", "L@ c #F8A26B", "M@ c #F9A46F", "N@ c #FAA160", "O@ c #EA9C62", "P@ c #C3998A", "Q@ c #F7EBFA", "R@ c #EEEAF8", "S@ c #F6F4F6", "T@ c #FCFEFF", "U@ c #F4F4F7", "V@ c #E4DCE3", "W@ c #D4C1CD", "X@ c #F2F5FA", "Y@ c #AEA19F", "Z@ c #C2B0B5", "`@ c #F9F8FC", " # c #E5F2F8", ".# c #EAF5FB", "+# c #F0F5F5", "@# c #F9F7F7", "## c #D3B3A9", "$# c #DF916B", "%# c #FAA76E", "&# c #F3B787", "*# c #F0AE84", "=# c #EE9D6B", "-# c #F6A15D", ";# c #F7A559", "># c #F9A160", ",# c #FE9B68", "'# c #FD9D67", ")# c #FC9F67", "!# c #FA9F69", "~# c #F9A06C", "{# c #F69F6A", "]# c #F5A067", "^# c #F9A464", "/# c #F5A35C", "(# c #E9A779", "_# c #F8D5C1", ":# c #FFCEAA", "<# c #FAB079", "[# c #E1884B", "}# c #CD713A", "|# c #F39961", "1# c #FAA56C", "2# c #F8A668", "3# c #FFA864", "4# c #EF9965", "5# c #E59462", "6# c #FBA360", "7# c #F49958", "8# c #BE8469", "9# c #E7DAE0", "0# c #EFF2FB", "a# c #EBF0F3", "b# c #FBFEFE", "c# c #F6F6FA", "d# c #FAF3FA", "e# c #B7A0AF", "f# c #C4C0C8", "g# c #D4CECD", "h# c #DED5DD", "i# c #EEF5FC", "j# c #E4F0FD", "k# c #E6F2FC", "l# c #EBF5FB", "m# c #EAE0E9", "n# c #B67A69", "o# c #ED8F5B", "p# c #FCA368", "q# c #F59E66", "r# c #F9A067", "s# c #F9A165", "t# c #F99F66", "u# c #FAA069", "v# c #FAA169", "w# c #FAA166", "x# c #F8A264", "y# c #F7A262", "z# c #F9A162", "A# c #F59E5E", "B# c #FCA464", "C# c #F0A172", "D# c #F8C7AA", "E# c #FFDFBE", "F# c #F7D7AF", "G# c #F7C497", "H# c #F19C6B", "I# c #DC7947", "J# c #E48552", "K# c #DD8553", "L# c #BF6033", "M# c #E28B60", "N# c #E99B6D", "O# c #F2A367", "P# c #FA9F60", "Q# c #E89874", "R# c #E2CBBF", "S# c #E9F6F7", "T# c #EAF1FA", "U# c #F6F6FB", "V# c #FAF9FC", "W# c #F9F1FA", "X# c #BBABB5", "Y# c #BDAEB7", "Z# c #DDCBCC", "`# c #FBF1F9", " $ c #EFEAF7", ".$ c #E9EFFC", "+$ c #EAF0FC", "@$ c #F1F6FE", "#$ c #E2CDCB", "$$ c #D28869", "%$ c #FFA26B", "&$ c #F99F64", "*$ c #FAA065", "=$ c #FAA167", "-$ c #FAA168", ";$ c #F9A066", ">$ c #F7A168", ",$ c #F7A167", "'$ c #F7A165", ")$ c #F9A163", "!$ c #FB9F63", "~$ c #FA9E65", "{$ c #F89D64", "]$ c #FEA667", "^$ c #F4B072", "/$ c #FBD2AB", "($ c #FBDFCB", "_$ c #F9DECA", ":$ c #FBCBAA", "<$ c #EFA579", "[$ c #D3764B", "}$ c #AE4621", "|$ c #EA865A", "1$ c #F8A674", "2$ c #F8A16F", "3$ c #FAA66A", "4$ c #E38A65", "5$ c #D5AFA0", "6$ c #F1FDFF", "7$ c #E9EFFF", "8$ c #EEEDFC", "9$ c #F5F4FD", "0$ c #F0EDF6", "a$ c #F5E9EF", "b$ c #C6AFB4", "c$ c #A28385", "d$ c #FFF7FE", "e$ c #F1E8F9", "f$ c #EBEFF9", "g$ c #EBEFFA", "h$ c #F0EFF8", "i$ c #D5B09E", "j$ c #ED9B6E", "k$ c #FDA168", "l$ c #F89F66", "m$ c #F89F65", "n$ c #F6A066", "o$ c #F5A166", "p$ c #F6A065", "q$ c #F8A065", "r$ c #F9A167", "s$ c #FCA06A", "t$ c #F99B68", "u$ c #DA7F51", "v$ c #E88B52", "w$ c #F9A15D", "x$ c #F1AF7D", "y$ c #F8D0B1", "z$ c #FBDCC7", "A$ c #FDDEC9", "B$ c #FED4B9", "C$ c #FBBC9A", "D$ c #E58C65", "E$ c #DB794C", "F$ c #F69F61", "G$ c #FF9F61", "H$ c #FD9D60", "I$ c #FAA163", "J$ c #F79C6E", "K$ c #DCA289", "L$ c #EAE3E3", "M$ c #ECF2FF", "N$ c #E7F0FB", "O$ c #E7F3FA", "P$ c #E7EFF2", "Q$ c #FEF7F9", "R$ c #B49DA0", "S$ c #C0A5A8", "T$ c #F7F6FB", "U$ c #E9EAFB", "V$ c #E9F0F8", "W$ c #E9F0FA", "X$ c #F5F1FA", "Y$ c #DBAD8E", "Z$ c #EF975E", "`$ c #FBA16A", " % c #F7A065", ".% c #F6A165", "+% c #F6A067", "@% c #F6A570", "#% c #F4A673", "$% c #EC9A6C", "%% c #D1794A", "&% c #E68752", "*% c #FDA26F", "=% c #F2A374", "-% c #F9C29B", ";% c #FFE0C1", ">% c #FDDDBC", ",% c #F4C29D", "'% c #E09266", ")% c #D67F46", "!% c #FB9E5C", "~% c #FF9D63", "{% c #FBA972", "]% c #CE805C", "^% c #C8A39D", "/% c #F2F5FD", "(% c #EAF1F4", "_% c #E6F2F3", ":% c #E6F5F4", "<% c #E7F1F1", "[% c #EAEDED", "}% c #E6E0E3", "|% c #E7F3F7", "1% c #DEF1FD", "2% c #E7F2FB", "3% c #EBF3FB", "4% c #E7D7DC", "5% c #D5916A", "6% c #FCA265", "7% c #F89E68", "8% c #F8A066", "9% c #F29F67", "0% c #EFA56E", "a% c #FBC490", "b% c #F6BC8A", "c% c #E9A26E", "d% c #D8834F", "e% c #E58456", "f% c #FF9B6E", "g% c #FAA16D", "h% c #EDB075", "i% c #F3C790", "j% c #FCD7AD", "k% c #FED4B6", "l% c #F6BB94", "m% c #CE8350", "n% c #D6854A", "o% c #FBA16F", "p% c #F39F6D", "q% c #F1A86D", "r% c #E89568", "s% c #D79F8D", "t% c #F4EDEE", "u% c #F0EEF8", "v% c #ECEEF6", "w% c #ECEFF9", "x% c #ECEDF7", "y% c #F1F0FC", "z% c #F0F4FA", "A% c #E6F2F5", "B% c #DCF5FD", "C% c #E3EBF7", "D% c #F9FBFF", "E% c #C19A96", "F% c #D57E55", "G% c #FDA366", "H% c #F99F67", "I% c #F99F63", "J% c #FA9F63", "K% c #F99E64", "L% c #F8A86F", "M% c #F1A66F", "N% c #F8B985", "O% c #FDD4A2", "P% c #F2BD89", "Q% c #F5A971", "R% c #E28955", "S% c #D97847", "T% c #F69962", "U% c #F4A66A", "V% c #E9A46A", "W% c #F2AA79", "X% c #F9AE84", "Y% c #F6AB7C", "Z% c #EA9B63", "`% c #E49159", " & c #FFA572", ".& c #FBA36B", "+& c #F8A363", "@& c #FFA66F", "#& c #CE7F5A", "$& c #E9CAC3", "%& c #F2F3FF", "&& c #EBEDFD", "*& c #F1EFFF", "=& c #F8F1FF", "-& c #FAEFFE", ";& c #FDF8FF", ">& c #FCF4F9", ",& c #F4F9FA", "'& c #F9F7FF", ")& c #FDE9EB", "!& c #D99781", "~& c #F59668", "{& c #F8A165", "]& c #F8A164", "^& c #F7A063", "/& c #F9A164", "(& c #FBA069", "_& c #D98350", ":& c #DA8954", "<& c #E79A68", "[& c #FAB887", "}& c #F6B181", "|& c #F5A46D", "1& c #F4A15F", "2& c #E6914E", "3& c #D37D41", "4& c #EA9569", "5& c #F8A078", "6& c #FC9E6C", "7& c #FE9D5C", "8& c #FF9F5B", "9& c #FFA46B", "0& c #E58B5F", "a& c #F09769", "b& c #F39562", "c& c #F09762", "d& c #EF9A6A", "e& c #D67F58", "f& c #BB8678", "g& c #F6F6FF", "h& c #F7F4FF", "i& c #EADFE9", "j& c #D8C4CE", "k& c #DABEC8", "l& c #E3C8DB", "m& c #E9CAD1", "n& c #ECD7D4", "o& c #EEDFE4", "p& c #B98787", "q& c #D9805B", "r& c #F9A266", "s& c #F6A360", "t& c #F79E64", "u& c #F6A466", "v& c #F6A465", "w& c #F9A065", "x& c #FD9E67", "y& c #DC7E4D", "z& c #C7693C", "A& c #ED9167", "B& c #F4976B", "C& c #FBA160", "D& c #FFAC67", "E& c #F49B60", "F& c #D6784A", "G& c #E5895F", "H& c #F09662", "I& c #FFA866", "J& c #FFAD6E", "K& c #E07F5D", "L& c #7B2B1B", "M& c #853D24", "N& c #963E27", "O& c #8D472B", "P& c #824730", "Q& c #843A2A", "R& c #712A23", "S& c #BA9092", "T& c #DABABA", "U& c #8B6E6B", "V& c #4D3232", "W& c #5D2D3D", "X& c #68353A", "Y& c #734744", "Z& c #6A4A4C", "`& c #663235", " * c #934833", ".* c #DF8766", "+* c #F99766", "@* c #FB9E61", "#* c #FFA66E", "$* c #FCA16D", "%* c #F99E69", "&* c #F7A169", "** c #F3A266", "=* c #F4A365", "-* c #FB9F68", ";* c #F6A16A", ">* c #F6A16B", ",* c #FCA06C", "'* c #FC9D69", ")* c #FF9D6B", "!* c #FF9E6C", "~* c #F69563", "{* c #D67949", "]* c #D47348", "^* c #F79567", "/* c #FA9F68", "(* c #F9A265", "_* c #FFA166", ":* c #FC9B65", "<* c #E98D5B", "[* c #C4683A", "}* c #BE6339", "|* c #B06D4E", "1* c #732F25", "2* c #64201E", "3* c #8B463B", "4* c #B6573A", "5* c #D06B39", "6* c #D37A42", "7* c #F4986B", "8* c #FC9C73", "9* c #F99F6C", "0* c #F4A766", "a* c #F1A561", "b* c #F49E63", "c* c #FB9E6B", "d* c #F7A069", "e* c #F9A16A", "f* c #FCA16C", "g* c #FE9F6C", "h* c #FFA06C", "i* c #FBA468", "j* c #F49D5F", "k* c #ED925B", "l* c #C86A3A", "m* c #DF8653", "n* c #FBA26F", "o* c #F9A369", "p* c #FFA673", "q* c #F6936D", "r* c #7C1705", "s* c #7C3625", "t* c #C76E51", "u* c #DE7B53", "v* c #CA693D", "w* c #BF633B", "x* c #E88C57", "y* c #E98E54", "z* c #F9A267", "A* c #FEA86F", "B* c #F4A167", "C* c #F6A362", "D* c #F19C5B", "E* c #DD8848", "F* c #E89255", "G* c #E68F53", "H* c #F49D63", "I* c #FEA76D", "J* c #FCA36A", "K* c #FAA466", "L* c #F29B5B", "M* c #EC8E5C", "N* c #DB8154", "O* c #D6874F", "P* c #E79659", "Q* c #FFA778", "R* c #D07B64", "S* c #6E1913", "T* c #6C1F18", "U* c #963729", "V* c #EC9366", "W* c #FFB374", "X* c #E98F56", "Y* c #B24C23", "Z* c #ED8661", "`* c #E78B58", " = c #FAA561", ".= c #F8A262", "+= c #F6A164", "@= c #F7A466", "#= c #E49459", "$= c #C16E36", "%= c #E08C58", "&= c #E1895C", "*= c #EF9265", "== c #FFA372", "-= c #FEA36A", ";= c #F5A268", ">= c #F6AA6A", ",= c #DC8545", "'= c #D47440", ")= c #C87153", "!= c #69241A", "~= c #AB5E46", "{= c #E88666", "]= c #E37B53", "^= c #D26E43", "/= c #F4996C", "(= c #CC6C39", "_= c #E5834A", ":= c #F39462", "<= c #FA9F6F", "[= c #F6A16D", "}= c #F49F6B", "|= c #F69E6D", "1= c #DD7F55", "2= c #C7653C", "3= c #E7825E", "4= c #E4895D", "5= c #F1A364", "6= c #FFAC66", "7= c #FEA067", "8= c #CD7151", "9= c #6E2215", "0= c #7F2427", "a= c #902F20", "b= c #E5895A", "c= c #FFB175", "d= c #F2915D", "e= c #B7522B", "f= c #C05D34", "g= c #D67649", "h= c #F69E68", "i= c #FDA46B", "j= c #FCA069", "k= c #FFA46E", "l= c #F49460", "m= c #EB8E5D", "n= c #D06F41", "o= c #C9683C", "p= c #D67D55", "q= c #A55135", "r= c #682616", "s= c #8F4C2E", "t= c #DE8C68", "u= c #CA6E51", "v= c #C4654C", "w= c #FFA579", "x= c #F09360", "y= c #CC7345", "z= c #DA844C", "A= c #EE9556", "B= c #F59D5E", "C= c #FFB174", "D= c #FFB075", "E= c #FFB073", "F= c #FFA472", "G= c #B85D49", "H= c #6C1515", "I= c #8B5446", "J= c #73251B", "K= c #95402C", "L= c #E48F68", "M= c #FFAA79", "N= c #F59D70", "O= c #EB9061", "P= c #E48A59", "Q= c #C57046", "R= c #B26340", "S= c #B16947", "T= c #B36943", "U= c #A65D40", "V= c #7B3629", "W= c #6A230D", "X= c #BA6848", "Y= c #D57C5E", "Z= c #D1745E", "`= c #CE7260", " - c #923C2D", ".- c #84382F", "+- c #813F39", "@- c #7B423B", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " . + @ # $ % & * ", " = - ; > , ' ) ! ~ { ] ^ / ( _ : < ", "[ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l ", "m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W ", "X Y Z ` ...+.@.#.$. %.&.*.=.-.;.>.,.'.).!.~.{.].^./.9 (._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.", "R a.b.c.d.e.f.R W g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.", "R T.U.V.W.X.Y.V Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+9+", "0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+", "V+W+X+Y+Z+`+ @.@+@@@#@$@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@1@2@3@4@5@6@7@8@9@0@a@b@R ", "c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@", "Y@Z@`@ #.#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#/#(#_#:#<#[#}#|#1#2#3#4#5#6#7#8#9#0#a#b#c#d#e#f#", "g#h#i#j#k#l#m#n#o#p#~@q#r#s#s#s#t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#", "Z#`# $.$+$@$#$$$%$&$&$*$=$-$r#r#;$>$,$'$)$)$!$~${$]$^$/$($_$:$<$[$}$|$1$2$~@3$4$5$6$7$8$9$0$a$b$", "c$d$e$f$g$h$i$j$k$A@;$=$;$;$l$m$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$", "S$T$U$V$W$X$Y$Z$`$;$=$;$=$=$;$;$;$ % %.% %+%@%#%$%%%&%*%=%-%D ;%>%,%'%)%!%~%t#{%]%^%/%(%_%:%<%[%", "}%|%1%2%3%4%5%6%7%r#=$m$;$;$=$;$8%&$&$q$+%9%0%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%q%r%s%t%u%v%w%x%y%", "z%A%B%C%D%E%F%G%H%=$=$;$;$;$=$;$m$I%J%K%v@L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%`% &.&+&@&#&$&%&&&*&=&-&", ";&>&,&'&)&!&~&{&]&;$;$;$;$;$;$;$;$^&/&K%(&_&:&<&[&}&|&1&2&3&4&5&6&7&8&9&0&a&b&c&d&e&f&g&h&i&j&k&", "l&m&n&o&p&q&=.r&s&t&t&r$;$;$m$;$r$u&v&w&x&t$y&z&A&B&x@C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V& ", "W&X&Y&Z&`& *.*+*@*#*$*%*&***=*A@-*;*>*,*'*)*!*~*{*]*^*/*(*_*:*<*[*}*|*1* 2* ", " 3*4*5*6*7*8*9*0*a*b*c*d*e*f*g*h*z@i*j*k*l*m*n*8%o*p*q*r* ", " s*t*u*v*w*x*y*z*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S* ", " T*U*V*W*X*Y*Z*`* =.=+=@=#=$=%=&=*===-=;=>=,='=)=!= ", " ~={=]=^=/=(=_=:=<=n*[=}=|=1=2=3=4=5=6=7=8=9= ", " 0=a=b=c=d=e=f=g=o%h=i=j=k=l=m=n=o=p=q=r= ", " s=t=u=v=w=x=y=z=A=B=C=D=E=F=G=H= ", " I=J=K=L=M=N=O=P=Q=R=S=T=U=V= ", " W=X=Y=Z=`= -.-+-@- ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; fldigi-3.21.80/data/mac/0000775000175000017500000000000012313333727011603 500000000000000fldigi-3.21.80/data/mac/fldigi.icns0000664000175000017500000011072712313064025013637 00000000000000icns‘×it32QÇŽ€4”¾‘/€±€3”¿”3€­€3”À–6€±€3”¿”3€­€2“›=€±€3”¿”3€œŽ € 5•ŤJ± €8–Á–8€ œ’+ŧKº/‘¾‘/¶ƒ¾¡@º†µ†¶"È«Jº'¿'¡Ž16,"[±àÈy7")23210122/(!†  !(.2216+"^³Ù³^",63œ1Ž’ •†ŠªÜøé¼–‰Ž“’ “””ˆ€||~…~}}~~}||€‡””“•…Š­ÝóÝ­Š…•”œ’ŽÊ ËÉÇÈÐÜãßÔËÈÉ”ÊÉÈÈÍÔÜàß…ÝÞßÞßááÜÕÍÉÈÊËÉÇÈÐÜâÜÐÈÇÉËÊœ ž˜‘–›“œŸ™“’«×’ÿÚ®•“š€ž˜‘‘˜žŸœŽ- ,-/.)!&,..“-3)M õÿ÷§R#+10/.)!!)./-,-´ sÞ€ÿ÷ûÿÿ€þ‚ÿü€ÿá|­’*‚Ýÿÿýöúþÿþüûýÿ÷€ÿߊ1€€™’ˆ‰Š‹Š‰“ˆ ‰ˆ‡‡~so‹¼î€ÿýˆÿü€ÿïÀuu€ˆ‰ˆˆ‰Š‹Š‰¡ˆ®Ï&ÎÍÏÐÔÙâîøþþûøõòñóöøöðëëðöûýý÷îâÚÕÒÐÎÏÏÐ…ÏÐÐÑÐИϭ»&¹¸¸ÂÓêüÿþõðîíçÝÔÑ×áçàÐÀÁÐäïñðóûÿúéÕû¹º†»½¾¿¾½˜»ªc,dcc`ah€£ÊåîìäááßØË¾»ÃÑÙи£¤¹ÕåæããëêàÄ¡~iaacdd‚cdfghge˜c£€‚+*P~«ÅÏÑÒÖ×ÖÑÉÁ¾ÄÐ×Ϲ¦§»ÔâàÛÓÒÉ»›sF%ƒ˜® N¤´¶·¿ÈÎÐÓ€ÔÖÛßÚÍÃÄÑÝãÜÒù¬¡ˆf9Ù#2c©­¦¢¬ºÆÍÕÝãäãäççäââææãÖÆ±¢–’…mFØ%=l’¥¡–š®ÂÎÖÚÜÞâæëîîïííèßηžŽ…†€pN( §«,4`…˜“†~‹¥ÂÓ×ÒÌÎØäíðîìèèãÛŪ||jH$ Ï€) &S|“Žw…£ÅÚÜÏÂÃÒåððçßÚÞßÙ¤ˆ}€‰ƒlD¢ª€*M}˜”ƒz‡¦ÈÞßÐÂÄÔçïèØËÈÔÞÜÆ¨Œ…Œš”wF€Ë€#Pƒ¡Ÿ‘Š–¯ÍààÑÄÈØæçÙõ¸ÌÞáÏ´›•›«¦‡O€Ë€$&Y‡£§¤£«¼ÔâÝÌÀÇØãÝʶ­µÊÞä×­¥§²¬Y$€Å€$ 3c‡©³¹¾ÉÛåÛÇ»ÄÖÞÕź¸ÀÏÝãÛͼ³¬« ‰]-‚ Ä€$AoŠ˜¤´ÀÅÎÝæÜÉ¿ÈÙáÚÎÊÍÑÖÚÝÖÍÀ¸« _6‚ Ä €$Jy˜œ§´ÀÌÚâÞÒËÑÞåà×Ô×ÚÛÙÖÎÆ½¶§™‰{`9‚ Ä  ‚$K~¤œœ¦¹ÌÛäæäáâèêåÛÕ×ÜâàÙ̹´¬§›ˆc7€Ä %Avž¬£›¤½ÒßåêíëçâÜÕÍÈÊÔàäÞÒǽº¶º¯”a-€€Å %0c“°²­´ÊÞèîðóïäÓÁ¸¶¼ÄÑáëëâØËÅÂÅ·“W!€±€‘€% Dsš¯»ÇÕßâãáàÙÈ­’ˆ£³ÂÑÝåæäØÌº¯™uAƒ¦Ž‚% 'Jr•´ÌÖÓȽº°œ}_Vd•¦±»ÈÖãÝÆŸeJ) ‡ ¦‡"!:]Ž½Ìº–~wxq_G0)4L`puw…¥ÎÕ´tB)‡  ¦ˆ!!^¦Â¢`4,55) *75-9l°É¡M‡ ¦ˆ€ <—½“8 €  =˜À”5€‡  ¦ˆ€)¾’,Œ)½‘.€‡ ¥Ž‰€'ŽÃ9Œ.“À•3€‡ ¥œ €)ŽÄ¡Aˆ€/“¿“1€‡ ¥ ›€<–Àš@€„€+º.€‡ ¥ › V¤¹‹7ˆ€'‡´‰(€‡ ¥›€ 4yµºŒH C“·:‡ ¥›"(Z—ÆÆ¤uTD:0-5?B9/,:DEQz²Ç§c-€„  ¥€œ!1X…³ÔÙ˱šƒl[[l~‚r_Wg~‘£º×ÛÈtM) €ƒ Ê! /]±ÊÝæèÞ̲—…‰Ÿµ¹¥Œ€®ÊÝåìåßÍ´ƒF€„¿!OлӨÜäîîãϹ«±ÅØÛȱ¦´ÏèóðèÝàâÛ­f €ƒÀ€'*k¬×á×ÑÖäîìÞÎÄÉØåæÙÉÃÍáñóæÖÈÑàèÅ5€Ã€# ;»Ø×ÉÀÆ×éîæ×ÏÒÞæçàÙØÞèïêÙŶ¾ÑàÉ”Nƒ À$GŠºËÆ»·¾Ñèòé×ÌÐÝæçãáãåéêäÔ¿°µÄÒÛ^)‚  À$NŠ­·µ¶»ÂÐãîçÕÉÌÚäçååçæåãßÕǹ¸º¿³—f3 ‚Ä€$VŠ¡¤¨¶ÄÉËÔßáØÎÐÜèìêèèåáÝÛØÓǼ­¨Ÿj9 Ä %*^ˆ––Ÿ·ËÌÁ¾È×ÝÜÛâëïîêèåáÚÙÜßÓ¼œŠ‰pC€ Ä % 7g‰‘š¶ÌÊ·«´ÍãëéèêíîîìêåÛÙÞåÚ»z}Š|R€  Å ->h†Ž‘ž¹Îͺ¬±ÊäñìáÙÚâêðïéÞÜàçÞÀ“z{Š[( Æ€.=a|‡’¥¿Ô×ʼ¼ÍãïåÍ·¶ÈáñóëàÞãëãÈ€yxX* Ç€€'0Mh|’¬ÈÝãÜÏÊÑßäÓ³•’©ÍæìæÞàæïæÍ¤„qk]C!€ È' 2Nl²ÐäêåØÐÐÔѾ …‚—·ÎÙÚÙáêóèΤdN8$€ ½…' =f”»×çêåÚÒÌǾ®‘’𦝼ÊÖäíóæÎ«‰c> „ ½„!9n¤ÊÞççäÝÖÍÀ°¥¤ª®¥—Ÿ¼ØéïðãÖÀ¦yB€ƒ ½ ƒ!H…»ØáããæäàÖۧ°ÂÆ®Œ|’»ßîìèßàÛÍŸ]€€€½ ‚##aŸÍààßáèëêãÓ¼²¾ÐÏ®‡{˜ÆèñêãÝæêä»{6 €Á  ‚$;}´ÔÚ××ÝæìîëâÐÆÍÙÒ´–“²ØîïæßÚààÜ¿‘V%‚à ‚$Q“ÀÐÍËÑÜåéìîìáÚÜáÚŵ¹ÑèîèßÝÙÕɲ›o=‚ Ä ‚$!\ÃȽºÅÖàäèíïëçæçäÜÖÛèðéÜÓÓÐÆ´­¨yF‚Ä  ‚ZœÄÆ´«´ÉØàåêíìêéèìñòåÒÄÁ¾¸­­ªšp=‚à ‚ P“ÀÈ´ ž°ÇÙâåäããåçëðñåϹ«£¦®¼´•]-  'K‰ºÊµ•ƒ‘°ÐáâÞÝßßÙÖÙàèíñéÔ´—‡“±ÍÂ’Q#€  Á €2 )N®À®ˆmwÈßàÛÛßÝÔÏÓÞéíðìÙµu…­ÑÈ—U&   Á;"9V{Ÿ¯Ÿ|bm“ÂÞåââãà×ÒØâìíîëÛ¹t}¡ÇÈ¥g1  Á/)B[x’ ”~o{›ÂÞëìêéåàßâçëèèåÚÁ¡†‚”³À¯z>€  Á/'BZtŠ™˜“™¬ÄÛëòñíêêëìéåààÞÛϺ ŽŠ¯­„H€ Ã.  Ê€(Q†¢ª«´ÀÍ×áéìéâÞâæàÏ¿¼ÇÖàãÜο»½Ä¹m;Ê1 (Y‡™›Ÿ±ÇÖÞãéëêãßáäßÓÇÇÑÝããÜÓÇþ¾µ¢zIÆ6  3bŠ•’–­ÈÜãåçéêèåääâÜ×ÙàæåàÙÔÏɼµ­¥ˆ[) Æ6 7e™—˜¬ÇÛâãäæêëëéèæååèëëåÞ×ÕÒʺ°©¥Œc2  Ç3b¥§¥²ÅÖÜÞàåêíìë€êëíîíçàÛ×ÏÅ·²¬¤†^1Ç6  (\’¯µ´¼ÉÓÕ×ÝæëëèçéêêééëìéåàÚÌÀ¶·±¡|P(  Å €-!Z’¯µ·ÃÐÔÑÓÛæëèãâæëíëéèçååâÛÌÀ·¹²žtF Å €$ Z¡£¬Ä×ÚÒÑÚåèãÝÜâéííëäÝØÙÜÛÐÅ·³©–pA€ Ä  €$$_—•£ÅÞáØ×ßæèäáâèíñôñçØÎÐÖÜ×ͼ°¢“qE€  Ä  €&_Š’‘¡ÅâçàÝâææäãæ€éëìå×ËËÓÝÝÖÁ°žqH À  €%#Wƒ“œ°ÐèìççìïïëééçߨÚãéæÞÜÞåäÞ˸¡ŽpI€ ¼ €%@iƒ›·ÖêìçåéîîæÛÒɾ³·ÉàëéææëèßȲ—€a>‚» ‚€% $Daƒ©ÏåçÞÔÖÜÞл¨™Ž…¦ÈÜÝÛÞéæ×¶˜zcG+… » †$ 1Nu§ÐÜË­ £¨š€iYRNYr“¤¢¢´ÔÜÅcF7'† º ˆ! 3o³Ï·€]YbYC/# !+™Å¨X !  A˜Æ§Nˆ  ¦‰€'ŒÁŸB€„€'‹Â¢DŒ  ¥€)ŽÁ=Œ(¡B€‡  ¥€1’Â>€ƒ€0’ßA€‡  ¥€5•Ü?€€€€5•Ü?€‡  —Ž€4”¾‘/€±€3”¿”3€­€3”À–6€±€3”¿”3€­€2“›=€±€3”¿”3€œŽ € 5•ŤJ± €8–Á–8€ œ’+ŧKº/‘¾‘/¶ƒ¾¡@º†µ†¶"È«Jº'¿'¡Ž16,"[±àÈy7")232•1232†12„34321 6,"^³Ù³^",63œ1Ž’ •†ŠªÜøé¼–‰Ž““’““”““„’““†”““€’ •…Š­ÝóÝ­Š…•”œ’ŽÊ ËÉÇÈÐÜãßÔËÈÉ—ÊÉÇÆÇÉ„ÊÉÇÆ„ÅÆÇÉÊ ÉÇÈÐÜâÜÐÈÇÉËÊœ ž˜‘–›•œ(™”‘”™œ›œš•ŽŽ•šœ›œž˜‘‘˜žŸœŽ- ,-/.)!&,..”-+/11-&#&-220/012.'!'.11.--/.)!!)./-,-ý’"     €€€™’ˆ‰Š‹Š‰“ˆ+‰ˆ‡„}{z{{zyyz{||{zz{~€€~{zz{{z{|~‚…‡ˆˆ‰Š‹Š‰¡ˆ®Ï&ÎÍÎÑÖÛßááàßÝÛØÕÔÖÙÛÚÖÒÒÖÜàââáàÞÛ×ÒÏÎÎÏÐ…ÏÐÐÑÐИϭ»¹¸¸ÂÓèúƒÿ üóêçì÷ýöæ×׿úƒÿùèÕÄ»¹º†»½¾¿¾½˜»ªc,dcc`ah£Èãñöö÷÷ôìßÓÐ׿îäÍ·¸Íéúûùõõíß iaacdd‚cdfghge˜c£€‚+*P~ªÅÏÒÕÙÛÙÕÌÄÂÇÓÚÒ¼¨ª¾×åãÞÖÔÉ»›rF%ƒ˜® N¤´µ´ºÂÈËÍ€ÏÐÕÙÔȽ¾ËØÝÖ̾¶«¡‰g9Ù#2cª­¦¡©·ÃÊÒÚàáàáääáßßããßÓ®¡–’…mFØ%=l’¥¡–š®ÂÎÖÚÜÞâæëîîïííèßηžŽ…†€pN( §«,4`…˜“†~‹¥ÂÓ×ÒÌÎØäíðîìèèãÛŪ||jH$ Ï€) &S|“Žw…£ÅÚÜÏÂÃÒåððçßÚÞßÙ¤ˆ}€‰ƒlD¢ª€*M}˜”ƒz‡¦ÈÞßÐÂÄÔçïèØËÈÔÞÜÆ¨Œ…Œš”wF€Ë€#Pƒ¡Ÿ‘Š–¯ÍààÑÄÈØæçÙõ¸ÌÞáÏ´›•›«¦‡O€Ë€$&Y‡£§¤£«¼ÔâÝÌÀÇØãÝʶ­µÊÞä×­¥§²¬Y$€Å€$ 3c‡©³¹¾ÉÛåÛÇ»ÄÖÞÕź¸ÀÏÝãÛͼ³¬« ‰]-‚ Ä€$AoŠ˜¤´ÀÅÎÝæÜÉ¿ÈÙáÚÎÊÍÑÖÚÝÖÍÀ¸« _6‚ Ä €$Jy˜œ§´ÀÌÚâÞÒËÑÞåà×Ô×ÚÛÙÖÎÆ½¶§™‰{`9‚ Ä  ‚$K~¤œœ¦¹ÌÛäæäáâèêåÛÕ×ÜâàÙ̹´¬§›ˆc7€Ä %Avž¬£›¤½ÒßåêíëçâÜÕÍÈÊÔàäÞÒǽº¶º¯”a-€€Å %0c“°²­´ÊÞèîðóïäÓÁ¸¶¼ÄÑáëëâØËÅÂÅ·“W!€±€‘€% Dsš¯»ÇÕßâãáàÙÈ­’ˆ£³ÂÑÝåæäØÌº¯™uAƒ¦Ž‚% 'Jr•´ÌÖÓȽº°œ}_Vd•¦±»ÈÖãÝÆŸeJ) ‡ ¦‡"!:]Ž½Ìº–~wxq_G0)4L`puw…¥ÎÕ´tB)‡  ¦ˆ!!^¦Â¢`4,55) *75-9l°É¡M‡ ¦ˆ€ <—½“8 €  =˜À”5€‡  ¦ˆ€)¾’,Œ)½‘.€‡ ¥Ž‰€'ŽÃ9Œ.“À•3€‡ ¥œ €)ŽÄ¡Aˆ€/“¿“1€‡ ¥ ›€<–Àš@€„€+º.€‡ ¥ › V¤¹‹7ˆ€'‡´‰(€‡ ¥›€ 4yµºŒH C“·:‡ ¥›"(Z—ÆÆ¤uTD:0-5?B9/,:DEQz²Ç§c-€„  ¥€œ!1X…³ÔÙ˱šƒl[[l~‚r_Wg~‘£º×ÛÈtM) €ƒ Ê! /]±ÊÝæèÞ̲—…‰Ÿµ¹¥Œ€®ÊÝåìåßÍ´ƒF€„¿!OлӨÜäîîãϹ«±ÅØÛȱ¦´ÏèóðèÝàâÛ­f €ƒÀ€'*k¬×á×ÑÖäîìÞÎÄÉØåæÙÉÃÍáñóæÖÈÑàèÅ5€Ã€# ;»Ø×ÉÀÆ×éîæ×ÏÒÞæçàÙØÞèïêÙŶ¾ÑàÉ”Nƒ À$GŠºËÆ»·¾Ñèòé×ÌÐÝæçãáãåéêäÔ¿°µÄÒÛ^)‚  À$NŠ­·µ¶»ÂÐãîçÕÉÌÚäçååçæåãßÕǹ¸º¿³—f3 ‚Ä€$VŠ¡¤¨¶ÄÉËÔßáØÎÐÜèìêèèåáÝÛØÓǼ­¨Ÿj9 Ä %*^ˆ––Ÿ·ËÌÁ¾È×ÝÜÛâëïîêèåáÚÙÜßÓ¼œŠ‰pC€ Ä % 7g‰‘š¶ÌÊ·«´ÍãëéèêíîîìêåÛÙÞåÚ»z}Š|R€  Å ->h†Ž‘ž¹Îͺ¬±ÊäñìáÙÚâêðïéÞÜàçÞÀ“z{Š[( Æ€.=a|‡’¥¿Ô×ʼ¼ÍãïåÍ·¶ÈáñóëàÞãëãÈ€yxX* Ç€€'0Mh|’¬ÈÝãÜÏÊÑßäÓ³•’©ÍæìæÞàæïæÍ¤„qk]C!€ È' 2Nl²ÐäêåØÐÐÔѾ …‚—·ÎÙÚÙáêóèΤdN8$€ ½…' =f”»×çêåÚÒÌǾ®‘’𦝼ÊÖäíóæÎ«‰c> „ ½„!9n¤ÊÞççäÝÖÍÀ°¥¤ª®¥—Ÿ¼ØéïðãÖÀ¦yB€ƒ ½ ƒ!H…»ØáããæäàÖۧ°ÂÆ®Œ|’»ßîìèßàÛÍŸ]€€€½ ‚##aŸÍààßáèëêãÓ¼²¾ÐÏ®‡{˜ÆèñêãÝæêä»{6 €Á  ‚$;}´ÔÚ××ÝæìîëâÐÆÍÙÒ´–“²ØîïæßÚààÜ¿‘V%‚à ‚$Q“ÀÐÍËÑÜåéìîìáÚÜáÚŵ¹ÑèîèßÝÙÕɲ›o=‚ Ä ‚$!\ÃȽºÅÖàäèíïëçæçäÜÖÛèðéÜÓÓÐÆ´­¨yF‚Ä  ‚ZœÄÆ´«´ÉØàåêíìêéèìñòåÒÄÁ¾¸­­ªšp=‚à ‚ P“ÀÈ´ ž°ÇÙâåäããåçëðñåϹ«£¦®¼´•]-  'K‰ºÊµ•ƒ‘°ÐáâÞÝßßÙÖÙàèíñéÔ´—‡“±ÍÂ’Q#€  Á €2 )N®À®ˆmwÈßàÛÛßÝÔÏÓÞéíðìÙµu…­ÑÈ—U&   Á;"9V{Ÿ¯Ÿ|bm“ÂÞåââãà×ÒØâìíîëÛ¹t}¡ÇÈ¥g1  Á/)B[x’ ”~o{›ÂÞëìêéåàßâçëèèåÚÁ¡†‚”³À¯z>€  Á/'BZtŠ™˜“™¬ÄÛëòñíêêëìéåààÞÛϺ ŽŠ¯­„H€ Ã.  Ê€(Q†¢ª«´ÀÍ×áéìéâÞâæàÏ¿¼ÇÖàãÜο»½Ä¹m;Ê1 (Y‡™›Ÿ±ÇÖÞãéëêãßáäßÓÇÇÑÝããÜÓÇþ¾µ¢zIÆ6  3bŠ•’–­ÈÜãåçéêèåääâÜ×ÙàæåàÙÔÏɼµ­¥ˆ[) Æ6 7e™—˜¬ÇÛâãäæêëëéèæååèëëåÞ×ÕÒʺ°©¥Œc2  Ç3b¥§¥²ÅÖÜÞàåêíìë€êëíîíçàÛ×ÏÅ·²¬¤†^1Ç6  (\’¯µ´¼ÉÓÕ×ÝæëëèçéêêééëìéåàÚÌÀ¶·±¡|P(  Å €-!Z’¯µ·ÃÐÔÑÓÛæëèãâæëíëéèçååâÛÌÀ·¹²žtF Å €$ Z¡£¬Ä×ÚÒÑÚåèãÝÜâéííëäÝØÙÜÛÐÅ·³©–pA€ Ä  €$$_—•£ÅÞáØ×ßæèäáâèíñôñçØÎÐÖÜ×ͼ°¢“qE€  Ä  €&_Š’‘¡ÅâçàÝâææäãæ€éëìå×ËËÓÝÝÖÁ°žqH À  €%#Wƒ“œ°ÐèìççìïïëééçߨÚãéæÞÜÞåäÞ˸¡ŽpI€ ¼ €%@iƒ›·ÖêìçåéîîæÛÒɾ³·ÉàëéææëèßȲ—€a>‚» ‚€% $Daƒ©ÏåçÞÔÖÜÞл¨™Ž…¦ÈÜÝÛÞéæ×¶˜zcG+… » †$ 1Nu§ÐÜË­ £¨š€iYRNYr“¤¢¢´ÔÜÅcF7'† º ˆ! 3o³Ï·€]YbYC/# !+™Å¨X !  A˜Æ§Nˆ  ¦‰€'ŒÁŸB€„€'‹Â¢DŒ  ¥€)ŽÁ=Œ(¡B€‡  ¥€1’Â>€ƒ€0’ßA€‡  ¥€5•Ü?€€€€5•Ü?€‡  —Ž€4”¾‘/€±€3”¿”3€­€3”À–6€±€3”¿”3€­€2“›=€±€3”¿”3€œŽ € 5•ŤJ± €8–Á–8€ œ’+ŧKº/‘¾‘/¶ƒ¾¡@º†µ†¶"È«Jº'¿'¡Ž16,"[±àÈy7")232•1232†12„34321 6,"^³Ù³^",63œ1Ž’ •†ŠªÜøé¼–‰Ž““’““”““„’““†”““€’ •…Š­ÝóÝ­Š…•”œ’ŽÊ ËÉÇÈÐÜãßÔËÈÉ—ÊÉÇÆÇÉ„ÊÉÇÆ„ÅÆÇÉÊ ÉÇÈÐÜâÜÐÈÇÉËÊœ ž˜‘–›•œ(™”‘”™œ›œš•ŽŽ•šœ›œž˜‘‘˜žŸœŽ- ,-/.)!&,..”-+/11-&#&-220/012.'!'.11.--/.)!!)./-,-ý’"     €€€™’ˆ‰Š‹Š‰“ˆ+‰ˆ‡„}{z{{zyyz{||{zz{~€€~{zz{{z{|~‚…‡ˆˆ‰Š‹Š‰¡ˆ®Ï&ÎÍÎÑÖÛßááàßÝÛØÕÔÖÙÛÚÖÒÒÖÜàââáàÞÛ×ÒÏÎÎÏÐ…ÏÐÐÑÐИϭ»¹¸¸ÂÓèúƒÿ üóêçì÷ýöæ×׿úƒÿùèÕÄ»¹º†»½¾¿¾½˜»ªc,dcc`ah£Èãñöö÷÷ôìßÓÐ׿îäÍ·¸Íéúûùõõíß iaacdd‚cdfghge˜c£€‚+*P~ªÅÏÒÕÙÛÙÕÌÄÂÇÓÚÒ¼¨ª¾×åãÞÖÔÉ»›rF%ƒ˜® N¤´µ´ºÂÈËÍ€ÏÐÕÙÔȽ¾ËØÝÖ̾¶«¡‰g9Ù#2cª­¦¡©·ÃÊÒÚàáàáääáßßããßÓ®¡–’…mFØ%=l’¥¡–š®ÂÎÖÚÜÞâæëîîïííèßηžŽ…†€pN( §«,4`…˜“†~‹¥ÂÓ×ÒÌÎØäíðîìèèãÛŪ||jH$ Ï€) &S|“Žw…£ÅÚÜÏÂÃÒåððçßÚÞßÙ¤ˆ}€‰ƒlD¢ª€*M}˜”ƒz‡¦ÈÞßÐÂÄÔçïèØËÈÔÞÜÆ¨Œ…Œš”wF€Ë€#Pƒ¡Ÿ‘Š–¯ÍààÑÄÈØæçÙõ¸ÌÞáÏ´›•›«¦‡O€Ë€$&Y‡£§¤£«¼ÔâÝÌÀÇØãÝʶ­µÊÞä×­¥§²¬Y$€Å€$ 3c‡©³¹¾ÉÛåÛÇ»ÄÖÞÕź¸ÀÏÝãÛͼ³¬« ‰]-‚ Ä€$AoŠ˜¤´ÀÅÎÝæÜÉ¿ÈÙáÚÎÊÍÑÖÚÝÖÍÀ¸« _6‚ Ä €$Jy˜œ§´ÀÌÚâÞÒËÑÞåà×Ô×ÚÛÙÖÎÆ½¶§™‰{`9‚ Ä  ‚$K~¤œœ¦¹ÌÛäæäáâèêåÛÕ×ÜâàÙ̹´¬§›ˆc7€Ä %Avž¬£›¤½ÒßåêíëçâÜÕÍÈÊÔàäÞÒǽº¶º¯”a-€€Å %0c“°²­´ÊÞèîðóïäÓÁ¸¶¼ÄÑáëëâØËÅÂÅ·“W!€±€‘€% Dsš¯»ÇÕßâãáàÙÈ­’ˆ£³ÂÑÝåæäØÌº¯™uAƒ¦Ž‚% 'Jr•´ÌÖÓȽº°œ}_Vd•¦±»ÈÖãÝÆŸeJ) ‡ ¦‡"!:]Ž½Ìº–~wxq_G0)4L`puw…¥ÎÕ´tB)‡  ¦ˆ!!^¦Â¢`4,55) *75-9l°É¡M‡ ¦ˆ€ <—½“8 €  =˜À”5€‡  ¦ˆ€)¾’,Œ)½‘.€‡ ¥Ž‰€'ŽÃ9Œ.“À•3€‡ ¥œ €)ŽÄ¡Aˆ€/“¿“1€‡ ¥ ›€<–Àš@€„€+º.€‡ ¥ › V¤¹‹7ˆ€'‡´‰(€‡ ¥›€ 4yµºŒH C“·:‡ ¥›"(Z—ÆÆ¤uTD:0-5?B9/,:DEQz²Ç§c-€„  ¥€œ!1X…³ÔÙ˱šƒl[[l~‚r_Wg~‘£º×ÛÈtM) €ƒ Ê! /]±ÊÝæèÞ̲—…‰Ÿµ¹¥Œ€®ÊÝåìåßÍ´ƒF€„¿!OлӨÜäîîãϹ«±ÅØÛȱ¦´ÏèóðèÝàâÛ­f €ƒÀ€'*k¬×á×ÑÖäîìÞÎÄÉØåæÙÉÃÍáñóæÖÈÑàèÅ5€Ã€# ;»Ø×ÉÀÆ×éîæ×ÏÒÞæçàÙØÞèïêÙŶ¾ÑàÉ”Nƒ À$GŠºËÆ»·¾Ñèòé×ÌÐÝæçãáãåéêäÔ¿°µÄÒÛ^)‚  À$NŠ­·µ¶»ÂÐãîçÕÉÌÚäçååçæåãßÕǹ¸º¿³—f3 ‚Ä€$VŠ¡¤¨¶ÄÉËÔßáØÎÐÜèìêèèåáÝÛØÓǼ­¨Ÿj9 Ä %*^ˆ––Ÿ·ËÌÁ¾È×ÝÜÛâëïîêèåáÚÙÜßÓ¼œŠ‰pC€ Ä % 7g‰‘š¶ÌÊ·«´ÍãëéèêíîîìêåÛÙÞåÚ»z}Š|R€  Å ->h†Ž‘ž¹Îͺ¬±ÊäñìáÙÚâêðïéÞÜàçÞÀ“z{Š[( Æ€.=a|‡’¥¿Ô×ʼ¼ÍãïåÍ·¶ÈáñóëàÞãëãÈ€yxX* Ç€€'0Mh|’¬ÈÝãÜÏÊÑßäÓ³•’©ÍæìæÞàæïæÍ¤„qk]C!€ È' 2Nl²ÐäêåØÐÐÔѾ …‚—·ÎÙÚÙáêóèΤdN8$€ ½…' =f”»×çêåÚÒÌǾ®‘’𦝼ÊÖäíóæÎ«‰c> „ ½„!9n¤ÊÞççäÝÖÍÀ°¥¤ª®¥—Ÿ¼ØéïðãÖÀ¦yB€ƒ ½ ƒ!H…»ØáããæäàÖۧ°ÂÆ®Œ|’»ßîìèßàÛÍŸ]€€€½ ‚##aŸÍààßáèëêãÓ¼²¾ÐÏ®‡{˜ÆèñêãÝæêä»{6 €Á  ‚$;}´ÔÚ××ÝæìîëâÐÆÍÙÒ´–“²ØîïæßÚààÜ¿‘V%‚à ‚$Q“ÀÐÍËÑÜåéìîìáÚÜáÚŵ¹ÑèîèßÝÙÕɲ›o=‚ Ä ‚$!\ÃȽºÅÖàäèíïëçæçäÜÖÛèðéÜÓÓÐÆ´­¨yF‚Ä  ‚ZœÄÆ´«´ÉØàåêíìêéèìñòåÒÄÁ¾¸­­ªšp=‚à ‚ P“ÀÈ´ ž°ÇÙâåäããåçëðñåϹ«£¦®¼´•]-  'K‰ºÊµ•ƒ‘°ÐáâÞÝßßÙÖÙàèíñéÔ´—‡“±ÍÂ’Q#€  Á €2 )N®À®ˆmwÈßàÛÛßÝÔÏÓÞéíðìÙµu…­ÑÈ—U&   Á;"9V{Ÿ¯Ÿ|bm“ÂÞåââãà×ÒØâìíîëÛ¹t}¡ÇÈ¥g1  Á/)B[x’ ”~o{›ÂÞëìêéåàßâçëèèåÚÁ¡†‚”³À¯z>€  Á/'BZtŠ™˜“™¬ÄÛëòñíêêëìéåààÞÛϺ ŽŠ¯­„H€ Ã.  Ê€(Q†¢ª«´ÀÍ×áéìéâÞâæàÏ¿¼ÇÖàãÜο»½Ä¹m;Ê1 (Y‡™›Ÿ±ÇÖÞãéëêãßáäßÓÇÇÑÝããÜÓÇþ¾µ¢zIÆ6  3bŠ•’–­ÈÜãåçéêèåääâÜ×ÙàæåàÙÔÏɼµ­¥ˆ[) Æ6 7e™—˜¬ÇÛâãäæêëëéèæååèëëåÞ×ÕÒʺ°©¥Œc2  Ç3b¥§¥²ÅÖÜÞàåêíìë€êëíîíçàÛ×ÏÅ·²¬¤†^1Ç6  (\’¯µ´¼ÉÓÕ×ÝæëëèçéêêééëìéåàÚÌÀ¶·±¡|P(  Å €-!Z’¯µ·ÃÐÔÑÓÛæëèãâæëíëéèçååâÛÌÀ·¹²žtF Å €$ Z¡£¬Ä×ÚÒÑÚåèãÝÜâéííëäÝØÙÜÛÐÅ·³©–pA€ Ä  €$$_—•£ÅÞáØ×ßæèäáâèíñôñçØÎÐÖÜ×ͼ°¢“qE€  Ä  €&_Š’‘¡ÅâçàÝâææäãæ€éëìå×ËËÓÝÝÖÁ°žqH À  €%#Wƒ“œ°ÐèìççìïïëééçߨÚãéæÞÜÞåäÞ˸¡ŽpI€ ¼ €%@iƒ›·ÖêìçåéîîæÛÒɾ³·ÉàëéææëèßȲ—€a>‚» ‚€% $Daƒ©ÏåçÞÔÖÜÞл¨™Ž…¦ÈÜÝÛÞéæ×¶˜zcG+… » †$ 1Nu§ÐÜË­ £¨š€iYRNYr“¤¢¢´ÔÜÅcF7'† º ˆ! 3o³Ï·€]YbYC/# !+™Å¨X !  A˜Æ§Nˆ  ¦‰€'ŒÁŸB€„€'‹Â¢DŒ  ¥€)ŽÁ=Œ(¡B€‡  ¥€1’Â>€ƒ€0’ßA€‡  ¥€5•Ü?€€€€5•Ü?€‡  —t8mk@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfldigi-3.21.80/data/mac/Info.plist.in0000664000175000017500000000202712313064025014071 00000000000000 CFBundleInfoDictionaryVersion 6.0 CFBundleIdentifier %%IDENTIFIER%% CFBundleName %%NAME%% CFBundlePackageType APPL CFBundleSignature %%SIGNATURE%% CFBundleDevelopmentRegion English CFBundleExecutable %%BINARY%% CFBundleVersion %%VERSION%% CFBundleShortVersionString %%VERSION%% CFBundleLongVersionString %%VERSION%% CFBundleIconFile %%ICON%% NSAppleScriptEnabled No NSHumanReadableCopyright Copyright (c) 2006-2008 Dave Freese W1HKJ and others fldigi-3.21.80/data/mac/flarq.icns0000664000175000017500000011760312313064025013506 00000000000000icnsŸƒit32_sÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹[MRV`jx‹ ¯±¦•p`Qd— iˆŠ—¡±ÂÐ׺[[Z†Ž‚[ee™Œ›»^n]TRSZi‰ÿŒ»s]TC‚Oˆ; :537ƒ~–™‰šŸŸ… .>Qs„›ž¨±½ÌÙáå’š››Š€ž–=BEENg–—“”™¦»ÐßäÛÈ´£”‡tbQ4†„±‰ (.AUm‹œ¦±´¾ÇÒßèíð~|tj^RD‰ȵ¯£”p]…I{Š–£ÿˆ"‰¾£‡rbYY\h€™¯·¶¹¼Æ×èôùóäÔŵ£ŒwfTMM%ƒ»ª¹ÿƒVŽ‹fQDAFM]p†ž®ºÇÍØáéóøùú—–ƒteW?’…iz}j‡Žd§£˜Šynns˜°ÇÓ×Ýàæòü€ÿ üòæÔ¾¤Œzlios²‹d—”…te`eky‰›¯¾ÌÛäïöûÿ¨¨¢•„tfT>‘…iz}j‡Ž—¨­¬§Ÿ”ŒŽ”¢·ËÞêòùûý„ÿ þîÚÀ¨–‰†‰ˆ‡ŠzŸ¦¦¢š‘ŠˆŽ”ž§°¿ÍÛìõþƒÿ¼¼¶©—‡zpnmuwhjqx}|j†‹†¢®¥­ñƒ@rzxrm\_r˜°¸»¼¹¸´²·¾ÊÚçôûŠÿ óàÌ»®¨¥–h`J‚+e¯¼½º¶²±²¸ÁÆÉÈÆÌÕâñú„ÿÏÐËÀ­ˆ‰Œ‘‡†‰Ž†R“‚Œ‰‡ƒ‹˜«½ÅÉÍÎÒÕÚâéðøü…ÿýüý‚ÿ ùíàÒǽ¯¢…„~x$4bœ¸ËÐÏËÉÎÖãíñíáÕÐÒÝëöüþýþýþÿâäáØÇ¸¬€¥¦¤ŸžŸ  žš‘aPŒ¶‹6• ¢¢ €ž ¥¯»ËÔÛâæíóúˆÿýûùøùûƒÿýñæ×ų£›™—œ­7g{‘§Á×âäââéóÿ)ïÛÌÆÌÚéõûýýüüþôôòêÝÒÉÂÂÀ¿½º¹¸·µ±¯¯³²¨›’Šˆù†*Tz–®¸¹¹··¹º¿ÅÎÚäíöû†ÿþþýýüú€øúü…ÿüïÜʺ²±°·Åˬ’‹‘¡´Ëáîôôõû‚ÿ)ôÞÈ»»ÈÝðüÿÿþüþþü÷ðæàÜÚÚØ××ÕÔÒÏÊÃÀÁÄÁµ¡zc/…*Xp‹£¼ËЀÑÕÕØÛàéñú…ÿþý€üûùö€ôöøûýþ…ÿñâÔÌÉÆÊÏ̽¬£¥²ÂÖéôúûüƒÿ<÷âʸ³¾ÓêùÿÿýüÿÿùïåÞÝáèîðññðïìçá×ÓÔÕЪ‘uY; l’²æÎ…{{‡œ²ËÝèëìíðñõùþ€ÿþùöôõ÷ûýÿÿýùôñðñóöùüý†ÿ÷íçãÞÜÛÕÌ»¼ÄÒàíóõõ÷ý‚ÿþíÖÁ¸½ÎãôüþüüÿþóãÔÌÎÚêø‚ÿþúôèåçæâѳ’nP=:]‹§¼ÑȬ›’˜ª¾×ëøƒÿþüûüüûøòêãÞÞãìõý€ÿ úõòððñóöùûýþ†ÿü÷ðëæáÚÓÎÏÕÞèîïîíïöû‚ÿõâÏÂÂÎßîøüüýÿþðÛÆ»¾Íãø„ÿýóóøùõâ¿–nRKWyµÆÓο´«­»Ëàòþ„ÿþûú÷òëâØÏÊÌÕâïùþÿþû÷öôòññóõ÷ùú‚ûý‚ÿúõòîêäÞÜÞäêîíëéëñ÷ûþ€ÿúìÚÍÈÎÛéôúýþÿÿñÚõ·Çßô‚ÿþýüøü€ÿ4òÍ¢{fgy–³ÆÓÛÙÑÌÇÇÎÙæñùþþûúø÷øù÷÷ôíäÚÏÈÅÉÒÞéñõö÷÷øúøöó€ðòôö÷øøùøøùúûüûúúûûøòêãßáæë€íîò÷ûý€ÿýòâÓËÌÕãðùýþÿÿôÝÅ··ÄÙîûÿÿþú÷÷øøÿ*üÚ³’ƒˆš²ÈÖàåäááàÞßáåêïòòïíììïòóóïèÞÕÎÊÊÏ×Þä€çêðöüýûøôñ€ðòóôõõôòñðñòóôùþÿÿüñäÛÙÞåì€ïñôøü€ÿüòäÖÌËÓáïúÿÿþÿöâÍ¿¾ÈÙêõúûúöôôõ÷þ€ÿAúâÆ²«±ÀÐßèíïðñôôñìæãäèêëéçæçêîððíæÞØÕÕÙÞâäâÞÙ×Üåðùþþüøöóñïïðñòòñïí€ìíïõü€ÿpôä×ÑÕÞèîðîîïóùþÿÿúñäÖÌÊÒàïúÿÿýÿõæÕËÊÑÞêó÷ùúù÷÷øøûþý÷íàÖÑÓÛåíóö÷øúþÿÿüóëææéëíìêéêëîïïíéäááåéíïëãÚÑÎÓÝèòøûúúù÷óðïïð€ñðïFîïòøýÿÿ÷ç×ÍÎ×ãìðíëêîõûþþúòæ×ÌÈÎÚê÷ýþýýõéÝÖÕÚâêïòõ÷øø÷÷øøõîäÜÙÝåï÷ýÿþþýý‚ÿùòíìîïðïîíîïïîíìïòõø÷òèÝÓÏÒÚãêîðòõùùøõóòEóôôóóñðïòöúÿÿøé×ÊÈÑàìñîéæêòúýýûôèÙÌÄÆÐàðúþÿõîåÞÛÝâçëìíðô÷ø÷øùöîâÕÎÒßïý€ÿþþüýƒÿüøöõ€ôóòðïîïðòôõ÷øúûüúöïåÝÚÛÞâ€ãXåëò÷ùù÷õóóôõ÷ùùøöôóô÷úÿÿüîÛÌÇÏÞìòïèåèñøûýýøîàÏÀºÁÐãóüÿíæßÚÛáèìíììîó÷ùùúúöëÛËÄÊÚíüÿÿþûüûüý„ÿüúø€÷öôòññòõøû€ýbüûú÷ôïëéèèæáÛרÞçñ÷úúùöôõ÷úüýüú÷ö÷ùûÿÿþóâÒÌÑßìóñëçéñøûþÿüôäл°²ÂÙîýÿäÜÔÑÖàëòòïìîóøûûüü÷ëÙÉÁÆÕçõûüúù‚ûüýþ€ÿüú‚ø ÷õôôöøûýþþýûù€øöö÷öóíäÚÓÑÕÝçðöùù÷õö÷úýþþüúùùúû€ÿ>÷éÛÔÕßëòòîëìòøúþÿÿøéÒ»¬«ºÓëýÿØÏÇÆÏÞíööòîîôùýýþý÷ëÛÌÅÉ×çôûýýüþýü€ú ûüýüûù÷öö÷€ø÷÷øùúüýþýýûúùùúúüþýúôëáØÔÔØßæíñõOöùüýýüúúùùúýÿÿûòæÝÙÝåìððïïòöùýÿÿûîÙò®ºÐçúÿ˺»ÈÛîùúõïîôúþþÿþøîáÕÏÑÚæñøûüýýûù÷ö÷€øD÷öõôôõöö÷øøùúúûûüüûûúúùùúúüýýüøòëäßÜÚÚÜàæìñôö÷øûüþþýüûúùûüþý÷îãÙÖÛãìñ€ó4õøüÿÿûñâÏÁ»ÂÑåõþ¾¶°³ÃÙíûûöïîóùýÿÿýøïåÝÙÛáéñöúûúú÷ôóóô€õ‚ôõõöö÷øùú€û…úù€øùúù÷õòîèáÚÕÕÙâëò÷ùùúüþ€ÿHýú÷÷øûýûôæØÏÏÙæðõõóóöúýýûõëßÓÌËÒÞêó²­«²ÅÛîúùôíëðõûýýúôëãßßäêñõøùøöõòððñòôõöö÷øøùùƒúùùúúûúùöóòóõøúüüúôëßÔÎÐØäï÷€úûþ€ÿPü÷óñò÷ýþøé×ÉÆÏßíôõòðó÷úûûúöïäÙÑÎÒÚá­ª¬µÈÝî÷õðêèìñ÷úúöíãÜÛàèðöøø÷õòðïîïñóôõõö÷øùùú‡ùøø÷øøùúú÷óïìíðöû€ÿYüòåØÏÍÒÞêôúûüüýþþû÷ñìëìòúþúìÙÉÅÌÛêòóïíñõøùûýýùíÞÏÅÄÊЮ®²¾Ðáîôðìæåèíó÷öïã×ÒÕÞëõúú÷õòïïîïñóõ€ö÷øúû€ü€û€úùùø÷ö øùùöòîêëïöü€ÿXþ÷ìàÖÒÓÛåïöùúùøõòïìéææçî÷ýüñàÑËÎÚæîïíëîòö÷üÿÿþñÝʺ¶º¿º»ÀÉØäíðìèäãåëñôñèÙÌÈÎÜìøýû÷ôñïðñòôõ€÷øøùúû‚üûûúúùø÷öõ öøø÷õðíìðõü€ÿ*ýøòêâÝÚÜáçîòóñìçâààáâäæìôûûôèÜÔÕÛãéëêêíðô÷ü€ÿ-ðÛÅ´°³¸ËÌÐ×àçììéæããåêðòíáÑÅÃÌÞïûþü÷õòñòôö÷øùùø€ùú„ûúúùùø÷öõö÷ùùøõòðòöúþÿþüùöòîéä€áLäæåâÜÖÓÕÙÞãæèìòøú÷ïåÞÛÜáæèéêìïó÷üÿÿýïÛÇ·²´¸ÚÛßäéììëçåääæëïðéÜÍÃÅÒåõþÿü÷öôôö÷ø‡ù‚úùøø„÷\øùûûùöôôöùüþýüúùù÷ôîéäßÜÚÕÏÊÇÊÑÙâèëìîòöùùôìãÝÜßãçéêëíñõúÿÿüòãÓļ»»ßâçíðñïëèæåçèìïîçÚÎÈÍÛìúÿÿû÷øù€úƒùø€ù øøùúûüûù÷÷øú€ûúúûüûöñêâÚÑÈÀ½ÀÉÖâëñ€ò;óöùùõîåÞÛÞãéëìëìîò÷úúùóëáÓɽ×Þèñ÷÷òíéççéëîïìäÚÒÐØåóýÿþú÷øùù‚ú€ù‚ø÷÷‚ö÷÷€øùùúûûúø÷ö÷ùúûúø÷÷øù€úOüýþú÷òéÞÒÅ»¹ÀÏßíöúùøöö÷ùùõîåÞÛÞåëîîìêëïòôôõõôîâÔÆ¼ÆÒâòüý÷ðéèéëíïîéáÙÖÙãïùÿÿüù÷ùù‚ú€ùƒø÷÷öõAö÷÷øøùùûüýüøóðïñôøùø÷öö÷ùúûüýþýüùòèÛÍÂÀÇÕåóûþýüúùùúú÷ðçßÜÞäëïîìééë€í$ñöúøëÙÆ¸²ÂØîþÿúòëèéìîðíçàÚÚàëõüÿýûùøùúù„ø÷÷öõõôõõö÷÷øùúûýþü÷ðéåæëñöø÷€ö÷øùûüþþÿþûóéÜÒÎÑÚæñúÿ9ýüûûøóêáÜÜáèìîìéèéèççìóûúîÛÆ¶¦¸ÒëýÿúòêèéìïðìæÞÛÝåðùýþüúùøù€ú‚ù„ø÷ööõ€ôõöö÷øùùûýýûöîåÞÝàçïõ÷÷öõôö÷úüþÿ üöíäÝÚÛàéòúÿ€ý4üøðæÝØÚßæëìêèçåããèð÷øîÝ˽¥·ÏèúþøñéçèìïðîçàÜÞæñùýýûúùø†ù„ø÷÷ö‚õöö÷÷øøùûûúõîåÝØØÝåîõ÷øöõõöùûþƒÿ úóêâÜÚÞçñú€ÿ5þýþþûóèÛÒÑÖßèìíêèäââæëðñêßÓɰ¾ÓæõøóîèæçëïñïéâÞàçñøûüúú‰ù„ø÷÷ööõõ„ö÷€øöðéàÙÕÖÜåïõùù÷ø÷øúüýƒÿ ûóéߨÖÛäðúÿÿþ€ý/ûôçÙÍÊÏÚæîðîêåããåçéêçâÝÙÃÍÚçðñíéææçëïðîéâàâêóùûûŽùø÷ƒöõôóóôôööôïçß×ÔÖÝæïöùúúù€øùûý‚ÿúòçÜÔÓØãïùýýüüûùóçÙÍÈÍØåîòðìèåæççèèéÕÚáæéèåäãäçëííéäÞÞãìõúûúƒù€ø†ù…ø÷÷€ö@õôóòòóöøøöïçÞØÖØßèð÷ûýüúøöõõ÷ùüþÿÿý÷íáÕÏÏØåñúüüúùöòéÝÒÍÐÚçñõóïêçè€çèêíñóãäååãàÞÞàäèëìèáÛ×Úãîøüüúø‚ùø…ù‚ø€ùøø÷€öeõôóóô÷úûúöïçßÛÙÜáèðöûýüùõòðñóöúûþþûóçÚÏÌÑÝì÷üüú÷õóîåÛÕÕÝèòöõðëééêêëìðóöùìëèäàÜÚÚßåëíêâ×ÐÏ×äòûþýúøùùúùù‚ø€ùúùù‚ø‚ùø÷öô€ó`÷úüýùôîèãßÞÞáçîôùúùôðíìîòöúþÿþ÷íàÕÏÑÛéõüýú÷õöõïåÝÙÜåïõõñìêëëíïñô÷ùûòðìçáÜÚÚáéñóíßÐÈÉÕåôýÿýûøùúúùù‚ø€ù úùùøø÷øøùùúúùù€ø,÷õóññóöûýþüøôðìèäàÞßãéðõöôñíëíðôøûýüùòéàÛÝåðû€ÿ4ýüÿÿüòçàßåîõ÷ôðíîñöúüüúø÷õóïéäÞÛÜãìõöíÝÍÆÊØèöýþüûùùúú€ù‚ø‚ùƒø€ù€ú-ùøõòîììîóøüþüú÷ôòðëæàÜÜßåëðòòðîîðòöùúúøõïêçéïø†ÿ+üîãÝàèðõõóòó÷üÿÿþúõòýûøôïëèçî÷ýýóâÔÎÒßíøüüúú„ùø„ùƒø€ù0úûúøóíçããæìòøûüûúøöõòíæßÛÙÜáçìðññòôöùûüüýýû÷óðñõú€ÿþÿøêÜÓÓÛçòøù÷õôö÷öóïìêÿýúø÷ü€ÿ õèÝÛàêôùúù„øŠù€ø÷÷€ø%ùûüüùòéâÜÚÛàçïöûüüúùøöóîçáÛÙÚÞãéîòõøûþ„ÿõêãáåêîïîìæÚÌÁ¾ÆØëøýùñèáÛØØÛßâˆÿ ùîåâåíõùúùöõöö€÷€ø‰ùøø‚÷$øúüüúóëáÙÔÒÔÛäïøüýüúùø÷õñëåÞÚÙÛáèîõùü…ÿ"ìØÈÂÅËÒÖÕÔÒÑÏ˵ª¥­ÁÜñúöéÖÅ·°²½ÍÛõö€÷ øúûúõëàØÖÝéö€ÿüøö÷…øƒùøø€ùøø÷ö%÷úûýüöðçÞÕÏÍÑÚåð÷ùûúûüüûúöðéáÛÙÜáçîôùþƒÿ2ð׿«¤§®·¼»¹¶³±¯¨ž”–©ÅÞííÞĪ•Љ—´ÖÓÔÖØÚÝáâÞÖɽ¹¾Íâöÿüùúûúúù‰øùø÷ö€õ÷ùúüýû÷ðçÞÔÏÏÕÝæíñöùüÿEýúôìäÞÝÞáäéîõüÿÿýóæÔ¼¤ˆ”Ÿ¦¥¢™—–’Šƒ~ƒ“«Ã×ÞÓµ”yiai‡Ò«¬®²µº¾¾¹°£˜™¢·Òëÿþûýýüüúùø÷÷ö÷øùúùù÷õõôõ÷ùúüþþýùóëáÙÖÖÙÝáæîõü‚ÿFþü÷ïéäáßÝÞàãêîíæ×Ƕ Šsjpy‡ŽŽŠ„||zuojo}£¹Éǧ~^H2†‡Š“˜œœ–ƒ|€Œ¢¿×íú€ÿüýüü€ýüüûùøöõ€ôõ÷ùúúùøöõõöøúüþÿýøðéâÝÙ××Üãìõûýþþÿ-ûöïéäÝÙÖÔØÙÖͼ«š‡tWHT_q{yuohefd_\\dnz†—­»ŸkF.€cehmsx{{uof`ix¬ÁÕãí÷÷ôôòõøü€ÿþûøõóòñòóõ÷ùúúøöõõ÷úüþ„ÿûöïçߨÕÖÛâéïó÷ûþÿþøóíãÚÑžº²¡‘lT‚" „ N\bgmv„…4GILRX]__XVOIUfšªºÆÓáéëìëïóøýÿÿþüù÷ôóòñòôöùúúù÷ööøúüþ†ÿ úñéáÛÙØÙÜàæîôú‚ÿþüûôè×Á±£›•‡zlQ.0NPL<‡)*.4;?@?9?5%5HmŠ•¡«·ÇÕßåæêìïôö€÷øø÷õôóóô÷ùúùø÷öö÷øùúüý…ÿúôíçáÛÖÔÕÛåíôøúûüþþ€ÿ úàÀ¥Œ|r^WQA=+‡ÇŒl{ˆ‘œ­¿ÐÜâåãâäåæëïôö÷öõôõöø ÷÷ööõóòóô÷úüýþÿ þû÷òìãÚÔÓ×àèí€ðóöøÿ㼚y]8 ˜]t~‰š¬¿ÐÚßÝÙØ×Øßæíñòóóõøúûúù€÷öõñîëêìîñòóô÷úýÿü÷îåÞÛÝáäæåãâåìó€ÿþÛ´’qR ˜Ž"]m{Œœ­¾ÊÓÖÕÕÓÔÚàæèèêíòùüýûùø÷÷öôïêçåäåçìò÷ûþ€ÿþùòíéçæåâÝÙ×ÙãîýÿÿéȦ‰lQ‚²|t}›•’Œˆ…‡|sosƒÐzgSD=6 Jh~‹˜§´ÂÍÔÙÙÛ€ßÜÙÛâìöûûúøöôïëèåãßÚ×ÖÚáêñõùûÿýúõòíéãÜÖÒÓÝèóòäÊ®’{aE„jss„€d…€d‚ \]aekoqqkq~ƒ0Yt|„‘Ÿ±ÄÔáéîñëáÔÌÎ×äïôõõ÷úüüú÷óñîëåÞÕÏÍÒÚãèëíïõùþ€ÿþûöñìåàÜÚàäãת“}mWDes‚d€dcdccdcd€d‹‹‹ƒøƒEYbix†Ÿ¸ÐâòýÿøåÐÄÅÏÜæéêìñùþÿýûù÷õñëáÖÏÎÒÙßâáàâèð÷þÿÿþûù÷ôðîìçäÜͺ¢ŒybOyY¦‹‹†‘°‚+@H\o¯ÈÛìúÿøåÒÇÉÓÝââáãéôúüüû€üùóêàÚØÛàâàÛÖÕÛãìô€÷øúþÿþýúïáÍ· ˆub?ƒct¦‹€nxz„2&J„¦½ÍÚåêæÜÓÐ×áçæáÝÛßèíðòõùýÿÿûôíéçéìêäÜÓÐÓÚâèêéëï÷ÿøèÓº¢ŒtbLƒ‹^kª||y†Zš­¸¿ÄÈÉÊÏØæðóîäÛÔÒÕÙÞãéòú€ÿû÷öõööòëâØÓÓ×ÝßÞÜÜâìùÿÿ÷çÒº¡‹w[>„Znª€|yf‹„:Šš¢£¤§«¶ÅÙìúÿýñäÖÌÈÉÎÔÝèñøýýüüýþÿÿü÷ðèãááâáÝÙÖÚàéïìàη¡‹yhEƒkysn©{€W_n„tˆ††Œ’£·Ïå÷ÿÿüìÙÊÂÂÇÏØàèîóõöùüƒÿûøóòðëæàÙÖÑÑÒÍÄ´ž‹whY‚wZV€n¬lar†Q`fqy¥½Óç÷ÿúêÖÆÁÅÍÕÛßáâæèìñöûþ„ÿþûöòëÞÑÁ¶°ª¤˜ƒq[H$ƒ•[ii®l‚–Ÿœ‚ 5P^|•ª¾Ðßèä×ÈÀÆÒáëíéâÜÜÞâéïõùý…ÿþùðÞɰŸ“‰„}fU7‚ikk€i³««§†-N~—ª¹Ãȹ±´ÄÜóÿÿøéÜØÙÞåëðóõ÷ùûýþýþÿùóæÒº ŠyfW=†knn·««ª¬† V†š¤©©¢›¦¾Úõ€ÿ ñãÝÜßãèéèåâ€à ááäçåßÓÀª“}hF†—knm¶«€q}Œ»„)sŽ“”‘Ї‰—±ËãôúúóêåââãäàÙÑÉÿ¾¿¾ÁÆÈż­›ˆu^„œgTY€n¹z†'y€~{ttw…±ÂÒÞéíìèåäâßÖ˽¯§¢  Ÿ¡¥¨¨£—‰ygF†pYh½z†']onkcfgr†’Ÿ°ÁÔâéçåâàÚÎÀ¯“ŒŒ‹ŒŽŒƒxk^;†pYh¼u}‚£%HTVIN?Jhr“¨ÁÖâãáÞÜÖÈ·¥’‡ƒ€~}zs`K$*°sh`HhÁÿˆI`y‘®ÈØÛÚØ×ÐÁ¯š†{wuwusqk^…ÞjlkÆ€‰Ž††Cb}¹ÍÑ Ë½©”€vsrtrolbBƒÿ}oy€lÉ‹‡Š R¤±¶¸»²€bF€:CC='†p{Í‹‡§p{ÌŠ€ÿ–Œ…€siw»˜‚{v^{ÔjVu™‚z{zÚjVu™‚zz{ÙjL\m‚˜²É×ÙØ××ÒÄ´¡Ž„€~}|zyx{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹ (4EYik`O<* ‚ —U JMV_n…°¹º=Ž< ™UUOe»#;%";ÿŒx2 ‚ˆ  ,DUj³»€#›^ŠÇ€#›^Š’„€saM=2&‚,c€ÿ›NDFFˆ .@NOD4! „ÿN$Lw}MKKt‰$0@Xt‡A&--Ÿcda &7L[^SA,ˆ;XMMxwxvŽ -@L\uޤ¯‡A&--ŸcdaŒ #0CYjmbP:&†òAML€xv BLZfw¦·¿‡N4;Tÿr€ts™€sˆW YWUUSRR_ccb„.0-06CVm}‚xeP>1( „9MP[ouyŠ 4L]ko{‡˜®ÀÌÒ’sttŠ€WSŽ.DIGHMYm‚’˜~jYJ?0"ˆL} 1SizŠ‘Ÿ«ºÍÚáäHA5' ‹³–‹|jUC0†/?JU¶ˆ!JC6,2I`ijmq{Ÿ­³® n]H5'„`]p®„DM4%!/?Sn‚”©¶ÇÕàîôõ÷kfZI6&“[;Q-9Ž$KWUMB4**-9Of}Š˜œ¤²½ÆÌÌÁ¶¦‘y^G6'$'&9‹SccWI>:@FS`o…—¬Å×ìø‚ÿƒtaK:+’[;Q-9Ž$O_cc_YPILRav‹Ÿ­¶ÁÆÊÒ×ÚÞàÚÕȲ™{`M>:<72Š,lvywqkfgpw‚ˆ¬ÁÜð„ÿ ‘~gTG==?II68@HLH)†-5;U[V_ ƒ33:842&-?]osuvuutt{…“¥³ÂÌÒÛÝßââáãåãâÜ̹ž…q`YVMF1"#ƒ8dЙ𗓑– ¬´¹¶±´¼Íåø„ÿ¼º°ž†se^aeif[Y\adaU “@HKIGIJUbr†ˆŒŽ•›¤°»ÆÑ×ÝßáäãââääæäÛѾ«˜…yn_SB;=;8 5Yzœ²¸¶±°¶ÂÓãêèÚÈ¿¿ËàòÿþýþÛÚÒ왌„……„€xvxyzxsg$€\¯Œ5NWYZYY]bmx„’™ž¦«µÀÌÙáæéçåâàÞÝÝÜÝÝßáâäåáÞÔʽ«œŒwfVONLMA€ 4Mk‰«ÈÖØÕÔÜèø€ÿ)îÔ¿¶¼Îãôýþýúùû÷õîâÐÀµ­«¦£Ÿš™™—–“’”–Ž~ngcqÿ‡ -Haj€l>msyƒ‹•¢ª²¼ÃÌÔÛãåäâÝÙÖÔÒÐÏÐÒÕÚÞâäåãâÜÙÔɽ­–‚pgc`aaX@HQa}š»Üïøöõú‚ÿ)ó×½««»ÔìüÿÿýûýÿÿûðâÙÓÎÌÇÃÀ½¼»·´®¬­­¥“{hR=† !CTh“Ÿ€¥$©ª­¯±³µ¶µ²«¢—ŒŽ”›¡¤¤£ ž ¤¬µ¾ÈÏÕÛÝàáâ€ãÞØÍµ¦™ˆƒƒˆ–®Éâ÷„ÿýþþûïÛĵ³¿Ôé÷þÿýþÿð׿°²ÄÞö…ÿwøöùöïÖ§q8 7Sm}m`TT`p„• ¦¥¢£¡¢¥§¨©©¤ž“…ypot}ˆ‘–˜š™™Ÿ¦«±ºÁÈÏÓÖ××ÙÛÝÞßÚÓȹ«¡™”’”¯ÆÜï÷üûùûúø÷ùúûõæÓÁº¿ÏâóýÿÿþÿðÔ¸§©¼ØñŠÿséµy= .Mey‡ˆzqmqz†‘š›—”’’•™œŸž™„wledjs|„‰Œ“—Ÿ¢£¥«±·¿ÄÈÊËÎÏÑÓÔÓÐÉ¿¶¯©£žšš¤´ÉßîùüüýûùøúûýúïÞ˾¼ÈÚíûÿÿþÿñÕ¸¦¦·Ñêû€ÿüû„ÿzó¿„L+%/Gat…”“’Œ†‚„Š’Œ‡„…‰“––‡}sljlpvz}~€‡— £¥£¢¥§«°´¸º»½¾¿ÀÁÂÃÁ½¹¶²«¤™’”Ÿ³ÍãôûüþüúúûüýûòâÏÀ¼Å×ìûÿÿþÿòÙÀ®­»Ñçöüüûø÷ûþ‚ÿ4ë¾dNKTfy‡”ž¥©¬© –Œˆ‰ŽŠ†ƒ„ˆ‘””‡€{z{~‚{ww~‰• ¥§¥£ ¤¦©«­®®­®¯±³´€³°«£–‰…‹ž»×ïúýÿüûü€ýûóäÑÁ¼ÃÕêúÿÿýþñÜǺºÆÙëøýþþýüþÿFûëÒ²•~uv}‰•ž¨±ºÀÄÁ·©ž––™šš˜”‘‘’•—™—“ŽŠ‰‹Ž’“‡~usy„šŸ¢¢¡¢ žœž ¡¢¢¡¡£¦©ª¨¥ ”†}~¬Ìéùþÿüûþ€ÿüõçÕú¾ÍâôýÿüùîÞÏÆÇÑàíöûü€ýþ€ÿûèÒ¹¢–’—¤¬´¼ÅÎÔ×Òɽ³­¬€­!«§¥£¢¢¡¡ š˜™œŸ¢¢”ˆ~y|ƒ‹‘”—™œ¡¢¡Ÿœ›šš›Ÿ¡ Ÿ“„zw„£Æèûÿÿüûÿý÷ê×öµÁÖëøýýîäØÎËÏÚæïõøùüþ‚ÿBòؼ£“’˜£¬²·¼ÄËÓÚÞßÜÖÐËÆÄÄÂÁ¿»¹µ²¯¬ª¨¦¥£¤¦¦¨¨¤ž”‹‡†ˆŠŠˆˆ‹‘™Ÿ¡¡ žœš™˜€—4˜š›œžžž–‰}v€ÁäùÿÿûùþÿþÿÿûñßDz©°ÃÛïúþâÙÎÇÉÒÞëòõö÷ûýÿ)ýìή”†Š—§´¼ÂÈÐÖÛÞÝÝÛÙØ×ÖÕÔÑÐÎËÈÿ»µ²¯¬«©¨¨€§¦£ž™–’‹…~z{‚˜ ¤¥¤¡›š™˜M™›œž š…~† Áã÷þþù÷üýüþÿÿ÷äÉ®ž ³ÏéúÿÕËÁ¼ÂÏàîôöõõùýÿþÿÿúèɨ„“¦·ÂËÒÙÛÜÙÕÓÑÒÔÖ€×ÕÓÒÏÍÈÄÀº¶²­«¨§¥£¤£¢¡ž™…{srw™¡¦§¥¢Ÿ››š™™š›žžŸ¡ž–‰¤¿Ýñùû÷õøúúþÿÿûéͯ›™ªÇåûÿÆ»±¯¹Ìáñ÷÷ôôøüþýÿüôâĤ‹„•«¿Í×ÜßÛÖÏÉÅÄÆÈËÌÍÍÌÌËÉÇÄÁ¾¹´°ª¨¥¤£¡ ¡¡i£¤¦¨¦¢šƒzuuzƒ—ž£¤¢ œ››š™š›ž ¡£¡œ˜“•¢¶ÏãîõôòõöøýÿÿýîÕ¹£©Ãàøÿ·¬¢¢°ÇßóùùõóöúüüýúòáǪ’†‰—­ÂÑÛÝÚÑÈ¿¸µµ·¹»»‚¼ »º¸¶´±®ª¥£ ŸŸž ¢¥©ªª¦’ˆ€{yz€‡‘›¡£¤¢ŸŸžžŸŸ €¡G¢£¢ ž™˜žª¿Óäðòñòóöüÿÿþòßdzª°ÄÝôÿª ˜š«ÅàôûúõòõøûûüøðàÈ¯šŽ‘œ¯ÃÐØÖÏ÷®©§¨««€¬««€¬«ªª©¨¦¤¡Ÿ‚€žŸ¢§­±²®§’ˆxux‚Ž™¡¦¦¤££¤¥¦¦¥£ƒ¡—–›¬ÂØë€ñ>ðõûÿÿýöêÙÇ»ºÄÖéöŸ˜”š¯Éã÷üûõñô÷úúûôéØÁ«›”˜£´ÄÍÏËÀ³¨¡žž¡£¤¤£¡ Ÿ  €¡‚ Ÿž€Ÿ ŸŸ¡§¯¹¿À½´¨›Œ~tpuœ¤§¦¦¥§¨©¨¥¡€ž ¢£”Œš²Ìåðòñïôù€ý9ûõêÙȾ¾È×ãž™˜ ¶Ïçøüûõñóöúûûñâ͵£˜•œ¦³¾Ã¼²§Ÿ››œŸ¡¡ žœš™™š›œ‚ž{Ÿ ¡¡¢ŸžŸ¥°½ÉÏÏÇ»¬›‰zoovƒ‘¤§©©ª©§¤ œ™™šž¡£‘‰†“ªÇâðóóðôøûüýÿüóâͼ³¸ÄТ ¢­ÂØìùûùôñò÷ûûøéÔ»¢”“ž¦°¶·´­¦Ÿš™šœŸ  Ÿš˜—˜™š››œœž‚Ÿt ¡¢¢Ÿžž¤°ÀÏÙÜÖ̾­œ‹|uu|ˆ“¤§¨¦¡œ—”’“•˜¡¤ž“‰…¦ÁÝíóôñõ÷ùúþÿÿùæÍ·¨¨²»±°³½Îàïøù÷óòò÷ýüõáÆ©†ˆ‘¥«­«¨£ ››Ÿ¡¢¡ žœ›šš›œ€žŸŸ„ L¡¡¢¡  ¤¯¿ÏÛáÞ×Í¿±¡„{z†˜™’Ї‡Š”˜¡¤Ÿ•ŽŠ”¦ÀÛìôöôõö÷ùýÿÿùå˳¢ §¯ÅÄÆÍÙåïööô€òøþûñظšƒ}…ž£¦¥£ žžŸ ¡€¢¡ ŸžžžŸ „¡ Ÿ  ¢`¤®ºÊØáâßÙÏŸ¨™‰€|{‡Š‰„}xz‡–›Ÿ¡¤ ˜“—§½Øëõùöõôôöûÿÿ÷äÍ·¦¢¦ªÒÓÖÛãêïóòññòóùýøêͬ||‡” £¢Ÿ››œž  €¡  ŸŸ€žŸŸ „¡` ŸžŸ¡¡¢¢£ª´ÁÑÜâäãÝ×ÎÀ±ž…|yyuqliks‹•›Ÿ ¢¥¡›–‘•¡µÑæôûøõòñóøýü÷é×ų«©©Ô×Üãéíïðïîðòóùûô䯧˜¡¢ €œžŸ €¡ˆ …¡h¢¡¡Ÿžžž ¡¢¨¯¹ÈÓÞäæåâÜÒÆ³£”„yoc[WZev‡•ž¡¢¡¡¤¢˜‘’œ°Ìåöþûöðîðõø÷õíâÔö­§ÆÎÙåíðïîìíïóôøøîÝÀ¥‘‡Š”œ¢¡ŸžžŸ €¡  Ÿ ‰¡d Ÿžœ›™˜šœŸ¥ª²¾ÉÕÞäççäÝÕÅ·©–…s_SNVh~’ ¦¥¤¡ £¢ž™‘—ªÈãöÿüöïìïòôóôñíãÑ¿®¢¯½Ñäòôñíêëïóõ÷ôçÔ¹£•Ž“šŸ¢ žžŸƒ „Ÿ€ ¡ ¡¡€ `Ÿ™•’‘“—ž£ª´½ÊÕÞäççäßÔË¿­›…n]V\nƒ—¤©§£ Ÿ¡¢Ÿš’“£¿ÚðüûöïìîðñðôööïÜÄ­œ•¨ÄÞò÷òîéëïôõöñâ϶£™•™ž ¡ ŸžŸ… €ŸžŸ€ ¡¡ƒ ;¡ ¡¡ —‘ЇˆŒ”›¢¬´ÀÊÓÜáäåäÞÙÒÄ´ ˆuiit„•¢§¦¤ ž  Ÿœ”‘’žµÏåõø÷òîð&ôøûõáȯœ†¼ÛóùôïéêïôõõîÝȱ¡™—›  ¡ ŸŸ  ¡‚ ŸžžŸ‡ ^¡ ¡¢¡ž™‘ˆ‚€‚‰˜¢©´¼ÄÏ×ÝãååãßÖ˼¨•„{{Œ˜ ££ žžŸ Ÿš–“—¦ºÑåðöôñòñððõùüøæÐ¹¨„›»Úóùôïêëïõö÷ïÝǯŸ˜—›Ÿ€ ŸŸ† †Ÿ… aŸŸ  ¢££¡•‹ƒ|z~…Ž™¡ª±·ÂÊÒÜâåçæâÜÔÅ´ …ƒŒ•œ  žž £ ›”—§½×éöøõôñðñõøúöéÙɽ‘¥ÁÜòøôðëìðõ÷øðÝÆ®—•šŸŸ‹ ‡Ÿƒ Ÿ¡¤¥¦¤ž•‹zy}…˜¢§¬µ½ÅÑØßã€æAâÙ̹¥“„ƒ‰“šžžž¡¥¤Ÿ”Š‹–­ËäõûøöñðòôööóëãÛÕ«¹Îâòöôñîîñö÷õëÖ¿¨š––›ŸŸ ‡Ÿ aŸžž ¤¨¬®¬¥šŽ‚{z~†Ž–œ ¨¯¶ÂËÔÛàåèèãÛ̹¥„Š’šŸ¢¦¦¡•‡ƒŠ ¿ÜòúøöñïñóóòñïíëëÅÎÛèòôòñïïó÷öòäͶ¡–•—œ Ÿƒ €Ÿˆ „Ÿ€ gŸŸžž¡¥«³¹º¶¬Ÿ‘†~€†“˜ ¥¬¶½ÆÎÕÛáäãßÕÆ³‹€|‚Œ–œŸ¡¤§¦£˜Š„‰œ»ÙñúùõïíðññððñóöøÛßæíòóòðññõùôê×½§–’•™Ÿ¡ŸŸ  ¡  Ÿ† Ÿžž‚Ÿ€ d¡£§¯¸ÁÅĽ±¤–‹„…‰—£¬±¹ÀÆÎÔØÚÚÕ˼§”…}€ˆ”¡£¥§§¦‘Š‹›·Ôìøøõîìïïðñòô÷ùüêìîðòòñðòóøùïÝħ”Š–œ¡¢ Ÿ ¡¡  ‚Ÿ„ ŸƒžNŸŸ ¢¢£¤¨¯¹ÃËÎÊÁµ§š†€…Œ“›¢§®²·¿ÅÊÎÐÎɾ®œŒ‚‚ˆ“œ¢¥¥¦¦¨¢˜Œ•¬Çâñõôïëîîïðòôöøùõôô€õóñõ÷ýýîÖ¶—†Š–ž££ Ÿ ¡¡  ‚Ÿ„ ŸŸ†žhŸ ¢¢££¦­·ÂÍÓÒ̵©œ‡|~ƒ‹”£©«®²¶¹¼¿¿½·­¡–Ž‘š¢¨ªª©©¬ª¢™’”¥¾Úîøúõñòóöøù÷óðîùøöõôóòðôøþûèʨŠ|}‰˜Ÿ££¡Ÿ ¡¡  ‚Ÿ„ ŸŸ…žAŸŸ  žžŸ¦°¼ÈÐÓÏȼ±¦š…}z|‚Œ•£¥¦§¨©«­®®¬¨¢œ˜—𠧬­¬ª«¯®¨ž“Ž™®Ìäôüû€÷úûúôíçâÿþüûúúùøýÿÿû寤ˆš ££¡„ ‚Ÿƒ „ŸNžžŸŸ Ÿ˜–”•𣝽ÇÍÌÆ½´«¢™Ž…|~…Ž—ž¡¢¢¡¡¢££¤¦§¦£žššœ ¤¦¥£¥¨©¤›„ˆ˜¶ÖðÿÿýøòðîêãÝØÕˆÿ öÝ¿£ˆ‹•ž¡£¢¡Ÿ‚ ƒŸ€ Ÿ€ ŸŸ€ ž™“ŽŠˆŒ“ž«¸ÁÃÀ¹±«¥ ˜‘Š„ƒ‡Ž•š€Ÿ€¡*£§ªª¥œ’‹Š“”’”—˜•tr|™¿ãýÿûïàÖÍÈÄÄÇÉÿþüüû‚ÿ÷äȯ›”œ€¢¡ Ÿ€žŸ‚ …Ÿ o¡¢¡  ¡  ž˜‘Š„~Š—¥±¶µ±«§¤£ ˜‰„‚„‰Ž”™›Ÿ¡¢¦¬®¬¡~rnquy{z|{n_Y]vÉë÷ïÞÆ³£›™¢±½ããââãéðôõëÙÁ§•Ž˜ ¦¨§¤£¢¡ŸžžŸŸ …ŸU  ¡¡¢££¢¡¡  ž™“Œ„|vuz„‘ž¥§¦¤£¤¥¥¦£•‹ƒ€…‹‘–› ¥¨­¯«¡yfWSW[accehjig[MEEY{¥ÉÜÜÌ®”~qo{•´€·¹¼ÃÌÑÐį–w{‡™¦­­«¨¥¦¤¢ €Ÿ‚ „Ÿ  ¡¢€£¢¢¡€Ÿd›˜’Š€wrrx‚‹’–šœŸ£¦¨ªª§Ÿ•‰‚~€ƒˆ“𣍫¨ŽzbM>;@EKOORTVVTK=52A\~Ÿ¸Ãº›{_NFLh«††‡‰•Ÿ¤£—ƒl\Ydx¡ª«ª¦¥¦¦¤¢ Ÿƒ ‚Ÿ ¡¢£J¢ ŸžŸ™“Š€xuux}…Œ“𡥍ª«ª¦’‰ƒ€€„ˆ’™œ–ˆvbK6$ (-5:;=@BBA8+!(=Vp‹¢§‹cA+€[[]`env|zq`MDESj€’¡¤£¢¤£‚¢¡¢¡ ŸžžŸ ¡¢¢££¢¡ €ŸC ž›•†|ywwy€‰’𠤧©«©¤›”މ†€|yx~„‡‚sbO9% #)),/110(*9I^{•„R)"2359?GPUSM?1.3D[n~ˆŽ”•”—™ £¥¥¤¤£¢¢€£¢ ž€4ž  ¡¢¢£¢¡ ŸŸ ŸŸ™•ˆ€yutx~†Ž–£§ªª§¢ž˜”‡}rfcdih]O>' &/?…!)0430'&9O\hou~ƒ‡Œ–›ž¢¢€¡£¤¦§§¥¢Ÿ2ŸŸ ¡¡¢¢¡ ŸŸ  ¡£¢¡–Ž…~ywx{‰”œ¢¦§¦¥¤¡¡Ÿ˜Šu^NDDIF@3*0FMTX]gpzƒ‰’”—––˜› ¥©«ª¨¥¢ŸžžŸ€ -ŸžžžŸ  ¢¤¦§¦¢œ•†~xuxŠ“šŸ ¡¤¦¦ª®«š~\A+ !/1œªŒJ3:@CHS_mz‚‡‡……„…Б𡦩©¨§¤¢ŸžžŸ  Ÿ›™˜˜šœžŸ¡£¦©©§¥ š“ˆxw{„Œ’–˜šŸ£¥­µ¶¤‚Z8¢{I%15;GTbpy~}yywy€‰“šž¡£¤§§¦¤¢¡¡¢¡Ÿ›—“’“”–—˜š¢¦©ªª©¦ —…€€ƒ‡ŠŒŽ•œ¢­··¢X5¢{ŽH *3?JVbjqstuvy€†ŒŽŽ‘•›¢¦¨§¥¥¤¤¢ š•’Ž•›¡¥¨ª««¨£œ•‹Š‰ˆ‡†‡Š“œ¨®©’rP2„]3,3ENV`js{…Љ†z{‚™¡¤¥¥¦¦¥£ ›—•’Œ‡‚‚…Œ•›Ÿ¡£¦¨©¨¦¡œ˜“‰…‚‰’ššŽx]B*…I&//„€ …€ ‚ ,,.28@GKJP@A<ƒF!024;CQcv‡”œŸ–‡uhhq–œ £¨©¨¦£Ÿ›˜”„}{†Ž’“”•™ž£§©¨¦£ ž›•‰ƒ…‡‡o[H4# ƒ‚/‚ €… € ‹FF@ŒƒD$-B[vŸ¬¯ ˆn]]gu‚Š”›¤¨©¨¥£¢¢Ÿ™‘†~|†‹‹‰†…Š‘™ ¥§§¨¨©§¡œ•‹„{qcQA2 ‚0¦FEFD?…@ 7Wsˆš¦¨›„l_alx‚ƒ‡Žš ¢££¤¦§¥ ˜Žˆ…ˆŒŒˆ€yvzŠ“˜œ¡¦­²´¯¨Ÿ€n\L9,ƒ¦F€,57†=2Vm{†Œ„wliq}†‡‚}|ˆŽ’–𠥍©¦ š–“••’Štnou}„‰”©´¹´ªœ‰u_K:' ƒ)ª564†;!Uaghhgdcgs„’˜”ˆ{rnrv|ƒ‹–Ÿ¥©¨¥¢¡Ÿ ž˜„wporw{}ƒš¨¯«ŸxcM:)…'ª668*„jSOJEFGP`x¢ª¦•ƒqebdjr}Š•¤¥¥€¦§¦¡›’ˆ‚~~~|yy‡‘—“ˆwcP>.„(4%©5€ %B„863+'+0@Xt¤°°¡‹tb\]clvŠ’šŸ¢¤¦¨©¨§¤ž™”’‹…wusuvtl`O@0$ƒ"€¬"‡51Mjƒ˜¦ªž‰qa\aks{€ƒ‡‘•𡣦ª­®®¬§¤¢›”Š|n`XTPNG9,„H$$®‚JRM†0&E_s…‘•‹yg_drŒŽ‹…ƒ‡Œ’—›Ÿ£©¯³¶¶³±¯¨ “jRC90.-!ƒ €$³^^Z†,:Ufszyn`UVf–¥¥œ‚€‚‡’—™œ¡¦ª®°®¯®§žzbG2!‡ ""·€^M†(L[cd`TICKcœ®¯§˜Š…„‡‹Ž€Ž‘”——™›—‚oYA*ˆI""¶]€(7i„(HUXTM@74?ZuŽŸ¥¤œ’Œ‰ˆ‰‰†zurrsvwz}~zpaP<)…A!€"¹$!%†'QNF=0(%0I_qŒ•—”Šˆ†ƒ{rf[VUVZ[^adb\PC3"†,&½$!%†'iI<2$6DRbq‚‘‰…‚~sfXIBABFIKMONI@5+% †,&¼$(,.%E/$ )6GZpŠˆ…~yl]M=656<>@AA>6#PW&&ÁLLJ®‰0E^s€€}zxreTB2**,36886-†|ÆL€R\Kˆ2Metutssm`N<,%&*14652 ƒÏ6*4€ÉT_M‹ +ISVWYQ>#†;,6ÍT_M§;,5ÌT€ÿgYMB. )^˜HA<56Ô#,™>BBAÚ#,™>€BÙ# &8Kat~|zythYI:346<>@A€BBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹ *>PUM>+ƒ—^ %SW`jy§ºÂº  Ž, ™__Yo»5  /ÿŒd$ ƒˆ  2K\p±»€œL ŠÇ€œL Š’Œ‰}kWF:-$‚3R€ÿƒA796Š +<@6(„ÿ: 7y‚‚OLLw‰6APhƒœª‡J,44ŸQTP  2DJA1 ˆ'@67zyzwŽ:LXi›¯¹‡J,44ŸRTPŒ  &>6208I^owrcRC7." ˆEqŒ"7WkzŠ‘ ­½ÐÝäçVQD5&Š» •†s]J5†#.7Ažˆ!<3)" (@U[WTRXgx†sdVG5% „FHX}„NS7'!&5FZt†–©´ÅÓàîôö÷uqfTA0 ’cAY!+Ž$ AIE=4'!-BYoy{}|€‹– §¨ •‡t_G3#D‹XfeYK@>DKZgwž°ÇÖèôûÿ‹ˆ}kUC3‘cAY!+Ž$FQTRMH?9;BPey˜ž¥¦¨®³·¼¾¹³¦‘z^G6)&'#Š@qxzxqlhkt|ˆ˜§¶Èàñ„ÿ¥£˜†o\MBAAJL<@IRWS6†,33DA>Es„2"))&&!0K\`bb``^^dn{›©±¶¼½¿ÂÃÃÆÈÅûª–}fTE?<4-‚Ip›š–’‘˜£°¹¿½º¿ÈØíü„ÿ¾½µ¤Œxjacfki``ejmk_“3+255467AM[joquv{€‡’¦±¶¼¾¿ÂÄÅÈÉÉÊÌÊÊÆ»®š‡udYOA6)&,03(Cc€Ÿ³¶³­­µÃÕæíìàÑËÍØêù‚ÿþÿÛÚÔůœ††……ƒ}}‚€{p8qÌ‹F;>>??@DHS]hv}‚‰–Ÿ¨´»¾À¾¼¹¸¹º½ÀÃÆÉÌÍÍËľ°¤–„vgTE96:=A;AFLPRQQTYahl€ortx~‚‡Š’”•˜˜–„xld]\\bv±Õîÿþüþ€ÿ üòãÒÅÂÊÚìúÿõßÉ»»ÇÛîûÿÿþúùûƒÿS終R826COW`hpw}}wnd^\]]\YUSRTXZ\[VOIFFINSUSOJHMU`inpommlmoquxz}}~~ƒ„‚{qhaZYWYg}Åäü€ÿýûþ€ÿ ûòäÓÅÁÈØëúÿôãÒÇÈÓãóýÿþ‚ÿ4üêÌ£cUSU\chox‚Œ“”Ž„xpmnnomifcaa`_\VQMLPUZ^]WNFBENYbg€ijhgfgikmnmllnrvvrkc]XYVT]l‰²Öö€ÿüúþ€ÿüõçÖÆ¿ÃÒåõþÿþüóæÙÒÔÝêõü†ÿ<ýèί{mjlmrv{ƒ˜¢©©¤›‘‰††…‡†ƒ€zuqlhc^ZWX\`ehf`VLFFKRX[^`dikkj€ihgeb`bejlkga\XZXTXb{¥Îó€ÿüùý€ÿýöêÙÇ»»ÇÚíúÿÿòêàØÖÛåðøüýþ„ÿ0ôÖ´“yont|„‰˜¢«²··³®¨¢Ÿœžž›˜‰xrlfc`aceikkg_WQN!MMQXaimonmkhea][[]bfhgc_\_\VV[p˜Âë€ÿûøüþýþÿûñà˸±·ÉßòüÿçßÖÑÔÝéõú€üþ‚ÿ'þíʤ€gagu‚‹“›¥¬´¸º»º¹·´°®¬«¬­«§Ÿ—Ž„|unjg€filmmid^YSLE?<@IWdnuwvrnid_\[[_cghfcad`ZY[m“¼æþÿÿüøûüûþÿÿ÷æÍµ§©»ÔìüÿÙÐÇÄËÙê÷üüúúýÿÿþÿÿûéÅœv\W`r…”¢­·»¾¼¸¶³²²±¯®­¬­­«¨¡š“ˆ€yqmihgfkgjloomjc[PD945=KZhty|ytoid`]\^bfhigfhd^]_n´Ý÷ÿÿþùûûúýÿÿûëѶ¤£³ÎéýÿÈ¿¶¶ÂÕêúþýùøûþÿýÿüöã¿—rXS]sŒ¡²½ÃÁ½µ­§£¢¡¢‚¡/ ž›–’Œ„~wplihgfgiknoqqmg\PC;8;CO\hqwxuqkea^\\_cg€jXkg`__iƒ£ËèùÿÿûûùøüÿÿþðÚÀ¬§³Ëåúÿ¸®¦§·Ïçúÿþù÷úýþûþúóâÂy^V^u§¹Âû°¤™‘Œ‹ŠŒŒŽŽŒˆ†ƒ{wsmjh‚ghjlptusmcWLD@@DLVbmsusojfb__`cgk€lga`^cw’·Øñÿÿþû÷÷û€ÿBõãμµ»Íäøÿª¡šž±Ëæûÿÿúöùûüúü÷ðàá€f]cx’§·¼·«œyutsvx{||zwtrpqqponkjh.gfedfks{‚ƒ}sfYMC>>CO\iptrnjfdccehkllkf`_[\i~¡Ææ€ÿ5üö÷úþÿþùîßÐÆÅÎßïúž˜•³Ïéüÿÿúöøúûúûôé×¹š~ici{’¢­®¤–†xme€bfimonligeefgijkkjj€iygdb_`fr‚’››“…taPB97?L[hoqolheddegjkkie_]VRYhб׸ÿÿýõöùüýÿþùðâÓÊÊÒß霘™£ºÔìýÿÿû÷÷ùüûüòâË«xhgl{Œ–œ™‚ti`ZXXY]aeggeca``acegi€jLiihfb_[\brˆŸ¯´¯Ÿ‹t^K<35>M[fmookhebbceghfc_]TNR^~¦Îñÿÿýö÷øúûþÿÿùëØÈÀÄÎ× Ÿ¤°ÆÝñ€ÿ$üø÷úþýûëÔ¶“zjbflw‚‡ˆ„|rh`ZVUUVY]`bccb€abcegh€i:hgfc`]XZar‹¦»Å³ Šs_N@;GT`kopmhga\^aqˆ¥Èãõ€ÿýúúþ€ÿ òáϽ´²±ÔØàéò÷ú€üýÿþÿÿýìÉ¢}_UX\ddcb€abdefg€feefghgedcba`/aadehpz‰œ­¼ÇÌÌÈÀ²¡ŠveTI@60-1finsx|{vl`SJGJQZdkpz‚Œš¤¯·½ÂÆÇº©•}dQGCJR[begjnljb[cv–Àáúÿþûôðò€óòðïîíÇÐÞìùÿÿþûøüÿÿþìÈ¢zc[Yagghgg€f€eˆfeeƒd‚e>finv~…ˆ…|oaUMKNU]djqv|†Œ–ž¦°¸¿ÁÀµ¥s\KAEMZdimnpljbZ`pŽ·Û÷ÿÿüôñôõ ÷ùüþÝâéðøüýüüû€ÿõݶ‘n]Z[cighggff‚e†feedd€cJddeefgghkpxƒŒ’’‹qcXQORW]cimpvy€†Žš¥¯·»·­š€fQDDLZfmqqpkjc]am‡®Ññÿÿþ÷ó÷øùùûý€ÿîïñô÷úûûþýÿÿùæÇ{`VY]ejh€g€f‚e…feedƒcGdegiiklpxƒ˜›˜Žse[SQPSX^beijnsy…‘§¯¯©š…mXJHN[hpsqnije`afy›¿ãøÿÿû÷úúüýþÿùø÷øúûüüÿ öܶ‹lWT[_gjhgff‚e„feedcc€b@ccefgiijknvŽ™ Ÿ™Žrf[TONPTY^ceikow€‰’™›˜€o_TRWbntvsnjmjfeeqްØô‰ÿýþüú€øùùÿ íÌ£y_QS\agi‚g€fe„feedcc€bcdeggh€f8hoz‡” œ”‡{ocZPJGGLS[agikosx}‚|vld^]ajrwwsnknnifae{›Æèþ†ÿüõñÿýþƒÿ çÚr]SW_afh…fe„feedc‚b@dfggea_]^en{Š•›š”‰~ti_TKEBDLU`hmoppoponmlljhedejorqmihklhe[Yg‚­×ùƒÿüøðêåâˆÿ ýÜ·’qaZ]bbd‹e„fedccb@dfgfc]YUSW_kz‡‘“‡}tjbXPIDCHQ\fnrsqmjfbbdgjjfb__acc`]^ab`^SLSg¾ê€ÿüëáØÒÎÏÒÔˆÿéÄ¡ƒkd`cf‚bcdd€e€fƒefkedccbbcdfggc]WPKKOYgv‚ˆ‡xphb\WQKHHLT^gnpokfa]]bhljaWOLMOPPNORTTSH=>Jl›Îôÿøç͹ª¡¡«»ÈòðíêçêðõùñàÅ¡„rfhhkkfcbc‚d€ef…e€feedd€cdefggd_YRJEEKWerz{xrmhd`^[VRNMPW_fjjheb`bfihbUG<89;?@?@CEFF=2/5Py¨Ïãáб–€ts¾ÉÇÄÁ¿ÃËÐÓʶšzf^^hnrpjede€gfe€fƒeƒf‚ehfghgd`XOGCEMWbilmlkigecb`]XSQSX\_`__acfge_UF7*%'+/223689:3($&:Y~¢»Ä»›z_OGOmµ™—”’•¢¥œˆoVIIRbmsqkfdfhjjig„fƒeff…gfg€igaYPIGINSX\afikjh€fd`ZVU'RQPUZ`a\SH9)##%'*,-&#;Up‹¡¥‡_>)€%nljihmtz{ueQ@8BFILOQTRNHEHP\flmkhfdb`]YUSRQNJFGKS]dilnppnjfb`€_\UMFDJTclj^K7$…6%%„€…€‚ <;::;?DIKê?:2ƒ$'*.3;DNW^bbYM@9547?GR]fmrrpqqniaXRPRUURMIKOW]]XOC7+ „'©%€ .„862-)('-:K]luthWE835;BKT\bhiijkmnopolgc`_^[VOHFFIMMI@5*  ƒ €¬†6#2DUeptk[J>:=CINQTW[]^`bdfimqssqnkid_XNF?<;971%„5®‚7=:„1*3+'.BVhsvtme_[ZXWSOKHHJMPPQSSRNG=1$…- €¹'(%†'ID=4( "3CP[cjljfca^[TLC;89<@BCDED@:2) †½'(%†'ƒG8,!*4AN\fkjgec_VJ>3./279;<;94-&†¼'€ÿ,&%$"Y1! +;N^ghggfaWI:-()-368873)„7Á..,‚Š+ATadefgbWG6("$)04665/…`Æ.€EM<‰3IX]`cfcWF4&!$*26€86ƒ‚(!(€ÉFP?Œ @OYcnjZ>!  #*-+…,#)ÍFP?§,#(ÌF€ÿWK@6 G˜652, )Ô ™8;;:Ú ™8€;Ù ‚.BT_abceaWH9,(*/69:;<;:;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿt8mk@)@IHF@?BGIH:!!:HIGB?@4cŒ›š•ŒˆŽ˜œ˜T#$T˜œ˜ŽˆŒ1h¢ÓçåßÓÐ×ãçãÇW! UÇãçã×ÐÔ<[^RMPv¨ÝÿÿÿÿÿÿÿÿÿÿþÌoVE+$F^ehZIGKd—ÌþÿÿÿÿÿÿDx§³ª£ ¹ÙûÿÿÿÿÿÿÿÿÿÿÿðØ½­šoB!Vˆ­¸¹ªššœ­Îðÿÿÿÿÿÿÿ))+/1/& (Q„»îÿûôëõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþG  1a—Ì÷ÿÿôèêêðüÿÿÿÿÿÿÿÿoot}€}iA .Khyš¿èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÅƒ:8[n€¦ÌõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿººÀÌÐ̱{B 2e•½Íßíþÿÿÿÿÿÿÿÿûøøùûûúùøùýÿÿÿÿÿÿõ¿w:Dv©ÄÑãòÿÿÿÿÿÿÿÿÿÿÿýùøùúûûúúÿÿÿÿñ¼ƒM2.0AMJE1*@IHF60.Aq¨Üÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿþýýýÿÿÿÿÿÿÿÿô»†S:. -:Uˆºðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþÿþÿÿÿÿÿÿÿ潕~žœ“qD3cŒ›š•„€~Œ¯ÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿþþþþÿÿÿýÿÿÿÿÿçÈ¥‘}[,,[~£ÆçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþÿÿÿÿÿÿÿþëØÏÍÌÚèèݳ|B  5j¡ÓçåßÐÎÎÔäùÿÿÿÿÿÿùöö÷ùúüýþÿÿÿþþÿÿÿÿþýùö÷þÿÿÿÿøìãÍ a a Íâéöÿÿÿÿÿÿüøööøùùùùûýþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíº†WKT[^E%4L\‚¬Ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýþÿþþþþþþþþþþþþþþÿþýýÿÿÿÿÿÿÿÿÿߢe>>e¢ßÿÿÿÿÿÿÿÿÿÿÿþýýþÿþþþþþþþþþþþþþþþüûüÿÿÿÿÿÿÿÿÿÿÿÿåã ¬±®ˆV!#R|¢²ÊßùÿÿÿÿÿÿÿÿÿÿÿýûûýÿþÿÿÿþþþþþþþþþþþþþþþþÿÿþüüüÿÿÿÿÿÿÿÖ­””­Öÿÿÿÿÿÿÿüûüþÿÿÿÿÿþþþþþþþþþþþþþÿÿþýüýÿÿÿÿÿÿÿÿÿÿÿÿÿøëðýÿ÷Í–\+ +]”ÉòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüüþÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿþýüýÿÿÿÿÿÿÿÿðèèðÿÿÿÿÿÿÿÿýüýþÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÊ›rcdjjdcr›ËùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþþÿÿÿÿþýüûûûûúøøúÿÿÿÿÿÿÿÿÿïÕ¾µ¶¹¹¶µ¾Ôðÿÿÿÿÿÿûøøùûûûûüýþÿÿÿÿþþþÿþþÿþþþþÿþþÿþþþþÿþþþÿÿÿÿþýûùøûÿÿÿÿÿÿÿÿûøùûýþÿÿÿÿþþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþÿþýüþÿÿÿÿÿÿÿÿÿÿÿþüüýýüüþÿÿÿÿÿÿÿÿÿýýýÿÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿÿýýýÿÿÿÿÿÿÿÿÿÿýýýÿÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿÿþþþÿÿÿÿÿÿÿÿÿÿþþþÿÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿÿÿÿÿÿþþÿÿÿþÿÿÿÿþüúùøööøþÿÿÿÿÿÿÿÿÿÿÿÿý÷ö÷ûþþÿÿÿþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþÿÿÿþýûùøøùûýþÿÿÿþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþÿþýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿþþþþþþþþþþþþþþÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿþýýÿÿÿÿÿþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþþÿÿÿÿþýûùùùùùùùùùùùùùùùùúüýýüúù÷ööùÿÿÿÿþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýûûûûûûûûûûûûûûûüýþÿÿÿÿþþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþÿÿÿÿÿüúøøüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæÍ¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêºkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüýþÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿþüüýÿÿÿÿÿÿÿüðêêêíïîîîîîîìêéîøÿÿÿÿøîôûÿK!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüþÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿþüüýÿÿÿÿÿÿòέœšœ¤¨¥¥¥¥¥§¡š™¦Ãäûû俣ª³§xDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýþÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿþýýþýÿÿÿÿÿÍ—dKGKV\YYYYY[SHFZ†ºÝݺ†ZLR^[;ÔÔÔÔÔÔÔÔÔÕÓÏÍÐÛîÿÿÿÿÿúúýÿÿÿþÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþþÿÿÿÿÿÿýïëìçàÄU B{¢¢{BŒŒŒŒŒŒŒŒŒŠ~‚—¿èÿÿÿÿÿúýþþþÿþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþüÿÿÿÿëÏ·œwM$CccC@@@@@@@@@D>2.1K¼÷ÿÿÿÿÿÿüýþÿþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþýúÿÿÿÿì·K4())9yÃøÿÿÿÿþøùüþþÿÿÿþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþÿÿþü÷ÿÿÿÿæœL;…Æ÷ÿÿÿÿÿÿÿÿÿþþþÿÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿÿþþþþûÿÿÿÿá3CƒÂýÿÿÿÿÿÿÿÿüüýÿÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿÿýûýÿÿÿÿÿÿÈv%9yÂ÷ÿÿÿÿÿÿþüüýÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿýúýÿÿÿÿÿÙ’L9„Å÷ÿÿÿÿÿÿÿÿþýýþÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿþýýþýÿÿÿÿÿÖ›U#A}±Øæôúÿÿÿÿûö÷ûþþÿÿÿþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþÿÿÿþþû÷öûÿÿÿÿÿÖO>c„—µÒñÿÿÿÿÿÿÿÿÿþþþÿÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿÿþþþÿÿÿÿÿÿÿÿÿÿØ™M0@g—ÌÿÿÿÿÿÿÿÿÿýýýÿÿþþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþþÿÿýýýÿÿÿÿÿÿÿÿÿךVMÔÿÿÿÿÿÿÿüúûýÿÿÿþþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþþÿÿÿýûúüÿÿÿÿÿÿÿÕMOšØÿÿÿÿÿÿÿÿÿýþþþÿþþÿþþÿþþþþÿþþÿþþþþÿþþÿþþÿþþþýÿÿÿÿÿÿÿÿÿØ™M\›ÏöÿÿÿÿÿÿÿÿüüþÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿþüüÿÿÿÿÿÿÿÿöÏšZ#R}¢´ÌâùÿÿÿÿûûýþþþþÿÿÿÿþþþþþþþþþþþþþÿÿÿþÿýûûÿÿÿÿùâÌ´¢}R"2J\¬ÛÿÿÿÿÿÿÿÿÿÿÿþýýþÿþþþþþþþþþþþÿþýýÿÿÿÿÿÿÿÿÿÛ¬\J2/c¢äÿÿÿÿÿÿÿÿÿþøööøùùùùùùùùùùùùùø÷öùÿÿÿÿÿÿÿä¢c/&d¯èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé¯d&*q²æÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿä±q*0j ÈÌÈ»»Õïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþíß;—g2 2Yxwqgp›Êøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ迚ygI,  ,&*\–Í÷ÿÿôëîîîîîîîîîîîíùÿÿí»„Q( !Vˆ­¸¶«£¥¥¥¥¥¥¥¥¥¥¥¥¯µ¶¥xD%E^ed]WYYYYYYYYYYYX_cdX< fldigi-3.21.80/data/fldigi.xpm0000664000175000017500000002016412313064025012742 00000000000000/* XPM */ static const char * fldigi_icon_48_xpm[] = { "48 48 215 2", " c None", ". c #000000", "+ c #BFBFBF", "@ c #050505", "# c #1A1A1A", "$ c #1F1F1F", "% c #C5C5C5", "& c #FEC1C1", "* c #FDC5C5", "= c #FEC2C2", "- c #FFBFBF", "; c #D5C4C4", "> c #0C0C0C", ", c #FE0303", "' c #FB0C0C", ") c #FD0606", "! c #FE0000", "~ c #4F0909", "{ c #D1BFBF", "] c #2F2F2F", "^ c #303030", "/ c #3C3C3C", "( c #838383", "_ c #C7C7C7", ": c #D9D9D9", "< c #D7D7D7", "[ c #C2C2C2", "} c #C4C4C4", "| c #C9C9C9", "1 c #9F9F9F", "2 c #DDDDDD", "3 c #DBDBDB", "4 c #CDCDCD", "5 c #8F8F8F", "6 c #414141", "7 c #343434", "8 c #313131", "9 c #010101", "0 c #292929", "a c #8A8A8A", "b c #A8A8A8", "c c #B6B6B6", "d c #CFCFCF", "e c #DEDEDE", "f c #DFDFDF", "g c #E5E5E5", "h c #E2E2E2", "i c #A0A0A0", "j c #7D7D7D", "k c #1D1D1D", "l c #767676", "m c #888888", "n c #9B9B9B", "o c #D3D3D3", "p c #C6C6C6", "q c #EBEBEB", "r c #DADADA", "s c #AAAAAA", "t c #858585", "u c #747474", "v c #232323", "w c #171717", "x c #818181", "y c #979797", "z c #AEAEAE", "A c #E4E4E4", "B c #D4D4D4", "C c #B5B5B5", "D c #E1E1E1", "E c #BABABA", "F c #9A9A9A", "G c #989898", "H c #030303", "I c #070707", "J c #242424", "K c #C1C1C1", "L c #E0E0E0", "M c #B2B2B2", "N c #363636", "O c #060606", "P c #020202", "Q c #929292", "R c #959595", "S c #C8C8C8", "T c #CECECE", "U c #B0B0B0", "V c #999999", "W c #040404", "X c #151515", "Y c #606060", "Z c #A2A2A2", "` c #CBCBCB", " . c #919191", ".. c #A4A4A4", "+. c #AFAFAF", "@. c #737373", "#. c #181818", "$. c #131313", "%. c #393939", "&. c #C3C3C3", "*. c #454545", "=. c #3A3A3A", "-. c #222222", ";. c #333333", ">. c #484848", ",. c #A1A1A1", "'. c #616161", "). c #0F0F0F", "!. c #C0C0C0", "~. c #808080", "{. c #404040", "]. c #121212", "^. c #191919", "/. c #BDBDBD", "(. c #7E7E7E", "_. c #3F3F3F", ":. c #161616", "<. c #090909", "[. c #212121", "}. c #777777", "|. c #BBBBBB", "1. c #3B3B3B", "2. c #5D5D5D", "3. c #A5A5A5", "4. c #727272", "5. c #272727", "6. c #101010", "7. c #9C9C9C", "8. c #B7B7B7", "9. c #B3B3B3", "0. c #080808", "a. c #262626", "b. c #ADADAD", "c. c #CCCCCC", "d. c #E9E9E9", "e. c #E8E8E8", "f. c #ACACAC", "g. c #2A2A2A", "h. c #323232", "i. c #DCDCDC", "j. c #D1D1D1", "k. c #E7E7E7", "l. c #D2D2D2", "m. c #0E0E0E", "n. c #0D0D0D", "o. c #4A4A4A", "p. c #8C8C8C", "q. c #B9B9B9", "r. c #7A7A7A", "s. c #525252", "t. c #373737", "u. c #7B7B7B", "v. c #E6E6E6", "w. c #A9A9A9", "x. c #6B6B6B", "y. c #141414", "z. c #757575", "A. c #D6D6D6", "B. c #E3E3E3", "C. c #6E6E6E", "D. c #0B0B0B", "E. c #1E1E1E", "F. c #EAEAEA", "G. c #B4B4B4", "H. c #D8D8D8", "I. c #9E9E9E", "J. c #444444", "K. c #ABABAB", "L. c #A6A6A6", "M. c #505050", "N. c #B1B1B1", "O. c #3E3E3E", "P. c #0A0A0A", "Q. c #878787", "R. c #EFEFEF", "S. c #8B8B8B", "T. c #4B4B4B", "U. c #4F4F4F", "V. c #CACACA", "W. c #EEEEEE", "X. c #434343", "Y. c #D5D5D5", "Z. c #7F7F7F", "`. c #5B5B5B", " + c #515151", ".+ c #868686", "++ c #8E8E8E", "@+ c #575757", "#+ c #707070", "$+ c #636363", "%+ c #B8B8B8", "&+ c #909090", "*+ c #252525", "=+ c #8D8D8D", "-+ c #969696", ";+ c #282828", ">+ c #A3A3A3", ",+ c #BCBCBC", "'+ c #A7A7A7", ")+ c #3D3D3D", "!+ c #2E2E2E", "~+ c #353535", "{+ c #D0D0D0", "]+ c #595959", "^+ c #BEBEBE", "/+ c #111111", "(+ c #5E5E5E", "_+ c #383838", ":+ c #939393", "<+ c #464646", "[+ c #2C2C2C", "}+ c #717171", "|+ c #898989", "1+ c #494949", "2+ c #555555", ". . . . . . . . + @ . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", ". . . . . . . . + # . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", ". . . . . . . . + $ . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", "% % % % % % % % % % % % % % % % % % % % % & * * * = - - - ; % % % % % % % % % % % % % % % % % % ", "> > > > > > > > > > > > > > > > > > > > > , ' ' ' ) ! ! ! ~ > > > > > > > > > > > > > > > > > > ", "+ + + + + + + + + + + + + + + + + + + + + - - - - - - - - { + + + + + + + + + + + + + + + + + + ", "] ] ] ] ] ] ] ] ] ] ] ] ] ] ^ ] ] ] / ( _ : < [ } | 1 2 3 4 5 6 ^ ] ] ] 7 8 ] ] ] ] ] ] ] ] ] ] ", ". . . . . . . . . . . . . . 9 . . . 0 a b c d e f g 2 h } i j 0 9 . . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . k l m n o p 3 q h r s t u v . . . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . 9 w x y z : _ A B C D E F G 0 . . H 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . I 9 . J t z % D K L d d r | M ( N 9 . O H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . P > 9 . ] Q R S f D L T 4 e } U V 7 9 . H 9 . . . . . . . . . . . . ", ". . . . . P P . . . . . . 9 P W . . X Y Z e ` + .( ..d 3 +.@.#.. . . . O H . . . . . . . . . . ", ". . . . . @ @ . . . . . . W P . . . P $.%.&.*.=.-.k ;.>.,.'.X @ . . . . ).O . . . . . . . . . . ", ". . . . . @ @ . . . . . . P 9 . . . . 9 . !.P . . . . . ~.{.. . . . . . ].I . . . . . . . . . . ", ". . . . . O O . . . . . . . . . . . P O ^./.$.H H H H W (._.P . . . . . :.<.. . . . . . . . . . ", ". . . . . H H . . . . . . . . . . . O [.}.|.Y 1.6 6 1.2.3.4.5.P . . . . 6.I . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 9 . . ).u } A 4 7.8.9.7.: D d ~.W . . . 9 H 9 . . . . . . . . . . ", ". . . . . . . . . . . . . . H 0.. . a.b.&.c.d.o D L L e._ + f.g.9 . 0.@ . . . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 0.9 . h.F c ` i.j.A e.k.2 l.C Q / 9 9 m.@ . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . n.P . o.p.f.% q.A g e.q e e Z r.s.@ @ m.P . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . 9 . . t.u.+ v.B i.Z w.: L d.|.x.7 O 9 P . I 9 . . . . . . . . . . ", ". . . . . . . . . . . . . H O @ . . y.z.c.v.A.+ b b ,.B.e.[ C.D.9 . . 9 <.9 . . . . . . . . . . ", ". . . . . . . . . . . . . H D.n.. . E.,.o B.e.A.!.z ..F.L 3 Z [.9 . W H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . P n.9 . 1.c G.H.g F.k.g e.A ` 9.I.J.W . O W . . . . . . . . . . . . ", ". . . . . . . . . . . . . . W m.. W t.K.1 L.i.2 h i.v.D ..1 +.^ O 9 0.D.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . H O P > M.5 t p.< g g D d.i.1 Q N.O.O @ ).D.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 P.H W o.Q.C p l.v.q R.i.i.d 1 S.T.I 9 P . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . O H . U.t +.l.V.V.e.W.k.r } S }.X.<.P W . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . 9 . 1.x U g 2 Y.g g g D 3 l.Z.v H . 9 . D.H . . . . . . . . . . ", ". . . . . 9 9 . . . . . . 9 9 . . . O -.> 4 @.C.`. +C.}.!..+W 0.. . . . w <.. . . . . . . . . . ", ". . . . . W W . . . . . . P 9 . . . . P 9 % y.<.<.0.I m.++@+@ . . . . . :.<.. . . . . . . . . . ", ". . . . . 9 9 . . . . . . H 9 . . . O t.S.f ,.#+j u.$+n c.z +I 9 . . . > @ . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . X ( | H.v.%+D 4 &+v.` d n *+W . 9 9 9 . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . y.=+G.G.h [ F.d.j.A b +.-+;+P . 9 . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . H . . ] >+C U L B.k.e.h k.s b i *.O . 9 W . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . D.P . %.M -+,+o d.i.A q 2 /.3.s +0.W n.0.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . H @ 9 . ] '+c V.L e.A 2 D B.S C i )+O 9 H 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . O O . . !+f._ l.e.d.g 2 D e.S &.K.s.P.. . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . P . 9 ~+f.E {+h d.e.g g L % !.R ]+D.9 P . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . O 9 O h.7.9.l.v.k.L B T 2 T ^+3.J.0.. 9 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . /+I D.X.Q L.e g q v.B.v.D B &.i (+P.W P.9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . D.I O _+b /.A.2 d.v.F.d.A : %+L.T.0.O /+H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . m.P . ;.Q + 3 f A h F.q d : } :+<+W H m.W . . . . . . . . . . . . ", ". . . . . . . . . . . . . H 9 I 9 . [+a p v.g k.o % e i.B.j.p.J.O . H 9 W P . . . . . . . . . . ", ". . . . . . . . . . . . . I H . . . O 5.}+o |+t 1+X.C..+,+p.8 ).9 . . . y.0.. . . . . . . . . . ", ". . . . . 9 9 . . . . . . P 9 . . . . . . p X D.9 P O <.~.2+. . . . . . :.<.. . . . . . . . . . ", ". . . . . @ @ . . . . . . . . . . . . . . &.I . . . . . ~.T.. . . . . . #.P.. . . . . . . . . . "}; fldigi-3.21.80/data/fldigi-psk.png0000664000175000017500000000730312313064025013515 00000000000000‰PNG  IHDR@@ªiqÞbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ  Å›ÄoPIDATxÚí›Éoe·Æou×Ðóàv·ÛclCœ'bJ(‘ùP Á„Á†+þ tˆ+6°`ÃEB–X (‹0A,l'Ž`;‰‡ÄCÛ=º§ª®®»¸ª’ÛÛ7¾ßw_©]*×ð¼ç<çœç Àâ—eY!x’«Ùï =ìtuuñï´¿ßÿŸ À¿Û–eYÿÑ´µµý¯°´¼L¥­mÛymyyÛ¹Þ¶6*; ÀÃD¦°øCœ÷¥ÿw`hhhLjÇãœ:uŠàñx0M“r¹Ììì,’$ÑßßÏõë×¹zõ*§NB’$\.¹\ŽÉÉI†‡‡Y]]½ë½EÁ², Ãxò. Iõz½á\$á7Þàã?¦^¯ã÷û‰F£!ðz½èºN  ŸÏS.—I$lll°¾¾N*•byy™Ó§OsîÜ9jµZÓ7ÇÝì,mëòz½$ ²Ù,KKKhšÆ¾}ûðûýøý~$IÂívðûý˜¦I¡P`bb‚ùùy.—kGv€T*Åôô4©Tеµ52™ ‡D"Áèè(Åb·ûö¡Z­R©TÐu;wî ( Š¢°¶¶FµZý¿—I’D­VC–ezzze™X,F¹\FQ¢Ñ(±XŒR©ÄÊÊ þù'Á`Z­Æž={Ð4ƒâóù¤ÆWu¹\»Ï¶ò@½^G’$º»»™››ãèÑ£¨ªJ[[Bfggéîîfyy™T*E4ux Z­âõz©T*´µµmã¯×K¡PØ}ƒA666Õ4ÞÞ^òù<õzÓ4B ë:ȲLkk+­­­¨ªJ*•BQÇJΞ=K @Qt]ßÝ.àr¹°, Ó4sÑh”[·nqäÈ~ÿýwgWUU¥»»›jµJµZezzš……:::H§ÓƒAŠÅ"ï½÷ù|¾áž¥Riç$i›ïÝ+•J FGGI§Ó=z”ÞÞ^ü~?Õj•õõuffføöÛo‘e™õõu à ³oß>4Mcyy™¿ÿþ{öo·ÛýX|pOeÙaç{&B Ë2º®o»6ŸÏ366Æ×_Í«¯¾ÊÀÀ§OŸFUUnݺÅââ"£££ÌÌÌÐÞÞÎÔÔš¦ñÁðý÷ß311ÁÜÜÜ?>Ûçóaš&ÍO„TU}`<Ï™¥eYH’Äý2ðU~"‘µZí‘ ±)`›þýÜi«e5+ê<Œ›>BˆÖß¶†©­®´ÙO;::šÀÖ{7•šQ( !Ð4 ]×ùôÓO¹xñ"õzX,F±XÄåráv»©V«(Š‚¦i¬¬¬Ífx_.—ÿñ}jµÚ=Á,µÂںǎ£¿¿Ÿ®®.¾úê+ùí·ßˆD"tww311ßïç•W^¡¥¥€/¿ü’‘‘¾ûî;êõú]¨V«Û"Ä«m—Ù¼#B^ýu>ûì3Âá0@I’XXX`rr’§žzŠ®®..^¼ˆ$I;vÌÙÕb±ÈÊÊ 'OžÜ^m×|\+mj&èr¹Ð4­!$I’Äk¯½F(âöíÛ¨ªJoo/===¨ªŠ×ëŲ,<ˆ¢(ȲL.—cjjŠh4J$áøñãÛÊa¿ßÿÈ¡oG«Á­%«‚––ÆÆÆBP.—©Õj¸\.æææðûýȲL @UUòù¼Ãì¦i2;;ËÀÀÀ6¢ …BMᨦ`šæ6VŽÇã¸\.nܸeYtvv211AµZeÿþý \.—£U«U ÃàÀüý÷ß\»v ŸÏ׬ÏçkJ!´#å°ý1öêéé!—ËQ¯×©T*‹Eæç癟Ÿ':g #˲Ð4µµ5èéé!‘H4\Åbqw–Ãù|¾Á4«Õ*·nÝbïÞ½Äãqºººƒ”Ëe ÃàâÅ‹Œóᇠ1MÓq‡ÁÁA'•Þ*²l®LÓ|dwp73X–µ-&OOO#Ë2ýýýNµ˜Ëå0M“«W¯’Ëå‡Ã\¸pD"A__Ÿ“LOO³ººÊððpC:¾Ù¢Ñ(ëëë ›æ¿ßO h8_(ƒ9r„@ €eYttt8º,˼õÖ[d2._¾ìèÅb‘·ß~›÷ßÃ0¶™¼$I!X[[{¬< i躎EQ¶qÂË/¿L("ŸÏS*•$‰X,ÆÀÀ---ø|>nÞ¼É /¼€,ˆÁÆÆBÂá0'NœptÃÍ€oÍ9‰³€ÿjõzÃ0p»Ý†áød2™ä£>B–eÒé4---†¦i¨ªJkk+²,óüóÏÓÕÕ…‚••Ea||œ;wîøë¯¿œ”Ø®T›!”65 (Šâ$66/”Ëenß¾×ëåÊ•+ÌÍÍQ*•œf†‚J¥‚Ûí¦R©àr¹¸rå 333d³Y:ÄÈÈȶ´¼V«m³¶]‘lll8x½^âñ8étšz½Ž¦i S¯×Éd2¬­­9⨢(Ž Ú××Ç™3gx½^R©ÉdÒyŽm=>ŸïñÃv³\`«",„Àçóqøða$IÂëõ2>>N0¤»»›d2I(B’$EÁçó9¹ÂêêªÃì>ŸMÓ8}ú4Š¢P¯×‰F£T*jµÚc7Kš €½;vbS«ÕˆD"N"sèÐ!öïßÛív>Þ²,"‘Õj•T*åt‰‰SSS˜¦I&“arrÒ±®r¹Œ®ëMé5Õì’Õþx]×Ìpii‰¾¾>4M£««‹3gÎ8Äfš&áp˜|>ªª¤ÓiNœ8Á/¿üâ«m]Š¢4mPªé©p±Xlx9MÓ$‰ŽŽ~úé'dYÆívÓÓÓÃèè(ªªR¯×q¹\ȲL<gaaI’‡Ã?~œ‘‘¢ÑhS…šK…íœÀ^³³³$ *• Ï<ó ÝÝÝT*öìÙãìüêêªS!H&“ìÛ·7nP©TÈd2LLL4¤×›EÑR©ôÈ!±i¸\®»fd³³³”ËeæççùùçŸYXXàÌ™3èºîÌ œ?žýë_hš†‚h4Ê›o¾Éðð0Ÿþ9---wm½Û&„x¬œÀú§CUUKUUë^ר‡⮳,Ëòz½÷¼æ¥—^²,˲’Éä}ï×ÖÖfE£ÑzöÝŽ{ZÀƒ²¬UUï){½^§oÐÙÙ‰a¤R)‡ìž¡,Ë\¸pÁQ}‚Á ù|þ¾ÄûD5A!Ä?0Ø!ï“O>áÝwߥ§§‡T*ÅÒÒ¿þú+ííí$“I¦¦¦ÈçóœÛþÿ{¬®©š â´>!Ä}µCû>–eYýýýVWW—ÕÒÒbI’d–¢(V °‰„s]ggç}ŸH$vN´³¯ûõß-˺¯*»™°²Ù,ëëëÛ¤t]×f„åfšõ¡]Àö­Ç@¸_ßà^k+Hÿ´IÀ¥¬SrùIEND®B`‚fldigi-3.21.80/data/ToR-Stats-SHIP.csv0000664000175000017500000023053212313064025014036 00000000000000June 2012,,,,,,,, CTRY,CALLSIGN,NAME,Observations,N<30,N<60,N<120,N>360,Average (R-O) (mins) , B2M1297, ,1,1,1,1,0,30 , B2M1303, ,17,16,17,17,0,17.9 , BATEU00, ,366,366,366,366,0,5 , BATEU05, ,326,326,326,326,0,5.1 , BAREU00, ,597,587,597,597,0,4.2 , BAREU04, ,543,540,543,543,0,2.8 , BAREU08, ,549,548,549,549,0,1.8 , BAREU11, ,587,489,587,587,0,13.3 , BAREU12, ,328,239,328,328,0,15.8 , BAREU51, ,503,449,503,503,0,8.7 , BAREU54, ,460,460,460,460,0,2.7 , BAREU56, ,366,365,365,365,1,0 , BAREU58, ,414,345,414,414,0,14 , BAREU60, ,334,329,334,334,0,3.4 , BAREU62, ,386,304,386,386,0,15.2 , BAREU63, ,291,290,290,290,1,4.8 , BAREU64, ,366,338,366,366,0,11.7 , BAREU65, ,651,651,651,651,0,0 , BAREU66, ,481,382,481,481,0,15.1 , BATEU02, ,413,413,413,413,0,5.5 , BATEU03, ,232,232,232,232,0,5.7 , BATEU04, ,400,400,400,400,0,5.3 , BATEU08, ,490,490,490,490,0,5.5 , BATEU09, ,470,470,470,470,0,5.3 , BATFR01, ,175,175,175,175,0,4.7 , BATFR02, ,314,314,314,314,0,4.8 , BATFR03, ,478,478,478,478,0,4.5 , BATFR04, ,284,284,284,284,0,4.3 , BATFR05, ,195,195,195,195,0,5.6 , BATFR08, ,590,590,590,590,0,4.8 , BATFR09, ,471,471,471,471,0,4.8 , BATFR10, ,328,328,328,328,0,5.2 , BATFR11, ,234,234,234,234,0,4.7 , BATFR12, ,193,193,193,193,0,4.5 , BATFR13, ,387,387,387,387,0,4.7 , BATFR14, ,346,346,346,346,0,4.8 , BATFR15, ,278,278,278,278,0,4.8 , BATFR16, ,364,364,364,364,0,5 , BATFR17, ,34,34,34,34,0,4 , BATFR18, ,446,446,446,446,0,4.8 , BATFR20, ,310,310,310,310,0,5 , BATFR21, ,370,370,370,370,0,5.2 , BATFR22, ,295,295,295,295,0,4.8 , BATFR23, ,12,12,12,12,0,6.7 , BATFR24, ,571,571,571,571,0,4.9 , BATFR27, ,441,441,441,441,0,4.8 , BATFR28, ,495,495,495,495,0,5.3 , BATFR29, ,471,471,471,471,0,4.9 , BATFR32, ,325,325,325,325,0,3.2 , BATFR33, ,307,307,307,307,0,4.9 , BATFR34, ,260,260,260,260,0,5 , BATFR35, ,301,301,301,301,0,5 , BATFR36, ,320,320,320,320,0,5.8 , BATFR39, ,221,221,221,221,0,5 , BATFR41, ,263,263,263,263,0,5 , BATFR42, ,432,432,432,432,0,5.6 , BATFR44, ,153,153,153,153,0,3.9 , BATFR45, ,239,239,239,239,0,4.4 , BATFR46, ,432,432,432,432,0,5.4 , BATFR47, ,307,307,307,307,0,5.7 , BATFR48, ,201,201,201,201,0,5.6 , BATFR49, ,401,401,401,401,0,4.4 , BATFR52, ,510,510,510,510,0,5.4 , BATFR53, ,60,60,60,60,0,4.1 , BATFR54, ,430,430,430,430,0,5 , BATFR55, ,330,330,330,330,0,5 , BATFR56, ,524,524,524,524,0,4.8 , BATFR58, ,537,537,537,537,0,4.9 , BATFR59, ,80,80,80,80,0,5.4 , BATFR60, ,218,218,218,218,0,4.9 , BATFR61, ,2,2,2,2,0,6 , BATFR62, ,98,98,98,98,0,4.9 , BATFR63, ,180,180,180,180,0,5.4 , MINFR00, ,574,70,212,444,0,86 , MINFR03, ,649,35,131,322,17,141.3 , MINFR09, ,672,65,210,430,6,114.9 , AMOUK01, ,25,25,25,25,0,1.9 , AMOUK02, ,503,502,502,503,0,2 , AMOUK03, ,527,527,527,527,0,1.9 , AMOUK05, ,524,524,524,524,0,1.8 , AMOUK06, ,536,536,536,536,0,1.9 , AMOUK08, ,547,547,547,547,0,1.8 , AMOUK09, ,541,541,541,541,0,1.9 , AMOUK10, ,166,165,165,166,0,2.3 , AMOUK11, ,540,540,540,540,0,1.8 , AMOUK12, ,540,538,538,540,0,2.1 , AMOUK13, ,535,530,530,535,0,2.4 , AMOUK14, ,526,526,526,526,0,1.9 , AMOUK15, ,521,515,519,521,0,2.4 , AMOUK16, ,345,345,345,345,0,1.9 , AMOUK17, ,386,386,386,386,0,1.9 , AMOUK19, ,409,409,409,409,0,1.8 , AMOUK20, ,266,266,266,266,0,1.9 , AMOUK21, ,548,548,548,548,0,1.9 , AMOUK22, ,531,530,530,531,0,2 , AMOUK23, ,526,525,525,526,0,2 , AMOUK24, ,357,357,357,357,0,1.9 , AMOUK25, ,523,522,523,523,0,2.1 , AMOUK26, ,551,551,551,551,0,1.8 , AMOUK27, ,473,473,473,473,0,1.8 , AMOUK28, ,419,362,363,416,0,10.5 , AMOUK29, ,524,522,522,524,0,2.1 , AMOUK30, ,484,457,457,483,0,5.4 , AMOUK31, ,485,451,451,483,0,6.4 , AMOUK33, ,485,485,485,485,0,1.9 , AMOUK34, ,545,545,545,545,0,1.9 , AMOUK35, ,543,539,539,543,0,2.3 , AMOUK36, ,548,547,547,548,0,1.9 , BATEU01, ,493,493,493,493,0,5.1 , BATEU06, ,510,510,510,510,0,5.5 , BATUK01, ,656,654,655,656,0,12.6 , IDDUK02, ,388,361,372,386,0,11.4 , MINUK01, ,706,224,505,679,0,50.4 , MINUK03, ,708,207,478,670,0,54.5 , MINUK05, ,708,235,514,674,0,50.6 , TBWUK03, ,27,9,22,25,0,51.7 , TBWUK04, ,52,46,48,49,0,20.1 , TBWUK05, ,14,6,7,13,0,56.6 , TBWUK06, ,25,11,22,25,0,28.7 , TBWUK08, ,2,2,2,2,0,10 , TBWUK09, ,23,2,11,17,3,373.9 , TBWUK11, ,71,50,63,66,2,54.4 , TBWUK16, ,51,26,44,50,0,41.7 , TBWUK18, ,24,7,14,23,1,122.6 , TBWUK19, ,16,6,9,9,5,198.5 , TBWUK30, ,25,13,19,19,3,92.7 , TBWUK34, ,86,30,72,80,2,76.2 , TBWUK35, ,75,36,65,74,0,41.8 , TBWUK37, ,49,18,45,48,1,45.2 , TBWUK38, ,19,15,18,19,0,21.4 , TBWUK48, ,55,35,53,55,0,22.4 , TBWUK49, ,4,2,3,4,0,29.5 , TBWUK50, ,60,30,54,58,0,39.2 , TBWUK51, ,14,0,6,11,2,218.1 AU , VJD2969, ABURRI,5,1,3,5,0,63.4 AU , 9KWP, AL SHUWAIKH,40,31,40,40,0,22.6 AU , 2ALD3, ANL WANGARATTA,8,4,8,8,0,39.4 AU , 9V7548, ANL WARRAIN,8,2,7,8,0,56.4 AU , 2AJU5, ANL WYONG,18,12,16,18,0,30.4 AU , 9VBX, APL AMAZONITE,8,6,7,8,0,28.6 AU , A8TX8, APL BAHRAIN,5,1,3,5,0,51.6 AU , A8TX9, APL RIYADH,59,31,55,59,0,35.5 AU , VNW6069, ASHMORE GUARDIAN,38,23,26,29,3,106.6 AU , C6HS4, BADER III,30,22,29,30,0,25.5 AU , V7VZ6, CAPE MAAS,61,60,61,61,0,16.2 AU , 9VEY2, CAPITAINE TASMAN,12,4,8,11,0,55.5 AU , VK4041, CHANCE,19,19,19,19,0,10.5 AU , VRWS4, CHEKIANG,12,11,12,12,0,17.8 AU , VRUB2, CHENAN,8,8,8,8,0,15.4 AU , VRSR, CHENGTU,29,28,29,29,0,17.4 AU , VROC, CORAL CHIEF,12,12,12,12,0,18 AU , PBLQ, DIAMANTGRACHT,1,1,1,1,0,15 AU , VNJC, H.M.B. ENDEAVOUR,31,15,27,31,0,36.8 AU , VROB, HIGHLAND CHIEF,26,11,26,26,0,30 AU , VRRB, ISLAND CHIEF,22,21,22,22,0,18.1 AU , VRRD, KOKOPO CHIEF,9,9,9,9,0,15.1 AU , FHZI, L\'ASTROLABE,667,341,667,667,0,30.1 AU , VMAL, LINDESAY CLARK,24,22,23,24,0,18 AU , 9V8207, MAERSK BATUR,2,1,1,2,0,38.5 AU , 9V8208, MAERSK BRANI,48,25,38,44,1,70.5 AU , C6RI4, MAYSORA,47,39,46,47,0,24 AU , VRFN8, MOL EMINENCE,16,9,16,16,0,26.9 AU , VNVZ, NORTHWEST SANDERLING,12,12,12,12,0,11.6 AU , VNVG, NORTHWEST SANDPIPER,16,12,14,16,0,25 AU , ZCAO7, NORTHWEST SHEARWATER,32,6,20,32,0,69.2 AU , VNVS, NORTHWEST SNIPE,20,20,20,20,0,13.1 AU , VNVF, NORTHWEST STORMPETREL,1,1,1,1,0,10 AU , VMQ8808, OCEANIC DISCOVERER,49,34,41,45,2,57.1 AU , VRFS2, OOCL NEW ZEALAND,14,0,12,14,0,62.7 AU , VRDU8, OOCL PANAMA,2,2,2,2,0,22.5 AU , 2AGH7, PACIFIC DAWN,11,11,11,11,0,17.9 AU , MPRZ, PACIFIC JEWEL,3,0,1,1,0,180 AU , GRFP, PACIFIC PEARL,13,11,12,13,0,20.3 AU , ZCDS3, PACIFIC PRINCESS,46,38,45,46,0,18.9 AU , 9HA2479, PACIFIC SUN,671,521,671,671,0,22.1 AU , ELXS8, PACIFIC TRIANGLE,9,9,9,9,0,13.9 AU , VRRC, PAPUAN CHIEF,11,11,11,11,0,16.6 AU , VNVM, PIONEER,8,5,6,8,0,38.9 AU , VNAH, PORTLAND,438,221,438,438,0,30.6 AU , V2OG2, PRINCESS MARY,14,14,14,14,0,15.4 AU , VJRB, RIVER BOYNE,9,7,9,9,0,25.6 AU , MNDC9, SAFMARINE MERU,10,9,10,10,0,19.2 AU , MPJH9, SAFMARINE MULANJE,74,30,52,66,2,72.7 AU , MGYB8, SANTA MONICA,56,52,54,55,1,26.2 AU , VLHJ, SOUTHERN SURVEYOR,114,1,70,105,2,79.5 AU , VNSZ, SPIRIT OF TASMANIA II,703,701,703,703,0,15.6 AU , C6FS9, STADACONA,688,478,688,688,0,24.5 AU , ZCBU6, SUN PRINCESS,7,3,5,6,0,56.1 AU , V7PB5, TANDARA SPIRIT,9,6,8,9,0,36.7 AU , VHAF, TASMANIAN ACHIEVER,18,7,15,18,0,42.1 CA , VOPP, AIVIK,190,188,190,190,0,11.3 CA , VCJM, ALGOMA ENTERPRISE,699,697,699,699,0,11.1 CA , VAAP, ALGOSCOTIA,706,704,706,706,0,11 CA , CGDT, AMUNDSEN,357,357,357,357,0,11 CA , VCLM, ARCTIC,715,710,715,715,0,11.2 CA , VOKJ, AVALON,709,707,709,709,0,11.1 CA , CGDR, BARTLETT,368,366,368,368,0,11.1 CA , VXKF, BLUE PUTTEES,715,713,715,715,0,11.1 CA , CFN3031, C. T. M. A. VACANCIER,184,182,184,184,0,11.3 CA , VCSZ, CABOT,701,699,701,701,0,11.1 CA , VOKF, CAMILLA DESGAGNES,372,370,372,372,0,11.1 CA , VCRG, CTMA MADELEINE,710,705,708,710,0,11.3 CA , VCBW, DARA DESGAGNES,361,361,361,361,0,10.9 CA , CGDX, DES GROSEILLIERS,610,608,610,610,0,11.1 CA , CG2522, DUMIT,602,600,602,602,0,11.1 CA , CG3029, EARL GREY,557,555,557,557,0,11.1 CA , CG2992, ECKALOO,498,496,498,498,0,11.1 CA , CGJV, EDWARD CORNWALLIS,189,189,189,189,0,11 CA , CGCX, GEORGE R. PEARKES,715,713,715,715,0,11 CA , CGBR, GORDON REID,705,703,705,705,0,11.1 CA , CGDS, GRIFFON,655,652,655,655,0,11.1 CA , CGHL, HENRY LARSEN,654,652,654,654,0,11.1 CA , 8PSH, I. T. INTREPID,232,232,232,232,0,14.6 CA , CG2958, JOHN P. TULLY,717,714,717,717,0,11.1 CA , CZ3695, KELLY OVAYUAK,47,47,47,47,0,11 CA , CG2350, LIMNOS,709,707,709,709,0,11.1 CA , VCWL, MARIA DESGAGNES,538,531,535,538,0,11.5 CA , CGCC, MARTHA L. BLACK,609,607,609,609,0,11.1 CA , CZ9742, NAMAO,635,634,635,635,0,11 CA , VCYL, NORDIK EXPRESS,637,635,637,637,0,11.3 CA , CFN5537, NULIAJUK,459,457,459,459,0,11.1 CA , VC6750, NUNAKPUT,653,651,653,653,0,11 CA , VOLG, OCEANEX SANDERLING,555,553,555,555,0,11.1 CA , VRYO3, OOCL MONTREAL,561,561,561,561,0,11 CA , VCBZ, PETER R. CRESSWELL,632,630,632,632,0,11.1 CA , CGSB, PIERRE RADISSON,658,656,658,658,0,11.1 CA , CG2960, SAMUEL RISLEY,671,669,671,671,0,11.1 CA , CGUM, SIR WILLIAM ALEXANDER,601,600,601,601,0,11 CA , CGJK, SIR WILFRID LAURIER,643,642,643,643,0,11 CA , 3FZK3, SKAUBRYN,188,186,188,188,0,11.3 CA , VOFG, STRAIT EXPLORER,603,601,603,603,0,11.1 CA , CGBY, TANU,576,574,576,576,0,11.1 CA , CGTF, TERRY FOX,702,700,702,702,0,11.1 CA , CG2965, W. E. RICKER,713,711,713,713,0,11.1 CA , C6SI6, WESTWOOD VICTORIA,713,708,712,712,1,11.8 CL , CCES, ESMERALDA,52,19,24,32,8,163.1 CL , CCLY, LYNCH,32,1,5,12,16,993.7 DE , C6CN4, ALBATROS,20,4,8,18,0,60.5 DE , A8UG6, ALDEBARAN,28,13,27,27,0,34.8 DE , DDKK2, ALEXANDER VON HUMBOLDT 2,13,11,12,13,0,17.7 DE , 9HXA5, ALGARVE,21,10,18,20,1,104.1 DE , 9VKY3, ALGOL,4,3,4,4,0,18.5 DE , 9VKY2, ALIOTH,12,8,12,12,0,23.2 DE , DBND, ALKOR,646,646,646,646,0,2.6 DE , V2AH1, ALVSBORG BRIDGE,33,3,7,31,0,65.1 DE , DGLM, ANDRE RICKMERS,19,10,15,18,0,38.4 DE , A8HJ2, ANGLIA,4,0,4,4,0,54 DE , A8JM5, ANL BENALLA,19,19,19,19,0,15.3 DE , A8IH2, ANL BINBURRA,25,0,20,25,0,66.8 DE , A8JJ8, ANNABA,24,20,22,23,0,28.3 DE , A8CC4, APL ARABIA,17,15,17,17,0,10.9 DE , V2AJ8, APL ARGENTINA,1,0,0,1,0,71 DE , A8CG6, APL CANADA,30,20,28,30,0,31.5 DE , V2OB8, APL CHILE,12,3,10,11,0,40.2 DE , A8JX9, APL DENMARK,6,3,5,5,1,81 DE , A8BZ6, APL EGYPT,27,12,23,24,1,62.6 DE , A8JX7, APL INDIA,9,6,9,9,0,23.2 DE , A8SZ7, APL MANILA,34,22,33,34,0,30.5 DE , A8JX8, APL SWEDEN,30,27,30,30,0,21.1 DE , A8HJ6, AQUITANIA,6,0,1,6,0,103.8 DE , DBBU, ARKONA,679,678,678,678,1,0 DE , A8HJ8, AS ALICANTIA,10,8,9,9,1,393.2 DE , A8TL9, AS CARELIA,25,20,25,25,0,19.2 DE , A8JT4, AS CARIA,3,2,3,3,0,26.3 DE , ZDKR4, AS CARINTHIA,1,1,1,1,0,11 DE , A8KC9, AS CATALANIA,11,3,5,8,0,69.3 DE , A8CK2, AS SCANDIA,2,1,2,2,0,21.5 DE , A8XD5, AS VALDIVIA,40,34,38,40,0,14.2 DE , A8SO8, AS VALENTIA,31,20,26,31,0,29 DE , A8UA9, AS VENETIA,13,0,10,13,0,68 DE , A8SO7, AS VICTORIA,10,8,10,10,0,10.9 DE , A8VV3, AS VINCENTIA,62,51,59,61,0,21.7 DE , A8SO9, AS VIRGINIA,25,7,16,22,0,58.6 DE , DBBI, ATAIR,210,210,210,210,0,2.8 DE , DILE, ATLANTA EXPRESS,55,50,54,55,0,16.5 DE , A8AD6, BACO-LINER 1,7,7,7,7,0,8 DE , A8AD7, BACO-LINER 2,24,15,20,24,0,26.5 DE , A8SF7, BAHIA,29,23,27,28,0,24.9 DE , A8SF8, BAHIA BLANCA,33,29,32,32,0,19.7 DE , A8SF9, BAHIA CASTILLO,32,11,18,23,2,108.6 DE , A8SG2, BAHIA GRANDE,16,16,16,16,0,11.4 DE , A8SG3, BAHIA LAURA,26,25,26,26,0,7.8 DE , A8ZP9, BALTRUM TRADER,21,1,9,21,0,62.4 DE , DCPY2, BANGKOK EXPRESS,10,4,7,8,1,207.1 DE , DGHX, BERLIN EXPRESS,47,45,47,47,0,15.8 DE , ELVL8, BONAVIA,21,14,18,20,0,31.6 DE , C6JC3, BREMEN,8,2,3,4,1,159.5 DE , DGZL, BREMEN EXPRESS,160,151,155,155,1,25.1 DE , DGWE2, BUDAPEST EXPRESS,12,10,12,12,0,15.2 DE , DCPX2, BUSAN EXPRESS,46,32,43,45,0,29.1 DE , A8UQ2, BUXHILL,7,6,7,7,0,21 DE , DFCW2, CANBERRA EXPRESS,86,55,83,86,0,25 DE , A8PG7, CAP BEAUFORT,10,10,10,10,0,11.7 DE , A8PI5, CAP CASTILLO,18,14,17,18,0,18.9 DE , A8MW8, CAP GABRIEL,23,17,21,23,0,24.8 DE , A8MX4, CAP GREGORY,32,18,30,32,0,28.3 DE , A8RH6, CAP HAMILTON,50,39,46,49,0,21.9 DE , A8RH7, CAP HARALD,9,8,8,8,0,22.8 DE , A8VD8, CAP HARRIET,45,32,40,42,3,112.2 DE , A8VD9, CAP HARRISSON,67,48,66,67,0,23.7 DE , A8VE2, CAP HARVEY,142,124,140,141,0,17.2 DE , A8VE3, CAP HENRI,18,10,14,17,1,112.6 DE , A8VL6, CAP JACKSON,56,44,55,56,0,20.1 DE , A8VL7, CAP JERVIS,20,20,20,20,0,16.5 DE , A8DK4, CAP MELVILLE,2,1,1,2,0,58.5 DE , A8OH4, CAP PALLISER,139,132,139,139,0,9.8 DE , A8DE3, CAP PALMAS,47,40,47,47,0,17 DE , A8MW6, CAP PALMERSTON,45,36,45,45,0,20 DE , A8NQ7, CAP PATTON,44,37,42,42,2,71.9 DE , A8MQ9, CAP PORTLAND,68,48,63,67,0,23.2 DE , DPJK, CAP RICARDA,70,49,66,70,0,20.2 DE , A8IY4, CAP ROBERTA,17,17,17,17,0,10.5 DE , A8RL5, CAP SCOTT,63,58,62,63,0,16.2 DE , DMRG, CAP VALIENTE,63,49,58,62,1,24.5 DE , A8IX9, CAP VERDE,24,17,23,24,0,24.1 DE , V7JM2, CAPE MONDEGO,8,0,5,8,0,75.2 DE , A8AC4, CARLOS FISCHER,14,6,13,14,0,31.1 DE , A8HI8, CARPATHIA,17,10,15,17,0,29.2 DE , A8IG4, CCNI ATENA,36,16,35,36,0,29.2 DE , A8IX5, CHAITEN,14,3,11,14,0,44.6 DE , DCUJ2, CHICAGO EXPRESS,37,27,36,37,0,23.6 DE , A8HJ4, CIMBRIA,3,2,3,3,0,12 DE , D5BB9, CMA CGM ALABAMA,5,3,4,5,0,22.4 DE , DIHN, CMA CGM BALZAC,10,8,10,10,0,22.8 DE , DHSI, CMA CGM BUENOS AIRES,31,15,24,30,0,40.4 DE , A8NO8, CMA CGM BUTTERFLY,28,26,27,27,0,24.5 DE , A8IE8, CMA CGM CARMEN,19,13,17,18,1,79.2 DE , A8SU4, CMA CGM CORNEILLE,1,0,1,1,0,60 DE , A8IE7, CMA CGM DON GIOVANNI,11,9,11,11,0,18.6 DE , A8OF6, CMA CGM ESPERANZA,12,7,12,12,0,20.6 DE , DCTA2, CMA CGM HUGO,45,39,45,45,0,22.4 DE , A8NO9, CMA CGM IVANHOE,11,7,7,9,2,277.5 DE , A8IG2, CMA CGM LAVENDER,3,2,3,3,0,28 DE , A8IF2, CMA CGM MIMOSA,36,0,34,36,0,55.6 DE , A8NO6, CMA CGM ORFEO,77,75,76,76,0,16.7 DE , A8LP6, CMA CGM PARSIFAL,20,17,17,17,3,226.4 DE , A8NO7, CMA CGM PELLEAS,14,0,1,5,1,175.8 DE , DCPQ2, CMA CGM QINGDAO,4,0,2,2,0,171.2 DE , DFUM2, CMA CGM VELA,19,10,17,18,0,47.8 DE , DQXQ, CMA CGM VOLTAIRE,9,6,9,9,0,30.8 DE , DIHC, COLOMBO EXPRESS,73,66,73,73,0,14.6 DE , DDJR2, CONTI ANPING,1,0,1,1,0,52 DE , A8OF7, CONTI ARABELLA,29,12,29,29,0,28.6 DE , ELTN2, CONTI CHIWAN,1,0,1,1,0,32 DE , A8OZ6, CONTI DAPHNE,2,1,1,1,1,321 DE , A8NA3, CONTI ELEKTRA,1,0,0,0,0,130 DE , A8IV9, CONTI EMDEN,10,0,8,10,0,66.5 DE , A8VH7, CONTI ESPERANCE,7,4,4,5,0,71.7 DE , A8QM9, CONTI GREENLAND,5,3,5,5,0,22.2 DE , A8LL8, CONTI SALOME,12,9,11,12,0,21.2 DE , DNHS, CONTI SHANGHAI,20,15,17,19,1,83.2 DE , DNES, CONTI SINGA,20,19,20,20,0,11.7 DE , DCSL2, COSCO CHINA,26,21,25,25,1,33.8 DE , DDDO2, COSCO GERMANY,9,8,9,9,0,25.1 DE , A8HG2, COSCO LONG BEACH,15,11,15,15,0,20.7 DE , DDGK2, COSCO NAPOLI,31,0,23,31,0,67.9 DE , A8GF4, COSCO SHENZHEN,18,17,17,18,0,16.4 DE , A8EO8, COSCO VANCOUVER,27,24,24,26,0,27.4 DE , A8EH3, COSCO YOKOHAMA,12,11,12,12,0,12.1 DE , A8QR9, CS DISCOVERY,3,0,1,3,0,79.7 DE , DQVL, CSAV APPENNINI,22,17,19,20,1,54.2 DE , DBUV, CSAV HOUSTON,26,12,22,26,0,36.7 DE , A8OH7, CSAV ITAJAI,6,4,5,6,0,30.8 DE , A8TI2, CSAV LARAQUETE,14,12,12,12,0,57.7 DE , A8IF5, CSAV PARIS,82,76,82,82,0,13.9 DE , DQVN, CSAV PYRENEES,77,47,73,75,1,33.5 DE , A8WC8, CSAV RIO BUENO,51,46,47,49,1,40.3 DE , A8TC4, CSAV RIO ILLAPEL,23,22,23,23,0,12 DE , A8RH4, CSAV ROMERAL,2,0,1,2,0,82.5 DE , A8QL5, CSAV RUNGUE,29,16,24,25,2,104 DE , A8PA8, CSAV RUPANCO,14,1,3,3,2,225.3 DE , A8IF4, CSAV VALENCIA,13,13,13,13,0,18.5 DE , A8FQ8, DAL KALAHARI,74,66,70,71,0,22.7 DE , DGXS, DALIAN EXPRESS,39,38,38,38,1,19.5 DE , DGAF, DALLAS EXPRESS,40,37,40,40,0,17.5 DE , DBBA, DENEB,632,631,631,631,1,3.5 DE , DMMC, DEUTSCHLAND,11,3,3,7,0,104.8 DE , V2OD5, DOLLART TRADER,11,5,8,10,0,50.6 DE , DHDE, DRESDEN EXPRESS,69,62,69,69,0,16.9 DE , DDSB2, DUBLIN EXPRESS,72,70,72,72,0,13.3 DE , DGDD, DUESSELDORF EXPRESS,45,43,45,45,0,11.7 DE , A8SZ3, E.R. BAVARIA,25,21,25,25,0,14.3 DE , A8VC9, E.R. BAYERN,23,22,23,23,0,21.5 DE , A8UT7, E.R. BAYONNE,18,6,16,18,0,46.6 DE , ELZX2, E.R. BERLIN,1,1,1,1,0,11 DE , A8UU3, E.R. BOSTON,62,13,57,61,0,51.1 DE , A8SZ5, E.R. BRANDENBURG,32,0,31,32,0,55.9 DE , ELYA5, E.R. BRISBANE,24,19,21,24,0,23.6 DE , A8UU2, E.R. BUENOS AIRES,25,23,25,25,0,16.9 DE , A8FL5, E.R. CAEN,5,0,4,5,0,62.2 DE , A8AL5, E.R. FREMANTLE,27,7,23,27,0,55.8 DE , A8CS3, E.R. KINGSTON,15,12,13,15,0,22.1 DE , DADD, E.R. MELBOURNE,47,38,46,46,0,20.2 DE , A8CF3, E.R. NEW YORK,13,11,12,13,0,15.7 DE , DBUQ, E.R. PUSAN,35,21,32,33,0,36.3 DE , DPTL, E.R. STRALSUND,12,4,9,12,0,41.1 DE , A8CS2, E.R. YANTIAN,4,3,4,4,0,14.2 DE , DBEA, ELBE,650,649,649,649,1,0.5 DE , ELWR2, ELBWOLF,49,13,34,38,2,84.6 DE , DBKR, ELISABETH MANN BORGESE,670,669,669,669,1,3.3 DE , A8GA5, EMIRATES GANGES,83,65,78,82,0,25 DE , DHEE, ESSEN EXPRESS,28,22,23,24,3,174.9 DE , DDZJ2, EVER CHAMPION,1,0,1,1,0,41 DE , DDZI2, EVER CHARMING,6,6,6,6,0,13.2 DE , DDZC2, EVER CHIVALRY,33,32,33,33,0,9.7 DE , DDZD2, EVER CONQUEST,11,5,11,11,0,29.1 DE , ELXU2, EYRENE,18,10,14,16,0,39.6 DE , DGZS2, FRANKFURT EXPRESS,30,26,29,30,0,18.1 DE , A8IY8, FRISIA KIEL,124,50,105,122,1,44 DE , A8IY9, FRISIA LISSABON,14,13,14,14,0,21.4 DE , A8IY6, FRISIA WISMAR,38,19,30,35,0,42.4 DE , A8FW3, GASCHEM WESER,8,0,1,3,1,219.4 DE , DDSC2, GLASGOW EXPRESS,90,79,86,89,0,21.1 DE , DHDH, HANJIN AMSTERDAM,26,17,22,25,0,38.3 DE , DHPU, HANJIN BASEL,56,0,0,0,52,950.4 DE , DDZK2, HANJIN BOSTON,9,8,9,9,0,12.9 DE , DCCN2, HANJIN CHICAGO,12,10,11,12,0,18.3 DE , DHDM, HANJIN COPENHAGEN,63,38,55,55,7,187.7 DE , DHZQ, HANJIN GENEVA,1,0,1,1,0,46 DE , DAXJ, HANJIN GOTHENBURG,29,16,26,28,1,80.5 DE , DQVJ, HANJIN HAIPHONG,14,12,13,13,0,35.5 DE , DPUW, HANJIN HELSINKI,1,0,0,1,0,101 DE , DCCM2, HANJIN LISBON,8,2,7,7,1,127.5 DE , DHQS, HANJIN MADRID,1,1,1,1,0,21 DE , DQVH, HANJIN MUNDRA,22,20,22,22,0,19.7 DE , DEDM, HANJIN PALERMO,10,9,10,10,0,7.2 DE , A8CN8, HANJIN PHILADELPHIA,7,4,6,7,0,42.4 DE , A8CN9, HANJIN PHOENIX,21,13,19,21,0,29.6 DE , A8CP6, HANJIN PRETORIA,18,12,18,18,0,21.6 DE , DQVM, HANJIN SAN DIEGO,36,33,34,35,0,20.9 DE , DFHA, HANJIN TAIPEI,1,0,1,1,0,46 DE , DIBZ, HANJIN VIENNA,33,24,29,30,1,50.5 DE , DDYZ2, HANJIN YANTIAN,5,2,5,5,0,29.2 DE , DFGX2, HANOVER EXPRESS,23,22,23,23,0,12 DE , DHAF, HANSA ATLANTIC,14,10,12,14,0,21.4 DE , ELWO6, HANSA BREMEN,74,30,45,57,3,96 DE , A8NG3, HANSA CLOPPENBURG,6,4,5,5,1,104.3 DE , DHHZ, HANSA CONSTITUTION,4,2,3,3,1,371.2 DE , DPTT, HANSA INDIA,23,11,17,22,1,65.7 DE , ELUC5, HANSA LUEBECK,44,17,25,34,1,83.6 DE , ELUA3, HANSA STOCKHOLM,11,5,7,9,1,86.4 DE , DBZT, HANSA VICTORY,16,15,16,16,0,13.8 DE , ELWR5, HANSA VISBY,15,15,15,15,0,8.3 DE , DDZG2, HATSU COURAGE,5,1,5,5,0,37.2 DE , DDZH2, HATSU CRYSTAL,32,22,31,32,0,17.6 DE , A8CG7, HEIKE P,20,13,19,20,0,21.8 DE , DBCK, HEINCKE,634,634,634,634,0,3.3 DE , A8IS6, HELLE RITSCHER,3,1,3,3,0,32.7 DE , DPUA, HELVETIA,1,0,1,1,0,41 DE , DDSE2, HERMANN WULFF,13,13,13,13,0,14 DE , V2CL5, HERMES,32,2,16,29,2,154.8 DE , DHER, HOECHST EXPRESS,18,14,17,18,0,21.3 DE , DHEB, HONG KONG EXPRESS,15,13,14,14,1,111.8 DE , DCCR2, HOUSTON EXPRESS,5,5,5,5,0,0.8 DE , D5AG8, HR RECOGNITION,35,1,1,11,10,388.9 DE , D5AG9, HR RESOLUTION,2,1,1,2,0,39.5 DE , A8GK6, HS BEETHOVEN,14,7,11,12,0,49 DE , DDDI2, HYUNDAI TIANJIN,84,25,48,59,3,104.7 DE , A8GH5, IBN ASAKIR,155,26,147,152,1,41.4 DE , A8RU5, ILSE WULFF,15,2,8,12,1,95.4 DE , A8MM4, INDEPENDENT ACCORD,6,1,5,6,0,39 DE , A8MJ4, INDEPENDENT CONCEPT,9,1,1,4,2,181.9 DE , A8MB5, INDEPENDENT PURSUIT,17,14,14,14,1,64.8 DE , A8CG2, INDEPENDENT VENTURE,8,2,4,7,0,62.2 DE , A8XY2, INDEPENDENT VOYAGER,46,42,45,46,0,14 DE , A8CH8, ISODORA,20,5,18,20,0,44.7 DE , A8ID9, ITAJAI EXPRESS,23,22,23,23,0,13.5 DE , DDZF2, ITAL CONTESSA,3,1,2,2,1,501 DE , A8LN2, ITAL ORIENTE,25,13,21,24,0,45 DE , A8FA5, JANUS,11,5,11,11,0,26.6 DE , A8RV6, JPO DELPHINUS,26,4,15,26,0,68.2 DE , A8RW2, JPO DORADO,1,0,1,1,0,42 DE , A8VF7, JPO GEMINI,24,24,24,24,0,10.2 DE , A8GU4, JPO LEO,26,22,25,25,0,20.5 DE , A8KC6, JPO SCORPIOS,43,37,41,43,0,17.8 DE , A8RW4, JPO TUCANA,14,4,11,14,0,51.2 DE , A8RV7, JPO VELA,16,8,13,14,2,216.6 DE , A8RV9, JPO VIRGO,7,6,7,7,0,14.7 DE , A8RW3, JPO VOLANS,92,66,91,92,0,23.1 DE , A8RW5, JPO VULPECULA,5,3,4,5,0,28.4 DE , DDLK, JULIUS S,13,10,13,13,0,16.5 DE , A8FA6, JUPITER,9,1,4,8,0,73.9 DE , V2NA1, KATHARINA S,28,22,28,28,0,18.6 DE , DEHZ, KIEL EXPRESS,104,85,99,100,1,26.5 DE , DGSE, KOBE EXPRESS,27,27,27,27,0,7.1 DE , A8KJ4, KOLLMAR,1,0,0,0,0,233 DE , ELVZ7, KOTA MAJU,5,1,5,5,0,34.6 DE , ELZY4, KOTA SEGAR,5,1,5,5,0,33.2 DE , DFNB2, KUALA LUMPUR EXPRESS,50,0,46,50,0,57.3 DE , DCPI2, KYOTO EXPRESS,19,19,19,19,0,10.4 DE , DIJY2, LEBLON,26,21,26,26,0,17.1 DE , DEHY, LEVERKUSEN EXPRESS,57,51,52,52,5,134.9 DE , A8AY3, LILY OLDENDORFF,2,0,1,1,1,544.5 DE , DDSD2, LIVERPOOL EXPRESS,48,46,48,48,0,12.7 DE , ELZU3, LIWIA P,18,8,17,18,0,34.2 DE , DPLE, LONDON EXPRESS,131,122,131,131,0,16.6 DE , DCPZ2, LOS ANGELES EXPRESS,17,8,17,17,0,33.2 DE , DDYY2, LT CORTESIA,9,6,6,9,0,41.2 DE , A8GU5, MAERSK DABOU,5,4,5,5,0,26.4 DE , A8EH5, MAERSK DALLAS,19,14,19,19,0,19.3 DE , A8OU4, MAERSK DAMIETTA,10,8,8,9,0,35 DE , A8IJ4, MAERSK DANBURY,57,41,55,57,0,23.8 DE , A8GU6, MAERSK DANVILLE,7,6,7,7,0,19.7 DE , DDBB2, MAERSK DELLYS,65,10,57,63,0,53.9 DE , A8EH2, MAERSK DENVER,35,26,33,34,1,31.7 DE , DDAC2, MAERSK DERINCE,36,26,35,35,0,29.2 DE , A8PX5, MAERSK DHAHRAN,14,4,14,14,0,31.6 DE , A8IY2, MAERSK DIEPPE,39,38,39,39,0,11.1 DE , A8JE6, MAERSK DRURY,32,29,30,32,0,18.2 DE , A8GU8, MAERSK DUNCAN,16,16,16,16,0,10.8 DE , A8IX7, MAERSK DUNEDIN,15,11,14,15,0,27.5 DE , A8PX4, MAERSK JEFFERSON,6,0,2,6,0,65.2 DE , A8PW8, MAERSK KARLSKRONA,28,16,19,25,1,63.1 DE , VREX7, MAERSK NIAMEY,3,3,3,3,0,11.7 DE , VRFO7, MAERSK NIMES,23,13,16,19,0,52.2 DE , VRFW5, MAERSK NITEROI,16,7,12,16,0,34.5 DE , A8MZ9, MAERSK SEMARANG,39,36,39,39,0,13.7 DE , DDJQ2, MAERSK SHEERNESS,19,2,17,19,0,53.9 DE , DDSX2, MAERSK SURABAYA,43,38,42,42,1,47.7 DE , A8SE3, MALLECO,11,3,10,11,0,49.6 DE , V2OS3, MARE GALLICUM,21,6,15,20,1,62 DE , DBBT, MARIA S. MERIAN,686,685,685,685,1,0 DE , ELSP9, MASOVIA,3,0,2,3,0,73.3 DE , A8CC9, MATILDE,64,60,63,64,0,11.4 DE , A8JR5, MCC SHANGHAI,42,32,39,39,0,31.1 DE , DBFX, MEERKATZE,8,0,0,0,0,343.5 DE , DBPG, MELLUM,1,0,0,1,0,102 DE , V2OH7, MENTOR,2,0,0,1,0,131.5 DE , DEIR, MERKUR BAY,8,3,7,7,0,55.8 DE , ELZA5, MERKUR CLOUD,41,36,41,41,0,17.3 DE , DDPH, MERKUR SKY,33,31,31,32,1,37.2 DE , DBBH, METEOR,656,573,606,630,4,29.1 DE , DDJI, MICHAELA S,1,0,1,1,0,42 DE , A8MG8, MIZAR,11,3,10,11,0,34.2 DE , A8RL4, MOL CALEDON,56,56,56,56,0,12.2 DE , A8IX8, MOL CULLINAN,40,33,40,40,0,21.1 DE , V2MH, MOL DREAM,16,13,15,15,1,78.9 DE , A8CH9, MOL SYMPHONY,2,0,0,0,2,518.5 DE , DGOH2, MONTE ACONCAGUA,19,9,19,19,0,33.5 DE , DFWV2, MONTE ALEGRE,16,16,16,16,0,14.9 DE , DFTH2, MONTE AZUL,5,4,5,5,0,16.2 DE , DHTK, MONTE CERVANTES,52,47,52,52,0,15 DE , DAJC, MONTE OLIVIA,25,19,25,25,0,19.4 DE , DNCQ, MONTE PASCOAL,7,7,7,7,0,12.1 DE , DGHJ, MONTE ROSA,18,18,18,18,0,11.7 DE , DCLH2, MONTE SARMIENTO,8,3,8,8,0,36.8 DE , DFKP2, MONTE TAMARO,14,11,13,14,0,21.1 DE , DPOG, MSC ADRIATIC,73,66,72,73,0,15.2 DE , DPMT, MSC ANTARES,25,15,25,25,0,24.2 DE , A8ZU9, MSC BARCELONA,53,37,52,53,0,24.5 DE , A8YD3, MSC BARI,23,12,20,20,3,210.8 DE , A8HS4, MSC BEIJING,38,33,38,38,0,18.9 DE , DIUR2, MSC BENEDETTA,28,22,27,28,0,23 DE , A8IM7, MSC BILBAO,6,2,2,6,0,59.5 DE , A8LK7, MSC BREMEN,30,16,28,29,1,71.9 DE , A8EY5, MSC BRINDISI,7,7,7,7,0,10.4 DE , A8HS3, MSC BRUXELLES,28,20,25,28,0,24.9 DE , A8HR5, MSC BUSAN,9,8,9,9,0,15.6 DE , DDJG2, MSC CAROUGE,12,8,12,12,0,26.6 DE , A8JC5, MSC CHARLESTON,74,66,72,74,0,18.7 DE , A8HS2, MSC CHICAGO,27,26,27,27,0,15.6 DE , D5BU7, MSC CRISTINA,167,107,152,167,0,28.6 DE , A8IG3, MSC DAVOS,3,3,3,3,0,13.3 DE , A8VG3, MSC ENGLAND,30,26,29,30,0,21.9 DE , A8KO3, MSC FIRENZE,1,0,0,1,0,112 DE , DHZR, MSC FLAMINIA,25,5,14,21,1,89 DE , A8GJ5, MSC FLORIDA,17,5,10,13,0,71.6 DE , A8VH6, MSC FUJI,5,3,5,5,0,28.4 DE , DBUT, MSC GEMMA,17,9,16,17,0,29.9 DE , A8UX5, MSC GENOVA,27,8,24,27,0,43 DE , DARU, MSC ILONA,21,18,20,21,0,14 DE , A8LL9, MSC LISBON,18,16,18,18,0,17.8 DE , DIGY2, MSC LIVORNO,11,9,10,11,0,18.9 DE , DPJW, MSC MIRA,37,24,34,35,0,34.2 DE , D5BL4, MSC MONTEREY,8,8,8,8,0,13.8 DE , A8CJ2, MSC PRAGUE,4,3,4,4,0,0 DE , A8KX4, MSC ROMA,54,44,50,53,0,23.5 DE , A8HO3, MSC SHANGHAI,9,7,9,9,0,16.2 DE , DQVI, MSC TANZANIA,18,16,18,18,0,16.6 DE , A8ZE4, MSC TARANTO,82,79,82,82,0,13.4 DE , DCSY2, MSC TEXAS,20,16,18,20,0,24.5 DE , A8JM6, MSC TOKYO,3,2,2,3,0,46.3 DE , DQVK, MSC UGANDA,14,14,14,14,0,3.8 DE , D5BE4, MSC VEGA,42,29,38,40,0,33 DE , A8CI9, MSC VIENNA,16,7,12,16,0,50.5 DE , A8ZV8, MSC VIGO,47,34,43,46,0,24.2 DE , V7LZ9, NADIR,10,6,8,10,0,35.7 DE , DGWD2, NAGOYA EXPRESS,77,47,75,76,1,46.9 DE , A8EG9, NEDLLOYD VALENTINA,13,6,6,6,5,532.8 DE , V7LZ8, NEPTUN,3,1,1,3,0,48.7 DE , DBJM, NEUWERK,691,690,690,690,1,0.3 DE , VSXC9, NEW ORLEANS EXPRESS,11,8,10,10,1,49.6 DE , A8IT6, NILEDUTCH DURBAN,6,5,5,5,0,39.8 DE , A8JK4, NILEDUTCH GUANGHOU,27,15,25,26,0,34.3 DE , A8XA3, NILEDUTCH SHENZHEN,15,12,14,14,1,67.9 DE , DGOS, NORFOLK EXPRESS,43,34,42,43,0,22.9 DE , A8CB7, NORTHERN ENDEAVOUR,19,1,1,5,3,215.8 DE , A8CB9, NORTHERN ENDURANCE,70,45,61,68,0,35.9 DE , A8HA7, NORTHERN ENTERPRISE,6,0,0,2,2,462 DE , D5BI4, NORTHERN RELIANCE,1,0,1,1,0,31 DE , DCQR2, NORTHERN VIVACITY,23,9,18,23,0,45.5 DE , DCSI2, NORTHERN VOLITION,7,5,6,6,1,231.4 DE , DEGI, NOVIA,17,15,17,17,0,16 DE , DDFD2, NYK GALAXY,1,1,1,1,0,30 DE , V2FN, OCEAN,1,0,0,0,0,261 DE , A8LG7, OLIVIA,14,0,10,14,0,70.6 DE , DEGK, OLIVIA,36,28,35,36,0,14.1 DE , V2KA9, OMEGAGAS,4,0,1,2,0,120 DE , 9HA2545, ORION,13,0,13,13,0,43.3 DE , DDVK2, OSAKA EXPRESS,17,13,16,16,0,22.8 DE , A8MV6, PACIFIC FANTASY,21,5,19,20,0,41.4 DE , DCSZ2, PACIFIC LINK,11,9,10,10,1,145.2 DE , DBRE, PARADISE N,11,4,9,11,0,49.1 DE , DIHE, PARIS EXPRESS,21,21,21,21,0,10.7 DE , ZDKS7, PAZIFIK,8,7,8,8,0,16.2 DE , A8CO2, PIRO,33,18,26,29,1,90.5 DE , DBLK, POLARSTERN,186,123,123,146,3,55.6 DE , ELZU7, POMMERN,1,1,1,1,0,30 DE , A8UN3, PORTO,6,4,6,6,0,22.3 DE , DQVO, PORTUGAL,6,6,6,6,0,8 DE , DIOB, POS HONGKONG,31,23,30,30,0,39.2 DE , DBKV, POSEIDON,558,557,557,557,1,0 DE , A8NF2, POSEN,40,22,31,40,0,35.3 DE , ELZU8, POTSDAM,22,0,16,22,0,70.1 DE , ELYS6, POWHATAN,2,2,2,2,0,13 DE , DGZR2, PRAGUE EXPRESS,3,3,3,3,0,10.7 DE , ELYP7, PREMNITZ,26,21,26,26,0,13.9 DE , A8KY7, PUELCHE,19,3,11,16,1,111.8 DE , DQVG, PUSAN,21,19,21,21,0,10.3 DE , A8TH7, RDO CONCERT,37,0,32,36,0,64.4 DE , V7EG5, RICKMERS ANTWERP,2,1,2,2,0,42.5 DE , V7FS3, RICKMERS DALIAN,97,38,60,63,25,259.5 DE , V7FF2, RICKMERS NEW ORLEANS,6,3,5,6,0,35.7 DE , V7EE5, RICKMERS SINGAPORE,13,10,12,13,0,20.8 DE , V7DW6, RICKMERS TOKYO,7,5,7,7,0,25.9 DE , D5BO9, RIO BLANCO,18,16,17,17,0,17 DE , DDID2, RIO DE JANEIRO,22,15,21,22,0,22 DE , DMQN, RIO DE LA PLATA,9,8,9,9,0,12.8 DE , DGUG2, RIO MADEIRA,29,27,29,29,0,14.7 DE , DFVY2, RIO NEGRO,22,3,5,8,8,242.5 DE , A8JR4, RIO TAKU,50,47,50,50,0,13.2 DE , DMRX, ROTTERDAM EXPRESS,69,65,68,69,0,13.4 DE , A8CI8, SAAR N,63,38,46,46,17,228.8 DE , DILS, SAMARIA,39,37,39,39,0,13.9 DE , A8PC8, SAN ADRIANO,64,52,59,64,0,36.5 DE , A8PG8, SAN ALESSIO,13,10,12,13,0,27.4 DE , A8OK6, SAN AMERIGO,11,6,8,11,0,40.7 DE , A8OK7, SAN ANDRES,19,13,14,19,0,39.4 DE , A8PC7, SAN ANTONIO,7,5,7,7,0,23 DE , A8PC9, SAN AURELIO,18,17,18,18,0,14.6 DE , ELVB3, SAN CLEMENTE,29,14,25,29,0,42.2 DE , ELVB6, SAN CRISTOBAL,26,14,24,24,1,88.3 DE , DNEN, SAN FELIPE,31,27,30,30,0,24.3 DE , DIGF, SAN FRANCISCO,26,15,26,26,0,24.1 DE , ELVG8, SAN ISIDRO,1,0,1,1,0,52 DE , ELVG2, SAN VICENTE,23,21,23,23,0,13.2 DE , A8JZ4, SANTA BALBINA,10,7,10,10,0,31.5 DE , ELVF4, SANTA BARBARA,43,26,41,42,0,38.7 DE , A8JZ3, SANTA BELINA,23,7,19,23,0,51.6 DE , A8NQ5, SANTA BETTINA,25,23,25,25,0,13.9 DE , A8OK5, SANTA BIANCA,19,14,19,19,0,22.1 DE , A8YJ9, SANTA CATARINA,26,3,6,12,7,256.2 DE , DAJT, SANTA CLARA,17,11,16,17,0,25.1 DE , A8YW2, SANTA CRUZ,39,37,38,38,1,24.3 DE , A8IR6, SANTA ELENA 1,1,1,1,1,0,10 DE , A8IQ2, SANTA FELICITA,28,21,27,28,0,22.9 DE , DGSR, SANTA FRANCESCA,39,27,38,39,0,25.6 DE , A8IP8, SANTA GIANNINA,86,51,76,84,0,31.5 DE , A8IP9, SANTA GIORGINA,7,4,6,6,1,137.9 DE , DGGH, SANTA GIOVANNA,13,12,12,13,0,14.3 DE , ELYR2, SANTA GIULIANA,21,17,18,21,0,22 DE , DGGE, SANTA GIULIETTA,16,15,16,16,0,13.9 DE , ELVG7, SANTA MONICA,4,4,4,4,0,12 DE , A8IY3, SANTA PAOLA,35,25,32,32,2,48.4 DE , DCDO2, SANTA PELAGIA,60,46,60,60,0,21.2 DE , DCDP2, SANTA PHILIPPA,15,15,15,15,0,13.6 DE , DPRB, SANTA RAFAELA,12,5,5,12,0,44.6 DE , DPGZ, SANTA REBECCA,15,13,15,15,0,15.8 DE , DIOY2, SANTA RITA,32,22,29,30,1,44.8 DE , A8RK9, SANTA ROMANA,16,0,10,16,0,75.8 DE , A8ZS7, SANTA ROSA,19,0,1,6,4,236.9 DE , A8RL2, SANTA ROSANNA,18,16,18,18,0,15.1 DE , A8RL3, SANTA RUFINA,6,2,5,6,0,44.8 DE , D5AH6, SANTA TERESA,26,23,26,26,0,18.4 DE , 5BPA3, SARAH SCHULTE,52,33,49,50,0,28.9 DE , DNDD, SAVANNAH EXPRESS,65,57,65,65,0,14.2 DE , DGOQ, SCHARHOERN,43,20,30,36,2,96.7 DE , A8UE4, SEATTLE EXPRESS,23,18,21,23,0,24.6 DE , DBFC, SEEADLER,457,14,14,14,0,332.2 DE , DBFI, SEEFALKE,416,11,11,11,0,333.7 DE , DHBN, SEOUL EXPRESS,48,36,46,46,0,24.9 DE , A8OO9, SEVILLIA,3,2,3,3,0,30.3 DE , A8PF5, SICILIA,5,3,4,4,1,314.4 DE , DGZT2, SOFIA EXPRESS,75,39,65,75,0,37.4 DE , DBFH, SOLEA,554,553,553,553,1,3.1 DE , DGBE, STUTTGART EXPRESS,36,32,36,36,0,17.5 DE , A8AW2, SUAPE EXPRESS,1,1,1,1,0,21 DE , A8IL9, TABEA,24,14,20,23,0,36.5 DE , V7LZ7, TAURUS,34,0,24,34,0,54.7 DE , A8BS7, TIGER SHARK,1,0,1,1,0,43 DE , A8KI4, TIGER SKY,1,0,0,0,0,323 DE , DGTX, TOKYO EXPRESS,69,50,68,69,0,19.8 DE , A8XZ8, TRAVE TRADER,2,1,1,1,0,78.5 DE , A8OP7, TS KOREA,8,5,8,8,0,31.9 DE , DDYL2, TSINGTAO EXPRESS,52,35,43,48,0,36.9 DE , A8RV8, UASC AJMAN,21,7,10,15,0,94.7 DE , A8KN6, UASC DAMMAM,21,20,21,21,0,12.3 DE , A8UL5, UASC JEDDAH,41,22,37,40,1,40.6 DE , A8UL3, UASC RAMADI,6,5,5,6,0,19.8 DE , DCPL2, UASC SHARJAH,40,36,39,39,1,30.8 DE , A8UL4, UASC SHUAIBA,40,32,38,40,0,22.7 DE , V7MA7, URANUS,44,22,41,44,0,33.1 DE , A8SE8, VALPARAISO EXPRESS,22,22,22,22,0,12.7 DE , A8UE5, VANCOUVER EXPRESS,38,35,37,37,1,56.9 DE , DGWF2, VIENNA EXPRESS,8,4,7,8,0,36.6 DE , A8UJ3, VIONA,30,20,23,28,0,29.4 DE , DBFR, WALTHER HERWIG 3,406,406,406,406,0,0 DE , DBBC, WEGA,611,610,610,610,1,3.6 DE , V7DI2, WEHR ALTONA,1,1,1,1,0,21 DE , V7DT6, WEHR BILLE,12,8,12,12,0,21.6 DE , V7CY4, WEHR BLANKENESE,18,11,15,17,0,31.4 DE , V7DY3, WEHR HAVEL,48,7,15,30,4,141.1 DE , V7DG6, WEHR WESER,48,7,10,48,0,61.3 DE , DFCX2, WELLINGTON EXPRESS,90,88,90,90,0,14.1 DE , DBEB, WESER,621,621,621,621,0,0.3 DE , A8JY5, WESTERDIEK,9,0,7,8,0,80.4 DE , DFRZ, WESTERHAMM,8,5,8,8,0,27.1 DE , A8CH2, WESTERMOOR,12,12,12,12,0,15.2 DE , ELWZ5, WESTWOOD CASCADE,50,22,40,45,3,63.7 DE , A8AJ4, WESTWOOD DISCOVERY,9,7,8,9,0,13.4 DE , DANR, WESTWOOD PACIFIC,21,21,21,21,0,11.7 DE , A8KH9, WIDUKIND,37,32,35,37,0,16.3 DE , A8CG3, WILHELM E,13,0,11,13,0,62.7 DE , DPTS, WOTAN,3,2,3,3,0,11 DE , A8PB2, X-PRESS MAKALU,5,5,5,5,0,5 DE , DPCK, YANTIAN EXPRESS,4,4,4,4,0,11.8 DE , A8VN4, YM KWANG YANG,16,16,16,16,0,16.3 DE , A8FU7, ZIM BEIJING,26,19,22,23,3,160.3 DE , DFZB2, ZIM ONTARIO,19,13,16,18,1,94.3 DE , A8ER9, ZIM SAVANNAH,45,38,44,45,0,15 FR , ROSS, LA LOUISE,294,294,294,294,0,5.1 FR , MNDC9, SAFMARINE MERU (AWS),10,9,10,10,0,19.2 FR , FLAO, VAGABOND (AWS),718,284,555,702,1,45.2 GB , ZCDV2, Adonia,53,40,44,45,2,55.4 GB , PJKV, Agulhas Stream,46,45,45,46,0,13.2 GB , V7PU9, Al Ghuwairiya,82,65,81,82,0,14.4 GB , HZGN, Al Mareekh,25,20,21,24,1,48.8 GB , HZGH, Al Moshtaree,35,31,33,35,0,14.8 GB , HZDD, Al Zohal 1,22,19,22,22,0,16 GB , VQKZ6, Amazonas,43,23,33,39,3,192.4 GB , S6JU, APL Iris,35,29,33,33,2,93.2 GB , 9VVD, APL Jade,22,12,21,21,0,35.3 GB , ZCDN2, Arcadia,54,38,48,51,0,30.9 GB , ZCDW9, Aurora,43,28,33,34,3,73.8 GB , ZCEE2, Azura,59,29,34,36,12,205.5 GB , C6QF6, Barbet Arrow,7,3,4,6,1,192.7 GB , OXVA2, Beaumont,83,46,81,82,1,42.3 GB , PENR, Benguela Stream,163,153,162,162,0,15.9 GB , OZCZ2, Bentonville,16,10,14,16,0,23.2 GB , 3EDI6, Berge Arctic,71,45,71,71,0,22.1 GB , LAIP5, Berge Atlantic,18,15,17,17,0,22.6 GB , MCLJ8, British Beech,14,2,12,14,0,54.9 GB , MGRH9, British Chivalry,32,19,29,32,0,31.1 GB , MPMM5, British Commerce,28,23,27,28,0,18.7 GB , MLJA8, British Confidence,7,1,4,4,0,90.9 GB , MGRX2, British Cormorant,50,38,50,50,0,21.6 GB , MRSA8, British Councillor,2,1,2,2,0,32.5 GB , MNYF6, British Courage,27,14,19,24,0,47.6 GB , MHNL6, British Courtesy,30,26,28,28,1,40.8 GB , MCCW7, British Curlew,63,52,62,63,0,4.3 GB , MGSG6, British Cygnet,50,27,45,50,0,28.6 GB , 2AKI4, British Diamond,63,62,62,62,1,26.2 GB , MGSM5, British Eagle,32,25,28,29,0,39.2 GB , MIBR, British Emerald,1,1,1,1,0,22 GB , MVQP8, British Emissary,39,37,38,39,0,16.4 GB , MMER9, British Ensign,61,27,55,61,0,31.5 GB , MNAN4, British Envoy,60,53,55,56,1,36.5 GB , VQIV8, British Esteem,8,4,4,5,1,147 GB , VQGB2, British Explorer,39,30,38,38,1,22.5 GB , MGRL8, British Falcon,11,11,11,11,0,11 GB , MGRX9, British Gannet,18,16,17,18,0,17.3 GB , MHMZ8, British Harmony,52,45,50,51,0,19 GB , VQFV3, British Hawthorn,25,15,19,25,0,33.7 GB , MCUV3, British Hazel,63,15,48,63,0,44 GB , MCZN2, British Holly,59,36,45,52,5,132.8 GB , VQHO7, British Innovator,70,70,70,70,0,10.7 GB , MGGF9, British Integrity,5,5,5,5,0,10 GB , MGRL4, British Kestrel,25,16,23,24,1,45.4 GB , VQAJ8, British Laurel,37,7,20,29,1,86.5 GB , MFLM9, British Liberty,25,14,24,24,1,44.6 GB , MGPU2, British Mallard,57,51,55,57,0,17.4 GB , VQIB9, British Merchant,69,62,66,68,0,7.4 GB , VQOG5, British Merlin,39,39,39,39,0,4.5 GB , VQKR7, British Oak,116,71,108,116,0,25.4 GB , MCCN6, British Osprey,37,37,37,37,0,11.9 GB , ZQTP2, British Pride,58,44,58,58,0,20.5 GB , MZDL7, British Progress,1,0,1,1,0,52 GB , ZQCP3, British Purpose,3,2,3,3,0,23.7 GB , MGSH7, British Robin,10,3,9,10,0,40.8 GB , 2AKI2, British Ruby,18,13,16,18,0,27.4 GB , 2AKI3, British Sapphire,3,0,2,3,0,73 GB , MEPP3, British Security,24,21,23,24,0,17 GB , MHNO6, British Serenity,4,3,4,4,0,5.5 GB , VQNW6, British Swift,20,14,17,19,1,41.2 GB , MDTE9, British Tenacity,52,11,44,52,0,53.9 GB , ZIPR7, British Trader,36,31,33,33,1,38.1 GB , MHNN5, British Tranquillity,37,17,28,37,0,35.3 GB , MFLQ4, British Unity,53,31,46,52,0,37.7 GB , MDGV9, British Vine,18,15,17,17,1,95.3 GB , VQIC2, British Willow,13,13,13,13,0,11.7 GB , OXVD2, Brownsville,83,49,71,76,2,50.7 GB , ZCBO2, Buccleuch,4,0,0,3,0,128.8 GB , S6OM, Cable Retriever,14,2,13,14,0,42.7 GB , ZCBW2, Cape Carmel,35,32,34,34,0,19 GB , ZCDG8, Caribbean Princess,85,67,77,81,3,47.8 GB , C6KD7, Chiquita Belgie,83,69,82,83,0,18.3 GB , C6VR4, Chiquita Bremen,68,65,67,68,0,14.5 GB , C6KD8, Chiquita Deutschland,29,25,29,29,0,17.6 GB , C6KD5, Chiquita Italia,43,40,42,43,0,18.3 GB , C6KD6, Chiquita Nederland,7,7,7,7,0,12.3 GB , C6VR5, Chiquita Rostock,20,18,20,20,0,16.4 GB , C6KD4, Chiquita Scandinavia,31,30,31,31,0,11.1 GB , C6KD9, Chiquita Schweiz,58,48,58,58,0,17.8 GB , ZCDF4, Coral Princess,50,46,46,48,2,57.4 GB , C6XQ2, Corella Arrow,32,23,27,29,0,42.1 GB , C6IO9, Cormorant Arrow,12,9,11,12,0,19.3 GB , ZCDM6, Crown Princess,41,35,37,39,2,52.8 GB , VRBH6, CSAV Licanten,2,0,0,0,2,1544.5 GB , VRBH4, CSCL Dalian,17,16,17,17,0,2.6 GB , ZCBU2, Dawn Princess,40,33,38,39,1,33.5 GB , ZCDF8, Diamond Princess,25,16,22,22,1,40.9 GB , ZCDP8, Emerald Princess,78,51,64,71,1,47.4 GB , C6OR4, Emu Arrow,80,71,78,79,0,0 GB , ZDLS1, Ernest Shackleton,3,3,3,3,0,0 GB , 2AAY7, FS Aquarius,19,15,15,15,0,53.1 GB , ZCDA9, Golden Princess,33,16,20,30,2,107.7 GB , ZCBU5, Grand Princess,89,79,86,87,0,0 GB , ZQAY4, Grasmere Maersk,90,81,88,89,1,30.8 GB , C6OM7, Grebe Arrow,38,30,36,36,1,30.8 GB , C6JE2, Harefield,14,13,14,14,0,21.2 GB , C6CU6, Ibis Arrow,71,63,69,70,0,23.4 GB , ZCDG4, Island Princess,4,3,4,4,0,14.5 GB , C6RM7, Jaeger Arrow,42,38,38,39,1,13.5 GB , ZDLP, James Clark Ross,99,81,87,90,2,29.4 GB , OYYK2, Jens Maersk,17,12,15,16,0,26.5 GB , MQPF2, Jervis Bay,5,3,4,5,0,35 GB , C6QF4, Kestrel Arrow,1,1,1,1,0,21 GB , PHBO, Klipper Stream,42,35,39,40,0,29.1 GB , E5U2135, Lapponian Reefer,34,32,32,33,1,24.6 GB , OVSB2, Lars Maersk,33,23,26,31,0,27.8 GB , OVZV2, Laust Maersk,47,39,44,46,0,22.3 GB , OYYL2, Lexa Maersk,30,22,26,30,0,24.8 GB , ZCBD3, Lisbon Express,21,11,18,20,0,39.3 GB , ZCDM8, LNG Adamawa,44,21,41,43,1,33 GB , ZCDL9, LNG Akwa Ibom,20,6,13,17,0,68.2 GB , MYJG2, Loch Rannoch,3,3,3,3,0,14.3 GB , OZDA2, Maersk Brooklyn,22,4,20,22,0,37.8 GB , OXVE2, Maersk Buffalo,14,0,7,13,0,73.1 GB , MQYA3, Maersk Dalton,8,7,8,8,0,19.2 GB , MQEC7, Maersk Darlington,1,1,1,1,0,11 GB , MRGU3, Maersk Dartford,38,35,38,38,0,14 GB , MSTM6, Maersk Dauphin,9,8,9,9,0,10.9 GB , MSDM7, Maersk Delano,24,15,24,24,0,33.8 GB , MTFH5, Maersk Delmont,30,28,30,30,0,16.4 GB , VQBW2, Maersk Gateshead,40,27,39,39,0,27.3 GB , MYJU, Maersk Kelso,27,9,21,27,0,54.3 GB , MTDU5, Maersk Kendal,16,14,16,16,0,17.2 GB , VRGJ6, Maersk Kiel,66,50,62,64,0,26.7 GB , ZNQO3, Maersk Kithira,51,24,44,50,0,30.2 GB , VRGM8, Maersk Kyrenia,45,38,42,44,1,25.4 GB , 9V9763, Maersk Laguna,4,2,2,2,1,198 GB , VRJH7, Maersk Lebu,2,1,1,1,1,702.5 GB , A8PK9, Maersk Miami,9,4,8,9,0,35.2 GB , OZDJ2, Maersk Newport,21,16,19,19,0,27.1 GB , OZDK2, Maersk Norfolk,35,26,29,33,0,29.6 GB , A8DH2, Maersk Nottingham,7,7,7,7,0,13.9 GB , MYSU5, Maersk Patras,20,0,1,2,15,1206.4 GB , MZFR9, Maersk Rapier,8,0,6,7,0,54.8 GB , OWIX2, Maersk Rosyth,24,6,19,23,1,103.6 GB , A8KW3, Maersk Saigon,7,6,6,7,0,29.4 GB , A8JS7, Maersk Sana,25,6,22,25,0,48.8 GB , A8JK7, Maersk Santana,27,21,23,25,2,172.4 GB , DDJS2, Maersk Sarnia,49,37,46,46,0,33.4 GB , A8LK3, Maersk Seoul,32,27,32,32,0,17.9 GB , A8LW6, Maersk Singapore,28,10,23,28,0,43.5 GB , A8KW2, Maersk Stralsund,11,0,0,1,4,802.4 GB , DDJU2, Maersk Sydney,5,4,5,5,0,19.4 GB , S6TV, Maersk Wave,15,12,13,14,1,52.7 GB , V7TU9, Maestro Lion,40,40,40,40,0,11.8 GB , C6OA3, Mandarin Arrow,1,0,1,1,0,41 GB , LAMG7, Merlin Arrow,39,36,38,39,0,14.1 GB , ZCDH7, Milan Express,5,2,4,5,0,36.4 GB , C6NI8, Mozu Arrow,50,39,49,50,0,12 GB , ZQDI9, Nedlloyd Drake,73,31,64,73,0,41.9 GB , A8PK8, Nedlloyd Honshu,17,17,17,17,0,13.6 GB , MZER8, Nedlloyd Hudson,88,25,72,86,0,52 GB , A8DG9, Nedlloyd Marita,67,63,67,67,0,13.6 GB , MZFC6, Nedlloyd Tasman,32,24,27,28,1,80.7 GB , ZCDS4, Ocean Princess,32,19,22,24,4,141.5 GB , ZCDN9, Oceana,31,20,29,30,0,21.7 GB , OXKO2, Olivia Maersk,23,2,18,21,0,66.7 GB , VRVQ9, OOCL Belgium,16,12,16,16,0,17.1 GB , ZCDU9, Oriana,7,6,7,7,0,18.4 GB , GDTT, Pacific Guardian,34,21,27,31,1,47.5 GB , VQKZ5, Parana,17,10,16,17,0,28.6 GB , C6JE4, Petersfield,26,12,23,24,1,54.1 GB , C6NZ3, Pine Arrow,40,24,36,38,0,38.3 GB , C6OT4, Plover Arrow,55,54,55,55,0,9 GB , C6TQ3, Poplar Arrow,26,0,1,13,0,121.3 GB , ZCEF2, Queen Elizabeth,40,29,35,37,2,44.4 GB , ZCEF6, Queen Mary 2,47,24,37,40,4,142.6 GB , ZCEF3, Queen Victoria,12,10,10,10,0,53.2 GB , 9HA2950, Quest for Adventure,47,9,22,32,8,199.7 GB , ZCBV4, Quorn,40,27,39,39,0,26.6 GB , A8JR6, Rio Thelon,38,33,38,38,0,16.1 GB , ZCDY2, Ruby Princess,47,35,42,42,2,42.7 GB , 2BLY2, Safmarine Bayete,49,22,35,45,0,50.7 GB , 2BLY5, Safmarine Benguela,28,17,24,27,0,30.6 GB , MGDM, Safmarine Mafadi,37,12,25,26,11,450.4 GB , 2AQK7, Safmarine Nakuru,44,21,40,42,1,64.5 GB , 2ALE5, Safmarine Nile,50,30,44,49,0,32.6 GB , MGJS8, Safmarine Nokwanda,29,8,23,28,0,39.6 GB , MGGK4, Safmarine Nomazwe,10,8,9,9,1,60.6 GB , 2AQK9, Safmarine Nuba,39,24,33,36,0,26.1 GB , 2AJI3, Safmarine Nyassa,26,21,25,26,0,21 GB , 9HA2415, Saga Ruby,6,3,5,6,0,27.3 GB , 9HOF8, SAGA SAPPHIRE,16,11,14,15,0,23.2 GB , ZCDG7, Sapphire Princess,66,31,42,54,6,123.2 GB , ZCBU3, Sea Princess,28,19,27,27,0,23.9 GB , ZCBV6, Snowdon,29,7,23,26,2,120.7 GB , C6SD9, Spruce Arrow,53,16,36,47,0,56 GB , MMHE5, St. Helena,86,36,71,79,1,46.8 GB , ZCDD6, Star Princess,46,42,44,44,2,55.8 GB , MZIU7, Stavros S Niarchos,32,15,32,32,0,25.8 GB , ZCBZ5, Talca,13,2,9,10,2,585.5 GB , MYMY6, Toisa Coral,14,8,12,14,0,16.2 GB , VQHR9, Toisa Independent,6,4,6,6,0,28 GB , C6NR5, Toucan Arrow,21,9,17,20,1,72.3 GB , V7OE6, Umm al Amad,93,69,86,92,0,23.7 GB , ZCBD4, Valencia Express,1,1,1,1,0,21 GB , ZCDT2, Ventura,22,16,21,21,0,19.9 GB , 2AUO5, VOS Pioneer,56,48,50,50,3,46.7 GB , C6JE5, Westfield,21,8,20,21,0,31.7 GB , C6JD7, Wren Arrow,74,34,52,63,3,71.3 HK , VRDW2, Dapeng Moon,38,0,37,38,0,52.9 HK , VQGQ4, Maersk Gairloch,40,0,34,38,0,64.8 HK , VRBQ6, OOCL Asia,25,0,24,25,0,53.7 HK , VRAR6, OOCL Atlanta,12,5,12,12,0,34.8 HK , VRIB3, OOCL Beijing,9,0,8,8,1,131.3 HK , VRFJ6, OOCL Brisbane,23,0,23,23,0,51.2 HK , VRIB2, OOCL Canada,24,1,24,24,0,48.6 HK , VRFX2, OOCL Charleston,37,0,31,37,0,63.6 HK , VRFW9, OOCL Dalian,13,0,10,13,0,63.3 HK , VRBX7, OOCL Europe,12,0,11,12,0,59.3 HK , VRZK9, OOCL Hamburg,4,0,4,4,0,51.2 HK , VRDE7, OOCL Houston,17,4,17,17,0,37.1 HK , VRGO7, OOCL Jakarta,14,0,10,14,0,70.4 HK , VRGE3, OOCL Le Havre,13,0,12,13,0,52.2 HK , VRGO3, OOCL Luxembourg,21,1,14,21,0,54.1 HK , VRZL3, OOCL Ningbo,17,0,14,17,0,61.6 HK , VRZL2, OOCL Qingdao,16,0,15,16,0,55.1 HK , VRZK8, OOCL Rotterdam,1,0,1,1,0,52 HK , VRFU8, OOCL Seoul,13,0,12,13,0,56.7 HK , VRYO2, OOCL Shenzhen,20,1,18,19,0,57.3 HK , VRVL2, OOCL Singapore,1,1,1,1,0,11 HK , VRCU7, OOCL Southampton,10,0,10,10,0,51.4 HK , VRAR7, OOCL TianJin,8,0,7,8,0,58.8 HK , VRCI9, OOCL Tokyo,10,3,10,10,0,37.8 HK , VRDB3, OOCL Yokohama,17,12,16,16,1,48.5 HK , VRCB4, OOCL Zhoushan,8,0,7,8,0,60.9 HK , 3FWP3, Star Pisces,10,0,10,10,0,51.2 HK , 3FCE9, Uni Pacific,5,0,2,4,1,159.6 IE , EIPT, ILV Granuaile,3,2,2,2,1,210.7 IE , C4HP2, ULYSSES,20,20,20,20,0,0 IL , 4XFB, ZIM ASIA,8,0,4,6,1,160.4 IL , 4XIS, ZIM BARZELONA,15,13,15,15,0,13.1 IL , 4XIM, ZIM HAIFA,4,0,0,0,4,1366.2 IL , A8IZ2, ZIM QINGDAO,24,13,18,21,2,68.6 IL , 4XFV, ZIM VIRGINIA,27,23,24,24,3,110 IN , AUBC, Desh Prem,6,5,6,6,0,17.2 IN , AUCT, Desh Shanti,17,12,16,17,0,27.6 IN , ATSF, Gandhar,6,1,4,5,1,283 IN , ATSS, Maharaja Agrasen,17,14,17,17,0,18.7 IN , VVZU, Maharshi Parshuram,6,6,6,6,0,16.7 IN , VTXF, Nanga Parbat,10,1,5,9,0,72.1 IS , TFNA, ARNI FRIDRIKSSON,46,30,35,41,1,68.6 IS , TFEA, BJARNI SAEMUNDSSON,80,69,75,78,1,31 IS , OZ2049, HELGAFELL,22,10,13,19,1,66.9 JP , JBZR, FUKUSHIMA MARU,121,73,120,121,0,35.3 JP , JPBN, KEIFU MARU,467,461,462,462,5,37 JP , JFRO, KOJIMA,55,22,51,55,0,33.7 JP , H9UY, NIKKEI PHOENIX,19,13,19,19,0,32.2 JP , JDVA, OSHORO MARU,63,54,62,63,0,29.7 JP , 7JDK, RHEA LEADER,4,0,0,4,0,91 JP , JGQH, RYOFU MARU,483,478,480,482,0,28.7 JP , JPQG, SHIN SAPPORO MARU,2,0,1,2,0,54 JP , 3EDA4, TRANS FUTURE 5,73,63,70,73,0,25.2 KR , D9TD, HANSIN DAMPIER,4,0,0,0,4,411 KR , D9RV, HYUNDAI CONTINENTAL,1,0,0,0,0,291 KR , 3FIG7, KEOYANG ORIENT,1,0,0,0,1,471 KR , DSEM8, MSC HIGHNESS,2,0,0,0,1,381 KR , 3FHD9, SK SUMMIT,6,0,0,0,6,441 KR , DSPZ2, YK SOVEREIGH,3,0,0,0,0,351 MY , 9MBR8, SS PUTERI DELIMA,10,0,7,10,0,72.4 MY , 9MGF7, SS PUTERI FIRUS SATU,25,0,25,25,0,53.3 MY , 9MBQ6, SS PUTERI INTAN,3,0,0,2,0,156 MY , 9MGJ9, SS PUTERI MUTIARA SATU,14,0,12,14,0,62.5 MY , 9MBW7, SS PUTERI NILAM,4,0,1,4,0,98 , TBWAA05, ,3,1,3,3,0,39.3 , TBWAA10, ,84,75,84,84,0,15.7 NL , PCDE, ADMIRALENGRACHT,32,20,28,32,0,36.6 NL , PCKU, ALEXANDERGRACHT,35,31,33,35,0,14.8 NL , PHIN, AMAZONEBORG,3,3,3,3,0,17 NL , PCPR, AMSTELGRACHT,10,9,10,10,0,17.4 NL , PCGQ, ANJELIERSGRACHT,52,49,52,52,0,16.9 NL , PCSV, APOLLOGRACHT,26,24,25,25,1,72.9 NL , PHHD, ARNEBORG,10,5,10,10,0,27.3 NL , PFPT, AVATAQ,5,4,5,5,0,23.8 NL , 2EZE5, BERGE STAHL,23,21,21,23,0,18.3 NL , A8JH8, BUZZARD BAY,85,84,84,85,0,12.7 NL , PJRH, COLD STREAM,36,35,36,36,0,12.8 NL , A8IP4, COMOROS STREAM,5,2,4,5,0,37.2 NL , PDKK, COOL EXPRESS,6,6,6,6,0,15 NL , PHKM, CORAL FAVIA,4,3,3,3,0,73.8 NL , ELXG9, CORAL PAVONA,53,49,53,53,0,13.6 NL , PBOF, DAMGRACHT,15,13,15,15,0,13.8 NL , PDNN, DANIELLA,22,20,20,20,0,21.4 NL , PBSY, DONAUGRACHT,10,9,9,9,1,76.4 NL , DDIG2, EAGLE BAY,36,30,36,36,0,18.1 NL , PDWZ, EDAMGRACHT,73,70,72,73,0,14.2 NL , OXOR2, EDITH MAERSK,44,37,40,40,1,44.8 NL , PDXQ, EEMSGRACHT,10,10,10,10,0,14.6 NL , PDWT, EGELANTIERSGRACHT,6,6,6,6,0,10.7 NL , PDYI, ELANDSGRACHT,43,43,43,43,0,16.3 NL , OXHY2, ELLY MAERSK,68,37,62,67,0,30.3 NL , A8IO2, ELSEBETH,154,134,152,154,0,18.2 NL , A8IP2, ELVIRA,23,21,23,23,0,17.6 NL , A8IP3, EMERALD,39,34,39,39,0,17.7 NL , OYGR2, EMMA MAERSK,23,20,23,23,0,16.1 NL , PDYX, EMMAGRACHT,9,9,9,9,0,10.7 NL , A8IN8, ESMERALDA,123,97,122,123,0,20.2 NL , PDZS, EUROPA,65,42,61,65,0,24.9 NL , A8QJ7, EVA N,58,26,49,58,0,33.1 NL , OXHV2, EVELYN MAERSK,51,29,43,49,1,59.1 NL , A8JI2, FALCON BAY,1,1,1,1,0,16 NL , PEBT, FLINTERDUIN,29,15,16,18,0,96.9 NL , PBHZ, FLINTERSKY,31,25,31,31,0,16.4 NL , PBEN, FLINTERSUN,22,22,22,22,0,11.3 NL , PEND, HAPPY BUCCANEER,26,19,19,21,0,52 NL , PCER, HAPPY RANGER,29,27,29,29,0,14 NL , PCAW, HAPPY RIVER,8,8,8,8,0,10.4 NL , PCBZ, HAPPY ROVER,49,32,32,47,0,40.9 NL , PHJV, IVER EXACT,22,20,20,22,0,17.5 NL , PCBU, IVER EXCEL,22,18,22,22,0,18.4 NL , PECF, IVER EXPERIENCE,22,22,22,22,0,11.9 NL , PFBF, IVER EXPORTER,81,77,81,81,0,14.2 NL , OWFD2, JOHANNES MAERSK,48,44,47,48,0,17.8 NL , PFFH, JUMBO SPIRIT,26,21,24,25,0,25.1 NL , OWKI2, LAURA MAERSK,29,25,28,28,0,22.9 NL , OWAY2, LICA MAERSK,14,12,14,14,0,17.3 NL , PHPP, MAERSK INNOSHIMA,85,75,78,80,1,30.7 NL , PBDH, MAERSK INVERNESS,67,63,66,66,0,17.4 NL , PHOB, MAERSK IZMIR,56,52,55,55,0,17.2 NL , PDHP, MAERSK KALMAR,34,32,33,33,0,21.6 NL , PFDH, MAERSK KAMPALA,16,14,15,16,0,23.6 NL , PDHO, MAERSK KIMI,18,15,16,18,0,19.9 NL , PDHW, MAERSK PALERMO,80,77,77,79,0,15.4 NL , PDHY, MAERSK PEMBROKE,34,31,34,34,0,17.3 NL , OZDM2, MAERSK SALALAH,8,4,7,8,0,33.1 NL , VRGW2, MAERSK SALINA,51,28,47,51,0,29.5 NL , OZDQ2, MAERSK SAVANNAH,12,7,11,11,0,39.6 NL , VRGW3, MAERSK STOCKHOLM,93,31,69,92,0,40.8 NL , PHKL, NEDLLOYD BARENTSZ,300,266,285,295,0,19.2 NL , PCIM, NEDLLOYD MERCATOR,42,39,41,41,0,22.2 NL , PJHA, NOVA ZEELANDIA,8,4,7,7,0,60.8 NL , PIAG, ORANJEBORG,31,28,31,31,0,13.5 NL , PGQI, PACIFIC,100,99,100,100,0,9.4 NL , PGRQ, PELAGIA,77,75,77,77,0,12.2 NL , PBQK, PLANCIUS,22,21,21,21,1,37.5 NL , D5BR6, POLAR STREAM,26,15,21,26,0,29.8 NL , A8JI5, PRINCE OF SEAS,85,81,82,84,1,22.2 NL , PDUJ, QAMUTIK,8,7,7,8,0,24.6 NL , PDGS, ROTTERDAM,132,106,118,122,5,78.3 NL , PCIH, ROYAL KLIPPER,60,57,58,58,1,41.2 NL , PHCQ, SAIMAAGRACHT,21,20,20,20,0,29.9 NL , PHDL, SAMPOGRACHT,14,11,11,11,0,43.6 NL , A8IP5, SANTA LUCIA,12,11,12,12,0,14.4 NL , A8IN7, SANTA MARIA,72,34,37,39,24,420.3 NL , PCGM, SINGELGRACHT,25,24,25,25,0,11.4 NL , PDBP, SLOTERGRACHT,5,5,5,5,0,14.6 NL , PFBE, SLUISGRACHT,37,32,32,32,1,48.3 NL , PCEO, SPIEGELGRACHT,27,26,27,27,0,15.9 NL , PBBB, SPUIGRACHT,17,17,17,17,0,15 NL , PECA, STAD AMSTERDAM,6,4,5,5,1,126 NL , PHAQ, STATENGRACHT,71,64,70,71,0,17.9 NL , PHQW, STELLA NOVA,15,15,15,15,0,11.9 NL , PCAM, TASMAN SPIRIT,11,3,10,11,0,48.6 NL , PCCL, TASMAN STAR,27,26,26,27,0,13.6 NL , PHAC, TRACER,24,22,24,24,0,22.5 NL , PHAA, TRAMPER,8,7,8,8,0,16.9 NL , PHAL, TRANSPORTER,5,5,5,5,0,11.6 NL , PHAM, TRAVELLER,54,48,49,53,0,17.6 NL , 9LD2206, TRES HOMBRES,16,13,15,16,0,20.2 NL , PFQE, UMIA VUT,1,1,1,1,0,28 NO , LGWS, DR.FRIDTJOF NANSEN,411,409,411,411,0,11.4 NO , LF3F, DRAUGEN,240,240,240,240,0,21.2 NO , LAHV, FF HELMER HANSEN,456,452,454,455,0,12.1 NO , LMEL, G.O. SARS,665,663,665,665,0,11.4 NO , LJIT, HAAKON MOSBY,402,401,402,402,0,11.4 NO , LF3N, HEIDRUN,242,241,242,242,0,21.1 NO , LF4H, HEIMDAL,719,718,719,719,0,10 NO , LDGJ, JOHAN HJORT,377,376,377,377,0,11.4 NO , LF5T, NORNE,177,177,177,177,0,20.8 NO , LF4C, SLEIPNER,239,239,239,239,0,21.2 NO , LF4B, TROLL,705,705,705,705,0,14.7 NZ , V7KA6, ANKING,21,11,16,20,1,84.1 NZ , 3FZR7, ASTRID,3,0,1,3,0,74.3 NZ , V2QD4, BC SAN FRANCISCO,12,4,11,12,0,33.4 NZ , YJYY2, BORAL GAS,21,21,21,21,0,15.5 NZ , ZMGB, GOLDEN BAY,5,4,5,5,0,30 NZ , ZMKA, KAKARIKI,22,4,14,22,0,52.9 NZ , VRDX2, KOTA PERMATA,10,3,5,9,0,65.8 NZ , VRWW8, KWANGSI,10,10,10,10,0,15.3 NZ , VRAE3, KWANGTUNG,29,28,28,28,0,23.2 NZ , VRAE2, KWEICHOW,49,48,49,49,0,16.9 NZ , VRAE4, KWEILIN,13,13,13,13,0,16.5 NZ , 3ECI3, MAEA,32,28,31,31,0,23.5 NZ , V7EM3, NINGHAI,26,15,22,25,0,37.9 NZ , C6TE3, ORION,35,2,27,33,0,49.6 NZ , YJZC5, PACIFIC GAS,9,8,8,9,0,23.8 NZ , ZM2619, RANGATIRA,22,22,22,22,0,15.4 NZ , V2CN5, SOFRANA SURVILLE,33,14,29,33,0,36.7 NZ , A8QY2, SOFRANA TOURVILLE,39,19,33,38,0,39.8 NZ , 9VVN8, SOUTHERN PEARL,37,29,31,36,0,31.9 NZ , ZMENA, SPIRIT OF ENDURANCE AWS,297,56,295,296,1,34.9 NZ , ZMSM, STRAITSMAN,2,2,2,2,0,10 NZ , ZMFR, TANGAROA,412,57,382,412,0,37.6 NZ , ZMIQ, TOREA,27,27,27,27,0,16.6 NZ , 3EAT6, VICTOIRE,27,6,20,25,0,52.8 RU , UGYU, 50 LET POBEDY,6,6,6,6,0,9 RU , UFJC, A.TORCHINOV,29,29,29,29,0,20.4 RU , UDUR, ADMIRAL STARIKOV,73,73,73,73,0,17.1 RU , UCAC, ADMIRAL USHAKOV,60,39,49,55,3,86.6 RU , UBSF2, ALDAN,11,11,11,11,0,20.5 RU , UAST, ATRIA,30,2,26,30,0,47 RU , UANA, FRITOF NANSEN,9,9,9,9,0,10.3 RU , UCFT, GEMMA,22,21,22,22,0,12.3 RU , UBMC, GORNOZAVODSK,13,13,13,13,0,20.3 RU , UFCK, GRUMANT,18,14,17,18,0,22.8 RU , UCUQ, IVAN TORNEV,105,30,43,49,8,187.3 RU , UGOS, KAPITAN ARTYUKH,52,0,27,28,23,208.4 RU , UFEQ, KAPITAN CHUKHCHIN,7,7,7,7,0,12 RU , UIAO, KAPITAN DANILKIN,1,1,1,1,0,11 RU , UFML, KAPITAN GNEZDILOV,27,0,5,20,1,114.3 RU , UFLT, KAPITAN KREMS,18,0,18,18,0,35.7 RU , UFMK, KAPITAN SERGIEVSKY,26,0,12,23,0,69.2 RU , UBLH, KAPITAN TSIRUL,15,0,14,15,0,39 RU , UEYO, KHUDOZHNIK N. RERIKH,42,0,42,42,0,36.6 RU , UDWE, KRASNOGVARDEETS,51,0,50,51,0,36.3 RU , UCJB, KUZMA MININ,3,3,3,3,0,16.3 RU , UFLC, LUTOGA,35,35,35,35,0,20.4 RU , UCAB, MIKHAIL KUTUZOV,7,6,6,6,1,215.1 RU , UCCR, MIKHAIL LUKONIN,4,4,4,4,0,20.5 RU , UCKA, MIKHAIL STREKALOVSKY,6,3,4,4,2,273.2 RU , UGGA, NEREI,36,35,36,36,0,11.5 RU , UIAH, NIKOLAI REPNIKOV,26,17,23,25,0,28.5 RU , UIAC, NOVATOR,69,48,51,56,0,44.5 RU , UFNZ, NOVAYA ZEMLYA,1,1,1,1,0,26 RU , UICO, ODOEVSK,57,55,56,56,0,13.4 RU , UHFW, PAROMAY,9,9,9,9,0,20.3 RU , UCTS, PAVEL KUTAKHOV,42,40,41,41,1,44.5 RU , UGNQ, PERSEI-4,2,2,2,2,0,12 RU , UITJ, PETR VELIKY,40,40,40,40,0,11.9 RU , UIDO, PIONER KHOLMSKA,19,5,18,19,0,38.6 RU , UDOD, PIONER KORSAKOVA,65,59,64,65,0,22.9 RU , UGTV, PIONER ROSSII,4,1,4,4,0,30.8 RU , UCDM, PIONER SAKHALINA,9,9,9,9,0,21 RU , UCDN, PIONER YUZHNO-SAKHALINSKA,11,10,11,11,0,24.9 RU , UBLE7, POMORYE,15,15,15,15,0,11.1 RU , UAKA, PROFESSOR MOLCHANOV,50,0,32,37,3,138.1 RU , UCDL, SAKHALIN-10,11,10,10,11,0,27.7 RU , UERK, SAKHALIN-8,11,10,10,10,1,66 RU , UCEE, SAKHALIN-9,3,1,1,2,0,78 RU , UBVF4, SEVERNAYA ZEMLYA,15,12,14,14,1,117.2 RU , UAEV, TEZEJ,30,27,27,27,3,67 RU , UCSJ, TOR,38,18,30,38,0,37.4 RU , UBNY, VAIGACH,56,56,56,56,0,10.7 RU , UGSI, VASILY BURKHANOV,38,0,34,37,0,44.1 RU , UHOM, VEGA,36,36,36,36,0,11.2 RU , UAVH, VIKTOR MIRONOV,3,0,0,0,3,891 RU , UCJX, VIKTOR TKACHEV,10,10,10,10,0,10.9 RU , UCJT, YAMAL,26,26,26,26,0,12 RU , UDYG, ZAKHAR SOROKIN,30,27,27,29,1,32.1 RU , UHMI, ZEYA,16,14,16,16,0,22.7 SE , SBLI, AIDA,64,61,62,62,2,63.9 SE , SKPE, ATL COMPANION,16,7,8,10,5,456.6 SE , SKUN, ATL COMPASS,41,40,41,41,0,12.9 SE , SKOZ, ATL CONCERT,32,28,31,31,1,66 SE , SCKM, ATL CONVEYOR,11,10,10,10,1,149.7 SE , SMGW, CARMEN,82,76,81,82,0,21.1 SE , 9V8796, DON JUAN,30,13,29,30,0,32.6 SE , SLCO, FALSTAFF,39,34,36,37,2,50.4 SE , SLKQ, FAUST,23,23,23,23,0,17.7 SE , SLKU, FEDORA,36,32,32,33,2,91.9 SE , SLKR, FIDELIO,19,18,19,19,0,20.7 SE , SJCD, MIGNON,47,42,44,45,2,45.1 SE , SMLQ, ODEN,478,30,297,475,3,61 SE , SBLW, OTELLO,57,52,52,52,4,65.8 SE , SKEC, Transpaper,534,0,33,434,2,103.9 SE , SKWI, TRISTAN,21,20,21,21,0,20.1 SE , SBHI, TRITON,48,45,47,47,0,23.4 US , OVYQ2, A. P. MOLLER,48,18,25,35,2,129 US , WDF2728, ACHIEVEMENT,10,3,10,10,0,31.1 US , C6SA3, ADVENTURE OF THE SEAS,144,119,142,143,0,20.8 US , WBN3015, ADVENTURER,4,4,4,4,0,21 US , C6VM6, AL KHUWAIR,22,1,6,8,6,270.7 US , C6VF5, AL MARROUNA,45,17,32,33,11,361.2 US , WSM5364, ALASKA MARINER,20,15,19,20,0,14.2 US , WDB9918, ALASKAN EXPLORER,37,15,19,20,10,450.8 US , WDB7815, ALASKAN FRONTIER,16,2,10,12,0,94.1 US , WDD2074, ALASKAN LEGEND,61,12,36,58,0,54.3 US , WDC6644, ALASKAN NAVIGATOR,51,25,41,45,5,158 US , C6LU3, ALBEMARLE ISLAND,15,13,15,15,0,14.9 US , OUOW2, ALBERT MAERSK,30,20,28,29,1,36 US , WCZ7335, ALERT,14,10,13,14,0,22.4 US , VCPX, ALGOLAKE,16,10,14,14,1,121.5 US , CFK9698, ALGOMA GUARDIAN,35,25,34,35,0,12.9 US , VGMV, ALGOMA NAVIGATOR,12,3,4,4,8,395.1 US , VDRV, ALGOMA PROGRESS,36,23,28,33,1,40.9 US , CYGR, ALGOMA QUEBECOIS,12,1,1,1,2,320.1 US , CFN4309, ALGOMA SPIRIT,17,4,8,8,1,230.1 US , VYNG, ALGORAIL,49,26,49,49,0,23.9 US , VGJD, ALGOSOO,16,7,12,12,4,200.9 US , VDFP, ALGOWAY,6,2,6,6,0,26 US , WKDY, ALLIANCE BEAUMONT,58,24,48,53,0,50.5 US , WRAH, ALLIANCE CHARLESTON,60,11,34,56,1,64.5 US , WGAH, ALLIANCE NORFOLK,18,7,13,16,2,145.2 US , WGAE, ALLIANCE ST LOUIS,14,6,7,8,6,628.4 US , C6XS8, ALLURE OF THE SEAS,28,24,26,28,0,14.9 US , WAV4647, ALPENA,5,0,1,2,2,455 US , WDD2876, AMERICAN CENTURY,242,232,238,238,3,24.5 US , WDD2879, AMERICAN COURAGE,2,1,1,2,0,46.5 US , WDD2875, AMERICAN INTEGRITY,19,15,18,18,1,35.2 US , WQZ7791, AMERICAN MARINER,23,23,23,23,0,7 US , WCX2417, AMERICAN SPIRIT,27,13,18,25,2,111.3 US , PBAD, AMSTERDAM,241,220,236,240,1,18.8 US , VRBK6, ANTWERPEN,211,11,29,70,49,234.1 US , WDE8265, APL AGATE,19,7,7,10,5,421.1 US , 9VKQ3, APL BELGIUM,1,0,0,0,1,741 US , WDB3161, APL CHINA,58,10,14,14,44,1090.3 US , WDF6832, APL CORAL,5,1,1,3,0,122.8 US , 9VDD2, APL ENGLAND,12,10,10,12,0,16.8 US , WDE8288, APL JAPAN,25,9,15,16,8,336 US , WCX8883, APL KOREA,189,127,146,146,42,335.4 US , WDE8264, APL PEARL,55,19,38,51,1,77.9 US , WCX8884, APL PHILIPPINES,33,17,20,20,13,576.9 US , 9VDD3, APL SCOTLAND,28,3,22,28,0,57.4 US , WCX8812, APL SINGAPORE,31,20,24,24,7,338.4 US , VRFH2, APL TEXAS,10,0,10,10,0,53.4 US , WCX8882, APL THAILAND,38,15,26,26,12,469.1 US , 9VVP, APL TOURMOLINE,36,30,31,36,0,20.5 US , VRFD6, APL WASHINGTON,73,42,65,68,5,78.9 US , WBP3396, ARCTIC BEAR,8,0,1,8,0,82.1 US , C6YA7, ARCTURUS VOYAGER,41,20,32,36,5,182.4 US , OXES2, ARNOLD MAERSK,68,31,44,50,1,74.2 US , WE4805, ARTHUR M. ANDERSON,24,10,10,12,0,124.4 US , VRDC6, ATLANTIC BREEZE,9,0,0,0,2,424.4 US , SCKB, ATLANTIC CARTIER,15,10,14,14,0,36.8 US , WDC9417, ATLANTIC EXPLORER (AWS),286,222,229,233,49,502.5 US , VRDT7, ATLANTIC GRACE,411,3,8,17,330,933 US , KAQP, ATLANTIS,677,672,677,677,0,11.3 US , WCZ7337, ATTENTIVE,14,6,9,14,0,31.7 US , WYM9567, AURORA,561,489,558,559,0,6.4 US , WCZ7336, AWARE,1,0,1,1,0,60 US , C6FY5, AXEL SPIRIT,39,8,26,32,1,81 US , 9HOB8, AZAMARA JOURNEY,17,8,17,17,0,25.5 US , 9HOM8, AZAMARA QUEST,35,16,33,35,0,31.6 US , WBD4889, BADGER,83,51,64,67,1,63.3 US , V7QN4, BALTIC BEAR,23,7,19,23,0,36.6 US , A8VG9, BALTIC COVE,12,2,5,11,1,171.8 US , WTC9407, BARBARA ANDRIE,20,14,16,16,1,69.4 US , C6QK, BARRINGTON ISLAND,29,29,29,29,0,9.9 US , WTED, BELL M. SHIMADA,296,293,294,295,1,13.2 US , VRBU6, BERGE NANTONG,21,0,2,17,0,83.2 US , C6KJ5, BERNARDO QUINTANA A.,15,11,14,15,0,24.3 US , WDC7379, BLUEFIN,30,15,20,27,0,49.8 US , WBN4113, BULWARK,33,14,16,33,0,42.3 US , WDC6027, BURNS HARBOR,36,32,35,35,1,25.9 US , WDE5381, CALIFORNIA VOYAGER,5,2,4,4,1,307.2 US , WDE3568, CALUMET,20,8,19,20,0,33.8 US , VCTV, CAPT. HENRY JACKMAN,13,9,11,11,1,137 US , 3FPQ9, CARNIVAL CONQUEST,26,13,26,26,0,28.6 US , C6FN4, CARNIVAL DESTINY,16,9,15,15,0,29.1 US , 3ETA7, CARNIVAL DREAM,66,46,64,66,0,12.8 US , H3GR, CARNIVAL ECSTASY,5,3,5,5,0,17 US , 3FOC5, CARNIVAL ELATION,29,22,28,29,0,16 US , H3GS, CARNIVAL FANTASY,28,25,27,28,0,13.1 US , C6FM9, CARNIVAL FASCINATION,39,30,39,39,0,24.2 US , 3EBL5, CARNIVAL FREEDOM,1,0,1,1,0,41 US , 3FPS9, CARNIVAL GLORY,19,11,19,19,0,23.6 US , C6FN2, CARNIVAL IMAGINATION,43,37,43,43,0,19.3 US , C6FM5, CARNIVAL INSPIRATION,15,10,15,15,0,24.1 US , H3VT, CARNIVAL LEGEND,14,12,14,14,0,13.1 US , HPYE, CARNIVAL LIBERTY,95,71,94,95,0,22.3 US , 3ETA8, CARNIVAL MAGIC,73,38,70,72,0,27.8 US , H3VS, CARNIVAL MIRACLE,40,21,39,40,0,25.6 US , 3FOB5, CARNIVAL PARADISE,19,16,18,19,0,15.1 US , H3VU, CARNIVAL PRIDE,58,45,58,58,0,21.9 US , C6FM8, CARNIVAL SENSATION,37,32,37,37,0,15.7 US , 3FPR9, CARNIVAL SPIRIT,24,15,24,24,0,10.9 US , 3EUS, CARNIVAL SPLENDOR,46,34,46,46,0,17.3 US , C6FN5, CARNIVAL TRIUMPH,87,65,87,87,0,20.4 US , H3VR, CARNIVAL VALOR,15,5,10,10,5,321.6 US , 3FFL8, CARNIVAL VICTORY,4,3,4,4,0,21.2 US , OZWA2, CAROLINE MAERSK,1,0,0,0,1,1271 US , WE4879, CASON J. CALLAWAY,27,22,23,24,1,61.3 US , 9HJI9, CELEBRITY CENTURY,114,85,106,109,1,31.1 US , 9HJB9, CELEBRITY CONSTELLATION,338,143,237,293,20,87.3 US , 9HXC9, CELEBRITY ECLIPSE,346,228,313,330,2,33.9 US , 9HXD9, CELEBRITY EQUINOX,141,94,129,140,0,26.9 US , 9HJD9, CELEBRITY INFINITY,131,83,128,131,0,21.2 US , 9HJF9, CELEBRITY MILLENNIUM,88,59,83,86,0,28.8 US , 9HA2583, CELEBRITY SILHOUETTE,149,100,136,148,0,25.4 US , 9HRJ9, CELEBRITY SOLSTICE,162,94,128,145,10,66.4 US , 9HJC9, CELEBRITY SUMMIT,63,50,62,63,0,19 US , C6JT, CHARLES ISLAND,23,23,23,23,0,9.1 US , WDD6126, CHARLESTON EXPRESS,140,80,112,117,23,257 US , WTF3319, CORWITH CRAMER,10,7,8,8,1,150 US , ICGU, COSTA LUMINOSA,27,19,25,25,2,65 US , IBCF, COSTA MEDITERRANEA,57,17,49,57,0,39.1 US , WDC6907, COURAGE,3,0,0,0,3,1397 US , VRXB2, DARYA SHANTHI,54,12,36,48,1,68 US , V7HD2, DEEPWATER MILLENNIUM,7,1,3,7,0,51.3 US , WBN3016, DEFENDER,20,16,19,20,0,22.3 US , KNBD, DELAWARE II,4,2,3,4,0,38.5 US , NWS0012, DELAWARE II (AWS),110,14,110,110,0,31.5 US , WDE2632, DELIVERANCE,3,2,3,3,0,17.7 US , WUR7250, DIANE H,26,10,17,22,3,85.6 US , V7MO2, DISCOVERER CLEAR LEADER,59,44,56,57,2,58.2 US , V7HC6, DISCOVERER DEEP SEAS,133,94,133,133,0,21.1 US , V7HD3, DISCOVERER ENTERPRISE,12,9,11,12,0,10.9 US , V7MO3, DISCOVERER INSPIRATION,11,7,11,11,0,22.7 US , V7HC8, DISCOVERER SPIRIT,67,49,67,67,0,19 US , C6YR6, DISNEY DREAM,1,0,0,1,0,61 US , C6ZL6, DISNEY FANTASY,11,5,10,10,0,33 US , C6PT7, DISNEY MAGIC,3,2,3,3,0,4 US , C6QM8, DISNEY WONDER,64,50,60,62,1,39.8 US , C6JS, DUNCAN ISLAND,46,43,45,46,0,15.3 US , S6NK2, EAGLE TACOMA,1,0,0,0,1,790 US , S6NK4, EAGLE TRENTON,49,1,4,7,18,333.1 US , WQZ9670, EDGAR B. SPEER,70,50,61,68,0,21.8 US , WXQ4511, EDWIN H. GOTT,85,72,82,84,1,23.7 US , KCGH, EL MORRO,8,5,5,5,3,546.6 US , WGJT, EL YUNQUE,51,32,33,33,18,267 US , KKFW, EMPIRE STATE,119,57,84,97,1,69.3 US , C6FZ7, ENCHANTMENT OF THE SEAS,12,5,12,12,0,24.3 US , WCE5063, ENDEAVOR (AWS),718,696,701,704,6,8.8 US , WDF7523, ENDURANCE,43,23,29,43,0,32 US , WDE9193, EOT SPAR,24,18,18,18,6,359.2 US , A8PQ6, ERNEST N,37,8,28,36,0,43.7 US , PHOS, EURODAM,36,24,30,34,0,35.3 US , A8MH9, EURUS LIMA,3,0,2,2,0,71 US , A8MI2, EURUS LISBON,14,3,14,14,0,32.8 US , A8MH7, EURUS LONDON,22,10,19,22,0,34 US , 9V7951, EVER DAINTY,15,13,13,15,0,13.5 US , 9V7952, EVER DECENT,3,2,3,3,0,30.7 US , 9V7954, EVER DEVOTE,4,1,1,1,0,236 US , 9V7955, EVER DIADEM,27,17,20,23,4,152 US , 3FQS8, EVER DIAMOND,265,170,244,263,0,26.2 US , 9V7956, EVER DIVINE,28,21,27,28,0,18.7 US , VQFS4, EVER ETHIC,12,5,6,9,3,391.1 US , VSXV3, EVER EXCEL,26,8,16,16,10,569.8 US , 3FQO4, EVER REACH,5,4,5,5,0,27.2 US , 3FYB3, EVER REWARD,572,550,567,572,0,9.4 US , MJKZ4, EVER SHINE,3,1,1,2,1,504.7 US , 3EKU3, EVER SUMMIT,24,12,21,22,1,67.2 US , C6FY8, EVEREST SPIRIT,49,20,42,46,2,88.3 US , WDE4430, EVERGREEN STATE,1,0,0,0,0,141 US , ONCE, EXCALIBUR,57,19,19,19,38,942.7 US , ONAI, EXCEL,78,20,20,20,57,1055.3 US , ONDY, EXCELERATE,62,33,39,43,19,459.8 US , ONFY, EXPEDIENT,39,8,10,11,8,405.6 US , WBN7618, EXPLORER,18,17,18,18,0,17.1 US , ONFE, EXPLORER,54,31,45,50,4,133.6 US , C6SE4, EXPLORER OF THE SEAS,13,8,13,13,0,24.4 US , WDB5604, FAIRWEATHER,17,6,12,15,2,105.1 US , WTEB, FAIRWEATHER (AWS),188,168,186,186,1,24.6 US , 8POF, FEDERAL SCHELDE,9,3,3,7,0,67.2 US , VRXL7, FEDERAL VENTURE,9,0,1,5,1,186.9 US , WDF4764, FLORIDA VOYAGER,8,2,5,5,3,560.4 US , WDB5483, FREEDOM,48,11,27,38,6,140.4 US , C6UZ7, FREEDOM OF THE SEAS,18,12,18,18,0,20.2 US , A8LC2, FREJA DANIA,18,4,11,17,0,53.7 US , WCV7620, G. L. OSTRANDER,104,37,42,50,45,550.1 US , S6AJ8, GARDEN CITY RIVER,16,9,12,14,0,42.4 US , WBN6511, GAUNTLET,1,1,1,1,0,11 US , V7SY6, GENCO CLAUDIUS,46,0,27,45,0,79.5 US , VRDR8, GENCO CONSTANTINE,48,0,5,14,14,273.6 US , V7QN8, GENCO HADRIAN,12,0,0,0,2,306.1 US , V7LZ4, GENCO THUNDER,5,1,2,4,0,63.2 US , WTAU, GENERAL RUDDER,13,7,11,12,1,203.3 US , ZCDJ7, GENOA EXPRESS,18,3,3,18,0,65.1 US , A8PQ5, GEORGE N,14,3,7,10,0,95.3 US , NMRY, GOLDEN BEAR,52,36,46,48,3,92.7 US , WTEO, GORDON GUNTER (AWS),409,363,373,377,21,78.6 US , C6SE3, GRANDEUR OF THE SEAS,13,2,5,12,0,65.4 US , WDF7994, GREAT REPUBLIC,14,11,13,14,0,20.3 US , WDD9433, GREEN BAY,5,0,1,4,0,85.2 US , WCZ5238, GREEN DALE,16,5,12,15,0,45.3 US , WDDI, GREEN LAKE,5,5,5,5,0,11 US , WZZF, GREEN RIDGE,18,15,17,18,0,18.1 US , WDC9138, GRETCHEN H,13,5,8,13,0,39.3 US , YJUF7, GSF GRAND BANKS,178,93,137,149,9,69.9 US , WDA5598, GULF TITAN,3,0,1,3,0,64 US , C6CL6, H A SKLENAR,99,80,91,96,1,35.6 US , WZD2465, H. LEE WHITE,17,8,14,15,0,42.1 US , WTDF, HENRY B. BIGELOW (AWS),499,481,486,494,0,14 US , YJQN7, HENRY GOODRICH,184,91,140,154,12,72.9 US , WL3972, HERBERT C. JACKSON,15,8,9,10,1,94.6 US , WTEY, HI\'IALAKAI (AWS),159,39,159,159,0,27.4 US , WL3108, HON. JAMES L. OBERSTAR,56,13,18,22,12,204.2 US , WDC6923, HONOR,17,14,17,17,0,12.8 US , KGTX, HORIZON ANCHORAGE,139,49,85,87,52,553.7 US , WZJC, HORIZON CHALLENGER,66,36,65,66,0,22.2 US , WZJD, HORIZON DISCOVERY,43,34,41,42,1,38.2 US , KRGB, HORIZON ENTERPRISE,33,5,6,6,27,1177.7 US , KGTZ, HORIZON KODIAK,39,3,6,6,33,1221.5 US , WPGK, HORIZON NAVIGATOR,186,131,136,138,48,382 US , WSRL, HORIZON PACIFIC,46,23,38,40,6,212.4 US , WJBJ, HORIZON PRODUCER,188,134,153,158,17,99.7 US , WFLH, HORIZON RELIANCE,79,65,78,78,0,11.5 US , WFLG, HORIZON SPIRIT,66,63,64,66,0,3.3 US , KGTY, HORIZON TACOMA,36,16,22,24,0,87.8 US , 9VAW8, HOSANGER,21,13,13,15,4,386.1 US , KCDK, HOUSTON,35,28,32,34,1,44.3 US , WBN3744, HUNTER,75,67,75,75,0,11.8 US , WGAX, INDEPENDENCE II,43,15,17,20,23,781.7 US , C6WW4, INDEPENDENCE OF THE SEAS,9,6,9,9,0,21.7 US , WXN3191, INDIANA HARBOR,30,27,29,30,0,9 US , WDD7905, INTEGRITY,70,65,67,69,0,19.4 US , WDC6925, INTEGRITY,43,20,30,36,0,53.2 US , WDC6588, ISLAND SCOUT,14,0,4,14,0,70.8 US , WDF7020, JAMES L. KUBER,91,90,91,91,0,0 US , WYP8657, JAMES R. BARKER,269,139,176,200,15,89.7 US , WDC3786, JEAN ANNE,14,10,14,14,0,18.9 US , A8PQ7, JENNY N,16,11,15,15,0,31.4 US , VCYP, JOHN B. AIRD,27,10,19,19,2,205 US , WE3806, JOHN G. MUNSON,145,124,139,142,1,10.7 US , WZE4539, JOHN J. BOLAND,1,1,1,1,0,0 US , WXY6216, JOSEPH L. BLOCK,695,1,392,449,119,231.9 US , WTEU, KA'IMIMOANA (AWS),386,337,344,350,20,57 US , WBS5272, KAREN ANDRIE,318,154,190,202,84,238.8 US , WTK2245, KATRINA EM,9,5,6,9,0,28.6 US , C6WK2, KAVERI SPIRIT,24,2,10,20,0,73.8 US , WCY2920, KENNICOTT,23,14,23,23,0,19.6 US , WDA7827, KILO MOANA,14,2,2,2,12,1227.8 US , KAO107, KIYI,18,14,17,18,0,24.4 US , KCEJ, KNORR,720,682,702,717,0,14.1 US , KQXZ, KODIAK,18,14,17,18,0,11.5 US , VRWJ7, KOTA JATI,58,32,41,47,1,65 US , WCX7445, LAURENCE M. GOULD (AWS),599,597,599,599,0,11.1 US , 3FJY6, LAVENDER PASSAGE,4,2,4,4,0,26.2 US , WUR8857, LEE A. TREGURTHA,3,2,2,2,1,211.3 US , WHIA, LIBERTY EAGLE,66,34,51,58,0,39.8 US , WADP, LIBERTY GLORY,27,17,26,27,0,25.3 US , WADN, LIBERTY GRACE,22,15,19,21,0,36.1 US , KRAU, LIBERTY PRIDE,33,25,28,32,0,15.5 US , WCOB, LIBERTY SUN,25,11,17,18,7,422 US , ZCDV9, LIVORNO EXPRESS,20,14,20,20,0,26.5 US , V7BW9, LNG GEMINI,55,17,40,41,13,365.7 US , C6XQ5, LNG JUPITER,14,4,12,13,1,140.4 US , V7BX2, LNG LEO,13,2,5,6,7,791.6 US , ONFP, LOWLANDS ORCHID,47,1,2,47,0,69.6 US , V7QK3, LYLA,101,6,29,39,27,242.4 US , PFRO, MAASDAM,134,107,115,121,1,39.6 US , WBDS, MAERSK CAROLINA,21,4,11,20,1,77.1 US , WAHP, MAERSK GEORGIA,34,1,23,30,1,79.4 US , WKPM, MAERSK IDAHO,59,9,30,55,0,62.2 US , KABL, MAERSK IOWA,49,10,26,32,16,504 US , WKPY, MAERSK KENTUCKY,58,33,38,53,0,52.6 US , WAHV, MAERSK MISSOURI,13,10,13,13,0,19.3 US , WCDP, MAERSK MONTANA,9,7,8,8,1,148.3 US , KABP, MAERSK OHIO,52,14,21,27,25,713.7 US , WHKM, MAERSK PEARY,44,6,25,37,0,74.7 US , WKAB, MAERSK UTAH,68,33,50,60,2,58 US , WAHK, MAERSK VIRGINIA,23,5,18,23,0,39.7 US , 3FCC4, MAERSK WAKAYAMA,5,4,4,5,0,0 US , WKPN, MAERSK WISCONSIN,49,14,38,47,0,49.8 US , WKPF, MAERSK WYOMING,75,35,69,73,0,32 US , WHRN, MAHIMAHI,12,10,11,11,1,135.8 US , WYX2079, MAIA H,2,2,2,2,0,0 US , C6FZ8, MAJESTY OF THE SEAS,23,20,23,23,0,14.3 US , KBGK, MAJOR BERNARD F. FISHER,53,38,42,44,9,235.2 US , WDB6831, MANISTEE,26,19,25,25,1,37.8 US , WDE3569, MANITOWOC,85,83,85,85,0,10.4 US , KDBG, MANOA,17,9,15,15,2,185.6 US , WRGD, MANUKAI,14,4,4,4,10,923.5 US , WECH, MANULANI,13,3,5,5,8,781.6 US , C6TF8, MAPLE 2,39,5,19,21,11,317.6 US , OUIY2, MARCHEN MAERSK,37,34,36,36,1,53.6 US , WDC6698, MARCUS G. LANGSETH (AWS),733,707,713,714,15,31.9 US , OUJI2, MAREN MAERSK,24,15,23,24,0,25.6 US , 3FHX2, MARINE EXPRESS,12,0,4,11,0,99 US , KSDF, MARY ANN HUDSON,72,50,66,72,0,23.3 US , WN4201, MATANUSKA,2,0,1,2,0,60.5 US , WSLH, MAUI,38,14,14,14,24,914.1 US , KFMV, MAUNALEI,48,30,37,37,11,345.3 US , WGEB, MAUNAWILI,19,4,5,5,14,967.4 US , WECB, MELVILLE,596,547,558,560,28,51.8 US , WYQ4356, MESABI MINER,45,13,16,24,6,175.9 US , WAHG, MIDNIGHT SUN,8,4,7,7,1,199.6 US , ONAR, MINERAL BEIJING,11,1,2,7,1,119.6 US , VRKF5, MINERAL BELGIUM,9,1,1,3,0,136.2 US , ONFW, MINERAL DALIAN,19,0,0,0,15,618.2 US , ONAN, MINERAL NOBLE,25,1,4,19,0,96.3 US , ONBF, MINERAL TIANJIN,2,0,0,2,0,71 US , WNRD, MOKIHANA,47,26,38,38,9,296.3 US , C6FZ9, MONARCH OF THE SEAS,20,10,19,20,0,31.4 US , WCX9104, MONITOR,14,13,14,14,0,14.4 US , VDWC, MONTREALAIS,8,8,8,8,0,0 US , A8AT8, MORNING GLORY VIII,105,13,28,58,10,148 US , TCZF2, MUSTAFA DAYI,6,0,0,6,0,86.2 US , WDE7904, NACHIK,1,0,0,1,0,71 US , WTER, NANCY FOSTER (AWS),296,284,289,293,0,14.8 US , WBP3210, NATHANIEL B. PALMER (AWS),328,327,328,328,0,11.1 US , C6FU4, NAVIGATOR OF THE SEAS,1,0,0,1,0,67 US , VRBK5, NEW DELHI EXPRESS,9,4,8,9,0,35.3 US , WKWB, NEW HORIZON,96,96,96,96,0,11 US , PBWQ, NIEUW AMSTERDAM,32,17,27,28,4,183.7 US , A8UD3, NOBLE GLOBETROTTER I,18,17,18,18,0,8.1 US , KRPP, NOBLE STAR,18,6,7,8,10,809.1 US , PHET, NOORDAM,62,22,38,42,11,199.7 US , KIYI, NORTH STAR,129,89,124,125,4,65.6 US , C6FT7, NORWEGIAN DAWN,437,182,239,308,20,93.3 US , C6XP7, NORWEGIAN EPIC,27,7,11,24,0,66.6 US , C6VG8, NORWEGIAN GEM,69,26,39,55,3,83.4 US , C6WK7, NORWEGIAN JADE,232,118,196,219,3,44.6 US , C6TX6, NORWEGIAN JEWEL,58,18,30,48,0,62.1 US , C6VG7, NORWEGIAN PEARL,520,474,510,514,2,21.1 US , C6PZ8, NORWEGIAN SKY,135,122,131,135,0,15.5 US , C6TQ6, NORWEGIAN SPIRIT,37,28,34,37,0,26.9 US , C6FR3, NORWEGIAN STAR,92,72,92,92,0,15.1 US , C6RN3, NORWEGIAN SUN,7,6,7,7,0,3.3 US , HOJY, NYK LIBRA,28,24,27,28,0,18.5 US , 3FJM9, NYK ROSA,8,1,3,5,1,260.8 US , 9V7645, NYK RUMINA,29,7,14,18,1,110.6 US , 3FUL2, NYK TRITON,60,4,17,42,0,92.8 US , C6XS7, OASIS OF THE SEAS,58,28,58,58,0,28.6 US , V7DZ8, OCEAN CLIPPER,37,22,31,35,0,26.8 US , WDF9323, OCEAN FREEDOM,37,10,25,31,6,263.7 US , WBO5471, OCEAN HARVESTER,1,0,0,1,0,111 US , WCF3990, OCEAN MARINER,33,18,25,33,0,33 US , WTDH, OKEANOS EXPLORER (AWS),309,300,305,309,0,4.8 US , WDF7019, OLIVE L. MOORE,144,136,143,143,0,6.8 US , VRWE8, OOCL AMERICA,36,23,29,34,1,38 US , VRDN3, OOCL BUSAN,11,0,4,10,0,70.7 US , VRFX8, OOCL NAGOYA,53,18,50,52,0,40.8 US , PBKH, OOSTERDAM,29,13,17,25,0,62.1 US , 9VAR2, OPTIMANA,136,0,0,3,105,861.3 US , A8HY8, ORANGE SUN,6,4,4,4,2,487.3 US , WTDO, OREGON II (AWS),462,428,442,451,2,22.1 US , WDF2960, OREGON VOYAGER,2,1,1,1,1,730.5 US , VRAC9, ORIENTAL QUEEN,14,1,4,12,0,70.3 US , WTEP, OSCAR DYSON,610,593,604,609,0,3.9 US , WTEE, OSCAR ELTON SETTE (AWS),57,48,49,50,3,73.5 US , NWS0015, OSCAR ELTON SETTE (AWS),231,230,231,231,0,1.4 US , ELPP9, OURO DO BRASIL,7,3,5,5,2,432.6 US , V7HP2, OVERSEAS ALCESMAR,6,0,2,4,0,102.3 US , KCHV, OVERSEAS ANACORTES,22,11,21,21,1,91.3 US , V7HP4, OVERSEAS ANDROMAR,36,17,30,35,0,44.4 US , WJBU, OVERSEAS BOSTON,67,22,42,42,25,549.3 US , WOAG, OVERSEAS CASCADE,12,8,10,10,2,198.9 US , WWAA, OVERSEAS HOUSTON,7,4,5,5,1,255.4 US , V7NV4, OVERSEAS JOYCE,89,83,88,88,0,14.9 US , WAAT, OVERSEAS LONG BEACH,15,3,8,8,6,598.1 US , WABS, OVERSEAS LOS ANGELES,181,90,108,109,70,561.2 US , WDC7070, OVERSEAS LUXMAR,14,7,10,13,0,49.7 US , WDC6975, OVERSEAS MAREMAR,49,9,23,40,5,106.8 US , WDBH, OVERSEAS NIKISKI,5,1,4,4,1,318.8 US , WHED, OVERSEAS TEXAS CITY,6,1,4,6,0,50.8 US , WDD9283, PACIFIC FREEDOM,6,0,3,6,0,55.8 US , WDD9285, PARAGON,2,0,0,2,0,70.5 US , WBN3014, PATRIARCH,4,4,4,4,0,0 US , WQVY, PATRIOT,10,0,0,1,0,181.6 US , C6TH9, PAUL GAUGUIN,237,78,123,174,0,72.9 US , WYR4481, PAUL R. TREGURTHA,68,37,40,42,14,255.4 US , WDC6736, PHILADELPHIA EXPRESS,196,79,119,122,74,556.8 US , WE3592, PHILIP R. CLARKE,50,42,43,43,6,145.1 US , WTDL, PISCES (AWS),529,521,525,527,1,14.1 US , WAZV, POLAR ADVENTURE,13,12,13,13,0,7.8 US , WDF5296, POLAR CLOUD,32,2,15,25,2,114.4 US , WACW, POLAR DISCOVERY,76,15,68,76,0,41.2 US , WDG2085, POLAR ENDURANCE,12,4,5,12,0,54.8 US , WRTF, POLAR ENTERPRISE,33,9,33,33,0,28.8 US , WDC8652, POLAR RANGER,1,0,0,1,0,111 US , WDJK, POLAR RESOLUTION,241,134,236,239,1,30.5 US , WRYW, PRESIDENT ADAMS,48,28,36,41,7,232.9 US , WRYC, PRESIDENT JACKSON,46,21,32,35,11,363.5 US , WRYD, PRESIDENT POLK,40,17,30,35,5,210.5 US , WNDP, PRESIDENT TRUMAN,29,11,20,20,9,461.6 US , WZE4928, PRESQUE ISLE,10,0,0,0,0,251 US , WNBE, PRIDE OF AMERICA,32,24,32,32,0,13.4 US , WUW2120, PRIDE OF BALTIMORE II,3,2,3,3,0,21 US , PBGH, PRINSENDAM,7,3,4,7,0,42 US , WBM5092, PT. THOMPSON,7,7,7,7,0,15.3 US , WRJP, R. J. PFEIFFER,49,23,29,29,20,598.5 US , KGCJ, R. M. THORSTENSON,3,0,1,3,0,87.3 US , C6SE7, RADIANCE OF THE SEAS,45,30,42,43,0,33.1 US , WTEF, RAINIER,119,108,118,119,0,14.1 US , WCW7977, REBECCA LYNN,29,18,27,28,0,23 US , WDD2451, REDOUBT,5,1,2,3,2,282.6 US , WCZ5535, RESOLVE,41,14,22,26,13,448 US , C6UA2, RHAPSODY OF THE SEAS,53,41,49,53,0,24.9 US , WDA4486, ROBERT C. SEAMANS,1,0,1,1,0,41 US , WSQ2674, ROBERT GORDON SPROUL (AWS),239,233,235,235,1,15.4 US , CFN4934, ROBERT S. PIERSON,8,4,7,8,0,27.2 US , WZP8164, ROGER BLOUGH,157,115,139,146,4,51 US , KAOU, ROGER REVELLE,704,663,667,669,29,46.7 US , A8PQ3, RONALD N,2,1,2,2,0,31 US , PHFV, RYNDAM,32,25,30,32,0,21.1 US , KAWM, S/R AMERICAN PROGRESS,34,14,27,34,0,32.2 US , MRWF2, SAFMARINE MAKUTU,20,12,19,19,1,93.7 US , VRZQ9, SAGA MONAL,22,8,13,17,0,62.6 US , VRDA4, SAGA NAVIGATOR,1,0,0,1,0,91 US , VRXO6, SAGA VIKING,24,0,15,22,0,64.2 US , C6NO5, SAIPEM 7000,57,48,55,57,0,12.3 US , WZC7602, SAM LAUD,26,10,12,25,1,90.3 US , WDC8307, SAMUEL DE CHAMPLAIN,13,6,11,11,1,112.5 US , MGYB8, SANTA MONICA,56,52,54,55,1,26.2 US , HZRX, SAUDI ABHA,3,3,3,3,0,10.7 US , HZZB, SAUDI DIRIYAH,26,22,25,25,1,46.1 US , HZZD, SAUDI TABUK,34,12,13,13,21,493 US , WYT8569, SEA PRINCE,10,10,10,10,0,20 US , WCX9106, SEA VOYAGER,56,28,35,56,0,33.2 US , WKAU, SEA-LAND CHAMPION,20,0,4,15,0,99.2 US , WDB9948, SEA-LAND CHARGER,35,29,32,35,0,17.7 US , WDB9950, SEA-LAND COMET,50,45,50,50,0,12.7 US , WKAE, SEA-LAND EAGLE,44,29,36,41,3,79.5 US , WDB9949, SEA-LAND INTREPID,33,16,21,23,9,372.8 US , WDB9986, SEA-LAND LIGHTNING,45,18,28,28,17,556.1 US , WKAW, SEA-LAND MERCURY,60,20,41,42,18,450.4 US , WDB9951, SEA-LAND METEOR,50,12,37,49,0,45.5 US , WKAP, SEA-LAND RACER,61,34,51,58,3,98.7 US , WCY7054, SEABULK ARCTIC,14,4,4,5,8,595.3 US , KNJK, SEABULK TRADER,37,4,27,36,0,52.1 US , WBN3013, SENTRY,18,18,18,18,0,12.9 US , C6VV8, SEVEN SEAS MARINER,44,38,43,44,0,15.8 US , C6SW3, SEVEN SEAS VOYAGER,4,3,3,4,0,27.2 US , WDE2542, SHEILA MCDEVITT,32,20,28,31,0,24.2 US , WSNB, SIERRA,10,8,10,10,0,9.9 US , WCQ6174, SIKU,14,0,4,14,0,73.1 US , 9VAH, SIRANGER,46,12,33,35,0,84.1 US , OYOS2, SKAGEN MAERSK,26,15,21,25,0,36.5 US , ELQQ4, SOL DO BRASIL,16,12,15,15,1,109.4 US , C6TZ9, SPLENDOUR OF THE SEAS,193,127,181,193,0,27.5 US , WDD3825, ST LOUIS EXPRESS,363,62,67,72,291,1158.1 US , WZA4027, ST. CLAIR,4,3,3,4,0,13.5 US , WYL4909, STACEY FOSS,10,0,2,10,0,76.8 US , LAVV4, STAR AMERICA,13,10,11,11,2,238.4 US , LAYG5, STAR ATLANTIC,19,19,19,19,0,9.4 US , LAWO2, STAR EAGLE,33,16,19,21,12,538.8 US , LAHE2, STAR EVVIVA,12,4,6,9,3,384.2 US , LAVW4, STAR FLORIDA,37,34,36,36,1,18.6 US , LAVY4, STAR FRASER,15,10,12,13,0,34.1 US , LAVX4, STAR FUJI,18,1,4,7,7,316.3 US , LADR4, STAR GRAN,27,27,27,27,0,8.5 US , LAXP4, STAR HANSA,33,26,28,31,2,97 US , LAVD4, STAR HERDLA,2,2,2,2,0,6 US , LAVN4, STAR HIDRA,47,37,41,45,1,30.3 US , LAOX5, STAR ISFJORD,21,20,20,20,1,77.8 US , LANT5, STAR ISMENE,9,6,8,8,1,176.7 US , LAMP5, STAR ISTIND,4,4,4,4,0,9.2 US , LAJS6, STAR JAVA,31,27,27,30,0,12.2 US , LAZU5, STAR JUVENTAS,28,17,25,26,2,167.4 US , LAJK7, STAR KVARVEN,9,2,3,9,0,62 US , WCAH, STATE OF MAINE,44,29,33,34,2,92.5 US , PHSG, STATENDAM,19,19,19,19,0,14.9 US , WDC6055, STEWART J. CORT,23,4,6,7,10,692.5 US , WDC8583, STIKINE,4,1,4,4,0,33.5 US , WDG2051, STIMSON,24,8,14,19,0,66.2 US , WDE4432, SUNSHINE STATE,7,6,7,7,0,21.9 US , C6DM2, SUPERSTAR LIBRA,101,81,99,100,0,3 US , VRCQ2, SYLVIE,2,0,2,2,0,36.5 US , LAOW5, TALISMAN,10,8,10,10,0,18.8 US , C6XC2, TANGGUH HIRI,89,62,83,88,0,23.6 US , KTDQ, THOMAS G. THOMPSON,9,8,8,9,0,13.3 US , WTEA, THOMAS JEFFERSON,364,359,362,363,0,11.8 US , VGPY, TIM S. DOOL,54,27,46,51,3,107.1 US , WCX2255, TIME BANDIT,1,0,1,1,0,31 US , WDC9555, TRIUMPH,1,1,1,1,0,30 US , J8PE3, TROPIC CARIB,23,20,23,23,0,21 US , J8PR3, TROPIC DAWN,1,0,0,0,1,810 US , HO7723, TROPIC EXPRESS,20,20,20,20,0,16.8 US , J8NY, TROPIC JADE,13,1,5,5,8,893 US , J8PD, TROPIC LURE,25,7,24,24,1,87.2 US , J8NX, TROPIC NIGHT,21,14,19,19,2,158.9 US , J8NW, TROPIC OPAL,40,40,40,40,0,11.1 US , J8PB, TROPIC PALM,21,10,21,21,0,31 US , J8AZ2, TROPIC SUN,12,11,12,12,0,22.9 US , J8PE4, TROPIC UNITY,22,20,21,21,1,83.4 US , WDE8761, TUG DOROTHY ANN,77,68,69,74,2,47.6 US , WDF5483, TUG SPARTAN,214,112,133,140,52,338.9 US , WNGW, TUSTUMENA,221,169,218,219,0,13 US , V7DI7, TYCO DECISIVE,90,59,82,82,8,148.8 US , V7DI8, TYCO DURABLE,8,3,5,5,3,554.6 US , P3GY9, UBC SAIKI,19,5,15,16,0,58.2 US , 5BDK2, UBC SANTA MARTA,1,0,0,1,0,102 US , VRCV5, UNIQUE CARRIER,56,27,38,46,0,52.1 US , VRGT8, UNIQUE EXPLORER,11,2,6,7,0,76.1 US , VRWV4, UNIQUE SUNSHINE,12,4,9,12,0,38.6 US , ELYB2, UNITED SPIRIT,1,1,1,1,0,1 US , PHEO, VEENDAM,33,29,32,33,0,14.8 US , WDE2719, VIGILANT,38,26,33,38,0,19.2 US , KSPH, VIRGINIAN,63,41,43,43,20,465.2 US , C6SE8, VISION OF THE SEAS,7,2,6,7,0,40.6 US , PCHM, VOLENDAM,221,195,206,211,5,38.1 US , C6SE5, VOYAGER OF THE SEAS,1,0,1,1,0,41 US , WXU3434, WALTER J. MCCARTHY JR.,66,49,55,57,2,53.2 US , WDD3826, WASHINGTON EXPRESS,87,39,51,52,35,591.6 US , WDF8784, WENDY O.,24,3,6,21,1,99.7 US , 3EMK6, WEST SIRIUS,5,3,4,5,0,34.8 US , PINX, WESTERDAM,36,34,36,36,0,9.5 US , C6SI4, WESTWOOD COLUMBIA,31,0,3,30,0,85.1 US , C6UB2, WESTWOOD OLYMPIA,42,33,38,38,4,153.9 US , WC5932, WILFRED SYKES,696,0,515,566,37,108.3 US , WCY2270, WOLSTAD,4,0,1,4,0,75.8 US , ELWG7, WORLD SPIRIT,48,30,46,46,0,28.6 US , VRET5, YM ANTWERP,27,10,18,19,7,186.7 US , VREX8, YM BUSAN,2,2,2,2,0,20.5 US , WDD6127, YORKTOWN EXPRESS,27,12,15,17,7,395.3 US , H9TE, YUHSAN,319,42,75,144,29,204.1 US , PDAN, ZAANDAM,72,48,55,58,9,116.6 US , A8SI3, ZIM LOS ANGELES,16,15,16,16,0,13.5 US , A8SI5, ZIM NINGBO,29,26,27,29,0,12.6 US , VRGA6, ZIM SHANGHAI,5,1,5,5,0,36.6 US , PBIG, ZUIDERDAM,115,89,95,102,8,113.4 ZZ , GHJV, Lord Nelson,16,11,14,14,0,18.9 ZZ , ZQHM2, TENACIOUS,1,0,0,0,0,173 ZZ , 3EPD8, TRINITY ARROW,21,12,20,21,0,31.2 ZZ , 3FMV6, TRINITY GLORY,37,17,28,36,0,40.6 fldigi-3.21.80/data/win32/0000775000175000017500000000000012313333727012005 500000000000000fldigi-3.21.80/data/win32/fldigi.ico0000664000175000017500000001307612313064025013656 00000000000000@@((@€ÿÿÿÿ€€€@@@ÀÀÀ   ààà___÷ÐÐÐ///°°°oooðððPPPèèèØØØ'''ÈÈÈ777¸¸¸HHH¨¨¨˜˜˜gggˆˆˆwwwWWW  õõõììì äääÜÜÜÔÔÔ###ÌÌÌÄÄÄ;;;¼¼¼DDD´´´LLL¬¬¬¤¤¤œœœccc”””kkkŒŒŒsss„„„{{{,,,222SSS\\\òòòîîîêêê æææ âââÞÞÞÚÚÚÖÖÖÒÒÒ!!!ÎÎÎ%%%ÊÊÊ)))ÆÆÆÂ¾¾¾999ººº¶¶¶FFF²²²JJJ®®®NNNªªª¦¦¦UUU¢¢¢žžžšššaaa–––’’’iiiŽŽŽmmmŠŠŠqqq†††uuu‚‚‚yyy~~~ôôôñññïïïííí ëëë éééçççåååãããáááßßßÝÝÝÛÛÛÙÙÙ×××ÕÕÕ$$$ÓÓÓ&&&ÑÑÑÏÏÏÍÍÍËËË111ÉÉÉÇÇÇÅÅÅ888ÃÃÃ<<<ÁÁÁ¿¿¿???½½½AAA»»»EEE¹¹¹GGG···IIIµµµKKK³³³±±±¯¯¯QQQ­­­RRR«««VVV©©©§§§¥¥¥]]]£££^^^¡¡¡ŸŸŸbbb›››™™™hhh———lll•••nnn“““‘‘‘ttt‹‹‹xxx‰‰‰zzz‡‡‡|||………}}}ƒƒƒþ}}I‰>>(Q(vvv v+Q(w{I‘‡wv=2³Hº_ºi¾¶½3²;°–>‰…v{EvÙ7N€'‚‚,TdF†'‚TÄÉ{E‰EƒcÅ’ŒN‚Ž„~«P¢o<EKyG¹9RN FP|%Š*\·Ò‡KKG…41ZPR‚FD'FŠš3\͘‘Ev((…?Ã;3ŒJ„D‚FD† §À5?>I>&‡½ÎZ•ˆ€H’‚§'J-³×‡Evv{IÌ_1 €H|© •L¯Z©Myvvv>v‹ÂY\œ†ŽDFF€D€›« Ìkyv}}‡•-T‚„F„F’~N§ž§s }}>ƒVY§‚N€]'‚Žf¤¯ÅOyvKÄ\¿TŸ‚„„zJ€ž41¼‹>wKy‹¤]F‚PL„~~ºXÈ«ÎU…GEv“sR¹gJF†~'„D s_¹“yEybR_¿H†—'CL*~—/`Ev¬,»ºHg‚$ŒX% ØZ¬Gw¡ž*Š€„a'½FŒ—Ž¢¡K>vvvyy(Ô›%”Zh±oÔ¢)/q…y}>>v}˜S(Kƒ‰Uƒ‹K v¡O‡>v=ˆÃÈkÑ2ÎÈjzÒ(wO‡–¾5¤%'LL†)„ˆ'L~œ7K {¬r4jTZ\CF‚„ ]”5? v&E¦:Ñ”ž'À€Šx„'™J1Ÿ Ô}vw>y{£pf¯¤Ÿ„€FxF*ŒX×gÙ‹wwy{>wK´l»n< ‚%%)DˆZ×Êq{v‹Gy&uTÊÉ—™FH| ¹”£˜}K vvK Ï¥•%†„ˆ''z½­5›´I}{vƒw·XLŒ~FH€%D 3ÀÕ‡yI(>u”šŒF%N«Hp¥DŠNŸ´y&wIªŽ‚±dk9‚HHN­IwvwvIk F›V¥¿Ë½\)ˆzm6‡&‹>wv@È›€)—F Ù‚'~±tyvyv…E[ÌÕ­TÄž|„HF~ˆ”HÓ8ÆOyI>gÓ¥’­„Ž)F‚NLÃÐ>&>}yù§ˆD1‚„HHŠŽ1¤ n ‘y>’¥X„€—ŽJ’Œ|_-—^yIvvwv^VN„‚,fXˆ3aFH'’YGvvvwwv¸¿†1BnÏ 8»|BywI vI u‰G…G|vv‰…}}EES‡ ww{( vvKI v{v¨ÙÕ9ÇAnÎÈD¼‡www £·1L†—/¥]„€ º.y>>v‘n§ÖŸR%H\ž% ¢¥i>>…yÎÓ­§N†„ŒŒH™”¯±n{IwwÇÈ«’€¿JV¯/J)ZµcÁIwwb1s5¤F-HH c€ ½Î_`w>{®ÈÖV'_R„ŒŽž×ÕÕ¦v=ÉcËĤ›ˆŽ%„H†šÂØØA wK!\-P”ŠN™)ž15^y¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦e3PŒ)— _•a×N)Œ de¦¦¦¦¦¦ª0¦¦¦¦¦¦¦¦¦¦¦¦¦¦ÚÚÚÚÚ" #WWQfldigi-3.21.80/data/win32/flarq.ico0000664000175000017500000002765612313064025013536 00000000000000@. ˜/(@\ 1KŸ #<‘hnh_h$‚hRZ´ZN¨\¯+H˜¸ZwÍÿYqÌÿZlÉÿ[kÉÿKY²ô i¯bjµ¯IM¯QS¯Y\”]k!+7j@O@`º/H™ÿ^…Öÿv¢õÿv ùÿtŸùÿsœøÿj“ìÿ[Ùÿ%@‘ÿ#:‡ÿ$<ƒÿ#?ƒÿ!<‚þ'<~÷)8xoF~9L…ÅPf©ÿFW©ÿ0Šÿx–óÿpöÿlžøÿq¥úÿKuËÿI€ÚÿJ‚ÝÿC{Óÿhžóÿp¥÷ÿyªøÿu¦õÿq¥úÿeŒàÿ;N›üO]I@‰/)x[Ž7|üV}Ïÿnšöÿtšúÿ)C£ÿr“òÿi—ôÿa“ñÿLzÖÿ>mÈÿaœïÿc ùÿaŸøÿc øÿj¥üÿcžöÿbœõÿg¡ýÿi˜øÿg…åÿ*5ð-6‹a^E --~U$"zÿ~ÿFkÌÿq¦üÿeŸøÿkŸýÿ,U¹ÿ/U¹ÿ)Sµÿ5bÂÿp üÿr¦ýÿe›õÿk¤üÿeœ÷ÿi üÿižüÿjžüÿo¡þÿX‡âÿ6cÆÿ+W»ÿIrÌÿVzÓÿ"9Šÿ!aµC#X!)h§M`¶ìTkÒÿ_~åÿ1ZÀÿh–ôÿlŸùÿMßÿ5hÎÿS„åÿ`íÿnœøÿnŸúÿq£ûÿiôÿm¡÷ÿm øÿnžúÿqŸýÿ6bÃÿFoÑÿX~âÿW„Üÿ`˜ìÿk©ûÿd¡üÿc“ðÿZxÏÿ0~½9@wpF V8^âFa³ÿv¢÷ÿl ûÿjþÿ$P´ÿRxÛÿfŽíÿ,X¸ÿY—ñÿ^ûÿi¡ûÿj¡úÿi ÷ÿgžôÿiŸñÿ_”èÿ\åÿh—îÿ0V³ÿLv×ÿršúÿqœýÿf™óÿe¢ðÿd©öÿ^£öÿ\š÷ÿ[Šíÿ/Lªÿ(u½S8I"W$_ª'3‡ÿ.>¥ÿTzÚÿl¡øÿe£öÿn©þÿP±ÿ| UKc°ÿh‰æÿgîÿ@jËÿ/[¼ÿ*LªÿXéÿUêÿf¡øÿh£ùÿk¤úÿl¤ùÿe ôÿb£öÿ_ õÿF†ÛÿB×ÿ_›ðÿY•íÿh¢ùÿg ùÿež÷ÿh¡úÿg¡úÿb¢÷ÿc øÿfšøÿLy×ÿK|ÒÿVÞÿ`ìÿhõÿxŸöÿp‡Üÿo¨&z’›Ô?Iˆ¦-A’ÿ2U¹ÿ)X¹ÿ']·ÿR‚Ûÿv ÿÿtŸüÿnŸûÿf¢öÿ`¢ðÿb¤òÿc óÿg›öÿn£üÿf öÿi£ùÿk¤üÿj¡üÿiŸýÿgžüÿfúÿeŸúÿk§ûÿ`õÿd ùÿ`˜òÿ+_ºÿDwÒÿu¥ýÿiœ÷ÿh¡öÿd óÿj¡úÿpúÿu—øÿ%Šÿ#y‚4'\Ÿ+$[Ÿ! WŸOŸHŸ-*SŸ]_‘Ÿ)g°N_©ÿWtÑÿV„ëÿZñÿj¡úÿn¡üÿq¢ýÿiš÷ÿk øÿg¢òÿe¤ñÿe¥ôÿcŸöÿiŸýÿižúÿkŸöÿm øÿn ûÿp¡þÿlžýÿkœýÿlŸþÿjŸûÿdœøÿf øÿ>pËÿ[†éÿOzÚÿg›õÿg¡öÿf¡ùÿcžüÿj ýÿjžûÿoúÿMv×ÿ"ŠÿkÐLŸGgYFoÿQFrÿ`^Šÿhl‘ÿqnˆÿa^…ÿ"iÿNrÅÿqœøÿqžýÿb¡ûÿb ùÿg ùÿgžøÿi úÿi¡úÿi¢ùÿg¢øÿf¢öÿf¢÷ÿf ùÿg úÿh¡ùÿj¤öÿi£öÿi¡ùÿiŸüÿgüÿgšüÿlžÿÿd”÷ÿ\‹ìÿP|Ûÿ;cÃÿkšùÿiœüÿfúÿe¢ûÿe¡ûÿf ýÿa—öÿ]‘ïÿDsÌÿ2b»ÿb–íÿkšèÿn‘Ùÿ*|÷ ^qK0Z0 [0W0 E0 F0I0[D))mç;J†þ¼ÂÞÿëïòÿï÷îÿäîæÿôù÷ÿûùúÿþûýÿõïóÿ¨ž®ÿŸ•§ÿòìóÿùö÷ÿÿýýÿÿýÿÿæçïÿÞÛñÿ­¨Æÿ\Y€ÿpn”ÿ64_ä ?§$N§@9fY0m $bÖ'dÿ5IŠÿXo²ÿ†¡åÿš¸÷ÿ¦Æÿÿ°Ðþÿ²Ôúÿ¸Ùúÿ¼Þûÿ¹ÛþÿÀÞýÿ¿Ùûÿ¿ÖöÿÀÙûÿ¹ÕþÿªÌûÿ…ªðÿyžìÿnßÿ*vÿ#dÔYg¡œ/#ZîaX~ÿ­ªÃÿØÛðÿéïýÿèéûÿðì÷ÿøõ÷ÿöñòÿ¡•«ÿñåøÿñíìÿüùúÿþûþÿÿþÿÿ†}£ÿcXÿRG‚æ"S`?`IBX\3$*_`L`(n`Uf¬û1CŽÿ9OœÿE\¥ÿŒ¦çÿž·öÿ ºòÿž¾ðÿ²Òýÿ·Öþÿ¼Ûÿÿ¶Öÿÿ–¹ðÿ²ñÿRs¾ÿ1DŽÿ1H‘œ a`%6n1D0dY&B`XPyngd‘ÿccŠÿro•ÿž—´ÿÔÍÞÿÓÍÚÿŸÐÿñçûÿòñîÿôóóÿþüþÿÿÿÿÿ<4Uš5)`K?{Sa¢pw¦~GO„Ï\ÏfÏWc±ÿpÑÿp’ãÿvŸîÿ„­øÿ”¸ÿÿ±öÿsŽÙÿ_t¼ÿ,mÛ%[’ \ RO|:8fD&%LÇ%#JÏ.)SÏ@9oÏŽ‰¸ðÃÃÝÿÚâêÿìóóÿôùõÿùûùÿZa¦‡,5xÍ0vÿ>_«ÿgˆÖÿ€ëÿXpºÿ#iÿ5@|ÇUcž!E]/,Züuqžÿ¾áÿñíþÿíé÷ÿm|ª%#Y@,k@3E€Æ1?~÷?N‰\@P^’"5.a>`S’¦J:z÷]N÷©žÇý1(S}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡ÿÿÿÿÿÿü?ÿÿÿÿÿàÿÿÿÿÿÀÿÿÿÿþÿÿÿÿþÿÿÿø?ÿÿÿàÿÿÿÀÿÿÿ€ÿÿÿÿÿÿÿàÿþÀÿÿÀ?ÿÿððÿÿÿÿÿàÿÿÿÿÀÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfldigi-3.21.80/data/NAVTEX_Stations.csv0000664000175000017500000002665612313064025014400 00000000000000Azores;AZR;490.0;J;CTH;Horta;38 32 N;28 38 W;II;PP Canada;CAN;490.0;D;VCK;Riviere-au-Renard, OC;50 11 N;66 07 W;IV;FF Canada;CAN;490.0;J;VOO;Sydney, NS;46 11 N;59 54 W;IV;FF Canada;CAN;490.0;S;VFF;Iqaluit, NU;63 44 N;68 33 W;IV;FF Canada;CAN;490.0;V;VAR-3;Fundy, NB;43 45 N;66 10 W;IV;FF Canary Isles;CNR;490.0;A;EAL;Las Palmas;28 09 N;15 25 W;II;SS Cape Verde;CPV;490.0;P;D4A;Sao Vicente;16 51 N;25 00 W;II;EE Ecuador;EOA;490.0;A;;Ayora;00 45 S;90 19 W;XII;SS England;ENG;490.0;T;GNI;Niton;50 35 N;01 18 W;I;FF England;ENG;490.0;I;GNI;Niton;50 35 N;01 18 W;I;EE England;ENG;490.0;U;GOC;Cullercoats;55 04 N;01 28 W;I;EE France;FRA;490.0;E;FRC;CROSS Corsen;48 24 N;05 03 W;II;FF France;FRA;490.0;S;FRL;CROSS La Garde;43 06 N;05 59 E;III;FF Germany;DEU;490.0;L;DDH47;Pinneberg;53 43 N;09 55 E;I;DD Iceland;ISL;490.0;R;TFA;Reykiavik;64 05 N;21 51 W;I;IS Italy;ICH;490.0;I;IAR;La Maddalena;41 13 N;09 25 E;III;II Italy;IQM;490.0;E;IAR;Mondolfo;43 45 N;13 05 E;III;II Italy;ICI;490.0;W;IAR;Sellia Marina;38 54 N;16 44 E;III;II Portugal;POR;490.0;G;CTV;Monsanto;38 44 N;09 11 W;II;PP Romania;ROU;490.0;L;YOI;Constanta;44 12 N;28 40 E;III;RO Scotland;SCT;490.0;C;GPK;Portpatrick;54 51 N;05 07 W;I;EE South Korea;KOR;490.0;J;;Chukpyon;37 03 N;129 26 E;XI;KO South Korea;KOR;490.0;K;;Pyonsan;35 36 N;126 29 E;XI;KO Spain;ESP;490.0;M;EAV;Valencia (Cabo de la Nao);39 27 N;00 20 W;III;SS Spain;ESP;490.0;T;EAC;Tarifa;36 01 N;05 35 W;II;SS Spain;ESP;490.0;W;EAR;Coruna;43 22 N;08 27 W;II;SS Taiwan;TWN;490.0;V;;Lintou;23 33 N;119 38 E;XI;CC Taiwan;TWN;490.0;X;XSY;Yenliaoken;23 54 N;121 36 E;XI;CC Turkey;TUR;490.0;A;TAF;Samsun;41 17 N;36 20 E;III;TT Turkey;TUR;490.0;B;TAH;Istanbul;41 04 N;28 57 E;III;TT Turkey;TUR;490.0;C;TAN;Izmir;38 22 N;26 36 E;III;TT Turkey;TUR;490.0;D;TAL;Antalya;36 53 N;30 42 E;III;TT Uruguay;URG;490.0;A;CWM27;La Paloma;34 40 S;54 09 W;VI;SS Alaska;ALS;518.0;J;NOJ;Kodiak (east of);57 46 N;152 34 W;XII;EE Alaska;ALS;518.0;X;NOJ;Kodiak (west of);57 46 N;152 34 W;XII;EE Algeria;ALG;518.0;B;7TA;Alger Radio;36 40 N;03 18 E;III;EE Argentina;ARG;518.0;A;L3K;Ushuaia;54 48 S;68 18 W;VI;SS Argentina;ARG;518.0;B;L3D;Rio Gallegos;51 37 S;69 03 W;VI;SS Argentina;ARG;518.0;C;L2W;Comodoro Rivadavia;45 51 S;67 25 W;VI;SS Argentina;ARG;518.0;D;L2l;Bahia Blanca;38 43 S;62 6 W;VI;SS Argentina;ARG;518.0;E;L2P;Mar del Plata;38 03 S;57 32 W;VI;SS Argentina;ARG;518.0;H;L2B;Buenos Aires;34 27 S;58 37 W;VI;SS Argentina;ARG;518.0;M;L3K;Ushuaia;54 48 S;68 18 W;VI;EE Argentina;ARG;518.0;N;L3D;Rio Gallegos;51 37 S;69 03 W;VI;EE Argentina;ARG;518.0;O;L2W;Comodoro Rivadavia;45 51 S;67 25 W;VI;EE Argentina;ARG;518.0;P;L2l;Bahia Blanca;38 43 S;62 6 W;VI;EE Argentina;ARG;518.0;O;L2P;Mar del Plata;38 03 S;57 32 W;VI;EE Argentina;ARG;518.0;R;L2B;Buenos Aires;34 27 S;58 37 W;VI;EE Azores;AZR;518.0;F;CTH;Horta;38 32 N;28 38 W;II;EE Bahrain;BHR;518.0;B;A9M;Amala;26 13 N;50 39 E;IX;EE Belgium;BEL;518.0;M;OST;Oostende (Thames);51 11 N;02 48 E;I;EE Belgium;BEL;518.0;T;OST;Oostende;51 11 N;02 48 E;I;EE Bermuda;BER;518.0;B;ZBM;Bermuda Harbour;32 23 N;64 41 W;IV;EE Bulgaria;BUL;518.0;J;LZW;Varna;43 04 N;27 46 E;III;EE Canada;CAN;518.0;C;VOK;Riviere-au-Renard, OC;50 11 N;66 07 W;IV;EE Canada;CAN;518.0;D;VAJ;Prince Rupert, BC;54 18 N;130 25 W;XII;EE Canada;CAN;518.0;H;XMJ;329 Prescott, ON;45 42 N;125 32 W;IV;EE Canada;CAN;518.0;H;XLK835;Tofino, BC;48 56 N;125 32 W;XII;EE Canada;CAN;518.0;O;VON;St. Johns, NL;47 37 N;52 40 W;IV;EE Canada;CAN;518.0;P;XLJ;895 Thunder Bay, ON;48 26 N;89 13 W;IV;EE Canada;CAN;518.0;O;VCO;Sydney, NS;46 11 N;59 54 W;IV;EE Canada;CAN;518.0;T;VFF;Iqaluit, NT;63 44 N;68 33 W;IV;EE Canada;CAN;518.0;U;VAR-3;Fundy, NB;45 14 N;65 59 W;IV;EE Canada;CAN;518.0;X;VOK;Labrador, NL;53 18 N;60 33 W;IV;EE Canary Isles;CNR;518.0;I;EAL;Las Palmas;28 09 N;15 25 W;II;EE Cape Verde;CPV;518.0;U;D4A;San Vicente;16 51 N;25 00 W;II;EE Chile;CHL;518.0;I;CBV;Valparaiso;32 48 S;71 29 W;XV;SS Chile;CHL;518.0;A;CBA;Antofgasta;23 40 S;70 25 W;XV;EE Chile;CHL;518.0;B;CBV;Valparaiso;32 48 S;71 29 W;XV;EE Chile;CHL;518.0;C;CBT;Talcahuano;36 42 S;73 6 W;XV;EE Chile;CHL;518.0;D;CBP;Puerto Montt;41 29 S;72 57 W;XV;EE Chile;CHL;518.0;E;CBM;Magallenes;52 56 S;70 54 W;XV;EE Chile;CHL;518.0;H;CBA;Antofgasta;23 40 S;70 25 W;XV;SS Chile;CHL;518.0;J;CBT;Talcahuano;36 42 S;73 06 W;XV;SS Chile;CHL;518.0;K;CBP;Puerto Montt;41 29 S;72 57 W;XV;EE Chile;CHL;518.0;L;CBM;Magallenes;52 56 S;70 54 W;XV;SS China;CHN;518.0;L;VRX;Hong Kong;22 13 N;114 15 E;XI;EE China;CHN;518.0;M;XSI;Sanya;18 14 N;109 30 E;XI;EE/CC China;CHN;518.0;N;XSO;Guangzhou;23 09 N;113 29 E;XI;EE/CC China;CHN;518.0;O;XSL;Foochow;26 02 N;119 18 E;XI;EE China;CHN;518.0;O;XSG;Shanghai;31 07 N;121 33 E;XI;EE China;CHN;518.0;R;XSZ;Dalian;38 52 N;121 31 E;XI;EE Croatia;HRV;518.0;O;9AS;Split;43 30 N;16 29 E;III;EE Cyprus;CYP;518.0;M;5BA;Cyprus;35 02 N;33 17 E;III;EE Easter Island;PAO;518.0;G;CBY;Isla de Pascua;27 09 S;109 23 W;XV;SS Easter Island;PAO;518.0;H;CBY;Isla de Easter;27 09 S;109 23 W;XV;EE Egypt;EGY;518.0;N;SUH;Alexandria;31 12 N;29 52 E;III;EE Egypt;EGY;518.0;V;SUK;Kosseir;26 06 N;34 17 E;IX;EE Egypt;EGY;518.0;X;SUZ;Serapeum (Ismailia);30 35 N;32 17 E;IX;EE England;ENG;518.0;E;GNI;Niton;50 35 N;01 18 W;I;EE England;ENG;518.0;G;GOC;Cullercoats;55 04 N;01 28 W;I;EE England;ENG;518.0;K;GNI;Niton (Northern France);50 35 N;01 18 W;I;EE Equador;EOA;518.0;L;;Aycra;00 45 S;90 19 W;XII;EE Equador;EOA;518.0;M;HOG;Guayaquil;02 17 S;72 01 W;XII;EE Estonia;EST;518.0;U;ESA;Tallinn;59 30 N;24 30 E;I;EE Faroes;FRO;518.0;D;OXJ;Torshavn;62 00 N;06 47 W;I;EE France;FRA;518.0;A;FRC;CROSS Corsen;48 24 N;05 03 W;II;EE France;FRA;518.0;W;FRL;CROSS La Garde;43 06 N;05 59 E;III;EE Germany;DEU;518.0;L;DEU;Germany;53 43 N;09 55 E;I;EE Greece;GRC;518.0;H;SVH;Irakleio (Crete);35 20 N;25 07 E;III;EE/GK Greece;GRC;518.0;K;SVK;Kerkyra;39 45 N;19 52 E;III;EE/GK Greece;GRC;518.0;L;SVL;Limnos;39 52 N;25 04 E;III;EE/GK Greenland;GRL;518.0;W;OXI;Nuuk (Kook Island);64 04 N;52 02 W;IV;EE Guam;GUM;518.0;V;NRV;Guam;13 29 N;144 50 E;XI;EE Hawaii;HWA;518.0;O;NMO;Honolulu;21 22 N;158 09 W;XII;EE Iceland;ISL;518.0;R;TFA;Reykiavik;64 05 N;21 51 W;I;EE Iceland;ISL;518.0;X;TFA;Reykiavik;64 05 N;21 51 W;I;EE India;IND;518.0;G;WNB;Bombay;19 05 N;72 50 E;VIII;EE India;IND;518.0;P;VWM;Madras;13 05 N;80 17 E;VIII;EE Indonesia;INS;518.0;A;PNK;Jayapura;02 31 S;140 43 E;XI;EE Indonesia;INS;518.0;B;PKE;Ambon;03 42 S;128 12 E;XI;EE Indonesia;INS;518.0;D;PKF;Makassar;05 06 S;119 26 W;XI;EE Indonesia;INS;518.0;E;PKX;Jakarta;06 07 S;106 52 E;XI;EE Iran;IRN;518.0;A;EQM;Bushehr;28 58 N;50 50 E;IX;EE Iran;IRN;518.0;H;EOI;Bandar Abbas;27 08 N;57 04 E;IX;EE Ireland;IRL;518.0;O;EJM;Malin Head Coastguard;55 22 N;07 21 W;I;EE Ireland;IRL;518.0;W;EJK;Valentia Coastguard;51 27 N;09 49 W;I;EE Israel;ISR;518.0;P;4XO;Haifa;32 49 N;35 00 E;III;EE Italy;ICH;518.0;R;IAR;La Maddalena;41 13 N;09 25 E;III;EE Italy;IQM;518.0;U;IAR;Mondolfo;43 45 N;13 05 E;III;EE Italy;ICI;518.0;V;IAR;Sellia Marina;38 54 N;16 44 E;III;EE Japan;JPN;518.0;G;JNB;Naha;26 09 N;127 46 E;XI;EE Japan;JPN;518.0;H;JNR;Moji;33 52 N;130 36 E;XI;EE Japan;JPN;518.0;I;JGC;Yokohama;35 22 N;118 43 E;XI;EE Japan;JPN;518.0;J;JNL;Otaru;43 12 N;141 00 E;XI;EE Japan;JPN;518.0;K;JNX;Kushiro;42 59 N;144 23 E;XI;EE Malaysia;MLA;518.0;S;9WH 21;Sandakan;05 54 N;118 00 E;XI;EE Malaysia;MLA;518.0;T;9WW;Miri;04 28 N;114 01 E;XI;EE Malaysia;MLA;518.0;U;9MG;Penang;05 25 N;100 24 E;XI;EE Malta;MLT;518.0;O;9HD;Malta;35 49 N;14 32 E;III;EE Mauritius;MAU;518.0;C;MAU;Mauritius;20 10 S;57 28 E;II;EE Morocco;MRC;518.0;M;CNP;Casablanca;33 36 N;07 38 W;II;EE Namibia;NMB;518.0;B;V5W;Walvis Bay;23 03 S;14 37 E;VII;EE Netherland;ATN;518.0;H;JPC;Curacao;12 10 N;68 52 W;IV;EE Netherlands;HOL;518.0;P;PBK;Netherlands Coast Guard;52 06 N;04 15 E;I;EE Norway;NOR;518.0;B;LGP;Bode;67 16 N;14 23 E;I;EE Norway;NOR;518.0;L;LGO;Rogaland;58 39 N;05 36 E;I;EE Norway;NOR;518.0;N;LGD;Orlandet;63 40 N;09 33 E;I;EE Norway;NOR;518.0;V;LGV;Varde;70 22 N;31 06 E;;EE Oman;OMA;518.0;M;A4M;Muscat;23 37 N;58 31 E;IX;EE Pakistan;PAK;518.0;P;ASK;Karachi;24 51 N;67 03 E;IX;EE Peru;PRU;518.0;S;OBY2;Paita;05 05 S;81 07 W;XV;EE/SS Peru;PRU;518.0;U;OBC3;Callao;12 3 S;77 09 W;XV;EE/SS Peru;PRU;518.0;W;OBF4;Matarani;17 01 S;72 01 W;XV;EE/SS Philipines;PHL;518.0;I;;Puerto Princesa;09 44 N;121 03 E;XI;EE Philipines;PHL;518.0;J;DZS;Manila;14 35 N;121 03 E;XI;EE Philipines;PHL;518.0;K;;Davao;07 04 N;125 36 E;XI;EE Portugal;POR;518.0;R;CTV-;Monsanto;38 44 N;09 11 W;II;EE Puerto Rico;PTR;518.0;R;NMR;Isabella - San Juan, PR;18 28 N;67 04 W;IV;EE Russia;RSE;518.0;A;UIK;Vladivostok;43 23 N;131 54 E;XI;II;EE Russia;RSE;518.0;C;UBA2;Petropavlovsk;53 15 N;158 25 E;XI;II;EE Russia;RSE;518.0;D;UIB;Magadan;59 41 N;150 09 E;XI;II;EE Russia;RSE;518.0;G;;Okhotsk;59 22 N;143 12 E;XI;II;EE Russia;RUS;518.0;A;UDN;Novorossiysk;44 43 N;37 47 E;III;EE Russia;RSE;518.0;B;UFO;Kholmsk;47 02 N;142 03 E;XIII;EE Russia;RUS;518.0;C;UHS;Murmansk;68 46 N;32 58 E;;EE Russia;RUS;518.0;H;UGE;Arkhangelsk;64 33 N;40 32 E;;EE Russia (Caspian);RUS;518.0;W;UJB;Astrakhan;46 18 N;47 58 E;III;EE Sardinia;SAR;518.0;T;IDC;Cagliari;39 14 N;09 14 E;III;EE Saudi Arabia;ARS;518.0;H;HZH;Jeddah;21 23 N;39 11 E;IX;EE Scotland;SCT;518.0;O;GPK;Portpatrick;54 51 N;05 07 W;I;EE Sicily;SCY;518.0;V;IQA;Augusta;37 14 N;15 14 E;III;EE Singapore;SNG;518.0;C;9VG;Singapore;01 20 N;103 42 E;XI;EE South Africa;AFS;518.0;C;ZSC;Cape Town;33 41 S;18 43 E;VII;EE South Africa;AFS;518.0;I;ZSO;Port Elizabeth;33 57 S;25 31 E;VII;EE South Africa;AFS;518.0;O;ZSD;Durban;29 48 S;30 49 E;VII;EE South Korea;KOR;518.0;V;;Chukpyon;37 03 N;129 26 E;XI;EE South Korea;KOR;518.0;W;;Pyonsan;35 36 N;126 29 E;XI;EE Spain;ESP;518.0;D;EAR;Coruna;43 21 N;08 27 W;II;EE Spain;ESP;518.0;G;EAC;Tarifa;36 01 N;05 35 W;II;EE Spain;ESP;518.0;X;EAV;Valencia (Cabo de la Nao);38 43 N;00 09 W;III;EE Svalbard;SVB;518.0;A;LGS;Svalbard;78 04 N;13 36 E;;EE Sweden;SWE;518.0;H;SAH;Bjuroklubb;64 28 N;21 36 E;I;EE Sweden;SWE;518.0;I;SAG;Grimeton;57 06 N;12 23 E;I;EE Sweden;SWE;518.0;J;SAA;Gisovshammar;55 29 N;14 19 E;I;EE Taiwan;TWN;518.0;P;;Lintou;23 33 N;119 38 E;XI;EE Taiwan;TWN;518.0;P;;Yenliaoken;23 54 N;121 36 E;XI;EE Thailand;THA;518.0;H;HAS;Bangkok (Nonthaburi);13 01 N;100 01 E;XI;EE Turkey;TUR;518.0;D;TAH;Istanbul;41 04 N;28 57 E;III;EE Turkey;TUR;518.0;H;TAF;Samsun;41 17 N;36 20 E;III;EE Turkey;TUR;518.0;H;TAL;Antalya;36 35 N;30 42 E;III;EE Turkey;TUR;518.0;I;TAN;Izmir;38 21 N;26 35 E;III;EE Ukraine;UKR;518.0;B;UTW;Kerch;44 23 N;36 28 E;III;EE Ukraine;UKR;518.0;C;UTT;Odessa;46 29 N;30 44 E;III;EE United States;USA;518.0;A;NMA;Miami, FL;25 30 N;80 23 W;IV;EE United States;USA;518.0;C;NMC;San Francisco (Point;37 55 N;122 42 W;XII;EE United States;USA;518.0;H;NMB;Savannah, GA;32 08 N;81 42 W;IV;EE United States;USA;518.0;H;NMF;Boston, MA;41 43 N;70 31 W;IV;EE United States;USA;518.0;G;NMG;New Orleans, LA;29 53 N;89 55 W;IV;EE United States;USA;518.0;N;NMN;Portsmouth, VA;36 44 N;76 01 W;IV;EE United States;USA;518.0;O;NMO;Long Beach, CA (Cambria);35 31 N;121 03 W;XII;EE United States;USA;518.0;W;NMW;Astoria, OR;46 10 N;123 49 W;XII;EE Uruguay;URG;518.0;H;CWM27;La Paloma;34 40 S;54 09 W;VI;EE Vietnam;VTN;518.0;K;XVT;Danang;16 05 N;108 13 E;XI;EE Vietnam;VTN;518.0;W;XVG;Haiphong;20 44 N;106 44 E;XI;EE Vietnam;VTN;518.0;X;XVS;Ho Chi Minh-Ville;10 47 N;106 40 E;XI;EE Egypt;EGY;4209.5;X;SUZ;Serapeum (Ismalia);30 28 N;32 15 E;IX;EE Taiwan;TWN;4209.5;P;;Ohi-lung (Keelung);25 08 N;121 45 E;XI;EE Taiwan;TWN;4209.5;P;;Linyuan;22 29 N;120 25 E;XI;EE Taiwan;TWN;4209.5;V;XSX;Chi-lung (Keelung);25 08 N;121 45 E;XI;CC Taiwan;TWN;4209.5;X;;Linyuan;22 29 N;120 25 E;XI;CC Turkey;TUR;4209.5;M;TAH;Istanbul;41 04 N;28 57 E;III;TT Vietnam;VTN;4209.5;W;;Haiphong;20 44 N;106 44 E;XI; fldigi-3.21.80/data/fldigi.desktop0000664000175000017500000000031112313064025013577 00000000000000[Desktop Entry] Name=Fldigi GenericName=Amateur Radio Digital Modem Comment=Amateur Radio Sound Card Communications Exec=fldigi Icon=fldigi Terminal=false Type=Application Categories=Network;HamRadio; fldigi-3.21.80/ABOUT-NLS0000664000175000017500000022532612313064025011303 000000000000001 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. 1.1 Quick configuration advice ============================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. 1.2 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the included GNU `gettext' library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will, respectively, bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might not be desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.3 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. If you happen to have the `LC_ALL' or some other `LC_xxx' environment variables set, you should unset them before setting `LANG', otherwise the setting of `LANG' will not have the desired effect. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.4 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://translationproject.org/', in the "Teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `coordinator@translationproject.org' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.5 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of November 2007. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo +----------------------------------------------------+ Compendium | [] [] [] [] | a2ps | [] [] [] [] [] | aegis | () | ant-phone | () | anubis | [] | ap-utils | | aspell | [] [] [] [] [] | bash | [] | bfd | | bibshelf | [] | binutils | | bison | [] [] | bison-runtime | [] | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] [] | console-tools | [] [] | coreutils | [] [] [] [] | cpio | | cpplib | [] [] [] | cryptonit | [] | dialog | | diffutils | [] [] [] [] [] [] | doodle | [] | e2fsprogs | [] [] | enscript | [] [] [] [] | fetchmail | [] [] () [] [] | findutils | [] | findutils_stable | [] [] [] | flex | [] [] [] | fslint | | gas | | gawk | [] [] [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] | gip | [] | gliv | [] [] | glunarclock | [] | gmult | [] [] | gnubiff | () | gnucash | [] [] () () [] | gnuedu | | gnulib | [] | gnunet | | gnunet-gtk | | gnutls | [] | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] | gpe-conf | [] [] | gpe-contacts | | gpe-edit | [] | gpe-filemanager | | gpe-go | [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-package | | gpe-sketchbook | [] [] | gpe-su | [] [] | gpe-taskmanager | [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | | gphoto2 | [] [] [] [] | gprof | [] [] | gpsdrive | | gramadoir | [] [] | grep | [] [] | gretl | () | gsasl | | gss | | gst-plugins-bad | [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] [] | gst-plugins-ugly | [] [] | gstreamer | [] [] [] [] [] [] [] | gtick | () | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] [] | indent | [] [] [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] [] | iso_639 | [] [] [] [] | jpilot | [] | jtag | | jwhois | | kbd | [] [] [] [] | keytouch | [] [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | () | ld | [] | leafpad | [] [] [] [] [] | libc | [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] | libgpg-error | [] | libgphoto2 | [] [] | libgphoto2_port | [] [] | libgsasl | | libiconv | [] [] | libidn | [] [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lprng | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailfromd | | mailutils | [] | make | [] [] | man-db | [] [] [] | minicom | [] [] [] | nano | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | popt | [] [] [] | psmisc | [] | pwdutils | | qof | | radius | [] | recode | [] [] [] [] [] [] | rpm | [] | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] | shared-mime-info | [] [] [] [] () [] [] [] | sharutils | [] [] [] [] [] [] | shishi | | skencil | [] () | solfege | | soundtracker | [] [] | sp | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] | texinfo | [] [] [] | tin | () () | tuxpaint | [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | util-linux-ng | [] [] [] [] | vorbis-tools | [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] | xpad | [] [] [] | +----------------------------------------------------+ af am ar az be bg bs ca cs cy da de el en en_GB eo 6 0 2 1 8 26 2 40 48 2 56 88 15 1 15 18 es et eu fa fi fr ga gl gu he hi hr hu id is it +--------------------------------------------------+ Compendium | [] [] [] [] [] | a2ps | [] [] [] () | aegis | | ant-phone | [] | anubis | [] | ap-utils | [] [] | aspell | [] [] [] | bash | [] | bfd | [] [] | bibshelf | [] [] [] | binutils | [] [] [] | bison | [] [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] | console-tools | | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cpplib | [] [] | cryptonit | [] | dialog | [] [] [] | diffutils | [] [] [] [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] [] | enscript | [] [] [] | fetchmail | [] | findutils | [] [] [] | findutils_stable | [] [] [] [] | flex | [] [] [] | fslint | | gas | [] [] | gawk | [] [] [] [] () | gcal | [] [] | gcc | [] | gettext-examples | [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] | gettext-tools | [] [] [] [] | gip | [] [] [] [] | gliv | () | glunarclock | [] [] [] | gmult | [] [] [] | gnubiff | () () | gnucash | () () () | gnuedu | [] | gnulib | [] [] [] | gnunet | | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] [] [] | gpe-conf | [] | gpe-contacts | [] [] | gpe-edit | [] [] [] [] | gpe-filemanager | [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] [] [] | gpsdrive | [] | gramadoir | [] [] | grep | [] [] [] | gretl | [] [] [] () | gsasl | [] [] | gss | [] [] | gst-plugins-bad | [] [] [] [] | gst-plugins-base | [] [] [] [] | gst-plugins-good | [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] | gstreamer | [] [] [] | gtick | [] [] [] | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] [] [] [] | iso_15924 | [] | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | [] | iso_4217 | [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] | jpilot | [] [] | jtag | [] | jwhois | [] [] [] [] [] | kbd | [] [] | keytouch | [] [] [] | keytouch-editor | [] | keytouch-keyboa... | [] [] | latrine | [] [] | ld | [] [] [] [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] [] [] | libgpg-error | [] | libgphoto2 | [] [] [] | libgphoto2_port | [] [] | libgsasl | [] [] | libiconv | [] [] [] | libidn | [] [] | lifelines | () | lilypond | [] [] [] | lingoteach | [] [] [] | lprng | | lynx | [] [] [] | m4 | [] [] [] [] | mailfromd | | mailutils | [] [] | make | [] [] [] [] [] [] [] [] | man-db | [] | minicom | [] [] [] [] | nano | [] [] [] [] [] [] [] | opcodes | [] [] [] [] | parted | [] [] [] | pilot-qof | | popt | [] [] [] [] | psmisc | [] [] | pwdutils | | qof | [] | radius | [] [] | recode | [] [] [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] | sed | [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] [] [] | shishi | [] | skencil | [] [] | solfege | [] | soundtracker | [] [] [] | sp | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] [] | tin | [] () | tuxpaint | [] [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux | [] [] [] [] [] [] [] | util-linux-ng | [] [] [] [] [] [] [] | vorbis-tools | | wastesedge | () | wdiff | [] [] [] [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ es et eu fa fi fr ga gl gu he hi hr hu id is it 85 22 14 2 48 101 61 12 2 8 2 6 53 29 1 52 ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn +--------------------------------------------------+ Compendium | [] | a2ps | () [] [] | aegis | () | ant-phone | [] | anubis | [] [] [] | ap-utils | [] | aspell | [] [] | bash | [] | bfd | | bibshelf | [] | binutils | | bison | [] [] [] | bison-runtime | [] [] [] | bluez-pin | [] [] [] | cflow | | clisp | [] | console-tools | | coreutils | [] | cpio | [] | cpplib | [] | cryptonit | [] | dialog | [] [] | diffutils | [] [] [] | doodle | | e2fsprogs | [] | enscript | [] | fetchmail | [] [] | findutils | [] | findutils_stable | [] | flex | [] [] | fslint | | gas | | gawk | [] [] | gcal | | gcc | | gettext-examples | [] [] [] | gettext-runtime | [] [] [] | gettext-tools | [] [] | gip | [] [] | gliv | [] | glunarclock | [] [] | gmult | [] [] [] | gnubiff | | gnucash | () () () | gnuedu | | gnulib | [] [] | gnunet | | gnunet-gtk | | gnutls | [] | gpe-aerial | [] | gpe-beam | [] | gpe-calendar | [] | gpe-clock | [] [] [] | gpe-conf | [] [] [] | gpe-contacts | [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | [] | gphoto2 | [] [] | gprof | [] | gpsdrive | [] | gramadoir | () | grep | [] [] | gretl | | gsasl | [] | gss | | gst-plugins-bad | [] | gst-plugins-base | [] | gst-plugins-good | [] | gst-plugins-ugly | [] | gstreamer | [] | gtick | [] | gtkam | [] [] | gtkorphan | [] | gtkspell | [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] | indent | [] [] | iso_15924 | [] | iso_3166 | [] [] [] [] [] [] [] [] | iso_3166_2 | [] | iso_4217 | [] [] [] | iso_639 | [] [] [] [] | jpilot | () () | jtag | | jwhois | [] | kbd | [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | | latrine | [] | ld | | leafpad | [] [] | libc | [] [] [] | libexif | | libextractor | | libgpewidget | [] | libgpg-error | | libgphoto2 | [] | libgphoto2_port | [] | libgsasl | [] | libiconv | [] | libidn | [] [] | lifelines | [] | lilypond | [] | lingoteach | [] | lprng | | lynx | [] [] | m4 | [] [] | mailfromd | | mailutils | | make | [] [] [] | man-db | | minicom | [] | nano | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | popt | [] [] [] | psmisc | [] [] [] | pwdutils | | qof | | radius | | recode | [] | rpm | [] [] | screem | [] | scrollkeeper | [] [] [] [] | sed | [] [] | shared-mime-info | [] [] [] [] [] [] [] | sharutils | [] [] | shishi | | skencil | | solfege | () () | soundtracker | | sp | () | system-tools-ba... | [] [] [] [] | tar | [] [] [] | texinfo | [] [] | tin | | tuxpaint | () [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] | util-linux-ng | [] [] | vorbis-tools | | wastesedge | [] | wdiff | [] [] | wget | [] [] | xchat | [] [] [] [] | xkeyboard-config | [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn 51 2 25 3 2 0 6 0 2 2 20 0 11 1 103 6 or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta +--------------------------------------------------+ Compendium | [] [] [] [] [] | a2ps | () [] [] [] [] [] [] | aegis | () () | ant-phone | [] [] | anubis | [] [] [] | ap-utils | () | aspell | [] [] [] | bash | [] [] | bfd | | bibshelf | [] | binutils | [] [] | bison | [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] [] | cflow | [] | clisp | [] | console-tools | [] | coreutils | [] [] [] [] | cpio | [] [] [] | cpplib | [] | cryptonit | [] [] | dialog | [] | diffutils | [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | fetchmail | [] [] [] | findutils | [] [] [] | findutils_stable | [] [] [] [] [] [] | flex | [] [] [] [] [] | fslint | [] | gas | | gawk | [] [] [] [] | gcal | [] | gcc | [] [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] [] | gip | [] [] [] [] | gliv | [] [] [] [] [] [] | glunarclock | [] [] [] [] [] [] | gmult | [] [] [] [] | gnubiff | () [] | gnucash | () [] | gnuedu | | gnulib | [] [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-calendar | [] [] [] [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] [] [] [] [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] [] [] [] [] [] | gpe-login | [] [] [] [] [] [] [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] | gphoto2 | [] [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] | gramadoir | [] [] | grep | [] [] [] [] | gretl | [] [] [] | gsasl | [] [] [] | gss | [] [] [] [] | gst-plugins-bad | [] [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] | gst-plugins-ugly | [] [] [] | gstreamer | [] [] [] [] | gtick | [] | gtkam | [] [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] | herrie | [] [] [] | hylafax | | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] [] | jpilot | | jtag | [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | | ld | [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] | libexif | [] [] | libextractor | [] [] | libgpewidget | [] [] [] [] [] [] [] [] | libgpg-error | [] [] [] | libgphoto2 | [] | libgphoto2_port | [] [] [] | libgsasl | [] [] [] [] | libiconv | [] [] [] | libidn | [] [] () | lifelines | [] [] | lilypond | | lingoteach | [] | lprng | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailfromd | [] | mailutils | [] [] [] | make | [] [] [] [] | man-db | [] [] [] [] | minicom | [] [] [] [] [] | nano | [] [] [] [] | opcodes | [] [] | parted | [] | pilot-qof | | popt | [] [] [] [] | psmisc | [] [] | pwdutils | [] [] | qof | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] | rpm | [] [] [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | skencil | [] [] [] | solfege | [] | soundtracker | [] [] | sp | | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] | texinfo | [] [] [] [] | tin | () | tuxpaint | [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | util-linux-ng | [] [] [] [] | vorbis-tools | [] | wastesedge | | wdiff | [] [] [] [] [] [] [] | wget | [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta 0 5 77 31 53 4 58 72 3 45 46 9 45 122 3 tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu +---------------------------------------------------+ Compendium | [] [] [] [] | 19 a2ps | [] [] [] | 19 aegis | [] | 1 ant-phone | [] [] | 6 anubis | [] [] [] | 11 ap-utils | () [] | 4 aspell | [] [] [] | 16 bash | [] | 6 bfd | | 2 bibshelf | [] | 7 binutils | [] [] [] [] | 9 bison | [] [] [] [] | 20 bison-runtime | [] [] [] [] | 18 bluez-pin | [] [] [] [] [] [] | 28 cflow | [] [] | 5 clisp | | 9 console-tools | [] [] | 5 coreutils | [] [] [] | 18 cpio | [] [] [] [] | 11 cpplib | [] [] [] [] [] | 12 cryptonit | [] | 6 dialog | [] [] [] | 9 diffutils | [] [] [] [] [] | 29 doodle | [] | 6 e2fsprogs | [] [] | 10 enscript | [] [] [] | 16 fetchmail | [] [] | 12 findutils | [] [] [] | 11 findutils_stable | [] [] [] [] | 18 flex | [] [] | 15 fslint | [] | 2 gas | [] | 3 gawk | [] [] [] | 16 gcal | [] | 5 gcc | [] [] [] | 7 gettext-examples | [] [] [] [] [] [] | 29 gettext-runtime | [] [] [] [] [] [] | 28 gettext-tools | [] [] [] [] [] | 20 gip | [] [] | 13 gliv | [] [] | 11 glunarclock | [] [] [] | 15 gmult | [] [] [] [] | 16 gnubiff | [] | 2 gnucash | () [] | 5 gnuedu | [] | 2 gnulib | [] | 10 gnunet | | 0 gnunet-gtk | [] [] | 3 gnutls | | 4 gpe-aerial | [] [] | 14 gpe-beam | [] [] | 14 gpe-calendar | [] [] | 7 gpe-clock | [] [] [] [] | 21 gpe-conf | [] [] [] | 16 gpe-contacts | [] [] | 10 gpe-edit | [] [] [] [] [] | 22 gpe-filemanager | [] [] | 7 gpe-go | [] [] [] [] | 19 gpe-login | [] [] [] [] [] | 21 gpe-ownerinfo | [] [] [] [] | 21 gpe-package | [] | 6 gpe-sketchbook | [] [] | 16 gpe-su | [] [] [] [] | 21 gpe-taskmanager | [] [] [] [] | 21 gpe-timesheet | [] [] [] [] | 18 gpe-today | [] [] [] [] [] | 21 gpe-todo | [] [] | 8 gphoto2 | [] [] [] [] | 21 gprof | [] [] | 13 gpsdrive | [] | 5 gramadoir | [] | 7 grep | [] | 12 gretl | | 6 gsasl | [] [] [] | 9 gss | [] | 7 gst-plugins-bad | [] [] [] | 13 gst-plugins-base | [] [] | 11 gst-plugins-good | [] [] [] [] [] | 16 gst-plugins-ugly | [] [] [] | 13 gstreamer | [] [] [] | 18 gtick | [] [] | 7 gtkam | [] | 16 gtkorphan | [] | 7 gtkspell | [] [] [] [] [] [] | 27 gutenprint | | 4 hello | [] [] [] [] [] | 38 herrie | [] [] | 8 hylafax | | 0 idutils | [] [] | 15 indent | [] [] [] [] [] | 28 iso_15924 | [] [] | 4 iso_3166 | [] [] [] [] [] [] [] [] [] | 54 iso_3166_2 | [] [] | 4 iso_4217 | [] [] [] [] [] | 24 iso_639 | [] [] [] [] [] | 26 jpilot | [] [] [] [] | 7 jtag | [] | 3 jwhois | [] [] [] | 13 kbd | [] [] [] | 13 keytouch | [] | 8 keytouch-editor | [] | 5 keytouch-keyboa... | [] | 5 latrine | [] [] | 5 ld | [] [] [] [] | 10 leafpad | [] [] [] [] [] | 24 libc | [] [] [] | 19 libexif | [] | 5 libextractor | [] | 5 libgpewidget | [] [] [] | 20 libgpg-error | [] | 6 libgphoto2 | [] [] | 9 libgphoto2_port | [] [] [] | 11 libgsasl | [] | 8 libiconv | [] [] | 11 libidn | [] [] | 11 lifelines | | 4 lilypond | [] | 6 lingoteach | [] | 6 lprng | [] | 2 lynx | [] [] [] | 15 m4 | [] [] [] | 18 mailfromd | [] [] | 3 mailutils | [] [] | 8 make | [] [] [] | 20 man-db | [] | 9 minicom | [] | 14 nano | [] [] [] | 20 opcodes | [] [] | 10 parted | [] [] [] | 11 pilot-qof | [] | 1 popt | [] [] [] [] | 18 psmisc | [] [] | 10 pwdutils | [] | 3 qof | [] | 4 radius | [] [] | 7 recode | [] [] [] | 25 rpm | [] [] [] [] | 13 screem | [] | 2 scrollkeeper | [] [] [] [] | 26 sed | [] [] [] [] | 23 shared-mime-info | [] [] [] | 29 sharutils | [] [] [] | 23 shishi | [] | 3 skencil | [] | 7 solfege | [] | 3 soundtracker | [] [] | 9 sp | [] | 3 system-tools-ba... | [] [] [] [] [] [] [] | 38 tar | [] [] [] | 17 texinfo | [] [] [] | 15 tin | | 1 tuxpaint | [] [] [] | 19 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux | [] [] [] | 20 util-linux-ng | [] [] [] | 20 vorbis-tools | [] [] | 4 wastesedge | | 1 wdiff | [] [] | 23 wget | [] [] [] | 20 xchat | [] [] [] [] | 29 xkeyboard-config | [] [] [] | 14 xpad | [] [] [] | 15 +---------------------------------------------------+ 76 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu 163 domains 0 3 1 74 51 0 143 21 1 57 7 45 0 2036 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If November 2007 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://translationproject.org/extra/matrix.html'. 1.6 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `coordinator@translationproject.org' to make the `.pot' files available to the translation teams.